From 18536029a6533a850dd1508f938b0ad20f1a0e72 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Mon, 14 Nov 2005 12:55:46 +0000 Subject: [PATCH] Updated from Jakarta Commons IO 1.0 to 1.1. CopyUtils.copy() becomes IOUtils.copy() again. CopyUtils in 1.0 was not ideal design decision. Fixed most of the unappropriate System.err/System.out/Exception.printStackTrace(). Those that aren't fixed and are not legitimate calls (in main() methods etc.) are marked with a TODO item. Some Javadocs and style updates. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@344111 13f79535-47bb-0310-9956-ffa450edef68 --- fop.bat | 2 +- lib/README.txt | 2 +- lib/commons-io-1.0.jar | Bin 45550 -> 0 bytes lib/commons-io-1.1.jar | Bin 0 -> 61562 bytes lib/commons-io.LICENSE.txt | 259 ++++++++++++++---- lib/commons-io.NOTICE.txt | 3 + .../fop/area/CachedRenderPagesModel.java | 8 +- .../org/apache/fop/area/RenderPagesModel.java | 4 +- src/java/org/apache/fop/area/Trait.java | 11 +- src/java/org/apache/fop/fo/FOText.java | 8 +- src/java/org/apache/fop/fo/FOTreeBuilder.java | 2 +- src/java/org/apache/fop/fo/XMLObj.java | 2 +- .../fop/fo/properties/PropertyMaker.java | 75 ++--- .../fop/fo/properties/StringProperty.java | 4 +- src/java/org/apache/fop/fonts/FontReader.java | 12 +- src/java/org/apache/fop/fonts/FontSetup.java | 4 +- src/java/org/apache/fop/fonts/LazyFont.java | 18 +- .../org/apache/fop/fonts/MultiByteFont.java | 1 - .../fop/fonts/truetype/TTFDirTabEntry.java | 2 - .../layoutmgr/AbstractBaseLayoutManager.java | 3 +- .../apache/fop/layoutmgr/AbstractBreaker.java | 11 +- .../BlockContainerLayoutManager.java | 19 +- .../fop/layoutmgr/BlockLayoutManager.java | 14 +- .../layoutmgr/BlockStackingLayoutManager.java | 124 ++++----- .../fop/layoutmgr/PositionIterator.java | 1 - .../layoutmgr/StaticContentLayoutManager.java | 4 +- .../layoutmgr/inline/LineLayoutManager.java | 37 ++- .../inline/LineLayoutPossibilities.java | 3 +- .../layoutmgr/list/ListItemLayoutManager.java | 4 +- .../table/TableContentLayoutManager.java | 4 - src/java/org/apache/fop/pdf/PDFDocument.java | 2 - .../apache/fop/pdf/PDFEncryptionManager.java | 8 +- src/java/org/apache/fop/pdf/PDFState.java | 1 - src/java/org/apache/fop/pdf/PDFStream.java | 5 +- .../apache/fop/pdf/TempFileStreamCache.java | 12 +- .../fop/render/bitmap/TIFFRenderer.java | 4 +- .../fop/render/java2d/Java2DRenderer.java | 2 +- .../apache/fop/render/pdf/PDFRenderer.java | 4 +- .../fop/render/print/PrintRenderer.java | 2 +- .../org/apache/fop/render/ps/PSFontUtils.java | 6 +- .../apache/fop/render/ps/PSGraphics2D.java | 1 + .../apache/fop/render/ps/PSTextPainter.java | 10 - .../apache/fop/render/xml/XMLXMLHandler.java | 7 +- src/java/org/apache/fop/svg/PDFANode.java | 1 + .../org/apache/fop/svg/PDFGraphics2D.java | 20 +- .../fop/svg/PDFGraphicsConfiguration.java | 5 +- .../apache/fop/svg/PDFImageElementBridge.java | 73 ++--- .../org/apache/fop/svg/PDFTextPainter.java | 8 - .../apache/fop/util/ASCII85InputStream.java | 3 - .../apache/fop/util/ASCII85OutputStream.java | 1 - .../fop/util/CloseBlockerOutputStream.java | 1 - .../apache/fop/render/pcl/PCLRenderer.java | 2 +- .../org/apache/fop/render/pcl/PCLStream.java | 2 - .../fop/util/ASCII85InputStreamTestCase.java | 11 +- 54 files changed, 473 insertions(+), 359 deletions(-) delete mode 100644 lib/commons-io-1.0.jar create mode 100644 lib/commons-io-1.1.jar create mode 100644 lib/commons-io.NOTICE.txt diff --git a/fop.bat b/fop.bat index f7e66f8f5..2fb4024f6 100644 --- a/fop.bat +++ b/fop.bat @@ -47,7 +47,7 @@ set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xalan-2.7.0.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\serializer-2.7.0.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\batik-all-1.6.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\avalon-framework-4.2.0.jar -set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-io-1.0.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-io-1.1.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\commons-logging-1.0.3.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jimi-1.0.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_core.jar diff --git a/lib/README.txt b/lib/README.txt index fbcf64ec0..69e2fe1fc 100644 --- a/lib/README.txt +++ b/lib/README.txt @@ -17,7 +17,7 @@ Normal Dependencies http://jakarta.apache.org/commons/io/ (I/O routines) - Apache License v1.1 + Apache License v2.0 - Apache Jakarta Commons Logging diff --git a/lib/commons-io-1.0.jar b/lib/commons-io-1.0.jar deleted file mode 100644 index d521aa532699135efa98a6f7e93309beaf6809a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45550 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

bkR|E4kwZ{H;2t zIHH91lE8N0fXpztA2QH#hT8#8plZ+iiCgz^Fu1!YDVV`kwWx~las7028~4{40-cZF zyb>pG;?`CAkDwt1bf}hb$F?M=a5{7)U*{DmCAzZ)%3KoH8f!=Dj5dl2QrEyX>`PDI zU7O{}lu5zWux<3in82Jf^fNV=UQS%_Ic5NQ{0Gar+NOKDBuPfnr~ z;@XbQLZ$_latsu9Y(?XidKRK?cYMYGu9jT^=VkaEGEFI5-Fs?pW zu`QK@>UWiVkxa9cX<~Sajof8FX%3S7LCFacIO(XfkGZND%s_@iGIh)L2>aE%f-$`f z-4Vyg^xe=nqcR2xtFkOJceh;R%^1Z2`GHIc)s+=JKRh-dM9DN#h?Hn@D+eiGo`Rx~ zq~r8)@;Mz2&Y>`lN_y^$1&l?mJ!^E9pGw*}PNPbUTNnIy-2}SaW~10OJ;POIQEUKn zaKX#ZkE+adxUeFJ$sy zxUaHuDFv6Zzi_&L4!54KTOCMxN^qoaPCIT0+0_m?;iBISu7uu>Zwjjab~mqCX@Ed! zr^pus>jyh+KSGTul;gf`OTK%5f-wEyzXHk>5L(P~(IBFVvh@n`K8m+lHAH#7tC^Iy zCp7@Sho!Bw%iF*q@o7^@P-!Cn_)~Z=wtaPlp@`fyZtDtCTmF(EuNzg^MkNvVR3=c~ z{ALm!+Zf!YA`vTC4Hjg5D49;g?WqKGx^`bzXmbd}&R0?L!w;?It|)f}wf7LIPj;u! zDq3%mW#uMox;3<6{zQi-DOEG1Pdu2(Esp2xh1*2UfLThK0x|UJAl{wSnjpbCg33cs z9EG>KnjmCBGK}<*bNnqw4gEy=tyqThGzCwhmGm_;fMxsLoHNae);`v0Rm0IG;~;6O z^X0|;6FqmQQw7O=Td~&P^XFO-5YmeK=Ty0HLUI_^ZkTTGM#UWE)_Ar=wSC62Dbf6T z8Dplk2EB#Y%E%J=xSn)GqR(56$h|D5ydarDi3ehyB$GVtn5ViaCkk#~A98z@J-fl( zIbP?ywHJ*1fF!}&JbF={@h^KEKsvVr#9gBp%H`m9c1~ltNBjIekw`o3x>8N*&?Kj< zk6U}07{v*!aA7^np<#-3x#Ja4p9Gui6p+l;{}1Y*m`~g8c#QI8Lj4Nz5OJdH>pjvHDq`;%p&lA9)|R#x`-B$)s*JX zJn+|yDQNeMF@s9N6=f%>1|Vz|O51(0j&FV{d(83_>O6!gb0)1?#bkfHRbS$OJ-8V6 zs*#7AMV6*ZrQU0T3`Z^SEHP!*?$D*xp|+(UrdMo&ugaXDYRX)Yr++}SnDyLw9qOs) z7w@{}FGmYj8hG;AFVUP=AZN!y3}xXD7%OwXSfHy*(lie>r;Azz0W&VQXqt9&Gjlw7=sEt#?Oel zjbE$bD3Q$f#NS`iRaK=E(zaQJjGhu)4gNmWrfVy06l3pZx&l64Y4&{U{nzfZbPX%IJg zHZUGWoOL|gzpJYlnOQMg?(q8~%DWV@0^SiZEekYk^hYwSZ2SeJOnLxIzaQY?&m>D= z%W+Snl+e*iErwL`egfC%)H7`>F)l=YgakxlGM=s!SIPac;#ZVyw56yevLHyKw>iGE zA~rXtiC<_s*o!j}Cg4|KvQ#elVxD-!r&5qV4)=A5dQ~P<*o4l)4>cmuytDdtbw8kX zcg@s4)qUQs819Ki?fYdzebQ_*h%gflbwZBhj%cZRlr%`(sa?o;r*g|RrpazJfkx#j zroL{(IFjnA@42|sfpI&iS(pTRY~U;H{7OaXexXj*G0>OYM4Nz*+nc}L z*Vj`10&M!WH6Pu7l?(S(@ZaHKFJ#rOj-0(MF?`1EnJCQ& z>pz(WU@h|?Q+2t7xLjjDaIRd-e4>7#Yn zH$KRA4fZ1@=z~bc24kTn;;bXSF?I-qZpni(PD1kX@Q&wXzo`eF^yQ8B24&0Ccvug~ zZ}Hc`637k3_a9bDKTeDF-5=+?*9~x%uiUxLr2~cMIJav{_Q)E;6V07UZzM0#Qm?ie z=OH4|jw_witT%)M^)E(ehF<|0**-trMfr{abX6CWHde{G%!5oz-A?*MbKYB&}uN`39jLk`+ukRco- zSfm8heoD0U4dNoZ%oA2{3IyD!K5g{4c2oB;Pcyc(W^D6Q5tC+Jo$+>{jw(`5yN9f* zr+iv_stdi*veU%1>R#p4Pwa0#8Sr?^pbN+wcZlH=qIFr?TSR3do&+m^K6PHJ1I7Mu zt5ufjC2XO83x4VdIjkua>#lGI!g{;A74a}#hZoYQ-j__0c1hVihBC631+P$FR4zRK z-Mr|a>)nCoRNb*r(w&G_I1bY4uoz@YW?xLN$I?piPzq?o+UxNDz+{^JeoL~SB!C9F z7W9`@3AB?AGIQ}9eS#Bu&F?IMGxCtvLyd~S6Hk<&5E{9WPVEM*)igMQaD@i!m;a(r zkjB_?f0?dtj*ZwkfSGhAB8XY!Oo^3X2qc-Slm8xnIuXTbarxNKhpz*6&Uh3MJHx3% z$|NbPp!@XZAgWz;2>kwHi8JYBIgkKxH?}ylraayMp|BBp``PqL(t&@kXVkz#wL4}` zK-DdmDpY*XwTW=zAmtIEQUY4hxYSbLf=1USlU;j#=^#9cSc6j9|oiP;5zP{gHQm zk($>hBIYdh6qcau_P5j=;bhnPUal${NzpPJcnJ8R=U>~P6yQc^v(y=u;%eNb# z?UngA=znJGXh)xAM*nCNHvgPx|E^IeDyjd&*Z)PXpzm_QA|RlHfrhpTgW8FqO8=#9RaSv1s03|6|6NonhHcDj zu1%t%Gi_8LGyv_vu&glIA! z?{S7lXOGnhD~-|HleZEubXQU}pT2OqB!y?nXY%lDli2@B`?Q&r!hBM#AMqgZ=T8PQ`)^ct5U z`o)PeKY$s;2l&@lBw)a88S>sjai1kO^vv75#gYGw{S1dxDL!jH#r0}Zjo^oXDpn-q z8bK*FZq^O>tCPCA^xkD?T-#(xGk*a?SW=(#x2mp|hu*+Kx_jD~Z&I`zq6q2mwCb2f zNQr9uu9)JX-uQdbin}DafX2gRYkknhh2IzZ&z}^G#8iV^v0MShxN7!`935KoXBsiX zSSYFYUrVV*R8P4fd8^Uyx&n%aEg{*@3k_3h_~jz!-MR^e`boo)2$QtNa0HidoX3G` z!6dJGU<6W}Ql~y@W!Op8IRlf$a#R8^Ipa3LnEgf4&}yRDV7o}2Z|Vl6zRlHozG-nW z-27I#cvnNNYDIJVX*JxBj8nXHImsq>L_UZezpYBGTz=6W~BWBiTJA(#4yLszqh~slx$a&!B zG#dGk+v(F8<5$z}4cy&onD`D5lEGThMTmOM@2JmyKE;nak|{@NGF` zal>m@Q#r@$6zfNDzv}6jd9L|_Bi(?Y8#BWEE?BFEE%P|fkj;Bd3#KR7&P|#BLLhUuzza?5_kgU#Mb^*(^Yk{HI7aowRzh{`zH&fXChx zYVpaeu{=W7i4t~+1-e)FxZBaWuaf=wlHV}ucu!S+m3ie_`kU*1o4iCs*o8&VRDht#%7qGW5p5XGP^*lAAU{8gA3fA>1A_6#7f=|d5!A~C1nU^AB9Y!ac{ne)@U7 ze)RwS3i=lCy%iGrp!fuG?;#XJcS3Oo5rw+oOq;lyh3RQxYdNQSX?3=a)$%*p@1c7? zb}~m(yHw+k@z%N6{o=~**#yjT5_xk*&PUvZF?ZeRBhN$MgNYs4&^e{fvjWj3b;1XV zUsU4@J%*;v7;EYoj-!`PhiH3k@*A*bS9O}L@B935sOz;U!iUj3T{`#aGh*mEza;z| zX6Mr18M=eW`^_`oGMid;c}Ex2x0vD8=sX+c;nCD4X~M(pPA_;5nVYiT?zH=I^yV<$ zLK}~<5f_3Yk>oetEWSMXc@&+-DYpJpIl#3n9#i+0eKQ9M*w^ztp$<=)_$qxn;7L^H zWETyJI?5!$P@aa5m5tP;&ooUQWaE*FTurCT@!)bs^SD*|N{|^1MoG0cX8KR+&iS1p z-}TELMQe*i*05J%7@9%;w)k8@?be0)`gn(553TXxuvDNj3kc_R0HnQrq) zWkBlT9uk943j=76?P>Z46;>TGDuFV^bjfK|E2|3O&$Q`J9*1Qf{H7_2@;&9Q7VWth z8@*K$7e#ih8y@DgP!@+r@beIanBpGVefjOwCXTsZ%PMpwDRcmI-Z{%>h2v)#_Zw~r z+KUy>DFoyc>*!P?!PK15UU#OaNV+p*Y$VoJ=!*0*s$wg#3xbCH--p8@w!=>lyPBX+ zi(te6dC{DoKPh)2hEWgjcWwRcgA#(e5sCP%LOK0ne>4Bhesua07U7Jx(Lr<+x)}!t zi+_+GGDvX_VANM1#2GvFPcZ2)oQUso>@f^yX9_r`An8%Qk!9jzPjI@+{PktUci^`- z;Yh$P8qd>ULCB6UuIS8nvEkx4PQW*H9cqTRL+E^k+}=F&;*=@$)R48JEg)7C52r~) zmPw$AG^x$L-ySo-i0iosBtshMfm)PD4gf160*4!-;#~7L#~L&U^;~>1Lkc|!=B6Z$ zkC8t>hDUc767W-F`S!0z3)5S!)Hd$Zf$Q>f^U?AUEYAWl^&1QU3zk%_qz*F?~O z$!qfi1RuOYSO@RDf^fp7hA)+c{{O zqh&N@GBIpsOZki2y6M}q>)H(zsju@W=BOCvHwa1k>R}T#Z)3LhO zq57v|O!NRaZ%NBvj#5c70XZU(Z8v{ETLoz&Gxm#^*n+kTapFCUgVs7!+_T7ilBu9! zjZZOqGKvwVN{5tVPFC^1Dvfc~FeVu_AP&|L#jav#p`(jKl^cJHCc=8X=7em%`q?Xo zrlhoGFfdaSlL3A)Y<6$RN#m6zZxAc=Jf72KYO0RKVIerG1WJjPEaKWsU7NvG z4?e+l6y^R8OEdrI=-^MEDb!2(X?x+vt@sMpMH;6mEw-uFX)BDG)Md;HN(67@mgG$| zY@}oNijSxAGcF6=?b3XBJi$x#JrirJJLwcu!?>P$;@}0c^67?U6|RFp8R?2eUeR{P=ga zt^)%7xxu{@J0u>7=3U~f0%4k*5sEJ@#HlVh)Saxdb%8Wmbh$Tj=5LEKq4}hA$`Wt% zr{pK?6eoiTvO3)$_;Yq6JW4qZ0Da;)iMYoCz~^rOe*rga?bB-erivxZn$^=@kX}CSr~;7t4_082Wbb zq+#%^;i_syfocUYW7GvYuIjzFXj(ca*;CAd_{ARwY$d{HwbFZZw-=72w@Yiw{e_$s z8Xq!mUH_O1Mae%gt5ib3U0hFX^*c@{mrq8~D?bg78H;`L3r~(aGhhvbAfr%_Sc>4a zA3XO*rKXxFhwT)00KvzK6Ka0}u%Kf9)tjbI4n0UC9l(M#`lw!_A1x@+SSKOre#^S{cl7Rl`9_yAHt#MFt zFwsV*mivbM&mGDk%UqNy7zl{mKYWhn|Jk8P+Spr&*;|-6TDX$4{0E;?-&I5tLH{aa z*zKwbfl-Al4J%@RY>0U-dH zr6ZCee3N+skGX97ZA{j0w}75eQc(O2i%3!~q91A9Q!~Dl7?k zybKm*y5Bio0bKgX*i-ACCw(mf=T6(xg|2_EWlc1QRS-F43hGbapQ?2BiCamz_$8ri zgUNa|D)j}NenmNtJHQAJ_#S?gROQ*TMs zPZjem6b>4H*U5Dn9FhQU3qzfPy3y{4@dFF1tA^L-DXt6q@HRdu43m=9^N!^K$Cwph zVqP5GY+Tx}q2r4_E)#y~hxch;a;aFHNR{<}$n-BfQbu>!bh3#-fBVsEqnZqKm;A;! z3s+S~dfCL`$&c1a%05<+UJR>)N61g6SvYD~_>pPBz!osIi(oKc2bCwK`0)TWKlE*V zyN=f#tMyM0AsocwI|4k6IhpGn*~6dbNXnrN3qW+Fp_oQQ21yjHh1@rJd=`609^>L2!BhgM^dn7bJw9{SUz}S( z+o&|g6QkKjRZQ%I8ztfePi!?}4{*jB&}pV}R&441QLfjy=l+fXsU5}rx^S*7Vp*7_ zVqfc}qJvO$^dsKj|8rt)Kj67x{F9i%|0E{U|F6VUcQrAyvvB<%>6xoK?YJzAE|AR4 z;u2mGnx<9QqCDV|c`9!L`Bl0)r7zTTrF_L5RXS z*jOkv=!8>CFF&&UZg|*)0t5fX^Jh6Tpf^|_LZs2BIG2j=X`oHh1}J1+Qre?=K$&Tg zgNN%{N%f#Q5)butCyoSeII*BReH7;Jm~_}FO$8p;y#?DVa0p%9NHb;5jWnGJrU~Fo zFC-_7xzg)BGl1DjZ6_6O-HW{$^IuJQtGR<$7LX}H=#jo?Q| zMij==JO&0;1}kPR{bKMb3B_y15{vk76V5Bmv}aFI*$zPmxMx4DT4yy~XoaHEDja zC9KLs@9+^e@~&z0^R)Qj3oi6L-h7j*;tuFXGbqiK6C~VFC0(`O_?RudvCCP!WG9XV zP?uQ$Im1AbuU{0wK|m0p|0{C#Z>8^l3t20g=(}Dp=9CZwC>6ERg$3pdxD}eU1(;Hm z)L>vm#zu^XbMoxT3*<+-FI>-sL%Izqt)HM@)ahsDMF>Q!56=Bf^MW5c0jCf5%O6PA zgZ18tVpxuMcM-vkJ1Z=X!o%Wxj)$D}H+L6G1j$gYpKo=+o_R4kJ6sFFH1U6@2f*bY z?|w%}@mjj`V=knNp7*F0{^Ys-pr!X^jaDZo{zCba?L%WEx1Aig`9ovUP?-XQc3(xw zwyJClvdKjt>rTMKp21U~8{0e2)s*WFb{Uhla}bsnZzGM?y=%^hN`F7j3BE-;%mTC) zyM`_}nXRtg(r%RlgK?5W$;J6V+DRvz@pf5^p{^sv*O?M#x^3sTqQs`6axGM#d3UhD ziEq^(8W{_fvNdtK!rHEQbmqMRTgPjPNkXO26#Y48Q=zmcO$*?KF^5ggK*OqY7j{IQ z(HG`-cr4wAj%tsvl+I`r!)U?j_~fcQJob`{Iyz!pd_3HfUYOEXOn3sn5y(7$Gr<6(shaueRMk|d8)LhOZFNCvF;)TwT zzTD3h$uQ<49Fe>3@uJ(yaMFv1{Zut{IxK4+RP4~Fna4l`M0Y_1Y@pf^YY}b=%_*6z z*CweiC~!Y)td`~X3O&rB8JuhqN#F_?c<_gq*t0x9plpzQKjw}^arxys5M~9kk-HZ( zB^ez_n}4l&Sx+Bq5@shB82)bPM;puYMGrRtoviwa0x-Xc8F#ysa!Zfw?n(GS?LGhK zWTF~neHB(kSry&6{fz-c+UfHPb0UsWiABK}_EYPSg!>Zui9h5t*-l?~aADE|a=9C*D4PylzY;(z#BZH`RBhoF z7a~;Av4$kHrJ;W|{`}{TEHbWXlRO&_eWwCIiII)5b0vktS3x1+ba?yXZg#BcalJCxPmC~;t|i3k(;IXC zjRk97?(wVY0Mdp|>Ar}F>CghBzQS8$>mw_AU8AQEpn&023Cxae*Z4FT<)huxxX+7z z)$lJkAcFg%DUiIxOP{T-*P~WOnKsv}e&!VD+p37SQmvHd)pD?`N?=cxJbKTuC`r?^ zWYwZ8khmp8I++Tj7{UuZLxDiz`C2XC#?qq(xUTQu#8aM7o1kvXndrc!EHaE;o{@F{0PDblk zW*->89qV(QnEO^}_+{9-+!>>se%|*Ep8cir?g`p)C^(FA=CXhY-8{~973V|oGX5lo z)xoep-NJmuNzHIQDXh&4X~Q(0QR(dR%^^7iSv;+h9oW0XOnce(cTwT7!c0!G0C`R{ zE?0i#wFNaWH9BbL(~me6h1pN9#b#utETTCnk$~a8{9;WRqC7knJE6TZe z68_;z|2epFHqDMr7`#eOyWSLFArw3f;#r6zc6U0nmC7@Q!6BTQaqT1<_m6y&;jZ&c}*=S@dHtZJ-R7M)L2bf!$qt zwUOmfFoBHB2h3!2-r)+^P_nbAhg)8?>+1$X?pFya%vj9=xw2Wj_Dyv&Oov&y!rWMS z7Mr^R+Vw(7L$a_b!|jUXQ(nQG>me2|wP7>d_4ZtwVw=k%QL?aUM3*{?&5tlMfVsBh zCb^RurI`}wEV^iBcTqDIbFprr@`h#R7PV>&?2Y*w`;&z}Ws**e`9G$c03;-S6zMWe z2Z;}5Td}s8u>#fGWwM6pj8f6=Qf~32yOx@Y*09a1El=j$PUVj6%at?&ii3w9y{{!f zj+b7Ecv(u8>Mtr%It5f$+h`9NkV3#ER3aIG`oTajIifmtFZv>F40}G9zn=F|_45^f z7N9Ox(UkH2fJ_RuVd`u)Wc9fkdq@d981#TsLzMowLVPc#;++DRQ%v$JoL& zvsJQ9aeg!5cTHvziVXRSbN12nmdrTp6<5P{5h7%S&AmCL75!v(c&h$9v&M@?o2W!H zkrdB%VV&mi4`m@Fbob{NX99wX$LL9ayHiYQYiXx7nO`lTiRN?lbU<(S6OgZ~$GL)C zy2jY2#DrB2D{l8ukUTKyH)ntm5-4NWb}G#z+Rv>dCcvLUlk{QnHNA4>ZL_g?o}Hbe@u*VsE*W>tK2+ ztUh%5xz0{EXh*H-t`ekR(qzMZaY9^HlnrOw6~tGvaLM@)F{FGdTi{A+3)_$u;~99| zT8L*#xSWao$U$aQQoMzZX|+ynNS_LW!dNW?oEo&1f^sisoxzV4k5<^B`NgRH;uwKp zV$LL%N2J?B4aMEg(lRo7VG1XIx|0Gm^?Dhd38cqU9yu;5vFi>6!LQyp^nRfY~<_2wGFd$_4kDf2Yj zp`;LBJ>oJpMWSSXrse-RRpwpRh^XlP&Be;$b1g(hVGqs{9 z--Rbq8DZ6pTI;D)Ck#DA;-&KwI=3*@W;es1rlslU2YIL4>1MEjMewv&?_O}#mpmSG zl{_Bn2`z$|mWPH(Ou`yg8~-Y3t9-BNI?s~n&2#G8`2eH1Em$3nE;MPOaOPSRjq2Ee zVOJG_82PUFFgJ_G$tL}$ZlrH@-QIKPmDp~D;EdkQ?hFj$pb~IDCLY?EdE0aB-ZplC zLwx$VVwjSC1Tpq+-0@y)YDcEmIp$uAUQ`;x$dzWz5fEWVQl=eEY_|i!%arftr2H$u z8{+jyMK%zO@1C7-#LgS$_JBn&pJ=>1=P#Vn!{B=?%z=&|S^nAOg^Nl&mN*Pk^u4zX ze!SMGeGld7A!6gtN0lB5(+!%m0|S(CzoC&2fV@93BXIzZAo}_t8Qy5Ral?oyQ?v{Z zbsZYigZ3~Q)A3hp%WjwifV}3c3QulCHYa@fJlOA!GjKr7$0sEHUJPJ(!ecm)ApK_j z>IP(?5t?s=vr2-yBOi9b3@BKM* zQauh+^=0m*DS<#bA1dVN`(2O5mSWd1LAi5{ji*X9Q1P2qMY zBv{n4Zl}8TKH?MN`16N+4J`U}1%YsQKxf3d^@FP&pRKGIp-;Em_#0y%K3X)_Jg)I$ z$E^GF_^0v*K1XEaJ%Sq3T~K7BeZR5mC#u++js_#d4`fGm)GU-j<1A$sH6XJV&;`8^ z7p+vAEQDJu<klLTdy<^ciHxl~fQD11PT!aAT2)MbTI> zU?_{RF{Rw5bjd*6;1rEKyam6i0y9QBc=zEnrW6xdq6PZ#bP@2 zSA~loVw1nd0ekWPgz7hre!bs8(X2)Q{h&bmgp_{^4ir9?vM2=R2v;_N#NLddxF24P z3S@}&&pD88oO+l9VqG|18xfECR}|G%c*fpT6BOGF;8rQK#AY4>0$asKo%}BAGe!fN zigs6jK_VOsIZ(T-LM2>{sj!qoDO$rZCW(|te2kM0T2sX{cEVM4w}D$pgzP5|d*KQ;CN>|5(L_<>XdpN97+YJQWX-!@pRNcCHkYARUy9z{P@PbgMu~JaCPm zjf2oaPw}hRIWj$pOI?ZIf?CJSlN{!BXO-jq%4BFpHn_DaU|%7P)S(_nd0NKTy!EL$ zebn*0bVkF?kV|*IWxX+s=c6{^dwqUaKeC+*Y=_9q4zdC-j^Sk-xV=uFrtlPJ{QG}w z<{COS7N6pPfQ}?y+}WkpcBqx8Zd~^aw(@|P?9%gZzs9{s6% zAYqliO2q|ipDLO{8KeL}ZiWCCm!Rg-1i!;Q8l`5S9J;LU&9CTX!Z3Gmp6Q=Cn!d@{ z0e6Nl(8-;^^q8wX{tBtsu@(idp?@6Ws(&>?LA%y%jLtYWTG}xahPW}2F3iYz$V$cN zHRz3+V5!M{4}qa|YRbkywpE?eu?30dj3|`zX9N>tz3YIx%qI!H3^yqtj)|(<7$?vm z3{PiT4QOJ(D1&`G{_JmaB9{&CVQ;m|2Xp~960Mm8=$kgEjH zUhwld<$yQZK&?@D;JIj^Ph#}`(Z{RCC#aHP4S<67OLv1niJoT=3IMvL)) z4|0J!wE#j4C-r+R+MAQj0NNX^drAza({eraE006aE46z~s=d>ZUoboh!C~d}*$Kj9 z;XPf}e%eBmGHywZKyikW`WAG%^%C0ss6$$oR}pLBz&0d^4FhiG zsH5VEx`ZYoE^13DG|+8yiPYP~d3q+9%V1Wc7CPqu5p?@`3fCpN$)ZmGgedpW;qUaY zx>GJv*Xr}`A=Bc=y06s8kBBDzco&X}SqI;`iiv5ebtf;{t;IuzqgzfzdvA%*Uig%6 zJ+bx*32iFN?m{!zg(arN>J5(ZiHjpkcZ))$4vh>9etE7d({tnB#?)9Fx%Eg)`|J?RRC5t?OoJmNor z>~Jha^4?E4xQrW@Q#T$ONE0}#5}1b-0~w_^isDYVKVR%ROjFXP{w0-xPZuf`GP~-? zz{)Hi|M>LsBGKlBE5Ib(>q${W*S)K4yhHjZAd_3HCz8h&9!p!+SQ|s?G6>hr%A4~q;6q^F zr&cj*n=5!i5s{~s`eqx{)JwQS3vFUpQH=;=tku{fR*;*J*nyjdoz^zePHg1J`zWTf zWk@MjK;fXDu7JfG?dpj;2nlLb^9afo-e+(AjX{nI1*A*Z-7%Jajv8pPwkUmp%(CUr z=EPBkWXmpDKgL#&N*h_RS2bY%y<#NX8Ur8{nc~f7zC{be@ifs)w z<=8Q!UEQd@*}3T@PE8Ofmsd>iFaXZsPx(n+3AkMNSbBxWtQ5nyJUi zsVp2mwZ(g?S*&x?jj_>O_1q_o&X}6v=LB!8JQR2e_oINN4Yhb#YIqyQIfp@U8OyquO|`9s{Ze-PgYPUt z=3iFO3(4i;HM0)?Oui+#dnqY)Lqv_KZHsHWrmw6x#zX}gAU{Wgi@Fd(Ke35}#-3mM z#`;Gd<78^M6jGkys1R?+x3myH8U$hKO-&o%i^LT=XXuG}SlVsaGaJxJ4B(B;w)+m- zmK6*tnLs}aWIE54lU9zi_Yip6dPDEY9A4@08x4zjV?q06f3KpePCxh4;>{FO|aMfPbccFkhY4$@{-x{7Igdn9> zHVO6xf*(u?;oQp`F!2p2@*W&e67K_1O4dN~g|tH?T){9UJD`;RSk!zH*QOYcYt`Nu zXzgMC9S*Al<&C;SbuKUm>UGE@G)l^0IF^xSRi=@19<4;!l6EdB9c63{k_-dZmY=UX zgk^V#q-6YWo;7*Trdiw2uLR{qc5fIXW46AELpksCaHizOI}E~JxOp2OZeQJD{=Ev~ z{s31lFfH8ai0?`)=rGfZ!yjpX{Q$QE(*z%b8nuLPhcdRwP^oR$H=7EDf{f)-7b)m7 z7)oh~DCx@>lM7L3BmsE`Ue#k}d6Phiyt2`tLUhYW>$gCYFKD1VF0yyf>H(s6%nDZs zC4BFpr!klct>enlHi+gdQv@*-*6No&$wiE zIgQa%a5kwI70+EM=TmvO|44}aGql*zTOvBVoC8}XMCO!~n&UGCE7gMaG(>$AbNzsT zm@Odu+kAL8f!SB(w>lcml3MaK77fwZzm{*(ep2DlPi z#QxvHzvhh-C`rJX>7P>*UmXfm1aGY>0X2@Su}c}`Hc9j}HZo*-W=RNxPw}Bi6~_xD z_>+|;eI>T4b;qu<;J`W?ZkXvmq$f6aG*^ZHOyQ@I=rTm{b>y>NTh<_0g*}=?gp*l^ zItJoTyz^n=FeA!uMdZe+i{DvU>s-sIaOF(AFd|OOw2$onBD0YpzKHTVuPyYnRTt3Q ze8i3bqnJG&IZwWl0*|vkydo!GaYkQqH^F6Kj8d!=PKMi5Ti(Z6nNDz}OiJ^}UUMR! zto-25MRLp9nyme0aIDrM^{N$^TDL%*vV%uibJJA9YWJE^oUO;#nKb=;cjdaqm8oi5 zduXk1v`DaoW@5`UrAi^>a7o-o!|9lP1lybZyKt6fFx$HA8DhkX#*5Lnhy+`SU6pFO zK_y>><~^eETtULsY2V3DN+GWHnr3n>AEn+{4=J`-Q1GVeb%9;k@jd(H`K6;z%`Hxw^?WnKULJNhA(cQpvFr47*m6$yv=F4S+U9L$7Elg4C0>! zv}v=!%>;To2Qjuv%GQ&&4Vh0@u5QEo-Q zAgku3qb8{ZSWP0hZwjAMW+Ez=37{B=6>}ts0@!A7;@8xUaN|OCe;uBPNYW?Fq8#H} z6*##x<~DjgSjKsYt=QEZ*3wb%IocpsB>=F_dD7h1hirJ78=8Vl-Cej${Y5dhC>6(o zm9smkT1&4_5qIKI%5~u)JKZIFvheB1W9(!jT=)cIbZAXhUrq z^AUeW=8;bnpAl{689aTWZ8wY0w_FywP|PmYW!DK6mmmF!clYu}0=Yqx3sTg=+6Bdp zR3OurBAeBQSRZEklLs%*uuOi3Iy>dw?=B82o!hBbADjp+V#5RSgJlt#r}uzf^?V7w zGfto(vCJUzQh(ATtJP6Z;mo3LTCNVyx)v|X->#2_c^~+yI~5C-T8E-aE4$@2NY0Iz zCWf#kiq9#+r7xH1swU3EjE12i^_c?YDwq*H$b(eKaP1(b}AA;-=(eAss30Wo?j zvim4vpCI-9i--*qf^PDV3-TRPl->aBnFweO5`{Bp$Dt@*_n|Y{r|hS7&4A&CRK*R} zsRV0WOai%ljuY{iyj|J+KKw6mjR=z_evR|s=qgnURVIW@DDYnXr&kdjq~nyhW6Mblu`$z@91see`D;O zf;g4Fak6{uy-JWaC}3$Fi)$b)7R&?Vh|CZD;pd-b9VH5k9kZU<_BxD{HY zkSdWdc~jS+Nk74e2A3qYFq?Ru-BCwy6@CrQ4Lq;2Xw(5f1m}Kh8O-hdv};|Tii`r-x?zB8`5rywd^WV$WdG-;T%e#+JW|_r z&x&<{$ymst)0SJ#{9cA9$U!Jb+~fqW3;g_b)^)I$kRB!;{VjJ= ze(H1dX8tX43o}3{&uGhZs1FmojdpwUVnsV1{2H&QMc@XV7aVBJ!((gSG;M z+amr{pkjnc=)x=uGSdW|wZa@50G~3sV6m*#vL)zWnzg44{JRwu?-3)e3EGe1cHnTk zYhWTB@Vr0c?Q`hI%`OpRLU8rXMs06F04jf(zS`Y{k9e_1XbW0qB)4R9kggQZWAtwj zV`xl{wSTP6MnN$fl4{m54_f8!mIUR*LuZZMV~wAa3Btz!V|DfiC)^z&qZ-BlG4+OZ zh6e2lwoPQxM#8j44Ek;&awn&v6P%F}F@7?Vzc6wga(s|}j}B_z)I@@F3LNka%Z@Tnya-0IK{T9L%BCQ8?=0aC8E zLTO9ZxBlbmMX)TgQ3r#N%%r8WXy^(9e2$teu-*CzP?;Ocfv*%7Z2vu&BU{`Gc7Im_ zatN0i#v3BiIju|$eA|vm4*1#-iqg?&qdGrLKhd~wAz?y@^@odZ_Hk{LgSuYYl@WTa z1*YCL>{nd%NW!m5&L`Icc^qJW+DNyAy+eho!?S%9uN zw!s?MXL-pYK`bZnJu6}cP6W{>i; zf29^cN9K(JjU-BtaDa`=UBgh+qvkQ%sMvQD8o-O?X44r&$x?R1TmbQ;LBD~dQb&+D z4_w?FTNCMTh`EDnv!P0KDowT1edB{{)p(MAia3iI@qCpA+K2Puii?XTm|%Q{HI$z4t!~?lSq?sD)#>VhVUV>0rY1ce}~v zdW}rL=Y?vuis`U_irQ-brGs-8a-7DYt;*j^L+AYB5xCB8j&aq*tcVTl7v8+pk+c(* zrUcD?wVd;O>7w3h3~bD>qqe!{JT&EHL0Kfh$5?e1?AjKmya@}c0R;r@+(Gv}cMK0!*8mHSZ4m@DI@1JTMrmnC!pVjUSY$*KY(itsc^ zszSKs|7;SS*~Tow!AoG@R-*W?m|k;}TUs3Mv{c@88%4cHS!haj^lA(yo6v&#)g85k ztS82pWf4wQ{D@PR>ru9>m1`Rk9m`YF!_y%@U=4(N1E1CXyCwLSSa95(9QTx=>cULI zsMM=tbVM$$kr|sP2trXp9>Q+H+~_?wVIQw1Xk}c{YsdISESDv&!5-TU95nAHOQHpV zIxkG8^3Jm;k;2EiX5|=#U)<_E8b1gED#S; zBGw+wurMufe%aAP4cYqE%WYS;fU5&M_%&FjT&WcxYa5v2M(BOcvI zYz6Qv3d6fyJbUxNG%VB2wAr%G5!3D{c03B3UAM3v>`B?+|J?oRpCbZiBxLcrB-1`n zF(|sk*FIn|h`S&Sidx8^w!vy1;TC7x%jP|rHSIdx0tE@z&$p%JCFqh^IyWUL=`fA* zY(Ps(XP;H@Z{q1gSo+}Bxl26+-rSPJK4IIkLjILRTerGgqEw88I2gOJ`O z-d%ZC5YouTrODzPtelJ@iMKEuAv+G|(L8-a`TlH|>SdFMSzEu0k`V6=R5ko@=?D1H zMjDZGDpkI#!wAPyo}5l18Ad=dAVZn3)-a7?8X7IKLSmGGrk)(}(}5abje!jQH|WFA zNB6Yjo9F8;AsGK4^>3JX<`t-$LjR-c@}F}~uBy0?SqEKPoS_+kiWXeaJro9IO`{d) zh#EswLGwvU{%9of{2h6uMkaVMu_)Crl0y4bahwQgk;UP>9h^}M4wqh6I=+rIVW}eqvCHZ%mQ@%FRz$6$EEzIT(Eu|9cm@zP^9Re)#lyn!`3B}!t|trI zk4Vs3&*rbi%H7PCtq!n?%ECzS1&3V)m@ zGfZ4dpX-}w^ZHTK;k~-On^c=Clj2{#R#WIH(?aHv&lyHZwVD!k?Vj<~w4#sswnx2G0y? zFqO1&>IvoT*B$fJ{*??~D3p>w-X77>yDb!p>jnOA*t+fzRa_FL8yU_XX4N$gmG2gO zk^m!;009l79=xnhz0#4;&x71?8Gn)=K&ZnKODd?Tc>@#r{U4RE?pq9r#!sNL4+5A3 z9e?`!iroaA0QUQfS|M*_tfLm)pih>-BNu#v9&o!iuT>%+2$KoiKKA<&TbwB^svlsQ z6kb2d!ay?5<;i4UG1p@)D;^vosPfVH}xuo%?f z$?S{uOAvc7?j&OMx9C*se&Eb(;3$GH7600NSzjQM$5Iq~g16fE5Bz;i=EHx#i4qH$sM3%|NU z;BytvvZA~j$Ic$SzbZrQ3?l<_osGCSo{$&0sppxXxG%@t1j|-RhTm~}dFtT)|7ia0eu4cERNW1y(Ywes^#^(-mM@UmuLG7OhA2Y#S{Q`BK1~? zKc?qvtDFY%Y|oBlcz2@q*H>D_kUusH5JJTbG5EFLv_OU7g8T0yPS6h1YV)t%OQ_J= zT$q~KbmSYnjTb9PRcxq07OKgvW=g{vB9%?93(Z6qg6c-+no4O*6d5FjS0PKPugp7p zf3!#6{Yilo=U8^B)b{?zbFu%tgifuK6m!SySklfI1ys>)T-D1|(h*;1aV1T>;rwVV z{ahn$d5vG($h?(ys+Mtjv)mNGlxDRB?7yI~@TGBq*ECC9-1&lq`E#yOxaDB3Oew+>qBy+;TPnUFkBlY;ZxGgqOY|&0@<&axR z5VNYf7=3gpX{M=S$0UZZw0o^^ruk5?m)w}2P|$MAhi;#@G60%!L~QL-(%*YFtf!5M zk@aEJWsF06udm^4EAmL`{e3-|%VMiPnBr%}ydFrvX~}-Sl)r>5t}*Ji_{Xd>MH2!- z)yw?84yXR(K|XsU0zp#g_4<(~-G41tQ<}@|4Kdb4IR!akjEn;)<$|ubYAm81Oe9Fl&2yPpH96%Gu zN!lvBBq+V&aZ#S)a8%QZp@iG*QR)$ir^}8y7{(U)T+%Q5$K+Ov$u2Qx=u#C@$H^=; z{@Ue+u_IoJ>#&I*BqLH+U&Ehp8Fg$}Q2x^(I|LFToTw(SVV1MZqjru=Hg-e7A{EMZE}tOo(h^|M7O7WjGMnHA~EXP zIoKZNG@AjPfd7i~yfZ+ns+xUkVIZCaJVUST1C5iPl{q7`Wh4II`rcA?eM3h{1>@X~ z(?5cOsan@fjxm_f$bm@q#i`$~EizS^mDNZeD|ThQoqS4qIy3v4OhYYWy~bzjkniA8 zoCD92z@^2>AXJ9y`Ax@Z0YQ3Y>~52C8|OuD*RYR<^{lqz%4$# z(WV(miel#&Tcf%3NkL}cF1xE>t0u2uq^(B)`waUl>)(}+rS3s>HoH4dXupN6fghU)lNSz$*n!U?bzdS)g zzdVHzloXtV(D(p@aB;95GbUbvCV~83%6P5fnGF*aJv%W~3B{h7JmPRu`7To$&akMh zAO@?P1I&4w83SRY3`K^<;~j0`KvgR@72}bkfV~Jt&M>MsJ0sPSJaTgD;=7Tus_{f- z?IL0T?e2sgd&Kx2&*n^I27*P;B&-2t7SThXLrCU;kKK}sw<_9bf9>J~0gY16kUfjU z2(iDOnt-rj8B?H98dLDtp=J+L&=FT9!lWxY@<1y_qfK}G&|u}M9S!a@<>W9xM^3`5 z-+6L!)D$(x(Ba55c~Y(yu}krX>&x&1BlCo-Sp@X>@lg$l!k>F5dD#RKYbOa)7MLQ<Lo&`6?dPR_M_pcNTh8^dRI^u1T1)lAU6?7^ zkws_Z9ePnQ$%Hxj&BS2qmOvbp%v}zPdc+2m%j*WXPp1+uWwtGM`NARf*uWbklD!4S z?f>BJQ1f^P*2D?Vrkw(+lE9kCITO;)v9iRg0;eha{0xm9(-#c&lQk+!6a1NtEl93z z%c{3e^NXOP3B#it#x-c8=hj4)`hT%qO}9})5#pMWsFqz-nr^m`D^_k7&ebZ%RXYRB z87zC^SG%8CW85rmJS+ChIX(HF2k?B|=D2DjCZRpOA-cDEn&M=c#QpA;wJvK**kG`Q zi(T{M@$Fs^%E_86AU*6L2H4Yf4{Io_M|KoL9#%&F?h0&~)Anp{`^Okuq9mE#WH*iQ z8L_o8HqPu;ZJFO$6KAp74r>d_ymg>lNTIxtHGjk42h`EFBz|vj1I!|~@>WY-76`YA zNvzMDgX)6!n$EjIWaab-wn0Vr{s{Q_i|*+#o+gF1^mDcQ911JkRM5#S2t)nwBqHEE zhR&-#b*HW=-tYznaUHLG;b)fVCc8o;wT}|yBl@h+gMe`p26%rbh4TK6#pK3i3v4Qc zG>p+K#G6T(#1s%D;seq!Cfap!&Blb3O~Ze+>=NrB_aMN6Gz9JB#=yXYff##^@gzUq zQpDv7EGUFDp21a|MYPT6-=^|3AQIcJtj(Q4Y+ew7D|;d6%Ul(k-BH3FPshe$=I%H(6; z)>Z2YBNL$$eB=xW3evZ&cC|y?gM-woLeXsqoFfbpn;^POl=l=Erz1+R^IhoM8uSvT zxbs!q0}b0FW(OT%Uxxt4AY2G)fHx^HPorS2mp4C>Pa8r%XRl9V6pv336+fP^RwHAz z-)vPv8`FmSTZ1rgL zuu}#b6u;VkP8Qozi@I?dW&cLm4yo4oB&->B^*F}$M(-Z_Fh5;zdIX8fU|$jSaKNKx zB`8VaE}NHYX#)Qb5vtC8Au+vbn>V2%rAKACeluCP;m8>sNHaJla>>xZ@`jAYxII`- z)rP*QFKi!u`c6XOE6+5M*j_f zWWp(x0#~TW6QX21#Ow*L{K$PWDQ4HQ4e;uoe!~H}KK-D)@&w`ud7p_N-gzUNGpWnE z_jyw@)5?WM@Pe^zyUCw(J&j^tCYMgzevOXABlz-I!9J}V8&jbUEL^1r`JkO^*ooqpXc&C-6%TXgYTVT%`i`PxLwagBn7Go5x7S#$8rxwUW5@m} z`mf*K)qaA<*l(DR+2Z_^v44B6jo!aZ7P9bUXOw+%hcG|GDqW5&@3C!I@70@*#p7?4 zG6<$(QMV;S-|UrUK~5hT5Ypym8Dl8?ITQP;Vx?c#!Jzkiub3Bk8DEH^9j$0p(;lF{=Xf52e6C=Q}&1|)w3F$yo~jeep4Vak^FA&-UXAP96v-Nzy+2S?W@-!@Sh6Q3OTfW+MN<-7&t zjLJEB@M5_ZWt-W4Vlb%2p2FyueoU|~N}x}_RDyM;SE8=S@5v7tIVmIsJ75RpnK2`K zlr+$jYmg{LG~$F1?A5Uc8E4TrFK>Z(cMArH)X>4%`_4P?AF7 z%JD~+wdDq-6(}>Y%idL$wuKy_Mb#W1{?rq_)vX2q|5ru04phQkZ^fdxX4N1bafDYa zY3XI@A-b=;L??|&IemtOG6Qzr5cl4R4w^k7ci9G%zy+!3%3{!5GO=96MQOq0T59Ky zKG@S9V^boH(aW{c9&NMI5o1G|wSB4Cauy=^IDmc{LOTzyBhq$4SL|`!ca~kVsy^5dFG4FWfZOCH z=Zh)bL2DxMk(xEi@430fTO!qXtETd^d3v3bApNtw#LF5L-SXP)(AAuIh`Yi3Avb6y z*74Fvcvm@bS}wa8UY??_RFGwi?2(E}f1qiylbzkO;8Zi~R5RyPv*1K}+RmCLV1s|` z_Gck&jgcCfIl0erA_6oSS4tW0=Gk(rtpSwPR)$6%dl{Y{$r+9$x5h_RMw0;Orfeo)`B~#ZMngX+ComcO*q;fYOBxu zVRbeuu+eBMiSg@e`U)*(Lw%XY4*|9ASwFrwk@O{hMrn$;VfZ3dsxrsngPjD;1mQwu z@dEVOPv=C-Jq;6)}jARBD@qRV^(uL^_scb2DIFrP0U3BZI77ISlQQ688XKAg# z8mEy+c>?|JU|9(MzG`}3BkKu@`;|g}`QlQM)VBBujQfS;7}>g3CP+dZ3qtASqc+#$dbt>tf!wh^37!r|4Zu@ z1C0h!5u}p+sXN>^P2uJU#2dn8D*E*}X?Y_K0^WT{{_u&#J}xS=JfPj?x!~Q2uxO>s z8(Car5{GFhiK;)(hd#t5>&Pplc9`FMM@JJk6vSH8EokRM%(M&juBnDKj_-qRTH7V` zW$pBg*yBl;XsGFL|N@;ff@8zzrzU+GNn9B!kUQ`GpdXkx2VOpgUmmxaJ^ zJ3`)pog_nwZHmaYeJ!%}Od#u@e)gJwkTE4%hLtG;w<&$sDIIwwtC^FN!PqvOkSS5yMNgEMjFwbr01=q1n|AS+e z%v^_U2A5MG`>-9DF_Z=!ib?)7<9ga`4W=feVN)c8aS}g)wP2-?6uVSn(>v#H=xh9G zUHs^Soh$T!Ay-Hp{KJFMTdwHc3dsUEl!v8HGR}vC%$e(@8Kh4K-0K;VB**xGXabob z=2Z#I%KKIk)x6p_EQ}o25bq#UQ!k8(RGz35HbUo&EF_gBkxBn}hv&L})KK_5gJ-&F zy}X%yn=`s;E!K>iYAH1ak`t;V2O8im-DSGzjezmcHt3}W$Gn~2ovzn64>=wQz#{0G z<%YjUE3jB$7*}SjCc=RZ1jcHMju;cT1E2;eo`1mqrg~sre;_cz>vBxcTH_d&;_9d3 z4i6n8c7~8x)5S0h#^`0dfxS<$-u-)^zGRl!2ROT?mpR~hfax~wPGN1~9)c^vPoJ*N z(+M2BK7ilFAf7p(e!#=g4@D#R5FVY~gFoTn&aqM9K;RCCz6shXTl0@^_h8-tCQi9i z=@FY)tw4Uqn9uqv;B4mwTY~rH{TOO>vht1lA4Q^&Tu$h)U;qG&zvdK#|3{Iin31cH zla=lN)ND)HDk!0RTPHkrb#k3HF(ow)i5!wv%`5s5^oaZTCJXSvFy|+)91_D8yV1M( zDWf=25n8lRW#%(#wIWQUGWgdn+8wY(bD~d=&NoS1xaeqnU!_iFdR%j#WItp%^my#Z z{CK+j;j!!!29|>{$C$TW-5t-3)?>zz+b@j{#EQWz9k7F~Ib+kq3p_Bta{|5+qqr(W zA~b&wj#i94$N-bxqXxD)z$O++8Za}eO~gd8^0*)B?1=eifK3Ye>E(!OiZP9TRj?FB-|^YbtXzwVMQVjAt$x&*PD}m1b;kwV z1kZV-xk;gRX2+TBOhS^WPn_+tA96YNeJ&K{`-vG1bfI739)hN~kXhPZ^ot^HX0G#? zoye}!lmNUSrX$U$TCMiQ*e~37gJj}$YvIGwnOseHG?uDhd=oFzm5QPXDb=|SW+T)s z9I3K5O8j8ZbWMQkQ$uT(^9yIG0H;4~;1^JAVE z#FXTcmFZHVSQAFt3tBx`u?l*yih`}yUD7hK6V4@nZpG#9mk}?q=9}z*fX`E_)HP!A zqEtO9Km(dwv%X2JzybBC6x3=dCf%Z}-{Lfl?rein#nUKN9)7F5)rR%>>(2JAIMmce zJ@`5@E%>xXZRW79+ zQpX(UdzcUQNzVsXy+FF^fu#w{|AFq>@(r-Unjq1f>7?#l+GEvcY#mW{<8YQs`DVWV z8^;Tc*J&H>A}w2&jqE68w(t^Cr17{HmT3{ss4=)i#FKlNs(nC&%@uVDu___m+x-HT zY2LsPEiZJrHMmWbU_Jk*5x+k;krA5r!(E_Zbq*7*43>c-;I!WRjv`%=%;q_5{RlK( zOWQX#7oV-+)<7sjFd@8)IDfnxUsLcQ87n*5v>R)g1-zeMX{nKBfJ399_RBkFMj!i# z@^ZW4(wNtsj_(TZC*&3@IJRFea~Sc^Hu0vPUi-^g zCk!*o@F4i%w_E*tzKV8(=nmUEgvOjx0(kQ@@N5rAFEPN;5_bp-d~dcI9V2~XBLZJV zCGXbLH#dYpBbYJTcj1>DNDe|D6QZWRK{4jr0yu&ra-VOAZbOJ~4Fud~heuCC+qp}X z-4-mD1GW^-iL` z-r^ygxK_6$W+Ep!Y+DWkkq5cdnrNH&vqE(;a3btI-#v$Vq4$KYe=`Vjr4${%fVP z^eFu9>DxUxmEv|t33z|+82Ihy@iW@xvwxfetSF)LG`|9*XiW9W@$wzyL2Lg2OWTE# zYo1+EoYM6u<-Mn|*|}e&0=&q#b8NJ;cii#$nx4{)o{RS0o$}4hSM{k6-K8zSo6Fky zXalHj)%kUExdy*B_p__wGuVauFevkSCuQx8m76m+vH8)4J4Gvg%6pbV{HXJ|Bl&D} z{RRKqw#<0vE&iZvwnwCZxQ9Z_#o5~vIS_dX&j+wFaOoimcay5qaSehm4#GVY>ZKG1 zYE%GeBYz5Ks8J;-wHGyf>ATC*`s(<2iM--zbz!p4!lNfEb)?HmpAb?=^O`&K)FjNe z=9hR-kr5JciIj?bID~a2w2_xxvNd!Z)$6c-6?;53bzw;7*yPSmlPZLJc@=8Q#o918 z+90I>NjjSOJZ;eNrx2+2W%M}EQ>+edt~aKcA^1EjZdfV(jVJ!z>C8@ER*CkJwr)JTWHnZXF2 zs0+asHs(ggKcW+N5Kx1$N6pXmHzBTsPE?+zKa;h_E?gX_Iahj@`9kK#JcOm2Jdh_y zX1&zRqyz?nBL;VAk_1`jV~niy8KYzlLuYT1Q`zaLiYXq1{kgKNINT&U8s{8@r93a= zsZ5q`CBt6gvj0f9Z7oQ)c{%@dG0zC$ocjUt|A96&jXhXrxrGq90$m1i9yBpNs52$uAwGkZ7B%rf=KhNaf0N+uuNv#|A?~eqi6UyzV*%FqZ!RTY8l@5<1e`Cu(Dm&*; z)M$;@tbgp;cwN(OS`{EhsSBnpd^(IA;ENN+TqU<{Qwq%F=4+J>tf4|Xb;*nh-DH47 z%h&6ffSU5tm?HG6c!o)0dI7*jesXBqD`p+ul&jFY77@lIVv0;`;j6T$B-oiEdV33D z{tiYIohZl(6|$YsSP!}HBB}Nq%`bOA*Vgx@yiraW!8TbghOMoJAltUkUAqmF6g((PSD5jQ+h z`kPj5JNL~*jxo_?XXiu>xsbG4!j|_tQrE!F1Ge{3QUv6OQ$A3nAT3aqcj=d@EJCRJ zyeX;2O3#2L}E*Ih{h ztMOBf?n<+QpLsjqc-H~Ja*uW;MRv#I;_e;O*QgHl;KI#=M0pII=c*E}cjj}GaR`x- z_2)B+;pWBMS7`CqDLXpcKwaxeFr#e0NCHb&mi)o61+Et7+~P7>36IjgOU_*t8sKkF z&H&yQpWvyxWNhZbMp3!rG1q=fAfwe4u@_#3+yzO@|7};EWv0A7j4{yXF=!`A7*hWk z6302K+bX?>A7KO*X&WG{Pj{v!j%XzrVy|(k;h{%vKXgZk@LC&Zni#0uvvn;{P|%!Z ztNF`wB(X)&<~85P|Mqs|jc5{7yG3zJlxNLe-BG1f`tPM;Qs7Wv z57=F_*NomSOi+Jla4tR@nu)Lh*G} z*iWAk z2uJn~>xg~DI#N^8bV}Hg@5L#?va7QD3o{NLByT$uX$1U4+T!Qf`UgG-jTLc9628A8 zlYpWC_Pn36k{mpp!0MRJ1ziZA6F=dlD3H#e3aKE}6Y~6p(Sr_llMrkXnPL{cj}&~0 zfIYkcL$3uOpaZjy*chY#NssX%izDP8&4w3^=1Zmyvu|LUGx$o5@zEM3JP&AB2_ST* zkB}qs@pqUP+Tg^BN}eT@X-YR5fB1HyqI^2e}0TaBMuSO&I9yjBV?Du@q*THV!LEumGy#p|@0kKyH>^ z7tW=Lx%hK-fH>kIZh+2~Tz6^ho+_4mu+Mv*r<{WIuh9#q=c&(HBgPNCNABv3HyZaE z2DWHS=Uf&~KmTI6HOQPi_l}#YxMMf>fk<;#$Ou(rIvdH-DMwR1fF^ z&BymfFaB}Kczq{@b!i$m^ z+#$Vo!c^MGCAkjO1D;R9%9gMxksHRqzTpIU;%2jVxnvih9XENt{%z7Ht;FcVQDtxE zJId0UnWcc28a=6oM&G%dbZY>LBfUd*y(du$&5@6K#axQWQK)zYt>Wh;@+R+s#>6mh zc{L;UY)9`_lqK}?^~PN`zrEpctvq^r1Ah!TuV#2UQG~!%xd~yjuzdFjFCA5|T=3C6 z7Ulgy%%?7#;#J8?Un=-G8s z0-ydd%4Q3=+15?hyY4_7y;+eBH_wfK@4-RM1@!2L3R2I5wdjm?pG(A9`h8K=L>~ew$ zJi<%-OapxBid@5qukf%D$vs2RBsbb3%|Vy|L+}+$3=l0OrUDBlE{l;PgQt+%PLW|{ z@Y8r@q*#9u&7M2D?R7E5Ob0dF5{Yz^#V^E%&CKai!*3y8souh`TvF1v`N$7Tp9f?X z8R0=M^o@-Ah07YTVF|=WX?N2B`9TIM>}-{0G$)%B|Cl@@^&lejEwvs;Znc%?y)xVaoeTpGHTFh0*9-W*3*@c)-&3~AL-Zr? zaoqIy$}YuD4jRGgRsL=az?%Vr=Yq(sAPIkoKklzF6;$qD03)bgVIkNw%>}bC<0;=G z5|OrwP@iJDXbQv(zqwS@yKqoL#9@aOIST+?!nZ~eij`!!gk|%&x-}4M7AH&RxjVu~ zxugDu*B~V<2raxX6l;MSg+^<(N0=(~zz9>+>pWQh=F=yRcny;-?{pR{4#(gq9V*v| zTx4{e$+tGNAV{-6yC)(P^DJ>X9r5B#Q;HQ7#wk55{lt-1@9#Gt-mpNqJgqgD%)Do3D&Bz^Ytx^R6z0IQxG_rjG zTWB8qjdP~}eL1f=H_gr`;oMatu^mihY;8g{Z{`tuWEKRo(b{$G+KgPND~|HT>JqFg z0A^F0lBM;iMrBU1KaClt9W4J4Bcm)t{MJogP3pG{>bDA3?QOKRrzlOc4yy!LM8-Ns zhd&I$U(8S^v|m(d8ipBCqm018>wlRXDwlGTzB^p`uF(0ef4OV~QEWs}Zun4c3Tdur z)MM&!uB;_cJfyU{NNTh_DRATDEEx+_kC28EUNc!%xqRuHm*wQ7XWm5`d8`tqU$jb^ zQL=T`Iu(1$W(LNN%fB)nM`*j}K0%I@#MZwQE4>iFj{qs=a0(f&@B@!QnDcjvx%KT@ z1}b+r7W2qOsvZ+7Nj*pRWhQ6?ku;-mMQ5(BNfSFh7S(8GmdgpV>dRYBA`%epQSOHn zk_|Mh-DRuo<8gU1ofTtA&msjfMle)drq(Lux_fhwVe64pS=NmLSQti55GK&cO1%ID zJQ33lCXyNI)*SQJD#7a03Pjio)-u^I(8>rr3RzAFnu_=eyQ9Rsz~kO&2%fMAp19dw zy@bx0h0dKc3ipi*qf_JDU*id$BJE#9P|MC876(ABXn9^$Y1mqsNz*Fd?sjUR)$=bD zi_p~wl&#$3saZZ-<9Pp_{6+Lo&f6{{SWb^p9RpethexREo|8rIm`yqn05*a2Vn1`I z1bs?UEU3vR>559ez)l`*O0Q;6g7MsPO` zV1{tl4TURV*A0eiVb=|W%cRd?dYIArK2irv2KOuL&1AFiU034?1(rvO^YsRLn~}+J zihX^|bB6;4%mz3oy~HfbDko1xa>Nw!*SFC8kR-itu6>TmJXyDZSH=a|=P+4UCM(5< zxC77X^Q-26IrjWl{~P@OQq;uT#b6Uu z$-TB1B@HIayZ({%m=qpu#PJ)Y@=0+26-y_Gp{z?WBxC)g@vjDcm2;W=jgx83Oyc|< zMD;cIO{#PQW+Kbsv}@sgMWPV~@%lbIiIBMQ{F-uFH_WnvtLs_QxKu6ctM+BI9qM?Y zY^;7uMjphIetRn2il?9^>I~TqZvoYe-eV=5!miU<)1>FW8=Ug#%<}ZM4LiLE6d`MA z(wB6Rs@?268WWJW0Q|lys_?Tyl)ZnGA^Mg8sfZfE9|B!oZvA9`c(?dpgh(t$hpPlU zz*UILxy^W>s1*`?WV+VUAE!)4yBiGlZuXo6uXQa;R(DSrVV&W3TSS&|qLr!%rU%MdC42IxltOAV44)nfkz0OTYQCG zSbs9=G$&JBGcERr#d9`nXk>Bvauzon-7DDdbF^V6q-U;i_7NE&D5KwA;s0YNq0?wJ zI_Q@#jPlz_VES*xg|*>-4v8WqIfY+eqi^f_TKqM>T;JTr;#_7TKY$@~KQwYssf=J{ zGL*%05-L5;jIC+ofW^CiS?VUApgeEG5?OPYsCA6z30ZeKYzH^8GhH28$-V=0-J4w} z+Ya3~9WR+4&oMnd-=KOhd4Gk`X~t7S2?8UiPX~!|q{doN`i{ub>9LE3SoKr;lE{qh zl4g!y>1IM$4P2q!Fjw@&b~#v~Je>ta2IelY1oLfWw&We0L|N@Y zyN)Fpm}Jh1uQiP!O2ASu3)L*N3`{9ci)Vb8{7GZmggXx z^0k-Z(p@#ltWBD0<;v6z$qQ9~Pqq;@+b|uxwp9cgOXQ>E**elWaL9WQ066kEPhz*C zk;!3KBn%~;?BQ+~GH8=i`$XjV;Bwets0%Y2 zUy65?r%i9N^Z;%#V7@1_G!=TdG#NH&JH!_s5lN`eSN;J5ch~5fU?Vk<>qD}hP*tw= z=Y&$W)9Az6mb<0dPOwwy`*`)$I~Br|FXe=xl$G0WunXQx=%NdL7y(Z-kFHA2(p?NP zC@`jW&^l2m#Omwa-u1|CI#r+8{FmsaavrL<;C|7!UW_IbQ{Ly5=NJEOH>lE~j7}*{6NTd1=DNxY?@dI$i zsSceNGpu|MAcCidVudkaR*%98W^zm5#jZU+P!X#W+70}d_5tMza1y%_lCmM97#L;C zG~X^>pah|hxV~ggrYCzrU#8bh(Q`Pa59CZO<`Fr5RM;5w>?XEB2GPg=cnQu8Jx&K0 zX+8~iE`EBxcE%fwA!;S`ivzooFH%@QyO(`a2&^SAyfEUXVl=)R&<;|qQ>X!9>MYOQ zy*hqMiSq0Q-{=_uR?jGhmf~3%VIb?*5eQeKj}j;YKZqaRPI8qmknlTjwS`B$LAB?P zn8curMEYaL-9mPLYKa)+o*i%?8Upge(4Z&18t;gMcJzU$$pUu{zj-;}Xe&JC3!~W8 zNWf>hC(*mKotH-_qi0a@t-*@9QEOem_9f0bhPPlon-Hlfd>c*UI{)_1C-D_-Y0fo3 zX&g|=onb=g<2 zrFPxIPhN9tKzE*rIccFbxgdp1kX8-8%xz8xh>y5oPTX#Y&^0J>5 z*Y*6ne+hS==Q9Njf;#+Bgao{TXGJW{+_#1Q*^|%z%9j7H>yTaCw*Ttybe8;^^0@vx z)0&{ouLF^znT@rc<$sypVyD9U=}>}Zmdw9!=dxsGX_)9D)>=_O@^%Gm_h_2yiW{RE z=Rz`uxP0M>i`P&LdxQKo9UxC`w=zBsUf`uB?~e3O^@T9*$O$Pt10zt^g(#S;5@qZKt z|FJ+w(6B+0Lm2r9*^saH@A|hi?+%RCzNAi@M{i~sMlzV9A2ke~a^+X8=A2Y zV2);>s4N|<1Bx<9_g4aK0hOm-h;QDGV_vu~q@>gFspwf?UYIi{Bvtamun1{CL)5^7xhwU<(lWxAoXm6_MAgKY*z_;1CgsNP@ zZmBv0Z?B_e9yoLS+c9y+UX_fiu@Rqad6E5hs*HKmt=d+5K2t`B6~=8B(olqWX`iy6 z(N~?>oxt`g^4ZYn%vodOPIJNfW4n(#VHV#SAceI!ult&fd*#-l`0t2>s$LFAeJf$@ z=f+RjkbuR4)eFb`bMuY^Xt9BUew0@l?v;D@!iBrr#@)SCT8l^W(A_eU7(R6^+oH^( zHlIk}76_WHS|7)TuwT3Tr2Cmp^ECaaun+ck$QdYZKID_Rn|iuet(q zmKDzc5yb*;9JAvhSs58GN3%=sh$LZ9^ZAz>fGiX&~=wHY3wCfn-T^1NZ2fvKlS+i$$Nf7 z_ZLd{|L6AjYu;%5|CPl;X7)w~jyCpg|0Qna*2ID2FutQVPTAJ3=W(`HIT8^Ak;I@O z^wGs-T}BoXNf+bnVBAZriNwfG0o_Yac?(SW@f_)YoV$;BO?Y~?d3Hx=mK_6QXXAv# z2mGZQgaZ5XgNcJ}^AxKOB}z_UjOU!MrMCC;jnn$AnJ$et5}VyfFVMWIk5Ypspv`GI zNhT1+$BG?gFh0+wD1&>;ye#M?(To--oUoK8%5KfGNEn4RZr@Q|3eUj@d^HlRf(!1d zP3G$YEjVR*rrHpcCyY|1(Q#i1Rfs@Gt+!)a^BD)db7q|!@_AO(Xg9D$$^IY4zWK58 zFWENk*e6apwr$(CZQDE@+qRu_l8$Y&{Y9(R;^u| z4~+cd>Zgh>ILa|jDnhkk%FdO*1kNn7`DpaPVU^v=PCvd9c61(xVfgs{Y@g2qZuP

z4$@DiwV~A3W5WGUl`j=PG^~H%S2FqeA)avBu}RZuE|#RTiQjuH@aPE&#KBKk7>UqE z{6g!-@G?xaEQ2#N-=C!p?xOo>JM`E0`Rw)J7MwfuR!*|!+3JevET8&WW~#_wrMWo` z!wIA%o+aRipT$Fnd{0{-MA~Wbm42MChiM$iWyv?1t?aso_$Uwc8U5@@^#kVgRHe3U zVj94?OrY}R5jE*wTiT7nW^{$oS?RJvBJq z!9_IOEm!+C#xi~OwAwj<8?F4U=p11XiSX+m_{?EgyYPEo|5Q!I)?4oH_UOaV+^wO^ zrp#rk6@v8NDe1T}3(wJOiL*C8fv^)&grc9H8i1<9e44gzltqw-p=jfz*$F*W9=t-J?zJ}4x|%MXyU z_*qk=y_d;9j7BDeV(qv-JKtwFb!@k4pI>Ajeegbm!^rk4UQuI^(o!GytHG?GlZNRk z$M>sY=lyCA?F7TllcuEPq&8I&Lb4xygkLf9rKgpKjWyAtsG+SZq?xXqLuHJxyFkx#AEK!ST*LSmPE+NML zP4~^}#@;@Ip;LtgXvNtCA8{v|LB!=ya{}+@HLwVm6{EJPe^}+#elnv2&}VR2N4B_R zKB>l)1M2!h_`Gu97i|?2#@hWXel=3)W6Yc0KG4yva%n0}!CPmvSwO=N(5r-`72f(L z-aIvB9nQYgZhXw(2=LC_6oAr`cxWdh^ zp=*MvJoOx@eWV%h<4L~k>ow{}^QqGx?tAlJn19r~y0F`nygmi!tH{W!4;5%|B}RA| zAtRq5qYJ*OtYAfPuLji6fgFs^D-1JNe5 zTZv<*3)aYdclW%pA8e3+lAuxTF1iT&vdi?g1o1HJfN8Y`lj6uVEo49eTq+w(dnomQ zYV{?ct9GTW=nJT|v6jX)j(kNMh; zC#0^;J53yOV61#q8vH}~^_wU{&qax_l~*lePjBzXCAPTIAvXcj!NB6Svt>FS@zRbJ z3p$^Exc}X+F~w41tfB|-$5RQzqPT=Rr~4zv+C=e#?zp4})Xw}M*x1=F2TzoN#UPxhQ0Xur zvfd!8l!3`0@%&->qP_`oaxlfHNjH<2SG2Cw6(eJ|1?|=pDU{s#lVTsp5s<6-f zRF4s~Wks}cVRQlH6WG3O0_A(e@;d zV7!6=@8Db&Xp1V)gTLHO`GPgd8zfqJJ{hZsc-e=fTmjyLI>ipW0x5coQNHhpv+v9q zoKSKlA=oUBvo99oAU+l+K7J={?+L%4n&Tt6>LEEkM)>Wm_w<+NYSag!S6e?b0^l<{ zu>3ojK}zATSza%83b9Y{vpN-VtBCvc3sRSJkw36Ql-SA9MJG$mZf&!4e1OXn1c}T& z%F>iMBje-saPPWvb51lIRHS#-?3n2eraNBwfXs+>ophJl)Ao^Ce#yC;LiVHCBLx=! zT2E_`yRzKSf<8<&w%%r0Cry(2VXu3y1K!zH$U0KmB*grESNF+J|#wTNPep*1; z{+<6p{_~RcU;l}eWI2@uMRefydZ`@ML6xtjVlzg9KM0DVkWe#sVKe}f5b>BCp&(QW zO%_f3=V_kf$v6V81v(V|Tn@`SYCxE`J&ujeDJQLSl8^JuOXpGUhVRGIHMD>9FLx|E zEYt*eA^;G{3MGTQ*_bml0a-kYXb1J{u&8S&Q)~nySR3tbWccUyWfA&HGT?OC4>>QL zRM%BX$*7hR>@X|fuV{12ds-2Xo5$aa%pr~=x+>Uf&Y1=DoI{<~bYosQ#BTs zf-sd~7&2o^+QbqX)}F<^#37VqnMvQxXMVS9$N#BTbBwGs+V<78?{otI);_6g6&$KOw(7*8d;9Gr5~C~%bx=Dkwmwwvm~j7X3Cg;OiR z7=w+%L7YA`1#M3>L6}qD1&{VIHF_x1LPq26mMSo|zN)=0cd8+^uD02_h&RXH)Ts+J zozl3W?5Uu><6{kH60LlZ!hu}UcNFNUHLcuXQp)3L)UV_r4?wQsR2XSM04ds&vdb?6 z;ZrHHJS)r)cKNzFQ-ajXyghpZ)16ZO0n(q=e1#nZ2r$0}55BaFK-y%zR|I2(0abxk z!Yy13Yf3NR3^VL z9q+a_zy>euvUAdC3&|hK`91x;M6%82JVY`90%{b5!?lm4`8T$7cCU;Vnk^3gTAow4im(y0=fVdHxKxe@h*eclZ~fvRmiN{p$sXYIfW+)W&9czTuoc|lp~S4kVLy~ef$*YFom#HX5)ed zq&Z_l?28%y^KeCfkSTa-Wc$X`zQfI8Em8_Pr? z*Mj_*@GhH#7(QByXk(z4VaXM4B_jhOxe(L@G!3elP!9f7%!0M= z>qh{l7%XlwqVprQq6tKaX7l^j3?rIO*89$4x;ydlj6+r6Pb^-*@J#nBo>Xg<8?S|$ z6vP6V<$zOT`jI>L8KLJ}gmP^h!}IumSTJ(}I*|`J$k*W3CSdL8dM%Ak#P?73b<&A= zWadzYaB^hM(dwr;CVheT&82z0k82mcq9=Sytdj|R-%wZCupA|u!f?1Pjqz{2=vI2c z%o2PmF^l5#9e$pm7@=2gy$32Ep_?H%7~(h>9bbyejYB|Pypn5wjaY7w{2|=Th3+T3 z_uG}-dG3!&`g4HV-L{oyWU8yC#uh`ZYG4XFcUrINLrhe43(UuW=4zm|{Jqcj5) zaYO@greHYcttjG9I6uyyC|`COlUmG636wtHWOhvBN02Bb-G01c@eG_>i#m)7nf2?)C(RV+4y-BIdHJc9t1rdAV8^ zNf~uD6D-P4t=)EcBD1SB6=4mVUK6mSsbQB>*CjW$ItRmUP=BVa-&LgU-t0S6xkA^J zuu{W&w1u(pl-P9!N3@JqAy1aAD~FHJtPBf+zmV-RdeL_WS7Cp9?`MJaykz~|ZIIDL z_dqwYP)8`*Q_dwdWEDqV&i%+{cKLL<_WonEHN0l74?~Fta2`9rxPJfyX$z`P!QAcOE#tfM0(xt~jObztrH?bcmW^t*5H9Le*EJE!RO@D^DE) zU>m9dbVfT-*Q6$kt*c*Nw^3mY$h>wA#@iCrVFA@uV#GR@t8GeM4(O2r?K9xfYeL?n=p5PASZ56*vs>d}|u3(k{wuWkbWj~V}N`A5UPRH}8 z+oPK%s9ZtXU$3rWIw3&?@0=yvM;!o7ssI$nZts$HWE0h=yquLNu6RiN`(#mI+B@Qf z-4ZI__S5h8&c)v%-Bd?B@w|XDK3?il zHp8;3|Gn5LQC@&#h#uXo8UgZbDSsfn zC#9`d7yu@|-FL^Y`Aj98^#UybydyaeyMm2zY6O`U>}MsKG7MIa{2ij<6xoe;$%a%X z?oRZad+3>Afdy-LVI)}1{Bmqnge8I$)3ne1<@u=K4_Klmx~d6%w#1OdD~@bDIq&=z z(uAl<*m(g$i@bslD&nkx8-DKqI7vy1+%)IL8O!0wnjN5>erAIzi2M&sG_tYqthh=tI0>($Gjegw28J=?vtDQDcu> zxevX>C$c&?n^D-wlinaSyC!0eF8ZLF0m*NCC?0@ zw~HjaB|Ajm1zuk~+DhI?3&0TW28hncOU%+x=Lvy6!Xj&84{Wk?3*%c>q}DW4tB}I4Y+w)l z3O~dpd5%yY=S%sleBBW*k)@NV1Eb)R0(8TZk6$|tJs2#-q$D;56f0Tc;dn-qrnKGW)@6CVTbmes6%O6Khx(L@r!1 z{22wVH>54JfSc9$XB>*azPIjBIo2>~GX!I-4d~)$qmGM8j`gb3lDh2C%qz0qv|rj- zGYT{|-zT&GZEl`f;4aSL#y>HO!o`QLXLL2Cg^MGiqRjDqNSMB4bwYYPU(#k?8DJvT z;C6im<;PovX2WZ>imkP(yjV?MrA}{=;ic8O-)tX`A7az;I>^MX5adNc*oi&`dqOSG zL!t(YjJU3Q1X+vgtUTjFvF6Jx`5akkt&?3aG({-U-|Om{lMUwpACtm@&XIyQlp+5C z3G7CzP@_%IG#sP;Sy>*f%p;%5P3#_v-$=bx7MOcb zjX`ZMPpL6_8*g>3C=HhZIe^ShM#G}dD>c#m9RCZ>_p;yq@=` z%?<-FkD_I}aVW4^=)_XK4M73dF9bB>slP&?m7=g~kQVB)R7oT6c3`oQfu9= zushK?f)+IM5q^^6%dd5q@%NK`HCp*1&ChGb4}~|?XYkL}=g^#I>fZuS_1_IV6*u$$ zGVpX%KHmWz`B=wLmi}QNid-X>k4XroFGwF59nA^()ljfEjn!5roz-X_B0=K~mH&Ak zj$xV-p1aUt`cdi?{dARe8KV+$VT_!sc(0uEw8Z_ zRuY~*MZOB`OungE3?3eQ10(3k%&hDJq7rQ1xv`QT->Zw=B3a91)#fzNWza7584Vq* z265yv)YaA9(cPjZDl;ZB#PyeDxr$D*>9cfh5^Zc_!CdSGJ*m5yx!-aaOXN=By|ebVx^PBQi(&-fr7xGUDg#PnHlYKFv|{N{xz3rg}o6m2C?HTUc`LZ>Tz_~IRgn}|^ z@6yz{pVAK0T`$M}WKIyNuaWI>S2b)eambI^(7wV;nF2rV2$meIB9QD@TU5Xpfgr;u z#pF5Tzj*%SjDtAVs)5a%`lpE!P#i88nz**De|1Ic_DM;I6vDl?&uZg+kkL@x2 zGGOWR4UoA7AKv$g`r+PBI4p4`J4M_cMu|@K3#c8h=4aZ)_V@qHT)u}8x1lYu+N0)@ zgu)9oHh;tG`suzC5p0XH6$kx2eeRj^jay2rP!g#&0o15`g{AotJ2H1b#t01$$HNLd zHz8JJ?S+iLQ0%MH%$G=hUo!q@-KqD#1YTR43rp5#+eh{peE*idqU!ASulkCzo($Nh zQEIQ&%Gzq}p$sJqszr2GL<~IvIh>DDs4Hf@80~khtxZp5+A$I3@t3=zLY}=uEum3n zm&+Wkqm8)LhqyEjEJ~t0L3B7KT5{yReoDK~@xw@cKe9m8^6AJ@k_uGS?vq@UN82W9 z>iPHeTptUmnf8R(d;s(|HxGk~;&LDVz-W-Gnd7J-dL$9)PQ#>Qk6A@xT|IaM^VP!fLQ z5V~ootME1Fynp;Y_StK_0?6xg#wwV&ZnS3?AImNG15KCMJ5URwLE^YG-KtJNEa^Kg8$ zNwz!QN|{R7k~w0q*Y?uitgYlMAQJ1sb@>N8gP+QyE+!8D@S^*@qy00@QnS#(D}A1H z*1xN!X;|5snix6%%?I^=ZE>H~jl-h&r<&Hl!L;gzdZT5Dnn^C`z9OTWAD=3?mQ1Q# z2}$3tAt>yO*OW18LsF+AUH62f#^5s~XCI$WC03#vH26`zXfSt=U)Quh0Nr-wIi10E zJZn0(Z${tR$b|3E5 z0#^aUe<vl#D1!eJo8arZiZD~-jxs4&F+M_Kt8<}9QXrG%q)-T8ljtw(Po!N zmzC+87w8K~7K!6?7fKUN45#ykCX9o`iP%zj?WW(a6V`nN{l@V<*!IV*Dv(+n$Y>IFpmt(DCFUP2Q&#YsYyYYAh@<4S&oST6#u+ zV?(%5_3^@B92Iu%c?bw17c&%sv5&y9VlOe+5J@V zyh4MdpJ193RC)%A8CstdF-gX6cUL~%=Qwm2B@7)q#|iX{{E{3e&W7pScgT@W$IujEjVKXB1@oo~^B33L@>zZFrRVJ@($0xAeWc4G2dcF6JT%le zCG%3|wbscS2-4+!LnX5HMtJ>&lvqz_bc9i+k;ryJG#04 z#rO(Rr)*F3X%6_C$&vqm`K5@hk&BD0gORD3vx2epr%gcWZy!`~bv84y`-l5gWy1cm zmf}lFt1y9<)6rHTpi(#zf)9hVmL^kGf*C6o7SpTG;uPUlJBz?86Mm~C1{I^#Z2VP( zydpoEU+n59chv0!0l&d(wN7>D zNnDpgW2xtu`1hZ)Kj_?FSQZS&ucmgxdtlkx$jb@PrM#_O-t~ttB5zaykg%0IDyguX zWADVej@U%6Vma25$9TpM&P51DE%_x&`$<;KembkpHhO*Qkmz?$Iil*pO_&Jx)%ECc zqTO)RP0CCxq8b<%@EFeTc|MMmr;N}FDJd8=gea_9qaZ%CDAyLTG$@UW(Xbh^`Wo)6 zB$viiZP42nPyV5x0K+vPRr}8K+ty;^)A(d-I z3#x{!pZj67#mwflyj=2`&Y7QsOfDXY`dCC?vnl++<>Kv(FF!4{fCGw=w6H0kQm7%8 zHU?^HYd*c0NvAS9BxT$n{t+Ehuk<6u(+bUsmu!?J6FkhH%ef79P)T%R*Am4`m|iKn zzzLg1Qp|!c-WdklXzE6TG^u1p(pThE?to%GrAhe-@1&`~F*mRmV`yEpT_l-dWN@mW zErRVCYYDq8_7BW8ZgLMc%hogaf5P@ZY-j|LlsaXf;Dd+!p9+cpfUSswo4u=*y~V#^ zE=5^R0Zj>=ua4zBnLAjxDh$KwI)vF59%~QS4@Rs!{}`4?Nsl$&96c|;Adk?_aV>BK zzH!_yx-b~_H{&(019xl*5xM=vhR1f-QMS+F+v}gVFX*&}TtS?$%#(;hAw*4F*oS7C zv-RbD=;7)c@&jndWI>v9R-9Xzg6)d_W?c=kBWyA;<|FIZ+AV4Z8Jhq_jtvnV!{Rg6 zvoAT%L7U#z_;^js+U_*V*R@N|`&^WjTL}von)DqtnO1By;|X@^8{V6C&17vPeNzY( zy;h6Q6%fSoB7|XTmNsGgM`#Y+q%1`ZD^OSMqj ze;@a>Mbo1ija>6TXMLiwov~j4-&*V>F}^{rTip_$$rGKh|Mq35%7wUL&s`hfvyhNg zI*AfTXaF@oTF@7xI1U&`F@ml|&aF}V13&Y@t*AvQBAVv)A zmQtH!Jyad{OekYpCV3r>{y{&8X^sNVLjHORUr1>fx|*VoNx#GV%c2O21Q-u@D{p*$ z%SZhxFIhcWdHqV0d`8uLCQ&~A&OyK*_Bh~wgzA)?gKY zU0E&r*qIUdfN!J3$Ve!qA1W*AUSqmAN+aPfthpQ(V)tw0+1O43;s>C+&m0zg!d6EFBSTy9%5H@pn zMc^4EPw`zb(~_9&riD*lD}Ox2hgaYc)0A(&LFin;zLAror>9cO6mS^qx3pC!mv44-pgLfS1QsUj2u2%?u)6v&ewlHe!&@ z`^My7OgsoophxPT$oKrDUFQFVc16wX+&upa*#8IB?s3ZPW|mrIrAh?xd+smc#Df$N zWAH{2mxz{=1p}P3m3FCHss@GLh}`u8A!;B{ji)4traA3#Qq;r4j<$GM9EeI|wxnC1P`Nvc^N&f9Kct0^b8IlK23tjFO;(804$$gDSgSD(LH$$A2FB97dO z0|HHuv{88y!d`2n#RV)WiE7X**U?G-y7kXZ&;zm@`&kQC{WBhC23IPYFt%}ZC{Z+x z6HOi9h%yH3Q3K9;U;fdkoJLHJ0N;GOH8WFKb?j`w>9sXJe32C?R$0Q#DSFK7XD6R0(zSc0d`eFT-ru3-#+w{2W zt$LZw8B~TJYR_O@zTpw$Wh#zhddKXj8#!ksIYO5&eI zlt-~cJtd2%4Bf&Z8IK8{>^&sPGGmYX$!mTaI;Fx+W2=r(jjf3(Sxv3;v>$CQeOZH~F2og9 zc+URXcqvuYlE{ZVo5wSvY?xnc`&6mKlepFGrdl#;I98##1U{kCi5SuzPgW4 zQLkI&ObiDoQ+GMz9smr$`Q(1C)@q6s+&D<@z52l&E;C~SN|*HcFkZ_H_52@z5CU&e z8p}5wyp>qrN_?ITR7OfwT4zS}2S^Bu5;=%2|4LnNQ};%m~gvTlvz&fD&+RNsS#SSn_|PF7+h#BXHzCZh8F?iG>rEa`Nbn?`Wp7-d}o{Y zl2(-C7qV}DLU}<_9x(z`(Dp%RX4*9*;s%5X69FNQ!us$U!FqU8B=X~5#&E69`;lv* zk|BUp;uO7T`FKsK!ECc>FOiyPYh~pH*&{H zi_YK5O?6aJ(b9{3Ib5kjQ>jW9SnvfY$g{#F8fZY-SJsw?OGRjX7TQqIN z{yIJ4+ln8qXc03B!nk~Q+rv5G@2mQIY=yh63|I`Cqw&ofa;H%QFNpA+uM~E`I(N@7 zb{-^~&InWVR++#q0)!*0$Y4j8uECPRWSdf>}F5wJDTJ_&?uxz{B#qd>T4I~9c)*5cOelK5no?H-zoRF2IglG!Z+{Exh%}{ypAUC9`f>f z@{M2_RE~#a6HVE}Bs?c?Ld{|is3urak7yY*54AAhX>l}BC22VkDDn*%HQr49TBKuj zylHCuPG*igAnw>a3}Ejxa)7=Im6uWh>uXg?X8EUU>UJYH_|pT01bCcsLB30W1X5{d z8j(!L+<&{Z&Y9LOTxkngEqKJm4v<0Y5|n{u9G{BbQlZW|KQ#(kzm2Bq|3V(`W$sE_ z*V}71|N02lu*n7*B7MM&X)+}!cvWtTEaX7IP4Ko){RE4!jKeA^l>Ibf9fXv;%GOGy zHvCen^G?*Gd?@R3AGi2gO6tfEXZM|V<`1~k<6`Rijos7u4u1nUaCC&c$$mm0I$2Pa zYLWbHs#UaB6ZIEw*liRWk(c=bGF3nEgvlf>q7x`Tx5^FGVp~aVcs;TVRa=p`!o%rw zX?IyNreGzUOJHo+EM4WvU6%T6!W{dq(phIehJ2}8{R#5K9H)JS*g|@~}pAd0mbQ3hy%jmgk$o8pQTNe2e#e zeWM*|Q5yo7t$zK^mqoET$lUf(bL#O;@~lhxRo1t;{wxA31Mao%hog81Y3t>Io_|I( zxwZ^P@n<<92>0oH`d<*O;$h_IXl5#EwGfPX`$uY5YdxQq7 zEoH*1$N;s*s1Zt3)tbnP^f~UxzuDmB((xqe+_jDtTYHCWIm zQunzN)oWTr>`T}W&s3AgOn|dcN@9rzx4JlNEiIYU*p0k))|L7Vl`VdH1!t##n|$$% zT>{if(`MIs02hBNUB1 z_|Ige{6##r}k|n!E^6dTtD}FKMqv zJS1CvVgg~Q+2weR5zixRuiYr7qdjeyXH{0tv5}}KXvQ?%a=iW#e?;F}>cK`q5$ZMSOtP_5Iq-^DrrQM_#4o!Yy)g?Uki+r_ zLj&A1lwR)WvM5^F@VA^^SVK9E^@q!riE>*VKz2{IQMSUaV!pEf4jKYCqDXKyw7}O) z?u_#NO)=#oIVU&|F^_0955qdV`3yd1;8z{|4FG3q<~VM~#318)X0mxU#w}-N-Bc@F zKY^}b(Vt<_5&rbsD+>8{uJ`b!_i)8DuaN&8*O#}@S>mp;;nIrA3=$Km0$&gA#A#9z zDI?756H7{LztBMy$=^Pbyb7>mmR{PDumZ2QD{u_*vwXey&$tD%bYztQ8Qe}$-WAee zYo&tdm0p|oSK2T9D+5#`BHfv!HSt}Ug=*>i78P~VNpXIQDGSY!$Q%)^R)9Z4uArD9 zDhw|=g{v%o(ir#ZOGm%dQt%B0{VC|?yAybr@c&!pb8vJ0SNY4eCYav#%jZQng#U>& z|M62{FIO`mXJ;cXg};C5{};Ye)O9>?mjLg>EJX<^4KWN!hBAoqjumti<;CK5!g$6) z^wu$Q#uSFa6 zgWrR@Q~ZyjX(xuOm-vr$?^i7@-_CE(`JP_|zSas2`M=Tz^IUsEY;rpMihwpd`c3te z8w3OH4god&jfv_o8mrORkr>)YS~q(u2+k4VE`kSh=_-#S;h;HxFpr}ayaJBrcrO5Q*wo85$g>IO zP%uk!^e)AFWS`ZubodiY^E9PAda0tsNwYlL&i&!S#gfw5mVOW2H!U5WSI%pWiffU%xQIzX$VcId zSF{tRz_FJ33#_|+UGGob%BzeYlV-xdz0D^CS%mv6(qOVoJ8AH`j|&M`~vt<_|WEEH^P^R)0twz%JWwlZhs6W5`OGUCj*|A%9h=S zN8g91?4pvhFiK49*x8xA=ElNvm)nSZM(-IE{f2XsHVNsdmA^Nw(sfg7_#0J@nKC46_IjxqHpOx)H!}3Ia z;7pV?3} z%ONT8Cp~Z6#CH!Ue(Lw3Q~lkYGSOsZvP5(b;VLHooC}Bi3dB~&^%u3TL=i^C!}=ym z`Xt?Y4IcH8XWOsTRoQj(`c3s-;B;q^tF0(;aRw4JVsT8>B2AzZIc0D3_FFPTY$hy;hsnlRPV@>p13OR`A9u7 z$>4bf=dg zB+JKUi4nC?$1?%MHr{;zeo#z4jM+t~o|7(T&B^%n_HhKpa=Do{^0| zD8smKHsY1qZ9^alEw)(gMcNZ`RgrGRq5xe}$=n1q)Q|a!TSC7-@%m+&zDSN{qwuv0 z$Dyo# zR9aoyjU$?hZa2<(8$~T!AyGY*Kgw0<362!@E+B+*s@-FoWP!7hFypthRZ zV~l|wT=b~tKB9NHqSxy<4h@m5e3D6>Lg}r?8m?hQV0(eyrYL^b@|pa_-)(G|`iQ#f z^i=5lusgFLu^5+H^N|V~%*y~5;cJ+D- z8<%$p1hPqLml4UrOqNrK9uN2T_j8Xv<<#5X4>M@x zZE>YA;H|f#JF%ncqMCr6+MxCzsE~_mrDVo>b`g7$@L z58DN-3jD8u#HLFst6tn-KSLc7XS=9QjLG!|%_^C63v`Q))L^K};^~)Iy;Dhx*^N|f zOe~v{zpxH+SMVjH`^={(NmGfLu2?cfPEsdVuG#B!J9D;5$TB%>Q{dHOEhg<$ zEVAIcGnp+)w7K7?I7+z0+Y2w3zy5Okg2v4)2YU=WW(ykfCW>tz_mBZA)T;gr|y0O z4+wO_6HvBz1~m`OpZw_%yMR4{6wAFA=frE_0V5^t>iTJ(+47n3ns&)`xtJ>I`Fxnt z2!2NoVY6*Mn!dAtpo+TIT9I)$%87tnRd-=F^mpeQj!w_Cfz^Aa>a{o;GtL@gNy2$^ zBsPLmiys{kyVJ5Rx zs`V!67`wKc%Dr?p{WM7KCbE$P$X1MMn%mr`?y(EE!%QTP&2g!qmPkO|32Wxms@M-= z!cC?WVTaRGm{2|I*xJDq)C?XJmiASwAJkRDm=RVWI2ZNWHcLV+iHA+;Ag#GBCd% zW}3`*rF3sAlk|5`wQ)P+LCVxEv7c%oqftA#S(+q$+!JnhJ-%8rm=#HGv*}%s$q(mg zjAJRhsWlVPNJa*XnldPAz48J!o3!leyP|uxd53gR*So#cSPCcU5wv5p&!O%Et_l1J zXAl8?7pK%bM`ASHkz4dHF?=}AvOT)&m1{6yxe1c*JWI+c^q_Cgd+_=Fi{2=56nE|b zSI`9%YPsfoL-acL)-Vqk=7)yQTh{i5(7I;WlC}U@!lCsLYTS05e3j<)9_s<@gHDu< zMks)j;PGIx-#U^JX8ZP>CsW@0FxBRuoFuurOa5Zun^9Fqp^(O0$sC`NLo)5jA^YPN z-br5eh?RFwJE-@Xu&(VhtW#H4hWAKTMS`V$a6WTR={1#h$}u*=g6}Y=7Lc)@2O2ws z2O9T95o03!jL;fuo46g^Z5^CT#Dt-cm7Xw|mGv~qopx@E8FXuS!FB#pWEVRdva`-2 zAwTeS$W&OA1t!G2G`-2~)9C{5yniIxQr^oUip) zxhMz#eG%8d;urS_<9fe(I!7S_Vn4Wu5*)xCbg3&GiwEk?UUYxjRT|jaRQH zG_p?ewyp}q1kelDh6SSj8>e>VPajGL_fX(K z%M zvew_`>F*b=MGFb)sgc3qZLi)EEN!J7idZ~2msE&(x7pZ#kOj>TZA1`v8n(^8XZBEd zs)O_^b%a)WL_9brA~ryIn`D6$X%6uPl_eavU$`6Cuo6NPXFN5ra3ULAH%#@-BiBDu z+kq<_0w0vglkYu15eb3>__b9Kl7%MCVb!8CLIGB=sG_O3yNb)_Y4{=|DKAKbVh5du zM5+Orrq8IL1PRWoWn)lQL~`(B@#euDly7deV{n#G^7GZmmMN?ZlD9W`R*z1?nKg>_ z(G2O7=O+2A{(<{axd_B|iAM+ttT*BI4@4$5vwnOK|HuZ1!rZ!7~ic}1|NQ3+Wx}?@sl*2 zTQ_y&h^ns~slm!@@E$RL!7eV&@~^f?2W!nJ3)2@JW?tMrsV6`BV27x~Ta->htZkGX z4-!s5pH)UKibD^@KooN)>A(bYC-K08nWx&27T^dSVvny2w($BJS{!LROT?MwgFcUi zxdaDI`DH_+7f-_X2MT7$kV^GF_1WXfO!WuF>E;+b00}mYm*uyNg6ZJ-+Ug%33d~8P zM>;hdmNv%333x2pNz0F%K{|3(DS>E^9c(LmSCaFi#K;k-h84}32=~LRz zK`dZAX}hB>2M%z?VMRD4;<3_E)6-X+;ZQ0~ZE~-Vu3u}pH+gLJonz9tK zXN!c8h{=|egg4}Wy>I=euJt~~@;uJ>bM8H7?woth?|grDLuWsvB_>(XdAMZGNkuX% zMNpn`P7A%RQ{JXUI$^XdeGXPv-LZaFFXm%jNKfLWfN&9yHnX}xJFHO_h9K6nwOG2& zZo{z#HeXEgR@b{>&$T_L|gImG&L9|D_s|aV# zhl~hzYWGjI>a(8E7(XaLC2mNY2}(8^lTMdMzy4Y& zTn(hl`dX;E5Ea2#MJbkRNs5_K96ep6>V1O8A6i&-hX6Vfyh_8BQY2*bq|6xm!6<>j zOQxC3-r5s@W>mQAR{C*Pm}tgR|9qi&w5PdE~4 zHNYN}WqHYF_NSzA*8PTx`#~LV4UpHF9k9b@mClY%&Ro|RJXXtv><0YhB~njduWAid z+Rf_|xMNPX8zdcAmo-$K#kZz1v~w-vXf@kX6-k7_73RwT0&k zYmJ$N*}jYJ{WILq%<7GD+{pE#(&S}NnXk?&~?uW=cGX?VsTE*(0jMvq=mE2Whp zLynnMLr6Z4bJXfdImYr&ejj&|RZdzRIOv9TAk_9V#rsRg}Zl`sX49>6AHV8i@IQ5wzj?i=%`^MQ5vMheovHcCYHvX;S z%t60nOJ2v0YUtqaOtR=P0t$ZDdyU7 zn7|vPYVYQkO!61vW^|;LP0-*R5=)Klf$mbTJbLUZ{XRm%=w zJB>~PiGApU`V_h0G5AI8>v){m&XbyMUQK~(Tr%{{q-hToUK5cLd4(V(RhZPZf1X5+ zdgr6`>D9k&=v{NZXf`1pc>CfaO#2@a%FeH3(5|Z$H_rV->2gHQ&YX3ICb>}{tLUr6 z^O;xALy1p&pB*f^Z&UNRn}@&E<5i*(#@=R*c%-tR{WG6g-tvN7@U#L$QU9vQ0~KAV z=f|rr3(uG)nl%l1;G!eKGncW zJ5u!0@ro0BgV`aMZ)8VWLT^ugRGL2&kxT#?rZ5d8Hm#rR_9n4V{=iUFH9aeVaL0DO zlPel#_{v*p(Wzwc0~ukTLoq%3v`>Ut$xQk3A(atcX4~2#_H{D-@h6Mpp77L~YxqA$ zWz$57X}>bD)f{e(c~9t?*fZDhSZYxG@Di5!&_5`liky1{<&x`HZ!~+ z8B-~#_2Zg;pZUvhj4t2HdFrmIV?Uv$QsE;K!By+at3_NzHSw_YwSXMHnc1MVrALR_ zQSZkO{}e@R@R1j{_RSuan7||Vc9KgWs7}s@FUoAh)@*Rt-*7)W1tq_1P3yzxY(1V# z=>O596Vg27*F-JxP5H`0;Zm9+j+#T0_r~V}rp^nB}hj7lqqpLu>&-h)>nt z{PP`F-_{mZZV4m}v}+j(mRMg+IpfQPPnmKaHCyF>Xk6E<@`#E9<z25MxTbb z!JaX*)X+;w~` zP(~w+7|Y?tWY#hvy=ij3E!|<-527Xy31k+|($47ed3sDfja7U_1fh>xwmJ#@T%ozD zTN5!@^YLQ!0Rq~Pk2OfET(*Ll71jIiZK_tElVGAVRP-Y8vYWaSv)VIS*sSTuuPh(b zK0n=V=Su2!{g^dbf(;V+jD0ID0-q z{TmsyO^d}iIrVH#CXxmhW>_X{v!3lsa$VURGak&`LmYv{NG^^v1VtRL zc7yuo#SQhi|4>jL{U*W9q18oB=mD%w*@!YX&v|1w4-<$SN#uc4t_wwt7r80p2U8v= z)F6~o< z8iDZuwawalZle5@Q#`q(ik^Gh zpr?ttG*`{S*0p%rTi{of>NRLq9)JJm^kNUz-6eIXe(8i^ zpYCvTKgMLTxwYBd@0|D*ePNg`k3z2dy`rxlPnYh6VCd`04i;B{7_q z4LptHUE7Q;BXUC#Cw4F^YjDVQe@G+g=i_DPLq(qnxq>cl%I}xpe7F&ziHUTkcp}r` z+3ft4k|*Nq@aX}yJIn$jF{7Vgqn8+?PkTkyHnNYx@>Opb_Ev>4)gu>8Knz@ZF9rZ2KuHJg}CSON@QWLwk+orV|z|6#=DnSuRM^@9XcqZ ztoGpfqOH+!BLXg?V+E3JvS+^5F^)!F=roBMh_~~raI^m0F2e6NzszV}BP~ZP%GVH` z+N^dWoP>}1pRmk^+=krt-1ZhLs|$JO^K88G$8Oh})IR~NTu$rxUVHXLwV!`BDD5JV zI>GxAXjNRvq{q7}=C$n|>WK^;sid-IUQQ%3CU3jc3}o5k@KaJ z#PTLc- zG=*q&d5YO6)xD4$e7du`=;REa4%V~!#E(;W1fycdY|6x^Ud#6;FMh)GpBou?bn%PB zWD8b5Hl62XH9mvNKwn9iF;w4Kqn;mw_JdD(g{d(Bw?DR@U4G?}HQA{vBiLp%VOz~e z=H=7~o?_RI*{|WPMi&ipQfUrL-5pCO>Yy~cbh8t-U?!6uNW^s_nDUm^8a@_MK@xMl z39ENhYl1QeF*H$d?{)MG2C0lHSx%O#c)={TE>?*@X^ess6U+o9WY~{T5_85W)uH4$ zwa*9^CU7)F%ZE^x-eR_zR|$S|`%=(V%2MLYsMZLIc)G+-6mAyr4zKKcrbM+HPZ+4_ zQ9)?r?NMopi#MX^v`1DfF^fcWv)Q3fDfRu;%jSCEzWtq;0GLo+DmK&s}fPb>&*hY%GJ?rd?1U>SyQ#z(8h8jQXekk@~13+$W&y%JHfEA?! zi@^TVJy%q8ZCqh)HcoIWV5iX5ZknR2<^-&$ha;kVL0}k!Ju$miEYg7#tU9q>v z6Ugp*&yTE*h))iS8q6;TKK#UV=l&OK65Hye20jy27jHGB3RM+X3FlSQc&xioVe9nc zgCi8zQ>L>-Q?h4ktnEoKHod_EbBbQ!%lyFk7PXs$7e+p zHJ|!SHu7#p^QsR|2+bBiNt%@%JB(}`^M${k_04(-1h8`sy?NmAjz*G*E}+qY&4kVS z`}dpAZ0~cbr+;#Qdp(w~`%Yr^`aS$daF)2;6U_5mnTuVBgX8*)W**htgh8|*T>%81g)(PFBpXDPGPYu`h`AZOlOC`CmGydP>*wb>k04H zGC7joYFjA!vnQY^!3=)*n#6L7QIXL%_b4@bS9+Dup(cKz!qmq|C(qG_mvg-=(SzUF ztrj5ZVTCVWkCA&fM?a@L<6dvy*Vb9hS-`MfRG3031<|k=Za8pAEm^Lqfm7J&gKbHO zvq^q3mnExNtuX0yH!;K;A&jtq=(yU>1g^^lk3ZuOa82$Is1=C}Q@ut4)7lX~8e%^In5k4w2vO(m(l2G~SC{nd0rj9=eE8q~cs?~9y zbOlN9JYTSao=XT#Dj4E9_d6f_A->;5(U;!YC5{-Ra~ZTICFV~ zO=tJRIL}1a$iPVnOLH4#G?`17cK&3-n`4V&1ygvm$punP<)6h`R0z3QmPK@+t12vC z;y+#(TE;I_FZT;u!V_;*hH!u957(xD)+v(q!=yb^e&98Wp5LSg36D#$F6Xw3G$G^Bn z`N^U2LRgFjo;?3~ia5w!p~`)&4^NOG@c_x0d2j_ zl<@ym!ou0Y(gya&_1anxSJzEc_TL39og5sT9Nl&mIQAQSU{j!fdjY^t99R4Q_IVbb z?@gKnPShQ!`q}?$Y&IGxFs1M0dX4v2?SEGS(2#L*_Wr}a7%YjuLVn&9SQGFCnsBq_ ze;+7>;PIU#<$xRp7LL1!j`4Ng)&>Sbo3SM9zZHR>C`3QwPNJJWPBL(qg(J+Bh3~)Z zA>g_WEzrBs0J2hmEbm{k&P@A})ddm_+5g^q0v10IJGZ0`d_0l?QLKMoh#r=Gh;LtG zrpOyzx`5v_AJF2Qf7KWUBthQ3!8R|1jqI0Ufvx!Y-*!z$9=|5FF{|H8195jBjIFNN;FACwOydBz!}kH$&Tblv09)(g5DSs}L2NbJ1rxw-t2lym%svQP zy;s2iurVSIu#DUXV0)WHFa&G@hl4mL?E|vCB^($6HoU??rc?F-+0On7i~zeV;Sl|) z`#@~xxr9S({k+&TiTUr?9Lf1+?u4-YWf_ATg#SBs2bsqF)-z_^F!3eM!0}jFUXm`Z+)(l{M@HTp!eh+$g{eLHc_pCp7FEdWRpl~1h zf9`AsR~@{m6ek^6vb*$dTTF43tvz#d1J{4YX3zA->_quB9f_0rue*RZbo~}XAjd96c_>yCB{Jr>-K=`9#{+pfuja-prFP*L4Y^O-lqbN z;KC7%TJ|996wd`d3GhNI4nfns2V(nWS12xs2xhw$fW z5m*~M$B)yl=-)$o+ZlhbK6sWEr*AO0m;SDEwwfx0z*E@fTC4z&>gB)zu93~Z{s);g BEVcju literal 0 HcmV?d00001 diff --git a/lib/commons-io.LICENSE.txt b/lib/commons-io.LICENSE.txt index 0a29a251f..6b0b1270f 100644 --- a/lib/commons-io.LICENSE.txt +++ b/lib/commons-io.LICENSE.txt @@ -1,56 +1,203 @@ -/* - * ==================================================================== - * - * The Apache Software License, Version 1.1 - * - * Copyright (c) 1999-2003 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Commons", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + diff --git a/lib/commons-io.NOTICE.txt b/lib/commons-io.NOTICE.txt new file mode 100644 index 000000000..439eb83b2 --- /dev/null +++ b/lib/commons-io.NOTICE.txt @@ -0,0 +1,3 @@ +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/src/java/org/apache/fop/area/CachedRenderPagesModel.java b/src/java/org/apache/fop/area/CachedRenderPagesModel.java index 6737ccb5a..171b071c6 100644 --- a/src/java/org/apache/fop/area/CachedRenderPagesModel.java +++ b/src/java/org/apache/fop/area/CachedRenderPagesModel.java @@ -65,7 +65,7 @@ public class CachedRenderPagesModel extends RenderPagesModel { // load page from cache String name = (String)pageMap.get(p); File temp = new File(name); - System.out.println("page serialized to: " + temp.length()); + log.debug("page serialized to: " + temp.length()); ObjectInputStream in = new ObjectInputStream( new BufferedInputStream( new FileInputStream(temp))); @@ -74,7 +74,7 @@ public class CachedRenderPagesModel extends RenderPagesModel { temp.delete(); pageMap.remove(p); } catch (Exception e) { - e.printStackTrace(); + log.error(e); } } @@ -90,7 +90,7 @@ public class CachedRenderPagesModel extends RenderPagesModel { } } catch (Exception e) { // use error handler to handle this FOP or IO Exception - e.printStackTrace(); + log.error(e); } p.clear(); iter.remove(); @@ -123,7 +123,7 @@ public class CachedRenderPagesModel extends RenderPagesModel { tempstream.close(); pageMap.put(page, fname); } catch (Exception e) { - e.printStackTrace(); + log.error(e); } } } diff --git a/src/java/org/apache/fop/area/RenderPagesModel.java b/src/java/org/apache/fop/area/RenderPagesModel.java index a3c6eda27..8757a1c51 100644 --- a/src/java/org/apache/fop/area/RenderPagesModel.java +++ b/src/java/org/apache/fop/area/RenderPagesModel.java @@ -115,7 +115,7 @@ public class RenderPagesModel extends AreaTreeModel { renderer.renderPage(page); } catch (Exception e) { // use error handler to handle this FOP or IO Exception - e.printStackTrace(); + log.error(e); } page.clear(); } else { @@ -159,7 +159,7 @@ public class RenderPagesModel extends AreaTreeModel { } } catch (Exception e) { // use error handler to handle this FOP or IO Exception - e.printStackTrace(); + log.error(e); } p.clear(); iter.remove(); diff --git a/src/java/org/apache/fop/area/Trait.java b/src/java/org/apache/fop/area/Trait.java index 044874cc9..249b170cf 100644 --- a/src/java/org/apache/fop/area/Trait.java +++ b/src/java/org/apache/fop/area/Trait.java @@ -18,6 +18,9 @@ package org.apache.fop.area; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.apache.fop.datatypes.ColorType; import org.apache.fop.fo.Constants; import org.apache.fop.image.FopImage; @@ -34,6 +37,10 @@ import java.util.Iterator; * This class represents an area trait that specifies a value for rendering. */ public class Trait implements Serializable { + + /** Logger instance */ + private static Log log = LogFactory.getLog(Trait.class); + /** * Id reference line, not resolved. * not sure if this is needed. @@ -402,11 +409,11 @@ public class Trait implements Serializable { Object o = tclass.newInstance(); //return o.fromString(sTraitValue); } catch (IllegalAccessException e1) { - System.err.println("Can't create instance of " + log.error("Can't create instance of " + tclass.getName()); return null; } catch (InstantiationException e2) { - System.err.println("Can't create instance of " + log.error("Can't create instance of " + tclass.getName()); return null; } diff --git a/src/java/org/apache/fop/fo/FOText.java b/src/java/org/apache/fop/fo/FOText.java index 659391d18..f168d9693 100644 --- a/src/java/org/apache/fop/fo/FOText.java +++ b/src/java/org/apache/fop/fo/FOText.java @@ -500,7 +500,7 @@ public class FOText extends FONode { public boolean hasNext() { if (curIndex == 0) { -// System.out.println("->" + new String(ca) + "<-"); +// log.debug("->" + new String(ca) + "<-"); } return (curIndex < endIndex); } @@ -519,16 +519,16 @@ public class FOText extends FONode { if (curIndex < endIndex && nextCharCalled < 2) { startIndex++; nextCharCalled = 0; -// System.out.println("removeA: " + new String(ca, startIndex, endIndex - startIndex)); +// log.debug("removeA: " + new String(ca, startIndex, endIndex - startIndex)); } else if (curIndex < endIndex) { // copy from curIndex to end to curIndex-1 System.arraycopy(ca, curIndex, ca, curIndex - 1, endIndex - curIndex); endIndex--; curIndex--; -// System.out.println("removeB: " + new String(ca, startIndex, endIndex - startIndex)); +// log.debug("removeB: " + new String(ca, startIndex, endIndex - startIndex)); } else if (curIndex == endIndex) { -// System.out.println("removeC: " + new String(ca, startIndex, endIndex - startIndex)); +// log.debug("removeC: " + new String(ca, startIndex, endIndex - startIndex)); endIndex--; curIndex--; } diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index 3cb5d9cb2..bd8017e76 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -265,7 +265,7 @@ public class FOTreeBuilder extends DefaultHandler { } ElementMapping.Maker fobjMaker = findFOMaker(namespaceURI, localName); -// System.out.println("found a " + fobjMaker.toString()); +// log.debug("found a " + fobjMaker.toString()); try { foNode = fobjMaker.make(currentFObj); diff --git a/src/java/org/apache/fop/fo/XMLObj.java b/src/java/org/apache/fop/fo/XMLObj.java index 2ad38580f..cf64136fd 100644 --- a/src/java/org/apache/fop/fo/XMLObj.java +++ b/src/java/org/apache/fop/fo/XMLObj.java @@ -173,7 +173,7 @@ public abstract class XMLObj extends FONode { element = doc.getDocumentElement(); buildTopLevel(doc, element); } catch (Exception e) { - e.printStackTrace(); + log.error("Error while trying to instantiate a DOM Document", e); } return doc; } diff --git a/src/java/org/apache/fop/fo/properties/PropertyMaker.java b/src/java/org/apache/fop/fo/properties/PropertyMaker.java index be944163f..cd36323ab 100644 --- a/src/java/org/apache/fop/fo/properties/PropertyMaker.java +++ b/src/java/org/apache/fop/fo/properties/PropertyMaker.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,15 +38,22 @@ import org.apache.fop.fo.expr.PropertyParser; /** * Base class for all property makers - * @author unascribed */ public class PropertyMaker implements Cloneable { + + /** Logger instance */ + private static Log log = LogFactory.getLog(PropertyMaker.class); + + /** the property ID */ protected int propId; private boolean inherited = true; private Map enums = null; private Map keywords = null; + /** the default value for the maker */ protected String defaultValue = null; + /** Indicates whether the property is context-dependant and therefore can't be cached. */ protected boolean contextDep = false; + /** Indicates whether the property is set through a shorthand. */ protected boolean setByShorthand = false; private int percentBase = -1; private PropertyMaker[] shorthands = null; @@ -55,8 +62,6 @@ public class PropertyMaker implements Cloneable { protected Property defaultProperty; protected CorrespondingPropertyMaker corresponding; - private static Log log = LogFactory.getLog(PropertyMaker.class); - /** * @return the name of the property for this Maker */ @@ -95,7 +100,7 @@ public class PropertyMaker implements Cloneable { /** * Set the inherited flag. - * @param inherited + * @param inherited true if this is an inherited property */ public void setInherited(boolean inherited) { this.inherited = inherited; @@ -103,8 +108,8 @@ public class PropertyMaker implements Cloneable { /** * Add a keyword-equiv to the maker. - * @param keyword - * @param value + * @param keyword the keyword + * @param value the value to be used when the keyword is specified */ public void addKeyword(String keyword, String value) { if (keywords == null) { @@ -115,8 +120,8 @@ public class PropertyMaker implements Cloneable { /** * Add a enum constant. - * @param constant - * @param value + * @param constant the enum constant + * @param value the Property value to use when the constant is specified */ public void addEnum(String constant, Property value) { if (enums == null) { @@ -127,7 +132,7 @@ public class PropertyMaker implements Cloneable { /** * Add a subproperty to this maker. - * @param subproperty + * @param subproperty the PropertyMaker for the subproperty */ public void addSubpropMaker(PropertyMaker subproperty) { throw new RuntimeException("Unable to add subproperties " + getClass()); @@ -179,7 +184,7 @@ public class PropertyMaker implements Cloneable { /** * Set the default value for this maker. - * @param defaultValue + * @param defaultValue the default value * @param contextDep true when the value context dependent and * must not be cached. */ @@ -190,7 +195,7 @@ public class PropertyMaker implements Cloneable { /** * Set the percent base identifier for this maker. - * @param percentBase + * @param percentBase the percent base (ex. LengthBase.FONTSIZE) */ public void setPercentBase(int percentBase) { this.percentBase = percentBase; @@ -201,7 +206,7 @@ public class PropertyMaker implements Cloneable { * makers. It should be true for the subproperties which must be * assigned a value when the base property is assigned a attribute * value directly. - * @param setByShorthand + * @param setByShorthand true if this subproperty must be set when the base property is set */ public void setByShorthand(boolean setByShorthand) { this.setByShorthand = setByShorthand; @@ -225,18 +230,21 @@ public class PropertyMaker implements Cloneable { return null; } - /* + /** * If the property is a relative property with a corresponding absolute * value specified, the absolute value is used. This is also true of * the inheritance priority (I think...) * If the property is an "absolute" property and it isn't specified, then * we try to compute it from the corresponding relative property: this * happens in computeProperty. + * @param propertyList the applicable property list + * @param tryInherit true if inherited properties should be examined. + * @return the property value + * @throws PropertyException if there is a problem evaluating the property */ public Property findProperty(PropertyList propertyList, boolean tryInherit) - throws PropertyException - { + throws PropertyException { Property p = null; if (log.isTraceEnabled()) { @@ -275,12 +283,13 @@ public class PropertyMaker implements Cloneable { * Is 0 when retriving a base property. * @param propertyList The PropertyList object being built for this FO. * @param tryInherit true if inherited properties should be examined. - * @param tryDefault true if the default value should be returned. + * @param tryDefault true if the default value should be returned. + * @return the property value + * @throws PropertyException if there is a problem evaluating the property */ public Property get(int subpropertyId, PropertyList propertyList, boolean tryInherit, boolean tryDefault) - throws PropertyException - { + throws PropertyException { Property p = findProperty(propertyList, tryInherit); if (p == null && tryDefault) { // default value for this FO! @@ -307,11 +316,14 @@ public class PropertyMaker implements Cloneable { * @param pl the PropertyList containing the property. (TODO: explain * what this is used for, or remove it from the signature.) * @return an object implementing the PercentBase interface. + * @throws PropertyException if there is a problem while evaluating the base property */ public PercentBase getPercentBase(FObj fo, PropertyList pl) throws PropertyException { - if (percentBase == -1) + if (percentBase == -1) { return null; - return new LengthBase(fo, pl, percentBase); + } else { + return new LengthBase(fo, pl, percentBase); + } } /** @@ -414,7 +426,8 @@ public class PropertyMaker implements Cloneable { newProp = convertProperty(newProp, propertyList, fo); } if (newProp == null) { - throw new org.apache.fop.fo.expr.PropertyException("No conversion defined " + pvalue); + throw new org.apache.fop.fo.expr.PropertyException( + "No conversion defined " + pvalue); } return newProp; } catch (PropertyException propEx) { @@ -448,23 +461,21 @@ public class PropertyMaker implements Cloneable { public Property convertShorthandProperty(PropertyList propertyList, Property prop, FObj fo) - throws PropertyException - { + throws PropertyException { Property pret = convertProperty(prop, propertyList, fo); if (pret == null) { // If value is a name token, may be keyword or Enum String sval = prop.getNCname(); if (sval != null) { - // System.err.println("Convert shorthand ncname " + sval); + //log.debug("Convert shorthand ncname " + sval); pret = checkEnumValues(sval); if (pret == null) { /* Check for keyword shorthand values to be substituted. */ String pvalue = checkValueKeywords(sval); if (!pvalue.equals(sval)) { - // System.err.println("Convert shorthand keyword" + pvalue); + // log.debug("Convert shorthand keyword" + pvalue); // Substituted a value: must parse it - Property p = - PropertyParser.parse(pvalue, + Property p = PropertyParser.parse(pvalue, new PropertyInfo(this, propertyList, fo)); @@ -475,7 +486,7 @@ public class PropertyMaker implements Cloneable { } if (pret != null) { /* - * System.err.println("Return shorthand value " + pret.getString() + + * log.debug("Return shorthand value " + pret.getString() + * " for " + getPropName()); */ } @@ -584,10 +595,10 @@ public class PropertyMaker implements Cloneable { * return an appropriate border-right-width Property object. * @param propertyList the collection of properties to be considered * @return the Property, if found, the correspons, otherwise, null + * @throws PropertyException if there is a problem while evaluating the shorthand */ public Property getShorthand(PropertyList propertyList) - throws PropertyException - { + throws PropertyException { if (shorthands == null) { return null; } @@ -608,6 +619,7 @@ public class PropertyMaker implements Cloneable { return null; } + /** @return the name of the property this maker is used for. */ public String getName() { return FOPropertyMapping.getPropertyName(propId); } @@ -615,6 +627,7 @@ public class PropertyMaker implements Cloneable { /** * Return a clone of the makers. Used by useGeneric() to clone the * subproperty makers of the generic compound makers. + * @see java.lang.Object#clone() */ public Object clone() { try { diff --git a/src/java/org/apache/fop/fo/properties/StringProperty.java b/src/java/org/apache/fop/fo/properties/StringProperty.java index 04e673e17..b5e6a4fd9 100644 --- a/src/java/org/apache/fop/fo/properties/StringProperty.java +++ b/src/java/org/apache/fop/fo/properties/StringProperty.java @@ -61,7 +61,7 @@ public class StringProperty extends Property { if (value.charAt(vlen) == q1) { return new StringProperty(value.substring(1, vlen)); } - System.err.println("Warning String-valued property starts with quote" + log.warn("String-valued property starts with quote" + " but doesn't end with quote: " + value); // fall through and use the entire value, including first quote @@ -83,7 +83,7 @@ public class StringProperty extends Property { */ public StringProperty(String str) { this.str = str; - // System.err.println("Set StringProperty: " + str); + // log.debug("Set StringProperty: " + str); } /** diff --git a/src/java/org/apache/fop/fonts/FontReader.java b/src/java/org/apache/fop/fonts/FontReader.java index 517f64854..131f50a6a 100644 --- a/src/java/org/apache/fop/fonts/FontReader.java +++ b/src/java/org/apache/fop/fonts/FontReader.java @@ -147,7 +147,7 @@ public class FontReader extends DefaultHandler { * @see org.xml.sax.ContentHandler#startElement(String, String, String, Attributes) */ public void startElement(String uri, String localName, String qName, - Attributes attributes) { + Attributes attributes) throws SAXException { if (localName.equals("font-metrics")) { if ("TYPE0".equals(attributes.getValue("type"))) { multiFont = new MultiByteFont(); @@ -190,8 +190,8 @@ public class FontReader extends DefaultHandler { singleFont.setWidth(Integer.parseInt(attributes.getValue("idx")), Integer.parseInt(attributes.getValue("wdt"))); } catch (NumberFormatException ne) { - System.out.println("Malformed width in metric file: " - + ne.getMessage()); + throw new SAXException("Malformed width in metric file: " + + ne.getMessage(), ne); } } else if ("pair".equals(localName)) { currentKerning.put(new Integer(attributes.getValue("kpx2")), @@ -199,12 +199,12 @@ public class FontReader extends DefaultHandler { } } - private int getInt(String str) { + private int getInt(String str) throws SAXException { int ret = 0; try { ret = Integer.parseInt(str); } catch (Exception e) { - /**@todo log this exception */ + throw new SAXException("Error while parsing integer value: " + str, e); } return ret; } @@ -212,7 +212,7 @@ public class FontReader extends DefaultHandler { /** * @see org.xml.sax.ContentHandler#endElement(String, String, String) */ - public void endElement(String uri, String localName, String qName) { + public void endElement(String uri, String localName, String qName) throws SAXException { String content = text.toString().trim(); if ("font-name".equals(localName)) { returnFont.setFontName(content); diff --git a/src/java/org/apache/fop/fonts/FontSetup.java b/src/java/org/apache/fop/fonts/FontSetup.java index 29f9aaea9..dde3313c9 100644 --- a/src/java/org/apache/fop/fonts/FontSetup.java +++ b/src/java/org/apache/fop/fonts/FontSetup.java @@ -200,7 +200,9 @@ public class FontSetup { FontTriplet triplet = (FontTriplet) triplets.get(c); int weight = FontUtil.parseCSS2FontWeight(triplet.getWeight()); - //System.out.println("Registering: "+triplet+" weight="+weight); + if (log.isDebugEnabled()) { + log.debug("Registering: " + triplet + " weight=" + weight); + } fontInfo.addFontProperties(internalName, triplet.getName(), triplet.getStyle(), diff --git a/src/java/org/apache/fop/fonts/LazyFont.java b/src/java/org/apache/fop/fonts/LazyFont.java index 149b15c15..cffe19aa7 100644 --- a/src/java/org/apache/fop/fonts/LazyFont.java +++ b/src/java/org/apache/fop/fonts/LazyFont.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,17 +18,18 @@ package org.apache.fop.fonts; -//Java import java.util.Map; -//FOP - +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * This class is used to defer the loading of a font until it is really used. */ public class LazyFont extends Typeface implements FontDescriptor { + private static Log log = LogFactory.getLog(LazyFont.class); + private String metricsFileName = null; private String fontEmbedPath = null; private boolean useKerning = false; @@ -62,13 +63,10 @@ public class LazyFont extends Typeface implements FontDescriptor { if (realFont instanceof FontDescriptor) { realFontDescriptor = (FontDescriptor) realFont; } - // System.out.println("Metrics " + metricsFileName + " loaded."); + // log.debug("Metrics " + metricsFileName + " loaded."); } catch (Exception ex) { - ex.printStackTrace(); - /**@todo Log this exception */ - //log.error("Failed to read font metrics file " - // + metricsFileName - // + " : " + ex.getMessage()); + log.error("Failed to read font metrics file " + + metricsFileName, ex); } } } diff --git a/src/java/org/apache/fop/fonts/MultiByteFont.java b/src/java/org/apache/fop/fonts/MultiByteFont.java index 566636c37..037e9726e 100644 --- a/src/java/org/apache/fop/fonts/MultiByteFont.java +++ b/src/java/org/apache/fop/fonts/MultiByteFont.java @@ -223,7 +223,6 @@ public class MultiByteFont extends CIDFont { usedGlyphsIndex.put(new Integer(usedGlyphsCount), new Integer(retIdx)); retIdx = usedGlyphsCount; - // System.out.println(c+"("+(int)c+") = "+retIdx); usedGlyphsCount++; } else { retIdx = newIdx.intValue(); diff --git a/src/java/org/apache/fop/fonts/truetype/TTFDirTabEntry.java b/src/java/org/apache/fop/fonts/truetype/TTFDirTabEntry.java index 46d837589..8e25e65d6 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFDirTabEntry.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFDirTabEntry.java @@ -46,9 +46,7 @@ class TTFDirTabEntry { offset = in.readTTFULong(); length = in.readTTFULong(); String tagStr = new String(tag, "ISO-8859-1"); - // System.err.println("tag='" + tagStr + "'"); - //System.out.println(this.toString()); return tagStr; } diff --git a/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java index cec2c5425..d118fa4a6 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java @@ -81,8 +81,7 @@ public abstract class AbstractBaseLayoutManager case LengthBase.CONTAINING_REFAREA_WIDTH: return getReferenceAreaIPD(); default: - log.error("Unknown base type for LengthBase:" + lengthBase); - new Exception().printStackTrace(); + log.error(new Exception("Unknown base type for LengthBase:" + lengthBase)); return 0; } } else { diff --git a/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java b/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java index 743d30574..fbac14f38 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractBreaker.java @@ -174,12 +174,14 @@ public abstract class AbstractBreaker { ElementListObserver.observe(elementList, "breaker", null); } + /** + * Starts the page breaking process. + * @param flowBPD the constant available block-progression-dimension (used for every part) + */ public void doLayout(int flowBPD) { LayoutContext childLC = createLayoutContext(); childLC.setStackLimit(new MinOptMax(flowBPD)); - //System.err.println("Vertical alignment: " + - // currentSimplePageMaster.getRegion(FO_REGION_BODY).getDisplayAlign()); if (getCurrentDisplayAlign() == Constants.EN_X_FILL) { //EN_FILL is non-standard (by LF) alignment = Constants.EN_JUSTIFY; @@ -492,7 +494,6 @@ public abstract class AbstractBreaker { private int optimizeLineLength(KnuthSequence effectiveList, int startElementIndex, int endElementIndex) { ListIterator effectiveListIterator; // optimize line length - //System.out.println(" "); int boxCount = 0; int accumulatedLineLength = 0; int greatestMinimumLength = 0; @@ -520,10 +521,10 @@ public abstract class AbstractBreaker { int averageLineLength = 0; if (accumulatedLineLength > 0 && boxCount > 0) { averageLineLength = (int) (accumulatedLineLength / boxCount); - //System.out.println("PSLM> lunghezza media = " + averageLineLength); + log.debug("Average line length = " + averageLineLength); if (averageLineLength < greatestMinimumLength) { averageLineLength = greatestMinimumLength; - //System.out.println(" correzione, ora e' = " + averageLineLength); + log.debug(" Correction to: " + averageLineLength); } } return averageLineLength; diff --git a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java index 6107aadd7..5a53c7239 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java @@ -690,7 +690,6 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager Position lastPos = null; while (parentIter.hasNext()) { pos = (Position) parentIter.next(); - //System.out.println("pos = " + pos.getClass().getName()); if (pos.getIndex() >= 0) { if (firstPos == null) { firstPos = pos; @@ -728,13 +727,10 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager // pos was created by this BlockLM and was inside a penalty // allowing or forbidding a page break // nothing to do - /* LF *///System.out.println(" penalty"); } else { // innerPosition was created by another LM positionList.add(innerPosition); lastLM = innerPosition.getLM(); - /* LF *///System.out.println(" " + - // innerPosition.getClass().getName()); } } @@ -756,7 +752,6 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager // // the last item inside positionList is a LeafPosition // // (a LineBreakPosition, more precisely); this means that // // the whole paragraph is on the same page - // System.out.println("paragrafo intero"); // childPosIter = new KnuthPossPosIter(storedList, 0, // storedList.size()); //} else { @@ -781,11 +776,11 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager lastLM = element.getLayoutManager(); } } - //System.out.println("addAreas riferito a storedList da " + - // iFirst + " a " + iLast); - //System.out.println("splitLength= " + splitLength - // + " (" + neededUnits(splitLength) + " unita') " - // + (neededUnits(splitLength) * bpUnit - splitLength) + " spazi"); + //log.debug("Adding areas from " + iFirst + " to " + iLast); + //log.debug("splitLength= " + splitLength + // + " (" + neededUnits(splitLength) + " units') " + // + (neededUnits(splitLength) * bpUnit - splitLength) + // + " spacing"); // add space before and / or after the paragraph // to reach a multiple of bpUnit if (bSpaceBefore && bSpaceAfter) { @@ -810,8 +805,8 @@ public class BlockContainerLayoutManager extends BlockStackingLayoutManager + foBlockSpaceAfter.min) * bpUnit - splitLength; } - //System.out.println("spazio prima = " + adjustedSpaceBefore - // + " spazio dopo = " + adjustedSpaceAfter + " totale = " + + //log.debug("space before = " + adjustedSpaceBefore + // + " space after = " + adjustedSpaceAfter + " total = " + // (adjustedSpaceBefore + adjustedSpaceAfter + splitLength)); childPosIter = new KnuthPossPosIter(splitList, 0, splitList .size()); diff --git a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java index 838e23cfb..1a5e796f6 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java @@ -232,7 +232,6 @@ public class BlockLayoutManager extends BlockStackingLayoutManager */ public void addAreas(PositionIterator parentIter, LayoutContext layoutContext) { - //System.out.println(" BLM.addAreas>"); getParentArea(null); // if this will create the first block area in a page @@ -316,7 +315,6 @@ public class BlockLayoutManager extends BlockStackingLayoutManager // // the last item inside positionList is a LeafPosition // // (a LineBreakPosition, more precisely); this means that // // the whole paragraph is on the same page - // System.out.println("paragrafo intero"); // childPosIter = new KnuthPossPosIter(storedList, 0, // storedList.size()); //} else { @@ -341,11 +339,11 @@ public class BlockLayoutManager extends BlockStackingLayoutManager lastLM = element.getLayoutManager(); } } - //System.out.println("addAreas riferito a storedList da " + - // iFirst + " a " + iLast); - //System.out.println("splitLength= " + splitLength - // + " (" + neededUnits(splitLength) + " unita') " - // + (neededUnits(splitLength) * bpUnit - splitLength) + " spazi"); + //log.debug("Adding areas from " + iFirst + " to " + iLast); + //log.debug("splitLength= " + splitLength + // + " (" + neededUnits(splitLength) + " units') " + // + (neededUnits(splitLength) * bpUnit - splitLength) + // + " spacing"); // add space before and / or after the paragraph // to reach a multiple of bpUnit if (bSpaceBefore && bSpaceAfter) { @@ -370,7 +368,7 @@ public class BlockLayoutManager extends BlockStackingLayoutManager + foSpaceAfter.min) * bpUnit - splitLength; } - //System.out.println("spazio prima = " + adjustedSpaceBefore + //log.debug("spazio prima = " + adjustedSpaceBefore // + " spazio dopo = " + adjustedSpaceAfter + " totale = " + // (adjustedSpaceBefore + adjustedSpaceAfter + splitLength)); childPosIter = new KnuthPossPosIter(splitList, 0, splitList diff --git a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java index b3ad7225b..a8561b752 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockStackingLayoutManager.java @@ -178,11 +178,11 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager * @see LayoutManager#getNextKnuthElements(LayoutContext, int) */ public LinkedList getNextKnuthElements(LayoutContext context, int alignment) { - /* LF *///System.err.println("BLM.getNextKnuthElements> keep-together = " + //log.debug("BLM.getNextKnuthElements> keep-together = " // + layoutProps.keepTogether.getType()); - /* LF *///System.err.println(" keep-with-previous = " + + //log.debug(" keep-with-previous = " + // layoutProps.keepWithPrevious.getType()); - /* LF *///System.err.println(" keep-with-next = " + + //log.debug(" keep-with-next = " + // layoutProps.keepWithNext.getType()); BlockLevelLayoutManager curLM; // currently active LM BlockLevelLayoutManager prevLM = null; // previously active LM @@ -388,11 +388,11 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager * @see org.apache.fop.layoutmgr.BlockLevelLayoutManager#negotiateBPDAdjustment(int, org.apache.fop.layoutmgr.KnuthElement) */ public int negotiateBPDAdjustment(int adj, KnuthElement lastElement) { -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> " + adj); -/*LF*/ //System.out.println(" lastElement e' " + (lastElement.isPenalty() +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> " + adj); +/*LF*/ //log.debug(" lastElement e' " + (lastElement.isPenalty() // ? "penalty" : (lastElement.isGlue() ? "glue" : "box" ))); -/*LF*/ //System.out.println(" position e' " + lastElement.getPosition().getClass().getName()); -/*LF*/ //System.out.println(" " + (bpUnit > 0 ? "unit" : "")); +/*LF*/ //log.debug(" position e' " + lastElement.getPosition().getClass().getName()); +/*LF*/ //log.debug(" " + (bpUnit > 0 ? "unit" : "")); Position innerPosition = ((NonLeafPosition) lastElement.getPosition()).getPosition(); if (innerPosition == null && lastElement.isGlue()) { @@ -400,11 +400,11 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager if (((KnuthGlue) lastElement).getAdjustmentClass() == SPACE_BEFORE_ADJUSTMENT) { // this adjustment applies to space-before adjustedSpaceBefore += adj; -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> spazio prima: " + adj); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> spazio prima: " + adj); } else { // this adjustment applies to space-after adjustedSpaceAfter += adj; -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> spazio dopo: " + adj); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> spazio dopo: " + adj); } return adj; } else if (innerPosition instanceof MappingPosition) { @@ -414,7 +414,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager MappingPosition mappingPos = (MappingPosition)innerPosition; if (lastElement.isGlue()) { // lastElement is a glue -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> bpunit con glue"); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> bpunit con glue"); ListIterator storedListIterator = storedList.listIterator( mappingPos.getFirstIndex()); int newAdjustment = 0; @@ -424,7 +424,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager newAdjustment += ((BlockLevelLayoutManager)storedElement .getLayoutManager()).negotiateBPDAdjustment( adj - newAdjustment, storedElement); -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> (progressivo) righe: " +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> (progressivo) righe: " // + newAdjustment); } } @@ -435,19 +435,19 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager // lastElement is a penalty: this means that the paragraph // has been split between consecutive pages: // this may involve a change in the number of lines -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> bpunit con penalty"); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> bpunit con penalty"); KnuthPenalty storedPenalty = (KnuthPenalty) storedList.get(mappingPos.getLastIndex()); if (storedPenalty.getW() > 0) { // the original penalty has width > 0 -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> chiamata passata"); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> chiamata passata"); return ((BlockLevelLayoutManager)storedPenalty.getLayoutManager()) .negotiateBPDAdjustment(storedPenalty.getW(), (KnuthElement)storedPenalty); } else { // the original penalty has width = 0 // the adjustment involves only the spaces before and after -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> chiamata gestita"); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> chiamata gestita"); return adj; } } @@ -458,7 +458,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager int returnValue = ((BlockLevelLayoutManager)lastElement.getLayoutManager()) .negotiateBPDAdjustment(adj, lastElement); lastElement.setPosition(savedPos); -/*LF*/ //System.out.println(" BLM.negotiateBPDAdjustment> righe: " + returnValue); +/*LF*/ //log.debug(" BLM.negotiateBPDAdjustment> righe: " + returnValue); return returnValue; } else { // this should never happen @@ -471,7 +471,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager * @see BlockLevelLayoutManager#discardSpace(KnuthGlue) */ public void discardSpace(KnuthGlue spaceGlue) { - //System.out.println(" BLM.discardSpace> " + spaceGlue.getPosition().getClass().getName()); + //log.debug(" BLM.discardSpace> " + spaceGlue.getPosition().getClass().getName()); Position innerPosition = ((NonLeafPosition) spaceGlue.getPosition()).getPosition(); if (innerPosition == null || innerPosition.getLM() == this) { @@ -501,8 +501,8 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager * @see LayoutManager#getChangedKnuthElements(List, int) */ public LinkedList getChangedKnuthElements(List oldList, int alignment) { -/*LF*/ //System.out.println(""); -/*LF*/ //System.out.println(" BLM.getChangedKnuthElements> inizio: oldList.size() = " +/*LF*/ //log.debug(""); +/*LF*/ //log.debug(" BLM.getChangedKnuthElements> inizio: oldList.size() = " // + oldList.size()); ListIterator oldListIterator = oldList.listIterator(); KnuthElement returnedElement; @@ -517,10 +517,10 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager while (oldListIterator.hasNext()) { oldElement = (KnuthElement)oldListIterator.next(); Position innerPosition = ((NonLeafPosition) oldElement.getPosition()).getPosition(); - //System.out.println(" BLM> unwrapping: " + //log.debug(" BLM> unwrapping: " // + (oldElement.isBox() ? "box " : (oldElement.isGlue() ? "glue " : "penalty")) // + " creato da " + oldElement.getLayoutManager().getClass().getName()); - //System.out.println(" BLM> unwrapping: " + //log.debug(" BLM> unwrapping: " // + oldElement.getPosition().getClass().getName()); if (innerPosition != null) { // oldElement was created by a descendant of this BlockLM @@ -557,19 +557,18 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } int iLast = ((MappingPosition) el.getPosition()).getLastIndex(); - //System.out.println(" si usa storedList da " + iFirst + " a " + iLast + //log-debug(" si usa storedList da " + iFirst + " a " + iLast // + " compresi su " + storedList.size() + " elementi totali"); workList = storedList.subList(iFirst, iLast + 1); } ListIterator workListIterator = workList.listIterator(); - //System.out.println(""); - //System.out.println(" BLM.getChangedKnuthElements> workList.size() = " + //log.debug(" BLM.getChangedKnuthElements> workList.size() = " // + workList.size() + " da 0 a " + (workList.size() - 1)); while (workListIterator.hasNext()) { currElement = (KnuthElement) workListIterator.next(); - //System.out.println("elemento n. " + workListIterator.previousIndex() + //log.debug("elemento n. " + workListIterator.previousIndex() // + " nella workList"); if (prevElement != null && prevElement.getLayoutManager() != currElement.getLayoutManager()) { @@ -580,7 +579,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager currElement.getLayoutManager(); boolean bSomethingAdded = false; if (prevLM != this) { - //System.out.println(" BLM.getChangedKnuthElements> chiamata da " + //log.debug(" BLM.getChangedKnuthElements> chiamata da " // + fromIndex + " a " + workListIterator.previousIndex() + " su " // + prevLM.getClass().getName()); returnedList.addAll(prevLM.getChangedKnuthElements(workList.subList( @@ -589,7 +588,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } else { // prevLM == this // do nothing - //System.out.println(" BLM.getChangedKnuthElements> elementi propri, " + //log.debug(" BLM.getChangedKnuthElements> elementi propri, " // + "ignorati, da " + fromIndex + " a " + workListIterator.previousIndex() // + " su " + prevLM.getClass().getName()); } @@ -614,7 +613,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager BlockLevelLayoutManager currLM = (BlockLevelLayoutManager) currElement.getLayoutManager(); if (currLM != this) { - //System.out.println(" BLM.getChangedKnuthElements> chiamata da " + fromIndex + //log.debug(" BLM.getChangedKnuthElements> chiamata da " + fromIndex // + " a " + oldList.size() + " su " + currLM.getClass().getName()); returnedList.addAll(currLM.getChangedKnuthElements( workList.subList(fromIndex, workList.size()), alignment)); @@ -625,7 +624,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager if (returnedList.size() > 0) { returnedList.removeLast(); } - //System.out.println(" BLM.getChangedKnuthElements> elementi propri, ignorati, da " + //log.debug(" BLM.getChangedKnuthElements> elementi propri, ignorati, da " // + fromIndex + " a " + workList.size()); } } @@ -654,7 +653,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } } - //System.out.println(" BLM.getChangedKnuthElements> intermedio: returnedList.size() = " + //log.debug(" BLM.getChangedKnuthElements> intermedio: returnedList.size() = " // + returnedList.size()); /* estensione: conversione complessiva */ @@ -702,7 +701,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } } - //System.out.println(" BLM.getChangedKnuthElements> finished: returnList.size() = " + //log.debug(" BLM.getChangedKnuthElements> finished: returnList.size() = " // + returnList.size()); return returnList; } @@ -875,13 +874,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager CommonBorderPaddingBackground.BEFORE), RelSide.BEFORE, isFirst, false, this)); } - //TODO Handle conditionality - /* - int bpBefore = borderAndPadding.getBorderBeforeWidth(false) - + borderAndPadding.getPaddingBefore(false, this); - if (bpBefore > 0) { - returnList.add(new KnuthBox(bpBefore, getAuxiliaryPosition(), true)); - }*/ } } @@ -907,13 +899,6 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager .getWidth(), RelSide.AFTER, false, isLast, this)); } - //TODO Handle conditionality - /* - int bpAfter = borderAndPadding.getBorderAfterWidth(false) - + borderAndPadding.getPaddingAfter(false, this); - if (bpAfter > 0) { - returnList.add(new KnuthBox(bpAfter, getAuxiliaryPosition(), true)); - }*/ } } @@ -1077,8 +1062,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager } protected LinkedList createUnitElements(LinkedList oldList) { - //System.out.println(" "); - //System.out.println("Start conversion: " + oldList.size() + //log.debug("Start conversion: " + oldList.size() // + " elements, space-before.min=" + layoutProps.spaceBefore.getSpace().min // + " space-after.min=" + layoutProps.spaceAfter.getSpace().min); // add elements at the beginning and at the end of oldList @@ -1101,23 +1085,22 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager MinOptMax totalUnits = new MinOptMax(0); LinkedList newList = new LinkedList(); - //System.out.println(" "); - //System.out.println(" Prima scansione"); + //log.debug(" Prima scansione"); // scan the list once to compute total min, opt and max length ListIterator oldListIterator = oldList.listIterator(); while (oldListIterator.hasNext()) { KnuthElement element = (KnuthElement) oldListIterator.next(); if (element.isBox()) { totalLength.add(new MinOptMax(element.getW())); - //System.out.println("box " + element.getW()); + //log.debug("box " + element.getW()); } else if (element.isGlue()) { totalLength.min -= ((KnuthGlue) element).getZ(); totalLength.max += ((KnuthGlue) element).getY(); //leafValue = ((LeafPosition) element.getPosition()).getLeafPos(); - //System.out.println("glue " + element.getW() + " + " + //log.debug("glue " + element.getW() + " + " // + ((KnuthGlue) element).getY() + " - " + ((KnuthGlue) element).getZ()); } else { - //System.out.println((((KnuthPenalty)element).getP() == KnuthElement.INFINITE + //log.debug((((KnuthPenalty)element).getP() == KnuthElement.INFINITE // ? "PENALTY " : "penalty ") + element.getW()); } } @@ -1125,11 +1108,10 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager totalUnits = new MinOptMax(neededUnits(totalLength.min), neededUnits(totalLength.opt), neededUnits(totalLength.max)); - //System.out.println(" totalLength= " + totalLength); - //System.out.println(" unita'= " + totalUnits); + //log.debug(" totalLength= " + totalLength); + //log.debug(" unita'= " + totalUnits); - //System.out.println(" "); - //System.out.println(" Seconda scansione"); + //log.debug(" Seconda scansione"); // scan the list once more, stopping at every breaking point // in order to compute partial min, opt and max length // and create the new elements @@ -1212,7 +1194,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager int uNewShrink = (unitsBeforeBreak.opt - unitsBeforeBreak.min) - (unsuppressibleUnits.opt - unsuppressibleUnits.min); - //System.out.println("(" + //log.debug("(" // + unsuppressibleUnits.min + "-" + unsuppressibleUnits.opt + "-" // + unsuppressibleUnits.max + ") " // + " -> " + unitsBeforeBreak.min + "-" + unitsBeforeBreak.opt + "-" @@ -1245,7 +1227,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager mappingPos, false)); unsuppressibleUnits.add(new MinOptMax(uNewNormal - uLengthChange)); - //System.out.println(" box " + (uNewNormal - uLengthChange)); + //log.debug(" box " + (uNewNormal - uLengthChange)); // new infinite penalty, glue and box, if necessary if (uNewStretch - uStretchChange > 0 @@ -1263,15 +1245,15 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager LINE_NUMBER_ADJUSTMENT, mappingPos, false)); - //System.out.println(" PENALTY"); - //System.out.println(" glue 0 " + iStretchUnits + " " + iShrinkUnits); + //log.debug(" PENALTY"); + //log.debug(" glue 0 " + iStretchUnits + " " + iShrinkUnits); unsuppressibleUnits.max += iStretchUnits; unsuppressibleUnits.min -= iShrinkUnits; if (!oldListIterator.hasNext()) { newList.add(new KnuthBox(0, mappingPos, false)); - //System.out.println(" box 0"); + //log.debug(" box 0"); } } @@ -1296,10 +1278,10 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager LINE_NUMBER_ADJUSTMENT, mappingPos, false)); - //System.out.println(" PENALTY"); - //System.out.println(" glue 0 " + uStretchChange + " " + uShrinkChange); - //System.out.println(" penalty " + uLengthChange + " * unit"); - //System.out.println(" glue 0 " + (- uStretchChange) + " " + //log.debug(" PENALTY"); + //log.debug(" glue 0 " + uStretchChange + " " + uShrinkChange); + //log.debug(" penalty " + uLengthChange + " * unit"); + //log.debug(" glue 0 " + (- uStretchChange) + " " // + (- uShrinkChange)); } else if (oldListIterator.hasNext()) { // new penalty @@ -1307,7 +1289,7 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager 0, false, mappingPos, false)); - //System.out.println(" penalty " + uLengthChange + " * unit"); + //log.debug(" penalty " + uLengthChange + " * unit"); } // update firstIndex firstIndex = lastIndex + 1; @@ -1347,9 +1329,9 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager wrongBox.getPosition(), false)); newList.addFirst(new KnuthGlue(decreasedLength, 0, 0, SPACE_BEFORE_ADJUSTMENT, wrongBox.getPosition(), false)); - //System.out.println(" rimosso box " + neededUnits(wrongBox.getW())); - //System.out.println(" aggiunto glue " + neededUnits(decreasedLength) + " 0 0"); - //System.out.println(" aggiunto box " + neededUnits( + //log.debug(" rimosso box " + neededUnits(wrongBox.getW())); + //log.debug(" aggiunto glue " + neededUnits(decreasedLength) + " 0 0"); + //log.debug(" aggiunto box " + neededUnits( // wrongBox.getW() - decreasedLength)); } @@ -1388,10 +1370,10 @@ public abstract class BlockStackingLayoutManager extends AbstractLayoutManager // insert the correct glue newList.addLast(new KnuthGlue(decreasedLength, 0, 0, SPACE_AFTER_ADJUSTMENT, wrongBox.getPosition(), false)); - //System.out.println(" rimosso box " + neededUnits(wrongBox.getW())); - //System.out.println(" aggiunto box " + neededUnits( + //log.debug(" rimosso box " + neededUnits(wrongBox.getW())); + //log.debug(" aggiunto box " + neededUnits( // wrongBox.getW() - decreasedLength)); - //System.out.println(" aggiunto glue " + neededUnits(decreasedLength) + " 0 0"); + //log.debug(" aggiunto glue " + neededUnits(decreasedLength) + " 0 0"); } return newList; diff --git a/src/java/org/apache/fop/layoutmgr/PositionIterator.java b/src/java/org/apache/fop/layoutmgr/PositionIterator.java index cc0c73c89..24a641ebd 100644 --- a/src/java/org/apache/fop/layoutmgr/PositionIterator.java +++ b/src/java/org/apache/fop/layoutmgr/PositionIterator.java @@ -84,7 +84,6 @@ public abstract class PositionIterator implements Iterator { if (bHasNext) { Object retObj = getPos(nextObj); lookAhead(); - //System.out.println(retObj); return retObj; } else { throw new NoSuchElementException("PosIter"); diff --git a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java index 6a8608955..9028f17cf 100644 --- a/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/StaticContentLayoutManager.java @@ -108,7 +108,7 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager { // get elements from curLM returnedList = curLM.getNextKnuthElements(childLC, alignment); - //System.out.println("FLM.getNextKnuthElements> returnedList.size() = " + //log.debug("FLM.getNextKnuthElements> returnedList.size() = " // + returnedList.size()); // "wrap" the Position inside each element @@ -148,7 +148,7 @@ public class StaticContentLayoutManager extends BlockStackingLayoutManager { && ((KnuthPenalty)returnedList.getLast()).getP() == -KnuthElement.INFINITE) { // a descendant of this flow has break-after -/*LF*/ //System.out.println("FLM - break after!!"); +/*LF*/ //log.debug("FLM - break after!!"); return returnList; } /*LF*/ } diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java index cc76a4572..d70a783fb 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java @@ -432,10 +432,9 @@ public class LineLayoutManager extends InlineStackingLayoutManager if (addedPositions == lineLayouts.getLineCount(activePossibility)) { activePossibility++; addedPositions = 0; - //System.out.println(" "); } - //System.out.println("LLM> (" + (lineLayouts.getLineNumber(activePossibility) - addedPositions) + ") difference = " + difference + " ratio = " + ratio); + //log.debug("LLM> (" + (lineLayouts.getLineNumber(activePossibility) - addedPositions) + ") difference = " + difference + " ratio = " + ratio); lineLayouts.addBreakPosition(makeLineBreakPosition(par, (bestActiveNode.line > 1 ? bestActiveNode.previous.position + 1: 0), bestActiveNode.position, @@ -543,26 +542,26 @@ public class LineLayoutManager extends InlineStackingLayoutManager if (pageAlignment == EN_JUSTIFY) { // leave all active nodes and find the optimum line number - //System.out.println("LBA.filterActiveNodes> " + activeNodeCount + " layouts"); + //log.debug("LBA.filterActiveNodes> " + activeNodeCount + " layouts"); for (int i = startLine; i < endLine; i++) { for (KnuthNode node = getNode(i); node != null; node = node.next) { - //System.out.println(" + lines = " + node.line + " demerits = " + node.totalDemerits); + //log.debug(" + lines = " + node.line + " demerits = " + node.totalDemerits); bestActiveNode = compareNodes(bestActiveNode, node); } } // scan the node set once again and remove some nodes - //System.out.println("LBA.filterActiveList> layout selection"); + //log.debug("LBA.filterActiveList> layout selection"); for (int i = startLine; i < endLine; i++) { for (KnuthNode node = getNode(i); node != null; node = node.next) { //if (Math.abs(node.line - bestActiveNode.line) > maxDiff) { //if (false) { if (node.line != bestActiveNode.line && node.totalDemerits > MAX_DEMERITS) { - //System.out.println(" XXX lines = " + node.line + " demerits = " + node.totalDemerits); + //log.debug(" XXX lines = " + node.line + " demerits = " + node.totalDemerits); removeNode(i, node); } else { - //System.out.println(" ok lines = " + node.line + " demerits = " + node.totalDemerits); + //log.debug(" ok lines = " + node.line + " demerits = " + node.totalDemerits); } } } @@ -1105,8 +1104,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager shorter or longer lines */ //TODO This code snippet is disabled. Reenable? if (false && alignment == EN_JUSTIFY && textAlignment == EN_JUSTIFY) { - //System.out.println("LLM.getNextKnuthElements> layouts with more lines? " + lineLayouts.canUseMoreLines()); - //System.out.println(" layouts with fewer lines? " + lineLayouts.canUseLessLines()); + //log.debug("LLM.getNextKnuthElements> layouts with more lines? " + lineLayouts.canUseMoreLines()); + //log.debug(" layouts with fewer lines? " + lineLayouts.canUseLessLines()); if (!lineLayouts.canUseMoreLines()) { alg.resetAlgorithm(); lineLayouts.savePossibilities(true); @@ -1132,8 +1131,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager lineLayouts.restorePossibilities(); iLineWidth = savedLineWidth; } - //System.out.println("LLM.getNextKnuthElements> now, layouts with more lines? " + lineLayouts.canUseMoreLines()); - //System.out.println(" now, layouts with fewer lines? " + lineLayouts.canUseLessLines()); + //log.debug("LLM.getNextKnuthElements> now, layouts with more lines? " + lineLayouts.canUseMoreLines()); + //log.debug(" now, layouts with fewer lines? " + lineLayouts.canUseLessLines()); } } return lineLayouts; @@ -1299,7 +1298,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager breaker.add(new KnuthPenalty(0, 0, false, elementPosition, false)); } - //System.out.println("first=" + nFirstLines + " inner=" + nInnerLines + //log.debug("first=" + nFirstLines + " inner=" + nInnerLines // + " optional=" + nOptionalLines + " eliminable=" + nEliminableLines // + " last=" + nLastLines // + " (condOpt=" + nConditionalOptionalLines + " condEl=" + nConditionalEliminableLines + ")"); @@ -1386,7 +1385,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager //} //int lineNumberDifference = (int)((double) totalAdj / constantLineHeight); int lineNumberDifference = (int) Math.round((double) totalAdj / constantLineHeight + (adj > 0 ? - 0.4 : 0.4)); - //System.out.println(" LLM> variazione calcolata = " + ((double) totalAdj / constantLineHeight) + " variazione applicata = " + lineNumberDifference); + //log.debug(" LLM> variazione calcolata = " + ((double) totalAdj / constantLineHeight) + " variazione applicata = " + lineNumberDifference); lineLayouts = (LineLayoutPossibilities)lineLayoutsList.get(pos.getLeafPos()); lineNumberDifference = lineLayouts.applyLineCountAdjustment(lineNumberDifference); return lineNumberDifference * constantLineHeight; @@ -1405,7 +1404,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager LinkedList returnList = new LinkedList(); for (int p = 0; p < knuthParagraphs.size(); p++) { lineLayouts = (LineLayoutPossibilities)lineLayoutsList.get(p); - //System.out.println("demerits of the chosen layout: " + lineLayouts.getChosenDemerits()); + //log.debug("demerits of the chosen layout: " + lineLayouts.getChosenDemerits()); for (int i = 0; i < lineLayouts.getChosenLineCount(); i++) { if (!((BlockLevelLayoutManager) parentLM).mustKeepTogether() && i >= fobj.getOrphans() @@ -1414,10 +1413,10 @@ public class LineLayoutManager extends InlineStackingLayoutManager returnList.add(new KnuthPenalty(0, 0, false, new Position(this), false)); } LineBreakPosition lbp = (LineBreakPosition) lineLayouts.getChosenPosition(i); - //System.out.println("LLM.getChangedKnuthElements> lineWidth= " + lbp.lineWidth + " difference= " + lbp.difference); - //System.out.println(" shrink= " + lbp.availableShrink + " stretch= " + lbp.availableStretch); + //log.debug("LLM.getChangedKnuthElements> lineWidth= " + lbp.lineWidth + " difference= " + lbp.difference); + //log.debug(" shrink= " + lbp.availableShrink + " stretch= " + lbp.availableStretch); - //System.out.println("linewidth= " + lbp.lineWidth + " difference= " + lbp.difference + " indent= " + lbp.startIndent); + //log.debug("linewidth= " + lbp.lineWidth + " difference= " + lbp.difference + " indent= " + lbp.startIndent); MinOptMax contentIPD; if (alignment == EN_JUSTIFY) { contentIPD = new MinOptMax( @@ -1750,8 +1749,8 @@ public class LineLayoutManager extends InlineStackingLayoutManager updatedRatio = (float) updatedDifference / lbp.availableShrink; } lc.setIPDAdjust(updatedRatio); - //System.out.println("LLM.addAreas> old difference = " + lbp.difference + " new difference = " + updatedDifference); - //System.out.println(" old ratio = " + lbp.ipdAdjust + " new ratio = " + updatedRatio); + //log.debug("LLM.addAreas> old difference = " + lbp.difference + " new difference = " + updatedDifference); + //log.debug(" old ratio = " + lbp.ipdAdjust + " new ratio = " + updatedRatio); } else if (false && textAlignment == EN_CENTER) { // re-compute indent int updatedIndent = lbp.startIndent diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutPossibilities.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutPossibilities.java index d7f41efb9..524fe9d9d 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutPossibilities.java +++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutPossibilities.java @@ -157,7 +157,8 @@ public class LineLayoutPossibilities { chosenIndex = optimumIndex; } } -/*LF*/ //System.out.println(">> minLineCount = " + getMinLineCount() + " optLineCount = " + getOptLineCount() + " maxLineCount() = " + getMaxLineCount()); + //log.debug(">> minLineCount = " + getMinLineCount() + // + " optLineCount = " + getOptLineCount() + " maxLineCount() = " + getMaxLineCount()); } public void addBreakPosition(Position pos, int i) { diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index c8cedb0bb..5a98deac6 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -385,10 +385,10 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager while (oldListIterator.hasNext()) { oldElement = (KnuthElement)oldListIterator.next(); Position innerPosition = ((NonLeafPosition) oldElement.getPosition()).getPosition(); - //System.out.println(" BLM> unwrapping: " + (oldElement.isBox() + //log.debug(" BLM> unwrapping: " + (oldElement.isBox() // ? "box " : (oldElement.isGlue() ? "glue " : "penalty")) // + " creato da " + oldElement.getLayoutManager().getClass().getName()); - //System.out.println(" BLM> unwrapping: " + //log.debug(" BLM> unwrapping: " // + oldElement.getPosition().getClass().getName()); if (innerPosition != null) { // oldElement was created by a descendant of this BlockLM diff --git a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java index 1cc7df68a..2708b440a 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java @@ -692,24 +692,20 @@ public class TableContentLayoutManager implements PercentBaseContext { TableBody body = null; while (iterator.hasNext()) { Position pos = (Position)iterator.next(); - //System.out.println(pos); if (pos instanceof TableContentPosition) { TableContentPosition tcpos = (TableContentPosition)pos; lst.add(tcpos); - //System.out.println(tcpos.row); GridUnitPart part = (GridUnitPart)tcpos.gridUnitParts.get(0); if (body == null) { body = part.pgu.getBody(); } if (tcpos.getFlag(TableContentPosition.FIRST_IN_ROWGROUP) && tcpos.row.getFlag(EffRow.FIRST_IN_BODY)) { - //System.out.println("pgu is first in body"); firstPos = true; } if (tcpos.getFlag(TableContentPosition.LAST_IN_ROWGROUP) && tcpos.row.getFlag(EffRow.LAST_IN_BODY)) { - //System.out.println("pgu is last in body"); lastPos = true; getTableLM().getCurrentPV().addMarkers(body.getMarkers(), true, firstPos, lastPos); diff --git a/src/java/org/apache/fop/pdf/PDFDocument.java b/src/java/org/apache/fop/pdf/PDFDocument.java index 4dd9f53fc..4d16dfa74 100644 --- a/src/java/org/apache/fop/pdf/PDFDocument.java +++ b/src/java/org/apache/fop/pdf/PDFDocument.java @@ -394,8 +394,6 @@ public class PDFDocument { //Add object to list this.objects.add(obj); - //System.out.println("Registering: "+obj); - //Add object to special lists where necessary if (obj instanceof PDFFunction) { this.functions.add(obj); diff --git a/src/java/org/apache/fop/pdf/PDFEncryptionManager.java b/src/java/org/apache/fop/pdf/PDFEncryptionManager.java index 737c65362..25169662b 100644 --- a/src/java/org/apache/fop/pdf/PDFEncryptionManager.java +++ b/src/java/org/apache/fop/pdf/PDFEncryptionManager.java @@ -118,19 +118,19 @@ public class PDFEncryptionManager { return (PDFEncryption)obj; } catch (ClassNotFoundException e) { if (checkAvailableAlgorithms()) { - System.out.println("JCE and algorithms available, but the " + log.warn("JCE and algorithms available, but the " + "implementation class unavailable. Please do a full " + "rebuild."); } return null; } catch (NoSuchMethodException e) { - e.printStackTrace(); + log.error(e); return null; } catch (IllegalAccessException e) { - e.printStackTrace(); + log.error(e); return null; } catch (InvocationTargetException e) { - e.printStackTrace(); + log.error(e); return null; } } diff --git a/src/java/org/apache/fop/pdf/PDFState.java b/src/java/org/apache/fop/pdf/PDFState.java index 15f4527c2..ddd1eb498 100644 --- a/src/java/org/apache/fop/pdf/PDFState.java +++ b/src/java/org/apache/fop/pdf/PDFState.java @@ -163,7 +163,6 @@ public class PDFState { */ public boolean setColor(Color col) { if (!col.equals(getData().color)) { - //System.out.println("old: " + getData().color + ", new: " + col); getData().color = col; return true; } else { diff --git a/src/java/org/apache/fop/pdf/PDFStream.java b/src/java/org/apache/fop/pdf/PDFStream.java index 593ccafc6..07e134283 100644 --- a/src/java/org/apache/fop/pdf/PDFStream.java +++ b/src/java/org/apache/fop/pdf/PDFStream.java @@ -44,7 +44,7 @@ public class PDFStream extends AbstractPDFStream { try { data = StreamCacheFactory.getInstance().createStreamCache(); } catch (IOException ex) { - /**@todo Log with Logger */ + //TODO throw the exception and catch it elsewhere ex.printStackTrace(); } } @@ -58,7 +58,7 @@ public class PDFStream extends AbstractPDFStream { try { data.getOutputStream().write(s.getBytes()); } catch (IOException ex) { - /**@todo Log with Logger */ + //TODO throw the exception and catch it elsewhere ex.printStackTrace(); } @@ -82,6 +82,7 @@ public class PDFStream extends AbstractPDFStream { try { return data.getSize(); } catch (Exception e) { + //TODO throw the exception and catch it elsewhere e.printStackTrace(); return 0; } diff --git a/src/java/org/apache/fop/pdf/TempFileStreamCache.java b/src/java/org/apache/fop/pdf/TempFileStreamCache.java index 86a790f43..116f4e08c 100644 --- a/src/java/org/apache/fop/pdf/TempFileStreamCache.java +++ b/src/java/org/apache/fop/pdf/TempFileStreamCache.java @@ -25,7 +25,7 @@ import java.io.IOException; import java.io.File; //Commons -import org.apache.commons.io.CopyUtils; +import org.apache.commons.io.IOUtils; /** * StreamCache implementation that uses temporary files rather than heap. @@ -90,11 +90,13 @@ public class TempFileStreamCache implements StreamCache { output.close(); output = null; - // don't need a buffer because streamCopy is buffered + // don't need a buffer because copy() is buffered InputStream input = new java.io.FileInputStream(tempFile); - final long bytesCopied = CopyUtils.copy(input, out); - input.close(); - return (int)bytesCopied; + try { + return IOUtils.copy(input, out); + } finally { + IOUtils.closeQuietly(input); + } } /** diff --git a/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java b/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java index 264c7b6f6..6e8982c2f 100644 --- a/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java +++ b/src/java/org/apache/fop/render/bitmap/TIFFRenderer.java @@ -202,8 +202,8 @@ public class TIFFRenderer extends Java2DRenderer { try { pageImage = getPageImage(current++); } catch (FOPException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + log.error(e); + return null; } switch (renderParams.getCompression()) { diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java index 4e288f4e4..988583fe6 100644 --- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java +++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java @@ -1084,7 +1084,7 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab renderPageAreas(viewport.getPage()); return PAGE_EXISTS; } catch (FOPException e) { - e.printStackTrace(); + log.error(e); return NO_SUCH_PAGE; } finally { oldState = state; diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java index 7006cb8b9..1d70952f7 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java @@ -1027,7 +1027,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { int rx = currentIPPosition + ch.getBorderAndPaddingWidthStart(); int bl = currentBPPosition + ch.getOffset() + ch.getBaselineOffset(); -/* System.out.println("Text = " + ch.getTextArea() + +/* log.debug("Text = " + ch.getTextArea() + "; text width: " + ch.getWidth() + "; BlockIP Position: " + currentBlockIPPosition + "; currentBPPosition: " + currentBPPosition + @@ -1096,7 +1096,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { int rx = currentIPPosition + text.getBorderAndPaddingWidthStart(); int bl = currentBPPosition + text.getOffset() + text.getBaselineOffset(); -/* System.out.println("Text = " + text.getTextArea() + +/* log.debug("Text = " + text.getTextArea() + "; text width: " + text.getWidth() + "; BlockIP Position: " + currentBlockIPPosition + "; currentBPPosition: " + currentBPPosition + diff --git a/src/java/org/apache/fop/render/print/PrintRenderer.java b/src/java/org/apache/fop/render/print/PrintRenderer.java index a9ed51cfd..5faee2dd3 100644 --- a/src/java/org/apache/fop/render/print/PrintRenderer.java +++ b/src/java/org/apache/fop/render/print/PrintRenderer.java @@ -141,7 +141,7 @@ public class PrintRenderer extends Java2DRenderer implements Pageable { try { printerJob.print(); } catch (PrinterException e) { - e.printStackTrace(); + log.error(e); throw new IOException("Unable to print: " + e.getClass().getName() + ": " + e.getMessage()); } diff --git a/src/java/org/apache/fop/render/ps/PSFontUtils.java b/src/java/org/apache/fop/render/ps/PSFontUtils.java index 867f1657e..e04f3e2fc 100644 --- a/src/java/org/apache/fop/render/ps/PSFontUtils.java +++ b/src/java/org/apache/fop/render/ps/PSFontUtils.java @@ -29,8 +29,8 @@ import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; -import org.apache.commons.io.CopyUtils; import org.apache.commons.io.EndianUtils; +import org.apache.commons.io.IOUtils; import org.apache.fop.fonts.CustomFont; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontType; @@ -116,7 +116,7 @@ public class PSFontUtils { gen.writeln("end"); gen.writeln("/" + fm.getFontName() + " exch definefont pop"); } else { - System.out.println("Only WinAnsiEncoding is supported. Font '" + gen.commentln("%WARNING: Only WinAnsiEncoding is supported. Font '" + fm.getFontName() + "' asks for: " + fm.getEncoding()); } } @@ -163,7 +163,7 @@ public class PSFontUtils { SubInputStream sin = new SubInputStream(in, dataSegLen); ASCIIHexOutputStream hexOut = new ASCIIHexOutputStream(gen.getOutputStream()); - CopyUtils.copy(sin, hexOut); + IOUtils.copy(sin, hexOut); gen.newLine(); break; case 3: //EOF diff --git a/src/java/org/apache/fop/render/ps/PSGraphics2D.java b/src/java/org/apache/fop/render/ps/PSGraphics2D.java index 464840031..02354dbc7 100644 --- a/src/java/org/apache/fop/render/ps/PSGraphics2D.java +++ b/src/java/org/apache/fop/render/ps/PSGraphics2D.java @@ -190,6 +190,7 @@ public class PSGraphics2D extends AbstractGraphics2D { * @param ioe IOException to handle */ protected void handleIOException(IOException ioe) { + //TODO Surely, there's a better way to do this. ioe.printStackTrace(); } diff --git a/src/java/org/apache/fop/render/ps/PSTextPainter.java b/src/java/org/apache/fop/render/ps/PSTextPainter.java index 10ac6a781..7153ea4f5 100644 --- a/src/java/org/apache/fop/render/ps/PSTextPainter.java +++ b/src/java/org/apache/fop/render/ps/PSTextPainter.java @@ -61,7 +61,6 @@ import org.apache.fop.fonts.FontInfo; * (todo) use drawString(AttributedCharacterIterator iterator...) for some * * @author Keiron Liddle - * @author Jeremias Maerki * @version $Id: PSTextPainter.java,v 1.15 2003/01/08 14:03:55 jeremias Exp $ */ public class PSTextPainter implements TextPainter { @@ -93,7 +92,6 @@ public class PSTextPainter implements TextPainter { * @param g2d the Graphics2D to use */ public void paint(TextNode node, Graphics2D g2d) { - // System.out.println("PSText paint"); String txt = node.getText(); Point2D loc = node.getLocation(); @@ -251,7 +249,6 @@ public class PSTextPainter implements TextPainter { * @return new current location */ protected Point2D paintACI(AttributedCharacterIterator aci, Graphics2D g2d, Point2D loc) { - //System.out.println("=============================================="); //ACIUtils.dumpAttrs(aci); aci.first(); @@ -498,7 +495,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Mark getMark(TextNode node, int pos, boolean all) { - System.out.println("PSText getMark"); return null; } @@ -511,7 +507,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Mark selectAt(double x, double y, TextNode node) { - System.out.println("PSText selectAt"); return null; } @@ -524,7 +519,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Mark selectTo(double x, double y, Mark beginMark) { - System.out.println("PSText selectTo"); return null; } @@ -535,7 +529,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Mark selectFirst(TextNode node) { - System.out.println("PSText selectFirst"); return null; } @@ -546,7 +539,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Mark selectLast(TextNode node) { - System.out.println("PSText selectLast"); return null; } @@ -558,7 +550,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public int[] getSelected(Mark start, Mark finish) { - System.out.println("PSText getSelected"); return null; } @@ -570,7 +561,6 @@ public class PSTextPainter implements TextPainter { * @return null */ public Shape getHighlightShape(Mark beginMark, Mark endMark) { - System.out.println("PSText getHighlightShape"); return null; } diff --git a/src/java/org/apache/fop/render/xml/XMLXMLHandler.java b/src/java/org/apache/fop/render/xml/XMLXMLHandler.java index adec8a385..b441322d6 100644 --- a/src/java/org/apache/fop/render/xml/XMLXMLHandler.java +++ b/src/java/org/apache/fop/render/xml/XMLXMLHandler.java @@ -18,6 +18,8 @@ package org.apache.fop.render.xml; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.fop.render.XMLHandler; import org.apache.fop.render.RendererContext; @@ -38,6 +40,9 @@ public class XMLXMLHandler implements XMLHandler { /** Key for getting the TransformerHandler from the RendererContext */ public static final String HANDLER = "handler"; + /** Logging instance */ + private static Log log = LogFactory.getLog(XMLXMLHandler.class); + private AttributesImpl atts = new AttributesImpl(); /** @see org.apache.fop.render.XMLHandler */ @@ -105,7 +110,7 @@ public class XMLXMLHandler implements XMLHandler { handler.endCDATA(); break; case Node.ENTITY_REFERENCE_NODE: - System.out.println("Ignoring ENTITY_REFERENCE_NODE. NYI"); + log.warn("Ignoring ENTITY_REFERENCE_NODE. NYI"); /* writer.write("&"); writer.write(); diff --git a/src/java/org/apache/fop/svg/PDFANode.java b/src/java/org/apache/fop/svg/PDFANode.java index 97bf99f8d..f3ef9e6dc 100644 --- a/src/java/org/apache/fop/svg/PDFANode.java +++ b/src/java/org/apache/fop/svg/PDFANode.java @@ -101,6 +101,7 @@ public class PDFANode extends CompositeGraphicsNode { } } } catch (Exception e) { + //TODO Move this to setDestination() and throw an IllegalArgumentException e.printStackTrace(); } Rectangle2D destRect = new Rectangle2D.Float(x, y, width, height); diff --git a/src/java/org/apache/fop/svg/PDFGraphics2D.java b/src/java/org/apache/fop/svg/PDFGraphics2D.java index abcc627c5..7a1454710 100644 --- a/src/java/org/apache/fop/svg/PDFGraphics2D.java +++ b/src/java/org/apache/fop/svg/PDFGraphics2D.java @@ -240,6 +240,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { * @param ioe IOException to handle */ protected void handleIOException(IOException ioe) { + //TODO Surely, there's a better way to do this. ioe.printStackTrace(); } @@ -439,7 +440,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { public boolean drawImage(Image img, int x, int y, ImageObserver observer) { preparePainting(); - // System.err.println("drawImage:x, y"); int width = img.getWidth(observer); int height = img.getHeight(observer); @@ -493,8 +493,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { preparePainting(); - //System.out.println("drawImage x=" + x + " y=" + y - //+ " width=" + width + " height=" + height + " image=" + img.toString()); // first we look to see if we've already added this image to // the pdf document. If so, we just reuse the reference; // otherwise we have to build a FopImage and add it to the pdf @@ -637,7 +635,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { * @see java.awt.Graphics#create */ public void dispose() { - // System.out.println("dispose"); pdfDoc = null; fontInfo = null; currentStream = null; @@ -662,7 +659,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { */ public void draw(Shape s) { preparePainting(); - // System.out.println("draw(Shape)"); //Transparency shortcut Color c; @@ -833,7 +829,8 @@ public class PDFGraphics2D extends AbstractGraphics2D { //PDFColor currentColour = new PDFColor(blackMagenta[0], blackMagenta[1]); //currentStream.write(currentColour.getColorSpaceOut(fill)); } else { - System.err.println("Color Space not supported by PDFGraphics2D"); + throw new UnsupportedOperationException( + "Color Space not supported by PDFGraphics2D"); } } @@ -1319,7 +1316,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { * @see #setClip */ public void drawRenderedImage(RenderedImage img, AffineTransform xform) { - //System.out.println("drawRenderedImage"); + //NYI } /** @@ -1354,7 +1351,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { */ public void drawRenderableImage(RenderableImage img, AffineTransform xform) { - //System.out.println("drawRenderableImage"); + //NYI } /** @@ -1383,7 +1380,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { */ public void drawString(String s, float x, float y) { preparePainting(); - // System.out.println("drawString(String)"); Font fontState; if (ovFontState == null) { @@ -1550,7 +1546,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { public void drawString(AttributedCharacterIterator iterator, float x, float y) { preparePainting(); - System.err.println("drawString(AttributedCharacterIterator)"); Font fontState = null; @@ -1630,7 +1625,6 @@ public class PDFGraphics2D extends AbstractGraphics2D { */ public void fill(Shape s) { preparePainting(); - // System.err.println("fill"); //Transparency shortcut Color c; @@ -1828,7 +1822,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { * @param c1 the XOR alternation color */ public void setXORMode(Color c1) { - //System.out.println("setXORMode"); + //NYI } @@ -1853,7 +1847,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { */ public void copyArea(int x, int y, int width, int height, int dx, int dy) { - //System.out.println("copyArea"); + //NYI } } diff --git a/src/java/org/apache/fop/svg/PDFGraphicsConfiguration.java b/src/java/org/apache/fop/svg/PDFGraphicsConfiguration.java index edd79cad2..488e99f0e 100644 --- a/src/java/org/apache/fop/svg/PDFGraphicsConfiguration.java +++ b/src/java/org/apache/fop/svg/PDFGraphicsConfiguration.java @@ -70,7 +70,7 @@ class PDFGraphicsConfiguration extends GraphicsConfiguration { } /** - * FIXX ME: This should return the page bounds in Pts, + * TODO: This should return the page bounds in Pts, * I couldn't figure out how to get this for the current * page from the PDFDocument (this still works for now, * but it should be fixed...). @@ -78,7 +78,6 @@ class PDFGraphicsConfiguration extends GraphicsConfiguration { * @return the bounds of the PDF document page */ public Rectangle getBounds() { - System.out.println("getting getBounds"); return null; } @@ -110,7 +109,6 @@ class PDFGraphicsConfiguration extends GraphicsConfiguration { * @return the default transform for the configuration */ public AffineTransform getDefaultTransform() { - System.out.println("getting getDefaultTransform"); return new AffineTransform(); } @@ -122,7 +120,6 @@ class PDFGraphicsConfiguration extends GraphicsConfiguration { * @return the normalizing transform for the configuration */ public AffineTransform getNormalizingTransform() { - System.out.println("getting getNormalizingTransform"); return new AffineTransform(2, 0, 0, 2, 0, 0); } diff --git a/src/java/org/apache/fop/svg/PDFImageElementBridge.java b/src/java/org/apache/fop/svg/PDFImageElementBridge.java index a77855ed0..ca908db48 100644 --- a/src/java/org/apache/fop/svg/PDFImageElementBridge.java +++ b/src/java/org/apache/fop/svg/PDFImageElementBridge.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,6 @@ package org.apache.fop.svg; import org.apache.batik.bridge.SVGImageElementBridge; -import org.apache.fop.image.JpegImage; -import org.apache.fop.image.FopImage; -import org.apache.fop.image.analyser.ImageReaderFactory; - import java.awt.Shape; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -32,12 +28,15 @@ import java.io.InputStream; import org.w3c.dom.Element; -import org.apache.commons.logging.impl.SimpleLog; import org.apache.batik.bridge.BridgeContext; import org.apache.batik.gvt.AbstractGraphicsNode; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.util.ParsedURL; +import org.apache.fop.image.JpegImage; +import org.apache.fop.image.FopImage; +import org.apache.fop.image.analyser.ImageReaderFactory; + /** * Bridge class for the <image> element when jpeg images. * @@ -55,12 +54,12 @@ public class PDFImageElementBridge extends SVGImageElementBridge { * THis checks if it is a jpeg file and creates a jpeg node * so the jpeg can be inserted directly into the pdf document. * @param ctx the bridge context - * @param e the svg element for the image + * @param imageElement the svg element for the image * @param purl the parsed url for the image resource * @return a new graphics node */ protected GraphicsNode createImageGraphicsNode - (BridgeContext ctx, Element e, ParsedURL purl) { + (BridgeContext ctx, Element imageElement, ParsedURL purl) { try { InputStream is = purl.openStream(); if (!is.markSupported()) { @@ -71,38 +70,41 @@ public class PDFImageElementBridge extends SVGImageElementBridge { byte [] data = new byte[3]; is.read(data); is.reset(); - if ((data[0] == (byte)0xFF) && (data[1] == (byte)0xD8) && - (data[2] == (byte)0xFF)) { - FopImage.ImageInfo ii = ImageReaderFactory.make - (purl.toString(), is, null); + if ((data[0] == (byte)0xFF) + && (data[1] == (byte)0xD8) + && (data[2] == (byte)0xFF)) { + FopImage.ImageInfo ii = ImageReaderFactory.make + (purl.toString(), is, null); JpegImage jpeg = new JpegImage(ii); - SimpleLog logger = new SimpleLog("FOP/SVG"); - logger.setLevel(SimpleLog.LOG_LEVEL_INFO); jpeg.load(FopImage.ORIGINAL_DATA); PDFJpegNode node = new PDFJpegNode(jpeg, ctx, e, purl); - + Rectangle2D imgBounds = getImageBounds(ctx, e); - Rectangle2D bounds = node.getPrimitiveBounds(); - float [] vb = new float[4]; - vb[0] = 0; // x - vb[1] = 0; // y - vb[2] = (float) bounds.getWidth(); // width - vb[3] = (float) bounds.getHeight(); // height - + Rectangle2D bounds = node.getPrimitiveBounds(); + float [] vb = new float[4]; + vb[0] = 0; // x + vb[1] = 0; // y + vb[2] = (float) bounds.getWidth(); // width + vb[3] = (float) bounds.getHeight(); // height + // handles the 'preserveAspectRatio', 'overflow' and 'clip' // and sets the appropriate AffineTransform to the image node initializeViewport(ctx, e, node, vb, imgBounds); - return node; + return node; } } catch (Exception ex) { + //TODO Handle this exception } return superCreateGraphicsNode(ctx, e, purl); } + /** + * @see org.apache.batik.bridge.SVGImageElementBridge + */ protected GraphicsNode superCreateGraphicsNode - (BridgeContext ctx, Element e, ParsedURL purl) { - return super.createImageGraphicsNode(ctx, e, purl); + (BridgeContext ctx, Element imageElement, ParsedURL purl) { + return super.createImageGraphicsNode(ctx, imageElement, purl); } @@ -112,21 +114,26 @@ public class PDFImageElementBridge extends SVGImageElementBridge { * the PDFGraphics2D. */ public class PDFJpegNode extends AbstractGraphicsNode { + private JpegImage jpeg; private BridgeContext ctx; - private Element e; + private Element imageElement; private ParsedURL purl; - private GraphicsNode origGraphicsNode=null; + private GraphicsNode origGraphicsNode = null; + /** * Create a new pdf jpeg node for drawing jpeg images * into pdf graphics. * @param j the jpeg image + * @param ctx the bridge context + * @param imageElement the SVG image element + * @param purl the URL to the image */ public PDFJpegNode(JpegImage j, BridgeContext ctx, - Element e, ParsedURL purl) { + Element imageElement, ParsedURL purl) { this.jpeg = j; this.ctx = ctx; - this.e = e; + this.imageElement = imageElement; this.purl = purl; } @@ -154,6 +161,7 @@ public class PDFImageElementBridge extends SVGImageElementBridge { float height = jpeg.getHeight(); pdfg.addJpegImage(jpeg, x, y, width, height); } catch (Exception e) { + //TODO Handle this exception properly e.printStackTrace(); } } else { @@ -162,9 +170,9 @@ public class PDFImageElementBridge extends SVGImageElementBridge { if (origGraphicsNode == null) { // Haven't constructed baseclass Graphics Node, // so do so now. - origGraphicsNode = - PDFImageElementBridge.this.superCreateGraphicsNode - (ctx, e, purl); + origGraphicsNode + = PDFImageElementBridge.this.superCreateGraphicsNode + (ctx, imageElement, purl); } origGraphicsNode.primitivePaint(g2d); } @@ -187,6 +195,7 @@ public class PDFImageElementBridge extends SVGImageElementBridge { return new Rectangle2D.Double(0, 0, jpeg.getWidth(), jpeg.getHeight()); } catch (Exception e) { + //TODO Handle this exception properly e.printStackTrace(); } return null; diff --git a/src/java/org/apache/fop/svg/PDFTextPainter.java b/src/java/org/apache/fop/svg/PDFTextPainter.java index 5c8c42a47..7dcdc283d 100644 --- a/src/java/org/apache/fop/svg/PDFTextPainter.java +++ b/src/java/org/apache/fop/svg/PDFTextPainter.java @@ -84,7 +84,6 @@ public class PDFTextPainter implements TextPainter { * @param g2d the Graphics2D to use */ public void paint(TextNode node, Graphics2D g2d) { - // System.out.println("PDFText paint"); String txt = node.getText(); Point2D loc = node.getLocation(); @@ -328,7 +327,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Mark getMark(TextNode node, int pos, boolean all) { - System.out.println("PDFText getMark"); return null; } @@ -341,7 +339,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Mark selectAt(double x, double y, TextNode node) { - System.out.println("PDFText selectAt"); return null; } @@ -354,7 +351,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Mark selectTo(double x, double y, Mark beginMark) { - System.out.println("PDFText selectTo"); return null; } @@ -365,7 +361,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Mark selectFirst(TextNode node) { - System.out.println("PDFText selectFirst"); return null; } @@ -376,7 +371,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Mark selectLast(TextNode node) { - System.out.println("PDFText selectLast"); return null; } @@ -388,7 +382,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public int[] getSelected(Mark start, Mark finish) { - System.out.println("PDFText getSelected"); return null; } @@ -400,7 +393,6 @@ public class PDFTextPainter implements TextPainter { * @return null */ public Shape getHighlightShape(Mark beginMark, Mark endMark) { - System.out.println("PDFText getHighlightShape"); return null; } diff --git a/src/java/org/apache/fop/util/ASCII85InputStream.java b/src/java/org/apache/fop/util/ASCII85InputStream.java index 7e6e57821..d9b3fae91 100644 --- a/src/java/org/apache/fop/util/ASCII85InputStream.java +++ b/src/java/org/apache/fop/util/ASCII85InputStream.java @@ -31,7 +31,6 @@ import java.io.IOException; * The filter is described in chapter 3.13.3 of the PostScript Language * Reference (third edition). * - * @author Jeremias Maerki * @version $Id$ */ public class ASCII85InputStream extends InputStream @@ -119,7 +118,6 @@ public class ASCII85InputStream extends InputStream } else { int cIndex = 0; tuple = (buf - START) * POW85[cIndex]; - //System.out.println(cIndex + ": " + Long.toHexString(tuple)); cIndex++; while (cIndex < 5) { buf = filteredRead(); @@ -131,7 +129,6 @@ public class ASCII85InputStream extends InputStream throw new IOException("Illegal 'z' within tuple"); } else { tuple += (buf - START) * POW85[cIndex]; - //System.out.println(cIndex + ": " + Long.toHexString(tuple)); cIndex++; } } diff --git a/src/java/org/apache/fop/util/ASCII85OutputStream.java b/src/java/org/apache/fop/util/ASCII85OutputStream.java index 49a3f5239..02bc613dc 100644 --- a/src/java/org/apache/fop/util/ASCII85OutputStream.java +++ b/src/java/org/apache/fop/util/ASCII85OutputStream.java @@ -25,7 +25,6 @@ import java.io.IOException; /** * This class applies a ASCII85 encoding to the stream. * - * @author Jeremias Maerki * @version $Id$ */ public class ASCII85OutputStream extends FilterOutputStream diff --git a/src/java/org/apache/fop/util/CloseBlockerOutputStream.java b/src/java/org/apache/fop/util/CloseBlockerOutputStream.java index d977ef19a..8417d7eaa 100644 --- a/src/java/org/apache/fop/util/CloseBlockerOutputStream.java +++ b/src/java/org/apache/fop/util/CloseBlockerOutputStream.java @@ -38,7 +38,6 @@ public class CloseBlockerOutputStream extends FilterOutputStream { * @see java.io.OutputStream#close() */ public void close() throws IOException { - //System.out.println("Not sending close() to " + out); try { flush(); } catch (IOException ioe) { diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java index f322d2679..21048b374 100644 --- a/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java +++ b/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java @@ -69,7 +69,7 @@ public class PCLRenderer extends PrintRenderer { try { fontcode = Integer.parseInt(name.substring(1)); } catch (Exception e) { - e.printStackTrace(); + log.error(e); } } switch (fontcode) { diff --git a/src/sandbox/org/apache/fop/render/pcl/PCLStream.java b/src/sandbox/org/apache/fop/render/pcl/PCLStream.java index 0ad8096cc..34150f16a 100644 --- a/src/sandbox/org/apache/fop/render/pcl/PCLStream.java +++ b/src/sandbox/org/apache/fop/render/pcl/PCLStream.java @@ -44,8 +44,6 @@ public class PCLStream { try { out.write(buff); } catch (IOException e) { - // e.printStackTrace(); - // e.printStackTrace(System.out); throw new RuntimeException(e.toString()); } } diff --git a/test/java/org/apache/fop/util/ASCII85InputStreamTestCase.java b/test/java/org/apache/fop/util/ASCII85InputStreamTestCase.java index 0c1d2a02e..04033e913 100644 --- a/test/java/org/apache/fop/util/ASCII85InputStreamTestCase.java +++ b/test/java/org/apache/fop/util/ASCII85InputStreamTestCase.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import org.apache.commons.io.CopyUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.fop.pdf.PDFText; @@ -34,8 +34,6 @@ import junit.framework.TestCase; * ATTENTION: Some of the tests here depend on the correct behaviour of * ASCII85OutputStream. If something fails here make sure * ASCII85OutputStreamTestCase runs! - * - * @author Jeremias Maerki */ public class ASCII85InputStreamTestCase extends TestCase { @@ -52,10 +50,7 @@ public class ASCII85InputStreamTestCase extends TestCase { byte[] ascii85 = text.getBytes("US-ASCII"); InputStream in = new ByteArrayInputStream(ascii85); InputStream decoder = new ASCII85InputStream(in); - ByteArrayOutputStream baout = new ByteArrayOutputStream(); - CopyUtils.copy(decoder, baout); - baout.close(); - return baout.toByteArray(); + return IOUtils.toByteArray(decoder); } private byte[] getChunk(int count) { -- 2.39.5