From e0ddb7974e7c6e903c44d5116b51227708bcbaa0 Mon Sep 17 00:00:00 2001 From: syeffort Date: Tue, 11 Apr 2023 18:08:41 +0900 Subject: [PATCH] finite state machine --- DesignPatternGuru/DesignPatternGuru.sln | 9 ++++ .../FiniteStateMachine/Command.cs | 17 +++++++ .../FiniteStateMachine.csproj | 10 ++++ .../FiniteStateMachine/Info/StateMachine.png | Bin 0 -> 25213 bytes .../FiniteStateMachine/Process.cs | 46 ++++++++++++++++++ .../FiniteStateMachine/ProcessState.cs | 16 ++++++ .../FiniteStateMachine/Program.cs | 16 ++++++ .../FiniteStateMachine/StateTransition.cs | 31 ++++++++++++ 8 files changed, 145 insertions(+) create mode 100644 DesignPatternGuru/FiniteStateMachine/Command.cs create mode 100644 DesignPatternGuru/FiniteStateMachine/FiniteStateMachine.csproj create mode 100644 DesignPatternGuru/FiniteStateMachine/Info/StateMachine.png create mode 100644 DesignPatternGuru/FiniteStateMachine/Process.cs create mode 100644 DesignPatternGuru/FiniteStateMachine/ProcessState.cs create mode 100644 DesignPatternGuru/FiniteStateMachine/Program.cs create mode 100644 DesignPatternGuru/FiniteStateMachine/StateTransition.cs diff --git a/DesignPatternGuru/DesignPatternGuru.sln b/DesignPatternGuru/DesignPatternGuru.sln index 333a235..223202d 100644 --- a/DesignPatternGuru/DesignPatternGuru.sln +++ b/DesignPatternGuru/DesignPatternGuru.sln @@ -47,6 +47,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Observer", "Observer\Observ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "State", "State\State.csproj", "{BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UsefulSamples", "UsefulSamples", "{7D7093A3-69ED-49A5-A6E2-D5732EB68559}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiniteStateMachine", "FiniteStateMachine\FiniteStateMachine.csproj", "{51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -129,6 +133,10 @@ Global {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Debug|Any CPU.Build.0 = Debug|Any CPU {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Release|Any CPU.ActiveCfg = Release|Any CPU {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Release|Any CPU.Build.0 = Release|Any CPU + {51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -153,6 +161,7 @@ Global {A6E39678-6214-4BD2-B616-A3350340E5AB} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {EB189FAC-7C63-48BB-92D7-3C35A277EA1D} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} + {51C2F1F3-B9FC-46D6-A6BD-6636010ABCD2} = {7D7093A3-69ED-49A5-A6E2-D5732EB68559} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E5A9C6B-2E8A-466E-B5E0-4379902EFFAC} diff --git a/DesignPatternGuru/FiniteStateMachine/Command.cs b/DesignPatternGuru/FiniteStateMachine/Command.cs new file mode 100644 index 0000000..468be5d --- /dev/null +++ b/DesignPatternGuru/FiniteStateMachine/Command.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FiniteStateMachine +{ + internal enum Command + { + Begin, + End, + Paused, + Resume, + Exit, + } +} diff --git a/DesignPatternGuru/FiniteStateMachine/FiniteStateMachine.csproj b/DesignPatternGuru/FiniteStateMachine/FiniteStateMachine.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/DesignPatternGuru/FiniteStateMachine/FiniteStateMachine.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/DesignPatternGuru/FiniteStateMachine/Info/StateMachine.png b/DesignPatternGuru/FiniteStateMachine/Info/StateMachine.png new file mode 100644 index 0000000000000000000000000000000000000000..a8ad48717fc981ff2f07ff6cdb722b0b127b5f3a GIT binary patch literal 25213 zcmZ^Lby!s2_q7rdq6{S|F_a8lBJJSNAT^*!rywAF2x*X>0i?S@zyS#fL0Y;&0SW0A z0qL&aneY4e`-hJY!`yq%Irp5s*IsLF(3;N`?-A1x-@0|{p0W}``_`@7W8hyj;T`bF z>RXnV;J@20+KO_w%7z#=zz=w@;p*^Pw<@CVUYg;9pNX85^j&Vx zLm+afTQNDr;M3d8a4PUA&eQ+jg^2O9`J3zH3L>(1;CfV~5}V)NWB=>RNc*38@!t&k+<|Z%2|ek z3oGtFw`@LJqZf8rQ?vV3tSdb2*m5QD;6d~0Qbcg~dacWlIOnnV zs*lp{9{pnx@2v{Ofd_nse|+WG@?Ml1SGfFY@^<&Wf7KRFguV6m-52|)Kiy3J_N8ET z3$+VW#;pg_Rvmb?SBE5bs@HeR8vcc6PA77|Pi1W>*Ts6JZ@NCvuRE}`-D-b(YI1(K zVR7^6*XI}0H|lM#Cc*wh5hAinqc zW;#vOj;#bg5==N|xp8Ew>h*M_48cR!7+MKeOsyUw;COp_`eys5B9o{^SEL{qYI^Y3 zTVO|!X=lWYG)8c$$ZqIpNUxSsX|2Sm@(F%@^GhgN`Z(oELwWs?7B2&sYcL6CzR1pf zCYc#S@9nRJZ)fYRcNbdc9zg%@I(7J;_pnCy81OP52!%>ae0M*NR|I59wV9_NoJHp#T-0WPqWO-m-!oyMrk+pi1LJq&HD{jOF zzgNp$9!;2#kE5V)D(JB0e{rfOozx~GFN{44JQo588b$L`zAXgaRRc@lVD48I;(vXn zm`5iF#;`&LQwxmx!|CuNC%|*Rm$OMU@1^)oWq;A9tTz`g2uNs5%c+R$PQenzT0lm3T5jg<2jsRK&Ux<~jT35-?+ayn zETIb>=bMkcVlkog;Mj||c@~g_ZOqhF*@A;!`Y7a4G&qCZ#{8txhcS)6Ago{#1k8mI z)ciGEf50x482zY7>i7ZD+b%#)zT@&x8QC5N-XBj;ir>ksyPi_&N;8w0+xjq?e9iDK=MOSG#`MBJRjZHbn1SuGMuFg=zQsd>I7}&2UNWoEQFH zdR{QNElCd4xY?&}<410g?L?VTKE<@`)#2z`lEGU+qk2~~ZA+<$$9q$2N}TfR%L9#a zk+jB}>x(t8J5G}F?oP1AwxBl7H_OWtlEgvSN2F}crcYe;#(`)ZQI z?sb0>uR*ttTff-6PnEC6s!^JlYMrp`-m1^Ir%uA&TvMRIuwCBK!Z`c6p^y0KNoRXI z?dy!iQZ%2~oQH*)n&4c-Ol}n~A}uC5nWN_4Y=bxZPwQdnlj^Aq2wltKR|!(e+w~iT z>06eQ1Ch_z4npbQ+DIRI@KfcQOAjvOzgnq!-tnj%VpVei2EM&ZI=)AHj-$U58vH{{ zU5-S`oZNEe-L%6y>E31iVLu~F(JsTvgyA$%?s3ZKru{zdif!4OOBaLVE_%nwRHKw+ zk-x5g$9iY}>wYMxW8(J~yHz;|->?)wN?v^}9;8(**ox#ZK}4_Fcih*wKTHMhynri_ zA@kCf@u_|`od5l-N^@cAe=U@!^P=>X)rouiJ+aBFgDf`&+^Yb!{}gGn*-yJlTmBY* zwx?^Bk9d#@)^Wg(GxX1Bu(bW8K-DijgU;rN?bHtM-_^Fq(pDaBASgFp-IKEn#M4FG zhpoD*Ck%mo>o_EP6n~xt# z6hj1FU^H9Hx`nN7JhBb!D?-%o4+p8O_9bqgYsg-WZB=wLzLV|_6AS<8>I;5I+gt87 zsBjgqP_42a+~VH2Sg0D7siN>^U4e=lsy>rYxC_q(!6P?}{)hjwCHAk5^DQ@-H{MRX?!H5BubH>MQbh=3EX5s8xcadY zVTw~kmzgt^DLJuKzgaepyGjN5*>wE7zd8HKe|bg5P4!g9jV}<1FXA4GIQ$+XhQ+%{ zo}cVER^638nQ>XG9({hG^1)%>VYdEjE!z^BT9dKbMqQ~}A&NoY+$4nU3ptWZL7Gc#aB}K&{x30o6_d_j%u1Y)~%wgoZ#djoJ_9!&DAR{7v}cN!#rWr{t-P zESsL?6-<%x7=9Bt_8ZC&A9st;#^@M^Bve?8N^>uc23l2Y-c?eFm`G#E>bCz`WsPZ>i{%brKniOw^3}i`rdl_8b z&4MkR{rMRE`zF*HS;LMa#t6;Pr)FwgJ;pBZZ>zMZDJJHnEead*!j^a;za7-?v<_ z{tKcTg?@k+#ZTOZeMkU(u=RHkGk@RylfT6(z|P|&bx7^(!{?!lk_*~AUy9(b33!D@ z@RH~?ymRo5jOWz2--H3r8d~JwfCMv>SI+;?NFwp!BUHtYA~j==cwU@M1s!mb4%1g! z{;*ImE|H&!UWa&H?XJ@te-ZE_hgBU(ru_?}`fJQn! zd@XdyZW4+SLcmJ?cVQ5?(CQnG@vb?8t6_^8UX0S0JX3&8E1rF7dsIx0jHUR7&P?H0POX%N!#~i8R#LFb?sZTE z%s$> z)jhPfT+3bFD70Afvd~=h%SZy3jvPDorn=wIz2)Jr(;`#iUIvhep=`^#@}R{&oW3Q! zD7Ib_C8eiN!@#(1m+5Hpa*!8V-Xp`NgTWuU&nW0_Kii8r5c^p}gGLHb=^+w(@3ld( z_Y}P}@3UtH!^FE{&gXC3ZIiIws=POk?)Dl{=45A&V_+H$2l!7V4<>hSg46Q@1(9}T z&34W7ZxS6f1qh|=Sg_g3T zqVa?!BF?Aga3_vb5A`MByVJwbf>AF^)->U(z4kSZoQ_^o?a?*fb#wQ4|uwk z_+q^-mF6lfmM_UA7m66&XZ}-0!!)`8Tz1o*CXQA0z*s@wBXANT9qLw-thXjB9_wh; zz>#NV06YpiXg!qna-C~J5)~6NytO=MyExw7Ol0dqbM=lZ`!RB4`5xs^_Hb0ot3G;ZA{%Fi|Kl2SH#NF`vq(-N~k>?YH z$?`kj;EMPgK){$X5q2BQhjRa5DKqJpd*9$tis-pi+kF>DXPsm*PHwTi=aSoO{JOz` zAERX?au*V;((NnJ4h}?jQLrL89V%T8uHocl@QMNgQXpEWb$vSfAkLE?&qz~2jpS9Z z7@}m{HSnw4q(!ZwV-!5~)Al5iWuJ)DA01rCGwreb!67dAO8_P=5=x~dz3?8FJPJLC z4^kBk;z+30*4E;AW{QxX@RoYhUL&Ya-bKFA7hu_c+px{Sue*}iPAV&v`y;`c-l017 zgB~e&hk1-EJC)X|@j%%Bh6Fz#Sr(!Q==p}4!=Sl%UViyL_hZ$w2=@-jmnsj!SblOM zHQSoO$I~gG=9;;%^k5-Ez=*C+K&jh!h_9+C&&(`>SR?zIPRK!MT|WB!m1cm z9UE`8H*VmV8cxOCrwZcOnlU*W8+j^1p~V)-93u!`@LpBju{Jvf3Q_W#|7tf8EZob? zN5JIsMSX|bYHcw6_2U_*cA?HVmZyti?A1EJYZE4 zkU_D8h;TZ!jg&vN3D$`D^%2#?obbq2$)@EfNtH~I42WNs%L5z$X@t@pYV=dhm5JpW zkzGH*R>N`#nn>~~Jp%`;wSm-SUm=NV+fj}J>v@$#0J$E;fHOo=C7&?vPJAdS17OFT zc6F=jLt*PkU!_M8AQYtr-IwSwActPCktd8q2A^mJ|F@XWp>~+AA`JC&0Tr_)UKZUm zvp=%xc$;KQu+Aeqek9>GJ~!#6UI zuFp65={>+*q{}Uh#>%4S?BzpdmRa=MHSHYul5 z74e`5t!aWFQ=$3C=nl46K|>CsZ`f4qUUhXm-CY8Bh`HZxW*7$2+3HEn7kIb1RF$*h z{?sN~*QJb7v0WcXC<3Kijte&i5-0ooqtK5UT)K5o?BVPv+FaJK_^3TA=dK% zCXO1YkR1G4@&kmCyqh+tZ z*-m~jGwn6%xtpaTTMVj@KxX{J-hiu7K9+ZfQ!%bt@J)|Q8Zkog0NZ*H=&~D2)l2f8 zY8o*WQ#?=e^VD7=O7qiAvW+q~dE2rT9nM7y=A*{OjlpBH!eNAwR?oN(dC=eo9?>{P zefpbsO@<`TAYqjHHqbndG#h&gyTX95NEG-0d1HSeGQaen_VWZrC@N+jIdHF^`%3Ko zdH@uIVt)cZYFVe647GlA9KmbSJac(G?fA~f6GV`do`Rf_!8pQm^{{*N*5#fPFI47j zALCIGzEe4*r%3(ZeDJ;kSf`f*(etn7zsd+ciAOA^J2qFCD;@BwOA~Tm389!*X|Bpe zq**XLtYsn^dyF1&)|VJ>F9pra9&;3zRzxpgInAIGfq(ze4jiS|`ytD`)7-ffHG2;} z&z!6KkqaY?iln7`C%1CQ^V4@B#}nrWE(4W{)?0qec>bi7xOn~`Qi9}{*#PY7t5rab zP(?jt$~s>CvGOA}bfjtXqoCUK;vASxTn`~<-ekj0v)u(f4QVK$>2s-UpM7Qer{CXg zEZ}_=X&<%==Rv(K$?EQopMor#tU5EN$FdAM-gGu@`b{{Ru7HYG|z9ZPVKIZHUr? zf7{5$G0Trr?LF+thH<-MiPrg|tIZ($kKueL;?h?`nRiA>?JF6iO7;Wd!IL7AIy`46 zO|&0d9j`t%W5uXM@;fWT0#%9!F>%E?Z)A{Ke147zw`dUwYw|EJo);RHnprtZEb;IH zDKcWoj8R%)>x9irz#punA@P2#)<@AjAt)LO1Cfm=SI%8d;`LBQirA|vYjwwn%crt` zjofE-3r!!}{P^AoNbfmqkyL5#nn7wq#tZ`a({RJ8v$b?iN|5CckF)~ocScnC)lUsn zgwHkDF?o2;l{N_2Eg(=8pebhy z%?UA3XF2D;HSeCObBXuLTR$0{`TWN?mQ;IByDm%Tp?elTMi})^{ZLXxn30b|EoEVw zMNCQa88J0PK|(q>!Be{Z{sEKB?swd|k$Ol5qKZF{f?aF%WeZ?#@*771g*95JObIp7 zG+`r8K`1zBQ~r~GwXW^(&leQMjT-CsiQW({;&5)@2$v#kA&*D7STI(zIRo*iWI6!A zXi^PCQ*Q#+?8$?L4HZy6vEeyFKB4s-11He#cb!x(*rcvUB5(1A_OH+pz3Ew4GShZ= zOC0xAktod<b|J48 zc3$bxoa^wjVb3usmfHPBq@X=tM2L$<6!LuBNLFTVbCq@GLD?4jej0fHY(iBgCMWb3 zA4B22cHs||DL6#Ow#U5ulL3YESO(gw$c#!iDx!IGztGk~QtqIgPJknvv~dVwu9HNT z-?1fV_KivWj&-3~S`DK6RZ?t~l!=n&0U`Chu8fS8rO4mkzKqz6m!x{0E{63t36e@~ z2?&FVeHy_Knm$R|{VW{LA;wS2NZb|8#J__K4hOf*5=;o~y*Tic-Jd<&eD~)E%c5YC zl^VRaDTSX6;~5xXeYU^42Dq|nYB)>lfGA*xHML!s;x6ASqcSmT2MTxGNg~D771XAZ zigNolEvTT$PDaouG~$yKt7mVq?&p1H{{2jpZFkf|3PuCZBn?4)qBo2Sd2prFc7eY- zT#0vtr$LV8EJ`OIjyls%<};#;xE?$j+-i=uU?${BjZ}K?u0j#ts6(bej(#rG)xOe~ z$nEluzkY}1NwLnS=S0y(QXl!)qgb+)G+j^)Hjq)wNn#R#@td8wrqblUe(w4)%4k!Z z4m8KE;r-8x-lxw;#GOf2k5U6K)S3KFbJdgh5t9pyax@fZ4WX__LD_!iy*2rDn-A|2 z-^lE#oRxhpZ*L)qIjlJ#qLWec=_ZmEIJvsdGtVvWZm^4^0_7=Mxn@B4WmaTZu z;F!U#dbtkKs-35Q`;BGMozo7%70oF9`=aoY1wJVBZ;54@EY>~bUusu7QuT7}Q7rA?03f+?^`ek99a zC!ZXNyqLe4ntt2ByXc;8PRP~5YqI=&IX1_dj4yAe`C=%_3ZWK33-t%3XnGum(eHF| zJpHv2@j8U{XW$J7FX>H9%Jguf=fPI9j&fG(I+;$e@dmy;WiAy*tU!UC)akxyTI4Li znnWkDWqZsSJ2ImlY#9B(zU1Iz$?a;LpAkhLZAS|WOWx{sSd1$8(u8 z%L73D74Q__U-K(S?VjSy_Azf79ErU7?$EEEa^Fwz-gLF6T>i5Hl|*u4UCPMI_Kyl5 z_WhK<#pK*UQD}4IbqQ0U&6Lz{uCFZe(xSddU=^;AN|Aobs1MfG+NsKF@+=kLV6sz| z2+))E@nm$Y4-{Q8v)Pywq0RPv8qp4qkC>F(Ggd(S3F719HgmrTuX zZ8ol>0>;tvuaeJZpE3UT|^8? zyqEK>Cqjs@{~Q2)vR~6fdcC}#4w(w{`Axv+k#ls10&T!|k7f1c9a6@vhejeXIfX=t z^i%@s?5pY+-ndVojCfpS?3x?*R+_KBM7_HVb$zBN!JAB_{o`i__ATPza@bQyP>M8j#Jf16)_e}8+f zR*{0}O}M6@@Nw*2p45$A#M+N;m8$yro@wPcg4cUE5kMTR>v)V1IX@v=!@CEhkc>?7 zA(Oos&-KiTc@6|03tWas?=tE6sKC^RrIU6@y&OC+4F_pCz!xaiF7gcOKUQus|F~9? zUh-YZ(UU8M_(cD7OlwAE88lD4UNM^S*gaOwFb}pr7>IvYt;y@iJn0bzU1E9d!054X zduKERjVG#%`M&GiGgjqw^rjpcjGyINmwWZVZCBfU%8Hsk2c9N+o_K1MDd}EQr^Q|j zRTFTHAuwuj+nJj+Fkn#9jK>?U1|-%y4sRA`d|#D4b#sv`W52Uia$Od=P&`p0O!c^l zzptb!8e;Z-ZT|j4iOH!*!i@hnsdp`U0Yf}7i~RfR zg^2@5glt+=Pz@zbiuWl|OtNzfZev<~&sm|kc`6iughX93!$05(TB$7yb~9K!;5Xh% z441=ST$JUfd|S8rzy+|%D#(x?Tyi86vINf~CN+#$nNmjWjeyUolVg!Ujx3ed)nXVE zTd~{o^A8@QTc6oYM8SIl!&O463= z^UqU&4{9oCTPjR{8;2o|eHL!4Nv4x_nfBPB_`gDVC6>FeCtB=`PxD}icU)fZg4B~S z9SzZgwZQ`wgrL@+K;q}f#7j78OM5IZ-2D|+fSE&5a&|If-eZLFL(NRVs#iYKx(icp zN;Y&xr#^N_djSpqU`~dN0S_|@*VEj4p6ZllTY=cqRtqFX!DthEuGzt2y#&7sBcV0t zYuFO<{3QRpf(XW3oGIZZ1O&f$3^5tAJQv2}6Nm(YtO}94Du@d0$Ux#qohBe|m0+A@ zm0pJQWaLpGVbSoQJE?%{N6r;JdIiTHp)~ftIx6%&`M0*7?Vkk3z#`9y2_hhUOl{~C zkP0Fe7+$LR1LQZ5m((}MOC5k*ru!Kzt>sfKBG}vppzmzJZn7#zP)c_4VeU8n;x79p zmsJd*)f5Q~Pm#IUs;U`D0RiL%Ec_wSUw?tC>D6SDw_yKKgI8b+zH|-9q3Z z^FD4exj?#MpjN#7IG-wlUFA2FAs}=z`s}t^gYyb-*9{bIlq~u0TYI(L#84JJxJ$1N zW#IXY%kUJ5VEA9EJ+Q4tOAW+ae#%p)0^SR36{Wa9YGmUmYt)lAsq52a>`hqUyblpa z;L#!g>otHq$M(nuF0Y0yKt?Mp6c2!&?_D5w8HV@O-s|v>84v(1u(B+8+N$P{!1Dp& z;mKPO0L*)^%OxNJU&%!3O5a=_3gWa(S#xnc zqU2*M-vERj1Xh^OcDg8`M=#;Ne~Uh;0k;n}LN6u;Q)Hd@7Qyy|@I*bmj<;+}~ zfQkzZ|D|vkT}h{o#Ww?|*_I zfK_&VlY!-`^3`?lEyJ@x3Mu|^fWi}%#`->9Rok#=QMD zg}}Y??g731)zO3)Fi&(#P>JHG;;%R^$-i99T_YuWbAGrvF)ZRZH)A|Xr_GAEO$<}l z0xp8=+64NV*>?t#)j7bbFdj9mO9ua`*F~&yh$%F4(?%OLNP5U z%dN@h93Am(99MmfgyG4L45v0Ca$T)4%1Ce!u*cOJXr*8eTRmH#i7h_#j2NI5v5661 zOR*@yz?76JS-}JF6a*wgA-!#5mMX<$Jp4_Eakc>BOX+GQP$C@UT=*?y9qTtZ%JX;s z8%%`yLXbzHg0U{Qm4;!;ZZkM=axC*+ItTt`EY%#S)JR z&-=)X_tkB4e642s?Lm@IkV;bct%DO>c9=UOwEX($er;AIVzV`|&iTd92BBI~(@bvG zIM2<}+T(E)k|k^(&6#C0=e5aOj=<{$R-eJ#Fh;tDvXDo2p!^t-lej)oQc)cU>{$2H z^M`gojd`ZF(9^WpHvuwu{|0wnn+>3dGht=Gpz}_8x+;q}{Ya{m2?!|_!wp9zE>?;R z{{{1MlHpxAuWq$F3@>>0DZTji<`)d>?DAIR(++vhc9d^l^|slvg8H)Qt^O7qt0Gy(NzZRh<*}^7^-3x#-;o zJi97FxaB*U?sI!d*Hrc$cNh0Hkj;P*Hh{YUtsVHq#+nsRF<-={EaP9gPzS0=$em<4 zrv;of12{hsUVD*YqM6L2Z(cKHP0x*K#ObcKpAzE!1C?gOvNw3%L~_y4Dz?P)(nwf3c;Mu}=Vq#TI z2GKtv#uhWkdADzv5Y`atg%*>SQPfCgg#eG+EX1)r#IQMA%~qwnZ#he!+NfI>cjgva zN8Da_wBvrzSDHvzOUxq!JYc9}G6zJaAn?zAaXGeb8!OTg<;_L$#F8VWNbrsTrFWzfti%ZO6=RK2%Jzs(*jqSM z^#>T6))Vty^WX<7zb+zHiRdplq_zMYR=x}uX3-8{VT8KSNcOpg(8Mb;`&p{&lV&SZ zGp6-weVE|ZqS9j34)g-IFaUP8hm^DQB#23Vz|;Q*mc2I@T6?e{2$Fz;8f?iiR6@?2 zb3gB!e}iNm#AxS=LgEWkle5rp{i{!@?VcTmqkJwvv>i!KvvqNl8Yr#?Wv{2ITyS;| zAuLfS(5sg{*@GRLJ_Bg=LO?3cX`f?lLsI_}?XHsPPVVgH~21$|?A%l+0IsWsr-Oy*RlgrACY~z{#5k9q{DU&7U$E9&0cLaYo zy_?mL@ahfJz06>p$HuWx%I4qTk^2L>OUKLX!}K^p|50_Zuc7NEX*teAXBpG)uwkUX z_xsVuYa|&vlobQAM;H|{mi}M;CZEe{;)_>1&VaENtet(AUb^rFXn?@Waa2ETskqBm=h$d%w&4&%@s)5FZ9 zcW=2kJB}GM& z>jSpe)}-l(TqUm+Vl0YQxU1UcXImtL_{jeP)WY|G3YF8CXZI^MU2f0aqpHIb6+Ug5 zy-^g1^L{G#NHxf1$gKl+;(>v^ne-I$qVn}{mcu9=5RAr>$n$QZC6 z{5t&mt3RCm%9K5iUmxD26*VA(7*Ts(m)AzA%vt8&3>#=#KQSll*LPLh~1zBx*< z@3?W_lhH|g6^y46Ej}3yF=HnWRIyT$=OYz$2j(@!|7P7Lrc_Aa1x$$q^e;kxHcpqD z$V$qb0%GN>)uqOsdNbg=`B*T(8qBtyy9#3dJ>ZqxuVQ1kHuX zAH@Ru)7{0#G#gmF2NHArJ?%WAQ&8~KOvB60HN_blZDM7f)6Cusa9`zu%B`xuAOPij zy+P-6(Ss!EJ^Fl$olFnPf+0zTYs!1H9_+qI8%!4y!wP@3k7b=0kbhJ4mO4q6>OcWu zU}pHm6uxzXwZb_R=8x>kUM|J%ds?5vQNp+R6Dz(j1l>pi%LP#E2tBHhX+v23*iqdt zr?OxNX`V)VE!g1^`tPQI*0(d9YEEx+>3rghN#MA3J@9><&c>*2e-I%(IZ`V|paYjb z{8}cPi%y*Tz=Q;tyy^{CtNIeZiHQ!u&bC)y<9aon$ z>$qQE?WWofm|X(bcq+hT1QHGzkW`2leD#i7yEVWHd}MUmon{{731)a6-<&InwG?hx zcdj-C`t*0k7m3a%E`qd9@4pyw2T$!6gca!M}waM6y+6X z9z=*GH{e{JOLJSi99{q0a_5^2)(kl2Ky-)cM#1N7*93k&)TuTr`tE8+ zV}U&5K{K6dFw^IW0bHi@S&!Fyn=sZ93~RRDtxDWVevP@14e7+}^g7G4&~q__+WyT` z0xmq|gVU|5;a83yL2MZZ9TAoj@!tciJtB_)i%>%<#pd}QbT3TlzZsIbus`Ua(0Hlw zfOU2ONV>LB;%hYAc~QP6vlCJLGoTE!KjdI8L3Rkg9;)u|eY%SEiWCzG+`2FECucI~ z2PlrshIwu8#BYyw#k*y%FQSK&k_!clAi7)EZXGDHcLq63kt*pg#wE3F_Y>Xe81~u_CdGEX%(Q;RKW_R&-}hJt0n_EY z%%h~lJ6b41W;ic2BS+iJ+~b2t|IyC;JaI9%A`cmI|E#{*4v&fjUrd)iP=!wJJN>GQ zQyJZX^bJ&1SMFCe!vVE>Qs zPNQ_5H*Hd&V&4tC2~B zH&!)9142H>-D+NzTI+jpte2Au(&ghK8G!?miwq&FaEI&Fi`0NSi>}OHJZSz&PcP?c z!^ty{jL7r+PF2zO3MF^VSD>Y|H62g1ucHC7nc^{SoScSb?0x|@%x&lR6yQc~89;hKJqd}QN!dOIBy5=|<4eOF4J2N8#Smwf zN8TAY;f>@h&cJm7EaUHB-l4q$u zM20$!DF?mbyR9V(mTPHZj#)3Dh-1R0oVXWyqqS6GD6XQr%4NeZl>xNez~A7ANrqLb z|G`h(XoVnWNjm$%*|mP1r^Otn6eeiVHR$#y$`JIgj zHB)k5>z_Y^>UubGsgXHTwSf1Ti+jY8A{WWE{($G@0=P`#qhfST{K7CO!??+y9v~r# zT%3QRqv#AccrNR|=VcPazBhkHhGWb3)HKwsfOKF3d6URcvutXwp@!PxQ1VoS z>vd4Ph=|pUD z2wcgYfG__6Y?An9NmV1emW^f|i?te+Ldyp5_t__RM>9DZ`yTzum;$tiD$352Bagrr zYjF|scyGS)}>+Wl0WQPX2%^i#C>zi-QjOz5WoH_rihpr`4Ei-~Jv2s5xHK={8n#8kr{J;-* zq^jcCadw8EG_r`Nh7tUfkl(@M_Ku2J@o1f%z(ef}^i|o%cqa&g=Ea^>wCXD3*bzQ9V zB~&GzM=NHitm*jGD5&OBej<~IdwOymFa?s1t7Yqcl!|R&@ z(3@FtWB+faj(kGIEV5zE@Bti~o-T31e~z7h$0dE)u-8RD2&`gnKiG`fe|IM@9d!2r z^^I|n615Pj?q&dS900kli`uLkV7fhF!)g>2x@*~`}EojfNMH4Jl9gk zmFTk6PyOOpup;*+;w*fCrRMupvJ}JK&Hne5Yj3pORLql50*Xw|SR!Ds>EO>(P3HSb zQEeeM>l!Z(lmZKd9Mzity7z$V{&$}rh>CM`vAm4_m;YVdKui9$m{i-u27e{#@p1zN z+V4msx%>#cukW4Y>YZ0ru#CT*M=th-ik|;=Ch8Ufod(_vKC*BTsJqnhq(#LIfM*B5wEl6lf9iejBV57D$DB8xA__IC&#p$+z!0&tUr*9qRM;EyH0YAd=1L z)rB0~fJ!{|-S+RPWo8?N71F%GGp0Xwt8}d?c8|j+ylcLzT4Bhm9umdg2kh$}PT#4} z{!O6;DDfUulz-8C@>~h`8g7BmVwN^Tddy0R4)w4 zs?=ZySTk@(vy%Nn^J_p=dVY4D*|}bhmffmwGGv$siu|@itO+KVP$q9Us@fAuCotCK zpINS7RcI5En8Wrr4n%q^L!<#H7?pHd$+G72H{Oe*>jA#NNHX`J)di4eoy}o8oq&ie z&(M2}U(zI^O45y-?g67q#byfgRiNR~C3N!Rkt_XfBsjKhQgA zT=WR` zTup&^MhTAgbxBK^Zbe^J-UtwLopvVFY08@gesO*%B%R$bbl2$RhDITk3JOVBngiuS zt%L4P`)5<_8L#7I^rFbjdh_#GCQ7ovK1JV)nCR*ltCKJiya3 z1S|3hq?NA|aF%cw=>eWK@Ei}RVQJ)!?*iG;_D3FP1L_dcLL*sm69}xVCE{jWPz0Of^NHb{^R}-buTVFvrN#BbuW}b$Pxuse=1lGtUkH06KfP8 z9k@TpAca6#_i6?9U_DXD{=J_N<9(54BwIVk>g3)jmVQ4mcez`YQ9u`rafcV|bEqWH ze}Rnp9&JxgWO)58s?lDo4Sm?CjU)8LI?bb9L`@k%Q0C3}2>7(fdc#z@u}xW=nVMh^ zg*FnyaGnX>diza)&93LcfU0uk>6aHUzFkzV0BFb^b)tzCR5OqMmgU^X6?>>xN08!i z2@3x`mEcF2;8I`8{LdfB`CWm$e)Yqvs0{6XdAe6aYG7PMNXH1%kU3jP`JzA+r!Qdp z9{wF7>F|I9?)9@VCKIXa-oM8GT^d9~1HD1u}`anbaD8Um5dL>_+ zXXWKz+ExJ8-(YNuyN}%w2#$RruhghKUN#~@gIaAikc}Q648FgOi*01Z$?J0i`bm`% z3Z_Fwo^iO}&+iQmF9$#1TV#MMRR_4#%k!Vm$oPD_H`0@wv){z_WkaUuLF%|VsDwr& zMlFc;5LNd-o_SK%my_K7X&fI%q|g{=_0U-ZcFb;+|kK!}#!l)?fOhFOlU!MQX z)J78+L7ED-mJp_(1z>HrowPR9{!jmhI7OAGgj9Up(SjRpW%7wTAXm9keb1rjV+q%IE3RfC}Y z)l7##VJ`z~*j@udRAqNGQ2Zt@LCf8{hwDE)Kiu!T4BRw%H+^19@FMAt>|zzxCLq3q zVm0sn0owg1pT$Z}To3E4HBTg7Oh}Rn`8Ca7EJ|BlJNxU~PFHE99Wa3m=BV!K0X&%7 zM|66QiRfE|&&l&docS;VbDE&eb}V}03Fz2CWzNhMUi`4nIn+EaO|gHAVA@2r=HnyT z#;wYJzBRz493@3gfogy7^6bDNB;p&Ra}Ue-%e51+H)B0s759g#D0pfeupW}7c8M2$ zpiin)Czf^Y@Zc=$9mwb=;(s$BU5xqOb-08Xq1~&(T|f-qh-&@!1n#kB8Ps#|vpH+`31qi5OELE1LkF z<$R0&v5rcgCqcuvcXNmm;yHdIF)IAed))iGD&fh@U`rCBaF0Q`lny9@NlqW_ClBPf zZw1ynEw)WM&Va_)fjD;60j%G{pY>{Y5~OLz^>`yt%9SW?n5GW1Jbr5ca|jN1hP{1} z^#>ldGY9%v8w=vFwcP#Ni%$gNXqb!hZ9zxNy;8-XAHX4E{7!nO!F9ttX!P;CkBg)o zY3~H!9qlIO0Umzb0J)kLacfwv2f4|C@*R-g9qw?S`1(+{gq(R`;kQB8I#yI}hz4fm zz97OIt(U>rD((34KAlJp2%~J`R7jXdC3KI{XsZ!OAmhTy)E%ziZ&a*-e#ysJYpkf< zcr_z^7Lw(j{}dpv2K_F!U;8sD#B(R|V%R zap?P>ZW zy`N^|^aBCZ&rfb!sW~?T^k@(;V;Qe*9@tmsww^+q>Ol4cW}9S7r{FZ(48&9iZf8Fm z8TY&`Cth5UDZP@HKe7Kjg0Wlb~lKpiV0VHc1F$!LvJ1WO}wL225xZT1GE4N)~kP-4MHG!tT4Qw zZC&{wg1;H;IeM5?+QBX#p#H8vtgC5LP^;jrnQV)S=SJ+_A}R|f$jwJ5t0Wb|*K;NI z+96_np8i17{p}zq_(lte*p77ki}urZB3cQkvsPyQ&OO-4K-!B391xuUSK66BLiLC3 zU)jbIV++YLV-1xhK4cvY#u~DPWJ^K`$ucNR8C#a9EJc!ptVObAmo;ld$X21O*_ZEq zdj5j%^Zd-5b7tn8_xrxD`?_AE6vhx#v|k*D=Ml_7o!a@%g-ZDzKn{3V$lpb2@X;P^ zR-pMuuDOSv<$M=a()32tqgD)e&eDaDwkpW8n4{3lSN**1wE`;OTDW9mm`e|H+mb{| zw<4|I?=uZp=fo-Lvms4=c_5;mY$?5(9L{EYq5*Bk=f#SPiyL|1d>hYQthr>PXe;U% zbj=W2mg?U>xL8AV$tHS!s)=n&oU)m)jpeNR`5uaz17Zq#nL~h`$i?$ zJpF|a_QMN~OH*5+M-OmnA~{&&DvS>72R#UT6VeAIVPwUhRxQtgqsBs6e8<)H?~;KQ-1oRp*SRqiiYY^ zYp*#49+(!NdpV&jhQV*$EJTlLGN{+gUVM4^sffR_GiG-hZ$wA+$=Un#e`Y1;qxP>~ z*s_uT=v^O{d#SR_0!tEO{$p(=`m?3ui=SD_EO&trDLoA(9v?8Al6?f{B!){@4N73u zekRFXMnR=BLp)`Umm3HMHjgy48n1Zy@OLd?3-iBp3Cn~z9?xmYYA$;!+AgLhXeZ$1 zLA`+%8_WHh#rj5+IE-YUXcL;D?UEYL=HsaimNTaGLK0|=tOsmn%^O~Yv-ERJp-u1r z?BZ>WxXW8Ie5p7*eQtV7H`)P}=3TR;rt`O}RanZu5j53H^$foyD(*#~d_IrsDeg?{ zL5k5i=4X3`CPc;X&eM9PzZ$M6JVZYrFo<`a{5?`$evY=_{Um)~HF3j|Et;phMPGu8 za_(CZHFk}BT$q=)r-jjNf{R7(2BC2k){1fi9ibNjC9Hy!F;T6I^mMuC zmY+pS=L@Rk!VIcT>=pAs=e1S}zuu3B9G$pV31gODcJ*9T=WBr~&de??V-c26whH=bzvKyjE(ZN=UV*5sVSw?GFa)mXsOO(|EHt5 zE@n0~0c{FLKA-ATXrG+QN+7n_1(h?W-2ZlWHv?heNRHMzMP|M`F_QTqaLX%I{~U^( zpCLn3rE8qBKSh|86yiCe(~#Uo?`Y1H68Pz*?qQ$M#MTkr)dI@cL`NTi5^})^?cST| zJ4gP#>98Cb7Ud1%DP=Q^0EEWC4C=NV*FDfFUr*fDmj2;`eVgTWj!TF7M_b4%1FEiA zy`B5lhN96uA;cY+P?wf23gnK~zCEL3r&&h6Wn_W@X%tJmc?b5Y?%Rjr+mkDNADxo`NbY|&#%C~Z%~?^$1em(;0yyN;UE4^S$P;0||G{KjrRsb<5L2vm~=btko7 zn#nY1=_ZtoX=!0AjUtiVVw9mZkGA(gi4XUpT-mWMUf3Mv zBMIu?p|ac1r4qkyXULrYbj{W%;FLc&`JBdSsT#vmPs(X`SH7-HTVt40l6$nN1Iv2@@Lx?Hi z)3+pf97i?(d`ix!ekaJji8_`qv<;~_$m_ytH>4Xn zv5Tf;m+u=|pUN6l^rxj}EJY3z9)kfM;e>3c07`3UL&xR?u8Vr$?+dSZc8O8R4>%H; z#*k15S`cy3VH(vntI|;;VNq~=N7XAr&$8is7d6KdM|R_r%~4^gp|iFayx;R1_2@oO zgL@*s!kYT?O{WUXvr|>>3+p{<28A-6{^Y_XRq?TobH&v96aNUFwzCI3f&V4q^;e!|#w!w&dTaSeP9=1)U-GkA$RV;#> zS{Wq4PB&D?H&Sw?9dJ8>9-(cGV@HmiDLQY}M8T=*kG}^m+3Ab;<@4pzRjBf&-_V^_ zPE#^YD!Lz5HMoSBO2L_hH@0C!U?@*jBeR9ztz_(D%0h^V`@Ii%l>*%AyPZ?7J8LF6 z0>n`%TSFlg37iJ9RKuRm<33*BQG2#C_^0q$^yk}D zm}I7CYkZfNmQPZo2Umx?5*r?4gWjc?Rh;=1KQ2N-F^{HG(cPXO>;yQ;AT*(GNw2L> z+#%)iu7I{F3u2(W+hBgg+Z?Y26@kuY^wgigUJ&k>kJyqF;Fe4QUCoUnttYu)jJumCX{3z zqqg^H(c!-z8cRa)kETOdSsD!8E4uVNbD3iOPw(Nys5zbm%$@Ltyl5&Yhr<(mqL%gz zykB65+eDNAayyumdNkNkiw)Gx0TiK){ z=he{VJ1x*QderVfuTj*ZAq#hU)y;7e-#DeJA%U0J)!db((+dj;OEr}L@FO=$_~|h9%;%O+TH;!Z{g~5o|KUxHc=b0c5!ahw z&=9oHx?Gu@ryndg7HTU`ZFv8D9^PD|{rsl}p7sx@QNdpg>y7iJ=Ir1em;E1Gco|sg zw(ZC2;f^aNNsqZhx?b9w`^hAAe{CnAEXuorf1c*hz%%pZE*qYHKXJG)%P;b%54liDd!e``k1%a<5?Pf@`%9l$aT*Q(jd3XfJw124L?6fCs*JG1 zhT##^8-l3}C^;JJtc_-94`Y|D09l-^>+KVeHPm2d4x>3Dg9w1-Lap{TVB22>WeU7H zEu{L+Qn+}MjuwU`OlM0K9oiC4%z`{0LzmYGOMl&-90bKKAPIFm zMM&~|VQtM^x+FMkS(G^(fRrK+jc@T5K)3)qM$WhhbzEokt$&uF!vwrHsD!B?f;397 z;IQx#L!+m^!HPY041@n%1%iAwj1Isrv}v7~HWQXnn|hW&72Dvq;;Q=!#=BK)?pyag@Dh!gI7`XWkBuiq3O#hA2PI+1A+)8h^pDeeGrzRy4xxBGFi#pqn{bR=Y+9YV_m>QK)LOH|d zLQ~EeDtxC}d|Ip+(h|eNS!qu~*TF#`0#}zU=aUBRF>_NEr39g9UZugWfO@$;40f*H zqpeJbS#&Jg&W=_7{?(qv*sybJCX4RY44a64(UpD{WQV<2;uKN-r6VrG8Jy01&ttFl z=NLm&;IIe*SB>DdR3hW;4nUGDb5uNCv+0ofgXaaK@r;V>hypo@3o<`PG!QTL?||k| zRw>QieHacU!_>WLeRX%Wdn8}$jBHCO+_MWBW}(Fqtb9Hx$b|4p5uzJ z24V{8S5w7oLs|RX3M!hB0FW~nS_YBXmsTv_^*PMx&BA)DfS{j#TU}KGU1kNpnDia{QuHD7U}c{P@DBt#Z%yeXsIr+3*pXsp?jK9Niqq+!2!x;0q1sEzV!k-11W@@7<7ijtOaYG;#pixK zwq?-#Z?q3RTF_$sca7Xs*d@|D$xNsPX*eYWx_CKw3fF@6K)fmQYVvjg=2Xy?WN#(A zj}+Fo0jQG*524c0C+O10-rKXMDwH~-I~@*R zZSeU!={fv|qu$e?j3!l>ZPdrbXZ)U29Y8gBeG91`+GEeo<*;^^J9%dwpE}g#2}<*@ z%tQcqb(4b9Pq6kcU~oq;LLnI@w+*y21Ixw&+^o0WQyoiFqiy$l>X$-ww^;vz)Wc5~ zv>qN`;>MmXA97%*WHgOLyhyy;MLk+P$)E~;He@J+B4Ow+Yy@Y(-uCcm+OzIrwdmH* z2q)r(px1e$P%HBPJR*%o-)fKoiC+x(iLfht8n%ZkAe&bBQLgiYAHk^yX7ygyMy`xi6GvPON$fbEXA(iqaO1xTI&Uh{SsQiqWXX8L52?fE1Z&Y1 z%8L=??3WOwp>=3`Z_yQl;-hoLPkbst=GO#`%nzsVj@y)HDMEzA=$6z!5gPLN+lpZ6 z2OU6z+c@Q}RB!nl)e2Nav6{g$=1U*~lrOSeDzC+#JBh#Xyf%%*Fsb(b!L@3ZVcb=D z4S_7v!83>SOz(-M)`iigZvUMp>K*3#`VK@Yq8_rhu~5b`bVoUB;?3&C@eYUqKb7BN zqqX*PTT_J*nD65YT5)fdKKn4(oQ>Zr zBEu0LR3B6o5w2vM;7-b=Tek(7g0NKmaj!L#ZYyjd3dRSG zcp`+NWR<9S>a9A^1HmvQ8+JFq5(!2O6xfY_CMkFfIFoW#tY3>ssYSGX^MBs)#`j7v zvrJEb9Zwr;(5af^qw9(B%ek=W!+_Ln^hv*i=Ge7ApSe$=3E|rJ1-1#35*r$%aqV7e zlU@5=XA4h=LduzU$;>D}E$sx`io0l-^EV`9_2uDa4b;)|`BxAAtgcyC27RFAy#Fa~ zX*8)4W8mI>wyl*Jfp?5VFyn*$W|ObF@7wIBI*{g5vi597u$6GlsFK~d&l4~s7TbI- z*RfvLZ`H9DatRy`=4+^aEV?P_VOrYi$3Dd=P42=rVmaTk)2{dxAx8n@3hVBD9sbsU z_3j_V2u~-A1t>gb5kbW&!;c~I=bkz!=2$g{n6cRKSTV{fp|(5b`~fv4EyV(?V!Spok*Cf#4QCf zV^*5BwtXqcrIlS;9F8o zPB?<|8Ft()?TmAXORMfUbMECdo(Ct4QN2bBQ)riRY7ve?pc+fstByAX=B^ku9O_(# ze$LX^@AV(6A7el4jizbnTv_hE(qxkgiV|u*MWVkq>%J|yWxy5MHe~aqe6H=aevXYU zBpxb7E~^`TBc{0d$A;^ca_=}ADgQ|LHG(juVEzulp3-XjVwY)+tJF28#soi7 z@p_&@yQnKiB+_gfC3`m4?T^aH_M@o=Ywz5tWCUQ)+vGeuq@*A=r^_&Ofdb{xt{IHE z@&l~e7nf|szr0Ne@Q&^BiwDguaK27Dh^;}H9%l*QkLA)BpI zSwa?i?WB&SrnLH5LP5}fx8I`+{QrDI2Kf)Fk8S~&c43KmTad-vgiGeFdcAn$p~Fc} z2&!|X@}9K`>UfswEzMAIhYp}_(ky&t?^wIpA$r1|!}z1-%~zCrxp=3CnNpEUmB|8O zlJ-a{x9Kc0_R#u}pt=Y-AX#Xv9~DI!O_CC&>x9M#j}a?3lSkyFoFN5k&m8suY+tWC zfLUV5&@xnwEZ^WE!qRF0P1@^r@r!ZE(0c|Q%AZ9jvVh{7t2 zPa1Coi)&zdo9Iq#J*p`CDLP}-UKZDUE{}1%y+N==I$+I(Xj6eU_dWeRX7!uji>A16 zg*G@$Gy1bM!nHe71BswP!~m2kVNow`65>X)gSaPr@cfuBN53&_IYHuaUBS<9`aQh$ z$M5EOSgs(1hbGd|z;cut!k2?jweihU$>qv~V%X;shiEn0YBbl7gM^YH z9n*j8+;JuVc35*)wBaYM0^c7zb33Fom-Axbue5Uqmq*mkkM9-=JfcZEe|&}A)?&6d zo=?>L1Olz1BXo!IIV6`Rh>2SX`jbfSmOQbM%e7zfEV^wOxc1`jA>kIsT8WE}p+sXY z_$a$@mdjd22p0tw&r}#iHHq6qxP714zp(GPfP@+jb~cx%s!x){0MCsr6eut)fQ+52 zoNIqkbKsi-?4yrb%m;TYV1jx9nwuSdM?@4TPeR`VRuJj%w$(U94F4h5p;@u(Xni2) zdE|8Pp{6DLw>#l?S?MJ3(jbC9r!4e=ag?;9Y-L)W5{gxrBoE!W8;@zt4>%uJUteIqt0=v8r!cu){2cX@sX))5)G(50w^sDWF=D zVLP&p;-oG<713Dw4<-9E+Ff&hRgy#i@;N&rY5^n$*XvL;$bq&Jd9muIg2YkQ2+_W~ zTiq;L4u^c1p3-3w04zq&%DOIC)Flo}|2i1jSdWhDr?qBkVC&YbA*k|YYY%B7BfLq) z{1|)yT!gW@iFa?~R*c;%F#c4V!VoiFLAb;n#d6{&YmfzY9-7(u@rmdy*{M6VGHWOn zNr(pYOO0Q-wvMzI0M!>h;h0j4*LWNuecd8+QP)X@xURp+llJCP<={?}2H71U+cUPx zr9~q~lm!6IhFHBae99VZfwis _transitions; + + public ProcessState CurrentState { get; private set; } + + public Process() + { + CurrentState = ProcessState.Inactive; + + _transitions = new Dictionary() + { + { new StateTransition(ProcessState.Inactive, Command.Exit), ProcessState.Trminated }, + { new StateTransition(ProcessState.Inactive, Command.Begin), ProcessState.Active }, + { new StateTransition(ProcessState.Active, Command.End), ProcessState.Inactive }, + { new StateTransition(ProcessState.Active, Command.Paused), ProcessState.Paused }, + { new StateTransition(ProcessState.Paused, Command.End), ProcessState.Inactive }, + { new StateTransition (ProcessState.Paused, Command.Resume), ProcessState.Active }, + }; + } + + public ProcessState GetNext(Command command) + { + StateTransition transition = new StateTransition(CurrentState, command); + ProcessState nextState; + if (!_transitions.TryGetValue(transition, out nextState)) + throw new Exception($"Invalid transition: {CurrentState} → {nextState}"); + + return nextState; + } + + public ProcessState MoveNext(Command command) + { + CurrentState = GetNext(command); + return CurrentState; + } + } +} diff --git a/DesignPatternGuru/FiniteStateMachine/ProcessState.cs b/DesignPatternGuru/FiniteStateMachine/ProcessState.cs new file mode 100644 index 0000000..9f2f143 --- /dev/null +++ b/DesignPatternGuru/FiniteStateMachine/ProcessState.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FiniteStateMachine +{ + internal enum ProcessState + { + Inactive, + Active, + Paused, + Trminated, + } +} diff --git a/DesignPatternGuru/FiniteStateMachine/Program.cs b/DesignPatternGuru/FiniteStateMachine/Program.cs new file mode 100644 index 0000000..2875493 --- /dev/null +++ b/DesignPatternGuru/FiniteStateMachine/Program.cs @@ -0,0 +1,16 @@ +namespace FiniteStateMachine +{ + internal class Program + { + static void Main(string[] args) + { + Process p = new Process(); + + Console.WriteLine($"Current State: {p.CurrentState}"); + Console.WriteLine($"Command.Begin: {p.MoveNext(Command.Begin)}"); + Console.WriteLine($"Command.Pause: {p.MoveNext(Command.Paused)}"); + Console.WriteLine($"Command.End: {p.MoveNext(Command.End)}"); + Console.WriteLine($"Command.Exit: {p.MoveNext(Command.Exit)}"); + } + } +} \ No newline at end of file diff --git a/DesignPatternGuru/FiniteStateMachine/StateTransition.cs b/DesignPatternGuru/FiniteStateMachine/StateTransition.cs new file mode 100644 index 0000000..a0e041a --- /dev/null +++ b/DesignPatternGuru/FiniteStateMachine/StateTransition.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FiniteStateMachine +{ + internal class StateTransition + { + private readonly ProcessState CurrentState; + private readonly Command Command; + + public StateTransition(ProcessState currentState, Command command) + { + CurrentState = currentState; + Command = command; + } + + public override int GetHashCode() + { + return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode(); + } + + public override bool Equals(object? obj) + { + StateTransition other = obj as StateTransition; + return other != null && this.CurrentState == other.CurrentState; + } + } +}