From c878e39b551e9bfcaa21d9f57be411e47a99a7c6 Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Tue, 18 Oct 2016 15:47:38 +0000 Subject: [PATCH] BUG 59830 -- incorrect reading of unicode stream name git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1765468 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/poifs/macros/VBAMacroReader.java | 17 ++++++++++++++ .../poi/poifs/macros/TestVBAMacroReader.java | 21 ++++++------------ test-data/spreadsheet/59830.xls | Bin 0 -> 82944 bytes 3 files changed, 24 insertions(+), 14 deletions(-) create mode 100644 test-data/spreadsheet/59830.xls diff --git a/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java b/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java index 90727c24a8..d0aa4660c2 100644 --- a/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java +++ b/src/java/org/apache/poi/poifs/macros/VBAMacroReader.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.zip.ZipEntry; @@ -268,6 +269,7 @@ public class VBAMacroReader implements Closeable { private static final int MODULE_NAME = 0x0019; private static final int MODULE_NAME_UNICODE = 0x0047; private static final int MODULE_DOC_STRING = 0x001c; + private static final int STREAMNAME_RESERVED = 0x0032; /** * Reads VBA Project modules from a VBA Project directory located at @@ -287,6 +289,7 @@ public class VBAMacroReader implements Closeable { // process DIR RLEDecompressingInputStream in = new RLEDecompressingInputStream(dis); String streamName = null; + String streamNameUnicode = null; int recordId = 0; try { while (true) { @@ -306,6 +309,14 @@ public class VBAMacroReader implements Closeable { break; case STREAMNAME: streamName = readString(in, recordLength, modules.charset); + int reserved = in.readShort(); + if (reserved != STREAMNAME_RESERVED) { + throw new IOException("Expected x0032 after stream name before Unicode stream name, but found: "+ + Integer.toHexString(reserved)); + } + int unicodeNameRecordLength = in.readInt(); + streamNameUnicode = readUnicodeString(in, unicodeNameRecordLength); + //do something with this at some point break; case MODULEOFFSET: readModule(in, streamName, modules); @@ -334,4 +345,10 @@ public class VBAMacroReader implements Closeable { } } } + + private String readUnicodeString(RLEDecompressingInputStream in, int unicodeNameRecordLength) throws IOException { + byte[] buffer = new byte[unicodeNameRecordLength]; + IOUtils.readFully(in, buffer); + return new String(buffer, Charset.forName("UTF-16LE")); + } } diff --git a/src/testcases/org/apache/poi/poifs/macros/TestVBAMacroReader.java b/src/testcases/org/apache/poi/poifs/macros/TestVBAMacroReader.java index 0e634b5c58..f622c54867 100644 --- a/src/testcases/org/apache/poi/poifs/macros/TestVBAMacroReader.java +++ b/src/testcases/org/apache/poi/poifs/macros/TestVBAMacroReader.java @@ -244,22 +244,15 @@ public class TestVBAMacroReader { assertContains(content, testMacroNoSub); } - @Ignore + @Test public void bug59830() throws IOException { - // This file is intentionally omitted from the test-data directory - // unless we can extract the vbaProject.bin from this Word 97-2003 file - // so that it's less likely to be opened and executed on a Windows computer. - // The file is attached to bug 59830. - // The Macro Virus only affects Windows computers, as it makes a - // subprocess call to powershell.exe with an encoded payload - // The document contains macros that execute on workbook open if macros - // are enabled - File doc = POIDataSamples.getDocumentInstance().getFile("macro_virus.doc.do_not_open"); - VBAMacroReader reader = new VBAMacroReader(doc); - Map macros = reader.readMacros(); - assertNotNull(macros); - reader.close(); + //test file is "609751.xls" in govdocs1 + File f = POIDataSamples.getSpreadSheetInstance().getFile("59830.xls"); + VBAMacroReader r = new VBAMacroReader(f); + Map macros = r.readMacros(); + assertNotNull(macros.get("Module20")); + assertContains(macros.get("Module20"), "here start of superscripting"); } // This test is written as expected-to-fail and should be rewritten diff --git a/test-data/spreadsheet/59830.xls b/test-data/spreadsheet/59830.xls new file mode 100644 index 0000000000000000000000000000000000000000..592d9ba694933dfae1b113d17b52c2f92e1e8560 GIT binary patch literal 82944 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�F(9F{X2mP;9o^UO00T0L;d*WXirD1r>d|x=77?z#I;iexHLw^ZP7oVy*hN;y zN+gf3@|9ZfNRsH4s|pKVrQ}`B$~et}M+ipeN39&qqj4pgx5|Q7W5J_qw9)6*S@7tp zXmq*;3*KrA-Wm&DqXn$2X0x50w9(Smon1#goDk5;9k%f$m719+P) zcr*hxpZhFyxEMT|d(rHjW?#ip=hY+Xm(=e__golX)m~U4Z6op2IP(fp3A67d%)XZ} z`(DEAdkM4eCCt8;F#BGD`WUm15@z2^WS=x@Mz&E8QD1S$&uUPuOQl`W=gIW3fedkl zCQ&J~jit;smNMH|%4}mPvyG+9HkLBmSSn@EZB;3=@1@MHl*%!R=E+oR>f4I=dL(3? zhm}JHL)vnNLpj5toZ(Q;a42UulrtR484l$PhjNBPIm4lxjk9EnQst*jNTLd+OBGCp z3MNAZlc9piP{CxVU@}xN87i0z6-7?F%n#@%_qCC_iI)mh(Q9uz7YWY?%)T$V2RSdN%hFTRvt%{*m#Zaqas8uo4 zsu*fj47DnTS`|Z$`dg~}hz?0q%}}eBsC8=cRWl1v%}}dms8uu6su^n447F;8S~Wwh zTB3GSq;$H@s3Te}QR_k+p+=*u8MT!W)KKSVF47GZOT0KLpo}pIHP^*_R=&02*)an^(}-!Xj}_MLgsO84MS}WLv0O1Z4EY+oIjHBtt> zKdq51uJ`mc47D{91G0?N*T|IS*2GY2VyHDS)S4J-G&@O^AAlpA)-oCBNkzjeT+3uw%Vb!~WLV2& zSj%Ks%Vb!~WLV2&Sj%Ks%Vb!~WT4qpDxT6-t^7KvdAgNfC+$U_hS54^FV->5TgNnS z9n-vZO!L+;&08mB(Czv+-UKB9T+Bbv89qIongRPaF~ zRr5A5)HX2GHZasSFw{0M)HX2GHZasSFw{0M)HX2GHptqRL~3Tf!+HZljpnhb^0R}a zc^f5ay1m#48D_~(5vp-!d$EzBwvnN>k)gJcp|+8swo$gPZZ9@U8FYKGQOa8qLTRe342;Z4*On6GLqiLv0g7Z4*On6GLqiLv0g7 zZ4*On6GLqiYHRfLO{}kNVyMvyLaO{gBq7txP-~W`?b76HW__)hq1Mb$Yi6i5Gt`! zRz9=k@nF9%V)dFrD%&S<$^H}g&EO>N{H~QQ*3m#p+i%!>W!P{oR>#*SY zEO^^3csne3ehVJWRHN%hbEIfqw*`-Uxaf2t3m%Qe(dl|Dcsnh4y%s#OD$)5-e~#wu zw&3lt;O({G?X%#WWx?AY#Uq=t6+E*|*&4AaTO&4QYs99I#wqw5nrc%#%%*slP4O_B z;$b$$!)%I&*%S}6DIR81Jj|wem`(98o8nOkf zapv*6h1rxAW>Z?2O=)2^rG?p)7TLb~_}wC9(8uo<+2UV|lx`jgS|kR9G@(X4+KgIj z1hv)(YON8}sIM#dxSc8$z30OiGus$yZ49+GhFTj#t&O49#!zcxsI@WF+8AnW47E0f zS{p-+Y*VWIkTW6UWvF>2YNXw2oEbGQL(R)j^D@-D3^gx9&C5{pGSs{bHLsLGN7O4Z z=ts>6HL|5<)Y>DcwMVcb+p5S9c#|yKq@0VuQ$uuR{6HjRmUA1Ea~qR$8{{rf(fg-#R2#C6St${lyNZZyikEXzWttN7P9oACtkyWbiQ=d`t!(lflPi z@G%*DOa>p5!N+9qu|DHtGWeJbG}fkyM>W~EOBu={A(|r_A<`vX3${xcjF9>Hz3oy4 zBhLK%-gc%-+ocRfO0zC)mogY}W?kAYWuQ1(*CpQ|RcaM^1TOhWdqTv|5b-la{0tF4 zL&VPz@iRpH3=uy=#Lp1%GerCh5kEu3&k!LG#v#teFUim;Wzff-PRNiUZj8j4dv~Xl zLH9j7S?}(YG8l2@`&K)p3`QLFZleS$NQn9Z&Fe|p zZYhJ_X7mww<38YS*7Dt~<-4T}#(CyDhP$No2lBa7#kracAtpnJ$q-^P zgqRE=CPRqH5MnZfm<%B%Lx{-`Vlsr73?U{1%@I=ZQBxI%Fl3mCex--(xQF=sNXXoa z!%UaLOqaq;m%>b!!jQojzr#`nT|>fB1|vk{n-QYBo4*pN3*Fs(ffnjvE#JdhzK6AZ z4{P}z*77~9<$GAm_pp}lVJ+XoTE2(1d=G2+9@g?S>r%w2nhZOc3_F<&JDChSnG8Fb z3_F<&JDChSnG8Fb3_F<&JDChSnG8Fb3^Yqj6&GqU^fDQGnGC&5hF&H^FO#8{$dG})%w3Sd=mEPRL%Lj>P~*%!U>EBFyI2p{#d^Rl z)&q929t9N9QqgzeGG>_hC?62p^xD}s|GW0zo2S+b~71vGZ}U>8Fn)nb~71vGZ}U>8Fn)n zb~71vGZ}WXTJL7HrgaVDy%Kw5t#waykF2#3GW(@_WUX~H_sCisA@g0Qdt|MRIP+bn zdzkj@VcN4tw!Cqk*)QEAWzgejjlj^Jy{zT;vX=_p+AX%UXUfYx%vb z<@d6d-^;XTFT-Ik!+};4T;dK*d-h2gvLhk#iS)5!pOiuOU-n5EjF9=wTl-iq-X~=+ zQks3DeNqM^j=WJLMB|tdA{_KJlYLSK@=a-eKke#pQ(CZs`-g@<5)k!yWp_4+K=2!Yjg_n4p{KWmp7%8=aQEh%{$kEM;=6UI`SN% zc{FB6^DeaDU1Y)gk_C_E@X`6voIjfPWeeWroG06b?jejm_e#!_>1eG!Ivr_PG>@!z zH18S<-nACI>nwQJTkyVW!MnkNN3*5qy4+;JyV-(wOB9dBL(-vnf{>y&mmWZ$n`il# z1Frg(OVY3u{HZpcbSp)?q=iVUQqVWlIMSySSS2+?nv{Z3S`Cp7%@;3gA<~}t;uS4K zwV5wSQ>cctpAS+)q$|b~Go&RcxWcK%k$$AWGgU*R8AeLd33}>UmGcT5EwKD^gR9C( z8nY1nR6XNLoUzdIFBe?(4ALj{EyPrB(xepeDt;+MI+P+_(?X;@DdJmNi1a2!ysm{v zV^YL7v=He^ig;2Bk(SV#fYdxmKT^auwGe4Wig-#3kxrzD=d}=N1HCgyJ&*JtMZAGu zvQDQXyK+0(stJSsxsDM_mgpez!aLuod4>Lt;;&ioZnfauX2HANf_H}n?@kNeT^78% zEqM1>@D5q&W~E8d(49OxCQSC3m)lO zbe%~Xqj{uv(LB<=Xx`Hnyk{(U&sy*fNAaj99Rx2$d>g+MA}yo$U#TI|uM|O&QXFYk ziujHeBAudlW2teZP4sRoHAH%pg7IGskp>xYq&xJcEH#d_#)u<*q4#E~ail3m9O+1k zcvFib?VxvRsVPY>=$%?>h%_PveNPRME~JRJv=C`Q3f{V?#u5H0;%zNN$fpQuUy_zE zPr-L0)DX2n3cekoh6v{r@qH~s2&ah2T8OZvca5nj3Dp$&Hgw99@HEb&l2XKXwUmTm zia1FN5qc?NiWVZ=Qt*~J^@?*EEX)SHXMN;7W^)R1lp%3wv^r(?GL93W#u{_L~cu2bvFB09puI1X>Kr0MYrG*k^&VK}$gn5a}$n zTMoz#$^}tcGH(T-LeMhMa?mNDBG9Rz6`*1er7gw23{(!P09Arc166^lK`TM4K$Nx? z`#MlPr~$MZvwP+6wZ3C~YhDZ6GhG9kdP9 z0rG*igLZ)YAWGYXeE`%AIujHGg+O6Y4`?T-7es0Mu-^^Z1KJDP2RaM1AJh-BO@jt} zii26ug70I0A;LKC=v;(*L9~G-F7CXjlVV~dN5IoLdelY{GPS-xz7C*eVcI3*m~xH- z(ZEMFpv`6@C8VQW*lX3n(IA^zd@VqvQ`C_Dt5)`X#L&rV{J-*7t%X`ERUE1f7ntg) z#u+I_T4y~U{d@}R$JTrGjQ8~uN3#F?TcjeCJr|5P(5v)^L`gUt^tJTh16|6x(k*qK zP8<{|>G+tm=<$1<=}BaL2Hzt3`=X}5q$HI4>)6lMlvUN=GKFI1BCiWU{|fyjT|VZf zqJ2F2JAMf4s0seD+agF}7mYPk3Ymz;Z8VR<(RmD(&Nx>+<9+?ak?e=)XAce9&zd^meXS1!ceDfo$ve>75-%zB zglzUp9D5uNhs)7W;4I7%$&Q$WvUoAYKG`YHoo!LcDc9JkJ}on+r+~OO~Ia|(u!T(0VJFfs{hzFW(ZkJ0qy7JQ zdVowbME}2g(Eg9Pe=#Qi)bT$qjrD}=VcGGIxEuv8N0v}x6DE|Q-_KI}y?vkF@8{TF z)cbvcU+?$HVZGnuqs&^rpCs`B>+hNe z{sH=HUVorD^l&#?e~86NmMa3#HxH+I~eXp<qqVrsJ|a!?RZpwPl)bPCZqa$9P6LCCs2Q1yMI)FPnhMuI*(ChbkCs2QH zoHMGwCtQEc^Dnw)I^2!s9|<^V3P`u=L*>ze1p55LTt2Pf4|f~M{0G-DEz75C#lzjG z{3M(-5p=xr)1^!+`JGq^9qxt?nGXB<|2Zh+4qP6iZS?x%F|R-7pFsPSg!>;x{l^n# z!AN^Y=RZTte+q`u-vemHvq5y-^jz%E1Dy}L0CXYfBG8vW7lSSVeHlb)FT?(F&=sI7 zL05sk0=gP>4d`0Xbs$RnRqSs7-3Yn~gmrjv3+N!|YoJ>}w}B|_9oXLqx(jqS=pN7^ z(7mAhK=5JZ3r#8QLpXjI^a$wdphrQEfgT4v0eTYj4G^V$3j3!)&w!o<9R?i%JqLOo z^aAKb5T$(?`&U4(f?flC3-mhZ4bZni-vPY|qO@;g|6S1cK;H+w1Ns5zhoB#U-Ua;_ zL}`D5{d=IFg5C#x0QwO0GtkdLAAx=WqO`xl{$tR;gMJPA572Kw{|Wjp&?lfzLB9q4 z4)ouk--G@D`XlI1pwB>m2K@!}SJ2-;e+PXIg7-!j?T2&!Pfzuz{Q@#4Y9jzf?bi_Y zt8gg$HH_+R-lAG~6P6k=~}Ybi_1J_}KZWXV6S%#M=<}wGFMm zL*0Ng4E??Rf>HfFHsHgGC7l?xzeCJ_oI~A!F%12EA8Ruw+<(-1_Ne`p+B|B1qo3ay z>IRHq=x^ny{tnB)4v|>3zkL3ct99q&-(mhCp97t)>HqPZ`AsCUp8w<>&*?19NajB; z4O)Ia%lmi&RQ^;XOaW1YAI~{&A(6HG@Q{bOjYR%`GnM~;`}*I|{^L+L;0(ilO~mz; z(eZZ(t91O))KNzL$D#bkp>Dt#hW>8E>eQ(I9>0PPk#bajk7xaSs2ebbp}&vg+UcnN z4xyFDA3dtS$D_YP-GC9%-@RB|ryB_L_ivno@WL_F$nrWp-oLR5KIRG6U+(`Gs^tyi zm;BFZNIwfix^q0I{t}7S(K01AbNTcn@Nl=0_`eCb@1e}HeCKeBm)C!0;H;UTtWg#gY>vGVu*8X^a7IV zb4nxUkJsKoLFxL@^7{}^$24QM;Ygll`k}b!jiRG@(P2Fcoj>$B>KR{neLhX39~dv+ zDJL^LkRTTXWdG_PD>A_(QN@9T@x-grj_IOtgL*uX49HgPm^5*hc1%X)LhU#a`@6Mc zO8=yGO!>T}9#5w9AE?Ju#?v0njdG_@nq=*m@>fiJhjvV+w%BxBWjby!9d9rlZ`F=T zt`5_2w|YDgNQ+(CG1aGEJEr!yTs&?4cC89man8DK7|!gW1lbT>~^GDiE1eLHJ7KSn`TNmN35|g z6b<(Ac=4Bl{Y;$OgkP#Xg(=_rAk#eDm==S$b?7Pzejf*~y(3f}8DN1Sf|gMf;yc^ow_3Hm&Kyi8_{En9h9#EUiFZ9RTZ5S(WFqmYNT zImLxyGvs&z+^w{aEfg(UxJ}!)Yx@rD72&rRitT8hZtT14J5aZNG?w;I=lPEe zHQ$prOf~kjD5U{^8=A8<;9u0*BZ9$Juiw8osW@?sr)!(nUK~OTW;c5MwEhF_5iy`x zP#kCsh+e2m_aTnOJ`pqyG#-=$ngE&zN(M~=O$MC=ngW^%qF0KgfTn|HfKov-L9;+7 zgVI2=K?-ONC>=BxG!HZ%v;edavsNssL4jP6JVgss^nDQQ8{pYe99OdQbysHE0c} z5!3`)3!=2^u_sfp5p+6e6Q~(<252*A3ur5d(zamV3Tgv+LG7Szpbn4^v>mhqL}@#* z?*aut-Jml;K~M-32K9h;f+#JSo<7iS&>qlU&_2*vp#7kJkhe9Qkd&w-h=nj3c=T7b z8bUW4Lbn@2HyjDD9OK-0QBU_GUpPlx;21Z(JRp>{U16VJSyU9C?i3e|JrnwJTQ{&d zwWKxd+v!E?-jrS6-X8LX9g7^9O0wgEwr*$T;wxMGGuCGHaMe0uf zx!$h+)EaNsBBMk6$BlW- z_WZ=gaBQFd`75NoDE9>4No@4(J}|c6-0a-dE(N{h$em(`H{1~n^lW>+qqrJxIttZq ze17&D*^Tkn7AH0ZFK>-Y9Mkf`!C6!4d%}L-_%5%lyg9M4!_yWU=$$ooZC9H&m}8rA zWb7_~Wz6#{>jL(!t8>c&{y?xg?#P5)&nK1i;Jru5p0KaAuBM`^EkUVnzcen~;S0T4 z{9j_?g)fMyJ)M_bcChBRuf%nFc6~VJ!y08*Meup&xbZcCK=%@R*;(!0{z<84B_)11 zwg2KI`7#C=jpNylIscf+<{ztZ@AL_ue`s|i8y5o_z5ht_KX*s`M`|H-X1UQZZ4{t= zv35-1lZkO0{wJlP^fbKuukb%l9`!!~B@Gtj>yj@@0|Smn?0=5>oTEOcZe(m}L;0L8 zd5^Q%=Y+=@3<}lbOkC5Tdz?zPfX4}sBPr3Yc^qCv=<^hzPgI0HQxW=9#jbfAzHnlW zI8S;U%GzSp^^ z9tSxbm*^e`9FAhuxAOI9BsGlxn-?akK_PZ#5;+Uqo+u%jtXy z>&Mo6^^7mPKBX4JZ;Yh^;r&_OLcpi-lZ{{bxk@c!xc3j>$*GN^gf@{iR}l;U6Qf1SYR zA9}Zp+OK25J?y#M_Z%yIwM&42j( ze?-qe$#415g;=`s5&hE5S>|4PJel-D{-02TVdGNwicXb%+`m&sQ2u2o|8Lq_ zwz=;A++z}Pbo?D^{2lW7ht|jXZG!FwvF4{hdjm5nnv&6d6 zl7?VlyZ6G@a2$Olv)Ddm`xtv-kv%c~0CeGO&^e%ULFa+a2VDTV5OfjfOQ4HEmw>(u zx)en7yUVe^0(2$lD$rLzSA(trT?@JnbUo;+AWDBD_BVlU2HgTW2>Kf6R?uyr+d+4L z?gZThx*K#4=n&{$(0!o$K@Wf)1U&?L81x9}>!3$LRLt~>ux|3a4TGHDkLAd%Nb{+dZm2RkkX}!71n0bJ3Ok0#;{#J#JrCM9 znE0QWjww#j!d0fcuLEzFDNO0~Z4u<82GqlY?JqozH0E<3GS%yDls#Q5|3`z=qgcy7 z!E~NEzoCu`wDY>Pd`^oW_xPAaGl~zL`#b+${F}EX{bbMN-&B05sO$5epPccq&VT2-KPfpUqh{3|vp*_b8vpT1ogcd8imPAP zdRyhgYwpNe_RjKdou8O+>N9u0`HhN4j(#ikDfg|f>HOZ}!ZF^pSJr&>(;4$c=Zi~q z{*>MMZ~ptg|G4DFU7sFkx#aKjb^aN}&%Ks(*E7`zmY(T(^wDphs`Fp}%P))Kw*RW+ z%8sME;!;ZFCooB_?Acjud!PMz#gh-8U)=Tmra$TFSKa>RkAC^PcWa;dxG<-=F=>s? z&uaha^K;^YhcQCRM-t zhpKx#c{?9z92cka@7(eBm7(8GuX*O}dr$3rGwWlW|72+L_`kU}lsz-$?EL;k?>(jS zyVeDktgCsX^uaU#>*nB7FE7;juN;|_lk(^p)%SlGeEGnhr*FC(dQR>3%jVx?Y>oYL z<)QDK{PwBKm))zU&$#cN>>t~fR6iX5Eq`atgFn*wv@gba{UEwQxB@RuP0q%Bim?^D zaDPkxl4KDRi{bT8KT8I0y|2re_uN_9VU8<)KSkGiTEG5CvWTU0dH2sv7KwBu2jtf9 zvxk%M=tL;o7Vvwo+M0~p)@vIp1HsNv*+h!K9W1_9@6;Yd#Nw5L^hMm3Ny+#s_m+yC z9)AzMqBs5BWHCM#pYhbc;<;n*&v9lfKJ16@`hA>goat)CnR+%kZKi; zOo99kQ=q_S3KVWfAVII8W9>9k$hpoOa;-OqayFPl?v3V9?&;=G-X?P>zu6orIKvz& z+>FrJSi1jR-v0i^_o*^;M-ttT^gtfa5%MPZACE_bpokD6zH|jOKHb-h+nV#6sqrbQ z+qq*K5EI&c%t-jm6B;nMnfc>G09fD-=JyDHI_U9!vubw8zec^7h*m$Iyf;*Ak>D{`RsoX;t(yc^l?>+=5hYsnblcljd> zS$tif%Ujn*605fh;ojw4--AMpLrQs@GTo&-y_f`}8Q!CO^S1XA~Ob{+K5G44?Y z|JS*O61W_@0ZP0M%AHS{qMUn7=(${b&7quq=8*d=b0~MeIh5CL4&@&}2zSuhY~)iq z?Mawb=Gf^mpj`Vz7=nCwFm_RBp9J)l+b5&Ji|i)>z!ml>s6Tc3{|Q^4eJWs3Yr4-q z4G);?x2NFop9A*kc&z3e`wX#2oM%rJi^TdbE=qYAA{fd_IR;E zEVL(xVzJmhR+NY(_C!%Cvh3q9*I$YUh05^^PbJW?iA3Z*y8ZK7;0;e7HT%)AaMXxC zilt#v-RN;JJ08-?5Y2d~$^6xBH~LfM7x-%LT+Ax6F}s+HImKM)z%rDeu7sS1RiF}a z7T!eL41PW4B(?ah(>S%F8eCc@YScLD>QS?{ij;@5h*N=YgJ(mlYVbD~9DL(i^au~0 ztWpr`LC7asaa<_^Sp88@VmJQ$lIsy+>;s|;smxolZD2dl*UNLhP&+tL&s@}z+Cp!K zAWGkcdU>!KM0NDh6Je-LGundcP4OX6J8G(+E!y!%d@oYeBYmZ8r3%!ITCqZGK+Y9t ziEMdXfs(B9sla2Gln1pDok{pm?k!?FxUI6R8kEx_YZesH8`Ji*rIzF%5AzqD_3yW5 zp+@Sl5v#`;-*%siC+k!#F7XV1x3nx{HWnk<%mvKK$bkzwj44N zHdzRlNXfDw0rhtmc%|UvBMr3#wL>}n@{zg_e=dac2a%QVDidoVPleWRLumaD(L;w_Z{^ z4$qA)h_sOl(pExlLe`BsXQ4Gp!67YB^#Nm=)`qz_B2A`NR5hA3qC&Q)t`9koz|ial z*{`kpeVNqPPW*NO<)JJ>BU;vj+`MQbD~mv_SwDnUnXQTfnTKZ$PR5X8$DeHkf3YGK zKEN2eO(bBSh`s8E=vVx)hIs2|Rb#QNITLpt(z_Q_4=5JC9F>>=pJ)t5uJQ0$6XEbC zgGCCw1I8$Tza28;Q!O%{0rzdNbB-P@Q`BnH3XYgBms!RG&kmsN zg*{X2yTT&dnRcG;=+QbYD_Z!{vf?7SWF3nwGMg18ybB=E_tj~mwJuF~o?VX2uEZj{ zw5aTIkR5&QnzpTjW#^XJk%5hdMv2PKjqK>_v$WC5n`P~CWp-q_qq9qo$}Sh#(Z@h( zqlE>_?DAxGG=M~BH!mu?JY+}TW~7bQ<}9;QS7R$IvRe?9T|TnAagNMQ92qRT0$ICC zi|iIfWmkag=*v~K(Q2V(?Fwafr&(l|5tUsbvZD{l(Dtd39bZr;V@iw9RTdd$V(P}b zoda3Yw>@a1^-8UV(aF@FQEicB_JAy%$dW#{K$|jnmTLc4X_2L4K$g@)=nd$!(dy_R zwN(4aDvK;#1G1!Eaywp1O&cvj50a(YPiic(bPvdqdJ4TKm^NA~A0$h)uhd#(nKvLy z>Miu@R@(Xp&rZ$a3$1EUEY0g@?6hqYFQlg44^6sFqC@S)Mf@ zOX@xJ{0wb$jbxB4)!wt#BFp{(SyJzzTiR(W9z096_pGzX^6UXwQtzR=jA^4QR)f@1 z?LF%)vOIS{mehOb#y{HVV#**{s=a4}MV99e$dY;w-HSyV-Ksmf{U2@td(bu|A#Tj% zvG&Q*t^NwU?Ukq46Q>DVuwT6_aVi!PX^Ksg>VBG4C&AmCZ{I9pGMZ1@<8bslTn=}R zBTFQl92;8(k9~q|vcusPdHd$NvK@0V!zo+VyuP{)lfd$a1*y90g@=rQA_k>Yhk(usOsn z{q`{j`fWC)q9m^rv$`@zR!Iq}k>z$*xUxzyM=sB*D5xwi@6UG>7P>0)t1yMHFI!t% zaTZo&LY@wHb4`76SxHS}aZHo9v$(r?U1>#g`Ks&!@2<8FTt}3C%tM7f5j~>LM4!9q zg#(Jb9`xdYdU0!eF|GMLf8eGgNn@@$A`UoQ<&_1PnYzoea!V^q7TdOzX7#&sj}(`b zJa?quU0#vvy3kR4uh1u@VS!T6ob4FjQ9Qq2Otimta=AF^dE3REGh(g^6w9kor^Q|ss3?BCr}S~BNFAHt zTAQ3O%Ra5D)aE?<&3#!%K1?gM+u|}yQ!nbwm{Xdtq|`R!?6;aQAJVQ?9SrO^O-wHy z(z{uF^P?lSCux2($M*Br#<~6yHzzQe<~f~{%ajS}w@&g-F4;>Lx7LNl zoDY*44^HwPSr-1Icuu)1#&v7TJuydv6cjg?P@Ux;d4?H%({osV{?nAV5AD(dQgi{V>J~kou!3nvC==aWC z;(b)~*n~VJ%R5B7JYv0e=>Eqhr|$@n2gRcryN>l`HJ; zuN3(jCa(mu>WdH4aH16cmKpk zr z?E7o+yhzs8i}zi&D&=te{IAEm_EVQ#l`6jRM7+y!xWZ{aTruZx{AXhIGnDK8+K1xz z)TSYo%YGOk+%xp-kJO0nxIMMtUqBIu})R&ZivH4?=e!U?5|MDez8V(CGT za`DzsU$v@=j5llX>4VW4F5VjI3re-Kcx&Jtct%;gHC(3FaPih~nOeieTZ5L;BbDc^ z;gYR^SZvkhMd^DgN-7E~@(OaZ%JLnRSx#rUE32@=Q2}Sb;m9q?cUP2_mG8rc7}c5= zX-Fp}mIqpUI=x-tB6Dw9x}XZD$<35P?IrdYJtr#cjtb{Sh4Z4q`BCA5sBmFa z*y)I7IHMWSRdiAv`TfUgn-1p}*U@b>Yn%(Bb=c!M_XZo5;V{djEe^J)2dnyYHHNM! zRbz#_9cGf8JnQQ->UsL_B9u?%E&$_r%YO{z|3=Fo4y*D3T-~BNcu{tEnDr^ZnlqKF zZ+g9swf_dncYtWK;W`3ci|WRTJY8uU?uPgO4!itkQFfG+*VGkVQ&)6NU8rfDr_)=MZrpqYlThXLcbDNt z8SkzznGy$B>+rTzOhVuscjIQ47QZ*gRg|7nnB#J}U=@&{toF2`^vZ(DlFHJ`!pcfB zA-24s6tRvqPc2@t|GUaasd^( zGL@VH{NNNdGN;IeAdx#C8Rq2SClcvCR%Gt6vdueIWPVXzUZz5n>!eya@DnMspePqX zqP#*UrNB=lvaraNkJ^Ir^61P0^O;UZQ2`PYng&YWB{JN@M6QlfnP=*{HJv2I(Zdk}tZk<)?F?X>Kk~ z$;m?jryDQ5`Wz!(oQ*DI@Quv-2j|`LyFb@=B;R{Qf>^Tf>+d?idm2Qq=%e^55H0C7 zfQZ)tnhe?n8V9-@G#*6HGbe{}r>IigtLP}Y-(imv<_DMeF z8SZH%KPr;0R$u#o!NL8IqL?C^X3x0y`d4l8c>Cg)_n!W&dYt*m*^huv