From 9dff9ae98afdeeb618b69832c1b4b7d87c3c2379 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Fri, 11 Aug 2023 15:42:43 -0300 Subject: [PATCH] Thinking about Actors in Rust --- .../thinking-about-rust-actors/actors.png | Bin 0 -> 44290 bytes .../code/thinking-about-rust-actors/index.md | 97 ++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 content/code/thinking-about-rust-actors/actors.png create mode 100644 content/code/thinking-about-rust-actors/index.md diff --git a/content/code/thinking-about-rust-actors/actors.png b/content/code/thinking-about-rust-actors/actors.png new file mode 100644 index 0000000000000000000000000000000000000000..bb754254fb24408642a3cccfc60dbcd4cba48b31 GIT binary patch literal 44290 zcmcG$by!qe+XoEe2m^>PgouE^&>^XGDj?l0-AIFUgCZ>{9U_8AH%K><3JB6AAT1yz z^{wrB&Uv5jde8g)_gxo%7|hJxYp-?Rzq%((S@AJ0_8n|AG&EcpX$e&{G&l+k4V?{v z0siF)OXVvxG%7S132}7~gRKm#Muo4_JtPDVN1n^RlTl4oW46YZ+*jhFl~oA|m#C!1 zjiY_18b_U~o}-hHgM9a#@wqHYMJ8|V%Drj#$bMR6ZOdi2?)XADYxrWudw9|tcV4)t zI`i;`NAmg3zkL{fU=cC~g|d0C5&JJU5h|ujgygmy zx__`b$X%#a%9F^f!S%IJt5)<%0rx3ZgTJ7^;E&V!-81bhVkXtjyOgC{@?&e;k8`eO z?Hs4lf23>A=X*7u@f%So6}8;w0O;A@%xWTwG7W58^r7`Q!Gy$srUc# zmP&8-=vVBy`t*9S`N-h4_|+@dbi*guUPWm-6)W8WbKZ7K)q}ncorR*~!rz5ksCt|f z8@(9}D6SW?TcxB3v5mW8tL7g!V>v4dM9aLJ%Rcrha>FPV{NXfr#&$Q$hmHHzgoj=9 zp?=XYrT@9p=$l8Fh7x{jv}%5hrcJ}rTr1rln^TxO&Tbxz6FyhVi{2x{tNbeBF8qlr z+_hxBT47cDI4V8#QR6O-SBZ-urk#s;wA?R07U>jm9ljpA4aLTtN zN_mFj8xddGH?W-j1o$wv)hf1Sekn$1&Aq<&WFYl{&A?Q(&0wBFn*2&%qQd&fyHU?fH!r< z!IC~=m(%a+%y-o{w)-P8WB7ENt>>&|K6rtAd2Ho;_g>Ggcgx3gfteMrs}SQaIg)m< zLk`FDivH=lGZ!xYt3s_iJc28A!+U1~r3&^Ua|gkGYa(ppIP{4xXT0q{lgKqDH5eK; z^?0AfS;fVK?KWML5ZDOijp^~mJ84py$vV|1Ip+R;93uaV>$n+@pqko>;<_-~Ey|Yt znTRN}A-OTjmX9N+I^xr*Lp-@T1B_OJss-FX+PS{?#=YMbpT7NzZv)56_Ve)DAT`$b_2*diY67d}8j8mNtEAVx-#v|{w zn_<5cj9l!?oNK#AzIHrb z{G`@6QX_MobI$o>zMgWnr{VN0aW{QAeRn&bQtOys@zig{BWv{8{MAm4*Dj9xtlzf6 zFOg_1gPgr-!CIH3>QP0(6l`MV;b-e3T?tHT^eIc&KDL2G$ZME4@8b#oiYd^o z{!qVF(ZBU7%duncn$?=ant#hMwsU0dxyOpYJl%)1=DKNuLOk(Jw~3_aBYwPhNlCSX zbABG1M-8{iqn(Z)%yEjBu*>4sKI}Zr!fZdCzDPMc(C%?;JkW16Oh3)P z_UMy~-#d&p=h}6m2Q}=P^#h2mz(-XkJsi}tP2lP&Kw+c{LJC}ywYjd=dZ`Y z{wfkLLISvZoY?~!vrZ|N4NgudD0jVgb65?0=bX>`6vl2Hn~Vzbx~)d<49^}61^Ml0 zl~i&Z4sl*=M7Y{kWHF2;nN4kFTnVJdG0~*d)bApBTe1&5hh@xft_$;iY2;3MAl7*5 z%k1L5OFr$;Y*?ht*>KZwqQlZ}Gmff9z?{E_o_V@7N^#cjuuGTsgksb0jVZ<6q-9ph zgn{>vR`ZbK?my~|rp6$#`KHHrW9^FVd0}pE7+SU>XQY*u0yqrg7u90#W)jcQ5T=%1NgH&v++OZ*IT7 zMG?=6D*uvI>oSuKd6!}dG0z;2z{Fs&hjYTCor!oYPU20$-TJ-0cRTV4WVyJCEy3hz z_BZGJEGuz${PLF_97u-_t^KmJIvQ*)^HSd}SiKik( zfe%=1@5Oc2+!@>Rje{ovd4;y_WG2=3QikLCc~n}O>>^x!P`7rXcw4xdd}enaTfR*7ij!f{2WNA>_7y9g0wOB>JC?kYJo(-;DxT23#Fv8gC$aOA=s5;X zy3hL-zmv!VHz6_m(RGlmVavq8_wcKH_2ZTBe`}E6LtEQl;3!=DK2%8Kv6COp6y_cY zZw(LScUeuwz`c{aKAN9)aWu_N6Q%Oz-x?*Xo-P2hGtHsddUYrxEj9$MDN$uRIdcAc zv(#cFSBBI&6r1?pI%zK+?B!jr_u%bciIc?GV-y)&5QFbWw1P4v-{7`Aa6Ipybrf=4RU+oza(3`du17C# zDtKR0&;C~k;D<~W^=~fFD$Ues^eAW2t+LW3BaucreUE*dTB6^O%2L|MRh(GJ@vrxH zP9tU&BH+4VMl11%O0qK$^R88%V#d>(dyu&zqXI?Uzh(8jJ@T&;xMxJIUCg*)Doy0wTbN7WmI@y-pl;!Lax(u z`2K!2`q6cB23|@9dEn`|#i=#8*^Rz^jOX1b@i+RTs)d7-py4v>I@ih zz(5N3;Ms0V))VXx`v3geeYj?cp0%Rr#j{G|ju1P$=JWl2g;Im2ntsW-d?iY5pOc?< zJ?ih3+ahmswv#(`BHyeR-eLX^gjAvBuo$@Q(nH~%?0K-7LO>^*TOEO=&;2=IAVYAX z@ocBTx>)~7UCjHOFwQftK~|^7S&ju zpX{xI1I25Z;rhDxYOjZqm(u5FVEvDrh@wOZ2%~rp@h#t|^f`6rw)#wU0B$MGd$(zV zh(&YY9yJ@0Ln*2ys7uoA1%rj{6n*1<69&EDMhDmuJ{!!pZ zcJKf|41@aav*wvz8%zgTSLZ$W!PxxYV;;!|W8e;S;ECE^SsuK#o32?M7QL$K3pI`A zr!U;rH2>$rujJ6^;F=L?`HBy`x2v^u%fa=PMeH36i;|6a$o_-o&#@NTrOnm{(|C6s zTj#uY?WU@%O?9iEn!8Qg)fQ3vtiMYdz~!AWvTr`MuqlXDs0Ry;OP_&5!ggP9xACCn z!*0W_$ia`duTqb;r>CN*;b{Jt`4|Fj)L}Km!;0I|9-?{2y)jkmDN|GmmH;y`{9!= z!@|WZFj2UV0jP6K`X8(GpHCF1F|g?SFTNm=Ki-+O!|%mmt82wb({1rBo042koAlCC`mTWb{njt2*8!?jK%&8Mqrb~~t@k3SDOxfah4hLzk2 zYZBeJt0z)<=R7)mt}c!R$HdPOL|m_gkCLOP+axf%UTF1Jd@0cvR4dWrZ=hCvCrdo~ zPA)03TIYJi-~H)a6rIb!_xF1K>gigR(%GuyLrICAXo|twc|RL^rOYB5)Zc^+KNt=9 zPKS@zW_;k+?)>~QBSQeqYa}BUHh~y{BnEw4WPjwa|HWYv^?^h@y@IWgH7jXT#cuOi zDh_+&XL9eY@;tA@jgTvDICDilcLXf74*z_c%jg^HUzCY-$h! zJ84+tYybn3?(SoN6R=eyhme0))}Q#TL9tHf>-kwc8ikq)ELqRP5pMUJPnK{R;%WZp zw-^?N2m%|>H8J6(ohT!4ZZ-GHEC%m*?KctyljfP=cdnp z3V$yhdbh;r3Z89GePyQpHXHK~lRqIe5|);+1qwxYOuD!c==nZF> zLD|p!8x@qCx z6A#$-m$45T{r7FZeFgxP_MP10Zfr}nAW7kHG*&KUp&Mj81Fv6Iyr{!x-Lhsm?NP}# zx)8%)`~Bht;x%QGo^u$kYM42!53cGKM`sGC@=@-E zsXdYaz-dHjiwaE>V7K1vyRn2S`)v6*SWGS2sJIm-l5#(%?un7Gn5?p>TqHoj zy*J4DK6e|pRs^dXPUyR5L@5Mbmt<`-fz@L7OttOu>4`YrYx^C@Be+Kw+8`d&r@eo9 zwhPeul(u_Rmf!DBmwZ7e_;t+J|AWN>DX@&LtCX8a7KR!f&}PIbBfk`Cv2WVQJhML+ z{~w?{O=v_txOCebT{bv7=p8KFFM(tSEus!tR_1@Q_|h&_>DKYq+||zxyqcRmgV*RV z0%@?Oq{+&nTi=Z!iD)}BT3yk*(Dr*M{l8s3seYQMK7(N8bZl$A11m(-#^@4ig@K|o ztgAxs-eoAAKTkXuBM)@b5QQl1hmHzM_ZJ=pnm^Ctlf@+>tIJ)`6#qN~z@_dA=HV%p zU3=7WhWlLk9+h%#D}XY`HGL`9@Ps&iyc==)4@yw}fhaQ$Lc!d>+SlZa{{!{?QXI2>pWOP z!pAdqnnaz}trS7MNUO!|A;O4+Pobam3%R)LbNl}bShCiRXTxV+l^cnRd4 z-^EUY`muKy>I{rd#bV?bPH0nF5Qsi<`qyW&pD#E0{!>>OZQOj>~Q;?TC5q;#=tky^D@fPtQ4|| z%;s+MzV1)JfhgQ+r<4nmiKn;A4>j70HmB)B!UPDi(2qlqG*a+r^Tl6lpa+(RBTXI{ z=>%TC2JY57reaJbnXhNmVCGS14TW6j=4a5pZP1;;7CE~c0*VfGXFA_@)#w&y|Lc2| zoJ^rl#9PRzmoX+K5b`qQVRwbSz7f5xOX#eqlV0^&*Z%wVSmC#qCym5NVs=`Gpoe!i zbSlb|Mv(d+LIE~0zA`}sMiBKab!}w^Svr}YRw_D+p}8TB)TmiRV*Pgw80f2!Mm>+7LB=r9q})lz?xzW){gs50OP)iCjPpaG5O6y0Nqk?efp&}3fH{QK#_cI|vB z`1iafB(w6rzSbWBalF-3n-Wd{9`&clh^3L@#V^U7L)XWP)7C$~c{D}#=KtWnFI%(4 zg9mzJX$DCQePWNKt^+B>VSY|Njc3s3@^mc^D5usAq1Z%!qt5?+RzOZU-1y4WzQ*afbsMz;z7UQ8Kbf@oii(p8J3!Ks;4k>Q2JZ-49~_ zIrsm4)%by}aOvrK`&j|9OlrcoDwGLuPIzAQIJ8_?gy51{KwCk+O3wUWl`FH9)`hm< z!PdZQkajny@|Yqqb}C*|g0I+WG%v~%+{B;^Lxvf~joU_$eiC_K`NhA#Po@}vfP+82 zyj3XFES8^d_T|4cao{W|V zBBqMjE59DTCfBUBgbw#1{+*W78+)0{KC2?*zBl{@=RNxmUayq!YU2}~RH(VSUeDvVb|TEOmzhQ7 z+qcTOZd;h7)acjQU>V2MQ_!(X?f~9_?7PQq1GhmIVIs+<_nOPG_LCSdg2dg%w~amZ zSFesK)_Ta~(sxbux%0QETs`_jC%UzJ=sygvM;zB_yLJf<&ALas_@y5wo$0L!u8}(k z&SZHHANZ}Y&0n}T{yy(x)UA5o^~1iQ_D1wxO@_-%7Vu^KU2a~DiX4{@t<7=OCrGbyy0Z(^ zUk9{3ML1z~*C5}I@|{3h1K+*hL=j2z{Cmj_n9~w#-J6D}%c0|)`MEP*tBbvoQbXan z;l>Hk@xxGegT~7`OvG+(8)^DEJ$nM_^YSD$u8RXjDguS4jXmDeyBT_QS4!$`T)qmx zRXStVy!gcRQ?bOPNpxwpC2S6NNSJW9Sz2962t)jgd~*`vtUtSZ?!k)vJ38ukj;&Wv zbo^v}^~d(hvvjlWd5K-;mSc%Vo7i99J6wXi&wq|DPq2$#5A)uVzCYKnMs*XX#Zw0V zgjezGoO6DHz~G3|aF5~PC!-pAaIooLv4Y7z2Q=`BN$ad6|002z zo`!xL=f?R5i`*?P8N-chCwB7n(>o%=XN}&Q`-1E#`xysK+s8J+$8*lnVH#Prwk_Tx z{k^lI4!%2HGrM?e9(w@Mk zKb0Mz4Rn~vI;Xdj=1KYkq?YN%Kr%3A*7%UH;h6gKyowP;FrIVmA5H4N|KKcT)DeQa z3dC_voLj7A2DlJ0$E0``!w(FHV)sWplHsAYBbxgE-KGCVx4l@>NR?g(G*`oa=`$5F zV*fwAa<}ZW?cZ5|zdxT#d;!w-^c&o&C9gmqT|HTT#T$%?#{)V}zl1BZ+W-3ssU(22 zj`-50swPRr3QxUnZDL=)a;p-w#Wa?Zx^~E-%2Ub`f#`tode9WpAH)@t50{E2x6bsx z^c*cSel%Kc+9PE5F7+?94gZzc5HXUy`6S1Bs;ZzQ4iPH$9C82YSnsdx>50bUIqz|T z9H5h}0=b-n#K6P&xmQ8SUoh!=P-{Vc=2PgH+J9W9cloNJwUUGN;jb&El7#VVNU$0< z&)j#Io6!Thi>g$v2es=*#CJk;w}PFfV*?;}+Z=#Wp9X~7WI`pOFMxZqW~CO?5TRg? zDO?i()m4%Q6dOmS^s5Fkls=Fqny=k zfVEy!U^+7jTok4Yc!QL1VwP0<*^eo}ShpzO{2&XLpi+Ya{-alEJISS1W2*zCSBkU9 zS3u$RIsB@X@-DJ5&A#41<0BcZv3qjR$5JYdj4i}@G^wpdQHd!n!=(3dU8@72|&i8uq$4E1PK^fx>OBSg33H+6m zNr0ek5cXsWd*9)*CIVTL)K78}R8Qa#zP1?7v{RN|kb^Khf<2Jav^yEx?kp=1;B2R= zKG~bh0;+0p@^ev>i5eMbhQQA+fh?5+xI5*H3`8w1;f_w`B9cPHCM}Df#O|!9(}E{g zVNs^thFXdi+~EK?Nsrn0OFj5ie)`suF}fr@lgo=^Lm+)0Cj&`+a!2=#Rp+Z?AYx3I zaP&;PFVj%6jeCJZqAU5_O#x^6tCs&;DYOWI)o9Cfrw~s_)|_>pxASM#DoNje&iAxv zEUOdVyXCr)sFezY?v*$wEtnEzQ7a**Qu7bl^ z)%0=a=_`R+|4D-uPC?9x16?!cOzWYST&?+l^#mWlUi-B^5U^ z0~bdvmfZ*T_{5CYX0gRwqo=sy7fzHiBUTIsMbZtu#j=3+hAqvm-d(9bzC5OUKgEDuxSGh!pyO)n0L&viF@A4|3^hBGTLC$>+7QIsz|JOW zj{eZ~hDL1T+pOF4pnNh%8%AY3RQ_I}p^w~FGVs~!vWsGH)dS#Y`}qlIueF?^q5M3y z-#EzLN~2(52z-asf#K8%h}X^RV{qk@O8^_j>7uoT>r8&`n9mK9ZzgIPl)pwc zCdJ2s?Rc9{x=jLZHemU{k=AAXSrOtp9(v~N;pW5>b9lVu$cMqy2mJ}`hI5xOZ>M9S zvQDt1`1Tm#qZcO9|fpo@%X&5?{4;9pBOXmyTZdAy2*=d=}OYt$EUU(A}BA~75f#8_zdUp3+ z2f$I~`W=&RI$#c<#vUC2|8_ciO?zr-LyqcU7^0J=H3YFEWSa>gyC49b79IsCV}r(> zhx_nqCCSiUFvwPNV9n_Z-)2!|5e)W%!)ZB4R*@K)t1fu-&9vC!`V}h^D#(C`f&q3a z9$?> zSp5OB7O0um;6U0iyOx7or~{Je^jAlKohH$&Pv`|7GJBjSmxrGK{KxefMNCQu>%?b% zQd6WLTvDf@^08t=P5^5loqrUBu4e7oJ_e&NbJao!7{JrE?nRTi;dDwHs~{XqXz%ja z&sdRgVp95)QBMe_692VUMu%b{HwG%D+ctYGvwSUPiyhmHEI$AOA^7aW)2|;w#8jrL zv4;mx4sWBw{$4-IIPpB?Vl-I$gknYnNxa zA)B)e$2VUbkczWT#=79J`JddY{PY5~AB4ju?a-mFYleV4=^~xVZnji2PLh=V57D_P zX!f@#eSgL37n<6wBAC9Ehqnq3ang&uIqs!-rJWQd6?KQMO18fM6%>t636tyu{dBC>+eqcevIZQrVTt1SnV;g?$=@b}9OV_2j?%XzqWOhdI^dl|nm zI%5<_`iM|)@(>6}($h>4^GUjOPxqTXPiahz%lF>c)y>kDxy1$$0qO6iYA?Q4X%dDw zLAIvGOJ8k$H<5(^;l_2xN9K%;61VaM^>(RMUwl%9(3TL7VKHsIo@70J?bdFoXxz zjk`kMbRQMzH;e-+A{zkqk`Lm({meI3{f}cqZyVdEE?t(sI5Z@!(~bdLhWAfXtOZGeyU4EvOk5 z``9s1fdGp^u{f&0l7Qa?@JDShUxTJx;|m z-Ei|0nW1|q?f2>*)IaU0FAg(+*Y*0ta(9hCcW<-}7cYSv1UD!OH5%%`YjUxk^yQodJHpb>1aoP5u_D**e&>tU7ssW zl##v6Dq;nd$82gwT(%e0O6|LzfK!0Uy>zLUw?#= zG9$SumPqT?)4iK~z%)K+IC!f61F>*xtjbzVP?|s)0-iDRaKGQ{43BI{&LhgrjEeRM z(bmr>8OjUUP2^7Ejyu zPosF}LhGY@xDvlP`31gkDFIH9G>G2V-FIO^{Q@WVl8}mzF0TZ%ru+Av)cmq5i%(6` zzvo82Bs{HnM;Y}t{*^WgwoV&hh&sL%ywG$!mo}86@fy4k1A&jfJtVkWwb~5-z^axP z>2S}Czg0b%vpYj|XxFHS8u3149-u*T7)V8yhqJCSf&?hxZJ^QP1-fpI>-68B>jLqZ zo|`@%N~W&ik}5^ntw0^GC|@c|SoPh0oz8;#{A{hyFmPSu2 zW4O6hm3bJ|QfC?&$Z?3T>>cJr$7X8aTjOobtU<$Cxvm|}O_ zT9*GDWQ0RSGw+82?dC*j?STTciUuBw*VAg^)tB#3J~Iq$jfR&g(^w4SiJmV+SON?= zzH$2ci9ILC{zZg2g3RerM)dyeTEWN8C81)16(D;~S{1jI3ALOY@c^-^ce06GjXp;+ zF2h#OWSbBa=n1pAsa^XR+zwFZ}A|RFhkZ@RQ2Z&CU>!czPej^AdjuSrxGQhYm z*{6CG?4DdKO0q~wb^UCAV@}Off{G4iHb6!2fUrwDubN3CJ6@6sEfA#Qy79lJpna&F zb$b%P{S2z)w-NY7ao--ol_OT@Z-@B3kE*8$c!CjoQT|^1&7bm;iDn%KrP_iY27M>+ z8v#;U8tfRjR?!i7n^+@U@gszERGOpwS`rH_4d(r~g2QG33oqRSYy%$&%UxcXyaaz& z0MR6x5f)b(+dultAUY{+B8taWOKF=JutMdBM!K(3*!!fy5VUeo2!dDQq7<-~wstA# zKnkPlu_<#b2vD%hkqzI}`2}Uf#7@f6jo$79SL{<0DrkY&O1hVQBME~;`PDN>#+pM? zg?j>?d95XRzvS9eWm?1n>NyH#{tblp@WVt32tje_76ONH6^gv!-nlP*yHdJQqV*LT z4r`El+`E-2n^Iz0Xz!wrP=ci96!R8Bcbx%jjY>_zEZ?J)!RINF-)B%uMU_KbaQrwF zDy2WqRFdinE1SPqyF6!*k`)=KhZLihGSXN|w8}{-EX?+jq`H9L_56-}M2^K%^~*Lt z%fXn@3G@O;yBx26IjaM9OY0Fl^eW)R0XW81!J5CZhE`Tfq6{V{P=K)HvqWY;Zn*+s$^rvQbL}dfcBgMSxhUQ~V?`EZ|YV$)jXq zF8i3fy6D@_974sOA!b}B^euppY5^Wsxu6pPQu=i(Lza)pte3J>6}Y*{QP)PW-d9LI zkXXAR+8H4&#g!LI75W*tu>$}h64nX>X#GZ~*{A-&nGr`A-AM*C4*~E2bIK)@IS3@j zH)8k=2@~kqfbIm6SBYta2b41j0=dlk5`5ulaHOOm&GJ$%S4HQWW5SOrkygyJ6 z93;Hn*_*|;0zhnggPQ9aeu5I%>&hH3P_&vMbHEd%hT@s2OaZqeU9RNyzdWzQHF*=% z9z-MnhQPu-S?T8lx2xhoq*7OvVyq23=t%~#4-&WhKxUOw{uX%9Y_Qzt_kf3#y#&&; zmWslM>K$mFpaS>hu;D+TpoJ|`1qfnjDoKVD#kLEQC$aA80&T}|%CisTWURm4P6SI$ z6p3a}3baYTk(7O~I*x7<0BWkZ0Ntl+i&*?#^VyEz0f1z>lm?=0bf!NS+VVhJG0(Io z`Z`T+CAjYjsQ`Jt+|%`$`pT$W7G&TvBp*n!4U8&@+5sIlv#b~F;lXs^@`h~5OL!km z@0lrg98;xZFVnE|` z!5%bw@aJT*!!~Aw+(~AokOUixf;MXdN|?tAnf0Mwj>uG|60rK~lM&vt3Vv z^qPs8)qe^{4%`tv{~4?>N;K?CW0mik4tBK#7KBC9ow`Z$K-1^BQw`9Xq!Ca{EkH|x zq?mD8woGUw!OdBxQ1f14%+KjPfyL*9wnBs$UnHEuN4{bv(tsNf2m~>V87R|jvA5K< z3bN&LO=5}oOt6!}N-C4a1(7|%ZY0qdG_C~n0T+U!t4>0ts^dG$03J##Twyi-Y{!AL zCbvN-KZPk3uObQmvhM(7TAMw5xzCyehbQ1^aYBKnn=fM(t|{==FN6tF|Ap@qnJG;= zduKSWO0|-8LldtN%IjT~)rB#LUY%D);kE67x>qJ@pTc1rM9OUunIi06V{FM9YeFNR zKBkEb6+rKP%{?qM%8b&MmX&B#Kx4t=;g=Eo2DEoWK9G2>av@5%8yiu# z!ws-~E2PD#h*|Fx$h)@60%us^*Navik2{>%Uh@@X zPwJ^0HJ8nxKegn+TBvUoXaWfb8J&lgdPs3SO!{DW*-yfe0?s$-LY@_qHl?uTdc$mFycxe$H~LpPW4S5TF{SB^a>^6n z!EM{UX?^hmyw%lHSu z6gCk1G@@|mcolUn#gRqFycmXXH4?3$lR(>mnlJci;0HwZz z;0A8|!%{xa$Iu+tHW3ouR0pNjfjeRWjXq^xe1S59o?-#%Gbd(!@0jt}q@Je*pcVtJ z-Q)m~?ji?vr(GA-bIwe@*deU!$bKmZfnR!@heG{$kvhOZbjKh5cDBM?Zh+5haXnTy zl?etAUG?k9$m`nO_2$3^1w}3Ub!XK9ArUcS!^<0_aRu}r^pK(OKrrnyGISR2WZV~y zS^^?HSAK?DYE-W07fBL3%(Pi%d7H^ulZn1qsKKwIRy^KaMRZ;iC<1$t@wQAq*|2Rh z{-UxLw*=Zj3q-kfzn;Exy99--_~CT9m!rJHOOTQgIoslX)cMQo{xRuBNI00bl8!^O zZ^;c8gc8uHClaL3;#dt{K8{2?{sdyV?v5R27svCstKTE9feD(0n@#jTdF%t=U)@Vp zP$7?Jk%3kCt-r0dzLoRDt3XQ})E&bUg{bKacf`3Pdp}m57R;KpY_sTb0;uS405b18 z_<|^_wP#QvwnykWf1;}~8CV4!O$K&CQ^Dc|I^&rl3M;kq+aq<~3QH<@iP@fN^;3;B z40Ui?fP`tLYuYaN)Sauu)BR(|SF&oJQTT1jI?Fnx-XALnrx0xiqZixx1NLALB8u+5 z^+>KfugXe<*bl52DN-%^@n3U}IOPIK4t>k064AwSkUEs+(V+QHann#m}-!UD6U%x6sFLM-qc{^}PL~1l(bOm~?RXiFECC zz-$MYlnJR`?XHGcDt;E4@oh+C-DK-`A(p5B-Hnrx>JE>s73I^%kTFem4c7nCd8Kdi zm8VX&LR)SPuqMQRzcB?(c|WujM4QYjEf#Ws9VbuFT6OCkNn2-QiN9G#9dLYa__e}? z>7&-j92$)w-*xmMVYWQ}a{VS;M36*v~ zk_(!;cAgP}YG;&EYEF-y1HbyiJxa%C*G|IPxin(qw_d_ch>5cGi(C9d#y z9dhhVW*0SXv#wfaoa{Jes{<)v-o-S~1xKR^s^3`H+jm~mfBQB2Gl3N_BsF-9yf$x* zh;mcK<>2B9$1C6B$UOuWR*A-I8St9+#{m>iS)Z0?(rHRGjzuhPX6UA4!5YtG&ScA$ zvTck=w|ZmfnRa6N`Z zuY5p!ZP-@st<+7cTdWe3v_bsXSgKw;4s&{^Uf1*=0!(!(8SqS-kt+15VvHCN`%=-w znLZKj9v-at>v7eQls6Uva=?E)<1z^5lx+23pkZCf^D3+W6mJ%QrgI~dz58LTK3}Ph zFUAM;SZaoVY2Id3zFxomq?D#h*MN=xi3j_Mr;$0B*+xu|i)7;O4OvdbEn-NOpc=$g*`W?tVo{nR@{YB?+qG zKcj7IzY#a-kb$A z)U7UqLqTro2di;JsUb1w!D42eG!LOTSLjlt>J2)0>`_X<672TIllg`!j!+VglNd$DI~BUZNRdqL2Vk#egTgr?t7fi%gJ`_P+aH2~(O3pDF|s12dQcQ*vdlR6kSPg3|L5^&mylA{01cSoqFWQo zbEHpjY87`!;mN&(<|eeoI|Gsh-Aka6GdqIUlaLAmV5mV!>U%(StKgwc56|xrd5Y6A zgolC|kRFU&JutqiuoBjQ(bhdAbRbW5ntb)AA<~L<-zZAo7%Lzgy7~U=8@e*LZQZnE zU!Z@k0-v$wbcyta6R~cES=b?i!*ort>o7za!S#t;Zco?N9!T+2_hy1hmJKiS_}1uI zSsmB#Jx*@xqN7Qo)n_SsA+C+j2|xynd#XKPO!Ax(oyfONNFkYn8b3ar5oJYcp(6Bs zOL6gW5Z1jw*03PG>Zf1Dq9(*aOR;V=$ISTe@*JIO}P@(T-By>$4#;j!|<2T+w+=b@75DbA( zw`RNi*_IS4#)dFbjF@LH@&ChHTBN=o3}pzWQ9la#=Ck*wu@D$#O1HXX+PKXjR10s| zEH=Kbw|&sZ!b({deFk__ks#%cNbZYSD1Qc049=56U+=-*(6w58hXzG;`h%p0h>%;F zoSbIu(jOoARC2_cQ2%um=tZgDicvce5^!fpwBsA+M5Op&g7CUHt>r-79@gu>p35H9 zH#-{;tg-%_9q3#0M{)p0<+nklibLZEJ*!wd-gQxb2JC)(p_xSeq2c~mP-03%u5%X) z#jhr@&>yi{4sybp2feLJH*XQPj)Yjo)#M%!F3^HYZyy7@EESp<6-zw1 zD$%X(({r0NUjiiukFkvvFaQ*+1^&|`nb*ONB95+!LtB#6S?9SJWQD> zJw|j8n`FEl2twk9MD=`qY9t7ozMElyE=DQ!d08?2%0&Le*_BE?@v1{n#=S(F~i`V-T4Xm7BXi?g5 zXGJ00*pPwhe-tCl`WHD~0Il;J@|i;1AlnEI;t29=a}(lFCh3m!nCZTFyoCY;hZO$= z_7u9j0Umu>dF`nyEfzkZ3BVI>`8Y2+0VzaHD!IzSa})z2<+n87O509Wyi+)A2J*3F z)AWX62v&>l=Sm_pWlmb6(iI_Ag#{@hHNo)=N;k*80A1W_1q>IPLc>I2 zxZ{7-rGSJ6?MJM7b)PXXK$&UAHzKLF9L|KqrD{>_#lQNxQD-QUhe22e_viXNFn0!k zAVyN6_`cdxZUG2_HGLb|ZHN0cG*6Qe-_g-k^9dW)z*f3BmfEN+0e@O>6C{#)MQe^cIGN575kRG$wm_hMg#&kr3)k37YrO1k+F+gVR12% z6rR^h89QLvi{yHX0L`a;j=0(o?yMN_pbZK_VBp;)e}7L^0^Xh*435w_B1SeU;{(_& zzy4ov|6|GE--UtU-?x)M<*>`UA^#&~f%&?FM~UHWUD-%P7a3MZqAJ-z zMk@${Sw{;WX@jWeR=~*5iZh#SFu}kD_4x<297cXGl42ok?5WNrl z=hkQ7WzVUOkASHQ|9g03M9K)H9-wbsxet;Iwb+R6KRH)OwX}164^Relb-xIxs`nv- z0Qxq8*6VUe4QD6dg(1pye+KQ|1-(OE_u0sF}%2UGspC2>EW^SZ;04(c^{u09u<`ja+@XoIWova*{S5>YmeK7A8Z; ze)n>f_ezkE$!{1)(rNYcfTIio#4`ZmSoYHuU>4=uSWduT&Cm985Tvtf$T+$L-$(HJ zD+n+>^$&%;I>nhkFmd(kFa`r?(|*dZpBvXL>P)!C-bK>!qhGzV1&Ts*m7uX zPb7l3&4oUD&W&%4PZm4>?(v$Qza`fOFOw^M;ZRfi)ev6RUhTmdWIGDU1DI6t{}A=v zfmHwB|My-O_lDei$sX4=E7^NwU7JD@h0F-a$VjD2Wsp7S`5$K$LEKjtqI+Q$&{YJTYv|IE4W;ZAUs^Ad|(X=DAo z?-CiUWK4M z^jnSgJ42fnrZ8+LqN{uWLinC=H}K3-^YwGxBXV6Ap_I&r&@=F&_UKd^@9WD9+GLtb z9;1D|d@su9Y-l>a7dwOHc`x<6(5!>NGwCj7pOhf(uGZzE^Slad?cZ9Z7^)IWou~j#qF~}eIJw~&a{5h@=S|38{EbH^IboakV*98VolU~!g|7) zzKsA#mcvu%B~><8V}Hf0!d2zp2PAQ}Gt3*VL^%Kc`Teth^wz5B8jyakJKo%vE)WC! z>~_G%yH*NMD|#{w>1~rOdCE|y?oB@1T~rdrJfyyiT5sv!Obb4lr@7|sQ#>6ly|ULW z(Cp3rXuc~wOASEFdOfsp4vy*qqwSg+4(DZ#C93XW;Cd1E%QxSCjc?H2j^Ui#1{*b~{w(4IB|K z58LBdM`Q5J$H7%+v}{k6mkYiPv9C_-ON;Wb_$yyP_7@RD9a*{E45CbO-13II-N)iM zjbuX~+X3rD4bF>aNbjN@$CLMeK$cs#YD5xO^dwk!3H*R?R{#KNJ|oe7)FbzJE9Cj3 zbDO0B*;;A2Xn8iN)~yxw?4Uq9K82029QN@Scxo?QnP|@tx z=gHz(WuIZ1Vw%UrUgSISgHtO$hS&%ec@~XmZ8pIlHX>}ukrx^k*qSE{QPqnu z&gX4b+Z9tKAAE&QqR6#tw{DA(R)Emy_{T6hax`+e{=$Irr^RFCMfB65JXJbFgQ4@S z(#7%D&X|g@PbMa>O$JYj4#qvTO}W$KB};4+ratExx>-!W&p=P>sD3@#VuozewrK zRjF&y*>?9)6S}?M1dWP@TGyB!FDyOW7bto0knOC@$s!l~8m4vTHPn)}so0!rQytMG zv@p56+GFlEqma;iC5n_0Eh>KBgWmEUNLlgYf#C&asE19NWfEQkaM%=+uJ-+ zy7IpGsZI(9sboL*q1H78j#_|t4qDY+rFu}pn3t`~aemJ{ zL9IT{y|ZT~pQap;sX2ZK;>n^;=C{s7=@Q?G`}mGZ)U3pb($CP4 zsz3MP+ceWd3#6XA8k+SncE*G>%wbUCxkqNm#^DL?4CGYeq|=sDx_LmIN7i}>lwc#pSG|3 ztn9jiKP$J>R^2e(L`;qR=l8GAESl@iHh@ROvc@yBb1o=$3wbK6N{zYTg2Q(eF;|9) zYh1<;wriO=)u*}Va)gGGRL%qYk>LTOHtz#|S^YrgKk-Z=P~h%YhAGOfgD13e$H#ob znva7UVqnB*-iuPi^xU!T)ZA^hX3b97%}vLTmu{;EnrqgOP%?kDz0KuwkkyZB#TP5M z{v4F!-`NGmHYsMAo^BtQdp!bPRM}?E7iwjTqVveBfnidobq)YH^!}d9wJqQGX}8^0 zpp{zX1Z-MW(Z@i~9~phY=vXmij1Ix+WhKF!mKt3csr!q4Tq>7~?>jqsSKKbg@1kmM z%Y5Qwe;y1+!i{1&5nL`jOwQ_dh0Mj9WQ_HAP3gx#sAJDvcC@1VTfK4NF@r^csL^WW zw4DzFGrL`sHCr2tQmZF3g{O7<%qE#-pYhGwSXAulH+DL(`ef#E*bdLCJDMgBWlA@$ zsFKy-7#N}LoZexSuI-AvZNIXl7-hFK7!SbDl|T$AKdEoJ*_@* zDw|(Dut?Qh;=S9h_L&{=Q-H|dUJ$nU0*&ayj1B#{=DMM}`iF)mddEj3T3)vaAuMfp z4metJhX?22$j&~)?Pwu&{Yh5FdzI5>Sj7}4OhNv8HD+d!aA%I;;CbdF}B)URFb-9)NMT z4XHYpCB4sfBI=UYiUS!Tb z;rr^h+}GI_uAFi@Ja_#5xx)7jhHi6%q-@PuK-Yw>1yG4>|99-lZ=>Gir(AQ@ z?n=gA%fq1FDg;^h5lLkSvH|mYEdT|t>HaBrNBhbraUg2clG{XMmO8z-)VIriqAItC z$;-~jh}rbfL*h`eS7f>m?~;9`R{To`9Ge2hS(kF_y4a>Sj%}x&;n{}CS(eF{fB1DI zuBz_tLvVLGVMX%b!0B93rH-!>%91;fj&paG-U*wt3(xGB%XZ_4xy0$o>*?5#6>N;= zcp^=>yO$E<8tv9^OXk8-&Ki6OKSm|0rR%D9gqr?0jD0gGFSH|UiO4`^ihT_{j~1`akneuz!-Y)6)B}Flb_;iH!BiVa4u3XYc(JyCJpICpJcRSH7l{Q<_?vcEKufHTgqD#@XEAZs^ zx0KT#bQHv#y4w*a&c@G!ub=5~vrV&PqWt`bEn zVktmb_^Q3zqxb42r5R*{nAigD3LsRZTK##M`2yosnQ}>Ydi&TSU8MIC{TO-0ex?aW zX(ndDXF}#ZdzV?;N{kj~{$z7+ujO@QG=i)cGcQfEt9I@d6 zgWc!IiXRuq<=`PU-8V6?(WonAn2ia36cTz$HCJ*7Hj_6g{fCt(oyjY8Hv zN%)Lm-|Ye_Ju1G>+*;H-e1tv8s+!> zn9M65c+|Ioo=MeL!>nwVEDq(~)7it_8QK|1OS^o?F)q_o=zRql-HKKS^G-;#=Hx!? z&N-8GQ0BPr>uHnM19R+;{t)m~V+ses&ebDLr14C=55?!_)dZ0S#g3j`A2CBL+7lg# zz1KN*Puu`(_`Oig-T)y&gu>fcrBwQjNSz82{{eC}(8c_=`Y!Jge4WUX=|B8JiS~eb zDoP5UH^gB5F&YLpoW+X;4N&YVKRO5(Vsh>^6Icx1=;uWD-`e7_YW6FfPgO(mOn2-j z_SgakQT&zDNY+eR_n^E}`M6=L1ow_S!E82H26q5`?^yPQ4W^hrh9#ekVS8tsxzeZV z#MJmpth1t@o&qT!7;UHKo_A2G7DUhMk7XxqOfm}a_jRPzaI>fyORv|o+q!;o$q#0q zTT(Px#87oNJK9x_w3}!P=JuboyR8oNqgW-6=t0XkihwP*?B21LOK%z%?k!Er8%-sm zQl->+58sq&Nb|UYu~z}R$2rK zJ7sRvBk|_M;h{JrGjY|CnhDUoBbs`hc9DfGa_MT_fV9mug~8HOv=7CpJ9BWhLzpsc zEnRfbQBNbT_d8-9l}kA$odj7SOO3>B>GpQQQ!%xhL2t9Epr`{Fs*;0?_G{L0*sEX+ zvg`mB&UOwuDeI<}72e>0J@?g!Dg{<$9aD+Zg9gFRWbn2aXi>Awx!typ+GtnrH) zQ}N$DK6U*112FX4U}?W=-!`H-%AP%9Kz%Q&os^S?hBIq&URg(TK$K91iN+6ibN=!dse_?7^PvsZ+n=zF?1}ll|YemXF z53aX2`HCrZ>1g;XQp_H(!e;hiQxd-uB6e2J^>ZJ;RLG8;yejMH=w)o{NWJP+4Q^~= zfrO>Ai;J1&7wB~aJjM{g<>-M0Fx5YNFtfIOyIPD-B3sOEmNlYxXV0r!m;QYI2|&;1 zbIYG=otX-eiFU=p=_ z<~T}lyjS`B!JgS9YE{9+%pc1PMbhD1(0-Z785@xw%|e;U`lwFJ2CXmzc*_U&-*=aK zdOs13WU0_}|4a8hJdbl@c^;IAdB=pT?rU1#ul1?otna?VZ)s~6kLqbVGo(7HY^%_! za6I5ya+;w_q_v|DiSVqWyZ5PTI6jNY)?5OP#r+ySfbP^%v>gpV$3a3dOHvwzuFW;+ zn%aT}&RFnS$!|Q{#mJ}tGyHuJ^Y!BB#g;Y!Igk5QNA@(ObB&eMvsRjFNy38w<7;G<6nXIpX@*1G&?##{ijBQleD7TT#(#0CHwf(fQ!1d$_GdH{dG6O#faHZF~ za{j%@^mE`XxM;$Dt?kEst_u;i)c*f*0c2$BW$ixQ9~_WHPF|8ZaXQz;*6cAA75feS zsR$BkKbH*&k_`^!xRYUQs)pIS^y(9#;mlPpse3zkPJfzI7|0{VVtKRo#D*Fx_Vk1P z+4^DBw`%j33}O~KW@RbPSNl+8`%c4BS8OTkmFJViU(+SKRwvDOL`s6FrH=b5ueMRhc@eJ z#oG3SD^1e<33+Q*DNXcPwh&IsJ;2ntYLsx;SXGYQmV4YA%qIQ!{@Ds`;qUZFZ!U!f zkRd{nCp2xLrbX^VeH?YCss5Q9&bY%thIsCZbM=G0c_a@g(9|@B!An{E6I-%nmocx4 z7Z2#dU86opw!BRVKQM~>)T+z2-zl%LY~UuTyM8C+39lZ zK#sq)$#MyMdGM-VL`GMZDy83Cc5vmhkChHE4oB1sFe5C&T*9cPSMK*7G8o*oat>5;cyVf1ZZM z9PZ^@pxDPNCeYqE&X;oQfSS&3&&c{#%1%-=SWw=YPWH>-M`bjEn=`b^dVU7XEX0o( z!zvc51OH{gyM)JYpg59nLE8q{#(jn=Yjj&|8@nX=fpt|@VBS7lj0PIxbrwjfrXwB+ ziHK{RGEQSJjaHCS#C$S3OHyCU(RpD-v^zyRw?4Y(t4hc_GeNH8-~>d^--6S**wzp% zxK$^NKNz2uAyNOdD|cwca_k!~gvDipsuryq>CO_{Ay$p*s|Rz2G0GFiUp^MV8+Cke z>IOLUgnK<-S_ugN(h!G|Q8mU@Wbv3KxwI6W=S=v>_WW&W1IXA~EWa~QEYVYT>k3t> zU=i($*V=~;F+mLIGL16|!aHhSH$B2{EAFg0a6K(-NPnl3mEp^me7H-skGlRpgzgihOG9h zdnUbPW}r@L=B$sC0Wr%2--%Z>F1xHPA_Kd)@lCP{$mE;G=)EqCs-Fi>CND#W?=TaG zRBMP9F$7I5NijtJnIamZqorb-^rtVztmyTzCt~7a5U-WSraPmg{o3;=B-B%Vmhciw zRJJ+e!9~D{spYM)4vSr*_kke!_S7U{B_5j)qXDU3?M{s4$Id@r_MkVRS$l}^>6YzB zcc(p!Hk-mL-^teIu#L7E6{j`=s*|ZNFlV4?%KI?9YPXo^xqP3)x2?F>DnsiPQppFN zQc^?(qc;e685!gZ*{v&;e+F2`g7^7UN`8FIx==ujEXo~B5oG>+VUP=~1v2^w@v3bH z%cZQ!5}mCn2F^R+2=@g#4_{;8O+6`J{w zTEMj}W!Dopxa7u_#wdo^n8pKg)kWDl$m1&h&T@Zl2&y0~5S2TISa4lWQ|5>R4qp$Pz z^Lvmn1{CZc3C^-ephW&yIJWsa{iCGK{RS&UGKL#J{v&(98_L6Tf5DilCw6UEK%& zr^z$pCA+&(;*0yR6)w@he)*W^pd?q_7obr#T2O&;&DW6c9U3YF`QBM6Hs5?4;z5*^lFwk#@#h!IKla6C$p2<^+`v&T zMVrUFEb!7!)OO@}3%__BAywL4Slpr3^~5VV84^ZiFcNZLd+b+mzX?oZH9zz8LE++_ zj)wL#G5xNuFGKhotM7C^3qH`-0B?Kr%TVy6H6R>zxGzC_zdkbxK8;hzqApl{wPEo( zFqR*FwngEB*io=4x09q?;`sfpq0anL#ULkB43ImH@T$jF|1{6*#&oHLuPHqC&W+K( z%UBbL)fgMYQrVsy5{m7>eCBT3n};kvTsNc)Smn5{&b@LM5qEo{oI;8XOF^Yx54r!* zIRU}*vPoHT+u8j=_6>`xDbr-*JU%4z=-RJuGanrm(r9*w+S**gNst%Ls=dn0tq&FIQ*pu;i z_enFrYiL+ifcUrz8C&YHLlGntdB(Z`BZmvQ7w;Q=2!&YX;S(`KLwO`rw)kDyQ)y{Z zS->)Pyd#0q>mrQn26fXr;}DyWH}2~bB7S8+sFo?uelAeIDw@sX?kkj=HT z40s$!qy`UefXYh_IewP9{3Po2eyXqmOYO0Nf_&&;zIib9xpi$&v%EmjxC0D%7Ugi) zM1Gu>%u*iIc(Rm&k7(ONLGek|c=gZ%igO84i$8ijqhre`Rqw!h@;*oPJC-DWO!psn zkhe+RA!aLr(mx2=4$dkeKf#@*`MbuOAw_b-9ynxFFG)woi_7w0v&?mpf%&hp(5A$- z`eJ=rLVsxrtYW%edR@HZM0^}fvIkJI7fG7H#M=1AGKak)%y9;y0A^bgN2KG2LcqKf+ zdYGHYk91~*rHeY7hVF#w8|W*dz(-HRwwjp^>+1`g?8msuF3RHD_!pSU(hgNS4zpBs zqzJ#_OA57d#L1+1z6H1U+tM~^kS4rjc=7MDted2Jn{NDYB}^3Y zitcRCI`z@bMPBCB9vKqDiQeB^5iF-eU)Y+y|DttsiHiFHMk}9xb?M6BV`RAK#i5I-ZafZ=#0$)CMBgzS|35{`J@`oScZvCj{QFf=p*8OaaK4B)flvP9)70bh?Q$1`g{K|J zJ*wiInAF@&Rvl^PINY-aBUS zM#x#cE}D4#7nl(pb5YA9c3T{cC&hlx(xOs`OZt}$XbXG{7>lHR)Qj)NyGzlwu9=(x^(n^hOLQnjD1+O*QaFZlW<(Ll>vPv^}RT+1=SxBMB2- zUI(?`L$2=!SgHCrR6y12Bi@UYF8+gL1;_A((Sa_f6)tY1>`$jt&GGb%#f+;uM2bWo zORSBS;k|9+(hp93^6)ffbY#0C^cCWbV<^UG!y=3lK4bqSiURq#G(sx71H?aXBJnZ? z3c=(=g9%@$ofnq#^?zc)1S(viw_{4G?L@ah+TNkd2_(B@fhA(f7; z>`QyY7tAnk0^k2Ps~p}Dd{SuJhp);;YZ>nIEYHJZ{Y`J5pHIi=Bc6Jzsk{dNdv{mU zXVPVxl|o=$PI4gn(sr-kLZA8V%HT$2w!b~MFZN&0r`k)_EFJi|vc*EQ+}V-&?&vC+uq zCwg4|+dM3B8p;kfPb=6)vGFAcdE6f7ZNE<7P9tPTHVYc2+l#*h-)km#mBg{in;8Okx9zo>W$@BZuF!Z;^Ny5f9gTu@= zjZR{;?KV&#RG*oI)V1W2)*UBvpzfUzBB5k=r`f3Wnm(4}##iw9l$(-Jwvv>mlZ@Qf zrMg^3hU6&YfftJymvNmQ|C;#XqvJrllHRL4FLa4i~DRHqi;o>KWt(QXb}lT|Jgyyg=ND!6Ri!M-!Bxl`Ouz zc?p)!1#d8%V|T#Yay59n@tB`Y0^_WFAV8Y_dlRM9JP?-<*{*)dX5b`NT73 z@=Z|t@HDCY07+DW)OX*G-Vifd7#i0T3AN!DFe_`S3EXFo@nrg)J8i+)7GFPCRNAM+ zDBydq=sk||BHgNZJ5Xzg&e)cq&ThknuJE}E-2-wG=E6OD2y7!Mqs_=6^r z-B#lLcch|QE$C2f7Km(smSFXrkFcvX1iswIzkenh#vRh@F!19IZ^>|C_dqj#>IM!z zN}gTp96uL~TcUqG*oI%By7h(2e-8?JbLxHHj&Dk^R(Hl@kp+g2xpgu`ti{Q7OX`3TFnbN$8 z0~(A=B3>_obVnlca@272=4bWd5AG=%A@8UXR(a2o2fPYVR&*EuXjfr||3;NLU< zhTpMtk~hEDK7=_p@K|pcl6xQ!CTos3!{I)jEy{LR-XIpuKp&22tax#dRl!y7e!qvt@Zn-=iSdgd(9da zB0TEbZuQ?1@$RYm3WOCqD&})~^XzTYj}-WT2dD_A#lRnr>2>fBUw74Cj8 zW{wOeeP$WF3S&ra#94X(SI_A7r+|}GJUlmkSnSd1f$z&x@}LYpSgTpFT=DnOpB}s) z=#ogK2HiBfY=o*2r--vTn!2T>*19TV_V9_jS*e7^uyK$|(}yOkABa>hyVTUQ{2p%(jbdTV?gs^+ zmGq0h%fRCnXvU497qmbQmc4*>HmCK4>4M$gxyw-lbi3AwW!C|YbfH!FZ4v^Naqxzn zF$k{a?K5Q);J2mF*N&yHPvuS3LHtpLg>fStHyJN58|k5nV`hrZ0cLdkpr*vNbu*kODB-rAVg{Lskpcxj@= z-z{W!=NfeP>F;a2-lE8eZo^=KX(+a`V1^g^V@>em)T8lK(270<*79txIp3R$Yx!fJ z4+E0w1rcWHA#JxgSVQf#3|hE1xSg;a8+i$VYG_~c0i&K0KT`MuqJyU)rDziO?zjY< z8*UvEyw)@>6~c;A4AjzQa8Rha>{0TK?5%tK6%?ya;cSr6c(q>~DUDg2e0W4Xf;j2! z`TXdVOBi}Y?r9B_RVH}!IeX{E<(QSFVS@2CcP9OZ0y?`k_f7nq-Kj$L)SM4ZW|8^1dwhMI`cnGbsG(i$1Oa;CdY zfLqql26W7d1_e3HY&=`pY-4Rl>Z)*(2wQ((KHC8rfdfTG!nPPN3cGQpIoCtx>%y!3 zI4al94^T#w7$j9Zsfl*YA@Au9 zT~}N7m*_Yt{GO)11cL(^vPQ?HPU=};QV7s@@b@Zt_0XdvqIpSmr3Emhg&2A95c@8$ zDk_GimQ+;u2@t%SpwX+_&ez^&>eCxER`Y#ETd?-tG}F(JWZ|-s?@0Us)nX-(0-^#q zyRC7}0-hcBPP`p^Ec`KeEQ*uU_F1jYd30Dtj?|Da2beS zxk=+crog zY@xy{BN>B~`rvU1+%|NOkU)JnJtWPix;OmOh@@^-rq1b*4M1F9Kn+c@TC$CJc@8Mq zUqB~&i`N!zZsK4wpC1=a43(*!X;2Q#8-j?)Qk2a4O`=_vM@V7<>qvN-kft4E9lL@q zLB!)iX9QjcrTI_d)lAAOEV0THIusRfGLOI%70<#=$nWQa9|GDtpQ#&(GBGjnQ}A3o zJIq*cJsjx+!WE~lW$Me|>XeXfT(}Z_%&6bZHbGRf@#0}|jC9(p9aW)Ged5qbA=b{b z^PqFN^y0>WmfF~1KW@0i^*D8OD=WkI){9aJ?K@*pfivG1hePvwrc?X*L9$hnBB;JE zLfTh?jz(H3P1n3CGiH-c^5mDGN1+&m;3z!tlJu9Z!ee03>`;%4IW|wLr8u`11fYNUPZei%a+ks}vu?Z-B%ILRlvz-P)-;K113+xsqhZ zPu3SEG~xdp7&mDyoZb1p5;zNVR|+_aQ)}JBW1q; z>Bv$!Zg(2!&8LW6>!VM9YSuX0s>SNN+cm?htY6=v_m`T^VH+V*Q6><$(cc7e4f_LQA|6)UprtzesIV8_!4o7Cacl_Ba!)5 z_=_USE!IB&4NQ;hdAF!CY0h659<3~+W_b!%_u4BYc1Un?vQc@!2;llYh1Hi))9a&b z=kJKfMwb5A>$WnKmXNf}hPn_|!n?Hl!_XC8p*Bi4ORH!`)Lp`VMKn+Z?>;ZMag$bqIsT>3G1|9E9xoY zRMwb@CeXd#Diz88_WA80g+W_t-FiO#WdwoN&g`1UP5RM`@kaG*N8nMb;tG3pz@{cj zO2lI=Q`}UgPC8;W`mYe%jJgSXR?^e3 z;;y6XKLn$@j5-N>g7!$|L34XF!4VQU)iq`jzM$-+fo1`6^~H?XwJpYglux034<6(p z$QtBvQ<{YUHclx9Lc>iAC0-{yZ^f#6O(a`wahE|UZEb=eeAd`61^;O1%-Qr0kG}25 zw)Ss7j^&YI%{K7QO5AjpHFV&NeCS?Q2p`e$iuFaa)X)Kp00j2y7`igm?Ho6$h}0Ki zC0z$DygSa-AEPOYOcL^yyzLB-EcHl#M71<=7u~0N=h>r?-)EOE|DasiQ;&M(@sRTP zh+*S$mrNXI3LdAIfoEDs9K*25@J`a3M7;mzPmwcj;#{FpT>Yws9S_}{IC=c-5_`p@ zuKY-1HK}7qY79?n3>^i|oZG<*>)-fd>gp79jmBUAXnJGHfLP2k5=GY5%+f-Pbob}P z)a_2xEs%F{leRbt-e>D0F!VqC?O1e>0Cr5W&a0P@+D2^>m&(H%#vL(86V-EN%4|y& zX;X&;2aT-yq(ShCx_Ly}v5uXfkdGK-sy+I+#4xV6_+!HZ&jemY67(1~SL=7x@sZ=VF2mbs5mN>|!6ktPD zXyS5l2qRCK>d(RnYeNlknyS;1!0|%ngu5$h@a1nJJ)$K}S5Mo_bK@ojd?j?Tq&@r} z7r<`d9CUc?u37OPpL+B#H7jx_c3g^5ELU;YSjATWn?Y$t;}rY=jAxXpd2cbJ;|I~W z4nY#SAxg|2(lRqz01D%f$WDZ`u<132`)3yeL?So1U{=OFvi|op8%yP7Wh%2Q2ll){ z^jasaqzP$xW;PG`}b6(;#QLQl)R{1o%Mhy#1Qe6 z>q2DAHoU<+f^+iw`9GUiAUC%KFEDWi9?W{AM=Dd_7fPA>;8_!EbqjH13z~jg&%2MC zgW?wp(Pr2ZN4j@%ss>-Z39^}TiHM_7Yjf7RQK(!Sw1L6)xlPr@8QCNEtP0dm)@&3W zkC3)`aO(JgkuH#1JV;1_LY_XTQSGb0{~Tsd!^do9KoRP2f&W9_rDPF&%#%UwOv)5S z2dKvdbDChW7~Nu8$2P}@ZxZ2yDZSUi;c$+i2l~x|sYn3L$Y=TW9aBgkOYs&D{cK+1 zGPvN*_L^UoeSJhRpT%^8Mef(8N*vKk9CLIyehAQ6j7skk? z1ApcpXIJ}%f@DJ5I&w*v;Xbt9wak^f1T&H?z{9Nq#!((u!+SBn4d=2CrW5cSx0h45_~Wud&$5h5eC=&>`*p{lnAx>B7G|=&WA?bNP8G zD%M1--9+Ais$ViHVV>n1XD9y#;P{0&_5s_$p)J44eVu5qM`D?T+Op9N$xgNTwtszO50OUP3)RnOnL$P!jf!4X!vnm%n$!>aA@+I zp^$$;Oa`y4=QM4o7B^p=$t;0E6^Fk795L_lHt<0ixYzZ8?oo!35(<-qj?A;Pg9`KDCgQLQ3K6mP za*lQS57QqWgFBuo*I>C&zL%lap`R2<(6*yenN$`CMbiw49N6jYE*Z~f49{hG7E_S8 zEGFbOe3GG;lLAwSLz1tQFvvV1F-w*>DyVO6eME3#BU4+!Scibe2k)Qnxvm49BHgJt zcHz7rF~>QWGO!Cut6v`uFS0*Y3~1(mwmQGs)x zRYr-;0J%0~XwRBePzbhW%Wk5nPtL*Din!8z+R+(Gw%*H7Ez` z33n*YMEh#4yJEg#w%ElyAnP66(VqpURjeUmO&1+!%C0KU-%X`|l}dYF>(b)z2wp1P zp1yb4LTqMl%*G>OHdjV?)rY;$C#40RX3shmMgpZQa?B3Ii)Ey}90cp#Py7{ta4f`X zf;nF7)*KKg?3UvpW1Wm)LNUK^eW%BO?^3E@@Y3pj=QxnX-#mmyc}+G28^Or4Yq3nR zlZ?KrKp|7$(EF#kuUI2bJ+aLKknxs=dw~I!!b{~%-^?53t(M1*iLC%P{A0c9fmoBy zd$)zeJuLe+)~Cni8}?7jcv*Q~S&Q&Wg#G(lf>PcDgVmHqlhvivgv7Tt5}PAlpZocB zICZS5s)~MaX77>}JfNHL`2|qFykw%oR*|fn zIY4VVp*tB9iDS%#SXl{zc_;^;HETK{sk=3l&BWTxZ^|a4QTq|EIWknAr(ihkWw|e_$Szy9NOjsQQ_E?MaO8yubR3#|q1%>&x}#nZU2Q^QL!CLN#4q$3I1`f{IlbUXC@1Ch>Tbt@W!^mxvlz`~gXCz!?CdnY^(FndlirDK{V zNH}RmGT;n16?APXD!Slp)}KS6Y52BfgT;_(_8@R%@q+)?R*Uo3M@hIPBh*Ig>OaLV z1`CM?oZ}X1<`W48A~($Og~)EX3=XDl(0>yj$j^{Z zEsZ-d`AnZ&SJEk>AIt>T2;C**Cbav$`4p9#jAM$9`vLPQ%1eKd_Hd6;KWj$`r4(7q zj`l#FN4K{vW#qCOb^t`)yY|?1-u|AX1Xh16K7&oMoecu~kB8J=$u3I_KIp?WI63pI ziEu(asCR$^<&NN&^ZrBd6Bmrw4A>2FqkpTn$&klBN?KC&6^#9ZPn0*6y28%3N$sVG zBRAGQyy9b~{y|(tw8>x@%JBI$-zTcI#LLv7@~WX!`nAR_}tj(T3*Ww%U19etw6ph_Q`@l7p1=w{UDbD6qUBGm2;xRTK|mXR0}t$R+*z!%2;h7;#yRN#rn+#FFMk zWX^y8E9mFf<87I|TTIiA7&Kec?U%QY90D7yDx{1%z+ZMl*htU2ffH}8M50{P;xJTA zs{x*%udQNO4GVAa~y88$q@89zeSd9HGl7rD-uHDw(LodB(Lo;4nnTZZeqvE<0K* zPkh9?mlxvd1+-n@nRGItsfCjPD}pF8R2;EVPl+*fJYzB^%XGY(H3KF*3lp;Du`%Mw zz-l;EW_H;CA{H!5Qe7m>C_0YwZ#!}(9ubeJ{puzACWe@dF}#RK8>=k+3*Bk$i0O$` zd4eqf3_sQsp%{=c!`J=lZ)U&SlY6`wzdM%kPSs*`PJb~2OM(i3D37VfHAXNax8Z9( zUZmNh+Rzbz1{E0M-oXT0-lc>lny)O_l4C zliY^?y$PbW@W}J~K$~5>Sogh#NO8MF#kZC7*L>Xm#{pHd2DswET1*ksHO9?CcAL8E z&M^&xZ0`*H6%1pvM*|Gv*oJRgKn+dsgCQ0vEhoK7Tsl%g7GRz zN=fzMBv18;oEcZm(WaoQ0b_Lr7Y>q)1)&o|v;kDy z!1WW%6VbL6dP+nRFa+eHm8@&4qbGTM4@Ypu&91is7Bm70OuHnQShuU(-BGOu#h@{w z%mYr*3ILGf3{m&6L?$-1-uy?;)hyO|DW@)D?66|(Iol)j4vyA=PfeDx&%SN=Etw3; zG`db1DTZ=VCPA46ngi^B*_FFe1V?myp|1lQ3vePLH8Hz(lE);E)4nk# zjkAz0;P5+kcLmWa?t z(4S-bcZFxQNA)(q2SwGb^4}qP8?v{Ic1Ri+#LaRER}0jAED^)+3LH(Te-HwU-#e6k z%q*Z>~IC&5F&?7sArm?ml7 zayUX5XoXOX{8*z2u>rKlZ~ntTFwSw5OOW#Xhg7)vpr9I&0vernkfmeTeH=x44*COO z)9o^wfuDAaUO><6Lj$PfAeZ|Iln<^#njRxSXQU53DD2?x}K-5$7@ z88Hn_$J;)P3X2JXSk;17*b6fRiwxsjGNhb2@8^QCR}Y{WJ#LqzPUVS(LG4@nU;Kqv_2se)|t>$=Np)-Wda^0ZeAMkPpZI7%4MuuR0nJ z?`k_*hTMS^kZ;}{0}ReyU<1jJ@1|pQOkVLmje9%^L z%hk8H&w(*~=0|H=za&k}MC!sC&cMdS#~v!IVW0F$Q8p1NLwwgxPs~CRmPNIMRNzC7uQ@CepCYMm6wx=l=qX zQV6j!(2qkmEHK>2@ysC{EsDEsY5nut4@p0_4oS+8w|K9f+4==l>HNNfb#4X>74v_~ zZUwwGtKOb~bw`EIOmjn-HBybmbzm{@jc3Z;)FNFKHFlg$_+{4tU0 z-xgmh%jK>K5SlI^biOL?719WzVU+&9LI`S=kQy?2z`E&1j5L6OYDLLj(3~m$@93pt zhhYxKH)`b9VbcqT@RP5V(a>3_RE#5ui>nSO{{s{mroLTg3~+}Tk#hyw1~`ef3>o{@Q}M4rfrj%4n1!cGlNm7$W>U!jpu^R# z_YV*H1P295l8Z!!=M2c{ur#NuL9ZVZ-8Uf@y^8_jUf+M^GO$kk>nyh6kF8f8@kf2Dlj9fb=4!-NKv}uK(gWP0%Ao1?nj5^k;n2XT!?oCj zwd`lHkbKD@g?g(T>q+sL7NT|2Z-|FqV3+hjHumDzWk$+N!L5Ro!$+_G<@7JXyY6{8 zKR2oWv#I*aEnt1{pjBLfdJ$#vZ+~WhrFtqz1PxUPb(VC9Qg(NJZ8cASshB83h3M*% z0^Ba*G9@i}ig83v1x66f*m*#TaX9Q#V?4((F4`YxgcrVttE#k!RX_B{=vTYKpoXZo z|NcKEtOGW8rTq=N{}NycyPiUI`FPBsuNSZE4hEEZ2MG><>qq}4jbml1sQ3RprVq^&nz4n@*alHil8VSK zYkgIUtaVAQDB?=p86m|;sZdC?UUWyUk|bM}C{(s&DczD}Ng{51pHJQI@0@$j`8o5? zoa4;ZUU4sNcPRCEX*Q9FO?s(b@WubNnf|fVe-?;FgaE=)@h{e&N)&z~7CEr?^4}Fh;-AFFZX+h1UwLkZi?gXX7 zyFkUwo~ne}+t$!d#CJ?YI-I#Qk7j+K#2R2D&)reUF5*(ysf$(zNHiGzh~Ud+S60)i zW3}%s?s7U5FM?|O3a|J~hUZvPWx;tpflr^-(FR`>+CW`Z8RkGu2JrF%hOyb_=4?wF zC{G$R$?7S#6Rge3Hpv>y=A)0}Ce#G(h#NO`V6c}J8KSstX>FuXx3+V@!*SJ~4ZMf? zLx-tV&l(gHb{Zg?0Tt;ZLY{2Uf2smDm1N++2oi~sJ-gAEn++kf+xy4I%p;FtwTv#n;k^zF&+~6l%oh*;?$eZsr zC|3Nm@T|svEYQQK@_kgz>995Q*b?N?Brj$|E{#l0z7h;eS|5?HlQc41DAHO(Fiyk2 zL$L0Hb(t#hB*RdXw6%yytV+U0T{mlPt#qQ+zKKn78o5<&akrCa67^WYL?zh3j34(s zWJPkPnc|DuX7~SXfnMe*H3x-s3DBlQ5j+0|Z7V=2=Ywtxa^4iG^sb=RmQ7#`cz?$c zycb2jU(1s5o890P8%*_QA3QOywh-RPYY1@+6cu)a@>l-U;9H>UrZ7Mt0m-^Cquue{ z&p1$YqA&zR8E}}+10DYjj&zc8hk1W_0WaYSMg4Y$9l&FIN0V5(!^u1rHTbpL)NSTj zQwmIegeI9WjvwUgR$sX3)-G#a;5u;C9IMN2CvmRPSdYDS?YiudMiwluy{N7x z5-26hnS$~@N7NiLC)dbznhx00+Q<^<+;I9M zOy}+-*101F3(Yi>V)_vQ-6a~a3rKn>^D*iFj1@!I01fmOIjYNTP>g0>53J(Q&H{P zj0ihbKj`&0w?`8wI~AoF;}$~pJO1uw_#T$AesBH2U0zvl`BAd|wjy-MRb*?b`X;42 zTTYE5xaM0^MiqNKyNZImy`M~U`mb0Xnn2|m33D^*66N-SZqVb#hWCs{ZKdZd$cB>ishrZ-0)bs;% zU}bgz#(C+uw3UnfvVZ_|p@u+f>+oHaPp4mrYCX*%u({b*qr!~?1YJz}nJpF%X#p~D z8M}Nl2DyjiWt}qiryCcAL+fA{Cer8Mj~XUJsd!4l5a!C+J_`dg>lyz=L2 zJJ34a-?mFA$qg%DEyNt+T ziSspNx%vC&Y+_&=YoKB|u^GklbbZz&i$@HZ_o8T7d~Y00ytOGh-n2M8#y%o(3thYc z*vLxXD>c(Ej=vr6Z#I2;&0%?MNo4LuBuEFdoJqj3*NfVoRuQxwaFXxG*9rSKwe<2% z=2ukdN8<)(SmVPz?nX4yX4}hw0Vd7`Mc#&VAS5bGtD}pvRn)PYPl}hx*oQqPwJsX? zZ$?XRcN&B>A|$k6J7nZ??sOXGJpI}JJoLFt(vt(;- ze>6K^1Wz%a#c7anc7o*giF_rma!rYzPiW=v3w#7FjwYn0U_>WZ>r-@#X zagwNuh<`WKG09SHjLKZSscynP!$5;9sM%_^(^faDn@wJ7<9G5XQHWxbkXC))kh`cb zGLd7h7{!qcGnn#HqBWhc>RnHFEe^Jxvk|G+=7$61+>!M*y`A@MDa=LyAUPQf1cq&W z(vS%}2edrwZioLO_`L;O$U*<-z7kog%vWMrkd|kc88wt)oQdFxk!QDR9`ne+T~HJU zOfSO}tqA|@Yt$9}@VtcwTDNa`lv7Dj^ZbD;dm6U8iv=zccoSDMDja62$WY`F#=U6r z_(bL(DDVE}MZ8@A+uIWF3KImr5Ce`NZ%5&2Sb%!?Zjw)ONsyCwU+sVHqowlcu58Au zn(oT&y-3Kd5jL!Py=rMNoz?CPvARD|^iG7q3LIq?FBZI=Mw}@_rFj)&JGe08a@tG( zpnEh6g!-q=wfsB=_L~(VzAKmMKOEfd6InKfh>x*R=!elTEBMOWR`Bu+NL zPfbN!P#z>w6<>CMy6o#8O)5=S?G}M0=WzM(^p_<&E(Bm&P18}}bxn0|fq-6GEE^H) zduap3PcQ4DJE#+Qgx9)tNXst9r+JijfJ6Iu;Ynu-a8{)>h7!l)45ESNbo;P+#C~=p z_hEG|xu$8c@Z}a(`xKqSRV~;XXhDM#!4nYG`s@W1!m5 z9G5HQ%`=Nd^|c=Dc5Je91sF8ZKU89uNoS>t8hDDS+2>|39Qly?U)=9Eas;PChygp4 zVggC-7Vn4@|E3Z<4>DW`qBf5xny`E|5{Bj1>^DQXSrJ*y7d^`D1nlTiT5pP!Sv}B) z_ix!zkC0$okF^`q6OikwEN0g1hx1nfy7HA*IW)hpg0d}?hSX?)m9cosy8oj zY-&*B99NBOykvB0zU+pYK+!a${l=uZ)QRp@B|q5*N<{)T4_O8f)w?8zZENDeIxStQ~J z5-F3~z5M%Ij9n^VW_c{^xHY@v2KH@sO)+qJMyJx``edel=uletLy-4v$d+447J7CS zA&Zz~uMLsh><%3?IKRDhzF;kGGeDW6&y-eXIV+bo)g`Iz267Dg`))}UhC}2}dIJ8t zlL*Rg31fo3w)#h_%#Unw|-2vNJ(qIRgs7Mo3&=hTgQ3{?X?~ zvmq{Wh2_5l5LqR^j9pzOHo`9>#Hqwfe=;dnVQi!7-{ht<2(1#dBqcEQ#dly{OJDY` znzP5P+cpG~y4R(AM|H?#2k3kFTS`QrI!fa{K8As4r^?^i4!E|SC0vcslcZOcXg8<3 zCDvSM19k5_T6&nLJaf65!NTX~w#14E`1_l1%A`-R?PTqGPJ~1!BMP4%9*RJHi4}`N zzqMDz?!1#)22j>#g3H*;NGRaJtC!c4p9tNh%o^qderR19a^Yd6fOtLHTHbH_To2gu zGT8N-A&EeaDaaVVf(Rm!^NcvBwLNQDYS@g&LV0l;TRo&7IgN`A4v~{uu7*rM=nZfVAAjuBN2$18mWl;7cm9$7MnEZUO|1>}@XRTCj;L^@4raKU9qR<-0q3!<9?qnHaq>beyS&T;_FQJ#Gwzx z{S#%wqw8#b=FPN(KNv4fDIo%NRf|2J_U~;yG$OhDjQ3%XgpJ%L6=vI8hjT9;p8e@8 z@AuY2ATKW{&04@nmp*l(Tp^}TBgK20SdtAP`*4%&_uC{+Q>wWzAobX?!EHpG$K{ZM z44$)-HAF@H(xiJoD8VyTiWD#1H2!oQd(t9S@Bt%ouB(e6{YJbK~J2pOrHK zhIbBMtZOZJAtuBUb@t+pOa5Fwtf<}_jcbnBcR0F<@h!BqXOsIMJ$~1=gy!sQZI79F zmC<@QuXu7Me!|O}l63IQp2H8LMlp3^%WY}3kwfv#VV?1bX0qp5fIwU9sVwk263-j+ zSHZS(h%}YJ*H!e62fscT?7ZXPKB>^S!ysv-p=wH?Z?2oPnzjYHdey#w?)I&5sx16T z&&Qlq?B1Mlg}r|nAIg2um%8Y_aL?Y6)gRXGZOG4PYwq#+))jg)Aa9P>jyYx*+g$n* z3)k~!hNdNZDz%zlgqGZD6>go*yO=j&=I$V8bi`FqFsHP+O-p(;_RYsCHkEo3I!a@* zf5`S(smnyuk|%Co@%4JT+pdIhl+xVtD-^`j6DwSlrj8j*HEvz$J#~%G=9RWN_e|TX zdrzeg7dAhbxUV-gq2qaSnN!v0f>n15XQYxSM{i}vX_kuj_a_bXzZPbnMElq&WW_h` z`Ns&$eC8s>g|oRMHi?deVAryarz?G)^v_>6Og5`5i_d%bpm6ebsl`SAuL;c3o}Q0i zhcwwWDtgoNp0*ZrOvwDa)0-|^`ubq-rOqYw+vJYV+*ggAwCCjQ&oY|Mv*r&+wNG`6 zX=!T|RxxZ?Yr;k{!?Tfg%>Q%h#FCUZropx6SLGaeXhuSO##AnwGpWl^O`K{D?Gw!+ zsy3JK6Ut25L$yYB22KZjGI#HFY4doQe=Bry-ki`y4q3Abu3kGXnz<)WKEa?5FYFJXr>K!>}6jCv*%oplTpv@N2F;Q+@SD4hUO zVCMe$5l}H!RO0Y|(InmQzdp1Os)UlsH}SGB$cAvh|M4-V&>drGEdTBkN_VNG# literal 0 HcmV?d00001 diff --git a/content/code/thinking-about-rust-actors/index.md b/content/code/thinking-about-rust-actors/index.md new file mode 100644 index 0000000..fe63722 --- /dev/null +++ b/content/code/thinking-about-rust-actors/index.md @@ -0,0 +1,97 @@ ++++ +title = "Thinking About Rust Actors" +date = 2023-08-11 +draft =true + +[taxonomies] +tags = ["rust", "actor model"] ++++ + +I recently wrote an application for work (so, sorry, can't show you the code) +that, 'cause it was heavily I/O based, I decided to write it using +[Tokio](https://tokio.rs/) and the idea of [Actor Model with +it](https://ryhl.io/blog/actors-with-tokio/). + +... which gave me some things to think about. + + + +Before anything, actors in Rust are very different from the actors in languages +with the actual Actor Model. In summary, you have your actors, which running +independently, each actor have an Inbox for things to be processed and an +"outbox" -- in quotes, 'cause that's not really it. An actor can receive a +message, process it and then it can just be done with it or it can produce +something that it is send to another actor -- that's its outbox, which usually +differs from the Inbox 'cause the Inbox need to have a queue of sorts, but the +Outbox doesn't (and that's why I've been using "outbox" with quotes before). + +All the messages are delivered by a "post office" of sorts, that connects all +Actors: + +![](actors.png "A silly representation of the actor model") + +On my implementation, the actor is actually a module with a `run()` function; +this function exposes the `Sender` part of a channel which acts as the Inbox of +it and the task PID, so the can `.await` it to avoid the main application from +finishing with the actor still running. + +And because there is no "Post Office" kind of solver in Rust, we can actually +short circuit the actors by giving the `Sender` channel of an actor as +parameter to a second, so it knows where to send its messages. Something like: + +```rust +let channel3 = actor3::run(...).await; +let channel2 = actor2::run(channel3).await; +actor1::run(channel2).await; +``` + +In this short sample, whatever "actor1" produces, it sends directly to +"actor2"; "actor2", on its part, produces something that is received by +"actor3". And, with more actors, things just keep chaining. + +{% note() %} +I am intentionally ignoring the internals of each actor and their `run()` +function, but they are some variations of: + +```rust +fn run(..) -> (task::JoinHandle<()>, mpsc::Sender) { + let (tx, mut rx) = mpsc::channel::(SOME_SIZE); + let task = tokio::spawn(async move { + while let Some(incoming) = rx.recv().await { + let conversion = actor_process(incoming); + // maybe send the conversion to the next actor? + } + }); + (task, tx) +} +``` +{% end %} + +But... 'cause the actors have (very similar) interfaces, that looks like a +trait! + +So, what should be the Actor trait? + +First thing, its `new()` or similar function should expose its PID. Something +like: + +```rust +pub trait Actor { + fn new(..) -> Sender; +} +``` + +Why `TheKindOfMessageTheActorAccepts`? That's because each actor may have a +different input message. If we take our short sample above, "actor2" may be +receiving `usize`s and sending them as `String`s to "actor3". + +Because that type may change from actor to actor, it should be an associated +type: + +```rust +pub trait Actor { + type Input = TheKindOfMessageTheActorAccepts; + + fn new(..) -> Sender; +} +```