diff --git a/build/DOTFILE.dot b/build/DOTFILE.dot index ddb4943..3f24431 100644 --- a/build/DOTFILE.dot +++ b/build/DOTFILE.dot @@ -7,16 +7,1768 @@ digraph G { 5; 6; 7; -0->1 [label=0]; -0->2 [label=1]; -0->3 [label=2]; -1->4 [label=1]; -1->5 [label=2]; -2->4 [label=0]; -2->6 [label=2]; -3->5 [label=0]; -3->6 [label=1]; -4->7 [label=2]; -5->7 [label=1]; -6->7 [label=0]; +8; +9; +10; +11; +12; +13; +14; +15; +16; +17; +18; +19; +20; +21; +22; +23; +24; +25; +26; +27; +28; +29; +30; +31; +32; +33; +34; +35; +36; +37; +38; +39; +40; +41; +42; +43; +44; +45; +46; +47; +48; +49; +50; +51; +52; +53; +54; +55; +56; +57; +58; +59; +60; +61; +62; +63; +64; +65; +66; +67; +68; +69; +70; +71; +72; +73; +74; +75; +76; +77; +78; +79; +80; +81; +82; +83; +84; +85; +86; +87; +88; +89; +90; +91; +92; +93; +94; +95; +96; +97; +98; +99; +100; +101; +102; +103; +104; +105; +106; +107; +108; +109; +110; +111; +112; +113; +114; +115; +116; +117; +118; +119; +120; +121; +122; +123; +124; +125; +126; +127; +128; +129; +130; +131; +132; +133; +134; +135; +136; +137; +138; +139; +140; +141; +142; +143; +144; +145; +146; +147; +148; +149; +150; +151; +152; +153; +154; +155; +156; +157; +158; +159; +160; +161; +162; +163; +164; +165; +166; +167; +168; +169; +170; +171; +172; +173; +174; +175; +176; +177; +178; +179; +180; +181; +182; +183; +184; +185; +186; +187; +188; +189; +190; +191; +192; +193; +194; +195; +196; +197; +198; +199; +200; +201; +202; +203; +204; +205; +206; +207; +208; +209; +210; +211; +212; +213; +214; +215; +216; +217; +218; +219; +220; +221; +222; +223; +224; +225; +226; +227; +228; +229; +230; +231; +232; +233; +234; +235; +236; +237; +238; +239; +240; +241; +242; +243; +244; +245; +246; +247; +248; +249; +250; +251; +252; +253; +254; +255; +256; +257; +258; +259; +260; +261; +262; +263; +264; +265; +266; +267; +268; +269; +270; +271; +272; +273; +274; +275; +276; +277; +278; +279; +280; +281; +282; +283; +284; +285; +286; +287; +288; +289; +290; +291; +292; +293; +294; +295; +296; +297; +298; +299; +300; +301; +302; +303; +304; +305; +306; +307; +308; +309; +310; +311; +312; +313; +314; +315; +316; +317; +318; +319; +320; +321; +322; +323; +324; +325; +326; +327; +328; +329; +330; +331; +332; +333; +334; +335; +336; +337; +338; +339; +340; +341; +342; +343; +344; +345; +346; +347; +348; +349; +350; +351; +352; +353; +354; +355; +356; +357; +358; +359; +360; +361; +362; +363; +364; +365; +366; +367; +368; +369; +370; +371; +372; +373; +374; +375; +376; +377; +378; +379; +380; +381; +382; +383; +384; +385; +386; +387; +388; +389; +390; +391; +392; +393; +0->1 [label=5]; +1->2 [label=5]; +2->3 [label=2]; +2->4 [label=2]; +2->5 [label=5]; +3->6 [label=2]; +3->7 [label=5]; +4->6 [label=2]; +4->8 [label=5]; +5->7 [label=2]; +5->8 [label=2]; +5->9 [label=5]; +6->10 [label=5]; +7->10 [label=2]; +7->11 [label=5]; +8->10 [label=2]; +8->12 [label=5]; +9->11 [label=2]; +9->12 [label=2]; +9->13 [label=5]; +10->14 [label=5]; +11->14 [label=2]; +11->15 [label=5]; +12->14 [label=2]; +12->16 [label=5]; +13->15 [label=2]; +13->16 [label=2]; +13->17 [label=5]; +14->18 [label=5]; +15->18 [label=2]; +15->19 [label=5]; +16->18 [label=2]; +16->20 [label=5]; +17->21 [label=0]; +17->22 [label=0]; +17->19 [label=2]; +17->20 [label=2]; +18->23 [label=5]; +19->24 [label=0]; +19->25 [label=0]; +19->23 [label=2]; +20->26 [label=0]; +20->27 [label=0]; +20->23 [label=2]; +21->28 [label=0]; +21->24 [label=2]; +21->26 [label=2]; +21->29 [label=4]; +22->28 [label=0]; +22->25 [label=2]; +22->27 [label=2]; +22->30 [label=4]; +23->31 [label=0]; +23->32 [label=0]; +24->33 [label=0]; +24->31 [label=2]; +24->34 [label=4]; +25->33 [label=0]; +25->32 [label=2]; +25->35 [label=4]; +26->36 [label=0]; +26->31 [label=2]; +26->37 [label=4]; +27->36 [label=0]; +27->32 [label=2]; +27->38 [label=4]; +28->33 [label=2]; +28->36 [label=2]; +28->39 [label=4]; +28->40 [label=4]; +29->39 [label=0]; +29->34 [label=2]; +29->37 [label=2]; +30->40 [label=0]; +30->35 [label=2]; +30->38 [label=2]; +31->41 [label=0]; +31->42 [label=4]; +32->41 [label=0]; +32->43 [label=4]; +33->41 [label=2]; +33->44 [label=4]; +33->45 [label=4]; +34->44 [label=0]; +34->42 [label=2]; +35->45 [label=0]; +35->43 [label=2]; +36->41 [label=2]; +36->46 [label=4]; +36->47 [label=4]; +37->46 [label=0]; +37->42 [label=2]; +38->47 [label=0]; +38->43 [label=2]; +39->44 [label=2]; +39->46 [label=2]; +39->48 [label=4]; +40->45 [label=2]; +40->47 [label=2]; +40->48 [label=4]; +41->49 [label=4]; +41->50 [label=4]; +42->49 [label=0]; +43->50 [label=0]; +44->49 [label=2]; +44->51 [label=4]; +45->50 [label=2]; +45->51 [label=4]; +46->49 [label=2]; +46->52 [label=4]; +47->50 [label=2]; +47->52 [label=4]; +48->51 [label=2]; +48->52 [label=2]; +48->53 [label=5]; +49->54 [label=4]; +50->54 [label=4]; +51->54 [label=2]; +51->55 [label=5]; +52->54 [label=2]; +52->56 [label=5]; +53->55 [label=2]; +53->56 [label=2]; +53->57 [label=5]; +54->58 [label=5]; +55->58 [label=2]; +55->59 [label=5]; +56->58 [label=2]; +56->60 [label=5]; +57->59 [label=2]; +57->60 [label=2]; +57->61 [label=5]; +58->62 [label=5]; +59->62 [label=2]; +59->63 [label=5]; +60->62 [label=2]; +60->64 [label=5]; +61->63 [label=2]; +61->64 [label=2]; +61->65 [label=5]; +62->66 [label=5]; +63->66 [label=2]; +63->67 [label=5]; +64->66 [label=2]; +64->68 [label=5]; +65->67 [label=2]; +65->68 [label=2]; +65->69 [label=5]; +66->70 [label=5]; +67->70 [label=2]; +67->71 [label=5]; +68->70 [label=2]; +68->72 [label=5]; +69->71 [label=2]; +69->72 [label=2]; +69->73 [label=5]; +70->74 [label=5]; +71->74 [label=2]; +71->75 [label=5]; +72->74 [label=2]; +72->76 [label=5]; +73->77 [label=0]; +73->78 [label=0]; +73->79 [label=1]; +73->80 [label=1]; +73->75 [label=2]; +73->76 [label=2]; +73->81 [label=3]; +74->82 [label=5]; +75->83 [label=0]; +75->84 [label=0]; +75->85 [label=1]; +75->86 [label=1]; +75->82 [label=2]; +75->87 [label=3]; +76->88 [label=0]; +76->89 [label=0]; +76->90 [label=1]; +76->91 [label=1]; +76->82 [label=2]; +76->92 [label=3]; +77->93 [label=0]; +77->94 [label=1]; +77->95 [label=1]; +77->83 [label=2]; +77->88 [label=2]; +77->96 [label=3]; +77->97 [label=4]; +78->93 [label=0]; +78->98 [label=1]; +78->99 [label=1]; +78->84 [label=2]; +78->89 [label=2]; +78->100 [label=3]; +78->101 [label=4]; +79->94 [label=0]; +79->98 [label=0]; +79->102 [label=1]; +79->85 [label=2]; +79->90 [label=2]; +79->103 [label=3]; +80->95 [label=0]; +80->99 [label=0]; +80->102 [label=1]; +80->86 [label=2]; +80->91 [label=2]; +80->104 [label=3]; +81->96 [label=0]; +81->100 [label=0]; +81->103 [label=1]; +81->104 [label=1]; +81->87 [label=2]; +81->92 [label=2]; +82->105 [label=0]; +82->106 [label=0]; +82->107 [label=1]; +82->108 [label=1]; +82->109 [label=3]; +83->110 [label=0]; +83->111 [label=1]; +83->112 [label=1]; +83->105 [label=2]; +83->113 [label=3]; +83->114 [label=4]; +84->110 [label=0]; +84->115 [label=1]; +84->116 [label=1]; +84->106 [label=2]; +84->117 [label=3]; +84->118 [label=4]; +85->111 [label=0]; +85->115 [label=0]; +85->119 [label=1]; +85->107 [label=2]; +85->120 [label=3]; +86->112 [label=0]; +86->116 [label=0]; +86->119 [label=1]; +86->108 [label=2]; +86->121 [label=3]; +87->113 [label=0]; +87->117 [label=0]; +87->120 [label=1]; +87->121 [label=1]; +87->109 [label=2]; +88->122 [label=0]; +88->123 [label=1]; +88->124 [label=1]; +88->105 [label=2]; +88->125 [label=3]; +88->126 [label=4]; +89->122 [label=0]; +89->127 [label=1]; +89->128 [label=1]; +89->106 [label=2]; +89->129 [label=3]; +89->130 [label=4]; +90->123 [label=0]; +90->127 [label=0]; +90->131 [label=1]; +90->107 [label=2]; +90->132 [label=3]; +91->124 [label=0]; +91->128 [label=0]; +91->131 [label=1]; +91->108 [label=2]; +91->133 [label=3]; +92->125 [label=0]; +92->129 [label=0]; +92->132 [label=1]; +92->133 [label=1]; +92->109 [label=2]; +93->134 [label=1]; +93->135 [label=1]; +93->110 [label=2]; +93->122 [label=2]; +93->136 [label=3]; +93->137 [label=4]; +93->138 [label=4]; +94->134 [label=0]; +94->139 [label=1]; +94->111 [label=2]; +94->123 [label=2]; +94->140 [label=3]; +94->141 [label=4]; +95->135 [label=0]; +95->139 [label=1]; +95->112 [label=2]; +95->124 [label=2]; +95->142 [label=3]; +95->143 [label=4]; +96->136 [label=0]; +96->140 [label=1]; +96->142 [label=1]; +96->113 [label=2]; +96->125 [label=2]; +96->144 [label=4]; +97->137 [label=0]; +97->141 [label=1]; +97->143 [label=1]; +97->114 [label=2]; +97->126 [label=2]; +97->144 [label=3]; +98->134 [label=0]; +98->145 [label=1]; +98->115 [label=2]; +98->127 [label=2]; +98->146 [label=3]; +98->147 [label=4]; +99->135 [label=0]; +99->145 [label=1]; +99->116 [label=2]; +99->128 [label=2]; +99->148 [label=3]; +99->149 [label=4]; +100->136 [label=0]; +100->146 [label=1]; +100->148 [label=1]; +100->117 [label=2]; +100->129 [label=2]; +100->150 [label=4]; +101->138 [label=0]; +101->147 [label=1]; +101->149 [label=1]; +101->118 [label=2]; +101->130 [label=2]; +101->150 [label=3]; +102->139 [label=0]; +102->145 [label=0]; +102->119 [label=2]; +102->131 [label=2]; +102->151 [label=3]; +103->140 [label=0]; +103->146 [label=0]; +103->151 [label=1]; +103->120 [label=2]; +103->132 [label=2]; +104->142 [label=0]; +104->148 [label=0]; +104->151 [label=1]; +104->121 [label=2]; +104->133 [label=2]; +105->152 [label=0]; +105->153 [label=1]; +105->154 [label=1]; +105->155 [label=3]; +105->156 [label=4]; +106->152 [label=0]; +106->157 [label=1]; +106->158 [label=1]; +106->159 [label=3]; +106->160 [label=4]; +107->153 [label=0]; +107->157 [label=0]; +107->161 [label=1]; +107->162 [label=3]; +108->154 [label=0]; +108->158 [label=0]; +108->161 [label=1]; +108->163 [label=3]; +109->155 [label=0]; +109->159 [label=0]; +109->162 [label=1]; +109->163 [label=1]; +110->164 [label=1]; +110->165 [label=1]; +110->152 [label=2]; +110->166 [label=3]; +110->167 [label=4]; +110->168 [label=4]; +111->164 [label=0]; +111->169 [label=1]; +111->153 [label=2]; +111->170 [label=3]; +111->171 [label=4]; +112->165 [label=0]; +112->169 [label=1]; +112->154 [label=2]; +112->172 [label=3]; +112->173 [label=4]; +113->166 [label=0]; +113->170 [label=1]; +113->172 [label=1]; +113->155 [label=2]; +113->174 [label=4]; +114->167 [label=0]; +114->171 [label=1]; +114->173 [label=1]; +114->156 [label=2]; +114->174 [label=3]; +115->164 [label=0]; +115->175 [label=1]; +115->157 [label=2]; +115->176 [label=3]; +115->177 [label=4]; +116->165 [label=0]; +116->175 [label=1]; +116->158 [label=2]; +116->178 [label=3]; +116->179 [label=4]; +117->166 [label=0]; +117->176 [label=1]; +117->178 [label=1]; +117->159 [label=2]; +117->180 [label=4]; +118->168 [label=0]; +118->177 [label=1]; +118->179 [label=1]; +118->160 [label=2]; +118->180 [label=3]; +119->169 [label=0]; +119->175 [label=0]; +119->161 [label=2]; +119->181 [label=3]; +120->170 [label=0]; +120->176 [label=0]; +120->181 [label=1]; +120->162 [label=2]; +121->172 [label=0]; +121->178 [label=0]; +121->181 [label=1]; +121->163 [label=2]; +122->182 [label=1]; +122->183 [label=1]; +122->152 [label=2]; +122->184 [label=3]; +122->185 [label=4]; +122->186 [label=4]; +123->182 [label=0]; +123->187 [label=1]; +123->153 [label=2]; +123->188 [label=3]; +123->189 [label=4]; +124->183 [label=0]; +124->187 [label=1]; +124->154 [label=2]; +124->190 [label=3]; +124->191 [label=4]; +125->184 [label=0]; +125->188 [label=1]; +125->190 [label=1]; +125->155 [label=2]; +125->192 [label=4]; +126->185 [label=0]; +126->189 [label=1]; +126->191 [label=1]; +126->156 [label=2]; +126->192 [label=3]; +127->182 [label=0]; +127->193 [label=1]; +127->157 [label=2]; +127->194 [label=3]; +127->195 [label=4]; +128->183 [label=0]; +128->193 [label=1]; +128->158 [label=2]; +128->196 [label=3]; +128->197 [label=4]; +129->184 [label=0]; +129->194 [label=1]; +129->196 [label=1]; +129->159 [label=2]; +129->198 [label=4]; +130->186 [label=0]; +130->195 [label=1]; +130->197 [label=1]; +130->160 [label=2]; +130->198 [label=3]; +131->187 [label=0]; +131->193 [label=0]; +131->161 [label=2]; +131->199 [label=3]; +132->188 [label=0]; +132->194 [label=0]; +132->199 [label=1]; +132->162 [label=2]; +133->190 [label=0]; +133->196 [label=0]; +133->199 [label=1]; +133->163 [label=2]; +134->200 [label=1]; +134->164 [label=2]; +134->182 [label=2]; +134->201 [label=3]; +134->202 [label=4]; +134->203 [label=4]; +135->200 [label=1]; +135->165 [label=2]; +135->183 [label=2]; +135->204 [label=3]; +135->205 [label=4]; +135->206 [label=4]; +136->201 [label=1]; +136->204 [label=1]; +136->166 [label=2]; +136->184 [label=2]; +136->207 [label=4]; +136->208 [label=4]; +137->202 [label=1]; +137->205 [label=1]; +137->167 [label=2]; +137->185 [label=2]; +137->207 [label=3]; +137->209 [label=4]; +138->203 [label=1]; +138->206 [label=1]; +138->168 [label=2]; +138->186 [label=2]; +138->208 [label=3]; +138->209 [label=4]; +139->200 [label=0]; +139->169 [label=2]; +139->187 [label=2]; +139->210 [label=3]; +139->211 [label=4]; +140->201 [label=0]; +140->210 [label=1]; +140->170 [label=2]; +140->188 [label=2]; +140->212 [label=4]; +141->202 [label=0]; +141->211 [label=1]; +141->171 [label=2]; +141->189 [label=2]; +141->212 [label=3]; +142->204 [label=0]; +142->210 [label=1]; +142->172 [label=2]; +142->190 [label=2]; +142->213 [label=4]; +143->205 [label=0]; +143->211 [label=1]; +143->173 [label=2]; +143->191 [label=2]; +143->213 [label=3]; +144->207 [label=0]; +144->212 [label=1]; +144->213 [label=1]; +144->174 [label=2]; +144->192 [label=2]; +145->200 [label=0]; +145->175 [label=2]; +145->193 [label=2]; +145->214 [label=3]; +145->215 [label=4]; +146->201 [label=0]; +146->214 [label=1]; +146->176 [label=2]; +146->194 [label=2]; +146->216 [label=4]; +147->203 [label=0]; +147->215 [label=1]; +147->177 [label=2]; +147->195 [label=2]; +147->216 [label=3]; +148->204 [label=0]; +148->214 [label=1]; +148->178 [label=2]; +148->196 [label=2]; +148->217 [label=4]; +149->206 [label=0]; +149->215 [label=1]; +149->179 [label=2]; +149->197 [label=2]; +149->217 [label=3]; +150->208 [label=0]; +150->216 [label=1]; +150->217 [label=1]; +150->180 [label=2]; +150->198 [label=2]; +151->210 [label=0]; +151->214 [label=0]; +151->181 [label=2]; +151->199 [label=2]; +152->218 [label=1]; +152->219 [label=1]; +152->220 [label=3]; +152->221 [label=4]; +152->222 [label=4]; +153->218 [label=0]; +153->223 [label=1]; +153->224 [label=3]; +153->225 [label=4]; +154->219 [label=0]; +154->223 [label=1]; +154->226 [label=3]; +154->227 [label=4]; +155->220 [label=0]; +155->224 [label=1]; +155->226 [label=1]; +155->228 [label=4]; +156->221 [label=0]; +156->225 [label=1]; +156->227 [label=1]; +156->228 [label=3]; +157->218 [label=0]; +157->229 [label=1]; +157->230 [label=3]; +157->231 [label=4]; +158->219 [label=0]; +158->229 [label=1]; +158->232 [label=3]; +158->233 [label=4]; +159->220 [label=0]; +159->230 [label=1]; +159->232 [label=1]; +159->234 [label=4]; +160->222 [label=0]; +160->231 [label=1]; +160->233 [label=1]; +160->234 [label=3]; +161->223 [label=0]; +161->229 [label=0]; +161->235 [label=3]; +162->224 [label=0]; +162->230 [label=0]; +162->235 [label=1]; +163->226 [label=0]; +163->232 [label=0]; +163->235 [label=1]; +164->236 [label=1]; +164->218 [label=2]; +164->237 [label=3]; +164->238 [label=4]; +164->239 [label=4]; +165->236 [label=1]; +165->219 [label=2]; +165->240 [label=3]; +165->241 [label=4]; +165->242 [label=4]; +166->237 [label=1]; +166->240 [label=1]; +166->220 [label=2]; +166->243 [label=4]; +166->244 [label=4]; +167->238 [label=1]; +167->241 [label=1]; +167->221 [label=2]; +167->243 [label=3]; +167->245 [label=4]; +168->239 [label=1]; +168->242 [label=1]; +168->222 [label=2]; +168->244 [label=3]; +168->245 [label=4]; +169->236 [label=0]; +169->223 [label=2]; +169->246 [label=3]; +169->247 [label=4]; +170->237 [label=0]; +170->246 [label=1]; +170->224 [label=2]; +170->248 [label=4]; +171->238 [label=0]; +171->247 [label=1]; +171->225 [label=2]; +171->248 [label=3]; +172->240 [label=0]; +172->246 [label=1]; +172->226 [label=2]; +172->249 [label=4]; +173->241 [label=0]; +173->247 [label=1]; +173->227 [label=2]; +173->249 [label=3]; +174->243 [label=0]; +174->248 [label=1]; +174->249 [label=1]; +174->228 [label=2]; +175->236 [label=0]; +175->229 [label=2]; +175->250 [label=3]; +175->251 [label=4]; +176->237 [label=0]; +176->250 [label=1]; +176->230 [label=2]; +176->252 [label=4]; +177->239 [label=0]; +177->251 [label=1]; +177->231 [label=2]; +177->252 [label=3]; +178->240 [label=0]; +178->250 [label=1]; +178->232 [label=2]; +178->253 [label=4]; +179->242 [label=0]; +179->251 [label=1]; +179->233 [label=2]; +179->253 [label=3]; +180->244 [label=0]; +180->252 [label=1]; +180->253 [label=1]; +180->234 [label=2]; +181->246 [label=0]; +181->250 [label=0]; +181->235 [label=2]; +182->254 [label=1]; +182->218 [label=2]; +182->255 [label=3]; +182->256 [label=4]; +182->257 [label=4]; +183->254 [label=1]; +183->219 [label=2]; +183->258 [label=3]; +183->259 [label=4]; +183->260 [label=4]; +184->255 [label=1]; +184->258 [label=1]; +184->220 [label=2]; +184->261 [label=4]; +184->262 [label=4]; +185->256 [label=1]; +185->259 [label=1]; +185->221 [label=2]; +185->261 [label=3]; +185->263 [label=4]; +186->257 [label=1]; +186->260 [label=1]; +186->222 [label=2]; +186->262 [label=3]; +186->263 [label=4]; +187->254 [label=0]; +187->223 [label=2]; +187->264 [label=3]; +187->265 [label=4]; +188->255 [label=0]; +188->264 [label=1]; +188->224 [label=2]; +188->266 [label=4]; +189->256 [label=0]; +189->265 [label=1]; +189->225 [label=2]; +189->266 [label=3]; +190->258 [label=0]; +190->264 [label=1]; +190->226 [label=2]; +190->267 [label=4]; +191->259 [label=0]; +191->265 [label=1]; +191->227 [label=2]; +191->267 [label=3]; +192->261 [label=0]; +192->266 [label=1]; +192->267 [label=1]; +192->228 [label=2]; +193->254 [label=0]; +193->229 [label=2]; +193->268 [label=3]; +193->269 [label=4]; +194->255 [label=0]; +194->268 [label=1]; +194->230 [label=2]; +194->270 [label=4]; +195->257 [label=0]; +195->269 [label=1]; +195->231 [label=2]; +195->270 [label=3]; +196->258 [label=0]; +196->268 [label=1]; +196->232 [label=2]; +196->271 [label=4]; +197->260 [label=0]; +197->269 [label=1]; +197->233 [label=2]; +197->271 [label=3]; +198->262 [label=0]; +198->270 [label=1]; +198->271 [label=1]; +198->234 [label=2]; +199->264 [label=0]; +199->268 [label=0]; +199->235 [label=2]; +200->236 [label=2]; +200->254 [label=2]; +200->272 [label=3]; +200->273 [label=4]; +200->274 [label=4]; +201->272 [label=1]; +201->237 [label=2]; +201->255 [label=2]; +201->275 [label=4]; +201->276 [label=4]; +202->273 [label=1]; +202->238 [label=2]; +202->256 [label=2]; +202->275 [label=3]; +202->277 [label=4]; +203->274 [label=1]; +203->239 [label=2]; +203->257 [label=2]; +203->276 [label=3]; +203->277 [label=4]; +204->272 [label=1]; +204->240 [label=2]; +204->258 [label=2]; +204->278 [label=4]; +204->279 [label=4]; +205->273 [label=1]; +205->241 [label=2]; +205->259 [label=2]; +205->278 [label=3]; +205->280 [label=4]; +206->274 [label=1]; +206->242 [label=2]; +206->260 [label=2]; +206->279 [label=3]; +206->280 [label=4]; +207->275 [label=1]; +207->278 [label=1]; +207->243 [label=2]; +207->261 [label=2]; +207->281 [label=4]; +208->276 [label=1]; +208->279 [label=1]; +208->244 [label=2]; +208->262 [label=2]; +208->281 [label=4]; +209->277 [label=1]; +209->280 [label=1]; +209->245 [label=2]; +209->263 [label=2]; +209->281 [label=3]; +209->282 [label=5]; +210->272 [label=0]; +210->246 [label=2]; +210->264 [label=2]; +210->283 [label=4]; +211->273 [label=0]; +211->247 [label=2]; +211->265 [label=2]; +211->283 [label=3]; +212->275 [label=0]; +212->283 [label=1]; +212->248 [label=2]; +212->266 [label=2]; +213->278 [label=0]; +213->283 [label=1]; +213->249 [label=2]; +213->267 [label=2]; +214->272 [label=0]; +214->250 [label=2]; +214->268 [label=2]; +214->284 [label=4]; +215->274 [label=0]; +215->251 [label=2]; +215->269 [label=2]; +215->284 [label=3]; +216->276 [label=0]; +216->284 [label=1]; +216->252 [label=2]; +216->270 [label=2]; +217->279 [label=0]; +217->284 [label=1]; +217->253 [label=2]; +217->271 [label=2]; +218->285 [label=1]; +218->286 [label=3]; +218->287 [label=4]; +218->288 [label=4]; +219->285 [label=1]; +219->289 [label=3]; +219->290 [label=4]; +219->291 [label=4]; +220->286 [label=1]; +220->289 [label=1]; +220->292 [label=4]; +220->293 [label=4]; +221->287 [label=1]; +221->290 [label=1]; +221->292 [label=3]; +221->294 [label=4]; +222->288 [label=1]; +222->291 [label=1]; +222->293 [label=3]; +222->294 [label=4]; +223->285 [label=0]; +223->295 [label=3]; +223->296 [label=4]; +224->286 [label=0]; +224->295 [label=1]; +224->297 [label=4]; +225->287 [label=0]; +225->296 [label=1]; +225->297 [label=3]; +226->289 [label=0]; +226->295 [label=1]; +226->298 [label=4]; +227->290 [label=0]; +227->296 [label=1]; +227->298 [label=3]; +228->292 [label=0]; +228->297 [label=1]; +228->298 [label=1]; +229->285 [label=0]; +229->299 [label=3]; +229->300 [label=4]; +230->286 [label=0]; +230->299 [label=1]; +230->301 [label=4]; +231->288 [label=0]; +231->300 [label=1]; +231->301 [label=3]; +232->289 [label=0]; +232->299 [label=1]; +232->302 [label=4]; +233->291 [label=0]; +233->300 [label=1]; +233->302 [label=3]; +234->293 [label=0]; +234->301 [label=1]; +234->302 [label=1]; +235->295 [label=0]; +235->299 [label=0]; +236->285 [label=2]; +236->303 [label=3]; +236->304 [label=4]; +236->305 [label=4]; +237->303 [label=1]; +237->286 [label=2]; +237->306 [label=4]; +237->307 [label=4]; +238->304 [label=1]; +238->287 [label=2]; +238->306 [label=3]; +238->308 [label=4]; +239->305 [label=1]; +239->288 [label=2]; +239->307 [label=3]; +239->308 [label=4]; +240->303 [label=1]; +240->289 [label=2]; +240->309 [label=4]; +240->310 [label=4]; +241->304 [label=1]; +241->290 [label=2]; +241->309 [label=3]; +241->311 [label=4]; +242->305 [label=1]; +242->291 [label=2]; +242->310 [label=3]; +242->311 [label=4]; +243->306 [label=1]; +243->309 [label=1]; +243->292 [label=2]; +243->312 [label=4]; +244->307 [label=1]; +244->310 [label=1]; +244->293 [label=2]; +244->312 [label=4]; +245->308 [label=1]; +245->311 [label=1]; +245->294 [label=2]; +245->312 [label=3]; +245->313 [label=5]; +246->303 [label=0]; +246->295 [label=2]; +246->314 [label=4]; +247->304 [label=0]; +247->296 [label=2]; +247->314 [label=3]; +248->306 [label=0]; +248->314 [label=1]; +248->297 [label=2]; +249->309 [label=0]; +249->314 [label=1]; +249->298 [label=2]; +250->303 [label=0]; +250->299 [label=2]; +250->315 [label=4]; +251->305 [label=0]; +251->300 [label=2]; +251->315 [label=3]; +252->307 [label=0]; +252->315 [label=1]; +252->301 [label=2]; +253->310 [label=0]; +253->315 [label=1]; +253->302 [label=2]; +254->285 [label=2]; +254->316 [label=3]; +254->317 [label=4]; +254->318 [label=4]; +255->316 [label=1]; +255->286 [label=2]; +255->319 [label=4]; +255->320 [label=4]; +256->317 [label=1]; +256->287 [label=2]; +256->319 [label=3]; +256->321 [label=4]; +257->318 [label=1]; +257->288 [label=2]; +257->320 [label=3]; +257->321 [label=4]; +258->316 [label=1]; +258->289 [label=2]; +258->322 [label=4]; +258->323 [label=4]; +259->317 [label=1]; +259->290 [label=2]; +259->322 [label=3]; +259->324 [label=4]; +260->318 [label=1]; +260->291 [label=2]; +260->323 [label=3]; +260->324 [label=4]; +261->319 [label=1]; +261->322 [label=1]; +261->292 [label=2]; +261->325 [label=4]; +262->320 [label=1]; +262->323 [label=1]; +262->293 [label=2]; +262->325 [label=4]; +263->321 [label=1]; +263->324 [label=1]; +263->294 [label=2]; +263->325 [label=3]; +263->326 [label=5]; +264->316 [label=0]; +264->295 [label=2]; +264->327 [label=4]; +265->317 [label=0]; +265->296 [label=2]; +265->327 [label=3]; +266->319 [label=0]; +266->327 [label=1]; +266->297 [label=2]; +267->322 [label=0]; +267->327 [label=1]; +267->298 [label=2]; +268->316 [label=0]; +268->299 [label=2]; +268->328 [label=4]; +269->318 [label=0]; +269->300 [label=2]; +269->328 [label=3]; +270->320 [label=0]; +270->328 [label=1]; +270->301 [label=2]; +271->323 [label=0]; +271->328 [label=1]; +271->302 [label=2]; +272->303 [label=2]; +272->316 [label=2]; +272->329 [label=4]; +272->330 [label=4]; +273->304 [label=2]; +273->317 [label=2]; +273->329 [label=3]; +273->331 [label=4]; +274->305 [label=2]; +274->318 [label=2]; +274->330 [label=3]; +274->331 [label=4]; +275->329 [label=1]; +275->306 [label=2]; +275->319 [label=2]; +275->332 [label=4]; +276->330 [label=1]; +276->307 [label=2]; +276->320 [label=2]; +276->332 [label=4]; +277->331 [label=1]; +277->308 [label=2]; +277->321 [label=2]; +277->332 [label=3]; +277->333 [label=5]; +278->329 [label=1]; +278->309 [label=2]; +278->322 [label=2]; +278->334 [label=4]; +279->330 [label=1]; +279->310 [label=2]; +279->323 [label=2]; +279->334 [label=4]; +280->331 [label=1]; +280->311 [label=2]; +280->324 [label=2]; +280->334 [label=3]; +280->335 [label=5]; +281->332 [label=1]; +281->334 [label=1]; +281->312 [label=2]; +281->325 [label=2]; +281->336 [label=5]; +282->333 [label=1]; +282->335 [label=1]; +282->313 [label=2]; +282->326 [label=2]; +282->336 [label=3]; +283->329 [label=0]; +283->314 [label=2]; +283->327 [label=2]; +284->330 [label=0]; +284->315 [label=2]; +284->328 [label=2]; +285->337 [label=3]; +285->338 [label=4]; +285->339 [label=4]; +286->337 [label=1]; +286->340 [label=4]; +286->341 [label=4]; +287->338 [label=1]; +287->340 [label=3]; +287->342 [label=4]; +288->339 [label=1]; +288->341 [label=3]; +288->342 [label=4]; +289->337 [label=1]; +289->343 [label=4]; +289->344 [label=4]; +290->338 [label=1]; +290->343 [label=3]; +290->345 [label=4]; +291->339 [label=1]; +291->344 [label=3]; +291->345 [label=4]; +292->340 [label=1]; +292->343 [label=1]; +292->346 [label=4]; +293->341 [label=1]; +293->344 [label=1]; +293->346 [label=4]; +294->342 [label=1]; +294->345 [label=1]; +294->346 [label=3]; +294->347 [label=5]; +295->337 [label=0]; +295->348 [label=4]; +296->338 [label=0]; +296->348 [label=3]; +297->340 [label=0]; +297->348 [label=1]; +298->343 [label=0]; +298->348 [label=1]; +299->337 [label=0]; +299->349 [label=4]; +300->339 [label=0]; +300->349 [label=3]; +301->341 [label=0]; +301->349 [label=1]; +302->344 [label=0]; +302->349 [label=1]; +303->337 [label=2]; +303->350 [label=4]; +303->351 [label=4]; +304->338 [label=2]; +304->350 [label=3]; +304->352 [label=4]; +305->339 [label=2]; +305->351 [label=3]; +305->352 [label=4]; +306->350 [label=1]; +306->340 [label=2]; +306->353 [label=4]; +307->351 [label=1]; +307->341 [label=2]; +307->353 [label=4]; +308->352 [label=1]; +308->342 [label=2]; +308->353 [label=3]; +308->354 [label=5]; +309->350 [label=1]; +309->343 [label=2]; +309->355 [label=4]; +310->351 [label=1]; +310->344 [label=2]; +310->355 [label=4]; +311->352 [label=1]; +311->345 [label=2]; +311->355 [label=3]; +311->356 [label=5]; +312->353 [label=1]; +312->355 [label=1]; +312->346 [label=2]; +312->357 [label=5]; +313->354 [label=1]; +313->356 [label=1]; +313->347 [label=2]; +313->357 [label=3]; +314->350 [label=0]; +314->348 [label=2]; +315->351 [label=0]; +315->349 [label=2]; +316->337 [label=2]; +316->358 [label=4]; +316->359 [label=4]; +317->338 [label=2]; +317->358 [label=3]; +317->360 [label=4]; +318->339 [label=2]; +318->359 [label=3]; +318->360 [label=4]; +319->358 [label=1]; +319->340 [label=2]; +319->361 [label=4]; +320->359 [label=1]; +320->341 [label=2]; +320->361 [label=4]; +321->360 [label=1]; +321->342 [label=2]; +321->361 [label=3]; +321->362 [label=5]; +322->358 [label=1]; +322->343 [label=2]; +322->363 [label=4]; +323->359 [label=1]; +323->344 [label=2]; +323->363 [label=4]; +324->360 [label=1]; +324->345 [label=2]; +324->363 [label=3]; +324->364 [label=5]; +325->361 [label=1]; +325->363 [label=1]; +325->346 [label=2]; +325->365 [label=5]; +326->362 [label=1]; +326->364 [label=1]; +326->347 [label=2]; +326->365 [label=3]; +327->358 [label=0]; +327->348 [label=2]; +328->359 [label=0]; +328->349 [label=2]; +329->350 [label=2]; +329->358 [label=2]; +329->366 [label=4]; +330->351 [label=2]; +330->359 [label=2]; +330->366 [label=4]; +331->352 [label=2]; +331->360 [label=2]; +331->366 [label=3]; +331->367 [label=5]; +332->366 [label=1]; +332->353 [label=2]; +332->361 [label=2]; +332->368 [label=5]; +333->367 [label=1]; +333->354 [label=2]; +333->362 [label=2]; +333->368 [label=3]; +334->366 [label=1]; +334->355 [label=2]; +334->363 [label=2]; +334->369 [label=5]; +335->367 [label=1]; +335->356 [label=2]; +335->364 [label=2]; +335->369 [label=3]; +336->368 [label=1]; +336->369 [label=1]; +336->357 [label=2]; +336->365 [label=2]; +337->370 [label=4]; +337->371 [label=4]; +338->370 [label=3]; +338->372 [label=4]; +339->371 [label=3]; +339->372 [label=4]; +340->370 [label=1]; +340->373 [label=4]; +341->371 [label=1]; +341->373 [label=4]; +342->372 [label=1]; +342->373 [label=3]; +342->374 [label=5]; +343->370 [label=1]; +343->375 [label=4]; +344->371 [label=1]; +344->375 [label=4]; +345->372 [label=1]; +345->375 [label=3]; +345->376 [label=5]; +346->373 [label=1]; +346->375 [label=1]; +346->377 [label=5]; +347->374 [label=1]; +347->376 [label=1]; +347->377 [label=3]; +348->370 [label=0]; +349->371 [label=0]; +350->370 [label=2]; +350->378 [label=4]; +351->371 [label=2]; +351->378 [label=4]; +352->372 [label=2]; +352->378 [label=3]; +352->379 [label=5]; +353->378 [label=1]; +353->373 [label=2]; +353->380 [label=5]; +354->379 [label=1]; +354->374 [label=2]; +354->380 [label=3]; +355->378 [label=1]; +355->375 [label=2]; +355->381 [label=5]; +356->379 [label=1]; +356->376 [label=2]; +356->381 [label=3]; +357->380 [label=1]; +357->381 [label=1]; +357->377 [label=2]; +358->370 [label=2]; +358->382 [label=4]; +359->371 [label=2]; +359->382 [label=4]; +360->372 [label=2]; +360->382 [label=3]; +360->383 [label=5]; +361->382 [label=1]; +361->373 [label=2]; +361->384 [label=5]; +362->383 [label=1]; +362->374 [label=2]; +362->384 [label=3]; +363->382 [label=1]; +363->375 [label=2]; +363->385 [label=5]; +364->383 [label=1]; +364->376 [label=2]; +364->385 [label=3]; +365->384 [label=1]; +365->385 [label=1]; +365->377 [label=2]; +366->378 [label=2]; +366->382 [label=2]; +366->386 [label=5]; +367->379 [label=2]; +367->383 [label=2]; +367->386 [label=3]; +368->386 [label=1]; +368->380 [label=2]; +368->384 [label=2]; +369->386 [label=1]; +369->381 [label=2]; +369->385 [label=2]; +370->387 [label=4]; +371->387 [label=4]; +372->387 [label=3]; +372->388 [label=5]; +373->387 [label=1]; +373->389 [label=5]; +374->388 [label=1]; +374->389 [label=3]; +375->387 [label=1]; +375->390 [label=5]; +376->388 [label=1]; +376->390 [label=3]; +377->389 [label=1]; +377->390 [label=1]; +378->387 [label=2]; +378->391 [label=5]; +379->388 [label=2]; +379->391 [label=3]; +380->391 [label=1]; +380->389 [label=2]; +381->391 [label=1]; +381->390 [label=2]; +382->387 [label=2]; +382->392 [label=5]; +383->388 [label=2]; +383->392 [label=3]; +384->392 [label=1]; +384->389 [label=2]; +385->392 [label=1]; +385->390 [label=2]; +386->391 [label=2]; +386->392 [label=2]; +387->393 [label=5]; +388->393 [label=3]; +389->393 [label=1]; +390->393 [label=1]; +391->393 [label=2]; +392->393 [label=2]; } diff --git a/build/ag.svg b/build/ag.svg index 4e1870c..f36730b 100644 --- a/build/ag.svg +++ b/build/ag.svg @@ -1,145 +1,12023 @@ - - - + + G - + 0 - -0 + +0 1 - -1 + +1 0->1 - - -0 + + +5 2 - -2 + +2 - + -0->2 - - -1 +1->2 + + +5 3 - -3 + +3 - + -0->3 - - -2 +2->3 + + +2 4 - -4 + +4 - + -1->4 - - -1 +2->4 + + +2 5 - -5 + +5 - + -1->5 - - -2 - - - -2->4 - - -0 +2->5 + + +5 6 - -6 - - - -2->6 - - -2 - - - -3->5 - - -0 + +6 - + 3->6 - - -1 + + +2 7 - -7 + +7 - - -4->7 - - -2 + + +3->7 + + +5 + + + +4->6 + + +2 + + + +8 + +8 + + + +4->8 + + +5 - + 5->7 - - -1 + + +2 - + + +5->8 + + +2 + + + +9 + +9 + + -6->7 - - -0 +5->9 + + +5 + + + +10 + +10 + + + +6->10 + + +5 + + + +7->10 + + +2 + + + +11 + +11 + + + +7->11 + + +5 + + + +8->10 + + +2 + + + +12 + +12 + + + +8->12 + + +5 + + + +9->11 + + +2 + + + +9->12 + + +2 + + + +13 + +13 + + + +9->13 + + +5 + + + +14 + +14 + + + +10->14 + + +5 + + + +11->14 + + +2 + + + +15 + +15 + + + +11->15 + + +5 + + + +12->14 + + +2 + + + +16 + +16 + + + +12->16 + + +5 + + + +13->15 + + +2 + + + +13->16 + + +2 + + + +17 + +17 + + + +13->17 + + +5 + + + +18 + +18 + + + +14->18 + + +5 + + + +15->18 + + +2 + + + +19 + +19 + + + +15->19 + + +5 + + + +16->18 + + +2 + + + +20 + +20 + + + +16->20 + + +5 + + + +17->19 + + +2 + + + +17->20 + + +2 + + + +21 + +21 + + + +17->21 + + +0 + + + +22 + +22 + + + +17->22 + + +0 + + + +23 + +23 + + + +18->23 + + +5 + + + +19->23 + + +2 + + + +24 + +24 + + + +19->24 + + +0 + + + +25 + +25 + + + +19->25 + + +0 + + + +20->23 + + +2 + + + +26 + +26 + + + +20->26 + + +0 + + + +27 + +27 + + + +20->27 + + +0 + + + +21->24 + + +2 + + + +21->26 + + +2 + + + +28 + +28 + + + +21->28 + + +0 + + + +29 + +29 + + + +21->29 + + +4 + + + +22->25 + + +2 + + + +22->27 + + +2 + + + +22->28 + + +0 + + + +30 + +30 + + + +22->30 + + +4 + + + +31 + +31 + + + +23->31 + + +0 + + + +32 + +32 + + + +23->32 + + +0 + + + +24->31 + + +2 + + + +33 + +33 + + + +24->33 + + +0 + + + +34 + +34 + + + +24->34 + + +4 + + + +25->32 + + +2 + + + +25->33 + + +0 + + + +35 + +35 + + + +25->35 + + +4 + + + +26->31 + + +2 + + + +36 + +36 + + + +26->36 + + +0 + + + +37 + +37 + + + +26->37 + + +4 + + + +27->32 + + +2 + + + +27->36 + + +0 + + + +38 + +38 + + + +27->38 + + +4 + + + +28->33 + + +2 + + + +28->36 + + +2 + + + +39 + +39 + + + +28->39 + + +4 + + + +40 + +40 + + + +28->40 + + +4 + + + +29->34 + + +2 + + + +29->37 + + +2 + + + +29->39 + + +0 + + + +30->35 + + +2 + + + +30->38 + + +2 + + + +30->40 + + +0 + + + +41 + +41 + + + +31->41 + + +0 + + + +42 + +42 + + + +31->42 + + +4 + + + +32->41 + + +0 + + + +43 + +43 + + + +32->43 + + +4 + + + +33->41 + + +2 + + + +44 + +44 + + + +33->44 + + +4 + + + +45 + +45 + + + +33->45 + + +4 + + + +34->42 + + +2 + + + +34->44 + + +0 + + + +35->43 + + +2 + + + +35->45 + + +0 + + + +36->41 + + +2 + + + +46 + +46 + + + +36->46 + + +4 + + + +47 + +47 + + + +36->47 + + +4 + + + +37->42 + + +2 + + + +37->46 + + +0 + + + +38->43 + + +2 + + + +38->47 + + +0 + + + +39->44 + + +2 + + + +39->46 + + +2 + + + +48 + +48 + + + +39->48 + + +4 + + + +40->45 + + +2 + + + +40->47 + + +2 + + + +40->48 + + +4 + + + +49 + +49 + + + +41->49 + + +4 + + + +50 + +50 + + + +41->50 + + +4 + + + +42->49 + + +0 + + + +43->50 + + +0 + + + +44->49 + + +2 + + + +51 + +51 + + + +44->51 + + +4 + + + +45->50 + + +2 + + + +45->51 + + +4 + + + +46->49 + + +2 + + + +52 + +52 + + + +46->52 + + +4 + + + +47->50 + + +2 + + + +47->52 + + +4 + + + +48->51 + + +2 + + + +48->52 + + +2 + + + +53 + +53 + + + +48->53 + + +5 + + + +54 + +54 + + + +49->54 + + +4 + + + +50->54 + + +4 + + + +51->54 + + +2 + + + +55 + +55 + + + +51->55 + + +5 + + + +52->54 + + +2 + + + +56 + +56 + + + +52->56 + + +5 + + + +53->55 + + +2 + + + +53->56 + + +2 + + + +57 + +57 + + + +53->57 + + +5 + + + +58 + +58 + + + +54->58 + + +5 + + + +55->58 + + +2 + + + +59 + +59 + + + +55->59 + + +5 + + + +56->58 + + +2 + + + +60 + +60 + + + +56->60 + + +5 + + + +57->59 + + +2 + + + +57->60 + + +2 + + + +61 + +61 + + + +57->61 + + +5 + + + +62 + +62 + + + +58->62 + + +5 + + + +59->62 + + +2 + + + +63 + +63 + + + +59->63 + + +5 + + + +60->62 + + +2 + + + +64 + +64 + + + +60->64 + + +5 + + + +61->63 + + +2 + + + +61->64 + + +2 + + + +65 + +65 + + + +61->65 + + +5 + + + +66 + +66 + + + +62->66 + + +5 + + + +63->66 + + +2 + + + +67 + +67 + + + +63->67 + + +5 + + + +64->66 + + +2 + + + +68 + +68 + + + +64->68 + + +5 + + + +65->67 + + +2 + + + +65->68 + + +2 + + + +69 + +69 + + + +65->69 + + +5 + + + +70 + +70 + + + +66->70 + + +5 + + + +67->70 + + +2 + + + +71 + +71 + + + +67->71 + + +5 + + + +68->70 + + +2 + + + +72 + +72 + + + +68->72 + + +5 + + + +69->71 + + +2 + + + +69->72 + + +2 + + + +73 + +73 + + + +69->73 + + +5 + + + +74 + +74 + + + +70->74 + + +5 + + + +71->74 + + +2 + + + +75 + +75 + + + +71->75 + + +5 + + + +72->74 + + +2 + + + +76 + +76 + + + +72->76 + + +5 + + + +73->75 + + +2 + + + +73->76 + + +2 + + + +77 + +77 + + + +73->77 + + +0 + + + +78 + +78 + + + +73->78 + + +0 + + + +79 + +79 + + + +73->79 + + +1 + + + +80 + +80 + + + +73->80 + + +1 + + + +81 + +81 + + + +73->81 + + +3 + + + +82 + +82 + + + +74->82 + + +5 + + + +75->82 + + +2 + + + +83 + +83 + + + +75->83 + + +0 + + + +84 + +84 + + + +75->84 + + +0 + + + +85 + +85 + + + +75->85 + + +1 + + + +86 + +86 + + + +75->86 + + +1 + + + +87 + +87 + + + +75->87 + + +3 + + + +76->82 + + +2 + + + +88 + +88 + + + +76->88 + + +0 + + + +89 + +89 + + + +76->89 + + +0 + + + +90 + +90 + + + +76->90 + + +1 + + + +91 + +91 + + + +76->91 + + +1 + + + +92 + +92 + + + +76->92 + + +3 + + + +77->83 + + +2 + + + +77->88 + + +2 + + + +93 + +93 + + + +77->93 + + +0 + + + +94 + +94 + + + +77->94 + + +1 + + + +95 + +95 + + + +77->95 + + +1 + + + +96 + +96 + + + +77->96 + + +3 + + + +97 + +97 + + + +77->97 + + +4 + + + +78->84 + + +2 + + + +78->89 + + +2 + + + +78->93 + + +0 + + + +98 + +98 + + + +78->98 + + +1 + + + +99 + +99 + + + +78->99 + + +1 + + + +100 + +100 + + + +78->100 + + +3 + + + +101 + +101 + + + +78->101 + + +4 + + + +79->85 + + +2 + + + +79->90 + + +2 + + + +79->94 + + +0 + + + +79->98 + + +0 + + + +102 + +102 + + + +79->102 + + +1 + + + +103 + +103 + + + +79->103 + + +3 + + + +80->86 + + +2 + + + +80->91 + + +2 + + + +80->95 + + +0 + + + +80->99 + + +0 + + + +80->102 + + +1 + + + +104 + +104 + + + +80->104 + + +3 + + + +81->87 + + +2 + + + +81->92 + + +2 + + + +81->96 + + +0 + + + +81->100 + + +0 + + + +81->103 + + +1 + + + +81->104 + + +1 + + + +105 + +105 + + + +82->105 + + +0 + + + +106 + +106 + + + +82->106 + + +0 + + + +107 + +107 + + + +82->107 + + +1 + + + +108 + +108 + + + +82->108 + + +1 + + + +109 + +109 + + + +82->109 + + +3 + + + +83->105 + + +2 + + + +110 + +110 + + + +83->110 + + +0 + + + +111 + +111 + + + +83->111 + + +1 + + + +112 + +112 + + + +83->112 + + +1 + + + +113 + +113 + + + +83->113 + + +3 + + + +114 + +114 + + + +83->114 + + +4 + + + +84->106 + + +2 + + + +84->110 + + +0 + + + +115 + +115 + + + +84->115 + + +1 + + + +116 + +116 + + + +84->116 + + +1 + + + +117 + +117 + + + +84->117 + + +3 + + + +118 + +118 + + + +84->118 + + +4 + + + +85->107 + + +2 + + + +85->111 + + +0 + + + +85->115 + + +0 + + + +119 + +119 + + + +85->119 + + +1 + + + +120 + +120 + + + +85->120 + + +3 + + + +86->108 + + +2 + + + +86->112 + + +0 + + + +86->116 + + +0 + + + +86->119 + + +1 + + + +121 + +121 + + + +86->121 + + +3 + + + +87->109 + + +2 + + + +87->113 + + +0 + + + +87->117 + + +0 + + + +87->120 + + +1 + + + +87->121 + + +1 + + + +88->105 + + +2 + + + +122 + +122 + + + +88->122 + + +0 + + + +123 + +123 + + + +88->123 + + +1 + + + +124 + +124 + + + +88->124 + + +1 + + + +125 + +125 + + + +88->125 + + +3 + + + +126 + +126 + + + +88->126 + + +4 + + + +89->106 + + +2 + + + +89->122 + + +0 + + + +127 + +127 + + + +89->127 + + +1 + + + +128 + +128 + + + +89->128 + + +1 + + + +129 + +129 + + + +89->129 + + +3 + + + +130 + +130 + + + +89->130 + + +4 + + + +90->107 + + +2 + + + +90->123 + + +0 + + + +90->127 + + +0 + + + +131 + +131 + + + +90->131 + + +1 + + + +132 + +132 + + + +90->132 + + +3 + + + +91->108 + + +2 + + + +91->124 + + +0 + + + +91->128 + + +0 + + + +91->131 + + +1 + + + +133 + +133 + + + +91->133 + + +3 + + + +92->109 + + +2 + + + +92->125 + + +0 + + + +92->129 + + +0 + + + +92->132 + + +1 + + + +92->133 + + +1 + + + +93->110 + + +2 + + + +93->122 + + +2 + + + +134 + +134 + + + +93->134 + + +1 + + + +135 + +135 + + + +93->135 + + +1 + + + +136 + +136 + + + +93->136 + + +3 + + + +137 + +137 + + + +93->137 + + +4 + + + +138 + +138 + + + +93->138 + + +4 + + + +94->111 + + +2 + + + +94->123 + + +2 + + + +94->134 + + +0 + + + +139 + +139 + + + +94->139 + + +1 + + + +140 + +140 + + + +94->140 + + +3 + + + +141 + +141 + + + +94->141 + + +4 + + + +95->112 + + +2 + + + +95->124 + + +2 + + + +95->135 + + +0 + + + +95->139 + + +1 + + + +142 + +142 + + + +95->142 + + +3 + + + +143 + +143 + + + +95->143 + + +4 + + + +96->113 + + +2 + + + +96->125 + + +2 + + + +96->136 + + +0 + + + +96->140 + + +1 + + + +96->142 + + +1 + + + +144 + +144 + + + +96->144 + + +4 + + + +97->114 + + +2 + + + +97->126 + + +2 + + + +97->137 + + +0 + + + +97->141 + + +1 + + + +97->143 + + +1 + + + +97->144 + + +3 + + + +98->115 + + +2 + + + +98->127 + + +2 + + + +98->134 + + +0 + + + +145 + +145 + + + +98->145 + + +1 + + + +146 + +146 + + + +98->146 + + +3 + + + +147 + +147 + + + +98->147 + + +4 + + + +99->116 + + +2 + + + +99->128 + + +2 + + + +99->135 + + +0 + + + +99->145 + + +1 + + + +148 + +148 + + + +99->148 + + +3 + + + +149 + +149 + + + +99->149 + + +4 + + + +100->117 + + +2 + + + +100->129 + + +2 + + + +100->136 + + +0 + + + +100->146 + + +1 + + + +100->148 + + +1 + + + +150 + +150 + + + +100->150 + + +4 + + + +101->118 + + +2 + + + +101->130 + + +2 + + + +101->138 + + +0 + + + +101->147 + + +1 + + + +101->149 + + +1 + + + +101->150 + + +3 + + + +102->119 + + +2 + + + +102->131 + + +2 + + + +102->139 + + +0 + + + +102->145 + + +0 + + + +151 + +151 + + + +102->151 + + +3 + + + +103->120 + + +2 + + + +103->132 + + +2 + + + +103->140 + + +0 + + + +103->146 + + +0 + + + +103->151 + + +1 + + + +104->121 + + +2 + + + +104->133 + + +2 + + + +104->142 + + +0 + + + +104->148 + + +0 + + + +104->151 + + +1 + + + +152 + +152 + + + +105->152 + + +0 + + + +153 + +153 + + + +105->153 + + +1 + + + +154 + +154 + + + +105->154 + + +1 + + + +155 + +155 + + + +105->155 + + +3 + + + +156 + +156 + + + +105->156 + + +4 + + + +106->152 + + +0 + + + +157 + +157 + + + +106->157 + + +1 + + + +158 + +158 + + + +106->158 + + +1 + + + +159 + +159 + + + +106->159 + + +3 + + + +160 + +160 + + + +106->160 + + +4 + + + +107->153 + + +0 + + + +107->157 + + +0 + + + +161 + +161 + + + +107->161 + + +1 + + + +162 + +162 + + + +107->162 + + +3 + + + +108->154 + + +0 + + + +108->158 + + +0 + + + +108->161 + + +1 + + + +163 + +163 + + + +108->163 + + +3 + + + +109->155 + + +0 + + + +109->159 + + +0 + + + +109->162 + + +1 + + + +109->163 + + +1 + + + +110->152 + + +2 + + + +164 + +164 + + + +110->164 + + +1 + + + +165 + +165 + + + +110->165 + + +1 + + + +166 + +166 + + + +110->166 + + +3 + + + +167 + +167 + + + +110->167 + + +4 + + + +168 + +168 + + + +110->168 + + +4 + + + +111->153 + + +2 + + + +111->164 + + +0 + + + +169 + +169 + + + +111->169 + + +1 + + + +170 + +170 + + + +111->170 + + +3 + + + +171 + +171 + + + +111->171 + + +4 + + + +112->154 + + +2 + + + +112->165 + + +0 + + + +112->169 + + +1 + + + +172 + +172 + + + +112->172 + + +3 + + + +173 + +173 + + + +112->173 + + +4 + + + +113->155 + + +2 + + + +113->166 + + +0 + + + +113->170 + + +1 + + + +113->172 + + +1 + + + +174 + +174 + + + +113->174 + + +4 + + + +114->156 + + +2 + + + +114->167 + + +0 + + + +114->171 + + +1 + + + +114->173 + + +1 + + + +114->174 + + +3 + + + +115->157 + + +2 + + + +115->164 + + +0 + + + +175 + +175 + + + +115->175 + + +1 + + + +176 + +176 + + + +115->176 + + +3 + + + +177 + +177 + + + +115->177 + + +4 + + + +116->158 + + +2 + + + +116->165 + + +0 + + + +116->175 + + +1 + + + +178 + +178 + + + +116->178 + + +3 + + + +179 + +179 + + + +116->179 + + +4 + + + +117->159 + + +2 + + + +117->166 + + +0 + + + +117->176 + + +1 + + + +117->178 + + +1 + + + +180 + +180 + + + +117->180 + + +4 + + + +118->160 + + +2 + + + +118->168 + + +0 + + + +118->177 + + +1 + + + +118->179 + + +1 + + + +118->180 + + +3 + + + +119->161 + + +2 + + + +119->169 + + +0 + + + +119->175 + + +0 + + + +181 + +181 + + + +119->181 + + +3 + + + +120->162 + + +2 + + + +120->170 + + +0 + + + +120->176 + + +0 + + + +120->181 + + +1 + + + +121->163 + + +2 + + + +121->172 + + +0 + + + +121->178 + + +0 + + + +121->181 + + +1 + + + +122->152 + + +2 + + + +182 + +182 + + + +122->182 + + +1 + + + +183 + +183 + + + +122->183 + + +1 + + + +184 + +184 + + + +122->184 + + +3 + + + +185 + +185 + + + +122->185 + + +4 + + + +186 + +186 + + + +122->186 + + +4 + + + +123->153 + + +2 + + + +123->182 + + +0 + + + +187 + +187 + + + +123->187 + + +1 + + + +188 + +188 + + + +123->188 + + +3 + + + +189 + +189 + + + +123->189 + + +4 + + + +124->154 + + +2 + + + +124->183 + + +0 + + + +124->187 + + +1 + + + +190 + +190 + + + +124->190 + + +3 + + + +191 + +191 + + + +124->191 + + +4 + + + +125->155 + + +2 + + + +125->184 + + +0 + + + +125->188 + + +1 + + + +125->190 + + +1 + + + +192 + +192 + + + +125->192 + + +4 + + + +126->156 + + +2 + + + +126->185 + + +0 + + + +126->189 + + +1 + + + +126->191 + + +1 + + + +126->192 + + +3 + + + +127->157 + + +2 + + + +127->182 + + +0 + + + +193 + +193 + + + +127->193 + + +1 + + + +194 + +194 + + + +127->194 + + +3 + + + +195 + +195 + + + +127->195 + + +4 + + + +128->158 + + +2 + + + +128->183 + + +0 + + + +128->193 + + +1 + + + +196 + +196 + + + +128->196 + + +3 + + + +197 + +197 + + + +128->197 + + +4 + + + +129->159 + + +2 + + + +129->184 + + +0 + + + +129->194 + + +1 + + + +129->196 + + +1 + + + +198 + +198 + + + +129->198 + + +4 + + + +130->160 + + +2 + + + +130->186 + + +0 + + + +130->195 + + +1 + + + +130->197 + + +1 + + + +130->198 + + +3 + + + +131->161 + + +2 + + + +131->187 + + +0 + + + +131->193 + + +0 + + + +199 + +199 + + + +131->199 + + +3 + + + +132->162 + + +2 + + + +132->188 + + +0 + + + +132->194 + + +0 + + + +132->199 + + +1 + + + +133->163 + + +2 + + + +133->190 + + +0 + + + +133->196 + + +0 + + + +133->199 + + +1 + + + +134->164 + + +2 + + + +134->182 + + +2 + + + +200 + +200 + + + +134->200 + + +1 + + + +201 + +201 + + + +134->201 + + +3 + + + +202 + +202 + + + +134->202 + + +4 + + + +203 + +203 + + + +134->203 + + +4 + + + +135->165 + + +2 + + + +135->183 + + +2 + + + +135->200 + + +1 + + + +204 + +204 + + + +135->204 + + +3 + + + +205 + +205 + + + +135->205 + + +4 + + + +206 + +206 + + + +135->206 + + +4 + + + +136->166 + + +2 + + + +136->184 + + +2 + + + +136->201 + + +1 + + + +136->204 + + +1 + + + +207 + +207 + + + +136->207 + + +4 + + + +208 + +208 + + + +136->208 + + +4 + + + +137->167 + + +2 + + + +137->185 + + +2 + + + +137->202 + + +1 + + + +137->205 + + +1 + + + +137->207 + + +3 + + + +209 + +209 + + + +137->209 + + +4 + + + +138->168 + + +2 + + + +138->186 + + +2 + + + +138->203 + + +1 + + + +138->206 + + +1 + + + +138->208 + + +3 + + + +138->209 + + +4 + + + +139->169 + + +2 + + + +139->187 + + +2 + + + +139->200 + + +0 + + + +210 + +210 + + + +139->210 + + +3 + + + +211 + +211 + + + +139->211 + + +4 + + + +140->170 + + +2 + + + +140->188 + + +2 + + + +140->201 + + +0 + + + +140->210 + + +1 + + + +212 + +212 + + + +140->212 + + +4 + + + +141->171 + + +2 + + + +141->189 + + +2 + + + +141->202 + + +0 + + + +141->211 + + +1 + + + +141->212 + + +3 + + + +142->172 + + +2 + + + +142->190 + + +2 + + + +142->204 + + +0 + + + +142->210 + + +1 + + + +213 + +213 + + + +142->213 + + +4 + + + +143->173 + + +2 + + + +143->191 + + +2 + + + +143->205 + + +0 + + + +143->211 + + +1 + + + +143->213 + + +3 + + + +144->174 + + +2 + + + +144->192 + + +2 + + + +144->207 + + +0 + + + +144->212 + + +1 + + + +144->213 + + +1 + + + +145->175 + + +2 + + + +145->193 + + +2 + + + +145->200 + + +0 + + + +214 + +214 + + + +145->214 + + +3 + + + +215 + +215 + + + +145->215 + + +4 + + + +146->176 + + +2 + + + +146->194 + + +2 + + + +146->201 + + +0 + + + +146->214 + + +1 + + + +216 + +216 + + + +146->216 + + +4 + + + +147->177 + + +2 + + + +147->195 + + +2 + + + +147->203 + + +0 + + + +147->215 + + +1 + + + +147->216 + + +3 + + + +148->178 + + +2 + + + +148->196 + + +2 + + + +148->204 + + +0 + + + +148->214 + + +1 + + + +217 + +217 + + + +148->217 + + +4 + + + +149->179 + + +2 + + + +149->197 + + +2 + + + +149->206 + + +0 + + + +149->215 + + +1 + + + +149->217 + + +3 + + + +150->180 + + +2 + + + +150->198 + + +2 + + + +150->208 + + +0 + + + +150->216 + + +1 + + + +150->217 + + +1 + + + +151->181 + + +2 + + + +151->199 + + +2 + + + +151->210 + + +0 + + + +151->214 + + +0 + + + +218 + +218 + + + +152->218 + + +1 + + + +219 + +219 + + + +152->219 + + +1 + + + +220 + +220 + + + +152->220 + + +3 + + + +221 + +221 + + + +152->221 + + +4 + + + +222 + +222 + + + +152->222 + + +4 + + + +153->218 + + +0 + + + +223 + +223 + + + +153->223 + + +1 + + + +224 + +224 + + + +153->224 + + +3 + + + +225 + +225 + + + +153->225 + + +4 + + + +154->219 + + +0 + + + +154->223 + + +1 + + + +226 + +226 + + + +154->226 + + +3 + + + +227 + +227 + + + +154->227 + + +4 + + + +155->220 + + +0 + + + +155->224 + + +1 + + + +155->226 + + +1 + + + +228 + +228 + + + +155->228 + + +4 + + + +156->221 + + +0 + + + +156->225 + + +1 + + + +156->227 + + +1 + + + +156->228 + + +3 + + + +157->218 + + +0 + + + +229 + +229 + + + +157->229 + + +1 + + + +230 + +230 + + + +157->230 + + +3 + + + +231 + +231 + + + +157->231 + + +4 + + + +158->219 + + +0 + + + +158->229 + + +1 + + + +232 + +232 + + + +158->232 + + +3 + + + +233 + +233 + + + +158->233 + + +4 + + + +159->220 + + +0 + + + +159->230 + + +1 + + + +159->232 + + +1 + + + +234 + +234 + + + +159->234 + + +4 + + + +160->222 + + +0 + + + +160->231 + + +1 + + + +160->233 + + +1 + + + +160->234 + + +3 + + + +161->223 + + +0 + + + +161->229 + + +0 + + + +235 + +235 + + + +161->235 + + +3 + + + +162->224 + + +0 + + + +162->230 + + +0 + + + +162->235 + + +1 + + + +163->226 + + +0 + + + +163->232 + + +0 + + + +163->235 + + +1 + + + +164->218 + + +2 + + + +236 + +236 + + + +164->236 + + +1 + + + +237 + +237 + + + +164->237 + + +3 + + + +238 + +238 + + + +164->238 + + +4 + + + +239 + +239 + + + +164->239 + + +4 + + + +165->219 + + +2 + + + +165->236 + + +1 + + + +240 + +240 + + + +165->240 + + +3 + + + +241 + +241 + + + +165->241 + + +4 + + + +242 + +242 + + + +165->242 + + +4 + + + +166->220 + + +2 + + + +166->237 + + +1 + + + +166->240 + + +1 + + + +243 + +243 + + + +166->243 + + +4 + + + +244 + +244 + + + +166->244 + + +4 + + + +167->221 + + +2 + + + +167->238 + + +1 + + + +167->241 + + +1 + + + +167->243 + + +3 + + + +245 + +245 + + + +167->245 + + +4 + + + +168->222 + + +2 + + + +168->239 + + +1 + + + +168->242 + + +1 + + + +168->244 + + +3 + + + +168->245 + + +4 + + + +169->223 + + +2 + + + +169->236 + + +0 + + + +246 + +246 + + + +169->246 + + +3 + + + +247 + +247 + + + +169->247 + + +4 + + + +170->224 + + +2 + + + +170->237 + + +0 + + + +170->246 + + +1 + + + +248 + +248 + + + +170->248 + + +4 + + + +171->225 + + +2 + + + +171->238 + + +0 + + + +171->247 + + +1 + + + +171->248 + + +3 + + + +172->226 + + +2 + + + +172->240 + + +0 + + + +172->246 + + +1 + + + +249 + +249 + + + +172->249 + + +4 + + + +173->227 + + +2 + + + +173->241 + + +0 + + + +173->247 + + +1 + + + +173->249 + + +3 + + + +174->228 + + +2 + + + +174->243 + + +0 + + + +174->248 + + +1 + + + +174->249 + + +1 + + + +175->229 + + +2 + + + +175->236 + + +0 + + + +250 + +250 + + + +175->250 + + +3 + + + +251 + +251 + + + +175->251 + + +4 + + + +176->230 + + +2 + + + +176->237 + + +0 + + + +176->250 + + +1 + + + +252 + +252 + + + +176->252 + + +4 + + + +177->231 + + +2 + + + +177->239 + + +0 + + + +177->251 + + +1 + + + +177->252 + + +3 + + + +178->232 + + +2 + + + +178->240 + + +0 + + + +178->250 + + +1 + + + +253 + +253 + + + +178->253 + + +4 + + + +179->233 + + +2 + + + +179->242 + + +0 + + + +179->251 + + +1 + + + +179->253 + + +3 + + + +180->234 + + +2 + + + +180->244 + + +0 + + + +180->252 + + +1 + + + +180->253 + + +1 + + + +181->235 + + +2 + + + +181->246 + + +0 + + + +181->250 + + +0 + + + +182->218 + + +2 + + + +254 + +254 + + + +182->254 + + +1 + + + +255 + +255 + + + +182->255 + + +3 + + + +256 + +256 + + + +182->256 + + +4 + + + +257 + +257 + + + +182->257 + + +4 + + + +183->219 + + +2 + + + +183->254 + + +1 + + + +258 + +258 + + + +183->258 + + +3 + + + +259 + +259 + + + +183->259 + + +4 + + + +260 + +260 + + + +183->260 + + +4 + + + +184->220 + + +2 + + + +184->255 + + +1 + + + +184->258 + + +1 + + + +261 + +261 + + + +184->261 + + +4 + + + +262 + +262 + + + +184->262 + + +4 + + + +185->221 + + +2 + + + +185->256 + + +1 + + + +185->259 + + +1 + + + +185->261 + + +3 + + + +263 + +263 + + + +185->263 + + +4 + + + +186->222 + + +2 + + + +186->257 + + +1 + + + +186->260 + + +1 + + + +186->262 + + +3 + + + +186->263 + + +4 + + + +187->223 + + +2 + + + +187->254 + + +0 + + + +264 + +264 + + + +187->264 + + +3 + + + +265 + +265 + + + +187->265 + + +4 + + + +188->224 + + +2 + + + +188->255 + + +0 + + + +188->264 + + +1 + + + +266 + +266 + + + +188->266 + + +4 + + + +189->225 + + +2 + + + +189->256 + + +0 + + + +189->265 + + +1 + + + +189->266 + + +3 + + + +190->226 + + +2 + + + +190->258 + + +0 + + + +190->264 + + +1 + + + +267 + +267 + + + +190->267 + + +4 + + + +191->227 + + +2 + + + +191->259 + + +0 + + + +191->265 + + +1 + + + +191->267 + + +3 + + + +192->228 + + +2 + + + +192->261 + + +0 + + + +192->266 + + +1 + + + +192->267 + + +1 + + + +193->229 + + +2 + + + +193->254 + + +0 + + + +268 + +268 + + + +193->268 + + +3 + + + +269 + +269 + + + +193->269 + + +4 + + + +194->230 + + +2 + + + +194->255 + + +0 + + + +194->268 + + +1 + + + +270 + +270 + + + +194->270 + + +4 + + + +195->231 + + +2 + + + +195->257 + + +0 + + + +195->269 + + +1 + + + +195->270 + + +3 + + + +196->232 + + +2 + + + +196->258 + + +0 + + + +196->268 + + +1 + + + +271 + +271 + + + +196->271 + + +4 + + + +197->233 + + +2 + + + +197->260 + + +0 + + + +197->269 + + +1 + + + +197->271 + + +3 + + + +198->234 + + +2 + + + +198->262 + + +0 + + + +198->270 + + +1 + + + +198->271 + + +1 + + + +199->235 + + +2 + + + +199->264 + + +0 + + + +199->268 + + +0 + + + +200->236 + + +2 + + + +200->254 + + +2 + + + +272 + +272 + + + +200->272 + + +3 + + + +273 + +273 + + + +200->273 + + +4 + + + +274 + +274 + + + +200->274 + + +4 + + + +201->237 + + +2 + + + +201->255 + + +2 + + + +201->272 + + +1 + + + +275 + +275 + + + +201->275 + + +4 + + + +276 + +276 + + + +201->276 + + +4 + + + +202->238 + + +2 + + + +202->256 + + +2 + + + +202->273 + + +1 + + + +202->275 + + +3 + + + +277 + +277 + + + +202->277 + + +4 + + + +203->239 + + +2 + + + +203->257 + + +2 + + + +203->274 + + +1 + + + +203->276 + + +3 + + + +203->277 + + +4 + + + +204->240 + + +2 + + + +204->258 + + +2 + + + +204->272 + + +1 + + + +278 + +278 + + + +204->278 + + +4 + + + +279 + +279 + + + +204->279 + + +4 + + + +205->241 + + +2 + + + +205->259 + + +2 + + + +205->273 + + +1 + + + +205->278 + + +3 + + + +280 + +280 + + + +205->280 + + +4 + + + +206->242 + + +2 + + + +206->260 + + +2 + + + +206->274 + + +1 + + + +206->279 + + +3 + + + +206->280 + + +4 + + + +207->243 + + +2 + + + +207->261 + + +2 + + + +207->275 + + +1 + + + +207->278 + + +1 + + + +281 + +281 + + + +207->281 + + +4 + + + +208->244 + + +2 + + + +208->262 + + +2 + + + +208->276 + + +1 + + + +208->279 + + +1 + + + +208->281 + + +4 + + + +209->245 + + +2 + + + +209->263 + + +2 + + + +209->277 + + +1 + + + +209->280 + + +1 + + + +209->281 + + +3 + + + +282 + +282 + + + +209->282 + + +5 + + + +210->246 + + +2 + + + +210->264 + + +2 + + + +210->272 + + +0 + + + +283 + +283 + + + +210->283 + + +4 + + + +211->247 + + +2 + + + +211->265 + + +2 + + + +211->273 + + +0 + + + +211->283 + + +3 + + + +212->248 + + +2 + + + +212->266 + + +2 + + + +212->275 + + +0 + + + +212->283 + + +1 + + + +213->249 + + +2 + + + +213->267 + + +2 + + + +213->278 + + +0 + + + +213->283 + + +1 + + + +214->250 + + +2 + + + +214->268 + + +2 + + + +214->272 + + +0 + + + +284 + +284 + + + +214->284 + + +4 + + + +215->251 + + +2 + + + +215->269 + + +2 + + + +215->274 + + +0 + + + +215->284 + + +3 + + + +216->252 + + +2 + + + +216->270 + + +2 + + + +216->276 + + +0 + + + +216->284 + + +1 + + + +217->253 + + +2 + + + +217->271 + + +2 + + + +217->279 + + +0 + + + +217->284 + + +1 + + + +285 + +285 + + + +218->285 + + +1 + + + +286 + +286 + + + +218->286 + + +3 + + + +287 + +287 + + + +218->287 + + +4 + + + +288 + +288 + + + +218->288 + + +4 + + + +219->285 + + +1 + + + +289 + +289 + + + +219->289 + + +3 + + + +290 + +290 + + + +219->290 + + +4 + + + +291 + +291 + + + +219->291 + + +4 + + + +220->286 + + +1 + + + +220->289 + + +1 + + + +292 + +292 + + + +220->292 + + +4 + + + +293 + +293 + + + +220->293 + + +4 + + + +221->287 + + +1 + + + +221->290 + + +1 + + + +221->292 + + +3 + + + +294 + +294 + + + +221->294 + + +4 + + + +222->288 + + +1 + + + +222->291 + + +1 + + + +222->293 + + +3 + + + +222->294 + + +4 + + + +223->285 + + +0 + + + +295 + +295 + + + +223->295 + + +3 + + + +296 + +296 + + + +223->296 + + +4 + + + +224->286 + + +0 + + + +224->295 + + +1 + + + +297 + +297 + + + +224->297 + + +4 + + + +225->287 + + +0 + + + +225->296 + + +1 + + + +225->297 + + +3 + + + +226->289 + + +0 + + + +226->295 + + +1 + + + +298 + +298 + + + +226->298 + + +4 + + + +227->290 + + +0 + + + +227->296 + + +1 + + + +227->298 + + +3 + + + +228->292 + + +0 + + + +228->297 + + +1 + + + +228->298 + + +1 + + + +229->285 + + +0 + + + +299 + +299 + + + +229->299 + + +3 + + + +300 + +300 + + + +229->300 + + +4 + + + +230->286 + + +0 + + + +230->299 + + +1 + + + +301 + +301 + + + +230->301 + + +4 + + + +231->288 + + +0 + + + +231->300 + + +1 + + + +231->301 + + +3 + + + +232->289 + + +0 + + + +232->299 + + +1 + + + +302 + +302 + + + +232->302 + + +4 + + + +233->291 + + +0 + + + +233->300 + + +1 + + + +233->302 + + +3 + + + +234->293 + + +0 + + + +234->301 + + +1 + + + +234->302 + + +1 + + + +235->295 + + +0 + + + +235->299 + + +0 + + + +236->285 + + +2 + + + +303 + +303 + + + +236->303 + + +3 + + + +304 + +304 + + + +236->304 + + +4 + + + +305 + +305 + + + +236->305 + + +4 + + + +237->286 + + +2 + + + +237->303 + + +1 + + + +306 + +306 + + + +237->306 + + +4 + + + +307 + +307 + + + +237->307 + + +4 + + + +238->287 + + +2 + + + +238->304 + + +1 + + + +238->306 + + +3 + + + +308 + +308 + + + +238->308 + + +4 + + + +239->288 + + +2 + + + +239->305 + + +1 + + + +239->307 + + +3 + + + +239->308 + + +4 + + + +240->289 + + +2 + + + +240->303 + + +1 + + + +309 + +309 + + + +240->309 + + +4 + + + +310 + +310 + + + +240->310 + + +4 + + + +241->290 + + +2 + + + +241->304 + + +1 + + + +241->309 + + +3 + + + +311 + +311 + + + +241->311 + + +4 + + + +242->291 + + +2 + + + +242->305 + + +1 + + + +242->310 + + +3 + + + +242->311 + + +4 + + + +243->292 + + +2 + + + +243->306 + + +1 + + + +243->309 + + +1 + + + +312 + +312 + + + +243->312 + + +4 + + + +244->293 + + +2 + + + +244->307 + + +1 + + + +244->310 + + +1 + + + +244->312 + + +4 + + + +245->294 + + +2 + + + +245->308 + + +1 + + + +245->311 + + +1 + + + +245->312 + + +3 + + + +313 + +313 + + + +245->313 + + +5 + + + +246->295 + + +2 + + + +246->303 + + +0 + + + +314 + +314 + + + +246->314 + + +4 + + + +247->296 + + +2 + + + +247->304 + + +0 + + + +247->314 + + +3 + + + +248->297 + + +2 + + + +248->306 + + +0 + + + +248->314 + + +1 + + + +249->298 + + +2 + + + +249->309 + + +0 + + + +249->314 + + +1 + + + +250->299 + + +2 + + + +250->303 + + +0 + + + +315 + +315 + + + +250->315 + + +4 + + + +251->300 + + +2 + + + +251->305 + + +0 + + + +251->315 + + +3 + + + +252->301 + + +2 + + + +252->307 + + +0 + + + +252->315 + + +1 + + + +253->302 + + +2 + + + +253->310 + + +0 + + + +253->315 + + +1 + + + +254->285 + + +2 + + + +316 + +316 + + + +254->316 + + +3 + + + +317 + +317 + + + +254->317 + + +4 + + + +318 + +318 + + + +254->318 + + +4 + + + +255->286 + + +2 + + + +255->316 + + +1 + + + +319 + +319 + + + +255->319 + + +4 + + + +320 + +320 + + + +255->320 + + +4 + + + +256->287 + + +2 + + + +256->317 + + +1 + + + +256->319 + + +3 + + + +321 + +321 + + + +256->321 + + +4 + + + +257->288 + + +2 + + + +257->318 + + +1 + + + +257->320 + + +3 + + + +257->321 + + +4 + + + +258->289 + + +2 + + + +258->316 + + +1 + + + +322 + +322 + + + +258->322 + + +4 + + + +323 + +323 + + + +258->323 + + +4 + + + +259->290 + + +2 + + + +259->317 + + +1 + + + +259->322 + + +3 + + + +324 + +324 + + + +259->324 + + +4 + + + +260->291 + + +2 + + + +260->318 + + +1 + + + +260->323 + + +3 + + + +260->324 + + +4 + + + +261->292 + + +2 + + + +261->319 + + +1 + + + +261->322 + + +1 + + + +325 + +325 + + + +261->325 + + +4 + + + +262->293 + + +2 + + + +262->320 + + +1 + + + +262->323 + + +1 + + + +262->325 + + +4 + + + +263->294 + + +2 + + + +263->321 + + +1 + + + +263->324 + + +1 + + + +263->325 + + +3 + + + +326 + +326 + + + +263->326 + + +5 + + + +264->295 + + +2 + + + +264->316 + + +0 + + + +327 + +327 + + + +264->327 + + +4 + + + +265->296 + + +2 + + + +265->317 + + +0 + + + +265->327 + + +3 + + + +266->297 + + +2 + + + +266->319 + + +0 + + + +266->327 + + +1 + + + +267->298 + + +2 + + + +267->322 + + +0 + + + +267->327 + + +1 + + + +268->299 + + +2 + + + +268->316 + + +0 + + + +328 + +328 + + + +268->328 + + +4 + + + +269->300 + + +2 + + + +269->318 + + +0 + + + +269->328 + + +3 + + + +270->301 + + +2 + + + +270->320 + + +0 + + + +270->328 + + +1 + + + +271->302 + + +2 + + + +271->323 + + +0 + + + +271->328 + + +1 + + + +272->303 + + +2 + + + +272->316 + + +2 + + + +329 + +329 + + + +272->329 + + +4 + + + +330 + +330 + + + +272->330 + + +4 + + + +273->304 + + +2 + + + +273->317 + + +2 + + + +273->329 + + +3 + + + +331 + +331 + + + +273->331 + + +4 + + + +274->305 + + +2 + + + +274->318 + + +2 + + + +274->330 + + +3 + + + +274->331 + + +4 + + + +275->306 + + +2 + + + +275->319 + + +2 + + + +275->329 + + +1 + + + +332 + +332 + + + +275->332 + + +4 + + + +276->307 + + +2 + + + +276->320 + + +2 + + + +276->330 + + +1 + + + +276->332 + + +4 + + + +277->308 + + +2 + + + +277->321 + + +2 + + + +277->331 + + +1 + + + +277->332 + + +3 + + + +333 + +333 + + + +277->333 + + +5 + + + +278->309 + + +2 + + + +278->322 + + +2 + + + +278->329 + + +1 + + + +334 + +334 + + + +278->334 + + +4 + + + +279->310 + + +2 + + + +279->323 + + +2 + + + +279->330 + + +1 + + + +279->334 + + +4 + + + +280->311 + + +2 + + + +280->324 + + +2 + + + +280->331 + + +1 + + + +280->334 + + +3 + + + +335 + +335 + + + +280->335 + + +5 + + + +281->312 + + +2 + + + +281->325 + + +2 + + + +281->332 + + +1 + + + +281->334 + + +1 + + + +336 + +336 + + + +281->336 + + +5 + + + +282->313 + + +2 + + + +282->326 + + +2 + + + +282->333 + + +1 + + + +282->335 + + +1 + + + +282->336 + + +3 + + + +283->314 + + +2 + + + +283->327 + + +2 + + + +283->329 + + +0 + + + +284->315 + + +2 + + + +284->328 + + +2 + + + +284->330 + + +0 + + + +337 + +337 + + + +285->337 + + +3 + + + +338 + +338 + + + +285->338 + + +4 + + + +339 + +339 + + + +285->339 + + +4 + + + +286->337 + + +1 + + + +340 + +340 + + + +286->340 + + +4 + + + +341 + +341 + + + +286->341 + + +4 + + + +287->338 + + +1 + + + +287->340 + + +3 + + + +342 + +342 + + + +287->342 + + +4 + + + +288->339 + + +1 + + + +288->341 + + +3 + + + +288->342 + + +4 + + + +289->337 + + +1 + + + +343 + +343 + + + +289->343 + + +4 + + + +344 + +344 + + + +289->344 + + +4 + + + +290->338 + + +1 + + + +290->343 + + +3 + + + +345 + +345 + + + +290->345 + + +4 + + + +291->339 + + +1 + + + +291->344 + + +3 + + + +291->345 + + +4 + + + +292->340 + + +1 + + + +292->343 + + +1 + + + +346 + +346 + + + +292->346 + + +4 + + + +293->341 + + +1 + + + +293->344 + + +1 + + + +293->346 + + +4 + + + +294->342 + + +1 + + + +294->345 + + +1 + + + +294->346 + + +3 + + + +347 + +347 + + + +294->347 + + +5 + + + +295->337 + + +0 + + + +348 + +348 + + + +295->348 + + +4 + + + +296->338 + + +0 + + + +296->348 + + +3 + + + +297->340 + + +0 + + + +297->348 + + +1 + + + +298->343 + + +0 + + + +298->348 + + +1 + + + +299->337 + + +0 + + + +349 + +349 + + + +299->349 + + +4 + + + +300->339 + + +0 + + + +300->349 + + +3 + + + +301->341 + + +0 + + + +301->349 + + +1 + + + +302->344 + + +0 + + + +302->349 + + +1 + + + +303->337 + + +2 + + + +350 + +350 + + + +303->350 + + +4 + + + +351 + +351 + + + +303->351 + + +4 + + + +304->338 + + +2 + + + +304->350 + + +3 + + + +352 + +352 + + + +304->352 + + +4 + + + +305->339 + + +2 + + + +305->351 + + +3 + + + +305->352 + + +4 + + + +306->340 + + +2 + + + +306->350 + + +1 + + + +353 + +353 + + + +306->353 + + +4 + + + +307->341 + + +2 + + + +307->351 + + +1 + + + +307->353 + + +4 + + + +308->342 + + +2 + + + +308->352 + + +1 + + + +308->353 + + +3 + + + +354 + +354 + + + +308->354 + + +5 + + + +309->343 + + +2 + + + +309->350 + + +1 + + + +355 + +355 + + + +309->355 + + +4 + + + +310->344 + + +2 + + + +310->351 + + +1 + + + +310->355 + + +4 + + + +311->345 + + +2 + + + +311->352 + + +1 + + + +311->355 + + +3 + + + +356 + +356 + + + +311->356 + + +5 + + + +312->346 + + +2 + + + +312->353 + + +1 + + + +312->355 + + +1 + + + +357 + +357 + + + +312->357 + + +5 + + + +313->347 + + +2 + + + +313->354 + + +1 + + + +313->356 + + +1 + + + +313->357 + + +3 + + + +314->348 + + +2 + + + +314->350 + + +0 + + + +315->349 + + +2 + + + +315->351 + + +0 + + + +316->337 + + +2 + + + +358 + +358 + + + +316->358 + + +4 + + + +359 + +359 + + + +316->359 + + +4 + + + +317->338 + + +2 + + + +317->358 + + +3 + + + +360 + +360 + + + +317->360 + + +4 + + + +318->339 + + +2 + + + +318->359 + + +3 + + + +318->360 + + +4 + + + +319->340 + + +2 + + + +319->358 + + +1 + + + +361 + +361 + + + +319->361 + + +4 + + + +320->341 + + +2 + + + +320->359 + + +1 + + + +320->361 + + +4 + + + +321->342 + + +2 + + + +321->360 + + +1 + + + +321->361 + + +3 + + + +362 + +362 + + + +321->362 + + +5 + + + +322->343 + + +2 + + + +322->358 + + +1 + + + +363 + +363 + + + +322->363 + + +4 + + + +323->344 + + +2 + + + +323->359 + + +1 + + + +323->363 + + +4 + + + +324->345 + + +2 + + + +324->360 + + +1 + + + +324->363 + + +3 + + + +364 + +364 + + + +324->364 + + +5 + + + +325->346 + + +2 + + + +325->361 + + +1 + + + +325->363 + + +1 + + + +365 + +365 + + + +325->365 + + +5 + + + +326->347 + + +2 + + + +326->362 + + +1 + + + +326->364 + + +1 + + + +326->365 + + +3 + + + +327->348 + + +2 + + + +327->358 + + +0 + + + +328->349 + + +2 + + + +328->359 + + +0 + + + +329->350 + + +2 + + + +329->358 + + +2 + + + +366 + +366 + + + +329->366 + + +4 + + + +330->351 + + +2 + + + +330->359 + + +2 + + + +330->366 + + +4 + + + +331->352 + + +2 + + + +331->360 + + +2 + + + +331->366 + + +3 + + + +367 + +367 + + + +331->367 + + +5 + + + +332->353 + + +2 + + + +332->361 + + +2 + + + +332->366 + + +1 + + + +368 + +368 + + + +332->368 + + +5 + + + +333->354 + + +2 + + + +333->362 + + +2 + + + +333->367 + + +1 + + + +333->368 + + +3 + + + +334->355 + + +2 + + + +334->363 + + +2 + + + +334->366 + + +1 + + + +369 + +369 + + + +334->369 + + +5 + + + +335->356 + + +2 + + + +335->364 + + +2 + + + +335->367 + + +1 + + + +335->369 + + +3 + + + +336->357 + + +2 + + + +336->365 + + +2 + + + +336->368 + + +1 + + + +336->369 + + +1 + + + +370 + +370 + + + +337->370 + + +4 + + + +371 + +371 + + + +337->371 + + +4 + + + +338->370 + + +3 + + + +372 + +372 + + + +338->372 + + +4 + + + +339->371 + + +3 + + + +339->372 + + +4 + + + +340->370 + + +1 + + + +373 + +373 + + + +340->373 + + +4 + + + +341->371 + + +1 + + + +341->373 + + +4 + + + +342->372 + + +1 + + + +342->373 + + +3 + + + +374 + +374 + + + +342->374 + + +5 + + + +343->370 + + +1 + + + +375 + +375 + + + +343->375 + + +4 + + + +344->371 + + +1 + + + +344->375 + + +4 + + + +345->372 + + +1 + + + +345->375 + + +3 + + + +376 + +376 + + + +345->376 + + +5 + + + +346->373 + + +1 + + + +346->375 + + +1 + + + +377 + +377 + + + +346->377 + + +5 + + + +347->374 + + +1 + + + +347->376 + + +1 + + + +347->377 + + +3 + + + +348->370 + + +0 + + + +349->371 + + +0 + + + +350->370 + + +2 + + + +378 + +378 + + + +350->378 + + +4 + + + +351->371 + + +2 + + + +351->378 + + +4 + + + +352->372 + + +2 + + + +352->378 + + +3 + + + +379 + +379 + + + +352->379 + + +5 + + + +353->373 + + +2 + + + +353->378 + + +1 + + + +380 + +380 + + + +353->380 + + +5 + + + +354->374 + + +2 + + + +354->379 + + +1 + + + +354->380 + + +3 + + + +355->375 + + +2 + + + +355->378 + + +1 + + + +381 + +381 + + + +355->381 + + +5 + + + +356->376 + + +2 + + + +356->379 + + +1 + + + +356->381 + + +3 + + + +357->377 + + +2 + + + +357->380 + + +1 + + + +357->381 + + +1 + + + +358->370 + + +2 + + + +382 + +382 + + + +358->382 + + +4 + + + +359->371 + + +2 + + + +359->382 + + +4 + + + +360->372 + + +2 + + + +360->382 + + +3 + + + +383 + +383 + + + +360->383 + + +5 + + + +361->373 + + +2 + + + +361->382 + + +1 + + + +384 + +384 + + + +361->384 + + +5 + + + +362->374 + + +2 + + + +362->383 + + +1 + + + +362->384 + + +3 + + + +363->375 + + +2 + + + +363->382 + + +1 + + + +385 + +385 + + + +363->385 + + +5 + + + +364->376 + + +2 + + + +364->383 + + +1 + + + +364->385 + + +3 + + + +365->377 + + +2 + + + +365->384 + + +1 + + + +365->385 + + +1 + + + +366->378 + + +2 + + + +366->382 + + +2 + + + +386 + +386 + + + +366->386 + + +5 + + + +367->379 + + +2 + + + +367->383 + + +2 + + + +367->386 + + +3 + + + +368->380 + + +2 + + + +368->384 + + +2 + + + +368->386 + + +1 + + + +369->381 + + +2 + + + +369->385 + + +2 + + + +369->386 + + +1 + + + +387 + +387 + + + +370->387 + + +4 + + + +371->387 + + +4 + + + +372->387 + + +3 + + + +388 + +388 + + + +372->388 + + +5 + + + +373->387 + + +1 + + + +389 + +389 + + + +373->389 + + +5 + + + +374->388 + + +1 + + + +374->389 + + +3 + + + +375->387 + + +1 + + + +390 + +390 + + + +375->390 + + +5 + + + +376->388 + + +1 + + + +376->390 + + +3 + + + +377->389 + + +1 + + + +377->390 + + +1 + + + +378->387 + + +2 + + + +391 + +391 + + + +378->391 + + +5 + + + +379->388 + + +2 + + + +379->391 + + +3 + + + +380->389 + + +2 + + + +380->391 + + +1 + + + +381->390 + + +2 + + + +381->391 + + +1 + + + +382->387 + + +2 + + + +392 + +392 + + + +382->392 + + +5 + + + +383->388 + + +2 + + + +383->392 + + +3 + + + +384->389 + + +2 + + + +384->392 + + +1 + + + +385->390 + + +2 + + + +385->392 + + +1 + + + +386->391 + + +2 + + + +386->392 + + +2 + + + +393 + +393 + + + +387->393 + + +5 + + + +388->393 + + +3 + + + +389->393 + + +1 + + + +390->393 + + +1 + + + +391->393 + + +2 + + + +392->393 + + +2 diff --git a/build/ag_gen b/build/ag_gen index 700b988..58421b6 100755 Binary files a/build/ag_gen and b/build/ag_gen differ diff --git a/build/run.sh b/build/run.sh index 9309ae8..02a7c0c 100755 --- a/build/run.sh +++ b/build/run.sh @@ -57,9 +57,9 @@ if [ "$TYPE" == "$strval1" ]; then if [ "$(dnsdomainname)" = "hammer.esg.utulsa.edu" ]; then - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/6_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" + mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/6_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -s -l 20 else - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" + mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -s -l 20 -a 0.6 -g DOTFILE.dot -z "$DBNAME" fi # 4 Exploit #mpiexec -np "$NODES" --bind-to numa --map-by numa ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t 1 -q 1 -p -a 0.6 -z "$DBNAME" @@ -77,6 +77,9 @@ else fi +#Graphviz Strict graphing to avoid duplicate nodes and edges +#echo -n 'strict ' | cat - DOTFILE.dot > temp && mv temp DOTFILE.dot + #dot -Tsvg new.dot > ag.svg #dot -Tsvg DOTFILE.dot > ag.svg diff --git a/src/ag_gen/ag_gen.cpp b/src/ag_gen/ag_gen.cpp index 5f4bcab..60be57c 100755 --- a/src/ag_gen/ag_gen.cpp +++ b/src/ag_gen/ag_gen.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "ag_gen.h" @@ -29,6 +31,7 @@ #include #include #include +#include #include #include @@ -389,7 +392,7 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, //Create Communicators //Note, these each return 2 handles! - mpi::communicator tcomm = world.split(world.rank() > 0 && world.rank() <= alloc); + mpi::communicator tcomm = world.split(world.rank() > 0 && world.rank() <= alloc); mpi::communicator ttwo_comm; if(world.size() == 2){ ttwo_comm = world.split(world.rank() == send_check(world, alloc) && world.rank() <= (2*two_alloc)); @@ -595,6 +598,9 @@ AGGenInstance &AGGen::generate(bool batch_process, int batch_size, int numThrd, struct timeval t41,t42; gettimeofday(&t41,NULL); save_ag_to_db(instance, true); + std::vector().swap(instance.factbases); + std::vector().swap(instance.factbase_items); + std::vector().swap(instance.edges); gettimeofday(&t42,NULL); total_task4+=(t42.tv_sec-t41.tv_sec)*1000.0+(t42.tv_usec-t41.tv_usec)/1000.0; } @@ -1168,3 +1174,517 @@ AGGenInstance &AGGen::single_generate(bool batch_process, int batch_num, int num return instance; } + +AGGenInstance &AGGen::sg_generate(bool batch_process, int batch_num, int numThrd,\ + int initQSize, double mem_threshold, mpi::communicator &world, int state_limit){ + //Init all Nodes with these variables + std::vector exploit_list = instance.exploits; + + //Create a vector that contains all the groups of exploits to be fired synchonously + std::vector ex_groups; + for (const auto &ex : exploit_list) { + //If the group isn't already in the vector + if(!(std::find(ex_groups.begin(), ex_groups.end(), ex.get_group()) !=ex_groups.end())) { + //Don't include the "no" group + if(ex.get_group()!="null") + ex_groups.emplace_back(ex.get_group()); + } + + } + + //Print out the groups if desired + if (world.rank() == 0){ + std::cout <<"\nThere are "<> od_map; + size_t assets_size = instance.assets.size(); + for (const auto &ex : exploit_list) { + size_t num_params = ex.get_num_params(); + if (od_map.find(num_params) == od_map.end()) { + Odometer od(num_params, assets_size); + od_map[num_params] = od.get_all(); + } + } + + int frt_size=frontier.size(); + if (world.rank() ==0){ + printf("The actual QSize to start using multiple threads is %d\n",frt_size); + } + + double total_t=0.0; + //unit:ms + double total_task0, total_task1, total_task2, total_task3, total_task4 = 0.0; + + struct timeval t1,t2; + gettimeofday(&t1,NULL); + + std::deque localFrontier; + if(world.rank() == 0){ + double f_alpha = 0.0; + auto tot_sys_mem = getTotalSystemMemory(); + localFrontier.emplace_front(frontier[0]); + } + + int finished_signal = 0; + int send_msg = 0; + int state_count = 0; + + std::random_device rd; // obtain a random number from hardware + std::mt19937 gen(rd()); // seed the generator + + //Make separate comm to not sync with db node + mpi::communicator work_comm = world.split(world.rank() != 1); + + //std::unordered_set localFrontier_seen; + + //Send new Network State to all worker nodes, if we have enough unex states to do so + if(world.rank() == 0){ + //2 offset for root node and db node + for (int w = 0; w < std::min((int)world.size()-2, (int)localFrontier.size()); w++){ + mpi::request state_req = world.isend(w+2, 1, localFrontier.front()); + localFrontier.pop_front(); + state_req.wait(); + } + } + + //Main Work Loop + while((!localFrontier.empty() && !finished_signal) || world.rank() > 0){ + //Refill localFrontier if needed + if(localFrontier.empty() && world.rank() == 0) { + task_zero(instance, localFrontier, mem_threshold); + } + + //Don't sync with db node + work_comm.barrier(); + + if (world.rank() > 1){ + //Check for finished signal + if(world.iprobe(0, 99)){ + break; + } + + if (world.iprobe(0, 1)){ + NetworkState current_state; + world.recv(0, 1, current_state); + state_count = 0; + send_msg = 1; + while(!localFrontier.empty()){ + if (state_count < state_limit){ + //Do work + //Force set NS id to hash + + auto current_state = localFrontier.front(); + auto current_hash = current_state.get_hash(instance.facts); + localFrontier.pop_front(); + std::vector> appl_exploits; + for (size_t i = 0; i < esize; i++) {//for loop for applicable exploits starts + auto e = exploit_list.at(i); + size_t num_params = e.get_num_params(); + auto preconds_q = e.precond_list_q(); + auto preconds_t = e.precond_list_t(); + auto perms = od_map[num_params]; + std::vector asset_groups; + for (auto perm : perms) { + std::vector asset_group_quals; + std::vector asset_group_topos; + asset_group_quals.reserve(preconds_q.size()); + asset_group_topos.reserve(preconds_t.size()); + + + //std::vector::size_type sz; + //sz=asset_group_quals.capacity(); + for (auto &precond : preconds_q) { + + //Old quality encode caused this to crash + asset_group_quals.emplace_back( + perm[precond.get_param_num()], precond.name, precond.op, + precond.value, instance.facts); + } + for (auto &precond : preconds_t) { + auto dir = precond.get_dir(); + auto prop = precond.get_property(); + auto op = precond.get_operation(); + auto val = precond.get_value(); + asset_group_topos.emplace_back( + perm[precond.get_from_param()], + perm[precond.get_to_param()], dir, prop, op, val, instance.facts); + } + asset_groups.emplace_back(asset_group_quals, asset_group_topos, + perm); + } + auto assetgroup_size = asset_groups.size(); + for (size_t j = 0; j < assetgroup_size; j++) { + auto asset_group = asset_groups.at(j); + for (auto &quality : asset_group.get_hypo_quals()) { + if (!current_state.get_factbase().find_quality(quality)) { + goto LOOPCONTINUE1; + } + } + for (auto &topology : asset_group.get_hypo_topos()) { + if (!current_state.get_factbase().find_topology(topology)) { + goto LOOPCONTINUE1; + } + } + { + auto new_appl_exploit = std::make_tuple(e, asset_group); + appl_exploits.push_back(new_appl_exploit); + } + LOOPCONTINUE1:; + } + } //for loop for creating applicable exploits ends + + std::map group_fired; //Map to hold fired status per group + std::map>> sync_vectors; //Map to hold all group exploits + + for (auto map_group : ex_groups) + { + group_fired.insert(std::pair (map_group, 0)); + } + + //Build up the map of synchronous fire exploits + for(auto itr=appl_exploits.begin(); itr!=appl_exploits.end(); itr++){ + //auto e = appl_exploits.at(itr); + auto e = *itr; + auto egroup = std::get<0>(e).get_group(); + + if (egroup != "null"){ + sync_vectors[egroup].push_back(e); + } + } + + //loop through the vector + for(auto itr=appl_exploits.begin(); itr!=appl_exploits.end(); itr++){ + + auto e = *itr; + auto exploit = std::get<0>(e); + auto assetGroup = std::get<1>(e); + //std::cout<> sync_exploits; + + if (egroup == "null") + sync_exploits.push_back(e); + + else { + sync_exploits = sync_vectors[egroup]; + + //TODO: Does not work if only some assets belong to a group. This only works if + //all assets are in the group + if(sync_exploits.size() < instance.assets.size()){ + break; + } + } + + for(auto sync_itr=sync_exploits.begin(); sync_itr!=sync_exploits.end(); sync_itr++){ + e = *sync_itr; + exploit = std::get<0>(e); + egroup=exploit.get_group(); + assetGroup = std::get<1>(e); + group_fired[egroup] = 1; + + auto postconditions = createPostConditions(e, instance.facts); + auto qualities = std::get<0>(postconditions); + auto topologies = std::get<1>(postconditions); + + for(auto &qual : qualities) { + auto action = std::get<0>(qual); + auto fact = std::get<1>(qual); + switch(action) { + case ADD_T: + new_state.add_quality(fact); + break; + case UPDATE_T: + new_state.update_quality(fact); + + //TODO: if fact!= "="" call new_state function, passing fact and instance.facts. Update the quality, and insert it into the hash_table instead of this convoluted mess + if(fact.get_op()=="+="){ + + //std::cout<<" AFTER UPDATE "<::const_iterator got = instance.facts.hash_table.find(new_state.compound_assign(fact)); + + //If the value is not already in the hash_table, insert it. + //Since the compound operators include a value that is not in the original Keyvalue object, the unordered map does not include it + //As a result, you have to manually add it. + if(got==instance.facts.hash_table.end()){ + instance.facts.hash_table[new_state.compound_assign(fact)]=instance.facts.size(); + instance.facts.length++; + instance.facts.str_vector.push_back(new_state.compound_assign(fact)); + + //Update ALL nodes (include ttwo_comm nodes) with new data + for (int w = 0; w < world.size(); w++) + { + if(w != world.rank() && w != 1) + { + mpi::request ns_req = world.isend(w, 5, new_state); + mpi::request fact_req = world.isend(w, 6, fact); + ns_req.wait(); + fact_req.wait(); + } + } + } + } + break; + case DELETE_T: + new_state.delete_quality(fact); + break; + } + } + + for(auto &topo : topologies) { + auto action = std::get<0>(topo); + auto fact = std::get<1>(topo); + switch(action) { + case ADD_T: + new_state.add_topology(fact); + break; + case UPDATE_T: + new_state.update_topology(fact); + break; + case DELETE_T: + new_state.delete_topology(fact); + break; + } + } + }//Sync. Fire for + + auto hash_num = new_state.get_hash(instance.facts); + + if (hash_num == current_hash) + continue; + + #pragma omp critical + //although local frontier is updated, the global hash is also updated to avoid testing on explored states. + if (hash_map.find(hash_num) == hash_map.end()) { + new_state.force_set_id(hash_num); + instance.factbases.push_back(new_state.get_factbase()); + hash_map.insert(std::make_pair(new_state.get_hash(instance.facts), new_state.get_id())); + + localFrontier.emplace_front(new_state); + + Edge ed(current_state.get_hash(instance.facts), new_state.get_id(), exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } //END if (hash_map.find(hash_num) == hash_map.end()) + + else { + auto id = hash_map[hash_num]; + Edge ed(current_state.get_id(), id, exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } + } //sync fire if + else + break; + } //for loop for new states ends + + } + else + break; + } + } + //Let root node we finished, but only if we have done work since our last message + if(send_msg == 1){ + world.isend(0, 2, 1); + send_msg = 0; + if(localFrontier.size() > 0){ + world.isend(0, 3, localFrontier); + } + //Send new states and edges, then clear worker instance + world.isend(0, 10, instance.factbases); + world.isend(0, 11, instance.edges); + std::vector().swap(instance.factbases); + std::vector().swap(instance.factbase_items); + std::vector().swap(instance.edges); + } + + //Check for new fact and new state that caused an update in the hash table and facts + while(world.iprobe(mpi::any_source, 5) || world.iprobe(mpi::any_source, 6)){ + NetworkState update_state; + Quality update_fact; + + world.recv(mpi::any_source, 5, update_state); + world.recv(mpi::any_source, 6, update_fact); + //Update + instance.facts.hash_table[update_state.compound_assign(update_fact)]=instance.facts.size(); + instance.facts.length++; + instance.facts.str_vector.push_back(update_state.compound_assign(update_fact)); + } + } //end worker nodes + + else if (world.rank() == 1){ + //Check for finished signal, assuming we have no more storage requests + if(world.iprobe(0, 99) && !world.iprobe(0,7) && !world.iprobe(0,8)){ + break; + } + + //Check for instance storage requests + if(world.iprobe(0, 7) || world.iprobe(0, 8)){ + std::vector factbases_dump; + std::vector edges_dump; + world.recv(0, 7, factbases_dump); + world.recv(0, 8, edges_dump); + + instance.factbases = factbases_dump; + instance.edges = edges_dump; + save_ag_to_db(instance, true); + + //Clear vectors and free memory + std::vector().swap(instance.factbases); + std::vector().swap(instance.factbase_items); + std::vector().swap(instance.edges); + } + + //Check for frontier storage requests + while(world.iprobe(0, 50)){ + NetworkState save_state; + world.recv(0, 50, save_state); + save_unexplored_to_db(save_state); + } + + } //end world rank =1 + + //World Rank = 0 + else{ + std::map deque_marker; + int finish_count = 0; + + //Receive states and edges when nodes finish + while(finish_count != world.size() -2){ + while(world.iprobe(mpi::any_source, 10) || world.iprobe(mpi::any_source, 11)) { + std::vector node_factbases; + std::vector node_edges; + + world.recv(mpi::any_source, 10, node_factbases); + world.recv(mpi::any_source, 11, node_edges); + state_merge(node_factbases, node_edges, hash_map, instance, mem_threshold, world); + } + + //Nodes finish + for(int w = 2; w < world.size(); w++){ + int dummy_finish = 0; + if(world.iprobe(w, 2)){ + world.recv(w, 2, dummy_finish); + finish_count++; + } + } + + //Check for new fact and new state that caused an update in the hash table and facts + while(world.iprobe(mpi::any_source, 5) || world.iprobe(mpi::any_source, 6)){ + NetworkState update_state; + Quality update_fact; + + world.recv(mpi::any_source, 5, update_state); + world.recv(mpi::any_source, 6, update_fact); + //Update + instance.facts.hash_table[update_state.compound_assign(update_fact)]=instance.facts.size(); + instance.facts.length++; + instance.facts.str_vector.push_back(update_state.compound_assign(update_fact)); + } + /* + //Rather than just busy-wait for the remainder of the time, remove duplicates from localFrontier + for(auto itr = localFrontier.begin(); itr != localFrontier.end();){ + auto ret = localFrontier_seen.insert(*itr); + if(!ret.second){ + itr = localFrontier.erase(itr); + } + else + itr++; + } + */ + } + + if(localFrontier.empty() && finish_count == world.size() -2){ + finished_signal = 1; + } + + //Receive node frontiers and merge them into root frontier + for(int w = 2; w < world.size(); w++){ + if(world.iprobe(w, 3)){ + std::deque nodeFrontier; + world.recv(w, 3, nodeFrontier); + localFrontier.insert(localFrontier.begin(), \ + std::make_move_iterator(nodeFrontier.begin()),\ + std::make_move_iterator(nodeFrontier.end())); + deque_marker[w] = (int)(localFrontier.size()-1); + } + //If a node doesn't have a specific state to pull, randomly assign it one + if (!deque_marker.count(w)){ + //Randomly assign a state index to pop + std::uniform_int_distribution<> distr(0, localFrontier.size()-1); // define the range + deque_marker[w] = distr(gen); + } + } + + //Send new Network State to all worker nodes, if we have enough unex states to do so + //2 offset for root node and db node + for (int w = 0; w < world.size()-2; w++){ + int proceed = 0; + while(!proceed){ + if(localFrontier.size() > 0){ + if(deque_marker[w+2] > localFrontier.size()) + deque_marker[w+2]--; + //auto deque_access = localFrontier.begin() + deque_marker[w+2]; + auto deque_access = deque_marker[w+2]; + + NetworkState send_state = localFrontier.at(deque_access); + + //Don't explore on states we already have explored + if(hash_map.find(send_state.get_id()) != hash_map.end()){ + localFrontier.erase(localFrontier.begin()+deque_access); + deque_marker[w+2]--; + } + + if(proceed){ + mpi::request state_req = world.isend(w+2, 1, send_state); + localFrontier.erase(localFrontier.begin()+deque_access); + state_req.wait(); + } + } + } + } + } //end world rank 0 + } // end main work loop + + //Tell all nodes to finish + if(world.rank() == 0){ + for(int w = 1; w < world.size(); w++){ + world.send(w, 99, 1); + } + } + + world.barrier(); + if(world.rank() == 0){ + gettimeofday(&t2,NULL); + total_t+=(t2.tv_sec-t1.tv_sec)*1000.0+(t2.tv_usec-t1.tv_usec)/1000.0; + printf("AG TOOK %lf ms.\n", total_t); + + auto end = std::chrono::system_clock::now(); + + std::chrono::duration elapsed_seconds = end - start; + instance.elapsed_seconds = elapsed_seconds; + } + + return instance; +} \ No newline at end of file diff --git a/src/ag_gen/ag_gen.h b/src/ag_gen/ag_gen.h index 6b6633c..e8d2f86 100755 --- a/src/ag_gen/ag_gen.h +++ b/src/ag_gen/ag_gen.h @@ -88,6 +88,9 @@ class AGGen { AGGen(AGGenInstance &_instance, RedisManager &_rman); #endif + AGGenInstance &sg_generate(bool batch_process, int batch_num, int numThrd,\ + int initQSize, double mem_threshold, boost::mpi::communicator &world, int state_limit); + AGGenInstance &generate(bool batch_process, int batch_num, int numThrd,\ int initQSize, double mem_threshold, boost::mpi::communicator &world); diff --git a/src/ag_gen/edge.cpp b/src/ag_gen/edge.cpp index 8e916e0..012e5e6 100755 --- a/src/ag_gen/edge.cpp +++ b/src/ag_gen/edge.cpp @@ -17,13 +17,17 @@ * @param ex Exploit associated with the Edge * @param ag AssetGroup associated with the Edge */ -Edge::Edge(int iFrom, int iTo, Exploit &ex, AssetGroup &ag) +//Edge::Edge(int iFrom, int iTo, Exploit &ex, AssetGroup &ag) +// : from_node(iFrom), to_node(iTo), exploit(ex), assetGroup(ag), deleted(false) {} + +Edge::Edge(size_t iFrom, size_t iTo, Exploit &ex, AssetGroup &ag) : from_node(iFrom), to_node(iTo), exploit(ex), assetGroup(ag), deleted(false) {} Edge::Edge() { } + /** * @return The Edge ID */ @@ -33,18 +37,28 @@ void Edge::set_deleted() { deleted = true; } bool Edge::is_deleted() { return deleted; } -int Edge::get_from_id() +//int Edge::get_from_id() +//{ + + //return from_node; + +//} + +size_t Edge::get_from_id() { - return from_node; - } -int Edge::get_to_id() +//int Edge::get_to_id() +//{ + +// return to_node; + +//} + +size_t Edge::get_to_id() { - return to_node; - } int Edge::get_exploit_id() diff --git a/src/ag_gen/edge.h b/src/ag_gen/edge.h index a6575a2..7f090fa 100755 --- a/src/ag_gen/edge.h +++ b/src/ag_gen/edge.h @@ -21,8 +21,9 @@ /** Edge class - * @brief Edge of the graph. + * @brief Edge of the graph based on integer id. */ +/* class Edge { static int edge_current_id; int id; @@ -55,5 +56,40 @@ class Edge { void set_deleted(); bool is_deleted(); }; +*/ + +// Edge class based on hash +class Edge { + static int edge_current_id; + int id; + size_t from_node; + size_t to_node; + Exploit exploit; + AssetGroup assetGroup; + bool deleted; + + friend std::ostream & operator << (std::ostream &os, const Edge &ed); + friend class boost::serialization::access; + + template + void serialize(Archive &ar, const unsigned int version){ + ar & edge_current_id & id & from_node & to_node & exploit & assetGroup & deleted; + } + + public: + Edge(size_t, size_t, Exploit &, AssetGroup &); + Edge(); + + std::string get_query(); + std::string get_asset_query(); + + int get_id(); + int set_id(); + size_t get_from_id(); + size_t get_to_id(); + int get_exploit_id(); + void set_deleted(); + bool is_deleted(); +}; #endif // AG_GEN_EDGE_H diff --git a/src/ag_gen/factbase.cpp b/src/ag_gen/factbase.cpp index a999556..4d9864f 100755 --- a/src/ag_gen/factbase.cpp +++ b/src/ag_gen/factbase.cpp @@ -42,10 +42,14 @@ void Factbase::force_set_id(int i) { id = i; } +void Factbase::force_set_id(size_t i) { + id = i; +} + /** * @return The current Factbase ID. */ -int Factbase::get_id() const { return id; } +size_t Factbase::get_id() const { return id; } std::tuple, std::vector> Factbase::get_facts_tuple() const { return std::make_tuple(qualities, topologies); diff --git a/src/ag_gen/factbase.h b/src/ag_gen/factbase.h index 1383c77..7ebd835 100755 --- a/src/ag_gen/factbase.h +++ b/src/ag_gen/factbase.h @@ -32,7 +32,7 @@ class Factbase { friend std::ostream & operator << (std::ostream &os, const Factbase &fb); friend class boost::serialization::access; - int id; + size_t id; int qsize; int tsize; @@ -73,7 +73,9 @@ class Factbase { void print() const; void set_id(); void force_set_id(int i); - int get_id() const; + void force_set_id(size_t i); + + size_t get_id() const; size_t hash(Keyvalue &factlist) const; int get_size(); }; diff --git a/src/ag_gen/network_state.cpp b/src/ag_gen/network_state.cpp index 78d1ee0..477b93e 100755 --- a/src/ag_gen/network_state.cpp +++ b/src/ag_gen/network_state.cpp @@ -42,7 +42,7 @@ void NetworkState::force_set_id(int i) { factbase.force_set_id(i); } /** * @return The ID of the NetworkState */ -int NetworkState::get_id() { return factbase.get_id(); } +size_t NetworkState::get_id() { return factbase.get_id(); } int NetworkState::get_size() { return factbase.get_size(); } @@ -179,6 +179,7 @@ void NetworkState::delete_topology(Topology &t) { } } + // int NetworkState::compare(std::string &hash, RedisManager* rman) const { // if (!rman->check_collision(hash)) { // if (!rman->check_facts(hash, factbase.qualities, factbase.topologies)) diff --git a/src/ag_gen/network_state.h b/src/ag_gen/network_state.h index e2ae30b..1d0a424 100755 --- a/src/ag_gen/network_state.h +++ b/src/ag_gen/network_state.h @@ -57,7 +57,7 @@ class NetworkState { void set_id(); void force_set_id(int i); - int get_id(); + size_t get_id(); int get_size(); void add_qualities(std::vector q); @@ -72,6 +72,8 @@ class NetworkState { void delete_quality(Quality &q); void delete_topology(Topology &t); + + //bool operator==(NetworkState& foo) {return get_id() == foo.get_id();} }; BOOST_SERIALIZATION_ASSUME_ABSTRACT(NetworkState) diff --git a/src/main.cpp b/src/main.cpp index a174b0f..9fb367a 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -444,17 +444,19 @@ int main(int argc, char *argv[]) { int thread_count; int init_qsize; int mpi_nodes; + int depth_limit; bool should_graph = false; bool no_cycles = false; bool batch_process = false; bool use_redis = false; bool use_postgres = false; + bool mpi_subgraphing = false; double alpha = 0.5; int opt; - while ((opt = getopt(argc, argv, "rb:g:dhc:n:x:t:q:pa:m:z:")) != -1) { + while ((opt = getopt(argc, argv, "rb:g:dhc:l:n:x:t:q:pa:sm:z:")) != -1) { switch (opt) { case 'g': should_graph = true; @@ -472,6 +474,9 @@ int main(int argc, char *argv[]) { case 'c': opt_config = optarg; break; + case 'l': + depth_limit = atoi(optarg); + break; case 'd': no_cycles = true; break; @@ -495,6 +500,9 @@ int main(int argc, char *argv[]) { //Save a 10% buffer for PSQL ops alpha = atof(optarg) - 0.1; break; + case 's': + mpi_subgraphing = true; + break; case 'm': mpi_nodes = atoi(optarg); break; @@ -678,7 +686,9 @@ int main(int argc, char *argv[]) { std::cout << "Generating Attack Graph: " << std::flush; AGGen gen(_instance);//use AGGen class to instantiate an obj with the name gen! _instance obj as the parameter! constructor defined in ag_gen.cpp - if (world.size() > 1) + if (mpi_subgraphing && world.size() > 3) + postinstance = gen.sg_generate(batch_process, batch_size, thread_count, init_qsize, alpha, world, depth_limit); //The method call to generate the attack graph, defined in ag_gen.cpp. + else if (world.size() > 1) postinstance = gen.generate(batch_process, batch_size, thread_count, init_qsize, alpha, world); //The method call to generate the attack graph, defined in ag_gen.cpp. else postinstance = gen.single_generate(batch_process, batch_size, thread_count, init_qsize, alpha, world); //The method call to generate the attack graph, defined in ag_gen.cpp. diff --git a/src/mpi/tasks.cpp b/src/mpi/tasks.cpp index 0c36442..c090785 100644 --- a/src/mpi/tasks.cpp +++ b/src/mpi/tasks.cpp @@ -423,8 +423,8 @@ void task_three(AGGenInstance &instance, NetworkState &new_state, std::deque node_factbases, std::vector node_edges,\ + std::unordered_map &hash_map, AGGenInstance &instance, double mem_threshold, mpi::communicator &world){ + + auto tot_sys_mem = getTotalSystemMemory(); + + for(auto fb : node_factbases){ + + //std::cout << "Started Task 3." << std::endl; + auto hash_num = fb.get_id(); + + //although local frontier is updated, the global hash is also updated to avoid testing on explored states. + if (hash_map.find(hash_num) == hash_map.end()) { + instance.factbases.push_back(fb); + hash_map.insert(std::make_pair(fb.get_id(), fb.get_id())); + + //See memory usage. If it exceeds the threshold, store new states in the DB + double i_alpha = 0.0; + //Get the most recent Factbase's size * total number of factbases, rough approximation of *2 to account for factbase_items + double i_usage = instance.factbases.back().get_size() * instance.factbases.size() * 2 + sizeof(instance.edges[0]) * instance.edges.size(); + + if (i_alpha >= mem_threshold/2){ + //std::cout << "Instance Alpha prior to database storing: " << i_alpha << std::endl; + mpi::request fb_req = world.isend(1, 7, instance.factbases); + mpi::request ed_req = world.isend(1, 8, instance.edges); + //save_ag_to_db(instance, true); + fb_req.wait(); + ed_req.wait(); + //Clear vectors and free memory + std::vector().swap(instance.factbases); + std::vector().swap(instance.factbase_items); + std::vector().swap(instance.edges); + + i_usage = (sizeof(instance.factbases) + (sizeof(instance.factbases[0]) * instance.factbases.size()) +\ + sizeof(instance.factbase_items) + (sizeof(instance.factbase_items[0]) * instance.factbase_items.size()) +\ + sizeof(instance.edges) + (sizeof(instance.edges[0]) * instance.edges.size())); + i_alpha = i_usage/tot_sys_mem; + //std::cout << "Instance Alpha after database storing: " << i_alpha << std::endl; + + } + } + } + + //This does add duplicate edges + for (auto ed : node_edges){ + instance.edges.push_back(ed); + } + +} diff --git a/src/mpi/tasks.h b/src/mpi/tasks.h index f1b0191..aae1d99 100644 --- a/src/mpi/tasks.h +++ b/src/mpi/tasks.h @@ -23,5 +23,7 @@ void task_four(NetworkState &new_state); int send_check(boost::mpi::communicator &world, int curr_node); +void state_merge(std::vector node_factbases, std::vector node_edges,\ + std::unordered_map &hash_map, AGGenInstance &instance, double mem_threshold, mpi::communicator &world); #endif //TASKS_H