From cd06401eddd1a80321efc53be20038181beccb0e Mon Sep 17 00:00:00 2001 From: Shady Nawara Date: Mon, 24 Jan 2022 04:15:06 +0000 Subject: [PATCH] Switched InpOut32 with WinRing0 --- OpenRGB.pro | 15 +- README.md | 6 +- ResourceManager.cpp | 4 +- dependencies/inpout32_1501/Win32/inpout32.dll | Bin 98304 -> 0 bytes dependencies/inpout32_1501/Win32/inpout32.h | 32 - dependencies/inpout32_1501/Win32/inpout32.lib | Bin 5116 -> 0 bytes dependencies/inpout32_1501/x64/inpout32.h | 32 - dependencies/inpout32_1501/x64/inpoutx64.dll | Bin 98304 -> 0 bytes dependencies/inpout32_1501/x64/inpoutx64.lib | Bin 5192 -> 0 bytes dependencies/winring0/Win32/WinRing0.dll | Bin 0 -> 65536 bytes dependencies/winring0/Win32/WinRing0.lib | Bin 0 -> 14774 bytes dependencies/winring0/Win32/WinRing0.sys | Bin 0 -> 14416 bytes dependencies/winring0/include/OlsApi.h | 580 ++++++++++++++++++ dependencies/winring0/x64/WinRing0x64.dll | Bin 0 -> 62976 bytes dependencies/winring0/x64/WinRing0x64.lib | Bin 0 -> 15124 bytes dependencies/winring0/x64/WinRing0x64.sys | Bin 0 -> 14544 bytes i2c_smbus/i2c_smbus_i801.cpp | 92 +-- i2c_smbus/i2c_smbus_nct6775.cpp | 154 ++--- i2c_smbus/i2c_smbus_piix4.cpp | 66 +- main.cpp | 80 ++- super_io/super_io.cpp | 15 +- 21 files changed, 837 insertions(+), 239 deletions(-) delete mode 100644 dependencies/inpout32_1501/Win32/inpout32.dll delete mode 100644 dependencies/inpout32_1501/Win32/inpout32.h delete mode 100644 dependencies/inpout32_1501/Win32/inpout32.lib delete mode 100644 dependencies/inpout32_1501/x64/inpout32.h delete mode 100644 dependencies/inpout32_1501/x64/inpoutx64.dll delete mode 100644 dependencies/inpout32_1501/x64/inpoutx64.lib create mode 100644 dependencies/winring0/Win32/WinRing0.dll create mode 100644 dependencies/winring0/Win32/WinRing0.lib create mode 100644 dependencies/winring0/Win32/WinRing0.sys create mode 100644 dependencies/winring0/include/OlsApi.h create mode 100644 dependencies/winring0/x64/WinRing0x64.dll create mode 100644 dependencies/winring0/x64/WinRing0x64.lib create mode 100644 dependencies/winring0/x64/WinRing0x64.sys diff --git a/OpenRGB.pro b/OpenRGB.pro index 1701c9a6..651aab56 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -976,7 +976,7 @@ FORMS += win32:INCLUDEPATH += \ dependencies/display-library/include \ dependencies/hidapi \ - dependencies/inpout32_1501/Win32/ \ + dependencies/winring0/include \ dependencies/libusb-1.0.22/include \ dependencies/mbedtls-2.24.0/include \ dependencies/NVFC \ @@ -1092,7 +1092,7 @@ win32:HEADERS += dependencies/display-library/include/adl_defines.h \ dependencies/display-library/include/adl_sdk.h \ dependencies/display-library/include/adl_structures.h \ - dependencies/inpout32_1501/Win32/inpout32.h \ + dependencies/winring0/include/OlsApi.h \ dependencies/NVFC/nvapi.h \ i2c_smbus/i2c_smbus_i801.h \ i2c_smbus/i2c_smbus_nct6775.h \ @@ -1108,7 +1108,7 @@ win32:HEADERS += win32:contains(QMAKE_TARGET.arch, x86_64) { LIBS += \ -lws2_32 \ - -L"$$PWD/dependencies/inpout32_1501/x64/" -linpoutx64 \ + -L"$$PWD/dependencies/winring0/x64/" -lWinRing0x64 \ -L"$$PWD/dependencies/libusb-1.0.22/MS64/dll" -llibusb-1.0 \ -L"$$PWD/dependencies/hidapi-win/x64/" -lhidapi \ } @@ -1116,7 +1116,7 @@ win32:contains(QMAKE_TARGET.arch, x86_64) { win32:contains(QMAKE_TARGET.arch, x86) { LIBS += \ -lws2_32 \ - -L"$$PWD/dependencies/inpout32_1501/Win32/" -linpout32 \ + -L"$$PWD/dependencies/winring0/Win32/" -lWinRing0 \ -L"$$PWD/dependencies/libusb-1.0.22/MS32/dll" -llibusb-1.0 \ -L"$$PWD/dependencies/hidapi-win/x86/" -lhidapi \ } @@ -1157,7 +1157,8 @@ win32:UI_DIR = _intermediate_$$DESTDIR/.ui win32:contains(QMAKE_TARGET.arch, x86_64) { copydata.commands = $(COPY_FILE) \"$$shell_path($$PWD/dependencies/openrazer-win32/OpenRazer64.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) - copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/inpout32_1501/x64/inpoutx64.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/winring0/x64/WinRing0x64.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/winring0/x64/WinRing0x64.sys )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/libusb-1.0.22/MS64/dll/libusb-1.0.dll)\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/hidapi-win/x64/hidapi.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) first.depends = $(first) copydata @@ -1168,7 +1169,9 @@ win32:contains(QMAKE_TARGET.arch, x86_64) { win32:contains(QMAKE_TARGET.arch, x86) { copydata.commands = $(COPY_FILE) \"$$shell_path($$PWD/dependencies/openrazer-win32/OpenRazer.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) - copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/inpout32_1501/Win32/inpout32.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/winring0/Win32/WinRing0.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/winring0/Win32/WinRing0.sys )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) + copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/winring0/x64/WinRing0x64.sys )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/libusb-1.0.22/MS32/dll/libusb-1.0.dll)\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) copydata.commands += $(COPY_FILE) \"$$shell_path($$PWD/dependencies/hidapi-win/x86/hidapi.dll )\" \"$$shell_path($$DESTDIR)\" $$escape_expand(\n\t) diff --git a/README.md b/README.md index 4f78b65a..e1bcfaa3 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,9 @@ There have been two instances of hardware damage in OpenRGB's development and we 2. Open the OpenRGB.pro project in Qt Creator. 3. Use the MSVC compiler kit, either 32- or 64-bit, to build the application. 4. Run the project from Qt Creator. If you want to use your custom build standalone, download the latest matching Release package and replace the OpenRGB.exe in it with your new build. - * **You must run the application as Administrator the first time to allow InpOut32 to set up. It can be run as a normal user afterwards** +### SMBus Access + * **You must run the application as Administrator the first time to allow WinRing0 to set up. It can be run as a normal user afterwards** + * Early versions of OpenRGB used InpOut32. This is no longer needed and should be removed to avoid warnings by some anti-cheat software. You can uninstall Inpout32 by following the instructions [here](https://gitlab.com/CalcProgrammer1/OpenRGB/-/issues/669#note_461054255). ### USB Access @@ -202,7 +204,7 @@ There have been two instances of hardware damage in OpenRGB's development and we ## Projects Used - * InpOutx64: https://www.highrez.co.uk/downloads/inpout32/ + * WinRing0: https://openlibsys.org/ * libusb: https://github.com/libusb/libusb * hidapi: https://github.com/libusb/hidapi * libe131: https://github.com/hhromic/libe131 diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 0856d029..87f36824 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -1188,8 +1188,8 @@ void ResourceManager::DetectDevicesThreadFunction() "

One or more I2C/SMBus interfaces failed to initialize.

" "

RGB DRAM modules and some motherboards' onboard RGB lighting will not be available without I2C/SMBus.

" #ifdef _WIN32 - "

On Windows, this is usually caused by a failure to load the inpout32 driver. " - "You must run OpenRGB as administrator at least once to allow inpout32 to set up.

" + "

On Windows, this is usually caused by a failure to load the WinRing0 driver. " + "You must run OpenRGB as administrator at least once to allow WinRing0 to set up.

" #endif #ifdef __linux__ "

On Linux, this is usually because the i2c-dev module is not loaded. " diff --git a/dependencies/inpout32_1501/Win32/inpout32.dll b/dependencies/inpout32_1501/Win32/inpout32.dll deleted file mode 100644 index 8889280046028c78b7a379a7e284399b6e1ab0c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~P^1JvLws4+R+`;H`Rxu;VIlA~z!k1H%Fa28Ig|(UXb{3=9Gc3=A8$@m;mXA8l!N50jzY*2?homkU9ZI28IF<0}VGYGHl>P6T`yY zaD;&YB~CUlFa$7SQ3w^%D@m;=VPIg0oeFgj$gfcML6tBlFfb(O6{RGWBr-4@0Qn!} zcLR7Bz?6aPb=F_2$je*ORwKwt+31_!;O z)SUce28KM4ISq^qAjdEypnAxGfx!u(Ym_w_0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsKuHKR+phS)Aiz+fm@#7`gTQ}Lj|~h03qe8w|3w2fFbEuH1#v(&96kdAfeRbn zGYB-lU@UQIe!*Dk+2y0clf}>*qQVoD#gNwNqQaZj?V=)*#gN4e;)(RSsE7n~_^3#A z^MVY@;81Xw6Zl`$Wdnmi+Vqj^*fCZ1b`gC+8d(6 z5!5XTvOJ5i!$pO!*F}XVAd4xj(?><5`$S*{i-N{Zjieq zz=|?vyaz?0&jtp8ZqW(v83ZyOY-A9~N)7rissa-G(fXgiWex)a!$Oc`c))*Ag$)b> ztq1s9+8G!af&>1G%7B#JXuVxhk#S`sg8;(R7X{o5480JW1CfLyA=YOxWHDqhfyfL7 z1_lSHLnJ_^eQ5nwqSgHGe~Bu@P2oZRMKv}s2xKwz`ltv51_X!w7q!{IAP@#gZ_yd{ z4E!L|82*d0K=qfZK_aF32P=Q;Y6b>|__*#K6;MbSpLubD3l#aFKs?+ndSD}iz``RN z83ej{Pi$lm=nPTe=@vZ$^2tXA28PZM6`4*K6_K=s7eJCeDiU41mp~yJqN1F|5Clpt z8XZ0=S})Q;o^4T)0R?=okBSV~!+|eyxWHiz@+JiLhNvh6Wie(kWie*_XXIx9M;n+3 z`!C9|fkEIkOSg*(N4G5xC`tXl9`^rwcaMq)6UYa~XN(WL;6^wek{r%7z5z)i(m%*! zVc{7+K+bGYk$^>fz>5GbM0!wx2?xG7!3lOF*u~IjKu-@DDCuDvw)C(NEj{qJ^f53n zpr?r#PH>t4*^ZnhTtUJiDjGpA>^VS=kpTx5?$n_PN*yZjG>Ip1^oFPi1ikpl4l=+)L*p|q=5c^h3MhCFF9ao&ZeDOo5e26d7Zrhph=k&zqR{E1B9Ye33r;B^Dl%Q7 z;FRK`qMpSN04h6lIzm+RUf6>C3e6Uv)Bq0mpchVHk4u0(4o=LyE-ESk$SDOBq2O4> zmr^7UDdizM-0{$q0-?gXO+ncNk!!BC9w_yK=aH< zG;@_igCxWLi!y-Af>NKb|DvGex&t)g8Fv^|K7-SC5V9V16g^?3yih%$k>t3;5RUPI zxWhX@1A1|gnginA7v5|P49!277K6(4QW0=f)BNLq34iN>5^k{a!_7Y!OTHQ(fapTh zH{PIvpUvn%B)E|GQQ<%;;dx*sJTsz%X9mR*dI{gfq5{z$qQdb8#6p;lR-Xw_r#=g8 zwgvf=sf0bv80>WZ?Jg=D;KGk35K<>*G4+P1hy-OZb-Jj?bRP=H;6c=ppvsg3(spa?qdq9V$`z`&5j3M$$pdR(dJ!a3T~tsUe+HNP zogpqaKF}MY0&;t&i;5t~&7vJHD&pNPDhgQ)Ssa}%DiA+(`lu*Cy&!>P8N>^qblZFc z?uF(z0?n;I@m5+)7EE)vB#Y>g|%p)=&vpY*vbl{Bx_Bgl! zEZre03Y|>dE-C`rE-F0C$DmS}_Hlsh6M=ZJH$+7O95rBDAdRC=9~Bj-Zxlc_LTvkf zL;Aq?8zActaRG`Gm}gjx4;2*ObiUc-Ljx& zV`x}L%q9kb|CckE85tOQT~q|K7y^#Ds7Nrp5MyCr=w73u!30WPJgskcfQr9T)*YZ` zPC!P;CI(Q$N(5YZ2EMq(#K6#P3Tiww9}&o6$Y=m1VP;T*1{GeQB%%`Z|622p|BFG5 zI{sEhMg|5{Bf|q;Jo)wifAbL*P~+wn14zDv=f#2_|Nnz+e$Dlw<=g-N5bIy;{Pq8T z_YaWb|D|yOQ0oE$AeOnPXapcx*3t{A2W`OKM71;E|K$t=u(5Lv z(l!kEe;FLLuX{7_y9wIth>MK|w>u^?!kq+4R7kknMTI47F{pj`B9MWBq5DHOsF-=d zP@)EE?(4tk0kyzk#kWG(i#LD4;S6>~+#wzYX!G~I!O;Wh*sAFyOy^MOI2 zlSQROq?bh{;J>I2xOF57676PDiG&pVP#qxm1pF7>@PR=9EDq&wf$g(dK~iwXxw#eYy;sSPf2KtfYMQ=lLr3F8Bx z1|~>}@tGIt44|+A*>V`vvjNpY3ZSsKwF5N&hosOBNnwu)NJE_Q8F0Y7P)10B`V;|K z4F5}1L}2*EHgI!6)$2sy7)S{oZPHV zmoWR6ezyKyD$pVE!Wd+ZQe-Db_s7>;KxsDmFsL{IS$G=7LN1U(goSfJ75EX5g@$ko zC12m{zSzaq!Q|v-br@lZIOB@eN5t&@a~_@zgUV4zu#zk`_nW|OSDxk{ zjKN{y{H@}kWFnigfk9wDC?SMrG5o(A@Lx0m+Ds~CH$L!kHX{Q=Sf|~8QBZ1XJrI_~ zP|6Kf6$5JP-|Kc0=&s}Gbmi%GW9f7i=yv1ibp6x#{C_np`8W^c%@t~>ZBPMUM7Hq%B2_>{)#~f6K~$|Nn>mH|=@IAn@PRDQOfAbIKQugo{`uq$G zk;Vrc;^U%E9^zrh;>l1r${_F}REB|}`)Bv3?pO}v0}h?8Pg=i~@>q(3T+ZKe6jY9- z{$a5GP{P{$kEv8|;e$<}zHkXgcv$fN3!Sb{nrojh@V883U|6n zSnv;klyE{r=`}~UD~Bp*cql$P?j*QSX+03u z{qdL^4?}74iv(^4hE6w*ZjYQ!zHX0p8?g3p}lKVBL4pW-}pv@88*6fw6k>yXmF{swF5L3(%S+er-FjI zGq$F)w4$@NB&}yEsM<>F=>-*mX+5z8X+5qvX+5bKX+60qbNX9nfFgbC8YTvY-c}IV z*$S#8kGtMrWME|I+&Tdy?eHfnptBX!PUv-Q$YKb1A^Ge7|6bRIPS*>)t~Z*G@Emt- z;ALPq&{^8k>3ZeAXbE^QsQbfz(Si*O0==#m0{)BUK>DIQt=~#HvY1}{F=Akd%m8VE zHx@EL<#I2`L&j(0UL5}M|9|7r6-*2aCqd=yg0-TPG2R=vHu@rF}>IZG9~uq zgMa`3gIW>BC#_k|N<08Xhhy_k-J*}Z9&ej}3YPO^@kSi(W;rYKfI;9etIPlY|Fifa ztxrfFP(IjvfaCBBL2yA?%C@87A%nnSu+TpakVU0zJ6a$@Jcq+xJpcdyKd2oZ*vavt z_y7O@k=-9&9QgnLf2Tnl$cfEw6oQR!TgHl%D!f?v|NnnbT^@X#K@3#tTKxyLsYE~- zaV7%;11Qsmch?G7|1MFq{#+{iq7qF#7hL`8tR4UV|F5_H(dqi6oVm01$^TNBUe^cz zOC^rGz5%VJ`Cls1S^6TNv-H9LP>$v!0@j~9T}4VvtPj^H{r7!R!QSoqphM!dV6W?g zfZ!LWeuIkG|B;a;tlh36ulbA*SjIl-h_U<6Klgx#2dK0K`2_3@fl}EQkN%;0qZm{| z9|3veb#z#FDTnpv5?0Gto^sw7JO2Iu5Ao}3ga4%x|4T*wmkRtZ(0H%1KfGODnV2X7Qm{Q#VrgXP_WDuCs&-&scsBUIhd%_T`{p++owa|uYdN}oc@Dm0Pvd`o;5A3@67W*H32FTG>}mYJAKdZD}aPxn)B&^Esj02%AbF|+%J@h|OP&CmHkRO|mz zn{Ho$?u*Tj>N`WfSf45p(moX!@B-94X+8of8@oflv|cK4Wp)+NKGf;@!}vgV?T>EX zFP~R+yK=nN`+mRqxIky^2aqsFx9#1~H8f9DXs`8dBxGcxB1J@ZYrKA%nn+W6TT;;Gz5f7n+ao9L^{K zho%L%TqzODNZHIF5b$5r1j1+gU!ubD|H5Gq_2MEZvw~RvMJqNi2%O2{c=6DNfg$p6 z7RL()Fe9w{!)xwtw$=kBO#d%5A7imDQQ;_hA9olurodr*;5C2ifl|S4zSff^O#d%J z$M9 zumWj2Rx10V4ow?Bk~T|IkiL@J-MrwoBL_%tv+V>>c$G+Hfan)|cA$bPvV|WDu}E9$Czf z?EmjYADeBbfGmoSE0N9sv0f~;g;>P{nHl&m3KBIwa5zgK!vWMf+b+bwkj3$$%^K8p z``=mn$N09hrL4sl27!{gPFYaHvddLqk---R0n1vR(&+!D9iTStdqz;x<;j2377*_t zBd9Ud{h_n;fo1KJ61C=cES;qftV^F1NjKXulziy6d$E;~fx-Gm$WrxUyVR*ql_sa{sa(T3B-pstX{~2nuxUm45b>KV0VGy-wM<`E#-J|>F@vl z#l9&&Ny#USM zbbknY(dfXy5cXn@J&3gb@&A9=i#9O33{0lkg2aUcK%}QF14BlzHiN*6GLWl|s4NDh za&S!&7#JL8{H@pZkDKxBfX>n%ow0vjoCNjCYyYrD*0FRSd+ih+{9hE5^t%gem_MXh z#5Wt2bu-B{+Fn5{J+rYqQU_hc#1om#qgpVloJn=X6+vw)?S7TZb@aV zz;Eq;(S{8S0*6=_pw|8u1^E`__EPEprVgM!N;b$@-5=lzT0l*aV{wP!fgu*~-_!%7 z(h;Qc|Al5=P%!;p2nsz=VDSa~7wrIbX?Q^*|6hihGk`iR37~ATfS-W@DbPAypLCaU z9CwR(@Q^{k_`iE+ok;6}68#q}5bvmgL-Bv2({1@#3HNSXX{4-}@h-^;%!_e)@)9IGedZ3hJ zA*ij|>6Y`qEa$~E6$XY#SjJ!jHBxN&K}ntG#alB_$`1>NOgTV0bKO5)>;?5*E`Y<$ zF9X{3a{`S5erWv`8Chb5+U=77qs7 z4|ws4iGd-q+f4_;y942wKzQdMJR1n_0EFiP;cbHOJRm$!>oc<3Eyni2Lk0nmv6Dg4 zS-dYcg2DtGm~|Pg|4XF8|BFrm*EFU4jsHPGU&0>#A`PS%7Np^zF;1Qr6(EhrT|sfi z&|R0)`oBau{KW!g28Kv$TTpD2h&29}0QDevn(Y}tUEh6*Nbw>EYAn9s1DX3`E-wQE zs7p}Fk;VJM(-ag(-K88^JTGj)>}FeVk}UBF@2*kdX#HQR22IXLxmySlnTU+t{Ua`m z0VW9Ut|$EY|3C8oh42^M|Nj4vhbM5(EQWypqM&?nI2BQNV7-v+4jM}a zWkvp$GoUd*a5fJBm2mtmyFqE)>(~GP|4l*KUwj8ML56}|`r% zL4q%i{{ppO1i+TPP&NjYvL&e**YrRm9$*7ye}jV%4OH5F6 z%d1~tEv*Miq(QmmAjkxi++uvd;Whh#gnlDlp9>Qp}C=?wAnU;n^Azd z)H#dg1+xh>>xaE~2ddw|!yF}?VF53=K$SB*+jE0zp4ul2rRM)jIbL&RvAp;Q>QNmI z10{->ub|c{XoRcvK&jY^YoGrA2X*PdYbjpze)|8vlP&TE2R8%5;jnPyZ{X^&-Iaj> zlq4cc)h$_lzAy-s$%p+HodN0uw!L6xV6cV=GB=<2-~8i$_lMGx-N)nO!1@v6r!QFC zK&CVw;c5L(tT_ka=KL>F5dh&Acfh8!{*R0-)wOg{5hx+jN&CP?Wrbv%00r=4P6h^J zP+O+gbxy#4(G{TeGmuf7EQc(GxUd%vpb8<<`Z#|Js7PGgz|APoX_~{$DA3!%z`?-q z+TfT23qv!<|6>lUT%8ph#~f4`jyb4u9dl6Q>a4Ih=3v6me88cb7o@N8AV`Px!J;#1 zmbK^jTev{um#!B;W`l+#x-EJmSbABkJ6)gb11tPj!_@unxa$MZjO^=Zkb7Qi0vEHb z2TH=aeINAl^n#4-WNc;yIY^;*0!Z6yEhHB;CvY${B&amNoYb6P!2olUAoDfrLq(VV zyFReA1?jJu`*cqR-qJQLW(yn?aBdj&@+ci?}~CE(Jr z#HPFSLHDtPKUkZe$sc^i#%$6GauP@*Lnm7obB7yC2B?1Qb>j(m(EutcBSG^!Cqa4E zjpM)T1LtPfCoGn=4{9bG-|qelGQkvV02`>*TP_yyj}~V{tgn2C533n}0L&_oV*^6(peW`7b(W1A~C^f!Bh@ z2ON-w^O{fme*v27KO7dm5A1fk*8e4jz3t%0kZP{yU?}10b>|8AFS-WgQnu#f4y+(K z>mNmr{+qoJ{PX{Rvl>HW^D&mje+@j00yX>M;|_zm=(0ULi~?cdrK~S@8tq>|(PzT>2`D#XbB*#~;uXnf33;$WB`c zP!s)hw<*Yg(AN%OFDm627`k7$HrUxlmgr|OhQ5gU^Z&o~;mF8N_7bnK(0~_9pM%Ok zp4I~;ypY~|>|2n4Nb_+P=C2lVrF;H^4SNyt`~Uw=S&+G%^2b?0t_LMn;{%bg@o~|I z|C@qrexVOm1Y&}Q{GNbDHM@NUf{hPYx^jedvUh*#4&^xxni6Cv;p~p(Xm;gb=@jmC z{nKElR4M>c^=GpZ|C9r6ps_=n|Lm=oN;tq17oDLzU2^=}4hOisuyzF%(~%{@|Jj>s zc^FE#x_x=N*#5inbTGQL-0lwL>Gl;UF>0>;!%(`i;kQBwYr}8O()q2IN?49L{bvBx z`weys{4FmT7#OmU9p2RdEoP$yTrEj692vf0VT>W!dxJp}Wm7(E!hVd2!KpKp2c$vZB_F5_=E~7} zATGLuxmkhXKO=NFf(JF>eU^Z(X4@C=g+U-JxI;DsTx)CqtvLiuSy&(LG}QnlFLn!w zPS-!B%$=owx81Znp+|EMVC z>^`~}B>tKeY(n!7M*ddNAglG~Qhta|@FWtbxJt8>>poV($9y!+Qlj)Hg!bfujrp`$2^D@$L^8!vo-Ydxr!_4T!*{29%ov!+Kr+7=H`sEdA42`s2m% zcc6)q$P!-AU`f~urI+BM1C%6QJVupbhe$Qo{$YwMe8A!4;VkBelZTBD zSh}dNWHInhIgkO`+!^p+^bEMxSqy5rlrn<`l4?Oc^dHQNL2aW_m5d+E3=A(O8-nvm zspx-Gki!3>CqO+nRS=uu^(j!{9cug*)|?6n?v@3$fx?adTk2~3W)P?|4C^-4`OP5E zd`ut%G~*ZgzwFO{(F>p+v{@+B$ji;gMBJ@yLF#L6#r+4Xhs(uBLsfw-?$iZY9D5iv z$pS-KCtW->m|dZ2`>JA$M2HfXvAG|BlJ)Xe+MTFL{e?u`#Pyae@}ntwC$ zx7-7Dq5Kj$eSdWO@^tzobbGKg|K#9r1??H`=8bs7Akb|a10pXn|FphdtCD?^r@Jnu zImMELq1zTLEen!%V!q#ekjMIR&76XxZ;(v5}+{wc`l8bX6fYM7TFKApM;6*REsdN~! zDlKDzErUSHe^b!fD$oL;&Kwni-W(MH?FYeO;ozkRhOU2%j|Oz6zW87Iqucclw3pZE z`lHwNL&{>1zQf(VA5uDbLCnbb__*lqr?G*c1rE(`M1s3xR1`wPx{EoCO+o7c!n@g; zfBZYrQSQ*e7s?Oj)C2_qjxeVPtZ6d8Fdt=%Jx|u->WJ|=lufJI1 z1WNcIYZ+@?>V3d#AAbDneo=b1p+-fRp+p7jEF@>xfviPxh8~FTq9OrW4byx?mqb4Gk8jbGa$ipwfn>i52$#zkBUgA2M@a27TtpcQ5ZOgtX@n4@x3{^ufM$G z$iUEC&GV1HCE)-6|4zTfYe!*1*2 zyFnZ0OL$ukmvDZ+uoyJ9|2iQIR6hL|eE=$JOaB;`{`fC?2UL}OfXrnZfA}wY1I+Jr z{Sfe9^a@Cw>lb6!55^y?zn8M_^MB^B`!#p#=Ti3WV+S7yaDV6or-bjU|+z{_(0XM-R?eSh01C|Db zzum4sx7CBf2i>k5pg9|v7f+x3|KF^@@Z!`HxEqdj zUwa8^{eV^!)NojXdm2TGFLpoq|G(4X#X`8ka1eN51Tx@=$m~( z&{;YI+%~wt%D`ZKtW^EQ%EzFY!WaFIQD+GhpdLE$|K(Cv28Q79?!7V~Gmjtq!P*P$ zEwME}mp}NNjrn+2gbLH`3%?tFGj*0u=!oqHwNn{Ojk|k6_I|$zYF(&BK56M8((Bs7KjmORH`{*`_D23n=Z)a$w;IN(JGC|4cfY5wt_zhyr&1B3H_ z*EO#tvKWJVT~`FW$U>4`$jrcCd>|koi?z2GWKm!iW3TUuz<~dyEg((*MM14R(7+CV zOBpk08DOvLl7KL%qqghZ>w?#bHjE`KHcX`w z{M(I55L@4ye54|I!sN*4Z&Iq*=SJh~#etjfDPpT>x@L ziEI{cL_nwOiWhwd`AJ|a7W{Xe(G89|OV>60O&z;Jf};kU1WK3~7+y1Xmrm&RUDBMo zhC$nRPOs|*Yp{Z1_3qFm|6P}K2{|_W;wt6(?>gfc1Fyq>*EJmiAhNM`4d}3wqKn-( zdR;eY-^gO4sjuW+f~pU1jKo3np2mcI?uQ}bPXtU`L_!>I;J)M;wt5DcAdeLcASBi z!NH-~bqNy)r*#TAI5gHS`OnP2P;``_Q$brWy5UX**Z8h$;7;Xl0yXttg0@n@oM;5{ zjW5h~pgggKnSmh=8iYFCp=W_+>wER?-AMid<%K4*|NsBLHppV=^_>#< zA6%sVFP-z>02YlUJl(ESnp0OWbh<7;GOD?D0YhnQbL|R-67?+BILp!%r6MmB@4+gn z7n=7#n^y$EP$&6)tBKf7(x1vh`c_DzrrlpAMipEJkneHryE)o zia}OjfT}S2pP-VTr_=SxYq1x+a4TMjf-PjmE{aQ6+gvb58YqlCBFlZWHDqXei2_FAynlZU0(QKZumBm`Pb+wI8FoXEn^ z$p~Ie1!_j{z39FJ3SN*^#s?0A=fU9tA@d^d4!nW{sd(}KHpuNFpsDZf6U`6g5B_BB zh74>Te89%P&4rPr`GG^+;T;)|7z7S4OyFh|04?Jbi7RE_0Xoj-HJkOZTK4W^i$OA3 zECDb2UxJ+%+r^cT* z9x({ioQnr}>4ljs14Dx?Xi}V^g!KhCXx)P;$gUTXFaH0Jge*V+`_1}8ky7Ko6Hgcf z%B8x`X@lBN%?AYnUx>>vFf{t{fO?{lafh3aDTMtO{jh;SAPySfBDG@82Lu9Myq5+y zvw0dlAZkI<9L)z50wBskTo$lrtq&H-*@Ep6Z%p9%U;qEV_Ce49F36BeQlM!kh^{Xi z7zDrzAew)QfF^irg`mp8&RT(?60{86_?tCo%|q8McpQV5M@ioT$8qzC|8a-A9R%VI z>n>qtU?@>)e!)^A-u!~MgvX-<)SchK!ot9Cc!v;}WZ?j@1wm}k(9T}a2x0e!P~-o- zaWdh-FG?@}|KC~1(pksRS;u31ptnw7_3G8&S<>bsJle;)cqBTwoqbEc_x8y$GBE4| ztxoO|VeAle^eg=i>feA{d?~*{Ej}6K7T*jOP%Ew1wI$$x8OwjsAK>=Revo$lmiM51 zeW0U-bp|s7gM;<)qAy*pT`dQWwSxExCEC5Q-Td25@NZ+bK2a{Feb6DGcM2~^DoY{g z#nDTkFyL|SVs>shPVy=K~2SbX{zCrO+Ypn)w(5gQNBN zqNCltpwNvsJ{$ew@C8uGI)?>ZvhrkTfJ)Y|5C8waxcv|`l(i7N+S0wCM7Fs;hoMBg zyF8;6w6aj)#ev)48RHjuAO8P8oW=X%y99JDth+p;v-F9zDR@byS?jkFsW7BT+<%}P zUBVs)?y^KK1S#rt&*%oL?ks&0_8&a04(lhdf(9Y_x=WvA@xIt64$2dd{$#N6?ciSD z4=)Z~{r|uD-@i`Tl&_#d<~S>e28}NM7iHMUAYc*ur^L0}_eXPL!Qa<5&Hw(E3Lz`` z16q52yZPUrQlW0w58Vzd2+7w+Kzi9h1D**5f4h%CdX3F*6c&Oy&c;VOUH=4k$MS%B zkl`;fK%=-njK5j`>#XG{FI+e-d}YJ2{cC`JYb{_V#D{)@6~1TC!QZ}9-_3UYlB5Dv=+ z{4JV{3=A2dtk~-;6Bh8|{rUg@jW0PhAK|eKebHIX(pk*I-}ZxnfuW)H9Rq*Mc?JfC z-qQD7d@U#WTMjWWFz|14`_I4a%(5&F)(6YJxw$pe{b%5BHTnPlf3LIL z&VL{ea&S0!mj3K^W_h6pn&5Ee=?vz0&D>ecVSJ#s8dMm)-ehSCN*DaCNuYk}iT~Zc zf8ygniT~Ky|Nl=O&JxM+044i)(AzXddmxU&P)u`SQ&{{4Arvob?4s8Mj_@Bjaik)5s& zS`YBI{sGCC-uYja0nZbH-EJASkX#Y)qWd9e6gn;=xZ4)AyyXA&Z*B!l{H>sY#BZ#i zyvWGkdKc7l;eF923d?ZLEQ?FNG6-}#b1bd^(>#l7zJkW)L2L1Uu+|Esb^ACAq;>MR zW_)E3aCrT~_&}%Y6I)QU*YbAxNXT?_a6AV|yo5-A3fWqLt{w?c;nL9|@B$?F>_0e< z!ksM)&bx4jUwQy?xGX3?2mil*95Q$N0@N~jZIH$Lf>8vNd0(qG|M*|3(D)nT-QX8< zK)PN$z6@%ofNH4METB2hZr2Ad#NYh?f4JEeH1)<%DwOs2MHpxt@i;3;0F=Rv4;&5- z1uYvC=x*Bsst(>-9}O?bw|(%IL7*g~yA5<8pY_p_I7^MvsO~n%|Aqvc$;lwk-?{35!%zN?nK3wCY`=D6uZaVd@VGgn@xU7nCXkUK|9C;kAKQMS$0ZY99}Hu?{Q*8pQ$e7Jv-{>3=cxKB!I-=-qb( zlswpN6+oU4w_E{oRVjbKiz+JyhX3X-^1yaxvGvvkL^sy|5CAP_5$tBSK3c+UsZq)v z@WL0Qz%u_&iBPvY3qsfoB;0&lz`OKh*b7Y%2VC(&!!I0?)IdAz!J*cApoBT#|8+>9 z!8stOz&RjCLpfP&y>S7tjnxp>aCS38#ha`DfTsVPLF17iwyyEuxygO-bZ zi!6~2dl3YhRFl)1Z)$AQMTvv@KxK;?+|%m4ph%((@cNP|?L zZUrSu&2>2pB{DBsLBa(&&^ol{3aIor_Co6=s1D_Mu^F^K2Q)<5>z30EUbgfi6SVN% z^$ALbI+(@tVuJu^9aiZR(4vn2z1taHGYI@QdolU?|NqU$S(^WAM0T^h9Ae+Hrf1oUAr4CxIZ+zSOGib?vsi5`mGTv@i4(r1uOq~+O z2VU1hILyr){~JMz0qV=7U#vX;|9_TP9C&WL)8K{mc~CwAZLkaaUn&7=AS^r!>Lh-! zj1b{(1@Fx0b`?pp{m)QlX8pN@-}-kMcX)8vi;X8h`gmSMod*>}TA==@|M~y_EkKhj zCG5}!1bB|q`g4h%_3v_x7y2NZmEblXJO?sC1k`9~gf<#pmj3_$zk?0pYPRE`LY2WH z_78uH0jRm)`lC6a;O|QnP)+8`6BryG1{&-V2@LLx<@sO00vYSFK3pPV8Oy`pngr6~ z%VB-GWN#z$B(ee;hh{#K9w|Nn!gBtc6nt$*{kCIA2bALONb$3YI_c^M4ag~0&Z zFA1Yxbb)HZBO;*5u;w?Q4FsUTDmnB2KmRsY(30}*PSB!9{_QM|s-PZEL+u|1ctD&y z3|>UU@nS!CO%6CQojG$R3^dQdeV|kWyno6?g~#~P_mAB-KwXyaAG<$vAO4=ABG7%J z`xuC3zWCa``vhpJ6|~a|q~_wwi?=Vnx_E>8Wa*dhpSwSNPXQe=1DYiI{*3uz5ubI4 z3Qsvl5x=#I3P%~IpSFvNfOLq8i1BT07Znca5EY*9x4z$KzQxdes{3;HO^`ithXfd! zRULja2rwM}=E&nv!q!~L!BC>|-;=|3Z=DZ|6R??7O{3-ME+0v%L8F>|sV z{?7&qny~HO0*bXiL{+F~IIR0a_stR$&@0OkQz-Molk#bKr5{Zv~wi6!2o@N62oL60`rM7hcQ;^ZrGaXn=UV zAOHXVUwQ#CivFS+B>zAjv~`RvGSc|lYgXvaF_n7$R#2V*X$u1>`td&!Vx$L{2Q$(N z!$=K~JXRwc_*<1gIp7|Di`4)B|GR`+E_Ifk=`6j`S-PXMbU{bxbN&_%4h9Bi(E61# zov~Z^dtR_JFm#=2c&X6vGoqZAf8QbgZ4Dk<7zCOh@OS&}$UeZyzpaHMV+(^o7RSLC zEOFMyI$d}0x6B4@O+U#0b4BB+T4n$_rZ?df!#(dl}i)AdNF>x)j; zJuk!985sEY9cq4|P-4^kg1JOn`&fybhewHE^9yGFRtt6p2F}tKFAdlk7@B=wu)I`< zFc@FTfetJ2eF54@@=^#Q$n=tvoq?g@msY7l^Kq8W+AH1le_H={)*j&R{Q%lf?E8Y{ zd+dRiPuM{5b|Cuz7yrIfy)GOVI$aOEJP%Tk`hel(F*b-1vM5G8;O|`vQsMjH|H~y{ z{ST1!KX};>*5+B_*6=H%#G>I>PKjv4uX6s@ayABrM&B2p_S zh=5Gu0ZFCsx3GZdO#YTXtPBh``TQ+kKy)d8%Nr0~!Qb)(L`U$q+yTv2r0!s7PTj)* znjhfbb|~P5=lFUpBa93T$6X(Q)`GueXJTMT`|kR}fTOe& z6nvnij5$yNcBnwN?}O%_|4UhSf;Ol%A7=qc3vfUZLTBwA{+9L33=FOROF0&bfVM}u z-syI|bKG?g$Q3U;LGv9iBKTWOm>3v5JW67<5AwHw>IjgFXM!Y=%qvmn-|qe=AOlp~ z^t!$Y=ykmj@M1rBOjDrsK#ACK*BKx~U-Ndk|LJgj1KzyIz|iaZrqlJ#OCQi|3w!f% zmevEEwO2~?yFFN1PnKwa9LvDLzn`Jg_fCl*cw`&qHgS;kse2e+@_}|*3P9W*@FL~= z|NoIMe}Sf4eiZQcgHE{SZz%!?eky;@Q?PhCf8RV%4fZ3mB((WQUWs(`k9_{tlS~W@ z-&|ibbe7&I@dO1PXtKkh+Z>YSUwr)b|37G6=mIlXnL-I?TDR+&v`)6ytlh3>I@zG! zd)W?hm+uRQw`MxPS*#GwGTjZ8g+Wzr4Jg9#e#Oezi_+)vb!tvd1R;Sf-H^_F3?6Gppui1~g zf|bXC&F*w<=yw0p>DmHHy8lai`1c+9U;3c4_DaD2(kZ>J4Z#8bO(kA42)s}@2VTkC zUHhW>h)m;iP=Qe*4N7gLq9Coo|4mgu%6^^&D~pV5sC}MZD%tuUF0BBPz6F=I)-B}* z1sQ0MLuc%r;Fl%;{{IJ6CBAcBD>lC<=5Hze`~Sa(2Y<^`P{4yqG0-^0ao0KO4B+5w zIPQ7_bRs!_%jtjr|9830VF^6udcvT?_2hBaBcOiZ%gz7(|4;jVkU@aIbqmOh<1F6} zDwK$RJLmvPFl_w$-T%C10j0p1uLZsxbm(^fQ^Gv+HIwnB&e|*A4my-bv|g$gsbOh7 zP|WxJM)M_x@3){12B)zJ-M6}blrkCL1_eSbCoEP3n^RwW2WLN6^mHHRK3vMI=z64g z>uXT$>iXcn?}OF@^=u%C5|wV(8#99fg2P|veE^rJuE3?_B)xS{|HTp-H~m_0DT{&jt&I5>}9suiCD6I$dux*Un(zZv`zW>UMpx z!l6VpZ6yO^3EMH(6S}X3RzO(VuQ^sQm2e+(J)v;i6;!M+bjKdhj=iBBd*qwz3!YNJ z|D_jtUC#t(DZJ1F`Q`}E|I#DfwIH!x-xDwFzW@LK&GiLGWQpiE*B30M{Nce_2EDFl zUNAxwH`nfA=yttP64-j6&bPZ1TzYM1`|mp?Ad9WH^$qxpH`flg0Jj&jzJgkt0<8y1 zFound2#*Q|NqUkQy3yk555*|_C53eHE*}?odA$Ud%peuAK6@c zhM@-Rf)bDm6hIR7AU#KTK$A@+y#GrVyePWx|9^Ap0*1)$*ezYmEeASWpO+|h*Iwzm z@KWK&|Nk%M9|kquL1PG@8RUR~fR|F=LG$yLr8`QvnrnBk^SA!|_WwUhbEn(&Om{D+ zg#{T6+OZon6bjk}bn@_o`OyplEKv*sict&#c~J}kE20<#HbyZByoh2DcofYbkj0bH z0qX2&fu>DT|1hNSYaBf8`UG4)DuWIkVCZJBWo2MEP{L&^3!*^d>Yz1m-Kj5{Q=c$E zJ9MBqAf4O)|ASha&2J=(4+M9*{^@l6(&_pmcuqw32~*JV{sD96L}_0vkq?|}e1Lxu zNH+FGXXu+w-w!)L_VF+34E@vT`XlMuX z|6PM4uVIEPM4Wj5Bmg_HM(aU4zyv|Fu3=$eFN7dQyk;`~mf^7rv~Kmq(VZZdAvyKkevp93f0Mr^ zufZx7qpLUrQIR2_z{rrHunXkj3wj{CcwQT4eSxlue_{QuM78+3-Ag%JJXiD9F(N zqM(VbSnw7bP)2%q{r`W^Hoe*>#-t4CTI#EW}pK!YhitbdpCznHimR2qO*85tjV9hk-SB9Z~Lekt~krCg~F zI3U7bRI-A$z_uPJ6%T(Q0@C{;8m_A|_Q`ARPP^Ca;V*uk{{J7okq0zW3d*vT*Fgg| zTradhJz!AY?RMn|>xFo%*^U7;$O!7$w;qTr<;W6zG35}b7B+*-0LH~04g^i4LHFf` z9|LV{0By?c{?J*XBJslQ7--_f`d?%ue-miYX7_#Vd%f8#&3{>nD#Bir>46V{`5Ia5 zwFA`rw*FAe)P0QknDwzD0nn;ukr#1iKuwLv$WrlMHv#KoMa~dmcc^fQ@xk9r0lhXe zUZfrU|37juXmjv?kiFqY|NrjTu_<&`=ZgNqPi3AlPps~8h!(mx0Sqd+3_gEC#7BWzCX^h&$Y@#sHdi&Em;80g7AJYybbhcy|y~g8yLvjfwvT zCD%^Guof&_6|epOfB41OgP=+A5*3ygyZ`_H587e!{YIn*Y@7jl{1JHkDy`AdHwrvu z+3je$mV; z7Y>OsInW_d-5xyFKZ`iKBRH6ETK_KMX+Ff*d_cqcTG2CX=P!kJzsdTS@!}YR0Ay7w z=;Tj^faW(Gh^4GQjE@Gu*R6Jf51s)n;{=_LCh)=rG@1Z9XRRc(+m%BXblD8}MID^28+$;b8zxZ?%w9Kpm)W8P~J^sJ&njKnCL2Z1oREL4#McbAC{|{&E z&R`IDp$p1{iv@mx=A~U!SQd-?Vh~s?0U~5TgaS;Wn-{dCI?OVFr9`0nWA-;5<`NZ- z<^w#|$BJHOpX6coQQ?TQK3L2OQov+<;P8J_kp360Ama~bDP(AX+<5Xbs9fl*ebQNb z1GFpUH+Q{HiD>uXET%~9gC$DZ2TM4#50<28A1rlwvEc|P>vY!MX#HObI^p7FB52AP zC&iUI-$fEr5U*jfX%d96g9MKG0nIfRVrD1_J|w zrR#%I_AKTXVh8{Kw{(31+V*+~)Gq~1y8LPW%~8VD{F}RkwfQ$osdTr0LZ|PQPWOc7 z-yEe5-To<^z88+Wr-06e0g32A7L9lM-s$EAEe!7#1uYV1K4s~9r&hAt_YP?Ncz8^w ziy+5;*E_Fozj%2Nw2crJpQ7M(>Kvu=|I1T?|A#(^d@b1>%h6qX19Wgx2}c&giy+WG z$-`hdREG(6yTV+>*6n(s(>=xbz>Dll|Nn#6H7wSEMg3wEILiXW`d^~L@?Vr^BWTFP z;SdJ{XwD53yRR=oWB0!)NZkw1gP=kjw3Iiv*Y!!j3+8?Q|3_LMFX4qO(}~*wDse=b zYo9QdC}ynL1==|Y+MaKHyhJFYWf%Npif)hztowAc83e*!)Exkob0Fh8YybQ&<@sOA z@&8(<>x0+&pq#_d&Cuz3$M~eJI0M50NP*Fv`l7M+4v1gMk;MVoG!2@Uf`%VxdaB|g z%*!@l@0o(A7u^TIMQ;f|*t-{64@8!*fbtS}@jK{HNzk!2-w%Pt+)Hh`nXDK~^|%g{ zs97a4ma1|+DUm(+Lcq$AsZ^5dK#8DLB6F!g^Ffy8Lo8fRN-uT)H$HH9g7krl51J1! z9{zp^)bJ~j=wfO<#AwA>`n>rdBiDhFJKqn1dRiq*(z=OSO>I9hY_;QMAhLJ18C?Jw5@_+vB_^xq;>Kd{05!R zV)2_n0MyNMINZ$(l3xhYn0-=&`NV4>kPo#3cp86!uJkJ6Y(5}jeX!`2@c~c;+5AQT zbV7-v0BDduy!)SaB~SCQKL_9Qcc0HZ2^!e!?O}8Q9Z})?p_|Y1+d;-o-#`4VmzfwC zf_r5QyM;SLzjTNF=?wkR9s1?lA;!*Fp3;(ozgWDQf7zEYXW2(}d$U-3bCfzY|55;L zJZ>nK>^^n*b*~Q-%lFHQF*{uTah57~`*J8szLx3rdH|Q1vja3`_m8ub4I~-K(jCjw z9n8@k&C>1rhuQZ_XA}!)(^?cucMwNsFh{5FAJDN_NVdlQXnxGt8T*C5wV#23LA&%v zckGXYzge>EJ4<=Ih*pA7T*GKEl3LN-a;0zDIDFNETBWO zz$SKka&-D}beHnHW(F0PwO<%YIjnC%PX_b-(93hNJCdc-kE1h=rL&Nw+mEHQkfYm= z#oCXfG@;9fiKWAr|KGvpUkV*QOf1E!4Ym9XrF`9|z+rm%b+<1ErzDsS4qcZWE}Rmt zHNlDmdc7WiWgw~|S$e%5>;n1f@~hq!u)8@0x?TTtvUR!`{ONZ6@SlUf^)u)MZBSwZ z4ayEN@s>r&gKM`e_)a33XcD!slizc{|k8jUjqyMFAzZ8k_}Dd zAPcikigb&DQoHtvULV0XfxR9gfdMbt)Ih_o9L+~~{)6*_H7iJM8B236hX^=tfb&nc zE5~Axc&9DMf8dQW3qd(4tlJcniNcNlTYo4uX+9v3eLy4tvW+PmmO(|p=f;$RR!mkj zvx0O9Ky-ogZ1y)1X7IMBj3bVqV_{&rK-t>*c&D2{$?+_f4A32M8K7Jl{$Er8Y+k1u zPpQ!VG6A?Xpv_mWXE*zC{O`2utYi7l3UXMtn?N(i|L$Y)(DPEjS(qa@th-Pk-1zou zX66IVtp{p0M5fL2B18gW#8%gBdXJZqtk(<`2dGk>6a{)?%&{5jR&9eGgtC} z_j5s=0y-}PH17aftJympbkU#nug=gv<<8xww9g-W$Q|7rafVvxd=7Ca6mz#6fiGK%M4s^S6boe=!GILh2fD>5v>C3Oa zUs4R<=spad{|g0eXW;<{gFtXtcPVJY7*F?g?LeO9W8w#2@pqp>E6u)i`~PWv_QBKo zV{eV+pKke1UxCipKm2{6j0_Cl4m0w%x`KukZ(4um@3#hxM*03Z_>;x6`KNuS?~gLJ zEc?h#-yhxaEY|THrOwSip=FyCD3AT<^j%2ZpyK7&w16Gm>klhGI0Zn3ur#A;^ z^;RTHw>L{?BnPxs3-9t_gBHyH6gqs^z`+VGn9uD87qRa_1+yhMSkHlim7f9R`3Fdn zl`Or`VD&=^R#$;e=1v!hKi~lX*cvyHg&Lqj*q0;wfCw`ysKjeNDBk?=L#OYDgFjh< zJ)3_jgoW2~H=p}|`CYT`kN>ZEn-4x{KK0-D+vQiF3Yr(xV(7m4TCh8qrQ2FL^oR04 z?(3yo&4)#-Z*<0T6uq#%QCi9&OVh3~)XpYDmE&Uy1e zmeZUVm^Y@Ta#2Tp2=CD@y+3?~Hv@$_;Al`@T{1W`Q;lelT=< zadcO)bXKx-d$Dv^fr7cRKEw{w$SBwoaWuW zKUzX zLiY`L6szqOY!vI<2GA(hLeOUE<{ylueAe$uSh|nCW;Q&%PYS|E192L0IlD! zcIA;i;7}_6!XB;#(i6L|8r%~zKJfA?XgTS6U!LxdouwSs-%FW|zquLT?u>oX{O>_| zCTxGVck?m+=4T%|OF>5xTC;)!+&qir#ep}Vb%UUO83*`?zDT4Hj|Wvou}`e;mk9nZ z

Xc!MPM0FXuVy^_rH_}e2iG+%QK*=rWAD8Do^l>^V>lam!PdpP*3x>f))USjH5U_c!_$q^B)iEV?|8e#{z=?mp*xMpOJwf_(dk@v>?|9!2vJ2K7m3?!m{>BsfYFV zQa0mnZk?q(@HhyAH~T=z6=J3Wx|!V|Gyj)9cwq}ROa$8feW3>$KB#@bP-@uvt(4IX zVJN664Nmp{ML~_$?jNs(x=VSwV>z-|UNF1@g>rZ8lh*(It)Suo8do}DFZP3mz*`US zw_f`9|No0?EC2tutbI_LgE$1KV1_tB&e{l3RFVOStJj5KmxN(Bp!I)g z7$k?3n1sCmt!oFJFeBgm??KtwuorG1i(jO!L}Z2+3qV7UFM?M7|NpWEG>7uPRP2Sz zO3-j8WX)B;i{C3iLn)En$6sFpHwFd%mvVp>Pnj*#V&3j=rvn1-!C~CyU|50`TY{gjcJjMecv$mu{^n==*8k$-OF81=V_zPXWnlPz z96bCWdhjJv^CRZwpBzP6pO^kunfj!bL104n@m(O<=9er*Jk1Z7nNR#zY5h^dAn;$M z_X|k=ze;Zfh~}te5HP7_5QwN{5KsmkU(ep<#@OM`*yYA_@Fi1+J5%#9=H}yI)6c+7 z@AYJWs|BlKY(B=+e4Gj7hGlS76Ci4uk1>K=c$^U=+X0vD^<=nR%OG%~mOC*qC+okVCr%V5fZkN6{oi6=vx?TD{bh`9^ z=yvJ*(&^IwrQ4rAW#3PWf0(~V-S$3 z1D$Bg5f^{*@Psb54)$(W1RLUes7S9T14tes*5w8Y4yeq8-V(z!B5ghT@G z-_J|`{8yRUP|qOH{r~&T|0=x(^$Y^No(!-!`3Z>=ZBU%F)Pds!qKFvN+?bUwcDOS)zXONfdvNG&LNXfUHmDjzT)kszeh-d?4kVQmU}iyl(B%d)vBRCQ z`5klfdr-{sH-V0{LDJFd$zW2?AYfC^AmCEZAmCHaAP`c|AP`f}AdpheAW#nSnMB?`dB($`dLup z2ITGT{}bvN1ZLDT2&|}Q5ZD7U8x|jK%pLB`&=80Cx5J$o;tQxK$Zv2lNIXGh&YU?D z92VXkq9OoV%?P@BCNwA@Ffb#d0e)@;ctx%8kxmyCj+9PS(0G2gi;6*a1V^`zijJ{l zcL7iHzkemx-61L_&Ay6ng(9PZH!P8vL!cck!ymzD9nd60)3Qz|*}Y#-Qbr-5wmqCtk451)Z>v zApsh}C=mExAo9WvTyF5hg4Kkm2y`;-0Ojbzp`fA1Zq5INGXD!D{ugSz03FWIe1s?V z5DP#`OAZVHC3-B5bkOdsz%XXl*W7I@j^MX$C zDh}=j?RM+_*lPnmC!w1iayS9=v2PA6j3uU^R=NRfx>HvBbcujx35RE?aB$X_*BrrF zUtco^XMOuGDg!!Om%W*X?Z5GX*P<_GF8==?avuMSg^U0H?*yID1r9?O6_(~7|4PMQ zbS(z&GkuW{SJ`~xKXh}X669EgVkyiGkjw``&MH-T;RQ0*;Dy0r$ZE|No#PWkAOabbp6>5pvuBbgsbowq+bgsaY1+i>;4A)m-c! z5MK&BNeMo#?ILJ{Vr1)qQs&OsC;#0zjzjlW7=We}VxN@Ac7qIu?SupeX0M9{=$tdq z_C(NZ<>_7j{~tEK-CfI(#r2{bv||N4T94_=UKd7?KG4K0bj%i#*g@N!K<6%)3V=2y z_%++QykijfSIYXLUy^}gA&3K7H_MjB`~Uyzg0NoS58$2q9H7h6G{9S!O4FNdL3)`= zZ$s+Q<{uTM7dpY_g@t9Y_PTxv$YShu

D-FRHQ;JdO|E^vnx3{OA9Y#bLdnAA$lv z3IqR(Du7Kb=}QBhZ|(aBv_<&WOweAQem3UvAi z|2DRO7rQTko7|BlwV*9z9iX*=%|99IR4si4Y7~qwS;lhkPdya$zmy{|EQ=Gouv-W0 z_HNe?r2^f)0@h$HMG6*ij3v^b1?LSQBlufVLG4z^&b613|NsAgv2Ot=X@l0LBRd8( zat1o|9(2Gw2mjOq0sl)mx?MkHF{0YW-wIOndKb8P0Y10!e~F5~i(CIdsa61Vvh)j3 zYK`3iI-9vO_DL4w3w7{Lq}V@M%<-MI53FrLdv|NYyT2cN#suD^%Y4jIqQs?};hO_b za|wUI3n%dYzaRfgnE$&zY5p%#qXAad&B6xR#tK?a02cXg!uDdxn*aYJ!MsixHuu-_ zU}+jQ4=lL@)beJ0aSF6q`O_bvkiXv@*9RiJh~IID>u3X9+{&>{|(U!ViEK9*Vp2ZQbe$=Cy0(gSLw2LBf| z0q24ej!s*Us@I~3Vu9;8D@X`5k!2YxQm54IE7I*M;AtUI!r@?jy7XJ~$^YH1BH9N% ztX)NF867%ZMHYh8H~(PbZ&?jGv-~iB%VO|yQAYmO(~JxZmaz(*u|G;Vy4gTiez+=h zn}V_+D95M-2mdb>;h%cof2lw(%TZ9V5%9lM;s3SnAJ)J5TlyFo80ws}9vEMW`2M~5 z2UC%GuZum0EdvV!L%HyaH4+RA-AAksm&hDvICF-9;k97Ei+AtA=ggIG9%ldrQ1bzf zPS-E5nLA^@SjK+gZvh>-68^vR3*_*eEJmL04)`97X>YZ`XAZp`UX6rrwEE-R|Wo-+n}3PgL{2N0{@o^ zfTHb1GDztW3G2h1u3t*7bekG%1RVB-%k2yd40X26KOU4@ zG#`M6$_+6FhVDPszf0~OX9tJMad4=JzeA7K?jNt2jQ?BzF4^+G^ha>`i~K2|l9cCv z>5p)5i6?~(}kN>3-0pXy)DSh)|lL%-rPiN_e<|7i{?@51CF8vYy zVk&6d>9rIrD4`d8fSfN1@=*5&%h)d^oS?9bTMn8mcl}^}xP-^jRRXl2z#A-dtT*)m z=wvid&G_QsBv8c&&Y`frYWED#rVWi=-w*#wRlsfmr5~`vL3@E-=z>nAI--EqI|Uyx zh{)p$J$^9=fHJ!E;qdOCrBy$TetON(3|j z!|`9#26Qp9>yO|US3yJ2u0JAQml}VwjFlYN|Ce#RxCf?rUR(py0x!;iX^|Jlz_i4ReIVNG#dZ)?rto4tm{xhQ987Dx zm=C6PUQ7qm1~2--w8@KhFfH?<9!y)jC29FcVZ1zt{w3 zg0>*OSPo`_E`)k92h0TB1odJfm>O~uv3EF%0q8iLx!N9=qq5y2S4)n5=)^8=I z-E7vZ;Qh|*0WX3UgJK_a71k3_8=XDig#%cmjKkXW1z05Pg&s%*p}(%%jmMhx4OlYZ zg&;_>+fBfl^#fGo|01xFBG#;5pdxP}A`;fDKcFJFAtEx?tbd>)Cm|vV)~pQgAZPn; z2aA-cSevqdMZ#Vz1&PF=E$9pFeiH^=-Ww1Q0Gi+PWawhzI#9yde29^MHH*sYkKLsl z%_sl&dNMR0Wb9%COC4k6U(BLX{I2_8^AUwO@Y#N#7C#60hN$pT0qf7D0+z8nr9$8( ze6feEKbNp~*Ya3{?t{#p3f?^myASd&xC{sF9=!^>U5cec?)9nePyy@9r6A_T=30^e z-N#D#ySO?y9Gt99m&o~-etsSWIDSZdh%+w)a{kyaqq^Fd>+m$CPpd*Iu zf5giQ(4J7a7aynm{|~#|u?aG~cZN9scmD@_oTnM;@sGW3{~byc5)6VXPDHb$t`SzwK}q zN5G47{GbaO-!vcLc`eXA5xkRh+hP7~EKbc2K&u*AyX4(pA8+`rTguk#E5Y=dwc)pR zDRY;+d$+4d>jC~APiX6{1+-GB`G*RBzd7il+5@Fp4ZjUaIFGxEfcE9QHtAxwsVL#K zi2w_Mn!2wQkGqP1RwupYYW^WmD%|kfpp*}+ip3_Pl*Jun#YT{Gnos;UzVy9Rgn!#< z{_Q+|-wv{raPaRt-TczvwN%>ogUpO2hFzx{UM4pDl;q!cx}3TBr9$(;lh(c>#gfgw z5*(JUe~Q#gS*%Z$DK`5`uz-enOO?A_CHz-#lq!IDCCuHmJfO+L*D>9(fB4tOiZI{o zjQs=hch3rzeV~n8rP3=HOYNE;FqLpN)`C`ZH9w^nZEd5ia{^G(U(AEqI#^Vg2 zo4ZQbntlKLe=X4EDxt#k4Sc^b^RZ6XKi#gNeOXMM7T;VYm`a$x$NoWyzHZk)uO(n= z3{a$u4}ce;gm%9H-74Gg71ZMfUnKUwl%teAADJe~3X|8W)-8<6;7ka_>F1-!Tb5!3(+#{2?ZX%X;Z_l*Dl7bpAzT_N@*;KjSC z&^|ZxP;`$8U{^NReqk!r$>0I$1ew$}16->w&iKV3P$H7?6jraGSHpUkBq3y*wY5QsYrraE~c zoEMQ3;KN#=6|gT}L7fgdFe*zR!vNI7wOH~0zwrUk)u8{a@AFSRV12w)_JzU((C7q6 z54cQuu@SEEbue@`tkfcl<;BGdpfN7c+}GagAQouutAx9|_)qgYPS7zk%-yB%vkpLG ztDu=6fnfM-l?y0ceds>+;>U8(kQQh{4szc@GL|9@!R0ir@FpC4MvjC+2FWd@G4fKpK&o)h4}oNRJsEyaXApQXok8HibOwPN(-{OVOlJ@{ zF`Yr+z;p(I9n+~bKLoO@`#;FjGBX$iG-fae*vz2E{Lq4#@cE&DnKg1V3&Xx@lR+S6CWAoA zOa_6RnG6CYGZ_SGW-Cg3|c&+0yv){RGnZ^TQO<`19jHcSVA(kMsv! z9~rKY#$O+Akj9^%=8(pppBIqEpI?@c#-CqTkj7u14!Tk@A9ST;Ip|8s`hs3?Kcg3X zfRJbD;_lKP(90ab&XDP>{Q|kQ4zz0d@XYQL-L4$Qr?gKsKja5dGf^&`?7ql-z0|9_ zRG|A@^TYa1-xt;&ON6yQf|eSnL*|UYW9ctiPnMK-$AVVeF<;ic*ctkU`G)q*&e#v# zrEj`xKXm)P_`C#k31zVL`BKyGH=7R%boxGlg~XH3OS*kIn0=pghw?CoKIwK9&~|+i z5ES^r2X4b_DVSn`?u!RsGJRg!eX98(GuTkjq4ppzegR#d32F}qhlPh`fu@-%W;1}s zE?$&zGBAL)$bl4qYPIjk^I}HeDLaop#wT99Z3NGY33LZ&1a$|f1icUejVc`Bz?c>T zP4>B{2!sY?{mW>WjXuX0(CebY0y%ZQ+eJkKG{*;;-TPl+)m)>Z^S^}6xz&lx5p$vSDS;TQVuT!k0qERVo^NhE4kbJwvs|CNxHkX) z|HEM~ltD8Mowa|$Ug(1cu{#la&OmdludjBOa)iCe04V~^f)s%44hK&Ifr6n__=P*z zKG3`bXsTru=%lgR)`#Kes7k$1gDU`^LiA#L8#qW_Ux1t>YlC|9IzRt5A3o60>m|nm zUR;Mx_;s^?b75m)EHMO)cLst41OAJ8fQQdYxgo=5pd)2L^M97HPf8?T9Bl(1)7Q!I zVnrJ$IKa-sa=PrLd7zDSr5rDKpMaZ3;Kj>`5xgum&~#b`ivR;?Q{FMxUkv|69U#_% zCOuwrfuvu20NwuC4IWCIRtFzXGC>&A?JCgiE79qCquW&^xYPAQH$zw_=nx8yaO3~h zt~{N-XF6*^M;P$8#DhBnprbr{eP09yfQHbzWkG}SC2`HQFBnTBdR&p`IgxJG-|M0q|AB}2f_q)eprg3@FN8qW9I-xL zVgVhQ*9{NTvzh z5&ILA=ptWp8K3Nk{c+6oCxc_R>x(SL{{|-}*!mSNFllDcua6EGma}K|48G8D75xr(baYCb-*Ifcs>LZ+9t2cP-C$$IVgO z6hLiOHLfRJ>?P`42TGKik1;kMXS8}=#AfxloQdg~)$t-WtHb3?OvkJqlyWz}WGuaC zeA4Pc2`A`0o&QBl-*0vwj0Uah0^5Qhz$<8cR0OzBfNI-PPSF10?+*_NFa&>p2tC#; zMMZ@921woahs>9w4+$_Jbe}oX>-0bRF!b!a-V_xE;{#nTDjdPxHx54F=nhfgfb0V- z5$)mv?cqCJa=ztcNgzb9^fmX5@b1G09}9$W-{|Jr4?1_R`(XEXpTNP!+8dV3FjFYmYru{*mjiR(h*K05c{PAEANDgEWSeL{g@Ffi)w`~rCz*%AK5L}v^oLXF*R+^Jj3D%mLq5v{GCPpttwU~jyv7{t5x1a>%4Vc;3yu*;4T9lWX z196vUad>{YnMpuVKFDYW1~AVhvl!$;Fx#y-C^aRsC^fkxGd~Y1ACy{_T2z8f8sr=X z4Te01QidFc90pAYKd&?gbk8V=!^XhC1{(blU|?orU}F+sadmZN1p!k7h5(QP4F!vU z2zCwza|46$0Colj1qIL=4F-;cjD&=Q1O|qRf{KcY3J!J-1_pKp4$vvh91I)`ATGm& z4-5ht9~lIk^NU<7GE3lo$}LXLFG@|-OUcP$(96xNNG>X2aLogSazK7&UP)>Z0|SG% zYmlF-kFk-Si;oY;87`@)@@_fBZbhl73~o8a!Ko!-i8-ZUwmTBrF()TK8Kf748JU<_ zSlQS)IJvlac=`AR1cih}M8(7Lc_u%BBP>XV&mcy5|ffsQq$5iGPAOC za`W;F3X6(MO3TVCDyyn%YU}D5*cuwz8X6lI7zCKx8rqr~L|9o}U0qvSTUi+x3=A3q z8afy_7&O!^0>T>@*g=6E5CB?-rl8T#(EwVemXMK- zsS2s!e8IrL%f-MD;^QA23=siw8G=3i+>y8pF8;obo_+|CATtAF6J9RIJcY!9f}G6c zL{Rcl$Ve=j{+!ZD5MqT=PHzBWELwV78j@HCgoHr zq?8tcGGAU|NoEhUs{A5 z5_$@rB?_6v3c2~kB?>v2*{L~|VDA*A7MJFfDCDOpBq!$NfGkVQ1G`B#IX|}`Gbc4g zK|?<|r$|#FtuzmuWg+fNRDe4wuehYBG`S?dNFl!nBI%No;Rbrav#Ei6sWwB1xUUWUce$$C}gB27JyWNmkSi$2H-Hnsy4AGy%eOd7#!drbHVv3Ehj$_Ts0Sf>Ku4U z1Tq3tyrqIuFav{cW^z$}aei8fLRco)m(JSS3b63-ffRb6`h|;&fk97CkHMy(C_lX@ zF;^ikF*jAAG%q_ZzdX;5fdQrk+@etA;tGH$vjR03JmLA$xhS(FGdVFQ7*f4E=A{G| zWac^Nm*$l)Fu>ah;EEGu=_qDUzQ(392mud>I%VeHj>BQj=42lfd0=2EY6= zINLwDBp)OkoLW!<6Lc(1FD))%VDKu<0h{4fnwJVP%dwy+GlzkJ!8freIRms$IW?)M zG_eSxCNU4pbV*GHna|*#T*45XTEO5~nhr9D!K*Zn!8fsz!LgtSq@TepHHpD1F^?fQ zv81#pB@t|fTTv#M6_Qa}R19V@FodV3d3$VlJiL{ zE^$l-btMDx3rY*XVh}#W7zW?e;^M^gRHyt3M~2W~*C5#Fg|ok(e`tsb$Zp^KypYn= z@YIx$j8eCv%-}>&yUr^y&n-2{H?hdEpvX6|(yKJjt2D>4G(9-Az(2XfFTV^FfS|x; zU|{fo(qvH&7z7xOG6;Z<5`pQTV9UUe(ZIma0ABbC6GhPf{{R0E;$4B#ApSB%27&F0 zknuVYA0&SPNgl+v)<%^_)(?`m(?gZNfu{eyK7#eP zRsIZ;JjfkBj;QkJ{_p}-j|>b9Ft?!FpXH0HAKiSdKva2j{na73<)xDt1k96g%Y)p{ z2pvbo<-W*tRQ<@|+?l~3FgF9Y{Ot?|f%|Ck2hhUrY!<41Wd9$|W)QfQjVh1s|G(w< zBfB3IzW3W8@*wu=Hbk04H>YVTL>;bpI5rnm z9$o*6dHCi3E@BX1I0z7AO<-yFgUt|IR5o+Akep)pJVi2y2XPuh8i);_%}4?9z#hgM?4q#v~ zM&kSCr=&74%wTW@#Wi{WGXygEq$ZYO1Uv%^*n|L3^f3GdwNf2H=1vBQ`n&pq*!E1G z#bJp#nJLcsDX9U8>8T7s;F1G6c&U>c7gZ#jfuRH>;sc&A0fm+$1A`3MFQ8JFf#Ds4TTW?l z1}L_iO4HI(i@-f8NDX?Z%iI^lx^jU5G*!yL$G`x_9v2uG8ZIy}?6|Jj^SQ%ItI2hQ#hv70Ya58W)Ff#Bma5KQ>xxpo-OHM$3QAtp0VhV^3P0mOxVn7qi z$?Fd1Leo#*~80x~L#L-Ktx^BDZWQ}w~AB_JWN388tp5Cxzia^KY4d`LGF6g8uG zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n@P>fjGl$(9CHK3)6n)vmAn;@p zg8=B90#G*|bbv7kgXYXYGz$X*g9HNu1L)id&~YDZ3=9mQJ=N?C4B&n^XmK>?avG2r zhz2bb2gz|WFn}(42CD&?3(^as`571(K<0wZy90>{GB7ZJj&cTJkhmfP0|Q9h6sit1 z7YX7!L;0XJ+8{kaP<6pjI-G%l0c3t80|NudZqOVpNM9}k=-@I2&<%YIG7Jn1ptaT@ zw}SiuQV&{d403ZL0|NtyZi4y`blNpY9<<#aWX?ne2JmWf(1kZ3KIq^ z$UPvoECa&v^X*#v5TfKunO`yi5m zVIk;lSq27%#`zCG$K5hG)HQ(V70e6_2N&O3j4Lu5|3UOSKKekW@1;G+w@O@4-(72E#gt z&LevvYdb*gDv&~a^)E=CTrBVk(hh*>r<4zJCkVsL1JR(<#6dI&AK1+x;BkOK;KV@& z0fn~=0urwvZCelxit7mz7zBvHAhSRi)b9AOlR*H~UOKXqK>*ZtoUxNZ0NhmD3At7N z$_@qrP@8Yb4h8{GJGNm5gMcst14GCT1_4mpS!M@=fFuJ0!cpPRBaDb|} zILshmaF{_r<1mAO%wYxrk;4oE9ETYM{v2Wu_;H9q;L9Nffft7u1g;!n5IAv&L4cD5 zGCvCnOHf(|U2%EmErWp1FT%JU3P5=W6fYpXAetFu7!p=soeWC4a1qdYFA#3c8{R!_F1Qxu5^sQhH0QIeq*`T~;&A`AA#lXM-%1_f77#OxP zFfd$UU|{&nz`!8L$iQI0$iU#o$iR>bx;^6m|NkI8R-j9k7#JAJ85kI*F)%P}VPIgm z%)r3#3Dm7&WMBYY;qA-Fz>ot9NSK9#lm_(+85x)uBp4YQG#D5fK#dj;28ISud6mGx z0O}TlT@F$Q>al|sKUXj?G=SDTPr#4|?E+$8Sb;?xoWHP$g9Zm~fNg*f5PKNGg9e~G zR3M@Zpj(R=Kq(BA)_=eR8BoPJ7#SE81Q{6?=rJ%nff&Saz@Cv|ffa(EP{qjL!HVFo zsApsdV?gkk8JrkA8T=T0qb4wb@&L#fP>S9GwbKDgNOVjgI>T~aD&6ESEnp^Ja8LT-Lasva*dmkK_EN9E`i0)<`Xr%hi+&OqRZ z8H%qXXMB6YGQ$8&v&}FA)9f=$z%(ryz_0++C=q600G%a~z{LO_Cj&_lg}E3Q zBJe2GD@m;Yt@)2)g}Ao?N+WAgU|`75D*|oMWnj1ik^uP~REC0R5Fd&i7#KYCAj&|+ z2Y8?l6gJ=iKd2fI<-ovj!qd+aT#@5G)MsyD=;uT(km)10v(zF3X=vt zs2f2Go}g+#lmi2UlU`9O_;dx(4LJ;;#vRCgAR43qib3k2ObV&)|DoM)x_xH4SF^+G_e>xqE0 zrT;}8xEL8g?Ej)JT#O9=i&_4QdT=o^bo>5^kBfdWpM`xO`R@(lb8Vd2MJH-M_8&e$!-UH5FTw)At4F5{zEoKY>93!k>aWOW$;xif}P9 zWHENSKIja6(i!{b|FsTRanMn)pz~b+m%afBmA(khV*G#2B38U4+3IjfJm~yb-v^*0 z#zUWIAC&%NeYmsqOo>MZ3ljrFa28{y?~Ptxp1@w;8-W4Aovu8fbBVM5|2OXpz4Kqx z0_M6Jfo|6a+O9XceFd0ZzjQLb<^Va~1{C0~KR_2@zz*mH$70z3Ql6~;|3wu*F;mI` zx@{b+^jI7yVSob}tgiWu1n44{V9*)s&I#Qf9AVwXJmK9HEZq(~yF?Tm=2#!<^yTR+ z{lVXUih+TFzhw~v1A{G#g2SAWN?Q&P6=KT+qO@!U6ddO8x9$ZUMgEh8zbT3lbggb$ zw;NLc|8};3|DqCHj0`WWL6_hBWGWJB{?Amz3z1;pVq{3`WIOIG18M}kR0S(x=5LY! zo6rR}fCXg0FR=McMS{)$8H;!z25@jOGIW6SgYw$Tr(hKAX2M@kv>aBh8d1?0v z@Nw?oTMl2mnE3Di|4!FGuS1SIOYkx<9C%&Oda~p*vT8`m_|p84IpFh>|D|vKmwtF5 z{}*&raHs2^8kufip6=Qo;G^PuOF_m%Pm4d*=`GXgEb&^Q`6ow_@c%NFu>Yb0T#O9I zon=5}-D?hzD?t(0UHZr9Qupc3VhKpbkMBMf7kv_%_mOiQW}XL?<7AZ&8Np%U;36W6 zBXZvY4p8B6fxVRC}>$)UuX}2k;v`c<|3!U3Y5iD@CWsGKBdP)s5kKy1(Z&Mue!(F&5M^?O1ysmEiyF{b zMIb*Tl67FG@1HD&|E3Jwj12!xLB-ks(mxsBL6=F28gMZ}PqMY<1<90hem}^-@c(}) zqlzm&BH>+^B{SS@*2uk{?Rx#n3c`h#AF~;VW26~1T#s)FPMaeN4 z<=}PlX^F|HE=6TA`AJ!6MXB-S6$SAX7G^P-#vlTE1e9JuN)nnYuygmj{QvK;8@n9c zM8QQEI4QOs*a>n?35)f?Qsr(@9WF+O9iYfP_=3ZjNfp#UUku`wvUeW@GrnI~3`!fZ zFE#%D|F3}*_9?s!3<_Kf3>-*e;6=@#e22wjv`PmL7(MgTobz)FK-&s}Ag7LidYYd3 zkevpQ9W)FK0gNz_;L6;j{G7~WpUk{$1_nu%ppqQVyv&l&yiCwBK#)b?3=Hh7QRUzr zIt=QpQRTjg1!0+~<^E~Gkb^ZC7*v@3lY&yyQj1dal2ai&KAkF|+aL^Cqsl=mlVOT; zSfk3pYmd>)aAWk$hwLdpb(1Yz9On9DCht_lMuN|b-lCPFc$=R+I3=DZC`Ni2q zc{zHi6{!pi`V1b4IUz-fdBr)2C8qEXaA1U(#mz{|+7B#8kKVg$G0C6M~h z5J!O9{0s(I#6kUJPzU1y9|OY`P)8P`0Zv|F29>H|48aWX3}Fne3_%RR44w@B41Nsp z;Qp^0gFjg9UY7U&K>cne@D2db2mq)gVqma`&g-)r?&~6J@j|nqKM=(PPLlL+w zn$FjH&*0YfF&t)OrQ_1Q4R6c{uZ zk{L7^6c~&c3>XX;EEp6RJdi@Rn1Q&M(PL0x2mtpDU||aiDSY<%Fyu3&Gh{MUFqklu zGB7YWf&K0ebuY-LAiu-X8z>|oDF-A2iWyj+2ssQQ7-Se283GuJ81flX7)lwE8A?#n z9J*cw1{bh>khoM}K#e^G21wj7Fz7I_V3>=lmI1C7v=9e05|zkM1W$d4+`_=10v-Vi zVJHIUiDHHvhD4O~$jPz+)b<5MDb+A&9AK8oU6a=)%%;4iVy0Q9HKyxLPnrHS%`j^> zTW+?=%*fo^yx6?Qe4Tlb#bgTxOAbpZOGC>L%QVYE%L>bS%Vm~pEO%KRv+TB>XT8{Z zll5-vL!bdys=1JM27$*yn3xz0nxuN!IJMe5+P?ELvNJ7clBzRklB!~2WHjV9;ACUf z=3{1(Vr4MMVB^weV`O1$GG}6BSrBCqVPK3T!f&9;%*e1nVUb*e41*0A`ZFXkK(a|H zxX7|&uw$?@P((75MdZAQDTkP(&XOiCBjwsZ|BpFtd0DxjNld_?iMh(4i79CTGZP~d zlYoWl^m?<>aP~1S2jX9KsOPDV# zwJ0+3}T41)WpCDVyQMEOF=G8EmF``a5pk&oR92DMpg#q z#$E=4#!jZjMusC>KLv^I>1a#P6!VJK_nw&DKJl|@NQCLDi)L|2zCnQ|g@>xsWIIpX z)jE>J_09a|jFO4pCav4BwQSnQm0roN?t0nWll;83d)`HObzfnBBBk@AX;s9{vreCN z50u{PU46Vyc2tu>R|~{c+;N&0$gw z%U(~~XJNUa)U3p6hW``uT{AmRO?8spu=DtW-tY&%uBNa!nfftaG+rcr!grPW@lOxi ze3&eJn=6j}34ZYU0bBdsCDZ1`@yvL%bl?7_*24)8@2}OkaeS$F%B|zl(Ry@-!<#?9(F~07e`L^t*J69dps_?G`wDT{v^{Dk@F$P#TGZj{H(N#EvoGhpQq!z z=v45zTH9}0Ry+KsFf7gGYL5LG7yLzHb2xv&;oo1^PF=t!e(#7_L&8aZ?YuUYkFUQ} zs9$6~`pzUeZl|ZwCu4&q<|778%(~Fr=e}QZ>iymzH|OuSb3J$sm!JiiL1Q;kPKa_e z6g3bA1u=&(PdMnL!J<3`=fr|kLlFZZkTAP2w@YbJQes|NW=>8jEIzn|*+McB%S%!X zWeuc3%D9C^AOZ@`sYNB3X_=6NOAX}>WI@u*!eUTqPzElBvzAGnV0u{Z6ZDub;f;e#-A>+n_Q$u}Z{HhVm1U^MJhM@F zg}cHz!(!fW-Ln-Y##4o63hlg?p}*?c<3n9NT8Fz8+tc?zdT`)*gFGK-6Y_ z%d3!sTzNJG4<@ajV_)-XOEY0HqyB ziNRsO#>n`eiIKs;5tOy%S*#2!49pgoEHG*_z*TNQ(h71?adrfkBA}EitIC3>2w`M1 zPyyK^$RcYXy+qPL9G1SBg?U1P9gPf3EOZTZO^uP`A5@SuHZpi+|9lm3$VJAmvvQ{P zwEazM7_Z6roZZkBk$0a%b8*~>QQQ zp&24;g1Dxztl7AQNEbj00d8S2M3q`pT3n*wms(PuUzBZVZD0v;q7mo_h+@z&zMwOO z6H638DWup+U%$M(9JOjGDo9k&NY*qkG1N2A0cmCyR)w1m^C)Piy#lD31~nFp3=B*_ z4Fy7(f8U;Wd+OddzkXou|C?FBVjst)p4z#;Ce=&w9Lj#@6x4I?vW$nY>Z^mvRX+n$ z-(6m1{q@6?IoiKJrCm|E_5JJoJV{HlJr@?2amXpDtK?WrRDaasxlX!k;a}Az9RY(E zg{w7QlzRn!d~^24hmb4z2Oj5g_20aa(wn?V*H8UhE8oA|$C@)AwYt~nw$;A~?_ZmK z$k=G2u)?2}$|AFJ54CugWw2Z=)QMI6)xoRwS6+9b_H)Ki-%q)w8cp|aX2)#1c5_wZ z-}tl5yOQT#Q2Mjd+9`8WpVihqTjue{9eJhG)UEM1m}A=At&9p6e=e1He&AhTf%(I2 ztR6ug`4+DZzsRX}X@O?`CdLH@O^kEEl>mB1b^&ED1r}QaP`q&`w0SVL{cvSu7iR{w z2w-(P6Qh_6zSuJ`1eqewqGh0Apte9|fl?bdvaR&>F`5wt$%)3`><_9-WK~(j3`AhI zFf+kf%&2V%Mm7UMHcp7+oERBdSeTg@7{LunSwR*h1BE4W1~P_H1`?38BM441#?G(; z!o(O{amn(rh_Q%pd<}f@`=70Cidjv@`RIxj_jevOH)w1CxnG&3(x7}{@{&ZFXU8Ui zf?ZE!1#W7ZY_m93&3tCpezXFCxv`O9ot5|wuj7H#SZCxFl-VTRpYQ_i7mP7`PaguuT&5;B@#YBT<>I ztny&@)rSG=q`&greW2HPwqbEjkpINe(5_udpDw*}EbY)w4y~07iJBUD>ZVEKf%v#@ zRa*_3SpFC^F+YJ8VM#oDc7=I7s%}{KRVnXT{W&xj8w}ABL{6O7z{1eLz!F|C8d!q3 z@PctaQo-o%1Zy;L2($U*=cVN5!35ah0@4POpmfM3A{3OGqTrTap%Ch=;FFn~S(2J! zXlGyplH?XPb;(T6EJ@5!@N`iCr&k4I1ziQi$;iR^X(i=}MX3tlV@AMd=_!;M!CG?M zBHS*iWvMy&1)x)F453ysW3v)(cV>&cM*K-#k43+JuW^VLJkHapz9H9M{ebU}6(`oR zuWg=FD;&_bH+R-HX~q_F{!E8o;>Whit>kcdv0=5nFmux}xqV^Ev+T@wT-?QQY|4Mm z!)9{l_VTzNN^PAVGBLiSt${sHAWEt5vuR(iuZqJlJy61 zNaLi5vEHDGvD$zWlnaHy{SuU}1bc&l14v4q#nQmsz;uD}0>d_aP-naLtxAciz>Ak6}9&oMAE{zuEq;I7zScaskbmbw19pe`aOGW(Z7e*jO^rI&|- zZvNKn+M8W{eBO;EuB{z!(toc~xO(rzokLU0);6(iw>=)2eC@|>k9Rv%zr8zqyme#F z`klu6eP4XoevRXgZN~Zf)NMsa`>!wI)RVQS81q0~AZ}3h;|H}x7~2f^K^*X?3abG#C_{mpH{ce> zqx$L_hWv|L*Yiqptxn*k*;ejfZ5m7&#UFXLUkma2 z?Y)|P&;HuV^ZQL1Vs_6v|EH-_+HyhQ^lkSJY-a!OGR@_HiI!x{>USTk-)Q=66+UX- zT332?%QarMysejVlnc{eeJt!-?^m*l=jWUKJ`um-Cd|&YJl)n|-z~F3%;@UB+?^kP zY<_ip;x{w*iUaCeqQ^6?eL4Ea-|s}ay@0O6{Eu=c6Fr_UXZ~YY%=5vm<6qbd{mp0*^mdRl4LQELE>>6@);n@iW(>* zG_n|qv4~X9S{&KZ)aR1_-fra$W81!{(=j^@8Ydx{!DHCiY|z-Sz^}mv&y1l0gD!&t zc;2mm!5=&i30iFjn)l0NNI{dSU@&7aS*X{b11$qU9qf$E^o*j^D!t@G8M z&c=Ha9o^g(d@Sr(7~_6U_`Fr!1GO23 z465(st}+!1#J49MwA?wf#;Be#^ZKW_b6!`=`BhrPG_L+pe15aK>d$ni{mP57Qcq7; z)!TpTeZ=ee{2M0aDPHiCO}uL0IMFn8QOA>%6~TYIL+xKmeY^ho=j0P7l71JdENo(| zGiYM0LWC%rVH0DvK@(#-DDkD!WUc|r3Z2+;9#%qk#;Z z!^vvM59vu5S{N7@nt^61FWDTITQ_s-P1ZuIub4657jscz=~>xk z@eM%?-6mY7-4d*;YSWmjyUwp`=Q4f!?disu`Ef_5pV3`BJ@h~K{8K+2<{Zf1l*?uF z$x+y^_M68p-5FoLR$LAJqI>z$Dz%c9t8(7qs0x+w(5(L*PsM zuFbo=Z!PnRefPlhx_vjn^uB#J=3U+=F|l{wEiivImjm+l3@C*p0%9`c1VGkJGbAuDc!0DzFo2lgLj}Ndg^*^M z$Dm;Ark8Mm7ELff4i5m?kE9ZL-E<8o7!;s~4j}mjq#SwOH29zg1E@OCW;KukCN4um-0$&{|v2A~g}H0w@JC54OJA4I~eW3y|AD2PQz(fGFhk)!?uL847BsgVvja z6hJZc)=fhV96^*v^BWE0lOElNJUYEBI=u{xFL`vI_%CWJ09vK%(R@VXFnIMOobU+t zXns@R(apMBfq}uJ(?uo0qnq_OCj)~=_f3yp9~A?SPDYPz*1aH+-VhMik;9{#bt{P9 z=_ugQ&AJJ~l4tREd^z44&)0xoW)0v`@@L%*jAISa|l@$yO3_iUsDiymx3&}mY&v|sV zsDQ2+Jno`W0m=kEol8_eI|z=qs7zpBU;w3ekkAZ}zRo2o3&6D6f6-@r3=FLYx_|I@ zs4;?qiqE6hMWw*i_@t}x0kGL1i#0&OsqkO46R!9t=mLZ878TIOCF4szy*(Fq7vZI?V}Rmp?$FRKuOtg7ZnfC;&hO$ z87`eEDh|h8R4hOxhevM@*p;BrN&rb4fZ{L1vo}QLKZvX0(aq;-d=eCXAkRR3I-M61 zEEU2aOSFAdGCY`lR1!QoeHmVJdvx>t7tQ5mVCX*X)4fFH0N6o$R6ysqdvtG60o|YK z(Y;0mvk;3A7Ch6h;Leoh2#(F5M0suEv)7B~~9$p3hOK z@aTR8iYo<=?#nOwm_VsBL`4G>>jpl(J}L^J7`1q@^bcrldiRG45s%&w6$PK}qaNL- zU&MoycjjAobmyp4be0>u_HDgXVh%DGq!VPIEl5Roh>C?rcZ`aH$MJ)py_Ek&w{e5) zIStx=(9O-j0MaUS+}!}YR-SVoXpOy3XSfBZEIQv=Zt!1p9aud$wqjHYx{rBum#74I zG#`mL>?6#;kR{B(&>_sgutJ!D;kYmZ!&6}f1||^(hIkPMhQ*+|hl7KIk%NPSiGzcK znS+Cag@c2Gm4kzWje~=O9aLx_VUJ*s#y60(#d<>;RK&GFl3uUq!B_wPLrb{~kM5=h zDUd9qM|V>Pm<1~5nkGP)0v_E>GayWf?j}$@-|48}(cPo~66@^&7Z%`xvPlCZ(h1gU z0AYgkT0oc*9^Fk25T-(RlLv^^8={f{EhruSi@I@v3aTj(^Ll+$0{)8{bAeKAj7kD1 z;v9TBV^jx(Rc(DbjanhNAnvC zpKjh(DNtF&+6MAM_r;x{gzbTF#(qxFCC*5(kd~G<0gNa3bl>#QzR2G;hmnE7v-t-{ zQPQ`A>?P*k4l6P^cOvX%xw7|bOi9^EWlpqOYr$l>|_Wa$Ub<_GM)tp`fkJ-ZJdPD`86#lqFW z=<)xc=l>I>pCMvUr-7Xaab?;B&&HpiEoH?{AoF~>L%29Rnhz>?bUHrp=?r|~(e1+Z z0VMjv^Z!YYPR9>Eoq<0}uXr{;kbhb9|NnomSE1%j@M!!6YK#_b-2sXuehC&XehC*Y z2am>s4WNArCraOVG`<9>*a5C?x_P)jCUf}kALjJoKOD&6)9u4001}e$;Xmvt01}e` zi79}@G(4IQI)KC0VMjPbd_i03y=+-jXyvXe{MuZU07Zi5 z3y|0Ykk}27*aeT~m*5xzMPHx*NF3}kNCbhRS&&ftAY~*d6P~~(cv$l?iZd{j3V0km zD3JF3Ab5X^$H9{VFN6O4|9=L&E056LK=7CZ10>6mx{D88eI^59&mqiQhEYJX5KsXf ze1~MZM<9fg0HrISbQ6@G0j15L^bsh12TFf|(ri$3w?O#{P#R)7DhcbGgBm-a)%kN2 z7#QXVFff4jFUc!kHkocZ)48LBJ^jIUqr;%aC5ii&@={CU9erKQOkxsqQ_M_aAj4u6 zW+t#rOpGjy3@lCz42(id3~ZN}3>ejT7}SnPFvyokGDxRLF^GpqGYFf=Fz_?VGJwuc z`5?r=z$?PQ5TeMypvcO^z#78OfGozS$j+cx!pR_-!o?t9!pFd}h=GAof|-GnQHp`d zfPn#QA935KPy>oqJW!z0%IraI?%7y{OKDgB|2JB6Uw5YVAa^VcoF^c_z+fc6z`&x& zz~CUjz;I50fq_Snf#HDw1H)4x1_lvD29&f7O8204w1Xm~JuN88z+j-rz@Q+?z>p@! zz>uK`xx-_Y7z0BID6`PO&7(%rE(AQfSwBAb|KD>bEJJv-9w=e;v_4p>@6*eA?ZN;5 z9y=63XCHhAb$%E;jSqP40QcekGcb56AMoUNIq1>Jx(=l7`vs3q);SOU|9`pt2&gG> zW(R0o59)NWAO`TER4b6g>_Bw}sF4d*gG>!nJ@pOi{>pgxZc5k=#YDIW>Rv`W9Q!L( z;rlDyvF@+*!n40J7;S&$L>&7oL*e@Amb8Yj>?N9292qx(}w z_osrl`LHmL?oS=vpE|lfb##9!^Z*KlkkS3Aqx(~tLuE(zrxLqed~|u1Ne14tkRF+Q84)t&6jYK-F@8v8yJnO|L5gWUi0*Sn9(zqi- zxBZ+ZP~NbbwRF1a*QrGx3z`&uePy5M<$u`Bn&;l1Rjb72#9dZC(JVjh{f$k6eN3T; zRDQCt#_Vqjm=d2CmwNWaJ?K=H2P0dxj%CPOhp2}2@-0{BenT=41Dpi_;Lz~?t-GL$e> zGJtMZV_*nlkcPW~T4!8?!p4Dt2Wia!?z5|r*J^`ytm}jJrZX@wm@#l8=|`V^2Ax%` z!=S)m$^aq_pd`p%BL+^Q*A;;51L-jX>%o8Sv>W)8?^K3z2GFUJ| zoQMpHvs|#MYz9zlGJsDIM?J?{fng=mdDXh$ldBCG3~7FHHS&qop&+kQaAtK1LkOqfXLvXxe#<2-w7Xu?hFhc=DDnl|uCitvyC+OMaDd79_ z%ot1<6u{w*oc41VQjtzEPhsF?;KGvEk{A-9HwJ-LO!&ah1P7f+k7*|8EO|(N!fqOB z&P6_V9h74=7(y5_z^7<~(ux8@2}3@E0z(iqpSv;SGgL4rFoZIAgU>g|mcL_ zRKG%8r3dyUF!Vi(rP0r7? zN-WORD>GD5$W6@4OiL{;2}><1&dkrVRWj5wP_pCYveAc`Wf$NG+Sn4o$iTp4z-1s{ zAZj3Epk!cVkZn+IFx_CO!3zUULt#TnLo>s6!|8_W49^-~HoR$g&+xh7H^YC1d`6N+ z%0^a3VMZ}VxkjZ%twudYbBtCPoin;@bkpdu(KjOoV?X0y<0#`a{DUYdwsg`MlX{~9C z=>*fmrZ-G~nsS+mn(3O^nR%LpnN^xKm@P6pW%k;P$=ur9-8|X6-h8(C7V`t<-_4mV zlr3y6A}vZR8Z35M9J6?8!Dgvu8EV;KImL35 z?D*{!?9J@m>~rj!?5Ehzw4ZOk)c&IVHTwtl3)LZXtBrQvc(IFcNX6*{#nRcPPII1dDZfv}|Yl5^U0Js%#oY=mrOY?W;FY;A3wZGCJbY}0IWY%6T*Y`blz+RnCJVSB*#r0q4^ z@3xF~GIri}fp*n)jdpYGw%XmabG6T~FS1`{zsdfmJ*Z-~VPs(7F%UA4Gf*)wHn24C zHHbDyGRQEfGiWyGHkfEI!(g7lQiIh7n+^C@WaKYe?!9#;*25$^L7<@DMZNO;A zX((!_ZD?j_ZRlp`Z5U=4ZJ1$LW>{m`W4O|Az2RxY=Y~HGJ&gQ};*C0tCK}B(x?ptE z=&6ykv5K*Qv4?StajkK)@m6CV6A_aTlQ@$$lldkOOax4oOiN6wOy`*HGQDH^%JiqH zk(rfQyV)eOS!Qd@wwonelv&hSv{-anOtkoI!DuOBDQ9VJ>1^q58D`mQdEfG*rIMAU zm8X@TRjyT$)gLQnYf)<*Ya?q5YY*!n>uBo~>oV(l>u&2Q*0ZgbTCcX=XnoPz%O=1k z()HcX=zHPHzx7`xEeRcx&y7mF~vG$qvh4z*9t@bPJH`@OJHIf_{7(ka?aT+KY zI2hC!tTjkAJZo5IG~1}yc&71VV`0;MrrBnb%$AznGW%dwZNA?8o_UzX4vVK2-!1-H zh+Aq{8e2Mo-J5DzXjx~u$a0J2At`Eb+iN@3cE0Tn+e5ZjZNJ;<*(KYR**&vkw)eJQYkvmhwg3hO&^@7!2EGOf z21N$F22%~@8f-B*Yw*(Glfe%IMng73Q9~QURKqgEX@=28jYg-9_>Du2XBz)C7BNvZ zNi^v-S#Gk)B;KsnY`J-?g|MZzWtwH3$ zk>NALSBCElKN)^A{AI{!w8iL@(SIXxVONHwiQ; zGnr|!z+{!l6_W=h&rCQ?1xz(ftxX+Gy-Z_G8%;&bOw63je9exVJv8Gn7c^HhXS3k8 zkhQS3@V5xH*k|$8g29r@lHXFqQqoezGQ={;a;4=u%g>fSEdN`wSaDkkSk+r~SoK+n zSj$;!SQ}eASO-`)S$9}Zw4PzT*m}M7D{FQeKAVF!$8FBp+_rgS^TOtX%{Ln+TXtIy z`!M?$`!f4#`!4&*_6zJ++wZl%V1L{Gq5X6FH}+pa;adQ?CsD{i!a&(T!@$76%)r6G z9h!5>3~CLU47$NNXNSQ_gYyOt44e&bn>;s>GIcPmGTm=F$$YN)QuAHrXUxSd6fK-A zsw_Gz&RA$z+FCYSc3Mugd}S$X6>4?B>X?v`6ztUp@MvN><_!sflr zcbh*p47Mz`y0*c#g|-#8HMR}5Ew&xDJ+>2Ur`X=JePa8<_Koca+c3LCyBfP@yAHb^ zy9st1?QYxg+Kbpr*vr@}*sIuU*z4FE*jL#%*tghs*!S4K1(gX63=E)S7g!Cg4806f z4Ory186PdBzOS!Qz1 zD<^kr>=H2GI&4Vl$EmbTRSr%J; zw_>!Gv{tazvNp1|w|28Gv*x#Hv1zlLVYkZexZO>=*LHvH`0W+#jX_~Qfq?;ZWWi~p zJ4XMF#EfN(b&L&-J&pa1!w zbu;xb4K|H1Wnf^~06q?fA;d7kFvc*$FvqaKu*9&!u*I;$Fvd8+nBf5E-X;cyHzprU zOiV3IBTOqyXP7QAJz#pr^nodZnSz;vS%O)E*&MS4W(Uk3nEf$h0EdW!d5n32d4u@^ z^8@A&%o!{cEOab9EHW%QELK=BJYZk|ofRQqAY#yAm|;|4Bw)#5RbbU%HNk3u)ds68 zRu8P6SiP`%WA(x6ht(e|25S~;4r?B30c#O!32PZ^1#1;+6Kfl57i%Bu5bGH06zd%8 z66+f47V94CDb{nWmsqc{-eSGS`iS)z>nqlGte;qm*h<(c*s9oS*y`9C*qYc{*xJ}S z*t*zy*!tK8*oN3f*v8l<*rwQK*yh+4*p^`AiW#bzyQL6Mhpxf%$vc$0K$AX7#P4fhJk@EhJk_q0tE9uVqgGa{tyNR5Efj; zzyQKRQVa|rEL_9D0Kx)(3=AMF%*MbV%oZQ-=^Nl56cX>^8tfe884%(h6rY(_kY8G2 zY{U>B?-%OhgQl(%sF?A&MbBJ~Ou<9!=2R zA7na6O$4$cG*NrcV$Zw+|I!kdqRg_?BL9NaJdhTT2!yFP71+Dv1mqW$1f?dXfauWV zjKm_4W>JKlXCG;w?1 z#Dai~%HoiGpG1By2yetu9U|?9q!N72fi-AFi zhk@ak00YAeAqEB`K?a5lUIvC6d<+aRd<+a1_!$@;@iH)k@G~&15@cYI5@KMe5oTcU z6JTIq69yMZ4D1Zt44e!c3_J{63<3-+3~UU%415f%41x^&42%p+c;%THplJr4piuH3 zx+E+;fs+%uBs|H3Q#@1_k<4HQL-HktG|Xs7QpJ#l8xF}&xZ@hV0K;80VWxCKDH^>r z#FcJ{Nz>$%<)>^<&ix|Np~m1nB`83vwV61JpZ44h#%nCuhJ!z#as- zkr^gp0#XCg30Gr^5CMrRf(R%Ena;pq1?7P#CWa6O1_o+3;<%8#OiX$)GBrXy8n7EY%hc}LPG0EX(VTcrN zkbHKXK)B(_XQt2~0w-ZmK7;W=G$`Dl3DX3`2VqdMy$oU?VURj1hA%N;D#yTpr%OR{ zYBYl-Mg>s+3Y1BG7(peN76T-6L)!t^TPMg-$biftCLiFl8B`>p+YGDKz*Q)+Wu)6| z3{6OAe%5ASU|?flz-W=dt4eUqjAAwE;SKNSqK3B)vjS# zup1WSkcI@Zb)<*6DfTee1y>vJFh}?s9_Wzv35w+;hq@`OibjiZbp{3oUQmqVZ1+%R zuZabAU(0~%Y>>UE?I{$?kU2!fF0^l>faXUHXoZbui~!jxl4I5sRxG30E6>2d02;Ev zY~`a^M{-=6;Ymr{pfDxSs-(^1JvLws4+R+`;H`Rxu2sX2@=ToEkD z7%?@6u_Bm}k$q|oqb7$qV-#3Em(d0+&cs*;ro|ZJz_b9A76H>inaLR-v!KRfPywzC z3@L4F412rGePNOx7?c#anK&32HZd?ToPvl7s4*}w2!PoQj35fcW`cwhh|9{r1fm!i z9x#FhSJyE?ML-JSdJzn$Fh~=KDZt3cu#k~~LF5MmgAGV9fsuisfPsM_fRW(>H%I`A zFEBC)fE@tk6H8rSVAue4A~r30C8-r93=9l+H$t5V@;fLIASqU0U`Ws_N=Yn9WMJ56 z#K6FCfq{X+gn@x!8903!nf z4@eEF2f^kQ6&EFgq(ET;3mYD6>QZy^lNlK9f&6*_5*G|L80wrrMvY?35b$Vzqv6qP z`$v?KfuTgzqnB6uFayJX(cA+J3?ALQ&qNs+{)-lXILBG9g48fDFnBZ{(Kvht3Ot(M zcr@FViZC)TmAV=q@ac6?Nl5E-QAtee^ifGLKIzfvqhjIF>!On3((B3W(dnXM(CMS1 z0TNd5=;mz|Wn}0GQAygxq2Ms*zv#RDVBe0=b^AGOJ1x#SOUmXP5)T7eCz`(GJ1r!#YTT~7(F)+MP;0G%> zh_2v;JIID!UIAf7h>riFOZS1okoTPsBgi}52N@W4rGiR)QI~xT490IgS`T=1f8cMq z0gB#k-s3`y3?AJV{)@_iw6z}KZ`lu)IN{N`N96<)D1rRh%fJBE^@G1<76aHFnqYVE z&Ju#!`r-gDNW2B?a*tl#M!3XsUIqq_&Kwm3k6zwvAw~vQ0ac{RbVyY^pn!d{U1J}Lzs-Pb+3PrGy<02!+AUvxT1 zTleYzqT9d>h?|Ws8J~3AVb8$N@L!YxV!jypbr6m&Xr@NZ{TIKaS=*6Ap~zl~M= z00TpZqmV~$kIG_328I`=d?2U7f&yX=I5J<%=7EGo0?6$VAR+)ncz_58kKPurl|H?! zk3m_ZSM&~u>U2@DIPRii04nAjcm8MOXYlAgecVMw0~BhY&;v>Q7d6-eiu4ozMfJgq z)Bi=)_JA@7C^3Q(7bu$Z)`dqRbIeoqX1$H;Dx&SnN z*6jwTLjIP^UEaqvJR3yJ3)!Lm-iPx)YcaY+#vVCB8B%MT!J0!J|C5W z7qOg>*a4-~gZy|>>XThymw0p|r__3WkUOva7k#!1WRs6d1$s(-3(^KksXQR}_JXW@ z#Q};D%rqMXR*Ifxx9q~1W*b3?94*b3?nO(pIeX!0HhC{%pipVruvlHa|6aPi4!Hm=YMT>T#r&$k>_1)OhtV6Iz^BV<^?wiJ!Aer6xxu;}R>;JP8n0~Bl5b}%sP0JWMtnvW<%A9maU$%_#E2Y0}egb6}_H%PSmbnAgq z!T+MuK>9(=Z;1Z?qOCi?o&}q>1C)y)641)_%$YNw`ufFnHjpQnI$8hmFfx?NcyzPc z@-Z@i3rG=<)&nK{Fs&Mgn}0Btd^A1)ud_k*b+_m-9&puJ64m^Ru{0E1Wio-P%m`2g z2(B_CJ6u$vKow&GsLG7+=;pn}3#~Fiq7mTg5>(`XUEk@VqVQkTUSq14CLj%rhwApW)HXdh{E#7<5qyXtpf_ zSr2RexOBRxxPk)B1*!Gp;L_{K3Njj{_0!J7$dJ|cOOE8K_@8ux_Py^A^!IO)uA1r>H*aD1Un2A7!Hm*6+jIt8E9aDI3Tww z{1?sK3d-Rn^E|piZMsf&5FO#6?V=Lk!F<@G8*V8$QFt`J$!NAMzvQfgwvvuz{J4N{nMkDcgA*53zBOKs9o!$;s`3KnHd=vj=88fFudRf#eXj= z3n-`e%D&ykz|i{NrZ5KDeZJWoz$iUw+5v0GDw{jcE``jS6fa(w?5Tlnj7%cjA z6S(~E?g57us2GR_d9izrN(YE;JOT>V_`{%fWgxgI>bL_ObdWv~!;7=bpoRwPHBgS~ zh4e;zx=(|{tFuN$;l)`{{{brTU$lJ_0|PikyzT`jW@!9@^P58VEssv#y=;sOFCsu8 zbG!RTiDvU}#!@3NzxfAKCu=<$BSWcD_xTrW|Nj4nq*Mb?g%y9e**1v{R7SAAnEer! z>bhf8pt3N_&YU>|wjP=mLBbx5Zy=oz)})W{lyd+aa6T#upriuo?Y(#k3XNVL6$Mb_ zf<*p{c5MV@nNmYgKMgEA1>Arvh6qc6%8MQqut~;eUa*3~q45aFs>9tbDhACj7)z9z ze=wHb*a5Btx)DmjeF3OauxmlhXP7yAK`w(zf}9VopFO)hEquE#`g9-aW_0O3;n@7} z#|oAbp>9VGpJYdt?>Bsy4|yb?@KHYKnS9W%n}@-(+ex6?gTs^Ai-UigBl8OW5^nx& z2bv#z@R;Gje8JQBqDS|s7r_kBxPn*ZVEcSJT~s7|I(<|WJeuEtJK7PhpnAteMd3vN zsB6)D!~!XJ!FtY|NlQzc0LBwMta*RFXJ9B5^f-7>Anp6X|Nl#wJ|Fftcv9fyLLLSN zkbf*ZT2K0PpDf|^XuVXz;oEwk)WD^K@x>=j2583()UyJWzo0Ud;W&8Y=S2wz1H%r` z7?20Z0S%T6C0riO2N^w@Uon<`^k}_Q%I4T1_=1m>g<{Wf1|?9CgQ6Xj=U?!E>;Vgb>;adBDEDI}B0)!4o_ie=^80Fccer)OQAQcytB|cr+h$ z@aPP@;n5lR!1Mn}kIujs9-V<7JURn^l-_tf1)QWNc<>(<^x!`n$N?fCTKEqK-T?8y zn)nX~z5sDPfQTQZ7d|xbs4%z>2}-!%Fy68 zIQu$y%Ua!|`^0eukj#J4jXk2Qybk>Q24B*-Z#DjuLAmKx9?QHhF$ zM|X~j0e?&S|NsAANQr@5U6SzPp)$x`>9wF9C##7vBg2dTiePpJ6C=ZmW=W8;3X>PN z6u=C%7ml)EhOF_)7u&c&%u=Cd)?g+^21ZCR1@`ZYZW#uK7uN(B7+wfUB7&jyQmJb< zt2z@SL+b(lzWe|F|8IW5Xer7EcDDc%BSR_ci$>5WP3vv`R#3h5!Wm>vAIO}O5)2Hz z&WxafKKgL;FQ(Fr7ij_v47+YHF))C`<%PO9EPnV~nn6_qukKq=6Ys)*QIjFAG&|}bUy?e-Fm5%-%?bEk&&U4-T1)E^9hOmK0Hz+YTA5n;Z35sWE`$3`8M+MS`@aR6}(S7U1brS}LZf}Wi2b(;S zf0W9;*v`zraGZe?6!P8@3e6|}gADTkC8+qr-wryI$iA2gRskv}n=w>?vaW;iw{Hg- zOC-M?6zDAG;BT1=sua4N1)3lJ^XO#m^p@y$mgp?zXnyd%`2^ES(7ZvXvqY)>i?@a# z&mJ)Fu)a~k_u@W;m*8Q2qm;Y*{0o0WP~t4*0HwRf1`G_}oh3Lx4Ta7e6$}2BWef}q z-P#`A!2;UZ0v^3ij2@lL-Oeh_FBn_jb~WIKyZ;0=om*5^ure@!+RMBQ3?=H*fe~1_sCOo8T_wrxy>o zz@=1)f=~Apl?SX03@+WLeL!(=&7=FQPiKgV!v6~|L75ypNbrKm4dl%pl?UKv<(}mr zo{x$H+|xlnAfDa<@w5ZjiJhQcV=uTL=>i(=ZUJitdD`N?Xu)!rr{kce8T=RZUXJSN zZdZ_}b(bT1T6{UEl|M%Xp<|?a*P5 zmaPX$c|3Yqou7kp)Dext9?b^?P}`;;7l6mB%#qZKBdHg` zR1c~DyKlZ=hU($;=w*HUjDg`bi%0VT5szNctfveNof5_;J-QF2rA@GwC@}`ND-Uoq z{{;ER8SEeS-5~$GmhWu_d1xodFS|j$YW~5;?{@PwyGQcD?wCU?FXn05Sioyin)|0;77d^W_c!27Xo2B|MKK%RtAJX51G0C~!3A51N(E$$0@T`K1vR0M`*ioHfbz-C|NsBjJ9Z!Nu|DY2-J&u9R7`Y+s5tPu zAN1%9Q857ZWDGpJFM-l@!EqNA56~=Tr;Cb(ZNfaSWCB_GixtRZFuyj$e;GcV-`M^I=fq-lV zC@w)596tuWpvKJ25_gZ*lO;|dKiPt8PXMKB4RB|~xBG-o_aTq&iypnakuD4jFSh&x z)nt{-$Cw$KfBY*oezE!Q|NoH2@oVlE%fK8^1VO?RrAP5X;}0Y(n~xZP^Ek*IFbo=F z;qYjD10Lb&<(2&f$}RFsKt(Vs2WYOM(?uo1)%XA?3=%-&7ZER>P6oBAKpC^SMkRou z#1Yi?hYuHefIMLUDyYEohZ-KetS5d#G${CV`=|u?fCtLDLqM~eFD6fBV0f+M(cPi~ zc0ecVlwY870m^MYz~Rx!st6M5W~~BIovg2afZPU)ZPqtG85oYU9{Rz+z{$dJ;5h4^ z9}EoO(z}~A@e#yY(D+*{lwI&&)M_yULno`wPgr9s%MnzH{1=s446>OQRDS#yWnIj` z&}_^0lYxPulnc@*b8-X)&67n847)&9fg9527J+AdKyHVY8{qg==)U>la|i=N_vsgF zf;%nzf@w{Pdj`T^76#*cSf47^1!VvZP$pFH z=>Fx=ebb|x88pnz^#6iK^I;AT>-$A-LFpATx^M`l6>L7V|5vK}!s$0Gx1yvjNY;IE zxw_1Vz}gFCnIW~5@Ft_U---`K{2n{HvA6*14GHFZr12O3=BwyB6+RZ zR!^LffuZ|miG)Wlud+BJ!wb7euq!w~K_&ze=(PexvaB39u5Ha1gWJZ|_lu=l50sX8 zbaR6;B-8(kuwZ%FdZ0AcqnG!XI0M6rzzDG3U7!f+wY?0YtnU{KV++h?+tp&A1p)FN zy}XOW7#Ut{jQ~4@A2g3~(y=#y>Az@~7$XCutqBQtNCE=;2V7`^#=#}R9YY*JElva1 z?g!nsT)JO^ifNVEs z2Bo799^JfOMHv}hXn?slKp9oRqxD;f1*l>JcR$l6cr?G}0J%ZI!}?y4yhpP&Ly5RY zxAhAa(14Nkj}k7A?(;96gQl=AyuR$wD=GpChF;#U3mF(*O!)i%zelgAAVi315d*`E z+Q0w*PjGF0Qo;psIBy68gKO)PQrY9IkA6XNs$;K@3df5t!3+$J-Dh9C`Sbt(8Bk&j z02RQXsSpFlSjQN6wG3~6H`gXGz)am945@lz51(;0KH%6J!1xkWUV;)ZD6P8mIx)Un z{14nkhUCu|rl4kN_X&^g8!xnCK!J1m#ib|+?ez`R4mtf|6O=y-N^c5>$nOGm&bm*( zXaezjdAmVnD$r|G99Zk^K+|&% z<}xsNBzxF+FrVPx?kM8X8^R&Mzul3o^+1W7N3ZEhP<(X%0!P5-WhLs(hZ#MZ4{2E6 zD0<}4D>``*1A}Mxng61bK&G@FC}H>LKKuW|Yi5t`qo8>305x(!eINzLnE1HEQ2&&u zNPx?eZr;iFAU+ZQFUkRNZV3<6Cog+JHF7Vn!y=GptRUulbl>1_fk^nM7=T*0;BlxY zzyJSlu2C^yt@j3biFYoj&4uJCpI#TZr!3?wi`7Q)`*&SjfM*MvTH6#%6rvOrhJN{lS03|$J@%MQF$oFUdi(Z-y@gM&9 zGd=(*XFz!aghB1gZr*cuAl?!9FB&`tRH5#?!@vL zFfceCcTtf6Ro}j?-}qblKvT@1p1T7$@xM6m6P!jISnJ(EY2@WBoXK7tT$)WtOPc^n z|MOA8&l)ZL&j*Fyx&NY*W%1uoygIUe0{pzvxv$=@OisvRH`agfCj9^IaxQT!6t7iU2AV7IpisG-36 zVjqMT0pWpCh)1_~286c=B3A+7O#$<|LGx)4fo6yRDAjxPvL3z3z~EthqJ;HDHfR(O z)cJZL=*Pe?!J`|r;DG_uOg8{&l>N}m_`g)#qnDNG9w<(HR184+*j^Yjfl>`v;|d=J z21s%^=L7e9ld;{cw8^)LZi&{(vF;BmU01t`EL6viWq}GC@zyr3RM23Vx<=YGP zAOHWq2=Zb8ElPCi=6!G-Vv)dq(bVan((d$iSZQ|>A>{;?+5(k&vDpjURs^lx^yuZi z3QltN(?RP<{&%wWU1wk@<>}__y3W90eWK*j>jU8I1nxM1Y7m7NA)xRBr|uG)Zr-@- zAfH_LFPb_HiV(-U zzXvsmZu}Q*o65k@ed5LQcc6i0u*<-XLJn_G{sy&oAe8{PkzoAaqx)m?+5ezw+oSv3 z3l30o4ICDw+Lo-3J}@wpDT9iQA5$3^TzcofU}j)&v6emc0n{S=&F}u#`fuq84_I;1 zodX*FFHvy-Cq!_2gact8w9)}pI3Qa;d33*YY(4|F8B!&Hy0YD%0jd{42v_J@vc`a1 zp$c+E5sE8ZAg*xacmLyP{ipN*7I$>lsDQ^_!DGar0K?&)Z{W@sntQ+t+Rnb1ig1h( zD5L6HvYvX+z)+^zeeS>LgDIeJnFkG*P47YB^4XE!{fndZm(qRsT?86R2IT?p`cMH# zPj|r-NFm?Jng^P?WCh0|X!(PI<4(}}2T)=>0cx3nrgHy_W==uO79gb@NTh?z_UPtS zeGjVC{XqsFXBBx5YSMw5!kFqI>7xWRzE}gAc}-DKa13<}a|Devf=6&bv(o=XRi-d7 zOxOjQIq&s4@j~n$Xwd(LN9%!7j^-2pUv2^wo}H}n?2HWHWhkAzEbNR79;^(YC3n_0 ziUW=RgQGibf@4QDhv#u-P+P|Fm@_ArV`nvwV@I`x<1uGTF2`feRv?i8$Bt?r&*sAs z9^I^`*^mq>I?&C#ij9%sHIwoGwB{O>BnJMLG)7R%r9>qI+(wCDWMJ@2X7g-5#^T$n z!{)f3frEj;(fYUxzt4}|pq7lI^?Cl@C7`K}Ue$ayMh3W_oWK(qAU~DVdv>zi>1K6c zV`OMPpwP)`&c?{#+1m~A&CTLKP{x7z=a@4G1BQnhk}Vq0e00p&hXLdz&u*4G@PH{g z(9L>_6|~gtFr%aOasHmX|NsBL7I5jdJ;KV!@S5GHSM@Y2BSZIn*Vh01eKicArjaj$ z2dJl#}L z$!v1Qv)h%yqmvD!sl$!Kqt{Ph*8+Y9h8NR(!TQ*m-FO&ZgJTplD%^aS(X;s&qi6F` z4oB)M|dvxFP$i5xn!7OV4a(Op1c%2@RMUl+4Ff||1h=p}2(aINa`RdVYE6T#iVEoOa zSCjbcU1VxAH%kZ=BrUYr1`3)nqC=^dP7JgjdN-S_C` zfAJnP@6c)P(R`f4!}@Q{c2Eg#0P6oix<-%^7n1K`B)Cs&&}_S!m5~87=_v!6Q0W#G zeF~byf8x=4$+i1PDHmuY7cz^+zl{krx)A^>s3Teql*rrImasTB9{>*%o&4|7{p-^@ zkM9>fm@jrQwHzpY=-BJP2p&rJNIvm`{}*&!)(4MH)}mJo45cE7hB3kpP#8IQbjwb7 z0vZ6!QSsp4CfstVBny;{Jep7b2aUS?{p@RmkbOqQX!iA zUNSI%lG<5VaD)3-nDq;&1O?T39<7%^(Usua{qeXfxDfX2{^8U8%JDcOs4N04{A2g& zWCGq(4HHdx2(0(q{K4`iMP^DX964c0Lw-#|W7X*pFY*ZQr5zoD8@$)neqv6R)L`^IZ- z&`d+?H~uLHx<6ce*?O`>y!qgNkn`A&vB!Ws3-VX%$P<<|3kbCjY*J~K^f8k6vH?>grKx90m@+tprXN`*;a@N zk};b>Yax1Vd!B=qX@j=GfM$TMA7ib10iKUL(gP|KWdAaPmRj1HfhL(+Z&~%29F-T$OR4gC4*XHJ3v+J|NsBxJ*+EK! z5}xC%<c+VvHs{Kr`no-=^=CB6iWKX3Xzi(Bl=|NoxdUpzqV+fQAfm_7zdMFBqDDWJv9F)9h5FwO92KH>lh)ARpD z&vb#St((n1m`Ye$50rZS7u^Wb2(tV}iA{qALx~tTzcn9VY_MP`{q6x}ywg71e1Op- z`2)z_cb{P~UMdY<@Sh4c7L<&UZS?6r2H7<5!q*GrxYPedZ9tZF!yVRr9O5=e`3Fkc z3Ld?(;h>S7UfTc=WqrR`3^d+@Z)yWH{|ah?B>~^ndE8~=nB|wX3(AlanO*MfhY4Z zkM3*#FSH)u?*L6g)fGE7+NdNK=RPO}?Mi(18#HMm=h4f1_csH>3j+sGVk+SS7nk5M z-($Z)3rkoWA^pqlYo5&KUU>O{T7B*g-N7ur$vi5c)TH6r?XKa;e9gD}h)4H1kch&6 z(L)^!3@?0r7#Nz5GkP>17I3t#W#DhJ0kytzjSsxe^Xx8E@YMbW@?u$xXK$yJge9@ZbqIUK*asIVxM8g_Go77uw?e=JdZE$-1BqEg|>d~745 zXD7Q$xAPxg=3|ckFCbZ2v=;1mpWYZ12hZ+k1JCYk2hZ+e4|t;rY4YIAnKOuy3rGP0 zDj$%#svg~+x_`bn{sx+CZ}7L=1a;iIJ3!+!KFO>nPk_?rMN6v^VbAUZ9?gdYJPtl! z@nAmaVSS4BZKUmV;y_c5MIj>G!Q&zd@rN6Kf^!e+%g2BJ|2IBx*a1>jbh8Q{VPNpsZ?x#X z?o4ga_>7B+0jPoHVST(rz~lP`k51N~hrwN5h4{nZya`HK4*x}Ww}MhkjEcd3(G{(r zH8M9mjc@-KO=&@}J3vZ$eN-%5x*?MJt)T8ojEaSi@okV39Xz15D+7a%@(qt2#!y%I zSl{>Ice&xyDO-A&fx+|pWuH#jVz?{72^{1K$oQ{E@=eF?AD{xuqWkoV63~E9^N;_f zQZF*^f>siMR+D)^g9th<+8v@|0U8#tap^t}?k|0B0o8v0K}#q~75G=s|%vF;Nu zTJM4y!Y9BB(V)7!PJ_#I(4zH&zgU|e%KP-P=6wg1Ei4y2vQI`dq;PQj_2_ni4k?01 zv!U|`pg{}JbQ!c+3!41&>3-#re6#uYzf##3FYf&RZ~VX0;>G$q$S!|*2ei)qB!34e zS6It_`o_S(-wayY?$Q0(!BIMeA#IyTq_vsg%pzR*r zKVD0`;D?*^!USr%NAvmr-KSrqf`Y&M_-maP(ol&Pk8Z;~gJx|8)LKwd0M*e3j^OeC z_&8915!78Y@aTTk?VIp|A7pCt5d+9lL~#5&1c!!&gTt}$%@6QGE>=&_K4W9>MsU!o zE#v>Ltp{AYUwD8+*roe>_jmBZ&K2yS=Fz26y%!a?|ARu?@iy{=J!IY=)QwYkar`ED zfyv8Kc2HkuiHZjsh~A^}0kkNr>#<|=6M3KR-yXfZd0!bAJP-b7_35lp3GmH+65-X& z^ApsNiE!lKR>NcA!1UkY!heT`|4b!p4h{bqOU)d+kAAfD z1_rNgmS2wFTv#|7_**QQ85mwfJqOtXTJPfH(cJ+aIqzlN`h|hPGE&5=o9BmTHxCd0 zl*9i;e>Or4`@;m9Z7<<;X!+0I@(eUJE_$sIG|m0CvqZ(krTamri;9m&_g(&$ZA_p{ zU!&p!QrZftw?Oq<0RJ{_AJC#0SL6Q;Ke;@5S>3;Y$_$YUj{H-OJ2uw{1Td6XJMwRH z5%B5oQAq@qE)E?oDhZCqT?7Kag-~yZN`fPJ=f#WDUf?`h8t>9wqvG;1h?RkXf8WU$ zTfmE*OAI}`k9uey_Fz8h(fosvzi%6;b^|r*A-X-fFTd!57*Mhw)Hiu80k#d+K)C!O z2P(S|vU$zH5jw^V%Eqt_VhP5V9J|kewhys_t0@=I=8D6N|3&K?Kq2PR{eZtE4%FxA z1}!4$<&F3ZT8`(V;^NWGa}ZP_M1Vp+!K0gp!?pVeXmt^IXT*Qe|8*e!{4Fkwpm6-` zqW#r{`J0Pnii!(=5AXl~|6N=Em&Ab#2sq}VlECZH%lr2eC?uh#g8DBYJ2=3`L;ZBz zMFnd5La6DWO)bqeDlUxtJv;t^`XVVRKF!A%9h;9azAkdBID0HvS^pI%S zF-Grho`W4OTt432EC-LfFoBMGV1OhAcV^HS?crKb*!_43O6&hcw?cW^V7cW`o-CL* z6UyTUjmLu%lQd}INU!LMj|>d21w491=YtsR9=)Q|K7uk54=5w?fHD#&p}QLY2Pbn- z4svaM>(Tv}zeNCSK#WR(@kwZZzxz1Ycf~sV+t@*UUmLDczGKY1ptJ`bP6KUuImp<- z3=;5Y{0TZ|r|2}O<5=L*eHav>9xmDkz)=n=QxrV9c@BYMw*Zt&|BIfh0VS9cBS?1? zv_0HI`=$%?2M_DR{5|HN{dC7YdPQ%1U|;~dg1;&L|Ns9l<(NPLHLC^^Py$R044@K; zzx5CUI9G#x;>H9TvH;C5gM9<@h9UoUkT;k>si9OL?Km?p11K#tA7k=pJ_yEXoglw3 zc{Kj~&&>SYk z9Z(sOd>T{`^oH;hc=YmWzK0YS9`NGAMf)(QumIVs@L%+16*$tlnPXHuT&y40?|IGl zU-V2BXj191OZSg@CztN;F4|vRt-ta&{r&g<|7*klqH96Y-9KKdfzk~)S-FCizg&eH z*#j@{>9#9aCR|Ftco-`y)3_YPD%fqdA_atK@tIh1fU)G|nwvKSwDE&1ZyWsoT{ z3=9k}K7*N{(jGLD+zqW{yCIbDx-X1jhW@$) z@)O8VaN_}~dDUCf#2x_0&qqMFB;jJs}@BjaI|9CC_ViVk)7uPRA91Lk&aXK(C zbRU1M{o(*r_(eNhDY})s5G%2@tU#f4<_viL8rHsAZx3$aqqeU=#T6xSp_t^=F#aa;L+_YaNHTR z#G1haR5*Z6LV#EfT945D#-jP>zfz$Whc3dx4cu3;INW-&!pNGJ`was_v6e^jL7!e$ z{x=K^T_-%cFL*#&+@9T#rgoPL2S@V*(2S|Y;TKgGk(*EO+7+^&6CQ=N!r6DMM09>JETDE1@JUJXr8uLG;SxTzif9OP2x`}Yx1$(edhz2Z$mH8Ty{zYUF)+Av#<93`#&NiG#_{-c#tHanA9Lx9 zlYrJYj{MtLB*2Z0=J$*p&i_l_`SkM60399E+Xq?}vWI(nya0+xZfmk$01&j2^Dg32_|3~;sv=7u9s`T*~jQFw9j z258mIkM0i8io;f3ue}TmCBh!fJ3tL;22i;-1GLKUb>2?!%B#of;H6&kL1G|73_Pr5 z`S&m|l(>NAf@MB5Gyg9Y^XO$g4a(i!&}Cz+FaF#HS;G1hl+Qcc!J4~SuY-9mDh3~# zL6usJiUGt9e>KpM0BARvx55jd^B|qz85qc-FmM6~*Ov+&-LD`zWI;NR*Mota#sNzI zkU>{)eGHyMR_OleVD#<9o$H{L9t%Kz^yppzanB7OYt@(6@t3r990inH;t;c7oM3|NnQKwdX9T zImN(GDtDZ<;VfkO=f9{|5d#Bg0@I~=G03#PudSQ^|1A|d&Ke6>B45P7@cMT1|39UI zj@>RQEXP?Lp>nT}g0!+jwSqRofyTcOYnD*f3W3Tm@c4{J^BWJ3Zq^O!86YS0fjZOO zw_aTM_y2$E0no`A?Vx(Gw_0W&s9Xar&pGeYee8w8!T>Xeq&zzfQVYWT z+gLyw+?hO^UofH+XU~iey!;9}QLl3e_&_@2w?3UYDh@uqx;u9=Fm#{w>3-_jeRP7Q z1%C_Z#J1*xjGoO$K>Oqjnt!quy=eUZ;x7XOe@i_h14H9~P(OgbrI?X{fq(n?|DyK` zAZ1(4{ zSZI}=_ULt%-w9et0-B~k;0BNX91R>C9?b`sz#86nd$TmYT*A!2P*TzSlBFb~`6X|O zMe|R_5{cu^pv|rf-A6l}!I99JE%9;mwx#Ek7Okw=skFOCDt8aQqKeZGEBarDyX2CPxd6(gU8L!xX>^e_k<` zF6yjiX?za~Txgh;s5HN4DUoP?&s)L++7~Xh7ZixEh4+F2>^09`P~f~~-3tzgY#wir z`rIRYA)$*m^ejdUu2FpN`Gv{=eY43@Rl* zyifrxUFn_&D$u&mzxehGG_Lf(+L?vFWhNs7!%on7jV}&d1F8Mt0Xj{m0~A5s(?IGy zx=%Rn04vbf1+B2|l=tYq?$~|i#ev@-Q$DmF;BVCfEAIm-2QLto^5_P0e0o)HZDe5Z zv_4b9_d?*>|Nr1MUdK0r7RKy@sAgyU)&?r*nD|?T85tP9u|C)a+Evub267j;YUxm9 zV3^SD&eF+R1e#oO=jde31v7X$Su;S4%b?x$KE15(XZ`=*{EM|#$|Ly{|8^IDfi%a? z7LN#BMuz4?jGzs{uOD`U)i(YD<>gvQkh*OymNHHqEsP5!5X$a@31ya00l98eLFe6CW>pLFZtg2fX7(O&J{4W*s=;oE!3h^=P3%RTR|9f=W zvV&#W86kC2r#u70Yi-cnhni2XDrgSL)A~;d2Wa8*yDR_yzlb~n>S%#lov&GqZ@YAV zb_7jN!`B^j*QkJwlY$PygDX8yK@P>}^`AVbJ&e2_zxje|oeYD5>=5Zfds)Rm4Q}fbB~r~hLG50Uvmb+dS^XddFWfh|UUEq8{>{JR9o&W9C1wPWcK570ChYJClwbbWc_ z5~4%r(S7klGb5u%cOxiBKwf8oG?E%2!F-?u#)kwdf)Da0LVd4egyRm7^L=`GD>gGQ z_*i;;0BxKCyN(5HMRUauaMA67EOtNvR5O=e@aS#=1;vNv22cPo!jqu~XpVUr11L8z z{zr2qh>z?_5Fgo(*|SxPqd_!KYi$$NEx3c{2mU3qSCz#SMr8M`@(iFv}5;1yC1& zeFh;A14s`>dl=evmHoeofnh%vC{1^Bzc_RpoHjW;n%^^ebUObieFf=If|4X6 z3_ZGeE0=UcDtWc0A)WjV~iz&{1C$t%sJ(?>-CGMNfGYtN(gl4th^&}?e=&r(^? zo_YyTptHFeKXK_)1P5IPXmb&0t6%HM61L-vpmklIjXywp?aPc_*z5=OrJo>1?I81j zpgBB+7yI}A|L@rAq9W$ed<1SvcaI8a0^g$(viQ}ba}9W_mxIw;(79NhB`OIH9XToy zrFAbJoCbyA4WI4}pfLC8UI40~e5_4RfMQDw7I#h?z-@nJ@RINkKGv$5>yg|3${=ah z7h66dxBbOIZU3#%w!aJi_8t|`9Pw-2G?#8DQwemQOK*sZgGVQmN4Fz~N2e19|F#^+ z>Zkx8&?mbcvuFF^}&KpJE~Ym|jweA^2SMacgBmy1C23LU--9c!0Xrpinjd4XcA(@7n95!f1S{vjntQEJsDbrE>{b<$qC$R8VueMA5|( zB2tgJP zA~TRP6kc4~4fY(|z#Sk(ujO7yfptLqzZa~en*pxKqZ<FA_c= zrzrzan%WLcQ=l^pm_Spd3gEM?oj5!|M_O;I0qs=**C-__3Lf2Upe8zKr5$Lx`%GFl ziw9^TAVU>2vggq9AGE(O0TEQqM;xN@>~C@De&}HI_QmQGAcuo%8FzTshQ zI(Z!fLkZlMydWQNym$w0g?{j`w*9giIn%sb175sc{~pdnp^|0@JMx|tn1G(4J_86Ehy9evH?z`yS-XbOA#w*TORIs}^88N1m*M|SYE zeyiX8n(a6{s5C=&E2u<01RAUajkkl=2ZGWMWPAc#GCO{AkZ^!G#-saX3BPA^g#be- zha;olOVA1^kS8h`z-j@1A=md~S`xq}1bR{m`VUvu;CI|*_rFT|y#ES>DH znVZ=eJ(`a)HrxL%)p~Jx=l}oB7Fwk$$o>`p8>Qya&3uf(9%NQCJ7ep&`YvofI_%MX zd8a+77+SFv92}*WI@w=egvJAmasVw42>~x&Y<%+qw5_I_RRgph5;7bKI;`IKt#9iA z&+eZ-pc@Gw>li!NfQuTJ?ysORfX*D1443Y|ojEF?fD7r&Q7P!mQSou;Sfc{k(Zk=m z3gil=W1zM;^kk3j3$V2n*1RuQgL)(2!@V28>9-SdqV*OL zgrF(Vqe5Ijr-4IMdRVintYly)QSNR6YhaZFX%Ky}9<+|H8>RuG_8V9UQ>jTa*l;Ef zsQfX=ks^$*r9HdBcNJ84bTWE&JAiXCOp$NvlTwEl7CS(tH|WTHP-zJAvjU_Re6era z|Njma5O0_8!;Up+UI22{U(g)d3tsTz6cq^vP<{9SG@jBcx}*31f1l1ZDmR!I82DRH zgLmDWdGY84=rjdc@A;q-`hSTt=p?jrFF-N*ufz<*IrsuJpr~8b`~Sa3GI;ZiXZN17 z3tSjM`}toiegWzn-f(PwEbp6rJHm(g{%bCu?%O`Sx}LrN|2uwjwy5WC1w{|Ys4}p* z|4S@DoJ=t1Ux_w|69aMurs=LP{{Qd3(fnB61H3io{x@ffhEi8pFo6p)pI*`XJ)mi@ zZ>140ShwQ}vhJ;jAbZ)t!@%(3<~CeveSUE@Zl;0L-Rxa*UXOHCq0r6di3%f@Jv47!FR2$Ad3e z9Gib|fX?j5;cuA+GNkzjJAZpVHv@xncTbZ|18CFU0Z-;r{~tOwpa1XD*`oqlng()l z0f@)|5h1SKA6+_YR6IZ&2N2=&QWs=a!(WAxP{)S9$|Vkt4S%&ubQ~N0>Xt}2HvBc< zZ{-H5XggvSWsJp}RicfDhWa4&(l&F7dPydxl9!(XjZ z?QYN#1`g0Bm>QLYP8XF7{?6qf$>wt`-*15U5Dk;Lz=vLE^zt+~^6xv^>*8?%B>A$M zi-Ezl`zOfx9xwAi8bPLNxOCftHWsDchMoWGS9B*(w&9XG^L|2P>K8tigP zg+USP$iM3y4@CSKCpcIHAiNt8o&tn-iW9V)h7F{e-^L6qRw~(0$7ljJg$XPU7Ja#Z zlYzm;7%XW7m;A;Lk!%J@rtr5^gXm2DmSPZ{&)<>_qD%Q(l0kF@e@iroj^J+z<^)Yf z`KaVL@^AYK8oI0i1({Fx`4{5fK?A=fp`azv5)LK2p3OBX0t}_B%|{tu8#p$*sBrwR z;PdQeQE}Oj1Y|4!zN5_t_Ba19=WjO$O?%C7 ziaPR4$x6eptyph1jp~k1UMKNO6*CWL2c4qqT+MhMFlj4#Ng382dwPn6&6s!0Oy9|F5s(a7&=2Arr$lf ztvV&&0#8|(}Zeizx`>7dR6$UPq2r%MF1kEJzRGJrNI z9b{@fQ2N0``?SZ!pJ2<5ffjGI-UewB18V|nXnw&6I-QsUbO

1IV@7r@;F<=$A-V@r9qDSK{_Ggt}fQU>Ns7xe|3ha zc)aFxZ2Z5Nfq|h;&#`xZENIjz`TPs}gP{8A0O*P&&?0%zQ8+iczrW^o+z(O;HpZjd z1+-a)w`DN{gCqaGzo3HvJ(9nHx@QR<-3~uMdO_XY7l(I(s&7!M2DICw8(Q3Vp9kOG z)C=hoL-xIZ%vJb*!Lj>a<8x3`xI`M{12Kg@9T+r~h97`%9`7G?&-S z%fA@3UKK^Y!CJSJ50ncyK$Dx004h=OLE83+oPIuomW{cngn+`;aR+GR0j%S7c{fN9 zEbuxTWE#KYe$cIJVA&n)3=9mNkZ$Q~o*n84o@>iD#~mPbl{zee$6Qn*3_4s?A{~1j zKD|~2%YhcTREmKO=il{?6KvdTE)f4U3y1_|6aHdwc7-RJ*GV8z9&}M3$8X0JN>m-c z9djrVK%_GM{q;Xy8^HPe+v|V4Rs<_TGBvsW$7>$An(q1^UWNB56jCxhl6mUYaI%*Q}W9$z!Q zJ`Y-Q2ENA#WF9D~fR^tzA7%u(i4#8^ujM?C|7)a!` z0GQ+glPn;zxkjacfxk5s8+c7ErwDcGjqbyf$Ex7`(U!DmT8lfO_TpEh&uPWtjYZpt-Q_ z92FOz?$40MTw2-$SN`pM9-v|#)RpOl4DLV%S{<9;g0`14y_oqPTnM%DffD~7@JLYW zfBqKG!F-Sk*P|D5OHhe0w2tIveh;b^UxM!V18s~4^=H5~g63EGn%^@*^pyxg)pIr< zWdvz>Z4Rxh1whqi2M4&WhIRiywKd-gNS(>S{Q|6>9jXyjVK@K%UuyH>%xXwC&um@WKk!$_W-yi!Qv?}^7f9n(QO6C$3hu8L=-B%#}!U@YE zwqJnSehw6K9?fULZGhKah)BB%nihKm8vV#oacO;9p$v+n5*363P^=n3<-vx$=7CVG zU<%X`0u`vB;crXOe(JW}pw3ANXkrc0@CLUTT#Zlq^op)(0QH6-4S1wh$ZK^-PUyza zP}%VRKaxV1Er$Pz;LdFfkC{KfkCB|fg!V$fg!G(fg!$udeeN&?;ZnJK)pz&h8Qc zZOzD^56Zd7+wegHfeJ5{F9X%JqMBw0OfI*7Y;HH(&Fm1y}X)%0dgim^G};HbB|sh&AT4GqTAPj4rTFR_UUDn0hz0P z@r8mG$SO?daV!IscdQ>H85qF+0PW;`G8em7?kxTP-zWJnOr0dsihz+n8}qgPjcE@~3a%D$xS%sRjAo`fklR&{iP^P*y|U{NH>;0X$Q4*dzJ42lD~X<19x&Bdf*- zUS9=A1(-l{AE;HO09kM4(JSje3vxo2*U2)p!N3Vpg9ex=6Vjs5)lv3@k0wi zCmnR3dvS3qs9;w2Xg)3gIvwOHczzx_)5-((6Wf2$5|HBN!vY@GcWWMlT#S5v2*&EC zGiN-KPkQvS9s?cF#(dJFo9Bebf7J~>(7{;5cr0Rl1t@Sml5ax#FU_{AL8r=>ioa<2 z`~QEhpX>{p-~a!E&)9vjXa#6s{I>`5f1h5})R_znp3OFY7)n^WkG-zksR0_14A=@% z0Xl)Fl>bHY63|2kXp+wO!0U*eptkUfeg@DYbda`EJ#bus>cLxVpoCm14r1>EO_69K zbbfoy@7XEy=QSrta^aT$|0j5K^LEYzl|#3^85khz2%u|1yFr&(fZ`B#wE#H2;PZtZ z-Mj%{jf=dImk@yC6Fe&Ik$lsm*S2Q{1A_JUlc9}d5`Bl zBo;t}+#df`eY_E23$hS0KMG#4-RmXsV(k`?o)e&RQJq$UIzzWTI$2MEE}-mW-MOEE zp_H@NSpqW6>Tw*D%|S=lf){Lq48s;*;Jt_7MGH4y_%DZqNcnySh8K(0fL8jw@aX1E z0C6X;0onY)6SUI_G=J^U{lioHuTO6|hiCIY4*n+4hGEa{voEyuz-#_It&bIl?gFi; z_pmm7IO*zOHtp`fQJwc1fJgu)3seyzOAi^b*9tZz3d-R(805wIT zSAmA5S)c3!9g%K)`?WkM>fFGBY#zOS951ZEY}VZ%1x&`bU(5nk4xp1^VnEH863|I5 zkV_(vk7b0026X=bXg%bMB#=Jjsb8=f(D_*}j)QiLe!n4o;QNi{7odwl5bHmT52Q6( z`bL$Cdn5^1?%yuuN^7j)lHg|IpK<^;Zvi&!%$YMj$&NOlc2xHzALfIO{M#Kw zT=}<0u(`J0_UiRvkSLMw4&?E%zEs53?a0A=$jACZk$@xk{P%+zuGXiE9vUAw?14N- z4{{&qXt-Wpq4NL#U*!G=S6lKv+6O(mFTCgj&4+_7Ozd`0Iru{U`-SEQjNltIK*!{P zorIL08I4aiTCg%O9N?dFu=`;5K~OS6+Nlaw4x0bdcyWC#C@pk=?>A^YS;F%F;%kN% zO*-IwfCw6}29WzadU=n6PT`#Z%JH47kt>lDdUWyzg7}@hK@ch!LWQh^Y-;f6=5<`j z!0=LJ6=aPED1Skxen3Szcw(gajYIcMSL1Jv-Ty!xy#mkfZ@rHHntzD!x4#CpSY~+i z@_s4(|DS(b3!_U914H+eMx7o|w!HZNkx#Gc#TB3$llRmL1_p4ask26<;I*euuj&Da z#7-0mP@`)-L}CSsgt$+y>O6?VbYzJakt@L&>2>T2en=jIACs03a$WZXaMQc{lut4% zR|jYtD+_2D@j(I4?gJj+(+UoOj%Rs+!YyXCjASWc_Uu0A)0@cQ+pVMG+5DFgyf0Xa z5p=)H+fpvaUSH-HJ;WANzzS;X7l0&fx_Ld@85p`R zf<{qXjSqCQ+O>mDDX_j+tL2e=3e;ZdZUcGHr_<#G2V|LwX=z+li8vjM>TyY)g2TK2t{S=6%f&=*M6661% zF-=f@S;oNd;t8lU>ju}I)u3*C!i!4_!9{}zSRYcraLxV?I@vjav6R!JSGERpK8Te^ zFR!;hs8&>U2CbnvP@?G3D=O#@$|ooOi*kSjA!ZAB^vZ%xQv==KBI^JuZMsjtSg{0L zWba(cz|egSbdJg8ZqPug!D|UyanRur+~C6^{);Ul8J7{tWw2R&W zd|snND5x^E0BwHnW&|}mK_)oxPdVNVI&sD#9=(9_=;ZZWiWJ_E`V+Ljr<>PcDFefc z)1U@<>j6;P=``qImJ)7A;|*L%g4fr;mL`GY3#z~Q=L3)KoBZvdqh3G_a08FllaMA3 zzw1X(h+06$8$7yscY+U`K3S^pqW{bP|2ySCO&Qluux8I{P*1a)cgkE)HF*qlHmal( zIE+2If0XK2vff_8z)->ms^lEOWqIk^*W54CW`mM7sPXe68qNfTmI3%u9ndlcu=`(t zc3Ho$fGffD4>WtLHE<^agPFbRYgNst;Nt*m|JUqS^K{ zXvDTe1?102NSo+1XuOT>I6KG&;{(WsxBf4IiX(}FV+V2`1>~r6kJghOpo^S-mI{G3 zXMsREk+xZb1tLurX6tMOt6hLTW_`)B?IXDkDc=HCy>4uM44|Nj5~V$)1m zoPm4;x(ptCnH1bzhhI#X393eK{1-iM4?eclU?%9;*4GzafWp@UbXm|gh=e#;!lV1x z>uuop134L534)s2-7i5qGn~LVegbG|7V<(9QLP^EN)qVKj3r&*l_ag8y(`wXeVyP% zD9xY|l2+CZkQ~PgN$^^`ACSd07&|jSD>?YLxmd^^e8JTGfYG7l8)8Ka_y$bG8WT|H zLspSMBMVMJ##=%6|M_&^^w7S@-vl~~2YeA=;7K8VF%9gEBb_mj_r9d?nxq&*lg0 zpc@`JJi8Br?*r^&;R0I#x*_m0Oc3roP!|e>!S@9!FfbH5d33XI`E-YHf#y>bJUSg8 z_;d!o@aT5o`T!FB0lqiT@q-WO&cG|4%@5>X7XJVLAKAPK9*w_1&Elf1J3!|e@Jq08 z@k_XHIe0W41WhjdKT-O|qwyt3#SRD1sifUJ5c_=i4|DqP9}eX3>Gt6g09hvC!++RQ z03;>>5>o()X?QdrbO4Dz0Exc59TFE4kgO;rE`D6Net<&agGcjAPy|W%fUb7zcH!di=@#JvTjR*#(;HK=YLvFRpq-6&&;e7{yu#}l7>aAa%P~yF*E2A5-SFuC;c@Uk zD`-(lH_JcJ!jx|=5*&;r;U3L468}pAnr-_gFfcHdYPOy%k!XI&Si%E3WlI`7Q1qH- z=T}h6gcW>zEU4DZwgI(9SpIn&X91rc3@T)yEBP!yJ(u{yFAS!DN?_1V_7|a3Kt(M~ z{y1nH26S*IL?PTWApb!3bIZR_0_z5;eDQoT%pmXyOrXJ~){_+`*1US_7#NCmz@8K} z0$p0zeFFJnyKa$F-&~kDz?-01n815tUz`S;1vYlVWaLT~vcVg%wo+&kXnpaC|6px! zCqm2r64djVLA3yAi+T40&x3zheR_45t_AJ%{{cNn$-BGcDFgVt+U6Q_9)?oWUT@A9 zLGMAm0We?Mqu0kAdXDbwumArWpKLwA?{c%*#hix`GSc$(?f?I+w@U=PyM3O5R$o~P z{1;tl1-pz3X~YDyVA2B=td5YD8N7c9F=y>tkf)IMTYxvle_I3H7~lL*9<(L-l+#XBt=w?-}fN#bNFutAE>7(LcDH{i>&oVr^c}qbDKZ5q<^SqcP z2TCZs$qV9X8iUH)r3=hzeT+nlOj4y!>*I)&YqPnOk z{1=r4Y3Sy?20A?vw87m0G^*Rio&QJ z9CQiMhmW%sbwD9iWiN2am#cm#AcTG#?3wKg_?49~2`7FZ3^iT6X*` zpm{})ZXXo`m+nr`U7L>0KN;%`9IZdrXm@+E7$5Lxz0E)MfKT`FU7*4SycZjio}QV5 zViK&iRLCQ_5v19}`a_X%Lp>uyi7wbN-C$AvmR3+R6?Bz-^FmN_>@TRTiyRFv68k}= z5NP2xSRZINii?T^V(}un2IB+J!=J#ebL<5*9gc$?2MQT*TI=>;`7i1Sc4WzXET$ri zgai~gc;IOZ#Ben}`Etfz$k+^s4>A_fKZV{;>uUVOvHK6`A}Pifw_pALKVdg$Xc81e z6Rc%#tzclN&GJb8?9t7-4m4WYZ1aJkB*3Ga=fgKgiRKc)7eAyyS?_-dd-HL|&Keb! z=HDVU1|Hq44ItIsJRdxo4;uUzon;En=h+a!k1r0*10^5X=ot(QzMU$cVY|`#zz1Tz zPQ{&qS`yk-aAWO@#~=G*{u_bK!QlI~+3o!p>k0atQyhr#8c0=VyUvy=-|@J7D` z4cv5lf)7A7!0sLk6!%D=xCgYJ1;2YNK<;V%1`0O=k4|o=%St#wrxSv^q5Qj&CHRUZ zL4Mt{_y7Oy6EChxF))AzP{9sF-T?#(Ka}(W9gj9}>3(SZ-=+I~uRr69(lcb|UIw+B3+%^C)h@83FG?$a-h?fL&7nxJ0h{r~?Tk~l6r18si#!|1~A^4<|N-y8!w3mNyGM0ow^ zk?gDB0lMQubmde~LKZpoB4H1>#E0Hoj5R&RK0{LicFD_S@K&NjDAF)#f=4fCvutN< zfJbL(ghyvBs3N^p0IEojdUU!EpTl9#l+uI$OKw(a*4ks1GHkM`4=O9>qPKT zerrL8?z(h8c5QuI%I?w4?$VvXVmTMIsv3Mq#tu+%?c06KvHL8)>jfmA=z%9geUd-$ zw|FoyF!1*|F@cWYf{v1Se*fmt{DXpBuDG9dw#Vw`)cB zMYv(01#}AkMO6(M7+!)-BnMrq4%#FOA3E~<{sj^!rx?J2q9TAhDAGZ@Zb3l-nqmX3 z?Ey_F9cPCIMdusP#1{A%a(GZ27XXb86?G$d&joZ0H>hw`_%GUL08V)h5dRp1Zb?1Jo0i6c!|@0pYF$?^Sjwyx+_FnI%@^Gw}R4J>$g%ik8bwv0v6DLV$$N^ z%FCtu1$cBGw9>-*m~Zzn{uaqlYGLZ)0cz4?>T5!Li5iDp4}(;+i!syoXrQ}F<{}*TgmTX z{j;14DWNt$|KQPm{KaiqP_lgP(F=f&x+0T+;$d_mP!4XEM!L=O~0ovs`udXPx+>GkFC=?1q)y01BQp9Rf2D7=Uj zV_@j^FnHX#7%zj$;X z0o@1=$|fG285|y+6%r1hEo~=#IukzlbY{G8=%{$$+5OVB`+-aMEB;pS&54}_0xvd$ zx^K|)NxL_IHZOqpeeuo)^;FZKZ zZLkHrpQl6u)c}ta%#u!tC0433wRp_C^R*?Tfn{R@;z9+p-?x^O6{qKnNy zJ2_7L7wyskr8v;l0S>*;-csCu(G)FEcC0A1KhCPz3%NR=yR^XgKj>;2&=S4w0+H_6 zjMm$w>|kC5OZT}K5yBun|M^=rK{eiimsOx5l=WQ?NR+AMKV2#qluz~U^+A-P zrmzZy3$BXa15~d_Nr5u(1CL(N=tk>p{+6i!|NkFnh8Cta&!HLk2BKa$ECA}Tv>5#d z9Vx=10?NUsUldn?aSnqUU^3q>&P?eIbZ z!ti*(4`BqnV1qCsUi_T^HaOwM7YHNc#cK$|;>9Bfqu|9&2&3Y~1uz4AhvSPQ5H={_ zU+jReLB4vi2EqoNi}_*!gbkXVelZ2Y26dfYbU@gkDd-n95H_g%eo+8ngJxJ>q(Io9 zqVh!qgbi8_@xlkf2Axs-!U4htHIrVLK-i$B(+dp<`vYiVPzJ*O0b&b4*r0ax3l<0) z)P;QUqaPFq-Jk<4Uc7;@LB~S8cmQF8j*NJ51;PfO8gc@{Heh66c(Dh<1|9qHVgrN? z+T{FV354wdQZoa>2DL|C^nlo)P8@XM3TR-+2@%(v9@e}w%NZC-SYIT8RDzD{u;%TD zhy*}H1U#&HTOlHLAQ2?f&Op)+Xignrrl*95HE#?=120HJx3_|aHE$3^qy(C_6G@xU#c0LCRjT9h|Dfmp z6WPc4oe?szVZL?1kZynnM%w-%@u1FuF`1mArICr zTpXo79^H-t9@Z{g0;RSd-Hs9DDi7KP~zqB{UB)jP3c3gUJ=f;#z+78(;9#M;4i=E(aq@9EyC$x zeW>&($RVE1FE~7R{r?9Bb!CDc%^&{zFkkXCKIGYYxa8n#9#GJDNFVS31y0MQ67`mE zCCVNLUkS8aDv@saRw52%^S68};f4saw0tY=0BJ+=4Y=d|lC2&#LI)WQ@MwM$;L&>0 zwfmuO_Y0ryPoSYx2L9IRpi<};Xb>4xfBAHSCzE}wMW5$_?h6P}G4SaIpK0g=I)So8 z71nAE$YEe86@Ov43sj|m&Zg|X0BRu`fQEM+e5_?PvKbgklwhirK&nMvY+eUa9RfLn z(gLjXTLY*#Wh&Kf1|O-&E_K%=^hbyA>le**{pZRf$OHD4IAIMYtR<3*ZUkA{_BEf^eak*yVrpCHaK)yH=kt!%gQ=5{MRlOaOkpz z%7I1Mp&ZxNC;T0tv&BIpTKp}EjG#@le^mJU!x=#%B2P*+9UA@{lyEri0j-yPZ3Vi$ zt)hg-CITb`+U)gO-Ej|SL)dGOmjy~CLCQ;oA<9^6B1$g|o^-T6Q!Lqhmc!BdW09Jp^~X{c>r-X2&1YFaS8q#$Hc2^rJIYZi<=gt!li&58 z@weCUj{NJtFn@#vTbskTqb#M04&RP4mb!EwZGOO1!qEsi)~cbLr}aRoVI%0Y;QBJn z7g`nn|ASOP%D58N=5zmF3p;!}%CrwO3Fp8+^;qLE(4KQ}O7iTCWdO;QFnzxVPboes z4$v|A?qjdz!0JFL&cUKY#iN7=oOGe1@SsV^9HjMS-7zW!9^H^61DacarZJ@a30jZe zY~3=A*aK&#uEk60WwKKa55#s-@LN}U3rGa^DA zL8H(Cj^O(QeY!us_*DP@zwvDkOW8!wxy0QsI_H4POTVrMNneFZ_kyK+z%KFVWW83;!0^Jd8Z^s-x-A2ATS#Ha|NqT)d(qn{~CzW z0`-|q9Kk0|fik`YXd+#~u{ZE5=s3XtS6UC0uzzz=abPSp1*tT6vA7DmFT0Du%kKw<7K8w$&(@O_YRx~H>I9m9GMCD9vt9v>7=uz{H|xm)28K@F!!UstdrR<@ zzxE)%os$r~rjmHjH4C8j z`+w2Hpzd_9kBWiuCC44$ZbD=>sQKNZ0x}o0rUEo6+v}oY0J?!$l!3tkRM#nhPE`gO z0ODx;7tMv5qVQidN{WF2vImBt8deKK!WKk=j+Qk(;L*!_TOYL7<0MGG0chaLrPqOZ z7Xt%>1E@3rO_%)_O^^ijK3QkxfCh(;cz~B?fY(=d^R|M;e*Q1v0bc{m_Fr^1NO3oB z3Wh`zNCLk88&rO9fJzR7=5zm{(?~imz7?TFBWR`$+J3Dm{QsZ(7-;Yay!0>bFnEs6 z_QjVcpg=m^{o#ccCn%?#esO3qc;@FdJ7|ET5?t(xd31Y&Z!_n8q0;>SzsGTB&^`}_ zGoB%3I(|vJ5=BZ#JL*51Mg3$v^c#>w!}B7hXl6 zX;Dy=!rQM%t6R?$fJY-Vzd1@clyDw*1l#ml;swhh@XXNZ7r#M=5dQ#8RV`cuQVMbf zXaR!(7{9;of$X%cr z2GGGWu)D87ol0xjZ{48F89)~`z%OS|{nQOwvVnB>)fd>^S86ZP;AR8xLnjj7uwP`(2BK^X) z5Oj6aYZl}GulZguz-@tC)R1rw6d=c?Hw@Y>4%sU_%w zd+5Oj+D~BN(ajnf1{&Zy0!sZFpyE`)aVO}+fL$yC3=GFyRMZ&$iyo4IxF0mj*zKdD z0a_Cwmj*V_0(_&J!i)8wO~o)dCYT(^8F1_n8Vrgl&@7`P=!AFB00C&k(ZQpe^+G7f z5ulkc1E21_pqO&)R&+IfYkkVI`-W%tSC`IQ2A@t}0hjJi9-Xlq-9I~hS@>IcL6-K0 zO8ggHAP#aNe+y_pp}AIqk-rr*ui?=fD&Yv)r_~6R2AxO+k}j=wZ2t5AxGSi?&rlNM z*nOwA6@uxej%=*Kz=spP#|P1zr+zbjvox!Dfrv? z0C=Nh_s!Q+UAxctbRUL{^qmLKaDtADR`@S!40dJr4gOZp#HR6qm*8Q9ub_iCK~01o zh+#y?oXlPSUKd>k&=}(R7y4c*9$+n2?)`wZA{&@2FSlIEruBzQm*M82*6OKgk} zxPY$!0L8imh%o4G1r4--ia*d5Rp-ES0{=x{h(a_@1kG`De}CBtYAhMQwJc>Q)dsoR z0z?=<%mV8}_Rngt=I$FMVIIks!Ly?;G9cBdNB4&kN03$w{SZfk7wqJKwU_dOZc8nw z15G}B1-F&|m#}$s`wDb2qRvnFf@)&WHZorW&=_T1GN`eX>H!;YU zv4$Fz2nPNZ(5w|~DGun!L2zztK9Uf37?frzx_^V#;W!-p&jIRYyjZXv+=P;M=-30^ zzR@v91(cVLwWxqLpD{Rs`?{}1JLZ68kF|hh8K8?`Kr3sGyQqK$!WckDG=h3_-HsxV zMCzhq(Cx?qYN&y(NYFrBeDq?^OHlDyqf*g&pj64iMI{2#;157*@Wb0r32}${x4Wnm zK)nZ2>7x<=?K+@(4<7%Z_y$*P3LeQnyU)LuDb|NeeXTDSi={a>K4SRb+dG@#!~g$|$Cw#>tuL2;@aYy&0p(_p#R8!FnVa8ec=YnV z6$16@*!dYiQ*IYP6FQ(2_MQ*iK%J2SZlHp90)pG8y}WzD>aT<3dqoex)b9uJJ6Q`b z)%SwcF9*r@if(|Z?+5WaSv_FtL9Ipt*bKByoq>Tt1xgD+=|7+oUl|w}+@O4zF)2{- zA}HMir6)n@ASk^9N}qtzx1h8els1FXDo~maN-u)a3{W}+YJU}!?ts#>p!6~*y$MPm zfzmgi^cyJ6@fYF)H7IQbrTw6E5|pli(p^w`29#a|rPn~|Jy7}-l)eU~??LG=P?`xe z^gSs33QGTh(mbG=i-Cbb14^4gX*Vbx2BmYLbPbfA1f>^2 z=}l1j2$a4CrC&hlFHjm1dk8Y%AVULaGg1ST-Tq5v{F zCPpttwU~jyv7{t5x1a>%MVK8}z3N#Uo?mWe5>S*6GLC^EJGCe;H3#8tu&hgFG03%G zwp(#fYD#8NYH~?tejWn@SS%>DEVZZv%tVt0ISGt481fiO8FCnM7&IaLywaQ;2oua_ zV_;wdB@qDzW;O;kCIJ>#S69#mR8~_12Jqdo8VVKx5$qfc<^~4g0qhJ63JRccT?USX zjD&=Q1O|qRf{KcY3J!J-1_pKp4h{|m1`Y-e1`ro)et;SyIGuff($4ust`(UjaDV3( zC+8QXrs}2S$J2&(+7+NYBN`2c*y?6;&Q2 z2EvR?%q*;I>>Qk2+&sK|`~reP!Xlz#;u4Zl(lWAg@(PMd$||aA>Kd9_+B&*=`UZwZ z#wMm_<`$M#);6|w_709t&MvNQ?jD|A-afv5{sDnO!6Bhx;SrHh(J`@c@d=4Z$tkI6 z=^2?>**Up+`2~eV#U-U>*v^>J|av4Gip{Kn(~0HA)pU8af(4O~!0l1ELO-(Oi5Kp%u`5&q-ao<$;nSlQ7FksRd7~-xg#etsVK3i zQXw-hIll;$I&&)ZxB_xg6N^(7lJoOQ5|c~7I*?3PFIFfnEhxw@Dp4p&P0UqD%P&&M z%`Zw-$jnR2FUkeGKo9H*28jENdAW2IpcxC~jMCy%1>ay#9|cenP)IAv&s8YN$ShV! zEG|yXP0FcMNGUA>Wx%||lFTxYGg3fiXO?6p=44iZjpqshsn5(y0eLvJSRqj%sWe?7 zGf$y1zqANBB=i(KOB6DT6>{^7OB8Z4vr}^_!QLrKEiTO|QOHkINKVYj0a=!q2X>Qg za(-?>W=?8~f`)!_PLZZUT4^3Q%R=0lr~r3VUU5lLX>v(^kwShEMA9WE$2T!E5A1hP zycmJ}otIytkeZiYnx3IhT#%TY3J$KE{N%(Okf-1Qh8$joAbm*Tm6-?idn(xN&OsrN z@Gi+n%u~qEOHS1zK0J`^F#y>EG7aQLge55;H9=+uMiwCXQh0%jP@#~Knpgl*1&&`M zbC5ca8Cd*To|&%z*9eX~gg!Hz`ie_Z@aQuI=_@ELN>wP!EGj8Y%t1sFC^o?sfZT5a zQis)D@%eeF6`3Xai6tOPp#)S)gSCP3lc6O@AHv_@iY7TfuQ)#^RUsv{EHgP3q85|` zgUk#Jq2ZKTQIMKkl9~bz9rT#i=nE) z>Cgb2-_mmO6T#JY0jTbQmsB8QK*e7wICV2H_+};-|(t*rnH7avHW z2ntXxE(QiYJv|1Sf};HNqQqQECr+L^edg@B^A|2&x_ss8wd*%--nxC~ z?!EgD9zJ^flG{`&pr@4x>Hly*>XcR+~hpbWJC z2iks$!=F$G5w|?JgE-Ls_wcaF&9y29kClKjMM_FaijIP>udlBHh*4Qt3A)IJfx*{T zKP5#U!U^zYU~u#Wsb*ksNli}8O#*kx!2*8yWhi|AQ6{L@@0(bZoB}h|v%R24{ai|IiQ>kb8Xd^Fm5f!&6g2GD_Ww zGJ_LA?L)7`Jh#*&-^3!vf+F9lhfc3%cf!YUgPap#?qaOoX0mR${CI$vZuzofME+e)ANLWjQ!vZul z3$_#HMr<@6BLiO&)XhjVC{89QF)(~kVqkdkf`LI%mV-g|2q%MR2?qmj3OfU92pa>k zJeperI7K-aL`%3BL{m5!L`^stM1uqmd~k>Cfnrrd`4UajGW92oQzu-m<$*g7{xgm#8Y-Lh==TC5I5PuAkMgrL7)H{ z7RX@*4Sz+@Ry-jz6S$0h?n2iEF6706_^328k4I1_=``28ke%3ql733SePfZNR{w zV#vTyUwP(22WLL3Z2AzTbXCY%gHMtlc&3b+#(`9bl(!N70A4vq(`YG8RA@zz|`^z|dd@wI3<1V)F~seF1{PEDXXX z>Y32`7V83I~H!2s?w62^)iyk=Oy8;v9?&9LVX5otc5%i8%n2COH*(85EC5GANcv zFes*oGboyfF(@($F-U!ocp!FxfdLk;fwl|`v9=5h0S*idnhp#M*xaSa0J_|Un}Go| zQxd|-zyQ83hk?P^k%8gD8wLhNK@JAN5KabGka!7Hog{h zQI3Z}u7sOGE`^IhE`*ao&V++O&PeKk#09YfkhH|jz;D9Ez#jz4(+ms?Tp1XI+!z>K z-h#rMg@NG+Hv>Zm7pgcf3j^;FZU$B~afo@m4E!cM4E#mh1t@6;4yOc7*I z3=v>ZG~r`VERy{o{Xp`9_yN%ZP?>hXlYt@Mi-F+)*bPh!3?Xa`C}N;=f+hyB8!2Dd zvoP43aDeInRCj>#L=aPeAgJs!;RTg>5BM+e9^fwEN`S@Ne_sX$6F&xq20us|2Dxd0 z9|HsEU`v;G3=E0_EDQo)_AziAImv)5E~&)9Ai%hvf%5_T1=a$V1W;-L)u#_w86f2c z0efS^85kynGcY^|hu8~_Ls%UKDqlcuhw(va6UK+ppnMNf2QDL!%W4J&gBS*ee9)xZ zdjpfGeuU|{%|z`)P}as#ORyu!i2aYTRtSzJ*p_XMYQy3W5rZO-Hq(R*S3KLLRVJj10;Rc}t1R=Bm%y0KI85q81 zGB7A)LCpgDA6l+2;bvI!goj~fhzP?(6CnnHLp&F_4saB(CqV0_BvAfgU?|9CU?|IF zU|8}2!UwUZ<}xsJfcW5a%mtQ*i;1!^h#ui(;40x^U`^ph(GL!TA|?ZzWtI#FgG>qs zgG>lJgNz9qgN%_x0roP7g@NHpGy{W448wr}1_sL_1_qsv5ci?*#aS4{uS7F&psABo z=3o$HjAh{Z!0~|X080UL0#g7eor5mP0LAl#1_p+}Mh1o)keN_FB8xHdvN705$}K_Z2VK_Y~cLBfQC zLBa@9pW+M`NW4PwdQke328NIA3=9gO89|U)urvtO&k5zj(%JJ41_qH%1_p&r2#qeE z+R4C>*$HWvfoZ6Iu)Bho0tCgm7{pTq7{pEZ8N`c(KL|ogG?@8<-3$!Nx)~S}KxZ-| zy9ZRKB{3H;1u!r`+Jd|cqAA=Aq9$AnqD6?XsqbZA=<8)*H~^)=_8Ku6fa1-ekAWe$ zkAWfPGXsO77z=|~2|EL83L68mI7~gHKHy;B3Sxt{AKAfW`-6T42BirM3=2SJfbtl$ z?TRc8*K5RvHBB?JgZeMC86folqU?jG8EDuGg36~OoD5PW91Kz^@OHojSXjwVXJBxg z&cM(B+T+H+z#u8g#K5+R$pDnT!Tkep*$S=WCUF-){RT~2*xS<6W-~Ad&0%100NoVH z0LfBUJM-fY5V?fpib*llC4uH{+_96B%71X9^!8}Mgcxo;KL)ttBh6_-> zq%NTic73=G~&7#MbZg@gl$U9yCM zVFrlL!oQ?z!D(HR|=z2m(=!~u>goMLjTTf`l09w(P>XDe2l9S5N z$>d*JQczmrlA2VS9$W%ih2zM;(97TgUiILa@0_1kQk0*=P|WC_S^^sP1W$W2Fsxz@ zFUl-Qb<502Wr$`D&a6t!PYX&d&Mz%WPGw*SV{k4?O@v50G9)tjorUEmYW%fnhD9e?e+qu(NMs zUSfJ`ks||xCsS}qVo?cP$$E$ih(V4F42~{gjsc#=Mv&QjPmoKTON)w9^GZU%%RM|( z7#Q9&xaAZFrS=+GcdSogjIkf<^RLm_i2fRQp zfH^p|1gEqqlV>qFO{Aw51r((gr{mV_o{QT_F0ypSdD%ZRc&)IoxXA%;0PCpEQzK^7ct!Kuh2_Y4doU{Oe#WMB{j^ITGkON#O< z8MHulK#~G%Sa!6h{(wImg7 zy$3@*NF^jaf^_>O=B7F_F#KcydCe8E{sofjiX9muKc4mKeG6a@?nAhsjO+^HazzpF2ZZO!Ca z9F~}qnc|$Ek{Xbhp32|{E_tAfeHMF5Bf~F7Mh1Q+Mg|oo zMg~hJMh1T-Muuo6MutQtMurk5Mus{jMuu)CMuv$@j0|&`7#Wxu*cn(ESQt1M*cf;i zKnJsNGH@|4GVn5RGr-q~gNs|2oPhkIlAzSY6c8PnoRL_>fF_ocpO=mdo1)g~Y#zqXD#gO&mkoE7NiiE+lI3mEz#3{3c!8frW zAfvK4B;O}9kHH_j?malQ1SAADAv7-+q5!mR%r`YRA5>~W;%JnlP6!w+y01G^n}OkM ztiq+VEC2s*xWWKl@4f&^gBG8F_Kt)4!ypXWX%C`V7#J8pd&NO#xAQW97U456fcA2O z4)+12PtYQJ5DgLo(Vz_oAUSRZ&;ok~a2f`g3(^as`N3(L0d#K!14vAefq_8?ib3{) z`hy^GQ>Z%7EHa4i4CRByC_s9G7#P6%gP}BNNEu{)Bm)Bj$ZpVlJxE_J0|NtSbs4C? zCBwkL09vCDaw}+8HAp>ZEj!4~pbeBD8nlBFB;U-yzyOj5UE%;T2ejuFv>gF7Bmm+s zgt`Z`cO7Kka;Q7DGcYiK+;6>ug2Q1f6o1OTcZhIo=_5QEhB zj7%)xX2ud`28M*D$|g|z5aiKi_dz5B!@{Kyx^eyk@JO^nT?3e2!OXyLaPh6hxFQ#P zL>}l^Dd@iHtwgGKgsR`h%)oGd(UV0|3{MxmSQHI$1QH21ziuH|M<6Q$L*T8rTM7*E zx3X@*xBbF(G+w@O@4-(72E#gt&L#ID?L*M%eIP}k_AiKrVN%*KFg@hZ2c#kKfJ^T{ z%Y(uJgmJm=gA#W4FSrW{UxP;wdc$J~U7!e2e*x-mnAtEsEL}3Jhp49(4QpebxD7EE zoah-C7-m5Epgsx6j~P%ts7(ywU$_NP4=v;vWWu|RwWC|?-F0i9O> z<%9ZoAfX#KA?8VfI1CI78=!nCD8B;A2Mu$8gdCuJP~Qr~mw@s?x4nY+KW;$GlLv7? z*VIG#uzVQ-<-_uI!gYvxC8+uX*C6}~D1QZ%4_+`03LhvRbZ{g{Ne7eK1d81qsyc7k=26O=<b2!h!4_(j0ven zmq*q+lG(8Q3M)qzLCb4+m^_1|+does^baWg1xkN_(r=*j3n={nO5cFe7ohY3D7^tn zFM-lCp!5_dJpoGhKpmYtCu7J`dP`Ut0=RoNUD4hVM1E91El(vD=F!N2I zd>tsQ0;MIOv;dT5fYKkHK*Hw*lzsxGZ$Rk-P$i!(|2rhEJe6h>?LopOJyVmyv-X z2dWR*Eu(BI009OD3jqd(56>X;8Pf$A7=Aos0MBpKgBlCZQTM|j?}Y*Fe|aUuz+mv4 zfdNEw2{SM#JZE44(V`*@3*3t|N3NIjYG;5?87<67h=4yUPGcZ_y zZljQ4U~rdVU~qWBzz`tAz`!BLz~J$Mfk8lyfuU56fg#}q1H%M41_p0=28JAv8hHkW z?eYu^Q(iDI9FS*Vcq-4pFb8C>0t3TU1qOyCFBljeC@?UzDl#yv0qI5B#{$~V(x}Y9 zaO4F81DIA}VA%44f#HG*1H&s-28J&$Ap25y)EF4vfZU+Qz~HOKz@YGw0cB4K@;(&M z-jfV<28M{23=AN;QJsOo<0S(Fh!)adU@&;ez+j-kz;ITBfuZLm1H%Ok28K(T3=A_s z;#v$0!CDLq8(uOnB!KP((qdrP@sfdIf))b<=)#)=FBwqwn}GJ6Jke%g`0$c}0YtOw zFfiPC$-n@jHFOvlPJqnRVPM#(!@wZ$ih<#P4g&+19s`5KD+UGuJq89_Jq8AaR}2ge zdJGITdJGI2uNW8>=rJ%{)ni~Vc*Vf*K#zezQ=fss<`n~jfj$F69q3ZBR}2gd`V0)- z1`G^7uNW8t3>X+P4H*~`UP1Pi^cylTM7&~P*kH)OAa2CK(DRCcLBWWD;e!za!<1JL z`lc}h!wQi3#taM_Oc)q;fZS%nz`$(Ez;FiSHd6+M8Z!olJ0QEv7#L=nF)&;Kxy_7$ zLEW5zf#)>?gMm2%!x3`^28q`U3>VB97=BtXFqpiC><5vwWMI&F4cQA~Y01E#@|uCc z!IFVtq9p@E#%l(Yy&y_f3=9QU3=A!=A@p_-|266!5YS!_25Sa}4IuNa85mft85kD4 zW?&GoW?*QrW?(q;8bb5gFfcp-iQ6zREU;l<_yMxZhJoRu4FiL~8wLgjTLuP2TLuP+ zHw+90whRn@4h#%BZy@_NvK$x~6y7i}6gV(2d~#r5NCBxw+GhdUr!mEmfnmoR1_luA z@5I0`;|&7?h)#E6V5k7;bz)%Xbzxw*@rHq6f(rw~Bv%H8FKYY3fvhO*10n7*x=5<@XnoqA>l1#zsWLB28Nus z3@G~~Kzk^rdNVMrdCR~6qW5_-FwA(%zyP8zcr!3`fXw%1V3_U0z;NL$1H%Fz1_m!* z28KIt85jb585rvP7#Kdhh3tcv?#ICJ0;C3M9|UMWL|YgGgU&k!1`xe0jDbPs9RtIL zFb0Mj;S3BJ?;v{_zK1g~B)nr_V2EH~2#;W3nDUN+At8c+;dTTA!<=^v3?CvG7@kEk zFf0MFBN-UPqZk<0yklTch+<%9jbdQf@{WOFLKFkT;V1@%J?|J89HJQ*YN8n!j=W=F zXozND(2ikXIP(s5j{|70LqjYB!yAyASOx~?I0lA0?-&>Y;usis;u#oJ-b3~*XvQ-z z$h>D@FobT`a%N(!yAxZq_zH_HUDdx z7#JcxGBAK>X3$;F9~n^A@H;g#FnnufVCeY>p?^0sFw}r<8E9c(nAXC;u;wEJ!-5tD z28&h(h9e&t7!q0;7+l*J7@mBDtj*79V_>-Rk%6J0je%iH8v}#DCkBQCZ43;Y?F|tQo^9izszNUwPVaq25 zh7COo3`cqx7~X)?^e`~&16}I(8M03PQ7;3-7f|D^kAcCgkAXqwGXu(+c+i^pcYO>D zE}t0~Kr~xF1B1zD1_ptC28Nsc3=Aos85oe)zk}At&z``*(D9jp0YqPzz`#)OnSlXB zH%??=So4{I;lmUL29c=@3t7)2*CXdJ zFj#zHKv}B}TE~8L4g*8Y7X}6p4O(-a^M!!{M8npsgJ{^=bPydnmw{o=7X}6poimq# zVa*o?1`s`WE(61yFANL|<}xr$oyWlN2gIJoz;J9H1H+dukTvHo=P@w60l9NN1B1;H z1_qn23@B^Dk=K-i){&oI!obk-m4N|7cP?dMDEZ330HS9uWnf78%D}K-DFefgqcG|4q6M|16nu!je!9~Td!nb`0d8d}Cmku$qBEeGLOc$TtQCgEb5cE^8SWV!kn;to;V90iU{wfg$A^1H*z% z3=Fq7F)&Q{#(=WU8?*+Te=7sSif;@IAlh^*1H%lEU0WF#W^QF*xB$|-m4V^SRtAO} z-xwG^Y-M1WxQ&6~0Z4os1H+wd3=A(oW^Q9(klxO~@ZlQ+gTi(Oh8^1(7=Cw$vN0C1_sb>YS7Aa@S+gV zrEu89k-Y`6pOFF7-v!H>Z=Y61hO4-Ya1)I*1E17L7~S&WB{U}9k4li$V1u!Zxi;toci zvx?wj`(P(&B`4;APUT8U1sz5RI(y8;KUg6*KP6R6Jz<$)0H)byn1N~b875$w8B7OdCTD>3;BskzD+7ZMBO61Fe$XNp1_p*!ZU%-1P~rm*>@$KhA}BMmGB7g0Fj&6`M4gZVIPbB5a~3EQ zgH}|5X~^0tuv!KNhBMp@3^t%~a6SeG3y}FR2@y!Ym_e94zkzP@8Q8EK0Od9y0 zZUij=g{lEj4h#%VdPS+A#pn#+t%aaT6Oj8rG)MsygVaHp6jI&)L%ZK}`|>m=$}lu1 zN-!8*`Y#&5#mHcMAodUkLkxopLq0<>g9}3{Lm5LRLo!1uLoq`PLncEWLjglRLn%WE zgE0eWZV`O=`5CZj&2KCgvT!pp1b4@BgoS5uMebX|!pP8Dd*SoaPS-!Zt``D&T~7q0 zE&VU*z{SV_V*eL);bLU?U(E7f)PswWq1*RQd|dR4`78_!Cl9eOoB_E4VSfxm07C{t zB||aTJ&6oC489Dh47m*X3`Go}IT{p~1O$hLXK1m4thr!(JD@Z6Luc$4h{fHtBE7B` zI$d}4x^4*AC(ppo5Eg#ibpxnc>WtlT+;tDAAnuGk&>4HAQ~tlG1{WiP_2Ev}AN)N> zK_{#9x_$@<4i5Wo{$JDtA+?HufuS384F}Im<8RC-I(=XC`aTHk_5BkV6d?R5xU=+4 zx2XshBSRKrr|W~x&?lX-fBs+Va24-$eG$;>`X}Ij=^Kzx>5Jej#{btWV#Q06tqzyO zce}pm_I=P@`ldVdiS|M1Pu7P!OV5;eWUw$XFa&2YcKY7v_2mid^}P`o5Zvj?)9d;r zAnX5s^Ulya|3xieuB#E~c734jdZXJ{fZ6p+C*x}lkmGGY0q*)EJ}&y?Ap!73PLNm( z`(MhF_5Z)90w`umIl4dm7X>Rl76(cg;6R4PwnTI4A5diTbUP<>dvJtx7xRR7SFm(D z@az&%aF}C#sMD9Hv-AglJLvim{+30c;Q_f-puG0-DOd#yNCgW_ z1rHY^1K0*oiT3g^$PW@A=eB@$pxVlSJm6}p0HOq%lVuo=yZ&KhU^oD3S2MJpEK%$} zc5Qnz6Bhh!r{i}rQNX{X-h%H#SyT`8fbBGBcRuHN!rqGQ&4FU z@c&w`>zaUG*EwL;i~!?rVPRQHy{=0F!h-*c`he2QSJ%aGm@5=oa$0k7L%Wpl~$A*UtUoVUtwVulW7bhpvTMW z6{IAgxdJw%ph*OahWA1qbw7S-WmWY__U+=DMTjG0tH zk-8YfEoJXM2xff0uo#p!Vqa?f{r_JBDeO~t85k6}7#KK^#K0RpK=}@f$7q!f9x!_5 zr#a{67J#-)1wl?JW?=AR^vs9sqJr!^1f5L=6A7-&P0G*7O!mpl%VuDZWC<$C@yyFC z3C+s{9VZUi2E)L>&Kgw?-r2~Y&Kgzjn^+K*nOg3j77RIjmw`cr**_^LH7&I$H7_|8 za=M#SC3K6IA!}4QXrl&9aSm%#Ie04uni+14p81enWTga+j6pSq5?BN*15Q(A>EW{9stSZ>UKPZHOAsR&;M9{<0 z2fV8WOOhA>Ax2PZ9<=WQ+{{Hd0NmzhFhJ^WL*yX+WKaj=0Uray6;MYOA^|6_FoR0f zFos};c!n?rSB4;lUcyRyMjlmzRb}!5Of1nw5CeURI;5`hWl8Ax99=e}{ zg@Fa!Plk3|zH1fc};K7i|kj{|7Py}x4<}>7g zTe+DG`3!js3Jk6cc?=~CsSHI71z@|2!KxG(q8ZA;P>&%4Nq-fC9z!xiK7$@ZDML0x zEZFTC3B$_BN(ix^566c`d2 zlA&$#Vg?0<6tF2ERiHg5UJRm0_Jn~=1GSk!{s5V8$e_ny#Gt^C#83(jJCJ!v43!L4 z3;(KL$nyABI$h zbg(W^$QLkFg53%VXV4jpm|_YH8Vtz{nhXjIMhpfF1`HMq3S`BM9)kiy0Jv`e3tLb~ z;j_<&A)g_gA(Nqk!Gxidfq}sZ?00{tdqF-0`5l(tKp_E1IUpHO%)t6Y$YBt{Aj81O z5WrBxkk639P|A?ZP=b=?(Df=XxPa}0#H9iQYV0X6K;n*pL5G0_!(3Fg3~;qB;L)%! zhD3%UcUzwl643sfI!00JBW)n!Gk)Hsv)H zGtDxsF&%NRCR;FAa#%`P8d`=}rdbwRR#?_s zF0))?xy$mHWw-S_>&4catan=<0xcM!nhR-X5NQ7<0}~U2L6cN38>d#AN85K^Ms}tJ zO;U9RO;S}%jEsid2ApiH+I-ARQmhOH8EjnIY>X_7P3BCDEDNFxA`Fa?MEDIY^S(@YuD11B)KvpsxQiKCSs4t1!A@lk zWnmL$3Jo?CHxOlG4rSpI<_k+L$_&m-&(l%x%uCiY)HcurNiYj5!6XzyKzFtTmn7yE zfbI%`?)xuRaCS716X!KBH!w3aH2{Msab80s12aPtBV$ubQ_CoW7$Pk-F))Hys!hmJ zkV{jG6m%8bjSL#+BYTpOm4Ugjm%*U1lc}+h;mFocL85y)+7dLyyrT8JCuX-#{A?N$ zVfyN#SzMBDP@qZSq3Sf*&J%aFj%0CtGru{bWa76;>o#mHoAz;~SF)?SUN-k6KX2`x zcM)FQSJHKI~6>;;d(`VfSrT2PQAMcZ$mE*%PRqo#H_vsId4tXA$mtgbo(LS-o z$rYI*)oXQ`m>C%u7dIX;Xgp|O!p5P^#>mRb&dA83VW4K90^=Jnwn=1^loVL$>*psI z7wDCx7G)M^rswG;=jR&murY_q3NtePXJIm6Ffa!3$Q4YrVAM?+mBU~0`;r$r6E-ZhpSS1ptl8h7h=&3e6uUD4jfk&}IEs*K7WkIOC%uNR&_$+Sh} ze8_RJ#SJk(EA3*7YCFW|={PSs6@0GN_M4W~4*w|(OLMuJV}Hg4f05W6&R=l&_t&*k z7x0PSJ0jMQaFSm;uZ`v7>n|1R7g>+KGl`Dd>1p)I*r18|h(QyxE;RSK@0XlM9MZCY~X ztipP(+RioYr60EVeY}5=e}8)7-o+_0w|4(LWxTq@pfjSb=XUm8vw8gcFTSbxRKBb( z-)8^h^}M?>zT`|fwKqt2wTJE3ZC7LCrJ3gc($AJ#@_q5FWl|@Y9@hH=J?2Yz;~-PF zllPwe@h$h;_r_Oc8R{|5Y!qJMu5iwY~8zEyq}-=-dylIW5GHR z>&@*4cSB2z+Xjs{$Sg5HX$Mkba2T*LGX7^`WH4|9Wo>yDD+3Dyvjrv#jM@xvl^c+> zf}B*G9l@mtD5c7(vfwE~7}*R|K=uf-$Qnp5ku(s8rEg|oo{(TiBLfo)T|-?{W90Y; z6(o&~3|`qkUqu{pkumJ7oT)u+f72SqYcf7(H*`hh-RIC;9CzZ>WZ~y5LA>wX)%6)H zHas~w*>Bbrr6kes_U4NI1%?eDyDi!`zj!g7;otetX?`k~R;v3|t=pdH_*v`R^OHB@ z?(WuZwc9#(>&=JZ|MzVY(lX5bX6#|Mfb3s>* zq2yQv$I_CF{G!Z~N^p&8Vqk7)hRB*At|=^QHf|x(1<*o(TUZQHr52SImnit9mXzlg zWgA)>SVEj=1Uf*c7<3&N=x(ya5(Q8SDYnwrFE1}gty+o-5*0L(H4RJ*^$c`Cnwf=F z;ikhp3OZp#0aQ(c8Vg1S1}30}0-?;mZ_m3ub?=*BKQQLqy& zWxsO@>bZAW#zR>3)xqSdpMk0GF0Zow`eDi(?cbl$uBhDl{&jwyq@~%O3yaG*DZ{A4hP2QyIr~a*# z?_cg?&6$r{-D`B)>R*KSuT4K>Y&20=;m=BCky*KiTD;3LSgsc8#47&k;8pu8uRBru zIb*2rr(9Ewru#RuW42wpxvKGR{MqJR$#X9#{aI=4l)0(TYU`dY^Z4VAywYjv*7zID zG41YFMum$%mr6W8@Gh{x{NXlMk06hHi&uwV(1D-nbLmJQ&-4xH7VfGlN=_t>Op#~NGSDzkTcEN)sSO<2R{HuF z&4_~JL}PIF2h}CAsw`p#A~0K+ncysD)V2g8n}Hx3C&Y11jEpQS%uEc7;0C3vAd8ZL z!V)Y`b?C2@ z&^HcC-g-Jtm^r6&&w4%CQx(cTWhD9QUuWzwy4hiI?~eWD&Mo#Eo2GqS61D5Cp4#Pm zHH>)-TntOtCJB0QI{cK8s7zN@d9eHH!+>?tU-|An&}%%~usA2ke`0B9*Dj?`mtHxR zcIYRE*2;xMO^rNt)1>i0eB8IHtp-gje+-(KpFoSSB%VFH!aN>TH>~@rl=rOu9GZ&_ zhG+>QC(dhNVQ64r2`?B8EJ0j&!MGo(V03qaHJUht*?jWzQu6a)0_<=BX#+`6I^+@& z3QA2;aLcby2=!L*$;{0xNlh`dGq3?katoWfWTt19B<3i1x+s9ttAeqDt^(o)wcz}; zlJdl&R0Z(yO5l4l6v~WXEjexxZkN=u)SUc++|;}hL#UO^*sR3co!KI<5r0zGW6`hQ zYaF5lkMne@Z^*S*Kj8ag#fi1-Yn$iP3J3J<&7HMPnz6;4Khxot__3{WD>+pKTK8|#9q16_=w1}+6IZ>UqyVQI858f9Wv+jIoK5QTR}X#@y8b2i^0s_7=Y^_0rLvk&UhbMcp}gW`QujJh zhwuHav#PuLVhSzCB=e;JLb6W9qzuV&sk=Tsj#VuR-HH2AHWlJ>E)rIo4+-?_GVWfpLb)4Yiq}w^xvx#uHHLw=g`!$wM}f> zZI4GLU;DA!K5unV&XrKaTO=cO3R8OVT?aS4keGQD$tQ9*tYII|mS z8mNQhnT3%G1#lY()G~tg$rOU}^Gm>uJ2L}QBV$8z14AQAP`?YxH3V^KUY+4BVot_H z&if?Y#VE2x;697P?Z@Hkvs@keTX?uH8sEGrc>WzzguLo^trae;tKKlnSJcm&ymJ=A zD&^X1Yg!j2yB;r6Kl8=sSZU!U%lH0HA4>0YO*q!4kUxX}#~S7M0!_0eC)=KHoTYF& zcxmf%+kLgO{;9Yc-zgJ)%fF~F#V1v-F~fB^tcX!IXkwHHM~$ok3zq?h0UH}jsH_5m zff*YobaYLWodp!?@-Qw(?}Lk-el6GM9A=PU!KE?KtK{lNQ6x2pTY1-}^e)SR_{ z=X8rj(d+vO=MJy@m{THuyf4o8*?T24?+nvE-en#AZJfK7sP28S;lr=)LcjD4r<+z> z?+g8I{`!Mm$NMJ_y8g=K=_NXPly2FeBdc-4lmEKt2bE$~n=>6e_cVM`L;l6B>v<)) zRwr=NY%BM#HVvkX;*UJruZ4L1_Fm1tXMb(w`TeF0F}vrT|I^edZMh(D`nG!qHnabC zndWl9L`yPe^}7$&Z#4b33LiCZtt-8{A{z8wAI?{^~IUO?Aj{zti! zi5}0FGygFx=K0{(@h|L_r{>i6oVOM~-S&CQSnk#jWmhP+P`t#9{fxxI{UYPw!v zwTb06$3s0W8ESV_m^hy|_Hj+uegAIx&Kb-28+(rnY<>84hQ3FBaI0rZ#q2k+Yo>FD zsvUm6tM|mkrTS6zld}`0jAu*iSd=7iPvuqFLw)DhZ|>FznW%K$(gZ zitDS3xtPx#eHCec{I!h zY{-LDNwOHoAn~{j`3#U{MGce@8d(g*SVXF4Eskty>T}6|Z@2P>v29<}>6o1cjgyef z;4y4$HfU^E;Md@TXU0&0L6<=RJnvS(;18aM1g*9M&HLpsq@c-EFqkozEYxezftCTF z4t7RndPY%dm0ohbUTL;|N`84B=%(IceaN|v#zy+cwHPBS150BAL%W`L)O1cM*8uh7 z5~hxBZVNsZb}Wo>KPP3_}LhcXC&miUs1^lMY($oLOU3&zO1rQ`|YPtL6ME zEn*s1|0q7cSzYyKy3>B;MOmq*r>pAizx6)i^?d#flkyZV_{k<-HE^708oH?CNy>`g zzulqsFQvX+|NL|Ei4#e`i&PdiG1eJ0F;*c$l+Cb-G25VtF&&in(rGf+fMte*hm8X= zC&R?b%CI2PKmy?)W+t2F~GRHROl%Bn&MK3=GXcvlQ|OSr$Vf7JXA>%++1z*R^w*zWw%e{t8EW0&rXFJCLJhJMk#d})w6QVRAgz=Bz@Wsy&BOs&&hCvMvF)TAKh8flil#^@8|N29!b)0WleJ0wC+A89;mHKw2FbKuqvq zlHj>Quqp-Lzf-WPvp}y@A%+f)=TXKovkKka@86)ovhpP+WlA20ADc zss=Tz71bZ~UDe&lK-L1gD;L+)#lHk$JdYqGi!K3@8N3V~H zfk!8!M>p$UkVtO`i0jDV(apLQ#P4(z@aSgU1Yt^ebhEC9FcrF4*K#s2bUJE)Oi=hQ zn$OR`0AU-)z;bog|ps3iOsea{E7 zzeQyQ0|SFkuZv2>F3>`9kM46Goh>S$%ZiS>s8oP5flucW70}YE<1H!^APJEHBs2r0 zuXBkC=+IH0PPPA{&-fS^S`T#p;O|gl1O*kJN3V-YfvfRJSK|XM*Y576RtkgXXmohd2~$6Zt`KqZ1lZx7g&pwLPHNgIITFT=Ap zMCCt-tKrej=W2Ws6n-GjKz%x$7ZNNL!XQhueN-|$n0-_dJUV?DUUPeN^ZgginAfaxtNp!-BTy4R?HHi3C`&rtzYP9BX%KzqNClZ8j~n+T8YCeSu4 zP#6_>be549U#!{AmPy+FTwif{{Cdg?oZ7>Wcb@l7(ubm zd+N>q|Bn3IS{T2GFfcfF_cUG*VPNoNKKcJ)^Dm|%9>?Y%j74nx+lAkBFnb(#2ZzQ> zC(v5;U(EbXri=^>{M&{3w>dL`BteDoyO%0pS*9XB$L1eQMI8Lwh11@qb%J$+O2d~d zV0jk)CeXrUknZgW-D&S33)z3MfURZ$Tm2TI8B|2RJPums{)>aZX%}eIf-?*M_RBDv z-@jbNz`)RYiN6JuSbacwK1Zd(qx%&ot`t1FFTdzx0wuT*6%A0V8~F74s3?G9)Z)d` zKcKbg-5)AMJbFV^6nwgmdUT(D5f4({nQ!6Ioug9GS#I#!xAjtqImlp;PLP4NAQjyq zDi$8yF)9ik#}9(earrO0jT>aoY0&nAZf*t!kXE7N?grqs@|^oXYwUeG!!1B%(fQ7D zga4xI!0N%V6{Awneaxe~L?ytZ`AEcJA7KWDEMW$Q4q*m{6~YV*$AuXfo(eNCFo`fQ z#EUR6EC$s*92^{s92^`>92^|X92^`h92^|192^{M92^|%ph5!)djxwlzJa7I)*I5G zBCZ9J^m;`PzWV6ffn*syx|=${EKoVuGy%dC@aS%u0bxpXH-YN;PDcfg z?k3PF@1U##3V(1x*`xtc#o^K2WB_4;^jbie5+2=64iKh7casN*)f=Lc0WByU{)@VC zfeNZA;KBzKi2?sbjk!RnHbx}@6mbqdoiQo~jypl8pn*d3^f4C|4Tj?`DxjL4;lHRI z7Xw4 zJeyxIrFDYDn7$okDdB|(v4BNbe7jG09(>7K8USH1mxy?Dvv7f8qWK_)=l_$XA3U2M zu=}hwedE#i5~N}WsCnhn&BFyUnZt+wFsBdy z;Xn?bZXYfIkdTBA|6xx7keCEWOaUaO;n9510VMtaB>n;<4sqE36ClwKAkiPCt2`TD zfNbz=`~jl)n+yN{|No(ZM}^_#u7AkRMFd4jz9;hua0DfSBFGFBLEIkyPr~8|96uh- zFPV_y2pm5i%`aKtaRiALl=x|W$pH#eaKJHQ#t)JeM8=N`*AGxgeDG*~35p;IpUyx5 zPy})Kbc=9-t#Rb==@cxz3XYy)l;}yDkOq#Q5C8v{L*mDy@g*o);L-FS96tv^!3K>V zAEC=xthfW#hv#BPAZE_gJ*1ji64`T_+&;$W9SA_x@Cf`sA+ znu(AocmkW?Va>}Z&cIMA;BoMvK-%|%;QcKg2TuyT4Epo`{~7SEJVJW|!DAAjJ)vhH z>XG*o5!%IvzUwcO0kP*0W-h}hpjim01fd%35eVTYKO{Sa9bnYl&Pk*r8=rE{p zN#g#cyws9-M_(5+lbFQZ6f=_;$go(2nF(wY6Z}p;Atna4OH2lgYCH^TMEdybgv&0w}NA;|bh6HQ@c;kI?MFaO zi8DJu<9bk+i3Kq*2q-WxtUwa81JxOzMlMthGBr^3)HkgAE8{WtS0=(mQ1>$0;n-iP z3g2Jpj&*;f7oPol~VvuDZcAqFjuL6-fMHv`O7&tJ@#=cinfdOJR1H)k4GfGbB zHL8d75CDxu5BUDnKKZ~hc}0=_j5U*Dj{bakyx%tN$mssm(fz5=HBO*)j>!93NB5_W z?oS18^I>5g-Jd$TKXr6}>gfJd=m8W8A*1_KNB5^PhsuubPbGG{_~`!BP?kZm!+msr z>gfJd0}a?#QGy%sNB5_W?oUPDR{}bsYjl4qz7xGh_ot5TPaWN#I=VkKJ#PRziuBu` zy8r6K5}m4jeHWiG2Hjlsis_@warYszKb61g_1ZhVzgl(c-}pRZV^fvUktt5uR^d4R z|BAO&_i9}26SB@sFzQ=8CH3*D3_aVf7{gB$4pGaZOxz=XOg~$l8^bm$Cq+^<=$FI( zZZ$=oof+>>?AmPKe%naEXxgM}760qr6;F8g`)}I40uOP+QY)vJIhQZ3?eC6@YP14jeG1Ac&Cv*DlG4QEdiQJBW>=0&(=htXBmlSh8cjwWa zmvc0>&AHWXZ5aJH&8j5l`20H6sVtqG9qQlC8;NvU-^*Eac-D(gA~tq21rmAJq;W@v zZu>b+puAxNw1JVkkLFY?@mK1@`mj% zWB}a|&A<@GAPsi|wa&N(g^dFP57L?e+-FxKuhjD4c;8T%7D~uT!4l($moL3Dw z5g8O`xnNb<44~L#0G}X^dXBXM!%C#{s&&C9R~s@I(){FV*BSCM$6KqUu49WkYbhV#cuvV;2J>Loh=DLn=cuLnipFa3|>5D=HwOIDwP)HSrsQ|q~<0T>%tF_(M`_JwMs0` z)hjbpQpior%S=lxE(uF5D$dN$vsE(GGf=YQ<+9O-nPnH?$Z!F&PkqOt1B*^9da&rl zq7REW77Hv^SgNs+Th?TfWP)^eTFepIoIEz@Au&`iZ#lnV#9SbKc zoUw4h!W9cQEZnj1z`_#?FD$&V@WH|t3qLIUv5;XA$0C765{ncTX)H2WWUh#i_vFB_|-is3a&gF$F}2 zCTAoTfi%0iBiw{f2~>Z0QD#XhiUASsuIMJjNst+=E~FJH{z<%=K#1H&Z_1_l;x z1_nDG1_m}k28IVh3=AcL3=H#l85o5485pMVF);86Ffd5*F)&QvXJB|I$iNUM#K3S& zn1P{3fPukJ7+gp(urqKoa58W(@Gx*O2r#fPurcs5@G-D52r}?9FfuUVm1kyvrXqL} zL&=folCTs8PGIPg@Js;C15jB+!h;zM$*CC9Fry)f7eg9uI3$PRi*fWq4R>*cnfi%I z<>;j(&h$fEA}6b$hZf)Xic0KCV8INILF`K4K@E;a6g9YF6Ne(0Wso?OpFM1AaMrfyy&&21u@jwiK|pUr-{GfvR?c!X4diSbYbsTq(8N1e&bS{H?>l zz`(}9fYEM)SEJxs8`W|Y9ucL1nJIR=b)jV{)Ze&T11Q#!5$bqs2h|-Iw!?xQ(#)XL zb~EgL*JEH{0M$?!w!;G+(tbg;9)(9t$ipgbv{=_-U|`?{#X6pL5sF<5C_Ex;Hi3_d zpyo4BX~_t(8MVEIVmujf3@bFz{HY19u^AZfj4@DXvnh@cR$yRY01f+K_6bleMBxz; zuCP9z0-8@jjVf+XxDwIwM6r|Pm^Fp=I?-Jq2d$;h`!f{Uh9e!RGcbVLg*balsMeBP QR^tn2Q2UUW&KRl_0B%toyZ`_I diff --git a/dependencies/winring0/Win32/WinRing0.dll b/dependencies/winring0/Win32/WinRing0.dll new file mode 100644 index 0000000000000000000000000000000000000000..1cd219a8bb49b76532dafb1ceb60d9bbfe3096ac GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/dependencies/winring0/Win32/WinRing0.lib b/dependencies/winring0/Win32/WinRing0.lib new file mode 100644 index 0000000000000000000000000000000000000000..e7adf350ac510faa09714608bd7ec89f89bb3cf4 GIT binary patch literal 14774 zcmY$iNi0gvu;bEKKm~?I#-^5rMwUhfsNyiLv8ka2L?(fYfq@~PfkB3ifkDoUfk8fx zfkAl!1gkJHFo5v~1_l)nu3=zMsbOGHTL-~PN(>Ajtgghs0LBv-7}P=d4+Dex9|i{1 z90=CPU|;}YixdV15Y{}vzyQJuM;I7DSX+XD0fg0@7#KiU(}#fpge_ed7(iHS2?GNN zE3RQ+0AcN43=ANwdX0ergf(t3Fo3YdB?bl%)-qsV0AWQl1_lt;?qFa5VVxWX1`yWs zV_*Pb-53T25H?!CzyQJ~Ees4GY&?m90fcoPF))Cz-Vp`{5Z1lKzyQL=5)2F=Z1RVJ z0gSmA7)-br7>qO^Sl^C;0fY?=7#KjI+bgiXsB7(m!Oi-7@z%?cP8Kv-FffdPb- zW-u^-u>KAP1`sw}#lQf<1{)X{K-lyX0|N+~KVx73VY4?33}$cQ<2`)?{DVT`U0j2m zgFFL5{Db1dGxLHn^U@6%;^X~7eS9!gFx118Koo>{g!*~MyEuk8GT6JPmbm2P1eYY1 zlomTUM7n!NL@~t2XXX~fW0ismhNTu2XXfXDH3T@i8Wa`v8inI)NtIhj?d{yAVzdLVRQm9uwA%|zD|fzX3P*50$& zxu7&N1>`1V8&E~WvW$s4|d{fQez4Uyz%OE(Zw@WKjbHBsYPB z1XC6gDo}9@Yf6e?*1)7dVH1EYY>)&YVFMF@>4auGaM+;BLBa+miWxSjGLW!=iD8&u zkeiGy2MHTwQOvNxl!b&1R2;*al46)OFe&?>)Wj6e{DAzT5~s=%aG~Mqj!5h{WRY}* z=NEyqwL4Z_D6&YpT*{%^ys>ISm9`Hr$}CAmb!3FQE5emH<&ky5oDzZTQY4+I^2j>j zu8D9*N}Nbq(G(#06BMSdkfi4x;E3d8)PO}*f}|hhD1;=|u)qhB z8f4!idjZJL&k zhId;~d#m#ur3fw-BDl}72T#V!` z%=7{`1*8hi6jbLTc?#7SOl73^{EXl|KT8G%1~wT61~WMZhCF!&h6&0H3`{Bv3?Eb& z7;01)7}lvl`gcm|3=9+085sVkGce?+GB9LlFfgQ8Ffbg@WMDX=z`!7(&A{NK#=zjC z$-v-Z$-uBgi-BQ{A_K!OZ3c#GstgP_G#D5zSuijdXfZIDDKap0XfrV6=rAz&=`k?G z=rS-YFk)b6F=1esWX!_B31!fEkV#*8*Gn5z@cIY!OtTJR^*kHiG@X3^c;h8xD!y7Yj_m)AB zL6$+Bfs?_Q!H9u{ft7)sfsKKeL6Sk3frEjIft!Jcfsa9oL4-koL54w$L5M+)L4rY^ zL6t#~L7hQ?L5)F&!GuAN!Hhwd!IVLpL5V?wL4`q!L7735L7%~#!H~g{!GOVnfuBK| zL6m`!fr+m6F*88gOrT=Z1JS;Q2tu1gP+?HYf`~(#k;vk>Ixz%G3^WBOB^S7JhTffo z3S#Z@f#ooJY@l8#SQNV^BiVwbLjWowQQMQ?Dh^!4BE+Eu6|~`o zBnd8lKpqFTUeP5G+Q6v{VHc=~1nB}dK#_ET#1Wdnr6NcZN~HqQ2Wf|ZHKNEt^}^~U zR0RmPf*TT8B$2ek9Sk=g#Zd%9^`e!t7)>|q%20}9s1i_Vie4zANMS8ykyL<-V&ow; zbUAzmAQje7ZKy>yLJ$^Eh(0gY;v1>~tq_NcB8{ZM#gN9%pkm?KkSxLgP_{=>0xvmWP+Pzi45kXWryJJi{ z{WGz&giQV^ByjmKGBe!hSmnvj$iTqC00xYDDXB@N=_h|GXn!d4~zq)9T)_h z^fFTtOA=L#ph65H3=9nC85kHILj{-_7#JKF3=TlmnL&ja_!t-%7#R`jK;jMz3I~`N z7#M^ZI6+(n9%N5xFbE5Se7#Q$OH%M?clf>I2qF^7E>53-NQ2uoPg7%eP84FhgaSfY(FP-q*DGG3a2fdSNP zMIDBwon5>TpCOHjP-Yjr!H5=$3JeSkq9D7#Ln`3Z4;~?-Wl8~+Y>**)fxl0BRLb!A=}C6)0TAA$FnA%(HiF7ih!3Hu734>Z z#7eS_ILbCqs~OY<1kb4;CO<%d3!aQZwukhX#MhRy1&1tr#1S;i1Rbn_j%%V=jm#k` zgmKi2Y77hvpspK|f8oPY;Nenai%6~`&5W_Ps=&Du)xTg{5gx{fVA4}Do)`voLXmt7 z8W;n`FnDwq#ls}qiZ6!kP<;%t72#pfcpQq=$Q)u~7+>2t5N0!cybzSUKwgFnMkCur zMykfsKZ?d`Gt}F#L2eZ5kvT;98%M1J>K}my3BmCU_cu71fjkZwmqoUW^wf~hfGm^(CPw58OOBGOW!VP3Q z?wJV`ZzFSvNol4yTHopn3=E*rRmfa0YNY|0@IbbSjQoY8{s*-k9YFpCPf#H2g@!eF zB85Vm@r1Mmn$6(!4N72;2^tiOkvYVKG`>>Q37fqzFJojXQfc+7n7JFeH#>h;h=Vd%~G-!YylB(eaD6Hauu3)9m*Eo79pjKua+}9{}Lp_eA_$J-w zI9i>c@s}`6+Yt#IGF^w_bz}}vDI8A;nt;P@xYsF8<@nlVp_sPA6FOva5!tU~q;x!S z9*^B_xW_3^?WQcS6WdGIqbw0getU}Sia#>T+Vocf2M+m)l6gWsszSD=%zGmxd*RpK}U z2Ll7cao0cp{{R1PeBiaD@d1a!-Kj6ST_u_oVB$L%85j@-A*jsK^*)BD4OvbD#*sb05dd;BO?Q3<_=b5*BX=OT96?ygU^7&u(6ioOoGFl zZdaaeh7y~`T8;||4s%LW8f!VOfEc{pt}@LE3_Exk7!JHP4)`xBz|Y9g?JLsB_*y#P zzo-a=m)6PnnkV4Ds04)D!PxC819BjT@qySw5|F@w*>+sX!wIcjY%NZCLy2DsnFLkqZy8htrna;q# zP|t14z`(=6-_*sxz+il!`#iJn58*@2FBzL}Fti@1FR$Tf{Q3VsKSOzLa27*&(ErjO z|3wWz{=L!d#^G_ym7k$R+oMF%!=r@lm@7ZyYwiDKJpW4tg8z$}fWlV>&b0t>dEs0e zeny7y;Qyiy{EQ3@wfqdxr99oP5}<^@VSL~;@%v>&yJ@*FlAA%XS6^hTT014s$?4Z43+yC54T@7!(}ll*Bdu zVgb<(jlWtzv{K`*4h4rf{H+O$pvd9@xhm*?0Y}h_55NEae|Zudg-D_eAkobrQ8%7$ zQ4T>yhE9RwjG$`mr3}afH=g4RtPD(yuU~bCA!+;m`~Uyf^^LzKfb2AA{B;DBH$@tM zfwFE1Pvb98rsZ$F12VS`tS$V10Y`Yy3&}tK|G#$s^6~)4L!i87eYrfTM5XZ;OQOS^ z64%CGE+AT~@z)7Z_Ty>%1z61(3V;9qe|@d- z7dSibY5c{p&|yxAbmK3Ng${E{?NOA1b+2w#WY`ZbT$Gw^LBa9AMEpN5i1C^qCcyTe z6(nH%-{?~Jxz0L?|Dqb86n#8CE;{xQ2U5;#ej@@Z&%?sIZ9&yQ#u0F>@Fn2?_3l!R zUe`YXSqvGVHbI8N90rD7*DnEC3}OF8eL(fZfm+UHu(khRyEUtVtYg?Qhl7!!)6JsO z&7sq+09wVo2{`U%(#FEb@c%lqzbUBh>vmBQ=*&?O=*>|P(0&jc7QT={kdeXA^^fttx|4V;#yZ(VzJ)N#U zdR;%HEC%U2-0k}zrIQ!LjEs+ui|&3J8+aI0ouOfH-f4a#65Jij6V_eKVQdOAKfIf* z`NzLwuKyX1yZ!*RBzmg_N_e~dSeVZn^H{vdXJTOJ_T%Yx2b zslivEH}p+s@SpBzp61{GI$hs%`hF;h@AYKpWr^17_2LeQ z@A?Dc)5FJIe}H`c`ee5+&x>ZT6pv*DPl-?l#CMmwPrPV@2zUE(bb9ch8{Z3(L^8e> z#CQGD?ZMG~{iOmU1H&#*U2hr8Q_=-B^7IQ+Mh1qLA^-pXhXrwPSa^4cia@uEib%JQ zibQBoKww}-Juf_N!BJ^^q|-%(Bc)Rn6@%^wj&2_n9b?Jv0-ol7|4Q__LsU$f zfBh?AvHn!1*lSYO8?#xUo4eD4r@5Miq4dm7Q2cZ|bG*37z`*c&Z%RM7Y1@26B0etq zaJP>N%Xdc>P>UB-doh$4ce|)?bbD|ZpLns7fq@~kJ451s0nh&ef&T>}FTDT%|KEIs zCl;(GL`9&JX$Po@dpNY)M}?zX^M9et|3ZoXg&HrEpb8JMFocGM2Y0_RK45&?_>%EA zVg?t6RE9E!Oon8JREA=P7>00$ zOolv$ATXKEV89U1V8{^9V8js5V8Flt)`d_{NHr)P5%`lZ1H(OG28L6@3=G?Z85oub zGcZgLW?-ljW?IH!<*d5&dol+o;iXu`WaO6=6y;~7CYQvNXXX`U=A|3N6z7)~ zC8x%ukOPkgM zJ3%fgVX;0~D%UNl!_UaD1C+52zThxsS`1>9vUeW@GrnI~49ZinFVFw@|No4J5Zp9| z0$~OQ6@CT=79=qxP(!w??i8R8m`q>&*GMGT@f7DWuK zl|hujBQeK4wZy5k*d?(f(W%luEv-1Ugh3S~9*imO;pn56l9R)58WcC7dF7dTDGbXP zy;Ge^)15O?le1kbVCjf*nh`v-BLNu-LNbmK)XoEy^`K!Q6md=#1_n?W`apz%AqG?# zBFTc7G0Y~Q&KN^5Lp(zmgDXQ2LokCUgFk~GLp*~ggCBz%gFi?a!(Nv6|3HHsObm<+ zpb88|+k<66|I)WKW7>b}ZlN&=OLk>eKgC|2CLmERq0|Ubhuo?pf z69z*DLk19?1o8)i7lR}NBZD(TK0_`;E<-9q9zzL3F#`ib2tx)#DuV(;E<-*;3PUDC z8bc;SDnkl`0)rDnFoO$&0z(e8Ud&@CW=I9Q!;XO;ZdL(9B10ZSC4(PBBG_Dz0)K`A zunj&8nG8t`!3>oQ#SD53`3yx2=^$waD+W#mMh2MML3M92Lo(P;1q>w&nGE?1d0=(u zwJ=D~fPn)^Zx}-=LlHwUk{&|_Jq9BNJq7~?JqA#N*@}Uefe{=&C1ACA42cXmNUlY< zLyw^t>|T&v^B8Oy7#VyRQW?_0xTiR zH(0oWdXp?GD`sn9Yb9$_>mch*))Q2?jL=4F=tY^9&aot~K0dxYv+k&yZ*UXiS=ciHX6WNp3G2r&gOs+jm|@cBTbQ za_bD5XeeeN0+Qku=JihkwMoHJ&W?tP2J#?rW?=~= zEhtJ1t*Jp-^NDe~r>Yf-$L z&1GM|Kr`rwBh%dey~>joN3Rz7`#Yv8d(LsGXHTx3{PX6y?8Llf+R5hcs=w#&O*CIy zm&v7n?6t{mJI)s?8*<-B&F!q3Y@Gcdm|eZ=+yUR^kGLlNiT@Zb_9FTDrNFPeeVw}7 z4oy7ZI?1DBCo*8BTca`%twOHp0-Wpb={ znVWvd4!NlArgw$+aLQUAf6bFWGqpAUPYpNVs^PVaS7j`EEc9R1y5>bk+>e9*5{`JJ zCpJ7e#ktu#Xq{j-<0oyG?53)co)uj0;``=*D~gjn7ggDEC~vz~V${4(Mc=+}dSI7p zk`}W*AbaxZDBXwZ;&mG**?isOInPix$N7JhnvmZzE8mlgO?X$Ocpfs+2w(fNG0n;5 zw?Py0bAu+P^Uw?oDY1XnuhNr43oV0iq`ZSa14AN}gH7sQf3}C)LIHaIfsMOKCDenr=tfo^zXih-6G-=sZ8? zadpM2;79M)m`;8EH}<;Il&P1c@(e@WufJY<+-H7BVY8I@iJ#BUMKFFb+rQ2}a(-%! z1A9!dg2^JG!=7I<95UrPAGE%-+CDvbxBCXmY)6K=uiiWAA1gw$^h|@sX{Z^Pks|2J5$eW*L=5x@0agc@5K zt5V6N=H<7y{+#sq#bHSuz2x`1#sRm%D(HLJR>4{U)~(^Z+@lGjiNal(~i$S~Sh-mX-#FMiz#k;u|xoH#QPo$fz19Lvp%I zKv8CHVo{|6q_9^AC{4=AEY8TxO9vGQ1_pW{Wz53rNJR%e9R&0KqS>Wd%Y}Dw7OF_x zU&xlEDKziSywc(q_rt<7rwNDoe>$;;G2*RSTM>7{SIMKH%;B?l3Y=VcrNrTX4#SIQ z!RG(A->S6R5oGbQQD;7%anQ1}1?RkClfGO`kJ~fdi~ZD|yS?rk&wfmeZe`ryoqg|Y zpWfGi7mMf2RhyA*mh8w};PN5Co8%b59G{mYa$vm67z zPrFjp^U!5_Mj`W!i2S`<1f1USrj@#NyG*-ez#zn){M}_XW5KDg{5cWRwbaGC^$LS> z-BvHx=C2p?NI4Poi%pz?z2v&9a)-Hgx^SE?y&_=OqdsC*e z|NOZu%5q|mm5%z43wJI{&5CRl*vgQoYHcelenQZvY}r4b#50kXjyM}A#)vv_`WHVu zICV*CTL10KD+~mG9$h0W7_h>Bdx-p-^)sa`7rfPA7OdX2VbkvxyKO&8ygO&lrybZjZB*h49sT(b4V zerOS}(x7n}YW2_FfK=PBmkr_e-kz!5qhjLR7|XkQwNaFUfjy+Qw=gg>Fj-)j&kPj z^G)V#eR0a;=dD-2zKiR{td+Db7JL(R`){?PVd8;Ffzcb&Hq@lt_$RQXaK)Z^rRH?E%H814Nj_gvYv{@#P$)TU_HzbVJ^4_|*JG))ni(;u+gRUQXAYS^iGQ&df=* z-k^y^!Jvtm1EomdxS6QpfnFpGhFTd^Mu2(+M$ke5Rz`sP2nJE~8D1dN)8DZ1Qv*Z6 zxi^P^2WaIgJBEmk0Ho86vE_M9HZkE4Gus~xWU%c2U(-E6)F| zcYamJnYUX!IquETFk@cV*$7Ui1BV$sr$uyhszrXyJ+|}UZwb}6HJ%MpABa_J^RW2DJvRg#FtO|ubk?X?VOg)`z!Y~_)1r<=ny{iq$XkVC)G2|Ez_U*ZJV!qZELrQ&FZTbRwrza zZ2UO|)->2^(6|Y;Twr7~5CY{}aJPWNfQ^yyKNBMZQdvQ9PrsljGdCYRTm&v9&<7eA z7*Waytc?*YWrX0B*sd?OymRaPmopS5a))j9Syk|G)5UwoJ91?^YqVFoJ?)n7^Es3@ zb)x)ZUrVpY(goXH^6s#8`R1y=m?3m$&w{&ce(U-hg;^aYM1`noPVqYRF?Gv(w#r-2 zPq%$wIVo}HUD0L*#&D1OkBuMdoSnm7KgC_Wx1-mDXIV{*!ogbh&BfU%J!+R`Uw=`V zx@^V7g(YoTtV~S@TWUU4p0&}^=AWr4_o}B$YGc-`MQIj%sSnrQICfILqt~+Rop{p` z;oj-zk{zE{eciGxNA$3T@aD~|6whd zkUEc5X31Ul_1@w4j#;K#A1yIxVy!o5VoryY5nPGf_1WOjOG)%1q8_Q;9vTd*uQ`Od z!V|$w@sj*JL+G#oyD)oDYD#W?UW%cdfefey=Mon6%}g%JFV0UZQE<*LD#$NNEXmBz zGt@Lt2gx%FD~2=ge&r$mQES7_se&wfKO|p#l%958=I(iE5AAoooqe;` zYc`~=etBG1==5qCp91!Uwp<2hMSJ~!+`ZBhAS&}d;N20u?|)tfeVSPNAor@NL0_D6 z@h8WZSF;{(>a+^8w8&?(>Bx-M@;$mdWJgZtnb|*WPCfnG`BlhfQpL1ucS`amyCh!h zJ?^%tl&|fDWY^W)oU0XLQy0BF!DaFKlZvo^amZxhRx9Z}awc25S$lStcW=BcuP|{n zXK>zxbJgZ0I}6+=Dg`EsRj%8(&QXoygrxRGw^bh3Qnao&oBY?&I+!Er?8V;t{Bq4V z#f4 z<8t&qxY+5}a(&KW_O@khzh(L_?_Va$D9OZ_2P!p)6EzXdD?5~%m6@Hv&5DKzfp2g3=$G~fW z#{#!D7o=uPE-W$YCFker7i4FGh9>n3it#xuJtMefB;Sa&1peB3Fw#z5n%%lIPF zFW*Ru=n$LzZllzxwG)L~6mQMSQ+R)ip+sZX$@tH{v4?M|W~zp~a@liuwx+SnHJfSj z?Ttr+uWP9rU(u7S;fTn+?I$^N<*WG5v*z{$T1Ca|)nCbBIy+?fZBwZrF=G>}#SJW3 zf44OEtetS4$0~K&8)H8SwH=xf zKF(L<`19k&33cn--ruvVE?wX#63HU#w8y<;hcF-OFWC!wQ*K=UTS2yl+n@&%eJLVPWj6od~(4(jkQ`i$1E;3o}2O2LGq=J zxbqUV_{%N^!B1qFb}ix37rR@PpdRG3d+iK!jp zy6GpsG>EipZ{@j|rm^%`zDlBD6U#A!CYD1?jEn|FbZO?GPU9eEmKFpV2q4WQ@fb20 zFc?T8CP|nLd61-843rU4EQVq%B46us9w+{~F8X$t4an%5d%ZU&VuS=&wMk&0hZZ2mIyXorpZZ($~5L#3o8zRW3K&E%)dX?U$+*<>jiQ>Yxh-E7yF zvp=}&u00W+)4Z^W>8e2!(?vw+u^Bco9WrQQ+6PJljST}ZAkM@Mo)}<+j2Iv#i6%xd z0||snnGLz&9Ck(n890ZN)sP=N8E0-}W@v0|U~CwLkv_CMuHSg<%3k!L?^D|OU3K0L z3lxP68n>}=YeD8bIR%(_3>%jjG%hx1Twu^RmqnzjzoXNtz<8^P^_eG-1PxKvOHq;1&DdOE4(;Z4`l1sp=UYz$j$?mGA;&2l}Qv3@e+w#zg7J;J7>Elw(1Uaju5 gt?Z@ziH|Q*=34#x>*>Ggb*NH+hm{Yw<;cJQ0Js3iR{#J2 literal 0 HcmV?d00001 diff --git a/dependencies/winring0/include/OlsApi.h b/dependencies/winring0/include/OlsApi.h new file mode 100644 index 00000000..9f11e6aa --- /dev/null +++ b/dependencies/winring0/include/OlsApi.h @@ -0,0 +1,580 @@ +//----------------------------------------------------------------------------- +// Author : hiyohiyo +// Mail : hiyohiyo@crystalmark.info +// Web : http://openlibsys.org/ +// License : The modified BSD license +// +// Copyright 2007-2009 OpenLibSys.org. All rights reserved. +//----------------------------------------------------------------------------- +// for WinRing0 1.3.x + +#pragma once + +/****************************************************************************** +** +** DLL Information +** +******************************************************************************/ + +//----------------------------------------------------------------------------- +// GetDllStatus +//----------------------------------------------------------------------------- +DWORD // DLL Status, defined OLS_DLL_**** +WINAPI GetDllStatus(); + +//----------------------------------------------------------------------------- +// GetDllVersion +//----------------------------------------------------------------------------- +DWORD // DLL Version, defined OLS_VERSION +WINAPI GetDllVersion( + PBYTE major, // major version + PBYTE minor, // minor version + PBYTE revision, // revision + PBYTE release // release/build +); + +//----------------------------------------------------------------------------- +// GetDriverVersion +//----------------------------------------------------------------------------- +DWORD // Device Driver Version, defined OLS_DRIVER_VERSION +WINAPI GetDriverVersion( + PBYTE major, // major version + PBYTE minor, // minor version + PBYTE revision, // revision + PBYTE release // release/build +); + +//----------------------------------------------------------------------------- +// GetDriverType +//----------------------------------------------------------------------------- +DWORD // Device Driver Type, defined OLS_DRIVER_TYPE_**** +WINAPI GetDriverType(); + +//----------------------------------------------------------------------------- +// InitializeOls +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI InitializeOls(); + +//----------------------------------------------------------------------------- +// DeinitializeOls +//----------------------------------------------------------------------------- +VOID WINAPI DeinitializeOls(); + +/****************************************************************************** +** +** CPU +** +******************************************************************************/ + +//----------------------------------------------------------------------------- +// IsCpuid +//----------------------------------------------------------------------------- +BOOL // TRUE: support CPUID instruction, FALSE: not support CPUID instruction +WINAPI IsCpuid(); + +//----------------------------------------------------------------------------- +// IsMsr +//----------------------------------------------------------------------------- +BOOL // TRUE: support MSR(Model-Specific Register), FALSE: not support MSR +WINAPI IsMsr(); + +//----------------------------------------------------------------------------- +// IsTsc +//----------------------------------------------------------------------------- +BOOL // TRUE: support TSC(Time Stamp Counter), FALSE: not support TSC +WINAPI IsTsc(); + +//----------------------------------------------------------------------------- +// Rdmsr +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Rdmsr( + DWORD index, // MSR index + PDWORD eax, // bit 0-31 + PDWORD edx // bit 32-63 +); + +//----------------------------------------------------------------------------- +// RdmsrTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdmsrTx( + DWORD index, // MSR index + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// RdmsrPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdmsrPx( + DWORD index, // MSR index + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR processAffinityMask +); + +//----------------------------------------------------------------------------- +// Wrmsr +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Wrmsr( + DWORD index, // MSR index + DWORD eax, // bit 0-31 + DWORD edx // bit 32-63 +); + +//----------------------------------------------------------------------------- +// WrmsrTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WrmsrTx( + DWORD index, // MSR index + DWORD eax, // bit 0-31 + DWORD edx, // bit 32-63 + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// WrmsrPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WrmsrPx( + DWORD index, // MSR index + DWORD eax, // bit 0-31 + DWORD edx, // bit 32-63 + DWORD_PTR processAffinityMask +); + +//----------------------------------------------------------------------------- +// Rdpmc +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Rdpmc( + DWORD index, // PMC index + PDWORD eax, // bit 0-31 + PDWORD edx // bit 32-63 +); + +//----------------------------------------------------------------------------- +// RdmsrTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdpmcTx( + DWORD index, // PMC index + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// RdmsrPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdpmcPx( + DWORD index, // PMC index + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR processAffinityMask +); + +//----------------------------------------------------------------------------- +// Cpuid +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Cpuid( + DWORD index, // CPUID index + PDWORD eax, + PDWORD ebx, + PDWORD ecx, + PDWORD edx +); + +//----------------------------------------------------------------------------- +// CpuidTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI CpuidTx( + DWORD index, // CPUID index + PDWORD eax, + PDWORD ebx, + PDWORD ecx, + PDWORD edx, + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// CpuidPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI CpuidPx( + DWORD index, // CPUID index + PDWORD eax, + PDWORD ebx, + PDWORD ecx, + PDWORD edx, + DWORD_PTR processAffinityMask +); + +//----------------------------------------------------------------------------- +// Rdtsc +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Rdtsc( + PDWORD eax, // bit 0-31 + PDWORD edx // bit 32-63 +); + +//----------------------------------------------------------------------------- +// RdmsrTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdtscTx( + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// RdmsrPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI RdtscPx( + PDWORD eax, // bit 0-31 + PDWORD edx, // bit 32-63 + DWORD_PTR processAffinityMask +); + +//----------------------------------------------------------------------------- +// Hlt +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI Hlt(); + +//----------------------------------------------------------------------------- +// HltTx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI HltTx( + DWORD_PTR threadAffinityMask +); + +//----------------------------------------------------------------------------- +// HltPx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI HltTx( + DWORD_PTR processAffinityMask +); + +/****************************************************************************** +** +** I/O +** +******************************************************************************/ + +//----------------------------------------------------------------------------- +// ReadIoPortByte +//----------------------------------------------------------------------------- +BYTE // Read Value +WINAPI ReadIoPortByte( + WORD port // I/O port address +); + +//----------------------------------------------------------------------------- +// ReadIoPortWord +//----------------------------------------------------------------------------- +WORD // Read Value +WINAPI ReadIoPortWord( + WORD port // I/O port address +); + +//----------------------------------------------------------------------------- +// ReadIoPortDword +//----------------------------------------------------------------------------- +DWORD // Read Value +WINAPI ReadIoPortDword( + WORD port // I/O port address +); + +//----------------------------------------------------------------------------- +// ReadIoPortByteEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadIoPortByteEx( + WORD port, // I/O port address + PBYTE value // Read Value +); +//----------------------------------------------------------------------------- +// ReadIoPortWordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadIoPortWordEx( + WORD port, // I/O port address + PWORD value // Read Value +); +//----------------------------------------------------------------------------- +// ReadIoPortDwordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadIoPortDwordEx( + WORD port, // I/O port address + PDWORD value // Read Value +); + +//----------------------------------------------------------------------------- +// WriteIoPortByte +//----------------------------------------------------------------------------- +VOID +WINAPI WriteIoPortByte( + WORD port, // I/O port address + BYTE value // Write Value +); + +//----------------------------------------------------------------------------- +// WriteIoPortDword +//----------------------------------------------------------------------------- +VOID +WINAPI WriteIoPortDword( + WORD port, // I/O port address + DWORD value // Write Value +); + + +//----------------------------------------------------------------------------- +// WriteIoPortWord +//----------------------------------------------------------------------------- +VOID +WINAPI WriteIoPortWord( + WORD port, // I/O port address + WORD value // Write Value +); + +//----------------------------------------------------------------------------- +// WriteIoPortByteEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WriteIoPortByteEx( + WORD port, // I/O port address + BYTE value // Write Value +); + +//----------------------------------------------------------------------------- +// WriteIoPortWordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WriteIoPortWordEx( + WORD port, // I/O port address + WORD value // Write Value +); + + +//----------------------------------------------------------------------------- +// WriteIoPortDwordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WriteIoPortDwordEx( + WORD port, // I/O port address + DWORD value // Write Value +); + +/****************************************************************************** +** +** PCI +** +******************************************************************************/ +// pciAddress +// 0- 2: Function Number +// 3- 7: Device Number +// 8-15: PCI Bus Number +// 16-31: Reserved +// 0xFFFFFFFF : Error + +//----------------------------------------------------------------------------- +// SetPciMaxBusNo +//----------------------------------------------------------------------------- +VOID +WINAPI SetPciMaxBusIndex( + BYTE max // Max PCI Bus to Scan +); + +//----------------------------------------------------------------------------- +// ReadPciConfigByte +//----------------------------------------------------------------------------- +BYTE // Read Value +WINAPI ReadPciConfigByte( + DWORD pciAddress, // PCI Device Address + BYTE regAddress // Configuration Address 0-255 +); + +//----------------------------------------------------------------------------- +// ReadPciConfigWord +//----------------------------------------------------------------------------- +WORD // Read Value +WINAPI ReadPciConfigWord( + DWORD pciAddress, // PCI Device Address + BYTE regAddress // Configuration Address 0-255 +); + +//----------------------------------------------------------------------------- +// ReadPciConfigDword +//----------------------------------------------------------------------------- +DWORD // Read Value +WINAPI ReadPciConfigDword( + DWORD pciAddress, // PCI Device Address + BYTE regAddress // Configuration Address 0-255 +); + +//----------------------------------------------------------------------------- +// ReadPciConfigByteEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadPciConfigByteEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + PBYTE value // Read Value +); + +//----------------------------------------------------------------------------- +// ReadPciConfigWordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadPciConfigWordEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + PWORD value // Read Value +); + +//----------------------------------------------------------------------------- +// ReadPciConfigDwordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI ReadPciConfigDwordEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + PDWORD value // Read Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigByte +//----------------------------------------------------------------------------- +VOID +WINAPI WritePciConfigByte( + DWORD pciAddress, // PCI Device Address + BYTE regAddress, // Configuration Address 0-255 + BYTE value // Write Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigWord +//----------------------------------------------------------------------------- +VOID +WINAPI WritePciConfigWord( + DWORD pciAddress, // PCI Device Address + BYTE regAddress, // Configuration Address 0-255 + WORD value // Write Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigDword +//----------------------------------------------------------------------------- +VOID +WINAPI WritePciConfigDword( + DWORD pciAddress, // PCI Device Address + BYTE regAddress, // Configuration Address 0-255 + DWORD value // Write Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigByteEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WritePciConfigByteEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + BYTE value // Write Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigWordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WritePciConfigWordEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + WORD value // Write Value +); + +//----------------------------------------------------------------------------- +// WritePciConfigDwordEx +//----------------------------------------------------------------------------- +BOOL // TRUE: success, FALSE: failure +WINAPI WritePciConfigDwordEx( + DWORD pciAddress, // PCI Device Address + DWORD regAddress, // Configuration Address 0-whatever + DWORD value // Write Value +); + +//----------------------------------------------------------------------------- +// FindPciDeviceById +//----------------------------------------------------------------------------- +DWORD // pciAddress, 0xFFFFFFFF: failure +WINAPI FindPciDeviceById( + WORD vendorId, // Vendor ID + WORD deviceId, // Device ID + BYTE index // Index +); + +//----------------------------------------------------------------------------- +// FindPciDeviceByClass +//----------------------------------------------------------------------------- +DWORD // pciAddress, 0xFFFFFFFF: failure +WINAPI FindPciDeviceByClass( + BYTE baseClass, // Base Class + BYTE subClass, // Sub Class + BYTE programIf, // Program Interface + BYTE index // Index +); + +/****************************************************************************** +** +** Memory (Special API) +** +******************************************************************************/ + +#ifdef _PHYSICAL_MEMORY_SUPPORT +//----------------------------------------------------------------------------- +// ReadDmiMemory +//----------------------------------------------------------------------------- +DWORD // Read size(byte), 0: failure +WINAPI ReadDmiMemory( + PBYTE buffer, // Buffer + DWORD count, // Count + DWORD unitSize // Unit Size (BYTE, WORD, DWORD) +); + +//----------------------------------------------------------------------------- +// ReadPhysicalMemory +//----------------------------------------------------------------------------- +DWORD // Read size(byte), 0: failure +WINAPI ReadPhysicalMemory( + DWORD_PTR address, // Physical Memory Address + PBYTE buffer, // Buffer + DWORD count, // Count + DWORD unitSize // Unit Size (BYTE, WORD, DWORD) +); + +//----------------------------------------------------------------------------- +// WritePhysicalMemory +//----------------------------------------------------------------------------- +DWORD // Write size(byte), 0: failure +WINAPI WritePhysicalMemory( + DWORD_PTR address, // Physical Memory Address + PBYTE buffer, // Buffer + DWORD count, // Count + DWORD unitSize // Unit Size (BYTE, WORD, DWORD) +); +#endif \ No newline at end of file diff --git a/dependencies/winring0/x64/WinRing0x64.dll b/dependencies/winring0/x64/WinRing0x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..4a48c7a1f6c9945906e9507fce4077facb69821a GIT binary patch literal 62976 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 Nvfn5k4S^9I0su3F@BIJ( literal 0 HcmV?d00001 diff --git a/dependencies/winring0/x64/WinRing0x64.lib b/dependencies/winring0/x64/WinRing0x64.lib new file mode 100644 index 0000000000000000000000000000000000000000..0f16977102c8346f0dc8304b903daf09288906d7 GIT binary patch literal 15124 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 literal 0 HcmV?d00001 diff --git a/dependencies/winring0/x64/WinRing0x64.sys b/dependencies/winring0/x64/WinRing0x64.sys new file mode 100644 index 0000000000000000000000000000000000000000..197c255adea745c8a78f529c8a38a3ceaf68711d GIT binary patch literal 14544 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 N-nI1tt -#include "inpout32.h" +#include "OlsApi.h" #include "LogManager.h" using namespace std::chrono_literals; @@ -38,35 +38,35 @@ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, switch (size) { case I2C_SMBUS_QUICK: - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); xact = I801_QUICK; break; case I2C_SMBUS_BYTE: - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); if (read_write == I2C_SMBUS_WRITE) - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTCMD, command); xact = I801_BYTE; break; case I2C_SMBUS_BYTE_DATA: - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTCMD, command); if (read_write == I2C_SMBUS_WRITE) - Out32(SMBHSTDAT0, data->byte); + WriteIoPortByte(SMBHSTDAT0, data->byte); xact = I801_BYTE_DATA; break; case I2C_SMBUS_WORD_DATA: - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTCMD, command); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT0, data->word & 0xff); - Out32(SMBHSTDAT1, (data->word & 0xff00) >> 8); + WriteIoPortByte(SMBHSTDAT0, data->word & 0xff); + WriteIoPortByte(SMBHSTDAT1, (data->word & 0xff00) >> 8); } xact = I801_WORD_DATA; break; case I2C_SMBUS_BLOCK_DATA: - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTCMD, command); block = 1; break; case I2C_SMBUS_I2C_BLOCK_DATA: @@ -76,17 +76,17 @@ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, * However if SPD Write Disable is set (Lynx Point and later), * the read will fail if we don't set the R/#W bit. */ - Out32(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); + WriteIoPortByte(SMBHSTADD, ((addr & 0x7f) << 1) | (read_write & 0x01)); if (read_write == I2C_SMBUS_READ) { /* NB: page 240 of ICH5 datasheet also shows * that DATA1 is the cmd field when reading */ - Out32(SMBHSTDAT1, command); + WriteIoPortByte(SMBHSTDAT1, command); } else { - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTCMD, command); } block = 1; break; @@ -98,7 +98,7 @@ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, //if (hwpec) /* enable/disable hardware PEC */ // outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv)); //else - Out32(SMBAUXCTL, Inp32(SMBAUXCTL) & (~SMBAUXCTL_CRC)); + WriteIoPortByte(SMBAUXCTL, ReadIoPortByte(SMBAUXCTL) & (~SMBAUXCTL_CRC)); if (block) ret = i801_block_transaction(data, read_write, size, hwpec); @@ -109,7 +109,7 @@ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, time, so we forcibly disable it after every transaction. Turn off E32B for the same reason. */ //if (hwpec || block) - Out32(SMBAUXCTL, Inp32(SMBAUXCTL) & ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B)); + WriteIoPortByte(SMBAUXCTL, ReadIoPortByte(SMBAUXCTL) & ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B)); if (block) goto out; @@ -122,10 +122,10 @@ s32 i2c_smbus_i801::i801_access(u16 addr, char read_write, u8 command, int size, { case I801_BYTE: /* Result put in SMBHSTDAT0 */ case I801_BYTE_DATA: - data->byte = Inp32(SMBHSTDAT0); + data->byte = ReadIoPortByte(SMBHSTDAT0); break; case I801_WORD_DATA: - data->word = Inp32(SMBHSTDAT0) + (Inp32(SMBHSTDAT1) << 8); + data->word = ReadIoPortByte(SMBHSTDAT0) + (ReadIoPortByte(SMBHSTDAT1) << 8); break; } @@ -209,8 +209,8 @@ int i2c_smbus_i801::i801_block_transaction_byte_by_byte(i2c_smbus_data *data, ch if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT0, len); - Out32(SMBBLKDAT, data->block[1]); + WriteIoPortByte(SMBHSTDAT0, len); + WriteIoPortByte(SMBBLKDAT, data->block[1]); } if (command == I2C_SMBUS_I2C_BLOCK_DATA && read_write == I2C_SMBUS_READ) @@ -244,10 +244,10 @@ int i2c_smbus_i801::i801_block_transaction_byte_by_byte(i2c_smbus_data *data, ch { if (i == len && read_write == I2C_SMBUS_READ) smbcmd |= SMBHSTCNT_LAST_BYTE; - Out32(SMBHSTCNT, smbcmd); + WriteIoPortByte(SMBHSTCNT, smbcmd); if (i == 1) - Out32(SMBHSTCNT, Inp32(SMBHSTCNT) | SMBHSTCNT_START); + WriteIoPortByte(SMBHSTCNT, ReadIoPortByte(SMBHSTCNT) | SMBHSTCNT_START); status = i801_wait_byte_done(); if (status) @@ -255,13 +255,13 @@ int i2c_smbus_i801::i801_block_transaction_byte_by_byte(i2c_smbus_data *data, ch if (i == 1 && read_write == I2C_SMBUS_READ && command != I2C_SMBUS_I2C_BLOCK_DATA) { - len = Inp32(SMBHSTDAT0); + len = ReadIoPortByte(SMBHSTDAT0); if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) { /* Recover */ - while (Inp32(SMBHSTSTS) & SMBHSTSTS_HOST_BUSY) - Out32(SMBHSTSTS, SMBHSTSTS_BYTE_DONE); - Out32(SMBHSTSTS, SMBHSTSTS_INTR); + while (ReadIoPortByte(SMBHSTSTS) & SMBHSTSTS_HOST_BUSY) + WriteIoPortByte(SMBHSTSTS, SMBHSTSTS_BYTE_DONE); + WriteIoPortByte(SMBHSTSTS, SMBHSTSTS_INTR); return -EPROTO; } data->block[0] = len; @@ -269,12 +269,12 @@ int i2c_smbus_i801::i801_block_transaction_byte_by_byte(i2c_smbus_data *data, ch /* Retrieve/store value in SMBBLKDAT */ if (read_write == I2C_SMBUS_READ) - data->block[i] = Inp32(SMBBLKDAT); + data->block[i] = ReadIoPortByte(SMBBLKDAT); if (read_write == I2C_SMBUS_WRITE && i + 1 <= len) - Out32(SMBBLKDAT, data->block[i + 1]); + WriteIoPortByte(SMBBLKDAT, data->block[i + 1]); /* signals SMBBLKDAT ready */ - Out32(SMBHSTSTS, SMBHSTSTS_BYTE_DONE); + WriteIoPortByte(SMBHSTSTS, SMBHSTSTS_BYTE_DONE); } status = i801_wait_intr(); @@ -300,12 +300,12 @@ int i2c_smbus_i801::i801_check_post(int status) if (status < 0) { /* try to stop the current command */ - Out32(SMBHSTCNT, Inp32(SMBHSTCNT) | SMBHSTCNT_KILL); + WriteIoPortByte(SMBHSTCNT, ReadIoPortByte(SMBHSTCNT) | SMBHSTCNT_KILL); //usleep_range(1000, 2000); - std::this_thread::sleep_for(1ms); - Out32(SMBHSTCNT, Inp32(SMBHSTCNT) & (~SMBHSTCNT_KILL)); + std::this_thread::sleep_for(1ms); + WriteIoPortByte(SMBHSTCNT, ReadIoPortByte(SMBHSTCNT) & (~SMBHSTCNT_KILL)); - Out32(SMBHSTSTS, STATUS_FLAGS); + WriteIoPortByte(SMBHSTSTS, STATUS_FLAGS); return -ETIMEDOUT; } @@ -349,7 +349,7 @@ int i2c_smbus_i801::i801_check_post(int status) } /* Clear status flags except BYTE_DONE, to be cleared by caller */ - Out32(SMBHSTSTS, status); + WriteIoPortByte(SMBHSTSTS, status); return result; } @@ -360,7 +360,7 @@ int i2c_smbus_i801::i801_check_pre() { int status; - status = Inp32(SMBHSTSTS); + status = ReadIoPortByte(SMBHSTSTS); if (status & SMBHSTSTS_HOST_BUSY) { return -EBUSY; @@ -369,8 +369,8 @@ int i2c_smbus_i801::i801_check_pre() status &= STATUS_FLAGS; if (status) { - Out32(SMBHSTSTS, status); - status = Inp32(SMBHSTSTS) & STATUS_FLAGS; + WriteIoPortByte(SMBHSTSTS, status); + status = ReadIoPortByte(SMBHSTSTS) & STATUS_FLAGS; if (status) { return -EBUSY; @@ -412,7 +412,7 @@ int i2c_smbus_i801::i801_transaction(int xact) if (result < 0) return result; - Out32(SMBHSTCNT, Inp32(SMBHSTCNT) & ~SMBHSTCNT_INTREN); + WriteIoPortByte(SMBHSTCNT, ReadIoPortByte(SMBHSTCNT) & ~SMBHSTCNT_INTREN); //if (priv->features & FEATURE_IRQ) //{ // outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START, @@ -431,7 +431,7 @@ int i2c_smbus_i801::i801_transaction(int xact) /* the current contents of SMBHSTCNT can be overwritten, since PEC, * SMBSCMD are passed in xact */ - Out32(SMBHSTCNT, xact | SMBHSTCNT_START); + WriteIoPortByte(SMBHSTCNT, xact | SMBHSTCNT_START); status = i801_wait_intr(); return i801_check_post(status); @@ -447,9 +447,9 @@ int i2c_smbus_i801::i801_wait_byte_done() /* We will always wait for a fraction of a second! */ do { - std::this_thread::sleep_for(1ms); + std::this_thread::sleep_for(1ms); //usleep_range(250, 500); - status = Inp32(SMBHSTSTS); + status = ReadIoPortByte(SMBHSTSTS); } while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) && (timeout++ < MAX_RETRIES)); if (timeout > MAX_RETRIES) @@ -469,7 +469,7 @@ int i2c_smbus_i801::i801_wait_intr() do { //usleep_range(250, 500); - status = Inp32(SMBHSTSTS); + status = ReadIoPortByte(SMBHSTSTS); } while (((status & SMBHSTSTS_HOST_BUSY) || !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) && (timeout++ < MAX_RETRIES)); if (timeout > MAX_RETRIES) @@ -494,9 +494,9 @@ s32 i2c_smbus_i801::i2c_xfer(u8 addr, char read_write, int* size, u8* data) bool i2c_smbus_i801_detect() { - if(!IsInpOutDriverOpen()) + if(!InitializeOls() || GetDllStatus()) { - LOG_INFO("inpout32 is not loaded, i801 I2C bus detection aborted"); + LOG_INFO("WinRing0 is not loaded, i801 I2C bus detection aborted"); return(false); } diff --git a/i2c_smbus/i2c_smbus_nct6775.cpp b/i2c_smbus/i2c_smbus_nct6775.cpp index 80ce9fd9..23c47916 100644 --- a/i2c_smbus/i2c_smbus_nct6775.cpp +++ b/i2c_smbus/i2c_smbus_nct6775.cpp @@ -8,7 +8,7 @@ #include "i2c_smbus_nct6775.h" #include -#include "inpout32.h" +#include "OlsApi.h" #include "LogManager.h" using namespace std::chrono_literals; @@ -23,45 +23,45 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int cnt = 0; len = 0; - Out32(SMBHSTCTL, NCT6775_SOFT_RESET); + WriteIoPortByte(SMBHSTCTL, NCT6775_SOFT_RESET); switch (size) { case I2C_SMBUS_QUICK: - Out32(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); break; case I2C_SMBUS_BYTE_DATA: tmp_data.byte = data->byte; case I2C_SMBUS_BYTE: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTIDX, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTIDX, command); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT, tmp_data.byte); - Out32(SMBHSTCMD, NCT6775_WRITE_BYTE); + WriteIoPortByte(SMBHSTDAT, tmp_data.byte); + WriteIoPortByte(SMBHSTCMD, NCT6775_WRITE_BYTE); } else { - Out32(SMBHSTCMD, NCT6775_READ_BYTE); + WriteIoPortByte(SMBHSTCMD, NCT6775_READ_BYTE); } break; case I2C_SMBUS_WORD_DATA: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTIDX, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTIDX, command); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT, data->word & 0xFF); - Out32(SMBHSTDAT, (data->word & 0xFF00) >> 8); - Out32(SMBHSTCMD, NCT6775_WRITE_WORD); + WriteIoPortByte(SMBHSTDAT, data->word & 0xFF); + WriteIoPortByte(SMBHSTDAT, (data->word & 0xFF00) >> 8); + WriteIoPortByte(SMBHSTCMD, NCT6775_WRITE_WORD); } else { - Out32(SMBHSTCMD, NCT6775_READ_WORD); + WriteIoPortByte(SMBHSTCMD, NCT6775_READ_WORD); } break; case I2C_SMBUS_BLOCK_DATA: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTIDX, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTIDX, command); if (read_write == I2C_SMBUS_WRITE) { len = data->block[0]; @@ -69,31 +69,31 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int { return -EINVAL; } - Out32(SMBBLKSZ, len); + WriteIoPortByte(SMBBLKSZ, len); - //Load 4 bytes into FIFO - cnt = 1; - if (len >= 4) - { - for (i = cnt; i <= 4; i++) - { - Out32(SMBHSTDAT, data->block[i]); - } + //Load 4 bytes into FIFO + cnt = 1; + if (len >= 4) + { + for (i = cnt; i <= 4; i++) + { + WriteIoPortByte(SMBHSTDAT, data->block[i]); + } - len -= 4; - cnt += 4; - } - else - { - for (i = cnt; i <= len; i++) - { - Out32(SMBHSTDAT, data->block[i]); - } + len -= 4; + cnt += 4; + } + else + { + for (i = cnt; i <= len; i++) + { + WriteIoPortByte(SMBHSTDAT, data->block[i]); + } - len = 0; - } + len = 0; + } - Out32(SMBHSTCMD, NCT6775_WRITE_BLOCK); + WriteIoPortByte(SMBHSTCMD, NCT6775_WRITE_BLOCK); } else { @@ -105,14 +105,14 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int return -EOPNOTSUPP; } - Out32(SMBHSTCTL, NCT6775_MANUAL_START); + WriteIoPortByte(SMBHSTCTL, NCT6775_MANUAL_START); - while ((size == I2C_SMBUS_BLOCK_DATA) && (len > 0)) - { - if (read_write == I2C_SMBUS_WRITE) - { + while ((size == I2C_SMBUS_BLOCK_DATA) && (len > 0)) + { + if (read_write == I2C_SMBUS_WRITE) + { timeout = 0; - while ((Inp32(SMBHSTSTS) & NCT6775_FIFO_EMPTY) == 0) + while ((ReadIoPortByte(SMBHSTSTS) & NCT6775_FIFO_EMPTY) == 0) { if(timeout > NCT6775_MAX_RETRIES) { @@ -122,36 +122,36 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int timeout++; } - //Load more bytes into FIFO - if (len >= 4) - { - for (i = cnt; i <= (cnt + 4); i++) - { - Out32(SMBHSTDAT, data->block[i]); - } + //Load more bytes into FIFO + if (len >= 4) + { + for (i = cnt; i <= (cnt + 4); i++) + { + WriteIoPortByte(SMBHSTDAT, data->block[i]); + } - len -= 4; - cnt += 4; - } - else - { - for (i = cnt; i <= (cnt + len); i++) - { - Out32(SMBHSTDAT, data->block[i]); - } + len -= 4; + cnt += 4; + } + else + { + for (i = cnt; i <= (cnt + len); i++) + { + WriteIoPortByte(SMBHSTDAT, data->block[i]); + } - len = 0; - } - } + len = 0; + } + } else { return -ENOTSUP; } - } + } - //wait for manual mode to complete + //wait for manual mode to complete timeout = 0; - while ((Inp32(SMBHSTSTS) & NCT6775_MANUAL_ACTIVE) != 0) + while ((ReadIoPortByte(SMBHSTSTS) & NCT6775_MANUAL_ACTIVE) != 0) { if(timeout > NCT6775_MAX_RETRIES) { @@ -161,23 +161,23 @@ s32 i2c_smbus_nct6775::nct6775_access(u16 addr, char read_write, u8 command, int timeout++; } - if ((Inp32(SMBHSTERR) & NCT6775_NO_ACK) != 0) - { - return -EPROTO; - } - else if ((read_write == I2C_SMBUS_WRITE) || (size == I2C_SMBUS_QUICK)) - { - return 0; - } + if ((ReadIoPortByte(SMBHSTERR) & NCT6775_NO_ACK) != 0) + { + return -EPROTO; + } + else if ((read_write == I2C_SMBUS_WRITE) || (size == I2C_SMBUS_QUICK)) + { + return 0; + } switch (size) { case I2C_SMBUS_QUICK: case I2C_SMBUS_BYTE_DATA: - data->byte = (u8)Inp32(SMBHSTDAT); + data->byte = (u8)ReadIoPortByte(SMBHSTDAT); break; case I2C_SMBUS_WORD_DATA: - data->word = Inp32(SMBHSTDAT) + (Inp32(SMBHSTDAT) << 8); + data->word = ReadIoPortByte(SMBHSTDAT) + (ReadIoPortByte(SMBHSTDAT) << 8); break; } @@ -199,9 +199,9 @@ s32 i2c_smbus_nct6775::i2c_xfer(u8 addr, char read_write, int* size, u8* data) bool i2c_smbus_nct6775_detect() { - if(!IsInpOutDriverOpen()) + if(!InitializeOls() || GetDllStatus()) { - LOG_INFO("inpout32 is not loaded, nct6775 I2C bus detection aborted"); + LOG_INFO("WinRing0 is not loaded, nct6775 I2C bus detection aborted"); return(false); } diff --git a/i2c_smbus/i2c_smbus_piix4.cpp b/i2c_smbus/i2c_smbus_piix4.cpp index 88ec6404..fe2cf875 100644 --- a/i2c_smbus/i2c_smbus_piix4.cpp +++ b/i2c_smbus/i2c_smbus_piix4.cpp @@ -9,7 +9,7 @@ \*-----------------------------------------*/ #include "i2c_smbus_piix4.h" -#include "inpout32.h" +#include "OlsApi.h" #include "LogManager.h" #include "ResourceManager.h" @@ -49,13 +49,13 @@ int i2c_smbus_piix4::piix4_transaction() int timeout = 0; /* Make sure the SMBus host is ready to start transmitting */ - temp = Inp32(SMBHSTSTS); + temp = ReadIoPortByte(SMBHSTSTS); if (temp != 0x00) { - Out32(SMBHSTSTS, temp); + WriteIoPortByte(SMBHSTSTS, temp); - temp = Inp32(SMBHSTSTS); + temp = ReadIoPortByte(SMBHSTSTS); if (temp != 0x00) { @@ -64,8 +64,8 @@ int i2c_smbus_piix4::piix4_transaction() } /* start the transaction by setting bit 6 */ - temp = Inp32(SMBHSTCNT); - Out32(SMBHSTCNT, temp | 0x040); + temp = ReadIoPortByte(SMBHSTCNT); + WriteIoPortByte(SMBHSTCNT, temp | 0x040); /* We will always wait for a fraction of a second! (See PIIX4 docs errata) */ temp = 0; @@ -80,7 +80,7 @@ int i2c_smbus_piix4::piix4_transaction() while ((++timeout < MAX_TIMEOUT) && temp <= 1) { - temp = Inp32(SMBHSTSTS); + temp = ReadIoPortByte(SMBHSTSTS); SetWaitableTimer(delay_timer, &retry_delay, 0, NULL, NULL, FALSE); WaitForSingleObject(delay_timer, INFINITE); } @@ -89,7 +89,7 @@ int i2c_smbus_piix4::piix4_transaction() { while ((++timeout < MAX_TIMEOUT) && temp <= 1) { - temp = Inp32(SMBHSTSTS); + temp = ReadIoPortByte(SMBHSTSTS); } } /* If the SMBus is still busy, we give up */ @@ -113,10 +113,10 @@ int i2c_smbus_piix4::piix4_transaction() result = -ENXIO; } - temp = Inp32(SMBHSTSTS); + temp = ReadIoPortByte(SMBHSTSTS); if (temp != 0x00) { - Out32(SMBHSTSTS, temp); + WriteIoPortByte(SMBHSTSTS, temp); } return result; @@ -130,39 +130,39 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz switch (size) { case I2C_SMBUS_QUICK: - Out32(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); size = PIIX4_QUICK; break; case I2C_SMBUS_BYTE: - Out32(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTCMD, command); } size = PIIX4_BYTE; break; case I2C_SMBUS_BYTE_DATA: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTCMD, command); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT0, data->byte); + WriteIoPortByte(SMBHSTDAT0, data->byte); } size = PIIX4_BYTE_DATA; break; case I2C_SMBUS_WORD_DATA: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTCMD, command); if (read_write == I2C_SMBUS_WRITE) { - Out32(SMBHSTDAT0, data->word & 0xFF); - Out32(SMBHSTDAT1, (data->word & 0xFF00) >> 8); + WriteIoPortByte(SMBHSTDAT0, data->word & 0xFF); + WriteIoPortByte(SMBHSTDAT1, (data->word & 0xFF00) >> 8); } size = PIIX4_WORD_DATA; break; case I2C_SMBUS_BLOCK_DATA: - Out32(SMBHSTADD, (addr << 1) | read_write); - Out32(SMBHSTCMD, command); + WriteIoPortByte(SMBHSTADD, (addr << 1) | read_write); + WriteIoPortByte(SMBHSTCMD, command); if (read_write == I2C_SMBUS_WRITE) { len = data->block[0]; @@ -170,11 +170,11 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz { return -EINVAL; } - Out32(SMBHSTDAT0, len); - Inp32(SMBHSTCNT); + WriteIoPortByte(SMBHSTDAT0, len); + ReadIoPortByte(SMBHSTCNT); for (i = 1; i <= len; i++) { - Out32(SMBBLKDAT, data->block[i]); + WriteIoPortByte(SMBBLKDAT, data->block[i]); } } size = PIIX4_BLOCK_DATA; @@ -183,7 +183,7 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz return -EOPNOTSUPP; } - Out32(SMBHSTCNT, (size & 0x1C)); + WriteIoPortByte(SMBHSTCNT, (size & 0x1C)); status = piix4_transaction(); @@ -197,21 +197,21 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz { case PIIX4_BYTE: case PIIX4_BYTE_DATA: - data->byte = (u8)Inp32(SMBHSTDAT0); + data->byte = (u8)ReadIoPortByte(SMBHSTDAT0); break; case PIIX4_WORD_DATA: - data->word = Inp32(SMBHSTDAT0) + (Inp32(SMBHSTDAT1) << 8); + data->word = ReadIoPortByte(SMBHSTDAT0) + (ReadIoPortByte(SMBHSTDAT1) << 8); break; case PIIX4_BLOCK_DATA: - data->block[0] = (u8)Inp32(SMBHSTDAT0); + data->block[0] = (u8)ReadIoPortByte(SMBHSTDAT0); if (data->block[0] == 0 || data->block[0] > I2C_SMBUS_BLOCK_MAX) { return -EPROTO; } - Inp32(SMBHSTCNT); + ReadIoPortByte(SMBHSTCNT); for (i = 1; i <= data->block[0]; i++) { - data->block[i] = (u8)Inp32(SMBBLKDAT); + data->block[i] = (u8)ReadIoPortByte(SMBBLKDAT); } break; } @@ -234,9 +234,9 @@ s32 i2c_smbus_piix4::i2c_xfer(u8 addr, char read_write, int* size, u8* data) bool i2c_smbus_piix4_detect() { - if(!IsInpOutDriverOpen()) + if(!InitializeOls() || GetDllStatus()) { - LOG_INFO("inpout32 is not loaded, piix4 I2C bus detection aborted"); + LOG_INFO("WinRing0 is not loaded, piix4 I2C bus detection aborted"); return(false); } diff --git a/main.cpp b/main.cpp index 6af67f65..3e7dd0aa 100644 --- a/main.cpp +++ b/main.cpp @@ -146,6 +146,80 @@ bool AttemptLocalConnection() return success; } +/******************************************************************************************\ +* * +* Install SMBus Driver WinRing0, If not already installed (Win32) * +* * +\******************************************************************************************/ +#ifdef _WIN32 +void InstallWinRing0() +{ + TCHAR winring0_install_location[MAX_PATH]; // driver final location usually C:\windows\system32\drivers\WinRing0x64.sys + uint system_path_length = GetSystemDirectory(winring0_install_location, MAX_PATH); + std::string winring0_filename = "WinRing0.sys"; + BOOL bIsWow64 = false; +#if _WIN64 + winring0_filename = "WinRing0x64.sys"; +#else + BOOL (*fnIsWow64Process)(HANDLE, PBOOL) = (BOOL (__cdecl *)(HANDLE, PBOOL))GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); + if (fnIsWow64Process) + { + fnIsWow64Process(GetCurrentProcess(),&bIsWow64); + } + if(bIsWow64) + { + winring0_filename = "WinRing0x64.sys"; + } +#endif + std::strncat(winring0_install_location, "\\drivers\\", MAX_PATH - system_path_length - 1); + std::strncat(winring0_install_location, winring0_filename.c_str(), MAX_PATH - system_path_length - 10); + + std::string driver_name = winring0_filename.substr(0, winring0_filename.size() - 4); // driver name: WinRing0 or WinRing0x64 + SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (manager) + { + PVOID wow64_fsredirection_OldValue = NULL; + if(bIsWow64) + { + Wow64DisableWow64FsRedirection(&wow64_fsredirection_OldValue); + } + if(INVALID_FILE_ATTRIBUTES == GetFileAttributes(winring0_install_location) && GetLastError()==ERROR_FILE_NOT_FOUND) + { + char module_path_buffer[MAX_PATH]; + GetModuleFileNameA(NULL, module_path_buffer, MAX_PATH); + std::string::size_type exe_loc = std::string(module_path_buffer).find_last_of("\\/"); + std::string driver_source_path = std::string(module_path_buffer).substr(0, exe_loc + 1) + winring0_filename; + CopyFile(driver_source_path.c_str(), winring0_install_location, true); + } + if(bIsWow64) + { + Wow64RevertWow64FsRedirection(wow64_fsredirection_OldValue); + } + + SC_HANDLE service = OpenService(manager, driver_name.c_str(), SERVICE_ALL_ACCESS); + if(!service) + { + std::string service_sys_path = "System32\\Drivers\\" + winring0_filename; + service = CreateService(manager, + driver_name.c_str(), + driver_name.c_str(), + SERVICE_ALL_ACCESS, + SERVICE_KERNEL_DRIVER, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + service_sys_path.c_str(), + NULL, + NULL, + NULL, + NULL, + NULL); + } + CloseServiceHandle(service); + CloseServiceHandle(manager); + } +} +#endif + /******************************************************************************************\ * * * main * @@ -177,8 +251,12 @@ int main(int argc, char* argv[]) std::thread * InitializeTimerResolutionThread; InitializeTimerResolutionThread = new std::thread(InitializeTimerResolutionThreadFunction); InitializeTimerResolutionThread->detach(); -#endif + /*---------------------------------------------------------*\ + | Windows only - Install SMBus Driver WinRing0 | + \*---------------------------------------------------------*/ + InstallWinRing0(); +#endif /*---------------------------------------------------------*\ | Process command line arguments before detection | \*---------------------------------------------------------*/ diff --git a/super_io/super_io.cpp b/super_io/super_io.cpp index b352905c..3dacada2 100644 --- a/super_io/super_io.cpp +++ b/super_io/super_io.cpp @@ -5,12 +5,11 @@ | | | Adam Honse (CalcProgrammer1) 2/11/2020 | \*-----------------------------------------*/ - #include "super_io.h" #ifdef WIN32 #include -#include "inpout32.h" +#include "OlsApi.h" #else #include @@ -31,8 +30,8 @@ int dev_port_fd; void superio_enter(int ioreg) { #ifdef WIN32 - Out32(ioreg, 0x87); - Out32(ioreg, 0x87); + WriteIoPortByte(ioreg, 0x87); + WriteIoPortByte(ioreg, 0x87); #else unsigned char temp = 0x87; dev_port_fd = open("/dev/port", O_RDWR, "rw"); @@ -60,8 +59,8 @@ void superio_enter(int ioreg) void superio_outb(int ioreg, int reg, int val) { #ifdef WIN32 - Out32(ioreg, reg); - Out32(ioreg + 1, val); + WriteIoPortByte(ioreg, reg); + WriteIoPortByte(ioreg + 1, val); #else dev_port_fd = open("/dev/port", O_RDWR, "rw"); @@ -87,8 +86,8 @@ void superio_outb(int ioreg, int reg, int val) int superio_inb(int ioreg, int reg) { #ifdef WIN32 - Out32(ioreg, reg); - return Inp32(ioreg + 1); + WriteIoPortByte(ioreg, reg); + return ReadIoPortByte(ioreg + 1); #else unsigned char temp = 0; dev_port_fd = open("/dev/port", O_RDWR, "rw");