From 0307eaaa90661f587536bb561e9f7b5bdffd336a Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Sun, 10 May 2020 02:51:31 +0300 Subject: [PATCH] More refactoring --- src/main/java/nsusbloader/RainbowHexDump.java | 12 +++ .../nsusbloader/Utilities/NxdtUsbAbi1.java | 99 +++++++++--------- src/main/resources/res/nxdt_icon.jpg | Bin 32049 -> 0 bytes 3 files changed, 62 insertions(+), 49 deletions(-) delete mode 100644 src/main/resources/res/nxdt_icon.jpg diff --git a/src/main/java/nsusbloader/RainbowHexDump.java b/src/main/java/nsusbloader/RainbowHexDump.java index 1086840..d3131ad 100644 --- a/src/main/java/nsusbloader/RainbowHexDump.java +++ b/src/main/java/nsusbloader/RainbowHexDump.java @@ -47,6 +47,18 @@ public class RainbowHexDump { + "\n"); } + public static void hexDumpUTF8ForWin(byte[] byteArray){ + for (int i=0; i < byteArray.length; i++) + System.out.print(String.format("%02d-", i%100)); + System.out.println(">"+byteArray.length); + for (byte b: byteArray) + System.out.print(String.format("%02x ", b)); + System.out.println(); + System.out.print("\t\t\t" + + new String(byteArray, StandardCharsets.UTF_8) + + "\n"); + } + public static void hexDumpUTF16LE(byte[] byteArray){ System.out.print(ANSI_BLUE); for (int i=0; i < byteArray.length; i++) diff --git a/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java b/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java index 682c94e..5b1f18f 100644 --- a/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java +++ b/src/main/java/nsusbloader/Utilities/NxdtUsbAbi1.java @@ -104,8 +104,8 @@ class NxdtUsbAbi1 { while (true){ directive = readUsbDirective(); - RainbowHexDump.hexDumpUTF8(directive); - + RainbowHexDump.hexDumpUTF8ForWin(directive); + if (isInvalidDirective(directive)) continue; @@ -123,6 +123,7 @@ class NxdtUsbAbi1 { return; default: writeUsb(USBSTATUS_UNSUPPORTED_CMD); + logPrinter.print("Unsupported command: " + command, EMsgType.FAIL); } } } @@ -142,7 +143,7 @@ class NxdtUsbAbi1 { logPrinter.print("Invalid 'MAGIC'", EMsgType.INFO); return true; } - if (message.length != NXDT_COMMAND_SIZE){ + if (message.length < 0x10){ writeUsb(USBSTATUS_MALFORMED_REQUEST); logPrinter.print("Invalid directive size. Expected size is 4096 while received is "+message.length, EMsgType.INFO); return true; @@ -160,10 +161,9 @@ class NxdtUsbAbi1 { if (ABI_VERSION != versionABI){ writeUsb(USBSTATUS_UNSUPPORTED_ABI); - throw new Exception("ABI v"+message[11]+" is not supported in current version."); + throw new Exception("ABI v"+versionABI+" is not supported in current version."); } writeUsb(USBSTATUS_SUCCESS); - // consider refactoring: create sub-classes for various ABI versions and check if it's supported or not } private void handleSendFileProperties(byte[] message) throws Exception{ @@ -171,25 +171,15 @@ class NxdtUsbAbi1 { final int fileNameLen = getLEint(message, 0x18); String filename = new String(message, 0x20, fileNameLen, StandardCharsets.UTF_8); - // TODO: In here should be also a field with NSP Header size that would be transmitted after the end of main data transfer; NOTE: Handle with RandomAccessFile. - logPrinter.print("Write request for: '"+filename+"' ("+fileSize+" bytes)", EMsgType.INFO); // If RomFs related - if (filename.startsWith("/")) { + if (isRomFs(filename)) { if (isWindows) filename = saveToPath + filename.replaceAll("/", "\\\\"); else filename = saveToPath + filename; - try { - createPath(filename); - } - catch (Exception e){ - writeUsb(USBSTATUS_HOSTIOERROR); - logPrinter.print("Unable to create dir(s) for file in "+filename+ - "\n Returned: "+e.getMessage(), EMsgType.FAIL); - return; - } + createPath(filename); } else filename = saveToPath + filename; @@ -197,9 +187,9 @@ class NxdtUsbAbi1 { File fileToDump = new File(filename); // Check if enough space - if (fileToDump.getFreeSpace() <= fileSize){ + if (fileToDump.getParentFile().getFreeSpace() <= fileSize){ writeUsb(USBSTATUS_HOSTIOERROR); - logPrinter.print("Not enough space on selected volume. Need: "+fileSize+" while available: "+fileToDump.getFreeSpace(), EMsgType.FAIL); + logPrinter.print("Not enough space on selected volume. Need: "+fileSize+" while available: "+fileToDump.getParentFile().getFreeSpace(), EMsgType.FAIL); return; } // Check if FS is NOT read-only @@ -209,42 +199,14 @@ class NxdtUsbAbi1 { return; } + writeUsb(USBSTATUS_SUCCESS); + dumpFile(fileToDump, fileSize); writeUsb(USBSTATUS_SUCCESS); - // TODO: check if NSP_SIZE != 0 then go dump header } - private void createPath(String path) throws Exception{ - // QA NOTE: Clarify if exception is even possible on RO FS. - - File resultingFile = new File(path); - File folderForTheFile = resultingFile.getParentFile(); - folderForTheFile.mkdirs(); - } - - private void dumpFile(File file, long size) throws Exception{ - BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file, false)); - - byte[] readBuffer; - long received = 0; - int bufferSize; - - while (received < size){ - readBuffer = readUsbFile(); - bos.write(readBuffer); - bufferSize = readBuffer.length; - received += bufferSize; - - logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0); - } - - logPrinter.updateProgress(1.0); - bos.close(); - } - - private int getLEint(byte[] bytes, int fromOffset){ return ByteBuffer.wrap(bytes, fromOffset, 0x4).order(ByteOrder.LITTLE_ENDIAN).getInt(); } @@ -253,6 +215,45 @@ class NxdtUsbAbi1 { return ByteBuffer.wrap(bytes, fromOffset, 0x8).order(ByteOrder.LITTLE_ENDIAN).getLong(); } + private boolean isRomFs(String filename){ + return filename.startsWith("/"); + } + + private void createPath(String path) throws Exception{ + File resultingFile = new File(path); + File folderForTheFile = resultingFile.getParentFile(); + + if (folderForTheFile.exists()) + return; + + if (folderForTheFile.mkdirs()) + return; + + writeUsb(USBSTATUS_HOSTIOERROR); + throw new Exception("Unable to create dir(s) for file in "+folderForTheFile); + } + + private void dumpFile(File file, long size) throws Exception{ + RandomAccessFile raf = new RandomAccessFile(file, "rw"); + + byte[] readBuffer; + long received = 0; + int bufferSize; + + while (received < size){ + readBuffer = readUsbFile(); + raf.write(readBuffer); + bufferSize = readBuffer.length; + received += bufferSize; + + logPrinter.updateProgress((received + bufferSize) / (size / 100.0) / 100.0); + } + + logPrinter.updateProgress(1.0); + raf.close(); + } + + /** * Sending any byte array to USB device * @return 'false' if no issues diff --git a/src/main/resources/res/nxdt_icon.jpg b/src/main/resources/res/nxdt_icon.jpg deleted file mode 100644 index f4d262796499d53ff3850de9e8d6e781c055a377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32049 zcmeFZ1yo$k)+XEp_uwu8g1ftfV8PwpX(YHqNN{(z0Kpv^cXto&?(Ptn&b{~j?t5qM z|LOd*X02~dug$4L*QqVFYuB!)&gs|r*LA?#PvTPI00;;OfC2aec-_Fm7IU*S0|2C? zXaR5l0015UfPex(fJ?vsK>Vrv1_BZQ3I4YSnD8N>|5E1*xJ>Z3axl0|4X*S1-Zx-k zfp`Nz0-vM7#0oBBg3sw-vJCob`<3AG7?|Mx@-YCHe&6}WSwc!yfs~bzg_)5Xz{nL++dS{U#hFn=mz{jL04 zTZlJ*<-!ZD|K@MyX`J6Y{*e6j&vyN-1i0qw5xt#c$RAqS?Ps zv9JFr&HhEPzw5OKK!St-cOE1fKnQSsNS*Tq;WrIjpaxq%^A&K64x5gneMB8O*%#`I zdV3!@-reM=vs|Zhfhqhvw)*WE*aa%Hy3(7`yS%vU4-mOi^oBN7DqswAoEfe@Fftuw zAZvd+3o04)RP}8LhDQlba-O7w%otoOf3fnnRlUK+D1_Y8?CUpRBevw9H9iu)!xa;!9R&M;WcJ?;0T=}= zemVw>lKu-Vfhp+f74QWtvlB71q8KJvj(?pVsdHN5 zt`+|OWbs>se_@kIXPFP3E918uEtJ7tQN@~W(3p1|Tv)U^w#gEQfi_1sK$0K~V^K5z zDepb8$zt}v;adG)xooQ-$v9j4kvQd-nwkgp2C|7FiQ*WiyMvdjBcWWCb--|UEnKjfq zk}mc$b)1R_NS+*MUg=phWjC5Nph=2IZeh#0kQU2_&?6dQ!-^ zhme9Yr^x!W=d6#owD8ePYNmhJ-2y;;av3-_y|hd6!@5fCKBkvGDPz(9^ohg#v0~uL zJYtL6$yCtaC{35**0bEC*0_=LbR|*(@A(zb*VuIEAD=L}`SS;@veRDE1b7tZGXLGF z{^>yeV}L_k7yp>24X@&coQ*A85ErqmOQgHZ@rxbt78+Ng8xD8Rh-&Xqi$G8+Vhqah zVmLorn{@XL)IXlV)>J`vINA&@9;JR=Rw^&KZMymYq>}>6VzfC%* zewxuP-H)S_h4fCq{uq`dflc~ct)gT>dqwM4oXyxP;QjliNUk_DS3`}j_Mrt8%XGRw z(#=`4Dw6tLU&tRW?$r(R4nj&TR#7Vx%>rq(&PJRM-|{d-c|mH8$)z)4IPp88G+(tn;J+i&tSeI4xaU$S|w&|2*@kqv|pS7Z>co)o=m!k!X3Z3 z8fPLq)!}54%;~GtS51=0djh2x%NW&87G?U!2r=qo4#HJeM0-LC?t|phl;wH5HKz=8 z6@_<26BU_A`kF3=#3pvt;uR}hgBdQ&St)oMUhsr+cwph zL|K1oghJ~i{>A&K^4RY0OoZK8!T7#97BgA+6=2?|`Kb-Qb7}f}#YY^jRPPyHBy z#k<$qw)AQ++!l_X)a^FvHC_Q+5AJJKd$Vl>b9UL9C+xc7o7g)hp+8sTC;URMg^;vY z57tm_w51!U>Rj>t-15V}bAzJrV6(JpHqQvO_ZM^KWlfyv_J3+^yMo%w=7H`OBc3ZN)QeY~lBk=JZTOadGqY4hxrx; zFj1B4^-4BAY}#n#oxpG$#ZFbIDx??*T%?w4oZ&42Q$f!zYHS*#NDTIN_P2?y(eLmy zA=bA|E*>X8^A9a`^WN+8VaOtl^4y7zhj1qnTnt6DHB(Y=)vYKlGKTwMg8 z_W?RPG#BwUEV~XWr9Q%a$hO8R6aCT^wfLNTg0ib63 z;H~zTA33p{{OelT-@&P}E&55)P3u+AfmWx4W*Kq?_fP zn_k^VD640V^{wtM%2&=mSoIo=nZzo$rcprl&w$O@%TKe(Lyk`AS6q!2J#79C_M+Ex z6shitovr8MQxH<*4^8<7jsx{}^y{CqsBw9t?p6^|AX%3q{;U(E&+Q*jtqyKvA>}SW zZCQLWCWzb15-#27gI1%UEeGD}%%Gzqv5t#0A`G>kZ`-o+^;U}0vFqzC0YYEclNQAb zew@5aOqZWR2?fMXVHKsh#NDvp}H&*Eb&c&zBL3bUxXae6aJ^u<4|)(rCVN5wPN&q+ zk+53V@`0Ho_!S{JiDE0jda7F_SReT;d{Js= zZ*f7n5>uCDtH`-WpwjObo|y?^^>1uUGXA6yY89HR$mgiL1S&Ib19G;vhkBOG)n9mD zrX9g0R92E1n^3sWH}?59vCZr_9cfEvy=4lv*}|@}njALtM#IHU3TK7CRyW1Hih0l%2{FWbmlV!@AU$K#PXG;qYs8<8p~7h!Ua^kxU9W0ZacZ$)UwORZET54_;n;0 zemnDqId|YRt0Jx(kTNSil%WAXc>8>XQjIHOV zV`F^DhQKreUouT?w3K&dNCC~nAd+uh+%E(*4P0Drb@X(H-z1-8jcAao!_ses$NBjk z=-KDpS7=Y1wH+|tjU@qS1+(^cii(=>PnKKlaBR^^An@Mja$v0 z_r(C$e<4_wGk(v=jytKJdz;?Zj2WDx_ConSYES1Z{8_i$VlksEB4M+vVm{lKR)ai2 zgl3RnW~;zz%h?wT=y8nJS-4gkE$&d6LvR1>2n4{p>%}(kfJrNmDt>0Hs|?jJO5E*D zq|6i!9!V^wW)RBrA4&z7>j+`KW)Ps zb0(vAj^MbywJx0=L;t8RE@SRGL7Y+2iXRxazQQCcMU*(&Qi6-uH=DpedL>_9z5N2( z+1q3a#rszG9dSTtCwD=3^cCQZIcjL-0eY$Nm`hDquIEBxX%kIH6`4mh6iX(~-O`5< ztiGMrURe??)D|XnJEcJDx5phDBzNp5_513n@`8LGuZ0X+(p}Y-b^aX6XcBNIW@%eW z6ejdRO0na*f`8h}bQ77i(|UbIs#d-c>4IXYt%Elm^#_;Ag->g#=C8;r1!G`(vQY%t z2k$Nb>Xyb#>G$sk>z7Rp@ddTMWl=KI`7f*ItGNv2%ZC_NnUXGuiJyO{#C1@Sm$}1y zFIcg3om$ZAF>3VRn27#tpP3ulo_AlMIZ3}=TiK*i7xUZ~DoLIoZH(7l)Y*Y0p*Uj; zviSf!TKHJcM%WyH7#HpYfS3k3$XQ9b3WmW46a|$CG!mDzKcGxg1hZFtI!x=J)wqaR zS}H2pBs!F_E{E04sPJw9lRRmlsM2tJFF)YHl?GzQ_A+qDeW&@`m|&s3h0OB3%V?-ft;v43&Za%$9|bz zybx+>40#0<3PqP!_ixq**((2{UtSQhrxy#_ZN%C_>n9rX8K)hL>?VB?PrbdQ_k**J z^SewHb`qq!z(0CCS*^e|tF03us%{_;Uq|ONjr8_VM`W+yA7?Msk}w*PcL1s@HAWI( zRfXK~2|fh#+jo$Ryr@R0W0K~C(tP=6%XQTtWf8faf+4EoU`~U3Cf86&c{2mNl|AF5V|K4VR0z=(@p!Wa( zG#Ju`g8`%WZ@@VC$G6}ejo$!17{Z5yghl?nkMSGc2f)Iip|ikayu)M_!D6$=Cc{xQ zL?DmB<>Ya5uW!Jkc+bWCLCMMGdu?4OxE12x?Zbef=f59sz>UDcLqNhJfWMbP0}Jt2 zI2{rO4jKCQHp6c=XfWvSU@=%k;K*1NF%9jp{9@QXfZ_CWawQ`N$C}9vcx-lVQDvvE zv2oS4b(~zzu3ZIgY@r4gT9M|?@ISt@m;x9a1R z6nR$#l{;6hyD2EYu5Tvcv5~9GEIK+u=DWe6>UE-`ILAI^0rM06;@3dl;jEG(SaZ#z zUX<$YrS%7yAEmAJ%XKHMYjn74Ik=qyEPVp0T+5lK6b*ND?yFe$+P%+Yo6g)7xaA+M zXCCO|NA0$1cyL(CQh&`w?eXPt!r^-rR|fVHkL$z&$CQ)uDAAZh{$`qwU9=$-rm~BA zeiKlAEJ3v)(e3tQcF^xc2f%R7Mt&9BH}Z&YCUK|U--J*1h+w`* z@u~<)4}MM;g^%9W33~^_h8FI3%dk{=J_{;?3S`D;q>Mg@`PiXPJ^=hs>vkN-G|hQ* zjM+h@Ao_i|P_Grm;8JCH#yhVaAkcqkPn?3+UxXJ%7Y{NpDj_AHu=B|R=DwnoPc zqNLP5imrc9^lulBUrfvM!A|k9i$P*nh~-8fi9`D&pfU?l-FikD8XI5~5_^w^N!^#$2;88ocyT83qZ>>XVj}O5rK~!RzlwhYH+ARUeMNlEj{=!5X}fhjuWX>k%;?1JWtQkWnWvmo2 z)`P&{Nzt%C5evwrv@=tZpEV-eK%2VA!0PRLm40&wz{oB$=}!PNUiUXZbF2%kfJaUk z&964JgrTM3CGTdtr6`Lng3FC4UwZrcc~r;4t$OYgJGQQNg!>AA9kmLa%^OjziNWd= zspRoRywV^EnWPHI)je~Y3f;VJC3Lc2bdy+F*CDIxyg!>uOpzkIs9Ab~7m(b?d>g}x zbILQio=5FYvJQai0U--|u!FVX;q5DMp#F*v;5 zhx%SJ_esh}@al&9*~A=ulcV9pp8k7{$*#rK-fWNX-KF8$ROj=aM@vNJBBYcMT02@} zJ3gCTuGrNUHz%uWxEuvPXijHJi&c|!x`r#Q znhMo-u{LVEd)n38JlUTR8vE$5ob5z%K0%y%>$vO@mF>EzZ|Gy4hlT#!eAX)jYT2mAH?1q5G)^`fR1XDtv-BId?OPpRsJBW7yl2|DyE1@;Ij096~@5rBc7uC z@T;Gv1v3DZ{22g97KSnVA&pZirj#d_+B1d}$%z~*-*}4**_`f#4?%ID@WAxG%N~hR zG{%A6A9qBY6?VSfw!2$vwiX??LvA}&G+zt@!Yk@s8N$z{>g1e-%3v-C2t^T;=|&ze z+|KPHOkYc;{#Bm>lJM|Ne(`pq^7rwa*6E|fUXSy^#4j>@r?{vyr@h!FhWon zoafjR!xJUh52evjF8W-Cjs+MVn$q`|TV|Q_|2#qdL%d)rgwZ-Qv=U-@h$_A}EMBu_ z@V~F1B*t=42^D=mMSnBqR^&?2`BnTB6E~ZZta@rFT1%Xr#9rRsnSj$?a%9)a(2937 z$!5>yD@@F;JY_RS?n3U*Gl5jT%tzRn7K-z@1h?Lyl8bT!Bcq~In5KPh!T()(xu2oyba`=1u(KQT4sPtL>3)mHVEPL_O@Jtc70l8`(fj3e4QJhRk^8vB9n znOOJgyDNxdg zc8z4KQ#U-Y8=ct`-`TAS_*2UC4+?`X!uDfEe2fp5Df+C27>~06Ud?mox%hh zGih}PnGIr^17N7(gG+0x^RQzgV3(Dbb;U>1HU5oEV($NC693yWiT{H!;AnIeRKpw6|kSP(?_88_9WmkUNvP)88CIx1Za!hH#(ducOzFy9weYhpsWHRu1GN zPidVlSZQa|S}pJZuT!8nj9vk-7%nDWsaNqk2k`%r>4W78&5^=Wc1g;1f?x?ZJRvh- zT6Rq9lvKDB>Hxs|1I(;csyupBX+Iv6%B&A;87xpdWf@HHHTH{Sqst|r#$M`Bz3npL z!66$E3GXo`^$v46=I1B_io6SlI+e=fHBn^78MwrsDAR4G31vuw`}X-Q7UtU%zPO~$ zaN-g}4k_XA_(J-~~_O-)g=!I8mQv+eG-4REG^tS3Hh1Cf^%ycWE? z7J*kkne%XwPJqYPM}nWLnct^N%xL_$#lS#Qibdhm|e(0{_{iAyHwW z+L7J;>d1)H^MU!S!9Ym487HP@N!XHVlWUWUYfIeb+M>3@um|E5vmubvTV%)H{w{X2#y2rJoOo8UMjV!ASDr=u%QjcH2M zVKqSnKk7L55l{O!KT<*Z{%Q7%=2SP>_ z+NmoNbxd7Fx^M0UzTm#Rb-;t5Y?yF?52*oB=q+14#QK*hCk;j7Qp?2$ub%O_~p(0uUsUekRDEVlM zxLn|96Q`jC0V^--KIkPSL(%S(_mHT(t+&ljP2S%~zZ+O9d!cW*I^KL+` z*{`Cw@XK+MP6IgxOflOW-?f@ulrgnA(O}j|X{p~Wx>7NH!{tvPi#mCK|1>_cbrF*; z5u&~Y@~;jYjZ4WL&(cPNTpJAX3Aek-m~XlJ-<`kxF$#W94u6Y}bo&EyHR$v?xiL7X z+q$HqIRGP!<8ak*{m18J^VHA~PSd%*m?b|fTLphTM>6QqsiOW5g z@n@q($4F5}ijc~c0x|HSM@+5zrSU=w%-{JeH(wqp7a{Idv2}}Peza#9J22L{1OA9` z42G?26)VMEA!&$$y<(tlx@meVh5yb(Gqu;$DZ1S!H;IqQ747G&TNt_bxP@x{Xr;WVnp<=0aJJV z7w{Hw1d98ndbkhGU}{BIi77$AmfNyTjL6;lQ0Bwy-bS*N$=PlrG4-*KZY)W%Dzj^!16ciBK&J!>8s7Qd!Dhn#L*7AdZ5V6K~D)h7LsqgAw`Y{K2-d8g@J z?U?4d-T7MDcFjcv{0n(n(DtPH)>gDZ<0`AUa$|a}H3II4IcZ=yHXk+vZ*6HItw@6N z=*PpexbZK;bE9jD*6W`e7M!o42Sc|d3Hc*+MN-I}z97u}@cK!%Na2C=J%*Ge%4#`~ zj6zqKy3p#BpvM-CA;yY}3)#mE6mUmfher$t6{HnXGsiGnKgWicmb=f%zt`jYbv*2a z>s!>DU6U4xjoO{mQ4cTmgoROKpiGxX1`g4{xcIXg+@ZaxwRHzy#opoSO|icIwAgfh zxpIR7Ma*IG$Zl>J6Y)gGM<^^s$QW_tS3qqC!oVPgGch zJzS$pqQ5$zu5X{d`AvU{fbAxRiejIr zORS$JbfIZT{B3;;lL~soo#A~u$bqFA26v^tQ~a6LG8X)xgfWMmXhun)1v>?(ZDQ_@ zK!(CgXC(*y0F??bB)(f*II0P^C=zm9_G2qUj`{{BSn4~jNI1-is*B2i;(M+XH_en$ zGn>6)(?iWzcc_S52b?*yene4&GQu)W@`UeYK>6eW{8vD7bMv6ecwj}8KKwJsc|YO? z4&C`HAklu=8v(m;VTVwHT!M|`sgZNU!M&ON)TgIDqKf{C*Tn~+Pw{4Pek+jbLA1ie z_K7M%%T8?>6mS)cgKMV!$x3RhZ;3a*pQpx9O0hu`J9c5{y;_7X#aGrimT7E_dB4h) zk`fl9M}~I}BL3F**J&>9ayU5A{cD?v#Xd8MBPmF2tRr_v)u5u)=Wp#ugOp*TiFj1j zvWX`Sv+j`F%+-n>_KZ~LcbmQfTZBi!UXmB-KgwYve&8UUpY#Q8 zt#32LA~@SASeM!O(qUl=V5C9EXhfPVnrh0R-pi+q8R1>%<8IDf4Mvx4D0fc&B5P_VRk!di_Xao9w!HdJbY7 zQMvcB_t+qgUSLLd#0ufnsHf%opcyrxX%ttOqsE6d3acd;Ew~mNR4zJM#>UJ#QMzNy zIE$znDXS#&VOAx`_E)+LQdbA!=_V_hiYJV?p`Z|j6+0(ld(Hl*C+xivJ$yE4jP*$U z{`q?LpwYm2T)Rk(G_;&8aqW{!ovxn(CKo z*N|&PZ}!z2iEOEp5RgjHO#|xCk++F;Ca6kW(B}W7WDTE1Xn%It#f9^I%jV2l+m1z~ zK{hm#NXN!J_4TPVczM7Ezl)DWoHBNjkmI{RDUR70RUqbin3%-roxZmjL-l`@-xkctgiXQT2fU_8Oh*KR{6 za-6h#c0^W2A?2zK1A}<4mnnXIjwfK$@^V=^)wOz#W6>VKeVDfC+UaHfrH$T*J&`1y zFLHMv$NBuII_honyT18D$2_%k1>9 zy++@dA^^s1G@6sgx|VVW;ji>)XPLYL3KqG3b$;t1Q#sSDFuus2Tb5ZStXEZP3-)9y zO`!3^4xzw<@4v9=-aJy7z;Jq~O9wn04?#r70vM4_FbGdybgW^gMfZ;SQPEHCt2Wii zcdn$2Z@q3Kh=tU;L)f`*VB6?TU3zElkJ>aIE3_jqcKF`eF0VIEHJ;vXrhE|;9k|)2 zJX(2aZ4>S9SG-6tceeBCK52D1TbrcJjGxWl*U3q+)9gSPNMD?0r);@8RLOzyIyvd-+yVH=jhL z7P+%$|Keh7gk!X3!35HA9weFO62}|d0NIGLRN3RI)p?`^&U0=~kyd2dQEY+-Ix z-G2|xO|E_sqTlHpi(MnGemGb67?wz0N{FtHusK2k6k-qQg_=VPC}l%tU9KAsPGKJOFtIO!ePtVv(3dWu zLo1f+!&>*e*94sY^zO&q8!=nS?E^by5~s*~jvhWO7wwJq4UD}9+WAuX2tE9J(=9bb zJRkmKyklq?JKoEv#rM_F*l9frDGo8DJJRq1jtl( zC%*5$ik~Y!cfz(-LPz^{_TGYrs{B|DmPWlm(O|H9E*7CKJRmf*Zb-76rbEpzjS7GC z8|Q7LV|S#D)h8eD!$~V1)4bdsdtPj6p))73?%`^X#`Lg_kvzN6AN#~GJxpxOG~5_2 z=FUU9sV}9unNVu<(9CO`N=#U5>5TCby3I~6j#V_CIVtniag2J_f~%02>^51G33X}g zmRsWnw49%2%Vc-ev^L($&G50=jnJc<_L^^;(#D~dZM7T7ezw~rRl|}Wb<5xsg5O^ZPCU-1F-qlM{jcv8Y?#0!B^2gEK z>$H0W&4=9kY|W(;cJN9bw8h2_FGmMgD4gd{Aa_*1RM(PMnkZI%s}WXsB%g+jPY<7K zdNKh_xh+_9E<$fE~-Bd9)smhb*7Xfsfm zk}3UVQzwb5zu~x+bQ^C(4wWjVXMJ}_j?Vbqu!)swYCf+{L=wWaaXq_SJqwyJMf7#K zZTA#L;;qE#k;kQDSem{;HT16)%~E&2z9W}GmE&0`3I$UQ^J=)-xQ1Sdsx91|6#-}u zF54AXN;1lrk`eCFC82L6X?+@?dI%_-Ls=FE-p^=aY}*vXJuv9gHsvi_He? z%S`zVrVt&^2!YDhmTx?rje>Ltnr3VauIU-iI+&@$XprAmQ* z=(PA=Waq-sY-`Y?%e;JaGkSZjZ=Ut6bN-TOmtYKKdVy+h88*EvCbKhl^lXZ$CobV8oCTFh1j^yhO&zLa$K!79JJ`*K z7yZmw_~U;6Esd~;mReA8t>DOo@kOO(Jq5?S=x$65PYm0hJJ7S7$$fpC5_CsHdT-BB zPRzfCT@)HFE7+{>GUYW>BxR}aR%`?n_q#9h&!2HU0uH56G5#O z7qb|swK-yk5-@rM^s|I6Xm%1Iy?KMk?qjeUbBNV!RC{ABt2Dx@UZbZ;nhBrlr7XfO z&oYcz)xvQxh_SdU*w$h2Xi)Pa=tI+I?}=-hXaW1H1e^4Pp5o{^>L<5zLgj^@3GM#~h z`E<7tRUnow1Fu7 znr_QT`1Fe<#abmjP{jy%6~0Y)p!TVZOnendWR@^OT!a%cff3FH1W0s=s8{5_*C#&4CIn8V8Us(=-LPq-#>A|=o$cnU z6(&o{krkp7j1_{Coe6u*KOo1tTu>+|+CxcZ7YZ~EXZ8WhPRxGsrW3S!9GTeI=Xk@+ z(G=KoB@iHI3`yu;KzDC5EK& z;am**wz#dJdu>x{1lCg+7s7JcSNiQrb0=kn>3?1K1n{&tic66x)8-bSV2H2}nIe6rhT9|d61ti6-DUe# z1a7FK1YaGtv8cL)B}v!02Sri8Xj&HC7un{A1#*>D=`f4VmtrPks_bI<&9z!h7HD*b zpHqc}B9PIWibv@w-=V(I8+^+FcRl$GT3Zig)ch*|IyBW%cKBUQNZ!1aZ0emO4Qbv7 zkC-0_GkfO5s@PQVTFmhjMp0JmUll`&$a2Yg5o1|oPDi4-XyW0T7N+NBSEDW-gXGKG z%8ushD=JL;qVk)6C7PRd=s6D#4U34MS0u(_MALGJyWk}e)+07*sOnYQQH;`9Y||9; zMJg^k)>SOVY*MFmQ!%Viz>1j6u>Xs?B^hAXgf?o8>CgC8K$U&i>?vW3tZrUYbUa&< zMy|O+eKm{KdOPY}$nD8bq2phjrF4;?K+RXO`q72l{tAf4VxS?ZO=qSjA(L+j6gv~3Z;Bqlnt)`qP|1sRspAPZ++38YrG<>*LIzJ$%xuo?T&aKTRnX~5oNYTW<4_h zx?6o5cCL`M@J(I+S;Y5dgR&X%B}+$F&f4tcxmBs<3uIZHV?6>g2()bR!Ev^;BHwZ#LaA&|nxrw2 z6j=aJY?a*Hu=8|XNw$0zlH>Zz@oaMIZ2H{9NQ_;M3K+RMfQkX0q4UR=!KZ)!M6vg{G>wSf|#VP8~R^YK?Eb9k8*gMI`rL?cp#ntr*@E=^e;0mR# zj=3MRbBfD*@p^HaJp)I=k^<7@Vf$q!6GmX1q-?g@kDoO?rA=xtZiWjabPLL!1Q?vX z`hK)>Byz-mDk{94LDH3Mh~%~BDC~=PDLU@WS810S%meCMDmVK?%}~T)YR40y+kS%E zM{O{QpDTdvc@d&z7+RU@cN$%`si@xcMOk|aC{Hs!aI*i(e$hg6zjC2+-j2M`Rh5Y3 zzV=p^18+o$Cr)*X!-FU}ZkrF1Vy`op-X~2!TJ!CcE*jzi&B6B`&S%C=#+n(Xl>UM$ z6MPbb(?-d2+afcUok`A1>`FW+f?7Ortk{?U?Aiw>kw6NRSAg&M#fv^3Ovb*G#NEp)U`FILcggcDyKnGI`+B*O0)oL|Hmbrt34q8) zv_SugWbbN*cN+zNPV(ddRo-_7Jb@%;JT~8X_@dr<|AK8bW)ynQ?Q7R>Cww%wx3?{^ zE+haD^zg;&wD`O_u5kCa8?YVf8{SKfT3ORBW4AKTsr3Se)$h-TuN+8@oH( z7b>Z1*FQVkW=i7RjjTZ9Er%Y&F0}-|-T@d0H4{4-6@%M+proTnrEtknhA+?(yQ`Bg zjVxn!08nZi(rEX0?{v>@6pVO8J!Fj#FV4STyK84$Va;e3K4u5rJ^gwG$S*g0ZLLOy zZ2S0MdrxE2eGFi%a7ftgzwu6eM=_Tep0Dl_pHRMO5kE^C(Wm&+2thO4K7;fm)s8SH zw@*F|O$~TY6?*To_fUb_Bd9JyG`kY1sR0pFSq0in8$N_?GtP-PG5qW(8q5exMU-0= zT7SM!(uZop6J+#KDhnw|Z|$Kvf7xZj^B%XsySyVw>NVVM-oYL@bY@LD)BzE>lh)8< zZAZ4I)->^<*?UV@a|;Z^KIi0Gu9A*i)B%<3UjbGQh*8a%Y`!PjX2V+2Vq{Y@@wNjM z8oN8r_dJclbxtQk*8}^i#psfVlJ4+^eC~lYUhQ3(birGA^ohJJHxAr~4$FbljLV+S zi!r?YBMYTc@Tiwz@FpxR&ai#Pq|hSw&fu3UNj9}J-L5wJ;V)nl4BdTUFJMy)@AX_m zS2uJ76CfjY>T^2>3~EBU6owjSdT+-u)mgddG|=2}Hb6+REDO1|S7sy%4rx(!V;}nP zPjYx}4i5T*^<2eB$6o<5dc^gy?MKPKPA9p0VukK&%15QXfj-F8SmnhIvc-o)!JL|E zH<^1}EXG`spxRID!fuW}o7m4g`8y9>5a1t(f-YrD%{TGLJ*4Sj2H;3bSMDoB2{4!PX`1;KAGB(h;>hGxQ2!kZW)8%UR+@UgPo7@}I+ z8aUEHklL@nz}K;Qk=%P;w6g@=zXFD~Y1f}g`!~)U+KHaIFIPClUYOVQrK%0=&mVjP zKv6q9VYT$jfun`yqr6ttuxk9p#zCDkQsum7a=Ji0M1|?_`4+_M{X84n565-I6!izs z{o8tN{*Q=6hXdJ+4BH1&o(Ouap9-p+)F;WywB%~7Y6b|T+3`FJu(wp*65r%=W)lOO zKHdr+c->M$OfUErp~e-+LiY~_RQ62qmk}vGi@0qJ`H;3KZm&{aHX^ z_l;6wibDOG2LO6CIS)9ebmKlfz?Yj)!SpujI205{6?0HU@TCMM*IK=QkZQKN0MWD# z(tKWcg4MQal_xj(8eCm7?eQt8Eb9ZsAZ>)15=+=H+gz0Kq8!40Ec|6KzX(An91%J1 z{B1AZl4d@~sT(fI2jyO>kStII5p03B`Lvi!wj+^(n^(+B!k&24@Y&Fn3}n4 zv}W6WrSwVPJ7DW9Aj3R4I$E$BkXJI)a6-v}nDKzs$0O9gta?eEIwsLs+Z6@B z2@0y1px>p~qn8oI4g7@~{%$7cJ#pan3T{41HmLxT;@h{+UxHCP_H5RQNv7;>tnhr} zg!X!00i}$Szl1OoJ~<{7_v)-2b=VwE56?}jOXf|fsWmD`{*+%^c~1scg(+FXP|T1& zinM-^t~rD#VflsH59 znv38iq|_BHvCv3oCcfJhX924n^oeJpkKKfA*`R`T~tL1Io(OEvqf3|$$d`zzZ&0anSEuOlJp2n8fJ60B- zyX+jMJLV{>nX83G`~;N{@+6n=jw#Y%*3iHSM+M0*C1a|t-Y?%T&vNae)qF2MI-syQ zb+w-nZ)dR6nhF~N)|wo84nQ@Rb+E_mcd)Yyw7S&Ty#pR_-B4ct%t&$aWb7`swo~xo z9z8Cim=LIbkeW;#!Zz0A0}bY-0;Q!sik*a*N%6bTHp1-DTG4+GrDBJCK*T?uLl{3G zm~hOSu0>tT^Y9K@aOmH2+&-A-I> zu+r-7qtn&k#9GroAYvD{ zab4w-Zr*KC0O1x};*me}Rta?#olsTLUlQ;Tb2|jG7QL@*xNC6A7?LS1lbSAbz^Yet zd^@(%$L;Wyvv?-<@)(*6!D*zwZ;w4@cGelT*6ASzV`_b!5AwnFWqN*chbMy~dG++` z9J+`8l(e+e*>dF8wP1-B{d0!+bVuWwqBP96DF1 z?HyUN9ZVWTTYR{CZ@uhH%mjXNWJcWb3qf0Y7p!2>rh3*Lz6s z_`(CFMYI~bh?DmG6kCR*+O?4-E6@VWzVgaT`3kOKO#E#MVIY;cZXjIdF0ABk<5x`) z1|k#mfrU$sCW6&pBFEmsbhWR5Z^n4I$c|YP-771659w#g8T)qnSvw0>Fq1bu6S7>@ z8_HW^Th2$gJU_M)Ry_$~2=waP&&pyxfBmF)RJyTT_hSO0BW7v;Q!U7T`z&L=;JVx2Qj={VrRxk1cLb_9bk81&5@eIN7->07d7w zZm`i^hz_bbjvh)G#w!#VB)S(V^X90nAll^gsAbD}zlBZWATkzgWf3~PIm;)#sVU(j zvTae>?OWiIpCp!*B9*#NP>#|$+up&4Ob(3N3WOcl!){>bSaiyRC!xp)`*QdwyjHQM z*Up)Zj9x1!mqWA?^HpoM#=Cy{hC536DKIdJdc&8c;p`Cd`>iwjWSNQ8OzOh{XjT3~ zYtAigp=nb>-CCN?Lxu6zgc^aSdZWUb*6JPu!olH3x7>Nxu({RRDw2lKAoN}ed4kW3 z0&<~dwHzz51oUo1wGxJ{$3A%wZ%F?~d3PDrR<|_@I25Y^r4%UcF2yOKSaC1zw73Kd zlwieM+_ktCDef-Cf)^=HfMP|16qoewzV|(H&mG@6=Z^d58|V9xKYL_kWMr?*HP>Eq zK8w7|6C7wBIm(dz+>acw7l8Kzbt7HqD!$dBDynHij2F#|!Y$bqD$$BpGomOVm-^Kp%=9FY*}NJbE2TukzJTxCItjd~jg50)ByQ*E zsWTJ&!l8ogh^ZUJ5yvYXz1~`a8B~7(SL*N|v}9GQyig2kzA2{1?`Vrzr(w9m&K5aH7d4GucWrdGrQbfW`IvtC&Kb7iDJ zGaFxfaN`W=@4f`FsH4Sqzxxufbc)qm(1EZ3GCsxv`Vtz3*aqH3GmNsGA(}_0Y41K7 zWX|#X#3C-c-i3+hhej0(bjSgvl+^0}5vB?5f7Hfkl@JtUT47a1lF?ts?~#rpesAx@ zy>0w=iw2)bqJq=KAnli4I#r{5bo&O~n^0lx{s+{!PiNiuN(#-V#;vr78DyJjeFO~N zG=lUr)y+-6|nU!2HZ&y z9#RuW~PZphket}+Rom>viA5C4OKf^CPdz~i;y#kM;2U4MF|qG~6&m@sVjazm$n8Ze{6}~cQa-YUvAAuX z!JT-=VjD3OG3c_6l_ylKu$k*8%45Q!d6U<&*H1LR4VyodDhsgK!FM{0J@~YdZ_Fx1 zQW+6xmk0l9#F-N&Wl(DyFiNbss?L~dCG;MI;gYlmn-!b8{d(pD34pl)->Bp8^@}zj zmDIzTY4v#a)uvm-HsB{K&xF&@dqte4n!@VeY7_A3$Q3x3Xw`9R9xq+mM6f!VSXj{3 zKQ0y^R%c~Zna$%JA*Y5h75|v!ZbNJ%Wlb()(zb2fkW>}t2UTZm`BO7`gF`}2pTir0 zS9xXpN+9f7?+si{<)SD}D-;<8w z2B1Kvx~4~{@E6FXk?AtU@ixSO^1=nE9B_jZ-_lh_67wF<$GHS4^kLm-}<;abg?{$2)FUly?s8s$)KeXEJ#mfyVhL1wHlu+Ku zXeonwMLOD4D}*r4^vp8T^rCA?>ERZyH@A0+eA7M#Z5R{23SCaTHa(MReyG(^rnG9r zg;B(yflnHin4Ov2V?`PfZplYtCpG<2&?~I{iRVEwt0FV-XZJjGqQs~unJ%olSL{-J ziw z$sqQk{xI-M#iNV!E*Lgu;JWX9a<>P*-Oq@4c(jA2Mr{Uo9W8v6S0C{3_tb}TrKr*S znUxYDtoHS)T(Bhi=zC`-z8RUhuHU>CVjdf=lh#So%xLJ2(o{2QP#|K9AU|w?*L^G( ztE|)A=0Gp^!1OMbB5H0~S5p_*wSqoiZjl$Vj2ZTZ1RXbCYGaWxv@2h!hd664J}@t{ zL>qr$gnK#Pg_nV+1HH!%%MX%?e0!sIBW8}GY*igNJU6g(4Bcdf_qV>-NK9wU8MyG# zaWSoswB^3=DATgJ!BRa$zQfvg`>HKpG*@hD?|Mpm($aJs9vh$b3-oHwTUfkpxuf9Y zF`2C6$OpVa4seH^c&DT`2SMEr*n9mRBmUEmRW^&HEgxcIGNo+~ z4d8*d1zHOBf&C$&U^ky0f{H!TIXD^{xu_L?G`cF}t2{2q(clz&VamQ#G_V3{;7{a@ zu9_xkA~WM2z9Z?_fs|u>{E*p;z-_T{fjV+kz^^qA=4iF6kE}Ax)|{Wyw47zsl6T9u z9V-bmb#)c`>Dp5DcFZPi&W!YstfR`!rJ{W>xD;&N?NupYBs@2|eNc`#optP}*vVeD z=|}2aY1tsu&?}iwig8+cIiHn$c1$kT=-I_yPz~2E@zycjx#s9?u^O>WqOJ4bL=al2 z$;a!_R=d^VDDZMnmGD3IPw4aY9FMnz0j zr|SyspU$0b3SbTR zv!0^QIS2~ABD`qc!+0MLvzARc+N3O|JAsa?K1<(>nc*(AYu>$7T-=P!Ub^+O5k9^4 zKbT=#n4Flwj=LD(5Qd05A?5ZL&(K`j34eh`P~N`t6g#}Yj`j7ZtMUo3_A#$ORk;aY z>UK;hqRNKyDx`gHi|dnbRhxu=fwp7@u6?C^w^MFaUUggw`HnZ4MeAl=$zIX{A7y)R z9X~xcqIxMTrYANnBE2Uz;)sfA<2n{b#b%=a0!{w{P3ims;a%a;ll=lQCErrKKK=TN z7nOC(zI;Vm>-LRoavnZB8~LDtAF*ZxvHz|*@wUyzeQKfWJJsjaij$}O^qD(tH6;}S z&N=F-Y*(dSj|4vIOvVmXxq)I+=q*q=#1vyA>&-GrO?xgw-5j&~`< z!BvYCVZ8R0ibarkFK=RYMiHm$l(q3O2YnhFx8;j>Lgosc$myL_*Y*jIVVAN7;o{Yq9&gaZQxom&c?vqi;C#v5FZm*{V&ZX|`P z*V$*XFXXu1WDeEA)r#X`ZF)PAm1lKf`E~8Uj=I!Hg{o4N*#p)V8AY%MWqd=#n9C{s zzSk9d6EMo8{2KY}=e?cAT(64cAr_cDd|-+@YuR!!ae`Ou8QafFU{=JYFgN`3(PrCa zS8a|uq=^=PI>%_Fhk-9N%|vZ~9vxa-Qc#oxd59CHeP8rZb);TZlF@ELdmT>|W=g60 z>70v&Q|$W_k#-4sp|;0$T{6LTINrt!CrooPhvJZVaD>C|q@0Knbsa+FI>U{s8{wMu z?nJPWqn=z~GQDu^VF%^Lr*z?f*%n^wnw&jwqV7<>Gu%!@>WrJLdd9kbhjZLAVOFmw zv`}qzo5?9ZMm}6V)@9=|Cw>@xJkO5lCi!4n?BncGyFKTN{*dL=PSKw2Zqz~fjCZj; zlE>55rd_a4MN!nGkP)xoBDr{jNw?6r!7jrW^^BvTNqMkP3)}1}fdfZa^SGKl@wpJs zXN5i)KgMn6c>44?D^B!Qzjhn`MLz!m89eXId7RVR&cva+Ug@{^ByS?$pK+2gjLuXd zg)=-o-Sl~P+_tlx4TMratn=&;7BcHZh0~ApGry?KPZt1%c}9+H8k)vNqxp+h1~v-# z3g&?WVZ$X)g^Cn0Zp^eEM_X^yoZ-?f@y8=8%!Y6;$+y;_?(CQ8aA1^<%oaSb?Qv4j^c|ZWz-R7B zIKsW{>|;o$Gz}BE1%WT~^<~3`73!M0SfP?HSvQ5kxa14uKTLTbGITh(BV0q%*`~|k z{YKmmkxyagd)uXv`I)(1IPtqVLJEnkz4Pu7%6i9o?2(_p?PwGd{K)JLC*Wabn~4%= zI{x~i+)hpQsY~WL2b1qSUnxu9DxNdL2i3I*nHOOCx+yGYqb1dpb+1Xz2!)cJoV&Ns392%_w#h& ztVxC@tZru^@h&}vLfoU?23eyHIswnj18LDX(PGj<|J1?V!n5hz+TrSEdymNX_QhqY zm@IrXdb;kqmTCgcrEASUd*e&10wnTXKFWuhvCehI#BwBIYPss_jvz%iD{SX3kOUXmTk<(pJ3(y^^_qvUIN};1id>_&6Q4|1kAEPM>UA=?)x3?)N9t z5^rZ5swAWmlzOxnG`Kxuwm(a7KhyyEC9LB!Cy0y7Qq7!88)ArJV2A_H?1ITs{k3wFxV{_(6)$XTSQho6_v3&jcyV>go)XWXa^zj9=-K+Zx0k^4yRxLV3+70aN z-l+)tE#L2()C1TC*orrWf~7Fn)Ij8>VF!-?DAZ7vb=|$4dtgM+*;puQWWD%}$AhZl z%Zs1sJ=!%yV(ivmQKTsy#$U>wUC4o{5N{$0`zcELhVq6`*=Zl%SId9fJJEC80W+Xm z=xo}YKVOs5hty~Sp`~%M!1M>*6SeToV<*l**dTL?RCdmFL78Tm=RMZN0Ac{^?6d zup#fqPg>C`DjuXmVUawl;@}d^CCNPNO4_M?XIhSxPs|$(INa2N0L2Z{zmnhYc zPAE!oxJiem^GKJzr1vmoR3d3`^*O>u&zJ@BhPz?^t12Ewm1YTf%vw$v*;<)Vl#LyC z(0ZeoPRFZR{VC_7A3i)S(%(KdL{@+oJk7+BE$k2?i#z;wikZt($zB254b)FUZVh)f zl|Inif5UPgP3S^bK+dur=4pHuy)pw56Xz?FEQA#C&!6l-R60V~&fQOaPx0sYN*r3- z4$hLo5+~|l1%q&f?F@{XqQOk~XF9o->1|$%sr-!T!+O?1jA$>43i_RWh2lkd0r`76 z4wvmm4E!@{{F}RMrX-$Ip7Ambba(fEYMEfAsBLRn^ewUT z=aUTSJ)cYB`8*yoVP04vLd^82cTptNTAImZRCMg&U=PmFZa7Cz;J!tk!X-}#P{NaA74;y>? zy^Zqr%$I-k`k?*`J;fafI;ki`y)f)dmnyn7YVn0Z2TM)uhg5+wXXCmzh0R{v3b}Sq z3#ZaF#7*7=#gy2EjWie2j;ek125)%ZUD;4lx<|py{oad;j2`sD?hZMh;l$mgsCkL= z>vGYxDh%rYGz{+$kp!Y$gaKPD*~_`62Fwp++VGa9H^`9}^BsDh8{X9#zIgZ0oyNFO zQfHT2t~Mkr+B{y@-4e$yG7KuE4gO4(#9dX(9jHt;HYb`NzZmB&FEYrvcEL1)Qg)&G z<`ROjE`3G0r_Uc4GdcBjfkyzLW34WI^KA!w#mN zdy8h}tH$zzyVqDHD7J%{qG@z*&LA5cIz}d%da7y#LpNF9LaWw?skF(DA+;S(xlRc- zu}RNR)!)F$wlZAPtWd8g?f1pR_F4sJw?1H)ff2VO;}v1j%FIl4Cn{STClNONM3>iS zmi1b3FPdLwhIMTWy*Jgw_ZQ*$3^~Rry`X=gz zr=$FB3ge3;d-XYqu?qbm3VgOub#x)G>PDkoG`rkw(I-#PlrV73ADU56xz!;#-9CDT z(xaVGtwwqU1lBi;TT}YM(3h{ZJAo(8J3Je!kK=^vQv|`YpD;?#IC-He1CB^)Y}=hh zrrLaukE31jgJZm_9p&@rY&RctYTU8wiwcdwNe6~p&Uno<(4?M|J852;( z)CcDs`ZJX$&rM&d<^+=4=LI`r^D?ju#9c_JMzJ}{`Zk}ALo%82$z2^Gd zBDEYlDw!$*=i&I$b-AetW?}K-W@(1d?;e!WDTDC!r8fGpWbCJ@{W+1nh4#C4?9szG zV2;PG)_&iAg0$x^h`VP3GfCD{Qob+J1_^VMGv2LED%;>CeuHOiUac9=>v?Uh$_q|m z|3;#95PB?8g%KUm4gHz*qHJ}8sJoP}uRrv|j6eyuLwtf4tn3?^<>#GQe7o<;rZ4dv z#wyf~CI)-pvXxF}+*lAHyWUiXheZOi)#MJo&q5-P%*w&F&ho(C6f*Hg_hlT4>-zR2JIKo;QrFm+@|W(P3lmZ?z#GWT=|(FP0LY zUY(Qyi=>$^NJ(+oVv6JJT?f7T5!2+*d(E@Zz?5ccO2MA-&`J#lg0>x5`sPv}dvJWa zX4&GkpAp?3A8*A7}Q)PQ%adEvD(Tk<%T#CD+sfOf=*pj6n;Yh}Da)N>y#a zHw8^Cx1;FGKgArimM8EgR(uODVo@7#1iuC~ELMlP)>1vWF|2G^k)CK-9|{YMy* zE4{eKr+1=bn4eSmt}R@nHt^(cWf$EZa6r$KTRX>UY~!`|jnYcY^jM|H7+!af>Idv& zL@r6-=(&&#HsAfM@q`E?8?(!IF;3CHUjsw&0|NJViIrrcrkXufbKPj!626og4;%Mg z4+>QmHq$dgX+mMXeODo?z}p{pn6UL6a+-+|sskY{rcMRapp=+{>>&vGG^4B@ za=w)}PcdOd{@aSd=U5Zf zq*ZfOtZ8hSux0uj8k0(j#NSL~SiYJHYT z&n0FI+RYYBA}Lg+zaYiIHF?r7os1MYr&jG`iv>oZLprzdhYB?UO5#uZo1yJwf4b2Qdzi zabsOXndUF^s@;1Ex4!T2@Qu5dLtfRaFEy03_4{t)|xh zk}VHKs=DmJR#h7iVl~Gzr|e9zxxW<)Y5MUTrB}}D7-W7Sj34oA7Sr1m)Q&a7#F{JC z_LwxHdsBv*Tz!NMd-3h&gi_yy2v$83Y2B_{_Hpvl@LqQs9U(hlNOJDL|%}T^vxrzx*asEIbq0 zDgiP@9P@zMK|WvjU3F`6|FPj}@p^SRa3jK~cxm3jOM;>);7t;{*eWD1>~gg1_HzdX zodZ5yvWAq$hU6*`A38rR0BT-vt(`cWaBWDbBLhTx7*7{rY`i@OyK5edqjs!t{XBKe z0w^&J0q!uIIwABkEROrANZ9mHjb$*+k8u246O7br;f~Uf8;C63jOp`GnX#&E+`6_e zhvI@z!AAZMD&@ZK=8A}b#CmY{ygW-2@ta)tKMbTOOSa|G>^(avhcmrZIIw zA}vkDxVY*bsv+r#dwVMqHaGq@PE31v@+ar4)TBR;vkrjn<=0dCavGK?1GN!awYd)I zjan_v7*buUpF_};k&F*#g;)knKW3{bt04u|gB=$#j3FXt{Fel`9J5rdK&haI!%asB zDh~l2LAbmxhcu3e=_TB|r$PTAwxJ8_?vg+|(ae#B{q&#AI#rCgOsh?nw5B}r+9 zIgvDrjKe~8iCMOrMyXsEqE>)f3|}4ISZoF?JkyYR zz`_%iA_FYECE(Dcr+5=fz3bMnITDe>jl+$!qdbA3nG{jpKr<$jA&c+_My?|?aI#2F z(zu?$+Blr*7Ceo1hot81f4YzUyPiU@;jEUvulq_vGlkJeivjxl4I@z=p5d_Ff~*jrpI-IR8#evG)%-H-7WG$05Yd?*{r|&NsFfdDJZ@LQcuX4 zm+F6A`~F!#OwNi}EIz^AkhP2!*fZTEM3WJJX!>jVXkq#+lRZ*w%UWwb5NHC?K)R+2 zARF+bCE@5lkd47pR-HEhvf=k&NgO~nV3!si0J724t1)0<_$PpimlD%%HuV5h^yYlXD2Wg+mo3%7p9oF9B`eCvtP~dXSf4}-v$(LfS@q+tfg!#h?^-nOY zx-x4}+d9qwU$A46PTVD>V!GCgB(0vm+D}hJEni+n|Lg8%7RJc?rh&=S0AnS=*Xac? zR>$hmzZt73Un&!Dx)1xP(NM|J{3dfa;CW51OSFaf?*k{A0iG8J;CThx$Hp(?zQ)x9 zm{z+skNDqAD~!BexAHgB3an2izW-)g<*5Ot^;CFs8&aOAIhfXnK+i@~P!F~tpz)b_ z)PDbEupdfFN{N;(3bsGnW@-T20OVQdySNv7ao)jzJexY6JqAKoge^iMO`Zo4P{G}i zq7N|eh{iMBtrjkqk$ptcj4&ouKq1G`ro4@ zOg``B$Lx*%yMkzsl({H>>!b;Jzjabqpm|@VkSd%v*?H#%))Yqj+w;17;*Z&y z5npoC{MpBozlM%Kum0UA`5zD@{u~&=!~L(hxBtt`?SDj&__xxE{~1Bz&#B>$mD_)j zR{ZNA@kg8AKV%Z^NqCzLQ~%u)`M*WWzr@9VGJ)jl)zXBYa(Z54a`_XWZMm@$7pgyb zm&kL9=lZ%6&jy?>`3YFO1Btf5VD#@(02o^-$7}aIenNm#062hC0D|Ah4J-%a1uK1x z^r-S&Nu&63B%sSn@(Llk7_sfqyLLWzmTyA|xvp<@*!6XuZr=a@SkpNEKd)*2@1H`6 I_SfA10>MgfRsaA1