From 882bf2cfe81bc1eaf522fe2c53b7c6264663559d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 25 Jun 2013 14:48:16 +0000 Subject: [PATCH] Patch from Andrew Novikov from bug #53972 - Presence of PLV record shouldn't affect HSSF Data Validation git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1496499 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/model/RecordOrderer.java | 1 + .../apache/poi/hssf/record/UnknownRecord.java | 3 +- .../poi/hssf/record/AllRecordTests.java | 1 + .../apache/poi/hssf/record/TestPLVRecord.java | 59 ++++++++++++++++++ test-data/spreadsheet/53972.xls | Bin 0 -> 46080 bytes 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/testcases/org/apache/poi/hssf/record/TestPLVRecord.java create mode 100644 test-data/spreadsheet/53972.xls diff --git a/src/java/org/apache/poi/hssf/model/RecordOrderer.java b/src/java/org/apache/poi/hssf/model/RecordOrderer.java index 764d5a5110..6ea8ea95be 100644 --- a/src/java/org/apache/poi/hssf/model/RecordOrderer.java +++ b/src/java/org/apache/poi/hssf/model/RecordOrderer.java @@ -344,6 +344,7 @@ final class RecordOrderer { switch(sid) { case UnknownRecord.SHEETEXT_0862: case UnknownRecord.SHEETPROTECTION_0867: + case UnknownRecord.PLV_MAC: case FeatRecord.sid: case EOFRecord.sid: return true; diff --git a/src/java/org/apache/poi/hssf/record/UnknownRecord.java b/src/java/org/apache/poi/hssf/record/UnknownRecord.java index 963810f745..4231a659d3 100644 --- a/src/java/org/apache/poi/hssf/record/UnknownRecord.java +++ b/src/java/org/apache/poi/hssf/record/UnknownRecord.java @@ -57,7 +57,8 @@ public final class UnknownRecord extends StandardRecord { public static final int SHEETEXT_0862 = 0x0862; // OOO calls this SHEETLAYOUT public static final int SHEETPROTECTION_0867 = 0x0867; public static final int HEADER_FOOTER_089C = 0x089C; - public static final int CODENAME_1BA = 0x01BA; + public static final int CODENAME_1BA = 0x01BA; + public static final int PLV_MAC = 0x08C8; private int _sid; private byte[] _rawData; diff --git a/src/testcases/org/apache/poi/hssf/record/AllRecordTests.java b/src/testcases/org/apache/poi/hssf/record/AllRecordTests.java index 831cb9d378..8a3c92ba77 100644 --- a/src/testcases/org/apache/poi/hssf/record/AllRecordTests.java +++ b/src/testcases/org/apache/poi/hssf/record/AllRecordTests.java @@ -77,6 +77,7 @@ public final class AllRecordTests { result.addTestSuite(TestObjRecord.class); result.addTestSuite(TestPaletteRecord.class); result.addTestSuite(TestPaneRecord.class); + result.addTestSuite(TestPLVRecord.class); result.addTestSuite(TestRecalcIdRecord.class); result.addTestSuite(TestRecordFactory.class); result.addTestSuite(TestRecordFactoryInputStream.class); diff --git a/src/testcases/org/apache/poi/hssf/record/TestPLVRecord.java b/src/testcases/org/apache/poi/hssf/record/TestPLVRecord.java new file mode 100644 index 0000000000..fce575b1c3 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/record/TestPLVRecord.java @@ -0,0 +1,59 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hssf.record; + +import junit.framework.AssertionFailedError; +import junit.framework.TestCase; +import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.hssf.usermodel.DVConstraint; +import org.apache.poi.hssf.usermodel.HSSFDataValidation; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.util.CellRangeAddressList; + +import java.io.InputStream; + +/** + * Verify that presence of PLV record doesn't break data + * validation, bug #53972: + * https://issues.apache.org/bugzilla/show_bug.cgi?id=53972 + * + * @author Andrew Novikov + */ + +public final class TestPLVRecord extends TestCase { + private final static String DV_DEFINITION = "$A$1:$A$5"; + private final static String XLS_FILENAME = "53972.xls"; + private final static String SHEET_NAME = "S2"; + + public void testPLVRecord() throws Exception { + InputStream is = HSSFTestDataSamples.openSampleFileStream(XLS_FILENAME); + HSSFWorkbook workbook = new HSSFWorkbook(is); + + CellRangeAddressList cellRange = new CellRangeAddressList(0, 0, 1, 1); + DataValidationConstraint constraint = DVConstraint.createFormulaListConstraint(DV_DEFINITION); + HSSFDataValidation dataValidation = new HSSFDataValidation(cellRange, constraint); + + // This used to throw an error before + try { + workbook.getSheet(SHEET_NAME).addValidationData(dataValidation); + } catch (IllegalStateException ex) { + throw new AssertionFailedError("Identified bug 53972, PLV record breaks addDataValidation()"); + } + } +} diff --git a/test-data/spreadsheet/53972.xls b/test-data/spreadsheet/53972.xls new file mode 100644 index 0000000000000000000000000000000000000000..5fd0ec91e1fa361d6a167c34c97e8e7b2a4026d6 GIT binary patch literal 46080 zcmeHw30zcF`~R6?fMHP%#2VBb^g-kl+<~Cg9GUvFGtX{zp2UPCzn-N1OW}lE6do z+8>o?2T%d*0aWLX05!k~;0$m9xB_YcY6IK=Pyyxv@C4KWcme7H>H+Elya5dW4FQb+ zjR8#nK7ghG4WJpIIlvd-2WSCk3GfF509pZB1D*l|0)ha+fHr^-Kq#OsAPf)=Xa{Hy z=m6*lcpC5wpc9}o;8{QyKm;HX5C!N8hz7&}x&gWao&&@JdH{L?dI919@qh$CA|MIS z8;}f00rUY-TOjBsdH#P{9g^!^3Jqo{lDU1{jt{-wQX1Q!A=Ob4@KEd6SDHWu*A`gEgDRKC4xe(JH zH8+Cg<4WUY?*S=fa-IlN%5v~rV1;M^@>d|7ibFhDiE0vbNAI(T))lgJ&V!cMz?1RQ z5&4T{|D*YnyyA#yI43n)v4cHZ)%1YlDU`wif#;c$eW>~jcg8LN2C*V)^HBvE#oAGt zgu;VSCbBaP zCEgTxk65bphU_M^LN`tfH%(3DR#*)6Vc(mCIx3>M7U!V9C5@J8a}AxL^fV68*UHeE z>4g}El3R@7^%xooyuI}$v_L~5e+w~`7#SkE$VCNdx+UenH_OPY=!*6qKKzKPYH4T&GAMl{b5jhW#}{ zDJ+P+Ps8_tenL_%P~_H0sE!~x-bdxfR?#v zm1H%QgbG4lSGI;eTm&!ouO+`e_iFxu!q{D%21+Zsof^W^oBq$hqX#uhhlYpd=o1%z zSG$w$x= zGAnSo&GGPZn&;q`-Sv;9H zIDPRuj|ueEz~7;dL>XQq#y7MJLC>3s_@ms~0I~udyypb^0vxf9^`0*3z800Cmmlh)aD0>l)Xto0VmLlH3|0*tLG81t*EcWoI=TZ;#vXJBbMLg&W z^&-?44f4#@3*IGWrPS@@e+RUszhth%U{Be9xw1?&&!4S8bcq%6ko&}_%xwYlfDpNg4cjaL%mD# z)#F9_Bu}2N3~$KSgicNR0v(u5KnKmFOkZF6@=EZ6-1Ox#;*pS?9`A_9G&{8JJEGnS z^d)!``AG1bj7Y~7!$DqOqWWuOs zJ_+w3^bdMHG{#p5`RegPJtBUY*bfN(Hfm6yBf}f{F_oJWkB@SddFb2SJO}FEBzQeP z0$$LQn(-xgOYwzvq^hSO`jYtid__FXWo(6q(7V#$UO+lU-(to`Z^xxG&dz8puFHfOa>`uDSMq)Y4o?3*a$svg2j%T-T8{=j8G~sB8V~68NAf<>5LTq`1rP5BjQZ&_ zM(xGM7|M?b7z3=#yxpi=9mL8_@W=z=tA+MO-`5HN83_jCd%re}1j?ETP{1ckfF9?` z5|99_vJ@pN14+Qnav4;-aN0~Nw_t+OXv)=cA~fsz2Z&JbVI(4#Ch6W2u}(_)*j)F= zkq%kTl{DCDu5va>g{>x#3kSXBA7Rr}!tz|9>eh3WC!jA?Bb)HZbyLnJeZm^0StEg< z2yMfxOOw8Lt>!9clRi|fCXlnKL4rTPrgdpHdt9z^Hk&_b0{RfPS}u7Geova9#p4pl zCD#%O9xFNikt1m?aw7hJjEMD?9>7`WeI%(BMhr~1_n^+$ZDq$Q&{-HH&7!xE z-YHZ*x>}g@3&9dI4VIB)^3*TI&#wCHA%O&LYn#o3tV$+pj6iFW~t+4vJSRFntBzoYCzU% zZRY8pZ|lsKpsu_G?Q3S!)=D-pefOPxEYYsA@#e0T6r-_`j8O`yt zLRzXhZNpB@pDPGQo{f(@8#9^{U?m%g=EzAmm6JB3Ie}J4OEgDLS|cZIMsq@}kd|sr z+pyUO&X^ZYGkG>H53gsE+^DVM#y3zd3)FwW%(HdjUR=QzP6y~v_v$g5DnrLla-YoSv887v9&fp~* zgQj$>+1B7$3y#PJOVdX}@#q_jztE*RCUQl?Mw&Ykau$3dSAtLEO7P8As@PK%cDh+= zjVUYkcE}`}FO8+evE(RjV1)zX2FT(%U?Yn$u7(Xnk386rCa6M%G%aOmR5~@%jKDI< zVm?Mp*Ds8xT!Jecks?@@!cpg1BZX;Rb+K&$Hp^~hMR{ojX{Ck5qcwfBWu>#!&zX`^ zw$r&|J$@P1T~mD*@H(e;@}nX1K47N|Iv~E6#46OQl!}E^IDxxoWF(z*o>+}v$g8W6 zjRFyxs)+^3B0LuZpM#8q1^Ba-G_Q*f$L9(Qq1K&DNhuoYRM;Ou`vx+=g)l-PF6g_J zYM!3KvZ&;>G3tgrB37H0kyDVR!N^=zKX&e@pIC4~Erqzq0%tTLr#h{TtsRoo=;mbX z*m;;qEp&BUB&2MPDqY0NooB%v5e%0SM0Y1=$I}c!>hc73+DTKRkCUgaV2 zk#+it#^|3Dpe9t(VkissJ4WrJFKMy7i}B5FXb-G{LFCO%dBvJ(2N0u1Mg4~`jYN9? z4C#GBVX1bOdZ=j%#Gcy;1fGI!6$Zbf^W9c1$&b) z{gODMlvi-BEYrFmoydzUR$Imoddwa+_ ziFXX*Co+nRI&#JiDrjS$oYFimGP`20P+D;T^&mo@8DUCE>4NUJAE*?gHHe*vxxNyelOVL|>i%rH#6mC= z?0Vp$O&3FX0aC!$X#NzB;!xj2TZNv6U~0}$|y&cL6cH5+05b3pnqP$SVaZfxpOCeDp*yOj#Y(a z;@e<9+YdUKxOBj?O!)UxFALSCiym>S;1{70hYTf%L+SP-y-rufs^HgEAuZ^ldthOi zIu^EnKk$f6PzA^Y`OGRdZ{9rYs>@_yRY0Kk3jS8gccOi{Qu-(JX^(0_?89pjr~ZAs2cofH^q1|X6hqBW;rwKQ5@ zT26k3wiL1IVI8}*SS2I!5z7k;riEC|h?b+2R$*RtPKFkdnqaB3B~pb3wtO*|7Glw4 zhAH=jc_Rw+#5CYqh(;4#Oobj)bg_l`+GiBp=Z(o)4UBTc4+#g(p_3pb>dK_SLX9Gr zBI(edG%y$J$b%`a&YXOUigOA|(~7leD6ThF_)BEsBH^&42vM-D3>5)JTO*n`u?glR zf-6lMnxV}EAy=#zAwr)i)BtQIy{2H-(BLuKeRCM4Vh%S$a93cEg-(it3cti9m6f0w z07*Ge7(ItEmz$pW-2qKgvsV;RP=cL`NZcct&n*z6PeC<$AT_2u)%URT^?@*(j}R)q z625eGJpf1WTRr{bVRjsvdt4GiT+CC?ah)f@QRJjvb}CvaLg;2}{M4;=e#28^M6ZM2 zfzgEpr7&!!_8DEIEg2kKmY?^*>t7H1JjA`*y@`)14{bVG{As|7lLz1KF{(W9u$%X# zkAjBHm=Nyt<+)MUHz$3n4l4C^A9}Fr<>%MTxVW^o_w3t!etLdL_QZ_xiz`>%`Tgfs zTTZkNO|q->|KN_(>>(#k^t=4CS4gX>cl!MF=F^?MXXnlEUH-kJ-{_q3#;;s%*s0FW zv5}L1*c9;dYj=0YF21$<(1`o3U1ClweW`L^n~RY$=-TPTy$;S>)DxEf za__xoAFY{o|NNXQntBW0cli85bi~)$=SM!fW8C;JCoX@tg?eCF(WGTBpWc|dHR;=B zoezXIS`oV`WUi;%lv9aYlh<_3`1VWp!#%s54j<|_?%mgir=DoK;LQfr?cA#xyC*6eED0WW}fPhz9pdB&~;z0 z+43ukUfeKh@6y9dPM^4Zv9iO#b6&?5^{O=>aIs^psoDdHTxy-%#cs~hCMs&xqd$$x!3AK zw`)(ebXImW&wPm6lw1!q{j-?prp6&*TPQ*(v3-3&Vqv3hUORkmHR=9xVY>gwhR=<7 z|KvvlvyXKDXyDO{WzYVa5VmFg!Uq1gYHfVZ&o3rw(9F%lBO_Pzy^!1`eyMuu(X~4l zRh_w;(79l-XJlka_O|sq?)|Xs-0xxIe!aT!;)1uLoBLhv5w>#38r2lPW=#)geDC`6 zuUqD~SNhdWn6%*5gz(B%uYb02^{8{7OzrS|%+T?XU0z?bxj{_N6^ovFs_lfdz&5w% z_}whn-R-ryou}UVDyiD{P^0y8kM-1+x7ZWzlr%m)>E*2Ox0^+kuWozttGT1RJGbn4 z^_7{gzS%dvu~TIepFZunCTJHql};HDRxx_ggO!QXpRe$q=R735a_W7TzMIypsXh=l zj-XOv^%>vWb$#vjgetD>@#+ss?}zUU3H_m zu3e&|+IyW^@vir+n4qsVdPh{h?ZRqh^#4}%UQW;M9VY}9TrATB9IsOyKfYJt^`w9+ zlkN&$Im9#&sNh=f_Lu@AaMUTW05f zab5M-Ya{MI{Mzl?!o(df-Tzlu#E^NnBF5eOHZfxCRmZOO2LfNZb$@p1o6nBE^~K&D zV{f0dJ6EqPY0|x%IKNNhryuGv7dCbmhvmK|e-WD6@b$9=mu&GU|gRgw>#l-m)i(Xpe`T4^hZGTM+ZmIpg z%bv;GKRMlTc-PZa%MZ1?y}WdD;d8q~OJKnWdq-wO4O9=z61Q{mX6}JKi3>ExPt#KQC3L&&A&-JRLq{ zZ=H$hOTOwdeL&UCf&II6@qIbPW8Uy4?`aOF@9KEf_0>6DsyZnj1ld1qIcevpS65QhI$scrW*dnaw+Yv^8P#>>b-$HA)-$sq2Q)cT@I;j~;wF)9bfQZ=BCR zUEpx~!zuTtUfJ_r<~H@cHhJH6Dw}oPW98KQEw1KI9(($&O5K>rL;8GO|J?kn)!v_O zI6L#?woRu-?{(>L*7vLaiSZ3SX>s7}z+KAl>${fD3!9vf+<5n4_1LRDCpk6#zWC|^~<68ae*Os%N-`Km?H+|c^Q}xb|`}=PGpjG=T z#Y?vq)pBrYpO#hmVuUJi?dKn*Cf2&rWdFXT+Xd-!CVvrgeyvmQA2yEg+Z8=D`jYGX zlOHTRdAU{il_ev;`C;GvlY#y14j*j4Yxx%!9t@auY0zh{Ww>`993R-~M7>^zdWU5n z?RQP#Jp4P??nQ?uE*b6|HT$JDQ%-rWnbx&M-tjjFOnWCb%csMG0nbnTdYZlc#W}-U zFaPedw(CN}*RD(YDCV1t8>y>Ll&%~6n%$e3>lW9|Z8WpFZb4o5VI4MPgg1Yywd0oX zw?A1wV}SpqI^AO0H1v5(v1m%U>v_k7jS2?P;jlTTr@ehv7`DKIa z!RhJqx_7)b@3)aH*LHO2@NoHupLL$Q-|pPjO^vP`{AKEze@!c1v3QRztlynt))1Cfv15+~EzMrusZuKd<;@JMF_jZmrQ)%ZF z_5PxQSsN9Vo!%Jtb4lN*%8$-2n{(~JPZ?hv&dII*kPpuyt=p z|La-Fn;pCU*0jHFrMl|jkhkg|?Q(AN*{RjHD=)i6^-VoIxK`WP4za)Ivfq6=WzX)h zYTePyPE8NIu)Tlk&F&i)-19p1-8$`s@`QEM;^%aFBV}6s9wYaB`1!^r17q98{95|z zu0sJ4lNan<;5PVjVec_FnR1)m$B*h{?nwC3>&>_(%U|A=aiYTQ-BXDzZ;a1fpRgn? zd{&F!Gba3avtz_Kueg(*>r!L?8MH1cH}s9{iPZ~#IaKYOSr#;`-`8Es?&h8Ex@*5{ z&=&Xh^@nw_zgZrb`~7d(j%BAaR-gEEbMZU<|Ctpqa93G`_U!C$*3CIpc_G*CuEU)7 zE}lr47ixd$fWOa}^IqQ5hdg^^T-vuERTU(UyhbZHYYug4eLHi>CWJJ?_`qNG5*3C$ z{Ix0>2k3`E@y@$Kye8ZmKT2I#c;r*}*IS;Ma%lBYy9t-t)oLH%*Zca7T5AH;!IRUr zSLJM(|HhYf(%YU5&3?b3`k9~R4qy0L{^sk`Ba`bTyn3or#)mJCpI+GEM%}E}dj-U| z^h*v14qZ@O+rQ`R#fPT$xnHrS8S2A06Uua&(A` zlB^uUmli!m^k?jw0rdSO%zr3hMRDWL9{g*}9bY>S-n(@;erQreD#y3x_^0@NJjYZ> zzO`DwU`1bCuOQ?zd@TtF4ps8l6ZpL)VrO#qLj>&z7oP(RRDO(TC3%i#SMli=iWz}m zzB(ifzXH&g2C6?SBCxawS}&cLr54jrMA_g9jkG7eUxQe0$j|IZ!O z4LSOyZ%Y0^zcQDU+@tS>Cn=09y(KTL+{LG`KV9@I#yhF}fIhy>I{FeP_oAyi8`R5= zWk*weicTz%=x1y~d7E+}A0v)ROEMNNUUD8NriN)(8rk;zH6x3r$T)oEalZHHDKg0LihTvyLzm{dwI)c{LX34<>-CMm7B zG$$<&p4gZk2usV$(`ImAVrC})#mqp>fY_uYGIwc<;|nvic?oIxS{9p>8eN!ISezP{ zR-!HLsVz00K z_8L8o7S_q*(YY`3cxp2^IxRvT&(#dBmKhwKSRqgAZU*OJ23JRhQz#uk3zB5?M5TO# zKT+A<d#KBT_0_y^@A>r>~p*441 zhwTG(bTbxp0^93Ns$^avs6aPn$5+p|G1bigj(56AYhUC}$((sQs&snz4;p<&sU&MxNhHfAD3OP-eDE8VX2FS0S) zTe2|=#i-^sX7Sl*W3HCin5!fHd>b?AmeIx>h*ftAv@DyAnQFpjV;1z$cK^>LV6!nx zO~^JIv(3i*pS34jYMTUX60k|YCV{`71Z+0uzh9l&N@SCOO#(IvJgEdk8?)ZB2)mTt z=F1L62(%7iAJ^k-%*J(rrZ(n$|0q~iaq1b&k7UDU4WnrLH23p;pYBG#9W1ZR!|12A zuB^7vPYa9voT4~WM9&Eq`9=CLL3$1yn~DK@Z^^Ixj4R{f`e91#~yKBV^#V%q$NW54E$#5<2WGB zKiEQj9MT#gP68XxhU?=vn#3V3GR7&^$5ETaA+36ay$(oZl{k+?;Ms}CnXZ=$wZDHb z!RHAa?R<9X3Wk{dcQraY7lYmVEHVOQ_C19I``g_-}t#mdC*d$<+z#ox-FbPFdJHmX)pF0WV z=OAo!5GSE#sbXMtluSao#uz50$QHTDH`)+RHpxxSMn6qTotC6`K+1f3BRxl)iQL1v zhatThw!VBvV>nG(ZE`mH`J`2CWBxR0l`jc*#bGS@2p9P!gD&~SNi;Vcfh&#g35%*U zybg||l!kj@n};;KE)37o@CG&}OZ-Q+DQhuAk z&b!IQDE~H?_V9BuZag9Fpt3MbbQmYyLS++Yq!ppEi8zvoJRaHcLiK-PDo&=sRu0@c ziq1qF8LmTFYi{-<+;$xNPp&7wy23a339g>37c8nxKqZjtZxXg`+4GJbRuE!%^?KEEQK@oSNMC4_y6m1VLXt6)NUr z$u&jtEXB*8-SqLOWG&Gynz1=Jt(kzXIkJmzAzYFq@ou>Cab@9%4;(*%qn5L9VDc>7 z=_&#&(?1KCEF97N9OBIc2>Gdy-+Z=!gK(dZXX8aU$}gKwL%hI*YlQxnd@owPM&OSH zgfxQ~U35ae<%{w~k_12zuIsECb+5cxjWUPmr&LJQ6c7SUsqDk^AKs#a zG^CjneD5mRd;#TiHIqVItSHXC|qaOpLd?GU`x(|)Z z6?d?6XotcboPW-r?UaOxzyU{gY=@n2^s+lYPM5Z$RAW}47!+68*)jTaN{^ekp(TXl zoMcb*4EPi7NXk1>9YH*yZ>q-}0*BvrD4HAjisNr-hmU`_g0?CN?mD06sKse)QlMwz zZBR%j#OaLQjKw5s5)%7plDowx_U+c0r>+a_txd=Ha@QDBX1u8)e@rVT7Y@}Hmuix5 zwn#17&9s#!Iaws2GpYs$f?y|;d^gk3;wT6Rf0B%gxX|xyB7q5S9EE~Vc;=M{G@g`% z!Vy+NEPiM;j|FCk9Xi_>m)*ZHUDa8b0eakY6=h8PoLGiG`dI$oo~{zl;^yiY-O=Yz$O8k1paIZ*ru!gY>C?F*(6|-fK3Ab zdlC@$Owo=e1uS%b-nm>vuSYF6!}JarXlG%%M4av+i{oie!OxU*#*}EWBzr9FF(L{o z$yCX9?6M%-8~n0^5!(TK1jtEu14K%81CRywiFX4ajkp`&uR2|dGyVVfO{{J*KR?33 zTO@K)4YGjKo&wsYLwMSJL%%ln_maRP{8xfK=4j-O^rCv=l7HS$%ywV(x|%)Zzy4GR zaJvDd7Ze@~piUwQK)68w+SpVIAbnW?pbc5e0W|aSA%M0zZ3R${mynp|gop+?dPb{f zQ3d!%$WfYv!jU<-g(C$#{oP%BPI_@+NnvKGCO$14=j|7kWNW&W;h#Ja773`>zT#nI zyMqdPW`nbwZXDkuJpZeydlc}b<8o)M{K{hojx7#uRL*PwZ5%8DQ2EOMB#-X^V)+H0TzPt+E&lp|FttgFpAstkv=x5Bgr9Jp zw|`1o|7QFT22!K&*P41$ZR{a*kD3Z=lq6FUWZ6+6sYQLDm^R-S&RK&5+2{2J>V|G5d|Ok?1X_gGzXGBZ2U>>vJL9Xb)5Lc9leWOtrkH(VfSyVsO}g8ykoK6Eq@+aHJ3 kjPMu??Y5Klh>wZRgK3fybEw2bwH{+ILrKOGITO8@`> literal 0 HcmV?d00001 -- 2.39.5