diff --git a/itext.tests/itext.io.tests/itext/io/source/PdfTokenizerTest.cs b/itext.tests/itext.io.tests/itext/io/source/PdfTokenizerTest.cs index 8b27dcfc22..0aaa4ab926 100644 --- a/itext.tests/itext.io.tests/itext/io/source/PdfTokenizerTest.cs +++ b/itext.tests/itext.io.tests/itext/io/source/PdfTokenizerTest.cs @@ -57,6 +57,39 @@ public virtual void SeekTest() { NUnit.Framework.Assert.AreEqual(expectedTypes[2], tok.GetTokenType()); } + [NUnit.Framework.Test] + public virtual void PeekTest() { + String data = "/Name1 70"; + PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource + (data.GetBytes(iText.Commons.Utils.EncodingUtil.ISO_8859_1)))); + tokenizer.Seek(0); + int symbol = tokenizer.Peek(); + NUnit.Framework.Assert.AreEqual((int)'/', symbol); + NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition()); + tokenizer.Seek(7); + symbol = tokenizer.Peek(); + NUnit.Framework.Assert.AreEqual((int)'7', symbol); + NUnit.Framework.Assert.AreEqual(7, tokenizer.GetPosition()); + tokenizer.Seek(9); + symbol = tokenizer.Peek(); + NUnit.Framework.Assert.AreEqual(-1, symbol); + NUnit.Framework.Assert.AreEqual(9, tokenizer.GetPosition()); + byte[] name = new byte[6]; + tokenizer.Seek(0); + int read = tokenizer.Peek(name); + byte[] expected = "/Name1".GetBytes(); + NUnit.Framework.Assert.AreEqual(expected, name); + NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition()); + NUnit.Framework.Assert.AreEqual(6, read); + byte[] bigBuffer = new byte[13]; + read = tokenizer.Peek(bigBuffer); + expected = new byte[] { (byte)47, (byte)78, (byte)97, (byte)109, (byte)101, (byte)49, (byte)32, (byte)55, + (byte)48, (byte)0, (byte)0, (byte)0, (byte)0 }; + NUnit.Framework.Assert.AreEqual(expected, bigBuffer); + NUnit.Framework.Assert.AreEqual(0, tokenizer.GetPosition()); + NUnit.Framework.Assert.AreEqual(9, read); + } + [NUnit.Framework.Test] public virtual void GetLongValueTest() { String data = "21474836470"; diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/InlineImageExtractionTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/InlineImageExtractionTest.cs index 0a03ac0bf3..a805497e2e 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/InlineImageExtractionTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/InlineImageExtractionTest.cs @@ -99,20 +99,17 @@ public virtual void ParseInlineImageTest() { } private class InlineImageEventListener : IEventListener { - private IList inlineImages = new List(); + private readonly IList inlineImages = new List(); public virtual IList GetInlineImages() { return inlineImages; } public virtual void EventOccurred(IEventData data, EventType type) { - switch (type) { - case EventType.RENDER_IMAGE: { - ImageRenderInfo imageEventData = (ImageRenderInfo)data; - if (((ImageRenderInfo)data).IsInline()) { - inlineImages.Add(imageEventData.GetImage().GetPdfObject()); - } - break; + if (type == EventType.RENDER_IMAGE) { + ImageRenderInfo imageEventData = (ImageRenderInfo)data; + if (((ImageRenderInfo)data).IsInline()) { + inlineImages.Add(imageEventData.GetImage().GetPdfObject()); } } } diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtilsTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtilsTest.cs index 0e49cf4756..61dcb64854 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtilsTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtilsTest.cs @@ -21,7 +21,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ using System; +using System.Collections.Generic; +using System.IO; using iText.Commons.Utils; +using iText.IO.Source; using iText.Kernel.Exceptions; using iText.Kernel.Pdf; using iText.Test; @@ -29,6 +32,9 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Pdf.Canvas.Parser.Util { [NUnit.Framework.Category("UnitTest")] public class InlineImageParsingUtilsTest : ExtendedITextTest { + private static readonly String RESOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/"; + [NUnit.Framework.Test] public virtual void IccBasedCsTest() { PdfName colorSpace = PdfName.ICCBased; @@ -108,5 +114,60 @@ public virtual void DeviceCMYKCsTest() { PdfName colorSpace = PdfName.DeviceCMYK; NUnit.Framework.Assert.AreEqual(4, InlineImageParsingUtils.GetComponentsPerPixel(colorSpace, null)); } + + [NUnit.Framework.Test] + public virtual void ParseLargeImageWithEndMarkerInDataTest() { + PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource + (File.ReadAllBytes(System.IO.Path.Combine(RESOURCE_FOLDER + "img.dat"))))); + PdfCanvasParser ps = new PdfCanvasParser(tokenizer, new PdfResources()); + IList objects = ps.Parse(null); + NUnit.Framework.Assert.AreEqual(2, objects.Count); + NUnit.Framework.Assert.IsTrue(objects[0] is PdfStream); + NUnit.Framework.Assert.AreEqual(new PdfLiteral("EI"), objects[1]); + //Getting encoded bytes of an image, can't use PdfStream#getBytes() here because it decodes an image + byte[] image = ((ByteArrayOutputStream)((PdfStream)objects[0]).GetOutputStream().GetOutputStream()).ToArray + (); + byte[] cmpImage = File.ReadAllBytes(System.IO.Path.Combine(RESOURCE_FOLDER, "cmp_img.dat")); + NUnit.Framework.Assert.AreEqual(cmpImage, image); + } + + [NUnit.Framework.Test] + public virtual void BinaryDataProbationTest() { + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI S", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \x0Q", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI Q ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI EMC ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI ", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI QEI", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/ EI ", "inline image data"); + // 2nd EI is taken into account + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/ EI DDDEI ", "inline image dat`ûGÔn"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI SEI Q", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u007f", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000pdf", "inline image data"); + TestInlineImage("ID\nBl7a$DIjr)D..'g+Cno&@/EI \u0000pdf\u0000\u0000\u0000", "inline image data"); + } + + private void TestInlineImage(String imgData, String cmpImgData) { + String data = "BI\n" + "/Width 10\n" + "/Height 10\n" + "/BitsPerComponent 8\n" + "/ColorSpace /DeviceRGB\n" + + "/Filter [/ASCII85Decode]\n" + imgData; + PdfTokenizer tokenizer = new PdfTokenizer(new RandomAccessFileOrArray(new RandomAccessSourceFactory().CreateSource + (data.GetBytes(iText.Commons.Utils.EncodingUtil.ISO_8859_1)))); + PdfCanvasParser ps = new PdfCanvasParser(tokenizer, new PdfResources()); + IList objects = ps.Parse(null); + NUnit.Framework.Assert.AreEqual(2, objects.Count); + NUnit.Framework.Assert.IsTrue(objects[0] is PdfStream); + NUnit.Framework.Assert.AreEqual(new PdfLiteral("EI"), objects[1]); + String image = iText.Commons.Utils.JavaUtil.GetStringForBytes(((PdfStream)objects[0]).GetBytes(), iText.Commons.Utils.EncodingUtil.ISO_8859_1 + ); + NUnit.Framework.Assert.AreEqual(image, cmpImgData); + } } } diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/cmp_img.dat b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/cmp_img.dat new file mode 100644 index 0000000000..eed4ff54a0 --- /dev/null +++ b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/cmp_img.dat @@ -0,0 +1,234 @@ +J3Vsg3$]7K#D>EP:q1$o$N>iL@So+\<\5,G^LL-NjE<[*IE5[a2RJa3-XFkqZF,@n9eVk^VFc'/enm@9:1mM9jS"!dTMEqb2!l#N8#0#toX2(aMbe':>ZE_:<^TriioWjnAY&^gM+`4=1jRLW!YA=M/6)*KS9P +E`kN%="Tc_Aoh+fk'&t\ctIN)4XQLiVpoI(>.nOW?*DmIDOWebB%lA%.Q9k7iBquDi!)/,DC66[a5h8d>eXi0S^6MAH1IXb_>kP+oS^^pnX!PjdJ%0OEX9GI`IODGoc^+5,t$):"t/5eh:9Jl%POR,+@ +`"_L`O_e;>`Y"/@)9.H\bcnd!<%/i[Y`*t?_=A"g+ioftN?cOX9U-pGP&-[:aqBZ0.E[gS=!,Tp[!7W\AU%]<`,c@+1!Gh4biOO78m5==1Mkl+c4c.P3R3haDQ_#7bdP"(1[=9V:_X?B6-tiJ%7AMW9bg+EP\hF2dM.T+5>m:/p3KX>AMl9mPjLV0e.-I+ +;9h$MiB#L(9O0`\PKVQ@^%AEW8QM+YD-PU,c#m=DQ0j!,fG4pM7TNISG>'';n=`\3Q>N1*`,=fY;cL/)X]3i.h-D%%#lTZR=Eb4nESQm4c#_\W:"=CBQYkO)>Oo\eZ9)OOTmPZ5c1L%JpZ[0Wg66Z_J^/G][;ET8mCdbf2gud&iY[\%M;jo*/W8X+c8<7DOn7@"A/F)kOlVc9 +^)3Ge9rW_UOd6EWi=ABl\7;fC2k/tJc?5]@RI5KqkSaqa_.Km.go6f/p6Cg*RVnZ.P.HZTQKjTM?E@`h?=o5]Z1`sVll-GRZ0[r4c*QdV94+j1X)Q\"l2-M&\[hfjm0auaQE.^=g:P\4]pdY6[Q[ns%E%]U:DLk=S8TFgf6efTNuX[jXpsfhcS`t!`K*0qDjmR%^[MUq"i9b( +V]jU`SSqfcp)T3*g%L@P;VEAG)%4`6SaN"$GR)9CiV7X.NR2c*^IGJMX!^]GG3b3)l2%!TXm>j*caE/eQ7nhYXH?a[(jFjjc$Y/Y8_n5u[J@\l>l1/30nrI5r@g2*s$u,,K$Xi86eHe2?pm50OD'3`.#ehkC?13`/g`hCM%ekW9o;e+&1]-B=Tc<>Kb82T.F?BWiFFU#:Vn!h=76T);l"]Cl3bGMV]4Wc;2u&?-q?8a'&]:(O&>p4,e6EJR58t$Dg@nPFUfd3[gC4%QZZ/2mn@M!L*=8E0+>M6rbo!?HAt;Pg@F!Pa +-RLtXUI7F[c\\2^kS0tk'TOHc$;Af\,k7Oc)6K0C92"JS0qh);(/Xd56t7e^::+$::?`!QBh]Y?P\Q9/)Su+\9M.S#P# +nRLp>Og7M]Y.o;!=6gReVmKd&=3Ea3%.0[o;)lnU4&&mbql$mqY#O,<2/=>rCUOq_f/:0QCQ?/sV)R3o#s(Uj'5Tc(JAFje.r],,@">?eX^ia(ER&/Nr*1?WLZ($;Xljp4-Ea)CF"M$FjBia5n'ENVb+Z54tdgrGCqTu8t&24!oC +=[-S=2@6ut-O*(f`Ii,_"i9t'=KXb77P@3=_Xrl^5kbE009.3Od0I7JqCsq1.B/E@1&?)ob]u"CjNsK(690K%Nj>A(t^VEV!M/Gj>dE4G.cM?+OWWZR0-4SJMq,-+L6F'P1NKnSr$8`RdHY.;PcBo)o'5\VAMlN6.LBAj"/D/Tlkb6Z^DVeBoV-+dgP_ql;U +AT'[K]l_iL_OEPKmqCmkTJHok>RtZl+`kKdD[GB'2\Lgn*PkLE.2R>^9PuH&A+qV<:&/[9A__jO[%?aI'5Ml64WhBu2;mR7>CBp#pm1_L<3O\Q&Lu`Cc1lk:*.7*uF5D>kq>g'L>n?E_q`k?MT3H-u=LlgqdL>P-fKl=eM=hHOpGmU'>hIGX4KoQL?5 +hb386?d,SK[tO]DTCr25h>>AKSc&35pO5=7-b1dIrnfs9qEN4'O5U'lb4Q6VOKV\J.iJMO'_`i8$]lA%E$4>iI-=2.)\!ooLW&CCP5,6P*'"Rt4U_jDn3M[b]#"7SY\0M)d/9X:m!f+:nhcs5uN!t)n*$aC-Kd0Mn=[dqf^&MY:50>Q2!9bHC>&Fh==:n#Rh>5aL('(J*k&N]rq-PTE+__@rDaZU?=d0gOV$5$JUnR,AD^<&!@FQ@HT&TJ9_O;:]=%8\2X +J`?E3UDH:^A-!tn&FBtrLCZ(1%r/]eXjI[@ZOh#t)Nb[K0sFG.<+_)=&WguOEPVJ!,2J2@*$R6Z1!oI<6O;&%`UV\'1#R0$hZe&.qN9"N.0TZ!h]D<)'T`h3dH_i.i>,o<$no[b5dMUgLcE5_+gHFgOQ[4<,p?c[T]!F"%XT'imhq3W)9Qq;#h'\\=W5T',`o,N;GdU[mh)`8 +-'A!Lmctj/2&rmG,r0;P;:cKo2]\'&-LqB_E/>\mK-h4Co.a)5Eemr)=HLp9.?])u1'fTi$ta"t7;?-3Z5*VL[3>%k%YJj<&h#a()?j"m*`=j+&ifZl4JFSrP7g;0E`DO+9aWYJ*AR@9cNPs7P:pdD-;\t7Oi&fVitF%,-ZX=uZNV`IHQLUgoWn8;On/p9q(^s>.<5ABO^Bgt +4XqZg.V9AX.]=8K_?.NX1pXY.nE:ch;.D6K^DkS416[\3d!HC"V]PG\.M@9RkjT7$^3P(o0"NicmYSL1iA@2nf\HoWZD./5-n?NMZOR@@3[R=petkl'%WTdg6bf\7e;#Q +F:SU4b7aE#33laJF2($raN7C/&oqbRF#Q/)F[JpW3]&PtEsX78SKJUm&Q9o&n>es^.j*6Z4#BGpn:s-d%51X0/7QE(JB]o]],2$G"*Ar]oRTNjSOdhi!l38UoRf[jk=:U\if$RRN\7UBhW%?i2`(k(Ec"G@[7bVP9<-#[dg[T[]hE@67?]qVdU)n%a\?m19si_NkF53d+gY'&k>HFO;R>OX2).V=GRi5\#1Yk81kSA\I6Y(:8ee"Y/SM]Ek>,sC>BLQnl?-,Toi:SA,m$"u2/-,K[jKU2qUA]('m)RgAQX)27Z^VMl4*O^?'p+KVX@:KnS>F$44p5`HZ;/%lE>jo!r +U::q=V)2SXC:3):odO6iJf2#-?K6iq5uV-5qY%>rlEs>ciU(#f,@tuJ4Yu6SU.--rG>]Tj28Q")p@&oBol"8YDkUl`iFd*g"_p>&.5qYa!C:]LHkA:T%2U%)i;msX+*)QB&L)X0TgNen%efW#F125/iGsU&K5Yr'FJ5=6+h/KC40W)Utj\5Fa&%T +GIN!EQ@4!:Km7fuGdiZWpQ9\InTKt]@PrWr!o,>ZE#c+DDrG@V!c)h^,S,k6Hag\8i:[Zt`)BaY%=l3@ngk-7e-Ym&IC+_8^k$qnjaMF;#<1uR=7Lc!om[UW"IK(:p\rn/PQTP=J@40Cp^r'-jp)^eJ[abJQm$megM3CZ!Pl5i`nuCkf6fjQ%p1uIpd'Ql]5h%Tn.!b7/PZ_h`>#Bc(/afKVp9*Hn^ko'*+-ahN]mV2BMsMR]dGpp#`#0ISokMkYWB#.&!n_0,k4GUFs\Q?FOIX;Vr.)0jtZ=%.Ge4`d;mNjglb_)[Q#LQ?]TC*>*\Qq.b`"cs;B&Xa%T)#,Lp%?BG29=X/(:'MM971NBlNIddG +\M85lef5OKN/JUA2!8SnE:m\O%XCc*@/Z?KZ'AbVCK,k03!W!^2f)O7l'BLNG0a.]e=@B-q1ROhTrKFW;@gRbR%TM-o!ARn6^`10F#X)G@$-m#_jYg6'D\^I3O)*(nTgC(3k'!2D7t89Fdc^T#arm?g!Q*:6?;j="P=N=[#PSME"WsQ5'aZ9P3kAc>^bRfT=O-4i4]H-"FVCS +RAn/U@"Y.41QPt4TsP#!es2'N]7r?UU816]H81#&#GY^]USqj@g*<(uZ\^L,M.U100-6RG<#S\*HJ$,G`i*#Wg_k1c%m"PO^k\g5dKM<["8XQ_UP&^crW\gJJcM/H\ri(>r[AXVPP-#%cjHdU81U,3#I?p\Thgr>Z'Eh&R,F#r\oJ(%BpPoYQL:SW/S18_J!Zu!)g^9d\1+>e +I_ID;TceuT@=buFJ#Ls=)#K;'[+U[6-`UX\N/b"t@\Oce[;,QK82tu,[X))\J#&e6JOe\H'`J,AgSL?o*=p?0A([8E]n@ZS>&,X`sE[5M$t_onj>=es'BV%au>)egia>\5t67:FT^pe2;CCW1ZJk;VrCr*a1/]t$Jo>p?Qir,FQ6YI]!\]!R$L+ZY9DRMOYi]?Z2E%\^!6$+u,D +_ZI41);^r5b-net])/\['J/3ibFh/Er2)M&06!2?^_3RsGCo&V^'#Fn55CC]S)oI\5V%1Mc+NC'qgRbp)FjSU/0$N(Ho[f2d>?Uj21.j$ge"@Dou,h:VSMbCr9k'K[="N#;>$UL=DK]SmmoOSG<`ir#1<>b!&u$(V'%dQ*bSi6Tf: +8%sSqFLs-U_k!_b"]mh1@6n,MqKLR1$spHi_:X[Q4@g+KMB^hC,*@*c?>r@-;8%EkL0CSqrh+#>jX,of7;egI'#H(ot&+rrYPCbnsPssqDoHmWTnPcJ[!U48CRahnZpftT^u).Pr3,V)[\n5gBb``7hnQDp!H_[(b+4K4WV>bS7rP%8ps#E:C4nD`f:9tEQ&(hR+ +#mGrI+4-BS/f>+Q_;Z%DPX2&Z$Us(fR+-"6*KN_O&fDCD8K1f(hbokAY$!?C9BHkbbg'o[Rk3_'\^Zpj4eGO6'H.\rM++1:kX"K4(7@(Y;s'/;Ptn;VLK3XTRakjOr3'2g()n!G<0":_/JagTA3k'Vg[5jsQ-SW4G?sYRS(6rrRD2qp(`Pe#$$a&?nJ;Fj0,]biA+B"MPLCtG +b@U8_=0?E-S^1s@)BAA+8Pml7gH(HdY6D&[C\A\fQH1eg?>]>`*S0\)^#*c'*$*a3M6l5^q%H"XS'I)[A[uHH-=YCAK:c+R7`;KYm6>3f9@[/4,:@ +jcgPF3Q:>_SHEjG>8K`s\4[\s-Hl=7Wj0D?%7bEt\:Hu0!m$Ua&gUl_M,HXu,r%/aikA"TJV,CBd:g!>0[adC\$?Y-]#HKqRklcmCt\+$9_1VBHcF1$eMd^HKW-t,F/*(6KZ>A/pdETlq`d,-[0&J:D3-VB*4/,dRnrZdUBj`dH;u-s'I>8&;X*D%9es(U3deDTO\&5GFX9YO +"I2C1F]6G9!ehR(;9RoBNV4el^Z63XDb4jhEQ@,#\d]3`Q-V4VJ0_l_*.*YQtj-s^W9d'9acc>faKfk-qTDR=7KUq2<9V5P??tb,WB$)Mfd9>E&U?i' +)cR?>9p]GZ2.r1ODOk.%./B-4NjkD\HO*jH%>bHsLj"KI+EfY\TijD0>,O-_d#"T6HD4!$]sc(_U2+Mo]q@]<:9's$4!i4"Ynq$#]SG6R`1e-=LG:(2?e`E]J7)UD#lbW%#2R+7BeiGPBtQqKQB"(?$!;sFL,Hq[RIqV=o'0%7a)cR)13)p]S(j6.>j"c#7R8N_d+-Jb +9T\Q7G:*T8]qoqV_Kn6fXs&5=NNi*2/5+YFeXqEQ@98+qkA)Q>GNU-bT]pSEEBDi0*XFn5\#F='Ga^K/A+6;?K5ZUkG<((jYV1@QX>$di=c4 +7Yn2R_Y"*O@?\l[M!=*?GG>F9q9'2N.2A2)[.t>Uh/+]N84*A.)5:(s0!C[k5)7RRT3LYUn$qNdaKZ@%dXr;IFq2L`qCH+j>=JY91I*q8T:l#5HNPlU7eDXs`r'n/m-'h:(uZN7P7.h\>j4%X,mMJmBoR'M*>U%s6".]g6c<.-_P\)B,#Dm4;H3OEGqcQo\Yb+cg)H+;)'R/m +eckW1"U$8N\`+#k*Tc4&b5#HsAX'Ne!p3]TJ7gK9[&f,-jsWY4`t]\+pm@6\@NFF[s.m$F5(QaI7ohO"SkYY#fBYG>Vl8._K\7Nl8,&+Ug+!+'tKF(?Ak +eErI*/e_'E]c>&i'+Ip*\\ptd/La[MQ32`*7RUr@$\YOWPh)=&601jUeN9[np7A,ab>;pg6`=UWF](F]PP=QP<[)m9?QFQs3SeVc[^LA#bULM(.FpWsM[L*0@b7f(/kL/!6*at;,5Sd*fi5Z*)4UJ)CDNl"p4A=NY!JnGWe;L20Nl".2eF!)?)G`X@keM8`KhVVQ6I;j'=3iEc+j'6>Y=Cj`aZo9h9M*%DClBR@?QW;".]:>!W.ns\'+\+%nS?PJ9-2'+MiG!M31WB/;eQTDk#X_Tc2+kl1tCAB(P\k?G->tm>.pZr;8(\UmB_72Qa5qK)J^N1S1M%$Xtd;l>G4NNRBscJ.N9O)CXBo'eRIgqAQ1d=SN(H,.a!eRjun]]p(P`Q(o/@=,%n4mAbd[4I^J=0G(]8\b$)0&TjTJoFnM_9B)/"8sSA +2F0^Jq7`tF]*KbWieiW65C;P#MiMf/6qUS3Y4!1Foo6+O@!P]b5C%n%GlJqS4,9$jSla)n:F#"Lf:/rs((!T0?d(EP14adB^@Q4ec;']fkJ"B%SQd\Th[`)c=0o(>?OM6#JBU_n4l,cJF)#QLLM],eWP\AtrLN,N"b<]V.*k4E#PjkTDO*2HfR +mh@r7l0=mjn-:n5VSLm_Im)K%hC!s*I),sYO%&paO8BA"h4U5CJK)ui]4\f-RQWa%]hq9F1Y4m:YIXG5\d?tOUVn=dJ#oe)]>5A9dUGoK&"-:0K7"U$;> +pj4Z8Q(V@[XR$o]X=F_g!2,Iu^af%C3X%Z',f!QNV[;(mKJu/XYs>#35dJA4@Z:K^.4aI9#J8k3j5:jO1:?r^#2DO/4;3Kl'WG%HLLP_*R]V,(FMs(L.@_9T]Gdpe)oCg`W]3>`lo_?$,=MtuZ[3i^'#qe-R?jco7/3CSEQbd@R^T4\(t&,0>ZNA&:4t)G_YDHlapCDg_8Od_ +3C;c$C*Z7-]#-9&_qZMm]NIU)5.tD:`f]LQJ?ZqRd_hfu046EPls$LR3(F8#2cTa@[JP:5"A438i7E:@48!nG>X10As?Ur;@[*^0Gkf>4$?l/C-K62\fQo2rE431*L86gm?CkkQ/Le*%X8=YQ.XG]W^N(D-m!qHYKCl_*nIuN0E%)cGT]EKWb&#"gWg5Xi`IhA8;(%"*Rt\BClh.SRtkOeeD/ +/B\\@ZV:^NL"t*A'*uancV48"[UcKe1Z8HNS-fC!8bC?N%*kjmR]L1B:#+C$A:ao*d7t!%8dqDX7,^a!T2$*!9O+Jj<9F[SWM#KUaaDg$`2pD;Xig;'$#Hh='XC1BiC0aM5TJiNWA%*tSkaW2"Hj)'[(M^KElU!J#N8r&RL+W-r(J*I-%s1^m!-`I=IdMZ'V*5nPfZUd`ltOL +WZ5#4f[S0UHHrJ4c?uG4+C1^0e4CA)6-E_/WAQ!C)9qB_[f*)Xs$;;E9jm2i(M(K(SH[j;AS1u]XBU.u-h.GZ2ir8o/V-I*=hTNpa'FU8J`la=ClcJ:)XeJ97&Z%[S2c3s4cV".Df:X;0\#F+m=3XJ5SpQ<\pbMbsJ;IptK +h$#A.:Y9j:ofjck`6:fOU-Ul;KLsCHIaC@":fQ/K)"7RV#6rEY;RjltN1SD'k*$4(btQ;T>0b6hM2!l"$67[F2$MAoTZtW[eI!QUZD#^[92M@R!JO]"RhSk]Us_:-dS/%e>rG^$QVr,Gec_r"RKZTh?dP&h`>_ku4YG%90;"dhdi>`t8dD2%'*V&QJ9+gTOAtbj<,GSJ/QF:)?s(ZSO\Jp(Q%@@]SCO8Lf@fJoQqK;>eZ&pU]u82:PYsp0=TpWbCo5X7a3!_:+.\j"eOiuV+PG#1-l&:"ue/-4KncJ)?_>A=K!ICRX`IGFu`\sQ`,d%__#^KtbV>RGo7*Q$Sog>'oMgg-&tD3EdV>p*-R9atuBrKeXloh"8iT+0*#"fSo*6.R7KIB$-*<2?1m+(mGQ2WGH55&,"8>766TZ87:'MlWZC8q +Pg3K-JDQgEfJS=]h76Wns0<#Q?LX]#3HNW^MV,5drh*A#`s(h,!\k4mLEP%&)d\nLKV\!atb6j,"LR9>8;Obc6+SP(8+tMhMrH-Af9?H)Q![l +@9j?ul\u:(HN=m'$928O/k=n1ngE!4Tme5d%OC&XT&4+B!oC\OW8iS@@_)_SJM:Qdj5TIPfPKna%PcleYb1nN_8\=Z[KY].-=Crf@"p]"ONL@U+!E@0;/fJY7D8sI5L\a[i:o$>.P`B-;7)N&7&3GA4u`tj8>&s%c@+:)@=8=1Hm1pIk(RYMN@T]`J7TS)"%IlA?7O6K +RgeYOYd,Ne^g/Q>Bhp@.$sn+ZrK/4lMuqQEBULK+rf81ic\ER!koQ!RQt,AA,\X?@/G]Z0XNF]e-Kn18`ca&QAt'9LB5,Kl2oo%`iI(p=TN8Z@k?als/0^aPOUPi<$G&\@K+=QDV1?`kk7)TI*NRD)118[UC+bZ_2"KDpGb=t\c?3K.p51<5LM,"&6*@D!I3R+O'PJ&RAI2@L +jJ1I1Koo,bkJEd*0R2h7^a[!UTU(Q'$<7nnNs,HD*<*ilDT?HNA"]5)kq5G>@Kl"8a(t(IBS?e)5#5c@S/#Q-Bt7"'aCcVo56YZ>/c4;R^7oIh`+h#c+J,Bf?DX)?7$N3BmFhlR80/^6%cI&];tujdRPFp3jD*Oom%puLSXPM7Yb.etc;q7:1>ck>(h_UglYbm%m*FF66#2RW +/RH%W^:ZoNL*;;,Ct>4q?GgRt"mdk^CdsJYQB:QYr+N7SC)3u,(<[h$bYUp%jCZ\N72+bL:[J1BD'%+=B%(Ta5B"]5m;=ecNnA<\\a>P)l:"lk?S1Q.&4;DSCMdcF*)sk1td\9X:IIl1qfH'QQbq:_COK7e4Bu +o>K5PTml\(*p[d2Omdl*DjJE3VT!J^`cB*S0n0(oP`Gi`(t;UdTDnoVpB!2V\*uPl9kBh]=\j!L#*8K`TDm@3)'s6r"i)2gF;j$#-DR5?g4t_"nHNhAEj(2&,Y;V^A-WfP]c_lH1+^`flK45sj@ee@#p>QS>brb:hR%:f([fbXo^q3YN6d**=P!AOE3]37n<3CEHJ=+K"$1R,l@c-:$u?enX!;HV]-]g;:Y%kp'R8Va&MU/f +2>On7H-,ROhY(AR3.&pj0R'40?_[BU4aKV=qH#EG63$QnVsT7_qOae^O*Qc4b3oZ5FLgs[&$XO\*X+;S44CmB?Pn#0MH"em<7q]$;om:o]?\c[sa8145bqI,,p&"83^!5cu!5EIkmRY.>r"0(@ca4Po_8iW##f9E.-sjd;,V\gSY1(,q_opMM&B%EaSq4d6 +4'jL-;'\R@Sg=5B'Lkci`u;pZ]Q"pn`]SMaa31_T+NI*%>o+!V4F\Wu;I#U2+i@QXLX"R/h'9_+p;d@u188F&*1X8S_o"D8K]^W`ZPMGstcdVgk`h-3N#Y*1iSIhBRe61TsdFO9U/"/0e.;rDHtcCCulS*EReK(f?[rQq*"p-M-NR/m?!SR;&N;Ef[&3,BZB`C>m3;CS/lF;NKJL!bKoQdWn*LTfb7T<<)bGSP@6Orh""=[GhmS7kd),8^#(*'GMVR_8E6iDJDaNJGRWNIp(1Ng8%'7]iRiT&LuMO..>QlL^+kP6R,/,X9GK-(OO=ZUV2iL^:.:E/=^<+q +AXQsKR,lW:#,fd-^2ZDN=krg=:m;g#T]U5[9;:PD'e,s,FN0`GZslLuTuLQEWDVQ^,u88;XpnO55BA-fVeZ)I`EO->oIt9%<@qdaD9hWf\Esc.V7Op>FOp/RIrJUXR5?()D9+b\>p!5#]ResJ +=S>kB0oG\WO(mD.R+[nZ178#3cI'0MI+Ghh;`WfI5#7H>Gnd,b8,00c#-m>4]^MG=DOpFJj+l=W[K/&?9c\'M.5p[#*k8G&ba-)Lri=GQ5I2clLD+Jt:(=\#!Jpf7S'b3/)@/UFLp7(-J8caM"=sT7iK&nQJjn@32CJM1b?L'\j`/DZ6H%uZ3F3Vc +]t?]LAIQT^229K7*(-*9%:PbiLX=HiT@d=JQp=t_ME01t\;(^U4&cQ^H71LlD\U7(\p#dt-5;esRpK%3M^9h4]_BLBhIL,TO.=Q[(qrn>WFC2d]YH\?jIY&oqAKt&23jh!*mG[7N=R3*8/"`FA0cFQB^fNH85s2.]5N0H.ROn_qRC'>["'o"Ud.HZOPn;c%aof"'HrYgeL;aT +0ru>:Qn70+l+C+PE9b:(6;_.sn<1*4YsN/::Z4tsKp(k352f3ii]F)DDQ#Ti)3iA&J0f$Z;;9'&Bbi%#>B=]i02/Zs(g]UBI&:e"7X4oF@oV/0OgK>Q$.N<,S8sXcQq^=bIfog0iLFa35u3\68d5^p."YKM8?$Q3,\q:[oD2%Z.L)@f]`%u\Bi6kB>,hrI/>CSr("&;f_M-d- +JOQjPPj)B1AV&9q;u0\E\JHlq<5!sJreFDf"pufPkbcfDcV/SK9W@$.Da7_RMA`)*k*$[OP:C>p\@R-%Ph]tOg2Ke)^HKfrjdaeoFj?u?p>`)^X453LrVJ9PB(PJFlP[Mi.`sK/J?fL5eq0(tK_oAK[d*N`XY49Pg\n +.BbE(Q:r3&#jI%ZZc[Y`g),p]m2E@"(4Oa\0h6!D)]#BRBoYncR-EDmfpbu%Ut.T'<9g;\RoNq!`qm.;USofTeAt9fR`AP>ok(bMlKD9c#@&gnF'=j[F'!I=A^&C.T@NTm;(DX%aUi3V6AkCg5dPds>o5(6Hm?YgbMZ5&\QcG$!SD%t9SBQDqYa;XLdG!!(.orNbkHs2EE +)mna8b9m&S9rUgV3%"mfg`M2gSe]-;B+6IT,+32&/#nX%7@QU/N)P>P6_da/j4)_'5?tMKU(oD!c8U%>PoHqR%I4BaWKt(ph6_I$P?fibQu`\nc$A:/QsuHjF<6*g=4k]c6E?nPkg>-^:`S`:4/d9CV:6QISB;>.>9S'//[WH'talr[IW^m_smeqXK2?(QaVk2*$bV*U)lRK=KJ!Jd$n'-.9\*-l;+9h:9p$V4#meHLp\iOR^dA.Tq/6R-jlf8GUT#b'a8[qi=4K5mmZ[7XWN]dZ7K?DuTi)[#fhop1&pPYAP(NEd^`,)DDs0!kA"+h"X[$m&u@D_/0\qSi=0iq3+E1BrGeqo:bq!haG(UmjWC#K"LYlr9nHf'nB8;D00i#6sa5r;L0HriVLBcg[%Bo^f9]oIt%4 +TQ:K,I1),bXNsr?Yd"U'H;:0nbA\YnDNP!7me9M&$uk&Nn2CHR4P_\V:S@e"$J69dpB9ta&&UF=Yl_<5pCNEm?Edl[0P:k,Ym0AO#;5*DBpS$57$`6#qmS'0.=&#/ICU)o-+=0d&?@DXT-Z`ZbU,f$31^7W#[ET!6ejP&R>fRCDW)XP].oV`gm1YFUeuD +:CuaVOR,bnP8T6g"OWhSN<^!aVDE/=Zf$l`&If$M_YY_R(m)cMVN1s*,ohd>)%k150VDu"ruHq@#B;e1E=c4@QC^pB*AL0-O\Q)m;S@">'p64u9]cL/$4P9L(<>M(&T5N!F!)#L$kaWucYX+EE=J![%FQ1"Oc3'*OUeT\67a/[C1IYA7iq-d)NasL90X[&bpA<6qXM)a0teeC +1E7`K#:\l+5ZK1/8KC8h*f.,(6+87:QD-)trW.,<;=#i2nJ'=<'a`t::>[/aAq?#?SrJgEEj?P1[SmeO\^8.n18t625qJ(-Q4VE2:t6C0Ri$1b!HL"NE]Dkdm"%d]Z%29gYb1"(;oO$$;PBeRRQ*.]CaMZ"k65q*?+'Q<4b +LH?STp^8hSA5E(VkY;9P_9fqP:FDQnm29Vpd6(FSF5AgsY7<;!_#p)Qf,\0/Fh+EN'lWNjTC^&G$&:o*H!b%60DS0d]rQ_$rLur"Kgf1'a:(7RCc2Y*(6u1Fp@);d5j"ZiX7pq!3&$l[c3Da6S<(7k#BsJECPf`-pb=)nsXh<%$kia#:+48l*Ui#@77#c$:saqN@ZnbdS\Ij7I"=e[%fNJF>Ph>!0_C21nO/DUJ$O13jX4$'7bJpof.'#kEIkY'KRsY*DMdQ9o$JFM9R:LPsf_:8?bqlX&(f3 +&>&LMQNF!PeBH2]^JKacjorhJ.JsF9(/djTC!EfBciao^k.?UI84s(`1p&:Q/P,*Vjj^AG_)G=n"K/85"UgJ+d:du/=&kMii!3W=_c!N/'L?_GD(T+qSR:TK +?oA-cp'G@]f_PSOF>b:Bp)e)c?Xd'EfV_)Gd^N]e:Lf^FD:UjdbQhZ'$"RNRACaC.^rid8*AeA)A[D4Re`aCT$"f0c]9UE`XQQMReQF'ULG'f@o!Q"m7aCA+kh2RRNsGpbjW!nPD#_aS_aaPHSkbj\dNf$d^BQWP$VD:a8>p>L2< +4`4a)DRSqMoq?%+fdT5E&%;Kf72kg!;/6jlB!XZqIq,WpX;]r`H.p&1Y4lhpI*lfX`ULsFSATgpJlPi@l:]%Cj*d@F]WCgp9c@.G?3=?(_^$S=b)ip+@R:\G"6g7fYpK[L=TF$f:_!>*7Fp(^i1lt'!E!6MJe=&gpa.`IHEEO^"le!Vpb^EQ*8^d/^i;;d/N\W0&t;\n +r:i(2=[SEM;1#'U'tI):`8b?^F9?1\HW@f8@%9<-YXE1'DM2)h8d:*I,;dAM]_*@oO:lI]/VG=eh"6Q$9b,Rb72!Fg`,aBq(O&Ram=aF^(@.M4?KAQa"5fB?>`_SWQ8X%QWCJPLks+5EpHA*R<`]@,%;V1;A%;Sln2hU"\9^l_'[SE4C3PoE_)> +9mpmCLku6MqBD5FScmGSn+gUEpmir2EF7@oRolY[iRs+QQH=YGOEs^!$PK=7Z4_G>Mj_JN$'go]_eU-\UWMR.H?5NhK:9?kGT!`R=gaa1L)i='=BWgIHAl!1O]AtZT2"U0H.Pbng+eW;Xc_6Hq<)\M%8WfCU;0m=&@;[&q/H-fT@s;kg'=[If<'[>PbQa2(egRE]F9NtI#7G@ +J]s0_5*g.[(&BPd2^"JFop41*UR%mVl'8%^c_P9>)nR2B2R06JB3K%ZSsin)RZXHrK;Np\VQ4kkH(Kk=EY*P?Ql:=N<]R)bK;_t1S"!:r>:(A;@CB=,WQ3Ph):^_*q\_rgH_u;&"U>g$;0T9:Xf9>>Zr4\WjP0@UCmK%(&,V4rDmoPD]%WdLR6G.RJu2bJH2Fa$oK\W`_n;6% +S1L\;=s=aSY'h8*])+mJmTm9/@AWX$AI7Gc=;APsB=0YM@ChH5GNHOE=qFpWAX*phThi)O-_$,^_V?f^"Lb13>Jcml_qL$W*(..rpTf/$;Yh;CP2c8KHB,Uh:m#uhTn;d9WPWQi6TIDIp]*PB%;r#-,O*a]m3_u!`W*.Qn-Mt +>csRNdE>]QC2)6"X;8T?;,>pZtRq8L#uC&j?tM$3-H"fU%h1UaCLnWV5id#n(-f*I&A_En; +g$+jIf7D0cqoq\$VkB=<*OF$+Cn=qGS,L/=r_e8Pb%5rDR[&H\&S^'LfI)(T>CMe$*TbS;l(#I6dKW_/>ppeC/0@6-,RW2W*XCVZ`:EKr/;m@N$IGdLS8 +TWO..k?<;gM.c#)XlpZ^gf\`khM>`LNMiA1l5l;=?.tq,hs)3]l3U52ktE,OrOL[i;[Ak!Bu9[\dBZ4WgPn55ot9J=&'&nK!D.5"kFUp=R37i.@!NeP/hCO@53_bk*&rThJRq94/\:qo^Ri*S5AF6=u8B<8T`DFPhL7Cd8?lBlBN]=?B86kjofg3#Yume[>;`"u-FI%EQIt!$iGlD5mP=NQrpb9*^TX!Ylh:DW_-lc">W*JoM1&k'R)ET#\WP!Ei[bME^G2/#cYhFk +p4#B%d:i0@>lEtcWRMnFR8%k>,_aocF^&(qCN6o@DY#&8p;;HtMPiG&D'dYn.(aMFSDJHSU!`(D\t*-(gJ`:F,!2;IpO4/YnTD1O.84g--uJgtrndsp\4QLA5*GobV/c>+IeX;#o@!\)/p^tD5EIZF/AWiY(3R:S.5_Arn<1(p6EY/4OWK[/6ceoY/*_X?=NY0Pj>S`m#^7f-X4jQn^Q?Z]fXZ5-qWalV"S4H;)YkFT./T<"lGu[4UJN6oV7H!@BdZjR@?9Bmd<\;REd*85h)L$D5M"aELHXPPGki:='*j!=0E?71$Z# +\YiP.9cZ3c5:+9O2S[5E04$mu[;d0P,0[:!6-1Ap9ir"G.W.kE,#'Q,$ZnmM:^-Nq&u5/X#8GmsA6j&FscO'f;O"F*nSVdD0[X;)>=cN)CCcmU5(bPhH]0-lYU7Y>e7lh;T:L%nBM6/d7VS +1p/WnA>aQ4Ss^JI#.&.&$)B9)XU7-9Im93Z)V4a!0-/k+*a48'EiO''LEOfH+gAY#njfBpOk_tr^H=7%off7)Jd42#T<3t?rE7]D^1n6JafHb;6QIIsCCE]ra&]@Y((`#Uo](4kn$G,43^'@aqBEk#1'_+cIpT?_DZi4mW&qH$/WB$I="e4p"a4Th("EpJ=!fs>sh +FcCB"gh"hJl,\(^nlFkf=f5fCk_%c/huqn7;Y!;*j31^'5!lUtqRn1<4',aX?`82Jp8RG[>/)&cCS(sEYJpMh)6ka*iLf_O1)Cd[D;U5WqL9q'/+A#Q3.ZS`d@Uh;r)#m>#B3Kd"VkLO!D:f](b<_HY7dT/Qg<^K/Bpm>7k4gC':<3'BZ<5L*+X^b-Zi-j'cKSuD*cB!KVlCQ +6T8CYiG0BUMCoa0LN"TsF'*e:"lHs,!t*j6SL+g&*L&h,'3YGcj+@K'&k6=cqGB??EGr4G^A->X`?]YZ`#sb(;DOI]bArCAU,'d+.f]\\!b]pmMSO4+!p"CnE0;W.5mSb>b&L=?lY\P`#W/Ddj;r?'Je5dBoGJr3Os^=J +EcV6i+G$ITp!)/)Fslp$\r$=Pe/LtuW^`\.DaAP:H-%q9j_/ahtbKfQ+g#[i%L&T"%%PPm@pUg[0+NZcD'XVrJ>>=(,jLW8C6*#fl<,SAII&Ts3XhmDtuEV`A*B`^@D,jLK>+p(Ps)'e?"A'C7b"uu%'"Bm@khrg7I#Rd'Vs`8nLB5fC*lFq>kjkG??\\X[/6B\66[)o4O8L\)ATTP)g4DSIog.e9/$Hom^c35UG4+IG6T,rHfU=O)'-ir:=&=X)qtXf?Cb)k<)&D.')a$M/FP+ebqs=o8r&'Jh1n<%A1pClM[+cDXH0:-bShuqhgFQikhik=!cn?eDXJAhdT]sVQ]kM&B)17XUoTU5D_mug]%^U\Xg)6eSif*4=2R[QJN)1JV9^HV8ApSY>20%gXaM@;@7G;?s.=qHNA3f#?:.(@:kK8pBaP``K'I[)P[:N\F^jP:_1i7=s&^PO/\otSBE8hnY\U&8>[:`.'QY>e90@3GZ$Hj6-_:R&Rd]T-,Qa(VV.i322u^b[ACfc+ORahD?R_To.QjI!pb"AX96S<=WmRVf^GpF"pRh(!LXAG.%N>:)5nC]+*I>J&NheV;p)_9-HTu63ICH]ZT"!O&^No9>crg&`"GV(Bb9=Rna7Xp$h2S%oTaSXbq@q96"cmZr6jM?@+(sth^UNlbpYYljL[fgXamKk6FU59ft!Mgp9KP7e7E+,fYniU@aL:e/#Mphc15J^;6_.4=tF;McH'u&`H_5&!cZl?j"*5U,D^FUG>aIP$,4h_UR_BIYGlfSTP%72TlT+M3aMglp2NJ@'S[s/@cd3h/Bq2%@" +6K3\&/2+cjqNeWu/;u1`dN6:o1rE9M_dR(CF>q*j308eO6_lc:l/_q$R=f$5^c7Q';KSl@"uV$fQf/FD1K;/YlbKNJ5e6P-F_CO<*t^=5=Q>NLL`W88sR=, +[D6i'Mei[;5YX53'e*:A7\je=Ztm\"CrXtA`oM$W_ltXV:Ic*k5m$Sp]M'-/E^s):7prGeoMA%oGfPp7`@4rJcm2-"H,n9j`F-2BJNT>K---_t*<7a\Ub)mGG_#.7Vc5._Qu>$J4@XF@aIo;]P`*O,@k!pY\Qc\cA-bRar=j?eaK1P^dgX8B91M;P^Vl=-E/)DY4\:$hae4O3 +WKIY;>6=GcaY\I'Ck%JE=t1Y17fpsO7"`QGPlco@W)QlP`/'Vhjp'&$8t_#pA?3en#K-[t8E7k6o2K5npdEPH4h%e&DO%&%pRiZrG5icj`65c/dWu9Y^s>_'VHC5H#[-dMIJVdS*c-L,A%k;--@,kEV:m:%X<0W2WJ5F@JAXbj*&7>d-p13"3$!9f2.W0Gi&$"i1&$9lYH2I.trD:sG[":Q5.]%,@:R]UE[66KbhNNq2Md%;<""i_a4aXEDdLFdH^[+n?EOXK>j%UhDV+!X<1B<&uI'\@V">+-76_/eiJ>cGW!NQ1JW$']dHic0ZVA3iJ9/mUK9\.=7+f4C(I0l#BpKn!2$C!t'b4F)sdl(hI&>$-c=S].8'LhbX4M3e[/g+kuhi(M_DOBC4Z=RD.W)k:)H +*SD`B>0X44rKN>iQJJEBq?I#^`3:8\eNg<<:o.@#I#j@7gc=cUfp#aDb`@1V%PVI!p!"MbZV/`6"$P)=KUiQ@\$h_Sgdho'<Yg>TIZS2;KF5TEuWXgi[Vl +KufF@WnmcjgprX*?0@+,c46rc!sRm,FjX.A>_bK0JJIUZJRi%\eMg#I?QtoW^fi2R`!3'N?EpNJ`70P?gfc<'Te%\)p"n>tD;V&<-6in&h2TFrL!QGPYMBiE1,REl4nh`h/3I`XmAj+=>.je?WHUQ'1'iWQ%MOk?suH4*[?JQ#`c7;@R37e`?6JO'JkAY%B^5MSE>P]R@&]qLH;#^%POdM(?0$mYM^e?=l/+T0q,51;-L55OVcuR2&'I#;@mhVaL#=nCLAb:$A6EW>$5?t-=SDkj:2l5;!Nl!1?9l'id+[sONcaep+S!OW?l(924Q+/'e,MLAE*W\Lg&4R +7?B29jX'q]P<\)&;&?Rb.$`\$;.UJ`I>*L]M`s8#Aj,26^uOp+aEj`bQ<01Q6&k#7?`!!%Uo@i6@LqF+2YD525#e`8dU^'^k&tM%XkBZR0':U_N@fTk;"-fRo=es);-!h=.NY6m[q`d;@6Nf,ksl/kQOJB6pYB5.=ekTSD8`35/@^`U[#l%P6o@2.kOe/cD37oK7RFKs%l*e4bk.L$,OOatMcTi<6Ga[n%Y&4-$Ca'gUQ(@2piJe,B+b5DID5aCl,JN;?82+DOK2GY0,`2aFoT`mb5Scii`oJhWHUp!uDTOn@3Yphsnrn%QDPcJ.a&`_@QoE[M%[($BSEDK%Bn0[B+g0&c;5]P=UjKHm/Y +pBp8b$gOlID$#f>G7MT=onR4[>('4W;2?\&,h/+LD)W_sR9)p1[16geO&$\cE/*QjO(lYK[a/8h@;Cp!70K#j&li]g9)&aD`&:?:480Yf;f5LX[l.(o"57>QKr,W?BsLH5r)4)n\*!SO8LOQU]V>49=H +Dq:GWLoCPZAA;e.l1UbA:*XnH>BFcjioXB22[%?rF*+(IBWK(XL/W3G$ZtONKO8c$NIH!d%s&Rm*+C_;I;&1KagcN[86)jDHHOW6gsc3q&h;82j=&-PkeCGq.H#hD%q8N +R/*):q59\W\!Vd!SGCd-q<+@FpRh9eTGA?;qBr$62l$4>V#"/hqIc]%GGk:mW;;j[qPU@i\#]AGX*YT=joKhR\%DOX]_gC@;ur?,*>^eg84@#f?B5j?$^_;rU91Rp[A+enG>l<>pqMH1r@!e;076]=qA:GEkqg[H%\(uP3r;YC+H-??+5_'oK8N7p.%*O;biD/$92B<G%6DV:Of*]O#MX]B/SSJ&#H2=?IP[%/.VKEEKkc-0pV!44!9rHKUF]uIj[p?2iCj'#GVUaM3ghq=?^#o';^Yj'THWP[VM9"[kpfn7=0:gGI`M2/uVcSl"lum_]]oIBsamXJ%?9]cd\``U2F?X&E\)$NDB0KZeVpjW!omVBrD>u!Ys1f0Rpu]@g/.D]Pcm/bm6',n'#IZOS@&S,LF7kq;b*lns$-OE*Me%GO`CUB=T0=#Da]WdQXUqe\)],N9D%!h-]99STpH-$St]ct[a/BoupYuK6330(Yuo>!%Zf'#NNS#\Ko'?aB1\IZ=24\uXDrB\ekAA^d^%.+DmcnoQq$;T*0.lgL,X9R$:e87';bk-7C92\W?>^"#J'hqWW'hbH$-"D/"(M;fM(*pi>odGSl='aiL\'K6EP36jC@iqT*.MU]/sF'ZhS&_g[Rd>gbfAMp!-QK2/.++.2A +eWXQIRE>,7kDT;6C$6>7YG']0lJHl!H;9_]A'dZd$0c\f!D6cZAj**Y%5s=%?hai39l%?KbG/m4f#7%Cm`oBbl+!=a[agjoXgIM\#1j.K(pmXIj>htn^ZsRugQ5nb"A>$3R5Rp[6sN4uO`C;1A%U^J5&Hdlq:1n)kF)=#BkUZjXeP0nhWrY`%;uDl@TP2Henr&0("DM31M*od +PCCj6k.<9oGkW6%B?E+1?44;gf,bOTG[>17i\fRe?+nf$D[X[6*m,Yj>[/NRm6j'[=iFtP"?l8qS+e0!83Varb?4\_1X/Mhje'k?o"RQ>9:[ENm@JD#Fmj;72"p5$)JcWe0F(l&SJu(TW/+8^3ZIj+F]du\L_:/Ua4/]_cD6+;E8D\A\9/qQlS+Il.1sV.bn1XX7Yq^(,paCr'22A$M?Zg)0A+;dAO:X'`qh8F +Qk7-JFab*fdtCLBP^PFd^CTE*8r_nQ"X>_9K5Hp*b<$FZR-.?:hMt2P/dbR8lV$gtcqMJ-R/OemB)5C/KN`"L0)Q8?54gZ,j +7;+$\jk4LH8eC[!qFaK>`6"kjbk+O$h$If%;bour8Od]-;G*1!VD=fYP5bGG'K=6g#u9GE)Delp=$lU>MM7tP(qWmm^-@euq'Kt>k3b5^;b&mr$^IMV5E53qlkYI3Z4=B"BjVr_Bm<\DBogDsejKorZA3lG,.%&,8Wm]J-b +]">o^Aks^oZkK0g=.:jWkuFUFerJp5s2u9HAc7orto) +^@`7\AK/#GMC3hIda,M\@@Qq>^MTRY%B,nf0^;k"!`81*#6=-cPg:e!5<:K%`\.GRTE/dNDs2._)Np^fSeKk1-P!FR4c21/7Fb5L/G\Zmj9r.rh!tABu"q:!or$>JhjHS_2BBXAm?L4YiQ#)WLF:XPi7A'G&`h0;\.sTVhhT),fJ5#'OmPuMXbQ1\l[bRk%tR$lW-)E +GinR1Xpaj:R3ookLFj!]X>b6" +ep',nn6/2^2ACDfBp2lmQqP?,LCDh'f&'pQjg&sQbEKOsB2;Gkfdch\]0V7R_V/'LLfbZ0=/E2e(TaF+76O%\)0s@kC*Vjm^mt6jaLFX3IZn,rV#i%*c$qO'u'1LS(MthXl;Gi9W\MPB)U+MpVai*&g*2*IUC@qs$u>P?a'0PhoI+Y +J=Z[+X835hloDi$&o8oQUCn0A5M-j/ri!miY(+ADrGNru'V"6$'Z/B%-538A"1):21o0N8T[=:B.R#r#`l0Ot>`BEW9j"0cbI0QdV>Glo0V#OlO4?s#iO5>+Vb<%kS6Ck$18;\",I`^W"'B?#S=3C&@Dan1CKjc +$fJQ(+[lfKCo-*q%,hF#+H[+P2?_BO"*!3)?s3nVkRk&d$/r6WO%;,0&/enB&+E[45f""Ned2mu#9ZqW0S9T13sW#2#Co5U0S0JU-jT8o#iM?bEAS8i3=2qZ[_ci!O[L!?8/2_2!$[X?O3S@-=TK+?!9&DC,?,D_Bbg/T(@cA\0m*KU0H)0>)3KIdDo`nqLdCAi5!d"&+UoTW#CoAa0KKL0Q4UmC)X96?a"[4(Pau:[W_pSP0uY,Hi:eZcM9K4rjLDs=o_NR`*V&(=/'=R1h",==*lSX,m[deUi_]#8*KgFG.fR1\"X()[+R1Mln^Se')'Q:++n=(%&cV8HaW7,61a+.i0]`o;3?tgm,P",G1.;9F0dNEI,iKOc+i>U93;(6%rrL=SP%>*.7jbNY-Lu.( ++d"-gM'33')=i:`P(b8;G71'"-:%>_146:r.\A6L*-.](@5ofg:F`Z,.e9hH0YR`8U^XJr*E']qAb;\X#T3-W$NP`.0Q[M^fbP`[?S]^1bRckRE=ah^"*2pEnrYI(e:&$8Y`Y(g!AuQ?aX32$0_0#aEtf&s(_r5T09:]K!Rif5O;25p%WY;MEpk^r3@?N/&7\ZjP<1UB8Mmac +0u6sf_*'Ys3#^7O+/7bhTf4lKZih#F&V2Gk.iTY*q_tj02o=euMhrCiqCiN'3:i7+$0^c;G4!^#g26('F/:#jY,kR"3qKU<1(>F+[6!^,40uaH1TJqTIlqJ\3V/o`'@AsW8AmM9nm4>.Q6nc18i]0_%=8E(R21Us&rq^]!37MMO$E7uF"oG_nR?]lt^Z`Y+/\HTdh5np(f0JF'&a?Ggn9N9D61-ZP*=u2$3'D16>JZhgi^sjM(:@nf(2"WQ0p.J>6:\02u +:D5R[*SPgriUYU#qW*Gs`0!o4%\P?4$/-PS6P2*emN.ONLj#8CJW25O@(Q6'o%-"4[t+OgJc\QJNK0(eQBZM:]2ZS-i;>kDA@d*?$kT?+&EiG%#!+BX5$'B!Rh'[W,'MWkT9;7+PVbokRFtDcJVQ]s*2R@4A01.XDZ=>?qp=2bl&HP22+h#\2FF4j3;/Wha=S*jCdWQK9'g"3P'@bA9pB>2E.:)4!'LA]1PbT,Eq"h$8+MhD=f'c[JGB0s=)3$d.asS;F-645bF8%%O((Xgr[<+?%.lJBqp*!0e&Pcc(QiD)UES3dH]fOd=2en*aaCO\Ha4`?lgPQHflZs_,9\@KeZ>M;]m\J:=Z=O_Ep_.A14_)idWJb=15@=L=Vt6#hR$*l"%"\'nS#f.%#M5=1]+5'5,)\7H9H;DV;0 +Fd!>Yf3l=XSH>%NG(;Ci(klJoFs".]GKYtj!qBgqKfM)K*7rMMPGnU24eBXLi#pVgiJbDiruME&j(GLXA%08=WX)B_U$!QQ=+^7rDEO8/*EfC=e-*\pSp&bU?6&n)tD#@8!&O>X^(pdQ&7.lpTb=*JNiGU[rrM[pYU=*>g@C;^[o +8WjgL&XXk&2`46#rriFo#(T^d,L3RL!8bZ[P-[#0L^7bFl20XZrFblB.M"m*h=I-KWRo&mPMADnC=-JQj$].37h2Uh4:nDNZ$'*H-j9uNLm\!@'udC3;J#;r@aT-9j%^k$Q(t@?_FffOSKbtW]^[!s'+.GLJtG` +TRBma\,u?TH!%YP_#pHTO.SF#X2.B'3ZD2pl3.m')f+%S\N:,f-jAd+Y+)^6"2WI9n?$H2Br2ZiXX^K%Y1IC'[R/UBqm1/U/d71qD"1k2DdI!UU?qnpCVs5UF=br/%\(G!A.bB9ejIi\bf8=gIVB#;A!=$]&9?q0bOXHdC'rlK^(HS&qgOVaf_*N]_g$-UZk03 +ah8YL^%_I[)[jA!l+Gt`^A(-56g0V>ruZ9#_rr$=NFh6PbXN4+kN'cX9&=EF>n`2?,DlgJ*:@5EH&`qMP63;]=`)DjAb\Pb@CH7L[!4d)f=FjioTd!L2]jdOs\W]b^\*IlZ3cc-mC +PYou^>0g6?NH[:G4a^Jf,dF>*5MASZ`Dc$SVME0SeYJtRTej`M;(MtD8/An_au.d,S?^!iQc*eUfa7,!;Ur"FHeu7R$o6?h4gg_N`Ckc-6@a4:3Ji[sEMttZ1pYaUgqdbgNJt(:1LR]NRnFK4+`0Q7-/P>BMumi24#]"Q!XDZ1Fk7?bddOTZll$pNc^FTugl6Ij +3RIaBW4ll=Zl?c$%paFq*57!"]hQN?QTk2&eL6FA4]dJ"Q.=\t*5/?*]rWs%Z0K'*lMe'S5.0^$f>83_NOG$O5.L!o^$C-Fm/GBrg`A0kf6j0bmJ<7mhV7H>UVX\3mf)_r?C\#ZoC'5\m[i065,CI6[k1R>$/X*p2.m%8V3CK^r1:W+HNu8+&b%t^RUMgj8QKlJ-;qA*fkN:P4hlY+:kCb%LE;k6(]iu<%]$tL;"iBGa(rP +'oPN?:MA6q3?=/Nj:W='':IA<:E,lgA5jEdnqBE&dH$MV7,EhrVc2jq)O4'O(op*cFaDP4W?JCqlkUMaL,!2D=mZ`EKs'*G[p/8:)jS_5DhhWe&?Dr$q0]R,lrD^"Es3L"iPO6;<\G>M`g604>V.TO>K:=H(t5p2BgQZLo/[l.:J"3D +A@3>H<-J?VC?rb6*>Zs6dG%*K)kEkP.tOk^1/bR$%sQ"4)0lj#?S7r2k70NmDCJM`3h[)]*A#&T\Jm9tqcJs;O.>9lFgVm)GH\oB?2N]rJcE1uUe/nmbqI\tBP[VhO981P]d\NO!sW^3prnZ#A-A)9n:S^i_+_Y4$QW'^*=YATj-7A*YbN%%`,(m!&#A:q;\63H6s?KQ$>GD9 +2B]XH_hKKpEYc]8=RdIWC[0W&aDrPa+eOocP9ie@A=.eenq4\LUJA`@o\g]1trokjdTZ\(4jYC.>eMp'u%cEA7EACNOn_Z/P9^W*eD#Ip=Or]:aY"A]1We^KGENU0gZoGG[C&B#alQ3j<\5$7pZ9&;l%t+`.jXI+EPhQAfDAS[M21tiU91P'Lc"a>'*4-H9uo;iXSb*f,B-qbGp +&OsrZ>pPB^1u91FBR2"`UF*=5.raOKSrWoDg)bgEC2.k`67ilEIB+Srg$Pn;QUY8*8DZ"_aS./'!6spA6(_\p"KXVilO`Xb@&,mEas&GAgPY9I0HR3>1!e`Nea/mg)Td/qJi@/7L*E,&tPlLG'(36G)lp" +jb4Tj^')L.VM"&ibSEB1*$ffW_0b?ZhLmbAi\;a-V.mHM6XaJ,kB*A[hZR![%;>>`P`HF\':28CQeNm"hh7hrrb*(j/T!>230*i"kPP9Dns7^*!NSr@@ACU`i;TBJ;JWCW[Pjrdf+R[VJd$_46$CQPMp*#Sn5]g_-RMh4H5(6KaJFj::p>nZH6b*4;n(qd!o]9C0C&WRK4o3q +9%]noLo_-)p(UMlj)&7YOarJ"r2IR*9870?,D$c*Y_.=%F@:i2+[poOKTo\,6OGJ3Lfj>,J7sms[0[mP:rks1m69jLBb"*UY`:t[9[=-8\3\@M_"to(@G%E]V4\#9;36;@('1s9W5R^0Y*!Com4ji1;d_$o*"l:#!Yc=TUss=1VEsgfPn**4[Cq?A,a\nMX`%=;qCf>TPIN:pNc/LfL,/b>D0A]?J:41.s_?2)(!n6<:$_`cTss@;[c]pfs`UJe".:bd7lucjH[K.h]1qYg.gZ$>5MP&TcMH3@K_.`Ou(h%$4gk<:1`>'#InHhC=ZoY(E%'*f]\8m63OT9Ok=Y*Agd6!TVlMkg:oS-h;8uEFDCC^r)t1eU8*M +fh,9WngS%jQT9l70VtU%-*L$Ad('rYb)n*7cYc:<=`Qua,st+1MPCe#b_T-fk[e\4;'^EZqkZ]YPt^=Q&F!Gm+e:HjQ$0>X8g6sj_b?tF3j@0B!ErqOCP#QjeP.KR>>sp0Xp&QR=*"+:dcG^N("BH^6W#_%jOe3Y/T!$]\RK1H*h4siI+G1s=t/_["BJPJQA7SY6"QOW"Br4\ +27b&6'^>ipNlW3^r9oW$m'W-1NmZ>?:'ge:$g4r]7!Gfq$$-586JC'b*4OsVBobB-<,R\+qi9!Si*d#,\_lVb?<>,l^@W\mDJ^C%!d/("d+.K6I*X9!ij'bYD.''7;_EmUjK_R0(pVp$(8"7,JYR2,_4 +@59KC0[XmTA1nCjHn\U&")]h&^rX"eQ7d/T_@>/+f+H1FE3+KuJXBPd3e2I4_nJ2d#T.PXj:j$u'qV$(mZWf!eWNrK8I\eKjj+5cY_GVG`T1ph*nt3qXmibb6?b(eS%),CW'`_@^G@V7kAUs'10s'j0rui-*,\eI-DS17/C6A\L44IsiEnf#.[P\NjYg'5AclWHThcNEjJVAK +MQC7D5u:Gl5=7u8<0Sh0jT:4:og8M])t/5/b#cKWkq9`=@A(#/X2%ggQrZ5\!m<^UmrkfouPt,XZ,Ht)D+J0s'_&l;Ue;@P*=B?>,j\dsp:o,6jg>/D;)pg4&\Zn,(@6FgCd#-/8^+,5"=V"T"&f),`gW$@>N^8()]a`p'$Q;f%Jfe9[H[;>i6YFR;\(nF'PqI<2JkY-6IS(Lufs@BoN4dFq,h=kMOYJp!+0gj>B/m[_tAGCJl54-s(1 +7u"s9cILiCc[T%`j26"j\`-X(m1Qhe_0GtOr6Cs77==/J1SOE=`a>3;6N>AUDU8g*'#J"./'*$Z)BSiT_ED?gSX7VO&.r7"94ARh+JGLsC;4*LHPF*4e.el[hm&`9\#`@J;R!O3W;2//=,/FFnXm9sbmn.P[UJ^WrV+S'Ie2t=XfHHTn(H@?A;'EJKSB_5OArdL"Tr,j4;lu@ +$-921s*j.X5M&:&M%cVk"/D9Z]K!l#"._u'f[#_bK2-'6$c!j"m(=C+CQ%6pWb5Jt#re"AqkrkJ8r5R[ZZ4/Kju0#1Fa74_@aA-P<+$q(dk6Ln/GA*uDe;+6mB5h&t$A.LB\'fol%7I4AMr*ViYVT%;"6"&qCFBaQ?DoPm"`bAj$ +GWEAT`.m=9]P>'u9BMYc(5$TAZ,1cGZ(8$upu8'r.4u`1[aW\3.OM9KD`> +5NGQPCek\>@&6hc8$l4;4JYSA]Y?!%`E\TjS>Vi-=?^P(8h=Ml[&Z8V>d)q)7F\$Rr3/g&Ttq.6_-7P6Uj`AkD9H1m95M(1I(2h.\P%i0L-Sa3]I8E2&51\b,eG-fPT,kb7foVV9J"(T4N'oe`CsKO9PhaCI)o!?a\85Gb?OFu\qZ7`'nl5)2'`[C:lVt%(D0k2b3NOB*7P`8 +kQ/W']#2dI=^_B%fh*s/8&5*od4L&/h%3PtKiF($(l#pN-kBu(:+GIqgss+e9"JDIc=p],?m/6[V^si,`^Hdifu/T53=\H>:'Bf3g^V@nK#f1@4$8f4+^mJAFU)V$JS>9XC,a87ou*r%`4VXroU`W6T:^M(P)QXY`:'O=V,/06:b8Qd*3;CVWQsl$cQho$XT64T"ON*9T<#E4 +g_A*5%8bjj:rNdRMnVhEbY]An()2Ha6tt%#'iA)t2q6$6ZeGU+(!$17bk'&jO@R^?'nGZm(fRn**9N"/@0/S9:nnNJ8Q3_;7_OJ0OJLYEdmsK[.1^)?d]D?QBSAdoj$%bu7PNjnHW&$i@8a$PdPCcUV)/r%[*lH`dqV&Th$-GF!74s":D?mW4K'257*0.A]EgZ!q%^4):9a)S +&>Ygfe=Fq/Thj>fcft7%laP>!VpI:n<3-8GA5tn.3_:n.;p5]tKh57no2Q3*:p^b[ohs:nue!C52_&@J.pK?'nca".^[O6M2bBj%Zsj^B"]RV]<)#e7V+)>n7iB!@'`ohe]5H,+Qc=]tVog:^3N@S-;7di^Pl0iM +E@nN$G?2V=f$Lp-i:b:0%0fP8-rCT./N\a'NQ@L\Jb?W)]ibg#G;%Y%L&k]b28EDs7b5+Kf$/c$bJm#R\5L!I=rY:['^O99\C`BcO^#)HSK\+q"T[)u4ih:tAVgrZME?docc(g='o^eqNJH=jf_(?^IFq$&JlNct>]g'PQ,VE.Q!>!b=`*".h3]\*R9gVt?7k2+m@7A9=P%,Z +hIt`D]/\LM;VMblDccq#qi?93]Bt%rK"\e\8=n,i`R'[BdCXPLh*'7n8:FiJ<7pS9?&fk4^#)c6 +*5+NE]/AAA?'@C):gdeKiSGaaA`0G.iSmktibg,*`T45ISR0Sk%GZH^+ALk<,N7pgg+Fl7pu:/be-I!FQ4[t@*ND3.i=T477h)H/`NG>/YMqNrhhW-,R($G$m9dG**M?"VlJGt9#.u)JOHG6)-(W,#$F&q$Prg=&TSDBE(#XcM@$sg7i(mbC9hMiH4"_!%"s;W[b#@DT3cTjD +q&9`))S1'ZEI +"QkI&]2?KnG@$D?5T5l>@25]m>JVY3N])49h9tO_Q">\Q)1Gb'IMh3_UZf^dBs(oIjUUCY]4o0nl.&==k*o!ZT0'c\l0]Dp*gnLJ!U<Xs30=W'C84W2dd*$#_J%Y+iP-@0B'JCC[!'*f^ss]2#%,ClB%naPH)D7ql;`D6B23p8H+4cQA1hmI&k7[\-IJd(>=rm(Ls"g^?faWlL*G'C::sg(%9e7mboX/R8_R"C2N+sjh:7#4Q10T.p&ji\?jC,juQQp +[3%!kf"ppi'Cu._=PfV:J:2I1%!i"4.@=)q%]2#3YI'915QR:QoFL^2!-o3LAI0qa"[i3>a>s0!bVb$^Bfgk$&CXALf6)1GkTBh%(gPIgMfLMl2"Q_&Su6ok?1aRDcDM> +i!+$U8*8hTi),dT)"F4Yo4Kj@`uKb%qp=JqD+P'[$b<^>&;8)E7JBoD(F;Za-MLb=Edp'PY<$i&H$>kBn`LkcY8_Z!SF[8;DPo=7[7>HErp!!&l=bnl/XN:6`Qst@(IO_?Q"$m(pn"b+-q=YC3nJf'fd/"bb*;3-LCPOMTH-c^t@6T0UF)QVQhU*'%dWX4_m6;&'nHE(m[p"YP&5XSJGd[9),S0'[`:nG%]UiuTKm6r^GON:nq4.:\@.PT?r"8dQ,bb,p^a3(#Eqb'qQD+3EIrfPAr3+:h-\gte(9C;fp^=[DTi9C$&Vupg +Gf^;;hO=6*UpPoS&>AXl_'p*M2@u\%H!^X7Z#Q(TBF*KGaAe,-8"5nYcbV?S\iO[W1CHgW6'cc0BJdpgTm'o^S.+eFHAki:rB3miTkB;KZ8pL:EDQ\W%_+8L6PCu'85?C:NSg13WfcOQZuIbsB,,Y8VQIt%I)A3E+i,?u?Un-ZaV5u:f(#/SZ6+U+LBS1+f^d(D!46VuL$oW+&n5nLt3*(^d;8gI*T/WX,eogLJ&pD:hC'*t,I +B[gf46cp*[*N7?GJKW$3*/LK4dQEVS/-1\.[#9iIDNB_hS,T\,`@CGlb+Q'>91EbC2MiLh(hGJ;iagF^_o:]i/V:qMi8_jdXQ_YZ1VCI7$o?\o8PdT?(BVA3>mT.4jZO1FPI+S&M$S3MQMiT%RuWB@:]$TJKll,*>uT4r6HG'@EALM)ki'uic-=Tu0qT!se=adbqHZ$D&!U]& +^@/u3LRpC$ar*#[2CdcdE!K +`Yn4^kFeYb`c1ZN.<(cPc,r4drD@geel8(La^Sc[p,g%rH(rPp$*ObODk'b=N%]OnH:A.L?Z;'S%eF*me>T6%I9M`!Pn20*Fil(S2s4OnHe:e`USO_MoN0D%hS8kW +@!q`Th=OKfdrBHiUcc9l2ePH$VqeM7eepCt7aJ>ejpuFam\Oq@l0u>tO3-L`UVG1GY3'PEU:bA[L6<#GSDBut^63[`Rc!#(Z$)mi_EVSd-QjXf?OfZe'd>u6KM2hG#&SaaG0Y,"\CZ>JD@@R?[g(cB*-B6Z4i.nfh-hQTKZH=&_O+=1TM-qkd(U>a(hF,uZIO\fiYt7-XU\dh +4bqCe+>#R#;IU%sL2dtS7$s5Piabc?d68s;[IFLJF/TJNZ6>o-E>I#F+V/?ks1<=_&DY3$6N\Mh-K-0fb%t[2`EAZf?qc'eP]_iE2<,#(g]c`rjH%]NbFI);#:(P2+#)6Y";qo'hWScoK/uOE0_$FJ0hrdq?2#7fI4!+,6'EZfpb.1I.+<,PPf'M#8-^9RKS"(tTRl\[8'i:* +Eh\br:/rPVP7LKc%"ZdB-5hikVE9_UB)#=a\Hr[hYXU5=096>fG>`O^e`&PV]9]:F,WN:\q.5PWh"OH*gSi"VjbL:5hjZQo/R;r;t1g7F6^>pV5P5FV_qF[(VNa?7e\8O:.O>b.]lgL.hRlj>qd*_Xg7A#DTjlt-Z4CYJS'fh@ri4p:s"0.qZWdMNO(aHW6\_muk[;H=TSek@P<\Kr7*rrliU7q_<=;g!*jm$'$[<>qG\V.-O'ZDMR[es>p<-Z_;5EOEqa.DSN$L<]UR^Ouh?-F%8n72j0'I*k.XP@Y\X^d^.pGD!UJtP$mU#QPa?:7`H2c&&\)[gb6OBoh1%s'$0^FVKif9^6.Js]edHb8m7\t6&!euaO4C0(B9u*TL$YVPRfImaSYpirlUmsAp]8E[Uk0)oA?!p/mJS/iBK5S9!YrgH.($BVt_n9bDqj@KPWT/&H +Hs[K_=#]O4cR7_9"SFY[cQA'(K=Y4N,`[FK;(c9-:[b`WcmEqt5+UB=5RLa0n_^Lg*mfW*4Ud/3b?]s/D= +hJdEujr]&c;1Iaqr@b>@7(QCC-G_*D]rh"RaB[%!kka>*Fhq7NWBS\4.':fK!t+,^Y-a;kK"PfV[$)EmtBI0;TU-d]EZ!47egR,>iFO0pK&(r]+@%KgY25X#Jr6[$6P4'"B;m(!kfQUDb=&A?WNm/B9-Pn-nKb[`103iEi2cA&)lfD<11p&s,#s33-P7IN&!nIh??`'( +Ak(:7@4<)"M^ZNI+#2-rTt(Af_c#AE;WfZqlRlrh0%0>E;YMi-q^umK.['rg6HT]-$K861s+*.Sk@9"lc/fphD\?a7"EX2tm1'5PY1QssY'8JB:N28q/1t*^1ZK;S%RlAff0i7g#aHC7LR4l[`\H,bj_&YV$Y!Nc,2$gjt1;c5!8/!1WBam5S^bbT#XqT&O;p.\\Rn;,%8ee$Re)O&"X%Lgh54l$O<4>MZ%-hqQ9E6Y'P[s@W-VQ>t8#.4]oZp6q'1**8-5%CpZ_9@a>:jnt6^(di`MVR5&KjiH/TaZZF)rp(//mha +:33#O;f+1)@`[(5+B3D6P]f[+dm%kl*&Af^iJg$CN&#L:Xn7rZ;SPl492sG;<>9jRPuC\J>!^ZEcnl=O^(Z'&=lH!Ei;'bLIIlcA=or^43O:/TiI+omo>jCFXkr?5)j-_\H,W +X]0H3/6-=i$%&X5((:7@]iR-2/CoMJ#a%0S)bK#7F:QgsmDoB*mMIbSFG'U.$)qZ>nSB"KFr+XAG-c?nCL&G*G1UeZ6nT$U:!9!)e=*]7a*"d[G?>N0=;J]]Bn;Wmd5JUg(ai\0VZrjB%4*&$?pfR4JQF)g#+.ak96q00_AZ>M]@S/1=BBTGRP)(96$Q[K(S<93#.qn)bu`RaLu_N, +=]9K44dWN6(V'&!4OtY$M$')sJ4!t&04hPt:j-81KdNH'dKqn:LK"bl/A-sN,8#Nm8uP^te:8@/)iVdJ2iih#kiI,TDgsOgIq-N9e=(%&XpH>=]U+9Yorgs^$V<;g<*1T2=U0MF*KZ[!DO;`4)&H8_'p4n+433VIA13MTaL=HiXKkG2YBl,J]d@.H%Cnij=\"^:'9f@]U^.5> +O^u">*l4WS"@3N005Z'\tM_7V5,$/?eVW_>.:1DYq;ETT,PDE1]mFgRrl=/\9c8]&Bb0je:Dm<]]WO>5'QdnLV9IXP3WW<2Hf; +qlk.rYe(RR>8OQ58[.d3Z+;ftoA?i7A$U5OZF_omgFi'o2*@?gZkM]14$u*a4g`s>[2W$q4%TN9@4rI9t,JM]+W`*)mcUBVn:]u]GducLekZEhn49q]XrI%oBX(OgRanc=o5D: +)s6-A\%\$I^"`.n>PF3umV\NiYWMe7gY9MJ&\o@sO?URCY/&L'p_]1JM>W9Qj42]i<`#M._>Xu`&9>oU]`>hgq>Z\n7>K,B)`Z/L.>\D'HCW>.J`uK0@>^+5YHcOoka;fiR>_gCjMoa\7aW-Md>aNR&S&sHXarI2!>c5`7X305$b8dk3>dqnH]?B!E +bT+OE>fY'YbKSbfboG3W>h@5jgWeO2c5bli>j'D&ld";ScQ)Q&>kcR7qp4'tclE58>mJ`I$dd]?d2`nJ>o1nZ)q!I`dN'R\>pn'k/(36,diC6n>rU6'44E"Me/^p+>tLhP:efA8O?"_`ZCY%<[f,\qa?$FnkHe7)'fH#Us?&.('MqHjHfc?:0?'j68 +S(ZVig)ZsB?)QDIX4lC5gE!WT?+8RZ]A)/Vg`=;f?,t`kbM:q"h&Xu#?.[o'gYL]ChAtY5?0C(8le^Idh];=G?2*6Iqqp60i#W!Y?3fD[$fKkPi>rZk?5MRl)r]WqiZ9?(?74a(/)oD=iuU#:?8po946,0^j;p\L?:X(J9B=r*jW7@^?NO^KjrS$p?>&DlCZaJlk8n^- +??bS(Hfs78kT5B??AIa9Ms0#YkoQ&Q?C0oJS*Ae%l5l_c?Dm([X6SQFlQ3Cu?FT6l]Be=gllO(2?H;E(bO"*3m2jaD?J"S9g[3kTmN1EV?K^aJlgEWumiM)h?MEo[qsWDAn/hc%?O-(m$h3$anK/G7?Pi7))tDf-nfK+I?RPE:/+VRNo,fd[?T7SK47h>ooH-Hm?Usa\9D%+; +ocI-*?WZom>P6l\p)df7Kg\p$erZC2"?g%E\li,f1ru^k4?haSmqu=M5s+*GnOB==\&IF.XiK2]64s:Mp7,j>2ZsGI)NCMrj +f^sVY+d#=VP$'W5;(7c&jc\;=^0raa9]hOA[,,d_SPJ@3g%>8p6(q-=PZfpcO\)BIl'0nE5+tiQ<9f`P[9g+@X]FbQg@]p2@Bir$QX(B>jdq_[GLG!]jC/og\(RIJ\ba`Qs;Nk&W+J9nX/*T59Z02AFc-n[U1bWc"?R8h"H4`U![QGRU%hD;5r)\opX][ +^L=D#D"a?([bl)8h/;tVh=gl"_;TA.S6e,rOic^*q4-;c5G?KhFS_P7[pQDnm<8AthY2N9iUM0jSmOFKdHU=MrLVnj^Z"_YI/]aF\)6`OrI4d=ht-jJ5VNlW!^NtH%g50P<#5a)Y]Lrm684WO$::u(0+:3%e2Ik)Yk1-k6noBG&k&u]:D?5P<*'i(Z#j=i7PU-?)Fh!=D]D8% +e9;s(Z1NMg82:m7,"T!rO!I:P<0nq'Z?2]e8huX/.S@"PL4Fd~> diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/img.dat b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/img.dat new file mode 100644 index 0000000000..93875155ad --- /dev/null +++ b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/canvas/parser/InlineImageParsingUtilsTest/img.dat @@ -0,0 +1,243 @@ +BI +/Width 1030 +/Height 325 +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [/ASCII85Decode /LZWDecode] +ID +J3Vsg3$]7K#D>EP:q1$o$N>iL@So+\<\5,G^LL-NjE<[*IE5[a2RJa3-XFkqZF,@n9eVk^VFc'/enm@9:1mM9jS"!dTMEqb2!l#N8#0#toX2(aMbe':>ZE_:<^TriioWjnAY&^gM+`4=1jRLW!YA=M/6)*KS9P +E`kN%="Tc_Aoh+fk'&t\ctIN)4XQLiVpoI(>.nOW?*DmIDOWebB%lA%.Q9k7iBquDi!)/,DC66[a5h8d>eXi0S^6MAH1IXb_>kP+oS^^pnX!PjdJ%0OEX9GI`IODGoc^+5,t$):"t/5eh:9Jl%POR,+@ +`"_L`O_e;>`Y"/@)9.H\bcnd!<%/i[Y`*t?_=A"g+ioftN?cOX9U-pGP&-[:aqBZ0.E[gS=!,Tp[!7W\AU%]<`,c@+1!Gh4biOO78m5==1Mkl+c4c.P3R3haDQ_#7bdP"(1[=9V:_X?B6-tiJ%7AMW9bg+EP\hF2dM.T+5>m:/p3KX>AMl9mPjLV0e.-I+ +;9h$MiB#L(9O0`\PKVQ@^%AEW8QM+YD-PU,c#m=DQ0j!,fG4pM7TNISG>'';n=`\3Q>N1*`,=fY;cL/)X]3i.h-D%%#lTZR=Eb4nESQm4c#_\W:"=CBQYkO)>Oo\eZ9)OOTmPZ5c1L%JpZ[0Wg66Z_J^/G][;ET8mCdbf2gud&iY[\%M;jo*/W8X+c8<7DOn7@"A/F)kOlVc9 +^)3Ge9rW_UOd6EWi=ABl\7;fC2k/tJc?5]@RI5KqkSaqa_.Km.go6f/p6Cg*RVnZ.P.HZTQKjTM?E@`h?=o5]Z1`sVll-GRZ0[r4c*QdV94+j1X)Q\"l2-M&\[hfjm0auaQE.^=g:P\4]pdY6[Q[ns%E%]U:DLk=S8TFgf6efTNuX[jXpsfhcS`t!`K*0qDjmR%^[MUq"i9b( +V]jU`SSqfcp)T3*g%L@P;VEAG)%4`6SaN"$GR)9CiV7X.NR2c*^IGJMX!^]GG3b3)l2%!TXm>j*caE/eQ7nhYXH?a[(jFjjc$Y/Y8_n5u[J@\l>l1/30nrI5r@g2*s$u,,K$Xi86eHe2?pm50OD'3`.#ehkC?13`/g`hCM%ekW9o;e+&1]-B=Tc<>Kb82T.F?BWiFFU#:Vn!h=76T);l"]Cl3bGMV]4Wc;2u&?-q?8a'&]:(O&>p4,e6EJR58t$Dg@nPFUfd3[gC4%QZZ/2mn@M!L*=8E0+>M6rbo!?HAt;Pg@F!Pa +-RLtXUI7F[c\\2^kS0tk'TOHc$;Af\,k7Oc)6K0C92"JS0qh);(/Xd56t7e^::+$::?`!QBh]Y?P\Q9/)Su+\9M.S#P# +nRLp>Og7M]Y.o;!=6gReVmKd&=3Ea3%.0[o;)lnU4&&mbql$mqY#O,<2/=>rCUOq_f/:0QCQ?/sV)R3o#s(Uj'5Tc(JAFje.r],,@">?eX^ia(ER&/Nr*1?WLZ($;Xljp4-Ea)CF"M$FjBia5n'ENVb+Z54tdgrGCqTu8t&24!oC +=[-S=2@6ut-O*(f`Ii,_"i9t'=KXb77P@3=_Xrl^5kbE009.3Od0I7JqCsq1.B/E@1&?)ob]u"CjNsK(690K%Nj>A(t^VEV!M/Gj>dE4G.cM?+OWWZR0-4SJMq,-+L6F'P1NKnSr$8`RdHY.;PcBo)o'5\VAMlN6.LBAj"/D/Tlkb6Z^DVeBoV-+dgP_ql;U +AT'[K]l_iL_OEPKmqCmkTJHok>RtZl+`kKdD[GB'2\Lgn*PkLE.2R>^9PuH&A+qV<:&/[9A__jO[%?aI'5Ml64WhBu2;mR7>CBp#pm1_L<3O\Q&Lu`Cc1lk:*.7*uF5D>kq>g'L>n?E_q`k?MT3H-u=LlgqdL>P-fKl=eM=hHOpGmU'>hIGX4KoQL?5 +hb386?d,SK[tO]DTCr25h>>AKSc&35pO5=7-b1dIrnfs9qEN4'O5U'lb4Q6VOKV\J.iJMO'_`i8$]lA%E$4>iI-=2.)\!ooLW&CCP5,6P*'"Rt4U_jDn3M[b]#"7SY\0M)d/9X:m!f+:nhcs5uN!t)n*$aC-Kd0Mn=[dqf^&MY:50>Q2!9bHC>&Fh==:n#Rh>5aL('(J*k&N]rq-PTE+__@rDaZU?=d0gOV$5$JUnR,AD^<&!@FQ@HT&TJ9_O;:]=%8\2X +J`?E3UDH:^A-!tn&FBtrLCZ(1%r/]eXjI[@ZOh#t)Nb[K0sFG.<+_)=&WguOEPVJ!,2J2@*$R6Z1!oI<6O;&%`UV\'1#R0$hZe&.qN9"N.0TZ!h]D<)'T`h3dH_i.i>,o<$no[b5dMUgLcE5_+gHFgOQ[4<,p?c[T]!F"%XT'imhq3W)9Qq;#h'\\=W5T',`o,N;GdU[mh)`8 +-'A!Lmctj/2&rmG,r0;P;:cKo2]\'&-LqB_E/>\mK-h4Co.a)5Eemr)=HLp9.?])u1'fTi$ta"t7;?-3Z5*VL[3>%k%YJj<&h#a()?j"m*`=j+&ifZl4JFSrP7g;0E`DO+9aWYJ*AR@9cNPs7P:pdD-;\t7Oi&fVitF%,-ZX=uZNV`IHQLUgoWn8;On/p9q(^s>.<5ABO^Bgt +4XqZg.V9AX.]=8K_?.NX1pXY.nE:ch;.D6K^DkS416[\3d!HC"V]PG\.M@9RkjT7$^3P(o0"NicmYSL1iA@2nf\HoWZD./5-n?NMZOR@@3[R=petkl'%WTdg6bf\7e;#Q +F:SU4b7aE#33laJF2($raN7C/&oqbRF#Q/)F[JpW3]&PtEsX78SKJUm&Q9o&n>es^.j*6Z4#BGpn:s-d%51X0/7QE(JB]o]],2$G"*Ar]oRTNjSOdhi!l38UoRf[jk=:U\if$RRN\7UBhW%?i2`(k(Ec"G@[7bVP9<-#[dg[T[]hE@67?]qVdU)n%a\?m19si_NkF53d+gY'&k>HFO;R>OX2).V=GRi5\#1Yk81kSA\I6Y(:8ee"Y/SM]Ek>,sC>BLQnl?-,Toi:SA,m$"u2/-,K[jKU2qUA]('m)RgAQX)27Z^VMl4*O^?'p+KVX@:KnS>F$44p5`HZ;/%lE>jo!r +U::q=V)2SXC:3):odO6iJf2#-?K6iq5uV-5qY%>rlEs>ciU(#f,@tuJ4Yu6SU.--rG>]Tj28Q")p@&oBol"8YDkUl`iFd*g"_p>&.5qYa!C:]LHkA:T%2U%)i;msX+*)QB&L)X0TgNen%efW#F125/iGsU&K5Yr'FJ5=6+h/KC40W)Utj\5Fa&%T +GIN!EQ@4!:Km7fuGdiZWpQ9\InTKt]@PrWr!o,>ZE#c+DDrG@V!c)h^,S,k6Hag\8i:[Zt`)BaY%=l3@ngk-7e-Ym&IC+_8^k$qnjaMF;#<1uR=7Lc!om[UW"IK(:p\rn/PQTP=J@40Cp^r'-jp)^eJ[abJQm$megM3CZ!Pl5i`nuCkf6fjQ%p1uIpd'Ql]5h%Tn.!b7/PZ_h`>#Bc(/afKVp9*Hn^ko'*+-ahN]mV2BMsMR]dGpp#`#0ISokMkYWB#.&!n_0,k4GUFs\Q?FOIX;Vr.)0jtZ=%.Ge4`d;mNjglb_)[Q#LQ?]TC*>*\Qq.b`"cs;B&Xa%T)#,Lp%?BG29=X/(:'MM971NBlNIddG +\M85lef5OKN/JUA2!8SnE:m\O%XCc*@/Z?KZ'AbVCK,k03!W!^2f)O7l'BLNG0a.]e=@B-q1ROhTrKFW;@gRbR%TM-o!ARn6^`10F#X)G@$-m#_jYg6'D\^I3O)*(nTgC(3k'!2D7t89Fdc^T#arm?g!Q*:6?;j="P=N=[#PSME"WsQ5'aZ9P3kAc>^bRfT=O-4i4]H-"FVCS +RAn/U@"Y.41QPt4TsP#!es2'N]7r?UU816]H81#&#GY^]USqj@g*<(uZ\^L,M.U100-6RG<#S\*HJ$,G`i*#Wg_k1c%m"PO^k\g5dKM<["8XQ_UP&^crW\gJJcM/H\ri(>r[AXVPP-#%cjHdU81U,3#I?p\Thgr>Z'Eh&R,F#r\oJ(%BpPoYQL:SW/S18_J!Zu!)g^9d\1+>e +I_ID;TceuT@=buFJ#Ls=)#K;'[+U[6-`UX\N/b"t@\Oce[;,QK82tu,[X))\J#&e6JOe\H'`J,AgSL?o*=p?0A([8E]n@ZS>&,X`sE[5M$t_onj>=es'BV%au>)egia>\5t67:FT^pe2;CCW1ZJk;VrCr*a1/]t$Jo>p?Qir,FQ6YI]!\]!R$L+ZY9DRMOYi]?Z2E%\^!6$+u,D +_ZI41);^r5b-net])/\['J/3ibFh/Er2)M&06!2?^_3RsGCo&V^'#Fn55CC]S)oI\5V%1Mc+NC'qgRbp)FjSU/0$N(Ho[f2d>?Uj21.j$ge"@Dou,h:VSMbCr9k'K[="N#;>$UL=DK]SmmoOSG<`ir#1<>b!&u$(V'%dQ*bSi6Tf: +8%sSqFLs-U_k!_b"]mh1@6n,MqKLR1$spHi_:X[Q4@g+KMB^hC,*@*c?>r@-;8%EkL0CSqrh+#>jX,of7;egI'#H(ot&+rrYPCbnsPssqDoHmWTnPcJ[!U48CRahnZpftT^u).Pr3,V)[\n5gBb``7hnQDp!H_[(b+4K4WV>bS7rP%8ps#E:C4nD`f:9tEQ&(hR+ +#mGrI+4-BS/f>+Q_;Z%DPX2&Z$Us(fR+-"6*KN_O&fDCD8K1f(hbokAY$!?C9BHkbbg'o[Rk3_'\^Zpj4eGO6'H.\rM++1:kX"K4(7@(Y;s'/;Ptn;VLK3XTRakjOr3'2g()n!G<0":_/JagTA3k'Vg[5jsQ-SW4G?sYRS(6rrRD2qp(`Pe#$$a&?nJ;Fj0,]biA+B"MPLCtG +b@U8_=0?E-S^1s@)BAA+8Pml7gH(HdY6D&[C\A\fQH1eg?>]>`*S0\)^#*c'*$*a3M6l5^q%H"XS'I)[A[uHH-=YCAK:c+R7`;KYm6>3f9@[/4,:@ +jcgPF3Q:>_SHEjG>8K`s\4[\s-Hl=7Wj0D?%7bEt\:Hu0!m$Ua&gUl_M,HXu,r%/aikA"TJV,CBd:g!>0[adC\$?Y-]#HKqRklcmCt\+$9_1VBHcF1$eMd^HKW-t,F/*(6KZ>A/pdETlq`d,-[0&J:D3-VB*4/,dRnrZdUBj`dH;u-s'I>8&;X*D%9es(U3deDTO\&5GFX9YO +"I2C1F]6G9!ehR(;9RoBNV4el^Z63XDb4jhEQ@,#\d]3`Q-V4VJ0_l_*.*YQtj-s^W9d'9acc>faKfk-qTDR=7KUq2<9V5P??tb,WB$)Mfd9>E&U?i' +)cR?>9p]GZ2.r1ODOk.%./B-4NjkD\HO*jH%>bHsLj"KI+EfY\TijD0>,O-_d#"T6HD4!$]sc(_U2+Mo]q@]<:9's$4!i4"Ynq$#]SG6R`1e-=LG:(2?e`E]J7)UD#lbW%#2R+7BeiGPBtQqKQB"(?$!;sFL,Hq[RIqV=o'0%7a)cR)13)p]S(j6.>j"c#7R8N_d+-Jb +9T\Q7G:*T8]qoqV_Kn6fXs&5=NNi*2/5+YFeXqEQ@98+qkA)Q>GNU-bT]pSEEBDi0*XFn5\#F='Ga^K/A+6;?K5ZUkG<((jYV1@QX>$di=c4 +7Yn2R_Y"*O@?\l[M!=*?GG>F9q9'2N.2A2)[.t>Uh/+]N84*A.)5:(s0!C[k5)7RRT3LYUn$qNdaKZ@%dXr;IFq2L`qCH+j>=JY91I*q8T:l#5HNPlU7eDXs`r'n/m-'h:(uZN7P7.h\>j4%X,mMJmBoR'M*>U%s6".]g6c<.-_P\)B,#Dm4;H3OEGqcQo\Yb+cg)H+;)'R/m +eckW1"U$8N\`+#k*Tc4&b5#HsAX'Ne!p3]TJ7gK9[&f,-jsWY4`t]\+pm@6\@NFF[s.m$F5(QaI7ohO"SkYY#fBYG>Vl8._K\7Nl8,&+Ug+!+'tKF(?Ak +eErI*/e_'E]c>&i'+Ip*\\ptd/La[MQ32`*7RUr@$\YOWPh)=&601jUeN9[np7A,ab>;pg6`=UWF](F]PP=QP<[)m9?QFQs3SeVc[^LA#bULM(.FpWsM[L*0@b7f(/kL/!6*at;,5Sd*fi5Z*)4UJ)CDNl"p4A=NY!JnGWe;L20Nl".2eF!)?)G`X@keM8`KhVVQ6I;j'=3iEc+j'6>Y=Cj`aZo9h9M*%DClBR@?QW;".]:>!W.ns\'+\+%nS?PJ9-2'+MiG!M31WB/;eQTDk#X_Tc2+kl1tCAB(P\k?G->tm>.pZr;8(\UmB_72Qa5qK)J^N1S1M%$Xtd;l>G4NNRBscJ.N9O)CXBo'eRIgqAQ1d=SN(H,.a!eRjun]]p(P`Q(o/@=,%n4mAbd[4I^J=0G(]8\b$)0&TjTJoFnM_9B)/"8sSA +2F0^Jq7`tF]*KbWieiW65C;P#MiMf/6qUS3Y4!1Foo6+O@!P]b5C%n%GlJqS4,9$jSla)n:F#"Lf:/rs((!T0?d(EP14adB^@Q4ec;']fkJ"B%SQd\Th[`)c=0o(>?OM6#JBU_n4l,cJF)#QLLM],eWP\AtrLN,N"b<]V.*k4E#PjkTDO*2HfR +mh@r7l0=mjn-:n5VSLm_Im)K%hC!s*I),sYO%&paO8BA"h4U5CJK)ui]4\f-RQWa%]hq9F1Y4m:YIXG5\d?tOUVn=dJ#oe)]>5A9dUGoK&"-:0K7"U$;> +pj4Z8Q(V@[XR$o]X=F_g!2,Iu^af%C3X%Z',f!QNV[;(mKJu/XYs>#35dJA4@Z:K^.4aI9#J8k3j5:jO1:?r^#2DO/4;3Kl'WG%HLLP_*R]V,(FMs(L.@_9T]Gdpe)oCg`W]3>`lo_?$,=MtuZ[3i^'#qe-R?jco7/3CSEQbd@R^T4\(t&,0>ZNA&:4t)G_YDHlapCDg_8Od_ +3C;c$C*Z7-]#-9&_qZMm]NIU)5.tD:`f]LQJ?ZqRd_hfu046EPls$LR3(F8#2cTa@[JP:5"A438i7E:@48!nG>X10As?Ur;@[*^0Gkf>4$?l/C-K62\fQo2rE431*L86gm?CkkQ/Le*%X8=YQ.XG]W^N(D-m!qHYKCl_*nIuN0E%)cGT]EKWb&#"gWg5Xi`IhA8;(%"*Rt\BClh.SRtkOeeD/ +/B\\@ZV:^NL"t*A'*uancV48"[UcKe1Z8HNS-fC!8bC?N%*kjmR]L1B:#+C$A:ao*d7t!%8dqDX7,^a!T2$*!9O+Jj<9F[SWM#KUaaDg$`2pD;Xig;'$#Hh='XC1BiC0aM5TJiNWA%*tSkaW2"Hj)'[(M^KElU!J#N8r&RL+W-r(J*I-%s1^m!-`I=IdMZ'V*5nPfZUd`ltOL +WZ5#4f[S0UHHrJ4c?uG4+C1^0e4CA)6-E_/WAQ!C)9qB_[f*)Xs$;;E9jm2i(M(K(SH[j;AS1u]XBU.u-h.GZ2ir8o/V-I*=hTNpa'FU8J`la=ClcJ:)XeJ97&Z%[S2c3s4cV".Df:X;0\#F+m=3XJ5SpQ<\pbMbsJ;IptK +h$#A.:Y9j:ofjck`6:fOU-Ul;KLsCHIaC@":fQ/K)"7RV#6rEY;RjltN1SD'k*$4(btQ;T>0b6hM2!l"$67[F2$MAoTZtW[eI!QUZD#^[92M@R!JO]"RhSk]Us_:-dS/%e>rG^$QVr,Gec_r"RKZTh?dP&h`>_ku4YG%90;"dhdi>`t8dD2%'*V&QJ9+gTOAtbj<,GSJ/QF:)?s(ZSO\Jp(Q%@@]SCO8Lf@fJoQqK;>eZ&pU]u82:PYsp0=TpWbCo5X7a3!_:+.\j"eOiuV+PG#1-l&:"ue/-4KncJ)?_>A=K!ICRX`IGFu`\sQ`,d%__#^KtbV>RGo7*Q$Sog>'oMgg-&tD3EdV>p*-R9atuBrKeXloh"8iT+0*#"fSo*6.R7KIB$-*<2?1m+(mGQ2WGH55&,"8>766TZ87:'MlWZC8q +Pg3K-JDQgEfJS=]h76Wns0<#Q?LX]#3HNW^MV,5drh*A#`s(h,!\k4mLEP%&)d\nLKV\!atb6j,"LR9>8;Obc6+SP(8+tMhMrH-Af9?H)Q![l +@9j?ul\u:(HN=m'$928O/k=n1ngE!4Tme5d%OC&XT&4+B!oC\OW8iS@@_)_SJM:Qdj5TIPfPKna%PcleYb1nN_8\=Z[KY].-=Crf@"p]"ONL@U+!E@0;/fJY7D8sI5L\a[i:o$>.P`B-;7)N&7&3GA4u`tj8>&s%c@+:)@=8=1Hm1pIk(RYMN@T]`J7TS)"%IlA?7O6K +RgeYOYd,Ne^g/Q>Bhp@.$sn+ZrK/4lMuqQEBULK+rf81ic\ER!koQ!RQt,AA,\X?@/G]Z0XNF]e-Kn18`ca&QAt'9LB5,Kl2oo%`iI(p=TN8Z@k?als/0^aPOUPi<$G&\@K+=QDV1?`kk7)TI*NRD)118[UC+bZ_2"KDpGb=t\c?3K.p51<5LM,"&6*@D!I3R+O'PJ&RAI2@L +jJ1I1Koo,bkJEd*0R2h7^a[!UTU(Q'$<7nnNs,HD*<*ilDT?HNA"]5)kq5G>@Kl"8a(t(IBS?e)5#5c@S/#Q-Bt7"'aCcVo56YZ>/c4;R^7oIh`+h#c+J,Bf?DX)?7$N3BmFhlR80/^6%cI&];tujdRPFp3jD*Oom%puLSXPM7Yb.etc;q7:1>ck>(h_UglYbm%m*FF66#2RW +/RH%W^:ZoNL*;;,Ct>4q?GgRt"mdk^CdsJYQB:QYr+N7SC)3u,(<[h$bYUp%jCZ\N72+bL:[J1BD'%+=B%(Ta5B"]5m;=ecNnA<\\a>P)l:"lk?S1Q.&4;DSCMdcF*)sk1td\9X:IIl1qfH'QQbq:_COK7e4Bu +o>K5PTml\(*p[d2Omdl*DjJE3VT!J^`cB*S0n0(oP`Gi`(t;UdTDnoVpB!2V\*uPl9kBh]=\j!L#*8K`TDm@3)'s6r"i)2gF;j$#-DR5?g4t_"nHNhAEj(2&,Y;V^A-WfP]c_lH1+^`flK45sj@ee@#p>QS>brb:hR%:f([fbXo^q3YN6d**=P!AOE3]37n<3CEHJ=+K"$1R,l@c-:$u?enX!;HV]-]g;:Y%kp'R8Va&MU/f +2>On7H-,ROhY(AR3.&pj0R'40?_[BU4aKV=qH#EG63$QnVsT7_qOae^O*Qc4b3oZ5FLgs[&$XO\*X+;S44CmB?Pn#0MH"em<7q]$;om:o]?\c[sa8145bqI,,p&"83^!5cu!5EIkmRY.>r"0(@ca4Po_8iW##f9E.-sjd;,V\gSY1(,q_opMM&B%EaSq4d6 +4'jL-;'\R@Sg=5B'Lkci`u;pZ]Q"pn`]SMaa31_T+NI*%>o+!V4F\Wu;I#U2+i@QXLX"R/h'9_+p;d@u188F&*1X8S_o"D8K]^W`ZPMGstcdVgk`h-3N#Y*1iSIhBRe61TsdFO9U/"/0e.;rDHtcCCulS*EReK(f?[rQq*"p-M-NR/m?!SR;&N;Ef[&3,BZB`C>m3;CS/lF;NKJL!bKoQdWn*LTfb7T<<)bGSP@6Orh""=[GhmS7kd),8^#(*'GMVR_8E6iDJDaNJGRWNIp(1Ng8%'7]iRiT&LuMO..>QlL^+kP6R,/,X9GK-(OO=ZUV2iL^:.:E/=^<+q +AXQsKR,lW:#,fd-^2ZDN=krg=:m;g#T]U5[9;:PD'e,s,FN0`GZslLuTuLQEWDVQ^,u88;XpnO55BA-fVeZ)I`EO->oIt9%<@qdaD9hWf\Esc.V7Op>FOp/RIrJUXR5?()D9+b\>p!5#]ResJ +=S>kB0oG\WO(mD.R+[nZ178#3cI'0MI+Ghh;`WfI5#7H>Gnd,b8,00c#-m>4]^MG=DOpFJj+l=W[K/&?9c\'M.5p[#*k8G&ba-)Lri=GQ5I2clLD+Jt:(=\#!Jpf7S'b3/)@/UFLp7(-J8caM"=sT7iK&nQJjn@32CJM1b?L'\j`/DZ6H%uZ3F3Vc +]t?]LAIQT^229K7*(-*9%:PbiLX=HiT@d=JQp=t_ME01t\;(^U4&cQ^H71LlD\U7(\p#dt-5;esRpK%3M^9h4]_BLBhIL,TO.=Q[(qrn>WFC2d]YH\?jIY&oqAKt&23jh!*mG[7N=R3*8/"`FA0cFQB^fNH85s2.]5N0H.ROn_qRC'>["'o"Ud.HZOPn;c%aof"'HrYgeL;aT +0ru>:Qn70+l+C+PE9b:(6;_.sn<1*4YsN/::Z4tsKp(k352f3ii]F)DDQ#Ti)3iA&J0f$Z;;9'&Bbi%#>B=]i02/Zs(g]UBI&:e"7X4oF@oV/0OgK>Q$.N<,S8sXcQq^=bIfog0iLFa35u3\68d5^p."YKM8?$Q3,\q:[oD2%Z.L)@f]`%u\Bi6kB>,hrI/>CSr("&;f_M-d- +JOQjPPj)B1AV&9q;u0\E\JHlq<5!sJreFDf"pufPkbcfDcV/SK9W@$.Da7_RMA`)*k*$[OP:C>p\@R-%Ph]tOg2Ke)^HKfrjdaeoFj?u?p>`)^X453LrVJ9PB(PJFlP[Mi.`sK/J?fL5eq0(tK_oAK[d*N`XY49Pg\n +.BbE(Q:r3&#jI%ZZc[Y`g),p]m2E@"(4Oa\0h6!D)]#BRBoYncR-EDmfpbu%Ut.T'<9g;\RoNq!`qm.;USofTeAt9fR`AP>ok(bMlKD9c#@&gnF'=j[F'!I=A^&C.T@NTm;(DX%aUi3V6AkCg5dPds>o5(6Hm?YgbMZ5&\QcG$!SD%t9SBQDqYa;XLdG!!(.orNbkHs2EE +)mna8b9m&S9rUgV3%"mfg`M2gSe]-;B+6IT,+32&/#nX%7@QU/N)P>P6_da/j4)_'5?tMKU(oD!c8U%>PoHqR%I4BaWKt(ph6_I$P?fibQu`\nc$A:/QsuHjF<6*g=4k]c6E?nPkg>-^:`S`:4/d9CV:6QISB;>.>9S'//[WH'talr[IW^m_smeqXK2?(QaVk2*$bV*U)lRK=KJ!Jd$n'-.9\*-l;+9h:9p$V4#meHLp\iOR^dA.Tq/6R-jlf8GUT#b'a8[qi=4K5mmZ[7XWN]dZ7K?DuTi)[#fhop1&pPYAP(NEd^`,)DDs0!kA"+h"X[$m&u@D_/0\qSi=0iq3+E1BrGeqo:bq!haG(UmjWC#K"LYlr9nHf'nB8;D00i#6sa5r;L0HriVLBcg[%Bo^f9]oIt%4 +TQ:K,I1),bXNsr?Yd"U'H;:0nbA\YnDNP!7me9M&$uk&Nn2CHR4P_\V:S@e"$J69dpB9ta&&UF=Yl_<5pCNEm?Edl[0P:k,Ym0AO#;5*DBpS$57$`6#qmS'0.=&#/ICU)o-+=0d&?@DXT-Z`ZbU,f$31^7W#[ET!6ejP&R>fRCDW)XP].oV`gm1YFUeuD +:CuaVOR,bnP8T6g"OWhSN<^!aVDE/=Zf$l`&If$M_YY_R(m)cMVN1s*,ohd>)%k150VDu"ruHq@#B;e1E=c4@QC^pB*AL0-O\Q)m;S@">'p64u9]cL/$4P9L(<>M(&T5N!F!)#L$kaWucYX+EE=J![%FQ1"Oc3'*OUeT\67a/[C1IYA7iq-d)NasL90X[&bpA<6qXM)a0teeC +1E7`K#:\l+5ZK1/8KC8h*f.,(6+87:QD-)trW.,<;=#i2nJ'=<'a`t::>[/aAq?#?SrJgEEj?P1[SmeO\^8.n18t625qJ(-Q4VE2:t6C0Ri$1b!HL"NE]Dkdm"%d]Z%29gYb1"(;oO$$;PBeRRQ*.]CaMZ"k65q*?+'Q<4b +LH?STp^8hSA5E(VkY;9P_9fqP:FDQnm29Vpd6(FSF5AgsY7<;!_#p)Qf,\0/Fh+EN'lWNjTC^&G$&:o*H!b%60DS0d]rQ_$rLur"Kgf1'a:(7RCc2Y*(6u1Fp@);d5j"ZiX7pq!3&$l[c3Da6S<(7k#BsJECPf`-pb=)nsXh<%$kia#:+48l*Ui#@77#c$:saqN@ZnbdS\Ij7I"=e[%fNJF>Ph>!0_C21nO/DUJ$O13jX4$'7bJpof.'#kEIkY'KRsY*DMdQ9o$JFM9R:LPsf_:8?bqlX&(f3 +&>&LMQNF!PeBH2]^JKacjorhJ.JsF9(/djTC!EfBciao^k.?UI84s(`1p&:Q/P,*Vjj^AG_)G=n"K/85"UgJ+d:du/=&kMii!3W=_c!N/'L?_GD(T+qSR:TK +?oA-cp'G@]f_PSOF>b:Bp)e)c?Xd'EfV_)Gd^N]e:Lf^FD:UjdbQhZ'$"RNRACaC.^rid8*AeA)A[D4Re`aCT$"f0c]9UE`XQQMReQF'ULG'f@o!Q"m7aCA+kh2RRNsGpbjW!nPD#_aS_aaPHSkbj\dNf$d^BQWP$VD:a8>p>L2< +4`4a)DRSqMoq?%+fdT5E&%;Kf72kg!;/6jlB!XZqIq,WpX;]r`H.p&1Y4lhpI*lfX`ULsFSATgpJlPi@l:]%Cj*d@F]WCgp9c@.G?3=?(_^$S=b)ip+@R:\G"6g7fYpK[L=TF$f:_!>*7Fp(^i1lt'!E!6MJe=&gpa.`IHEEO^"le!Vpb^EQ*8^d/^i;;d/N\W0&t;\n +r:i(2=[SEM;1#'U'tI):`8b?^F9?1\HW@f8@%9<-YXE1'DM2)h8d:*I,;dAM]_*@oO:lI]/VG=eh"6Q$9b,Rb72!Fg`,aBq(O&Ram=aF^(@.M4?KAQa"5fB?>`_SWQ8X%QWCJPLks+5EpHA*R<`]@,%;V1;A%;Sln2hU"\9^l_'[SE4C3PoE_)> +9mpmCLku6MqBD5FScmGSn+gUEpmir2EF7@oRolY[iRs+QQH=YGOEs^!$PK=7Z4_G>Mj_JN$'go]_eU-\UWMR.H?5NhK:9?kGT!`R=gaa1L)i='=BWgIHAl!1O]AtZT2"U0H.Pbng+eW;Xc_6Hq<)\M%8WfCU;0m=&@;[&q/H-fT@s;kg'=[If<'[>PbQa2(egRE]F9NtI#7G@ +J]s0_5*g.[(&BPd2^"JFop41*UR%mVl'8%^c_P9>)nR2B2R06JB3K%ZSsin)RZXHrK;Np\VQ4kkH(Kk=EY*P?Ql:=N<]R)bK;_t1S"!:r>:(A;@CB=,WQ3Ph):^_*q\_rgH_u;&"U>g$;0T9:Xf9>>Zr4\WjP0@UCmK%(&,V4rDmoPD]%WdLR6G.RJu2bJH2Fa$oK\W`_n;6% +S1L\;=s=aSY'h8*])+mJmTm9/@AWX$AI7Gc=;APsB=0YM@ChH5GNHOE=qFpWAX*phThi)O-_$,^_V?f^"Lb13>Jcml_qL$W*(..rpTf/$;Yh;CP2c8KHB,Uh:m#uhTn;d9WPWQi6TIDIp]*PB%;r#-,O*a]m3_u!`W*.Qn-Mt +>csRNdE>]QC2)6"X;8T?;,>pZtRq8L#uC&j?tM$3-H"fU%h1UaCLnWV5id#n(-f*I&A_En; +g$+jIf7D0cqoq\$VkB=<*OF$+Cn=qGS,L/=r_e8Pb%5rDR[&H\&S^'LfI)(T>CMe$*TbS;l(#I6dKW_/>ppeC/0@6-,RW2W*XCVZ`:EKr/;m@N$IGdLS8 +TWO..k?<;gM.c#)XlpZ^gf\`khM>`LNMiA1l5l;=?.tq,hs)3]l3U52ktE,OrOL[i;[Ak!Bu9[\dBZ4WgPn55ot9J=&'&nK!D.5"kFUp=R37i.@!NeP/hCO@53_bk*&rThJRq94/\:qo^Ri*S5AF6=u8B<8T`DFPhL7Cd8?lBlBN]=?B86kjofg3#Yume[>;`"u-FI%EQIt!$iGlD5mP=NQrpb9*^TX!Ylh:DW_-lc">W*JoM1&k'R)ET#\WP!Ei[bME^G2/#cYhFk +p4#B%d:i0@>lEtcWRMnFR8%k>,_aocF^&(qCN6o@DY#&8p;;HtMPiG&D'dYn.(aMFSDJHSU!`(D\t*-(gJ`:F,!2;IpO4/YnTD1O.84g--uJgtrndsp\4QLA5*GobV/c>+IeX;#o@!\)/p^tD5EIZF/AWiY(3R:S.5_Arn<1(p6EY/4OWK[/6ceoY/*_X?=NY0Pj>S`m#^7f-X4jQn^Q?Z]fXZ5-qWalV"S4H;)YkFT./T<"lGu[4UJN6oV7H!@BdZjR@?9Bmd<\;REd*85h)L$D5M"aELHXPPGki:='*j!=0E?71$Z# +\YiP.9cZ3c5:+9O2S[5E04$mu[;d0P,0[:!6-1Ap9ir"G.W.kE,#'Q,$ZnmM:^-Nq&u5/X#8GmsA6j&FscO'f;O"F*nSVdD0[X;)>=cN)CCcmU5(bPhH]0-lYU7Y>e7lh;T:L%nBM6/d7VS +1p/WnA>aQ4Ss^JI#.&.&$)B9)XU7-9Im93Z)V4a!0-/k+*a48'EiO''LEOfH+gAY#njfBpOk_tr^H=7%off7)Jd42#T<3t?rE7]D^1n6JafHb;6QIIsCCE]ra&]@Y((`#Uo](4kn$G,43^'@aqBEk#1'_+cIpT?_DZi4mW&qH$/WB$I="e4p"a4Th("EpJ=!fs>sh +FcCB"gh"hJl,\(^nlFkf=f5fCk_%c/huqn7;Y!;*j31^'5!lUtqRn1<4',aX?`82Jp8RG[>/)&cCS(sEYJpMh)6ka*iLf_O1)Cd[D;U5WqL9q'/+A#Q3.ZS`d@Uh;r)#m>#B3Kd"VkLO!D:f](b<_HY7dT/Qg<^K/Bpm>7k4gC':<3'BZ<5L*+X^b-Zi-j'cKSuD*cB!KVlCQ +6T8CYiG0BUMCoa0LN"TsF'*e:"lHs,!t*j6SL+g&*L&h,'3YGcj+@K'&k6=cqGB??EGr4G^A->X`?]YZ`#sb(;DOI]bArCAU,'d+.f]\\!b]pmMSO4+!p"CnE0;W.5mSb>b&L=?lY\P`#W/Ddj;r?'Je5dBoGJr3Os^=J +EcV6i+G$ITp!)/)Fslp$\r$=Pe/LtuW^`\.DaAP:H-%q9j_/ahtbKfQ+g#[i%L&T"%%PPm@pUg[0+NZcD'XVrJ>>=(,jLW8C6*#fl<,SAII&Ts3XhmDtuEV`A*B`^@D,jLK>+p(Ps)'e?"A'C7b"uu%'"Bm@khrg7I#Rd'Vs`8nLB5fC*lFq>kjkG??\\X[/6B\66[)o4O8L\)ATTP)g4DSIog.e9/$Hom^c35UG4+IG6T,rHfU=O)'-ir:=&=X)qtXf?Cb)k<)&D.')a$M/FP+ebqs=o8r&'Jh1n<%A1pClM[+cDXH0:-bShuqhgFQikhik=!cn?eDXJAhdT]sVQ]kM&B)17XUoTU5D_mug]%^U\Xg)6eSif*4=2R[QJN)1JV9^HV8ApSY>20%gXaM@;@7G;?s.=qHNA3f#?:.(@:kK8pBaP``K'I[)P[:N\F^jP:_1i7=s&^PO/\otSBE8hnY\U&8>[:`.'QY>e90@3GZ$Hj6-_:R&Rd]T-,Qa(VV.i322u^b[ACfc+ORahD?R_To.QjI!pb"AX96S<=WmRVf^GpF"pRh(!LXAG.%N>:)5nC]+*I>J&NheV;p)_9-HTu63ICH]ZT"!O&^No9>crg&`"GV(Bb9=Rna7Xp$h2S%oTaSXbq@q96"cmZr6jM?@+(sth^UNlbpYYljL[fgXamKk6FU59ft!Mgp9KP7e7E+,fYniU@aL:e/#Mphc15J^;6_.4=tF;McH'u&`H_5&!cZl?j"*5U,D^FUG>aIP$,4h_UR_BIYGlfSTP%72TlT+M3aMglp2NJ@'S[s/@cd3h/Bq2%@" +6K3\&/2+cjqNeWu/;u1`dN6:o1rE9M_dR(CF>q*j308eO6_lc:l/_q$R=f$5^c7Q';KSl@"uV$fQf/FD1K;/YlbKNJ5e6P-F_CO<*t^=5=Q>NLL`W88sR=, +[D6i'Mei[;5YX53'e*:A7\je=Ztm\"CrXtA`oM$W_ltXV:Ic*k5m$Sp]M'-/E^s):7prGeoMA%oGfPp7`@4rJcm2-"H,n9j`F-2BJNT>K---_t*<7a\Ub)mGG_#.7Vc5._Qu>$J4@XF@aIo;]P`*O,@k!pY\Qc\cA-bRar=j?eaK1P^dgX8B91M;P^Vl=-E/)DY4\:$hae4O3 +WKIY;>6=GcaY\I'Ck%JE=t1Y17fpsO7"`QGPlco@W)QlP`/'Vhjp'&$8t_#pA?3en#K-[t8E7k6o2K5npdEPH4h%e&DO%&%pRiZrG5icj`65c/dWu9Y^s>_'VHC5H#[-dMIJVdS*c-L,A%k;--@,kEV:m:%X<0W2WJ5F@JAXbj*&7>d-p13"3$!9f2.W0Gi&$"i1&$9lYH2I.trD:sG[":Q5.]%,@:R]UE[66KbhNNq2Md%;<""i_a4aXEDdLFdH^[+n?EOXK>j%UhDV+!X<1B<&uI'\@V">+-76_/eiJ>cGW!NQ1JW$']dHic0ZVA3iJ9/mUK9\.=7+f4C(I0l#BpKn!2$C!t'b4F)sdl(hI&>$-c=S].8'LhbX4M3e[/g+kuhi(M_DOBC4Z=RD.W)k:)H +*SD`B>0X44rKN>iQJJEBq?I#^`3:8\eNg<<:o.@#I#j@7gc=cUfp#aDb`@1V%PVI!p!"MbZV/`6"$P)=KUiQ@\$h_Sgdho'<Yg>TIZS2;KF5TEuWXgi[Vl +KufF@WnmcjgprX*?0@+,c46rc!sRm,FjX.A>_bK0JJIUZJRi%\eMg#I?QtoW^fi2R`!3'N?EpNJ`70P?gfc<'Te%\)p"n>tD;V&<-6in&h2TFrL!QGPYMBiE1,REl4nh`h/3I`XmAj+=>.je?WHUQ'1'iWQ%MOk?suH4*[?JQ#`c7;@R37e`?6JO'JkAY%B^5MSE>P]R@&]qLH;#^%POdM(?0$mYM^e?=l/+T0q,51;-L55OVcuR2&'I#;@mhVaL#=nCLAb:$A6EW>$5?t-=SDkj:2l5;!Nl!1?9l'id+[sONcaep+S!OW?l(924Q+/'e,MLAE*W\Lg&4R +7?B29jX'q]P<\)&;&?Rb.$`\$;.UJ`I>*L]M`s8#Aj,26^uOp+aEj`bQ<01Q6&k#7?`!!%Uo@i6@LqF+2YD525#e`8dU^'^k&tM%XkBZR0':U_N@fTk;"-fRo=es);-!h=.NY6m[q`d;@6Nf,ksl/kQOJB6pYB5.=ekTSD8`35/@^`U[#l%P6o@2.kOe/cD37oK7RFKs%l*e4bk.L$,OOatMcTi<6Ga[n%Y&4-$Ca'gUQ(@2piJe,B+b5DID5aCl,JN;?82+DOK2GY0,`2aFoT`mb5Scii`oJhWHUp!uDTOn@3Yphsnrn%QDPcJ.a&`_@QoE[M%[($BSEDK%Bn0[B+g0&c;5]P=UjKHm/Y +pBp8b$gOlID$#f>G7MT=onR4[>('4W;2?\&,h/+LD)W_sR9)p1[16geO&$\cE/*QjO(lYK[a/8h@;Cp!70K#j&li]g9)&aD`&:?:480Yf;f5LX[l.(o"57>QKr,W?BsLH5r)4)n\*!SO8LOQU]V>49=H +Dq:GWLoCPZAA;e.l1UbA:*XnH>BFcjioXB22[%?rF*+(IBWK(XL/W3G$ZtONKO8c$NIH!d%s&Rm*+C_;I;&1KagcN[86)jDHHOW6gsc3q&h;82j=&-PkeCGq.H#hD%q8N +R/*):q59\W\!Vd!SGCd-q<+@FpRh9eTGA?;qBr$62l$4>V#"/hqIc]%GGk:mW;;j[qPU@i\#]AGX*YT=joKhR\%DOX]_gC@;ur?,*>^eg84@#f?B5j?$^_;rU91Rp[A+enG>l<>pqMH1r@!e;076]=qA:GEkqg[H%\(uP3r;YC+H-??+5_'oK8N7p.%*O;biD/$92B<G%6DV:Of*]O#MX]B/SSJ&#H2=?IP[%/.VKEEKkc-0pV!44!9rHKUF]uIj[p?2iCj'#GVUaM3ghq=?^#o';^Yj'THWP[VM9"[kpfn7=0:gGI`M2/uVcSl"lum_]]oIBsamXJ%?9]cd\``U2F?X&E\)$NDB0KZeVpjW!omVBrD>u!Ys1f0Rpu]@g/.D]Pcm/bm6',n'#IZOS@&S,LF7kq;b*lns$-OE*Me%GO`CUB=T0=#Da]WdQXUqe\)],N9D%!h-]99STpH-$St]ct[a/BoupYuK6330(Yuo>!%Zf'#NNS#\Ko'?aB1\IZ=24\uXDrB\ekAA^d^%.+DmcnoQq$;T*0.lgL,X9R$:e87';bk-7C92\W?>^"#J'hqWW'hbH$-"D/"(M;fM(*pi>odGSl='aiL\'K6EP36jC@iqT*.MU]/sF'ZhS&_g[Rd>gbfAMp!-QK2/.++.2A +eWXQIRE>,7kDT;6C$6>7YG']0lJHl!H;9_]A'dZd$0c\f!D6cZAj**Y%5s=%?hai39l%?KbG/m4f#7%Cm`oBbl+!=a[agjoXgIM\#1j.K(pmXIj>htn^ZsRugQ5nb"A>$3R5Rp[6sN4uO`C;1A%U^J5&Hdlq:1n)kF)=#BkUZjXeP0nhWrY`%;uDl@TP2Henr&0("DM31M*od +PCCj6k.<9oGkW6%B?E+1?44;gf,bOTG[>17i\fRe?+nf$D[X[6*m,Yj>[/NRm6j'[=iFtP"?l8qS+e0!83Varb?4\_1X/Mhje'k?o"RQ>9:[ENm@JD#Fmj;72"p5$)JcWe0F(l&SJu(TW/+8^3ZIj+F]du\L_:/Ua4/]_cD6+;E8D\A\9/qQlS+Il.1sV.bn1XX7Yq^(,paCr'22A$M?Zg)0A+;dAO:X'`qh8F +Qk7-JFab*fdtCLBP^PFd^CTE*8r_nQ"X>_9K5Hp*b<$FZR-.?:hMt2P/dbR8lV$gtcqMJ-R/OemB)5C/KN`"L0)Q8?54gZ,j +7;+$\jk4LH8eC[!qFaK>`6"kjbk+O$h$If%;bour8Od]-;G*1!VD=fYP5bGG'K=6g#u9GE)Delp=$lU>MM7tP(qWmm^-@euq'Kt>k3b5^;b&mr$^IMV5E53qlkYI3Z4=B"BjVr_Bm<\DBogDsejKorZA3lG,.%&,8Wm]J-b +]">o^Aks^oZkK0g=.:jWkuFUFerJp5s2u9HAc7orto) +^@`7\AK/#GMC3hIda,M\@@Qq>^MTRY%B,nf0^;k"!`81*#6=-cPg:e!5<:K%`\.GRTE/dNDs2._)Np^fSeKk1-P!FR4c21/7Fb5L/G\Zmj9r.rh!tABu"q:!or$>JhjHS_2BBXAm?L4YiQ#)WLF:XPi7A'G&`h0;\.sTVhhT),fJ5#'OmPuMXbQ1\l[bRk%tR$lW-)E +GinR1Xpaj:R3ookLFj!]X>b6" +ep',nn6/2^2ACDfBp2lmQqP?,LCDh'f&'pQjg&sQbEKOsB2;Gkfdch\]0V7R_V/'LLfbZ0=/E2e(TaF+76O%\)0s@kC*Vjm^mt6jaLFX3IZn,rV#i%*c$qO'u'1LS(MthXl;Gi9W\MPB)U+MpVai*&g*2*IUC@qs$u>P?a'0PhoI+Y +J=Z[+X835hloDi$&o8oQUCn0A5M-j/ri!miY(+ADrGNru'V"6$'Z/B%-538A"1):21o0N8T[=:B.R#r#`l0Ot>`BEW9j"0cbI0QdV>Glo0V#OlO4?s#iO5>+Vb<%kS6Ck$18;\",I`^W"'B?#S=3C&@Dan1CKjc +$fJQ(+[lfKCo-*q%,hF#+H[+P2?_BO"*!3)?s3nVkRk&d$/r6WO%;,0&/enB&+E[45f""Ned2mu#9ZqW0S9T13sW#2#Co5U0S0JU-jT8o#iM?bEAS8i3=2qZ[_ci!O[L!?8/2_2!$[X?O3S@-=TK+?!9&DC,?,D_Bbg/T(@cA\0m*KU0H)0>)3KIdDo`nqLdCAi5!d"&+UoTW#CoAa0KKL0Q4UmC)X96?a"[4(Pau:[W_pSP0uY,Hi:eZcM9K4rjLDs=o_NR`*V&(=/'=R1h",==*lSX,m[deUi_]#8*KgFG.fR1\"X()[+R1Mln^Se')'Q:++n=(%&cV8HaW7,61a+.i0]`o;3?tgm,P",G1.;9F0dNEI,iKOc+i>U93;(6%rrL=SP%>*.7jbNY-Lu.( ++d"-gM'33')=i:`P(b8;G71'"-:%>_146:r.\A6L*-.](@5ofg:F`Z,.e9hH0YR`8U^XJr*E']qAb;\X#T3-W$NP`.0Q[M^fbP`[?S]^1bRckRE=ah^"*2pEnrYI(e:&$8Y`Y(g!AuQ?aX32$0_0#aEtf&s(_r5T09:]K!Rif5O;25p%WY;MEpk^r3@?N/&7\ZjP<1UB8Mmac +0u6sf_*'Ys3#^7O+/7bhTf4lKZih#F&V2Gk.iTY*q_tj02o=euMhrCiqCiN'3:i7+$0^c;G4!^#g26('F/:#jY,kR"3qKU<1(>F+[6!^,40uaH1TJqTIlqJ\3V/o`'@AsW8AmM9nm4>.Q6nc18i]0_%=8E(R21Us&rq^]!37MMO$E7uF"oG_nR?]lt^Z`Y+/\HTdh5np(f0JF'&a?Ggn9N9D61-ZP*=u2$3'D16>JZhgi^sjM(:@nf(2"WQ0p.J>6:\02u +:D5R[*SPgriUYU#qW*Gs`0!o4%\P?4$/-PS6P2*emN.ONLj#8CJW25O@(Q6'o%-"4[t+OgJc\QJNK0(eQBZM:]2ZS-i;>kDA@d*?$kT?+&EiG%#!+BX5$'B!Rh'[W,'MWkT9;7+PVbokRFtDcJVQ]s*2R@4A01.XDZ=>?qp=2bl&HP22+h#\2FF4j3;/Wha=S*jCdWQK9'g"3P'@bA9pB>2E.:)4!'LA]1PbT,Eq"h$8+MhD=f'c[JGB0s=)3$d.asS;F-645bF8%%O((Xgr[<+?%.lJBqp*!0e&Pcc(QiD)UES3dH]fOd=2en*aaCO\Ha4`?lgPQHflZs_,9\@KeZ>M;]m\J:=Z=O_Ep_.A14_)idWJb=15@=L=Vt6#hR$*l"%"\'nS#f.%#M5=1]+5'5,)\7H9H;DV;0 +Fd!>Yf3l=XSH>%NG(;Ci(klJoFs".]GKYtj!qBgqKfM)K*7rMMPGnU24eBXLi#pVgiJbDiruME&j(GLXA%08=WX)B_U$!QQ=+^7rDEO8/*EfC=e-*\pSp&bU?6&n)tD#@8!&O>X^(pdQ&7.lpTb=*JNiGU[rrM[pYU=*>g@C;^[o +8WjgL&XXk&2`46#rriFo#(T^d,L3RL!8bZ[P-[#0L^7bFl20XZrFblB.M"m*h=I-KWRo&mPMADnC=-JQj$].37h2Uh4:nDNZ$'*H-j9uNLm\!@'udC3;J#;r@aT-9j%^k$Q(t@?_FffOSKbtW]^[!s'+.GLJtG` +TRBma\,u?TH!%YP_#pHTO.SF#X2.B'3ZD2pl3.m')f+%S\N:,f-jAd+Y+)^6"2WI9n?$H2Br2ZiXX^K%Y1IC'[R/UBqm1/U/d71qD"1k2DdI!UU?qnpCVs5UF=br/%\(G!A.bB9ejIi\bf8=gIVB#;A!=$]&9?q0bOXHdC'rlK^(HS&qgOVaf_*N]_g$-UZk03 +ah8YL^%_I[)[jA!l+Gt`^A(-56g0V>ruZ9#_rr$=NFh6PbXN4+kN'cX9&=EF>n`2?,DlgJ*:@5EH&`qMP63;]=`)DjAb\Pb@CH7L[!4d)f=FjioTd!L2]jdOs\W]b^\*IlZ3cc-mC +PYou^>0g6?NH[:G4a^Jf,dF>*5MASZ`Dc$SVME0SeYJtRTej`M;(MtD8/An_au.d,S?^!iQc*eUfa7,!;Ur"FHeu7R$o6?h4gg_N`Ckc-6@a4:3Ji[sEMttZ1pYaUgqdbgNJt(:1LR]NRnFK4+`0Q7-/P>BMumi24#]"Q!XDZ1Fk7?bddOTZll$pNc^FTugl6Ij +3RIaBW4ll=Zl?c$%paFq*57!"]hQN?QTk2&eL6FA4]dJ"Q.=\t*5/?*]rWs%Z0K'*lMe'S5.0^$f>83_NOG$O5.L!o^$C-Fm/GBrg`A0kf6j0bmJ<7mhV7H>UVX\3mf)_r?C\#ZoC'5\m[i065,CI6[k1R>$/X*p2.m%8V3CK^r1:W+HNu8+&b%t^RUMgj8QKlJ-;qA*fkN:P4hlY+:kCb%LE;k6(]iu<%]$tL;"iBGa(rP +'oPN?:MA6q3?=/Nj:W='':IA<:E,lgA5jEdnqBE&dH$MV7,EhrVc2jq)O4'O(op*cFaDP4W?JCqlkUMaL,!2D=mZ`EKs'*G[p/8:)jS_5DhhWe&?Dr$q0]R,lrD^"Es3L"iPO6;<\G>M`g604>V.TO>K:=H(t5p2BgQZLo/[l.:J"3D +A@3>H<-J?VC?rb6*>Zs6dG%*K)kEkP.tOk^1/bR$%sQ"4)0lj#?S7r2k70NmDCJM`3h[)]*A#&T\Jm9tqcJs;O.>9lFgVm)GH\oB?2N]rJcE1uUe/nmbqI\tBP[VhO981P]d\NO!sW^3prnZ#A-A)9n:S^i_+_Y4$QW'^*=YATj-7A*YbN%%`,(m!&#A:q;\63H6s?KQ$>GD9 +2B]XH_hKKpEYc]8=RdIWC[0W&aDrPa+eOocP9ie@A=.eenq4\LUJA`@o\g]1trokjdTZ\(4jYC.>eMp'u%cEA7EACNOn_Z/P9^W*eD#Ip=Or]:aY"A]1We^KGENU0gZoGG[C&B#alQ3j<\5$7pZ9&;l%t+`.jXI+EPhQAfDAS[M21tiU91P'Lc"a>'*4-H9uo;iXSb*f,B-qbGp +&OsrZ>pPB^1u91FBR2"`UF*=5.raOKSrWoDg)bgEC2.k`67ilEIB+Srg$Pn;QUY8*8DZ"_aS./'!6spA6(_\p"KXVilO`Xb@&,mEas&GAgPY9I0HR3>1!e`Nea/mg)Td/qJi@/7L*E,&tPlLG'(36G)lp" +jb4Tj^')L.VM"&ibSEB1*$ffW_0b?ZhLmbAi\;a-V.mHM6XaJ,kB*A[hZR![%;>>`P`HF\':28CQeNm"hh7hrrb*(j/T!>230*i"kPP9Dns7^*!NSr@@ACU`i;TBJ;JWCW[Pjrdf+R[VJd$_46$CQPMp*#Sn5]g_-RMh4H5(6KaJFj::p>nZH6b*4;n(qd!o]9C0C&WRK4o3q +9%]noLo_-)p(UMlj)&7YOarJ"r2IR*9870?,D$c*Y_.=%F@:i2+[poOKTo\,6OGJ3Lfj>,J7sms[0[mP:rks1m69jLBb"*UY`:t[9[=-8\3\@M_"to(@G%E]V4\#9;36;@('1s9W5R^0Y*!Com4ji1;d_$o*"l:#!Yc=TUss=1VEsgfPn**4[Cq?A,a\nMX`%=;qCf>TPIN:pNc/LfL,/b>D0A]?J:41.s_?2)(!n6<:$_`cTss@;[c]pfs`UJe".:bd7lucjH[K.h]1qYg.gZ$>5MP&TcMH3@K_.`Ou(h%$4gk<:1`>'#InHhC=ZoY(E%'*f]\8m63OT9Ok=Y*Agd6!TVlMkg:oS-h;8uEFDCC^r)t1eU8*M +fh,9WngS%jQT9l70VtU%-*L$Ad('rYb)n*7cYc:<=`Qua,st+1MPCe#b_T-fk[e\4;'^EZqkZ]YPt^=Q&F!Gm+e:HjQ$0>X8g6sj_b?tF3j@0B!ErqOCP#QjeP.KR>>sp0Xp&QR=*"+:dcG^N("BH^6W#_%jOe3Y/T!$]\RK1H*h4siI+G1s=t/_["BJPJQA7SY6"QOW"Br4\ +27b&6'^>ipNlW3^r9oW$m'W-1NmZ>?:'ge:$g4r]7!Gfq$$-586JC'b*4OsVBobB-<,R\+qi9!Si*d#,\_lVb?<>,l^@W\mDJ^C%!d/("d+.K6I*X9!ij'bYD.''7;_EmUjK_R0(pVp$(8"7,JYR2,_4 +@59KC0[XmTA1nCjHn\U&")]h&^rX"eQ7d/T_@>/+f+H1FE3+KuJXBPd3e2I4_nJ2d#T.PXj:j$u'qV$(mZWf!eWNrK8I\eKjj+5cY_GVG`T1ph*nt3qXmibb6?b(eS%),CW'`_@^G@V7kAUs'10s'j0rui-*,\eI-DS17/C6A\L44IsiEnf#.[P\NjYg'5AclWHThcNEjJVAK +MQC7D5u:Gl5=7u8<0Sh0jT:4:og8M])t/5/b#cKWkq9`=@A(#/X2%ggQrZ5\!m<^UmrkfouPt,XZ,Ht)D+J0s'_&l;Ue;@P*=B?>,j\dsp:o,6jg>/D;)pg4&\Zn,(@6FgCd#-/8^+,5"=V"T"&f),`gW$@>N^8()]a`p'$Q;f%Jfe9[H[;>i6YFR;\(nF'PqI<2JkY-6IS(Lufs@BoN4dFq,h=kMOYJp!+0gj>B/m[_tAGCJl54-s(1 +7u"s9cILiCc[T%`j26"j\`-X(m1Qhe_0GtOr6Cs77==/J1SOE=`a>3;6N>AUDU8g*'#J"./'*$Z)BSiT_ED?gSX7VO&.r7"94ARh+JGLsC;4*LHPF*4e.el[hm&`9\#`@J;R!O3W;2//=,/FFnXm9sbmn.P[UJ^WrV+S'Ie2t=XfHHTn(H@?A;'EJKSB_5OArdL"Tr,j4;lu@ +$-921s*j.X5M&:&M%cVk"/D9Z]K!l#"._u'f[#_bK2-'6$c!j"m(=C+CQ%6pWb5Jt#re"AqkrkJ8r5R[ZZ4/Kju0#1Fa74_@aA-P<+$q(dk6Ln/GA*uDe;+6mB5h&t$A.LB\'fol%7I4AMr*ViYVT%;"6"&qCFBaQ?DoPm"`bAj$ +GWEAT`.m=9]P>'u9BMYc(5$TAZ,1cGZ(8$upu8'r.4u`1[aW\3.OM9KD`> +5NGQPCek\>@&6hc8$l4;4JYSA]Y?!%`E\TjS>Vi-=?^P(8h=Ml[&Z8V>d)q)7F\$Rr3/g&Ttq.6_-7P6Uj`AkD9H1m95M(1I(2h.\P%i0L-Sa3]I8E2&51\b,eG-fPT,kb7foVV9J"(T4N'oe`CsKO9PhaCI)o!?a\85Gb?OFu\qZ7`'nl5)2'`[C:lVt%(D0k2b3NOB*7P`8 +kQ/W']#2dI=^_B%fh*s/8&5*od4L&/h%3PtKiF($(l#pN-kBu(:+GIqgss+e9"JDIc=p],?m/6[V^si,`^Hdifu/T53=\H>:'Bf3g^V@nK#f1@4$8f4+^mJAFU)V$JS>9XC,a87ou*r%`4VXroU`W6T:^M(P)QXY`:'O=V,/06:b8Qd*3;CVWQsl$cQho$XT64T"ON*9T<#E4 +g_A*5%8bjj:rNdRMnVhEbY]An()2Ha6tt%#'iA)t2q6$6ZeGU+(!$17bk'&jO@R^?'nGZm(fRn**9N"/@0/S9:nnNJ8Q3_;7_OJ0OJLYEdmsK[.1^)?d]D?QBSAdoj$%bu7PNjnHW&$i@8a$PdPCcUV)/r%[*lH`dqV&Th$-GF!74s":D?mW4K'257*0.A]EgZ!q%^4):9a)S +&>Ygfe=Fq/Thj>fcft7%laP>!VpI:n<3-8GA5tn.3_:n.;p5]tKh57no2Q3*:p^b[ohs:nue!C52_&@J.pK?'nca".^[O6M2bBj%Zsj^B"]RV]<)#e7V+)>n7iB!@'`ohe]5H,+Qc=]tVog:^3N@S-;7di^Pl0iM +E@nN$G?2V=f$Lp-i:b:0%0fP8-rCT./N\a'NQ@L\Jb?W)]ibg#G;%Y%L&k]b28EDs7b5+Kf$/c$bJm#R\5L!I=rY:['^O99\C`BcO^#)HSK\+q"T[)u4ih:tAVgrZME?docc(g='o^eqNJH=jf_(?^IFq$&JlNct>]g'PQ,VE.Q!>!b=`*".h3]\*R9gVt?7k2+m@7A9=P%,Z +hIt`D]/\LM;VMblDccq#qi?93]Bt%rK"\e\8=n,i`R'[BdCXPLh*'7n8:FiJ<7pS9?&fk4^#)c6 +*5+NE]/AAA?'@C):gdeKiSGaaA`0G.iSmktibg,*`T45ISR0Sk%GZH^+ALk<,N7pgg+Fl7pu:/be-I!FQ4[t@*ND3.i=T477h)H/`NG>/YMqNrhhW-,R($G$m9dG**M?"VlJGt9#.u)JOHG6)-(W,#$F&q$Prg=&TSDBE(#XcM@$sg7i(mbC9hMiH4"_!%"s;W[b#@DT3cTjD +q&9`))S1'ZEI +"QkI&]2?KnG@$D?5T5l>@25]m>JVY3N])49h9tO_Q">\Q)1Gb'IMh3_UZf^dBs(oIjUUCY]4o0nl.&==k*o!ZT0'c\l0]Dp*gnLJ!U<Xs30=W'C84W2dd*$#_J%Y+iP-@0B'JCC[!'*f^ss]2#%,ClB%naPH)D7ql;`D6B23p8H+4cQA1hmI&k7[\-IJd(>=rm(Ls"g^?faWlL*G'C::sg(%9e7mboX/R8_R"C2N+sjh:7#4Q10T.p&ji\?jC,juQQp +[3%!kf"ppi'Cu._=PfV:J:2I1%!i"4.@=)q%]2#3YI'915QR:QoFL^2!-o3LAI0qa"[i3>a>s0!bVb$^Bfgk$&CXALf6)1GkTBh%(gPIgMfLMl2"Q_&Su6ok?1aRDcDM> +i!+$U8*8hTi),dT)"F4Yo4Kj@`uKb%qp=JqD+P'[$b<^>&;8)E7JBoD(F;Za-MLb=Edp'PY<$i&H$>kBn`LkcY8_Z!SF[8;DPo=7[7>HErp!!&l=bnl/XN:6`Qst@(IO_?Q"$m(pn"b+-q=YC3nJf'fd/"bb*;3-LCPOMTH-c^t@6T0UF)QVQhU*'%dWX4_m6;&'nHE(m[p"YP&5XSJGd[9),S0'[`:nG%]UiuTKm6r^GON:nq4.:\@.PT?r"8dQ,bb,p^a3(#Eqb'qQD+3EIrfPAr3+:h-\gte(9C;fp^=[DTi9C$&Vupg +Gf^;;hO=6*UpPoS&>AXl_'p*M2@u\%H!^X7Z#Q(TBF*KGaAe,-8"5nYcbV?S\iO[W1CHgW6'cc0BJdpgTm'o^S.+eFHAki:rB3miTkB;KZ8pL:EDQ\W%_+8L6PCu'85?C:NSg13WfcOQZuIbsB,,Y8VQIt%I)A3E+i,?u?Un-ZaV5u:f(#/SZ6+U+LBS1+f^d(D!46VuL$oW+&n5nLt3*(^d;8gI*T/WX,eogLJ&pD:hC'*t,I +B[gf46cp*[*N7?GJKW$3*/LK4dQEVS/-1\.[#9iIDNB_hS,T\,`@CGlb+Q'>91EbC2MiLh(hGJ;iagF^_o:]i/V:qMi8_jdXQ_YZ1VCI7$o?\o8PdT?(BVA3>mT.4jZO1FPI+S&M$S3MQMiT%RuWB@:]$TJKll,*>uT4r6HG'@EALM)ki'uic-=Tu0qT!se=adbqHZ$D&!U]& +^@/u3LRpC$ar*#[2CdcdE!K +`Yn4^kFeYb`c1ZN.<(cPc,r4drD@geel8(La^Sc[p,g%rH(rPp$*ObODk'b=N%]OnH:A.L?Z;'S%eF*me>T6%I9M`!Pn20*Fil(S2s4OnHe:e`USO_MoN0D%hS8kW +@!q`Th=OKfdrBHiUcc9l2ePH$VqeM7eepCt7aJ>ejpuFam\Oq@l0u>tO3-L`UVG1GY3'PEU:bA[L6<#GSDBut^63[`Rc!#(Z$)mi_EVSd-QjXf?OfZe'd>u6KM2hG#&SaaG0Y,"\CZ>JD@@R?[g(cB*-B6Z4i.nfh-hQTKZH=&_O+=1TM-qkd(U>a(hF,uZIO\fiYt7-XU\dh +4bqCe+>#R#;IU%sL2dtS7$s5Piabc?d68s;[IFLJF/TJNZ6>o-E>I#F+V/?ks1<=_&DY3$6N\Mh-K-0fb%t[2`EAZf?qc'eP]_iE2<,#(g]c`rjH%]NbFI);#:(P2+#)6Y";qo'hWScoK/uOE0_$FJ0hrdq?2#7fI4!+,6'EZfpb.1I.+<,PPf'M#8-^9RKS"(tTRl\[8'i:* +Eh\br:/rPVP7LKc%"ZdB-5hikVE9_UB)#=a\Hr[hYXU5=096>fG>`O^e`&PV]9]:F,WN:\q.5PWh"OH*gSi"VjbL:5hjZQo/R;r;t1g7F6^>pV5P5FV_qF[(VNa?7e\8O:.O>b.]lgL.hRlj>qd*_Xg7A#DTjlt-Z4CYJS'fh@ri4p:s"0.qZWdMNO(aHW6\_muk[;H=TSek@P<\Kr7*rrliU7q_<=;g!*jm$'$[<>qG\V.-O'ZDMR[es>p<-Z_;5EOEqa.DSN$L<]UR^Ouh?-F%8n72j0'I*k.XP@Y\X^d^.pGD!UJtP$mU#QPa?:7`H2c&&\)[gb6OBoh1%s'$0^FVKif9^6.Js]edHb8m7\t6&!euaO4C0(B9u*TL$YVPRfImaSYpirlUmsAp]8E[Uk0)oA?!p/mJS/iBK5S9!YrgH.($BVt_n9bDqj@KPWT/&H +Hs[K_=#]O4cR7_9"SFY[cQA'(K=Y4N,`[FK;(c9-:[b`WcmEqt5+UB=5RLa0n_^Lg*mfW*4Ud/3b?]s/D= +hJdEujr]&c;1Iaqr@b>@7(QCC-G_*D]rh"RaB[%!kka>*Fhq7NWBS\4.':fK!t+,^Y-a;kK"PfV[$)EmtBI0;TU-d]EZ!47egR,>iFO0pK&(r]+@%KgY25X#Jr6[$6P4'"B;m(!kfQUDb=&A?WNm/B9-Pn-nKb[`103iEi2cA&)lfD<11p&s,#s33-P7IN&!nIh??`'( +Ak(:7@4<)"M^ZNI+#2-rTt(Af_c#AE;WfZqlRlrh0%0>E;YMi-q^umK.['rg6HT]-$K861s+*.Sk@9"lc/fphD\?a7"EX2tm1'5PY1QssY'8JB:N28q/1t*^1ZK;S%RlAff0i7g#aHC7LR4l[`\H,bj_&YV$Y!Nc,2$gjt1;c5!8/!1WBam5S^bbT#XqT&O;p.\\Rn;,%8ee$Re)O&"X%Lgh54l$O<4>MZ%-hqQ9E6Y'P[s@W-VQ>t8#.4]oZp6q'1**8-5%CpZ_9@a>:jnt6^(di`MVR5&KjiH/TaZZF)rp(//mha +:33#O;f+1)@`[(5+B3D6P]f[+dm%kl*&Af^iJg$CN&#L:Xn7rZ;SPl492sG;<>9jRPuC\J>!^ZEcnl=O^(Z'&=lH!Ei;'bLIIlcA=or^43O:/TiI+omo>jCFXkr?5)j-_\H,W +X]0H3/6-=i$%&X5((:7@]iR-2/CoMJ#a%0S)bK#7F:QgsmDoB*mMIbSFG'U.$)qZ>nSB"KFr+XAG-c?nCL&G*G1UeZ6nT$U:!9!)e=*]7a*"d[G?>N0=;J]]Bn;Wmd5JUg(ai\0VZrjB%4*&$?pfR4JQF)g#+.ak96q00_AZ>M]@S/1=BBTGRP)(96$Q[K(S<93#.qn)bu`RaLu_N, +=]9K44dWN6(V'&!4OtY$M$')sJ4!t&04hPt:j-81KdNH'dKqn:LK"bl/A-sN,8#Nm8uP^te:8@/)iVdJ2iih#kiI,TDgsOgIq-N9e=(%&XpH>=]U+9Yorgs^$V<;g<*1T2=U0MF*KZ[!DO;`4)&H8_'p4n+433VIA13MTaL=HiXKkG2YBl,J]d@.H%Cnij=\"^:'9f@]U^.5> +O^u">*l4WS"@3N005Z'\tM_7V5,$/?eVW_>.:1DYq;ETT,PDE1]mFgRrl=/\9c8]&Bb0je:Dm<]]WO>5'QdnLV9IXP3WW<2Hf; +qlk.rYe(RR>8OQ58[.d3Z+;ftoA?i7A$U5OZF_omgFi'o2*@?gZkM]14$u*a4g`s>[2W$q4%TN9@4rI9t,JM]+W`*)mcUBVn:]u]GducLekZEhn49q]XrI%oBX(OgRanc=o5D: +)s6-A\%\$I^"`.n>PF3umV\NiYWMe7gY9MJ&\o@sO?URCY/&L'p_]1JM>W9Qj42]i<`#M._>Xu`&9>oU]`>hgq>Z\n7>K,B)`Z/L.>\D'HCW>.J`uK0@>^+5YHcOoka;fiR>_gCjMoa\7aW-Md>aNR&S&sHXarI2!>c5`7X305$b8dk3>dqnH]?B!E +bT+OE>fY'YbKSbfboG3W>h@5jgWeO2c5bli>j'D&ld";ScQ)Q&>kcR7qp4'tclE58>mJ`I$dd]?d2`nJ>o1nZ)q!I`dN'R\>pn'k/(36,diC6n>rU6'44E"Me/^p+>tLhP:efA8O?"_`ZCY%<[f,\qa?$FnkHe7)'fH#Us?&.('MqHjHfc?:0?'j68 +S(ZVig)ZsB?)QDIX4lC5gE!WT?+8RZ]A)/Vg`=;f?,t`kbM:q"h&Xu#?.[o'gYL]ChAtY5?0C(8le^Idh];=G?2*6Iqqp60i#W!Y?3fD[$fKkPi>rZk?5MRl)r]WqiZ9?(?74a(/)oD=iuU#:?8po946,0^j;p\L?:X(J9B=r*jW7@^?NO^KjrS$p?>&DlCZaJlk8n^- +??bS(Hfs78kT5B??AIa9Ms0#YkoQ&Q?C0oJS*Ae%l5l_c?Dm([X6SQFlQ3Cu?FT6l]Be=gllO(2?H;E(bO"*3m2jaD?J"S9g[3kTmN1EV?K^aJlgEWumiM)h?MEo[qsWDAn/hc%?O-(m$h3$anK/G7?Pi7))tDf-nfK+I?RPE:/+VRNo,fd[?T7SK47h>ooH-Hm?Usa\9D%+; +ocI-*?WZom>P6l\p)df7Kg\p$erZC2"?g%E\li,f1ru^k4?haSmqu=M5s+*GnOB==\&IF.XiK2]64s:Mp7,j>2ZsGI)NCMrj +f^sVY+d#=VP$'W5;(7c&jc\;=^0raa9]hOA[,,d_SPJ@3g%>8p6(q-=PZfpcO\)BIl'0nE5+tiQ<9f`P[9g+@X]FbQg@]p2@Bir$QX(B>jdq_[GLG!]jC/og\(RIJ\ba`Qs;Nk&W+J9nX/*T59Z02AFc-n[U1bWc"?R8h"H4`U![QGRU%hD;5r)\opX][ +^L=D#D"a?([bl)8h/;tVh=gl"_;TA.S6e,rOic^*q4-;c5G?KhFS_P7[pQDnm<8AthY2N9iUM0jSmOFKdHU=MrLVnj^Z"_YI/]aF\)6`OrI4d=ht-jJ5VNlW!^NtH%g50P<#5a)Y]Lrm684WO$::u(0+:3%e2Ik)Yk1-k6noBG&k&u]:D?5P<*'i(Z#j=i7PU-?)Fh!=D]D8% +e9;s(Z1NMg82:m7,"T!rO!I:P<0nq'Z?2]e8huX/.S@"PL4Fd~> +EI + \ No newline at end of file diff --git a/itext/itext.io/itext/io/source/PdfTokenizer.cs b/itext/itext.io/itext/io/source/PdfTokenizer.cs index cdb3eccd8c..e753e42864 100644 --- a/itext/itext.io/itext/io/source/PdfTokenizer.cs +++ b/itext/itext.io/itext/io/source/PdfTokenizer.cs @@ -143,6 +143,27 @@ public virtual int Read() { return file.Read(); } + /// Gets the next byte of pdf source without moving source position. + /// the byte, or -1 if EOF is reached + public virtual int Peek() { + return file.Peek(); + } + + /// + /// Gets the next + /// buffer.length + /// bytes of pdf source without moving source position. + /// + /// buffer to store read bytes + /// + /// the number of read bytes. If it is less than + /// buffer.length + /// it means EOF has been reached. + /// + public virtual int Peek(byte[] buffer) { + return file.Peek(buffer); + } + public virtual String ReadString(int size) { StringBuilder buf = new StringBuilder(); int ch; diff --git a/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs b/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs index b9ba19f47c..fe74dc9294 100644 --- a/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs +++ b/itext/itext.io/itext/io/source/RandomAccessFileOrArray.cs @@ -98,6 +98,44 @@ public virtual int Read() { return byteSource.Get(byteSourcePosition++); } + /// Gets the next byte without moving current position. + /// the next byte, or -1 if EOF is reached + public virtual int Peek() { + if (isBack) { + return back & 0xff; + } + return byteSource.Get(byteSourcePosition); + } + + /// + /// Gets the next + /// buffer.length + /// bytes without moving current position. + /// + /// buffer to store read bytes + /// + /// the number of read bytes. If it is less than + /// buffer.length + /// it means EOF has been reached. + /// + public virtual int Peek(byte[] buffer) { + int offset = 0; + int length = buffer.Length; + int count = 0; + if (isBack && length > 0) { + buffer[offset++] = back; + --length; + ++count; + } + if (length > 0) { + int byteSourceCount = byteSource.Get(byteSourcePosition, buffer, offset, length); + if (byteSourceCount > 0) { + count += byteSourceCount; + } + } + return count; + } + /// Reads the specified amount of bytes to the buffer applying the offset. /// destination buffer /// offset at which to start storing characters diff --git a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs index f833553255..f8e582445e 100644 --- a/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs +++ b/itext/itext.kernel/itext/kernel/exceptions/KernelExceptionMessageConstant.cs @@ -97,6 +97,8 @@ public sealed class KernelExceptionMessageConstant { public const String CANNOT_FIND_IMAGE_DATA_OR_EI = "Cannot find image data or EI."; + public const String UNSUPPORTED_ENCODING_FOR_INLINE_IMAGE = "Cannot parse inline image: {0} encoding is unsupported."; + public const String CANNOT_FLUSH_DOCUMENT_ROOT_TAG_BEFORE_DOCUMENT_IS_CLOSED = "Cannot flush document root " + "tag before document is closed."; @@ -500,8 +502,6 @@ public const String CONTENT_STREAM_MUST_NOT_INVOKE_OPERATORS_THAT_SPECIFY_COLORS public const String UNBALANCED_SAVE_RESTORE_STATE_OPERATORS = "Unbalanced save restore state operators."; - public const String UNEXPECTED_CHARACTER_FOUND_AFTER_ID_IN_INLINE_IMAGE = "Unexpected character {0} " + "found after ID in inline image."; - public const String UNEXPECTED_COLOR_SPACE = "Unexpected ColorSpace: {0}."; public const String UNEXPECTED_END_OF_FILE = "Unexpected end of file."; diff --git a/itext/itext.kernel/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtils.cs b/itext/itext.kernel/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtils.cs index e55d99d9fb..9aa38fe97d 100644 --- a/itext/itext.kernel/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtils.cs +++ b/itext/itext.kernel/itext/kernel/pdf/canvas/parser/util/InlineImageParsingUtils.cs @@ -23,6 +23,9 @@ You should have received a copy of the GNU Affero General Public License using System; using System.Collections.Generic; using System.IO; +using Microsoft.Extensions.Logging; +using iText.Commons; +using iText.Commons.Utils; using iText.IO.Source; using iText.Kernel.Exceptions; using iText.Kernel.Pdf; @@ -31,7 +34,8 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Pdf.Canvas.Parser.Util { /// Utility methods to help with processing of inline images public sealed class InlineImageParsingUtils { - private static readonly byte[] EI = new byte[] { (byte)'E', (byte)'I' }; + private static readonly ILogger LOGGER = ITextLogManager.GetLogger(typeof(iText.Kernel.Pdf.Canvas.Parser.Util.InlineImageParsingUtils + )); private InlineImageParsingUtils() { } @@ -174,10 +178,10 @@ private static PdfDictionary ParseDictionary(PdfCanvasParser ps) { } dict.Put(resolvedKey, GetAlternateValue(resolvedKey, value)); } - int ch = ps.GetTokeniser().Read(); - if (!PdfTokenizer.IsWhitespace(ch)) { - throw new InlineImageParsingUtils.InlineImageParseException(KernelExceptionMessageConstant.UNEXPECTED_CHARACTER_FOUND_AFTER_ID_IN_INLINE_IMAGE - ).SetMessageParams(ch); + int ch = ps.GetTokeniser().Peek(); + //ASCIIHexDecode and ASCII85Decode are not required to have a whitespace after ID operator + if (PdfTokenizer.IsWhitespace(ch)) { + ps.GetTokeniser().Read(); } return dict; } @@ -303,46 +307,99 @@ private static byte[] ParseUnfilteredSamples(PdfDictionary imageDictionary, PdfD private static byte[] ParseSamples(PdfDictionary imageDictionary, PdfDictionary colorSpaceDic, PdfCanvasParser ps) { // by the time we get to here, we have already parsed the ID operator + //If image is unfiltered then we can calculate exact number of bytes it occupies if (!imageDictionary.ContainsKey(PdfName.Filter) && ImageColorSpaceIsKnown(imageDictionary, colorSpaceDic) ) { return ParseUnfilteredSamples(imageDictionary, colorSpaceDic, ps); } - // read all content until we reach an EI operator followed by whitespace. - // then decode the content stream to check that bytes that were parsed are really all image bytes - MemoryStream baos = new MemoryStream(); - int ch; - int found = 0; - PdfTokenizer tokeniser = ps.GetTokeniser(); - while ((ch = tokeniser.Read()) != -1) { - if (ch == 'E') { - // probably some bytes were preserved so write them - baos.Write(EI, 0, found); - // just preserve 'E' and do not write it immediately - found = 1; - } - else { - if (found == 1 && ch == 'I') { - // just preserve 'EI' and do not write it immediately - found = 2; - } - else { - if (found == 2 && PdfTokenizer.IsWhitespace(ch)) { - byte[] tmp = baos.ToArray(); - if (InlineImageStreamBytesAreComplete(tmp, imageDictionary)) { - return tmp; - } - } - // probably some bytes were preserved so write them - baos.Write(EI, 0, found); - baos.Write(ch); - found = 0; + PdfTokenizer tokenizer = ps.GetTokeniser(); + MemoryStream imageStream = new MemoryStream(); + int lastByte = tokenizer.Read(); + int currentByte = tokenizer.Read(); + // PDF spec is unclear about how to parse inline images. Should a whitespace + // appear before EI or not, so reading until EI or EOF. + while (currentByte != -1) { + if (lastByte == 'E' && currentByte == 'I' && PdfTokenizer.IsWhitespace(tokenizer.Peek()) && !FollowedByBinaryData + (tokenizer)) { + byte[] image = imageStream.ToArray(); + //Try to decode inline image as an additional safeguard and also to check for unsupported encodings + if (InlineImageStreamBytesAreComplete(image, imageDictionary)) { + return image; } } + imageStream.Write(lastByte); + lastByte = currentByte; + currentByte = tokenizer.Read(); } + //If EOF was encountered than image was not parsed throw new InlineImageParsingUtils.InlineImageParseException(KernelExceptionMessageConstant.CANNOT_FIND_IMAGE_DATA_OR_EI ); } + /// Check whether next several bytes of tokenizer contain binary data. + /// + /// Check whether next several bytes of tokenizer contain binary data. + /// This method probes 10 bytes and tries to find pdf operator in them. + /// + /// pdf tokenizer. + /// true if next 10 bytes is binary data, false if they're most likely pdf operators. + private static bool FollowedByBinaryData(PdfTokenizer tokenizer) { + byte[] testSequence = new byte[10]; + tokenizer.Peek(testSequence); + // We don't need to cleanup possible zeroes at the end, they aer whitespaces + // so can't break our logic in followedByBinaryData(byteArr) + bool isBinaryData = false; + int operatorStart = -1; + int operatorEnd = -1; + for (int i = 0; i < testSequence.Length; ++i) { + byte b = testSequence[i]; + //Checking for ASCII and Unicode common control characters except spaces: + // 0x00 0x10 + //0x00 NUL DLE + //0x01 SOH DC1 + //0x02 STX DC2 + //0x03 ETX DC3 + //0x04 EOT DC4 + //0x05 ENQ NAK + //0x06 ACK SYN + //0x07 BEL ETB + //0x08 BS CAN + //0x09 HT EM + //0x0A LF SUB + //0x0B VT ESC + //0x0C FF FS + //0x0D CR GS + //0x0E SO RS + //0x0F SI US + //0x7F DEL -> we have binary data + // Also if we have any byte > 0x7f (byte < 0) than we treat it also as binary data + // because pdf operators are in range 0x0 - 0x7f + if (b < 0x20 && !PdfTokenizer.IsWhitespace(b)) { + isBinaryData = true; + break; + } + // try to find PDF operator start and end + if (operatorStart == -1 && !PdfTokenizer.IsWhitespace(b)) { + operatorStart = i; + } + if (operatorStart != -1 && PdfTokenizer.IsWhitespace(b)) { + operatorEnd = i; + break; + } + } + if (operatorEnd == -1 && operatorStart != -1) { + operatorEnd = testSequence.Length; + } + //checking for any ASCII sequence here having less than 3 bytes length, because it most likely a pdf operator. + if (operatorEnd - operatorStart > 3) { + isBinaryData = true; + } + //if no operator start & end was found than it means only whitespaces were encountered or eof was reached + //earlier, so returning false in that case, it's highly unlikely inline image will have a lot of whitespaces in + //its data. + return isBinaryData; + } + private static bool ImageColorSpaceIsKnown(PdfDictionary imageDictionary, PdfDictionary colorSpaceDic) { PdfName cs = imageDictionary.GetAsName(PdfName.ColorSpace); if (cs == null || cs.Equals(PdfName.DeviceGray) || cs.Equals(PdfName.DeviceRGB) || cs.Equals(PdfName.DeviceCMYK @@ -367,14 +424,33 @@ private static bool InlineImageStreamBytesAreComplete(byte[] samples, PdfDiction try { IDictionary filters = new Dictionary(FilterHandlers.GetDefaultFilterHandlers ()); - filters.Put(PdfName.JBIG2Decode, new DoNothingFilter()); + // According to pdf spec JPXDecode and JBIG2Decode are unsupported for inline images encoding + filters.Put(PdfName.JPXDecode, new InlineImageParsingUtils.UnsupportedFilter(PdfName.JPXDecode.GetValue()) + ); + filters.Put(PdfName.JBIG2Decode, new InlineImageParsingUtils.UnsupportedFilter(PdfName.JBIG2Decode.GetValue + ())); filters.Put(PdfName.FlateDecode, new FlateDecodeStrictFilter()); PdfReader.DecodeBytes(samples, imageDictionary, filters); + return true; } catch (Exception) { return false; } - return true; + } + + private class UnsupportedFilter : IFilterHandler { + private readonly String name; + + public UnsupportedFilter(String name) { + this.name = name; + } + + public virtual byte[] Decode(byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary + ) { + LOGGER.LogError(MessageFormatUtil.Format(KernelExceptionMessageConstant.UNSUPPORTED_ENCODING_FOR_INLINE_IMAGE + , name)); + throw new NotSupportedException(); + } } } } diff --git a/itext/itext.kernel/itext/kernel/pdf/filters/DoNothingFilter.cs b/itext/itext.kernel/itext/kernel/pdf/filters/DoNothingFilter.cs index a0cedfff05..1263b7af92 100644 --- a/itext/itext.kernel/itext/kernel/pdf/filters/DoNothingFilter.cs +++ b/itext/itext.kernel/itext/kernel/pdf/filters/DoNothingFilter.cs @@ -25,11 +25,8 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Pdf.Filters { /// A filter that doesn't modify the stream at all public class DoNothingFilter : IFilterHandler { - private PdfName lastFilterName; - public virtual byte[] Decode(byte[] b, PdfName filterName, PdfObject decodeParams, PdfDictionary streamDictionary ) { - lastFilterName = filterName; return b; } } diff --git a/port-hash b/port-hash index d2f3867d2c..fa2a3557be 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -dc0868d5ded45799dee31604dfbbc4afa685f48e +b0d6503a6eeb10a795ddac8bde50e32b32504365