png-quantizator-0.2.1/0000755000175000017500000000000013755457403013716 5ustar pravipravipng-quantizator-0.2.1/lib/0000755000175000017500000000000013755457403014464 5ustar pravipravipng-quantizator-0.2.1/lib/png_quantizator.rb0000644000175000017500000000305013755457403020234 0ustar pravipravirequire "png_quantizator/version" require 'open3' require 'fileutils' require 'securerandom' require 'tempfile' require 'shellwords' module PngQuantizator class PngQuantError < StandardError; end class Image def initialize(file_path) raise ArgumentError, "could not find #{file_path}" unless File.file?(file_path) @file_path = file_path end def quantize!(colors = 256) Tempfile.open([SecureRandom.hex(16), ".png"]) do |file| quantize_to(file.path, colors) FileUtils.cp(file.path, @file_path) file.close true end end def quantize_to(destination_path, colors = 256) raise PngQuantError, "pngquant not found in PATH=#{ENV['PATH']}" unless which("pngquant") exit_code, err_msg = Open3.popen3("pngquant #{colors}") do |stdin, stdout, stderr, wait_thr| stdin.write(File.read(@file_path)) stdin.close File.open(Shellwords.escape(destination_path), "w") do |f| f.write stdout.gets(nil) f.flush end stdout.close error_message = stderr.gets(nil) stderr.close [wait_thr.value, error_message] end raise(PngQuantError, err_msg) if exit_code != 0 true end private def which(cmd) exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| exts.each { |ext| exe = File.join(path, "#{cmd}#{ext}") return exe if File.executable? exe } end nil end end end png-quantizator-0.2.1/lib/png_quantizator/0000755000175000017500000000000013755457403017711 5ustar pravipravipng-quantizator-0.2.1/lib/png_quantizator/version.rb0000644000175000017500000000005613755457403021724 0ustar pravipravimodule PngQuantizator VERSION = "0.2.1" end png-quantizator-0.2.1/.travis.yml0000644000175000017500000000021413755457403016024 0ustar pravipravirvm: - 1.9.2 - 1.9.3 before_install: - wget http://pngquant.org/pngquant_1.7.1-1_i386.deb - sudo dpkg -i pngquant_1.7.1-1_i386.deb png-quantizator-0.2.1/spec/0000755000175000017500000000000013755457403014650 5ustar pravipravipng-quantizator-0.2.1/spec/data/0000755000175000017500000000000013755457403015561 5ustar pravipravipng-quantizator-0.2.1/spec/data/sample.png0000644000175000017500000034131313755457403017555 0ustar pravipraviPNG  IHDR gAMA a EiCCPICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ5bKGD pHYs  tIME1 ŭ IDATxڬ}gW[uNs'F9'Kd˶r6cl`` &Y%̂16a& G%9 VUOߞԩS[%QOkDv2Ñׄ, O:RIdWU=]X5>DN -dC%ح,&@LgUy `$B ¢RQ-}@  ! A~QiK)ҊҬH1+ŬX+Ӳ e~M--4 Gԗ~PSiX9/YL>haN| yU9gwq["!& ʵ$BZ=/ul[E {fΩ}n}̦bP"]ƳtCh)@%]#7o?b>Lpo/1H)~||٦u,m4+ݿܱ<1glOvhI.ǻr"tBW3M;6jX/Z:we[Ja؛ m t T"?:wI={SC#tq=mփ[7MHP.!>!I7j;sr2,ʈsۑ`VRbDH8Y 7{^pm7sKOOnzٞs.Xy}hlM"a9hKiޱoƔ2 #)`S@a7Q3N ĝC&򘠔:[1 , O. MbfmT1G5]̴`^~ XL!-֋_!y7p(5PWЗȨR${F>e7{yr[dmJX"DX voK,mڗgM]f+qPʡ$.5[`m%FH\赗PK<'HWюWb(HPL`,`mT:f޹SO7e2FRS}; C ͘G&BI-(JfSě* rmP6@@J Ǚ-AӻﵡbaXK"޷}K>ץg+ FhYmXmg"jp4R2j|4aZX Cj'"f j .:6 XQ* *bED/* >.YS)3bzNiP CMu*GuA.تE^#B>J#lU Wjhd >?2ƲHМ9X# !U;X6#>2po|w# A;>/@~Hd2΁~*iCk?xPYB?kLP5tK{;) ^ظI)5wO>P-z#6l_^MwP /{Y;?.}pD`ڑtm{2vѭWt|j{R2G^r;p.iMk['ow}qSv4`b|C+D&0C1T8LQH6-iғ=0Pܒїr{xNGf|-r v_DO ?wod;f4{7><=FX?ZEc iR9B?TnL9_6 M|@;-z*]Z9&Tj%q}6=f^tv/`]rzfy=s] %֬URv庵[̉cEtA9ĢDP'(MC`+3),9kbdBkyrH ǖݶJxf'T"aF xi712 P8`%m"TPbr!*#`]FHﶞl:<`[s "Ώ?ti41Wfb`{E`5bŬ.NIGcs1k-~) (!=!"aD8UUA {Y1r#:S9䛻%Xɗh^Ǝ u^Mӻѕ+1'HYb1Y%+!dpN?笹.X6v>ؔ$ $ie1)[R.1Y+Tйz="kDkH 16}7BU &8M1E,R6~"aϬvy6Ibx@8)&lC6%1Dlxqm x՞Hפ/\1eV Zq#8xxtel,{w-@RՅMg+a[fL>f` CozsWݺ$g>SOES~ԢdWY7I%ӡd¥]e-e=s]VrvW_ :iWy! H1ZKf1g˼c)/"܋(܃IK,XAnD ?8rkKl-W';yuwdíXϦ--Y8 96Y~XX;[Ҕi_pWq5]NTaW 2ԷOEG_e׎pGnFHߖl玿JYtWeԼi%Ӧ✛1{S;[!/"t]Q x?x$2w:Rm]qEK붥/ -.HSnFg:<ƭ[ R ]>K#$mc-ON7 n]( 9=t7i},0(s._Y)k 1*`aj4Ace/WiS#ƲvHi'1FWLbc\_Ҕ={ƴчˠ4)&㮺fx{zG˂%s{'mى-acSq ۟ID ِXׇl[)x,Fc@+sŧi;Nq}khO93X 3)"bBh؍}D/{&~7j!quGଈsZ)~sSn:$N+VFr|ϕ~^u=Ȋ| wPAZ]l;;"I,cKy6@f@TXhLF% CSfNMMw6ǡz2 0c S]rRhM¾ 6^3#[ѤN~/`w<h,r%b):4 K"3ͭw^A6ֳ*rP@@j6fl}j)ّ-ӵol)O<3L73uon[=EUTDz=~;"(jXcpÛCA/<%8bSItvc$4)Uj4uP}EH p#Rἔ-P&T\6RBeA B!|5Y,Eζ3+&EA f}} A=/ 1Z$I E1c|TƐ;dMmH2ףO? NikZa>xiLB1H\j!0Q bRNP^$'}bU;^2甽mc_6cƖDP oE#gLtDp`ö~mᚋ⁄qŧ TbM6b&l_}<:/R9w;[hMZpIM Z$]҄tʇgCa*P @T 8bF HAdX"i#%c=bBLs=xbȵ 5TIqv4rxV);.(GU,^)NNz7/׿ֿўJ"pԜy3hp? Ð2i# a Y-˼}t/Jv= $(Aƅ][0kYPXDdɆ0H\ @*]}j(AK(ubnٌΑl,$vDio[8wΒ3FȮA5"L88Ā_?/H3eƊ`%LO&@$cYb@@BH$0QE K W9nV"0yp 5 !( "aTco } 74鰼Qu\J9-6{|RL!"bH`X5a4$5SH#TaCiT+npmQ*Z0sMG*"R%D jI67~ߚ5ƈ $嵐" % E b;tNqcJW^8MD)1*lScه9km-qdlQO-T׆"<՝*29<ZVTKˌsdrN[&gPDoqVMUFdu-RhjjV:~o50w4ѵM}+Qu1FEǡ8Gm R/ɮfb`E kZR Qw.{!j[e|#':j MZ+-&I`mVs,܈8\?s5@{M.l%ZV5c`XID#"pl$#=65] k&4\o*Dk}C@ b= uUu'fH$wmM$!ŒbIIq+p!zj9Sa5DҰ㺉MN|O9w76+­z$G^#?Y,I@H$S\CB <pCe&4rQ$:R^}V=i280#vnE*tW>v*FFP AuAhRJ6%Uk&1q; AcXB1(!9錅G(jDo.I[N( W(hhpСJyǓwWPD" 6%Hz~:춏g @7dF6Jz=%kt2ZV[@ QcvrEL0FGy+Zf^&عXFƂ P ʁ}iӭYSq]N J P>*t+n_~_OXhaJJs6d U8Hhn_]M9 /t-xM۶``v fvE5yttvplD'v;3) GQRs6܍st1:|I-Uo#̨G$,]Ӌ娜|xmըQs0IN=X.]s^sD(ΕHR_Uɸ/ĽIeǏkw&(|v:]n;$g_-1"x;-?z+ltbw}CVH`b̬Tk`j1s5F1`"`+0V`N qj,W in^`@2FG-]KGs` XҤ4XA)R̬O_q m}iA_hS뿽s'Z33@Ya5iB@5)Jb֊u@ѕ;xsX0PwgYfAARcS1Cs᧎e5M-N\w]Y#_*&ϭ<^z/?.{ oǓ -zV#[ 8%)G+/].;[h#t_~rɚׄItfb\f~OKxX12VqIF@LݡLR%PL_uV`o4l mKfX ( _|mOQazjG+<.["o g&D=_1[!_{+c\rGY@LDjeRĊbTdxPU8_4^A+8Xk[&b?+rt̆^t~~{;OO,X?Ͽ?|WY^܁w(gNlFix_23OI^{!9E澍3Y0oCM4"RBH32"~1W~.HRb`Ť5""bukhKYf\)*ìEQ _2IA9\8[ڷ7-a֑^558Z u;(ڶ>p"^R]6l,n$rR@l BoS93 l|ϒqҤuS)jsjd1U+|H"ADaz2idb{>U$e{NYWnӔ˖Du3?潇 x߯{v֐ /D1,;ؽ/'b(\J HlYTn#&nnj^F7?" 33XIEmPͿ"!&,qXR+`QꋔarzkI9 \fGݯ\w\} ͬR}u<^zu|*Fr/>݃h4*i裎A< ~>xO 72&*PF$Z0-S:s]GrO˙-JXEEf1Z7VTMFyZ?8PQg_ݳ=' R*Rv4|ϠX,wRrb.S1ŸBPRgc4y4~S,[$EޒoG쮁pszJ˨CIdoui~ w\̺_{.f@,\lZS[u{[$c9Z3bWF |be+̛vnj4b5o-@3 ;d1/AM8SvR0WJ0Eq IPlЦU1BQM &+#k6JE٨*L^}镞phlllPp-AWյO( z`l4{{KqrI+ [X &k_{`]\d\lt~fϯ,dǩGi |Y P!$ A#@`2LR"!#d]і\f 4_o}歟ia 㱨`vq5.dBsB";:j̤I&!t~0U:&7r`h)blx+r͋h er4Jl7 %2gX/{ jFPF"S* BZc*!YƴfK;;1V.miC+N7PQeƫyXu;njv-m] g 9+ѡ~k.f-tf`4*h@]kݼAK7Mcfn?p.>(4#qX!ehݏTt҂-ʼnb  QEʊ&J 2^I4uvxfb*Lp<&-Ev9A_8BQ./"E*%Z~_O<&~Ύ3+ίY7f{뷽"/g_N\#1ˍC{,ULpbia"e 8ead/WDx>81d(*pxzPQi| RT 7J"rj! ߨ1CC?gN>WvϘ_;%5ؽ_*D15}%^tQp JUaE$4u*P*2 VtFk hJ"XCʁ0Fѡ)Pb4 ɬf"C9! F\mB!!㯻txpzGGFm[7g.8KbdFܰPJ`7 0\+?'Woy9gַwslP1@S} ubRK`Rv#3Ɓ<5* Xu]qBR$d뺆*)׾ R!mMujBMlD^E&KltA0<9^i xϘ۶r|U-@{g`q|.PϝIv@BPW{NlT c`DWH'lC҄H[ 5hES\ݪ0RE*u%a"12#I1+OW/n{ LU`'c%یBXaI !mk>Pdo_gH[Bp@ĘW!3Jqm c8gMp{rFAIcn1O!Yqt>K3Kf$=AeO% Mw:,&>semKIx̲?vbu%&jdc'6mqrQH4NT"ZCH: m6m~`Ӯ\w(eUȍBK EUO:#HSjF1tDjU,-&ߌ$ S+QJL:kH+}5zTtrIT0?-N*NZj.-WvM:Qrʯl21̑f7;T4oR/(U5Q h0cPqJJ/,:90GJ #WB8$ JH!ݤFlءjB1afu)YO?v_9J ,;+E|vKb/&y'N#9O\TnetәF"$ p$;T@DPFWhT'IΕ}-SLF^p Za~FB*GD+X֒j#P` IDATJPky(e޾ NePa8, 2ͨgMC%e XM nVO8oJyScSZ]M^Jt,Jن`EpeDB`)m@` <!o`_Qö t2P FP|Gu_<\7*w]?Q!.(fUSZ>#fY潟|C'O%pI4ѨFh"qvKӕ8`O`^mڹﭟh(ĂQGp` M)RDtewa}VA ,>n1^^Yi6HfNܲsbb5[g. =b48B`E/(N%A% :bI3]N gƒܪR(%:Ã홚X8K/AX.չ3Lɺi\{k禚\_7L0LM9g.Z)[]Rd@i<$^5#QH۾8afcfAXxHsBG3:#FԗgL}$(eYf"uM7"gfXΤ$PJ)`5( WQ<ؾ"gpA}J-deR"9N#vi>6M!e&H)y cG0AST T*F`==@F X2RLB{a706*2b(R&lcv윰VJ((fAlT{ J4sd l]uco! 0? BQp~j=!If2;vNe8Ʌ{L""$Ij*j(錾6lo"AôGUG_;*‡D=Z#__,t$QȂYzv\Hk7 /dHw+ 3[N#Ncf=K$.eY=[ S.wgBߌU< hNH CEd,ۋlnVقEq}+5>d<ۡ("S؜YhQh#A "ANSJ80sa`.bX(4' U0n\3SD;哗#C",Y0 3#a',W!j=Lr<ҙKӒ 9O5^pjT`&,ո`"-^)xXsccYZRe28?ԧl+%YcQ 3zZ9@³ TMrZ'_k.O\ahhU(3*n ziQ0^T䗯s>zg#F`)Tֵԍ\bSD!CcS>mXr'9_*` k.A ,m[IqVLJ*~S"\WIfʮ|h7J^L$ |'9oIHqDDB2Hv ctֻkj=R m%p* YrPΆ!EnaE& SBey-E֩6<o% hC?mbek=kzd^C]l:}BW\b6 ȭ^CA1js>``,sMoR}eKQe)%}0JtT|So[X [z6fkbDM1=m`v^ܞIa.Qi6Zk>Y*Wkk s0T旧 bEwg/w*b(]S0]yF I! UtֳTY+bXtkXk_ ~ZW6PQuk 4x#![c-O\O+ \aݰoc$;*ie(;˖ X.XX!(V@,\X."0h5;ei @˹"26x-^Wd#T)Y3D6\~аysf8K"!1c]]|յ\>(S2wrh" qq/O&dUaEo\)eڛORH2T@Pf>=f6lHD@ŧ.l¤C$ot;dXv L|S!=Ɇ}L=R?(+*"\̺M8IR6Db @e)"lW3(*>8-A}QŦo P7 b#s: ~cX7RB| |UBzI3'= tNbϖN5GdNq*l rma[X.{,5]+F$KRXG€pS !ӽ!Tk2amK #*tp]ߙ%Z;SzmQ[L@`5'}y:e:fH!y `%Ľy@P*."N"ɼ`K.g8urvQ|g;(iAEYD'Iv>~ĥ/yb7(ΣB4# fL15G FwaG=r(`M[-7Kc 4y'k(ւ_S0"_SD"l,fAJ#.yFM 8bE0]XL;ֽPl 6XX!&8V.z<{Ne{"$,Y"pWO qa  S`K[mK6bÍQ+.^#+k2b9=|ShE5r_;Y:3#!P*)w_tޘ -Nr$ER% \pІleطj''m2YJ ,D}/|~)6*ܦ l/ZU#УC3LBMޖD^Rdg|t7i"B͟h=2R7Ƥizt)ʄYF4A >QEB|[Rָe4{5Aqeye3WV[KSa)FC X+!\8n3}z .o—Putz+FG}v=;$",i0QjλnËk!tVdz½-sh֠OYvT EI8*Jl.--w]ffD$ C Vzۍx*h]Ӌ?VpEMekx(~i4H>9rtM^.~J? Bk FBCPCu$|!̭₭?]9~≻wABCu _AkďEؽ[&ӟ +%j_.Gy[O&"S1E㞌ߋ] ߞܑ-H r:L@/ʐVsɯؠ5d;p@[͆~ qMW\w[zMgǞ:C'{;*>fT,Μu1aA;5Zі1O=Z?.D 2 F)44VYγ[19EƈuϘߧE _5j,rIҵv;:wo9bH@VX'zxS4]l,0=c_j]DeT. ;peą6s(@) RP 8~hАPзMOaWQX5*sdeyO7\d}~%23+3'9<ÍʯbQnvȎK&Ve_OUHKJr_?YU wo/`4y h^uUR5?"J#ƛ7P*^w-RC-MWCe4pN%@6jdlԁN6&@|㳏n9Y(,Q+EAI!6郐+zGH'%`6&!R>9xxԞT\QO,CXa].o [?z|m!LKRrcUxjuKt⁇[:,/>wwVf!>yqQ QJ{##@m{ @bi%FIaЇvdtpy5NRPCI  Z@(pV:@p@Z8pp-{Sˎ8MqScW\?]?'(hHɠ\.؊[n_LHRA;UR5Co[~#_m4 rh&aQ>IMz}m.Xa@ 2o Q` kO}\'\ulzHnfD@܅~%]3KXXJXJ :꣘xmzn SRo X=|dO!LW2+@}57C#}FvƛЭ| !]%%8RBO;֦`cY0 +O{;- w!!jP}`}wz,jo{FF Rs8gx<]ʕVK[@gTgRZpu~[`_{9qM"Cb@>!cqm"^_˦dtkS)žO~qV`Rh r.\63,NFkqk͸h F}]h@ϋ\HB̝CSEnOcرܻ?Bm[-8BՓXʢ;Y,`%V>_=9 8w)"EiCٛtc̻&Uܦ+#ccڱyn˧~gFr?num >`tTu_ug.??dtIм{x=$2 O2p𧂀(wJm-><]נ2k{- )å`;$"겍E<(sϙ D)"G [MvbBظGK;qj&0 X{i e|ϔ'N7ZV)kj~l?sw|sl<|rV}6'vLm+QmIQ4gp~w^:'`ތ{\<_5h[F8 .@/oJ@(U$Mb n8:'Qo;+{~L|.v{:]]|%?O>K]"܋|UmSHߧ#*^Ywv5ky=اk,XC;RYUM= .af3`A x4Lm֨]5ػmDk7*8'Wvbxm?6 -b# y>(v#/kbH|ju9/:KoH1woNNK9Rm EBE=@Ⱦ.K]1VDZx;*]]H3tC^lYZk 3:yI/'>dɍ|?t<ni gr wx_e-zfj.nU}k FjwZQ`3|{r3sKN±lDSgtcK,'uXU5+O? U@!p! ?|`>K"3oIȐy{DVmg&DP~ֱfz/PQ҆HҤǯR߉&A Q&Ҥ%SI .|VKpW@TJI"m%"1qq"Lϴ\QgUH+p% < O*T$fu([_||g-j/8F#ӧeY?>Zj;ұ*}9X/DWu|(kU;+.g]dffb/\3DJ'VR"FH\ٛb΂9lrۭnъ6uMW_K_S - /?v r)a2CPB%,4޼pLMRB1Զ!t !NTf!C<*G"RlhI^FpLi' Ct"ѨD ,ҵL)gM}w4گ~"Q`f'pUԁln!AK}"w[}X/^_-#f๓G/ٿ/i1bN|׿$3g}ٷU~u2ID_n_h8>8hIŖlB6UZ:)tl]+! '%QMTC䑔-JAu_*KB*@N>yZعO12:cbRG#V@ <D yYny/lg-Zs"1G("/=K7^k !K]R"XIvȐ)_ /]{wzuHENW;3Ja \h&D>k窡W|ԙ_zַJz%:ʣgϜo{=¹$N.TVƗVZKثtQh! ܜ|ŔGޠdO_CgW<3b*$ y*eD9QaV~'Z ~C%B@PG2B.LOJe#!P-5*(aJw. i#c֨]Fd$`+p0L%A!t|@#Ɠ(q+sI0`yV5`tWn*Jl39XEڈ&@!!hƈt-su3qLL=kbPfz-"t "^~RH'BJ2b#44i'HA儹 A}pO6&j8䗁=S$FNcs KWΝ1Rkj.Y8w E4vwre 4'af( .NzmsrCrk1Pr"DDm \Jp#x)L]/F͇f XG!D) 'vy΋ $b>%|T >Td?Zg7';ʦ:v ؃Ierx>5(:X -H|ó߬JmgRupfЦ}{`^dX8m6T6BjuΜ@ښ,nH^(I4F̻IZsOmC![w(vr8N: euA P6$PB)I(@B}s0K(O@5H*q,KJJRsp(L.2=%xexFQ9DR fgјq[y58f|,PXӲҥFV$ C`a<LL6.6B#"lYi)ʢTT"ak rx)^ ~gVa-ӫwʞ\=qXNмq}n/+ ṃwpVW7Tby}σGHd&γc!cwg(P$Ciہ(nݒhA q02^zK=7ݘ)qG|_@X\^dHFdIDlxI!IA}_<a@of )7P !A&Z}{5W\uD;] /"HL>a?wzX+2 |o%V+z\m|ڽl(M$dHS*&En QsG A7hT39;@=r߸~.Dg-)[ABCA QF`C A:b`a\3'^T`' )]Z("|b,!D9I޼}_j$VbQ$fprl7ceq_٧m҉=Aų O?Zek\A3_>g;T(+_+nr-ʘK~ʼn'e%(3I|&++Օ\3  " -&`w]rUM*JgΑ (MMGQ;9 Z 9 2d Z8 BJB  i Y(s$2| @+X-TeΣňڒ#׽3i_ I454Xbu0R2GɔY_ F␅cyOa:AX(Z (D':8Ь),auD \ 0ˏ~IRGr))`M؄cIT?Wز.n Z ]X_MD!O #@*1qM;+6u[B Bo xL#LTKu=1:/H-vTIUs@ upFCdHCUTAY[S4QX' eJ I3=3bfVk\05S@a8}:$Ŗ#1#aq=v<4YJcdȐédz/GzC'k8;d|Z &_v'O]oC\ײznY.O̒bJ2 tX]*"Vom [;O?ސ=0]>ޘ9ر#:%S H#@ǁS$"V" G O6YCa:y h'B$Tx$ H`H;.&.#rzDH!2db1*DC3աk)DX"HF-BT3Ѻb2T(ɘg©E~(AܐNdH<˹66Қ&0}wR>*.9ZQʰiKRds~*(Iʩ2vfRyo\uq"SRS[vǨT+ it%]#zS̈́GWDe,Ri`PbJuY"(R jh `qA0 T)'P@%E ANN+ e8I0%Q:W}G{FYv^բso}R9-lɒ`$  %ûeͽw=lDcc`Y9WUW:u[Ƿ Ւ{W֩S'5\s =A1|׈E;#ꉠہZMZ; >!^BM`s{LCnBG,AH3RP8\HD1I nX/G9Z645UJTc+m[|uҹKKٰ4N@2Y! 8e#O?k׶ J$ֲZ]sԩ-i\!4yG 7 J!c-#WI'K&blU3!4t2>4#8m!mTa-4,,TCSzǒ2G= 聾Bhr٠)lZm#nŝAhFqh n*ZUSO} I║)==kMeĦ">-ng+:F%F{^E9l\\IFA0Q7,҆ J OuaT-(L`lL Gӓi@.+I?pfc'G,>(=_fpc ٕ*$]uP,|I[wI(6K*%zNy+|WMztIGI%m$g@@=H5= }ޠ *P*K.GG:K/ex/鸇Yx+x1`d__'~1*7KQu5wRD#X."( ,s|ibҴ*|76Q!gwG"]s*"Wtg˷,vD$ iSrIQjIa`֟\P"2*h_R@ǩ\HQǧc'RDe[ '9UB 5ko~*i=5TOpie+w%;Nɘt_yu`҅%Mo5őg2e;-;*59,&MF\񨉳AT31oYArܠfɁQ0%&lϻ3%UL2HKPF8~(6't%݇'P~G镴kMl2U/@S(=OEO}'{v1/r ߾@҂^Ac}"1m"n P(*1vʹ`뙳I5wQ,Ҩ79so'Ħ@MPt$FC]ELAXrzo`!͠$)@^Їd_a:5Uq+ 6^\.%Yhr[I0eѰ/5͕ q;0ۈғtm5!}iI;Ӗ td;]Sr]:o#l.ba%Ѧ|oECc֌?X}H_@t;FҁCg <cd!CR͙sSh_⾄RoeWwy]rf qڔcMЂE֥wŅ2/kԇ+r5<-6MUY|&1+'=|ͱaODm[@&,$N"jm#-XMڥ@X, Pj._纼aއvO{ؼQM^I:{cf @[bBjO&IܘjRC&(BrXvL{<ΉMγgJ.&!Bur ZmZe6yDD*v*SE Q7]BU؋h|pWF/]CW4)%$q]]RFr?3(hTLV\Hɘ߁* iiQ OL=Vk@bd$JɚE'ǤIl,lL>gf/L"܅d9IhDϤ -҆s{MBq C0=:ݡNkn]YL4ՒxL$Gfmʮ.܈y]O]':+y5id}EpD|z:pPPRCɯ҇#SmOȜ-DCbl6h膙m dNa= w82oҍ{@H6b7B(DD,e%9ILZFGvcOg1u0_ŭ * {sKUQUU[6u%kl5 ݏ10 @j#B #>.{kHVN n|b:TdBܒSd2 kU/l4xPϷ}xND~r7Ko ~/8 \=|iP?3Ymesu &DE'2#PZ`t r*16g/_,m64VАtxQegFeF]qC3U 6Jե*{t;[F֠=A߇=s%LSފc( р{Z"9۸}oC?5k:Ǒh pXؾ7S3(F13-[T"G:}b-nmb]PƤ`{+5 ="gb4@}y`s ֽ]Ӂ-Ϭ7ZR1*NxG }A7ots%lY})/@6z] af@ X& [ հw/CÜnZumu\瘈LoJO._6.8*b\en].Ozz,k'S/}AiaQ[ U)/4J+7 zPF QghL,|~Tcu _s8|caQ+^lKeX:[bBF8URo©Ilيy_{G[-0T !b \ry P=,wMUbR`@Bٕa]~Vh1_AQ@'|ܵ[KM߈FVW#R`xB/\ vRx ( `4'Efcy,O͓7EuE1%\f̾"pb06Kv48JͷF\cz^?}ρZEQEG#V #kmǥ }J2<2Zzة߽7"妠PXF }W19DK%V5vrz8|JaWt+l[TAuTkD@'Gcm !x~oj50fޫ¦Mس'~[¦E . doPa7iʫ vMǀ 0+Va+B1ٟD+ŃvngϞ]oΞ=(6T*˥Z6<{Z o~Y:\a1A@-~uUsfz>|nYBH*i5&_}7MZbhbI8 E, 8H"(lv ޽{jz߾5y8kuwc(h+BMo>45e\Vx֥FnOJ^t#߁ݻy.΃c]y  sO|9v6fly5V BCZsjdX$]?vdVkrct󏣱ȱi91|p)ITVS* )pNg)} dm-ꣳ#ŘfAPUġl+29ThBϏo$CKa `60l>=ܶϯAҥm[f+2OLqcq#'Ƨ+Ǘ9Q]QOD0V J+,C}'O~Au77>S}:ǩ3\%zT+:igMCM̦xrL- AK $u0y/y'¸!{\|a 8 {1TLL}í=&tdX IrI'zN:n%ԁ[ҽ (j-b%5He1]J;;ʄ&"Zv>zϽW'/~+|;]sH51[4N(ƳA+."L(ۢ ]8Vv;*þ Uo{`,NJVlZ{}aRc_{gO)5@Wb÷ QyԿ<~Շұ'9ZDn/NOz>Zkwj5#Xڈ*Db7R쏰6ye͓yc&_ jKREN%j:1z?#щUCL[#U@hPz;f-r;GW聆:s/>Χ޻oyo:7dsS~p3_Me}L+&UC!$U"ɢJ'ųӓ8P̥ &^>x"!BQUH1pYz=#ugn,9_:{5/Wh<[#b<3`6d;G~90uv"0ozcV~!r è6^3U}ŚnU8[;˯P! &x0f-|SJ/;SZos:l.9JcPNo ѽ{:c||?.w#AIa$Viױ d{>2E-]"q}S+Y:ujiym0N<=Adlr][\ ADπVr=<O(%_=T{ͤUʋ@4.rwF5y2734vF^U1S DL J0>%;DͿv O":lb=fk{7:xs~1+O֩iԣX2kKm ŮˑxRaQ 3dSe|hkw,m-O\<|jydז +k+эںo3 [.-LT1= W_cO(" 6ZO#T' P=/XܱĖO%GU&{+5#ШW3<̵׀Ot ,6/:61 _mb{F' e+2<0j-1ʙk_-vц&| Ԫ|{5\,c|(cj!0ۢkm-NB`VS ,R(MH5@8D4(Mƞ ¥sG-X}TU՚ /'*PVWz@}rlWx؉ZG@x}Z!*ܾY!Lph^6:_P=CutQ=rq ]7O͟b&dXo&''{3쭝2v['Votỵ=  >۷mȭah__Z6%c.oU~VW8c>.YeAnqz_"BQ@R7DWSAoGȷgx-V>xѣ?2?Z |єNJ2oWc;0TSʕ3gJGd@l_ʳzsV07չMQWSՇ;l`j%mر7_}q >kASD}8BVDO&[EM{1KKgҠejؿX%o IDATX1ecdf )IMwP2{*od0RfO,S٫J+}Zz6JŋM.) [ͷ6!cVz׏BښߜAEEf\A`IB! j[`-r3T! (Tth ph:8d1T[C|Wpcxj&L;>l!ތ[qZvM?.Ta_z7>m_[%uAc -Wz.FNb4o&~wpá'Qjp嚌 NhMU罇)\Bj`)g'ۖ+TUs=@T/I6>/-ƃFm'ïђngtӃVۡ}_?{|7W.-,7l(EUXJ3tЍOxO) QS;jR=#uxc2oM㓟Ƒ XoA~5+΢wxxC_t/ppQ훞8 dֵ##B$ t/k7dL x g3U/Q-MSEirFwOI_ "·`(0 D> 6=Ar~DlUxyxa oَ֚aP**JJA4MSX a]Q_hT|B^39ip|LO#ۛ%1<^8'3GVщU44viyyceE݁n]!@  <O,7bh,j"n|{5Kc0x~f hQ;P].J182sEc[dмTP;;gjf"&FٌU¥Ze-㣾ARJ%orbf/.x~Pr)x| 55SETlg"Bcjسcku_/NL JL{(3O5yFxy; }gyKgݵ۷x71.9Xh8gPƅ z<ܹe,~ṯkP!=tj/zZ,8RvBoJQ؉ťՒW`<6:ᙳ*#y3.IqIPdr?}v ]so?٥-W]3tw'n>'~羈zU=ۋ{oU*\~_\j *|?^C^ oƗA_Q=ppim;-jSӟ>l}cK"nCwh9 6%dN1/6`٢@0Li;*F's7T!NcE/6B;nR=)1 ;֪UQlٍ#ÞgzǿV_^^_8__Z8w|6|䩧z9]ہfm^L^\/ȩv[^.!gJZ[~x|>' s?s-??w^ul%~}hw 9g^Ǜ>zGW-ф,~Χ4<~ěU7 GKPԄgŮ[\d3_+2>GOxoyKScHqtzf,Ģvӽ+49I|=o(jCAxt::e6f5i~-O|tܙLn7CSq04ZL5m҈)n$Y%>rӗf~HR { ѩ7xۻSxxNu^S1wrEs+vg}ɕ NS,)/ PcB,w7Ȣh0{ɻC|(L2KU>KeX}AQ\zb!{^&ɞ>R,. s[~ i*8`ιu.(\Yܲ}[edz-*/ʫa%SC02RzV.Vȕ^c:;KUݲޖwbIcCwT~eyk1K~^'` p6q^WZu꣰|5ϕv)O5%"bʄUKޫ_㖃ܳ iuIt| ~sTǚ_U4B=fl(ձA[=(TTu T]}f+gsnY_MO/=W䦆TNί_;wl{`{~v F<3+˺sgW../]n\Z\o5*?P >og^͛ *"/A٣}ퟦ ox;gN?\LqjIZ/ aGZso;ְ8 bbE1Aü&Ƴa#`[c^/;G0YHXtأqXOpj)z\y9nr Ij,bRV0D'$қp͐0׾ƍk q|oL-!Im3T-h,!Jmjl{ǂRy=ma)TL\ftx=;6eV:\_:wae}yQ_ZzOՈ"m3w7A҄^|Rg[ ydX/\+TX~ėqv|L1ND~f\! ፊ[{"<= R-8NjzjpLClSd N X fiS4^}I? pnvGڑ VhPiXԆG 3O8z:yS.D76[릥'hP7W'N^Yo5bJs۾e3+DgoÁC,0 C($lsÐ-pe65PS#db!U:D\ڍE@icJ]FD("ƣ82N1bLK#"c f_S7ƤAMĘrJ՚R+J{Mo:(/A`^V"Qbk*ynΞ?_of;-"0VXΜ9137 ؊  O͎v"5K?꾻yF5!/Q_'V31xsM\IAnu`Y(֠@DaUڙшfz1ؐx5tOIlm=b< xBF|#}@(VEh(p'YjЁͩ 4HT$ێs7P( (x_Qhz+~ A܋(=KA ѧj{K3UJ/~} S;R>^,?F8UE5r q_ZR_o(Fh# ȑ'Fj#^%OC,kmh#k]gԠШ#>::+u~g"F杶j܁v0֨)"YbaT);b'cJFD34B4P3׍{ngKin; b/#LJ dL.19}?(]V@@呥5D#*Q}9VUzsvϟn!yXЪĖs`MðtNݾ8pZsy щŌv:҃;^>3;ĹpP<ÒϚ*j>Dޤ`P?zDνjC=51r|8^0vlۋ>މDUL#2RXQ=g;DPBK=@=>(tJneh 8!<*C;C7}_^:WV ,fe0Uʑ>s?N yk'īף(q;Bٷ*N])R3o|#'F}Vmk;Q7Z00F;0؛K]a9ffUuz $!( 0CLl6-B["D1d[ Š"0e" Q4Ep p0 03=w2ǽrx]ェ̓[wީ>oچ׃^@\!h)P^"QLD*O+/Hipg F,!@b (B uel3x < Td_N+EPYVٖzP =:ic1dT/- ۯ]Kt _8El{~㥭N 'n{-n?_;a6 ',ͮ|cugMW5MCR/+p++Uۇ/ڙhM+ '&dS$ܞ!ȼvٺcD=V7c+E-5;Éލ{Q*^ZP(<<mbe$rU_*lks $"\#97.e$^JKZ(FSpa9R$aCT|s|{?K_ FB,Zzx;dj1P~$ #D+>]=V'ON{_Ʃ㕍f ;xv|7~7ou4'mO~o=jh/XՆ=;uncS[2$[/zW *䘞;IPxg2.e絳Vԍ-ؠd-3)<]j r )Գx][3 JO@"Ca>XAm:5I2~#$[Q@SæHқ^\ѮMq&^Prd h/n> -h%ZՉ m8%ttfmhΕI|EByxI]ÿy IDATQn[?S?}Sx/UUx?6w%5dF}۞gOl׮=|;Ī9)D:F1^Iw5s*B*4 ǨC'4U<k11QTޤtt"4z/HuqR0nqx0*6s{W,"Pc̟j6K(T#gqn,s/ʰLrlΤI5Ã;w k[u[?Yn?y;RxSFKҸm(ԏbHsY:81SŻ yo׮\>}NIUm2 cLC#[hԔrgUJYBqegZ^в&qHK/W>iH=\r0?|y{݃&?osO=_5_{ŏ|SgNL:ޜUuܼ|o^qgwwow?6X8Qs[cp0؊vם/֐TZzwnùw=Z&BkJ|BD* (R9N*15ь%"$ti +@aDhD0Hlha"Anur0m,5k`9 툣xf$Љ#JxЉxˌ6 (p=Uv#YWBA9C/@˫܏jzvVW臞|/=blЉrUl~>>YKkDmΧ(/eULq?ZQ>9wCSÒK~҄q5YqHxHl8 Tp>t y@D h)%A%K u (#<\c1^T0#b@c5 $qDM)W 5(myt&ASJ$ATtNPy#CmN4HfeY Kد(YөIo Iy>PF/_;dDžM{*lv|4ږvhm#- t5;]ƕаBY8+J'ޡp꫟^~Y|oܹvy Z0=#cYTp<T+JD)(Ā!DJցh7`8QGN2c>EAPlgE8TRbD1="ɊJQÔ"h!>3D ψ8E+Y6Y7YN] '^Qx ș({LڹWx'˜R%ۥŽ]޾}cl+޽5~kBh!mE@7`huhLAWژAdTo=7!DDL[YJ'Fup 3>(e!.QNdXA#DA{$_$AHG%tMt<[7tŸ2:>^Yޫ2{ﬗ5ra%7?G[o;z\}] ,-j*b 可+'A5[%/o߹wrv+ktk=< Q F(5Ҥ#%< Na \2r]1C@&AaXB$(%hP lY;9[\+}!sEKvDH"$>w,ΗޞY>,|$z@%@L]8#-DC^RWP DBisa@ *㦜QLښ ֈDPkʈv1p d 8t^:Vu#B+ &h9RcE=*, [˻?[ro_n$͌Yu90'o?!?)?bAj'DQn"7V#Eq`%p;PG5Qthδo_xdwh/GI?k7wsrf>t/ $)'Yމ Rqj@)X8jX#B1ctt2G@j0 EV&YNZyD \V ClBNpP{C1$l!!?1A<|ɢ(^r": 6Ѻ͢9(^? hO*QU(VeF;gdEx:Iap@RE7lLl`AL0YZ%{@w{ F' Ć\$.:#Y:%%@ⲇ^wUTς;Qý4tq6?ͻG겐e3-U=tM̍nC4FSa$p ml` Mfvڠ2:#LB ?#hVJ'@DP˚΁kpDU̓`jR()U'kUүIXͳ<ͻQׅy~`c4ܺ~tsj[uћP}V9M׾z}]naK$@|ڴŶ[@\E(JE 0"k3 5p&4ASep~+c{Dh ̹F!NJdxCxNE3D [Wv} cf-.AR1jR֔.bb5(P#<ăF0:DCO%c?׺CjLvd"=k6j#g>~~w~=?mSCrs;uK0yJ>]zХK67;1{YM ץABuFl$H' *Z"!"FLQ)|o@QrW?;n7/hL4'.- /ăpGBuw%&H PDG= Mrxw$5B*3d:-@F(!H DՂ ٥ `o>?gN͑ƲX߷^/~׾ppxzsٍz+{Ѐ~g:;^sD \'%BѲiJ̉BDt%& *#+܌(c X,7į!`˨< (ıp֜υ ,Z+o@=_"\̠6IZ%Q 48đfX [Vh@GFR"<_-r]{4ͺ })Vei{ie\R& RO[mVF=,d"2Kh"P F 1"D0sM-) h-B'M0A$ExrWC/ڀC 8(HqKaq (AA$(|cdRE@sfx6*W f#DL ,yDƞq3\yUe\Q,=UpIjԧkO~ Y(E&zO N> Jń_xxB"覱h!:Õjsb0s[& _,P [D IL/QTLjg #KP Bp# (8)K Ѹ?!H$%uPEH9 #p1Sjc` DDKGwV`ba l= BʄlX9%uc4&XHq4$i}qw7ĝ7X9^E\O/;7ʭYK5(*D+GML[iL=t0mN"Up ZCVH퇤ų(WG!+l$fК4WΞ! 4! f4%B' !ސ a 31o0chHFbG4v IDAT,K!v TJT'k4q{i@x$ֱqAO~n?DtJġ08 Ч)n -Ԓ Gx5&f "p?_U<ٿ=e *jrBP&} E.z !Zހ&Iފ&,MLY-U̧g+5hZ8a0zhveGSG"SA6ܿa$T멧'wn{,殞ͼeP֕P1Rx'щ}U3ɺwj+wZшdyXwS3;|!q^֓cϷ2O)+=\P/^unwZסw3ܼIcֆyogq0KCX4dĉCHw"`%HrPLBPe!$\9 GSAƤI*GELh݆RV;=籋ATݕ). I7wUdռ `^u`/su'W.x6ZJek0<88RJRǖB`^ELC\7p HG;]  cq0-~1b1KaeIdSa!'O.YM)TJX4hfPP-/ǫ .ʹng"ǾO]ZVO\vs҈7:klNY_[ۉ3{#ne"LL%gVOI}P6j퀣,Vҭ)bݽxnZ])]Vo`\a0˿$ @4,1v5Xo/ACDrj!Ѣy.8o.dN[hIˈ z<*JRIEɊ Ɉ$o0ƐtMF vِeYx対ЉZd&G`]]Z7d K.K,GSF=%U! {l%;Z"'~3}|afəb)$Âx4o8/xC7v/Y߰gl>L8I*.-"c`IֶhuxmI1B d] e;+$c1]+' KNǚ]&}QqYAq.|1Ps̈́2?`QJ|7f"A~ SB~꟒DXdX ][x!Qa}^lG`4.x"#㎀%4] 7`Л_I5:V}j^lיEP1io\  |vkV`dDhd!2[uzx{\6H$[\.w^Dt´cAĐBȒ"P5 8pf1щc"ę*n #pQdc-X۶ݶ86+jJKΝprwђk% 5¢.arKi>GPyr٫8z~ l Αi^Cq{%2FE_`eɒp$@)c`t$-vvr--E'Fh ELHRNQvrB3,LLCWguM>Iv\ME/r'U@=I<=;#7wxXʇ˷YvqOTbi<~Uo#: /Gz(L"HK=i/"}:L070"m0&#TI3Ln[Ju.ɘSsT"#m+ 5|yǾ؉욳{` 'tn|@g\h"r <_"P9=]=0U2k5ʰ\Jl(|%zI9u![MO3 )10f),bT<oO.h1@9yF0MvQRxQwoQ,n{'ۀ5 rJ]Hדa;v[Tb+o1)")g`HvZSUvn/.% ݦ8F侃j4&<$,$%4*W9RH` Att1;Ma9\:Hfu`@z95O7L~]o-ߠ0*]ȰNÞ7GY M" d]\ Gi#Ʌ}0J 24H-H c0hv㰊 tP(kpE"*xw\"` *LgOl }mkZ:&  U5<\R #qGux `):I#U5z@pN@@4]&7GHYt1@kox"^\iu8hHc4X6Dz'Zj!e1#J !x2N2@ezt:,U+5FfyÇ \n.12?!v@a/vbj\r갗Mf0C#,L[\,\^ G:Sé%IvU #>,.u;k};J+ܥ~ K_/?侟h8U4|Hví8``10[n Td0FBMQ+TIQM–몇ȣ #aѳ ,t|>2:oF ¥>QDr`J O,XhtwTzIA528}d9-8E%.B"19+)皲-Ks>\,o_ss&8:s0W׏$ LyG-?:<`ƒzi~Q\2}[?߾=S⑬|ߒ 7Lb{(ɮ>}չ'AA  %eI^ie%[ܕM:d2iHdI J$E@R  3= ?U{P9}驩z~6|?(ْE_Vvo{onc^^x%76G6|B-CYpu^e3܋1)Z)(ʯgQ~q=&(Lc j0z[5ZiiRv/[Wp%Ǔ\~`f6?W}p摼~I cO|71L NkF|3xqa0lw,L{ 'חry[E֏btJkj # f:2ްx2h`th-ʡ 3^l;feԿz.{$to5g%Lm0&y=m Aou$_奦Co2O(*![TAK1E , JSB+/KjM 0^b(gQfJruiOyF]UˍI8LJ݈kA|FQ?I_14ݹ\&Ekq/WL_MzƐ9;0JC#iX&U@ken<3RAٔxJF~R2ÇLikfC.DD~h/E"dP쏄j6 D"!ܼ˴emil/1(hpGw4T8~7g{ #^hr ıH2핡E\)=X `}cs(1w& r!0UkϠʣM7L*Z+& $ZSj+@JbM =,[z3E0Rnz6uoQ4P ܑ6sO~He3wsS1҉ [C[Kd4@CZQdI%IK+:nS$"p 8ۊ RЕ2hb @'miT=y-N5az!Xlfd{mo:d] |/BFN+_Ʊϲo7s FoW-'Ű/?f^# ~ތ:T/2QU*ՃgQtRBˍh`4k屰|&E*r{ E=!16_O=-xPGz"ߴj> JRţc\9rDL &+qXcnsVM"N$|Y l}\Ws0RҔd L7 *̾|5@|s"9K |A'HӁ7?X!#hml~C$+5ϰ VvB_đh`rbt:})^t:ҹ\HOG ?"Q"YkDa Xل }-լ~a\ .|+y9a4r> WT h. 2DiwZ8͞V4 7rgpX>2L~m0(D-έYw&!ד_ P6ByәH0s@`5!:zGW QBC3!1qaHTMdžZXZS"ZPu:*x~̬D m0du9@ l0f(i ^AruQ%!DI~囒8$Է)m ujiexvTTx`$/ra=s(2q#FR_1z 1Ymڨއ)ÿɪ}4kdH8"llp\^fv# K4ɛa@Hrkl,ÛPoR!t(3\ʟIFӑPXTV$ёWΥbhI&beT_G@6lr Q4l,)b2ƬddFuVV3dB8g`PH4HL hGǢikɔxCb蜬ILذw߾,N+krNL IDATûC8I4fF|>}TsS/(`O'~YIb iB?lOxbM/zwL t|\S Jgs>laߠ`0f"Tn(Y5l7|TW0L eyy?}Q OȪ&z !*cOLg7.4E6`JВHt͑9$3ձ|d"478 D$cRYME+IKVBq,lf8u6EDtE#EJsI@*\H-"9ļ29K=E0^P2$mT}>-%бG)c2=gXbB8G%ɕ܀7hf/!Q& ͤh|u"H42)wA֒"W֗fhC `ok1A+@$okZߝ `z$NQ 5eD@IʤYnZ$Xz,ܚN鴤Vє^yD./'֭1?`Q}aZYXL,:i\<1'*RGak bHl"PhʸGS!`Ͳxtp\,Q5"^2g&؍qB?8'#QApZ!sXȴ(Yx{)Zr8h$x>"DS bz"ѤcZIʴxhIe%FDoZD6AjRNAN0C>M㡇2KFaL.abmR˼RI0 :ig5"#x„U:rS)Q*.r3&\C!o8 tw(R>AvizI/%dš$9H[\X(Rܧl:Oμ6%pO۪Gn̲[%14&YS,jExbl&RPIlcw!XJ㊹tBPJei Z%:Ukt7>Y$͑'W}ANbW)I}v9*AtiEUt$clUT ]|j閦[7yyo6 bs!X\s<֑ R-jSvQu+P:/IKE+^+jg`26v/:ꛟ@+)jL6s:Q*|{( Eu."ڌ3I1grHvK7K ͲDG%#NP4=0/b 8ƍ(_`$&ؖϿvZ@W~K'V{DCǖ:3ÕL3< ntUtBH8r,@QIgX ]JYHKSq&|_fT"dN$Ɍrl" .)27T-H̐KS,ϱVlo9U "@$ 4]^<|cX͌Z(s,bCredStjHI~k~=8d(iaZ28E =I ،w|" fqPdgW ߶ ? Zu-`6kya6* '& λzH$Ȇ-/h38HBt|$s8Y!PDNJo|Hd{Շ mePF6O)>΍hBÑ*n~~aifMv$>@x;2C/1DaZh%U>:CNDfl\ MY<߇cZZDZ"JаQ/Z%Uqi5U+ql. C uӽ^kzZ7\km>As5B#x\tmi:gVPG"c4=@nx11 Y]whz$@DxE˜*JMcC"\殍5,!,4lpL5 Y &SPH˒TϢ 9Y>ձ'@}@Ź&6h"V|'c ب2aWUWT+^.OMAэkԋ eXP6lK\ +Z:a(:Kz}0@@km̕ U"lQ99,{M F Xcp*(N,4+5P u$;pgmTeI߹`.|&aq"Ɨ 2:I=ocrf>ИѵΚD_fz#:h0iQfR$̤L(<1A ,ᖦ1n]vm+6u}:@Bkh.(<2d_ò`YP ˁuP*RA*296,+^W_89u? a BB- MƔ#s?Ɔg0QvpO + wa1"E(3MI|+X_+@3hh~5,V\d!Ô= 2VeCL1JmNm2pJ=W2 dÝ!L$C(El1,@Al"-{ƫ\oa-zLhabE,-au(5)p=3J%4ffh,ea;p\\2Tkפ^'6"Y: !0JD@H( -"F9b}kކ#QA9g"VHj3ZF/&(c:`j4u嚃\t:4 K[ER /t6: S&ISXi< ؗZLrjt-\H$D0 ƛ8M=-&;akrR E,ŰhomW...Zz< DzKy,\Bk-0f7:áӽO}:ጥ?Irh !@s [fe &'19f ErY*l^[ ~Vv+  $"D 6P\)H]' .0Dݹ,\ KRQ *bf$9e$0S Cl 60kpV5(U83*4 tGG'ZȞ)õWee3L\0Ԣy@ >yη_{2uFO{n}Tde<1#p aa1b d>}->kdGkzt| M_ƚ~jB%xEݴt3 ^0MjW=?bq/`&mWGy]D'SozJ.1l4LԛLDD1Y ŰIlV蟸_,7i~UvHX-wqYqQ ȊQB,)7:I*~sk4VAmBB+ ˨in:-t.b|E].UJYeۖ,յ]ɶRŊoJxONฤ\DoӘf `L.U|\jEöA6 }>j:&,}JD l{nUmױ;Iip myGQB4$-֋'v/\]5=M}s3:'G .[D2AIJivNPz:&09!媁9vVzܓK<'A!$S&ґ(BQӜz1#uU7n&u(.N&۰/t;6L"1K3V0r%3JE@0VQx~5@vkX W[vg}}AZglضl),˶-q]-Jضj_脑ހH!%Ɍ=Y~QMc+,KȆ6~Ÿ5^~&ʮ6ZxzoeqPekܵ[)tNw%`Q0KΜاx.RN o%2hL4W?A hgVN{L0V.gowវtgVPc ݂Reb&=O,#xBH@ "Y,S AilGsq)(*d #}Sr,2Gᆍ o&+ju" BLu"jzI:ђTe(*)`#B;j[+p {?I 5v5=,QoTjL4ڳɉZn9#NHjD ֶm۶(e!۶vqmf3<_r{C[BKH! 43  !&( X"r:zK_G D9̝m#@%]=9|u};խ3'q!9E]s& <[X_汲|!EB "EG{QUUԤfpj\#鉆|kѕ[o% 50!Ggz sE1 E UY*L VGiMy[W웺L$$7#]XZ0'M\a^[Ş2]O$e 7I_Hs\DO Z&&SAh twCDcq:i|tvGyaѤs.yKގsӏxs7q=[]G)wrn;Jk}= % yR'"!"qL2mdm[&'Ͻ*飫m~ʭeHj+"`f!Y&DDJ``Ÿ{Wm;ϣ' !ĒЅ[ u醷:k;BB! ՗B!>pc)C4:9L%5LbDN (5̨>$!" 0a)JK ےm{f* ^{{ekiq\P@.+a8Ӕ-ہM&aLmG LHJ u鯎[Q Hh$H+A|jLRT-?V$mzBK!5€B$%:(g̚zIԄ>٪pjjP1"Mb'|-N6c|3Ri~f'E!Za L:[M씒VtzG)G`d"X4L-#26AotE'UTY҆ӆ% @r"z쿑nMuTE2(HiiHVXM׭})xՠU:O?"S%tڝ#>_{[2nUk%K%]u*4k%h0 Na7n@=t=VXܬkR-CD.^{ſ cX%6ɄBdŰ4٤}^;h7-CFXRtw݉7pA4*+QtB ȲaٰL{O^׍׎TML2q!xMeC F r4K k3jn~xf+ EŽU` A3M+x/検v:xdFDՓ'8zb~MNB+"f.Z61"&>ȥvlVvfg3Kk>=!?5BhgE5aGʓ1)I,"#NcɖHPjţZzP!{?v3d !L ,EFťɷ*> \__Wtl)qWFckq^~V~ .,Y^S$K&쵱-pcOnf)BD@mAQf.P*@e +&z.i5V:N;=g"L\˕eKahDy}Y¤Eh=Ƕ>؞-jU!;~l! OG<׽O~ ũQH21)E*\s MMcY] m%ouLO` P+g}f# aF:2q,@$@kHb-X$XMȳbdYtiX{?vb3\ޜ';+[Y#M 9'Z#Ը⅕Umto[v :нnYW{ -uk,gw<|Yv:]oa5}VXխԪ $}eYʶzج\۶,rmu\u_^X;C˧y -I""ERD6Ͱ eEUW/<AŕJ ӻf[wNlcڻU[ZT*ɩjk5S(-"3Dk,s)``N@_ I%V Y`/xDkmSsڂ(+uCCЀ@)@}Rk 3D;D = ̯[ω]%6,rLGhfFƛ/j%x+]bw{پSw-}|l1"3B*Vd86MvӵJ WN[<Zh!ZKD^M#ULxFM_a~)r߬(5ePVMEFɄ>7>XewnW+n'Ou+ ^hŵU{vOءIL(1kA(iDY8# Q&0QEJuBxe7-qr)Y !&T?[?RS"2q թ4ZůTJ* oL{@j@l8$H- <'ɡ ORH"m & )(5Oc~nǫ[Xp"JvW$8fEh{ĥ;XǾ$LIdDѰ FȢ]ad$0ͧӽeMNPB"#1 %e:7c?FW_mШ~]M\|]*}y#DFm"Q;Gg(hb3)c擏\k~ё0։ -A" 2`yLtۚu  _2/M*vaL2oД*AšGPڱvaY?wbq@k /,|y wMl驊֡"8 G$%o D LID,%dwWo @C2mMT`XDL&I\KZ;MԪUԜo?d&\4JEUQnUۃoQ M,BPc)X/br]fhqZ0L B+-(3x9QZ ,9xz]I;HgwY9"`Ź r;Z`0!b]]WV.91{锐"ŀ"aFUUhr=dEqxO>99ooH l ڀME1Ikپ'B}pY~zJxO$$:hB}9Q5eE8KRNog~=!b0iQjZ]NѼ.:YA ɂ A{9:4 1kx,"vZ68Gaegv$:Uj&sO}V=C MNl}gSfq0"X5FkWLm?yHEdÁ8{+7uԫfyLhfEJer&KMsDU5"hP&QeEƿ{~/o-/[h Y*ٰpQ 0YCj&u9Rق ߖ ЃG0[nOtc |C"틝3uWlEQ1a>IXHv ݵ'|P$倝 !L:R&.پ+s/H DRԍ6رX(" 2 0%8!R`:lđs$M(mmvD} A0тP"u 3akUb_W}gE@ŎP’iBY^\XpvuPe>Q)7kSmEyfU)Q=ɖ9hJ a(DO8), W?[{/eljU,cU1U oӷ6}:kOU!`dbfzNaBoy\<8wKmˇ n #ThЂX.AhC3ى;cv)laFמ3Oʶi`V:*V7':WƩ! * CSݏ?@ xW7G"aP([0U1>Au'lFxhxOKH &%820. v}g56S;&@~y6nGĝԗщ2%؛"(qu0(]B}[Ng-?/gf$) =_ҋz[lo8~rS"hyaw[ \))"RUY)尪9\a((P$G6AzD~hhI1fXug>ocݠWeZlm`FV vxm ¿LUi.'Z(T%rkpPRmd>&(Da%5A+j(݀ %.BLEĂC&.I onP eEg$??܁Ma9e;^`H=ܖ_cKYAHTTj駁]"^G3~g~aE`q$_=elXO~Zf'IzOS"D!!Ɵ !%ZH9oȪBV ;UGB®42^gC zO e~y{}?gtm[<zAR[ZZkwZͱzVTJJ:gϞ_xPPk<<l׵eYr+f˵QOc`襁1Pb'˓FƤx2,E%G.m[Nbs_9UR[٭i Mkozmߘ;ml Ad{yawnf 3ZWvطv։mw!6hŹER&h{hXꡣNhYXvWtb|[.-->Q(&+HR Wqۭi;1Ͽ3Xl`A ֘v>`Hm?_/Ji"PgXx;Od7hV{گ7Ϡa`㊬abXXnع\u졓zZ0aBO(qFXUNb92#XAˈ""JMHDE/E/~6J~{ >~pG!7BeFx&?Ltlk ǫ#$d,` mv][ځadq -52sssSccj캶8m1 }g^+kX!RϿTY[VΟ;Xm:[v]DZK]ՙ#'<_,Qq!k]|:fYQ\z/1ǁQRU"D?$" VݝO*Cʅ[)Y0piV;r?H+`D\ l 3R~WF6Ƀ"-h2:f1M2ǿO2+LJGyP&a=s+(wS$Kx'Ĺ9bHQ`+ǖGlKKیwb&'۫%^Z }!$Yd5 ]oݱt) >n{3OL^/\ٜTMJoo֥2%ixy\'I3S`J.7՝W-{/2bbzODԩ>)o.j }Ů[.4^I`S'tдdܧ=E:tႜ>n%P/&_]OV82CUrTEV]:4|aԒe|m̞aTPf@6p{pC ~  ӚQ$*&f=f;$]ۯ> ; {xAB$ JDZۆ~aH;Sʳ*A`lv`1X}1Vi9ۏKGCF: قy0đ#jdQKSly lK׀Zk{\q|o\S/ymAa E uy&&Fo~ewXZX>ru\nU<ɨ9D"6 [QfVHUBmu;L-{kwWX'8(ר>{s/1=83޽3ǫ:X'̈L>rYv-`#f\NdKi6Uց,հ`}/h'm *! 04VMMw'EI?ꉥ\s 6}h?D}i$pc;q4  `-E>_/?Uҗh^Eג]a8Ck8 H4a̼O0M}]_{L*KPwj `B 7ނRܟ۹Vt a@$3筤DAkbnn+td|pXӓo{h ;TgaQ]@tmn֨W]Z[^jZJ-cSӥrYi aHp([12n-L>蚵$`Oؼ zQ"89 Edb2InNՀ+bK7,h-S^*4s9S5n~gX\ё#|VKRV˸eq $EN|`o&3m|סkt.ȥ6ն_}skC/&mo}?<7ּV'Gh%U!݉&O ` R?wۀ/]l}]-"A@QyG#UChA*NQ)҃xBMF2RO~E*L5Z%eXJe/s =} ^EkH(ZxО,IiYjǻl7|Dʔ5IG~{n2(R3ܴ^uaEE/ `KDŽ.SN%D<3ԤkJ=VWח.v816i63AH@/J 3)m3JPdTw,Sm U)a r?#O!HH=2%gLxoڡK"TrafK_|&P*;yl[jﭷåT.S&\8,l)'aEY=/8O^x#^~a.PlQ6_G*~g˻]耽Cp u =-6d1bK},9Ʋ‘ -RѾmn\(ΜIE5df<81 Rzl,=_NDel:ZY9c;Ԫ? i_D4"571e)(]k9K-fy*gwe1z^+vJUȰwH^=wOјLMq8T*.iVke帕[-V;?#~loeQpDD`0b\ i96h7{@׋G ^}_:=ЌNU;7ЬKnož1mEyڣ׶8߰dUȌ=AWb} T'ĭxb7ދ_p1$:dext~^g;e5̽i][v}ksjfY#%u[6d,YNdYF ɿ ؀AFgrِRK-v_#H>>NU眽ʏ}νHV+R(U{u706\V~bq_䙯_{k@aEh|}dK(Ngk;ȿ:zFys7'Zfm1Sb |SپE{ff.#/b+>1N4VMLd۾`nЃmXlf5ncӽ=LQc,Yl-y+?gN07/tnݛ&(gvj*YʟXpϴ{1\BgǯEg5F=gPj7wZ@{oO~?Eb<MCUk]:Fz /?Vb^sěxɦ{ IN'@9G:g".? |{r7W?$bAֵ>u[&|vw<S?ŭ}!93xᯞ#x1SxpDnq`"V4xY)]@(FAjǪ,OtUŚ<װ.蜀&5( \AoYb:EX[Sz}fOkE?=gմRE&!aD1~sb4R6k&5^ʛm g)3;^[XJ ws?8 rz_dRSg06s y(!!9jfjXEVCc516P0%DZ28sT#I?;8u{vbDQX\-(-(r X`RgҮB_|w#gQ3S'WA`$5إ7/o|;/}9J/z4{e:L0´ ufm[o\敏ֹ8Ȓ:GВZùٟ} _}jOŝXñVӠ1 Fqȋޤv;c^|`kIj^muTQf4X_TuaoPmvݬ!}]t[n=Na\Vi=uh4są.lseKw}K2A>hµCg#G^bxo]{h{ˣ5UKQn3:b*yN"F{/ti͖,%UYݻGGG*LjIbq3/ CkXya kь?{X.ÚA&0 ;=,o?NUuxc[*&Dpcx-\ˏ?XyO{3Sf6d~Bi`d+H5ELEGßEv+)T(%3V&8M+pn76XZU#ĄF٫ %vo/ǙNȗ_(US<cMO 3y00~yp&{~$EU\Yٗpǟ5/!=ޛMxryx [8]-rӝ\.?A;$:/~6($9x#i!*ĢȤuH$ݿsp0ONIYeTQAmPx~kgײuK>Zn$~ ?PR[,O smm˟ cYY=%%ӡN*V29cфײ7_s1 @RoۧI|~wX^e"Vm$`DЬ (i9lfU&m(8AU@OR :~N:l2@_,Z&·:iH">y^xk9_gblZ掞w`oAc"ggXV4 1y7*tiEarVf ݇_&E/oQ ﳟ:PD(.} ]!8&  9 >N!2 2%̾*!6i1Z @O׮wwVO\uehzʪO::ޡߞ,?> [OݬւOG@~ނO^s'Ic(;ro0}gd:VI9O'e#5է)Cx:z/O\"sݝ'(p;<K/BvڏCޣH9&߆M??@ L1p85#2px7_5\lκ.+Kk 5t  ^Õ_qPGԆHJ),A")#KؐPJ#J;a~%g@0N%?Da;!_ڹq܇`׽W'i-=5s垽m;G~qN䙋s׃Ȧ':bzF~Y*B@Fb!ҧ!,/F`0L0MxsYOk: V&U=Lvnz>?̅ n^Қӑ=:p^*bDCWp~CaYBK,?bvٿz/̣h.<#+c2~" Mb*d8PU~M_#1Q]n VEn/'շa\&pچ5Hܣ~g{\>. E߹}PY;l46008>X*a^b3g9}\R}@IJee.m;NDt@(p ۚFS5 uCB ZAJ{iZQZ4 !Te5Mܾ{|_d{sey]JDx)U)B0E!:xeB!egPC,sחTMgZC+hXCgN0hE6fJئAHM% :=A4G'*CP ]Bg"ڷz-ۄL54ܿ/'~zZ54ihm@ 4}A~ldA& ^if}/v?Рd!y*V٬jכ{ZT=8]zҥA;c.͞s:r8)MQ~՗ë9ɇ NcQrI8ѭpGBPGu}9IYUu]USY` vB6@ ۾>l༙IG#5 Aтj,*V ѨQuZVA5&khFBajA\6i#茰 + 4"-&`hb)T:YjYEn#HSR+kƨZZYLkVUWJ+0a/b(̦j5)z-TbM~E '$ >sX o5\&Ž>P"_ޖD'*{7o4D]p,PNs9_ؽ}!n֚͞=m/?;}h=V;;(BXUKK/xsxcƇUJҙɭu9RCHYh # M\!M%TRBX595&7ۛr"A)#}f!jVy5]?t? 5l,sqY'e+T}>a "&Lck*MY0ooʨ26H7 "fܜf#_?udèTcΌJmY̲ZT9qVwD七y3ͱ5U'Aل9;s^le-o !6;[WU/ދw9qi eY 'dwzQi3l >f#yYh|(1j1F'?|ޫ`o2w<[`.YhSvP!S3kCqtƃjZ,E|LYb,͞Mn035%f['m} lҖ-1bןOɫpMHCvVMTD6Qδ>S"`3cxZW 6, (H81Ԧܸ)Bxt<]t{;Ⱥ\!B l通 FlT"6>+,p} R#p Nt.Ig Zbz=mFP@~2f` Ch2S@u&co_ُ =׺&?]+?"/tiefq:<,EvS=z/==T3rl}enjf1h'fZ{14FF.ͧ߾exhxtpWW7N} jkxG3prk(۩](C63)?9=エ7 Ӳ,:Ahջz﬿1XA^",}Jzm:񅐕[&bhӖ5Զ6ʬqXK{ b2n~bMV*f)B'ʼn7KXř?\Z8L\nf(2oZv-fzejxo_sxL@1aMxM{#`M$ `t V}v*_8O f.ʩcؖ:1kVꃹx?<(Z7be/\"<8/ ?셪xzl8{_[-n~4E3'`J&I1~˜;o|wN,Gx<liy'/>qL aZUu$$&1z8w=p2 3LVge!1j9%CM-Zl\ܠ3Re y3GPuY^AY- ZmN̽Ws9Ur'IrDJp!)F;) E]Tx7@fn,a$MSGuMfrA yddo}I\l76L)  a2n=QS!)MZinSK+5re>|2Cq[?s* Xmh͢61I/ֈT1M&?y<ȷ O:i5~ky~?1 n:MU3Goݍ+kNS϶W][^Zg1ncJ_~toܺ{ox_>/rwx\Ӫb$/VǕ1e6DZy[+9PyJ!6v&I>a(`5"e}d}f^H 1&Ȭ >wzwƕkZbں&)' [ Ŧ]/U;zsy .Xg;Do9"&iX!GhDHswj1"9ʎ3pcA:'e+u2b$ՄO4' IDAT@D (ff`% h%$ڡK ` P[E >GE(1oPIJ[A+l]pDE`w:'7dzʻ(eAHA1sT ZmUFc-;Fe6 x >_lttxysŏȥ\VclF`J[aK3lQohMYF㽉fhua@9b|,no&Z=puۋm\v~Sw)T`ptttx4>/z{1f7ZZ=uSݲW Y]hZGo=59x˗.]_?#G/qC1? TN7wgʣ.Jn/:)[0=n%7/Ls\r(ӵ BC?FhI\?u~RT{0Td,[<`h!ÙXS %oZO/XBE\2vliZBir٧%1V3Ā,vh;Ј: =ϟt d!ȴ'RE VP\G xvЏ$!-%<IdAhT8ga)j&؎μpa4ΐu#Q1~[VB'$- r:AohA2ZFԚm3Gj^kZ#jsЈ W%DK7K3BFT6Y .8 -N ػ n̂hqV '?jj^WUlPx>Wc9 vӘE3{8=#;̙S^_\n岶}]z)jF[;r'wʗ+k;ߟ' yFkޘϟZM-(D) !n c֎`%`hӄott GVyji[,Aʇ;7 :ؙWV$ iɚ"7V7#3N "N݇nA 0hl&p3GfDA3qsAO u `i9GQd@4 } +@ =\Wi1"Vͨ'R fڤJgSx sPAT(/ԘԕԬkշ@#`S4:IoShޘ9-Fѯ(|<#ۧ6SeBK?iQÄsw.bR @#Dzc9Ƙ½L¥}kٚR IqeUh vz̧6D Gc6K^}s8)'7Ϝ:LhZG:փ\=Wz+pqѡhr jqƅV{oxzsjN]WUY:E]\3ᰊfѪ3TVM! ;gwk'X~}qœMt,#{s%,?Ynܿ?MJ:_Hک94ifcU9iY%j\( 0055 X,2pmvzmӒX1VкIâ@P\DJ4"Kb *HR,2foZݼNcf#E Q,fnJ*ᅖ"8+Hjy 2 VM& c$?YKADg+'!ڐ@Vj2w|R67fِyAP)5eDL2]bbm3c%&3!NLs4E ) U[{} ?ʦ)t&hOaґa_::?yvKN~/ j4޺?7߾tN{uH޹_g3-ZZIJV :G35H>z[=KMFԜg(u,L P,YVOYO*C tFPŒ+bFDk ]R`*2!0Ѣ`5(hAcSi2*+X$qEFjR$ا CAmܾ,Kd4ͨ5L6vhѥ^bzW F#ZP*BU0ykZ5aHYci8`PEF335-"F$PK<&芭"pAcg ;$y$7-dy ښ@ѳh&ٕrݺ[ne^$a>??oyk֛/|٥m3p>w3V *|f+KL=qbԏNxo0g_~]uUա!FZ*8L 9Tě+de{3Zԅ<չ}1Yźb {.7das@V33Aү]=?]qp0LjH^ȉ܇GݎI"+nyFg'/e- tY[- %4x 'A! b9IX urdcÝAJ}`il=:&BlDBcS4 (d3pOP)N"mfb5 CnGT2Q0BD-( H/MCN0 Ʀ3HV:_@3MBBRQKXrATQ):x؀ M\@&Ui6?#hiHn$5>m"eMj\&k cw6qE]蹚F@|ckKix3KF {JTIqrpJpZ&Tc H>e#zݷG7v()z]WJt5zFTc@3ئ|Gq3812lZYY(&ܓ%YdA#q<3tIU߭?2qyrZ?aW] KH#ϗ>jCA QI(K0i/o:85dq t@-h"i2A!(< ¡yG-kCl (hI$k5t 1i4*4&Ccy!I&`bQO@o )'-Ӱ`Z𖭿}4+myL|Dd9KA{ Ӭc Hm[$<@oпGx0IJ,XhPGf%VE.kg./ qjsP2Dx3Kxt<NڹqߎzW51d{<<}nim]v樎ǙWDոp(j7|73xnm\߿myO<Xj63~줟w_y7v&=矫$,yl,fvv,NPb6-MSϔo!, eu3 !(Gz$092"#2C^X 6`9LakxMbh`YbQ~!Xjͽ!)-ke.4B,RI(T,urf[^1)lx}7X-X{+6Lddt@<_uH5L jm͚%[wyBFnI-lZmrvAgGMٲeJ"$AQl6hэBM콖p " 4 fa $f͗ϵ3CƋDqݿusMϸyЯNPu˸v"jX ԤQڃf0܍n8~4 Ԡё4D*C5ӂ Њ>o︰˯۶/Grg|8K!_̬}?u{z,iS{gkHof1 1v~1_ASNڿ(͌(3$:1S~f=C#3Ov4R28ll;G(ְ2[+k <$ n#0[@MD1(\MmE-dFeMcTZ3e抹634 ⿶Np`JH'R W ᾳhD%J 䟻m5pXySePbLH;&c] ~Ο<[fOR14eaƧ ڣ꛿j~}׮x;kٝ3i|2sM!A*[X~:l'U l GDAlKۨ˯'}^-pl}|4!iAcq]ռNϖg'`evc;8_k{|W3?~N~aܤdut ;~2[t>o,,_c | opqLD5D.O@?`Y2}~]qaD|8 5:h@)`γ36p4yh@œC] \#PgM<̢R,4 z0P-8ƥ3CJZܨ12n pp0t1}?p53,{r9`Ch0kAqCGZ'][<i(atK!faZa'h%'WR=@ &Rg>Z=蒌GcT[??3h١4{5CkعK'\h5;p&Nu*Wupc߼nVμofI1M.e{Ox PB+wo:7^~n-|K޻6KrW^yn>ʔT0LuԬ_H뜘jq~r~xcX``b9(.!a8osvO[_SWׄ7 L3iMp03`vѢh -xz[4z>7 *DX7c79 O=`X`bV  'ToH0._>|]їxH+(͖5P4泼,q9/d2Leۥ!qL.&606q{ҠG*^Uz۔bۥlȿY_]=l^״m}fֶs"]~5T/y~VXvG5\oϮ=w7"!j"xO?{[/ݻsꕶ]\}ϾʽO\D`g6K}[_̭pW>| :u~7 |ã_ٗU҄eє)V0g&H~K+laK!Af&=1`^,6c4FR0F*&`MC( âCs=!gF]XY( f>Bs?]14(>k`F$[Eɶ!cy eh,4̘Yͪ3mmh&*fog|ձڍՊ6]m"m36qÿxWgGGW{ۋۇڌ H35kHѠO_:ЪD(pІk'o|;bo>k\ۈ^|=~UF麶 xփV̦åEzZ9EٟϤ_3 AgA6[mD$s1 E0ٲK(\e[Tthh`BDc)f&VN0 zTyBk d ,wj|i7P0 !m#YpPo0"ؐ lf9uX=[e0AuP(TE0uÞ+M\~Bmۍm,JzR36NUYx7@qb L,r8? l8{79b}rG_wu Sz']4٭¨)?=5ktk1rA8yҏ/=?uS="5M7ë7?|vgqN~ۑuRzydy롐`; /p#ե!P`0[5Am_B:aӁ k\{D1KOf٣gTz7KgXTYݍ98H2S2S 5s RېLR8%V @0q4iܒ}tP@ &"fAF%)Yo\[$6`5A'؛k!X8q/}Sښ\ESXi5,,ؘ*Zɧ!dBm0lƥ]O7@)q!YƇOaUEx='Vx&((>u.t;UYcn.Oԯ峳 w'WΡv.f?)q:W2U֟<9==r ׾pHT7\}?vW6-ovk݇wzmTLGcFGo\_<;_t'C@rU'\dmN% sqrWBs/Z Co$Pg& k5cutC V֝̿چu(̅O_[@fbliAE [Ђ\z'!9dvCfІik .%5$8AETQXEgf0&xeDLAJI .65h'9n+X }!9?~JЙ_O蝙>i^+_{׿S9ƶD(\>D-hš,љ-9*ZMP֗]HDk\7cT[;=Q٣m@51ڐ$th^L& +Fog沩n\s7^k ::#k?[<ڝO7z=xUy r#dܿoMf7}zCCJ۰y.uo~bj˽56rKQ\ ԛ'$/1Dиl \V`$TCG{3^K׾<9~\3ooöCcqop3,1{sul֣ș` U\%5GeD*f H:(L7 4##X%rǧh0QqtW*,~f>dIdE=aDH )p*f4:koAiyo~z9OF3qFB$DZa7̲L"LMY0x` LAh:IYt1¤̺XYrǞRJbЉjyI lJ9rϖ(6*c>}}s/67N=Ȇ>o\s}1+;4re\HR*>zVU}=c Λvֶ]=wy烗yt46m!DurvZi43:7oyug:2eA~;.,֋% q+Eϰ3+A8Ȧ  1*0S׈x 53Ә+ene[t]@{4-yI;3)L. ˯/Ge\>BRrG?ue/c0nGzZ*~~EOr_Nӳf0:XVRBi[6gprC% :v4:@}>&Nݷg 6溶Go2#f0I7T4jX}0rizBV]M{z:J@H i: <u-+% ޥ^WM6뀡X$2;AɜdNfYIh0G7è1`8xD6lZ02+ \ BcNc?A!=ROjb!Uq 5mQ\I b%dك{j߅5DGW|lPYythP(X! $WlFX1sEo&bl0%0;XBcR#C^x9L)q#xF(gJ>3s1BbJ9phc _0YX>7PB1CxGDCsFDM䲴eft6,m`DA3mh"KO55a*@y[IK8J:Vk@Ajad L6>I>.(=w*$$WʚlВH6\bЩ+jGnuk"8;؉śL(&@԰q 5Í\}~y{tݬw=asK=CCC6!)Lc2g`@6ޜ1lyjڠq_e ݱ!x؀6ed2wҩ""[tQ c9WxEHN!In Аm Bc&6Y.z +'z4d͕zFRSB0(] HwFҊJR*ѧa>~;˥DEș?y+Dc3V6VW:12qX\?{EUw6E` W`% ژMy긔=;ojG$7탧_X=}=k32p=P3ebJ\R"MYYBERАJ<&27k.GFO"MF xgE`nIW𫧸bB YqU*VL1[8WTM3" 1{Ş~?X\^4f- ?./7G8t^gkͻ/>G/҉s 34 ٻv7A{VR&S1ҳ]6vLL$ BhQGJ.n L}uy5e{xiKҺpD>㣓zT%swNj{BU}~ :X?ruɵ̢ZĹƺ' ţͧDjlљ|Ҽ.ImI8F2=C2'DM9&$`_S/?{ *;wa42/hp0ke}S %(D9BoPŻyrdo-J4W^8fef h1@G иkO4a_̼W.%_2~xE,ۿ[=LPɶNG`_ B QrFwK=V7($eB5ݷb -frO%. ǚ_Kj2m⚪Uޏ=Ld%U2fO*Yd_%j#*l~hz@O],e}1`cWXNەL_O{[b CzWn>f{7.u/uƹFu@*VB,wN·뷻5 fECD[v~tm$DKWK::w||NvtUm!1CHwr6ߊZp-U~k'<'>[Mf J#GъX'hqf$ݰŹ!oa4:(>g$ ]Y7$l#βhE_/Aˌߡ9P@t>4:E"3pD4Q29W\f> \ ,TIDɟ@}mims6GUvXR'w2=՛ M7zsB/deሼL^B vM9U3,Mp-sBؚem> ƩG?׳g|<\]tՠ>l+r֝7~~Xk|^ޚn~ۻ}]6 K]}ssW<=NVr>u#YHh< 44"Iw4ql\LC4Т<R yщj<}7Q{͑zFЯ&:X;U=nIZ&+$,80+f7 v:>gWDJ?Is{qA,$8f>N.#収 h:x\GӵA,Mj[f[-˜bío7VEj^?t;׬yuo Dg}lkiI*~f^}VuLѽYO㏇婺[׮^=4xAܽKn2߾F4ND8O?9]o_tɹ߹r{lxly6\.aHP'Ƅ0BBbHL`$)D4D74AHԜNrabbκVТAMZ4u(}3(?E'UBϋiDWZx2XQH\iĜqDYuo͒X:<Sz*u4T^BSEMY;4I]b&KU$VGvLW*w1M5! _xɧ<^[IDAT_e,.ߺ} W.뵵:[n6wm'M+Ήݗ=x{T iōat°ʯIX\ 4sM_l.;Rb_!q)uM'M;ogᛰ>HP?Ě/|b::a [q6Wˡ\ d7ӑr]ΦcZ >(37L ?ϪÖnF's& _PN+ٳ1(|?4FѪ~RN0uv-*7!`-V,UbU-g#cy!6jaӒ eb_۬ 7!EVXpLҙ8@F7mjSzP6ǓB db+[n|eղ5˾uP̊`B7h-2Qʼn) $57|0!>S,iE'Fr$sPKW8*o/.xn\֑+H^Vk>m^}WhK'^+',qYQjfi1 uR*I62IZݷ%2$nm\Z;EH)i"i9DeqGj쥦UBCl^ >/{_uQU~l8 n0ܕbH1]↷Rh3T)6ڈ;Gt~i 2j[CW%* UTV*XiMjc%BzOVC9)iEۣ?IΝhP꽆\~ܻw~״Ch࠺Xa္tD/q??X\״35=Nݵ‹i\WH^M*= mՖ#r#c~Hl^2Vz'[b5!>noR0zSDVSmlt8}Kat՞IW~8^P͕FG~sSḶVT;۴_W K]_-,[0Blf52mqj0﹖pjXS܉p~j8YNU?6qS0(<ip4UT4i4?y?Qy\>m7Cuќ_fqgo>Wym Yý;fKZFRY;'u J;>{r@V t#hT]d yC2VrLgَɒ''nGn*WߕI6*'Y5'V Ra50*Nxޠ'gnKm[8iQ;jofeUyr'=fH_-ЂYkn=VéUS7rRٿfaH+421/+]4S A5/Q,=KL2K۽2HνRtҭj0RO˧ZkZGh+wp_>_D8." 'э$(dH:(B+f!V&5('G{b IUJ2_K **dh@03ѐNfݷNˣSs7(#uU1XSS.4)Xy~_MCi(6~_djA9*1WqW*VY [U;1};?KqGZDD=k-6e!R(b^| I# Ҍ%5I`w2C#[%`f!/{?yxa*=чIw[f)t+? H8ΉsYZH#`GP5~&,l^-Zi[ "$܍s6YۑxrJ:cMŸ ).)CӍU/H֔ݶ{;Reʅ_͘Ɇ@3Qj)g* ʱ.C*߈htI) G8p;bˋmtaMM2Svi2+j/6;q+/4eN; l#'=TEUU6Ha:ilt{lẙVDJ$SYe+FiSO=f=L9 cLo10LeWjկm˪aO1}z5aHtfBܺj+"cZ"ޅךW$ږN.0I̚UNefõM3}1"^>0*GZ<Ndamnۿ3)C;TgmMHf"֦ fؙS3V73b`xŷ<(: 2AUX bL1E6(@y{yqMݸ}Iv ,)7c72(V(!ٍ'"e؊ȹ5YRtWGY9P1."%NU9[Q1 =!ĦF.pa ф|ծ&1]lcdqX7MNYf4!"-V}m{b$cXMnum&UhA}KcDzIX:Y+ue*h&`l%fL +vIdg9l USibXxk@Oskf#-@3҂%j:R`S^hEDͦMdhI!toƺD9Ԅj PYYdը} fZmzK"ZrHPO,2C:w58[ږ 1A9ٱ h[|.2fF LC2*`"#htFJd_n v&Y`Jn綏}xMʄa 1`W8O DW! 3";PGU*1f L& 5M{&i9ԨacK#-[Ze_M jqRnj&K8ҨZQ֠5rK\\ʲ꣧,,z8JdÊXu}nZc#~2m."\X.Nq|+i>>N|"ISSlǖ^`jA`VSDq| OVN0/`RX>4*ӹ $ c=!"Ռ<5i [@ozȉ _f*,;2[Kd vr1)kQi|ަop|JsYe`53Y)v{a | z&!?dvZlIv v()ttǼ_SYPJ D[o^fӭK p̨j-,M#!)S jٖmxj#͠ƈDP0c pI|>oSx,šz:1[֏۱Rg;[ S,7 M~P8xN%E[I_k]}8]>ЉŴ&fx:18k+F_m4`ca(c;}I"MM F8q_futr7m'85Z%Aiu$m\+ɘf=KqۉSd0I-ya|Ɨ *?*֨Prlg?IOG<:& *A2O} VWy&ʦvB7ע|M->zDEWZ<{dx8`i%Ȳ4'Z3 ȆР(_ ZP嵭4S[-X'! y*"p$ph%5&íBBG&֥"jbAQ0"b-Bxn761⣏u*II,n:N;5X6N5p)ponP*rggdEp6j78[곾q' a.reEBU ,цR,EQ]=uhX(S8n$y_|3[0Т` [H%MEF6t |ݍ~vذ80NƎF 8C1{ϤD_IH\k qD&;nB.s"++#ظZ*{O /x`C[] "hu>2^!sbw nδϻqտ^pv'oG,Ͷ 9ԏbȦ f&2&1%eK *In~.b{J0UҶ7V,Ӷ&l/wN1e)a3DŁu,orqh1H7LUw6!^W};<_r_튿}dnF49t)vԂmWidm܄3IZUvKk *E΋= BJuDp: N[e0\;!)~Qô0^豢>vq4v\5iV+u_X0&A(R1}6j+ZԥzC[㽈d|g֜^_N ;VZ]am|g}є4CTWbU1] WLyQTi Cզ1f_M*I8A?}jqOܛNmLrS.g) fU=!1S yMiEo[3>ö`!m eW{Tzɽ߆( 2ܺ[勏Փ.`hnU-m4*Xvq؅U[\ۿh|DB5IENDB`png-quantizator-0.2.1/spec/data/sample.jpg0000644000175000017500000001616613755457403017556 0ustar pravipraviJFIFHHCreated with GIMPC  !"$"$C" D!1AQaq"2#BRbr$3Cs 4t ?1r `\ʁ#z)mk b,S6rsyP5Xw`%<)ǟ }3u{:֟[f w:X}9lM\9GVgtt'cUcw}N;U` Ic rr:t#',c==h4[t8{mzz~@;01oɡO>*|\4R:~@:'Ct w 8wƐZ9^nI%prޱ|^jWeBikw|lq A[w*ޱVGçhW]vc|fү[MR6?K@2 ڀ2)x*Cy?vUm$`ɅdLP4cd'>9I}\IG$A7GƞxPR95cdPL|'a ϭ5͹"?('9hؚd9 wڂ: \Uqh_/¶rw7a?6ȈFy0yzV65KBYoiCl/-HX8zO^vE(X`pA"Eb|p@ۛ8ύ3h}ٲ(r.Q|G/.=HǕQ? ݰ\Ag lu2[4ѧ@R( zxĎczn\iI$ޛ3|:).:;yAr?QBР>|g$gʻ]/tTދ}p CZ38;7W,Fv9-y6zd$\Z|=P&H 8g;zPL.28K|,IZ2Ċ2] 23#]imuZ<15̄ctQvy&g MuIz?CA^Ю ˛ pr09Ѓ[῵,ie# H'Û0usǶ?3o,mmwld(&3`6BnAm̖$.>S du=je-^_K)>Gn8(ɕ wPLKSI^[[QGy0Ϩz7G-ܲǞWna31[S]M I-ƣ7$<{СO @_Ŀ/\{RLvLBC8xP8,#E,cMI4r8 tޏ+lJoM m (h_| XKyOQH|rhG޽ޙ"K6PX7)}h4j}QLc`vO%=~kzjNnoW_G7Wy+e7Wѻ飻/-yѬѓJ_3|x+0a3ޏ2X)ˎulz^ "LhBt)_օBL6enLfqtrǏey cswQ 7$Q#s͎uǖ -̣ȭve}KtGr 7vk;}5*!N?Jc Lr=~Vcv-^]N"K;nSb2~V!5~.WnůM"̲'x9pr0sQ(P^ J @n~8x-ibrJ|wCf\crдEnY/unE?٧YkO܌s<"8D?t ss+xfB '4w;b}I4 ( B k>˪K!>bqo)#O<^n^a2O n4X1%՟0or?zF`~J{ӁɖKm%gV(Yeqrjbۆⴌ$BܜrL 1@o.ܣhƃ@ ؐ*AWQD4tq2IvTF$^}3WƷoyEw mw%.$,rfd8M]kaa #L${חS8F"EӍOյ[]/O.X`z^ϰ!ISTʏ@XOzܼ\p|7q$SMo$R}\2N< (?C=e>̬eecʒ:4Kfy 4ey@#e:>n[[T+hZ[ّS|'I勓οWWyξF}A`X 4ש`"9yy, 5e+8 ͑ #f#< S1ܹ 2T'tg&b? I'(s8堌:E_ cxXi {$ƥϦ1}+j12[yd\4rww[f7};֨EE.g;*[{%+ؠ;Ne!~ Sy Aww/ 誰+;IϕDs ޸q9vhFL71jNYp0Ͽ-b9uK<(T=}c9PXfh{c?aMYlTy`{h>X%9xC+TP]-dk(&%֞-"8TUv=FRܲ3uOeRwGLz +S2<-,/ @`RkJq[q?j7Yl8u4Ro!U%ΰƿ]z~c7W4Ҙ"c:P1Lpg_W:bs\]5}O\[?5vnd_X\1G,mx@0c*8_Cׇ,b I,NIJY/4ymhdaP`3\%=|s4Oqч#mŇONn`!=&X,ρJsWȸҔH'>'b@׭5k)9 s/F_b zczgrirPVO M]RR.;E3]p6fI-瘟ҁ%>ƅG O?lР%AtB1tbav }M.bYso('MP)jtk~Wrc|y{ՂX)'Eg`tJ Gm>zm/myPQ%ſF0>ՉY|^A7U%0 %HP zUp+R:- hm_Zjڜx 4d=9]3`1 <Dt͕۲FAD# &*ğ ]0id^~bN;=F:#]C6B&rM5#y*G+YPSg8LGwkjz: ڳ"2ȊVӞL`p Ҩoȓ,"C$j#z,̎cʃ=տo? ]P%I X {U +es=7v4S"U`rmhA/F6;a)qg*:b06Y13"5Z44*w(rsS-(L7/K6 F;;f]u ۭ6u8suz9ӚIb%2cejb6%Bd)hʪ+L];F(" #"0waG(@v,ŘI$5@g|3qaa@zC i(?K4^%djɜȏ*c!o&:d(@%eb@ߠ?eDPkn!(QFˌ3z#PƝZ5`1E^匎s#;d'ґ񕍔9iH6WqN[4^Rg8 ѴQ:n෽8Td7QR0ATb^4TlywǸc]#=9PƒW]i?S1?Ӊ}}Ey!Z?XwVq%c  ޘo[4G=Ve̷کnP&A iyE!@ JȜ1͡ oXl@V][Ik<3+00#hy?aڅ Lgd[ĻݢpEß;p^m\.TnF6%"k7 PVfb W+9C1m*틳9մyk22cZ>$mIU?][ n"(PN>Cqj|[ķ({!sʃTpl;4eY+c4C#$FFS0EEiφN~CF~,,kQe tX6<<gAqqF#DAf;mN}t}:Qt5Yzy~>y qL嘆WQ˃LVF<ɨ4Rڑ7%aW}'ށ_[ɏ0)XpNCPͪ0I 4# _ǟރշʸ!8 .^vQ/(&2Cd}ۥ-mmy%\0/ywmh:t7CnctiPS>N0S3h=t?|Pi]'V^'HV;t^D}9#.P/RrV?-#Qhiwg*20G^BOejF=}[4TFʟp ~Wm-$DZ+C'1'ԜMStc')|^=jxHs Z -C "Y8R' |+EV 0+q&Gا 4ސ3U:b<]wV1|2Z]5|B>[eZ\F8:{Kuq泶$$\!@J-5GDl $yWVi x %Av劫*cbydTg"C :Ay2 j;:Рpng-quantizator-0.2.1/spec/png_quantizator/0000755000175000017500000000000013755457403020075 5ustar pravipravipng-quantizator-0.2.1/spec/png_quantizator/image_spec.rb0000644000175000017500000000312513755457403022517 0ustar pravipravirequire 'png_quantizator' describe PngQuantizator::Image do let(:test_jpg) { File.join(File.dirname(__FILE__), "../data/sample.jpg") } let(:test_png) { File.join(File.dirname(__FILE__), "../data/sample.png") } around do |block| Dir.mktmpdir do |dir| @tmpdir = dir block.run end end describe "#quantize_to" do it "should not work with jpg files" do quantized = PngQuantizator::Image.new(test_jpg) expect { quantized.quantize_to("#{@tmpdir}/cucota.png") }.to raise_error(PngQuantizator::PngQuantError) end it "should work with png files" do quantized = PngQuantizator::Image.new(test_png) quantized.quantize_to("#{@tmpdir}/cucota.png").should be_true File.file?("#{@tmpdir}/cucota.png").should be_true File.size("#{@tmpdir}/cucota.png").should < File.size(test_png) FileUtils.rm_rf("#{@tmpdir}/cucota.png") end end describe "#quantize!" do let(:original_file_path) { "#{@tmpdir}/abracadabra.png" } before do FileUtils.cp(test_png, original_file_path) end after do FileUtils.rm_rf(original_file_path) end it "should pngquantize in place" do foo = File.size(original_file_path) PngQuantizator::Image.new(original_file_path).quantize! File.file?(original_file_path).should be_true File.size(original_file_path).should < foo end it "should not leave residual files in tmp" do foo = `ls -1 #{@tmpdir}/*.png | wc -l` PngQuantizator::Image.new(original_file_path).quantize! foo.should == `ls -1 #{@tmpdir}/*.png | wc -l` end end end png-quantizator-0.2.1/Gemfile0000644000175000017500000000015713755457403015214 0ustar pravipravisource 'https://rubygems.org' gem 'rake' # Specify your gem's dependencies in png_quantizator.gemspec gemspec png-quantizator-0.2.1/README.md0000644000175000017500000000167513755457403015206 0ustar pravipravi# PngQuantizator [![Build Status](https://secure.travis-ci.org/rogercampos/png_quantizator.png)](http://travis-ci.org/rogercampos/png_quantizator) PngQuantizator is a little wrapper around [ pngquant ](http://pngquant.org/). Gives you a nice API to interact with the binary and meaningful exceptions in the ruby world if `pngquant` throws an error. ## Installation Add this line to your application's Gemfile: gem 'png_quantizator' And then execute: $ bundle Or install it yourself as: $ gem install png_quantizator ## Usage ``` file = PngQuantizator::Image.new("/path/to/image.png") # Quantize to a new file file.quantize_to("/path/to/destination.png") # Quantize in place file.quantize! ``` ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request png-quantizator-0.2.1/.gitignore0000644000175000017500000000023213755457403015703 0ustar pravipravi*.gem *.rbc .bundle .config .yardoc Gemfile.lock InstalledFiles _yardoc coverage doc/ lib/bundler/man pkg rdoc spec/reports test/tmp test/version_tmp tmp png-quantizator-0.2.1/LICENSE.txt0000644000175000017500000000205413755457403015542 0ustar pravipraviCopyright (c) 2013 Roger Campos MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.png-quantizator-0.2.1/Rakefile0000644000175000017500000000016513755457403015365 0ustar pravipravirequire "bundler/gem_tasks" require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task :default => :spec png-quantizator-0.2.1/png_quantizator.gemspec0000644000175000017500000000137113755457403020512 0ustar pravipravi# -*- encoding: utf-8 -*- lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'png_quantizator/version' Gem::Specification.new do |gem| gem.name = "png_quantizator" gem.version = PngQuantizator::VERSION gem.authors = ["Roger Campos"] gem.email = ["roger@itnig.net"] gem.description = %q{Small wrapper around pngquant} gem.summary = %q{Small wrapper around pngquant} gem.homepage = "" gem.files = `git ls-files`.split($/) gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) gem.require_paths = ["lib"] gem.add_development_dependency 'rspec' end