From 98af2b403451a8f87532a977e31cf59cc7b45ca6 Mon Sep 17 00:00:00 2001 From: Nixietab <75538775+nixietab@users.noreply.github.com> Date: Sat, 4 Jul 2026 10:54:15 -0300 Subject: [PATCH] Created launcher to manage the config --- Launcher/.gitignore | 3 + Launcher/build.sh | 9 + Launcher/gen_icon.py | 31 +++ Launcher/holos.png | Bin 0 -> 72379 bytes Launcher/main.cpp | 486 +++++++++++++++++++++++++++++++++++++++++++ Launcher/resource.h | 23 ++ Launcher/resource.rc | 78 +++++++ 7 files changed, 630 insertions(+) create mode 100644 Launcher/.gitignore create mode 100755 Launcher/build.sh create mode 100644 Launcher/gen_icon.py create mode 100644 Launcher/holos.png create mode 100644 Launcher/main.cpp create mode 100644 Launcher/resource.h create mode 100644 Launcher/resource.rc diff --git a/Launcher/.gitignore b/Launcher/.gitignore new file mode 100644 index 0000000..7017898 --- /dev/null +++ b/Launcher/.gitignore @@ -0,0 +1,3 @@ +*.exe +*.o +icon.ico diff --git a/Launcher/build.sh b/Launcher/build.sh new file mode 100755 index 0000000..6ba4aa6 --- /dev/null +++ b/Launcher/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +python3 gen_icon.py +x86_64-w64-mingw32-windres resource.rc -O coff -o resource.o +x86_64-w64-mingw32-g++ -mwindows -O2 -s -o EOSHoloLauncher.exe main.cpp resource.o -static +echo "Built: EOSHoloLauncher.exe" diff --git a/Launcher/gen_icon.py b/Launcher/gen_icon.py new file mode 100644 index 0000000..a43bc2f --- /dev/null +++ b/Launcher/gen_icon.py @@ -0,0 +1,31 @@ +import struct, os +from io import BytesIO +from PIL import Image + +SRC = os.path.join(os.path.dirname(__file__), "holos.png") +DST = os.path.join(os.path.dirname(__file__), "icon.ico") +SIZES = [16, 24, 32, 48, 64, 128, 256] + +src = Image.open(SRC).convert("RGBA") +entries = [] + +for size in SIZES: + img = src.resize((size, size), Image.LANCZOS) + buf = BytesIO() + img.save(buf, format='PNG') + data = buf.getvalue() + w = size if size < 256 else 0 + h = size if size < 256 else 0 + entries.append((w, h, 32, len(data), data)) + +with open(DST, 'wb') as f: + f.write(struct.pack('FpSKVIc-YS${a>Z#|2;XYNq>V_9c2W5J|H;C=r{ua zNLc?}5P!997^~#Qe+~ z!TG=Vmk#__fr={HSu*gf77*Jttw{fw$<)15;pTV*t%KP)BG0EYNHT#1}G*%CN zrA9Fn0_nq?SLke1iHV#gPA2gT3p}aO+YZLg!+E{UB(2WNdP?2}m>oAP2so(TN2~U* zo?IWnsdh0GYd{YhCY#p=r{eqEc+Hx?Wub#Jc7SNRE}S54NMdj4 zFBTMw%LUlRqtm#zN$h+)WiS*-{Ag_c^C!Qvli2(5QqtKOOG@gO^a~dT-fsltOED;9 z0#3;Vfd8I+NSceKK^6BAb16=L6^5lt?;=0d=t@FRY{@=bv=t*<83 zA#I|^Q6&tk0Vx_9vdQ8MtHQK&or=_4WbciBi?lgGbV-C!k9prCJTi&E8Wi{Oi98B` z*YB==^v4|nAe|A57R$XD3Wc`m(WthB@Qfb2atdT3=?5(k{#bECC3T*D4h;4SycsaM zw%5W?E{>zqCm2 zQO`OwD5-in8DFo~^@_%oeCp!;xT{|4a zvRvd$CF$Npy8S1fCE5d@ng;dMh6ZXzM^3jY`MylXDr5R}F?c!Ntu{ZkKj=WU5}#O% z52t_gmnVJCcC_Pb3M`%=N9m`-!ycl*92Uj0ku0&a#xEoR0mVOJMMX_f#BfCd`~xf& zdV8>0ua8@!Q0Ly;k2}*Mkbj68&8%}1SE%D~$CcHZd!Xw{|H4CgDjkMF?ppe)=H>Mn zc*UvVI;mFtG+k5Y!U8zMa}tqw8(KA%uk{wW&*bx%@H0X1$h!mA$k52}*_X42b7)7o ziJNCMGul6v;y}$N<8RD@O%`a}u-qhn8wmTMIr$)=gb!7RF}}pW1xXF=&VM?L^}aFZ zF((2dx4*uYG1=dE{VvlmO<&jsK6n*MQD`0-*#&Q45GNo2HyyrfXf1%@BS?wg++A@v zVw6#;-s*1BFi;xqarO-+*G46t!FaJw0YXv3*f9R#u|I3g-GGO!Gl3Ue`4R{bZ|tSjwKUzrOT4mPB|& zrrH>mckE9Ug`fYxbb<9@dT4?9Dnc@hU%x|ogzgfUZDxdyLrcnfA zzveUsthUL{tsxll{lXELDS3c_!j_%kZ6-rzfZg+fHFv_R$}|-n8mK({-od*b9dA?} zjE(>Ku^=O%vywT!CYVA8MI4Nyus$Ib{I}PLm#z7=z`v^VAko&>>=dg|jHkR?2jD%} z@kC_?LlSc+GmISX97~pLy!$(O;vg;S%xva_iB~bqw8KSDQ!Ing_3MsbWyO~>BUTtb zSgc1w4dK_@aCr;Ak-<))})4IH+VMUpSVx#o~c}rh_ye?l2#qKW6;-RyI%|eZ~ z!;B@X(xsyx9PBT?xlc(QMeEQH_dJdWj>sB(gN6-KPc-c@>X}rlvHG-w=O;X>ODC3q zzpaADcV+Q*v9^7BOdD&5iM=Tl1%IJ`u+Rj;jb{}-T*?;I5KPoK5{Yhu#q4h=U55|>vL(u@J}2v zxVon0yyVTi+cG7mBSFMZaYac!-rY_l==V+g@W%)~?qp5q$ypj+rV5USwrQka6Ki5Z zn7&4DCY~^#Bx5v~0zm~CCc3c-SMtIb%^d%9%=|y;$uPwmeWQXfrs~~?EXt(RmB}lC19cs%Rj%$B9V}sn zO39ZB?HF4+Y8O+qLSvqPS-e-lGUtSco9D7&Tf3;HL2b+9gsz;#(-*XEH{mv+9>(vcJ7Ln z>ig7+5Vqg|Ds+f`P>hqSPV~xRhDzeKf(wm`AEeE5-m`vkVV-K)YoPZll!}mmqgkMO zdpU6EQGQ5W@vvZVyVyi3(cKZ+W}BaHwP`E=wa*gsg`y5JmlHyfLu>+ZnY^LLGT_p! zw`m<7{V>1a{{8r5En0ECE85!i*ioqt0ya$c)1+=|wC~OBRVdzJVQA?eXBHeYNQ3Vn z&H#x?+Nqrc!|FQ@{lws6$%)IT1r|LV>j5DyljU%)>U2Bu{_w#+R*OQ*m z36^$imnse&B9lBan`wm>yF;k*BXwc&k{qN8>`|2yQwh098F9f6F?X4%z9GA?@Waq{-ti;jP4}L9RtKht-eC>uk}n2q0nQ%1PnjFT0Mbp0?n^*sc?q95WGR?J`mq zf~-zVa9EQ^a7qhl>-Zse?2DYB_a<`5+U8~|w;z2o8qS^NcGzYHF1w-j%mE~v?>wn^Y%}6bx=o0tL&hBI)aIq= z;#Xvyel|`1T;l69cWc1@wi4U@TkI!A2z`^aLo-?vb42HnZ$e# zGrR!jzpf*o1dXCw&*Pmi6|!8pW6#131MP$<6EVgJ4mEs6YLvW~en0LsjB47WqA&~3 zs}P6YNl*%#qXSFX!=3O|N#dmO;5Lj|MGG{I67HNBvR-u7*H@^*B{;bw3mnj|ydilY zQ}8g^9NG%$cGNS#{`V=$+5^_-q(Ok>?a0Q;%cSY^Gl7vmEP#lC_{R%N z8pPNEaYBQG$M`&PttTm^)a+<&H3rAw@iS^oDBM_(hl>NMz%efi@V)(dAsukU#D~<` z9$M>L8~*W+Qq=kjw^}U}QrYiVm&AZ>;G?|LKf0Q@Jq|Q4eJCScJUpU=)nL6pS3Sh; zo3R%RTI4z7JHr*iw-lI{qFAlB`_@q6-_Kc4qZ{e2{{iG`Tw_>&^`8M85{YwtXA;QK_j<0LuX zx{6Hy@Rg`5IU7eU`P^g$lMuaL#5tPFv3n@lISQ{f$5966p=@ESEaLfyUUeDd1N7!_ z9c9DdX}|l$JMlIOj=>6&@>PuHo9FOG>ZG=UB+-Z;C;V0jQ-aS>*Wo85&bW8V zl9YF6hre$p4{L27y^CunPxN`smdq??&;rWH#g_LI_AOku3MLPni=i^NoA(atR2yA3 zgCJj2C{YRv_zBaq$OJZbl83JiexfQUD3yz#E&>$q$ikBg!}1ho;{+igY^ks1zJUf+ zstQ@FE?}vm2x|qp?aE*9ScMA4QV0Q#wk|!F-Fx#uC`Gh>%Q4JtJl=2f{yBsLGX3U6 z-i%1y1ZyF$&QL4K^^ScFO8wL+hM~BbV3Uaq0n+8}k9nC?a?`L4^=e1@YYCk;U}cV& z*iU3RWpc+R;CA|)ug59^t87T~U}7yFhV)#+cDZAUKSp*%w_o8r38&mQB(ZIW-%j z6Ztb2`t3sX7kK|GqOhH0XvT^X$)B1<jg zXwr{m)bn%2gnv7UW6Bxw$hLU9JI#Fbs`G5aN;^IU!K+!_!FH%URoocpp5bZKkd4sv zUXh}?GX7#~XzQeR*`#=wpbH5dwP|Imf3kr?TMdwCl zJ}y@D(nBq#I|;N>u7;sn$t#%;YyI>|gZ7|dZE1X>?2mkh-Bv_IJ`?=oleoXYf;+<> zKIfC5I_UjMpkWr#NJpzV6 zG;J~2_*IGtHF7J5h!VOli?N4MB zP}XqvV?s|P9;u!_;T>+SE8TOyPV`M^EP!Kcqmd5Hgo!2!h^^m>?Kq?;*2~9kF{UEhc9DR@ z{tm?3pkf@6XI1fp@VV+xAvaPFI!A_xeu;_s20t*C-He+(57{qgR2$bz%)~OB)W0Pb zRFq;(sO}1-TJ_fs}JJvS4B)_vdZ%9vU_o7TNc$ zW%{S?UV{+}4v*^?7XJgU6iU=ovj4yg=CirZ4!iAeQ=k3JyvDy=p_;Xnh*uT6eYI8b}=+5IGpcZIi zV|A&t0^l`Jg#~6gpmBs(x407aV+q66V$z<$OP1s z5h4Nek)yv^WuR8t$A^?1R)bu|Fn1=RYcO!}3gMAK+K$`;EvcNLFjWjj#cqA~#~u3Y z4lX~Zp7QR@PaJBU;{j6$>8gu+;q$J}VmZ@QVepKM2@_p7<($YeuxBWKmc<_T?Ra0m z<}ry~(Tn&G(J1|nM~^;$_pldO7sI17zYaTRnBl*+gH(BG#Fycw0Jd%Y^U7&SGJ03!SsMFsC|U@6(^gb#)vw$e$v z^}&TO87@qfrvFxB52@$S2+Xq)KM7Ait&OS8y&S~WOF3w{M}Dr1)7L4 zRtW#S9%ERF*Y?f|1SqJWPbn}kG6GMZR4(Hae;EP28^J5|M@B6j681a>q?75OJY07A zbYLJZ6Sp><+hZOgM!P$=d-eCk6my}cO3M0D!mFf3#w2p1M zcIh+zN}=LF_|ArZz_gZY`vKo5fJ^}Kqwt=SHALE%$$%d$2Eqjeg#Giy#x`X% z!a-ZeS5n!rU6c70zf!r%;pSjptX?ZpJ`_HsJb!xQ3n*e9cs41LOTT5(c>D)r@4b>e zniS=HAX8nbulsF$*y*MICweQ+(8a3WWJVJZ9VC9zmwR5tk~Dfqo3wsoeSF?HBT`G~ z>+74auU@7>r4}b!GP|)6O~Wmqja18N{NceE3mx#S$z-SZbxdXe1p=L36^Rpyo*Fpb+;(@eLucE^7 zQ(=~4wMf|^k?OVhy&fMEU(_tTJm}ev;Eq2HeXKqA@?d2W)!n3l25uU^2vnj{Ra|#_ zx14*AmV;3x@o2(&5<1i(sJnqx&cz=D@rtW^()r1lI_8+;ZSx+U?r46hV>|M`>)XGu z%^iC_P;9{>es|+XEMcFV9L&k~&O`Bo{u84Qz01|n!kR3rVp7@OiUp(BA1(*za66H6 zUhhiSoV`G-F;X-EgvIOs*d~IY{|Ra(q8qKMmN(h+)n2fNhK0>;iTHPVzp6Ia)t_PQ z{+&)3HNwCvoTF2_Q4de_?8{J|yU}t-rc8^(g2G@$-*TFrsy2YYRQB>{;`3kPJ3ASK zWNR!Va!;4z*u?{WaTVPknNOlZ(;oA-(%>=?oTpAQT)oq5m!gqJ(5#{F0>nS1=h0A| zoqGM;$FKNUOC2^`W_tdpMc4figA5_kp`NWpbsNs;*$|_U$T_hzh-csiS^2l!D4Cx1 zSpTWT=|zZfS)%hQPeUWYN@~j%nv0*f&G3#<>5)lsS?>$a0YoQ+%?Uv$$mIEL@IS!H zL{0x_*O&tm$Cr2bl;3b(GN8ooZ-q#*_y`N%#Dk26D)Ga2x6;c4ROww(_ndQoYKlrsjZqa@5XdVx64)gQ}t*DCfpN-J?$8NB45G&q1BAi36c0 zN+35#H+#cSSmhDfyUNnL>K8~m);hcv92f)-E6$T!j3unmH&9dy5);x0XAK@nmyD0q z$|Fo2IOKx1K9l90ccsB$4%VsaEk3*2SYv2~^~$ATao*||<;Y`a8Q|5H2FW*;-s%wn? zfrJ@#ukr;7g^+pug7*y>uBXs!SQ9iHT zkXV1OC$$d?(b_&}W7meEBLQpGD{*e7H_R+`j?jmfV})W?jS7k;Pb9VP$Z4~Xhz7(m zM^Ux#p2%9GZpw*_NLJODdtYHpw7EEu_1;i616=B00fOpf-uqHj$xDlqs3tMUzRyXJysytF97O;*VE=o||^Byl1nqgJC&c34QALn{fB3 z7|;%Ov=Ey~+4+aBgl^Wxy%U_b%b}@6Y$fDgv585&&jrh=6!8VAu;QjhvEd3Jr7o!` z{=z-+>EYfj&n((SY4|3M17zuz1~7PsUgBYML%eVK_{Ai>5FN>9Gv$Q?vP67X<_5O$ z|B9yr*y}7};9$DXVVxke$eBkyB- zW+3$^qf_Q`tv7cY)h~OB{eqlH@IWrs3l*OO(=89NJX{W?rRWC}Zobf{^{;OeP#F*z zCbg3=S^+U%E*!K9^hyp1}Ah?PQ{&{F&o@iEp4iE&T zb|;6Kg7R^+9Ve-f>uXl|MzDRE*Vi#o?n25W)8MHV#mXLc&CF;X2VO;RZnW%GonlV+ z?4@#dAtAN(X?yZ8VpZbkdai5@48J^m^yiAlW#y#Svc@2XP4&9j* zqF20Wv6zml)~aNw^uykyDvBqTGJp1Umzi*y-}1ZWCxcc|5Nk>mA1 z@`Nr2@7MM4XFaP~{?Dp)I9nj)fnWaChdI+2*BoF#OR-qg4!tCYja0zRHYHWKWQx6^ z0V=MjYYwnNsGKW$we=R16pqbb=V5_Dt6&HvByL@crDZi_OdL@E=y?;y<~>T_0uKm3 zG0+n-NAVX6IJX4N`yddtV5jc=K2Y+|#pDhG<$1kX<-eSb%?=NPe);81Kq%>&__Om0 z4!Z$fVI%-ynt`g5J;Ho^u=zp*fbGySDKaNNCH>1QXKI(U5>t=|e>yxM9iD2gjb#?_ z5P#iwBu)?;q~Smsio-Zia7H>@7&9^)z6dUfd7u7_lKw)dA~1X1-PO*Wp$Soj?dGr? zjG*qwo-5UJ&TEHr-*@c}i`?=}RNV$1KD&(>X*EM}n-1ynTa#5|lS`F%i>p6*>|pH| zj$3C6bSMact5mz2*IYFriZ{k za)(2OH#UYq-VYKEyZh*24*^8N;S`oz&`s-YFV&W~J(Cjt+ zR}cT)p6x~p!u;XX;7oE=sZ+w-eq)5_g_S9o<1=->mhA%yRoSfwvEx9RM~E=s3@1n+ z;xOGA>#m?3hRr%Jl|5xNcS?G;QV!$KtI7b2yEZ#(8%bLJgnjI|wrp!&+&^mIsRlsE z`#5J_OcV6R7(!~w-L1n9UlZ0a_;3(N{hRPx%j*#xE5 z$onMLx|TF}_vl6~(jGAB5|o0n(y+Sb*&)`~zF&Nc5U#)9p_m=}tYBdwO-Be2YQa;H z;%x>s1$i44A{^1e0g^u$K&Qj6NX4Itv#{*TmB*ph7n$cPqJ*w$``yhqvX9c`>nVAb zUPv_tYK(xhdpB8W6kl^m6ioM_Jmb=$MP3N(V~y< z^d#Js412q7pECm?ShxLI{fI(OJBHLdy;Gc1b9+pVzyDq>1d;lSxb4-iCXW2uocuKDLNtWN6s;}r8!YK(gN1su|$$P&c|B%F2?H~POjQ%*WP za-K6*272dR&QR37AzGmzLv|!tRm?i`Z0|G3^x}j;5<^zpA3(PB>JUPR(j+Dflq1|V zmVRXX*Vph#=X_7W&2Rx14QfUVJKY+QDgk?2TaF>uI=>(Ed0`jN2NooMY=JM|OXuo1 zk$V<0W@g&}-7W4YO8iAaj9_A|cU*p`Np!&F^D4np6JTCIqeao=Dqf6<=!^NC6MUSe zxB0KwzYTjJ&5yQ82L=TBY2tROsUChT4l83x!=97wP=EBJ=dW9V1SWk~43FuwqSPmo zZ7f&Lo#@Mo9$ow^D_LsiL|kwg$2p*A7>Pr94;Dcd7@_#zyQTCTBAru4DkzYe@kHN0 zp6{B!9kmtf|Ax#B2!N2yO%KMi%fUJ6-uvtzhKa$+fe(^~Pr5m(Qm-Fbq~T_it#31! zyYS=>Cjxqr%Ci3yUo}*srPz1eFjwlequAMT#7FW(nMK3cJ>38goUSTM99M13W#5FY zuh|ZfH2}4KcJT^uSY^QsWus!LEa(J(jV-5jdMBjD zP2_rC1$T{X#n?wE??;KeFlv~M+k+MDqF9c2&o2sXGA_@7AyoNg-w$S{|E<3*j~#)o zY+4m@N#<$8XV=zV+58tngLP7&pJ?aq%!>zJ~syhfPd)IqM-{Ox&nO1S+7c>_jYKWSn~R zBQ>9-=nZ6rvBqnp7Qx%~gx2Y_g&qAmBy;fyli7k!7x(6CSWNw^yv{uRUuw0SsQ)4` z1)qy%i7IF8=0yAl*9E?Fz_e!!^J$DH=Ui_HRg;>i#f*Mpi`hM7!5y z43lWydK!0d-mQ}+pM9z)Wtw*!WOn$f!7Ko>{y9kH-zT+kK~ISoHIT`T<4;E_=yGOi zyaDJLPYCH-WzdMD1HJ$-qUxJLwD4t8kf$uZVROjemQeG@pt|j$B~H3kA>%f3&_{-} z=)zU^%2+8y%nkjCzoI*ytP!^Ys*yR(dQL-UK0wvQYO6IzNAq(Z7XNqTXZ1FKk!c^M z@^GF)S7)pseRP{k>j!nz+40YhE|=Yi+q(8OYSn18LRM`ZUVz+u~4V zf101#9aaMC5fxc3rjy14S=a?*HfgS>adv$9Ys!LwNaZb3R`?HI5!Q6v?J!qqTR9KR zP~>r6pGEID`B=W4NG_yB7L|MYTI7tbzK|*{sxPh9O<~ly@0}X5ZA$*LkwLU4PYkwg z$!-Q*TE>Y5SRR{wqSrAM^vw>As#OE=vCXo7A+xF^$4023f(md4C!r0sj8c;gxu66j z4PSg zS&wrLcq2$|xS)u7yx6qV{WqsSpG*S3$OJORN}>6DUlT{ErcFNcGFAY5DlD9h8d{Hn zxK~i)S1gBC_;FVK@5&b_#Qp&sI4^tu43!}u=T{oZ6})2pMed(|HAm%4${RTaZo`g)Q@KA`Ys!n=EN~N!~{CY$j z_DylkqJ@R&84|t$)XGth5s2W!td;^&KBfnp3Heim| zsw@(%*vC-WAShKSJn%dce627IVt{p(wK%-&#eoXNz@>?5Xf+)|kD~o~EgQ&1>XjYN zmRqJ~fsaE^R-l_+#wfM;H3@Vz=gGU9$ zlj(L6+C}GA-Qcg1=;-O|x=SXHZ<|sxP{TUn#4I(#mZ|boMlyg3gOdIB;HB z&tD-b%BLt$ft`}F=e?Ftsnv31Lrj>yqBiqMt?YZ91@0q2K|U`Ud-4ot2=%YEF<(t8 z?3@vY#_QS7u1JLZdBHE0vSt*8|&5kjVBF<%E&FX5ZNb5PY$Z+&2)*oANmcjA@$0X*8b^RE*^>k$M0lYp5j* zuhzTudu3*{H=Yvx>Tj(5{s#hD%+_)?;V1Z3NJAkSIBY^_-d&U=fT3N4oxe?j$xW#Vm|1btaeh!1cm85hY&Vfu1%7@t+8i?%_Cyy0QEt`&q zbjq_*R_bCwKC8WUIh)ZtYB1juK|d{;wx3zjf~@8n?t@^4bBQN1QY66-oyXbj=&LSB zOl|oR9em&}IT`?mYpZ@dK7^!~gV{h}*~tzb^LKDo?N&Er?8t+K@^dOF*~AOdBG{;# z?J)8I0W8KxZ6k)HPZ^ZeMD*vPC2S(8gI=k=UWO(;E|LeMput6%Ldrav94k?iHuqQB z6h1v78I*z#*M2Z{6DiK|%N!pSdPMc8YuQ&(Au1g>4Fh_}w7UDRA*ucGT}26n`>u-) zDzGWn-WwcoO=$cjsTf%1JY0i!jQ5(}?guJAe;JT2*3-J8QC^aKInPSxnR69q&z^d} zu(^60N%3>M@zaq2mVIi8pqciqkEG_em##2L{<}-B)KnXErZm(-9U+w4zpJoKmKfBs zzo_>R6s}~(>(}pVgB(8Wg(9iq?|(<>M5*!KhHyBZo(M@}lefIMvJ8Z6g0UEL8sHTp z7^Ozew=6xI1L@A9oh`$H4th()ms#dU0 z_`iGNsY}9~|AP~OBSwKDC^};xS+nObDdU>S8)dAJ;*1V%-kjQLmrh9A=Npgtl(o3G zG-Nkek!7iBHG-%6o$obsdX#oLB#CHH#rR8=V%3W93eqJT85U4q%NCf8(9 zG*1^o8LSZzvaBek>V(4AA}fRwE=%ZS-kVB)V$ZR(l4t8K@{036#8Mvdm&D z?3rm=_i&M-8j6&2cZJp>QqxTJ2l7x`@iGXsDkol$Y%iS&8+1AfF<<^Q-to-7|0}$) z)bDceT3=gMBb z575GVe{?d)RhRgbN&o}z#iKtLf4}`H7e*NzL)C?)OZ7um`iZ+1Dd1!gx>4bR{V)Ncd8GtA|I-v;;$Dvw$D;5mJkpCvDWwZPA}Q@ zG9@hzXjpw2^F&DenSS>U@GrB`C1{6zbvz6#8lh?^)zq+dkUo?+C-Kxz5B!Dd-Kr0J zbWtnbC55y|smWhU6n{$eG55xH!ZOt>da(H#AX0sDq@5n~7UP4fg1JgH^a7cJIRJ6Ku6;dw}>B&V` zxW$uzf_1~KmGVR8<2mU{BkN)FPXVxhp{)#&Mi#acVt92kfl_(kx))#5fSlbcE?(L` z37YIa(pyT8eEr{z+u`PJLP!=&zDR$O5{2HW6_p)oCsxA8W3rK%$}$3U?weX_PNr1+ zhPVIp)hPYy_@%|Y3iX$&p@%g8HNlb|WG3>QJbtz2JzrJRapqAuS@z$!?>Dgf?fYuY z+w0Yg5|VXoJtkW9Yx6ZR^T6!&(1X&%St`w>2=|2t;$MrL2##rX%5q${*brgZ}_8q1<^6MwAHy9T%(ksf(?EhW0i|Y~Nq6u*k{TWC&jD=f4Qh zMCxHIviN`-I#wPJtF+tFTY7K~JM1o8i8w067{hw5W(d5RS)JfaoQYUb5tWC=;P-D4 zm(ml&-1o?RPCH_pO}uXk+gCLo(gQVhNWW72ATL?gEJyz&XeNBE6X z;C>7${cUa8lpcYgSa-JSspU$~&X9Y$)^{AsiH|TqdDT)-egx3qHtI~kq`!?L0-4PzG05;9@_kn{)uz~YV3S9Sl(zA zPLiUqe@2KcwchaFm>E0R`B&Ps4vy4|HC&&q2V5u`tZ;R}{H)1|39%PS`Iv6*e3`m1 z>^#`j9B#w|eU_+^NJ`R0X1O&gWNievfqRP8%ZL6SuFUi9jaQzAC zDCDHf{;$u&4{r@I-_I|b0~RsQ-5@*art-q{b{RheBB&4yg^hYkJ!6FqSnVHBpjM5i z&QZQa*giCAX_3@kJPf8#t81N)y(s@;$^+ky>U@}MA8h`mgwPvvSc?q%0nY!FdL&Po z!{xQinca*guZ$;1k&9XU&@9(iR*}^VUeMHu;U(A<{Xm0%}ACqMKLQ|32FTNfQ{+mDsNEx- z|0NXV#1}a+vWkl_5($>Dl6DD!4^ouY;C+WaU|nv#N=q^ z7eIPXvVfB2$5?q1h9cu>9j8@|doRHO5mYMFTF4@uATsuzB5XPn!%56R&N`cLB5rpT zOqx`IxN3p11ap2kz$76loyZI&+-C|=YpB}e(RSpX1N>KX)B*1AZ?!YLBF$X! zC0|+S#t2n5(zXTuvDfD5+B+4fc^N|kvr|G%%K%z-7Pq*&{KlJJJ*^CZCn-N#9^%(_ zZB1Z9f7#q@hbmv)3d`?s*Z=jFnL|nBB+MV2hWeT?h{*?RLrney({CWNeh$mlkr z`7YRjIJhQjW@y1`wjTi@56K+67pzdNJz(r0pwa)HOTr_4%=9=s0d2QoDpKk_`RMck zBbT5nh24n?fhLrbWSQrz*2ZJ810$R!;`hyS+UlnhB#I4X_C@*3PK!j}3nP^0<(LuL zA~s%LR*eF-9p<4{S3qqhJ_7rNp2r{jLS>a5@6?qUhBj2%N_e6}iag)Iv{wvVFwyt> zt!eP}>iU$(>pN2OL)F{B-NV!XoilEHnyKmVjMCg83S~#GWGYEsENx$7JUSH1AGvGv!Z*?v&qV|6trH?M zSTk-C1-|c{JL4==9HcV09TN%O4Lg`TUbEKUr2d9=PF}xT;5ugV5jYm3B+EOlaF`7{ zdqL+kvD`u0FO=*~q*P<$>%<6k8ddLHYM@< z_dz3LG|usbu>!^AEyq!1H{g3Ll89%^@SFN92PUA)Y2DTJ1UxD511$e?JAUk$`tb_F z66ud>2(s;q`Daqk9!|^oKgRDk#DO} z7_pC9M?PUf$@EDvGOR78Wq=$<33!kZ?UpgL%nmQ5P~%nFewzCQ_NC zlb_nv>dTkV7zu{3ryI5B}^pD3@8Mb3``$>*jQdHum&O z+iujg_P;Ot7VhLLZ+L2TZi^HXO#L#oP|TwZt|78Q913?k;xflh(N3K+%H(7R-&LID z?%(s#3x641w|*rHPc?)XNagOy)A?(e*x^&G{c*;=N}FHmDXXwIDq4PMgqCL8`$X&? zq1`hnvP5!{|GfI1L#O|c0D3n7+Pl8oRISQqH&_NdWJ;E7YuSLq^9B4FqyO~D9PT-E zzEyXD+wPOPdFS>>Sw3r^AO9U!G;87&pW~A{y{N6xurTL|Whs$u%HcNUU+th@N6YlG1*Z+6&H#D!Ve5o3KE_@L5FM zFCXjcUW*w|JWSSJ`yuZFzeQ_}?V1(69Y1*89&i_uXplvRgqu9HBx@xPrVo zL&k9yzO3USD@(h@QJ9HSe9UllJVq1=x1A-Hl_zs|9H3IQxX&hVk*~ISK-*+`P~e%M z=A>F99R))*`Tg!H-1zqJe#D%^(#ED>kC*pe2dU2M-hu5~R4d=$nwVTdOy!uos{97S zUw7V#A-d*#QF#VdY1zZt=VEq&sP3ftN!JH{wuPxTtEZ|iqMr$79PPYx^gWh- z&6Y%?W>|96eiPVE2z|+^X6K%5xQBNI+1mRd5t8wHpbOt+LTpV#7)GC20YN)kc2!P! z(8q?{&X>y5qnYrSKI-RT|Xw@l1KDPKihd>Crf-C`>;>OK?tuo9ko#ukuE+4B&$EN#H{>AD9-t<2w#XG( zrN{VOxF#j^iizK$^k&;_klGH#V-RQ~&erahw?|vs?hbecnU}xm@vF4pcxclC+IBKFX}ux>obxiBT-kAGCRz45e-sW&#KFtEVId|IE>J%-rCX zjtPjk@ba6jEo2HV1RF0@VEiO`$Q5yBCAv2nw?Wvkpqk0!Wu;d%$RnkKVscJsI z^_D#C1^_YuRPS&tJ#^NntbBDs_5ZZn!J8lBpv#uKLDKGrQDU^M!0k%)L)YmUdL?Ya zM_U@K!37m-?`&h;9N$+>_YKFr$&_fKad%>dPyK0_zVKmjN(D$A66c9X+as7xn>U&d zJeQ+UVOp;B*o2hTyf>lB8p-DA3%LqueaXzT2rFtshNO1G3{CP5fwa5h$yg1Ul_Qb2 zVCuPyCobhJ7)iIP1a3$_)~l8QkHY&pS``Ooe(uWVLZ+OFcvDpRCkYUSf z57=gxwsCv!#*n#m(7|PzOnt@mCtc5%IJn>h_(5u!tvi z_yo@`msK;Cda9E@CL@l^1}1$}5TeP1I)#|2Y0dt&9A#aiHr_}sDHYHKKOW&VfBXcu z#a8^g_tch5ZI~Vu2>BMEaVE&zT@KUzp+jnNlQ^@=iL(A+A8Nym1){a~5V8VtGUC~w_T=13MEt`e0 zWy%S9t^CRQd3u1F2}d86QKTGc?tcJqK##vra~&B1+SEBix({>5VFO752~%g^Q*!m4)rPKuZRD{EO5s<69r?;?}rY(1pGU*;pkp4j! z_G9~>0f6TL#t8s+N&4?WHe#1$k|q$005-=8)6Eii0@ly9W|2* zx?ZU2nfjT|C#%sOaYqHIU9Y0 z+fi|INX9zw)Wa^G{n8$kNK;_VVdku9Shb=T`Dy_jsWh6?o!C9N348kYpk*2{b$l({ zTsJX_D=o5l99Lk5U4QE8v?o%(Q0>7J$`%H6U^2Je188nE-s#+_8{h z$o$-vi|u~RY$p&%gO_hx`J8>YDZ_np7`*y9(! z=o4>VyX&cM&g(j1=^O$9&fCb9xMQmk4@R2b+obEPdE7LW-+Q>!0DzDV)cu#2c@Ihd zC5a?jS=lvosR!WF(j+nc>_h_hZr_0z=fSg>B^z3XUWSII3IvQb!emXHz4dVh15O*} zgrRH(&CRS4wBYL3Ik@M?y*PFLQnWR7VbADpsj1JVIz;#mKDdh1 z{;g=4eIj}~W@Fo)r!brw!eHMrSkq>U&mdtD&=8}#o}~aN1SGbbdBpeb%BlFhcM{fj zwPId(20BUVawVuo4`hg5cwIWq6!Se z^Z@N-Yd6&lY}~LB-P2Da2G9@q1**veKQa^;7^bA~ayB4m33B@I^UlrS=Xc+WKwpZ* zGv;HsG=QpCKswot-0(C4iLIh7u-3p1!T#ZGQexanW=MPUboA~W!M5$&h`-v9OvGS0 zRg8F9V#H=3Srv_d=K@q~UD#AP13x9EO3#~tIo!&tRty_-sG%ANRe!0>qt`j*Skp{o zlNl84DlML*V z{2F)e(OT%-yP%Ww2Z4@ZRA6uVr^)X#P?!Gf0OVFeYDe3(myhjsuCnfW7C^#n$u@v(!|d z;rveQ92~&nt}e8ZYQJY>mxKg6ntEVV&m;iYEPjA&QwGCBgT(Y(F>l5~v}C)nXK*7i zYFY9EOp_LwUBs@oPHY-F0f}NSF;Epl_Izyg=i-s(PPDaW3CL5~lR+(NOVgusugP7fH<8E;~H)aJ-UAE|T1Yi1|GMAbA{w z01!?(K2_xV<~N7^oWawZX)f-}dS|uKemPmux$p z=P{n15dd)diI*?)T;tVep0)5R|NWg$4NiPN>i)am2WjE6^q&)tBTI`ZCZnxXt0-OK zTN=8!2!+(ur=EI>7(}(LK2lOGs+3m1$3E|ci}ApHo3W^82Ih6n#87^K7_3A9)C#jU z2gTAV0f3MG^Q-W;Z~X>#4Xl^^0M()_DN>i2)pe_=R*6wFCH$JS=BJzsknm0HFdSIz z8MJ5V=l3fp+r-?=c#aw`rV?<}cr6JU3O|}s#mHmIVupf0J+OpnZLcbM4!k#?N6pR= z2$aLPzbDKe#rM6i-yi}tiO3JflPQ%W^bthiK5oisG>4LZ8rlA&#lS*$`Mn3!(^cpX z5~k(kAMySZKp&#`hiNli=bj_}@s5!0{MG-v|I+h6_2$vhq5nyEnWYI@Usb2bjnPpo zx1XsQv9J8y>+in)3*WtHVol?5p{G3noVx7NbB2fVU-dnG`R{+dv7Yt%Cx%D(r->0L6QU`)$GZQcfcc#X68RJnI?N*4c~;OWK&qNjwX6-Q6`IZ zYt~|DB!}tkZ2}TULs~fA`z>$182A73i|893q~mpmLx}Iy3ZBBe$ElT)skjxX;*N{zc=UYM$si>NN z9QbEp>HjAi{dM~5jSFwCHyUMx}*&xzzp&W5E3KyWep4b^rOD zi%Q4)T%OhdaO(0)7UV~(U-x};SuCE09^++DJt<$Toy0Am4QcFY$zmhX4O#L!_wt*K zvrl{j zsXBfh>wDKDyYM7*WLhv>C`pn{wL%PC$RnLjB9|M*e|+H$c>7zvhMHSY>N7XiB*x@P zzAUj>z2V9pA~00jEoRuLDS$N2)P>Pma_ig#RoWqI zvcJpIc=)^M^UVCw08yz4@S`38o@6Sbo_FAczJiGPLzO=){$aMHCDD6J5md=V4_v}m3`89F>KQgaU^!x544d4*=KTF#`>FmGTe))kvT>0|PzHxNK z`R_{2Ihn_zySf^QjzY`jqzP~%iffPec|5HFpj>i33ExNj2Zlj8sU3dw+g*3zqKhwqO`_9Kdyzhq+ zhSTXJO33`J z{nsBfHW!|)Bx$8-Ya+&PC2c2V#n5Y4Mfx8^8Dlk@?f?B+e*G!vmV4g2>NOXB?wZjd z{p+P#*>#4On*v?QA_t*I5W+B(5M!$`S^!D1f6rBUQd zLsGxK!boFv>vg!m+l&hb@4__t!4}0+c;v~I*fy{ii+W~q_jpq2R6P9%6aXQ13UY|= zl2<(&Km6|RrT8Wt%YfD6nl?nB(}vOQ=OCGS9NA0;ci&P$(mFwgU+A1HLuxu}00uqx zYXoR|na(9o2d;*Zhq&1KTt#Qds4Gh(K0Ep(|338oOHor;mc#9_S(2+B17V#W&&K11 zo?e-w?rPjP6bQ%!o^Z&B8y55gQQ=WN8A*Wv_wqBPtry4nduUbCUoC@};h|~In-6-g zB;m zy^*Fj-Eiq`JHCGVWuH49-~F@%fNI7404?ehJ6h-A)Y%IWqjfn@@{w)rzzb(wuwmVX zb&LB4`%xh~Th}Xy#}d+vqZ+eOsuj^+=$CfZ3#ZM%oQ@96ZtuWorGfzhg54v77%2|J z4sy81Sb)Kf*Wj&tZ^MgHo%mz#W~^Sn8uNO3q(WU{QDY7wB4gykS`X|dtWOaByFTtjlAa&d)?=31ul~DlL(v)9jiwT5+xuAjD7-x z(QvXZJMom`(UTAJWSnF;Btr|wUnvtnWVb{HJt^&l*sGdsqB%qrh6wBWqj6(FID;@y zi9rb4kB?>d#iXc5GW&#!zVxGn#v_uxmOxn=ZV>m^?5=sHzW0!sW~B6tG5^z#a{q0Gy}qhqX@J6lnKI_giVs% zV;G#a+#(r&-I)!rH+|}m_h`)N#|}Ro?Q|bH$mHpwzZuKKM#sip$2rttw$bhSliUB3 z(f96r_s|n(dIY4;T8W|YwpnB_oeS#Ic3E|Pb&a8 zZTY3k9b5aVWhAHdv@ODO<}XBG2Uy=nc6`Fd+dh2WH=}+3=ZF8$8m9kBBlsBEi`T#I z<5>MvKl=N7rF~aA-69UIT_d|Nw{tF*OrK6BLK3NXi~ymTBykSC!vk1ZZo#N_IZkQW zgP*NhjozKTSg>HuQHKMWB4=P{XA3_6#dqL?@4p3JZ9t@|VYq697CSRZo#%MHFVk=d z#GIOV;zjCm*p2HFP@$&;8hR@oxScej7R0qPQNu3Mf>sk4a338roGx6FEIyM!Adn{9 zVKFZIAf&pH`}$YIj6G=+D)ziQm#({hy_O&1{rAFxs4;K97!*>}(3Q5S!g8?NRURiy;x8^g$|Mad(=PDaiH(q_P3>LF8<>MiMC9i2a?W?!%_pu8i#gHe{eDzx&l*iXx`EG1lSH{3# zFPbu~@KYYv?0gb^!@IC-<{|=v4z#2ah+FMw&7`q&a1c920<=!Q0o}!Q_~Fer<3k_# z2k}hl2oAae4@N9~*@<_?v*x3_s~aR0c<{F5;HP7)B&kzyU2ZT^MvcRGp7QEDK~(vt zR9~*PbM>Mswjpq^y*!enZfC6dWGr-{;I1Gb*e(@=JOR%kErKlqLr;Z@y2=pb#~kA? zR4c0IAMI-yF>xw7UP01?wZIDtfmB6c)P7tGn~msNOqzJ=8cX|b+FGQocRW!*W!t+@ zme~RaxhGKCkyU4YV~qJpX!0N|ngaM(xapy|JV5z>D=eece9RnJ-aiTBQ& z+0|djC*J7>PLHm+8Uy*rsCR{rTIKDp``^F6@%yhi=47G2dH^`%dg9D`h{@~^>;3Z8hIPc02<5v%^ zL2hIZGT9D{U=R;(E?{?V4o;pu7p>`}wEs%RrXiC^Vq3pXk|%?Qe^J2Qi`L_nS1uvV zT&dCGHk$wh|MbD{%dEi{yx0+d>yM*fKyULXkqM{vk;7MA5N1xLJ)p{(1jVKDB?zJXTpUn}?AgOP3iptMp zK(nn+V)K)q!t8hw2g}xr9DY%gk4WwBB9QFievS0Fo!hI?d5;nptSuKgtKk2$_Z{$d z)YZD*%9%k@BR60_Q^SWX3w7eU;SI(+SB%VL&|^qvX;H_ zB@?gU+aEgbroR_5?$45EdqSyFt_P=cQ{@kpjKs8$UHF@8Z@&BTgGyk&Wfj1@+2^ql zI4zwj{#T`>p62t0;qf(KUgtubIDIy@59G0OYaD@kbM;rQKkK|*k5_8&-wE~`CzO~& ze)OL2Vga{@o&6tp>BTM3NJ!i+A2ttfKr|aAB`^z<>+0d-slauLKxDU$4kDU1aPy7J z@Wi9rasK-b$0=uZNPDnq3OO~dz4nKA>ZuiyuyZ;?c<$NF_~Tvc&=6|DH?Kc_>^kDH z96t5$_e#=@$B8wEThSD(L)oYzW#mclot9Hwn~G~QW>wfKD`kroT-nhcYtax|8T_)D zLax*!ZhF|+iB|Us(DGi47MC)P5X|o$<#Y6O!4>EK?vzr_{ZXT+onVy9 zEk?e0e5_*Jf5rQLefcf-eB|#3dj7Yh0$4Ejy>s(<Vs>i>Ji1f(`KB~kwSz0a-1r@w7^1K+uCpG|*ON01$@-8G7IKWc>yGuxI%1 z8=n2&*LBMuFMFJx9{-n%?wM06c-~_ay=UYLrP;Zp@r^6qd+XP3x%a~l9msj#QVQUx zIq!*7tI7wmnbNGd0>ux}!|40-v6(n-&;P;bY>J>cw^g6t7 z?s6PHuN9j&rr^-snBLxsnVpR&6v`5NyLc7=EX!|!XGsY-t2Xz3Rb~RHl54Zdau(CJ zRqj)5t{jfVtK3^)rU8So^$O}p3AB2S5zx+1{s}n`9;#QKWrhbK@%L-TDYltxj?7m>?k;pFyeb>ft%R70?% z&d=nY4R*4R6+j~?0CxL>^qwBYQf3DIZD}%Um;d$%|9wO2{|B;ue&_o*WLfjsYaaY= zY^1uVRPbJAmZ~RTebF5ox2?}?d3fc=_6v3LmQesl9(MjYg?#B>Diz166zjX)EFWn=hiEcB97r@i#z zL$`?t9e?rXu>7S_DvH5k*tLdoSR*o28Q#G-0j?HEUVwp6|5>b`F3qLMHDxMDb{nIP?frw+KE%dO6dtS=8NAroV&& zg&0Q3y3dJNLWZa?c*iF_2j))SgJQS#)_DEc@{91Z%TGeiu|LCo!>T4qgae`yy>^h4 z)L_ZLURtx?QXasr>pM4`!&`GHKdyfNA3HSF>Fk^mbi50MUBLJ#8?Fa&8V+$7OwpIhzG|U z(SkroM?O=A$E(!_=!igDEP9N`r?|XeN~zA_a0wp{ctWsRu?Rb4Ac)PdrRt~&2AA-7 znywxaFkq#I6KkhUqVV@1nKe?Ij>^p5Xx0%_O&nw%paguEr_v3LhsP)t@d3e z?@+_^{(eCnHnzl}>16eb7;80V?6#Vy4uN&_=zn7oib>yw`i635hxq0T1zf+Dn zu3lYm++XqS8_#;x9L(B!(<*=kM_k~~=ZsHev*pVintP_l9Z;Ezo?BiuhaVAlD+&J; zvREN(9?T(8$u9FZmjCu`{u9yX&1ja@!+mCMk})+T2Vo=y*U#ft5XQWZsRFGpqT@~?evlInMOh%5Vl@!6>e=Cp?}|liS9L1q_YBGtM0N# ze#@W7x%^(cu_t1?{Z00R!9Ee;W>m#f(`p#n;H)EWQ~tX0l2>^HZ%PF)cjme8Nyf9+mP$C@=M8%O-Y}fx?mNly^BnjF zZyTmZ+To;)x^XCLmYn(D`Rl7+x$d@ew(R3u>|p;LXC-(WPII|&I6X`z?xfpQAfeAu ztevUyZ25{j_~$H7`C);eN6)%d06k7T`x0y#a$sn~Oy)Ei-<^*P?S?}vYrZ7T^l82Pkqpg!dn(Ci-%CU|&#$}_7p`k(Y z9;)O4QMhIIOQ^fJ{G92p8z=ny%*nryE&RI5ynoiQ96pq}^_l+8@&8-3{C6nVL#r+w z`wCe2&ph&W<)M`q@1z9YR0`mzx#zcLGsf5BvFv#cO=}DW8ej=OC;EKk@;9Q{--bzn zMzXZPU@kML1dCq{1v5{2N|aT|qP+g|ARR&|fc;bR2XZ-Q)zB zPwM{zu?>i2)=O)yN?}1ms7-qIO-;dJvm)?@oMhq4aJW^W9p_}8gPb{+3u1}0#j+?M zox%vxSXOeNs@PQAjJB)T%{Zov;Igp%wLu$}H=rrSakoN|+I^XRmn+5KQN8H!9ZkwE zA*0F|rVDderui_j2v0&{#lWPcF7nLUrmmvzWgQa>O|a~JN7u-7=-kQ3S^Xe;JJJSh zS$&sSeO2Q69m21R`_C>v*Z$cvaEL-;u0lne9u6Tm{$G>dEB2ok!++nh@&AFYU4@_5 zn??c5oq5j3Mn_VgD3>aSd0c)+Fw_LUhumo0Pn#|MQO0#KkX?MJ-B2po%aFR*2&2AW1+>EsHW> zrI00I$k}-U7P5cd@e{F3i!c5no_S^v1H(D8?k!~XLy|}=7KV|@jgs3xNWvKxfz_RE zM8d5SZ#UF?(KOk^TpU94#Y-4?$Q#frkT4*gERg45%D_uWQ`+OW_~p7owPJMk2)ON* zl?TTQDvu~ru!HnVm1Z32;!~|S-wFpTPas=PB2008n{N^N%iEF5E+u7?qt{1BXIWi` zO!!$SXAxkU@`^Jbshk;@rBh(|N$(2ni;2^|3Jnn?Uemj#yvODhMe#6z{442c8O_& zc?2|L%Ek;-tp~fNK{ClPQUoeomz6m^>)}w^x@|WmUBlKvn0aovL)`C58;-3Kj7d zMAPt==YD_+gJ38mpyL>!DC4;#>tB`6BG6*BYJXbGN-7nnb-euAo-WKuL8UA#Lj|tc z`x+5VEkoWBrC7hoA`PjK<<>oFM9`K^=sdnjk30)eRBU*$G(*R-qP9sL%rTG1#r}y_c%%= z^U8QU^SNTN+~Ib4)L@W=-CGa0Ck&S(KrTNi19}AYAXyHTVJqvM;o^T*E9FP7yX`%D zZS&gAI%y}@A3J_N-WL>Wq?uMd*%ZvVDxLrtUx`f_CFmt#XNBM=!4I%9Aj=xBg$7Ky zP0t14zqiOXSKj_*#K^Ti^4u#(c-ly}$LH42JjpE=Br`cw z8_CCIK(g%I`kPEvY>Lr*RR^yl zf}kTz0_Wj)zhJrxcX$Hj&;R82@9sa)_g2QS|L)`=(nexHNjrrAnps6{o5^$^Nlr0h zUEnjM2uw>6*jZ}v3WR@-lmU4ItOSyDe3sNkj;wuwHfQ~msc4va3RbM@LB$x5QXMDk z7&Vv3^undpWA@AiLgf_>JK^zKRu?BmX_&ZE zgOGqQ55Vw9A2zOEhe`CB*={dcPA-|MvYB;usTEGvSEb~p3PN5W7UX_gGv|1d`o@$1 zJ=hblLjw*ABF8Vr@?j5>D>jpdt&0$98e38ix#KRR(lKO>9w?6aG9#e1*^2#Tt|!I` z5j_ftD$*&7-ConIc45WF+pCt?itv{O5ocOLFWG%Xy7XYy=)G()XP27WiK`aQU(kZK z7r>;TRn@eIeHKViDJ)Z)>F^QyT^2#tRJu2f7)mckV`~+;F@MZXGTPXI8qIh#8bvaZ zK#=}1#}hz3{jQPTFXGUod#}ze_ti4|yITE;Li$=JLvjmr%(^l7?;goN-uBu5{aLS@ z0$6aw1(9^B@R?LH_iw7^@P>nR6!Vg$cZS5JbdsCz(n9pbhoD!zWR)BRxXRDEf~8Mf z|A%+4+MoCO{cnGxCFAD8rB7^pcH_o=+WbM>^0Q^MVLC{uG+;25lMXj0ZR&{Ua4dPp zxnz0$_-n+C9xaJEJ!{drafQUsdRdW7v(S4cgskJ539$A~kEKqP9H&c3q9x zhhv2{3HeMK0dEVvUl0z>jbbS&qq&^Amy|*pUJsYgJQAM=>vVg-CM;uWTJ`=)*+e|b zNjynUh!1QzD9RXxmzCqUJQgknS}uM?6orHmTp3VnN<|f`TH&e$9AjBC)BeA-@-PJ$ zg%d^c0s;;{!tTk)>IwQ=iZqZxpS2k!`W|zo=XX+8)<{7`l#i}EF*-Vmp`jtDg#xCz z1DMLCJbHDLVkP%Nw&441tM8n^>W^QhUHY@0x#4No`2YVafPG!BivpN`_<3EKbm5!X zbm3B`+l??=d@s5CEcC1Z$klg{(CgJ858i^JYcXe_bfc-2zI^>3&fD);|Cyy5*8J_^ zm9sbzqRi&MPri>ZQd%HkVm7DMkE^}O>+DLM*)=&WJ9S+vBR2ZR>K9XW$|WUaDGdxsCc`Auo{S&t$CGdXoH- zii2Wv`KdOmu04~mYERd(^9Z%q*%8f-INBcLCA0VdyJO$9)d=iay(JiCLC&k2b;3yO zb5~F-C+PlV5o#|WE8o!glPfZ=Jm8vzeA+?xsS`8WjN0PtH z<%~0U{+$);*TE$&e^{)(gK4WwFI|k=)V<0|Pq6gu>+d}4&I5VB(@*;F+$aC>@~jNS zni6|DO6cx?9(DA-M|4err!IiQTU#&~pN!Sp)}ueZ4JGEX=hjw^oneu9SlIb8az#=S zq$v7^OsuR8{p1cig@XZhpF@(FR%Fxi@C@d>9}pYLR*>=h%)YBT+)$afTIczEdE~N5 z2?Z49uJ;55&g=0wL=Z}OVdk*NvxHnnK{`g)lCy?yRw`96)0MRQaspojT(xPpU;~0o z`(Sm=V?uC==cBRDZLn_^qD1}f(haGlUNlj5&oOm^P z!jK^|2iF)`yhKX5Q_av{e7F+NVREX+f;|9|{M$$P?@MnN`0t@wuek!qWsT40^CbLk z4_VTBvT|WKN%%cZ+B6D-V*=vx>kdc86Ey$i^p`&UliLnF(WffzFBJ1SS)W$Hr!(#M zNOU_^tot*9jqW4HJ)Sdky=0RPotcd5#q&S7A~)g?ulRe0=#Yq znAk_A>8Oew0+7IQ|9_eU%CH2uB7$E~O*QF!qoRo|VAAQ|*cfxArpok5Qyw`O#263w{dYj7&v5h5Cp|uQBLzTh?83 zsFEaPB%~(F&>^Kues(!X5vUG9E4s<^ap^8;sdlkKaPa&^OJ(uMv24-6XgYy>AqSO| z&rRuhn4xdNW$|0(y7m$N%kKZC1Kn3|*Y%nzfD_+wNqC??cCp*#rj0@tpWJaT3BOx! zrns3br|BnAA*Hkx++|)KMgRzHgZ38~BtFsoyN!Gb@Q zL$_n|8o|a`}7Lha%NUbZ6f zzJPaNjpZ)VG1&}{+P17RCkXlVrLrkTo?l-T96(i+K~+dQtM(i|Ye0v57FeIhw8I0T z`7(>*{m6K3RP7Kzu{{urVT7v*3{cVq38=y#foyD;0)L=RxC#AEF9|Nk?nP4QhLj&I z1!-{t^1~oY&YqSv3lLUUlnwu7kAOKD{VpGTE|2i}2RvRh1^lSk7&{&4oA2l_rIAODeAnNFu5^;IJvdaOa{?(hGN`23PxV0-Ign5A-uFKy(L7} zd{EOKv9%*>&#^3gUrH!TPJV zd&}o9)D%FeBIm7CEb6Ut*?MNcP?dgW=Ag2Gf2_$otR1Sh5-77EN^?*x&Ii4gS%r#{ zR1~rz)3nQkmPcXX|7F&$yI@r$V_b3Wu+SA0-(C z%1TQUSKqA73N)>;;LKTQT^A$_us8->2zeuz($IqG^^FMnJa9N27>Q@FJ-UrTx6K%) zn7`!SXZY{h{}|9<2pB3%^OWKUlrj<*$5!gn!Q% z(mkwGPWVtmI+gn$qoADZ=2l^6fGm3hZAJ<;D6}Y%h1(umE-rUleHUgnHOf9Iq{`@y zrV&l$$ugD2MRhqf@=i2yS(}4lM7(|!$y3N01sQCdE0zw>8E!!c0ogk#&mntbR+{cb=u+tPH zJGrQlYc34Lv{j0gxHJs8D5hsV28FyDpWBZJU8`4wpFXcaZaudQQ@CQ1!eU}j#`-&T z#ZofzMpif?Bg9DfD_Ti<8LFH)pzn*>jf<5mx&A2(r}`;GYeZ{=LbirRjAXJ%=g8Vu zl2GZrKjmHmpE7_@J^enmZFk#*t^X?ry2swm>orvXE|;s%;|wOrvbA_fD7{)6TnMso zlzfrO&wSzP*MIQqv!e&|9=V+H*+QZ6E|(q@41uui(0e(}ki^fMhnHd`y#ihB^KruT zSrmeJv3lJoUf$l1;Y3W@aoG}T5_6U*OmT_}>vV9|p5t~GZC)#;ua(cLWXY7OHDix? z@TyhC78t9BUMf|EsW+J&K&~)K7BPmp1`q07VG2F!5eYR4!Dlq(BzKxbfwTT3yhffZ zF!S?UZE;p%kCZ_sS0Y7H64#y+dTdoi$jgeL4Y_JySy+n1IYC&ih{q!FKMR>4xws}!XX#x@-etLQ_t){bS>#XD@ME>=+j!UE#=1GKn@kvptBW8 z336hxD3gbW(u3rg#bhXphg?P>4iQhxz}A96*Azx;%UNh_EK3#1RFe{>)J58{e)|I$ z99{qa%YVCBuW=Hv>WAs^dmW7I>mY|eOdHEl^hQeGbNS70k?`+{v1hOAgoT%!l}Z&Z zr|?4K-T}X}3tqKZstW9~ZW(?GBiWT`ZkUA=XDmTP4dDJKS7CL}D`d&@m^3AbkiQ3i z`TOrs$mPTg&pvD(79Mdb3fU%XT)%-VnJKkw7lklPKc)#})*%#F(r<4wuSf-eJOhT| z`T{DNCp*zWA#?wRm(jiISwxETUQB6q>SwTO^^hRrj64Y-U#kc+S^rFl6b|G070VSD zypDn_3BN%efHl2G5neut`>R$yK*pPiQed)<9l|eR3wr`g4pOz^a$f8aFpalqa|Wq) z9c~A5PZhY6OAC@B^b2o5${0efycI5wpTa5!CNqyec~wqk0;*~#(zOJG+>-DZ(wqMV z$C~xgvL1 zhy;)#xlSe1*s^6E(#c`kcvkt0E%CAQ&V|Pru`D%Nf8ot1S@QW5u|ny5FS2Ca)~{P8 zAwyz&2KnWdbyaOS-WH9?^w%^GrsXn8fo;H1L+ZKx^nJj zZx?ezdaVX1Iv*#U!+t+`VFhFhNhT$o7Vu8G zJhJHwg(f68!8&A8Ddfur9(eLk(!ai7!4l}D!zpASSJ%*`uC5g|f#5RKw_;OdbIyTl z;xcf9>;0VHlYtwGT@k3*Nx_Od#QL+)l}q-t-jY??=kSDtzijg8c}vtyyWYP8AVe`d z3%|2PfLc5hbke*mBHlruun_%QeA3G>SfcQWlnb{L7fJCnwe}!f;WA*A8PHIo>&($L zB*;rBiz=`{%cUBPwT788X=r_uP_Yjs6IwbyGAmaId@1DfzvrXp{^9$-dfT>lP= zM*|3k)#y*|K5f?c*Z$(}i+CQ;CwYTC$2s6#Xlg`Q%BDRvR}pS!vP)6UubLeY?nxkdJxtWBByoBV86|EDzF{*dl_YUk zQ$c%PHFc#tc0Fy{>(NDD*kQBZfnWdgA>8@E19GpfxcF;$>G@s?mvUqv3NlD_O7m14 zJ$X73^c`#+9(2buv19Xvz)hE)amP6>U->Jy{PEIl2fH8N%Ih^z07p#!ppq|CE;_R1 zNY7y{Em*NVT&cQ(_uv1-e;>5)^D31p?>34!-b*o`mxW&qbC%lt+5M+COz`rt@n5^{ zG6tkn>`~QY5K{Wl?Qx?(8z`AhgVBpzCX`{iHcHOxC4nWcAwia(U&~6u=kt=%$YNx4 z6dwA!*W-~hvKPVecQ!{#z)ZpAcHxLQ3&~qK3eP>el3xK`Gib9aq8L;r^N<4h4s5?r zeREtd!$8aSq#lbHgkxz=JaV?5U4JfZS`&FH77hRwMR=uJu%-e@{l7XUP@Ij|q@92) zzv2~7%I9Fq>6BiFNarB#yZ3pz=LTycbVuVDe&r={@tyGU;E<|WYac?{M)4Ktx>8D2 z%73Y<)zD*o4lC;*e2VtZBK#&^=7 znWpGF$|8}AA=Wev3p!_EW^)T(8R*Bxfxgg4JpUnoK6vs+&$;t^{;+cMb-#Q6Ase{) zR$8x#0%&ORol-4E4nMkcI$1v21V(?-9nx+;6z4u^(Zw@UDdVHM!=*BYp4)~QNYl_- z{>QGbrTyDw*4Te{*+rbym!5xf{8p2{2!xjfIG4|hr8Z5MC;{tbrg#Ee8ORrk!maNi zCBU8lKj#Z<$@7xfV__GpJ(FhA&mA2z(Golzac-Tj)XPRLnQ;jL6o&hfmEwK?N%YmQ z2CxY_DpnkC+HJe2U%NAJ*qa=LPm|)jSMw9lL~ni17rot;}4|ukEidK?_&1kGsu(as^qe<>gK+p z9#6+HxASl;oIDwGT3Yec<_+p#bfhak6uK^)_ndd-1$TZST<=)%{hQvqTL#^?<9baL zK(0`_Xino1p`hE1XS@5!GGtzS?3w>L;97re&75?$QY==^D;df{zt=D2KAtjzs)mkP z*&prtdb7sGICO3N*0ijuWg#sXu9pNlm&=Pg$rEmLU9(1A)2?)oLSRmSeBN^1 zS-|-iCs};%o?{Pz|E-gvSh(O6_#KN79jw5sb^yK-V(IPV0w+a*m{sxsIN4XsizSEj z;@28_ENfkcX%E>HLp*l9+_uY0kbdIwj~l~H*H>cUuV(Du?YJ4WTf#BCh9G>-PI$=j z)2D*!EW^_<0^RLEF;|Dv7hi;xPuwo`d@kSZX#2NEkJTCyZGsMo?db=DUdUzA+9coF zbM0s8tdQ2_9W6YjS)0RPdkJ>vV9jT+-;p!2+gmQlyCj7i|_i)Pj7$! z{_sn_rPm=>0H-bfsK1c&o;a&z2c>d$0Vbz#hx3NNmhXf|G-(R7Qv_L!qFA4W>Q) z)+N3Dnpk|!3Ghg9MzVRmUd%u81a!6>hmn2_Vb^5TG2^dR#Fp-@7*4IF<5Lvxm(kkZ zh;mLxbfgG!Sm`RlQoFBNe?_eb!;Po}+goASuMHA_IP!w7wc`C+LXE9|sZx;1MAo3Q zof>xK6+Fa4SL?;?_h>BqP7?kcw8#KVCs#UJ1qK}Ow!&GdjP>5joB&f97d2VuwNe(A zfQo?IuaQZtCpxUoNY2 z{2nF_X@FBDfi!i5TPlCu&0!Nx|5apwhC>7$HvO0Mud5c*jzzYiS;QIK%tBT?kxU^= zF@7Wxk?_1~rQ+cb24T~R-_^2s4W})>2AkF;;cc0XcP^en$5rvtsx4Tzc{z&ZAvnod zXzd80v&)4ip1cdEF1ZrR{?1Ayhn(rK-4F|xUs0-d&w=%9N5Ik)1KZMCuwAJSj(tW( z)RoO0!mrp6U|y!e$v*OE)E07++ek1&U_L-Y<#~M@pfU6~=agwX5tkE6atmsdp|Iae z1b0jcSjxp5!$Mp1-cFm|Tlf@JO$bwbq6kz`3VMy%cbpLKoGY+|o(0}ub|uCkN;{ub zTHM)}*=1S3UQ16K|MAQ(`R7l*d&w7Wjm6?$8H{dP^1zED!M?-*W_uaeqo%z;Yhg<l8qr7y65 z*>F#0`@x>Kxg|6$nJiwVt6pg%_UdH)O*hMDdD85{_ji3g?X9C}6HJs86rpvwtt1yO z)wcE=60k+*XMT-phua>Hi(GpLMn+;tr&DNYX^}2N%k3r$$8kFkrOf2;zVole>g8#? z=bi6^&mF=`FAS03uR%P!jx2r!lP9-h@(c|RKXx;g{xgQArUnc}U!?b(&dQVCFDvk1 zRjI;?*lW~4iolC&3_w-IzBmcvZH@pDyNZSKt1u41@@~dO+=AnGsS!9CmFZ}tLw!&j zJnUo>DS#EiCFoP9k;M)ol^%rd%46t-M{0Lfd=U-SFb;>*32LpzkV#54{F2P_v$_5v zHsx1XMu2IyC$NLvSH(Dv0$2)wRoR#VP^=z@9KAPlEyn5iwdvH}DhG`I+X?>r=O@1T z;_S{#-qYOD^uMy{{3n*JePnuHtPiKoAw@8I4pwX@CEd3bqp8w7!wBDW#X0xR@&wfD zetP@)Z`&5)L#hCl9C!J2tx`X~(HB8HQ^wY45ABxhou$gb-@lSkxx%cf)7_l;cQ;Aq zUn3>s^qS9+`~T#t4lpO4{l`0vt-s&r6_?op+i60-T@!rGepm#XRsxD+e0K4Bd-{=x zCs5xI5(=-XJ$={BSiL-t=HM}ik2vty%9k-1+eqec6q6=LFlD+AFRZ!)BQKWG zP#>0jp-oaktsQbE?}L)A#Zr_DvFG)l+E;Bbb~9cwM#QLL_2N;(F0PMyiEA|)npC77e zO=+Uvd%3h)iCXS|jsEM^+F-)rpX+*VGuQRt`gbk?sYGkbqc07 zwUJTKu#OB@+K5Jsk?_~+D&ARFz3-l{{PLdnZQJW6eG9HbssJcVyr9n0*6DS6v3)p> zY^lG;;ZgqHJ#zov%Dj7Ai;unJsARlw732NAt~$8Ma&e}bHczg3O7R=JIc#V5f7}l9 z2Ygo2&Md=X)1xzq@T=p5Ulr@5*yI@e0bK06n{C*>y&Imq3w3oNIiX@&8~>DZuEnO+ ze$1IO1r9LGHflqt8Ym6A8Y{QBUE6 zSI$3g{z|;~m#-pt)OS!9IE-Q1$Q8Nzv4t#eR0vv2=?-+wU5M?gm&@%_?cp8l(uZuW ze%(SDjn(ye@oSjavu=#rUz1}ju0Jb8Q0?$xd?%ˤYwmKeTVRmeNBCLd?n>CxR7 zDDr@|9V5jiNCjBzKfBp^4?p$&mzErJ%_Sa>|8v8mz1RL@)dP(~U5jvddl%+)Ovd`5 zUL@0_S~OO7d8p){dd)?D{KO4+p8vLE6Fy`LV99YG)hlKFl!&{*ohvHXG`I<>Gy90s z6&N{~^PYL?N3@aQ>{rRDY;XyY2w5;SAg#o@xBB;Q{_LDr%|+(~KF0I^kJ}t<{e4`g zrx1XdbGTDcl7KeQhjRe6Bw!6a2YU)0|5q0Y!YH+%Z(vwz|KXs|0^88v;v-%xIBEut zJFWq1U)c&%uR`-Zi?!=1Y-p^*`b}E|EY#l7YL)184P9Mb*t&Hqo?iA4PCo8ac>bAw zA>tfsoKtq*+tRJCSR=S=^)l|zW4FIrE!NWUklBB1@yXrSS@<;)d<02pXmGkq^luY= zt1Z$c6^vTUAQWUQy$^=wLsjK2y);H+UZ~!S5N_x}dURMUwo9zLYEA1QFUV()_Le4J zTj1COs15mG*Pp!sZ_V=Cm6i$8cRPJyT;LF8!Bd*-q$dNVHs>?Kb6jg7-f?fn7PJ4X zH21>(`^57%u(tf#X~%tXeRMSa^_RCTosli1Fr#U*v?2FvQ6zF{q%&BIYT(z`y!U}m z-Ei-@kL>B3Z?$#E6adB13pK?*$L9#5XEcW4dAd=fW{U~DaSQ$@h7`EY{&4=aXW;6WH+9(`7UlxWukA>8oF6i0z0g}Vk>~1 zPs9~~=H>?E3V93hI;$@-u3NqQ3UvFJE6OedG_<1-fc}i*s z4uut_3%aui-7^Zes|>dpLGz3+V5s{t=0ZG~EMN(EN+fUpI81=REm@OMQu0 z?#JYC)^Y6bbGN{a2*s~Xc1<@aj>NY<`_+%^4z*>u|MqShzv&{8uw<~AyhGAZ+N)j3 zJulNH5LGc{$|S5`zZv~QBWP=Fgoj^_FR!rmq%3!`*xIp{8j(0{%1@)j&S|38s_@W&Dg=yo{Z6?b2QL)n4iv(lD! zqHhn}{=2`+_Pw^*e^nc8xR30=%qh9w>_2~7di~l{j=koiiA3S{L~eMFH4IfpoiB{A zFDMI)t;Z@llE-|p{wyxGPeR(Jv1F#H#1DV z*3WN+EKE2`{){B~n5`Q@1td>e4 z|FkW=z8ed_KY~AgnHC&kC-&bO_y698e^yNa3-0%N{J9%mKIxdNu1Y72+p_t@oK)ScgOblniCDY6jb?WSyg#EpWJt zPeZ9pD4_eY79IWm52sVcr4C0x^|>PmINQk51ci7aS>5(*KDF`sJsiGxcYk07;P?Ab z>x;)YG~2GLR&TG((zR;nJ6M7hd$2}RL%j&?_HDhGHEXIQ5;qO}9G*4*iQX+H#rq1T zl8~`t4B$%4nqQAcm;N_`fq;OExV<Sz$JL%jM&ID=452TPQ4UvT>;i&ebNDrpia(Smf*C&xzkwBr8Ldf4lp@Byx z`*Kv_4|uR{<#SeSZBNu&`M}rEamrVb%v2Hab3;=IiDFukjQ#+#7q{bu4gFZsF^S%I z(7snYKMvKZ4gav_pjg8{c=}IyEZCTE9W?jodvf@j*wO%8f9YY(M<< z&Id<_D~SU+AI1ICQ;EWVlXVLQz0GI}O{Wb@@od#a5pjOFs*il<;m5z5-@_>`kpEBM z{+Ag#YTB%~W0PM$fy z@a#Vygi-pFlp47=f%6Hh%v1_rPCEKi7|N}&Sbe4M-@+yEKooB6jm9_7=PsZzGE;=V zSR^Gw8#+^pAv|RWk3TzzHm6(Iid-fnJSuOy70RT`5YLj;_lFRsa3fKO(=E$U2opgp zZen%wd1xK_#ZJvVhjLj{e|8N2WSX?n*!;h}vi}}5j5io@-&LuUj>%?*Kk0MTt3?)m zZf+8$BvQP(ifpMgrCcgcr07qG?^pZ1Cr(;) zu_K)uoGx&CFdQi>K=-MQhF=O5eKX(sw5Tf9QSz?wDd1bx@q z+G@qA(mHEn*>~y=6cHEPJ1^C=+jC7jNoZPO09zvN;A3>)mMvSwf?N22swCQ0ynG*7 z;3CD=gIKcgi$F9_KWEWicR89SZN}1NkB}FTK_ncIW+RmcXt+G+?(PxVFbAER8-z55 zzLx2|Tu$jYWD=8io_ZzLt$B&wM}WB!23S{X2+luCLYvNSMN7jxcwBXKzC2m7uoVJ% zx8mLhe?;Cw72U-=nspbtm}!T(1-EWPbKPU;RgXt312hCIKqd3?Re5xGq=~$a3O2p- zYP9|R7D4PuU%y@7KiD-E|HF#^`4>eJ{wGtheP#bWXyoaGf4jbN+6mWup=1;mrPIB~ z2VGuLuwDU;@rX5D(V3Xk*x3L0Te^GjpcKH7Ge4x1%gSQf63t9Yoy_*qhOIoB%cb|* z1)I@%rjpN3b<)VU0i6UFmNpbDy2F;cI+V;`igNkTt98FIR6Ip-G zvNtp|AQp?Gr>7SqBT-@SX>M!~^q&mOFzwDZ;h3{^u1MJ|)Z$o45X;rLVW#1oH@+h0Ia zbE8EFLZN&EU0WiVq~{3A4tuzV4aNV!h5w2dpGjcLS{+`MKQfmC6DU<h0xyG zLKZkI7N4{GM#T;jYGbvO+L$aW3~*|?P;+rFfTCKsHLl4wHZ}?=$mmE6ZSBnftXe+9 zg&8WWrE|FN;VB?I?o?K=FEr~lN(f9)auKjgzd?tk<<%Pv0e>)+n6 zcJSL<`d{%+YghoU=EC;aD;Q3%pnKbXQl;p=;iO|ecEyv=-~5&f1rAC9m{n!2W`^c7 z#3Pm849!(~RMpBa?(caPANzsEcr5izRq-{=m~=AQ!j0HAJW6h_Ps&~7K>zuHCqKI{ zb=Q+7vi|(9Fbg;jq!i)~k975oM59Qg(#REx@Og%05NNT$y!6&cDqVL-oUQYyDhCUR zDbs#9R_7QzKvtav(;p1T&<&TziMF;jtXsDMp->o3w>s8h%n#-qOsCWM>tp|ecb{<; zRxhu|){Uch=joT>j}P8Np+P?>jurtcadNP(t{(lQq*_{#$_Ygd6`1NQ5NZWOvs0NI38`PE^MqPQubK^SENb%78@Vr4vf z(zQ7Ish?WpAF3t%j)PDF))Zzt{)eRqdg(h^O&&mX&;A7`01r9+_wDz8@%qaz{6S&! z`oS-38hO6HQm$&f$rrq)VhA+7*+2KVRB`POK63sISN!^q*Bo%^`;Ax!tN<>);B#6$ zW-QjxP?ssBkuSvxesAf4zdm{6ekK1-Iq?!#BA)qrsjM!XHfb>qYnzJU7`ez<2Aa4~ zR&qT>rT5EwJI|}&zqQ}nZN7;_5*hL+n3{{N9i#p@!_I(oX7XhYJ+9C5u2TgPtVo>A zuD8RX3e}dtZl&8rq*^w+hpjUpS^H2ZAd05FvlTsk{g^hjLplwu{(`D_AugAjEPo!4 zKJ{BHJn9T=UE7591UNFRE*T=doMRy!aE?JkpP&I%Z-mpu8beLkxF(0~N1h1B%B5C^ zpA8M(U*J#e+Q-U&ss-N4?=<{#w-KPge_yNNpTD{LKX3ZT`@i$-)~(x5Or-nkbltqX zT6N7#(RWafE;M`Jakg2=f9;bWy8l0Z^xN~Yuf;XI7VCf&Kt6{Slq09{wAN&HEm=f7 z5efw#-rw`&viXbh+2RLVnvPNCO`Rth>u9PVGX%&DuNaP=A3gZkS2pa!sTNOc{Vn)z zDw%?=sp6`0C!p8slAeEdxpkLCc?`_U$3&tWTBu}=xlG9HyrZ#@j23q~T>|#u*q*rs80<4NG=c~I@;jWibTxZN|&5JcWw33CZGe#D)eepp9X9 z8`cmL3z6ecbp+fIK|89ZTiAjsj$XX7?)hErkQHdNLUYo6(J3roWyuydM+)iKP(32c ze}Vj*{~#qWiUpH8&=oc@n94{3w9(gw`$neVBb6t1^!O{b5;y=qV9fmob{hU^fl79( z04D7IJCy6!cYSs>J@EsJ=3o3osp$SrA{jk#IKC2|W*^jiM$YVC>h$D(x=$xlEcow4!q4EJ_O=!o+f^5_+Hf7ZCOgdR4OB#$;dOu-8oVu{2G4Wo}NDP4E(|; zz(gS#dR>x)hON9@D+$ZPkNqC+Uh-YcTksA1?a6P^-_w?tK^vV>i#?l4_{e1^2^{tA zJJ(_L=B3cwn=z972MnPz*G1Xz#9mfRg?v%y$~xO-lY80>pDQ47yQ=Uk!VDrUIsEg< z?%m!-7F<6m0nS+@VsUI>qLWk%?+DkUGj<2I`#y?oBOx5t5~1&%%x$5HFe%LFKr@~` z`4c$xiJw?(KLWH;YD13qd5sA^tnweje>nlTe&67~uiNauXII?5^qnVu;v=S6`guGv zc!tNj9xZ{x)k?zuZ;Gmp(o4SmdR@!GtOHU2A3FbsjzUg5tynGTda|oT|mz)NxDfEaVnY17>V;BV3Jqcc)}v3?7Mw~lW3!W+=$X^``=z_Um&BN30oVuh9$4nr?| z-g=p~o6U0TgMws!0Bydc4Q?7QNXl5Ag6{)YMFL(PuHi#}-vHK9Xp*A)aa7*Gl*P-? z6R$&4$d5_&AyNhz5>gcnfmW=1X*uSRqHvM5mZYGnj3EX0MF~s<|1HruUM}R(U)pP4 zc^h6w1;Fc(r+>Wptx$?!6I*!5Yj%lbG^d(0#a8v>) zRSiUq7k>Zu7ryuSzMPBpm%x7~+GLziW01`lT&2cnx#Q>^=swzUF1L!Q(>hUKUx!Vb zwqe`$?U>TlA+9_tjT)_%V%8|Bsxo*(cc?Oq!Ze)-&}+-(Mr8AO5@c2YX<-QtZZ}= zR-PNc03w+%WRxtlqv?m=T?e=3Mw$n3l9DT-4}(J+B}9-pYwjyV;`sl5k-E zLV;TRFSm-_e+tvqr{m)O?*;z*@`1vC4`%)2*MC}!19Mq}}*`Et*Cf28`aPcOf%e}9f&bo7NC$wcz=q2Tn; zVUv$Rv(JHb+Xg5O)}fgiV);$m40Y&x`*F(M!+$+a5(ux<^o1ACtQC=VRRW5YagzAm zfS-hzn|(HK-iFm{U%|}jQz?94fX_G*3i-)l_2`>6a!|2GcX8<8_jzPgIVP!+I~W)o zLW*1*w$#Z)N|JtIvZTSF7mqKsSj{9nVSK;tB#)qh;@{PH;iVkr&R9SSvXerLmq|!< z5iBd|R~{2){(O?}6U=}UA#ansj(ca=@o8+;@X(V_%ja~uoc2Ie3vk2d(zNlkXcjku zm+l?6G53=a7@|j!gfVmf7x0cV|A66yAFcIH6tWt+Gg%?**!0REMk{4_Y}zkw7}C^z z4+X}@|9nSZFZl1ltS6qmxqHd6ANzQGH1pf;;g^r|w0jY7HZ>O#>d*e=q6aSd`JLzf z^NqT;y{-LL0GFTp>x;H;ja`!|b@%u~=Et92{)_#>{4YNCB6m8I{Vd>{H@V|@Ol^!H zk&0s^Wl-E0L^Lyiva9!dPyh3moA=|i7fjfMLYv9w=D{0^B>|{e|J{_5Osjv*A)~%c za_z%p&F5m{#;w@AwVVFjg+}rWtf8PgD-cuq_L-xmI&Rpe1z{ByB66u`Ol1Kk?m7KK_Kkz!p6S2C_5iQeZ(zEOp7ek zW(KWV&-IaMP$~^*2sT-)I%Vr>LUm;c8#rIVUIUjo84M&m2&yIc4tZFLKviq=5jC{6 zw#X-rjz+P8ytVMAZy+-DC#d*!fSbdLn=Rz3)L%EKmN}fU(Ln0mt`2`Q!{Dfqis#|F}HIjT;!Ur z9gd@7xXA;^ps4gb>T#QQ?$0@u3E;otcG4zh1fIC*wYIW-vqM(8iCk<3w{Qrst-BZN z*Kb6wvmG7n?N%sY?rM<~L5s^zrp52C+7#k7{IHkYYF|e)x$$KYd`=1`CFz)VU#XJEcze`T$YrZ!hY&RdAe3l|#f-!^LM%85;-s!l;XUjh z7{F6&p2J}?pTzdw#TY;at<95AA?22%YmSKrph}ytC;@Jq(kucm6%#9gJ;8s=dx!sS zCVf4)4`1wSx}I8o^U4#BzT&@Pqy4|yI&huW$)41q;~zkU-rOdKl$Cc(Kq@U zcU}9e08TmfKQ7$1ZQ$nxBVP0c%a=d?&tL9$Y_s^-_cz31=`VOajo#UlkE0FhL?3OY zXo~smT!>~jr>m~M?>+J4FZcOI3HvW5X8)~q|LtJPAJ0F#56f=$@zQzb%$kX<+qYw6 zI4S}%sl81m^X~RgWk<8IsGV8@P^t9~sAz5si`CDNz>kh5Wd1-j&cazhV?#t(gcv_S zngA93A?W^v6gu?7rFOwtITQWEzakIC3EklkoPxlP!Q>!rOm3Y6odh>o;K@dADDD`x zY<&qHQb1aLNGc;d&ybY>gOd!ShH! zksqEGjc@ywOZVxsn&-kSIL}B&D?g+^fB22QzFpToDS%Ut`Sj=FBgW^U#<$fqIzRUK zb3fnjnC6Tnmuj(C=EH_jT{NTX7|ibMKrx@g_R$p7st4)p2sHQT?{qiz%d1d!oBda$ z{>}g$;g~h;S06xK+L{JbMMqn+^Z^X?4G2R`ON&M5q3o7Is5Uik$4~6ynszc$Mp-*G zxFUWMJfE}&4-Q2oqdznf70cdO9}!@ZlV0ocEyw(6=VQh4ZE$KGX!4(n%>%cJFncJ} zVRt_0n}hnme6&Scz$IE9&cX!aL2~~GyOT2WfQOy(P$c$_7%;@>M;>g#$VhHr;);pO z<**>mwNFyh1$2CCOQXPHyN8DG=jGqPJ7(V~SO_;M7bhv7g4%*OT{{cESFyYS7tdGV zZbQ3``c>sx<)GldZz{4*&7uA{7*=Ku#5P^k;BP@|xJ^r@wF^IX&I8+Se(>Bcz0ub< ze(hEPoOAmB){^n`v_ek*@yJN}1h-dtG#qw+;&01-xcegV9#%G6JUo*wd^+fBSLaSS z8bR7fYX?Ti`cTYUE+Sr7v%woOe);$_zuey;jT5;4)_*J*ip2A^iE=w9@b-7HW$Yq1 zm^1a;x(DP;EG(L~ccoGrp{a~{1lBQDlM%)H^i9;)1tnq0-oWtaD29he1Q*cN*(Ue} z_V2s<@5bWO&&2afN8mIjAslExJT)pU#C7DxS4(cRHO+yK1bcWmBV*G_Bp(3xoV|#-C?(zP+4>(WWbUiq0^ zE_=+Dp;hyP-T*1(kY^(SuH~JcDYqts@l_)MT3eL+Ns@v-ir?2vQ z-S?329}v2U6Mw06;qzp7nkRRhgsF{nh$cqS8_$v@r466iT+!UQpOI&=Uz(hZ%7pM= zNyhQ$D6*(SgCmHLU^z6W{B75k-~C;jVdoMZPpaA8J3!~v(cD6Aab@4CpgSu9({3~7 z4`WRla_TBtn#uhS1u#TzHhTpdHf=#eeH}gO;q$og!VC9f;c*|tvL}Yn*>ooI#+?F6 z@_W1BcTGk|q?4|vgly5EQ+i-ja)>3?i6EJFL(^DQRPYQ=ctS2Zhe2UM3bANh5Q&pJ z+tEhW-ogl2rBc{PKV~y*sPoh3r%mKakpf^cQraFAvQ)APCY|^`3@yEzJb{w11N%sM zdaJ5E5TrJat#(iL2LIjd?PSR9+SdyHdob(C=WdE0chsf-5s&uXv1w>S4~p->Fe+!|GKCAnp{Y1> z+FaV}MRHw-Q7XBR&nHkcw?6LDt9Kp1sdrocV-!g)SD?7J8;zL=+S@zeb~&w0i~~~y zwPREVqXsPw|LuLfP)TUHM949&blvSkn6axOV4?|CvE~5qzuh+7SPKat!-hFwSSpnS zEaW7qdwSWg;13>wQlSp@x%Yb#^Aeuxb^?BgH`~!7Yu` z;KbkrHNk^`|GsHw_yvOQC+REu!C-XF*S7?k^dsA5 zu&34;PgTEl%|-VQ+;Hc4Z+PgkTLtj!OTRxTKL6S}>9`O2qN9l~shZO+hDvVNFahlkc1|7Pv_i~bGr9G@A>YnuIZ`n>7J=k z*!8EURW((&Zv4*qPI%9I%BOP9K=m*0d*GfuVF|2p4*M^L&|L*#9OweiU0MOEu0Z?7 zM}=kQ?5@DOAEvc*Ish1A-+cu20*$698JFuIg@bO(<9D_Zf9Kt2ry|gV)SKM`Qxq8F z#Ko4&$Y8&u3D?%sG=r)<7I?%qGKGiOnnCX|V4Q`B_1%pkXNsq7Rq> zA0H=eihmD90pT~Tn26mL&8e%#C}@G!7mtz4?V(xlCZuvwmvHFdK8l1;^;nk-hk>>P zKtv+KqD`^2!M|~O!DCEV<2|A4Sa?4{Rj?cJ(q3vBRAlQQYLgmR8QJ#gPfvXK?_S4O zzxmPDP0zUHFB;9-)zd3K{*~cazc$KNTw~RIN+DB!&u_l^A7A^yPrqdO@jS;%(jL5X zluNZ+E0yL`hx@OgryV*%ty-DRtYz4pQRb^CTK98 zAQ!L9g-TWYf6dV%r@un24MVIG!!RtMkY$ETBNWvdO}79$4wqBzUx@cV$4X#zb&Vc= z^dt?l!UG4Q*QHx*NE$WRA2@#E->A=jn6DkgB$|M)3h5E@9Jrin(2%f`$TCIirIeCzukt3LZ_zkD>G+qnMN;!lnY$8V;6{eC*N zWIVr^ZM^H(U;f26{`Ein{7w{imvmfG1@KchydsuK7k|s=4bfGH{}T=RopfSunM!4z z?2QWLDkm1*A>*&V`Te{199z(}?(DxhYswg$;m02n_Hp%`^VU)c9Mk!lI?dWVePVeO?52N z6pp}Qb8NG_;q!U~ow&jR2}UD8e`C>z2ydhAWZ}Ppf_y$ky~Otx1pprTu|H51fd{o% zOB8_0Kqvr^)&~8cz)3nHN!@dkJWieVj{^oBpvA=%nqOEJC30Y5Lg3Gc%%e!k;FENC zYgFTBO6ap-y2;TDQY)08EMG?$CcUsD=~Q>NsK%Cq4;V^25K5Z}?Y+W(_xSK0m+_q+ ze)7Z(*Z#^~%juJU{m8u;>qss|5^-$d7rjZw2+rRmii=`A;{;L;aUJ3<50?Tpo zk`fAeSSSZ2Rkpge&VFr?j-Q;QeLRt4VZWHhyB#*BK;W~gC$7+e10*wbW}4PF(y~&T z(!NXEaRzTUR94Y;Qxtju|8s(T#E00xpjaO(Y~8GHG+7{@K@MY>`eJDHO;Qg~X`sny zKzac*v~^4H4XGcn3!!ZDfAddMg;J;m6~KGylm|tI0!8j zNmQt`;gO0<^e80LOYwoH(1{1XM)6>f$}H4Pwn%Vju|mL;VBdEAT==gd|2!}J_X)lF zcaCt#_xG(<<;LT)-~07sBtcIZ9HA=Tkkf00-yb^|IztcBryh^C@TO5g{jYbH7(Zbo;EU#i_sg%+EjOH3OGS z0hCMC*R$Jw;Oav!qJ4u&si~h{D~i0V6^_-tKI2p0{^8$T%meJs{tLP;7C=Kc6uXaU zcgi&-HP$Ei{vgfF&QUg7phr)hqC@*9C>VsfY_R~Fy9*M^+N`TO17HCVv9FXXVk)~l z(g;5fBuc;{Tz8l<0pb5!q{~!qQ-7Zq{(Jn1 z0RP>~_|}8}bN1QS-SXd-Q>Wkmz0>h%?AjaY>d_e0rdtym>B@iqjaU5RtN!XUFIjvn z&*_pVfE%Cwa$h==eN8fUh3oQtS5chhpirz)DqE*qVTDSKnNx{K-~$)Be|<;zua{R~ zzpPp!ETGI5NUxy+ZAe489U}BIEU2q%8+3YlhQ>yRs4o!#zphNZ)-IKRGVvX%5C?V1 z>_7!$Q&mHt zBGIfn0NP?NjSNRVq~f+wa}-&#!;q$6mZwFx&-?OQHZ;hWWG2hIU|l_!*Qy zp$TjHQyUdFyBm})ov8Q&&b#mb;s3mtG~>49AE4Zl6rjV0xZo zo2v0=f~^l-o1i&XqEl0I!W(ey5g#@4;8}$0QKwejr2XShrQ;_aVvDdu4`fr~1`MOk z81Kj>dvcrw|F!-9`uX9%Pf7*wogaOoapU!`eNVMkx$%*iZ(orN$LQJP`{-%=~ z>#xkEn_w1x=VNs~mqY=S%avF8+>y{w-#EqGnpCwdr>j(~rr0zrJRA-OE|w{!tND+W zDjE&bCe%%}{WWcY!TMx4{92sPnV1Z7aK0{YtaT)oo?0`xss_oCiM%!@? zhQt|0hLW_fxGL?mLV`)??XZ;qDwCsqhxnLiUxk)c6)M$h$udb6NVg{01fX*nR#WdC?vncmmBS*^Y*`>*k+N==}fr#{EC|#EEBI^D7_B zF)r_=#X$8Yo z4L(K$UFT$zcAie3o}$YS9gzJXV5Uq|m8D02y4_^-AV_FJk}uY2adAydWalMNwTcAP z&w?CRn0~&NQ~_}oT?&Xw^*ni_by}EP5#B&-j~)XRqe`W6MMyz>zBp+P!~(!$fW(_? zS0E-EOMs%GadveOSUq;?UWz(j$omXalidy}!m18P_a!(aA%B2UxjfyM$+?e>BuGuV2}iyyY9m?$ZXsKSTRQ0#vL;BgdCB ze|qc7zR*nmAMjI!-2@Pm_`K|*c_L!rSiO(Lf;yk;V^=`pHh@py@MVW+dioT__CMDOGO|B! z)TxpU(dfVkEicUr=YS^~qo1$>`1JY$`9{X*CNoGbKCv3#(1z1R-^#JeqU~t@WA&fx z*$sT0#(fX`P31Yyc-^}z)yDNR%MV@iPd^ONFFxZrbk+VS7P;Yv7uG)Xx}W>p*x!8V zWq)=l&!guGpw%*-<#71J{jos`J9TQ7TePr|r*wI$;`SMT^}}PI-*eZXE#n;cuRT>g zYyl|qy|r0XzResqHJcbr`R=G_>+g$EgKg@i>lPBbPKi>Fnu zQ@v)=zKN&N!tw$^sC_{n)pdiupU+W$)=LwSQM#PZtHIXCx=*L?u#3cn$#BwQ;u)Iz3FwDaCoH+ny1*HW3{|kj9yj< zJA}a}`RgaG|G#ytE~mcGKM?olbIo_3p8wHsHlNb3nYfN_IJlpld*z7t(b(Hk+45WQT8vUQv7^tXp8>-G8+Xa>A`!uPKUubfO-Ls5hQ35TL~DTtA@mSWX)>P{8; zM@(R3KzwF25k)s2K#6TP0KTt7nu#hwGBt}-)6`XdLF;55Mz+C8iA0|S$?~}(MWP|< zv?eY_5!9-eQ98X!8SURFQ(2~j|8nwZK`K`>?B~z2Pnn_b{A5w!yXZjd_xYsD5f15O z7bWNqOJ6{s7eR8ev9`|l(M`!jLYS0r?qEB%xl{~Nt}F`-N5SKv*w>qgfX@J zC39+-{_Z(9+$P8W`^X8B>9~gWcrbNf1 zk*Eml^3tkA^?@X`7yq{ZYw`YVmi20zj6aqgf_H%cuX2O^0z;0*LevcspjosRyUjKX z4&FpR`oSb$k6VthnEx@Y<{u@$D=AGq4qw}#uYdD%qO3rSB7Fnu4JjX|zMw;}y6l#Ke5CD%#8DI|TCp4vO`rK5dCU=MH3l9) zFf3PdA-JaR-Usf1 ziU0kZpML8;!>GPIQ=WX`w@%Go^W)h_cqDqz*B4A^yr>S8s;%2nMe{WtkNLHiKmYxI zU#u^Ejhxx#uYCQlFKBV?sRH=l-}+GFrt9BOgutz2N|Y^DX)!&^6HxCJ`9T->uO=%# zSZq)vQ?3+6`19GKnD{WmC7Q1*!E)*rLy(5bHPsTlR4S{OQz|2q9Q4*u0@Z4r6-R^2 z=|v&y^nqeL;8*!_fzCQryn#9ufdaPL9DrgKnCS8o=6#i<8*wZa-QrFtGa5s;u4y|K z9Q$`Cj?b_!AEvQ^>&ff%Q<{C}VtJYJu*vJufH@+p7m;AA{;A16&2B?d(bM(L0m+2T92ONaQQVOMi0%UDO<=TEFoQZg#KEyss){@C`H3E1?+j9Jx(?Y4E{skzIvlZHU12dd~BD=W+h{b^Z zf}v1A>hS}C5DP{~@C1sQTTzdjR=Q9Tec0mNqGU2bGcybP`;fqC&$Sq0uIU z**3Rr;XiWZIrO!EKSl?}o=-1$>QA$YU8e7xoS~5OfNYmYy6MzZOLZc$a1TiN;avlT zLTnA7Vp6Pfc6l65H|^U$A@>69%Oa5o9l7!fN~O}$FL8chk&nA9^k?8fL`!k4SmxR;+$a0qh0XKA zf72H+f1Xt1z6U;nPTTnV;7vFDYO+$De^#}+bVMW1WrnT|nocuWZ+IM<+w6*p-OcE! z0$_RCpD$#_5&ceAHz-v&LG@;V+=g+{$JrkKYYMTYhgT{z*zo%T(iJzu0$VJUB%cow z5VyxEpckj@w8}hFzHH0%$(pMRC%-A!c&wIKjBGu<6%wSQ zE?!NsqQ~PA$;D$uRULP%_<$8FKvf+w0k8yM1t93wz5bf3cxh=5r^*Zi3Vf*VwORf55T_W11G}#EVaL4F}KYEDw z8KYP{Dg{4nCOoRFsFUbNHxHK zjH-^hR`mf$FsL^6erj;k%TcGvzd8J5f zs$Eff%6jne`ISnBD1pADVjNcOyxC2OM%%&9GiRphiYqRYlpz|cLg?4lQnazLA$V4N|>crG}a61@fh<`H#sL ziG);}EYn`aTjb@H*`G|Z&mQE-S`wrh05Ryh2S47`HU$)BK!JjE)&EakTdLAe!g3lN z+`o@bPo9xg5jgt6{#NS2sJV#Gc&U^Gd)8G#z$Bg zI;6!IT9u(&(%QNzFP@&Q2*v=v@d)3dg(Cn_h__A-Ie)&sW}V9A06p`D=h6M&`zpH` zWveTZTa*-nlW3Q=BXa9WR{#HG89h}1Eu$H18cpX@4_-}$OomR+=XpYh$#8fsD%-s) z_^)P}p{9l0)0A=u_sC z><&G-tWxBPutQO2TO_>g2BK2kprb8$gMywI`5~D6S+S~`g0##E1wtCFt*%>9c~ymo z`+$@l6dO{ZSbgrXf}c(yYZwm93l>9UgfBJ>>s3Uvo)t5nv<6U$LN2y*m_4 zB8K#%$D{e@|LLQr3P3X*u0nBDuh%Mc)$o9@)vW3s&8fS57rE>0n}1r}e{A@#I+4xq z?V_Gg$j2tAk78^sEUm24@#CkdpC|J0P`|83;485C02B#^3gKy%WdQ*h9vY(4rzhE5 zEt8Y?r%A1mvLFy+fM4%pGZ*G_rBY!9;Xo@i;Rir$!0YvkyMh%DC_D(2!>Ozex8&S; z#q|25WLMH?Xt3$=i`fs?qE@d3!(Ya z>#~1rh_ogcfLqOm@cn@mDa;B=c^`%xcVuXg%52$ybqLU5d=IEG{Cqc`vy< z$D$#r7l6sWu(T{Zfn#IClt@Hn;%nBb59w|f#aJz_QE3Qev$DL#``B*5*9Dcp*Aip<60SN#$DOatt^;IX$Rb@+JQQ{r2ERfT0^7oQ<18sP#E**dn(1hYt z?uAKb=9cNIBbSp?w=)?e3TOZR2`P?(`vk5-ug77t(&PW1h@;mEfG1kr zEVD0b8j2;y?PMk3h&s;y>mA3o_5X;#Z>|2@j)~WX0b@0WKMURfH2s{NUEo!!A`=;w zf^HLIc4!in&u>Y6z~tn#bni(f;})#gqS&%pkOc!CI(Tq`PM)0P)p3;$?jL8f8eNd{ zltEkYQbmr3bez!&u{)vsVU%|fsKQ%=YV-Rw-LRh$w z!w<)TG%(yxi}TB32@DS>6$O}ewaVD%Ro>^ME7&bcvAZxkJ0~kX+L|32yh*qiU2dJ4 ztc-vMxbli;(T^VarYHh16s6b|QfX70X7%jnWsPI+xbvNpfAS}Pvge8OA7kgyQw88; z2h%j0TD7K9W`qHev}t z+T{yn_QBU^fmhDuz69>u1X~PCtTdMB@DPxyY@xBApDVMnbF}EPkr&X9 zAGudz9Y~?#c=5ujj3vH@rP)?jxb zMyDq?SP8Hd&>vUF7XXg}$LN~s=}%GBTq1kr(8ptZD%2?BO!|20V>>`qy#5x`UC;%*vooVBWJ%F+fv z2k9|P+(j0~TrMZAxu9TRK4aJd>1XE~0GV_q!wMj(V6mtwY^UCoMSu=MeY~318Z8lU ze7%2SL<(#`L=p+J0t@-c!`A^ak~(tm5|>z~p}_&_XBPvjx7k(#M9YgA7Qi^gS%{0} z8f8jVQA)bI%;xlbTk!4TB~eTK3>?z^$D!JQ!F13JK`;XS7=XXOZ;Vc$*$4|T0+nS} z3P|xSFC*ob7K;Lw%hJ+1Z##UJ>tlBrQkj?*D=!DT3j@?JS1H4m#c(V{E3P$uObsgK zJnUvgSs`R4P>IgO-E{V*`LC_B_3|j4t=c>Nvt0@HZmb8)i~ssx|Eu|blj7*D0?@Q3 zl2?spMfm6uVA9*1d>1^r=Kmr1!0YeC{&W6e(}OwM9dj^ok>UbH*y+g`I(T4A6vO6d zNf8Y&^8mvj767sj9NW+=OQ5X?q#Y-Xj}6PdA=nEm>vUk>IQ#Wg`5tM=fuyPp0QMfH zah3gZY0I^-Aw34r`wynK!NOH2mf8QmjKXfGM9*2K#Px6oDl|Di)yCS}w?(t^|I+;j z3c#V#fsildy{Om*fJ?}T;JTl3&6PBo>|+H}rhKWyiX|gKQz#Q~8$_diR$gJtBI>-G zo7Cz+J(epA)M%{GKC~NWH=xpNN*Cknu6{m!tGmwiWq*f^z6>HK1vh(dM?nv$9%Kt0f}qPKWn`T!8K1zjz`(VgCWa zMyvhVUY~}oFjPSgwasNH7O?xmES@?u&q|>#ro03Ztw0qlgJ2-QW^)A>`2Ss+H%0eEe0QI3)s&^8rR+^LaUFGmvMpdoxe{p|l8i zkgo@si57)uDDrIno)ti~dcG$I^MAL+KNkWv+i}WtV{*2IAAd)W9@XqQ)4A=FNip;` z3jit59A?v~Nh>JLx+zYF=fb*i?#TY@l!lpxX|#RFz29}ys%n#}7>nG3#6-uW4_ zD1o{8C4t|LvEX^VuJ)=L5tm^}{APu#Z|}8T2Ov;mMDIN=y5hioI(}-B&ah>n^Lg9x z13@qHzXy{ED)DhDl^QFYK}j1fvM?e5SE<$Ly6av{XHL)1Xku8dHZA5qtC&`WoZf;Q zxO2|hld~=Sfc#qg|7};rI!9%#7{X$_z)A-J!ca)jtDzU5*X?81XH+QHK_F6P-+g*| zPS}%x85kZ0p-oHe%QV!wj&4TYDwP{eiUcFHlFqS})SyOwNRADKM;2(Sb2v8%6sO&8 z_atqT*xmEvK6mWhX0#;Tc2PRrEqm-XSouUy6upiCpz9yIi%n`YoA!rj2IATIm)nl+ z%|G}*nB{h!UZwtM&!iffY3KSo6#-eGAQJd18ehO7Ky2XT=`tNSFu}?pB=G>`{0oH; zuXG!15saNP8B}`9(f$kp$AkMO=maYPP;}c_1h5IgEcg1nG_h}#PM@A;Q+t(t?R^vq z2We$>mDYLXU0Kdih=p)46rlnl_|-Ze1c0O_)f*c`b`i0;iE7;1`pa(rwHXJotpLTK z90`S~5UJ22E1ko^2?6y8HUQZKb{_`&`>BvGvFno}Kc8Ej-IbZyMS(v9699yz6d1v( z0_Z5vpfp=1hx_{IjB{SWg7aP)9X`k|PHOXBS!dFb`ombe`kHHwQ+G4rV<$BY5f- zZ$9S>-q%(|@pveN9%li}nvTXVJYno=I$41nd*{U64*m<%8aZ>1$75qws2u>bgjm}{ zFu*p|&9=|3gh6?xEfIjBfrJ#az#KnyYD%i+Mn@Fs1?muBCDeF@#(AB+@AkWP)EjWw zv9S?ZJ%J~<{PKfx{-QkC4EK4RbokJO^c7fHU1oECSb$1E;w>#_=-}|p)W`ccIlmyy zOWeAP5|JoP%^tI?pblJuegCyhMPQSGY&Q_Ai1$UJX5Z9OzF< z*)R}&*Ia!Kt*orEYqKcX4zw^w@lao1OwPsW%26t{NY{>yQi7GsYP!l6OOUR+;^*l{ z4}EW^N3-g3xgL1QOMbpVI}7`T2u&|)Q#ul%?SF6G@1D*LF2x;p-0_$yfgS^av^=k5 z4fxbm5Z04Z0b6w6g~R~5v;Xh}R?RLZH9k!3XXi>9X?;lLaWj!T|yf^buTILZxD#)tQGx z;RL}T#7bs~1qI*zv?DBsNU})j*>$VyuR%6D&spui zEaBJBTK&7;V8K=(|G%)XBnU}Zak{O|kk(^mG>}XRk}{J{OVQI1yEBW6OOnz=AQ8F! zB;TLO$?sCYJwT;Ki}nu;&}wd4$Us7L^|q&ASpn<1?&w7S^+ITOGj=P0ThFIkFmk(d z?s|;QpyOj@4fNIm(5TE8(UANuz$oYj3mA*hypZE`hyU__^+sL5Gs$GkQUrDornTwc zT8coo=j|@%Pn)(|qWNZ95uhRnz5bBPKf|l{)Z~;1{lw@v#ba^GW-}}-aoUx#;kz+7 zoD@hdXu^};y5RcSe`-SktL|GJIZ*>>320i*(9Wq~yqsZ9GW>ee#=j2RV$t1BxM4*JOJa?mK7 z|4F_Fi|h^{SO|d8AUX>t@|3SsXdj@|UKdqMbt)ACn})rmqj7$=6~*VU#xBx{9d78> z75HMuZufUS!Q7gz-0AzS`^Ejg>#n;r+s(L?%Am(-K)uZWYa#_$Zzu}@le*H#Uq}$J zYXA_F4?KTB?jfoU_-VOpQmr$|HY2Gzd87PkN^5_ym6j3`=oE(Y&VIYZgGR{ zKHIG#+3C2ujZwFen5cOkrW`Y3HxE+(S(Xo?Q{RsR%j{Z_+eF zm#BA(_XVs!ECE#5WwUuH3%2wBo3Vw?^KMxXf0b@bCi^6SHqY+BI17{;d3x(O$R5D; zxcb@`(agyp4JQUjXV)rMMs=)H06reS!3y9E<#T!Ruum?{?mk$K*aw% zQ{A3xU{ZpTEwj4;#b>)%Ruqil(HO-d5n5(f1;s;=5U=V4Oo4;{9h1*e*&Ib8E=uLs z_?r<5fCxk@NqxgL`(A#Q0+45~TopwBPf?r9VCz%5sMWgLZ?+2JPQtYpWwF!wY>Q>s zl2x#UzccvQGmD_NF#v~Fx#KdMZu* zv8Pi!5TJ6kL}_*bbkj{>18}lsaC+*P-0x zCjdKsulKCq+Rq0i)u*QNlm+d0z;9Jl@--R_DT?w3hsoy$joKPpf{LHP)aukE{woZ$ z_lFDvvLN^=E3CCZAn-7?bCu@^=5Eu1-Td;M#%>hKPA2^Mf|chx?{mKIPzIWH|IHm^ zIC~sDRRHrd>AElAs$c>%%?3H30C*y>1+b^%G@H%86#@&=-^mkgVz-JQmCdRq7(T0P zR#K5_HI=Tm4n?_zFqzL65Y$}|4Kp;7GGB+=Bg{4sOu$)@4pdcuwjwxt9vQ6$4GyUQ z9tDQd`SX=fH$KKK+>oD-=RZKqlX@F zQUAoKFd8rA(p2CT*{k~{2xz!B$Y?gzK21}yFHn4_ZGcsxFaVD82mi>j?mITY_L6Pc zhN%O)Ln-rM{}8RNuCPlmVl@!4nvLS#vGPr&r&w`$sMKsp!w|!$QcJI~_2#1&KJS<4 ztKU%F;#9S!3F!64{{08Q0nlyX=yo!;aBYby>}o~tw(sqt`Fjz5bIbc~){MQ+y;vMt zCt?xSK_?~w16JT4{^1|)>Y9710FF(6&b;B;Ujn>Kih;1oH4Nmc_fF(uDS^+i3Ht{2 zJ?}6~qi-k57<)hf@F%l@Zw%6OptP1GADb=->jfbKm4+XD<4~anreEaj zW0A0wG`nDyTg^o5Zo!ImNP&0&9|n^S+Khuw@4)_Xp%9ll(Bo~N<#5plINxmPW@Uzzj@wVEST z;`0kTy^1D`szOL|-N9SvYv1~;AS*TDMl{QAkLS@B{mjpR=(4kne5*ih9Xko{ZqkTb z1#znq>Gpa1Hgq|sozjDy$L)5`Y6Biv_N~{mtbz6$^}W5lJP(!~;bf0azu(JcfpnB1Ad%XT!H-8Y}TmhP|#t(l0o(XtiLYQ=ygfOfic-D=}9{ZS_!ZbG1 zisx?FlIdGA2x`(WI6`6`FXxk?O_llNAAAZokJ1#GmtpzLWo6 zv&lre^FRO#e-JEK0)zbt3BKvNx`{BiA>^U3UtERJ(ILrTKq(-omuI2OvO-u-rKR~O zN`d?0G2zB@SOGiT1Ye#(1Id`cU+3l*X=ZkwSMr0Z2?weOx6D6fM_BVv6MpPAKxl0> zCBebV5C1eB`%#mkp+53T*=~_a^)mk|LO}BujWh))FRl!t_6XDgZ|`$~TFgUL_T5pj zi1OcnVD`;D8N}_`-{C%-jdaBR6iN_HP~ifB>(J*Ll!E{ZVplS{T|S8q*nn-s09fr( zspz4&@2Ntuj_eV;EVIdEKLUVTNn~~sn9k3(6Yg%??liVLUg!RIvP5=kvDmA-*6|+S zsiZKEZbA&ukerOR=?Pf>)@;K8pTF~+?=-N@c8Z|)7J#mm8yXwcCW}8zYg0mC7o`B~ z!FpwuFZH!9r~WS1h972={AP2Pil8Lqn^h|Ds+eE_j`NC*f+EwR0297D>)E;B<#}|+iTMfBffzNqGrtQ!`k`#3r*-=m0O+ed@FLeFJ@)eN32k-}M!LewJynZj$ zZK6@j$^ksQ($IvjKsqzQ4KN$zYDU<~c`==s{U+>M$;)t12j`+FdE@Km#t8n(TK+!6VoT3U(igB*VW2c?Ozlg4POF0qDoU zfQ#zCk>LTUxPv9Iw6sk7SqV5juC6|`jCNU~Apo0XGD)e891SIO8XBDtCF9kVr6EB{ zLz&dbxRxq8Nkup~{gim1dWIJfKXu7)h{ z4kD`o35Zp|^M{T?!@glDkGAdjT7zAyVvYi?_~wyheze$HRrU4)RZEt(qF6}g;H^2GK=3C$T zRtf&Gz#En|U|*B07I)os7v_ff2Y>JfXYKbASO9vZX~G0BBp6la70PQid(|53ticog zU-{)qr_=cwp2ScDeY?#V*opvVHSq2ba)(nf-3alAIHY6;6BL*R?t(iajJl0lO%wpy zYfpmRHWHGa1L2@c6kl>6D!h8r)AKaP!Z!haeJBWB+h#RY!|ig=*ywPZh%c@n!0^*0g3iBU7Y7Oe77r{6G&B+5(%Oc&B!Kx!?Ezd5 zshnFqA;mU6 zIxMZj(`*f7a(SAbn&nk6#uhVcIPBzMZ)usa|NprG8!Q7xa`n=fiK%^#o!=x zSp5m*m#E}6Y?olSioh;;R=kD4d_*FC3WR)=$)w5W?xU7N?F&@rxk8E#4-T;s@FNI7 zu9hE+ffD^MHM2b|=7{|8{h|->pLEw)*eZ_uokwZ2O%hjACk9D}DoS zhK7cW+itsU&w}4MY{7o_yWef79+|>7;jkX!-f~}A*uqMbpht}N+z-RE;;3_2h`h+%Y zd1;0wU19Q#4@%g~!2;t!8qI)~Es7F=&#%BoYL?;*k%0gMG2E3zJWgy_&}Ek&rV}Sl zi{;|;`K5Njq^A6-OS7se_pAt1gEd$IE_4$fNYMQJiUdWQqLOr0hCZ4;b((16AX_qh zw3?}thgjK?n;iZEomu=Bn6Rg>z4lskNZC3scN28m$)vxSpy1Y+!cJzt{crmmI)7^i z_FC4;U+1~ngh0OOO>ep=!QVQN{=4IjI}CKEvN~f6KAqn?tn+CBM*vsjlEeUXxj>?7 zqr_G~*>t(w8@)cxcEipX@Xftj*BpPsH~KZEvAfpk)mmNt%B%>&p_~W~ECP9U=m1P- zD*{z5sEUTdAwPwq0m^2>!kafgx6HnGTCo8S^i#Q77q;ALtwQ@I#w5<5+V*u9vTLrn zneMyyI62KI-Fq@cXEv^8b3aD4rjOigHdk6jYBbRe*`zYN3j)rbOl=4s7&%te$4l0eZlAR0sPY${G*Qd+XeP^GTH56(AkP%yY067 ze5?O%zc;qoX6t8$72Lx_tg)5Hm)>a3%*+@c``E{ND*X01di1CXOMu-96Gdk%4-U8m z9r1w{o_o&~0I#|=u_syUH|hoWcFoz<@2>UwIOiLz2oNZIEfj&~a31AVeD@gxRsi@z zKno2s!4T{fRx`t*4{KS9Kt;iAMF5~q7$&fPoLAW_EiJCmLk}OLVfN`!(_gRGBpsPU z5ffVn8d`vv3UX|2nV*k5yup5bU6^})-T*D+enPAHI7K{3F|(SqLBsn^`u6v}DANp9 zfKa5{rO>PhfjsgDWMoQ`81pNkz@>< zFVh?XE#6he0Hai?2)Yge+gWU6TITN7@?)}Cb#PY)2IGQ4TwGeA*|`Pb^+U#BeZ5X+ zre?@<Q(eo2u5a;(`(g!gga;8W<{Z_H6RFiO`Q{?ByvNI%UjEzkp#Cn;4q!N;!9 z)z?SqTi^dA?>8r4AM_VQ6j&hCZEgXg;lTkqb7oeQ02CRn-RJkv*!U1z0t-@&*lLYS z<)5k*AbSeag=7Zos~BLb2d%$qErS|nUE(Ys|A*V@H7|QJojEm4r79~QcOS(APoui| z2n7NwD_3206#{@RYggO(>K#4cb`{Wb(%EMDPCmVT(K}fT-4w=I-&?}pgaTk+yuz$) zD;V~RPYhEGfkq$-C9(LWV)p^j*bHx(&?=nrhv)_P^jA*<+5PpCSzMkR$E@rSIxEp~&wo-mq zGqt0;4HVjn02TqN4uRBD83Wrj=u`x19>K?g+1;0jOBdWl_KTO7*Cg0itpHfGPLazF zkYe$+0mBB(PA#)(9;K0iLlj~yZPc4osWw>XSvqv|5%93joL5;2>)e6%11%YP0cu{i z#1|Bc52()jML~c>B^#AM<6uzYTY@u3hH)|{GELItt))D)qK1CZnZeJ z6MhIjO#KS`_(fjrOSxRGw!FOD{OCtNdO=Y5OFf_vdaeK(je6as`OIcZ(rBj3V|?)w zpZ~+h-0azDSQ&$NS%E@eD&K$!tE)na9e<0|3aSplmmdxU&Z`Kp7NUv|2*GeD%t~NI z%7?MaB7HbDJx3!WgRCGF524fPa7C#Lk*gq zIngE|m18&^eC`ghGSKo&4NIwjc6?|+$UD#t7*TrZNbK>@=-9A8rBM?BrXvI`1-^U% z7QohONw_0@$t30Sg|o6AUXRXZzsW9;hxW5_T+YVyW-SaN1v~w>xy!TvZ3|Pdpe%pP%)q2=2UV!f#{Jd*?jp%b;V8vf%Q@e53U3Wd9=6$zu34lN>35HW^HY?~a zcgEw@ztihu^lJRh@BB_`Y;5ee{_-#X@*}LR-&U{JUR*2`cJ*6Z5g<+w%SQxWtTF~L z|C?6o(3&suqDdjr7_YkENL^l9lY$*Ui+z3{yA??xIX!&nr)Y6*k_P*(p=2<~52!&8 zFRat))hy`-_y&s9*RRtpv2Ru0su2E+ju#dNkD7-o$s^%|MzJs9>;z!TQ$bq{Xd zR`{=?c-kDBjTpNJ>2{0g+dSE`kJq`)PSE3aO+Iq@SoQgBi3Pua#f5$BdIvQ32|aqQ z08B#J>H1a@!6M}PqD;s=% z=&%H(1or_*K`4RgnOXj9m?DT5?7erPbi`^ZVEm@c3w{ zYQ}5Tme1pLY^@zvSmVtI{#J9|9$Q!Y^R3|Bgnw(6;H-Ui7V6mWU90%U$uB+&$Khn9 zPz?kE%{RaK%}sWxTKwMN#pVgA5PGfvoDNU4Rc*R!jk+1@kNwM6?|*lr*T=Zf@y>U? zQ|s^V*Ld}I777Kl6^io1O7bgEKh9fky%lEMTi*KCw~lHK{ZICqF~A?H@gQX9rVj1E zvf|et8S0nfpXuotY0ilTBUfC0m`)nm82*>M$}V48EqYgQKnM0#Ann`9(H{afe=j>+{xML)q|HE8Sa)bvdA6J zLHBL9N)v4=jc!?kZrgVYd$g4Y(rBi7kP_g-tECKF{2kDCU}z1n0uYc7qW(Ug58GAp z`F!>5Z-09;5{Wc<-Whk_eK$Yv`6q-z=zSKzbdAfxhCO{d|$%P7Xb$z?Yvl`oM;;hJ&MWK5!KP zU4{~XHIwK|N)N!f*#+rK08o*%J#QcB+|jO`u)#!@?U7DzZRLLF6OxNA3VQbOOmAdmgqD`T<-G$B~hn*Baw`1A(ftDrwC4SAZkZ0iY zTg6?_@>onf{GI&qd!Kb&qynp`kKye~)oQf_Jir^?@P-DvoW^H9^BHq?cJ^^q1ig0w zOnsoys5;{D&^HY&|G1j}EXcas?RGr+=%XHf2!4JTVSa^ujt7PZ4eMlsA0!n7vu>u$&y;-CAjSZ?cH0cAFD=(5GxJs$aDarSvt+v~Pxo2AC2@YZ6aXQg7 zHAH1Lb!YY;087 z!suXRv(Ic*1hRoG_7YO<5dO2{aO)d0G!)HJ!&JB>zuQ4BJ>b#|IawR7YVWmE;J2>m zo!jXhpKYbz>U0P6j(-!K?ILvU%T_js>LO^IY>$m@+((C>2W_;{pA9Ju~b?^i7;sNkqgl|5C-)H%5FwL_3u=4B zqf4$94f zd%l#V#Y~>9X(v^i8Om2?>F{BlzVqNC(l``~1yOdapa?di^3b8H6%~D$2HC|}URl)W(rP0d`_lKYP#t*+XcT` zTgXkaD+HDKe{P1ZQZ2Fq%Si8t2D<)NuWw~qC4-@6&S z;$w0+S@`{YgF`Iv5eUC!reRet^MlFpjnA@WP+VPI#cJRD;0Hgrqcnf^v!B)H=H_y& z;cvVB_S@eDMZkjeqTL1xJ5z@s2kB2Hgm2L0*epN3{`%+AgWoOj>OVn2he@Y0IX3x~ zyO6IekSAE7y0IocIPW^T%IyFG60+3Ja@g%ctlMZR zo`G%wK#WQSBqkeFsn@9m5>z&f(0nvk^^T=BO3CCvaNXLpGtjp+xVLreWZrLu0&m@? zE%*rXVZ{fzA}UzZ{P_kycPtdu@$vE2YhU}?bN2uG*T3FY7{)#K+|xRK{CJ&Rv?^i% zhT^CP{V^6In1F~GcmTsiZ2&9U)SY+USw~HO*PC^TM^6=iOZQK-nw5UdRsK%B;a}?I zzIPgb_Gf?Q;D_Ym8yv7!duZA)zq+BZ`F);Wp~-W6!%M8Kfyp-B_rCXSd(&AfJ5W6} zFficc2kK>I0@C{cD;a3=yWaAaw;a_RIuyb6dr<_S%o2EUt{@qMSTrQ7XFeBXpFB>( z(IhoWHCo9QNH@Jysij#^R_V&CgY=yTz9Xb2m{UOi0sd>#fuXJ*C7^hZ41Xil`UiHCRosWBR-{a+K#iD>ysWr9IPZGgUn}SF>}=nm8zx{Y;m6ih zzw>unvjW{*1KG~<@oO;8`8CD=UT3A3+t}EEx!**+{cfJ|t+(DP%HU^z_GjzQd*1W% z{Co^nxagK;yPk*>;581Ya08?ce7&p$YLAB!=&1r|HjQgcqZM?y&98s$yMMmBg!%=J z>#x6Fd%+7{peGUuceB|H@QsdICRW6X$^x7L4W8x)nPp$Cl1``V?|ILAw)MGw@ArPs z!RE0O%7hh#kA*(SlNga*%z8w5-L~dt-wo#BZ?PgcWYri<>^4wXv3Uv$1&X9YQngpe zuhCfY1r+ysX(P44)`E(pSDWh;O6Zg={Dh2_MPG(ay%z63kbg-1fd~|)xw2L|neCUhs-T>a0T(|{YZrCcjjik@mSDIlm2D;Kj62o{PO&Y`iANb{Vk@qBtrl|WAw01Meu98Oop=XXEQ%l&o^ z7JBWr+iug@eD|<$hWMCK7ElO3d@iio5X=<6&s3|`JPUuhR4O$O;tlf0e zO?obulOPU1hyedy(mB>^$Z{W)-K*jOcEAwsgvpw_!kYU^o4%a)v#X2&W}&SJ>h&g# z_WLFG@8iS#B%S3|-o*;FKusf02M@XEyWe|MNHcBb9}M{Er~8nOBjsB=eFAQp+z^5QZD`~jMn7#A{;mDP0` z8yjK^#De6TcE<$U|0h~T-9#!)+aYwJzziy^6^p5{T5F%&T`(b0(-SCU@B#gZx(o7l zD}J}zOC8(kT|S2bMU)lZKpGmg`M{;5-}uHiRzLKi4?Sivfu1UWTCMR^hto6Zae3!@xnB%6 zskC4ErC)NeDe5_W`gG7*?M3h{hF}O~fp2OinM@X@r>85gc*QH4Y$=>G1HbZ>ujnUF zo`lQb$z(Dx=^^L=eh6Wt2jQcUnk;q%82(@pE(9M76GpeTivvf%n)^z8$BN(xzuvKz zjDZ}a;h;!hoF>9i%H~Rxtr+CuM^kL(X>iO*Cnvwkt8Xc7>OWbJ17aHBGHK$^#Xpsi|iKSIK5E z+j*O|zV38$w*q@?CD0l9$Eu9yiY(A-AP`7pv)M8~%S%$XV$poHKJ}?jRi~z=HZ)aF zj;0<-zTN>WG;9U9_U+rZe$PGkRM?exOtJ$#QvlDs;nzbO8^vLt&-{klXY{Q8|D`W| zsdnRyH#&pCpl5b=HpDjxf)}#}+$ORSw;1XTMWZ3n9Z6kkC0Nnb!z7;4I#NA@9;nUb`m&mUFQ zepcrm51_z9!@SZjic6qLdo<;0pj;Hn0}V_1`{NQTs8##L3RqoPmp+J2O;Mv89qB)$ zK%tbjU!cJjRhp@pnVU1unF1(Ri`M`J$*auwzVh`CT$J|u+~+>0^9t@@)7{nI-|t`( z-J8$nLo9${E0Wq^&AAT$iZyqMKSvs`!8h%!+9oP10(3UMj}^hYbcgf9 zJ3)*6z6eD^SI|UsfCZ;YsY-(!EQIC821Wae^w0nPEsDjXLh)^M8WmRSZv+F;d<7}D zcr3kaxJ{LC>0DskQ{oBR!6G{N}1)vTyciZY~ucK!QfCc3#9=Crj5DcH#%kSRvp7-c{ zf!g}|y3VV-&=&pR2S3nRP~C{U^XE>7!(oFmAfOEv_7Z}62M-=>eEG{?Zn45>-<)6g zgtg2=Z%;S3g(}Aq$w{vGxZa5N4nVJRb)peu0%mrB zf0p2VKug146BhxR+sYSr^GU^$U`6m;e*I)e#^6Y&B7omM)OQ{AN3WnhUw~FKC0-dd z3DjxsG(B?a^HM{f%jT&SGGtY^Gx4hCUz3y`>g_AMx?|T4(@9v9H_t{Xf${MX@!^s7 zi}6aXOm$VT1mQ#dLOPwJYPBwH%`iaO4U2&9B~4Gy3S=1_gHbGW>eLyw8dikmS5+UH z?et$a`0tjnP_339(e*|tTgvs-n-NhsE*<9{_gAZ{p^p1#-`lOLez(u;(HSogKOfJR z@7F4VaeU7*JclZ*09t?aM}PFVq~AXBk&l?4|NQ5x4?g%{DijKNkg?*Aqt+kz{Cx;u z!>#4-8VFt^rN{%<(|W?S2iG9 zMB)Mg@s|*t<%iW`6AifP8VhEV6+-Lgn{RHt@P#itYe~KR_S+rU2mjW?${~p0AmRjY z7c5YQ$IkQed(2P>dzL3bfwx7lu*AoyBW=US0i`l#b<7fciP~CjhnV}+JxI0ny==#d zU_ZaUpA|t7ihxg|5Bd9jGr>q4zR$VdPc24YZxmCETCMxfQz z4PtAFw;O2331Cg2Z(o!JpP!SwN09OG;r(>-2UdID7WOdweBcYV-mC2*)LR2k?d@0*gjkbL@b&!G$nfynYsC?7qa33_ zf1L8AIE~7A87O`}V16x>yp(7=SMz8jUI|Kr^Ib5Cuc%d4S&*3I#zkV&=eI z0Kq7%is7L_u|P7Z6rE?_o=m;+Rj+#4gZD3NgJqvBKMV4t{KZ^VoC$q|ba2NBbRI2vA_r324Mb2^CZMU`F_O`cyLjXdaMTIJ+ zqGe&i5-_cxY?GgT3rxNicAzJtCkmiZH?MZNym^+NAMR%R<>h4)ehshYMl2RX$z+o) zGO(ALfTr@l!Chwl_HY08IS&h6Pghn}kgxZ!;QM*IFz+jFWd$&+VLHK;fCT|y2MRb~ zN@e)92|y5ER$~7bL#kPtMG5#ru|#? zXcjZizgfZ9uCC=?LPz{<*+SOJ>V^G_(u_!U+FNK4U_1lEFJV-P0* zLeS%s-ip8spb;o`kL_{H#l>Y&Ac=UNG$c_3XWP!vIlkAA@LUN7g056%HBE(Tg}fdY zTQ*1s2Ke`bkw)EcyFCsd^0pTKbOZZf2r&mKKR?CyX%%h80p{V?Dl4wmPQb6nbMPE& z-FoY-mFus+zQ&7>#`9X^IjZqBXqINfdy}nT1CVu4e)sCwJy8HIhkvNqEYGzJ=OerQ z4PUguzP|bCPk&k_;h+BLpYHf@{`imo7>uTN04HxOl+jhDRSC9Ruox=D`p@sEF8zw^#J0m}^X_Xz9_;uTo|QgMRq+U0aJN4tIA zZOAsOie|CUg`czQ>D=W32v2I)MWFy*=SLJGAT6z zD{C7R1;M8+E81p`9)A=2#_8dQe_~kyL8VBnIGIZQ#n??)5z-LE1`Knvmmu1xK>-vB zW%(`61D%IzwT6^4heJ^||I;1BqFu*a|G>ac`1M)QxNmiKvRElsD!wKk%c&dWL?@xD z7A=>W0agGFI)5NgAh=dOA4(p6KFs|LEBguyRP(KGed`la@H@vn_uOLwM*LVGwG1izp4QYiA9(+sihsK0=(i3uK4gJ+uC1-1paN;TJ_xCW@%LM)yN2cKAxN0E0zUBb z%ZMNFUyJu6T9XwGV7{0f~zU;*^ph~&n&17l^0(#7u@WrXv zKo3H6`l*;r-x+Ofab8yXt~>7#1qdfr>pBY{>H?fD7Zt6(hXH;Vf#=D-xZ2p%RkWX! zzYpIZO+3@7tgP~AS7ulCL7zyOd3Ez`6P;4SI_&@csY1T+?LI+X=6Ffbr)!0E{; zaZ`*P@DIHG?5ke+D%AWx+v{_cNJ|xSm7H%V91t7>q3wDj8Y>p&Bhk3KdpV)nk6pA= z$Fl}>mtU6=J!dzr^ys6HHa_;Tk3FHx{U_qMXa(@n=f5LZu9S}(&DwG=PN;Ky@{^y` zPM<#QVc!kr{h$Syzt6S|_Qd&%zxWG{C%toS zZqDcNc#sa1)C>Q`piC^m?~FWS?1Vtu4z1St-8rvI3#BW{6|;ZHH_WS^mr|t$Rht#6 zX|tI~bmJeES5|Lk=kLhY)Zumq1wt^L$qF18G67bfNHi?*0cU8kH0Xj21b3W`7+_4jV z$t2t$)9rTDogT`SD!F8(q1u-VT)7bpRLV`e=%CvzFl_j)?dS7(ui^Q#8(Dp<(|S+l zanTCEA9Po;h4h2>J^10CGXH$y6Q9r*78bm`>Lgkqt|uBoEx)Ncn}BCMWtn>^lxgxd zRo47awYaPtRX@&HhKPdFq=Ue#=|l($E~;>C3l6zgSHnX=5WL zKpdF!__Og%3W3*C5aQv|jeImvuGwGMS9Vrl6ArBFwHpKTqr- zxDosnvIK(jH#e89ZjjT?v730n*3Zs*U$3`Z#awI5=k9ZaJQ1qY*^IB2cvdeKM@RJ^ zumH-ve8)T9;bJ8)VbPc0!Aihyo@aT*z&7=IgOxy96&&UA)W<8nMDDFK5jTL%d(`@~ z^(Ga5tyV))iz2=J28yEyZb2{}J9G;?q}YxT1cZ{ozL7CNya8rEDhMTWv3)JX|KHw~ zz{XXl_y4=!-1dx}7{_rA0t6%oZI>3>&_c9yTP~sPB2-|tSpn%LickPikvIprL_kQa z!X>h5q3Vj&f6@UeD8>oWJW&2N zLi$#^@hIppf?)^4%3E)}g-XC0TJ@*X=clt$8z#@SPW;(?Q;xOft~3l`YQ1_1lZ7zr zr011hUivu@2vUpSd&`2p2Of3Dia!!46oO`>0aDCb^4;OT zgDe#Lh(%+pL+D~zQgVzF7lcwluK?;VTJ7=q9s&^*21TQK@I4+M>5ZBKWE2n!005vx zIhQN2A&daS$gSI^CKUi|+O$atqWVqrkizVT@~c5U7!N`_y>CUpXUdc* z#=?aQM||EkZ{94lwY4b(7T71!dx#&Dqx%;`x;pY#cy>6Nh^Lt22rO45-{0#nXH1hm zQ8oFDZWIB*J@j&T^{SOuk#cMhMd^nK;K2;9L@?(Nii{H8eA3{4JOYNvR2}QdWLP{A z=Oe{g*#huO-GwOrL0v#7)I`c!DlG;GVC?*qDfO(Y>;HHxAR37ikPHM}e#4(S-Mi0D z|7D^^?_zRpplBKKsH*YmLs?K*)(~n71uGPdYX}4)x{uOe-2XnuanL(o_4CI;CJg}4 zLyoE^ME0@j&tRphC@3oeK3Mq?WIT$Mzo)0CSP6N;b=O_TcI?>UgQuO9%6-Ac5()YV zP%D7*M>9s5b+(c;-l(N7W7PJX?4Kd~F;SDlobNAZ^)W5p_2u-LwP&55xNiN11@!XU zU;gsnfBw~xBO7T2y%D9tl?V!ovbj9B2#_VHtxfV4V818B=k`USVP1AzZU+YU0E&xX z<^w#!VcZJnTq!LG3k2PRpcn@L^qztI^E5dciA2B>b>+}sDvE5Xve%z4_Qq?&F`lsy zMU4)lCZ5mrBSni+SeX0A$&$+)Ja`c0-&J#eoMch}04cMCExba zfPyrnQD{&CS7b!fdpPN6&s~}uDAcDyD(zfnS<7HKGwsg0Li#uo)e4pF=l=VDd=0() zdd=#UTgc^JL3(>-rTqO42ZGXwvw~riMsyPhBvVQ5gO>|~Fil92MBYe*ngOs7d%XAm zYg#b?#G(KBBfF%bk#`!h!Lev(l=SrJ&7ZT=03aMy@~S5G5dciL+{RM20-OeZBGTX2 zf$QH&$J9>WhX{XF`Nvri1sIBr^uS7h)=NXS zK}+FW0HOP2ZkFrF;h5IItN!|mZA^-^ryFO~jcR)G+I1V?+Pp|0r-+i+B8g%hMvzw` zT=BcRxuTnoUP!KXSQzL zDt!F$$9!ITGMQA!mqnE!CcK~y8^?gYe-s}nfwh3ZVK{hIgIaa0P-RdUF|Ls5$=CMv z7Mj9JN~qN@;iIu~R;%4OOWPZd>tmu%BapL;#bV2W0|)NfxpU{=gL119i+~61JfGL_ zx3`}le?H5j|8=QUsXl12_$EF`nG^>9`hW}j6V2f1JX z@ci@7Yh7Jkb)?|UVAr7sfj5;S;79K}=rxU8Zz7S%FIu!{!Xv($H*YRKzk{GaTk(Y# zUJ&T`KnpH3H8qLZY*q$o13l2PX_{J@EtrlOzyJV?1+ARr8Ut7ga&M+M&9T*Jh|GVJ z%h6P}~x`UjN;3LzK^hAqoehy8qR01AUZHx8Cx z(3zJCeM-Cpj_Y!F;w*A>^_nN=3&CtXw6}Vga#~{lH6u~AP1l8tY2_PqInG4EDYZI# zq3PLdw?5iyQI)gH1p$C3pL|jylRFjo{P6vuL|)LugJ}OTMEmpkeBpd3|46cQ>C&>L zP!?7HZ2iTSEt}ih+txdd^QY&sU!FQ7ivVtRc z3K1p^)y5O0;}c8GM!A8r#x4g`RYQyex%c*^{VISb%nrJTbUj`ulqa_! zq$zx!K)z7VLJ^Js9fk$cfM%YN$Yk?p zmn{`ywbDG_krIOJv7&pD`AYwXlA^wk0g+@ea8@KqlA!QdTD71h8Eyo+VNk&cUPD+0 zD2gh@+<2cp#{|R}%KZ!@f&_s8N{ej*s4E3gXc3sWjI$P3lrf-xq$NMoH^6dvgZ1`h zSvVSF{Afld0BHT$&lZE9@sD)>2g2bn2DZonDeIJgxk(H~loO)h7EH$sD^ij9vV%5r z!Lhw*e{=m$<=^dj^;`d3Oh%b-09d$ip>*}tSF7YJ*94J%m~0Cfy zh*r{X&8lCi%)WfeloK7@mx+SH952rtzo%P}%y)jX{oi_ivz@VR+qPNz_wPp^zDRD5 zh&Tdj5CVnflVuq%5c|VnAPB zVa5P^G98CmWcm-}44w)c!ID4?$3a@{)1952MN)nj=ZW*9^MvxJf^3STs8So*IsL9{ zhB2YYfw`N0yh8vi85%c{AG4r1RD8x zYI@(RX_`rvgFySy$`g!elLK-TKJbKh3@+tiSso|FwlrzumZTBNU$&NI7JhCM+bBK=W2*!~s}|$Q14o+FvoA zI*-w3Uw!qJM^+VUZ*P|rMNtuSq!kq_t3cOV20&i;wjw81JFop)6Pw%mYuStliDaQeN`%uaRq>T@4Z*N=9+7yW5k)^TPC<3o9VlL%yWxOi-`MWS=focfuMvG70gCpAcoRI zDPjRJ38>Y;bOUnBUJRt??6(o3gjMR;W+?Mnb97^d#hwHN2inIjSSVww^M2#}qY z2cfW15fclY;z`8KWpHd7^mNq($}4ile014&|4#wz0i0Q2U}6Ysq9 zP7%X63Wb7>syVD+B!yTkX7u;>o3vs%ci(;YMQiGxNt!MVhjV@QrJietd~yafJ-X}1 z|McgbH~wHl7;^|ox$$664Wi+Q{KL$Ji-fUN7)zEX#kNiSqU>^GSSFUV9cV-Lu=gTM#~v!cYUcx7VrU+Hyo*wF6c^X+O>aDFMiQBzSMJ7 z86yAy`RS%&$cIa&zKh8vbLY-=Z@&3vZ^MQS<8_SRN?EpSnUFc|NP2&isamFcYGddS zDgX4K$R~@q2>g4DGA9?QxOMAR_rniAydW#wt+(D<28B~nZEM%A&FQ+1`V4W^s?}&X zTGZ0A;^zbe&y_L;!yYcEiasy@K$Zp1Sg=xN!VW0gkI{bHXU?3NFH^RgX1<3$a-7#D zcouU#hY6y_d{1aF^7e$1wR~4)OaSoetFL03k9*TiH+j2u?egD!_uZl@Z43Xc$Mhq!FOPl+#m7buK34r)Q&W?h`$pgIu$Ey~=1V|MCsxm3% z +#include +#include +#include "resource.h" + +static const char *INI_RELATIVE = "\\HolosHanafuda_Data\\Plugins\\x86_64\\directip.ini"; +static const char *TENOKE_RELATIVE = "\\HolosHanafuda_Data\\Plugins\\x86_64\\tenoke.ini"; +static const char *GAME_EXE = "\\HolosHanafuda.exe"; +static const char *SECTION = "Network"; + +static const char *KEYS[] = { + "Role", "IP", "Port", "MaxMembers", "Platform", + "WinRate", "IsCrossPlatform", "AppVersion", "OnlineRule" +}; +static const char *DEFAULTS[] = { + "Client", "127.0.0.1", "7777", "4", "Steam", + "10", "true", "1.2.0", "Koikoi" +}; +static const char *COMMENTS[] = { + "Client or Host", "Target IP address", "UDP port", + "Maximum lobby members", "Lobby platform identifier", + "Win rate (for matchmaking)", "Cross-platform flag (true/false)", + "App version (for matchmaking)", "Online rule (for matchmaking)" +}; + +static char g_gameDir[MAX_PATH]; + +static void GetIniPath(char *buf, size_t size) { + _snprintf(buf, size, "%s%s", g_gameDir, INI_RELATIVE); +} +static void GetTenokePath(char *buf, size_t size) { + _snprintf(buf, size, "%s%s", g_gameDir, TENOKE_RELATIVE); +} +static void GetExePath(char *buf, size_t size) { + _snprintf(buf, size, "%s%s", g_gameDir, GAME_EXE); +} + +static char *ReadFileContent(const char *path, DWORD *outSize) { + *outSize = 0; + HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) return NULL; + DWORD size = GetFileSize(hFile, NULL); + if (size == 0 || size > 65536) { CloseHandle(hFile); return NULL; } + char *content = (char *)malloc(size + 2); + DWORD read; + if (!ReadFile(hFile, content, size, &read, NULL) || read != size) { + free(content); CloseHandle(hFile); return NULL; + } + content[size] = '\0'; + content[size + 1] = '\0'; + CloseHandle(hFile); + *outSize = size; + return content; +} + +static int WriteFileContent(const char *path, const char *data, DWORD len) { + HANDLE hFile = CreateFileA(path, GENERIC_WRITE, FILE_SHARE_READ, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) return 0; + DWORD written; + int ok = WriteFile(hFile, data, len, &written, NULL) && written == len; + CloseHandle(hFile); + return ok; +} + +static const char *ReadTenokeUser(const char *path) { + static char value[128]; + value[0] = '\0'; + + DWORD size; + char *content = ReadFileContent(path, &size); + if (!content) return value; + + // Check for UTF-16LE BOM + char *p = content; + if (size >= 2 && (BYTE)p[0] == 0xFF && (BYTE)p[1] == 0xFE) { + // Convert UTF-16LE to ASCII: skip BOM, take low bytes + char *ascii = (char *)malloc(size / 2 + 1); + int j = 0; + for (DWORD i = 2; i + 1 < size; i += 2) { + if (p[i] == '\r') continue; + ascii[j++] = p[i]; + } + ascii[j] = '\0'; + free(content); + content = ascii; + size = j; + } + + // Find "user =" and extract quoted value + char *userPos = strstr(content, "user"); + while (userPos) { + char *after = userPos + 4; + while (*after == ' ' || *after == '\t') after++; + if (*after == '=') { + after++; + while (*after == ' ' || *after == '\t') after++; + if (*after == '"') { + after++; + int i = 0; + while (*after && *after != '"' && i < (int)sizeof(value) - 1) + value[i++] = *after++; + value[i] = '\0'; + break; + } + } + userPos = strstr(after, "user"); + } + + free(content); + return value; +} + +static void WriteTenokeUser(const char *path, const char *newUser) { + DWORD size; + char *content = ReadFileContent(path, &size); + if (!content) return; + + int isUtf16 = (size >= 2 && (BYTE)content[0] == 0xFF && (BYTE)content[1] == 0xFE); + char *work = content; + DWORD workSize = size; + + if (isUtf16) { + char *ascii = (char *)malloc(size / 2 + 1); + int j = 0; + for (DWORD i = 2; i + 1 < size; i += 2) + ascii[j++] = content[i]; + ascii[j] = '\0'; + work = ascii; + workSize = j; + } + + char *valueStart = NULL; + char *valueEnd = NULL; + char *userPos = strstr(work, "user"); + + while (userPos) { + char *after = userPos + 4; + while (*after == ' ' || *after == '\t') after++; + if (*after == '=') { + after++; + while (*after == ' ' || *after == '\t') after++; + if (*after == '"') { + valueStart = after + 1; + valueEnd = valueStart; + while (*valueEnd && *valueEnd != '"') valueEnd++; + break; + } + } + userPos = strstr(after, "user"); + } + + char asciiBuf[32768]; + int pos = 0; + + if (valueStart) { + int beforeQuote = (int)(valueStart - work); + memcpy(asciiBuf, work, beforeQuote); + pos = beforeQuote; + int newLen = (int)strlen(newUser); + memcpy(asciiBuf + pos, newUser, newLen); + pos += newLen; + int afterQuote = (int)(work + workSize - valueEnd); + memcpy(asciiBuf + pos, valueEnd, afterQuote); + pos += afterQuote; + } else { + pos = _snprintf(asciiBuf, sizeof(asciiBuf), + "%s\r\nuser = \"%s\"\r\n", work, newUser); + } + + if (isUtf16) { + char utf16Buf[65536]; + int upos = 0; + utf16Buf[upos++] = (char)0xFF; + utf16Buf[upos++] = (char)0xFE; + for (int i = 0; i < pos; i++) { + utf16Buf[upos++] = asciiBuf[i]; + utf16Buf[upos++] = '\0'; + } + WriteFileContent(path, utf16Buf, upos); + free(work); + } else { + WriteFileContent(path, asciiBuf, pos); + } + + free(content); +} + +static void LoadConfig(HWND dlg) { + char ini[MAX_PATH]; + GetIniPath(ini, sizeof(ini)); + char buf[256]; + + GetPrivateProfileStringA(SECTION, KEYS[0], DEFAULTS[0], buf, sizeof(buf), ini); + if (SendDlgItemMessageA(dlg, IDC_ROLE, CB_SELECTSTRING, -1, (LPARAM)buf) == CB_ERR) + SendDlgItemMessageA(dlg, IDC_ROLE, CB_SETCURSEL, 0, 0); + + GetPrivateProfileStringA(SECTION, KEYS[1], DEFAULTS[1], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_IP, buf); + + GetPrivateProfileStringA(SECTION, KEYS[2], DEFAULTS[2], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_PORT, buf); + + GetPrivateProfileStringA(SECTION, KEYS[3], DEFAULTS[3], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_MAX_MEMBERS, buf); + + GetPrivateProfileStringA(SECTION, KEYS[4], DEFAULTS[4], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_PLATFORM, buf); + + GetPrivateProfileStringA(SECTION, KEYS[5], DEFAULTS[5], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_WIN_RATE, buf); + + GetPrivateProfileStringA(SECTION, KEYS[6], DEFAULTS[6], buf, sizeof(buf), ini); + if (SendDlgItemMessageA(dlg, IDC_CROSS_PLATFORM, CB_SELECTSTRING, -1, (LPARAM)buf) == CB_ERR) + SendDlgItemMessageA(dlg, IDC_CROSS_PLATFORM, CB_SETCURSEL, 0, 0); + + GetPrivateProfileStringA(SECTION, KEYS[7], DEFAULTS[7], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_APP_VERSION, buf); + + GetPrivateProfileStringA(SECTION, KEYS[8], DEFAULTS[8], buf, sizeof(buf), ini); + SetDlgItemTextA(dlg, IDC_ONLINE_RULE, buf); + + char tenoke[MAX_PATH]; + GetTenokePath(tenoke, sizeof(tenoke)); + if (GetFileAttributesA(tenoke) != INVALID_FILE_ATTRIBUTES) { + ShowWindow(GetDlgItem(dlg, IDC_TENOKE_USER), SW_SHOW); + ShowWindow(GetDlgItem(dlg, IDC_TENOKE_LABEL), SW_SHOW); + const char *user = ReadTenokeUser(tenoke); + SetDlgItemTextA(dlg, IDC_TENOKE_USER, user); + } else { + ShowWindow(GetDlgItem(dlg, IDC_TENOKE_USER), SW_HIDE); + ShowWindow(GetDlgItem(dlg, IDC_TENOKE_LABEL), SW_HIDE); + } +} + +static void EnsurePathExists(const char *path) { + char dir[MAX_PATH]; + strncpy(dir, path, MAX_PATH); + for (char *p = dir; *p; p++) { + if (*p == '\\' || *p == '/') { + char sep = *p; + *p = '\0'; + CreateDirectoryA(dir, NULL); + *p = sep; + } + } +} + +static void SaveConfig(HWND dlg) { + char ini[MAX_PATH]; + GetIniPath(ini, sizeof(ini)); + char buf[256]; + + EnsurePathExists(ini); + + for (int i = 0; i < 9; i++) { + GetDlgItemTextA(dlg, IDC_ROLE + i, buf, sizeof(buf)); + if (buf[0]) + WritePrivateProfileStringA(SECTION, KEYS[i], buf, ini); + } + + char tenoke[MAX_PATH]; + GetTenokePath(tenoke, sizeof(tenoke)); + HWND hTenoke = GetDlgItem(dlg, IDC_TENOKE_USER); + if (hTenoke && IsWindowVisible(hTenoke)) { + GetDlgItemTextA(dlg, IDC_TENOKE_USER, buf, sizeof(buf)); + if (buf[0]) + WriteTenokeUser(tenoke, buf); + } + + MessageBoxA(dlg, "Configuration saved.", "EOSHoloLauncher", + MB_OK | MB_ICONINFORMATION); +} + +static void ResetConfig(HWND dlg) { + char ini[MAX_PATH]; + GetIniPath(ini, sizeof(ini)); + + EnsurePathExists(ini); + + for (int i = 0; i < 9; i++) + WritePrivateProfileStringA(SECTION, KEYS[i], NULL, ini); + + HANDLE hFile = CreateFileA(ini, GENERIC_WRITE, FILE_SHARE_READ, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { + DWORD read; + char old[4096] = {0}; + DWORD oldLen = GetFileSize(hFile, NULL); + if (oldLen > 0 && oldLen < sizeof(old) - 1) + ReadFile(hFile, old, oldLen, &read, NULL); + + char tmp[8192]; + int pos = _snprintf(tmp, sizeof(tmp), + "; To override default values, uncomment and edit the lines below:\n" + "\n" + "[Network]\n"); + + for (int i = 0; i < 9; i++) + pos += _snprintf(tmp + pos, sizeof(tmp) - pos, + "; %s=%s ; %s\n", KEYS[i], DEFAULTS[i], COMMENTS[i]); + + pos += _snprintf(tmp + pos, sizeof(tmp) - pos, "\n"); + + char *line = old; + bool inNetwork = false; + while (line && *line && (size_t)(line - old) < oldLen) { + char *nl = strchr(line, '\n'); + size_t len = nl ? (size_t)(nl - line) : strlen(line); + char saved = line[len]; + line[len] = '\0'; + + char *trim = line; + while (*trim == ' ' || *trim == '\t' || *trim == '\r') trim++; + if (trim[0] == '[') + inNetwork = (_stricmp(trim, "[Network]") == 0); + + if (!inNetwork) { + memcpy(tmp + pos, line, len); + pos += (int)len; + tmp[pos++] = '\r'; + tmp[pos++] = '\n'; + } + + if (nl) { + line[len] = saved; + line = nl + 1; + } else { + break; + } + } + + SetFilePointer(hFile, 0, NULL, FILE_BEGIN); + SetEndOfFile(hFile); + DWORD written; + WriteFile(hFile, tmp, pos, &written, NULL); + CloseHandle(hFile); + } + + LoadConfig(dlg); + MessageBoxA(dlg, "Settings reset to defaults.\nExample lines kept for reference.", + "EOSHoloLauncher", MB_OK | MB_ICONINFORMATION); +} + +static INT_PTR CALLBACK AboutDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { + if (msg == WM_INITDIALOG) { + HICON hIcon = (HICON)LoadImageA(GetModuleHandleA(NULL), + MAKEINTRESOURCEA(IDI_MAIN), IMAGE_ICON, 64, 64, LR_DEFAULTCOLOR); + if (hIcon) { + SendDlgItemMessageA(dlg, IDC_ABOUT_ICON, STM_SETICON, (WPARAM)hIcon, 0); + SetPropA(dlg, "ABOUT_ICON", hIcon); + } + return TRUE; + } + if (msg == WM_CTLCOLORSTATIC) { + HWND hCtrl = (HWND)lParam; + if (hCtrl == GetDlgItem(dlg, IDC_ABOUT_LINK)) { + HDC dc = (HDC)wParam; + SetTextColor(dc, RGB(0, 102, 204)); + SetBkMode(dc, TRANSPARENT); + return (INT_PTR)GetStockObject(HOLLOW_BRUSH); + } + return FALSE; + } + if (msg == WM_SETCURSOR) { + if ((HWND)wParam == GetDlgItem(dlg, IDC_ABOUT_LINK)) { + SetCursor(LoadCursorA(NULL, IDC_HAND)); + return TRUE; + } + return FALSE; + } + if (msg == WM_COMMAND) { + if (LOWORD(wParam) == IDC_ABOUT_LINK && HIWORD(wParam) == STN_CLICKED) { + ShellExecuteA(NULL, "open", "https://codeberg.org/Nixietab/EOSSDK-Holos", + NULL, NULL, SW_SHOWNORMAL); + return TRUE; + } + if (LOWORD(wParam) == IDOK) { + EndDialog(dlg, IDOK); + return TRUE; + } + } + if (msg == WM_CLOSE) { + EndDialog(dlg, IDCANCEL); + return TRUE; + } + if (msg == WM_NCDESTROY) { + HICON hIcon = (HICON)RemovePropA(dlg, "ABOUT_ICON"); + if (hIcon) DestroyIcon(hIcon); + return TRUE; + } + return FALSE; +} + +static void LaunchGame(HWND dlg) { + char exe[MAX_PATH]; + GetExePath(exe, sizeof(exe)); + + if (GetFileAttributesA(exe) == INVALID_FILE_ATTRIBUTES) { + char msg[512]; + _snprintf(msg, sizeof(msg), + "Game executable not found:\n%s\n\n" + "Make sure the launcher is in the game's root directory.", exe); + MessageBoxA(dlg, msg, "Error", MB_OK | MB_ICONERROR); + return; + } + + SaveConfig(dlg); + + HINSTANCE r = ShellExecuteA(dlg, "open", exe, NULL, g_gameDir, SW_SHOWNORMAL); + if ((INT_PTR)r <= 32) { + char msg[256]; + _snprintf(msg, sizeof(msg), "Failed to launch game. Error code: %d.", (INT_PTR)r); + MessageBoxA(dlg, msg, "Error", MB_OK | MB_ICONERROR); + } else { + EndDialog(dlg, IDOK); + } +} + +static INT_PTR CALLBACK DlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { + switch (msg) { + case WM_INITDIALOG: + { + HICON hIcon = LoadIconA(GetModuleHandleA(NULL), MAKEINTRESOURCEA(IDI_MAIN)); + SendMessageA(dlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); + SendMessageA(dlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); + } + SendDlgItemMessageA(dlg, IDC_ROLE, CB_ADDSTRING, 0, (LPARAM)"Client"); + SendDlgItemMessageA(dlg, IDC_ROLE, CB_ADDSTRING, 0, (LPARAM)"Host"); + SendDlgItemMessageA(dlg, IDC_CROSS_PLATFORM, CB_ADDSTRING, 0, (LPARAM)"true"); + SendDlgItemMessageA(dlg, IDC_CROSS_PLATFORM, CB_ADDSTRING, 0, (LPARAM)"false"); + LoadConfig(dlg); + { + int sel = (int)SendDlgItemMessageA(dlg, IDC_ROLE, CB_GETCURSEL, 0, 0); + EnableWindow(GetDlgItem(dlg, IDC_IP), sel == 0); + } + return TRUE; + + case WM_COMMAND: + if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_ROLE) { + int sel = (int)SendDlgItemMessageA(dlg, IDC_ROLE, CB_GETCURSEL, 0, 0); + EnableWindow(GetDlgItem(dlg, IDC_IP), sel == 0); + return TRUE; + } + switch (LOWORD(wParam)) { + case IDC_SAVE: + SaveConfig(dlg); + return TRUE; + case IDC_RESET: + case IDM_RESET: + ResetConfig(dlg); + return TRUE; + case IDC_LAUNCH: + LaunchGame(dlg); + return TRUE; + case IDM_ABOUT: + DialogBoxParamA(GetModuleHandleA(NULL), MAKEINTRESOURCEA(IDD_ABOUT), + dlg, AboutDlgProc, 0); + return TRUE; + case IDM_EXIT: + EndDialog(dlg, IDCANCEL); + return TRUE; + case IDCANCEL: + EndDialog(dlg, IDCANCEL); + return TRUE; + } + return FALSE; + + case WM_CLOSE: + EndDialog(dlg, IDCANCEL); + return TRUE; + } + return FALSE; +} + +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { + GetModuleFileNameA(NULL, g_gameDir, MAX_PATH); + char *s = strrchr(g_gameDir, '\\'); + if (!s) s = strrchr(g_gameDir, '/'); + if (s) *s = '\0'; + else g_gameDir[0] = '\0'; + + DialogBoxParamA(hInst, MAKEINTRESOURCEA(IDD_MAIN), NULL, DlgProc, 0); + return 0; +} diff --git a/Launcher/resource.h b/Launcher/resource.h new file mode 100644 index 0000000..78d8b2d --- /dev/null +++ b/Launcher/resource.h @@ -0,0 +1,23 @@ +#define IDD_MAIN 101 +#define IDI_MAIN 102 +#define IDD_ABOUT 103 +#define IDR_MENU 104 +#define IDM_RESET 40000 +#define IDM_ABOUT 40001 +#define IDM_EXIT 40002 +#define IDC_ROLE 1001 +#define IDC_IP 1002 +#define IDC_PORT 1003 +#define IDC_MAX_MEMBERS 1004 +#define IDC_PLATFORM 1005 +#define IDC_WIN_RATE 1006 +#define IDC_CROSS_PLATFORM 1007 +#define IDC_APP_VERSION 1008 +#define IDC_ONLINE_RULE 1009 +#define IDC_SAVE 1010 +#define IDC_RESET 1011 +#define IDC_LAUNCH 1012 +#define IDC_TENOKE_USER 1013 +#define IDC_TENOKE_LABEL 1014 +#define IDC_ABOUT_ICON 1015 +#define IDC_ABOUT_LINK 1016 diff --git a/Launcher/resource.rc b/Launcher/resource.rc new file mode 100644 index 0000000..646f796 --- /dev/null +++ b/Launcher/resource.rc @@ -0,0 +1,78 @@ +#include +#include "resource.h" + +IDI_MAIN ICON "icon.ico" + +IDR_MENU MENU +BEGIN + POPUP "File" + BEGIN + MENUITEM "Reset Config", IDM_RESET + MENUITEM SEPARATOR + MENUITEM "About", IDM_ABOUT + MENUITEM "Exit", IDM_EXIT + END +END + +IDD_MAIN DIALOGEX 0, 0, 340, 186 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "EOSHoloLauncher" +MENU IDR_MENU +FONT 9, "Segoe UI", 400, 0, 0x1 +BEGIN + LTEXT "Role:", -1, 8, 8, 25, 10 + COMBOBOX IDC_ROLE, 35, 6, 65, 100, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + LTEXT "IP:", -1, 108, 8, 16, 10 + EDITTEXT IDC_IP, 124, 6, 85, 13, ES_AUTOHSCROLL + + LTEXT "Port:", -1, 217, 8, 22, 10 + EDITTEXT IDC_PORT, 239, 6, 45, 13, ES_AUTOHSCROLL | ES_NUMBER + + LTEXT "User:", IDC_TENOKE_LABEL, 8, 26, 25, 10 + EDITTEXT IDC_TENOKE_USER, 35, 24, 249, 13, ES_AUTOHSCROLL + + GROUPBOX "Advanced Settings", -1, 5, 46, 330, 80 + + LTEXT "Max Members:", -1, 12, 60, 58, 10 + EDITTEXT IDC_MAX_MEMBERS, 72, 58, 40, 13, ES_AUTOHSCROLL | ES_NUMBER + + LTEXT "Platform:", -1, 160, 60, 38, 10 + EDITTEXT IDC_PLATFORM, 200, 58, 125, 13, ES_AUTOHSCROLL + + LTEXT "Win Rate:", -1, 12, 78, 42, 10 + EDITTEXT IDC_WIN_RATE, 72, 76, 40, 13, ES_AUTOHSCROLL | ES_NUMBER + + LTEXT "Cross-Platform:", -1, 160, 78, 62, 10 + COMBOBOX IDC_CROSS_PLATFORM, 225, 76, 100, 80, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + LTEXT "App Version:", -1, 12, 96, 52, 10 + EDITTEXT IDC_APP_VERSION, 72, 94, 40, 13, ES_AUTOHSCROLL + + LTEXT "Online Rule:", -1, 160, 96, 52, 10 + EDITTEXT IDC_ONLINE_RULE, 225, 94, 100, 13, ES_AUTOHSCROLL + + LTEXT "Note: Online Rule, App Version, and Win Rate are for matchmaking purposes.\nLeave at defaults unless you know what you are doing.", + -1, 8, 136, 324, 20 + + DEFPUSHBUTTON "Launch", IDC_LAUNCH, 25, 164, 90, 16 + PUSHBUTTON "Save Config", IDC_SAVE, 125, 164, 90, 16 +END + +IDD_ABOUT DIALOGEX 0, 0, 300, 130 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About EOSHoloLauncher" +FONT 9, "Segoe UI", 400, 0, 0x1 +BEGIN + ICON IDI_MAIN, IDC_ABOUT_ICON, 10, 10, 64, 64 + LTEXT "EOSHoloLauncher v1.0", -1, 82, 12, 200, 12 + LTEXT "A graphical configuration tool for the EOSSDK-Holos\n" + "proxy project. Provides a simple interface to configure\n" + "direct IP multiplayer settings for Holos Hanafuda.\n" + "\n" + "Licensed under the GNU General Public License v2.0.", + -1, 82, 28, 200, 48 + LTEXT "https://codeberg.org/Nixietab/EOSSDK-Holos", + IDC_ABOUT_LINK, 82, 80, 200, 10, SS_NOTIFY + DEFPUSHBUTTON "OK", IDOK, 235, 104, 50, 16 +END