From 5267c91ceacb06136f1f4d9d63b7832ab1cec7d6 Mon Sep 17 00:00:00 2001 From: iisaev Date: Thu, 29 Oct 2026 09:26:19 +0100 Subject: [PATCH] Document upright world planes; mod documentation --- .gitattributes | 30 +++ collection_settings.json | 14 ++ docs/assets/same-map-two-projections.jpg | Bin 0 -> 84827 bytes docs/en.md | 59 ++++++ docs/es.md | 59 ++++++ docs/ja.md | 59 ++++++ docs/ko.md | 59 ++++++ docs/ru.md | 59 ++++++ docs/vi.md | 59 ++++++ docs/zh.md | 59 ++++++ locale/collection_settings_en.properties | 3 + locale/collection_settings_es.properties | 3 + locale/collection_settings_ja.properties | 3 + locale/collection_settings_ko.properties | 3 + locale/collection_settings_ru.properties | 3 + locale/collection_settings_vi.properties | 3 + locale/collection_settings_zh.properties | 3 + locale/en.properties | 2 + locale/es.properties | 2 + locale/ja.properties | 2 + locale/ko.properties | 2 + locale/ru.properties | 2 + locale/vi.properties | 2 + locale/zh.properties | 2 + manifest.json | 17 ++ mod.jpg | Bin 0 -> 136331 bytes shaders/tile_lit.gdshader | 51 +++++ src/ITileProjection.cs | 19 ++ src/ITileRendererFactory.cs | 13 ++ src/ITileWorldPresentation.cs | 34 ++++ src/TileActorPose.cs | 17 ++ src/TileAssetCache.cs | 31 +++ src/TileAutotile.cs | 39 ++++ src/TileCanvasEffects.cs | 45 +++++ src/TileCanvasLayer.cs | 35 ++++ src/TileCanvasPresentation.cs | 243 +++++++++++++++++++++++ src/TileCanvasSprite.cs | 77 +++++++ src/TileDrawing.cs | 25 +++ src/TileFrame.cs | 15 ++ src/TileLight.cs | 11 + src/TileRenderScene.cs | 28 +++ src/TileRendererConsumer.cs | 11 + src/TileRendererRegistry.cs | 46 +++++ src/TileSceneChanges.cs | 9 + src/TileSurfaceCache.cs | 78 ++++++++ src/TileSurfaceChunk.cs | 10 + src/TileSurfaceField.cs | 13 ++ src/TileSurfaceRasterizer.cs | 96 +++++++++ src/TileVisual.cs | 21 ++ src/TileVisualPlacement.cs | 19 ++ tests/StubTileRendererFactory.cs | 12 ++ tests/TileRendererRegistryTests.cs | 31 +++ tests/TileSurfaceCacheTests.cs | 41 ++++ tests/TileSurfaceRasterizerTests.cs | 41 ++++ 54 files changed, 1620 insertions(+) create mode 100644 .gitattributes create mode 100644 collection_settings.json create mode 100644 docs/assets/same-map-two-projections.jpg create mode 100644 docs/en.md create mode 100644 docs/es.md create mode 100644 docs/ja.md create mode 100644 docs/ko.md create mode 100644 docs/ru.md create mode 100644 docs/vi.md create mode 100644 docs/zh.md create mode 100644 locale/collection_settings_en.properties create mode 100644 locale/collection_settings_es.properties create mode 100644 locale/collection_settings_ja.properties create mode 100644 locale/collection_settings_ko.properties create mode 100644 locale/collection_settings_ru.properties create mode 100644 locale/collection_settings_vi.properties create mode 100644 locale/collection_settings_zh.properties create mode 100644 locale/en.properties create mode 100644 locale/es.properties create mode 100644 locale/ja.properties create mode 100644 locale/ko.properties create mode 100644 locale/ru.properties create mode 100644 locale/vi.properties create mode 100644 locale/zh.properties create mode 100644 manifest.json create mode 100644 mod.jpg create mode 100644 shaders/tile_lit.gdshader create mode 100644 src/ITileProjection.cs create mode 100644 src/ITileRendererFactory.cs create mode 100644 src/ITileWorldPresentation.cs create mode 100644 src/TileActorPose.cs create mode 100644 src/TileAssetCache.cs create mode 100644 src/TileAutotile.cs create mode 100644 src/TileCanvasEffects.cs create mode 100644 src/TileCanvasLayer.cs create mode 100644 src/TileCanvasPresentation.cs create mode 100644 src/TileCanvasSprite.cs create mode 100644 src/TileDrawing.cs create mode 100644 src/TileFrame.cs create mode 100644 src/TileLight.cs create mode 100644 src/TileRenderScene.cs create mode 100644 src/TileRendererConsumer.cs create mode 100644 src/TileRendererRegistry.cs create mode 100644 src/TileSceneChanges.cs create mode 100644 src/TileSurfaceCache.cs create mode 100644 src/TileSurfaceChunk.cs create mode 100644 src/TileSurfaceField.cs create mode 100644 src/TileSurfaceRasterizer.cs create mode 100644 src/TileVisual.cs create mode 100644 src/TileVisualPlacement.cs create mode 100644 tests/StubTileRendererFactory.cs create mode 100644 tests/TileRendererRegistryTests.cs create mode 100644 tests/TileSurfaceCacheTests.cs create mode 100644 tests/TileSurfaceRasterizerTests.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3030c1a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,30 @@ +# Line endings: LF everywhere, on every OS, whatever core.autocrlf says. +* text=auto eol=lf + +# cmd.exe misreads labels and goto in LF batch files, so they stay CRLF. +*.bat text eol=crlf +*.cmd text eol=crlf + +# Binaries: never converted, never diffed as text. +*.png binary +*.jpg binary +*.jpeg binary +*.webp binary +*.svg text +*.ogg binary +*.wav binary +*.mp3 binary +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.dll binary +*.so binary +*.dylib binary +*.pdb binary +*.exe binary +*.zip binary +*.pck binary +*.moc3 binary +*.res binary +*.scn binary diff --git a/collection_settings.json b/collection_settings.json new file mode 100644 index 0000000..8fa22a4 --- /dev/null +++ b/collection_settings.json @@ -0,0 +1,14 @@ +{ + "settings": [ + { + "key": "tile.renderer", + "name": "collection_settings/projection", + "description": "collection_settings/projection_hint", + "group": "collection_settings/world_group", + "type": "choice", + "source": null, + "allow_custom": false, + "automatic": null + } + ] +} diff --git a/docs/assets/same-map-two-projections.jpg b/docs/assets/same-map-two-projections.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15aa14ce6b59be5df6896122c68e14a62c992330 GIT binary patch literal 84827 zcmeFYWl)^a^Da182*EYTAPE*UxJ!WG7TgK$I)l4}gpk2zf)5hh2|BpDyF-8h28W=5 z09k(bZr!cg+7J7`b@#(o-F~ajmshHvK3)Cx>GPa_i~lwNL@El(3IH@T008aj0{mM6 z$N?}ho&^0rBPJ#$*0UGSo?&4Ow6aJgP-mLFp059Uh&F2 zBh|9Re(g!d7oPazIiqZK7rFM-856%1C<5mN#S;o@W){{rZ0rJpLc$`VVsh{06%>_} zRdjUq^bHJ+jIC{K?d%;Koxon+KE8hb0g<1gK7Wb+8UuxWPfAWnO-s+s%P%M_DlRFl zsjaJTKr}WrclY%6^$!dV4NuR^&do0@E-i0vA-8vSQG5Fbzt1l&udZ+Y+}`~M7a9QL zzr%VO|2we%8!qA}TP!Qv=z;aj}Fq)Vy>8|*oF(6pYJDuE?Sk^8v%bB;R-_MGe zNLQ+ejBB7@;1o;IDv%JhxB9}B#a=P978YDo4(2$VlU5viiBWdN%|uOKfg`vcaS5@fD! z3s);gqf`Bg%>cCVMHSc*$#hXlT?rh>=IiF1q{1|^hzjFHq6_q<= zwKqMyX`L73SP|hm;YOI4yiIzULQ;$|6UI(sI9&J5)A!m2r(=XE0{N4Ye!SV^lAKcH z>dHms8^q1QXmO$hb}d`uVmkN_;H^urTVduGa!px~g?1fn$zDSoWosqoIv#+!{k>e7 zNItioM{Uwu8LemIr(ohJvPUSDw0E|&Ebr(O(JM!UuCL$7_R2C5{u4kP;e$Lu%?S3z z_D|poz?zRALw_uN$={*X^$rnmpD`*^Ra>*WwvZt}pMM*^#Dk*2352VzCd+m1Bb3A9o_N^6A?KFa$TZ9QAtj zpefxAOAqV8r!%8FrA2I@M5lm?@w_b|XIDM?QLFbgq}0Wya9Fs}qv69AhyQ31i>~zB zpnrg?*bf(EYbSAwL2Hb_tFjiUkyp?i>Qx9ab?h)<9>$@0onxt|R=oS6Rg*twqSJtC z+pHVi+xzrrMO zF8eT*n3WUn<|J3{gb+UK3$ zaaXS<&WNAjYWf$t5uWuK^qL-Q>5!kx8gAyxXL2;?Qve~rN+>YuzH~M~z2G|5y?CgE zii_KZLQCTMl*4~zb|dqWFYU!YGi_ghpsAcQ>Hk#Q`BZH)+YzKcA&q$ z#{+B?rWF*&;(N|ew&{}Wp6+hOg8l^anQ6M0oi^L_Rhq+alXMmKiHp}-9`hPI!Ey?% zS;}~cat!(mrti@S%@xEfV!AUlnm_SVj=VW(5~a&QrXRYYYGSj;6&l*UN_0_q`zcXv zKx{n#5+nrAk*~{M(behI#{dBo~U@u28M(5!2%j z75@O3delX~`N#Jv^dgn9E%--X1;-TkWcj%l{n4#<*isn!tcxK5+^L@ZOK@9RV*QH# zs{rv$(w5bf8P<4GksLauU7W9%K09rS-DZOS0lT{RyNF$)nfz$weo@R|MYrq}!HiM1 zHy7eb!{cr-N653WxKe0gtdp_fJ3Ac@!vql8iD;KpXRs5-<_I{OTV(KqZ)*ycwYDUo z&gAb8wJLAbLkTb5E{=dw7UVnp>!5rigw@QE9cnIC#C_!^BN=>h+=XT$)CGLA8 zXBYtwydcgf(3N(mNbCmrSO4`g6H#ad8atb)oIT^5&%}8p39AZpGBoP(%J3^jlEiIZ z{aFqEJ>WiGDjLP+3U*Vl(lP^zVdWx^Z_wwcRBtOO-_pw7U93I==j>-Jpqmu9zDjo# z_T$KfDvj^+Qm_D14KB($1JiWwM7NB}V^)}7r&vjvg2`zCOHRk}ywi>5` z@f2IK&u>T^*Zl2bYuW-Z;un_d;w)86OwGp?$jK*7_B-FbGL*zdSDk()B3Sl0U9{UP83If4L&_Q`bkg@WN50>f}vd}@`Z zh1g7$*9awUpHu&KiFCWZhzKxDGVt%*LqO(nag$M$yl;XZd-r5MvFrV^{&mB<}O zK4O~ltrybUo@fzA+dj37f>t*CCSG*FQq7fMUF7_$Cl_;4bwB5Ws{s`e}Q$W^#3>& zRa~JOEBb1(eW`kCH2j@Q96_Lugl~ECeu2KA-j=G2JehtNnU*}@e_oBnfXl88_2m5} zT(cg17bOkycI#sH9t;Gn8`pQy@FuJ6q~5ipu|xG|J#saP_tr(GU*B5lSTWi?tN>xH zXg7@*j#v98bg$Z*r|)qevbiIY(f4j^dcy;}%tq!6-(VE56jk-*@HRBGMHok(%S|$C&xjiV>Lk z>Cy^(66{p#FukhCyo&Hi;YViZ`w#>`*v}M14kx#ogV`5Un>>Lt>}>HaXKTAmRvMGV zp0mR3;LFkqcPAI7raB(Y5Yv`d%qzIFRZLj}A`?Xwe!ol}klXQZN3O*3G~mV=hle-t zg39mbhi{AI`MZq;?5v7z{JTU4nDDM2lctUThz+@^I;EH2s2x@3_UeI9m~QI<))-WS zgA)ay1)hWXn{)H`3&Y#r{m+IPi3jh4Ihtp-7r4Dh$+tB@hv-WCuYT=RhUj|@0EraD z$zM10&sIEVlXYY*Qq3@j=O0xn3VvDIGWn`i*z}HS1%z_Mr2h_td!P+yc9->m5!wol zo5T^AYD8tO{X7JGVp-UiB}KE9ZdH@Y*l^5@f(VY_(VS54fzc&OOq=VHqUz>M?Yots zKu37-AVEnYv^C)!rgfHw*aAF5W#&M=sqU*I%Z%|p#KWf4RbQ($z>twItuasWT z;ZQ}<<3&35;(4x}vy-}J@Y+&T13p=<4snx|RoQ)B7*9|9e2Gc^4f|bk5x<%8^41=0 z9xeLYe}J-j^BI9}u1@O?Maue)xc=ai<&(UIU(E`NYnaseKUCK<+S*SK@2ZccNBoga z9P5s!Ee|h~I?h-u_Jlc)ICF!csOPGmw3~)>vcxW6r)CUE?US#QDd{B2;&~fkth+P| zCk-N)Ada-GVSIjLzgJBp^{rt-lWU4h7GdDS{pkkI#Hhx`zx>r{*Lmm96Y%aUMX)hM z1lw77VW_y#-yD`GRpkH&r5@V$2Bq0@YxQ4D zHPy?j1U#VxnRipxm}*)@(B0|HB{e`E7Unj|L%_zx3_0^9wcbeyCvhsbbPP*O5ThuA z5YFIsL}&a$3=(EKE_VFjPub_7j(=Q&NZzbSWHER}o@W(yIoxAb!PMx(TKq%QtIu+CshOjUsGR;>v@l4k!7h%tVdv zOb)h*x{B8jcNh>t0`kXRv@QV6s_)g^W)f+soPwp0J=ZCtfp+8eEgY&> zKSA#(w~kW3d|$-cba*9tzhCiC$Qhk!3`k_iEMYz}tG6Q7@a>3~k>TmXbsZfkTG_`! zJY!Te=6;(@jBsmD>AtS*4de=WQK(>kgQnw)+XNX70Vrp#T;r9@K|4GVelzZ0gzxg7 z_4cWlCG)V=L&L6WqA2kQiYHd@`pF~yl*m8fQlALAt5$y*se-Rf{7HkGzw?&8T#L*9 zDV5oUBG+D4{c5L04)N*n1DU@w*JA}zNc#ti&sP>uWYeX%&0j}JbT2`%*y*{l(+JPb zc(aQH^OtwE5UciN%gKe$V}>fB2U^#KdOhy}kgy!$293ZIra+4qNpu_|srfB!P`+wc zgPn*lk$!(v;sdW%YSq@v?x%_$2znkq1pBYkGfkbi?x?o(y}pNHW#ao>afeZp&ixDP z%=Wq3IWx*4*D-NPmHCO_Uj9DTLD%#-L%b5CugoBJ@z8$cK1j3n4I*jV&tq7<&z3-7xhoBe5u1j;_9#O zTgcGgi6FBSQ7gciBD;>N!;Am;@x<25sYakylM4ENbqK#jfkLw92QwIs1_@P}`g}6i zE3`9d#*Gup&mn|NqNEhPIuW@k-^))lSE?v~{q5$9Yu{)Fa05~}GfA&mZoJR5h!iRaf> zdu+Mq7Tv?QuC38Z#2HMtPm}hA7MtPfz;kiF<#w^pv1!^N`Pina+_5>hy@*pBO1TYx zWxe1h+X{o=k;ZMzd-s>+?x&|a-3c}yq#)?|9glD;GPrSkFg@139!E|HQajeR&B2?w zTkM@fu8&N(ar+1#1l-d0A>f6qx&Efx@~hq)HMET)WL%-b|0u3vf){s^uz7pGv8t& zj7_$6OBw~Os~f+*eTzO?Muv1QXpw0{ocS~;Gk`)#Ps3+TCEJoC>A!f3W6gN^%aMlC zPG*lJKz3r{_?I+)3JyCo_!e7e)-5yf*^fJh@#bbVV(0XSw9W>^W*#G=ejVLCG)<-J zD{TT#fhQJXiH#PdE3{$;Sv`7%hbxD?Lx~>Zd!P=>c4@S0P}Mpo zZ3Zqc-SZ_$MG<5UGG^OlH_8>2am1(Wq5Nj>4>6&swdmo5lk3U^mlF0ga8%hkfP#NG? zi#55Pa&coqFHIo%2bIgy1#J4FLg&1?*&h_goFnc|utZG7(IHd%Hi&%=N-FPc>$0lO z>|_5=mOnpwY8AsadJ$FHp%dOXxs4xG`n1*Uc2L@l6gmZ)f3_T7=x$<1bJ0%MQaLi zd!DT`dutfm06a3j<rVOhR~#Bw(^bLW8s84!+4 zqZcCvMn_X=1A=Ig*xgn9-BF=1J8vuDW~W5MbL5Ykk}5s(+Zpv|t2xLq3AAzE0gfT$ zfg|FjacudaH)nv(;0Dv+L3v;3>Nc|E8kwN(OjAE>by5)c4KKjSWB~Qc8cc5E&1i8& ziFuI~7VNAqKH`tQyh?e}%Z3H5v7?le zy)gjrT!=UBC|LEMm;NnKYa;MsoLTQ2q1Z3P`v90gn9h4M+}O?L!o3VhvZA8>FS3+xKkNDc&an*VPPDf| z8-gLVDme<#NJpUM2%a}aLa;xo)Dd}1N*w6;6eZ|1-ZZ1G2|@`3;8kHkUKO4>%=+|N zjxm4yURN+y_p$x>y%2G87{NP9oGWA%qgcqxT30?JZ!>-474JhfrhmXG- zPS9wd?>QB=V3IiT%Q?GDT7G-plg;Ljy)A)kP~1GCqRR~BTKhg9u$$pr*2+mg{NnSQ zFH|8t5bF*m8$BZxAfhJt^v{Zk|D(MS`)}>pETrBPryy~KW5a;Kinsy1-X#edA>V zZv+!?hj1AiWAm6t<8RvGcz2#xRlYb;v2O!?U9UR!bN`O32)H$MjLv@1a+b7o+y!7>7ooYC+YM3`BYK+>_v|J8z_|9~W@I+K2nAOxrM= zS29d0X=#rlMJZzW?#;49bs}S;vKn%CnNJA=5p-S7Pub6_gSh<%NNb?`>-Ba*GVTXv z&5DXd;j8gE5s2FaSAr-bn=a5RvQ}=buLe$Jb4L5hp)7a?7%TaL#lYd?&LjB`YnQ>} z%|j&uYoo^jdd+p|2dZD08vV&?g~jhKvWn=6sszUkWXjEH*4~VHkeP~ekbjou<^jn_ z@+co3n?3|C1=Mp$?UDvWk!hLrJ`L}%{;R5K?R5Ze++F*TYIB6`56!6`&uE znT{RxWx1{ehoPlwmYJU_KaNjhdN7YYFYcL)hy<~z->SjfrdQ?q$lYVr4|3MQ$`93N z8j1E*{?xnmWM@^U#I7dp@Ej1X@T#bEf>dsknF<%1H*Vp~39V}+DIN%~fqzEy_`o^8 zaSl1{6?pg-XQ}=q>x5ce)^@vkFD$E*u;n-%$%!)PNO!E;Y5WdhvTVR|H}$gj)#u>&a=zgu$%tpcw_7Tq?(#pnE)QEgzQH2J0*Cf< z-fsl{*x*P^Ti}>Du>@QkAOA7%$in)f9;Lo;_x@x>#yv?Fg&D^89Mc;1$H1JWoDrL< z3i_D1q`~ck;xCaaSnEjHj3qdbS4tU&`rU{yorh?}DI;miva>ZC>l81nllg?cYRy=h ztwQXJI}gqC9$-$jd_|eB6$(aVTQs&j6rT5sVkamKv~xuNroEgoX5w-@iwefNSgFeb(PpR2^ zt7@r14TsBfM?KY&WaI9jmx zwT^TWx@Ehr{cUw-4i5@Q(DB77c`b`pcR$vb5xN~sO~}=yGjp>2J4^a*iRp4j)BUje zyA@*3S(7!2V$i5`y=|mWA2}|f4A^@C;k!Qaj2vLt=m{yFa@>09>ypf;WGXW5IY?zW zq4TSP#O?FBNX0hveKZeIZ9-(kk}0Z5!Y(iVX2IR1VagrDA#LZmKh-MEc)&UKB^gp# zLF}MSwfNNL^74)I-7H&^g;9?MV}5x)HU^dft%2x}#ASKKi++w>Qqzy+;_j%N-x7TIO5TI8n2%$CifaM%<|2YB}lz9IpMr`v>PK3DvWzzINQ7t+kr9 zPS+_P;`v-f+oxYW&*#3!ALQvh=TRW=tGu1hlV$&I^F3`XD*r%`sjcr8ZqqGYQ=aQc z=DJ#|elvuDWsOlJc{@hr2Mxr39cWZ;Ve0Fvd_*|DpVA!R}`kX z=bD(QbmIof?4~Yhh3H{!yRC{_OY+9-ob+my|D^FJUxl2yjz%_FAHpun_qzopm#Pl$ z9up7d`gM!w9X0gbHU9_&2DAiS@z;~h9MxAe%O4>UF=>h{bZhBb72Y8ajhoGj0v&;| zF4TTYG7c)I@(gDh0Y8Dk1RU(Du42=_f>Jcjw~J#WXnPhUKNDV*2y87ZbXcX03YE7& zEU!;l!(oRLGcl(nCxKk`r39V@B})2U4^hrR0k8)8%&`B{6I z(DHDFTw_GOHkskQ@Jl8on{eD3IQSePK_s)Msg_mm*H_S9%nZeK&V>}=OOHN#$6$j; zJc%(ti*Kv$C2+$sp$*~q66^bu&KNQLPI86zuf3#y6#-kv=9=(>7hg&@y#9%KR{eQ; zev8Vz!de{fk6O7RCoe2APWf;$OH9xC4cD$$OY)AJOHe;g<)kqaHdeHGKAecq)UJ$S z>{7+%-835U`8T4@D+>YzKl&oItqM)zX*K>>1*OGeHNi^qejg~ov{f zg1RaAMP0BsztYsMeM-U;$4J1y)BlIb;mc6Rdgq4N5x@;GrU!OV1-UAS+9juJIY5QynT zrZB!J7lT{J1tc07M@4Yeu9_JuI&*rGl+nB-u_296o+x?XD32JXeQN`5WsU=ree@in z8lq&1gWKObWuCwYYB9##*5$i&cG)0JFZ|ZuF%|Fe1$bRm5hSxFE30U%-8^=Xmi^H< zH{iV&4Bq_fY^Zmfd~m$r65-I*)%8ltLuRjo7sYhhSz(B*X{LGIoW^YwfWuRu$UvkZ zIvz>@pT{$&L)6Wq1ujLDZPGHXj&??dp-oi1Zswr!8caG)iqMn@AL}jhO(8hV@Yrt& zPh6q9GHlmy3vg|DqGWhN=!Ml^Oz$66TBRkw&gbRJ6SqMdFeRNpXgCqpWsF3e?lkvB zaXycg1q23rPMEjXmq;GS6@{goO3t)=ZnDMTjf}`A{&k9x1$rhv=lioRjYPjykNY{F zOD8N#1>(6FQXi8!w`~dybaUtmw)fAMclInD%owyY%yTp|k;u^#!5y*?17DS!@u{|q zlyKn@_eST}6>qBiB|Qk1YCE+5D@98sF(yB}GTg0f%v;}h(0CZ8JVZIpKb@DpZTzv~ zs?KA%+O?c9I6NWog44d3Qc?jtcv+r{q$%e3Ri&D|G1t_QFT>=yUlZ=_mU733dVhulpwBuS2Qcd=WRz5lzp!`Xk~Htwqi|q ziskVJxWmq9+|_#^m&JJtg)nX2U&aHrR`VBcmojeR87WgacqJoU2h;)=xbjRn#bR*s zb;J9IXj42e7U(z4F3--t0}GlTJF2v{*h+n3jPIYOd4B!NkEH{Osl6K?J~QFuCHZK6 zrES7yt#?%a0DhM%Sx727t1&RN<&-tbfUxYLE*SrueZlm_vo@mCL4cQ-1v5 zO1+KT7X~oITC`uZvtMyOGf;xg#MF3Mo~rXz_zR|2ewZY}z{IS9IFU*+B*m@X>1|r$ z5HqN*q1y1oUbn5My5R$F_*^6rct*sO;LiZr;o%6|2`23JIuQ`Tkl%}eHf4Z8IUW$8 zS2X83y{w!-d1B_V@a}%_lVvn^>{=J9kv!8$U_|xLsT;M?lr9mg74276N8E>X-fXQ? z72%LeSQCk|I1B0Gh?^Xhv5hZ#Jja)(Jtl121&OQD(QXET?)}%0nj_6O$r!j39)b2% zA@#Z3Bmzl=?cB0usnftxDgUk$1^>I4$PslJW0R39=m%d4-fhJT`c}{JP&NI;3`8qF zcSa(vtI#>Ad&ziW>hCXjz6_QZm>8!(RD8=sy-tc|w12{qVQ_9AjYa0o`(Aq}S(bwT z5Gv<@1N2MD&&V5ps?~|``%$CSdLAPN@M@w;w1nG0v%Ox`UnQRg^`zBr7RB?e6***b(qg$AT}RlX;30ouwK~(qINBzk|4<_FVBMjjT~Hm9A~!} zE6Zm({wPc${vjl*;J4yGAU01iCpI?gYH}j>u)HFKN=MPkegMcs0=lZ{z|XWYGeQ8z zduw{puc&g+E2a|xg@GPBNbGgeUHgn)?o_7?34a)q92LTt9;K}4R!H|FU&h_dK8qA{pOiKn;qIP#Eb)6l zf^J~GWFL|I!ST9#iJ`ISA0WBfRFUX!7MaazRb9-uWpL7k%KXpLbD|z zVB14+k{adGD(IHpaM@~P{k7dLXaEuBOPUxy4$hieQ6$#zS}tMr)NsvjdTN+g7H}2=vkPsTKw~CLW*p={u>jF(NpyF^UquL$sJHCC`(XvSXwr?Nfouc@c$&M_ zg#1yNntSdtuc`$unvj^^<<{FK;7z>8*tPt1HX*2$dGuPCgUPahMkU_{B?0O^(`3bn znISPA^ThdlBCZNLs4nd8oAs5-%tQN<}s zg2W=1qw6&5(GypD7$(MR`gPH6gHNOhHJp$m)|l=tzgN~&n~d}==z&kcuW4Ox~ZjJb!qUk{;Ex+Q#IRw{6+{}Ca-aTv7@k<{H0GZm$9I-lfcdRNpaI*Dk0X|) z1Fu&Fo5ems-&4H`$P!-w2YS0RpDr;p5gS*MRnB>whEb(p{ApsW`5}HOC=ZEBklhs2!e4O88bb9ve8@{*jS}L`a3L_D1OIU+HcU0 z3W#dLp8rA3H{o$+JX&aqI57h0+Gh>`k@1rk2A%cQYu4T*%Ajh0&v(dC4N*62tmgAz zaRbg(;P?5%q68$4i5cWrie^l^&&?>ePWbTJN4Ek!y7#z zJ`-xcb>DhTiM9HMHosAI)048=hC@g@C4&h+i0j9;UK84IA)Dfs9TL(`XjPMgf=a`z zp*;NS8Q@T$qpPEP(5sJJ)V^%lg5ydayou)tLNIuI5I);1-1cPkC09M~(Pf6ow`X36 z(N{E_HRKGaqV{)>rq|{3)Ov*tKPPzn@*2>E9ApUo)?mbI7S;PWTiZ*pYQjGmSRAM% z1tCvu@aXt2D}D9Oa{eljm~Y8NDfQa07eDR!4bV!4QXlnfF|rA2tD6Sh|Mc`+xcmF< zPFLG$o^+SPSt(DA>1P=6ibUX5*LCNf6bKYO{qR{Z7{!ArFD?wyn>?D9# z_p&(j=d?JeuLrj4#^`~Ghlj4R{nzF($>;id-tToyR8d`6!*Rneesxy4Q$*N1$}ZOR z#>2oFC$YY-T%>_X=qskRGS_9PRVpOb{MHO0{+76aS+J2(tprK)=Xe6us`Syt`&9VV zM!?)Rp`Y~)&}FvQMujeEONeMBHvEzbXcG`0Ld(1vGcC>js43dRp>lTgO3oU)5t$_^ z|H4(AtD~xuyyBG7xUIAKr=ww+m{RqL=66>NjGeoi>vHye!4+q(>8Md(bVVNwDf6{^ zc;WyppbzYQVtXuR?8}?ADNknLi6&3>;lHZr#jBg3G8m+~lm4UALEg+*R$72pDEWJr zEf40EFlO+YLBu=Eb7%AkmG+JyM0gBAr2_UpfO&JE^t0$Ro7sx3By@X{Y)&E#{>7{g z6!|W)S|HDs?Y=yFmjF`A@pc$R#hG$yGe3W0Kw`{#D#Y*lu?-TQ1=4hin8#IS(eeeI zF_K;|tn1=!Cz{2M#fCLFoYoDN&npQpwsP9Q>i(vbmveWEN-SEB_O|#&3%je3e6Wyj8_yaTd-PdT{KgK{3n8laInwF z!D{u9>TSv!!t5}#Cdii?dk9|mI7k{}qQZZ!y0oZuuJwz`i{x*+V`+awf zzs_ixP4!l+m%O@oy+q?8LT44VD2mEXrIQTprb^3qc)P+C@Cix9$nx{S^L*6&OB4)vsxeZ9bPCxCnVu^39tjXwlRS0FNBk zP#%!Vnq%^G+V$i!P3>_Nw=l)X3J3_et_U>2*H^6uS6l1DZfYoXUmZidfZ@L+)t_4G zG<6~zWv{cBDs7{V=g*SZE2Ddfvr_Rit)z8~w9qi)8hyS44)pprayG(n7_xfEC)>v6 z;_At&9S2u3^_GO{{DaQ;;Y2L%0IR+VEzRj7+jvTtk0Hz0< zEGU?}T_HYcZ@qV&CYb$KAD;Wjn&B8;gSuooXDsQaAxRD6Glq-7BYz-u9$|FVJqPmJ z=d;HWutznSVF4$R7%*ZivPlEbKNCJduJIAq%+!Bj9XMyvA(Ps<*` z>=wJua6&9Y@v1jiXbmx1UhF5Bz|OBIE29-YRr#AA%!h9KXqT`tQ&!YpKDOJ}`aKT3 zn|pleD0WhJO)VW?c@$dLOA&2lCc9Wmj`eP3_q%uv&yu;O;O5c7U3+%PSV0e_kPi{g z2{Wg!Qo$S_|Ii5W<$&?!gNgYW;%gAAjbL(9&2NIp+>Gb?RB{E~#q6cSJv%$8P|*$W zbn6F=?$OsgfQWMb718}aQ^{H>9GYHtNA>$Vt}P+Y8e6TjO*?Q+Dt=W>gzU5!adApq z_&cyd0~OwLhR(GJ6G(bIWt-Bn{hJ}%Qk-v4VHf_hz^t4V=xtsySbLn^PpZ6(x!IltL#Z0tvL zDdivz3pPv zg94&hXCHz&aE5u;sx+dW*dz%n{@j&Jq;gzc6_B6}q<{_dyg&GKJ!SIiAE1aM z$p_=bh6f1kFuu~+?Q#8_M#Lyrxst|V&5bN_+?Vh2FfQz-U{>&{;brd1LZO;us$gyU zwi#<1L?APCyq-%=6LL~KJ+cY2v*B{k%WrPvrCifYKhO-x2}f8QyzAQ58`FPFX#So_ zzcI!+%w$ZF#+HGHlMG4U0|zI7kC~GT+!?Fe{z}dR>^==I+M*cH{SE>{{7U)vmV>Xh ztK4qrZ5SFk{j~{42^6gq8SVn7n^7&zKTR463*&{dDKb56!9{AuZy@mu9C3M^IMPzn z0Z*r6MPC=RBs=UTak}lmZcKdLG*fNxf5;5pq0JyFsLHJG2XOXo4?n)5!S*INkcg!ml|Jh8d#gJ~+vwrM(iR5Sf-s5V zo7YXA9i53Ee0;^K3)bXc_+{u!Jnd!ZU9KHG3~MQbD95ccV#ig84~nS^g7ZzjvNPm&J-!1A7n?i;KR z6mWc1S>S+hE*%nF>*7~+M^8xb%nY+mkZwyqbJ#f0uPLG7xDFOG`3G=oYX%AeOFLeR z)T`but*)emf4rGMFjlQi`~e$qow~W_q@lcDZ=~jDen=>TL|KTk1L%-Id-SF~ZYGK< z%j<6icq^Z@pmM^M(iIghQ<9);#>mlo}{veyWns27c}gv(Vv-iVi*5v_cyKWl{uceVI7qBMjq#84fAHbncGZPUM$TfS)jA-L}^ zx82H0lXUcHPJ1iSyR&zRtq$d+j@Y{_njg>EI9=!0?OW6J2^q83rN<<)S`^&^ugXvH zjY1ur4)KzqtICX2z6uIQZ@D1I2F*X06_be%iFR?*CJy%Eb1E=_DT-GbTi7FAroZ7n zmBS@E=0l+$=i;5wk!*p=96rD94j)|1Cb_nu&f#3GcJtr{rN$H=QBLp(@E^b{LbNip zmo4AKFIin`nE%{@{~6Nrkw|Iq@E5CuUWTix*0dW_%(|*4O@dARcPe6-V*HDrW7E^3l-+*-MpGZL?4PmB^!}1=9auNN3L2`X zm)A_qj0#itn3fBCPx$!WFz#q%g!V|yvF~5_L*>09Y~(GdK_-J;6S!F>4Wi>A^^rvq zEy*@EvAMSpsL-qy#6$dseBRioZdt_A*5hncUxoz8AAzH9u$L!^R$f+RbGdRQAvXJQ zz?G_SQifB1{=)#_(hopJ5fj>gTI2*P<#AlngeLyES^cO`*M?e6KM&J{_BP$S6Upk% zl63Lt1rqYl%Tm=Mw+SdXvON%a?^Mt;1ZHGzNq+Us4L52(c3|P~a<{sGBI|~?gxkCH zt&yfZN`;##*$58%to?$*O^G&+kX7<8JSLqcP#ilELekxG-p!|R!uL${wuzGdV}Ju8 zbJeo3Cu3w?Q952lV%E!I%6{-dOp$|a%N$%JwYZ1qcxLsHOfawonh6y+89SOM;;Jv7 zF;spfZX^E520{u!O4d#iISc<4Gw~-gT?wwFh0BYF;*3*nHc?H8b`DH8)954O`c>tl zwi^>Rg?{#A=3~*_Urtyb8eQK7_sZ_j^*j4`U{-%0NaydLqXk^;57PEoYgDm2yC2Rr z$=;n9)kn-rvd|d1Ze)yVrKyrR40Ua9yKZ}l(9iJQadgy${zzqRF!I>zJxRFk55#Yz zy^vcme=jv2?aGK*H@V7VCxK*&>sVMXT_1$Ouu?exg8qVNzi1PP&|+6Vt1o&v7PzXD zBB1RM^pYYgbeTIf?dhNxDTf;}J{2}3-4iE*A`cc=w1TSkHzaWTDtnZhi0;F$D3SD! z%~kIB+r{Rpspd*nm1Kp#6Gj8cWkW`j6~k0Dk#BKxBVFE_=LGHLZnD zr)G8$YLZqyHlF6}EuiMp${%pU+0hq;S|ke8|1fi6NnHI|*%D-SYy*@MLt!U~Od#f) zY1qm+zbQ(%?@D31R3x;XaJ|0TIRD4_kl#m z=1UKLWAd27FNqYLnf6Lcz8n2=DhB@S`a2-;`)a?l0xVFoDvu|-2k__=682^y$n=xC zQU{B(sMP5fW~{l@CS7id^1dQrR3Wzkct)=IGld9_9Mm$6G1>VMwI(74qu$$~zGEj~ ztJIe{<@Qo?Z7<8Z1ktyzbxM9Fz_;@Q4IZQque9Z-kgEOt-mh?)0)r$j-YqE5r7)Qp zx%lWrK2dgCpLoJ;>H7LxxL?|`d{$3F16juep3FfjPO@rCJl`7r)4@xoL@4vG zNa$F0Yk&D=yg-f zaAZ#-0-p88H!EVtYg}b24d+6ierq2WZt3M^+t?*)LJ3Wr%dYnS0kA=YB#L>YLYY=Gh;tC3i=3rPB`(qMqX0KaQY>+dszOXReH&Rk$wA16;r9Ad zZymMoW~Rm|Uw7RfjD1P{Yi4Ba&~E*IaQ2o@ZM|RIE>^5ap|}-oTBOC@N^y6G;vOux z7YYR$f}}VEC{WxbXn`UjxLfcb#fumH9)4%$yndcJFY*WM%ZSq93TIX~@gIDjl106*(>=-|g+kP?F;%?bm#J1Ai^$D?h$$Ois*joUfB^N(MQG z@@1VV(+&Bmw}}iw6SV_sz0YMMA3v#Mrpr( z-nDT3w>cAc$e@^C_;E@uM=q7Pfdt-U_9 ze*~algDA@4e?%^_)5FxY)0PmlCHfbWkvcm#>vCg1u7!~t+fbJza0>-a>jjT+7_Nd$O|d++kUAwrby(p>f1%r`_B z{+!QHS@|EaR`h>Gtf_c-NUhBH%}sPntM-r!(sFCbK2x&r|7;WMLas(t=iyi?o>7%t z)v?Q9*8({9N^WtC1od0TRUJBu=XQpxLB+iL>(yk4osv1xJ~2VqK_8F6Zwu!~Z5`N9CO1;TXl4@s^ng(bpVwZTc!^8NPBZtgsmBS|XqxO=9&8 zIZff!!U+`{RSALl4w>%JC0wCNGY-6H7|!sU~*c5l=T$5z)y>r&j`VUm%#m1|pOn!h1EI+jEKTFfDls}=jb9{2_(ilSLuo zdXtNMPjj+JS_smA;Y!Urly+`@5=U8N5VH>6y6-!Z z3Gj*tdPeidCEh}d3+;lz*V2NiNb1S2LW7?B&Q6t;L-&QV#oaNE^;r!1`nxCo3HbCt zdvEprw!TF7YI~xUxZ`Y9dGcSRL<}}z;P+N50tCix^4a;Iq?h4EMH!>ziU(^TEAV$n zpc#Sa4MYHfG2ZDIGhCBdY7X>$3q5;mSOe&|3KAM^5|s#A_SB>_J^xYrI74#uj+u(8m4a@2|e9txr$tL=YXn&;=# z1U>K#!?{%rGzs=cVPCOn*z#$PEJMBF@Hy{-@2V7++LWi@UD}IsLpZ4;^^*K_(dTY| zJdXO-lfge)T4V5NwXC)@$Kq8p)bcU)3!*oQaT%1Nj4Jzq2%Y44SjMi0AXfl$z-VoX z;H!3d>lQ2A8?Dn9B*A~3eMT)_H-F&iduNZO01-Zy{2f5h_@d`)Gf6PrpTqYTnN_Ve z`(K?6zDN53UJ2Mf!&UAL^54we;Hx%q@zN>+&hXfXOvqufl&qx3KEojHz>a#FGo0pt zTyEb89!aYOt96&^`Qn2Zz;V8Achw#Mc^m|H zQY(EDaQ6&Eot1zQ~WhP-wJx zX4>@IPwH68-FO8+40jRa>rPM4lThXCRXNPQw2}brXN}=;GnE?Y*u_|{eZmWm<{GW1 zj(}G^n0jRNliNeDS3fTYU!k+IT-(j$fJ?rFy~7-$=ltF(%c6|3IKC&NroD>yQ_Cyx zq5LaJl;PjTX!WE|YLajI?UZf#)jfI3HG@d-G{uB|uNsdt?in^@;n-$O&P4Xk5QVE= zt~h>*zWS!zjHJiaC&cClgCQ!+7$gD*#xM7c{QSe0486G23ERyj$%X>;qRy!>Wu^Gc zCj0b@j=I*phr~S!`WKw$sdbr^9}U@3yz+hqT~@UN#m5va_;@t>w(9tg7nZk(?0l}O z26sBMC_lUFSAOfL_?-M1hA;gUJZFZ&X-|>J*x|R1cf@nX_FB&&%ej_OEkkqY?nwlZ z9j2%pOLMeE25ijm@a)9d@D}(jP$a|n5H+8woO*%WrbRk|FC-m!j}ttLRJzAUL=SQC ztf#Atrsj}2=Fc;fzRNi%V%+z#Z4C|{@*%24OAbu^z?EiNX?qR{As6Sfa>%qB10_6< zRW^7@mDi9_9@~AUm#Mk?uxl=pEzYD_+g4RkO{D0-g=jYdUhHAE=V#b_s+`qa@ILn? ze`kkvBtNu!ocMF3GThgy+lKc<&`BD zP`@)#y==d&ov-XviFrt81A_h5%Y529y`@o{`A53I8>C0+sJlDy;YekF6opfk@OmV! z=$Pn$z-2l0OEcx9;d4z}?lbjs2iZe`s3c+V7P>?x!3pJZ*N8Nn){0?fS=l+^X-UkW z84G(N^pZ~u%$sh<8MK$iQc?*AM}|go(r_YV*=vXd#$En=T1Crir%qyxlh!Ar8(Y}&n4l0^JWwD2I_J&g~5>u?_7-{6XX`T*lB*!3v2?UTJe=xnI@0j2 zL286a&y`yE%#AZ~x4sBnHYn8tDAAiP6_nIoC5-gK0{a_e~$&n3mPg6DG6$F=ITv`_)25y!jBtFXJJ} zsN1v0E-cpNrgS-=;_6!_`hP3f>ct|mxXJ^^dNgc+lu%+VkBWd24S2-IpAR)!EeUnD zzvJTY-ti4X__bt%uga76jo@#u(p!y}_}R`z-b6*CA}c1Y$HewkBxk5=s+^(O*=Bbc z9L8D9LyK|RXiuFney_dTNqm5l=J@~2&(W8rghhh9Bvm{K7w0O)N^y!jg)JGijWVk` z3%8E>l?H*1E$6m`9AXZ;Psh2-%j#qw_B=iI)x1V7#x+;M@=_yTqlYMc|fNHc{tq9%Q8IH6aVeoPCOX9|G0{4KGy#c-xeL<<`vQfIiw_p(?J%;am zaAYH>U36e0!tV?pkfh*4Ev?aJN>5On?aA-XJ5bS$gCRmr&jt%bQ|{WHdX;}?=?Z`P ztM%NZm@Mp$9S`WZgVHMa&6;Llx*O8dm`c_&8xg$>j@Z+bqwudnZgIJ?Li*ss!%WuI9ru0|7TNp%r_bKTOr+Yy~g4CO_bij8C3@Q$cpjQ_eJQ+U5y*24!l6pfFb}P5WcB!``bi)o z^W>JoxsEXEgug3N; zyjG!sqT83F^q(e~o9a(Jvv3>ZcpC2v5(z*aotZ=GUn*=pC12*Q)WwgUj@A6IJjhc2 zMbixAV2#ugW6fOPj?rV`R2f_5MKqHJU3!oPq%4PxE2*ApbPoJ#J1+DEx+8{HN@5GX zUDw471loI~)ASr@4v$9Qi$_iO_v4n|H{J?XR?PzISAzb-=w)K_hGQ9; zIa%w$v5{i(C)eY;3U+aV7kU(iiklnVXG!l*$;Q0qXE6WG4tw81@_kl5>OGFtLBu|a z*O2T-|3*ih*J6;M+6*+L&qC=WT<@&9TukU)`Q5R%m?KH&_bf-4r(A2s&u^H3rl+82 zwUhSxd+Kz}#O5fUDB`s^?zH>pruUub1d(UhdF}s5O)n0j;n5!vf_{@DL-zcLk>niw z-vIq*D$G8To?J-QJY)yNz?%9yfmV9Bl&p;DiD0NDqme?|s&>*o{cLZ!S1m@Nm-N2} zKJ%M2Cfz25`u{Kl(kS&jGWUO<-I956{)bT*nv6T!6vNgUpM&*0vEQ4->X)evs%1e|JFj=lJIEW)*3xIm@TqkgzQ2Kwgge--m{J?N*PPf&KzecH zAMzd9K%RKar{krf>$+N%COjLlAu;lV#~;KS?mNiGultq#6w`mND3l$hO| zQ4-2xv`qK@Mb2pAE84@Vi|d5%DlFlA&3PHS)jK_7;cZ-IpEOtVlH)zfs_cm?jYtFO zQ5s&PdRR0yJ9LHwH(<+ZE_w#Z$*4)6YQ)E2ZXOvUj{$AclG1-`2A;~&W$ z1+oV4l!<2mnKqfXPjqq6*5#;q(T^1W2bD-@D)ebkfpx>0$Dhe!km&Md%u<`gD+vR` z_i{U6z=fZU$Za#ZFpdT%&8a&bu1#97A9!)187F6vnKH+RSJY@fxmmSaa}5(_1rzkH4c5RS-hVb2heB819HoK1m;!M+koW*N3NJdb}!KJ*~u_{PKzaXnqO zW^ACH(Ubro2Z!;OmL|a9$!7)Tf#6lg3{VUiktYE*8}o+BE=~E4SpYX!c8pG&J;lU! z8DrO35y|fOQ;H;5AF4cBPFw`_#|N;Wt-JYE|S`)H3&zc`U!U>3F&R{;-oj zoFJh5s@ME%(3R0yDp-MccHO?5vtto@6JojI$rl{#U< zHyMfQbr{vb4Bn(6MxSE~*pDRsP}tL_*Azv*PT}Kdoa!5@^`_C*K5I2Fiwh7bBdj2n`dK-~`#G4Q z7L_9VhZHZ_d~vqv8-WE!+zI8_xX=@Y;Qhfo2oi|+7{4bp9PIQCr8&8kYzTPQT=J@o zUP(G3b$m4Mllko1cjPoF4;RM5eZ8C~87KzO!St)d?M?u_EB)H9N2PbKBTJWETy1`( zT+j1qgqIJ~IbsjLZ^~5ElDt439J>CjO9ooeS#&Hfv+zFGKH5z~5JzITWA2uiUr>%A zyqx+k3FHCnsZHHWljnIE*at^5K4ll#Riew{<4$vq%ngyBoW_*RZy_y=qPP7{pcRzn zzzl`+65qn!A&^y|32|lX5(ND5REPA%^b)_fZ{a>gf~fmQ?zq5B`OSK(vUgjjjMtsc zM8@ovm50iPBDB=c<4u0d(rE~v^a`Yk8M8J)A1p>bE1C`CTn*cuLL_WjhL6+?r|)%M z7xNn{gsk`N*PRRmyu(w!ye|K3ZDC@ewjCP29vDYmVvRq>w+SRP7y9@PnWx4{ZF;y%uR;$(L)h-TaMdXj^I!(R%ecuPRA6t=1p~Q zyC)v}qJl`?M(j0=9>KS3Ek;Oc{YN2`$f-A3Zx7hDf%I7stn_g4Ck_44dC=iB${K}L zJ<;i@)OvEcQ|l`G^*@X+{?}Cu0rq^qNp>(Ukw^QuL3HEAU*f^$MxcWB{ik?4U;H;e z;xYbDKQ0e-En+pG2X2AT7B$JCV=JMbeBN(rJoX%00HdokO0&KF+i3jzmE*-u2&S7O z_8i>J$IQOtj+VaqOE7BOst(qIVYOQl{vU=B$@?c)vH{wa^pKrWH|9dNIPA+@7swNP91MT z*m0Er%rED6&{1H_BMZaGxwPhQFVme#Wv4cZ273TGn1k4~W70n>`b&Gtou>p;uQ?2+ z-q?FqQ7I41uES|hmeG{%V@m`V?cditBa|z)+bS|~1!|cV*00duot8R-ZP7CgvrjSy zw>O#7@ln^lwwDs2(#Lo935|b8bf}!JWBAWh+{kj6TG>H4`h|*L)!_k_kH;LSoj^PE zFf9OwsmuTJXs#Hx$a7J;-O$(pPvLM{aaFOJDr3*ALi@ux4 z?GRurVq8AYxe^_4jRUnTkt#d{=8~(vUw!Oir9E5{Jb9%4<6x~D}072a~6unfz`eT&yy5Kr&UE%1t!*kVr*=A znl9IiRn?6I-+O^Dq zu%W^>XW{nFqdnl0!8O=H^|*P(6)JSN3nLz>6g{UT5Z#KnVN{aBzys?YYg{ip`!{_= z{mhoH50lV4D4NX!4Zh2Ydse)io(*IwUo~aSA9lyERQX*yw%Ya68QVmt)^Xa8YZ(~5 z$^2K_(Q|9pFYsyF>i0j+|3EJ*z#qR=3^1+q;77H1DYd08K;p^j@tp_+>`hs>Iz?kEW%6_5QWgwGk+f2 z=)@YOpC!BA)9m!O0&G{qUUpOKN-(?QGB^K7kn^^wRc`f6%|fS&B(1wyS8NL``b_bI z9F1d*=1nQfjCI=aN02RL1=;op8;e*sbE2h^tkM>z#(x+NIZKwyfnI~cT3Gc1jGqUe z#h)U)7LpAr3m_W)VkyHukm29MG}whNf{D(b;vOeC9M(K!4$c8EHIJ6AQsKN%*B8Og z8aw_U{MhL~!?p(Ag0-)w5g5Kp5o#URJzB+kcVR92b#@Oz)g6LpvbEC z<0)WCm|Sd^QMx0@OXp+hClkRuCzirhlZakwD_nigpetL6csdr{-eQD(zjl4Wd?h9_ihTyGpSNp{_LrQk%7iljm3 zX3?R#%K2JkOUtr(;so0k6Op0}A>E~8ns}cyT^>`t_*W%0Kot9@&|ku17)<}rXD3r- zhMxa26y0xgmnRgizSscx`8U!OHop5|r)V*(lO@j9(}dJClh!wgXFQJOS484T7^TRv zK?-p^i9tc1V*4vW3og&u%U`ocd@QeJ;ANv_B&FGl%36ibR9@mFAEmLrh}ucq48veJ zU53d@iB*>(1uX4GH1zs-Twa)(b-!lwNPqWGw41vt8H$N;>1lafgQ@U1PP2-ZDGE$tJ=V@H z6qURS&kL&K$ZVXZO$p~QewGl@Cs&x;9fR-|#k*Te*s~7hd|sMA?+&n%2bW>TnrQMy z$gnfORMC*l)^dYCDR;5aA~VR&)F7M8Pnp*%u5aEKk`|+= zFlgA{V3Xj2B4rPfwDJXS9;aBSb@!jKC4L8WWZ07-VYW;le4abFxP?8=Mzh;e z+4T3&U$3c;f0++1Ynw?OfyXIM(g6vM8skzC{9~rC78gBxFM*@}x3Ao0TviUEj00M& z;A?M~!Ea_2l}lxE>Q!v*@$L-Rt?QNy(wEZ+AzyYEf2%?kD0}c?lz6r`CDMdkf#0JC z!Hy-1gZ|4jD=GeJ(f5r9lQnSx%hd5ohMW1rQ9{DP#npa*;6VjCU|Mv(AR#L7y$6e2 z%7)g6K;)27{=U|ee*YzH%zh=*(eHB@5MuYn7;|79*HdB_>)Ws^O6%YU>+SL!yt%=G zpXSnRD*j_2+?JG;N|M4da|pH$ii$4A?IR?A&@Q3g$yRUw_G$-xd zf)ju)WOi~P5%T5zo}@!sL(5F}w}j(quCzsjbC#|QwP!R4Zso4upfz?9skd?rLkIc~ zGBtf=Lqka8hMn;(_Hkc#9Kf(b3;5|ne~3GF2#VSdi%IL-e~uMXKfSu-LvQapm{{8@ zz~BYr=gYY@3}13zZ}}_~?9teVubpz7P)mB<0FCf6CAH$ATkgkrI2n66qV%q?SX6_(t>r@k$5s?_@r!!TH(tFsrDu1HU~Z=J=)r zBy#oZ2CD~8u8&&v8EU}LhdS?+u@f4|ia!~EhI{?! zk2ePU6|Q1<|B`SQ5Yemgb#+n!a5aQsZjZz@;}sWv+L`%NEdH ze_8g-CjsTaV5vnupPIVsvkfv7qFdtu0ruve(l)~Ph%T347XkAQI^VHkCRlev(nyU zmTv!6@W;HK#^kR&FK+11Wi$>H95slM#Fa8v<97Mnpk2IjUIb1wHOin<&(3&-5x^WY zw^JhsU*cBi5Foc~Z-2@#Axbz0VmRhAV2D2i&2#ydn1ArLN)H<9&$XA~Ov2TwySWlec6Xyi&9ZsSGvB9FUmi0MkZwc%Ub z56B+fPJxp#zNrcmlnd69+A#e`23$$OdPE1&U(HR?lj%LvB}MS*(r~#2PlMaZHQ>=aAE&vI81ga*tXyj51X~_^`yt9 z#&4<+qEw9ISJ6K0R)L4>!bcuKdNDQ_wmG{jnk1flkXaXEvEz5{%%R${X|aU$i9#7$ z?h7wz-BJR(e_syv2MX3T{7CuZb0_Us&|RNuQ%P969?7e~;SXb-&i^%22q92E;dbS0 zoD5XLu_Epj8@JS|@=kA)PpgUDh3J6~@kqpaXr#O#v-{R{7Y7`n^sL1qxQ;p>a2Uv< z6#O&)uNavBFV)G#$w8q#b5rj-xcRsjui#2Dez+=+WJ$w6m|w1!1#`hTVb_01^k5WZ zOQ&z|{iAvof}Eur8yI_fn7t%+Kd%AG1?p_=H>RviPPc2xvz+(8> zP$r!)k>bEER}zW%x=qUOp(U;l`6k8vUt`xsk}S2JKl|ga)QTX)cqJ^=QyJ=EG1Yj) zbfTWKvf?t%tk&ML9J`3nw?rv1Fa=-NWJZgP-iiBn-nqJ-EUg9e*2I0!<2FhEOs*PkJDVed#D?tNNrhy7fYO-N6fXe`y_>8@_jrr&X@Jvn{mLwepqT5 z&oIKlE@NrgQu(kT@>sWgVGt48TX2E5RKWvIX}|H;F-rqZ#X4|Sw(RpogmsEv?3tJU zOm{eo-)sE|t)!Fp2ZC%Jh5E+dq$a)n{sNojZjo`2ZLQOxr(`ee{T$fuYI=_jLOauq zlRWyl1)3uK0#EZ&IImdAnKx7s)A@O7(qONrKFxN(pj7LagiqPeUeXGAiwa$!TB`R<+b@6ike4;{vXaKLaRU2A5Ag>W3BDY z?T%(g`A4xYPR&quITx zqus8J`$a^TGxy{VE8DJ+Ah6?SllfbR^vVGm+=dhzTEn+|M2AveH9s(X)~^sRUq~xm5Ai*%H>knDp_Vg&&*xbY~0-iU#J+4N!<`o z=-Oezw*E@hyQq;8nU5%E8S^ZJKNnU(SmtuAKv+{Ep)QD=>CPWk{Z2bFjr`4{D1X~0 z>vhk}RH*2vOdd;JvgdQ7=ZDAZJ4wfh%{JFhq~9>!vBMLXxtiRUV~C2*WDz_FS>+3c z*@LJOIYTvi6>_I$}(?5vEulm8I`0FxaG|@TD9ETg+F&3zHu9Wp04H%ZIOK7G8D0Qbe0}xC!{hi zIG48Lh!L>@O>B{VxG0q#_5!_!tvNiEz~_qF_~YtmoTno2q0;eZ{w55S?o;O1;|&jY zFh)1O`MIHJO?*xyVo4Ifa5`#>EbGoHO`|j`(Vl#$$L^7gl>-Pny#XrHk)w7T9c*8ys^5%A#$u6yuY1&W>ib;f}_HIPk?JGulE?9>XE8^ z9MTxDG5z{kLTge(txiIpl`ndm!B!!_(e|@ZVvJrAaq_s>i5y9{O z%0+h@+zNwF-#-32E2KTU64~gk z=-wuLz$S%8Dq)M^{yf%N<*2sMAx-vu){b&Rr(A9(u!j)m9?)0M(Fg!fm^ph5WO~Xj)#w0##vJpIccK^+| z3c5Y$R@Z|Dl!@N@Y#IFaUvUyn7I3EXkN34F@Q{X!g<%Hm&}B`ilYz>m>`0|FD_iI%CI z&Sfh0Ze<|0A&N?!KIk?J?Eu#94!|9MoyboxH|YD6{Fn_^45f z6!5hPC_HaG%@hu&NMjy$-!L%S*~fPK(8CBqQEp$)W2qf{HFWA7wD7y7yRgvHm=@CG zS5I-Ct|g~1LNRn;5ny;7^Ch_^&4!4TzAk&#swNbeZO8lZoj+(l0DC#>xO=9kXuBc! z>78iHn5z)$e|sTzD*01}gA|#QyzhL9s(U~?QnuP|Ah#jTfUH$aQtdMg<6RodU!CD} zd!}=96S>j@t0P}5Qik8$EXMFZ_umyoSjsT%w=DUr6jnU8>#!I}X7BM{q9!VW749qCdwRniitOB*)zm4Ju| z`jJ$ng<2x z7ZtikbG_M}V}qzkq5`?)sshk9DVJz^^@4~cCf|P ztr$ek`?X%;@7%q_TTsd)9K^D6j2_(bWxx0jgYH@v;pLv@x%|-s-}6Jt`_*=)YJ$DN z0qKsN){{{#A9@Yf8P|{g+$kEarGXHXKTCpnsgw~c=kk?hlVL!S|I3kY{N4S=$_OV$ z;m2Op7ws{ZI0VFDbBA$zcEQzW8yKx_=A1+6h?=06x@MZDF#MaCiMQ2 z(8yq0JWj-eKJl1(&<8_{CEema0B#r6J?Tw+E4U9Pi> zh;lnt+8#o8Im~gYW?`s8_v>%CD3^Y};t&1wHs?jt1ohVDW>@MaMKYBg$|WrvTt?6| zQ%29)n_wX9ckO%qn>^FB(0(}H(lJjv{hz-M{W!FY~Rh)@V|texI|*GA0I^R zhchejz;-nQEOFNu`@WPcsaaJJq48QQ`NrkKzNZGI*8`PKC60!j&Gf)CR^Wq4j@hA1 zd!;}?ddi5}tLz-y$EMOO4lqAO{1mMvOKX-Az`wNnz6G#UzV^>>Z<~jr`HLNfeD*iE zHwmtIqIJLXpR1bUKdahif$jjLdGmVy3qG)wu#(vLhv}{Y!}=@NlyH_YubefTw3;`t z?!ofd`2Ejp+X0NAgU5h9V}r>9zemHQDFT*f#k!}xESy0RvVX!_j>A&Nj4Umui%UST z;QxW*|L15^6`VMVo>e|(#snpW*HA+%-~4|d-RZu_b$VN-ZF4v~-&QT{RuCGi zW>3YgdD1!kCC5dj33SNNAua%bjh&nSR{-W3RmEii(rMCHX#M`; zCwH8s@mpx01apkotby01Svd_nwVFhMiW|`-7aM|5M5?U&U>CcaESQ^XfQ0&>mWs*j zZvb4axPfwtK};nR!SgxA+yegY|6%xFo^xs&d}@126QO#}70z}T%j-|0-kurILvEYO z9wEyJTFQ4y$RN)ZDo`N-QAA;vA!){&Ln~Z$BV8#QI;VvKUPr?PO%yl?B+HnOCD9m< zas|PAKUdk3eve>1{!Ph6+B?vE%KSR~&!=!nOxo4*(al?xPI=@m?B+u&@?hW zM74uAU&BoibB(C%OmdTp>n4Ga$>zh9C`l$QtI&T{Z1|&RBKBKj>KdIH$K zChTz5m6G$Mjm+91OhyUEVs{0G`Vpirjyu&WXlV%c;Df*o;ZTt^o_$qYdUVlVkKBnI zkMh0|6;kla4fuxGBQnQl2$Cr?-s!NcNr%{eFmg#Cn_6>j2Co|h~SG98~hXOvvrG_t`;1QT{U63lkPUZM*~2ZzoD&=P;p-=V!`ca<&%sm zWzz0IMdLk_rcXzqhC95n$a=Dog{OT?5&76-f#?z;)!$P)v}x}-h0PMCsFJa_fP|P9 zLjn=vIm83ipFUU%7vNom7Oyl-;81bs^NQi1vFi|C6G2%qub!K952#hlIW6Y!bksq= zGKwAIi_VDUzuWI#XR8+R@o89?-Ak?g(IY0 zym732z)ByK&KxP64C^>uHjH;ocXrn)(qqO_Nai47c(bAE&NdIb*rujFuIbx_QH9KJ zyGuRQlo$cn8MBd##`f-ZLUx1_Al!yjF5u_tM<*n(j6K-VflE@ggAxPtGdOCV{m!=2 zGDTuf=*(%8dAdC?2<@i2C7u& zw(rNDo7>Q^rqCSidMB&;y#=!@;S-Kv0`5v^C7(bci^b)#_6T$J{XY&_ScjF0B2>)a zt-k?mHMnJF%ljUnJCt^*rwQSDN+6A!BSX|bgYIekIN`#>0c|^S;%?Bq_g^i%`}mS<<_-q?uZ;lUnU`R6u|N16U0#WiSN{aS35bEL5z5Sad3 zh3U`uvwo5uFP#uYI#RAe3mEyM6^4%Lsi0PQxz9K1#h68KN`3svT2@&ir}-(bifvxB zU*5&LUAhgb+xZ452Wk)!Ob818SAVCu`kb7eCD8rJ=mCei7T32-XVHGlv`uvXw6lCD zysk*_C-Be0LC1fv$St=Lc09<^}dLwQ@_@2P^- zR!0(COkF%TvT=2X&EcWmX3UzkGD#DT*zuZM8a#WSy4tt^^U{w=E#bEz{Ws|KH|%c9 zfF5@VuL15h_6dZ@qB~Afj7gHUPIm&2yN6)_5_@m(aM$WVif0-c_JQTyD&~&(+i~o;L`~i;7gelJu zfc!x==JmfIXw>I9_~FF?mzwe>SwF{C7uyKqcVwirY}kR-Ztc;r%O-5kKBzZmsQyLP8iUQ%A>RS>=5<%4|5%SV{5rORfr82?CGM!r}fa!W`O$QcmdEfd{a zZGNr7a*8|KytHQHwLQRJmadb6{}7zSX%r(%WtP&w((}$Z#Zya;L;(53agRE4x|j|w zsq(O=R#qMCcnjp3s@=H1FwOvgI>|BW%8qKmwgoqe;)XAKC6_*%L4789u}7Ej}#PDs{TGic78Lh}qY)HGs2f)C z5a-{0jN51TN%WG3cEAM&Z!J8bTrWpH9SZ7U!8(a!$IuSP94_BI80cUr?=@^bZ8Y#_ z&64$?f69{Ih+WM}uUGQS?M3BMlry~K@{hiY=v^6c+w9!cR>@Up&%5p1*WZ&=&oMhiHz!zXB!;vv~wsiAXSi}3${)dGh=e7T6t@LLrzy73t>Djt`<%b zrcPpwkmluk!CcL^Q;)P!@)W||*@a96q(cD=d5@i+f91L?ap*yJOt zkn#0KdFz`R`PusX;Xb0Q)EM#KSk7Q2gR<_H;8;20_#Qw6OlxqV&!AdP*ZgTooJv;) ziO-iC$Z2Fgq+TAV$BTAIZM4Ul00Mckk8t;wmAE7&A{Go~Jw?1ZEEPdxd?so9sDEi( z71>hS-QA3B=s|$MuZI-l@!VwLi@?s}hzi*rBGKZkC<%OJ}@*X-5+l zomYcLwRZnuc;>FCVNcVRC#?XjiE5u58(ly~JG6)U!xoDr2%N(E%(8LXU3%%ao-emH z;{CBj51$A|gcn3{HS`%>YShv~_9#FvqMreA?LzG>N^_9(Z~gRXq+PkbSL5}5B&J;T zjMu|$J#`BP6mSxiY0bg4KvYj7nJ%M*isFP9qJ~Q7mGz)`XRa;O4Hl{(5V>-=-?U2C zkaZGGa-?lHExN=CWI%<|YwbGw0a?B2<9REqxG2}WNpD3fidTUCE41=;Kr?IJLl`ui zdgvuj$^PO4V_GfQ;0Z?1Y;f6c{iu`=Xw|;lV`c$P?1zit9!mm zjaJij)z40J@%x*?0_MvnC1CFVYH6|Ibu^WVkTWZsKeQ|<5R31e8c&jJVvg87z~PO< z42N0_iez$!0lhsg`4rvu|L#Pi&!$@$k9YXHH+}hB9`-D$2DO_UmCgW#K1`k^bvQzr zkQOf2FZXKqrm_RjUzus3UP57yT5(Jne2hT&b!>PF;fs| z{P8yJ4Q0pxX#^@1?zxu1*pIcoO3?%HEYRrBSsiZd%wA*AdeK8!|Ddk>M6!$2b zPXIZw3Y8hGNF!jZS{L?|rygE7?0s4iHJ`O#5tmR*Z}Ir*uj1a4`9NcuVY*?qB$B3v zHhTDFG6Yxp)5h*H^hl6(>CF`0uYg%u#67y3%h{r+r=e<>E8lW)y(ZK|Y46~kmDVgu?9z{0BJ^$S_03QW_^gDH z;$@5|TFO;;ir$qbB(53&q1@-79|O(5N_G7gqw=HU<;sUTfiD>Y)L!OCQeDzdu|uHd z_r8JePhO{X18i#79ZR3X9uR2V>4tfETYzJ8G3wx8(LPb@ykv>RC*eC|0SPAd%-uQI zp_E;(ML0d3I#~Y|z?qANjiDLW3-VZGq#!wGc&n{!uDaju0481t8zTLQFJm4?%R1Xt ze=49^!4_B^(t(_&H8>70VDK66DSu~C`L;ic-??^(Wtt8*I0@4g8u{hbiDM+5WYm0F zb=a1qKLJZq*5;(NL3X+yDrenK=Slk7nk{{bwt&f=Q!Vh~v~n&2lF-vq# zdg$(<89-V|5#)E~e{rtPT4$YevDbV5#@_pV_VfLGQa=;5``LIUn$2f#z1%lo_Ml1t z3LxGfHHlZ;an2s3_1}S_<*m&jAl)bnO-F&TS5+Ja zYhl~gvDKJg>WeHP>rfVt%W9gOwS9a3`K<(;v2r@~vy{XwkOfqlB)I0mEO&mqXnPxB zbcLOyhpK5)8-P5c4D_sGbgP6UV6aJ&*DT;-CROBT1VEu-u!uIE8hev|1jQpl!|~Q@ zP5I_WP|_qbgH-^wCkc^4o}nMgOWxVPtzR`|e@&TEmCW{tD$;#*hcp^B^^EsReKuce zVVtk7@>}aXGI4$tP{OKR31N*xxl2iZp?xlhdIneF7>~>&r*((@*HyI$;>2w@R!j=m zYC+`E0;2Z6WZ78_oYUAdC5rEvJi`xj$3rHxb{~4KzSpDuoNC$RS%(f6qMiEwh|HtW zeKpb}D{xM8*#OFtJP`{9$xYJhb+a_@5&FscMd+0_xe1Kaj|oPe!Z%+@fPSOsOTbBH zMSk_r`lasz;kY=y2dQU`p`Ba}OtF(L4m{YY1Vw)DW-v^Gdn$pC$)Y607JCi9M=}xE zG~Dq9gz?gOX6nY)GJcEb!^Jt(kk;!U79D7%%bRS%D?L4jzRK~R)b0)^5gwNOBZ>kw;rZ+sT4 z2(CG5=RBK+jIj)S(TjfVN(g!~IXbyxbfaK@YHJEH^C7A-5}~Gi`iMfqwC^XR9EtcE zDa(3~nvg?TzJ3xPm^)JJQnr`uQf%%1xAQ*3AxDkV*D~5h_jTIy^sA$@KYC`l1o<8n z%4`#;Nx4{}LjZv6Zl@;fz3Jmoqmr7752}`y`4*Z{d!eJq*=ieyK1yW9 z7B)wb*mB~h#bS?Mwd|rUTk3a>6Ei%cVTyx=->fzFrrei<( zQ=Ljz0#06<%ZcOQC6sz+Xk_(Q^ect#>2$;5N8$-*DD@zm#6E`74`ypC5zY-z(ir?Q z(-szYW!c1q{E}VkEAURi+MZ}x$H;s za6915-`@rb(04^$VflsavDVKZosBmqKJ2EeMDQH{BHKqBT?CT2%CB>Ne7spO(`{Qb zQgn|Vj+IDlPR9WxY1m9aS}^kto^9=Gg{l`Z!}Kp$mgq;Zp{lEc@6w}opvCxU4S2oo zXKs0xO<(#+RiqyW&qpIIk9s|t3zb-vuj-i=eh!SzZr^3SbAZ1HHa=7vWek%3(KZ=T zaIu_XHn57{Po+PJ_x-yV=~P)({INc5Ig=zhcoQOqcj(VPTU)Ib0!q_6aUH%63dc>= zog5v$x;i^KF>1dsloDdMZd&?*Km3GMt>jKSc$!dKrDsrh>CO+OI?>wFIcH`#14XFp zIgnq0?YbGHJ!U1I@913)tvKjyU)z}*NYAK*y7_W0-p*%R+S~HDIqZ#8KU5badbymS zJcIrT8Yr1G@un^Zj)=c>xK0cSVjTAJxsK)>yI9&R!^2U2y}@29O@hSo0lAXj#}HS| z(0xb&3I-?P+c99pV7a~JX2!($&U+XMMf^AEn-n_`eW3QRhu_%O$z8-pu62d1tl+MX zce+wY@BeX*o)R_D>{v+zz~4@-uY_b^oxiZR0Y{PRJGs4$#ors->xr+wFxyP*ePY1) z((mM5UmXo_otCEk68e!&J`N*V?G)@jT?;u}L#>Fk(1EE=vIbQtKv==&BQI1akKy{^ zim=48>E+8K9$+9zKWA!W8?OV4)Yo|U@tdUH#$|zNQb1>*QBkxs?oO9+s zxq&`zi{>47+oQ3CH18uJI47z%o-0Ob_=4lt?mZ)Gg0~*?Ixs@B{c6u9S3ad(v7!c% zX}mF4D83)-k+;{~# z8{xfAF{=`uP!MccCfo5UrOoA}vg50uJol@=t$6K2a^2=ifSy6YES!zbJ1+c37VUF< zwWMHc{nbeZi3xd@h<_dt2%gD3?_#XdyLM0KAV_6t_}9JPS0S?ieKiLf!BdCgwU07! z57Rxsg~8%&mE9IfMR(iyM+w$1zuTj@h37qm7dwsHnrDh;T(#G4eEQq4Mgs`Oyoq8^xJ;25SlQ~!?3z9et%Eb)%OzHuO!lDyfTVw^sciY0*||~ zVo!N!$RxOj2!9_)75^Sc8j$g!UOhGuF+C(f=6?&FAdvh!X9R7jeo*>iwm3H%IU{BK zC~f)Gb}G?Q!$3HJa39Ve^S|>>A^MbUP_mm2SR4`b65f$X??13#D;mUdLl2T=H=S0>|B`88hD_hmAwBo09TB9_=uSvfqF}LIFews`*ch^`)fe9+51&oGfmmLu0tGa>$?)Se4 z=9tuFd)s&pY6rhfawg+w1JWkBD5Sq?pk$iTxyIvSTGC#=z_E3YR`SSAfl2Py{-B*E z`T8H=lkI7HBCoblfYV~xiR$6R-s$#~;c85bt+fFH`o=0r{^|yNqGlob{UDj~bLmq3 z3)^Vb7?!L`P7oPDa5ny`vN^-G(8HB;bxK*#L7aw~UVd^NV8>YwzOL}SJ|id=Id{~g zN8Ubu67_5>Z&Pd?m0MQTTClyDv$5!Q^jo~N(SO-kizUqsiFD z2MCxLHAZ*}wCmIXZ=|rtZy76VZ4N?)RZl${2N(rh$p-xK9B$ol*kJ(!o=|8zN7&b^ zsa|eD{Z@GSD3+T;JF+UJD%ndfXamOJEGC6Xj$v8&K0JQkkw`DkU8@yV-gb3)-sK(U z&3#Dy#Pq_mBS)97PTZ(;Yh9A`+lF|stMHf}fJ#_cOpR!@?7t~3v|yL`{7vc=It zyZMY>mgqfpsxDIw7p$Z@wfW#C*&s7 zg;CCSGl(M0nQ+N_y++*xDDY5kM&ya{+Xi>mRI7xom5%HYuO5uK6|6I194snD+7h)I zP&P(oZJY=x#O#+S{I!$$Q+BCA`oU4K0POTZb1Soma9Cx8>7#2^JQ?;z?v*cZa*X4 zHF$&Lm5~bBOYHZ%(Q;$1%nlPA5}l@RY!c_N#D)P3-@1WiU+kXnazU57Tx0mGpZ{W=q;8A{-@aeGAU((lZDy5v}ep`>@2UQb1Ns@=*%q>5(HCecKA8_&PJB z-~vLNjq1SP{16fg)j~nY!3Vcw){j@Ia=CA*g@#7Ce@%esO~^xiz}Sdu^5wYUvS@ry zehXCFAbb@_iCVg1$N%LC8PIF**P}x1m8RtfH^J)&831@`e`$N9ZIqo9%$-xa&kdfm zsrfJr15TK}pjq}bw%bl2?9_So(aMr(qL5dCfc|+x) z8e(14`#G^8^h=&ju~@<_0ge&PtgJi&U={4h*~1+Sg+`OAF>5232oAF)f}lvkDDqfr%?6TVWVPr*^-Mgg>wl1(wUbz^0FOgAH5zB1TRDDzxzZjm zOqjiDS+#n=pQPyK*}I@*PDt)c9r{NmA^BvMzQQx!$e6Ow(;JCwna@Ycd(rk{Q=G|+ zNmf~QQL8)bw1Mj{YiqQ3edx7G1N2YxR#D+H2ZO|TvpHF|->WQ}VfNLvZY-@i0)8f~ z{6i64KUpw9yTwFT$8BiI68BK~6YlTS+F~S1IK$>x^rGOA$<>pCTgKj(hp5AGU$=F! z_NLYg!?+ZWR%J~F4X`Ff=sfI*8a*=kkWnAi8x%1ioIDr*KwDXM)O@2oD&pj6wn-s8 zW^3?zlfX^5#{cX%NSFB3dA#VW*QW~tY6%+~Uo;jMp4{C%804iMi->Kj%h=D(Z&dU^(xN6Wz)q!Y5gOFh;i4SVA-`@80EqmIk?57*qqE33uP za(Qts<9F*wbg4_&)}lc{oX)e*N@-Hjo0WWlRn>hVAHB8j6=mE3H==ZxqsRx>ttg74Q^-G3T;cf^-@*j_|TE`1^3+Jd4@}4el zen!Ck$9VW6l77O;7@JezvgEdmE^_HIVXz618yP>WVz=auN=35q((kvL0s!`D=a^9o?Pd_u+6 z_agK+$l8tx1tAbNhSDYCD;)6eq`4PyqnwXN^a=CX?I&MP29A{Egs~gE&h)JLUc9pA zK=+-Y+S)oo>$P|?&v~fDqTgGqg;wJ=>g~CbVYZ|$xp)bF!IPZ8->@e1Xzj}Iv;KF# zRSXmVa@m2XE~ptnHgy`cM#E}xL8I3(C#y=wGe6E~dt7}#nh}A!+5b2>zj)EfVOLi% z`1t1pZ)BBj1iric3Dnf|I`hdpcUO_yh_}s_9<2d`V#x@h0GYnneODK~7kp%yJNpb< zpXT&iUo((&z1{b)uU2HD5Yabe{lAfIjMtwkJ5?551h9!-M3U8;t^uw@qfBf2f}Db~ zEpJ^-3WzA_hz!WOz^J#E_fDA%%#K2ev-$|-*F|j(D{s@{&6anQMvQi!dY5@bOxHm* zaSo=uL5q;>$0QF9y8>^Hi;2#Qoau*6$k+GTYXUPa2^(jtyqo6T_^BBsu0MXYkn78B zV`v#98l-?6iTY&nFbVw!&_m9QO%HaxdD6&HkmJQT!u)@VzJ6kS&ga#sjqlh2RM-5^A*$ul zl*9}@;QiSAQvWsCCiVmum#tOb;a6h-6H4fQq(A=UKGNut(O<;)bM#3^lB1xo&@ivE zJ$D&>>g|`E<$(RBK#8)2Oe|R~v6C)&?xIYj6{|1NbYRnZ)~KcG$)F^spv?NY=RQa; zx}`HGz-VQi$G#3Pisnv`_4jZKB=E3FkuPr##LK*-)>fUB_SIMZ#(v~x4bknz8dowQO z(}I-;bLn$+0f^+)zUZn^OKPdCoi}f*5Gd5cnX)Lx_E1P!Vv=SwNJ>pj1@mcw`l&gZ zl36)a@>l}+JX6$LJcm8jfwfJSl&xRptuS~5^TR7X>$&6M#{kVjI;8Z)hx!1~#`N8^ z1u=!HhUQCc@&IfpF+}h{cPrLP#KYltm7J0nDcRElgr~*@69w&0PlM%ED94@gu&`PT zAJAE~GB7I;H_$6y=W*dd(p#1_R&8~tbP-${`%%VygU-2kS zlb1JwSzJlW@EReE5DGo~OLqR)2x}-`+Y+Z9rbk~$b{q7rX5AO<<3%j(i;na1xZcby zaF3ueP2WAc{Y_7gegm~L>{v*O#Gz+`GC1daniX{sxl?Rx4l;NH!vj@NvVIAP)~lck6owN5)!)75vUHQ+wx^*4DTM^A{Q-#h8ynmHa3W(oHQdfRnZD8Smxg8IXFr?VEx z;rU z+N8622Ee7Ufm=kY3KqdspcoeT%{Gw{^ou=`uS~yWv}kM?)xZ_w$*O zAn)^!?klCkFU{pAGnQ8b<4?d6z>CD-xdwsGR$2R;ZLu${)V=ihEZJKIco$UhWblQ! zh@K-~gz4Cn|gmW@H>Moc2G!n|Q!aC2@rEBToS( z|D9UU(K|aQo}%w24XTD_f*jw2`CoQtPFZMG969^yD`+yb`{#$&@|lbfhVA>gjGQnk1Rdsa?+HDQ-d1%)*R_aIK*0W*7wCq!n2~C zZ!lGjR`wU8nNrsrv?BZ=9We{8w&w6Ay8Ixp%zfV= zS61TE{SV`2b_WIefPt>#HpQf2qAE+Ms^;+~cYkRs2}X6o8XkoWxyPK@A_>5^4_c{7 zHZUBX$nJ~e6I7>_v@l}+HbX(Wl-7r2WjVdZitu<>4-07FGWTbUz^4O}XaCI@p51P2 zo!50WP!#i1G5KCH6Kcbh=mi&OIhXj(RFrp1fr8Ko-e5!zktDe~65#mQB zk;|ceXz3Kz8>_`UOnqBDNvVsGZyC+;B-w#Ql^tbVe!d(B=d%m|5${qiQej>lc@p@^ zS(iJ-VDER}0u`eb^N#_s+tNHqGCx69gdY3SmNg=n)SA~t=+@rXw9^TgROE`A)O{0K zUx|)gD^^-!)>K`h+U5&?ks)l0Efj}|DxW1qG*Wcv#*xeRfq%Y#H*+I2>i(NMm(Tck zpDgUN2ddhjc}mYgYg-%l(O9N{wvZ5!p1C^_9#aUk$}Yz9op^o``^crl0pByymkZ__ zc3*_)1Nz!3hOFOOG6(Or^4{PxBFN%yMD>P9pI}u45cwG{Eov-fLx;uWU zU*r$7pop0rBUO4h?MVc@a@73F7&T^3^h4TI5GsYXPq;VBdJYBK`EvZxr;l~Gn%arw zk@@{=OPK*L9ws8i;=9;#Ew?V_q9^15aQK9hlAvLdLqlV9(^Ii-3PG2LUnDY`S=90< znVsiGmp(I9`EASwYPH$$*zAwd*eItkv&1G@hHQP~k!O;|9(oW;GTraN$t|3mb4$

8x5yuAn3o}Z8~)$_J%cdFfDH{qPB0Mkfp4SrUjAeIa8|1+wkAijT>V{V`64z4zf z!@T-@CgfzJZM6*Nib-N;^`E&o`#uY~a73B~{AfX371=H=GMgmyutv!G!yp$%^$v^e zJFo-(XDl^K*hB=oM^<(#OFX6jc)+}a;gNpYSkG?Sn^52%yhVku{m*CqMR?%;oW4j!xu|s$zhG*Ut!YVh>GGl9b7yjGAvqgc(|(+ukRm&L@(`I+zWSLa zQ^SrX{~09$IRGo}zAv6tP&k3uKKQD;qG3RKk!3^^lox?xI`#>Sb)qoKv|fvn=epT> z)Rf)Pn{G`pY)iyPC3L?6?J#F;dRMnv*@4!MnP=4QuYDl== z>a)8Newg#!R^xki2xbou)iL0-_K9((7V<&_aLHd0mhID;jf_mQTJoR0QGIY!KpPPJ z^go7P9?YcEUTwCwAiXKVIdV8i!~un=WS$-^Igr0QpW7XJDO~qOd2OD3cZVIFa(2Z2 zJA0T62pk34YqRjIf4O9nnH&r_& z|2nwk$;27pS!%?TKsyPW2^>5GA5Fe;Z@56u?Tp8TPsE{%f4J%NP8Ajj) zNJkB-oatD5xp?DO13#u|Ne!u8PM}zlydowYy(#Rjhg_>MP7XRQ4g|q5_;&aS{oato zF7D1uWM{2;R`st+>Os_#}P9bv!>|bhQ+r&In-uy z@e@Fto6Z*YQd%>1hYGaGsN}kFD+>iDHE&{8{Ea4o5=5g3YFSlv;%*beLNSgjrpb(9 z_UPX4;`tEm)b`M2&C{t~GCFW0{HFPQNi|mU5p{kqD|jUNXz{P!{S#%M`jWxD$q}Xo z6keoGc#yl`Mxr|Nx-eb5>(-nuRW4;=$!;jc>#X11Xc)G(vRWUf+ZcQH@5Qvbo?`Sa zX%E8+F<$ZnVLdGcO@7zlje$5(Zb6ParOVf$qeo;+md=XV?pJkTuFT2_Xh zqsHG^$xBfurXJ-_zjNR4^`7yK4)8Tz*gbmd?5RZlR65540Ung)I-wL|`K&s2>>IhO zw&@jb^ZBQckmNqi(z<-63XV3T%-fHTET4v>cK5NyYpI!$sXmYkyNHQk%P1VliPuG; zHAr!X%E

oAxuAD|H*kFoT06xIP|Rl%0IeYDTn;c!X#fH&cYiz_ye1qGIU zMJ_-du$?kyX^T*)`+)zHLw!b$_nx|w;-*1EtEW_Su0gH=xirv505@S}z}uy_N{-6a zCJcT2B1W*d1F=<#c)^nZL%&UAMUgzside-YetQsljcBhO$?6;Qxwn>XLwRwzWXf8vxiq(LEE6vaJeB70gx%$cajlsm)nuHt$IXl zlvGR!ZBiJ@`-I(Gc%_~tcX}k2B~0wJ?fUClFsuzikCmTKO8gY;qX$eYQB|)Ju#Q>r zwF4vjkR}*+h$98JZL`oQ^-wt7KD%3&GW+l0n@Rx#69`7EzH~_5Ww_9~>u2oJJR+>293d|dtps-rRL;sc#%`E@<`P|4+ ze8u}|j~7LnF%P|S_-j^t^NV4dNh9reqjqj$aoc0B+7d%$SG$(TlNG1{nO3>2)|{C9 zPP5m9{2&j%%L}J*g~LJ8Re8V)aZ;XX-c|raaKit{?28W#wIFXMFoye3PTCsljs?g` zd!STD+J0TUnH_emS9}qw_Zor8vSV$#nq;q4-S;kiY&lj;a|2$gKIL^u-JH|g+oo!Y zO(rKG!bh3_H~)qQ?v=lG@$>XkNLD$=Nr`n!rw2YyvG!#@K)t9r6j*I2TvLKaZr)D1 zg7kDpB9c7mapIXfn6DI=#I-(Se^hKd+JcGZG$N3H!tpWQKb>e#YXd5=yR{gNkjJm; zOhz4K(Q(5-_ia{=1|`+9VQr7aNHAEMylG#u_G5g+F4EYof550>O7&PQd_@PTvFGDTZkbYmImw@Ox^YRYmJvXq#Hk8qwS1lOQ(IH z-lLgE4*Oqdnf*a`O1m~>xK{ZLJ%sR8eV0oAzU~~M#r(S86w&6t#(G)5T#hN2q&`2Q ziW$6(=w=Z(fG;%MD{ng068+I${4jOOGT%tNXTNA%XG=zWOD0tKq%QJPj?&)U8aFfR zgwqPYp$u%{7Si@0DgS=aQ`ie&dGc$U6=m=jaT+HE+;t>EGlNF z8e6Ls;0IGlpIW_?&h@bVi=&>l4n$j5^M_iuBYEdy`)tbu*B2e?mN9tYg2Q~U9oprC z!0S}N_y`9oi*cH%1fU z`^qXyEvnCm;V5{-fX7ZDv#TMt8wZ<;Mdn0PT-&?OoIL zacnv5auBbamV-a@OI38Fj}YtIYMGyhR4iMy=~*$foMrUV&&^VY#Zt119xM~~GVA$r zK6yOqPn+FPcE>ycn!ADVT*YzXsfM3t>&2U`eQ-_FcS;(K7H{#xBh6kfoMj@A@=S7! z-Vxiw{nf+6k~~69<0nlmj1Y`CLaA1g$Gs?&xl?(Y=&IUSr^3#R!rwt!7Ad%yD~6!pJ*NC(5pGUYIL}vtNP920Kk-v z&#Nns2}yblhHy*y``}8aZ=Q1+ya{#4q?l!Q@<7)@D2naa>D@Y7wdveH-9$_*GVDMa zByB&x^zu^tw=mZ}z|-_6<4Yxq*Q3YFJC3cUhmCcgJ*huj9{f*u(%;phZRCyix`z1Y z@xn?_MCi4FHy&XmHgl;R--F+9DCQ|8_{lGsTWnc}>BmckKEM4s2}pU8G0LatUlC(t zZrHcF=h-G!_-R@>rKP3&dU=Hv=qsT;Pv2Iv^Vt*kkOBysH%##EBqDPZ^m}-?XTSE( zg7LxALx!}4_s9zPknBR6lf=S1iplmTinwr~7tY7WiEW;qk~h_?!0Uzj?u7Ig=z3c$ zb2v%(;w3vh%Is6dPne{4$kKy2x!Tf2BoT<2=#Z;can74Hp!DO{<0li*T|TK6wwU-B z7CU_Fa+Fyr%H*eh(lXzwqnVg_yZ8-&0Nzop`HbOOBL9dEi`>p9PD0Ngif*aO!BG(={!0l=Jq^Or z@W+YIHH10KP-c=oXX{9j5ZnOzcV!&&t*kP`j_MoWFIb{B%b?d$IL$G2C?M&NJai7Z6QTO7__y&XxTW7nNZzTgHh>r6N$8PiGFJeReLDwA8!^n`w0iO{KOiB> zU8v~M&L#79DOzOJ%~v)|X`<>6f~jgTt*-m9K%TU}3Ww#T5Bo;|@SH-Xr3i~E%`Val z@PebVv21OOow&G|X++eG-Gan%YSzFcY4GPXaH`=$O6Ef~N z0C}b=^v> z?tSptV!S>i&*XzJ^xLVJ0QpCz3H@ew#(Kibvy3&^;g+lAav1Ncdfb8CdiLGk&EvBR zpzj)NejeJYbUZBu<3o$Zs=~q6=W_pUug|!P}+Va6)AU*uR^ER#mjZ~ytSsg_cDU* z7M+8>!?$CJcDTqQbOmTqse?PH4&*xWrzo*&duEDe)oVD&BJGo&zJq`F|aJV@?*jsDCjBej_^uc zTsx^ALL8^xM#=92jJRCrwF;JN5*u$;u!b)9 zV#G1L&d_6P`#7;RF+F_ec1CsV@ps;f*DR(L?Iz7@%T_mpzj1E0%v+FfmQJxDOOE7` z+iP09vnMd{#0C~2%k{;{5b>gogiWxZjBEnRl65_SgQ6L(;a5CM_u(7c;1|mtp})jC zy}M-c(k>hZ76+q?;l>lZRkS+qM+Ua;JkG{;Z*<$*ZRSfYXsJMA)j)!3!M*{I%4 zyv5|?6P@lm$x$zxXSb9tIxYuv7m-hR7C~uiIe}EMFpSU_IxBx8f%b3v7<6{`eV$eF zq(2#b0{K!o};4?!0k!D1qe8eQg0rV7PZ_)C3Sei>Sk9$PRm^2)6kp{jd zy{gz=A9~YofOfMSD;3NxWHs1v2h&Rs$}}dFt2D5^<{hh!MD2r^@`>?F%>g%M*}GIp z{4bC^Tz2sJ%)OV5QRnUoxx@8n5d(hPwWDdpVEC=x4lgR25EM^KkFw}46P0~puu|X_ z3(!@k<4S=K5^PrY?l9o{)P$Kf&2e@TH*cG+Dh*qYV;a9(Ku>PXCz3wU9%9}Tl>>IdB*xt8C-(W@ixqa)Y z9U7&IULJ9um*5xQ3aHZ7;;|9i)UEHcSzadNodcD|M4(g_!DxM#XkD$k&?CEW@MJI< z)rQ#V1e8CybK3pY0E1_IEqkV*-{P;+H26Y#+)8=zU1&~Z23)h z3H2)tPrt6F}5G)$(m!jUd1jZUi@fxro14=E61g}$YfIgpS&g{dp*O5RKbPgY9WOB=iK z3Kj`;0~_Goq{;1gdEFSl%e~T;-;b)JGpkQJs3Nzrl%mG4_85Sl4`;InY;}?PugeSy zQ!&abx6RHNZi0LpS_-_ZHt=qL(b(dm3Z1JmZ~Tm>s(}Y~j)<0!0PoZ6>Mf*R(wJ<# z4nz&mExPR+I@GJiV(O?0S|2Zh_UQpuQ#asB?LRqVifw`<<7^GWB64DKE3}ziIK%9~ z+}_q8Fk91e3z*(YtNkhufj5MR6MPuZvoqUde56up&(`Q+37NmPh#J!0cO@Tj1aKZo1pLxYM9C9qO@)t+$Ua9)Bdm zRk>{t?jsM3b+1A?qLO#U$M0a!`Jf`O0(0Bvy)D8g9e_ zmvNuwT5AW^sBqLhC7jDO+J36h7Awn5`-&v|q-l`&;jA{892=oBtDD|Rg}Y_A0`P~F zvq~drg=b3%OGB3`vW@v&T^2b#slMZ{K|y;NI#^do`?yEnZq-D;aYBpM~; ztU{gj42fbPhk2+-Q|0t2Y8{NbyOdAO2bDx<;8>h-a-7i z0QdaAflE!rCx=JRqZyDP4eS?Di+JCKJua}y&k3)T%8B=l-ezIHR(|kJ1TK}nw4KMs*J*B?QGb~96gUGy!cqX)GsHSXoz+!Au zWr$ioB}Ax=p99t!vi{Ug21*{!QD*mBHoGi#I$c;64x!B~eGUB29^xZ`*!8*tea ze_)9@IT4Xeq&@QW%ORHx=^$q07-4odiGDondW%mT;uKLmu7tMz$iGE6oSFh}VJg}O z+)O^7ZL(M_jPNV@r&fjz{2w&T$4CF0jrjk2HHmuP9!bHXI!>oN0zEm<`B|1NF>a)~ znGGw1b|71Y%2N3@9QqYAZz>l@H=|(2NnYb75q4S)4_ExvSpi>gg1Mw%;31G5%jM-w z&8toaBPV?cFq2ib7 zF-_jEE^AaEz#u7rUiv-9kGk~fxo_HF#uvO3l4LvVFLR2n@L`0a@ojT$9VKCsF2A_z z6UTLZHF2}BPY^ExK_EEOy!>jNGdqn#c!XG3PP4Di+%6fm`eZh1F+ndm>L1puz6hT^ z2}mu7O@8N6z6yQ3z?R7D7`-%I2H1@1JC(r02R=z2(9B?PIkh3@XQ#)Bm67`oU;_)h zNIr<2o|hKMTNGW)s}!ihpe{V=dZaB=k*xTrak2ikKq&fmyDuRtY(v8& z`D$Fpx+)u@^~B^yKbS}5UQw*@nu+{H`x>HzCBLq)eE3$m#(#pRVydxI#L<^KuI#Wa z9$s)L*4_XoFWSKiCnxYEo-|p2CG+b2wK6bt>P6}Jcl=IBq>>*wOL_nU?x+T=J{%#R zr7Ysk^EJj*+B{!*n!uKZ6{@h%6E5P>R;C<@(^R#eT!bvTnw7%er#*4ZK&BfHFmvhu z)=7qzDtyE7{ibk+$EZdYvXvNE?NGjKGKp1v3mUJ#2<}TLXO(JBE3~T0z50ENltT$$&nRY;yD>I3``hEF<+>L z<(vBid4X<(jO#v#emikyrU7HfJt5y?T?-xNdmLKm_a9&(KPv08Yx)x zn1vihEcJPCU0GA`WLz~@bTdIeW{pHZ({TBQb`*mITgciBNak6i~!DQaJ9yaLVV*4zNC}N2aX4B0J;G}f25}dd?_^Z^a}N(;5U({SWYNfh~eH2M<3Q)Q6A*->T*iXmFy7eertVl^G6~sri%+ z@bquvo*D>}glZQiLAi0*8G6R8HcVE{9DV)7^)*-e9Lblq;6)x0uubeD?XifiC6!ba zQu}KW&|_vSTu}GB!@=44`f&?pw6BK3)sv#`{`+iY?BBI&n!MN#S;M={LZ1@idb$}P zID|(gZ;Y&O7KPs7ohsd3@H2de8Qb^Zb!h;7s@G&y=&mtssYfFPA<1N!4Sh{qPB7{MQEx( zmNKsJOZ#n;0s&qje~>s~IZOPVizu0AKL{5ZyBTd-qj_==k=ULqk43fL%s-{IRJ`VjzkD+}e&F1SB7KP7y zCif=^-~L`o5Hj?1Lmb=LT*bL&RFua-ypn;qUX9)pD(tn8vbs|UzMH!du{f?fvo?eA z^J829@E1+giF(8frvV2h)EJI~weDwOfINno@VUP)@H!v(jv{RuA?AFMpNRCm{UjeT zN9mO{cUTZ`zZalGk*b!BTC)Cok%eXH+gma~;_dl^6Er5iOr{I=S&adsBB4Lk-BpeT zq(d5h#-%UY!ra!j8Wggu&+{TBJ%+EZV2=#kK6<>>*7g7@;)e^|#^Dc29Hg$SX3dq2 z)QqxQQswecoMSuO|IrnSrue-ajLh~5u47#&p&(pGXlp_0^pzN9Qd?3tSgC$am?#ScO zkCpxaWlr1QixNGW>MD2;PYGJXnPruzv46+*^d0w@tGiZ^c^FC7xj!w7m>W&KsUqh$ z>!s?w$1_wY5Fn2{+}t`M*PXzGFBP5F8lgulqpMlusz}I7Z_V8KeKGIsQ&?Vrdn#R- zLhu;k(Q5bQioZDoB{SbjtQb*!^XPH-@l$tm;s+otAj#t%73k+T%?1TkB@jR@IPr7h zhKE6c*&9ab3PP*zfC>)!(<{~0300oyAPJZ@dda89QW>vC@ZiviTb63vs+Mn{SNf?~ z&2b{Zk}1G6A23L2ogjbie@Cikm+$OSGbRR+w(7>AtxML{eT%*I+e$S$s zJlc#md_Qsor|Xe9!c+g8(&x33ZvwtE>v#q;$* z@8Usj?@bkf`mY*3P$(aiWItPDg7` zW@5Kzod7I>Z4FX<-x5+UXX%pL-p3yR+%LsA63^HJ(IZiTh>$^ta=f7>FnAMZz4PaL z{XJ6+ZXcV1ukx`5Vja5zR!13K1X;eNJ@O}v zT8y~WTU#%5@wJBX=kF>YQ}XpbWX2;pJ!Si2hr6;1JG@)!Qc(4v9QtL|ww(&e7BTGEAiW6kqW7%V;8HC!;fbboZqfA6wpfNh_k9K9 z9_Auq0#dG%`{pF{r(=r*`Iq_|?A>ndO zHSIi2=(gWWVsmw{dH;h1KF&~uq;G2QEQ;o)`G|IX0rr$kt$v>YjRFJz{&R3+`4O?# zM8%Y*)&sNIAzK9m+Hpo5oxKN}o|lsgVde|pn*0ZFIrKpHdwCyM-{tQIkC3YmGU~_M zAwwIlC2js)m0&v@AXlTQcS>1>(Toun#N70h6r2(hFEbReOa*v?ZOAK~md^nK9gcKd zbGUd?9;3J@d^EyciyctQImpq+QGJ{a)F@ZbZ0-yR76yHnFO&n&O{; zlZq49c31c9`u8bWY-9fcfKGZ}L)o=tzSS2IvHvg5-ZPx-H~#yMQoAUnMyN_u?NuZ; zt-VKWs%CAG+SDp7B_y^IwQBDbn-;MtT6~Zp+%_2XeGAf3ecNc4`k;`}u7VsCN$aY) zLua7!0PufbCI`{8-2aYg1#>_&wJq0pj>wvF__repUpw>2yTn34PsfdRWoG_2(M9NU z1G3cDKd^lJs}{N8+L{19^@^Go!jpWJt65Y|*yz}&@i)0RnNbNS{^krVh6ALpoL6S5 z&g)@bF5ZsyorxoRKIPG`v10*adL?D)3Uf2wJm>X8j&J9y5K1Zc2fBCqX$Z>1-xDS2 z0@-i>>7=adng(SzC59E}W8HiK5lJU};R_vbw0!13B@EuA0cY%$dK{ARS;-i@GP3p`N=xfbZBL@^MHbNV}b%DOCrG9TqH_YRD? zymohd(a(&<)LLvj@Q{AUuG-F(Q6;x@)a6v6Ov?Vv{Qbmt9XFwnDh-wSi-{i^Pa38h zD_v(;%fIHZ^`pMXtVZjO03Glr$vvm|AUfW_=5&!uu_d-ZsdxK76<_+wnSX!}Yz_V^ z4>LwFdvIY^D3Vqm#z|QBQYYz>Dx)AA1z$$(wUxIHM?7(AVl46#!x6k-x&ne@9#=EY z_`sosUW-6$erCAa8SHAeHM4U@K0wsq5qafXzh}i=(r?q8`@1vW2>n9}9 z0JU)vJ_G=ln0H_Svstp%JAb{=AFYV|4u6WkR8HnC{j$Wq)(AF7%^C1!aeB_WW)N*K@6Rxzp$RIC$W^c*HT)Pr4S@4B{mE z`%(*%*X)<|bc*UR?6JTDAaMijt5=hmUcN#FAHN=3JOf83&~j!I*b~l)-9{)6899=| z)T+j35^@%L_4ha#$?}!I?CnZPhKZ1MY5(N6{8a0A?vEmT-I{%(E{=Pb5c=JK8tvw;#OLC})Q_vhs z6ew`B93P3-cGVPAHF3(>tDq38Y(YN-b3IYM9%h0J43f|o`&KMuMmKD^@nkjqnRObQ zotr5OZ`n*vyIwpoKWDPY&MFjN9GN6}JW;@a*@SKqOxjCJ!}JoZWsLV4`i<$7n7cWO zXU-~dddQMj8Q<^edKV8Hn)=HqkUp#8ZcE?4w@&hc$rED($A(?Nv(KusMNnJfZ;+Rk z@7oL>`rtkI)J$-RSoWO{hv!9Z#jy?nX-~)eQp-Fc zeHr+8`%Ya^?DWr`!ps#43%=d0ECs&hwbgIrZ@FKF3v|GcHSwDV{@r;=VzNlkK<#iW zlOst|?HSal2SUt)S*vrN`B|Bnu=DZz{_!k2D%VB~b~!DHe%cVQY1}6IW&Pvbp(Ist zg5f0W!+fF}Q?p9r9tyJ-U@@GVUfdO>C$;5ckN`y=>K3s838fo^tuU5CL96ZVN zsBNW9a0N6QITTvPpZn1KyR>Sv;l1uO3ea1yb63qH%?GKwG_HL*_WHNun6#~sA_yH8zrerL+G>7} zT!{J3?~hyPP;#u*OUs3@+OnlS_K|wX2$7Lnnr(9gq>Jlu;w zbc9M1x>}uS--z6(y@f{`^OM9yaM@9dXA%wh3l08Ug4_r0?v}de=?b1Ff;_4IEL?UA z-iyhI@0dOZ>y>3!i>Pgr5w8dI4`l5R?vJx$_1>u|^DXDd!mO#%j;HI^@pH!!iv+H~ z7ogqO4q=HYi`lZ@ z2$m!Y%kJ9V$rYUOVVvv1HF9%35lxuK?fi<1Hsvq+lIj{#DRlx)NV8LEPks&;r@{J+)M(B{ zE#GS^%$Ge-LZgWDCx&|J2K}Op$4LY%-QJZxYC?S5%G&R;cjt+HH|1dY&?JJ<_+NqR zWAL$$yp{9ijFf*x%5>M%+qU#6fV@o(OdMmrt zRTfd|-_sT%iLmcF6o5}A4;o3`7G_qYo+#qhZ30#wjR*&C0FpiH>3HMN_TXgO%bi%>wIksv}Yk^!G?sY1SK-)N}4_^{otlDVeTOIS6-5T zy-Xbxe?Jme$}>Zfg{}O2NqxnM{7KAT1}Gp>Qz%`lE$M0N>ym`NC8RZ42mc?DjsLe8 z$N%)+bkh-OsaHd2nHpu=gWAi~P@;-fK0d=}6_@e^$tGz_ISc;s#LPSD4~gQV{q2ic z`a`dAMLM^iy!^TM+9!tJTOST#Oo-)ZXrY6f&CjihY-)d23p^+k&KT2pzO5=flVd5o zqqWcfIj>zW=1DY7v15rEZOVzeddK8$V7@Cw+ErTn3AFlnyBJh$r9lO*;ED*mWJKoa?; zHwms1Zq%#$K1W98vTIleOUXN^(S?2fK4uB$oUmu(;wLn4?)|c5yei0^qwu^k;~%tY z+h;dQJ=j=)^jz*Wl-5)wI-dvizL z2VOiahO@V?{wuB~2svD`#y@%#Ow9LV)#Cz~tP@J4_k&|>s8G6kzay*~3l^$!!7*bl zp3M#rsQN^(?|4TLvpZF`qjdAna*vyL#S+qIrtQlg9D^Tamy$^0ho7)YMr-SZ%l*YM zcVokJJrtibiJ7rkCh~;GkBN3e2u%(IY$5CW;b>=G*(=@}QW!ahLy^X;3=FMjaVq0M zzp|&nJraOnc8I(CAHWjbW()+<=)IGMnZ5izCU)*+>_6E)BZ-AFC6+B~lN@YTXQ-zs z_uz=X?zIeXBDebC*6dx;yCk)P{vFwnfRPuFd1?G+yz>{%tl3vj<{ty@H`M$qXRXzT z&1E2hyh%m>1W&ab-D_Z~U%0F#dc16BORPRT!Ej+oEDKvWYP`!>S}kBwF`;7Vo4^%A z8s3$4|GY}^k&yahe}_YLvfOc@Ym3H66BD~fl->_M*eoI-vhW!YRCbg7Ovgw+)j3|g zTpsLAK+ov|(W+#+idQC16~2{H1{!%kZBcLRgh7%1{XxF&zF2*-MpoFbG(EY=ehCNe7pS{;V|1Z-XF_(U z$h3KKZ~rakYi-KL`gyyHw?1rWKLUE+MM%QRJQTg#-l;!}`joIHvPjp{8iBaP zN?@Tw7KD~v=X7SC*BVvK6Sg*%JHIs(I{|W0)Zyx6Q+cbVYIi62Su^Inq&`mPCuMSG z-|y~MnA=(@f-zkLg~r6hJy_JDTi$Q_LSlgBQ@^6`nk?0vk!0FG)bMWFXTaLBwHh028VXlxg>iZY=vE8Vt zYRzpOIZZ=7W%Kvitn2a3#2bVnT{?kagJ;=^0UAecD3Lp;lL)9wg>(Y&sr=bAr0N6X zueHQBxa#8NXOIth?xWPLJUKeMaV^*f?>TH3W&hA&Ok6(iH_@0O+MVMOs)2hiF~j7^ z%pp_H6l=sXzEy#5|12a`s6Fy0i};mYw{Vxsfil8$G}XtaoA?;-;Mmm(IfIn^9R1>m zN!%@cqR|^{NlBTQPD1l9=Q|7jrCW{<`!n7Q?0t6dpl$g?s;v*vCUk&Du8vovBjH|6 z;oVf0raThN-8y)<%qh>b@2U^wSS?qe*msr~*}KPzl-`AaLg$%c2v*O=bH!StNMxSp z^GO=n;{rXC`F93M@`v+*mBE2Ut=6MFslaTpXd293Bzz2ZTyxNKU@*=$e-()eX7Nv- znUuDe4VmOakp?8nSrSg2vti~*ePvcdJQSXP65~bmZ&#y`NkPG^yZg_G1+f`k_Vk_N z4;-8Md;tjWP{|`if64d!L7-7T>zZ4jWGt8YU!PZ$-{qLIPi9K`;3h@T5J8dkw&{&V z;?f>p!9qXpjA0L9>WC?_B)@8ALM2ebbNt(JN0zm#-$XtV^U;1iT_KowpV~e@*JA7U zq`)5PO~?SlD4)O2Ccv4UEX-T&^-H_9h9(!1QC>hf@A5;QiOqu`94A7~b<05C)OPK2 z8=p$vR+^CHycUHM2|@CD_|D4t3szB0cG}`=R<)h%Mz*SP-8joj`0O!cjAEQIx8iTw z*wWmK{{W96%tU&x^lZYeZgz5VduidKaps*Uj&gCEnqc7D7)4$71jlMS{ zZn?BBC$FStom!r1=#PD#S3T_p2u~fYRc^I{4_{nG=VV{-)7uUKsL)FNLH-v98YDVy z{u1bXhn!ivJ5B(}z=041p&6Ic`s=-NfPizH`ko1+qfSwla%|7N96~U0Iw-3wb=&8- z)cT#{?;%w5>5F?wj~iXU$nxnm>rUPJm8U^WOtFa*Bj^X9ArX4;s3(sI8nb z9vIV^o_#FWWe*}G<{xVVU4Q-sU}| zKuwra{Fqc^4)j11^$@|bvuR{teI8r$I%lJ)Blm6k++gtoJjr$setV1N6gsnq%elNP zXXbCd3GG#ua`FlEvW*tn|6(`1K95p-mqV+(q@dZJmi0ah*=Qy>P3O>C@$k*Kw(nQ~ z-oMOmClnTXgRHRbK6)SsI8o!IzEhbbO+&O##$N6UZmU6AehyW;@cV1FaqVSWfX6%3 zj)Od<&q-@a<`=FmKPx{BN@xq!9M+9|S=VH@`uj^JaXfs08GL^#*P_n=?i<``X$b=s zcnjaZi%?yMJc2@TJnRmlj)3Q;WiU*@ zkmMx4S33uCsqNSrPO}DilB(c0Sb2r;3l?V`n(W^+@-<6dUoL&@l<<)lcnrDn;a6st zUft4Wd-+ga!`!|(v(pKR9kM)-YW9SqPv@4$&er4hgF}A^?V@jJ`CwaP@A8wjN5S0o z7)+W7If00$`xa|%_)Glpj(`%k=5mZR&aNOzLQn>kWR>KgoOU4^-OYWze8S==uJwrK)4 zt2->C*AeSa8r5IW?^8}`zmofg%myeZWLy*^BW=KNsJw|zuza%51a{3@{*qC42GjPG zP52+*`_M&{c&<{sDFfVvVX;?m&*G_8NWCV@CwmeCMDMVwPENT;nDp8Vjq|h-e@yuG zC%*@;!xkdCxhjS%_+2D;U-PkF<}C279t~_(D=4eF72mU-uqu@cIlUC#nIOnR<;B9}c&#G*2?GDwU{{u_}|14^1ou=0EdJPr<@-Yq*-RuWnO{2CA=KiJ%)AtrW z&0~7luWuhUfI|eEzW#D~v3Cy-*YK=LXmWplyaEweStjOmKCD_)<$G(tC;0a^s$5fk zDy8)6a~BWy^GFvDKXC?l)Caj{SQ6w>kxQWXb0<{)i*^s|e-+u;lDGvB8OxQiDe`aR z#}>^3eH7+4%u`7%^HZ-PgRV{6p0g3KFY76+ygvxKQaYuJ{5FdJ z^Ng}^xQv7Ql=+p$li7(e!Uwk%1}ik@4vz;sg)B!=PnkrV0>(!k%HIFG)&eU#<-YOd zW6N1i2O7AD6rG?Z$3*K8fEug?G-Tzx_?u@E<_P=Sw{9 zF0CDeF}FbKyl4?lh%&Hky>?Ki|IMiRl-mct88IE4oRw_S)bb{-y-treR=ch}U;Bdd zK607}t=Fu1X-Zn`G=@L8M|}}2gF;#b)>NqZn zB-9#%O6bc+!7Qs`S7q&o3odw#&H5B-hi_q}zU-9p6t)_7gF;31QuhTWLMyh93PdP9 z-yY_RwxNiUiJ|ivKw5A9YHO%XuBh_+ZPo1+NhC?+S(WlO{g~iy6<+plmmcc`bnp^I z|GNxaqh)N9j+l$2P}+i0tb@n89&}MvOd9#uS&pB>ZHITSQfIwy8vcOqg~{+^h!5ew zHQts8v7GAKf6KxWU3igfADEgW8(*RZ0tLg8TKeVqHpzyYFT;@fJ)@(lJC?qtGe`eu z5>+E!BMbzn;NU+jV6+6Cbo|W}GHvzdUHH0vEkAX;r>PJVj50bt>Ow?qM3Jl*=&Hxgv8$}c>ctAA})xkrybRRE4e1gu_+>U~Oy)KOh;Y!{<2 zPl((#G?j?~vx_IeRvJBjgDY~nj1C0DvAW5Ek?cI18V>8;I{oZ> zI~iDIcY;S!hAYxtW_vIB_^566nW0&j_SFj-7WMTe?b9bp**-+wH*UU852YD2Bb6scYAQQl1RHaq4Rqn?n?cT8 z8;cajha;nMpWa(|xNLOkO_!H^CPb2A)Hma1JVP$MKVd>w??j>WK+Fe*Dn(|Y2pNpg zsIx~=YBPK>nXnPE@@GFWAN6>Xr0L~}qp41d)wqX(VNRJhzicj^SPuWbQKHwvx5Syn zOr*KuNma&WW>{Frrew2PG?aOHEzh8KMNcMGpY4=37HW_fEzH$F%2Kf>N@nwmKf#UYqc{7GZhhyRB&Yv$2n5=*KryFrT)^-d`Am70f!M9F# z^y;qJv2z7e`%Y<_-ujY(t`s~1#o5A~@Ref5avim+f7(W!84K}n5P#W z+lnE%ZT;#zz(<!ZaoqhgtcV0$($zsp8(5GygR5qNHj81gXLU@7)! zhINfI_>i#!b`G*Bmty+tYtwk0-*CRLMG6eXJWo!*RjH4Ic(P$uzIHze)rabxD`)E` zS#O4?3*+W@vA4;!mu}(o652_s-Xcm6Jiv|hLi-`BVn<{9%a1IKxqCnyaqjs?poi=# zLb317uxm}MrKakHhtKCRzq#B7q6l3eXa!FlW zCfP8e_#PpPojRjj!TW5TkR-ba?T2k{)GfXu{*=hK^lU|8*g<_0@DH<@(4$7+`*-o4 zZPsRK7_dS;JlAZQR8H83LkjnK)(=uyWNAZYK)=^&-Rzdl=W7c|ZYlWW(`$`-|5Rd)D{;+pIN=btt^+%S?u{t zI{|yh+z=CVqC=E=LfSE8cQJVrR0wX-vne9n*vpyK(hU}x+HbSkVspZ76CTcUP^Dxk z`j@Ge)IMg$Uq$-((2|y0Y|XzM)&irzpGAfYE<9O?$!TQHLBK;-kZ0tvR9hCmuX|ZV zA^I@KlK9M zj+beITu}Po4?xdkVt(@EtRDR#Yr*j_K43Z&5SV{ z|G`Y4WT)o{6@^p4+4Av392<*7gZg?9VB88OfrH=R^__3TB?4t=hX~b;_-1{*cYv+7 zO1Ri~;MX4ZpBs6;Zco2kGIx6Qv(TFrnYOR+*IU9g#{JYQX~W@yB{a zK0jk(7ysm+t#fsm8R;PY%vxtEQP%XvN#^dSu~RTZpuo2kvmOn5%74p;oPE9%kCJ%? z+Y_Ug*WZN?!aM}(xkmYWT%}~hy?hO6g?d!IAuKqSa#qiT^SOJKIfoxMXQv*}OP8Ayz8?YEbo7+1^iZIe@F&CJ3vmB%~z0IX3cyK z7^4hF)OH@Bb(O}*WrO@n8w)~F1zB;z)l)4%L=1h#86;Ol)0qk~E-#S%fo22FKI-Kd2{D*(Wr z!NYz9i~}{1<4ucIQ%Wm!Dbqav#Js3$ba*JU4}MBvMmh~VN)j={p#t!Ux-M;vjjN`S zg1CDrY#(I9;VXINrs;mm?#&tkQ#J!W%=hBDKHk36l)((9z9iAs8+{74Us1U6`qpY( z)x`aTA^+9lpr|d6^L0C~`^BoQU;cgBW9Aq9-an!;vXhKyilP1De}WCIDr-AmlT^Z4 zZ3B^b3b`JTLPojdNk8WjS1dWF+6LjUX#lq^bDr1cYWn=k#A=Ejb)voNow3izC8Sp9 z@5}Je+FXm6+uJ)+vW6CV{8pF9k%-v2X-2~@)Nco`Y$>}nXuJ_WRQ33Lly6jC)wk8x zBniwQ^>{Cnz&hi$d1I1Sn~ceyxNE1bUIVK+jg{uTieV5i4)AKJbT|Ck#n%MBQ<}tsvwEpZC9nih> zWd8yFkRVsJC#=SnOi4RDj}DWxAdZhSy&i7PAr@M&jqU;IFMm86+^g8lGPhyma*Jio zWUoIFy_ZzoFAbZo{dGKL6u&qa2nQ*Kg^Ycko4$WSjiyz~-He<2RcaFF6P+IHD)DN* z`N@9(C5awN7em45^6$l&MuYU~>^(hW8_eU)cUrRkoJBBfiEB9u)GZt+kMj&@3<4PU z6<2W)R_j45VTYZLdfxeQ{FtQwFJzei>ARI~a_^3x_Eqkpmd)=se({%6n3GG)tH|Qx zGfGf#;grmL7HV)lzjZ?MDAT+2BEuVctj9u z^7D4qzFm`xhr!%tnW7u+;taXzkNVIVRj7q-=@;V9t|B#_M#qZ8^uD1{=ece_9l(-e zO1>5G7MT{O-tKff%GjPfZ^Hiw+zt#~E-zg+dy$?lKJMn(sSSSmQdf+O`1C84W2C=j zTb_Fx)g@7^{h#7D-Ey}vZCxxb?;bTbBs5&87sqmo@z;0$ZrC%_m{;e_jtrEr{D$pG zGMgXd?v;ADY|#+w&swIs`u349MDEseiNHGTRZ<$_8y*Z(pEOfpE@~VZC!KrcD*X>` zX|;g8R}RwRIbs|qW|z96nc`bz&DCqanx5n4P zTK|}S%NcKD8Pod4P@9xnF`1o~YzGZru5Top*l1ypTN;A&I1sS~F|u^qkjY=NjFG*m zmZ0$5m))rpwJvaE1G;zf)Ds<_6I!rYV_k7Xp(IWL;G`#(LrSc@L5_MHP60bJasgFu zcz6P3L|YTArt52)nRGnd%Jdxc4(#SY?}b|UR{;Nd9pX7~Rd1j(h11+EX~D1LnW#i~ z*p7zjMWBPSSGSBla?<9FY4xmS-`(G-Fz9VO#42Ofg9sqtEC-{7t;>eCrb|Pymgqx= zcYfIfRV`2QAJLfyDd~P za$}njF?l?BK2P@i0{|cvoE-1ic1t{&f4u&apFm)6H*IJT?)hz*U^watdh?ooV6aYu zu;|8G;N%bnCs5HF{B{QoD4Q7#sT2_Qp1FUoIxTtl zE%B+`yY|zsi-ksfPG=zQpNcJHZYOP=*Vkdu#`gTdV_R1U9q#?g;N-=|_IP0);m3SR zZy3ovX(k~&)g-6=P)5eDC9#l?g2T{6KFzW`>kiSu{y^D?#LAa`O)2x;Jp#8L2Ldlz zfrlEzi|Ed^B6Efd4&QmrvI=B-m=M67cwn6X7)Z7#a&R75Xmd7j#u;%e$V7nZ7=^f5 z`1=)2fTcLuAd@;*zaJ_OYDONL9qQAOK?l2UouhVxVcN;q^A^;)S1f0y;`j*kGJ-gH zsyZyFD<4~8HSGCg)?x^ems*6p&nBlQh}KnGb&*vAdv=MxX_2zmJ?Rx`OsNN5YFh4( z5K%2eg)0cWJ+JuGHp=#LY7G^tyfc!icaZXAI&8lNh)}Z%f~)Ko!2}YVg|a^}+ZEDr zh<#5Ee~8Ssm%a5x2H%lPB@(q*NcAaoFHdfa6>K>=j#T`1J_zd2w)#4iTmx+wKA+gC zTh?JfdWV4-1umk9hH5a5XPfr7iSx%Toegl39!a!0cRU{O;Cyc-PQviV%7E6g z)vwwgZ(4JXzsXO7(q1G5BEQ^a`OD1z4gF=+HXD|;#Wfw(`{~(OrwLvts!k~K`+K}2uXs{XnUg&+D1xdBC~ zvcuUT!gXQTSKqSv#`nTredJ5?Q!7%TxzF|Zev~Lpw*wALedbPUsHRJHr{;{7TBaeL zEDfhll^yrM%48 z=O|#z(mH~aB~ebi2Nw}#`LzsW4Mxc5*SEHW)!ig8Ie48}>eCPn49Zf6ipG6UyU>f% zNnoFAczto_t}i^PEfyHj(=T)TuF}`u*SZ|4DZ_ zjb>LpPJIz6FQ$$o29-QYY=+R49#?G`z0b|WF0rZeAZ>V+8=~_`NCms`h^WhJqc1Jy z1usJ7Ur@BsR1P!D?%&=gQ1G&TwoLJ8{Fe91ZAh1_lJ{&UJnukn8_X?S8T3Tz8{&>0 zzoeI+$mix{z@QY`NrN2h>V4@GT9Ly-9^{0u@&r$fs>O5LX?ujAXo!s6mcz7d!DAAR8wS~m5~ z;&&pVhAZ>d=5wK4x}7l&{B;3^NgG@N)W&HGi~Bf~n#J(s-a3LJUWgbMaJ(PViD9dq zYGJ;pRC0NnX0Tle^McF1xI~tRe2;1d<#n?wRu&g_@>k1$$(39BC~#V-tlX59yf99c zC+Z2VVP;u~7$oz0WWk+ms%4J0<}f$q%kRI^i**SMNoAp3P{=y_;C z4G~&?uhJvF#a}1SWScantqHyq;`$L%)I{tqI=HD?1?b^CL5_ow$%(EA7s*T1ZD**4 zpUJvIn#qj6g_T&wmu!uv@go!o1q0WJ9KGS}D_o>TpV@Rf6!ujhD5?jzjd&pbDo~t1 zQvGSTvkS9)Z}#*n7fkC^k;ou-(X^{7`*RR4{tl@YO=oddk>DT_kMeg&EwCy{9x>UL z?IUrpM_>*#`8-Wu`JY`e?$7U8wa*+XePzD$Vl{2?zQJ%#`=($vB9LH0DA~H&$Yo5) zXCWb16smZ@Ld34PAGmXXkp8I}u)8nCK$=HilaQ2CQ9-thRXQu0d`3&*3LgzF-O+QT zZ}|_P%0k_Z1D;!bUUcoHRC=~^s+8wKYnyAx|wMIGu`)%x~ zD@Gc0Oe-hjS8kC|xg1@tQD|j}g{Dc|{hdPh5W4D3O#L4~dL?W7_S^Qd9{u*(uwIj6 zFt4CKvG*4s5y~%ISI=tms9K_9`s;MNqJ`i~MP#hF)-hku=^y#rRFCK)>Eoa(NJ(Q2?T|r(YIE?BOab*>dwTR4$frkG%|*k+a^bYf{p7@m*J6dg$VI9 z9#4&KeZ@@{p6QRm__Ph%G-+G0v7sHfi;Qd{bN8yGIy(lK?OWoLQsjhs^BP1PqLnO$j&i2ftVtEx zLC08ilU3(OOMkqB*2)+6s8K2=rg@NGO}aCC1%iRN?Z+z_~~6>-L>MOXF(Met2!{7WpUVEgn$Lp@v_2ez%E z39?^q&1?+V^Nde+<+fe}43dgZ?XQOJUZJs!5wI#N4b1anl!jPc!s0peZ?(y`8qbcK zzG8Im&@Zu}RCf_hM6VqxH8W>ehRJ?98Rf!1Z{zgZBIt4aD}{`_bSL#O3iiX$;9JH_ z3k#8qQAjMyhxC(FtE84q^xW3LWXn<5w=Cy8?RDRPDYMI3ZQoAk<#64lQdp}UF&t>bElwT__sHfdp_5A5b?N(wm z)g!axVknd?d?6QRu+3WWi-VyxO-K3H*xH{G)*!XUO4H={DgYG9c?T-DvtGbEc-*tJ zyc8yQdXUf6B%V6|v@czI+NqfzSkt@PSI`vjZ6IL#`y-Ja9u@+}y<9M+em%5`*W;@S zG17|?1z*G!vxn-~Em*mxGu2tQm%0B=CSmd0hob=`9B@Lo=Z3?nrNM2bQPzWX@A_FT zG$cvt?!Pb&QJZL2@h?^LVZz;8-*MoMfwqv5zeWb(U~q+dc@6)9nhXS-jgN$k$%XO3 z;+)#!ze94~9q=+XSrt&*`fZ}ZD!sG>6dc{AJbXQi;&n*WkW*E`_7naabtY6PVse%3 z)f>4fL+|Sz*(?McY?+s}&-f8?=&d<=3?_mS{Fe_OsdpqR#RXd;!GG3YgxP*z^DYFI zfPv`j8#mVBJtNJnyOT^heZ94Xvpj!Iy&=SC^v~vk=Yb)E&g_fF_c_(q7VU^&W4mEA zf!+JT4%6qqB(qHNPb!eQb+m$x%;pa#zz+WXgacH$9R;_+Q3~_UEY9<@29K_t+LU?K znu7=XTkYxu&C64Y*WFe$Up86fAVt!iRqpyqFgMP`r$)OqY4;jJzU&P`$JxEb;})g` z^D^4gi?5Z{Og<{P-Vvws(N#YmcRw;emy`lxT7%8@4i^Y~rKreZLY^NpEtgEZ~9d>e2XboowBq7+zwr)_Tx_idPJ^B#vFJ zq$+%*ns#2uXF22}NVO9O}f#t6yf(BP(u=kzNZ{@}#h4mZ~3 zpM@V}bzXh?jJIx>^b~4vE44Z2Mlm_5{~DtpwuiFSVorBflFhF?def?98LT+lASxe* z*@4o`M&4V!$QG85PS?vEWelq z$>xSxt(A)l4!D2=b2} zvwEf6j@82Rw|!I(%~O&tWv?8r62CP?nRHZW=Qlq)E!UAg2c4H|@HoWAJ$3J&q$9Wc za%D>ZBX)}FYrK2hiI{hhjgBTq44Hkm%|1yU+-&J#FRLu=d^nZ>hXEW$N@`QN6@RPJ z0?*H|lU2ic^LbjCgiD*M5G>KYtB7oNh~j}l24(FLb0sdSrk_{5cCOA;ggmW3PWJDw z;YJWY1v8{Fo@CRS^otuxs3XK(vDYO+nA*3ghIf-aR)quK9L%@;T1=-ur*=;_#v%kIn~dCZix<-%WKzBQK*B{5wQVFEr79xYv-8r+AyMyVew;_s zQQwp4k3ATz*-beFpl1L$)kw@2@Hv3rvHks>rvv(3edF%880J1{+;al^XqjNI*QAc6 zu9`(k(XnK2dg=zS$X=V=dpdR!B(4xNHc&;sso#!8GEfj99UN{ZIb>Gv_LIte(41*P zX<0)pcsaA&a(+}G!=s9Mh+{mXzQV>Kzw?>*1%8cKgX#8;Gq~dKU>1!Kn0}c}=$5&^ zK4<6BYZr-*wkDNc)ca*!fbVV#@tJ&P#lq%~t(!1QKc^ihJB zfOwc@5uQ7sbl#9==*4Q9V4fu`NJ#>wp^E2NQs97A(%*|CY%mu=uW%F~K6)ecu1L`7 zl}YHlieIeD{Wcdm`(U95bb+gHNlwN~DqS$cuX=U)zL|aZfWz=s{L&QO{XF_u=A~^K zHTXDVm`QWP6!-DtrPs6^*5B|Iaca6j-oefgiHy;b7eljY^NOG)dl8WorS0D)b(8QHl>&OGuh`9T`Gh7(*x!ww&LgiF*>N)E4NP*9Me zaXc*by7R-OZ#mO^^|?L411&bnQ2NN(h;~TL-^#g45o>kzbNDsIWM8)GGKtQ>;BBpL zAl^@oAeK5pTE$>I1R6!S#7ADUy}&TT$9%|db6gLne+FJd-*i>)JeN*RmC*(5H)b?z z=F1`e)${KIf@xnF-RcVXj5xV{^b{LXg5G8VZ}{?(bi^N6-GN6(2Q=1}H%JZ<>Hh%PQ$SfMT57Jl-f-@5 zl-cGVRTv@k!@gbDkY*$}Yiddc@){kV-UMya;!O4>n9ry_M5-Iks}83n0Gz<~=YT{}`z8I-#rK`>pyr zas9LqRA*n^$wsn=t45qDBt7rNNjK5;~RW}2haNQTkM7)E7(T_ zuv^w|PoZVSHZ4D9V!11T0$;P2>!h*`#r+XQ@&0%p`ce))8pPK4m;B3kXsrM3?EV1WT4)c>nkgvwWRcaG^`s&|KVAs zj}F{uT7vd|U{+b5DE%hja2TDr6Bif!MfjImgJrrnXue}cpX>rG z&FNmd)K}48mC4k1!1b0X>9zs~92A5z)oJ^pAXqUYBXjlfZRbg#0ZhYerk!6X3ixL= zQd#PNViSxPE^;ub?5q4){Q-*xzXp|iA|+EG{h|wr8L+d-@?L@pn3W#QVj~f;{U`8h3LNy3&Tb2CZT^Yx*Z>dAdSQ zRwQ0OIZ>H5YiOllkV=gri5OpAK#34>{6l=mIz)5mryoeY3cF<2EL*R8M%c#W);{+D ze|k*)@cx4Oi*ST;&Es_Dr6_a;&_reIJMg~5(l_loKqXf)#yhCVTRbs^z(i?U{c&KW z`YX)UWkgv6Me&~6_)sGSfdTrCzaHZ&>e!`|A#xGZ%u8XJ9U=UyZIH3>5JPt5;F_N` zf}6u&f>O>BcHGnWhj;g#WAL@(BY8jc*!_tkMG@kEe+FlIR__XdYcR6Hyp-d@e#i6JJe#tt3-tPR{GtUDx!%24o3PMy z=iO@pg!_Y$Ikgk!r>R|Uyw+X#2{jDa{6#jHA*%pZy$xR;mDOt9_7|eI=e8^b%^X!e zFL`ruO{u-(_ufnR&fO4SFufXlrWzPG_j*%Tswo#)#5YveG>(@h$vQq`U!tpDA9?zq zgwuC!h9}-96jP~V^1WBzvaghT+K|oGM6}~YS+s_ugM0>-{iEDg6YCp25%cYQlD2Ns z6PkW2JbeZzYFq*-?Rq@Ybe`ZLI9e;X*{kH@<4w%*PlyO$Duq?>Ef?CkI+bV^yzCOs zt0!D6z1xXe7l8vIsfQ}IpA*Ucwjtwf{l_6is4W3IkiLfFWB;m4B0N3mUUs#dPvGjQ z1me6k-Ugl{;Xl^ZuD)2yEK6SqwBI-f#v2KF?h}H34x`k1PXLw~abBMeh%p>NK;Y3X zpIo~5^3Kt-1QkZRo8&ECN3Kud_Ach%13BCt1K7tH5o&U#RpfGfQ4-nbQ-P*NeN<0Y zBfySo{Xvr6K1%61=JbRwwZ&wkpz~pMmzlR3GX(rmCW% z^);8MlG==MsUQT6m@c5Zn2fDWDhw%{S>BkZyL@hGscukBZ%po|idpo55A;(&dL(!j zSPy(VvR9nk-|hB3;QP12Yez~JWI5+?#@l;5pIozl0(zgA%n6%8-`q2a4CUj;#%*YQ zGzk0IoQ&{yC?^ir6&b{4karj7K<5O#Ez^^WlpgN*n(jp#kIJi0T3oBZ!l)-Q?Gp-+ zamm19?g52h7&A{*sLQBSWo&eEPxR&9QZ+(TbdQP2$zzID7$aHm??ZF#Z;ziSmMD(%!4_W@Cu@GzQf+Vd>vY0=WAZqySXrn>e-+o$4Ad{{7|81vxf#g3$D z<=wAEUfxewnv>{Qg?s`yIigabqi@QC7fWw&?RiHW(eOfwm*A6BcCi{C6B81E*=GL5 zz_xB+#oXKA29yKBG?z1iP3+%|7^&LpNWdR8C4^{0rI*>YsO8_ss`2D=xDYZcJY7q_ zw_dU4PF@$oi)Q-TCOQI}WG`CK->;WV9q zbTOnf@x6qMC-7DxCU@>vBzL=3N%EVM>E~(P?(~)6B65Fu{_ytkx=yux3hAO^Jsjt# ze?V|;TVcWWLvNOhSpMXViG1&Zk|kEINM05riLwlh`BaV8WHB1>3UvhhC8 zq!dt)kr5E2E&(x{TOAl|i^daeL-CX?Pkzq-BTqGS}0PqP}~!OYk`&)3IRfaV!@r@5VW{k@#5}U+~3W+NB@I8*xA|N%b6r<$IQy4nh}bU(Xnnn~6?nR*8t!l@+Q;4!Cqv4P;BPzj6~N6C*qbd{ zG=%sQ&+I;8?2^ivYTf)_Bplpizz?iOo42+Wy!A1|6QIbal`oZGIE3M;|aC6EuOWo7UbW(!Y+mvxK&h?f=;rVGuSe%OrGD<0-Aa*Kp zvlrkmQrNpEHQME71zN6uqGIv|k9jSB{Lh4^FMH>u*wi!hyqi)*V~JW?PKXMNo02cQ zC$r23#TrQo3v6x-G98Zaw#ir@ypXpSKpx^!eGXw$>@R%Sd$l*)`0H^0oR@XVFH}kl z4*lp@6hhX&^7FbT6)v22`z;meBlPW7JV-fevSo)hN>YW zTYLwd?&56=ZD6*&^NRZ-#n0b0NJj1`((>)wy6Ld4yn6=*PA)%Z6A**pL0+WO3hib} zDlFKwfn|T!s1tVVsmDzi#g`TO|Jm^N8-TCF1c|V?8*}^sBV-00_1gNdSz&)jG@5;1 zOZbmZEFXk13`a7_^Ed|}W(DsNFVwTCQpv65d*NwtDl_`4TfT#^Z7pBH4;aA^@PfxO znfpg9zjM_akURkEG9fO`31%&1-^lUH3|WM%TDNMSga)^9Fa5n)p3GSI*SJxSE$51ln*T#)F=URPYGQs(C3zbN{cldh05EGnm zob!G6w=vhNSTcC@JK1}WM0nYJBDakZ^^bdudfcvtXasl3|Bk7kkBA{WV$-zGO4q0?`e|mLZ*Du{W12X(O6z}5 z_fsx&Nfj{ZR&=YPp1Q5I1hZxwuzl43XPw={bWjs&ANb-sveKv(JK+|1n35kpl$d^9 zXlA&pkFx!Hm^;A^XP@l+OYd*>^^D1T&s6F616#x&JIu4c6dYa>Uo=9tILoAv6k!6N*NI=otbGBW`ToA{le<2Qo+PjN;v$xB)%`$^bbz4~N_B_UC8Hx`l= z`vnhXk(4`1ADF7HZd}V>R2KGfnWn>`wdZA|5Ww8sze?~lNYu|Wh8WE-Fd?3l8{qyq zO-=m#_T|Xhy z+1Zg{k=W6KCs>SM?lx@xGru=yy{wjMuU*~;%eqK~M6RxdnJ|7*UHlR4k>_cakghI6 z=C2Ud!~M~gv3aUzyV~>Mk4Z`!ZSN$~6-b3pHL({dJ~gbYjpU5*_~^%aeYglsO~Sp@ zQzJ;>0MChW=V!=EV(v;e$X@6j3#vJK&#=r3Afqu9Ns(y+R_SjzIQ#}4nU*F)o3iuf zaFxFPux$h@Fg30~tt!^r3gRctxOI81Q(h`##&XBkS_D9^C7Lo0PqW+z4>0NKq|zgA z^fE~jkr2?yz{{9{q?`qm`1&OqE7bXu%D(DW7x>~8KB$Y!Uv<{&M zaaRn}4dYoFqQs5AR(+T$-ev>7F5H>+ErgC}HrEXz#B-{VZ^?kR(w^wGR|l840KbH2OV#(-i{{VJ$l&fEG+c~gPn6{1_|R_pOCngxjUPUJc7}eT z3Lh0t>Wk9jNG$g}bbqJp=XX(;hg3a!-kZ3B$ zFVPL-$R<)J<{J;-xr&TeV<--6oR>)ua8o#s7r(lZz0rKP zz#Fwwn^k`)YBQ;b{`S{eqv}zRcV}H9V8wgaO?hXmM9~87oM%666jo^KxQQ(7Jphdo zaMutz@ky@xov%@D$BejIC0-=kB>8y}Q{stH6vV3FKGsEO4FnG>n>k9D8mNxf$QNC? zwSIJPE48T1OFcMHV0vJg{N+v=v7HHrPd^^*0^=7 zMKsRLye#&_BD0nWt-s@@ciqpa3d0fVJhdj7UkCVB^Z~Zm5UqYwOc$A=nWaRo`{PGK z!uDV0g;K4^rt+{+N&B=uLVm}W+qJ$4MWBt~}dl&Z@`EqDctCNDQJ@;usIT)`_O zfrJ7pmmdXQkdop^-xEkpUDWsy8>WdF)>KE!$Fb~UgPS9@`gH!%lfXX{t|2D3bW`%` z*%}{eckdd~^tf+dayD9K$Ej2@7$1Ru z-$=uh$SwQ);-se&;X|(yr^u4j#^&r4^8Kv*B)Rj>wV`d}`nDszBcHl=Ry}0aM=5SZEwgmwAD;7_2vMxF+Svv_^`??Z9Km2rSBusNhpOgs?2gm5F9b|=R6e8(SC3=Y#y6{8C))oTS!1B zD{m~8sAPGOwDvXGdiT$|xh?Kr&z>uNk5{Vk%Jfd2udqdP!JN3uVC`s|)Eq5^&vz&; z5CNN}XQQY3_jIFXwLy!dy!4>Fs`ew^zn(lTrXnOEU6&L&#Hn9C_LCEv=;9MZT~7;M z+!$Id;6j#zx(ZXrQzG<&;K+Sv0oHa-O@XMDOU5+WbL6?3gX;BTG;=A1Y%O{gd!*p! zmm;xnwA4*xF+<5HtY%@xfJ>mM%p!edtNh@dR_3m6WE5{yLthOE(tkI9p`J~=NAvgm zWB_0P$y_HnW1|I7t@C>q1nLKnxY*ItOyd?e6;&(N>rr&sq zv7DTYgK;(E%^M%Se0JYM#{_PdJp3B`FCxbAW19)wdhD^Bj4Ah6a}uM>FCl$4K0ke$ z2oKgffbfL(bMtz3rBe4gYClpQ$N%e8@qGGFhkKTPy^@;Kc!`|(UI3t+Ca74GG8k=- z3(;=A4=U?Sk*4IVG(_zRZ4}}me_Mc`7u@-5VyYMLZ;er_v#+Z6s3JsD_>!VM1D8GU zLbN_%rBJ%=SZqhSyU^94Ez2{`(PyXvUt;4L%Wg9q*6g^4XFLo}uZAku1dIJ$FcM(Z zMkw%`xD2~#5)C_s(ndfXs4fF)Fau?0y+2Ea1DeEF{GJmnESl^hP0XskCxCMZ%PZ4U zqSpv&eVs2$O(~cG&B`{9zsSQ*NtdD=z2iC=N^TUJzcc{#^|gB{h3#5j_=X}fQn#c} zKgjr|P;=XEG@1`V>w0Rb$P#a+m1xooNF5Ldzjv@?;E%h`pUF)v@`*5!p$;jonT39? zHQXJY44Qx6lKNd92aV1-p8maHO<`}Ve^PXdjY*}4&J4rOHWSvbg+RfT+dd?pLjuDZ zj679F#j-xNTO&342;Dh9@54}?sfd6*r305w5Q3S57d`#$kI6{ZoM%k+u;U%=Otj2|kbd?Wu&HK@ca z+G{V^Psaw+d%PRe9KL(V$C#bJc{k>slJq&^#PjD0g%I7lBJr*0pe=pjJ@4vbMgXOgW6zxcUZChnvp$)^N*g3fVV5!scwQDnz`@z~1@4|EO{He^V$AgbqlW z$bI_~vmU%n7ouqWzr=BRTm*ueCR{QQ#@7~Up!ba3nescAVLsgir}^_$j6IENSM;eu zbbNG~+#!SnY%TJUwoEV+XOmE!x`?-es~c3#M4}&XrUB>AzqO!!Cfz2|b^^K@5UPXQ zO}CO;Gy^;d%wmCshUK`WN6Lbgt!R=55s$V&;i#~{);$xQd`w<@@u0~nM)h&p##XI7#>5-;C(kU=h zYHBj`VIJ@zqJ75ATdHCWb)FvtcjXbINo1x?LOh%4aawee!%eX1?Xyg^Is+PT7jEA~ z6%VkVXU{ql!hrryTd4{1Wcjie8_IvaT1v(i?)ke3x6QZGd@vrVT+#gpYr@hb4)#*e zx1z8}^R>*o-Ho_jM9GR7yNmp_2`XEBKPXXM7plhEwFNZkBgvt&WlzLA?{U$Z=G-$P z%IuTQTH2*ec$a-r6x}?msf_y>EUo4AxS&>AS(6_6}o&8EhN`xBQ=CKTm3*`^S=Jk54cxaDW&<(Kxf z<%g}YXARO2kEHIJpGk|}JP4S`NXNeX(?HAj_1n$B}N&`J4*{ z>Cus8@Q1z4V5|BZcr6DN+J_kjXhw?(Dj~~6(Qu{N3#FtSzeGKY)1Sku66V;h>l*`f zO(8`adX?*i?Wxk$B#NUOpNL78Ij|-!zeq`;@(^O|3M!bF+@d>r5OFYm#cDyJG(HUQ zz;&5^KmQE2rza&M-YER32;59xBemlNzbHI(+M;0XwtB&4vvZk(%R_{_EsY~md>`-3 zG(N}MljIg`Z5N--g|p1^va=p&RT`iIu&KLZM`*~ut*x9B5P!DMA;xmn4Nv`NkN^&g z6V?iVk?=g&eST|&c)zRU8;LWrwU-Jl4~w?YMROblXf!tN*&C_(ar;-5&P?N!=a59g zhkb9Jw^!vvv{i>&he`TLxhyt`B`>*C$;oJk#tnm4D+g=;qzld*4k&*n=Aa}f1h*|e zcft09t=(f2M-06H3cn8xFa*+#9)$^J3Dsx9`QeGP6LXkv+6)%nu`?`O6mOFl*mnjV z360=lqyk)}n{NEM;evAzruL9VLTgeoPFLVfXzFJD?Nf)%zI9A2rJv}>bzDq-kkeF? zFS>cc2HZ&l1JBih<~!F?u{&$0LAp_timZ>Fmrfx8)4A~PN!P+zHDUd)>jM7)6hOWN zx;__ON-U5TUu#yzukymLVjoIts+e>4Hr~|nb?b*h<&N42s3XFQl?xjBp!%!hm+g+~ zkL7E;B%a9)i>^lpHcfq@O&sN^Fd6X@dy;?85_vgbZXP^tzjyGV9~s?IHt3+KWjdTN z{V{02rDpK9z9Sqk`vHOT(FxY=jlMdpzWp20`&O=WIuiJOL`Qz)NdO(QmeE>?I;Bx_ zDy^6XC=pMSge#Yg3s-zM;Cd~1ezltQN5`yL3&^=3%bau& zFS>W~+P!~`M>h>8`++@PS>CFb!D1`LwH_0$e3$k__}aDva-*95pct=9&-yN1$QaQR z7V)R3%xU_AeI-Y-2O1t4j9>{Y)Fp?o$gmtgwo-Fc7TMWr|1dc7EeW!T0P-9PS3Q62^$&bKFur8 za5PsBNk-i+znr+)x44lvUB19s9W(obdcD?JwW2~>7F#Dvsn06wlz-OpxVfB}w|B$z zQ1%e5Sn^B!5%4lrmv+uXKv!xwhP?7n^pkA-l}I7|^(T>N1Z&c>IwTEm+@0JSI~3o0 z4dqDNi)l==71fVT!trQ~;d*W6MT$OHV#SnYAcn!tsfv`H!=+eaH}SDNTj*XZK^gt7 zBhBjSu-YVXz(X82ZF^PcC>A3yG!{P}@oh&sX15G-DSlMa8K>C0)q&aAB-!wk){gP$ zG?<6!kSfdk62J3lakdSR!r$1$EV*n+8tPqG9YgVzG;}PVqVlXm-_^EM|1F?eK7dh(p-%`Qd@ekkh92-BpUbbPu-!NGw)7mj*U+B(%Jn`Om2|p}g4o^{EahZlx zzQ54PoVg{bSTtX^rooUwZA28`DroVUh14T_p~%!y_)@dGcF{I>PFf#4wRvu5+wf0b zb4z&y<3PR6Av^rHT^PP#pwr0~iy!Gv40| z?V6*mzTSWz{B~}W%JNeA*M9(h;Pu$pZ7u4j<1;2DRRfOjiyBLwERUDOmPg#LH6;u< zyF_OzgQn;08E2~=vz@7{c2%Y%^nh#x*kY%o@$1V_6GeC1N@AxO5Y=;cRHJ`zB~NqJ9;I8hj09)9MiWI zY@~!Vw>TEfY^3?*1`!918Dzh~(L|N$lR9s|V*gb|0a=e*L}KM>pR@j#@N#s^Q&-2v z@9+4mBVX7!XX5*SE~vweQS?6ghbwPKJBXF=Dtm+Dl>&9(rcAi7rpOKmfd%yKT~5I z_|Db3{C@l@MM=lLMygOmUgF}G3Z1nL8BSPFX4}2#WmvUCD&tV=!Y)<+g#d7maH3%! zMO3r%b&fv1K9PJaLj6*@g>u+Ee^PPY_Y-~Rdlf8VrcA%@7swnxHE&;TANFZTa=*>W z^GQEsnR2HW3|xlKqIlj;ui6{YZ+LtvWFx?ZGHM>n^&U!;y`Rc&#!Q|aNXQ=G>qY4q z((p60lL$pCxloxuh)jR);;J;MHN6}Bl-oaN5EP5Ta;f@On0Vbe!;E+Oyt(h7Ca-ns z>3Yi6R1;~EolBzaLcAa0Y{tmj9HHu1{#}tiW(bW^m}F1XjxYp=Pd?~twtn4(;y+5? zdS95pfgarz?AXKnegK<|c*LA~YKZZ0Neegn1$A`myh>tg{04)Q)E`X~V1R+R z;>F2nN3qn^_D{=|<%KQyw+rCGh@`vkJ*r5ur#o>U2V9x98+Ear4)Z}lenP;Sw7|$z z^*NgHK*EG#zFSA`h`LE2Duv3DUTVXaWE~iKHD9FtUZ0i9p~3AkQtheg>WxQv>{@t| zu~RU<)|+Zn8a|FRx4B(keiJPiCBPakRk@j~$^m05pCD3~dVi z3lT-6o)MHf>e@G?q0)GVHtG;q^b+XV^O6v3x<7->`)j-0tSZ(Ks}ZyQJNA>qwly_W}OeZ}LroT^Ut!18vQT@XoOimu;~2h*U#b zgwWz!t8fJ#K0U){uj$U{`+Azy93H30-^cm$vA=YS?IayJ3dzrt)-s_Gc>9|%=%aUb z@xr|hYjvG2F8Z&TDUXzys-^?MvjqQ0lZq*JF8<61B%#S)ysjkHW_+dzRbTu9 zB=x86_z~Gd%kIs@De3I>i&>8h9^& zp6;f3*m0tW?q*9Zz?45rc1-?MJSrIJ+ge`oN^i$4bn3Da~V9014}WkM&ZPGWU`t zo}M@E0~Ka!t+*PL(dTR^If9+(GLsW7Ly=dm?pJ3sB7oSAhoXhwx}f_Dy1lri37gEC zlY^BIN42Y*q?G%&+;!O(^bb;>#dl`Qj72berw`3oBZiI5a>`wPt^BKyX|0JojBSb| z^-1PVnB@dYAR4OmsIKqmHQIydVWh}J4V3NF{m9Z_Et9PjOMiX!@H$ow0P-&`&Z(Tp zSO>>hDsn2wo4NVI#}Q98?nCps@*%)KT_n$x^oa2npk8iNC_yi5uWi={pnv7BZm%>x zomZ;}OU7bL-Q)Cc zE;SZ~BDsZiZ16&V0`o@|b_14@bv?{Y2*0-j^s6K3~qM0a-NG}93yQutQeyBjh zp<+mSqPBdQRpsihKsU~|Oeoca8co2okg$4161~BeflE=7rR&F!(-FHO3ta8aRy=COjHBkz_4iI^Yb z7_7M%o55Ge%f;z4fwNzE&A-)xMAp6oXsy(T2UT#C*CN-?2+CCVSpPiytui$+QK8|d zTWS3(s5DQBl${usLY)lbSR2#W3MMj zTrUSN2ay9&bzpRO39s{kMN=gPLkh5IDIz!o@pI6`skqDL*1D;bup$y z5W^X6FceL2%3P0r$~t?U7vX37UO3mQ_l-m+efc~yYAZD`en$hI` z%Ol1Re*7Q6_skGNy}&WtwIOpbBPm_%uwQ^rDF>v?j4_3m@8r;!Ey>WZwvffDR>C$K z?QxTkkes$7)L#F*Q4qq_lOQc73nYQ1^-M$*`sIF*x2|9POb{1@+V1Vo@T6Z4$;XI~ z_@49E{b~c9yDZRdO%J&A@Iad;jRX9V;9I*F304$?+lZ@v|HBLtq^`%_4MU^DF~pzO z`LI)e@amLF47+9BxcL+(^X0lamd>kAr(4DJ4kFkXRb&=)Z#?&|4vCFF9;kN}%=FMJ z{OhmlShp~sTMmw4JT0BQ$|tbr#0;EpTugC-r24NTjQ%^D;}4B}Wld5rvQk z`o@lz?P*jV-zpD0=fgUh%UwVTaW^57&xp( zT{1%3xQa%=!;iS3;rA5ofZp{S)^z&3a4m6Y7HK5X|Mm-YbcjqgQ}llTr5F$CM*&D%0#$68pv#e#Tp@#q zm{I~kUic8|Q%?;?QiSFP@pdP==9)k#lbEugrfPihoWVWXOSu2K6tHK z!oM2(u7ihyM8PT?;W$xxh*YZAvis42QM;zmA(r9$I9(X8mhbpscyel%iK@#wiFfcv z_=q8$t@su_6ZmYK8&w)-%*~v{-b9;q$ga7KJiNwOp`OIJ`NjoD>Y-KUKV(tnb%4ft>70L%=Sx9-fo_5ET~ld!^7X^*ZP8@PmSQMS~BXl*4>bW(K`pV%yi3QnG`>_Vppm@wm2lT14YO-UNAD%=qQ#f@1jLw?={Bi?(sDiRoOZ^5}dyXqJ`u(S_Ynk zIOBx{>By(}J1;Z_L4he$F>>Iezoa#>t6)%#8q8x=X#!+T8bV9qEFE@af%seM3l4JB zks2zUTUtLi(;7Hl>%@o`w+tqB%`Sy=s-Q(Q1R3eZ__O9&9^-?1ADEw71{AF>snc-d zl`9w;Ef=RYBILRJ5cB#0;|nHQn`WwqLtmG8zJ3?)8Jf6|VyM(e=(A1U+}zynr8X(# zS~{>w-E5u}wp4vW}B!@c~{Z{ zJRLul$x3MBM2hp}K=+GUK|iW(Gq=i43SE9Y>}>h7D0C`$1ucOtFS0ZWjk-0?DEfDA zW@d-pR^*IE3%rQ|nONb5hWH$fCHa!L6-k+cKJz;r_DV-I659@!$C}CVFBFP&B zXGYAF)dQ<@muzM@`6v&mhv_JflsPa2OfF`u%VsH5Nn`VAw{IxYWG=}3VW{fYv(BSv znQ>t^gy_-BQt6(xE`g0;781+umAZHrvWY<5B~kWdLr`6W^}8np13ur%q`{Z@jK9Ae zg6HQupquMJOAAmWl0Z&L0`^|Zp{GA#)&7a_C#%?83iuM3lU_QSO==Ryi?Y=+f%4Tz zzZ#U_>a38-IaWJCMA3R7-nlc{?CM5uADG)noRa7jvbd|}X6Zy1t`sP9)b9(so^qFQ zm}f$0lHyoKKL58`>)wpbXw|mM51CoR*u1*PX5?{z#htDJEv4?c-y0rhZ9{O954r1K zzrRdaTla&fhG;^2QkQ`?^||3W`TM!NAI3KX5t$CI>WTd}F(j^^AoNUCXJ|FGM&e(& z-Wy!d4(kq=g;e)_*k{1K#3ZpX=-KmXlO7lYjn=DQuJQvw<^{6nCLZ)lu4Ib&8m_Jd zjfQ=2x@78P)|@h|YlCDJqKND_zay%a`Ke#o`wyRhVqz~~dER!{G)9&?RcSYI%1Jrz zI*!0*8A0w=q|HNc1Bsj)vtS>x(0#)*L(uBO3Uo}CUQPusc%11~L)7n-3(1|ckL1eE zmXrtH+I^?%%fcZ-kt9IBi&8F2f)ygEPiL*3Y8GN}Wm5$UgR^JDG!4bDkZ;r{@r z7u=_vN1vour|exKjZEt6l0B;+E_8QEk_yZRh%XQE`56w=qF#H{MF~ig0tk_=zW4@I znPrVR9}ypJ`8Wr|cAy~}e=2Z-e^P|6seE31@k}G&B?6bn)9?!Qy##8MWb-NEJk zvR`l!Ybdb*35NE`Gvk6o=f&ZT4LhdV>I_vz=oU^e!Rfl^jy8i^7&fL*NW5Epl`mb5 zRnmIm@gOjPB#N077HM_*S+3txiJ_BaK~V@5?%UJ(J+BL65Vf zP-cJEqx?tPu7AE-yLJl z07%BkjiOTFOPE>9%QdWQGVy_}p&=?Gn1Yb(_$&R|_*g|BHckhrrDM-Mn*BMSSlnUS z&EzkI8U+M&&hg&~;s4=uu=>nCJ7U#B_<%}_xo1`m#0(xGpx-h4sqbN56ax)VN<$34 z$o^ogEP}`)Ic2dWKZsHWnMbCQ;$Sz>A^xR~`(L}$qt%VSgI-L^n?yPj1dmJko>BLV zn)wdU9BL#>lx0c!aaXV(H&V=SLD(P{NiN@hnV=vfa3n;WjX?IhXK~5w{8F^wg*}b% zldd#+kT^XP1h7{2amz%MAeXA8a%E_6{k7e-k0x^WWN05wVdVJ^Lg28DqAm6FTBACu zH8jRyLT|U}SkKPA391BdmHPb$z_n?I4ywwm>D!#xUw-KLl5*?(R`In!4y;J2U+B(| zQ#zc53Z}kgA;G89@sH(z{oD*H`zMiSg`gNz78w;Bq51%VRTs zoNhOty*-l+YDc~Z{Y}nadu!2e8Xz9@=lG|SlL-qE1oJSg@(pMiis%sGauDDd0yTV5 zRGFijrw?8OEw41j5CKu7jz6-pZv~{+2QE;`?|}(!{Z{0&>VrYPE;fu6sbs5w$kcxa zJH`@WjezkN)y9{nx?G91u}^~gdfpk+%c7+BM(nZ-O{~V<{;C!moJ#yXs=iYzpBsoD z2*|cu^aFYgD=E`;y~i|!EaKNA{;{SZ#$sal>-SPUrT$Itn4JIjt?z0H%)Cve$x-{b z!~=grb8=MkqnzbwiIzGXQD12FyP{dIs-@xULAUDQ7@3Foa4b!;p@moKwt`&pCEQ;BH9kPU}&$?>5h7puRp|ZuD zy|!(F@fH{6$R|^IL=zET^0Q8;I9BHtP>CzeTFRy>!n5DQCsy)*njsQ#NJ^MJvnz(Vt;&A`yAU@I+o77EJ)*uFS7&vl; zV{`9lPTf%Efb2&CsTbh2zwRZD&SdI8^boEGgt-`Hl6HuKP;iJcF!F*exhJcX4kGW? z?b2=9$Yi?E6?MLLjRZB5sGfXL6qkBLro9U#b^J79SW`8Y#9oI9|7dseB382?-3Tnv#`6_DLSwAJFvmEMQjinwS|H zLRY>O%YIXxuorp0b#qbb5K)t;=+wI@QG@C~&&EvDP`|XI<9QpAaV+1r9J$4^w)cKS zIzC5fTzw)oGctx`uu+o;%Z#DwN6gNsh9Cp>cvS(J+>z zY#cr7s#ns`RW;t^5eSakyFM>2ym)qTF{b7SRAXi^qyKe-6uR<*eGt|^ZLiPC71bEd zbgjOo&q8f^l!KI_zdiAz_yxcQ$RWb2S?kBEzr4zK5HN9(%rSiOeGUxr5?}UOW6nk~ zN3mQY;*Q-bsVpB-{z@Q z@mQ6gcl)lfVWp)2pJaY%Zmq(BnFjwGSr(ltt%?~_hgtV&xbUg^@iRa))V&WYA9a(} z5pV6%Zm6qHc!^|lri=alx{iVj+>>?L#uQ}c67hYb95Ki)<2;;WHv86S=5>x}35l)a zOUs_uh%dHMUPFd&NB3#O_iM;`PL=Ct3@wRq!g0hJBdOHm!bHq`je@ za7d-C=*05B&Po0!?-$29c)ctJmbkFex2wW2+kS!6ni1jcLi$Kt``6AcTL3O&i{HAR zRN=wHT27vO2Ho-Ob+>PQ-@;3JKKYaj7T>jaiw0Z+;h_g6H4gT(=ZEQ1PMs#5p9>;f ze?8^|J@Pe3Hzp7+Q@m?gPFC`y{HVt5=%ZNjNh~Qo=d0Wc*mj5XslmRB(`M~wqdg=i zlJU|^8$!#5EXn399N{dh&vM*NHr-wpSQ;hIl=+kn7brDovG-2+RF7Rj^XxWoFmcd-s7dD(74rWXW_4 z*E_^YmIW0u(-;S4ZI(vV-RTK-jEAzG%I7=`hpos2M%G)il`Wic)^&4J+-jhRXJ`!S z4L_NdaJ;#Mji1TJJ1f(xmPRYV2FPAITnI|dd~J)(R+vW^uz23}Y&&$-w1*LMeeIit zyweNwooHm(ooMW3~2C;a-ol=`yQ3?~XGM*+*vzW07p-at-Jb57dB z;qR2+M}@+La2Xp1$yr5rmWqa3b#G=Tq<`>80UpfQGlZZjrYnfO#4Y$2ignv}`H?bi z*;cn>GLrTK))!wmCVrkxoh-4UR|?ClT^LN4OH{kf&-7BdI}J^cBksTNn7VzPir%^p zib=lyZ1k0n@+@c$VMwkL?#vMEj9uX!QVGT=cC4rD#FFEs1k+=RG* zqAh|%MDe8}ZMo$3eV78{^=&Z{Asuk8A)tjJ=}B>qi!xIKg6ll@9y6oSFz;ivET|5R z1c3F~3fBLjwy+h7&QFi;$`FSEBL5vf4=lJ67r1ZhWMQ?-PbBLXJa<-v_H%RwdL@*3 zvAu0mRT;v?)=RsR@bexw*owqTYSCPLno8hO(3 z?>_)pqXs(2P^n_RSN@&2*?7EUnn!-*xF%*UfLuTYFP6s)2X(9oH#4~qIrg>!58FzH7NMa zkt7IdX^G@hF6)Tb$qAc?>SX&W-_g(M;&T0n>jaq1=L-~3cur2Xi8z)zXyzN*3B z(o?O4?!djnzH1TfA`XA-WqWS0e=NmR1>b7hiHQj+Qup%?^gep~r+@-%1~?O6Tgniz zvls1yGi6lQhsn)>-sSpvF!`E?UQeQVAky1SRbLF(sc4*{UfB?o6KwRDT(Dt@Y6<(5 z@h1=uI(sXj=JoG~)L}BWB*l-2n84>-DAlWe^r52~G1Ks;J+*P?8r=2%O=}l(4|-Vz zAMyVH&h@mV51PB0XBSLnhJd-*M54#}x2^6YM*FVpemluWMzKRBZ!X=^N`J(6PdX=I z%`nHG?@v8`K(YS^pw|0=(Qcrj?rCInk~b(gMqsQqGjemR=ssv=uxO>^2;XfisB`39 zf?t$MQ>K3hPetR)>xvMpWp*ekb%IvZfCfV|Dizzqv)y^uN<#VPhFKzjyLjy2fGxrr zHQ(dbxnE~mCm$TYm3a;>2{7(R&eQIcH`lO*Si6uNfh2^xdU^(@X&~);8_b0AG;Tn|) z_i^85$k)+Z66D{xncfH-54~CZRetJki{ebu_u&Or6QBv+hauk8{=9c@szG3<=kb+( zUed=B%kL67M4C=FBCJmlGtQr`A(9x%xNZTI(D`Q3Li116vHL8;yN>DsVmyM4l?d`_ zJX@4}DWSYrZN5%iZDhhCM7W-#z9GFoRfU$C==MOe+tZw-DsO^`>ARMA62> z0ZL{!u$OabB}X)?Y~feA@bQ|LKhvO;=hu6TV=d^>K@B9WNrDwh6>s!V!C2m96n*~7 zd_JR0EP>eZU)qLmV?;OW%R@E8lxwQN0sYStodEp0?$n9!66?46G<}YAhcY&@>8b;u zDw_Xl>W&nB-OJyFRZji~V2ZZ^1;rsDGI`ieM7zTO1gHG}#@DQN7HPbdXYe@!!D6)O zd*{xiztMHsYHRDHa&c>z*w<7{?<5b!X<8W}P|xjpUJT*+5iFW;b^Tn)|7ZpV${Q5(DkGkPn+58^}!f*MrnkJw!I9 z2WTqu>={aS%Xla79K~HMng|Nji%HcYNOI7o8Q2d=6MEd}>fJx5%bH6TnwWH(0iJwo zAt*Jtu_V)yzhP*Fbc28{h2wX1THDEz%}!5WjAT8+(r4*t?7S=Ie{|OMe`X%`|J27A zeba6XdH#xBQsT2u&-h7EwQfIoa&>&`B135!%ogay?UpChXdmZ`DeG4v+nF0HSacYh wkE@jB1ou%0Q4q-Y?HHaJNb$R89L5|HAR+6h|87B<|NqzhKRaH1{-2ru4eQfjVE_OC literal 0 HcmV?d00001 diff --git a/docs/en.md b/docs/en.md new file mode 100644 index 0000000..71e41cd --- /dev/null +++ b/docs/en.md @@ -0,0 +1,59 @@ +# Tile Rendering — the shared engine behind tile maps + +Tile Rendering draws tile maps. It takes a prepared description of a map — ground, objects, characters, lights — and turns it into a picture, but it does not decide the angle you look from. That choice belongs to a small **renderer** mod: **Top-down Tiles** shows the map straight from above, **Isometric Tiles** shows it as a diamond grid. The same map, events and saves work with either one. + +You do not use this mod directly. It is part of every game with tile maps, such as RPG Plus, together with at least one renderer. + +![The same village map drawn by both renderers: square top-down on the left, isometric on the right.](assets/same-map-two-projections.jpg) + +## Who does what + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **Gameplay stays square.** Movement, collision, events and saves use the logical grid in every projection. A renderer only changes where things are drawn and which cell a click lands on. +- **One drawing path for game and editor.** The RPG map editor draws its canvas with the same renderer as the game. +- **Lights and time of day** are given in cell units, so a lamp lights the same cells in both projections; the tiles and characters share one material that blends the time of day and point lights. + +## Choosing the projection + +The projection is a setting of the game, **Map projection** (`tile.renderer`), in the **World** group of the collection's settings. The choices are **Top-down** (`topdown`) and **Isometric** (`isometric`); RPG Plus uses `topdown`. To change it, open **Mods & Collections → Collections → RPG Plus → Edit scheme**, set the projection, and make sure the matching renderer mod is in the game. + +- If the setting names a renderer that is not in the game, the map does not fall back to another one; the log lists the available renderers. +- If the setting is empty and exactly one renderer is installed, that one is used. +- For a single run, `--tile-renderer=isometric` (or `topdown`) on the command line overrides the setting. + +## For mod authors: a new projection + +A renderer mod depends on `tile_render_base` and contains one class implementing `ITileRendererFactory`: + +- `Id` — the value players choose in **Map projection**, for example `hex`; +- `Projection(tileSize)` — the cell-to-pixel mapping used by the game, the editor and picking; +- `Create()` — a new map view; the shared canvas presentation can be reused with your projection. + +The factory is found automatically when the mod loads and removed when it unloads. To offer the projection in **Map projection**, add an option in your mod's `collection_settings.json`, as Top-down Tiles does: + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +The `name` key is translated in `locale/collection_settings_.properties`. + +## If something goes wrong + +1. **The map is empty and the log says the renderer is unavailable.** The game's **Map projection** names a renderer mod that is not part of the game; add it or change the setting. diff --git a/docs/es.md b/docs/es.md new file mode 100644 index 0000000..10ea74c --- /dev/null +++ b/docs/es.md @@ -0,0 +1,59 @@ +# Tile Rendering — el motor común detrás de los mapas de tiles + +Tile Rendering dibuja los mapas de tiles. Recibe una descripción del mapa ya preparada —suelo, objetos, personajes, luces— y la convierte en una imagen, pero no decide desde qué ángulo se mira. Esa elección corresponde a un pequeño mod de **renderizado**: **Top-down Tiles** muestra el mapa directamente desde arriba y **Isometric Tiles**, como una cuadrícula de rombos. El mismo mapa, los mismos eventos y las mismas partidas guardadas funcionan con cualquiera de los dos. + +Este mod no se usa directamente: forma parte de todo juego con mapas de tiles, como RPG Plus, junto con al menos un renderizador. + +![El mismo mapa de la aldea dibujado por los dos renderizadores: vista superior cuadrada a la izquierda, isométrica a la derecha.](assets/same-map-two-projections.jpg) + +## Quién hace qué + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **La jugabilidad sigue siendo cuadrada.** El movimiento, las colisiones, los eventos y el guardado usan la cuadrícula lógica en todas las proyecciones. Un renderizador solo cambia dónde se dibuja cada cosa y sobre qué casilla cae un clic. +- **Un solo camino de dibujo para el juego y el editor.** El editor de mapas RPG dibuja su lienzo con el mismo renderizador que el juego. +- **Las luces y la hora del día** se dan en unidades de casilla, así que una lámpara ilumina las mismas casillas en ambas proyecciones; los tiles y los personajes comparten un material que mezcla la hora del día con las luces puntuales. + +## Elegir la proyección + +La proyección es un ajuste del juego, **Proyección del mapa** (`tile.renderer`), en el grupo **Mundo** de los ajustes de la colección. Las opciones son **Vista superior** (`topdown`) e **Isométrica** (`isometric`); RPG Plus usa `topdown`. Para cambiarla, abre **Mods → Colecciones → RPG Plus → Editar esquema**, elige la proyección y asegúrate de que el mod de renderizado correspondiente esté en el juego. + +- Si el ajuste nombra un renderizador que no está en el juego, el mapa no recurre a otro; el registro enumera los renderizadores disponibles. +- Si el ajuste está vacío y hay exactamente un renderizador instalado, se usa ese. +- Para una sola partida, `--tile-renderer=isometric` (o `topdown`) en la línea de comandos anula el ajuste. + +## Para autores de mods: una proyección nueva + +Un mod de renderizado depende de `tile_render_base` y contiene una clase que implementa `ITileRendererFactory`: + +- `Id` — el valor que los jugadores eligen en **Proyección del mapa**, por ejemplo `hex`; +- `Projection(tileSize)` — el mapeo de casilla a píxeles que usan el juego, el editor y la selección con el ratón; +- `Create()` — una vista de mapa nueva; la presentación común del lienzo puede reutilizarse con tu proyección. + +La fábrica se detecta automáticamente al cargar el mod y se retira al descargarlo. Para ofrecer la proyección en **Proyección del mapa**, añade una opción al `collection_settings.json` de tu mod, como hace Top-down Tiles: + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +La clave `name` se traduce en `locale/collection_settings_.properties`. + +## Si algo falla + +1. **El mapa está vacío y el registro dice que el renderizador no está disponible.** La **Proyección del mapa** del juego nombra un mod de renderizado que no forma parte del juego; instálalo o cambia el ajuste. diff --git a/docs/ja.md b/docs/ja.md new file mode 100644 index 0000000..c4f9a8a --- /dev/null +++ b/docs/ja.md @@ -0,0 +1,59 @@ +# Tile Rendering — タイルマップの共通エンジン + +Tile Rendering はタイルマップを描画します。用意されたマップの記述——地面、物体、キャラクター、光——を受け取って絵に変えますが、どの角度から見るかは決めません。それを決めるのは小さな**レンダラー** Mod です。**Top-down Tiles** はマップを真上から、**Isometric Tiles** はひし形の格子で示します。同じマップ、同じイベント、同じセーブが、どちらでもそのまま働きます。 + +この Mod を直接使うことはありません。タイルマップのあるゲーム——たとえば RPG Plus——には、レンダラーを最低ひとつと一緒に必ず入っています。 + +![同じ村のマップを 2 つのレンダラーで描いたもの: 左が正方形の見下ろし、右がアイソメトリック。](assets/same-map-two-projections.jpg) + +## 役割分担 + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **ゲームプレイは常に正方形です。** 移動、衝突、イベント、セーブは、どの投影でも論理グリッドを使います。レンダラーが変えるのは、何をどこに描くかと、クリックがどのマスに当たるかだけです。 +- **ゲームとエディターで描画経路はひとつ。** RPG マップエディターは、ゲームと同じレンダラーでキャンバスを描きます。 +- **光と時間の流れ**はマス単位で与えられるため、ランプはどちらの投影でも同じマスを照らします。タイルとキャラクターは、時間の流れと点光源を混ぜる 1 つのマテリアルを共有します。 + +## 投影を選ぶ + +投影はゲームの設定、**マップの投影**(`tile.renderer`)で、コレクション設定の **ワールド** グループにあります。選択肢は **見下ろし**(`topdown`)と **アイソメトリック**(`isometric`)です。RPG Plus は `topdown` を使います。変えるには **MOD とコレクション → コレクション → RPG Plus → 構成を編集** を開き、投影を設定して、対応する描画 Mod がゲームに含まれていることを確認してください。 + +- 設定がゲームに存在しないレンダラーを指している場合、マップは別のレンダラーに切り替わりません。利用できるレンダラーがログに並びます。 +- 設定が空で、レンダラーがちょうど 1 つだけインストールされていれば、それが使われます。 +- 1 回だけの実行なら、コマンドラインの `--tile-renderer=isometric`(または `topdown`)が設定に優先します。 + +## Mod 作者向け: 新しい投影 + +レンダラー Mod は `tile_render_base` に依存し、`ITileRendererFactory` を実装するクラスを 1 つ持ちます。 + +- `Id` — プレイヤーが **マップの投影** で選ぶ値。たとえば `hex`。 +- `Projection(tileSize)` — マスから画面ピクセルへの対応付け。ゲーム・エディター・クリック判定がこれを使います。 +- `Create()` — 新しいマップビュー。共通のキャンバス表示は自分の投影でも再利用できます。 + +ファクトリは Mod の読み込み時に自動で見つかり、Mod を外すと削除されます。投影を **マップの投影** に並べるには、Top-down Tiles のように自分の Mod の `collection_settings.json` に選択肢を追加します。 + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +`name` キーは `locale/collection_settings_.properties` で翻訳されます。 + +## うまくいかないとき + +1. **マップが空で、ログにレンダラーが利用できないと出る。** ゲームの **マップの投影** が、ゲームに含まれない描画 Mod を指しています。追加するか、設定を変えてください。 diff --git a/docs/ko.md b/docs/ko.md new file mode 100644 index 0000000..8215b39 --- /dev/null +++ b/docs/ko.md @@ -0,0 +1,59 @@ +# Tile Rendering — 타일 맵 뒤의 공유 엔진 + +Tile Rendering은 타일 맵을 그립니다. 준비된 맵 묘사 — 지면, 물건, 캐릭터, 빛 — 를 받아 그림으로 바꾸지만, 어느 각도에서 볼지는 정하지 않습니다. 그 선택은 아주 작은 **렌더러** 모드의 몫입니다. **Top-down Tiles**는 맵을 곧바로 위에서 보여 주고, **Isometric Tiles**는 마름모 격자로 보여 줍니다. 같은 맵, 같은 이벤트, 같은 저장이 어느 쪽에서든 그대로 작동합니다. + +이 모드를 직접 쓸 일은 없습니다. 타일 맵이 있는 모든 게임 — 예컨대 RPG Plus — 에는 최소 하나의 렌더러와 함께 이 모드가 들어 있습니다. + +![같은 마을 맵을 두 렌더러로 그린 모습: 왼쪽은 정사각형 탑다운, 오른쪽은 아이소메트릭.](assets/same-map-two-projections.jpg) + +## 누가 무엇을 맡는가 + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **게임플레이는 언제나 정사각형입니다.** 이동, 충돌, 이벤트, 저장은 모든 투영에서 논리 격자를 사용합니다. 렌더러가 바꾸는 것은 무엇을 어디에 그리는지, 클릭이 어느 칸에 떨어지는지뿐입니다. +- **게임과 에디터가 하나의 그리기 경로를 씁니다.** RPG 맵 에디터는 게임과 같은 렌더러로 캔버스를 그립니다. +- **빛과 시간대**는 칸 단위로 주어지므로, 램프는 두 투영에서 같은 칸을 밝힙니다. 타일과 캐릭터는 시간대와 점광을 섞는 하나의 머티리얼을 공유합니다. + +## 투영 고르기 + +투영은 게임 설정의 하나로, 컬렉션 설정의 **월드** 그룹에 있는 **지도 투영**(`tile.renderer`)입니다. 선택지는 **탑다운**(`topdown`)과 **아이소메트릭**(`isometric`)이며, RPG Plus는 `topdown`을 씁니다. 바꾸려면 **모드 및 컬렉션 → 컬렉션 → RPG Plus → 구성 편집**을 열어 투영을 정하고, 해당 렌더러 모드가 게임에 포함되어 있는지 확인하세요. + +- 설정이 게임에 없는 렌더러를 가리키면 맵이 다른 렌더러로 넘어가지 않고, 로그에 사용 가능한 렌더러가 나열됩니다. +- 설정이 비어 있고 렌더러가 정확히 하나만 설치되어 있다면 그것을 씁니다. +- 한 번만 실행하려면 명령줄에서 `--tile-renderer=isometric`(또는 `topdown`)이 설정을 덮어씁니다. + +## 모드 작성자용: 새 투영 + +렌더러 모드는 `tile_render_base`에 의존하며 `ITileRendererFactory`를 구현하는 클래스 하나를 담습니다. + +- `Id` — 플레이어가 **지도 투영**에서 고르는 값. 예: `hex`. +- `Projection(tileSize)` — 칸을 화면 픽셀로 옮기는 대응. 게임·에디터·클릭 판정이 이것을 씁니다. +- `Create()` — 새 맵 뷰. 공용 캔버스 표현은 자기 투영에서도 재사용할 수 있습니다. + +팩토리는 모드가 로드될 때 자동으로 발견되고, 모드를 내리면 제거됩니다. 투영을 **지도 투영**에 넣으려면 Top-down Tiles처럼 자기 모드의 `collection_settings.json`에 옵션을 추가하세요. + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +`name` 키는 `locale/collection_settings_.properties`에서 번역됩니다. + +## 문제가 생겼을 때 + +1. **맵이 비어 있고 로그에 렌더러를 쓸 수 없다고 나온다.** 게임의 **지도 투영**이 게임에 없는 렌더러 모드를 가리킵니다. 그 모드를 넣거나 설정을 바꾸세요. diff --git a/docs/ru.md b/docs/ru.md new file mode 100644 index 0000000..1b7b9c9 --- /dev/null +++ b/docs/ru.md @@ -0,0 +1,59 @@ +# Tile Rendering — общий движок тайловых карт + +Tile Rendering рисует тайловые карты. На вход он получает подготовленное описание карты — землю, объекты, персонажей, источники света — и превращает его в картинку, но сам не решает, под каким углом на неё смотреть. Этот выбор делает небольшой мод-**рендерер**: **Top-down Tiles** показывает карту строго сверху, **Isometric Tiles** — ромбовидной сеткой. Одна и та же карта, те же события и сохранения работают с любым из них. + +Сам по себе этот мод не используется: он входит в каждую игру с тайловыми картами — например, в RPG Plus — вместе хотя бы с одним рендерером. + +![Одна и та же карта деревни, нарисованная обоими рендерерами: слева квадратный вид сверху, справа изометрия.](assets/same-map-two-projections.jpg) + +## Кто за что отвечает + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **Игровая логика остаётся квадратной.** Перемещение, коллизии, события и сохранения во всех проекциях работают с логической сеткой. Рендерер меняет лишь то, где что рисуется, и на какую клетку попадает клик. +- **Один путь отрисовки для игры и редактора.** Редактор RPG-карт рисует холст тем же рендерером, что и игра. +- **Свет и время суток** задаются в клетках, поэтому лампа освещает одни и те же клетки в обеих проекциях; тайлы и персонажи делят один материал, смешивающий время суток и точечные источники света. + +## Выбор проекции + +Проекция — настройка игры, **Проекция карты** (`tile.renderer`), в группе **Мир** настроек коллекции. Варианты — **Вид сверху** (`topdown`) и **Изометрия** (`isometric`); в RPG Plus выбран `topdown`. Чтобы сменить её, откройте **Моды и коллекции → Коллекции → RPG Plus → Изменить схему**, задайте проекцию и проследите, чтобы в игру входил соответствующий мод-рендерер. + +- Если настройка называет рендерер, которого в игре нет, карта не переключится на другой; в журнале будут перечислены доступные рендереры. +- Если настройка пуста, а установлен ровно один рендерер, используется он. +- Для одного запуска ключ командной строки `--tile-renderer=isometric` (или `topdown`) переопределяет настройку. + +## Авторам модов: новая проекция + +Мод-рендерер зависит от `tile_render_base` и содержит один класс, реализующий `ITileRendererFactory`: + +- `Id` — значение, которое игроки выбирают в **Проекции карты**, например `hex`; +- `Projection(tileSize)` — отображение «клетка → пиксели», которым пользуются игра, редактор и выбор щелчком мыши; +- `Create()` — новое представление карты; общее представление холста можно переиспользовать со своей проекцией. + +Фабрика находится автоматически при загрузке мода и убирается при выгрузке. Чтобы проекция появилась в **Проекции карты**, добавьте вариант в `collection_settings.json` своего мода — как это делает Top-down Tiles: + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +Ключ `name` переводится в `locale/collection_settings_.properties`. + +## Если что-то пошло не так + +1. **Карта пуста, а в журнале написано, что рендерер недоступен.** **Проекция карты** игры называет мод-рендерер, которого нет в составе игры; добавьте его или поменяйте настройку. diff --git a/docs/vi.md b/docs/vi.md new file mode 100644 index 0000000..fa8c228 --- /dev/null +++ b/docs/vi.md @@ -0,0 +1,59 @@ +# Tile Rendering — nền tảng chung đằng sau bản đồ ô + +Tile Rendering vẽ các bản đồ ô. Nó nhận một bản mô tả bản đồ đã chuẩn bị — nền, vật thể, nhân vật, nguồn sáng — và biến thành hình ảnh, nhưng không quyết định bạn nhìn từ góc nào. Việc đó thuộc về một mod **kết xuất** nhỏ: **Top-down Tiles** hiển thị bản đồ thẳng từ trên xuống, **Isometric Tiles** hiển thị thành lưới hình thoi. Cùng một bản đồ, cùng sự kiện và save đều chạy với cả hai. + +Bạn không dùng trực tiếp mod này. Nó nằm trong mọi game có bản đồ ô — ví dụ RPG Plus — cùng với ít nhất một trình kết xuất. + +![Cùng một bản đồ làng được hai trình kết xuất vẽ: ô vuông nhìn từ trên ở bên trái, đẳng cự ở bên phải.](assets/same-map-two-projections.jpg) + +## Ai làm gì + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **Lối chơi vẫn vuông vắn.** Di chuyển, va chạm, sự kiện và save đều dùng lưới logic ở mọi phép chiếu. Trình kết xuất chỉ thay đổi nơi vẽ từng thứ và ô nào nhận cú nhấp chuột. +- **Một đường vẽ chung cho game và trình soạn thảo.** Trình sửa bản đồ RPG vẽ khung vẽ bằng đúng trình kết xuất mà game dùng. +- **Ánh sáng và thời gian trong ngày** tính theo đơn vị ô, nên một ngọn đèn soi sáng cùng những ô ấy ở cả hai phép chiếu; ô và nhân vật dùng chung một vật liệu hòa trộn thời gian trong ngày với nguồn sáng điểm. + +## Chọn phép chiếu + +Phép chiếu là một cài đặt của game, **Phép chiếu bản đồ** (`tile.renderer`), nằm trong nhóm **Thế giới** của cài đặt bộ sưu tập. Các lựa chọn là **Nhìn từ trên** (`topdown`) và **Đẳng cự** (`isometric`); RPG Plus dùng `topdown`. Để đổi, mở **Mod & Bộ sưu tập → Bộ sưu tập → RPG Plus → Sửa sơ đồ**, đặt phép chiếu và bảo đảm mod kết xuất tương ứng có trong game. + +- Nếu cài đặt nêu tên một trình kết xuất không có trong game, bản đồ sẽ không chuyển sang trình khác; nhật ký sẽ liệt kê các trình kết xuất khả dụng. +- Nếu cài đặt bỏ trống và chỉ cài đúng một trình kết xuất, trình đó được dùng. +- Cho một lần chạy, `--tile-renderer=isometric` (hoặc `topdown`) trên dòng lệnh đè lên cài đặt. + +## Dành cho tác giả mod: phép chiếu mới + +Mod kết xuất phụ thuộc vào `tile_render_base` và chứa một lớp cài đặt `ITileRendererFactory`: + +- `Id` — giá trị người chơi chọn trong **Phép chiếu bản đồ**, ví dụ `hex`; +- `Projection(tileSize)` — phép ánh xạ ô sang điểm ảnh mà game, trình soạn thảo và chức năng chọn bằng chuột đều dùng; +- `Create()` — một khung xem bản đồ mới; cách trình bày khung vẽ chung có thể tái sử dụng với phép chiếu của bạn. + +Nhà máy được tự động nhận khi mod nạp và bị gỡ khi mod dỡ. Để phép chiếu xuất hiện trong **Phép chiếu bản đồ**, hãy thêm một lựa chọn vào `collection_settings.json` của mod, như Top-down Tiles đã làm: + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +Khóa `name` được dịch trong `locale/collection_settings_.properties`. + +## Khi có trục trặc + +1. **Bản đồ trống trơn và nhật ký báo trình kết xuất không khả dụng.** **Phép chiếu bản đồ** của game đang nêu một mod kết xuất không có trong game; hãy thêm nó vào hoặc đổi cài đặt. diff --git a/docs/zh.md b/docs/zh.md new file mode 100644 index 0000000..d7b1b2a --- /dev/null +++ b/docs/zh.md @@ -0,0 +1,59 @@ +# Tile Rendering — 图块地图背后的共享引擎 + +Tile Rendering 负责绘制图块地图。它接收一份准备好的地图描述——地面、物件、角色、光源——并把它变成画面,但并不决定你从哪个角度看。这个选择属于一个很小的**渲染器**模组:**Top-down Tiles** 从正上方显示地图,**Isometric Tiles** 则把它显示为菱形网格。同一张地图、同一批事件和存档,在两者之下都能正常工作。 + +你不会直接使用这个模组。它连同至少一个渲染器一起,存在于每个带图块地图的游戏中,例如 RPG Plus。 + +![同一张村庄地图由两个渲染器分别绘制:左边是方形俯视,右边是等距。](assets/same-map-two-projections.jpg) + +## 分工 + +```text + content mods maps, tilesets, events, characters (rpg_demo_game, village_pack…) + │ + RPG mod (rpg) walking, collisions, events, the camera target, lighting rules + │ prepares a "render scene": visuals in cell space, lights, the current frame + ▼ + Tile Rendering shared drawing: ground chunks, autotiles, sorting, shading, + (this mod) asset loading, the interaction marker, picking + │ asks the selected renderer for a projection + ▼ + renderer mod Square (topdown) · Isometric (isometric) + how a cell maps to screen pixels +``` + +- **玩法始终是方格的。** 无论哪种投影,移动、碰撞、事件和存档都使用逻辑网格。渲染器只改变东西画在哪里、点击落在哪个格子上。 +- **游戏和编辑器共用一条绘制路径。** RPG 地图编辑器用与游戏相同的渲染器绘制画布。 +- **光照与昼夜**以格子为单位给出,所以一盏灯在两种投影里照亮的格子相同;图块与角色共用一个材质,其中混合了昼夜变化和点光源。 + +## 选择投影 + +投影是游戏的一项设置,即合集设置中**世界**组里的**地图投影**(`tile.renderer`)。可选值为**俯视**(`topdown`)和**等距**(`isometric`);RPG Plus 使用 `topdown`。要修改它,请打开**模组与合集 → 合集 → RPG Plus → 编辑结构**,设置投影,并确认对应的渲染器模组已包含在游戏中。 + +- 如果设置指向的渲染器不在游戏里,地图不会退回到别的渲染器;日志会列出可用的渲染器。 +- 如果设置为空且恰好只安装了一个渲染器,就用它。 +- 只想用一次时,可以在命令行加 `--tile-renderer=isometric`(或 `topdown`)覆盖设置。 + +## 给模组作者:新的投影 + +渲染器模组依赖 `tile_render_base`,并包含一个实现 `ITileRendererFactory` 的类: + +- `Id`——玩家在**地图投影**里选择的值,例如 `hex`; +- `Projection(tileSize)`——“格子到像素”的映射,游戏、编辑器和点击拾取都使用它; +- `Create()`——一个新的地图视图;共享的画布表现可以在你的投影下复用。 + +模组加载时,工厂会被自动发现;卸载时被移除。要让投影出现在**地图投影**里,请像 Top-down Tiles 那样,在自己的 `collection_settings.json` 中添加一个选项: + +```json +{ + "options": [ + { "key": "tile.renderer", "value": "topdown", "name": "collection_settings/topdown" } + ] +} +``` + +`name` 键在 `locale/collection_settings_.properties` 中翻译。 + +## 如果遇到问题 + +1. **地图是空的,日志说渲染器不可用。** 游戏的**地图投影**指定了一个不在游戏中的渲染器模组;把它加进来,或者改一下设置。 diff --git a/locale/collection_settings_en.properties b/locale/collection_settings_en.properties new file mode 100644 index 0000000..5b86077 --- /dev/null +++ b/locale/collection_settings_en.properties @@ -0,0 +1,3 @@ +collection_settings/projection = Map projection +collection_settings/projection_hint = Choose how tiles are rendered. The corresponding renderer mod must be included in this collection. +collection_settings/world_group = World diff --git a/locale/collection_settings_es.properties b/locale/collection_settings_es.properties new file mode 100644 index 0000000..607c6e1 --- /dev/null +++ b/locale/collection_settings_es.properties @@ -0,0 +1,3 @@ +collection_settings/projection = Proyección del mapa +collection_settings/projection_hint = Elige cómo se muestran las casillas. El mod del renderizador debe estar incluido en la colección. +collection_settings/world_group = Mundo diff --git a/locale/collection_settings_ja.properties b/locale/collection_settings_ja.properties new file mode 100644 index 0000000..859acd8 --- /dev/null +++ b/locale/collection_settings_ja.properties @@ -0,0 +1,3 @@ +collection_settings/projection = マップの投影 +collection_settings/projection_hint = タイルの描画方式を選びます。対応する描画MODを構成に含めてください。 +collection_settings/world_group = ワールド diff --git a/locale/collection_settings_ko.properties b/locale/collection_settings_ko.properties new file mode 100644 index 0000000..ccce0f6 --- /dev/null +++ b/locale/collection_settings_ko.properties @@ -0,0 +1,3 @@ +collection_settings/projection = 지도 투영 +collection_settings/projection_hint = 타일 표시 방식을 선택합니다. 해당 렌더러 모드가 컬렉션에 있어야 합니다. +collection_settings/world_group = 월드 diff --git a/locale/collection_settings_ru.properties b/locale/collection_settings_ru.properties new file mode 100644 index 0000000..f555472 --- /dev/null +++ b/locale/collection_settings_ru.properties @@ -0,0 +1,3 @@ +collection_settings/projection = Проекция карты +collection_settings/projection_hint = Выберите способ отображения тайлов. Соответствующий мод рендера должен быть включён в коллекцию. +collection_settings/world_group = Мир diff --git a/locale/collection_settings_vi.properties b/locale/collection_settings_vi.properties new file mode 100644 index 0000000..123ffa1 --- /dev/null +++ b/locale/collection_settings_vi.properties @@ -0,0 +1,3 @@ +collection_settings/projection = Phép chiếu bản đồ +collection_settings/projection_hint = Chọn cách hiển thị ô bản đồ. Mod kết xuất tương ứng phải có trong bộ sưu tập. +collection_settings/world_group = Thế giới diff --git a/locale/collection_settings_zh.properties b/locale/collection_settings_zh.properties new file mode 100644 index 0000000..0cf3806 --- /dev/null +++ b/locale/collection_settings_zh.properties @@ -0,0 +1,3 @@ +collection_settings/projection = 地图投影 +collection_settings/projection_hint = 选择瓦片的渲染方式。对应渲染模组必须包含在合集中。 +collection_settings/world_group = 世界 diff --git a/locale/en.properties b/locale/en.properties new file mode 100644 index 0000000..90c63e7 --- /dev/null +++ b/locale/en.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = Tile Rendering +mod_tile_render_base_desc = The shared engine behind tile maps: turns a prepared map description into a picture; the viewing angle is a small renderer mod on top. diff --git a/locale/es.properties b/locale/es.properties new file mode 100644 index 0000000..83bd2bb --- /dev/null +++ b/locale/es.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = Renderizado de casillas +mod_tile_render_base_desc=El motor común detrás de los mapas de tiles: convierte la descripción preparada de un mapa en una imagen; el ángulo de visión lo elige un pequeño mod de renderizado por encima. diff --git a/locale/ja.properties b/locale/ja.properties new file mode 100644 index 0000000..b1d6441 --- /dev/null +++ b/locale/ja.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = タイル描画 +mod_tile_render_base_desc=タイルマップの背後にある共通エンジン。用意されたマップの記述を絵に変えます。見る角度は、その上の小さなレンダラー Mod が決めます。 diff --git a/locale/ko.properties b/locale/ko.properties new file mode 100644 index 0000000..f11abe3 --- /dev/null +++ b/locale/ko.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = 타일 렌더링 +mod_tile_render_base_desc=타일 맵 뒤의 공유 엔진: 준비된 맵 묘사를 그림으로 바꿉니다. 보는 각도는 그 위의 작은 렌더러 모드가 정합니다. diff --git a/locale/ru.properties b/locale/ru.properties new file mode 100644 index 0000000..6426938 --- /dev/null +++ b/locale/ru.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = Отрисовка тайлов +mod_tile_render_base_desc=Общий движок тайловых карт: превращает подготовленное описание карты в картинку, а угол обзора выбирает небольшой мод-рендерер поверх. diff --git a/locale/vi.properties b/locale/vi.properties new file mode 100644 index 0000000..5656a16 --- /dev/null +++ b/locale/vi.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = Hiển thị ô +mod_tile_render_base_desc=Nền tảng chung đằng sau bản đồ ô: biến bản mô tả bản đồ đã chuẩn bị thành hình ảnh; góc nhìn do một mod kết xuất nhỏ nằm phía trên quyết định. diff --git a/locale/zh.properties b/locale/zh.properties new file mode 100644 index 0000000..b166cda --- /dev/null +++ b/locale/zh.properties @@ -0,0 +1,2 @@ +mod_tile_render_base_name = 图块渲染 +mod_tile_render_base_desc=图块地图背后的共享引擎:把准备好的地图描述变成画面;观看角度由其上的一个小型渲染器模组决定。 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..49b5720 --- /dev/null +++ b/manifest.json @@ -0,0 +1,17 @@ +{ + "id": "tile_render_base", + "name": "Tile Rendering", + "version": "1.0.0", + "author": "ct", + "description": "The shared engine behind tile maps: turns a prepared map description into a picture; the viewing angle is a small renderer mod on top.", + "category": "visual, engine", + "sources": [ + "src/**/*.cs" + ], + "test_sources": [ + "tests/*.cs" + ], + "depends": [ + "ui_base>=1" + ] +} diff --git a/mod.jpg b/mod.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3f86fc69ab0a6dfadf4eac64dccc14075527778 GIT binary patch literal 136331 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

qs^OgMf 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%0D&S_G#3; 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 ih@)z|_-4F= light_count) + break; + float k = clamp(1.0 - distance(cell, light_positions[i]) / max(light_radii[i], 0.001), 0.0, 1.0); + light += light_colors[i].rgb * light_colors[i].a * k * k; + } + + COLOR = vec4(color.rgb * min(ambient + light, vec3(1.0)), color.a); +} diff --git a/src/ITileProjection.cs b/src/ITileProjection.cs new file mode 100644 index 0000000..9256e4f --- /dev/null +++ b/src/ITileProjection.cs @@ -0,0 +1,19 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + + ///

Maps cell-space geometry to pixels; it has no knowledge of RPG rules or artwork. + public interface ITileProjection + { + /// Projection-owned image placement policy; the backend never switches coordinate systems. + TileVisualPlacement Place(TileVisual visual); + /// Source-pixel scale, independent of camera zoom. + float Unit { get; } + /// Projects ground coordinates and optional elevation in cells. + Vector2 Project(Vector3 point); + /// Inverts ground projection before flooring to a cell. + Vector2 Unproject(Vector2 point); + /// Maps world facing (down/left/right/up) to a four-row charset. + int CharsetRow(int facing); + } +} diff --git a/src/ITileRendererFactory.cs b/src/ITileRendererFactory.cs new file mode 100644 index 0000000..92f4134 --- /dev/null +++ b/src/ITileRendererFactory.cs @@ -0,0 +1,13 @@ +namespace Cthangover.Mods.TileRender +{ + /// Discovered through ModTypeConsumer; constructors must not allocate Godot objects. + public interface ITileRendererFactory + { + /// Stable collection setting, such as topdown or isometric. + string Id { get; } + /// Creates a pure projection for tools, picking and previews. + ITileProjection Projection(int tileSize); + /// Creates one independently owned presentation, on the main thread. + ITileWorldPresentation Create(); + } +} diff --git a/src/ITileWorldPresentation.cs b/src/ITileWorldPresentation.cs new file mode 100644 index 0000000..de273a2 --- /dev/null +++ b/src/ITileWorldPresentation.cs @@ -0,0 +1,34 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using Godot; + + /// A replaceable view. No operation may advance gameplay or write a save. + public interface ITileWorldPresentation : IDisposable + { + /// Host attaches this root; the presentation owns all its descendants. + Node2D Root { get; } + /// Material shared by static and dynamic artwork, exposed for diagnostics. + ShaderMaterial SharedMaterial { get; } + /// Number of computed surface textures actually submitted to static draw chunks. + int SurfaceChunkCount { get; } + /// Projected static extent before camera scaling, for scrollable editor canvases. + Rect2 ContentBounds { get; } + /// Verifies the visible actors inherit the same material as the terrain. + bool ActorsShareMaterial { get; } + /// Builds static geometry from resolved visual data. + void Mount(TileRenderScene scene); + /// Applies a newer snapshot while reusing unaffected GPU textures and cached commands. + void Apply(TileSceneChanges changes); + /// Copies poses, camera focus and lighting without ticking simulation. + void Present(TileFrame frame, double delta); + /// Sets the visible host rectangle. + void Resize(Vector2 size); + /// Coordinates are relative to the host, including camera displacement. + bool TryPickGround(Vector2 localPoint, out Vector2I cell); + /// Projects a cell point into host coordinates. + Vector2 ProjectToView(Vector3 point); + /// Releases map resources; safe to call more than once. + void Unmount(); + } +} diff --git a/src/TileActorPose.cs b/src/TileActorPose.cs new file mode 100644 index 0000000..df07ecd --- /dev/null +++ b/src/TileActorPose.cs @@ -0,0 +1,17 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + + /// One already evaluated actor pose; no event conditions or route definitions cross this boundary. + public class TileActorPose + { + public string Id { get; set; } + public Vector2 Position { get; set; } + public bool Visible { get; set; } + public TileVisual Look { get; set; } + public bool Charset { get; set; } + public int Facing { get; set; } + public int Column { get; set; } = 1; + public Color Tint { get; set; } = Colors.White; + } +} diff --git a/src/TileAssetCache.cs b/src/TileAssetCache.cs new file mode 100644 index 0000000..54a6fbf --- /dev/null +++ b/src/TileAssetCache.cs @@ -0,0 +1,31 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using System.Collections.Generic; + using Cthangover.Core.Utils; + using Godot; + /// File-group lookup preserves mod overrides and ZIP providers. Instances own decoded textures and regions. + public class TileAssetCache : IDisposable + { + private readonly Dictionary textures = new(); + public Texture2D Resolve(string group, string path) + { + if (string.IsNullOrWhiteSpace(path)) return null; + var key = group + "/" + path; + if (!textures.TryGetValue(key, out var texture)) + textures[key] = texture = TextureUtils.LoadFromModGroup(group, path); + return texture; + } + public Texture2D Region(string key, Texture2D atlas, Rect2 region) + { + key = "region/" + key; + if (!textures.TryGetValue(key, out var texture)) textures[key] = texture = new AtlasTexture { Atlas = atlas, Region = region }; + return texture; + } + public void Dispose() + { + foreach (var texture in new HashSet(textures.Values)) texture?.Dispose(); + textures.Clear(); + } + } +} diff --git a/src/TileAutotile.cs b/src/TileAutotile.cs new file mode 100644 index 0000000..6afab3c --- /dev/null +++ b/src/TileAutotile.cs @@ -0,0 +1,39 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using Godot; + /// Projection-independent A2 quarter selection and phase addressing. + public static class TileAutotile + { + public static Vector2I[] Quarters(bool up, bool down, bool left, bool right, + bool upLeft, bool upRight, bool downLeft, bool downRight) + { + return new[] + { + Quarter(up, left, upLeft, new Vector2I(2, 0), left ? 2 : 0, up ? 4 : 2), + Quarter(up, right, upRight, new Vector2I(3, 0), right ? 1 : 3, up ? 4 : 2), + Quarter(down, left, downLeft, new Vector2I(2, 1), left ? 2 : 0, down ? 3 : 5), + Quarter(down, right, downRight, new Vector2I(3, 1), right ? 1 : 3, down ? 3 : 5), + }; + } + + public static Rect2 VariantRect(Vector2I imageSize, int tileSize, Vector2I cell) + { + var width = Math.Max(1, tileSize) * 2; + var height = Math.Max(1, tileSize) * 3; + var columns = Math.Max(1, imageSize.X / width); + var rows = Math.Max(1, imageSize.Y / height); + var x = (cell.X % columns + columns) % columns; + var y = (cell.Y % rows + rows) % rows; + return new Rect2(x * width, y * height, width, height); + } + + private static Vector2I Quarter(bool sideA, bool sideB, bool corner, Vector2I inner, int column, int row) + { + if (sideA && sideB && !corner) + return inner; + return new Vector2I(column, row); + } + + } +} diff --git a/src/TileCanvasEffects.cs b/src/TileCanvasEffects.cs new file mode 100644 index 0000000..88d7f04 --- /dev/null +++ b/src/TileCanvasEffects.cs @@ -0,0 +1,45 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Cosmetic world-space accents and the exact interaction cell supplied by the simulation. + public partial class TileCanvasEffects : Node2D + { + private TileRenderScene scene; + private ITileProjection projection; + private Vector2? target; + private double elapsed; + public TileCanvasEffects(TileRenderScene scene, ITileProjection projection) + { this.scene = scene; this.projection = projection; } + public void Present(Vector2? cell, double delta) + { target = cell; elapsed += delta; QueueRedraw(); } + public void Release() { scene = null; projection = null; } + public void SetScene(TileRenderScene snapshot) { scene = snapshot; QueueRedraw(); } + public override void _Draw() + { + var time = (float)elapsed; + if (target.HasValue) + { + var points = TileDrawing.CellPolygon(projection, new Rect2(target.Value + Vector2.One * 0.06f, Vector2.One * 0.88f)); + var color = new Color(1f, 0.83f, 0.48f, 0.65f + 0.2f * Mathf.Sin(time * 3)); + for (var i = 0; i < 4; i++) + { + DrawLine(points[i], points[i].Lerp(points[(i + 1) % 4], 0.2f), color); + DrawLine(points[i], points[i].Lerp(points[(i + 3) % 4], 0.2f), color); + } + } + if (scene.Atmosphere != "woodland") return; + for (var i = 0; i < 36; i++) + { + var point = new Vector2(Mathf.PosMod(i * 4.29f + time * (2 + i % 3) / 32, scene.Size.X), + Mathf.PosMod(i * 2.61f + time * 0.044f + Mathf.Sin(time * 0.4f + i) * 0.22f, scene.Size.Y)); + var pixel = TileDrawing.Project(projection, point); + DrawLine(pixel, pixel + new Vector2(2, 1), new Color(0.77f, 0.78f, 0.4f, 0.32f)); + } + for (var i = 0; i < scene.Water.Count; i += 2) + { + var point = TileDrawing.Project(projection, scene.Water[i] + new Vector2(0.3f, 0.3f)); + DrawLine(point, point + new Vector2(6, 0), new Color(0.63f, 0.87f, 0.84f, 0.1f + 0.1f * Mathf.Sin(time + i))); + } + } + } +} diff --git a/src/TileCanvasLayer.cs b/src/TileCanvasLayer.cs new file mode 100644 index 0000000..858c9e1 --- /dev/null +++ b/src/TileCanvasLayer.cs @@ -0,0 +1,35 @@ +namespace Cthangover.Mods.TileRender +{ + using System.Collections.Generic; + using Godot; + /// Cached draw commands for one static map chunk. Rebuilt only when the scene changes. + public partial class TileCanvasLayer : Node2D + { + private ITileProjection projection; + private readonly List visuals = new(); + public TileCanvasLayer(ITileProjection projection) { this.projection = projection; } + public void Add(TileVisual visual) => visuals.Add(visual); + public bool Matches(IReadOnlyList other) + { + if (visuals.Count != other.Count) return false; + for (var i = 0; i < visuals.Count; i++) + { + var a = visuals[i]; var b = other[i]; + if (!ReferenceEquals(a.Texture, b.Texture) || a.Source != b.Source || a.Bounds != b.Bounds || a.Tint != b.Tint) return false; + if ((a.WorldQuad == null) != (b.WorldQuad == null)) return false; + if (a.WorldQuad != null) + { + if (a.WorldQuad.Length != b.WorldQuad.Length) return false; + for (var p = 0; p < a.WorldQuad.Length; p++) if (a.WorldQuad[p] != b.WorldQuad[p]) return false; + } + } + return true; + } + public void Replace(IEnumerable other) { visuals.Clear(); visuals.AddRange(other); QueueRedraw(); } + public void Release() { projection = null; visuals.Clear(); } + public override void _Draw() + { + foreach (var visual in visuals) TileDrawing.Draw(this, visual, projection, visual.Tint); + } + } +} diff --git a/src/TileCanvasPresentation.cs b/src/TileCanvasPresentation.cs new file mode 100644 index 0000000..47770da --- /dev/null +++ b/src/TileCanvasPresentation.cs @@ -0,0 +1,243 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using System.Collections.Generic; + using Cthangover.Core.Mods.Resolvers; + using Godot; + + /// + /// Shared canvas backend: projections live in separate implementation mods. + /// Static ground is chunked, whole props and actors share ground-anchor sorting. + /// Camera and light transforms are derived from the same projection used for picking. + /// + public partial class TileCanvasPresentation : Node2D, ITileWorldPresentation + { + private ITileRendererFactory factory; + private ITileProjection projection; + private TileRenderScene scene; + private Node2D actors; + private Node2D[] layers; + private readonly Dictionary<(int Layer, int X, int Y), TileCanvasLayer> chunks = new(); + private readonly List props = new(); + private readonly HashSet seenActors = new(); + private readonly List removedActors = new(); + public int LastChangedDrawChunks { get; private set; } + private readonly Dictionary sprites = new(); + private readonly Vector2[] lightPositions = new Vector2[16]; + private readonly Color[] lightColors = new Color[16]; + private readonly float[] lightRadii = new float[16]; + private Vector2 viewport; + private Rect2 bounds; + private TileCanvasEffects effects; + public Node2D Root => this; + public ShaderMaterial SharedMaterial { get; private set; } + public int SurfaceChunkCount { get; private set; } + public Rect2 ContentBounds => bounds; + /// Weak diagnostic only; does not retain implementation code during unload verification. + public WeakReference ProjectionLifetime() => new(projection); + public bool ActorsShareMaterial + { + get + { + if (actors == null || actors.Material != SharedMaterial || sprites.Count == 0) return false; + foreach (var sprite in sprites.Values) if (!sprite.UseParentMaterial) return false; + return true; + } + } + public TileCanvasPresentation(ITileRendererFactory factory) { this.factory = factory; } + + public void Mount(TileRenderScene snapshot) + { + Unmount(); + scene = snapshot; + projection = factory.Projection(scene.TileSize); + Name = "TilePresentation"; + TextureFilter = TextureFilterEnum.Nearest; + Scale = Vector2.One * scene.Zoom; + var corners = TileDrawing.CellPolygon(projection, new Rect2(Vector2.Zero, scene.Size)); + bounds = new Rect2(corners[0], Vector2.Zero); + foreach (var point in corners) bounds = bounds.Expand(point); + SharedMaterial = new ShaderMaterial { Shader = Shaders.Resolve("tile_lit") }; + layers = new Node2D[3]; + layers[0] = new Node2D { Name = "Back", Material = SharedMaterial }; + layers[1] = new Node2D { Name = "Main", Material = SharedMaterial }; + layers[2] = new Node2D { Name = "Front", Material = SharedMaterial }; + AddChild(layers[0]); + AddChild(layers[1]); + actors = new Node2D { Name = "Actors", YSortEnabled = true, Material = SharedMaterial }; + AddChild(actors); + AddChild(layers[2]); + RebuildStatic(); + effects = new TileCanvasEffects(scene, projection); + AddChild(effects); + } + + public void Apply(TileSceneChanges changes) + { + if (scene == null || changes.BaseRevision != scene.Revision || changes.Scene.Revision <= scene.Revision) + throw new InvalidOperationException("Stale tile presentation delta."); + var next = changes.Scene; + if (next.Size != scene.Size || next.TileSize != scene.TileSize || next.Zoom != scene.Zoom) + { Mount(next); return; } + scene = next; + RebuildStatic(); + effects.SetScene(scene); + } + + private void RebuildStatic() + { + var corners = TileDrawing.CellPolygon(projection, new Rect2(Vector2.Zero, scene.Size)); + bounds = new Rect2(corners[0], Vector2.Zero); + foreach (var point in corners) bounds = bounds.Expand(point); + foreach (var prop in props) { prop.Release(); prop.GetParent()?.RemoveChild(prop); prop.Free(); } + props.Clear(); + SurfaceChunkCount = 0; + LastChangedDrawChunks = 0; + var nextChunks = new Dictionary<(int Layer, int X, int Y), List>(); + foreach (var visual in scene.Visuals) + { + if (!string.IsNullOrEmpty(visual.Only) && visual.Only != factory.Id) continue; + var placement = projection.Place(visual); + bounds = bounds.Merge(placement.Bounds); + if (placement.DepthSorted) + { + var sprite = new TileCanvasSprite(projection) { UseParentMaterial = true }; + (visual.Layer == 2 ? layers[2] : actors).AddChild(sprite); + sprite.SetStatic(visual); + props.Add(sprite); + } + else + { + var key = (visual.Layer, (int)visual.Bounds.Position.X / 32, (int)visual.Bounds.Position.Y / 32); + if (!nextChunks.TryGetValue(key, out var list)) nextChunks[key] = list = new List(); + list.Add(visual); + if (visual.Id?.StartsWith("surface/") == true && visual.Texture != null) SurfaceChunkCount++; + } + } + var obsolete = new List<(int Layer, int X, int Y)>(); + foreach (var pair in chunks) if (!nextChunks.ContainsKey(pair.Key)) obsolete.Add(pair.Key); + foreach (var key in obsolete) + { + var chunk = chunks[key]; + chunk.Release(); chunk.GetParent()?.RemoveChild(chunk); chunk.Free(); chunks.Remove(key); + LastChangedDrawChunks++; + } + foreach (var pair in nextChunks) + { + if (!chunks.TryGetValue(pair.Key, out var chunk)) + { + chunk = new TileCanvasLayer(projection) { UseParentMaterial = true }; + layers[pair.Key.Layer].AddChild(chunk); + chunks[pair.Key] = chunk; + } + else if (chunk.Matches(pair.Value)) continue; + chunk.Replace(pair.Value); + LastChangedDrawChunks++; + } + } + + public void Resize(Vector2 size) => viewport = size; + + public void Present(TileFrame frame, double delta) + { + if (scene == null) return; + seenActors.Clear(); + foreach (var pose in frame.Actors) + { + if (!sprites.TryGetValue(pose.Id, out var sprite)) + { + sprite = new TileCanvasSprite(projection) { UseParentMaterial = true }; + actors.AddChild(sprite); + sprites[pose.Id] = sprite; + } + seenActors.Add(pose.Id); + sprite.SetPose(pose); + } + removedActors.Clear(); + foreach (var pair in sprites) if (!seenActors.Contains(pair.Key)) removedActors.Add(pair.Key); + foreach (var id in removedActors) + { + var sprite = sprites[id]; + sprite.Release(); sprite.GetParent()?.RemoveChild(sprite); sprite.Free(); sprites.Remove(id); + } + var focus = TileDrawing.Project(projection, frame.Focus) * Scale.X; + var target = new Vector2(Axis(viewport.X, bounds.Position.X * Scale.X, bounds.End.X * Scale.X, focus.X), + Axis(viewport.Y, bounds.Position.Y * Scale.Y, bounds.End.Y * Scale.Y, focus.Y)); + Position = delta <= 0 ? target : Position.Lerp(target, 1f - Mathf.Exp(-(float)delta * 14f)).Round(); + UpdateLight(frame); + effects.Present(frame.InteractionCell, delta); + } + + private void UpdateLight(TileFrame frame) + { + SharedMaterial.SetShaderParameter("time_weights", frame.TimeWeights); + SharedMaterial.SetShaderParameter("use_ambient", frame.Ambient.HasValue); + SharedMaterial.SetShaderParameter("ambient_color", frame.Ambient ?? Colors.White); + var world = GlobalTransform * new Transform2D(TileDrawing.Project(projection, Vector2.Right), + TileDrawing.Project(projection, Vector2.Down), Vector2.Zero); + var inverse = world.AffineInverse(); + SharedMaterial.SetShaderParameter("cell_x", new Vector2(inverse.X.X, inverse.Y.X)); + SharedMaterial.SetShaderParameter("cell_y", new Vector2(inverse.X.Y, inverse.Y.Y)); + SharedMaterial.SetShaderParameter("cell_offset", inverse.Origin); + var count = Math.Min(16, frame.Lights.Count); + for (var i = 0; i < count; i++) + { + lightPositions[i] = frame.Lights[i].Position; + lightColors[i] = frame.Lights[i].Color; + lightRadii[i] = frame.Lights[i].Radius; + } + SharedMaterial.SetShaderParameter("light_count", count); + SharedMaterial.SetShaderParameter("light_positions", lightPositions); + SharedMaterial.SetShaderParameter("light_colors", lightColors); + SharedMaterial.SetShaderParameter("light_radii", lightRadii); + } + + public bool TryPickGround(Vector2 localPoint, out Vector2I cell) + { + cell = default; + if (scene == null) return false; + var point = projection.Unproject(Transform.AffineInverse() * localPoint); + cell = new Vector2I(Mathf.FloorToInt(point.X), Mathf.FloorToInt(point.Y)); + return cell.X >= 0 && cell.Y >= 0 && cell.X < scene.Size.X && cell.Y < scene.Size.Y; + } + + public Vector2 ProjectToView(Vector3 point) => Transform * projection.Project(point); + + public void Unmount() + { + foreach (var child in GetChildren()) { ReleaseReferences(child); RemoveChild(child); child.Free(); } + sprites.Clear(); + props.Clear(); + chunks.Clear(); + layers = null; + SurfaceChunkCount = 0; + actors = null; + effects = null; + scene = null; + projection = null; + SharedMaterial?.Dispose(); + SharedMaterial = null; + } + + private static void ReleaseReferences(Node node) + { + foreach (var child in node.GetChildren()) ReleaseReferences(child); + if (node is TileCanvasLayer layer) layer.Release(); + if (node is TileCanvasSprite sprite) sprite.Release(); + if (node is TileCanvasEffects accents) accents.Release(); + } + + void IDisposable.Dispose() + { + if (!GodotObject.IsInstanceValid(this)) return; + Unmount(); + factory = null; + GetParent()?.RemoveChild(this); + Free(); + } + + private static float Axis(float screen, float start, float end, float focus) + => Mathf.Round(end - start <= screen ? (screen - start - end) / 2f + : Mathf.Clamp(screen / 2f - focus, screen - end, -start)); + } +} diff --git a/src/TileCanvasSprite.cs b/src/TileCanvasSprite.cs new file mode 100644 index 0000000..3aa0db9 --- /dev/null +++ b/src/TileCanvasSprite.cs @@ -0,0 +1,77 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Upright image sorted at its ground anchor. A pose update never advances movement or animation. + public partial class TileCanvasSprite : Node2D + { + private ITileProjection projection; + private TileVisual visual; + private Rect2 source; + private bool shadow; + private TileVisualPlacement staticPlacement; + public TileCanvasSprite(ITileProjection projection) { this.projection = projection; } + public void Release() { projection = null; visual = null; shown = null; staticPlacement = null; } + + public void SetStatic(TileVisual image) + { + visual = image; + Modulate = image.Tint; + source = image.Source; + staticPlacement = projection.Place(image); + Position = staticPlacement.Anchor; + QueueRedraw(); + } + + public void SetPose(TileActorPose pose) + { + Visible = pose.Visible; + Modulate = pose.Tint; + visual = pose.Look; + if (visual == null) + { + if (shown != null) { shown = null; QueueRedraw(); } + return; + } + Position = TileDrawing.Project(projection, pose.Position + visual.Anchor); + var next = visual.Source; + shadow = pose.Charset; + if (pose.Charset && visual.Texture != null) + { + var frame = visual.Texture.GetSize() / new Vector2(3, 4); + next = new Rect2(new Vector2(pose.Column, projection.CharsetRow(pose.Facing)) * frame, frame); + } + if (source != next || visual != shown || shadow != shownShadow) + { + source = next; + shown = visual; + shownShadow = shadow; + QueueRedraw(); + } + } + private TileVisual shown; + private bool shownShadow; + + public override void _Draw() + { + if (visual?.Texture == null) return; + if (staticPlacement != null) + { + var transform = staticPlacement.Transform; + transform.Origin -= Position; + DrawSetTransformMatrix(transform); + DrawTextureRectRegion(visual.Texture, new Rect2(0, 0, 1, 1), source, Colors.White); + DrawSetTransformMatrix(Transform2D.Identity); + return; + } + var unit = projection.Unit; + if (shadow) + { + DrawSetTransform(new Vector2(0, -3), 0, new Vector2(1, 0.32f)); + DrawCircle(Vector2.Zero, unit * 0.28f, new Color(0.04f, 0.09f, 0.1f, 0.28f)); + DrawSetTransform(Vector2.Zero); + } + DrawTextureRectRegion(visual.Texture, new Rect2((visual.Bounds.Position - visual.Anchor) * unit, + visual.Bounds.Size * unit), source, Colors.White); + } + } +} diff --git a/src/TileDrawing.cs b/src/TileDrawing.cs new file mode 100644 index 0000000..6289b50 --- /dev/null +++ b/src/TileDrawing.cs @@ -0,0 +1,25 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Shared UV drawing for runtime and tools. Ground transforms independently of image storage. + public static class TileDrawing + { + public static Vector2 Project(ITileProjection p, Vector2 point) => p.Project(new Vector3(point.X, point.Y, 0)); + + public static Vector2[] CellPolygon(ITileProjection p, Rect2 rect) + { + return new[] { Project(p, rect.Position), Project(p, rect.Position + new Vector2(rect.Size.X, 0)), + Project(p, rect.End), Project(p, rect.Position + new Vector2(0, rect.Size.Y)) }; + } + + public static void Draw(CanvasItem target, TileVisual visual, ITileProjection projection, Color tint) + { + if (visual.Texture == null) + return; + var placement = projection.Place(visual); + target.DrawSetTransformMatrix(placement.Transform); + target.DrawTextureRectRegion(visual.Texture, new Rect2(0, 0, 1, 1), visual.Source, tint); + target.DrawSetTransformMatrix(Transform2D.Identity); + } + } +} diff --git a/src/TileFrame.cs b/src/TileFrame.cs new file mode 100644 index 0000000..1ec13ac --- /dev/null +++ b/src/TileFrame.cs @@ -0,0 +1,15 @@ +namespace Cthangover.Mods.TileRender +{ + using System.Collections.Generic; + using Godot; + /// Reusable frame storage; populated by the game, read synchronously by the presentation. + public class TileFrame + { + public List Actors { get; } = new(); + public List Lights { get; } = new(); + public Vector2 Focus { get; set; } + public Vector2? InteractionCell { get; set; } + public Vector4 TimeWeights { get; set; } = new(0, 1, 0, 0); + public Color? Ambient { get; set; } + } +} diff --git a/src/TileLight.cs b/src/TileLight.cs new file mode 100644 index 0000000..62ee43d --- /dev/null +++ b/src/TileLight.cs @@ -0,0 +1,11 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Position and radius are logical cell units in both projections. + public class TileLight + { + public Vector2 Position { get; set; } + public float Radius { get; set; } + public Color Color { get; set; } + } +} diff --git a/src/TileRenderScene.cs b/src/TileRenderScene.cs new file mode 100644 index 0000000..1249e5f --- /dev/null +++ b/src/TileRenderScene.cs @@ -0,0 +1,28 @@ +namespace Cthangover.Mods.TileRender +{ + using System.Collections.Generic; + using Godot; + + /// Static presentation snapshot, prepared by a game adapter. Owns only explicitly listed transient textures. + public class TileRenderScene + { + public Vector2I Size { get; set; } + public long Revision { get; set; } + public int TileSize { get; set; } = 32; + public float Zoom { get; set; } = 2; + public string Atmosphere { get; set; } + public List Water { get; } = new(); + public List Visuals { get; } = new(); + public List OwnedTextures { get; } = new(); + public List Warnings { get; } = new(); + + /// Shared file-group textures are borrowed, never freed by the snapshot. + public void Release() + { + foreach (var texture in OwnedTextures) + texture.Dispose(); + OwnedTextures.Clear(); + Visuals.Clear(); + } + } +} diff --git a/src/TileRendererConsumer.cs b/src/TileRendererConsumer.cs new file mode 100644 index 0000000..2634c99 --- /dev/null +++ b/src/TileRendererConsumer.cs @@ -0,0 +1,11 @@ +namespace Cthangover.Mods.TileRender +{ + using Cthangover.Core.Mods.Consumers; + /// Uses the kernel's normal load, catch-up and reverse unload fan-out. + public class TileRendererConsumer : ModTypeConsumer + { + public override string Id => "tile_render_base.renderers"; + protected override void Add(ITileRendererFactory instance, string modId) => TileRendererRegistry.Instance.Register(instance); + protected override void Remove(ITileRendererFactory instance, string modId) => TileRendererRegistry.Instance.Unregister(instance); + } +} diff --git a/src/TileRendererRegistry.cs b/src/TileRendererRegistry.cs new file mode 100644 index 0000000..089f801 --- /dev/null +++ b/src/TileRendererRegistry.cs @@ -0,0 +1,46 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using System.Collections.Generic; + using System.Linq; + using Cthangover.Core.Utils; + + /// Mod-owned factories. Selection is never cached across games and an explicit missing ID never falls back. + public class TileRendererRegistry + { + public static TileRendererRegistry Instance { get; } = new(); + private readonly Dictionary factories = new(StringComparer.Ordinal); + /// Sent before the owner's assembly unloads, so live hosts release its nodes and delegates. + public event Action Removing; + public IReadOnlyList Ids => factories.Keys.OrderBy(IdOrder).ToArray(); + private static string IdOrder(string id) => id; + + public void Register(ITileRendererFactory factory) + { + if (factory == null || string.IsNullOrWhiteSpace(factory.Id)) + throw new ArgumentException("Renderer requires an ID."); + if (!factories.TryAdd(factory.Id, factory)) + throw new InvalidOperationException($"Duplicate tile renderer '{factory.Id}'."); + } + + public void Unregister(ITileRendererFactory factory) + { + if (factory == null || !factories.TryGetValue(factory.Id, out var current) || !ReferenceEquals(current, factory)) + return; + if (Removing != null) + foreach (Action handler in Removing.GetInvocationList()) + try { handler(factory.Id); } + catch (Exception ex) { GameLogger.Log("RPG", "renderer cleanup: " + ex.Message, LogLevel.Error); } + factories.Remove(factory.Id); + } + + public ITileRendererFactory Resolve(string id) + { + if (!string.IsNullOrEmpty(id) && factories.TryGetValue(id, out var factory)) + return factory; + if (string.IsNullOrEmpty(id) && factories.Count == 1) + return factories.Values.First(); + throw new InvalidOperationException($"Tile renderer '{id ?? ""}' unavailable or ambiguous. Available: {string.Join(", ", Ids)}"); + } + } +} diff --git a/src/TileSceneChanges.cs b/src/TileSceneChanges.cs new file mode 100644 index 0000000..b1206a0 --- /dev/null +++ b/src/TileSceneChanges.cs @@ -0,0 +1,9 @@ +namespace Cthangover.Mods.TileRender +{ + /// Versioned replacement of prepared visual data; implementations retain unchanged draw chunks. + public class TileSceneChanges + { + public long BaseRevision { get; set; } + public TileRenderScene Scene { get; set; } + } +} diff --git a/src/TileSurfaceCache.cs b/src/TileSurfaceCache.cs new file mode 100644 index 0000000..1fabf5e --- /dev/null +++ b/src/TileSurfaceCache.cs @@ -0,0 +1,78 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using System.Collections.Generic; + using Cthangover.Core.Utils; + using Godot; + /// + /// Owns bounded 32-cell texture chunks. A one-cell halo determines invalidation; + /// moving a camera or replacing a renderer never re-rasterizes them. After Update, + /// apply the new snapshot before the next draw: changed textures have been replaced. + /// + public class TileSurfaceCache : IDisposable + { + public const int ChunkSize = 32; + private readonly Dictionary chunks = new(); + private TileSurfaceField previous; + private Texture2D atlas; + private byte[] pixels; + private int atlasWidth; + public int LastBuiltChunks { get; private set; } + public IEnumerable Chunks => chunks.Values; + public long TextureBytes { get; private set; } + + public void Update(TileSurfaceField field, Texture2D source) + { + if (!GameEnvironment.IsRuntime) throw new InvalidOperationException("Texture cache requires the Godot runtime."); + var reset = !ReferenceEquals(atlas, source) || previous == null || previous.Width != field.Width || + previous.Height != field.Height || previous.TileSize != field.TileSize || previous.PatchSize != field.PatchSize; + if (reset) + { + Dispose(); + atlas = source; + using var image = source.GetImage(); + image.Convert(Image.Format.Rgba8); + pixels = image.GetData(); + atlasWidth = image.GetWidth(); + } + LastBuiltChunks = 0; + for (var y = 0; y < field.Height; y += ChunkSize) + for (var x = 0; x < field.Width; x += ChunkSize) + { + var rect = new Rect2I(x, y, Math.Min(ChunkSize, field.Width - x), Math.Min(ChunkSize, field.Height - y)); + if (!reset && !Changed(field, rect)) continue; + var key = new Vector2I(x, y); + if (chunks.Remove(key, out var old)) old.Texture.Dispose(); + var found = false; + for (var cy = y; cy < rect.End.Y && !found; cy++) + for (var cx = x; cx < rect.End.X && !found; cx++) found = field.Materials[cy * field.Width + cx] >= 0; + if (!found) continue; + var bytes = TileSurfaceRasterizer.Render(field, pixels, atlasWidth, rect); + using var image = Image.CreateFromData(rect.Size.X * field.TileSize, rect.Size.Y * field.TileSize, false, Image.Format.Rgba8, bytes); + chunks[key] = new TileSurfaceChunk { Cells = rect, Texture = ImageTexture.CreateFromImage(image) }; + LastBuiltChunks++; + } + previous = new TileSurfaceField { Width = field.Width, Height = field.Height, TileSize = field.TileSize, + PatchSize = field.PatchSize, Materials = (int[])field.Materials.Clone(), Diffuse = (bool[])field.Diffuse.Clone() }; + TextureBytes = 0; + foreach (var chunk in chunks.Values) TextureBytes += (long)chunk.Cells.Size.X * chunk.Cells.Size.Y * field.TileSize * field.TileSize * 4; + } + + private bool Changed(TileSurfaceField field, Rect2I rect) + { + for (var y = Math.Max(0, rect.Position.Y - 1); y < Math.Min(field.Height, rect.End.Y + 1); y++) + for (var x = Math.Max(0, rect.Position.X - 1); x < Math.Min(field.Width, rect.End.X + 1); x++) + { + var i = y * field.Width + x; + if (field.Materials[i] != previous.Materials[i] || field.Diffuse[i] != previous.Diffuse[i]) return true; + } + return false; + } + + public void Dispose() + { + foreach (var chunk in chunks.Values) chunk.Texture.Dispose(); + chunks.Clear(); previous = null; atlas = null; pixels = null; TextureBytes = 0; + } + } +} diff --git a/src/TileSurfaceChunk.cs b/src/TileSurfaceChunk.cs new file mode 100644 index 0000000..d82c545 --- /dev/null +++ b/src/TileSurfaceChunk.cs @@ -0,0 +1,10 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Generated texture and its logical extent; lifetime belongs to TileSurfaceCache. + public class TileSurfaceChunk + { + public Rect2I Cells { get; set; } + public Texture2D Texture { get; set; } + } +} diff --git a/src/TileSurfaceField.cs b/src/TileSurfaceField.cs new file mode 100644 index 0000000..590a658 --- /dev/null +++ b/src/TileSurfaceField.cs @@ -0,0 +1,13 @@ +namespace Cthangover.Mods.TileRender +{ + /// Projection-independent material IDs (-1 means no surface) and blending flags in row-major order. + public class TileSurfaceField + { + public int Width { get; set; } + public int Height { get; set; } + public int TileSize { get; set; } + public int PatchSize { get; set; } + public int[] Materials { get; set; } + public bool[] Diffuse { get; set; } + } +} diff --git a/src/TileSurfaceRasterizer.cs b/src/TileSurfaceRasterizer.cs new file mode 100644 index 0000000..f740468 --- /dev/null +++ b/src/TileSurfaceRasterizer.cs @@ -0,0 +1,96 @@ +namespace Cthangover.Mods.TileRender +{ + using System; + using Godot; + /// + /// Pure CPU reference compositor. A region samples neighbours from the full field, + /// with global patch phase and noise, so chunk borders equal a monolithic render. + /// + public static class TileSurfaceRasterizer + { + public static byte[] Render(TileSurfaceField field, byte[] atlas, int atlasWidth, Rect2I cells) + { + var size = field.TileSize; + var patch = field.PatchSize; + if (size <= 0 || patch <= 0 || atlasWidth < patch || atlas.Length < atlasWidth * patch * 4 || + field.Materials.Length != field.Width * field.Height || field.Diffuse.Length != field.Materials.Length || + cells.Position.X < 0 || cells.Position.Y < 0 || cells.End.X > field.Width || cells.End.Y > field.Height) + throw new ArgumentException("Invalid surface field, atlas or region."); + var width = cells.Size.X * size; + var height = cells.Size.Y * size; + var output = new byte[width * height * 4]; + var radius = Math.Min(8f, size / 4f); + var homogeneous = new bool[cells.Size.X * cells.Size.Y]; + if (size >= 8) + for (var cy = cells.Position.Y; cy < cells.End.Y; cy++) + for (var cx = cells.Position.X; cx < cells.End.X; cx++) + homogeneous[(cy - cells.Position.Y) * cells.Size.X + cx - cells.Position.X] = Homogeneous(field, cx, cy, patch, atlasWidth); + for (var oy = 0; oy < height; oy++) + for (var ox = 0; ox < width; ox++) + { + var x = ox + cells.Position.X * size; + var y = oy + cells.Position.Y * size; + var cx = x / size; + var cy = y / size; + var own = cy * field.Width + cx; + if (field.Materials[own] < 0) continue; + // Equal source samples stay equal under any positive blend weights. + // Most terrain interiors can copy the patch without a 9-tap kernel. + if (homogeneous[(cy - cells.Position.Y) * cells.Size.X + cx - cells.Position.X]) + { + var src = ((y % patch) * atlasWidth + field.Materials[own] * patch + x % patch) * 4; + var dst = (oy * width + ox) * 4; + output[dst] = atlas[src]; output[dst + 1] = atlas[src + 1]; + output[dst + 2] = atlas[src + 2]; output[dst + 3] = atlas[src + 3]; + continue; + } + var noise = (float)(Math.Sin((x + 0.5) * 0.23) * Math.Cos((y + 0.5) * 0.19) * 1.5); + float red = 0, green = 0, blue = 0, alpha = 0, total = 0; + for (var dy = -1; dy <= 1; dy++) + for (var dx = -1; dx <= 1; dx++) + { + var nx = cx + dx; + var ny = cy + dy; + if (nx < 0 || ny < 0 || nx >= field.Width || ny >= field.Height) continue; + var index = ny * field.Width + nx; + var material = field.Materials[index]; + if (material < 0 || ((dx != 0 || dy != 0) && (!field.Diffuse[own] || !field.Diffuse[index]))) continue; + if ((material + 1) * patch > atlasWidth) throw new ArgumentException("Surface index is outside the atlas."); + var px = x + 0.5f + noise; + var py = y + 0.5f + noise; + var distanceX = Math.Min(px - nx * size, (nx + 1) * size - px); + var distanceY = Math.Min(py - ny * size, (ny + 1) * size - py); + var weight = Smooth(0.5f + distanceX / (2 * radius)) * Smooth(0.5f + distanceY / (2 * radius)); + if (weight <= 0) continue; + var offset = ((y % patch) * atlasWidth + material * patch + x % patch) * 4; + red += atlas[offset] * weight; green += atlas[offset + 1] * weight; + blue += atlas[offset + 2] * weight; alpha += atlas[offset + 3] * weight; total += weight; + } + var dest = (oy * width + ox) * 4; + output[dest] = (byte)Math.Clamp((int)Math.Round(red / total), 0, 255); + output[dest + 1] = (byte)Math.Clamp((int)Math.Round(green / total), 0, 255); + output[dest + 2] = (byte)Math.Clamp((int)Math.Round(blue / total), 0, 255); + output[dest + 3] = (byte)Math.Clamp((int)Math.Round(alpha / total), 0, 255); + } + return output; + } + + private static bool Homogeneous(TileSurfaceField field, int x, int y, int patch, int atlasWidth) + { + var own = y * field.Width + x; + var material = field.Materials[own]; + if (material < 0 || (material + 1) * patch > atlasWidth) return false; + if (!field.Diffuse[own]) return true; + for (var ny = Math.Max(0, y - 1); ny <= Math.Min(field.Height - 1, y + 1); ny++) + for (var nx = Math.Max(0, x - 1); nx <= Math.Min(field.Width - 1, x + 1); nx++) + { + var i = ny * field.Width + nx; + if (field.Materials[i] >= 0 && field.Diffuse[i] && field.Materials[i] != material) return false; + } + return true; + } + + private static float Smooth(float value) + { value = Math.Clamp(value, 0, 1); return value * value * (3 - 2 * value); } + } +} diff --git a/src/TileVisual.cs b/src/TileVisual.cs new file mode 100644 index 0000000..2a616ac --- /dev/null +++ b/src/TileVisual.cs @@ -0,0 +1,21 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + + /// A resolved image region in cell space. Texture pixels are never gameplay geometry. + public class TileVisual + { + public string Id { get; set; } + public Texture2D Texture { get; set; } + public Rect2 Source { get; set; } + public Rect2 Bounds { get; set; } + public Vector2 Anchor { get; set; } + public int Layer { get; set; } + public bool Upright { get; set; } + public Color Tint { get; set; } = Colors.White; + /// Optional explicit world plane, TL/TR/BR/BL in world cell coordinates; with Upright it is depth-sorted at Anchor. + public Vector3[] WorldQuad { get; set; } + /// Only this projection uses the visual (empty means both). + public string Only { get; set; } + } +} diff --git a/src/TileVisualPlacement.cs b/src/TileVisualPlacement.cs new file mode 100644 index 0000000..23f2497 --- /dev/null +++ b/src/TileVisualPlacement.cs @@ -0,0 +1,19 @@ +namespace Cthangover.Mods.TileRender +{ + using Godot; + /// Projection output, consumed without knowing a coordinate system: an affine quad and optional sort anchor. + public class TileVisualPlacement + { + public Transform2D Transform { get; private set; } + public Rect2 Bounds { get; private set; } + public Vector2 Anchor { get; private set; } + public bool DepthSorted { get; private set; } + public static TileVisualPlacement FromQuad(Vector2[] points, Vector2 anchor, bool depthSorted) + { + var bounds = new Rect2(points[0], Vector2.Zero); + foreach (var point in points) bounds = bounds.Expand(point); + return new TileVisualPlacement { Transform = new Transform2D(points[1] - points[0], points[3] - points[0], points[0]), + Bounds = bounds, Anchor = anchor, DepthSorted = depthSorted }; + } + } +} diff --git a/tests/StubTileRendererFactory.cs b/tests/StubTileRendererFactory.cs new file mode 100644 index 0000000..7c4569b --- /dev/null +++ b/tests/StubTileRendererFactory.cs @@ -0,0 +1,12 @@ +namespace Cthangover.Mods.TileRender.Tests +{ + using System; + /// Registry fixture with no Godot allocation or dependency on an implementation mod. + internal class StubTileRendererFactory : ITileRendererFactory + { + public string Id { get; } + public StubTileRendererFactory(string id) { Id = id; } + public ITileProjection Projection(int size) => throw new NotSupportedException(); + public ITileWorldPresentation Create() => throw new NotSupportedException(); + } +} diff --git a/tests/TileRendererRegistryTests.cs b/tests/TileRendererRegistryTests.cs new file mode 100644 index 0000000..779f771 --- /dev/null +++ b/tests/TileRendererRegistryTests.cs @@ -0,0 +1,31 @@ +namespace Cthangover.Mods.TileRender.Tests +{ + using Cthangover.Core.Mods.Testing; + /// Explicit selection, ambiguity and owner-sensitive unregister never depend on discovery order. + public class TileRendererRegistryTests + { + private readonly TileRendererRegistry registry = new(); + private readonly StubTileRendererFactory square = new("square"); + private void Missing() => registry.Resolve("missing"); + private void Ambiguous() => registry.Resolve(null); + private void Duplicate() => registry.Register(square); + + [ModTest("registry/selection_collision_and_unload")] + static void SelectionCollisionAndUnload(ModTestContext ctx) + { + var test = new TileRendererRegistryTests(); + test.registry.Register(test.square); + ModAssert.True(ReferenceEquals(test.square, test.registry.Resolve(null)), "single implementation may be inferred"); + ModAssert.Throws(test.Missing, "explicit missing ID must not fall back", true); + ModAssert.Throws(test.Duplicate, "duplicate ID is rejected", true); + var iso = new StubTileRendererFactory("iso"); + test.registry.Register(iso); + ModAssert.Throws(test.Ambiguous, "multiple implementations require selection", true); + ModAssert.True(ReferenceEquals(iso, test.registry.Resolve("iso")), "explicit selection"); + test.registry.Unregister(new StubTileRendererFactory("iso")); + ModAssert.True(ReferenceEquals(iso, test.registry.Resolve("iso")), "a different owner cannot delete a factory"); + test.registry.Unregister(iso); + ModAssert.True(ReferenceEquals(test.square, test.registry.Resolve(null)), "remaining implementation stays available"); + } + } +} diff --git a/tests/TileSurfaceCacheTests.cs b/tests/TileSurfaceCacheTests.cs new file mode 100644 index 0000000..a8e2a61 --- /dev/null +++ b/tests/TileSurfaceCacheTests.cs @@ -0,0 +1,41 @@ +namespace Cthangover.Mods.TileRender.Tests +{ + using System.Linq; + using Cthangover.Core.Mods.Testing; + using Godot; + /// One edit rebuilds its affected halo, and cached GPU resources have explicit ownership. + public class TileSurfaceCacheTests + { + private static Texture2D ThirdTexture(TileSurfaceCache cache) + { + foreach (var chunk in cache.Chunks) if (chunk.Cells.Position.X == 64) return chunk.Texture; + return null; + } + + [ModTest("surfaces/cache_reuses_unchanged_chunks_and_invalidates_halo")] + static void CacheReusesUnchangedChunksAndInvalidatesHalo(ModTestContext ctx) + { + var pixels = new byte[16 * 8 * 4]; + for (var i = 0; i < pixels.Length; i++) pixels[i] = 255; + using var image = Image.CreateFromData(16, 8, false, Image.Format.Rgba8, pixels); + using var texture = ImageTexture.CreateFromImage(image); + using var cache = new TileSurfaceCache(); + var field = new TileSurfaceField { Width = 65, Height = 3, TileSize = 4, PatchSize = 8, + Materials = new int[65 * 3], Diffuse = Enumerable.Repeat(true, 65 * 3).ToArray() }; + cache.Update(field, texture); + ModAssert.Equal(3, cache.LastBuiltChunks, "cold build has three chunks"); + var last = ThirdTexture(cache); + cache.Update(field, texture); + ModAssert.Equal(0, cache.LastBuiltChunks, "camera/unchanged data generate no pixels"); + field.Materials[31] = 1; + cache.Update(field, texture); + ModAssert.Equal(2, cache.LastBuiltChunks, "an edit beside a chunk boundary invalidates both neighbours"); + ModAssert.True(ReferenceEquals(last, ThirdTexture(cache)), "unaffected third texture is preserved"); + field.Materials[0] = 1; + cache.Update(field, texture); + ModAssert.Equal(1, cache.LastBuiltChunks, "interior edit regenerates only one chunk"); + cache.Dispose(); + ModAssert.Equal(0, cache.TextureBytes, "explicit disposal releases the cache's budget"); + } + } +} diff --git a/tests/TileSurfaceRasterizerTests.cs b/tests/TileSurfaceRasterizerTests.cs new file mode 100644 index 0000000..4e74218 --- /dev/null +++ b/tests/TileSurfaceRasterizerTests.cs @@ -0,0 +1,41 @@ +namespace Cthangover.Mods.TileRender.Tests +{ + using Cthangover.Core.Mods.Testing; + using Godot; + /// Chunk edges, world phase and diagonal blending must match the full reference texture byte-for-byte. + public class TileSurfaceRasterizerTests + { + [ModTest("surfaces/homogeneous_field_preserves_every_patch_byte")] + static void HomogeneousPatch(ModTestContext ctx) + { + var atlas = new byte[16 * 16 * 4]; + for (var i = 0; i < atlas.Length; i++) atlas[i] = (byte)(i * 73 % 256); + foreach (var size in new[] { 8, 32 }) + foreach (var diffuse in new[] { false, true }) + { + var field = new TileSurfaceField { Width = 3, Height = 2, TileSize = size, PatchSize = 16, + Materials = new int[6], Diffuse = new[] { diffuse, diffuse, diffuse, diffuse, diffuse, diffuse } }; + var pixels = TileSurfaceRasterizer.Render(field, atlas, 16, new Rect2I(0, 0, 3, 2)); + for (var y = 0; y < 2 * size; y++) for (var x = 0; x < 3 * size; x++) for (var c = 0; c < 4; c++) + ModAssert.Equal(atlas[((y % 16) * 16 + x % 16) * 4 + c], pixels[(y * 3 * size + x) * 4 + c], "exact source sample including alpha"); + } + } + [ModTest("surfaces/chunks_equal_monolithic_pixels")] + static void ChunksEqualMonolithicPixels(ModTestContext ctx) + { + var field = new TileSurfaceField { Width = 4, Height = 3, TileSize = 8, PatchSize = 16, + Materials = new[] { 0, 0, 1, 1, 0, -1, 1, 1, 1, 0, 0, 1 }, + Diffuse = new[] { true, true, true, true, true, true, true, false, true, true, true, true } }; + var atlas = new byte[32 * 16 * 4]; + for (var y = 0; y < 16; y++) for (var x = 0; x < 32; x++) + { var i = (y * 32 + x) * 4; atlas[i] = (byte)(x * 7); atlas[i + 1] = (byte)(y * 15); atlas[i + 3] = 255; } + var full = TileSurfaceRasterizer.Render(field, atlas, 32, new Rect2I(0, 0, 4, 3)); + for (var cy = 0; cy < 3; cy++) for (var cx = 0; cx < 4; cx++) + { + var part = TileSurfaceRasterizer.Render(field, atlas, 32, new Rect2I(cx, cy, 1, 1)); + for (var y = 0; y < 8; y++) for (var x = 0; x < 8; x++) for (var c = 0; c < 4; c++) + ModAssert.Equal(full[((cy * 8 + y) * 32 + cx * 8 + x) * 4 + c], part[(y * 8 + x) * 4 + c], "chunk including halo and global patch phase"); + } + } + } +}