From ca0be9ca87b9634e5e0a5ee7cc279475eb5daac3 Mon Sep 17 00:00:00 2001 From: Tomasz Jezierski Date: Thu, 7 Dec 2017 15:06:55 +0100 Subject: [PATCH 01/13] Add value in TiffImagePlugin in compression list --- PIL/TiffImagePlugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 43ffd1b4fe5..f31ce36dc36 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1251,7 +1251,8 @@ def _setup(self): "tiff_deflate", "tiff_sgilog", "tiff_sgilog24", - "tiff_raw_16"]: + "tiff_raw_16", + "jpeg"]: # if DEBUG: # print("Activating g4 compression for whole file") From bc6683cecfe15568f8c908c8ef977f688f9c588b Mon Sep 17 00:00:00 2001 From: Tomasz Jezierski Date: Tue, 12 Dec 2017 11:21:42 +0100 Subject: [PATCH 02/13] tiff-colors-fix test adjust --- Tests/test_file_tiff.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index d0aaef6985f..785e7a477d9 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -80,12 +80,8 @@ def test_gimp_tiff(self): self.assertEqual(im.mode, "RGB") self.assertEqual(im.size, (256, 256)) self.assertEqual( - im.tile, [ - ('jpeg', (0, 0, 256, 64), 8, ('RGB', '')), - ('jpeg', (0, 64, 256, 128), 1215, ('RGB', '')), - ('jpeg', (0, 128, 256, 192), 2550, ('RGB', '')), - ('jpeg', (0, 192, 256, 256), 3890, ('RGB', '')), - ]) + im.tile, [('jpeg', (0, 0, 256, 256), 0, ('RGB', 'jpeg', False))] + ) im.load() def test_sampleformat(self): From bec8f415bea0952a08f1a15ce48e98034a82cc85 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 13 Dec 2017 12:47:11 +0000 Subject: [PATCH 03/13] end to end test helper, more end to end tests for tiffs --- Tests/helper.py | 35 ++++++++++++++++++++---- Tests/images/copyleft.png | Bin 0 -> 5144 bytes Tests/images/pil136.png | Bin 0 -> 1883 bytes Tests/images/pil168.png | Bin 0 -> 6800 bytes Tests/images/tiff_16bit_RGBa_target.png | Bin 0 -> 13096 bytes Tests/test_file_tiff.py | 15 ++++++---- 6 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 Tests/images/copyleft.png create mode 100644 Tests/images/pil136.png create mode 100644 Tests/images/pil168.png create mode 100644 Tests/images/tiff_16bit_RGBa_target.png diff --git a/Tests/helper.py b/Tests/helper.py index 38eb98a9465..b8b44b6f2ec 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -14,11 +14,22 @@ HAS_UPLOADER = False -try: - import test_image_results - HAS_UPLOADER = True -except ImportError: - pass + +if os.environ.get('SHOW_ERRORS', None): + # local img.show for errors. + HAS_UPLOADER=True + class test_image_results: + @classmethod + def upload(self, a, b): + a.show() + b.show() +else: + try: + import test_image_results + HAS_UPLOADER = True + except ImportError: + pass + def convert_to_comparable(a, b): @@ -99,11 +110,17 @@ def assert_image_equal(self, a, b, msg=None): try: url = test_image_results.upload(a, b) logger.error("Url for test images: %s" % url) - except: + except Exception as msg: pass self.fail(msg or "got different content") + def assert_image_equal_tofile(self, a, filename, msg=None, mode=None): + with Image.open(filename) as img: + if mode: + img = img.convert(mode) + self.assert_image_equal(a, img, msg) + def assert_image_similar(self, a, b, epsilon, msg=None): epsilon = float(epsilon) self.assertEqual( @@ -136,6 +153,12 @@ def assert_image_similar(self, a, b, epsilon, msg=None): pass raise e + def assert_image_similar_tofile(self, a, filename, epsilon, msg=None, mode=None): + with Image.open(filename) as img: + if mode: + img = img.convert(mode) + self.assert_image_similar(a, img, epsilon, msg) + def assert_warning(self, warn_class, func, *args, **kwargs): import warnings diff --git a/Tests/images/copyleft.png b/Tests/images/copyleft.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c63b887f377c94e34375b838292b316eb9ebde GIT binary patch literal 5144 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 literal 0 HcmV?d00001 diff --git a/Tests/images/pil168.png b/Tests/images/pil168.png new file mode 100644 index 0000000000000000000000000000000000000000..1f752ff5606629fbed3ed51db602a65edb2d8000 GIT binary patch literal 6800 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 JA3AsaKL9?AA1(j@ literal 0 HcmV?d00001 diff --git a/Tests/images/tiff_16bit_RGBa_target.png b/Tests/images/tiff_16bit_RGBa_target.png new file mode 100644 index 0000000000000000000000000000000000000000..cecc295d4b801d955ed3f4aa0a870cc132a37727 GIT binary patch literal 13096 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 Date: Wed, 20 Dec 2017 10:01:10 +0000 Subject: [PATCH 04/13] Read all compressed files through libtiff. --- PIL/TiffImagePlugin.py | 10 +--------- Tests/test_file_tiff.py | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index f31ce36dc36..140074cb0e0 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1244,15 +1244,7 @@ def _setup(self): offsets = self.tag_v2[STRIPOFFSETS] h = self.tag_v2.get(ROWSPERSTRIP, ysize) w = self.size[0] - if READ_LIBTIFF or self._compression in ["tiff_ccitt", "group3", - "group4", "tiff_jpeg", - "tiff_adobe_deflate", - "tiff_thunderscan", - "tiff_deflate", - "tiff_sgilog", - "tiff_sgilog24", - "tiff_raw_16", - "jpeg"]: + if READ_LIBTIFF or self._compression != 'raw': # if DEBUG: # print("Activating g4 compression for whole file") diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index a108a922c5f..4092c1e7c9d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -58,7 +58,7 @@ def test_16bit_RGBa_tiff(self): self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (100, 40)) - self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 50, 'RGBa;16B')]) + self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16B', 'tiff_lzw', False))]) im.load() self.assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") From d698d522efcf2920f1a39c5580460c6147c54b08 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 12:09:26 +0000 Subject: [PATCH 05/13] Added end to end tests in test_file_libtiff --- Tests/images/tiff_adobe_deflate.png | Bin 0 -> 93889 bytes Tests/test_file_libtiff.py | 9 +++------ 2 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 Tests/images/tiff_adobe_deflate.png diff --git a/Tests/images/tiff_adobe_deflate.png b/Tests/images/tiff_adobe_deflate.png new file mode 100644 index 0000000000000000000000000000000000000000..8a12206a22e1b99a96f67bdddb6cab847c7188ce GIT binary patch literal 93889 zcmXVXWmFu`)AcUyu((5T3la!!A-D&3O>lQ7xVyUt3r=t+xO;GS*F|?9e*gD9bLPyM z{xGMjy1MGt?K=_5ic;t(#3%p&09{5}Tm=9C;=kW+NHFgsG^>7}ij)|jdXn_` z{RP29PD&gA{qM@}EKPbJL3WVVb_M`YvH!b)v+I7Z?}LagG71ui+i19G$S^_)Hc9}% zPk@a07d4NSvp3HU+9h?0NdIo@bN$0LZ|@eNa$RS+)X&SQ-#rImKmGgHixiE_9RNpy z{n(kt{yh-x#^VDJ?E^B05jHuTiP$jaS21?rPYu4YR)xsuBLg68qLkA^ETHCH}&%d&8nyNaL&8NIp~``Mr+K(kg}!>WlRJ)Hnwsa zM_uROsDWR2kdI81*dsg!82C0lXsqCyFk3J%Ne)R7@eD1C`7N{}fG%z>r%H3Jf?xY~c zB7S38Q2d{!-N(GWi;lQ)O}mcOuu;GoBs~I;Y%Bj&(pd)ZExF1`et4#6-2CXhPC#VG!$x;Qr2u5;Oyqd7xJi$9m~KT@)M; zba!yt%GQb=nJ|9liXO?t1Q?i8(cR7}5mK3O!vce))KXA6b~BLTS{W;DNt2#(N%1!> zrF!}~{6~(uBYFG9N&}*Kom@5#h40&;H}rlt@NC}eQucmjP@|iw=e-)F@#{Gb(r?f$ z$C~exb@+!5PHk{zXwx+_uEhHK8*>td8ACwh{j`w;IMWNENg|4eA$F{2UW2mxc4@Ui zENP)6)e9Q0)aYYsguuOEA~T*1rGf8W{~GA2vy40w1!zh0tGoRHlC@huzoT6nu!4G>i998V>7#~($tBGbXl(SIcm=F%N_Sy^4CDn zmxpK&@F9qUs>}t@OfVl_=(_#_xP8SbOQaVxO7UbF@3(yzP)akc$x*ncHxUXO&**(K`CSUu znGsLP>`34v2}Q!DqNIcYiYs^Sk$2isH&~Aonc#F)w0E2s{8Xym=fr^b4xq+WW?;fa zqARqm=(-1!gR;|w9S{Kt5ygpR-he(+vjt_dn_#5N^80l1VV9)v@CBsj7Qo{+_b`b4L$2`Ng zKDal#mz=?S&8h|gg&`42pV3Og!EMb)mLJx5w>%X99qLv163~A)YidXJQ8Ffre~YYT zioYk`=0yDBt0eD%Jll40bg%1@E zCOr#@zP^D#IJ`XK-zql_!fD=k4EZ+QU4EEukKk|r9C?>92XW|0IZTH7-q_v*6$i&M z9sbdt&}aHUvzii4m7_-G-+%6*t@=1m*jJ-;27h>4B#zfu`g~3ra)*mXR`Pa%cdx4V z?HN>kRzgzjV%Q{qCZard2Sc6<_vhge)C59;v1qhaiNZ%c(zPMZT(0JMXBo@wOTRu< z#_IW3#>?g;iQ%~S@%t}ldz&0k9N)JwW%(2$c(-T*7j!?8CoLf_cGeR%U>_`MJdJJ*99T5~hcIVqy#NZ1MgRz82)%89EyS$w9dsy0 zS$eP;g|t5B&!xzi9MJ?FDFlHO1#2Xr=9B%k@&IlaolaoCm~Y+_#jVY>95k4~6S3-5q~qw*K@*X^f2>vZ-R5e**zjn>v- zm^D66sZ($J=oF79r(J$84-?+tYCt$ro)5aY))CjVkHN_6!CiN{;hXO$HQBdYNqV%9 zqOb=tK?nPPI(FY3E$b|avGo~u7Zx0Kf0`Lv4($w*sn}*lfO+XQ0@rMaSUbHi)*&;cr}B1!R?_42bbEL0 z<#jacZMI8>FTZ%+o+zMxvmLI7PcLAK6W>kq;%UndlE7NU8Ggy~n$^zbNvwyBA4Z$7 z&C4qrl{J13pEV60$8VeMHtUns%yz})2fo&=BVrghp02;xJ@2gNy{sK#k|v|;x*z^3 zw|@luCTG+8=Xl@cEkd3Lnf|fVwN@pch)CBA!rA{V#P*XA2$0kw0v4sDm_p##`zpIU z*;`92ohCVscRQobjM^Qpj*RMLEG_zN1h^ZMiJ2?Xavet^I7=fkoYB5e1u~(J6l;;h zoUU4#ktzBB&gPQXr=*jbB`GYUBK!lckkAOY^}rSOuR+iULxcOz?JA1rEoyE;|KWlI zRhz}3hXa>ZCf0BxQ8-2{$0-64r|S!6!>7b3JK|yoKoR;PsMKs*5<}F{b;#VhRt~sTckc+o0PQj8h78aO<6hd8sc{QAtQm z&%)~H8E##To3h)wpMLkVRq&syqf+b;Y21=52Y`|GHoq2AYidtRK_w?*$dz$5z^fB1pY7WQ>Kh0W>y^Zbf~NO4jOE(!vORJ{Ei;t zeDCE9uPO+HZeR7scAErTzJK&GJddamD?AtdMDKgOKyV>!K9=X_a!M}@x$ggAYw2k& zo3Y1Lh~#kUx#ahRdb#PlypW`ib8d}Ia6UvvmVKBli#XJCv^9$4{qPF87&A0{J3Kvu zA~U}=laPDde>S((nFg;5`W;RCT8Ch6I0LkZLTrRjPc-!+G5ueAmbzR#`ENRocvuwil0YBW4;uAZtIRlO_4H$9NBCc6#(n0WGjnxxYSR`hYk&HyBV zm$fM2hO4@wFpT2j^A-T7$N`bp^Ke1ZL@o`R?RO)9=`ol&{vh+#mgJD|2s0HM@Mi#gY3x=FY}; zYQ+dIXmZVkeiX>_yrmZwPjG#B*&D2wZ2F|bcYsj(+7Ots)cr8Tp%dZS`x zc-FaY{?Mp@%1kZzcm)KkHnE- z5k0qlz7R3G@LOa~hO|0ROjq*OO;W=AM6`c-wC;YutMMG61vy>~TipvN_}0-MbXfl8 z@fBR-p?KYr(jf1!pKH=*{5&_W?rgK>HAbky?w;+;N)}(9`BgmM zyufuS<9bT=Pq>De61O@c{Yn-kyPn_H)xrMujW4angAbr*tjlW2bxO$p&-unP^NW<5 zg{|wH%O?{i+~?nlr2Sb*L}vuA9)je}RZ`jRlXL-sjnJbYZ_IVK!#9F#@6?LNf1k@e z75-&R7*O(p9J8-q^ccaXKvaY$+zISrspwID~Pq%3R-R>Ad+&@UR0iFlH$WNDeX@%t; z=B3Pxj?TBUL#0(EBSrUnK(*1%O{zRqz6)cl{s&Ja02>{PP}DFHd>vv|lV-o^0sE>Lt1?_6G8q1tR;GkM$ z;-DIbs9amR|Cg*8{rYxp$K z3EhVtUjQG{1^=OAxRXq?+Ml^)3$$HHoFC}=Z4Xnt&7Z84o&RPQeyWR5(UjbE+B>pX zORe$irA-rlsd%{RtVG20&{bX&Ky_y8avXyPuQ!+%GDu9#285SWEp6U%ymGpZ8Y|9a zm2fLnMS~uG-%(jRT+21Fu_?s?fA${GRmGto0y^Hp3W$yzqd)4h|N zHEo`IXZyAy%?*?zV+PL?ii-GKyC$E=KpxwuhP-6Z5H_FfyYqvjilL0dzAp;{B_(cx z70xd2g%`o;k$?Y`u%=H8%z?b@Vpnd(!8xAKG`acvw3gPs{~9Hap!n+`6so5Kuq!t>lmv zm&B~vKaIzv8M>;=%k7^~5d*0^AorU7OYXjA@Iq7a+!`8^9&h{Ynvz<_c>$*swP1zc z(Y4VjDTogp{!=KDE!S_}e$Qcsh(^$D{2pb~xjsTd#ap|R8r{pb-TxeM`LcBB`GVQ` zkSbu8WuYy6_#H_qx!M_1tZh<}81h?_F-QEo;VSD{IB>d1v z&~>%$Ux#>aP?~|Mb@)O@C9}I&T9Ip9Fef@-E4;!nVRY<%ce&tkRjpgy`pid=+u#Z9 zE!u5zj`F#Kd|X~7+wYn3E3ay4$-26?NZpm-Tz~)r zM~J)cRUysbVZ76Q{g0Q01P{GJ1RUYU^1;6IWxM;-k10QllCFx*P)iNTPNcSrwn|M6 z48`x0YH(F|-t3-@5$L$8a#UB~ZbtxMjd2Y=av1M^nZoCYGS!_8^ZIoxRF%_$Un<~n zHmAA!Jx098$eOElXK`dyl>Rj`){v5ZM9YF@w$@EeqpEd&F~e+A&#!F#%V%VDKi>^G z`s&_w@q_KP2=hF`GQP~5dlI#P^5|mVYZ5`W45yGjmqKl((xOf?3l;}|+vTWvSJ~;= zk(KT^fc?WqX&&)W%l^=q{$8U@r(FaA6y~?|xjsv$P^m2p=dbz6!+iQ}-iK+ELN9WL z{{-~bDBHArm(1!M=d|6|A;-c-T$KzpXwKWCNX*QLo6s4GJfR7!vHty(8Q1jP!dBOf zFrQLPp0_xcyArt9p3>2qo0}AZGhmavov*$MKUJ5~#EgEnVhhB2iQ5UTB z*qB^O-I{4(+(KeO(!lmrn7<=E`;@7((u@d-OnOQa^M~cmzeMhRmLK8}dOD^k7dy3K zdlG_PCWS7u$;P7IYnY^Mgab$=ftxr?Ix{q=cV~8o%d#r^TkI!(f*apvvggjvLOyT+ z@_)?M;PaQ6w2yx0c)C^r(XClSz0}sL%{IK?!1dbmMxgJMP2A!C@ImYzPs!0fp*ZF zd)M9bzRdn9%d({k-DlUHzuBMpKI?iln7u4+_rewxx7kAzN(SInth~JP@x{lxLijYY zwexSk{0={oLp_{xW0bHghoiVS*NkYl&7~ zQI&L7zT9W;HYL|z%Ho4kwQVB5t;HXwHk}_^NeCtdobGn&AI4qo;L{HL!MzLDD@exb zMW1f3Tb$#_R@0hov`OPI+Fey+7^pJM3Q+1@xmPVxhheuePpjK625Jn+OaJy4n9Yd4VoGc9k1}aj8o&G>5$y)pdJ=tE>&;(jr4F-wttj? z)KYENEo!uG+;g0nA<5H+j!VBoPDCS+my8pS_(#&3J&rcKd2BbA@oVt^z1M5vaBiK$ zgs4`P;E0mdSj@aXwyme*<3(Y|l$@Cpf8?{$lXDjPTJC1MyS?UCF+`vW3X}eq5^~+Q zLts6B3CJ&I2?qOiYa(58;%4hioD!w;Yf(*`)tgWS-Bb#%$L(rsL`H>sx*4@^zK376 z2#tTZU=^jf``k$iI_$3c9Si}_mKzYip0!@T^_*%dKba34<~8{<&%1=RRx}}>tnp@= zU$%iI*bLVi8y&HwN~S)|nhSo4XpsErtS)?;Cn+9&)pyH7E~v&EaFyY(v_=C4hu$;Y zdBNM|%r&w_iFi5e9~CUb2(bP0chK9k{;v;IcBmgTljSKjw9@BdJPsZBrIi;zU5pYj zYZK_ETo9=SDWA1CPJ!MXMfp+2toAxwrKYh$V-D>}IG+Ops_>`t_)UrDww^_xu4&WnU8eC&{ZikX+YG_mwRU3hI-vij&s}9!4W#YyH z6JYcMzJaTSud?rOCrOA+{VEx?xk|sDvsAE(;>UPUmjY}7X9j0hE8`6YT{VonmX#w% z#!SaxNa=zoj^y3_<}gR}XXm&Fe-$K?Mz6bq_Dh`&&x;xSMe2;l|Jby>IhfOo8~tu( z#qQ>kkbx5dS(&vUJR!eT?YixaTb`5AJP{rgSw!nzYpCCCqJO>1oIUI75QTx~F59qN z*FLzb@nI2@>`BV7{jTZ|W8)>nZrE)ubZ}yV6q`o<4?foC7*<#AX2|(CJWMdmIp}g>@}k%$Y6)Iu zd=%BQmH5*4dKIKDK6o9dA3jNC%UPfJQZ8gkx4d{XdO>Xs4Ge^>|GsZr=DE=*&ZhTv z!Zibql#c0%i;k;zUQ18U=cp$E5lklR;c>nVD@88su(y@)x&5K->uzK1I$I0Y;pJaG z-P#}Q(iHw#DY2K2+YhwT&|}2<8~TlxY4vsj=zSi=hu8DVZg6(ad*gipvSkd@9D2d5 zzR=}!IvPHD|0sp9gG+xXZ3C+himaBtuBuj|X+`i!lz%m0VA77Q1D)KV+I*KDK=qYr z(k3lq8)LkeY25HuEAOAr*h=7YUZQFZOSgc+q8Cn)f@7K9Ah?gfR0|@ z<9yTi(SM^IY|3LJ!1g-`PmF-4bE`eYaqD!`s{09tr0YQ<;O4ew_1YKec`4$dt`TwR z(ObRweAx`mAvhS=ro_x_GFn?H`-q59RTbM#rpt|nP#$(tX77#31MHI}QN$#eRsSoY zPyelqFZv?@Cwt}|fjqXEj_v`8SxavrR*i_2d?&sbHvmNf5SrDR5qAHrDwA!-Fdn21 zkQc3}$m*rWx?n)y#1C2+d%R;7BgBvSK{jW zVTV0O2JIx@;34#0s5H(#Mz232 zR>TjF?QMn4zWq}IO+V{x=k8A%PtaSruD4L3ORuFEd;bB6&9^q|t~Y%iXl3{7tQ4YL z*!?iyro)8DKdyf{iFA1C-xlajMXv)7FS-s^m?u|UG3aE<{cq8yNHA35T6uesx8Z)c zEVdK~i~B?A{r>STo8wWIxqntEmRil!L!DEe(hGgi+i*cAMD&E2jLGoA&+fZ?;?k#A z^ysH=88J&A+I4z7vaqcZuwJF5_c-HZanZ4O(0@9Ee|%-0f;5P{8Fs%^i`*h{>iO=6 zXzJf~d{Ja7WRjt!wRF-U#Ynw?X#3A>CWhEblc=sVUH|fjUNvcA+C$VkpI3Q&?>2>8 zwwobfCCKZ24N>Q1kO=sM8TxGKcO1Ipd#@da$wtQ8_~6Y0jk@eO&Rtz-6=l09zIe)M<6#9JlG4B~bg&(G{no(haC(id-TPB=PgMta%LDJ*r zX}KD^H2G8=GWA-T;=Cb99@BM@c=@~~<+shZ+U+YyEObf4_IexFc{%HxR%NtV&~M9w zK#T`+GLBCioxMr*e`NF9Szhv6NIe%&0yn~R6X^PPAzLM18lZ_){}fCjnilz*IAgkFSh!t+(ErOg5U{59!S%S1s5S2 zq~Qvx3(Puea8Z|^{y|o)S|`^AM#Jn zKgV#8z^AsKu1qJdjLxfXHl!3Qf`iMS$d2kJ9gxsFUzadT_>Yor3S?`K3DvzoYskc81kS!?692swe66u(wDobwE=!XOsg3R z*?bDng`Vd5Uw3!B?(lS;++2<;B&k^G3h1qVqz#puIHR_&EeKWo~8mhCsMzyuI@y>&gxF=M|#IF<) z(l|+qw%arV#|ck=$5s1gTM`f-k1atMru)D;U5acL4;l~4o^IFUzJhL(y}?H6ZQUsg z)qmw_Wh`xKd2NsD_@8Scg|WQ9MgDH!CGES>BJ+ z$7GU}CeYpmbdn~N{5XUxGQlTM9MgAl+p8gtx?3D1n@#?I{&W4S7$budx{Ax6V~hT` z{Uhag5dmI$E+)o~{p+^WjScQL8~zTifhrUmcml6mAnmR#w!G2_O8h2%g3QW|@at`9 zSa(EryRj7=8~dhr#2B{J_NS;)DlQeh9iO_8bFO3U%C@<_zu)O#Sc+}6kWp8TqT zR9M@0I@f5!Ss1>_O-Mofyuaf~#Ug>@FsijIxqS0kaysj;$P|*gk3Idtr!~(T3k&L; zutwzib&k3kQndRA83Y$C@9o0o+aZMjxNyupr`fxu)}C=&($P02!o6DPgbCYwP`CgD9qMI5FINbH~coNKyvAf1T)MXN4v zN7midwo-TlW-xgGfWjy$Dr!)#1AF+kgVr|oTIa_m?h9_O>_4t^UA`~=PdxtqtCP3? zol_``t%~0#*wsUKTa@Aip7(}w&w6mkDCnU_31LDPa7-)6h(aagA^%O{C_Nfik;F7F zTxC>Xvg_*BeUtw}_;!{+&-dtPcpOndM@KK(AwgJAwP8tITwNmhyX@PnBUsJH7#M{* zQPq6@w7>aEAvY$#)^@kNI>k@Fk0an?>RU^%SZt#J={_&*y2gaaRh@M0{qTRaH+0x| zj#Ii@LN=#%s8H|vBx9(h$@_TZa$4hmdD(4#BkX++hVEYaJy4VRz9)J_M_)H>TP_Eu z(FvnN KTE&&P;Fk<)9A2vkowm_M>^<@8phUQ;A)IjC$yzw+Q8({xEOvqlSt-w_G z(X9EUAh^%0MN~L4hMi-9{Hcr#3if}DwHJ8#8%EAX5xac-*Hku+j^vQ_+M{GTw)+jo z-fu#?XQTV|5W3WE|D00OeXFPqS9-=`bMyt$($^~2BAOa@L~gcb*1U|(#ht1 z!I|qjK+7>;)FVi6ACf&MKfOYBKiPiy(kb$MD{!&ue<6`(=y1LN?w-ShC;C`Wvg0So z9B?!e>F+*9Fy0A2grr$+e4I=?16SK$M%ps=%28% zRY+0y9hp7<%R`=DKRN+)*1hA{1~7LHd-+NaeJXv%>Aqd+GDd{~L$>XG-vr33=^?{x zzC$GLIWDs%7oB&-xUFgW{M&g3{MRLH&-mIql&yIijAc)L05Fk13# z=lN(a*XpVE#3|)Gkj-mZ-(v&zeGz^-Ikkthdz|uYVv&Q!>|ftmAZoxGWNz~{jYkif zNdOyg4n0fj+Er+GxTJtA#`)g#kaTbV`v!CM@1{!RHfR$C&09y_t9I7sc5G3?!lO3f)P-%l%S zUg&mj_m^*1ts+kc{{?>dKH;iYH{;%129q@ppN4>>2>ZBBnp=%#Vok+ZU@^YkaR-X?Y4A38H%be(R?8Fs)s=Cf5p z_9zVBCT*do-O#PpmbcPPhyK0!_cc4;gbeCGjzO`@l=TmY@hign|gKo_m#L&a~M}vp>A}_6CO9Sg$#d`NcL{>MX zBFP)~e?o=Y*0LXlxz6%rOGWWkI(jQDwY7~Mu2KTzuIDYulM{5xzi`zTlC!>W5+1Ax zZv5+bFhazc55Td?;M8W119-i>KwMr1HU&>Nuz`9l``O`-^J)Ghj|r9$PcHvFwQ^en zTf%!TJ|2qyE$x0)+>)ZAa=7fo6uF%6ztuEw-!kvMXQSxV7Aj{)1W*mrk1Bb0-z5lX z`i(UJZ3NuGUnyFTd#nvyZK|i=;Z+Wo`S(Yh$3(`&tlp6m+}yR8f#1w;q=*BKedceM zu-&)){*U{Y&$>_-0<%MdmuQ~1c?yF!^Q|R=2ReD8gY9MwW9+oIm(6u-$NXIOn*0H0 zHqTvM=+TM@Z1+Pw&*HVn+lIZ@P*XE>(n$#NEo6EvM#x}U;7^E~4_K+|i3#xUCX>SV zt#k9m+WuAls-(vM(0!7tt(5h08!acf>o83CvAz5HKv&p*&i^fsr_jDU{M5kX8vL3E z-P(k#yhGY`plFIE&nDz*>GjX8TijS#mcwI_xVPd8hmG6o_2FOSF#g^yDF;+?|GimJ zk>+@j`&@6gOX(;%k}y=cIKLH~!gp~5*EB~g4RD9~UZ1G@_y~6CGDlL?fy|o@kq&g{(B)#M4#04uuzK2 zf4!S}@+zYa!ofGB?mi10f=4ZEH}cOQx_^|hrvn5zqVG{bw1jU7<(bmxZ>*8cHv(e*BF&D1rSZpF z)upRb;GySVr9(_XP|aUcWe~+>2q2nYmmFk{-tV??^Mn`>q%@=VKYNDyW+tbU%)O3j$AS)Ag8HNR0SdzF&DS&*n!0YbV{Cp;o=WSq|Jyc_abu%-#p1#p^3PfANaKQv?j#?%GtVfb{?AwA* z1{yQyqcO^(H4PB-=}u66>5(P!69qQ70$kB1P|^w$FWJ;MSqkiL8@6C1^)U zICg;Y2Y9of`QVtIWDX~Gw5xB41K1^BnjBgXOT-z9{I0PoP}E z?N~EqNU-eeTw0LV+h(vBJE-Sj3t;f#DDgxC!%?>qNOOg_rkNys0m;S0+h{m}b|@+X z`dA-+DhE=DdYr$+{>9ajs~|z-EBbos$v&>9iu@rMW452jN<&Z(IVs*K=~LgD!T>Bb z@Ed|fbo`3g1fi;RfZ6s1+Rxs6ZKM+B5S7(-RKicFunNzu6TrHKK_w~87gq;|`$j%I zNOQik+eHVs7jbH%t7DP>XOXpaS~j$CQWqOXHhRn=o>+p$Jb-%e!pP-{is=F$G~=4X z{)HuiO4b}ZRYgOAOwhBXAUtxeoHjC4isRcC_Hmh*SVs3`^-C1=5s78j3ycr&)7XWw zDEwa)BiZrlJ|W=gEP3@=OuZ|)Z`)%{*8Z~p=gD6M|+(A3g)4`xG{+o;=fayaoQb`CQ z4F>~mD3W^e7gv&RfrS?azu{?(sCI%G#AjS3aJLOsjedS19O#3Y3}*R+A3Ncs^&wtu zAqF4G+)6aEXPhNHy1;t-M4B>4ihz&Zy#NaKs(ea3altqB6q}M5he)k!N)W>VBao5-gl(jWJphDD5mf<&_A?ez;hP=I zQWJ=l*|E};0iD@E1%28oQ>0tHxT@9mC$XjYUI#U36H^OwBKC~a$o&)B(%Q(Su3KWW z8tc?59#NF*pLy(Zf-)?kfXeEK5;y?NKsvjsd`GKkEZj^yG4XJuf|eNUemQ!k3rb4y z9^^0SqT}d`V)IcP`MAi_LJU9zK~ct>$Ur17*=Pd=C&~mW2QMkr6VYTjVqN0RvL_6u9z14CbpCo&?M z1s_IPJ;1{<0tp|PX6dImPt$i5`IKVOzvxUc2XHgVD#vYbG*Xokf^q>zglY)|D`m`8 zvUH-s)MeUw-@e%z#VBK$fno=Os}xo;O*qoTx%$Mh66OF$EHHgESd=Ie3bcQAxj(m} zV@^24VMQaTd>URhw-tiE=J0JZ?i3vs6&H3QvBpXn4bT(W{A-xGa#eoh!q9TZfU()EDy+l^M_OH(~w1oWotrJ%tuU)cnfJqdzBLw@kqQG zEGgu;_$!8s<*miNNquS8WD8Y%ywG&`dW`b#wIG^wX=MojC;%20#*DUn(M<3H*j5${ z1Y*t=f4ZjsjU$<^q;^y(tdt^FU+?rdobU&tb300XeFgc-)^bpf>3`~f#CpJT7)e28|(w?UM7vT9iErwg0`tX z4f9)!Srv`OUnK@t{b54S#!Zx#30*)(0L_X8u*YM;mC5#fp$b-vNInJusbLDNQj6ub zNf7_V`vw(fxA0yK;KEWiGX;r(6maj2u`!*)Lx5^2RxoY4y!{`hSpu&LECSW^H39U} z7Sfx{xUm3>q=N`@G-JTFomhcYOM8)9MeI-QGWjkeMZbxv5rYKhzvZgZv839o9hR1! zs)lY4@4l(DF7ld*1U9;Fj>g(%N&FRhpy2Ir^@RNy64KlBv9sY3f(WjuiXp%cRZ#q+ zI)+meL&6O+*8Hw6JTW(1j*)uTy@34>n|)7{e8!(z`TyKLXfar_uZdv+T@us>7x#ac zxFCHe^H}1D7W)M^(>KpY6CtIXB9vxO&zD|6zcKUm8 zJxxfhbhz$PXsO`z&%lor=JG&f_Xc*ioOWqCb=D;UgHuvrA^Z~qPcuTps}n}4XNFVkAB-@?!LR$ z2A`l$JkURBFz=ecJpYLjJG%?8NDEZXeeI>snza(qX05i?>BwRU56?HTgoq%o;r>C_ zuGI%z{qlY~sG*Vj8kv_@sVZn67l7R_lno~sOfycjYeI!AewdnA_RB<~lO|CV#nJSd z5>FPf&EgMDXeIwZZ+xxEE{&K6E@qr~c@LqPqWZU34XFy;h2lc0f%YTm5B-6OTB|t% z#>gXmqBKA19mG+jmVlYbUrlyv*W+zf``Be9(Zm^Osq2-+87+!zjJSIwuy$fu5*I`n zFK8o`K`i;-21{7DVu}ZSiwnPCN{0W$4o?=ecLw8z}=7|SBwf-tQxK0$wPbCji_$WZtzwII=HyrwX$6hakV=A&PX%SUuq9>Rva>1 z6C@>9s&2@_pyapWk+fTKPVM@n!e7*s~2fdRoren~C>R>B6LXPOMG!6_rbo_s;C@L;D(#pgkY zOboo*k--bLXweo+JYwO;OQ~g1tL-^fZVnKemhq6qePkbVx`{#O{*D1pOc*W@dXoB? zs!z_UMN3(f29GV(YIk-LZ@U<*zY?Pr&wxUJA{ZPbDg_r{j17d>n=Wh=S9=t%sMjcv z{237MAdNjeLM(ZILM@vJ^rBSKLrifu%h@Wes-*YbP&!|AX;a~0`S?0X;X_Ha_=I-w z8U*^{Wa;P&9+o+uPU@(vTIKG7hNh6%FE_lWEJ%pC$dh??UZv^5Io?$Fj@sl_1cSE6 z4Ho84T#n0RZAz|qlcPRaV{Z09qo#Oqbk|^9=Ropb5hs#7;K@FC8S&2FD(DQLfgqjT zqFBn$K>BT88QW{QslW=GUcMD?Qw#>n6& zF`4EM8z)3*6JmqJs5Q`Kwj5L}Xa0a>%j+~LsnF2=G!aQ-MT0tu&9-7`9V z&z@9)c^OCdmaoisX%^ygNW{6so%Y2BT?#X?|T^-AlIl znXq>o{lQyrT&+s!u)5Mkb(76zU0YjQeSP5e&8^|w}a3 zO6UyNB8zG%Q}&5smwzBhkd~#K9}UNjmiJO%k)Gv+XZ;RWR-q#9q?pi`g&T>h#(xb|4PhXNOCaatb za=_x_OD2VjD0V^2LL$b^3`B|a9xKMJW4KU6rZf`6T&NBIixifo9{m0z3QQ_uZN39i zrW6eZZ4HPjKf+p!H-w9qgD`%yK7N}0qZ#Fz?^-yI2_qFP%P(9IDt45%nxM4@p*Dhy z1h!}#( z8+MyqLk~#?juIF}l`j#GMB<&N5h)n3S9N24u$j3vn)lp-MbzL{P0!szu}&F5@2&Z6 zySqqW5Td4}yU)?Cd-Xn9TEY4qByOEVbIdsx4mIbX1cw<$p1_y^M-vt#iF~`5E-vbx zw)cUi5wGOCv!hJOU*&q;mOl#Ev=gXQDnF6fZ0}DP`)0%&sS0F9LM0djgyU7nHox8$ z-ANW)i2`W3Tv5N;C>w_ZJh7~D5fVRhNQdL0Wg0VvdYO~EuYC& zQ^z9j4YvqFF_u1V6Gd}krA=l+3kFj51v0`E&(kV$okXzy6cxQ(7s7@~Z$(-MN>&vk zMWRR?kyECyXaKGmWDpt5u8{1_0`N2p2d*QB$`{0A4R7uviyQ@9VTb-kVd4C+%`9(j z#bgj#_HMfmxJj)sXsq$NP%ASxjWzvSZo57obVBD^D?56*|3*d-DzpA!;_?fKUM;$s1 zlXexYmnnD^SX)?2Bh3^uOv&HEsS=aL@C6PjApQ!CIp?SRXVI_ByDTON5sN`^i4TN) z(K@QQa9p454AxhQdxXM~#6D96-tDLnidoxei6PIz!}NfB0RYi_>yM<9ShJ_faN#ET zVb~?f`2exn^bi6#QVhvO;i0g5gslZ`oy&iIdNIr7bNm9S-(UgnN&?Rzvet{*tS*P4 zPRz5_F4sB6mI%<68x&S5AY~xLY$$bR)$g87^IhfcahaC4*6F_M>Gii#k8IG$S!aipzIcDljUbfGX(MYf1&BOrmsQ(3$tT7QV|V;QTKi;*00 zMjvX11ZM}H8LV15p@~%34&R5$vi-f>dE!Azr=$+bH9^hhw8tI`mHvtxxI}hT?EDDr zaWZ*~iqU%!k)^40w6IXh}=#ig*y|mgl2|?imTwWw$O=n1~3S2E#xzi5}h%H z6q1BsN7D*69`nIM6y*-NtSc@`pIH2_f)N?f@a(7+LE3buAv7-4YDkHK1n zJM>#}thV^b5mxaxSUdg6wRx_Q72r>X{EQgY*?BH_eQHkz{R(Ylqo8>!p5)qD?o1pm z%urNp#t2UY8QCOmx@y-P?c#(II!+^pk9G!>cuGa?GkD^vE6N3Os~-5GaM}{@ybOYL zdNUtA$TduRmox-xWMU8-^#cOIEg(|%#<2-Ec>1H@c=Y#aDlTy!6IA1!O<`8mEI=;I zTJY{RuK8KL|NhnW=w9js2@uX&f|$HxpJe0i z9FPnCoip`~kSxwE!$ZUJ<6CA=U~IV2C>2^6%*+8C zEv&(sx@&rJc=q@7dZv1>B4RYWFL21s++0yT)Kn-iSX#$eMu`qJU1s3;zbY%l%`%12 zI-z^tcKdyKRJjyP?LZjF&66xJ`cpH(0^@QY&97=1ipt7$$oUjZ)2M=}`+g^62niF= z_Nld3B6kZWpx@FQC3L{+rtz3yCuR}BbWEqM>geiAYu6}SBo5c zoA>ATY03-sDpa*S{P6IEF}+!;AlQM;c9xXs0?o2GwK{@$%jGgj5KsA@l8jxe>Z$+> zx9LZAVjs&^;X|M4FVyfGMAb?qdPx7=d;ykO#2d4NzbNRVv|f>75?UaarPRUyKz zo=c;bI(DbPa2mI&e!Vg*MtpUrPge1~J%L+X;N1L-D4J#@N5GIVJ!wN5A9zHyFBlId4Hp^vxRO2}py$XEr8$Rl+GWom$*&-Y0K zQAzR1*;q2-3=(3pmh0`=#iEJfShyf*BnkZqLJc)hG*Ya-b)jGjxUY{+MRF>{0Z3{k zBdA<*V(!%XG_W%8vIHS7>01~eR|M9)G-t@N3I>o`1|RCfpI9!_VV3nxlY5E9#`*ho=IEhsa1 zHah4jsZm6WtuBVR(7=Jl28~6r1>s_5(`f53Ad!t^5fdfgfS9pQ@viI5-HH!~IWgsw z8ZxXC5qd}pO)LeZj!RS_se~qEr3zITR2l+Nim9pxNQj7psMIV#xLYDAG>_t*kb;O1 zGb`?@(z*!7ghp5d9N9_{f%XyEK1>9FHMHz5B2f&GQfkH1%I&d0Gf7iCrTYDmFIOAUPI07l|%KNr9{( zs+w|Fx`3{)Vv$u!>RWXfPt3EBi`%2@W`MG*} z=53x5R6GE8ickdzwGLqPs|Vp24(J+YR>DbvsG-d%qwT84$-LHc8Y_N}CPlJfN(eJD zwcb&ijE1%40g^Um1wP6DHwRqF%rs2QN>GSeDHss~LJ~`K z2tYJ7AWG`dg3UD(7ogqfIKm>~Qse6Dh93_Gdz`Z&w zXzr-?R*ee50TIm(cdOj9jQjqWpYnVh3o&}9cBMdc)GoS)9R7fhNBt@fpIn(G*UoPtsD)J0L(g8xFCuM89)I#2mo}FJwyS4ie$v~@6l6Bd^EF(QQ$ zB?$&1nd6~`z_PFzWWq#24MrrPCWK@6s}{gw;!KYMK1YRQYxK;)aq}NLP_k4 z%BZ4UEoc$Ahzg^$bd{{`&_)vJrE`pxpa@h|nGwMpur6YdGQAV}kfCmi3n~;uB!YCH zBRY|+iKKVM0aOqvQKEp1Y93J7xyQI$7)UQlfbf6>P@-C00>B6qBRdlbaT8Zb2o%6H zkpXHT5N?13VD141#KYk(A^-&dLWR>ti5051f~ih&>piOAAqgm@rcfXZhzcfG#aU=Q zRTwe$X|L5f+^hl*RXWYWtEXl$5PSsj7J>aMk3kA;?i*ckLXZ6hzUiwk1TL)GzwxdQ zyz@_Qy#5u>yWqTYPt7WxpQ}?kZ;yqN`qrMo3j^)9R^C9zvz8I-lf;le=0%ScliXi6b!)LI!KLepXe zO0ya~fm>)!?xB)WVv-&=u~%B2v5)3sS>i2&FQDk&0P` z!V8L#5&6(HD`MbHHdGa?8|u}}%sN=_{tfBTxfVfEV=$*7Eu^ z4gay)LR`l~=*8fvr6Wg2kAS?hJ}xu|2RbK zXi5=rQa9FyQ)+J%+(9tDWz#BzQLLfRWpNO79mP>)>Sz~ zkphI#BZOmwsaV1yiVKY*))~_Pa5EdEWbO=!hz|Z%NTZJc)Ld%<W zpSv9^BLLXFvpsj)sc+Tu!B2eQ)X(O6N^Tt$0#>tFgrSX#2x%56XZIeuAgZe&01uIh z;T9Ca2~euDj#4Y|=&s4Uc%}`cZL%kI2~Pl%iVsXckcwHw(e8?eP!(kz49rmv4LuS4JxUzWOp?jDw@i zuYc`zH}1hVef8$)0srEi2Y>uGKL3y3c=2WDKM^jSpR4)pb9P^TYNqcIDN$T&K4xDC z$FU?u4MW!Y7Mh2co2D)>2rXd(P^5HSs)@}2tRtNfxt3j*5@N~AqF^C0fo5$Em@!-=+{4WbC1*A7M8p7U3NsJ5qZkB)dqikb zC_O6DsF+(g&1toihz#^^gCHd-+`M)$aSwA!AdKPyp)i~-j_P`=0P{VtO)VN?)K`gz zfEGrwHkj}T5t_NVcN1G^9qPwKRpR=eQ$j*ENt4PkNebiD?gVRb()eioI-T6>6S%h# z0Q|;ZVrAvv%4lU}1=s9ep8tGh1wa0lYkvG~@Bhc&ebwa`EkE{wr*}I`GkyBq3Fxa7 z`#60tG^Mam#oD-)oJpqKh+|wacqxiuvDHi}f-o2YrAav)VI51W;!rYtpls;ktwl&y zN4N&G=FgNuYqBQEl(uV=OL5C7p#;2G77`4KyO~FYD~N!ZBP=UZ8kDZ3uoM$%%$=l& zf-J>`sd4Ly7bS}b!VpG@wsa9*4Qzn~9PVDtCP`r?f`}-^1W?x8?+OHm9*{?blj>A~ zcvuhEI0>8xXx>spdpNiXpieiqa1p6_T+>=nfH5ZefPa6dtc3jshS3)Geb? zdvtX)8n;hm%{~TN0RX)In(B^QUK!!WTULP0KmRTOxbE_UE2EVkf7^`!{;z-k!T-`xG2%6WS%lu)rkS+U^>0_OE4n;Z3jFb6shCien%fCN-ixDPbJTX%5)e#Lqum42s4`eQ zia_8=LM%i@YRPH9&APg3JqJoDQqZcXyEjRb2H+{>EEI(Zx)L>MI*VH{u?Ah06fdI* zc8V+2YuRlL>{t+?S*&zSHJ3WfO(lw((E9FkArR6X5=o^5%#i>R4s`<*DonNc30y=1 z9taZ?Z({QBAOa!U01<9Af7e?Rfg3{UeMUg9xAobm$7O6kJvsX-(lq&T0}ila@jo6K z;q})nW3;j|0!GX4zXbsP#XAqKtgNhzu(Gm(iI{o@R*uai7xoO8C*|ZE2OC#1uX&BkOWOcWJA~nbo zD72!TMAxo0gC^i8;YtM(lZ7V|Ha1ZNB*X%OJT9fAZhbZ6j$-x3kL@}WxRVML>4w@7!<6;4jqj2dc;Su2!Gc=|lA)<(i;D{{Q zq-~;Ba6~x6wHbOT9*!#Qpe#zj8678e5SUAOj`g<3Eb;Uy{`yJE1d;10rR%=!yVm{r z+P@E6_|M<8`QX9LdsYsvtSqmrU}fb-VC4xs^88#qJ@YnCiBO?f04fewRp(gQbmKOs z#GpXoNm<}yp@d1|qD4_Ap?m3qCNxkyT0+NdCp9V}4vCyX0fitSW;toNk49am1ku3V zkp_ccxVsaI0NGhr!a7DyRHr+PZf?b*bS4O>s3@u(BV^>1B%+WG7ERg1s~4@#=GZz) z?|MrDB|wJtDbwz#ZHfXY-k0kID&}uRK<%;JETVqk2mnHqZ~_)J{;Q;zqwR{DMePnK z(4_9wD1rkqbtg<(6r;!8{;NqZf7vTu{<2rh@A<|5b{Bx}`uRIodfg5HUjKCX&rUt1 z;voVNF;wKYnsee*03is2lOu{2S2MVGDVtOyDjWh~2p~$rl#Re6R)rPaCWMiyTYy3{ zQ2}WI4~lSX)f?v3I`6syOXIfH#6eQ1j?Ki1Ce2#Q0z#7rs@7Faw@^_xcX!r+kQ*gL z8wrR34h!$R&?S%v)cT%qBebRi0yT>|Y*Kt`77mkC(TG5yxq*nETYREZDbZ`&>Hy|{rk`eA+`L^=F zNF@uk?MkAEN}o+2bdQLxM>b_`&Sw#jkeH;s5HNT52$gWJZ4R77so)J!g-69>gww-a zoTS&D552cA3W5x%c(_nRG$P!Km#8AHHgKAo{~qXlU9g6jOI3NQ7r^PEl@YFc%eycM z8KM6TVC9KD^88#)w?Fo!1Ltl@7oWTQgzxj<(Q?k#;nDFUH9ta?@Iih)zO0 zwK-Bs>KMZtAAp70f*}}smzkZKpsomXP6#XrA(WIP!i}Dj01OKmXhba`4T2KPiJ~O?Y}D|e)byMXktE4F*YFU9NQJLb z2y2sJFz5(SvYS=^M^I}fUSG2S=A0^Y9jtoGDB63~3u^AIB_=}MLTcAz0o|=w#hQ$X z!d3$YUXzJH1oE`lVI8XV92=eTz|dD1{oD^+bt;EDNnogya>YeEA3pS$o%P4jT5GGV z9UeUrHfqwGYJQ}d)mDe1zGkB)4R?dZC>o&mCEBhQa8@md5RugRI0<{-GAOCR1eJ;riJCMA$EtKV zYqbw4%zz>!C9Ocd0tRXDKuFID4i`v|9#jEIDK(D=6~w0&U;u7l^)y#(?rO%*BfeEZS6!9H9tN{pv;|LM1C01zwsa z3qnLZin*kefKa%gg_BTWLTVA7Ae~pYT^4iDlp02cL)M&1nu;(q!XU)}AqkOym{Hk@ z7+q0iow?Gx5DLJqbRq$TTh>G%+>NByPAghFu2fGAqKgD67JxL9Mv#@E_$ zOt&8k-T6y@`%nI0a_l$$;NSUs&pDlI_i3j2xtiZD#YFg|wBbn}@gp3Pnv~o+uWA3n z06C73fYfev5Rv3yGJ%Cl#a^SeZIFQ`yC}nQW347E2!_%vBy1Tp8*^^LN@*$Xu#tJn z$<1r0gWPB!yfhYVXRDfO$JRz9x?(^q3t^L zuW1bcNDV0wbVooC?1~d%?tpmsK&LXOhK732_B6fg2|y2M8~Yyd6h4r5-5^p>;$E1*vhci;_ZuT@s4b zjMTP?a6x!vhtfOoFl3R197}4OvTPfqhL+%~h_RL81Zz=WAw>k%gL<|MRW2k^s!?0` zAP}N8_V2YVM1*&4J=|`^!0*9AfS^Yx6=Bpqcg6rmf_nvX6e8Rm9#M;c;1Q{x9F^#O z)MgG55pg#HW+o!ZJ;K5RLP7*m>fF{upT6d`kU?e<31>u@1qB{e8;l4#Js>LL#hSUI zI&+^Z<(VeQv9Dx(d~eXnxUabA+Wy2nzx3UI@-Bief5G?N{qbMiGdXVe3x4Crc7OaQ zez)#<_M5)-=e}-vdN2USw(tAtH(bAS&o6!Vr!M&EH(b9HxaobbdE0^S`{}R2ul(-% zahCu4^qA8`^K&)7-E~D}_C|8|TW-1S!;9^q>G#3MH(oJxG9XI0-k2s9`S+Lv!UT_x|3`erDzRubU3O=a=4f;8_5$eEpAo z&-!upJk}e0+NspOI1`gqM6SH@vVeT#hEI2`z2fCB`knvwM{V1^;^i;8`E$2^{F67m z@cCC?dF3L@+J z6e3eLC0R-lUJhHAlegi;VLriWg$bm|DS~FE5S4+#sAXKbF!dNvtZABBhNd}ZRlos4 zSR5)0HfAlM)xVVlWJCfrRbT{qi7=HxHSq%hMjBMapNdc?WQw^g0oD)>q&BAz5qDQr zcZ(V?g*ec8bmlq9#D_)%!UC${a4({@UlY8CtM4I%B1$iftjJ6+nEB&kmZdQJ-X5nz zZrcyM^$pkW1RlKcAAR@x`0KB{7JF{^;I{Ao>D|W+G8^`$_r3b(Zv{YXyYN9gZzpDa z`0`i3_btmcL6pF!-|;8-rdL1XZJ#~my&p{IvjT#oMiN?JgPTzm z;_jAGpmPfeN2AihQVbji=_J*qBbYfHxGmC`;7xR0tssuD8Yg?!aYr#zfq?id*An*{Cy6TDpaC6T&Gbj+VB8+|kBWgn< zcjVO6yaZ>(V1$S|%-lSruj!s-l}bvrD$hJXfoN@b36d3(y9e=^6sC)GT?vok9U|N- zyhwfAT8<^9lo0EaOlvt?-?n59tKf-&CsZh{UAwQl=;I%``IXl`XKv^5hkf>aU-zyp zzxnImvkQCP{#~D%9JcKTe&!9=pM_8Tr(gX?fAX#Wwo0LgZu~90`rlrSw;wawY`Z_} zf%pF2cmA(E*MHaUr<;e4nX9Q&+pX=&+S=MN$6kHa<1*-60vZmKuG;5DuBDul z)cQZM@Md8{5{f26hg3b`t9{`E+@kB;qc{3QB$=5D4bYSWsW^+Pa6l8KDJV*!lhle9 z7eGBw#091ibRPkwL@5y+I5snru9ITg6_|UEE9B8xXW@h^i_|KmfEV*x=41&}s#t{e zJsL%jj431oR=??hbLK{x77XzOFV#o=nI8Pmp7-Bz$yZ$kaQVWE_Pzhcl@lKZ;DY5{ z1U`GmAK)afaRS))i$8b!b>Fc2#Gf8N=3~F%Q~PtG`*HWqtgNTCwb31S+`VuA%6L3( z+cF+^FCkbJ$vpEk>tUeSxikD1eNYlo6{36;gaY@ zBoIY7QhG`fG>403(&4e7dC1tfU=52!3eCpRfK7lXE))n=>7Ec{0`N=`)nXQIIHtVz&>thH+?F?pvHaX`$$u0v8JQYv<}O)zu>;SLi@w$1{cvyzA~ss7{I6{P}~ zI0YGQ?v|1$SfT}zLr8V7uMUEhu4v9lrPeK_Btfs44K?SdiW5~eGxkLiwNNOOGR4g{ z@64-A^2#!t*k*`h!Jz$dXB_YQg@5v^zfiTQpMAr%0I+=hKY#U|Z~5I<|2FuFSHJfd z;c(SO-}rNX^6C$QuejtJPcXnU(Z+y-5XFbMCU-C2W*o`MdqqXsa_disM zZQr?d^XA8gwlzOj$IROxr#zQO8xe2uSA?4;rA6!rL-hTNonR zA^}Rx@FhfZSTbvH6h)#zi4Nh;+;&Aox>87Fp_wJoKvEqR8=b7C&l zSgb>fMFmf+eO5#~XYBz;HFZ|J*4L_5^dAqYdR(c*YN8i8u`)5mh?xXKI*&w^W{~h0Rl5=;Tuq;#S>Cj~yfNtv!hym*8FM}D-MjDB+wNRiT6ob5uTIvEAQ0qWNF-nsUbC)4waJnN zXqm-Lo5s6w)`ZqH4a~j4z}cl@gDfT1j0@w=#B7+F9MVRiyQZWNXQ}2$0%o-C2=@XJV|dp= zB_cXEajA?-l$sP@Yh)+DwSlOhee1k&Ps|kh--y;$N2^Cx>vkIC2Orp%Q@ZcLeS05T z(IijcsZZ$VsD=Gg?@iZr`}ZHb>EYhLw=+LvlTqzH>BL}BMZAp#K^4lCY`8HNZtRR@rS zl$-?ByTZUi5>*$bQr0}29Gb&@O+<=$eFOzJEiE;9p~;b?BqRwT$EuNX>|z_5DGL41;%iOfQd|0wNfHjoLzAb2Q8v+@{=@4?S(R(5&$KsW^ja zlJ^tg5$@_~4PI$@f3Bzw*!XuDR?~T_~y4 zHf#0gvp0Y7qaXcblk+n!x?p+prhD$bS5=bAJ$K)`ym`|zF1nz}`J*5Gpk@OYSI^k17@8_ z?a{)DMjBy)gm94xRPR7om{j=42r~m<76dirKJ6oldGyY6(qo3;bAlp=zpA1KaQA~N zhppII+cw{O|HBtuu`&hGrLHTLf6h7kaTTFI64lD*sT%fz=U?@L=g(Bc z7rp4(7rkhf!g0+tS6*|?mB);5LPhQk-}H6!f2I&h!-xf-Nb)cW3=WALEpjt7k%nzh zT|9@AVw%L2Fikd8X<(aEBWNXTKvWC_lpXn~I55h;<; z0|_OO;z=kDlb|3+QjbyBjf6volq4xkrJ|3zM=-R;dipwxK$IxbBn^f^#JvOxyg?Kd zh&1Ciic>VqNgb4kDC0m23`Ed`M^vn#?5#r}0uL9ehcXp_ZUSi)K^t~H4h#)z#X7KI z(?r){;xP||1yNz@Ni%O%(O0TgSh00pZBBw{n99EY&B@KXaa&3mkGl)b-7y?A0957k zU%K;>i_ZPzO<&%1*4BIPfB2#c&OY~?v!38J=I3g%-K10z)SvL3_mbxkM@X7$A*P8i zLMQ|`gcT1DaUw(no&%tR6s3A3V5EIxEK77Env_+cN?~}ZF%SS0ksuUEX&@;R5wMi$ zfFd%IN4R-PDG=e_d6WnjvG9s*pfVPs1Y_j2UFlLIW48K;$}vbNx@I_Ks*sDG&2vU zXoR$Ft5S`oKH0}TYQHcuGoJ*zYjSBXi11_qL%)K_#_gat43%{P4F z^INxUyzAb*Teoc5bJzXPdG;lz@Vc6{M(dvN2$M|hNBUk8*@fp|0S4h2;=zD8P=tyI zjU-VZU~;Wx%bgD!W@4Z+6fRK2J3>>9Ji5U{R8wX|&HdLzC!?5)K(i!Dace}Z6NFO) z0kfdcig#9u(HVgdb{Z6_GCIUSOF=2VKyqU0sYoWm%|PJ=YYz+$sEUeNVIm}8 z=HU^U3^0^{B%x}inImA3@GvJ5AgQWqppoIGgayQ{b_}tp$D*?kVb0mDn`A%K(pq+2 zb0hkIMemfW?r@)Y1*0!^04HFLe-(rfpi+vhjmJw1L!gGSeRXZTxG>m#{;tn_?zXL4 zHts)i*v#8fn*6viP3PxoemkcGLiLGHq6kzTWrW0FRW?*IV(8v^jNpavtQsEZxbBsz#Bh_%I| zC8#-x(A^Loq_XyS1QBdIqlYR~bA&5}>aeOs0z{Y@dzGygam+eWg6na}CxscGLB1u5;*34`APL+Xu-gYPxYbOYSl}=&q5e^Sfyh;v_h^WD$Hjru$ zuc&R0`ztI%%mXS4!YnFGMXAZ%HHD#v6OK52Jhb=FxN_0kf9SP)4~?Iq zi!N?lJhHm><=gMQ=z?7lQTgY{(X~(CeCzYCy<*$;Lk+>1J>$yaba9qKHQ6ENk{yP!W|BsuI3P87AAHwy9S2SZ7}Q*okPiQs^<% zywa(|AdhxmQ{PWC9&VP!o_~K_hQ5WB1rc|sIDo6oDRY*8s zmKE-3lBzPo!wXP^%o0j0YP%s**$FMFX9+SfJkdqMMch0$S>WL|ZY_Wo6isFx;i!N% zQ6$r$t(C60DpOLlAO)&!9ue)h%fo>tR>(CW;2{XYYtFX^o2(3}K&JqO*)2?(QVJQO zsV&yEJ{UN`;x0i@YaVqVs8XBgg?s<{Vqe`e=^x=R6H$1$7gTpW$q;wAhet=rwF_l$ z)VhNbL63?IBsF8(-2m)bBflqiBE$f~3dlncr%LS^fgHMh`+vLMkU zT}Wciaq)2=6K>%q9u|qlCPU1+wsa&jm_(0`i&>b50SFc=!Uh7jD8&MyNh|{9wP{cz z(llzN4KLa>5>oL#loCMdb5to5t6)E2;pPFC)ENqb;UX#(1XZA_0L;uC#X6}4-qnxS zgD^_<)+G|*r1Uu3fKc5-Bom!aoEIR-P|dZ`gNRy`@bD-Bsa1lQRQX3#U37gH#(oXV zlBNHO(K+XwB_f~u!tEFDKIfU2TyQFe9g) z8t@Mb2H{o)IUB-(K5vHwM3Uq*kzfdgD$xIzy?>3`ExXFYz~`BB?fso9Ne&VqB;$)D zEG*eF4j9J?B8e2zP%^$|kRAhjSndRM4-$8QQW~XeX#?+ z5lW;T)G@Lh<3Iq}QUj98c8qQafvW19@7-(8=jk77f2XQM>58g~GBvBlIPbUL+j{q2 zYp=EDd@l61Z^xXlGxDejoR%xHh@gBeEjyEq;95@-c5C+RHdCb5fJ3&CVFp_UFd~De zZ0b@mRdu^sWaJue4ASm39GNYv>CDIx!Q+@l-ndJyf8a;Z36F>;oHNm9)L-aVTD;(e zpYwtje&)PZAAPQ#^z$}sMXurzML_Cq1|kSMNVm3aqg>1dU6Hy6PS|z{ z%he#D5j>hpA9Vo1(Vl~ugV)539xq13vh7eWNBVBlCI=Ct*ODk=3R_T!HbX$5yOWF9 z6eBv(JHrs{TibRt#ZdZsPPJuRq~#*CxomF{6au|%gWOt{7mtqXN-Va*8iA$-1vs%v zKw1MEgy@oO%3fR{fU-ws6SF0t1V_r2*T$?)O?t2YZn6rGVy)s|Xqf3|JU#}U_Q{Ar z^jRjCBZ5viBiy=-Oc>iX8V3+?l0?9agX_(dd&4SvbhV3+kW^SD*eTNR2u5qWmAmL= z69+;XNg}#Mc*}%Q-DH&Q(!NDmdt|lRF$3A?jC~CG(%m^SBL=;X9r8#@sumoQAH2*O zc{I_6x-$SuZU}Of8Mw8j++0asRyp(dIwN%2r5|oV1nCX%b-UFk2z(HhLvufM7 z*%eHi4PnvEk1QPyMrIdTLtDd)V9Rwf?rxN{@zF@rrGmd6Jk@>kX%LS-S5N+V8_Tk- zx{_fp%B2nT+6EP`w#}N;lgX94YpadxZd@OG)Sk+nB&s@z9J!PP%p`D?Jm$PLGB`J7 zAad+enpGQ7Fe2Q%b3JWDvfb7~*Gckhj_iyW40h*+TO$H3-)=>>3kUMqf`X^!?s0ul zgHmP;kchQ@Tb@SA1dxNGGS12uh+Y7_YetNH&-V0kl0>Ny+}HBWY!d|40=RA4f+(y> zY574i&?+F*lxd?};U(u|%i_4X_P!~~o>-rCd?g*8nS?(1cME76K!Q0bb>Hm45bBj_5EI_N3r$S2v?JIx-TmGm)GVn_(e>ZK{??;<`n2 z1cDvs&kBXzrOIb+>Qf|50!i`f!#=?>UHd1Ca3NjiPi-=FM zdkvWzI|td;qeZZ2!ua2Qem->lq&rSMU4wUZl%M4DHq^as+fkm!WgmN2XF3Bp62cbI zmq{S@EfbcO7D244PIxfj7LX&ukl9BcDk5f8Cf)N{&$=3ceWZlLv!)ee7LSr3Mg}5f zP~|!Ds*^!(gBv1aPs}9u z2nIK|1t2&;=_L5CM1pRFupSvfr!neju>MSZf?$BS**`w%=WQgiTN$yEaLkx}3=Zl> zOd-<=!>YM~!{LZcibO2gccK}WV-lbRVA|8imO~L4S8}#--A<#+K%}{m5q`K~x#~bf zf?Hk@U@YJH1Q2Xkgtsy7*_hE#1DoN@NJTIrG&q*akil}VQhzMg5ws>7o|<_t6PLPBDRX<1+dBj2##{ww!>!e zxWOZ=wEJVs9ZY}}7WVF$mE0!|;gK=)N-H+7D@BkzRtc^m?b;hByzZVO&!7Lw$qITd+n-*Nl;mKl5uym;#4NS zS<^jAK4Ee0NPd*8&#%Jx%m4k~{-`5=_;-KBM;$rSm%OP-Ke^{^^gyVF#DK}joiSj_ zv=o7>#B^-Ltt~?pzTRi;G=Y7LjZjzIuHMVON=6LFj8S{Grn^~}k=xEX<~`iUmRp2c zuBeXAg2z=5IM%JBA|dWMY=^kTy^0!K?vGmz%Hmd6+|(6&kC?Z%*d1eRZ4c(eG7iI` zY2+50yCY@CHrPGkkPzGpvs+b2LIH=+D7zfs2D4SEVCc}%GZ$^USh7rr>=Gl&35N;O zh&V1lhP=ee_l6_vYa+lDRLg=0SiB*^XEyv1fX~?hL>lqBW#ak090q-Dn?L*Bf%S}er#dvOI)retK69O zFh4e#&QSANRr)JXd?zkqy~T)WCUzo<^jh@jt#M~lXNDwE%%X7 zW6oI)00kcnb1ZOB%Q3Pp-4V08)j4u%LduA#at^7JDWm1tO#;DgOv~;hg9>}gIBi(h zluH4zgchW8g0ZbNk4DzY14?7tN?ldJf_X2Y;#02ShVF1zpqRuX#5~|R_r3PZUin$) zHT(E>lKw<5_;lhuKk+Sp^SyZ47k}F~JpU6m;E9O8^HU$s?~ykrZ9RU}d3!Qq3}}(n zT5AQj!A&YDgcw9GH98L0hTcbP5j~G!%0*c2ZHz7(?Tl(HyU4YC3Jj~~)UB&s?j-xH z$RkDqScFqA(-UGA=(NJjSjytLlI$uo9L$j@11*`uUR*Nf$ce`Y$6G5OI*xs_lRB+b0DPf+HNt|PS&#EnjNQs zU)!{3F4wMDh=(;;7OeFKX8NdDegu4!9{MAXAAZ~S{O||<)vx-4F9F{D6W{XppZ!gL z=q1m?!*BbZAHM$s0D$j)%l&xaANdns^o8d;Kk$8j`p140z{|h*+rH}gzz4qXPyfvG zzx>(v|L}VOe97USz0;1kHYsf!Le(~+ zW^W@iS=}*GNUhom5N?Juwis#4C?Fz|3|RyvM?j#61EI#{(!(6-E-`ycun@4S%K+W- z#a%rvjYAG%T3u3H9W^b<-jE}CZOua**=(_qS z%U}AO`+xcafAGc6|M?F+^!YFSg6A1O^@Bfr|7U;kw|ym3y`LF%5m%r=pe#c*a z_c#5ampl*nsUQ3?{NAtnwwFBow(t4zxBdL{U-?`B58nTw-}G(Y_(gd4PkhVY_=(^8 zjduqd0Q}Ss{@D9p`Q_jCrO(2fTKN)Xo)FAl~=8EaT%^Jb4n3G)nYUheLXuPN^OxD3ne#J zj}C7jf^96>)iwf-V8b?A@LJ+!)D3=ATGCou*F5#WK-P8x=Nws*ht!!Lg2bKn1u-hm%|$6MA`>PtRsK3BkVUh_LYmoQ%P{4c?~f9}Kn&5!Jz z-v5u@@tiMu?Y-x-fAih%{P2rkiHF{g2l2dD{$IcGS@`gK{``0U#7}?YZ~Hs-kz)>6vANS*h+F8gqRVITl=k6C%w_(qMd^yb1XM6H_59pECmI* zVvNy%lUKHYf)b97;y%gX{|=yqgoIp#dG%W4>5WR*ylx}~GsO@`>1 zM2u|savWEYT!P@_(VZjPU6RCVGtdO4-F6V6VXOI+7-A2oUOi9+VyXy>AbufLiW5S8+S?~lr8s)z6*u0G|8&-}brh`@o0s(&qxe^MBI|e)4DD|DoqS^!zV){s-RnalY~Hk@tV! zcfQ+z-~E%{^7o(pP2c#H&%1l%V|36z{ME1iJ3sx40RHm#|IkM@^06c8k!*tSBn}{8 z^j0;uVGK-UWp3S-tXO7M0Bi;_ID}yBTSQ>bt*VL6h(;*5gEE!`135Gi!=Bo<%n{Mu zK7d>HVG2Y>0*;_ttr@vAI)c%3cDp1~QnYo5hL$MrJeYeVG&08wNJq|Nj5bra%7H-D zR3CE=@z#OaQ{C!p29k`(E_F474Yk4;gXklP3oK>~nbB;AQsm_#5}I?X8;|ruThiRX zWF1IPcgy6i?!Yi*7b74Bdd^F7>uGYKPH%>ar5mE&W4grZDCSb`HfZBR?|R=q|J)Zm z&(D6|7vg{V>4)%zU+`Shc)@RZ*^mFX|KNjP_Lb)=f9@Z?`$s?b1>g8tw4d|2pZnlX zzU%gv{f@hvjWEt5ANpVJzU=PzzTmgK?8kp-z5YEPc+`jd_}kz8MK66Z@CzUK$qzpJ z)t^N>4EVX9_X@xNALH3C`>c5X*~rKJ#1#c*NCJFr{@T^ZIfzbBsA8#&%8b^V+^&R-nMr0}J{lE_G@<(2@XEFiOU(ArtI5TVYZ$ z&}bWXjt1Ah1p&4=+n1iR3&fJ;>Ioa2)J0{txov_In08+75OGAF=$qJ6#-(bD?I@2x zWZ1(RPPcWL72`_kW6qVmlpRU6Mn<*0Y|UEW@`2rTvqa;KEz$`lx{FSD)GV|Tm5TyP zJouLHe#=_`;5qlb_QjtA<9W~iv9~>R-&%12zxgX)dEfuzZQuH5007_pmbc)Af8-lp z{5ddi@0Y*krEmZ4AO6<20eImb`G(*2g%I(a&->7if9s!l@R3h@RQ%?z{O$kv&#c!! z=f2new(~>2_P2lEpLxr-0sy|`_kQJXhJhvLb??hR`+fg!e9@QVp;PYY@xKv#gafd*&83|ToM>_Nux)jn8uY9HK4A`fxuP;+*J=pwY; z>A4_kHWeTkDbf;wpal|WE?X}FU}owlF6vZpq4BD*$;l?Kl|%{@$GN_iT~=q{3~k(C+jt@`PaYU8@}mlzx6Nu>-YV-7hL@R z`Cs1kTYuf>-l@mGY#;hx{@!=~)C<1xYhV1?k2(DQ@B1_Fe*SC!wY%x>$BR$qHBYm6 z_xnEh2Y=T~9xMX*_~-43h|#lwHp?2;V&s?`lgzPl9K{$$kC9TX+(#|2T*BRUUv1mM z(d3fcYF=&o5_w;0a=8qBM(!LAZX<)Xl-72&PgQIwJ4r?o+3s!;wCscw>5MD-=p{T~ zmkvN%Y#1eMkr|cJ&#aUfm2EB1l&E& z?eyWdeb3w8^1`^nsd{{@0QJo;RH?DO_S#i%;QhCo=WoTwOKtgXz_ zB5{TSklb>H7BL98;cX%=M=@d0R7U0q7~9fOC4^Oh$Ex(-v#-5BGB>vzC%|XU8Y>%U z0dAVi$Y>AwVim8i0F0PRw_v%!s&#RcCKFo(GpgOhF`EuBT0|mmZO42#g1N1UfC04C zGslq7o+EM!S|gOK004jhNklgzVtWz8r+PUkA2>rs2CX;5Xe|g+n9``ZM8BoV727PoU?Pp zvVUEc@nPCpqG%-73N*|<%lUA!s|*Glpeu4HLrLyq3yjXAfj&QPr=f6_6o%tax6_pE7!&g~$NV@9BXjUjiA0h|i+nb|DB5mD8-Z9S*848tmz^Jd0b2|0^? zBta(wDZczSd>+7ezxU^!>Mr^#Jzn}7{-rPdg3p-%p+H{0I;WnO{l+Kzyp0?)Lm8WW z2inPmoVfRD?^fB{)qW+d9l0`cG1socaV#ku?*VMMebg2a#GprDjIa*+R-}oX6A=fu zxaVqIZ4Ofs<7hF2J+?NAT~VQoFwKaKsacn?MTW=71mS2FJ1(IaXbvG&sJ;XfGHD^} zx_7!H#!$gb0NCgwaGYjZ8N2dl08NQhdkJmnE)73bH>^)Q^}-poZ|&}l+ehE%?FNtzwy}}ulV)Pf5oqV{=M5X zl%Y=$)$Hb7DefovybS=|0UX5D*s%PCt)5lO5~51WXDWkr93!LA&Ln8K?Uv@$h~!eV zhCy`CAcYBVb}_k)ov?9%Be)B+81y(NEZLND3QK0123fc2QqjRb>6=t zVGm0sTeCru2OS(Ox3tWbrpz&5v>sBZT=#Lt(GX-jtI%sGnt}AA6@tC z_pD;jnn+fQEg-N=VV8+&WY`TZdifHSyQu;Kr$y|eyuN?!XN`aQqyOZEuXy1{?!D#n zRZk*Vtfx?A$2FHQeI`yH9JPa3l+*^9#Y2`L~?KhV`Na2 z$70=eJ0dcwfh_k`1g@@#;=Zlo?1IBFk~=|5ZVT0LV+|o|xt)S{sXx&2!h>Nl$C!s; zMW9?u{<<+0LFGK;B=Z!Q3X-I~gjU34BGs020YcY;5b!c&TK=#R!)`LHpWj18^o{c}VIM;agI_6&!|a&1!fUah5oJ?tXovzc{vi-hSwx{M~mRmy6U- zb>Dm@K5>iyZ4K@@6oBRoCnYw7UpbQOxSHblEjf0NQeyuBXdz)0nt=MjBT?GdTd*J8ZZ)w+e)l+M1r;$Oa$BpEoG+q^j~?DY7=>rmK)o4@3Wq>ZF_g=Q+NG-CZ7BlBSi;& z9lk{#K<4WTifcggC^UX+JrgTy72b%G=ji@cr*+fO1^@|pOwW9*5D)C{tLj5HZZGZSn>RTX;> zs;bOfW#EXA<@TODt2ZN6I?IbvfK-pXHMS1)Hnxa4hDSsq&Y{8W=sqgjqhYgZ7)%9qarj0-LkFO8fLIt0GzbUWyJ|L*lmfq zvD&M^WuuOYVRBWHv<$bFg%{fjLOol|Tw0AJ+Js_zxhM|(^K6go{3K_Mu6$L?W9KpnFqY1WLIPkN9^*t=9#%A)Fc`-kqJS_2x#kx zh)a74nc3E0m~$EbcB^;~kcazf0MM+y-3qI%rCu!sYA8hXh)^pLX)tP#p&CfVm^OW3 z07`~R1v)jVjJzHhRv;G3?w&rxfFrbVRh)8zMNdN>ku4O($RKU?9LbA3gPWwWO?V@0 z)tt4B9b~(ge_g8sz_t~zi6eIC2#72(B`!2ATV2P-d(^I}2-tTwImV;emH>c1|0n;z zQ{5|`iBBQM$h2!&a+4Zkz{6_9QlhRdb7;99*Q~`M9bvc!gGL6)5n+KVr@Np~O9BCQ zz@&}YMUGHIg;tEQ;b=D8MMNS9iW@m}qXWEeoAMYL8DYU@nBjD+T(lP+E;encOHode zu3apkZ453N#c7;SQDuBC-&md8%W@*1b58+_x*+HG4UKtD6i4tNNZ1 zL4duWxpsz>M9YzRsJv}GFH73eh+H zLInx4dd5gHw(yADH>NnYl+@U&Cfp;FpsKMfRL$Iw={;dMmik~s&v|{!#_Hm>xm*~QVf_-7%)DF< zK>&}V#)#^fNtieKh~OzLPPJo@j2y6=Qbf3=)0w?%Y7oH?LLEji((W_)76JAmImo`z zr9Z7a{0L|HnRxoe2rI{?7F-c2cuNK(_nxVUo|OrLEp20q^hj*Ut9`KNwk%T^ATk8_ zYDSqSf(>2DeeYlfblnw}6 z?&{0(3fC$2+(3dRF-8PC6DMB;%*f@k8uC3kDzpU%IJRPqjAU3QV-;Q84KK$Cs&T~- zL+Y_?AKMtC$aZuSt*+koK!!j8t%btmlKIeC(NSblyV!e1k9{6xq?%gvZJV^+wpu2f z8L}*PYm96+dFmdh84*YX7)+^_oA<~O5kR{oX-!qOj>~22j@WL@*%gqTb}!Ay!4RUB z;-bU|VEJ{eA+R>jTpg*7!e6`Y@`^mUtFTc0D{R3Do-~Ohq77$RN2D@ z2LuLOt7w{}#6+lrc1A8C!W;V_7y+PsCvvoUWDG`I4vieM?9v#yl)k&W5dwRmU9E*> zE;UyXG+G)Fvx-Lr0~vYrTI-3#^4%i2T!XtyP-7S_)v9c^ogiW?*NOGgmNJF~z@;OT z%YT*;8R#w|ysWr{ksK*Rvq$@Uw&bO%5KEoHRNW9O?@FmZV%zmhJk27u(6-O3Te=Ev zSb_;V_rdHfy=Cuv-m^2tvEN!ymkrt%$yt#aAdj7QI1D;+CpVCH=AER2y+z%+ifw3w z#N*(d)@6%Jc+PI@P|T}sjNBu4Y$LeMGBgIqln?u2ltYbq=s0vt*Kw(NtSO}mLe})P z=EdWXH|2bn@7uobY3?HiJwnO5Vl(hb5PPa7qqn|+kBK+D z^{MWXpV4^W&95Q(nm0f2#C=61pEcqt9NQL*A}))3E@?z2Hz?d0io~Ea*wF{fj4g9Z zY~&W>))-snSlNlL%QkY51jiV*PNsm7u>%{iCpQ9tTY=4vZXZ=8$yWtT-JZC}QFF}d z%beG9UTRiVwWoQRx}N6-y{f7#x#YHQ5NH=-Mj{eGF%F;VyjTKS;HqGCx#cBW4|r$n z$=wYgdI~L6qdV=8bj*m6xyq>6$5lq2@7S-+&Bq2V*sZiI-t%4eJr!+uqT;P@Aio~p{6zn#7}+CCng$i@jNpijrGthb zBN2m{a0bSROhf=~NNcY&r>dL5k#TF})!4S+mbpc&i&NbQhTYRP+X-+R%g)#(9PR7! zMZDeDWw!TOIlB)ZNA;ANY-7qt_jEMJ(XRHKbsWd+p6%)-RW&4qfKJ!2hPY;=wbI&F zhVJMxjWCEQb+;qQ&1O|g3!zh`T1LaLxTF{j$)}Nc+f29@$nG+IDP447L}u_tlEj>+ zcs2~{dd_nhw?vXp*78#^h8}q5{dmO}yy$VBc=Kx>nUNlN^J^Ztldl{5W2US}Pi1d- zD;{|BYhLr_2kstx)Ew|Q@BJkc#d_b((;xrY$Nj*Yc-0&2ANab*`E8%s2!^e->)@7S z-}baYWhQCBTjbcB8${*4F%!&Nd+fu>CZ^dYOX@DG367B?BZGPVx?F&UF@iy)$v`@? zk=2+Jb*;XA^zA#kJ&%Wvx^5rx?4=4CLQLr*RU6=OS=I??01?~Rt9o_Eu3q>9Sed~f znX&9pZP`c7g`pVRu$F{X%VI==wsJT^fLb#)$3BWnmj?|T?xo2RvC2D4Fc~*sJ+$4% z0telcvs}HXOG`fek!tE<>OI1^e4?-RFNp`<^>*C%vQN;<9(eQDzwSoC3U7VG*W=IM z%vo>x_D4p?>wjq7E#LSm0J#5kFaGwIy=T1)uY2+8-jDy@2i|%AefQmW|6l#v>(94- z|C{c+?>@Z!U7y6WAG0w}W(0Vz5C&p!Y#MtJ0V5JQxNo@)2CyZQ%wXo&_W_GEPxwBT zC@1OQjdlFUb?aVvs*KPQ6CoYFbiQV5iW70&zAj!*Ur%4=R)X0GfT`MMb<0y;IMi-$ z`?iEUEYIqrD>5ZX;zC16c1wqJEniEAwcM8tF_?2s*vn~4t)MdyUJ|{h0Xa#bgRwJt z)Ae&~Bo-CXb`X$ml5Hi^2niCZ)#a|mZWugun!;Yb-|O@4Drfu(n}it6Bt z*Wdj4syE);*kAM&UvuC6?|k56yzTWrbiVFIU-!+gKfCkwP4|7xSA50G z9y=aB=ChwxV?M(X!4VD`B|Brz@=0P)kQ;MgYN49p%2-4Yx;0hX_QRI(1Z*c()C~r8;Y=kCk$IvKMj>{O!Mb z|Hoa%eg7L?{r2yA&sv(TSVQVl&OY4tvKM`<_df8>`|o?%i_TH<=I?*g>%aNyUi6|b zc*Qw!ecWe1&BlC&BW?(nBx!kVim39m}O^j zjIm)0UUlbj;3yo00Z%|iAG1nbQ!uKkX04w$_Gq=FWiM-Sj1%0pW`&4B3hW5Sh}_Z?b7b!15^qRI z5?Wq`rgkq6uLUaa(y`Kpu;8{@*2+~7<#sXy_M;YZiw_u2ffv_X|J>{DfBiRqoc;Ej z-t_kG`tu+2`M3VLk9XsL)2q)Ezyojo_BY-4HDB?fkMZ6I-u3pilzi1!zyAK$z3xqq zofJR*v!8Thp3n$D5ey)fUUtR^CYg*d04>m11TrHdA`x3=j4`lpzS=wjgCioe)><$l z)aa&~b5c%oTpD){-@fQ}>CVx2%6Hn}AfsDH)!}9i2fDk}C0ks4zJhYwS{5|+VG~^N zfJnxz{R)F!4LKPw+l(9WHzrp~P<;@LQ_vWJO%HSn2qckboQ! zxl2>@Rrz4}J4HU%Wo_73a3-ao>ARGXP%o z)vw3RvhqdeTJ7UM`w1Gel6NnD-Tk=#buWJ6szdxQ|Kxv~$#4f585zUwI(>`RiXU5m zkv@r;Gcq#ws+mC$w1ZjIBct6@7-NhK3o;+Rp0mqIkeqVFWtJIcUTT6Nb+=+0$dpX` zm}Nvs5CC3OnMvfF$0CAfjFmD-a3#P9A{l_Hr;TkyQ9eMmZY+w)%zbg`BrV{=%Gs&4 z)`7Ocv<(zNI0Q2~BhZAkZQ+hw#z#TRF!vmWTfK?_HLIuqN2a?WC8HKnR<$wS`*RO} z&;R)UeCIp<(O>*;{@UFu@o#^{zxKNS)7O95AO4S?6tcrx-@tEw*?S%@<@?q*@cX~o zk6yfe%JIOPU-RO3e)BKyGoC&%PVI}cK<=}czZ|Hbwa#0~-z9M^2#%V!!A+Hf+s7Ei z+-7?&4vnA|6D0_~ltyGGF|LkzFgLYk*HXtxorIz;Z!u)4;aoo0UZ_x&<(WCEk8K-h z)WV!a8j!W;<{P7?Bu^k-Qd;{u7J|#?*tQFFFx_5g9mB0jnn=Tdf`FP9;6cL8*xVr@ zQEo>t5C}-UG*dw~79&+lOmY1LEUo$oSd8I_qfW8Sh_!*q((=*11Bt3G_4Om?{ zMg)nqXwg~T30B+7q+V0VZI51?WW-S%A(@A4usmaeJFGzLVB4&6^_Q+w3a4Gp}F|CSbSMI!%H_})=g^<GRF0By$u05Yi0~L=%G$3#D3|AGp_)dGZF5lMcy4f zkLZf}NiD6u>WzNYr~1q%9WVO2ANW;-mmTMxb}`Q|DSjEvI4Dv(^ZJ(Bto|{ZZWJ@AlmA_@hiTo#JEn&GkPOW!x%6k zGJL}CbA(O1s@qu91a{z*W5kkRS7cfmF=)2d_5y8o(}rXn9ofqyVHQpGau=0uw9_bu ztjM@N=9>ISiaK9IpnHMJKrRVit4(DNwSprkbu**7Wk)WL2?6MGB&1$$SELxD-G-A1 zn89QA7|aM+pw*4Epya8fAb61769~dNXn{eq;Smh*fCnfGZOXxg42owP)ji-@8iBAc z7GvA2Xxu27@`mnkvX2bl>;JRA_Eh(ZXW~VV$*b))T zj3=a4&xsttQ`tS10uD)8RvXNrj4ZKB0ErP>bTz0`-4U^G8<%*Zt?o#kQ&{)<`3xk0 zKt?Xoxn(7~!5Bd=xgTK!4`wCNy#?s*jp35qHwX9{54UF7yvp5SQA_@XiAeW4&U|Q0-wID$EEQMBOmdJ=~ zn@Kt>1tZC2UhlOzajfAKjGJD)EKd!rnNce}B1|IzRM*nWC#H?#!j)mmlrSV(ciLNI z+gDm=Q;v+lz+H#kI2UtEs%8E5cfR-fsqPrh#3vgg6YC0AH6sOVi&jk#AsIlc!3-wB zR+~n~aui06qea55Qn#FAOT?vdl>%9!?BZh=XGYAanxFLYr(CK#PSms-6oXn#c4wyhjw0i8JmDvy@PnbfvmyY%_ zv1Fb?BrBh0;84-G0_9M~RrjP3ncWi%$fnUnDq|BSIgmBwFe7MS_KkzoX?*?+_4{cY zBR$#}BeXQ5(qr3i-@Y{9L=kg#dM`B-*YiR$kkPbLzGMsvh0B4kG8olUN+>|z2th>{ za~@10Ag=G~aHzDjc_YFO%Z!6#%vqU3uGYNTHUR2bHd7)vXD%GK@|ZL7+ET=*hRiLu z<2WK18FLowj69CZes$H=MLz7;G5tVIl&V!L) zO08;~hHnu>W=cAxOi}K&A4wT-L=KxRcOQUkm6Ys}yXHKOX24Z4mUM5!x$knBkY_|J z0akMW&Mp`mgYCneSO6eLAaYdIvIvM=^Av8RuJ7*u(Ku$ez%^GVchlh`VN196t0iA) zdyEn57s9}D$h%QZAOQR;zvVZ62CwcP{>tC}RClmXKmPI${`k|P{UZVlMR0b9Q=;I7 z6)+r;OO9~ytKpSiM!NzDOm^DC?yRt*yCczV^@Plm(+7}@v5=(QLPT{%4n1Nmf<Jy#N1SSM3>oTLE)KH}oVLe`@G2w`R4?1p+Q#1MWp_Eo!1-I8 zSR|u%uvEcVmeH<*TpPJw%S)2#&XHWNwebI0Fhpw4{_2-0V}$-EKRS*6;61y7L0LhS9h-OMCNRb%tN(|BEaOyS`(SJyPZi{ zuFkk+ch$_WBTmE-Y;ok^GH3`^A9?x(i9kolqUo+}q=kuX*4noZ$xyl`U=lOv_Nn=0 zBe*_9>Xt!)j!4OJhdk#D#uEFUH95AR)n#c!ATiaOcU6X?am`JE-D~4@!%75BUzA6A zy`TTS{ee5b%@xn;a^W19XOH%7}J!d?ny0cr_}U(k z$T-L?N7gI^ZMYFmN$MVB!SK{}mooFvTC*7~FhsA-!HsOM?z*7g^k_;LSNoEB!!npB zm~53#iwTU_q_PXZQt7ss0nj%y&j204#Xx|^B0l);cas)ZI&yLR+K51xBGKIuKIYtG zA-f^Ta0ZtdL@-1dRyCH!;$Ue;=0f2o?P+-y0JfD>oA=AzOWBQ2aO2# zXxCzv>(1o_5P%FM(>c32Ws@q>p*YBd7@*h8Y`eWgW*z*s)Lz#_Y-r0BDavxq>iy=`Ya3He*5tLPrKsnm{v$ zn>JVB)rvNf9T{x_R5#!p;iY=&-6msZlDK7Ga84|yQRR%V4byg?e#k4GaKOAGu_SzwN8II*oL|yLhf8@ zcmds+Q>sdR@KBYh%Rdr=V4MI=Hb>5`X!BS*%fqXwf2j!S~XAd{@M znGCS1K*r)JNn*%~u>&hhc{6T)d9w7s?z6Xl`8VEknp-~MT@b*J{D1$4m;U~L8-MNZ z{)0dHFaORb<}04K_S?X3{rBGd7k=-r1%CFg{>NYUAN|=c`#b-^r~fO)80iwg2)5j+ z**0?a5(ix-hXLf0YlNxxHe#xlO<9!pXd)Lc5DKXg8adixq@-A7o*?aZ zFUQr0WeVX4xw~%^d@_ie9L=ZA82bF@j^Fm{ZdE-_{`ZL*LO=Glzy1ZU{+{2DpZ*Wu z_V@qTm;NhH$ag$(?LS?lB?B+~U9Ws8e)xa;XZq65|8zfYbQuB-MJ!$1X;+t+vpuVc zC^b&YEE*gm+`Z+fE|{w$M{K0W@)otFw!BzA7)g$nrY ze5T)S+!UAQ0s9o~aJAHqSjIkDnAFVJa?Dvia~qb;2oqKS%E*9o(I+IJjKKgSG%JWe zPz13L%4<~UM$taP2taCr+csoDintZ9Z~;cw&V9;4cdl|U-0HjQHtHNTMBJz|ewqup z7k*a$mS4M9J-#>i6EuW=;k`L$2Pw>)9(KNF*p zfuH?*Km60b<(2>O3*}F{0(Fudx-7(0U%Hn_k41^qtxi*n2nsyYVk3sSgNrOKTSQ7- zHTSD40J2x+O9adj45S4LxkUzNDel7Bbe8H#y5^ZtMpQRr1d34i0Xcv{mfbz~Eis$q zoX5s1sdGfNyIK%r@?0$0=qGh!kdPAM~IH=*Sqv}}{YZpIvA zLx($BcK}2rV+k;J@SaGurWJ!5qBF3Jh6shDtzb%MbCu54*}qxHoyFBpHJk8)e<@z} zf>GTc>jnMkcZ`o6@B8b2@o&HM-}=rMwDCK??4|$35C6~q?5ltO6EudNkoLne{_%JJ zA7B05>(7_|@o#v+FXxK}*hd|VA+sGBw=Ne!v(S^F+**Pt)wp%5dl8B>bzz8OLl2k6 z)^4Asz6}PaYD7}n$jnWRR?BnSwgo?1-ayD>yIKZeagrc%P(oL@(>i%Z?9e1*U{Azw z*{s9h9-!2w#)ySZu$kL%1dOhk!GN!}{r0>)V(Cnd0Iv3IYs*_f0xBK09E=QPtW=N< z%mRBGDYcq`h%o>M97|f!#3&{Pw%KY<^BVKY5t&zYvrDs7C5AHlR5LwwbFcs!pK4v` z`Oo1?pC2D*{NRbXi~sCDeCs=2@^60g^DW^8U;J;p{4c%r@BQ=N_Xl728ULOqs{N~K z`0_vU7ryg%|5^a}U;pe^e&aXkKmX4^?Vm7gzB0Pi{E2An4a)%&)WdUdA=ua}nKmivVHsO3C)4F)o^*NV{8$S|k- z(nThN)w9*4wtefvmWi>P$j7VPdeu#J?Fa3i`xKn_|>rqN`Ku_%D;$d(5w8DO=r zN<)k#me*2gWOilO{N(8XKn857yp7FW054U` zVbVF&i`JcjXP-2HH4GqkizG{fiO7bQqxbAPs{^adF(5K#o_;+DQf`(c#aKqL0x6l@ zB*)0re^u9ZcPny?*w%`5;dE9mBQi)^I(r$Nb`WkM9Q1;NWiD}#RRK~4bBiT9A34T$Z&lA~G69zAB#STJ z=1F!n1F|x5YN_rM9sVz1C2f ztAt}q)6S&2L0X95?78QrQ~04*aVYbwK&{z-2|d;H*|htOxby8kc#d*AyvKKf(7_&@l+e=p9I&}TTF7<9r5 ze$W5qdw;!=T(-e%O z%3QMUz2xRwTUQ8^neNDx+m^ZQfaSiv+!4d-#KJ_ z&6=@oj;&jJj+THDn>l7}JKF{##>ngAh_TOkiBmeO5N^p8$P<1Iy2&ulY@85U$nt2E z2QICkXu~02@B2O*1RWRlfWnF;dk=tXOL>>{&Ck3=%G06?KHb|tmLSipmcwYlo+6M) zb*nKlk1Dw%M=}fyqNQaenaPvANiaA_1_*aq0{|@XT$&*wW(#J-sCh_s2;-tM;pLmc zMkHk~CHMr7QpAWHJ!eD+i&kVtXm(36mT05pBBSRr>t1{~LajEsr_zlK490>>H0)C3 zB524c3$;LThD9RAU~A=6+;U{bS!+`FNkpyL;2Mr=%2l9g+!ovCS4kIqy0?EgY$0OfVvhx{JRnui$iZM8y@Y8K1D`L$193+TM3fNMvNNVUQ6^VB7B2 z7-56U1hUE&KxhdREda^PxCeF)>oC1FFE<7ncUSmi1mLxVyStG4`S-r#Gj(-;`Y1}o7+|byL%N(mi*$Pz;y``t(!f&)O9S9o}i3DETf^4 z%tX~O#)y5llwj9kM&?dt>)MLo*3uYbiG3{{E+$;P)Q>YZtEU^*NeT>t40z7&u5H_L zge3)`(@b3Owr$6}vv!GVGL$M4i|R*mp%a$1%VX4gh_C!tUjCW7v_JR{-tq7M?k`@C zpAMvfkB%RI=ge*`Y|+?8MhSs)oF${|x=TM5s3ZSJ|*fJ(D3j9VuaO>IzC#2^@`R&+Z!=p%2; zOVexNXe~!dU}PFpFZsKMor!g)IOehK`;uyKx4SiR@qQ>TH3UErxvDzVbFs9yB^SI{ z;npJCE&T?&O`jrg5@6=IwcqPD16l%Mo*^xpOFGi05d9++qH`8{Mw|ZW7XwYB5W3p) za@fus3=2?k%|<7sHfC1YsIMO5zeY0cIZyu9=Z-TUf=+yWS)LXKaydx7u5V z3fsQlxInP2NY=GUBG>S6#&+nST~$jYvem)0oeN1)gOai5SOyeUS5-3YxsSo#)ED7; zbd1QpsYIWr|55gKpG-#XnfMhLW6Qx)6>(XAKrWc2xQg9S?=6lz+#}Re<%!s$w~@07 zc8;yv8(Bw6s6Ff0#_pCxw#MZWh=V45dtk`SJ)#E*p&F2!V?*7k zj>u>pB&(bln+RaeY9EY%s)%aD$gt%uM{*{E9S!BJP@z@X35TiN3{&vgxqI%6g?f+Z%?}z&c%UKkXOkz4>Mv6gA_BZv$SDv5pg+YX(CdH80-$P;48Vs>3Oy2K&zk|nLTH6Tgs{A7RzQe&~kUR z2?WdrBZj-&Zm$Wf!39RbVxDSY%F`rgSG0fxLIM~|)N~~wN^O%790|Bp-7}dmT7}@2 zDSM^z#x~r?f-WU;OLw=_BR4!EmtwEVukVqMbIrEQTY;Od{>(J=w2VR4g7E|$fsuo! z*oPU+jILhL%d|)4Vesfi8%QLVyQo}sof!bPZ402Q+SHkA##(M25+dwqNmjQbLf#N1 zIk+?AHi0@t8Ei*$3Q{|hKt#eCrIPMK1c+c{L@lup1kmbXbIUDrfKif$GsE3d1<=)SRNZ)zs;%0BS7X~VDQ}UK!p@9{ z%n0hVeiTm*vxXt`#$?zkgC;)2F8kM54K zMI^!FxR4I?J`AaKlrG(BmDKV=_bd-sjV#n{Ca%zcis1xF8TF;^=sZ^+kVe?-S?(f zuTJ>ZKX-HRhhBek?5U4Wq5W}3eJvktI6{G`%HG>N?i?D4fzALUh`f$OO={ZCQ>O=+NvDTa{bvW%%lr zBpJkY_RO&mu7psfwZ1yR2V78xi8w2;TV|}3x=+belI^++r87^i z&nh>A6r6H&4}h+^+#%bMmu^Hb6ZV#;t^+iL%cG1Uxia|iN#)~y=QsV8xBS^BjAi{9 zjaR+V{%Ak(7k%9i+#Gt*SA5NVc>B8^0Pw0e-aYuTn`2LXd zb~RnrZ0UMVgtqLS7dRqLf1zM7ZvOvOl}&iyo%iDvU+|bN`qn@9y8G|@ny+}#r}u$R zUHbJl3zH1(>Ml2*+OCTbb z5<@S5nQUe{+&X{;*iw)j14Np*v4emw%%Z-^q z4bt9DKfERp=Z8e(rqhYcr&c&gn8dz?Yniv!i6AhpwyUn*2ZL;haTbw*c~>vl_M8fn z5mmiPz#~RYb(cLKdg#M>^=sBf?vx{5@yihLdAh{|Z~pc--S=JZdDZ&st#9C~-vj`! z{~>?WjsI6@Jf{6IMjBjfw4vV=>AcJG8Gf8d{;@B|`OtliMBn&RqP-|*ts;k*9)-O=)@ zH!gbBdtUbKztS=apG^CsT2+$KB^yUqxw+V^IPq@CmdfRp)o~o_cJ2Vi4UgGIJB(3E z$3Aj9CF~d4)*xwViRswQl|&XGhDUG!V@?A|8gjV}WiDimY?HLyt+l6Gh@J?loH<$= zSHoT!Q*|@DoChcYeJWxtGt4swD9wT@!b~r4!FrLT2!s+%O;KHShnT14khFG6ce$sA zEW#RNhcDEz4Fu($eH;(|;(I^z^Z(li-uF*`;pg6eH~mI3$eVHWs{-Kj);I9gZ~w0M z{J`T(H;>w2{K}1A+Wrtu#Md&^ASP`9nS+p5JIXH|!SW99agqNd&No6c0uU5^)c&%e@88MidxarqpZ2P{GTxh_R zz_)Z(uY#b+6ZKYAQ1#{E`S34%=>7lfLmzzLLm&L7ANu+CNv(-xf(&3yKzFx7|Dw-A z54`y`zhwM8@aEUtOgs<#?Z5gQIwMV2&xkO(y47av@=Tyr zndxD#6&V$b**K<|#}wLujG86Ofo_#Nas)lA4E9>Ug^ePwu-Krh2ZtkrZCY)5AWf7T zBa^CHeLc{#SFQ{MUA;gO0IF)`hmSc&Y!H}ilVnX@jc8)2=0-qp26f6HYtd*IRUrqp zB#JE4Ek|UxPq$ejxwdl)svfIy)LqGqVYdReq@(UU{0qPEzK=Zkq1%^-#<*p*8uLXfBk2F&!?@z`Gm&Z{S9#ci}^a- z_g(M#fiL)Tue%?>>t4*)ov(WR5BZH>@ilLM@y!pv@4Mdf##cSnP5)HeKS~>#HdGZs z$VI@i*+qjnSUwn=RHqJS@8Fbca62xGO*fBC$G=oEt;4usb7j81w_Hb+Fb+u=*q)xHTO z2nn$esV>HV(dwiU0S~hxHi7Nl*y-q8az%^&CG`yM#oicE0DI!X9!x=u(NMxVYIgsk zj_cbGKRoBf$G%+!qdCUmHcnakNARXNfl(j#y8g~@`YUhwrl-1deRA=tH`;If=!1`U z4EVYq@Yg-n&Hd%Hf81!JB_nQ_rIAJ}0W6;rHjra%_Jq-`#*$o&a2Rw!SkB?J zB{YCQyNmW!q&Gq}yE7t2`V<<54qMk(S37!>J%*1~v>DzQ#CEEp8YSgvN=f)m?gNGy zv#j_AQbpt~_osa(-k^dM2J$F&3z7 z&bjToPjSxdUbq=m%^Z>GrAvU-*~g8iYRibZGI8v{mED;()H8HKKyiAWMo4Q}c-reM zrrYZGfUQytB_r84B^pM?$_fZFLP2ATVS82kM{K!`s$SXcr9T{F;OJ!);jZO@yyXrG zvKHi%F(_f{Y2XsMRVOo4Gg^^5i1HYDaU-u-`{;b z>h^GK+q7rw`%K-wu4G*8n_Yu(+IwXzzMW68q-TcE(=P^+Yf*p932;$9TgcclP@2mo zVO24pXrcSav0D>}s(G%iu$69;gg2P#hmfB|YR&^V^*bYmRLNx-QdKi!KdEyRGG|rB zsn4U9dreb?K+9{i<=DCqLA!;PFX&37SGjX(L$-4afa($)k-gA*OK2M;M5Cs+E4Nym zkvV-Eg{v{pvwJeqsICKIAQsG&VayCGlA?^plxN?5=)s_P1zjF|@WEdY9nE|0ak;12 zXd1G7IDvbwZt<@F0|0F}LGGuoPOTlYp?ryx3K|3W4G8|P}K9*&7wa7>mmw+*u z3nnLVP*Mh@R%8HZxoZn=n?CZ9pPzLnHe3oB`i0vEM~I{{uVNm0Xdc_1_wHx%?OeP0 z<{|lm|KKwwoB-g*-}$pobqD(wzx_iNh|A@|SjB!AisiR;RzOj5=JE=vyX;Ck65wau2WiA<#BRN*7CO2Dl5wf>#jZArI ztkRg>wdIb;Y^ubFLzg=bf8?R-Uwr6tJ%PgR zM3A3Z?S!X=_Q1!Ar;T=kuB9Nc+30p;(uk3y+jB`3CIm(1sA@}gWJF0s2yJ`B4iYuP z6>fPytSeU=fvu&kQX?~$J8M^;YCrbaHd{o`x(*F)!#$S|in$o61d798kYRK%Pg!C# zPF9Z?WR7kDJwv;)>V!~C;g~(fh2Y2$V;t9W+ct7`tvQk5*7fxzqnAlDvjsOd7`)SS zV(gyqb``Ay4;ov{XThQVh%U$V^@krk9=sfPl)TJ~Yme9-eE1h~+hg0U?hUs9SD|9R z;R!v$7rNm-Jk|Z-nfR1r2fJd8w0nDHQsKP{uxqt2P*! zQxo9qE;}*-XJ#g9Dl#H-&Kd*3kW=mMCYvB*W%*7RHWo|a#(2wux<_vEIW4tLVNjb8 zcvdVuh*CwKJu-v$Ty4f?H4)N`6j)1}&PhbXj3pZ#JXGGP>4PEq^Z68{)f{W^jfb5L905e3bxnQ9apryf`Ilw-* z`;yJGFd_;J5{r1+!l_WVNGOoHVF_Z(ABcf>$&$)M7LJ3QJWC1>Y6@ldb#frg|*~00mFfxeF?ewTx%1v^Q z9MzX##5THX?aj|CFR!cv5hSY)21AOmY>%;=vAY^HpgAu&!rj8M@Lr~oP70{1BO)y^ z7EM~`u3?1Qu;f1dB-T5D?#>vkhOmGJCPvZGk>Z*qxdXU>~xTAuxsjipO9d{^dTq~Im-??r0o_p`9x^@jA z1aA>b*c;%g3(;pjA)gsSPs12s!>0|X?Im}+)^C;#Ruva$fn-qKU8gs=Pc^KSd9ENA zv@^X@SsTz>u(|@-)(G~^{If9Kj7f~KTzh?^QwQ6k190Y6HM!tt=ZqA#=(CzB*;2%! zj3SsPCr&yw?JR=ZJ{BmiyUB$RryPW~2wBHG7;(zqEeWqMX{Ina=2o)%q2u_)I}cqS z^El?iSxpeWJUowCJ;oLx&`540NZxzTR#jb<+}b3uXV&%Qo?F{Wd)$;(A7wZ6Og!Bp zq>8~UG8tiyNXA|FD6S0jS{*G~gX%26+NiEpwPw4?rF7GS3B&E~hOO=ZdmdXxoLM#6 z%8_J{4e0DSH%@P7DVD1uq=6~ZUQ0xgOG_nv`gV1r+9hwTb`*6v?%clfiw_@t=lb&C!yoy`<+g5L`Xk5n zQOE3K)?_mrgQGScSsgRCSQbs&<`@NBUk%=Kqd~uHD{qqQ{DgI(C7iJS|BfGfs{78T z8*hCBAFWC7D^@$|&M{0`YghoIO86CXtqupu34Mb?yL7U}i zU2o)04rY?7-jIPSX*UA2bW|%5=t8$uz$}f302Ca-Y+xG^z#!<}Mo5L_G+&c;EW!9W zYhK*bn2}!6RCTFfl!_s++jO#UO-|6qF*Suue{}N|CP7=r9b+Gf9p?u$B#VKUFy?`x4z-k zZ-4#kAJHWEm8qTZ_)UM@riKw@Kv*oA5fL_9`^aUNRW$1Ba}nI8bolc zNu&D!e08-)cndBuoH2HCEE`EOGDk#4Y-CnzxqVBWXDd#<;cg+gB;rqP(v`{%M8p^y z5i|o~YwYP$Z}l{TU7+l{a)k5ZngBNDn6o6ebm|{ihL|V2Va{WDrr6$V?%YV3XI&PN`8@Zk^t+%Nvz&wu33MZ}=I$D(2( zZpKf1G6=aB{yTs6KmB)Bq2$;8j#s}N@BU}+eX2XvryLKw`P<+0`fvW@FMH(3uT1TP z$BoBtYG7dk5L6^$TV?#E4INy}GBUv=0|*1%HD$TXHe`u%F&=anaAZ_&m zQfB5D+sL6MLek{PHPYgi&n_|rI*34b$4Z^wwO~1|uM9985TTF@*23Vats7VR!4aTa zNsL%#N`@W4HWC3OwMIG6Jx{crO)w(KG?-(|c^q}Q%xk1LIPMv7l})$Gs;gW3b~W0~ z9A;QyH&j(eM(ksI*44e#HZQvU&_$&!&r-o%#=}zY`4j*?@B1h3z)ODp6XUb}#Ki+| z{`%Lw;)gy4pW$hwo$#2Zj$j;f+Rhk);Tp)Psw~85-EdT$jJ%ZubBoTjZ3;vJoV_GS z>uTFizu!2i+Ot~nh|#(bxfI-EF-OAy)YZYvM8Jw!y?h#~dyMRPZkFs~X8_GpNJm;K zQ{48gB$8O$cE-Y+F3WCrV=!rDlc6~y0Tnp96~T;HOx18=A=a&KC9z$NzJ2GKedo@D z4}Ik44^+fvaC#asMh2^oY&7YsG1P_jtu3Kj$h`Alsq|}}o0mJTV`{_La?kpu453d& z5BQ&d@Bi!mm;cfK`gcCnUFlPcHGupo;DN_>$fu8X!s9gcMKR}XV}d@^Er~j$HVhuU z7G^E3yqDaT{{QU#S*)emb>9iDVekD7XS!p|kr|muaS%mGEK4R_ZFG@hSBq*3=!Rf- zKe-?;ZkjNl}K4C>75D4ek_tVuN&GRj#+Y}ap)l|8!3M^(1+ zjV#8AsQvB5(C_`zpZq2G8-MQ|+HCi&^sQH*=ZKx~&4x-uK%~fEh}m?=F^MXI=;Rxj z%_i`h0vG|nlu{E?Au|WY3L-EPA^~`2LO=!0I<+~#Wvi!X$wbBuiKkwhso|_3>2w1$ z-PCI?lNXkh0w!7_(`1+oM3*}qCP$`bg3~z;MZ^$DMF1v~V=^-$4n9nGnxL17L{$*O zoB_=vf@e4Nr6T|{mLk(p>T-o(=+2)!eE7!t(UZ~*V~UkJa>k^jrcq;8`mLg>V8C#fpZV#RzK#_7oUjxASurc$DAOmf@)C{%_=4yh-B(0Kr>@S1E#4L9Mqtg0V3(-aA<-+ z3}B8KFD-XGyHqkU0wNQs6i{;Bp~0nFBLES`+ykIWCMGgKbQNoNy1eT#_X6~Xx;Ma7sWP!KuqN-EyD$&+hJ zX`~o|0h!RudCyFyNMsC@L`4M584Ej)1S%XzO({Lq z@_jDnqF}0ogkVTUh7ctKfa9R5=p5-~U%_<1AVM)f17w&k`Wd0XTm1-Fv;;>fWk6sL zz-)k`#z0`k1Yi^O$v{z6rY24m18`sw0SUYT2o@v*6fp}vNFfuM+(}K9i6;wJcUiYR zIZS#0aLn0&m=Ux*yBAiqshm_qC+1ET05o)5ased60?gB8ZIR4KAVtK23tEziu*bHo zJJpm65Rmggxd?Klnk@Fk2?p|@;+d=3s4~_nn-xu2U>ITEjJ2!Yy8e0AEc7gN{&YK_ z5C80M|LSvsPI$Y?_%*zQJMTz#!rKn}nLheS2h1i#G^4SaOdr_OiF+!SMj|VU1U#8~ z({#aamwj(YS;~Z#CL&@oH7P=lr-rzalM#tJQFF}1T8gNODHs&bjhQ!?>UT&~7%$By zCu0&VV#Lk?Vn)jh0fk2rCX!stFfai~woBqDl8UMUn30sJcF6!hbt>00LLxL$GgI#Z z*wjBqX2z2%Y0hmZG1q_M3UQ*f&Rm_M1nSzu8U<^PM)QSR`W+pW7fG8$rnc1l+ zni!PnDu@uRNI^vaLKTI{IGa7&w2VycHkbJZL=yyc+=_~*P0OpOkV8;V5ma-IrKpM` zNGa-=z~EU9MROdD3xFVqn4}z45>aJ+V9DfA0XCf^xD27UjD{vS#JhSP<;)NbF3qlBvNc762`HtL7b_8w8C_m(60=jw z3P40f1c1b*1_je%K7=G{Qvx81sUn#gH~?e<6Dewn1p!b|LA%&t&Y#=ltM3IVcEXBBX zV1%fGVyvjgUo;hOwocFdJeH9W+r1I z%#t0UsWAnB0l}jpkd&MV9jGg&CPt2#S%nZXfGY)<%rliJ$c%t0YM=lGKo}i6nwScN zR7wIt&uHjXkb!8z_97u*irI<;MlVQ~kqVQEBoz*AQ&M!5qYz>#W(b5sN<|bXfB+CR zp&n8K#2VSulH@+C7i|M?D64Ql8XPqhFM>7R5FG#v{rH8?{lUbvGqex;9{_-N*$Hpy zxnU<<-j|vdF$6<2P(wh^Y-W=+BqK0QCRYGzmo}7*P-H+footCM+f>?YV$Ztn zF2{&SsEz@QOqCD-ftfDTBqGzbDX}SJL^Lz+84HPK1Vcbqg;XMuAL3vvNlO7C3aXk) zF~ckpLS<${jKL8Qpn@W1$*ks?i^C>)bY(URRb4$f-6f9)RA(&0mhiHZDaH8OAK!he z3ig%vzVzLm4DagCA~(620Du7-2%5OdVmZiah!}jOmmSp4fO40;{=mdprKn5*x@nuI z1#?LV&T$Y(ssIpFjeXHf24*=i10fbG^ z&WQrG^G3}CU>I{&%?3t9fq)Frso8F~LqH}cQbf%mLnDr13NfjN3sjN;*WUc@a1q{(l z&A@wKAWG7iRYUB~<3;N{I?Is+2*8ZFfaGp}k$!Un*2=?VpdGlGb)0U!yP5t^uAO{gYn0z_;~8F7}A8J5YjN6Xf1>B)*_wZcA#jmT&P75SO> zibE|`a2Y!>HfyT6ba_1wwaV<|{9)8}g`y0ERB{qAay$;jkPLEQK%gR;04awUho*LI z>&T*NQfmTLY20ZdN0ky-mYc0x9xk>+a#WtZ|M(0E{MHrgyL!$
e}t6EIC2#5&S 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
4bL~a?h)r8BR1^5tA&8L`~q5KuR^Q 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 O!pvJu=DU=6;Qs<7r4q6L literal 0 HcmV?d00001 diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 302600eb8c9..94336021f02 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -126,6 +126,8 @@ def test_adobe_deflate_tiff(self): im.tile[0][:3], ('tiff_adobe_deflate', (0, 0, 278, 374), 0)) im.load() + self.assert_image_equal_tofile(im, 'Tests/images/tiff_adobe_deflate.png') + def test_write_metadata(self): """ Test metadata writing through libtiff """ for legacy_api in [False, True]: @@ -310,12 +312,7 @@ def test_12bit_rawmode(self): # imagemagick will auto scale so that a 12bit FFF is 16bit FFF0, # so we need to unshift so that the integer values are the same. - im2 = Image.open('Tests/images/12in16bit.tif') - - logger.debug("%s", [img.getpixel((0, idx)) - for img in [im, im2] for idx in range(3)]) - - self.assert_image_equal(im, im2) + self.assert_image_equal_tofile(im, 'Tests/images/12in16bit.tif') def test_blur(self): # test case from irc, how to do blur on b/w image From 4b4f7d6a2c14e4b0ab68d506384ac4b677f1c6b2 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 12:21:33 +0000 Subject: [PATCH 06/13] Refactor to use features --- Tests/test_file_libtiff.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 94336021f02..c165ff08a24 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1,5 +1,6 @@ from __future__ import print_function from helper import unittest, PillowTestCase, hopper, py3 +from PIL import features from ctypes import c_float import io @@ -15,9 +16,7 @@ class LibTiffTestCase(PillowTestCase): def setUp(self): - codecs = dir(Image.core) - - if "libtiff_encoder" not in codecs or "libtiff_decoder" not in codecs: + if not features.check('libtiff'): self.skipTest("tiff support not available") def _assert_noerr(self, im): From e617d05b9ecf47c7536ff867b39355c88ec2bab8 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 12:22:28 +0000 Subject: [PATCH 07/13] These tests/features now require libtiff --- Tests/test_file_libtiff.py | 45 +++++++++++++++++++++++++++++++++++++ Tests/test_file_mic.py | 3 ++- Tests/test_file_tiff.py | 46 -------------------------------------- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index c165ff08a24..79f02d63626 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -572,6 +572,51 @@ def test_save_tiff_with_jpegtables(self): # Should not raise UnicodeDecodeError or anything else im.save(outfile) + def test_16bit_RGBa_tiff(self): + im = Image.open("Tests/images/tiff_16bit_RGBa.tiff") + + self.assertEqual(im.mode, "RGBA") + self.assertEqual(im.size, (100, 40)) + self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16B', 'tiff_lzw', False))]) + im.load() + + self.assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") + + def test_gimp_tiff(self): + # Read TIFF JPEG images from GIMP [@PIL168] + + codecs = dir(Image.core) + if "jpeg_decoder" not in codecs: + self.skipTest("jpeg support not available") + + filename = "Tests/images/pil168.tif" + im = Image.open(filename) + + self.assertEqual(im.mode, "RGB") + self.assertEqual(im.size, (256, 256)) + self.assertEqual( + im.tile, [('jpeg', (0, 0, 256, 256), 0, ('RGB', 'jpeg', False))] + ) + im.load() + + self.assert_image_equal_tofile(im, "Tests/images/pil168.png") + + def test_sampleformat(self): + # https://github.com/python-pillow/Pillow/issues/1466 + im = Image.open("Tests/images/copyleft.tiff") + self.assertEqual(im.mode, 'RGB') + + self.assert_image_equal_tofile(im, "Tests/images/copyleft.png", mode='RGB') + + def test_lzw(self): + im = Image.open("Tests/images/hopper_lzw.tif") + + self.assertEqual(im.mode, 'RGB') + self.assertEqual(im.size, (128, 128)) + self.assertEqual(im.format, "TIFF") + im2 = hopper() + self.assert_image_similar(im, im2, 5) + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_mic.py b/Tests/test_file_mic.py index fb37a5caa5c..f4059f9c903 100644 --- a/Tests/test_file_mic.py +++ b/Tests/test_file_mic.py @@ -1,6 +1,6 @@ from helper import unittest, PillowTestCase, hopper -from PIL import Image, ImagePalette +from PIL import Image, ImagePalette, features try: from PIL import MicImagePlugin @@ -13,6 +13,7 @@ @unittest.skipUnless(olefile_installed, "olefile package not installed") +@unittest.skipUnless(features.check('libtiff'), "libtiff not installed") class TestFileMic(PillowTestCase): def test_sanity(self): diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 4092c1e7c9d..6edc94aed7d 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -53,16 +53,6 @@ def test_mac_tiff(self): self.assert_image_similar_tofile(im, "Tests/images/pil136.png", 1) - def test_16bit_RGBa_tiff(self): - im = Image.open("Tests/images/tiff_16bit_RGBa.tiff") - - self.assertEqual(im.mode, "RGBA") - self.assertEqual(im.size, (100, 40)) - self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16B', 'tiff_lzw', False))]) - im.load() - - self.assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") - def test_wrong_bits_per_sample(self): im = Image.open("Tests/images/tiff_wrong_bits_per_sample.tiff") @@ -71,32 +61,6 @@ def test_wrong_bits_per_sample(self): self.assertEqual(im.tile, [('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))]) im.load() - def test_gimp_tiff(self): - # Read TIFF JPEG images from GIMP [@PIL168] - - codecs = dir(Image.core) - if "jpeg_decoder" not in codecs: - self.skipTest("jpeg support not available") - - filename = "Tests/images/pil168.tif" - im = Image.open(filename) - - self.assertEqual(im.mode, "RGB") - self.assertEqual(im.size, (256, 256)) - self.assertEqual( - im.tile, [('jpeg', (0, 0, 256, 256), 0, ('RGB', 'jpeg', False))] - ) - im.load() - - self.assert_image_equal_tofile(im, "Tests/images/pil168.png") - - def test_sampleformat(self): - # https://github.com/python-pillow/Pillow/issues/1466 - im = Image.open("Tests/images/copyleft.tiff") - self.assertEqual(im.mode, 'RGB') - - self.assert_image_equal_tofile(im, "Tests/images/copyleft.png", mode='RGB') - def test_set_legacy_api(self): with self.assertRaises(Exception): ImageFileDirectory_v2.legacy_api = None @@ -435,16 +399,6 @@ def test_with_underscores(self): self.assertEqual(im.tag_v2[X_RESOLUTION], 72) self.assertEqual(im.tag_v2[Y_RESOLUTION], 36) - def test_lzw(self): - # Act - im = Image.open("Tests/images/hopper_lzw.tif") - - # Assert - self.assertEqual(im.mode, 'RGB') - self.assertEqual(im.size, (128, 128)) - self.assertEqual(im.format, "TIFF") - im2 = hopper() - self.assert_image_similar(im, im2, 5) def test_roundtrip_tiff_uint16(self): # Test an image of all '0' values From c816932f4b23e30a7147d15741c61aeb76dcf3de Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 12:30:39 +0000 Subject: [PATCH 08/13] Docs for libtiff read w/compression change --- docs/handbook/image-file-formats.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 130d1590860..1d1fd3b6c6b 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -525,13 +525,18 @@ For more information about the SPIDER image processing package, see the TIFF ^^^^ -PIL reads and writes TIFF files. It can read both striped and tiled images, -pixel and plane interleaved multi-band images, and either uncompressed, or -Packbits, LZW, or JPEG compressed images. +Pillow reads and writes TIFF files. It can read both striped and tiled +images, pixel and plane interleaved multi-band images. If you have +libtiff and its headers installed, PIL can read and write many kinds +of compressed TIFF files. If not, PIL will only read and write +uncompressed files. -If you have libtiff and its headers installed, PIL can read and write many more -kinds of compressed TIFF files. If not, PIL will always write uncompressed -files. +.. note:: + + Beginning in version 4.4.0, Pillow requires libtiff to read or + write compressed files. Prior to that release, Pillow had buggy + support for reading Packbits, LZW and JPEG compressed TIFFs + without using libtiff. The :py:meth:`~PIL.Image.Image.open` method sets the following :py:attr:`~PIL.Image.Image.info` properties: From 768668c1d7b1d78929e33a667bf1faa0592efceb Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 13:53:14 +0000 Subject: [PATCH 09/13] Added RGB*;16N Unpackers --- PIL/TiffImagePlugin.py | 7 ++++++- Tests/test_file_libtiff.py | 2 +- libImaging/Unpack.c | 13 +++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 140074cb0e0..39adfae7017 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1278,8 +1278,13 @@ def _setup(self): # we're expecting image byte order. So, if the rawmode # contains I;16, we need to convert from native to image # byte order. - if self.mode in ('I;16B', 'I;16') and 'I;16' in rawmode: + if rawmode == 'I;16': rawmode = 'I;16N' + if '16B' in rawmode: + rawmode = rawmode.replace('16B', '16N') + if '16L' in rawmode: + rawmode = rawmode.replace('16L', '16N') + # Offset in the tile tuple is 0, we go from 0,0 to # w,h, and we only do this once -- eds diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index 79f02d63626..dc3b1084573 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -577,7 +577,7 @@ def test_16bit_RGBa_tiff(self): self.assertEqual(im.mode, "RGBA") self.assertEqual(im.size, (100, 40)) - self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16B', 'tiff_lzw', False))]) + self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 0, ('RGBa;16N', 'tiff_lzw', False))]) im.load() self.assert_image_equal_tofile(im, "Tests/images/tiff_16bit_RGBa_target.png") diff --git a/libImaging/Unpack.c b/libImaging/Unpack.c index c7b9a606c76..691eec7c1d8 100644 --- a/libImaging/Unpack.c +++ b/libImaging/Unpack.c @@ -1301,6 +1301,19 @@ static struct { {"RGBA", "B", 8, band2}, {"RGBA", "A", 8, band3}, +#ifdef WORDS_BIGENDIAN + {"RGB", "RGB;16N", 64, unpackRGB16B}, + {"RGBA", "RGBa;16N", 64, unpackRGBa16B}, + {"RGBA", "RGBA;16N", 64, unpackRGBA16B}, + {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, +#else + {"RGB", "RGB;16N", 64, unpackRGB16L}, + {"RGBA", "RGBa;16N", 64, unpackRGBa16L}, + {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, + {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, +#endif + + /* true colour w. alpha premultiplied */ {"RGBa", "RGBa", 32, copy4}, {"RGBa", "BGRa", 32, unpackBGRA}, From 60e29e5e8d10f44b15f39aaa3877e9dda1009d7e Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 14:36:39 +0000 Subject: [PATCH 10/13] dropping tiff_lzw implementation --- _imaging.c | 2 - decode.c | 30 ------ libImaging/Imaging.h | 2 - libImaging/Lzw.h | 52 ---------- libImaging/LzwDecode.c | 230 ----------------------------------------- setup.py | 2 +- 6 files changed, 1 insertion(+), 317 deletions(-) delete mode 100644 libImaging/Lzw.h delete mode 100644 libImaging/LzwDecode.c diff --git a/_imaging.c b/_imaging.c index 44eb2dbb7b2..d90f23477bd 100644 --- a/_imaging.c +++ b/_imaging.c @@ -3480,7 +3480,6 @@ extern PyObject* PyImaging_GifDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_HexDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args); -extern PyObject* PyImaging_TiffLzwDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args); extern PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args); @@ -3553,7 +3552,6 @@ static PyMethodDef functions[] = { {"jpeg2k_decoder", (PyCFunction)PyImaging_Jpeg2KDecoderNew, 1}, {"jpeg2k_encoder", (PyCFunction)PyImaging_Jpeg2KEncoderNew, 1}, #endif - {"tiff_lzw_decoder", (PyCFunction)PyImaging_TiffLzwDecoderNew, 1}, #ifdef HAVE_LIBTIFF {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, 1}, {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, 1}, diff --git a/decode.c b/decode.c index bfd19faa401..be1b503e6a4 100644 --- a/decode.c +++ b/decode.c @@ -35,7 +35,6 @@ #include "py3.h" #include "Gif.h" -#include "Lzw.h" #include "Raw.h" #include "Bit.h" #include "Sgi.h" @@ -484,35 +483,6 @@ PyImaging_HexDecoderNew(PyObject* self, PyObject* args) } -/* -------------------------------------------------------------------- */ -/* LZW */ -/* -------------------------------------------------------------------- */ - -PyObject* -PyImaging_TiffLzwDecoderNew(PyObject* self, PyObject* args) -{ - ImagingDecoderObject* decoder; - - char* mode; - char* rawmode; - int filter = 0; - if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &filter)) - return NULL; - - decoder = PyImaging_DecoderNew(sizeof(LZWSTATE)); - if (decoder == NULL) - return NULL; - - if (get_unpacker(decoder, mode, rawmode) < 0) - return NULL; - - decoder->decode = ImagingLzwDecode; - - ((LZWSTATE*)decoder->state.context)->filter = filter; - - return (PyObject*) decoder; -} - /* -------------------------------------------------------------------- */ /* LibTiff */ /* -------------------------------------------------------------------- */ diff --git a/libImaging/Imaging.h b/libImaging/Imaging.h index fe8d796a206..aa59fe18c39 100644 --- a/libImaging/Imaging.h +++ b/libImaging/Imaging.h @@ -440,8 +440,6 @@ extern int ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); extern int ImagingJpeg2KEncodeCleanup(ImagingCodecState state); #endif -extern int ImagingLzwDecode(Imaging im, ImagingCodecState state, - UINT8* buffer, int bytes); #ifdef HAVE_LIBTIFF extern int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int bytes); diff --git a/libImaging/Lzw.h b/libImaging/Lzw.h deleted file mode 100644 index 8fc30bd7faf..00000000000 --- a/libImaging/Lzw.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * The Python Imaging Library. - * $Id$ - * - * declarations for the TIFF LZW decoder. - * - * Copyright (c) Fredrik Lundh 1995-96. - */ - - -/* Max size for LZW code words */ - -#define LZWBITS 12 - -#define LZWTABLE (1< -#include /* memcpy() */ - -#include "Lzw.h" - - -int -ImagingLzwDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -{ - UINT8* p; - int c, i; - int thiscode; - LZWSTATE* context = (LZWSTATE*) state->context; - - unsigned char *ptr = buf; - - if (!state->state) { - - /* Clear code */ - context->clear = 1 << 8; - - /* End code */ - context->end = context->clear + 1; - - state->state = 1; - } - - for (;;) { - - if (state->state == 1) { - - /* First free entry in table */ - context->next = context->clear + 2; - - /* Initial code size */ - context->codesize = 8 + 1; - context->codemask = (1 << context->codesize) - 1; - - /* Buffer pointer. We fill the buffer from right, which - allows us to return all of it in one operation. */ - context->bufferindex = LZWBUFFER; - - state->state = 2; - } - - if (context->bufferindex < LZWBUFFER) { - - /* Return whole buffer in one chunk */ - i = LZWBUFFER - context->bufferindex; - p = &context->buffer[context->bufferindex]; - - context->bufferindex = LZWBUFFER; - - } else { - - /* Get current symbol */ - while (context->bitcount < context->codesize) { - - if (bytes < 1) - return ptr - buf;; - - /* Read next byte */ - c = *ptr++; bytes--; - - /* New bits are shifted in from from the right. */ - context->bitbuffer = (context->bitbuffer << 8) | c; - context->bitcount += 8; - - } - - /* Extract current symbol from bit buffer. */ - c = (context->bitbuffer >> (context->bitcount - - context->codesize)) - & context->codemask; - - /* Adjust buffer */ - context->bitcount -= context->codesize; - - /* If c is less than clear, it's a data byte. Otherwise, - it's either clear/end or a code symbol which should be - expanded. */ - - if (c == context->clear) { - if (state->state != 2) - state->state = 1; - continue; - } - - if (c == context->end) - break; - - i = 1; - p = &context->lastdata; - - if (state->state == 2) { - - /* First valid symbol after clear; use as is */ - if (c > context->clear) { - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } - - context->lastdata = context->lastcode = c; - state->state = 3; - - } else { - - thiscode = c; - - if (c > context->next) { - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } - - if (c == context->next) { - - /* c == next is allowed, by some strange reason */ - if (context->bufferindex <= 0) { - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } - - context->buffer[--context->bufferindex] = context->lastdata; - c = context->lastcode; - } - - while (c >= context->clear) { - - /* Copy data string to buffer (beginning from right) */ - - if (context->bufferindex <= 0 || c >= LZWTABLE) { - state->errcode = IMAGING_CODEC_BROKEN; - return -1; - } - - context->buffer[--context->bufferindex] = - context->data[c]; - c = context->link[c]; - } - - context->lastdata = c; - - if (context->next < LZWTABLE) { - - /* While we still have room for it, add this - symbol to the table. */ - context->data[context->next] = c; - context->link[context->next] = context->lastcode; - - context->next++; - - if (context->next == context->codemask && - context->codesize < LZWBITS) { - - /* Expand code size */ - context->codesize++; - context->codemask = (1 << context->codesize) - 1; - - } - } - context->lastcode = thiscode; - } - } - - /* Update the output image */ - for (c = 0; c < i; c++) { - - state->buffer[state->x] = p[c]; - - if (++state->x >= state->bytes) { - - int x, bpp; - - /* Apply filter */ - switch (context->filter) { - case 2: - /* Horizontal differing ("prior") */ - bpp = (state->bits + 7) / 8; - for (x = bpp; x < state->bytes; x++) - state->buffer[x] += state->buffer[x-bpp]; - } - - /* Got a full line, unpack it */ - state->shuffle((UINT8*) im->image[state->y + state->yoff] + - state->xoff * im->pixelsize, state->buffer, - state->xsize); - - state->x = 0; - - if (++state->y >= state->ysize) - /* End of file (errcode = 0) */ - return -1; - } - } - } - - return ptr - buf; -} diff --git a/setup.py b/setup.py index 20226613936..8b443308126 100755 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ "Blend", "Chops", "Convert", "ConvertYCbCr", "Copy", "Crc32", "Crop", "Dib", "Draw", "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode", "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode", - "Histo", "JpegDecode", "JpegEncode", "LzwDecode", "Matrix", "ModeFilter", + "Histo", "JpegDecode", "JpegEncode", "Matrix", "ModeFilter", "Negative", "Offset", "Pack", "PackDecode", "Palette", "Paste", "Quant", "QuantOctree", "QuantHash", "QuantHeap", "PcdDecode", "PcxDecode", "PcxEncode", "Point", "RankFilter", "RawDecode", "RawEncode", "Storage", From cbcb51c5245c5ce263dd3aacb32e7daf9e1353da Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 14:37:25 +0000 Subject: [PATCH 11/13] removing internal tiff jpeg decompression support (buggy) --- PIL/TiffImagePlugin.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 39adfae7017..0ba1eec4c33 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1029,14 +1029,6 @@ def _decoder(self, rawmode, layer, tile=None): compression = self._compression if compression == "raw": args = (rawmode, 0, 1) - elif compression == "jpeg": - args = rawmode, "" - if JPEGTABLES in self.tag_v2: - # Hack to handle abbreviated JPEG headers - # Definition of JPEGTABLES is that the count - # is the number of bytes in the tables datastream - # so, it should always be 1 in our tag info - self.tile_prefix = self.tag_v2[JPEGTABLES] elif compression == "packbits": args = rawmode elif compression == "tiff_lzw": From 4b3bdcd9df31d35065cdb766fa80f1f7bd70bd61 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Wed, 20 Dec 2017 14:37:47 +0000 Subject: [PATCH 12/13] removing internal tiff_lzw support (buggy) --- PIL/TiffImagePlugin.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 0ba1eec4c33..75737b2c399 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1031,11 +1031,6 @@ def _decoder(self, rawmode, layer, tile=None): args = (rawmode, 0, 1) elif compression == "packbits": args = rawmode - elif compression == "tiff_lzw": - args = rawmode - if PREDICTOR in self.tag_v2: - # Section 14: Differencing Predictor - self.decoderconfig = (self.tag_v2[PREDICTOR],) return args From eab851c61be4b1cf968e0419d6c35c7deb179acd Mon Sep 17 00:00:00 2001 From: wiredfool Date: Wed, 27 Dec 2017 15:33:30 +0000 Subject: [PATCH 13/13] semicolons --- PIL/TiffImagePlugin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 75737b2c399..db3eaa50ec1 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1267,10 +1267,10 @@ def _setup(self): # byte order. if rawmode == 'I;16': rawmode = 'I;16N' - if '16B' in rawmode: - rawmode = rawmode.replace('16B', '16N') - if '16L' in rawmode: - rawmode = rawmode.replace('16L', '16N') + if ';16B' in rawmode: + rawmode = rawmode.replace(';16B', ';16N') + if ';16L' in rawmode: + rawmode = rawmode.replace(';16L', ';16N') # Offset in the tile tuple is 0, we go from 0,0 to