From 6ece04233a32b6f7c828e04b31adad74fbe81ae5 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 28 Dec 2016 11:49:00 -0500 Subject: [PATCH] v2_04_01_src_fx4 Former-commit-id: a4d55c838ac3efbfa866251feeddc3c4ed58fe62 --- build/dxwnd.dll | 4 +- build/dxwnd.ini | 189 +++++++++++++++++++++++++++++++----- build/dxwnd.log | 117 ++++++++++++++++++++++ build/exports/Spearhead.dxw | 36 +++++++ build/readme-relnotes.txt | 4 +- dll/dxwcore.cpp | 11 ++- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 452096 -> 467456 bytes dll/smack.cpp | 44 +++++++++ dll/user32.cpp | 3 +- 10 files changed, 379 insertions(+), 31 deletions(-) create mode 100644 build/dxwnd.log create mode 100644 build/exports/Spearhead.dxw diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 133a65f..e62a750 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:980c05e0c87605ce728d6f896a4f42c8ba6bb4900af3a160f11be87dd57e81b8 -size 765440 +oid sha256:7f65fdf8a92233341e1a78afe42eaa72c8a3c220b535f22367285bc7d206c01b +size 765952 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 6c9fbb3..3e1e19c 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,10 +1,22 @@ [window] exepath=F:\Games\Garfield\ -posx=597 -posy=556 +posx=1260 +posy=514 sizx=320 sizy=200 -exportpath=D:\DxWnd.develop\v2_04_01_fx3_src\build\exports\ +exportpath=D:\DxWnd.develop\v2_04_01_fx4_src\build\ +debug=1 +autohide=0 +checkadmin=0 +namefromfolder=0 +multiprocesshook=0 +warnonexit=0 +updatepaths=1 +defaultcoord=0 +defaultposx=50 +defaultposy=50 +defaultsizx=800 +defaultsizy=600 [target] title0=Garfield - Caught in the Act path0=F:\Games\Garfield\GARFIELD.NOSHIM.EXE @@ -51,11 +63,11 @@ notes1= registry1= ver1=0 monitorid1=-1 -coord1=0 -flag1=-1474293718 -flagg1=1745879072 +coord1=2 +flag1=-1474297814 +flagg1=1745879088 flagh1=540692 -flagi1=138412036 +flagi1=138444804 flagj1=4224 flagk1=67584 flagl1=269484032 @@ -76,27 +88,30 @@ slowratio1=2 scanline1=0 initresw1=800 initresh1=600 -title2=Titanic -path2=F:\Games\Titanic\TI.noshim.EXE -startfolder2= -launchpath2= +title2=OBSCURA.EXE module2= opengllib2= +monitorid2=-1 +dflag2=0 +scanline2=0 +initresw2=800 +initresh2=600 +path2=D:\Games\Obscura - The Shadow Blade\OBSCURA.EXE +startfolder2= +launchpath2= notes2= registry2= ver2=0 -monitorid2=-1 coord2=0 -flag2=-1474293718 -flagg2=1745879072 -flagh2=606228 +flag2=673185826 +flagg2=1207959552 +flagh2=4 flagi2=138412036 -flagj2=4224 -flagk2=67584 -flagl2=269484032 -flagm2=9216 +flagj2=4226 +flagk2=65536 +flagl2=0 +flagm2=0 tflag2=0 -dflag2=0 posx2=50 posy2=50 sizx2=800 @@ -104,10 +119,136 @@ sizy2=600 maxfps2=0 initts2=0 winver2=0 -maxres2=-1 +maxres2=0 swapeffect2=0 maxddinterface2=7 slowratio2=2 -scanline2=0 -initresw2=800 -initresh2=600 +title3=NASCAR 2000.exe +path3=F:\Games\Nascar 2000\NASCAR 2000.exe +startfolder3= +launchpath3= +module3= +opengllib3= +notes3= +registry3= +ver3=0 +monitorid3=-1 +coord3=0 +flag3=673185826 +flagg3=1207959552 +flagh3=20 +flagi3=138412036 +flagj3=4224 +flagk3=67584 +flagl3=268435456 +flagm3=0 +tflag3=-2147477241 +dflag3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=0 +swapeffect3=0 +maxddinterface3=7 +slowratio3=2 +scanline3=0 +initresw3=800 +initresh3=600 +title4=Spearhead +path4=D:\Games\Spearhead\Spearhead.exe +startfolder4= +launchpath4= +module4= +opengllib4= +notes4= +registry4= +ver4=0 +monitorid4=-1 +coord4=0 +flag4=744488994 +flagg4=1207959680 +flagh4=8212 +flagi4=138412036 +flagj4=268440704 +flagk4=1114112 +flagl4=32784 +flagm4=64 +tflag4=-2147477245 +dflag4=0 +posx4=50 +posy4=50 +sizx4=800 +sizy4=600 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=0 +swapeffect4=0 +maxddinterface4=7 +slowratio4=2 +scanline4=0 +initresw4=640 +initresh4=480 +title5=WINDOOM.EXE +path5=F:\Games\WinDOOM build 001\WINDOOM.EXE +startfolder5= +launchpath5= +module5= +opengllib5= +notes5= +registry5= +ver5=0 +monitorid5=-1 +coord5=0 +flag5=673185826 +flagg5=1207959552 +flagh5=4 +flagi5=138412036 +flagj5=4224 +flagk5=65536 +flagl5=0 +flagm5=8192 +tflag5=0 +dflag5=0 +posx5=50 +posy5=50 +sizx5=800 +sizy5=600 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=0 +swapeffect5=0 +maxddinterface5=7 +slowratio5=2 +scanline5=0 +initresw5=800 +initresh5=600 +[texture] +MinTexX=0 +MinTexY=0 +MaxTexX=0 +MaxTexY=0 +[keymapping] +timetoggle= +timefast= +timeslow= +altf4= +cliptoggle= +refresh= +logtoggle= +plogtoggle= +fpstoggle= +printscreen= +corner= +freezetime= +fullscreen= +workarea= +desktop= +minimize= +restore= +kill= diff --git a/build/dxwnd.log b/build/dxwnd.log new file mode 100644 index 0000000..1bc8dd7 --- /dev/null +++ b/build/dxwnd.log @@ -0,0 +1,117 @@ +OnRun idx=1 prog="F:\Games\Titanic\TI.noshim.EXE" +self elevation +debugger mode +create process: path="F:\Games\Titanic" +create process: base=0x400000 path="F:\Games\Titanic\TI.noshim.EXE" +create thread: th=0xD0 base=0x3A4000 start=0x76828500 +load dll: base=0x774F0000 path="C:\Windows\SysWOW64\ntdll.dll" +unload dll: base=0x5F0000 +load dll: base=0x76800000 path="C:\Windows\SysWOW64\kernel32.dll" +unload dll: base=0x76800000 +unload dll: base=0x5F0000 +unload dll: base=0x5F0000 +load dll: base=0x76800000 path="C:\Windows\SysWOW64\kernel32.dll" +load dll: base=0x76A40000 path="C:\Windows\SysWOW64\KernelBase.dll" +load dll: base=0x6AE60000 path="C:\Windows\SysWOW64\apphelp.dll" +load dll: base=0x76080000 path="C:\Windows\SysWOW64\user32.dll" +load dll: base=0x76440000 path="C:\Windows\SysWOW64\win32u.dll" +create thread: th=0xD0 base=0x3A7000 start=0x775267C0 +load dll: base=0x77150000 path="C:\Windows\SysWOW64\gdi32.dll" +load dll: base=0x76CF0000 path="C:\Windows\SysWOW64\gdi32full.dll" +create thread: th=0xD0 base=0x3AA000 start=0x775267C0 +load dll: base=0x74060000 path="C:\Windows\SysWOW64\comdlg32.dll" +create thread: th=0xD0 base=0x3AD000 start=0x775267C0 +load dll: base=0x761E0000 path="C:\Windows\SysWOW64\msvcrt.dll" +load dll: base=0x76460000 path="C:\Windows\SysWOW64\combase.dll" +load dll: base=0x76C10000 path="C:\Windows\SysWOW64\ucrtbase.dll" +load dll: base=0x77330000 path="C:\Windows\SysWOW64\rpcrt4.dll" +load dll: base=0x73FB0000 path="C:\Windows\SysWOW64\sspicli.dll" +load dll: base=0x73FA0000 path="C:\Windows\SysWOW64\cryptbase.dll" +load dll: base=0x73FD0000 path="C:\Windows\SysWOW64\bcryptprimitives.dll" +load dll: base=0x769E0000 path="C:\Windows\SysWOW64\sechost.dll" +load dll: base=0x77460000 path="C:\Windows\SysWOW64\SHCore.dll" +load dll: base=0x76E50000 path="C:\Windows\SysWOW64\shlwapi.dll" +load dll: base=0x741D0000 path="C:\Windows\SysWOW64\shell32.dll" +load dll: base=0x725E0000 path="C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.14393.447_none_5507ded2cb4f7f4c\comctl32.dll" +load dll: base=0x76400000 path="C:\Windows\SysWOW64\cfgmgr32.dll" +load dll: base=0x762B0000 path="C:\Windows\SysWOW64\advapi32.dll" +load dll: base=0x755B0000 path="C:\Windows\SysWOW64\windows.storage.dll" +load dll: base=0x75FA0000 path="C:\Windows\SysWOW64\powrprof.dll" +load dll: base=0x76BF0000 path="C:\Windows\SysWOW64\kernel.appcore.dll" +load dll: base=0x762A0000 path="C:\Windows\SysWOW64\profapi.dll" +load dll: base=0x72750000 path="C:\Windows\SysWOW64\winmm.dll" +load dll: base=0x72720000 path="C:\Windows\SysWOW64\winmmbase.dll" +load dll: base=0x1D0000 path="C:\Windows\SysWOW64\winmmbase.dll" +load dll: base=0x630000 path="C:\Windows\SysWOW64\winmmbase.dll" +unload dll: base=0x1D0000 +unload dll: base=0x630000 +exception: code=0x80000003(Breakpoint) addr=0x7759748C first=1 +load dll: base=0x74030000 path="C:\Windows\SysWOW64\imm32.dll" +load dll: base=0x10000000 path="D:\DxWnd.develop\v2_04_01_fx4_src\build\dxwnd.dll" +load dll: base=0x5F290000 path="C:\Windows\SysWOW64\ddraw.dll" +load dll: base=0x61910000 path="C:\Windows\SysWOW64\dciman32.dll" +unload dll: base=0x61910000 +unload dll: base=0x5F290000 +exit thread: exitcode=0x10000000 +load dll: base=0x57B40000 path="C:\Windows\SysWOW64\dinput.dll" +load dll: base=0x5D4B0000 path="C:\Windows\SysWOW64\hid.dll" +load dll: base=0x75B20000 path="C:\Windows\SysWOW64\setupapi.dll" +load dll: base=0x686E0000 path="C:\Windows\SysWOW64\devobj.dll" +load dll: base=0x77180000 path="C:\Windows\SysWOW64\wintrust.dll" +load dll: base=0x76350000 path="C:\Windows\SysWOW64\msasn1.dll" +load dll: base=0x76680000 path="C:\Windows\SysWOW64\crypt32.dll" +create thread: th=0xB4 base=0x3B0000 start=0x7272EF70 +output debug: len=22 unicode=0 +output debug: len=56 unicode=0 +output debug: len=22 unicode=0 +output debug: len=56 unicode=0 +output debug: len=22 unicode=0 +output debug: len=56 unicode=0 +output debug: len=22 unicode=0 +output debug: len=56 unicode=0 +output debug: len=22 unicode=0 +output debug: len=56 unicode=0 +load dll: base=0x6AB70000 path="C:\Windows\SysWOW64\uxtheme.dll" +load dll: base=0x77010000 path="C:\Windows\SysWOW64\msctf.dll" +load dll: base=0x77230000 path="C:\Windows\SysWOW64\oleaut32.dll" +load dll: base=0x74150000 path="C:\Windows\SysWOW64\msvcp_win.dll" +load dll: base=0x44BD0000 path="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\spyxxhk.dll" +load dll: base=0x704E0000 path="C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9247_none_5090cb78bcba4a35\msvcr90.dll" +load dll: base=0x718F0000 path="C:\Windows\SysWOW64\dwmapi.dll" +load dll: base=0x685A0000 path="C:\Windows\SysWOW64\MMDevAPI.dll" +load dll: base=0x689E0000 path="C:\Windows\SysWOW64\propsys.dll" +load dll: base=0x5CAD0000 path="C:\Windows\SysWOW64\wdmaud.drv" +load dll: base=0x73370000 path="C:\Windows\SysWOW64\avrt.dll" +load dll: base=0x671D0000 path="C:\Windows\SysWOW64\ksuser.dll" +load dll: base=0x65240000 path="C:\Windows\SysWOW64\AudioSes.dll" +load dll: base=0x66550000 path="C:\Windows\SysWOW64\WinTypes.dll" +load dll: base=0x5D4D0000 path="C:\Windows\SysWOW64\msacm32.drv" +load dll: base=0x727C0000 path="C:\Windows\SysWOW64\msacm32.dll" +load dll: base=0x5D4C0000 path="C:\Windows\SysWOW64\midimap.dll" +load dll: base=0x728C0000 path="C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.14393.447_none_89c64d28dafea4b9\comctl32.dll" +create thread: th=0x2D0 base=0x3B3000 start=0x5CADA060 +load dll: base=0x3B70000 path="C:\Windows\SysWOW64\clbcatq.dll" +create thread: th=0xD8 base=0x3B6000 start=0x775267C0 +create thread: th=0x2D0 base=0x3B9000 start=0x775267C0 +create thread: th=0x2D0 base=0x3BC000 start=0x775267C0 +create thread: th=0x2D0 base=0x3BF000 start=0x775267C0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit thread: exitcode=0x0 +exit process +OnRun idx=0 prog="F:\Games\Garfield\GARFIELD.NOSHIM.EXE" +injectsuspended mode +InjectSuspended: exe=F:\Games\Garfield\GARFIELD.NOSHIM.EXE dir=F:\Games\Garfield +Target handle=2d0 +NT Header offset=100 +AddressOfEntryPoint=10000 ImageBase=400000 +Thread start address=410000 +wait cycle 0 eip=77560970 +wait cycle 1 eip=77560970 +wait cycle 2 eip=410000 diff --git a/build/exports/Spearhead.dxw b/build/exports/Spearhead.dxw new file mode 100644 index 0000000..391286d --- /dev/null +++ b/build/exports/Spearhead.dxw @@ -0,0 +1,36 @@ +[target] +title0=Spearhead +path0=D:\Games\Spearhead\Spearhead.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=744488994 +flagg0=1216348288 +flagh0=8212 +flagi0=138412036 +flagj0=4224 +flagk0=1114112 +flagl0=32784 +flagm0=64 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=640 +initresh0=480 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index a7269c9..0ff3394 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1393,7 +1393,7 @@ fix: bug in Hybrid and GDI ddraw surface rendering fix: missing "No HAL Device" flag default to disabled fix: improvements in texture handling, dds format support for DirectDraw textures -v2.04.01/fx2 +v2.04.01/fx4 add: preliminary WinG32 handling add: minimal WinG32 replacement, thank to Wine source code add: DirectX(2)/"Create a Desktop Win" option. Fixes "Man TT Super Bike" @@ -1405,3 +1405,5 @@ add: added SmackW32 hooking to bypass SmackColorRemapWithTrans and SmackColorRem fix: some log messages fix: SetWindowLong hooker: eliminated a unassigned variable condition fix: added hooker for GDI32/SetROP2 call to insert a InvalidateRect as in older OS. Makes "Titanic" working. +fix: added hooker for Smack32/SmackSetSystemRes call to prevent resolution change and set proper virtual screen size: see "Spearhead" +fix: fixed virtual screen size initialization so that it doesn't override settings defined before first window creation: see "Spearhead" diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 5abda56..2cabdad 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -52,6 +52,8 @@ dxwCore::dxwCore() iRefreshDelays[1]=17; iRefreshDelayCount=2; TimeFreeze = FALSE; + dwScreenWidth = 0; + dwScreenHeight = 0; } dxwCore::~dxwCore() @@ -139,8 +141,11 @@ void dxwCore::InitTarget(TARGETMAP *target) // AutoScale: when iSizX == iSizY == 0, size is set to current screen resolution bAutoScale = !(iSizX && iSizY); // guessed initial screen resolution - dwScreenWidth = 800; - dwScreenHeight = 600; + // v2.04.01.fx4: set default value ONLY when zero, because some program may initialize + // them before creating a window that triggers second initialization, like "Spearhead" + // through the Smack32 SmackSetSystemRes call + if(!dwScreenWidth) dwScreenWidth = 800; + if(!dwScreenHeight) dwScreenHeight = 600; SlowRatio = target->SlowRatio; ScanLine = target->ScanLine; @@ -518,6 +523,8 @@ void dxwCore::DumpPalette(DWORD dwcount, LPPALETTEENTRY lpentries) { char sInfo[(14*256)+1]; sInfo[0]=0; + // "Spearhead" has a bug that sets 897 palette entries! + if(dwcount > 256) dwcount=256; for(DWORD idx=0; idx. #include "TlHelp32.h" -#define VERSION "2.04.01.fx3" +#define VERSION "2.04.01.fx4" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 3268cc499811905a0fdbc818fad58ebbb018f209..388f1c6b61d69b96f6f7dcc2d03c6bda57503ad2 100644 GIT binary patch delta 9132 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 NtoGzKjGv3D{|AGy);$0K delta 8381 zcmZvg3wRV&mdEQ>RaZI?I-RCznxvC7Av{b%Xc59g9ti~GZSXN76JtQ$$YbOoC?O#P z24?_6n&hB^2%Nv8MPz4@x| zzkYS9>fUqDJ@;0sPKK&JOsmc7k)Uas!eJM$rs)vgT}Az4MXCB8)ucbHCzq_)YAq=L zL>ahL)ux&sH{UU7`4!#Yd{5$X*C<0%cmQ8a#}UGD`lTVhZ*N?@$$TRoxEBY%C!U{9 z(zGv=ns0cn>IuV4T-3DaOka9)$ah}x!^6!P{@J>k*1SIOfh$q9;rdOKXvup6T$wl- z)x175RYgyhM!H&f&5Y?_c*LfR?o`|8vgqtfE~_~sqhE^~o$9=`dG%+<@>S1RUqk(Q zBYBUjF|;pV52$`Lr`;S%wbd$>9(>I5p*M9@@t(Pq-mO*2i*Qk8T&b9_qRgDTnXO#QYJUW+cji9q|5Jl=#2;jsNE0;>v8h(0Xiz=qb z7B!9hQ59<0s@5fNZ{1Y2L(TW~P2^6rPT#^6mqc2Tm@qk3xKp(nRPEDqqEprc$s1KB zwew5u2G95i?b+qDXaDVHpuW}gD<7pq)qEOqMV~=u7F&MfT}`96GOZ#NqnQ=xYx!?n zK??6ir_ho~G@u?`FMQFpNWDzGv#rUrF`s+vG^ zj;o=>ou{%U^giA3M)_uR?}acrVrJ-r=~y4#Lxp87U(`F+qll(w>AhO~`iIJW1EIx7 z?6V$vo=J6EREVmx^dVGy-Izqv(ydhWDm!#2KO;iL-jwBv*d^K_HL#vUt+A_3D+Z>1%0gzaz|SsQ|T?J<0eRE~v_Nk%simZ^MS z0edMxZOQ0W87&*A$LP!{GnLK^;^E=z<=yoz(bk5rn%o(9*|g7{;8vwPl7px)sxoMQ zzMkY-1UJ9V!#|ahNcXEfbn6v;G=(F29e5FuReP#ntab;*EpJXtDa5wRG{&Q zmVgrokt_NVs#$B4b4ZjsT|2rBBe6eA_fdGQVe$x1BKLR|P<^TQHOvz3QDe65?!HJ{ ztS#48Yx&wk+DiOsT2W`CBh6j0(KAT?UQ90^Ea935BA)4aT?{ad;uUv*t-Oodr z7Ol?8h-G}IU-amgRLo--S017B)ri%$JosJ`*Lo_-(}&VZ1@By{S6-*hjgB8X8tIAF zW_ev((Z-+AiF$nk*>71%DNRTXB|S}(s?HmEoEjojmy7`DXs?~qg3LHo~#+uZ*_)Xz+Q%ugaYcAme3l+f}_2$DEwhGaP1fqJ`P>D0~g^ zfLXhM{7q;!CZgZYnT6Ml2zk8;0ZLV7HvJB*L7oh9OxaV@M|&?APGWe{nH3`sxCXf1 zfrn<+m}ueNuo^)pJmw(Iac++G0uI@N=-Ps8mB}x+lU>ku zL<;B4+(z9@YCy`4w!R-Wv(aj5O)|^X3BG7&Ej#mt)pI=Gu+oL}Bnpo-2hbxU%#}RO z{irHv!sA}E%|!>dU^OTiVP-kmx^1{QxAPXqN$aTSx-pgVhhstPNHBiN+klqB=axJy zXtrfi)@3tWc{*Jd;wUg_r_1orlG|aAkO@$i@o-ZWkLg2nl2bsq!W<&=RPv$6&R?TB zuIBRqPK$aoz2t2|uy)MXE>!rY9#%hdMuKC7NI%`*QD)m% z(!ToE(GB`)I$%46CC~i;g~x zO@+N3vX@@?Ex@O~hA%j@zBJnu-SsD92wlQ%z{Tl*5$Chqe>lYZu|&$RQ>hK*}UQcV>C%mgI!H=ulEZ3RUfMjqEu| zo3G8mDl}hvLXkULUE0J_7?DXep zXI-)5i|4Z%NGFaXU1Edjr(-!*2CqYN>Fp_2j+5{AY=CF%U4aMPUuWYg(gRjb z-dNQ-NwK5?TZ@kEX%cO0Gs0?_vq?jPot-b%L%dElY4+xG6rEdZjHjxtDvZwwdk5FC zSfY=-;?z`F<(%=yH4dXnL(cvOmY#+@YrLhMgI#wzP@?ybMocrdI?qZ{(fi!Rbn>h?68ZYUZrDOc3UQo+x^j)V#xI z&E-j9_yp8yMb|4W`U>^3n30NZ+>sRv7g(6)3lhz6In#q;*(fzXku{e?!uZWEh<+)~ zjy0Di)EwK8rI=%LuoYd&zb&6wRjOsAHO}A5wsVjE|3Afc(Xrv!QS-+yZ@1>q{yVMo z|MS^~^nuT|cw5X4pFQP!bnY}K;zb=F#MD-;vUnHZSi{dfdx$Zc2;~0nIX&lVLILcU{EJw|<2aXlO)(IN} zwqDpyVLU|yN&>1&%$_c+n^sreNGrE?MtOqB3EeIR|47K4}1kB0e7+Fo5$j380vAtMnk*#0!o!I zw%r9i7j>O5_QfV>F8hV?=}Y+G=e?}szYlyPhuV99lTe=$!-dcX=*}BPTIIhBV#i#B zo{aiiVdJ4chvsrk7?Q5m2R~`3vr+Ra_}?OV(ELA@fxA?z+;{Gw{;Qq-G;@$+k;+0na%Jpp|;G?({;6+^!->~tJEV^rF9+9v|} zfq#eQ2mTbt6uO8FjAo$bhVT&()>9Ze^;6u#C0E$v(0R~Y#t7R8JyzI~N`d_FrO@}F zemIUT6T=n4@^F2nuyt{4y|BH)Zh_r1!cGd~&Ygwke?fgLta2Al-VwvE1U?M*HFP=Z zZ{pZRvAZOUANV8mt*EaG8v%V;>?{Nody4H+pxMqRjO`L!m?T^>1r|Vup}7)HP7uXGYvKY=02BgguHcuG8xE7jo)gECy zOwU1=qkcY)9fIbdeo+`tkawVYjegg{`18XUehA28@{t%a{}FmD>Ys$AK(B)4;!be9 z)ekxmnu|{uM}K$GX;Sm`kl3XQOX2v-5qL)@)UKWW5U?(G;|--AH}h=!u}|Xhwe3KE`JloLvjV0m+1eBW0l|IWE9{J z0_&jv1DcE8#c>zk+zomb>SSTRgf^hLqzdC{+y{CB>TF@Nq0_`}fv{|_g$}FKDg|;N zRf%DZFz)eQXs!U6VeFYeQp;9LpUB@>4`d7H`}>OR2x0t;BIsh&Yd2mCQPPBQ4h;$G zD{MSiKVb#J27(O}c89QBI`E9qy|M_G?v+b(d!^B|;{y5H=ylPTrRLT3JJA7rHn4kgaP;C&2$bH!20~{E z%Mr%cbA^o(HWh5Nu<0I|X_EnG2%Ig3JHUP}tWp>cLKQTxl$+vMwb<1NtHJdx!nO0TVY3qvD;q}_L?y6@o~|oq<#eKjM)8E*lMtLW{YwBD3E)74SG20>%yLb pzRHFuy4Uf{9nc0e7q74)=oDe8!uWa`G