From 3d71e400c0d30510ef3d15cca10241b217c7d91b Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Fri, 27 Nov 2009 04:58:37 +0000 Subject: [PATCH] better ToME intro game menu with modules listing git-svn-id: http://svn.net-core.org/repos/t-engine4@50 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/data/font/VeraBd.ttf | Bin 0 -> 58716 bytes game/data/gfx/border_1_sel.png | Bin 0 -> 249 bytes game/data/gfx/border_3_sel.png | Bin 0 -> 227 bytes game/data/gfx/border_7_sel.png | Bin 0 -> 205 bytes game/data/gfx/border_9_sel.png | Bin 0 -> 255 bytes game/engine/ButtonList.lua | 133 +++++++++++++++++++++++++++ game/engine/Dialog.lua | 6 +- game/engine/Game.lua | 7 ++ game/engine/Module.lua | 46 +++++++++ game/engine/Mouse.lua | 15 ++- game/engine/init.lua | 19 ++-- game/engine/utils.lua | 2 +- game/modules/tome/class/Game.lua | 52 +++++------ game/modules/tome/init.lua | 23 ++++- game/special/mainmenu/class/Game.lua | 93 +++++++++++++++++++ src/main.c | 27 +++++- 16 files changed, 378 insertions(+), 45 deletions(-) create mode 100644 game/data/font/VeraBd.ttf create mode 100644 game/data/gfx/border_1_sel.png create mode 100644 game/data/gfx/border_3_sel.png create mode 100644 game/data/gfx/border_7_sel.png create mode 100644 game/data/gfx/border_9_sel.png create mode 100644 game/engine/ButtonList.lua create mode 100644 game/engine/Module.lua create mode 100644 game/special/mainmenu/class/Game.lua diff --git a/game/data/font/VeraBd.ttf b/game/data/font/VeraBd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51d6111d722981a86766cc99c53f1956e5c0a229 GIT binary patch literal 58716 zcmdqKd3+Q_`Y>MA)!j4Gb7y8UnVd5TlK_DvB!n0a86XJ>2_c36;WQx!36R4aAOeEA z-U2Fu5m63ZL_~~$h{&Zz*8>(^K}AGl0d+N^>&v<rlIHh3-7`r*-Ti()pZE9AOJ`=f zyQ-ghu6mxQo~mjHC4^Yvizk)|6BCnPx&PlI2s!41yORsX<Q3TmRNN2OEpR=gtfsX7 z*|)ykNXUzO31P)$3!2<FzBcghghXix;R-A3=hVDYpB_v|KOX8oG^ez&o@n487ee6L zFlYXv%E4b&{Ta$1Cge}CRpm9eX1exw0Q?ULab#Cjl$QUW2`{XM`hBpyD!5@y&;h(- z;c(rjs;24IML#d!LCDJ%KzP8siiTQxT>OrZ*S>(~Bj?wZl@|Yc+jK%+Z3BElYD#ad z*F<QS67tthc-~!GT2t}r)T4(8p#U%9`}(@Zrpuddh4x<=4)yP;Z>XqWQo8vYLOe4F z(L4vw1XB}14&lF{@KMhxvB8yk&H?B0{pXB?bl>NDoeRW33jK9N5=>_K&ov~8yzD>M z5|g&xf37DXx_kZSMxBi`5k@GlgZ7(r8~o>##7Z{*IY+e8F#kCtN!|DPUgrV{k;eGz zh-82?-G8njC3@;V*OKtiW&U$LNeX|_e{KwlmF^u=SHGyCdQMf7yKh-PcXCovihK4V z_vq@T#-@gf(wYJ8oZ7Mk_o(^v-Gx}I(Op>4SkbVcqCBCyj(c)NL#caWX>Fr>blv>& z!ixD7rHvKtK?#GBy6a#StT7O4{Eyl+O25~rQR)V%He223E_F9Gl$KZ2ls3$B*HvDR zyHPSq1r-f7)s2nSb+vA&Uscgi0W{8OD6MU(C?DXiY^bQf2g|BT8|G9Da5vStOKTUo z>nj=>;eoo@O{LYf)wOe=oibn+)@-V(a97sV0yj#_%Ia$Bp*mJ*ssiZqtIH~Cf&9MF zSy&^w9{?+Nmo_%ml~tEQd+zeOvgVqK+NRPb#HX@)enq3ZFG5rva8InOY+6{_P!Ziv z!331Ip{~5StU>`(UJYWYp55G3q2PcmbU!e_U0qu?zquSSSy<gvRoC1E$kbH(8^RV8 zK{q0S&5b}Pk~6?vQ=w2@-#mMMbz{{4cTXDwu+7A}26tlx$RBD~1FC-VuWK4<1hBv} zXwc6(rJ;pYbv3`m6~$25+)xV*0!QG%@;Y~8-2iuE^X$15WleZT<?;OabqkT8vbx&x zYGhdBP!wnp5K}t4Zb5}YgQ~v@3f+oOTh|1F00ALlC>I4aRR`2EcVks4kTtu)&o@A% zy4H=idMK@{1<h!1*VHvA8iF`oL%6$XQGG>aDKwN2K<nD_n$ktsLQP$Hb!9awTj~5J zP(L^Uu%+eY3iS$~vGMxS2Ee*`erbb3etAV>^&IF`z;ZCM^;K}zplE4n831X-CjuBX zy02?V)w*((X{GajAAtXv03JQi0KMAzi`>=Ms5<bVp#rU~A~8H^bOS3<Hi0fu0eV-V zBEPV%p}f%@-Q8WI5qU%x3*6CY5TgA|1L@@Xd(G?$=uZf@8RUSnTToZ6G>1=C+}Z^F z#$8%p51p)Z_I&6Bb&5O`#$3zzrmE5=cU5U4aKECqoBs+(Xs$=c%iYbj<$jcVkX39; zwBlO+i)0(Yo<Z+cM2CVZb%XTg0Ki6nKZcUBd8KnI+|X-*U5dhD#s9f#1w^Yf1%?Z3 zbH)5hm3P^h?yL#<Med0cvWljRD$I1}Omr6%PMDmNk(uF+9yJlJqX)RB<P>F3m{jD3 z8ik|si>A6KWVuJ>Pj%<!<Yx?UXBHO}W=@>wo>1t{8DEf>lL_~7^2g*&%E-wd>mCiy z<xePb=jDvgDFUEH6O>2&pmH+dxh(hi%)&9*0D08toV=W(sRP_uIYs#hGYf!@au<v$ zEXo-(DQ{GvyI@jb!GwvK03!py=I7*R6+$bS<1>K>05oPo!PLT>vDrlf;GrV8Ilx_1 zI4UD^{HVg*0f^y*qU_8<w^Ahmuml+H%*puh#OzUddG66UMH7n(Ge?cbx=__UHh;o+ z<k6)3j8R276Y|}oGl7&*qx0}4;09b6lQ$}7`~Y{xsPUu5A~}IZu$rHo9(LdZV>9zJ z3rFP*a8E4A9Fv15z{i}z%rSs1)CArGC*UqX8Z#k(V&+Yg;0DwSGyww1&Q$0C0!G2# z7zHzh{Cpr6;S^0M1cvxgnUXUxbAWqPVa`O9NLJwlKo{i+PautxfS*t`C*O}R$_Vda z*|pjMweV>_7c(+P<pDrYlKkJ+RrD+K*0PFv=y8pKPOchB#h|KI6r2?FOw|~GR*$WP z?yKHYPN923|599?YUR4^ff87N#aE0lnh`LQ;FVM(T)v<JEMX&Bey|#KXjB$fgHuHp z(@<Aa=l6e&rSqXNc&fXWyS$=wK0M|(j?mSwH46d9Sl>_$fEPAYH-SlUmo|gDY^c7? z?~<Vfg{tc*z*eruzoDYB9z0g{f{OWz5}>gL^lOMOSm(;Rh8jQVij6F58X5>2n%r}c zQ{eZS0P38Cs-~v;p^1qL7cNYg9f-XWz!Z`(q>j{+MWlgLlR2acf<`y#OUg(;_)UgD zGl`_Y*=(rcCZnNF6KRA`1F0aTq=pQDyE&v5>L<Y2C^8=oHw3K#SdGe61w2y$&n$rN za;W)RIBqgosZk2`Cj#VJcmmt219;^CuL6FtMTFxfg8;@L!0fkh0#E`l26n^vzelH$ zNdIF>vF>lN>`iU8LMhUXTrCA^D}b-1a6S+2)saet5C4hp*am(I;K>Gf79lpmcO7ui ztz5Z5u2@##m*X6zrCMka<$*G+R7#PzYKvv?1mZ9UYG8R2+;_vBT15})6=;qA7U}?M z6O>g$DSqZCHQk^Ss%8aXHYr$OTZkFz5kf3e>eYY_s?Y-vu(ryZ`S4o?Euu~!hJ8si z$?Ap?t!OGfTdu%E+UuZxHNaEpb3+N<X$IaP6vVX&%2obU!WrroV$&DyBd6TGT0nh7 zo-~n#@Er0GTkPQp-l>QCb<j$)f~U$S#HJiztG%Tfc+?Cq5O$!A01dxw0ih!w$^f%w z1&Yemg>V<2u2W#Sp|o0&_q7xS;P>=sq)nAzv%*7!ACL~7BVT%CT@TP_E3g}(EiC^% zI`F>A^+dp@0j^LwYX4VZSHm^7tZGyMtN%=OK#nT5s-B@nqgCpybv+a<RQOQ?<^R2f zKyRo73LAjGC>@kH%1Uh!H3ccDQ|N9~I58J$lqndfbpq|69wWVVpcw(JMaoeV5o1-u z8ewQ3=%GbQYsk0RP!FwPj~sfW72qr4^jnKi3r`|!>=DR?9*zb2OApt2+kxKCA%)n# zRcXyu@aU~?Do5}R!vABLBCSY+D*qbgSG`8772wk!OC0MgQsi0*?Whzb{Dxcq>3Ou2 z=$TX+5Ch~r_UV9SL;SJdVLw%Eor*15TC}wR+4tzP+V@c3u)nLkZU!iL)k76Ni&l0H z@SsP_=RiHAsLFp2p9t7eq)^2K>#N+oo<~^npK0omxJp5frXi(nz~_I8!L{vN&yOBT z1N?7P`UJ`xTR;kWOBs7Zk5xx*yA__-0^iWS1o-TRTIwC7Rn<zh7pRsQ`GOzxA{B6^ za;P`w7b<#Iu5dW|cf4yfJgLe!z}>(TXx9S~LNvq>z5Au=Yx1DQ-o6I)3i~utpyG>~ zfP4=0y9H2M-HW<Fn-%0%McPOe)~<&`^<>!l(c>V8(c1LzH-LBG&Tl<~Di!o!=+iMC zQgt8w8fwn9`rm`4O5N|-ag<9lJdOI?o6En)*`BxsdE6t%YdMLO{U-{p)jPDc7~>(X zNKK&E1^fm^Mrz-~SOhV|Cwlv1^_en=mr6lvuyxhfs@m0KVFM8V|FBxu_u3w+)W{k2 zSoM#U*XUg~$pn0}$OK3R7s1&?ILm^wDG*^6DrGrv&keC%A(TvpSUUsmX26|jsDUL| z9<B7uDR5pyvZ3B21(ph<5b7c9sZbYTW0an+T;)Rje1L_PFOw82ZDay8ggOD*L)hct zZXWz%n^+H@7z1}E!8M+bg?pp@?d8K$NCVa%51%4GrbTeSr`2n*Lda@+h}n3!Dg^l1 zew;@E>>LFi;*afTDRA?Zr|>!C9AY{OJ_Yby2(9J-gh}ueUg6zI@LK@&Cc;xH9>_n$ zHXrKd1B^oDcPx}62C5`fUX6iT1<*Fu7z=n6DOg}jNFCNhtcsv~6mSHe$5wNdyDDbL z6O=OI(gOuYOW3xG2l9WiA0Fxe(w_$h@)r3xQE4F)?v96hDqIz+8?Zu35O0+mli)f7 zY9b$yLWF^3C>7*qUUyBEZ>lb!Oh-YD@e1bnJW_%j>CuMXlmwt%E1lodj)1lyER-8^ zDo<%;B5*bnWQBOCckp@CE7bfkKtYejsd|t64%Ah-fbz*#BzqIcS(S(i&#iEwhYEx> zMUh00JX8rFhNu_VVt{8o(#JLt=Kwya&8TGoIrMM^`yc8UwuD-MSJ(pf5!5l15|#z} zr`kq9j+2yU15oj~YqcM>4Es@_Uf{X^WII$I1=>c~J+z~?A}>`8QOYVe{yW?rYo7@| z4!vc)-^Voq6g2`4j0aV}-xKSoeyDdWiW~{}%pQ*tu+?M1%c$PBcfFpw$XOf>q5tX` z)nVO$fBwDEcMjCYj0M)~9SH}b5jC1r$4cm#RQxeQ!kAr+2{HClqZBpPz^GguW#ec- z9jOLJF*rIz-+b-(uMu#>H~_Iw+Y0#q9#}Z`!n_AY4%ixUSj7fgQ@Qz{eC_okMjWZ) zxTFE#EL6^$6s&6Dx)iWLs90J}ZiDN<7)H$xAPqgT`foA_(DL8-kC9>{XplO_s#Z9R z@nr(Eg_I$t>Ub@{UzG!uN*Try0W6V^J=%w{_E6>7-f=0$O&GDOI;Ca?@E*1^2inB^ zR})|}lqABjP&pDHo>2XFPu?p*X{m<LN}56|$$s(=nB*NnHj@q(ML0Mr;V%Aer$wY4 z%4b8(JNUb45&YKh&k_#Gm+?noZkD4d(7-Kl=H;KI`^i3X0iM2tt`M??X;>RdpcWjz z2yfA!gmf;Q6!SIw2!1Dj2fq_)H1n1G9i$b$)47lM_55P~7{8blBW5%YKZpleN5|0^ zvW{CvGpLJZa7W1-fO91sN!QU~!Uw_!<ODfE3!vt9vXGPLU+B*?krvaP@YFBl7a9du zsaz_(NWTG$TgXSOSdhp%vWf=5)qZjm@V-EPCXGBmC98xJT)c3CyhYBEPvJfxb14Vk z5p1Av0*;@^Rx%ejbCz<#3DK_c@Ri(U(oXN<ws4ne4CUYmqEW!jS?nlZ!vBT8A4-8c zlw&C@ij9Wv8CXL&LDvBmXT?go2<qXn7}{y)-s1KGjR(nTpbJ{(W^jwSb>uYNLH7a1 zgxpPc@Fkkrd>C0LuH%czMdS_nh&u}WC{XzEAbC(6M1J8#@)OIWCHz+881V{kP(nSL zabgfzOUG&M0!j!=Ba4Y0O5dYIctbs)mR5`)Yxy|#G~mv0O9OnPi^x$foy{iem18yC zOIDM;&<zw2qyEG#r?EsPjCzR`zWY!QD5OC9kPf(tft3J^M*HtYEA_CPQMXbaMP7&V zNH83XMkuA>#0BSJBoe+ul{+rwJ4E?*D&N7%w}aY=30iU}S9s2-O*s!zzRlD`mO{B% zxx#ZsjnqIMf_p~go{=0TJT*`~1Wkfc!r*&3+|yHu#KJu+VesvPdw7RYo${ns`PRUi z2Szo@6XMRt6NFJVDk^jd$~UjnVhTl^a)&D4#CLTmyLuy&W!8CRfY2$kD+5@E%znK* zR`_)(yF8ZtyMz5Avwz9#lFa_k>+ENl{ZnQ?$?V5Sc2Q<Ov`fMdGHaJuyO00=J4yIH znSCd*e{`^K9|;z|mDx8P?CTD80WL1c?7Ym*$?WekJ1euVWOhboUv{w5UxWy!%h?wp z?9|3c;Z!;M{G?a-yn~(evd=#93ZHebPd~8>p9Zr}PFRFb?CgYv9sgJ_9Cx#i_3Up@ z<8K}8BY^*rmwot{LHIC+9s8?YI2OzPdNfG*tDPMUVn?9(NCf-9&fb6Tb>V%Pz4z`+ z;l0<{d&~KEeOLeD72ci6-u3Z+@v?Vh_I5dId)Okh$?UCg_NL6<klEowLxsZ~?9hv0 z!l9w;;DJ!#U@|+f-zppkW&2+@3;V6?^?e56bu-&%V6Q=AugPq$%wBb{JwfahneCR@ zE}89gvX@<~HJH5wa9-+QJK$$W2YV6fzZk~0!_W4m>;;)^i)GKtY^%(kli3!T{aIqq z%IulVCgB;GZ8ovZK7JE0YEuW>2#;)xWE<dTLkD{rh<`eqJtedCPrfd!m)Vo+W(rTf z&YoP(uUq96*3D$=eEbtKYXR+Ok=f%3Y%M&vHqv*Mt$|0^xY=U{wi<4&&Sj6n&!aMX z1o-esFnid-R(aV<nXQo7Lo$0%W)H~hewp2OuUEKFX7_s8Ju<snW`9a%cdcc2%IprA zEqAeH61!byOJ%l1W{W%6Z5?cp%oZ-#A}o~If-S7MDNJbYU`=7Hv4b@%Ww*$zzHWd} zH-Oc4u$m4wzk|(_*<6`b%dD!*AXFu@IWntEW)<a<P$9E&iIw~Kve}YQW?-`=R$Af^ zO4qUyY86Tx>}HA0lG#idtesVuA+zbz!i4EEn+8|Y!q`-q6?d>HGMfz7zN?dEHc4hh zk!+%!72f0$3Om?MP;irr6-;mm1s!ZczEzmuV)<4!K9c3-+J!s^%N=JGa_wwfj!772 zWjQ96-ND9Y*@dwVmSty|9V}yvNysp>F(x*8lvfzt!A1ehQC{X7X%>7k8+oHi7-?oV zn%IcpMqxxS8*XI7%GpqvrQ6vJGE1|uA*rFl5HCv|Y!^~PS?Xbauw)bl+u7jdd`hxG zNU^gNAD?VsgOauggJhNj@RPQ%L<38(v4I1I3IjXX0Ebr?FqFlYv;O6*pUnC?Se(-; z#6_}LH}giaJ~6<6_&$*=#>%3JQHbtf9y9a!c(<KJNh~swMTEPA2rmma+k|iz3*SqL z?-4%C$U<GYLg-TFf<|4rEJS8bD+`9!f;*T4?m4{7Ue0V*79=w(Tw7&kDQ9MrMKIf# z`7m#?Fw=702qnf2W=LjwAWa|4^vik4$Rr=HlbKd#8kvcLB#1H-BqsQHzJsxH#=%pZ z%qZYXt&A8M-Al{wUP0sk-}p!V-yq|6sfZwZM1cnhk^yc@E9cEAZ}r_&?0$EuXW)SA zF5MQ5yOk8Q8W*|uUcFjS%!dh6TZQme=GC_H-k7t0RCspafZT#&_g>mJGs6!yvm^s< zPArBN;16#@bD0?fA;PPa*YcIZv#|C~L!$PBbB%>?M5M8Ms8+b2<4I!M@%BN)a=iU` zdy>uSv3fmLPbE(}8(CQA1$nK;bou87u^+~xQSfyy#BKu7ktm;;JtRIzR%m&qp`1u0 z%kkmu$?55XNaFd<_9W`DG7kfA9taStQe-)WR>>{GiLSTgS#)#P5qUkvu5YnztO_6^ zZjnB-Kv(hrk?<VPi%e_j?EC^zy99ut>&GYutNP)C9{>)7k@!I<4+1^?go7lEM3G$I zAeTTN4R>m6X8og)4jm(_tj4Iwi14t`5NEJ0$Z9d0j0Q=kRfQBP+TE7pN1TZF@bk&X zheKQb?<C4RwiM=Zc$80!&BNf6>QO!vZn9M+R9kwwlse=+nKWE(Eje8xUoJUQBL9PC zXUP|6VF@jeFJ}Rx56a8v9rCgh^2JZ(JLod}d`g2(&^x-e$rm9^Bpc<A1yQt<7}6i6 zup50N!zIxh7GibU`{*O$`4CYzAchmxifaZq*M_VKTODK{u$plCzBD3{2qv*_AFB?+ zqxdizBZ;EZooqSY)_L4Hywf@ScxRh6C>{QQ!nSs}eW~5@uZz}nID(vbAO3>U)01cn zi;a!51_wK>aj~(fgNLN0r8wZqfp?w3!4A8qVOCLe*n@4>AwyCJ$Fi`^bm@0>jo&Zw z{P^C#&e6@~?^eK{TRwW}-<!uy%KvG~lmhu<I#5XHN5x?yd738n-~Ifq_jKQ!(?*BM z{SyWGtl0PUSNFaR9)t>fX6mpp^2_pfboA(qF`#9mub$Jq1tS7Iae{2)V8KC|FEvab z8tQWCLqfv5<S9eKQ_)ZKeJWIZ%J4);P)m5|`oXS2@nJfqb?9_j^B`@ME?#T)4z_&J z)(&J}`~~SoPFT(-UmAX1xnsGQ1RY0X5q`kW)My%wB&H-Ig>lJ9c1$#~gT~MlPp@ld zuX<w2*!=O?*?Hr~?)&7EefvKBw99*%{rSr)EB2i@u@67l`T5z|<MX+y#SM*%7dJL6 z-ul^r1E)?M*nhI~W6^l>z=6*{KXBmW)+G&%OP4k_EJ3YaeD$38EKnaylIRfMR0B2Y z%{r}Q*6Oqa1|}r(@kwS%NnhG8&J1gNy-9Ie%JcexIy>PbABh;a$>iA(@pR~VQwy() z>reX72+(+aQlAKW|31bDCr<^Pv%k@57-Z>eZ##ax-SW;wMHN(au!2f}zPxk(m#;5c z;IO7En&M1Xd1d;+>P**I{6D}s0dGu=-l>hFWTx*=A~7>FuhW?&lU^66PYNb5V&h%9 z2q{7zp5!HoQlj1)J5m~{_i1vaTzzh0ZqhV5jhm#ICQZ{%>N_K0MpAL|&B-t^!OhW> zXsV@ZeR=Hi<N-Rp6z9^1#`V{y>r=y%B9bCgqkP;reNJ3X-zjtoH$y)?ZVo&$U+<Vn zXX@yUG|eM&8tREN(HJ*DtxlluostY{o<L(188Q=9C7#Bj=o6`F0!=g5l~J!;JiGea zJLO;H*H>-s-&g*4`rGqnZ7mo-Y0%@NMsHg<rYRW${2Q}&)b5eb&yx?<WMxptsYlPw zO`SXRnYM@s`MacqVMC&)$R8&z9NW0LUq6r%*gM*)*gJ<$qASS?9&8=sK?G>#z-oet zqpg1P2K8IzpBWG1Nh8`@@~q|=lZNtIqPOxE6IjQ#Wazl?q+)MlxzxcyNUg&j#CZAB zCmvnhLi;UWzD)l4-xPF>zVWXg<YA{z%dqgAl4s?gxyuUVaG#MpD?Vc~Y9y;jm<cRL za(e)*ZAeh+U@p!R9OSTbnrD~8KiaQl^`lS7KVPKpoIXw8{^4Kp$Wy1}G5<!W{kU{q z1f8{#EMH%XQ7`E<Ja|IMpk>0Jtp?NjAgw`SI?>7~<A|Bp>x^O$IF7dDFW`gL2o162 zQd=_ofkq`!LC|=CDMFmrn<iLOtX^J}_t0^9@~&<2&ODm0d~KuS`8QtNv0|^hl@{+^ zvE#)RduXw|bq`>4k`UpPz=I8m_F0IAJ*T5v1T9a3I7u{M%bmm9K+!J^hhJbn7<*_9 zjJ%b7#7SMhT<rRVlLWr&QhV1W&d|;okjfhQG?z~A0t@Bx8QAk=tH^jrV%S6w#PK7l zJZu0V#`Y1d`uB-)dY61mevmffvvqVocaA#)7C-1!?gg@qr-TQNtKx@;Jat@C*F)SH z`83x42n+$X#EA7(vK4Y4#HK1sBKT^k4DjU^0KXLKlB=V+c15>ruX3PS9HA_+O%dd! zBT10-iQ!CNcK!3TaN<`;9dTs#)pJ6k-@3;5Y`X1cw%xJb+!8{94NfsQ$Q}aZD2jO= zO=l9d#6owmTF^973-P##RrzK+s+TO8J9o+Ax!~ar%b&|9<-^oR<7h1PaqTqZ!Ug$T z`NFr~(hzxtTtipWM%qMI%YXwVus1^B0cVNy^*PuMp4%a;(2yNEZHO2OyB{Da0K92$ zLo5>8lP@VDiU&e%j8UwfpJ<W%44qDEY0;H-DzUe-shE8wRsIDaZzhC41Js3(wZ48N zf){uv4GxJA1l}uz5YxkE{q~^sJb8%=aR{(gBG^I0Ow0v-qVsq=8auRpYKw4njnPwl zL~g6GsQ3V68+_1~i@2^HzQLMy!&F}^=j<Qc-^my;IfW3X(-{&?qMgwpsU+2z8Zw%U z6SACHA?BH6CIm<xE7&LSGQd`i^+uZF=F!J;`P?H{-r_ttSu2{SeRA8K@@<ed>3944 zGz=n&FnV_M?HSd}$LG=P_<`*o-}dp#$jAGyp5re9wS7sRFP=EI+jMKCmyO#+_u8nJ z!?)X7W7dl;{eo>SJF&QeV=cif${yv`MfS6Fo(JY0Z&xipDB<}_=P^Ez{{=Q5dLMdy z-V?2a1*%7kiAnXJAkssIs7SMYk3S`Em-jV(bIbe_bDntSxo6gGeq`kXx6eE{tKqBp z;5j`HFmK!&Yrg!(>!tmMq|Gg>tiC*b=HyxZ`_WLh`_SRLo&$}9T{1!nXafiKZj8@O zJw|3E9>$Db!t|OQ0%a?7)F6>iQOg_bU;v@}wkIp1I*-9;kY7-Iz>{N;1~vmaG#uQ| z@-(`|N4K9iAwSkNmv8A>#ddTS%Kwmmq82(1xcD^m2*^5;2r|MK&1)jogl^YZ)>_xt zw`+D9xtGWaV@o8AA*nN1iXxUsRF?KO%SDB4?Ut{RY4UkM0(+(dSwkFlaxM3OX(!o% zt_1_8CQ&O*l3$TOU-s+b+fJ1}v}w~r6Zg*-PRJL&F&O0^Fa0cE9F$BGv$F1QUT|Oh zK<u&00KXXFBG|G%B+VCPBin<;?cs*C#x<7h(d)xoyarvUi+OFKE@xC9FZSN^mWyaw z&R;^IUi<__+AC_I)>uXN0M%p#Rkcee2XhxH;9q4$1zm9S)`IPaEu+^>zd&8`JMv}u zwEPBbrkQiz<j&sZ|HmDb+Xu!U+CONJeCgy*@)>$Rt)>n1IX7x1^uvq5Q;}r)oPvvE z9PeU`^9sOD1|c|%aW$4N)c6}5;5CuhP7R}UrcbY7p+YQ6Wm!y^Y4bR!hkEYkE4uc{ z_j7SwgM<?&ukidnu#roFKS7E`i-9ElSYO`|L)>;EZjU6b1EIG^wj_l(bOzQZ)Z9PR z5vvOgi({eYSWllM=mucvkVXDL893Gsyn{Y)EyuhV829n09aZfd?miGs*a86~bY<?n z`Atpp=QT9QOYVDshJu*QH1xsyTAl>M_$9FK(<gr}n=x(n>}fN~xb+KaYnz*E>zbGK z+qUe$J8vIcwyj_P0}p?B?%bCTAE1+_mXu7LdUFZNelE~v0@;VCve&q_OORz=!*2&& z+-_MP+~N)QYC>&J5*=z(WZ%}=d0y4bwm^4IgWw)IZ<+`ZErdb=6CNE)m0(v5hK|nI zTDbkNHDleh3-UKKooZ+w>XRRk_f;RJ%PJ~CDJm;H)E*D=PEMx!&;LoI<ppw!yi%ST z#a+DXt~>wqr#tVu3owS<K9|pzfLt^r+-Kspl3n~(QJ^s7w8790`YW1PkU4f2JTA~` z`EmU4CGt{v3ph1^atHWYgo0yEug|6hUyBZRm&ABw*lCj#P>KhIaVPjG00*Ae5AZU0 zUxe!Sz`O~eVpK3fIK}@3v@*(P5imp%*el|0fJk@^20%&_(hdQLj&smdDxB&Z&e}R; zfn!JI-SVCedaRuuL;OzCIN=mK<)_j}p5yk2&+%G;@<giyHXwuJpj?2KLpe?g9KwMV z^r`Q^_~Ck7L;>O=fq#YW)`-9;z-4$_H!ikRipVGs*xT%AhdiiV9@GK03;aFwvnbI0 z2;w2xzPN}`f#XG&nLHF}dBnWNu*tR}@<F#K=xC^m=(u1r%tl4hXaL`y48cEykuWS$ ze4b(|egLP3(U%7U<}_unr#LCJ6pEA5z&KC<nQ?E+kB^?~OHVDCeAE8QMeokML`nWE zUq*jblJxSR!ez6E4xW*aHDSzXI<$Y^zZ{zV<ka*Va|gbmW&rM$*K6v8jbPKplli`( z1~VI+ls7)b9OBZ2vAyP$B;8(@BWbVs)wDi)9j}gAm7g*=FH{UM^baNdgChHd_RR_E z+rQu75&0M>fF}bDu*k#TfqtyAO}W)}(E@flSsm*t17D!6SC^&OBXEp|!-CWlb#xmS z+Xrb@;%R3v<RgcqIYmAux=)-MX%FcGyufiWL_slZWc9SEbLUMfuBPiE@1DB-)6ZU* zdUxbUOI8jYcC&nLOVjabkNtUGMLA`wZ||HsZ>fB;<u!Tl^5ys3cl+&h!tSqV?c&_= z@;>>~I4*4Q%2l^5TCqZ&Hg>|V@4nknF!rvlT-$q3mA{m8+n+`Zn=QZh${P7f`RqBf z3O1L{xohcCnsWdG;-yROdtuY;3%ASvl#iocN{|zY1G}ps61DhzBtjH45hA1-Bealh z6m)pbMer~c#4~LK<CzqplX#waC7$fi@+(9RQY0FsYv@FVVVFNfg36+rX|3XBVd#f{ z%J8}S4veC6TP2K;^j8mqj_cv@sS(oh5GhfbELBR&$TGT2yG++4Js@q64#9B@jx&-a zNE@z;GI+K9b#6lrpCyddX6uUCRDQBBMXX}gkj$DRmKd7IVtO0jEG*VG>F($65$@66 zuX}=DE3DD3)9ul|ru%@rP2c7|(7dTVsyj(Op`UOkH7B&6>k^gNi-8ZpgYj8iTW*$@ za{cHBTt9hf*H-$(5o(ct5>9l)b6&0xb2IxPF1a6gsfBS3EFAKAgUD;<gW_wUD|D}g zh%l%KiZqyYAz{3R1xFe{AvD1*<^lhkj7c>Z#`qOawRe}=)02EU5^af2j4p`g=}gu7 z##5_JF~e{|BVj<w_oG(T)3BiFvt~^{@%N_YrsltM*-P$|zmPxax`P`{)2OqOtuDwP zf0NwS)i}GXv{YWix%#}h;<MwziT%fFo&ergg6Eh4mcd1a`9cjA9SLSehyr&o%MRUo z))HzPXdq&Is0BuoI10sJUv9I!t>T=tJ2C9$FpkdjD&uF2_yZ$n9A{#u5N6E%da3-N zoJV)l=A~cHo%dnmU)$UN+W6tT!n7OcCRzb=$(wFSlRwDGkS~AxjeI#H2lNwoDyAzu zb&>?1gB;eapofFCT(CrhftCaktYhl<11yo>FtsP`EO0?UK&{X$hRqb%<5WkcB5;cv z@j&~pmw)K`7hMa}>EjnxS5{WvD!0Nhm*3fW%XeqK{FcVRPFVT!bI;5Fu4pPnPXKuE zX8{k`pX{^qhsA^3VaPxpmLNR>(j?5Fh_MaFh~TThTkWwJ3yk%Uk%v%3^;`J8pEq|k zaC5qz;GVs53WB)P@^|prrjFvUjSrv=9f|i@yW0?`(g64`&=Z932d^*C*XyqV-wj+| z769Fa`?*oF9g5A*^?6;P!2#ihz82ms-tfpU*C0a*Nwf_V<0GLh2=Fl^Y*PkxU@ZND z25~3tyg3Tk>jfj{4+MENM-q@U2GT;u!}9xoR>ZxZ-noWa7cKqwlCOXL>Gbe9{l4dl z>$0*Gkyq2FQRHK@<f}jaAj@V8OiXireha@S{Jzm=;|^;NLc&*q#9}bGrfzmCp~3J= z!-3sC2WFDYf>|_c%-RBD3GjY{QM!)%^bYO@%&&I6i!AE;3zrVPcM&j2l`uB~T4W^c zRq_Uht#pr}!AhBna$7A$)4^2nim8H(jNer4u?Rk)KwyfX_ak^T3WQ!=Ay+C8^)TA9 z={ce~EWAlp7zC|IgCT<gD$|A@6+2TW4knYXX~v*5V}SW=)gppI`9P(VX3&)=+KtV9 zBp=Nme(PdrbUzGI+G)%^clzlOZvlEFatFji5RowQh7RH?UeqFOdR3p4Q4u(I@Z!G7 z!9uWTF$`zJG<hsnGaVLa%+%DeIcP`4Dou%D8M{@pOjB>To4-fgrg6q`$=opQXf9V< z#7z~7wKr=^xJsc$ThHAJ=60F(0bzyq1+5JdY|sU$M+b%!dH~2Eo*wEN#9VS@*A7Jv zXE;ySh|Y^#Uf1s4eN7-vpC0=ePlFj@kTz+<0si?wD2SkxZgeFdI*`&wHE1gg<gdOI zHbkS<a6>4k#UIA$Bpn?hNjk5j;TX{ZGxUN^3-d36Bo5-GK?JNF4spQ@LmR-6Hq0w^ zk2BC^scs9hmu6+WQK{q1TC*;Sb7-O<f$WgtxshBpH-XF3<VjPwshX)$6<4RJlh$w# zYaiA<&$Vh=rBI&oFz64aE@m<Hr(QOcrm_jt$Hr<WYp3c8OjUFatI*EXm6-0<KA?MC z8v=gFhP(sw0Rv=Y;CEoQCewe&kI7pv$y?>s!imnaEUF`(&*(hGyjQ@CD7;YmkB%(y zMQDHxlp6v;iWiB0Lo0|>!wup!KsDMGC6%F49Y|u}*qDbb_fE40Gqr;yk?39G4RkCW zCr+kQ#RB~tS|yg~_t8C~$;E|gZsbxlIY7KmGl`p~spP6PdPVSnu~n7(4lat;$c0^J z6^x<#0LG+~U=#utN~}~yWKNRovxz%`$PUB$pq3EbKyw-!=!m~A$K=x!m(yl(CAvn! zEY3_Ct(qRpL9#%;349Q%Y<=_1)|cOW^JQ8^TV%+A$xq00=o9=&xwHLyxs&qWw^N=v z<#KtAyjCu!>*-uNkFHn!j^fKDc<06-U$9|^M!$os(AkU{s<jN{^;+mccBKnp&s98+ zl6Klj9AF!5ibLk1lLF~}FSMUqMkDATNb#MMahB&q{cX3^gAw}f`>w7I{-AtwO?mlz z<b`}f;e{FIGG_ZijlnyJWrt=xX)%SHBx<y|21;qRfqZ;8w62&9C4yD$G<4ztS_6r2 z87vWTBr#&LVWP3pP-0wYSP1ses4+~{Pc=@p7l+K%R~v6NXhA}P--rX-Aae^{6nP25 zKZTd8BIQ+bC4GX<0k*99^nE%|endXk`sTsiz|=6>Lgyp9fU%Es%8$*ETSXoi`_omG zuYT`Mphv<RKFGbk<gidK+!Yb*gan(@8SHfh!z)8}=)@g{6;3JG7Q!syE|Ks?u<}le zP7|zW5ekRffW;6TsT~u!tjt4ocg?_@LP$7p-WL@X66OjG4GRkmAL1Aioax96p6r+$ zTo75|s0c2JG<SzlE)En^9ic~3CrsKwnx8wfsJeR5W_cNx2Z>4Bs)r{m^?f8)?n%34 z78^NjPGzxthx|(y_~>^&dF<f8pk;T+#k8>=-?6e9eC$Bb;5hP}uRpBBvxitEePk5x zpl|Vxw?cMU`5oT%)|S4Jl0GU-L&97pyT%pW*YX8Ss<h+8o1#N%RCU2}p*t8%@)gzh zqv;Xpk?B$C?s1XhqQ<$4rI`^kB4<U-a!>Qj4X=x+i>!;Pa@V<QJx%&1Lz8hy)Drg+ z&szQCh9@J}MXh(Q^K8*?F>Enzi`W*qEoz&4o2M@bo_5b`M5%G42Zk(GWdH*~QzFIr zk3ODcp8sI+cU2GkX=?Mczy3`=C4an9{`;y`RKMi*d#2yF=Bs1WO-+j_FKm(9(r(Br z7(OP%lYC_VzyCQTm1gFRFUrr#i}WP@ZReSvyuc+GZ3uHgA2j4fpGj0r`wb92-5|gq zSV<y7bOUp^I4H<%H7V{^tN1}J=#c6MclvZaUR@GOWUIVPwqU?>C7<7^*glZOThNM? zr1+dxy%q+@!eLX3j;sjM221Ja{eqOvgPs?%#c1gF_-ysI4K_8NQiptCxWLaszW_h8 z=>7*5fvbHJ#$K<>Z-T+S<FySNUSrET?~vb;-={<92$eczEG3c_UmU|+G8X~M6Y+<@ z%(n>3>4@k>0}LZ8^gPPIT^%sNl=$yE8$U0s3NJJYFYw(){!!8Z!dW;s*UCYbL(7~r zgoW@<Axi7kjwNGhHp}KSg>m8(TFh2ytpQI$Jrcc(K13g+cXfR#rwS*o?Bw$?Vj&|4 z(Skc6270S+oEQNfQ~)x-gGxj6640X?0@Ub-Kz2?VqLUy$$3-xh>o6c?2CoD`hKP<; zYk(OYt-8EHuOY_niF24U|9z+0GcF7`S)f}7Iv^EI&u!J?mqFoxQQ?3QGQWNf9AT0J zcwiSSf<^L5Za9X5A08@<6jG!lIDE=6i<>2sN_)ANrB*l~>mh;n*XabkXb9#)n3H!2 z4y|1mst+~9aeY}F-&cT<r6JKY1cHZTK3PZ-lQc=%WZht3#Yj^Q%i^<zOx-v=4il$w z)7T__l29lXY6`W}bd&Tm4RtVuQ^(b^D!xinp{>%*lWO(VhC0JSworSkZh`(*!+n~& zwf7rd<@T{X{9fT@?Lk9sKtdQQq0b*dZvoFuU@C;bZ>_vh&VYgYB{>6R_7*<^Kj1{` zt~>&=iv#7tthAn7@n!N6sA3Ty4;;$Fuv!<Pg%>%&kEDYzKpUaah@heHekTGtO1v<3 zC%mM2gQv=wMo%>YOnbF`fl-he8TbW<V|f4gUHR>O?w|6&zH3I2sY-i&AnPmEGBXo( zL>I*@x<nSMbL)n)6y43NK(~r5*BxT5I;)NoAyCyxVVs?}Yr~{?0>f;+kLcCLgM3r@ zRP9iyz*s@%igm`<xL5dBwELt`U>`88`;T>UqFg6G13AJPI5W{lA$-ZAk8vGcB9 z>)=kwQS>a>jH~Tnna%+Bv}B{N@3noGabSE<!?jA^g=u1bs1QtsYIKUtQYOIvQ};zR zHX=KKCop`_DH;sa2Q=8<hrOV1Nt}->;7XuBOEA6#=Ml=hv_DIwLs^nEL8_Bb-Iza; zw%X~RArdU2Te|+DgwgGsy>nyNgIqI6bq3Ib(Z7x?^o26)$y(3`&Z~uRnjID({)Nn= z2#ax0#N7kuUOrVx&G>sDU@a+FOJKqM{VqyidaZ+nYQ3zVb_h$?j?`zdZ0!X7WOlQ@ zPH%=72r}?6MM^!5{5PFv*bN=uGfyXs>Hg7~CZGNXdk?V0dFu#R%>pZqd=|b<e3ok? z&p=X?S&0Rg^&ElRuVSf{v?$KHwsJL)ZgzF87VT#{Hl76-z2`Ft#raG|d*(9*n9$@* zT|b}ZAQQ71XEZ5!P?^)lR$(m>wD>Hv{0t;*pj~i7N0jsi##WfuL<&6I<*wB*t?>=C z{qtF&1Y14Ewh9-3zak0oL5`V{6)*`QKpyspl21GW=A1&f4u9+fXZfdGDbM+t125GD z>s;iIIhdyb%;gAJj*K~B({2<8mxv?o<1h*9@T6jBET1}f5bDk1FLJBJN~o9rDt(8% z%~KeeDig>s@Fl99RDI?3LsP|w{?3qfcPJOiIOr^Z;UXH^Ca)4J<@@NZ7>gIf9O2ur z23{htaK_hPClXhbp8U;uOx$4l(CR)C^+EWCnD?zM1`^|BAx521KO%}5?ZaY0P;KD7 zVWLgZCv`IEYgkJI;Ton5e0hm+BitiABjd)q$9rbFXL@QOWVzjayQe<xA@@U`r`%6@ zUUa|cIp99vaU@43MU9E{MNNz>h$@RLiMl&-dDQC2hod$}Zj9O)*&1cR2qrK`HG+CU zOptlP<ZK^L$~AMP+~)dQrr%WY0Ot3zci*w&B+Ro!e|*o%#&;$)e%l0_5{&e6-nfkM zkJR+Lx9g5Al`}us{Py1PNfQzhs5Ly|N8reIh$m)&mg*sjy}=hIZZdpmCYu~B=J&&% z3Hi{)MhE#q3_4?|MG03Spil;>m^k_RV$$vjktLCs80$56!eA0N8K=bo;W$`H;9;b3 z(V|9J@w0f`?&f1ul7BhYynCFyj#hrNb>qgZ&u`f9Ja=ODO!-y03yxQ3&fW~@fM%eq zQbATOnCA;6N9b|hbi{aE+GOQ7IYC6Bn$bpLA9iid?$SkA)|IsT=CEa$uj`2dF-K?Z zmA&Irb5>7S``mMDiyrqCy*LHZ4BKGTnOOV+KSKT@Iq9XRo_Z;HkbEjC3bKn1IMQ(0 zADIEXG68ZHl~>M9<U^BnlklOo#q>UXhS_;y<b0u{^}~=?s4c*&c9>0Wx18_c6~!^5 zB2Q!zB->eU=54{n4C8h-ACrHf(y^vpn~`@7ix#o{T=B2%o6Ba<91813XwJ;e_mF$| zQT1AofLC@HSB>#`h~qP=JEA=<Y%tJILpB7xZ)gb*b8uRRkz{a2^DrD<T~Z=*j1qC0 zPX^Ax%;@gKh>;P<Ifo|_#Mql@ZX&3&^n%p+x^ewOxBRel83d;v$}iDeNNj282>IcK zB~^D?xRlD<Zy%E(w<isPi5e&DLm4W+xw>*`b1h00JULqdJhYJ#U$_N!L1;ILbOU+D z1k+iZ4Wd7tU^Hf$^>)h_!`op!N}D<*b3Pg8wQ#8q2GGXt0NSpYZaWa}H{Ci5xbWqg z<yszyfVqnZCAokLTA=3)NntDA$s10S<-f}7cJ4g#iD>^mEhGOb>D<UlVAAH*mr%-b zmSEx+fsFgYO3K)9Gb4^8!N*-2f+C=E=-xN(irEzOIr)&q8i>*4bGS!~!(b7CY9Fw7 zoL6NIQ{g!DflkuDq`yCVtV}s76D&&njf)BtKBuxkcZcrHwtxa0l`m1l(dM1wKp|d` z_gA--&DuS^_1X5iCAT)#FIjSM_6$0v;|d)$qijp3RsLB%=k`$Nkkob0GV$59>oz>Q zX6>`U?d{+xgMiyklIjaF@`OsKf<AP-Z+XT<IU^ZsH5$zpOh2godN?FTl@Wi^?h@B> zm(qhgsa9A52*XD}5H%OqXe0*<L2`@H;>b>@UydF5raiT9zQ=9rnp{VpSX~<$6Zhg1 zT_;6**VfrHFQScs&VyLsENDL%8=Zz(&}TT<6$39wy=E5Frz_Bv=<0RLbuc9mNG)%t zmDq;7jxV{gQMAin5bo-JIZJ`4CuUfu;KKal2Ehbyh0hJoSRe^$q(%d=Sd@8Db^Q+r z1vCgVk<f~@#9D7%ZdF^ci}6%h(1G+pYo8r``Nm4v8>Y0l`|J<j&$w44(5#=Ii+~b| zJmj-0dB<JknLy&vNG#VT9?wHq=__$D7X;ugahN8D<!Gj{nPRc#W+nBwj4j|7h>JD% zvAg+ug$Feo*cw>f`lRMH78=Y23q!RT+*o0pb}~0pI|l-%3Sl8v&n*y^Xz%6j6CTt) z$~`VTsl_#Zy;6{XKV*6~cEOCXoG<6f>qL9!%k)Vwt()n`@<5dazceCWCC_lMH_6hS z3kKE*B|^QhT<{A(VZLbp6+%c#w!s@*cY~Gjk|tljFh`J%*ATa;2{E5?!-kyqBX@;E z2et<pv_>)8ZVbwf3NuDnz;$*G$A|;{Bu3lA&*Q37@T716gP=Q`agr=n>B+IM)YIRS z%~5elaRqVpam(W#j(aIiGZPjHf$E_a_N*B4fOZB{)1j2}`!Zgyf8%{v5=OJ~E9*G9 z#aB3|9xkg!zc8n1C)-k0bMai)WG>qn9=dSe)(u^sbJ_dmJ^xhKNxtOSn@jM0u}ZH2 zI<N0FyMDjdpoPb{;6L;l6}3O^HBUYg=rw=@b{fA;j{_`l<?leq8*U0Bn+)$`-f*-z zkBxQ=yDo3IC(Sm}H5Nzt-LV52lU^x9?u~^@mo98xvZNV?V3{!3KLd*~UZZ2#;ukh; zdI3L_$nVPSaJ)-zpmsQJKuosFlZ9D;3HrTZzK9;b_r9rxe#v%4fX{=8Bk+E`q6EwN z^VhpR2xK74MJf5?16wbv#|2?8?-e3Ei;IN8{cY~rElR+Y?f`+MVa(w7d@}$ywAL8E z0B-*HB?OF|YggEp=9UO0dhtOV)5|LdaO)Mq^yZljqb<L8c4Cyw?E@Fw0JtpbcFn3~ zZea@pUbrj1+c}Q~qx|bHetW^%fpb>y%E49>3{MF=tbfe(zHXOB5{<At0+Kbbehb|O zPD&{&v$0FquuB9HA82C`3G%P3gS6GPy6$A{i8B))Sc9C)+_f~Qe_xgu?0EUlU7dW% z-r5Q#AP%r<hMx^M#E~z2KBIv%>4!u{MGB%us}p!>NK{m$SIy=rF_!&^<9NshE5E@D zF;*a>H!-XbQhEi^<NKnYJKlc&+MFJ&`TEyIShcDqd3vvl#?{bz%v{dW>0pvVuQ%w8 zI<pWHY6vxknnKJ2v<bQdDM6oLNHF$ur)!7lhDpQpLk&ZXxw>)EIQ=+7wvyl7r`@O9 zC+*YkGwd^ZO`=I-(wcN8$*4~=j_h}HKOH72dZqmM?j?JX7{zp_{BUgp?`-_!=E}0% z(vj455Y}>a)cvq@-r1(=xj8i>e>{Atv+Q$-0e^y5F{j2S=yfq0U)Z%fCWcxD4<4GH zlxWmOZvOL5SWE?c4TDJLS>b7jWN!6^ngp$xZL-o`+D$~#>UEqBx`QRiR0Mf+Wqqwb zj)5ikF#UpFNU?j$w40Jk$ZZW$M$o?rXhKGkkv81n%*+<EwSX&N1&$J~gsC*6N45tK zqgGgAmx@7-l}n+w$g6Igu~$BN{N<fHg{S2=uM*jtpLUhJe4L(wWXp|+{YHpoMOagW zGvZ+o;!wjW`-jdJ3*8kY!U|in(K;3)1Pg@M7|E)p8}f<WmM&~LM%b{#2-ZYHPTi?8 z8auc;R@q3aIFmJaEJO(CNpE_k=FJc2Zf<-1boqybdl!bq#BP6r>vv`2X2sf3*tJ3g z7vLk3Z?DfUvTO2-Xa4v3MU}I^$uBMerb2cNbBvgqn9Nmj%ejZSjgX;GkHg$y?n5}f zQjVXvpE#F5z+p0pcMuy5XQ6y7Y$}Ln{rDkdFimIae3CYcWKnSRe2Ml}@m_i#yH~hR zTno$8o?uV#YlL;;R<?(}#`*-ZVbl`^9vjx>(mC>2c_ClY*}=ps8$m+Z;B6y-BL=$S zx_sqeHD5Ux^OZ0u#7TqyFkgA*|5m;d^IrccRr$38l9R9nUPzM0DoM$krTNk_NnxbW zDzr+#OyMKxLkXBE{3tntIXeuPf&`0*0eg_nE(PmjX&=}Z-%sqXjo0<jdm%vyONQxS zZkRAs9I8pv-e4GM8q2BaNmvkLn93&eleN=zMf$0Rn@yEm2|rsX5lb{B+H$Ex-^|tX zjY7Rxuc_BIN%eXVhWIB~AajrYLBlH3W7;PT51Y1d&$BK3^TMCC&+E46w;4b*A}pLS zyhGdA`}}+23GO8Ol>c0~p#6vLYyEeI>5ACGs0aS2M^8Q3bjJPzG#)-PU}@u`1N-Gg zAi_?@ckx{3m5q$+l(Dy=c1s{jJ^hm}>yL7lz4Mwq`O828lc#4Sjgr8GR1DQ)0`vH9 z5}4g9kOG;@Kt{7y=D9nA3Ed*M)vj2b-=r}=2Xmvduqd6ICF)YxaNQV|rz>PLbhFuf zT_d|qcL!SzE0I^}9w!g8huP!edff)yM)s1fmEmznhsR-dm>ts{(|yQ3WM_0|bYHQr z*pIp&b^nHU2K-yRs!N9aIuF|-BpVmbhih$8lo1qwkJt8*K<NB1?O-X%n8D@px!Me= z&Ug=5&aL9_7guSQOOKN^+&caVah-Op^qknr9pVpZQOAz)$6(>gr{qKK4F8#UM*E@k z4f%@uk^ffwQTvtjEBQqn3L=CoDhLq1L4x!z@_f4Z!nbrW{BD)+?)+80n;XH!$h&D? z*O{(2=xq6Eke~}jg+U-eGacm{V~!wZ=z9huGvR9b>r<*`s0Ariv)3d+T8u~=w4XDw z3-;XUVaFZJjeu{k_!pC@b2OMl`rRoKoH~F_Mq1pGrOq4m5}HMcm@N>N`6Fg{b4I|R zVXC!)YvS$!llGWm)OPnWYRCOXEd)~HOc21LY6NXCbqEg8q3I*^5&LMc=iR`Dh(k2# zrgU>A$)w}hIGAwB6z6ai;yoNJHWTkN-e-E8TMJ{BCyY;+wsPCpHvW0j^X6CRezuoy z)wN28^sgCTGrh}wVEn-Jp7|5*0+-%x_)JtCc8!ELZdB5N;Fv1qeq#?jd8~f=L??8X zE-iQY%8=LBd_Oc7x{s3e<+DHnI`XtHR7v<Msb4R6++A!FW_=-3sbqbRpo7KS3#1VL z7g^tosoZ2uHCL%w#4XVLNwZp`g-)QgP;e0phDd@%9}DT=L_Ma1$7yfYuhc%ReVHB5 zf|6@N!L{dDyVj+U7f22_vyZxVa`~OXTz=OFd`U;wx~rsvs|0Ew(B8@Kgpp()G7ENV znjL!4s|&R_BJ_eAGG@9q{aMmRzjCzMp7Fwrw@woJ1lu?}al5RNS@6P|)gusBB;(8~ z#$q_KQarUX;fEX70_*LP1jvHKrefAm-L-&OkQB^}IB=r{EZxKzaen8?&)=QDa>R(0 z^WXjaWaf%V(`xIcPFhiOw)Ks}Yn#tBtv&k2OJ}F7-15{)SJ=w+TUJd03V1n!egp6D zfPFc8U;__sScN$Qf07qM5&F$JG2${zI$T3-i7z?I8y0LZYs2&omzfvbjD)qhfZCX^ z%x%_Zyy31;t;0-Xf_M@d<$x5Ko>$0C?i_wZ4LcR`uAvvng+s~23K;MKk!i3@JwUZe zWH;3i&ylQ$CQYlWn>Oj8tlpH@Oj)&M{mL-c%BQxhoO1T1H;%4tI@7%N@Efh5e<$fq zSmj(uB1nu6lp@Rk`;eXsGdyRDB<4uy&PaLt7wwkAh$W=CaXoEZEFQpYO)4%McEa)i zC#*jhBAlALt7P6PlU8GXa#r#7+4FY7m05#Vlb>gWmkKh6ij0XP#!u`%%_Uc_;vBOW zr<upaf!^Rh4Wt4IY^q}Zk{TE-L=q2O?3>77>I<g7DDgx@c>sMko(mBgk%v!I1Wc59 zBHSLBD)V|YupDwnRQTVG!K<PK>an?r%Mzur!RSB)Yvr0`p|(j96=9_`#Qv7!ut7jk zI+fwTcO2Ef^Ytf?L4*>&9rHV&|GY3ZTCrfTJ1Ahm4ig8w!Nr;AN%Rc$)OnV%W&E<J zW$rz?J=T4;SM9Bi*5Fp>t0DVb`$7+e9ST1bu`lwF=a45%gsD9zb%{|iZk=0l>l4k1 zmPD)D=C&t>B)Sqq-I38z@oslaCdt)IBGWV_x)O*G>dbYPI%|oo#9kLt=c)@WiL8vO zc9+C7k!H4tzfH3^s>yvfc|db_)C2A{WSs^rTC2X*aL9DXe8_Uh+G=aH9|}3-Iu!b9 zL~G=(sQvB?)w#g7XpgeS00$h<&Ah$VSwk7G<)Y-Jv(!bmQO@A!7Bp=QmKTm6GGu&y z>X7l{VEL`Ew<B9wg1a|5H@<o6*5<^##Y4tpjqz7DaD}J~m2w@fX$4)t&Fr8H@ctfn zOAeI4A}Ri?q9uLR5}1F1b*XBJ@QbDfo*CpX5g<p4CCVx#<(XuE38VSyGq~bFDS>1F z{6n3KQ%aQC6tNPZWvC^v0)L-^!EZ~({9(zb*OUzE1#RUuCF#9NKI>hg3F}qzMW95k z!`TBU$@1fN8r~v=+yUHRSsY>w5jOnO0M;k}pk&M+mVA0m31S_9w$fh$StRCC+W92V z&eet3&Q*Bl5@g^IgFwj`e+dMO+)vk(e5#g^;ZU+u#C8JDtn`;C*(wpabCbWF&)`i{ z0ZQW(XoUd`;C)lSUoz$oOFq4(1ThFeTX{_hVh||#%wM96G8GJpyD?C4`)$b>Ki0o3 z`Sh9+#2^4|C6<73OT9Xb;i?!t>F*2H@)tPq94x8j&KuYiflk&<fj1|C%RJvX{5)7` zTowa!2`~c+qgNb2!z?Jw{=gf+V7c-h*t+F`1vhtHyz&vBh}r9%@Gg=(K?c|n1ZHx@ zuS32eUmGHI#X(b9aTr*BWo?i0bIr~&*f;NgV?bbM1xK>W%W|^IE5?q#Eh%x(pn*wC zGFBXVLzq#Xojtp3Y<BtPl*FW4GsY|$n3Qs8#fmpT<Yb2oZ}$>fU|bwSruY&<>{iiY zBzg_Z?&z&YEXR$T>{0qnp2+v@Ex~>4dX3v*&{#B)PQpfq^|2g>?ST*`s1uh!I;^A{ z4%_u`wg)mc{um(%wtnCcUfBv40~<fm;0*^c_@;?I#5$OGttqzPVD4c4`0@GlgK?`y znWsLUKJn3^(q_2>W~m@2x|xn$&87`lJ-_C${w!VoA}P76nkFa8ry||*dFt*9rjWZt z!RtoJXBh;>6yA+R_-|lESs3y8Ji!oX;Wn-y2$cEluJsnfcDvR@j5@t0)NFHD!*K%; z?on1&h$A(M{1ghn(W)Ex9JsRxWr=$oQ&UncLtv3Ue=6&-@e6LD&GLg>=#{nS-h5N0 zwi&Mo`{cjJ#V);T+mEp13Fg^o){on$`7$JQIAXdwf?Wp8QpiX$&v!$p&q)UHLkH`v z-grKY@?nwRI{9x0t%t?CBRuh;-n79(JsRr>qM4E4nPDF>otP5Rrib?R;mZ~PUs%rv za}Elll^7pRQ3`;+{5GsQcdFqV+=X~S*@x(`V}yV{14A?AwF_~n%8s?v!5B*51|5uS zlx;eGxvB4=XfAs?JvVQEsPS(bZfPE$`}2uOuT(bfNgtKJyN~UIjdi!=j=Jz((QbKN z#+b!>MrA!9>^T<~Hz;w;1idiz#ih*~lKS0}^T=}%5kK^cPwtyF&ZM2P>&~imDJgZi z4{wg>x;s2CdCct5&IyCZ%*A*vjy}SEfmqxLJGg`X0b7w~k`RCJ2P+EzMT~X=ged9{ zsM9!*%bhtncO?%_g&6d%aXEKFD8zM)yE8c@bx88yJ95U|m68Harrd=(a>vzSd^z-K zBZ>6|!G?d>jsve>(`)D~rkN$c7JXzcq}7n2uvH#b7T_!&9>||Q@J>7J!2<`6d<pCK zPW)OaYJUBd<-1PpJoqiZ##!$wh`y7^T;Je?zR^aFVDiB7%y{R9kgyH*_zmnCdrM-p z(-Xq_dX1(?Q7ZK&^eq){jx<^mAT5S3j5rR%3(IL`jt{r&V-$2=hK*MzFcpe3KSp3r zNMiDY<oe_d$s#1nlwFe%&|{#tsp}FUM2w9~y)H=!Z)Z@`yxXCwm5S8x_``!{W;V^c z@Xe?P#@*03B)d3mc2;rGgOAXX=@mFlHSNnUzWRKult0d!KG^GfzWKm@SIDKX@a*)& zjI_8x_fBhiI(gF6+L|k{0-c9<-4XGEa1@Yplfm$k)7ico2KJAS3%!^Wa?$fW`8xFn z!`I32-;avxKY;Z~8VFl@B3<!)f;^FfTys()EBllM6%VTri&M(Rjt3cl@l$4ImCUvB zG8JV_ReSP9`C=#TwpD^*+(V|=7<KcdqOqV6EXJXxXVrI%fXX|aF>qfoJ`{JBDX(0B z%^1CQobhDQhg0z1<c}6D{;P6Ud~9b-4E$e1@vS?mOZttCsJk#Pc4&m*1Rc~uH8nN! z=hxK8zqYi<zpCf3{woEZJ9gWmV^bzio&;x$ZaX%mc(Q!*SnA-x$qy`CG`ZdyTrl+X ziTqLWdX_=cY5_pUx)%9LO-(JFQ=w%Y72zCQd^bN`5L4yAzQevIt3;f<QTowJ`5&F% zhkl*>L+sbq?{Cyp+6NRHN!bk*?qYjY#yFLG$zUOHtcv^sqagcVRMTS+aJ-PFj3)fu zKJE{=8TSVa6XMhB(r;OIdxNhrVbonWek{u$XD+|^J4{^k2i)Q-KlR2eZ)m)|Pt1v6 z=XY<u^$*9ZzsJ9If5;||#<A66A@pVgOw}*&-N=DLz{mxLAF%ch-sVE!RW)7;`7IOC zSR_8kbkPX=IUTUQ0R}BP!8X?_R5M+*-Z<A<ZFT_X&MVy?CL&PX;O$6|RYzBcW3TR1 z%6pJm^nZl+AcNve!+r29hM|>kD7GS%zhmLTbKCCEyMOyFJGO5ZPMkZ}b&$St6>Nl@ z%Z*+okEgp<p~b7=FS5<bI;FH%x&PHVrQNWAgu}UX53Iqy7v5m7stp$;fv<U67{-Rd zTQqTAd<L!={wGg<(n6Yv2I0n8cngC<8Y~)yg;3oISY`F0O-b9qvSC0JR`3NTh;St- zOdMUmtk?!aUoU*#{{DOV;P>B)gMRr1-w$!}>M!tK5E#e89J<G7mtfnifhW%eiF-`a za~7>V2woBeueRb~qR33_=!KINZsUeo+`F7$Ijju1Z62Fblj87bzy-6ow3t*+n&%{Q zcCLBkdwJFluAuX~&b5!W)2*#tTiGc(Xz6a)^eZ1*w(|#=Q|B-))Ve@37~rwVmj;_L zZSbxN-WCKW)(9JK^AeGVq@HC56%R`X`4xu4G{_VLllMfh={3P-PS6=`iO1X85HCd^ z692!-z68FCBKf~(-psp?d3Uatmy;x5NJt1F2jPK;+;|`YBA49vDRKr>JeK9Bcp{4e z$|~!cfB{7bqO4#xigNGjiU*6XZgA0E6&1+K|64Whg#hmF^ZQSjdc#alcXf4jb$3lw zbtS&DP-G(>d|P!uqzvT+=@s^WSABCyG+-6#mlBnB(yh{c;y!7I*de{*e#K)a)gjz{ zc%l)5SkNs2zbuL_Q`a`nlP5N>C&!(r=h5gI<wWx{@;I<kt1Fx|D*7yHn&0xO@d;xX zx-75gfG-|Zp>UF;!!=&3MJR@}BuAdl(7s)2lA*Spqc&+nyLH!exTd`?sHLT5auQ=+ zPzxEu#{A4uEkD@d8jMC4zj=$N8K{4obvfJIpVi*d@Q|8{pHd$wjLa7KL6K<H^4t4! zLhaHE^2_|Cp)ToVdEN7`4-NMZO&O9tJa>5BRR4s;NhuT3r)E#hO-x7#X61zP^16h& z=JogW4qcblH*bV*l>g?Gp`oE^L(+$4+?G4lGQm65H{Cxr1)F-NPs_c_@|0zr^+ii6 z8MV<!2j>g6z|Ul7j3BL(VTz8~LTS(hpHEz4Of==lBRk)7^UHs7X#<PzzG?fPoX%)d zKdg+UN$Y=}*f6JY-~e)Yd8%dNyK|&@RTc2c=(V8Jqvd7r(TL3H7;PGV{z-D*=s&Pw zUc((N>&XLV@Zk66fc9^T-ReInfDlH&0?{*)34iNki^xh){H~mI|M&UHKe)b6|4*SE zw>-va?LE^{3wg2uy3#05#I9sD50M(e1`$H^Q4FKD8k@z@onU<4Pg5bD5a|;-!=4Uz z_8l>2(tth-qyO$OzyF9i69-<u_z%4{j$QrEw%?9;>W=H58U5P>+kSi76LP0(drcTT zaKeP7Yp)%T-zj77UjF@#Jxy~Sx_9}1cD`{2;}5*=@ohnm?&E?NX@dGA0{n;{5hUaV zr$e5OC_i@dbgK~x=UA_$!3Ni;1Ln>&Y1U)?NYr^R#rtVK$3FT>^qFs>&q(9Gk;YwU zqSX+WrfdZrts*DlV@r6|Y7#G4&q?^8D9keaq#-DZcs_LTAene%!{ie|jPxJ^<oJKF z+OU#-&z?OizjNfs_tFh#q(QB9xs*FXCm9u0HH#Nigdj3Xh*?Crlj4(RTlij%+)Jqr zB{0$}$-Wd<VCC7fhMhk|>&`^Ce~$n{6rV<@iy&nZ#Lh@hE#&sNNr~^FAI)WV*qtGV z!=CMO*c9<o(CD-L<gsavHL}I7x(t4gaL@FL838HDG1IEfFd;||QIlv`L|%@hzGsXu z23@SAM>M5xRXvj~EdBwe4&Mggb9RmDv}!(QvX<rSpmlMUYrUO)HLHeCylMC=bVXb% z@b|E5JO0SmOcyyN=_NU|SY;z=RNLfFR|iGQqW470rFS|-r%74Sm!*d=(4<KZN4Fz* z*VIl3RlO-XM%whJo<rY~lM#XN{pK&<8rl;Ssf`X%pT!(LO_WE{JuW-G1W4Y*u)+9o zN?@H8BJb1mM2o{?3)6RC_T<KzhWP&rETAh97lMe755V~TOza=Oh)q>;^jW{VR+=(? z;-vA?<n$a*y0_%^{NZyl3+^A@Z*ppMh|%7>VE&vr^X1je-s`(s?dOAm{x=UETu>PG zfYT~kzCtty(zoWpGBru$q+61WIew!nJ=x{|rM*2X!5~sSSqbf7E`0JJi#I|J*V+f# z2WS9l11TQ2fz4;TK>FyGsR$E>UTGrZp_ogU9Q6k(ax(vPb75q6_0b=r^)0V9eY<1A zYH#0OV^;R<J$AYL(wyC8w=Uj&ZP9geqI(g~X>0WQf9`ruvflFj+@;ZPkIugfp`St5 zyy!ypQFR~W%iu_YRk6$J1(SS1oHyC6D*RLxurX;PV4JRgzS9svhsP-h<s^$5fR{@E zp<Xi8JgX_ul4r@a=GnShRNc&rS|0iei_}w1x%h}Yz4;Nt@6SIW?`|Hg?u-7^yrg+h z^xR7ZMXn=Eo&Y9wz=UnVjdHVcQJgm$W=ra9nqFW5!@>;Hi@2%X6KYCyYcpIg)qOv| zYRvlu$|9-d6ZD*ZN-x;36u{2GVX&wOS7UHcXoQ#-jK?jUh+uXw?#2c)bKS(jl!@q( zd}7LKf(TUm<!oOcJ+<!alK_dO<<=9SJs&B(KEJrZFrLn;UQ)vbU|t+ut!&5o>>AOt zuD!@aINCbV650(7wnGw;fVagI&DVm~_PMZcQmk`=bJON1`S3S`&mawPyePa#YZDk| z6{<zvE~Or7Z(aV<SAh%zf=tO+l*IW0&rCk7%cQAy_zaT!^fy!PzNtr~hs!e|C`-1S zc2#fRJ8k8V-jzLM?PvLS6G~*8ba3jB$l!tf+69^?REA-lbZWx$&riO!$Dlsf+U>HG zKs$*)BP}re6WRn=!Gnu8MzpM)G>26QWhQ$xt1DTNUz5yrLP_r7luSaC5J8kZ#8s%l zVO%fL@ISw#M1naRK!pU!<xrACDF%~!o-5Ndk2s&Kadb68tk$q1`a=8H*)Pt05LZ0t zJ%KtyB-CB$u2#SjvBKQl(cM`QtVpOx?4Hy;xqC`Q$Vpxe>8*B9WOtq!w>$4r5s%ST zQbk61+YR{_k4eW?P3~Dfe6D2wvGlj2)^0ia_XmgHa_jShNB*Jz=O4=5{w(kBTvc2? z_twCWXry{TpZn&ox!2dVA~SPmO3F4+WC3FHJ3$+=;Y=1~J*>h>JwsBlL%a-!GJGVJ z<cL#jNU?h@j>H89?*a={L15c>Rj~jkM}|x7+J%CYw$=dcEcZO|)49L=<)@$CF_d0x zlr{{x?Y1E|-*%h&-KTr^o;<mC@23|B{@HM3`TY4ym(HKRocc^Dxc#j9CBE4A-k~YN z`UX065^N;BcxZtQm+VRN1swwG68MWR3~6^c76uVKmBX&QrBA`)Zs#$-cbX<r1VJzz zmcX7M{+o{IDZ2ZePgdTOGMhIpzxTbmm*2a0dGkgobNOQFE|}kyNp~%l1ZI|*LnYJi z-}~o3-`f)X>6Yjxl2{}Kw&3xi=>5@#Ezu^>5;|=}j9mgPp<7gmgOQ$HtGa06RAD;W zMSK{}IoR%arekB5L;3AJ2dmzzFl-F}H6hvmZeja%-Lcv-iu{DME}FHSaHN)Mjx?*o zQ(V!V?9z^7Fk>@u3~ww?Nx(w*?}sK8%8&j3h*px_I5>@FLd0Q%sytQR?va6>f!@K9 zQJzuW(UF;+nci8E>c|?;8t>Ddr@aqHYCJXGH#~2614Z2mt9o{eRNd6=hN^Mh##G(Y zZAH~1-5##m(rr^!UAOI3><GbxGpTV?!ETan2O0z;!nU!kp*oZVPN+^u`_t+tVSH%e zm`N+N=2N<(MDwVHpN)Ouqw5DATr63nZWnhuf47D#*;|(Hi2l@P!e^`h^!H0H6!ME? zwO$u<ppg5ega!^CI2ewS=UOe?r;VRB{=n9lPX)9AVo=MoYM!z$HnV>%QWXv*>C<{& zUI#~763^=$o7)*SC%xNlU55_W1XI&8HB9dHiG3(j%L^LATF=Y@#-727*vww<!fmGZ zB;a5%NGlx7?e)j{<Q{DhDHkQy3e4t9(z{|d-&gdu_V-^O>XqIn?>7I?(2(?7a;J!C z{)wRp=@W7TC86@X>q7nVZV8RbonoC3nvrXv`G&58()CpO>^A4W&D0IULj4OCE;E_> zga;QcSZXpgS6tf*-e?(9cl3XB#+u%2X*&JYfsf5L^h!zo<L0~`$*WUS|G2rswV~!O z2K{-71T)iXu6bs{<2Ss!oJ>#i^M5xA<Nq4iEru~;qi9Y8Bkg0+oCJq*LP)38X$a`F zE^Q6w+!W9$z`>kc2<w!Aao{-5!Sv6R#IvAO^k3Q!^nDVO7EE=aU)42Is2i)hGbn@^ zhk2s7irB_uN{<<luALFm>5T~s-y8WuiyqR618Ge$eB9~A<>SkXM;7$Hp;yo7I|%8t z_m1BUEAKWS|7~eJOvK1tq)n7)8BwB5YXnx(3T)Y|<l0cg6UHAPztY`UKO=ZL)|FxS za}|@RvfNF2Hae>LZDo!$o?=AN*XJ<4KCclJH^QpC00C+6z}!JY;3`xQnr0frF_Xs> z_{@cW8rC#FBCVwN2DJQD9bv4)Y<*^=Jv`-T!Vcd<m^L8X5l1_M-x~}-;4lhz%4~g9 zw_z(0H>#mUoC?J+rEwl^g64P#B$~2-8}%7(T*X4as;+J^lePu=2Do6Ea<aY3J%1h3 zT(>a#{@QG5@@K}n$A8&v7*x8lx_K30XoLlCDaQItu`tpX8V7Q(jm<3JLzJGzajO%O zQcQMJFhLF^rr7PK>_ofQYDzVWm!!uO&r9CN0!jFI5ZLHaHl{!4`ZUFyMM`0gg@!LZ z_)?&MEI>zTot9(NWb2wDpsMTMO{~Ar=dHTVz0^y(3|_jar5%T~A2B{TT?$2auFCuJ z%^s_Ib-X2S_#L4I|B=#*+n?Us^Ir9vXeedgnyqJ>M}Kh8=jZ>(1J7Rk;5{F&oK7L$ zS|<3p0@lFk9m8eq$%??0+6lqnbW4Ja7s}ed(8*hwD)L>Gyo^HIVuXiP!P%4O>V$v% zgo2PzrH=wRG_+h{Vc`8=pI&KyFlEQsnU7jkvy<!(Ch4{b7UN~M3Hmc7v(+F0wh4o- zt3c>pW4Hd%9ef+y-EF{-SPHeOKWdGGXTxAvkyZzF>1!B9ZHDuD<Z+lD6@0)7<Fgn; z3MDLE@FzD$cgt&{nNq%7e13*9^x})kzVqE_efW%cP?@UaATNg~*<q1wN<H>qF@cRd z5tmc8s}^B3EwUTLBKkl;qZj!Z@N^JM7W6q#O<#!WKl1A6$5<wL4F{tqv3T+-Isf_O zlmAF_c1!bO7gXv#l)9$1R68~)Xj`gkmh2{J5jw~ss|lr6;+q>5g_oB~%hP<B7pd9u zCh1>MFN*y*nl7D*`cd#nB`3OOcl04DG=4#&$+P%8J&I%BnlMkwjJUA^-fA@>;0XfQ z!T&_DYbP)2ib6P6;4>e8)TAW>o$5LACOiKULHR|36ec%*(s$si?MX;0OZEWz6S5SD zTbf|n-^Nmao)l5*!X7{+O99YnVoTJ#PyH(tl3_#$%LsZy7ROtzy*3JL<u<+LHAy~; zqS*t&>hvi2NgdMYD+<(h6t$F9D;#Z>zV2aAD~#Agx|ZHOeQ^5dbc%zLN%1U{bOfWP z8I=B)Va(M18}O}f!xZ>4{2h_@)2572Cbw$hRyqpo(caN^(%+=rwnC-u?_YfRg;IA( zBPUC%5UF#rbPp`7c^*Zc4n|nZ7sJb?C?jkLXm*qM(5xMF9k*}nxY?V#+5A_-#_aIB ziQaXcjUtfI$s!ysQzwU|L(i0o&Qzz1kjK<dnelkFOv*^z#}4=L4}rD{O1hT}#^30Y zS@^3iG55|uEpL}%^PSd-4SoG+r-$yw+LaV#JoCwpPlzzHG@fP8J427SXWsG_vHbUc z>2uSGyLAr_DdWBmZoH}CewZ2eJby>b3q+sZENq?2+<5DdA#t~ln}*(cWAvT!xL*j# zX(4S_V1ocEd0)ra;NK}IaC5;s5K*wRqxK-TUb!yH7OzNc{*}}RFQqn%pJS<Iam+AG zS%tA)1($c&4e|>q5Ya4#HFkp{+>!;>M{X1G`oZG|wdnB=C>O9haXWS=(4mqZed+Xx z@lhlH7=}s7WV(rX!69i(bQAUCJt$??rBW=AMkvLIuvHeT$!&z^F-AR<f&kXq$+MT0 zf@qp3g`qU$ixU&1^ZWxtfz#1V(ijX1r=rhFqliwZi@cgkNq(K{fodQ)HmYHy&KjeD zj<cK-M^;A?Up?_Q#d%T%-X{DI*@HrByD`=iVmkdW)&rL>r6H(r90!sYABmwDV`_0l z@}iJ-x(I@rvJ{NC1q@})&)Y4FRcVQNvBDM+q`{&bDdIDQw~loy70W1jpHv)upU!9k zsRE_d(f5>L(f3w<14<gBnTE4QvO6>3YfcZ?ptpX{K`<*!Cm^9Pod7iuSi>O0#uUN9 zB@_I`pa3ytV-jSBPT$B|guwU|+6aymf*`o)9r_U6c3N@u_3#XfNjguVhA1YP^h4Ah zwW}*H9=g~7BmC?OA7418<U@+F)h=7jjMQb7_#f;lMm9KbXj4C9tENi*36|UMLyAe! z$t|a4iX&}6q&hFGU{RG4R4QAnlQ$q%WXwDLi!Uze_b4=k2|FXa_POEt&qHwQ0fqXB zZrEw=0A@7>Vof9gUU6_5aHWbAS%DtQZwRGJUR#!-hgC`xl9T|OJp}WlZw{~#Pl&X0 z6{h&Sp=7_3;E@ZhsdkSITU#g)OP*!Er3uUP#WL$sV<9*KUt(~Q)<d5gu>OOzbXbz| zqsx{DG-<<>Ot&B?%_-H@(xiFUZ4QE_9G?G_w(&`p>JB}1C?zE|^~h6)3a5ALGQI53 zx<jFqQ0k%ehdNH}UOxT#+g4PMylusD$&NdnrgiT=z2p1q52c2ZQ}F-NnO(Y1DLC}h z2l)T1)gwn%SC71XIrsu2xxAXkRP4ush_e{RF^IoPA-on*r~wSt%<8Qpc6_LA9ipkP zVPuwT<GHBlFR@%y8jmS(EGsN2+N4(>d-w6sd)a_Xt%WUA)Sj4w(%xwcBJBbe+2h<S ze_~ZPD&jexb%$m*CR!9kX0b`tE_`je&hH)q*O*Gsn4;z%)YZS(I|a9(eTn-iYjB!C zoDjCMCpSk5k&)E$77$OupKi6iGeWL3tl%}Yby&XSviuP(I{LlSzg&(+pNvk6KDm86 zc`nn8g}j&HWiaNF|1x`6b6xz1C7bRwD=yn+ivka8w`GSzR)yJWa7fkg(bTSkdr}}) z2`K7$K|)o4B#2kQ7q0-K1I8;5;0grrg)Cly;EJGL0eB%@;c$(81sj0$SvXxI#soWE zlQ*fFcZJ(ENKzcL;qr>^k#r3<Tz2!9PNNluTpsxgpTp-i8E%E{aj5%NmyN$hl06sj z)hAjQWoh13)Yh;oZrs(@z$<3t^$C9ChF;Oiv(bB`WoM=R@Vmr*1F{kO4?YN9!0rTK z%+~z|D0&5HN_oQpY>fsZCW?(^lm}pj)<$0QRtRn6HP(2#y#84l@{eN^F#qB)gZK__ zE4}$`9`{;Dq^<vbL;{Dg!nSopish;gNb$^D2P6~iAY&WKdbS`-BeHDjkH~q~7TXY^ zppy-*ZrKrRBa`}c`==6~&gyM^y0iVM@<PwLqO1)Aiu+#MDLon6$k28&*P6Sfn{&EZ z`kMWv$>tnO{s8Ud7Z{WDFyXwjOnlx;lOD7UwZ}Q=hl(y2mTgsZmu)Z8W=?b2eF#@W z8#Q0sZD%YEw6Dzd0|s2b`@~;f-~HiVe?Ab~Xa+ZU;~D9G+K0v++m&W_Y?qo}*@i~$ z8sB?nYkW7FU%odwn$zO@)NGCKT=VO5XH#s3yyq(WTT{&b_UidIrck<-?N#p>F4^o} zVa;p2^hB=XG3=Vy7^bw0r`%f3fVn=o?1@Q#0xh(VH(vI{5PK59lWvziF~*);Z5yn_ zY=f_UV*0O7jIk$suCgaqV)n#WKQaB+Cq{aL{s-$<nf!9_Eohhc?Em7;PGJP7=iU#C zjzzHOFp4e_o1&6Y2R3RkwuZUE2y}S>nkyX$X*-b|jQjWh2cIVz8tTZZ<J2kSyhTkm zj5L<P62CFx3%WIf&taB?Aw^A0@Zr0O>f0lwh!hwOsZvVB<v0*_V=obNa77{<o5HN& zhA`$&&7|Pg$8{_k=)(ra@5_SXgjpDevEYjN01ZL#B?<1Q2D_cUYT8|P&F;2)>|VRi z?so-TL05t+(UoLL#Rw!(q#WH9H`$e}CA*V7$=+mNvOgRM2g3>B#BfqlYOdeL%aWLy zAtYt8?IGE(L3h?oDrO@^SuRzK1&LYhR!_P;t8ZSnK(;F@m#(i>hh)o2xT?bZz+=g& z9b8(Z3|9%D(gAfCtY2u%z3vr~v++G(AZ26bF0r^jB7)TLFS%so;v^%NE8_vt*NX%4 zoz1^7`p^Lpe@P7)ZZP(SreI3Mt{_yK)3nkIrI>CxNHe6$OGU9!jUEEm$>lj=3HlaC z>jpAxRD=H`SKN=2+D(356p<I?m%@mXYQEiD%v32YW<B)whirG;eDfW)hm5rwHq;t> z_wLuP_rp&i9<{Vkt&ksN%b)hU<bR{`cT??YDt?@!9&y-k#NfTW;`DK2q2!64g#i!P zUYu57PHRfWOg|{DeFL+f1WX`9Xn%xlawQn=@sx{u>|~e8JJ`_A<;;`7HA=uYah-YE zhJ!b8E9)Q3q-6uUln$VC{R?;A`2wA4lx~nmg8u&(Kye8H$>jGSi7;!9V0Sr(QFtvv zGgx3cL>~u9XMG$CIC6dF3SMb<gP1dVfdx8qVP%^mk0>u)Qe8N)vs83*dU=ly`BhU3 zM&IUetkYZ_bCYhu<Q@7M^kl>p1t*!X!v_496>-3<VEG}#%N-wTDDc(ElLu*S5mN;n zWRoh20QT!~7%|*n$dNLodp`R4IXVBU=y$bx5GmMgNz%~hESO4BJ;M=))n;-EEbgp| z)s2eo$3*H<P1B3n?2(krtrmRJfi*?#Dmvv1%q<<2H*ZOoYx^eUbaH7MY_^d@OE`wt zWs=Dt-ch6jCVZT4l}wn`Ufz&bN+yd`3|luzy1#`5Qwz2qk?uNu8pz{&?iP$Rv`3Ny z5qOG#zSRz|d>i6?87QbDR%+Q$!D3~GppFy<oc5ToIfdP%N&$<w7dy^i!n?ntuEyZc z5FBHYjUALW7IzACz?k-w!mONDmCyq>V5#;{bRJnpJ@$~4iFNCk*Y`!g!-D-2**<me z0pRvA7O`Q-1e;hM$+tmGZG~N68_b{@X3U<WC9%bhj$=g_8Iu@-c+;2{!5~e?3!Fw9 zS6qe^AxB8nX%31=khDOVuim2=DDLza{LNQpBaG|{Wrc%0>lt$s<6YVyO<p<cyXd-Q zv%bNs+cs?dmWvJY%AxC@qgepQM&(hn3pj$bVP@=eO&T<gyTHB=L-i-(b1{y+FGgau zF^Avj*80vNeg{vK-u%w(t?vxMl?-pYXQi*;2S7ZY60yVf4YoEAibfgSjjBU*z}{SY zr%=LI0549s-<>|Ku4}f+=Pn9@)Kk)7`#S(_Z^wY~cqE)Ey`EwaZ#mYeZzb7{NlwI< zv*i0aB63?G*>Nw_bI6#i6Z9~in92R65>vUzFp+*k`j~V>fm9$D7z&hvl!8z}YC(9g zG*}*N7_1CV85|m%IygL98ZD1Dj8;acj1G-X9Ua~%ZIm|}HYyuaHikB)ZVbOEy(zzG zfa@+Cx!z2DGpt8$B^yosi&LhQepzsPdLZ9$=FEc};{KfUxO9s&;I7G&CQV+%A?~Nu z)<U!QX7pn8)vE*D%QNsrnIpidIp8p-$Q3_EhPTVf&B@Nn&dtrq$jk_*h11j0!uaN3 z2$$r#a#KQbYKhC0o1L4}E}OnYm@`uiu1v$`WD6psC1*aD=gMhk@YvI^_eDZ(c1Bo9 zHQIZ6j6D-LAQVNO#<E-=w$VNmA&Ok&*bFZ|A&!5Az(#^?I**e+pwNOV9+y3j$AUbO z7aNo!U9bU7LHp8hmyGW12e+REz1A!v;&Gd21!e_xZ#KBjsny166ZV$~R0pdQsuQb| z$UU|7)1FRbFKn!#R)iY0Gb<N!)ST>`^k8;SHLNS0-g!aw-E$W#bv(CVYHPfhe97E# zP}bh)>TIcak2GeMbXR8dfc#Z*@~TCTZT;is{E^aQ4@6rYi${_9O0qbdA1_=v_TBk& zSC090-HSrHmsWiZc}Afp;2__u4fy4~5;$hH9i|b#jU+g0g`-wAtdaaKyHR-ZEr=x* zkfE!+2qicXUe_nHm2g~EBFHMsdy1~2ugNisxN<ccxkdyrB}a+SR252va-pG6xk2K% z8_FhWlf22WN!czTu7P2@;v;=6i#Of^Ou=TaG0v5{k!~v58WfuYVoO-SL+V{@KGW1J z?~dL+<Bkbz!N>7+z>~4~Ivi4tgY2v`zl-=f&;5FQop1E`I&EUuaC{vO(DnZrU&pkU zLUsLGfE`fcBYal*SpFIGz<T%v@%*Kk8q~ft>0+xp`R8viG76EW?o>X8{4R*3Sn(N; zwiSZUyUjwM^{|zSK{CtG{gF4;!J?QkF<oGfArrZkAl{y&?u-tS>b4?$)u63X9RsOO zDaQYA*eY#jz>lRmV7ElxU~sCR;d@2tP8r+qioH@AKE50930A>OC^ceN*W1jijQ1JD zD%wd8d%ckl*bn49!n@%VdW+qr5?F@AfO*ZKQ(yl5U~{#hOty61)Tw#I(<osEmq5Gd z-5&8k?9v{3G)lTWHZ{R1UX#-55L0KjlmRJ?n46vriTZYW5BMd0H$8l!1wYcH0L5O! zCOq^%d;-wz0~_f>B%7y$lqIe9YWn9qb_7B^uer^mrLu0F`&Lx_&yZW6>;KHo>n9j` zZGB3zmfVnARFz+_J2`pftUik{&`4s0yv9H~faStp%$Am!Lh~@c*Xnpp%BVAjQ}zH+ zuapS`o79Lmb3=Sbya(E84;Xx5OCCIz@I|K0c6dL)jtVYg2ec0eYeJm2#KX5oxURIC zzP8;GkA0m9b@_&o6W?jP@v&Y#S5%IkJZ)~jA>&32x}o!u-aVeY^@W#5C}TV`Z(O-D z7^uz4j#NatJy=kjpP!WcyxTK-%5`Hf6pHcK{dOzrLc8I)5#i}~ktDZG(_Ai_)9FSa z7Kfmn@q7WlNLKM>F<fU#^z22`Cu1TUhK4FxO5GXUfX&lhLv2IOb=n4tE5R$-q2@PQ z#eGWBs)YMItNhTCh48)jIP6-!&@klj)=8)-rV;=6;_Ut+41A=-Acncrax|Zy@7=mp zIpnpW*g#wa&jQ$KV(wThUE(Zb*|*<%etz)5e?%8WJA7t%{<B|xc>nW%eD*$euvr=1 zBb%Ck`Q5Y6ZjC+#ZA0Hy-ZOChzeN2LQ1=}1QY0<KhT!i>w#3AgHk^o2%Z0!J*wWGV znv_-N$qEq-+KDv4bkR;qt;^VeFZyBO0Tt2`*ClU|lQL5i{3+0wI?WIGvsY!_7h08; zN(`HtOY;cKB=&z1#qMul&e#W3q6EzVm=N$%VIIDUjW3ZS`@gdD6_lAH&2PS4s;DaN zS6Q|CmSLOwZQRlKjtehdMx?D<*Gu-2K{-X;^9$>fld5O+Svn;8_+`Wbw?K2x++qc{ zbP?rZUnH&ER#w)vtF5%O9D62OZ9-VHJ9cUxOt$%CXJ)z`_IKf(N@jXOG7-*~-+qsj zC43UO&}Y6<)@eiOI`r?<NETKTSzU87?3QxcMmNLRIn{#Q81IvE9_XC<fIB}Us7e*g zK-_h}C;Q*g`wBr~8DgdVMKH^&JbM;93sG;<#ZNrJrMc>5Jk^Gw48{NFe&+>=jX65I zN%w#I?ZxcdCpNV9!>RMo4{sYhxMcD5J=P6HKg=gu8+z$HD3wO{7&8C2j(K5@(SflV zx*zpC&tltSgr=FVMe3x_Vkv^Au{TEXe)<#fHvubByt4;G`Q<t$YfQ)VD7@LR#{k}m z&7<*#{?1f*awC2jp2X+TpTy?TguzJ0Am#xtDTpLO^9b@kU%>O|xcB!Oaf~sz`W<td zcLrSc&gb+FWDmuC-HP#<_8siM8<P@)lpV>iNMQtk4J2-M9M;wa-c_Ho$tiZ&$vDhb zV<e-ew}N(`gsmL5A4hD6)<CeI&=k6Ea67C)Fm-^WNcTf#;EGfRzZw!Yx*LJLC$C@s zUjoBQiSN&y`~HOv|0OsqMuh**{dWI<^xrKXfi`AHs7_*Tq#_~3FFG398-L0*huuH9 zI(4iyB&O8*vBOrntEhc$h9NsWFU@T(a#`#h!g(H}JuNRgpqUbco%U)k+Fx{$<Gu2i zbMzY?Z+MabTb>_i5TYIIh=6+MD$K^msx*<4Sz1gkpIu6E(S;|mu}wYGP3gMZAue>! zL)AR`&}{fEKh^)EVdEqmyN9hDC{2)zvk#5F@wGducjU{-L!(}q9@Pwwo+#S3{Ek<K z&?a8$k8eA}DWNpi+vg;i_H`OGc*&h_Ygt*2u>0-Biw6%TPB{RHTA`kct<o?j{WsQU zS2%RhY7LW)%RI7FIAp;ii@nSS@%vq05wac&8_WaZ&?J`CP*<wGA`VhRkqW9n6i7yV zNP?SLG2F~f?^n-7f2JA17U)Mtsy{>f|8~UY^9D82Mk3lwy@XK&)7_K^HsQ(g;p177 z!)i`WT9FDxB%H@F3!wEhnuC>*K%7i9*uI(-5R6Y2E0MC$HDVgbk#P;A&1KVUZkxyE zwfJn<Pub3zM^~~d#T9a;y26&sxDN7i?PGEvIhf4a$8d5uB^(N;hQmpj9gNO^6Q7xG zm)dF~bw}u!GO`4^NL_&>%Uuno{FJoZ)$+7kv-{;#_;a-E9QseY-fB2gR+1`<jH*wa zdUs+%j?-0HX2kW%0BBW5@yO#X0C_^u$p0@bU_c8P&;kau0K~8K{yY1lr>Oy;4~XfS zkt^*0i|9`(!tArAnfJAXyUZnWUa887cv;J+Py>e*YT^O~2AVLdC)M*rsq<%~dZvOl zZ>F|p-4U16KVqTS?J>=fUJ@K<S{do8k`i5#OQwCsP?8*m?Ip^RvAS37w_|Ptg_1#< z$fbP-b&~nnXTe<1vVym6KzR;vGqkL*I=D*9y1$4Oy1%YN4RP(-=uo+arUG+;rN9A; z^egnK{xJgvjPXCDz4X{)FRACcRaSOec|Uf6gFaQr4|1!u-zENyj&p@R^;dfic|7U* zRCGTcsL+G4guy{tX<Xr(yns=D>?VE<cqVg-O91JhIiqlzRzw7Ix-_@P>+=VK35iL` z_(~p5OV7y6%7&sLuYHGW@;eq3b}A}{1AJ-Mvhs?`ZdKhQJ$hc->$=|8_vzcO|A2vm z2H$YwO*ap@W$3NLhL5;y<n5zIj~Oe*-7$W`#7UE<Or17;#>`o>=ggfqf5Dv#?^?8Y z$<k%Zt5>YN`<{DO-FN>35B_HLZ`b_KLl3Wg<k80-f8xn?Pp$vmhNqv|xM}mV&u#hr z^Dk`u!;61>sit<@_Lu8+?0n_bU9Y{qyME6bd*6I(-=E&zf8d>lKR3Sn-of`jICS`k zIC|{(iNE~y!;k*<@ySm<{p@qZcB(>!%S9SySxI8KXu+1aFjvKR-&49-8Vh^%<<cW^ zgZzo%4~DnW+NBkym8ZRwo{?e9NX_Vw(I;a<_PZBkjLQN!Y?9#74h3(a)I+*S8ijY4 z;oW!S5BXg$-Yw&I<qQ|UI|lDc_@;Fl<M)p^Kg7AIWfb7GEt6XiDqe_-=Pp8X`1uo` zuljuGXH)6Ur*l3XEyUlxRo~>s>xx@HP(pep&NHN6{y)C(#ttb>;)pp?&)AKZ#B<_a zu}Zulp1?ls_rZE(wRl?mL2N;z{|44J_lQTuzY&9Ejd)T#0MEit#CNc4cu{<h(td>X zUX5rJ4WbtFl{>`4V!U`yOb~w-?}|g>pm<+=Aifq8#Zhq>d)#jmlf<`TtvG=>$8j-P zG>LDpZ}e0FOKmYjOcyi7CNWFQ5wpcyF;6TI^TnNFq4=k`ODq<P#1cf*Sc>>In?*HR zXN6cP&WL{@5>B&-#%j_6YpcJAUr^`M;tND)`5beykHtyxnfOqA3h$a7v2?GBU1C43 zcZyfU0sP)A{v_^?J^Q0r7rWXj*5m3afe+?5Fsq{j%m3f&SK<)?r)fSO6OSwJqn0@2 zM*TEA4@uTRylvbmR;z2pCa5uc8qZ@TKTo`E*ebT;+yY6Lhvy#|tYU`YCNT@YM`W_u zSu4ij{0ir@I3L7066Z5Gt7HF%8?KmYC>CGhTuFJvPh|_#*+Sfp?=DtjqSyni!9?R0 z{4Uf_<68W`PVAA-)7i4dSd9BfXF4bL(0wE7p?;$O8uRe%ZSknO0C`p89`ZCF6Wxp* zM2`Ai%QuLxFp}y*IOBIUa5$uZ1~^Bl6U8ufw|Gg}%fBPl8Df|L@p*A?q*^CllK0Zt zvIo9zd~F^oUZneKwf-KZGyDhdzm0kx!^*c#Y*I@_*fd`BQS(F?*NMtj$_r{N>;Xr= zOarPnPO3N6IbJ8ipK&6*t~eP-;72&d&lr9ufMXQbm94lDer->}tIdhJW9JW1hxVz( zxeV7%H6-PzL9r5EYA<1+Opcv72vt7=&kqpZ=2~d2-xvAD7nx^T+Y@;ts;5P*GD1|S zd%-UQ#1m>x%O}byQLNk}p24}mm?KKf;~1|&)c(YKl&3mW48Z$FzJ3&Z)d4)z0lNnZ z<}1NGLi9qLTZW2>=6zxq@PTP7Sqh0`IQM`jkKtq<GyEWoM0aX?d>@*OI`uOQ5YOP; zhaJm1;6$B7G4V0ZNAdonwpHMJY7c6Q*e_kj`0osU^Kb?Tht`vLEp}2nAkX`8Zozo~ zCoD9jh4?*<UpV99%b1Xc;`e?vvt^6?bIZrXv&1*VpTr}?AD}@xw;S;-)!{4f1Nf6@ zW88_U;!3du=M0=9%zec8*g2W{3-Kc1+nO(Ui+LvgOS~HEzv|kSkAMsC<hCW8>j<~l z$+*Wy*A{Fp22x*jNLa!{qO*1ub60FUj3$B6H#CmejR9JH7qqBu;lZ~#pB_sNtF}au z1dUJ%EbmkC-6IV;kqpd*vqUy@Bsn4%HWBS%0d|eZ7ad`(S13Bcvbk7v7A07VmWr;T z3?pBKs1)5qmFO-aqKD`yu0_nV>kwP)dc^(ei*;^)L{b?j28qGq2E^gIN!%=kh+D)^ zaVug~4HqNCZO~}nE=GybVvN9mj`3hT#)65E`ja8!r$Wk4hn$}Y89y6Ro@6|t(6Nla z3-Wz2B>Ymy_~nrAB;D`E$V21OeUQx$V4V03#--n46#5^?-G?!XJc4lvk{6@alaSd@ zL0bO~di19;Hf_W>vKb@Ob7Bjm_4DEdu@&Rli{g*4q^QA2wM}dnFY|anBLIyCuZh>i zZcz^@|AyEr-V|@a>h4b%>-J-Ocn71~pE1V0i;+zq(GKxwMq}6sj5mM9=<-o)r1=En z%x4&PPKm$s81$w12gcN|F@`l^wE70))me;y-w7H|zsKnLgE)sVi$<&q7^i6@Yk^{3 zf;}cIAz^clZ9cK<hy~%BY?9qFZ{qyPi)K%rFw;4E!rUpd#zVC}f5O}e<CW_c%$=p) z(WP@q8Nn`v3_CF_Vpz<u3&T=|G+Pkh4*hQs+T$3O9VanI`P5)DbTL$8rqW>e)bN91 zR|Y9dl>ex=sE?~(8oL`87*CrjvAe@>OxsL{P2Zabn=e>4L-Ew#`jB;>^<TE@Z7Xbl zuzhX6&OX-um7~gWzhl3%y>p|h$Th*W8F5BGcUQZ=@|1f<dKP$|^t|qQAK@?7c>m_h z^v(7i@CW=${crle4rB%H3p^JL21f)p2LF{%nXo*ued2?ON0LS)M^e&L{vPTZdNK4? zYDVh#)H&g);f3LQ!)wFOg#Q?REqow+H2hikoA57b#x!qQT3SBlY1gL>NgJCsGi^!Q z18I+^J)5>IZBJTb+F#O6r+t^6ntprwpELX!TQmNaY0kVat7F!_?DXvZ*{icZXxAsl zm@_ly_c_ONrQF}-{w=Rd-jcj$@;+=|+5X)Q{tmORDY@ov`CaqJ<}b_tpkvRDZ*=^k zAY3rA;J5gDs^Iy89fiKaXA561Jlx69sY|C@I?eC2wbR8SOHrVxtf;Z*n_{i_&f=q; z1D*3b59qwSq<u+gNw1O{OGcGUE4iy=RmmeI8%tg)dA;PFl4B*Gm;9@X6%nW2?Q*`f zPwBMM9i`uP&FOk;*ZaC2FUv10FT1{MNZHu3d&|}GhVtX(rz!?lJX5i=;$M}im3LO2 z>^8F7_f;=e?W)>eb)@RksxwtTcUQZ6x`(@0cYmULO{8;VNTj-lACABaderpzuBVr! zkMJj9DR8%4AZiVE84;z?V}NBX(*VoyeO-g^`f$KXzF*I<2`~%N2?4_)p9qE+rZOyT z8H+nzTlN8#wJZRne6mDkOC{j&mR*1&8BXRjue9{Som~uf^Zj~GxgU}v3;mMdF;01$ z;R%LKoaPMDXQPxF!19)d0V^5SGi(BE2iyw)yWngGDbOEq7sJzh=NG^nq#;;|TIYy* zhWlGi;`#u?CfvyruIMg64W;J^Hz<%NLdZW)q%zEE@#DHz%L9OYfKQ&diQz3R%Wyrc zWj)|XPC1TKPT`bO8BSw3o#70IGa1h29Of{b%WxjUMGO}+T*7cE!(|MYb6M34S1?@3 za1-abnbXuT4z&zl<~zGUfjqIBG29;|{0}f};53a4&){i$Q3{&02d$0))-!AZ><G#X z0&Iu2?kI{Fc16mLpa#L47!G4N5;W<E?*Wu@62r-Se>TH84CgYO$8ZtD#SE7)T*`16 z!{rRC8LnWslHuBxM&!SlueWh2+d+qp;$^<Gn{n8WT6YAG5j@OkjxapR@EE5&&hP}o zGyK*Ce%cIJfST?CECsC!!1Hun7X1fcIeI|>dd)t-k>~{ls3|?2%y2EkZ49?Fd?o6~ z(_PU#z}=j_p5HypPmeG>%J3M&;|xzQY~qw>@K%v<p)HD-pRq9sUuS_1Md%|0E0Dej zZAWk%->G3(%dnpBH}G{M!zSD*2IoHjsDT2-;C#ByLT@bww>JU~<@+N+!(!w~_owjv zsSKwvoX&6t!<h^>F|6VAwG3b39Cl%bQj9U0a@!vr3wVHG1E*<Z_yw1EhSQwKb!V<` z2}`6BmPjSw(k+<tkTfU({por)Ly`<7f+RzUID<P~L>Gpq8U6xTiu#@e)X>LEQQt;D z>glE2(@RnJvA8ZpJC%xF&>NMC-qG&>`!KwT;Vms;+!@N(!}xjx!;vix+#km|OyPH@ zGMvV6I>Q+ZXEL0{Im~7_hv8g?^B68-xR~J*hD#YPW4N44tY)}^;Yx;^AUR9XFQ^tZ z3~L#_%y2hjxSvZuz_5YuH!}Q!b3Vgq&hzy}hEc$-pv*qNaSUr1)-r5h*a%n#+Wriv zL86v{wsai=&0$~4Fbh0fhCX!?uoq}v2I)a?0N=TZuZMvr%TNlXoW%F1@cpR_r!kz) za0bJf3}-W(!*DLcc?=gZT+DC@!=((DF<j1NRWn?{a3#aFT<#`LvzcKH<5SCU8$aF7 z@MV6wACxb{XwnO?fzvcHJj`j1Fgyxaj{Z9wPy;o}(SPYW1iF=jJ_NJ)elOrq4$2U` ziQz5$?l^urh3`ydIE~?ShBFw>WH_7Q9ENil&SSWU;bMkM7%pYFjNvARn;F({S+xvb z<~t31-3V9#{D%X!!~F`DkQKnT5!d7S4oSiaF`MtqVK|rJJccA2D+I~L3PG~50<-gW zfFz|WAf@RJ$-@dk@~}c&VAu>;3GS)^q@G&|?xO1uMx{znk6;!!zml=4WUMN|W4&;v z55t=n4g+Uag1aasVOz;^yAm>uQch(!jp1~LGZ@ZfIGf=dhI1LtW4MUnVuni?E@ilk z;c_mqn&AqDD;W}xRbp=&Dt9x(8pf)YA<?H2^w|RVGC$o9$y^C(Np)}FG>r_2VwFs> zN~TyPQ>;=D#k#Rn?*$3D4{N~P49@`e1s^^PNHV`K_>it&!3wZ1=1yy{GNjfV1l}V^ z?TB>+Lu$uCg4%JASj2EK!zB!tGF--RGsdPtz`PMFOBZmy1?_bbkVb)9P|8rOG^sBP z=Uy-Z*UPZ-bOVmW^;keRYCVo+{y3KT<9HT24(sA}xKFdtaXbqh$FtCJJPRF%5dp2s zv(Ry<^)6h~EOeZpS?D;Pg^mLq=swLt$AS0e0@5sW9M3|>37UnD6Eq7QhjE0`&@6O3 z&ojsKJaatHGsp8hb3E3E?eLW5nUjF|F+iGaP6GaPO{4Q99-Sxg=sbx>=Sko|x=*9? zBtfI|B;d0PkVfZ8f=1^_D18@J+$41;v(%l8^mI*9cQR5EB&j=v+jk1L?-XFW4{LO4 z@u_@gD&LvLcc$^3X?$lo-<i&Lrt_T{d}jvVnZb8v@|~G{XC~iyn0aO`*K{q{bS>9( zE$}>v)qEMl3Shn#HKjY_7}hYXWmwO!fng)VCcqkQ>l$wB8gA<vZtEIu>l$wB8gA<v zZfo>@v`!7Tbq(;`g==c-8gA<vZtEIgPWP#;Yq+gzxUFlrt!ucgYq+gzxUFkY$6e4Y z(AuY#F{x!tY8jJS#-x@psbx%R8IxMZq?R$MWlU-rlUl~4mNBViOlldETE?W7F{x!t zY8jJS#-x@psbx&IF`c(DowqTaw=qX;V~*O!9JP%(Y8!LZHs+{p%u(BzqqZ?eZDWqw z#vHX%WMN$1iMWni03j~{$MKzq(NA}Z8osV&SkF%z__~o{6YjhU9Q=Tk!>bta=uRcp zT(1HLy8kdzz6wm}n${q%LL);@X|3@pFd^84JG;53@8+If&$7LqWqUo#_Ij4>^(@=# zQDP->p%JH^WqUo#_Ij4>^^jD(aGzv*J#e6uB-`s*w%4<4uV>j_FG#l63zF^if@FKW zAlY6IDMyfGd%YmpUJofpkYszkAlY6oNVeAtlI`_^WP80J*<LS5w$}@i?e&NRO^{@J zJ<IlbmhJVR24O|Ay`IOudY0|=EZgfb6Mg{qNw(L6N|c6Vdp(ba^(@=#S+>`+Y_Dh8 zz8|ZSvEU?HkL(8@<^fhl*8|owYyv#MX%29j1Dxgnr#ZlB4hTxqz}()z+}^<4-oV`6 zz}()z+}^<4-oV`6z}()z+}^<4-oV`6z}()z+}^<4-oV`60F36M6q2zG%<T=#?G4QB z4b1Hg%<YYgNh4#@$e1)TCYYf^+BY&Ljf_bnW75c&G%_ZQj7cM7(#V)JGA50TNh4#@ z$e1)TCXI|qBV*FYm^3mbjf}}*?stc|-yP<DcbNO#VeWT_x!)b;es`Gr-C^!`hq>P! z=6-jW``uygcZa#(9pOBWaGpmv&m)}Y5zg}n=Xr$lJi>V%;XIFUo<}&(Bb?_E&hrT8 zd6e@!%6T5;JdbjoM>)@<oaa%_^C;(el=D2wc^>6Fk8++zInSe<Cv-oMqQ{V)AdNW3 zke(ooILDB3A2g<v<~XN0&S{Qwn&X`2IHx(mX-;sO6P)G*r#ZoCPH>u2+?P-B`uY^w zcNa9S#LuVDzGDGteSHcoy8w`8m8a0Y1ZfU=iu=(io<p7zub>B=!uq-fkk;3yz~S^R z&5llS4?4v?=oH$W?$G-B6xy92t*=j^-4|dir`6(VL94~nf>w)P@_6?(Q}}C8avHS2 zq(S;xkOt{%)*yWix=n*bquFT_ORy%EU`;H+nplE0ff|)~N)oJzYu&^WtcfL96HBlr zmS9bw7^Nf$*2J}LVhPs760C_OSQAUICYE4LEWw&sf;F)OYhnr3#1gEDC0G+nuqKvZ zO)SBhSb{aN1Z!dm*2EI5i6vMQORy%EU`;H+n$UuT6-lrrrhF4iuqKvZO)SBhSb{a7 zeJKq|uqLK|6Vtzm>EFZ>tcfMq8J7QNSpJ_wA3q5#I_aIxfx-ky@AM0|$S>R?zi^9O zKwA_*&rTY@3p^9Mz%#K6JQKUXGqGk))68j_IZZRCY34M|oQA&52z;X%gzqxf;bW(a zcOtkJFp_-%|0BzKVVV&Q31M4>0KSuLL+MW218+;p<MJMS-BHx*m4iY=d+NXP&5|rn zG|RHhjJ=T*SyomEu}u?cx|Ja^={aToJbd3tyCB0+$0w~f&5&R<&{_gY>M24y<VIzT z5Se$t4@L}~Fn8?DV`t9mIUeb7z|NqhOG`_%OHtRJg@q;{&j+jwB+cT0br(!M%trD_ z!Y>??493<&QOstuieOn3S<D0!O-3^=`F|#>$z+0ql^Fq#5P!?47-@Sa143@$TE+j& zblX5L&>P5r4kV;>Z3~ILZ^U-0h>L4Ap-8jQ1nUzcwsAxFbQMuGC^I9rnl+iMRux4U z3@~3c$woynnGk{0=s*#AzDR<Dc7Tf=Kml990dvB@Y*rKn1)21_C`G~J*a5Owokq|D zXqc?LiyS3K5%GiRVT9GciBMvCSj=W%j2jjkpb8QKX{s<@1HE8Ui-UHfGvO^2cg<8f zs;K8lRYE$XY(40GkO?)l0udXLgL0-KQK%JUq2f>*?44*a+iVC`Yyx6<D@G4sjBR<D zN}v-Tm(c^*fu>v@(*p&WO-vv>!OLyvVbe?kYys|oHys+vf|ezoh#gEzBb?fR2mt<T zvRSNVD;`_S4nWWYcrb}nD$AsBeQ0k!6H&&jAR+!?BV9d9ZhazptOWef`ydl`+O>fP z;DpJgA>bSFl-Z8pZx#?0^`We-4u=sL0}~KTMpf`Giq$wf$`_Tz`(V%bVFD@4CNKrH zBe9^0g5Z;fxN`VI4Vdnf8vJ2*>-4ai5&H!6Kno#3>!GU1-egAsAc55iERYTqLFQJA z69DwEq7um2q7uE#3MICHy)B3Zhw>FljD&D4;R6XN9TQr=!}J76EbxW~4>)Wn(h6cw z1wbVyTvDiT;ABU2Y%ZtKj&?w?W;5(IQ7ZV|>;}oX?G;oO@3*0c8Aw~r3N;9-K@~(n zRv<=Yn5c`!DF=Euyk-G1pw$s&8a!(w-ihIfAEu?*fdXtm#Rlq|9Vm~&;aROt+=e_r zYZ1#>(5+BQ#Yu${J%BziP%VTW-i^@%I9*8(ypMLGmUn;$oTw1m4}Ak9fVglWIv^E} z>Nt=yJS|KPMhsm^rw5qCf=HDpfan~fM{92cixNFlpaGnT1&t^O-lTLFe|R~b7W8oX zbb8pWP6yG$j-F3E5j%`V(9-M#1%Q$r^dP#~t#&-N*<1jihn?s_G+_Qwh)T3cD)A3U zqr$ZnFT=f+2!Vqh6W;WzA0#6|606hcG@0NmPX{57H_QlkXoahi1w~r0*)%q<c54t8 zXec{MmBCwh7gh412%R2y83neHfflfa%|i4**~EfIm&=9TKzBiRBZ(vZ06kpruZ27V z3%DE*P-X{`Uq%nm(&9n^z>xB?S)F!=jd;XvcRLUjQ8ht~a8algYN=>cNiZVl0iLj_ zlo+WUL_-|ELJxYMnht1!2Q-xEfQzshMS>o7H>5cjlz7wydN@2DGa3SoY_i%7__f)< z@7Tx}OpE_<<AWq^`n(m5Xt$`;iZ<{ds;+68-3q4TKfD|l51<DEJi|Z-bg*eoogR>3 zs6g!C>@6A!Ae5LMn!|~Z2Otmv9)KQ3rUx;QiTaaG(dbn$q7CSS9!49eX1C%cCI|5q zrDMLPOB`SVyg)qxQqkdd5<P5oiw#ABDG`;)1d@_i(NL(<>oubYAZ8|dfT198jkX{& zEztv9b`?FWc8ihu+Q#&7yWI{T1_FUZCJYy`1N3kw5IxKmr`?V1#_>y|H1dlbCKIx^ zx)H`6g*ctS!sbSKh^UGGc>&EvY?_YV0Cq9iA$)AA8%W!U9x&5Jkwzru)Vf?CzOvg% zNKrCoZR&}rJ$i!MjXvQ)i73Kh0Uv^d4g|SEhvg=4+Z_(4&uc-(s5cmh26wy*dL%f& zfz%g>9yr>_KpV4$5fwnwP?t1$JRT<yV|t)Pc?6)Y40?EyY)lWA!=sUm$Nrfn6E%>2 zU^h*d%L)`7=+-U`<gs~NE{6*Q(VRZi6l0hR^+6XxG$eF3yU_#8u<e)yDTpsjNQ~4j z7cm(TfB@kQ^l?xz77I?h%?UIu7MBktq6i1E6bRxZdSG(_7t(tiPN&Q7vw$&y7)m92 z;9U?UiI^658DTIQP3~fc9qi?>nrMRphl9GL+3UsL>~xp@kV8Br=;2Ma36h7J!|O&K zRt-aS8+w?{$lK;cmC&sr*^#SP)126r7&-fK8v_;uhQn!dI?P0Shso~*)}V)z`V%a> zkr=7rf2UIz9Lqdw;%<SY;6L<gunl^G7k$Ey5;b&6s}oHCq3v_nEL1q?;YFcZz;E?Z z%{7bNX}}PM_d$<jG?Jb#UIsmBau+-7Xhf&Y#Qoe!UDE9H`7|JgyZAGcbkYyd!xyqM zJ={)gng@Egk(~NS>@b_b#CB>jbQ8@DED&SL?Q#==5Gcjz0zKSlM6{065~l~=1uHro z9_nT$ryFlO-EK|K5($}S+Z00YgCtI%X|=ioDADb9!g~=U06qLpyT$Erl34LMfk!Z4 z^?@(VZnS~{zu;d;oe*%*^To>`NgH}NOcde8gbILFsY_b?em~IzcU^WTDB6Y|{#3** zH(AjO{2mNlHV;i}P=VNCHiL=nXfmRQ+XHrS_&pw%2MprYf@lZ~3?7>eP3dx4&?+V; z_TB;37!F)cFUaIFBQa8AQ;jR=0rYWDIjFP?Y~uo&Hk&7i5>bT9h9bceS^$#R<8*nD z-tW>hPh!yKccK;^FpvUP2mhi<sbE^V%Ls!c5bp8AVFvHm&Bz07NL|tr2n5_f40rK| zI9BnL;EzC>LtwlEJpx|P)P4m$EEeGAK$B^}5F?%0?F@Lln%9k--3e$2ogOaDp}DNY zi!L*$1Qcn!@}WgEv*y9uE{_)(&;gd`K5Qng2K(b+dVt}8Cg_piWqN3Kjp^YIx*S$2 z9P|jd+-`4Df-S)G00YtFPp3y3F)hgk5)Q}!;yivh(TJME>~Vo)n#TiXfZ3P_h~X~& zE~iH@-AVL-R0#S&Q$*dzpifBZhsA>I9cVH)#D>=k^0<OtpWBBWHN2ig)D+VM^kxz% z*vW+Hkw9;vV``8uE}{p}Luwx~paTiH54S0V-iN?-15L<?L?4RuYHo)cByc!937W&| zb!lGEFNo^+k`wJg7i72>45Z)}{TWg?-J^jINid?<;e9hpYX&Zh+v#?gk);cGKtx#+ z5)!-`-Nm0~<>>^c1b-xC5<P5?3JHGD!{MW8FLhx3uv(G5lbXz@X+9sYa3%PB9;Syk z$qRZ|Y(CTnIcruogpX!UbZbD-X>)4<w20f{26`U6dnG-nmupCh#29Ib9zfG>_a&i3 zpU>@axV?}&PEVrdwD~l*59t%!Uav1D3E_TFb011oFvUTC29sohY5zBRI1!)+Oz!si zz&44Ai9R5Pq1}Uh>?}Y)KR}PfEEf#kY!1IWF#sNO_(8tQ=z&h{N<@wPZnxhLdT5D$ zzsK)I&fXM|3H0zgs3|>g3Pay?Tar9(py;xDAYaf=EJ%#h*pXbPFj$^tngz^-gZc*E zcVhtZ08NL(pNtayem8LSLGC!cNp6>o3I{zBK@Wc@*^vllwEFFuhbF_|UyMpwUIa)X zSxLeY^u!PzKQu74$7Mm5U@sC;wxpyaKM=!R{6U1rQ-U5z*%}!DLMkK$!DG$<O?wGR z{jgfmsa<F?MA-2717H_-QXt?B_&^|E2rZ9EO#n>ob$Q_;hyLWYBzrwT5#uuCi`(V3 zA~8}UG^d^;q!7zA3-xjjk|HtY;2?<?XgVB$6qFc%kaD75qL28Jv8_+Q?FoQ>Ngkgs zkecF1a$`&jfPoau%$OeTY+_oH4TLaA(uN*xbT_ZdiY!4+5>aqJPew2Sx{E)X6%C>v zpht3!PLH5BIf3XABzh2%`eC!7Q)_54ALtPXqE+0<!Jsb)1_}66(GZ|V5KIkjMYuAO zFP0Q~6M_oz1ucSNgLvB$#I}%ppp9bmh!x?*FoYBI0Gdu`FoexigAh`*i!A8jPw{H@ zpvN0T^Cx@#{$N_FGnr~0ba;H24BOD3(SkW(TAdzv86?5rA3s13&8JzBr3ZeL5K;D& zl#~Dv!(E>SdH@0a06kK2-2(F=NXe80(9{*gLi8$nq=4c<FY*HQJt@Hie*zdJ7zm@~ zF^vR0NW>y|8>SClE4T(Ix*a}Gk_U3bip^pJes3@V8PI_?Vwq-Tv5BNeO!R<+0-B&l zY65B$^!i<B0`!qU$g4T1a5R4knl~Xm>`XyFwFS|kR80B&eyjvMxnNp7Uq~UmPmAT) z;Q>>}=z*PUi5{U)C<w&R2mNlJ-PV>KAPHiB2=W7C?>hWXw0tMTXjkQrB21nYLhOG1 ZpvJ#@o~VO<IAj}YngRVS`B3ul{{W@ppD6$U literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_1_sel.png b/game/data/gfx/border_1_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..99ced49ab8ad309a82057719a9135b4fd7e8df7e GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Svs2G(juA330qWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FM zhJw4NZ$Nk>pEyuanx~6nh{WZoXAJoq3>aD;?tjF^m!MY2pc1y)A|hW|*6Jd&z}(pp zvWu3Lt#JHvS$dz%!l_@Dm#(?(XDzlQwdM=|jHh*tHa+{YSF9Flcx)udv33c&#aiYL n4W<L<FAKz9VtK&G<W<ek*&xZXU8HUz&_)JNS3j3^P6<r_&SguJ literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_3_sel.png b/game/data/gfx/border_3_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..6872c673de9d862059813e92ad48447483d8dde9 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Su>Ytw`kKlcKKBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8 zG8EiBeFMT9`NV;W0z6$DLnJOIznL%lYd$0Ii<6PYF*~c~Km0JUo5zQTh2bUFmnUlq zwHrL+c2>#j9cx<0tXBEsglh*=%2fk~$uXPXF)(xYH1l0sV|@Sw7#RA5WKz;^&wLFu Oo59o7&t;ucLK6Uq^GE~$ literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_7_sel.png b/game/data/gfx/border_7_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..a92fc2194f7ed252a37fead220f03ff226b922ce GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wkP>{XE)7O>#Cbu+`wfbbij;}x=$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj z3<Y;j-+=H&K5?KTD^C~45RU7~DG4BOV|OtVvsOY&cihe@c~_>$FCQj$7jTN11ZMjO pcCZMyI0?IYEa+V1v4C-o5CfB{Sg(}GI#Zx244$rjF6*2UngH%WHTD1i literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_9_sel.png b/game/data/gfx/border_9_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c46af2864ab728971d972dcfb315d2e898e16f GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Svs2I)q=!djq^WQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FM zhJw4NZ$Nk>pEyuaj;D)bh{WaOJG+Yy)wAgwxVg8X5d;d8;_cd)WOH42D5c5eoojRN zk25;3Vb2_v!>g~$OB^}EBDt^j_rU`xZ#7Rb9OeOn_WqcZ1R&T^^wo|T1cWzTG;lT0 kHV{$JKD3fSRv?6dp*2U|^{r8;70_M=Pgg&ebxsLQ0I2v(x&QzG literal 0 HcmV?d00001 diff --git a/game/engine/ButtonList.lua b/game/engine/ButtonList.lua new file mode 100644 index 0000000000..2e2bfcdfff --- /dev/null +++ b/game/engine/ButtonList.lua @@ -0,0 +1,133 @@ +require "engine.class" +require "engine.Tiles" +require "engine.Mouse" +require "engine.KeyCommand" + +--- Handles dialog windows +module(..., package.seeall, class.make) + +tiles = engine.Tiles.new(16, 16) + +--- Create a buttons list +function _M:init(list, x, y, w, h, font, separator) + self.separator = separator or 20 + self.w, self.h = w, h + self.display_x = x or (game.w - self.w) / 2 + self.display_y = y or (game.h - self.h) / 2 + self.font = font + self.list = list + if not font then self.font = core.display.newFont("/data/font/VeraBd.ttf", 16) end + self.surface = core.display.newSurface(w, h) + self.surface:erase() + + self.selected = 0 + self:select(1) + + for i, b in ipairs(self.list) do + assert(b.name, "no button name") + assert(b.fct, "no button function") + local bw, bh = self.font:size(b.name) + b.w, b.h = w, h / (#list + 1) + b.susel = self:makeButton(b.name, b.w, b.h, false) + b.ssel = self:makeButton(b.name, b.w, b.h, true) + b.mouse_over = function(button) + self:select(i) + + if button == "left" then + self:click(i) + end + end + end + + self.changed = true +end + +function _M:close() + if self.old_key then self.old_key:setCurrent() end + if self.old_mouse then self.old_mouse:setCurrent() end +end + +function _M:setKeyHandling() + self.old_key = engine.KeyCommand.current + self.key = engine.KeyCommand.new() + self.key:setCurrent() + self.key:addCommands + { + _UP = function() + self:select(-1, true) + end, + _DOWN = function() + self:select(1, true) + end, + _RETURN = function() + self:click() + end, + } +end + +function _M:setMouseHandling() + self.old_mouse = engine.Mouse.current + self.mouse = engine.Mouse.new() + self.mouse:setCurrent() + for i, b in ipairs(self.list) do + self.mouse:registerZone(self.display_x, self.display_y + (i - 1) * (b.h + self.separator), b.w, b.h, b.mouse_over) + end +end + +function _M:select(i, offset) + local old = self.selected + + if offset then + self.selected = self.selected + i + else + self.selected = i + end + if self.selected > #self.list then self.selected = 1 end + if self.selected < 1 then self.selected = #self.list end + if old ~= self.selected and self.list[self.selected].onSelect then self.list[self.selected].onSelect() end + self.changed = true +end + +function _M:click(i) + self.list[i or self.selected].fct() +end + +function _M:display() + if not self.changed then return self.surface end + + for i, b in ipairs(self.list) do + if i == self.selected then + self.surface:merge(b.ssel, 0, (i - 1) * (b.h + self.separator)) + else + self.surface:merge(b.susel, 0, (i - 1) * (b.h + self.separator)) + end + end + + return self.surface +end + +function _M:makeButton(name, w, h, sel) + local s = core.display.newSurface(w, h) + if sel then + s:erase(143, 155, 85) + end + s:alpha(255) + + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_7"..(sel and "_sel" or "")..".png"), 0, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_9"..(sel and "_sel" or "")..".png"), w - 8, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_1"..(sel and "_sel" or "")..".png"), 0, h - 8) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_3"..(sel and "_sel" or "")..".png"), w - 8, h - 8) + for i = 8, w - 9 do + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, h - 3) + end + for i = 8, h - 9 do + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), 0, i) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), w - 3, i) + end + + local sw, sh = self.font:size(name) + s:drawColorString(self.font, name, (w - sw) / 2, (h - sh) / 2) + + return s +end diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua index dd3d68d2b3..2168716406 100644 --- a/game/engine/Dialog.lua +++ b/game/engine/Dialog.lua @@ -75,6 +75,8 @@ function _M:keyCommands(t) end function _M:unload() - game.key = self.old_key - game.key:setCurrent() + if self.old_key then + game.key = self.old_key + game.key:setCurrent() + end end diff --git a/game/engine/Game.lua b/game/engine/Game.lua index 66d520b6ed..230a21e369 100644 --- a/game/engine/Game.lua +++ b/game/engine/Game.lua @@ -75,3 +75,10 @@ function _M:unregisterDialog(d) self.dialogs[d] = nil d:unload() end + +--- The C core gives us command line arguments +function _M:commandLineArgs(args) + for i, a in ipairs(args) do + print("Command line: ", a) + end +end diff --git a/game/engine/Module.lua b/game/engine/Module.lua new file mode 100644 index 0000000000..a7f9fb8c54 --- /dev/null +++ b/game/engine/Module.lua @@ -0,0 +1,46 @@ +require "engine.class" + +--- Handles dialog windows +module(..., package.seeall, class.make) + +--- List all available modules +-- Static +function _M:listModules() + local ms = {} + for i, short_name in ipairs(fs.list("/modules/")) do + local dir = "/modules/"..short_name + if fs.exists(dir.."/init.lua") then + local mod = self:loadDefinition(dir.."/init.lua") + -- Make a function to activate it + mod.load = function() + fs.mount(fs.getRealPath(dir), "/mod", false); + fs.mount(fs.getRealPath(dir).."/data/", "/data", false); + + return require(mod.starter) + end + table.insert(ms, mod) + end + end + + table.sort(ms, function(a, b) + if a.short_name == "tome" then return 1 + elseif b.short_name == "tome" then return nil + else return a.name < b.name + end + end) + + return ms +end + +function _M:loadDefinition(file) + local mod_def = loadfile(file) + if mod_def then + -- Call the file body inside its own private environment + local mod = {} + setfenv(mod_def, mod) + mod_def() + + if not mod.long_name or not mod.name or not mod.short_name or not mod.version or not mod.starter then return end + return mod + end +end diff --git a/game/engine/Mouse.lua b/game/engine/Mouse.lua index eb5779811f..0791456afc 100644 --- a/game/engine/Mouse.lua +++ b/game/engine/Mouse.lua @@ -14,13 +14,18 @@ end -- @param y coordinate of the click function _M:receiveMouse(button, x, y) for i, m in ipairs(self.areas) do - if x >= m.x1 and x < m.x2 and y >= m.y1 and y < m.y2 then + if (not m.mode or m.mode.button) and (x >= m.x1 and x < m.x2 and y >= m.y1 and y < m.y2) then m.fct(button, x, y) end end end function _M:receiveMouseMotion(button, x, y, xrel, yrel) + for i, m in ipairs(self.areas) do + if (not m.mode or m.mode.move) and (x >= m.x1 and x < m.x2 and y >= m.y1 and y < m.y2) then + m.fct(button, x, y, xrel, yrel) + end + end end --- Setups as the current game keyhandler @@ -30,12 +35,12 @@ function _M:setCurrent() end --- Registers a click zone that when clicked will call the object's "onClick" method -function _M:registerZoneClick(x, y, w, h, fct) - table.insert(self.areas, {x1=x,y1=y,x2=x+w,y2=y+h, fct=fct}) +function _M:registerZone(x, y, w, h, fct, mode) + table.insert(self.areas, 1, {x1=x,y1=y,x2=x+w,y2=y+h, fct=fct, mode}) end -function _M:unregisterZoneClick(fct) +function _M:unregisterZone(fct) for i, m in ipairs(self.areas) do - if m.obj == obj then self.areas[fct] = nil break end + if m.fct == fct then table.remove(self.areas, i) break end end end diff --git a/game/engine/init.lua b/game/engine/init.lua index 14e98ee4dc..d65d8ac832 100644 --- a/game/engine/init.lua +++ b/game/engine/init.lua @@ -22,6 +22,12 @@ key:addCommand(key._RETURN, {"alt"}, function() core.display.fullscreen() end) -- Load the game module game = false + +local Menu = require("special.mainmenu.class.Game") +game = Menu.new() +game:run() + +--[[ local mod_def = loadfile("/mod/init.lua") if mod_def then -- Call the file body inside its own private environment @@ -34,13 +40,14 @@ if mod_def then core.display.setWindowTitle(mod.name) local Game = require(mod.starter) --- game = Game.new() --- [[ - local save = engine.Savefile.new("player") - game = save:loadGame() - save:close() --- ]] + game = Game.new() + +-- local save = engine.Savefile.new("player") +-- game = save:loadGame() +-- save:close() + game:run() else os.exit() end +]] diff --git a/game/engine/utils.lua b/game/engine/utils.lua index fa721e5c66..58cc7ae0b0 100644 --- a/game/engine/utils.lua +++ b/game/engine/utils.lua @@ -70,7 +70,7 @@ end function string.splitLines(str, max_width, font) local lines = {} - for v in str:gmatch("([^\n]+)") do + for v in str:gmatch("([^\n]*)") do local ls = v:splitLine(max_width, font) for i, l in ipairs(ls) do lines[#lines+1] = l diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 24e7eb0598..16dac53928 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -19,7 +19,7 @@ local NPC = require "mod.class.NPC" module(..., package.seeall, class.inherit(engine.GameTurnBased)) function _M:init() - engine.GameTurnBased.init(self, engine.Key.current, 1000, 100) + engine.GameTurnBased.init(self, engine.KeyCommand.new(), 1000, 100) -- Same init as when loaded from a savefile self:loaded() @@ -60,6 +60,7 @@ function _M:loaded() Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="engine.Entity"} Map:setViewPort(0, 0, self.w, math.floor(self.h * 0.80), 16, 16) engine.GameTurnBased.loaded(self) + self.key = engine.KeyCommand.new() end function _M:save() @@ -276,7 +277,10 @@ function _M:setupCommands() end function _M:setupMouse() - self.mouse:registerZoneClick(Map.display_x, Map.display_y, Map.viewport.width, Map.viewport.height, function(button, mx, my) + -- Those 2 locals will be "absorbed" into the mosue event handler function, this is a closure + local derivx, derivy = 0, 0 + + self.mouse:registerZone(Map.display_x, Map.display_y, Map.viewport.width, Map.viewport.height, function(button, mx, my, xrel, yrel) -- Compute map coordonates if button == "right" then local tmx, tmy = math.floor(mx / self.level.map.tile_w) + self.level.map.mx, math.floor(my / self.level.map.tile_h) + self.level.map.my @@ -292,34 +296,30 @@ function _M:setupMouse() self.target.target.y = tmy self:targetMode(true, true) end + elseif button == "left" and xrel and yrel then + derivx = derivx + xrel + derivy = derivy + yrel + game.level.map.changed = true + if derivx >= game.level.map.tile_w then + game.level.map.mx = game.level.map.mx - 1 + derivx = derivx - game.level.map.tile_w + elseif derivx <= -game.level.map.tile_w then + game.level.map.mx = game.level.map.mx + 1 + derivx = derivx + game.level.map.tile_w + end + if derivy >= game.level.map.tile_h then + game.level.map.my = game.level.map.my - 1 + derivy = derivy - game.level.map.tile_h + elseif derivy <= -game.level.map.tile_h then + game.level.map.my = game.level.map.my + 1 + derivy = derivy + game.level.map.tile_h + end end end) - self.mouse:registerZoneClick(self.log.display_x, self.log.display_y, self.w, self.h, function(button) + self.mouse:registerZone(self.log.display_x, self.log.display_y, self.w, self.h, function(button) if button == "wheelup" then self.log:scrollUp(1) end if button == "wheeldown" then self.log:scrollUp(-1) end - end) - - local derivx, derivy = 0, 0 - self.mouse.receiveMouseMotion = function(self, button, x, y, xrel, yrel) - if button ~= "left" then return end - derivx = derivx + xrel - derivy = derivy + yrel - game.level.map.changed = true - if derivx >= game.level.map.tile_w then - game.level.map.mx = game.level.map.mx - 1 - derivx = derivx - game.level.map.tile_w - elseif derivx <= -game.level.map.tile_w then - game.level.map.mx = game.level.map.mx + 1 - derivx = derivx + game.level.map.tile_w - end - if derivy >= game.level.map.tile_h then - game.level.map.my = game.level.map.my - 1 - derivy = derivy - game.level.map.tile_h - elseif derivy <= -game.level.map.tile_h then - game.level.map.my = game.level.map.my + 1 - derivy = derivy + game.level.map.tile_h - end - end + end, {button=true}) end --- Ask if we realy want to close, if so, save the game first diff --git a/game/modules/tome/init.lua b/game/modules/tome/init.lua index 9e2bf1d1ca..2e4d42b549 100644 --- a/game/modules/tome/init.lua +++ b/game/modules/tome/init.lua @@ -1,14 +1,31 @@ -name = "Tales of Middle Earth: The Fourth Age" +name = "T.o.M.E" +long_name = "Tales of Middle Earth: The Fourth Age" short_name = "tome" author = { "DarkGod", "darkgod@t-o-m-e.net" } description = [[ -Morgoth is banned in the Void, Sauron has been vanquished, the One Ring destroyed. +Morgoth is banned in the Void, Sauron has been vanquished, the #ff0000#One Ring#ffffff# destroyed. The nations of Men, Dwarves, Elves and Hobbits are freed from the tyranny of the Rings. + +For over one hundred and twenty two years peace has prevailed in the West under the +rule of the High King of the Reunited Kingdom, #14fffc#Aragorn II Elessar#ffffff# and his wife #14fffc#Arwen Evenstar#ffffff#. +The High King died of old age two years ago and his son, #14fffc#Eldarion#ffffff#, is now king. + +#14fffc#Elrond and Galadriel#ffffff#, the great leaders of the Elves left Middle-earth for Valinor. +But still, many elfes dwell in Middle-earth, for some of them love this land they fought so hard for. + +In the the Lonely Mountain, the dwarves prosper along with their human allies of Dale +under the guidance of #14fffc#Thorin III Stonehelm#ffffff#, the King under the Moutain, + +In the Shire, life is... as usual, simple and full of joy and pipeweed! +If such thing as ruling exists for Hobbits, then it is #14fffc#Thain Faramir I and Mayor Tolman Gardner#ffffff# +that should handle it. + This is a golden age, or at least it should be... + Trouble is brewing in the east. Rumours in Lake-town near the Lonely Mountain have it that some power is growing in the far east, orc have started to multiply in sigthings. -However you do not think this concerns you, you set out to discover the old, explore +However you do not think this concerns you, you are set out to discover wonders, explore old places, venture into the unknown for wealth and glory. But beware, the eastern troubles could be yours all too soon... ]] diff --git a/game/special/mainmenu/class/Game.lua b/game/special/mainmenu/class/Game.lua new file mode 100644 index 0000000000..b3d85ad505 --- /dev/null +++ b/game/special/mainmenu/class/Game.lua @@ -0,0 +1,93 @@ +require "engine.class" +require "engine.Game" +require "engine.Module" +require "engine.KeyCommand" +local Savefile = require "engine.Savefile" +local Dialog = require "engine.Dialog" +local ButtonList = require "engine.ButtonList" + +module(..., package.seeall, class.inherit(engine.Game)) + +function _M:init() + engine.Game.init(self, engine.KeyCommand.new()) +end + +function _M:run() + self.mod_list = engine.Module:listModules() + + -- Setup display + self:selectStepMain() + + -- Ok everything is good to go, activate the game in the engine! + self:setCurrent() +end + +function _M:display() + self.step:display():toScreen(self.step.display_x, self.step.display_y) + + engine.Game.display(self) +end + +--- Ask if we realy want to close, if so, save the game first +function _M:onQuit() + os.exit() +end + +function _M:selectStepMain() + if self.step and self.step.close then self.step:close() end + + self.step = ButtonList.new({ + { + name = "Play a new game", + fct = function() + self:selectStepNew() + end, + }, + { + name = "Load a saved game", + fct = function() + print("load") + end, + }, + { + name = "Exit", + fct = function() + os.exit() + end, + }, + }, self.w * 0.3, self.h * 0.2, self.w * 0.4, self.h * 0.3) + self.step:setKeyHandling() + self.step:setMouseHandling() +end + +function _M:selectStepNew() + if self.step and self.step.close then self.step:close() end + + local display_module = Dialog.new("", self.w * 0.73, self.h, self.w * 0.26, 0, 255) + + for i, mod in ipairs(self.mod_list) do + mod.fct = function() + local M = mod.load() + _G.game = M.new() + _G.game:run() + end + mod.onSelect = function() + display_module.title = mod.long_name + display_module.changed = true + print("plop") + end + end + + display_module.drawDialog = function(self, s) + local lines = game.mod_list[game.step.selected].description:splitLines(self.w - 8, self.font) + for i = 1, #lines do + s:drawColorString(self.font, lines[i], 0, i * self.font:lineSkip()) + end + end + self:registerDialog(display_module) + + self.step = ButtonList.new(self.mod_list, 10, 10, self.w * 0.24, (5 + 35) * #self.mod_list, nil, 5) + self.step:setKeyHandling() + self.step:setMouseHandling() + self.step.key:addCommand("_ESCAPE", function() self:unregisterDialog(display_module) self:selectStepMain() end) +end diff --git a/src/main.c b/src/main.c index 0703c06a31..2ba6b3ae34 100644 --- a/src/main.c +++ b/src/main.c @@ -224,6 +224,29 @@ void on_redraw() } } +void pass_command_args(int argc, char *argv[]) +{ + int i; + + if (current_game != LUA_NOREF) + { + lua_rawgeti(L, LUA_REGISTRYINDEX, current_game); + lua_pushstring(L, "commandLineArgs"); + lua_gettable(L, -2); + lua_remove(L, -2); + lua_rawgeti(L, LUA_REGISTRYINDEX, current_game); + lua_newtable(L); + + for (i = 1; i <= argc; i++) + { + lua_pushnumber(L, i); + lua_pushstring(L, argv[i]); + lua_settable(L, -3); + } + docall(L, 2, 0); + } +} + /** * Program entry point. */ @@ -236,8 +259,6 @@ int main(int argc, char *argv[]) PHYSFS_init(argv[0]); PHYSFS_mount("game/thirdparty", "/", 1); PHYSFS_mount("game/", "/", 1); - PHYSFS_mount("game/modules/tome", "/mod", 1); - PHYSFS_mount("game/modules/tome/data", "/data", 1); PHYSFS_mount("/home/dg/.tengine/4.0/tome/", "/", 1); PHYSFS_setWriteDir("/home/dg/.tengine/4.0/tome/"); @@ -273,6 +294,8 @@ int main(int argc, char *argv[]) luaL_loadfile(L, "/engine/init.lua"); docall(L, 0, 0); + pass_command_args(argc, argv); + // Filter events, to catch the quit event SDL_SetEventFilter(event_filter); -- GitLab