From 54c1508db677e866c096da92f296ddb9118ef1a9 Mon Sep 17 00:00:00 2001 From: Ykkrosh Date: Sat, 3 Jun 2006 05:08:32 +0000 Subject: [PATCH] Renamed autobuilt ps.exe to pyrogenesis.exe, to match the new project layout. Fixed Atlas project creation. Improved VS2005 linking speed. Added work-in-progress environment (water, sun) editing to Atlas. This was SVN commit r3935. --- binaries/system/Atlas.bat | 2 +- build/docs/builddoc.bat | 2 +- build/premake/functions.lua | 8 +- build/premake/premake.exe | Bin 339968 -> 339968 bytes build/premake/premake.lua | 146 +++++++++--------- build/premake/src/Src/vs.c | 3 + source/ps/GameSetup/Atlas.cpp | 2 +- .../AtlasUI/ScenarioEditor/ScenarioEditor.cpp | 6 +- .../AtlasUI/ScenarioEditor/SectionLayout.cpp | 2 + .../Sections/Environment/Environment.cpp | 68 ++++++++ .../Sections/Environment/Environment.h | 10 ++ .../tools/atlas/GameInterface/CommandProc.h | 16 +- source/tools/atlas/GameInterface/GameLoop.cpp | 18 +-- .../Handlers/ElevationHandlers.cpp | 4 +- .../Handlers/EnvironmentHandlers.cpp | 73 +++++++++ .../Handlers/GraphicsSetupHandlers.cpp | 18 +-- .../GameInterface/Handlers/MessageHandler.h | 34 +--- .../GameInterface/Handlers/ObjectHandlers.cpp | 4 +- .../Handlers/TerrainHandlers.cpp | 2 +- source/tools/atlas/GameInterface/Messages.h | 39 ++++- .../tools/atlas/GameInterface/MessagesSetup.h | 18 ++- source/tools/atlas/GameInterface/Register.cpp | 51 ++++++ 22 files changed, 372 insertions(+), 154 deletions(-) create mode 100644 source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.cpp create mode 100644 source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.h create mode 100644 source/tools/atlas/GameInterface/Handlers/EnvironmentHandlers.cpp create mode 100644 source/tools/atlas/GameInterface/Register.cpp diff --git a/binaries/system/Atlas.bat b/binaries/system/Atlas.bat index 42bf07ebe1..5da2d94a60 100644 --- a/binaries/system/Atlas.bat +++ b/binaries/system/Atlas.bat @@ -1 +1 @@ -ps -editor \ No newline at end of file +pyrogenesis.exe -editor \ No newline at end of file diff --git a/build/docs/builddoc.bat b/build/docs/builddoc.bat index e2c00dc9bc..1fddb3c61d 100644 --- a/build/docs/builddoc.bat +++ b/build/docs/builddoc.bat @@ -1 +1 @@ -"cppdoc_cmd.exe" -overwrite -autoview -autoquit -title="0 A.D." -company="Wildfire Games" -hier -insertbr -include-const -include-anonymous -document-preprocessor -comment-format="/**;*;*/;AFTER///;//;///" -classdir=projects -module="cppdoc-standard" -extensions="c,cpp,cxx,cc,h,hpp,hxx" -languages="c=cpp,cc=cpp,cpp=cpp,cs=csharp,cxx=cpp,h=cpp,hpp=cpp,hxx=cpp,java=java" -enable-author=true -enable-deprecations=true -enable-since=true -enable-version=true -file-links-for-globals=true -generate-deprecations-list=true -generate-hierarchy=true -header-background-dark="#ccccff" -header-background-light="#eeeeff" -include-private=true -include-protected=true -index-file-base=index -overview-html=overview.html -reduce-summary-font=true -selected-text-background=navy -selected-text-foreground=white -separate-index-pages=true -show-cppdoc-version=true -show-timestamp=true -summary-html=project.html -suppress-details=false -suppress-frames-links=false -table-background=white -wrap-long-lines=true "..\..\source\graphics" "..\..\source\maths" "..\..\source\ps" "..\..\source\renderer" "..\..\source\scripting" "..\..\source\sound" "..\..\docs\generated\index.html" \ No newline at end of file +"cppdoc_cmd.exe" -overwrite -autoview -autoquit -title="0 A.D." -company="Wildfire Games" -hier -include-const -include-anonymous -document-preprocessor -comment-format="/**;*;*/;AFTER///;//;///" -classdir=projects -module="cppdoc-standard" -extensions="c,cpp,cxx,cc,h,hpp,hxx" -languages="c=cpp,cc=cpp,cpp=cpp,cs=csharp,cxx=cpp,h=cpp,hpp=cpp,hxx=cpp,java=java" -enable-author=true -enable-deprecations=true -enable-since=true -enable-version=true -file-links-for-globals=true -generate-deprecations-list=true -generate-hierarchy=true -header-background-dark="#ccccff" -header-background-light="#eeeeff" -include-private=true -include-protected=true -index-file-base=index -overview-html=overview.html -reduce-summary-font=true -selected-text-background=navy -selected-text-foreground=white -separate-index-pages=true -show-cppdoc-version=true -show-timestamp=true -summary-html=project.html -suppress-details=false -suppress-frames-links=false -table-background=white -wrap-long-lines=true "..\..\source\graphics" "..\..\source\maths" "..\..\source\ps" "..\..\source\renderer" "..\..\source\scripting" "..\..\source\sound" "..\..\docs\generated\index.html" \ No newline at end of file diff --git a/build/premake/functions.lua b/build/premake/functions.lua index 9eaaa14e36..903ba604cf 100755 --- a/build/premake/functions.lua +++ b/build/premake/functions.lua @@ -1,10 +1,12 @@ function sourcesfromdirs(root, dirs) local res = {} for i,v in dirs do + local prefix + if v == "" then prefix = root..v else prefix = root..v.."/" end local files = matchfiles( - root..v.."/*.cpp", - root..v.."/*.h", - root..v.."/*.asm") + prefix.."*.cpp", + prefix.."*.h", + prefix.."*.asm") listconcat(res, files) end return res diff --git a/build/premake/premake.exe b/build/premake/premake.exe index e633158c04d329a837e43843b35c6ae90d8b8671..5edf628f812cfac95698a06f706477307aee9955 100755 GIT binary patch delta 28097 zcmeIbdt6ji`!~GTo*6+!K?OwxMI8_ol>`+$BytiIbrcvJ&w6{cXx;bw{NB&={`LIx*yq~UcU{-D zu5~`{JycNZUr_5`A`C^J6|AodW|y6fS(eFYGAZHCF=_&uXgF~ov@lI?nv>Xvy*uqt8=b52eL!Xcg#VF zZ#kJ_vxr_`mQ_gwqJAAy3Xl2}mFM<#=N5>}_0n^0xLCcBDX~e*?H$~?%S9Wwt2COg zyq=(Bi7Cz|p*;elo}-9C#SLPR$Feb5Rys$9KEhTx9igu_nX~~W<#87Ag)=-XmwoSi zC2Xu3vCMfrERB6qI;5))V~;q~!s`=;Al1V15Q|pzW`ZLAqAc1(caJb#{0c$#eXHm% z-0s4oe!~XdTl%tS`XJ6xic{%ybQ{2KIQMqTW-e!F_iilDIl6nY+Gc4f?;gY01!r}S zd9125F5&=V@0H%~8PC|9(xJV#scOhN=P!?RP}PN{UVX+f_PTRwl$kX+i=z6lW6rXu zW4`XSOetP9N`-lz?B!*@v85zKyDP1x03&uVuwT|BHtujlg_qY_MMr4S*XH+PgG)me3}Ib@l9@8F-abII0zjt$?j^h=jsxy& z70)}Lu^&f`r{)H;SDmwSL)p{LHM#xRo6e)Tacr^Ev~Wf13kiDlu4>FoN-cYv8`D|WsV0CZu zl-tvt>n%nPfumgS;+k}E+Sz^aJT|cO#l@(Wd(Jyg^=22H-JjmZzH@%@bl0HX(>ng9IgA40nFH^pM(Xu5*JUip4pr9ARv!^Qxnal{t45jA(zgD+VyL7B>`s zBeb{B$-jdjJ!`B*^l>&{wuZgv+_J2@*Uw?dxF~aewrmOJg%QuRZQmwFHnFAnxLALU z#=cLsqM4DRxaV{{QxO=}pK8&+sC<>zlnJ?kqDfELkkg#w3!~Uo=h{LCyHnbH`CP_^ zIF}S{W*zXRm^+d?YuoIk!`X|=co zYFy1KuE8`aCrvTinaq1MdKyDh^m8uaVXAKn=c_!dQCE^&be`b7y@Ve%z!WFjv<^96 zzo`p4`iGku*!a?SH|H}p&)MUpjx66f;-v`HoiKU&k zRtK`;((7dhjck|m{R7)*%w!!rf%@rks4JW99C7GP)oY&f`k`*@iZiJEakRtA^6o6t zSz7)m+vmJqp2Vu1F^Bu2>&!j80%iQ;a2DhvkE~TAesW$ovWl&D&aUXvea|&TsheUI z$F72BSw-J^@X=P$@&@=YtJwED_zYvAZsolqv#vJ!m+lFd1?r5&KW$%RUw`Lf#BwK|#x^!w)6UO45kAD)&@=D+Q z6h8w(i^AWG^qZk zOJ6)2ZKCP&+jMHQ^Xu3hXX*L311%>M<=pRuN4?SKvyE1C@wgF4JJxBx@B+J6+Vs2r z1~#BH;Rjel##Ec~poC8Eh_HOBTvBAjJII+RN@?XA2waGiq4EM)sqdpsbnYmpodf97AizFrL=&I#r?+`^v*ESr+OjPvY zNH&_Oey8{=jE#t`s74ZbF;wO`VR%}_VMx#~_JU!*B+7bI)!V(qdjNH&vNSk>)l0my z$|75hr|7;ixQZF4m?vh9qGbL}><4;dTAXL+#+tj=}Bi+#n| z0KTa)i(p^!V~yD)mdm>|VH2D7tWp$oF@LLw;?FfKiq^3^w~|4 z8Y%gZdpBkAj(s0OVn0SUv!RUo4eLm3&nxz1CAXQDBjuwZ$HC2x~i}n`VGw zb9-`g#I-Mg`7(CVb)q$kW@@9iISXV*SsXte$kNyi-l{F@#y;VL+p@tO<3E=DWgwWg z^$W^SB*E1ZhJNhY+?EYu>}%KAb}Y}tQu*i*wv;9F&qG*yR>yx0VR>qkR=k;+wc$^9 zVy%2SyiZy5%kFIzKk^qlv7u_j3Vxvz3ksaKNotD9-`M?Fl9JoPs>OYY9{nuG+SY*$ z<&m9PVCan93bN3vh)l6xS=h`|OA{ft(ahyz6&C(PXZA6h#k+Q4og6dXBaKx=ESHna z-!Y^dQ`g- zyRuIQisOYkD8ApLL41rrQ&^dg8)INp$4_@*v1}UmF|+oeMToMd=h-o~{%+lEfzSYdSphb?FSy=4pf6Ep*0Y-WGE8+I{?cH7e%H1@fc;wwF#mA#Q zn=Jl(M!{ArbImSuUb)*{<{gK|AI`gkvYtIBBA!+3xQ}$#BrUgyG=vXQS6frGydzW= zF&q-8fa3U)Q1*D>hGmMTG;EjD6VmQ{_!)4Wf2X6<-0A8yOBZZCqOxSm|?pm|1?vCR(tR(BTiuWkY< ztx4MD>B-4(MNMm;L$Vy~y0F`RAj58T1$-9QLuV0B1FlJIq*}y1UyuJyZ^8dI>HlRw zGP4RN@7{yqJj7FaU=}OpOM0;BKGz#z&)wI@FG&%<@VXwXD=XryBA5#+(}@T+relj4 zs2FX}8B8oWUbIt-D!+^#rD&(UFhmyffjwEVXOc6nRBNl>&c=w{j`An^gz z2lambgAwX+B>Wo4Do#;2h{BbG&YuH1AT=%umr(fMgys->gHR-)&C24O2OCO_lcEf4$UkcpL;3pNYyta>n<6p3 zUvWi8vRtMbUUThyguTRu&3cvkd!(KEI}TtE`}<_bZMN4=HcnRDIYvwa2xE-OsXov% z$qayuIzHm_HBoG?+RTgJi(+m3&VQ#U!-|auZ8%V0vx?7L=4dvV#m>C|`-R?OmgIh7 zvgH24DtVw7C3%oYmOMl}D!EzoJO~YHe0d7r^szLu0l0ZwTV}s&}Z2PllB+VO0UrhekYcN2S2AT?KGbi4z5CD zD0Y)D(VQ13KIKCOu<_wf-IgUsRjb2>VT!%yc55f)H1Q{wQ!fNr7TO>VV4t%*UNVsN zVPjks1KF1b_9W*+Fw}>+4h>;eL(pu@#TIwpS|p_Tokv%D62}|tc5(ZY!5>Lrz0}5w z__PFOWuV*OO#HT=~i=44;FqLQ&EX7l;f zVeB#gAD^S1dyBRKR&iDaw(<+Z*jns(=A^LLR@0{-Z^!0fH7~wWW(>hB^&u}yVVl_m zJ~owgQN1SfMX5|v!za6bNM!*A^r+iuEVJc^Uu1>So*?Qo+{}u1T$4w#57frBN6>$B zZ;Be;)`IMP$TKXgL^c2F`q{#^Ft&mhj%5c~C67;MudC)?TtBC?&Q03SIIDP09LMN# zEXn)f()b+jG8wy*g&cQ{W7s^`=ETZEX>gaQko!&g>Vl->cVF8UGW-L&f+=dz)VpGnI$tzJXI;vD=POb!X{eD z?wu*Bp|Tk&EuwOqXAkg1vFLGiO%k)9N#}5x5)0el|;-;9-w5bN6`Yk=Kw_iRK^?N`7ds z9wFY>4_%mJ+9Qk$x8&}efj!2zKEV>2 zeu53en&h-}i#Wu8e}cvNF4YCv&2rk){QIMo8NO#hT;{i|90iubIncvoik2TsFMR8H`hTD6s#Q-8;QbMZvpg=rx$#n--*q z6Rzp=*i(#Q!pLD=o8!@T*EIDVz`?oYCgjiWr`BYf{KqX_+@M zV{xJxuS**E?)j`8yTnh-XYEs~uOseu#KoDsitxlrw;Nl)vN8m6O=Y{l(z7hu7Sb(+ z-JueoEYTG3;Br8#PyjVM@4bM9wbrEM^9HvYLvITds2Xh?e|!OJ-)K`~MLA&Ms~50| z>|K6&0UM9AY@(edwU7xPJ0=s(ZKH)>=P%k>uo`%se{5$RhANcyhqrNGGiN`h4DHf2 zgx^His+}bGBA|AZ&{+78gDB3T?IwYPR8>4M7iZH=ynikWK}Q*v%ep#7d7<~2i#}U2 zRMGNbdbuS8TFS3L-h?KS?0zGlXhJs$843ML=zKj;EuktxX9;a3bdpd3ka(YN=f&oO zR4U)K-;;bQ$v-D~Hou?Cf*hqJO{92B2}KgJ6AC1hO-La$m5{g!WF>TlP#U2!Lh*#Q z5Q-sGK&Y2Qmyup8nU4zxC?89^YIC3!(J~JT-@Fi$%sBq>LKfaSjuboppq?O}e_%b8 z-(JYVdQt;n<5eMB$lg+1`Iy=vgksqA7_A<}@V?52FJejTCNEjU0%xv#D?zab7Y-Jw z$%4f#h}6Up9vL#Cx?WJ#o!M#5cKf{>cM-G8MJ z@jE}9$69p`B%`N1M*oXa!0uKa3rV~C8|)S$1>`4EJ5M1EA=<38%T~w5nyC2sYE-#J zlcpnNX0)1 z3tZQt_;_8j|0+!ZMfm7Cl^^-@*Je<7JB2TQgcrb?1=lCSQYQWT7Huby!$LNNu)$mt zM>y7#;D1+@nUv$DbIpgapU1GZCl~q6(zPpBpy(@&M6<*gyRLqM-Y}Ndt0#+lZi#Vx{J~gbx{mnT?YdeH zFwCpvBzqn*sz1UjfN>^?MLgu%BGpaMqN&%o zKh(>Xrp+PU!QU_-~s~T-!j%~GFBi-D`k88p_xQC{(e5|?3jk7C!1-3v}D|Y)}3fJ zV?tYt=8L6EOIQNN{Yne-g{Ou(y%dtXM;8*hb=QgUqx8N9) z3?0X8721wJ5bZQXHW7i8A@$O>LRM$eHj&Cj)-!PRWuq%Oks_P<09}#nqgQB$Ho(Yt zZ3#Anm?r#0JlfVKUdIzxKFMiThebG$Ha-OLqbw9253_1>$nR8{3x83D8o)s9i?_me z5esz{L+YVW122DasFI1pLRl&0{F`6V%w|$|mazl1KnesPfF|>|iJkC(7W4C6odc2P z_eX+55w~BLu4-<=v<^7x7Ov?iPc|_b_DFoFRV)KS4am&oHW%Y5J*!rZIH=$>nR+rk zwLRo!8{DAZC5vE08(5!zNZU%{H4xjxFTcrZv}ki6bBM(xjJhRS=xO1OuoDtTaeXOC zyiW8K@#_z$h<{!t&;H5cB8=eqlqa!!SVJpTNx&GG>eVO{~`?V=~1a zAe-ojr=z%G&6JFEQ7pX|(KAc)CqEZolPRT(9I49IRSnqmiAr6SB;w#~8AuZ)UNiY}8E%W|`zJc3d($cX4j;V?(?**yI0Z%EbV0Yp4V1RqZaD6xXw@jf z!P<;uRMZWNyy5sB8OBur0{c!viD}|jVE2a&P>5NmTa59d^87T5Fuf;hwhUJE#<2os zu-*@LXb)sKR_zAXw%$V5Mmqo(R)oRgB_Jp_kl<+KWgO`hZ6!Go%OHAi*L?spCNeS? zBE*^f56v5-d0^J-7s^pM9rad`BfE4I^S8NG^sqRfm?IS-P|zE%X=|piI+jo{FvNZ* zdvLm_ild6rW{?r;MKp|-$zB7~Cd!yU10qs(M7nrM8dIuzEh2waWJvX86$b!i4d=e3 zzY3Wg<@juZxNep&3#`THIaykceE-&(N}@$Hpjm%;g}P>$>>2)|2&+2UwzbHY%ex<0 z9D{}J^7m9oBf@z9^por*Hs7K%By6}%!nO~EhalWng#|C&>JSEx*xp*Jg`HRoXEZ8+ zFR!H70)|#`{*vy}?xpR3s;;$GFXcxc$XjWvDf$3C`W&)JJ5&Z6H0Y}jjN;P~+Vm>Q z=IL6FEu-jcdk}?rxSjX`Qz4cD^7h-yB=^z6DNu`mt**D`L%wmo44{=jw>t)vCQ!*@ zA0f)Tcwff#*J??;jpEX{olr4m43>aB=%LwYSF;$fTb5U@|L@7l#ppViPv_#X8f`Dc zX1;DY3vd+b%G_{$8MAwWZN)So&(gK?J$>oAT#i%7!4x===WbC(CgQ$)wnYu$vSACA z%nwa@N(*9%ins{@>fMj9(6L-Dee`t7@V#6jolA{i7VU}xvm-FW0??j5^lMk zVz67pDoo-Qt(K&*WV)YFZ$cXgg%Zjk)Sgfpp%#Q933&k(9vvj6V3cCLZmRi^^x8|v zoK?GdANVK2Ht{G8W0cO(Mmta9FCeD=Nw|VcgtyGiT};pxZ5xSqK}$Y687W5f{k9mRtnvsIE2Gb6+Q75eJb>5YD!XJ*?l&%Ts3NANw(G>pUMbwUV z8mJ4R$=*?1nX48bvuOVJ9T0y-1~=~kogh?2=rEzJgj|G{6Z$t0h7&&jqAk4DD%QVE z4VHKj1~e6k)nqz@OrIeXNm<>ERS7Q(i^_|SAtqBU?XhJ;6>GY7iDXQE4%p=f*i=*aaoA`_2~8tZ<{+3wa0j80(uG-TUnpIyCfVg3 zRLeiq!X}@>-N-tJP)9;D2n7HgNCV0gO#sC%4vie>J%p}SNS+X!7Jlt)Mq${^(Uj$kyw zGlcvJeM+d|PoQ!_wS+z*R7FVE?H)p}ldOc$CPH>XYk}|rFkKV@*ph{U><+B=U7d(M zoZfHdK!F0tPB7J>2gXs<3>`-jPSLSH;XyiXphY=S$7cweb-bT&ppN$t_R+EI7z%Kv zxPw}?*)HRI3%sVJ4)EMtROQur{nx?9A~wSYZG~BruGeR1TgcTB2$9#7gg+uDA`P_- zn^q!)TxfREY#~iuQxPefcCEDQCe<@Yy#xX+jnD!hnnGJ{q-|r|qzO|TlWjKrZNG4! zrsT)1`Q5Ob2fvB^3BFvc+m2*#X@K>~v$(hIE4Nhm=3_Fp%6PYS#ZN1t74=Or6*uLR z>cb+ABOO^L-{oF-sY=H*O*3KXse=OLvX~qQe2;)F3a3~c6c)(h`L6ANTboSbKq0ck zT*$;XfO16PMZ|Z=8;U_=WhusrC`OX>((-mYc~PBfIwZfK$r53d7kRJ?r&JdrA?>CS zXpYQSp!k|n!1lefcCZ*1Ff^}f^)S$C$m%nsV-Z)+Q)>Pg2p>yh-?c6|5NZ&ziKEhH z4?VSA6p88q*C!^M|MCq0Os!S8idAloubFdmrfi zpx!9e>!i9yh5EPWWz|Y`Td`289XV28PWsPveX4aA3=`d7Ld(5z*O8o z5hwHHyY?|;8atIhkxH3`%3pYSR0DODzvu#iSOzC z!Y-}m>Q+XwI-y%xg-xo`@pK^78rl)>{)Y!Uz8CH?;(q|u)yz4ItuWSo1nPt4LvD9(7@E8V+@YSeiwfbZ%`Y#gHKGA2+s&gs%X-_;z_OwkQ7 zQ0)^bcCe1)2)6*v#IJ178w=?EfB|8|h^^}$UKe0`tFUIPVi0BtxY$PXjP(ti7sLQa z(4n3{TC{rNT|HJ$x^l_J&ChH|MFwSBzbr5#ioRj^99I#jRg`s%Ue;R>&}P$fckqiR z=(#$m(Sx`;NYbwkc0z#tI}M&MUiVxbSZc|I9d|diNPi&Tzn-;q3`Zx?=ljQTpcOd3 z(5YTUo@^NE*T{{yfo}2OP*)fy&$$oIvR<^z*ldRK%2?(NN0TUx975@YCK5`OsRdpR#v&r7!j=j|=S+(hNBVB0=U+b0S~%8x zrMvcBej4qgCm=dY_hvG^vDWS0=MRLNzG<-4kF!r(5ww;3T{n~P!rLkw$gOVB+A3bh zuNqh}wao;vMr4TvS*^>Vs&$%OAxs){at~rxC|0CQB!qNRTa^ z_|=)yanSt^CBVIAjC0W}+SGl!oWMB7G3)QyX9opO}Cpo0UtS3;4|u1vHg`NdF(0PqwXR8 zkWW8Ug+&}(P1&UlnL4>5T`Ox24+1ib@~wo=14n(EE(%}8P@Y8*H4Dj)Lauoe+DoXW z8PIM*y9sRvvT7>{zO>ri61!G{>q##!D_s1^jjWC1RUD*gg7eby=+0u0{(54SE`4xW z@suanR?G(STvojQis!Pz2lIhOmldKjyxTIfv>B9C00JmN1mVWOVl?If+|biV*Nh~+ zQH**Ku~OVqiqHE%e4!X;oGPG9aT*ZAIm#`DqYD<5%agV5+F*3TEHMKjF-&GCkK(-v zV|~l=B_=(+Mq6nXQauM10@deG+4LjrUzoe7xtePGNwbGEnd0BXhKX?Wje!lmtAD&tYuPY_ z_U(dIx>!Scn|5tIPG?rDFup|j2}6DkIkvzcOFRLCbTJ!G+Ey)lUbpj-`F5Y8&DRL% zv~iT?P(t;Mf%+5LN~kBH0zzGY4&?x4i9ixsNZ1@GOL$W_g~In&!Kmg(T<$r<4Pdcx zB~qxDzX95SmeqoCXrnK3D;PHfzo6cAo77T(-a(yix?s^F-A^1whGMkT8LF{;N~QqL4AR-E^eio)OL`Mo2VqK_?;?p6NN7UrHk+I z%n~(Hcbar7NmnIxNAScQOg2(N>9lT}@lGr=Q#>MDC;bbG_^OP!nIhIYDCRmTScNA> zlf2ytM)cT3y4@M)cDpBO`DCU^v*{F1W@a2vx)_URmPnJjWYWzc+d)#-PwFD2t~=>u z#e~RkJ3I@IIwHl#McBGw*Fi6OtlAZ-&kyn8C2jpVDg;~qB&(qN6|stru=?)Iwiyj6 zH^g)oAUimAqViQv4+v=F2Z%f)ohZh_2~HIICSPuj;jX{l@$%UCj?{Kjf=Mz#9G%5! zY@#e$9!@ag7QR-s)d_h%Z8G1xyHjPxlq{{Yu zEPv=cZb7rOL{g;CzE12qNoDoVRxq{(k@zC*5X44^wMYtISWX6kMc?N77X5~DhLf-g zLY$2W9w3P5R{CJWjQeWZLaZuFH21I786b=SpDEbR&`r#$mxp>PNq%&4h(15TPvvE4vQAK@S|Qe} zh_#QlCh6iRDhdlxQTYLSgOb}cQ+xmk_5ODHrxiP~g6VzZ5|w8LqS~;`d5pZYYDgXU z-dQ~TP_!Q+wCNtQ?@RXksKca-X%Ag(B2_z5X)6i(0@74S^JkRD&oC{YR5zcID*3%e zi0%LfBR}k6@V&-W9NsMAlmj+4(ORyxO=!y1awzIvi0No|kCq>828rH+C|#VBa~m$3 z&=WF9Tp}I3PTsUc5=f8KAvEf1S`5hq?VCiaPsu5DHSF0JN|EA#Oz$TtGRZ*MPc%6t ze=SXdQ7DUuK`|}j=Vj!9Rs&X%X~k4~1kHoe%e`WMm{aZh9LQ*gbtw&xx^(^RR?tIL z1gXrVijkX0hhPtN3h5f!LKm!mHT5$}1&_YV(=eGGI1kOiGkD-wFqpEYtwcbqN1n7e zLeCO16Iuc!zq&{l^8u}ynjeX00jGuE-j^8wj&F7-+i*^&^x| zC<5qU4iLUd02BwLxrJ0M5XP6%Wa>v@MyRR{(Cq@!T*DJ@nni(3XSsYXmC-k}NyOp% zw6r>jr#6*h9g*SvGFA|N8BPm+T_>FIfUu1lARRm^9YmA;^U~69^y2eYu>v?<6yT|a zkZvKNhSorH2-OmrPUtA1aRqJ%-Z~H*MMC+hnjNP>`HBWTYzL{Lpt5P32!<0B+fez% z;&LCHXZ5XcDi)~X`Uh*nK!j-6`RWTpgdVgTu;D4XmFtDhV@R%3qi$u2mCqx6o5+N} zl!4;V1|(rO9a>E(S?NqF#?up*v?TergK|jd4WOv@(a2&#gM-$~a*P=}&QBQ~t(m2OY zB5=sW@Wkf3ohFBOs%K4YswI-C3R9aFLGbocIYRsi*8z)p4N{||XcmnNn= zI@I7#3+JJFF#RM}i?Ybc%qqUpp}lREwjX-25pJ`z)dZgd!~jK=Q7B(3(g;2YsKpSP zO(=-aBp`=oB$!S@+5C&)TsFTwRJ%emZVXgt+G@fPIxZs|0&J`6scoY`D_v1S*b7)h z-_a)q65Lusy{0oH_`@-TNBXX+yoUtyT2cS6fe3${15ZsO^C}rWf+tEM2B8Z~DXyPT z7lO?!uuTl1Ruu{K)GQQ%OH-dwi!W%eViA#dy<+(>_=_WT9(j%=G}q&^S-#wUB=AcY zWN7d!xTerb!MywQL! z<3tU9%p|S6g@dd_1~MWAjm2CN;5R!5Lu9IUFM~x);G?$V^JXWO3v|L&NtX(j)GE1+ z@b_XmA|6|(eFmz@E)E_Ka6?|f^RQYoczy!#c5{a z?Zdc9Q0!*c#J3p!uEZH$@-_<$7H<#52j^=py)#rP0oRB(KxPI=;m6));jsMuZ5A4T zhE!cnJ=bWZSK)DX__A79$qN7Up1<qM#`!*lwT2#5_%`0YQ|6eA zOO^xg09ErbJMj^H4xhghzdq05TXwQX%wz!{X0QlQG-wbg5tIhX0L|vtcCyq~dcp+| ztORWW?Q)IW#eQHc$JP5?Hjm*qW3Rr4pW)=Wj=YB&VI{7*-Rze}Y&ZYX#hzrx+GCBvT{ryE+_TdyUM(&mCsZz}>_nteoNpA7wk3UlmqvcfdIG zZA^)+wKCUN$5Pl}X}^Yv>Pbo_8Sr1Q#}%UwtjJ zXUjDeR+{SkwU8iJ)n&G|5vy@MR*zp8vlw1|jlB)_)O9wB4dS0%XE|PR!6(g$ zwPE>u+zmFNy_7{}8?-TK^DLp=qhT6|kNA9cxjw(a#vAeDmTnFBA!nZJC(izp-c2kk3S-#;_poUq#3#y}M`7SM=<(pwD;6{^L7;b_7y6-sX&tf=TNHiNO zE|^LnteE9{Bsd445v+qP{5_L8q22EP$y+TqH&P2Dwn}dk|LN`A@6uB>G;EfyHJAW- zEO&j`NJa5$T)mpAqfr*uQXlmfgCSB$a%q0*6ttqNs-+s;n9XqAYp?ci;V^{6D}Qu} zS6Fzw(m5htSoL%edfbG&jfEM74pJR9L*2&W@#?;fwz1jj37 zo#K_Fq4CO3-Qty0gu5Z!7hx;HdxPSY7m>zxGv*|u(I4Ta2)9AFe|WsBw5R%q5uNJo zKI$>*?en75jSN4&F!fVsqEkNJPhG2`@7{?~ZA|rgnr9AB2cpxiAE4fYIbSzO9fl$I z^&qtrMJpbxW;8;q+5~lo+9>WG?m^;sYO)&SomG}Xp%e;P{PuVG$6#uw?c#4Is}uiQ zdXl6ac+@a;K~q15A8EggEwZ+szduav6tD{(EXBb-7?18RSFLEkMW}Yt^~*4|IYta~ z-A++EFt(q!9l&4&-ZiS;W>?x6b+vcXKy#vUVN(4Clb@OYXj8kl7zDw?Ss_3RG4l@N)hjH; z)pUYtZi2s;5;;?yY{W2F_n6wqz&5#Fn4?yytjslKp8B*gU}aa#8u>rbO%MHc3QoA~U!NKpjD*o8c5Z-8!8jcavdyzVZse!8NnLPCi zL&Od^EUfj7x>aY4x)oLKdvN*TDu}YZ4mTKW0}roCTJ8Jn)A-I7le5FMBws!46`Z;> zUfG==ubcq2TN1BifF^>RpkmjYj-F_^HpqRca*~e8qF>gCPw73JP#fs|(-p(~0{FOhlPUWhx zgnznD{g>)f!h4sf&k!#y!JjN_aNRCZm!fb6zUX=NWj4_j;8f!qsWAp_+pLa6<-WC9 zT}74q$SdjrFSgZn^-Z<76)Sf={V~+6mVdHW{Z>_suI>BO7a8Az_y@bs29oIKSRatRH_kM)pg&Vr>O30WtiF|Jh)zB%1X;AgKD7m6^Ky{)lvBA8xGasi^eskYUF8_uQ8)%(B%9Hjz%lHfRnApns$Mx!*R=cHiK{Z3qqW%~fvY5wQQwNVF z7fAIwmA?Q+z@LInqi@_sPOgDp1a~7&&oZf>Sc~v|giVyxb>GRqP?pMN0uzJ2D&UpZ z)cFC`GVK2a{07uY93EQFM_pHQ+HaM?oVr9>MJa$h!A|Ds+;vQS)!hGv+N*^kOB~+Q z6WvtL({HHJtiZJrTGql-F#!eAT}#tSUU^e}sddPDy}lwP*Xt{MJyN3g~P(lb@p;5(|h z@l;Pxo7B*1#P>;Re@SgJGs`lll{KfCMNf`GuB--T_mQBt~mQ z5dj1B%;=&V-l>&gfFtE3wT9pK*r$ITHp}-|B@8n{$w8a5|e_wWlzY1tun)FmAV)ku0*aFK?H++)sp!=ve zIFBgWx>Gv$mw;TOJKSnz7|v4oP=CX}z~1yX#0HdCNV6ZX7|?=x4P|Lo&2RV{l6%$4 zQro^pp9}V2H*kfaT>lTIn`#jqyl==!K0CnB6ASUi07FML@+AMWy&;a@3NZ9g{Z8^O ztqnU{`XQqz#wi?M?wml*(L-um8+!kiNh(!(@u_??A(&-Z@ASMh2sAw1c$`eXrKyB3YHR2O+h5xng84^n4N*Ft z$ENb}?F_xh+jH#opt>=5|95LZYlu3JQF8NYTg1@PO#xS6??eRA%=HYyWKM9;lX~N z$=VJr*Ta3QPx4~3A*gYQE-%~4V>%nA4VbD2YtS$OITF(b%=RsMfxg*-3~3^al|{O; z{Q>+={YgF|6jf5+*$|_Ke8#(XF@!hqq#fY*8K2n2(7tC1B3JAc=w@}Jkypsc8BISe zo5ca|#Z;-(p^aNMi~Njl>tZ<8Y4=w$+X3Y|4-Pr27o%Da_pRm6nGL~>%fFH0vfX^Q z8Kub4tz;<*B>vA*ltA{N6!p@RUJB(bm7)VC{p?UfvKo2TQw~oiLe9!^M2ti9ioKT~ zmV+|&pd1$9z1|PY5yyLk8TPe}{9fj-ub<8X;&hI4wL8o(q}fy%v|;BK-ZO`f=xPXI z1$<6dLzm|D-%-SGv0<3kSNWd5+|}?HHq&0=hU@;jf0TtN-`kv0+d_?B#+!9B^zhya z4f^g59@otfjurp0Zid%=u+R4CXQ(rPH^ds;#^~KRW?03=K>e!29;KB_!Knv=&RUri zls^!(&~~_b3^DXIVI`WDXbA4U9IFM6ivug{zgWaqOkVQZN%qDzd^F)cYZ2wTa4O%C zXozi>sM}k_LWl=e*xuL!GrPYQamn>pq9NLVzbg=#VhHTGG6iQ<^P1(U3G)8VoA@Tk zj)Fu=06|zmnC1&6hP!7MAY6vkv#_c;7Wp_^>Umr{@^@komjw4BL$A*+f@{-7vB#JLP)a zVQ`yzeua0{-3suV8_)-!+o0ad@Fh0r70@b>_cIB~J#buH6&dC;{P~`t&l)FYKahBkGa zY-Cct1N{!V3u=z9@jHO}f#N~qKslg%&}z^tpbtRhpo^fJAjR9H_<@2zy+FyJ$)Ne5 z0?=yEcF+f)qoA{(-$9KUn;eRNW0MjAN(Na$(?Rn=Ye73e<)Cjs^`ItAkO-(dXb>m^ zG#xY-ln+_~dI7Wxv=>wbIt!`?DNRjEYfyL4qo9ePoTd&$0(c(uB4`I_59lE1Q_#;K z#Rm~VW>7RJ88i+w2lNbR1Lz&lUeHOpQh|)xT!AJG^h^f|+TLO`kt){^G=$IWyEFbUJV&vD$sGVZ=#YkDpM)* z@NFKxNpjrHgO5s!SC-3gf>HoJJ|#uTmpoOmgD0e{7nB*9$oR=U$sggWRDU&>1*#Vw3DplD8o|=)atOg%7 zdaRP?;WH#3rKEvdGUAmO@TBx~C0z1&B~bD-#VGk`rM?g8G4Dy9s2nBkNKaOFOF@#d zMes+e6@!!2OpJ| zsN{jCj2NcOq44-LMf329;1u8D;fdguv8l=+@O0}4CE}69N0sqIla&w%Mxbi_z$t9> zgzF;{m5hwhGRKsmT7-#LgHuMUTw`L4>yEaM#Pu<@CJ+DBrm4!Ng{tCHqOR{0!2RwS z{Y^W!4^dNub62KlsBRI@d)zYy8-};?fUM|v{y62euSbwQ zKnJQ};Kp}M?Y#OX$1AbPx{NK|c-hp^x5w~!h2DKqZu$?8=U0&tL$6u!ybiAMw;{(c zQ%5$QKS}HgUr+2${ywp5{1h>~dn2}%w@|@C_!!mHzEQ(-@rqCJ#$QeCOpg}FEAjkE zQbzLiP?`$X#Vee@PjKk^cqNmcB4rxCM(k7G!eHuXX!@d_1K)d?T_5~A{YpF^?MD9g zY}d7h#d|%Va-R;=9s4O&uf{)Pvi@0?w5^vHX6r7a6Zi->YOCYe1ijk2XFzh_80=f0 z`S)brH8Vk00rq>Z8BHBq{QKDiCBpRgqHu=GV~<@$eK!d)vGnFci8 z?q@PNHdp;UhNu?>VL1#0`GfpGJ|J(95p=hGqH+^-1yl<<13C#R2ki%yf%brQgLZ*- zfVP3Qg0_G*fi{3jKr2D{?Gr~Sc7Qn`iZBB-5tIQ+0mXr$LE#`XC+Z;hgwX_~m$I3W&Jb!ykkvAx!kFhm*}id%mQ#X_zCt3yKZD zcRM2$@M>^;(x}9M`+@s_w*WuiDN(^+k;gm4M5Pt@YH%Ellnn5;;1S^Xm8WtuBvEM( zz8^dYd;@p~a65QMa6j-6@S2W^N+(6>qttdtR60Wt2c8EW0lpYK2>dBj|^MDRqypdgS>Xku?g0jM|QIuJxgBLHhR65G;06q9e zaX#g5b~epxX~wG`YONq})VAUu%fq^utTrEnsdbFt)OtJiB*<328>6@CP4L!`Ujc6e zz8iXKB!O@j@Jrxk@LKRt@EY(i@RR(jE~eta=kLWUMIvM=}pqJByEzxyTGKCnN| zUpAYbbl4juC{KYLpd!$7pc2pvpe>-+K?gwF-%MuE~nPk`ow zo(F9Q9R!^QT?gF;weZH(C8!^0IB2>z{`|y3fEPe7fj$K71$_hh9n`3Cg3=B&05k+- z15E}k1w9XX2Xqkh9q32UJ&@W2RS4<_8U>mTdIt0?=rz!G&~eZ=pzBSzPnc;`voReK Sl%A-wKA`ok*G^z*1o_=B2Hw4`cgX%~-an#%NNaUE|bbR_1z#4NxyEcKyJj)SHi0G*_3l zWt9~#1-0^Jajs3FBUH~)*R{|KETrO8*pH0uuc++Y$-r!`ue+{cEnPVg4}=YHGNq)- zo@A!rTQBzb!na#3=;<^^m!>{c!rg-{@*{&{@C)f_xDoZe1>DpomO_}dv zirp&iyvP*mlGH*`wUQ}CHU1@4dHpXyCdj=bpQp8Yaqwx1yHX}>!8Xb8rv%4ITuQuaJb=Fb>&Wkfe5n~`c!Rk&3<^k%Xm4pSEG;?GiDm?=JmVD=rG7$7{J zqMCr=gKsa~D8BWowHk`UU5@U9ShefZ?z7nouE-wUS-NX%k2Lk-f(qUvp0Rgb$9q1( z)>I_K>|)GOai>=jV?!zudv8+Jh83=h_jXcG=2iIioygczt{JfwcF0u{+n2rMs*K%l z{$d4FoQ)+OyFIT(rr2AtEY4|QRTaVUZJ1iOv?6ApQDqqw_YQXWvm+HB44=jjJ77dK zOK}Yx5yRTMW{nt%h7B0e#qag+Jn$mQT}Ma6v1eWC$gXWFrZVNT>dfrfD#{177+%qT zWIGnE%vg5fMM~ zF}>RNOxQ}zWy)cS=nt87_n(TQEKe=8Sw+J<*wh5prz5Ckz|JbRy9SO9?RayJ9ywcl z`~>1%M9`{7dCQeEI*5(0cz*O3j6GLj8(Z$Do)}x5O^;NJw@+tmz3anCV*=`s zm@_@V>KPYppUp(7D`0Xon^G}w@(+ydtO%XD-pF36sJy?pSxCS{rrfISSaqv*Notcb z&9A5`VD>z#_#?X_>(SM|e#t{+FJ9;R^{IPU%Zl*1!&t=SRHh7W$Q>kp1VE<&zDIm5 zaRP8xn|Q$WT98<`SR01hIOc zOr}2G_1e6X{;y|H)dbgf%NEC6j`?BiY1hX28HTI9nX6Nk#TAer$F{gq^Ap)P*9-a1 z;IiK2DX*6&&rft721j{*&e}}zx~s?2Pp}ph>z+on9CiKqOmFs~tH-mO*n6%op6wRu zxt|iju*+>ZTbZqheK)CR)Q4t@h8eCl1^2R#Tqy-nY=!I5f^KY|%T*A^Hn?>;YEXgX)YlTc~%EZ8f5aGhXUC`=Ql#V2k%N6+ z(W>}y#>}n-C2QFdSNrE1*czAL3uoDmil1J{FtW#8eV2`9;T46;URRsvM#^4cE;hRg zofemMA4fLMW>2~OP^LTX`FvC zl0~_EU6HJhs~4VwT$y;LxSq!Iao4MOu5s;m^<^clMqr1l)9OfcvXs?***w>L;7zWL zz+tZAz%RIN;`xCq^rcAk+xf2Km*%R!&UaP5G@#A$HmEMts(9i>kLO&dMJ#f$m(R0F zt{-2vwjI$LHLhkmYekP$a?%t7TxqSsC``Xd6fEnfa_Hr<#P*zReb0=%zOJ* z22ca^cCj@pk@Hn+BGA!4TGPmSRJ^ygfU#k&p6ffa4A-djG3r+>Tu-kb$DVT?UjGLg zdH;r7^~-$M;Ef$pZ#9!k#amb^Xecy_cKtA57X;Yt3j=#D2+-!B`Jgb|5-p*y+if&( zR0-?vmy@|oM7Y*%?9{I&jwyvh2EZmaINO#fwqwqc(KE#-P|@_&4B~fz?RKr$O&zhU z;>yNYmBmzaDLWp_CRbdq+-+n9t`Bx?qA`=b`!MP!0^PB%Yt)`M)vq6SUEkB4?R14! zJ&Jbtbx(WOt5t1Tq^qLpKIU{?uS&&g9ly69y3gZ#pGP@=-TY3)q;6#sn<<)) zP1Hbb$B6ZFHi$kIjn!tA`sjgs)IY5i@dwOm$nOu+*rWO4W^NaB!R5o5HO(eYj;WY& zs5xV8T#tS>kfm3=`Ps9Ky;#xZaC^ocb`3nzz%na(9G%H9=dC=pw{z2P3hf%~dDqMz z`&dQ71sTKwBZK$4p75{X{%VaIHBpQvL0!>%xgA)HA1D zStmELr4_%OeAA#_I8m|gbexH%%x^QP;m)pPpSvo~z7rgNSW(VgEvoTDzn^Wip_?a+ zLfXw-x#wPHM=M%s?b^#NDDq!sqx#J|t_hw`)YJFAWM-BQ&Ct_cQ(C7gu{BGI zEq>vOlBuoUi`gjaqtR?EHUr1`D~ydA=sJ!h^5dz@bE5FHiB*uGUn~W~o=H^prmD~N z74HMon<_Kl1Xhpot}5%(wg*Kw%jgC@dbIl?m01}($Uio)@hsQf%*ftiEZSXeVjnTq zp3m}Sli3dUK410~W6k-RW-Nxi!S^>~Q&}pHXwIgzxP4Gj(8U66!oZg{XFdH7LZF?h zPF8H<2;bYB4fZc2Nv)KWaK9ET$>ID6lHC1dGXToiD_Bbg_PU&#rsTEMa-_U7&SNS zU&2|w`b`_&(t@t>Y!}wn|7tm9F<^FYo2cOHy0ApGsf3^F!a{?Gt&y6NsyE6XNmcS% z+q8r)(WA3@>#nR5Yt8#~WxiipdmvmU%6`wG;!non|h7n+WHRb!DHh{=8cR z>*9!epENenR3s;ve_}{ErZAi60$8*l0A{%sPhNmH;WcfqQ7zj9gC265Xnap*(RpCn z)M{HcrMA0jNh&P9fC9l_@iL+kaNgrgP|gwe#rouiwkI}gMjohCkePQi98Yxy=yewD{l>6bu#h(|=SUcF)v4-@_!q`N$|*eXI1 z-c4O?c}a0+sH~y`Bv1hb@CA|V(cqbj6s2cspckqrvvE92L?ao8a)WV*JCg-+Xo?dXO%2lcB?& zA}C9_sjy z@rG{fp1#xm(Uf~NJ+YI*w164ekT9(p{jA!iyOO=E7q><;iz-_4dC|;{QXY?HvoP2O zbZ5PNCtadUPvDPrXCYBHH&dW$fwx=z-RZAFZnqa5j6`$lj7hHErg=t|@#5S3 z?H(-r!9Ok{rRAyHygj)cTv5~J&LLS2c3#+V-<4sHjf6GP8*Xd5@k9XCj{76SLT4zMv<2z<-|)_TByb15y>?=Jh>UH=~ftQu6|ZODVj7&>TW@3H2fLh_rbS z&!U-Ggy#d>#FPBq-mH`Fcp1pxw%)8;;4jD}ro-VP%A_cR8w*a`(B)V4 zW^>s_Zt8>a{kS`>56fffmu2p)_phcaagXGIB1-aL(Mj@9(N6Mk(MocQ@Zmf9vA*h;XZf{$Y&cuW2lQvB*pu9U z0J`rGo;ZLd_4;F-9I>AHeZ+tUkH^_ammm7bnHS_;>VAR^#>98)c=-TU+I(4&t)$#0EHii!y$U<7ittB6*gixD^<_`^I zJzCwyYJ6Ap>l(fhve^An=5+X%cyf(PP>ob=;)%!ZF0A@$`Rd)6s8JXHb0CWjo1`!8 zG@lg>J%q+ka!tZSb6&7m$A=AKlcGo7k|jq~tHXz5ioNaeXh-BU@fnv>F9g|E+8_>M z$5=Wq9nAW&F7E2V>`MbngiX9gtUOO=xT{L-e9+j8z2k6 zH<{g|o|(t*Pi7WY!JkjYnmG7T(g)PH&yvU35TuBEFdS&RN=0}{mE)&O(HsTM5=LH^ z%*J6p>6^k{Wchr53LDpM)^fV?w29x2-T7zD7{_B$*&xi%52v#J>i5g|tEtSz-gL*N zVNcAG_>AG~k-&B!suIatk|mn)6on59a1 zWjb5Sdh+ojScLlZR6c(M)6~YP?(-v9kO4jFRtC#z(-9Le1`+KEVvpi>Ry^aLHky5? zHY?wU{+oA0Y~~?WWUquzu(DG1#wGX9R zyeE$RbU~Kt_xI8`iAPMs?j()lzHuBI=3YCE^-|eu{NN1Mi_PV~&tUyq&O4#d9N>2z zjWL_Y-_K&rO()U8>YHmdb&y><$)CBOEo1As?*l9$xL*!+zRYaVlmg&9R&>c^*lQJ? z`1A+Za#qT(Jb*6Tom(DcagI3jd)#DxdX(1WH@=|fn|oz#c7Vn^X3T&XGkzpdex$Yd z_TyAN(eMVoMEA~Xfz2<^n9ZUb-wctnWT;b!F8~J%yWRZ!Ygjp*b1cDGVh3c_tZXszpiHl% z%3Ojyx-z?WmMDYDZa8Qae4=*`@R(EdytX`*Sy7ouTV-koN-lNBv>>h@pjodz1luq2 z=ow%Wx9D)if1S+&y9|d68ya_hER59!mZSfB#W-3*+hS zIjoTlxY6 zJS|Gw31k&5z1GL2wFkQqZ95dp(-Ko?tb72_6%c~FmhP8=IQ;Z4Q%4;D&Fcz9KRxXk0)8@W(KeLMLzyX zR;+r)@LGt~@5b;yo@A4HgtS0!kG+y59^dEjV2lR;h8|e)zQjhtAN?V*xXu?m#ezH5 zT}O%9RMrw}QF)x0(V1ewE0Zc-{uJxLw(-MHv5q6wKqKBlT%5^E2~Rob@u1&V79x;m zs>}t;%(iMXNw*ModnN*9ixz;pGXSw318PHf@3}0hT^}hq*68tI=xu-kRilOTN9VGR zK69HX%C2C(Y%ZI^mhek+*(B!2Q*v2qYnkx={W9Ua_FBWQd|fUJQ|o@^pX9PmiHClr z^4-FH&77T>GPG?JeiLDvwwmBNKy4YJ@$exBQG!*=CxL@hr93zfXVV#cKpqQc1$<&2 z>*nZ=outQ7^3H-pMN5I{r7J#Y<@8^Gek5ce*%?Aj4M1NIIznhap-qH#5Gp0~0U?dh z+l11A#0PXkFV^m+QkhqLN^-opQp7Qm&*pdXSg2zKN&P9FolxU7ps|GN2&ED_L})Of zazghK+CZoqp+Z7ogk}w*F2%LA-d^I-1{_$D(>s1KC8MYS}`$ZN%kIs2#*r#IWlz+TM+E{3;(gpQU1U zEuGJTAKDI^+_0jdVnmvvIu8_>Di^rU@}cTxa(GnYhJY$& zs5XaG@94qYKyS_$7@Y^|17+pbxBRctq*H{CuT%Mvzd$X9!f#Rd(ki?J)~vWb5!OoS z-(0eYM2=vxDS{2{2M7=JCive~b@?)slcaOe_fzt5x05|X!r4l8wx;ZZ&3A5E^tEeL zErHUt2-od3#iu(z=w`9IfT!qConC;F%1lve) z3)cD>A6KBiP*iOKxq1>dG^wRiAPV`Q{)0P3*}*HRyZ_zC`;bW@pZ6?_bo_@RfE3Nh zQGq2CD^PBTIF5P3Dr&Y-I-(xxUvRKMI=j>5-PX&$LitSP_2xt(&g+#SFZ&WoKKPJCu?!kAuL|g3~dhSN_FS5 zFSOR9;Xayugz;$-b=xWT``$!!;VVn>*H$XYOqmskhoUGV7cMj_iOe#g2rZrhDgxpp z<`1hlAY%oS^s;R40JM`B!%r8mu8!xis?26u9nI^V5yz8av0$#MK>H1(hF`YfCOW~l zu~(8awQx*W;!n63*oztl?~;Oc`@^kG1VD(j={xD(f45Nz|3d4d=2}0Ih~$2_EG>4z zVs{hP1KbEhorzu07K*FM<@Qw>-y$Zzft^tG^vP4Fp;J|B@wojE$59*9EBv)Xh%VaW zQoO#k_<-t2vtk<|4u7og9P1A*AEEH03s|;ei>$#v|bc0b&-~ z%`Oh$iR+xS44VU+a-@w9J>n<}MF*m6S{(T;mbnO&Re+)04{v?L;Tx5ukoqC0fs3C^ zRI+doI9owEzw-;)`SJ~@(`4*mt&Rc%5kQ*-+Qk=07flvmUX}xqR(m7ap@@#Ut1>b* z1IOO9iM^C3yLb-vNIcOd-jw;aqCHRpt;9k~&!#O#9Mo`*Ono*zwE}W;=yf@U(nKPn z4Q?pdqiH1m0Ajmnp*yi^agaI0MiR!}6#ewHaQ~Nz#8KQ>N)oRNy+!=%Ln>kziil|} zP59`ZPw1W}k`t|o_G6>H{(gcN5_3-qLzv$lJRsn8<$U?kSX4m z-ru2Twsw~M_`nZR$`q@mYK5+9`vSNE3^Z63VuG+NDa|`O=q6bk?S~YT_!Ny9hHxi*Y#1#Ms1_ zbm!YhX?t=F2YhiMcr#hqT{j^ORdUfP?#OBJRo_l)kaBUs8@;VIfuc{-qsNg=#-2*ppt-8=8YR($zY_(rdOJ?(7=;@6 z2NdS-eSv8cl|7iewT3s^7c`){gprC_k9`dS^*93#{KxLnMhv)eGWwnnWnO#*gpsFh zCh;Kz?9->kR!y!RHx5&IE&AVVG^3bSK3VUH$f@{JR<1qQcXt7uUB_#*PY}EQmgbXm zh`y4)txNNw_2p@eHy9#HfV@l6tNcnaYwtKq64CWNdJaV)tfGDcT`;oBm4p2{^qM9M12qO?{P7Cc6NrND@+q9j8n-R8) z2WW_*cio@-Z=?h1h$J9nVWE#n>i#t4l(VEqP;O&XpRJue?sP&Sz0s&w&{Mt z371iXnU+AsF507sN~+}hjUCi&%qu=(n2}0xxY|W0EV;^eh7qc`;RxbxkTbSD&!UAM zMR2({7^E2~NDC>ZW=Eb+mlR82z28AR;SU$Hlx}yVD|X1eS<`KVLlD-qlR(1}PxcPy z!93Nu->RJ@{U7U~-%02ip;AIW5z+{KODKcT2_TFme4|A>ahpvzK6-~*O#1;AH1CLV zvW+3zw+Qv2yq>}mh}U@~RnGlL^Pp7=ApP^CZ)gH4AasP#Q$Wa__#88W-ZbSTo(wUn zWdq@{z;pr)RHy_FDnc>I;~^JQX|dJjP&gW4Ern1gLg9o02~|<$Cdn*e!MIxuO@Bdp zV=eS`gnj|a6c_MBcCZHu5RJaU@w<+m|Ft=DmKKx{hK+0(y`PC3EsCK3) z$-W(ju(p$8_aL-}P&lDEgxV2GAms2T7)nqj)bs~XBPD&7&{aZJgf0-;Oz0azrG#W< z77#i>vWbLt5*kA2Lm<49%M|Yb*wcgs*&WvC3&DU{b zBk&v@pCvp)$5n(U=y(I+bR8EH9-`v{!hLisdx8Zx3%B~ni~SNlfxw$XT#Guyd$Q(l z$fp@qU=_Pw_I7|gy78W=%_LVpLx}8I34a4@7dfbHOr>qb9Ez(AAx#x&>RX5j)Dq%D zX*XJ`V@UlP1X>^=4n&hCJ{_D(qnkj0w)`aE3yL`9g zSDY-^@!4DCKUij(3Tzd>yyVTax!4ykGU@oF^)X>tF(V~pJeaV7G88LMmx9aen^$zg zMM;);1Fo{gi;#&sfO3f7?q5YZ$R>@2g%}IseT4Cz&>`wO$jjk8(;oRA4tMdCBYEIz zFe0UO$d0y?P^rvVu=opZvDfaZt#jgLgl0;u5_+wSjDAIdt)lHYN-Yo_{hTy5uW-wb z-h_}{2x(JGPluLEvHDBb{@J32gjzbuy6Q5qLt1Z@iU3kHgF>vA;R^yO+kJKaH|+Ajc1bayD&yQrHLrMVL9vWu#zy3 zJkS{-S$v6|ldQ+w7Fsmv?9kcu)8!a~v7Y+rbb_^tba=%9_6+T{{yD&Qhf%gTiAvVw zi8Taa?Cs@wPJRX>KOxoVd@PDKVFJdBsc&H{&#zZpWb8e^)*)a|6;H#}U}0YN!);jM z=&Fc=P@tm-71`TCMtJEON-ti~9;0AgQniE5KMRN2gbjJj6doLJvD(`6LiCf;H9efy z{2;Gh!P+{SQ4$RW)!8D1$^3fd!Uudv3g_MLerGNl)zvrQS#8*B|-- zs6UbF3aKt5b?bkrL&Q3%UMwky+v!C{Vz3GCBrK1q>E5 zWuD9{9zp-cb|Y9khMFf;py=sU4c1kGVmJh%0{To0&KuYQ$>Im<#lN73chg&#T+{CD z{M1So;J8j3C2^Ua*;+UyJpxH*ifxd{4LHt`@|?L|kDk}jCU(m>m3o{ehB!g8Oo8&A z%v`)oj*2zX>P6k^2w7cQMLu!Sw?L}q!gQVe4{&Anq=v*3&`R_SY(PI zNc4P}^?Vs2KrwTXuWm9<7d_5IinCDnO7|h+2AW_XfO*+L>;+=!k|bC-ZtK!u^D+); zmKco~XaozzPSmj<;eNnbqBov6$D=n!0?`Cnv(n?CW5m=1yq*lGw#`<>jI+|k9GcNa zzJUX_m<9>D*D9n%%Ol>8V|k>jklDDAaY8EcaVy|G+6N};RX^!}0Rgt;H0G*b_a5|f>&PeZoy;elQy&Xe6i1H@dqgUTOq|HyD({{k!vuRJ7w(V9e)CVR06BUxFHBsTO z0cL9#2wnix4iWkW2>Z&(^)0it%_R72C8h(reY*V7l(WF%mn~MHYV2YvPDaS8rq$6= zY%D@}>;1JXqg|egvvXraIi^jkR_F&uiztnFLh}h(2t6iK3%(SFRYVlSmI_4YMyuvW z`q89!)c9YzjWLvI+f9dHoCZJmN>9dIj2H8Yo|s6JNnQ3uwDyR$<17$v<4RyFdt~mj zHUt-x{!>rm@WR<9-avA?K|7l`fQb>e>Ez_(3X=QRYYvT$#fY0kac!cbjP}^wXy)Sk zkU4D`#d#HRY~nfTWCjUVNGAdHmP}+@rT8LFM#NdtTx_CfR}zpk#=}f z{OlA8%71rZCYUCj`jK&ON(K4ZjAGtx^8&m_w~1poipsSnH%;42m#jvZV!U|kf-2rB z-jPOhm~Ek5pg!^aawLv>M(RSE%=S@8sO&b)8*`|GqS{0|nT#eq1jEBnJ(*Wvk7T5` z7j;}to}UNC>v8G0m;`y!aX_Vp06yXNyGSeH3<&M@ZAF2!%OJbay4|$N__ClHH~6oj z6Ux`t*j0Rq)bSlE^%4<>@>#_X%P6}jQJy-jI#Vlb1rPr4fGlZ*72w!!GsW8&I$|kB z*Mdnd5KlYa66iZZWrR)<$|v+WkWI4^+_Q|*A42dW(#zKf-{QzyR1}$7)D3^& zUch25rUt8c81p+8Ka#d5=~O8lC#9Q6${^iU3X~;oIw{xTvG~maYS4RnHm?XnSIicR zArgcV42ELT)RHDkoFFz_WT3MQZZt3Z z(Q${Cw?`4&kqfg-@c|jwwWF(WBD3LBG~5PQ#Yp65&rImE#VY7Cg%eNOXia@lH|r_0 z9Rag!@dR{QIHmazp~_}JlL={r#t}*(AP`E2u)&5BD z3flvUPZmQXkE(Qv$4LqkP6?g-G=YPQSS>U1jePzNd%XHsLS}MaswA^RGyxxhP>v!8 z0#$mToD|!EWg6BUbXv_6#zC0EozmYRBn?mhaav_k6LSKw=F4N!q%)N0V{nrxno(Xi zklU#UXNhb)v&A?(F}_5@3mCnQs)XrNCr_)E$1YKe!#GwO>2sjW{Y5=ZOaaGn>N-Uq z(fEmYG?)AhYQb=u7HIza7-S!a@-<-wz{~=O#v*?}e z^lF-q#%aZL&zK}LA)|_qkXNgC@b66EZ53vGEj|EcazctaY(o0N0lZsJAs0~FOv2ef zHZc=V+-rr>(k*VGXtZO7de0g>%#IcBqfxTt%Pe`V)qvFD^$0a)EHD<%8md?=hg=3r zmu)DC85H&d$`mS|_)rb?iO=}()U2et43sH;#uL{rE08cMT{Er4%dD&{ktG{z{uh}4 z@KX&La~H*w8LyDxck#sFk~cbuh(0idZgeJkJf5jq3MH^inmtd^WM&G0GQ~VRvqg^7 z%_dzO+0Kxc)_6vxAf=Qg9!hc$py1m0)j&ZArppdo{k3rmB7iUqjMKVFxM% zCxuj-pc@wPE}e1pH#4KxqFv>VnQjAQf6p`PZ)V0qK=XEx$TuoVnwSSC*#GaCcB$1J z+%)L#YkGQ(%vwGrI8Y{tw=m)+c3Jq|hTiG?f=@{8^+Fz^ClT?49^6dCwTnlXq1us)jOQCB#T39JFEwl-w zIVm+W9HjDKJn5pc)6Hr;4;DU1QFe)f3tCsqKAoR zD8BsJ{66RrfBLkkldCZnjp7Vnxe;HJea*LQWEO{zS%D2+UJ|??P&-5@TSg41pNf5G zGkF6tZ@m10flai;dn**to|~vul4%S~@ljs3nBX<+?lruihwc2yDRQE5BXzA|~~Oy z$rL4jyP82N{2Un7ZzUKDh_NESzsUCb8Lp*}Dp*&^?=Mnx2RKi~VWWfZFWQ1x#qW;i z;7JUE)++9yX<3V>sNX?MC&DhI&|*k*7@|yZTh4g6q(V;!CGmFY-~djLR?VLTZ;*gG zghqW$Q%L5IjN$V2b8<>u4cq&5GJT5!GQFS7kxAB966oSN$@b8!ZyxLun_y#Ws#Chms@+fW3=M~hGbKSEmxT@D6%4M=`OkttpVv}I|v zBwh-fDT?t#)?<)$^uK7~PrgKe^jJe?Ghv|R6PiRQg^(3!cRUb2G5{3kWrYWmsvp8O z(VI+b+anxFsFYAgsR_c9R)9?uMQoPO*Jbo6?Ne}OzgbA}8}QVkDb~+2T!$xmx0r73www)jSB&Wh z(Xcb?%Y{`B<{DzF5=w67`J(d}((2XNn^|Jpi%8!to`%2l!D7!8B$10tR!Zp^dHP&P zPu%U2Aag=ZpMRFfi)#8xeuMB^aZP2=1q=HYya;fWo32Tcy|#}JeH zehbZ?Orv0G*KPy?b_7JtoF!}q7Ed%v!66ddSxAy;x&=+S<&Lj``J zg52G^iIzqP0>myU=w5~m`9n>LsM|=I1%9(TinW~)%@Z`FELnMD=JWV1^vVs2@J0B9x)KmYm|Ag#M z;c+mv3B~a^Q!j|4Zz@W)D0o{@9G4OxtbEv>q`VOqoT?l&#pC&)H3?`4P#1|3fU+b? z0XjSu#_0eDO&NHepGd}5LQotuO#m7t(L|tc#v~yrEP@{K<%g(8`W5IKekdARXzGWG zQTg_VYWIS-S(3^&@v3)Na9HI#iTFr-`SvY|N-20e@k5Z^00r~k-(k_P?6ieNCT${B z#EGRoi+zg@u)UYmqJymH55K1t|MsTG@)BwBso#3A#h^k^J}3vIfo6av@{%oVL?Br@ zJ(S>1&>_&-E&PWqZ06vEZKSz%2Ki{%D&08`eu~QyrRWdiQ~pJDhMtG;J$njNupr~o z3BdWFGQMalK73E$uW!XK#uNCFt?XV4Ss+U{pl<>h5%dQIfJ^elQ1cS>j-p5a865Q9{M~yJ6yW%O z+}KVlbej&aNEQ|cv4XjhxR_r}9U5~b4KGhn93Os=bwP$6Imjlk9QW>nESa%KxcV8h zvA%BmXYB13$PoVO!Gn~chfcGB$j}{kSuIOvY^M9t8Pt&4aK|0^Eq=6xjK!a0H;}Pj z-^qe;+xP4YeofY=4)M41)phu#VLAV;j^#Grgxuu$9!wP*+)tioPxu92?nt*5Uwtj} zXU{Vg9W>PkYNDgN@e(WZVQbuL8}PGWro4Qey~7l~(o^*G)tJVn^`jLU{8#tOr}??stb78G?g6GWd{3249-3#;|oC zaTPxlh0dtfbqGhEW|^Z8ff{F-=N^xnWnNe{%RIr9z~fA6QFH+G*Ub~5Kb>JQo=dS9 ztIwIN5LVAJ?+fb#-~;Qh0RFv6o!lYkfAUtwC-|sEF*BsMDgX9%=Bo5m3JsfOwuKQO zkA-f7uZrTYaZhWZjzwAA@A<124Tc6!ihE6fIvuU(Zfv8*HDht^UZLuM){ZYbCn@_Q zl9UtOl9cN`lN1}m{Si(=_(6mZc1lv->YAi{7?q@)>XD=jK)5}^5eTOsyg4jMS==Q_ zSsj_AeAGQj2|@Ue@Fc~Aa1_EzLz9%*2+y-5DLgt!@kRJsq;U~x_(mtWf9$3HZbYX# z(^uV3z5UfV^(BVx)UUt#5IW`h{^|-9eYeLz)y~wfpW!8g)WPVqdk3kvVb1pqQHQg5 z?mJYiK+$##RVVl$RzQk6O!ZN2Xm5 zbQwuI@dt;ib6Xr&@Wbkj*eh!V{QPjWOVAv6usXy1F&;f%E_uF@LAA`?K3#2v5u>=f zjZix={JJJ>q#7Qv6Smo&(^@(4H)_UU5jm}Gl7T~dU;|$=QXR=+`Kgg=iF!TVJ$aOh z-@TT*7iOqUM)gpHyI`EU%&$c)BAuJsaL#l*g14Qd_GsM%!QZn&kX9GL$4pW$Ge7s> z$*QF}3wFht(5AE#_<(d@Iki`%`}ZN|mdpR`Ner zst>AXSMuql>T|?@EXAK1taNuP8moPIakCK5C=Nm#kGsqjJAqt1h9+ zz5f+;moJ;)?);YOY|9GWTR(xCmGM75RlilM4DQoA)O8H{CwHk=1A`WKPf-p&e*}wF zz&(VH1C{dJlj`0!Iq`H1I)Ca8?LzUg6g_kJm+E-5+qy5+0Y>%YDgNcx=xjq4nTP~*CM~4^UJkr6(+ZL�wrvHQMn)EU0)7x$~@)dWmh27dl0b@Tmw5@~9( zV=`$I6fbeF6PT(#M>xzX!&88xgA#PRGqcQrpDo&_%nL=VfV!d|hC$gY9LnXU2IO|{ z4<^IDS!O$YOsR(7mJ|6eKdTnZ;pU5KN~-|fOZY7F#C{D4{QisT)7^3)n`Lf`Ns%T- z>_jn@wF#S{Th_u4$R4J-nNWMEtn}@eU+@B%Z{>1rN zXb7N|$DuZy*n3_zQ2PqRI1W_}{Pe?LxkG-9%T1-o(=4-bLa&Ay+JYwzu!)koZk~3LvQ#J&m=gL`0>AaE`czP<3aZ zM@N?Ph1b=bjx%I1r#^*NQ3@bWu#6a=uxxEUqUg5k)qq?Anw}6q2x=BllhO9K* zjfNIOi$sT2mGTpfY9xMsdaF_Gf@MGC4|No4mLQ{1bv^c{YH1ek4My{If2uROC9I-6 z^$yZr#C`G7=W#h=F3Q4_WD_Bq`#7N)yvtu|7~l4n8qJMOs>MV?D_=>%vk>;epg@gH z>{Tk=>A3J;IOkt@24_ubY}<75KK3{BLQ?_|ILbS`NevImzaWF(pj=;}oafN{!s2;B zliHzUA6TL`G1vl6B8G9lrrTQf=kO1j)b@YpFpwK>tKk{Zu+KBeJtE~ehms6CXUYdZ z+mfC|m+23+oikdBYW&XXTgiWvQh;Rkfx`OmoZD(UKdCkDx4Ku{R+H6HYvAMGQ|DrY zY3iICcedqb;QE+@B~RfTNE75aQ|W(M7kaJd`J8Q8_ED(eWi>R|h0FR2IG!%r8{CAQ z_aFY|7jU+wqt+09Of?KsYvQ@tV3^wXH8ok;0;&M*1nmbM1KB~}fRaIjKtF@7ff`l! zD+a?u=H}&x<$wvQI?P+PHS`V&N0JzgF(m{H)brv>`tWgW4TBthN2tC7zQ;cN>!?}g z{Rd$Xi37WvRlSTKyD_+l~~^(*S5$i#6UAPAodaX`x5@X z>^vrWS}=b_Sz4Czh#*7SJ!P`g_OH>a!o1i6Ty3b*|AXn8GDHXOS9h56 zAVV)KwEKe$oz;fJynCo2fk(A7^i+=@=9%pbTiYC${^p**@#N3L$T>PlKzl>)f7kAa z_J*nd4wtt#SSbGK_J*$iL#?+AHYBNNm~p{|o;dI=2sTWk80Ufw_xbff)!?WT%_Bk# z&o&E2h$_#@-wrW!fo+ElhA{qfh#^+TPvGa)OFJ0uA#a~{Fbwsf*8Mb;pNKYeQTg?cw7fM0qD zCr8R*g1aot@STc1nj_q>g>}f0IgbuIuJg!3o%bs}!gp8DqEd9i zq`ofFkft_#MvSWw+pvK%qNh+h5arN7HTnYvq!0O&sT`@0+ppB!b_5z_FT%uv7M zIuBC5mtmZndv`MoYZ)$scI?ced-dVZb~A+Iu46+tLqw}`8R1)O2%hLy^&LOj&F}~| z%LAef*8_8Yl!d7Jv=ybcff_%b5AAN~={Ex!^j(eTbT>p}MPJ+9@VYJ8x0 zgA5*HTnjP1$ z78hcJ!JC0!{X{Qd7P z=`J7wvQ5UNH-Liy5_p%9hHwL9eA8CeO@d=vS??&af}ho38$g>t+d$hvJ3%#|uMsI? z8}g+m-vCh~$Zu4#66y{cWjKyM+vUDG#t^BpaChK1!wV|)noPr94E|{o3~#hRQ>!x! zoBi1o_trUvz6PA8zk9;4$*B6Ix{GrSqg$}o+$S9dkEz$2j%4Kz(AdIcPEh^0StXz4wq0}wT@kMxOFVglwZ$ZF zIk+LO4}vjTA>XkW(`>%`;$p+sEpQIsv)Yi@!Zkzf<5=cnQeFYQ2igfb2Ko+k6Qttn z{a{cZ&=61tXd37#P$B4b&~{K2=s4&s=qkv^&!lt$^#vt>GC;FHPl1X-FN59#9q=5a< zs2o%UIt}^-bO#jL0tIW~KqP?iph+MNlnYu2S_*m#R0TQ>x&XQX^6^KlfMP&Npb4Pa zpl3kKK(BzxLHj@_K|g@5gN!XvKu{0RAkYNRj7fMr1$qwjB4{(H5_Al70rcPhvOY~z z)E^R+fs>Pz-*b`_=Mr3ujm22<{_FKhlJd&xWW{Gk;;Jqo?uOS4O(WfwD~9x5&3eC` zsI<5*NonEE>tOtg4UY-Mr7!+X`6NLJ2TtgmDsi9}A3c_&_<3=&BS}gVZePi!^0Or6 zh8LSYOXA0S8}H}AVaEP$TbS{=V8^n4DN5>?EG6H|XL|WW$rBYT_?Qgb`^hkdDfp!H zbY+O-Ba}Gs+$;C@h8yF^ZiI3HJUM-WatfUMRDn}^+a*tQD4Qh6P}WGEtQ1S0 zq~uFJ0zdem2qTp#l21}nB+pc$C7+;#NTdj805V`o*o$7kO* zb}~%-An_%qsS~S|LG`gubl&$<$#LP?{SK_HyLpd0#!l+keUh_&dfmciOH!Jp z=`#FL#qP}1+5FdtB!%8ZQht0#Ch^{Pj3I_Q4<+%QcZ^{$S_LE4gMUD5CqF^#GyW^F zy}Y#wHh|wtY#JX2rZz0$J(#J3>Cn<7fds4BxKRvtT}oN%HQ$*I!BED?P|y@mspqFyd1$;5&4n=I@j_ z@ICVrCf%Q8VMBbs9+Ry6HYS-nJ*cs3~6w_Rl_0ObyYeKTD1nh0k8%>>C zFL)tYxorGra$n6`n@k=5-%|X4cPS3Ta{E6o#qI+>ra{fHWlDG}z+`efa_FD2L|y3u z7Q{NxSx_zL6zDkU2&e|M6SN()8MFbk8nhTx3@QW_fbv1Ppd8Q~kOrCwngN;unh3Ij zQaYxLQHB7-fha-@$N~xl1%UiOO?Y|Q0J;nkptGPupq-#*xbDWqgZvi|l&UP_M}tgr zhZ=p8l$S3hDZN3&Z;1a4_kxTl+sn!3Z+pI=ooTp3bVcg$yAvFr7AmFS_!d!V?1G$u z9|3O-z5yJ6sa?qjZwsCQj-!qe2p$4{IXp$duR4|O;2psWz(c_&fOi6q1ILFI%JI%A zN;vo$@GgqdS1Ie1qI88o0nZ1!j8~dZgP#R|2K)$k6Zj!;nxHCqUVGD?Zo@E`{|^ZN z^QiqiJj9gX7=rge7LXsPF$&cSIt1DVS_3Ku<$$Ju;z1Tr0LTcs5t*V~0M&vHfhs|p zL2E$8pqU^mCpP0%v6Bf&v9pUF~zblI)T!mla8hu=dydC&9@b=*4&{HFAMmPd|6SxJu3_KEi z4R{pzGX7PB$vJe}?Ib1oj@~a#;CG4oDdGR_mt=d_{$;+=VtUe%;*+e51dRn{fhK`w zfM$W_fSv-a0J%W#fZhXr4*CXk6?6yG$v0Vv01X8tfgS+O1FZnP4%!Dg2s#h?8RX-a ztaJeN^~0aBNduS#dK6RwS_;|%+6_7l`UTXyS+ZgVbqC!88UuO&^bBYP=si#c=qTtU z=sL)!IWh+73mOl~20aOy2YMN_1+=d@_m47-Y1ySyvT_?^T1CCx?|wMSw6@v*0s}U$ AeE= VS2005) + tag_attr("UseLibraryDependencyInputs=\"%s\"", S_TRUE); + if (prj_get_numlinkoptions() > 0) { tag_attr_open("AdditionalOptions"); diff --git a/source/ps/GameSetup/Atlas.cpp b/source/ps/GameSetup/Atlas.cpp index 3cf521d9e8..2f2957ef30 100644 --- a/source/ps/GameSetup/Atlas.cpp +++ b/source/ps/GameSetup/Atlas.cpp @@ -36,7 +36,7 @@ static bool ATLAS_IsAvailable() // we need to go with the debug version in debug builds. // note: on Windows, the extension is replaced with .dll by dlopen. #ifndef NDEBUG - const char* so_name = "AtlasUI_d.so"; + const char* so_name = "AtlasUI_dbg.so"; #else const char* so_name = "AtlasUI.so"; #endif diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp index 91db64b834..2131b8e5f2 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp @@ -436,7 +436,7 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent) #ifndef UI_ONLY POST_MESSAGE(SetContext, (canvas->GetContext())); - POST_MESSAGE(CommandString, ("init")); + POST_MESSAGE(Init, ()); canvas->InitSize(); @@ -444,7 +444,7 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent) // a valid map loaded) POST_MESSAGE(GenerateMap, (9)); - POST_MESSAGE(CommandString, ("render_enable")); + POST_MESSAGE(RenderEnable, (true)); #endif // Set up a timer to make sure tool-updates happen frequently (in addition @@ -460,7 +460,7 @@ void ScenarioEditor::OnClose(wxCloseEvent&) SetCurrentTool(_T("")); #ifndef UI_ONLY - POST_MESSAGE(CommandString, ("shutdown")); + POST_MESSAGE(Shutdown, ()); #endif AtlasMessage::qExit().Post(); diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp index 70a099e43a..b5ab1d2cc1 100644 --- a/source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp @@ -7,6 +7,7 @@ #include "Sections/Map/Map.h" #include "Sections/Terrain/Terrain.h" #include "Sections/Object/Object.h" +#include "Sections/Environment/Environment.h" ////////////////////////////////////////////////////////////////////////// @@ -119,6 +120,7 @@ void SectionLayout::Build() ADD_SIDEBAR(MapSidebar, "Map"); ADD_SIDEBAR(TerrainSidebar, "Terrain"); ADD_SIDEBAR(ObjectSidebar, "Object"); + ADD_SIDEBAR(EnvironmentSidebar, "Env."); #undef ADD_SIDEBAR diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.cpp b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.cpp new file mode 100644 index 0000000000..0d3732d568 --- /dev/null +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" + +#include "Environment.h" + +#include "GameInterface/Messages.h" +#include "ScenarioEditor/Tools/Common/Tools.h" + +static AtlasMessage::sEnvironmentSettings g_EnvironmentSettings; + +class VariableSlider : public wxSlider +{ +public: + VariableSlider(wxWindow* parent, float& var, float min, float max) + : wxSlider(parent, -1, 0, 0, 1024), + m_Var(var), m_Min(min), m_Max(max) + { + } + + void OnScroll(wxScrollEvent& evt) + { + m_Var = m_Min + (m_Max - m_Min)*(evt.GetInt() / 1024.f); + POST_COMMAND(SetEnvironmentSettings, (g_EnvironmentSettings)); + } + +private: + float& m_Var; + float m_Min, m_Max; + + DECLARE_EVENT_TABLE(); +}; + +BEGIN_EVENT_TABLE(VariableSlider, wxSlider) + EVT_SCROLL(OnScroll) +END_EVENT_TABLE() + +class VariableSliderBox : public wxStaticBoxSizer +{ +public: + VariableSliderBox(wxWindow* parent, const wxString& label, float& var, float min, float max) + : wxStaticBoxSizer(wxVERTICAL, parent, label) + { + Add(new VariableSlider(parent, var, min, max)); + } +}; + +////////////////////////////////////////////////////////////////////////// + +EnvironmentSidebar::EnvironmentSidebar(wxWindow* sidebarContainer, wxWindow* bottomBarContainer) +: Sidebar(sidebarContainer, bottomBarContainer) +{ + wxStaticText* warning = new wxStaticText(this, -1, _("WARNING: None of these settings are saved with the map, so don't do anything serious with them.")); + warning->Wrap(180); + m_MainSizer->Add(warning, wxSizerFlags().Border()); + m_MainSizer->Add(new VariableSliderBox(this, _("Water height"), g_EnvironmentSettings.waterheight, 0, 1.2f)); + m_MainSizer->Add(new VariableSliderBox(this, _("Water shininess"), g_EnvironmentSettings.watershininess, 0, 500.f)); + m_MainSizer->Add(new VariableSliderBox(this, _("Water waviness"), g_EnvironmentSettings.waterwaviness, 0, 10.f)); + m_MainSizer->Add(new VariableSliderBox(this, _("Sun rotation"), g_EnvironmentSettings.sunrotation, 0, 2*M_PI)); + m_MainSizer->Add(new VariableSliderBox(this, _("Sun elevation"), g_EnvironmentSettings.sunelevation, -M_PI/2, M_PI/2)); +} + +void EnvironmentSidebar::OnFirstDisplay() +{ + AtlasMessage::qGetEnvironmentSettings qry; + qry.Post(); + g_EnvironmentSettings = qry.settings; + + // TODO: set defaults of controls +} diff --git a/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.h b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.h new file mode 100644 index 0000000000..7930828f74 --- /dev/null +++ b/source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Environment/Environment.h @@ -0,0 +1,10 @@ +#include "../Common/Sidebar.h" + +class EnvironmentSidebar : public Sidebar +{ +public: + EnvironmentSidebar(wxWindow* sidebarContainer, wxWindow* bottomBarContainer); + +protected: + virtual void OnFirstDisplay(); +}; diff --git a/source/tools/atlas/GameInterface/CommandProc.h b/source/tools/atlas/GameInterface/CommandProc.h index 7622cd3927..0f254f0496 100644 --- a/source/tools/atlas/GameInterface/CommandProc.h +++ b/source/tools/atlas/GameInterface/CommandProc.h @@ -51,9 +51,9 @@ struct DataCommand : public Command // so commands can optionally override (De|C { void Destruct() {}; void Construct() {}; - // MergeWithSelf should be overridden by commands, and implemented + // MergeIntoPrevious should be overridden by commands, and implemented // to update 'prev' to include the effects of 'this' - void MergeWithSelf(void*) { debug_warn("MergeWithSelf unimplemented in some command"); } + void MergeIntoPrevious(void*) { debug_warn("MergeIntoPrevious unimplemented in some command"); } }; #define BEGIN_COMMAND(t) \ @@ -64,16 +64,12 @@ struct DataCommand : public Command // so commands can optionally override (De|C c##t(d##t* data) : msg(data) { Construct(); } \ ~c##t() { Destruct(); AtlasMessage::ShareableDelete(msg); /* msg was allocated by mDoCommand() */ } \ static Command* Create(const void* data) { return new c##t ((d##t*)data); } \ - virtual void Merge(Command* prev) { MergeWithSelf((c##t*)prev); } \ + virtual void Merge(Command* prev) { MergeIntoPrevious((c##t*)prev); } \ virtual const char* GetType() const { return #t; } #define END_COMMAND(t) \ }; \ - namespace register_command_##t { \ - struct init { init() { \ - bool notAlreadyRegisted = GetCmdHandlers().insert(std::pair("c"#t, &c##t ::Create)).second; \ - debug_assert(notAlreadyRegisted); \ - } } init; \ - }; - + cmdHandler c##t##__create() { \ + return &c##t ::Create; \ + } } diff --git a/source/tools/atlas/GameInterface/GameLoop.cpp b/source/tools/atlas/GameInterface/GameLoop.cpp index a9610cdf6a..fa26d68f8f 100644 --- a/source/tools/atlas/GameInterface/GameLoop.cpp +++ b/source/tools/atlas/GameInterface/GameLoop.cpp @@ -27,6 +27,7 @@ using namespace AtlasMessage; namespace AtlasMessage { extern void AtlasRenderSelection(); + extern void RegisterHandlers(); } void AtlasRender() @@ -85,6 +86,9 @@ bool BeginAtlas(int argc, char* argv[], void* dll) // Pass our message handler to Atlas Atlas_SetMessagePasser(&msgPasser); + // Register all the handlers for message which might be passed back + RegisterHandlers(); + // Create a new thread, and launch the Atlas window inside that thread pthread_t gameThread; pthread_create(&gameThread, NULL, LaunchWindow, NULL); @@ -132,20 +136,6 @@ bool BeginAtlas(int argc, char* argv[], void* dll) std::string name (msg->GetName()); - if (name == "CommandString") - { - // Allow some laziness: For commands that don't need any data other - // than their name, we just use CommandString (and then need to - // construct a reference to the appropriate handler for the - // given string) - name += "_"; - name += *static_cast(msg)->name; - // use 'static_cast' when casting messages, to make it clear - // that something slightly dangerous is happening - we have - // to just assume that GetName is correct, since we can't use - // proper RTTI. - } - msgHandlers::const_iterator it = GetMsgHandlers().find(name); if (it != GetMsgHandlers().end()) { diff --git a/source/tools/atlas/GameInterface/Handlers/ElevationHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/ElevationHandlers.cpp index b965e144bc..cd2d493298 100644 --- a/source/tools/atlas/GameInterface/Handlers/ElevationHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/ElevationHandlers.cpp @@ -137,7 +137,7 @@ BEGIN_COMMAND(AlterElevation) g_EntityManager.invalidateAll(); } - void MergeWithSelf(cAlterElevation* prev) + void MergeIntoPrevious(cAlterElevation* prev) { prev->m_TerrainDelta.OverlayWith(m_TerrainDelta); } @@ -199,7 +199,7 @@ BEGIN_COMMAND(FlattenElevation) g_EntityManager.invalidateAll(); } - void MergeWithSelf(cFlattenElevation* prev) + void MergeIntoPrevious(cFlattenElevation* prev) { prev->m_TerrainDelta.OverlayWith(m_TerrainDelta); } diff --git a/source/tools/atlas/GameInterface/Handlers/EnvironmentHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/EnvironmentHandlers.cpp new file mode 100644 index 0000000000..e22c9f8fb5 --- /dev/null +++ b/source/tools/atlas/GameInterface/Handlers/EnvironmentHandlers.cpp @@ -0,0 +1,73 @@ +#include "precompiled.h" + +#include "MessageHandler.h" + +#include "../CommandProc.h" + +#include "renderer/Renderer.h" +#include "renderer/WaterManager.h" +#include "ps/World.h" +#include "graphics/LightEnv.h" + +namespace AtlasMessage { + +sEnvironmentSettings GetSettings() +{ + sEnvironmentSettings s; + + WaterManager* wm = g_Renderer.GetWaterManager(); + s.waterheight = wm->m_WaterHeight / (65536.f * HEIGHT_SCALE); + s.watershininess = wm->m_Shininess; + s.waterwaviness = wm->m_Waviness; + + s.sunrotation = g_LightEnv.GetRotation(); + s.sunelevation = g_LightEnv.GetElevation(); + + return s; +} + +void SetSettings(const sEnvironmentSettings& s) +{ + WaterManager* wm = g_Renderer.GetWaterManager(); + wm->m_WaterHeight = s.waterheight * (65536.f * HEIGHT_SCALE); + wm->m_Shininess = s.watershininess; + wm->m_Waviness = s.waterwaviness; + + g_LightEnv.SetRotation(s.sunrotation); + g_LightEnv.SetElevation(s.sunelevation); +} + +BEGIN_COMMAND(SetEnvironmentSettings) + + sEnvironmentSettings m_OldSettings, m_NewSettings; + + void Do() + { + m_OldSettings = GetSettings(); + m_NewSettings = msg->settings; + Redo(); + } + + void Redo() + { + SetSettings(m_NewSettings); + } + + void Undo() + { + SetSettings(m_OldSettings); + } + + void MergeIntoPrevious(cSetEnvironmentSettings* prev) + { + prev->m_NewSettings = m_NewSettings; + } + +END_COMMAND(SetEnvironmentSettings) + +QUERYHANDLER(GetEnvironmentSettings) +{ + msg->settings = GetSettings(); +} + +} diff --git a/source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp index 747da885ac..08c72d9865 100644 --- a/source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp @@ -18,8 +18,10 @@ namespace AtlasMessage { -MESSAGEHANDLER_STR(init) +MESSAGEHANDLER(Init) { + UNUSED2(msg); + oglInit(); g_Quickstart = true; @@ -34,8 +36,10 @@ MESSAGEHANDLER_STR(init) } -MESSAGEHANDLER_STR(shutdown) +MESSAGEHANDLER(Shutdown) { + UNUSED2(msg); + // Empty the CommandProc, to get rid of its references to entities before // we kill the EntityManager GetCommandProc().Destroy(); @@ -53,15 +57,9 @@ QUERYHANDLER(Exit) } -MESSAGEHANDLER_STR(render_enable) +MESSAGEHANDLER(RenderEnable) { - g_GameLoop->rendering = true; -} - - -MESSAGEHANDLER_STR(render_disable) -{ - g_GameLoop->rendering = false; + g_GameLoop->rendering = msg->enabled; } ////////////////////////////////////////////////////////////////////////// diff --git a/source/tools/atlas/GameInterface/Handlers/MessageHandler.h b/source/tools/atlas/GameInterface/Handlers/MessageHandler.h index b239e9ff52..c43ae09110 100644 --- a/source/tools/atlas/GameInterface/Handlers/MessageHandler.h +++ b/source/tools/atlas/GameInterface/Handlers/MessageHandler.h @@ -6,45 +6,19 @@ namespace AtlasMessage { -// (Random note: Be careful not to give handler .cpp files the same name -// as any other file in the project, because it makes everything very confused) - -// TODO: measure how long this static initialisation stuff takes, and if it's -// non-negligible then make it do as little work as possible if Atlas is not run - typedef void (*msgHandler)(IMessage*); typedef std::map msgHandlers; extern msgHandlers& GetMsgHandlers(); #define THINGHANDLER(prefix, expectedtype, t) \ void f##t(prefix##t*); \ - namespace register_handler_##t { \ - void wrapper(IMessage* msg) { \ - debug_assert(msg->GetType() == IMessage::expectedtype); \ - f##t (static_cast(msg)); \ - } \ - struct init { init() { \ - bool notAlreadyRegisted = GetMsgHandlers().insert(std::pair(#t, &wrapper)).second; \ - debug_assert(notAlreadyRegisted); \ - } } init; \ - }; \ + void f##t##__wrapper(IMessage* msg) { \ + debug_assert(msg->GetType() == IMessage::expectedtype); \ + f##t (static_cast(msg)); \ + } \ void f##t(prefix##t* msg) #define MESSAGEHANDLER(t) THINGHANDLER(m, Message, t) #define QUERYHANDLER(t) THINGHANDLER(q, Query, t) -#define MESSAGEHANDLER_STR(t) \ - void fCommandString_##t(); \ - namespace register_handler_##t { \ - void wrapper(IMessage* msg) { \ - debug_assert(msg->GetType() == IMessage::Message); \ - fCommandString_##t (); \ - } \ - struct init { init() { \ - bool notAlreadyRegisted = GetMsgHandlers().insert(std::pair("CommandString_"#t, &wrapper)).second; \ - debug_assert(notAlreadyRegisted); \ - } } init; \ - }; \ - void fCommandString_##t() - } diff --git a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp index 8fe09a55a0..dccff3806d 100644 --- a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp @@ -519,7 +519,7 @@ BEGIN_COMMAND(MoveObject) SetPos(m_PosOld); } - void MergeWithSelf(cMoveObject* prev) + void MergeIntoPrevious(cMoveObject* prev) { // TODO: do something valid if prev unit != this unit debug_assert(prev->msg->id == msg->id); @@ -611,7 +611,7 @@ BEGIN_COMMAND(RotateObject) SetAngle(m_AngleOld, m_TransformOld); } - void MergeWithSelf(cRotateObject* prev) + void MergeIntoPrevious(cRotateObject* prev) { // TODO: do something valid if prev unit != this unit debug_assert(prev->msg->id == msg->id); diff --git a/source/tools/atlas/GameInterface/Handlers/TerrainHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/TerrainHandlers.cpp index 802f591be2..c474720c47 100644 --- a/source/tools/atlas/GameInterface/Handlers/TerrainHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/TerrainHandlers.cpp @@ -200,7 +200,7 @@ BEGIN_COMMAND(PaintTerrain) g_Game->GetWorld()->GetTerrain()->MakeDirty(RENDERDATA_UPDATE_INDICES); } - void MergeWithSelf(cPaintTerrain* prev) + void MergeIntoPrevious(cPaintTerrain* prev) { prev->m_TerrainDelta.OverlayWith(m_TerrainDelta); } diff --git a/source/tools/atlas/GameInterface/Messages.h b/source/tools/atlas/GameInterface/Messages.h index 6995151131..55e04ba298 100644 --- a/source/tools/atlas/GameInterface/Messages.h +++ b/source/tools/atlas/GameInterface/Messages.h @@ -1,15 +1,20 @@ #ifndef MESSAGES_H__ #define MESSAGES_H__ +#ifndef MESSAGES_SKIP_SETUP #include "MessagesSetup.h" +#endif // TODO: organisation, documentation, etc ////////////////////////////////////////////////////////////////////////// -MESSAGE(CommandString, - ((std::string, name)) - ); +MESSAGE(Init, ); + +MESSAGE(Shutdown, ); + +MESSAGE(RenderEnable, + ((bool, enabled))); ////////////////////////////////////////////////////////////////////////// @@ -163,6 +168,30 @@ MESSAGE(RotateAround, ((Position, pos)) ); +////////////////////////////////////////////////////////////////////////// + +struct sEnvironmentSettings +{ + float waterheight; // range 0..1 corresponds to min..max terrain height; out-of-bounds values allowed + float watershininess; + float waterwaviness; + + float sunrotation; // range 0..2pi + float sunelevation; // range -pi/2 .. +pi/2 + +}; +SHAREABLE_STRUCT(sEnvironmentSettings); + +QUERY(GetEnvironmentSettings, + // no inputs + , + ((sEnvironmentSettings, settings)) + ); + +COMMAND(SetEnvironmentSettings, MERGE, + ((sEnvironmentSettings, settings)) + ); + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -186,7 +215,9 @@ COMMAND(PaintTerrain, MERGE, ////////////////////////////////////////////////////////////////////////// typedef int ObjectID; +FUNCTION( inline bool ObjectIDIsValid(ObjectID id) { return (id >= 0); } +); QUERY(PickObject, ((Position, pos)) @@ -230,6 +261,8 @@ COMMAND(SetObjectSettings, NOMERGE, ////////////////////////////////////////////////////////////////////////// +#ifndef MESSAGES_SKIP_SETUP #include "MessagesSetup.h" +#endif #endif // MESSAGES_H__ diff --git a/source/tools/atlas/GameInterface/MessagesSetup.h b/source/tools/atlas/GameInterface/MessagesSetup.h index b0cdc17648..7216d0cf72 100644 --- a/source/tools/atlas/GameInterface/MessagesSetup.h +++ b/source/tools/atlas/GameInterface/MessagesSetup.h @@ -112,13 +112,27 @@ const bool NOMERGE = false; } */ -#define MESSAGE(name, vals) \ +#define MESSAGE_WITH_INPUTS(name, vals) \ MESSAGESTRUCT(name) \ m##name( BOOST_PP_SEQ_FOR_EACH_I(B_CONSTRUCTORARGS, ~, vals) ) \ : BOOST_PP_SEQ_FOR_EACH_I(B_CONSTRUCTORINIT, ~, vals) {} \ BOOST_PP_SEQ_FOR_EACH_I(B_CONSTMEMBERS, ~, vals) \ }; +#define MESSAGE_WITHOUT_INPUTS(name, vals) \ + MESSAGESTRUCT(name) \ + m##name() {} \ + }; + +#define MESSAGE(name, vals) \ + BOOST_PP_IIF( \ + BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE((~)vals), 1), \ + MESSAGE_WITHOUT_INPUTS, \ + MESSAGE_WITH_INPUTS) \ + (name, vals) + + + #define COMMAND(name, merge, vals) \ COMMANDDATASTRUCT(name) \ d##name( BOOST_PP_SEQ_FOR_EACH_I(B_CONSTRUCTORARGS, ~, vals) ) \ @@ -151,6 +165,7 @@ const bool NOMERGE = false; QUERY_WITH_INPUTS) \ (name, in_vals, out_vals) +#define FUNCTION(def) def ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -172,6 +187,7 @@ const bool NOMERGE = false; #undef QUERY_WITHOUT_INPUTS #undef QUERY_WITH_INPUTS #undef QUERY +#undef FUNCTION } diff --git a/source/tools/atlas/GameInterface/Register.cpp b/source/tools/atlas/GameInterface/Register.cpp new file mode 100644 index 0000000000..4a592cdb6e --- /dev/null +++ b/source/tools/atlas/GameInterface/Register.cpp @@ -0,0 +1,51 @@ +#include "precompiled.h" + +#include "SharedTypes.h" +#include "Shareable.h" + +namespace AtlasMessage +{ + +struct IMessage; + +typedef void (*msgHandler)(IMessage*); +typedef std::map msgHandlers; +extern msgHandlers& GetMsgHandlers(); + +struct Command; +typedef Command* (*cmdHandler)(const void*); +typedef std::map cmdHandlers; +extern cmdHandlers& GetCmdHandlers(); + +#define MESSAGE(name, vals) \ + extern void f##name##__wrapper(AtlasMessage::IMessage*); \ + AtlasMessage::GetMsgHandlers().insert(std::pair(#name, &f##name##__wrapper)); + +#define QUERY(name, in_vals, out_vals) \ + extern void f##name##__wrapper(AtlasMessage::IMessage*); \ + AtlasMessage::GetMsgHandlers().insert(std::pair(#name, &f##name##__wrapper)); + +#define COMMAND(name, merge, vals) \ + extern cmdHandler c##name##__create(); \ + GetCmdHandlers().insert(std::pair("c"#name, c##name##__create())); + +#define FUNCTION(def) + +#undef SHAREABLE_STRUCT +#define SHAREABLE_STRUCT(name) + + + +void RegisterHandlers() +{ + MESSAGE(DoCommand, ); + MESSAGE(UndoCommand, ); + MESSAGE(RedoCommand, ); + MESSAGE(MergeCommand, ); + + #define MESSAGES_SKIP_SETUP + #include "Messages.h" +} + +} +