From 3c2f9400707685733f2acc5e74d400fe4a04e822 Mon Sep 17 00:00:00 2001 From: LunarAkai Date: Tue, 12 Aug 2025 17:12:19 +0200 Subject: [PATCH] architecture example chart --- README.md | 4 ++-- crates/moonhare_game/README.md | 6 ++++++ docs/engine_design.webp | Bin 0 -> 13526 bytes 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 crates/moonhare_game/README.md create mode 100644 docs/engine_design.webp diff --git a/README.md b/README.md index 89ecf09..39a3765 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ So far these parts have been published: ## Architecture: ### Crates -- [MoonhareECS](crates/moonhare_ecs/) - - Entity Component System +- [MoonhareECS](crates/moonhare_ecs/) + - Entity Component System, (still debating with me if I want a proper ECS or not, current system takes inspiration from it though) - [MoonhareEngine](moonhare_engine/) - [MoonhareEvent](crates/moonhare_event/) - [MoonhareGame](crates/moonhare_game/) diff --git a/crates/moonhare_game/README.md b/crates/moonhare_game/README.md new file mode 100644 index 0000000..0de2dba --- /dev/null +++ b/crates/moonhare_game/README.md @@ -0,0 +1,6 @@ +# Moonhare Game +Includes Core Functionality of the Engine + +## Component System Design: + +![](/docs/engine_design.webp) \ No newline at end of file diff --git a/docs/engine_design.webp b/docs/engine_design.webp new file mode 100644 index 0000000000000000000000000000000000000000..876caef7fe3133b280b744992540898b3f1de834 GIT binary patch literal 13526 zcmaKR19WE3vhNq$wlT3Wv2EL&SQFc}ZB1+^6Wiv*wskZAbM8C$t##k)y}J9?)m6Ky zt7>03iIT^}qllV1R^>ko+*v*AM_S{I>;V0069Q zoE#Lz1PRqOGzlTL0YG2ZKgGbv(e7X9e{H|G9v1(_J4gG!a{T{^P{t;XMqeyfUzOD1 zOZk^gs9zY>>|dDjFE;!a=KhO+I@vjW@yP$h4$6u`U)cByQ=0t`Z1_L0k)6X|{>U#L zZfh&&zqLI@>F2E6>2oM7Z{$2mq_^a6F0{|TN002nre`tnj06=pP z0D!sr9~x;c0Duq(05nbghxQ+z*cmt&{Bt|duNK(U6acs>0RZ4M005L}003I+pSiE* z|6v>9*A(uTUAAAB8Ndo)0w4rP0Bit80J<;41YiI#0@%JHOt{Si08D=ZvVf=>fQ^B9 ztyz*KNQv`_h-RQmec{3^Y@X;|w|weN>Q$Zd&09b7Kj%NO+TTAio;Kbq=C%fSd0y!E zAj*BNz47u{Z{#ZVJU>=mZQl=z)Pe3p1%o-E!TOEGr&`nxN9l;3+l?oUA8r))N3 zUXf0~P7nq^yFU#+Egkd_Ld&?ti?-9AZ2W)F2#ejr+8Jx_``kV!YCS zetz&df3|+s{z<#fxzE}6-sbJ`iTvdJ*nK~J3wgV|=>Gh?^``i^{z!Q}e35(q+~WIu z9eNvjwSD!uA=u+H=<4N*@%jEK_TK&0{mFOD_xXA4wcvC6Fz`z7Ikvub|N5zR_%z9{ z8PaOA4UB9EO)m!)=w!$SK4cPL9rlS*-7q0E($RFr04XZ)+E(&uZ81htKM~aI8+MeO zKp9CRreFJD#|(0jvHuf*d&bC*v#hQ^k81`D4C8(Auo);F!)G_<#(1IC0tig?j~ElN zmCJ@>au3wZi3&heaQ9TqS-%&qlscT&y#ON9Cn;WuFkC;G&sa^9*k(~u*p zO>aG41FxoTrT>=yem{3qv?*F@Po~Gpu z{kJ5$)z4x=Erm;yHVP}z@@@vmFqAFp>iHgF@$7$;cgLE>;92D>HVeBZ5jnVGgw$W%J%e$u40bf6N};UDr{YF?W5*pPqZ zy!HeuLw@kT_bBtleP`HX+cf4C)bwJbrpZbzwbqn8>W+E$i#ULYfj+W-%GQg(wzz-TEyOm z>8ZDrfWO}+$(C_D2(%j|^vyRg@vj3A;{*R4?6n{F3}5b`%K7-73K@o&*&O}1|Hs{- zCQrMTCMgIzUSS_mw;O%<=JsD95Zzc+`P++UAAng$f4+2#486SQUk_&vaTs$)5o0Sj zB)kPJ(aOGjrH)_~2;|?G|HB&(Gv_T<=;WJJGgc8*Z|Xn?CEgE_vf%F}O;X-jYQlho zOwpRv{O{xww7I!T|0W#dj=_)|9J(}i3Y@C15WBeG-rx%cZZDQ`KvQfAD`nyIxRE|WqrID2#PK>PUW8jL-KXqEn_nMN(4uy zR8Z13LlHGRX;9%%QJ~%E!jaU!X+QdZ-#9+vz1tgd;4L{cH|8CW?1;~{}^T=9q_z#OdD1s zmmmHzcK@-N8PZ_`%uhIlYu`=R2BzTWRYJ-^{U1IVm{o5Nl9U5+&%CO4FszBCLQ!x+9{PY@ zVgsg#TE@-uA>#}nGVGrOAbIlv8yHU;=Ydr<|Bi~Z%mLq<%nNbhcFW!;)ck6JAiVt}Sx*K`6omtgcPph=iys@*edSSiFzWKq%%#SXg5}luM zQsenEUPLfyk3niZ=*4iln|;x9cRycny9pQ(5Eh*Njh68)ngQwA_QTp&Fe=QgnZDMr z%-6PC0v_PH?Jfoh{5!cVpvaQD8izj2BG?|bk}n8$HTa!+^kb=I&p#_0*K#Tf_tPS_ zoj?+p2!N<9lCToFkmX10ao(7-BAcA{Ao^kna^@$CgwBCMGx5g!bYKk^b{l9(Wve+Y zYf+7plANozp9M(x9du*D^E+CeD!?9p{1rDrQH5C*Qu|K$P>&i<=NDrlHNod@3vY|q z5`2!ars;e@BC(4IDc8bT`e~+<|HW4E9<{|IbwjWHS)e4II8_Z=76!!#nzqI9WB3T@ z-~AI#>2&qmos~?G12D*plR)=T^XeHFTJpyVU3r&TOttdR_nRk237i?TGFf7NFd+*% z2^!VOO(d=J#+QF~hOdJnJf9W2P&j^(_V3PI#Y@s3(?>5?DpK~e%m{{2GEY4JW`+6B z!D8vn1}h+Pd=HWN^@HKwR1LNZb@tf0Wp*+z^9Ufrru%elzDD12lP>eDMW5E&25<5#T2Mk0P^I6++J!3*E3 z=Z$YEi9sGkmRjmg!<8Suo2}JgQcx-z+tfXSW zsIK;YufH|6v=K{qBf$&Ft=^PEu~4d{kG+kA4JsM_AtYXNBoo4KdIPZwsM}`~1OA-41ZvRS2m{2+Qdk19Y?6;P#8UgN=cPd_!#uaaftsE$hjG1Y&( zLeSkqrg-1F1wU}1`)$)+CD69z7gfcFhOGcCfnXhmj$h47t-7kE`x8>)CyJ$%JAkna zx!bW*q`(C`7z&M6TmJqXx#Y#{4{HPSkCcmA(8G{?mz~>nU5Ww2|FPn^B(VHNv9%bXas_k z;^)l-@Y*|ahFYkfUWk0&bA(Ad&|(YV8Abe=>y<5_QmUQPr}s8F=P{}j zzuvtsK2N71j!|9W>1qD39t16Uyuy{PP#I{>$4Jy;Cey)+mw?NlK{Q;rJ zyisXKNr-#to$r)6f5HfDSEY>KSi+|^C zi|_;td?P7!rHB>DD!cw+t%%5cNJ9UH?4rfc*4#trb81CbP@)yQL2I4pzK+BFDqM0N zKXf!bjun(p=#m-chx3ogph`cRm{h$aoefu~P3g!^xlnSYO_c$Xr!s>VM|UJXvjg6Q z7E3uix^h7v|D)*+v%S@)rxT)%Z?c7EwQO`*XwM;SC`u39 zYn{tUrFxRx&&NNKPsN&;4yNdV?6$nvN>0GF-w^Tc6ewIBisM-&P^(g^A33za3QhCG zzA@+*5N#oGVHOn7Gxg}D>E*NhUIgse6<@Yq@-~VW&U$R`+^k);1vG+4@Ygk^dh30? zzLS}?T?`Z`1umh9W+8bJ+Y2Pxq-_A{3Y1KD3#&GV*2aS3ngeJZFRC+Pa;0d-W?NlH znZfasv~~m;!!)Kqy7+nUwn*(rX()-HVD2x} zhM1f^<5KHEft(sA7#_6;)t0lJtjdW%HKNnapcB=EEdjSY3`TFkgi9nsDM>yO z&_^}Z{h>36&k0YxV0w;zD0{yCsVh`Fnv#?_GM1pzgR{#eR9B|Xoizg0u<~Y_9ixU% zX2Y+!)#@xEONmSQvbP{42M{axC5_?@vAK|SLC8rpV#NeIVDGog2@kbqfV^vCM{AJ- zj;XiF6((NZnr*uMfs=IeFmgV@IT1al!``@*dN-z5I|D5X@nF{W`nC)yGtJc2{*G@X zMZCh%spOIo-R3cHf#ra6BD#x{OhYvuI1x!vKc?m|-y`Zsp0x!I*Fw%Ng8rhu-pdux zq278y4zxv<5a3@5bgGQA%jij9^ub9W6hNn$Bww^Lt#$efkxKa$3C7%n#oD`~k~R{- zv^gOcHX0|#lb3!YvtTlH`a!uTh1Skev6p7E2uamXlN5izPiLBz*PYma`Q+7BZL2-n zD_sOa^NwX}Dkih5f5RO);cZ8X>q(uASzFvIuKLf*r%T?>)plC$RhuTuXvelruF4;lcbJ)bRmltVV zo0pN5qH9{SxvXARR^PdFPH{tfs;)Y~2y)pN=n?PH~6=K3ky%X*JeHY&NB= zOpb;+HA+WV+7YcRn7*Dl!k!o1naiUex3=!aE_h#nov4IdM)+f@j7ys#2kswYC9>a< z=`z6wP1%sKnroFtBc9yq5fR7uEb!lQ*LbZQ)pA@&3`vSEDQ$z_Ief-TsWM7+Oj0hR z+L^R@ZaKF^V6kv~BA3$oEjW+1p%pQf&})2n(OKX#yIhFTg*j)l3nKia| z$xFMKkhFA&xj9`oBry1K(@*&=kB7aU{V(O`b7M(!n%M$*OOFUuSXG8;)qeK0QXS_d zjxEOI>sm@5SYx7VBfni^%vsp-9O6%5Td#M~5Jfjst^fM9p~mZE1;2E4j~Ikx;M zShr!i_TuQiAWgh?UYk4xwZw>0Lj${uxh_E^fQ4eo7&Rx9Qu=a79tMli`ye0G1L3=S zRx}6r`uE-vei81_mD#s>E^N#o!fx4MAUi^tj(87ND*^ALdizC0j%dUwWB@R-EhPbl zw1UEbJz86YpAM;fR5P_qOh9ze&m*60h22zv_l0BpV62%39PiM&MWVi8P0`T1negGF zE?p_Tqyk=U7>|t38n7Rp&Lf#>?ro0v^Ng0?j4C?!oRA8w!B2|q)lPMrPltkfPz}uH z6x}dCvz)`F{;+fD{~o{&Xxh>Hm`&CtrH%Zh+F}Jev1lKW3YB2hLmwL3TD@9bFankf zG1IrJukxr%6gc5Xq)HMg;OMp8!RS!1yi2U@V!$2pvar#^^B8IG0cNy|%!?KDizCa@ zdRHZI^v;C%1FsY#VHa_PIWDPAvv?4Wlp_{X1Gu%IvwxyisB|Q%ZFe1qtB#j>xy7U; z4yc+Capj|KgO|CWQ-`X%>DH-E>m6~XT@ooR`E154Msl*vQgX4ZAnz?_TT3d1b9e^V zL+>X{as}*!rY6WHBXL94tg47rR~g)akwneewo5(t_nFSl#J$AYN(O8$v|%c;Bu9{h z<8ZnS@dczXSj||1(8knk+aVS~QKUDXJLv}r-Pot{AQ~;wPdadGDEBE96R0{!ed(h8 zW1XFzf%vimBicu|06OZFMH?v=JXm)h%~l-cN4Z~xKkS%K#iO`SGP}Mh2%7lQ;n?-& z$6N7rG}Y-Oe>SWJF2aT+K=)eY7n?H|pp)*Eewd}JSW?=$ z@YSgr%XI<$#jRaWjrhF1`)f~j8`Bw$w0=_56u|>~&Ryrov45bZ%zk*^o+$B3^wwV& zTu=o_r7W0i38}`8u7(&&q7AnA>agPRrY2x-S{hQs8QFdcTVIR}mx?N=M_g$nU&Z{j zTHsUmq`ClY1*ij)Z$z_q$JQj{`hYkR^4i5?9E>1|&-(Tk9;ETM3C@~y@Y46NkJ>YB zSur;`$ZPzEgal8B^t*WXs5_cf)H?^MzNJETdTBOU(g13kO`PFSnu@&0_gJq*hi?A` znMEGT@MA8*lXr?k$e|&XP4fZn&};zbKvaGUg1o-<+BG8`DgnDFcOTc4Cvp0~6}YM9 z)^r@bqe9dJBRei!^l?(Y4Y;6~Cu&D}=38c8^2%Vf^HTl_Gn3t)>*FApqSl>=8R?g< zIWavKdKvc(=(_~BtwcA7=sBO)5tmxVFlHE2by&v?AVSdZI6nvd@mxd$K}m$E*K^3- zkEQchb}Uf&J@sfCz*x=Bvs%&Xqj-lDY9{GT3lrEsP5=&kzx)zN?PN#~yKQ=v;mg$- zg(X~J>dyw;4#fe8_`YA?=fzq8seQ-;J}0*yNZ!Oh11iuWD=sC!}d-j z!+e4#>Fw49V5B^*9kUBcM`;xSSE&{Kea0Fur_NTq>x1TP<88%L=EhrokBw#?q41J* z8Ct3dlIrhEsa|G3$Zp=*+~3>}#@FH@-g`^4xe$3oK1vCq$eQL$#-Ih`;WwORGx(lk zEm2Ue2ul;Kgm94zxnd`V^&i@DAb3jGata^O705%aB5xrr-ZKlj%)ybtp! zI91S#*(6!R0tRv!?yIVnXWbv`WAOdTncgk^XcUEgm}o~!eB_mC=bRr-eEc=k_qZ#_ zT;6(J*p@9w*^LNMI}3;Hf>3j%hj%%PbNz7q-QY))VCXEu|t_{In}sIdiBsHVx}up(|(Od~RSwA|40e(;N} z$4Oy&20tS{Si>1|JY~AQl^GObv{mtV(EE)CND#Rr@ z&&m5wT4RG$Tw?t3AGcTjQ0>FFdWb;!G8W2_W%0`94wy-ZY-Pdd9j=C5z4_c?A-rKT zrJ>XI8uD?`_~Qw0qL~l&`K9Vn9tw1cg};{D{N7=yjLgfNh=`Rc9@k5@5LxEwjbeVvU6cr zn)y0fT+}*hdh3=shFk#A4pdEfJsSdQP9d=9({iL8>7s}yAnK|~HQtZ0wXc`(gyN#DMLe6lv;Dx}_CC>kC5N@o$Kl2B zC*#)Va}I<>4I!>uj@7~p7_Z0@YC}F8owpmJf&@$ffg5Nvv(A=?a;6VuG#k*-hZ{R8 zgH&U6lG?kpn9RR^mp>!mDR-Ha&tLQ^z=oA;ZqeNAiNwe9!KUfO+u$zO1Y~Muz-xxH zo%{+@1n}J2ZcEDVwGs$~dgpp6Y`l^`|1fjoHk%tfuA4BSqHNNV*ND2QsQ;WwXCLlZ z4X6GFP);0+Yz2K3SH)yP5ZDRqu+o%#UO6hXOq$MG%ks9^M6b^$U&_=nyNuj3WFSQm zfQzEIm)k)Jhb?fLJc3^CFR`j@P8~emM$WYOs6t?e4#<(Z_Xr5Tpz%Yso~pXHC|`zP z9${>D)60f{_3Xx{JI;n!@Sy8$XWs=ML;Iw6epE;GgwWK|2;HU0j@H42kS#7R3|}qB zTg?p*+UIF?X1%+Okd^ZP^C>B=*m0C{Li;P)mx%j2kcWmF$&jI(0JJaHnVH+dbwE-8 zx;x2LSa(U@{pt@V0TgX=ET5s~%9ZkxrBYM zs}ZL@W%DrLnGFr~78l*9;pq};k9w)p-U)V0gCU$Pm-p_+rXmWvd9#DH4Ps(95YxTt zVQRxK(u+hZ3pVn(iOSB(>B;3PXOg1EaJiTaQ0vKpOPS@3=&`z#i=`z%+KCYrVjhGY zQsA}KWW!>`ApxSqUcnH$W_lP=L3zxlKUVh+-%YdCn$P#*TYi5CtR*b4$xg2{ZOSOx zJj3|*#d=NV9Rb&EcF&!OrjNF9hL(7W(ZeI`QBY~|YxHf z(#oo;j6%kMhrk&EJc(t`^vUo%TXkv~G_6h~3pvH|p2?1LoN&)0*+=y8a!#(+UmhfB z6p%R!$h(0y1gEu4vRMg0_q1XgQwsZsPjS6WVNZ&KS#^coi+~htej1&WuvlW?`hTzo zLFc!p2P3hGVNI~yMV4UzQ~<&Xrn^iD@JeOejZ%W<{xheNsVa2)@fLzVYy-GwL&c8? z(l0fkaIQGKSOtFP%)U4%)6T!m1vaQSmV#k~xwm|1mWShWqvfdVU|2OXElt5ZV?_Y2 zh+HEl)xy>6`W3OKhy!6_O5R}`lsF4hb`<+es}Hb3pW;%nAcNDwv~3J+QAwqM&q6JG zMKmj5Io7q`?I0oF%+Q80Qa9j@#hd#~f+#iI4CPcJ6HF!}>W7HvfuxT4hCIryWcV>$ z!}i90#MADmq3cB)nEFMfoHkxHkKt`HO&WkWis8AYA@zR~yaQIz>OrSg~v9rJ;2WC{PULSb7s>6_T+R7Db!~(v6$Tpla zQAX(RP7?Vrr0~W#H~Fr7mg5(SbrW7vFIYJ8ao(A3iE zOy;8n4UVCA9U;u6M5aA&L2aMlm}ZIXX;dJ^ATsiNjazA;bUqw646g)ti0P8Ze(QYr zyCdrF6|~HRwqthS851znKcfsJhW>XKvN~@*J1@Q8w{GAV{zz$N@2R?Nw9;>u7U^)& zX1gV|4vKV;6~ZrzQdbQ{6C7X$IrKTP*50c`d6xs-|8hj*#9m;pi9rKT`ABb11|D67D>Y_6y?+8vc z>xsjLUM44ioXRz~_3cfcQF${e2@cIzu1MPqyr#pJf(Z$)n5KTMi*QXc-MJkyIu z9G?f2C=I7^0xxk`cx=d)zei}6xc4F@RzJr-5!+k>nD7*_mY~~$dd%u)PTLJ9yD=)V z=zrE{UKtqo`&iLBGe=~UxeqxCRFBeIyCc$DGlIAp1mu}H*M?B_DNB@r?Z?_yNA)+V z$+1CzcB;Ci{_5&vNK@F)U(Kz=AZU{sFrIwNgEzFe`;$V`vzP63@~2$PwqkU3oVUx* z)sf#ux2IxdgYf0YHzZp6djgH8#xl|BKhxX3Jv(G-5W&s^5}!i%1q`#3B`_JJ`;X#7=XTYs8$4Jf-a^QzpiF$bHBDsQ^F^RfTxK&nlmL&oB=`e5Bnih z&d_#O$D0r4d)pUpt9^CDA`jdm4aUXkgz9F(30^gL>z~q0jN}tiZj-plSQ|1sr11Sj z+_aH1CB{^XL%`*RGj1!5F=}eivp%`-(32cQvj{hh4Xsx;QD5vQ^5{!g&f8``%T|dQ z1yEpt&U}Og5TPuKaqVL2_B)2t5X(E4PvjUoUJeMquxiH*MBxkfQyGsqp$f5FDo1>Q zw{-Tv5>dHcnm1z<8<|HJuDN=kZNBxg_Y#qLu@vVy>j^7gx`UF-n?#{>_wC(^n=4D} z7F8`CB`6o)qO`mab1TQk=tI~B)u&{W(@&vXWtdYED{#UK-+sFuaxY!*T#yn;5TWQQ zeNXv|f^2ma+~}*zAhgqydlax?{ie%%F)@f>kn3zW))Q!6T@;Ga%xw#tPO6nz>ycXT zjYd8R&p3T@aH>Yci$Z3mR`Y3tSr+#{teC-Uq5kC?s`HBF!IwYbr45gACxF0*L{NLV zpyZ9p&T@hF3n3>~4u!jCQkFfxj^MSQdm=IAu@wG!r!N*QwpHUxPsc6GczpUjx;806 z>*0MswO*notz><>dv7*CC?D^hYJA>nX#rrkXHRnzm(+y9jk?3~NziPKEj1bR%s=H0 zJZI#=VQ(@&$g3`ibqGo=GdKsR;1H{a7(1dPUqA(V(Rez3;8z^}L|B~l8>&T6Ag=y- z+IGBKYENVy_^Bz4SWRWO-tlbWw$@523%cTZE)-ayZ>=_9rk0Qi<6ahh9T4wDY$_&6 z5ocrnMnWXarllJFFcD+fX_V_{+1!C)=ykKceSr=8!go#o7B0GW1smPK1Y=Uj?NoEaTeDh zl({~&5@8s+hsMhknHx%A(|<*C$bGrcREOUJbspqgjjDDuLEOb`^QMkof`3a?N`e8N z>)edN#_WrmBS(2QNInoFPxOIkm8;%agQmFIh}9-PJFa+=lLiSpZ@FF7{K5FtVv5{C z|D5QN*0%%KpI6^kN@B3Y%?OG2E}fp=3%~Bu?NMErk~ggopyr&z;f@&8c2vM{+}do%6Jd!4ai2XMzr+uYH)kzhEkQ3EvI} z`g~uzef-v>)i!E4BgeRZawYAQLL(G>)qZi9$;#WF7T9lzNwxA;276AZ8cG3Jg84@c zE%tWhJc_6Sr?&ZD$rLDem9yJ2@D>LgEUoL55OBlO>OUMJax9gG8qHk*FJVt&mMYRp zv!18ocf+|^$bUS5TEsnJv)Gmk4TGa*Q>zjjgqOFaAhT%*cpo{$?JxB@>Xy!>ADX=b+1R)L>w zQmhQ*+rnX;%hXJ~FS=ERbr2FVn2KzQ{b>^o1iuro*CM-nsyOFY0sU6*p;BK)8W#tq z;dB-idCKa+_ne~D7=L;W>}jlU10F^qmqr`V5>9;n&{OQmRJJaknC9VhIQ=S!n$=N1 z_X}7r)SSt@m(|LhcIe7m1T8|Eb&dJ+di^-q3%;|0Bz4FkVI#~r+W!~4qe@#7Wx~~P zAeA>#?_^dMZVwa?Tfj^Yw{#dIus~9f zrHa`Q-S4|^>U=Y+6R6MAG;$<1LJ?r}E_D+^v2!isH#e*DXwQm2jr4{)lM*k(o@70L zJir{iXBo1=PfHmS;#Sx2fjKkg8wKCRL6L~xE_8eDC6zU&$*@CeOMFrms2M@(%f>_1^!lY4QDjmo1jsFY!yaLlGeM5KJ772{`N8F16x zoLU!u0?w65kTS4*qw6DNzNs=LV`pl4Xr*0sA~*{O zD6NiS8o<1U;wh3Vk(zePk9w4RE_)GuFI_wHhIh={^%LFgxlkHk-K-3$Q*TPAPj9Ve zw?L|+Yjzu?$hjA-3zqwE`=#4ZJpqhYe@7Qy!9jQJLf8~8Ksx+x zUHs%xCyD0NAUriEoSOYXPJ%jWh0wWeM=zweBW*ShokVUu6*|XsJ*Wg1$I*Ka4^O_P zqCdhD;7My*;{+d;diesLXx9Lu(WG=HXs2)Tz{_&=ndn?vhV+xv+%Z#!z^#0pabZvh zzDfkL+IaA%{8@i1cHJx0M$!y>^f)1EyFvvnRMx7ON_6o zaQM1PU*QgFu_*Z@fF*t|XJ;?y0)aq2%=}G>Dy`&6vV@;KICQzNGDJFR!55%YaU?Avl<_@K*(oE-3CVlAxU|nryN+o{R5+d$6kMa!#}^eTx|518nKzD= zEfhM!sRw9dM*tBXo~1LtXnmb(_s`wtZIk*rpP5Uo=5?(qFp9`ayn50C!u&*f(-X*q zqQQIZLA0)f_R=0%Uj&-D1p59+tjiy53|+1H;C_E@urZ%T!92a=npb*{;YO~dIKvG- zfe^2*u_t%jn3WV+7s6{0q7rx%u&^E;mJ?V+G1uK@<2GB%?#F;YOH_vhaA+p9^y74~ z0kt1jZ)#plJzFw8bLM4I+UP#vN(GhI9xF#;Z8Mmnc1thb)S;6=m@Iv&S*=jP!`AgP z@i4E+MmC8!P)?EXmt&R>pUsnG66`&bBI?RKq86Z;N~@+o&1lL@(&PFB!U>+vsDRZdZts@l_504q?6gZ+xRtA!TJ8}i^Oq1MqVULQK*9#r!Y zas|E{b+Gd+KgGC7Ah&;8=WZJ4O&`--pxhg&DU%q|$r*lrmrX=hx_^PQ)FE(ssTuDW# zw1VG@hjc!so@fx2IhaiXXQoL)?}=T;i|Zv(RdakPZ;y&tv4>O~6LR3k4;`Nz;Cf}m zBBE&gc`MUHoXle@;RJC`+wAncPHBSo0H<=wa0_|m@5tR@I z>B{}pu|B%2LZ57_STr|kuM?q9t936r(-5|wa7H+J&hO3!nI+U|dDv-5c}Bi(Q6!y2 zyUv`D;DjBQJT>pBDv2UkR+(z$RtSwJythO^Zx9ydR&OZuxC-zO!XTJeQ;{r-yi26BeCSLJe^|{$Cnm+V zPWm$J#xpKv1qZhftR!UgyvU?fZIQuB8&0n1#+>}LmOwi!ocS5nyH`AJ^?E$|Qry5+ z*3ya6gGMaBq{6JF>Z2bX6SM516AD^`CUI1WQs<2nk7ZS%$bj5WK)_b_*~Yz!Pr*Txv1h*bY8R)J`EmwA4qhah8jgK%zGX zX`^=LR;E!FPd$8FNM_OkXpbp6uf;mHOdqgGZIOP|$Q7^j6rF`& z56aJQ6)X7r!yw)_=jmLk6o3)A*ajIAo>AM7y;%*=Msyc$7CGTEP={c^YrK{{;ppA` zZa;g;kaV$wjWjQ64ataQ`@^Pd8FS~bB8xKGo{YJthnlHuQ*$53Hs{t_N$m;!ao@AG z*0`lcqgP*)Y_y8D_Q4JN&6NQ@wq66Fvv^MH8>;nseo5&nT|fLJa_1W5%FyqvNo*xZ zD3}Tb!3cKHkUwKf#w9wzQFw!)o*}@-YWtua&C67$GsOew#^NI2>A#UKVxWlf&xwn) zSxhwKE~)NZ+$?}ad5xQBUUmAMqV=VH?;K914?R#jVk^Z_Sz-(j(^Ds)!nw2g`cnGq*Ot@<0G1u%S~vGcQT{ml4v=>5#?11@Iws5CYOY g%w5bKe2!MWqb;lyC6eX6HK}I=W5Z<^k@f)o3zX`rod5s; literal 0 HcmV?d00001