diff --git a/Tests/images/m13.fits b/Tests/images/m13.fits new file mode 100644 index 00000000000..1f2f82a4f18 Binary files /dev/null and b/Tests/images/m13.fits differ diff --git a/Tests/images/m13_gzip.fits b/Tests/images/m13_gzip.fits new file mode 100644 index 00000000000..cf7acea4eac --- /dev/null +++ b/Tests/images/m13_gzip.fits @@ -0,0 +1,366 @@ +SIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H CHECKSUM= '0aE73a960aC60a96' / HDU checksum updated 2006-11-15T17:28:30 DATASUM = ' 0' / data unit checksum updated 2006-11-15T17:28:30 END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 8 / width of table in bytes NAXIS2 = 300 / number of rows in table PCOUNT = 111820 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 1 / number of fields in each row TTYPE1 = 'COMPRESSED_DATA' / label for field 1 TFORM1 = '1PB(506)' / data format of field: variable length array ZIMAGE = T / extension contains compressed image ZTILE1 = 300 / size of tiles to be compressed ZTILE2 = 1 / size of tiles to be compressed ZCMPTYPE= 'GZIP_1 ' / compression algorithm EXTNAME = 'COMPRESSED_IMAGE' ZSIMPLE = T / file does conform to FITS standard ZBITPIX = 16 / number of bits per data pixel ZNAXIS = 2 / number of data axes ZNAXIS1 = 300 / length of data axis 1 ZNAXIS2 = 300 / length of data axis 2 ZEXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H COMMENT COMMENT This file was produced by the SkyView survey analysis system from COMMENT available astronomical surveys. The data are formatted COMMENT as a simple two-dimensional FITS image with the same units as COMMENT the orginal survey. CTYPE1 = 'RA---TAN' / X-axis type CTYPE2 = 'DEC--TAN' / Y-axis type CRVAL1 = 250.4226 / Reference pixel value CRVAL2 = 36.4602 / Reference pixel value CRPIX1 = 150.500 / Reference pixel CRPIX2 = 150.500 / Reference pixel CDELT1 = -0.00027770002 / Degrees/pixel CDELT2 = 0.00027770002 / Degrees/pixel CROTA1 = 0.00000 / Rotation in degrees. EQUINOX = 2000.00 /Equinox of coordinates ZHECKSUM= '2f4R3c4O2c4O2c4O' / HDU checksum updated 2006-11-15T17:18:55 ZDATASUM= '1803906202' / data unit checksum updated 2006-11-15T17:18:55 CHECKSUM= 'CeA6FZ03Cd73CZ73' / HDU checksum updated 2006-11-15T17:28:30 DATASUM = '3567348586' / data unit checksum updated 2006-11-15T17:28:30 END "/"6QOSP)SyK7 +- N { & )2&[/**',Q}" -!;# 9$D6%}8&-')*-+? ,]$-}./013 4*5J?6gQ7p8e:gi;g=5H>8?A"B5BCWYDiEG[zHiJThKnM%rNfPaQkjR{T6UW3XrZ?_[m]o^}}_ai~bdoegiljnlmvnprit*uwy"z}|<}Qw<C9vH)oW!gG!ùūǒxb:Խ֚zQ#qO}gX?q> +  clA "6#%p'0(*,../1J24c6 79;m=+>l@flAoC>qDzFGI!zJkL"{MfOqPntQnSSoTV0WYJZ\p]_xa{btdbeuXfDh/@is0jGkRm*Qn|]obq*\r^scuF`vKx @yT>z;{/} (~<'d $).D,r4@99K3 (,6I"       7Uce^_["c' ;n13pH\ +.M +"%"}DA GR7я ŧc^wly s^ؾg_Ap?.A &u:'SЀJB\2'73Xw/&؀wWQSi19) bo<܍+4uE57%˯gqj˦rx2>`žk]>[V+nb2=a o0B{/paC+quk}.mM}Y.݇~8s;)q~?iNAВLT< rw cb1( /@G =O`eſOor3;3̝drG6!~gd +>Ejx۠ xKLRb3~ ԰S'k֭Z]<}S=CBU@ +75v6YI؀{P$ϥKy;Șwoק5ƹzG^nټxNĊNYohfF!]b/CQ rwQ4/|LϰA.Q˄c:p KiL̐Y̊ `cao!n` -%X|zz,YvIAJmv)G7}p^z`[=c0'w θ?uWI!Ae]`:` P{jjwhp[ծH3h!{Poaaԫk2mkd53sD?=k=2d<.f7oU;<ǜK%z]gMo9><^GԢswj])g]{~=N@ +ZTq vb#"A + +(h.@ 7jd'g&ޙokf@D&<'<P'֋_x>>Wx~gn;GN.J CMN` v'<.u|s_7a3)BR +}J +kI<•};t +V?K3LL]msn53xjs<3b)KB:۩~;<{ﴯZ~MfNgR%5{J@lm| |c}Csj#"Y[#bkc/Xi#ٙNBClL8?wؾFk+]f n=W s ^3GQ|"ۇΏTk_؞JX4Jk8=&þtL߃![_fa8|Ã6ou^ME-]>KDzyc/恺Vy>*'qAesgw3TooUzWI޴=]wh_}^??rAJiRZ*KJ@x/<1d& ]F\xK'ڿLN̬4E +.UH\ ˰ Gp gp [8;rrt̥&u&-p [>_'X! Zk~Oz8Gxgbm]v|6|< >\^cǩoI;0eusjܳf +g_+ N>9c }>sxu2 +0kLm+_^z|>em(x(I6"D$ IX-h^Y؃9 3Π#)#bZv 6[ X5:}͡Gz0C:vOoGvN$YESOҫ2z^?2e-V&~Q.r>04?^'wtţo(mx|c{{ Mn09qU]UXz $6ܤ{b:‚.>EN&c%6'3780. tPs<"eWy +Rsap/xk](Ì7_E-5|W>EZǔ8.#Oi/]G̹6/g8;l#0Ӵ=n}'ͣuM.7;a?6ͫ -hvCC*>wR^+x-<_<+S Kk9nA8+0ݳ c"CB%@}Fw!*8y h*D|#|>nkʘPöϭ3G5oN#uRy=Osx}7;l*2^}Ը1}Ww$r~?};NAޏ + Cs@D +$*i(ve'qʾ}Cx~.Jy _={}ۇ|}mw{՝y-w!Z/_gL(H@MNAKxNCa@4*Q6lX`jBa-8vH,pa#"=i! + z뫞Ë拾GpSA̤T)Gx-`i{?*=p)H Tq֏@w!ٛ=+ϛ*Vګgxb3c.p~3jX+̥ٱ:x|WI\}J.` ;ާ4;-y{;/Oo.^xpkMNA;xWO ¥p :2K ,3=]կ{0Mna X c*~4Id25< <@jƺ )V` >ʘozj9OQSuL-3CT|VtPskwˬΙk06$OiNw1YsW?/ lB{g-טI|[~ws2skhω7ڃ?{9#Pӱ}>$ צMn@  +naHLDK6,Xp^oijj ,>ebǿcGD + 5XOSƠsl +ڧ{`LɄ$Hg($-Q/5}Xy桽 mz9{kH֚>{j#Wk> LXfdv`6rգ1m ꯑ~s +Yx?uq_{i4y}y/~s>xvMNA 02Nh&0a͚n('Y`0!8`L>GoDy^wT^xUy=^jz^ǁ1zKzg} A.Ҿ>Fgwy8ޯ8o]uܛ_Tfq9M0{b(@'Ɲ x i2/_tZBXoJЁ#(&ԮrB["I$RZт'xq #؃-XVzn`xo~zs 멟8ez-FzѺRq?V& 9i4.=sn/_Rrշ?Soͽz}\t孞m\ϫ/{gL6OXgԧkĜ8Ͻ1m8SJ@DLL6F]\Ae=x<~5K5egRHɠ+Ҿ{Y%[p-u=yA9:-VB=xo ܁x@#)ՋV 6+KDͲ7D0?wvF(Bǘ +3g8p{?7;( r~mzBɆ{WO$gu\ͧׯh}|#?q6e°KN@DcpI@#>(kv!%7Ԑ*)bL{zi 7-57`01Gr%iS y!=.;i?HOẈxw`^ٓ~=ײWq>'[[qJMZ|Oy$O>~u:;W<^ʓ5v]>YGթyҹ~:woΈs?VWC;`Ț6#~~kMNA˽W$IQzf@6? 7,H KڼJO`e~^tٵ2 7}Fdm``h#+rs"%wC[aL2)x SG&G-`֬s~.ѹzWzJ%?|7W>N}/Ta|Te>'9'S#?6NWs-xuǺjzI3_qsk95]=4;;olEϟ}S9jAEUmf׌ B@@ʜl9tH|ƿwѣ TWCW?f hF{F/'c0D}b l D}+<;Ѓܷzʄ%I̱KI/Fs cv-5x_^:4\0.ޞWӠ-s5z񨖭?ܓ&'xkp+Fpy2ѿog^_j>9o}oAmO!\L~w߅a}ɨS| _tG; 5!xӀRSXASװqˏTpXCbP݂ZT"ʼ~=9 Y~:~fK0DghQͺc+89[c+5wzVC~ygxo݇7#,޶sҞ(0o>^ٯ/츷Fj뻑d7WJίr6ܓ NcΏ??HgpfB??|6OnpSuN`GEJ[( &'!<}3N2/wQE safT|$׌_sˤr݀7:㚼Em5:s$VXde{`m:,ŷh=gێ>_3ms]%[˳}{?R:|ϝ9b5S4;8~Gݗ9}/q1u_.7=NP18} I!h8D:.@IGA˅i4r}}?UT +K@V(^X$uSoӁx7> Z;nbHg[ҙmЄp ;0=͋H o_^ϑ쬆5eb :uԞ|>+ n`Gj39uǙ{Hk?Sq!ݹ&oyNOd󒟬q/|^E*TN0M&V +\ H<W^ Q"Ƴ㵝h#KM-ߛ$Y%1i4*X} {pnB1~ҝ_N+~Ҥ5I1cGʵ.QF3SOjI'Eg َ N:=9i˗VoɆcϾ x8ZDg'gxȿѷ'_81|.|uu_<:^e_'=ڥ/~߽^MG^CľuMN0 X rJmY !!ł O&]|v\;3Kfփ3҂~쉿;; sP\q=}# p.׹u/ў+ 1 :+#x/s܉qDاIaOF㤀dxVCM/w=w vNvѷ#wC`? \,nIcwYzޥz\R^=OW5[sJV.JaXcǹ$u?wJT۬gQ {ZF1jnkr8۟ϣ-"kE'#Їf3p>7$:x:zn1Qܟwz ~2T)5f|'r6Evo.ۭؐĐ=NQ @h8Jn7 AҀhRFPWy̷^u%kMPI3~ &ܿ ,{MN0 *]BHhb' + +UaSq$6,r.8=1ŧcZ3k9iHK:;ҭ/I )wzp +dۊ^#^[/z;B@De_ѯ߃[GƞCՃQ}F['O +o\/ XXT_rqp={o|.1֧·~ ՇsYs9?_=gu|G8c޲383҉{?%uNA Do\۽KH DCi(Z +>Y4#ѥx:=g{mED3pNf# s|[!4MD> ly-OZRQ|OMqJ򩯹+^'j#x,k<5)Mn0sbTP(TZXu; 0a3yɲly2b>7O Xg\i t9+ Is'#_`:kx!򕆄׭~ܗ滚$+{p˵+0p/4%36d$kE~|\|`-3}ț˞FGO8z7rUjy_'uD~>V +ɸ} k&"/bQk0bY5XTmٱ{ޛ& !dðC0Dױ TPYצh=U' ||'?-roS1gy]ØRzQo[.[}:=סJ]2άޗh=Gk{g~wt>GFf@wy:;nADg4 +؏g?`! G$SXG\ZQ-J 4S=ٞ !Í0&Df{Ȉs;{tb6I9mE}5GI: x-)\QZ' 5\۾%fu{R^05Y5؃_G X7Jw>vSw'pYگJ4%󫸯iKɥۼ٬.M}g̿8E" {Kk?twKXAJ@+؂wN`M^+L~_pH;Ż,HM/&׵~j;CM[4c?x'f  @Oߑ ?zcEfe\=Wca!Ͼ/8˓< {ˍƒGRo7 ]_*}?d&Mn0`_-Up6lz.P/+E}O'3MJ~=GZ +3(O9)Ny:ߺB y7C +ߪqR\TQ 0 Jʍn7GxΧKuk~ס)c' cUfoZaMgq/k*йa.ޟi^{~},Wm񪗅zuuwt߸ %mKK1}d2zqԓ"Mk +2N:Ri㌜p` pGp&Ɲ>\Eu3ޓ. +fp wXO+('o;4Ct[pUD`ԈO~oIϻ+5~^x9ϒ10Ӹ#OsMzswe=>)AX}~߃߻h=~!KjgU<}&huN0ƐMS(J"$ Q[_;1f9|Jٟ*)t=ѹ#1X-xP@& HjCz+`Q <.Xci9F}c>8⤭=xO!S3#m>BOp|V] ~(Q/8>wMϖcQ3x,׼WδD=L>b\1{|s~hp9Fְun@3 )"pÌ+7R -0_g8 |#xg'p0[i +dƬoH C]/\uQC.ؚT~g+&=LicS=8ϫ{?>{J\Z;t*MR1* !d{pI8'|]>*_t:yta~#FG#A+ lkAWB$>_Iw ؃-x}c|V=Lz$n'f3 3,5^c5=8׬<0WLYf$=.Q-o xkklxGG5IK׷,wz7{sut}5o{]O $9sw3}MR@xB0!$FX.Yv8g/{UmW&=Ýko)YhA~I>/cl@ r"}+Vװ_P_w^g tغo~C=`yV֙YS\ k}6Xޜ}Yz_9+ ʧ4 ˜Վ}*~lS%}zc߯szbq:I)?05{oӑwF;NPaTg;q @A@((h`t@I"hQȑ(7?ȶtL`9cc i`~c4?1~\F4~sL^0v9@X:>! +:(~{WEWyR~O>rV|.o9ϠmH:$\E'{|= 0-SiOP}Bu>;wM#2!-m\;޸}n%q*߃9>3t{+C\wu޺Bn5u<.\g+x/뼣}}|zu=N@'{Pp7Db?$@ QRP"JnAxHQ\|웙]P:FdP{`` +rRPh$ pmyD9}voƳSOHJ-ޯs/\o%Qdc5hwqA݉84xNihWs^i8=|bf}[(C)Aͻ9|t<r FNC +tp=Ҟ-AKUM>g`j~1udll{fxGm}SR+qDjR1/9})Y. |? srJGʫ}?% }=NA Mr .KP!Hl2%BHj +"*::܁C[:srVzҺ﷒ulэǔxVV~G߉ij)u<;R0ϰ<= 6ȰN@CLbs@@&B Q@sʌ4Z]AI3wuJi4de)Y5)kKpRAqZЁ\' ikY= |{Z^x--53ՙm,o[p<7 +d=O\1OQgv:{g)1.DhjZCswjn)}9m3;y97q aXO=:qxt3hsm=Yn 9}ODx@k¦}n0`?q$TC/zԵ:# #$Y;)eh3XՄ:XAbZhEva +r-ecx~^h>&*23-5nqظbz[㷰:.Nxy?!G`b/l1=~GYnX/b?[ +?gx<2F4s%tt\9bds{k签w8xwfƿ#pMJP+"܍bML<**8IQΝ9p %|{3Ρ*OSRJ*c$u,+Tu 1ks6e^74q~*+ޮ,aE ӆx߯%G[xo}|?1|>3[U( 7pO pKCyz٨>rg_X!?9>x5Ac?7#1=Ɇwˋyk\;gkc1r9r+Qٰ=N@'@ ;Nb8!\VzOpߗ:G[*E%`:cl0xԛЯԈ)OZgMP1Ot%PH_q]{9nY + +֟13W窩wޞCΫ_h sp ^#R3XkxI& sn/Ԉ{,kZϮyuͧdЯw6~?ZKKg(ؗP3x\+S|9,EQuȠ@/,}MN@ %i4IТ#@.` +$6HHHl8Y}fX|Jfb{lOD%"MC"Klu|z;x)(x܁~o_ڠt6yy=}p`8)cE"e +:m=0LwD]-OLb._yyg`Hm38qzruŸҘg]Q[XG<96zf'=sG]ƺ_и .+p?T~Y3* O86c:=\󷞗ZWyYxGmV +_u{gze cHuԹN@ax?N| .!8$A"!=-/A2ZS$ιs.)eZ2dSŅfG$50gxX'Rܑ;44^'P&BPj1KLЈk409cZfxcncv[ }s%kYzĐc_c^9w=Xg2vnap[qN >6g#qk;1Z'+FjƶcAtlt^Afp̺l}_?smxw>3Hp3ܼg燼)p{)ܼ4}W LLݖ{oyM|Xr=N@[PpNCIb;v1A!4HP!JhqN@[4šdٝ]H 1H.qv:v#/\9I)%a>eݧkbX?l*pDc;ı5s_M|- p9gԠ>5 z +/oв_`F}\g5׌~B67pz~kշU}ԇ_2jykwދ+,{kN};܌γ\p/WzoB)?n9micc^ư};N@-8@b;vID /Ax PpJJWUDI^{g6 2jݡN׃= +tF»q |V|B4SE%f0f*z *G1~?ՌçYk p +4qG}j!? xx/e𽵅7ܱy 7p]<7Ѿwyh}gl69W6YNc +'>7[uP=>h&x|շ'wr:➯yʖ&szS8wxelc˺wuvbA{nWV,JPGOiӦI4iV+ZTE]p#7OVpz\ +.>g. %-NtNH>胆my 9{#M* ^GdH[?_1ߛa;܃ TKױ&j1czO,5 8b8cMi?3QNő.g܁wZPne]W)khGQ~%Hzgc +wX_q|[y2jܲgI1Ҁ{q^'L~[bw=Mvb_Vju.Ak9<ctL݆aa 6Vba!$֩9qˤ޺U5fmf_pPB]"-rK=(ǥ~IiΡ5毸EG7șѼXcnn̍R`^>f`fѾr#p lűb{ĵ n^Naӭc8ḓȝ{T@}=5\;u \WcKWp=r [UZF麅}*y> 4O^֞+('1T'sukߧ:{fh{g;XW|տf$ԿQ;N@ t a;6~MЀq(8g_ 'e׳;;qD"#a$A)m:(8'!?w5U.w r.?☒4Ϙ{{ +פW?YYn*7;#^M`FAxД[ ko[Ӑ}u0a$uN)$zpKwpXEVW~˳M{̗sPz yuy`_[SƔ6g̽3ٝuٽ*7]s"=BmNA E*<6n%!< ^@E Q#* +;pbGy}+c[6y @d\ +4Iہf@룎T%PGAn^ ʭu7_AZ?;>#of [3[ĸ%:_}֤ܘ)1UfđH>7 +kKM5}Sj/]}c:#pNž]\ g'ͻ̨Iq 38?ދ{GΡ;9u-+gn\]ӹ*FK=]Nw<3[KTϿz_(}mMN0qNaq Iڤ)nZӦAˏ@H NذBbUXY}.>){xby5h@ I^b~ HQ$F՞! iM> +<{3热\iIAWdg<7 +#9p+&ij}jsܟPqfC̘`)YY'S_E䡄8&~%{7Z'SRp=ẢMGDޒ9.8sF<x\K,u)YclA9gf991YnDl_݀o*ߺyB#90h\Wg~@ qYcŚI]wk <>#y6So;wl3Z/3ZoȰm=N@jz +n8 ׀$Ipb BTP_@ Ppn;bbQMm׌_ħf=u?P4̟;S6޳ q_mwu;N@'s& @ +D +\?yڳ3>Dd @lۻ#<u$!cP!č9wnx'`B~;8?}\5Ωi29(3RsnrZ9cӱnRҐ9 SPou3ҰKp9^Pŝ׾\Aу7/U_l:;3ݍdmآkmN:H) NNa4fmȩO_3#Q\%kpHsW2gFAZc`̡ ሽ}Gxgc)?].~:o:5LH{I(g݉yƱԾyyxc 9¹_s8='1=pDZ: }jfʹ}/u}%Q;N@alPVBgb{؎'|Bt4Q A +XK^1Dqd{smt;eHi^;2Z&~z1$B_ +#h| p5a5\!|\s1LpGgPCż7<kyn3gxceTg슔ļ/œw66a'sѾ1]# Uù4NbL}?G5.}(P6ڿѷ 훺(gO]#>/Z-gb̫a ny +;0u{+uĭIhnlsҝxkm]N1N\[pCfgg?`P&܌xΉ7_s9wv֎s]ƍLA +rU?cg gFl-Cg~ +CC +fԒ(܀g + '1*NCKt`Z`5xo1I KsϽwfs霫:Є?Lk⊏uD&b_EN-Z''hs +1)}Cf4( +.!E?Z܊b.#1c;EKp)ģx1=&>p/Ľx"іa q<u0bx[JgeWԙC}e .>4戾2T쉺G}-s = 1s z;]'n}'m1kh[ +>a~6^^lc/ Gݎ};N@Dh8-uH؎@$ x +DAGEE Z:Ea(>9z7HDhPZ|H.n"Ykަͥ08(9Q׉]Ƶy݄ˠQ0fk̙Qjv`Ǭmnazn99<5kV̝n},^^1 3x7^o&\?vYk~ -}}xe\[;+=N85.:n+7 ^:{@gh?kZ#1ڌ sN@L~l(vYM=;B7Ѹ Hdm=N@(7c'Ώ$v@HD@ (x#=yvvr3;"]OZR˭3ڠC%9hXG`% 4$.43`n>;qa^4zVDrm[ ǩx?Gu(Sp {t(uK9u>VVw^xGMCϿ=k9ʞ1r>t?.d/YnIBƝSwR;!c_ӌs2fSףV?s?B&9HBg׉9I=wo/ue]`@VMP _F*Tݣe]#xH~4RmKNA+x23<AT|$Wİr ;[ŗ{̬cf8|!E]4EUDMKh$P\#ւ-8 q !袷Xï ܼsQ "H[8^ŋ-S#?ˆ<.y;m|oĻيzj% fhMfk`ymyZ\NYߝ01|?'qEaB61S|=Ǡ 1{~B#VǘSb{<x̔ZzSga_&QߓDU{wo/G>kt{s~?>PuԻN1z:> ;d!wK*h(-5%ܑ%k̺fV<ȟsF ԡ )ԠpMƔP!ۉ F1+|'ޮFwԧJyYxwopz?/!6F6nj!c& 8fH[}x0Y4]0[UpGgUttv߶~{:||?MVyƉﮄ%5TJHm.aǧ}:JkGU[%{D%V".ĕb/|svFDb)%R& d_5$`uvU9Bn&Ű:Ϩ>j4I|rȞRpE +` +gky0;ߨE&\#Ș+q:1#968o? #n%E" +֑2W;ͻe_B|Ogxޠ:O{}>rs`&|!+ck|.؜[|{ +܀ N9:SW1إ^gM߯IG r 1mK;~Ϫ:&#ݰ}ԻN07Vx +&%MZ6-".K$&ÈXY+# ;#1|'vE$ + {aB*q\X)+Sdbj~? +i|bOB5ObXo׹-xo`f~SB + Kh6ի!tztɽۄ;# ;|-r 9fwSye&ۙqM9k0-o}=>;[3xF2![3gva}5 h5c܃75Zߦ0qz3fe5q29Sc֣9ӡL?z;ѠCOUߙL.uJ@q4^jD B.A\"]("\Vܺr?8⣝9g.ͩskMhC8e̸ab{J tLpP:28m` VO8Z݀n +[pO38 lR w pr337㑩'9 s̽2_q;pC؃ +J؅ xoz`|νȈ skŅ}ʘoQq͚wRp^+y ?i +E3~odبhnw7ǂy)kkT$&.5s:\Ntp濻 73qv P_G?>>vMsuаuKJA|+hBs31h$>AAD\B7э+O7_HSG{j&B?KUYA&E8CW̱˿eC:RK']ir5r:YC3&!;r,Wr+*2a=k1.#DzkM:^Ie>k5Jm^3!^Jԓ;V_I[JT瘂Qw=|ȧ ll-}U`ޛbeJsТvQbv;Fe||w#|[[tUt7w& N@mI/CQӦ;*m E̒"!!ba!6vb+,%l_{ωœscMlᖏ)R g'YA ΡκH qm:kTriC *Ѐ1c+sf*k)PJ$e3,1V`cv8|;\M-rCy֘6i6T⟇:u¹fXwQj13~oq-$pB>+wNc7|uWUEy)߄WgL'6ۗ?169 <߂ڧ2p1&em7ap/L|3e;+wXޣ }%sߏ}/qߗns>M~{\shFH/ҿEfmԿNTAl `|(@|:k#v,fA+ ,A!B 44+ _@KH,N2⓽3wf9sgF-5"˘x+̢vA4?BFQ|^x~%, +zD< IXcѺO9r Ӫux=|>QG3C inPȬ,`ﱉMOswuJh:3Z3Na&֕bE5TTNJl*΂=׊Wz͞WScnSWG]B?_.s[wxoCI]ʵѷMu<6~nYgY)x} /787M-*/C,Ʒ:'}O7e/YzfKus8(Ih~%{-*Ę]?hO*?bS殟K/Q5t=XXKKw3aFJ-,h*,'hHl-$6"} 89!<_΅YwKJ?4;">$Ac xO֜ȀN~~aEF}bLhNVy_.P$rշ3X:Vˬf)jIJdZqr-c׸å.[]A$-IusS/aQǜ N&.9| }:S=Ļ'x[rLI~_K^˪^>k2ꫨ{\U1akvs{R9g{f-(H˟#Nk1*֩iPVwvgݷ1q=Kר鴗1lڣ .CQik&Fx.UPjKi HD!fx ';;/眵^HLDi;́EI,X`=0Ez!,"8'R3~E-%&oI]- `yyP5~(Xa18dSo\0/>{RGlPO}T_ |G~ߪw:̑?d-3@.}V ƱDM"a;z(}'poU{4ƹiUiƫݚxA"w"}C66TX>-]"F+:[o :йAc/웞?s}KZu'qsG,{Iza/2klvm.CAJ6;/`!7 +T9%e{uܷe+KwOD7gYfL1UqgADճUX ~䙷h{tϓfcuTq>)㙺^w XWuJA +.GBl&uL6$C4D݃E!(" YĿ_6펈E$G(d)·":5̷2@뎳Z/WW1^~ZP +2^g9FSZ=s!i\A d+ܧցl>\;|'<3suv-؃ځ>sco]\~qmn_ 5:&`-M̉Ly{g1z1 ,#WAx6M&TBڿp*S]XǞ:sNx>#;0Z}sa{;L8wx1Z8/Y,Űu.A,l$wz~7~iuKNPjVTZWA +j|EF&q7_O<)/m܊HADbH`N6k2CqU93HeӺGmN[̡a,9GWL_Ŭ58[>űm6u 8Wx{ DB0.1< &p u28uĘz8.i} 97rO! ~Liu)2!]7攙35aOK<:y{YZ+ u}n-qZizZ+.c9s[.yVcҺ3\_!G䉹nYDwlvox/_Ϧ%m2AByod"7MRAĥ*nE,UP ?U'⫙>tHJD"@!4x +d9s--ųdCbj_Hb&pgpHr\dt>b{e ܓl6>lAZaom9`lv!}9tٯ5n >u$J3| Ϋu֨߀{:nmk޾ U;k~SwlbՃzEG]'?Ӹ;y{^w_<; C;7Daio*m.Q{xә~N)5UJERc!V6>"V6+IO&%s{+"P(kRyHIsS"k;?`AD*9`c`Ye݊y +Yʝ&܈d&2h\="c3h! +p t1@n# مǯ aZWnq~cZ.l)-׾ľ`_3`s1ҵ̾yL> o\bN_7\kgb֍)Y}\sMe^ѽӻvy{o|7'̧5w6AulZN^ӡ}m/A"q;.mnJUBS4W\D"A wI/';ٙ5d1 @N(g/Kn|"/yB*1W}$~Y^%GȾ"#Rθ +k6u֘1i<> mSm,L~7Ø3Ck`%e ^3Ѕ1vȹz=r>wy&vW|kλtgs ̹b[\kȶ-\vg]<}3."{DGW}הu ٷGΥx}4 Oəg g[#%Nrg?/9.Q;+{/etacZ* QBH^$_f{Ϲ=uesY !eȧߌ'0=Ӥ?)*,$s}"8%*Pެ'd_ *R9k8%m@lM>+%ƪrN 9oX}xA p ;Ѕml4o=؂u`<{B( nָ xbS5d=|vSr1 emv9-3R*fkw[޻%yڮq?zg={#,e) +\=8_sS g\OtfRt^~wm?&lMK{?Rt.AA"sx֥ZZPE\q !DXYXX$d3s̥3 !CYȈ$03c1;>ͷIxX,>>>.&GE(Eڲ3ob^&#R> +2||Ok}eJ]ILDXqL);r)^+̻*{r*%-aIZne_ڕ#rnEmsz%n5?ɛ#~iOjþ䄲>Y +{lDb+ؼwy7/H8O^=CKWcNXW3ڬl +9 v6g=Gk"%s"6_M[}?j[mԹN@z*j:^'- $8'rpH$hDIC Ŀ_exFg>%)(P* T; `^j>1BG=סsdӠ +r2ǬS")rl ;y-jCyT61p>DFf`0+zOO$`snq=_<%r5{fjqH=*XeNϡȽ6Wy%4/>|%2w`bVdsCl +N3w@ڼ3 +՜3uʳyIS3nz;5,{PEIm.Qҕ"v5mNI[."DH<V$^_f9w#""! $C +| -h@̑y̛"`}iGnb|2_}n_[8cv8/pm: +M#p"洼%lߦ:2 n6hm:l3^mλB&EjD\}ߘ; H*C^krOaU4OϩY +]sm<%}U5|'дHb5B&7ʺdZI)sy1cM~SUϼESwϸt$f μ @uJACO> iM&,fsKbw"TyA <4>zfDdZDkƤ`rPE2!G̹?cd?q,&& =+G:Wsdxv&9sY89ZZ +a%Ɩ>[uhBZp +m&c-'Vs=FDp a,zF=0̵}N :p\k 68ޡK ps՘CDHe'Sas]6DN |G wV9fTq681Qz9_aqV7֚֘֋sRzeip,yUA{9 y>=[l\I6fs? D|SdQ/%˰mK/CAsIFv+[.ՖVQhh;B<"JV"??ɍ/73ssgD$,Ϡ1eD`2*i3'$Iƕ#n5(&9BD>` _'N J1M&*u/.g,A̶S7^<,*l6l{Ђ}h:C8?;mH5骉D"" "9d7Oxk5Ov{^Fa%Ȝ-o.ֲʶ=Sy,ή.gp}8V`\[,Vzch}ˌK\:.;c\3`_g.׫/h~=zs1?k{&oH˹r/QC"XXH,E$$>]E(T"%,+BB,HZb;qM"̝{;sq6Fdz/0c I G?ĜB w\:+>` +KgC8:N K.٤:5˺ͳ.efnZE֪ykEmyf(l߰:6.Es 7p`{(l.{ۚ稲n >>03g?k*|ᄊkݻa~W>NUK/CAH|;JV[-UJhxm" V؈!IOX;9sfιH-c0E`"QHYޅIcȶP*g)\dE-y3PX%([܌eҵ&H島}0,5~+5akfDz:k'U7}_J} + >8~s%iÞMgzFL|Op;k]99Mr.?m"kN^mK/CAi#"ai';;k_Qh{)+HH$k!숈OdrbK̜93뜋?1¨! Rm7F_PʓX:TsP`L˯suy")g 雀Isl8? O6` V8sl v`aZ/ė/yiqž&5jr/3w 0tssWty_}p(\=c;<pS8c>_=_!g/|cW@MCrƟ$ynXKy%֦ܗpZTYE9GռPg x4sލ7)1FztL s:n缜=24>iZȿä_FmE?].CQ70yjE7R.%QqIML$L` $eZgӽ`\g {d#0B#Y<aci渺im3F h8${'ymZ嚖k\<` +n `J읥@%*:* +/7.Vp /{EDF4>aڠ:5_pps]U>CkۇgW8f߲)\e\f{F~W0Sei4XaQ{$ūRɲO2&(8.{ZuoF=L{%.,?wQc鹶z\u>$}uԻJA೦H7-KwMhE# + +/"93;{vD$.RR'i$Hڸɧ)#͙<$Ђ*s,-E)Ĺy-AY68N /bʫ/3_:m‹H}>%Dq 'w-w@U^r+m~։3!ax_25S6Wc2S*Zkkqy/ΛC)CCڲqgI܌QΓo`}.CAh3{ vέj][k%""" $ ^Z;& ?s1E {{WvWϵĈ'1cyy~I34JRz}ۜ&0IOUG\bX/` 8g\c,aAul^Yk4FA7'ۨaUsv+OZCj1  ;uCo.{j]o[תh/ =ZBm^q}grz5*nͶZ@7Z[UQ_t=^t_RXV2^ݳP@"خ_YO~;oߡ+%kGD\?'j~/>^V}ԹN[A1(B4<O+Mjۘ-!̾-""Q(()x#,D;93sBk(ivIt!,0/FNS|QGjeЇ^tt5.I-p%ؼdU+ES,XWIdGC؍hj[ +i'\D{8™}渢i"wj%Ay_Q ֢nI5#kP1͎8 Eմwu#S.; 9}7o*A.i|NYqχ_};_tRnN,c:ݮE(K3{-1m9KAIcao¯#YsDݘ#1DC<@@DA,l m̛7ovG)գL`8F1E1S3,֜VU/.vPq9y*c^)/\5Ng|Я%\!zj?5ω]QZ)Uj)oF4\ǡ~WsNkΪ? }޹3sf||uwCja"0ވb3jK,Wgo6iIi ]nk<۪1 +p]s^= ݴ'a?4n%ݰuOSA)nM`玸1ᯀ \(ibPJh +TVc+7v~'7a Μ9psoø$ҁGw-1FPĠUDſ[ꥐb-}}~6~֋9)LsSym+w.^ڈ?qݼa{=zp]EE3ÔjY/ bϡ]3GE9)5~s z zfoo >}"w 8sߵp]b+,WC[hvP]&}r;:UlߡOXVu] uGf4oPk%BAl/ m~Y3.ɴ–fYS:)=d=gQiɊ'%Ê[dp>{}?pr?ḚuJUQFjO @G=^SDJyAˉ(b  DK 7|{_ufVbw!JTT+GF ծ4$* R&>/wxZ$1^BqI a hPy wRq.SZ1CHx%koQ&<d=K生)*qyh^Q:֓;#)~=xA|z4.Sr&^K;XnQYٰuOSA)Vlʖ?=ZLy#ZAZ(B WY(!!Ix$%{oMX|r;3uոZy*uv$y">O} lD+ZTYfLbML:эQ|%αjXϑV$U[ݹHs:Wxb0AgTEq cHuZտUhU\ѼcoR-YoY|6V\f<;L1}Crzf.cO,q#|fk57\ 5/ۓ9FeÐsBFu/uvh:ˤ}M/tnޫ.NbWluj@:=Z4n5_q+ +EF.[^ {\kMi>>]',Gm@8 h(}/uK[QНtQܸs_ҿUjL'TjLqcg,⬨ƅ]]x}Ň޹1ιZWT' q#{OI )$(nFF8H >j85Pm/xNTXSL}jTVy[QSV{8w\ϊq]@ Ǵ~hۯNW<Ν?;뭮xy1-`5Ϫoy]|;[ a\&ܿw6uH\S{bu.Cq?k/ 6ހO`RcPcSJfb6켆{??osqWIkH"'xh'Q&H~0n閴lʩIشɗs R'>顾7beX$#1$yj~ٳG e_Ns=)"*6Ϲ, + eY7kDdeu˱Ɂlryz[\Ebu\_Įʻ| ^Y&iZֲ||Ηe22GM,\$w3[<}ٓ]JZ|[o*ꝫi{\= qw2(9w S&ʱ5#s%)zfo(Wjm/CQ[?/O5RPJC[CL!LX;K6{׸^,>y{=\L>*Oe Bc^Lu@8Ǐ^"R#~bjьAùPgdЏi0^ ;A;:Љ.U9^c 1I٥s;^6 +J+A)(Rk-;͓ѺGuz3=OTϺKy9SڇjN+I ?k;+l'19P'\6WR&lǖSLޯ U-Mﻝ- +G\Hn/ y?O7WuOAj`"Á w/\sDwuh8P{Lzہss\9)cOb8RHk _ NXpOA[(-jB&46o09mQLes Q9ޢm# ]9ٸ1U[J,ir\GSn jm|V7`[Xm{'CZU)Y{!EgSud1~:/sVv\!usN뷽^ j;qi\_ +6ΤΨղ+4ݿro>fjodkj|޺bI[XִV_+;5._]\@DQIo灝!.wDÏw&uKTas$Am;ZoGF2G3_20,|CKUJ3A){pvνy5kouGp5!KknV|M j%F[hF^q}v̢=*4+ۢ]K$:ч"FpMh]ԼvKFj\y Wb6ikN9ѫ!L(Y_Ũ{z. m(=6x$?.b /@mm<#q)%xiS>_%S.j}wh2}>f/sB oS\ o^E__vң}֙cGӲ +T-C ޓ~ǬjQZY|[z'x6DgT_.Et:a}IwC$|g _V}9;_$ \#;w om;OTAYAB(Pz:h()| +r۰˲\Y`&! jDDH V +*>' 'sfy=gf1&d0x刪݋KxqN\'~׊iS{cyPoC q}N7Sה3z78;vYyY"N+ե}>v޷8>O_Ni5c9U\P>5+~`G8!vSӲ= /PZeg[LaEskUOiqE +su% 8g+n&nVvoz]sێ{zk/iMv#P j2$9ߤֲ^͗sؽ81:hD!m:̶I(|l=-9}'vТܭ3ֶGA8*̰mKAJVٶ=dkyԆvhDE ". V74,]|}ygfY3fD 2\??&xpkȡ7xiDe|7ޙ5O\2 (aD!ֻ; +>✸ Mj HQ +. +{Pnksx$`;}|.> tm K5%^Z+.&VJ8 sKUskZoSS[ZxU ۱3q5xN + tF,*Z"*?qp@^ƈo_iIյX9J|F3ev4k_w{w*xbq&/4%| 4euJ#Ag(D)[MרqCř((;zqEz[4xеUUm)2)bKU>?'TBW9*рa<>'t7Z QԠ#S1uI1ѡxamDD3>wLbgc7kxdYH|q[5IVA/T64X:NNdR~pc #B:1 lj̒rњWڷW<=nky6IO^kJ9vҷKBAwM{k;b ڜ\Юѡ46{b&uƢV-& ͍+ߤ蛏bW8w{^!5Ǟ{)ؼa+LٻW ]vjsDyWܐ٧> _|$uY+QF +Jފ1XXǖ5{E"'\HʍߙzzŧYcLIȇ-Qڃ>P"F'^&s*iʩ7HʾeQb(RI +Ƭ^jcc[nN4ѿL#h`,~!aރ#$e%O=߅beْc_lRɦ1rr WORZ}S-ʱksX 6PnY^Or&|wL~;{y` 78%+ق,l#=kG'`*=7yg-|ei:ϙE9Qʍ{WZbn^E8irعvKyc{1J~Ʋܣarc?[u\ܽ97{v]!ߘLL'^uNSAu^0r !Jhiiip 40TML1aِhXcXwD'{朙sgsے>;c;ibEdV<)PTc2*^_E /|eՔƢְ9F qWeՖmй`! c:V5F +jb} lj&┱Kt/0A>ޣ7Iȿ=q^^H[R*"oF{koݛjwXK皋3wxY /wšֱ,[Q_}[(vN*\ϊy党qK+)Kʫi>O{f${hο}dZR ZڗWr~xMc:u;OA󂕡4ۙHGcAAE_@evWX{ +& Xy)F + c $XcϛlB23gΜw3ksM;[$qۆ 4:Ѯ.w5}J/\}[VSwI*hgzW2k 1aL}!g]Cwu>eK͝8&0Q (nCwfר2+<}{|1c8 *jq T21lG|k`=[{6E5gc&gQ|o1}k{='܈*~Zsl3vK~יkOu~wS̴{^1݋)zY^DFۯyq 9+ͬYFwԔp;w?.[s=/b/Q%%՛ O:o)62uJ\An7.VqpALحmmJB88"& +ua@\%߅b?Uuϩ1dՅp{4H?hAZ{3$&qJBA ^0Yz08*^˓)ong!.|!Ė16iW)S~%,cZ˨ z hpM\%iLyϧ}8O9m0`\jAn;t%8ET#~ZdžrB1s259%~W͢ZӺf1˳";x$>눖spN=yIfm+A=RG-<4+g i:AOߩhC17Z׀7^)>'P_Piw\&'yƵkTZy71/2$dK^g`mKTQEZ+hcLhMYJXQD 1EJ/&E-\&=9gs3kXkB$^ۧ@gt(~ܯxreqz#w>ܜ$tk ^JNK҇xfI4 E;oZ48q 2stc(ysISķpU|G%_{pv1 zX?kqUTO'xw -xJĺ斵FI< {1Ģ#wLg ],v(0˪7<^-KC5cTAZsjm^y5|*'KQ;FRTt~/Ι]KG}KQm\?E"7mLa̗23 "TBAMM#P+A>Ps_Ͻ>N&Wq)9рx uno>P@4F񼯠r,'Mc=~kغ zI`{CPϒO>;ofx4F#kaSQpH2\5g|.vA>Ёlo!\(M'YQU-S+#AW^i)%UʃLY/X+w; ?:9cC:*8; +o{C@Z~Y3\]0.Y$þ!$i/.<9vg(q_7z4o߃y{^,[wkHh?歰KVAk㪕ZĕH LxL"BFY(Hb.EuH 78`->̙y93m3(wH Њ8'NՃ0.՘&I3UBA]QE:ߍNۢq|0i$rb krGq%&O jq1ڋ^hݥ~M{gKMW:mKVAJQp] ]q'X;k?WTA]DJ$Ȳ҅$B`m\;ap᜙y˙9flfhifiQ{E҅ S:Ϸd|/q~>N7z1=Eڝң|y;{'08v͒ >i|%(x/X²a~h%ʧĄLa +^=_8&o(Ge s\睾oZ}6 1q߫nEk]Vy'Sc))㦕fE̊pM2}~iZ>hCkфj{xx'w(buKUQuB!A4,/3Mj^QHE>%-{(IH (EQRBd&5)X40.o`8k?1Z3;sF-h@J׌K6%sQKG^o &pWSy'% Կ̢JQE. +zTvhOhVхN\L5 )όpWU^!P>}/*xxe5 La\ƿ,a:C)E8cKuKJmR2} ꧈=._[,`i d(6]:w߭3||s&1IpƑ׫-+v4W A'#O$wj-hK̛ar;IlcuMKQsGň\eE +w&p%63ڤib!Y&FI%"=-Ѕn +*$Q{.]\|w{1]4!^ f\F'.k=+!OFrFt~QZ.(EK4K~. B>nJ_s4C5M:S}W<{ǼO1^_1Ag0z | ;ٷ}8\~m!px 9T+fEfod!;+yS`ߎw 8NyHwӬ>dl0+EgYnwGb~V}T߽i;x)'x{7u]Nq [RGa':Kklg>9ņl)oji-)|_?#{Ց5KTQsG\.XHh ŜQgi)i5m*"_Ph AVDAA/+qD/~ QŇ{ssιι.^$1 طrYZǠXQ62xm ??-*f1ze{9wl,h,{ዼ +汊ss/UZqe+:$΂GN;І?"F8m~czo[Y ^yp +?B=3޿c]^?`K>GqG'[2[{\gչ>CAK곢}&aL& #Q/o91$1I#ֱZ| !ֻkL"} e<~ ʑVʗZۃQMtm,/wx%PBZ_u+?,9ZT ۣ}-V;w/ۼW#7g>U pL]WpRh +mL \@3.CMC:Њ  #L k_'>e`Cƞ^I^=h}U̪6+g5űySa6RS-j{l))FQcט;L ;Zڞg{Rq{nq߳рC""brouOA H 1bBxƓGn[Zʋ%(P[B%HQzp |M'̳kgBw%))q_R}CPe$3^@N)&0Kw9V \Q}5o@e>g[8!\2aX\9a/#^+[c)5\QŬ1zURQ7XRW*7#W߶{:\ێ;~*n xGZr.Xv9g8/KqܿlI۸^ +-]}~glD޿&uYԽY|>hh\tXҙuS{b\ ^fo̹iL;X6{'zQּri棓m>G][Ns\ɰi~Wn>1o*?vo\&/ m/^AΚY4[kP*EiW"in,ؔشbA "i&|ojrb9g.̙yf̬cjR'Є]?XZStzvk +]$:ч!kKAoS6P55]a#x=161acKHaBX |ź&4֘TO*7aΏ|W5}.p\)g|'lWj,*Q5c +O RR=W܏S4B=VEqu)~a#vޣhC=]|g{Wn͸Bzuh,Z#}ı|nR<|M\b XZ)]ڗ~+&^RCUYwzG=Mh\%ks)֗aՍ7~6<)ȀsasQИ)}?{.{ny +8Οi72(j៓XgxxmKTQ:*"[UkآZ)KS,5V  Eh;{.->ssfaNt!x\F:qw湏~ENd3[;Cx(ރPu'VVc\QPL2.P5A>E e|6 jю&߱V8h${zeՋ?=c7<2{~qpU X[ +Z( &Ne/\L$xRf4OfCwz &u1vњnm/;-5aZ- &U9Ω:{GrYŪ(GcRͪk5^^OK4#gntF=(HroB^ +V{v;VkN|:%nڒwYf k_U9=0uKUQuT'f F:kz>4+ jVAQ)e/ҁB +H .ဃ^{}fv̒Vhjb:Z_G'))G5"fܔEi5HJ"9<0` H|j7!zz0` ox}}WEtWXm^]hNŇs\~oF_=>aJYŅ߶iK0~f_Ps%cטN>;VU2~8 =(3+"ɫfі\5'.{ȕXz^yVL|~Muvz:>!ŹGE"W.us }-.b+8jgÿn$+Vޟ>F8t|&;N%ɟ !47={iV_?SsxuKUQAHt᰼WU#E-bJmc o2 *+AQh𻽿M >k}Z3k44.iII:RXbϘ@rhEym)ޢhI+sml` +ZYgoվ c+Ő>+uzǴƽg{O4=G:~ײEdԗOѻ7f̒jP_w*cI-c/?puP/bVJ/䞔㼧;P{3RgUNnE]̩_ê}^׹RG>ND}0 Fj*@"vʵ-)_i{a +g4\t߉{gۿ +m5/cL~F$|sÜv)r?J/~u?hSQ"1[WWuѭKG柩-Ė$QD+E""8 1B~s{ν1%q99+?)})Y1DgpYrj$#~M im +/p(wcS"</Wqw&*TYVZdƷ!nimY_n`Q+;q^c ߱Gbdqx˝֕U8JbZ3;bZ7k,klQbEʵ_WH-ݕruvx`0FjNNK^]ok 9ϊvw: c3yi}FگA+_̰uKTa8ղ v-@4si4]f0P] b +jQ:FX MP7Bw0μ}yw,if}.Ko@ +<ź;&09W ')%BR5n~NkG 5Lc +A\KKF/5)(]Lb? /Q%vk\SU V^tF0|'ZshbV]={%Q. ݶU&~a9s=b>_s(.9;8?KY[Yoyڗ٣9)E|_^y|}'qZx z׸F祮ڌ㡾TϊjW kWW]\)vinU{6>_:G3ܕL>\ך JzQ_Iۿ%+ɵ:??B`}0}O(9OAYAN` r5h[l)_mb0K)1JQ ƨ1~>g}fv1gM(xIH?ܼ2"F0FFxt}#/\:SD31=5xnބbxW0:>.iyyzUŴuTj9PƴTpSϱ'`ǘ`ߌi^C/: [x{|gXxuߐ:֍9?Ž]4ߌ ܃Ϩ`}0}asԯjK˚ seϒ=s$k1]܂c1qtXV :6~+IzA~<ĸicQUWm1̱;oz~7?hljVu;ԑi/xWxǒ2W-e/~bRzӨ9'*$ *"ZHmѼHl#~-Ň33ƘjcL5bW?XH0>+1mI H;yq:ѡxީT~\yrK6>!53f142~kܪѭiO65l. +x +)7&8K^{S&vU? f\JP|kP L~6✘kCQ1Ŭͼ9܋,_'7_ǼG~7+Ưkgl`Fak z[گΤ_g<{uasBQoCwCw-&4Kr:%~{ƿVp%hGvOjwĎw+֫~‰E>Gl=qemKQZr)A &a l6qg45mfsjQ))ڕ.%j6.{/pوﳿ)k|wۿ]|#Gd #nw#{7Za.Ancxh_f,cI$XcHX> 'v*Ztտw1ewUR@vR*w;]ϩRDoq ;":G#Ђ{<F\z1lbSיpkc^c:!qѫF1GeLYI WcbcBmd Bѯ>C[:A< (gᵃw9}9\F1ֻv>coɦ=g?cL]"i/WJ9?׮R:4Wy5\Z;A4dΘx!1v氈YeTd +[~YZS0Ll0aw/ᒵfTcx?sb\#N}ߍKG HFXs9)o<9`_=ј ;9YmuwnmEc&t,3sukHSD + +#[D bCVdK(?)чoM R)^68k%61c g5?0rT UOE/$Wrܩ}=qc`WvtVL3/T=&1q5}Λt^-֭v[rR R꼃&i0oﷻuj9Ş޹օ{7WD>cBcz_hKQg\_CBZܷQ3ǙQTfI /%+R`h6.D.6.>/S<}(ig:V^jsL2s+,L ++()7&W=eo}+~ <^tVA,Ą9dvLG)!G?hu9LTQĞ*Z: t$t6TԢ0bA6Q!d LDbK5tD- ^y9}3kWͣY^h|y(ц$:Ѓ~||2_uSG*oGx+wYI +̍(Z8ß\_66fQ\ڦ1!qkİNbJ1= +](nbEy| %>EWPg(F*QDkPWvORԡ*?%9n`kۿ8oYnD1긳3YkߨWZYqPg4MF9ўqKܢ^pw |R{ĕeIyos$[Rާ{mո=GƈJ,7n!(_KTA^Jx7 ŗ}BMUTBV6]V@ +E*AHo7tn+ucƈʫ^q\FI*N_}lׅ8H}ju\S[M<X{>gYjrI.J C+2߇{=5i|RhkFЁ)6q,uެfMwbjKLQ^St⸈qGpJ{MF|%Awj ?!UI}@{,:+?s'μGø_q\ma}%+-I^B*Z$#Y m9b&zqNK.yp4/}]EغG~=9qư]9OQ2#@BbufpYd !(D1ƈ,nq + +B 7S2ν.cfWm 匄e,5iAѦfxS^B$/}el%gR5f)穨Zz߀=|Vy&f ȫ +1$ Hkn eJiY}̫챫QUrU8u* 2o1ث9*΁)N +MXSN|_Y3Ms=P>09\:uRҽ :abA#js+S87[:pv+J˒~.5G aLN2m݆~y$S&[&qݮR$]KQ}'I\- nm.ܷh?R63H"e]EQ)"*ސ !]t7q~^fasy#颶ЩY9 lEfKSRtq5?1{a<=O' kZSNkhѾ|Kb *$">o]2 }O߬GmOsF=1<Ǥ,X*p}_f5uisMakqU\okx~' +紃#ʼn};hZǟ?g1?So\7 g]rKmҷ}x<;uF~׹!:=$w5|/a'^ ֦tu.01[C<׳ߥlB9qw$0(!6 w8 w8ćvHH?tرxmKAj` xiiγWm ZǂߙXt2{qqڿ*紾au;d\KGKB~{B]|MkU_tKuKTQ:h&ᮝ j"N325M-ޥu L!q#B+E Mta9<9猙 e"2R_ޗ3?ZQ)FBc41;f^ 1;}C;&$S%5NK/Oi8Р:W'/1ʵ'S~]3@F0%ѼilbS++=i?V<iĸY5[5[ѿƬλ|b&W>#rX" +-w>cT?Kk_- \EDk)qm{ wY3Ή+klT=1/ig{Rӻ);]XޏIGs^`wμǧ_Qo#钬;5j|cW?]OAbLrlś^7bE+5#B& +DES A! E0'۝>ή1暩w=&OH +noZcI:ǹvŤwCk#rCj(.TNڡ7[ǭ3 ޭ?t͢Wu8UO4gƢ]]0a#14N{(i'+yceLa5wk/2}.쵽slaUec.Άe -z>Oꡬ~>b _ŋ~P : 涇p{C+Yb!/wt6YH+wLFFR}}kjq׳7~)wB32Z9y= Mɨ>C=]UL: oI}K\V\}ԻK\As] +k;4'X7W]u}k|"Q|E!SH (o`"ŇYΝ93gkfo,V# S+hD",W>`32Iƌc&[y*=]| qssA>XE KpwBxp[rڿ.eF?"y<mKTQs+$f`+7nۋ6&uq|p^T ,AV +Ѣ(..>sy{9Ϲι;u[Zp+[ڥMxkˠSVqC('d],F3y<@A٠o d9~k.4ű7z#*ma2ƹieO5{X&>+X*cUhlေWPG'7ܑo4wMsY߰wXX\Ui}5/[buGTOl7t y}Q{g+E|[̫^йT6g:Qfh}S{T|] 9ϼgk7SڣI}!,?im(,ﺳ{sw2Geoi~_ggzf;Tש9ck/|}ʿM;'~Kٿ;NC'+uJAD +ģ|.1%Q#[p'E + (( z=+49|LtwMwHBvƴZ^|? +a>-mni)R*u[4K 0LIc\Z{ pJ0Iz|N"8O=T^s~5%=l}asZtQO p Tvdѩr2 '%%M}\HڤUmik-xuKbtJ6VO0(2)Ăʡ~,Q:ԢM<0&3ڪ8@Nq{O} OsxBl{j[PaNEpwԿf1oW}n)\Zs xecF{A9{Eq~9m5`o8|SXFƝԸ;r ĺ"[O k_7P֬kSWX'ϯ_qչo|9q(7A>߭Ckժý8} ϴN}KKBAE_}>CeVA쪙ajҴZ0"hSVA h`iޙ{̙wxEāA!Aű!1H:8V>NJ 7f^}~a5YOȊ `fôa78E)fG! 0U 8uiȲ)Ĺt>`f ES\˔UG&h+ex󌈻]v'v8Fm>5%sJfme1׾ ,}̼GGp OȹR]Kknwvs\p,QE{;PnI~̳k|gOdn^DP 7(<keHg!,s-25iQ X&~Amĵ9yvӜ=&NS_^u.CA9mB,lوhO[RjX-ZFBB$Dbbr9og(OkЂ82B^)W;zan 6`h/3v\[O}$va#sx/x[`jWa?| \q"<=b=ú)oC}ȷ=giss6W{ޭ17F[6ei'gQq}gdcs9ٖf>#?Drk;sa 9I~}Xq OyJuK/Al ?EJQuoh+u!BD"6cމI.43s̙fr)?$cA^r[ڞ:^B.Nَrn۞0g]8c?` ۴4N?m|tӼpWOWx5 [4]#5kZ]O5<Čf1yS;a-]8->5[w]56=5k]e#_*_{UUs|㎍zԈyƜ{\-k5e\9dttJxy.bþcycJm8ǙI_uG-w{ )vи?}z]]IJAn9\x͜h`"ql#qD A("A"2^<ū &)I#)QLfxٶ8#N5l'Of.֊MTq"Ӓe.q.|7R7/E%wҩB $[2`eNF5H2{[ٖ=㫏#R+9rRyj1N6h[mR&&`ǩQ}_XM\ͽ:̩I~^>Le, \}kdwY"l|ne=Cq^ȷ|P{-9$n7I=^3=suأaƔĴ;tϤ=cκg&&+Ɯޥ<"rȘ3􍓧~(w+RgoBet].dAbaa<ރ6j6!wgi 3gF"J,faĝ^|roݪ:uS7!/^ ѧ:%g)$F)fVmR~26۞_w,v5U1#l.Bg()TLZ1@L*tͼa9'{˧iQоl.ֱmmJ\Р6Y/̪1K[OYs+sb*Oqol[c8o{em>ZІ&7879TWc[A;gk\IclCmS'93l :/1Wc<(gFe.0nU9lX8W9 I2'h0v{pļ +n5+YȽLY=ӿ/CQ#-lXb5 (OiU5V6D&"H0 Dl,'{O;w/c&/! q9Wg!:GE.E'%8_z, +,/`mkg:x -^x!(" +ފ b' +8@LO&1HH)I#Ԙ@./&MzDkNՔ0gAIjߗ7wY)xs b6qgbV}(֎?5qLcR"汆mr1uճK|Ԁ2v|sXP xe e=r'ı\T7x;^pu:+jO*yV;X^q ٘*ˠ[SQw#d#י薼w +:3|KF1ߝ'~*>~ߝtw/~]Vi6qmOi>u$|9? p۰mԻOTAYi,) 'v{Yd!A( mȣMBj2&w'7{3sf ![z eѕDm칵/qMwJ\}!q}'$(I^DZf*;ØGZwxN1]Vm ?jwclXpb+PB\޽+)Yinc]\p ;l}uHX>7wB л fpذmI/Qۮ,->mbkk1fjXH$"HDBb%tsⶱ{=wy Zp' + |QL霗[Jm: ,z|;O@j'}c*P:e[wC]F\3/ğPP_r=6(}i3j6ߗnpCӱ>vq~4֟g:U>ŧγtW3XQ`UȘ0;7;Ɛ][-wuVVVWa}gl>W#V?ٸd+~\b~=˺_ |1}.CASKHZmݖV*UmQ*>B`oecJbIMXrΝ9gfz"RyB4ylk0)caCf!1?6.8)(>\9 8d4mqIp;o=I>Sϴ3&EOPt|`NaXwt^oϥ +{ OpRΊj-k:ǚ^oMլ* uhG>b^ٹilYy7iϤŝOA2:swsNgݙg5Ӝ[6w1wbpw2dͥT/-w7j~Rtۗ5_}/&ݚ]/"VuԻNAL| +_W0\V`"xxZX 5vVDqŗ͞9sHR4s! Y!Ÿpȷe8F +0 T: pcT%}Zpd97SkqeX5 +38_"CӸ| aypo@-#gM3?=@Lq\ o1\Gq㺧pe^wYa/m8kzcqk}6aP-6SHUGe`//sZrtyQ9ߤ~+a9xΫZC|kYhŏ6`<.GJ,CyʪwikU7sĝ(W^ /ςڷpO+sc"5~چnǔ^8PrW4u_}lx>osi7k_7/y~;v]m>b@9ւ[G9 guVK3)+]nU=%՛ҷ1S߇ t?Xs_n|'Ρ_9u.CAl-/@k)][oq A\@ @""M29'ssfc":E^E11ю+x3%<_2LUnяf6qg +gPkHkjCZS^5Ϛĸ]d|Ah9ꔤ{RlP9ms4rgnƌwŝww/Ғjswokw<ߛ9ߡ_" MuKKQO!Z;+iXi^F-)d*ZAMEAk&hӲsC3g\9gD$ 6F(FF-! +io!iLAE|gų3}'6`fKటq59HE˓NW$HQ}<{pcXʰ%'}ƹiuXM8KqowooenUg){hKm1U_3cN:mCN0v\!c?2n8G{kۃxuu97l/}/jzK\GߦČ:U" wzY~8=Yu8~̳13&֘ڰˑ63f{S{&Y0-:4z:78fiGv mNSAi7.\|ZKB)-±RJ@%!! P7q!7Ntr⓹rcLsIxD +HeDY5 '#Mbu (^FrHb y/&vQ +!ީꎍEa׬27RC `;<{Zrr> +X\x7:~|d ㊵h=e g's=;h[~0h/_pF#R>zgα9I蝱kWWc #:I;0ŕuݓ}VzweXg os[R{7ݷծd=J5;n݇/w4 @{+y{q}@J}$8º_l\zmJBQѠqP&A[ Ԏe!$]A a4QэY"hРI 6}]{1&h ,%1}#؂s`V߉1tu{P,L$%`L)X+;(_/CiΗ`}kȵ9f -cP=׬7eg +[rЉ7gc. ^Я:)g6*6"7Ǹ̘7~=Ї Ϸon391u3[g㑺W׬u޺߯|ѳ{K9isM)|sQe抴m3fكQsNC}ﲌ>j{Y~cE׹56e:6r?/s>szʎmԹ.DQc4 +o@ e0؃ b !J%!*o 'w{:ܷ4Zh tJHJzkfXɨ\:W.RYG/}>'93nMcU?7!`- =/-&#޹7 +K+dQe[eMfoZVeC։wgr$8SOUJ~?M1/'ϊ}Pfe,~߶;')*1r_j0?L^_!R;':>3<GP$ɰ8HI2ۜ.d413܈ap};Eukt3I"ljqj gs?Q[o#z;ho0e.CQ͕gpm)H3oìALp<-haRa}Ƶ5\=}+݁U؄#`q3!FM|,zy~` 8]Xa}Uw +f3T2{Zf_9?3gcƘDCbԥ#Mp.ט'ۼț&y6>wBҫ &E˜f,KܗK)DDs IdMNUQY:Р}WY"/}z!]\%}^:@d:5ƿ-/?,_"#2y#_=5mu֭A.WI7gQVe_{Bcf?YWynomȷïS ޲'C\v_TCPǶe=>ON\vwN|<1I 10 sk`k%Ϣ;OCCq!O|K!};N@r @$$£AQD< +/#F+zbcL# 9X"!d{J+/+Y5n^㩸y%([&4!:TXg5VM]8S8} poO|>5%5aWc&afv\y~bwp0[y5j;s$[\l29滩q~d9mn+"u_tIʼH ;r}\l0NZk!ϵs9rr+P4p,Py|',ߍ&5[ +|ԻJA_ǰ-|515&&D +X"Vډ`%Vc̙HVDf`feXcfb!``WecOY6cNϑ!o}#j3\e'p,`")$E\`\ei~ס!G\ϵbՃ.cMX~ 5hp g5LuyW^k̓٤:sѼČ<3?Oͳ(8=xۙ?eLwUxJ~J2V#C^q:v~d^v` {p˼Me̴-Ru}C{߼G-v=u.CAֻxK ;ނӛKڣUBDD"K $"i1lv_m茌yN_KG#iJUVPe]Ǯחc\as߫|ɓ#rA=zv{yBjr&ɸ[+ul챀ƾai&+J1X4h$Sm䲟ŷx.#νxP +ë,҃GD>p?#E)m`/p5X*Gy[c.0i^G<<֦?KX:Zڇ`p{!l1O%h1<@v9KxoA^@8zFGs ȽlucNavu15T9*W`>=VkJlXKTiXmy~6vΓ:9E7IB!=59v'<{ZǾhW`,+L'YuNSQťqء# 0xU%VI&Ł `Ȉ ߊ0%:k3{nw0ILa\H&=iTyE)IpLJ{3gPyEfnLA>y=t,~: +U ?f}f=f#3枘>a{5N.z'eB߳xE,NWUEsZ;5%Q _j}o>띪:uMihb[8c7u뢶Y.ud~;Q~OU^rbw~_%5ztsާޓ~~-n*(N.X(֨1yw!Mߨ O[7.uUY +9c&ĿonuҰu;KA'Ieoe!؉@ BCs^^.р7b_rhcowgg3;"_R r`4E MeHyVe|shQfѪ,V9KH[-1*hm*9~Ğ>:X: &US\H'b*5h:`eckU18[PcLN=pqZ6Gw9[Bk u0¦ 7/٦Kpx ƮSFFqt |#{Mku +)Ykt`sH +$lQܱFÕND{!9 lFo>0;E" u4_+R/qP83&ȷ1=o/r 8Wx eC+|yZfk5*7 Ђ\u)XqKUp[|w]|fk|2s1\ kf:5Ca9ejEhQ ;!na+\+Q\Pem/Y ,>Ǵ&r&9cTY' uBWz١p\C>TbQ_l̘AԫQF/kz>4I3FQu.CQW<3^-GO/7(1(bL\ffb$1xӕ|ٗ׿^""2 NVB$ȃȁ HGGhc4Hr>~1S#.*WCddHd +L.0 +!hZ1U.8M%E6% 3p v@k~WT^Z=ƭu_a-`@i pGL5bq'7|#]?9̿^{pK:b> D Ƌaa4Y3{'=}YuO7;%i] +JÌ]vd&֬󙗉$CpǧE&fE0;T a 晛þ='Gf`3~I}9N@q8G + !`E,bA@B(G#ˡd<6,:-9l{XW\ss'>sT{g6ƛYA^z\7u;e-ϛXNwD73}뜨8{Ok=NNNK!^^J,;S 5rUWU{u\G(^` П_ĩԹN@dj vb!@* +DA@HT@AG(őywmY0j"4 > ]BB!Z&y$ik03f/cMKP@~CCЙ#Tv>ټ ^8u2RA,k]S3KX p7pñMaks)c+~{ nay#u _ȼg̼Xvl{ + W`퐙\QBaa +) ~D:)eS!uyts}4Q0,Z؃+[s89㶸dkA^VCPs G9M2P>{^yjnפӼyϺ׊cۊM;>4s{ҹk1YȹOYg}=oc^vqvk䙵?a0OLj3j/PZ䔚$/*_#Hm Y/dmKnIo09||^|NS{Għg(g"dM\ƿQ3_6͊=X7>ٽ3&yTcH\_Ҥm԰Vm9N@y8@qlǎda1 "6AACEDn@My'(>َgefܚsn6 =K;{T5|CӇ1r2# FcS1&' Jc pPzl)k)yzV|Sy#*L߉yp pSܹ + FgϿp5s'R~j(n9*^}3^} o ?)L,Lzd2ucmدgy/k1W{tؗs#9> <_3Olۺ3ÀW!ϡ}#p>'x'g/'[j̝utk|eYۙԈmZt=j΂gk|}? J霸 S΄=MB_M{{m?:aͿ!]w30kߙ?p_5bl k~SPC}.Ax ZMOї1CbK,\a1ai=<IgKs㜛q{bk>]obѼh?juhߠڌmO/CQů/K}zZJiʂ H",W7gLd/Ν93Na1,;<7A4 0 ^bD }~M:$1DܫO&r`yccCJ_B[%&^uΌ^}El9`>e.xgߛɓVwc2oy=mP2/Ru(k* g?#J[Wz?k?uv;-}]8P VkgC:ymt{m~q4g]L԰}IN@cpIO1c bF,,`Kœݝjܒv[i]VgW넹c]8ffM͚ +wD1c~bW MN:mYKޏ݇vē{Nnug)Kk^/јlZvlYD}N@ Čs0,Ҕ-IHӦ-110 l0, [-YVӝu>B8 !m!=8[_ +. #_!p|'P#37Ѕ}"3P|jp^xa /YeUh !'Cqs[P{HVɵ"ߐkz=?!`>RWbiُI-}E,3cPWRg}52"cc5iIC4W=s`K):Kgx]Zb,ۀչ9);#s$p.`uIN@E+\5#&vll$1 !!HG`1p$~)JCOTu:"2 {D$=x38XOJ8`BQ_x@C[| +l3:3VsFMЯZGx'` + Y'1q% l@Ø=L@^Ǧ^^Ԡ~fL}Ƶc'g435Fr;Kpĵ|-ٙ}sjy!/-W[{ԯԬ#72=zK:{M j~kɌ]Q='5W(W?1Mx'hyKVߣ2&%Oj7?#:kQoq<Ȼoކ=5!SyðuIN@ʎp`$H ,`7%Jxk"@_7hCWmJ &p s8#;H)ᾈ4VLQ WNyIYC8/1f2vg0`/?<ڧ+' 8+3Fgcp7%[u@ϽU=!t.j3d9egcTfN1.=fކc֘~jg:J;+|/&?p Zg5)W<4ñɛK߱myK3;=^|wsjj+Q6}-c}.Q e <0mH6HDBX HXI<%O`\s**7ŗSH[DE",REң-']'DcuH}p +^8Ȩ藚6\ϲD +Sj:Sf7܀[p.#GV:C|wpk"=jh~h9o<Fgh슽hg3E]}9O')& +df_A-29nE&a!ؑ} I!rnkxd:5ߞ{Leہ廓2d3^=>x6괽r牾mkhJ@'_G_j4?j?P< œ x cz2\Oe\ϛ:yj̩8 X,2w\ག154cyR֣*y=s +&Y +\/@u#5ta8/!br_VZ_Μ +6whdܟS` '|awj@GAT' av\Ǵg[ /pppļ w c:_]><+s?RW{2{}sߦ#|{cT{_wN߰mJAk@S_ħ5L|=w]]DDcHL} co/h >GDVE` d ')hQ;so]I:(>O܂ : yS\hv>+70c&D4.23V]m\p b6h~)cvLn`F|x$9-ڏghn@c:߈D{Q励2sGzOVj2߾wpuEºjlg `wѐ&92@M_2^W=O;;wsY  !hl\c>F͞V桥2}RG +bֈ\@ΦΜ* XNckpUg W;w )659{җM9te인3%t).ֶiHѓқ{[\Ԭ}/Ktxca6o+@3޻W͒Mu܁NK=n3xt(v5=zַɻo&.>7|Y[{|݀wjm2zsʎuu/XJذu?/ag"E*[{nwC8"F": +5Qk$JBy31^2<+" Y$-.@hXh=o=ud`"#"cs"wCdSdh`t@:-ӧ)I<}i =8dĤM .\+p +QĆ~e޹կ:5S:cWcGKcv>G;`:+nM}׭~>My0Z +nj'}/G^5Gkw9 j"= rnҿ=NdRUsz{2دa mvz_ϥuԻ.aJ$:oDyvٙ*B%PPiI4Η|=efA}SD(}"Z k65o6l6Ӄjh{]!9#W8r\y[k0 <5X%@=ϟ0\ <yRm$gҿ>3\rPk*d\s2)~F[syBTL=ȱ>n:Î䫢9s9{> SD^g߁_ѼsΥ_/{`9'7ܳvOm7 +oplwswY-}qu9NP p .((8$Ď % tZ.@KMOhŧ-"MIEC]H߄cAPr½HcIdfMdv wy]@\<'f_jt ͯ5o.cGz`}op;&OlB +Sݗ9Hum9k2nu`ފg7ߧSxOW8mOɜ֥c~u XӀ},d.m_߿ϯ༒q.^<sx/)c7c<^N/]s SO$_ +,\m~Svd:fnww=&m;N0` Tt\cK + +Y'8&l DAtPP!@8H!'9=8ιMc҈v +lAilJh^ǹdmPp)׈M"S +o!s&pok 07Y7MKj׈^%d!l 1FԞ^JW>#8d?+c*Z+u$ӷ8W=* 8f 8g}g(hKGb͚uҋFјyؚײ{n_|}~ރpf`~ה=&{|kA7܍m &ғ |%*јw'=B;rL95nx+з#-ߑT@}quN0M_H4MZBJ N\y ހ+Ẍx׳㵓aag` +2 B|*ϙ%`N*Ё#p +`ZڂTd~e~ ƣ#xsC`ZSךK Pǂ4̯8ZS\w1o`n51GjCW{'obzx> 5 ֳxF'<>col~I|ߩ?,&=/9i< {[K}X5߁w^]O_#Gֹn/?"4ի;<`97ޙg?Oe+w _9pF:w gLg0Zϔڮ{NvݲGy;MӰuJ@;wЦicӦ1Vm*hEDQ/E| _,Gw9mB؇=$B;31zڳ^b"NŅ8>U{ߩi{vW_;mw;x۷yOV[Z'i,}KNAl+2Py(ho W.L\.ti<~!vm8mAE}3ǏElBr 2'Req'N-cb<)%[?}ᐱk׌;XvCm̡BI![H.^^IecuZ{yw~@%ySVfM.YEcӰs]yٷc\.|1˰1ߛ9d)&gb#~Vw7@ޫ:v.{':Yt;#G﾿6y_{|ֿ ÷gNP LKBڤIKP + $X`a`c̱t,\ro}}}+"it $.(AEtx##ru .O , 0>ߢe93Ѐ+Ev^Dv_;?Nu_󯺇sE3:wg3WgS#p V܃ z0e>-KjsP3}F[??CǘN]=7gf xw}}FŚY83Oſ 7rw`u{>]Rk;3^0:m_WZl2ٜ %ξtg>^!OԳD5x"NADτ6-#ABBBG@P#UIMsI==]5=UfV#sX0`r)8 +qit`Z}P3kkO &N'uqdϋ֛w? [:%[]VϺSOԃ6x=!ptְMJA+[ 2;d&I& EA\zkn=.>f^U ͬ2Y`;;t`u.mn=8e~u #f^' سE*NG_9[e_Aj0' S:yfdJ] yy_.R%fNj!Qt59$-Y ^JrSuR5ҌLTl,_Fa_e4gvaK~;eW +firs:upŽT.n96SCxYZuXw`p^2֢pZ u861sarwN0Wa Oiam&VcVйzW~޼!{Z?ov%}=N@qSp9Dq6ĀB QDI4 Q-H3V!QS;ov#"Aװ##Vt=AUڒ:: n> @-x`n5*ЂKp Ч Ay]|~9VSpuIߒu7R4[{moٛ 9mz'0coqF?"[`Τf>A\^KQug^|Qht8^4NXUc̹Lj=L7_ֽi J@}cmSl6m'<R +*"x?ff'u%ιmfDH<ߦ8^Z44oua ;8J)T0Ccq>={xs^k+Ԗq6\c1n(!'OϢz**( MgQ^S&ľ淘\_p/ p p؛G7U_sw{^+wFqt~}&fi= 7)HI`n k~D0Kp/ + I %Og-kr*Wh4˒v;2Lj(_ek?8f{A߯xd;Tǜȿt6i˃}iyC~TO;:*Ɣ圄|4{ÞDEZ: +ο!>O.AeMN0́8 +Wu64.+B$Xh{b4JS2eN"tsI/CU|C$-5'(V~xspV h[}Qj\O>1!3;φ_%Qs5 5ߢIe^v$F%akzv`6`Mߋ0_^MWnC{UovL-CӧCIYu+/|y}[jAY7gcwQ51}! GBu;N1Dp ε~X + bDJD8 J*5v].1#' iYBq+ ZoPޒxSE3Ox\:;0th|GD} _HY܁7vo x_h|;{&82q[XYU!5s(=שnW"kК+':W5S؁/sI} }{g ޳fku}t\ =Jq`89gx`3xN[}>GPSGfFkgN'iy,ubkfX_;ww坶~y\7-Vu]N0&ı(OKpiM>Uެwwv#bWd5@7+kﹷ[pv٥qOt$ZQܓg/d$uyH%;:^ =S}S#xϜiZ;\Oh|r]^j:53{ ~#..>7~"GX, uGSSȷ¹hsTc$}mL|v?}.݁|\Z8cn}_0=Mq(Ӂo0?l;I:`F4j܊W1d|V=f#T@ǥ-8y1wB<= o6~x$g4>@oX9CnŸ7h^@u? w_k0`Ogh$DWF߁s#5ɼگ#< W^= zC~Ճ7|@Rl-f + s,'M:u[+EqٯVsM~owEEj*=zkV_|8miKj@DĉcYrdolY UAQ[LgZJ)mRJ[&tAXP31zJ~&KRy=Yރ߰`}׺5&@܃[#\h)˷>3Kp sZϽ S5gcx5~ܗ+9htι=|Z pȰ}n0 ƉXr_d,ڌd%S!K#i)eo`#l4geƀֹP>r?=4`}5 Okp_1p]MK߄)n|{ϢXS>JS`/q6{\??~v+ND/Y\'ɩ;V$Mm Ooܜ˴.e\wKTvJK0 DscKҖ` +pN +W k'9cݤ!&1 V;h/d@/_넶qϰ+}0^I%b܍7i2O|TG._t\a +Tr'sHn? z=F?W$3ڏzk 3Of>$rυGcj[ѷ5;[CiڿѰY0 DsbhK.lb\p +QTŎ=B4c zAZЀ@{70Z@u73{*\qp}L {ŷ3Om|z9{c_Eh0It''a<}ֳo& x.Wen6?+}'?.틳i]?(ڮ;5.WX}u|kVCI0 E}b(mBK p,Z`;"RH,5X +8kC= Q9+;%{3nu奼rA8{" 7{BƟgaŌϛS[en!r[s.giVk̫3q#Hv]A^tw;һb?n2N۵۩q~?3{n + +0jM*E xP~;wUɿzO-\_"MN0mv҄KܠW鎱:u)vfy~dҘu+aJ'x69E{O5F9N=PRX-3ui _&tK:5ԓFjm0hm-Ѿ|ޮ3\Hx3N˸gR zUcߔ?'4?wL=ΚugfdɽzN-ADܜaZ?KN1D;p"'`&{>DR6KB}†KЎdG,fqW6̞@vBNΈPwș@:N/~/@NAKF_7U88/s)sˍ~fFݲRC-}UW|3r+9 PW@ݵ8Ls㺞GyZ|:?ηmɹ=<:[g@La_j:kqYSz'w[ӳk͠w? ō}Kn@DMn8Kl RHQ d8 +jj(Yv]OYOUs|лНdzO橿uSCU[w̵wf7~@|eMN@ !$m@E,X T$3,`Y,=VɌR̈Hzo<5z"{1У־\W:W`RXg?~=`SoÎ=nMugd};O)}ܛ}b/AO1߂ݥ +xD̓ oɛ8×lә7oZDd@ЂF6`VՑ\/AJAE+2q&3ݓIbE 7W#$A CQSEwuկ1."WKhAr,2sp{Ag7nHKOh/[Έ( VdN;;7s-vO :*Ioyf7؂_b.BD_7cb<e/z܂{;' s:5;)txVq㬩Sf^ip)gMsܿo7iF4)U=Oԩ5}yx^#u;N1 )8'UZ;-̨sx6l` @~?wAh6|G̳l.>N qzx <=?빢?o(yַVRuLԧcڅkj6E-|ccS{ޞ:s̗,;k}]QU?8'׾9lkx +^~Mа;KQ'Gv7k*TJ&M E*M҈3p^->;;{foHɞ5c6fm|  { U9^:{#0b΃D7ZL!ۘuB~~ , ܂p^'x,.S]~_~w?d9kr>p]{>4;V+Gs=7sJ yҨ7}jq]Y=CW{nz{OAN@ E wT,L!)E,(M +cq + c&xj|?Ml!Yy t%@C(w-5zpBf q祻OԟtKg/P3)ѽsuM)ԌQ_ $3=iqD4x`=x>bd9b\} _j>Ր7=ϜO>Ͷ^̶"nmvZ%N{j;]e͚~t/c~3zS<׶ٿ6%]n0g)ΏIoP jx2=Eoӱ:#-X<|Jlw'"yu,I)N륡 l /"@='BTts[0ݝiε8G2yrtPg {֓VLijh߯[}x_gK$9JLmswlfx7> 1ϑ:n[[˘qyo3𙜎OΞL55wpƷ=7Ǚx27NAqw`p +AcwH8B^UT؍/W]=R?F\p:">`LjKW=N{on|5R"1f͵.ҞxqQ܃ 7\+V9_s0c>r}LWgW˄x<׶/w |/I&k/KW>/~o1&qo xZoP?t_5ބusjzLCc3gn3ioxk=+N[%uz=?M"KnA D Cp @LBBb#5prKf4Ic۟jMlF)IFfŸi"c={Kof]ݏ}Q9Tw:5YI*w;_<P?g/@1n1E{"5 (ER$5 GHACs(RCXpt5&"|_|Lt?"]yz)^o g쯒Xm'ܗz~izK3q79 zׅ߂7>o8G^{{ ̬]N1 s6n[ԇhOQc1C6={SJ#hXa}Wʷ6\z~` 7#yJq?gYK]0'Pg V8{g;m#8"wn}e=u;IfQ]暍uqo]Bϩ޻6`[sfs gp k7hz0 D-mӍ!N,ߋfOmǓqBBX +0dF4[^bZƈo~!ܹZ;;l>}= :3A b5O榎m@h2꧁͸'x}hG =O8GĤØ5}R&㾕zK'n]},xvj\gC&}؃Weq|[Ib<'^|/կgK0 D}b(MXp$.QJY<)MS{<*p*ÿH j9MvN4sFj̨rvZԍdPUBPߓu=AfW=ڷ/?Ἔ?ѓ&hqI ̃׭}֧phθ'C#={9y^G5f"`Xwы`,xg/_]rm;0 m}P lAtS2|j:VιDCO^ G"{wGɭQ8 w)܄=t gyxs'a+\sNDs@-|jO{41tScuj}y}Wl|B+'eDSmAC7 F/`vK3=ro(E=Oxfw/A +0EsbmZ* +K7!2z(v5TvJic1/kAOFdgy^7\0ÿ'υu>\ng}n,Лύxi~F;g.p}-1lm@"D(M%hFY';{N)?}nە__]'84;T @x)Or7n-~cLѿ6dFѷen/s[:_}hGW!ˠQNg܂pk`\c:q?Λ{ ~ɉ}I\_{yS,y@TSyzX[+K 1 DM?4D|]'@p 0AɌ63'1[T`=@W}u]QCw.nj'x^ +sUs$)؀#8؃UsC@w6z)}F}jQw[ܯ<֙xdzO +}^gs_a!#x=<3uVƹf)Ob}[gYjV;w?1&VM +0ڦik +* BӝY3,ɢA#X򷗺넞t uUox |wMQVn:_I׳ӽ^;TJ>k^peuksyDOEw< sܸ,5%߻7Te _ZZZ}kNA8 'V9^BOOo])ge=ۏZ3̉# + X 4>ǽZڷKuXZkГ6H!2kf/<GG׽*g?Op? x&+?TwרS-3 OxιbξzGš;~Yy_Œ;X۵J{wWfH5^w_O+ ak \';0D@H/|tqJJ% 4+œzv=kYf_$K0"c2<>%DUOשx.h?$ςBR}k{ٳk2*wV߬}5A]_`(|v<X7X7of7%Ka:P}u%g`>G!ԏT}wsbHDtlFz5=TMߺӷ!*}1@  =qKH  +QA vYqSع޳a %@)0@ZO\~!A_o5X=?kg z:)ܱqfxܝ?o1VҾusvpk2yP?GE_YKuN}'WH!։xwN߀}cq_rscL[Bv߮zS2zʻ' bi +@ S䵴tZۺ +W@^ <2cLIDh{RMⲿ-؀z$0; tN%}{$l-Q9('eo&|DPZ[Cr#ۛܖG1yGDY\ ~f܍8oQ}~_ޯɥ+s_^'`;Vhzavؿ,uWΐ' zs=^r;턽|D~/OY0 D}ahnaEp >SjK(ؓ"R)Jy(b^7U&Jq$݇>{|Ur-s5kbgoX}QQoozD){ `n<_Iؿ/Tֿc|4]#~4;+Y +Qa֬-y0彜v= 0  M[TK 8sX`[_zQĎLR֙ RJݟK|#DlHmqO|vp a&:S1+؋%&{RuHCxoXA$GlŜ_q~s<\?ϙׇ^'槑7Z;7x0~7\=Nm+o8ofܽzP; +@ѫx߂XX +6v6+^E30kd1cD$TH" +$#}մ3s X . t*4-ߏ1yrE`}q渂=kS/s* շOBws_9z*k3R;]g, n猭~;5~wؼ/hT35#mJ}uŝ)8jNTc]ODQط` +;W9z1?ȼ{'RԱNA_&/#q!XIBK6!l-l?I&-vvgwvhq2+2ϷR룸zF.>94'iBK^b^W܍k^MT;z9d[94Кd_ +6<=O)_}o_GOk%9B`(Z]ߗ98k+\\W@h0;-=>z'Sx(O;<1NBA"x+oO#$j@)lLION޲_2;;f\+G/C?|8)F¯~N⎌\݋cd_?I3y'Hg꾯sz} -ԗ'7Tc}gMun~{)2:sJV@tH /h%<[s~o쩧M.hHS.ݰ \ No newline at end of file diff --git a/Tests/test_file_fits.py b/Tests/test_file_fits.py index cce0b05cda8..1c1df0d980d 100644 --- a/Tests/test_file_fits.py +++ b/Tests/test_file_fits.py @@ -6,7 +6,7 @@ from PIL import FitsImagePlugin, Image -from .helper import assert_image_equal, hopper +from .helper import assert_image_equal, assert_image_equal_tofile, hopper TEST_FILE = "Tests/images/hopper.fits" @@ -22,6 +22,11 @@ def test_open() -> None: assert_image_equal(im, hopper("L")) +def test_gzip1() -> None: + with Image.open("Tests/images/m13_gzip.fits") as im: + assert_image_equal_tofile(im, "Tests/images/m13.fits") + + def test_invalid_file() -> None: # Arrange invalid_file = "Tests/images/flower.jpg" diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index b49a41a0ec9..f3f0499f052 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1339,7 +1339,8 @@ FITS .. versionadded:: 9.1.0 -Pillow identifies and reads FITS files, commonly used for astronomy. +Pillow identifies and reads FITS files, commonly used for astronomy. Uncompressed and +GZIP_1 compressed images can be read. FLI, FLC ^^^^^^^^ diff --git a/src/PIL/FitsImagePlugin.py b/src/PIL/FitsImagePlugin.py index e69890babcc..07191892506 100644 --- a/src/PIL/FitsImagePlugin.py +++ b/src/PIL/FitsImagePlugin.py @@ -10,6 +10,7 @@ # from __future__ import annotations +import gzip import math from . import Image, ImageFile @@ -27,14 +28,32 @@ def _open(self) -> None: assert self.fp is not None headers: dict[bytes, bytes] = {} + header_in_progress = False + decoder_name = "" while True: header = self.fp.read(80) if not header: msg = "Truncated FITS file" raise OSError(msg) keyword = header[:8].strip() - if keyword == b"END": + if keyword in (b"SIMPLE", b"XTENSION"): + header_in_progress = True + elif headers and not header_in_progress: + # This is now a data unit break + elif keyword == b"END": + # Seek to the end of the header unit + self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) + if not decoder_name: + decoder_name, offset, args = self._parse_headers(headers) + + header_in_progress = False + continue + + if decoder_name: + # Keep going to read past the headers + continue + value = header[8:].split(b"/")[0].strip() if value.startswith(b"="): value = value[1:].strip() @@ -43,32 +62,87 @@ def _open(self) -> None: raise SyntaxError(msg) headers[keyword] = value - naxis = int(headers[b"NAXIS"]) - if naxis == 0: + if not decoder_name: msg = "No image data" raise ValueError(msg) - elif naxis == 1: - self._size = 1, int(headers[b"NAXIS1"]) + + offset += self.fp.tell() - 80 + self.tile = [(decoder_name, (0, 0) + self.size, offset, args)] + + def _get_size( + self, headers: dict[bytes, bytes], prefix: bytes + ) -> tuple[int, int] | None: + naxis = int(headers[prefix + b"NAXIS"]) + if naxis == 0: + return None + + if naxis == 1: + return 1, int(headers[prefix + b"NAXIS1"]) else: - self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"]) + return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) + + def _parse_headers( + self, headers: dict[bytes, bytes] + ) -> tuple[str, int, tuple[str | int, ...]]: + prefix = b"" + decoder_name = "raw" + offset = 0 + if ( + headers.get(b"XTENSION") == b"'BINTABLE'" + and headers.get(b"ZIMAGE") == b"T" + and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" + ): + no_prefix_size = self._get_size(headers, prefix) or (0, 0) + number_of_bits = int(headers[b"BITPIX"]) + offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) - number_of_bits = int(headers[b"BITPIX"]) + prefix = b"Z" + decoder_name = "fits_gzip" + + size = self._get_size(headers, prefix) + if not size: + return "", 0, () + + self._size = size + + number_of_bits = int(headers[prefix + b"BITPIX"]) if number_of_bits == 8: self._mode = "L" elif number_of_bits == 16: - self._mode = "I" + self._mode = "I;16" elif number_of_bits == 32: self._mode = "I" elif number_of_bits in (-32, -64): self._mode = "F" - offset = math.ceil(self.fp.tell() / 2880) * 2880 - self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))] + args = (self.mode, 0, -1) if decoder_name == "raw" else (number_of_bits,) + return decoder_name, offset, args + + +class FitsGzipDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer): + assert self.fd is not None + value = gzip.decompress(self.fd.read()) + + rows = [] + offset = 0 + number_of_bits = min(self.args[0] // 8, 4) + for y in range(self.state.ysize): + row = bytearray() + for x in range(self.state.xsize): + row += value[offset + (4 - number_of_bits) : offset + 4] + offset += 4 + rows.append(row) + self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) + return -1, 0 # -------------------------------------------------------------------- # Registry Image.register_open(FitsImageFile.format, FitsImageFile, _accept) +Image.register_decoder("fits_gzip", FitsGzipDecoder) Image.register_extensions(FitsImageFile.format, [".fit", ".fits"])