From 0feba35db090beefadd5cbce63e23bccd464f11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Fri, 7 Jul 2017 00:55:29 +0200 Subject: [PATCH] Added jobs in dockyards (WIP) --- graphics/ui/map.svg | 645 +++++++++++++++++- out/assets/images/common/dialog.png | Bin 0 -> 66033 bytes out/assets/images/map/mission-action.png | Bin 0 -> 17153 bytes src/core/NameGenerator.ts | 2 +- src/core/Shop.spec.ts | 36 + src/core/Shop.ts | 31 + src/core/Star.spec.ts | 13 +- src/core/Star.ts | 15 + src/core/Universe.ts | 27 +- src/core/missions/MainStory.spec.ts | 4 +- src/core/missions/MainStory.ts | 30 +- src/core/missions/Mission.ts | 6 +- src/core/missions/MissionGenerator.spec.ts | 24 + src/core/missions/MissionGenerator.ts | 45 ++ ...pec.ts => MissionPartConversation.spec.ts} | 8 +- ...rtDialog.ts => MissionPartConversation.ts} | 14 +- src/ui/Preload.ts | 2 + src/ui/common/UIComponent.ts | 4 +- src/ui/common/UIDialog.ts | 5 +- src/ui/map/ActiveMissionsDisplay.ts | 9 +- src/ui/map/ConversationDisplay.ts | 4 +- src/ui/map/MapLocationMenu.ts | 2 + src/ui/map/MissionsDialog.ts | 69 ++ 23 files changed, 940 insertions(+), 55 deletions(-) create mode 100644 out/assets/images/common/dialog.png create mode 100644 out/assets/images/map/mission-action.png create mode 100644 src/core/missions/MissionGenerator.spec.ts create mode 100644 src/core/missions/MissionGenerator.ts rename src/core/missions/{MissionPartDialog.spec.ts => MissionPartConversation.spec.ts} (86%) rename src/core/missions/{MissionPartDialog.ts => MissionPartConversation.ts} (86%) create mode 100644 src/ui/map/MissionsDialog.ts diff --git a/graphics/ui/map.svg b/graphics/ui/map.svg index 3586ea9..3d45445 100644 --- a/graphics/ui/map.svg +++ b/graphics/ui/map.svg @@ -811,8 +811,8 @@ style="color-interpolation-filters:sRGB" inkscape:label="Drop Shadow" id="filter7229-3" - x="-0.2" - y="-0.2" + x="-0.25" + y="-0.25" height="1.5" width="1.5"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:snap-global="false" + inkscape:snap-object-midpoints="true" + inkscape:measure-start="551.543,453.963" + inkscape:measure-end="1261.48,449.72"> + + + + + + X + + Active jobs + Proposed jobs + + + + Escort a merchant transport to Rhinard + Reward : 500 zotys + + + + + + Deliver an item to the FTC contact in Suburbia + Reward : Legendary SubMunition Missile Mk4 + + + Cannot accept more missions + + + + + + Cancel + + + + + + + Deliver an item to the FTC contact in Suburbia + Reward : Legendary SubMunition Missile Mk4 + + + + + + Deliver an item to the FTC contact in Suburbia + Reward : Legendary SubMunition Missile Mk4 + + + + + + Deliver an item to the FTC contact in Suburbia + Reward : Legendary SubMunition Missile Mk4 + + + + Accept + + + + + + + + + + diff --git a/out/assets/images/common/dialog.png b/out/assets/images/common/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..8a662884d6d9a9dd9f5bb6a29a725b93cffa3852 GIT binary patch literal 66033 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

Lzz4 zdYIi4q?goPWsU3jou|XbhV4icKl2;NPwJbk>9H3Ty8ze>X=WX!2E5UdEZ|zuIT_gT zAYUzFZuErg#pDDC^uIM$oW1{Q+t$w9URa@nj;H5#A`nLH3wg`c0U=0qDrt9kKGxtm zV5yE&h~}=|ZCZ23N4K#T{#3|uMq7PesZ1})+))miDRO_~tWl-RiN;dm>&&?xh2CBk zx_6c3$&ie2fkNDBFeIBt_zpeC~*zy`(gy?WJH@>R; z0!r;5-FIpVd{0Qd>$$xUA32`wTei+0xHI@lc9t7oh2J3UyNUt$23!Y5g^+D9NVrw7 z_O4w@J+>vOo%GO?3qARwyzcSrJt1Dphubn!Ktg!x=FgU*KZu}vhr%x_A}uJ04_*f^ zFt#>9anGW@8?IaE8{EfYodaSI0*E~gaw7ZFXzKXy0ovbfzpI!>bY^U2=hn|(t%InP zW5x83J*47gomaHH2j+?VzMV~xvFWDv?c+i>4%1qD!W@n>SLAIuV!N(8?_1c(9QTu2 zX>(ZV;L5`4FjkzoieEh@Wy=bJ3b$yhGmKUKssy{5xmumtu`9+cNC~0Oj^QDxq2|1b zo+PIj(W(Q`zbFf~$tJ3HINj6Sr3T|_Ze~KcM1|GPfPQ?}j9^f|L)MH?cz#k#d38W# zB*3ZqxnCis=R~;{GS$@MJ)!*H1|Kgy_~6s{qk9`j2#%ih54vcyfJtAWVpjLVWvT9i zCdkUN>SlK8o$!5hWu78AJ94!!+N~>Ct%@hB_?KmYm`;_3Qllpcf_WGof-+YqJ zAPvKxT)?%V0k5y1U<>?J$6{r%6zW1AxLn2_jYeQ>C3ywy2wq0RoptjssgZodE$p|r z>LXxYi(*giD2S?*Al|Db4XW;6;eQm$4pB(QYs<8&jdvB1WPaATdE8YSnhijAnB<(1pIFq$c?GMQKyCPy~VKqylbHGUE1{FTtr;0N5 z+0~P5I4DtP;6U#g`g3*dx!^v`XVqSy8qut^dR$bDqH@!przQNzqknYXo#~AxIN$`U zqA3*ZppyJSUd-d?u!2t2&L&Zew{hinhe76wX5~FXdy(IuRmH$9m8I+0j-9>}9xXMV zMGne>)$;z#ZS?`N2e>=pZyFKJcT!{guu*Hdr)7kw8b(i8X7Wk;N@lHiK4%jfZ` zIYF;zq!p5=(!MyRcX2GCUYLeEJ`y>erNY-m*%NSDJ8O0YQk{$Xr7MhjzFY(mRf9gO z_o*3TqZ$qBU;dfM)`XHr=Ek=f?bkAUk45uI2hOyIXU#>P5iwUfZ}4q7uUCnbf-1i3 z;;Un!0$W5&In=x2UzOec8p-TQQpLUZ9D zlZ21}j(={Oq>9L=!DA2nJfkYjT4p^@GP4Saf8Ew8$B*Eg-k9H+ga?>p?15W<`Tol` zf&-`$c07>SdDUFBPAV9jnVuOuR3s}6D>x4@(hS|ZL)Ct?Dt?7=UpAEY1Wtl82H-=X z9Xdr^ovOxPGef;vp3cRCb28dU2mI}lAj?6EGdwJ#;)?75*N+^Wg>6gyJEHT{{_@<} zhByOMp*gq5hH#Yg8EDAt4@*ekXIia1CaLgk>F;PSn__oytT8iD5i8OusZ_Es8L^sF z5g|Kj_h`iGNg8(bOXIKed6}eghfga#8L8(2_X)^#%w`&c}?!T zJ3+kW#T8F$JhdZW%bkkUvfX6+-+X2?7JS%ZG{-A8)IDX;t_#pFP8PzsBe6l)^Q)Qh ze)kN=EZnt^Vw=nwus%CCV&hbblVqSpj-Z470?;ZI`e{hJ_m+jNJyE%_giZ>H#t;&2 zQ}mLj?|6aXF3|Cv27&bbT*dwu^K?66OfSm$lZz4Wb;6qc{Xjv?6Qjne%EFCI=J*>0 z2#jUr((Stztd)`sW4N#IG<`G=%;<_iOB2Wz7v)Mcl93!-oYnZRegFGhSUV#+r6 z06|3kc5_SMUKYSyW*_7fIx~{>0j~`d;6WHlE$z#nvVEWYYDHObhoKuM8oM?UKB=Z11zBmu+GJ^eXi4pYZ*}T9ESa$$?H0qbC)^{+k7;8+cLHy>Y_U z`v@5P!}-j@IkT{efllUYW3HmHv5|>`vXEYWULtO7#HYv-)YCaDs1=;iv1h40lT~BS zNylA%6K=9X#}7v^hQx{5BYA39eki8QJ=*j_seNZPOvDX0-OQE=es>oG?tL_9*F=!A zq(R^S`_V%}Z{b+7?UB&06G(tZ6wRE^a6F=|kvVtd=}<%m{YR&V9PxC7x@50g0=0hSLhQbX;iTbP)-|08 z{4D8U?-d>2sRfB(U-+2p`np_+H1H%QJltO$-1jkJ@)73N~K$XgOFTVH}Xde}H>u_xBiL0y#0m!OB{`UXE1}!3z$8udas(sb5x=Dt3 zK)#}uyLJ$9t$N3HI;m?Xo#IYj=c5ich(P#fezH=Sf{jxLZ*?N4VczFob35(*s_%2J zlmC2ORRTHt26C%lNX*hMjK?9~nW@{ZTVR%dRyv^Z-Xaj*all>fD|Ub3hHDtvT~_Rk z@g@oS%CAbM9j(x9WG_Kz6_MjpvGV*@z)Nk8O-ucAZ(iZQtJPEfrkmCj{$(jxlL*(b z+S+Sd03V5u`Fi_z>GMc_Yxw*gVaN4x&B_9n4hI|NrZYH@5GBXv*%;guE~NMN^vp14P5$3ML|-!>E~_=hvz{7P~=4bdH1JkTk@S`7#!QH?T=>nXqa7c&R

+||+qW_LEjZKKsb83W;Ey}eH zDZaMN*-thP7{Keoi{=(TDw%(=%8UeqYT|IumN9)}i^Ng6b3Lnxo61z#jiSv>U$eTG zZzJ)oba(Gc~D0CM(h6j|8sxN(I&&~XYrN@iG5@#D{a6Bh_G{SZ+@%Ma_>CJ#i zWgOJgb<1hug;)OFfD9I0^y;54BuQd1mYmgq%wTRsx?}u^8$tVL`k2d4})wGCM z!-Z@8&@d(`GdmHZj(jyoDj`Jk7or#@^w%dAhBdPhI`nR4z&K=pw)!QY-*_fm_WILD zCjlQcERbZra_d&_cO?QyBr$&P0i~-Q_=>E6#9W3bY#6QDKFtlR?kBQWI9ue5y^h%L z!?y6DaLB1eX|2a1zd0?KfxVdeQT#oykUIQ|&4a;#O+-x58mrg>m$Y8Ln4}th^T#%V z7SUIi=?on=kwnu}D&}k6(t-F5rp?GhPoMw=wl=g%N9cwjofpU5B>79Ty+fw0PpO}4 z;fytL{3%XO-B3!tfc;TH4H2H}a$>jdBKmTbfl01U3A6tqXSROK#JB+Tt|M1@&C|Gk z3pR@wy`y{MAhK!lNcdEhV5FqfiLOtC54QZ%Yt`}$tXjA#2>wGpuT=MWX&UO27*|Q& zGPLmRD~kQzehYiy5Vz4(1oG^_O<6?Bsm9^y84;#14K-fR2JMvC(u;qs7qX4Td(AU( zbcrC)L3~RlUe|(23WvTFZg#~#H+m>cx!uLbJ@mPsG^l9#ucgiaC-wprWGpM0KFHLb zEusE4a{Mni_VNdlhcpZQt#UeU;WQkQ{8_p|pa;itRk((ish?MUrWhV;aQv3r%Ei|h zq!e9qHvvy))C=JR?Z|$!B$bGep#|RCH8&k$nt7$6W>BOLCwGDWH0R8v6b*+2`o{{GDOuu^}4jerp2wgo9RFN?o^L19oH_wyP zH~3}>v}Oj*1DnBL6OVSca}$;AR!@0{a6`vH8DV{xTVYppm6!ju9%)_rOP(cv<9hEt z05drwR%Y_XKpFDX3!@lQ9i&_m(l0T#sMFBnR}}-=2)LJU?UkI zmCjnL3fibzLSot}-nOo3==zjyC&!`Gmon$$dQ41H<|1^#eQ_#BtV&w!z~j)!iJ~1u zW$&TXds90tY#Cs7I-wS)A~)pemW@jeuiFgYf>_$ED)_P}PlvvNdZ972$iUoM0M55) z`jYt*QqFc*$m**jHT!WKtDK4vGbp29wiIq?|DIBH?1p6h&BCTHOW|!H^1+4&xt+Up zJd?THd5W`pZIspS)VYbF&^Ea8q}`*%c=V+Vp1+wxrK~el*SdKGkxlMGdt=B;wlTaT zj6aCA_4Mtd%P8hxEErP*`?<`tM!L9#t=7&x@lBS%37-{`v~FaA-dJSHr0Y zm3D0K>Wl|Ffc;d?cj}y-tYa3Y_6fk1E>8@(PtmEz)H0+C13+WM&|=y+zt*d42z&qt zzZ`PyGML^dQ*vFRlSFQV`X~KgJfG@DF)#OoRyZG8z-i~B2SOVc;d5mxNzGJ#6|ol1 zbdptAzH#UAtsc!IccT->GW_~fk%SmjXUekho|$I_?M9yUzf7Qm;lgfoN%{)vT|wCe z$%xSd{4vsxvi*PP+zD#%D)JwQyMKH)yr}EDk?ng(=k>6bw7j_uysES)xg)8`XkD5= zkEgsej;ANweoP84I%lN!ylDCb={mdHs$OxfFCuO+F?lUDx!hIwLI@(b4W~));%=TE8aIk=OWYIqun1q!-6WX*UN;N%a#M7{( zCe4&*{B>l<*D*Mqa0dtUce1S)6Lp3@eGxyq@p|$CrUtv}(HJ5(Iy__mYZlF~EU1Qg zgcyz{>8A}k9UN$}84{;pzZp+fjl{yfU%Wa0eT>2Dk_Jleh8qI6DHPuXuuiqewBFfo zcxGHPYr>CMQxfIT9C^T;(;`d^z>S7)AIUf-a^KW|)not8Sq-b63R}w|gVot9vq>@B z`1`T$=)9ZGmnAmO0(r#0EqI!jfqEDS^Dx!L{_ zG_IDy8U>21x4cu8-!DugHwY7h(4)aSw(qDTZ;iTv8`j%=k4ut zYi`7vBn}xSJC&cLcWqo|03ECp{@*^vz5+9_PU)ii#8~j}YnVKGh2Btn33cU3VkNpJ zn|BjA&=0hOU(H3P4DSl}ke=ykkN_=Mnc#!fV{i*}Gp`QN@ylOA;gb&gCye1mQipQ| z2YQE}y&2_T5bOk4Y2KJxiuM3@`D?&}rv*(d25hwOZ0rB{C!HiKuTNSpg95BPNZO zqH?mzRkQD+4mrQ;bqDlb5XpyP|N57U|FbM9*VJ_iq!zIDxS?z;*OmMsln9<{s65J0 zMFe>^`%xR8PTKJ3Y*_e2R#e~IJL0w?@B-$$%U!P)V`&Knth9D-1b&VS!zU$g z-FCT|Yjdnd(@>4?GO;*Q!VtQe5|p~DE*2K z4(u>~>uXvgQBMjb%w}*@iEbwt+JO4r{?(eI!(G%&m8_Ezru>6T*HDxjWV)+3bsqY;w9Pys z*c*&~2e&8oZU=@9>t!S{$cZiFJzHZT-|h+VUBllyvynvm z1hkKzVfM|t&s=Hba|~)@0^e{&!Ep7l@sLDQ`Oa7k8PqvB%TJY)0JDS@ly+;a)gvJs zedkH`@MwnvJLzqnAwk2>4 z)AvQUr8oE(oy{!C^~30+box>bSpFdPAYe#pj?cd!Jy#2@HIHdll(}R-dyDxY;$pjy zG?OLOgpMYG#sGqEXr^alIh#kz1KUi_#@AduPf^yHLargNY~zysm10P|Z36WME)dZ5L<9kHc+qNWi#jkf!4p<*rJ=T z|4ia1C3c%-X2(E-Q1{nyhplrGSBs!nQf8JQ&+`JI8ba1t=FH=ttyNOZ(j)r{-gTb6 z>|;`%4s#3*)@txWx>zf9*7O({WkAG+51D0*n5JUJI3s4VzmqCXF=0C zw>Hg_*5?2Ih7WtMOWRFMrs%VjaB{G!NW#B`D8Fe zx`aQM4HP#n-b*6S)_=Z__9#F*nDq>f0|N)Abja8`u=WF{DK9VEEhm;ynZc9}mRslI zisbbGv*fO!MRg(@7#)gMzvTlk{yo^Im2+$-!s9_?#egHAKqK{hZjEy}3f1!Qz(!~mG%15m?@uFU}W~P#P&7^rnp8ZIC_7G!Rn7k}#32Q|Mz ziH)sHqZ#K17Z4%#K2%|En@`8E4Z2mglx4`RItLVqK`Qzmc9`A)s>~Y_#9v~Wr*1dQ zahXommBhiOdHm}&3Yq)GrK16KtbHqs9ywd(;Byktu8nv`Pp(D|iJZtsR#<=4JX<@B^ zvm7wLmvuZGR2j?c{h>RT*ry_Kul~Qld9gAN&5mXkdJ$`g`(xU)2EW4%iHJ$?9TG4C z(b5<2FmZF6rH!g-Nw7Z)P#bSZi@>lNBnzRz*Y#uPM z8@hbQa$XN;kwd+QKIl=S<8l9tu>3Sq^~c(Wr)O4-13$>*R;(6-)4}?4KZuih3yJ4q zD-sRi4SSvS;Ee9sN$U=9jvXmx^a24F@949?0wY6U^`PXVydm*GP&FuNkVqEjiIG4( zj!~Xc=!2Z-VdQxpe3i0&_H+fUCI#nSwrR?S6RGq;O=JKReCU6nVwGQb3%BF?R7SHrlXisty2)qZKj=*iSau|&yxhcE!JK51vkC}*$O~Iu_Iy3cnk}yfQ=~_XchdQ^k zEOeuk8MJx83Zlx5L)=Ol!A%O!|6%#vM&4r=J(Zcq-p0TixtOlVTEaWhXSCDrve(u^U zrlVEkFOsq8wTR`q(4nJ~2dG)3!-2W`lV-qlR&1sx?Q+ZyTagCQ_k(88TN|FyQqRT0 zjxJ{3TMUrFb-h17C$vyG*`4_XQl1%dTUdxQoFhRN)pP;Thuc?RSFK< z#Lo5N;!?x3bc3?3GJEu-dF(lkXl(JPawu1HrZU}erK;(W3Cbs)700%fIg$}}4^}B3 z`jr7N#nX7jL7L-mIhRx!H*jg2&VTA*4GnucsO~@Dpko`yFmF9H1>o;r=OZ%w`CRP) zqpTW6;L!Jzp%W<)Um-QM*xJD<%=a}Fotj)&@dqH;6IWqQeq?TvxvP9D#S%QESvdmd z1v}OYg(DkS&kMbp^%OWtyHrm%)YhRdm1~ zv(WWZJ<^j}+kQGmXlX^#=fy6s;apaBV)U>MTPf{dTpIiD!RasflWB7NHlkWNpROIaq7@#ukSBL7Ov0tM&- zHk--5WvO5=8Bx2C+aTfaCK2q9z$CH5 zF6NQ)g0jz$Gi(O0t_)0qeg>gbw#yYgA&V}~L6xN$7#+t>EPn3k2`Jmvxe&+gKthK? zpQ`GdI+(mKs4=)b&34$Pqk9&ie)AW}lGmD|I6>f5>V@NB5AVG*JZF`Ghds)^18>h4 zeLe!Z2D#%qB#tL6e?b?$9r3x*yc5DTa-8fhbrCUgmDhq`YLKba?%^Jjou02663W>| z<^7(qRTqIK8oqb#pCpZs_?lmCXYv+jjMf~+Tx`sOTf6YQ?%#pPB`$MrqB*08+FJlj z6gm#*wj}3{yxpxAkdo7sy>SBTs{;Uzl`m@zJ-BR2lLo{8(rBmd7g=zu_=K3I=nl2& zoHX=vL9M?-2DE~<)idIck-4NEvkxXIv?&mUBRu~TfZKt-EI=mlnbiQXBbm zmcGFp4fLAVw}K($4jUvmu@kiCuJn}0h6(o149&G#+zJ-C=YW@blKNKSRmL02SvPOD z#ew-mGhl1JyQ|aO{Z~Vpq|U=x=%|%OA_(kS`?J#I#bz{S>3tA8{4X)C_A+@ZPTlr3 zbTmUhpu-Mro=u42dqPeVrdaWPjV(8++Ddh3yV_hhbpA3AwIoPQl)H^%;?}X5uwQ{` zXe@w1UjnMGZ`iX5_`0aK?JujWdf^}0*t)n9eLWtba$o!@BQD$+o0(s7nD>+Y3PL{> zAzSLpJ{_O~3}duK%{G?Meg!7QobbiTl{zC+D)Gj}u!-S=dhDGww63AuYf37OrCTCz zCdEtLT&z~?x}2*&1r{xh-7yDx^GGG-QFy@&0yM&OymT?B8yKcpD-oaIPp?2D5;Wj3 zN6X@uy$dnpHMZWs#BDiH3Qh1ccWJFY2j(S-!2w#80dcp`XQwjKw@q094H4bp8W{kK z9|K?n11)}==qp|p<>XHT(VUyQDM|^~zqmf~!<=$tUGWXr3JiOQq`eD+hdN|K$O@%D zB&~>xNoj5T`?Ue06TJIv6JHyIy$8G|wch86?2Pd!=VfE|RTO?=Aiya|z`zYw$X!M1 z^fCBU)vPPV>fQ?8hPu~3{F&!tz2=Kh2Kf|h3!A8X?5H`X!+T6%2tBg*cN zVwVn&wfaj>+DcJh{*7X7rQ+(-*eiO8s!J}Hu81ldCjyOu?fA~w4+pmn(woQ?#5mmh zO9Tf-XhUTh?x&z~SB)uF?KO_^(RqdkcBWAL`})5AfcAJ+IEV7yi5?O|>PMejFI~9c zb1$jW^P)K$D3MP3?~o_f#pbyUGo@+wo5zKD<(iecZdR?#j~)HD;A486y}*Axu=f7~ z%)sE=UA&5hLOrX)rz5NsS-D7~C`gLUb=A?}V70Y_z!vC&&XU7`>FOoJCd|T0c%Huh zt8mWYI=xK`X_|Cw9KA#+h)0s8R)m-GKH*gCfv z_|~lM0%AK50ehYbKZB>7*Z~yURMG#7gQ~#fnG~2_VDxvoQp*B?ucSz?b8R!a^?@>1 z_e~rS2^~K90lCzb$`7GFSi8CbmyWfDd9kcYnQY&^p1+420<(hgCyv}{h6muCfkd!- zd|1_%J~}XFMa_s8TLV+${9PQKewwq0o9G6SQR7;Tlf_(SK#P-#MODAc6&KmpbQF3X^Owr}slq%G0ag1S{$BsG z3d}|W`1_o8z^^03bMkj?tmie2{r<5s{B?a+<*EPBH$1&!o^8Z>240Mv8;CUz^i zCM^Ew6cc<4f#UB^sF}vzH?3K%81&^mUn}q%OfGPi{7=?oZ%OZo@G5BUZR&V+Bd+r5 z#qKS8Bl#T4{|Nsw)mBCV2mdehF2g}m0D6Vb`EIrD#pVn54MuL%1JLuE)XI}VF9|iU z#j427D`UhYlU93B-e9X6*GA=c%1}3;=16spQ)AtU%_8}1SudM5n)~Hb$T}A54D#C3 zY|%dbEH&qAbwGV?O^bFxOZvG;mBL&jhyF7IYOh}h_#7#4>IWvBvdhB#tQr>L_!lq_ z1sdk@s(=z*dhAb%>Cn$zbhcH!lW%x_(rT&ms4)pm`4h;(Rqa38bAb7p z-VB|#cvnpRM%y2651n&&i;W3d3yKA&v>|}+{b<$j?zR_cEy#g~Lemq2UZF;l9UHY% zN^_oH3ane15g`_HWIag*Xf?Km%3Xt&r&B&Se$McfNz2qB09ASmh#mhwRKW&ailn%; zqS@)40IG%q`4V|>yGRxG)EF=6?3%Fxa_{u?G$3WNh3r3?wvWuR^(oHaWU3UqNPcqv z!qGjM`HCz{U7quNjiB4hJe$<4N1Lxc67js5GRi+w?ZnXj>vvP|nOyyed z+kwGFE%oZ&x%o=!7Un}ck(0CT++?K<@2>_R{&7(5KPNX7KG z`37xE{%if>;*=GC0Y`Me9i{gDwC$ICTqMr- zk5{Fo0*#6Aj&OamJQL@3+peLEiyT_W@%hha~?&zSErmedJlm_HT9vh zJ1#y1=D|H7bp*To+}ONIgvzc|*n(crjpZM}Jl;=2kOa&mnEk|42I~;}KRg9)U!2mF z<7u-Y@}LY)kHN#E23vQA+5R~xo1|VVB^mI-&B_ldb>*A2^n{?H#mwie%^>tBc4=1D zKDPea@=t=SLQ-kfi_meoSefxz*suH_<5NYOYSIGbs4^q$S1NQmUd=Z150V9Ca@23N z^KUivboN|S>_hOZ{tsF29?x|D|Bqi+S9M+0rMh%=Kv78=p=jh>sf3VCIa86aoHl1h zR|lOO!dT{%!dloIa+o=kuAE006JxosVa^&EwSH`zkl6sW%hjCpO44met5jL z_Qb9qeiABZEe^Kl=&iM4B{_2`L@ZSb(PwgTDgFUx@?9n6-y)^(iS>Aui0>Sn45wtM zwhEPx3&7v86sA=f>%VCMjw~1@>}vgk5`$TwA)Yw=n)raTTzpaKHBBS35#vq>$M{Vr+VU9^T>)JUD?{)=2LZ|j>=K_=CH;B9Xha%^nR`Y#0bkcEh0wVr_s>% zrrZqy*?|4gJGg2zWWo#<_GI6H#X^z=Eusww#!npWVS*l9mfiY!|2#HbUhZ!qAp1~C znHp(d7sif>n)mP>nwDeZ+$5VDO~y;{s!)gsUi}+~p^kFkXxQ>+jSKXyzJ}nh!8=lD zV>9cMS-_(j;QtNOBO@~s~1D3{ZQO&)WFrMAHE@Xuu|fh@Wc$@;cN!9T%H&nHpEzgr4}cFZ8eNef0~5 zWj~yhcfWj#P@1|d)=l{k-n??>vgyMoLa;ro5)5Tu*THsQ0JdKh*1^WZ1qrR=4FP%? zNyIWeXzA4$Y-kwuMSNlYq{0jngbiPPs^4o%v)o$3t~`P2t<$TuKpEZ%vcGBrD3Nv3 zb8&D(hVgwaRV@;IVf!ARz=570gXv2mcfR-d6jqCo_YmL`p4@=R< zd_-#YiIj{bI0z!kLG_y*Mr{-LT`?KW*NDymB*4G+)+QX{zE;pgg_UM+oGKiO->~qp ze%+Auf_gBbsgZO}!uq(r6e2@Xzl-^ncizOVJkoR*u}s6zDCu({C}a+XUTN7q&-5e< zGGZUaE>DIxomLSX@DVa|3O^70_vGas=zhu3WzZeA!kXT^JKm@2f9Dxe`SMQUG+nYJ z8p%8su1zmlZ}rZg=&L$O+9R$usN*qdoYU79#s$SpZ*hCKWvDwfhrlt)SKLjBjPJGh z;LMxV&=mZxHyw-Ews|QeHTh6vUB$^O*TK*Vn)TLQ>LXeP&c?=t z!!f30DXguwg52jCr}bvPmy+5_aB{_g%zqP=)jDmg)}U$JLF;w6Qd1AY3D16gHFDoZ zvKkv@B36rvs3F9ku<^FWc3KE^moq4A^VrEiV`?6&g<4l<$~C3hX%TM)RhQ)Xs{u!Q zMm!4d7PDm12DgvQ{y?seQL!x%jFs!oXg6S)4P%*Q=hE3to9&Vajk_P|G2N|;@z%E$6g5&~i|ueQ;!7>`PPz|TT4`EqB=z<1 zYdL~{GOU@p5s0hIntp&f;d6*1Gp83n*7udw=d9~AEqB&+8VeZz-qu4@z9|ypifyB zOHXyKDS8`I-yrwA%3%c*F5UFh9C1gsN=Z@JbI@FIVi|n?NZ!)-M%oe_kqttL3-_X{ zwwV4;vT-FwjF>h))Bkljb3#$R%!E2*d%Ro8;Z{ay_y!<*kd`*OmB6Z8V^U+2FqOfV zsR_dN@rR4kjfK<$*SV6?w)rpD60jvrldzaJUBgCulaT_-?<;%wySJ zMpk0^k|Fg#(V%Z3`JVT6_K$;B+Yteb4{003hc}Va7S%Feuj}B?V?8TP@}+5@=ecgb~+!eUD!a)-GMCItE2VX_o~SB}f85^1NOfj1TSef7P;&)8nz z!BmjV-BR-KtM(E5HEeGzVtBudWZ(GfqXf@F#N%iwZLd7gcm9~E&lEligFq9SY=Us{ z?I6zFmjq8g%C0Od3{`e2-crk5@JPoH{Hdtc3^g|G>9^0@PM1DKBPlhhH35Rpe&tO~ zDl4x{uS=s_4{Fs^j&XLTU(uG|v>;7X;l8KmZ7`Qev29-0P^+`5pPXkl@aDgW7>=i0 zcBgZ-<*qzB%Q+ueA(RMiQW^dl;9ujdIYVM7#+D|&bz_gAj>pssvDjzS-C+jW88M>o z`>F1*3E*R!6TdpM#S*U*96qOnOfb$aHxnO60PU#hnlyvKc|*vzoSVf0k?o(m{Ggy+ zLiXy)M9}w3O4|~O)_MjMq@G2$X_f})L{}jN6p48+Ew*U5W%kRS(7*8ev40lG3=FJF zkcG|43%~C{p(|!JsbO#Z)%V2P-PAN}&O>e^vx&da+5f48ttDBNaRLki6KTI!y@(?@ zLkD+#P5*ZG(Co~AYGK_uxf|!$+e@&I`9xqSW)kD~`Zt#M-qmMQ$IDO-KW1$g&T{y1 ztF8H0yluSE9@X(fH=Q32OUZ$3!eqUQ?SnyQ6&{0P`;i0DtiI|=_CSN_eXSvi%j z1b#>C8_d(HFusGv^$M#r|#5iMIajrBs}ZOb4fjLSYi z{aKg<`7LphkPof^9I|#;B|7wuagVf+qx?IkE{3045h*U$rQ~+0yxJQovsc0k+wJtU z>g*rE(KJt#LEM6v?SO%*Is$#I|GI3F=?&X z0z?@6u_^;K`mQ2w)54X$9z#8ksh1)c-v1Yd@oBLUY@`1G5hB(NC*eP(Lh5T)o_@F5 zN-tAhG_ryt2*X1spn^H2=8lZMUbXQ0cs}|cByL+rqS_xsY+r4{Y3^$!K}Y(@aRyQ^ zw`tSps)6BQo}#V=r8SR_~0?@+s=XWj$6d%(3&@L!T(`M z3sOx`yEr+ci+4Kpn>l|uI`M(TvbTB=Lw((lR@}=n-1NY0bBW7#bs7jzI}foIawXES zt}o^2o*k5j9Ov%2h>+I3Arm@_iHY_o4Q%7k)H=m>BA4$JgLy}uXH{O@p42Cu&wH-5 z_&WdA0dp`s7Dw)AkEhJyJxninAI?l+j1`FFgcG@%VXL>XGI={7)c2*8&7oq5p5uc& z=dLj0L{-Dq++*!pX6;C|g!=lA?CE~5!0kic5RXM7FAL*Bw{xy_2KV2IC`<=Y$ z&l%2$hB!F&-lpH^P6mw}SrixlYKYojaMarm+dP7tqC^Ovy%Ya*EY_%ipKwlTSd$X} zN_^0JZf5U6dl@U9mSGbYjz&~Hjh_R0Rrd+H_juU1@@XxR>3Lt*qJu{j7ZaV`{`J_N z5Brx`No@4)vAyH~FEKf1SYz%(PAu;|W@1C^x9IK=oQFyB>*1~!qo%G47wG}fqSLkT zT$a@r+=lZcTTT069!(Qj7vf5+umK4MLmiHhd9=f590K1P>G(4w_*FneKf^jfqjF(g z|2gs2)2ya?JL*0cr~Tm(D^1}8448KgdmksSg0-!W1AnL2=Z&nb(EKqp$EIN2oU9`) z{H55T&e?Tg&l1HjY_2`u>fML9<%HtHiAs|-n3BAqu?L(HX^BWf(z6N2*cRQzBi<9P zD5kpKDt*>>jlFi1CD35MQV%T1)OeZU=W+=1eWjNcpftVihzT|{*Dxy08=A)iCywe` z`3YaWS#{BpREIrDIDVN~O64N;jtU8!_fqAKt&gfbQ>HunWTN-)NQ*5oHPcn|GE%OO z1Wl~$+^Nax2(y|FE%OWh^yO-}q;S%&`G#IglhS=X5aO~j>JR4|)2;h(-9=ipT=#6! z?JRqJt9f^#r&m-%1&m|XMWj@7z+Qsw;Pd`8_04m+A%sJwv?CH-TWt(lLyiHbKTl2n z7{Lk0n0+;rV=u$M8Ou$k{Cs}H0)k!=AiOJPuta{GRQ9l$Gx_SNMM)2t6zvjkvsG-T zJl@+=W$#SQ&2njr3R&I2sNTU)vzi8bGARQya3{dCQ`CcgH|cwbeBE&(^iE5I*>{@5 zKXQEIfD&^DxU2?RYFd&QYt#Jbp#OovBE?OUO#PH?18gt#g!;*K{^qNS2HD~?qC%S# z7dldE*i6f6<+~wl>VXizvHtkTqp|-xiqv*K@MD{_%wmLy#akIEU;AFtyrcV3OQNEiqwVkz?W5ivOPd>E@C7@D2sjeI|_f5+NH00reEoFWH4k~OE+7^z^ZU3&<} zncl{gYGNieEGOaaZv+7=*ql})-#1_0d(qic+DRGPOy;aMrb-EbyO*}uKMkO`q!sOI zTB2TZaXx?4y7IR{US-E~%@LkkKb|lXI@Nr@Q_;a7pr2bkjS(jLzB;jqc5eqlPEAWz zc;zWUADi14n01$rfWh&oJxN781RrCi%Id+oO>BPN5x!h}$xWtW=?C<_IynVfcol@J zRQR5f?4UPH)pb8dp(n%Q{{UUR{`h^EmU*l4{H2Uu$_Ts;NBN67@V%mxpLjxE@F=Jd z5fOLlTEx0h#)s$w7t%w}?h9D8RdGkvo`^0V-NTDp%&2Fol4x@(DAJoKhYU)3*4--i znDqyOl%tsi>_Vyd$1ZkoIqRhD4T$LElxNj0KGL(TgS=kdIf(5yS2fEu2rs*0T04ZX ze?6ZN82OBgiL|+TXJ__G-o*%MFlL)KVqbM9ymK=pfXy4@S4^o=`3BI?T{;u` z7-59=t5aaGMbi|wu=LXDbn%W@{z@F#Y0BC~oLG}iqpQKZ&uGreZ<;{&sneU6o{NYY zl~JUo46oF)+6<8EQ6aSt`I6-bsirD-pgNm|P~M z+hjandq=FFM-v2GOC`ZSy1cZDmBIJ(DWv1r-45h1UTy)Wej$aXr-nG4FIiu!h zNx_q#(G_U=ZXjfMrL-!G#Y2bY!&*wDH)ajTxrB`P@RMayF=Uesi-ZhAM~f#5rUV0M zpuumOCeqgJn_l!ledH@ls{3(#6LrXg?Mawte`_4G>ucV;LfTI>9A1@4nY&<|T$Z)R z(nEkW^CpBZTY;o@YmC!_{`K}wuf$jn=$L#tY;rg({Z@B<9E_UGhV=euDwig z(vAz`S}<<~%^zUXOPDXM=ab?x1O&{?MO^2swteidH6g|DwWgI<=)23N%jp zK2=0$SVK~8w7%7XoNcVfopc#c!3J7|8x#VZG%b$7D=2=-L&gxPc?C)(y&w{M$UcII zGcSa(tjDh=PFJHMuwSIU`hq1kUV*yuEdm<*eKR?IEoB#kWec%XhaW42^^nVBrK#?Nf1p35YE4N-1WXe@hmBi!YoT$0l?X(0IL9dX@LmUlYc>b6Fp)pJ058C#sU4UmGW&VwtvTso?Dn`Sml@}i^%4o$ zn`g<07YPZ5tX6I}IPND822kkf<*X>1igXMPj?!=2+Otd)McgV2QS{?iz0sG9tD)WM zUD8$Ri@bR5^TDovM=M+$Y`fe$mNJiPW{7z%T71h z>cumhJ$UdhAO1;}aY0th?kbD(PBuotZ`H3RD3qypjhYrtO9~t4_fq2&b>L_~uJ&KU zA^OX(!w8h8rU&bJOVA?$=CWuiSEqv7ec?ov;D<+%_aASZpp#OLfoJb0@0{i2ZP~-d zav!+%a*^5dC5$MaXgPOBy{{3E1lQo&C`RR4Q)Tvt0OOibvw7Qy8jO4tg{Ubq)DB!> zo~qf5gWsQ)Br_R3CL;lH2op7m?HYO@-Ur=lt9OLJX$Y=Jn%|Tba*I`M4w|5K%55eR z*LmX&i)*;H58Hu-&(2~p71;qpu|SaZy3~G`Uq3s$-d0v-lI)LR z4)r@|C7NfmY)M6e#xe+ao&Db|St^1TH#j*Y_Z8}u<^Wjo>-8!9-2I|40qdhH1NI1b zNo}ZiW)q-vcyHufiQHUeHtXeGAAU(UN1P89GO>i0`NEVe?c{TbVrlYwp|dh1Q@Ey zm6$|{)YM#Zp0b~Kz=^%WfzT)Y<(y;CjWDmB?NT&GP-coVQ*71MO>i8JmdsKpC!gL@ zoWr`@$P!hwmAIFITj(;}vkGbQY3dE`V1 zvUx$6?|wi0?C`Ued*aR3)S9z&1B~77QtI5-q(R03T@ygq|W%F z6VRf(OK&7} zJO$Bgp%!>#G_96e)pLoMM+QpD$n|NYweR{xI zGB#jgIIsO*y&ADb2E3u$f}$lTR2+(#&ztlwP<_=$`jCCBUGpO%3tmR+2QLnwpGRElXZoEZ@!mbUpC$|ws!aIx;4$l^ z3g^`Cl){Olun{rx=XU^GxgBW1+nsDlpte{8(wTRhEB7Rl1>RKQwLMO%Ygnv!dU*=yC$1uVHGz#XZPn8h zA->38x_W|*h;`d`5wQSY*+1|__cQ*zM_V*EJAO8unvV+M$PHzGdp4C5@#l^W!1R~l zOx$QPZrv{L*KTDCORq5P%4>pbK}D<%l~0St6Vj;SB0(aL-jF}lXEIkzF5M4BT@y9Lzr{9blmdUOH2P`x1>l_v%fWeahFb%Tv+24m%4}FZWZ1jPr>F)5bv?JJKqF~ z6;e>F>T%?OzFkB-n8A+uAJ8;sB7516xnH7J?o5ph)l_tzwGlW+z<{$qW|3?TOt5ZV z(3~Ukiv6h-U5wd$a4&;$)db3wp|?GXv!!Z7@!HCjJ%T~?>!t%cG8Uoq`tyOw<|DAU z7LR68ODJ#egvXgz!C3p2QFjhN5JtdE1-g_)89JxL$wkdBa z7LF{o*X)uHIy}e=wJ8b+X)J*N@td*EW>r2%F_}}g=DksxoqI}L@&g<(K2`Q(dsVnb zz1E?|)Oi~BJmMWakD?dC2uxf5HiwT+H*V>MkLMeriW{c51P&tahM8IQ3+=tXfI@|x z`_xD{>AzM?J_)N`AV^+CAs(;r&uO$(gZFfRzwRfMtZB1FZZ}w;8;bgQ!RsG3B-{G1 zeumx0R7}ei>(%REumwZdHB>r|RB`<3uL>OzQ=3nR4&CXyD7s5*Nk!8n*v2qp2 zHZ?2BqjDt4l-ovjtzt}^54tKTh_^f62nsc9<*36oh{JdJ@7BuEroRbJKUy0d&hW}< z0V-pEQjx`}n+htS=e^{QJ3$6{%SPy`*8vSq_8_P6f6!#F%#IbJ$*|ilL#phE;gFbM zWN$_sj-%Vb>Qct7D0T3g?*|}4E9A_ERtGE$^l<44*}WgF?V?+}lq6)&g4PtryYL&? zxxeg!_htyEk>I@B#_9C+>AoK~ zehisU(it6LFx7D$>ShHuSPAUmw4mpX#AdW~=b%nY|tEWOvK#_rvyW zV8XgOu7ymm8+q4OZzVWwi%+ zuk!~DDrjCSm!3NoIr9xOh6drHM`c6Ia@#VFIB)zbuwZ%!%|p9k7L zT_qdss^MO+J3M4+nYl@r+?a7eGy4Td3Ij;W-lO^D0f&nT{{x6bD+1oA zvxXzk>m2YxS@nIS15bGbxaKCVwNV=nUzN@wk_ti37kqQd{&LWwumi`az}!vo4TzHv z{fxJ_p=FT`Ocg)1Ns7pufBj=cX%(p~T|AGOvaKL+m%cgV6HHbn?~ZPU_3 zePiklo5oy~lBN%g*f_0LMhtg({=*Q_b1EX?lmL%X9VPne<`)eXFb5`_k;Er4DSh5! zzsEHJEg6~dTVnWK6L6e-SyDw-QY6I2p9s^7_=aYp(^%k*3t*?oInNRJ_p{}WblI9q zaMT6IK(dUiZSmV~IC(TEL8F_*JSJ)xQYROr@@fqlCTCrBj~4$M^BZcG=v;oPB$~u7REBwM-}N1a9-z81Yjhm;_axr z$$*52frhyWdceSsPrFmMZd$G98dIrCx6yy@BzhZA z@i*gqr=5Z&LN?`mgQgb7pNPXJu1RZv*@_$DzKbPrB7AKm(oN|5V>9B2f%PW0V2kxe z+0WEQ?x^3o@PNYzxhR%1D&`5O_J09(9nEAWJuqsz=hceX+-KrczfGJ-x8i-ejP6kH zcFZlcY%*026f+ol;Qbc6PWfIp;H`~lg2mP^81~0uT{p&gk^+)KhShojz_=!T>4Wjo z&BX2?-o{H>?w;vvqow7!mfo>NPF2OBI*wYl2iAc+H0Kej6jiWcIUlm3>#2X126{6&j7 zTuaYBi1`?6-2OuM-t9dUGvNhZu*pf&3=}Ea5<1jlJ2dM^hDn;D)=@>Ec4yoUzk-;w zj9q{P&#BWjO2V&>+is2s@RAY{8=L(+=Q*rXfs4FAJEQGa6?d3aRcD!-F?%mPLgVn&&!nR|ismJXEh5xVkF5eAw!=m}(uY!5L)oftmWSNr9@^U2Q+e2?n~)TEw2WCSP@+I$0r!vI0p_?BVYjjEY$-rbzr{D(F>MBkgg&;yyzj( z(BGqXRX3(nrWQ1W>#+({(ah`>)y|F(4gpHTBMTa|JY0O?Xx)9*5`(;utgv=tgkJW5 zHIjGn+_y{ATmm_Kf1qcsF#Y-dslVqg{;iz2>$(+jDCGzR>IYU`19i@0j6%716*wwJygj7ln4!qou>+zoagR0Js}r{%E?Wy1hj{`_$$09!4)1s!$Y) zK8g*kIxs7^g{QyB^u{l}CjEVx@0}On0_fNuOA`uiQhl9Zdt5;V`A8@(<+e#_b zSK|6V7geU_?CCc4>Uw3`6QH*kp^W_xl1>i1@Il+GBT1`8fF!^FB1sfs%KJ>7u0f^5 zU#~iE%#8$gRtZL`A?w)@FyFzcQihEPHD|EAvm_-qbhi!j^U_yex`=Y?e#7a-gmB>O z#YqCW^Lf0EvOjV3MM>SwL%_+UJAdDHna~BCiSoWEG@N6TJ@r&ZXR4Pa)W7a_jrDd; z<}@(+IiUEG;rT0y>t$)z4D$~nyODn|JIoi(QVLd0>h*5yIDyijEYH`(Ea!+wrt1%T zI|&zUUPzJ|J(ch!E0-2bI7HK_>3hlQ@=ma03!x-aOY=fg#Bss90KyyAvC7PsY7Rdl9d^4`1&vx<|jM zl>zsG?AZ{nBq+T!@p$Y*04M?rUffXbjB4Q;o_9f zbxq4D@jQA{N>XbTvX~-g+<_6N?bu0V=g$81b}6$(jEUl1xIaUyVG8aJDQ|lEVUmQv zn>TaN0reDsdU;50J|{EWSs%QuqKw&*{8gM5Rx42Z|ojP!?n8rrsRqLn z@XE`Jx<3WrTLKtsUJ?lVZAxNrHQJtg^Y;NUZX6hox7Y8|m)6E}m!T6?x(3 zW%4=!X#E$8p3`k--v2&1-ak58gMLjLm6DLK4YUqN2YDdH12J}dEg>aqtH=)^W~Ph) z?;#_VUu{O` z7&b9s+mmhj#pT?Mw~Wh!v}D)!yCYE++F@;Dd&O$uYvImvH{!kic0h?TH#!#dQ*lnN zArX}>)u;YruhCab7zPWCG$H2ilQ5_u3GFteLkWnfqo;!z>kUd9?Nohc(Fq8Jjuq|}D ze>`GlrX?~z#G>~S9$|fvi7UEe^ zZxahgTHB0)O%ou{0U)q(AB5C0%=oju&ZvL4eh}jafxBf2nan6UAt-pT{4hl%`fqW{ zB=+D;#vyys>$+V8Mz2Nt0!HeJao^`$1v&H8DN>3QVy^Cob?W^t#;__NfT?L;!Am3( zuLqy6PEvJkvNv(82j6&6_uL^<2ScOiH<JMLE0?G1aQe098&ybOSMo0@+Jf3bTQie?fh+XaVuhE0^>-O4FLDxAcy zj20(R!FE|2O{XLebByICB2IwCq-y#vAWkg}T6o?t=BCl4RPgw|{J7m)zL6X{->&~3 zo}H_=_qKRVDLbf|+iKB4P$TJ>5#0ES4CpEFb-xl>kJL5(FZ5a*=pyc7<_vmSHuj0D zrU}c)fL|A`uI}YkldV>BJL-d3`RZ>F^S_h!=?A7ys2<A`g~qLluCJz0h3c__+E6=!o+NKRUgxhMPs_jZ#(oPN!-IG#WOfgqV8x!6yb69n_N{cdTqe$ZVwY>2L@;_d;idksLWXD;`f!Q6v zD-i|cF*w}F$r+Vqqf&h&&}Ij-REKZQF0$3Q#*z~el*@8vD+@AXcL#VrYbucy|D{DPO&n*A)5_6gU<6}LCcp0>I=>ZFyLj(M>4PKoffR1kt4L0rvtwm zXmC0~V5_J~8_Lm`lsRvTiXsr&n$c^O%#cx>SW_aWUR>n_=t^kInI~ih*0a z@1>ru@yuwBiR`VfdkVUt6t#;~gw2-0kP1Wej7h*>hRdzoMsz&z+VC(Z=a|k5k^N;N z=kNOsy#kfR7Em^rgJ3?$75z0Ck6J>TaaMYAd$Uvs#N4e zKc1;8umynrv#BdmU@o0|ymI_j3x=Fj83P8ldfVnlr~MDeL9>vK^AM55_uWrNM1b!3 zys8lhc*sYzmM9hvZ*M26es+LY{3u!dXS-E^p!%gy;w}(@d|uzyww7WeE4U~n0NH=Z z=0#>kS8G%qFP2|Ap-@ zB|)MU_939jABBE6ykb(m8kSx2;N``A;Z7ul?0~MG5G0Xw)c`Svt44^{Q@?pLU6Bd; zK1F=TId?}trX$WSI?b@|ah_u0%eBS_oM1pqnlAlwvD?O$;^7q|N#dPHxJ6UBL*<;! z8Ce1c?ej53?=82~0m1Y*PcQK zlIRW3kbSRjdBE7=?||vo6RehS7ITV`3mh`<`uucYzk$Yd=M5F%nEK|8W>~kV>h1On z#x6>BpAi(jt}vdk=&85!EdTX$gE?=D$j`k6%zQ{NTA=#=JT0xQLVa4t+s@Z~7iq6~ zRi@|kpccW{@mX?i?(PGmH&Z+SHem4RlhPAB1Wg*JWY39u$ebN^CF zlfR7(&N83!TEgHH42I5ktA_sKO{o(VrLDaShOIEkJi}~D=;Nrw;v`1@jD=mJ3^NJP zKxFe*-QPc%pwnDOA=mwGhq@@CoJ|KB`Z|q-%;=S~KPJ51EqbS>XvpSZVl(IkN-wCs%3LU1b=D`@+{)Z@gAaHSCp)U7 zIY`)*(t{@Dxvt*>1*2$%V{852LNTq}w<>jqXQ&oBV_?;7IA}C1&l5SG>}xWY3p2Te z%!~3#I~0e1u*gU85*hYSImAV@NFO`%SM_v;jkm69_&4At%?9sdHAMs?fIH}zaBv{o zUPF1JoX>YB+M4GAbFc$b#B>>dbNJV-eFC_(T^#NJRl7y4<|l&2{dKo?)s1N2)-HUw zTHPPvy()NcTyPCmEcG)nBiij@ZXVT=npeN^FnY1aj1r9BI|=rcb{rTZufvMfgw8)Y za#RZhC8C`?z`CTLuDtZb_4(+=8z#EI7wP8%YVlLzDr2CUsZckY5M=?`se@SZ!4qZe z1F~Q0jbe7|<|F#;X%p-7oPMuu_iO;znNu98(hRZ^(@sA( z5ps7|Bx^hpQDbNR8d^1f#|k;sAl>vAYcA93%Scru^f{oLc^-PvCdsnw#1uCmFCp}c zHReDEneo58gcQJ62e5Dhn?TGXFuEowJJ`!U$gpb`M-{+o{gH{4N7cR!7uHEerhCMQ zEZfswYl189r-P&ah9z)~KoXSLMg8lQ^I6qFUIiwy1wuC*x5>shCx^<(t9nmK7J<`T zS3A!{R!@hc4|EgDq^S=hiBbp?v47y*&l4Iw$zfuEllL#s+VvCCx2BZO;IM5i`dyaa_^V5X}{!{!jutmY=pW%4DM&r@Y+pEA&?%l@<(UcJv zCVGPqpx^&o<~i?=1Ag2*Pva)=1?iYP?5&;C0M#G^ik^l2GVR9fHRnDZ2hbu3nfWvK z=GW#hfG;rt>#N9KZ=J>@5q6!nJzMBbjrLoT2#CnuN8>jWD?<|IX$9}5cs)z889)5< zmp+$8j6lFU#-9^(MlHye@Al6!B$3@8>wrrkh_&}Hm-SrR(T@RqSsDd}dMJ&G&$)&U zBGU3wyFZoG?_;e~Ht2i2t&y7V!G^6nwNviaYyhJ1aQJn&*G^y`pp^^k1B#2#6h_K; z&7|kLJ}T}#=zghBA7C1*gJgMA#D%4qjN%c0(F7fnb8;d zezqsrnDCVW`vg7rom_JKU9s#g(#L@d*Q(pA9R|?=*GM>Q~Ccbpb&tINzANpa)`I${5*mzeR`Bjpm@0T9$9-V*4 zaFP+T`wt?0{*B7{F&z}0J>cdsm1O=$aK78ZX6Cvd`!SJk@$*4ItZvDBooqgSx}Ad< z_Aqg*DGhc^_u&^JGc1+3pN>mtaQ#y<@ektgSTe_GYflPG6e0S}4fl~m`WSy**Xqc8 za&Nw4h5Mw#aKUov zYF78;{PRY|PVf}WfCwz+H^W@djX7@bnhe2UI3vZ=6dMp@@P0q9zY6pax z0s*&?H}Wx~A|@3dsi~3P(Ak2)zlb=Xffv28=z6VbxOihAOylas`3%N_TQZJDmhlA4 zG3cTu?LK1N2_SHE%juOyr(jl|5Y3OfVjl5H4z;dzPr%M(+6wz>Krrcs7%&mkWZ=v> zAp9_wm`Xmt0ej_r!x#}O#eEKKA|vTQ3s>+1vgdF6W7F`M&80HZZBjcwmk*bll)UIW@J6vX$9MuTT_W? zqfkvm1CcWD!>JRSQ7g;b0HxGN5qC=EUyr7fjJ1r@tv& zZcO+@CMO8O4qt@koD(m9IJ3{Irh~8ppd#O9&ueS{V|BiKRnj9OIGy{==k3~+{@hVT zZ3FiGdg^+#Z{JK}%K7Hn%W2b_!}m0zVIO(DS9f`cN7no_sI}wCP9eGNRa7+Ngj=# zAC4SDq0Wr2n|6pU9HqHh5xS6&6u zUtR{2u1#H4W7=vxv%7aaLO|2Jy{huIyE5DP;<<@J{YNn--8O#~1mf3kOYo*Ds=%`2 z@@puKA0!vt*~9a&)*=hAAORs5qL>0(wn&9>tQ!eiomejA|FG@M$-g;QUVQ)& z+%Lz4rjciJcwNM+iTeryMI*8IzEqov(kg9S(DKqkno&wVwwX3Bj2xx{O`6JD7f~xgY zQzM5=e;6REpA!0(N1E~zEyVK9*W5on9|z2ZC^D51vkzK zG*;~=^WF0EKIiJzufJC=2m$iuXey9t99Y?3T9X0=h0F4YJ)YHBiP5ZE-EU{;aUd5{ z!MP72MXPOGu(L|&dkZ>1M=*hByG-fBPcNdgwau0xdRhIoNGM@JUym)>zg5Vs**8vOpZ;7?bM@1Z1bck4%Dilm= z0~eY8keZfvS%BAY!ZpPs=Lj89h_};8&Gen1Q}+D-$olfIq|@*1`OexpO{-a^Q>JEa zm6=PTQ<>-%KHG$ z_xF3>_rJO3x(NI{pYxn^?sMPwQP;nl)$O!knz>h5=)(Nby#@mYkpilFTo39y zVz1ZNEEE{~jaLy$D^%7Ae6eyziq5iOlj2F zsGHVqhRPNpl)M|4_G~%e>RSONC!`pSd@&&Dy*{AdP1=h@zKQO}EZ)llkLrz!QB-ut zAqh!4k=GO#+JnpZ58Y1+3O{!7!YNkOp*9WK}`;-`H&Rn^8B0fc2pYEf+qxV#4#9Xet4`*?J% z**!Mn=n=TeW7g;=pbC_+;A+x}CRa-vH?oMY)7y->bch|H+bRmj_bi$i)<7a$X?HC_Ey?Cc!y8QN|UVU~ncy8XK;h)xL7 z^t-zLGf7~5T?;JX!XmHMw?|<`x4ZehwV+9mH(Pc;708xV{!1XVlI<9rgJ*Jx9$_P2>)hrv-NR`YSRdg%f)ZJrX)u zhkx~PXJPiv4a?XyT;uyC`s`EZQ@2{`>Z##5%TWz3y7KJ!tb z)d+}R(zo+29jT$DIdcF)*rV@QMqM>v!JU;6{%);%Ce;xSO>Qpp{`Gu_skkv#4R|}w zKsHI4KYx4xZI-9k!M^jiKHz6=QP+Q1FBhH<8w$ZwGp&aje7!a&)Vhx35BxWiEyXgKa}h?#Q#fm?98U^b@C6?yO@gaW5*3XUrwnwAsB6X@ZH4lnbN*azx;_6LJ8dxT1V8?Cc*%meL!-Fn}4E1wL>7Gk{eD{kd z=J$PR1*oZCO~ZRnJaGR-ssO%j4rH*6?>hRuh8#4EVen44Nu6Fxl zx)hg&rR;WLnsz+!#8mz6!b$=J4xSy|= z`v23mW10={Or@xSP`RI~3{-o9OS%K!0D|08lBxrf=pl?ofF8o8?7w;l zj!a5XQ`SC4URKs~R7y%5kVIBnum5UY5-0}2{3{kj7WU^cQuUw(19(Vd;+7?T^_8xn{&%+*d#J~c|*&3aDc_?fVw@I_fE=8N$6E2oPKK`IR9|jO7R1LP>pTJ5n7Zp ztMxpqB=HSE(>BF3@$%BBFJLY8imAW>B?Ks^xT$l^>nSO)L15R?v+&Z0hl)}r^MO3X zr7>SHV5sgfU42QapZrS55@{2FD}%9vRp%W*Htp&JWK-nZ`}oLzxc~(qP@+0({$tL| zu&6utzv645Pr97v&Bn1RZ6FsK_0^jL6gb06|&P<{>EnUc8>i{S!Z#OsQ{;$?(suO69IC>1u|0p3G z3jr8^g2C~9!Rwo`b!uL@X><0jJ@(lhIb~OFt3S(zOt~*A?*hCGj9in%?x=VVw+IWM zrRSXKxo#)xmXOmo6sn0~5H)wFY7H$4J)*SV z^jk02_`r|rn+J|KC_m$#1ypM8MfXaOtL{!iSEB3~**zuE7!%iBd45xvI}#_WH>#8X z33qd%#@xp44DcT=(D2@e{qqZE8<-djo2=JZIenJQq+W^7#?rp&hMdt^ifCE+=?I{@ ztxZRCo}Zkw1No}y+JQOqxt!;7$yCIABdtGvaWil+Nz=l}=aPm0i^dI?4#;Zmw$EHB z1!*V3%3N2UnR-2Z5>TXd0jK_rL}PTiCCw~0ii%9<*7ZLkP!L1`_d>LgkSZ4gpIU=D=hqz+kp{{!@?7lmHh zGFn?CptTu?EBHSt@U*)4CVEOn{f)6cxv(OIKBKIx%#WYwcXgR8@VBwSrJj`2P<7?P z8`7$WLjEZ^YKt@fz3-46uV_p5f2pBg%8L*{dI`%OsDODNKf~UnPV#tabUFC^V%m)r zDsJgs0mTl|O&nU!aUJL|awAoL`wh!n8-<)G6r~3N#)LRfqrumI*lbO?m-$8vvJLMt zho87dkDS+S7nr5KVg-HQ)O^u?S6)Dd6q1bDjDRtwZ_r)<>E7(2Gjn-EW}X2FRAP}< zGb1e^XWx8<&w8qQwa3vMSF(tqi< z8S(XRz+uVw_t}j9W;bjJj#FJF? z2zAI9J(={1czAD+0oF!TRnagRvy7FakxzqBM07~e1s24*9P4YB-vU{&a5a3Ftd0wH!@ zh0N<%x1`Lcsfw>i=%W86amNr1@gmbS=m174;Uiq}zu$fO2F@I`=Km#ecQb)lqHpL- zKtjlQ^$lN`YeTMLb#9S0FvB;jO-o!a<8WtYBqiZNHSw$DTAuaR35Q&}9(%2DzK1#$ zRBor=QL=hwZrNaJbpg8-{OUKV!4hq4)c7(z>Tr^LmCrfLkGCa4*>@n>^1e6eTr12T zZ#7YYDR6~(tVt^=fs`U+&=jk?^(+_V&R9}=#fiVg8vtPr~MpPhZC=VK``A$kf}e{|M&P}n;k?@SdMwYg@KM@w3Yo9pv7d;{I4m(4>t>FWp%6$o#Kc02UK_un?n15={r40 zS$s$WZy37`Q~-G6xVKz*;P1MUkb@m=ejy3DH?`n!W}0*yKW$ch-9j><>Xq9H&2cz$ z)=@nPbq&!eT@rs{P=oPuCm>{9No~1<)Gd^$C&+hiM7j7!-t>=NlEqz6j3K9m)_pvp zS8wfL*M}OKAODGTaSzZ4P22bMO4WUzK;!|O0kc^hCXiA`>w#5I_K@L7;8YT$SypCV zKhvH?Z|oV7h$j$x8hwzTfG1makIn*mzi^|3wV@aJ2+={ZDlAE{MQF@pn`SCyu85g8 zguQGTiRNub{R0Vg^sD7v-iwz@$w$27OWY>xJd=|XEPww3!(&!aGuYV@(xF3tID!l49IR1s!IMEh29Q3it%DmX1U~GF7bLp2bRu) z3nq6i?VQV`CP-~?klOYF6vn0@t#&BndCAcnN?Q=ODjT$>5d$U?ucZ)~^1+d^TATS3 zXvWx0?)Q`J51o_f{Xh;TH|o|FQ*Py3h?0%}&f;Y{Gc-ajF9UJY2^kSbgH_%hYocv)Re@vtr#L-A!067bM74|s_Rf@hewi{^%bWbZAvrK4 z@prgQEt$d+t%{8gJg|~SP3#%=1i4}*q+qx)tt#G`Le3Ko)ILr==4;>)w6?#s*x!BW zERYJTX4Jk2OpY|WH4l9DegpV#!C<38ROhvPEk6GRwaUE}{VX8Sa+{aU<2W?V&G^pD6BfKeV$C|95;S48EPTj7mtm}*tpj#CQ$tW~R2#>{nT z_u!ER-lAR|UE1Z+tEZq-i5WC_l2V`Qu%hk&0{ObzbH)oSb(pKi+)$Crst?Z-c4&UI z1xBXF^{NDy4|$m4WolZFv=)Zld|JBsZ9bgZ*u4Y`xK9Dr9fd#hPl8`z16keAUuHP& zrL(gvj;|xj>+9Q;N17;d;baL>F068HZ1<9PUi)kYwb8YfP)@js5EW*}L9T8(0SbDs zIYh|XT`Mq1aQdb~K0v8=n@Aew%y^7Qgb&3~2KGI8qf|=S>`$p^Z96;kM0Yerw6WFw z;f?GoUl^w2io8q1tX^l~<1E-{-rUTJwY2t}Xk&;fa6rAos_@c=%>HB1_1^Hi2N+7u zNBTP=V>2$_$>I5*P0O@Q-7<|?jjrxX%oBYx|O_jcea<|mrZN*ZnqE0_8Z6l-v5XCGgyyO>mAri&-c zAVX9d+s&BD1XZP1kX^8Il{WT`AO9KVKPMc`K@bL%c&pE-8w00QUpp!?*X~3O&eD9( zg(KlNUhivm$>XC$O@2-Z{~T2I-?u#)5X^`ct3OTYNeWZJBd-@hV^wfM={Mg-;+m<~ z#HTQ!-!YHL*GKRnTH#P~uUZv`x8XM`-DNoJNAbRGMW$p$a_+pNvW9~@^0^i%GeU(p zyq+6e+w0h{_w&E2c5e-9lV5ITK`-yGkJHm4rh1I+^Cutep?PE8E+t6}4{6Junh-1; zafKkPD5wRhC+q{6wZxYc?E3}G?*VUxiP!pHGYYODA`G_}0qv&W7I9@RS&=Yq<$n27 z;ZM70t;=pEHR7e7cO~GV|DgEo`|64b`B1}2+jL9qp!8SnMuBC4SovM<$v3i{5tW19iqlT^hjP@x<=KmLUz z9HkDm{PcJoJN$0jlkeS(XFU}|w?&O5+MF&KxT5XaQfheCPf$|l^$90hU*DB=V+C=I z7Q?T6YV9tU?{r6lzft=DY%iDfgN7k?^k{0Jv*Zgi_li^O%#J-xbQ+=~-MWESD?ayWv zrYLt#^voHv6z}{77#MkpY8XVUdqmc_x8nw3S{AgkfPZE8eGWtB+%oab&F13Ch^RtM z68D%Mfl)Mhxw`g`m0tiux8eb22*N7)RQQ%Mzta%^*?N?-k|}ET%6IxLV;h93G?{G?bW#l22 z?OBLn7_Fqh%6{gd&^{W}RTWXW;K6}+A$fuu36JTIlZ~RAc~D?3lB18SZF~R@D8XPC zct~%?e-9eKRQH^}H$j>dRdrwYCW&n$n4RnWyV3L9kL%fEB=%VyO3({BpHHZd`*UwG z-bM+yB>fwBeZ58O_ha)j>DC=BaQA$uqLFSObgJFzFB^S;NfT7R7mcy^eCG!K+_1OZ z+t@{FZyNUSrh+Nzkwrm;qP%I9d%io*@U-5bkliK}p2r@E9Mj89y?oyvcdLjpC4|+L zN?*OO*qO+zk!^^g3i!#rGq6N0<QObdvf0Li#RO;vfKZ)vQ+#p5vU7I*7DrEd3@a;s;<6FXZS*TDuT`Y zMBA34=??aQ@{voq-@brP{{R+~%q;NuLc>9w4DWg8J*pXaGsbPVZABPJA$cHq0zclv z>wJFAZAbyRa)8T+hAY5Qr4GU;^l(fBpjb5rj|emhc{hL8b7Dzi?EYQekQw_=9eFb2 znF`|Xv&`oQNAZC=sSMePeqmvab51zox3BNzj;9Hk0TyXEb;Ab_`QjW5M@5_%GH`2Emim2~@W<%rzz4eroB*8b0_D!paC_nQG!>uM0k3dQZZAV$X zm>|Y;VA&bcVREI1^9x~K?>Uv2*-9)*KsCgr)SSvTF=>*HI8THaMJH=+EG_Fps4n*2 zv@7jI+~JQd&F|KIT`NDMV^i63$x3IB7Q#D)-m=3f7lfMWzJ6Jx=9#R1Qg*)0H-wZX zyNVN|TtsJff&nKQewP*Y$*@o(eA}~#*$n4xK4|4n{Vza>X-W5$UmssYDJFco%IN%%ywSM*G%$OUn0%NRWxpTpfy7kyDb_Y{sk5C$@hu!n(G;#2+qqm}c0N3S-Fj2^K$UpCRgxJ~C^#G_x+oWoCVO?SJZp zN!5Alv671Nv^kHn??P+^H?}&WPDJ|`7K6(=I7t|W$t((y%t?wLzwg1f12<@Jlx_*Ui+h(7e`VufW>2Dn;&v zBsa+1te$bqjqI1BdxlgvlvrwTtA>2(@pJBbG=fX_{99AzD=nP~C^m7>-FnlnpyMd? z^*^JAX7er8i&ufL&HEMROCf`l?yWdxchZGE+?h9OeIO#&Xbr>naNxF&Ra7^#JRtc) z0pfZ`J+AG^y(Z&MNW&B0jet;Ky@Ig6)uRHgP5Jo-`$P=6B0W`t9Elv+=6J`>nXp4n zyL|kr+2_AgIe9*>D(){|L~uQPK41X5u>2BwtDn=!S6&UzMl;+x|07}yx=Ablg7L7h zC)yjgchSkyDcM89w27W>rHpm#hOzLA&KwfAtZ1mgW6E-(t@*06e#HuO>AQeyx{V>Z z7On|a1zJ^_=lw-=?ZoV+P946x|1?$j7xt#}!Z1Jw+Fh8Gg48;#!s!{b-Pl=i+H9E7 zz94qv^Y7AHa(@MHILbIX9-p~jy%BT|gsP$Ex}5SMBgp#3F)Ps6CI8yrN~hs3odBkR z@thz@o$_Ww-Ob1$U^X?AD(K6Z%vxP+ZvU*sa#O0C zYmgo2;ktGm>iZ1Pqqmq(Q_6yx4b56Mz5{2%O%Q*E>YypW<5a856nzCgo>U$4fIc9* zIvpF9$Ty<2HCwDVxqgD=P#auV+Df1z){sSliHnYeKZiL6Qd)kdMFA63lrOFWYlcqv^ByH*nCx?x{fY~g?d8fG^Zh1Kb=%__1z4?8%aX0GiS8QwRPAh zark}D!oY*UTkCNW+VNi0yq4FV)Xgl5fb4MfORUdM2nObMya^lo3+z;-4UcE20t&fF|8UA7XEyrx zPF@jqtu6TLa@yQL_?c-wD>uBMH<}OvX?d>t3OzE605m8gLJs0-S}fbMDUtHdiut_f z^^x~Sdh6!Kq)N7ba%UnZz>VAd;XR=whv90A{=LxiG@zpy2JpAg_y*LKTtp~ngW_9- z`F4SI=oT_;7W9ezE00#1nA)rQ8Z&m(-x&Hk<0sI4UY^`uNzpdY z;-u2ek1trk8n?IgmOKHn^)a>?-1q6rJ zUgv{1lY5i;KF-d3SCwW$@X`KUu!N#~nwJ}H>E}3*$S)HNppAitW%f%gzyyy@=;9@K za^d05RX5E9BEs^jpgBYKi<4^h?|e-JpY(q>Gh=XDJ)l=E}c&DtrIKGf@I>%pP&&LO7*au)V-`kE4BcY zSh!I)*l*b;fCX^IWJqw;ZYIO8rC5OGxeV*+HO`xN4mp3{J}8_+51B5vJ@J?fYrP2- zVBs&*ghSe+2{9|Tc1ib7WXE#bS9El>8q`yf@!iJ6P`Dj>`5ay=6-WiYVk9*5OQJ2M zA=df-CN_LEeorJN?Lpu^hIqPc>v1oXBVdYbXE}19D^RZUb7n% zzh!Bd4g&Wg+U_L@D`@C5P8{Yi-Zn{G?f-dFowYylPO^emURlVn5M}~<6j3d3;Ywg;N>g5#OTO>oJJ0y{sUm9tWAu-gCW?-FOD=eNao{NOv1;bq6HiQIhhPgmll;LWp% zGw4`gx9T`%7z|W7yYKf5N6G}{)^&3vF35(D?o*ba*oJgU=>*F2^iiF%r(d!W;4J?X5j$X+3sjj`m~o$d9|g?=WN7`CbwY|z+`zd2g$dZ z3loLiN9{sT6|3cCd&lw z2;==i(A@nMS-10FE`VbUvPH+PhBx>hYlBn#J!n%b3Q9nf%z3p5%m zkeojD!n$EQZfTj;ypO}X5S+uANI& zonjt%F0NjwK6fqPN{1o%UX2Sh)-IQtw{cuqZh3hO2W#cClzZ?Yh1B{ox(fc0qDGEy z^e^v^fP3t%vd+&cjQIJuCLdU5%ESQj?|9=MzybQ@XBB&O#ACI5zdB}0{kZ*N)Fj-H=`54eMO@rrS@j6ZOgb5jtv*!H#B zA~1PxL}9Pm>mbBPJCFGQ)UV=h!7R3B-q;@(&vNz1MW7w<%$c>Umakyi&tA*iLMJ>j3788M)0#W|7L_x#ze_`N8jOGS};b+`i>Sc#=(~x_-1s){D@(Tx?o>mmC`!?SRM5!kL-0w+?y?EB}ne)-JW z_Nucsrd;r8bh9m$_BsVu%3!w?umEcTsPV|Tg7t1Z(|JAZ9SIji^uVdHYhL2SxkrIw zTN6bSDY*YvLi-G-Lg{0w2aR<+GhKt|^J)Q1H(4!|ribEhcX=J-Q3+pW*L#lfF0}G# zdHRW;UpX<}S4%;ILr646$7z=;1=3V@cJApIU29TBkOiH&w~pQQX-{b#!iNmB;zeSI z*Lh#AF0D-VNNc&j{$8jEf`I+6Ah^y*f-B8OO(jQuQ-OJ9OQ}ZGN?vIFfI=~rGZsvX zU5hOGKfK}DC~0UFzD1KVF7(W**Bl%)LY3DPQ<}Ds<%3A>%#b=HhxzlwS`vGD(-&3)-FY1_+ptbi*MK_;`vH0VAE!Y^uwiRuu7&`5Q>`kT6 ztwbsPH>^5<_JWO->Hq#f2@NeC4ry!2pAW3<_<|TVPKa{REx;LW)dA)4kqNF+)L3|j zu~s4Vt2uk|F^;JNa+&Nz))|U5EY|sMNt$Fiebb^sd0q_P=8~{eAazd+9(WBRjLObI zBI1ClNmawX{xvw{X~pzF^xpA1d_z>ah4ydZDbgMd2Z|Fdex%h}khQ2FQBFog{HF&M z6_T}`yNxA-n(q#MfnYhLV3MwS0p1-C_C!};iUPH@eGqQ zzi9xxdQ+>G6h za4Uc_CLuogfm7=KWIi1!8CON@y?@1E-xeQfjblmVL^QlU0_~xtT39y2u|r3oA%(1# zlBS2gyMG-tnnb%FN1Nzr(f%-pV-H6;_)8KS8Y3I4S}IKksWiTOQT`yk{M>3QBIjx| z9ozE!s~YI=%2@?7y#`POhEVtL?wp=}M%S#UM=4dhR4LJfE%uMS1+BZ5$?(QGn^=Ysg6NpY$-a==!djs-VhNf%g9p1+==g?|U#UX=8D z_+F8BYFKj^bOlXraM)eE7AZ|tv0SDT59=sVzX#Xa*Pi>ejM(&8=X_<$9wf9lIesT? ztC_py;c)*9XH>zh$&!zIzlO=GzPT16Di|GsiTEK4emLN!>zi++jx-1n94dk z2y)HcU}stC#K7!9{n;P>1hZSFEJlv-j1@7pJ(>;sSoM(9ct`~%KgfD@`&cPM#qZ~3 z9l*KJ>s&pfO}&w-P%+%#H!sQ=y28E9k(9XZZzgZ;#XhJA zT5xzf>zvLgb4{%7$akXsa0yg`DFswum``urxH1tpdMtjSHtT2b5s%7P&PoA4ry(-5 zr!d_DyK?ty&89&k!$P^1HnrzaK8>|{n7aOK%YL-tU}k@qi3~noY;c2L*jvE#YdCqJ zlx-)nXvy`8wIA?>)9>%w4x0Ohdt{%uVn3I_*hB#V6&t&CY4x;z?Z2taRGz8S&S$xR z5okE0n+grM)uH@s+WLa{Hi$64SC|3_)^0DI$wzGNH5DaCW1!G?JNg!F)=p)yVJUcd zGEg@|Z{Bf_Y89-xlCr{Tc>(6Vt0A2xZxOVwWv&KLArWqE#U~jGda3q08&O7dsatmp zUID8F-t_sV-~+nDh*Z)eg=&l1?v(`tW!!JuirO1>-OX~yhX`~eCog`^Zi%xt16>~C zd}pDYo-u`~1ssRhf4&67wu@*Jnx?$3->wMDzP1u&!~^d}rJ#W+cd3=_ZWB7D8XtSP zTJwCqNjF(9$Vqu&YwFw|??T|#V?0ADu|ki*>^qk@d{co5`Z1S}5|K-c9B?h8$4TPK zNjGApw8)oL5}cKR4zqd}a-iJV7Xmzq(QU!88S>*Q+zZ=U9t1_F&8^MQj%<2=1P7C1 zz=lZ1!w!B+B(l7zbTJ3a?MYmODFj!koei6B2plrs0r7dgwm3YdcKO-e%XMB+3L)UD$%-SsmOtJQj=|k&*?ojN(-yCK&)H()HDmyN83>L2<$6@Fy9f#|rwh z`K-w`Y7k~=(O~&jMS6z9Zntd&JeGt>veBz^JR9NiNzLk5{KG^i9%2MS@jRtBXoR(&{ZM+Vw@nC# zz6SvH9JB{yFaY#t%j&YkFHJ4zyPcVr=F3Q8pMV`{mO{I!U9}hnAc>mx5=d;)1VFPU2xyJ`0s391)t8 zX{#lj#E-6OMfnRQ2ni)1Wbmb-O@q)yud&K(d<6G8Ra?zY_(K0UA__EqOY{3BH&l#H zpmFrF$%oP>)JYcM5|UBmwC~RxuK`?_ebDU{Ac!Iga?02nFEnme7AA)ZH#h_a6jRme zyE4DcEMAeW5?TDFy7X7W1pi$5(aROA@gG3>B4YbH&BTDDU=tKk`O=KVcIJ`BeFy4y zH^i)PzWYd743RgLf`aga=*bB_vx?v_R@iG4lxE{GF{hR#j0t$ni+%*@BSfG{^ zRSfKrRuMHZ3kyMFh1*W=o-+4ay%0<~C_%7<0P6ZJp!RSgz#XclbuZ&sXYtE6*y?#o z8EmL`bt+;XV+Ki$%#@dKlox;0PMcx!4B|~st2Td_9VYV^`}(9RE55cb zAocD9Vptx^r-H_gb5_XT#9YWqn=u1K{WB{c{ebZ;9OjL1&$ViH#L_Q?>;?Uik*ulv z`ow4-7O%@L-9Epo+?3}$7u&IT(PiW$1nX&T`~=)G&$%B7Y@s8elpUe7IVs;IvTAwe zW+mpdtd3(~7si_SqZ52W)l10mVcNR)W1zrLoJaqdv8TdoqK!yzWxqt~=ee&cfKiQf z!t?zst#-vpxY3&1&FwxAUY9|&Dx@4c_!3Y@n6`2aaKxQvh@17~!0evR-qi-M4+n&E z&m{Vjg5<=)j)Kh;!Nv;x_ZP48U3YD5*3Ao%PU3`w7WL4;)4{i(l{O?6I}9n;S8t$F z`ku%*>|~*V1gom6EY0BLJ>cBj>RP23@%N9eEgaJaS1S7*QZ%c#ZSLR>rQ#bVGsj($ zcxLlW*?)pMrrS!}N=0rIw=$w#ld#u<*LH-O*$HmDD+)|07PNSEYBol+{AZ%peA7|e z;kG}kFW2InwjbYGgxT!kcFrGvU$94mBEAH3B1Yvv-)ojD#Ttxh7?KEgsP3EG{*kN1W!jb@5s&CQ+W6d@V@Y zIk!nii0ICZ>?wb3GcCCnN~FmO3jBZ{=y#P2{|b27e_&fN(dXep z{l)U8M*v7&;a#JK&4&eW6RhADo&A}R_1aO*hxfeR0y1D)y9^XtJkVmw{Xy?Jn%R_d zLJrNUIn+&O(T%qPn*y}>eNgy{PnKR+SBD)l~a>h6nS5%dr z1@jCeAYkk=KPlGo`OJ>*w7StU01C%D9cMLWKTv|3M1pJeN>Rd-lP3!^A*>lrpR^lY zJP`k&qPL0f+UM$W@FXdFVt4aZt78iLPgH|}0D>g{jlfBU$Ds7%d#MC?iIsX(=Xl!W zdr<{gKPIViYaYH|m@d?1L+2j*t=NjGOhRHze@~%3d-)b4&nor5A zzlkhuf|~ghi95KQl@-w>`s4|P?cg5?`w;}}{LIYi3JUcQ*1=0~=nZ0~qzT-{U663S z@Xr}bJG|DjyQ~5{;36a2;8+5&NJT%nL*o)vtuA5jH_7t=DQ9sehfY!1*G%hz($z*6cK?+Pz zn<|%fAbiQ}8om;#C*njIV~(?aJ-arQ#lBPiS@g))Yl6UeA!HlN+whqz5UI5tJEY&c z6nVbcRmo=@?XzQ{ryWUl8a4zC#U9-LGoHVJE3%ONi%Q7b`2ItA95Z;3RSJ>8w9Ixt zd`;>8mEA3Ck!KqF{=jsbU~0t5s3Pz~-XxujRzNqo;>#^&ABiTZvu$+XOI(bZj9e$_ z1hyU^Z#}EsLSZ!WUxjbjo1FsJMXj9J^#1$Isw~UaRJPYfuQGjp*~lj~+@}ic!?krR z{h9-v) zCI&Q{48BqPnXUr9pG$yh!eNWK#7hxPNglwf3Ws)k>96xSfmlvbd);1juDE|T*&u{o zs^8kUHgbn|7~o9VF5(>xo1JwZiK^@kw|(NyK5LtEQ~n@V)*g2wdz%(nzA${b*RE%@ zk~D)F9y^M_?a-mDxas3$7k1c1&RCeZ@qF58fh+EF1WRZuzBXc;(PeC8CP&{6#)@dc zt-r59@ZB53=YK7ke{pNf{8IikfpAF%jlX$fge8jbfH_IQHJ;83Xa^PGR>QPimZTnpPdLlgYDnMLfFzVz289q5SQ)M@9emTOXD|3h;l7Zvk&K``a(rjXtvL0M9`7J%Z z#6GYAfu84O+nq`TGr9}2$B&_t995^# zZ~KhZ?+LpjiWCZ=!`cL==0q)B)pe52@L>HEB-(4D?>tw6sC*Y;hD zp{C(u(csG=o)Epd6+xM6239kU_TmKRk>g4H?JK+Q@{(OR2g-t5aV&o2s5$<#IXohx zdTXZ%1h>~Sum+4nq;riJIo)_7lg~0edwOM#TsFGXYCJdtM-F`HI=U!}FUVw*hhuXyRL*J&8C z=em(vFoMKBt^QI5FV2C5qy_#=U8TVMpn=FID==cNbddP{sttp~ZQ_qN{Rybj*Ph%T zBMA}}yezTbs~830pu-|QU_J5l8W=rWKJ;tio>27r`d@e`SY)pL(+-o`35=1V6ny=D zRn>HweV4mnE7An7f(~)^>DbNG_-rF`7I0)c_It2oW{YsIv^qUYjZPqzEezWi9`_B4i$zG;rA!}W*=!yI2P*{KBen`+iOZt=^?3HBc2>Ia>>sg#6>te zp>D<+6KFcbz!OkTit)vkZ0>+Nz{eLEfIxU6Rw90xsF!dF=__D`;CX)WMoveQD>DUA znr`ogRak#X#g%Bzd}8mvE4+DCi=h)f3~)VL(cN$X4^4}&;PJ7&`jR<_@dIgqqxU^% zk$*RIgqqG%rz~08Abv0NG5^I0&_!4^FOyx%pdz!N!zhj!j-}mv)jfl%2&wqKd4>`6 zhvbrgzwtJPVOpm5y(FssYCeng8}KtkPeE5u=%I6zyHlEye%@IwBXMKc_-V*w61vR^ zc_&>%=iUSaH_{KvySUo^U`f}l#^-RCr?Rc(!79fiR9U<*?9A6wHW8cdNq&nXi%q6WW!l&2ptg~vn zv^$#vnEOma=}?X)|54UY*Fk}&-0AwW%a03wcmlDi{U%aBhM@K;;VErieOi(*MGI?T zztuFlMW=ZKQvSVd9|*aKq1oh)CBbOBr_$)@N}Co%IPnqgjNb)X8Eo7c{kwYkFT>SQw#w!Q-h%W%ex(hgT z$yHzHD|ZiTkJ9SkMwhJLn1E8xs}>a7I(p#Vi%|=eXBP4bF&VFz_a+jUe&K=D_6Hw~ z8Ag|F2E~MvU9(*+bz>OMa468Eo!*X0KS>_ltcJ{elEph;8U0#H0XL>LhOII#D81bB zsNA()aVblKcr4}GuXcwM%RSWWqlXhq;U z3RifIx3Oq^CwUf0C$q5$={&scBxw~j-0Q17a7eGh9TB#AzH65b;GlmfHCAcLh7CRP zA3xwe=T$LeemR(9yl;y*dr{*28l!f@NYNHiggNZz-mR!QoEYip7g3~@$ed^>9fD6h z1+Y6oy9K(E6=z^oFj5uPL87aAB_Z}+*)lh{I2@qne+!7`Hcn-->P#T-Df z`e{HiVJ)^bb`o0WvIjBN zaJ?b!5K^~#Aim#Nyjle(bNJ{b-+i5dR*#Zd4%hwJ*0sjU0=0Ze7mP zQ@ag3F2ZlA$c@xD`*mXid*T0yxcJP3y3Z8*M{)3xJ^LIb2|H~9dhAO{F0)VtwQTX#1 za9}^q*sVHDRpyw z{~0xjxyK_W$;?t={>IrOK1B;nTSvwL^e(FMTj{;^DD^zi!eocvt4WP4$%yRwbMC!7 z{$l}E5cY|K<5Q**J|>K(ykzB{ zMUAGdqdR4Trt1*xD*?mabn0jUWXfr!uQ6EfzpmXIM+!dulvy=Spnv{5yBR zN|uiH-y{iVP*Hx0M|LFV;!(q*$?geXZK8T#=w$Eud{Dqa$A3(TI7TfCDhisvon3uO zix1mZIzPf5=1J&5K-s2~r7wA9>_An2!&rg7IlJ^Wb8w?@^TuIQC`9evgp{a^f`7RH zd)r*aSMp%iH{jhE0m3+2MpB3Q7~}oH(bvn}uV!Akl0|A$7>=$bOxo8aefnE)mC3C$ z2lt&V`qU%%d1!pvMivxbHF8_vYPjHpR?dn_j8c>x{dH}Ob?Qd(vgr`&?*7GejV*xV zY-r^lK`QdXr@C&CJa4<9Z|Ob6a?G?Rv+vIXZ_$m-M|PAcZFwNx6d45mus87v*lDrh z{Kk%4(eE2Yzb8$eGf&*s?9E#D5pit)%UQ9p@aHh2iYvQUCr>f5qP4TxWlZqSjF^D^UuGR9(1jxV?-Pb$hV-usO1bu zgvsCkN>egrE-ZWJwSI-{%qPB^%_78@P-yn-sx8;wy*^@WJN3xB*?=UpudR=}RwO>s zu7=zW?VCWloA!n2q&0?7U87wVr3ac#g=>o|U9~w+7sE|w^nUK)3O6SS{qW$hj_Xhd zbST-cbX2Z!uYhyd0o1(IuLO{jZDCgc5+e7tH_oRBWVB1$s(jA~8oigvUl%0(tnn8t zo&!C@&xpK23V4>BCTM;%q;e+5SRZcPV~am`=@&_I?wdD%`U=k))}BI%Mgmo#`uT*( z)E@u@PJ_$FPsUGX$aqeYDNn82>h?n7@>QFIYUzS(R&xq5M1{I#;{J_nn2OvhoLu>6 zQe)yxE1_B7AJn}KZAtxvnd%1*Rhn6YbR0i~OlPh^*SGR_e2MxQSJ)~8rD8)yQ z#37DLn1PUUzYOYeG~+^*u5Ec#mB{H6Rao`~M-*k{Z^Y1}#P6jrMA){V0rBY0BKFVU z+b6r4Y~d)gE!$cen6i3CsDhSL@WU1cCLOAm17nUiE@~jW@0NU zf+~2E0b^Sv_r#Y6J(B{#j6e`|ZaK>|`L_}3#FfB^XC$5G(|L>uiffs zqpg!|hGXVTWoD+-SfZ7c8kwb*Cb(s}AzI>6z9F{hG**uNO3DhdL_!5E1;YX>XR>mk zR6roL#uNn+OLS_yi<29+3xtNntb+fp zNEylBlydEcBhO!o|CEdrl1de+cBk;HnkA6OuZX{#-TDiYy(P{IufWFP%wCd7Db{xi zZ%)k+3hFyESRNsnE2pxyX8>Fzg|{^sm*yI);5(+Hw7Mgp3r_HwDmC%o(tiwH6uTywd2(_`kfBWAh)IaKpD|qeoH}q`a*c7Ke<-?|M_xV z+_5kAj|X(i&qAx4d@p@ogXwo)OS^Ub1O>q5SY>kKxAm|<$Ay8j)XOirZGuo+8;Qwg z`Z$Brqq~lzwooHT?lDfOFA+@knDG%L5A^0u&L>_0jja`dXCXgo0thOEk>^Z&8UkFQ zmiFhfOd~A{V2SfZtvk9z7l%=pxphaZGcK$q8T+V4q-EoAAnD5Ae86~75Lr$7Hr9}r zR^6i{-!8f!e=kun09#Fn=Vy=x-#*@0yN<{#`z*ZMPN$%$gFI?2gz$oIWvfH}7`DFyGIZ|7 z1?zuuO^>F?Sf}eTSuu_)w=CvFI+Op6FjohOn@=b6G!%4W=YUn=b`+VmubDk*xQE|vd5xx5t@foVy~G&}ch`{z+|cO^k2Q5xx4RPexCm$i>fMP{ z8Yh96xGiMAu$wfXDEppF9uaA*sAkrZN}Y7woliu8Vd*u#YXg>>{ojUyAPYZ*FXX0T1Knb)M?zkMdMb;mfA@c$R_B>^Hr$KC3Qo zSNLbwkS%p9tvU%L>fV`YXSV_NL~ExWA{gXSLONrb+d|GBPqJc_44sbRr`k;f>We>3 zeh~AxI<6|%U8iM@tM@1OwrB551=rS^xWeZii))>U8&r{t9`}j`>>D}{!F6tqp(cB+ zFO?%`JxX<5a>r*TFu{_0Hj^zv|7N7@J;xWiFbYDbYu?-2R9bYBrF%J0?l7{yJ&MSP zOqd_B;z`QlhjkYe9WFss@UrHtPs5;ShWYuNs@)~*)$Jc;YGv-NuN!NKky~17TiHHs zPDj^9HKY_=kfROsnijPng%JR#{=Y{N*#8<7(3CQ1&Ok4ud$T>AEQE5!-t!uLs@t&? z3n`&wGLSeF;unfgVF<}Vh1JAlXhc8^eTaTzSg9zanSYjmt|#ua5^ZtQ)jQ~Q@d9F- z=I&MQPmi62R<5cJ0tQ5mzX)1`BNZ|o`={yvW!|~eR(W7|AayW<m41z=YTLGeN`5pU8b)bCT4%dLQr z_jf>5fASo#)a0rK&$L+hxZj&>c8QM2b!#46c|d&m*VS~;Pz{}x*W(bgU%&gjS}IY} z`sh31U_((>OK?NoPn-Z{%Kr>du96F4n~(2S2-uoI5Q3}DrA&`^OLDdnshin$P}MzN z$W1=IO7A5=fZ^SBr>n+8(S0pP>!MYkE3QmbdS;Z_>P5I$qeEcjR;9 zACfdf=ksaXdC1^^ivzf}&=kWq$5SBal9gzXxYm)}f~ghxv&x+8Air=oEVTl9^$~Oh zbzWZXY;Z4o`4tq9y{`G}^vv|k8qzMk>YfL(jR<;HN$bX4Gw;|{qmC)W*M5A1iLDR_ z=^$T87hQ%A+p@lsiHzZ;bL#KefX@MY3aLRsM4%2s87vzs$%7XV{#}pjJ~eWG)dAv& zAkO?c+DpCr>i?wl-L1dvJOhHtk}&)P!b)bJ&e%?5sW%28tfd1|g65z@$?2+-Wa)#m zIxM%prp!jtCX|E9N+3;W(2(Fhaz~sX%E15dRkE%P$e-@L zgWK;K#sZW1$iz~R9QJd$LsW}OW*QjR}~s*!dRiWL>LJAncy= z*1Iu|l??0yx+0<}K-A2lXZp09g(wo`^5w-=Li_YWpb4)dmOmlqDnL%p4DIV|1_4b> z>42llvcs-s_sG`S2(BC2Ly_qI@lC9?jt;|JHj*%T{QSbeaM&MN)jcr4N}KEvz5K!#m%g6AAL7Io;%!aKh;XXlXXj zV%)roem1k5I3#db{*WHa0Gz4urToLpOQI9J*li)Ucr_cS{q_{37hwP%T2L8KhilXb zQU!k!^Y5X=5w26?0(&j7C)cG#mgldr5Rw(-SeBea=#T!&9hVo+kr2`evciqL%~1ug@siN=V0RsmOFT_+cUEny1685g^;8p6H{;o>5+8 zB|ilXEhmqxcr2IhRU|fQr7?RN3O-QZW5ZV;aJCrxlwcvgRQw|iqdk%sF#DsE+_ihl z);(@%whMvZVibEdbgtJVbl0Mmm(yb((mm0NBHgY!lg}zL;UIMIt7`&CWeu^l=%C9` zFEvAQdvBOq->&QA3TG)BOYh7P$gjfzS02^gUGA0np?GZJw?(V4@Z%*!1v^mO=? z)eIZ7%O`8rOgz0#WL>G^fr_UEHDRIN_?x$6&dXWk3)N^mE&V+J2Il4y z>Sfhr_(c`!9sPmkJP!@VzKOX&H;%MS&Y5me)FKmMw24$QC%g z0Pu+<5LtqaL0j<6#I}pWgtJ+=C;VV?c>zamE(PZ16K{opW-ANpeV=4UCRc5%S#Gr`kiTTby$pl!$Q{IK*6sdUp5ZjM3y8BRrVJhAhK8>NGW12;E2Z^4TwZfLi+pE zV-RD*p-3rRo_%J=jFpL%i>t|I_n~=RxSd)`KO#CyrOh-h!{-;_zLT)xY#O$}gnzi% zIf9>9&Np!9;dohCG^9>_qg?{H&Tin9rMh@XZ29r_15 zwcu$kao@jNhz98IL_|M90EKcutYpb`d*bZ0mR;z^@pb`NZ)<8o_?x&|r$a1BL^)bW zhKIPek=HloEq5ZNr0R>z?(t^A?e$JGVJuYO5}1ziB)@$RU?emEc%ej{@B|8Q?Y))D zX6$L&U?nCifSU@$xTW=OjS{f6OCNw5%bK!e;720L^J{lY#Zt1f?@jM3$VN>tRl4jg zt>!`9+^!%z>Kq&ol`;ohLzXy+ljI5l9%)E?VhxszjBto@mTXvCwYb(tmUtd6hOcp6 z$FW#t9(Cb?LNSu z{pigUHEiP=(BAKTyL)EB0s-55qS%umh{u%jN}Udc1Vu{Y@?8LcWeqK`;as>4Lh-d5 z7Cs@H4Kp~*nOYI2SWs-DNa2A?67p;1=Hj)#d@B)2KV`833UYXENxhq*sM(y{J{(1M z;K&vya_tS#Zs{r&P6Z0StJ%o7i6XPo!us|c10NeE9;;ysishSwMgGkW08UI8jT;dx zS#5d$Z~K{WJh2&GK3yLu3wr?x`byhK3}zX&h8Jv_SStl|BdRL#+}~_(_?qh4*NE5} z@%WXI6_N&Ux+9OmF+h%1!{q%7-nCtQ!y2wmx}C^iZjK6IA9sJ#fgxj)+ zavWay9+YB!ymce@3cKbi#vAqlAIB19i5#fe-E@f=;E2Jc4evk{eV{t;4c%3NG8-w#|M4Fw%Dp8drLD0022-A;)}t~(coa? z>kL0Y(@O=#`mu`^&|pcw`XKJzk-*3m)#4)D4A__IlRL!o)?hI#QYp}rb|4417;|cO z|9oUoagkXqpc_(24>YG0*FYATOqo^22Z;d09ZPpDf$s45!N!LZ?L?JJs^NbB zHBNiIFF0PYCpcC?*)Jz5?>^#piZ&5YLh$0;)410?F_)!;E44m4pE?u1asNApU)S6x z$60itXKHA8%qM>QaI)oAe%czlvO*jY$tq;&x>Wq z6-82e1DW%H`2Qo$d%3b+lIVA(eYBRta#+)oxEU%9P(DgcNA?$gC-toFn*waiquqLX zf7lM_O$MHeJQl##%z2M#97mqlTmypmH?ZL!O6G^7nuj&<;jP2UqH1C*2jQx~G;=vv zV-diiD%0Dz5xf1Tfe>%nFNB1LPt#um<5^Yh>|PbjEoFiz3>DZ|&A`+~%k%Gk=fhhe zA|tyQDCLI-$*L)~iiZF9no-NE?LFKF2CHO*RCnQWzu3oC(WPNClnB=r$V`X)zPG`^ z36}MS=|T3N0kB&8J1ii%oE6ZlQrf4agpZgN&$M&vwI1HQ&AY1Z-r^sx?jhLB zw|q2bI>g7few8+@O~_Aj7SaHs7Q&(_6!$x(B9<*ILg*b^j}}}P+iW{zvdaw&9KK?x zPWT%*qV0K_B(BFkmRdAjp9al43kg#FFn-ix;Pm{cNG*`()E?%JW5ZAYoeDa%+X z2RDFe$enBsdpw+AIdSRv@9g0OIIEmj%1_VDz@6a9rxEid3RGOVmJf4_0DuY}W_ESC zuE$#eDn&Vd7^=m}s$xyHmoG`=3-5k_S>EIp8=9OZE$3sk`d`&fpT zE^K134`{An=zVl_>lg9O)`)HY;{l^TJlYdO#rD3Qascq=3ner#U!A3zr-jNw%)8`@ ztkxNkjwjT@&2`;jCgS6xuY6>>zE>n#tigC|f+6(MXRn4e!7}^v;}pC4sFh~Z7b<02 zu?6GZ-p?tr5nk!ODvk+H{K27d)WtDC!#wht;wRaEZE_)`WAaoC4&}vU&1@x&Shw_t zY`gVG@hIa}l@mz5h$I}=BVJt^js#vyz}_vz=)Ds60S#kTF7PP2Dp~lNwUQN}M6Bf3 zjXMo3>fR!?PN-5n?GGJYR5BlP>P8N*7}b&C4i#G`O7hX0^kJ`Vyo-Jj2lBB;%`tg@ zAe(UE8_Lr6KxzqiwGerJ3>jBJ|9E`z`Pr(EXXZ6G>@s4!yq_Z; zH4(sRz;OjV)Y`(`3c<-_HIim8|Tb&Poimi*>P52>kupJwbD31V|v?xE7h7f zcVsv^ha3BZl8AAPa_){xvC}!uR^l%I&@j;pvLpG|eLw}!xO#ClD6n1}@0ECq95HVT zJU{8F1WeeOU^rdw^Mry+u`0CXUET)*7mCF1i$zWzq56YQGSV9017S)Hm|J8n!Rgln zB_WL==%ok#(V(H z&7RD3E{C0cFoB7hZ2&759Id#e1PvHsBej(>z+b_60x%3fle$2_vS75_3JuaxD}3%m(v)o{#&e* zf;1K|fj(5wb}soIG5=2@V`{;t$)4B>@yOWkE_S=^^kLxCvZ^NcLBa-891 z3sW2)z(yr*))kjzHD?zrU-F0f?XKHM<9^RnYp7HpDw(jZ>8P9A5#9l2f~$~A!|jtu ze^tV4z@$J!Swoms(%5xi*ZjW`DBN>|>gnOv`~iL;98WFgqqM}_K5$~gFGO|&)(yjM zQtiQLeX+i1oG~POEI_=Zgvpa*33@=-7}-gUr# z>EAs}L+1F6oiOv&8dZp_K|3YLN&>s=bNbjlZd1DCfq@fR-(PV-fw??SIBSo`d7jxY zO`km3d=P@y4uweTnoQdP{^1$QX;DypZ%-^2H1!;JRLKavsLS*GFYNco4*{G+m$LE| z8T=U2L8>q{+w01s>`;V(lv$nUs`Zg$`Vp=g@hUHN#yZLyYf@w+>KJ%#Ra#d@QX912 z-DpVN@%i;)hnT&(IYL{KW&AJLeiVE3j-4e;dod1FVTkY~2VKHjIuP)U#aLA_{(}m>=~e z5%DFnUhWdEO6QYcW#g(wfNKNh++*P(b=Hx#=VUY01Wn2>Y#z}xGOpEBXjvjGsSwl*DXc+8kRLlxL;{Z+Qr;>0t8>B5H z@E4R0$F^tLoRjF`Pc~8MFCF>!QQvrxdK(JyTLh)w1MF~wq-GWqN0rwU*gnc5qdwMJo4jHH?B2*%ilQabw*Kf9~~#Z%R5?UqJ%_e@zOrF%jXeC-Lqnx;L=MO}D` lx!Z`~iy>&6ZC8tNHWttD$V-kc0l%H*w|oCC*3PJN{|BQ%dmR7( literal 0 HcmV?d00001 diff --git a/out/assets/images/map/mission-action.png b/out/assets/images/map/mission-action.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ede331b5b8831427556fdf0524ce124518d7d8 GIT binary patch literal 17153 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 literal 0 HcmV?d00001 diff --git a/src/core/NameGenerator.ts b/src/core/NameGenerator.ts index f2c6ba8..36d93c2 100644 --- a/src/core/NameGenerator.ts +++ b/src/core/NameGenerator.ts @@ -8,7 +8,7 @@ module TS.SpaceTac { private random: RandomGenerator; constructor(choices: string[], random: RandomGenerator = new RandomGenerator()) { - this.choices = choices.slice(0); + this.choices = acopy(choices); this.random = random; } diff --git a/src/core/Shop.spec.ts b/src/core/Shop.spec.ts index ea86cbd..1dda8a6 100644 --- a/src/core/Shop.spec.ts +++ b/src/core/Shop.spec.ts @@ -31,5 +31,41 @@ module TS.SpaceTac.Specs { expect(shop.stock).toEqual([equ1, equ2]); expect(fleet.credits).toEqual(1000); }); + + it("generates secondary missions", function () { + let universe = new Universe(); + universe.generate(4); + let start = universe.getStartLocation(); + + let shop = new Shop(); + expect((shop).missions.length).toBe(0); + + let result = shop.getMissions(start, 4); + expect(result.length).toBe(4); + expect((shop).missions.length).toBe(4); + + let oresult = shop.getMissions(start, 4); + expect(oresult).toEqual(result); + + result.forEach(mission => { + expect(mission.main).toBe(false); + }); + }); + + it("assigns missions to a fleet", function () { + let shop = new Shop(); + let player = new Player(); + let mission = new Mission(new Universe()); + (shop).missions = [mission]; + + expect(shop.getMissions(new StarLocation(), 1)).toEqual([mission]); + expect(player.missions.secondary).toEqual([]); + + shop.acceptMission(mission, player); + + expect((shop).missions).toEqual([]); + expect(player.missions.secondary).toEqual([mission]); + expect(mission.fleet).toBe(player.fleet); + }); }); } diff --git a/src/core/Shop.ts b/src/core/Shop.ts index a0c71a3..5f94786 100644 --- a/src/core/Shop.ts +++ b/src/core/Shop.ts @@ -15,6 +15,9 @@ module TS.SpaceTac { // Random generator private random: RandomGenerator + // Available missions + private missions: Mission[] = [] + constructor(level = 1, stock: Equipment[] = [], count = 40) { this.level = level; this.stock = stock; @@ -98,5 +101,33 @@ module TS.SpaceTac { return false; } } + + /** + * Get a list of available secondary missions + */ + getMissions(around: StarLocation, max_count = 3): Mission[] { + while (this.missions.length < max_count) { + let generator = new MissionGenerator(around.star.universe, around.star.level, around, this.random); + let mission = generator.generate(); + this.missions.push(mission); + } + + return this.missions; + } + + /** + * Assign a mission to a fleet + * + * Returns true on success + */ + acceptMission(mission: Mission, player: Player): boolean { + if (player.missions.secondary.length < 2 && remove(this.missions, mission)) { + mission.fleet = player.fleet; + add(player.missions.secondary, mission); + return true; + } else { + return false; + } + } } } \ No newline at end of file diff --git a/src/core/Star.spec.ts b/src/core/Star.spec.ts index d8129cf..9784efa 100644 --- a/src/core/Star.spec.ts +++ b/src/core/Star.spec.ts @@ -2,10 +2,10 @@ module TS.SpaceTac.Specs { describe("Star", () => { it("lists links to other stars", () => { var universe = new Universe(); - universe.stars.push(new Star(universe, 0, 0)); - universe.stars.push(new Star(universe, 1, 0)); - universe.stars.push(new Star(universe, 0, 1)); - universe.stars.push(new Star(universe, 1, 1)); + universe.stars.push(new Star(universe, 0, 0, "Star A")); + universe.stars.push(new Star(universe, 1, 0, "Star B")); + universe.stars.push(new Star(universe, 0, 1, "Star C")); + universe.stars.push(new Star(universe, 1, 1, "Star D")); universe.addLink(universe.stars[0], universe.stars[1]); universe.addLink(universe.stars[0], universe.stars[3]); @@ -26,6 +26,11 @@ module TS.SpaceTac.Specs { expect(universe.stars[3].getLinkTo(universe.stars[0])).toEqual(universe.starlinks[1]); expect(universe.stars[3].getLinkTo(universe.stars[1])).toBeNull(); expect(universe.stars[3].getLinkTo(universe.stars[2])).toBeNull(); + + let neighbors = universe.stars[0].getNeighbors(); + expect(neighbors.length).toBe(2); + expect(neighbors).toContain(universe.stars[1]); + expect(neighbors).toContain(universe.stars[3]); }); }); } diff --git a/src/core/Star.ts b/src/core/Star.ts index 3aa2d43..bade1ef 100644 --- a/src/core/Star.ts +++ b/src/core/Star.ts @@ -89,6 +89,14 @@ module TS.SpaceTac { return `Star ${this.name}`; } + /** + * Add a location of interest + */ + addLocation(type: StarLocationType): StarLocation { + let result = new StarLocation(this, type); + return result; + } + // Get the distance to another star getDistanceTo(star: Star): number { var dx = this.x - star.x; @@ -159,6 +167,13 @@ module TS.SpaceTac { return result; } + /** + * Get the neighboring star systems (single jump accessible) + */ + getNeighbors(): Star[] { + return nna(this.getLinks().map(link => link.getPeer(this))); + } + // Check if a location is far enough from all other ones private checkMinDistance(loc: StarLocation, others: StarLocation[]): boolean { return others.every((iloc: StarLocation): boolean => { diff --git a/src/core/Universe.ts b/src/core/Universe.ts index 5cbb731..5257d5d 100644 --- a/src/core/Universe.ts +++ b/src/core/Universe.ts @@ -13,10 +13,31 @@ module TS.SpaceTac { radius = 5 // Source of randomness - random = RandomGenerator.global; + random = RandomGenerator.global - // Generates a universe, with star systems and such + /** + * Add a single star + */ + addStar(level = 1, name?: string): Star { + let result = new Star(this, 0, 0, name || `Star ${this.stars.length + 1}`); + result.level = level; + this.stars.push(result); + return result; + } + + /** + * Generates a random universe, with star systems and locations of interest + * + * This will also : + * - create a network of jump links between star systems + * - add random shops + * - define a progressive gradient of enemy levels + */ generate(starcount = 50): void { + if (starcount < 4) { + starcount = 4; + } + while (this.stars.length == 0 || any(this.stars, star => star.getLinks().length == 0)) { this.stars = this.generateStars(starcount); @@ -27,7 +48,7 @@ module TS.SpaceTac { this.generateWarpLocations(); this.stars.forEach((star: Star) => { - star.generate(); + star.generate(this.random); }); this.setEncounterLevels(); diff --git a/src/core/missions/MainStory.spec.ts b/src/core/missions/MainStory.spec.ts index 987dffb..754f53a 100644 --- a/src/core/missions/MainStory.spec.ts +++ b/src/core/missions/MainStory.spec.ts @@ -30,13 +30,13 @@ module TS.SpaceTac.Specs { let fleet_size = fleet.ships.length; checkPart(story, 0, "^Travel to Terranax galaxy$"); - (story.current_part).skip(); + (story.current_part).skip(); checkPart(story, 1, "^Find your contact in .*$"); goTo(fleet, (story.current_part).destination); checkPart(story, 2, "^Speak with your contact"); - (story.current_part).skip(); + (story.current_part).skip(); checkPart(story, 3, "^Go with .* in .* system$"); expect(fleet.ships.length).toBe(fleet_size + 1); diff --git a/src/core/missions/MainStory.ts b/src/core/missions/MainStory.ts index 12051f0..1fa440d 100644 --- a/src/core/missions/MainStory.ts +++ b/src/core/missions/MainStory.ts @@ -17,27 +17,27 @@ module TS.SpaceTac { let start_location = nn(fleet.location); // Arrival - let dialog = this.addPart(new MissionPartDialog(this, [], "Travel to Terranax galaxy")); - dialog.addPiece(null, "Wow ! From what my sensors tell me, there is not much activity around here."); - dialog.addPiece(null, "I remember the last time I came in this galaxy, you needed to be aware of collisions at all time, so crowded it was."); - dialog.addPiece(null, "Well...I did not pick a signal from our contact yet. We should be looking for her in this system."); + let conversation = this.addPart(new MissionPartConversation(this, [], "Travel to Terranax galaxy")); + conversation.addPiece(null, "Wow ! From what my sensors tell me, there is not much activity around here."); + conversation.addPiece(null, "I remember the last time I came in this galaxy, you needed to be aware of collisions at all time, so crowded it was."); + conversation.addPiece(null, "Well...I did not pick a signal from our contact yet. We should be looking for her in this system."); // Get in touch with our contact let contact_location = randomLocation(random, [start_location.star], [start_location]); let contact_character = new Ship(null, "Osten-37", ShipModel.getRandomModel(1, random)); contact_character.fleet.setLocation(contact_location, true); this.addPart(new MissionPartGoTo(this, contact_location, `Find your contact in ${contact_location.star.name}`)); - dialog = this.addPart(new MissionPartDialog(this, [contact_character], "Speak with your contact")); - dialog.addPiece(contact_character, "Finally, you came!"); - dialog.addPiece(contact_character, "Sorry for not broadcasting my position. As you may have encountered, this star system is not safe anymore."); - dialog.addPiece(null, "Nothing we could not handle, we just hope the other teams have not run across more trouble."); - dialog.addPiece(contact_character, "I do not even know if the other contacts made it to their rendezvous point. Jumping between systems has become quite a hassle around here."); - dialog.addPiece(null, "And we still do not know why those rogue fleets are trying to lockdown the whole galaxy? Did you have some interaction with them?"); - dialog.addPiece(contact_character, "Well, they tend to shoot you on sight if you go near a location they defend. Do not know if that qualifies as interaction though..."); - dialog.addPiece(null, "So where do we go from here? In your last message, you told us of a resistance group growing."); - dialog.addPiece(contact_character, "Yes, some merchants and miners have rallied behind a retired TSF general, but I lost contact with them weeks ago."); - dialog.addPiece(contact_character, "We may go to their last known location, but first I want you to see something in a nearby system."); - dialog.addPiece(null, "Ok, let's go..."); + conversation = this.addPart(new MissionPartConversation(this, [contact_character], "Speak with your contact")); + conversation.addPiece(contact_character, "Finally, you came!"); + conversation.addPiece(contact_character, "Sorry for not broadcasting my position. As you may have encountered, this star system is not safe anymore."); + conversation.addPiece(null, "Nothing we could not handle, we just hope the other teams have not run across more trouble."); + conversation.addPiece(contact_character, "I do not even know if the other contacts made it to their rendezvous point. Jumping between systems has become quite a hassle around here."); + conversation.addPiece(null, "And we still do not know why those rogue fleets are trying to lockdown the whole galaxy? Did you have some interaction with them?"); + conversation.addPiece(contact_character, "Well, they tend to shoot you on sight if you go near a location they defend. Do not know if that qualifies as interaction though..."); + conversation.addPiece(null, "So where do we go from here? In your last message, you told us of a resistance group growing."); + conversation.addPiece(contact_character, "Yes, some merchants and miners have rallied behind a retired TSF general, but I lost contact with them weeks ago."); + conversation.addPiece(contact_character, "We may go to their last known location, but first I want you to see something in a nearby system."); + conversation.addPiece(null, "Ok, let's go..."); // Go take a look at the graveyard let nearby_systems = nna(start_location.star.getLinks().map(link => link.getPeer(contact_location.star))); diff --git a/src/core/missions/Mission.ts b/src/core/missions/Mission.ts index 734c83c..d354b3d 100644 --- a/src/core/missions/Mission.ts +++ b/src/core/missions/Mission.ts @@ -21,13 +21,17 @@ module TS.SpaceTac { // Indicator that the mission is completed completed: boolean - constructor(universe: Universe, fleet: Fleet, main = false) { + // Title of this mission (should be kept short) + title: string + + constructor(universe: Universe, fleet = new Fleet(), main = false) { this.universe = universe; this.fleet = fleet; this.main = main; this.parts = []; this.completed = false; this.current_part = new MissionPart(this, "Empty mission"); + this.title = main ? "Main story" : "Secondary mission"; } /** diff --git a/src/core/missions/MissionGenerator.spec.ts b/src/core/missions/MissionGenerator.spec.ts new file mode 100644 index 0000000..25fc52c --- /dev/null +++ b/src/core/missions/MissionGenerator.spec.ts @@ -0,0 +1,24 @@ +module TS.SpaceTac.Specs { + describe("MissionGenerator", () => { + it("generates escort missions", () => { + let universe = new Universe(); + let star1 = universe.addStar(1); + let loc1 = star1.locations[0]; + let star2 = universe.addStar(2); + let loc2 = star2.locations[0]; + let star3 = universe.addStar(3); + let loc3 = star3.locations[0]; + universe.addLink(star1, star2); + universe.addLink(star2, star3); + + let generator = new MissionGenerator(universe, 3, loc2); + let mission = generator.generateEscort(); + + expect(mission.title).toBe("Escort a ship to a level 3 system"); + expect(mission.parts.length).toBe(1); + expect(mission.parts[0] instanceof MissionPartEscort).toBe(true); + let escort = mission.parts[0]; + expect(escort.destination).toBe(loc3); + }); + }); +} diff --git a/src/core/missions/MissionGenerator.ts b/src/core/missions/MissionGenerator.ts new file mode 100644 index 0000000..f522f64 --- /dev/null +++ b/src/core/missions/MissionGenerator.ts @@ -0,0 +1,45 @@ +module TS.SpaceTac { + /** + * Random generator of secondary missions that can be taken from + */ + export class MissionGenerator { + universe: Universe + level: number + around: StarLocation + random: RandomGenerator + + constructor(universe: Universe, level: number, around: StarLocation, random = RandomGenerator.global) { + this.universe = universe; + this.level = level; + this.around = around; + this.random = random; + } + + /** + * Generate a single mission + */ + generate(): Mission { + let generators = [ + bound(this, "generateEscort") + ]; + + let generator = this.random.choice(generators); + let result = generator(); + // TODO Add reward + return result; + } + + /** + * Generate an escort mission + */ + generateEscort(): Mission { + let mission = new Mission(this.universe); + let ship = new Ship(); + let dest_star = minBy(this.around.star.getNeighbors(), star => Math.abs(star.level - this.level)); + let destination = this.random.choice(dest_star.locations); + mission.addPart(new MissionPartEscort(mission, destination, ship)); + mission.title = `Escort a ship to a level ${dest_star.level} system`; + return mission; + } + } +} diff --git a/src/core/missions/MissionPartDialog.spec.ts b/src/core/missions/MissionPartConversation.spec.ts similarity index 86% rename from src/core/missions/MissionPartDialog.spec.ts rename to src/core/missions/MissionPartConversation.spec.ts index 0ed8087..fd27c0c 100644 --- a/src/core/missions/MissionPartDialog.spec.ts +++ b/src/core/missions/MissionPartConversation.spec.ts @@ -1,11 +1,11 @@ module TS.SpaceTac.Specs { - describe("MissionPartDialog", () => { - it("advances through dialog", function () { + describe("MissionPartConversation", () => { + it("advances through conversation", function () { let universe = new Universe(); let fleet = new Fleet(); let ship1 = new Ship(null, "Tim"); let ship2 = new Ship(null, "Ben"); - let part = new MissionPartDialog(new Mission(universe, fleet), [ship1, ship2], "Talk to Tim"); + let part = new MissionPartConversation(new Mission(universe, fleet), [ship1, ship2], "Talk to Tim"); expect(part.title).toEqual("Talk to Tim"); expect(part.checkCompleted()).toBe(true, "No dialog piece"); @@ -36,7 +36,7 @@ module TS.SpaceTac.Specs { let universe = new Universe(); let fleet = new Fleet(); let ship = new Ship(null, "Tim"); - let part = new MissionPartDialog(new Mission(universe, fleet), [ship]); + let part = new MissionPartConversation(new Mission(universe, fleet), [ship]); part.addPiece(null, "Hello !"); part.addPiece(ship, "Hiya !"); diff --git a/src/core/missions/MissionPartDialog.ts b/src/core/missions/MissionPartConversation.ts similarity index 86% rename from src/core/missions/MissionPartDialog.ts rename to src/core/missions/MissionPartConversation.ts index e9295d7..3bff2bd 100644 --- a/src/core/missions/MissionPartDialog.ts +++ b/src/core/missions/MissionPartConversation.ts @@ -2,9 +2,9 @@ module TS.SpaceTac { /** - * A single dialog piece + * A single conversation piece */ - interface DialogPiece { + interface ConversationPiece { // Interlocutor (null for the player's fleet) interlocutor: Ship | null @@ -13,14 +13,14 @@ module TS.SpaceTac { } /** - * A mission part that triggers a dialog + * A mission part that triggers a conversation */ - export class MissionPartDialog extends MissionPart { + export class MissionPartConversation extends MissionPart { // Other ships with which the dialog will take place interlocutors: Ship[] // Pieces of dialog - pieces: DialogPiece[] = [] + pieces: ConversationPiece[] = [] // Current piece current_piece = 0 @@ -70,7 +70,7 @@ module TS.SpaceTac { /** * Get the current piece of dialog */ - getCurrent(): DialogPiece { + getCurrent(): ConversationPiece { if (this.checkCompleted()) { return { interlocutor: null, @@ -88,7 +88,7 @@ module TS.SpaceTac { /** * Get the interlocutor from the player fleet that will say the piece */ - private getFleetInterlocutor(piece: DialogPiece): Ship | null { + private getFleetInterlocutor(piece: ConversationPiece): Ship | null { if (this.fleet.ships.length > 0) { // TODO Choose a ship by its personality traits return this.fleet.ships[0]; diff --git a/src/ui/Preload.ts b/src/ui/Preload.ts index 8425d29..01b0594 100644 --- a/src/ui/Preload.ts +++ b/src/ui/Preload.ts @@ -18,6 +18,7 @@ module TS.SpaceTac.UI { this.loadImage("common/arrow.png"); this.loadImage("common/button-ok.png"); this.loadImage("common/button-cancel.png"); + this.loadImage("common/dialog.png"); this.loadSheet("common/dialog-close.png", 92, 82); this.loadImage("menu/title.png"); this.loadImage("menu/button.png"); @@ -70,6 +71,7 @@ module TS.SpaceTac.UI { this.loadImage("map/location-warp.png"); this.loadSheet("map/status.png", 32); this.loadSheet("map/missions.png", 70); + this.loadSheet("map/mission-action.png", 192, 56); this.loadImage("character/sheet.png"); this.loadImage("character/close.png"); this.loadImage("character/ship.png"); diff --git a/src/ui/common/UIComponent.ts b/src/ui/common/UIComponent.ts index 925b8db..be87a89 100644 --- a/src/ui/common/UIComponent.ts +++ b/src/ui/common/UIComponent.ts @@ -231,8 +231,8 @@ module TS.SpaceTac.UI { /** * Add a static image, positioning its center. */ - addImage(x: number, y: number, key: string, scale = 1): void { - let image = new Phaser.Image(this.container.game, x, y, key); + addImage(x: number, y: number, key: string, frame = 0, scale = 1): void { + let image = new Phaser.Image(this.container.game, x, y, key, frame); image.anchor.set(0.5, 0.5); image.scale.set(scale); this.addInternalChild(image); diff --git a/src/ui/common/UIDialog.ts b/src/ui/common/UIDialog.ts index b0dfc0e..7db82b8 100644 --- a/src/ui/common/UIDialog.ts +++ b/src/ui/common/UIDialog.ts @@ -7,7 +7,7 @@ module TS.SpaceTac.UI { * When a modal dialog opens, an overlay is displayed behind it to prevent clicking through it */ export class UIDialog extends UIComponent { - constructor(parent: BaseView, width: number, height: number, background: string) { + constructor(parent: BaseView, width = 1495, height = 1080, background = "common-dialog") { super(parent, width, height, background); if (parent.dialogs_layer.children.length == 0) { @@ -23,6 +23,7 @@ module TS.SpaceTac.UI { */ addOverlay(layer: Phaser.Group): void { let overlay = layer.game.add.button(0, 0, "common-transparent", () => null); + overlay.input.useHandCursor = false; overlay.scale.set(this.view.getWidth() / overlay.width, this.view.getHeight() / overlay.height); layer.add(overlay); } @@ -30,7 +31,7 @@ module TS.SpaceTac.UI { /** * Add a close button */ - addCloseButton(key: string, x: number, y: number, frame = 0, frame_hover = 1): void { + addCloseButton(key = "common-dialog-close", x = 1325, y = 131, frame = 0, frame_hover = 1): void { this.addButton(x, y, () => this.close(), key, frame, frame_hover, "Close this dialog"); } diff --git a/src/ui/map/ActiveMissionsDisplay.ts b/src/ui/map/ActiveMissionsDisplay.ts index c8aedbf..4990788 100644 --- a/src/ui/map/ActiveMissionsDisplay.ts +++ b/src/ui/map/ActiveMissionsDisplay.ts @@ -8,7 +8,7 @@ module TS.SpaceTac.UI { private missions: ActiveMissions constructor(parent: BaseView, missions: ActiveMissions) { - super(parent, 520, 210); + super(parent, 520, 240); this.missions = missions; this.update(); @@ -21,10 +21,11 @@ module TS.SpaceTac.UI { this.clearContent(); let active = this.missions.getCurrent(); - let offset = 245 - active.length * 70; + let spacing = 80; + let offset = 245 - active.length * spacing; active.forEach((mission, idx) => { - this.addImage(35, offset + 70 * idx, "map-missions"); - this.addText(90, offset + 70 * idx, mission.current_part.title, "#d2e1f3", 22, false, false, 430, true); + this.addImage(35, offset + spacing * idx, "map-missions", mission.main ? 0 : 1); + this.addText(90, offset + spacing * idx, mission.current_part.title, "#d2e1f3", 20, false, false, 430, true); }); } } diff --git a/src/ui/map/ConversationDisplay.ts b/src/ui/map/ConversationDisplay.ts index aa252df..64af708 100644 --- a/src/ui/map/ConversationDisplay.ts +++ b/src/ui/map/ConversationDisplay.ts @@ -3,7 +3,7 @@ module TS.SpaceTac.UI { * Display of an active conversation */ export class ConversationDisplay extends UIComponent { - dialog: MissionPartDialog | null = null + dialog: MissionPartConversation | null = null player: Player on_end: Function | null = null @@ -21,7 +21,7 @@ module TS.SpaceTac.UI { */ updateFromMissions(missions: ActiveMissions, on_end: Function | null = null) { let parts = missions.getCurrent().map(mission => mission.current_part); - this.dialog = first(parts, part => part instanceof MissionPartDialog); + this.dialog = first(parts, part => part instanceof MissionPartConversation); if (this.dialog) { this.on_end = on_end; diff --git a/src/ui/map/MapLocationMenu.ts b/src/ui/map/MapLocationMenu.ts index d1059d1..f96cde9 100644 --- a/src/ui/map/MapLocationMenu.ts +++ b/src/ui/map/MapLocationMenu.ts @@ -34,7 +34,9 @@ module TS.SpaceTac.UI { if (location) { let actions: [string, Function][] = []; if (location.shop) { + let shop = location.shop; actions.push(["Go to dockyard", () => view.openShop()]); + actions.push(["Show jobs", () => new MissionsDialog(view, shop, view.player)]); } switch (location.type) { diff --git a/src/ui/map/MissionsDialog.ts b/src/ui/map/MissionsDialog.ts new file mode 100644 index 0000000..24392e9 --- /dev/null +++ b/src/ui/map/MissionsDialog.ts @@ -0,0 +1,69 @@ +module TS.SpaceTac.UI { + /** + * Dialog to show available missions + */ + export class MissionsDialog extends UIDialog { + shop: Shop + player: Player + location: StarLocation + + constructor(view: BaseView, shop: Shop, player: Player) { + super(view); + + this.shop = shop; + this.player = player; + this.location = player.fleet.location || new StarLocation(); + + this.refresh(); + } + + /** + * Refresh the dialog content + */ + refresh() { + this.clearContent(); + this.addCloseButton(); + + let offset = 160; + + let active = this.player.missions.getCurrent().filter(mission => !mission.main); + if (active.length) { + this.addText(this.width / 2, offset, "Active jobs", "#b8d2f1", 36); + offset += 110; + + active.forEach(mission => { + this.addMission(offset, mission.title, "Reward: ???", 0, () => null); + offset += 110; + }); + } + + let proposed = this.shop.getMissions(this.location); + if (proposed.length) { + this.addText(this.width / 2, offset, "Proposed jobs", "#b8d2f1", 36); + offset += 110; + + proposed.forEach(mission => { + this.addMission(offset, mission.title, "Reward: ???", 2, () => { + this.shop.acceptMission(mission, this.player); + this.refresh(); + }); + offset += 110; + }); + } + } + + /** + * Add a mission text + */ + addMission(yoffset: number, title: string, subtitle: string, button_frame: number, button_callback: Function) { + this.addImage(320, yoffset, "map-missions", 1); + if (title) { + this.addText(380, yoffset - 15, title, "#d2e1f3", 22, false, false, 620, true); + } + if (subtitle) { + this.addText(380, yoffset + 22, subtitle, "#d2e1f3", 20, false, false, 620, true); + } + this.addButton(1120, yoffset, button_callback, "map-mission-action", button_frame, button_frame + 1); + } + } +} \ No newline at end of file