qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_image_options.png0000664000175000017500000347176113203343610025245 0ustar jomajomaPNG  IHDR/sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Uߔ[ TQ@4AE vAW׮ڰw{okݗ]]bJG 17s?̝yJ,CbQ7WEBjqyB!BQXlYCa\.C;&MR,˲nb:W3 ø]hq VJ1 Ҽy3l899τ)_au܍mmlMAt%AnA ǃnnڮXNLL 壔4 М Rx&rĨ39chO:5U̦%3ϘuPPc9'1KS@p K~>OW;]a>Ad1xOd SW"n`81w&qZyk^wWR/]ϼFA'̎y,yV?V\}%w?Q f!B!DDî]#N05¡0 wΫ. +XaLӅkB9iqn+q"ao[Y8pnt%NCjۯ5L[BEf%%m۶_A!!>$rMn܃ʢߌS+%gՊdSixgO? ы<5KX17CV 'mռ-IhټyL%Xv 7c-nNu|s@C)U>"FbmFEߜM6Ξίt:uMo瓧/B1ws)޺_W+͠qv1YVHu>$;.>, {ME;E"q\wj˗ӥKЉz]y!B!̲a+LV-z|~ʆS۶VE'4p8B\\<-[dGV6nÍ$1!!OI$'p$Poail$j|k]zri,\E1]I9(X¬,׍mY"տz|.D%RJ3u0W<ύ҃rt"|"+љ\`&lٖOp 反OɠU 9QneE0Z z%)!ĺ_R2?D6c3<.~|g`U~{x#Z,GR, !B!lb-[,+ݎ\bMs Q۶iٲ۶nå-[f8q=aL>p8]bʦulۺ <qM㈔aGd,{kxVyrV=-^gHiCu@݊V\u/,2qLzFQaQf` @GoӅ²":#hi9,ؾ? e?6cYO+e9(CGE"D004HQ.@|zʲѓsz$Y+k,ðB! ( 4!CS.SvVNopѢe3[ڣ\ƙ) qx,+6neB;]FN)tI9юTu~rƛoKO >>,0tn8O΁fY>їc3^&Jq6mri؁Ea[CfsuRz<V.T[]۠෯=Fg |: ngŢd5>q5/VqnR֖E 8 Q7i׿+ج]\յ[~?~@ {bYH˲)((D7 X('qC(laDl *0feg08%ŭ'˿V,G)5%h{j Î#55۷v2嫯@vcۊ3 a3S\ ̛gmA,#_ (Ot%/ޕUؒGKnC@> rI LrsaxtZ>FF8(a*];Hx'tlNl4Tp|,ثxǙ]!#g#Bt>_qw(*]a !B!C4MrrveYhԫеK?Ivv6.DGY{9U; c*4]hJrSn)ݚ &#I2u hð УG/~?+ts! ry&JKK9 4Ib;`nxf0הIL$ IaGwFߎa7gt}!5Qҝ K[|tl֍:C_ovUVXI(ؼY⫩vuͬͱe{PQ񉠁iVz0l ]FGnN.q(t^d0*9LkMǎhgoke nAwWYb"ozwQnw-ήB||<͛gҾC22k:YYYf5|FF!tQ{()Y:?{ʯ Ĺ4"MuM7p{]xM Y/q-mG() cIa/@iD:.6b3W+ $!ݮCB6 O ^eʦ$HDs`W/B!V²mڷoI޹TVaؖb͚A5l[9vءhѺ| :,4]vZ@vG¤y)*[B.4oO"I@j/ bUۅ1;!0x*N_ 74ejymNϲiV7x?@ m;Bs{=ה`R* !B!DC*A6]&H+qQ6te6]^`]r,Bp$:Ftt]4 \nW,i[8&csh.eaE"eHre82*z8ZB!B4~]0^I; ڲ[?l2]aL]85ܖOek9!B!0Vcb:I)B!B:B!B!DcuB!B!ځfB!BbY!B!؅B!B!.XB!B!v!ŲB!B )B!B]4h B!{^rkp8\a[aQ5.fd#Oϑ{q䩧c5;TضlFϑs>V-[H,B!8Q<+^;S4??77y39tmӚSN>g"OqǓc뜞γO?ͷœ=ijϿ[lތK/֭ZeVz}oϢ[.\zx^tCOkEL,b}S\\`N#{s3z,_'on[HMIƶm/\D l6Dضͦ[b2$6ǟLf̟m`|1e*]{k[>HVV6wOB!BGrY ÏW_>i׮-qGycONӶmkrrrcrdhɗ_}w?Lk\?*^rss}dڌYLCĵW{&<@jj 7m^yf|".O&iyM$'ռ{ ڎm0v4IK%2gb }E ej_7e~j)B!{E墢"rw+-['$$)KN5)˷ f3m{_7ޔR4kɢsuSB!T墢"nD6֩ ~ l<6n\i"i4)8dv  IDAT B!BHL0jc^ZiKj&D"gRuR4!+k͚g6jRB !B!_aԾX1H8|e"8rIYi;7J)B!US i:ڋMؖ4jb[~80*@oB!beYb@=&1SV~!B!~ˬkϲBC1TT eʔ/i޼9G}T{B!$< ACq~Ж=h,ioyZ 6zb}vxi~򉆝 yT_ov(V'`֬YL)$$$0h .j_~=qq^R=L!Bq0Ln=`W#9˯)n<}9gŬK1^t.bWxa6m$ˎ x7r $&&Pʫ瑜\#f9swutGVVqPoB!{IYkXr1|=v,>^zɟ~1c&]tmNrL>+VpUW^Wҭ[%K ZŮprqD7ILrBg¡}alݺ-2~8RSSywh۶-Ï?|]׹Wбcǚs({RM~m۶ѭk*IINiL.)|D6mXj5O? 26lSNfI'aYsa̙- y7R. !B!:/UC*GII sͣM(>mZqWfZ^zyI,X/g3a$'';o7G& 1~z.{A^Xl-[dɒ%ѝ>'u$&&/ 4pr:?Zjɸkܷrjj}=~A hӦ5㮽lpG՗ ĿnH$iSPP/Ȏa_bǎl۶p8Lvʵcńaf̜ @(" i*z^{ocRz!B!طf .-:JU?1~q~s gy:J),YB$gт)` ?vbɒ]{ edegӪeX'NC~̚5xms5WӥKssïܹs1ݶU!BPKh,β)aCsY|VZi([a6]z ~xCll*ĴmaCp)T7???zsN[+ Yp!ڵ[n+kȩ<gU?3;wp ;Q" ӲC w3f#5%B]I$A hWB4lv9(g;v >MѡClێGzq\.>_i=zt/vS\\\ddr2=<@=z&]!Bӳ,:ae(۶UՏZ[ٌ}̘9[tҕ|?Dz- M.]y/`+@0lrrsVNj+M8昣yѣ;.:n:-_lXjkG ǚr,Ep8̎]nCM8F:ݺr 9*zs;r:%9[``5:t(gu&?^xOcu֙L6 }=38cꫩlٲos?om۶I4:k.B!f(} y(۶* UK/sQ}9Sp]!C897[n塇! 1lPN=[O 9!p8缊4~;eۤpe0q(,*">.;︍zT1c|cXh17t f͚l~ʩx?? ]Hg̙g8lsd;=;(=ms)y,;#]cYzذa bC=~ݏW_UVƍW6OQQ^:bkȥB!, @+#>۝-YLNlڸTüO&ڿr{(**b1 u^ <0βm+ڬI|i9U`S!B7zM#cylgd\al',mZ-ti9UGYB! " ܳla ˭@Sj buYgY)/ch(MC0B!4Z9p;U7 {DH1=fg9 ioˍw}N|3ri{I⯢s0B!*-)fGV._AJLUAuðcίyJ]0ZT!!9p퍲] o>FY{9BԍB!ad4m lٴA]YMσ8hRwфd%.fg90z!l ҳL@QB!BFtIII _7eSgiS,\XN A1 N9mܳtԮrvdeFwojZZnKFf)B!B}|rRȎYRCna(el>ݙ+! [bk,9ì=˻ّ͟˗pD4;v~N ޾%GH,B!giC Y5b9.=YCN3YXmx)X^Tnk?)й6.-3KGeFM(hL+6lA7`ú5R, !Bq*Y$CWyF;(8= .u.iczCX0/)מ-e .uA}݊z1 |)~bk6&J)5d9#{;%7: I4mQW+`ʵ&e!%E&`B!nٰ93AZ͇極U4:aoNXt2S˪zv]ئBf.u9 .KGUEӜ²14Mq:ڴ9wFxA}D6yylXM]~e{=\kRv6nXGCY!yöD8c(H :zt]\}qpV8v4/S,[q3SQJsi.mAxR$r:\GcTW6mIm҄H$hzu]'IѬyf˯LcϳWkMʮB#;Ke!.u҈CYm=˵k5"~1]7Z_p@㭖RSӈÍr˲PJe~e{=\kRvRSظ~ݾnBq8Й.ۂL r9Z9Es]a6f@'ⵝb* JCUq@psN7,LJb܃@Ѹ*Ktl+}y?:t=uT-Z̝wQmn/=2=4^zcƐټyr};v Mu'B!ofȨ0V'7Ι Z-6m\~˥ N4 m .V]Q zr}{eM^ a\0le+JKKĉ\.͛c=+/L>}iO|\xMo߾tҵBW^y#F0bJKKꫯcѶm[vABB;uϖ-[{y7cqٿҡby_9bDtƶ5L+b nC>GrcuxAq|W,]o5v|$qףiJ)233~0̳b.nkϹCFFJ).rnfa۶y<ӤnܚÏ?">7,YJ~^>\s|/#\F>_%hެv qqqw wyw40hzr7lm3h׮]\Uꫮ{&p睷Ӧukz:vi|i(h߾=z2;vK;+^vs%&7ꤓ&#v|q\}Օt)cudeez=z4' ?SM6t^OSY~p=p"^zri#G1gի?k!//O>W\ހgfB!sl9ջX>1mgf}8$A, BSѿ;LX$%'P'Ovv6mB4UlWy7gݺu=o wػY1|=v,>^zɟ~1cKy9wo0_ NP!m+|>o:afZ|- =jPVZ1ax,>W^c=wSXTm+&O!>G)EQQ1YZfw}X>{,۶mG矋Nu=,\#yGBBb,yY}غu+qq̛7&MyWxWܹ3Æ:4رI?g(+Cx=~0͊8ۗhݪC >$1zhfdTWѱ}{.RzFpBpuCؿ?Sm hٲ%PU+WұcGvիҥ E -vxw0?; |>Lk[^];4#6m0| ϡ1GײͳC;?L´3k1t1z49_?rrrϹk|ҿ|WtJce'ЬiS.Z#=X)#)11>'2i$I'˯i :SN>,~=6oLRRshx'ѱ{+Tb͟'&ܹ3_v)a‹/v:B;t0 V'n+O:u:e˗;z ?xN:qdF)Ťɟ2_mcQ"7'o'xm۷CӦMޤ |̛?Mӹ٣G@!5K U\*.w!1]rйҜ>dYa̪{zsOSkjg\v(+KТ5,79"b *t|hP򜵩Ð~`,{@k‹x񥗹INId22227A0m#_/|`0M7’*ך3x`fΚf̘wH5ٿ(.)fyi: aĈĨxò,em/"ٴn4(.)!!!Fȷ}B3a$''Q\\>Vӵk:t/ ϯzߣ{ 5nmGcբյϳ}/dѣGw=]ܹo]'%%% ߟ6mLaQ!K.eĈ{%%'qp1x㼕;,|m^{ oX_!޹zO el^|>̛?W^o> hsq1tоr-~~SO=ٳQ(6nM7=esq|2i E~A>m۶oe鱼ʟ3N'o"=#zzMx81SW7o:{Jm~/~+|i$ɳ|i\ccc?} lݺd2Iee#:;$U+SL2eLb࡟M_~ʾnTxUgqK'evDd!#KB۫#H}ENm 3iָ/ Wˀ˻]x|OrP:V(ϯy(##R,1 G|. c8rHn7|'N:a022y1444?pWLm[ؖ=+r͌!K2ecwcyms]?2_?`'N"I5Վlii[|3J"ĥؖM.v! |Ī+pܸ\.r+<;_>N۲:|◿"OLs`|O$s󯸼k/,_Νϳشqy9q$կg>ì~}3ˎ;ƬWyܪukqAo-7*w!:ꗿLGi88{~?_{w~7b `YS=eZ2i??ذj oNl$ʸlLd֬Y|_:-r1#K2ab[6(a8IWŗY:Uc(|k_:7?YdIK_-_o<ӯX.UL2eʼYI VDeo瓪 %kp,]]L5'eɚH<Ϟl/2\r{5ٹ!pMOe8Vw?% /w~+MY.vZy衇yGgҥ\ښOɇ>a{1>O?}x<k _=\{5=n˲g]DF6emX;E ֳiƳe[v~t׏!JYW˲-深z*=XE^ˣ**mamlقe[Ne|~>M91ң=ǻ.ذa=?/l308 eJI3\=6ƱyFnN{{;k֬989{/6ov}v/S^˳cN}qnWhȊĦYd1`I, XWԋg?{={();z|2϶r {Ett&͎ϱxb UUU<3V,`Z&6N믿o)#-ۢ3gpQ,"Nc9kڌK}87@J/JS(d3|~a,f)E$ɩ4nx{a*XS]GLzlyn[nx9>,˔)SL)9"J=k0^F{~ ;~O |ɣOc7&28x.ӝ5<ݡiҰ'O`]"$=HBWM].~ɒX>Y&*%( ?OYOƹ曧0u`>73Ӯ˸f$J9_L'W xw_Yl)w?w~}{n~Y4w9"SoիVa;_K◾©(hU,|^o*$Ww6N˚?뮽׋mYt/~3g0~}$IeR?0w~淵!KWRk%sѣ7 ۲\{{ԝ<6ETEKs3?CKK3t9Yf5BEv78<;Y`wߓO>EmM Ƕ,.YSO=4^s5ܸz9сeTя|۲زroϱK]錄~)޵yFV,_mY?w}/9m;~w'Vh[ȇT ?c-}wq722% ukYz5eqz~?UVX>x<l)z-|K_F>c}=<ēḢ>~*Õ|}ww8bL2eʔ9-q0j23֙Q Zs?s P(lVrA?&ӈeI׮8հKβ1.V}Egj:fh]kIlβ.:B&CIbYKjN8֊5!&L-:+'PweHt< 7}}7;u7ފǹ( η&GdK).{;킍ądިX_xE?c΄rqW~RL2e.,/zLl|wP5{+|rꖉ?G`:7&UgYˇaWּ}iUa}x;_}`^F/dGn? _ Xp pZ R{`#b 71Q am^YdyRϳαlj{{ `O37tI>P3q>@f#z2ҏp[_X3r\'8.}k;mf%^u'}mucYv_ = =ɼ:y]q\ک-H"\{s888UyGq:71/z:g7}W_p(< =❾״$ף;*9^}4lGD 8!]x_.O&v=Nz{ү74:Ӱ//z|%.8/&Fĺz*V^9oq)SL2oLv cMNzrin,LaKT[ךGvDd,َ2Kݸ4)z_dYIgOwƬؓxEp4:^ĴiزQSӰ3)E5c(M㌽Kz GR3x*z t/`\mRq =zz|b=2eʔ)sb)3w2+`_Depo^qdTax4859ڧÎ,)S |%; ={\AWNSAX>EŞsSau'}2~sa#qnI&o~/\q^Mboʔ)S[0 M-Dӈ79 :)# in2_>G#ng?%1 |ϯlsgopbt$G~l՜T \9򖯵k혡$gb|Ow*ǝDrpڙ]*2V\>=_BG!A@@sAӸ[a)SL2eʔ)ͤa`[N0;Y8(Biqv|r8︦DߖsA4 |V[x<+dQGo,*RKL+E/݈(Փc )Y~|B2eʔ)SL2$:-'MB N{,ٚ8fiBhӹ%&;%R_7gyG_]yc>/_u(_58)_-b&cyW/*282 Y˝^__ A/θ`j)NaDugŲ5X^1HJbw~svϞsI)/u5!'aOWܫGwl[F,I2eʔ)SL2eʼNk$Ky_%EGTDVq [  |Ni_2u) [a|8|9\9^ӥaDi.sgrIeirY6ř |#`CG PRh;\DY: t< [/5 i 9YŹA1X. (Ӫ#r2eʔ)SL2e(%l9K*!8iI.FmSN֣09=t޳sE' t@_I,Oוy8QZt:9 3:Kqa9r2eʔ)SL2eʜ'Odus*48mӎqg |[#UNŽ_\_rfgY1,_Axh_pu:uTrXeF4x sLiؓ,GrNW#׶^}7r2eʔ)SL2eʼ ǽIβh pGDje3 NqIjy$O bYƝ0gy#JrAp97IbHĜf}<}}XǛnk˂ʮ\L2eʔ)SL7ŜOO'M)S$;>7yr)|Q, 3>6HքJβaOfrrQ!:2qϤ̲l|`QU9=_̛^,2c~S7spKOnCٓ"?@9a;qZfets%wSyM5n7HOPc83DEWLA~?npДh.'+.mz/6@`#sȵD8P768qMuG xARM+Waߴv2T3&u'+(/@CR[׼HWv9gvlÈT#mw^buW(O[I`{?3K'ۈ†#>Cu\!<;Fʔ){·rvM^zGɷ/p r5 R>vhas{ 9If& Rc9کiO㮺.=MMZİ'`KCS"Zm45v:r}cuM}::@d?sng0f;—̿dZGe"gYBP72(1GГnY6/Eq_ufӛs8۬0:(7R@MWQ?Ȉ,!NK 1x~E0c^Rx\ФSDRTW24N6 E_z C~I"ۜC?S>uQIЯ*TGhq+SfŚOӮhs | Nᬤ{b!TXY A)M/5!R'bNZrQrRӊe]sRJz]UոXWQ3<(}?hҰ7e茶^2Y* ڴD"laRBy&:jU()­Ͱ:gG#Kpͮ'TQ9H(gS4øeўQm ~2uYҌ. ~Xg7Y"ss4G;^Y wLԆW"?\@1rfgtFjb 6zQåx("6i^id t) x,ʇSh\Lg2pi$Nw-B.bj+`Bע11I\6Ĵ"q 9i o$OOKS A#5#È 1r2RvJ 4rLOutuMN!I/"wMa2 8#dm֯ R] ҕhS4s2$`41ڤ0Rl96 ԓ륺~w?){ m #Ly2 Ia*Qnɻ<,klK\'""6uHr'f2C;25q!{Z@%f: m,應(j: a1pͳJc󉹋o=Dht)jdNpx?~DyCIӦ yZNe)(^U{QxD~1\_P)bUĶdJ`u 'bD?r1h6"-9.OQO!6&UK"oZ/r4M]m?T]=[9DPI]<(qK.$G9<ZB < D; BF"!eF1vދK/Hx,f+w EO7VL QUiY.|ůV'S2hS)]XK3DO1Z2fUr7 " Uz6#) Pu^ˏWI2Ff\*~saB ԥ,p5` ** (J^ j*iOH,AQ %3 ⒊e?`LqC!Γ IDATTyD(Sĕ!S%D_/n?z5[+0GjBErӍ6؍fn4.0n* ^\f(HңgPU WdEHTQqBuMRU-M>"DEi*D~Wԅ$3CEUM1L+DߐƘfRUA{hĩtm*#]*xf$*dq8#34LOwQY HwKn^LjI'zyS}W *8sdKa+3gY.S}9wFc2LҼ~=|&+#D Q,#I&]t_oWU9I,gS:jmӰs[" u˶Ϣȥ1 gWq"(l8c!ʃDdu34X+E<S 4к3FpBX$IK#c:cT!Md +76P ѶJVؒט3{@>Qf}GNS鏐)fд>l3JF#[bu8tGg=TjQWp5H e㲼ƇGwDE@uCn[ W "UoXO~"nnM!4;+ ^De%&[rYF͑x;_E? EHїMtK(##M9R;'ֲQQ0:,Ϗqw}K D"&L`WQW*]Dg;DW& xHS4 aQ{k`"6Y<;B҇50}qδ>؏М&>>vz..-c(A>*7kA" P֯PEIVjTҞc90Z"c춫`ABHJrb K#ݸ1{tbT~Y :;ymMLx0 ?]K._K]:̞̉)tHY J]يaGt &‹[A!~O5-CTȸ)^f3Q`rGdJ,AAyT},dk{O]/"?ڎxH#"BLԐ"cNQ F;#9*阵 id^W:ea%U "`I1 M¥dmJ%%cs693C42yAj^qJ$ o` 0*M 7U) ͛(,5*K݌drd:F2p)#_pME7jQŕ+2Pt7' Xc ˥"$BB+aP| KF"jc T"Е4#$&nG"TA 5e3WqqF !PT Cc_bzP-2t S;/F8qq OTױtgڵ) w멭G˩_eo5sGxQ]ȩ/&PICt[:)NY|f@q2\YewQ4Tz 9ttMm'H"Q95Jg`c>I1u =~x =Q7ʊB|'Mmum ȮP|l"[l“:JjN؟;"Y{VlcnPh\HjS15R{:OR?t*C{V奣A%(&Jn4-˪AZr/Z,qX/K*xUNWS5ԁ>/)n `J%1;<ͥxcs})] d-ebG(D u ,#/AEGpgH *}*IЫүȄ&jL"e|?Ln* .M@IB#" JCc]+QkZ9B&g#Uu9ڳo0VDIT^CMۈ(RQ3ߊ+"Uf"K Haz;/pfnlB}]H#n/mUKI.JP^҃nP94eyb}' dAAWZ$c fRć$.<&c:vԋvh%,Ol  EslEړ$RU^0ߠ*ۘhGF,:-Y03ĉG%\U_Y.lE5bY'>3YEG^Y6by71 M7=LM-ǥ=9JöTYl*4L%!2H *\$d$28aW#c1l@|G=6HD@ mc>TC# Hf܅d=L #&n%Ra1p$3{qax-2y %B@Ay^/Ǽ9k8IT=t*Y]8~G,r=)1jCE:L@ZS{5UHR{eyv+{,9m/vYk#^<rd$$Aib|IbSj\%[OFst_91vC(]>DOt2 , ðtAR S=e/,P#t0<5̶, 5r^zG%s( Gm&L,{×ӷtP4.{Ldy8B:u O[E5BzxY{?Ri]jPRE{-N:6TI߉!FX<ʲ5{Q:Fͼw>c3H(KuoE*'%QgЪ4Wڸ;p,#syTDkϨ_#t^.kA[ypIW"üxu/uSKtUpڅ>&N&|5U,; 3̽#=䥌X.N*򨛖,d|]+T1&94ÍMnB$bKĽ1(3o[a8 N1C22^$4Ts;B3+Zc nJWըSآEv@BW#NU `jf挈dmy{*v|Fy6̷03DnV( $]p < 鬗adx->u=<#&0=!6B+l-]` 2)aSrStU7ut3+?BN>,tlC; {1,fB`ϬPhG§PFUV{Xc2"Er:cѕ8K\TC eޢn >t75W{o];H6s͟Vs࿔=Ku-m7Juq$յ,x(d~Bɚjfʢ78^KqxSrhB9k٘>I_UU 'ouؑC<3 eCX 56jB|[.c^d}~.'G/чbW.yb1/?y O S@ }f`yFw,YUX]ĔQp١9Ypw#pm SV(P;FF;[<ȲY$EO3f*#<a~rjN;/㹷 $wMMؿ[gQqo3/USm,SA]={R*Top..s{ژ3)]x#BZ'ƺID/ F!%𜷎ĉaքOHHD6}!m7@3+YwP_#uo*]qVo$>@P%]:zD wу@!0ͣTfM?$*dj\S80 ֭ܔ=dv/Dݲ Qt5p^a1]/ҝC>~hn3Ɏ{3Tا| S9 W΃&g~EqU5nn)JsB,!˭܏ A?b{qA+QRpìWW¦N;I,u l) jܦPxRxv ۨ5Nx;H%zI (mGLѹ7W`WB$ g zQuUT.8@}ű2PV$s 1EgQ"af1P|> inDQ$N(躎?`YMy)  ض$IXiJ6%:e!Iav\.",c6| 0 YuKPA@Q,nr˲JcRU00 ˅iضig_-,l|4'1f3Jc7W%jmdtΪUo"M=`ph]dFhP9vU;6 +ɨ"ZԨ0Trd{@2Pг )?g@<@_v3/rU6ϥ4Z-JoR2f5K8"Ey6B$AVr!;~>s;.p H`;Eޭr,84'oRd&L'+3ΌW;;#˲duX(oo m3Ηw-.X{y{N9D 1=Vj(}cٹI>re#Giss-P M4Ql]'VC;YF7[ɽf(x!"v~;sW2WhCeɨ*r ~T+~p>m\e+=r8Dps 2g+d¶6B Ց"EX%؏gG84{d 0C)Db.qA[`1yEeNVn0'&_IW\A9WEny/_Xp%+AS7 Dc J$ ! nR(D6@Yi$LR:sQ Qw0F8)DF| \!1 `>Tx!g3TtדHPI4K B+J+ZBꇹqC{ce?fS<'8/*vf޿@#4r~EIf{ֲ86#5Z4𧡭ӵ|7M2qC;@O9Rl_#gs\=휒R jpfO1گ]u|"n\®b8!g_766u_Y)]Elr>PW6bu]\Hs^ 8ٍs! v'byK˫f=x70r[/gz_}Ezs;bFspIX=Jsiz9Lɢy,q{;c7a>GiZoem 3}7w \9|8'y߉nY73{)7b>@JRDH^FS>*kfo:f2CAIfi}y?ܗHko]|Wiu'K߽/7鳾Ku6 6X]|*Qoε4[a`:sxxqğ!}Z&!;QnlqtspK`䏧>Do-9;$s IDAT6Gfrȥu,{>&|sm6w/c$N/g<J ;i!u׍t|4.{p򴣸r^R{֛9wENI=] YؤQ;;0bO߁Jq+X}b ] 'fK:Cvpgm#D) ή[UWXa>ibY (J8Wn 2-".RJ<[+!!\׮S]חƥRp8L\^e0ZG`=!RJ\]=H)qMӖm)\Ԯ~MӖ-}m֣6'믜+oD`0 eQTWbߓՄv`}Yb,zFϞxng2߰ɏhAܵ9C,q70T:y-b1")|]>w_}!s \{ϱ{iBsyoD2O#|q,~zL -}C{^+dXqa- {k /v1w_ߡ+ɑ l/3Y61|,>0BX؞t:('+$/z"6^5mȳXّcF*s4RuljMXi>qd-t=:I\s3n~j7Cr{Sг<_2}d%y|Q`HtoTCg?%iӱ=Ð.GN `%7>HzЦQh~vM,;>[%f;$S|6B=LL K<FƇ}k`Eꃸ.VqYJG$!DLJ-eVH-JDA++.4Etxx-7ql].gc"PG 8qP1mE-}!^0 raN^=V3Xnwlf=O=2˂\o2ԳX_…/P|pjf"ml|+7U^dý_T([+6sŝ6Ae31Pw*X|yĚ6,N,_6k\0gd/IeNYhz?m +&{r725QGG ک LI9~ .8h ub;7f{/3{t'> n{a;$U,q8GW_'PUwp9b/(m *lt/EU_wcZh%1GL Cl:cor&Nx?]DSyBL7F5|_qx-Ϗ@鞧9z,d! FXx(-'y@K<9W&xx{¤Rړ9cxc^£bmK>4y( {rؕIu+#n%Mk^cآh*y~MZVH>ܳ:{ ܳdžy__Uwez.3?q+D+[ɂ#x ѳ3e~ y.|kI}]#vL7ĥ%"^aNIS'4(& +lT4K ;;备7m2O# KC[  l;F~(FLGrZZC%|KI^.F(t:`h\cMW-+&*1+re[EUQ.?< \w WOi'zˆY2 k$vyBY6 h)cv_0~rK hpYz6BfYgNP){DR{!C,W @\ Cd:Ҋ  [OFB@HP|/uRGkV$Rb% R|R(J*_JWW(__mCպU()Ou=pJSR>R ZCXeqQX~䒵&'x.}A$W̛k(ȣE3n#1"+qNL=qB_Da:.=Wֳ;Kvкa㯵ǏQGi?oq5:jұY$ݼgv5]Del<75|۷] x߼8^6s'o-nNR?I]c"6f3Ƕ뼅ޞOx*OdAK2Vxz:˅<ۯe+C܏q< ͳ^cJ2Btw}-kغٗf8trUѺ<Rr %C9.i iȓ&@{/o4Mqn['8ɱݣl|?Hzظ>Cq~m?&.&c)$7سb.0cN'i0Ae2y@L8TՄL7O09\IFWzlHN ,qgbib+($L05gKGhdd"{ux2 ߿ $9x^L`p\gdt6 k QJ8rik=n8і ľko%vSR|lı%ZBmn mkeoP"Pp`B,ocS:,E:5-3${Gtn 6Mzs yKkiAH%%JN8Iq ucfAמT[isE̬"jkVTR`kQJFJ5hAk$R\.aW; qgJBX\H0( b1}X^MӖm5vO5ЭY}_M˲BX 5[e vT",+õ{rnM\W0rDQ<ϣ˲ql4MDQbزePhށks,X,^ӷ)ǹuMi?+.qA{x= ||+눝yOUc};Ν1Lq.lT_cϿk:Oo!~o] .`;ސf$r`] |Ktb}L0OxP{ݭPB$Vf,k`&r5r.yfY]%nd*G\xs>>hN; :2ЀXHG 4H^;`H0LBz ùYJy%ý}CO?Kx6I[!.?~C|"'x(GYrM4[x.Eh\jMi"=Y!@}+ޑ0Z\>f{FMN) M$lBSVt~֟a5bB:r|.OOld Z8ƃw~GKOرHi*'g?w, E*}EkVġFu$qy͎g"h4~Fcz~yI1)*Ga%]^ lJ["D][Nd*.bJ9*0u^"H Zl0$w:TRU2&@m!C'G=NC@+ԇp+t9{,P(R5: P' +t.Se9V1VAnp)Əݥ*$0$Rna_Em x??o'~kkMWh)xʲoHYruNH)Y1!Pj^HpW-b[ϵ5N]_)x(t.4J,7K_8ҕ: *eAԘX_j)EЕ@*U]bHSy oW.%_NXb%@K//Axft&WH$()yy"$Bh>xRGx.(/|Q}抱H ;=;$L1GӘɃ|ٹ>e1#$%㌜%ڏ?*幭|oD(׳LOiswf=N"L}&Fp J+CȡGFi.]@Lczs9UB8k"2!}aL{HʗxE ̻2~rxg8W~>z;[ mgUJ kۘkgBҨЅffs|8\G>+ɠY@ie%1( ƭxej.8ڦ|S<8jO/z LokC 3dj<:mwȇ׶b؄6Ží`긎O l@~qs:mN!8SQ H-`S45rBqm`h pC4Hnxv(B8}1xϊbmلm|0"hnBPK3S \rY{L6 2_M 啯CE/7;rn,,8<.H7ᥥ\HR,7\=" m ^{d!捧f~|6 #I jVt2U(vhFЃ&½k1~ȶFE yOYVXHl-E-{euɝ3Oa{=] SnDN8Y"5}&yx.ʪdKAFPrr)UW.(.j4Xٔ8=xBc#$6wt|=E4.zB0Iiz!B&S)F`#5EIwE70u!M14Ml* l@]̿D$*#&IAv/T[ b6O+`dUy'GmИt A! 8WD{'AȩIhzFAU6u?1X{B_Ud@H/pT.Jh8B./UZIJZGݔ|C"$J[z(UԼ JYHJTgt   @ QR[b\P[VXaPȫªJU僧Q^uN}Д/5} p|X% \P o ,mjR[RŵK9-l<^e0;XLk#-r4n F(J,-gtǹuXFC7MEI7EkΩW럢0i, :, JҜlys3]L н+p&=]a4N 0qƮÝ>_ތ[q~:DXk,!EJo#[o'YbS93@\bH~Š')Rd8fvmefA=x |%n8f##X6޲CO9xUqR=]J0IXeC>ob}| +nu~&cg<~#_eSدd?ua;9[~u*A$©n\xl,C6 {F~J¢)ӆ(Λ#4/ΣPpZ1DށOhA P 89+XBdzO\\v~ٖky%[6䚚[SGTh-ZΟufvM7DCCSSS@ ؈aLNNimmeϞ=ٳ]I͑mFtttp-/|lF){\S}BPWWaVtF|s e˦]+"46J%fG"d !2,KЏ C>%p%܎zpYF/3TzI2,7UUZ p f1͖x5eFMYR)~j5K|+9$8Жn5e}Yۗ^ |_||@ j=a*Vc_U>.U0b 㪐QUE|tM)t- @#@V!T}oiϬʭnF3T@|*iCS<|̥;YRW} t|iNeEˊ5&oŸi֧{s)2i f0{B&wtQDa&"E pQr ;`FV j8 /{.ʓzoSaD9pλAYh#P*02f]x21dArəaL* [-?ȵ+ s5ح)R<@ @kk+wqr >}E*Uy۶m# ʇ?avǩS-RJ6lwm8u(Ji˟cO8ٳ||>ρue D"eΞ=+B:^^]<~B@ @:&H011A>gڵ<XǗ|!sss\pT* ===[nyJEQШm|Y!Ճ\h uČvrz8z!\Gt$2PVBQ&ZQR W*gbi'b{Ad%`: Hbj2G&?cRdON.)NB9A4SL-" H[{GY1wy UV7Kd]'H[>Ր?-872M?o%\ ` :=;s m&J  v.e㜌'p)<6P(~4崏%i.1'; u@8B(zBj%i0hRd#-tih}`~-wd(aWhN([\VbHt0|7w4=9A` )ɒiSTgkm6ݷ^K^K}d%"@ f:7Zd,Wopc#ږ&@ds-6E8pf]s{mEӔQ%ʂΥ-% Xg-jU}ZJ7[e#vo- 򦌽Apq>!EŴH dKHW1TS HSNQE yM@UP%S!Y >FE r&e OS|\G@mwU+'l_~_އaT#BH}*8W "bQ*8]gEI"b4,3/O qMMx6Y-2z WaT|S@A4$\SwrC"͙˱D˃K4W;]߹ ?_˲L `8pd2ɫʵkזoH]]i^}衇hll\۶"[nll\aP*p]l6o͞={8pW^Ų,(/ +0V^^3::ʮ]hjjP(055$Itvv222}9JM> d>$u;ڈ7 ,KrLoI=OpWL|@RZI65 @p,bW tĚijnBVu%/yiX%H22o"6u x]2}\'"\K%̶Ou{7{?Uf+ӇF|3||wWxX/S¬lЂNw*oG,x%51,*lR4_Y\^@L b1Q,9_.SMʎ,)Xyn5p,gix,tj.LH=!rV,{9x9$dx7277ѣG)JȲL[[Xt:M:}! 1==Ç)@cc#=== W9v.]V1==M{{;---[3g000G?Q$Iѣ+5F2Ķm2 JD"ի`֭߿Μ9CXDEm{EԄ,D"8@\&R.ebЊsuoo/DJa```j,r]va&/O7LŖPհ,kOC V~(,胃L)0y,#qj*cDŽ6ӷg(.&ى_'+݂s:(jl' ﱑɆƚE eXjD9oHl#ߣMxrHoX RD4g>j9 O3pEMfF|^:u{=5Q#%l͑Xo &.woo%Җsyje;Χ~6A G4Fm9b!mtk sKk<{~x#;o;E,F<~r{<}-q=opMgìz;PUxYFRl95$ qxث?br3svnʫh篆HETz*jQ%X~c*W05Io auV 4(ݶ ]Rhh!Q.pϦ?lHP⭳H4"*ZPe]'Cg.^%l{OQ.4#P" *]Reʣ6whp(-d*북iHPlXLR:ʝ;q[@eKl^b7lsAY|;ňIAR,*%ڥ<]4E[sXj?jtQkPlN¹[GȿBp2d IGBHQ4/Ѽ3EIқ?JY 7#z(-9$FB}Q,).ZUe @= @o~ \֒׻YIwa89{`o,d?N8nذ,d]1= ?,[K;7.hA%7f*./ސ . 4ٿV>t#4L#~-t Nw#3DyvƎNw (Asg.~{0) IDATno?-Β}OXʛ>[,fj>c6B < s֌ܛVwloWhXNZR?kAzvMkwrtuv̫a#2\:죇R?:{ڡj{<&^z2M8yj/|2q3?}ݥrGMoa,9\I=|23ok̗,ú?3?kD0rQ5^}TSEvoՋ4u OCKX7gXݙ[VT ҁy>V!IHn* G!V#lh$eI$T:Η[8Ͱ5-FB%D +d{{'H<q]C, H4A˦3W[URDuV}/s_bX$'Ř?=?4l5h| Q֬YO1śͦ:ƫ<~WY 4|A )͌d ݨ6@YECF0AF4Nâ#XX)`Eɏ/PBsUWc(Ni ]a0HgMܜ`xD4L8'svBV1_'@u?`!g ,-K.Ck~\}n, |'TYv߃Y_a8|;{C]vw'G}Gn#xep%E}|IpAhc<ԃ0/} >,."}8vP~<3g<ц&k :2`2BՁLyO,>_ٗܲA{wO˿fM_B8:Bmb`~OP[,#7Lϟ<], TG 43BH2x!PGlEGtn?l 3풌,E$g(MyNV183EA<6iY_  zZ&tJuS%*͌OWqmf|[3?W sY*T< 89]g?X^$`w az-2AΟ3snd!6 t%"*&j: ؑ&ke0O<c*R0\RW$JSrL):]ZlD9 j}UmK9:=Uz_BThOGk&*T+PS/itwL7;[1Qސ'h*f*#n`^cuVhaYԗ<>,f_v5F qM4Z鐁,lvq|_\ŗ=!hDDtX=|W$p|^0],1 ıHHVs\F2 465Avbr `}97'qaoqcÌ5_#;ž{0/2|sD spkeQȆTn[@A jT/OKx j.v) Jx8Q a$΢pGG}ʖDݵTg)<{.#ؘsss+1RJ$ʕ+d2"{졣^xgϮHEQRpEH$|]ٹs'k֬_ԩSJ0D$2 ###yE!JL& 斖C4]>*LH98p6mQill[oZq6MeImG䈆ڙuFpF6^gɇ =;Ĺ7 qq^[}.}Kgl]^y?՜|nGS m;XJ%YdFO~[vE.] Ѣ~ I)pnGk;ȉMXZcNUP閛~ یԚwP(d%N+(4QXX`@@g'r~AS#Mٔi BggCRatWCT+6bCklضͳf X!-wDYȅmCi`TVZzF5TH'gGIg&˚"ݩ0w6qTC# :C C$gGh.xXwmh -7:F .^y:ŠyuF@c)IISWsa6tEi: ]d]GB.1_sďYh+cl-0w ZAF,٤M KP\<`8[.WUT s*sz@J:DaBC6ą+DSI.BS%B 6haJRi&z&cCsdkY eŬs-E Rv;yWPVS@ D͕_)#$,{Kr~eOxofd˕%@3r%.CԫwS 0,ޒs9&`;x(8X* !=|яSL-E {K_K-> qd(hBjLb:jF p|d4ﻇKwʱ_v<ɏv@: j"U*'#UQj5Tcæ5|>։ _<<5!um<=DCٟƻ}'9D9䃅y7G_3AuviBONdIGv,D<\,@@݌#> xbejuATzzUwni``>Lg}EF,W %B,J s>ck0$SfʚԞrh;!`߫Ͱs^k闉Xg5[iVohè.+uFUZD_E[u m>W5C ?8vlD1FKxP޻tT< x T>Vld;YfߎOPT ${]†Ք#<)XHA>z*=y[:Zp3[;JzBԾ_b~'(T=%a>48UQe!Ufv@׆wLA."J2ujaP3H$RQ<\GCSʜ׍KLx-Iɶy"5e~j9 q<#nݪ2zؽE=W4Eϭ%@c漅ؑCYU'|*rw>2OKk yH<* |O;G[cXJ ^ $5ʰOߜ㾶O{$|P\u1 ӨR\\(5DhV8+ Ngk$hș\ Z %8-FiF (9"~G?hB+)l 3TZ0ڎ('.`n:Nf:M@FL LC&ZϬQ#:2IԒ,k  X87Ju-wVYKd|f>ǝ?k’'Q\?.^4奝{|1˞CfYuor8e/%p۱#?XcH>##7}=Eloɉz#xP$'Ɔ z^Ɨ߲ BL g7w#~< ̏#Jng'zd[)p"://WsKU3'ع[:9PlJO=8?cQV z!b.^]@BF΃[g+'Bmy+b_?BX\>; (ݹ`$u}4^PDTP^?w8m߉y^,52:| w.wAC/!̖.>ufXūءtigw[͌E+$I=MOpfd2FI,Xfʌڕ[!\!(&zN`AW^}`BLLU> ѪH:;QW(E4x͸jDR 4x%"Gmt'aQDiktGrdP T-Hp !';g9˿qi'8[S%_dr40v<rY266/l&l|>O,CujRX,F"0 L0 FGGFgxs&7x 4NipN9}D @6Kf §JvOA ^c<05'w+` ,>OYo?Nβc|"&?@>/?l ȩ>+KKQ. -Z. KFxg?otuD_ouYUPrD~wFǥK_S(:=QO¢c׮m6o%dϞ]| ^+evk+i##G?1,xBF܁e O?4)>pۣI=w~\>QƢqN M_>279է_0p4 m`Ȋ9o9h?F ZML눝9Cy#~eou q 1ް 񅥜h?B ATEoF UL˜7C}~5vwCeD+7E è/ڤ_\)$< ;Xnط){Q,X!־x 'Fqr;:< z!S(dYVqS{dߜ;o>ْl68Y;k'~X%K.*U,(" AeLyޜU$='s 33w\>ok'JSzrT1Akyp3K2W!8PDiOP r۴Na+UY' !xj:X~0 ,, "*L uJK)z>~G*Հ(d~E/9,-.1XbձB#r;0yҢujp3ua\$ubB/6kvĤbx.FR;qWf^ arIf']ҝn&B< _>q X,JLaRW9|24]sx$Ԙ(DU1&cvO" *B+!D-&CR]põUE={U&yMlذ 6o裏R*֞Rd:tEQ@UU֭[i 233 MWZ V,CAJ%A46oތk?s]mX_tahnnfjj Mعs'J)\]V0 !*Z[[ٳgg̱clݺN"J.x5J%Nh5 3*,ΓʂZgWEL~G >y029h~uSV>jZuKnLBjy.iR(UFQ:Oy4N$zApnf}+\Y,O<\KfGhFӖ,rcDemtnf&WӲ5by2Z*[yϖ,JcqЊ=X*=NL_Oe/ĥ纹8I\ߋ9=B^oA[ ]KdʣnT7[x,ߦ_Joڹ.} :- hjl{Ӥ-sne| ڮ-c=ޏhs׫o qeD݇g Ip|N4 .1 O+vP 473ZzӇҚ@jA`ӽ9\$dU&N&ԌiટgY.+H'˫pUI$Sv* )Lu|$Q#PZ-*j*Ctnis|]'cÈXy͔fx)q́C(tg^DTxG?٫{~uDr,߉mΫ;,"elSN=E捣Q"#N0k&q3T*M22|q! PcDIa閛?8v4Qbnv@Qu UAVrwl3i,i"(IYGrV>tdoRkGsЛ\+WUP-W: PBAVkVIF;b0y'Q'I#a'6GƛXDZp1_Fip5P bzڧ^|׫ HB%mR6^N!1gv5LZg $D!s+~CLOKlCihԉ.#"]ReC 5E j"ŗ˨R!xjp]bI#4ۍ ACRz5 +" $> A{MScFKSD tХ-zUR2A%+[$8A4,.05gd1m-7BԔ(S,%; nCanƹd7,aUX+uqN(Ts!;]EQ%d0K>)Tm6Wr/}I/] m}/q,4{淭qL(yzijF?*_j_S22>=HʽOlf"$ܣϿPVf?^Iߵ6,ݽ|C6uֵ&.(DGLj>c~͓F+_g61w Tu0]E0_!|Zp\UQ" (aUCve߭&$- &3>2Xd C!4- % Du/\Y5TkԹ).֧yaE555qWDž XZZ"Neyrf!lܸl6zx|%$?1NB4kܷWYUqP " àR2޽۶diii8U9y\ԩSٳ۶%Jq7388|2y-x饗8p7p.]b||(0Mq455ǩjcZ걺K>300@`lla`zzz4TՍnUv~:C24z(B\G{t<rM,v ￝G^ϦmM OtMl\w]짡OS$m,f4Wbp"S#W dH4g[+NG j$WbN2I6+Lɐ 9Lq8J n:Xͥ!g70W(_Cا NiATŸTxDBhTDO>JEvJ~J̶mϓH$سg|@ ;mN )|fk}G]xQ5LШM9J[oe%[OQ;3]&!Rh(WvvS ZBs%*4}4dh~wg#J[XԸ@kWiLN.Zal~ SV L&عq;3 -q:1i cy*vmmDQ 5f[ E(afS!SaglneX'{⣴445JH-Fs%E) Imy%<0:S1<8:EPia<!Q(+#7KIqShzݪS 4ZQJ}:egk' VӬS >մB 't[jկ5"'IG>z6FwsgLK3S;12fMP,<2$D"\OL`uDdo0ti*+Va88.6I6ɠ/Q ad>'W_Mm9ݴ ?,*<w~;&RW+O,{B)k-T BB@B9{kʱ_ALAw7I; ;d@?|}-'8uQ2o?ax  [4D* B9Bm@V$G*ҕ̱lH Q^8|UzE umy^0&4(2% _Wt qdO?C}3xH$bŸEc]IrR=:x9R)'|..-Wd>x8W[p8%Q(ZřEz𢪡 V@F Ȁh5CtE؆08hj;)i1F$0=n#+S*v]7ܐFy>svR% B[X&F!TYpSc}jiXD3hFBkЋtR5×$,辆 (&'JzWp!MėeT+T# /RAQI2qj3;.i]8 D$9n:QZZ( V](E6?Q53IЗet e$"2a"4ÈPP=ŲY  m E4]$܂:K"? Q%U-Kk78i_ZTQkB}QC77u x2ya雄uZ#k,Ijt*iRԽ"{/qtבwq*T<ķGT@A)P/bn{w(u)꠫H(>H3b 4ZIf:::odff <ܹsH)<6(ٳaH[[mlB IDATmmH):DTѣ?B0AW+JeDکAj筑eQU}uV駟^ESKK bZȿ}"^p`&ZDJo+h.N%b44c@շb%z 裵[x5S7hœOy#0:v5Cؤ(o4xңt|Fh"L敐c*0HfUK^Z"h:ĪhGk,HE(ebDq~ ɤfHiU<_s;{e'x}nzVJyw|+:X{ikӸPc 8kt$qX"O86+AeZx-o;M[zݮ J{woۆr"*f/_9|eEܷ&ˮB:]N~߿ ?4d-F.Җ+Ql]V!JB0D0"\a""a# |j&C#ĈD" MhJtaT%DG|퓬K"A ⃢!5 \IꪶR7|J "\]v 'I.^HT¶m:::jk`300#Gعsꢽ~$S:t1zzzp]xE:;;[{hoogǎxؚT[raFGGzyh`x^6mĎ;rE4M4Mzx'ξJOO7x#\xq-nz뭵ڭE05r\&ŨT*hah48s dgqq)&&&֞Vūmo`Moh( qfal&L5C8Vl0VlCx4W]K9"՘ZŐqg^:6RU:VMWvQZsQERk]"fn4Aqb:fS\PYZ##hMj4!jf 4,:h7PߣcnVeCY*$A Xm3Č~2-XKEs h.Ukp)&ȖT4+Ǐzw`zf>r^ءi>r%y\cnosvThFw;'>sa}r dΫyd3}BY k<אmB2hqہ2*J͓gfs_2kpr oz0G6TlTţ>Bkj YC,RB- [R)%wD¦8%-eAqgЖ*v3\0Bg1J 9(+ZP<3jz79S(D5a`_g˰i؈B!>oONi؂dY,2D +B(b*P$h{+&.&y<f4\&ֳi & ;x%_7_%T*V.J %EK &fe a!;qI K/1~ >߰X2%$A~d{ͩ)N_66؅׈NGQB o=C㓣GblN , goo^WQ2ZG>ccr,]\Ϯ$ͿDWhۿcdr_UДH@h"@UoO+~$Putal}~ ;/'o(4nj+pvZR/a4R<=\W %"1LUt%*$)57de@1O؊aJ'7 ,:Nha!W544 UFp aM!g5H>J$E@ WPH8- Dk4lPϚ4%b(jHQq81bd[g6RMb^6#Z 6У*(Er0nYnxT*6::t㬻L0sQq(Ax6AS?АNT0:c >B6u) "$: "a CjDTq@ÊB50 sBߣ|QIṠ#H zW'R__&."z u (MG6#V@SCF*R q5 "4EH:V:+}슏 UhiJ]$6@>BФ@>QcE6+xz$HGh R!gbG~V C,"?0ԈHHUCSWC[J_Z !Jtr>iѰJWUU,;Nn:9{,B0118;wŋ9s Ea޽dY X VLLLp-pw"P(PTN<ɡCԧ>Ņ xH)aƍtww388ȓO>IZe߾}_9^ud2nJww7{T*Q*H$رcO:m۶m6Vdjf,Z{NUUT*e88|~ !L^`aaA:;;]pkv;ND"X,Zjtp(F3 l=r=Iv<:Z<uvY!3pݡ𨅽1d|7;27;QwGhi|ksxJ,Q$ՈPth;f{3W1 P Q:n'Cy Z|BjZ@(74GJ-њUP TV° QDc.JDkȸOBVT$kEʳ\cs ^0JŮ܋FwZX9:~ Qx'\UKWc=xCՒOer¿^'0`x]WnB5͙qV_SuvexDL_㙇[S4 Z rY]1OJZg먯jTq b.LP)댻HG; 2r^j .:)ԨScvs+nTƾ}ٳw7-\]_SDIќ#U;IBKRk< >/mF/WI=VsX)ahO=K8tR!+Gg/5{ 0J B0;Ksp$R!:;LWbuW|>c4|ͷEлQ"KuМR\# \ץ`r|tN<~'o43= 3 0 `Dr!Z+lkWyVuyZZkK6M2&&br잞|pFDAJ.U]uo:Ox_ʫ/"큾dD!"Q֛غf$QDI$ IcʍwT`>UлLiG9T<;xƛ/N3P;At.:',k ԛF(+jQHEsq cTC!Hd(D5$5qLca!bʄ8 I5 dؑDGG̤xNOQqZM 1HUQKhtHRE"U-40tLD ?b J׀xiBGErzBb>͒h!<4?!L*!&zl+5Naevu#mX_(DݘԞw{&~-؎c HQ@CzI4OGn(U()+'OxXVkH"5'R1 :"a( ;Fh 4Ch& 2 4M)ˌ344DZl"1??hqs=͛7}8E4* lv+*Ifgg9uq?Pq̥K˲h \.oqԩ-~门T*DQ8v9s ΝR$ \(bee8sp1{1rl6t:KM1٢_w!]' 44w/K6fk̰W{!J; obN2­x ?z`+Z)_;1Dlpv5*pk ^硡ϝK~wGՐ;i[/ЁO7XR!!s/O|Z!.O}ٙ$e,ضɥ54{_ 2Zt.rBֿEvO۟d>xk):tlnovN0`w3r>1{,)iF6jszvq^mԊNw<*eӎtDF1Ppj|w3xk|b05(غλ@ : AiAϮl"\f0TFy{/1qrR)6 .!,R Z{/~6b@1hcRdzݫшI 0QM}y7P\i׈O ."iȮE)NWrZHF(BGwcl.p"f*Q9#m;9yg|mV=I|'u"gU`C-')8 R]E(`he0:6NFGX/™KAbhpG{]1<2>EM4DƒaGp ٟs.#"?آ};ka[PG)w?CܼWh iD\bϡ{O2[_@by$fKLz=,~7Ķ,TE"%Ύkvy nJH)QzJԠ6:DiZaǮLMS] D LFQ.?$އd2kϢ:LHB,2&a&ц B݉ 8+"DE‚7Cюw2w3FNޢ]ikeT|T;E: owղtD]85"BTP,%JP5]F;Zn;-6XB*44_A7CR zS|(ǚ0JʚB-IiyVB+*ĦJĀ BU+ L6F%aDJ SG*iVb% ijбT A芍$ܸX@y.lϢ]ۤRL5~#Q.=UÔ.82`i؉H KՐ1&IiF-/`!O#WdwNָZ1* aIlu)5,+"Նi\P)Ge-굈a]`EC{Nn=D5LzW$DCOqx.uRM/S0Q{]nR\De$O%LX|nAiY3wڔv&"\HJĎAMSX|9%[Wæ IDATLuFlzP d:q ݄A-"lRNJ dm"e,'`mJ" ]F.Qdi%FcŪaG!ѰMܞOXtr^fEdS#>ny"0,LRn&K;ݦ\w3$O|_^Ff&attL&憽Zlɹ.CCCн͋nɻҶ7[`x3!|s ؒտW-|'&doa7#-\bz{`ӕE?vNW^{7f _|5׾ٛ`tu]٩PY 8g qĨq+3dҸĨa螎ړt ThUaŒc9^%6TJq j 鵺$i((A-)a@Xf\P+i4WP{L\s[ f/ɵY3>\+t2!p..+*k '%o*.^iK2zB7Q8ve)ǦY6nbYs9u pIי>7Zw *]:yˋ9oa;ɶ6$_rɄљ#1&\:3i*fKa NюMAy5σڋa8K4M_:,XK|ۜS6c&2Eg=fN+fXy En \L毨4)1Y~ ׹>fv$id z=,VU Չ{:a\"A]B/l:IlAX۰ E+U 4H ?:^?H=soʰ,( MAF]@Q01fe'!P$ݿ.X:9}Oi~ß`j(=Q_A_\&t" vɣO>ʹNg9R[C˪чyXW7o dl+rkB ҷ=YrAFtc^YQ opKaHBja犅L4t/@Ά''h F&A#MB  )QUPn!R -zGh$j U!%$E`)UpLIqu) "P#E&`(ĖfB  nJUX)# )!OQz6(;>h jR ".b|t bġm6ira:&6=U%W&u$c'dZ-SjQK.nܶ2YF-'ƄmMVСCH$i"ַ|2n&y9޽{9y$nÇfCK)ԩS[MqTNcgWlՄh/tSĺ(IV!i9 HjmfM" Bo`uXWk :Iy奈mUJMfsb)5ja&772$ͦˉ}{xþQv'\e~5fŰE_+dIџze٘T3e-Jz6hүlp% Ĉ&1_yN Tg="'QLM><|sZoL8v@vM~c~FfpQ-v!ß o~S_&9zQ@-νt7TGc}K 0r&;ָRh{"ugLsG3c|<;Μ r9jv(/ho2DKevJ1&fe&.(X%N;n1~L{'##]/]. ; NdepH喗P]msق= .` 7Zdj6-UƾIU-4Mg$S4h-,s|"S%\"ùE@NϗG CvLM351? Cٗs 4T'SKBFk9F!U}{vSo>&@./sͳ R{7~[q`j$Kbŷ*ِ}nK;2`5HYZ~-^I=#c ,JGoROh:GEX-T 4EL^( ̍QYqfP])R'&IE*n"df+q@UJQ Ȏ2ӁvP"LE1"$a\c/S$RDQU$tl޸qeṣy"ءHF0*yCGycAt\@ 򔢐bMp1b2GsP b!.R'ǴP\z3#,3$AvI A/Vxmt͈C5xA 0hY&}ϒ3ei,Z½@⧴: _&IF=7ӒM\3|gzzEZֻnG۶fϞ= /}ǏS(طo۷ogp-9'#9YQ,?ǎ;?<333ͱsNZ7o$-)oNA.c޽߿R+B?&"N>q[#޹ol{?ԝNallU6k.<Ѭ l,--iiOp!NIhRF(yRUEVG1!C lV;&}YGDi4uTuNvVM26Vv<;J#I #%TAI5/(!Eפ +t)&1i١7)8y^`0G)3peJZ J ]MgJRb MT- O5rNlS3  [oۿ[2|>O\rxxY__[wdt:.\`ddCm_7 SO=Ņ p[fLLL{nvٳg@.lbYfddsαެM(߿zoo/nms3 uVcϞ=H)cxxbH[ؚz)4;w̙34gΜْoӣjfsOVy4>ӿ]{! d($Oໝh{ض[{*=;<MǞ!ȸFJ)wJi*z8J+M(Fn٩r2D#Tif:]߼81MbvD_xm5Y F":]6eZCK}kG[%k.HN_Uƪ==s_C1(ͤTև=tfB:RdϲgB6ѽˎͦqQH']{zKܺ s;`\4z,33>8ebsm^v|q&'Zo2<3f-w1ϻxR:aLQ̚IP -t,0\d8dr{#l91$o?~ió~?WY?,`Y3UA5H fp,4RGRAW7ƿu6j*3pc9283B w8n8 4!Y]B[ZBd=ǟdc7UFmLIP&|Sg)NNR䑽EX_@T* brmhR0bI7&&P\Y? 6 E}` g/`uq$"?d5uE2Yb,̓` +9Wo|k/`se2rb%mD;&pLb:yYY^6vԣ锔-!WB&5Q&\0f]&t$z}ܔ2[(t.=?Gnyo޼ɉ'8y$w-:,..r8>)qm: `Y(ʻ|zSN3pQ?{n^8־mq]$IxKt: 099IZe޽8p;wRThZ[s àP(l1ʳ|+_wPUu/I&kkkٳR77 c+͛t]>>Of) <4M DoM{=3rY/2w^[fgR\Lc (rGMgincIϛOQ-CKO-*#wR!]jY ;2 {2Y(܃Ҩ+yeŭ0aE]jJU0V&/%,"͘>8?pȀ,LZauɅX0::~[Qm a{> K XXj$Wìk5 f4|ɜTvٕ 8:64&hh6F)VY'iTPf&{u+tQ 5v Eaײc b&X^pmŽCVѨѭ6Ȼ,impᏏSw.l;e\ ]'6)~&$":}.ުlۿJAG1[=WP4L,2 x1bu'S0T%7Oicy qVY;`2OTj,)u* "y~vt|?OO ]^|<;>}e QЋ1 'H =:+A^56_$~YCqkiiG$(>u 7 4: RVj}\.w;Wu7NC6evvvj.]&7Mn=*St:h MNgR@Ξ >D|m&>hؠJY`nsMPW=I@9'l3%z5b=PШ8"ZEɹZPgCU| l"XLQ}e:)&eaȊ!3HV+[ .bԆ:B'ZmL9Fu65A `k$AͲ^T1W,8D0d1\beZ^6lF7i54MrULӈGh k:0Riwh̔I: i_U$KMDE%#IQ"ۃT(Lh!D6;Z܅MQ-.8eO`T橙y}a}FGAhר$W>fOY{;[< 2{pu(pþ88"M+&Si%b~k:nq}G|73/oP}#GXHL.̤X"|89!G;}e(TH@gj^.?Q(̮FI&Npc.)B%DϺ]ege7uFww8F \#=yEr#|7h(O1c`KIX.PhE V<`iG{} S%7UkW**1o!_ԠI&?z*g9U%e)"vH~ҭKo QY@$-)l4hիCG,bftp]Ar Ļ8?AQ<_A6MG$f &>, ^Cq\pL 䍭a[yx(sbYo\da$>F8 "'"I n$| 铟"c7߻zf{ai0<qHC}Kw(g>$/*g. "8 9.vӪ$>B îp?o`x׵w0X_&@,IX_w @pc mFps=ޓu Y >6W)4 B#Si~DQEԚ/4ʂI#_z"!]B4L@[gb+*"RFD,NsD:2Q>Lܳ(cC8^;( 9ږ a5chCQf\| ," `p}٣)v磙|mNޜ5o MӊCuqc 3'ॢK9C.yı "ȘsIf`[[ aMz*w TYh3lSBE|X~>'l¥kH$s(-,rdYdG'E=+zhmO1a V΢У'Jqos/sya+0 z,p*6) l 쟇Eo {"ƐjzCm;񤻓 #4/Ns5Fu\/?55ˡ?9z',)ٷtb /Y(9k~uɽÈNC!HAiGyl? s;fPgLJ.qY8;8Ky+o]'Y}"цLͩ-=dgE-)&|,$S`[%=ʼnpXRXc<ʘnc%|Ԫ[ktH#5nTUboqjʥ?- ;tZ!v^i` JE \FaMcYU #:?I4n"HGj!hw4`YC/_C\۪I$O@<CVgqI|՗ofYO =sYC2ÓdT/}'a*7o_'K=ı?"mY @1?($s'_ae:[ PkX] CE/&9~'a%Wu]B_O;'ăX(l2t;Ƽ+dJfj$,Vp o$~x*uMk=.NIƲUr`*@ #bm#!ᗐ.a1KŌH->WBK_~-M?)HsDW}?Ǖ{7qc:Է m /b}߻_!:ꐊi[26VG'x1n3@ɣH:n P_cW)U’EvE$#ho|$#*צwdrϨSohm +Dlxn wA!%ZJ Xj -LJ;o{Z2d`G"(3#l"+9_Ie ˜>B~w2e^9c k#BL&6,>6pQE*їqcH)̲ 81Gxsa$Gaњ%y@He20} W~0@lUVC74d v?kZP]pF\V8݅T7}ٲۮb!A ] B$'Oرc,NC&!J*bz~;YLӼ.]1,//c2o7];mLyj5*np];IDSlj1e~"OH1d)b9LvC2be |주2bh&~fNS XdhŚ!: ~:2~U3OpՅ, 3B=c'O"5gxwF!՜N5dICx>6>bQmQ;)% 0ҊHK3l1r˰cEʨ_y3hOAύw% ;9XX9zࠎ%ZRy-bjutX\u9LI4ӣ,5ܦ@d=Gub.0+G ^?O8^PkLPܽ\<$Cj-]co9KcS&Q&g|7.|g9&G#ss:á!Fq;;D`PB8;d0گ@O?-W݈DVx-x'q~2r4 Dh a~(EsFnrJ^-k{Qw0}Y6RkA k%Mǹte㝷2c5:ȋ|Ui,x!BXD:d+ "(yPcYUn#Xi@QD [$+#Ljx#!VClZ0Re!Q1Zäm z^ "6ނ+IX^1 <Qp8r9n" DC%o}|uA > ?_`-rED9ȲGZ 9iJ"$k\1M&._ûoY2E'_`9"89,\NgOC/"ޚC\BKEFIUUp*E<1;HN#N~JQN}d s!-/""8==V6 |Wp56UA,sDW-Oո9^ʽ u8z2,Mfc5Eu<'~sgr<$#Nk_f~~'، ;x@cʭ6o ;Y{>rzI>JWdf4Ox"[\5&8Z.bE w2Ca@ue6wjW1ynܸq[$w. 166 $I:뺼mZ\\d~~vuktѺ ly;Xnoob}%|;np/v+~m۲}(gԽvP#rbK!P8 ǽe:AdEԼ1n&\Zp[zWA_a6d{xɜ"B]>0kVF,Z9L^cH*O|6˃cZC>5DR`Fd=mnfg/gLXYpB6ZDElz6C:$1|<}NY^30B0ɠ("[4|Dʜ͊`іD&v*7r)12QIV_,3zؤ6?WG(,\b)L">bRܸJ7LeXLpR Ru٠s0A\nq4o\0$lgV?FsʝX !z}L')\˿ĸuBr+<22GwX3Z ET# !yP&Ih'kg8PiХ%Q<ʍ,gB~omm+OHYGSn_c,"(J"a[[Gu.^ kt]]CtM 7f~ X{βa<,Ob5g8uZÇ/ӛx)d3!h!/E'A4GUdY¯L # )ߛx;z5fJ,# "K">]A(}xwΜmꂻ낈zCQڵ)$"]ooXރ-1]\|r] +[{սe O!s)Y2nSLZb+KXr0:U_ -SGx65%v6>]ƈjS QVL"~QnCX.6R$]P+dCpMQ=Fs@߷KY*qYs!3#:ӻORI%xyCb:1OҎ2>Zc 0Vfe(ĬAR)zO"H6eꖎa^I7X-x1khqb }{gQQҝcVe\oO{Mfy|'AK!@ m91`tZ>VViYFvqރE B SkJ?5I|!ײRRcc}Ot-߃yQt4~uWBd E h6ml`$rFx.Xa |ʟ}y ow;^'n5;s]9wC=0Ep-tգDץ-&\S}CJTPnBHpYT*;FTDK9T<*zqx)l (}<׫x)αQՇ5cEUDr"Ug:4QR6_] d:?*L̴Q[eal'Z3|=㾽SO~wQB׉MYJe{tlMH$>vCɧ/3͑|qr|WYzu`fޣ5m]nu> ߭nWM]/J0no]͵,t:M"@Q<#ٳ@ @"_*R6$;#!^]{ 5M#nۧ>?s{oӱǡhqbSD ĉhw,_!6-LZĵDm?s̟$ߓTh=6cN"'Wn"s 19l޺D;琗jcc FkU3\9ܻ$w|؟ҙgpv\ʲ}$^*_b(jja]c-R;N2џ 51F#KyB!OGpm vCm),.Ӳ|Ef-kD$$ 2d$(%rġvqx@90BU_sbx34tY_W\Z]P_AK#";%\i?/žkiB~v i1<ɔwgTrsY̰xNeMpZGG`MU R/}ĢWh '*iY&rXor3Hh %M&`:2Sglf͞$ɂʼA;b_R1迶.?au"suFT:G +H0V@]a ]ԋ6F@5"lƂT R2 JM~͜D\Ht3A="u@&NMdoz?p^E&'yjb H.jl~tr3LZ(-qX;Ь J%tބGcM IAtV.Ƚ'meKY {2d !%MQ5$F$v r̐<v򶌷dPdWP<]kz"l5 dcne܋C"bVIרˌ?2(N&x' N2" V7BۓmѠXbMv-P\A[p]Apnx؂@֤ܘABHŋQmV8w:}ԛS?s&3Yi;>s3@BrO).~cQ͎Q{`i̺k4NJgR1]\;R?ßfx ʾro ձ )G%ӨQjP8Mԛ1|}S~5..OS"#ll;Bb$y =Qr$^RžEq4#r{l)- tHL`s`` Ym֏HxU6/~wb c>Z;KhfqA`88C$͇_PBbKnc7=M@IIQZʖ֫])vײb7k׎=2Wɠ% q f03gz*n΀pZ1Otvgevf>yE BS"qLW"}mE5@bs|% 5ȋ;i6x& 54B JUJӡt2_>$.Fx,W$FL`iKNfOx4LltI݉Pu!`\2.R_nZo(SIbJl6Z$7hnչq x^GaRf<≛lW] *G\l EI u60F$cAJ̡rZFVE G7AH 1U Rot&#`J[zcQ1 օ*Q* -h<]*CPڸzxIĽŋ :cUY% a=j`۷ѕ&W0ja;oF)˺֎RA(6M+|$^$Z=Ue Xݾ49$ߧ9ϝ՛DKsj蔻,FQ MUWhU פC!,hL9Ti1:Uӟ?tGeo,b+gW?-`Yt|n>'.I*"K".>>>&> '*#.&z*2mQ(dZU/ -: <Ed*En/mb1$ Q#".8;ZѴhVJ >@wrg?/|IZv]ÅeӾ>Zb~}A[~\ld._؅l{psmx"n>~&#rdl\~Hcۂ@x}}2&Mqvg0}&E1YCd{WƘ^gI{w99Ub4N M o Jʘ鞣jG?kE:'K ʘ"rBfY^ܢ6c/r,Rp\~^3/g0؜rW9yv>wTP+9M?Po%h{x+lT=1Nlߡ`JއK8αwdk5ƙ'MNL#Oo}|]v2M9Vxo)"g$g`a=j]U!eN/Gx.L&^ǤS=й:s[:yyν:fc>SW Ѯ )=B}vI\Zxqa0ip^c7uӓa.)9v1sz-#:5ࠕ[C2O~{*N;SqarWɄ|i6u΅GYٴQ]XFhh.fM+}v{KkM9 IDATǖ)s85C_dKxYIӦܛ&~[Omf!A;sg-q@8α[&{{ElXj_{l.SޕLMghQۏf|r{+vg=N @UU* l6Q9qYS~|wAq>G_g}ztbwu]]ieY{  {_aeC{ΏVb ~f^O7._Wl̷v$E-ğH ;ku/_&}¿|Ch2XѱI7MQ+`S|!N}G0?!~p[e>Ibgo|Rctch>:vquf$GQu 3o|+ s+&8HU ۈ+#c,,+?^x%ᤇ8 "]N/I gRR/}DECQZ䂷.dD=u_{ڨ,#pzk_ADZ};v J/ z;a x)^rO;hooE);>A|<]rAmIVw}%|yV>؂ς "$ 5ABc>znS[lUcé/Vmtxr~1V%B#izfG^yUW95űz+^y*|[?75;A:/9w>}9漂]_}.~rw zjs2K-BKaԯwڶp @1Cy^lSb'i}C9dqIx%ÇKlR5"HWb!ByN;‚ʒ|#{ 5&=Fwn}AXTl;JO}Nnv#@F}/ܿA .ګtMrKx_ TL}#V Β/q&Mn9͑{]HCcnn$g=f M6'xC{gOpxJ?&еP.}d=ȫMQ2z鍰m4H41'bdAc &u0O1m0~"=9: Jf,T7<%mN5?EzmvAm;m^m_A~>6^Cd|(oZUrb WH>|Egoǹ9 Thˑ06KϞԠdq"W}9>s#wVYN_RMn{; NUYh;mV':u8,eqn'q.#[C3v_ 1j;CV]TkNyg pWj,IpRPMp]5,k ӳ'}B?m(qҮR*VXwezѯc8O죎?nqDZ?؏J tvv4`0 [(}Z kkk>Vj=`ka&\N+>39>ayt徆uo zˆWI7B.G= C'O0 ͡#I;9xOnԈGާh}!#rkcno+!pKY /#nq 4"5G3$єhjM6̾"Z٧ GȬT=愻Ke1+*cL(Qws`DKuB@Bt6xjEJ A &x"vg$UL:s+îfia5)':=J' JKz.BHo<[(n+X[}$x 8>мX ɬD8;vͫ =s?#zJ2»o+W ibW@V't?%}E||O{:K ׋:^k`[ *_BeiG#jHD="yx'?F@ƻ"S\$ǟz%M(PAzJDC>gLo?ֿQʅYbӘHԇ\VN =mdZ V !L%m,Ty_k&HQ::z3}zp5^8qUߺC۷%gOqDLv =N&F e7+|# IfNӌ',ioWzCMO}&ͣ\swBa/w >oq"yp+븽 oM ԕ1:h/,_緃U~ɍw=0cE0<Ś[,}=ϝ(*K?M)z?fh7w.p>;L| y4:8&Lj%VnOgP.Ƶ%ShS*vbAz{wczc}IwۄVLĽ4b(:I/Ekt?mw"2ɃQv lf!z'Q .A4fz0m&XO3 ǡ6z-\f1}lFg_duTH\a*A97+Gc&KSYj# D{'8\΄燸?1(KqOz o)}hfɕ YG5^.>I$Y}!IE }J!cs-u4Gsw v`wT*H(hٟfw_wp- .U=]&F_}D0UQl`e^HqD"4M|S0T]8 q*^h&ڛ%;DDO}A[҂/(x#D߷Q|WnoIRDp62c"e!A@TGm}'IQB3԰`_8}ALW4B}vCXgD:Q<4?ʗ/nQ3ȇ }kI{5 ->;@4yf!qm,?! mQd1`2z6cDmjqKqF8oiʹ96Mz'KML )re̙-\RQDma* 6.צ'!ŠDj$y-Ů[Q1]&>N¼?=v=c$1)$Mj$,'9̣ɋSQ L~PY2ST:$F?ZApZdc01MlL1ra ?Q>[Hhaj-qHr 髋NMt 3Eոy6K/cK'gEn*hH}װGY1D2m 'iz$1C$(>(v0u ) q5pu-k:Jm<{mOqx{92lْTzOܻA4D G,vC+ĠHsʤ'} &00ll#Y:3 z4r+.@}U. GzRr1y d 3 iO<1L$wƁ~Ndus^`nK 0`'}{y(`ݍl:}4躎,˔e}~D ܹCŋttt I#[od0w aw磠Ҷmd6BHie\%Nhq(HD2ܻ]pkY,сi?$Yގ rC0ض8{  !AO^sK::Ug@3 _  AףD'ti, ds]5ǡ@ AD )]\d=^͎8NS:A Ktljy̕g.Xv`9̆g]e+J6UɯJȑAB,A&**$hnL) vb!:y,!Lu#m7|\D4Iy$&uQ~YjEQ,D$* MRi414-ldrg!*"Z 2>~YA-,_WLG׋tt!)u"nˍw>':"z(!ɭdv Zrmɨ}; K-ٳn1$|8U}Z&\8zӮmZR}EQ[,@&tQ&lIsP%Xh tNOhh H~k|FJUn H"1BxEYcw3xb c:;|rRc rz1+4#eN%x!]{0ҕf;4Pzu/( aRF_ %>ע h4;wWn_%q/UciOPm4B9{Mn}fj#+"G sq UW^b{$kTSċ#3)ҫ"CdU>4c|PvXHT17RQGd(NҞ&Ft7ƒÁiz=GFo~&{KYs\R$ H; +vYDO_73[Eҷq"fԄmJs6Ƴql/!BsvlVL-erNk `ni4Lh8@{{FNHLgTD_"R8F2]WY2t֣%!(aڨ?nD<(cwګWQ.x^ZZ"Ϣ:ϩSt|~%}l?]4&''9} IDAT47n J122B\0 EAETU%ZӊDOxEO0??F?:S(PU^{5&KB!2lw}ydY&c399xD"\vwbC;?w{ 7n_& jQlpm1_#,z0|@U"- (R h HUa"P =2#[f{xt'p^$ _o"b5Tl_D tqhb}^mH, <\(m@Ncj@5 S:\i$NGG|6U_>OD,ٜdro.YxǛ` T!言0iZ0v$1]"XHr E#wAdɳX~&z;ܿF[.խ' # MlG$BX:!}& LF4lb1፪I6(1gzt75%@0r0DTU&ma(axET>NPq| Q:a{fP(y`O5$;Y-m ;n)6m5ZDe&nP5eAhy,FREOЭQaɃ&ɘKBm7 D$DOE4 ./:Q{%)=){Vp_џʳ\a#p8HWaBC<3FT^FDbaϼz}7WRSfտKo}i _P]bx*9T\bҳLte/QP2QB)גetg}w So!#48>0AW9J^ֶʤL&jVu4a 3`dp@MA;DV",4ubRS odOޥuAjb3Jz L[qіRxM*e16qG߆^hBB ۄ0e9BYS}z3>B9)šؒ1c"%Fz.I!$ Fi:eDLi+U J_ lc0OXcq3,RX_#p(b΍3 䃰9zoQJp=8S`r}R!%y(N20ǻHo'QVmա6s$=JXsUR."c&UHcu~60ett[\ir!(J{ ӱG{9O8_ѣGY[[4Mt]l<ϣ (, ܽ{r?/ wSSS;vlOj>00Çx,jLY94R!duubÑeRIApRlP)ՐTӪ +"AG l/?Zw@49u$dGRȲvx Gqh B0۷?A3E-R*gHi">@QP{(zDcqp(LGq,rIu$,VFHܥ< xej+} I&Msgo&v38&.Nzz@L|2֝H^K&_llvӗ8;"cKX&o~g|h@DrBϮs:VeYq a_~Į`bRM\#S|2f ϫot.~ƖĕiLlAZ~K:`-NJP%{$G"&YiQMPPn6ZM0Lo<=lBBN/\vAE"ۋ6Jb+Sri+[:k:HRy8!1-A-"e\2EdA؄0mW\l8=bKHKR&` +[HYWǪ?rVFa[!XOo}&?RV**#/>cpp=fk*mw>\e%zXnM :L O،|0XFQt[T4CsEh'`>$x;ZgH'ʸ^KNmvKX=;e_]pd@qvwܰqwTעN,뵾+ ;-j\QOhhM0o+:x&?cS II? dV"'rkNdm5K/sbQ3oESn{oc}_}}^]KwnMHJ.Y@f4# fA ylEHvͥ콻֮}{Uw2dƂXx­*;|9Xe5ve+4Gt fq%!bv `>/qFJDlT;P%F(R&L&ީ-">񐇥U=j g4w:yzy4`75FzM$$Y^MW4=7ILbl{8а,l \FX#dݤ7^fӟnvAnak`ܡCPlWT 1"4-0]lA&ZPiQ % R:mI;E:v< 7jV-Gw &jBӨ|tlF܄BR"k %bR5HEvqZnK'Jݬ*< Feȫc[IFD ACEg@~b6WѓqLcYg B "3^j1EOb&i"M:W|*6a%JaRUkھG6|ۛL&I$crbݻw0 LqX[[T*+#CCCO(tOEr. lv?Eܹs[W\!f; #F:Z8n`5#qiU !5k82 1D @ĐYrt&*>'0CXw_K Z4P[혎o/HHMuPD@B&d*DW)V,-,=ՖXol2'{jҕ pDUTڒж6= 46T^Ej& u+$$\25ο"caa[ETjSm_eqW]C].FT)JR-e%d)Z & X^hR BhM ;% ;}JE ''fU$@ip4wn8tOAGGL~M] ˊo! P'xJ( RC'pٿU>dZ\4Y̦e Hg{xv/ȂGG CdU_ H1$ "eNG"$ J&Np 4^D j[=?/IH$ RzelWÈ"P,)lCpXG1raбm X ~!{>b >ħ?c.Ʉ{\J(pH>`PB.D(ݤ9zUk3abu$Yе$wy|=A0jFX6'hgOs7[ajveSF}WcN7>X;k<8)R<;z6J̘Y} ?$ g81vxFq>ʿ^(?\!"*Խ:b:Up}bضEV'.#4w4%RVwˈn?ŠbGD xzR8 53U.e*`!^``! a%x#in;HIV](ő9j8e*ଢ଼DthG/x6aFD\MWJG_=S7971f{#Zbk,GvDQ8BlS-W2Ҳ$-y"t v !fzfMOs_@,pIyfs³$65b쎼a_ಶ)"-Ƶ8.o1UdH~eVZc J< ez472 9ksT[\xh [䳱{V/.Cx2!7Yl/BxxjJ摛3c/ yů|^fbʨ-Jcccܫ&IfggGwvv( >zzzӜ?8  w2??Oww7|SN133իWF|3رcD(ʾ:3<ٳgq]L&˲jX388ȹs瘜}yǼ|A.]"=== h4}i躾ᯃ"L40h4 bۋ,~Rw&֭[lll:333lllݍ8m$,//+qgcFȑ wQl]QvU$IETei7uBUH:A#L@:6~x;A<0B°5@(! 6 8bfkshjB$G zY"ߤ+я$J̬qi<7O(u2m1 xDɕ1_]mj/ݡr(X i.E f1KUN zP}dT+8-$ӄB ua={g_>JWWks=D*GHtQMΞwifbG|:wn\n=XTX*Ϳ1<:8†Dl@9,"[y*T$05vv%p<ǎP2 nP%b[cP['3r KT:}qv d.=u;-U| q :;xrvPAkZCnWi+ʖG -ZeM#k{8n)2TCt}Aⲱkxxlk)!"mo؊`^%SZh)x~ be۳O*gX9m+KțxH+ b@GQ |ZC7MƆƏ~ u8wʦÅ\USڈNUqd$ \YcS|᳿L{>=6w#ǾB~ .Ƨ{zEZe"16wFOXD&ӢZy7yC/TGy|mdC'&*,q,," .=?5&>p ?&wID@F ڈ*JsK(e!mM)P|WP]As|[p)$.31)DMheƺE>}Uu\e;{ơspWԑuu>Q~r`1y7T6Q͂ 1SI`+)Z-OaT&Ɲp׭Hzu,T8Rfh߶8%uvjnXj/bzz%rߤrѧ-[ajsMJһCaΚFQ*}4MJ]JkQF#`#¦*1rbf Y[3a#L17w܍ҮstVC}go7!r!|QbC4׹xp#X$3>ƺ[Cs>ӡ.rq|X2_oRX8v&W<&w~t&Kϛi8Sc'xF-5֬(ʾzIh4 E\|L&DQܤP(׷F'}/S9s qEj> 4M.\dr?{ttCc͵Z ۶1 AhZeYe\%L:P!|M]Fѣ>|Çs1<#c&< >,<*Nml6i#xd4VE$aoo BhrD"TUO__333rjAs( \nB e9 :vWbLEIaA3;M;2dGYDդ(JD}٨Szq̀!dJA Q¸** 'M!B?"JxW(m\YBn¾p˜8}=\k wgs,]aAx`D;`P Nzt1Ҡ J&6T+<EuOq|FFWU )F묯{5x&IIPը[Z@*+{Y^g]V:~ Vю@*#*•]̮* H O jlB6Cm_pmĤDZX.hHQٚ(]"pfRgG!j;nܫ),,YVa""YG;D.(_i2+ &x!Z<@bnM6a 3ǹunߑ$H'pRB}i~7~w \sF[Ϧߒh{+|\4'ߖ""x-d>/\@iNVFKI: XS䧞/~4Ŀ_ᑇ޾p !bc xⱀaP@\ ą7|ffKxr<@ 62[%pIuUŔIٛm^yUC8.ΜH}nIgt>͝xd;:9-tV~2ڡnF#EkG0Gl3أ<=ƻUw"S@'ٵoc{aӽ" p,%Y3@:T]0# 3=> *-1_揧{eOgqpEIU3)Jfn[a~6XZor(j⶗ $azkhj豃Eu ?{Õubпoc ~BTiwX k.j3mP/Q]vP6ZC*њ^%H$q<_% qGB.jm%; 9bCu<;FƒUZкwY{*;>IorivB4N'T#c9snH-QQh͵I]lzc[lGxA}p ;P;M2ȑ:Oe4CQBo`F(˩0זO1&#3stXSD[@n㎜ՙx [35i.7RTX#<]pl܍ ?M9R,Wʧ84uhw%%|uN3!+3L>3^u : -`(7Fgk)nsľt+Zg/R!ڽ{t=*r,CȲiJ%( Ph_-K"\.ljF(uwN*0 ~x<$LOO333C&app|>[oťKVj5޽$I/|'xq( 4 ܹ~uӡh?8d3gp-}.^=SSS<#<,//ꫯdX,@Zg_9v]CixUUQUuaEVhwY fFARa||z]}jUWQkp.p@良:;UvLϓ:6C#%cS?B(MAJQQ$RkP@KIx>{PGI(`u0a"&Vo_&ȡtC+53I:ת̬Lу]a6gKWc-HeSX"3L$bX& c㽸a|핀>= ƙ:}M160r"i@Ci$D޿O#6+ă&;]Ios4}yJJG'pi.K ”u~ç[ǙR1v4 G9"g\4nljdB'caC}( AM=뾋WmeCH M̤۠db[^SqbӰ:WЌv- 8F>mQB|3Y踴 "bA B;`#D*.A$D\*VvMc+ qMPy?ʽDAem\|CaL4f"*q5Fٔ5O:jshJD yUW]۴jK2:` .G\O:&⋠.*8@A<|A%r)~^k.<&pˡcu%HF}ri S8w:|K5|GPmx];CO4U^@oGyM "DO$,6la&e}: " : "2397 `b 03pxD-Nv5O(=ovr}͉(aUD?5w{AlmL-BnJ|tc3IN%d{7]]jSYD40 B}D/;mJ1.mfY̵+nx=A-}k=%QVKQ,I(h̵\ $e+۴>G[<hw|\q?/` P{[<,[M5nk$ml8't5jpxnT=䜁4v%u 0q0ڎUq Y]AT`$)y8nNn&jzirAnSBZ&4K- QQ4L|x3L=*Җ<ҚGT2I],?.#ߦ& p P1ZiTʤJ,˄B!0jt:Ċ}8 IYey||_@ӴbH>gccR~U4EU:r }2{ 'P({gu^{%d;u>yϓMwP aY>CL-!IoS:2|5(Qh0r=D\+,t1Tc/OW&D@//{n L푋:C &np}\SxotKV_&&狀ma5Ϭ Jg}w>\FPJqU"&Ă}Kd(W/kf Yo,OIͿ |1e0_}-m 3$´cҢ|PHNPzy$6VWd n!FLb ,!6vP 4*aK&@j;4U2-«̀fŕe*ri%EFO  C9̜ ōE}} Q1t]pMl jб҇CV7ؖ )埏al, ",K@4j>x>O.#Œ@@(& ѕD\jqEַ-d$"i)/JA?u YqΜ>vW΋cI ^?Bu'RW3rGV)#k2+!66ebKtIH l4lџxKP( &F&#*(? ؼ{/ԤWQpG(hIDh[6vU/S7&,JT;6e! v1tjJ O<+DMEzBRFtCXaןUP:N+F%c@j4w.JA)dKk5B l;.`"Qٝᥬ@#o-3W"~~EB-#4<2=0$4\{Q*s'>rMX.j _n` >-!ǰLduES,"LBx -PBO"ѰiøKYb/A <2;kH6BY"#ޤo7 bnCIQ>Cg*`aI"\0XB8kIez7[eSe{7>"s֠)nd:4Ww͹lj؛Gl3dP7ԄaD{tnoa7s|i3S=8tc*7-mTQb&<mQ>C!%{|{Xe!u"FX(kQϜuۤG<2trq֓r e6 %7mn'lP\Ip7c)h<0ٍуM^* | #GJ>rz[\p9," [4W;hb;y־3y 3̯&HվXL&qӧpcdؒuOv]w,88A&ٯn2 c y_U=I>a0>>Α#GݻA__L0x':47YYY,<'˱XxӧOݍ(j5{9nܸ/H*'cccO~r?ϵk(JL'Ns=˗O.JضM<GQ:ߥ|?muh6_e!"JP("~eYhV EQP}A. rnmb*2 B&vyÍsm! Q8n| w^`Hqd:-Jd4-6٨ r?VH>9_e@~ C&6ĮDAKPzLDWiYs23԰Qǘ__G]'H'82Ndi9YG3a8kw,dD_axɫ+ h&F8X+H&趋ä[.ɧ>ss&yؽ±C9LX dY{~X!a:d{4FqOde) RU#a Jtܶ?~biQ(ЪERb@ 躀 @_6 mSuq| Pq cL'?<7 >~g?}zwq7;@\EJ-QmJ)fI|H>M%f2Iy\5TL{>0UaVO/y9wYc!_Tl*~Sdu+$r[B>eшB´'g*d= ox  2_/ wF|$LKy=3d Y!R5Ao@cn"$B !J'>D@(z[Kf}_'>[U#!k2қ z- IDATA{$4#OxrcQt>l/L-j* 6"l,MIzD@m *먾BÑ4nTFUF,b-S !x Or7ALfH"inLg,!c& /Qd%p X֠~ AvT:6^!">F )8K,4jD~N umbBMGnR+D[2JDY1:{>)rFв| @`$F5W1RtuZԛưZ68NAEvÉIITE!K+U:G>2SNeWʼnLb# ܟHr)fx$y"#~Mit$ Y'ɐLsk NGX;o cNr\ܞz w@԰r*Vӛ&ys8֢QhSb=K%9wo.cëO${Tߗ6_}Hj|rzt=KD߽%;6OM_ˆ~DqRIFOF}rZd8b͡`v$Ia[* j3l^r1K_8ŏخ^"=>˭CYPi0zߑeɋC.SʵAؕXg2*2YQUMv#> w@#QԩSΥK(J8pC!I[[[R)^|E,a,˲L2DELӤ^c,vgtt#G??bkkWo>fgg9}4 ܸq7|dYq.?GI{kg?<ͅٿV LD44M#JlG"vXk~1;<ŵeQpc~cهZxXܮO}dr*ӳ\kWJ1cZNU!EܠK@JRIaRaG%UH=*?MpXBfHRA&iklzY27?c\[, F9ݸ@AD#Hl-zܫyL% 47 "tD6[Y1lNkm4Kg^ jfmbfSؓLv*IBlPՙsNFMtbe}Z!N<ml^>@W|fFV|_~+_fɨӫQ"k!ʓ} R8M{ClFh(Hv䐁|ϵqDc^b0b 0z@IvuϾCcop)" $?$gþ!X1PSXI^ j=@f[%.$0V mL^uĐۥ9n.3>m %iYkM"CoFTC"b"f:Xji%#J@kMv1="V5GT$ t\4%z/N /'*жX۶hJd JNh],-( IۗQ{Bm[MPrUwk)ώD N8/6mlU@2U QeS35h@<ëE^w\i*d]S8WYk?I~Hk2E~0N!نקx`89&WsX/ɱz3I_gVsً5F?[LyJf]\TU:Ջ4 ÄzN~9gM~~ym>?ݹ4}^?UN:c 觏\cՒ'C[FiHa K;ՏݥMV)Amx ٪J2$ϣi.Y*vn쓮aiM}rfw'yG}\,9}4sssܿ۷o( ccc s%otxWxt:?RDP؍rVI>G$vg,JeWsoW^Cub?8Νիu6VY^x2; acfE;9;܉Db7˲,\ŶmL$Nl>rɃ }a_zCT'W.7ݛd,_!|&H{eVbCKij!r$@(=b3`k% ULw~[gN=A_!$#H9=Dž?aU-!]L=.ׯ]'lpf. z_jK`2#2aGU8bqӢAU5Z *n?&Fbzշ84rv1,20B:H*ehPܻwo FB˅H\m?+>N?O* IlهXͱu3Ӽq5wqKbBl#jަL::)c%Te!=ZCs.DF ۭ!IOcj"͎puЩ1:2CL:9ح%"W܃aS};G >!k_*(ASimչz H K2 -KktːH0Y -]@Ij F>~(Xa"B>ҶJP~w@-c*1CFS $?#v2ͨM<.#J; q]HPDUQs@N2 q3 <~#?OJR>C#qF{"_8%^_d.ܔ8QD"WDE M Z: T QVi$)L--" G؎/GNxT1J LA2>zAH x*By! SINmRMI;C\Ȕ FN%Fܻ&p#!ޜ=M[}R6D]P0)9TDMx\ jթAsUqWkmH IlիP2G.L~: ȉhȐf@}@:R|cke_pDA;*6mRn{Co#tehUQDYϓm |JNJ -^f@~ABRfj˥,JLf{>3{Kx_FmXQxᆬ3ٳC NW@ϋ,^IPo7}o #EZ#}WypEDB~ټ]Xrn~n*A^;qGǙȑ#(466t۷oܸqX,Q133޽{Er>۶Y__hŨV,--L&)Ҏ㰺f۷Yu+++ xѣܾ}^{۷o|n!8wLvd;끁z).HlJ@ζLss/% 68{5c <ײ{8{ڞ}c,u2:q{wz1q"9"1 [pXvlIp)TTS*=fDdLM2 2R OqMݓIIl:]Lt@( (!DFO֋*.-Sty+W0+!,RF[)vs=~KE)("6Lx,m*bGaIe˿D QՐG#N_)qjwzKÐ. d328ϊ>#g$"j[bvb(e r!tY M"2!j IxNHL!TU DB9DT@b$TLDQJn`:=xL">\ (0e7i|[ lX̢Me\Ƹ5p7 (KÌ1RtdqmVb( i{hPm2"B$j6ѶmET-~葉6cM%/Pt)xALۃ$T*I SOO驕H%sg{I6ʀُ=?;k6# >{챈JPQL4J>ɝz(m7mcJc@g#%:d!r52rmU{ {&/Cn %,%3',τSw+`m<r_fZ5F{T7EE9X${zmF&m^?Zc)4pn,~,"~d&<|8̀ {D,:g@Ȯ2nQR [Ƶ&%Z5te>Aawظ1,MquB7|6+;>%ێX+:3CUb\hK9:Z{.j:e{{}[t(;!C<$1TJ/|?d}BUU.QQ, ÐNtekA@&Lbܮ t]e횂IDP߿w;*{affUUGu.gϞ孷u],ǎcttfI^'">|.Àdž߿bc=ƭ[8w.W^0 AjQTb$ 0ی/gϞݝkvvMvjN -b(0MQJ%00 :(m̟8u8d]w%Ib}}Vwdحr^gNuX,rcBL#F2Z [=3l3mO=u!:D12 WLRܽ@oCk_|\bD`z| 86~!h\]Zabt(-0}26_9ZE죇͝;9n?a,. _I躀19R&}*Q/Aj9"b˦Y&7#~FO $j7x9qm%澗㽛u~dEt0+Hg.O'g3+ m̦lj/ۼ{[~!MJn ~wotDayɼf\×I- 88v"݌"!"=dF\$$ dQA PmZ-z 4rP1FTR:ICGJ2fBȁM1c8JMns#q08]o֦aBDY\؉ n#6WHe Z^kRd4+j["Nf6K^hBKiGTj(ؾGpQ6(ܖ q\f:A6$\ Yvp5Jf#ƞFSU^MGUB ES^Qj#B%|Dz Zh\ا| &T?  r!a.]W" sEBU CT@8"JExA/HD"+"ȂR I!a(! G82kk H~\`x(bć#F{#2@Bpg|La]XZ%d k"!= W1?,3: kXo IDATW˜<13 O?!֟_Yy1=19,W"߄wU#ry.5P"|sE"1@TtBE$"@"DCAeBA`e#djFo#EdY%S)TQ",\AB[ӢN :lК8C80{kRra_?¾$ߠ8MRh :]6ƭcm>' ۠ P[;S[Mk2J ]NqǿmGFqrw =.r$,2߽ϩx?Q;ơ$[((=IaK' ke?|5=B>J ^3kxwl70 l43/޿fx[ᄜ<3?J(bD32i̓2xR˼IrFhB~>weJ=a7z!I*s~o; ,+=k-ivI V:σ皘-^͡u?-2v{- f4U{Ilbmq&&&t:t:677iZLNNo߾]s]l6KE(ضMT5qH4ׯSVd2̐f8y$\~MdYfddgyv.-(>t{s166( K/a&W\Z Eatt'|4y7ѣܹsgw};\Tw:#쯮D[E^G4I&eYaH.ߑqomm؟?llz75^_h3:PAlo3Xx@)cnE]&^Ts})N 1ƬEzO7.jfȬB5‡w;RC,ϲ51G̟[x4Q&7;IUC˦=9W#Š]cJ|YS/t !!uH Ј(4+.N(C]]q1nMgģDx~ocq|$zU$+Tr4 { /:duwa0F(m=7HhPcs8zmk2k2N ZIYȸ"J# "ۇQ^´C̭M5f*&l:)L<*{L&DȢA+H]X{&cvt)Zm+VPЋ:uD 'B#](Q[c`6+5b p.NtlRm(ŧG,n$[!J6Ll#|x:[5F|#/2A+68 d:rv$&E Zmufsh{}g {d?O1a "!!O#[4@!:bčb dW" xQP!"HD1&>䣊2MԔ/S?aXBu /Ґ-1w(1{ *uXYQI}"t.`O, ^DׅPpDzoY@y4<,6a|/ f/#o ǿ[o[@"sro؀rHℬl,l07;G@DŽj9$d"EC!_{%k21-!?r_WnGld,rJ \ZߌH!'RR#Gdd@B7BR,3ӵ]Cd]nmSLQ Ț8* )]]BuQ$H,.4'qz d\lǰoIʜdkp/z$ol `A0I{<=|-nُqFmŘ~&7s'%n4㉉,NWb4Ef _}Me~e\{S2#ykhq)bGP6 ԶbĔtpNs2y"hZ -r ^or=D5=$4F~CScȉ/c+]c]Ob$6CY i`b_({98̶[*\?8"1#_|t{)c [Wq5=NɫiR"COa]CFxYՆ \>Mvt͇i|7 {YaM^罾8:.̧WI 8Ety6V 6V(^(!9s+{p/һN`xA>#92kO^rL"2SĢ#wWߚXc"e23|x32w-J'l6< Zh4d2E6Ia{{JB^GUHy677㻇m377wֻmۏ<~o_ԸWRBƪYY]Ay9[/֧Cb0]oD8ȇT\*2}AReq!z`[2݆%<}_7#H5QHocX_hx}0pC"Z=Qi ~ H$S$;(] צYbkEg ]mҊ_p ^NS >MYKiUt/,3VIO%8>XS$Z;߄Ws|a4!׾o0M0\Sl6X;zl G-|e օ2$Jnw7)=,aj4=ôKk0:$ݫ=ݷ]\ '3r ;+&~C&I=.*Qf+$^0yKDb fQn(rĺm-IZ$ BX*8]+PZFF#C'vE(A4mX Q.t =lQ^c^ꛛ 1RIPTl +}=u]a] `2w"H7]g2NӨIh=UH 5OkT*U KCjv@KrIX).l7 jG芄K vS!BBI#Ð?z?LZ eQBd"$0;AL@a=,ou+{ & 1AѲdjY%Z˒òh[&EX H I1 &sUWηp-vki-/˔q=;g芆`Q.., ﰈZ#"CG'ᠢaJAH2 ncO2iW^}'Ceሡ1z|$ΘKK~c(-E21!iE T|W4_'^ٌJQTڲ RmiUD5tk<0tG9#J{yc >=,M^Sw{6IM$l륻DۘuQ cV ,ξzUxƆUc4s'=}nrGkt}Fi~AFd ɍi$M,X0';2CaDNɦS.Ġ(ٝu#Kd>"O'_bs(~:c^S{Li{g<A%v{T\.zL1 !&v:EI9:WѽT,xo_}Jc iM'8#=N9KڵSÜ,FcCtu]04͍.,,T*~Q:;;a˖-<j)%/27X__X,200@2d:t۶7T7j[B֘fj/LTڰӊ7onEݯ"R@,4MX^^8?қA u-26Ma )A2d~Ap-`vg߿ŊM{0n (a6^:͟\9A\D*)t15392!Sy8qܮ vsz(vlbXXqA*tT ܭV1"=!*)NYcJiSM!u[5SS< pJ8My$ %{uށ^*InwZJO[H }uR~$AӴHVʚX%H qE̊XWėtz>Xʏޑ\_=.rLSR4JEoR"bך  Mr,/۴+gk4U}3* 3CRzԪh9D.PuDA]1RRӥ-'Pmj|)(~H3=Kh1 %͡ =T)hb,NI/ӟRullp~v~cKg < u( ^6ɇ!jI[%v%i~\P1Q됁j*# u[oH^}@tOOU臽GsȠ>q8wVwBϓԫxZAQ#]>˵;|wO/[TV$ղP BSTMTE>%$TeU"QiYD1(uIS PE M! }x`iU!P\`m\FR&/oZәEv$_pv4mCKϰXn`䃔McoLX\pE%uAKd~c$pWGe0]4]G,^ڼ-~ggپ I1[wvJ5^$|L;i}\$Ҙq\<ώw.OJ:}FGDGyB*9WC/cN!+,M-:2\l#Ÿy H !p)6lZǷnbii 7j[`WU~эt0 brrx8ɖìdaFP͗ YQإ01ш}E.wc 0crFH# L'ͯWQR:ld@Wu&5-^p B"#Lk G41ZXET-XH_h HkCJӁI'ڒ, IDATT|ik +{R3:~5cmi\5nXohKs"? |d0lYWWWUf<'iS fFF7RVdӐE%HTk l#wTשԫTuS &(N@v_a11e?{(\n~N qbNnsFs[ꄏ3`¦xGϞB| gs5zw{dm";-D$dM3z'ݺ/w'ΐ\==Y^#3kI=Ѽ͈3u!L\~Yig{O?J@60:3ksKcMo-'0ٖ^$uQg5Qdx7ފѾ`X7찺]ʼn՛ c0n0=|ϩ/ded_hg$s axIu8m&j6 A>DI ]B#sp]awMU (˾q N3raVtb>zr ly-Il%URN_#yw]ԻB Eu6:)jO{xqC+m\>Ftx;t9 .@Mꛞ#(gT%^A\G1ET%z yDtz QKő a{U#*Ir1333O^駟Fu,Uk1334 t]y7ļZxbbbjiP(0>>NOOpO%;1662+++bd֜)eYڵ v_u}6Fcx囯u.}qTKloxft;ylzɅ!]o Y[Yw$7N['ڦН!8TFulO7v2-At ]Mc8y8fZ<HED!J۳ZU~[x=de Gw}EEUՆ$ |J&5 ZVӸ.~(=ZߊL"CJ8qDEBNP/%RTG FY:3ptql gqg"TTQps6v ?{dxcS'G VX"Þ}J1{5 0ѴA`{ߚ  F" i:`!bh TȤҗjfF4LkA"lQ*9BE(PQ<O ѸFA)F̀7$,ܸmC#ߦ̚SMPev1e%Xn9@.?O୻:b"0A8)DS2D+5#dà_Я1viJW(zHEAUljdDubFS8h(Q=iԠ H"旨+6FU$fa`8E' IRwD_U0~I+mHU@ CbCD9-)VtA&,8C xbiAL(*@Hx;'(FwFG'@*D<(LςiI]:7O~ўT> 5@,և躤=J,ŏl:H%->yMɹY Ut40WWXk.W&Vȗ4]10D긞F6d{/Xd9 s0?#Q 3f2D1kLwS.ѿm&MxqE; ?2ƶ硾W^nzu6^NؽQτfƟ ^97s>cʉwx9&6ma!|s3\V:I=c tq&'iqeT8?bt=ś10'Nӱi[hv{ ^nn9˙Sp0R'D _$ooPu; \hOruJ|mn1ł7:k£\22s.* ꙽t8yig -b_ߍ>)lk|F|Ѕ13;nM?|ݝfwSmIm,*GTTm&thq{)l ukh0S%A#ՠlPt4W_FݽL#9Op*jn,ΣxkW%ueV,&:Zzm[Ѭw ;~.l`AI˛;1U~dB|*FB !a#Gܰp񸆦B4¦B`(J+duR23!># džA]X]X~ 2D@th<AAE4JS]BetdwF,"j$-#Xvu f5&HִD4M#"j7o$L266@}!&Ν^o[˲6j{ v Ν;GVCJv] ޽ vܨqm}n]]]R8ԡ[@jk.]ի|_IJ,0`Ń <FEQ( KN]E ln%n47!̒GuVb¸QMDveBmx+*مP#ܨ  U4:/oy:#=yBG_?:DN\?N#{p)Qh`t'Y!HA85|Lt|6Tܜmy;"LWfV14D.&M6%;K'//sz$r2X˒}`+ǎgo&Rm?$fP^n 4P#Q-XdnWl;"6(!F/ K HQi& Ym1u&Qࠋ,!"+aH4-W;rQ=H².YLH]Pt%N'½21i>mfk~'в&~AAH4ݸATc:wU$TVc-%()(`4h t+&ǒ0 M"s{Z @Gq(C<3@q""OÌ P"!5A@(*Ptf4<)dciBĈT#nH/5=dd"u&Jxu?,2DFRS5nNZ3a* #ָI`7CDi!Qa9v%&{>ճ:J怢#ZD`WWeai)h\o( d$RG47=??ArdgOAAJ(JF(*5/>3=~| B)PD.7~w5G!d*Ry>EK]M"Pevʬ$Tk>vԪɫ(B $H"bv&fE-Id`z~IVNYQ&M0͐H'0N/r vitM;d;UɎ4=N{.-rc§^\g 3W2ĉm<0[ɢYHd,u:*gB]졸-gFu1k'j$ %g)VrS{ ŎNlYBAw`_!t&3JZ sbk8m\Z(O5,kW.j+85n⠯jl:0y:"շ8du0>ssMvt\/0o ^=̶4Ϣ~`"͞v>ټz^TqΣ5/It M#B<†Mr`O51td@MY#ViC+8{$-4#Jj$p:,QKFd ̼ͪ"^a=~;6Gc!^e$XD. ' ^bSEǗ/*NOxӠ؂& UT d 15iԆ@7 |I&PMnወ " Mb2t²Bu]#?M -Ti "$aZKUH$* 'e 5͈1VG#h"Pa7EЬ}zCX+H`60 Ν;G\ްcj)_:t]vmOuܹիW)Bum1-؄`A|?pnUbtU>kZ-ƺ[ml1-V1h߷Vvg>[n%NF7Ե[it{{n|}\eiiid@rk|~n݌Sߥs7Q%33/~#o]!T5Jq8$TFBFFШ $.ӷgH TW&:"I'M"E VP7"~ t c ,BP&BhjD* 04a)Oo@9^M4# k3uO|ߠKSXOZ[g}_ ڻ?ӛ"6dA$P$9K,-MJ`jAP%͢βme0Cߧ>Wku2)Nӌ ] (5'ww;2q6cȜSol/q}„J#byӘ4h!FfK&DR:5 h]|AZD**aCb[A + &pG qKc6_v$"CMߠBQ5KJ\/ˍzn>l16ڔLUfy<7dv{F.X%#O?6}wķ<5qB\3mRxHf"SL~b=kSdn- s%RPavan(?_D pkJX_!1i֦/ESI/6ȩ#4oS]lg= %fkgx8Шq+0<5?j5r<ɑ%mzqX-;eB6ϙB?΁l;]|E]ͨd }=3?י[pߠÊt"E'Ƽ74pvjױFD1,|HiаGj/Q 3W-xm.IΏPr!vQoͰd\h+-rELiV=t6Sa} {,ײmQk𛕀[E 4`.FuXaмnDTEe0 儎UpyͤO:똁¢Y[ T.yA}$!Iz4RqTz4&oVc@tf죘A>a⨇HI(Mmu.xiD(I|ah(~BxsIqj.jY ԘTu&x﯃m_)%R .0;;K*BQLD4z{{QRidYT*RJ"Ba !6rHNb[`xUn1-Ӱ[wg|$[ t>T[j"gkZ`u}K;-P l6r lj'I6mڄiP0Mvu+WlxU _8sh7PmDY~*avas80j2qǠn O- j![{ؑŀLx9诱pΜ@cO[)#&)lM~eoUTWDyMe x> IGGU~ċB*} DЈ;}]>޶H{Ygzk5 ԻO:!=wO6Rl{0rF0mz0E qΧ_?hp*30ɷKuHt`gHH-N?FN!RJرeXVgQ^v|\cveΜMm4رQZBϕ?aq=Ӯ l\ٌHMdTPqF[K5,chFJטB"+=TuI̻wXo9:f,FuvkTTWj>OV &!Q@L}%$dة4wJ*bonɠ[ ⹀7OÌR}|eltOD+Y IDATp&*ӮA.g!HE1+*&M.NGh my <%:7RjT!q(vSSP j!f M(q/R0W(JdBj!M'MZĚk̬4 ';Z/OOxHR &&IGuo .] HibM:󈍈 uP9 T|F>};mK[)Vx&8u qIJl"!uO#aŒ , ^{|_ssaߗ(HK|A\}uwW}NO'05Ĉ@MJkiejio^ڎle{)Ң(^  f0뮼@fEtDU˗Uv}Ͼn&QDL,5h6TuX"jk\}p:~C e"Ő=:|+Ҍ-"!b 8DC}*"hEbug_PiIX`,>Y!5r䥐=>")i゚{/07I]f <ޜ`fvy('ӻyضנTQjG/m~ebsM{\==/WjMgfK "6ZJ+ ;w2V=.փw2 \>Mjnla{~L3`*x+$cW?:*~їºtıuhF=du:J\ңST7 .ҵkɆDžr?0JcTw,u?I> g}Yyn-WngqZ c|(CcÛp3u6;M:O?= 5y]1% &H(ZI-|$QY< +$զjM%$1IcJT[-*NUJNLZaKZu:-V""2nd'ORrvPDdnT"MDތsOPT1ܠ22aU)T! `PWmUD%_,;򀟰mَ64z~U ۠}Y^^%/^ 62v]_kٵ浠Zf[綼|>kYvmnfq昙uzV2~?QD$EAķ|:{vqO0$tt;i:lc舎ܳ![3J;d7R4&\l١LXoԨ%ud3҆Q*( V'֜IScd@S6ɋ,QJZ 0.-]CgOYd*M?LvJ^t&xOxu1 QHlUa>4JXyRe4&^&ֆf5XKU$= n9KUeL}pUP6û?GyE}&𲢓wm~t ]6% ]OoH|Qy &uw$r<Ɔ=G`|E6Z$17$n2⌤ƗwUN+i4ofԫ:,’ʹ:5\~t] lhݡ msoEEnmgywXmf|-m۶\zl[qzv\ksZC 0$u 7fmm0^h|ﵹ-ގ ѵz(p 3[VZ5iFݤC \K*8Zag2)[˚j@Q[1XVHZЕ<$(kn ? i .y%iSG"1ZA dL," ql*PIH $!Q T#uU)HM @WU-F5H$21 Vj$uPHj>!W{ VDAA1Ј W>>Rƫm !1Hj*DR4r77HXO<ёy@ w濊6XT-z7ٞlYv~={C8O0M~]=';U &ӃTGrQg6 SgL (6* ùW ӣ:\OePCKԳ=%6ٷܙN! |~dB>kn7(|N,\.v-zrFoOvF]TwOp~nhgl{lvS8uJ:@k={}o}bmOꓒ{̧7=0<=6h=ћi>#/QMnb3F/˶uxvmK*뜞inq{kޫt$NQ*P<6 HhI\UKI!A4-H`, X+~Z̲aJZxRFL97#0;cS(*ln ;{rxO1ҹbHG'߉gU%KF[J@?JClLPCF*֠Gd$lj/WQ9l$P"vdGҬeo1;EÅ*JCt|xC:1DgR2a|j y87bvP!y720:]%v Oҫ '1[y(B =ӊ,ǕaT+ ^ÐziaXu]ڮuV^ ۹v9sFQy̵vWƶp0k-%^ H;;̻ FqZ6 .b=khK{Q`-n6xno9۷q" d31^yp$o&iֳҡQ要9Z$+^,֛3sH0~I2tqTW;#Zrsotn5V=r}yyo{KeZ RA*/l?JOW[|9ўPpW4.a@XUб(52U*t4jM'RiԼ &s<ߟ⏾n6KsYf1˦ĩh#-Gi.> U Em3t(bkM.l4hi-lz,oз9ԛclspRIBFIʊlVIu& 젲xg9]PZ\$?υibgŹ8GϮFFe+-ο}\ZaؾUй1飛 V3$-iTY/w&Y8=E IّdQDC565Js2kt=)SҺ܅3r6P;-٤kr6~n_fP`J$ ,wo{7ŵVV Gxvt3Ȳ< 'X/<Ja( 3~2{uRar0b YyA>e0,7Q+oMǷvsaI"ܪW򄱑NC_y-#9֕yp f}n+%x@m 6ɲű1jKF:$JKЛG]PAUt&D͐32x6PġfY(u߭0XZi% 31aAN"Ae|~ç~#"]U.em`&)KHT -{;R*:K &p<]N/9JLY$ibՕ@ X:'1€L.+ԩ1G_xƉg.>Z(rd,9_A?i]q =wcXWOGxh&4$il(|{COO d?Msa~xAMO\H $*+ldtޚF+Wn_Db%/UCk%@u-ȮKno_ ۲l36}q0j;%5Zksp+B"q[}et<ns{lֲkyB-+P.oE"J]q*իLM gpb,ބNDBTdD(5oYt{LJ?/R>Df(hJc(if#Gγ }o]v .cmv%g&7ݠ0l^eT+pXck< bucpړ8CUzl|7^ڋizy6N.3\tX 2#R~HZ/$)C0T]^c䲩`1Y% YmHu;>Qc-F-bդl8y̹E771iId u B85[f{+sg=96([dQ4x44#BUe! .]•:ir8GSЇ1K*50*A,R1tJQCRN GUVz$5D!A> (E dX#6 T+Jаp& YBu _?atG݄O[ITv,pUH8d`,Qdb@+(8l!!Ҙ[]\uS$ U"]ka "cHXK "@IA( IDAT#bP ,P@#L8F*9.1;iJXRı $*@"Ԑ8(p57[:Zl@TbjU8c "5E) R4"a+:uE6D #E <EDc.k\Ye+"VQUhJF3H|WfʟiRudmw{#CޯHn*}N9q,鐞* e*KqtB]}}ΟCѧpNuQ!+_>&?JFwh<벟qΏO=3q!7Os$3Jr3<9h֧7rweMC\ZGq?^e%\:KӶjzLDv =,c:VK " E٠O$H!Uѥ$0kkK-9c?ht-eQ I7L#YIrgG m@D 6D>aZ]]_²3q#ѿl%TX[OPp=G_)s3#_,W>FrWmPd줣L&sbJ%T*ʺ,6압[e֎e%fd2q5MJ-6}mu{a-6'{Xnǁ>s@6S6wJXnN*<ȃP3jL3[޷e6$͗Dbo<0U4ԥ3}$h=bp+)Kw&n$TȍdzAg yts}IE#eџ_%8?¥;Oc(c~Iz咛*#\DmB]>Czܽ3{rq&o']6m 3&f=r?Cͩ|$ u:Aۖ69]fQJ< d]b^ĕr?σ$ԛ-&uW6&ݏHe7`(7Pw%I:no|{lr}&$9!A'Ȗ4u85*Y YS bYM6}:J4݄Ii&vJ4뒖M6>o3%43@1'S:=^M4ɮ}Nt,;!ZTtw`0chI$~U[z@~IG0U5ݤ3rk(!C=}7\Vl*F,P:irE`&/_A(^Ep4Bt$qR3q#(QDnӴ*E+"&^3$2Z0 IdQE/cWË!r U7_L/:yI!BW e$-I(hQLJ3© $RU TT4U'R1 Q(ϕT\aI$PR\И/Z(CU!bA2&h@q,PH-@:XX":tBDl@:H* ncӐ>"%VXYiE%"D6KZI(Dq*PbX(Ą""M!0/F JEh(&D !TAL*H[Lc}0FQ}̆ j!o5US7P翃p->Uk+)B}m\ܶR4d3 /zQg&z~Ȑ׍Kt>p1si/@^sؾ">Y|̳ gpeyo\pT"Ul">gүl` KBL2:;*]w_AWcWx 6)<67P/`N {}\{x#؋9>Xd x}\GzA QمXП/g71Vwl">Pԋ6B:w87i1h7RZ?HdjB>e|f[9KEˏ~a3&>خ n:;^yWnչ17BoiguĞ:Dtk%$Z+D*0`Y' z$_ea}d7|TM` 7$n L мRpkibX81GOc S+9Е@.I%MJYe.Y ئ6bթ>)xAfLUeXm>^LprI^DNE 9~{g䐙YRc=s<o5ԉGp -oG:x¶Q!)qaLSd-JG6qƒbEj~ Έh ͍kSo _Wеb1 6VCCC<j#qL&<^x ޖ=H-W^!s `!*e( z#/1jsxsvy=,z]*\H84 J >WLT`-DttZYA$@e$vV Y]F=8 nF3,Qg?̃:0i:1fh#ǵ Z7 *șl1\a]:fnrlh; 8'GwJhjYoNR 꾎*I}gӟa'A%-ۡ0fpg~WɶnʘΏ4xe͸XuSءf&I;MtEv&\ѪEJrG,mQLԯQM²MMMa>;IbdBEan@#$eUvE+J_/U&op4ayX!HJ-3]f=,i:'f(7ɬ#E$tD:!ce &:sUY>#M;/\Jow7+:$ {vvc|~tY!(ңŹr- Iw:Dʐ1vL&CaEBВZuBˋMd+&HzD&@h%&ḸZ{đDDREb2[->Kg2_;GF_Xi'򿍦%%XѨB*ĊDtPST5qCt5$X\tR@L|c5ǷC*yjn`,!P_ѐQ)REUB"E'V!B0UfXPQR JS B{zl0d HDA#R $} ?( AHT4b5DMSEU&z#5"LP$BI@I"A**(e 'S} )xH I+➽5}7g)u 83*"'l*rrv*Ǯ!.4ԋ,}L?3 sqYG:s'ڄ;?[a'Nރ0qs:x2V~)z\>;s]cN/`V߽MqEE& V."ln=HTcS]bÃw d̜q?MA>OvlOXW@u 6\Ruè;, rqH2Fu֛]) :!ݼg|3/Vi [HT~i&/7*^ƛdSTrGS;ߋewvwfb%=t&[g QWPCz$W9u{&dC۰|6._ai=3OXm;dd ?_d⻩p ~T9{c8HHPQlu Z#yr4-,ek ֖sjmk ڟ'>AWW_phPٷoO=RJos[-Ufٻw/֭c߾}i/u]8q*{n?y\Wv{{Vf{vI,)5jԭղ$K-a3cO831=qČpV/jl(-M@ĎB =߾ЅB#{~eF{=/_9ߧrQ׿uQU#G/ʛo=*ne!moThT[W%&$-Sn(`9IQIZj@ DLxJsCLo2bN-eG~D>hKm ZkqOꬬB&Oz$D2Rh={wVEĆ/\-g8nc|q=٦1jxmN!$;"jFC I$Ո2I|'IJn#v2"!BvCz]2["5=Y!d*/Jtk_X,(Hw@"}՝( ՙ2/,n02ƢEb]|P2oE0mNT=E[a,q.Gŏ*9|Vz`{g%_m2U'5K\\-FʗQ6響JsB y%5z|oprђԦFRj0UZ^A2h5:iu?" 2ea'ȸ*jƤZcٮ@_/JZDDnqtzn! [ttfbs\txϐvG<2[$)2 IB[azy~3Y\Ǭk!Z-XENÛoLs/K{Y4A3]'7b:;:5\B6Hj)KNHۢl@5!mJDFֱ,2Q-Q0WxLݪn(,B5lW@m]w]\QaXQ :HI ǦVosBo r"ъ|JQ Ș9ԾӖ AXh>FEf%}I)wIBEA6"J0d]'l52@ ( & "m`*&7_s+>k%BZ#HȂEzDJDQDB{ O$8HUIuKB B!Fb41&Y%1I"'PiUY^]G&V(RHfPb WyxS IDAT &YI U;p=;KLrI;Έa$ iDAmDq"`1fb7}:y`B'^!qn]geL@H&QHi1RDQY[i7Q#G v=EuIng_ҝe2O"mΠ-9şBC}lv]`Ϗ1k ^F`#5s_;E䷓LMa(:ykD95vL>ؓ6c#j:V$7Ƣ?B5d cBghVؤvPtK i2HA\6I#Ȳ?U+tp#skĪHКYtEg]8T8]$T>bҢ}q7Ĵζes0 1Rmsuݵ %CmPO4,}t6]f^AZZBZu4FkiUf]*x6_)Vb̃Rj\ 4|ЀeQ@5N}i?H%'ddM9/*4A]eAoSfgH[ϢUlRFG,Ӓ/HsRXj<8/sZv-V+ V᫿lքnO]w``1* ׯ_^c&ʫþ}xOlEAUU\׽gUU.Du4McttOONNr-&:uc8 \vzuP`׮]ٳt: 4/^dnnRę3g( <Or5&''Y^^frr!n߾$$i=v>Lbۻt:}m==oE9GRѾ=iDngy}hǒ|jά0y ã=GEIΨ%%L%wi"Pe%TxFz1\m3 M(.*7U5l6@Ol[cn7t/^"<֎[ULĦcӿm+H$LMNT]@jyhAu 49oRe@2\Joe(@tF\ kn>N1H 81FBl #m^$CXFZ2ds3ZicxBhv*~Z EyGIo//H6e2y @g:S.Ps 9FcJ0oHh^Jh#׷ɪͬ`&fS2~=i fl.xiÂm˜ϲ܆ lR޻}Nf[}nKzdޝ=DFaH6hy! { +2YIҪYF. )󈭈梏h$* %4Ʀת$fuŐeR' H%Е' ,"^$,ӝ̳G<^gH"i *j1r+J"1T#$FpED1F4HjDR?Ftw\bED_Z,6U raMq"zzx8.vHΔp"7c]K .`}4˧?3 $g.4H;;t_F::t2rbLAÖkt$SL,"/=wyz-$iľ,DHihR(;!w_m_!DвQ$]ß%v8S9U;"џo]RkOmaDY9OGJ7^F EH*rRh`*!;l_Kd' +` 4B! uɆH qBAP?YVΜOV[˗`vjoK6M*Q-us]gK+3asthr-:eRL9;O$h >f-"&i7hbgc`r8NJ$Ac/E:b]A{{%B|\ӥ*$]T_@%6h/{y ,'qCO(Ԗ4zBzʭ9`l)o _MQi6-4-졈֔I}*M0Rat7H5ؽ[;LʭYS7r*:Jp5}S,G"I\=9Qrne+|{q6t|p)I Y#:ZF:X*H$ѨG}JJ,! *<ҪU厠I<ފL=ͩ޾i(P(TiRHgL[ܕc|}n.1ܮ1*,Yr`@lpVZ$$KEK6ݢd D>6!B#xT\pЎ0eˍ; |-RXCRd %"b6T@bC$#bG3c"-K%-Vi*DԐ4mY_A(\[hQo7Ҙ:0O2mk0[H45D5Wi0V ݾحewnUd2۷nN:ŕ+WeT*i,,,J8vfS8x 'Oݹ5Mŋ$ DQdmmr ;3Kl ړf*Hv'ܐXܸI b@0ս@e-ӧ+PQ%rXlDi‹2#I[5NeghefrW&;$NK_&U[!F-'1/'/?d9}pCE|!B4;?Sɾt}m +qq+UZN Lvq + 21NI*!!!,@J@r&h|,o3@ QB0/Rݞ&;ngs.t8D7cb9+Mz鴕>bw%k=4%u >F4~2tMcVyJYgs9I)zξJ ej[,Uxl-0Ef^`s[?$ԅW`p"{,:#0Of#QGZp vrYQdǩ_XZ˺M#ߌq+ {v UP%X6byDnĜjDʑ9;xks:@'^ktoܭT nnr`r/Iijikv.SJ-"] 3ŠMI-8%6+OW6!i x ?vJIJ,at*fuX%a.b 0E:I.IR|š.I)O,t̢ȃX2R5I2R*f݈RL4^" qIKeA> eeR,4Kn&Dj L!bѬʨWky&q'jTšh=A.+-]LI;T)|C$m2otW i>5At%2|+|V$[S[- @4oΑ#G,ӧOh4$a4 pQv%<^z)N8A&׃\h6[\v/| 8=V;Ja׮]# {bN:::صkgϞe}}zbjj EQ\.Sոr e144DX矧hp9ZT ˲hZZ-yxwj\t'OOcYֽj=>J}=eO.^wd+>m ;)#.l|cyqƙdo~9 T~qC8OΓ%24*nq2qݦexEP=}߽2kJSd1 w}7i?drDhS~[瑹q^2WНy%zc^c?+>;J$SϗKBj~{̇jjkk.*-oXɷXh|7^=N ]o_5c7eri~$)kxX1Y6mK ,l;@+Q!n+d:-'S=Q+bRxm} 2]n'TWIl; ֤ f}n}7hс3hJ{${&sT"7wPtB-T3:M[!e'>u_vj)ިTiCBBڎВBbONAVc{rVO zk3-4J !!&L K\e̺-?֤qQA\C&ͷFOSkӑ rh vrBg~k6f!iz@`clgU±@$fd ̘CoFaՒIVٱQ0qb)@َ"T):4Z2ȣytQ UJ{.i=MS@ӺaIJvt=2rLX$A.S=4*Vhi$|vWTvI,E%PUYlZ~ pVFz5Lݻw3<<;aF2dyyd2Y^^fzzTY,ˢEQ7v"N>z"t"'εid2xꩧ0 9A$d2DQE",y׮]#"8zS/+ 裏rq&&&`uu?2<<)JZ{*(yznTUJV%Cpc4@wqzLgdv^ff=x_pD}%6Ɏ β_bfo.OK]*c?d&DuOMxˬ1#p ׆-G+Y}7GX3lyȤ Xie.Nܕ/̳vꤎ6p=Elm~Csb㝬}P0.BPbf;Ђͷ|qWf;j75NćN[\?;^ZcM% عT7$kyz0HSM+1+)$'K, ܜ941o^a2!`.Ƭũv;j%@%g!6q@cx0`$¦YGc:G8==5m[l(2BcVs=ۏQNSɴa5D՘PuV4יk.{RtV$$@ <ʄLowpSdMRimeXZn+_^ų-EѓhMC*$%Lòi zW`3 cb[|zI H RK"||!V$]ZoO3 3xT'B( " 2aa7-̌di:~Pr@cXP% n2&vTGu\QD]H'T=b5O &ac2N";(E2LbP\ɱ# IDATGLLC;؁H JpǦ  %Ξn~0x"W%c$3 m~^i?qv*0Fb(CDB- K;r.E;svXD9q3o|3f\ &iǟ"ݷܚ€B=c 1/Ɵ(* 7.|k2\̣B>s?+?!f̩s#WҕV'cE4,dNHnuAN!B EB"#cXX!&Y ``Rj7cm7B &ZauaqX?}z nW/mtYf#hѠٹi8z`|Ѿ2Y4tXw>Τ&OϓSdKFʴ4qnaK{-Q#ƺUWVX:v6GP50?`T&m}1 X#8Ϯ$G#O*3m ENչOn4ȳ<Wq3+<1e7JM:^0{Oq5#3LHBAinIΞRF REN1G1E\3Ka>bQM 3~%+29ͳ3q=?D"nņ'Z E,+F TP vʒ@Zmq-`CW%C&ވ…uF)p}֕&`!l V[:=ȁI(T[B`6l4cn|I23nѥ- 6oe,c(YѫNQh$$5i 8LV!W3*FdݠQpd)#ȚЭ8D.:a2j2 YPa`18DA׉vb8]]q1U[%tp4DCBAE@v{fEMCI mPod35d~~Y\Uޚ$e*nM^iUUeppC8Ν\.!}}}X맞zL&op')bzz Ðt:́8|0?0V!,+++T*{߾Ν;DKa,..r)Μ9CBQ0 jJ\ftt۷cmܸqt:M?SSSl۶z{{1M8yy뭷8q{βJ`~~ +4k̪P4kt ۱ԒI%gVUh"F;1Y>lhC+ #f$[j6n (ByY3o^łlbzʛ7򚓑uIٷo|Q'{iljD"d2gI+>s3Gz_#I/\l F<=E̥-.h.rj`.+]#StHNS G#xqcm )!z,CܜSYѱ x i%JǚYzw߽s=uʾgݞyַfBri_H5u;UEK ܼ?'%hrH/ćI{j>ȧˬ}?:],LGVէxd[=bws $׉>OYjȜ\fgRqcn/kL_`(b.ǂ0w[O i9="GX,+8o,UiB9uw!`14,PG}T]lXykl,VUhJzRm0D} VmdQZ㽱˔u+KG,Mdf*n@StSS*PDSU"<3>P3 EJK{㊘e6ۉixD&qsboH_g˞9b2nyp4~MŴ,>8yJdDσ<}NYpIgD^z1R.3Ǧ@v{B>Ο(b8J4({tPTALt3 dL[@p,;s4XECҰd/"u,+dQ,EFİEKIiˊ2xDlaCe+!h,`^WGRCHƑè, n#Xaʞؾ(%h*K<[_%㍟k}K=$a x\GsWk>3g~Ap!#u{"I ] @1LDʓ8,M+hIuvѱ(J[KÔe>:>AQ]{mohmqJ&z}A(g`$q߃l^U5_mczI7h8 a`hk{E]\+^&i u6{~leK?9!GiOs l2l|Hd',>ϓ5z<"qRKI>M3;hѝlgaO}8u9gђ>ō;< 1tǟ٢Z8ΙBpHbZ+2u`Y i;"ҜL3s;Ҵm}ped˃d|E 2gh|˽_M҃' j}FOJSwwdM`<"ܿcOOrsQ&k.ww! mOȕ;\bW8 TYѮ=lPKUBO|(3+,<͕v0.U\p&c.M.R~:% &kBq=Xp%ZM+ KidDA(* Yy?[Q"x?>Iڂj'֡#5UTKGF#ZE\Pw3 x\BVZ Y 05A RE[R4OՊEJ #LM }l 2)ü(h#F\e=Y2llt`{UfF(p _y_$~ /hj`,8~9u333XE8&8]]]l۶ׯs{`l&+Ͳ'PUǃP(Pu/r!o |>~a9¥K^x 8y$BbHP`iis!=000@P\.oA$ѣLMMqE"cccNF{Y)qwG9z|Ǵ2!Ȟmŗ},F3_9$xXK_er=z'ڏ:4~V*zCD piKz;o]e3u`$Wؒt9)h}ame ty~xo~N[_X/% w/2aG÷9!kVShNb;k:wb<_I~08Vs۰"'y \&^&S$  s&M v/N]xwyn=An M’Ol:tt1㎽/AɍH B0xQa&b^V֘.9@=I0D}A\9W0t Uq, ESl|u ]QM OmTS zV԰JW\KA4.pHD%䪈 *h CsQPV_)߻8+AFv&Ҕz^^})L_G~ס\nd&ȴrr> uJFR 0:)E(1-DTdp@mI!"`VKSQ$bc[c'ڰHy 7-~}e؊Qڬ( .^ťjoË)W,&V`Y_CCƖMQ%Ρ˙P{\v6hi_d|iCw}w#O<"=Q`Hìz$?>M8 P]P#z8  ex][tRhq]!`"2sg% u!zE 2ٲU u;'\^s$Oz䓌lɭ[oU,T!^F@Z(e\ۃcp߸H rPDAQ,[mpzOpqk}UJ)B?+ĵz (q~Hp*ȳǙL6 ;lMЪ)XX.cX* %5J0Xqgwtˇ]#=d"kнBV7m&?I G0>ȶ+,=lp"a!$[zHrwjZRȹu"%]*95v5bETX 9)P0suʵ3N!$ HbjOtƄGLR-XT|Q"IiINXmV%X́X,YB$E/k9/q3>*R >"d=e-!7-R)'w/#63m* 6z8WMޜA<44Ğ={( \vl6$Iǩ޽'O1MmA~j۷os5I$~fffNݧz>rL&|f/ƫݻw.ݙLl6˥Kغu+G!L/+9x Ǐ׷\(lٲoV뺎iA cMfWyӸk{W7U\MIGs4ù-[ tHq˗f8%/o:fy%KOk,TL)$$qpmAyo5 ,PXfEiژjS,\c .b8Egc^.1Cy>]5¹;dzub7){|dӿ`>QC7 'a2wy 6$qzHb>Jga,n-gAy?S!/0}+Npgi*mLtXg ߻ tiNw+fypwAUxh}{^n&Q| wF næ+fS]8N#Db2j8DITJf2vEr-A$æۋs<5FCF nђ(S-( =Լ: Ϧ0ZBBR$q/͎V#Oy&qc҃#$NƜU\AM@+yqdݱP\Cu߇'{ģXUEo+#orZr:F=C&3Nn!s&WnO>?%ҷ'XAS$&*-f5 :[!"!" 6m  BGFATK]0Qlt,IٱJU`(Duװ߽o7__,ˎѐP:.jа-xM5qME1+ :,:". DY4@x59߷N^L^8C=sC=jf; ~Df{K_ g~ >mK7͙oOT`(Q3] 2 SXsq@=wSI$CêVuvpp Bdq!ȅv>gh.05,fÖqqe0-u._Wػc+Ŀw0 n89/A|`WI"5Dkn, `l `  AT$\APDK@~bbw'P~kK&:\&n{tK*%x 8rbN/4 #O_yzz-DJ0j^vm, @G3OzD7|lƞ k&}5e·V8+GXEAͯ}G;12Qo;(S_AJa(:܌01drL,e84ObѢE$`Fpo.?eD`ShrΤm|;}NF;Jt OuP0^[ǰc)EMGÌĻYbmk\mp54OEy"3ư%'#,&&vRZ#gX~C(g 7(O)緍#p)쬀ש9d5F̩Z$ [6_jΡмN\sl\!ż\F[E!X[mx5yX xFB@i%76Dlq5 2! ` טeu0j1t>sO"ti4O>$T*{[.ݓM@CPȏN0{5 /"GYBMx9jTQve 4 6_T4U $Z}ke$Fԃ`uj8şڄCI+T!b,++~ \/'vc=鍳"8C m IDATR e0~ =HhX] uvV]-Ӛ<ğ"e6ٍm ,)0-@UlA)UJedAmQE.+~dWe]UW.. uDkG7j>}ׅ _/ oE~>vt % B}:|G 0Om>l'? ~pL3Нۅm{=ʰVU(O)| 6x*Xt$ SDh޿yAH͓Ak|h ComC?y>tN+/> PH K__K~6Xv\Av14vn:gܹʾ8v6U[-.]W`}]|Cn6^Yt VY*B5xۯt Ax;U(=1پd ˼q)1)ں{箩#7{cO6gO Q %"1e[бhM *,# 8 H,Hخ$# Vi_s0 .A&3x/Xks|+QLHa~e)[dM|pz}gv05|6 ~W#L z31%ځFڄ;Kc% -(Nh]R )]gTW. "Q"xgUJc=}2n&ݬxpo4V,~yw_U޻&]?TAvm ffs`H#)m1tW͏a)2; x%kQ:!>hDꍝD*Muz*~/ƘR+H\00xa * l˻Xl4| $|3 ]"r>I͊*ȑJE5˸wx^l!A ȮBSdWi[T<~%'"vTFS;/ayT#tY8aRT 1Ӑm&@cN CR!,RS(5X0g1L"U)y *{"SiU 0H?s7MӼןmS~6MP(D4N:E6u]ZZZQo۶&vA `zz^rkk+~EQ8|0/RVuRtX[[öm!Nm6(Yd2^ʹsxꩧزe :ַj8pp8L__t}syΞ=˗emmRt5͛Ȳ́X^^ԩSJؽ{7G_^s:::رc$z=@(UU7Y֛ 3ds]}U]m(\?SG潬竄#CXhOd % zhf^1]H=L2B`vsQ\ΰf33!.:iSs?K[d˔<YtJ_D%/rxӏLRh=̤d%M-E^$d3l#te'$#&7d**nBXC7K]&V e҂w+Y_{Yr-RLqɮɲ)2syc#ybƁH~Wd}4a*%;<4k~e =6^}Ì汎ź;ai( @hhĎtcu].X6(ēyMnA,"9 Nh 3co nqpiчwawb]fͪ.5މLu qw++2nT4U;@'k*0d_+6=!z'ZvOGKb?`VeMHDDà!*?Z9G)BUx ̻R.~A@8[*%ax@m,$T r<ˡdN8ɾm2P]ڀc /0bw B: ;@Klo­i[TrWU݄44L_po{_AiWAa~U@* L;^s90?9IW!݀7>&7i?/!_DП&x <^?x* Ʊ  f@&珰*|ahK ot^> gG r ©Е Ge[?㟂KG\|x''3Mm}v0<ůED[q%*b.*a .""">ŴmlWvl$D$A²mP! cAvݙ6^yACKHG 9ӳRE)l_t 4عQ ŬB~NH+3{}Et`qp2NwWϟHW{n+Iew/{x晏ಎ4pǃn]W/ ؖײQpEy3?-H†ڸ8آ8,]J%cTF3x{Hop_.0lb7X.!~ZeILHϓo]f!sMJB)29am1iEgɿd G4ܢ7y+J3Xl'ӻHEօB,{,Ӷ^BuV3w+ܕ ]v<ءx2&FǛ-d ]u)a7ZDV92GJ(08&$ﮒ ;tDl "FHtTXjiXy6j3#j( c#Ѫj_a:3"rϣD/ҹPw&Ȏ)C.@x:kwyyԊMzpmsM/ο& \X/KǓ]h 61nQc%R4)#yAU]񒟫Iu%]G e -LӬFVY$[dyqU\c>wF-F‰!i(@?΄rL]I: by_M^eʎ  1@])Q[,.vI`TYC^AɣQ Ma*V8 !jp&Ĝ?HM&j;nz"KΓdc(/z{CTضr`©_w]M~~M$^&D' ܹs^skk+DT*uoԁؿ? |!ѿS9/mVTd2޽{9z(H{;W_}JroFikk#r9|K @8Їx駩댎r5Ξ= i211A__###ky};X|SxU[`ߐf$Q3ǁ`? L|os.G, |1*i?TDS7>^{52z103I1\fMP+/K(ROge)H;&00F~Y&R):w3נv424=ިOrX-!I!+px 85?JyPc8鿀W_㟇> ⻫/4 Cmpnz[߅}`%/vc{`6;­9PU9  ]0˅muxxm0Al#ů ƔU$EF!(@/#lK 9 6HHDqގb56,QTʃuJyշ@Se;sC6 5c `z3[{4c9%a*՘qETr+N Dk-pjl3Xg.s5c׸GKYZ_0wRmqktṮr)s!?锏L^&\`x$Py]U=8wNFS_e^'Jʑ B Y|i,VƭQVl3 5k8"y nFI"p^”!LǨr NM)i=`oͳ>f 5Z|:Oaߤ-h7r~h SЃAwίa#^l.Ҵ{ݵNRZ؝)P57ݏU2΅4 62ILݒ@uq/1lL&u; cyk.S[IDCS'^*|6FIx]TJJ5X>@"AM>'#FN@PeDbNBWK%.nŘrՍ'D{g~E¢߯9CʢbRZ;*hQ#U&-VzU`1a1z]ס$pxG/@!rRoF9z|9Dޖdp͢6_97ؘzfoo}XM|U\ν &PT#FIH疰d#%r3BHGWEjܕ退)]d,9 ِBZ!QP U kD4sU#""HX"_׎2E(M 6"tӋHu0,ȏj -&IZlあK08 /˕2O8Wq ?Fxj:ikoIĻwtξW4 xH:΃}s.AUG04$Om|3Mؼ2QtT]D*,H:JId-/X6CDY/T@/+! iaMDE 훸!;y/ŷIAl=LO&kûo® p3xZɢSo5=>G{f%9mѰ$N&H/+z2aI2|Pܼ~:rt_S=i"M?v'>k-K1g].ųN`H`&a K·k͟(,K{s<CiΞ VqzΏݠ|{!G;nJFl֩]8+< paPݝk۩ jLM^ ;fy,=T g8h]&Q.cR>5b͡#LM7R2m4ܞcaR>Otp.rVcg!0E3u;uZr0PsK.̕c֪R^~PLTwQbŞ * }}3rHZE'J*Ow!>Grlgm0yRSz}iqCkqZn^÷tQc83Px᧷YL?%ƚ4!6"#.G9~iZ6!Qq+/-vHߒޚj qbd;'44C5Y샽M9L&Ӗd2m1]]]:t^~m) NSSNEQZ$Hp}E2ӒH$[VV@ DH$A8{,ǎT*mAFGGy B[n .\۷I]]f.]D,X,f1TWW TTTp&&&8y$Li▫&l4inn!f27.6 1[ͱecv8wN_qxmݻ ~QGpZ`ǞUj|^ϽD2='CgѽT?B;@5.](5o>wq|Dm'Ꮹ\}Uy4}6&;kIC/1{.Ɩ{jZRD{'y?vV{#2=u5VP382_KĒT*aT$}2YyWMKzʖiL:6ަ8µRϱ3;Xc};?l.ܲ:ofP?MI?()c~{o~5(|VIp_a?@( -u'!dXsUTUU׮ߠ &oHsdY 9u %Xd5!hC2F#+F̶ v1%NV]vԜkw%ָeU+;Md*/>*'0T}Hq;/TSx h"]?mWsR L5Xuk%&5-8יu*uk+1;n?cip"*N;Xkç1<D%5Տ x]0 rbc|Hݝӵȋ2m.;-8I0{~m 4=H5Up+o֡)k;@B3ƭQ}8Y%g'B4PiO;a M/'2{h;Lu$ !o=_G> ppN߀2kR &kFztc*ChT?jx`Bxg HfY0%,y6(j$$E4  H"肀.ʸ 6nI))P*5:)WavZq $N{}?Dž0ƚ]2#D̢Fv5T]IhnשL2* *p}"_oxKAtnhw~R#mj;d (i W6['i+Pb7y%Y-PA _oB;SqGeg-INeD9ŶRx\.aM "ds77A$IȲLMM ;w$p5ǷrijjaXX^^&q!***d2ٳ/K/D@hKK 8N̵6r룧ŮEv;---,,,[o@P>Y$ b6$ї/_vsoΕ+W$I\x9mfJvh7nIkk+--->|y(BEQPeyL},YMy}L?G <>q /yE>奲ӊxeNy6k"i=~+sQ\rEiUZbOQ0_Y"ݼLU.GѮ&Gp4uu&?{ku Ho@89Իu(yq[r5b%7i>rc[;+8cgaI JrC&D&%A?@/|NWIt3H"HO[p~l>nYyDM!)muiwp6֏p\ԩOy) \a*Mw0F6@)[x2:ċ9K".zG"ҧWH,FYss8HzCuW6tHF7`.XԱnJ.S˒u4E#K3URdSQs&h@e^ rDԙ'eT2Ř0%+8rx JCAep E֤D3('SʒTt}a®@-٩j!QȰ1ύLRqSjhP TɊI{Tua1 'ڧtUS :d)VY3"#혊R M"S47kt QM^_g"b  E ɒ!Dr~ Mc  RFnva-$ كZJbTO H5鄥)ЕBb:lpa!Exh(dte2#py ۿ{1rO^:7om]_ L]鄛+(K{:.|ceoa:}™2UNw>5.~{FV}lm>]-O?vgYr}64TAΏ >i}?>GwONɛf9 m8 8>{{ʇ?|;)5SCG]"*l9^?9鲜PyOL  ?<:e@MBtPM/I".! *$M%.JlJ#}gehEEeG@*qA.5'GFlOWјHBC6Ity Xc5f\A4b'y-\&{un(T/rĹ jNXӏ?ȨS'I}ISGftxy]12qÈZG`䕷^Ǟ{ :*psBu*lFJCJA5ypȒ* hzy.@ (@.n`s*ImcVBIHAf1TӬnGx6-0זT6ӘA䦎bHURqۻtURO3$jAw['nlGHa_ؠpH?UQa\1mV'1,[o *R|ΫlD, $$"sd.o7\OPĪqc\}Ă zzʈ}5OnD#c8 5761_@m(wd2;;Ms9o#]K_;<-Xc@(`8C@qUQ%b˰ְ6}9vKݓBrm Vmm}׭mȶvImȮlikv>l.;c'kZb4`"tw?KZVfX=. IDATo/90DUS\wE[pҐs3;F}j#b(AmY!n$p*3<)ؚz;\v(#U5'+XF%JzM#'badэsDr(|Ea>߼4T8eqކ]ٻPb$^[ӵfNy\d0Rrcv^5 [ wv'-6.9 ߹F:Pjcvgyè+Um@̔PˎgAޡa:7Bbo=CגS2}B-  >.295Ϙfn~8jhTd2\zU$Id2а4* b1N<U(xW8{,px $vwwcL&4 Ų5bdښ 7ֺ|p5I .|3Tz8h=K푻91q> _O_öSy݌3NU`Ycg`H U3YO%"jԫ{Yp!fRpMVߦ-_A:{~~Q1Ǧfsx D0̱kst2Fٗ_!zOݔHi~W528ȁub<> 7u6Qy=Z(uɓĬv7 M!rz{QZ |}Mf%nmX6f ׳fcg0|<ѝORqވҼgfnXTt9<KrF`Fb!֏N}%cD"+P* o$ :Bֆ3%GF#T4$5X.L"M6ba*/rj5 SA-?{wJhaWӈ3ש9Y p{vƅXJ='8e Bօ^ʀ\tSa|^;=MA&s }7ׯq,FьL1[D0X>hk@) EHC[#̟21#/Q嗐FSild@/H&E(ZKH%E2Q|:D'$ x4n%T@ȐKptVl iB}#``ȗHjHF3E$Lo? 2lx` u 7 9uJX^28>tU6uHmY@zhBbioR٨W{.K/-6[:ʤ_ /A_OYn?#2lkB*a| j %a>Vf`'3O|~ixt׿J4/KpW' ]2/?&+fagl$ s+w0>\ާ~Ƚ&a#S6 =Axj@[/b޿]>,q.cPW[3Vo…4͐?+7 (C?Y_ (/4:J@r,K":,c( h*耆Zh3;k7E YUzN}&2M̬W1X_gX0#2GS3hҬN6k kD~]byD`iUG@$kX;=#7Ϡ%DQ&wO~=wjpa2 RIŢ xXV9\jdinԸ;`go)yUj:HNV(05 bKda8Bk>rvP`F"#::dJ9-4UCRUT]EglAACel4 dM_!B۸w1PTj( zdMWi떨W1Oqf{=Dƺh$F0p&|cK,Le|j̎9~'aun&^c=k Aia_do=t]6`YB:r-HPbe>+Mּܝ!9LW`i։m%nPye·(Qm$3}[{{vY$#yAP)MTkx;wS܌i^Ƶ#hѳ_B[A:|g6 8q ~ۻmѲlѤI1HÐ09c08hs~h|Ǖo_ xը_{]}S7)I+tHv/iP$6|e |,l/o80Xy—T}kp}0+R3c%" /-~8ji3qFғ4y/^Qa[| S~/g(h1dw5cS;.# WԽK46&Tn4*f$C"K [{4׀]kkZ5RQصk`'Or…u6: Q__E!ϯi&2==ʣ50V_wܱ.EH$B,[_K:… ĐɛðOB!EA4vdr3x"W^j-5M[6P ZOXlLOO300@ss39rH$:˭:|\.㡡a}5zyccmClIJGsLxJk y fJOWG(7'o=B%n⽷(kϣ[Y+-!ޏ]`t[6򨺀V~ŢU-pͷ~3QoAj 89J^gTⷫwk$j@Dua*źDQN[\&ՎpK58%n7Uf=B\fV&i޺ sک4˕V V$dNPy׃O7_قځgaX\XՉβ!rx猓h@\$ ]PBjQH*)UE,\HJ[9+I.-ʬ K1عz XL~eطRfscxr>XI/A}yk}?9^fl?o SV,z\E.BV GC }D pxKM`28k`:X\h)| AHAנTk DT+^CW|Q1٤ɔi I"%D4tSYCU," Yr§U{vyS I6Iw#>)W /$Pʃ ;5[qv'> +2ZQFd65JB\&%J J$kM5i ap  MW0 4%&ͻWy #+qzUfɫkpoowU fj9hH{..ן{ٻ=ȷdFD,yBAfh+D0t+:NIDٔ(:$ `" "f9rR(>myJo]&A82u%BXuk&|yW}1yR-?Z.?+'h,rNw\k!2bZri*[(K,/;dtg l۸s8!s q2laȻ(Im)mj2Οbg}zi &?s`?xFU~^kqr2W•ss&w܅esŝ̰=J3,'hzM*2_${j%fpn(yC꼝"yM7Ad W,|λo(/ۖ LQ—i+kvGMfsb7*pbWa6,4һu[销kVVndT5(㛕Tmv{= y4Ps7a WTpcɞm5W&s \vzPF:jRCu6+b2gݍ4$X;WȖG9f@Ī>',(wTxp :]izm3"\#. -IlBp3L?W"KRK5t̞Qst׀֧w [,P(pE"c۩%u\.G]]>BŊ: _{L$ZZZ8rVWR]]i5s餧&&&ZgxY*ksʲXmXhhhTn4r>}۶m#N%}XZ&kXԸYrv.aoD\ (8+V984#[bK6IH !uQτhC B㚂h@,]ɶ#l|->ʃrm=Ȃ?>=4+WQ*ki;qvw3>/ĝb=@a 7d;[~Ɏ%bTQr]ß7?9*x=@MZc}ɾDTj YD,.ԅ 4fƩ$wS%MT!FqDc> r9U0Bo, {RȎF9Sb$͕lY&?Ho+Q *Uƕ 2B KƜg@=e8(yr4kVf(H(Nn#D v|fUIC)Yɤ8rjҖLS!f[d+&}xS߄Vl" ܁ CӉDҔ+x܍zZ3T wf3O(duQ|%x ɯ!5d9,̓T؉"mĴH~#iL-dò:?E댝r|p#^It&N31?Nb,;:Ɍ (+i}Irrw UP<]pZ\LF BʢYnXq:'P,t ML 4))5xmu7AtF@"Yf&'!y}:af8{vn<\ xcx`K{ %x e}vAwC[ur̦ [_](@sL ܧa^83Ty:=m3Z= Ge m@G-8as,g_db0Ʀ??zlXr+U?ơ2wnzܾ,XB5eFr@* Z>8#f1EUQG4ˡZ *"bE@0 l f E4" ظg?z^qVرE^:0 fP(L.hY7oٻQSgdm\=c:`פS(,H$ I&U:t+_|A,# ry[px5P"N tCCtɰ«|W'_Nuv6peOMBY*:A+&?o}v|>?!PUC0L(*+X5 15 E,IiRy$KLg$4v;BS25:,C%(=%:{ mS_9J͗Z"X}%g5;!U ёf44uo( wSiiʕj?BTE*^oN!SViq XʤhP/ 1R:bUqwFCҜl f/F[ui/#&[y)[K ]~,B\8d]wd __ƴ}{$v=i%g^R r*l ]0~;,YU{e"Tc| ]{7hVijkXZLlй( {*>2$60&HU?ANb [{upW ">m}DDDs#ea`-6ȕG|QJ7F loh}@&"MARa.7w#6{;n.DY*^a}?ON0!th2L^p㯰M-%XTE?ef԰x=S5zrx"{%^愀d+XbOCɂQS08BceǖY`i( tqU;;[padBЬ䙬k L ,zi6ZB2 xn vj[3=Ƹ!c挝W7q5aHӴO< GG$t;?9Oz}v;444p1Iee%r;y,//3999[+"N>2 /"A2 ]0׵`}5fXnnC1???֭[y衇|;曼b H$ފ`ijjbBZR:\.m8躾qH$>iqseڵ9a]e~T,Pva# mT$V!YlclL/qm .ɤm.y*2/lOYR$tVRq=պȆCR9`rA6ϝ[ Q IDAT  "{lL8u ѼoR}opSytH Oٿ)ba˶MTd$>l5b.y{E*f:^;c E:nqVPd~y*E27p_]6rqSFhvu,#˄~j^%׺wI&_+e?/›`g`gl+";p837bf8;%s{KAmWaZӑ2P^ߡypsgʁbzΎ`sk*t_]D' ]vٿ}p NOB{=5ٲ+{eeF2&t*?dƿ`rS```( UADGuc ,8dml^x: G<`P;bK?dsVZFk^^BV&(V!VkטZ1}"tsn$t5l'-m!suh(W:R4{vrCj!OA*yWfee-DբRu{6cm,3z\&3A4 0NB p"PM#j%s7JM%n{-_cv^O7`ӵt: u鴪P__i8Nrwq6LMMNSOcc#A^x"]]]RdF{{x (޼ޛY5@hjj۷333Ûo iڊP__Ϸmz{{9~8ccc,//Jn4Al޽{'wM],bxxVB?bq={vt:k2Ooyk~#6*hzw=¯?!;$"{.R8XES栛C=#jP7ϲ]56wp9gCߧsDqCU+BܰwcqvͨwтG嘃f `ur^,{ DgPu;=~xt{{Z`A@܊<TSĮ<' rj GZ ӣXJVlA&/_<_b Xڨ9<ƾ 9Qy7G"wavt3/A̦PaE'ܜ $nCF>zǷ>JVvzW0063QSRZ%jєJ,fLpd"S:P:,D@ITjIBlyL*ٜlfbKF'(I] J$ZDwH/E5Dc$K94'iJ/bTȋhT$ ,"ʵ\;zO.j}2RURHٸcux-.@Wg Ns'Q~~ă_씴C/E0yRU+I3ӏPهWT;32.$jPl\_ ~àM3_HN̘a|`?T&~P+/娫XqxsHҰw u``o=09-p}o<˝ʪ Qe(R&Cm};;Ssph#/B9I{S7ln3%xPe8W`ZX4s~,k~}Rt7`;(f5cҌbu:tUXt|-I8Tuf)jtTFFKRĨTpq1ZX^*KTb%8-%ܮzIB)To8vJ S3ՈiZ!~/,NYr=-9;N7UB"f`A[*RqI]Ӏds]X5s=h!J'f/*|}8׋mK^lhd (iw)ۇr7vvl)X2:SS r߇m i$8!v" r|˞"` ||󴗅B/{,^c{IɅ0NqF!xea<)glTV0?}hMFH8óť+uVlyUG$ ^2h4RAs-/W,P4Ec{Z18.bJֺЇ7c6TDIUCR[db7  KAoЙq&+r%^:{#r58>?z1K'|0_E^xشixͶ`OUUD"uYWWGSS`GyS].wӻ5༶ֵ:&y'9<199Ʌ X΁غu+kxMM PA.\@*ZkiruvСC444cL&o P|y|>pf),˨,˷0k굱R'8QN=\V1;CMlo H\Jj0Zɴއ./bO#մ'UYHPs3o=eUNpW /cr/?`S*WpVt$TDM?jiIU7Ʊ: n< /p^{{ э ޸1@5fg'qWG8N8 *!uIlV)կ h8T^N\bS:byލ-Q vl[?uI(cAL.S/HE,8^0p%Ǚ3\GĴKx&UbnfhV9D"<.>۸(45UESbj6T՞8yэ.M/`AN!t"*VD%&mJFE\4&@S 6CI"CF1:݂"xR*XDCT1  D1rfQ*L\ sJ>O :ŸIߵItP[ XᢦƍiYK|}wh N^&#W)$sL7'+G6(\>Y`*[4zj(Y |1K:Cc=la**鏆 m]#̞Cvި@0hĭz|f>\5~4FдchY}VD7[-x3zW'^zVBd -v\B'kppâ0u5eA_[Yk“ϗAgѬ 7V`5/5exO4?__)w#o/Kk}0^=w ßtD˫e/`A'#$Oo< 5ePwkeűrbb2H#=ʩSo /tt$8`2^-1R= )RY 4ԟsd9 rsKSvE0ɍ,h2^R>yG*!v⪝hvGviB-01B_E_{\$ڭQ/D 5J,fK" M3]W-%|qƆ9/fQF\L/sP$SrJbƟ\5<(86JTW5H_'.*^@ө?!dBx!&I&iJj -YZ!( 9ViBC<!el쒈 .ϒ6 ZYH$WQ~nDX@=mo&\bv0a1v&Ewzݧ||(m%4V5*{瘮AlɌ01bEj \{O523RDϑ^/cC^AțڪeGrd૵㛙ϓӲR~WWW'Pg2L&\e]BNWWRyꩧxWjb8DQ fмvZC<\r])JR)=J2GeӦMN.Z[[o0yN[kv-n/B!zcL$Ygom0]k]O˰ ,kBC"EEM{}a*+fjUD`0^UwfVZY%`@UMQisRǪTog46Gc'jWW]+dw8E?â^PP)edaIT)x[QӹʙHD59JxddΏ`I-hyƘK`*VՂC4H %IN(Xd򪉽$K4`U$P:yY`U(3Q]U9ӓ5Aa$B"l`c? 6'SU bt`4] HD6[7~TA"eH7`6 `)w{]" IDATZoVam#ܶs`4 CIx|^CaTpu04[1ͅÇyA숧3*~(@3@~nؒ'b28ضhY" *3QA֨OXWCߐʮ,XwXAU/ sanɤ2CO.1` ^Oʬ:̓~3/~ Yp5qqq\ٻe+ : ]I\{G?.P[g2~BUu p%}ȡs7W]upŋ\ʊ5v;O3::s),{Xb)D- G <;FfbZD(8sF#k{QRw ŔOEUki8P/LK<$"[DFTPW^r`PӢȪY?%aW`,z%QsVch-K"2AYDiYʤ\&xJcP2L .D\C(N3kZdˤuet7HqPREجE@Pf +.Rv?ZM MR?ጟY"]=dD$!A Һ^&\y3 mu4jH.04@{wQ"Fyٗ6ttGi+ >)ӖAsPd,h>ҩ0qcEOIaDO$Mu-ト!q6ŮI&KofHWG`tBhQ|5ͻm"C !i!UB(\'g=7ΧDb>q܈?O(aMC|M6QDyzDC&xm55HVҞ9s1%b`&y&vj]~fz~YK#r8G 4wgЎɄ =&ce"mrf6%@nmϒu:ԝ3Aw'ޗM%IjėhhuX>8tN#K둝a) 1kfOgT*&~ʶL{HJW̓ +ߖb ϋT Ȑw#hQ&Ot̘J4-Ys2)0esg-/hbr6v{N7@y $IN>ͳ>%@:<{!ϳ}v֯_Ouu5X`0x)Vka|>۶mcffP>qĥ,{ [lZЮ,^h!9M:U1 B9q2VZa$sRN;RGUfn 9OҺLBY '"urTbT >WFkhYSYQOQjR34uQv9zWi3ĄQnXM }֥(ːTBSn8:Mq.(zʥ *ȤϢ\6Utdt3q$-ʆ$FS@qM@e:޷S٫o`Umy&‰W%ZKY])LSkR)ocWA$Pa6bEMFH,MҊPcVڄ&;yټ aM \QuұdIP\S);""88)#*`)O(J#%f":H! Ӽ6Ա9lYBAFmTd|Q\*Z"ASLT=JYqٌDd;1!j/p-zȦ%`!V-o1JaeNr,/<3,:l0&5HZD1O2." (\q>壾YaUN8^ QR2ic.JmyxjJ(UI)`y',8>uxkuΜҨ5n16fůq2*Q~N.&QH75R_L`ɚ"_WI8MxY(΁ԁB~"dǠp>{, qH'3뽵Ӈ`5ܠgFu Q/"vp kW|n V7igzi З5ܺ tuЕExoua>y-|p-SYx? !v謂o@cZe(u<7=gAOn-O +o\F/!San>eO<<b7=U1C[?yYBT>[˪#6`b "c 6-I- e!Ea| tm+ bo{2`7JS9wql lpaZ;n97/|᫜;5WѾ !亴’6BE$D܋d .c 2U m\\%ѹŰ|oFt K45~6T†eH6?\i/=l~˝w٬ rq#z*c" y݇ٴz#U Y ϢA6!ZQa "9ED&("E}-np)fœY#+BlTX]{ ֬eryXPU,0+ aQ?FXa6F;!ZO!DK&YD!U>&LEA~ӡ7#D 6Н,pzʇi)*1-)|ajZ?Z]5SUDUR.SL!MXk%&K`+J8=O'_ AޛằVMstm5qk#Gdz3$BPlK?4]FMJ/dRRXN7O_ƖZY8sVY6{tLcBca)L{h>ZKDlލHb33ȡQJȲBLb,Flq%N4U5LV:\vgk8F-}"nXUĞlќysӇ t!=dcyV8Jr h7OD]q~Yr~zJvTxENptNk#m _߇~egDuՠeFns6)ɫ1fY-tX*R/=D7P<3MDטs0!}`'q"ʭWt޴Z3$U.SY|m.jQ!cVci_Jq鉞|^ &X$e\>.vW^ nwAS+"T_~}]b:ggg@޽{̙3tww/ߑ#Gػw/EB-Q{Ksať˭.󗲓+M>}:ظq#MMMk-0'O_g``bx)|Ll^/NR ߿Rbsb%~qbC3߀+KZnWбfhR;ZĔym.?/?"jFv~㇬fa΁]M"46q79 @Y#l!  ?~﹛چ{'W˹:_ E-GH#7qm',S8e9EL"+::_fKitV) ~ɲCBƽԾGҵ/.G[k)1eoQ~+.Ww֏},GkyaMl[hNP 1% !$\D=ǥ#(^%(`2 H)lHT,Ĕh#D2蒃O(R;MO&86R gZ=U'=hcf.mʸ.H6%Nd"SuIQ'B>/L]˦哌H#*lJLl[.{13@Q\% 4) [-RȡU^BoYGn:/_ ,sp,ﬦ1cHY> L? [Dχ".0 kok4ȃYl?+=Vyby( @-8 ( KW’סS+<`zزkZNhປᥒ=~+Ŏ^x\ _}^@b]ޱV6Bu^<K *2011 ^~M0 0tl邯?c栢YNPbe |\7ٓww3˷xZ8?w,\R~%Վ z`6\Ύ_MkG38So ,(x+ " 8ge2AѸv;q]GuC'_ecG;IZn² H> 5plPТ]* 2 ,$˻ /s ?XuиFٻK خ$ \RT-" z%,H^ك" !`E}bjJ +ي<@8:(-g@>|$f|HY"T;šLL8Rw>viaUi24,!7?鴲 ~X eZ:6㻲;" ul&6!j'M#M2YraKhndR4wSD2?$ҲFQjUSgm"b[8Y H_l8SB$1j:h$>]UQ4;RG[Rh/.P$tSpkl)%Bo|^ zTcbɵH]*ωYCyRZWe<fYŮ8 Tlmk+y.hW)|aJkq*ZV@@p~zL}:G7dt۠6nz5%Jp;V 2~44"qF Mt4J8EZ>Ft_Y;}3 pdVQcGu@sUz6"[ÿd$vWk_r鑑/y KDTbxx~{UU/e6KPX,^ȋh6\ꯌZ؋ऽrE8p]VRD6E˲dgT/dL͑L&/+_Ŭs22ja~_9mK#6Z:FQN(QΫ9-`K6_?g?~K9qd?wn}F9N)j5P Qa8'x$.7{N(uM9n$9}яc*%z+)6brk*qw0wk>q=clK5\}k*N"͝5h+ʱH`~E0jm>u<͎ 1gɓOm{y^V]lr8uak> d÷X0֝ 451V^ 1y5ULM ) Y\͐1D62Į)2}N&$"ͤ$K;u\١R,R"N)ouFrt-k4`PFuqo`K+8J8.=8q>E4ul+pD.Ell{'^~X IƦ;\*}xb`$0Pj%r=lN`~YSt]J'Kr #~L ̛WbMhNYTSGEHvccR&.Rd;70EbeZ" C'}oJ`&(1] t WѴEb6xR:% %0xE|l%i#%ӱڇW•BZb1kYLä'7r}뤷*Liz70 E:Vfpd`N) ;묿~p ]hعMg:J>&6XؖcːIOZ P]aQ1EkN#))X$4\S0J䇂MTѴTX2X3F%·&᳴l$GuTmoNu&~NsGE6e$Lv4$.|nL䂛H-dzejIA>"d#$Ih۲Ú;hz?hE՞`L 3'azihLv  ږ Y>2 /UM {./vs}|p;G繐v@$MĮH4 ۶u2F5MH$!P*K݋i%±e,N/WP/ ^xm%/% [/c_ɦ/{0/sa+S-+\"pʇ`64qJ&׾UQ;v `CL h""`$9TL(P(kdBfc*"'<O})~H\ qNDŽCNL?zVtS/xu1kUcLaE!b١+e =mѶ5f~3F>7'esw~S#HɔJywkg)' rj^kWs&7ɁQZ %+M*%! "er2:3ܵN_"+кǿwﻉמeNC53O l\Bm0潜D ,\M)Ieے0ɀ{1^Sl_t( G4\C'KdPDېQ0t )k)Pl A!MfS@,ɠ%C ,EO%#Ab PldA rõ׳,vnZ/#љe7cH9283vpnlsZqto3Dc :::Z9q1hu.b(*2Of T C9S83yaY$h=:P{ovIsh:Q(ʄb}O "r3Z$,,5qRFwphxK3qr駥8d#AnPi(D8&n׀`` 7B6 {B{ء<v/}B OCk<'{lmۼiMzyay: G<㽞y׃?]OS,y9шD/i]$ 05_?zL=8<|2 'U8M/9N[9ZS#ᥳkɯy`u?=hGplnJ4V?=-Ma  wy=QfH"ߞa Or|8ز؊hh8:!ෘ0䐜 O⓿ʤK&n_?l ,"!m11>c'я݃(ʸ d)2*(\.~-qlpvaу=q9,3bf.Oxӽ56R@VU\W@r]p<jPftlG3QK8 x\d8&O쯞%RcADUqe6v?L69i[3!D/W@/^d\xuGʩu|).YNQ;)N-9-Nn`\/K5Kbian3t D#гǞC,YܗêqءMRa "w/#ZC%XV珫#oRGS-Pv˽*ZN |n@.Y^2zk]v{ vhoj]#LT. Q%_yD6V~cGřʚhLJk5a}uVd EhQ8zE'>1KʷT:s(e4]{W#zyyNY,T+L[{;\?f0\l1YчTՄ2%AkJGYد_bMN3VWU,_w~QbUa|]P0NEc֓smp-/TK/r۬>3cY+7?ŗ]ڏH,-!~ HByb)sȠ6-#elvth=P"i.m-:5csXaXp 7 ӡjf0-dqMi!k ;;#$pT֦.h}Sg9>ыo*J2m7qhlBhTT".J'61J22,(!t'e@R5T%De> kc6%A@DdץȨCXq] !6R\2JYd\%Xbˑ.!GI K>(q*TF\%zAeRqW0,T2d.Rr}2.y_N t#ޤŹ+R<::Es{%əNoꣾ<16܄/Vc˸jͩa&FZ uّL ז0"o=yJ})J>aѣLOS@yI$)ב1jnP9eo-] F@!4iw訳džpJU>7={(E8gj@s րRq,ǸڲGe0rh=Z}w۠/t] `z8w+Zر G"PD^֮z$ AXr5y+7SÇ;䙏5`Y5ZSsp&~ s04 Z=C= XR9kOBk- V\|^ <#kڼpd;o7,80/-#j}Wg߄u+ _7N0;+!!&KLm$J\`#;".mc.)b.` 2 i e_zW^};+؎ŊD2)> ^Ggg;d. O34~aWWz=ۯfq,gJkX*rtŵ[y-m )~O̞s+ضq= qKme]N䭚j@Zwٛ%WjcVF؁94m8Ԡ,Gp<ǞR7Rq$G̍0Ȟu.S,m"d Q9?J}s UwG:Ig]Xgzt5sOIE+ .!<|:B[0ʱϲ/rVey ˏ;P)}6nz$*&p7c*{[ep |嵼j=f1xz( (ű:Vq|.q ҆9.w֤ bEM s7 (Aag8j5g1'm*4 =kDF(]$1PoTq'8.a̖ۑ%hO3\$ϐ [[,=>Qʕp"ug_E {3ܱ˱F ulʈk:M+~c"u6}F~jjF :7>b4݌5'/,!\0@x|59V/pf1gq5KVٓxK:\زe'ϟ%\?&9Y.ZkBl|b^8O~ߋĦٸ+Ū/¾]Q-9{9Jo1,_~c C+8L3gM^ewr*"Ep-2DGv x<ǔk0O~q35wnL,c}e%'c3 n&/RKskfϡlja.F',:@t! o=#syߥt +l~$-v|>`?~4uQn @dLPN3ں4f4`f-k/o0RpƍBʢ P󓛲P1a*{Ө0ب⊍㉃H.-$=@:Ģ(pp)fx-=8-uK 2έƍҥ1y< |zgKaG_Usb_P {:@B}W6 G+u^+ڄHævsH.lZ[~K&(=3{M7ܷwz'T _OweZՍX`Y(n,EW`i󱖁mY"n6FBQl,p`-lCF7@-,+QAp̦7*VRPUP.(FlUDt,B+6BRUٶbIglܪBN&:jbڳ<[K2(jF-gcؚmZ6?BAlSRl4evΞ6ؚb/Nl bXX 0Qfl#̖aGi×M޻`:["Ly/sI͗pM!Jh}҅g tI?]K|b*F{M@qr,rC%?L8C Bw!&O2@qQ7bi 8梯mp%x*..$5 55Mى0M_~ =36.7/?n+ sy/jE, B=~4Ѹƛuf<;őr۶b+Ls7XC*S_T"CmMmAlp"+K+1,/)R$U <{w\n9vLpeFe, iJJr瑝<߾W>wdQrYP@؄yT#d_5L 'QEu%y4"uyf"1n3=Xv峈4LSRSJ.iEs8h/|OOӟ8!]H'49ưD+&OKQT%* s5<`ŝ?5,<5k}UȤ1zQ}.J'ubl2d&MkFͯJOKdS$'H9mxLR?'i-P=GCؘ )LԌ<^ƺ90 8v=ߋk.uS$Rٿs*kͅ3;SâvCI.?NhkUeYpltGe8pF # coM8}C0s?[p f\Aq' 4S[Y޾QQhx}tūg'},Y~N\L_&e>HR vM[oxu6?#:NM.v# $['+鸨É x rԓм051X|>NOAe4 }x >%X $R}XnULN*zFuB.@"xa*퍒2}RIU`GܹpV5@p7,jQ[ %9$K zmR!Ն Ka(Ǻw?"]_ܾJȼi^^킝_^3H7]PdM='#p*4-<8 #஥nNش IDAT@OB[28 k#o*2Λ/aS3"]w7~tlӞU(-,,ۀ鲱m,eˍdڸtl 5Z&9S +r*ϾնgXevTT[EQTKVl4 TF,FQUY볪hضm \J63qW E #s 9lFbl+=[**#!}WꝄk rbۂ4: - XiHgZ6(+?hajnb2Bs9r4[XO w*/e!fhE O7rB"?hEIJ4C:{ܸmPЌv.Nn#:?z8Au`mÔ(;\T+n`NE$xqM2N8\g~L-X+BJ5KMrz &zL5ol Gzx&漷KZ.hfxV*)K*'qty4Q{.C履ħpǼ @ge%̛_$]y{%SU5E/KINPQ:g}(:ho9¡{ZwXÛ1sYRYA\ "T2K2`o.G:ML+~xq4ːt@UsG9cdrY_b,a C͑{0iurn%utIZ¶=FG'gXv^fSd l.QLdl΍; Z fڍf69S%s2,rZ+MPvxn_+C)J,ZDd]iBoa%M.Yd~0ˌfD͑ǯ=g-a{uܹ^/_P;90m}v=OvREFnv|` p X)IV._L{Ӹ8餎ۭ"?B\n3P2Ke3d/a{=S(D%r?Ô%a]ôFa Id?euW53n;O!pSdq!=}S4OMP/~StKDưb&o } [6lB\d4 A86 L x.{ QY2yyA?ed De1LJk36nAղ|l3ߟa:&1I+EQraO-G'΄O3ǝgc lͅ! { 2vYtRGTQ(&jƏicXIl\x474.LzBZtvGpi%X 9Cj71Cmm\ڤǸa b'7NmnR-PۖImlgEaIK3`EΆ|9 b_ /`xF7·vC]OWŽp h/Špv KKuK|0T'rt/G$ldRfUKW .d?wn_-bw ,^\ۋP[ a,)CO C@JoYUDAɘXekXT} XnLP,L4 )`*Ji*bmPlQLR} D2` `+bC-u"h^27)VjP,yMLsVŜݎuB mDc^eV,9)[Bg{UC(W6*ZmmJb3f~N( )f'Uے*W QY["UهΖ 糖#.-Ѵ~Bjg626$Fa7RQ5Ĺ7w`+U-%K ߉]q]=z N&|~Nnu/3::OUŏstEWF?;s+s7YTG\>5| Vl[ '.5bmM &T"Ҝk頭,An[KCn§:QIRmN=i EWm^Z vq.I_!^|6JlmR~pq> DzOc_\S8) 3p4D3̷ٜ".rx*;ʭ\h[bmY>=ӏR,i#*I_wFRhY3gul w,V&SAӳv0JEJ%q`xLU#w,cDIs iQ&M^@hI0]2IqS5P,zA˩0Iasq0d&*T,.TtOLȹAмI\|=j2Qəz@2!d6;Ei1>fj6%!L%<o*N<+%cxxK-ԄH@͈c#`f) %ꄲy&iP;MP#4ɤK ȺtIy׼$|gpσ;vIB<,A $)6ѕB&"؅ LĒ=J[i]itWH. %hoH(#uoB8XYU6rRC (!tԏV\iXRo_At y) wax>Aӄ&[_E]Ludsd|~t WBsX_:lX&Vyb>~Q=nn_CfG 0|^9DV?Eb6lh,}py.%T(  ZBet0\r,GBC/ UDvAE>: ۖG'?48)ŰCJcd[%b9dJk۠Df<&=vSO8cq/}@$WXi0x=9/6y8ppCcBWe˅(_w_ *Aw]Kg%P&İaA)a9 N$ܹ^= 'a.^yh^KǏKGre 􇡵&H7\2Y88s6('mYBR׬9uM )r)_ϙPrKj𕿄C[=.H'ԔȟxK${{@H-GCOw'$IT$Iچ ays|\'c{wg)[Oo-e8pExK@AvcKBxwCjI>OĄt &a& e0`c3~)8 ?K3 `hD(O4xE!G$:6O> ]_ 05#éKpAx@¬r(5{"x~*|{*%lyry\^XiB*GrmiImx/t6XwQ5K .HAVKVS<xN??,ST6Q]|=BߡgX 96,Q`+ LVXg/TMQ]f ilfv^~o+|Q{ ̫;*CbN$Y9޽UR/OJ7$' w?_hZjBd%b3[!X!y<|AM#s8vFb`BwupȲ8p|papK:s| *X !iB0u :{2mf,wˌpCң߹TlŒE,1xGк5I.B:EAX/@Y+É ͵вI! ̤ݰe+ `*x!>;nIIHGo K+Iܶm!BI<03 ,U_餄-Z7DK8:8qzV‘!83"Vp92x圐H QwQB:~D8>/|T*9 %ŀ y@)ݯ 8p7  jrCM`D^X_\>!59+ ޳Y]PϾz>N۠k !̒yZ}2y͚3L0y<')\9SQ?v(-R?i %zY!]HAl. >(̓|I+|ܥ ɟN2\NXvRty ?}JfKD~u2]JZX* x6"R}PS [b5L]wOgv¢8)c'{k8| Z*`I$t{t(*] E0:!),;p8p͇~JyXMp||AmfÜNONK!/ DNRۆ_?&K mባKf˃cP Mǻ` _)<,j:'*%՟ΝBV_:'u%06 7-p\j.H@X:Ks 'hCw Odቃ02-3صW1M`*^\#3D} nQ .Cqئ#)X ew?v<?*%( v. cjחP]&{Y)Ws`B!;Nd7gy7cS&ugͯM8c*œh/> hLC4`PSW×<#wn3Fe>ݣEa< ;^O+5BTm$$0|(ˇ8hL3x9Ekwnխpn|0T.uoӣ߳?>ظBoI EE=pZ+%9…mrgbz>l_HPZ[(>_tIf~D**tx^+-+! 8p 0/^*hʥ빧% }dV> ;UgxSe56gͯ=8k~mYwE 2ga/{V4\" y09 .j8*X؄VIu ±ܳ joSm!L =x EX r(!xV{cIÊUоP$C0je4a!m{uh/gö%ҦSYxei-\V jsE=l74A<,8z6CPWeZUϪB9%S. ]^IΘpzx$>[6C]$8+/Ӓ$ ;;&akr  KWAE ixP~&~wxSofVN5gͯ=8k~mYkW-En*xKS`"Kw@ŵ0{Hvn[ ]òM߬T/|.?|~^u B[(!W0l(_w,H28tBkd'%%T!R! ?j7 }Ē<4:a1x rp OUpSpZ]̃g`A$OLS.JTu[>,sъ'X]᮵04#v\?GBB~> VyAy:yq5 llF ϕvAj o YX7kSƸڢgݯ=8k~Ykκ_{xKJi &@.0R,yn \ _@ڝ_/ DpzB4, 2g[e |y;|~]Mo8kKbM^̷x<vh+t}=l_)S$+^y2QokB{#wm/Iv"$ǩ\wB~4)]RDe 9AQ En,F!!ܻ^Yڧd6{BεuͰ~KjfýVJU4 _TB-Oމ 0j1Ul~~u[Ru:9 KET<)FN,KvD8p @ J ̼ a~;`CSPTDHZyiuōpvƢ𞛅EVI޼^>zTT1}dUUB΍WodR [[< yTI~XP-Ǥ(=~8`2?SBfL1{=bîȃQ8yj vV7{" 8sAo\(]>(׫{\pB^x0+ xunx 7K:uY@ےX7Ͼ v{ :.ɾ`V!UPS"5VCmԔKpXEm)<]6`xv?+`A3;?348pX#7l|l@ť`| yV7?< kA$L'eNײ`dJVKVyWH ]kŎ9_Cw?ܽ;#+¥!H'%`lM{@ `Cg:Čb+g\:ǥ٥Ï.5p%G7W7,3wDDT67 5?yKc>b(BT}`".$wyhA4 MM06cWA (]0 ErǓPC0dC&'!j8uQ³ŠPP;5eف8pf_`BJ-Js{w"X^O²y@}Tpwr¥ah- .H G95g-tc9tw-(͇R4HT}-<gĦmXp^: m{\%d2^tEw[A?Hb@tA+dZضcE蒆E 4Vq}h9(̓GR/ `#pr/UVζe*< epy@Y%4/ЯI6WT5}8p/@ P|_aHuAQB{6)Bbϰ`m|Bxǣb%#swo]+ErYCa^<{+ 4H7LTHd5Gn7O  u#\{g_[!lo DZF#ħp 0| :+σ% 3-sMul',#@}MJm0/C*9w0UHstЀ_C8p8pہ{TB[;D"p洉95 ;w@C#$RpSM$p5BG }JBw)bDmɜ E`&Q;Bk EJ\u~~"bXYóJkWJrEl}zܰm=D=AfUU~{3邟< kᕳ$1 ,~+\a:]O$Vυ2B=pX[g>̓} !(6rn8t FB{'~/$E7p?,Y&SFW^TV e$2+` fvA T#jLL;_qU :4sN7]Um}7%4#%rFI;Uh%xى'G*Di4剥E$hF{]V],6fF/~T[YyuUX J%H&1d jJӖAf"#/,*f;m12^Nf"La2ԏE ]@c,l(A+ۖQ9B0B (s)]$vJjrKkRH8 86n&:!(be CV=ʑR;'1ʠ0R% uAiXn,!щr *bFjq(W""ENEa3;NMNjoDq,T$ձKELZHۀ#i$Ȏ@KeiHp T(F 8vNlRCE zkw5Yb NoUs5H؊a &5$JPؚ"++8EAI|) I0HEI$щcC(]; rQc4Z ,Ks-PP!)uiq-hǐrp~*~"DAiinPжEM&4 G"\@W@EAQX܇!ȈN;7b00dw]Tk6`r N7c Hw]e9 y<|J~(4_zߵ|/M+Y+ +5xy$-SƓ7Jn W̍2 ݨG>Szt⽸ 'p?|Uz>_XaxWKvY詡R|TB>p$ +sKw f/ MpS=?c(O+-[׫ !ZB{ׁ^,PBn=w~C߽%=>EI,w¹FRԛPx{ǧLGht 7Ra[h<ǚFZ6f^yS S0b,VeBSAH[Cu + x ,؄SlH 8) 1@%QIHq`;U잢h(t$ݔ,$|!,ti}\K OS 8&1HR))ܘL)̥p5 Jt͚M3ъT! *95#ҧb]3C $:QDV9h[ 3bUHlHR*'mlcmqϝd{F\glW3YƠx{hE=C*YSFx[7vQH>HlڴJ酇ɏ]!>H%'[Ř9N Fɖ[ti*mbO6o_7Aog߾FxjΩ9v8Q!X`:/],,ӈ5 NiW8IRMf YNjTP(_(lKR4ȉ0M;TeےHxR*,2PnH8*  ZdYSrckr'GQAnK; 輠XvA:*#6)Dڦ! :7~Ӊc&%v#5&s")5A)Vn Z(@($Bp*6:gw/4|}% {s/É󥘞.kegݶ#&e-8qLB`a$pc & O]$= []xzīm.]|/\]}eF9 xý_> ?[x; < /}O?'PӁ ׯ}o/8puZh"| 쟆O~vOqS;fKٓ߀R?h 1;we['pd?l{ÅjI^^jOI?{-<0ք?(={vv`,YڀKgJ[P-iK7YPCW{|IJyU*t$K7_ϋXC:0Lnl75kc[C=#ez򑧎5Mz~'`ΈW*}Il"cgmt:zEvIxj0FԬ6԰*e2*d%,:}f'B0.%RkBͅܘIyy|6qRĊw0wネ1ֻզ?863<]e˛L|pS-j?#+v>\^bT=-]yO=m3ϑG Lq37Yz˝?p Os<Ԯ6..be DBXI5``$~ 1*CC'Xq),psIʆhf1c٤aJ$(,R XCQQd̉q)(R"DLh,,϶1HehYS$qc2kG^@(Nk2"e|,gj(-N n! dEcO$:!jcE .N M)X6 |b"+H.H\ h6ZXXZ;gP RZڠB-dBG'$ꕗ ̮c!w*,ѠKBqŴ~ sJy] \ML{dQdI c jP+0'=2t7 x)Gh^Q=PWZl}@mlR=p{1lE^Iɻ wV}fmM Éuբ>@ Y]c\6Н ȍ.9 79dwnusثcxs%p+bݛ2ؤh~F2YcxDLS Rnz^'߹"UgLW"ZQKrZ]$mD'vFIPyB BiEi1Ta,Љ ,'l1*C62haUpRT! tdȄFkC@"pɰm H2Ҡ 88~5qǣBiai-$&/bTe3 #)<Tp2G .H  R[h26#uF*8,Fvf0Ah JTQHBXh4_GY. v&( 2F: )g6nlMIlE$J%$H<'ADrIJ&ll&4xo{}'އ l ]w@eO-wpv҆i~~7)Bc»_?({?is}x}pp[7K6 3/>R 4JQxx҆j42{T3(E^B|)yZn/{z!v8kOq- ?_y2Ve7&K,E;#U4ol1qi/떱@nNj\ٌlvO I hbIc}jrd|eX  w6peBvc[LVW c'mGN9L;uJL4=Mŷx3L/F䀘י/gd-'zXUuq*PB!3H9XHƏ$UhSP=7Nx~!EPf$!nǸpL+yr X94TA!|"[2NhU&BE[`usF >[?*V Hemj=p[ZLUqBlUCAy!nIp+ !I&ö% Ԣ)}ka!0Ư[YmVqoBW]N)f@0٥yAeagc`~;|g)؃S;l9uQ8\A-lo5b@Aouz}Ve آ',|=Cqo4*j5΄َ&1 1ie0\LW.i:r)M-Fq/;:8ݜH o=!vFY2 \]dhn5`*GU=__cM )Q5)mw'޿=5ΚئUf h֝T7& (VFi_]cɈWdHjH")Nj@OC횢TɎnJvFHD$4,,+p hZ#d%„hl<bd`TuD%Q$r5z!nHxBd!%L@&w7XQT+9 Ӱo,»+O@魼1(Kw/.O.oCwOȿOKPd ~%1+;QfI] *,@(!a,W{J/x}s0Vw…Mxi }o] X!'| pdo{7.ՍRffz, nWxg-!go~gVOmgݯ)ߝpSϖxuIse__.vO7;JC??_?]ZD-eIhS.9}A IDATC00a{3l8S p,.z-r\w V2A{#A^K7,&6[>fş=Wf:Wz Nr?WFgyh`_wHnq^ءW.a; XXb>#[Cv!>5AҙLevG+n2d񯿇 =9E }U̍{gzYZ16tN,X[0_ݤ>D>޾}-WH*gۆ֓3zKs4=MjWa"ͩ'aCۮsw[dĵVusw2` dlP h 5ZnY LsH- o̍3˘\`uZt"#]q+ٵ" vjӺp } ;nwmg۳i [FXEJfx\0TB^hbflnF&pIE r'#^LG!\T5A'aI˯R([Q$9U#-hJjJog*:E;F}x!u$7|㺒0PWASV֊DԤM&[ Ylc\Jc.p8v"EAI,,dv4qMlN+?E MXyN  T!k+HK ?s¼{ȢHTtR*bVvYUhՆho$,el?/s8Rf)f]~*5l&i";07)jѭT@h[YLgz0 ]]1[u;;Mk$xĸjY̮Y3rCT,k Qc":Ae DJܤa=I74>}PӜ {4W"wm@U(ZMjW5_q}Yc||\PiJcvM&s&&&X]]ĉݻZy377GQ`6zq{ettnKQ}lq8}lFkMdYR )%yQ8fv1E8 QVt:ضMzݻu]׮]ٳ(T*t]:^Yn۶BP N:NZ\v ugddGjHVCkmی8lnn$ϟ'I&Bv"O,-C1 0n܌H"$@Lc5V"4bhd9 -34.$y@.S[H | 2 Deʌ< >c("` rrJQ*IW'Hm"!" s"4$/Ҳ [9ae0&XMRR $ qdd-b PhHU#F=k.~)($!QV D!(D@q%% ! 1Ft%}!B rA:PڠѤ+~V.<[4UcśkpZƩxu"`Opکsy~*Nа'MR96Wrtk\EaW 5Ij}xj:K&!sC!ʹ}#TWǩl c&@۬v& :GULP:\c%8uŽj3<4Y+A/yhyoOd+Ma˱7ɗ?6wN680r<['2K2NfxBgxzD:ϕ-Jj#§ Vzge~+j U9OWFٮvC;My[˼(6} "I^(T|-}?̎ŕރ} 'C)i؏(!VB©' ﺣa o9 zi|06t,=?ϕO`;+-x𑯕اO$o?/|>߯>^ QK#n4*bLDR^YZ6Z-׷E|{ٷ\.x<<Yz ,<|OFҧFI+jZI0ބn~óSanN_~*5-ڃ܀cB} &wZ_ڥ2lo0l_‹C|~6k_hҒM̻֮|wy}ʜA?<#)^|GVATsɞi~+ GLQ\[&m31칈\>:lr4.u72@9]ibKE|eIjs<9X!RƑml{KS\rIsj`L5zb[D/t:|*;k>Spwxr.woslaK D;1~[oDl^.%WFx D8L[Ꝧ&,?'yk9rυ}GVs mC4~*!S{y67o23[cpI }C.B._yx˿M743Kxw#s15-} e~La^z/IaFN`!Me>SkR'rqGi-`lWB+*3/Xɓ=>thM*'Qڐ!VO+>jpHii} >c<;9Etm ܎Ͳc MFBºk?K*3JpTe•}8v@I\6u#)rɳ <7%+&)*.Z.q2l`> ^*N*n?0J Jr^]vn'J/1՘d1l1e֋: jb567k4qBIZat-ՠf7ٺ`15h^c9D7D?T_"q9Oq%sݭd9fbn%H`'@O'Q6'G-1NzZ=g2FsƲ)'k DվPbFeaJSVE"5EQ2<9S-ؕmt#a% &7l4GQ-$vnFtn޾II*#l!0q,=r A66^gfp{Cп¶74oQ n_%;6KՀzŘ133C^ncYz8,,,PX_z&&&u]&!Ð54E)EV#"677)۶C$dYF$EA} LOOSV۶ zŋB0==MV#cz.]bhh[vxx5N[1(}n8m[Ǘe۶R2 aϞ=,,,044z!B$ QeEQ0;;KŋZ-ڵ8%~:VJ;;;lmm㰳&B\%MSla+W+XF`gilEl4E/&^1v OmA216~ 1 mEi)tbEFJQ8*$mEI c*F$ lQ! B] H |OKkEm7[} Զq2EV8H_`e;v' v2(pOJgPaJn4fFE- gJIXa hQ1:Jӵɭ@)7{P-$J˲)bID#,$7X^1dڢ0k(0n6E+X3 6 ׯDz;ؐ+wEg%&Fz.J8>`c;0#/qW֘hCt!`mqCt:hj,sɯ,рǯLf`~&s3W'ٳ.xb4ggXjXY*ڕ2nm޼qO- ==5i aMYKV) e&QA*ΎLȄqܜ4iKS|Ǵa#oW׌ .6ӯɅ6]o$|uq!dvC#.KK9PH<)nF~-ח3]Lܼ[?|De߻% Oe&ֹ.R5:='i?|k1`CTZH!|F)Wx?\=Kkuajve̔ѵK|s }W)_w_oUO@ܼkķM,oOplU}]g$z]zfјw$0?x9,Ûܶq{nx#&=2_`鬌2VY:2q7¿S+)W]} ݳɓp*yW}Tw&nYĘ' TIoG#þX09ὛX'P:M2].`%>|PU qd: 9p_Fk/8nHȫ6B#,y)3u`Cwb"xd{0g1W 1$9ub8I]t g$9՝7W{w y|죯ggQUZ[G_e{~vHdĠ6 9n ᜌ'g_s/,Iwk+Ƨ&G$^-߸I 䳯%Hvۿ[gn# ~g>Vl#9&~|v}ɜb FEP1T0&rjAK$Lc]D.+1U;&8xI_/0BW`g)"S &Hmi|aоO-4HKbBj׃TY4!$Q&͠CEK 6N+a~L2?Cm .%,sOn'/JX3 ֓c^̰a:D*78.'SUs4hkrChU]x͛d=F5#Cs4nh]2⚾-,gw;Ü摼FM;t DLg0_8fD/pp<ȶs3|Q0?r?9 gɋQ[$(*c,1#uhTƶb|j3  { {}Ue2]}3h$4#7V"i[8n.E!!dYif4L{_]U}Vz?)".Eʌ̗//3~י!horAMrv9\.88J 3<^JU%蔒u IeIȍ:e`&HDډEOIQGuS5ZAv 9n!zFo/g8=T[^V3|tgǶ{Xq#q@gQ_ ވh)b|^kpUJ<`FIDdJkcԃn8m2M[v lc@/M^=g2bUi˱5 >vkP؄k퐫+1gӣg pZ_jˈ O\8z[*>sσ.{zfm໳ 훰 mp %N^؀[K`|ww6?x4/`l{05xLJa‡TB]UXp.ހ,sK`Vah°x?~f`9ziab0"*  B1 -0dQW mHL.E[$ukzD,L'0v A# Bಱ]D6Nz)z&g(05EwzuEo .؈bSh6DQ+>B_[GlbIͬT9D_3р +G(6ƚ!S5%mF4tk166J;U\zkhBIy]g&qr!>5! Y&5Cl[h0+2Y9y͙(+VfWP2(Ce 8o!Q 6  x&KsIV]0J`P]\C';졤aapϧw|DlY~a78tG?~O%0~1~#l^|DG x%;:swd*?]$]<̷߰G6dxex/8v*ųAnS7͞ހnxBg& v}gJ-DcY hTHQl'0C4EQT4 I<Ui :OQ8vbXJX"uT1fG]S8aSCl<4i55;Ip򝬎=Ø+uqݙ\>ywO}i/c3|h[=6WsZOϢ4|0>b vлŦ tȣɯr, s&N3\D9HL&( [es"c" {uuNҿFl_bX<2 0uyeU`z1ofi >QY;''G+\z耞gL\!`&&֬ɐаFԏ0F/ގ"vNȔzvFnsQQI$a\ץX,.#$\e2 (j $D*"1??OD[Lv"@eI&jXF)A*jan޼yۜ7P%"au Gu, ]ebU]i #:RJӛe'vdb,A]~}^+ĩJrs;,c=~TYm)0\cImٵJrnK!:G$tb#96Hхm/l,t!=4W{I 0㚠I<׊{i:ȝ?K~:wl?Z|'ߞ`ۡH*!/T/+n3fbi>Mm.q~ .WP6E+X5QGd$'Lnj2t|Yį{_/Q$tɦ)B@ rqɘ@~Q6_^$×:҉ӿj^uH+ɞgl'}c:wfN%w4V‰s(5F7C:K-ۥ4z[0іبG4bH"⚬' &u"JTs1 9$|aydBh82nQ)l- buL%pO7IuC(AHj.G%:5,x9^>ī m#7zg98=(kkRL*}d35jY)DYt;:H sd7(:s"^"~ܔf!zĝ2!H:Iauatku#K!;m2Vm"\\?O[WV[ @r :a2샑pY)vv*v& ÍUwmڕ X ps޽>|4G`v~v0;iˋsmS˃ ' Oo͆;`j.znKЗǶ7ހC"~6 6mxw=Ԯv6KSpߞ.̳6گq\m lC.8<vw@<KovPKݾqW}}pc^1TM(ضa#P0bmmH$(B!jkkk$I<(Ы߾)h&@1倀"qV+2^KE-BF%eCS},1Nz&Wȥ(]z]?߲8tN" \2p+*u~:])qϳ;שÑ.6f_]fM_F]:>ۧt -B9:jP~!na*Tf6:C A3po|9`9ăњGpJ+-}I*_w%޶c|i# z/FX%_k@4R{^D۞J$Պ|Y NM<@t[@CU|ŠɸS0>rk! 70[-!!E%f^Hoͻ8%q]Mփv``DB P\#Ʌ9Z@\h4o} ?, ܟK85 F&\&z$L2 DOƑ\So2ĉ)lne :2+EJv7,+"4EzM9¬[NIKe4!m kɦJ!L A NY$qa+X[C,i T[c3a YIqf,*˸1.]x)jj(]`&hY]L/$qR:aSK`p -4ץ˓:ZF E. $y/??~X ^X[: k+ipv>103^!T-< MXCz''evzvÄK -_t;l{W!akXjJ};\<7f?x- OD``;~bDž_۩ %]msÄQ8{}]o F7v7 B,Ԯ:`7O(J̿x }q$ax6ĺY|M ,q2#O)#M<'{Vu*T_{s#6#~ leZEو22NfWĵN11$^Oiܬo'TwQ Ax5X>w>-Kq+^rLU4]H\ҁ@97l*Qa^$+sM^SSad uQ iêcb5C'PK"iV_,AE4)csVӬw(!Dy;ۤ89z;ovz\|aPg?z'Ldz= D5N"ia.eFw<0:;:YƑ$:AM!̱P.fjWhd2mDڣ!4uEqUq"Ge&HŦ*/ih-A6"4THDDr%"*B3$ ZغDV).i<]AHLteOo:Djq<,=j>P.m ^w,y:UZ|yIb)JLQnW<<2͓8оS`y~LvCd'ggt]<78U.:u/?tʾrB3~>;9qGsAef]e|<-9(in=2d(MA055ETboܸD"HիWѶms"( $aR.i6[j4ezN("L"IJe mQbo"!D@S"TtxˤRqlP׉,h-&j96?}drb bPjV$g_$)B2C;1@U^+t9k"1Iv Z.S^'7^&;H0RF9s/Ӻg7yBc_Q E>.y}Uhk \wfo^#^'eJW8FڦKh&py!\aM= *b REEr]4"r>V' &a$Dm~ LUZMB&=))Ej+TW8*`Fw8Fvo s=O͢+t%<^G J &em)I,IZH%ؕzyxz?\%+A M P$tfC^cx; ̦.F%&i4RUԅܤ-ouRY=B $:<} $|t[2[mMڲcvv6 LۓlYp]4 4߇#; j?7k3N'{7D p vAÁǡFaj ~!5Жw/A'hK<9T;\D0?×ρ$tq*tM蝰=P( , g)KǶ=ªeC)mjJkR2|z>5Bh|\̺uJHFeiHs_|{wa-b~|cU$ܥ8Cǡg3]DYN\)n!$sX|qnQeJC;w${ A97zH:\x9 ec*To#ü 8TJ B@EJ 'u)N*$ӡin;AԢrQnIK}R`j]hR;&JخKC`cN'YVwP-QU ۽Xr`E0l62hy4$PR9YuĤFYuS$jc>)z VR!N?_0WuRl /_}6ŧ>~Oz}%Ÿɼ7X}??ƱӿgB6DrdU@GrRxo|BOl?+´~(VKKze“>۰CŔL?4-+Q`P3`9 ă&uCî{tN)'1H6ɀP(KG534nl5lQ&HctdvZ!XFP3I/JDI8E|U$"}B]IfM}CL}.fZh$;dx#˄+wOQb7LCCWDŇN=Ʃ8GLeOїxn}<*jD,+7Xγ>Nh*;XyS2 1%B132[B^YHj|#y\]gf_wR7yŇxmhOQ ;v/z}#&7bl;'ڛ4u ¯0?OKTS\ne}XmL25Ή'C?vg3* |g2w{! Sv޷ķ^z/Oq/ 0asZZfqՍsw}tvvf $I4MJ2>>:`WrH\UU*m344eÇyWdرF"=333LLLg,b```+$k||X,FEq[\Z|>(#"J_YYAQm ,.d6 DQxB.sNZ7n dX^^u]xR)LӤj.݄B!񷂾ÍFl6KѠlL&1 խQD IDATQ} a2YͰT x$ 9eG̭Tui.u>.B>3$w<;6Yy31c6;ӏw3-]o+\…Ye(b/9  a2Me8]W|Aq[~Oaah"?Uo'O>p3irw TbDJR3}x-}s1Fkd~ƷWl&2 ,0ЬqfIa# 3HK斍TFIM;FH VU 5I#t UQ*v4LBeD4Y$.2ɘR I.^yיִCR`R90]`wg6vfrEN: cgu0|˨ v)qscW:C$GjLMz*{ôj"ʺA(#9^ktJ8J(Wf:Hk,_$Goy W>vGCػ7L"8ӄ.n-Oh`-S9ɶdFlSya\y|qh;&ux wX٣ /ɹ" ~] ';#|64#}5*=q>2"sk{&3K~sC?;AGkk"1~±, %օ'z>}e(*^ *m8pl$nhl a7a:_lK/\<]ILj˵s?0{ڵI&a$~P+ׅ_X ȴۙ(0 17_adx-ap7mXnB <;_nx:t`zF:TFN}t\f}?C (# ߞރ0QyЪ˗a} ;N­)ꅥkv :`e J/!tcKϴ߃‡@,w}2~f`YL٨XaAF [,*uN{aB"s˗{YYjAo&?Wtz^'1B׍2<N ]aj>L*㽿Ydz&k}y*V ;yQ 'y0"a {*߻<#]{p/H&eJLQǟQ- .nrTq8Rl'Q'Hp{6.fj`lYd0~])P{$M](H .Zr.`Z2ࡔl. B;ErleLM>%Y٠JQ}3+5X6jEZ :OinsFb>e7MR8Nߐp]EN)RxI\3U̲F磜zs N[7)o_;49݄OZIQ/Lu}i"Kh W3з wZdX)  tܛ%E(9(1N&YY$ȺIh1+Ttc&F3L\+Pq#&>%)R@ YH~o"Q;JDqM!ffDL:S#w{h ~*G02!j@ eL@Z7 0zZ +qܴktz;.80zrr&#Bw>L}LUq8ࣣ7 [ SaxxZ3t2OI2#^0}8C^&RznXs5Z[ #݇7*8dDGp}hCGXkEsFE2z1L+n ]f! ud @NIwv.)Ak(rc`ͳl) RLfYoMQ&PNQvq4Wgl.)Ӥgrc7riڧp]fñޒx)7}GTtikf@'q?z?;Ga.ԿN7iE4x3[lp:fuuzJmf-/[p8L,}* $IDQ>93}wxkTlNտ눢H^}tqvJ%R+++<ۭ!iL,]O$p$M&XnAPYONQ%/H{h]n#H5ə$x'ۯ]4BwKJDuaYu}* T# ]r_' ܙ:ĞDQڵUK.ߗ|s/DcLu%s?k.8 "S |$%x9:eSE:,t;[Udc+q/1M^^y.^:/R٨rÓ=?;?Ku!9*9l0qg Ol [p4`~P׍06 >aj & rpez>GgrzX[H%{}0W27NJ˰? ܻ,~x >c A82 N>8\p>nx+ٿWaݵA7< ~.~O?tRS0˸Ci6N@2O>L[K',Cjo,yfMO{XPxM( ׀#8 *5H?]=r~d`R +9!h4HmđR~^Iy"#!JS[5Nk\̒Yvm.1NKƳ[9҃"&7/& |r/.2 Xnp gkX"ڍ,v-F4hoZt H84S21^|R|zIp$:=?cfkڛ!cUz+$#) U9~6VAyvFX`IlB3d&nGŒ4:zlGUű\ [ldĚV,Pn#y&)*RrvS.UObtvHi e*c NA<%V%\($ >I9L;P(VY;3"B6BP*}ʼu1F7Ch3oP8Lr_yG\}5weua #iu<73!bɋHyhI MpJ´Pr}3&59jˀ* #܄I`{H BRķef$]GI@HȠCѐ2LH2Zԥ QL$EzN$%tHi|3.DR^!# ^Lh :J)$CC}'*msυ nK4$zNvz({hvHHY"A{vԑi=1_qʥ"g>wNQ :|ѣg ,R Af WV(f8ѽ Ez8D(Щ;AL Ik3zT҆x.G%[kW(860|f56Q`%BA1f"C/䦵ĝ4mՊjz;Vh}&iD^z M(+[_846578c(VP .]AVt$rz@KlefTFzddhsn(333ٳ` _x^ T wRaUUIR \vZF6u]]((BǴm8F40$"0ܭ@Vu[zp(vm0X,""[[[A@"Oխ\(vlnnA@Rq&i>rEQ}陸Z-:rm4frꖏƀfnuGg2|A`ƮP(2F0 psUU0dddR oe<ȑ#GjȺa@B2Hq 8B@j4< &ɲ1p5Hh< izwHUa||lLRkh(&ҽ23v_y2w%haҬwL^c6ƸC"/ "7 t.Ppy&xg_$; \٘e*䞑%T *L*_|{ĽT/`t߻g ({1jkuJu0 PHB*>I%AO$%}PD ɖI(KEAW5lE,I Bs6%7IHt% sG ,pBoǐ#AOQo3]99|1٦S4L*^`ؽՠ6l1Fd< )@vDjJ\"O&(t9vd>G%у8%i~?8Hg|U,FW?Ll"(D`_$NPO ;FM< հ;@/ CHH16Hsb)5A!󬬝Fv.KEpV`:.6}UV2δ _{k,4.dKSàhX}a7O;zo/~k$< H l6)#wqL^ Oÿg?3sSбV? o#s|w'~g~ԧ>t}/ZK|n_TOCu_H9_{9e8R&LI?~lwWgK&||i;`0eC; w. Y'g a+zCBQW_cVz]P )(_駠G; Z- >]G:qZ(-p ɡ{\ cF&"!C]'Sא 5Z3dNpO3aNtM˞$t~3^IȦ8:k Z%:[8 M tN&Q!!dgh:ovT^TpdiV/L#U\d:JLRVH2~d2J;׹;g|W(ӧ41hIU = -YGe 1vdٕ:I5> I(rI L׳t9hh2j ]$-ELRH̆Lg2?dƸE-}=cI4wfup6Ǟ[<1rl0f,7`J>שDUֻ\#΄צ3=u1N6nXʠUT2zc?`IrI&qiaW?`t6bLrW6~?zqWȚVY;|v7`-)8C efH"gLҾpz <5p^.0 u:cS^'"Ie"gPZm[N︌sf"qFU631E2g5+HvL/-2=F=7KLGH! jMA 5L/HajU4H3*aD]eg9ywqw[q~ U1E%^gg29vY&HI"T:02Jq !M/y^x΀iQ4fW LLu%j7I)걃I0U (ڤ3L5`^#-t1JŎrcъ*A)ԇ kcl%UhgVt(PMf#&d䖇]"6 H!_̍fc$j5[#-s AќVzjh;htdAH'0.;QlRJ t aalGWfiCcV޴XN;3z+GCiRfꤵ43$Cݺ.333R>KgGڤA{fJHI%"|2"\W ܜo.x#D#^ڠdARmrkyߧ\|qDj[D AҸMH Ha#M4H=L!dS.8BM Xx!o6wmq Eӛ,1T(QBFj-SOIFY{/Mt;CP+ Τ(U-`j%R,Mus6=K4%slJ*#9#v@\^*REĐHk18 >Ws pz_C X߀g,pK_31x{uϻW!Zq a8kO»&~WLm0a?ՃO< ) ^^ x>(YO;zv >.x~^?(__K? aN06 iH%ȗA81\\o<\[x \$|[p?q@r/Dn?Z?#AKª Ìl֏ ,畇YqICYbBآKb NCB#\NmwXlC %QZ൬Oyt 7"zM\u%OA2nC,D*wLLVktT#0ꛌ A*DXěK[|J5(YH xݱ))S2Ag6ӓ jźHSl231Z"`װz r*!D^-BHJAo!ʼnĪۘMKr !-{an E 즇wI7CYJBN$UFM `!iȬ(I H|?v'5!@˦j2T/PM٘ e /ޞ}or\3)=iqyGRF[wjk-)ޟ`^r>!w܁mTXUgۄK6wviY`I>L;R8Xas_uNf0QkSQπWl|Օ;݈~yävSc]65 ~rͯPv|ۺN3p2ɍ49Crm6;M!uvD*~VE ;W^7A2wLHYXfz"#DDh{,ٳ/ϨodiEGIr 4iy'?bDxfCO nibPϡD:g_~^%RQ)PR3jeQ`Ae[c8^"͇ XLNosu=16KmQxuk̾zɞYBjٞpLqnH=1hk(ʝxS 69OP/:{IdM&67] xS ) (-䄄D2p?N#,~C(*(A!S#W9([n8^ Ʌ" 6sFRdUz~" "ʨ'S1 MaStgXa3D+9N4Ƭ27K8dpc͌S攉ţu7{n1zf-Y###XiI yt:.m2z&۶h7[]ݰ طoSSS vYYY7qFFF8|0u].Dz,*ry}/7oW_e{{D"as= \ecc~Ac||Cir Q111w/_ҥKO<}pHӻʕ+\|yj< Ul6wlۦj`q>4M( T*8&NW$ĸN_I"%@FEҁBUp H!q!dQkyr _?__acl"0vaw( Ը=5vhtc:W\fJf\\N:7>Pjl>V[gh:ݭAdPXl @a}?ee/#JY1Q@ٽ~I!q\ɅFcvl^8Kkk uiH"My͝r0.n$oV䯥K$h'YD9^UeS`GЈq\t e%nOFc H/ȸNQB;R~*mcM$ oXMn=9@ss{e t!bC 2q̶8Q_Mylm$1T:Hh%G*Y"Mю[,{b[GGMc%ibr(=.Y4aI~-U_ð8,;O` Hv e5F&LJ<>BN61Tkr"4x/q ={Q^ؒ>)81K[Ϣ Dak^"!AahɴLZ %2h4GXTrvp4iIc/P@eNUzi3bHAʓBM= s?^Vbh-QV/OUZU'{3b %X} }s'c?}0S|$R?|^c갰,;I(l$A/e18sp'եǾ/W~oO rJ_}b ''LZ >рj ,Xxajt=7k~8,_k7?.~u'o|pp3S$@+u/Ix} < ov6UW?2鿆8xϜ_>;"Ci^ b-n`O~d`Yϔ.#| pg<("ti]E\4L26^LǴӡg="`m3U4Ťܭfb.'6o3.G>^67[ij8T?<}(qbR$Ӊ7qCH/c{-5#uo} GbҢ;.E$;ޠ۽A-# ,YY^ǍE+'^uHZDy[FYYi`%ezlaVGG :6=3Kя(˃帇%(ZLqI ؂_x_ 0$:fILot)9Wݼzy!Z[kiY+D$o,Tyž$3R>?}'^}T0|`RG~(A(48y<ǘ0"o?#4`O"hx/'4mS~*<."Fl.6][a9}5 Dv|};&7MrP+>B6H$ORKVVf=*eұo9b/l(V\쑩)d !ABv H!ͤix~!"IG1 o*t\Do/6-ه:a 3E y\bhzEX &)2*%rL]&IDFF1MIn/2 Q V !vHäщX̴N:{ ;Vqq2Cj:3%=v +/09S,/]&<FRĵ.K{!ă`[4C̤fg2_ǎ{h/DjxnC:0fWP,R+6ע;9$|Oqؗ"y0&|7xtQ*;6#ň)8?Ϟ"nȉ#ܳUCRGϻ,BrxCiV&8F?6q@Y}&N2=eAc8}<|W0ūpT?9zc8gd;.̎B&=|{p=+npK"0Wwa|nhQaxR?\^~V0eO1863d7F>BX }}@-pa~^8o_CwV`YjUGO^KA1 _z t8{(7q+LuyMk >\oZl Uxb]Fpl?~.%ϽONN@~`PHfJ*1kI:M"73/};IsQ4PbQƌ|!^2% =P 5'ޤ.I8AiU}GNk::^0!u$"q &u&aYj]O*yZ.u7L%_V4vBHm/d+V,K&CW<Ɨo"ZTu"7U$^2&erL9bJ=F-ZݨPĒJ ;&;mb`*.l□-ihc :Kv"\1Adz hMSc#(6QYz\Voy(0›CD5?;޻sTxA$$*3kŬqobmr g%-*( /l eVSvF@zU=Y`bDt8.$vEr+E/\qb:p|=h&xI1iJԌe - bjO(Q۠$2D"дZ٘ z.A*܉ #(UG#zb Q ]ks=3lŊ[H$AWD\ƍ5rBߪgxve^EQHE,BQ&&&hj5&&&0 c_9LʮnZɷo@AX\\7_޽{hƣ><Et]aȍ7XZZbff!&4݄mIncEQ4Mfffx4m7}TU("$q ؕ]oll099iaAΝ?!eJػw/ԧT*+++0ah4d28$IN[ӷRsjvdf9:N :bԄZ,TbC jǘLGr2qhVܒ*hLckz& J}]\I8psރaE&.жFϘ!;X [&eNQ@%:p0f~bkqsʀnهZ f-1O+3b O<ܝ|&NE&GWU? /CqX0 ._[!z{O F~ N_Ipbol,~x?{soŌ Pt\-NV7'?a85YWO~.><_'oA1 #`ON T=hA' |o~/$VcI@.WWGb)R^f|1X(_wo܂ 1xN= ݊ϼ ǡ`r$)`ؾ{R7 5 [O*:)S\DCww-~/>nS fyiFGK[U^w?4p$")fh!bFūKp1S RC(4P.""=B'z2/e [!RM"Ik|σ@U ,ͅhhz"ǣKDq{.Gaa?V}OYn# n?(Fz"2 IDATkμow53ƅAX!8cyDiZcp+K6 >l^=GJ_Dg`܁+ wvЃ<Γ_YE~ANBђ5Y2ݟ|hN׳Gcw;M70VȇN3jK 5/pm167YP#@+]1^['*q<>t}A%'Md.Ts[] næU !+#GvAJɷ_<kkx~ݍi5_w9"Np6~ ]: 4ٗʿ[Nq}nNI]Ft/8I)jB@DJwb!+9bw \~ *`Eۋ%9}&9&Y^#v-Da 3BdmH_G2Qu9Z|!k{) e] >e-DS@=4߄P !+kPih|ks(߽=.p?A?" K${< JCELq3ԙrxO 2îaC*FDik jp Ao@$:Cu7)o1Tpv$lThgH]'D,"k; ,kR)vm(Nֶ<A h8QTvwL&wZmGm6ѣGiZ4kJRtOV!Q.wSTiAZ"Ifs瀠;ߥRIz!Eq˭:a`V 4w<ۇ.\IN/aϬ:eaQy;>PUu߾;I5_ | ѵQ #HDE&·D<%$$CQ!"}1Hu]\5A+n* ""CTžPq6HJ *hH=; yId5"eH/(x>`:)Uc VOP)uBHZ^Nʴ!! \C5, c'iとF*jWv Hݐȅr")zD"IHaDuIBh؞A(HHVqdQv=|(TK d)^#kH> UI@"ED_#ǣ'@zg7-*XSD}TZtͻ$8×s\Dt7B\G/(fU=:ÖfaW,Rvu},du#3384*I]unURܣ"aN_b8#m`m@bN̜?MO#SEc)~q ?T"+ᖘ*dm. myx9/|Ka𾽆]$3Gb?Đdꡈ ߸d@.]9w֐Nr;;\n00RwXYȁg{yئzPo~ #amduCT(Y%M63Q v`i+ o݀x;SquK|Fby6k~t`yKGj)}_t):Ñ6~ɖS|9_qoClp dI[B뾋e$;7;s N)#74DrE!_>3cҨ4q&؏Ν*\BǗ.sDHMƎЙ QQKp~^0^I[ChZIqeJ"-\/EXZHV$M)B="@\O ɤKhx*XBDI UF5vDN7%vz4:9‘䎃(pyj(s%U##+C!G/lpk8/>3}zϻ<{y-ķ_R!c׸3ﺄKtT'2~T8' b^J\DyG:ot0Ex2՟};wg1xfs_=Qv˭^.9ˬy7~"}<#7 zncBe?1}:bCdK3뚌y?G_dqt !c,+OplMNsi?;Fjߕo-v kG2ړ<CcO_ K'{{LO/M:2Sy?’xt֯m?7ܨӸ"y#\1xX \76wݳBh!*"p2h.?DZ`,i2g$rPLPl&5"/2㨷8{.7޽'\6h_+ JxXL,wr&A="x2eQ:(*AE7)*f'ȯb5H #)ӖS Z~?'So%06Tթ֮tIR,A'XCmWXB"'Pej%~~,N<⣠rQE~Оg"΢,d_a56k9zm9n`(iL5T c^a}|EQ2ȦJL:!q^z$I3;;#GeQw<盛d2={b?QFױ=G$DI=+*x#H`J ?!ꃗl9EdE q-_a)2>:!R¡F iZ I9PHy:F$("H$p"0R#R *:I$S|R MDI d@ tt C@Q\57Qd nvJ"_PwbUA?8ˠ3HO&.Rfc|IGrͦrRۓet[7O]Cb\H'㠩{ȶh9 >'((n(p@vijR+.1ۑ :yy.¾a\dOݜ.J80"뻖prr:A9RXx6ΟфN-1ſbgR|Q*굫|CE(YnC= yaD[L&Jj?K{AHA(8-*!nl%kb'Þ(Ս347_[NEEam#,w?}` ]W!jƩϾq9fLauo~7+}<6 L;ߊ^8G`_C&58l䡘}ͥ`דON㗿8n d{6| b y{>+w_ШE . ~mx鵸xs ngƉЂix;`{7Mspy./?{ɩX}4FG|}1}>pNĕPb](ǀu8w]03 0 S9{E ixb|N,3w櫶VN#_ ee_N4.DMg֛<ꅘR1s>'"5RADOkqϰw䦑#SaV6/(s}Us  `|)LВT-9ۣh.4=aBL $g Us)6f/ KQ!JtWH!ReH@w\M1$̎IiAOM $̀-D>UD§&к{\<Mü'=­A&"as׿dN~%'årֹ~j8C9egsy/->~&_>M1a /3qcxkYV9WKeJd)Ql͡90^n]o2%ƒ i&}we"Ri8ρ΍1Ln?V3l 6;vbIxh1z0 2Ѳ"w닯ﵹ—zv`F':Ҡ9DAaX YEKhI:+nA>fN$YDJ%CFͰнW43in{0.c2ý4wZŁsjKۤT[i{|M+-6{_w )AϚ4O/,yL*!/SQ* G vңQf"F*F mby$vsHL$/ZU+0IKh G](#i$t' 4 DM1R6j`-BMe8Tw] vQ2Gg$fzYShD*ԌRly)Uzt-^gܤRHĴ®C/Y~(җ٪4vL`Bĺk>NILrxXM7zrUV,.X 7Hj-eZ6vm?l_Ļ0z(K JGj;bku<օȕur6Ԇo!J:uN/dqã% U<ĜuINSXKDI ,`[i^:f0ܻ4)D"Zv8~q6IdPܼ7~B ۆ[OC3-xS`:xK[c'bpW0F̤N㪤I NByo}tO=`i3z?r ~_'Pe: ݓPW_]p}7 N£C:p[0dnWՂ= /'GcJӱGz`vӅrAJB|~N]n541+*|~Y01Ý3쏯7=Gsc '31,px h~p7Fak\?'xsZ_ep6%x|79`/sZ@9sewrbo2P澽Xl +Tdo1K\ƹZ-OBri<- uDBb 4"dmA(XJIhg+i$J[rZGQQ]IH*ln؊~dy)Ė%C  {;jXDe !ZВN J*Ȟ+ 6R<x=4AH`QAJi 2zˁkF$ @Dh0=vQ\7]?~}#+éKq`V!d2~ ˋ܄>,[1c}`:\L,xݵ^,w~ڟ= + o&5Mס/{@|V0bp<>ZC5x8{cr3{6LCmAc- 0UF0krb\Zjvx0<քxAN2r6ЀgֲOy.,5s\[Ƌ4Tt`aRNpȘ2AqDE$k<3:BQL6J(ѱ6"oZWe6u&S:C;GtL DWB NU˨6B~@ݳ;9!MC)#%|#THwXr QhGR$:uL-AxdW36I1/CIF32t6}QȺH/̡">m!NJY~cN'm$O0-dD2p$P$V`(by.j4s8{Zz:{ ձ (y Y_`ISrLfsq&AJ΢,)lY zFƹFZUdW#edGGr+1渌]:MH-ߠ] >3|zZlxJD=FK`<#]YMtyۆ81J~YfzpjUAcևźHByګ |.Yy%xdB}= n=>¢zH_M1c1h'%\4%9$]յP(1be27H ,WH,]Lfxj@d%}}l!ZYhaJ05~}U2zֱ2Š@Q+w_{C,u@d4Y<*Vʡ#T6CeSSZ(Hf 1&]. ?1sT'81g{rs 4Y&WqtbN:hM~Cw̫./) .ppg*}),O`p0O~/+1^ IϢrChMh>@m8k&8, xAE#O k5a|}  Uֻ<]V3Ys?YqKXC3&87~Akq2>r>9zË?iȼ83c$[oz* }>.:e[A}+e @`ԬcT˳y={E|]w<$I"aYN|ߧV188; {;=:Ldd2TUjNH`Jm  t:tzAa:aJ0MsǛlYwfqqq'\l{y* C,kڶm;y|n3}ssb';l6 ÐjA[o vɓd25 (I`G6 ޷ǷضrqT*;`myc{ H:եP!IGVi qa,WTu We\|M#ԷIQ%#b&f[0fdL1D -\!.Q!*:6DqE 7s}FG-PU`H" "A >R4O8H 4V ~ۣjDd:]$k&=@wj< o% Zh;&{ɠE&bk>FZ;H`:H'CkEdp$5_'6Ign̷m%O˫= +hKacu^"sIfcst0@1SWu8HA*`shT@4A݌0[I" >y`@Hݙ"V+M`[G {1 ͷ@XeJdNr'ps47ihie,0VVm,Q/ svx=&T"Kjb)TgrhH(9J?X=j^ |Y/E.v;M{m6#CipCipgWB XMN o? nex|åhwecVUZwG"#|zYS/03}W}_|:gyk0A:뭘ce47'~8ޛIvםogVfU]]]7@ D\@HlÄLK٣ ;d[)#Y QDR}_F7z_%͇l#RDCiBo2w3߭sog_/V?;_߀!}nB$[ Gb;o cN0\ʩdVKH*uI'8= UP,38ul[̭79چ-sZ}=~E:i -c?~<][`{/_Gȱl;x2I|Q48"j螗J5 Ay3^f߁9PAP\^DQ[Z"(# 4ҵ.ngzRcK._. d{TdCy5Ƣ!#[~o ųGPfYBV(J$='`;s +:V&Y":5u5כܹ %@fXGb`V{\{wCi~~iCsx:[i*wl3 $ w/I$91Y+G0eQxN`Fbj#1.G6A]ۦy28f+;ªyt ipb[")WxQiVlyC8sQHU^$%&5U4۷94/",SBdf^"#G$"A'=8Nmww@];O龑O}J w\/H&6'`gUna"wӮ CG 홋}nWaaOa8< _?v gяM5?.}9g<ܼ/wޮv?~`}nm&FX/gSwl{`v4ނ^/]#yN_o{վD<U;>ϱCNGnj}vx7VN:;zgrFz.nf@Gs_RvVCnw_#BR< 85l7`!c:;\Mp΃d IOᖪ 3'fGS{?5%\#fXwsLxz ?p#/'RDuOqGg8+ ʧOH =')6lF.^gx_kOBS*(! | X&2*3~ 7 =j=ȲB|x>G>{DrF\B7i3yHXCD%EGz;_o/5e7b:X~Dؓ+!}wcUv N0M!lfk8G?뤵!^Zb+dw* Lh xOz{}\_`/| z~_~0=>4g/.B& ?$LdM(`|yOo?U5Þڍ~NT+3٧#p`lðO??=ϊ b_2]{ٍ~={b{>BJoV/= KPLG 9 ?w ,GFehV!`ƐM7 YLr Y;ɃM.*Ҍv6\nVsHw/mQ9i+ IDAT.yy묧Ktfln'ׇp.g"Wk%|HylxI倝J8a$=9r)ҔMN=CFIf-Yچp,QU:]FJ$hq,b аUN QQvIJtiXz>{ fH"^lHM>k,* >:2b$X Jm :4?|&DH|#/sn5::;]66\+&u ^$!;tM/-SE_Yan@`IT%6EE֖NЭԱ3*r.m+jю bX{lt֌#ӣfrJ j W2wVhNIkV s24\Xg͵+?]۫>0SB [wU8^Gfut#GablS~ri GW&sbnd5HheVCfY0tNE#dd R(E*Q'fxu,?M[S-jq42CYqesҭ5$sbgӭV_ٮ :zEӒdsܶi['IB\>@gNe,XbCӓ ;ēvG(9SefɞlwЭ "%|d"M`K$6;TeEcVvaR+Q&1]$ns A#6T"Uq -cWWW9vbZ2lG )R%H]Kľ#JGW$ S8~S')iIb>a~zsvL`V! DLG?,۹!uӴ&e}gI\̐UAUh 2?GW14;̵򲿟N4=lmbՋaC Tr/GDS82H&m0g^ܦż@(iKT>-M, &Q:6NlN!a@܋ l6:Z ݈-f騈Q/ պMP,3>F!ek fpXx#p*L{ 8}>^s}yv9\XWwB_|}l?hb*tZ}KpH|: ݷv}6]_K35(4ms+<3u .-jb~U~i/F+o©ƺ/^K۽fr?t^za dkWJW; L?7\; g{'}Ge] >k|8 p||CH)xwB! 6ai~ [Zv \]Gm DsM.=EG]"4&_4r>EG3,Ʋ̈3ZFQ-^v>1s?3{N732/O YJb/-p`OƮ!Jei 3\nbMO2hhBnr` G 5ipJsq^uEAqY Wm%vK։倶BePА@oHM!m;Fwi^?WQzMn}3סa!cMpC"Qǒ|aI,`~m6## 07.$eF`"`sd̔G'~%J[t̐W3~^a9C3wAOE/%?Lg;P5+׹ȱ}G\ m)AvIfǷ~[c*z[ǩqa|vEGj[gyxCi'k:x}h|-f9u{8BJ~f+KkYdNw197FhWcz3h(w8DW3,\[䡫Z,budLJ(mgNe;~V{l&qLxpD>w6s\8EVlYbeV stM´IgEðLr9;~'lV:dev<)%gyW"KQskqm0BKC2 )œ w:A~JI:H=E,xIZ=E}qqH=Ml^˔*yq`B8bż %뛛jIh*XT`} |q?Jݫ_?zA2,3b wߞZTg8`E0AH/&X=_wIhm8FFA+4MNSWP] 07& BbtЫjJ\=j h["W4U ًV%oH 6#JC(ƸAҶ =ej3_a9eEQhZ֒wlUa*2H/>*#6!z >z,R-#F\61&i^&/skn3)`I?8=,|rLj2"[m&-pqhr~_oGD.47cO;I\("T"o(B!*Fak#vE@GP"v0`VVF#ǟ=f:k6:x92G0 *m;daiiRK$2Xcw!1&U5Aj^aRTz'i;'$Y:bl |CE<ΖB1[T%Ĥ[$&ɄE%<62w}G%RS)0@J ȔxCtQtnhB3`0wVJ-#ddS%.#iƼ4jL 8G =ЌPBS$Btl[FD"D6rU#XP6 bKoPݍ뜽ƛ̀`HrBFRhe+-j"dL;&Wq|ʩqDvmdG[ ZKY/WXS 2ڎ6JҡC q D+hK;QN6],"mBAv,ɐ/e2,YYQ~*ܴt{i&0WUSB  p=i+k'{/3}޳?&u0SI8~1xoҏ`Lߙ? ec|xlWw/|Iq/KMA7͊wAz(;{˓}BjߣSބI؆C 7nW^S}'( 4|O\m0;éj5o?ozz ~x]ٟ!{پ!ߒzr9!u|$AǏd+V&?ai,Ǜw2Fq|i1JtQ^w(dsÌ9I=wcAn:(T.^6tEN9 B泱xJ4cj(rVi@zx"g,Xg {pJ6Ol\ǯDz<|IVvt;^UceYD`#Vl Y"Al58 71IIu1j0;L+'r6{)EC>|.9D{=Ksբn7~59N{|{BݿKk=zuv*eN,j9r}7ó\EZ{lS ^t%ϒȤk|_JPt(s7pP{KDxv7 wfuKȻ.L\_}ʗT& {n\N|u>va^^} by#Ihjܽt/48"0Nx*wVlbL4hENK62SvP*S9MF59¼=p^+gB(gi,̓Y ‘ex=׈zXV2 wF $:^LAFN V(1[$%Q{@dMٵOXQjs^%C|6N#!#*$mD-8%1SGGxEvw7qZil^bҍИ8vWI(PAg&c}uy-GIL06=TZlPm1ݴmEW,Ď*jlE!B2"Mr"%ƣ,"S!`+ydOb8mXWii2Bf &鬗%ZZnYV0['R]=tCB*6Dl"KiDH@JA-RYyM5~"3g1T|f?/>3uuv/$5@Ũ¾N1|cJHUHO.xy!ܪ}s/5em Tj :E)؆ĹR΢3 )97cȣc:ϱ{-~b=oNk7ɪ23-U.…8NڠRN^e]7Cύj cpK66ڐPwA|y>o#>v~Ĺ8\Ykz;i_KU L xYwj> .}}&0Qgg*|_ϿLh' W/]pd7~cbԗr}O$# 2~Y#rk X@RS4-^$1dz&j(n1,zEct$=$96qJE2bOAO",1$Vw:(3"Ǜ'i~d#v4JPXc_u~c1apMT.=&Em03Q6 -E2Xg109N]``kʳw"gvDA];S ׊$V*tWi?Kj^c+CE!>B3fc.E :+X3$nF[azy&ߣ[hOpfEH<͇(rp13lt&O*w1:Caly7U E%1Hrfu1v7XA=\7 4N$ʗYdYM21gr^^?MVǼ zI˸^rEnqĞwtn8ld\HդV܎ @+@B2#:[y.Sfm!zFK$!᚛h[]:hy3;$'dޟ%Q;s0Ī{{?N־ơgsSvmDb3k4HJI$I% D1١^#HżsĻws|CX{G0]P{O_Rk,2m q,7nhטJ]ea`pΦayt"gˈ:FH7LTo#b,Wu ŀFODMw(&;TZI4 \WW1aNx::C쁣*$_#q0$G@$b"# $r 2'/vo [S1#$%)&u 7$c{&N`J]소,H%6z_= #.M-RDz9Ij$}cbdƨňX|K/DaD=[Xrt8[1'|Jj=ȝ17E'd?ORRT ZNL[>Ť@"\S=w%E$tU^Y3BKO4D>mIV7AKt4"``.Fb=,2_qio򶫺}e%ha!$V0 CӒiUU]U].mx3B ӻ3;sh4sC7><${[)utMVP0L7[xa- ]r[߂nj5 ]$s&4*5: zaԠ4t!pp%?aj jó e+ i^Y6tɒ \M䇄Qz$T=*&Iob-SJ_J v[iFoqBC{?8p^u{ Wm`X\] {k IDAT߇>M2o 8w9Τfy<i BpN -͋/-RKr E7zG g_Ȱ84CϹsJ(C:Jz<ѷO5ƀSXզ J,_: V wޞEܝfSt&Le'a`ggr7f4k[ YHB&x^h4R* ƫTYIC5r˥5 KYnDymc`#iT"۬ӄ2^g eb"cЫZ!U!ʃ/YfyyReKO^-`TSCq}zjHD Hg'!" AK R݈ |`Դ7g(o|2#;4&z#8h W aNCAG$Rx$X%r4DHDrrUFW \4|s*QTP"+8 {U "`u]vGT*.! QfO򶢇ɦN)Ofy6-[ ~N"pmwU.3[̋wTXV GOr˞%0O}<a_3gP,^rNI6$U,W$ˣv+VM;cV@JQ+(f8 <-S)!-'x )t4[FVR4E G4D<ߦ$\P;%3dk$ 1ɖB6\Җy41CP\(Mc 5 %ڄzSLd@ fm^a{A]=HcZ"f^橄 N&}A@ڤTP h#2Ea7PUEHZɀYs^(4͈NkT|^,PExaÏ=tͭaD Ɩet@"2BJ4 7 =FmC'fS/y{Ml@%{\ҭ 0_Qz埖9{> }$Vagٝ0RtOp(49%Ο} nW$fsk L Čjn;#Jjpq5u4طΝj,~,052SKbq8C٘B=pkJU"Wўcbž}rD X 2-~aV_}-v|9 T:`8cjtB(u0)F;r%!Ȥ$r6 %=)Nt,vH!/϶@؉)HU}:#ǀ!1طpyyKL"!!+"! fqSFalT 0";<Q#Or, Sl"6JFQ.Ȟ2Za!.Z|GE1_~hQ6۩*>_tf[8hdhi_yhT39fG{\-n90̣ Dmo$Xʗ@wA &3*3v%xX\ѷɍ2Еh7Dq ty<v2+rØ:F8ڀpC AۗCI3;~+443rA ~7zQkkh1vOcmU;0v9Ue65y|/Y "6Sǀ|dYk$I5[(Rmi,u>Emg,{ ,復4 tQZs#˜Ƌ"_ RI5^ab%/G錮b._aj[ &80Mt͒v JO ;qh^v)D5w"Wy| l geqE`zK y >X涼3S֊L{#&lO2k~Y=fX﹅KE%<kju3SLn-¥#gH]E5K@AuYc|?S|>NgA;Œ= ꏳU}Pl,b]JdD})O9ksdG Wi^b'<*R1["06&4?$u1 Iđ:,qH.M&WC>Q~ *@$t.+,<3FI6.Rݻ)! 6w9qWս\k"۝&࠘aBUUԆK{]{?˿qȍ)o3R,_8J$QB,#Iִ$e}m+`Hy .NQC )#)N,6`Z]Ƃaeۣg7HhT:e7d *9#/JZ.:ha|%.%4.At3:ZE l=GZ$+؉!r O ).Aì0,R##0]{1W %G2#Ez:+41FQl@G1Ew|!'dѽi[} Lߤ-FDPj y I2šF++yn,r mlHH:"PV#߳όu^:܂vp>ع$9o~^؈тLفf+qΤS;GqޱPLtv űFXGP);… OYWbC+W3Yq ;aP,~ϫ? ^w숯F3rmZiZo9mig/8gp K|&(0>"ሔ݆KsW*a4 0(*QkYҝ7skmVwϰ"tWb_G:aQwfTc)v]% N`\юKV(N4A_2F+:m/uɤ(no ɀB C/-}"/h_0-=モDyo4?cs$Cr"q5"vYvQJMؔPgfYq'#2 Ssi=q[FFSHT U&qZU.sw"_k1f25=|sVunaaŊ>LbYiǜg~cFwuis$Iб}a斟8o$wId.a֌{}k]Yzxf(o92ۗr@|Z: .sی 5n}^zU;>jB<90K׮qQ2e rt`]z.TΥxGؘ7kwG(|a}>WvH l3fY'߄<Sߺg ?9n>.++8/ˠZ}%/raǩE5H^FSNLcV -h!55@od%NWCݰV..F;nSV񼗏b|?4lFUN('҇8p)Fzr /L?)}'>]&\Yc8%rEEpE@Sj JeB]90"{IEqu_ެ" tBV\#Y".Z-K3j Z]Ƞi:^4aZ/BK+I$@VCsXB/Ұ;#86Zo.2H@#9;M 4[4 mL/:y\[DA і%H)B$uI6jIE(4X;,K6k}-Տ,za(2^"29C7R?N!y*իxMkM TE|Ǖ441(zW,).d*^Q1i&H%C׬#  |OΝal hS8Vap/,!9 _p`o,Ѿr&gc8_M'6Z?1o|턾$T+y&rfm?^xo| O\k[p!&b\nƹš-3cq?@ 3zd>\> w2O{w>z=z6دN]@р-5qB5fujkfe2o= 73K cgÎXB]Č];?Gb6w3๘9| soM{+V>xg[wrO1?-A@G&D^*^gZ/6N#G'!\y{#3yCiu0WN"X-]Gnq,@a6WI- Q[E0]0mu8c@o{ARmR )\s۝~HB7T48e %C钕U]/k{`H$ϽK_Yڏ'&#xK"5 ?`wR H&!T@/h!682fpG6 +J{ 9=>:-.ˏ}p'=ӿlW/Ҽ~꫸O5b9B(aK2o3 y^OLlL{j3b{UNG _d{KO!SK}koT**]FZʲa2i铔R0PeA#^+6x>HOkZ &JI)fqRŢH96+[A][‰RՄtxAO#wO| $cGI/e=}[9_G8D%޵;d9/'hX)p?EQtT]4yAz5_qodhSqhdT>>ð! +4{O[ҟ\ v>t9AnHt~|;)xH%Iis IDATJ@=[/G e;V]E,|sE?1D}ᓟKb7i8RhࡇanHdEA xrw8 -P$3X= >uv@k? 0Tp}񾇆L 86y"̭ýĎՕ}g<' 1hsڂ3Õ:cGaSlu8q pl:6e~= ewٚ3pe3Cap[a؉+)a5wC{G@D4>_= ?Iϖ(5|n9}`r$pP"&Ka_Z5vj|#04)4N9HF­#5Y= K> @ Z6[%\+f"ӽ|]Ps1Xi,NqüFodq,}xf6/28.&flKoX'Z"ߓx-E;nB^6p;+<\# t<7'lCp>u)* [7QpKmd$dk(IWHX;^\~Yϳ,ml6Wj|ⓟYX\ǟ?~r,_8x[i~7E3wHi]ױm24.^~nr>C6iF b:k%Z]ܜW< r4M\W H˖ ݎHce6c`DkYGq:!aDMdVN'D8[')%TꂈךlU4,ILIL$cky?e^$DE@kw [lE*ȳ(;(U SI1CGYf(1zR)@U+v ^A1"]qCs\a##FVuA1Π0@׽fFU.-W 8BNL!enp[[R2"4,s/QSlS"|zYD2@rDZRϫЗ̲ݖ0C$t^KAnXzfƋriTO*J4HΓS4ta"\Zga1 +I<]%5B56дN'U!!1*a.D#Jdn'VAS:&Qqk T 4#cŠj԰a6")eRdsh=&)NϒL}WV!}`h(l|zֆUB,ڛ4c7CU%j+i-_ŷz;u,S "0EHNR35TU O: 0uz#\$$tXۆ5Hg^30~29TL&fH&d)hN˱̍aAhZ4x)yG x*~=3\/] _5Ex߫`]9ëK YG8رȁi3-A(qS`Jߕ?e: tӴ˷|>x }fŮD4ce0pwrFx0?~~ûƿs0 ]j xCb+? 8뉋Go@矟L-$yzq7݁ Z;ۼ2Z;½Hםoxvh71]^Q.oP^=&]]+sVq̠,57![Np@NQifRa/iݸû288OfAQ9O•dJEK i$@Hbsnd.⧁H88CSB[ z]ܐP!Lm|W"\l' DqdI[K&%I <:bHg;+Ureq|b6GAI2WdlM w^6&U O/kMh0+'YDA]@G't*̩] K,EWi yEO*k\yw21>͟{KStsz}; H3#͌4$Xe {kmX:zwkA$KAҌHo7v>9=`5_խ[u>9O99.]~LO159`0`iy#,&'<8rsswsRk@ae jAI5 ŊSr01B- )*lH. 15&x1CAnP=L&(MXdנVD@LP>=t8QAYm ]z:I$ f<];HGN<`$ءVqheꎆNLO Uœ[3U##Y%3Mabl'OrdfƟwwஉ={nN^f<hR8&!'Oɐh]|S՟?g0P"dkpPop*|뫠07WЇ{MNaqچKgjΓ|qOtc6p~~ slHMUex<uphǯ&L?S±°Kg`/F6+C/ Nn^ .݂P)hU7TMxа;$0W2p`>I …0@ \ so]7³¯!>}.o~Gz}v5.8sfa+w?|q8c!M8>Af뻩6݌"ӄ(eKe!4o{Mn|T9*[#~X|'7 )g{g/\[={'XL2~CT<jا_(w~!?qcϷr8}%*8gZ"K^#@0 D!;:X^ N=f< ;&v.QwkPDI};,M8%T ETzA|@d4b 3! A/m t&]#@U\D@MϬX&J$rHV+;p((}!HMĩľjDfݞf $q ]tiLT((٨BZ:>Q$ SPQ! TܖVAǒHQ@됓FCiTƬH⍢ .NB,b{V˜T1?" j;b#N*2#aNG| )$>`:v~lkdGk_3?2:Yq{Z{kE*q c[̖_<άy|գ4?Gy- y2 NJ-/ƧOV4c*\ F<,PTΑ׈g`iD24֯PF{Ujш#~:N*Nf ϳ;&?Cꈤ"X]π Jט.:D_5%2>IFAO\!;EL.QlgQţLlt̐@*S$;!/ϢY~&@!r$Z mEZ N?j뜽NGn' )~Z # f]R~m>v|hrJ{< f-][)0|[?7Cn G8l(g ܽoإmtp]vkEȏ sdž3_^ .\n>4,moM㇡~gVgW~ñ ?_ a`:8L౧!xwEҝ< _{}t==l5P/aȃxՁS7ma fhH-v { T ~ O5kDU%_Y|w6a!ťG[7\&ק Vxj*_ѵ?y)a qO1+!XwvI ɕx,~;h S#kfo~Q.!~[Q/ŸdJ,ϱ\aft} qqMQ:b)K7b=zv %}BPuQF"+S34Td+%hDI€BV``븒D&f/WCʦeI6D=f@W39DzH жR;k1z;zes!61%2pR)AtHWD %PЅ=EЮXaN&fP\0( Ŏ`fG4h}HtLtS$UHLTBGv̌Dhd4 0 KLhiF6WUD'xNdDf "ٰ1y7P't16lYJѧיdu=vDk;I3tThPC$weR [b~~=G"#Lˣi>ƃ.ﻓR޼G|MD\0#z=Vwĵ776Hif\=&]+0 /:l.&5.;lU9EM.nSodo]]FeE7#|#ErP- IDAT$"ݜ#-4PgkXF>t Vƿ}g %1̫L3865IgsvUU$dW-0ҍ;- N kI_Ε$80Ch쏙< N1 _z͹{ʈndAʎPc<ˤ)s~K4€9yfcqZVG:i}Zh:dC9ϝqe!&ܳ*1fpO}*u<!c̭ikRGA.?%2o?&Z{'kL͸H~w\4,ˢ~Q~2mOq]Z!us|ϲgn;NKlll|GyPb)~ ^D C-G,GȩDʠŀ: JIG ?`:WntxGl㜹g8%vրU88_9wHAҴW밺 h*4{C`߃;] cV֡߀gw~x r1a$S;ooؙ~|ñ;yaʐ6~}rI}K~ Gk/|#!Qp2XB$N1FƋ"ԙ `T{/{F'hl #pDN IƢfou!rl)%c3)2.B9oڮBQ"Ttr}8Bӊ\n2Өhh[J'(l"kɤ[7vC@ iZ{yh#=AD0lLn/!Uf84U;xA^ 6~*% vCj^?W&w'8;O$OI$Is߱sϽ"Y&~B ä[b"*i#I0\) IcdFJ,(HF 3ؤi|D(uhE"BI 2*FHҴ ;fH- Y*NR.Zt,"Gl$RA ;HF*LtF:= Tb 1\% O_ {)18"*>b wED=@LڀnbR{)F/Pb态' :QmҊ֠dyj.""-Ba[ڎDA-4KX#g_0g-UMUF~cN_/L6(;XA,*4n 24 &D xB[6r0同'k4>&8 qj)ndyxH9c / ( '*FRžsȠيɇUXl(m+QQ~r,Æ$l,x3R^dzw%x@ĨhesLC$L*Q'&?c= ,ˌ YŇ{Rxo:'jiJ ]ch UBj'hΜ+ *<0<-p!KH&'a[pp)<Èv: sա#o>W {C!:߂? 0<`^Xag`qy84h}paO0?z u=1tcnn)я9t~nv9 //ƒ'@OÓW`-IU+c ϳn}xaXA>S~xH?m Bvoy~8?P3O}›{4`A.|NGgdvNx- :~\`T(NyJ"ptz;[Ԫ3)MڋАxN1v% #367KA,WwEffݠ=qm++\.g8Q|AwUdoCJ]J*9`At++_Iiϟj4k &DHu \ &lBFFW%%<4TXu=s9"V; b-.kX~-9iEBc<{5O9R-W ԯgOr8?ĂpV(d\Vح6U ) ͹)qK2(Z˴7Y#1b"n9~$T\.{[L>7T- Klz%# _1i_Ӛc.ى . {QrO$DbIM+ D $2ni؍(DTQ|Zg^̱;[5uܰN}f*vivsIޔ؟>K/x3D.X@n$G[e .ͺZ='^z9¥?{x qH(̐j/QYtMALLʌ ϶Q<~+6fE]IٛU(s,hWfSvcl`CSZlw$$NH^}l'>``LQa+':I!B*x;Txm.SD2}tJ## kEyU哦ԧ!Ej oRjYo5od5'" QjVk!,.z{$plk/jBBوb"0а s$=img ';a1^r8_aݻD~r^DFIK !Z $ H:]IQz91@sC A e;⦶I;hnzf5]7g0񪷻^r9t]E֭%—>n-r~>DXdeme!"_˯=t]nZ<{9}{WW^Gc f&1dXFPtxa= 5^61AJٔ.Ǵ~Ȯ8YXMivd#A+I(itekP]YYN#VA3ĎorJE+I*CnGmHJSc +t]tKF.3R:AĈ(Č*noDzD)B^XCR+89!GbE<"đ#4]$.]B0]!#/ECl1FqHBϢI;HJ5Tg5 \e1Alw&>0UZNsz/g\8 r$e*hI50>u8"xa5Rߡ]=^K"BS-c-?%D})#ƓTv| %Ѩ*]ZA|Bhub"}ؕqEY`ep֨5;OPu=菍ҙ,pOH#*:r F/EM̳48xSD:erkuk S74>:ۗW9Q>z=ydwDʐa{4J8Ek4fkr<\J_% -FM=}m>i[}g'aa 5OٳģCۡ@% hC:= Ͻ ڰ#P< ;p!KXzm@~:_`4Pk =N׷ nCGނkWᩣpe2̕ACw.^ ?W2Cm[1ag#$|4, )..4CӀYςaG~ έCO p[Z0&|w&\yZa>7\T|\P^o;oX~S6زc >n1Z\gTpCԾZh[+\|d41d nf* wE^H}7X*s-J7:1F{!H\n|{ƈȭk=J{L*T㇑MD}} Hͅvro=`ƱY/HSc6#yhz'^c> v D }c-3}̓3͐V aJ%72N}z);UX.KBW;E,;QJ"7}L+pb}A^i!gw $e8Y aO3vu%F]`}9\u\H~HWTU4Y{PB8?0rB`"bڧV{lr9&YԠ.^[zʵ.^Hgj4DI&z":f<2*Gg8̟2$7)Lyqatu@l K .Fd4 {2A#y}J!14bKL)F|>4Wn,WJ+CjC@Pl"dtaXe4ػ>'7y1RMcvr$H1n{l_a Gik1n'rTdSc||?=678yo/ !iqG3/}ei1@Z$) xcAF/,*FDFH)U5wXk{foׯ^)oq+JSG-)4v(:+ Vʉm0%m옋L 8壴MT(-;Ljߝ'(}G~i /|y|G?09V9uUȶ:̍kf2ػG0wHw xX{iZARJ[%{Χѳ\jqs6uwLN\| b/_=qHϰX9#Tˏc=EUa0B >TƒW[XEU9*}G5EUu~ If:c7C|Z!rDDf|oƪݽD4foPAm,//?sםmo6?'M&cyo|e>ꫯŶ_y;No S MP5f!nP9?I?9!ijHZn} A%[c#n!WJT&(m="PY*$)y9Z`'lF(I1cҤC0hS':vSC@!l(OGt):re9EVƥhhYSE^T* &[^9- i9rUK#*s<ֈvUT]4ƌ6}ʌ#3$M#)[2Zfbj5fw"9ͤlSW=V6N&WA-6A=(sۼ:=|¸nBP=Q 'J1>bdgh*뺌/{-n6J1 8rH3# wMv%iyFrM-zI<5Jvz]"P>@JcT!RBL" dJZ; Ly(Z TFtkt;P\_E$Ep&f*?#9'enL"ӷ4cc{-J;{H v!6s0Z[`8޿ ÌaAi(//a| yz߁w}P 3Gst tʏC0yM@kG~ *{a0#`XP[VQWl;n_oأڗ P3{A Ñ x:\[T(pG/| jwRŝCag ކ왆.}ihv!XWt{p|{so&. c}pή\+[&̎Ľî|A_m6b~?VPPh%u;O=Ggd-C6LRՍQ{j9-d5`Pv_Ze.{n-jrƘI,SY!f yv?K6ƍI]']!BZAkF.צ\-[cl닠:7 5TDFRRK#c-΀3y5j]WOܞH؜ZÍ\.U\\]Xym* NBPݔHU1\v^~ uE.P-Ҩ`o7AR)Tns#*hY? ΆMcBu3,l6ʼgMs ګ5uwss1OxIP~˫Ȋ@'AM!~w2e Éhaf8HrVyg{9_q}B4MJ$2o6 N".z"k-"jvD¾lwo\u Nm>!Dָx4J Ip G_X,Yj|l+H6yd'NPHWHuM#*hz>fΚAz2s8zhoDB[_khhdb 1>tacYBO%O[9nSK8vo50s9 /4|@c}YmQ|5nƍ,۝ޒLNO2/۸kYgX9Vt 7 IZqM_5M32? Y柟xPD_at14yiGX&"wdJ12qn-:%< t)Km(`Bm> ,&hhNÂCbv̏dqw -2T:6o -eNR@t:(QڢgN1y)\:`DZm k XR Ӭ`wk <;??g0BYmఏeTV(:x^-rD3KdYhMPvC:4B94< >I4mx|d ygWao| NH?}Ɔ`t' L7k#^\`#C^&H,B=`!wj ᣟ;p==I}N%;VM(̓Qg;V Ӑ̀섛j ķuڑ\,<xtƻ}w_?| xa>a|c9cyCW nB;;ֿ (D|=_=/X KPv|@fA g \q'2'8S! _EApZ(RI@npn[!\=p4Jy^]0LlnjƤ~IV@ "7\NBP;8+S 26zz41]mܥ& zh|bMkP6{EAS QMP0H9Kk*KlOKj˹LxFwe7m[MѢXS9>N_^e %uKD:5S@Ul"Vn}ˤ]|*/`5JFhT9]e,E!&hpyn4J ukxBsM1 {wR?hGU%hexkvGGV`.jX+8la}SQdGtgGf,f.8~K_&3I9P*kuFuFqiަ靤KH%lTef+ئjSh~l50-tAO&/qEJia $[a<*"S݌$$Sy~_'"a{]* H`֋ot#56mÊ/_"k^i4%!s&BV}'sȋ/s&s^ywH#dz=m 895ܞ6~{ 2unӵIд7*& r.ܓgg9ε|zVES+ -_/%a##· ,2M }^o(opxy'xlބ aE$d+4<>"fu{F%qiUdɠ0"5cFw"3&:ˬ45 ELq9#\Ews=3Gh_ [ʎnkT k'bm!%P/rau'g.RPP5kwȲL(dh>c:vWÊUl5H7Qy2Ϲܮ,&uJ[X NC$mhHf6FQvk+94K(w1QI1-|!ⵙLB1m"TpĨXSZDe#.nG7ᣒՈ%2xPjjAQ=b Y@|ކǷs"w_OI4fZL].KAl!JMOt_WYh j6% _j{K vz3 օy<()-Iˢ+~>P1Tɸ]wWMYtc O\N A/b$l-RqXRP܉T`V (:ݮaJ-4HBU!lGz9C1.L̬*DJ\ds" EFGNY9'hM$ 2]oc숢R(a/vj(rvƖJvE$H>Zef*C.]N'va &B+oRj_lT|Tmr 8] Q,U`%4B",  F n\q͓$t!d=(1hWJ4q?v{3n$cٱI=(jC,7ΫWӅav_8 O wsq(˯x/,j#.:ꈧS^B6 Ǡ$.@#WP P¶{;5|F:{F::ٗx}^09Vu~aex%䆹X^ 갺NdОp'\L $^70o݂_F'4xswlu|ǗNՔ,uW <;I6-Cq _6\ F{`1-P~*e 0ҹjJU`dXL_'8?0D`H0uRB"`2GpU5H?)@hfD{s]s{a bbK =B^aEcHoO^vG'F"or5҅gW<Ń^ tmo?2ʲ~&L-v Hn;h- VZLy)nC7m|[̋>K`TsŚ{RG!74Kbb uɺ+l"ؒtXWBK/2]Xa >EbmR}=(w`i ~&B9+Q\~V:+3ی3SPYޮxL@2T;L6/ oߵKBWH@4Ȗ3XmWa6m,{O Ν!O.[͋ÿCn\s dZ*]}p`U1Rw`k֡fg5eU(Jq{tn+ފkEԍ {6jcnnX9vqDWpVZ6宣Ԫ[MepV6tN֔y x4mNuUUessnn]_ (i|%ϐxrƇM;aνu丆O]awU^57q߱i+".MXJˤu6PḘwoukSKHH8pYJ4QK,-"N? ̋/5зDiX鹌>nZ@9Re~k7G3R+,]຿@ʰ%3#ya-Vc9`JI@5|'nr+lt9P}~ËŦeQ;_R/=\ۻIEE*9?z6![]7iƥs)\.{--z7FmsBHTI,y<쌠7rXXvSG44lDpXm<~JJUAU8!ʭ6:f]HjqjuFsY i&b+B*P ia(ȚOYSԛ06D NG`كҖqв@+6 75OEV=™&# uɁd`VKo]-eczsB̸`,ĬȒ tOuo!?HNSs6L)8?.D=נ=qzٜl& Bn¦P\&PZ0d'e9v>u k ;FR)v v?kW@qv$o r; QAq t oNB g߼鄇xlF:l{A } YHE+!7<_4|'dvA_Wϯ[o@}"`K'0hIx雀 {ܛ{m>|o| ~\|$`6[' ?{ BC6 וe8h0;R-B'3O>s_>MΜ?/®}pǿ¡#0{@ˀmS.۲#dW,\r \b/4ؘgihptc=D. GEW ":,ϯR_e[ EBvP&YYoRNK^ba$˷Ywm$1vpE&t? ց1 B+CNUU0< K8]ԤN6.3e fH+ Y{qZE)yvߵsG ӇV ui0oaH*J>QZڛ<9B^!o-G2;i7StQìqWXw0QKѨ 5ʚ;y׈9GtVdn#86lhj&baDMfoMN>tcwD٘k\`ė"j#m80 wXޅ'o8JgOS*iHo"w&Dv8aBWWV1x%+$!UW=FS%\`7Vt"6xcT<VYZ#,=@8cl( ! +E3<wKʼL ѧz1|f #0K#{pl {Ps9zTR`,hw,<¯?I&Wk)W|''9ۧp;3ll\c,z>eTދ'|ޅ /?Rz5|1|7pqG{n#9u vn;jJ5̓GZe szqv>ɫ2yW3_I~4WrWYUSG)y`.XT֙v,x854Ogo蚌ebdÂo<;Vr5~us=Sr#[AUMV9!רAJzU#f2q[M0ȆhvMaYatyf{]0WA!ӎآ*Μ&t5׎УI*of"X!qB6 Z8,Dgqډ4Ҳ,튏9귇jԐeT8؍o[~S_`'WQs2vAn&AMʱÌ)vXE(΅($l(e{D,ՅiǸNjxy?M"{&կjnkc/>f˫~<8>|^m^eMF沄ͫ4) EL1eyȤ;,4.jyv{v~UILAr:ŮWoA8 {zК^\& {Cj#X4VfH6>UG_3n BjcRo|X[)ҕsEJ1T//0`1 IDAT lЭ6vI\ЅY8gϑ Gw;~$bIÎprC P]*iU 0EVE4kN?NWmӭ5I/!~aF;@Ft`NOˋ8بI0EjZgY ZY:rwDp ̵;)_uӹ@2zUlt/_&:v97σ' {<-`a vo>{Dtdzr߄_ ;UL+wwꚾvVV<juꦆ{!WK;l で!ݹ=׾ h*HtF+^鄗/wv$r聽;_? j>H&|NG2?߸ܑ'`8ٹgþ# pg >t~6xXwzt(FTlz0\w$3008tu@O"V+59k.)9a^*ۈI^1sBO,[lm\G"+S,7ٶbjk\˥[zD2Jju\ +5};׳% A MT81Gsxj՗6db`zF Dn6-L1#: ٲU\cb̗1QZ5qVhDtDJUCPQ6NarN(mlE/P@sM$)he|6提4y[?bjy$4t6]kԦ[Fj(obmp(SûPoU$7q*nnЌw fd_~EGMfϾB+U&Av s|[g>kbha;396T m;>Hpx\CRgY+S .fN9۪ mœx?Kvѵb+&rPgu6(9 rbl7./`4Tǎs9hnxQ hs 6vm$nl̋'9~?8&+"eӅr ++: g Ok w羌Yd3̵*~lbBuS 8r6izUýnEO]JɸRsSVKwd8m>5Ş%l מfy;QhyO擜?C|pϡۯo .rsM7w~g.ݜp-ȣ'^ٷɫ>Lۈ&Wq^8C|58v|Sww@)8`O /@ݩۏctm*[nOA|Nrɖnbk+&Oc { {/.M$}1r2$>UBQФ MaG4m>T +x}H`fqe[̮! ѢcEsUY3gP8\Ft ^,bm˃P$b5;\fۃebM QVInuvve(J.dQdXZ /3[ŦkSs@rj3U{V#s;iU P vLӲwvH-u'nI#LOW_VʜX1ZM.2w,L.p "슅òQj Z5Ƙ,G`Fjwgj/mQ=B?WKa;y|9r+K'8z?zoz#8)'0:3>} L7h}7=_㹟'6 ~2k|W3ONG?M10Hy^>ٷY[۳*]_`*'8:,wg{_|e0V;rC.WvYcqy?Mht+?k,{.A*_ jOGgͯ]&T|#l}EQa_cz0_=8ɏf n'G|& W6ދ8BG9Vl[k7d];oR;o܋dS+Wxz ziN3}00G-Y4uC&ͦIF] 5J+jiXYb gev)HӵJr)DR4$i\~KAV=TMT[ x )!I bb4t[-xı~lBEQ(Ͳl/`9n˕1TEotvqmxew,A=fUH~Lݠ8Bzdru -A˲20n.Z"hxPq6m*3+-|G4VZn]Hc8M&@?ᘃhL'p 8N^F|.*fklO Ę?77Ns4lRp8uZh /@((NeҮݠ7azf`R$0T&BNjN^0v[:Mmwd3Fl7|-xpuxstC'> ww|s&^ X.s'x?8I~~\O.t&:V'˝J,ec$93_mw= D+D\Q+VX-O:9DrqH,ɕD+A v3q=UWwy(7J8]YYe=<eMwQ"i6xCOgJ4$C.Bϭ[o GPY ZTⴴ,gp]wSVm$۩7Z&NPfz$cIM0`oX؂ R*G6#,$&bsg{>p-bJe@%>Jw=x;@˛Y6^W9?O".r+~x_`X`H##M"M3JVn_%q7} ^AdJت ?'ZRebzbKnđ|`'8̹9$BsNB5,Wo/amsew{xOyyW|`y$>%>jy8˼Ζ&v ĥ\^!^s)^`#_HD'[v5ry7/͒y'OQ^;_bw pϘ~j/!J[x,'Roc9*w⮵ /ڻX\ 9xpHE='SO3<0*{uU}/܀4烃D" xHXӍg*ю,ǂ*^jwF"_EHnp؇3KO:;|m {p*}q6kK ݤY]-P˲%&M eM=Jyt^Y YѽQuYc/;wZs7;tJd^piՅS]P[^c(k~6M#1F/]bs-B?Jth^v7wɇ~G9.=-pQ t?Gd>jePdrl'$&G^/D*Y/Yy,J)QRJA+qPZ=ڡ@4]dy,x90er /$٢bՎ$<Q4, G:~)Bǩ ^![^!"iȵ MI)P\Xaۇ(ceXU݇eyhV H*i#qYa][ 0:YG`*b|5PKE/YQU8n) ka4 N=O-/+/\̄Plům`v I/mO_fĬw01ujù|#*&۵ r8l4UP E#ǫ}G5zaNAjSXfhP !G?0wv ~Ģpns oVˆ]mЖ NOx绡fwhS߇t{,M Rfo?2|pu ˏ͓m֧$ pd=f˧_m axu8[P_g`W- yxǃ{voyx[ll fC!rY~8sP!X*vW eafˏqS^l%xf+REҘz:#![Äj~^ TIlo9x:lrs=v mt8QR lUehJMgW+JNd2QX{un}$D}/wpi'Fꏸ,1gT&V[XxHzn4lhQI\嵫й7͎p&2M7_)^ IDATŭ B—؎N|g1{)>}r!-AeՁ{NS]"v]0r9p5/ $Q#rWxȎ>綹4E^[o<菉LbiN>;M/3x˿S4Ł p+?dtc(0"~Gb|En_3tkd/o&W{^r[ 7bD.r9= ƤCln{"J%0?Gƿ+؏Ԛ4%QvMZHIQD{1..ee;dI0S7َ(d| \ƌJ0-E?D K1|cx@_Y,錤T(ͦt*3{Q<[ 2kݹ~~9A=k ?с滛\m] ]`s3NpŘf\,ecC>z֡G qp|Cebxi=֊ś g8ЃHeF^jZCCdAli,M%aCg{]:P$񆼆LOyNB$DE԰ U,oQHG (6R4ի,2J !'#7-ˤ)hd|6ej2 bsP䩷BSR[!(؆Eɑѕ$RD\ f!}xef!BjqEh6us>,ڏD ԏ%qE}D_2&O`PUm :u^EohF #Bh[t {.@tjLݧS9t r f~adƚXSµ04{tR>e3d 9AI1z'cG2|HVnaU`v AVa'(lCj_[*H Fc?"tcnVgj|Y?)|"*_uWS݋|ty joy{\^ۄ{vAń_û?G |~##mA]&~I0:3afݿ.U2Hv~pt{7r'O]jpnhw:0znf}<~RwMmf<;ԀO-y|ol_[g{Ϸ?sx ԏj۶']]Gw\]YbdlO-/@cXU.Noccq#WNhD4C v[v}]Edd2q_C;Mnˤ) !*7kUIM{f5Hki2 9}aF+S |&Wr jW\aS2 l"&j/J6W65zIA7I螅4S9*ky|B`zBG+:nTnb64Gʨ(FUi Y)keNmQE7uƥ0jwjw=$ nKJ:j(H]X4: V>F>FRI2#2"8Ӝ?8rNN rApuJ-kVO!&$=E[Nl#V%<%&` )2d\CTU#xHѝ Auqmoc5DBvtXIeSmdY~z]tq.NqW߇S-BڏVLU;'~!hH;]p29/OBpU$=|>>7>@rt?=0_Y!'hep6B-'\n X"6|5"Th~@lKK3A{G,->LAGJEc~qn0Gw~%ib{HQN/ ѷz_,́Q׉X@g獵Pm*| (s3W[ Գ+daEF(s:2G.?F.QF`dk|`,;D!Օ!N q<>u${cWSZk"#[AU錅(o"ϑ'H-\w%RuiZ#&61znfQ$9u3Bء,v7uzW+]ѹgg7WDzAr;Ķmlb}mans+c_;AkfCGȮCw/ @7D@Cm Б68FP;o- i7A4z4|v~xx'p6n{8 ί@HJ B>|tBЛiةk~dEm<79 DS0J&cw$W۾#7ணO#)3cYL/ }ڬ-|VuțUv("m+1;8 6p >whok&+K-(V ?/ttv-ܘ1:~[TzEM i!'T;iE"Y}lD jd np qIF8>@%/rb,ƲM$dn{4M bn'{7EF/J]a.s kUb/ og$M-ًn|;kq'Xk?_*2yʸ !|r$Db*H0wyЇ^֫|cGQvP⪋ߨ(-1o黏֛KPljeO4GOX\rkRonn( cc?+yRCIm6JGb|vn*,.sOf8<ֻyH>G%Wv׹SԈMnpuF'z'6WTuקY>_!\m]"hľL,I4ҸZ\bh'00{rtds~aSe^m?Na8Yq|ƮC>}ckKh=>}Lwo)Blℵ20ލM !6^؃~>Tlz;ˆpRO q:oӂX×ґ=I%%}m68hS7ר6hT^ UtLY)\Zn9RH=!BWL4ѝ5VZ-R44vH$Q.+L\]EҍkttJRl)qd(SaԖŞ&kQ63e1:5L`)JU RTM!WGWЛ"qvLDJ<ыItV8R/MHE–pXh}:ZҢ%48͕xy5-C(8X /tidzo*A`5ܜZ{/rl$ T"zy7ћJEg;>D̋7RU~ ΂ADPPw\[i4v-5=yW}8tV2m壓"Zoܶ3$G~C|hXOp?,t)oisK/xO %UX!xam/ ynQ?,nAG{MRoMi3hFmg >vQ?#_;K]ݳ<#"36O[carO;ףϷgDth{ Hw`:dw5h|1ck["OG)19֕n[xA8$(&r6.}iZ Ye+ NDOd!wOIZՅ*˰RA%4~9Q:Ev_>?ϻ&6i4Sl\IgPIy* 4a!RO/83XjM%h"qAb:YڲiCQTd) UMS%uDO6"ilAB4ܮhӴtF0Celt$]h!:6j8'>%,E;SiTqYj8:ಱ4C.! CoIezK.W0QO~ 졫ǎ'R"wdD]DK?f m6$ Iu bz2R JJw6>ޏ&j<RoYhZXFe*-=Ǧ(ֹ_ #6eGEP4]= cdo$&gw ^e{'Ʊ,L?azkeC]/sg`9J"byp}(stGE }ӵs`?qwwI4h5 !؊<$r7E*k$ZMj߆>bӕp i^A޳o3aC:;{4v^W__oS"Z@:t_l21;V{[r&b3=k.iˆЎ#D4rgG f pT²=d\^/1+gP9T7re^.le1ԍNǎᬲe.4#\]|!7F~r.HG~FF.^Aݣ留3^r9Pʲ3Nd'cy/!ݺSH"u:i,gK\^qɥmƟ^ ^'v4Mz.#rFEhPd>Z)!_}_KNPo%هvJPwf̭rdx"cr(skӼJ}NnʴMA,\?O.y2WUJQ4mqI??%>W'ejzˡj ^Z"BG3p7$H,7QUT*+9V-iɰV,rƮUIblByD%'}_ p1b[tI~A!r3WIi.(#FdkRMBbiLs/o_G |6gVr:H52u nb بS=-I-LIBM骸T >k?w_ ?8bf{{,v[C|;yW}tuWf0`xAHJI)hQ-iʒ%+%˴e]+x$@`.`0]UU]w! Hg'}$8:(ٹKiE(s2_D+!GRXd N_IDPu"0t(7C$X;,RTT .zÈ~"BTFHS} SLePzRۂhye8:njc/op-·(qrÓX̋)c5&er-[~ 6v0U%P,{:^#Lsk\NԼ%FzUisyJI%XY'K<˞d) ;WX6BMI*4ZۙflXTG+l 5,S9׆4MJRFv . j_a : %}mRR%Lu//PNm\,Zpﭲ:'fEӱЍ4pSoJH !N%!m vQ']).86qnr@x2˪&J'SDvy!<δ'f8~laGL;Fh4h.![TS&iYbbPb$(XN ŗ۵$F&DF;JLX]-P˴BH(@t1Ӊim2rvI!.XaҴ$ ,WU,A"6X! =4a)6_5{zj[\~IV yVrV/ʽ%O492c5TCh5dQ쀲89SBeht-w;6BaKn(1XSĔe*927}z 7s7m}o.o;= \*f'VD~>hO/ hjKGN~_lNpi{+_$|`(vtwaqH12!jZ*!Dޚx;cSM|Nq1t{nfyvc2fb#"cc}zGnK|oY|~n(߹OKdskykX[GRč8Qs>f%Bc…u$E3>LGxt"̭?"/Y_ax!#s[ƭ\ߠjܦsL?"s`gqF;TgoǮJ5CܫgR>BkHA}FƘ Itx _V<ނ|cY>Օ+Wehh'G[;oCG媘Jr-%cQocKn% [ H,Vģl$"WUvɥ \8VQ#q'lƊ(u Ou0lQ++Y=Mj^sنxƩUn`XAKA*FS%9Fd?< EQz^#wװ$ Չ*uM#kJwvLPx_ޱ¾xFo£/34>7%ȷlj]juQD\8 $f #*rϕ9xO)CDmm_o3tRc;#vMѭUiVdSdWuBźbҷ!9h:lsLMg^뢔_#cɵ-DO\PJ #P]z*ZF3U Z>@\JΠ1HlRlVd; 1C2lM3^AyyzUel~ۡ#$M2Hi=$m J['"k3(n։k4- AakDMrA!Sh@1pBjpu:"8ХѮ5f׹jDҌwrs_/aݠ6tҤ2d>Sl޴d;?G6lObQ _ W!jvCg' c5 j@<4g̡oy7|޸X<[T' w2?KFw : s*6ȸ?p+dcGn L; x?gYnKw^ ӁX w3QN^~ ::y2y02]xjKR r&LJv@ыAᇷ?tw"C Mw~/by8-]xH-py)Pl n̂Æ0ߙy垴nYaв N]W6k N}V3Q^Jf!lŷtUA$2=( iYcE&8ly&Mوz|ݵ=ujq\Ъa{!rTƕʒ%.N":pM)p$*t 6DIU ՕKD+̌z,I WZ("\7+B*jXA4 ;!V)LNPPjbՋj]&\XACh %;̫EzβLZgbH^8S'9&#U (WJq h(L(qkK6@(.5jjOlHb%+Xk ;="1V(ixUvFTh,"b!1FK#H6-j `^ HX U9AE蒊@CITQzAwOXuYi"y!"`)%M=ga z#2"-ISc=&zCRj-dͧmkV]@4\ξAayݏꉴB(;:(0zVF`CHqɒM&ylk"!s*,l¢Nim?ڟbNx`Dy擗v~?t^9Gx t7 ۽c:\*R;i9^z 2El3D|wte&bER#︪IbEv$?2XWVvPcsI'Gr_WCBNDن} # 3gY]QCuFv&4N},Iɛ`xa9nq_z\ܞbSkMvLc3S#,5:oR Y:@]&6J{(5۔6ʬF0K9m]o;5Y)=dn78;=B[mT[9vy[ص~'yBC,%r+۠~].Uf2( +i&Q yO6I=2~EwsǥI1K8H3ڵ|K Vq=sAØ6a'X$O$ĺ7qBmQr-!$uM9J 6BZ+f(ЬpCkD|-f o,'] G2tnTzWV6>Y㾭i4]$׌.n=;^z'c+]u(K8β#cjpzobГ}cO$ӰtGbaNߑorI:8fks6Eƀ`nG7t Y/tZ" wlL^bŮp /WkLYH6NCV8su|HpGRXV6-96mFaF\,01,˥{tXUvѲ"9#:es1*Y :0xư@ a5\d\YeՓ-/q̜ggC~};~L1wm M E ڱv83Xcez)E3 0{Fa:q6IH_3}e&H^:;]ev+9 u^Γ4Xy>HҖqE2koQP[Wq MCې!H #k"9I 9蚃! biײ%1GDB\p}a q[d%:>AC,d_؞CXP6%! 6IUBTe,InT}f`*sU$ADdG΍D""o!lCrbdcHrhrYN^~MB40X 7TlGIGᦁɐC[ywvOg;sl Z [}Hc׈Efo{^p?y^;ѯn֨St܁Ljv3ɍ\Sx"~Wz^26ildˆEkt(?ɍ=&~ݜ`raob> 0$[o_c::ʝaFpJp,5πa1g iu|&2D5S('ƹzg~XX7gC:> ~ܧKfK.C7쾙_"‚lq5Mò,wkyiKп:ub0m# BAz52~6jّC!FӱD$BI H45lTKBtʅuݥaMRyyB> $8䗦U\=5bi"(Ţ@mc biequC4*Zc^{0_KmsgPU[~.z8~'ܱ-4J ,4Nظ! s>_%{FlX[ea&4B:ԏol,(йYABXqSWڗD%RءaI:A9~" de6 z!Л.bHҥ]6iZ"28MpvrDhN{5f΢BC$(j %bTLT͌V]<7c G5:AK#b\&NLXApuԑ.z}pUb.^n2U><%UKz^MgtlZkXxߩdVD֖h uu$O +{g?<! .;@m0I5(oyvwÅ;TځJ& [FYav\^M0_LNCӀ=0uzO?'.kp>x\,֠ހ;hgp\\jޚ/>_~ "J=x _C|v_ ^hE| `s} 6p-q y'މ~r`9?ðT87Jϥl~s*c-څGVUF[lRtb();{W:rHQ.UDSLmy=%з>N;_d.cM*[l#^nl<;ZzQƤU,HyDe9,$댭_Y⫩ ÕaFSMd1Vj;o{XɰXNɋ,*4n Ϗj/w=&W(=g^z.:5!x )! Y2b6"~ d #"A%$($#L,S@eiͶElҒd$AFrL\Dd O[hM0dd̶GXh{!\$d|ÖݒPtQ\]QTmĒ(jC͒ ڬ̟'gc-ve!';&(5X(,$NM =t5FLC,Vl*ɸpW:&DlӲ] Z,x9t,q+$C!{>N쯿Ddmm}u|!Q=QT9I!>iwx7>_ڧ9pAx1]gL:M^|sڦ%gX4ijz|(׎osَ7%ʙ?d:ᅦT֫`;8(fk}_l0Jt|8 6woFvgg;>_C*&F4_~Rm=W{'<94?t;;K|{)Ԟ_j!ǀҢ}>ӼH//ء3k?0!7ny{s֖80%;vڂ*+<8s8Cܧg9s{`sA{G,\%4an  loEw.,.-cjdi#d0y5*Rk^!E[O!ULDt( mkti2mOi \¡6m k A*!BӠ(Y*vT%ױ2M!=kv]lUgv(19LDl!Gb֋@ R=M7T[S*+'ޅY2jrkТԐP{ԚaQq ZNMapѐS(IMjqٹ7\.Vp K2bX|) ?jNjxUvajG=C@o_I273k܍(29J۽µYڠ5^$'Y*w:ňiRo\a[Yml1t*ldk( v/ꆋ_c!Thcɢn(:{15D2( J!F5vѽ7f=QVP/H<-ru䑓qbIJ3.>,cvĂD2)Oae,e!D,^n ]aoтbq}H.VwUG,Isk^*ҦE&Gc7tm1 s꠵Vu9:Ma h֓ԭ8q^&-I.lbSi ɧLP.;J(σ'yef+^8L5d81gRNBU +Kzz"D;`ńΟ; G`#sW0ȶn XsY۶n ~[{hw6eYP[" iJ-'8w cW7R ~Cpn/~ U|~.8Ea#p G o5Z>8 y1?,?$uKojK;1AFy[:V[vl2aulIg{ʐn(ؖ..Pp=WIۍWE[2CnY>.rc`4d)5kM3vvV1!''ɉ3 [K#4dU 1ĺq=VE^=D}lC{2^.G9Įg"6};r,gOљ cJ/F=S>v%E{G%YwYYLiy,aٮ!d H);)v,b=۶+Z\ﺙB p A&&08!3i=voz]DLZ]r\pIXB鰊((gJUqP3E >aEÕ|dC$G4kAH1 `X M 2eϡY1hMWFtmD4|ErGX I3SZHK*(`H"S2?sfBZC EC#º9>_qg5.x96PLÛϒ2Y/noMqwyvF%Ct/>+~LX|U2vCϗJqǡ+It8q(3 ﬇ٗՍe>vE%ޕsuOsfﲸ/NIľ{O!MJXbA3%)pJ h5Hl[t%%*8JI)cuH'l#MӢaaz6b@ݴHZ[BT$ܪ#[. ZPDh븖$%U(8u\NZ&F !@MH;B6CLU3.WI[L"/1SLg8P|O%ct9`\'ۅ?#pz<<\?gia0胝K,gadvsp}Z|K_sSqZauOC}cX=@$gyK{=ݘ]yi~6R+J霅6ͭ3p)Fn+ F J`W;昔vuV"JcŨܾ 3on›}[e7+#}Kl]dAkyx3M&6BĮ5vgϥ`cƀ!D{CSI`3ng}GOT>oh_2s/~..CmuIG=6bYs?y~evSKl6dl\ㅡ6^oy߯=YC]K]mQ[q{Q/UaYxSEدۘ'a+'Z,tGC-_o>KsC$Sl_g,Wxx\#[cWzwi[yי%c,F|W=G$R4j/q}7466zdޞnO/qs{|'/Wvƻsyhnjdc3c< /L0?ٝo0,GC+)YlyѬ[F]j ؑIZʐq:%FlR J,J*Ӡ$g`'VW]5^k-nm!:H:g-@t{NQ0OO`ve7$kp|M(5sՄ}km9 noϞV-Ȗav >zN魚߿ +c{j@77nB[^+߫peN3wwwNzw{8=ڀž'k;jמm9?fm2᾽N%X@*a=Q&sڡ&_K \M#G ~8-Ɛq)/~;CXSg}fDQ!z8tY[*Vimd}7  ,hPʫHNQCBN:݆j+cT%jt !"VYEr^, !REhC]GTSPΣ JՁ%iTUa E Ӊ39 W.LŒheզ45Uŏ2 & G0kuTob:iVUͪm'+{}} ;IY0T$>@c#-lçǟ7O4h+_#y6p=|ګzK"ߊv+u.7- oa A9ÿHu'|U=wGJANm}EdY|KjԽk_ #||}W)iyrUFOrkW=ܶbKԿ#vaIX"p'w-.=Ýl.~gҼg},e,|BKrOp7wXϝ$?6,gqM[|}7Z<5~E IDAT[ʼn:v7.?ܬmD6K|˯37|v)vW?a/q_k=smopS~{sHodyPآ {|% V?G",vz4#4"}}=$FG 5X&VŋW~[8:$fr2Tf9Zw.(c3 >>T_biŀFu١ʹ*S83>Ƙ[Ah<icFqg:Wt{+2率yh|~eTA**{L^BpBzO4I^+EF۸{<.5sLU,s)l9VClF[0&j]㟆:@Gxk@V FN 3&ʕv P0?'k*з @. k`{u ܮPkq]*FC0SP& pwvRUEp (JJr?S,l T{j/? CG }8_ԹwN삿y(Uk]50uٱ(XVb5Ah/| =/]M6rs\Peq>t^?4\V[FS? ?F<#1Ƌ4X6Gh2-Zduis/gW cx6Qe[ W6>;mxYv66,rG_OP|)Egcz̷7e\ƃ{_={~2Uӗ ->7 ^u lgiͩ6{WEwѸ6mU g}@s=%ĕ[y#xTqny&"1{|KEW d#Zk_ ;|KGqX~N@Hms ls*Lf6v{ {atlē\ 3 ?܈x\@Z2Y \͇%EdC-v*eUA5p Q<^p.*NIUԩ6D=$VɖE$@ 6K,#eI͒p8,*X&PL]4LUZ5* *bh !*y,AS*fEFSMrٮLLB\ADs[^ƕyC0vPY@M[CM6W¤K%T)e &zD0N0fz+ VmMP+%ԘBAށ?$` 6i5(6<N= P%ߦ%Y-\,%9x葳<+i>zh+n=,މ9"*6}Z|5v_ǝw8wݤ“PwDU^U?I| mV,o~4߽ 8rY͎rV#e9??%y.]f: aR{O=˧?GxmM-?vn7|,fJlq~W~gyywJGq~EZ) f3(>O4E}c?34mQ寲Ekk o~"|%Lʩ9ĵ76:ey_ّF4%&(at֛)Zg% .z$^:5D4\Y*)vjM(!w{UYLZ&yq٥"7r QS-h 4fol_bE"46*{=Oq"G.#jQz2ug藺eg#iq7/)-h+?{G-`Jir` dkJ;[pi8}/@4OUT>x߁ZL&e~vP_ 5{ּ?q uB o_y0\UD=.x\]?&7O*;5'jo_7/@o|T.xy23pwF;#*e_)^g+}[K}pa;XSï=ޭ ?lR:րu~Os"/SGjtC53Q.NjLfЗ3OTDXK%.mɌEI0{s{Hb `Zd{_t(-dT4N0ZE7ȍI^$e}O"rV F.t]4y-u ۦRƥ͒vb{Iˆ0fNc$H~Ņm.qyˋUĭmv75,66q01W7񶻉ݻxc!Jsﴢ$r,M1N \$>G0/]ĵ9W7^'MyR+P~9LpWd"[xQnfnk J.zWf,\ !"xUfa ^_ۙ&R+ W6iII1K4G#Y/Eە Z1S(% 96kÇa9eܽŽ/MUqw΁/p<ƫW Bx^.^|gYEN8*[[5AEQbzzw&eaq=lrp$I7:eЃ%4ʹ!S`hDxFEDb4]2SxCPt"ܸ E [F:MVBxNQTRf{!dK("nPDi cb-fC_`DnEs(ΩFo& [ ^zX`e C&HNla裐Q;16Sn:bHMhkv䴀xV5 xc%"%؂뮏6Y&K$i;tCQZ]ۋlݼNmbl1jI[dYJ)RF͉|MT 6F {0BG׽X[6aeڴV\ ԋ\\:o%J28Vd/`/1ѽ;Q;Mr,hCF%@ojv2noQ8 ~|]܌J:i31~M@zDzvpD .`fdFvaPfx" L`L`XvrIBU&Sq 6:-$&5-]!;k5 {~eHOQݕ0x C@M˷ Κ-nA$ + {p 'hf|SPW' =v.t~|Fwvi@;ډjw+=$([po[M<`+5o `)b{c`M&گ`w3 0)k5h'ZM80\[p7a6/h?t Te.kfhg>yj֖}L7Ý0 KσZS.86( ?"pl`?¾eXLn1]EOpt:Pz6Jt NY#*eO2Xٚckͬ3s%L."H q?B/SVY o<" "ELrW0&MDP.lN^F-T jFAlvb^)1 R-YDXX2Tm :z&r$`(UěTcW85hRNk4Z:k-RՒHSF4| [k7)l8$@š#Z&즒AT*4z IتT H=PN|9PNX"*ld4q3=Xn̥+YZ]>Qx(1{7O⦀~t(ѦI񽻛Ƽ4ɧ"fixdf8P+e ,cڲz?*SG<_%'7ߍ #.Vr-23*t 4&4C.l?w+H53%f}9CY~?^6~?.]:Bw'IX_ߠ>@.>M(ٿT*}qdE|,o#<#Ph߿`0/`V%sOMy4tl88vKôQK ټuX ފlիت9ںt–PCZ],Ւ*"z$` q}NUÖp:4ׯPL;;uMhq쩪f{)["H=mn 23mZ]jX6D6H%WOL/EmT|^*4-:ZצHY*Qԍm+/JG^d_Í=),Xah5@9y#MwuA~~K͢GΒhF\Fc3~FF=XM96d$݅k'|Zw~fq)&qg։}U=2¿S3\hq.#}AQ9>ӟN9p@jb #O>EGBtXd2"[@LҒg`GR6Dt,M1vRv0G}U.Gv9}r{xh<|Hۈ@:Mz7>>Fȑ#Hx/xIMϳ'Ya]X߅#׏rdQ>j|qmԆ|$^;L޶w&aq$BW{Qv4$#E\Yl6#`zO, u@@ z_:> 4 gwY>=8Zk)~&GkRޚF8:Xog< 5@wl?X[5Ks@3j<ߑP Ak:;P0]+?Iht; ;kKњ0Y:7DLn ~E25u36Z;o^ )D#Ƨ~t ޸[k~|&.]:]YۂkBbI(U`n:ުw {&zMkhϾ c <ߙ`m_:jS*un7Լy |_y_84]lGql#1U0 S[9z2ffV3ڝ%#> IDATP )tmop.np7NIlRPgXE#w# !9.;Hd Ͽc PMfYYh ,B,7&)o8rdr˂īT[9rػ9ˌ?x?T [d4ZRZ/W?Jᯘ7ODfʵCh  }To񟡸smO#QfxcQzoq3cVXrf dc%H݊{Gni#apC ~שt?[l0-SV\ w&- }\b;ob>E8FlRyΦ:._JjlDK ԖV&]Kϵ1(/l^\rsǾ;ɵ" ۉ!Y3pܻ9Wchh^z' wsؑ,bLRWWCp2,W<7@sS;Cΰox(/]!ˑd3ya:{Gۙ歉>Ve{VSYd%vBcC=6L~b{Y gˎ*F'osb9(Xp;iYJ*6I8iHܱ7{nJdLnb nKDŲvr;@c&aGF3С0_dբrKn̰Fi10H:n_p5fPPHUl+[9N5R!h,CLf0ݤ~i.C bl:XUÿGdk.F~ҡs1ڝmn|u 6IQҡW驶HIr2$"8h?sq|ZFrh*Yo;2'vQ^Ygߑw_==IK{Yʔ6IJ F/䷱aK*Ovr/݆~!"W 5g|+N3#Jubw4AzV\+{}/]yRiZ|QFg0+vgsH"Z%', QYYF3AYi.]x*or>4(&7@=kWDq#gy/oQ\j h0v7(!`"J6F'YC^I[lŇe6X  =zgyNRct,#*A}*!3y =ф(19 lJʉODtR' z>~XY!PF0P d `wCx߇k 5ޑ%j m6yl 9c0/]{KP$ U^ QXܪ{j|P4kvRE[NXÍ xB T*4|`l| .m> ׎Y")Z7pm!Zp`> k5`zn | \#;pdN`ֶUoan0/?$Z 09 ]}5x\ZnA!fA6~*`_5졐ofMT_-v yN{.(hIҢ Yl>.jŭ(Q ܀Ou3Y8ew3H<-M{o{z` NeN]IR%VI3b`]]**}(.ݽuq|#*_fvc*XyfCkˍl!X1AK%c2UNqn%o#]!i9VrY2L1+UlGg AClUqWlA(L5 P3u%U\dXFJU*U+莡¬0͝` !BD=zVb*N8MGDDUȣEjuESJ<Ʃ'U*.OdT5HN TF"l L0؊/L' nQq(z wh j"De"fiHri"%*nDQvtn1lGE D *J_͍~Q$&)*5 UwU*:m,-9 <(nĒCQ2eRA-Fݍd:TkTs~-I1% 2b ]Dm"B4&QĶ@4"B(>=B$}Nŵ\9#L-^+'P6? 췎21:3MMHIvTSzH#,KTOf47DwdB /!#8l/+EH*{}AbFC\F*7_Ԃݸ'9]rZch;_ngLhJ)V~&~mQ{;<=Ba:侊{u:b1NDoE}k/>Lvμ(3kՈwH/R4's,nO5%n!E,܊zp{!]qA˅o3$i>BYn$[Qqj[(\g'YgT[ܻE^R2,7|P(DZҥl`suZ#'4-._ƱW_祣8?o/\+KGyk;JNGWx7'c|t};7ň%>iT2|LOj/Ҷŏg4E.X_4@FqTz2 k\UQ*(iUZ]gWkoٻʕ kH6K&u ܔ(TJ3̗s$tc̘eu/>5S\EHXl} G! pX8BE}Oԅok~DVjD4L Z $;5 E*52CY f.OlY*RK&=5+fZyXɱŐU,e`VE0mTȅeT6lW{++~AV$5RG Խ\WSP-@mq@p=n:NJ¿\)Zb@h)"3m~*mT,D\n/ BgD$"+TS4"oU$m^YINIKWb>\/e6m'[zΚD/扖>}Y.P vrWx[4b{ y8U,3,gs$ݻ)4)6+wOwOsYkv=\c|/0e&W\/HB0™<;|~y'Y魲x*R>E;8^K:i71|{Ͷ֍Nv:sUֿzynWOݗgk{ 1w>xX~-Mwsɯl 2qly5ӿS+ {/x[&Qy?8$֭CunܸV2K R]pc6ڬCB:K%^"pZV(o籗DTl'k5KrkoSO,(jN:H\!pAd9NF^-{](RUce=s =!l#؄}m#{ҬEyjLun]$#aJiV/5B؅)j8$jK!jcLlBKȺ3ɦLH[zy Wn>L\[[:.l:$زJ2"m)*YLH;Y>0acY{\ B2zkX@^o*Q5NO(BNXrW>4Ww 1.7RMJ%f::eFqk*AҫMH>"m|c e,8NcWcyuufշR( tHR)\PwPȵ _]&YE/,>[Ltqnax~uvw9`Bk+:;Pi=~δ%\xjc"#^jnP}`nӿ֛yt}*+/z﷕'"|g|$F9>fYn2XAx B׺V\XY=;!l rEnkLt4%{ / MxFGc C$¦hdA9N{FW?CsB ,ʧ@z-trS37aK?|9~T 6lid#';= %?'pqWuc1 Xj~M:C #UnI<7u7:mxb\WkscC>86>OC,\~}F+߅ahiK'OJ2FY' 6SFɈ :'0-`ksbl fQK,BTv!Y$ÛqT 'SEiꤐW\at7kDnf3v[LL"FOyjoiYqhq56D}X.]::d/hԄIJ)i`0--`)v'H\× vO25EǨX,|%E&G Ga|mQ3[+׶ěT|yu!q]&]G4xoAّR5ßyOxi_}(+\]'ctq?[=pS+g'IO'8yf\(ݿc1d\&5ay/7~BeE=2~V.IcHǹ.ʹ aްM֯E%zR969ʲCf֥S+qV.p==I}b}"o!8J# \ %BfDž:ʙD(ċ{DJ{x-ac!;wMV][ϊ\̩O]M?I*l?Ut[d(}\5ށwTpI* IDAT"ӌ;PϳvQ/CbcrgBn_ˬ}u⣯q&8D ov:)uj _+3ZِDxjb7CKk|{#Lh9Ʈ)9?`G]7FPrxΡi//ԟwmoM`b(ʷD206mhS'2ͪ{H[WYPKKkC/[O2<0|)EhsGmw)sb<%]ܠֆu[&#gT)h>}3m e_ƟHv,JMʾgh:>Fq^߸mm]V)δҥ*j*!79$Y-6οԫ3fP<򔗳$^󳨖h3C`u7[ ʔn-6쌏r~ /^uq9?_us %Bɲ' ߀PFQ{^7 |.xjcBͿLB>odcOn;4+Ȕa*F2]0qA5>CG]mD@<0F~F^cC: ;ojUnW '4gx} ]WBV҈k|Σ׎7\Z JX0J6-@^|mpulCgn/G)H*KR/QZ]rnAmcz= DdJ2JebpA bH^ O(zͦYFtjUڢ/䣬WQM/.K3nZ1c\%|8H-K͡7PNWBT}2Y,ddf%T/5tJdjU2MKxl `?soRgaDS@FXi (d[TYߝ!v,8< AYd![%P&ɚDyYUX *&pE2k5PaM u=O\Ew gA KU >Z.Os+WB()i88DywMhi MEQ)UD*sQ/M.ʞ*K.qD60Hr[JO%;4k8aw 4Kyw/szB_[?GE~9&L^OnT ϰ"O1XWYr>=/?y"+tG;ƒbC6[rdv;`ܟnFvr{v[>3È>Υ _C\*.+AC2fCM8+5 R{%O^?ͥߡ6DG>y|L{_k[0!HTCV$w\e_ x8<6_z۸\}11ġ_x}ػ`"Sȭkn"!+,06!f/~y:uoqӄPѿE1]K8x~Ri}Oَg/Y?T2L"x@&㊓2eLΏ,:&f; p{gj0ĒC:_ɣo|VK9b[#3:ƈTDi3l?o8W 9a8;O,GٿhW#֒x_{$+ͨj0Ma7cA1cTd]}zS! ߡvNs߯0`\b9'sd }eWO^aR_&_Jў3@8d \̐辻cN0^'_Bk{6偭-l>1?̙ ӿǞH ;F~p3LG~lbP V_oy.vgy7[u YuxֲW̾ $b-kMVBg` \>hC \}K{_Hc: !?|q8yӈn6n4)I x@X&4>| [ޘ6^||= 06=I6xj'6/xξͫٳ( ;#{XCuzW<; MDjвZmMpn9Y/po*\Bbh _r/I&^/L,pl̦ڟcQ Tcy)qWٵm3؎/Zxc&B یw8 +\#rBFʛx{$2r(;@""v'NZ zpsInQZwb#DRKt_rZmh8ӌtym翎hH_©RϏA\:xnӶFyp:MOMA`9=iV->"mmm? U/Ot`0iOLj]/3p]TCĖ<T|Z6:^Z ʸBu1wq&9Z'nXZiw-*3]sC[d F0x&Vp>*Z?,raB&TA9юmL]@tŕY߷]W|$fJ{~{=)w.\gHOؽ/w/2|M#4&KmQ*W(^@r=I:I"ec>.j#$hIJqbw|iyw̸0B~%}(e^`om[{Hme06.6Sf48w+3߈<-kWxL\ }21ob2ӫ%"[;K\~( S\Bl^}&Ů&ʮ [̜?G1-݋yEj];W̵ߢ./l cMycDh5j6 22ja`2:0 s m*hP눪dh X 71taQD%",P*HrA60*XUZRR2CPnj#d.O7QR)V; v c:~){ &>@5L #Pj-MLэ`-jJ˸m芏jayMg6QSq?#`[75 Imd!>\pWN*(CbRيbQ hԑ}Aw?8d0|Ya%Cw"Y <oR|,{3t{ jxE<%c!B].Qm%Uwm6+lؔuU i/éRyP4`--toaO5&f`3fq?}J!K; IeҬKuΎ쟼[F'}o#o`W"M65s=FoȢ\#αx%RD̮6;f cosIjŜy=e}ނ g>Cӝn չTs}]jdpC$o*+O?TzXPm.׹2?4`rKw3ilƁ|̴yJ(t^ai*~N)ct SB9b+cHQhjrtDkK Z{nm`J?i!zB+7>YdMgSawq𜛿۶HDzt}Ann(NqMMvh>{|>M?,t-(TءW]>ei`+`1ꄘv{Y J2b5Δv#MZ̮F(QaraֹRE5n/0QQjok,74JffԂ U my(]Z)dF~]L53IϩB L&@&?7S.j];e:{-t2g [ w1!I܃ʱr2 [r KcL?o 0~(զru7-yηh['2¤&s2v&WjLdOSi[ap]?4λ\T+P*&(&s3\N>OHǁ^: 7\ikԳJ;nN֬Ak!j`PYu+vo rCa@7eq.%Sҹw~0DX }-lΉ;~潻i䝔wDhmM]L\uKM1J/ѭsO]ekL_p+<1X]?e>f{ݕ?~N ]V 02nfAU!7j-߹FB]QvEp~,w/S]ׇw\_rHwf`wE8]mnu@Æ߂ݵb0-t1xrAgdkP*=vߢզ+ a}18V rs.x{kNޯͺ]mj!{?d=2\| 5>2k̩'gX4v݆$B+YF] \/4A?zԆ. o0="<"{X:aIdBM#HEF[ qJM(ܰwobA|cȪm 2m>jՐCHQo!7kl;~:JH(TEN"(l[2V5IŻAKj#eĮzqRMLĖIy QBJKk5Q*!"uJPv "rCF,)qh:6IVCqHꎟp8fM5!}$Fikr"# aj*z'=_z~`$aړCVK4: k8ҿ7*qnU yj}[D6UC@*蒊ꡦJbJJ4IȼREl=Q6H'*xe/[LRFMr O20"x,Dqus Ĭ&eG?^WZ!xt̲f[ 8;1 MC^dg.AyA$:e|i IDATA`8NhXDKMR7D0B&J @z#'$RF2bOPDD$!Q9*c[67n7)!X&Z=¡#?>$v Vcg:xbHfD@LJt=ϸx^8cExÕ%hI&.fc"xBW]!4;׷&K1H9)yMf"H+- gOAjdnG1Ey1q\{?R s&BDU/ʢ sC ^Ik;"'&EGLvCzY60-Y'a$r2CzJ+DJ4d*7-aȷZSblX1_oV/ѕW]FFgd!M9UoTV+DvugozAdz{%=z^e~#S;;ɳ'=,x^O?uPo@Qo+`HEm *NAGWuV5V{֦ad:1$y̤ŶlxkŕMYiJlVPg2aFo"R``ջVEzyP%DQ^f,a,62#fGlhG}{^nZHMGYۑܳJa"zfx$mq(evY%S]i+cMvƯy/QT !/^˿Rs|6GEmQ9ϕEjXnL'ySrw|Mq9N:},Q=㆟}t?$hg\ȣ?<<ȽwD7W=!:wh.wn 3#_fi>ե/ϑ߾KM}9~0B(< ZZ+Vpsgݠz`% 7=n,,o-wn!^y;@*'#L6<1 %;|{.LGw8݁$7|+rkgMx$ )zU?\2u :KaUXM솹M`N&|%.6V}A^rh.Boi߀0? 5:ُAH*=p.,.COK=C@o\аK mH[HkC]aRwl#d+)|:'_ h2 gDCQ} ދ:&1HZ(XkQ\"{u,CJ`#* JHEMQjYOH(<Ą2ۦj@I)4-|l!D삍H>֍5TD% ,IWpUtCB5JRǯPTd$PfæjȞ۵<*2%թ[4:H 3Zayc±rHVwKyˣ&Rj8# QF/fXX^?@iObI`F"|S?^#YP2);ުS莦&r d*R(eDr[ʍrXz E ԋ Qh,h4ZYưj(0qEDb^%C؎EL4Hz EOGt~#-#-LN[$ZUPв-E”B8ǝ4r4lͣ# NZ=zcOp$jЍ:!6B2=(NjB]/ST HJU48uX4aI"ۢ8xLTH2TpLlpL"/ ,1Zc:3Li.|A2]\x.e!|UbXTY'ك1IюU3bKs7;MJ?Z%u].waO3JHڤ)2ϳP[eׁ  5:U?Z P ᡳcL MCȤG2Mv(`.Qg8Fj:Ln7q542f9VǶKzp ͙qkxsTWNh-M%u8o-ںlLcO@ [#[8§ !ӈMW0&U>^VO'*ՠ eȅ>žwX mdM(UG3xB,#nT,#/]7Q ϑB5"Tjeq yYiz3܉ 9A:2Ȍx u} RQV8-̡)F%µ%D2f&XcxMq]QJR7 ,5SԵ>B{&ݠ ",>B46h^'}Mv-Mbԙh\p < FôX!ZcWabxERė/"w/5`xUyk ߬D߉ sVV}t#TZJ= ݴX]ݵ4dyIlGҋpwѴCzRs^N 8Re9Th{zGǿ&_$f3g.{=To',H9Ue<=Rar}99qu^9}*Exk\$w6q.>Ƭ>/pv2K'fpukzy2j`^Zw}V"s _ P>EDZL^;ȑ_r8WI .b/?GFL4_RP7_nUwIJ>P_*Zr ?قi~+l+ Fnh7 W.# .a{ߠ;MG #.+>X-N0zwށû\Su?_{nm·/r{:#SwЀ?{F׽O݈3e3|KѢ7vt'-7Ǹ}> C]u 7BUz]3Asmֶܩt.[++77܉@x";N% ݥaod;7K _S.ȬP7 r?P?z7@4JBOD/} =]Dۺ FiџEL3&B0 :HuIv?ѱQ(c chCeF3٫e66PE ;i4*F^f_ISpb:w-`+"5JCh&P3UƦǾTBY+0a.% txP)o<:zS6Zt߇7g -N)(l }>U?!уa$ IDqlˢhY"pL+fH*D/XڽFJR٤Z(>ĎQ^ƌ!pmMT ׏ppdU~v)־x1v&B[\LZ#McuA|6%-6B!V^;J{= ˾834}Avj^<9 ,fEj[d'ig\^fϱ4Fsw;8:O?DBz|imq.ʾ:m*yuAih=Iy>Cq#%nSpz17"rxзH4#G݃$ُ$!;Bq7GYx:AmG|:c:XII{ˬ8,`BOs|[ɽ׷yd1:^ywwG1enU9V&;C; ^`5JE=Ya㏿ʭ?9.02pc܋37da6V`3wc=q>}oZ[l.Ͱ%ryx{Z=GU Vԏ5d~ ᇿ[\xj(ޮdA;.=;p[WY˿N_o'x;gds|by|?kX_v#X>ʿz/}OE9:.Wk;N׉'ӟ^!t9F~ar$^Ap׼w_] 僰+܂~vˍṋ3_rt]@.{Gv[ls֚݉UwB(x|pu8 XQga<4KP߁3O{= .Wa~hnO^X[82s01[N. p'AC^bмp:< [('"_ <9kv^~ Yw1P {y%i7X5f'C\؞\5Ln,6(b;rJRNɕ4iNXen_4syZ33kPX r"J*(sbFm0+#x1s;~rRm"f!*)U5e"4T@CAyu$c "hKVZ>R!U`^ib^|`T$쀁-A[FdZ-@ dML,h(iHm5D9fPMzI#@7u<v6a<67Ӱ8؏']Ğx~VfX(xJs|bU<`VWij$4 1nnC#K'BGe "*"0P8f#`id]DDeL]ǧP6hFu@GGwJEai;GQqI`)M%VuEUjZ{$<"uDOZ܃7܍),#p$vӃ,KxjkD "E[Bn:PS4DDHtQHShmb2-H8>黯4\O>XjM'2}o5}"Mb@@O R C}V'10S*1PwAG>?咬7prnO큠8v![8i)7JDowk| $LfEgN>'aB$2:*̿E!ؚqWK5^M4ۆ~P.!w\m-pEy"FQmNo?;`.MB_]kÏLˆ IDAT•[{Ⱦ|.~}0@n ROX+3G $ZnDP7Mp?ez)ͱ*Zj%BڣĄ3%Q@6obL4&JPBe)""'KWk,;m8d;T[R| IBWV,<5J8Gju(G+PQt9?|g?Ktb=iZe ^VZ1ʤ'e"_Y Y"|>D69GdGm K,dy$[cEMYJd `B]GSйFu;'lOhdujEEس@|;.2U=m*wG]=suMžzIQ|B&n"dGg9!EC+8ߒAN>bl%J~[fŏ1m'̡O[&/˅Xn9 3"niFK!Lp "HNSL⧨luO09BNF{_$o/_#}yj矽ckP{9p Y߳@"'1X=m|B J $N3].ɽO;@9Gf:#ׂ4?GUSb8Slj L_+7wуo{JM~١HR.z~6|og/||&(~a.Ћ}ttA)X`ۜ;&/Z;m}߽wLn{|t wIM<_O8Cf}b|@X0Wa+TU]'AL.;y]r"(\?yre2 ˥MgҮ pK{놋W@\pW GG3FQ5,~o#|+T;RuӥL\r.Ha;yx~ҽB ">w%# 'z]Z,LB,>KGM=0wN}O7`inIe\qC1/^^BW d흲 6+ lkӆ]ðStש3m0NвacېlwkӋڰaxͺ)!Y`Up ;Y?C3fBNO0ibAUϷ%}?gŐT T$Lvk?$.*%R> V :iE#ID&غS%+pE;Ȓ(ZRãB3l@j,$Rb$d,R] ZxϠӐRZ@0$QxD) b^ʔmi> R41DMJ^ሄP@gFx&fDŴ@Q, bT4PDCDBjy5i:%_i\2 kB̐yY%TT~k^Z;Z ?~TL^C<`8ALôXo;Wq&FM!`g:WzPX+%0Б'X>Q {x &ߏfשJu(WZ@OL[E|6Ii1=4I V]A6tLI@WL<Ӓ0"&BPmĖI:YVV0<A:-DE6Q=A:$2Ǣ)Q<6ހ`BBue4i>4Mdcr"⓰ 9iz9* ZDJvG%hXEP+;hK :")PFQB:C8poBSph.-g哾7^.{썜 XH߾kb7:LGևWrH/ F/979ǾPLCA8T@#9IջHFc<jLBz+rIl4y6h81̞'N/S_`ߤ{$h'Ѵq}Cm\\ps?ufvuqV/kFjcg)U:I?WmvWDL}ĚDkW1OfzSe`ӌrdkͭxvkor-[a&y&kGDubw~/k_Z/ou›C^a^2gX]ۤE-N$~&5E*g?&w wOz~{b1*JbyAg Dü{5.et *1;d j(Pl۟Ǿ*2-)D2[Q"jeR<v9}&&DQC#L tO 0ftdz 8B6~Gi6{&I~y~§UYWuWuuW{;=Nc9d,,{˲rcB^#iH#ծ\7YU}fDFb=i|2#~_FF%=n\MDȈ5\5£N{YzFLdS]n0^ -l^a1o"tGιp:P=͗u EILI*.z۠;2Ab67|%=փ^t^qCg)'h~ ],ۼTf\nm$A%Xͳ*WpkDQzYRvk[!ƗTq{&~>eևiwgU^q<ǫ BkKsɮ6&.VE*5jR@rUyI-b ]S2P=ͳ5!9Fr2s л+@!~u*׻ۣ M^@gAO,7 W0< ?bs_g%Q懶fgZkFaDg2i|x~$.YsFu}Q.m3?};NI Q[ט ~;qbpuoL5%7f[,JuFlrgY >3_cckc?^䛗C?+?B,-ڄ=9Yɏ< }O~_cu8Aqg0MMNn,ȨMn/C4}Vwn.: 紐Õe{5|w{`#s*;?:ye@ 2z v%@;sG# 4yrE8]㰺 9ꌽ$8|>2v9TTzo7܂=G\C{z LNAgs߄ǜlS>~º Jþz|ju/,ÃO|6 ?\o|{en?5D[@kHBC3QU2ϋYeMUT B^  X [2 F 1EU)UDT_ Vt aPL(وGtdÏ_1t 9D!*q%$A$PtP!KXP w]S1ޕf=:/ LˋlD6,RE̺!l’h=w3k(fZZ4"~ WMb EDh/N. TdUR6h،&Kݪ4 ma *`:qTfnPZ1: ƶtZU[Ȭ$) ul]RVZDJL>_fbA_pPME?m,Lݶ8QE Fp)iZ+|MXMV QSXP1*K DjdJ=p DZ>k&bȎ KRq[P| QADĬ1ȯ 1P ]H{YKo?H37];ʴGؼt (|R`va+FDe̠qisMen:8J!WLi"fI-Eh0`(^UGqr~5.,7" x;(le|9Ǚ~P: 6^͛0u =!7t)!.Wi`xk >U$ӌH{Y?%g(GW2\F_ 7D`v>"1#."L^j7ؗm%?v*L~*\ˌUU2nFn镹_Òɔ:5ʽ3pu:@aDdm[ÚհU޲8ϼۧH$IJ,O^npTbe'=xU֚,$2O7u?+07{8#: [cTZ,h+VPOl-ERe3Nĉѝ䖓,//dJD6|`2J^FSYM*b;H$w$vsA[1-vA?\nq[Sad_8KSuk$/tWP/T9Y'_dp&z׊Υyc׉[EHQV#ːuJ"CY+1뫼CHKWͶw:Jf3&9o20pK^'M/EVվp_;%T/-=Z=Mwwgfoj=۫LNGpKR¯Uzkfss97[ϴ /̰<_4%…"3$%BT0ecqJjBD*PyQ*Iθʟ66+k% ]G<yrQzps}5q~`*>`A@^i9Ɍ`&V{sX\vct 2$ #uiנ? [E(֜eM;ffW' t"A,q@-_c;M<(LL2;⌽,Araq.~w:{3`]':oܸ 0ז mqXX;l<ܿaZ 1>l?3Àekj`k~G%gO17fU^wU]ԗ9p)uk$р:%ZbʛlWb:z!C,\"zGaUP#7ԼmT(Ut[h'~M u@ͭm A 4 " Q.Xe+(4T"REAirTh,DI$5:M.@E $-{ɩ5dQDȊMD" pqy,DLDX1P-TjU

VƊQ%ހFV$Ȟb i nMLq!UMp⺋nl@Sn7XQL @V7no#䇚EPm22*Ƭ2b^(TRz@T cX5%nhDԔ -7֠.TExP/daT%jnBQ78$M7-VmR9{D68rUDY$Kg({ҾA_$YdyJB(F-oS`39&M@V%E5`߳a,uB;ټ5+tC2۵_)X)MҰBd`6dz-'GHH^re|ǡ ]}'n+_+-OѻK&[>/nk$sW_/Wy6W\ Ǿ䎢H~.LPt9x?ū1įXsM0MY{dwb{_7<\.b6$ Jo;7g0:8z9ߢmuk7!Z[ܻcIk73q\ŬcgkS_{_Ԓi<"z;yO}4<—QdzVR{vyn >oXv^LӇwSJg V6C+OiԷI| F 'I/ƹvGS YDx9 ޛgv`75~m?ԏ7( IDAT^ͭ P*^m!|kH'_'B.x>?7No w"t1<4Od^{o2Hn8N `4F=Ÿ|:,r_0~NdQ*%#jlʝ?/ lX50f@P7л G> sXͬ7[(AW~Spc~vb*d 0WA!x*|y8qA_uvw`>]w{oG/ۜ}ȨFk ]:t0Q>ugg8㰱~ :#p򟟸5'[oOsk[}spe2uT `d;l@/;՛Bo#60?q  "pp7 LM9h lw$ɼ ~66KpZ8 o;szaޑ#VM{;Nh?{c~[8xm1\5tfds+$S2VƝIQe-oitZ5Z{t\D:</<7י^Y^ $U2X/pk 7g4,9ELb87}j].V(XU* tE9[,E.X$hnd n@4\Djb Vvه"Ⱥ IvQc4@]PU0s2s/gp =\'RH&ˢKR-zq` ]`)w Ɋc5|Q O$KZ-\ZCS+4L\FW""R 'WIըe:$[)4_UEm,xKƀ*qVQ.B꒑~M\!SWKXUxB P21  4ѸJvѰƚD)o0ԅT+Y``@ VhC.b wDzYab!h]Qi}D@P袁hթ"ANѬh@" "\Ug=SՓHu72Z Ӌ4 r(hFEqDӓHVrx4[ i\b-C0UŠL!$j{/0ݷ;G}]'H{KDrtѼ|Cx&;H*]1+;2;U^05:%z6Įw1|{c$-.hpѮ$7;Of_+ì%JFOq^x.L6zGW+n#8Q|_oe;D}ťmK~y[yqOu0l=s K.\!J%x|^eBqVH{?m/f[-U6gĿ eݐ؞2Bu}Y_.^UUs?fyyys/r4L.~#:βap}MSS3^|Ͻmcs9{#ؿ?ϒ!Ot 6FtD:Yf6reό02njl"ڤus2^v|'.'EBw3T})OhNXF &] R_c`x?=Oz'ikk<z6xüݨӽy'BCg(BjwyiA~t{cY *o:$ocL^>z0A8b u(vqF}VMrKIo0JGe~(}zݭ`؊3Fh${6Ĺ.yoMKFpa+[[(OR44F(mwn}\<ƏYsapӉVƇi[h!4H2N[y%q!>zc?:fY 8{zJ+p1y'Kye>0ܘR `|S_y~Qͭ-/ÉcktCtX#K)-93 @vs!cC0p@q9XΘGkKt$W#w8/tz}wz\ :skkk0氭ߘZ^; A4MAxkcdaWn۾cʵ7m fR'597T*pb߀1}4=Uȏ9p=^,^Q}]aGop}JYV$$- i5:#t6) 4Q*SqVZP @$jQ5G:h Rc̯&ۃWXTTeJuQN_LRħ)ضi1 B \Chԩ5TIQϣY \:>ͅ(۠( ۣ"a5LBUqa-vQS Ph2"` 4YE $E@ADX5M\LC0*_DYؒ-RDLAP.[T ]0TBPv`a76V3 `Tc.LhH^AD:Dͫc ACzg_xiʥ.E^•2"ъ%QMzԆL+L2FSc<5`;;օDJj n"!}^.753,hsyVT%MA"gO܍FJMJW̎¥E1|.lE%B*,M+c<7?,3& ϣ!UP*ڐLnjtI.̘] xRSL^'23hE|*lhQ _YiiYoT45_ i{Bl,TPB&FoT9sfzNB5#GF .M+Tm $m{]oe)-ǩ=n T;KX 3)sO]?+Qq.pĺi|,6xЃ5'{}i4ǖV+F]ZY{wٶgSV昫)w Ɩ']P$2>Zg%.3h8uyAz}1wr_Sh]\^ZU\/Б@Ke{|Ys5Ct˄{S.a`4]aL)+S֗ٗl__|{ݬ9L=ֳ$W7Hxn1Dn-ͣ^M'Y>M<Xjh1I"J姟~UUi4T X RiR4m os7l[cd?O|c}.} J ;B c0ӳ s~>~oౣ0ጯa?==&_98g.ȕ63: 7Ûo;}Ƌp` ?j:lo# Rptz"|#SD/- .< Q'CyZho#*S PTk$+!W +m-=Xb]GIxLb;fho #ʫ5?mM%hv7iF wdH파 o!@BHO1 .͍*hWPEAVQ:ǃ*Ssx%a6bDFb dS*nQE۰*6$>M7%5jHu$!["n0-tn!K*uWԅ:Fݶh$kl4"%b LUnȊhxD/@(:.Ruã 7~Ҧ eII >\>!ͱ&fO\-rd.Bmx-)4,*FVI$ފ˯iq}5{isI,}pIkܾ! UdVWmF^!Oji-c4'CV)-$AYbjH.SƤd2Td"uԪ"I{xnnNo籣Dμxnf6vr _^Ot Ά2Ek00y7X"o(lteU//456eong]37a]XeZB6רul4:]ڨ=%X4Vw4?M_"h:%`4^\Sk1IZ]«л=@!CZ Tgn)1>nQwScnhQ5{Yd$Cr˼ZU~*.l=apB[כ^vo?AMuq HZGw64ʼnt3d LeFdlW@b3ͤaNn+(ָ}[qKU"u>,1|绿~~qƮx(b3"*RHhѽ,l\&2Hџ|H۝ ƹv} w3f`[ Z9觙SӾy*̞jb%\'csn)I|/$5b6{Vܗ_ӹab{*qxC}M\tq}a8tƔo<5e)3Rߤe@}( +S,<zwl=mt;Zn]|^(`Gtr9 .18&PiJךދZs`87wwuYVj~BolRmJ@nn/2#! ] UJ0q7ث~F{v#,}G9Nǂ>Pb$~_8nGG5 }cucv;1 ]u:|C;>dǑf džWrk#~-tު9VN'cMxxng1=*S3pj7ahzᯟ%8J :mm??$\]/?p"ξvuI&/cqbvBG#? Fzӑ8c:JUk;}SW#@CS3T G9׃MD޹!gOe]WGYLThqŚ8[P0UQ ֊"hD Ymhؚ;͵%D^CH`\~k7' m-^z$774: Y5bf(xku2MFmOnFETEF èҨ[8R7JZ b0j uUA#*XU,Ń"XՖUZAUb~BM.A]nAUç"U`kBMkAPuJ FAr%tY'PpW1Z2MY੊$T^mP hnt  jBUٖ$)![n[x+ bX^Vƚe&.o X)P 4( `&7Pw{EفQfS'Zkol͞&9L1bs>pSS6 ^}e'?:__`\>+#u__~/-S?sj`GCn SYBͰWY:n[)\rXlcy^ -cdbdk$`4*X .88Za㤋6 BTF5ɦ$p)xe+Ɏoy2h歃*&W mؽgvBl0X si\';e8(wPwngARFUbO&Q5G8NHCGR@Ȑ*:9N˝>e:LNlauIn)I䝗Ld]= n@?Xl͇*m\JZHw|}&{Â+UL"[- y\@>1BK2QJel2mmjNc78OˁN߿7nt{;`.Z?%tn+_+M:)>rbpI&2rBQGY}ii*qّQ Jwt`;X;~ l8m6e!2_i5E̩w-.*ܬl}2^mJ"ome8|+:byC!b6?󤎖ںU %$FI?3耕dS6txkx\iZV&>)ဇ7+_sm/ nM@+ W-0&6gRQ.p ~qx&~i~~zɆG[?_mFl~lj7`uxbK~|5clXM~޺2&g^' 7Z m;!зV jc})۾{ ̧`#' <}@ ~<{+VfS, REIܸJE4լbF93Y/ x}V*"f[=9zمc4ykv?SW,df6!I3KX 5*9д2L(ʘ)yCErZtBB`ĪYdQZkױTk,yEFj4Xf1 uKJ.Hݗڨ2uYFJMA5T5\@Nа4$KIT@( H妙z VL HP$f͆a) k f\6&th4D "!  &Bͤ6\ iFpt}}˨'@aAY/BM/ )مmDE0k;iis?7^`= _UDRܲ%"yLs҉Yr4z{CcDoY@tV޾$sA5p۰ц=?I±/6{oS=ze[b]+|lqIsDX[;)8Y顥zAV*ܓXS:Q"O"zHü.lR/:C?l8h-ގ{qo1A^Cч&j=4j$#WesQ'uE˫ϖٸ*P+336\+T)G`s..Ҋ=̍}+n}ε׹rF1fhycC:"Ôw-l MhDWE-t.Ǒ _kaz0y‘eNnBwU /5}S5MZp8ޫz8|C"]d/2=4 ÇTsxaK2Uh*_AR($nOaTDW]j>\cnV3o>ʔ8WS_#8;ذ(R]WZ(+X[,ca]jLnM}})WMlY]g kj}m%zq /v{'(S;TbF܅9T9tH}DhKqUN 2j$т g0E5x'т&kl-x1`ʖ@:goӝ,8J}g _00 P?Eƽ"xNwŵvꑐuD߆9=3Wϓ aWH yE@!XeBaf#RN_ÉrNUDo"p"ۮl4_1{[;&N>FO灝t0/4R[M0߉zmYi HqOR똂6zl}`  GD<76Jm*}h\OS)%HL~W#M:TB,\6. YՐxask/N[Tɩ^]bU&Z|,TCE`'G@!XSpK5B>x'=H}f/v6Bo;FxO*_hݛEWk$,E*"[R`?+647.&{U pn(~Cx ӚI3$hnd`U)TV릔v[X#C'/H †mS:|oOy“ -8_]sQ 0j2ջS߇CCW8 ٦v V|3{;fa{>|\f`om2/ {!'pM'ܽ+uiyNQm ??s ֌n:nm2}A 8%4[\g;\#]bMSmMLK5#P\mJyx`\Y gjF`΂4Kai "P@&433c$r6,7Ai4銭e?Dw`٬#[ˤRSZ2Of;x\8qT"&z+ٸte1 r^nC| AtaFPũXqV{d fSs]2cij.bϸIYqJJFR(UʨqЩPhWFhTQ ^Q DM!JT Y)5,"lE0,* [@tLŜQ6cAf- lRA$SL BBM!j:"t Re@ͪ DrP5tÉ"H ZA%@SJRd,+膆ݰ$b s:}9eFm($X4Wdr ZZ <^ +U.Nak3cIT:"gNFCl%o-^u:b^$oj50&Z  Ity LE7.GdIOb:A(#]9N +tam}]A:*t;7&A;JN;±IQ9qd *#464@BwN,ڂxl;T+I>9f$3.Ea 5cGR싘9qCmEz)UƽQx&F "12&*6!2?ʺc`Aju'yhB+%;xi=1'$<-dYV&=MemHz.L.˵)QT(qwl\l*׸04ÉʹvPHcMOPH|-sNiR[㐄ktJqXm\rBC*bĵ%ZN% NƝCC}+9y&hIphC7,tS]ϲAEʓ~ -L,[h/ih~B q1D"93C>KtiQŵd%3]I*w 38PʤDDdL}X{C{3.B: $(8HT \Ӯa13OU,EGҘoBZ[ZaU.d&ߋ7Jb(D:8,^]fw!3U0#5JeՅ*HZRNlõ:t.&^ӌeD^pʬ8C9бs᪏x/C0POP  !';%}VD=̠h%a SQKk8!F o/3nU(n0$ԀD-yS09Evu~Y%NFѳXDDŽm"-=Hha52@W_ sYNW,tdnpWr_bKhS`sCG:Kv‡ok2Kfb\Oߟi=hNo5rUd[%t7Aa< K—~||pdtAp=^Hg۷ M|aׯ5GN{Snboiya#/ Odqu <Ho`w6Y\>0@:$Mڀ @ $NXo6 S.940[|9!hd}ν|S=4/^}X{sFT>K\[`j_ P{RnU(yq*P9B"wNmj71!X`hGvĵz7昿.S\&Nxf S6r^ ;vl&|~^ V͇bE4>RCBxVImɌɐ1aAȊIG $ADi,5Pkb47Dj2&"  j^TTSo(WBuj:BX(H jBj")ԋ Juz>GM59WE,Lh1CņKE cWu5&"-F{ WG"X<:Zs()5(3g NjI,heJl1}|NfW[c:S8) %b#2YaR{hrL_,O~~C2a`,SYq9%<]2=.7`V|\Li} 1f8==rk]wrE]0P[8ykt (ʪtwtН=X} k +6y;.;pRdVey\=&"e k%X-l%Q57;1r0:v8n_Е:R!A{w["|a{~@9WlMIT8ޢF2nW@nnbLj\6Kuד|P&K֢yRbR[a~?B%A֬8v|f|7ן{'Ѵ e沝Vԣ:=Y#bͶEn߇jW *)7BghOt']|}տ̓>sVN}OG[?? +ݽ#ffvM\[61b-">Q![yr u6"{8G7S@tg60rWi(c; IDATnj;u æඦ+=sw_n 5gtC x5g<LZ$ppH<3JA>+h:W7:|i<upamX#܋5``4 CQ0\DlbŦ#q7ms g/i87'OB{ lӈTBsݝ,͛:\b32+aXR S،rڡo*.YvDsG'׈D,88)aSudSgCX$C2x;yKܦ&_t>HA2Sa*v62nE)-PѺ/SPwkT Z.% S 6FYhV$ICCAK!u QtSQRv:+SH[`ٰW XՕ, o]D%,4lasPӊАu4@]h5"H6H:QBMj(>N1 DZ:% G{-TJ6,6%w'lhGr(6leUiq ͌{7J-5.Q&z wsLKF gشQf5&0b7g/G/!*Z+VZ1N(#+ԒbUHW],vE3f8~AL#tm;cn.ƄZava,ZާLm۔clhRA ar1ê[T\tP;Kt$(m6N"{FNPȍRk~"ZhUz$u+DĜDQ)*-N ֐cy-Qj~-rŵUU|f>@IlF;?S* . 8k-hK*7<6b^:mi&a ~qxpNy9C9rT"'!R6sާzȊug0!^Y'mxSBpuYKX:Six8Gz}b]Aѩ I,DpfiwKK ]mԅynuNW%[`i*J]`}j5RIJ_иҭ6[w$;L3M^QRTzZe'AI̺)/ oHyHYKljjmλ(Y#vi MѮRLw2( eJRA#kP F&u=G˓Kxs8<?~kņElFnw05sK i@PasQO*R5lDZ-+ez{!vv'UgW3L8n3t[@q$?z',䰵Ix9IcD1\1~Tzhξ&xFͭh_5Kiu^¯? +K7eGc _'o3Mhx ZI~gs Js xrg3?gkh,7f{{?n"wA|`2 L4oD[ Xo8Xxw>px.COf߄-@GW^7eL&;G!(W`04)Lþ=حre<4t"txWN;7::'~bh 8-oBu4"7zڿex/evhJ; j$*1BX(dju=J-ekr u5$a2u13OX]X|&%XiObdK.Ɗ$j($⊁BΧ!)Yń%҅ [ǩSD?yJ[4f*FIA#q^2a(]9jzD!"%ՓE.~`aƭ۱ L)AY 0qQ&`"h@I+*D7q̹Y@Χ;qlutbaY)-s8:j`9*ۨ^[cʘ[B YطVf/ -0\'θQ2L`,ɰ|ee| k~}tXJdek:, 85d0:WX J؂IncvO!/AŒER8\@PY_" *;$d7qS)QZj%~ΚhTY+X<R Ҋa'bPfsOHe. ogƅߛg#/ov<>; F yꦅ]iZ.&.WIW%:<~ 397QO\E¶qB eh74$Eg$UIEZؾcCSoaoibAftg7$tV-3|b`'R9a[|o L}< \{h/pIȏt$X=Eأ?GT╣x <Ѓ$D2/#?ȩwΰWmzGcoi14A&Aי(qNbgY7mLZɰ^eL9R,]FY'뼪81l tA;f&2}YpWI+X!,YWRЙubt: %> ۝8HL]qF61'YU.z5*S+05KHm]yW.^[vvXvY<3ϩSeVW/zYV|Ci8con9:`1d<3Wcf5C:08ybzۢb]VN!B%/`;Dіzc 4v+ 2,mqz囁*_P/%){ (XSK*)O;5€|n)tXanJr7Z[?=z|C [z-c-6Ȟ|J6 N,BzwY-+!Pm6Z7t67Ld ueG\lu Jb 5 [udM n^FeĨ,+AC)x 79-%i3NgQdIxG&q h߄00f(Jpb)sZGt> S;`"'+pd򰔁= xe >|:90gҤHQeY^eV{&kٖl["%")f1&SLC5}}\fzouל:= *Yus CI/\ݰfdGaU;D9bxU5˰}"KV^>MNv}w[|;{aC[36VemL5&ikU*XoT%j=e~H`&XZnn_bW`|i_p׼6/(O,y\IiBW0fDIsM~Ba=SDSMEڂqRHJ2ΒB!&1}:b##eZ͌H33:#Zo1_G zʹXƤ)6,E'rYa SRrRV dFzGa׾Bd-2PVdHɏ܏I;SwEq,=&1}{mvWUϡf X}"~/aPSuA,jٚG%Y'[pPȆAk{oj@8|kfcg{vӠ1i*8ӔVvi%/FGM9Yӆˌ:I㮕P%/&QC8s\l[>+%y6ƒ8=W$oY,UЯgb"n;[~:ʔv]oZ 'X70lΣѸ=zLޢ]%&Y-NURjM^V7ٚYd(>Go4 NVyDBM|&PZivwsm);m\}GoFni0+6.n8oNQRo]Or=>}@eF?ɽDJЎac=CFf^_bKYY ,CyTCv_)O@cY}ި1.+$? ^+?q_ҽtܱ!~_(dEQeru_W_?ȫ']6εk_Ƕh4'ǿkk?Խ֚~-XIzeVOC!+tk3A8ӷ蟻nǰ7;gOGGF;K<}ie:݌͞R8 "pf+NvboE 9;rih9&'(;[Zȹ<)3wr9k_ Nx7%iIW'[X9WPl8̴)vXyy[4eWx WY2Tt{S62v(ԠD9 ->S/HH*ԹQ?=\t1Wfoiu9 O0*cNvf|A2ۙOb W]Q9W-Y9kžD'QOsIt@ʼnO/TS5 m ?FFD3{!T. 2'_wZu!-cCȵu|! zBKSr)`ϯ>t3_:~#d`T6(Ґ+=Apkvޘg? @H +k 9ՌC,B548'1vΊߖ!&)t\fy~$pU4l&.PO5)V+Pꌲ"UջoN &p٫NN cd$Hpof&sΑOLn:':^5 oWom6U]e {pgR|nCQe+<7н:{k0Io@|ۣûg\gʿeyV;Js!@$_AbYKHNQ! rKylۆ֩ d%R)d+:MC9Agޘ)AK.:X[qa*x6,zrN kh+Xu g hE QE&( fEz'\TJ2A{JC,X脹)XT0&F~9fN/kwx+:A f.I6j k7RY=^6j+rq>D&']9xNC,3E<o뢹(bӼ&ਯ!3o_$tҹF^#ж}-/D#y}hWO1 #؜wWb\d=EwO7u^;[ީ X ޼YO~.Ű?2gVc]aJ#(q“6W^̟y[?\?[{~_Y抰:Ճ+tvmu"V_B[x7)e[h=&QZhHWI bʝ|c"[wpr y?5M ~O%VPoowrSfΐa4]34_G]~_sBRg(y:mba^Cz>G%'_[$x82%yWgX^9ՙsX@IQ[mt"ɜ~]GeL53G"Bu 1u(Df6hLo,#F])->¹v|E ;%|L&TFY6oFNĐLAF*sZo3ܒ#b@L9iIZ'fۦ>r ^ɰPɞY$m<+4Fo%y$M1VO aߠckhDc˙62+ : 9 SW1|]X} BTmIs`WSCYZf5NefOH;ψ;\Yl=WbbLhҍOBّ ؋cAdfcmpX`bO"Hvc:;ceӭA3͇UZgJ[)O<#ŝg,92t ZX+f`S)NoQWC.+\ =9&˳8v_ &J62uS`-rB+.Gj(]{+gC 8?FGmbg QU'/"o7Xs ü1"8eԀG&܄S~V{P[d̫>{ ^tY˶?iW3Sire[x}jþG+wВRu6_Wy{!clPE8wvUh'2讇硡{Vk zUv/Ût"jԖv L r뭛C՟YwvzPD_wTzPv3-Uv7ʶ*jsG:,VeRKe V-&@! ;`yVgf~d@Di|RU]=;ǿr^2Rwe{7pu*Oᾇ5P{? 2˟\,S U6T/յ8pyZW'~z̲PB(d|p|A/_)aSJ2WH$+Zm&Z0*G/0ˬ̇F2j1 Y旅Fe* I*Ns 12MvESđI%|Aj/#+5OIiTx S6E 0HTf, %`v(TDO33@+'[6GO=DeTa<LIW);tDYja pHՎɣ@a%Q3͘زC.pچUN(YSaJZ?}v/B!FL :g8Kx˛X;Z^5Z@ %)1pYKmڷYIEY/پ|l,JyVK"fWbyb6RA mKIܮ;&t% #2Fy*YuS.>ISGa~T 03f)Z񖟫'< и)x7Vo\@  Sr=)NI3E`f!®L | ,h)M{+.ehR:M"R_88yL"uPf'å@$塭M`/x2YyeՌDrB2-#e:-f /`5먂ANY50f&5Q6\h-|vyOPv{/9* 7Ũ=~Fq6 oΥ[:{ÎͰ#ed<=jZ¼:V\]8 4r R/W(Qv=IxFf 7A)L;/MY2?vk SFy\E|-26E>km]|$ۏGvx/-j_o7Yv:Xݥm iDcf m,C4Ƽ`eWTGBwz5^<̬thͤϞnBUl%Dę,Iv4ol&:C4h0s3HYifW/0gAӖLd[%nvy4,lb~{ϵQI$B%PYZ2nŜegf t1s [͍4Z,ݠ[wꜧ15J{/A]F oXFs9YҠւ)I~%`!m 61'Cإy;βtf#9+u,w|~#{afd+u9^!۶N)0yo%H; !R.T hf\vr ϭq_WO}o:SF]5;(wY_l;tvpaz9_1hd{/b b7:G7q#j%Uns=oO#hiqsNcm1NlGh̑.L&0[h7o1Ay{__`U(ҭ$[Pn}s;HwDwcѦ h/ҸF.0bJAnzk7EErTC^Twm;%Ϝ7\Vy K d ~*}Gﭏs?}L k7[ 9"ה9g:7V|u8;Q3wpW)Bx jufxr?_?8 CWeV}O LpF,mF .WC ݳ`S,%`, oMB[}9(abB+p~o3aqv K/BuCkMՠlj;yg?<*[fZ/F1N+K eȥ_sJs |*[4^5m޽Z=]0Tpu* Y7DRյjjp8[wU%4 6z5Hf쩟y?Xfh>A2!lEř'rIb+DLoM-<:܄j`]>n{ynp})6Z tsљs՗6gSc'.LRL5f_@m0'\r.UzkJ7hNcYcx>^}R3$fFx栙se Z'"ߡYO 6b~}eo{XKv|RԷ~cU*)#}ܾͥ|ׄ-\寧0WK,N~0 'ܼB7).,xyVDaw3a fK/?ᮐOQ|_}{a iK3Xά Gjs/?n &GZ+q< 7԰Wp N\~o~ic?ϻ$I3/}i%?6O)a9#Ʊ9I\˓f/xo6) 5d@Ma+uo,:/GblƇO2LmܹVIe> [n3hZU({XRHI˘ʭgD7y d~7?t'̄hrZJI#&pؓnؤ9ژjOÕ^}|pm ԮXI 16ћs12KnY,{q7S:pg.0f5Sm &qrrΖQ >xO/ x4E(fAA;GP):+4܂ou$L`DwՕհ\H[9hڠҽ߆YOZyG3ЗG I8JEJo̞8:sl &%G;^wN^Cemo3]9w50αA(%(a.mdr>ZEjɶ%\0RY[]HB 7!-IB .^1v 1ֈd4iNw mBjQX% bn%_ERdfn Z[ ` ~ 1g!IJ op^E01B6%KY$78anvN,T(_>eeB6W :EjCu !q .HPe3%H! غ,|1W}3^eغ±K^uxUC1=(lO]W?IJeJ%HGZ?5l64XTY!!@(a"f(&򂆑Qefiڶa%08bNJSZBJ2fKTٛA;5 0mSzR@V0ARYm"VJ:7^6cv:db1Q$(ƱFQ#ԷۃP(GrZ3 ]4l԰4PppEAݔɅlhDcG{gKlVQ(F+y*'nb±N,c/lk,pyY ,DH!9ywIAt-B^YuF&CބAvsgLI$?"v VP)+w$+8} 0Wҩ!\Gh5h1#kM9aDǒGK+_cCHŏqdӑ/qu{eX.M<+GDTc:YÖs|kk`oc 7 >HRKs4q/㇑h>0C yoײַu̿SNo" rI4NƺIj53ݬZGO cZwOb'-V'viWM~0L)ȰǴR†Kʽ̮6/%VJXfiTʐiYZqUf%(SZc* {U,&{X1 i.(+zJhمV$Iʒ⚕g̴X{lj䴪=:r3"]fMK]DjXBXd.W4z&k82)[X=F K)èY~ )Ԧ K$cT*XˬM!߁1[0o ?O^kADn7|UKN55I9WWXQy I iڵ xu.ɪQLGsVƜb.PO(Ok[dvP@]h-4ps<|I6Gq$PKk?o@ D&]BE@% M!B̟wpZ*wR ,%Ὁ|"WǪ&`w ~z>~S%n1XYɝ5pj#kUG˫⃗߮J69U}]iJWs%|\n~| | qEdb58۫lS_;!ыslD(AT`9hk%텎ڪ+_O?KܯŽOMVP}A/oÛըl8y{ãV5뗪ON[ IDATiصR?w6Y,,Ax-m)؉3;h6Ӽ{Fx 1$B:!- |`#-P gLbխ$e4+f!f; ,g Pd]V@6!"`NJa/f^$ h2"+&; % eZ,D r-kJEWtlt`.SJq<}mځ=vl&{m/Th"'\P-th@-Z1W<2iW)6vV_$.QZajnW^k-009- m~G\d '6 emW ֲ^ /aBLsއUߎRo"RJ!\tv؉uJ!,!R&괏lgOEz?D>JٱErA/eZL6 Q1?IVI/PMa2_ĒWo$nxj-$Uq)/8BI]4v2AfopV|Rk"NՠϚРO셞Fywy׆)|o:| ǸVaDh}+)ZlP70wQ(l5J D®9n0m4B l"װ9>% kuG{ 5elrf8Ro R.Av3pڊN|_ZCS^Cb^]#H|]ŔaʣHEFMN=5a96" ̶[O"b\"An=JJyQ`q•0eRIJ<Z3'2=sˠ^܂W&\ҲPJ :s߂pv/%᣿@ݿw>?y!B/pq>x?\Zs{@7 |{0 ;{ac'|7 Tn/E/^OV脕=k 9/G3߂y:8= 48?)gp`f`toK@KB9`\ywx)8N])Z ~xz/~2+7 mC_:[EpU.jS0[7xvi>V8{j︱~d#?+d?5HvA\ Њ KDh0fADF8;z)K|kvmȦNXA_ŏ2"Ißi(jQ*%s5$B:B0bd ְD%*D C!B. 6PQC(w.ɕtŰjq2[^#qq,{FFz+i8U ӎζuD.XX嚋D'JT%+t,Pfh;0zx݃o ZciuM%|* !=Y"s AvJDC6]ܵ:SGF]k;G0®ȵJ|i5ȆW 7RTKȨ9067_Is\xT%VM*V=3'm$oRa12[ck@uf{_CBRhVHsљJJ~ZXJ3u/?qE_N.ˏQ^Qs!|Ae9R`M)7W&ȏO.ou./DM_S??ͼr;9q.?m9v]CMT!o\c8<OG߂1 &x>tok'YK_<(!28}u~ji:Q]=@+j/CK϶g{XҾPgT R*v$}q%6n>Ù;kXu[K@$.b} QF0!0|A Wsf$ǎGi#uJ#xz 38;s14w'(K|{;Ѝ4#/Mh->oZ(P?. ?Wۗd_Hk] q,Xא?+&6jCAˊ:jJAM@ 3נPh*ՠDuZ-VB*HHL 6\TK\ #Ҵ rѭc Af\ǖ A !6(W[q$4e~7),VHI([_Ѥ$'W$؉HX+l1)N~cK B;ʹMɟƯNw#ihSl:KM:Z`w?;mX**k1k`Uhr 5!F(2RMrٮ zS"!uA7 veIAH_EF=z Þ'3Q` 4 JPM V|-Ba:hr*;G+袸5kk$bT/;Oא+VQf:BZmHaɜF hT,_L8V {J$RpNÏfF,f#d21c[Ig.ϓփFgъyZ7զk,)\azk,thLuж%}`.ހ ڢ'/|0s }Eo_>.=/@zO= =޵)8 ޸N/:tE?~~|Ep>1X\/r. +0Xf8WXvo33 YA41Exjǻ!nh뀎d`/hpu ~oྷzV I _<WĜHo] Bd~KW4Nˋ"wRH~+]tU}A&J F'ů7Hmtvrų{~͛` ןem`GaP\\aעH"r; Q] w.ob"Af74ґQv=l!}h<}O5*g;oR^_.b1vM 4t]ɧ?j(um"'Fl a"ӗd[n$I/\WvW7BsfbK!ރBZ`,5o&Б@u+y A QPp;lk1$!U< h 8?(xb7 :^=R - ĺw(&UҐm B vUH b)E%z>* TDuPZ Q5Z QɥZ(ɚ++22ZGt64  \䠷uݫ#D"a]%6.Bo@W7F]Ǚ9) qRQE zܢlg 9WƢH$D/f.^`+P_#t?DTQ:A{MƇ]AJdW,kX`9TXiAh-Al=Abu Qn đ u|eD #%ށ-JuLҤbit: :uY gI"&چۥN4E"bTNFBN& 7"ZtDd>;YՖ~ߤ8#؉t.8R:  6))v+%.!9jP\]Bz|OQf2%wtMu^eX6Q:'gIN"[H_wq`.z3i5 m?0lf2S| jgug„bvbE&: J\OK7{ozꓜZ["hZuy{ګ$2N<P`#TP.sO/ҽjTÎD=klWxLG]cnr玝jA&!vc3Dn$2~ ?at6^5o)?Yt JĔ0Ȗw"\$gF5TpneӫDŖt5Ϲ%ك;9ӬZUbuObI!ZF7:m" .=a xUe Iqy&QR7J|a`%l:dhf=$;_ 5?&(4Л oV*ɨ!&3d ȍr]Ԅ@jcqio]ƓEsO/ʘU^:RQLٖX:v^ށ :[K.-a2}))Q\ub)O06(p-#g)Y#)v>9WI=9ҩHNZƳW S[d)5cߞ?߅4djaC 5hq`%ep֜`(k͂pTzV?@L*fM9f&w{K*\}'+Y1cN|I2ű:bc2+RjARX 5RZT7;WX OO=;sq4 EQץިyu=%^Kq0? ->^ee_zyy?x!7?qs=iO? ?7_/%l3~lR?\عD[k)J8E"RZAWuFPb{KDԗ&Vh?#f 'V1xOwvzp]aG5 Lq\e`Ag'*YEa ̸1J.Cˮ1d?nz~.+hnBv ݬb"#jfQEL\p͠5D B~ OGb(a0dH=k**=EMDd&-j+y7<ܦ 9 ]F PN} IDATRrlBGTB JӤ)ḓ\bW3ChDV6vn$K.I_D79`%uD8[K'>/2LH@mPMC4 IᘷVybu(j]jw/wj4 {kp _%uomc/Fw*ܳrUa'B릧=>р'uj[|#7{h넁$,x!XUx'7hc? w{i8ZB[z˙ w{}7B_#HZ +xw&!]spFeK~O ,&F_w` Kܱ`/sSvÄNGaPSNBIOXGU-Ʈ`}bZ 3+MgzG~On҃ $F),S6!jR@\.e[u9L]#[nlFv An/Ѥ,l|jQo Uژïimam0̕&#~^ <+?Ǭ7 \B5RB?KYJh0<7o{yL`'e4T|4& /;3ptp nmrf`w*| MPuJzgf=r/P+nxa#ݐ+']Mn=E'RFJpbM{7pʒUrE{ap힘WO;wׅGSW 2:^/ 0 d{8~Lb$|Y1 ,C~ vCfdH˦~Szho"vb6bu\a"ׯNr1EP=L~FD wd\BO&"*V|R·f!I[~fB4Vh1]]XDa9e (f8)>rmlOq-1BKUPPpCuz;؅җtu3cO<҉־O^Yfђ1DJ~$ жsNn6qg|oϲT[q%Jx:h\T24V<'̜DaۑtKLU`2gߎIda߲BHw {F]ֈf& 1ZAC[lNd7Jhl\ΒF=YU>~-"5 'W),m6t͇u9RX}8z A 2-~?yͱ23i%۟AK h/}[9^cfv+ˋ\k.n uHq6Akc,FK |;8(:Ib4Gf\á+ k*Ѯ0J 6Y,0VdEW R*kDi2_$V>hܸFY8)v:YFŚPYX[fhni/¦8uip8Z=c !ޓEqq1) W:>L۟t,uc:1VEJyJfl[`hf1ϝ:x:ۖ08ۿ[&`sXuL}輅;N ՃG\p8/@x %%d,\7wIN*[4? 9ù%[׶[XYA 7QJ?Vc,o^I喒x1 ^L,k+Oe/۳pK/LG ^3O[nT!$hF\Lv`fKD?⿆I uxS yJț~KQ z̨i< {*ǰ7…3@V4xi{Z&\Νھg|Eh ~02IXXPjzlM 6uC_Km f{RoS_|N\pp+lԠ_u97T#>8z>_`)&TJPXWh y O_9c[z" dCqޖɮ=>+7ztBuaGj^Ⱥ=ʸ$y~*l$[~SPvaIy}ؿ>$> #Q"J afacL"TNsNL.. ,L\f<(Rӆ/ƨFhjQU0g cMPG)VP;):Ь,5bIWZtjj"j:|Rna6O lFR\{t! A=G=|UL4(ǣXB_WGOl֗$w{QM"hR'Um$~V/mLnbT'ujUo0sU16S$YF\HMJ LT̃O$(Sك[c$B4L &R9RjM%1~J(vb6rdZgprRxSn"4U5v-#`@&gp2v|]nkѲm,Ɖ3/‡%$FG d,,"['S*hmOѵPwd/۵u ЩLK@hթU6:?#ضϞebtI ,KCj*R5&$኱[M ")*?pZWLmx$T4Kub=>p^v ZvO@7e].s45Oy |' \b &~ ƟC \5JhU*(54f_ړ$WjWioC_x k̬7 r滈eD% }t18U`d*/eB,L^pu3oR"t;SOSO٘>Bz; ]Fu ǹꝔ k$ڞc*:<9?Ll=׻4I_YA* rlHlSO&_{}KDM @I/j1#*(u"Vz[+o7 BB5+Zȟ`k83M?bnE!8Zj͙\^˯+!x9ۆ!;;ay E8ֶsނ?G 3P f 17}.Plbn| bpW=^h*_m裓#Ý= . ^/{9}Zt݄}wz5~pzWw;|Gɳ^G0_= 'umadqx`a ׼v/mT]럄WOA8C=pa ݞR|>;'{ Ǡ}6z ߯r]7< |>rf_S&W;)$9'2e?)T[eٟiwZ*~uƗVNqh D,T<8l*zzp@]GɎo3! a^=]mk憫/ +75}]LČEE &yj5z#<4gAb3Ƙ:JڻB7rxW5n;'vp™Vy`YaJw2Hۜ&ʅ.}pWj>G̜\l$iP]2|>XoiN/2Jbµ\+g*LZa1Dn.'`W5d<֕} PBh1<@>}1Kp_/'$|)|^J=`|\a^u Ջ fTɋ$[; S M@O*|tbT`~3Dq_G0o* B)X.*}h6x\Bjt U+˛M:.8~vQ[nÖw_ /wypRebvXX4U쇛Wã{`!bu#vWn|yp;{0a<=p0lv<.̼D@yg?6/߹7sUגJJȖ9}C\=V o=֜a;mNWM2@A4ɓR0$2ϨaQ*_=9ܿf=~|`;6n~_0d۾ yſrEUE>oOg8 U0j..lTTrsxҹoը-ΰyd"ήX{zWo|ޡ{Ya: `hĺaBaXOA"3axв._#c04 =p bup7\== 84}SZ*;Pß|>{'n\fDD]Rb>&'k`]΁E-=PV$YCV9?'7,=h_*4? n7,i`A5z|b:1f{=.𓿅%jfaJjsvHyvi6m?{L@l 82P_*ǝJZ#OŠF;O v @OԶgTغe /=Ԇױ ۂ ,4Ӫg@ME$W'x?_h2wr=bO~7FGJdy<01*HcxyN\21-X{>Ce xVkv6{`rзT9aKX#~*954y `K@w@CcC0aU Q_nٳavDRp|Xzv9uJN(A.LJ Y&`wE b(<'sΔ~Y~ ?pZoPE<1 ̅TLFǡ\(.KKGEu;$>j!MeU ~<ZeaAr/ZlV" &QfP}m1WNM M7vSa)M2a2*VCa7L.xu'8ڬs=\ cʓڐEyZ[p0)5WK3cE-d&[U,X}wx*2i<PV=P^ NMM@2]f!{<$Mq7DpqL58,]ɴ8ba^Z!|OOF`l}u Ο /Pv!+5>9p ?x(DŽDGaxR 7C_ɠq[n6텊\@2c~xal{f/儒*< V&:?y4,Z4L {5a" {%TRvF ~Q3@p jļ `Ix; cn,Xdق ,b<6t)3}`⮭aL_&ClxoH:[}ڔ 9 @,5uflۺUVbӏqu8\oa6ϔase:<88b )խ[p8~/=ťc+,Z&jAf)58a1ؾƆ`j04W…w["TJ/IsıW-r!_֕W֬Eq޶n\ |r=o]bX>W=p,!4: gT£;oJCC(^>,dV~f,lA8~eCLط"? +V@$#p\}Gwk8* .s(̭%3 @(;WpDʼ-2;wBcPQ gPXJ]!Æ8׿=`e ,X1<{ LE94C_ 2+_o?v'fCl6̛u/ dT*$%x<*.տz t[M R='wA^K)pw-otŋH"Y > G/h m%6D=.+6ÿ),{ fRqP9+V+ W 7hLbfTB* rct"=0c\wqTCn?{ǚJ8q f5CiDF#GeAդL:g}P[!D:HXo*s<vH'> }ce^X4vDe+6E-X`+YP *iv?Yq@QNe/ӄP^&By`D:49&`ihUm٘>f>gܹl~~ =ͦo*a6 'څi,m&O>/}+W'GOq`[?TyQ|(̼(/)c2Ͷ`׌lS wD퇚V!<RUDt@<.LfJ@7g#'` ibJQDq)]p~Iq3 උXQQ{C3$wΛ'9ˇG`WaN T.]HnX(ŏA<:\DT=,y7 :v([O¿3NJYvI1d`h%Y~9YUo [ĘmxRJ#IpN3hGy >6Ndk惙aX \z?Xs΄5<9agxOhʳm&L3+W|ޯmm祎Y:k=]w/xr11&ƴ Uw(܆s:D&W7,efaO5kxGxuעT歨Ek(U@)cͳ>1:M by;6 o:w oT$P UW!4B. Rh]&ra22.yYD%LìzQ/A/K ƙ>p7^#ǩPfU~XX\]V͂eu/|d_2O??[LZ!OH V(EF r#KpР}Lh.΀eUy伌MPT$ĹzV^x%Yǡ~XaQ ۟FX ' ]GC] |n(C,#=݁"X> eÒ6YY(*2MVf_J&_kߙ_sc +֤ JDxC6cYPQ/ү=o&IKW|W݁nsHE>L*ls$M3xs<\MNu=ތiYRfk?NN/r(U3#w9J.vx 1ٓҫz$3AЃpAT JkJ#O¬b v(CB snTRL*@ѝ0I~_ ׯG9.y]"%pQ+ij= |x?M%~QP#)yYl4"./} >!W.^ީsQz5Kq nh?Cð|8u*pzV+WgCDtlpt7,8:@=+B߀̏Rrʀ(曏yKV%^|e,`UIka>޹qI&JG1W!M;'C<7~M{~Ȧ=?<}?|Oe_ut !YWY>СROo4B2]G9k%J o`] z[ ]{~>@M3,^xqh? .^"m<*; !g!s㔔o 9-@NKg>/pJ)ok#+ OF~J"tUʩU3Ş3jPJJlcXܤ:"ʩOᒥ0Þ=M A*!Br%)F(/&a|œsX"]&!v|~hm~pFC#5BUCQr< p-}/1q..bo@^yPqygLg6B fwLNI0: [r|#p13don; ̆"]HܙT=wCI=Ay{b[_,X`Uab R * 2]ݫ(*|'3_0?>n >QbܷpA} ((꙱<n+mJaR-X`s/H!?6/d$D̦렻Wq< uP_ [7BmY]g6Be d3P1_!1JǡT@['DMPS k;t&'?rqeP,$MptZq)1T eB&g)+fg-Σ8" yokkFpL̷m1Rʏq?G N?_qͪtCrC5&x]U޻a7/>&Fx__ ~)KWUq#dmt ]81o+gق ,bQP#Aر)DJ)Prk` U؍Wm_7ῥ&Ӫ۶mn#w~eQTͦbN+@Q ՎB2ӥӑR,X{'R(RSC>>&֦)}u_C(RKœV {h zk{NwD l Bp8aFâF}HNj ka_'OAYVw/eÜB8L`w.4Gkn=Wb5WU@\]$`#Q逿\_|7 ys%JQaAGEaqVe+Xzo{/\*WAl`b~{3!h[a )F~8^.R^}YnkGLǁ,kȲ ,Xx0 Ȫp=ݯu:QhZinwNo3 ]nB0^{-wy_cw.gͦTTzʙ)8}B%)`~5Bn2' f Zۄ,g_`KnW*kv|rd QlDžxg:P=*]7n)^证U𹿑ߚbYQtLr7j|P⁏ ORxᾭkɣbZQW dTjK{ E]'N݊X!yk;&}եP]&hæ,{OuaN8A#$X.x >wvrrx 88Oy89*$:,-PfXdق ,r w_s_ߡ!l偁nfEPso~{?ğsZDGY`[rA !w,PBz=~iIrYE{b)tl0߃*='GWo>Gz΅ @ka< pvC]=00n/"~QKm|({¿l= -`\̺|a(..9s**K{<z dl~>r99%ȝ5RTmplH*%вfk_| >V.Ax:'p]0U/=9uÌjhEF?ٮ y?5)D\ Z虀VI9> ,r9ȼY` 6 --y!7x# &Erܺ׿u>OO}{wC[G hV$C`{Eqe<뤸rߴ.+e!{!J*vRbы-P_!t^< \HK0AJ?p:Q^RQ蛀=r Y\h$xB|281,缪L̃^"aA&) f!ʱ$eoq@(=-X`?R*TVSqp8|[hB"(aXfZ,X#Wd4[ lġ\Mi1k!7 q]+n[yp*!fk0kX/ k N:)>vσ68wt\Q]b}n:lӄpLn{`~Kfy ?yAz廐BE58:(:g@<;:[۠DErS=VHv,z`W<Y9W=K@}T04KiB<EXB[*(#oDdalN/F(zq J1Ȑ@(@$I;rYJY^[|@Qq1i [ $">1Mc47SD:O`r N\ehL"$Ԍ{ꏚ $Ph8f?*G6mġC({5qo ~WEGD l9An3l6i C"GRU1nMC [6,ưpTv]Cr#dp5EN3/Me)EL:j{@/2d̴e)n##4WϑST4=`)nsh4$gdq,4h윜r*e(#dC96{#®9p ;AΛ(dm&˙f2acTlgI'tE3i͕'<)0=)J2ꗯXGW4fѢ"ǎ ãbKe!@RfRd4iSb:3K:o"C#hp[qN>=!Dj3[CQhX,.Zk 2w IDAT[wa#YX?TJs8,9Fa|ys`KۄPmM%xl۠ vmU9x]K-K /\,I6BsIgsӻ fq "P퇎!. QuUK`.* bKwGt >rpQɅ\6+x: ~$fjLDžϪrS`AFn!*Gaa=ijɟB"]0 ^[MȲ׌Zg; +6dy0r,xr7#8,uI;c8T m Wna&1:ތB̥I;z)E(a@bjDO5ȹ&(ivA-2)dFHA 8& 뵤BTH+C a/ i_H'CE2O>ӊ\FρJ(pv' &*JäO(Eb.vѨL2l '_9ʤcWHLGP|$YxKT<9O޼ƅœ(&pa& WYoI(c3'sLp7fs<I('RgF5P6rZwQ&"J`#ӕŭf˖Q10H#( GJ=DMM)4< Wgԥ2}.1SE'JY#S8kɌ:( OS=Kr"F2vj"YN*I8DxͽLWhVBj3&'au*$FFi&Hll]g$ d\"Vbt <Iq(O2ѨdG'H9㸳)f]'aw25EosX1zm é4TN]JZM"%5PvXJde +cH0i;Qv3*meB\F:y^67]V__3TPU*EAUd'|^9u |>˶K6m~R<7 &3IpTz^U̺HLʜ&95yi$18<ME.ڪ=3FSZgMagfL:&ccjB88S~j[ ։+ŵ%~]ࣤ҃o㇏& M#2:񥚉;r`hɢJi`b2ᡭF59"f JH\((i-?N\-7I*J(cqZ$͕6Y)6(>eމ+FM޾JhLs1$ܓ3 d0Yf~QBdl"( +[os gvSżFjIԴx3C7%T򆍜ǃp(zKOQcY69d1'by'(^H( U{"JYnQ6 -m*æɘLnMq(m\ȅ۫T+3&p!3=%8(VkJ$R Uh^0Se+TlQahnbhl0eMCc6dF&C`?Dz+b$b9C<Ԝ fW3aw3RjS4,0͓٘B1hh%ePɢa`(6ՅP QՍA0.ResI\FҋnOuqfLT1^ڧ FQ<$qC)qg|ĵ1\jl>ANuN\;1~^8ku]-]rR/Z=z{^PH낛:? sfBG2BnK†}sB"bns -MY !xyRJ|TZ~ Z#Dзaէ硬eFAC{I2|P}1,}UhC=pq+/}V, \^|&' E vٟ ,[xh(*e aQ%3P0MPeH9PAWg|2Mf6#8\5w|։]nye1`q?/5?㪶^>yqVWhƯ{?@ %#hOz2j;9$fMEY](yMh^Syjcx$IvׯXz_]G]>jq1a'}(%NlCo BĞRM"0e54;BnZno,4Ա~)i<$Bxk _Q0@~GLC0H",Sn;DK'9C9tt C`hEe(I0&SYJ( UZF0iND=jLQIU% MM v٥بN3ٔCMqԌRiK27&&4Yas'I'HE1]v&uPCpbOc?tAޞ%q{(ISsӓݕv%D/}_pxL@ I,9ƙSLtU߫{\93g=]5LXW;#h &jV-DJуXF,8fd&%tL\fY{YCI t[`A3V ys"Pi\@SF MJ{WJbJ.Qs:"r#W2R &ݏӯ23qh͝rmڮV^84 װZ'4afK[\LS[X#6aڵh▷|ɟ"a -K 2mR#/ULs9tENi WY7s#c|=vst FRQ/>vHdV|;ɉ04vNkm3:IJR5Q\e߇5i꤭ksDjY\VSArU6x [8M@h4JU ]~^%+Ȫ_`)KƢ먲tV??nu*{TƮ|}Q&TEDշaA}oLm23ps+2|cqnB׫L'zfLzP\r9ܹK{Cn3enohi}#娋s /$gOp2z@if}#+1Ü"/[ 9Z`aLN٠i5ñ xϻR׆H\]D4u:6u54Qk7ǯQj\7$G9ѾWm22[2 q6ъ0#(1xf:?֒;l;y`frΓS8-fۅDB?ŒxHLl;jXƺv-M &#A&}y:mxLxoieUk/%Z@M@j~b*XCp$mlǞat QUڏZ!vhm(!a#5}rm8uns@UA k;6~7ktdvt1`:Vv#|'pfxKpe꼿jc_ިg<<x x!S4m<5v2_e5;_l qE9[M[kZ{`q .v?w(@87 8< r{A" x`_-O=GµyxlăX} Ļ=XcP6 囯+ I-TBrU.u؉Kt oJ̤%K85өQ  Y,XÔEzl$Qqx$4\b :\-iH$~ (6Iڌ5Mcjmba@φ72P!ib`#oq5.*1LIFrہMJ3Xh2TS"ɍ v+5-;8, Jf;. eW ؠa7"&鹯:uďMT̓8oiEbkGY߄^tNSnjƔi#˧1QflJD"2* gIjՈ橰CQW,EDM*a%( R6An1YS[ƃ(-S5,348Jiq-}1PFG,FZN**L[U'4H&c8V:ffLXʨl}LcY+G*a;S»A/7!D${6Syޏa pUEE٬q{M:B׹ǼD(9/n ,IbI3V7pz0Ys[,1 B*V"e~EGiOqHήS"nm}8+L4`T'2. כHQ7B^M3rjY& |]ƗLFV04u$I* ۸ΫMTy ad|jO :dK>mcL^N.8K- d9)alsU1>y j$\,owH%~mB ~7_޻8a-9lء1K" ܿFg;.giYyp߻tLHi!(HܽC3y"<JodpD2J !͠19bk])#}]ew4Ō=Ț\7t>)u__\hbߚ9\`u~^k w%6 ;+e&44|F44IaʳD1havho U,]ZN"| "{Du#vwS8q́jc) &[bKZuXQ% ]ڵK|RJ%e }={/D0~;:[1z?r`4σ| >a<7|oǘ`(P5R7RTvbXλ?Nybϳ? Y3Lwu<6G33ud7L4V2U8 qh,l㏇% N]Jt=lH5t#yss57Z8xtż&Sxq $:Ko"7=IwR2IWNmB_?DprFr ̛Tq:ϭe3 VӜI (x +>;^+ % +_y-xvUrދ Z xanu0,lRN iM`4¾C|RF8 puT4 ߬E[25)_UH `+Cpfz:jǏը L þ߁ V6{K (?q>۽S𓿅LE;sX'/uxM=qN`M3{,ki(ܶ9 GjԲihlmz%<\[k{d ^5mZkIm ; [NOSݰ&:j:Rmt2 8kǿ2|i‘T&^~mv' \op@_Q'N IDATx.^GGشǼ/sN;S  1k[&MKz1r{̄lmc.&g d>:/2dͬiـXE9vףʳX:*.6+&ZFf2BkIܡB+A(%/=j|De [X#~~!'#9d'scz^*S΢'XUHM8AHeB%3A]c elwN(2J#j-4Ɋy1 0+wwR)"kia-Wˬ*K.2 $3Q2[z >zˆB)Ķj(b**9j-eZji'>32GE c^w.^w JMx'G`YWH}zKc,:1Y5r,rv|AWs+!-y 89Ё˭zh alK[0?Xa.6c3fp*#V^x Cpʼng5.`2Jznz2#í\) qj;h6K3Y1E$-঒R$xq%|S1[)*b#Ln-XQNŠc04a@w`l4&K3xF̡+o{cU(;iKyw| 62Pmer)GUfWx u~iEwիU"^+֖9(% c_/egCiaD݇f2^=hΌSKGqu]0yy P K(l6VqwǗSL -T6[h(G OChXi7IR[IoyabeM۱N܉XaOv˭OJ,+6.1:?U?v D~k|hczØSe椧[0LxӋU,%[ztto/Xρ{1 J*fdd玽ҿ]R!d޻A(\%,cSI([UذNn}y7MTik+^#{vhΛ!pI(Eq8!`r!*!`.kFLv]2.31Sq"c D6;çelhD,wFkֈ_!28hf*A{U^oPܩ2`stZ UtC*a83/5 xajHHj,лu|guX%P5/BnMs⒇ɈXq- fN_RY/ DOXlFx7p\~+N&DqVFtJp!_O^~X ~*%>Q\ϣF%E65 TKL]JGc INtOIkBTu)#輖AEci Ц(J4 6F~\+{F[4 gvKSLZ.WlUP^+&IS𝸴fGR,n>:LP%(kmoNFe/Udϐkɒ0c}|zRʄ+O\(b0 ΟՔ2^1T1DYA#vDvB$`98WsA O =:`gT `C6 &7hk&x:e0ᵟBسOעFavO |-vdMA: ~]M^ܬUoQ{ 8GR0:Q׬7/A 0:>/lj Nnx"j-5z(D޽wרߗjzZ3Ԍ@w6>>P[oQ,Ӌ01-5=|쩁iXoвntyOB, 'XhOZ\n^#jߣ1OԌ2eXLզlઽ֦{8S3@6?V< ,N`(u02 7oIwR->lʝyv5sEc+:#T0"L?sf mܑ *Uk?]7Ώ0~76g4afQ7*'6l۶PllqH:1IJ5mFoWYαBLvwIPZ'0j-| /?ϱ(G^$$3/~V6ߩ::R¦L,߆1tRE/HM_5| ٴSg.M r%KެWPp{vH$lUUV's(y_q ƛQbyZZ_fCI;?٘ڐdOr*jwQP4JUBV+q6h)An4 yO.W (sKp`kE6L¸?Y(9ȶ؉(UstHa&y9fF.Qy0$Z$xy ďMHݱ'sR}*I7nhS<6KoH#/IM:Uu C80|sQVC UUGde䪁\ŹRFf)H'ɕ%$V~˹^?؏h߁#ŦYe;Y~tC&i,XduU(ia~+kDꋤAZ_KpX𚬑8Ueyx=vΧǸ[f'Oaesc+9;FK'5.Qn/1R\=B _\ :/~fq.ç$4zzĊSHh{pμ:!vp~SjFU]GhA)c2 UɄhA$,T S4*)_ rWJGU+s*Ū̟BՒ*,?0U U|kHI%XyBz@ṛ`˙9k,YI 26SI S0WDRVBY*aPLf锕X(ip9TrLOKXK)wc}r-XVx<]O2ώ;Ѝnv e\&]\vl"|ǁxa5hC, yls*O=S\Bbbp&c5S$Ri3LQ(y[44 WKZ!Q6 8-aO-a_¬F ~lBͅ\6;6rm`x?m?eK}YTW xWHEK T1)2]EwP._|Ia5Xe>Jrj`L&oAR Ylxں5|&=5vZ"xGTaFJثER/4",4L'yi؊P'~8%_X;_- ϱڰlD48CUOj%JU7 r Ar`7.WDE3 +U\&uE5M]fU8IB1tdh^ {'!3]8zzL`r㚝ȯm kcT렮Pe%5b(,W-n2eŜ'5b,\C:jBWAuK,- ;2$wH(e0.kdS e?zFij؝s~TZl$P<Ʃ x9x` n5;ˆ}Zv_a;JnɈ͖`8:sj=n#QzI(W)V|4v[o¶d`k7 }}P01lmCPW^G>Z 6Tf:08o |߹Xo8ஃ{fi(Lj.·O |5s[AO#|ITmһk4hYg ]^zn ޱ .(2 -B8Tʽ 0Mc0Ý(>~BA?>{k)xfa׺Z&^oC" _ |!p<Z|T.غWoto'ˁݸ _J4Mnp߁}5H:.3hBןڄ]n ըٺ^{왳M@a1|R~e`ٸQ7,$nkjhqy/.c'QE{6p 8փYϾ5wqIcy zbDMV;E:'WVqq[*c1YU6sJfflS39#$.0`#ލfd9''W}R:N;$]*HTi*Kn j,&*wkV#oM`i\F,Y))e -,G'hMTfMOL*37/Zf67Xsx'vkWށ#U\[z\S k<WHi[(ʤ#2z6ꔘHi4 ҃N |*77HA"Jlùyf7yLz7Ǒ^Wc:gGNL7|4_S8brJ/Lkyg"Io E{nlP[;3Lof5aB6V}D9Hcj!l#A>݈yL!Rr)鬤 eҾL(a4ߢ/u ,%j W=L\yN6FhY#Y")J7el# mdxӺG0z5X@$ӑke܆bαg#d_@0yZ% "&ʌ5HqUչ߃l,;x3emG~=sF-qoGcw,Ӽp# Wls{妗Fgo=,$I4[뽋+QsdZv،9D1h{i8' ql'W]ͲkYn}[&KCHԌ%B3㹊ӄJ|;} }y~rM,Խ쌎` c׍Ҽ&ZLTQ":Xê`T)Fb7p4X*$v{ˌ1sĪBWG 5c'eêh Ly^X]$L27/w-%..1cX,13p-zv9K~gwU*4MhG7m@.QIm<]|?be%Fccz~'9P*ޞOZ{ Glb*B]ZBHXC,c5R`1ݯSU:$ޑQ0yj-\8.| IDATV/dJ6`g~/J.J[A#|IAldUQH g]]IJQ \Rxm%:FATr̫uZT\I|ߝCt5UAJMi\v-#[+肑kR`ğ=jbjDS疇5n=dc)$a2*#*TFUV/JdUZ B\n3`$-)6nH.s0< v1e]Gac|ػ" $kZEE3$7an S 7sczjTWOFkRQ22j0UXw֌~dI>k{jT$ly{WM/j7* ::L}7\$omlQF LF 1n;4?#Pcg`j5]q{`Mz`1]ԉ"LԴ˭anl.e==LS&dqK`|a/w. ݖ#SY NrQ& ӀƸՓl:b!X)1MlA2ܸsY.ô5}PWУIb/;H\}Wi7{irB݅]@bx @ H1̪uTE+$Uk7{Ι'RFiI}p')MG1Vpse gG단&>b~MlϐSVLv[SZ/k EL+@ u@wZ8|Ya%2M$VGGPw l{9;%.=T1]w(Ws[id)T،yAHC +L6Ԭ ~')Z4I[rQCNqY 0J ڂ#8Fi~oQEPx59p`JHZ+QoB8犸АZ4? + 9kS .2ýaдBldm*W?%p&Աvqಟ<^F4w|=li*nPZe!aW .MɬR.~qw9_܋8.^Y˥r53zF`n(+l 0|kLI3;PeQ[@6va\xwkN5-{d/`,I@ (5 ouO`31E݄Ð.zP־ǡ$ֿMd\TH>W`7ionN`K= NYzdiE3߯1/Ƿb +T64tFFjַ9Y`w:vWN>A9M yQ+:%G鉟$\:Dq2qz/I&/Le@x7AWh6'AlM/Ŷ)SzXvPt0ɮ"vdU&4L kEސ9VSو&p<:Ά1_ P2Kn QlPwR)'妥mn$եHt۟@D^,L& EgH$8z[n//*.l PhimF]6Q,FdIEA;=i/rw.6+i0$1 ̶DìaYܫ9(*JȒpLfOU6Z_Ir"΍LAsfq^esפ'QQ&굨JRb!Xu]g|cTU$GBtdax&XAy >mq@Du wq?a2j `uDn J#hS#D'cm~7~YA LJM#i?)uRYb{HdE}OաnQkuLUo&n]p5@M98jb UҖ3sleO}v+B[F -/Z[a#'iTWh4-ًjov*֘_hM&7祗~~*KKA?etCUo|cSSE|MyꛯRɬix-eɭR2T3KnRs,+w };z p`7s|>8|_茯.uj7[{:tww{׮COtu_IX@<& sx0맠/Oщw%;\pvjX5 V-;`C8X|$K7g:`':lK 5_My чǰ}@{##UT߁{PMvlEb_ <3}LuB] v65Э WL^@ )M^E#Psuɬ;xf3"{Իt[cͨ *]UV Q"9aȇllk&J?bb?z EyS=-2IW Z2V)'aQtZSeRʡ$X&{,#/ ] >dB]URd xg/O)b]eu7<;JX j %[`YȢ<0/*9)3zZbn vMMY3BM{R pH{7MxgZ}2>p}S\ ^G.a4#A{|?s L1Spt=N!/h&av#(RҮcO|QD86Ժ8#01j!%n z5$z)L,EL&50 p<6""{dKqV2MvH\qF&mÅ- /]F-2*Yc{\r[/ LX5[iɔdǛWnq=-o{ݵvv[vc]A Mu@[8\9px\-yzF2ESƱ{NA;yuPP"N1pDH(Z8=pXV<$ E3coa7RW,ۏZ%|[|+7hukb.s'w+9+Crj?^ mFR JjɉEM_fɏcĹLB[A&IJ9\1@R x|.q66h" 6eưOOXm2Es"ޤAO /c'!hdTG* 磜\T&)5K0QaT>U+ZQOun3( Lww~w}zy)^AE~\ !*)/ p7\fd/}?3f"\!kT)|z3 ˢ1>FjK;ZV58hPS߁ w:&^_}\kvF{'߄_Nː{NG[}.='a.׉:ށlG+mxac:6|0H'y y=- _4at΃y8q\۷Ndcwo ^꜏}>:ffObn8wcU7@; Utg{sc0_w8\da6 {砽vw×.u񏼯>wzǿ?] 0d6-P0J./ˁz亠rpUvj\|Qv&~y›~Tf]\ܣs<}zKϥq.}A"n] I8G~9"#q,]!Gޑ =KٽLveb+ m!_Kq؞fEjp*:56-KkytDChqt[7)2PU< us'ȗ$hQb]$*,^RvtЃ6@ve^Nq_c6@ъA#ӫ",QV ю1fCVOXs%?ᒌ8PAxH dj&k5EiǰwՑo'`Dh%m z·R 6昻mqwA3,ZuEfKFhiegg;4^qٹI`J{huznBM)<}6rEIUO{ěA(М#Wh3o"w#LO#TnFͯӵ"whoG=ɛ׶Ȅ l 7F>V/}_Kz_f?%*~y q3LCL4g|vZWי6҃]h eiT6!-)uxNK e0]!%n٠knHn[lGi-wMiʴj7Q]"%+qY~MGe|n SjYmPNcEy-ZGw':/:jZGn#"(`Y ,S6^ 1gp2lxuw@pk318WoXmhu; $}g@3l3{tMMt!TLtAt KBlqI*"R6$Լr`七 D]n4!4Ap9htZ(3Uk`[*%v Dvl q0iK{fפlʄBA/4j ؄%řL|L2,"v)gQȢIacGȶ">zOԉ6mC&a 4(hmꒇ+Nj`6M>r۽DہV~Yߦnxm`Q/8JRڵΗcn;7vc֖24N|kWR6#c;"wH)} Ű]DbGRQ=(N"|={ǩ_\#fh3d7 NrO )oa[&GU!)mDI%b"rXU,xk]4&|1>Aq5'I|KcJ6=P@}< f.hIfHdsϿߝT`u>aGqn {ߌS`3t8L]eg[e<4ss+h*RfU wq371 &h[;D6jJb &v,N_>kKY{B[ЛT fga#"L?'~yh4 !L^1J:zkC$0_R0q.;Z3Q(6k,W;.ٵD"PvOvb۰<l;  ;zm ɎY^vs0L@ !d+6L~?`@ۀ;kp ,QxnadwV` í-࣏u2U_{S3";q?l;# ᛢvЫ@O(Ï,qk ,Ñ,]BD|DY]Rַ0J09|8w7q<͊4ヸ#nhosgؚJ>Ou&;w 6"2}pP -W ŒPЙAnw2CagkNEUi1%H^V95-CIPVmW+z|ɷ,WWd6D^:Ṇ we޻/- x9n.SC]4:ՂIJƽxRL7x$N u@bγFAV ݬLχ.Ms($VNx4F; 0?&q'ު' eʻbtSG~[z ڧG)8_68WN[p!͠>$w?Ν$*TpJDmP\dX] Фh*#CZ -cILs[f>UaE6&ڦhEQuACBm/mYD,joqMs2}w C*%eUmh?VKgye};FϾkoOgUe@mꂂH[j4oq́A[FU5|lk-A ^GPY\i A`,`v@HV)E$=(MCUq"KmL3>H9Qh%T9x+_8xtJ!nа " U]&dQ$#0@RqT/v B_xBd``*Ad 40M/N@&[H.B(>Mh$MM~,L~ϡ_\@QA3xEE|d!`ŪFwFm "?)G9^V-*ԅF1Xd2ф4M=qJ Lø\q Ɏ#]:.|4Sr.vLχض E34?]'`$MFIմYU~6{ULfaGr! ^XQCF@hO z{+| R]0dGCID?JgRK~΍[Xu;9z1uէ.diUC47M[M,NcݨήNf[TR[<&WNyvs!qZ;4Gb<8g/kќ;_O 39~"=vnSIcޓ*᰼j 9, 55>|01_$2x:7WEq/{jD"]9˭ G`zC 䑗  *?zfH%`9nBt l%tgYhݛ`qk!Fg` RވF"R9n&|8&ZC$&}K'3C h qFFxdXtMxbQDsWY\l+I1vT*VinFٓs9y;8ok{g|CFĦ*$׮"+4B^+vȀr~o|T&9q& j=SH@f,f^urY!l?{e %;QFܘu_^G-D-7I,Q22> =kD"a^}n|3᯦/;4$LLbKt*էl2%^6IQ*x]*gtZ+.J'&S߶)%J8I#A*&lKT s\JݶQ7M7vO9}D ,evgY=k˼q$юҔ2>@ᣨ̬i&6jsGnwܿN߰VŐ~ڡe)P"V9\•,`3C'hJ"QMj p5[-8- T&ftAj=Dr$&~K_F30qL FGP 9uZ JAtC9h+\"^F,ި8U@P?J8bOR`[o9E,! XݺNЇ+Pb=ru [1 K7o썲3_χC.v|uZim5ۍ@zB] A C/boϽ6H}{y߃ٓc}{i>a+R .'@]KTYZ7_H8*r|AKdˠVyLŏf],8B+iPmA?o MvC/;|w'2Ҁz2fCpM84Ρ4` d:#nW~y0‰0Ӊ(Lur4 'Na=U 1XI@OOp>v).V`o/r[FG8ݰS]IKwFx7dWat]?*FG8퉁A*q6^ގnz# a_7Z ɰSh=a +kshdVMy,ã'_`_/6yAkaOcuaBnXGsppI87|3 ܭ`5k?P[+ ֏ِXkGUyp_!A+/qzӣ Ń̩X=V &ZD|4NrQmp6TОqRuxp}vN2ZTihWXVil6רģIN՝:ө ygR[fpkk=^\4Jt~5_ pf@й0-v.vïdg8 ~=AjI(gdaէrvw)yY"D5}1̖@K&T3{ɗƹsu]27|Bي#^2׆(Me8_Wa˜c4IߕUޤ7lø4>@6d>^qdBx%<[:]WqprCIrNA gwϿiJs _?A"Q+ɵ6!+Wbՠla#>Se&J7wuF8c:q=7"7}Xy}LҟZ8Ɍ;t:Zb= |6ScJ d|)"+AR88H`|{7h.Z /{ҊEh5$1*ujὌ Ҟ/Sp+C9rL.;6B&UE{KwuOM|bcXYhjטn.'_"UwscYvUbwmq/*$u cr!/$14vD3EK*mR|ȦrC]ԥo.5( 4Dfr v5>gw璗ڈiCؓ81- >>zH, =A'pn^gvo͒ʔF2vExUc+jOp`?b0Ɇ~v`R(#/)m7'#\ۈJk%3EjBIV<\޼?'4p$(D|)obA}BrvFtn1&25".o{XH37.(`qi  Fl\U@2Q{ߊ|D%h@!>]PpKe|Q%ЭIޗkY玒FlRF_!: 2r7 7 1ܡJTRB9zOJ O1lN-.\e7j%|. z-ZNٰ)-=!\{y39Q#SweXlDN7wtU a_,Kges$.:w,}ZQa.T}QKsc6Fٸs PQFQ=%V wlv1 B%|ҎM˱m*0 KL=P{5J.?~9o;Xüuӽss{7b#v,2A $D["-RdOr(YVɲ% $Eb ,Fl޻{7ܜ:?2$詞g99ktv0q8wdKWl8ώϲDAqEu2˱3!n5BfሐsځP>KGǙttd#O'F$ЎkiUvlbrnqJ7Ş}E, g(iv!NMMmkO' VN~dXm]a)'? ?x3o^5Znق5k%^Ijb,5 gA 밻.΂ggWںOZS75|di9fǼ4k@.ԭ05>Ȕ`lR+*a1o܀/  d6gO ,7*7kKOF!ԝLX(86D >w&bsAUb%Cw&>f9ϐ}le{[Pig{ۭ:w$l8N( ^@(Esc&X $\F5.3тb_y~Fm'AޮtupȍK10;(2j5ف}7egXM&%1j>2JnHFnRO^vvugznO婥Dn%AZޙ,Np0ir6"o#v% 4;TiיNsk`32u9s}7khlzM?YM!N)p7V(Sɮ88kF՛5'aΘ(.Zq$!sR舩LR >2 ;)f\}]*J=:D5r%tCf4 a:y:E:0Uj%B)'2 ߫"MJJ;TX9XF6!kq52I%rk$YO93e2cKM> =D)3Nkq5z_c)2 kE5RBv*L Jj"m>*rD#zS#T(R;FZfӆd+ˣydwO&lUO>q3[M\0lW4 RJ}oα}E/0c!p9[HC:r V2}buAQXT ZYo)DJ~2 topDNnCtf; wFv͍L";IUhu3I 1+@HpS%Y參ӆ^!$RIW ՙTz:cՆJDJ 3WA5AuDӏ4vОV*| q&F(1n[& x;dEj17<*D5wAM2O'Hz%kYl4~Xl@Lqsi*ix0sA !Q&G>~%K]McҾ2Nf{׿^'uOdN$M5ꂗ{?d$2s_qf/)Vܼ:E\nvum5Ć!~nnOx+\Q5ӠƎ^HEPay^'>/1ɓ_5 їN("*5-ES*QSYz}^dCv;;,]'שW|8 F]B4\}4q?5J",T:bldtB$Qջm;Ÿ>SQgmV*b1 %D7;8ŴRbByt *z[{yp6( v-[]8N8M?55EAh t1.  IDATErDᤫ,_%~W>/R7{8vs#w&h%uZj όsE%9 8HENyLO.)LgBēU5axc(#+Zg(Cc(2d*lMH Y{>8vl W5 ˰!&l ȶw~zS $$Km]0z5ص6,vsbvm=uz;&[|@b<{-F?LB#0< NӰo3,¢%߲|ç~Պz{h|b XLG,.bwof/ |a} AYJ~c{`断WoB& 0; ??tLzPlZsq ..VQ[q7IV (Jbg\aeJEmCrl6QS""[݄{.)oʂoBqUze**GژiwUMYfε6kSX 6) :ލ7`Oog[9Tnt/uмXOBNbۍ ]Cf7倲Bp3tU=tTI$ܾ>fM)&e}huL3'aTqm4r6Z7IՎd8 a ww`M?כrNFR+;) nR5&J5r?zC^ZѪLĹjŠ[#o/QRV[W16VPP L@tj-½kZW CYJrPaS#'΢#tx[)Vۼgxd'~J!$+Y\U'9Cgs kXf8%J)UN;nr #}KOkn)x 01A&KzJhGɸkxHMmpق#_Avx0M6P{O-'Z@Ji3}XdG=NV#)א+3O"8&m GΊ>%v$[y&s7߯"nPR #35@pg5УELC^V*BHYQ1EB3dyGAΙ!]=+4OWjhe|z# OTW1K}qVj>K}|3~%VE*i#}ƗIӋ)!EtZs0IC =[yv>(ngvmfH#.Y@G@qMhV<1=]r4}+RQb-NUrf+Ax'p*WwSlHJ OQawH7j6Rd SE$ GM-zqTN|fv%K+ zHJ9IYQ/۔5[@ AbjN005܁5SD5#GtiQW mm_1JMl5e[a"ţs00u'Z)@)GC5f不+A0*>[.gK{z#@zDVJϗX;1y&5<cEHd8.*Hf;!%ٸ!":ShDP4c5 MYaSȶ`R ARhLz#8GtJ!4'_{>Hc}ܪŚv=ZXD]]ܣ?!샳7!W_Fn;&a5~ {= =](G0vnf1-40,~|ʒo gA{ wGsf. !% / ܾ ,̭O}mp6[xb{MV]l27^=Uxleu|.xu3=akbsњOOzޒW Ye8/[R+7%lmo7[ǭ$nQ?'jBJD?4F)EK,Jωֹl,svw~XJ'[m;Vn2zabZI/sr$PǻVy *SΉdzUkFcOq)2_=s::rjLG\a? NwFKb] 7(}iC8MP >N-.'7c)[}lTnh_5G >*KE{:q]^a$FɖV[oK wAk{貇0Ek,HM.E!kڌXh-nۓc1~Xa%7Kw>Oo:[no.J\O/"w1{Y6Wy={03yv HT}:NH_( 5i"pg9qWhDCfLO;T )&{TsH#9^Q8WgqIFepߘ {p݇fnC*g˚ZA Wh+kF7TEwԡhe"{83AOpQ8dgBN.:w jcl[aposz?gV&mH!d'Ƹ$*wQuCE8{%E|I <=N7qiҩEN^2B+u^/[d|Gr*}|Ho<؏o[3}#z֛En~ZKCq2G=zW)Sߤ]2-8*+rm Oκ&V3mR;]WD) WԹ|'\]QHXx$_w'Z{+ * te2nnOMtqT6_ɇ;x޹&;+Bd5s5h)5luRNhwnpNW*-e(ld93WulRTN̓׍}N'\}v<}&N"]eC3ؒ'g7\tt{{FMc:4%@1@M* fA7 ך5-63g=\RcP=%Hc"L|82yKYoT1ŦQ75z]a΂No].CV"&G3wUqS3jݐP] 6ԉ*+(ȊReˬbKhġ1]~jGTvf ]Cᰫ4T Acl8u5PgArXZM, #jI\N߀6k߅[{-olKզײ//o䎾7p| .ga~^"|^+x)o;a%w 06 e˼5l bOX pxp,t{ VI,@拰yb'#f!; ->kz3OZl9ox}Y+j(e5ܝ?Q O@MXК_i8ߺ0b*[a62 k[io9;\߼2 Z yX:%Ǿ?n8O007drӌOCjri'q=h hϳ*psr>n 8.HV eH ~aDg)Q#nPmrkq' {3PK(d-<FN=:znShJ'أ< ha+/߇H9 p/o!AG@ގ>b_qA%?+ )t*$Y'tHANsӹv&s6JF@§o#]3S8!R~YK(h؃_F_!-N=˸wQ`8˺CNY8<_FX0J9JVv"ubmS5-%>_iϯ#vK+1βuz,c@uV /ϱ }: _6{Tf{48C%2JJno4peUN$-U7?ϖ~?J?q ޸Fvbv>0 %MӬs\G2T2lG,瘞)j)S/')2 MB6HW7^୳D0l ?N9~|Av|u*&q QU݆M150*>jT%{~{o^@&h]-Zlj '_SvxP[`f‰Sݖ)-y򃟂^!Uad+= P,YM!xtAX\+0e) ½Vdԉv,QZ⧼N+x%N'DCЬC[Ϝ}^9 {\kP,fD5!aXlrSҊ5h ZO~/瀢n,[Yk"?~yfmL%YP<rMj1k?q?{ak&<ߚu^ñ{!Ks5bUf+m?:?O~c[vSti6y"֢efkt:(Nt-ւZ]"i2?Y`]'OB˷JƟ7khmv2g|NT܂)qLj]g G:]@v :el4 lEseG,9|T̶RNk>i^GUtV|>V"\SWiYs)mbYݦ(W{d+ p抴{)%K]`).^ƫd](iA.jf^cVl!:2j׹s|mtl vب.#ҺRM! On:05dz<e2E=Ȭ3;b[9CjA W%2q#g6H4+n wr! Tj dl` IH[ 7e%I<^I\tkӬ6ɑ{^&/݊ȭ<_ DR p[ o1vi3o=*ÑG>oRdo@v"9" XjveDE:ʻԵ 5_KwF<: KrK J:Yrql&+991N lvǽOR?oo÷˞Bjei K$]d)ܱ[>zxMܶ J:[d8&"4louĆ7 Glpx_SW'iE Ÿ]ٽ-V#]oFjx/#},D<4*>eLSAP%5<G6Ǒ$ 'W %N5u-KCo5#*H87V{;{$- nXNVN2=QfT\'3u$0\Pe-lGZ: t IDAT¦:MӅf4 *]4J&R+vq^=E{paBXþzM>XTǧ( Z M̀Swci]F)ڊ JFGspNt3J!7}"͙ɨ ZTMrj{&`ՐWܨ1* 6X!𣖳] J3KU-6Yܥ0RrMWqjEBppĜG.OsN0IJͥpYְFSCLIuٙ3*547pHhz)at(6"5I\>TiL)S.EuveOҤʩ$KA 3p4MٔNsFŔMp[13WKYp*22͒LK@YuHxhxxjQJ|dP"l8 e=y|"ъLUcؼMڛő,opQ #4Vnʇ6: Ayߢ 4x/Ls.}d\1**( ~'D_Ѵi~ _e߿N /-ϝNj +TLSG氙n#(Mlp9Ld VVO7OrfbidCw>J2,R,EԸͮ(q7II֛mت (ev% p"|V6qSN !x2_߀B:,Wo-p%\wWy-ZKjwg]}{N·'Ơ-/XRi9ʀW[6kp&˖!HOo/:d}x%u_@'sOXU ʖg!BbEKp>l׿ kq%ik5Kޝ¡%OO_> TbnU؞;b[EbDV*jHLM\2rCul5(Gݼ(m 0Sts -U4n[j&] ^#PQlSp? Ԗ EHMQ*F%F89V ,+LMؘ[.^!z%A}b+e拙4[;@śئ"y 1%%Jh,to1o_YH!XbQlҔ`8xuzE V+TpqS-X;3}tIְ/~qo9ƃn68s!^e[BeJowEbWBs  c>KH#a8Q43M8lYE{ɛFD{q 5I]2_9E]$=Y^v@g ~}_!eP/L6QN4ѫ>ziv͓A/Thm"3V|@w\P65n݄>Y!pLn baMkخ}x/st6DGDu1BݮPɸf2q-vyJ6h;z=Hx4WD87n6dĂh&drEW/5|2͆dc-*O޼{Mvj#HvE,ˆFRwKMy_>sd#{z"6b#"xq݈2o~Ӽ;{W%|mM!ؕ.46A1<BJ̓nhIf0rau݃lL2>$E&xE]g-?JP[Aqt̤tQéfX9~SLᘝð8oa7h6 vpg?,昩a@~7oߠ!w}8OapnnhȄϑ -4#D_.Bv_ɤjАǰ C l4\8wK^Dl*GĨU7^+%F'N[)CZlU[|uRT6l(6$E%U.bz^4 cb#Q (>ϱGsC&.à,#-\nE!$ȉ~L⅗qK5J(z )m/{>8AE.Qh%Ī Uj"lTm%v.Pq(2ǽY)0zAY ]3j^9yzW,6,cS,0aw>,u`9WfhWW{w,'l]n,·k7-7 >,Xsn/߀~{S[,@s= Ekn1epGypdPu+JQaW'3५Vֆ Up ù09 唽yk1=`e@o' wAeXrs">6 9 =[n!?_;a:لK*j8c!_h fZ^<^>ebc`/ic_J4l:4 I\QZ8(!]Qd.[#0Sw 06Ѷ%.Eںz ! 5QέξpT=N Ԃt?툗onoMjMqɀ ]]'kQˊx+6NDJ:&xDeAcݛH7 qA4KQ 71 .Zu;]=R6 fkt\p{AS_3XǨVN|#Q&P=rAx'#Bg=U؂6DQûgteMÌ6s}}.OR/2^C|KqFF>"N7Lk6!rVY,FW,ip~v_تwM&s<ÝEviݒaLrtq1ʒϲPi8| &fja^ qwx;t5|2blsM7g؏E}®C҉v΃m:B O R.2:W9L {sajJ=q~1}ҷiZgA!P2nJikncț}s}|A2waGo{wA@Cj{%%4U\76HTMDEuѳA݉֕@e!n*[܁k*"I:ZH TEz9yD8_EULwQ],pj*mtT\P8ƶDXzgA%k6ȈNZƓҶ0\FE|U鬢 i"&n9ȄeOY[kU<I4(voy [JgXV ]<[XnrIi0Jy\cܩ*=:tә ~2W=W(A;hbjش(P.{B)ҍ0Q:Jaf|L=$HPu(8C6ufExImr=K~Hr417!^"n/q$fS YאlQ*5@[%?9.brQOW*lDj5mT lXj}+xbϼ K g+k/@osWw#o}v|C1g>9$xl-5܋p$YLtg}ZVل+Vq <$E,yv7X?kH-B4acpr5}6ig_'\Vt$[pt7 w+ٮ2,/[P5Kw-큘%~s:5=2g?f9k֢uxl/ܰfk3.&HD’aWqB>)PV@xdW?7\1vK""<0Z3M jHoPvk[35VNǩA2z'O<+*k>0^ g7ye]JR`ۖ>򳜙>A 3 &fl i 3N`KDKX(9ɇJ4iRأ1ZZ`Oi WCMSeɝ:,WT*3")w$C09KI {L,ymNWZIw$YՈ ٮg0MOXa&BF*2k\!G]OL`" 2Jd $ju&/p']|Gq0q/k gNטa:{;He^{Oϧs墛f؃dx }3P9ɭ(^,\(eǎ/Iw$BIRi x*\g~j]#^gǣy:jì=@I=Tfka C  mxN{?%đ~uOOR+9x_#5{e.cEE'M66 /g2B:Mr:|D s }7tѳ!Rėe}2}]aQч ;4`}{铼{ 'fgHPVT:3y e^&t%͗^cbL~I>yOy_#/ }DEk]h¡P^z?swued$ŬVPzv.e"=4"EP%.TpCXϒJK}kGORįߺAϛ⩜%k\`}q|38i`+-ix*yVy$!e7,BGPD[*nGs"$9$ы;*F:F;Cid?(:f_Eh/Wqh{'JX l ꧾA+U&w6EcnFM[tSs]2}!\%Dk"45#bcoQ=5k~<- f՞$LPmZ{e_IpzdWe≀]#\*rvGLAdiJLDd6d-T%\!a6"PS0Ul6g 9ze5IF[(yjGlzt6?k2n?jtS@ڌlڤU9t%@iCXA5@]`Fr\g}yxe3z7%t{pq+nIvH&y!oz ;ΞNjw&66MTs m7!gdmoB\6A15p;7qN?GJFYOS<g(]%Ju2u*eǩ6zDliLggWRB =A[6v%*,v[Jn<duC;(9YY^agO}C|?ž~+QGt TX-ꓼ׹rƄɞ{ ~^rC0}c6vB[ZŐzз$EM>Wfa5˄$KīqdD=-M^t̥o0[<|\}|NLRa5jb]x<3zEb0RUzMdiwbU+UU Ce%8˰ŒVpx\ Y3-3/1ՏA ~^ g5c^'𥿄}ܒb p[6B Yan!O`BS X`}f ~XC{z09l8L&,fc0a2Y m1c1{'WL$;ޱ܇Yoݲ'a+[pYqbVSU@Y eU"|K S"Lv;Kٻ:ܶJm:7_o`[~-F2X'h# ^,o~NuM\ &EVEm9_a Tsnf N}mv`Rjs v/{ky!ىe6P)нsx%,2," (q*AR#ӓ IDATc$iQܡD0̭Tg &bD;j.]*qtlO̳vEuawY{$;HuR-ZOsK_u}ҺJ,2ֽ,vQw,]XCS3:Yqd Ft~h"Opy~JSgl)LpqkؖXuxOeE!%n7Tpt[mb+ރJpdYww1Ve%vgfSsXs^%*ֺk~]yP=L=!o$ VN<;E޲$wm#B&2"pi 75m:qufpeZ29<@2~6 TZ˰Ohs^  Aj}5E/S_RqV rpnRD_qMP[#oPdr]v>|^~ WHwdD'[S,:~wʴ4*CzK!m>q*n/Ym!~1ctqK$X𩓌4zY>2FCn,E4Scmk=CtlETݏOYL4WY㕲;ON+Fփk8c{ShI(9?kif7zY)*FE,b=x֩zHӹdso'`m;z`k^&zmt%N1G'/#5ىSXŇ+Ҭ`ē >6 ?F[Kqo{zI4ubz?Y^WWK14:"ŁCDYeSw ,(wy4d:oA-n.t8 ] pt)AXk"W {6)4opm>x?LĩbJpNak!Z\ayZ+U44t]OU3,6]lTk}˨M1殼POOvLqzyNWI>zd+M2篺( 3L6/^J(-7^.=#ڿ&7:5# ոG62dzÛ%v˂\1*)'Ҥ/W醌h j}W=eE)*^!6lLZ7_eddX %y;rH=E$ +"ܛ*z_'!٪bumh8?Q}M^LZSS}N [*3MNzzPm(3_RQLv<&k3k>m Fh1Eb^n鷖hmd\KoU#^5/y]#pLoq{hĮII49 O͉P դ* 3ˢMk[OV6?Z ,sCf9N:Ȣw'MCK߄kkVfT8yJuU ޳|,|axCb1:S@? C>@a 9 @e̥-~2ּsi=//Xl$H6+:+[x>tAzgg,/Es S3pVns Bo6sIZ0`%wODP.YhX ~|2' e? ܄|v;o(l-~ex=><,MHWr y뢋fn7/i^%QuQQ.m';0n7KOPU=KfKlcj/d*G3GsP[ bc HȠ"3#1R^!TmMc/(D^=̰Ԥ?CC7хrmѷ$DS&鰎1^_ Ɵ\;NƠHEYZV7f=ُ`` +]YJu<?K-bG-#}( Eb 85$vrXиw N*쑻xQSB}v5 =ˌ%uj-,CE;GzYZbd"/6M`n?[CnhBLEx㔂FU[ajAAOl\| ._.c- ^ .3(8 $L3xc2kS誋.wǫT m̮*vwsō[m2=_H^zwDL[vںJP38:C"0{'q%mX CTq &pdžJ9 W;(n9ꂳ{zUqcDr]pi:f!j_AKՉdS*Z7bYE)Npؕc^5h;sT^R9wBvi {M`F׍cDQ9DNQyv AW Rđ&n[\{'.0O]-:[_#=-ZY|مw`)C6 |驫'}"G<Ŧm^J9/r<$đyΩYD} agI0n}:J̀݉B"5̺XEjؔH4^xQsZ/aU"tmC(Qm=u BSpN7&6=@h؈:(O?V}:OR>pji}T" ק1ձ:ˎGs`s)gk_Ƽcc#'Ek3T[5v9e;N`0iyFsPW9#m x.;K=>ϑc"-5gn&/~%뛌:ÌkYڲ!u67ZSYoam '5ɰGcT!SDhu^ 'd7 -:;ah*6Vo=G)SYp<)mUN -TL&ΦFQ#/WR~ D{~7tм~ I[8n×iKz,AK.=)i`t2X1HO~=-V/_w ;▴J``l\Z̰n@ a,,6ڲ2;bp8kp5\{ ~~c<"\%xa\;F\0uԪp EۡXW)N>違X25w^? ߀`7e:YoÑ OQ-&`?wnmX# 1AՋpb<k'Gfl QWgb.Hb~6.CmL UUfw.ӵ𸙎aEX ę7U:EĊzh8[~zi5U֤,[z$qҢ)דo Q$qInң-iƘ׶8n&=|`E#HTlQ*>DlwTjM6l2pEݤCS'@c %Itƣ)h "[yNȻ(%GKA!^ذcӗ{vq3'c3pBe'r1eVLd15n"};T$a/y|uqoxb[B}#=aO:{VQor<3OYOK=ԋ2JOz<6^^:޼'>_$q4Tugqa21Mk,z?{z\74S'/z;|0!ڞbǟw JNo#KQZXaUQ9j4[C5؇ *}W z]9 lg:։pS8bly'q%.anpG _yoM1 4D]vp3=XFī$95(Q[t]de"}s`)ӱԀ;W tuo)a7*C9\0)v`rf;Q2 {>ѣ^;-v} Gio,I|(<"${|<<2t 0,8s hUμh`sUz!}{e wjGzx&]/460#a&?Ճu2GD]9hWʴ~GOq&}sZ=>D*w}'nQxFc7v|Ot7v3ԧؾ}S\r 'w~0q'\B}nUzJ6J,TN+ߖ?F)S/@ϠAshHtq$8fe6-GK%Qӂ$"UYr1_#16n,1wGdAT,rtMfG;qTßE}mK +AK4$F8GKd"oW\ = tu0G&u:]ޑ ׍ i58%'ՒU%V.̓#}QҨIe `Q5mNȖyCH]v Î&؍6M-'q|P:z۴_AUJ_ v<ƛOkQ_(2֙$>tfCu4*54Wnlpo:C "9:$ܾݧ)s8*jG94GɒbMJ:t@‰SnyGzfo11Q~nCh;La=6dphԃ`똂6MUcuqPq\&OD$h-쨴 f[l+8 Ch#`7N?BC5pNm8-W/A ?iXN[.׆AH-|p*kZ 7g!sN*C5;-`M+cG`x3Xܚp,[jٚ-a:~zaz߄'~g^ۀ>Yچ[a1*ζ%L@eܜ·[d΅47h@-A͒jgf H2[&e  R0a-tm[g-CCkVtXq'iOMkF?|ן~ b>;u `.k57-SGv Cw>OTҘ(]#g=Û _=K!ƗR9޼e07Zql>r'03T:odL$n~n\+3$% 7VoLM|I'M?U 1jJ%ܑ 8㪀xq@BBBo89Nϫ1&xƙsy!7g:JĶ]&.Z?ιLߣ17&,_{pnp+1 ?EeF$(P9ӻ1 \&9>߃hE<[ɹNґXSֈ졘'k#ET[goJ.Fd3_AcD]Wa7HVwaj[@=Glě<~7WU]tOL0 0Zݕx+ZJHHB4 0{:ꮜn {tdw|{|>ϝ&xZ3! |/ou?-Uv~.0QN gxZ%`4z9;52 ~rh iFom9Dlҕ>) 6o0=}ɦ}/g}5#,.>b䬏 ܇ō#smPrB)#m/83م"*`o.!QW(R?`V 5=a hI>t`@15DkDq"$ۏpo}x(fAxs'[bodd#׏0^|3Cak6z)*¸nNчwN$oQ"!p$ h;"(~z1tEq-:u$-%>f~ muB9qmnuC+dRND0x4ZU,Y"It4aG`es{Qt߿ep^$QF(S3Kl QOo $1Lmި: Ĝ!]gW9l$.i&hjOz< PTimh;&R SP[k bb IDAT%: Shn{#_وOEdѨ!aH a6-\}ssgٖqQ2`ƍϳkV?JbBL\8M)+hl|b5 ŗ]~CNY(,LS\8${W(y:yV@c8qlPb꜀W4U Îae.ɕ-ߋw!#so"CLǸan1Ã~GMs:zꈭ0S>FyKS/O2UMQRMR!vX Fc>1BI>,`݀+  #;w_ h䮰<{ɗq nkǦ`!}V U7o'_aq;#wⅳ_1k[P]cToC0BAkڂj ܚd+ZUT'anCrBQ-}4l0vP^2> A4G=[kU y0ڥ c]ztq<+Yvkud$/ `8Ot_WP*|7S;AN6j?[?2,V(6GP#& M KQ.|(FqO;gmoƻ⁻VqM.RXȹCbqWsqWL" ϲz$!dK"R̬<$ڲ0.EAq*C^&*qkLEv`ͭp=hz@9֫L3XLY.0;UtsvqMOe&a2.5^2Nєݪ3﹀׳&eSt_fi;6 )ȝ.E먻]SWC%*Sdwy+4JZːk|'HHd4ѫii4?s7n+4HA-/b5{}'eWZdI!R8ɕ@H?6nob0zlNK_M2WZ$,QmgWCKqYiW'=}^R;bEEmRsmL,^"xef+YnkM*J"$̟s Z,Hۈ=rOkDvU R͐>H mc,WH0hP: _ddbH߮M+UL2BOmG4uO=(D Y0jf$$\G TGyFljwW߯|=ܵ'BGwpy| `IΝ ?|"Vs; RbC8PfR+Hmn7P2>6MXGOn0Yg(dCjzkpŒE.ڊiˏ05Ŗ=2A!k 8^`/:NMi_wE4QFxuڂWu$!(2*ˈ& ]SI*Xo4^%׫87<VA)X.EUQYF=`;刍(#;P(iâiPx=Od,5 fZƊͺ掸Q/paV Sq=r}yMXEWԤMB?Aŏi{tv~ _F*AUM )M@6Q]"*m/"$PAV|M{5\gEFg>Io)w(7s?^]r:! YjɿgS0&˫:C+y=S<9q/@ԑYُ>ƒOǯ0FA2vKdRGC| Q[5`Up L1c&^l`E进o(mz":vKŊe<ȁ98&wweH,PFYauda$<&:.PΕ&`3Ea!AU6!8]0{+umN/ tƓZνV *˾8Tތ6#m,PsgEwQȷ ۉTϱ}Uo`ko"iK6&jt[E>Eg}/S&0r*bjb9|Ućo} }kW\ֳIǣTjns1L&Q&몁/Q&ьwV8a.r ?p1o "k^C\gz,tCP\TVA&(N DT6svX>3k"%#' VUba+LN85<>(XW`>:³ E>2{efg3D˻' x*qƋX&BK~})v̟!W#, -kN[&=bWNE k3Iދ?YbE?O_m+ދ3~$֟&fIځV90v5]'-n\ҡsp{U#'x"mKOwbv;K8օ4Tb /2/u|i V-jG vbu@W)"~ mʊNrgm 6l/pdʹH714^ى?Hݜc[1`efD$ř'/XyZC^~{N܉(XE\,z_;g>?m$8ПC񖱷xg6 & 1+:xJ+WS*xuVi̭6}i(nAAi,W tLR tpM, ̈́N)EUi{hkzE+PKldDdt$5F8U$i б%&-Cp5bcѠB¶EODed͢`DYg;$z%mFßѦpUuERjBB0AE)dP٣x6bLX%5,3dik6O0vNdU`(ZBVTh%̅ub+_iW\|)?BUOmn! )Š@Au v\_#eRV (+ZMpT͒q-ˋئ_K D?I̩T+0sItt*qw;{wI,܆LRv5I[ WwL|_?^x&j^Vwˋܠ?%vq^PLzFcw4ۻ[5'Al5}1: $ّu .4f0Z:$Γ\;wv8gFPDl#*Glv{}?އ[RA@+^i8:=;`e[ `41w+!Os9Ҳ<#kv_^,'6X*uTK7/_Lsp*,]5wa8wR㰺]$auFwǻ}h*\y>psZEkhwuxQ1G0;ð=Nȕ>Gv ;fO}, d?/|9KE(V;/g>>CP?g`zWk6n8>_zz+,\_np}0 ?yoW0%: e-ޓ\5 Z,p՝moěQG3M.PPWYm0HCP=lQ<-ByT&v wq)Hi+v 0n:̴tP$̠Gڸ"Ez]_A*r~\c\ If_+N`KiP4U%4{ljVk7J`Sn̢&\?h:[lK$l-=|JX4s}a\9Ezzx/3s Mjm0pU:Sy x'X{l)EFG#٫T" uv?whQ[:aR$B+~b1N%̺akGE{NھU.MX|yׇJoXj cA>-bz@jq-tQr1<ۮhݖ-zN0_/-ϰ:?Gy] 5zD 4ק jOuB[Sp!V.{oZ&3ѝޯ….PNG]6<+eso,w=O_uX؀A=z|wnހ,lvmZN `z:'tȫntfE"D{ 9 +wb)Z"1x vU\xrF b> {Zګ79|[gvU'vtվlKq[DU?}!ʪ^T[nX c E}K6>M*[-iص=0!+C,dLj$\)BBb39C=Z7Pft^07 +;܇^u,ROiKÑ{TR:oGvZ?r&ÕW|?`YҴ)>ti3=U z~‚y¸} F&1Lnl^0rxT6>]|_]Wf~C͛֫Xn_8|3`V Nx.{Oz#tV%q-cӀbdT]F:>DRY_ѝ レ.ӃAgOeאM$ɦbK ^L1n ܛ;T{Axm+K5Gm:rz(Z1q $vy8'فVWXXl-#HmDbM^n:lg՘eak2^&73…;e2/~'F_D:¿돥)z~g+kވTc8oI$/*#&f) [0vNfߤ2'ܧ|uywth c*b!KT *O&"38y?W^ ULtc eUᆎ?3\VkhW}xL˝j'\oqOX>֟ IDATeVç{nb'0\+( _ b-uR\wm `&c# 7HqfFk8HAŒh6Ln'B@I|&EL!pE2BkU/L 2:D ?zM!ߤ\@Mp+pbbuDr1̟;˭5Ԗ gZO2을2ɰ^ΉBOQb8ĘYp{m#IVrȾQ"EpGF̈́*I̤+" EQ8rCGC٩vIL`%T*=ZX\aRq"ǹ2Hfz uahR lVrK[>|oYtn>}3|٧yez64G>5I|/0q^Ax쑇x o}˲xs? {xCOח!_(ʫ{X?HFOҖȄm6}-qCrրE_q/m`K; 0cx0˒%1PC,{6x7+#~z&*bf\§YG&d#7qz{]ۤ'Ԩ9U^YgeLDbsAԐs- j&[DaSM ODInEx ="7Ϲ,mؕέEdOօ[K$*x2&vAu{w1LQL2m3Poq1H^Ķ=5( p~˵&ʱtuDT8+v;(! Nogz94A(:nk7 PyN_k-1lx|nUBtMNWZ5LmcB6~_F˃KP˥dP\NTpQ(\T٥nP.Tad{P`zCN]-̶^#XH~q@Nj QM>nffwo?CcL8 [g/8yȽ|3QEsKhq\ `RO(z%bum X_$~rMܚ[%h P#iثC NCM?f[uΞB='믡;mP6["\*v&B +{,фXAi芃B aILht0:HW͹لaykta .^w&daP;K g^</-kjMxZW6Eȗ= !7խc|Jҥ.w~l{k >zw}s>ڽ߂>(|]@lZpe;aP-tF]KkS֭Vc.<{_ʛn#n6B3LӟBnmZUndmμR#C+lFʼ]q$ + b:qFN&}Zo JқD}6EgvA&럣bn2f[hVU0Shbv*P>pR WXw"袍'9pu%FxBb3my "ZT p5D{&u*K59BBDLupn+$S$}x (fYTEo0Pv(rPM2 YiR8vu2GgxԬ(Ρ,o<_380}ҽO7z[wgn6X'>R(]Q9]M%NN=ZKY!4v'wĨtȎUoSz9Te _SγSX?D16Xi.#܏~kӸB5W#Ƴ8#6D"hn1MД2wؕɳD*fxXdu7%O+YF7eD_s żv,?Dbyc/>a wϾN>\!N?7^O\iH37ޗw]"X_"$' F ! URV GhxU g^%0ucliw( '#DEюtS r4D`miaCD*ר%iQM|/vIȎcC"1{4[%j4-zQ3[>M6c#| WhKK ^ JB#K1r-ư`#ト~?rszybJ0|4J 4,m16(5O'Pzl/VHoxDN\O#00]D F('g)J\GS"m:LHIJ-HG=q7ӷ 3opO}c闿7ԓOկ} /W~r?:Nc 5ye?OPT9&`J#X[/=l#3e ˦Fmm+iL25\XHe 9(4O;>zu3i{Ix}G;4_2۔8!Uq5?ۯ!MDK f4FUVgҗfw*A֯gl3Pg_%~uEzb]^Ӄ*9kr6(4 >u:PK#K(Đxu"L X@PFie4 ?\O| 7סنu*<L4|QEZTc{ʏ7t{ Iw]wgvvch@;y<)tR/)#:aX,.gzgڛeU=.P7#*22;=,nš7"O@' d`W M<*Kߺ'^)1CGfSYE^x}mQVㄥ(u\20X[[~3/K}p˲+PZ 9*W~H Dd{ gG-#k5L__L/Tq?iуU߿!xdmy! _tˌQ*=wk؅s{?12?eU?1N(*Qіe_ti-1 ;=lT,S))=[24W*Iʦ)&^В(ʃlƍHzfnN[kP\%3c͉k'_&vMaBEC5Nzή6,>c9ξV„~=6LF/˚|ЬWj(&Xr N`- bl^CƾZHXQhPf<l"KAM3cW8QnX!)Q;4'aw'H)`g&"޶bA]pR1k~Ԭ% \hFHӟGp$k?GN;O?yǂeJœw^w`ye{87ߺƶcZ?Z(|';Ë~e9vv$Cӷv#hԎ 1%G0Qq=9$AgZ aۚ( !KH.3[}Oߧ+g$֔=l[(gܸN+hwgv+4;GXo[(GcMަU PM3w;Pp*kuz;7 KOL-Zk-?z[ MTq'T۝@T PzB2&*TexR@5Wءej&dSat1GQSUg 5#?T ZxX7ķ79N>!i z [dHr':3I"N#P 9)x"04|kT0ZL }+-/0(2P) 04х+d*,eNQЈЕR),4]\ZU^,k( Twth)ԚØ mYA)Ugz8]1dErfRI!&h1P\(R)|JnK`?"*u?*WMEPK} [%UZ"CvaT(x VLlC'x5Þ(6ޒݮJxl454[x 0,vA"-3nCR]fGn{l'C xFajɀy06tt!݄0#2W/=,ms6 &x; GTȱN!a9.ʠӨ;Ka8w^ rW$KTҿ%Hd὇r?Iޝ}F]Rv8Q3ȠFVW_{;(~LVZ7dP>9%~uGfzȬ'P Xv\lz# 7xnIrV̿L"zb ( Z:ޞ6U:j[f2maC6A#EkNc]=ƽ a<-^~@h@,3pQ;GΛ+uWc4 STp.ȊJ&A F>vdih,жhvJb- :38{ kkٱp7x>:-Jw *B-K|Ra~"B[Ǹ?o1C$ nN\ rEj/͎/K#g of+& _dԍH%c0AeqJF/+%v~ m32Ms깷HC)gYGӘϽFܩI`Mی\g#Q;E-j^a^m* Yňr$+H~E +? T4I|7(Ws<[!ʞg$@T]X<(hr "udq4r*E;x0"|MZe#Y wIԾ]>;obZ'#eFՉq]y6M Y &$/W ndLk_>A3 5 OCz 0wz\Q?ִl^:kR*\Y_ws+SRS#ոDeUSu=AnuQʅ9LihJx¦} UU/zj0e@mg v̤ܖxj M e&cx'-^+6R5av˔\- Qp6U8bLUmKK) lؠVc IMAjJ䙏}$)( xϬGDaf_~RAR~>/Z |ӟvR_Ut1 [yI_dr52W)O085_a"}N[Yk !͈kL%svҦR룳Q =S rM< $_ヱ[n;Q-1sY,' >/,P+ =p&ʳqKm(d3+W]UaT<`YȠs-ϠD}tl &!UumR2É,~mHcA FԪ8Mr=;So^D}$+Cl(9U-y :5Uy67/./C1e,F֚%%eʮ+FPd׺Ƒ^'8MNĊKNHMjm!tXi* U e.ƆѤC*n1I2ZrCA]iShĘ[cS.UrGCPDw᯷Op<Ц )T&NJ +IJurE]ʖDT72 SYHd @̤iv)CX%rRRPkXM"~G;=\.jd ]TU<i*(u5 L NJN%Tשd[(jJ;5>պ[u X4څ IDAT]:ARj1tԝƲ2]Z/HJ:J&ffC#VPYBުp V s B _yUvapweFYFQB> Da= Nˠ2h\N翀m[Q.G5zfˆ^27_f2];ΌC vO^A86 ː'}~?:v6'p n\>_K?ْlPGCΔ 'dF>?ZEF{~y42d %{Ԥ,I8t{Vs.yN?=W`h]% _~Bp"^e2<7ȌB%+ !~hO~b`yѳ1e Fkup!J[gtPӥH*3bIۃ3aO#f5J+LUAdF/V.lý"@[c^b-KGR3%-h[j;3\ujj3>aRӽFb:N2m䨳zS"1_eP8 au뛬/R(|?TݝIYf+R)D.Y`ҵPO3BUUvk _Z5SCi7& ${VaP4U(whQVt(Q4/FRB^]75ױtY]Qcw">Ŭ0rHq6# #*KNEzްta`!KI:g[HbTwR0i֗0p09,Lw֫ly) 2o#0ToQsQ$Y31\bɱ6Q;noܧnnheL9;tN +H\Kw[Y:.8,^i nತ)T se6*߳SBI0Qi?_`~?ZjvH.a ٹ*鳸ݽ.kr{؎t`fm3J|u~ U˦ab 1K(rXbdMW(d>{eL͹Ew0HlRti4G1*dO0sT},@,[hc}O8"؟&T8d-kefwh;P_ũpvA#L N&@ӯA0Iuv3oiQʱY)SYu"y͓?'ć=V579is]6׍|]\K\Y*m_C_Iyxaf8n_ ̣PXq<`Wϱ}ĸU#I|vA U5x;TdR~ TNy&ʻY<ϻ.s<'N7&Ub<$({*«"BK_i7k69uxc@o,DU(q[_Ɉ&U>_/}m)#l퀿BlJE$b Q$;(7_dn˕EQ||{S,r֧z-y37#Zԥ%%vR{{$obOcq)ZO8Lf5,a}ef㒪LPBi7w ious`rrϡE_?LwH…4+7wo!V=*=urY4l1d |N6үY`<i ݩpEHFuf+[4py!a2 <Ίդ_Im5@lJʂA"ĹRR;} b cv[Aw;uʦ܂mLwǦC3|jR-Qh:AIYA Rɴ8:j CE][jTolA¨.44iF@@)zVfg՘BBq )h8(y=]Ah@)`862EnMKtI2W$Rp[HlP3;Ɖ}g%K<wV76p8VKTTN&ZDoSc{&p(t* %mZ**QCR4(5(iВ zBfi;qeM]7u;{P5߻{[w(d 5j$v5 ԥ::I"Eo3C]' \k F,p3*{a+/ݏXM*U9y80gG)g;矐e˙"/tMN`3腙  N}J0#+Í{ / k[prv]=.hexrɯOLA"%XބNGl(\gs?!;!Wc5P r*p1z>yHΠ֪98%OB =0i`f]B>όTsLś{»pc.6vY:P 瑟>P X&Zwߎ*wGlf=Ǟv/q6:&k&ghҸu\&u *ebck #AB=m# ) }>Auo:ynՈM˅ˤFƖ\}b6A5$~RjMv{ i ī7(;JUV-(QYkH-sCq]PѯCW%KiI)ittLt]%Gvx Cy2Yޤ"ӬI&/2b-iN3(ٷ1僦IfcBRVbæIe 2jڛlo? i=yRص(g&uRy_ bA 턞-uPy̺*C$Ÿd<_#H-m0sq~HB;RV7@ȑOWlz>\vAU;kO4Y@cc+nn) 1$eb#P^ќ~F&~PAî>f'<%/jQh\/&8=˄X״ )]cĶN>¦VvGi6y 1|mҦﰢ7N8ɆAC(E`@OA\UFc"qdfɀYw8͚?w"Wќڤn܃[/"V9Fx$ v뿀uvsbfa1e~Dٴ\;z>ӷy!R6bJ8f7!2լq>,/ hVfPǭ޻[\5Ty >Fc\9~OcTlBɏ0E"`!o:N[$_,Mp+4AC<bD҅.>09wn+Yv91L;Nbݴi-׻>wgᐚpʞmF}LI;PD<}HӜ]z%A"-|U;n%Yę.'رA C6c?E ϴ?bZ`υTd6d4/(bk3FggnIc@Ӯ|T o=Lhv˼]ڴT>G*\q75\Uۦ//QH[ԔoxQ:| 4ͳpMr=YIq`PӚM$:u*^f7^A'qنQY'o *H9:lg-_v'KU@`I $. MzT+;I6Bgph6nv[/;Uay3ǍR?]&^6x#MD$ݦ,N_>RͮѶY"GB"7Y}DF~*Y/|H5XM$AX&Ae0Km0PohdMu+uEJ?f*iD4hU&BV]Rh#j_DiT4ҍ"QoKĸ~qw?z*, %3qbRF$o᫴)*B dm eֶĢ=* h:\FCE}L^UWGMeJG/)(h RRRѤLP\z6_ڦ/ajih@h[qS08$Fn&ZP506 T :J<W3cU:Y GIbՕޔ07T[`Z*6tjyݼ.L5H _Ln(K\>u6틠R4Ei썅? AyYvlg_ B<~M>֍8X|]p9Kt CoޕgvXHf~lLfMYzlA0ez hAe_d69gV?_ fƪhNYa>);rO|*yvUZEhvĢ^|N6*Y 2Z hp V2QW!g45T!_՟T,SG8 (LS ^_l]eڂ4Ae,hɉ9$wb4)#,%\;9&7Kt>C5 ¶J*ȱڂroAI;җjϠ+َ |ZC".RNV" gԆ ˎ2 &j8(27Ǯ2E[ FK9'Ȯ loe9RhAu}u JX_FrF9sC}vkU%BɅ-l?T&4QL 0 ?ާ]\.eeրqa2;\]\wK*~@`nl1֥%F\ - ^ekLf} M&~Lc\q&W9"!E405ypl*uӫ|];k/п!4i`>?oΡZH,[7OIH;3g!agJ\D/8I$S[n6y ~޶%)]ʡ0\zisJW)E\4\kiu窣@-ȧ/,\So#׫yLhEg ˶5JYY~gcl#xx0I@6Fm}/ŕ\n=İK!R5;?_ :qfS:t^A~/p!w|[mN:}j53ChZ 'D._@0({ayYΓo4yӴ~#chʄ^c"׷a,x_FMgX8PGVEm+٨.9qz_~$B\Mj=9,ċ]U4kTEknz1r͹$9/ Aš3p gaN9BݸQ⟥|_99 5*+u-؞DԷ$' Q7gd@7^+m7 ==2pCdF$jpzD 9 J|d {חdP@$~'퓥S97bSgvp7 z ՀmڅGnmo} h޺ wo?B%_~v^l%Z5-jZtk CZJtO ,_NQ0 ˪e*t 5rX+m6 e: LMUp^ˮ!0V(o`P-m҃6TREnb>v]tATO))3$ C^ zB};p+.q.Lp#1ԳUcSZJ8 6#( =nb k~ Qb_SOb%1Zs6m3^'hrLDt Qgk.FOZAH6;A=ZHHloU59~EۘW)c9A1v_[#ф;C~I"mQy?afe]rVC$hl3.GbvRʝ W&0=|ыva@RŃG5࢑rhR -dUk@v~KU!:іN0#P[G^4u5#BU"JJy6 8:ʼ юiLTTUSJԃ*ڣ#D7fBW3%2*Q@74WZdSEs}%H9"Ұ XJ(s: -R1ts>mE+M $ڴ \;j>qj[AS4C_q'U'Y㳟җKGZvG xwh,y-VJk IDATg 68S3{Td+=4Pi Yhb8fɳBUr%ǯy2-CN;8vc }B}C-ZM&lGqV.쨰qa j }EjOŧpeL8nq?wQK vVkL* й9ۋde6$n=iʾLoU}Ň/X}LuTnhbmrHx&TS>]j.&0\*Αo}oFCu4isKK$nܮ2b2EAy/gvg!f  q$# ]tw"S Ybi;mUuy3+>$p$?@ʊWY}ǴG=NՏ>E=9z&j b-w^-;<?_|*ZXarb{Ο—ʕw~:"I}̩twwE,2TCz=ܼu5&'O½9^)K{YΟ;C0,;;Q66>.#z3ED">bd#,. mX#bw B yg͊5㌔ .w(LtD#%'ߎrA]D4M`(2#bQʍ3]Y2H#wp}[uWBUle f F9j؂l"XX}mrr?~H 3aƫu6̃ P-'Y9u/Α.Z^* r>p vhN+kSd46MŀhwnaIl7ݚ0kr@^EQjb N # Hm4f`A\ln )e0ElVWs~U-lF#>s `wXC.]~WCng09 ( EE5V::- dFa.#ML#k`0],,x崢w zQ@0萌z ӡcf4 :NKA/BEBSa(|CqcnFχ?18 =HVe.AMA`U4MMe MM zPBQt:vhSǠ1,˨nҏ@%PA-Pu v(tzg/)( ߇ýf'"`4ȢR3MR@PeA\W= ^JpD5_\m /2Ͻ ;k*;= Ųz.ðW?0F +t\NH a na5y,#~xj&j׫>݄z wT(ѐUظWW~:zqdW{"8@:~@rlhnA= 7GPRVt5=cFbrfɋ .iSvx nCfWDکj -oxztducƸ~]q۳Gǭž&5GruiCoY!+6e:Ԧ0z NGb^$K+S76rAKDG䦻}$3d3Qm%98MnS,bo'8j WC!ܡL"vJ t7{t#]&Κ͐ה''e:J&ӣfIţrFmGg|]PqPjq͜,imrOU%cb)kT7ȠВk ~f2H&͜ MrJJaԫ TlE O5R7 xB} #71hN 8) Nu˘(U;)mñs2Z?we#Mͩ>%t++ )DHrDiM_Osk8cz$cw9Է0 s_*p~~/%{ML8eN )==G;^G|R'}-Gbs2MtɿlpApÖ`JZ|a׳-k'-M;4k ~5#i]}o$b`4wۓ[xD&W|,{ Rd!* $"~v3Ae _%}hKoLgvt Ɠ +&{)}*_ȯQ,Wq̫D*l[N,E6+=I̓F,"YrZZz bDohPΡaw'S5XZR:6 (+F dkInßE7od- PҏV!{&b}UXZ&je2='a 6p pnZW`iSeKUðo\?2[Y UX܅?Qe=C+ x2 >3 JDT w.!IB_>|0Co5UStóg^ *#Wuӂ:5T8Tu͉,X pf%-_}݂U8v ȧj_sF6|:>0Zj-0{0<BpmnoC8L*x w[]clOa@ `J73c_`CR0tknA3u ˶پ.zo xͼD[“k1b/3[u,ج} vmZz>j;0NNŐ%ū0D V+ELA QIeJx4)C݅ ($]>"dexWlSS81Gtz)4E5bv:z/S'i%_1+ ԃ+T a&1 (~D1UfqtSbf,K lAraU:$KH;c7T+5.u ]1#S^5HtDDG~#? mmFUchȕ5os>@]Pۭa&+),Ād"S5,Whk<.K;楮TP:LǜR2(MlE#A;E]9fÁ`Q䰚^AniKhq$gQQk+5~O6cjxk?~CZgVM~i78yh3y0{zd IL]u3.oD B>=')F ZZ+Zn߷·4a"h |es]wrs~':E͋,i.u0&$6ߦ/M5C['#;S'ы@ÈIDR-iy2YFZ"Hye2/aņ5EuG"ecR[m)`XL#XZ2R WmXVLY8R8`;)囤*I80g#QėCh>Y y}$[ s Ǻg˫P$rlpM;4m%\vd-3WhF)ynajݨ}{~ymM`v') dIǍˍ2rkXqFKD.\cC#yqיBL+`M|Ozg%K=mύYYĽb3N1v:qgPc^٢sI3O+QP hn,JYH]74 4v<Ɨ ro#LI9ʦB{UNT- W>Ыc4 wW1ۼfdsfB>`mйM A sV"a a}zS)Qki8b4e^#9S3CPwMy [:tM@c'}I2&>TmeTt<5VQ8ԯxf o܄|I5z~ ( [VxޜrQGFA̼a5fi4{%HWԈg߆s`fG tT~TTS`R;Zu[ЫM<K^@8,ѬgTv;co`<&r[rYlf䶪esCO?/^Q X؃;0g˪Kw]Rt4Ջ:wZLET UpF4 Z-h}ѩK ApS#2?uwD?otթ(3ٍ!x,۬wq$}D]ǨGaF#nJg+4ᝥqwkxp(05> w Qj*9C !\-]eu7GL ty%n8ȶ>p,WPj Qs jcOXƮ=Qh(76Y3hq+9* LVVng}UL[ <%ü:=&\0l[.,GS hQiYk4K{EmF=݊.Z!⇺UdK4C,gX{S6aq0[laboۈG~7tg瞇p b!*o% cSt@lvq;Bi|1"KMRw ~yLyhbi!GDz0ZWm>LNN yȹH}AH́X }L02d T翍hR"k ΫQ{?7:b?{ڍnb^T)LY>Luw,tD~pu>ɉǸ4;8j[%،oc\e{ ,=霝bDׂWk4>!R5r17;L}B!^[`fczS9AD"'s]`+YJ7lnj$7wXٮmP5""."\&Y1^U.f/ۥ^2!ie:{ Go%h)G!+TSp?UâXىWd0vEA) [r [Bk)2 *2_28a\w hrzapZBy/Vh[B0ghWVвjqeb$M){wLb l^&˖,r34Nhaj)oI\ĠICG~͈Ľ3uύs]pmA,, МP y5&lj<ߦUR008\5,#h&j~>5'lRŜ\!-R827j҃I!",ՔCk* m Z9vΏ p²n%R[_ !e Q a^fӋ 6qns¨mTXy'OGY=68kN*;EpZlŸK`v~T=[Xw=Z"rTFtGY\ muwcb07> c^cfhJ\Gj\e[AvPc»naZ`PSfiTV &sF$N]FTF$ T(jX/udڶu.}d#/ֱ91K` ,w'f7pٻ(lgXW=[MZږ"f[Mʄ &:&&c-Vn; ACH…lqsT(q*ZY,W:'qji PhuS2z (D=Q ŭ->XaHkxG!܇Og~]}~2(RENwni;C4"}yk.d'1~ņ#aO9a+z*= 95a'pwNdJ瓿:cg{ Hd0-=='Gu෦h S3:*ҥ(Gx)$yxMީYY_?Xp2D)1{{w- 睇`"h8;ZA#yN%_ YXCl~Y*]bJO8$+m"8]Jn[Ϗ,SkIK89>úIe0bqPC1ąEƾ8){Q?D&h=t`f?oЃ_*L\jFuQpaxXun^ 3 < ѿd>gWᓪv/GOA jR/ :Qx߇Cg3ΝUG'aq*TxNOQ5g勪^6lTRGKE]؄?*D? ofTv i>~N=~x.ЁspK乫3kZN*TmNf7ÿ}ƺLm130٣^x,4~Sc>tO KIӯo~Qi?e3 |RNߜ$,"=ZGj$}9!ZIŸDY2=._RrU#<oI'K0\h-Pٵ0 ,oBoȝ*]>MihkޡENqMqnMn3sLx[Ǚ9qX)n&fBzH-On/ ?Eo$!˴nqnb ;sn\ !.^=W+tW >̀Ewd|ƃd#. je@mWI`hzپLgZ$A06invɌc6YK:qrND]XAKKN(15#AEc`eٌKߥfOr%f&PHS9l.\DFXP%dm#-D98Ś?]s5FnKAu=UCJDmvۨjě߇)7$xfm-hev@GfUjtD).;zUvC#nEvYDpd8qrӯ7Fzܞ"W<),']_:|f: n-za+<"1I%.(\D~ă ß2[9zX׶i6`kz'D?rX_Dڢqj{Cp*.02KQyG\1k0, -<~*/!mt*y`1NR,Է5lXGLM-aBnlpF${C/[H&Ď[)7v& v.e QG Mը ~ވH>^zP~i8;?YIs|%1rjry]L v+r>zbq~zZ<&=A>>8Mػ%,Us>?1}ǮԴ@#eEilH~z#N1u_=OVxm?nk;V;*u z~y3uŃLl% [c~$̩2P7ᵽ2ob`EKv}Kni' Cy5=&ō bɔk: l խCX5y5 ֞]7&CYbZ$?H6ĒFfOP뗹UD :nm3TM2vHRE6˚JoC,F)H~.a!J}ȵ5t!|oO>u9I`msKp1GFܥ;ۋMf.Xz(xEҺdcQ5, [ ` ]4&30EMfڤha%kQeĎy~*j B[S vl9=Dr-6r6ޒ{oܰ ()y(F~ޣ[Yކ)K ~@ Q5wn?}xyNhPo{9Ϩ`PA?e٬s +*z䨪hTUGy0 Uaf𫏨x%fD!dWGj(x,*u˷wu^7<{ַm8sHZ%u'u^Wú#?m {}x݃0>ud; v n52JU;뎳 UQej_^b_c VEft͊@p[䳞I6{*/.qnqz'($r* mQԌb7)*t"Yvė`Ճ>%h(OSTqq}`9P1! .Npߨ4V'\!p`-NZBR@WӞlC`ܡǷ9/~C{#t`pDܷǸa5iRi":O-тK`7 \/AZ@n$O0ff^:ݓ63"6:9otŜC{ = XF6)eQ[kp{IoIpKVLiBfЌkd͋7Fo#wL$|%4R<&EXAaM#R95z!z'{'sO9q:O D L-Y4mVɻ\7wʡ V@$@D3L4sߜ޳/ D 7]]<:]}1{MOOv273/JgfSܺcg^#Ҹϩ/Ypl%Ogo yP.e's|lԢ|9cn ~wdl# ŠJ^A?dMv(Kf  +ix3A)<(jE88x8_T8-4tzHOCV%غfɭ"P}>eC,6yjF] 91L/C+eWv17XBi4xQAh0t(KLT+^W Z# :zg]{^V |\m]=vpЀq1Ocr _Xu .ov|=O2.d($3t+.vCktKM6.g(&vfN{sҘ:V%@hgܲ'XSLu[ْ{ҊĪzBɆFVm fVI۶Yȴ_p+7wp G՟{ƗwO~rHQt@ 3j6ھkgBvQk( Ub G/Io*oۨ7״8TH+GDnp1ȷ2|~H]=&Cxl{+;DÉhRh_fPxȎ]һُ=EpB9Jb`0S s|ANtU,w, }bgae-I{M*".úM%#ɷQ.7,kǨlCE6ą Ԛ\]drbC0x[*ytR mADhl [ѣٓ &0;&&|oӰ Xz.NCu Aah -mmye?qɒ?dѪC^[Jǎ8Vœ$B 9K>ϜR+ <=k%V?ikYٛٳۭw፷`f2*ZIۙ*H0@p ؤPpP[ͷanÐI!r\NKB%ڶkkʺ j OXRްN QX܄'Ä| ԏeՆŠ_ʁ|sY!e qźvi Xq^ }~&Fh|W."TNpoK 5Ti*dԇ|\7IJ:Waoq|Gbq&No܃8#Y' ԢqR:\QocٸK,;_XP@q_FTHiT1gW[(IP|2B=}ѭ[Lw"U Q*LmHa^~[o\w}V Ç~Z%?0@ ̰@h"DZ"ec\4UvZý9}n4@x|,7]ez6vIQXИf'K7xA-Po/]'2XѱO!~ՠ2n-kt Ypp4 xIqP`)SO;z]&>ķ x3OrB(a 'dF˄\^[by->!:N-'w!1>`J⣹~6f IDAT\[#o0d6ҟ V /;[u% k`FM@WP kwgηTy`q v=[ ԩ-4ub`;dޭI sIn7Qԍ  " d*lV)eWKp鴯KֈζBd翁cEo Q'byJGW^e!Elk,BkB~ Zbg1^Tnh(6(l\lhn8ۅT OMf{懼@!]fe{N*"y:kx'߼׀ @V]7=]I0c(ʲQiR/2_YӽOfԣ==Z^ f⫿OhMFݪ맭 z ۏ\94>8zi  6T !Q4DIVQ ZQ?VK}z>Ck ä7QL;-[Su3 STr)csɨ{S#Tc^>w2YNnb7h]*5jT]W0{C2` ħk.ncc!Nʘ=n7H["5”dIq*RgF>OH$j*n@,ܹ_)Jy&8-ol߰2]n-WEC$nUJe߽7+gOAnbA2,O(Xݶujwp'3Gm<6Db-&\'Q0MJQ[UvNr$@X88`ofwH?~L'#i9L3$0 脶XdlsClNRП[S4tq Qac,"BAO h"dGue"b,U6p2ap"Zb:fbl;n҉ 4 OefoKpKʲ-0pRI ˤ6zH'c^2wC<>j|*穕ASE6C[ Md 7nC`cdM!$SAwx'2xjujvK" ~_nJ4 unays4&:volNb@ߡ2_|a:.Fs#i֜^!"QPxHQQ}VEBmI7sc'+Q&@kte h=`1gL4^)G9n>7GU݄~6'"{giKi>pla;!4ROnPL&Nt]7G-aWUz_y.LyO f.sk7.}C_w$ADKt=̿ < Wl/\e ƕCIN0D5O`з|Y֟>K7a6vtu/ZjF/YWJZVЎU1HبpRi4\>2unA XFK `3*dLm'ǿ}<?F(??K;<}!ME099K~Ie>DvW/aWGpQI!zU1Cf0IWfm\(Gޠt [x"nFjYL$1{mCWA]? Yl>e`UPӬW&)aNsgyH -Gno9Ҡ7o%~Ĭ|Ƅ ~zy/ vixubҒϒuliq(O0X򟤻4B(b2DNn>OXp ^c py9PڦXaJr&g13ؓ]Jmr6;3yT%c ڰT,/-㝜&: <(4IA_8S_eԠ|3[qd[: I|S'( |"ܒ|fڕ>c*:FF92v|;[;fl"xy21+L31Ձm؞x|=,߫Kɚu9{C#>8A"\6ݸ6!vIie;{'I H]/tx+{Rg1i#-Qv|}.bP跐]x_e&~\8K0E&v%[Ly1x3?։Y:8n)'pe}-_?],)={aI8؅Q82l¦ ~Da  <)XZ R§޾ {'pka7X`oesU{_?#Spn1pjV==bOXn}~ hɵ?fZҾ]޼ }Km+ӵҽ O[{PmZ\.7k L?2 ?<~&gT :TPU+T:<NzNذe ~"܃o3G?;׬?Kx4FRͪ*=<رfՅ CmO X;åCHNb'}xgq&[]f^0z£0oRpH)}mU|&={oݠ=u~c^?F.֜Bα67qQ;FJqX>8}~pQPN/0js8,m~w2J 1ݢS;DG1n#Cr)Y;Z8M8m2t7dKO$.;EBZL}^ϲSEdTY7aՆ;`ڀJ_kt6kR5TtlEklv1 n+ۥ&9O>w*G_EM,/]sQV[M-2r8" {n2ǔopM9B<ϳE}<)v@4mΑUaf2 >[E:cʫ`8Dp<8l?G#08i1\5~YɺU%,&z$ ا0y julg$M TvŚ49BQar+ApCkj%G^y#q<^=JgÄD|dUd(gFI> zW2ç9<6"Ce@a}#42Xp -l1 QOz:#Gj8O,x$C fO E{ i#l,TiUhbn}"zȎ?%YMӮ]bUs}}f5M]ѴcvGK[e՛HP$>R)mR= ^{s5g<8@q$2ՃCe7Oo2 Sg .*o5N`M\ivy,/x8Ivx65"]t|n|q.m"Lt!I# KlCASh.FulFB*bW!iu%\v Qa2h-QTnWƐܝz-`\S0mtJKZ6bn A$.$lԺMDFm:^nCRZa$.^7$L$Е|Qj4iSe'LÝ$Y5) \L.}fsT Y5TZ kPAޤQ40 -ŏUG4]:6Ӂc@Dhm 84WwR3 0z\[AfOE֦UlөƭP C%O~ɵS<,Yr6#3[ΑI*::>FrSfiEPQ0]64;RM#KڻB,W#QzWeCeo|Ry}~ I]Öz7t7WYmrc_#{d/7`Q2[!9la JY['I##|d߀"!~ڱ!>a&'iUH4)=KLvcy+ŋi>ˑg>#Ӽh'&~3Ҹs}~0 #6sۣS14ugG(l>˃?9xx̭q''u^ga1>cB9GȞ$Gyh1f})26 2]'pƔQ/07b읛LLevӯ.saG 8q[oT8@{"jYICl4cɂMB >?E,&p,ZD ͽ I8ʛix6*;2'2x&~_S": N7[-3qa;l0Cw9u IDATT8j5sr"u}"v`ƕ^1Ntͧ$}4+lg/ '(G4%w_-E{d|_Jr&R|]7b!6&>"#Я3wiV~.|'/>vVf01{]:b80NQWwup{}]ݮh!ڑ."ȲM( :lU$!Lj.BÆa12]D{)"BWDF$nT=f=h6H yBOb4 has6)^ نcPIH!DZR.hUT:4N)2ΞFET$ߋqL: YhwHBPwp =]=/5qڝn [DPzD2h*tTEZ~@HhѰX4H!KXBPPԃ.=S&T%B]>x(JR,/] /pt/NvvR#&M"1*}/#O=e}l&Cg$r9̝D ;hIC.N!#$82Nb]$0uBrHf}^C:@x2OS7}(IĈցǥ192b gûJ|C֤U8F;s"HLj0J*跱Q xKgL* '-܅O59cH1s3(RN$>BhA?J#˳!)MkLaýlcNY?d,1 ⏘ڽkw}M %]쎏H?dOz*[pƥ?}.k`|'l6x~'pQfPHot6O:ybfNU.}fFjGG `r5;VybS|ub=_BXG!ePFe#(ܖynxt] I"LQ8U]. dxȦnceSQܞ}γ1X7.os'j?qw[ϥxa7` B>fu*;6߇Y86 +kӆZ|B3oIڏ9f`; _}ֲ˗EĬ[~+tQ˛YkV[.ZR˫ `$ʙ ц`tHo ykDHWTg~?{%Gvy"#"Ϭ, B mT7I5IIq$q#OʮfFhFҘCHQT6۠A7@P(o2Gr8ۻΙ={VY"x{߽5oݓ(<{. 7tӿ*M_͵M {' hoky,k|$oxZ;;[ߟ,@[hNX[j-} < l^'t=bk۝XGkJ HYScFSuM b?huPA#<~? "JĸFO$ۉ+e|mW1toKA_.Age@( HKq3;^Ź7]ݴ܄zy;ۃۉYac!";YOT=R$..l%64盔ރ,Z7Y$33ɾE`=Ǻ#,芐\0j>W2X/{Q|=Ev%vqxj}Zt}ܞҸN$q>7 gd#Ӡd^<0L/B2X} \J+Gx G؎a8}!ŴN&p,)"UuTYnFkTtTO=7%iz;6f;78RZ u\6+k iiw=kc :]*=Nf,DpW!$B_[›v2eThX<{.::K4:gm Rt~U㄂.F=Ž3KdԾaVW |qmo=23"U Kgm=L"~n ~pm?헂̯,36tˣvƿ"+UpSrE!, _2|PKێr梜L)"*B4#JTppC"quE~nt n"BEGAj&,?AIe3/ڞ"]xK嘖UmwR»2Xe6DAZ41*n]ĔdD=0 YBAY芄lb Cq`&ibm.M VxyL, LdžMuPl."hhXn>z6tݎM v S)n&Vjy.v'AbQS$W\8.ʠ-iIdt*HE7m6jrE$K4: գ&xeD15sT Z Wm͸(v 4;VXP tp5LrڠR5yjYw (ߩU_ˡ] h"d{MSqNOi=oG-µQۦ=TC8g>Qbj*!]n`28qrWz|MꋒmVC˸{ ˞W)xTԃ2Ld 䥷Y Ijsy1F<%;vΓhY֖ǪeQB ub:i#?|Azx=}~o/ wbbl7FiPĦI( Å 5xItΞyGa$d,Ȅًtad.ײ4u[a `Lan]f4ֆhBS떰* MϯB8Ҳ^Z'Z@3 ϼ{vBKVi{ K?7HÁᖍ]Mk+ =q/(|`? G}}GZ*څ$ܜk]jy|×_/ï \@u * VHOkS`󞖧&:Z)hPBG˗@[c2?z xpm0s >6/?_mL{} TM@ ?8|Um)p ~˭R{*<{em)j|KX"pc{X0Bmq`cمf7hjש NwPq$u:bPvӰirb*x=UJ=*n9 K=U*aHL]B:7@ t'(gȽ^4 5BLEpsI?lx g# U1JVq6RY*S/*^j߁&.2eyh1q9sx}{CcdICO0`1l XTĝ]%l6d)066mvdˈm!ETn*]v/zVF-hu >D5TM`IY*4Bxj櫧8u}h?cK{lO$:uzZfgڳC.,aэG%0[&c`1K}`C~bK&." M ,ͮ f X]$KT NⷦI5rB %$"&0;},| ǚµJq -묻lh U dKޢſ-թ/GnlV18!s2 B? nؼ̹,{-{-A}{#{ ӐȈ1LKm1>iU J8zʼnt"5D݅2AWNOn !6@)Ў)8*bā۴#X.a 6D{_`դM5d9O)Ѱ Dlx\UPA-t=HAtuP$=Kd),5Ф*۵\r@@ti+i]Blnӎd#4P@guΞ>=]l×b}oYѓ yIυ JXoYЯ[FY9R^۔>9OYS W=l{Ro֟# Ϥf5h^\90peMm/-nXbF kAw Ct,n" 8\aj'0G{obS :s Wэ ""a)d#fjsWg)f]: f&OR7jd)D+]@WC#lnxzSCНb2HeJE"8u P.2&5Ebc06a]p"p+V z[{vaa >c7ٟ.@ p~n$,mʜo e_{P58: S=0mYKy C e]>ۄS{Zb`f[`1ٿQOԵoݢfZct=wŠwuǏ=?'wk ;ZէZJy#Lv _?߱%t,<06:[_K0> _<1[?4 448s=h>sЏM۷ΩViR [A3#?C|O凣?˶de›qņ*0c1Kidš6B/C6Ojw{z#pe!˧$RwO^ekH}ul$M&tPn`."0}Kq4-Y|47>EL/^!J`D>d^&J2RѮ(ct:pe"7o [\Vl\:Op=+t~w;86tQ<3pqVF:O@,s[XuK}7?ΐcMy ׭0}N'rMj۔hU %6Ru vdy9tjXidRG?Nl'zʹ sQf&1R-(\'8V-?ڍM گٻUc9ԚF.laV+znnBM`CؠrsE'Te+ȳb âݶȂ, ~8"o8xq/kVGx3@('OR4<$0cW9pemǓGTm\,,U&@?`s{IY1yF޹JY6ScuY)[,|P}qvl!N~!^VT>{i RuE,b#"=Ub@ ` nTՓ' oZ}LD;oO;~M:: A3!<{GWx/[W)E<1,d+k|LS!hsX% 9̆HlAZhClZaŁl #bӝx+:JĢ\qF65pFr YBi(M$_YĬh Pt %@!'(P:UC+u6(!;<,'[wX7Yb>v I@dC`:4&aU H#-ihPI%XB]5j)"k6E`4vp"(`7Çmp΅ *'f 8J."n!EUt }N%W;M;@w@wuBmԲOƏ~ɏbƻ>x|g_zr2Vd8^!o^s jC:I;DŽ˸+nr3w-DuJ`hK/ۺZ m!} [[ejċ:\]c~uG IDATpb\v!wOn \il7Z͕l'9w7ށ3p|?ڂ<~kr3u{';&42$ 4+DZÌ|?u'obVKDb 2G;B#4V56kST0$;aWWg(lg$6P9Bd}ar}e˘GAy*"͟QfWQN9\d&<8ecɹp_'f9"WSElpz$r%*~:ƑwX>@q&ȧNd<0@4-|ֹ T@eNst l70Gyq-{)fמ^ʖArүefb*Z%5rG1d/F [+'}E@:);ũ |'?hcb=b*؇D:R!yy}߸̼x7P):ذ .NBVEb=QX.IV3 LDr-VCM)V4 B'ad):: QշQ6 DeM t60 a!-(]@p]cKƭ:dɎ[Hrl*nBJ@M얇`CnxQT좁:hv*>-,t :DJlgn)5b*)$MCZ7MȻtB M-Gw5u$ M,ن! ^E85B> G^El^|F MҔ< MQ F\TsWw }$I9 wgPߎ炨V%@gH+gz#A)*6912ЂHuLBEo2,yq&SiB;:ܟ x`i)I!<&b唈uA@ZdgO4((Q G)Gq,T7>gi05H&c2xFk^l Mzj_eGPcІ< $.n(Oع696t?x~W[5 ?FYbCp͘sF)ɑkktW:9;*+qt4eZS U䴟.J 2bQX(Wyql+e+|\ZoUE {)obnL0Oc5?ԋoH}z0/OQ\c6iZ̅fd4ukw5:v>Lוk[\5/1x%ˡp+erS$Su*# dCMFRw=+q|T)%ivwoHQ{:*xq&OrTP܇6˜.ryڰeDTijmMkSģg{ >,7i/_}U飒麟M|@3V(w''ٴ]"R6S(&8-LW8j`{!zS7!NtvJϾѻZ̦ kI+ `fG+Jʲ5JUhB|; ۠=gʕp1ޗ[hҾG kt?H[a' (k\i]py~H1LJ|o*SdZ((g@%5;2lSt )p |o6+&rLݏRX.| Sa Lc]|iF'9tC{΋Mj-ލ#IBbo_jR^877]o9h˔vFq܉%R=͵]U->yoWϳ[bN`g_`wF,)c7Mj|B;kDc!NӾ̉cQƟޏUb߲naW+t=Ob6N չ *ong=Mɞ/$".\j'mwrvev,Q+%y]οW9 a׮WՏDby݆k?Ŧwˌa8הǶ' MfO%j`T3cT7g)/H] f|~$ё"|A5|}4;#o{V7m~+HOO{7v%;yI_Ui kA6!fQ_wt C+|St?WSõ,K_} ϩ{,b} +nǸVd@Zʳ*]˵ts'BONgAaE +f'թ nrS#aBfըn,Y'tD G@l]~z &mx%vW w9JƐNtd< m;%hD^2[M٪:pVT4IS.abMR-w r@mx15(5,1CmUj6\*ׇ SLߠEp' nEGT U 'v,pssnS~!aG)t4<ZgT1b"U mwR>&.?unT%4 EUvŁG츅Cb3&B6ECUۘz]93Ybkߩe㟌3e;Ǐ24,?COϽ@Wg?21j+WS_EUUok8ǟv1\=w|OO(Ҥŕ2 P:JnRuB+=7q%yOMRPt~='EXME`Wrϣ/(d "mS _b@Z"Xc1ˇߏeӖEM/a5WыuvӵPo#ٙ֠-Q uh=L ֩>CO#GաwrWn]ߍ<5@5w;'F)f -I7>+"-'Xko_PVgyu"|>jKDXFMb88ċf;ܼqW6¨}V0;X X}ƍn;qߕWIz%^# $AB+7l(,1>W.R:>s;zѾ.ϲ ]t8fbORosdwBKj`T-*jl(x7_}O#XwJtRh댆ü߀, Z)MԾE.`|xg|N̓ge`XDGmXgH\@UDo%N]ONs,+ٸSwё[\gƱk.Zi6`D k RE- ӟnwʄIf˪(]LUE;#e]kp|+-#O[~SV/T'[m~x4leNCӿ? 6`LCi҅ l[߆'Nԩs8< 8s$ζ}(_jv|nxMZЖ <"$-+>g^^ч[L/kk;R3ѺK-er&@{:5倐c 6*>ϋyC i}#Ϟ?u:7+>CfWɩ4\#쮎`v8rnr^&rC{ |=~'(Q_}O_=:NvV)Y@/Ep\ᕑm?ͫG#:yL#>ݏ5d;u}(}YҏcV0ZÏR)0vrGIFqm/'Mrt}uM:vl>vQ͒ډa{2_ǎ7pN$y¨e_GUT?%yN08Byxjx5epA:8Χ *n;zǿwP[>Gċ~{'xj:S'jMoO]ئ9QRu~u4}ˏPBT3y #s1Ͷ^<Ld$[SQsQ++ y\zHnja-QU9RsLj;=U:,&OrK`7I.'y^ l))kHI/1},\7h Iڳ]djl1dNMC6o)kMJQ7 6C_7͹J(Ko}Z%" vGIvqQʿD31\5A)ІmRآ&T5vݟaWw?F[MI:U^d I*S,\A5;,4@mxf li/pLF F;NIlS¦4@͋Lb XMCӆEQb2JՋ%D^ j."Z*0 5d+PNB'$ 4}IHԉ :EPI R-F%m oQ!z=P%C}D@T.l..rph o3jqf%D`T!\}-hܤ& "͆Q5.ԦAHR2|hTYaHMfեa2V3y1=ߟX‘|a&o};^o-haspߜ? oK0O~/2sk~w"##Cc#,- P'BھMJl#nݦ{ؙ .lUBlwq27T7#lNcncK&33_"NpaICRjnNZz W I `n!8'quFΜAd9\ Q㕯& P;1]0;Ey$}ɳ$@"eR$%+^Y%Jnز E86we1!ɖlHQER" s}Tu]\l`W4%E7#3Yʪz6cy{yZv11@ra {'ܨsK+Y_o3s9D L} <߭q&}^P@e J; Bc@-?qi#T'y)rD'>SuX2hמ"!F0.W\qǡWk;IJl L+-]㏷.('(p7BcR?u΁Ij4k.s9F.4,08vr*%`չs7LuNvD )ʝGdF b'!Y@Mj1N7z±#ǘN@aw7'6AzFzC>4V Fkf}:R79zl¾-I+=GYfU.xATVk8.ݦ'u'pr/BeIက488NU)҈!bJE;S®h !Ⱦ#D^f:Iݡ#6(b`a4va"T06.E(4|П!`T.ٟ5-qCoVۏ{g᷿ǎ <@@S|ue{03607nfWeO՗#G01CZM8AecwGk0kkL?$dzsmx,d|-]#Tſ(pAP%e|Vzlng[ǂ+OӇMh_>p_: O F!L?r B9WΘVM']޾zfwxs|S^!>R}UdK^icDŽ8tVSbW čqGkH<1w7y;SdXMr ZaBcǐ$.at-݆2rU]W  ,5#H.FGҹ'ꏰ`FDj`y>,;&p07)ipw\!b}pMO3>Ƨ70o}(EX:oCxbK:?%[5Z6C,f-I];}Do5=^G*˳xa!إ' DedQn8mjTmjd[-a۸fK16B` 8fP6@$cn>L&3B#zYM f.afHmbʠg*A;hzѪ;Y"nXcB5CqNL8M19-q$#]^PG80^I"ɿHkN'uX[0\ Gw<<|{GjށRl|b {(^dA0ڧyw٨8Fْy޺'fLbA'M:t VG`Gu`53$nJU9j8L~9qjgdf ( fxyD)ǯuÜq91 $c?1O };MV'9G~ғ|kΪTAx#Ыͳ-Aa##3pXu<™$zqkbXgc:_e3˱Q"i.9\cF\%g\``e~ Je8| ,ڷzϾV|spbvmɈ>qdO¹ ~\T;VGB;}"_?(|_Rh\/]TEeU>r>wbsá/TQ?8^ }8?˰sI|$<滂/}GgH o9d %yս\<%b•F9O4\O?*@Yg*D vi s05=FٿaU/hru' ^+JF2f2Srb*Nқu`,ӔZ39#>T̑lQv{C0䭹R6_é ]\3QҠE9؄tc^fL8'VHfmV"Wv\x_߅mX5Od-D(*qK`8j` xT2ai f !^P&hG#MdR2-*4"*z5Qi i Bv HIjC#zNG`[@ q!t4"i5Ui^B z[]F= U'7E@P搲d2"3(t=6FѪNhh1M2Ӥ?>X{xlz{$Nlp:,QvbtN9l0Z}kΰE̕8.ӭ۸! fl<4]LyV^ =aZ[!~KC7HO{kXhF\[e2ւtBMtCh"ÌE=B$߁K9zoY3A5pّ($.#DZȏ|crril?KPP}WRpe{y×HrpIiT<}+aU_4W_P{$J yoԐ]?9+e98np|luzā ~X4?H$z%7oa5xlr0*rir,x 0Q_/'|㿆et$ﮒh/U/jdգܓ%Nne{$1oO‰46_BG+):8EbN#W#nV t g+~+~O Tv!åLmgQp.nN<.LFW'|Y]|`LgHL^?o⺿>=5$)EhUAQ ZXpiFfʄB6Rem56;"/2c8Q|ģ!9,#~&qmtٽO}5]hutmejEz 2,;ARfߦS>IQPr*I[^>m-@«-QyʡaВA60}7Z=$ma$A=rGiT23l;]ERx8vqE$ɒLA8z`IN| [ %g$7azV?KەTSk"]%j9 b8@l1q ϹrsGS} /)<0|a7Ylը;FR|a.I0c( LVton0i2=@\i8!Ne:,r";!1 ԂzlA,aE#*fkS7AZ}a#LS!ҭ1'Dhm n9*:l-`^ӛhTǪ%tatuj}u`Spu9Fp;7C-6Hc&3! $S{vd:*n )? V0.Jء+"k@]TlFzoo 8ғz H ;̗l IM8craPO# t>rlk,͍6ѷM1Mp[>3#cl!XZ`/oIi8 |jMS@C'c0#RKSpg4[vAea,^{UZ:`y+‘`om3Պ]B!}|o͢?p4P&lLf@~9;#()NpGDm)on\\T3D1MɨUaMz q}>[7`brhj: HӔZĵcACMc&j; Gx.9+: >Cs&@ΐFxnS:#*ObDd7(g߁Z\`vj@sp+C4Ю!p VqQ^Cu_d} Q>ʹ+_cdD'4viRGmn H Vyu^W#* [xj50JO)JCZS ’1 1`N>ʭDv|@gbwnp" )zzܧ{=oJCbD6diҪtJhKNΒգ(.dHgD,P1*C c3HCgh,v4NdQϿM-A-n X:mZ}dziQp( wzvKeO 6[AƏNfeSf5 +W4Z )=踒A8‚)'Ȕʑ#*|pN/nZ-Bh0 )mՐi2㖗a:OQɄ8Zs,$t!rKg{`?H b4(>՘MxD s 'R*op}?O7ުW :PUM1r6Fs@"#c3خLg^@x'i#1Zژq#3 9hHZNqO>RpֱBa:-kc_R:hTYhX!7ЦYD"ab *A"Dkcw ߁+1P k3ϲjVЦd:EVc^Ʀh1\ i=.R/$ZGlQd֣AMʵ }d#}ERRu Q =Bf=[6"&B'(eRvZЅ!#E=cRFXAl%9Yc"-70Cji55̮Дd_|}{vU~9r{h4Ct:|K~q~yFYΞ9SO?KO}|F#}9q.T癟w/q֏ߤ2M"f1]2͠6PsR#> [QPT"^F\23:n9$ ZiŨ:AmM{E"*axC/nQr،dl#}D wԦWXRJ6Nm;;'+d X =$ݒ1BnUCY2y 4Z4Z),UR D-LB׌$I,f zJH p(x.TqG ;, xH9]KaľȌbq0;'Q8,t4>yOC tcN[2aͳS_B4&u&$bc q@wy)@S;0:Zh5MyO'/%.][k7yUf&M!cXjNB4!Q&mDp;t5l"ȵDpy![iCkA) ͐ӌH&Y1E[$``3e0# ,^:NشPt+81Ƣ&=9=KIɄIbX!⪀HTC:ȐҶK\d*> pxN4d*ePS(nW)mZnPmtӠxNhRUghhhQ^IYlc-MR$+t>nPr lBz=xf*ƐM>: [~G+ AIǹIH@~N%Ѱf^OR.Y-%y^40 /=p4Dt.Ђ!Ak賽3͂ 6`BiVTj 9hQ. //||lN3J^-C ?u^^}FgG`У[w@< UnA,;y{0 ?s/84߅GN3/< *G|> 6 X㫔8~4🗳CzQ.Abtq Nff&pyYB,TH&I#-ҖLj'%T{-&WfO#_\#TQ42 ^h=;@?;Evn,'9CP^K1+[#ts6ǹ`LSs$ͼ@Eq#أ'AJU㵊M;%W%vQ@!՝#!-P  IDATs4a;P箇fl`jgB]DcEMf2^qm˰Q؄BaX?9h?]e2D&*J0t^TY)`b x;-w9%쳪HD$qSPLhV6ZUQ r Ӳ HN: gBSߠ I,XXudj QIRGبo^Rκ0{ bZ3,r$؝Tfצ.=:sgWCt!F+:l\N落x@BP G]^@d@8#g|gl:VCC\sI/.pY⻿/ˬ8ANAApUdY&\)]\%,)[3nb™c iGb.B6(Ȩ'Bܽ"Ҽ.Px8L".}IG{gh yBfΪ?| Nz280x 1TL8HJ4NOF2 JJA_d5CHl)FcEzB?$Lt6pSdR^,y2Zi.YvA05d% FtMś!M`DV{x`kt:[t(jA2PeGX\^CT>|wژ}HkS1viȞ1i;\ %B o3M@ oߖ27Ѓ+Eh֨'JXno`Hjbɒ3ģݥ﨔'. pA6K(@(4EA5G;٤5}'s)qS)X<ZZ^s4Oj|KtpSDjt/@e(}!q:'(ώH4O2rj' N;B{Tgfd WIҙ0hTfEyL TCC[|3AlsޞܨLe/{[MJQIJ x\kXIpR4 ޸מz?ʵU;}lӦfY\|5_wd+i}sS L_7j=jAFoDO0X8x?"{ !=F3-dBaA"8BX8EMs 7cQ)BWtq:&`r,8&p~#c7illָYyBoc&"*'Aq, NΡimQRll3@24TѦ'u!\x&>IqB>)p %;D2dt=m &h,[3 8dp(9y8yNH 8G=p}R1?K߄sǡPopAρBKpLNn`}w,2l4|{g9Xf mP?]ǗA!;< S >[;Co=;}Ko5_$8qswh.nLl 'f|SJs Ϝ|iR>xzY/V_,}* o.=:?gGy= ,Mû7w&o={e:}S7 q ۚMJk/sir7o]'lÔG"H2Ɏٍ%惼%K? _?׸7I{P" zf@8H&7mw*Ͱ CeT(z}O-6Z$q.m.stFx0E!H4E jGq.P˼I~rOEmw?@Q&p#2-PQl5*aйVFQnL2T%[gq"qAԦF Np$Y;:5댒'vQ:RTݼțg,H5kxˬqm$',X={?$vf^Q^h u񨽢C-H@LZ"] 2VXЂ>ӳhN ;!+s1Rs.kzM߉R?ڢhJdi7ivQ[kla_ gZ%m zI ∝&Nc25/1'o j0~ CmаddT\nGn59lAzc3Ub9h*5/:[aS$0'LZ. v9\aGAF08oHa ӷr\dNzYOr*˒sD3mp %? w‹稄]b&NqA2>b%hX\M +H=xDBPwab EAhQjkfnBO<^kTu*-.NI%nݢ;){%@o ufʫnDž ,aoa>Ge&_vx7yx睡[+Uz[dj>=^m 퉸 /ߴgy F\rtk 8wsVb.Jbg38GC~-]YkS?!e%ZO|=o0A+Y%(+#76>@šĽ&$^JH͜ئ3+sj9({cM);eҩ3NyS7:j=nH:k!&lVM.pk.;YJGa$ }9A$7Br72l "i[$d}+ XcnX/Mg٦CH5t>eÞe%Ancxm}:aQ6$jЅ KeSD@Aq1unkS"F#4|U| MDt3oY:A D6"w%-4pЉpR'K8[e臢mL S=<d.@tG=\߸ĥ/ST5&J#|*Z$jݪι+:DΠAʠZXզ{ }>EL-t<,59^pD&=MqGyؕ5\d};GuBx*&H41g{*a~|X7v@C:-Dݼj(+dLM ? =f0mqM}DJͲM{$O ;#u[#^ʩ"I16<;wo:;$*nI;Fܮ "(ӨD.NfKrELOp`Ad6'4+4+"w6Pc[}'Dt@b/ ͜fKa"nEWT,:.5w|&Džfz ,qk-./ũ${uMnHi&HncTcV uT1:8 CQqk2ZbZN G={QmO}8|~c[W^s>?gɯ#o};Ό0ȫWX{5!wc_e Pb*rttR/i~:ÅmV}P m9LHIFlSiSas2wF#|`cM-qõay,b *No1F},LkQqTѸ3%_q$9R+'p`ClW#usX~َ#%.pd`8)"bW$bo[/-Hj㧈"tUt[%&F 5; 4'"MD } i}(e$/X{"$[`{"#8;|NkBα̻;qA>ՎGZQi:?# ,]!/-Bg)lwPmEE"mSMM҃4=Ǎ %)כ6je1+vAPR2"A&O/l1QH^;DmHA# 4qT}pD־O-0| 0۷\ a,?_8,];n7G7# czeפ;CqN÷Y3tExmyH_قG@D\݆8'ΩĺgC>Ɔ*lͷar~@Lf'Xേ@pC[CP=9 &a$`>K@7G?2̓>y`h7 }x4ҏ= PÛg\__)xmg??k>ypMrC&|NaA4 eƆQQ;Wazx\1~/_ f:9Ǯr} ;ʁ1T4֍< t&"ws($3Kkd RJ>`ǝ)f1M6MX cp^sj!Nkz/1a[ }B! (W 4&Z٤ q=2:fA"8b壌(hB\&aC3  ΀ Wڛ(D)`Jޙ'I,7l:_$E)$ h'#Fh/&K2^FF Vv \M\3}S err % AIafPu&x]WaUnM $h)WwQFMŸSTB}\k Hy9BqMzYǘhp2d'#kq~#n@E`zF*%: }sF:c46C8 x#z s&\^~%gS".nB Ms43$mGuW-W}.\O1Mmta+8k15qQi(LŐk8&&$;6_/prZ$f44zO p~E;1H"xATĴ(%@ QAףՁt\dvf7!q0ӻ*qɁFEk*A Hf]]JkYݼWYdDAGE!S u ڇ{4.%kqS#Mrh $aQtt#V$6Ym\;6:xldO=;EaB 4=ذ)LzewtQI) yPҷD4"8M/"")-$moqb&6Zߖ "46JDLtAʧGQEޒKMc:quEf7 FD75F*&"!"0dj lݠZbb8!\O S.$ n00Ach! d#LV9`DEvAok4%w ooVٶÏwInd|B}X$ 6i&lYpe3,!n7\.$RAUT(j]*koN3ѹ@v /^[KphiFhxjo(K4>ӛ؎K$;e'Bϙė.M0d;4󻼴v~xm}w9:P|eB*k}}WQb*YTDeGMc+u2ZZ_atР2؋Y!7 b*ڤr1[4b-f6czӦewG"$ ~m?E=%j_(!s]̐SN "18 lc$|)A۪t5@å/޹/q5^?nѤjvEYML4)!c6 _y}~3?G6M@\+ X* z+,_]1:9M'cD:iή2h(K `] O~VA6ĝPf!Ḿ$pQÙLYmt-z>ѡ <!zx=<׃o[e/@\2Пg`*Cg~R)x??u~{!VUxihH D!r"Y(}WfxgCCp6#C u.9Ls| ʳ:r=p`hQ J Xfe0ky ^z~qõpܡ]W Ͻw-?0d<x+o`4@B2=ܴ(_9~=XvDY0I(zWw N^a#&pj8#y ]+,*qG6aD[Đbǩ!f*7uIv%#ezP[:lOΡIFϣrƘٛS=* 8Ϙ`` +S4}Ht8L&m-G4Kq/rc23+-+t/Mi**+V ^$n0^,I1-pvd378"`$K딕uBzeChŭwhLDc,`9^(Ue!lՠb)V_&0G1*}wyʽgyX48: #1a!l)뛘D ]ٚ@JhQ$B=2pFlP mWi!G8g`錥\$ '0Aˡ8UB|b ) xҫ$'sTR%QG4=)f9sȾ)h LrIG\ẋ!'/r|FַHEEjBd$i3O鼹bp$+z4:ScYJ~"hEz:-DIS41ۥF'}ܯc4z,V cEH)mv9m$(.xL0e<! J* 9CP_DD$Qm5WQE YduM#S@$"e3@tZH_&%J=3[!8%HL1&ڈ0 sj)C7,""b'ƐI 1]a2WFbT!tm{R%G`[3o{鈉ݲx03]R$ʡ!>z\%%bBpkH{3gG0T\e.hc5 ,"$U FWp'ZjҜn6A$f}BYgȗp jmHBZ/D u7d*Ufš+n Xmk1uЌ o%|^tj +4ַ,2S\S4WͤE*ɱx6N68WZIydxSʄm/ؠ`@`+E4I ڀ:~[_mG@HFILQ ^vl?O~ɟ|/~iN>eƙ}Y3 Rˤ mlS!;tZfrPs3GA=($*7+DUg!` 7Cm/iU, Y[dhB259ªu I~L>w._^cD:c)؂G;R;ha\?B 1"qLzBQLңHU$O=@FsC}jC $ (e`Lʫ@: u0m\cnB:FCq0 xbr89X .<2hax=~꧇qzv8 ;UW`2V>)sP)x8̝lyy99?b{8g\n%ػ;ck,mAfμϾ =04vf&`q^|V5 W˰'?-gߕ? L8sxl _׆g!aH$owkmE.p03^FCNNF7 sT$_ZU5hq4\|MnЉG٩2.Q)qqE2MdnF}oK!HrGzL%c-ש4,ZBS`Rjztz5$xnfq+^a+\Ċ{쉩ODX[O^_AfDa/cwڜ=2Xj٘ߠ,,͎Ce\hS/έT*щ}7\[IT#t:TP9AG7˴UËt*nQ;wsFQ|˜3N3k+M2ɒL:80uU寓D(je4֠=gyis+12HB4c -bqº6Sj6-G IG\.HTɭt1R Qi%j 8Z HBfgң 5ц 1u˨NPbaՈDXqbo"4ŨﲒS;{{ >e.~&)z')r`$@LGV |]vbtnSL2tYHQ+ȋ>w5&%a+a`kkqWa&RQpv6Ex,Jay㮔n=)N,31Rߢ,1mmFn0D.=cn4ǢcgE푊mD7ٸ&bEc9?rʙw/rhdѴFK16hm )$w@>գIO- K"yq =6(ϐxYajAFL%}4N<iuHOJޤ-@STE>c-ڃ8޺M3Q-)jH[]VBP"bPy$Mf7؏^eвزӋDHH1.Gԣ&*o=ȨSgfNv2ߢi&)-VRNg S3'ЧySa1'ъ#ѡa FCe$sGU{ssd#*׳|'LN{l.\f<Ń&LS4&{7x⇊Mt"_`2rF$)I5):a&w.m]lH~d|adu ^YGb! *ɋs,D`=O!?xZ͍#:mhGC.4Ki* 0e"_]G d88}GJZd %vj&j*IA!$wy%[k`6[cośbq37JrYU;UBq. P>I"mL!OX;msW:۾@´!Y&ũJY7hu{?K &=~OqvO8LΝC6R.)L8}F6!c4Z!thrZ%lt<ש4#gdj ?T|OsW_z9s/ )4jھ4GUt0I1DYBHfM|zTjO<E3&,q kQ%.j$BEb :\|S]fn8ۗvTOH"EbYnlOoqDBt(QEF \L?]N)'mlPshئ64#ћ+ԤVgTB%@=X+g qW=[=+g0ĥ<:Q!F<'F]ZJ[O1w>LJ9ʹQX\/R p&ذ!牗wԂc{a^3~Vo2D :bk8rdhY /܀䆏Щkwdrt.!#ֆRd p`qrC `P~SCfxak wirYQm`ygzŧx9Jݤdv=HBb ŃX{I<_`=Io}d4=Ûa x' Rsg{hoS Si̒EZl }ҝDvt_g&1f93x8oū|`&pKQ\=նL;i !?x/|^~&:ByZvāJq}*W^{>/X!}W#)qm'*aK\i_%vtЈȋ8ta̯8ڤԵ MDbEﶞ.3@]ҩ\I *l%7!գKGC6AS 4\z$n,M/AZþ2wG<S) f y2yP}fC(ęg~FdUg`UO*gT<}>Fғ@f[S

o.P}b??06ŵ5N}(&ZWxr͋nz~R|w}r5[ 7<Oj0ؒy߹01I*טgo7E=:S)7hܔ..:>b?͹͇4ϙ;l/_i|`~1̦)nT&fӝq0*Z]#d F| M_2ZAʵ:;FS%7{\5tW/pP`mvDvĀCtw/1C-kw ^% z$/mho!)\рHSƸ2Bl~3+?=.! $[O"%KR6prĝsxRuշ?PW@.~K:<8жP VVz%o?cٟer8V[m{lUR!=ŧĈ;05Wi:[=..?\=cs6fZq5Jz/vYr-9.J1hmcE3ѳD,3#L6/ZGjSt!|ck $WpT+D\kWgx|.a| /2 6GSm!v۸>{P<1WLvů)ov3W| zF T Uӱ貙vCh);p ۺQPC]%7*ujv2E3 R`/>!\" ]Ƀ-aĠ H!-s/^ eGu"n2 uh:!٨r QÉoИY)oঝxY7^ WU3ci&~B>:D4;9'ktH SYrtЛ*3SHt%'E9ߤjrQڻ£GX`(sлfPYh YQ\_!`첵r@g0_HD]]=(y{9:"m3L/wK$#\"0XcsM:$gu0i{}FWy"|^ae9F}o6){fxorPvczV$: SvtM:"{7ȴ IDAT7[{^ 6-EgnQW^2 WW#Y7Y̫e| ?ڹSxJO>:j )3ܳRք.S52hyta üKX ax&=w(5rxnGE|wX][lz^s;FVPIfl=.^dk44'fF}e'NJw>&&zMuN_~9B-AFz.J#!E`XLf_ zJd]9sl"y"g>A%@vt"߬-bpK8c!Q=ʽJ?7c.NIБUr֝gac#C:g-Iט5 g,#Tfaq=X0S$P\" RV0|#^DK?C3d=>i5jk?wg?+YNrƿ<;1DIu7Y\A+fe'iބ}b߷W"UV[[6׍Uy:~^%;DTMww7 x|E+=ʊ &z{ 2B0+&G&.n[7 #>>=DGlغ 7mvY.2ɡjC(bk:e+b}AJ}ŋT7i^@pl`cTS~Oh|-u e^\'_K`^D*0LyÃg AOAS8WmJKPxN6 =_߃t硭mdLpRo~U42J4A"lv_?Y/^]x8<3kq8;q[VȖ !G>/ApL+\k&&h=߅'O%]3S~ m1ܥܘE؈p(=z-9b7Z5Q{ @-|YQxo-ɼanuT89W#|:<~Ώny n;4Mxzpv 'o$ cOS92p>8Oswl #ǨE:;?Fu'#/n8 =3+V4 i"bnٝ;_Bܝ=|Hˠa3(}L.?<ȁcX5Gʌtq%mE 1,m {GJ̱Cfnx&ǩ*(cqNbv.lީTs%ԉ8eܾD_ 6o,Y +R?G~cv^igr1?SLM~K;# l*Rw |9z"(gz 7ݼ_8>U律hI?; <~K>57R%^{oh_7U 5Rr'_?z]c줖jrfj]jv0f X{;:ݸK4{CVv*}l׳V,S(!SԉUfW.cZf®_hrt>B9-Pi/9ߠ?K-`"%zOztgXXn2jb-sʪ#ohUy촋YwK_%_!?O^=6sPmc͒XG&"C`jNoWv[\Du*rW8x؏Sv8mx&ez\w:;sY^bHکv7QTfbfJJL}t7%^=rXMl5;MQ*zto6 [ry}] 6[aWGTĺϳ,C^?MΜpT_~ߩ}a|.˨L is<}:Zu /˯f8-)GZ,IxU8\hɅr-_y? S-r-8<]-& A*uxwu̹zqiɺF 05pzar}^+8u>sn?]xk-ٵdm-^oZ3Z?F7>[5c}yXCxw@m7/񿇶~89_beu^킀t3 _{7I`?xݜoso)Pniע&5 !Kzr~` )6ʩ^F*ՍZϓ9stÔUNAv({]mL2%l#I=Kռw}NFr>Z xdz-Mh9#0ᵒUoS17<`}di %Y}| +Wz9_.R,D]˅hq<<)6Ƴ4&(utz}TV,(eʇ5aLOٱTS=BwI=͓u{XXLs5vQ"{^:ߩr*풕m[!%L+[ĕ$& 5;{h)A}rkN/VDQg-uqД l2eɂSotjx n*Ӭ;0͘=\ݾMXCNI{M&3FS', xx\ˈ6^W`% -xSE |J(BMH-1-,.<Vن*Ϩ>:lM ۀFY1*\ .9 ɈޤF^Ac6eNFIW93U֖7n4 ǎ٥QnQZ t 6v"H9‡OZZ\j^~!*xT& [{ܠoKB1d(~biV2eL oݠr+H ͣʩ~\25,fP nq0DJM֖cA:uuo0u.PiL^bл[a;c)ylIJJm['HC>::y|[.- >< r<-u+ 7AcyZuRoЬNWcK悘$qѾKd#NqgظJߢF̘;H^jrlŏ%n5f%>vE/gY͍ߦjđkڬ(,X 'yjX"^N,I*La7x "z6wXƋw l%$ '|>|4==+JL q0Gvdܤ|ݔEse%spIBތ3lc`k.m&L8:$~I1]^.38$41*6!m6)Zx>E(BLɌ(qOx꨷_Cd Ó9 ⋌L8VgZ8îe>U%Fk0Zr`a>&pqMr9QBw}\~d>W ~7Fkz0wBi CEIus'_R{8C_Ñ8K#yojk kmbU[7Da<7z(ubn8)G3/^1,U r3Aw.o s \~ec>nT#V.+=7{S3,.Q<ᶱ8NP~tw/rt⺇$4a:Zv`J[ E9Sܲ +g>wxAهj3悍 9k *qZ~u8h?{o/ R_K+-iqy Rn%,}&R5 .%ZSî\og?kpd6 |gZR&wq3뛰vf ]cA׾gab%Az|ַk.gP/]LIh]W~0szk3bMމax}~ :VT;p{+ 8 ;iQ`3åJ!w8A2P(WJ3n2Ը+''j\»ik%;3$eþIa> &U+ۼo\eVmGHegPULY7g$h+5=L:ˀeQvu^=5$د5)7DfE췗bY3>ﲵX>DoccĄig-uSD^^ uR-U}D:9ž(fV M}  LˬlԖ"|clkЙ8#Q斮A[7 ̍W/s'k2>EWohH97[ޡ{,> NOq]D4ѓ ~ˇvE&$ [1Ů mCXm<9P5GKA4*Ly&Dɾifa F; 1&n-ͣ>\v/C"VʋϠ62liV&"m=:ɀo*/0U̅ݙ&zwat9A(TH;4%^Ɇ-b'bNⲸ1:V {FƲS)"ܗQ6|R1a潄97:iv;ٱ %9̞.&E,TN.9iAg7M~`2/q+)+793AUDS:&}jT=nòuRATnqXZJic#pljX# q( Q;H 6cHۂvu M'8mJODqv7v$<u"vH5 "˨d'B hk'L[z42} U"&kdpFiWQ,,*U DjGЌdح؂%7xL=EP*i*:yy!XS-4u&kN̖BxY&-A3uAޫ` ` Y ,5dN4B> }O]SHD*$'AZP#XM1󡝯־|Xq]4~2G@h:,2fFd̵.ZE8( 3͢+UzG}WBoN,J@'h s$z4kZ })39:NP*KKfz !Bnָ](zOOQ68p>]3INmA% \ A!,{a%URQXo^yĂ6( 4T,ܭI|,rBBq!m8~n;"!DIm+uaSLg8'71 Ҏ1L1jfAri!a6!-NxH]D}N$ jĽա 8m۝y,e7**GEhݥ]KP ci=۔b &f^8BE["S)ڐM}yLOO2縅oٸB}X"RM:QH|VDAj 6c_eeĨ7@ݦ hWWh .B^;m u#78~̓ "?@ pV䝋<2#s~1x)p-dhv +?Z:́k%N2~4͸U:!9*suVߧ{#G5(xLYd -]=YDu@ت r_ t'C^oI!T+:*; _kaYd dP/C:dP`o[![1X>tU6K/{Wk2Exl^>([ /_\Ӄ~%gm=jd : kyO?J~ٖ$]R {qW7{q nVe>G[-~vïC{Vr>:.X/݀ˣ-?"<< 0Ւ/峰 6:[j/\ Vt.,m[pZbt9lQΌ?I/00, &=}4fX?"tFm08JbȱIjcm,\|C)ηXb&m~>9x eYPR8#cb}3m9-rzaГu1)Dx2#aUmqGԳ+<e} ֨ (v@j ]x=Oɑ6'9r6z-!2 g0*5}_ IDATIR#nwVg?CgUJ fwxL )d\E0wv ?[]&+!(|dz`F,P/-IU6dgD0b0P>F2+8*L}l^ L5e ɜ#GpAQx%iE1\؝H]#'q4n6 ~5o¦UlI[|NU Rxd5Xa@b"ADAs;5>0yv% MϘ鞲#XU57_G}_Sdž0߉Bh6Zvwz gd\'iǧH!:HpҖKJARaG㲝C4;OXoGoh˚9Y"eȔ {= ǂv*I1-"!d#VXûV* ( Ƹ{s GdILtlhc{N|hgO} G@,ճ%E@qmkvR8':~QYjioKhmb>a1Gü@}y:Eʩ-cҔ+[¥#]teo;_"u=h1\Y6Mij΃=Sv:Uߌ'b6NeDd)`wC!b{Cx1]=98{CY8 *^`: 3@9v@$C-f:-*Bؒh|[`3>J{-ֶXݭ ?<:[ ^3C-]KO>bv͖wXO5x<ܓx%㆖T<Ǐ×ɟ:~UOt᭛ i |Zrk-Iڀlj}FQ i[k|$\!xk-tOz:Opn:|y&QkuN=cˮ5,.n_0_aH1Q5Q)a wiODyL4 9].B*iɠ_q~N;++(2JNbmm(W|Y./ \(u21:O{#"}3&s˔7GNz-C2r݁PuH9J79Zsoc w8b_7ؘ[b:ڏ#s%R6f__1ݸO oorw0V %Nuvw^mcq++T0W5AIF'H׶}\6J,w41!~V`ia9_bXf4ڵ79[:lކ< Wv܌P:݂*X UE\) ҝ{A2_w OEe.`tKT羽H|\CC6?}$98PMZ}X&Ws:MO{A FYD |"vń MrrM4"SCPtI Pz;MȢP*6,a{nG׉Eok#Zˆ[4TȗSUPr,q`ӤjpwHd`\DYp`w2d4%VsY`J$9fR pmԙ_ߟBڐLPm2౳YqUec6Lx*Q,:eX#cz[Φvi]/?YW6=H427 SE3{E$+1qA 2a.#tClylZNYk0TXyP]xelؽ$Rg|WQKit:[c<5È:(UW,BaB2*cJfD$m 3HQsQDب ä:aqI[Q-u 9h%<6uYM5ɥf-]`Ec\dِJ*AÒh)!TTy ?Q4T "̓4i#*'6:TJ;Faߞđ-S\yBF &SXL`s'&(EO~\@ `pa]E^*tvUV!]eA-ORh>7d4J8%҅m9^ڱ Xw^1xffXCsNH͒ݚh~^T:3bq Ǧ)-,6Q@?{0U`]fakĪՉ'BY(z(if8pG6$=G9O=)Q=bx`S"JStScyLp]'Evo 5$$޽ ͛M:ivcцFM)xêJ!FP9PDm smK7Dԝ쭽MmE0ҼNG MNEǒRRfc&m 6E֤~7ۨNvԎ3Prs6+'K . ד_,28@6/NʰTU(slf<%YJ^k[urصA%l˖5H49Otf35s&DP~>n7 _xzNk&1ѷM _5'M;fs E \IggmY#L:,^M!N\o YnvEc $gܷ_cκC59mYfvn-œ`[dMVaolh)Cְh>m_}E~Ev#qeR ~ڄJYB:~YEravaF0h) k9zPVXHυDwv7y`p?B냍ײ 8plȑSe ֡2! CFB6YaM0l+h &KC|x x/}+b`Y=Gaf{\NZ?4X!QlKm/p4C:ph<<<߾;?#x ɺ h$- @{O7_&<>ʴ7ԽI}7گRfx/}pec[sl}A &ӻK%z0k$!;3ea34#gu~eW?kt<4%%ȪWňlOyPqG繲6Nq6I lܾ.0SkgY?A$gɹupfIRbZgGF_UUvP_Ϳ<~6n& KwXWQF:N-E~aGI8]s|79GٜJKb'\3m8 lU&!gy>Co ZC;)9mvT>f-EB SWK{d£?~篾yphX"Sc5!j@f/ŅU|@%>()Sl ] .̗ WZBZPq}t+"a%$ikd|+ d4tvL2@3dpnש@1HEQlԗ*Gld:%DUQ@[Fb—0q8%2 EӣX7^XO[˵=U혤2m Ff&vM:hj[TJ+[u0|,@kC82qEe)Q=Pdsv@Tɒ5+txm⒎ɵ.{nZ,ń3o߻}__E oiCstDFEv^ v|6Hj|ȁVlXXo=p[Rp(,lWJ yIw-P3w3B it`i7nb\U AmփY  EH%:IHg0FQ6JDwZ=MG6frt06o:\;U&bbn QF6LT[FHG1ԝ&rw/i{kǫRQ)*e4Fm0eluWET9 6K"oDrbňjC/uTt5 Z.Z]ݐGsl<EHW32\]_^0h >: 3?݈²Wf!nbVN5u~ S>m7'A0`=.̇&0O<`ÑC8Ē5Ae󿼈~/be{KT]%{Z4Gn'Za̫q~7}7y.oey0!ˉN>=| q<c/<w0^y䌑玨|0{2&/U}Z _y̰ř6QOㄎ&Ȑs]n¼sg=|#xZe!'[KSeϞ b3znX70,37q۩4 "uYC̖(ƶ3 EM'2qnYn*uԛ$jr̀Q1Prj(Lv@11ZY$PQhsfxi=ӿl'fƯ)t:)L2\ huXڡנ(I&T25 $t*bA-ٹnIct.e#&׈T.$ջDDGE{-5>U7la:;$̘CTex_a+w6/-FVh(IdKCdF8 20Ӄvz + ZQ,kyLjYƖWJM̢댠L6OQq UJTHk,ӲAo+ 2iĮ4O*TJ;.%,d(VEuSYN(qFqoZKޕ!&)n0V/حv Pey.buɼe0\)R8>3ddcm7ue PH=R?$bQAbHXΧ);L2/V(pf=muG"T١FYmax? 櫭$RWba`?S᱃|#K +fa6#+U!-.i\N 4VZ"j7a}hE\R /Yu4 麟vqTqDlÑrTw^IOlN6|P=9Ɛ*DJ#EgN763lbLJ f4[Jv}}"´ۘ'1֋8 r7{1` Vs1D_qGY!ѪYUaaQC\'#[Rj8u\/brN/d%aۋ%?%TAMȸ8oW59şgTrְTFZNJ<łr ID1q(e Ŕ&𧫔{Eꪓ~sayNUٯfeN .֬,s~g'"ck:(YH \fjUvs/,-ewj7 StTEnUϢ$o#NO:ű,{l4,OYȵ/p3W΋CZ;X;S8ӱfvl˝n{\`?!o E分 Y:KnS IDAT~kXa6 QkFs ]*6JY"_ .'k9v:Mu'FIr(y̎:V,y N r:ðu GD H~{.?6A6tYӐ[obr= ل  utB" fē Ӫ\JlG2yX߀i=6AN0vD4vny؉{o0 5 leV%0&rcAȚ XOoޜ=?Z i; 7+K.?LAHAX@" ֔D7qCJ[pi./tE D73PP 0eDv,,z&A6׏us-2{:״$mVVN)[{ KiƬXUB,Cv#Y n +dXaڞ7w>qi1+E:0fqWgzB;|˃Zvh .:՞g=LGOc'Se,-3(֥26H)"D]ʭ;Lz;>UFǁ(f9˷J-gu?GPʊK6èaAHk(qtk2+es7 *JeR@fD;CϷvW5j94֩,۰1\n>\p+i*ylv$~)nCTHC+LlHVJb+/aTig 1/0-[ !>YnRCrLF~>xݞx;nZ02Sc?G/}|/{7O(\:ryXpbQ\XU* "Ց]EZ5E]1ZP{+e:U-rGŸ`4 pmXZ$QZ q;+ry";UOs\DM'SuK&Lv4!cFEc+t59"M.TLka_'u#LdrZ"e=AKrގQEZ32T,5/]n3*#5r6n͐mh׀;d*RpB&~`ZW)SжbTi"0kHL55ZjEk_FOqحQs(u %Fy:;>^EӢ-P]7 &UM^(9ErydM9+.C"X.򺆄NRX⭵anSQV5VF.0h,y<=%!MLhǡ]. ڋ!Sl翃xz3˹48 & uQɌ֧ÝQXtdISvh%~|t KeNZwfC3sgmM:ɕ$=DSKm#]rOSI Aw?Հ(30bh@F6 2;aDwHYCS0pKbK痢Xb`#^#TpIezMP[@:Q\EV#K#8;4Gp \#` a= 9p~ hC01CCP`ՆWa$+d2ha}Fn ._i߰D vt0*O~Ex%8;A?wB\CscVW/5fy F:![KQ85$mN 4Xj>XڂL7L]`ZTؓ~9їnU`|]:wc/l.LA3ntᷧx<;*|ФV3憹0r)Þ>U $/0>t&8[axq <{rk njh=9a׎V%5$<[)Zԭp% ~~ 5:/qs\M4UTIcasII)jz!*kNJ L@VrE3R]ĪW< PPJaŭ4xL&)h6,~FrԽm%r2Yl2?dRS6_`(rO׿֋]QqJHѝ.WES8ͤMKhv@)^b kdd]i ȋ,y!Vvb%l6On[jPkY hpciSa9?!saɮJ[ 6dgt} &9a& B!KԽ;/(+)OUF %b5 rR%̱g;exO )lo$byezHdε5jA/lfǏEtQ./?Ch;+ױ* ZZDB%";8j g P6kh:QlYE6fIs(=A=&qFKU;|?Ev`%y! ,`Ƽji+GaeH#({4] @)I v{;\84dv@C0L|aV6\;{a8lGb fxb F`iԯ>:Ǡ   hk z!> ߾>+`Sg0L-6γV1l1yhmd!-9[uhvÑai-pp|*}@3\ۀD`O,aXe@RDC~ V16tUC0p_67נANVDV ~PAY7Կ W݂ig.ѳna@K5~`a rFgS=,:w&|8pN\۸MD(3ٸ;̣0|ϗ*>a ?еp?G)Ν2/q+l[Q xesT_ 5;A0Q?ϴs7s<>{е cvD+/p3ܴzgFjZ^ty)}xήIpz6m[7ǚ؜gj<{\q7I͸JۤB]t70#+Oo+c#-2[Lz/bz$'ޤF=Lm:x-W"vKnS3ۛk+[AhLGsLDWd~M'jQ:.V1Z*fq0n^楕&I$#THsKX)]Wjѣ䛲5UdgZf3H RYdۅN/A?㔋 UĢIA:4*j QrݪHiV u "F5&s~S )m(k譨M9=)3Y:\4&6a{SOhSgpU  JQ@qIh52 F:[ZP3aB AX(T >#xR\D/(ZE<X〤s10G:w剛q3I[d;sHpNh a :eΩe҃mK GDE>7:m2d NZr$7i̼1'^^>4y;¬K-r3Bchv.uilQ\:X٦;lf hg{܁8g~=?JD!eU:v"ģ,ZQƘ(T#u¶.{ )½3\LC;Xc$$w0=Zb!ƅeCeѬ܌]r< 0ɽ͈$%kgx[zs%K'"کi,ϸHrKpƞyv#Bdfl~d UUe& LNM?Opq1\N'_ɧ~^} Ga4X\Zۏ?Fc*h>^,3b/=ETz-~ep|>ϕ@2|FwS'onJ&lĿ@#I˔sfU%Yo)uI&|N #'s(obW[HЬ3kQi@&Pt`kP2HvRIMf']FQYQn MNN]i_AK#/ c:A횃jQskX\S,)TW@aB$]Y))K[>O^(ze6҄)5mJS*3\ddGPiwVQ=64:Cqf vRƂ,1vXpEꨞ %);L.2!/ J֌Kn:BGXޅ=tOnbj5Qjъ7`]V!Ie0TPsa/X3/\"QW1M%TKoΆM[ЁAALZ7%] j,8 ql% 9CKKњe2Ix+zrN nຜMGj8Z_yz%@;U u%c$NQ 6dycFXVƐ.po_&DʘFF=Rξl1-;RDpj W$_ԉ [sNSz3o;qm+`kxfPd92^zn# =u&Qu+%ԣn$}c.N-c@5hd +Up 64wz> UkG|ڃkhC}m! 9߂O>8'|nlV}|`6onN6XހC^"`B,I@3 W\WB+}Ɗ].+>lmw c]z 83L:.a>'PCn|/x#ÁNp4/D-y#{\N,GD7ROؗ?LSqx?ƶV[bċ?v2q郏>z Ϩ<(",iq9~QJUn76CzCgZ:8RIM!N?Oo.}H0EI,M,jd= ] V\f|+hT a,f^Һ5g)V5|CW.q?ٓGT+<t7s +j )VWPIՑUuh-6 -ɕD$ -[*E^(4&Z&e#mx.zO=lVE-B^ĿKAg"dA5ТAQI . yZ ձ1`k+F`ɪR)P)j9{CjV!vt&(LŘ:hySfBٵL_)hK;%."9PUjF$SlR]^Q;PF3{dX=6HIo@L:+5n2؂^ʚ-H{,,.W?p=x}=-Sddm-aS/(߿owywY] r܌[QxH#Zwޒe*2)+u,m~ uHrhSF:F޵ZRfrY/f/΂eQSOǬBa%)x2$71(yLU IƴA޺ΤN!5GkBz :\ºEx+mm+e )} ɣx)x$նgr,\NX)Õ]!%GH؆(qZ. k5RB簙HL\mgOV-f\3Q̰+*tpѽIq1J5G>k EOYګ%t.U+YL8rҡK:jsi[MRtoʫ! -Y4f B9|A2XJ-iZNu}ԕy2-Œ"d%PJH*,) )iySIrfD^bv٨W0،wHtPTpe@'[z'.Q4p(MZTs MJR34q ǬkbugjE0 U&MRSĊ15HuER6:R .@oGN=9Z8Lv +cDF,;Xʳ2W[9v}?^a k&vKJAjZL5 bňS7ѕE+ 5 "Fx{p(:u@ 4TG!/67 w}yk[a5Ə,C\4 BkQN|. ӍX݃ W84m{`6S%80 =0 hrt 0{] /ý74~2֐: _y ~ d ,±]97}BhU5XT=0kitcge73j;can!Ϗ4d?x |nF-up!puܖF|N;s ,ʘ;ٶ#1>ͥ"V^Y lP Ggo7,DnRd.Uu-UjuMr]%AHHD$nQhڗC ֲ\>j4rցQǔUYLY :"T''f!Q,R oH^Z<9L! f c *T5U)1U؛X4l$u!-Icݢ[̆d! ^ fJE \&RY܂K nH2AWIh:i54PH.P,2*1Le"ֲDlƒY'm_2 Q:9m@P`Wf- TJȺoM9?.Qx,4 k&U$J8>&YFNb0<ݤYLYƱ]||^+gLm?' *=]ζb[ͳߐ8PfeُhDi+qmk-ttԵ.UZ 1)fxԌ9eq0uNvhf,zu#x!$ծp خuhkxPm20jJ: 6̊}NF^*ђ-֏TDЅρ3Mf4;FK,:9eo{ ]1q:Ps7E>Kq!ļF`Wכ:`hbiկe>eD 1eb]-FĶ ?.-ǺRG]fhn5`IPnBՊi0^S)NBqC&׸:ģBwnp_дuG9`n(d)cpw6 yi}^|&rw?:ATdŰa|Ui/ʽ=޶Bez9B!dŔ ^zz̶ &Kz^$R>[Ķ3E_>BNgG8֎Z",E5a.8z=NYmb2;qͽȵWC#r&ڇmAl _'eCoQ'Jq'-L)qKWtch˹h%?pNȦ 3m tBdn:^W.lj65\3k sK= _+B(`'> Q9Ֆx<5 V+\<o{`,!h) i&a_ l|5 x~{'>onhEAnܨv5 7a==-Z ϼo al l)v[p׮!^l0Ń8:ӍHs4]+˜0ynrS_bW?FXX߅v4Zvvsq i)I;8ֵZ;:ۍu֖E NJOh--삛"^mcWX*):ZȊU{JF)7i5p' Z#XX'թbdH(Ζ233gk Fu& <|Bg&4)Oe&\p:qj;TyJy -yvVtԯguGiQ. R/zHwTݎjsZ}+!q.J6rvpYsTl7N1nC٨u+WCO"2zZipIv3)uח\If)mAu[%.`ߋM#1l̥)-03 ɹlOu2LpxS3^vOQk-{̍Z=DClcT㟐&8w⪬<ׄ Ҝx)Ls;{xVD3w8.y |I]cnhcl4dG_㮶z^<bl)Ꮆص} %^fӳa<2_- @Pd8̱B@]Pt?oH(|!5s%X6Z9 "`7w^z6`u}-e+[s@˗Rl=[,hs@)9|vm'oakOB2 矃|_hȲ{Z"6k5hiCa[{Zlrn?1/ ,!]# cv87'ar<ms27ѹ |i8[_×?3>o{v AVѶ* 7Ï΀44)x` OAg~ώX^y!<B@qiˇ/!^ 9}7)Wq0koFΩ5L;ڲ̔ \!_ql\VXq^SuR( _F%e5 2~1W kIJ?l`p=-r6ډT3*MdlKM*^N(KWD Kـ50Ih55zħBC6IzVxJtV f3mu@9kYYAUP~ʄΎE3d7.)$-NK2)@YJW,nZ+MoZD(ߜI{K|ER!˓76Rx]e6#ƕ+ZZ?kbħ>۳n;ʱG7kFyDwYDHN :bOA`,\V/s1ŽϴnfYs:'ޭAXiXedțXt&p.`MLtLMYcBQ8hRIJ+ nԜ$Jbj+!Rev:uR9[#ɀܲbnl #UR)OFPyuhbgJt[^!jɊTȃW/[ZU{'a`UvM2bDwn>,+NJ P`]I"1̦Pz(h1`2IXpQmTXC0X_DWN *Q - ץ6r24},G\SH[Mw6 {0p S W IDATz֐m4IW1<(%^JyTi U|Q]uhv۴uZYOGK.ekEL,G2է9ps}z )+rc' 5.$׹r ّc_hF_ZŠ:[o@oC]=A[5VjA>0Se 9tQ59;J ,-p%5ELc,DKFRn!rQL/+7 &- Enx ;#eMA)'] 5c=3߀w} ν|ñZr nm7+i8'mg6L5F}-0`+2\w7{ } "(̄a5ِ+oș?xJO-6 :MdL6/[C@7y}~<}^n0{f"pEhAݞƱ׋6^  ak|ϔfgv6zC;rZj5;A0Bu58Qjr( .S9m=$Mʟk8S^, oA:luDw`]'f~'V܇ÿZ$waCfc/ r㓤 g/7Fqj$i_niRC5q1RJ~;6gek7+L*ɞ|n#kaӅY=r#vVrI 5CX )đUkm5|ew9t݄3$ ܠS 3MVwL`qWR޶`sb 715 =^b;Ҳ`h;5,'{p>zrdD%K8zɼdYuԋ9#0='r,jӋ|yuJޔ!gpQP3R2i]L.z-"E11-+ۂdBXBD֒mn`)jUTZ6VP5"j9CQk'Iq0'R+in &keFXp:S[6c1$ʪKf؆x͊ `T1@v$D-vRŭth0ʃ=aP$#Vr f'iER0k $ e;JڨnbԵ"e)L[&LNۉ^b[T%љGρz ,Zl,|*ZВמ+rnԯPkjO' k9ʛ/άaG'+5< /7zK>H-U+SQnY"hbnK.DFL NBr\v3Fk!~Y $n^#;ҒZvmBHaBo Li䤍q.ҭ^N'F,&!lNj,XBՀ 2gPe*g6ifәՊyiT.m{Lrq>(takaiߩ,5C\[FG'!-0%(/:]U[e:!05>^ (|nqWWʜhK˃>V}?2_Usܺ|HD(ڸ|r0Ue,0fcEjX[{Qz+u|_={ }nv\+W2ώnׅT=B}}*י5\ĈT?f%#Ĭy4l$E:q%}#5i 5l[JR`! Mhvv۶s9^dxRHm-k %~;B堋!s2)IcQPj>U!Q֚PbiCOsxU7txvI xU_ok\[qТO2{](Z6aU-T11!nUj52e_ SDxK%_)#c u?2rzF(8FSj@ĭGTL4&!"{hh34i^}HsPcɀhCZvoYfMX<5 )\-B) S(Jh鈭9t4!5 Xs݈yvI90+i2g=j'fk=SuBy?Mk:h5D/-r㐙9uhVl&>ZdNޚoA`E^껑nK2PJш]auuCy jE:z)dDPe]ҵ@5ʀi9?9݃ȥދl"pz7޷r{z77^-~xgIӸ_7_XY]EQx9{Ǚٸ5vh Ɉ&J|ֿ2i -urRV`gegзO)̘`3*ĹwU`e7 Su|*%7^ڏmDf\F1U߯wjwdAd*!Udt5^g:05y\6 ~ZSU2ֳ#^M˗J_^ 6;#L5aGi{wߣC _I#OUpdJ5>i,wA@%)i?@jh4qn<Vģע&ϵ3w 4diڒ MzA(%ݬr]&so ̸tfԭe~+RXIt[%Rw`1Lۖ , U;4;!jkylB:J-<"hL0OKSV7LNނ?ѱNMaj/稴E_[f^{nʪI&U"c|a o|CWlXڳ#Y[#(aױZc{ûѾdŐޏW dvvSn3/|y)fF8<Z.4UT<2JQ/ aIKd=#3_9`f89 sK+miWkz-{}%ٲ,YDK)Q3L9a0h4sP\[-/}iƿoUy}aөu{g1w|J9'l<C委6Ma_֩9֞RxpL%Ws-",.׏vY;h5PQ%}Y`5*'/Bť @-Z kǻ&Zf%sXzFCs0p^[* צ"$ 3y.ȘRǏc^o \$(8LS 8H*6SCvǍHO`ߡm8.{x9<\2[h #)9i^5t<Ռs'H;تY/lvO?tt;w5p_nU^F[7U7Q}}]6RWt o6F8޲%|ѵ\K7\- *yog/;}8Os/ܠ(sT2 ]\LEn® "' ԼX!1d]Yd8@)˲P"I퐐X1it Iiuk~%ڪM<#`jV J({UBt GΈ=@5PCZ#-.E1['XE 錟F]fDVEUH4gIQ5xٹI{:zT쬄 mrXP\YCZ#jaod*@ j 9њI%el@R]BYѡT s[XTki$<~Y>|H$Ck1LI)V`=5X]Qa2d#:*i|j XU{]bf~B%p(LA !MAUJͭ 3̘\Ȧ^U6 Mpu;&eY}HxoAU5W&X@'68(ceA`,btU}}@%#mDG`ea2S5!㜛>T; uTBl<4+y JGf*ɜ)NoAsX{d$Z"]ZM,UE͸juDcp'gsrha٣HG>1ʵ^d09j$<]Oe3n8;s1R}?Q⭗|lD\{G^ZtkB,{0df4XQ ] 8b)Gwbl6:6,NGs S*[&44b) ffɛ!QE (d?y YCNZ;AvB-RZh.&QS%K"%Jf,Tf-W21 ,[)<8b|z%^`5=w:5y*=UE5qC(VfQhz/ |r'-uBz4JFYNRyԽ!%9Ơ&߭# i::.T&`jM_4b|Mg/"Y]oWTcӟ⍣Ax 4A rCK셟T%Ȧıľ&}!ZH[>zZ }[ݢu &RmRkU],g%ihs 3S}n섇7^m9 Aї)< > 65D:wή$xmVvѝJ.TId$0*S\ehg/>OET?PwS iwo6K; I/3,aI4.!n╜NY3ǺnVdfJJK0Jr};-,$R@*cS7bRWsO~W.Jj?͑隇z=~t&:[iv_WȴP -0+SDf"%-2tc3 47r\hd"H}rRZ;PK}y'R/F0"pv=޼Ε[,&i)FfT1%@N %Sj9mu_L!i+{ ף\f|B`!qu>DoK /A-+ pʠAVm֘Hurbwp.:hIzz~9B ͠Em֛h/W)]`V64ɕf%,P+_b2yg⼐"97\L^S46gO|n|Eb W, ou`_PBJm\|M*NpG?'9*1-Lk<֣Zjmk;UsL'K2J]^emX*e:aq`Q]g^n4יA3F.;݁uM0Kp.'H@Swo #VNkR􄙽8s*&n%\"x 6vX6'i$kz霍P?$0Ku,m/ᅫ/R'~$Ow?1!o۪*mo>[c]$7Uuo97& }[Ω7P+8%_c0c-+]A$%F֤d*.w a" /ŝ^`*1M;/DQv7(,C4?I'n@g{oDhl8x=~M7?eנkWuq*~;"xHO=r M:FFU*yvPGtyՄ|e%&3w# 0Jlh:^3 W`"egH?ce@MGԧRf8JȖшKp$ ޹CƑ:|4+5wl;e$Ѹ!`zeTuR=SUN)M}b%k 9_'9q! }xM)QHxN+M^%8E/A'߂OU^'*|Ixc<%g(H4y)t'\!mddQ$:yyKD^EqKkv'e*$K 0 V8nkV_ϰaij24rCń"(1@&1dtkZL0i:O$}!5G U6YKeyޚflw9 ~&*4T-K=\Aa#av(Mh u8f99y*wm3O]ױ.xLlCAW" CɝJs␌Uy Fj 'hU : 2Wf5;1vgh0dA[A&FLQ gCl1RMʾ3]y:}jJm9*∅i0>N1peͰtEJLԈEӔ[MVD`a8Vk@{Z}\ ~*g9Rvd@Ybga-EZ˨^m$iv2*|r&62޶mLޑQ4!5.Ԛ<;W1J[b]3 aȏ%KH] wX7#[&%&!o4= 49w[\K;2*ﳐ!_o`پ ˇ6PoxQYVt{F/ßFիgJDXCYgb L ( 4.ܥ#hYhM%v;0D[J4N/s)a%lut2›\ iĨ6oFr$ EncV~Ȧ*6% GX[^p6.2=e:Dq9 vCwlomm3ꇑ.Q,mh^Y֓0玃Z ,68h#/;`H `}v=EP_2AB/B?=+*<â"'=b{ ]`6ȕaf ܺSR!>  6#_R_X"C @&DZswF83'Ҿ<pfvt1!߶MUg.CVbE_6ФOHޜ*=_$|.ė +:P+:27A#ex ܱNB6PBu5mZZ`Ă_X![ae~/s}pckM me*^K01R{sY\zI]RiSJ?kR3g 2kӭr |J*Q7qUjPN.K1߲'E%AkU6jZ"es?-%YyjcD,=IGҀum/I&N0;AMS]8,wL#.c:qXNT84VrJ@e]P0P+8嘒<9)oI{dHUGwDbT[mHe 9"OuL=I3lU'V)iQ D mGuJEΤvBI`=TGmթ14 L&Y"ɠMSIh Ϩ$RP6ZeĢzR ";0"O{ӄzk`l &n3ށ"/\ʑմ]BJVB.ܑușFTd^-nzW\Mo^[҂D[V\yVKOV8:2$zdm :I)cB.PgP4JjebVWM\Jv-1wSzh"G6芚.yRT)4+9r99n-%x;c; l c1h9ZqJ׉P5#ia}FƧ&P3؎\A<>:EjU v);*BpoU q)WU$o+p-4geÚPQWr9AyHh ʵl/f(H˨ :O{8\k1f(P!ssbkjr3X㕘7l2md/Jl3XY ̫}Dو˳t0!ZU q+[Qڜ*Bzu\ҰluWH%CȽIz{1Ҵix,DU`Ҷ/dh&>Ʋ]A}mi[c1=fLfxETcbZK\~“Z#$L$n"<_o؈2;]kj_QdSlҠ46ѐ)QE5S~R,u1x'<2l-' t5vy1ѷk*XACde;vN8>%,ϯ"~H7Cڝb{GD}pwVx4,Ή`7m+sKbo> $~w,VQ(,"=ݤFl7  ta.q]xe NAxnZm\۷LT׷o"샋vPHV)D7^_p-+px 1B7w]xm̅nvTt>GBc7H moLCXE=f.49q>.{px'z%v 5r iY}BK}{9LԄX\ ^v?:F:>-W8v߳9T95M>~&VrN ,S.oglRdc7%8α]^vX÷uUfW^E2ɤYζQy5MoևDƷ9~n*/n#1>r<&;=m~E%mj^)=gu KD42Ȓ(?avWp ~VVA]g92Q'ػCDtIm!^R)'4Q򇱵FxGΜkd& |\%VL0Vte{$8K9P\m"ZER_z e"Ic@Q G8hkVnaT% HOP0[0DrJ XU$Ea`K/H4EP E 13K)vh a\Fc[--'8Ti!,R4P `5}v155PC!OY 5J-ERY)sox; vK6S x3[_ɇDχ\kb8+9r9JԲW;1VGF4X”Hq E$!Im#T2Q\VN/ľ}Nnako#.6=n=2~qe/P?z{vFx=I$2B\rJbAA΢P.#PKi]ZNsˌh.T] R9^ɕ:}L˚%OKjQI~*K,!>"UFE,hs06gyr+ lIsw*٠%<:%"#)18h-]% );8$x$k\+,ҺloQr{Y/FYX},JBdD.q39ƴ*?3]6ޢ f->iUyV_0ʁA`l#+O1eyGBe9 Wô˵TEwZ6q0fb~w¹[x ϮQ FxPf::C&Ypw\c#U;iҸ:;9mG:B"E* U̫l,M4؜%vB EFHCefKsIm-Ԋr$FH IDATV$%WvsHJ:*e/B AfQ (v:1~8ߜ'lM /Hm !6MyJK5kMȎKXv$]g{؛%<⡭AiNa J;2#Fd W/D=A(\gƽoAj/lꀿ1\Z/ >/=sI{7՛YWDVMV?1h넶8x< ǎ]Ңhdu@'E !Ag/}v{UQdNR( ! ELkvAG[A$ +"X׾U)9EgIxtHKW)`1Sk"p~ebr8wSp6[r`WQXb:z6zn/p0ISrycÊ8>ȹ3:z4\[efF'&?5;i5=qkSJ%U(AQ&! j hβ#uQKVH,$@]Tc_ϑUI7hen*LRHQhJEɛHf|jBC# 8Xnt25aʪb!'KQDYI?`{?g_ڋ,Z"Q}*2F3ieUҺ"標DJZ%QϣS(Rf[9VկPC^BŌJSDVU*Tu+)}LɨB.m`icmTY;d剗s ̙"RAh.*uU &"GCFR-@\`#)ШhP()!4ޑRTȰbJ*eT~*. E^GY)G%`A)JIQW!-[2ԛl*+ϐ$-Y/mCMe#G٬1OSl=)J*N=(;I]w+XhS4Sj遟0j9תtnQޟ(!5%l*nmz*\#Ӽgʶ"ߺ kWCp4!OmWP긲K/>HΕAz/=yZ|3Gqz~CQc5jV0rx0hslY?xCd;ٷE'& }eA1[吙SL]I^ZH|5vz?/kɆXcQܝU3.A܎[PåbŜeJ2]/2?t6˽R 2{w־+vpI[ev;θnL'=/Yq3۝8ؒ%KKHR$vPWf93|sN{֭SyٕtJ壭uu4SUL4fZEBA^֡WHv $@TlNq;KOPNHu Bm]Izž2흜ZTqv=.h3΢ʊ{y]pY} Ao'gQ~{n. 9SE^̓9xSOrlW0(;gU|(0/I3-ZD4RڴBqaT- kvz zNǚ\ ~Sw)%W$^okFhpxGohej;.Zk9e f-pWKo>Պv搫Ufailm աs *%FKAvs+-s5m1t&8^/|iȗa-pkNbK7bc< ,íY89H^n\Cw p.-`W*ᣭң-\@뷎<|i`tJA9l1`2܊x,ꀭޖdAk:ᇅU[2K-g`nÐCqfoR?֯ ,߷3*/fbtt=+Cj |eփ!Hܙ"_$41R#gX]k 6xLlRPRFT 2>WLӭPNz@Cu?^Hc!7ӻLsf Y!>!: CpƒŜ8\zA˒fRU0U gKnW'd2 v;RfV7y>2:sN=72pd)bB<'OB|r"FvNn3=>*1Q:k-f!KO7}lkԃ׉ȳ٭o'f*xڤH_o=U 0Mj-*2tt" @^GSaUɘ0U!זE)9ViHJR1lHM eN'W" I UDdtkj4 5zHRr-I$+z:%*3("v2׬^.=r64L`[8JYmPÐ (T J" H4c5g>WQnѨR$%tU9,y0ֹX-#l56 jʄ5a ^R]SQKH4"fvΌTd1 lJ52ԍbI]aǝS0d1(QX0[PS|^*SQM*z"KY*"UmT@ClGUST (v(檀L]DYOAYb4|#}u @LQ[3"^཰;-/`[U"sNCPsW %ڝdity5D0;uRf_J=2b6x g[, >QPw&:(u5]@0Sd<%q`͖evM]΅3&=,4r&e=2| =͐:Ds<6\fKQi^.P dsF~cIbe,D,95vDuLUGY*JW( 2MI} ;Y(f.\$l^ RwH;0,O0f ͦQ# -Ur= /Y2s6 J(m(6خc7%hN$Q5,Z,%eG4'/QZxWCĮ͡>>lG)+M2qnuaQ6Щl^"C%S]rPr3nn~=\0?|;Z d;㵠'&NR_= ]%vzҫ=k1_iLd]>lDk" PiûVpX#hE!c@" YnEAMqE [7HUd'_7 dg:c;6X},w7]ƍ(PaǢJ vr!5?C-O&qxQ̅Mj~5~*9ْS0v  >u -uaX c(oɠ81XZ|\m}p#á+0w4>(ﴜ=8#A>|v[Ŏ˭~\\sc%]0:g*p-vS.Ef!| ^; B(#- }x>T`9brZLsO'[:3gAa`J@>O@oaI㲎NFYXp0c7- 1>ϒgF3tuOoG{뇙aK5~Ꝡ/[:"܍3 du2[%xӇ*ڣF&m0'e +o!_"vk :1)p}5Dr@ʾ[uv⹩kjâ2EO'"&='f\5 .6 %MYWޢ1~z0CܳBύq;)>kTϭ^#_zf-Z j#]FH l Lj!XYCCmDbhMu>̉7h1À2ѣHA]'#"D2:ETLQQ/%4 Jn4{iX60fǵwvoW^ɰIlp) _(t3kCr xjMU T9JNm7!QSDU2CyCB-sPH CPΤ0'TIbkKDE PK˒^ĜxDZ!S-Q,O"hV(z:zQbCSBZZ2rAODR,л4ERNM^QQZ% (Bz9͢@7RIĨHA`9gÔ`aS-_t1z DC w,/`L7E2{b4~{EtbmGC0(" Ot%kMyhuHH+|J~=TZ8=϶֭ۑ*4fi)'],#ֳbUR N 4eE~9ȮA>DZ9ؽS^!P$V9:$W|vO_0Mhb\|@WPD40yu=FəJMZ'QUSCJ Ǚm/н}/m2f;"M;Xb$ildX2B]fgȼz{\Hj <},DŽǯ. mw }/2CKDs*p)!tYcq>*s9 Sc(7SQ>U;wUB[h3z-h.$Qh.Xx`McH}E<>EC\Q_J5| /὿#<{{a#S光Kx>?X_MRcgy0.IzpuM=>)( YZ FmZ-Bً-V; R<'ԧB ]}4j MNOwmNϼ(b١.`ﰍY9JfPAAV#Wfy[q xg'3 P' Jk0C(M|Ȱ7Y&F_bLP(ui渽zC{*=E)3G  qLX, -p`02F7yI=*%/;OC+Nj߆[y?Gt 2`! "=jQkܠvC(95hC,d pެ? #WTQp:gv Χabey^]g=N9 1ة`[a/$Wy9<iƾ]s˛ Nd%(3Ly+',}1\Tf7a!D jN6 "R2xˑ $!B깇 A3Dnwl"3۰&0G}@D[ϓj"zfjg}]ΥRAr քO(Hq lc"*"qRo`J,+Ky&e)WC(7R,BQɋ%4Jjj :1A6#hS)h5#zoQAM/RTX"&H&R*T\uUJQCNUƨ#6P-h4Ir@^%bJ =Jid.S,>ܢՈQjx A.Wlr8UTD%0414hJvV(TJz5M\59R\KXa_fMZP4M*e}ʲD#AyA(#z XǠ7FTS2x=YD*"Tc*_NswO% tmsO[vkGa(!UJM$8k:0WP%A!Pf Cww ʆ]Xǽ3%linev?͝ď̽KE(nI7s-{&MWt-E '7qlboX9exhh6UěXxD2"jO(F+VK,P9p0Fߍ]Ek&]Di* ۈ `]䓙 [}6 5g燷0̤H$R@MABTh:LnBq2ȣ1n1(QMNJˊΰWL\rʂ.\0vMm{kWD|:L]7;XTGEvlvqfjACŨ-e~Q_uTy ؛rGf-^0$1 Bv [4 U{ҙAH,y.{9a[FcoO9MAȵrGM5W _@X )oى"LV)LmtX( \>Ҏ.QwnNmӓTyND#$jMA#^_^HzܬXqq"*C/%'=oPsJsrb,W!o$Vp~\9T:.js_OнL՝`EF [CiFsb/ǩs ԛF}G"X~qDp~SlN9_B(Yy?FBQX,#{h '/#DAɴ~g$[V|';I,g j\~;~}G}NBU)߁5zՀG-u&, 4rdYGDnY̟܄jӆ4w_4:cAw3p`W9i'w,x$'ݯr)+'|* E^vj.l$+ry]/y|tz~&W7J͐ @eD,D{3ʏuȄ?Z (#K3Qqn0#{x1!f(i{Q6z#OF_څ K3 BɂksS;7%ӟdM2|/[?40[3'Fj`7#2rQ~;KTFoUZt]Dă^eF75M"Z )JG$Mb N~MSF%ֱKN%: z$(&Y"!DBZ=V}Ȓ ̳b}ʂVK=+YDmbvWc.7Phz$RM,;GcHGr.gu)#C.S.Qk) j*5x\O V#X7YD[*d: u#l& JZYKNWkJU$A$W!IтNӨe5FɫǺg&ZRD.(+435+QB-+GjRTdč *ըfOqZD1!ɑד6"8k|\{`IRM[$ӘtNmaƢŌ͒fQuihN3*#'qN(-L5t$+h+F>*ŢC-x6CYt,:x5 )t*ĕy3ǽGb4&y$1LLgI^MיvX}nt0nbƯ~}-ryn/^@óNyXng1|\I;D:ifʞL &L%`{Z˒nV*vf>v~`e~UZ$K{Yvɔ@47J0' h{|w0Bq#'Y!2( 01GNs@j%n-6gco"mv}C;Oys^^F !Ǝ(Ps *dL2cIF#5SI֩hNy~]yd$K(xl BT]$V[u9Ye#ăRѼJc2F/aG6$ޘGS4rq.5G=,F1jt7HX44*[njYl]pwH (gC'k>I:l  qP:$5A;D r^#}묖 4pmJttil\X;~FZrJ|WXw>0}UK\UQESjv4\INC#${JBK 'Xncp|Ȗ"j~L+8+mY򥣸GQ2ǵ9,+>6e^:L⨁Au%9b\{FjKlad.m(-}OkU9]-pMMڤd컝ײ7h%w T-ҍnn)m)^(m#] r<҅.k>RJykE6|VcwE2S瑼ĆF>نƔ SFwE?ד&S5w e)Rzz)kn%b%&Gg@:]jf5"uH(.ʤ(cHDZ9=u9KfsFVa/P?BѴfD!Bwg3,\XkY'|/kmrg'}{~YޅQ9xJSNEl#ߴ᏿.< uJB.ɄLW|]b͸CD;DAE6$Р-ɫ7{PZ0d69Њsjer%QqkhXE"R =d.2*jATيW 0lmwÓ@wіSv?lu@QjZN + [3NGzuZW*L)AC4R+;Y.3WzmLcQ^X~C}G[f[=!\nlX[`vFZ7Q]/V *_jICi =3m. ܊ %ec0#¹exoxj=4a_|m![|e/x >{pn 6A8q ε^0@rk(B:J|Ǿ1߿z/GA焼P (?d6wҽH͜GId\?f1Q!l9وPSncq֎U6HWϤLadC=L%md[}?qzM ]NҬvNןۃ9{8n;@jeYRU^ԿȖ8kP&p?ٶYW (ZqY$fL (BMFv& }[T A S\cyI2JMu_)7=|FUDanSz-eCCgԎfZMQmHĭد("=MrɰYf+r,*2:jt*Mt*h'l%C6k54)_|h[*#/J8rtEmZGCWaŗ`Ltfֵthl*cfc@집-BҢ z!Z#3Pzv0(ۍOb+m1Emm+FbTA"gVx뗃+l,Y<'`BXgedc>r.2q!z^40:uSeBW+rbSE2SEUg$3JWRedgKT K3)JEhxAlVCj憚xrL!3wQQ )-6&S4F32KJTEb<Ȗ !$" 9x A4PczD%$]/(Hd5Ҥ*R50p~XMXrgccnzˋ^ǻ0{DMcwAS`d}9/Ց nH~ MX N˻P#83xqگ z5VEr-pÉ efb4f㜨j?n=f6A&~?O''6)ktY^ryJBK N4x(確i?4xtwKS۹bGpйI\2:Y#*}!ƎCo0Wҭ9|>zJ,qy&Y[Nmh*r]O OǗgNB\]Մbak [FFnйԉrGۙ@,8+|6忣1 67)ߪPr.c\3ފ$\zF4qIbFÓ2aiq2ҴmC&Ш?z#:bdFsל ?GU |n"v,ޣC :e!B3Ur]%l(Đ_c2${oHHJdx7wΐJGV<.)9f΄InqBBc^U/3Uu"hrzq efU)zgLèz֤UNKy9֞PfW"7Kd3vlgts g8)Uّ0KΡks1ٕp͉"2u"M<̑Ѿ_ /lhsSӮQzQ.0>nU:4Z|Z gru\\#e|[.ф NYs%zbE./7̤ WǪic%8صeC$+*99k4I ^`k5k#ÌF39tOաr~Uo qXlGu_zwz}zt dӝbPVCl*J?L}U*-fYSs 1޹vqc#ZUQ[Wņ qu_g)R$)bv%Vk822Q+R۰Ljqn_6?ia#I9NeOG<k%\2M:Y8Q=ÊbI#4걩)KQm k7m#8';@^O)æO7h}$^-65v B''ID{/1wg>3:b5@Ԏd4/ ŜL {Z!gaNy0xblGNoCKDblcBF%!%Е5dy,kw!=uQY&*HXxJn(JǨZv"Q K3)^:RE2paj Iwɵ 1[NIl,QY"(9)kTJKY+V̷ǥ74=LnQHiW xK3G9:1N{'ru]%*s ]:$z*#Rz?dyYѼډ&Yrb@G?R$v[)O1Ũk$?2ԋj ;wYE45l |Rf$WJ<1.ȕ90 "U*#ȟ8?~P) k@o*pu.0v"L^ǧpx`w Y!sPG&K04`)jq~E$jbYo^tW׻,x|^ų0>(x, M5"exh4{OCW-\0#ׅJuw_5pZ1Õ)9D[I77tt5BqVYn^W@Ɉ x 5P'QUW716SC%> y5y/qⷌcJ\%|r~{ y<}KZ6m*1LO\?H4'PmB-98 j\6G|zekWaiFa!pj?LB>PŏUkV3] w`Ǥe) !Y.dܧc6Po[?#y{]_~+/..k< Qy.u?9f [:ǢL0vm|/jR{{Q`;gQP. Mw|L1brQʠ?W8L&+Z^>w|u3ʟZf0K-۸cZgC7n$WѯNqe4;7޻o!g̡,-I Ey#l& IDAT값+̓36`TRrMU_, cifȕ]Hm( ZA/ eYX2قB)G6]&dwA@S(-j2yS=BoBƔ-! 9LII& J @Im%-'Ѩ -/10bPIC.!M*0HCel%:ŔXN`HO99&yr*']A%S"\5#HZjm 2RH>h# Z }NG]ĦX1eIf%PIe=(8BN:`+SVRujY3m79 9 |4^:dYIAak%2Su/^(ļC=3\ݘM1㖁aTgp\4BK&F9$ Iu|:~m +'yR;LqrPͪwlQB?Oeq / >S8EGLϡЄbcOcYtޱ $'Nc)ph~=9}SQV=U2MR@èʢTCJ?j;mHP%2ϱMS,dl 5.c|mo}U$[Rz0=Ac<%Lt~Z7#͜!G)=.މ&oDۃjZRS7@{VJHOoǏ^sd:95Uu G{QK_vx칧Qql$IQ߄jW[l$RGkqi 6m|VTk,q#|BzeU}Df}/ͯ"#M.-/w;iذYEh<#o[Dԑk1kk3vB!)~#}~3O`:8std:D-g}0$RµX 5M0r 0v*8vocht``Nnt f.XZQ5VU #ss+7=vstP#G5+q:Kb߆}Eߵ ib}~. ûv+ r,(,5;_ bD|2"tց$s}ǰK)]?\8(_}♓Ǹe?zg}}ټ/ +Eßʥ2zubQB.$*-jEF閲V-OY¨ȒCQd$I  :JeQF#* yʔ5e%%%tZB-籖KKNA.QUа.*kJDPC\B+Q*CZeZt u/IC)di-*<* 9EҖ(`.Qȫ1FdUi%F}5edEF]@P4 B֌J\Vׂ*V&u!)(z UAj QJe$EEQ)SQ3WjA\PUY)%RRIM 2*YOQق%7BI#"i ܸ?[˯PgR ҴWcU P\@`MV0qH"t}9Y%u9EM)L2nis1cG`RPV:}ȋgP͍rYQM,%WlZ&^Z-uVJv:?@ϱ=fWLZu.5058C3Sui$Tv |Pݺ5j^3ň=V9@UV0`I͙׸' -j;62vtێYchx޷лgDƞ3'{﹍ktIT2D>ǘCS!OsOQg ~f3wjrdW‹42%Z F*3!^^A'9?[aq.`2\&nJ;˨ =5X ]& [Ǵ$xzKZA&=Vc`dXt"@r=X9 F+}|+sK Dt4a.:^kB?%.~7HKu<Bl1xLH)FɅ%>IвMy7XujEĵ%~Bz [." hquxOc 7lfjJ@<@@c ,%Y2Xʡ x<TUnejoVw`g… `()N ƴ̓:9ʪa)ëϢKW+V5KKŻla*N),X1rabeI/3rKN:^MF'I1rd!$6GIc"W@uyksPEfw75ѻ`Q0zх=jElhKLM!N1ky/PcZ xd<:]BLMa<  4tQ0ћ8KW.,ֻV~ed3i.;}l{=g.s?'GP}r;o߆l' :*ZH^/? |j gU|EST;bѩ|0V9B ‹ఉ0E[s/jj Be#䅳C6[OPJ`sQN=C8Kaz5|tx&c_vz89DAs3lw޳jJסv!^67waZhB6DJy ,8NNgb3ȿ#^_}_)po_.oq%=~WOJy*Q3~{_|JoA0꽨]NYZJqf*urY"ˠ/Q58H3$!q 2&ClŽ֍*\d]O)FLrĆm-X,Md?̠X*T0?BGGz*4(ZݷrhI1*z#eB"5Wf#p='*aRl\l_CFˬY^d pAA_(fXM&Y Pl`S#Z1H毾 -uw <{;1 oa y"} !vo 1hPUдNl)0|WoׯݝBQ2W:yh5^訁 o7"ljZь B7K|0adVEٶEu_|SُCc ܘ0bޯ o~^bҠVq\4R\A\R˭$}T9، AR"jLU9BێV6Sʤ5IܲQ&QViMybŪ`HT`Ko[|5>* i䲁y%Ou-e<QMsm)Fjd1GkӵIRalYp[uM26{** i JѐA7Ik$dňTXقAΒlZ2ItE=;0I&>#\I/"a݄_p)OJѣrd0˴7ÿaV)!W)U7*bЧЛh2Ic*MbRS)sYY d .cksRnR1ԚG*Qg,VikVaik!ɇl浓ƂU ih\X&pn4ƸUQ. xQL%&'t(2*r5Zf2a-V)I| ~Vmm],G0zM=FtTk5~28_KI#|I,P2T5f9Gd{35sCNt&تЎg+H ǨoӪ̜Mo[oQӏnDª))q;PϸpuYrrM,8 | t:2(dvbWUeG=R\VOJASАpH)>cGy- ɵ3ghʮm ތd@F(CNid$ÔlZr֕(f-%jKPb [#y*e=i43N-Š UnIϢ 5y+4Ui3g t ZNuKhumۗ.Ĩ S4H+w!FZE`^Z{cBz]i0TsD2oH QoҘ-t7kbs\@hv(sG"k8)% [DU#vjh܃46?HS7хc+@/m1!MTFȗ,RH+Ya)r Gl 08%?ɩyz _ӌP?qFU\5fjS-xRutY.@‹>\@/zǖٸhbhmMeF3H`<5ut(ʁ [o |uBnvW)Ęqfv_ Q,MIl Mtf}o|pz;v`1ShR(byhK=m^=]G8:ڰS}̗-,>V&Lȹ̈́rgXi3c1Py 4PJBtZ߂a5x-9X ,,nQtAU&K=~r Z{y&X'`X"|͟|jkDPļ먆Mʤl޷,:1m5 :96(0[*t$ V=",<|6/Fbޱ 1B, ozkTZzQu IDAT u\n #f<=~87&vHU*dP(8YhxHzسV4"JG@tigO8#:FxU`j[xn_A $RFi~׊tN'Y/C@(?s.*n/_ LFصRˁQ^)B֦#)pEN-LB8=5ks¯lՋ4B~9yPî * * aO]7dFa.ګ#b|VE`6.<>qBB\Yxn큮p*lm-Ycðj;:Z/1=*,az;^A(;ۡ~kΤ@ypv ?EX[" s.BnL Q V#ΪLz;?xpX,இxhQY0Jr3੅O}.A.p:8tN>|K QNn½{a:tfљ\̈́550| &Nsy'RTXx&za0E!8vH} Mppu"a6ݫ0>#),7ak— z*,n$3puz:6BƠEt*r+d * * *C|6ѥrz +W nݯ 7y ]'>&xdL%`g;c#،pm="7i#Px7F`Mtx!įVHn+OA޾ 0:hTvƒp\  :#$,tnsƀ-m^y .`Ar6A]t.<ՙ44nZh^f ; ]{ ltpEh*6A",G`-굴_ 7;MDVu7@2@: fov+A,WPATPATPA~OS_HG`"k& T.x)*kEAvB~| 64~[T:9L"*V| <-,.BuHe|.apf%WwhIxPK DO^7oj<˂ND0~ep#L/౹`6 ʽBDp2dAYnPÓQX n7r lfBOW$nf`:M䛉G,WPATPATPAwpF2C-pOi\pg|pM,ZY'< @2{Aon/g't$U6u-,DtoP1bt 2c'{Ce;swc(&Fz޹N$Usb4{1w0XpOu'ciXU cˢY?zֶ@< wz> i;6EPIs1qq+YgOZ UT_CW3\k`P ػ^<WtNCfho1-BU3DBy#tLEe pi?=GBn$TUcPB* %X6+?s6km=נ]z`xBq> ԵBMX7UNBx :[u롲o=TʺWK }vB!%¢|>(EB?OCͣpyry-ҬEpamdoD{Z6iAjB`1\|=JpY +a4o9~qW.r Ƃ}+ !o^m5|_&=حV$|^讇8z2|cp^έ 腞-Bb{#08 f 8j'Řa(ʰ s !Z`(t"r* 3p [_4]]01sGadR( ,`ԿP /B"vSشy lo1TʚPY&*O?E NJI@2-~w H`&gN߯nQIޭB;7YpEҲ^Y}ɇGŸ8: WHuw skC~}.ƄwSWVT0(o$#}ӁM/ʋ2|'{Wӂ^2$\ SKa)S7/{e]>;N\9GZ9!$@@I6aqccmdH$Z-nu:WW:9<4k/֢zuWժ~{_e  o6Ekg^]ǯ ؽ-koCr@DY|'DpQ>Ax",xXJA < ].!k` L={ Zh_w-j5O|61EkmtX[=G5dm zWOV8t: 3#upNx%B{tIx`z{~ 8 %D~# ={,bNNh!D .: ~TWs~'C Xc5Xc5Xc RBe) 0s<({s1k9mkX? we] KB1x }y-)8 Wp_ݮ = ɸ0G˗;Ŝzf*s` W&Xc5Xc5Xc1т !N{6l=,?+̳0 +5!g P.ja6 霨 +BWEE%BOB< K/D;W+gKb_)1EԟB8Bp`L UPhۄψE80,n̈́GN];`hMDw>ucqTKh1[9W݄^pvBO][v!1ݙ@f5 C1XWAV.@|myIa~489Br#V]3Zc5Xc5Xc56>`o:cvTfZdm/<VcKkar$T3˧t[>~xqB$޳]DNBZu#k]iT/\O>y+,]`Ͽ{D Q} 5{,R &(,?ND*AkVO`~^-=ŇM"z;;ekkk|oŬ3 =B4'A&/Bg vAꞿ""p dKWDۑMeVļaK+y" x'|Q냱ؽ^\)DmkX? 4ܴ `g!XYQ^⚍] , fKoQQ1ƃJ נ"j 䯈s> ρ/C*kcai\/MD2(3ADNjTj[" 4/@QI։泥wj+8 [irj(R!" m=]^l*P')qJPRo&x`)l"g:(dzDV%QJLc,`>)ps\KxKRY0婏QyIb(%.^|7"ݧ&Q$S M,AN^C`nɳYuaf*^)\T3(ӉtXnf+U 1#a-S/j AW(LɛDblLȮ̓O'*gQ@[^Aw\8 }@g7T`9a[7bzSp$xAx߻S%Kh=a:b9{DuOC^,ga:XWDXiUl$bn*ܺ[6[bL> u l L.b޸MDHݱяÃ39qm'!GN͉; 1lY'ab{ #pVQe_~q..Z.q C8 7jz@v){/ ϊk&lwpe([`zx/4}!u|_|*ې3!V8B[n؀u{=F)^DZC>m0|dwXɮ)h8s$o˦(OQ16Xr- X99}bRTfl8IB\IMUpq%BbG2Cx.eD=N䦾k,Pb6G?I[2D/mrKg,,FJDZ:3q'H@z#mOgx~ 5^lŭَ,wSm;)\L:2.JHs2G:w2Hk7y+Z=AfcJ8۾mo0(,]ĹN",VVxhy'ZshYN{ݚKVygٗQ&5eZס/fOͳБ7ȥ0'/h.= *~̪TJ #NtG2lPKxX~y8J(S^qYUTqjt(VY]5cIn HORX]MjF/crj sf)qicǹ IDATώQ ()ҺMa6dx2 >k.냬 2( $aH )> 2ts}jnR.xݕ *A ՜P&bia³6vH EB!BtšEB(eLt#?)jmE9*Ul+ΣIeTPaБ atxDvj9jY @&+bJJG8QwuUPF4 4}-SWbD:r\ =$c4j ҁ:cUL%E,(-H¦B'N 4pT.rː&g%$$ 5(*@4ŐM8ƩhF_R826PE!h×K8ep吋n7 \v5PFbӋSS-H"Z+'rzf&/pzƣؽ ڼcaPΡU8*FvLYVn=C4I9` Ə[ .olAI=_ nQٻ%8y n!n "^i[smnxc5A7/fEӯfW 7- 1s񛷋s̈́ӗtϜd X9^G&ZAqMKW-;tSpFv`Gxa>| /2e>4û1Y2=/(*'ޝ\0/aizGDUЀx68HoJ;ax?dAѠv (uO!dP Hz) ^@wq͡- ht?DY2ZSM" xچ&K#&)CyuEUkty[˝Gn(#kȾ'KyxȸI. hhI y(xxHHy(ה4UId $y.~e%E1_ U|e\dÈi35Fgը/P3$*nP>_r$({ l k D")$ e$G%˗Bhq"i% yf {aKU:>2H͠Mo\/ ѠDYXw .5_]d9=>Ȥ^wgn&SG8@a~`y]VK<"͠w<ϴ\|c"7|}P˔ H:ޢi(v R C : \lǣ$kHz&\$#JΩE`mF!T*~3PBA5/F&J5.ᕃIٱhUH Ϯ\'иt9< zRQ~yC5:KDEqJKLn!t\gq %[ё}&lg9l>sA.=zA3\XXl7a|ns^RJő}YoIʐ?YPz\ӤdDK2HX:qK2H AZ!PN'5A1 x43>A36P5K#wLK#kUj$N]= iMQ0U*8qO(L<;Im&5,NJ2Y"c+88 2^!| Zn %Kl\!ђ2u3DWa.NUIQztU.XD`5f *F1LCI)V(VATM EE<*btweK(FՓxp^ta釡-Wkf]TQ՗T0}0&;?}0:9%\bf.fq_$JA{ CB:/g? WrV+.{0F~M]TEG s1{@Â!=3o">0;a0\\mԿVWrE["Z*tdKpby5Qiϔ u8 o4Ei, ,,B,"֤Zh ӪKlVv5+k7xYE@_gwM,_b@pxڦ;f /$C>ú3 e-Ut6Ieηpqb3m7nb`F/*eJO0G+ځ&n]a:16\bcV0Yٗ4(K8SDHfpLM0”`kGa_ I r<'VVXb5c+\vii?3.нxsKԣ wnc,]DФ6yΆ2?D,{&o5զX`aȴ;a?( % ;w%.>ouNn~tF/qlFʼnA;J|uYi6Gz3$vYܩ LR댣5ߠoXFk&)|gx︉{?LKě5$Kλ,!c R+~kka 8"fsKy,Gqy-wxcbW *Fp[et.8JnL'-ReQIqqb(jYRDK,x;x$xK(* Kߗ|Y_ّ_$ Qe%P AV|O/2*J\s"L4٢tV2{#􎪔O56}{to N˸+AJ lEkN ӌkD2FD'*"ԃ MJ5%]ѼR] _ "h\" B6 ^n &$?|C24,mO=#Fy?`d3إ2<-M"9[.jJ(1uBQLY D ԑ-"{4c{>#']=ѦMޢ0woݗObJ96Q*n`e^R Ad~ݚbmŻ,;;>ݪ'6ZH [aKL/n:xխ`J2vT&RUB*^;R?#Z O+bIf[*lB۴a ݉v38>X:ɍݻXOݳi9{qꜘ:?ՁlSQmo2OZ A7i$a\g^D=dRl\t0I /ոr"3⥽m-dlzں ؙ:W'.q%78w5a' 5Ӝ>+zߕ e7j/mq(l~`eu톗/@2*d%E|Q2 *4!FoFTébE# ܧ//Ÿ7p۝bF0z|wW,w*lͣB OZ -g`c7"_ mn-}׉98\\Z)9*41)xp~'N _XXeQeOGD|>Qx"\._†up4~+BȀXL^xkpOž F!!~[@N DDC;.A+֕]/19FB;n9y[9&k=-r5NPgE޶2a!Rlw@J~z$;0bҧ=[h&=w3><mD :Wrc1?@z<˜Mgt}7fqf.`}/91UR"~$eTSi#{as)M(mMr(ѭ6gYLҺ}ҞwdI&y4(Au}LIItJ9KZ u<5CW¼M42VBs8Ĝ&5\bũ" r7V;g QZL2b:ь9b0 y,!ɯ=Hs K2 #2HH>#x/{H. HȲk}ϷZZ'_N֌s(3'>.V^̟:oQC<` {ϑ.Tv4Ir]#hɍ(cO7~"q nN12Hkx(Ʊo1Ge꫃\?dww i&-WY,E X]zVGRz)$@a /YB ʬ&d 5XcoѤATB*s''<~KFb:׿;q YQj{1Cԍj /^"PhK-“MlV.cGOC@v!^w 4s/!ŝXn$7( _U,{pla3$0ɤLh஼bFl6C O[GL^/}8|'8n3p^Hn$㏳0OZdwvv8¤7B}2gO(}Q3Ox{<ʳa$ֻez^(D<Z$h x6$zG-f!I3e\[dlC> IV45 hDSB($Zm5.$hhH-ؼ@$J eJG$JhR>l[)K4@~˥)cFM2Cf#ќQ8Uщ,+uhN}q"I 3Bz0;.~&GS٨"X{~$ۅE7G/kFTޒM.IzZŬMC aWHv;''X;y:+G)~"C fmɞ?{ROoJChu 8+ΎgY_+e? yMZѤ5h-mUty`YWXF#:lGi2WxfL$զ(4IY1v5kЖӚEgؤG0Q(d$B(rמQfaA ]*9Pgo'HEƌl-Cl썰]'[NjEL8\`oeƗ=c[;B(nf?GIVZ?t 7w:IzuuW9!:>}Faa޲qҸi1 jBʹVcFM& _yL*,5"dS,扚aJ ŌH2^m ?`F6iWn`&y3I>DȵEOO! B1GXUclͶ@LF-N]bnPێ#j&CFڬa}5D˥<\m1(/Ąդ،U>1Hs|a>s%F ͊1Xs0+Y,z;ψ6Όb0ET:M֩kxk-201E )(MЪGRT줳AoR}Yqf&#m{59 LΟgn߸Sߘ[W`{uJiwSbOx~wQY+MN|}ͺȄCrHT(\lh#>c%^ݬP#}{R;xp{5gZuHUt4\>.?Azo?|6|P&e ;??RpP]?aXa۸>טKTCpf2st> g vy[=)nYMAmC1Nq' ;?> "8+y`V^ݰm r X-Xo Lnyp?`u }]J  Mm2`jc&M ,W߄y&l$0?*c6|T~A808v?y>z_|t6`to{ ޷3s~5-` 6=Cޏ~ ~?o|<no !`*XmNF76g~%9lao] bN@ $|xpz\%`-;m(S}p]V/`W3F88Co8dA=hۇx~]Kwnekf3BE_デ|m;#ŷr1>_|_m?umvRc*3zǺyNK"[229!+(>efEc"ec:⛼|u~ܵfNzoܿ{"JrJbJe2+},-mG0oN[=5JK84<eh&A7k}'I=XZrיsϻߵvN-ǯɍ]1wk!0z8c# |1[ X#[ɷtlgg q*[nw8ٍ_`wQKd#ԏxq+M[E_]è."Cë컟n@C+cP]eA4+ KDAzb.zep[S2!\`~sDF߁gST5Co2d]?Ne}; z7X;OkS`@0ڟAԾ۹y3o{ ~:LdgK*N 42k<6N|߱^w5mI<' .Mo 1ĴI"]s/,њ|]] @$@ـT]!vRA/0:0%:JL!qhJHؔVSȯ&BA?)tHeMeZ8 C7ePJ | :kOzBEC <fєg!!1DH] J(Bх"jTj$&]j>L4oDOޞhb4?rc{\||#竜Y:m]̑4K7";=8NXbWΏr]xUe>ߙ;z;92ܙ;LՀ^x"R4X6I+#gfWg\)aS[$ɇ%^s|>"KDwK'X=¶D5=;8_q.R:c8w 7j爖~BbYQ|MLᎋJx=XqGȋ +;vr];{y;yyƙ:P) +Cí7՚,mOz/M֌`t[Y{ޕ*kGI}'JM>k~>z~-$^e4 qcNB$VMQs DdH]"N+12H/A"0>ZZ#ښCqvH"k?L4KBMVU6*Qf^i $6v y4vΣ^DEuPZDµ Bph*?B+*襆Xmzd0etf'YZ7-X U@C# lh%zSڤ` =4"kZ1 hfӊ{X<Ȏ\BX!.G9u|hnӟ*g4.L[M~򧯸|mAlfA: ^sq[FC>{YJ@Ayn5@mfHG]#H8Ő@b &fO!>X4[@ȠVWsASf &9^Cϲhc ] p јZ?$ڒ,7~ Gٌ;tV,-8oi+ٟӂ+dWp uxVԻ_G}w֎@b nVl &FlÛ߅頗C4 3QP6Lo+7b>(sl~ ~Av?5{^h.sud5w{7&)f,מ ׭}Pn;#yJ0xk 3~ wga<^sG30s|XpvvB$8׾DПM ^#}`^ojgg+?P5_~28?ܵÁ*&)W )~4@ jt|`& J]zSop ^07bymcIfe:-ŭLU 8kpɀd^Tfis"Trj1yRsoڇo,;]cy ;=FB:E.O1ĉųj?to@Ѥ~ a&wt⥞ dڜ_L;CebMseŵzN_ EKpecWbߝ[&6y.ԆpϷ {<G ՘ s ڱ/bslEˬNAk_v~=&;[~@g_rx3Nw~6O< nbZ8q1{~nsgJZkԣ+ )-1ξ+\i8gxiotмuURnT$}tSTgt-M':ג3!T6yȐ:C{Jպci kRj*hZCgc9v$+sD Yzg!|s2L:X<ߠ͝W~ԛuP/c`X__51d7Tk*AT(G09q<)ZKCqǯ"(u7p .=^SY,ňG}& xk7qXGZwqQR"q$(MАX!4.'D)B(×@6BG7:BxJ W𔋦+<J!AKD(kWBIRSA@#D@)P$ <|?`KuMzHe 4O2. L*|% @xI&mEHD hGG* 1] h&B+T7 /xwI"Eטj초!&LJ÷T)ۘ A!%~vUܕmQ4m;R]vmӘe+'cfΐYj& in'ugIV)l%VHP*ٕ+e>Belf4~NlɝwaU!yȎMEhӝȝLǦ3`I2kxk3+{0F0/܄1daU'ٌPjFF5ٚ䭡(kwsm"V=C݌Ƙ;(M2kŅ:M?B6$ЉFx8]gK6͢4mr'Ҥ-c{z4OM #4vJN2ߏgQJPHY&,Ir$D'P&Nl>ɚ\GjQz f%1b9DݪMϓf=Ic`t5>.$PjȶMP5Vh29Ze kۭ'k)"!,v,E'}\=)acz%l\8CP5HlT[E-!*#dz`nҽRKQn(Io@4lR樂_.AuD!/cb"Y=4>%+)}ßs!8p`Orh}=^GU: C0"lmm Zc,jvf ?֠{E6ŭ(j?\k6uvw=+i|1֖X齫AhTL|TҜ9*M0< P L[g^vݡoRq|qF[#7ܽ@@'s#)mn/oJICrGQtcͦqnwԯu(zOFZwΖΕ|B0;>h.`q 6A?v.1 mP% <; L49NBM?! N]!`'$lXaA 3ۄ3۰u*[2ՠ@ b~9#pf^<x.o@O^xv|(jtU0l>6<~ bYו4g>Y3OӗY\= O/Y/;t_ mSv$! \r VKDGH,@Oܻo%WV'0 "^L`Y}$Phf9eN;ܥV/w?yh߯-TCnћڂV9,I9odI606$'ʼ_ͤV!Z!4ȸ\4T96,mK䄋)#W)&ϰA=)~nl_ d^eB([3iקH$k]BfF+옺J[1.2?^/v9q͈5%Z`J_HXPNә92HP.Yxi),̽kzY8QnxԴ2Bq-jpZkBX TenhD8MB6~$D+8N"!|JVWP_ NF‹Oay)*sD;Îw|M{i uR4"'71MAĞ$0 %~<wȯ%~t4A{:NDlo#0a~+#lGW B}?T ÍPL> IDATE">1çj0Bh'@vH߼^ !6lizE˟lЩb&MVMu>z&%;۬qrCb CыSud] V1w25Ц:HB!4&( P@SRu[MDE\ 4a hA MX@!KuAh@JyPA?3>P.R@]BhZP_g"<4^@jhhh G"2BD: |)P|]hR a p@.% 'nfBh>B J(B z8>>y,03W|VXbh =4ݏR5L'CSRi.4Yo jr_Wa(WYu"9;4;Ͷ7zu.zFi&ҐE5Ʌ{S2Ak\BڌT%J_c{p56[>|sl4x*kc9*,qc``Ysx)r XD!,4^♱*KcQ]`.iŋ{u\I6oi̷׎qa"׎9mPƞϞzl!w*Eϋ^t%fEb53M:&;Wٲv:}%6^\'Z8Jq}co#Y"͡]a"Y'1Ǝ/ 0ugҌ[tϓ^zךOw FpjOJY^3-2&FMD].qD#= 8gVq=^:|qE4\-Q C&l1!fD٩HLHV~IÐ5d婘]0/9@ؒ9٥E!)yKd3N-Xmw(ӄ7Y@.$Qm(S7*8M&鰑X8biUOUn, -!:0ԧp0~BG?Jg&| _zï_e1D&>Ӣv7϶pǞ/!C0[  HXFS%6FܰѲڐ}2e"?3U%][e-eqx 0Ɣ#un\:LE٨[dwFV95BQ`vv]);~/YDʂj2C'J܊xQ1T4kn: DȖ\^f_cL3P`s GQx,u{A5Ǩl+VP;VnQڱ0p`x)N2I. ଇ Gp=0-WRiOpm:kUf@'D -T#Jȍ5'ܺ̚tb$Y*gSlD]L !dR"ﱮ聴LH2E ) +vf$qQhxR \Jz4Dt,Bx` %50FD;h+ic1B^ؤNjO, ȼ?:& u/WѹڥKzJ'Zw=C&li D6=v~zu-3Q/spr +zޜr/Q5X>;W炈yLz&6~+WIsge}1O"=_\`uÑ>8pamwb0T;?ws}˳F2}VWxiHJz{[7 ZLVyrdgi +/W4MR&uoY[N&in'{u2ce{gfj;7?wnk.pzj7ε/dm00˃@xp?fw'n?K}5,Mc7uJ-f1A'oy<:.{cGg|'f2( =WSͼ@ o1VX篪7Q6ޥux19: ]M+͓6%'pht1LbfLPy00,['QQjCÍE'_ʽk͝[1₺%:^[ <֋<<3rvhųYe#-d[k6h:q7m24oI+c5+T(ޤ\0*6F*Nf3vDL /.HѵqLC%rp4q("RNYz~8 \ A %~̎j n,zӣ7dZ@:*=iܵe*L,oiu޺2Jt6ZfFuHcYIjkvEݤ-ۘ2\wR%Ӥe,3%\Nh$m)e QA/P=|Kdu(OsV:' SeP$!」;Ͻ/VF$ "%QlѶ1x1?zKͭ~ǻgO}n:m!K Qx4e\ۄAD"$;±o|j)t.0v sux0nܼv(=<nyn%8pGO,C~o7L{/֡4uZ$qSFٹ$M6nȺ!hk 4&P B IKʝfOb-FkX`0'#/$ٷ-68Ub_l:áp+H~%IzcMV-dxH\Y<'gH.rV۬q.v>b9xssruܸ*:JmY[Gш㙒h Hji t%A$it@1[XO2 *:V&fZ#c'qCrCY+h5|]IhLۦ-ElĖB‹S?Jh"U_Mn h2^0Y@䈾$Ftn"dXJ'$Z7ЍLIhuv5jHç5%iԝfgIDmVdzFX;yw@Oh$A-%Zv%֝/FHӨ lJP 5D`%iz4e*lcξ[%.}mNbl]1d*Iݦjh:17bLh fxuLuJa?mu{6xW*hE}>NUr6I>Ȋf'Y=?}Lmr(ۍڐ,qZ<EB]~=ϱ/Rq #K;=8O0["H\frlHqo2 :;{8yZe;|\{E0Jn,CJFt#C:VYjtFrDKvâ`D.;5VNrV7}5ʈr IDATff{ipv1F gwQuPkE(tkYnX+8{K)A 7hKEܐ"Dm%mljQ$ hh-D =i #qf{AD[rХA@Aј7*5eKiΥ#Am`Wn~:F`yXGChBDZHkp=n RMlWY-_`B5LQhUq#eVM[S44g[&Iu-cďHnRJ*Z.k(|!'*l}zK_BkP^xV No5eRl{vC4zs {;c.(\_  ~d$_M=I' ^T>?;df/OcB:/| # _Pte ӷ8:?ZjKT mN= 0_|n "V'v`}}wB {MOw([i8t=zu߻d?4 셯s H'þ|r?o; a0LvBi Z7d4Wf$V+$SUFǒб w\fqrNng|96Z/#p:cB᩾)zVS9ש=\&867-a>۳g˯qP&+l fJ6wB&d$cea63Xiexv2ɻ=]l2qku{>05nS8v!lcd7<:ȣlyj֬IJV&*`f9;I}oӟ}Ypz%Ǿm*>ijYЗ1y', h">MwDº,|u:3H!'^N<:ҳڢ&w?xۜN8GRZr㔑FM;Ԭ,)JET}D@dSP,`5PeT|4Mdh(#Cx@=0۠S$-|: BPD;mUхR>m6WB\IDBᅲdCvAxӾEAFhHE(W\I(:~eb=3Ѫ -AiVkR#o *gbiXQd4*1JQL]3h=}˜!I|"wݏ8 ۥ&W}̲oˆa{ȼv/[?{]G24[ ֶHiQ|Aر ;w/#xAɌ÷{hbEo~旿l2^ rq3mb. 4cHjqĿB&?Nbܣs4^\s"К-Mwƹ7]T6?*5%ID 3Q >FfGJd0Mr0j *2΅(fc`l{# 21N$SǖiK?KyvJ N5,@@:Ngcڶb.ڪnpmQ$ w:A &RxAko+ ]t:x>f\'G$p\OUCX D. #E*AL">#HaЅ&4t$ضNj%A(wڭ h"dh4Ǣ64@WJyhB!\i @3vƐ;a?0E BBǰ{{#Po>[ç@[^hCaB:Be~0ex}pez3M!zj,3,8oVCt>8?2&]Ӱw$t܀`f`f'hGMpNoa" zߺ+<͵ |B[`=^Z= ; |{nn=ϦT0O`dekǪ-qh5j&;I{s('*1&x=05zu3ʙjsCqR5漳jz0vg' yJfJ?25MCbiM*zTF0]S"}(]DψNwT@T[:)@u޽$+K(|78 FNō ӭV*(4lrk-]ze8 Է4$˙=dq`&;ص~CU~gMUz w#y M$Vwqw2Sqlw?8bbԧ0 NA[v[ϝ{*!6E6^wS pxynt,,լ?ត|#?9m]X6ɽq?rPam Po1![hWO:f % tNoKcDTԲ-#!K,j'*BMTREV x{ й[PA-H[E~7Y_)D@PR-AMyB~JJLZ`APJ.E;(Dɐu'N DԿ]T?B f[H4P)*ݺԕKt?3mU%^{I;m3H+NKbvb~wN.fQA 4ݿxn)fUE`뷈Y1:-o~BTx8:Y"ބ!Oq HகhMN<P2єN.m52N9 WVtZ$ЫowEplWlU5z3OoQ?JJ.m6p(23\{bY*LjقĨ w;[X<|պþ%*Qawlcr+g%=%ѱTg*Ry.guY` -r߉^˥ Mz.Yt^>sψug.EZ{Xÿgœ)H6HotHUS0[1L}uܽts+n#UTO,2d)O(Sk 5sS,d6A opg39/ Osݢi?ĝ+L٤[l?) fq9Q7<&gMAis1y(d(h܋8C9p \xjNNToRb33E`7v[s-eYF]`*L;qUi2Wg5ꞠN3̱,7(9HH D34WZ74݃:.j= tҡG,Nj-JX#bGr$&.r1`SF%jyۜ2J9еAd66:Wi03S8na 2NJ|3S<p{Pk_,|[g8W0;y:?G/}?u}/|xm_yOtzٹų5gf eŁR W)-_FMSw<)^a'+\('$bs<6xaf}_#{ 땏sysϠ.%Cwέ/|~g ϼd3ܓv]*>k Zuq*+PuXz_P(A2?^X܁ _|2 wކ pe !ٰo>F/}LK' P]s+óS𗟇_ofp]Q𱏆a琈PlXB` 3aXsSx.d"Ѕg-xρЍ n= ?mv{7|'d.J8w-af†\X? {r }f`z?dƯkӡ B6?q'd3pW\ ; a1H QRE0oL,,D\D3:Bb6hR`||Zk13GJFD\z5|$^%"c]$r @^&GXݷcxœ\I {!y^ejcQ: TucR"RcN۠O14A-_kJ"B4Ý}iMV:;\ً3^jOG$\R'q21S;\jxʥhnj~r#sWX+:Qv&Q;yN IDAT:{l8“,؂5#ϒ݇6r ߥTLU:ce&n/.; U:W-Qz^%j#&Mpϒr},ϟB;q췾m#1-8W]%gTDHĮklgxYoŋy𹓞WawM|?uu^NV 0GGU?EGۙ$x6uR \|C#jԴ:ҕ uiɀoz|cXq9AhI ܔD8Px :nPWEPDV SEڽv](téY؁1| :͠^X4Zh@5 z D#Z%"hN(?׺8P#&"T4[lOhzhyHݓX-6NDWhT"MtW$8Nal,̅YH7}4$I7N_EzQPQNjG$ѨgE4# o3!b#2Qq(漋Kcd@ix24 o|m?_MZqW_¶N::kayn(p ;;R뇾[s$Ԙ#4+v=d8J G9}3ʇUWctoc4Jg6yՁ?~Bc=@t_;Ikj^\.`ȝX27/ScvP:RP]Ļ<͕Ib]\#zG8_$;VCGc L{/"Ffpڈqo2sǎ2Ļpwy9ɥ$5&[ (5T M7±\zS†d7_,u q.@L_]ealH%f@G&@q''8'I&Kz,6T -FcU1H|>BÎdttDAt5]13\QFmPD'N9O's\9Tw~>/gUZ~l]ӈ) }î9,H:ꈃ=&,IIh9u[../{N\$I8mЖQ FU (%Su #SidH["UDJ(cvm I^L&ȄĢ y4U4ˠpEW?^j;H4p {&|,;o.*:XhM>J-pd~LT`cn=4w.-źܛ~^yVwé7$;[vBzyvMa(YٞU3eɸ߁m-CJe1~KLt9ΝU1Q* 矏>8|HG |:6iIl,c59 Ϝv9}/(= l[vW>v˯F \.X8KB'ҿ}=Akiֲ -dzlZћoH(n8%|o!EQW!zuvo#g'QCJY`%웡PxC;L{WpVd0͢mP+-31G xl TȔ-yh߱­-*rn7EЬ=,;KHUJ7-CK'1cll@f}J]w# / e:37:{nى)4SH$j7ǦsE/yb𚇴4kn! 1Aq2bu#D{W"gO/bh>^b{aF!d8vN] Ǒ3x)n9/CiGlp}rz7q f7z˘D 70ܿލTR +(D*\rk)$YzHH"Km:_E- @%\@4E!C _`{%NzܠMdD= 4Yd ߊӞ RbX!e$ acyI,BIF|(%|]CK/!}$%$p%ld!H)'D@ xB"GxhHtM]֩ a"TQDHƑ;!{ 2c"ayM]UjCV ظ ވХ?va02:Hc3EQ_z u-@mX~gQ?(Bzx_ P~Yci~ 0̀±#7?CͿťC[{ `@#8>Hw3>E3v . tu8jEJ̤fH`E}ǟ qo=q6{Vw̽`dm,;B2+ YKӐ;t3~@me~*@=|QQEYz'h 2#À @ 04RCǩFz8yfM/8SUP1[̟jצ0E.qJT;]4/Np Ba$VMy6l@WLez8i(cPx K}7ȁx?M>qȥ-33')Ϳُ"bLSڣ}Waj 9V 9'`a`7lÉiHеʚx; : Ā;=Ow=ұV"|1%{(un;z;̭ApQK=Oym&^Gb/ {u{ԊQbqJt3r6R;~*m[9s30Qau3Ev+D8Ujy0E95ʲKrj+^, Ktop_z+oʍ!Zu!v ;2Bͥ7y1WFٕgkS F\~o9O>Fٵѫ*搼r]jo[9D*iyvW- q~7 _i=215Ì\ZYGWG(QSI.QF_1 J+R%szJr3\Q'DERQRFu`|Du2a@x=СB5ɢ0v`1be3Ic4ױI1{"Qr{5"-#dlS|85L"VeD0n'@]uj=4I>by:Rs; nW/b=#:_%$: 7ASxE6PoC>n+reg?M?I:3%:ѿko0&B)]%;|;W0%% 65u;(8DЉId5 PZ =)D}TCvCy%E'A F59)n"-XO sـLR--~@E2B4 3HG(בD c T(MDBR4^29hIRFCBt怌RQ ' H(UI 1<BMBqע:X2x~ ?Z!D+kzMen3e/B@1d2[`4* n ӍwtAXUQ,eC{<3erH PH\D _132?Kz\ޘ%O$udSt#?$.Bj ˏaRk)yK=1?rFǚM_eɸB(`j\iiM+mWi4rp80.K\w1g<{.tGpJ\W8Z ]ù#9@^Ҵjx7TB:TGcu=87~0ţwVG\w(ž5&|EDN6-7uh/=>8Yv1 ld03l-xF]1ٲ6hk;ɨ.)cΎ zl9qg_S]砹u<9O".Olf`Y=VқS. &Kd[t.s.O5p-Q7"ؙ›7τojcazam_оbSO1)tILh}5^̰C6To0 ;m%`n(1)_IP9;n3xЗP^eT gA\$d#w='"0tf= 26g!MH7/"^]R ȗPJ[=:y,=h2rDŽ //z.PO$r:F1߲5"ŕWR/b \[wLG15Q|w͊^Tς08gwW|3 3304Їb-nغG{_8I8k0?RaM8 i ;!/,IX]Ǯݲ 5ܯGoAep(dgSI-p6S㘞mFM%873#$r%`:?x710v9Qjض jmzqօSK7g?D%IсtHqv~/<9p&v3Zo^5כ4L8؍s5}?ǿX 3C"dDI r!aQSQ "RFKB('~myvv7 * REvCEDXHT ]},+Ŝ]fcr@:һLJUe X爆dvWR}]jOHHe:Ve3F“9I4 hO&C1wk\z'T6b|dm[HcWL[o=ǟd[Xg-pg?%1ւ0zf;lϽfIܙĩH3]5E3ױ aSz2 Za`Z+㍴YdTgkPc-w,7^}h,+ |P%}MYobKEzrsє#RYFDt Z6@ qiNF&5U E;Kf(!QʏžOs֑RxnD>Y -EjG({hB$jۨ $m'5FPdHXou ]Ϯ%(Ade*m UEg?Cf⦷P4S1HyIwMؕv><Ȳx/=0+{q? "gY"@?!} U$4~߾Bw ,%3GwQ:/j9=x wjS'R4$7$(*xf#lECq"Oq#zt@;K[ | KW$v"|9D5J u`;*A؋,!8؎p$FROmxo!oE#TSK.W+,'fc=>3\@CjH4Dd$ V>ϱ@lP\z0'Ց]u#6|Ho0lмt[maQ,/3ﮡy)rNVВ-lZ 2yj$3^3w`uۧ$VL;bXQyQq+;BAN-_Bd,Qccːߡ0kgeMQ[4;]n /U:QWP4ۙH߄YqnNDoɤKəEqK쐙Ƞq@}Ff0xZ$~a~*̊<ۦz$BxÈ $Z9"\HF`IeMLNi#-nŖAPS?UnH] NP7cs7:m|mvC"906W>0߾#W(fB!<;N,Nڃiwt`\Fhz߱yL!ꮋ!B0$ γE'pEDHcnPVqޤ<=h&C~S-Z8A#U$S9} lq*5U;ڔeax8 H\@dh?\!T#4)HD"37$BA b# `9:0 V}Hew|.@}n)xt>k+? Q8X Znm>u Co? aXL~!ǚ`/5ML@ynL xf tV !*ŸOsuၯ@4< 2)~o|b;==?wNoÁ߂Xkawmi`~!?^ 3;ӾS}Z\^ 3? _}5v> ?x:x\$=L&Ӏ'`a,|񜿜:˹}\k2dOhWhEg(#V7pH> cWJTs7y?IYf*T_@IO0_$[ŸJ2AR wM-CnYA )4 ;OxQLDA]j/]J]APD%Oagw W&f% e|;EҘW$K}vIֽu2V)GiΊ:~"%`"X)Ե,G#<2Gu"mx}E}'aKgb;ԉ3KDfd,A*=%l1W| RuOͳuM91nMf[HMI  WwQq2kbkk]GM\% !Ja®I?!R mSLf&T?Q׋t{UCc0ӓs)#FB#M/GuUdjP ןGCqx?jkMV$ۣtZ>vq/]iN}2:JTjTw>.1FLlA BRa\?+wqfȍP#CDћB ID$Dr+=:PnQ ]:*B p)qpM+5>^}U"ԃxJYsqOUXS]@'$"9BlPTR>xSӤ#p.qp;nyxy$_O2Ǔl%BǠc(]h""q BEUB|'#˄DE%0Qb=DGH F,BBVYqB"5$/1k >}3J̣B'ܶetVQ Aa>Ɏp-, yNLen^h:?KPIEF[>-ha먝.il@fxmA:y V_Qr>پGFS03SQ3?I=Jx8]Ar(Ic3 w=2KP"2B2T0wO^YòWuC8Cd~ft=U}=irek"DϞ@E/} }O>z7P7mB M"> '_LƑ8BTՈ+34_ӫ #i*O!$+Nњ.{L'HkjxL쬢r$Iщs4 e@ f="*Sc(0Zhe@r;fcY6ZARqQz!v˸ gM\#'J5\@0V!Tw%JIx̼t{$E6ax*)r*y9KKGb2=DKA wB&!Sk}Tt`"JEI| >Q(Z@r[eڡJ0ͱkp Q'uJRes)h$!@\6XO 4zJ0^fPQk@;",g7 D$ahQ6T"l<-?C 96[u2BEX^xq'YȆNBhH8x$BH"F>"'Jl-@2X'!@^ ,+ lW iI4>KarhlSH@5#;*{צ)j\F d@ ug5hh{VO!"|) B"!< T#"A\D-Z`Eod@%-\iJeef_=TD7Dml7l!]:7d2:׳ c%̳.ٱ#"*= fzxiN/ٵJvz"R |/E2A'IDzDVR=#dA'PH<%GPV;~$PS $T#"(zUxHP(]dbY2WW $V-j8^ =T?>#*"%)'[w ֮cr.a@WFJq}q*\y:11|zgXE?u&{-}Cq2 vl)eH # T1H$og_LdeEr*g0z'B2QAx dѥ\*Гd d-Eq0@E%T%'HlXD^]GqC2QӓڱDG.K/a +UBU:d0(6--U?GtIҿ`o.>KʷKo(IhH+^ ;i+;MsH$m :D;y!{1LH^GR4:5"BBiReA*2Rɐ]OQgIXL'iri2w|dC V7OcI4ϑ8-<廄^hIi4ȫ2ަ_ e}Oktj^Ʌ|1#j_=AK8NYV\hrda`eiCjʐ(LRk6mK},K#aGa3[!=!f*YL3dE)Jd#}a{XqDemtÈB;A2- ā$OH7֘[s'}n/l=zIvu\*$p4ɨt ;qka`3x6# Oi- F3/ 0+Mص)IV. 5 s#|a_92i(?MLEuBgwp".z 2tH>KC>J_ {qҐ)dO>%Rt_A\42CAӛƪLcK(;@jſv 8PE0ڣv!A)8&)c-Bt"_-.A<"e@[ {y68Si2?':dO>j-'ʼn,=XBއ unlm27_oy/74[~KK8oGRy!J ɇaf:_e?P^ `KG`t6%pt|J_鍊6Lai,͋-8 pq|Lv<E*\ڳ A6 h+λoe/m@O{+zznI_}0O_M8:/~ ~mKco p`zWM?PoXpvH|:[+wvIm Oܰgv]ze]]oV!XNOZ !7@T,<*P`%U@*qj5q[9FBvbEUw Yma[=Q<1s/ЛY| W!gzv+ews# F#dk,/h d|;RH&Y;-[eXaav5bjiGu4[VQȱv4 <*$Ƶ;O]F1V2OazvcH](&*.?G-{nϑd۠G/qzuݳ|?;@H$;Dw;?Bݼxú>J'V.4ili0иivlL`GJo⦩,@%+0Ll1Ŵma5C;Ff(ʦIϐY~E~G_ ~XZei 27c]W')0чq/|!>I ~vǾƠL9W2GokH5xCQ8#7S"!ClvBˑXǖ"vw֪ Bgo-]^t@ElQÈul3o7H]R!~V:j~ս51`LDŽ72J{vtW(ܾĠqdZoA62ט̍39u3#JGt;ULWġIk}R٣,2-2VdbQdYX\ ȑB3k-M6;BJvLd=B{U'j07&hv 1mD"s&9s1*4Vh QnaN cTqan sF &x{gcOOݯ78uSlv׉ aeqa9"0ZVB3[Q%\*d%9S&1Vn7< ӗP8X IDAT,fnp{Ӑ`F1@t]b Fb"]zmG< ~ dEeEB9B}L_|̚R"ȯN"$_!,@fX`E*kY$oji"=Aeh%Ph=M;{d^_G?(a/ ;&\ mh^T(;@bX8? cFLV.ԝ`b.?NjOj[0:n*ֆxi9e04`aνo-x"ux9߸GarN_r'x!<B2BOAtF^&Ou5h_wj Mc" ?^XD 4P0.\Yc pZu||qfJiؾT,03FYko/py ~뽩PO_ u/]X9} t *)c|k Y8}iuOuq޷(<}-ݺ dnLBb 4|< zij8tf'8+bV ü, ZyؗnK lgŜXO\/1>Xnv"absCÀ1 ݱ#wy쥊9A0 (o`uݷ:Udʼn,|٫a[4ϴ|v!cAn<*Qg~=K2 M|ρ_?ŵvkO=cL:YDBd1l;.`mլD&=iXJIБC_Ɯn-uγY}d&bݧ)[h}"^Hgу&&sz!ּێ!tiΐ  A,`\ G!]2@;-{@nЧ*$ְO#X C1iEfk2Wн!iK}PװzbPZ7sc+}Jφ̐q5:1tpUvoHJ\$6ڰO64bZX߉pK&CQ}R.hYÊHcnMPk+SWDRcʐa4#fW dJ >fg`D!0$r-CUg/"~k߳*}o i.ZEd ? ]?K0C|!Ŝ2%^HU bC\KL5DHQ$1#,CaEd&qBB:A |;P:&\$! 8pm WYi* ibHvl(J{_??ML~ H0/v H}jW@Є gupG;ߥ]e.img`_xU?!]J!"u~~W*"05?|d~oOgAS ´1#(H0 ciI*=t042Ȩl;&6MDBt?,]! l#&4 D] [ ʦM&h%Ѿdj5 FLB㱗o#E%" W6xdqiiIC)J.H\^z4pm yCPcP,cbYrV e&f X"}9~\jU#̼eQ8/=}q)|YdH+i ú~N{3ul {L av0cѸ&}8Kyw..<}@tdPjz ) 9&&84EG D0B>AiHw8J .- |Nf V5iJEgapYmbo9vofF79%dq&;ugQ\pdN_2t6 eFW)gga1>$bqeojj{vunnYv ϜޢLT(Ck+n3VKu })C>rPً+hXU!u$!dygH&^F 9#O38L}%/%m[a;_MzY툲DrB_w h؝E}+:2(^wIJϒ[ϞK(Z- 4|!qp[O]b=s wA.1nE n* I4l%lIsA*]/,m>I@@$8FZ nk9{࡯Gd''؎@ ݀ i^y~+گ8rv=2 XIe@d<@ 'P%L7F &^+,Dl}@rr$P8CE$ P&R`i_9Zc SK5i*ča<Ü :< %Up`;0 Z|'` |>uoT'^K0Z)>˩ؽ tT([ϧ.n_piNN(C:s/" K? zEs0qgav gJW|woIAǞoW?~4%|a?5xk/=lz= X{Pۆ߼CS~GN  S3dx3'@Le=/>Zepܳ8 eFTr9d#C[4'Hx%>(/,1p1s_Lk0{ɾ4PrC˩-6-3~\n\flv](rn&dT9Xsi[r?4ow 1!=} ]LK k:Aacac>4IhHLˣ'xAg2(CIؖG"]t #2ƖDQ{h"l!!Ąv ax8l$[4Ec7\?@l :D$n#ޣn!@tk; 11`YyqҸ>lwi&|0tdMvn7I$q"MZh^#]3A,V2M7`XDr"A*m(!5e=Da)M ":>B>9 &6Q IҕKrHرhЇ"1Dt]FE6n7""k#J&C13A| V_ hme{-S\bz1௿"@  ZКd;wiUm!%_oujkKWD`o(~۽$vH(u G _hG>˓8LVA?}$20c@`(Z#&Z$ Z( RF""NP60,k !`(AoD8:0 %V'.nZ>icENB3BEYDK9:q7#[9_* 4~O2{*7ޏ̵P'$ӥ18n\&W/G."ܦnȷg}-d} "SI\\Svd^@gS+W6H~hx' ]N/segfoI9x!}X1Ge7d%ʁk$yг}dN$reFH*LtD}}O~FX-cF dbvL^b}5#J8vWxÚϖ,qwW#кHy4F&4>xӸ+ZGLUI8ʸ)]tՀKN0rcdskUmQFZC̳}J_)Sf ۸mpГc͹l팳lfLSv.vxIl9=_6Y\rAGL gyHc\u7xU0nxqqT@[7eY.pUYb"g8F/qT6Γ6YXwq j3EJݠqIRkP %$ԏl sobB ,!+p L- A?d;xFG-,Os*vhƊ0)cXi*`;m0GFa#XwBNo"(f*Df>k`8ԫm.|!*:Cmdؗ)02{e(7^6ؽe}EՉ& XCp}M$xd투ab LL$L+A!$>  aa_T}f-*qB4E5r" Tb+Ib(`4D6inQ&=ң,[g:{i{o-+ߔd׶/@T{~óSrW`xpziH|gR2,< -O{g9;O}Lذ í/Qث¡é?,5,9g@?siy|^~? \wl*WvMWKpl&͍nqEG ~k1-~] &O>.|Vq||_p#(N&ͿPoXMA 0 e~v&fnյs~2 enFL=vgZ<È xgQdΏsdCz%U cCQ&W^p24Xw}Ǐ%7ɖh'w|ޖ]cݎWVm1N=s R_"r8x2$.I&,SkDp X}lr∮0N7<6GvscĭmkJ/ܵ8g8pܔ{ɡL9ֻW^Ce(,̀jSc1)[M\򝼢aӢq%7xU˴\`?Dulgvc x?qp5׉Ib)LF "2ixEB 42;5ZXIY 0#20Xeh P! #hI3I2u8" ]EWl D(!AXq1v}(袄&' x`o9\fGqg )Z&n$Fʔ#O0lё f hp@vp!ĩ(6 )(#,$ !q,m#Bca4A e(D4\I4L,l1R٘FP ܗXz~p;(B $~%}VBY 2ihBU2*Gd024Dn0"Fa:$:A+'4Ab IXG>%W<>!OzZH>hpel怟@w3qQKGVKկp70P'} .,'|sqD#q68FDqLV0" Kc-'$$0 Ze<\):H+Dh@aٸ"i`8)T`@xvD( @C2bac*"(ba7ƅpo,f5 ;[d[<9=,7(/ȫ,}3ǡC'qAJ<tpۓ, ,`䦈1' I@tNNR7ÚyUp lzV$þbX2I/$5i8Lљl^Q1*hOhH\&I吐 m ScHʲdrWMgUvLl|Hd,"E!bZ |&`u@`uJHHВv`5 E(J(ya4 DBV؉gCZ&vKC DJ`!Ri(AᠣӱgbWc BiH 0D B$(C$R+6R'wQP )T)^|IR?Ӎ >g7ad@]0y(+ᛟ\{an1})+,w+OGRe+RQð݆-8vzP#:7? ;:-(^ܧTJ.z#d7H{ xϸHפBp#i98^z}yUc>98q$=m[砒2|~~ppj7?xv?\لo^WN4օto9u?0No·*|=݄R>=/Kt..6}0]o\FFpvD(,fƷM,G36^ Zߟ֤Na>gIj#e'ks(NaejLp\Yer&S //bNl5 tә8KO23v 8BeW2tgC<6qz"7l]x#es~84QE,hWdi5h2-Vl,߰29d<@( +IfL HVChHb%1q$1IE҉Bb(E2^Ve IDATXĮT&ehE~ D#rcutNn;c2@PB!,IXi%àpwBdM+ ¦04άT8;=zX ",-6cfsH u] Ŝ*\Cr}/?e1,) .ZP8)]SF4;%WqAw\cn sA0Hb[3g$XIwUEJXHiWڎ"҂+ϲ$x1kba" -X1=`E R&-2 r͕@Hh}D-M$ t4kbpFKMT",O%ܕ%{Z$9(4^^<^(So$J6O\#E {@gy#|1.TϠ>[xBoym<8wGv+xWHNoiy|a bIuwrSx{ $>gKW,32 s; , ʤ{jtᏝ#-<i^P`*]p*Sn_yW(Rѻv?ז8N{ X'Pc>ֵom©c.^/h5>+wsS;Mwߏ5P 6\0u*l80X.cmE{ '0Zy^dSjtB-V"Y';@ǮS Y\>YjWP dI3GAmNVG#\lt/KSW1!8ͱ!7Y=6(f.!rӡ"bF8B|VbIaF۠h(xrfس ZtO1'+5z(0Մ)w$ 0Z,ѐ S*Ӂl}IuÒƒ<iid$mH;{ӍVg1bE˛]z?NѲ;!\i`Z4[XbH|]`;8Z8:ZmS)0  L0F#Ne꠺BFVJ%! Ѩia_h2"gIIâlh2AQ+O=+u@9aHCUZQBnGtf`i0LKjX)Ҁ0 HSc0$$DB@J)IB2$"}bB@yۺ|8}ȷw>_r-i8ԯ˿VA}#̽ye]9n޷=2+*kߺzWuZK-H &ly3c Pxca 6"@! BtQK-5nVT^UY{o 4τ#Es~~zln҅[=>ap.x_Cwé={b~;3t]΢XQ.72 ʀ&kpF>~\(,nw_y f3Bp!&na(<&l{>4w.n3ؽ#9+k/aܵ7cЯof?_^v:{ϞxeUq,%\F?ql Ko!W#]+Y;?nxL~W3)+靣o3YrggM^hQj۴(Vm. q$QSNώQ'qbѴ8JDd%>ڇ1^A *^j=ٳ0f$$yq{!kr~u׊!XixqU㓜ܗ3hL?30OXx5?z ;i6{>ʕauslgwSϿ΄ ;XpL˛Q?n)GOMA3K^igǷiq]:X4Ǭy|jĨ޵a"[>Oϩ-n_e ^ aQڿvCo=yQLbƸQD*ʶv''`` X tc`ɀn ,44I-O(ڹ"amHqQbHLIV%%Ϧ$'NK h{)fNot&E^ [>nr+2 =ϓ2IxQ(dmAw(Oc*F0|z"<e _'v(C2# ^CKA C0B,}D6i&>SQf(X+Q=K.6jvÐj|Luy7T@K]F<S$P2 R D)TIs ,b2.BD:˅AYR), gÏ0>EF>`-w?'5IwH>E.)B;hSen'IzK n'M^wL COpmQhTp"En'IE*" 84b0+n zL4Rln ./DH Sf,!3/)A JP 2E@jHJ!RYޒ}$@ `F J HRq9[`4a#x?s ά1m"AaGtP!Gqfw'ƃog>8Bc Y;5QKs[9MT0x:!։LNwooB4H~ |<5rJO@5'hy}#5laj >G[9o<.. YI$-}dgwndwP 죹 \-C>?|c1;yGn/;| K{xSO"GH tFAY[tr~e ɄR̘'y̭<}7u+a_}fjgNВ=He`{gFvq#bbV`'l7z'kt]JbԀ\vs} ץ۩# ]q* GzkhOQCM۪pXLѕmf>a VL=qs)rT5\BVO)FJv5ru+tq*k&0~0FLĴTkKGte0)0wTxրϤ9k~A|>x/GqTZg#IMӓM2Y*t\j׉ifN mTTҷY.{=fr D6Iwct#װ3*1. *UZ膁aHMdL[d؆9'Ŕ)҈XG"maz+AC8\S0P I9!HZl0Fa )ȥ 6tH""[Bb"eEh"9 Ö-p0h|`ɀAi1BP6-3H-A*J B tB&DFR)T 8QJ4E6[ĘZ-!QDhbI"$&՚Dhr_d_?뿏re$ !dKW^g2$Ԧc/L`$8"VnxExzy G`173`ɏ߸* |zu '[/gω׾zvelCÓOgO+Ys<3kCU$ujH>SpfƄI<*'<63YK>p1XBm h 03:k`TxovcwN]GO_^޸'<|ym/0|:}wdק`8m\od=4I;# ,߆mu:#zڷ ,¿| z !k44}|VȻvX zt'׹waVTd>oi}eсk;0.:W[MQmT= fh %^t;ø il25<@j7_6Q6"gAN?̐1C2u@}a$xOpӿ)(&X 0Q'u'9Ǹ''nL#`b$01rDMDb'Tʯ/ze eئEwp5< 5,A ,%QѽEa.qZrKX&J NvcW}F "Z&MӏtLLvM 8$APֱ 18ή8!tZ`o8#37\x iEBɳqSh+;0)\ZϷ>t0SL(k<~3n]9D6$A ;'QbZ. :%N6%G@98.l Xqi ֑B*I6B%N|baM7!oKR"])tLh="8ZHR-0 M !?Hh%JD D2P4c{X RxNW).>m0R4XjC|TXI PEJ IF+A0( Z1:<=*bQdy%AuM2 p@]~d7.*\6u# 'a_dqqd@PhQ2D2;llc4* r k9df00tf7[MvdUȿ1J' RxInFҚ64$GZXW%!z?!Uo?K;84Mp~gս{pM=s=93 կ$̀T΍a!1QS>i[ЩSDqJ|ƣ-V8`]0Ý b )ݣx0 S2BTwxL髌L<]B&lXV*ӽk8 դހĆCcfԧt5Fwv M Cv”|sCDA݅gmY;wj:Ng/)n˳9ыPs|?I N ǥ_sΧCzzgDgqmVXC7Mۡ #,Ƒǩ2H[Q|^cnR&%r j-jI#A.mX*4LyQ iŴsĉ&J&DQ 8[`-7HpêE=vA}$$Xl>L U{ mo(y( mЎqȲ&rۅmXcDee0)m]{k-߾d@ҽ(igv6LwOқuR %a`h 9ĭ뾁%̚7L5ښ iaTe MI`A9:m|j~%PГKx:AW-@,5M3bynn?1]P*n`YF/鈿e^:N!gS<|rcW)m ۖ\0DG$*!J}eKϾF3"AhaNu o\7/`H CC뿒`,W]zl6رP?opYo@m7Lf`:@`ۅ}1!>FJYP3tz:~UlG¿#׆|0ϝ2Oe)}M V؂c{d&~4{nnC΁v7c}_խL9nCɶo<g> _?}ex[{ ?}𫟇S_OLj~~F˙WۅZf5Zzfe[Po}~"I> KP^k@;w <}Xn6a5xa81kݬo#MXɸVa d2}:g}Du@\f=fTl'&;aL/0GFqYp.s'Le&O2rk Oh .tQAgFNce7:S)f!]dԾ#= |)N~};ӫy^iر_0I߃2[kLm'&(:E62/8/{^1n:1w.GN@?3x=l⹋_Lf;h"&gZEƊZCl>'>ȳ1S*q13t_C\8zӯ % V,n4t04sg=>Wf<0nDٍ6Gy˜[-~YY԰G=\ñaYCXaTd׻¡lWG äY@st-S b'v([U r#L4$]2:VRD iӽr QHT(*ѮKEp tۧ`[EX&'DaOJ嗉 m$]hm`h_$]Z3 5ab&& fŋQ! g`Ey|Q%"`DFdHIj*drP+ >JiC5"04#mAW7"4:h9DVCUE *o~U(b-Xk GBP(PJb  0B3-msC)Ra2e aqd_G4N2y3DYJk@' ~3!ϑ0pITQuLR!&2 g\y{}?+Ce9h^`ѷxg'8?^c>ơ60?ȝ=:}G6:<|9E<}!n"lrub:6湱(P 6$ #@K. %iOUOnZ3 :zY[tF$PD9A1{ҡ@0aRj\$~ IDATG`@aq0cӠo4OPh u.,5v z9r\B{yxz {},c 7YIMn>Cr͹~ 9ouqBot~?iz٤`HcG ,>g7lM9|quR@MQI@,RV&YJ V * V|}j<OsTv:}üm¸c/cS[`jI& Eiɓ~s(c&M 3!w[b`e`&KP}407 _nW,R1xcZ nr 2ThnvM(|/{MM곰g.,1ziZ> U,ࡣ˴p,ld@nxc q2&eqO{|>Ga3mܳp3{0cw;i3s.XヷjLky(o_ ?t$39[܂csk~_!EXt6Ngc/Oc\n|3d{2R=Y/ C܅Ϳs}r|z;X*LGľIFs|E#z7ʥ wr܇Yi2RW½+Uw)MRpO=M٘w+8s7^ [ ;5 n͠\ye5M;co0;Tx1& fznEq\B R ͷ.S/ҫS(YN 8E&/>şWA_92C웶yPȖ=ε-]|4}}t+&VQP]y7nOAMȉcU.VexNM(G9fA?9OE't8@)ji^&vJC<#LSnbFP FPcI0P QL"l;{Tљ bZ, IoONaw'ɍO/G]HC!C͝lw.Q\m%͐Q%tn:R0lWn% ~bc6$1"#l*F^:DT 'MDN@WI6$7+f@h"Vx&K#ȜA0=#$8AbX.c'4@P%|q@j٪F-n8E4&ɊJd짆,[f.2oفh !B 0 y]AueJybR1~BQHLbg(Hn,A(Aha $c_Ѥh82Va 0UVE'5дB7XвLmF M`hkbGN1!Zp E2CD:EF)Rib!`T@b $6Th[NZfl -f61t87ےh2>M.Q|!3)uJu_KHt(С<5 u%Ќm]9S#C%9?&AtbR/Ǹыi+Ytc:=T|E2hGMZVVԢ@q/nUn5Y[0y$i`L0Gʼn~ۂ\H>&~7z`<ؤYXYzc>z( %5~>fmjr[l[l9ΆCY&=lJ_oVnRQ^Mn35w`IF;(]Ut'QUiSb%Ϙ &V.w9I"(+pmHilѨox,ITդX =:BrME'0선;D^Di}:$#cGNtx5`e`8 6 ȔLвh'M cgbJɮFeP'8[}P4fTdj+Bw@mqk/1Nb2h:*ac/|N?sx2%֙wRb6n3vdwp1&Zʐ!I 1#Ti(HJvq MFhb"4")|sYq"E߀\ P}KЈ@;Ʋι<50^H=p}GR˅v4.fYń&)8``+]03 ϽfK=fw+pc N[՟$ T[&]3 0Tfy{EKݶn6,֟= FLp&_ ~_[73*; Gf`  x*<'j/At;mXl3?|Ɔ26ʏdFcx e{w~ ^Wx&fzq@wW/d_kdcg O?`96-y܁v"Rãe0,i奊Ո*-&FإA! 27O9K]fHP[n782aeXdOhGJkU:`rPX%,k)Ɉb&Xǔfo[i ̈́N2h \Ӗ&jG!6p݄t4e AY&њ&/n 7`Oy63)D蔨1B:N9JYgӝ!q֨VνUQf֕$)23|(t]b"S"dO62AE9ۜm+ ĊZ5оkX7@IJ9 #$DHdK1ܪː"I̱]}rfR#fm`܃؝.Reg.R#$B!01YC@R$VI "AT٘K#NYHA z7468THnhmP@9VԙV)JhVA^dny|01];#v:l#DV#D6aFIҭG]0>q#&k~cqɵE>E.|tn ye6kNVm]E'v4`gS0,=7s9u둳6: BOc^'6)i'FoQ(7:tMMfݶ yvbf ̲m B -77KjsTN7$ h#z>I br!t'n"01N@R0@Qqn\iɾx (ߦ#1>²0#3y+)~HFό&9XLqԢq >kIBfq(C WRM i@ 2 hJ)BԂ͚`/OtE2"PZ#Mx`$бODdBk&$ɸqៜ/Pl)#AAt})"Wj,CƼ-[y~O5+yI1"PX,ɈQLH6 Ʊ$}C`bźh<;F6IE*Ce'Lۜ{5dZeFc[BVb"uHki˝P[O|517! B~ FOB}֯C҄*8ah/kPA9_LlfN{3O5 ^;o@0^g2sԪg.JP>{?KkgD%;܆ݓLl{27 ||k kp`ޱ/̏??_p߾^ƖLb[,2r!a r$y0T̘? &|6ϸZ ^ӗ2}:읃z3{=pq!e{O=͟>< T32V9bj6,T]wnh}yآ]% F5*bԿFr;90ɹ)X3#&۽q '-'EsocYw޳{~okUf]tuU7]@cf4y2#*:Hb|=}]'NC xY?6pu]amnۈ-Ca7dCswDtSxSݨ\,Q:MyDhɊnG5 7E1EpZ"C*WI:<-L}A{m>IB?D]"s}dfG8j]2KnERWPR=BCG0? 1iNdL`"B_0?,z}ooD>dGKX8ŕ'\=c gY`Dܧs'}eeTJwtax3a& 85BqKBk@4NE40S dQ"C& ~6(CXT'^(>FӊN/ҫz:PiaJ\z}~SDBF zۇPPot8E"hUL61>R}o 9)Wd:AAt`SdسTC$:5'a|lF# 0&&'8&2*b#P#%g)QbDX8U$Nc-&[ʈACZí)uB$.Gd"!֣ԽI<%f>wb6v V`{VJʪ+6+CS ^BC 24tTEbRT5}rH70bfRK* _YX,r_=V PRBij1+4.`24Qxr3 s8e>fHKSX 33{ϵy˒G$ubэ w??m Z"sw?es{"S2 cҜ[҇f8NJsF)޼hR(oT.٠- W A(7 o,x@ ا,ϿtfK/:݆ӋԹ~\6x } ?9ӹgx$}jco'sQOO]: ay;󗟅~ǡ;]=?jN^_G(qo}(Z.7欿2],6bqpR+:zw'QZ;>a|g3qO?GU;Fw@߼Er%W?>MSyYclj<Z4Wxr~]haUV´FEnsUc#lmu*Nm>lV.]ʱ: IDAT/M8|_V㰯shTi*k]ySF'Z}vfZ<$+p:gcP cM [bKZ /oP 5hj))N=,[tgܡ{<75Cr33tִS6p{Mf`n^.;:] ̸'9JT s;p{5 ФA rn`gJQ$;#J ++Û)cRF""a6a=L{CbӦD0:eCI(bdV%4äV^C3vRNc[E3g𤁑TQl BWx0*T<(#Fr[0T{t "7&´|dTf\O80=r\:SuB5M\RE(Ee):Re0sc`*Q1Qb$4ZOƌ*\V $FBK G!I(o0MTB=zih"A yPB #U0Qi-(,,!V.r7R G8v3}gF#2@#@MHPFfc#"#uk2&P @@+)`[n`Y i(-@0x_Y6*BsăM(5|e tPIah;/  JYD(:J)24 E =cZO)PB{`3@ɜ6.48*D5O yJеzP$:F%]>Rq5|4q\cX8JTGAS꥘ L堈*!K  9bN-j-i YB|6ao4 9'p֢YujfpRD+xkV6ՑH熶Ccx#BWo_+T*%l.̔TpH-y[g =0Ml1DA7Mܲ\HV/kt|6 S~>& OWϗ9}Lj;8D 5b%g32NoQ/05ŢP̔w0N^3zWZP A_Q}TiZ#fg̕abq!Bؽy*)ugN/qp6 b`ӈ@ct(E@,`=|C-K8P;+pWT;McT֥Mc}N;'?~ 6oE8كPYӆa1?;c? S5]CFX[Q ,^} 3Wrnoq8u>|f.?w~}l}~>j~={w],«oP<;ߑoóϿ>L,g|d%g~ .r/B-AͅAwx#yfY~5 ?WsgVgW߆r.?ryixyjpsy֏7k'"/n N-h?++OH0mӘΰ|^7d7'gT?ϑS:1h/*cak݇k=uO2sK\\|]-7.r˜=޽T~Y48<յ79*)YJ\dIq;7]V6[5& ?W߻kVvTF 0~p{oap̞C&+QUI) L$)DmT1F2H3 1u1B⃸[Dqn+A6KZ 0q'GEO<"9m. }4-U z M2qi@ =ۤGCOЕKDb p%%H^B5QL,vb;^1I2qw O4"} C``E4Lf'F_[z7TrnRm|f]ف2tcYlN]hOT?~5blxl2mO:hP8&*N 2Xd17]B`St _*#=ѫg&G~=I6\m/1 ' 5:E;N3gf^Vw n3]B.e 2/$x9F3r *P-wI&*BD$,V@i)t 2l!(O}_c&l|pQ(@ . 2 -lׄB M:CJKb4LaiH EU*$!`7# D12ȿ\|PL_/9?ri0tnUXɣ K0`4'*\^B]/VT M9IVp1 /B '[ ۀ'N8? =x |#pq>T>`t/N"! ? 4t=_ yk.s!S}yvyT8;O2*gڦ k-_X_BjNoT];DR߾OK{ E (8V1=JTGӬ,|xvi_اmN6un0y+(O)wSUjq̞y; z ;U463qIPo]Yk {qL3zt9?f%%7f6U\c=,5J;|jS5yVnoR>wGIRVfT8cVn+ nx-P56 60JTۢM0٤8a|j%f&J 7<&2ASn1:!joSd#EEc)i ˠ+a[ ۘ"qЙ:B+%l(e'& 4K:uqR/w[o`h)cxj96Q4l")d:ŪkܥZ]dGi5֗HCaetu냞ٲX/9c JKX2Rkĭx=crx|@1DryصָWݢ7*:6B+azCA]p&iIysiyΘg{;c6QYF _ .X'8;#HGCarq?Nj]&kct %Ʉ? CcCTտoli̖c.2:s?gp@~ʙxC<Ҕf\ NʒpXaeSkLmNطG4|$ИKDJ,&9>B2otX<)r/]mVo'!ժa7bM{>/au;Zݰϩvp G{MF̂ $ NAf2Iz@\d"uO06/RL$xGcv>.C#zN.b|"%diڤik)^ԡ>]))hIEW*7Xa0EJ[|s3bxw\i4iJEgC*lBslQ]4 $fbu%c' OraS$!AMI|5(.8FٰYz,R3I &#,BD3I 9K=]#q\zlnRr%I$ŴAL<2NRFzU0=LB25)EQbLtzm~e@4QRR/G8PKVAacXC:EAZ@g|kpkzEǃM) !PBSL Qt 3p0 ДFw: a"IEʲ:)&$0ʎQNwA᫧k0T@1 pڈ՗JN LDB5ZQ #Iſ ?57_<ō7$mDl:S&)Z<`!񣐾LNJ=][hZgFe PF?I%&LAʇ*d0uz?Zq-N!K\bozvs߳K= !rTy4T|d ~ .XX9 atߟۻp w򸦣}X9Ch5syשCq*A8T} NMoOsL~^˅4cҎgΏ)CxǠ5==[h^|~uX÷_^-Ǟy Nzyyu*s~fpv.FNނ3F~f˹Pk@k=O}WOCE3 &K—.D=*3%G~:_X> ._@;E/x»Y|}ԃxB/LCZ`- :}MAm/ LE<,czYH`>TZ)I3ŚOHeNHUGy=R6#ڌNW]C _Na/ꘅ:]=A6"+eM0Rwj\,;D-?c G F۶>A.,7 ug戥5Lco" =EG_C R45Mp@ $AM*};nR E,QJbr!i`Gdi%48'XEw2ƶ+Q(KqAV2|Cg!*"-ﱡ4B"Z#ɗxq4CGz)jH>^0Fq"  H')B[&1ru1: o.zSRSC6=bN Ϋ!Ȥb `>0s<`{K ',/1MjiO@U*$g'DU;W86WX.~g7^a*qmtQGL#/ػZOqC=]&4&)>'/~7yvc} N'6-^jR4mFBqnҦsʪզ_ \Be;R5™ㄴ: x+fv3[l1'd^x)s*_U64F&]ncamlRB8u[xnY^Bn }(Q[ëfL{F}JZ2D" IDATƨ?SZ`PC$"qY,@28FI%Ǥ2qL+29&Y DhČȜ-2R^nc (" Q`^|7D? j D3Gpb IS=XtJS~bb9ziKń'MV2Iv229&Sbۥ.v*==)TE$>n4A蟦i(XbQX" %!44Q#jRx' ;ɀiY4i2! (s Ea lZ[;Ipj- *u,CeGt'#7³:Xpo к:n=! rhz#HE e&#5LgrH-'M 4 \Tf>| K"Zwu6,B&M@4 %3dTT8Ȍ %YDBR4Nóp4 64^]9͙ j(.? =ТK'{^˨ 03§'\ddr[s}Kw|þ36CTmj"tHK$:6\Ȓ8 Y3! a " ViՋa ֦/ ?8B_|x?D*]H|"(5yhՅ~w圎LpWa{9\h:<>9k޻NNLvFGp|6R |C߅7ބw߃{pj{55>mC{t,(0 paYc~=sUM0^;ww;k.z?q~e?] Lsof^FهgCx4rׯ}O]݅yYxoo<7z| ?Cy~s'/\_=l״ЄI 7PDAߌW& ٝ&:آQ}9p9͔.MɪVx|DsL!xCgڊzsT!ZlMbn-,V'xw5I6׬&xd>ل~u 9b5hNz bs&7γ7GX "X=y:Յa GpP:E0S魱9V`PȘ~ ¶94iP;gLwa&w/u%bi-1ܝ񘚜BK$ |o1gh^~tAZ"a~8%ǽaS8YXlޡUB ݳer ]$)uH?#ypTB\vQOZM{rLdIDBTa(e`B&|z?q #7,>5ދ=#ʬګz_Jݨ@,2a0=>p`f<9 2XVU-VU]kWUV/~x%?2Od^D}F.vqMÎ%?tXq02Am"J;ݧPOXi`f81'ǹݻ\gy΢FC,W8.¡{N|_~ñ212JSj7Bn]( ᠲDf@9Ÿv q1Ę@8,R(HJ#T<%J21 H 8$q EChܶCAKDyB-[( #BV-2FH c.T"EFiHB RUdfh 6h[\uW'Щ"7)Ͼ)d!PM)wGP# C[ (ewEOO{kԏ]ۈ'n;]<7/wllDp?Ou'Syg<}U_/9u*kfLE_3[6)D:B!Hr+4Y?"C+йB ۂP*P Hs"i0ɵ@(e94 ÜPa02;} ~:h̏TMZ>A.c$ըN.03̀8HIw"`3hKDZƽ.qBVGi,ֺ: ?Id-bYޤ;L%ĺA5.uȑA'vF4N21պx_$T(FeN@u6IZ%;ؗNRa|~l sw=3%:$~*}52p?}*ǣ_9=u]7teGVЦ;d'7՘k#ЕP0a}yf cD4o>|D uN^#ѤnIh4& Wأ9yNd^Jn)pG3ZsT9kf;\cI2#&CL׀dI!\=bsa( κBkQ o-UZ% x6 23ƌ=H’9~(E!],\.(i:k'/tFe^ bP2C]4 ꬨ)B,@s 7& B M.I,_f9$G"N~oK. mWL^|ZcƸ(b$Xx,BqЂ_,; ?/d[*w{b~>X+p~8W62lOZ x'P~xMIg JW\_y~x"<=)x(|!Rk ɉ!o\`\sb⟳t>h+ݘZ}mxE!ts-yѼɽ6 w{]Yk\l>lyEAϿ^Nj$*d*m,*WO}#c{#Gy׏^Zo?^3 r59IJrz'_WWIs{Gq/a ^;0f!p0*-W799b L46x,o1g2ۨKS,!wr61]##ϳ{ E?~qd}7ΦlnW(Y NZ%epBi:&}zsl6knǫM4Jw>FߚH$ wg#qycg7QN ϺC?{ȽHck/1?I-ig[-ǧQRo;w.C^buD؆OU`Ҫ 8a8w H\` ۭrSU NORA98N4Tƞam%O淋fb|RyetG+~d("4Kń[Kt,E@"9'!D(T`*LtVʸWd&'bh"r:'#JRl |)^˄YOgq?W_Ҽ ŹWKyI[!*05|es?Ge;_ضư+;?uMjah׺ʦ6ݚ̼{c"Q B@v1FUCa]f5]OR`l!WeawQ>֌~l0]n\̕tW"3g,`z8V٥6VQM>$\}GP'3rћ 2ޢvF 2s3\gKCvƴ*dfiؿ`R+(ɉstm: y.>m vql|zp/'}8 l}epܼ}8n9S(4e԰8Mj՛:NvuzVUU 6[m]b_~$H%]4GThiW1b&fdpj$;b1vMؙ$3ldaIQN`Bt ex 8QN,R"ny8 ,1;`h%Xy[K 2֌p&ZdjoKRSd0-l# DjQY7/ LC%2X ]b5DKp!0R.$vrK4KS5Vj4,PGrs=ݴ:DR!J&i#!eDw/[vgT#IlEA sMl, c6.pLma%u%P%c[71V4\>;A;m犑4)Y#טS)by$dBvݬ9.Q&rnaҲ8$͆JJ&uNNY*l]{J7zLzv~y AQ G&ܸ /}~#,zy{ ZOo%XV}>ñ0ӂ?T4L _GayH^({NQtD/)ڥV`<181 }m Bi~G$x|4_Q>T2i#*V @z,|Ih;$#g]ʫ?o ,Oַ~2uՄi^k!_&XıI Q69EfO>BY5Y\ݢ}<яwq!y&ZBdݠ$*uz=^<V* ylETV^Grɔ%@Fۘ ФS}7Xo4iWߜ%2װk?d0l5oטu3ܻsˇpoy?k=Ü.wJL7n3@nqNΙ}ӬR#{e@s~XnS.lDR/N ^n:SC8[S`:cT8}s GHߥ)tolCS1n.AHllcH|Qjc`.͒2zQ}JJ!18Df Q,0$Vh2$Q))M\҂$!)#sCy"qx13&U!n@'TrӀ69I/!5)c˦l+ᐕvt`Mpĉ%7vl{ {h4HTU2 (` cX>衃v=L0,d33u/9\IɭiCKƤQ@Ir#r$GiI D eب a (70,# E4< w5 5/3X睟uAYie ^k9կWykIZ}j -萙&˖G$CLHPY ZRs Z#@eb=&=Ƹ RVfآ2lV3wψ,|Y)k LlV/1~1) Ad2\+O\psTO \d43$e">NA7ι*3x@’k ?RSsUJ%E)pY!2fVVRS!4cgl^~-Es)Z(௘俞mw}`[ՓQ ކ.HOAo1߂9>ZHo9CBAŸ\.þEJu>k7[pH!.aM?p`iڝh&|CY" ;;X:O{.f& Id ^O)׷!h wž s>}Zu#pt{sW &I̗]G`<~"}˟i"AܱGoVSa\A&m5eg1ly&/ IDAT}eo{n 9z=m:'nb,&z-k7q!c +MZ{;GF/[!9QbyI䑈m]zԧ:ڄ{,PAߠm&m#`hظorL܈ ƚgUDŽ%c:Y=9vޠOb.hczNEABm+Wrno,p [˱.y`E&F0.,39=+unnʭ=,"9?Ool>myߪ3]סkBVFCz%Ü~@ZwjYR{mZ~p8:!C?6yQo !17!&Q&]s'j,gL3xሡȉ*a9=TrgxsKIHc J) 2(/!JD6i)J:!NYҐ_&UX`Xlz2&YrIHM+p>]GBB7FTQxJκR) C^-\!tXV^,ZV #KPR}@ ZƐ) MaJabq! W 2lH/g! '`!Bű!DRA4RBaYE c/Pa#RaK1hCXURP\e **&G:m6<%U& `)982ز54lTmѨָ7ƺ8zM*S8s0zfq;,u{8P,8Z+ T N0?\Rb0X4Uag>\i׀lW3"Z"(kܾf"UDhƱW?J7:%eZD1rr(dD$r;s| e;7hQy'vp 9H$jNMN1m9h3dk[lBZF$Nu4-:NIDZ&9 1YǍS(,!R0 H钅!2DTKB#T1.SO]:2'|s4PY~I)CHP r !tFNDBĒ%Xƴ-ҸN˕w.N+J oA.f2X:ipaG&5N'5:gtOWÇKҽn+_y0okʮB]3MZfe0WHdšcg}\Gbܖzŭ6n6/&\~Bu(8sÑW ޴r)dbb+<{w&os.F0> 8(l߂kP$aS~`woA"̴gנ ?{ 7 ! 3uzwm(wV჏?.T 25%:>O'\| lZ߃zv:Tw[A&8/R/> k OY܄O,.{P;\?4<F@U WVgZn?q`k.p|`ﻧ_<|^|aJ{C ‹7;)뷗<"w{ܞ䡡sI{>c#HOXר f1J]gWy*O225D_sʄ#L"ҝiʕ.˥]]"{ S\CamrL6S; "&LfiOB#niDώi;J|&35Bk܈ѻ&ٻL;LѴk.+wn8iʽ  whM':0XbeHƔ6P`&̌؊jY'~9dVC & o}刽t1eTIw]Z*ٰGqIЭPw"B?a~Y>;zI4$w lq8BMd 2R(>ۣd qiVb12;8F}ј:"*/!a= 0QfLoIrT'DLC!Y0Q0iU`6';46AKX2K$"C\ÐT)0 =^w#Qib%u<kHYxL5Aqr)<0! -MPf4%%̺آLj 0rsIRa b*$(V"M (Uwwa$LDI 7'mbu6D4:Bk8h9DIi $Z",Ԩ1{AS( 3<矻EPfy֎'4s logI\🱹nяR_EOjEז(W4 Dr7y<s5o(uV9޲?e"Srg_ W$B%~E V[!5(Lr]Ȥ3P9`!D)2QJ#Tj%+E (tE""2e33Ȅ|h"5 ;UV@=oI[]dR]#X+%*|70=ɓ1* 1d D֦ Tͣ ]pBv42Bs3;I R7Ldu2BuS|;6M j Le|T7iAcc,&6ݤn86xZHA`ln&s ϪYS|'(]jRh(ko!-9v339^wY6{(6ƔȋD:+$JQ:A*XF(3FyN8H\WGQo }~z[XD6u4@O\ŚTؖ*B Uf"n;m<ç8Xor=) <ԋ7W4ْ\BP1-(A1I5C $Vr(Y`SC@3W9 {0_F-(aO-K<p/\.6?LK~O`_TGlÏ= a x: >2kᡃsP )k¿r<*^ _/ +Ax|8,׋a }n YÍBʽ4YKEN 3Kwqŷ\*#ߚ,w}u:6Ys[cz묯R>H"cv5v-zbiy<7`( d>۸u˺õMJ|L+lb,pxˋ_"NL3xͱ<{cY7dG t-" LؕC,6}Ir(Cx E[%C=y4SyLa|skVSSd9C$ ;"X=퐡1\,.gFNڌ cDEfw>}OEtG145㸃cHӢɘX4H8"u jXHRaJV N` L.LRB$k!&AGjhw] ѭ]=<3nB8 *mS2k SJJ?3dXD!At"bBiQ9 O4] /PNGfÜƾ [C"M+r:LQ 4xՙ dY4 ]{wϣU֯չب6Z lOP;8Y:>; y3=^7=U8|;]9S2_zU~.o*쟀 !l{~LA_M/kZoM?U&|WziQO+ԃ0OvIx{JOAeUnX~ŚG/[;{ "w1[ ǼcQw/I~~kBR'r_lpas/YL+|5𔲈ul2+kL=*\ QTDCXw47ktzĆR1C ^2&idv#nO:8bhb 9$Tg*Tި#Z{f9owVp*0)^ti<MhF6Aj9ڣ15LVF) 2cX1n0Q?րoIz[nkOVX|t]/8xb1Ef@2j$4F3l ~¶>Drf-s.-@'Kfx%s$vaIMYtܟN;H}/TkWɜ9d MEkZMZMSͤ) S 22EhSg.I*Dq}4 ]Gnш9CBQg;QCd2}, @V]b,CLxEm[=5,cHdou!ܑi2TEBX&.LdHm@ [hY`)R l#(l*N|qO۟ϙ/=|}'~瞫 {Nw|w>~w}xt/}< ] G9p`}_͵_wd&EK}zDS寇mO37SG6nkʿ .0d=H'( ]1#PXʸ4 vb  ;Re m\ SܦLF]X ]159QNmr ! YAm 1?d.ˡ:(`05YF2^ IDAT~;d/Ѱ=6#]`«+ˆa4dX gȇk,,NQu86nv?!x#˸1$"]R`rbeCrd yEar8Xi w_xJX1[< $ `fp L[+!NlHLfvix.nX}S`oD+;,of͝ x μn=`>y?cj?\V% HbNNk Ve2J- L [ t@dƠ""hU|w@]-#b{}ll/KFm -k'2x=T',$q% |Im0JS>%`Nww yFr|e--paPyW`> 8|kKگxvɠhx=V_ᕗ˚?#%`p]б 8_+/])xww 578Cф,4+p<<h@X _|V:%4^ga;S|"_y_{Vّ܏8 I2l}>6W%އcM!&Zw|O?  >x^p|^Y.N‰eʞh6SxpBOᅲ: nAŅ/|Aw$!_PA\Ĭ0vk1r%T '!ynB h-"+:wܥ=fqek.sM 86tXƑc1~s׎Ăќh5&ia{okVCR#,*6Z'㯞gv43±t Pj̸RXQ܁T.Nп}r!}.MD:2Y~j%68 ĖWs>#T@7- =R+b4%jmE㲼o{+/63k!G-,FΐQK')XYɘP8dvMʹz)f>]f-}Yd'ʘn#s'Cs:;mO>[p `u&Ё9I-\sX 68FSۙe~as[g7Y^#b_8%)͕ݘɹ96&F˷Y ]Zc>W< IWPƹ"$dv|0@D;"Jvta& le&\Ү&H˫NzKר5vEm3PD l .R" \N×AO-"BZ!S W՘:~JxO#-DEͦ~hшhkr}3сH`+B#E{䖦(<,eH`!`b!@‹ЖJų ` pջE_ibnť;^ ~D RS!X)b5r 6vEclAgVϲA`#$jҟ83{5t4,pm'9 ?z 9,7TyF[ymkd ;rn ڲ;aL^Ş{|) Jcux7 }쾇c dEF̼=o[̴4e#oYx ~]X @x6oZ+ 2ŭ)?f{, LRi goAc liTJw7˛h6JWèL$\,~ lvccxeX[y6o^8Y*ûοS[q\VNU%ۅhnlX؋C#*|L)o|~Q~ }O҆[ehڡ97Jh˃*]fƵ$5sPA`4\m *NU}|"x[_q?b*@Mho iQ_p.M$aL-LCa'wD l3#2.\MR{3.,әDίtS0%z԰r-lļ7Awf%تJ b1T3PT[ݤq|붠K~`oXrR.;cu'8uc{ ec?zx7b1 *煖$FL|}8Y[M2f恻YVVU1:NBZS*wH8ۇ8w$Y7eB&D{ڠXS)n"'"Ĉ3@zLn4SK},s8;@BQN4N!鵩G(*oR,GqZWHĚSu=jȞ7HP ѸN4  +$HbM-L F׿J9vULb 3UD{Kݓ-rPJĠz8L(y l9I-&'/ƨ'g\;{],.lΛQ6M9bO9PYT!_>Waa*3#GVkxA t>cyU C1DQXuIA*ˁ"@{dUE[)R8cF9FhCdV4LX5VH_c{,!tbr)hDŽ.zƣE |Ofsvy?Sk;ϓk'ݚ\GEIƗ`~']1WfcYy6)N8+g7x2[ø{[vw?|=E&Z#qDϘC^W/8#кs~tLgtG/2 E՛G/`gXqU~UoUx-z-sSh2a˂0M`yRk(GcNJ6J)b寁1YQQ%H*|EH#56uIkqҡ0 _L>: f4:*A0)} loڤ /lpI!19|w;}uL8.bYw/cQd=dԻ31.'<CT5-' OLɹM* UuW&ͮzCϢȸh1'>D[ :j9ž o '4Z.&hoO|wH{w+sTxdgIk1"fl#^\Y \qfOǁFJÛe I<~Aqqa_]oI HL_+d Uhl_Q@m'#%٤@4]*F3w kߝN]@PϜ `;Z;S8{}o4w?/߇}K}J?_zlUoy8q^م-Z IDAT[?x/1\+^x쪸0|> 8 [p2vA#,ˏUWw~ v~waf<~ yecQ z©Ը2\;AumCV*83f,u}#vobcvzAt sFԸ5dmf֦"?] fv,Q=DboИ38%[tm6yL71ym a$ J%X2pcLP`͙.Oy=puNwf*"`ĉ` |4}o14r}~-j#sÍ sVd C'jR#KX]$= XB^-j}3-v/㺳vB+P&n]jpnuQbVLwiƓk)v*J/`6A-tc 6a{a(eD&Ҫ*p=ĵ.^TkS v *n"K6#bn%d'Z]XQ)R0/0_z,<&7ynӧiT Bd~"v ľY{ }zt%pDl2"G{dV ˘u)h]YP.{"Ҧ]q`NyJfl-(ȏ2;KWj?șӏ#7ֹ#q3w Ϡ8o |KO/cOU0r [Sr)ei=(h"UJf,2 IЈ/tAI+$1 %C 5J٨X"UF*%ƹh> :y6.3rTa y8ˈX̠ wʡ :/ۙw?=WsLqDcCddä9Q"Fк@-v])=1 ts\N1d˾e mΰ@) 4:P*w:L:<c 3/Wy4 ^Gzao;ȲsuΓli R Biڤi˦iY-͢DĂ@ K\\.6Ά3={{7?@nqQ~կ9}M4vOe+}We0%{=Ӿku;E8YS.)/sd%L-3'l\&\ p_ӯ,A`K.!jHYI976 o= KT .\ŢOO{#%sIQ3MZqē):Q{0"#j+qٌA'p)I.ݐ:' NRr[Xq "=¬DJI A(eW#tb0f5݈gL6MV901rzc?λEIZ."j@8vG ¾r!46qzyTg0kq k0fVR!NO8!v@NױY"{@j6"t}E²Nʨ5%2s8I|+=Cke qZ鐨iHDq.%#$&F kyB}4NFPe@a+<a hH\ Lr "/$vcy:7#wb5&2}|1n6V$%f",~m]o-pzGaeL6$q"MX`Hm0dL0 &)d%vGֱ0C&^`jVЇ=nGȜ"3;=Snamt9{_1p͈*(em|g@T@7Ae HApu&HT .Hp=EWц7CTD-7IsO$jnlc~&\z_`}(d,xIs6B!sR˯'@y; 3>|@W{'T7Z~K$|?~6acT*arل1\3IVjH_}^~7_J* )x2,̣MpLx58:_%e.!2L3`So80Q~i;(|cxF_X.b /+DN ]Y`'*2l*o J稺lm2LHmH:60n 6_o_bܲ}~2 +'| F%Uzdi]Ru*VW+"!AWsTY$847) 1|\n.YK4aQ)p)}k&upEVs#KZèIF[mƲ'3jk6zY2ɹ}izFhmX~c'8[KMˊΐljRK/Jyמ]"a}Z:G'-EU) CKWm:1 + o",2c..X)1]#e[6]SXjb'&^Y},3釘BFlR1}cz}: ca|׮t2hG\ LV:@_{mҥpSg;5%mE97AccRE67#YdmZq~ }cPgHi4!M ?P}ypr)HfUs8!l뗸F[Db#lprv)C^<X{AфD 4t &(FKTMDI` H#M E1I*F'QjbӄX%Rb%($ua@ ѱ@`F!|HCHd I,2r&~2u->_\;+/OUzcs @K &VI6Bha>z <'Kyb6"hW4:*,tv PYhE D(&_BhdbB+ t$%|OkC൉4iѳe?b_a@c.8P9U&=a҆`?5(΄T UϟD8!)AwVZ{u  İ\,FKi FY¬=#hō S31=a$VDZGH=,~>0;5J,Sf3Hi` MPp[24/UR>*#PqS54 ? ;M}86Z | ,\|>i??O`v&Z6k0U'/&UL'_<| 2LX: SP- 0?v,aL/tb}݁7_>G_}&Ùכr`> Mx򅤫$x쏞O*g?~ tr$xko~%_-Xہ~Y|v_g' N'}fB{ExƷL*& p`B'AdAO7&a nG||^5}vn,Ӆs+ pV&>Ȳ85"2*%;Gir'8hl2R~T%_y"Gnb vdضLzeMZ W:dfx,ӳyxE7`YgXl~Ě 2 $!nQ2zi6E;ʳDB^ވi#&;nSX +dz(<j ;R3G}T+N>"= f/`cy3 6 nK,7X>BQV5٢2 qRq@ Ɛ,t;^t#-нEqh:_""fo k7QU2y;q%|m)HU{X[D~0o]}CC::&' M%3aD%XEҵ B!tp&Pw5Z`Rh 6Q@#q⏎npǮ]mB/&6]4 $4P&|kck?[H%eE^~‡x9 -BSL|g/|1)N'd @i0bI RM֘@&Bb @BchH %hI V Qw #*D.jeۧȰM`0 d& CImqE 4>'}ޛ8:[>vF A.Q(*LrrR@ XmxxQL*#>{}#9[/ȥ˯`-ZTH=i NJ!FF!><{!  8 d fcy0fHKA1(?D F6@T QDr12nHdKb44qǘtI>^0±L)a@;6waR{X44"#(@D[ kltbvw+{JȘ^EMoHs-®ATCvVuR pf=1g G8vxgi1|qg25ccNv MҢƂ٥]-Y#u1 ZjnyC%q7PjLcx vmE.̟/rN!K.=YC۷ 7Φ8:7YMm0Eq̳9p76;e8<87 )(#6i6J!c#utxb4nvjN&q3.nB_+`:q8zT͚7X+"#8$6|Ov wIER*\6B CbKp0QAÑb;_qTYEi!"W6qƿWs|_e=f'nrk2'jo)ffL ެL]f&T41:/:|B13C!OLdJ&#,S/~=bU`2YS9M8є3oݙY~|fcH 巸zW}W3qv?`qN|G+h(_6}{85rWtA U;;ۋ/mQzoY0s܌.uedMkcsl;^y!۳YěZ &׆drC?CdNѿb:yQR9A;k]{߾T-R& a:>[b}2A'qKNߏ/~EaXc k['`-t<؃Bnhl9oOv ݧOk1T2h 2.Z/_{wD+|ja;Eػ NL^'wA)ĩGV*\| ^۝ԋ 5sMQ*ub*j |qQR,Lƾ$n/s-+)u5W=;MRX_!?t[84;`O| h\.LGf8Jһ}ObӽsO|i)lV.v/r bw'a!Ht@  %+ 4!mB dJb"RITl c!@Yh05Z!DR Y>ZYH;B BX:`D(c`Fh)ߴ"@R)e96|4F Jj eb%u>_Lp}?@&0-OC IDATnrԋ??ϿK`*DVS@X81 8VH)@D (Vw#2R"6QBh-A+4?tCHD&:Π#ҡK*p/+<'LjA{TpϮ!D! |^ݶxܻ3{Tr%9bqJ!M3/kobjI*A+ ]!XVl'_1=e{⥛NNR*`ðmUri10FE1-I8} ?k3pbac2j9rQ͸JdZF"{ nC|#&LK8٣6N68˰;1Gc`_$䠋gD#t9 a'`aqZ葢I~z*i[}<=#UL*)nOem #YTۥ&>'Qf (1ޫ`tG%>ḇQ,Vlp=4v/k9=7Gc(`((1F׷[,}LU56ji̢nu'Ygn(޻jX ɼx:8FI5.񬩙玲u*[y=ɲ_eYe}t="I$cla$uLQahi"l JǀDm:b FotV%;#I7 Ànإݦ5((E4- wwy^NJAHjrǶe1mW8 F%B[7FH|EXAu!2h o35)af<&-EzJJr, PL[(D#⬑&4b\pARjMݘ-Sj0BH'ZĆCʌ` wF4nx& Q1P(eb!Jj˴P-{A00 21X티z># #91L~>6L}& /}~W d]'M~7 [: `'; _P@1sa6pyd ?1aIxc[0]]XҏN~BӏٟNF|]k?[G7$4OBԈwi`櫓L7y;Ɉ{6[\p#)ҧ՟fmiHyT"_ 86s]6;!>@:ЦC=f1=f謦b .e\mFgICuQr=f71'ɭ`.>t {,NL3EK*A%~*un~ĖhV9P|k!7kZ[L䟣muH>gq&M$Kg9+7=Ջ,/L[#x&ѡ,kvvIƒ=SS_l*W44~p|[3CW!, 798llNha9WMUTB$4ki pK~oV{Fp&'$QmL^HzhVN7Qۂe`P[ m;|螏s`eǪ=WlѸ"ZQs/4[E,Y ~ / tZ<ᨘXc L7V&gzlIqjJ*dkXՕ]f[;;ViR^n<9vَ\XTkMŻI]䖱iC$Yʄ\H|X:>I0lPɳ>_m.XͰi)mCfnlIvvbs DM>.r|ݥ/2zmoӵ(Z7 nSKeTG 7Hu^1VO3Qnl}&kǸ&vɎW)19sU^&ՙ 3P0;Gd3P]vP Z,hx.R yTf1if|q_0 Ue0Y<+u`nl הT€q#֖$MSK}^1;զxmV-3:jtq X9"-z/MNfc?G1{7.oQ.Ny1A/إ=79jq='LyIƪ('ūGjOců3H}} *(!*a:nDdRTr-(-ZcMlH4a[*!<+C-ٌZ_0! mSB&ke?hO+c̳2j4jhJ`K FmP t%vDJbH3i6 $XRQ0l,Yl)E#8FBiB HEd-AiKFL^ r"k2Mp&BBڒ ; I$5V(EEbF'RchP2_ B-0"FJJzK=aqفx-

*LMA/LA/PwY|#7s0?p~)18: 7O9QgЃqx}˫ՀGIK}? ;.%kBІ&'f>@b(gH:[D#lR+qDPypZ+G?l];j4&|ͥ+%qy#s6;zf)QvߦZtgL_ߞ {X'ct2˛*Ty`jJ4vGK[ԚiQӒUЀʭcS #RلzYSⶐvC* Z5mAz4%;  /a tc83'izoOx`p[ *=Y\1 7n;.Xd۸K%ݘؑT4=n7 b/0i<@q:,Zdӯ b^}OKSF)f$yIٙ]{u JkSnlpCQJ"hYmrvɹclt) lW h2lW'>i6@s|@ oLis2X*mҦMFȂ2 6v_Q5Κl6>{A`2 v!g LMM>Eg&nzxFF &WJaN.0 M;+ [i5 <;oKaY'Gwjz\ }*(\!ˮΨSČ"zc%^ews$n B/b13!A6KmG4_i_2>~k1L۹C0Ywε;N̲LtXB Z"F -$'P@E@14 F"P1A,i26:i bE$J.JjDP&Wq["w+ S HK)>O3j??ghg8:g:Q~07GwqbM+߹W< w6{SR#ٖ}g2xj v>JAc&[bmlcM:B';h*:X9_7z'wyMQzyOrn1Jc,ҏ\RrņwG4;SbHP&H-a!!fPDε7Eҟoh(J^ ±<-#Zk(a}ȝ9n5=B-PgȢGCQ$!Btvx6߸Nh%M#R!(DZTUVˈ=bTL70A)*`C>e6L ~7d',a 04m8P cIx 2Љ –G!%#H<n Ɍaq?8SB{n]yx{5<^n|m8Y/% |M#rqBrW^Gb+qriȧ෾ gNƌ_ ܍oCΊ}șD3?'q?w-k: y8.=Vk7={{A1?|mH_X~p}OIN!WH940&ZC _r}ݻDTr@t\07OLU;a)I}Dۡ3ڸƜV\9D1+*pBceS>aI};DA0Fy࢏1ݫ!z"H'Mr8?$\w|/6؋[;y SK@ܟgw9v13OpVx/s[|Ph_cBB?D ]in%_T[a푽Ni()֢hF$od$5M5Z/ر3hum%(l;QMhur:XIKnIUp#=FYu0=^vUJ<'۴2ž.ݣ7n7p@ 6:*otujG uZJZxBBґit\1]#T0j%s ޿ŷےZ8MZJEtb "^S=.EC=Ƞ|%}@ (g/כjX}m}ӫMrX:ܚͲ1HEKy4`!:H~4jԒ^?"Xn)[z# ^' (Q}Ն = ʑ-, (i8J=MTE 퐲2Cd3C2V.b&Q21t*9;Yό[N(^.DHC7$d}3\.H CR!0XLE!% ,M!GdUAZ/i;ďfͥn(B A\2-M` Oam:["&# GJN! Bk䂐F+5 IDATz7`)t O Ej!MyMքJ*ؖdH-9)q$)&HGB`1kFMgG&' P "B  U"VCfgeA$(>1pp?*|r\qtj ?W}sq~>_xZtpܸ~JӠ290]&&rę8yȣ10;bHJ( t<,o] x뫐O!],N7OW߄O 'F|N{8`0KB1h}=^^(&DJ//û{_7? X]L|>=pqX,^/^.­Q>=^ݳq vdM^Zſ$-`'`y~N"11ډ>~{ȬxI0Ո^` =:V>c.tsC>"w>]2gPxǬMy1A31= %OʌXzȲ=`o wxCe/)Rۏp ~ x;4s{6Op$ߦJ]t1k  qlwF.`7T Pk`$SԧhuhIZ&sL&菵x#Dd-t- McY_5#%# EAB@w `. zpRf"<$*A0DBB(aFG+.~5rБ2@HD.!TQeD(T-% qE>HPHGi$¿F(oڛ/v5#_vb8 ,Dt!~4*Y"UCFBG'C4th-@:ȐPČrB@ĬTD JP|@GD"X-Q2줖gIv,#&TTT3CJ_vh/s|#ߏd7wɓ$&Wڽdgeۭu]X1 {:m"AHd5c%$U nD5Wia3 i$d!&h2,dfXJjA3@-NryA0.WXM2Tif]8EC4 F*L`q&%@Ɏe.*6{ @*:YϱlQ,J[ےf#8b(MP>٤N7ѧOuQMIe8ppb{FM&uƨ̎gitnu)-p鋤3c8\=4 DAFp dS-_:(ސ]aݐk1x.)(+ U}, -Pq H8AɲP$;wh2dA( aD ⣢KIZJ8*M x bɂTVQm)F)y“$E0tq-(x0ݺ«QĄf`D)|FT"8.դ9 +)d:va )3MO&[_S0"EQJMUAb"BW H )(j13W9d>$F`o}^3~ h r{0+]жcie๸"i+;w_ЬB}(-730|sK?Oc+N^cѱ@͗suX?{qY z_xX~<c`n0r^+wqS/0OWs/t .^!|ext.8=1{pnlO(|\ـJjO?"n[1Z,4S߇W f ?1Pޫ* ;1^&(Z E =fNңSxk0wXBq Aӽ"@..r׮X?Kf"Z<6ty zGghJٿNvoi ZwhBZh_,j#Ю)cf&QzV-S#1ݣyXa,3+J 7IuL7 Arg -aev9Z!Xᰝ8:+O.ˡnM 6W=2hv@0E'^`'r=\bojvoIiS(yIaW2d GsmBx} v3$ F"!S"OH^&t"¨P3d|C( jHC#CbhI<fN+HAG6T:D3Ba'tL@3&R#hZ <[H1VtZhn;}t!N teo:0WX)z!a*d'xu:ZHɢ"48n+=;;~@)XAsMĐ(?ww]jEmvd<0$D *dUo"~F 2"í*v;5H)XEDU% ! I*2D"tD;bI#qE7W2@ ,@(GB'UQ}-fQ $fqDG# < R4"B%N!BLDCPh(%"`Ax?>&(7Ws͸Yi`HdhDBX^Mtԅ(!ȣQ_(1C D ցJQSz"@4"DPP 4@D@pU<~ajCϡ@s38͐y莇%sʂ-!7.E懻tBB &w6pzYk7I12m]7K?7` I"(Oqn9˦0"UQm31tkzq~ A1C=LL.X1VNN1ۤ\śߦa8gxE1fMӼyIdܠUMP0íQ&;0^duw;!s$gӤu4ʃr!JWTV#<d3n3ԝuYژaoeR&\rrS4wlZQ҅J Zs@JNz&_sYPi 5F4nbIZteJ#hfgtp""%+DE+3 v9A mz?G^iS.Ly <Br@-?-ҿp?~zf e/L@S=DVBg'xbpXs|eNL\%˓w].@ns5Nym虣HM|iHe-ڷGpS,CG dhc:&J:3d\lwPbObZnzR#yBX#H;UD!B,d)< O<r2@_z=7g{m!H2"\ᣝ=O4'O2q2/ QJ͡ǝGy'~~qfcFk^͍xC(<N,8KEMcsOȍwGoO,ј!`9O#ugRp/I;Gw>WuJpo͊Ӹk*W7~077`(V ܟW5>ZuoRv6iyvkRe^D YURYQCʋ>;}N˭`ۥ!6V-Ikʊ;A yJwPE+9^ Y35ɩxkOǾzs(on!OcaW8/,Φ5}x fSGOS,Mi0N6Heϒ#kd+=FYn3c5B;K y~tyE"FiGǘ_x}"s\L&Cw5ԡks,T^<žBɅ9xJ0[潭<+tB#/mZnrؽ>cXETK(E(jI.*(0 OH~ GYRM)de1Dsdydc$1G67L c4K:/WKJ(p Vk{Ivn,c$'Hϑ"6"LV(F.MLL᭬(e((a J" g3؜e4իf5s,|=w1 t.! l1$m CKg`d|D&-Mf_;%CL@න 霆pФt1zuS[ #f/L5OL7!P!a@U zPCEmYt9*hЛɰ`y=C'B1.Y hjP6J4nxx]'./: Wɯc{FF2N;rLz% *Z8cç1fUb:Ȱt);&&"+ɌȳuV7V/g i4#!]b)ÞgL*S$#6(84=S,SY>8I>j:j{49Hݢ3ѳ!NMxBBn[>oPmhMe u Y-c$xͫ3"[]]F{t=5Idfb&9WyXB;h+ &[cՍgQ`kR噍$K-Cӌ!QS<*$2QlRUfHv#2 Ogܛ«if3'h?օfkh9\va^G/:E~ڧ{*U*#fm{&S$z F5yOf8xks|<NAfE)@#̒PBSuR5Q{Ȳqi:b"An-Ng2W5R2zD[TlYh+c? Hh8ʐ(}J5VNPsC%WpL1Ɵq NyFcr+TI3G2{$P͠| DYn:f e*w$45@br$GB9H6|q\_a:sSR0k'#M|s@R^$n uP(2;`j:EaFaӣe2۠q8aZ&ejNwo_))琑0m&}1!aD L6QbP r=C$0=3dG?ݦ׋P*Jjl#h.aoHW(by1*k׈PeBaCߧ~"Jn>Ku0L'dq ]-J;yK$5!KaN IDATA@aD͇mոg߶VQ~JTO: 4Nw@QIe2X$kd'qEDM,5JbyzIQؚ|I B?(U'MCLA>="WRgYoY&onSv]U2(aEP" tQU!DF*Z4@?D @T0BTBPrx.bh >e"T 0CPH/qhHK5J tBiCmQ!tUF&Rh2NV(nbA(6qOSA E T]W17*,lU6meln:Ib̃uMv٧XVC,њ3p7qeNO`)UK>E;Nb὎H_]Z[rl`=a}g/wp (ExKt)uz{\.E8vyY8lKb+Lfسj[%3IuȠݒr&m\}@뱮2;qm`9!MelBۉ5sg>_;K6,l%4m֨?a-UN9&">>EO-E˻Y!u[gj{ GKso9}9]̍"w-rCȨN0_㞘c򼕛DIGm3L\`| &'4-^K5)IE[cgd%i5}Hkc._0k\b`tŞhF/AhE^(sO==bo1[![J"`~CnbL uhIGL^BYR`yqj.*å]jԽ]߰t-0D-\gN1gһa^]xI١ 6]'DT95}}d }p, (>a.xz/Ŀg.>!o 9NۥQeU#p _x|H0zۯvpl ,Wazw@Bo@(A?X^"F,r$B&l Y2/dYT9&M0V͌3'*8VP$a!q7B[D鏣{ޕ$;"3);$BCvoQvӈ #i-Z@i(Q>5а\ꐮ %uvQr鿤֙ 6no섁hi+(^\d:̠RGV([!AA"=4/++3^ߍ'$NZ!)J!gS6&Є?`89Wa $_#n2s o7؈G"nѣ O(j4ۈCrIˮIn0NM["*Ҭ=~HWt_ަ>'_@?7=&"VFX 3֐95{ص%5V_#{PerQ|~բSxMbdvC6YvCD Y+51vc~$1ʧX\j8䛇}(L.EJsxy/v v񿿌>*-1FbG]&!E2aǪUwuXi];R̹/H "riY^񕟧#wP=rnZLqSu Te;G]ʳ:DuR#24KX@B,Rst7*8sEwH=ġArf}嗥]{X0h%<^[VO1l$ˆ/8ʸY׈:t$!UUaYXNUbp(p`#9CdaO;c#)tPh1<G&!J:>A E^'F¥v!0)8NG #IKl\WB:O )"b1dIġ(_s-B6<ەi`Umzp&&Mt#Ʋޡ;(c]s[}zfk"ԆLDwiuަ 'k@S'9GUCAR GT2L"#BveC)BUbrpn8W]as]7==͍aF,1iSHwDf w)TE~CD w{+%tD8tCb^*dؙ#0lH=0p=P6oZVrIBQbMb^aHJR`nN6kD(ٌ-F~iJANVl;}sD}LSlʭS R{Hn;k@+CVT٫I_9J>#xbMii]CU}:/oS{do3eV!Ec`CSVpֹm[>m{<.찯A#)qԡ[dIb0GQK1R4$MdM2y{:~ SO2V*~DMavhM'h\WV,fʐʌQ<}>aֻT|k[:Bi&W U N>1 =9C~X'oPT .?r.&S/]_fwK pSPO} G@po3@C=s2طl?8 D ?8A'شzf3.iMBTcspwH&\>x*%SG9wpw7x >A 2ɖ?~`XWa~'a{ΞQ-Ӄ򏜁of Az:E(?Xމ{S,ڣy qpaJ]dNU*2Ud'H98yg}f$} c8ֶJ(p* Bxx.R ϰv$R1{ pUawa; ȡ(`UM8߬axkRFnT<g$l a?aJOZn1Iy`"+'8e. 3y"c*>wO |.%aׯP<֪`:da8ޘҩ*qrZ7dO @i~Lڢ{@戍R8ϪmM?N*$4NΠ,#Vޥ>"ˡ/u%-Pedl.٭3(A“|v8BT:w*~r K {2 eKokŽ6%`XLXn=2;_; 4"]@%;GyvU()"#b' 2k mDdB c  y0W=i,p¶"x"EL ܞO | Z=0nWy`5w]L!XNWADDlHX='0EO.C/ E% >D׷ q v*vL;m,u /;"-t4BBh"}jnꢈ21Mm8-*z?tϠNxZhP*809 QOB$$Zef++ē(cC<pM-'K6^wqCeQTDQ=tq.~dZU=^ؿs OG?yo-c|`oCy(g{À; YԀ̩Ǹ\9dt|^D&i'y' 뫯n.٩}:}F÷rTEXLkFrWd%أ+Lg=O-IǸuNpe]~|Y]2ޟǺjK5;:@r `С,h^8Mvǭ ].W.<>>Ov5e<}wG*~_z^sQ޳'ٍnpoq5J&ŏӧg5+0&d Zn&L˖e|bt7>⮽be"ȢLE?eQɆ\f*# NRhϡkaA$<3̠G3hmݯ[_m1G\ X`ٟ!!:1|ՋSl1SYt|AT0-jl/OO>I.FQ%pUj|Ww[n -$8rQƢqB(~_vCNcpHljCH.%()\ElE~ݢGc[ ~s|~YK\i1&?NMxEg4M2q.7adF'<$3c~0|AY q5''ݫa>!c91,__>M'ۮV$ 0?0jm_o_ŧ^|ce6|wîNkC9w6{xڟB3>f֦+W6HS&DSI*7M.r@OʚA## ,:#jGR3]iw, q{顛\ ?ܤsXRk=zfEAtF\ Q?yQ;RCCLᙋKki$^]xanO!&9QE9N*N:6* ^ƛENukVTgvvGYm]7~ s|ꮈMFNRlLm X8>yOhxa?T c>dzEI1i%bscYO`.,PI+opnm#̝#r׹Pc5z#1`uMd#Ȟzbe Ѱq<@1}#|%JOBvyB-dpdrH>>R uD_Q,HxO0e'|졄xJ0', 2ha*V]\KG@ A@\\_@Tm|KAB ]Iv0VjX芌"iHH+芇9Pdy& -H%FT1UT״ F%E%l]R&QEGp }ܐGl!N=ԢrFdd5L|}H"9Wpy"VmܷAɡ.#z%KJ (LIhkF( ~OmLנAFLtH7Oq"aUA(:2]J3EⰤ` eRΌfH'Yѷ㨒Ÿ %#q IDATN V^fD3,X&TA 1HP8,lj+lC8A`@mdL r(*i;{IEN7Ԓ6hczM,BXqAI_A<,Q찳{dAIxbT?[WJ\Dj<.6UCOӹs۪~bQ>}G8;o18rl~xp6wgy1~?ɍr/}.OT`B(vuw ?^`3"QvW5?86=v5ǥQYN{{t9K6iAY%cYߜSߣ+hƯG8=30wmǞiI|[94q+u<}۬]/[4fߦ^"ZHG( sMĬbе$Üɝc=u/1|8J: i l׹d`%73Av`_4=8Wr%Gx.|@_v k)~hb[*7pSs[0|nŻ7 % J>לݭ 6G~q%R&NF)ݢ~~ġWYF:lŴ́y -EF|,2qY"ѾO6˚4Ƭ,kXߡfΖ)Z'c0CxeA2[ߡX'u.FuaRЋ8#?F^I"g֩tBLfA1oKr)dڛZJvqVez! 5[ 5CoҮ8Dk}_bU+:QR[a`#al# f foPmADiPڄUBJ$75t;CCİPctDs4McXLK1n^heAv,DqhTZ$Jrg;"Ǜ2#o"IEA˴WENk*{o"d'&1H-#lg1mJf[';7MWTlԴNR~_faΉE'g8rev(4Bi#J0Eldp%l_xuA|S.rзD\!( @G`  /dZC Y^qM`s,;t ! ||1h88"?zez+ck8-Hxn fL;w<WpmD C|!_\3x $ykݎ$` В RmKOFkOd~E! >яfIK+ M<:IocA$-=ʵ/j7P(ehl;fpHe( i_!4EPbqR-ck`I!D;B;OF+6G7ﳨ#۫!4 fgnǸ)jxm7KF]G5=66F u1ECnfYUI(w yaLq$p&Gi!b5(k3r_rhu|ZOb@#p6^BGd@;ޤy5n,J~ GQb7Dk]\>vqc4sHFKGqI(2b6\df̌,(ŧe'-I(7;u17&)hYwKo ;bc!P}kW 7䣪\O⨽9 B|7,LIQ v=B"v?z*֠w/~&8˵ p]YXXrpS}?7`p _Cqk++p*;kr 08f+ώQZoU5LK ^TQ9 , q(VRP:/-ODثDwܻ!\WٔD&8bNǘMhn {@'BAAhp]`ìМ0vV2,-p4rڦNI'CJ@R"Mo4C)ⲊߡH &7we &?pnq ;Yf F8!Iq}gR.jyN٦OtJsuNe9yx*cjK1Rd ]')ǰAV%n['!TG*V'an"bھYGz,M,;cxO-:0Bl IIZA"C䆂kaAԢB:QLd,O&=»ueJKGc7>o"&A:@ղFFXۺGJ dB7e[I >40P3ER4V$j+oB *m1F1jj֭`i(uF;e] kMT1@*_w oNe# nRDدsWͅ8 491DcM"][@$ YlhuD f % $|A@}$d}PE\Hq1<IpE|('"#`K>2p bpl\EA=) >KG֠qLc;1b80;lS$ >!u<_n56 f8Y m =m$PlgvuԮGS4HyĔKL)GHt(*uֆCcZ6+%T!Dj ]i ?)`v-l30b%[tB!$K=dʄ)ЬD ¡N7jެ E1 #u\Kb+ë=uSE,T5P*Ț8T6Ct-B6FPdH'd3:̂kDsxW7IaN bw 'MR#rt:fmTjgWJ`FtTkh;J'F;a{X8r\h`elzkIy~k  Zܷ}YQ: ]De4˟@Uqg 6;0 Emt 1"n/1+B@Y$p6~@a7\DuMKD z1dIxZ~)ѸA `:;$[),gk",]!IijqG({M"B_)T $V3b1N^UDГ( ^$$}ƒ:f8Y y Tܽ6rI0TwI2p;쭛﫻! h=;0=AGEq!"^r6qǧQ gs#I԰ﳿPfrA]}s˯s `D4mqiZK,Uk\\V+Yi ("H @$;/?.ֵتr=U_W=tͪa!"QZB+pIјs\3*;Ha!tLT'PrKY^Ʒ~?N^e`W$CʣgU)O v gm{,.Tl/` Y X ÑG;aȍ–)RTe^~ W21:j6\pSs8#"Q@J23InCL" @F9Ҁ,4X'x)2Fk,м^hk3y'zk~J}ƙ|Z뾞 Z$9,-B ++PIϗჅϿAw7^^I-M8>_AxTwO;o):EgS$@{6x9 _~~ы|b`zEK?o:{{O.mK]w|b~q[׷a_ /t>^xƚE(;7GnѧCg?_*/-d)a/G_~?8o=ݰ(d{z?̼.D&Jn,=M6&) ߶Eupo/ѾFچ?Z\&_îL36؅IW763oRF)M*y/i: U! IS2v`EiER ,WNQ$UM v{6$ͩJۘP080;k'7ߎtS5#vE6͇i,5Opql?0 :I-yzVH[VRELb5]ow$5d%6$&7LuFl m,vW(i+# ͉3hd(KȕF kI2!DN"4n'QĩFI49V2Ԧ$bp>.&&|\[P4 s߾I{_}Tr`>dyT5jb9ȎKА0#AYPM&Z93]A]jR%Qb+ó81[$ q,uHbMtC),!MDO /d,XxDD[8Z!giYC +ӸoaoF=7'5\Gn&̓dMєк%\)._Ͼ'˻yy^WjMJ)R2{5$cMdiɘiTqu<ļ-X JV[r8 ,d!cd7풆1DFѫ#P&&:1rSz,.cUr# ,6{(ط ;0HDm9l,[lE]]Ƨ*aƖaLŜLi(f (a1hJZ j ZՌ\ϫX{m102FtI 5 r*Y 3*cdI1^4##e2H6!T+Gܤh!w-<'/jHӜT,aP@PM (8gP]E2PCN޵][Cʵt#J+ܱE5z !5@) ]E4(& 8qN'D`1%d@WxS.aHwE@;N@Fę?K)ƺ2?_w "xk|+{68}xۂu>܀S7 <~f޺X]*#* IDATm}?wc2LV`? (ex,8ofa\G/ḑH=,8+dBuI|9(qAd4V"=&d^f84HFCTW*/5h3H1kA"ROao|&Cg$/z3{IFYڄmCGh#-H\[h`Stu~tcD [ 21:ȉGh\$#T+C&3 C B0ϐQ$9>Nmkk-s':na/]7}c>vaE; /mÍT;?xD8wz&KGEzEst E֍ B} \نS dss|K߁{m; a׊<{5_(zjPu^ !|RRsM³K}oNiV-\B])z;p`_z yT|x4O} ooNG`Ó/{,~ fgC wi)_=x 8r&D+_Ϝo6**FAMo1T &\u/scz@og)ocjT"8U܅M¹'J8)U0MFf91Z1)I!.diE,%VC6r2C&"aLNQCdqPHpA2Xb20a qevՏFSL(-w8*&N7}C=dx^u1{Ӕ2A&6Ziڱprc'HKrUeH>tgJp,ȸzitr \)%M.I4#3!R*Qz( bIfTlVQl\j"(2t̀H څ4OZzKd2!=AwpcƘ ihvzfN~<j.eud0ObܷN <kM:{?l0.L4#gKVfrO`9;^cC|I6_OCQ4+ ˷p,r'ƪiaiCkP i2HC+dbȓZTFylA,,Inz;NZVtv Gsкw|.fL3W ,dt-Qړ*.Y+ҟOAͅ/+¥#=|xQx5)Sn0<q3?o=Vȣ}&Nj3ˏ)~gK)v:07Q0e,{ X 0.g>go*kn!oᮛ u |a? s&kP^x8{,`Ђ7ésppZ-nC]%Xkؓ;,ej3A% bxy!H̤}>/9|SE3‰mLm? w5[L߆h^Ĥpbz\ϸ⣂]#uzr?YӰQeqˢ)MWca%Yj9edDu#m&;$:^æ,sܫ3%lfÄV(MH-Gx˚8W-ۍ9/r!ʗ̜܏Ku^y{>YH1OQILOϰ}6(R>15DkwaC_wIWjKz8iS i?K7ީop?KKl1gL3LsN|{g+*'|c[Z^96#)zsG*IкOw8=_!v"-~fO+>ZH4Z4¤yAֶD%#$(6XV:G\x22 &Q$rdFcaah0F"1A"Bʌ8aB LaHE }Cw|oeVKO4U/\r$5X`P$9Ȁ$QZȐ* ׽6b -RvmdbH-ьy=,Ajb)@A.%hJj€q&H޶LN@m琛 li)d9oTTO3WtvW4&qw5ILMrԡԻL,Y#NPzm͜gWqxLpdM9sXhX L8pv8hfL*Is:R aD% 7QJ1QdR6(#.Mq[ý|I#,91E]-6q<< VTuǮfRͥ s+n{mXd1VɬhTrj} Ig4(',ܬM6 GǞg!Xc01KgWhT)4n]0%rF1lll{ 11**o,fko@ P bRi,H x(G(+XHafHk,|Dg )=~"U-34$mrF`maB8#, 2wD޷RNcDpp9 E]p5nPIB ߎp(Ѧt$v 0aBY14TPHiYjȆ=TP"a؉qM%L"vi7,SyZ $zH$v ;'gx{pvɡc{GȮ(>3]P?{z/g WAncc` pR0Z->u >@!> !ٟ\/ïmC-g,{:׀K7o.话f!m~ҟDQUv`gTH;߆8RT[i??BlL;Et7}^pzlnr[u>^x'Ϟ?2/|poTfgwrq5= .Tѯ)e5&`ԇEv[ ,=t=J&9 qcon,sAt ofOF9`-ߣ{O?W]rӼ%Gq."N?3[D>KqF9n~f0V2qA3o,0{iޫ*6 ;/|{-\ғP[}5>%o~Cqd.^c;<VjyΣJ(dY^55c`g_}?FP^U7!~3;M mb mIu8an;q/fYFOi/(rk̕CXo̱y V1GQ{7s_= {2KK>>^oyi^9&~"yρ >̙B~qk$f\jX E~<>bH³ pNջyKԯ_ˡW9:˝Q?s{z_gI]Ib_=n;s^y N|[0?y5#z+zGWp. Ä|р=yGLt?G-^ٟrcw9eM8K53os9^{/l:a~wbWy >oS^g-x-o=54-}4:‘u֓ pd~°ك{i\KPv^'_ĈW(pϩ'DpoYIיSCLU>Ώ pDFzd?MMH[* 1N +ω)N]yT B)DEw@d"cH.X"#7 B9 M%HJt&Cce,dX ,C)C\ *dRENj[b]xGIlQBt }- E3 ѶB8y[}i9n7&N5T06B&D5SXBe '1*8I 4d,e$YHz$.(+EIvcuJ M(>H, 5{MhF:+wThlX|^cYTc)䢇!H`3jlkڣ"zD$v\]wTblFFJņSf|{5T( en>~y?*Q1 4k Y23ĥgsv 2Ǹ>W ٺqP9>ؾzSSbO&l=j']xG֞& 5]aM0dwp{rPwG|{%# sodIvWy/^[fVUYIUM@- =Y Ct@w0 HDi)-ZT}̪=##"c)Df6c%"=_9s$H1.k'.Ϥ am(, p9Oz ZIF`~l}1Nk8#gyL2#:ΰ$qBx&}4e`F4MHҘز$V4[H sr~_r6F@Aېa%σ7Kg?"2/e.ҎyUkA Gc_>?,Zʳg\]'3JTЎ|/Я *L2y;drK߆_I;2g6|ꇠAs_ݙY/?K?9s37|Wc|8<2w LQf~[j 0gh/]WNnpWvF*Wɬ<OnV a(U '0wV`c)'鿷K?5~``4QIAwwxyu9pk Tr yXD{^ܿ,!\jypd[\fujs  I4F5o|m;(4cvGSʭ3-F~r3ϼNzi9;9Q.5ߤO‚}ߥٜ>_wVȡ;;ԟX5+7I&X(mߩTԫȱ鳻MWQfqg=SW =&1p &nF+'ƩFlj Gр|&[G0EQ[ gtB۵ ʛbk?tiڦGXQgMv5P7qO,Ai~>/p EHlW[ `迈k#%!R)⡀ 4BKbapJI2Y~&FvM@dKZ4G@9 -Hu(-t팍Le,l*t O o\_>Y;:(~G@\ J@A0%FHб{M!DIS,:ZiYhP 1c6Zd*fd BC(h(; V{+4A@d_cetst!aG sTн!2y1NJ寷~PKHë8mhJ2$q`;-DjᅚԕlxMMi-m>}{vEIbdg7)*K^G 'TŵMO1ɗ+[t|++F㜹~\}y157!.8VMz1f=t6 Q'U]i!{`ɩ u2;9˜m薈ymZ=Ӓ&R]QaL%$ Ŵ.X$)A``Rɀ|aamgThvBYBб4b!Z!~C hX$NLlG# AX=F(`VJ h.^0!)&D/Sߧsj9Dڣ- ]vQHf 3!]vء?X&ڶ *s;6r.>.;6<[\۬nƤ<GMƸX`-E NI bD >T][=Sh4 >~>/S:Cg~OKy*@b".p ~NЏ|W~MNY8{&Fn#cNWtwc׎KS(AU^V8lڷ+;a?r'n^E# as!J /֗y᥿Vy mElhZqhň|s9.6Ie`g(yB)8` Su"3޷?.[Xpr$nѥ~dcb 0-ң Ҙ4A* tlOgbafʇж6k20Ϥ퀕ϢJ`l2y 6_ݛkPeXbCzvF26F߅o ?nxXj_|J&3`3U}6cg0Q?~s$iO`q/fYQ:Q۵2 o/4\ق: ߸?AXmz~ɓk p:|pmz> |־0\xp: 0t'zG`c :/^J=8}+?̊kYY_MxLMkp2/|`g!΃/ TU82A?u3 XAnr?qA6h6-8zKw( &)/S]&OXB:.WQ ikX3TK'\*n#]eM1dBR 6bfcW;!k͒D@?1hr$G,7hzCc.a ˫p('선6I:^kc8FEVN#{qD3<@]=-sQ:jre% O0? u6 :g!d:#gwL |s5F7Ļ')͞׎iC7w֋w1fn:&{Ѓx~¥r)g1*Y<(D0Qg}/--S]-#NFeڡS9J6:O"vP:}XN{hbcB@eXk0*@K @Z75($ Cwx(S42#qڂ#Hc_zhs$wfTh&:c}eJBΎX B+0EV@ -). T&!S*m2Yh3E ,*H-B K7_BZ fT )vu3TV\xH= k@aPWˤz *#̀\EV c&V&+`ubZ !مG?&A4Mrya9Ei:ap"7:HET"&Sb-h!Σ9d2Z,b)h1\NcJ2F[czl&f$ Thwu͍Ȅ0%|=*϶賺B.Q! 6 (:"u z8f.%6رca̙v0{wۨYk! ǶH,۔(E똧^~r3G~Ԧ7Bax +`otKj@EJM)E ,IrR["DA4$T&Vu1)&I\QLmfHj(lW@MZAV{^@͘(j<).9,!iecs Cǐ$@fCl΀P^0ST軻$T-)@ssD$WqQ$pЭ62NjT5H*B>dό^=ЌR-MK[Uh߲IE4GQ @]RTyjrmk@F.ڀhD(AL P.Qwb[@gX`|#IH}vKS>x]?":Ʃ eV"4K<78VwQ,/}gG<Aև}{ .| OʋuKb:2 00 =4j\_}yS' GٽB>E1{$n*Bÿo`X\oyUXb.q dnTLCoXwJXCGsa%t' l3wd}l3Y&ol6ÉLV3O?Ozh inQ8: _#L?pd~8\Z6|$֓0=EJOç>ɩv-w,yef^2av.~eշV3;3`Ղ˫YUkb탳Z6GO5Js0\315q /<^%+b$/=w6CXNwxg:t&<mϵ96C$01 1U QP"Wc=FEw13s#Ǖ""ghΰ*LE5WejIõ8Mo#;׹Ča(I s8}Eukv3PMuT/aYK "N4LN)U!U٤$4~~fC24畑 C.C<5e%3kmߴvvmL:NX"FKccۣ66]9JMۨЋL*jO=Q ϡo2=%38?KxRvwr [Jw!q= m:צY^L-X^^fxu/ƋLĕ1lhZax_cYlq9kO;Z'^X4XwȻ:Kɺc59V1S66 9ɑ[^GgN7ؤty`}.$J)NZ&KfcVNEgpݠ*mݏ3L_IƘVL]_ӟkb֭_g<9^= /3]qoĒ$[c|E>ɧT,/asϖ|'Kqe[> m(lXf2A,XKP|WP8"tC(D RSh0Ld@ 56(Ca CkB!5oE B v afQ40}Dɓ@ 2<"ABj:HeH,in2IDYZ%QJJ DY6M HQLi-:cM4ZLHm,I.:LLS!4Hfy8>-b0wh=FHT;oQ,MۊО O* Kl6Fk,TV-YķsY|;d0#- M($1 l~L1LCdDH`sЦ#ϱۜ@no?^*-_G%}Ώ8q~f[к )|_>Dm {`鉫\kW+)0HoaV I_[H_<}A}o|-w墏lBBpGBjd IDATɡXXFAF)q?p;s}D}T!XiDl,VnY|Ӷq~=A5 }}9?{-$}p&N1Ôԓ8:G$%nh42uZLl 0TT#Tp5200SX#5zuR [nȃT 0,gIx,̿%y"e K0;Οӿ3`vqh43֋Uxht2p0|Q8q >tɕ?<{vu?''߁gG.dGnal;_m {~$ 09I!?nSOdm L }O}dzc_XPü{6|Wj07ɷ0,]nfVwZ]ÁxL==۲{p :\sGg>xL .^e}6{+PZK}|@rc621.2ニ3%z 2dFKs.])i)M<}`1^$OPtX&O2Ѯ!ҧvZ2 >וb+fǐ6g\)+lq&y$C:p%F$baun1g10mj: i:4 )a5΍9ߢblwi)Etܥjl=cECV-:--S4J%*2s65k -sP4J"gcGiHH2hJ7.5ݾF`WAZ n4@IjhŚcգXO~HHUӋ!rPQ:}Gsr0h/9 ai %>ňMRl tpXf@IlOP-%78]I&ڄʂNj0J6n'qQ{E+aFZf+Q-$I:e:iZId&l=tcӈ>̑ڌ8 *[M |fTk]?e$؄է6;},-B%-LFڟݐ,'o7tkv-H ALՁ/|ӯ&J #ȊZhlCLvI#͢Tm|1~{2μ=ppړOaver1e:BL f 1T J28Ff ʃ4.z(%qFP |ǥ DET(u\wӫ=p})mg@=(D@c.;Z{'n@s>Xht݀n@l??D30-Ge k6}6_JzG}! *á({r q/l\[-z#Q`pʍ Mvm+665= P#$nET-Cia':7wY<̭Sx3 DGj Ff؈9Y}8ۯE^ޚGZV-jB;S|̖ә-!:uM|E Z?s =vN^a4ѲM^ 8 4z"Lf|]d[#:^p XZCW rGql8b6,'d\ a080fzvp#0Cp ׸R04 adr`}7ۿ eڅS\%tDŽag NL 8\o3ĉa$3 ޕ]7@@! %R(hiDQnwGҎi5Y )C3DoF7ڡVuygd7DucwSNfd072"}5&cP^= 6]g0(R$ٱlp &F5LeZf^s( vqFE#TR n&z1Y qYT#TޗF]-cMS8*\݋1OQ.ٵ|~XO=r4Eq-`8;K";S=RgE)}d~n$P 82%yLem*Mس+B+Kϡ`6)~m,zyi, 6~nN@@Cc]gx/omw56L끃xdNџǪ[46<{R nS"_X=@.ty`ϫÉj1Ax0à mc%?nx[5b HakP6LR~rd-M;6 1~ l]D7Yh/WK 4@ |SnSRn}W>dc-O_'+98 `yILilO`)%N%ʝkEJiRR $ U_G++K$+vF/n|61=,4WQm.v׊dŭpW:SMdbpCGimzU!# A&R w1׹#e8rF*3\oy+)Ǯ ŭ5V44ew c'٢4>k)ܳi=ͰpMi9ƻF~g߃y6u$~gK(=$EJ7ѳ6:}"E|BأW/8fvr[++hz@2 j*E l hѫutL=J=+e"]Չ2Mx`7fiT]J`RFw#bHLP&&FX G4lDף)_$g[%K3SG R 2NӺtC-gcezNCJT,4E%Qr>nzQ2ʈAzM1%Pz" I]r_H<ęlHzA{ErtJ≅dMWr%"nʠŬ)Cm\V+yLrY^6YHL rJI(*fb5${ b zߵ}4Owx'uRAgfW.Q/2uNɲcxcmdDáBsZ D˒XE/ٿܟ~gPt<&t޺DIɶ$&$=h-υ/BcH:H$::*Q΀e'O[txKdka҈a uW[y[! U\PJvGRkI,"m8h8Br˧ՋYzDLUQm6 K'#M/;TGUi?|`S'_ۯ=y DO Ts o~v|?N6.C|0y7T͟- &Xq$1a聰ѳ_ ا`DPz/#Gʫ3pߝQ r O^,Cw<\[]pΐ]/XI&Q8= \݄=}f(Lt5u+;n[:e{YMoRY~G?uJgKH 1t㤇+$6u6]wI.7>*f}IB+@m1[, g2m#!|/IT<7?=|٥pY˪ss&2bLJ4w;XM(U>oΡok>.^]?S&l|ohGō4,N~#o @9q oEVdbKJoOlMS">mޤoɪț-\:"Z*4#AyC|s"@lܚg)ֲm焛a7kL;-yT_ uWe,–.HErnq+Zab@AĭF>EY6B ܖC,P+ȻUj bR.#7 ܜ/H+~?1mT#W.EƺRV5.ƈ Wԛ6JPo0ȍdv)/ؐl.Wyܙ;AJ[Xz\&\aBd.}8T$Z8ik-lNpJzt#pdШN) F|N,Y!q)uUzoЎ)4dy"=*ǽ#tcЈiH[TXYk'6*QZJT6&A,W'Fjmb]̞Bv|'{ ?p xLC|{@QQ]WIꂲd$lR`C& iIԥ.5 ]9R:*(,HtJ7Mǵ#FeyJz 0*z%A WH`O2`X;ͪ UM:Z٤=paV7d(iC]"frT]YqqI9Z'f 4)Ç3lP4e?KZu.e]R٬H[5u=]`(vRiae6\n2XJou[%JI`{8-n BES<ǡ@W%pT3(c~˵*uU3s浓D*D4&ЄeBT"P 0L]vPPK@@ I;-XcS)PAHO /xH$ *1%kDфNTdT^u,emL]g;u&iK$nKЬ /T)]9RxpUK%bHD^hD@ ھCPcas0MJcGQ|45>!i6-Ž $]('{xB"nݻe0A$Jp^{?ּz^X30rI߹퀄`8] ^3۠2F:4J砖!|,=W}6ʼ^y>pm_< Tkpv8gW f a[w +Ex"寄L 񯎇qĀ8)v?8/  Y?Mm)D ) *P,l; r„ paa0+밺n5LXOze/CN7R=#!JK0; P??X^f:>ݚm[$/[4*M#IwRż,׹5N}:"[ZP<;6JWQM`AXLCip#uZkc#*~Dbc 2W5AhqLBdf]*er>Fnqfu.~IަTfm #, ɓ{xY.3'4C T*fV$fvjĻ:kc1j;Rd cfU`< *ndNKJ^=LwsF3ƫ:]Z3uN&YmQW+y۟-YG8` `j f/@x]ATl |]sqk.^C]5zj'NGSc׹L#A摑 Hn7**1jPl5* '0d$;v˴qMAI)6Jdobt$^Jf_\N,{J+0o}̋χR)>6/9bjgϑ%~f7W.. ,5{Wgx4eg=Owϟ?E-Ӌ-9wGE5xq}U]DY`GMf1Pqe_HCv3*O,2̝8'T}*#:NFƁ +d"X\`~s'_P[Q^=oq:oӊDMоc/f͞/rU(pAB"e=hXxj;.rg4G]\`=x{7l%Hm?̶J o{*]G]o9;AJ| / Pd lʠ%źEع;sF4&R1:{\?0 A eWa/jn0sN< | N; vׁ3woa} "%pp “{'_G?S0e+ C  ~.C67G/t2`؊J_)KÖW7&C{`(=GI { ^|z M{FA aqAel}χ&k &W`Kp\6k"=(ŁbVTq:i?Wkjp>::mEڌlgeaTƵ,Z^}Qoh- |_bDՈPP]J!Kߗ;n91ߔ!*>bŖ(;dK}I܄E(R Uo{KȐunEL"uНZ(24 -u 4 tbc]ʰΚeN@bAXhR*X-.![2b׃P*"VB@"VRݪ2PB1qn)n$LNHTAQb BHVMSxW/DZĐEI 6K8b3$k=? [6xrK僘)(mVy/{|u0q@w'M1J5]30ɠi qRwx})Zy6{}kG,r ni%G=z\19q{fdt. ${MKO=+~.&ljyGVq.oC_D`bw>j1Wja䔍A5qu&;g,QI1xFDa;(ۇgpt$k«92;Mb&W<}}cc*՗rWCn6v1Zmkd]Ye o4ȷq|2C ]f'cQ8`m3tk7݌yo_IQ:doRMk |v+\)Qb .jvBꝛL_]b:D6r7[hg  fh%Jՠ;ð717J٢r0cj+ƩeZo!e"3}, c'IS훡%70jo `tVq*I*) 5LD/ї/Po>ooEХEL7$8iOg gk42|+~Rq&'A*.y\e6;6&1>ug+XyӛԜ70 anOD`*S>ݠEЈ~mSi:٦UH}~2 Vpe2͈4BG/#7|x\ Gqm |V蝏D"pZOAۅ0&X*t.C_/8M8 w/L] j͕͂, pkǡXom!Sk#'`&ҟ¡}0Ǐ'?4PjV?m8k7«W{Sp_=Wq8ꐎL|_U89uhwÖYoNÇ9n_ kj*4K]0=p0ThpfavBhhV{C[v* ?dϞT6C< _[G Ā?=i ,߰Ƙnq*:AET\8R#7ZafyX`[w[h-]%JDhŻx2թjd&Z:Jj$X;O3ѲDdHi63t{q*Yua2sD*ʆ=XD(:SMF7lZߏ318WSK{4X'Q6|6kؑq8QD6R6) EKGM24^5`xC16T%uU%P\d+nmoOFBF NR(hd3'$u{O\e)FT׹jԉt*$7 ЗV($whul9wPvz~BEh~Cx\,'0,vNtF:+dcEIkdp0pF$B 91!pE͊wX1A ãDFN\$e&,v̡A!8 J;\GIx~c<9<Od4u=Gn\׎ ^̢(ͣ )N!y*~ _'EKK;5\$It:FGa0a8 5B:e% qTIp(#eANJ CLwaa Nࠣ Wށ.O|~ƵsA}IE㎑U^0bk|..]汇#sAOnooR ]` 7sh9NyRZF ~`06P{`|dhA G^ S';tdkv P^ziƷx2:~鳶10 mG ݡqa^{~%},3(Si\|/p t*$RUDSU dX Et+MHSE^MA ʮPJd,`τI/z9ɡf=~  heKN0=Q&5umMkWGлM S|J@q' =eī/F&Hɼ .jzK_a$RtƒkM$vJi~u1^;f*I*ue0d i @Ï6H6gI5|IF_IHeZHz&k5٨yU!_Aܪ2_Rlm|7'm6`RAS32#AWRS 8" +M2Hs=UD.1*Zt9޻a>ӡV4FLQ1aU[ᎽVSmU6ܼ͌ݖ˸*h2=vŴ˺E+F½FgvL{]eR6N1TYթ>~E :.:qgCfqi7ZhB6P]OWݟ}~% IDAT{  9uk:JDj,Nr$kH?'?z6κ*j~abj&o ,ECHAv(%e5Ι\Y٥Fٽ;|j<=(Iw5S˰}K|={^՞ov]67\ ɔqři55$Lf:vBo [5}T \go{C?@/kt >r{yGFu:4Z={~!4"g?0>2?N=7 `Yg|IxA.h@:brp!py*tN DXw|+0x7T[Sa} D򿁩pj6|[ʎC㡡W #GC6٪ x~x*/%:`#-6vj1L>3|j(n/CGa_? >o=_; 5XPCbͶ ׮3𱟂a|P[^ԞWvb8+*܀݇Tb)x@~`9ث9S GаB٣ ɺKGDZYĶ4-#"?n:W8t0Fa l6͢I]rR2wnΞy7to tHTc#ʾýl#(nZ=I @_ֈm 1 QK/$&|jgJFaէuiu!F dGtJL';td/Dvضc.ڠywfb3l`0ZGq f&SXe:\Z SQ,[,0y! '7öFV#ۃ/)8n MA8Nfƌ$ȨRٿIUz| f81v@W"H: p}T fwE7\@e>m.Qe?Ό/03S`/͇?q x<(uUHĉǩ?yqh#?Whu!^93Ů~X{mwS+]c4ie^:CwEeMG\5N[;Dm\n}jO +?{:[f<_}{4?4k~IOG? as9AǯG9 \<#Ǿذe, ;O]򾫻?a @VhWBfur$`FeTW7736nnuxY~_FMG1Oav?x\;wwK3vow 矽'h.z..MlwX`;<7dQbTc!rz= XdIQR2A B$+-B Fl/Yp]",|Q'jtU^U/x.o*$!R#$crN,*̊Jks4*@Tk$N9zb\"klݳ6}b٠RG *\-2gs]'G;%&Ly\(Qˬt;a34 Zb=8BE.S<*9̮>3:Cjy]e5EJW/Lva:B@SmNch-I%Pq=%^%eLuDHN oRӫ46T7b& Xc!qW!mYԝn 2aHڊeC *QRnKt]d[ ++j1 WMr;kҗW?8BՒ]:#H]#5U.yL}C 9IAT|tOD2{zntd!2dSux?Y7oePO];zV !"k7WiMj$?'!AEvt \ڲB@Q|hX*5 [S4D!ӛM nSRq]7D}-Eu'[ d>09F0S$05ǷYa#}\sD:yx ZRAk q6F@-Q,R7 `KHMĶ# ?+I`;̞E=6n8;IB6B-#5Rnc6l?%X`pUc$E6pyv^ 3W _yYlz,m5nzk({#TZֽ>!2}w|=G.þqx\OUQY{-["c0<̭A y2"]`pp]*?nܲVCu=8 lG^uC0q,lsW tm[aǑLQTf`~ַCPIG̩87'*>_{[,o~>rwJ3>Z秿^f OLeV'K ۃ՞K{ ~i\wܾݤ7q(Js|߱|6B'>(1l_JJ[ yV4r6Ϝ8+Ci|פv9`KXj1ҽh}&Ԗ>gqt.@w520^dꦖ1PlBIѱ;R9.$T2^%q8Bɚe j.rަY^G̋s) jr--9_h]^gUHdZ4N$-klm$GW ׽H)S^UH9-w܁u4 ]F/<7ƭ߈{ayο2 nqRqa3i8xu o  Al). 4`aG>EY#/cB6'ywTW j|NMQ(oKu A 1:* jZBH xD]PFr)޲~Mش?$s{vZ$IFV+5Y^QXLF>렔̓{0>x{л6Rt]pǠ&>Tt)V$tN 84Q+#yuÌ(u>|-|QXi ᳏™ 3fˊ@^OE`ӆӑ6yȝ#Xj zwFj+Si7,'{.$DKCeFv¶pPԳgEL54A7SGܮ͐@^?A!(/q-b K|4rϒ ILf$Wrskv3FF fw1-Uy;$eqգ*eI6 5::v_=\ĭז}v ̔[bsԝ'(.ne{ni8[8itglK1LTal7+bi[_§#X XEI}~j:-,},[,j}Z>dS,^B C4ʴ[%q HjCIb*#!I:Jds)7杞1JğϲG?)v|Yhbe>H _0B$\f֔XYeapyTZ?@f`=Ϭ2ScȚ+BL5Sl@%Qw޳].hgzy1l\h0ltVluJȸ/"H;^FgmEw08>k_$hL<<Ǽz)ŁCd-yxg֖$t50CܴI VCr]W:³( TJH2(?Lk Rˢu]TpgxEںAbqĴb׸|P;6e cw˰r8r!8s GiW/iH?!U!f:jt_'^geK yϾ F*2'O%I=%}?=Slr̳>Wv0_"%g+Lu4"ݷ<ǹ$gi5c@qs+w1tǘc 8 y>Aތ!`ϷOy%C$AH>|q+_[}ŌN=ƌ;0Ow3síW6߁լb̾UI,&;'xj!·oy)[yut'StBYm/42~KBHh^[SlU 2A@E#'^]cȒhꄚ( x1bIXhK=A@ìTc6@Xrz~BUq&f WH(l%!gebRF2$*Lo$ȾMqR <ھc_vp:NBr񭋼96TPI>"2>'!ٮ*WJhwZA\JJ/|qJkHOxXue$\7MO;(qݷ|wALKd2f|k"|ç\Qq Qh# m;Gypg/vJ8 +Yfb$37uN: pmwb ̞_௦$+֦ҩlvXY@svZm}@_׎t80xam*mX !e|!ĉw˘~f2j!'pޢ vH+eb4Wqt])-5Z "~C5T ^h7$m|BM$:!fFFv 2IPH16 ӝ&hTF,\FV[U^$b,H*!L##[g`.丄jY1l&d<j:g[:C =࢏:o .ҳ\V-:7'S-Wh B>~Q&D`Y:ͺOT$4񖂡& n0! iohoNѹab#o;8CXViUX._؈BD;A6#=ZnPs$2AZlQW"pB_/Vta YxUgDvGlrWvouYHigu9Uv: wspf)HQ _زa<9H}N<nvz`r+$R}WPV"lE IDATt/KO|8~FoSۀ{2\hJGthV:|' \SܸVfm{.0ޜ-o{4ψ]/0K0B WA&>R$ʡҳ_쿉vx4++,0̐u~he{o 99^ $ETװzC|aL;ƸR2%r[m/Kk{z+P0T&OԔ*EejsD¯i)(iPMֈ/pyyJ3.guT)`cɰXNu3lEeѩ TLz/X5*%#YT~0ǑNQC dlMs.H  .,#~h^ ߍ:Mm"1[J?]Hؤn ef֜GY&kwxGzs̋q|Ycm$q>Ģv)Sp1vLlRf?e E ƻ2g03CrUK*};h$R2ķh0SE2 "&c \Qic6{}?;vK=K0Zg7B|RtP5/|IJ=L(jR+i鶡M --\5l9LO#+RQM+Ch y;Ѯ٤ !?v$ {ӔSli9lIX hur:>]rv]dmJ2&ӝ(j j:>DTQ1-&d C@MqK$J7kMCSL\|/$-:Y6$lVY]-Ap밚{8^ b"պMegd(}_ mnݏ-yO+zU4oű Z]4< j >NNIhm&,OEfJ%.|=lYjC!h"f;Xt\SM"ٸ(M5ІL̈́]Na d!w1>:Hf4]5VC|!3igPY^Y/OBY8]c D@BCglLCV5dfuXTV(抴۴2m'EiYܚK0rcH0`52,πϊ&FWAj)ƀ\'kT1~U }'hyUb)cP6vJbZ eSXz1҆!\J$Q*11SB/ !'Өu$7DsREFSO&t˭`,x7C$6*b YT_RhmtDŀl S8˨F #H7Att-BUADQ@OPsx듟l@PWQ>K naXG=:2sJ!FcK!^=`mx{0'YJ@񃨾P{#Q@ O(:"N֖Q /FcR|i@{*ޣo)M戁< Je7;޶&| *, X_F xI-R >x$ xrH"GN`;/7WAcEVAT67hEee#OB#Frf+R p"q fVșP*lI#{p~8u ~6×˃C1=@G.?2qxׁ(v_wFԩ+ܶ|R xu:>M-?O69m @W9m 81H_ "?Z/._1xǢKZ0kruYZ LwK$$84=>Fvױ&g47yX شܦvRi%XV2u8feY\ؗI1V&5YiXE5j lVk]XR 0!̰VA ba *N< ȑ;pGг/]$0LfBO j* GVI$yrj}=(t}@ u%ۦDHeqLGC C|?@dЎx-7k"|HnTDR'INh pY@% j6@P_n_a/[IǔZq!6ɘJ:a8!V2N])ZIn ?!`$CS-ʅS92ndpv-9fuE֔!(HeS e|FHqIFMZ4 ѓyǗO#Zm @h؈&~ ʳS_n1ɜN5s*B}H+% UcqG3g %5%UhTRA3 %I밡r6rmma\zV9Ws喨tnpd +dm4f?OsvDE=qu}\̆䮴hHPg@Bȯ71OY^/-L$l8#z+ Nv9v. =zGw䳰Z64Kap t_jXr"UgҎMhˈ3jS^வ&j;7`B^Y#!۾ŀS`d 8:~ ysۡ<[ZcY-S>ɇQ9_L7ڍ5|r$/q3N_!t\5RF9utS`c1Ţ\gmxftn$^9LdI)M2r^:fP ^ce *FzpΦqgRoW*oTک,*V'@i|BEDogh%l?N jTiƠhLdʴ4< 1 /hx'9) ZA[}B1\05 Ua[f<#HB?mQ:`q{6PVcյ'T\'BRO kL&RXQ{u31248 JcuGr>gal?"nƨ.CŐw.BN;}狴g[u+>ŧ*LpΉeB+Mmpd!茻 9jkL #SR -j5.4rl2n dgd6qQfp $ZZztXU6Zнp,~~?F\Ol+E?Ͽo!vl<q( pӖ|,40/bag?x%9j7 ?[w^5鎞Ǎo׃xP"mQX8q"| p'WPk~[iar"Z~>7?}?4a݆(;3QL-Z6.2|Gߒ 節Dl{\} &XcCwHb}^= zk3X;ݛjj5_?5[a,aƹ%\]_Dm6*I3T|݀Eͮ?Lxn~ k4 2%!Ƞl#aBޓCl4fa 8 ipsuوYF(2:KX]_DnEws"W5n$O[ `ǮxWl+\oЛ,IEnWH=ʩu-`~ԕ̽*KK.+. VT9Θfrg9ƺ+ػ0kSK2Ea|3)fחht#p.q7*[{(v9%R<2gayd/GI#r3ӻYIDU޷p( KBCaq{_U͒HpҖ1\ yWBhw6`17ڳFBT![I;,vŰqN`+ u0z\GȜi{eR#H8(Nɓ}s2Cϲ'LIf0'/M6y'QW$oH?k"?[~[K)H;ivI/DI_z-EHކ9<|?ROf2_fu4xucg\ YH &G`ec`E aa_wUɐMN_pqCI%ǟ;G"26ۿUa/i|r !9'x-Ps Ї©K&^[\nBz:^'8dy!$ZLXCRm1]7,|gsrjURjRKh1 kl^11c#0s- ! !$$[R]U]^Yٿq{?2++"wy}בS$Jk4a $h)2Ax(D7E"fGVd0~/)D>0@eW#!d'CB|_BNa4Z$8vNNi,`-θe85 7@&)2EU5B MP:0i!)B*0|!QFaVJ+ vT-,T^SK nk,ϜO*S"6ГɷT>6z0s*w`@R_qiPR_4K%BP_Eim|!^2\]M?XQiy}t\ m*cn,KW"u]p[ Z emPItnIiL]csSl UU\z5>_YNpl:ʪE"Fx96`m7c["T "YSpofz"'̑Z9_Neu>榇vgLi<:àGiuF 7b=eYo#3GE&WVlf%[bk8V ɋ - ^3VpR Z.obe]B_FpƂ@+U%|Z;9Z:(GC  .\)ah2 IBLq\9\6. l8"V%MƆ<~(snJ=!_+YIŰe.2xU[K+}4 x숀VL0~vѱ$*Æ#r7\ C`ðm\.r[6xDb}982w Ex(CL-bl; 0I#Y/TfX̕# k?r 8ux>7n:'##wC}<}4rN߆닰aHݖڙXo+|gpr ~v(7ةɲ7n|K7ᮿ?~o뀞|ĺR~6/25=cx>HYЕztB8'$H Urii.ObC&PurkJ߼d|\ cRz5jc\zͺ6|KywR]O^acvjY Hnx'SX9֠Eєs9[y҇RB\šaaCKX#e%%AyFr1B,HKyҮm5 KP'vīsL͜#Cdc_ꝛ۹kFGmR'ԯ?hsFfw򷟧!Y~={eX.ᐱkhmX`WpY.۽|,ShRI21qdIBP0$ٔxz~VyYVe 53w~BHEkFYuq} ф<\qhZJ#5ΝJ:*l\ffyY$:#H4BOlgxTF:tyu[8 < ! &{bv?s%g# E$ [!Gɵ͢.D :rStO09pg&v5 %dТi $)Wy20ʅ&N G(3Y(HQ>5DnL$D"$DPsC 8D (nE*4$qʮJU"9K"WZHNC5uDKopфF@u,g2>uEU`uA TB4EBT JRA+A @vsLM1E7NKj+߄o<8*{Tl_ N=$]ֈ$M2qV&p@V(8jfdtew&\FũC 㿯+&)tA!a(#*q4b nyEGT 2NL ɴAWuHj*j R(!*nmN ߗ x+nxlS!ZS$4j XX\8Z "=X <ђDFCQ9sL,wq˒W(L6i?D5PIZZ+t$*g4d:d򃛩)νCZ|] V_YWt r|reN";N\B C/t볠Q }ŘѮç&+ӷ~jNqғ*`X7jcZLهԻʺ#a[/xN `O+^qXlh⡺ jt6A-PɈ!&H^3j7T4J ;0c2* J5Dʀbp/F>PF fi؎* 3-ш+1L{V'N֕u4 $Hc 1 7ɛ:TM]FG٣ecZ1>`@uGl9"/t=у9a W)#"q9~AYHhX9dKG!Pd䄌plpu@{kvG1$fefxل,}*ꄄayXÌXL }c <4V"vb)g&y"te#PZ |W#P/di+W.ޱ.F @>ɑ×"z{?|P$޷L. ܼF#{wak 3p<Sk\>k Rhi5;=J=2!_̹[?߾+K^$|mpq1bm.,ÑLwH~}na Vj>:g3]s!z;j΁07pI5p!]{ng^Exb4? +k2hm] ,;[dFìR-B2KCđړ4mR dl.&rCXO1xS[Pd[i8Ħ!~EmW$+UE¡8\ Aj3]J3&Bh6o_xK#],u*J'4(mOsncOFEdl-ݢۓSJtg4N뒎,bͪeM;PgdYc#RJYTtE1N#dz:K&~:OCXHR-jdl15uL8ll£G`NffaZc(hbi;Fۜfko8$<5D\iG(T$]q&M!m),e*B) G{ _J'_ևX^t<⮥X$agQa!jɧ 5JW|>joo1 =|דX峵T:(x$ 1#CS{xZn\Jg>=.\<Ϟkp}@v#ZbjhNŞw@羋)ԙ6^v0*15QAE~pel]fo4.G;sI*3;qay)$2I ̋1HqiJuSPeREAfUf.DejGjBFU\ܖMXEU˂@ Ɩ-*?0y{Y2BU  MVKu6O28ʝwn@\A{y~[){oC\æeLʻچ Ү9+vlgټ5#.R2@(_hڛ>3b]Qٶ-߇c3mԺ%ZL ZҲD(KhKP +sf&eJ[ihp\]@A/ H{Ɂ.Onk<=u7\@~(yF; Fgׇ˻Gax^ о&JÓs J×zlo>ɗ"> Mpbĸ.΁?[o@g.NEsU,(dѯ_~ IXO8 Nr{>,xm^<]?9}.=0x%,U# QT g'G刺'F= {nNonb6 F{:Efl?" v4/.AoHU?l|ȝkG.o"%,R{ ݱU<)JnV$F.@8vY`qw9Ė1~jϼ4945v_GYK(bsYՓ$.֋Vz^I3ΐ7e0ƉwL\EuUGƹЬӽ22.Sloe͚9)dz5 T,i$@R 1+.: WH,ӐlƧ,zf A00@ۥyVk;HQY,5i, sH$1 nJRIq0j;CKZ=qKNX3uHORiN]tUFbU:9+sF牧}C;TCV?,Ɏ h Ixi 5vo'o}?t8~s${c_cxC45_L_pC4~tZŹ\}L-$hdO,,}ܡ5 o;_Dv;h7)7nf0CkZ;x*5em#yE6Ɔ sy>t%Er7.dWA2oSCF4B9Odk7qT@-0=6K_6[nrG b5H:0Z؁*w\DW=^6V2~W2TQM瞔Y u.Hhq 7qe_dvv4 )P=b mKG02οʹq*WE$ Tb &IUdXs6}߱HdzO'>,;̏ f{*IC/Hr E(@jdl)T)A(" PȄTk!Kȁ@ #dA K DyT|v:̹*. H%)T$ [Ț V'G̴dAhő}+UQ Hr MpZ2RLE۰2!n j2'ah19Dv4BTta^Ĩ;Аh=[24thT+oy >"T5e^ )&n©7VP*2gӰ&u Δmٯ"CV6r>S0>A-)FH"-S!f.Kv|caQeO:bd;Hx~ewM&X.JpVˮ!$~5 χÄ6,H)3&R# $-HP}+x;9[[ĝ-@֛=E!iugbdo l]U-ؼW pSTzIYk \K|${$.|TIsUBqo 1SÚ"ow^ աeU&ksLmr99ɺg |5 3 }3oQJz /O1:6צP+,\#izwTc Yݧ1xÚ Ct ИܘLKRE'iT&9f/A澈nׇ"& f`i)|2tp-\F&ື!p88 _A g'|X8P6CF"|o\u5< 毄J)j oOXeQS`rV! ?m._NA ,r3(훱Z;CQc\);HIzΖązRR))Er͔Ck{U C0Hg.HuZ6}l_h];2v=wߊqvR(WupM乭44cH Jwj}̞,jTa'6]݆I3[<ͩNq)}F\ad.UH1FXx ?뼂s#ϲ- 8X,vV:W^ZGmx=Ew0S#i0n8L,OD,1G[rʉ ;^*Koam ՕcUW!b"Zyp0N]ѸRfr7w+ a[Vn`bR0At_ >X9CKIYN cܷe~V*]*mAϳM}'{;8yKG[4W_!j4Je:pN+{7=#L̳~JV4f؏Y?E-bcfw݋q0za?Lq~k#Gm87 >˜bOP@idnڸ~[>g<$k&l(]$>ߢm '"q^u=W.\{ȳ?`` bӬg}ZgO-qȥ9qqώnHrKՔ7ʰ+FHYnnBPL5x[ Ǟ5xqF'yװm#cHIF`qc YZdb)¤jIU'!kz.~_Ϸbhm'""Nm𓄊͗/+4;BY'LX8@(\[{ "T)EBF0fU*~&PK HO3DڑCP($IT̜6H Ã4  V7"B6} [@p2!"[ŕز "% 9R"I*BRQ$ Wo_Yx7ZTq Q3u-TSNFyΆ[#a:^!زlg<"@c.}rkeC,-!FO8h UO#FBPJH^W 4puQe8-,)IEՑ̀o6]VtdBȦ*ve{zXDC4tvͯʼ9MlE92+gԭjϤRtcoc IDAT2gt֊h%,LO[5bO%Xjy x[ʷM[ulML vO%PQD O.eibE1"_Wk&S5+c>*b+WfV7BtC'譀ä3 KcaGn bM=.WqC٬P[w%#;l˝^Eglei<ήg4cVbyM>b giTSw/IY9hZK_E[ qVhZѽ%d!u;X(m ]Z  0,h>jO'g˝8?"xDŽ+oOBrЪ/pW7޵O9> yvv-zN,T:kĦ2c7\H4Pqa ]y #ƭ,Pn FiQy-}K74Z&'iqdZB ͦG#i!cd( *M!7@}:1u%@ؠ$!LB`Ot0Oz̏C{ av.Cf"v`䨬,WG3 M("ږ$;ቯ޼G3(8 ۇ̥}ӎrQu׎ GG9ꇞ.\q7|0|h/^xy$b*-Va>^> ;f/mì1H0`хGnC(*@d?Ǯ3-1}8ndֆox#m%5?RO*^)\Uvq澑?wmCRs|/# 3(I{mj"ʅ װ5+i]8L|)\H6blmx4$};f6dc>'OoXqNU OLPS0ӓ0 F4qjJ/t?g>! 1"aRS82aYm6aC3TwYxn|h%,Zi7]J/t7].| }-FZcWey-赒si:tz͗ob59ѐYA]NPV*?{r&4sş+tCb>2}c9|1*T 25% SpOuk?qұDw(h-jFt/'1!~ohlx :W_>MfB7o,IHģM!! laugg8&Dp !2-, =./=Y/Op~r72Gc Ds'D-T wߡ3*O x[:%tuR_aȟ7o>rD $ q*mQۚ /?c!^?M QeGt"dEBP ) U1c'5OMZc!w 1.$*׾@\x?{8IK%Qb[q;&;q'{M78vwYeu[DI$E$H2G=={_$?ogf33mZFA1:; l =NQq~?GH` !p結 \2"<$y(RS(Ȯ@ ShTp((HB ᠨ?Bv[:S6p< {"dTu(TV4bZhA=a29v\"Ahg""c НN2yJyd6q9#I!W+L@n` Xr VET 5].n:+|Uf߽͗s?>6r_T(8YI\p 1ǦjHFkKSă*H x^\&WiPm踞Vu%Ը#KL=` m2 YmyhJ ScK2H`ksU``f9sz:8MMr^#)R1S+k%mdSWr:"R'(0/d1 ZAowY'3tz[yS#5 ϖo7U:C<(55nys#HJ]k8;Jsq1]lSk?އXYWHϐMđ8z5Aj ҩ?p o‡8f}ҏػ4.=8ɺnܪp0cE^K`GuqGy;(.e2+'MeFs|ؼ4K0ܶLGkefR?|`WCVxd}:89L g10ˊq3|en 0PUzaG,XJC/{hZ᩸46Mp0\_ʄ?8ĶcMN ^uEў ?ZƊ }Fp4̎wscoOTB9A.!BE*$^B!T%QL1Xa==5J gRoh[,>NZ`ٮ' <&h\v  \q%墝7 _٤}p݇P'qGy+4HF]u:+WJST9j=AYjZn3*Z9,H3HMֲ(dIh`?W.K3E›PTW%vw|j,Eu!k}Wz9 / C:%+|ͫ0{{5t~k`, /%xV_=/i>T/|r59W)͗aߗ|]뇅 L,ϻ m^w!IW|!0~ 桴 n\5˧k 8{`,R||ՕWmpe޳M¶Qxm"S 8m#0WzN_^3=NNA˳g=v/ T[wVO ,{>y' }tK(6%tC3$Wp`&܉nŗ]jz/Qn# B|^=M"lCᅪܸXȦ.)1gX9O,+}vCzW/Fxh0f<3"9G3w(gh8:ѕWC[rU3ʁUdYD )cphC$"MX=О)tpi -Ɔ~'_lgP"Z UgW7 yM}nR&KFɍ EJpq!ο>yvmweg _Zu!6 NvaEn}_S~}s2MY99{o'P"˷؅8\<:!l¾v&NXgʉn7Qe6M$F&H[Od\G r&NCV)mȋ hbG]._^dd Ԕ촅1x4/wm]|81Ek/a~LIakvW/&If_LJxTGtԧsTchE/d)hC6{ RT*mf$f7ͼj#  YO0Bx,q%p +H9XpU'1å /W(jXdTPvv s #tfcUݴWEo}*<7Hx73|@%TX}Nc1~|$` f!vrWtM9 }"(wFrňAkƺ5 H`& ABGp9N]#*&U',[G?~v0opzv>o2db <E?+ |K>c50W: }Տ;Y0kp뭐[4mx^wrv6lŴ<&h)1{a1DajY'SS'Sba ˯: PA %o^׳涰om Aށy@uްY9D݄ǩy9 30d4:;"v_j9+J̗3Dway^U%aCeow^6"o10 6VDݿ5ؠ9vtfV8e4d4od>o|ñS+0wFSx_d^P-`H  ;6=}Ij8D Qw\ Mz1J{u¤4ѣC(pU%2b^y;ʌע#QbLe0Id x%9kU} ]X(4(*WkK؎# TrDdZF +xn &", lg2Q%:ZpUQ})d&(\˪'S kקy-ú:{շ5TrrH&:H">/̛ӏSgGu:#ŋE ̕ =۴6o '2m\p;X.!.h&4:o[EBWssP_r70ڸ[goLC|W~}-Åa:-YX(C;͕iR%~zV"oxֶ8y5ڸvioG߷זϑ=iی]=x!}dJUHbx[)ܲ7uQL2Jb#37]xE\ 8xj^½}c'8| t- K:up {> '7o컭/aZu+c]\|ZT `wqQ6/QR>VY.5*;=s nwy[\/隣!dC5By6BP[6^~gSZOp .M O2Dqv޻jW(p{ =3l/-s#zPSGߙF,Z E2U*\ǗqL Re GrlU4ii"tQh"1 Z8H#ۈVঙx`+ _}>8Nz]zj{H?z%:hVA.W,1xr0Awgww&ԙ3pz 6POjӪ_ ޵U2[F^wѣ6ѥma+ rhZixf`iNwd7Z8B) ZdjŠW"])ڤ20mJ e}rAkS\ rLa[ v<˥%FM1ʄTPx'̚dLtdLBksgC#;tBtJTj(Ҝ`a'H5)6ۨu"˔^Dg yjtIq!obSڥ#-ϡC3Y;nt IDAT~ YgHG_X7 R0F <1S[$i.y#]CvG7zA2S'<NqAҘ>L>,zB.9$Xs909B]k$$rd /[<9Y` y lyd<[EM!p$ Iu9AoPLÚW:i;7.`QtERLjԤ_ _˼neXi"Y CsNpo҄&%J~-3=ѩ[ÍCEplZpeA X4MyhCUޓ Cc},ST.pn_p>BwiRg2wK+ pkFòt {7=; 4bujr u&:f7c h-Y& (t/eIxy q^߯Zm T:߁vP_l~Qj/6}`V<|_TnA/PlZK秡.鵫d= M˯c:>?>PD Yaw?|G߃ݫXtYx~s %~1i|:q8rmy{;<,{8}< hfgO|>`__-~J@͂7.-0C݃~rkAA_O6`UJ}>:<3՗wC@(* B᧑K@'rUϮXBTF.8xܒGY^9ATynzJe] .t>Erl(q.Op_CDڮYOhfuz9Bl^We#RC*z>-wŋx0u!f\fҏ%ZQ(GϬi!j­:bܐJIzuRvi A#g}FLj\4ǚ`aċXZ5҃ |Ĥb&=W42nI02pM#X*na63 5:BBttG%t2zb"qzSƬh+|V-g3rK S)b[P7%y"۳;Ka<$s+͐lʋ/̅Y^Z"\oPlw%ļR\Z’t5tײ}iCj)D\\vp~uR WQ9vfy>cȎQqn,|MtdFW=Ɲw9_f"ݍ |'v;z|oo47̻?E!<}Jū3\pAOAp#XRRyW^Lʋ1:94BxxتJ,U?a)w–~ Eё(#v Do;.y6ۏamE^r~{?p]X!<4 Bp\ aI"Yx("Z.#).%! #LME( x߉LK6A 2)N)|sZjTI$[p RanΣ#*’ 7Ԭ#Q)4r )esmNs"ԁÝbqZ ?)^+/6}O0ZQb8rV2)7n=-@gi-N}7Cgu'Xzay~D\Eb'=;CP)в q8S+YV\KqփzrI\P*i,,w17ggC ^a޸Gj} -\ TŲZ͛w]*mMXI#a>낥&edi<ˡ4Krnj,A/l2y) Y`|G8J}T:9qjR[;?d Ilc?IR=#0p_+ezL]h[%UWDԺO|(;QwE}ɶihg!C-$> %< |}P{|eh=sWT%2/I=_0?9e?;}u'{7V7r!yo?~p؅p2\|#py\SML2zuV*^NM#?y =:ϭƎehmM!gh΍YV|݂V "ӁPb9=TC=t svZ5N^X"8WU[-H8uDi\A@ \{'S256(FF#T61n.2mVm?7FCxeUĘhw0ja|Yx$TCA(-®^ӹt71NGdFʍ"r'vi4Й\ yuqTaTkcg[XKPhbUטj s\0ϖ dn4J'"aN*#kIBP!@.Foe%P+#{: 1kQBN H^U^y1M)ݨa v ivVpT/FhO("sD-@yY奷dЉmfG6u]G]N1+s\O3IFܐ-ECPT]Ds,qtNHNpIB /0CՅ#m ekz'َnѹ/[鷰ZAiIUġosdC-RoI-s>?;Fup%<35?BQZ@U2eD}܅@xa\[.a{sm 5Ro_Ư9K(r ާ1dBµ%dY~GVi\ /ыlH(DWWD *0 6H8WE8: F++ gɻ`Y}'%'Gd <\OB2.ZQ^Bx@A’mhHGs'IHIB:n q=!E_xYb"x G~*yx,!W[8fV52 p"*2u%(NyхpAlIG\G BC6 B&SgDOHP7Q D)GfA2llvMe´ vR:ƏKP/ۇ,NLi(S,=gcyQ0%wG AG|I(ZU@ <~XA7e)EB3 J,)#E#D˸ @ bD[1 ls].'n'32xlO<;7?UH5PCM!cLNl⍷6"d"]_ߌ²zVq=p4O8HGAgW^ S(.!I+ ?"#0\ 88@x^}x7ueU{'|oIj$!4"c ~8,<{='c?1`0 QnuΩ:T'鱭fz9_ު9ֹIcbE!=OXRF:+R+ IٚM&co5*(JCC\Ű\5ug]AT=JPc]}vy4öNsNHQ,+Mkal&H~0|>87<`9eLʚo:v S;9/J,"ܸvl7å̗Ր\ll?6ֽEr~?//k=AޝM]b#{†c IDATV꽚 // aJ4τ4a99?~n@)-zUڗ|ƷUh\|P&Ċ[1ɮ:<2Ϧ%)G"><.qvoE"q&sw"de~.!&ԥ&Ȩ%UmIV>򅗱ԙ|73M^vl;g *Aԇ'9K4si7 þÚՈy_bx `kk^pgs@b's[.ҧi+H:OF-#v8"hI8 )FLZDf=yrnJj.q0GOCX2mNe ɥ\a]T ńn٢$ kMiD+XpZ A^r]9ItglA.VD ױH>V; ;qX+>0]GK""e7Xv]6ۏ#&EŏtdtMP5ԃ7ItWZ(&$pIPc=@]bFBfI$!0B"E.XX/eD(2 RZD!cV o$וh+:Olg?#.?v_jb.J" Ò@GdW+b$:y0(3˂mGd'M5.0"*:tIEB"xДalL];䌏5b tK,U\ .@(KB A-֮{F'S_ʧ?έ`e;ءJ&݀,#:J~Jabɦ _"&5NݣPer֭Zx'XZTxNyl#!yu:IV\s?9EvA!}f;_~uUVau/7 >^kuƼmZ,YE_$ΕQUd *Y4.LYٕ"d D(qFԙiNat}Y"m=C0=Rsޔ!kꫬĬ̆-;92@ l jt |?Hئ?chD{1kfǩEnƄق4-(YJE‘|sQ8g_ѡ4TZ+m,O ϴiq#xu;<;ڜ+*}d F*HSsXU 3H8Yqوs2Zc p=V8:gd;Bn h]DDer{nZz-Y/5 jcӌ:_> 2 aщeaISթƋГ+ɀdӧ;g?Ͷܸq3aة@҄MwɧL ;`q)yVݏw\I=gDv)KaE_J}Ȼ;/W_e=? t.`c?3eY_ O֕WJ%?ܗ=oӰyLk߇`y=2k[)W6!N󟆣i?{Zs:v@:xY)؀]9xu<5 /9;t?7m߃GMob>o^u1Xki/,5Rfƀ2rY+U ?3mam N. L2UxoD[nBý%ٰLVK̶q 𮏲'\|e~_yr9@2`[;aP[o r,uw~4D6*AT%ʯP8 rF31H(=y6l-K8~5QT=zm!qcTEz՘К NP+jX5I.{F.CILnq؝$FXCg(&[ECOnOg}\<͚*f[D<5Y7qut\<ϲ ^.2?k9ެe?/03jTY~c[>jw7nJ?p-uj7>?UNGǧo|Wya=zwؽ.=ol=L~CZӾSOouMMi\E^9~~/_w=R۲N?eRo=/V~w~5ҖA"jO5BOld6ɸ_,`KlS/l/21n' 2ٰ(_{z37l~5|3eVd 2={&O/Fe p;gZ`k[ sLWɨƃsLWɲtJ8iyfi]ࡽ-^ˆ+f$G#?ͬ.ߙM;O|[ydS,qJDJ|2Ne@8 !ݖ nB໠e ='r 85ׇ uqprէZLw^&}f Y  16$ 5kc\)PR" j468~抴!H,2J /1PN=K6!Ls%]A T(? Jg^$t888^Dl<BWR%¸6&Ba9h\'B Fe24hGE8(e Zh btC: 5!~4|fm)ҖZ%#aʄ,/Q, Ev\VV,,4XBvh]2t#9+$&6҅rY,IL,V'g08+ТΚM N637.QoirYx  O]$o\5AS5ى.}ٰ4#jW=ehmV^_r|&] c'94v'", g[8+x^" x߃ȽȲ\HL3ybhCܝd5s|= 5e eaʡg_݅Vb#+*[AJ"4jӥKedfLi:輥3 e#I]m2N}%O2[q`}DnFM!Cj $ˡ$ˆCNr!q6$"Gfk9#Rc̞P E"~vFQ E[X\5leT)1MEs‹ ϿByʁGx<텄CM֩ dBV'/v\尡sk',S| ͻ2!G[oGYօ!Nd&iqFM5ƂwCq8B56 buPu1 LX;t; M!1s [[]8U?!ox\ FX%t7UA3(!BK"5HQ( Q@6F[TS1 :eu;(4Ĩ+@KюZ\8c 1VC4`#"}⊆b-$XcHLhb GiALRYNR="iq AJ.ә6\c|C_oG 1h; =d|EŴt sBס =hЪ{ݭSPm0$imMAv,,tgaOÁ:=m{`l{\2Wz`b n0@x6X^If~t럂s7O^-Cӟp|^81c)H]Xۓ~}yغ :75=[R#pfp68tp:y5<*=g.B}W)=\#pnU}E{k_Ot3=G6_3iXO9e[^c7pեutŠ^?ķ=A\suj(һpvdoҍ`AnέLqz,УwX͵eY_u@YN VvϿ;F',z?t7mg?Ò `s6`rL,v纡]bSKD'KOK-f%{2]`_9_9nUo ήm{d^S Ia8~g3]Då;,`"^25oy-}0KE=C,{7 k~Wq1EÜ)?/=ߟe̟awO1>zʷa̷ڍ_OCDt/3A5M'}>F/|f4G<Ƨxߎ&^_0c_xT-Uvz7wK#8~_-YYyՓ| {nEc;<0(,1K1{_5H&dMm ,ut@,\IC?6i<\:Ikt\GVQI/3Z"M(U'd$$Q91&"t:I`G䶀 [c~U! \N<'W Y@k+9J@.&192 Yc1f,&Q5{N K]n('jД9Id,CG39vHkcyWq#/bb-5],E>&ظFcB"2,"c" n,Ft\;1}EIG:*[]Ug<8HBbIM Cu|ݥ4]v@,n.F0׮s%h(b,H69@5 ÉV<֠&O VVoNj5L-WiOvrtbI,~"x5&f]lCC5Cƃ:e5. >ܞ`c>YHX|5- ˉ uyJ{8U\Dm9sp]Ee}ÃNWAg kEy/(PޢG J-~]e9mҦW(f򖣲kY9vD]ԴyraENr r>g'a.'!̵m)eVJS)N4"ɰV9]i-/pB}K< n :< Kf[L/++VbK\\ EcʲCE\RGDŨF{˸kv`mBVLDXXHPi8M"qA&$q2G)1H%F "VRhqbqM Rk%QAHT FXb!1hcSk  &JRMH:c-&` ILx SNh H2Ea,BDFH'Bh1>$İp2˗[Ie@"{MTHPؚZJ0_%!]7^R?򝀁0 ~k)~`} n{6nxNx(Lk/_B.Φ7~&)x5N.,+߇,>\ vGco0]M )+\,:S}m*܃)>1ޕ>O>?v6x,}۫rǹGyvo<'dG)^)Z톅G8иrcරy|g=.(K P-

q =0] (c=AE:Mu]D[ PB[HT䑄 -0\C$NL\)-h#dpDi J'_^ȰDT5%X#ʼn38qgD :PIm*Ț@ IoH۸$1 nY6Sd>UZ5\`ܐvy~D{1b>I7$tڣ8#osb6ncfE$}KѴFm1!28FL)a{; am>)Wjg@y]heNM[YԢEVkgĢ]j4} HfIVhe,le9NPD4#Bz8O^$fy0>ɤmQ"h.XFy= (@%_zv3Lh V De9*Oc N/q\(ix2XgGr<ʑ!ަ#.NSr{[jrKUXپ _hQ_YZ]er`FR H46Mu܁rg+ctNmA~)1F81bZ֤ϱ-(!H@bV>2cR!D%V#,1E 6!\9X)6F%I4&]H-Q4Mk1B1$RMƽbX)pE "=&;Aa+@[dpO(tKO0l`&|Pз|8PX/A JQaXC:ԎC} _פ)GBoL¦Ϧѿ_I;< nÉ]ץ2"40ZMezjmSp?tiE^֦)ۅsXez[14S>xL8f 4Sy+?_IxX&w[Q^j0XL_314RuRvۏ ,4=4*Y)yg!W_iwiV$~(Зf=[Q~Ki=R!+'# -2'4OWGyC2z1/˖kZ@0VIB Dl"ryPk Ry˜F2%&1b2@eK ʐh\n==3؋5U ~KrƼU\_ ^&h!Vt;9ƻ9{1S 8F0,qf$ir0%g-qK<.UE4vk++F9*倕s{r}$[GӘLDnbrhb zk' M\$ 2Bw%{y7fu5Y3UCV}nGMV6+&)^ރXs>t2] XxUg^cǪLϰ-]*wDwpRBij$K7?HRҥ33mլ=Ooqɛ{v5b?Jonf횟afGoŪ&~joT^-y禋x?Sc|bjқ~'׽×o_޵ q_ mb'٥f~ڣ=Ħ}kPy">q_rg_!wFgO(WhX"a|p,֦+R 'b5(%6 5 ! "YT$bI'&Ipƃ8HB$$ V8XCK#`x`/`E( "j뤲>bP![2e v2FD2MLb,bELBĶg%8mP!Bfql%֠l+,ڦ R$ViH0i2wc2& 6Ǿ,kդd!RzM^tI%O ۍ\<˚U}Vԙ^(oL6}8D8l/QPj ^(.щC׵t=AQ(@f4i.-016ȆWqMD^ /m,R jIeALk1F;>$(N8 @B $A]`CYϟwNa;V;< R ll)^ݝag̓mfqcDAذ+Uhͦʋ)FA3;1*e&bKxM~,6[okA/7&-X=>cr [iMv v4UCVTzvKU D*:xT1UJ1Lhh*Qj9~["Q.*tDDԨ]\@ĖE)QDOLqGͥ҅T2*[!D b]8Py=]Hq$cf8_%jU3qM!%Gg77=ʜ:P*M䛋I1C?{ TK>K|5IFS0V/jT04̪SH@A%YQL>ńIViƌ> 1!fŌ8. &)0spIct#V0"lS(p0&\@hksMCM4],蚎_1/DԘtQǏ߂Y`d6aQM&f݄)( ECWu4j*: jجՓNI; D!*3~mq@fP=0f*, J,z 1Z ?ADĤPW}} W1lF_N6Ǫ:pλ&|#p3nϼWvÓ_AFЛ;`npJJ06K1P`nF+ndi>T1vxpL9}=`FO9[C$5 <V@r,3Z%ƸlEXy c'  4]]\ {Q#`.^6u`ݏp[b*ȘAҍMoݏ/}aN8Tbtߑ KB7:ogNL|*}e8aԒNtcG#u~lz?UO˿3z?nό;Дh`ᐙ EPrmPg,5,(-yЧ7.&<UnX񉱚{5z@NHgc6l`<2͘`d#]CbU zM}v%jDcUۍ0\ pHx=c^/o7;?!̾J~wFuYg;T1äQ}%UF7Eۿg5ր~j 4jgt[pay=  {AI b1N#_eF̅[a[>h|X* =?]נWwXV.4Kfvٿ:.B!B1uMCU {vAq.t 5ҍnv@,c)*bDnGWcSv~n,?e6Z|ukEFoaF 0f.*1Ábc]7–\cӇ@n9VoAj,<_x0uѥ Cz3F%b#XupcV;L?&»頱jIQ a6i6Dk~X &7AzbG^'bmLyGo+Þ<8u\䳡k(go˅K齌r8T)7R=B## &{֫ݮ̦25B!B4ѵ Df+@cDQN;H .5 "rdiC$N0P o/טljX vmn< ,6{FkvA_Xk,d]{5xlgK^^̘zh:$GMLQ1@x^pǻFy|͘Hm'1jtS`{-p1\8R4ȂA886>Y0heFp;XKg# ~/>_i _VAbp de =z@t,V+UFH,B!h}@p"r2"ҡ5e!x@J1yG`~4}o m6u8= *b!s\ x^`NwЧ7$'2Zu}ِsXeQ01֎X6ϛ!-o{wĂErXvWCƌץXxnty3+p;h:Ҙl]|<*UA(vA|11~Fm2à^0|ذXg{BJЧ3Qbb-OaXk!+-˂cza~c8 K~?]T?w#iP6Xw4r':{HǸ!z}W7Þ|C#ڿW?m1;6`s $XB!B4 įnMWa !B!JFZP!u~lz?H{ΏMRhzj 93;:)(*rpeq:?6I{Ώ=R&wњ|>W_s-=(={tpUWywPTTss.&QL?6=?'~aZq:{9|Im~jM<#q,Fi6-B!h5EEEDEErJ4Mc픖k˹鷿g%_ċ y].Ǐcgݝwo.O+::)-"| !B!ZMqI uπr=L&;N9c?)))[=nÞo_ᅬn=>.]I^'55=zo^wOe-|N;{5A|\f" ^zƜGQ bرу)S.婧K.fڵIMMW^ :eeevۭmݷ\ߟ|0z?~ʈቹs(++ÇWz:O>4v{[l/O+ذq>lV+>K|ylݻ5zml֮]Xl,xq{+:5Ze!Dڱ} ~Yv=fߞ޹GdDu:BV^QlfԨQ;deeQYY @YY|uvڅjSZZJbb"' y'yhl6aϳqF233ѣ ]Bcnz;.]vc%gORRR.߷Zf~]v`׮ݼ;(|6&&޽{GIaA&((ٵks/`ZmXn=C- budee1b/DZxh֮[ǜ3jRwv#)]u'mraX=zG{=}=N'_1L,KNNݻwg1LhzzMZZwn`yq\9}:O>%kSg ?n9{0w~jhb2=oXpքNՒ\)(,?/~:W_}6n 7iLr'Kj#j   0Y]ދCG\Du:BvXki~gfNꫯ_m۶< bml޲gnn.{!--yj+…p\JtT`INNt?PT\zoa|PYY۾C}?|s'`|n7ÇO3bP~2po7Ҳ,h5nn kǫyG1>Kj1~M-yO9[{vnWY#˞/*egI6N~Z>|-S[e_}>N\d;=8VӦ/.,&(#[1x|447}~Ɔ d>*vb~|2a}m94^] T>|ͭSMٝa V,Uf23 aHGaTG-Lr&">ƚMXqsR~AVc5'L.|jm/d,ɟ￯qqw\vQ5jT:t(C}sj.Ã:bpFz;=ݫc,\CM0&Z[8p`mwoyzz:oz$$C:o&Ñ`Yjt]p2T>t+Ok7g^r"sֱzS!cxeﯩŽ:ou1LI_UY(p2axF56{MЧeMhԩ>E->4fMX-PnXUΪaQj"V܊W\4n*kvf]͇(y!rl΅amikN!.giii\u6h"} WQaV IDATb"_\rqG'Ie!D7㵻 5^ygOqX`3+[v;颾 n`jhg OZ=ASӧ:r*x"ahc.q8y>)|1.j>G3'9ܮ|7OTagLpLeo>]:axd K~"b"- L[A\4y,+3tߧ @Ypٝs7%)ۑbn?}GQTЁ=6;ĖU,6G4+:Cl/p.\~nn3|p6 ެ4ǧ~sig4McK/ֳgw,X9gyפ5NzYː̊#f2{:ݦ*(˫=ƚ]s1M9_ v&:gSG\|h;(t ֗{6eQQ-KB4]EQq())n,fh馲XDGGM(qWQ\TD~~%ŝ/=VɟoBq5& oM ^l'iƯnR_cQvJ¾-J\.~3q"ӦMg㭷暫nq~CZAL&zjvn>?]??IK|4Nxp+D5 KIf¯:: fmn$#Q04#M9Or®wISs;(d`IpkK(8X}wלB(*.b-dqGvtضeGng-ݴvk]x7Ím,}E>j$¾R: 8ꔺ* j:.rkHƎ×KCfk?%KxaÆi.7lml{ 7L~=z4?,_޴`uz\Ť@[Ct&c|[aMLp[***˖ѷo_>Ea- <1w.V<qqq}=TTTPTTěo$::=8˾N=5t|EQfǎ wE49ǃgUGEE1޼:iEz&EST5\>3YqZfQ(q[36lA=~;0)F7fMkkS_nqݫ]Lk?C^%hͯ9!c8GIIqlul =zeRR%ŝE51T!M:| me_S:f"1qls9hU Ls: 9F&/Ň_HL_gcgɘKu̚SטO?_}ELL #G.ʫaJJJy*N=TЛ7o??޽{7;-V[ol6Nff&6lhɼ:0 4S,ᾚ :=sYAǢtל] MF ߄!2B#}[;=?sXxQ}lv;>/l#ñΫBVkjѢU_ppˌGQ "ZlG)*@4 lv@OBl=4VϬMM_D eق;?(M Vt& 3+jDQ-N_c&OĴijl[t)`v[5Wۧj TK$$$PPPz}FK4N,FsIC(Uâ(F8\L5Upa^Ux$eTT1*IK)CB#S^<-/=s;Km߼6l!hlEӌ_M4 MUtxhzwC$9u䄨t߾+HxIrB`qBԴП.MI_;Ճ.WlݣJf])4fatSF2G G[k ߏ4`[|# _(//oQZ:> UUa 8Ey8p l۶r~Nݴ [ut*W]=HvwRm~YtDq'9!%a oINCt[9MεW hkN!:|5#ͱΫ, !Zh9t=p -|:EY|iq$M_VL6udݤz --K_LYVv,Ck$PWlqmH:Ktp8lZ8矹q8t5}ǎv8N˱X,$$$pm/SRRBdd$<0:e]Ƌ ۛn"""gΤK.:tyZ̜1'z 9ӤɽujɃlW߯u(D-|[I>/ eو5gU"h^/ūWriJyN{}[/΅gUBdΜ9XΌ383ު~ᯊ~?w6mbpM7qgt:xҥK,m_e˖O:3g !-wcԩlڴ+OEE]w_~yԆyMe!D1ZѪǓhv:BTɓ/^wdlL/aH9B9ڵ:fÆ[Ob!+-cJ2r3%̈́ɤӖJ@jw3bIKpjw7W_u]{-鮻HMM`ȑ}剹s}trۭٞ/6Æ5ښsͥ%[(^|L`i:U^.tc,dEbX*Ivϡ_w8^O>){q}w_ӟ.bB4GA\sBkL&֭[5k~z{HZmbaƌi&?GmYgFgoX[O̙3;v,HW^AQjN9 ŋc~nԞ?J,h5ƘȚUԸԙ&.d?ʮ=/DEXX^/-CLp_< F`LѦn1O,fS9?lb_Ղb|m_UCb^khךvœO=ppŴiDGG9;Bsw7Wl} (4Cc}~?>x3mdGp1Ӷ4ۖo~;}Qf'5J^nڛK/ `0P6t5'9N>lzGӴ/cm?ɡeee4Vwddd򜕕ʕ+9餓ݿ0l6Q7xI&5y~:inúMe!DيnLlT㞞6zɥ<$7df&gcՃ9uK>UOzM&iX u|OI}!瀛^( iz؈aR@T l _M_k`3ϴ9:^sfEo7)1砛 t(L$.ډjt5ZZMM߃eswVBVxbc74?JR0 ]W]kZp^u&LP' nhy%kӧ#6 #XaHQ4]Ǥ(a_J hxOQ6]$w<-&~EDCQvƐu[ۃu봩5n)սY-fJyLtVHB~!4&uٜ|ɡ>c[}ihI MT:ׯ{a$$$?]Yb믿N|||\ln7+V8~>JN:$˹k4&on\)Ap, !Zᤢ 6]7FQ]3`и%@&RcXK`w8u'Odٲeu\7|y`>6sl2d}eǎ$$$ '@FF;vhobb"㣏>:l~G"##KC㺿?4;TAtHKg5X,@7Qc9#dEd2`6JsɄlo z^(laㆵHK?'igOB`x Ln{k7| ^>' y߾}ڵt4M m߿?wGe~?xoNNN{eӦM5s^GDDQXXXyݺu 4S>Ҳ,h5}e_2pp6qqFףiZ2ΤgkNaT㮪b㏸u'm\жYfU&j.]Q[؄% 뮻(..&66[nJJJOaa!QQQx㍡Z[nswrwiv[hi,0&96lC+DUUƎZrQYYIJJJk}$XBʩgL`_op*Àu'm)99oZ:)=z7ި=..œVZm_O><@m3gd̙uGDDt%km*XhՙG3``9봳O!&k/ܑXo{r\\<ILJ2&.B!Btz~ҒАZ̀/ٯ>Z [;ڱk=ٲP 66B!BvlB怣Njhj[]JkmKmV8XNLJ7-60B!BvOSL&b),8HLLmi͛nwPPpx4MCQLyV1TѬ`Ĥf#B!By,f ]SSٺitֽT/]׉inwtaX--MlXHIngۖͬX};R{db%6>>LuBRJWG+n~m&2FY!BOS0+b6BrJ* ,ޡTUmj=B(fIN) cnQB!>6ߺ5?cxM}>/qqIB!GCcJL!B!`Y!B!Ee!B! B!BZ$XB!B!j`Y!B!Ee!B! B!BZ,y!B!ӰB!B!:r"B͛7wtDF0ҎNK~}JY-)YHttB6QQˊ~Zn \m RmEʺt/G BѦQkƒC핬#b!66.LVבn?--kqx, !8ɿh Мݠ];q8h=n7{fon{ig[FʺE$XB!Dy¨&Xs'cv7g7{w&O7;헉?EQu=_(my==NYl۲‚$&%R)e-Fe!DŽN1%:&ƍn#^>iZJ44Fcw8z=C e~ڣ;گXI,B7:ƽa#hi%3$׾kU3v豵zmjFhp$ƒ,EQBx8R)e}$kϹH$XB!D wvxێW9@05iBtSnPS]U7~i9ZhZu_ߕo`+2KY7uiLfO,o%B!:TxpX}Ծ_~x`5]<|a֦4FS'm}o uym uOkh Bѡ4M]7ZCFʆ x/g%&&Fkkk^|kp8zevi$^{-M]=0 E1 t [us,\ bXPAq 7ypp0i$>>l6N8ӧר_(,|>SLwEQPwjj*'NSOmAY>bѢvv;?Sҥx}>l6}6 ^ ĉr饿*-Me!Bt3b#b4e]ŋ3s 3N SLt4g~:iix=v;-U.:I=*++׭r˳=GUU b„ 5Dk֬.hȰFY7mQQQQ x<PևrUqYg1)\.}9}]>S/#//~g } /`̛{Cgt, !CUzخk1ue8Ч0j DD3g.˗/gҤI$'''ƛӛFp6GjTzh6P{&lrV4klg𳍵)[-5)))bVUW3fvM޽k)%>?͛p dffo!COɓ1L̚5hm { VCGusaTVVDDFY~""#9ڴ5h):Dff&r ='OnVFFY7UDDOͿwH"B!:qcip8| L:cNJKK9Go ~q9gϮϝwAaa!>2N:i<&MSOex̘qS䯺KPi2u0Oĵdg'D7E޽{cv\qӏxhvIFFF:9y5XFz~mҘ5vmܹsy9s<3)S.СC7C_!!!!ߦo}m:bn`Y/[bu+ƼyX'&OL>}B ˗ެkk Wxi3^뗁'//@/ZeTEѧoV;De!Bt(]V=.9,PTMUYryyy~,TOa!p78?'|.];v 7mb<>j˯X&*p 65}lgBe嶚lݺdpIyplݺK/b1u&Nȴi>[ z{k׮KUU<ÓO>Q#O_AQꖼÄZM,.,Z{3Al2y/sٜ{Β%K)//gܸ\vٔ6)ڂ^n㯻F[ʺ1'::Çs%c$XB!D ͆Z5MCUU.. LG{3fi˖}ȑ#,xe?S&v߾\wOrzƎi߿$Ev7lIWL`RNӫoj ootv}=@aXV233ٷ/ehg0}TUeƌ0`@TUe׮]/? 4- _gx1[jiMhimn`ШiFp8v}TUEQ9ׯ=W&OL0/͛1[-:i$XkJJJmS֍8q"S/s`Y!ʘ h Q=4QMDX~EEEczf>_ny3~:xbccٻgqqx>v[cg#858M[MWaɒ%t_6lO>8vp8 ?_ɿߵJvėu-6:5 mx8]U:kZ/?/C%XB!DBݰY:_Z`l_$999 б٬<ԓc=Cg΍7\ύ7\_g{KTNȟ\pK]MFQӖ1hT#v+])0qbt*C2x0|Bӵ~\|Onuqƙgpg駟Cf [̘q^xϿ"rW1r?lDh ZEAGA7r<*릊`Ѣ|t)6~21&<|)[nE4u7j; Fm-p,um GEEۛf`XHIIK/a '4ڣEzgUz-B!:TvquL <N֊Re9??_ynsuҵ[PS%L7.EW S}]Vk o&yvi`bg\c?3n;qSO>oҤI#`aylE(u #e'Mfp^~[X(,+>l>ƺ_X6*\Cۏ2H,Bi*::5' cB LN Y)))\}UDEEQZZ5W_ERJr~UӰiRckW07њd K"P :&̦nGP֝Ŋ~'whrC- [!fR}hPEe0(WOڵW^1W_u]v V디c=G8t-*S:4Sy4ҵgpY.%t4t]iaku;jòh+~; [!Fj[Ǡcg!,(A7a tG 69mv?!k1-le==z4~ԄZ[PgՙB0oPQtOAg W*=A1`MLR_OHR/ aVvJyvf~NOz`v6q&g{}YڟyfRz #܋cư@?л:owpnݾsmt&.5܄zA֥ͭrqqIGj5'Ai!sl5{֛ ޿$yc9?)k/슬-G!3FDsu=R߻k`zI][^{lk\V }A4dY#&m|c GU.,:/5#$Ľߵ+Z|Y{6 *e5~Zzv wmz䤍w)gsrG?->Y#kuf 2m$0Hg?I[|Y3i1h1l@4wlms\beg*"->YY3]h=f PYncI{*YCĞukưFcYCj4/99IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_rx.png0000664000175000017500000215770213203343610023034 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|lK@hUPzB R콗.\+" JE PRH֙ydIH!psϗf3.q}(!S{3B!BݚXUV-nʅ *ԩ|rQ2.R.KG^IŕAu% ('E,/L0Gl~|}Y+He[ŕ[P N^/B+DA~*3r*J9X̂b2 ,"4IG܅r^yC9/+d?,E(I,R6_ދ|/BV irT^N݄N9+ѝڛ [B!B$&&* +˗+٨B!ZRR2knTԒD!BQ(ѝڛʅtB!BIi( a`nbbd0E`yZof0Mʋ( " LNNP!BQL4Mtu^gV8LTEAUUTMj@QLr41MW/D9(&^f2i Mjh*^teRK&B!O3z==j׮MQTIDDyHH'&$GnaZ-dH$Lv{~z ,449x 'Nȳ|>nhWˇQ%43iN$),9ajWP;7B/꺎&#É(9X,%iq9IwzjD]61L@Ulڱ*=Ċ')t=00=izMaw9g~4>?X'[9+^J6W4%*Ԏi`(47M[njΝd\n&b&M_T"`褥[i{8#zIT\ʟYQ11=n3tnZ3߱o] ofO=r7Yh*7V}]'%&X*B! QV>}zY/&&qn*((XmVtɒ%ӽX,VTUɬ`P>}zc[`_`zGMez+ 2W6N=wSt5k,loj#$u _/s('66͢_5fޤ$b3<;\Y\ϦZ5BTP&x U*\.ip1\ٸi\մ o/ ׋H]L Wb0C|n~lnǻWy{3$s}ͭvԃ-ȎnAuzs^ V8o^~ٔNεۡ˗cyUnOZ?혉#X \[0Q"OR}$K0 nd瑣3u2,1r:,$|'6埸N3lL2͋xLB!(բt:u=s%k̄;0ƩnWQQUqdڻw\Xכ9խAQ:y ^NJAS0|{3.7ոB0$Zդÿ/=nX|If ʼ5/z ՂjMq9] vhyU3l+6]:fz4wrnjS9s;VC"UAWqw0C-Nذ~\z_ב\^.];YӚM9WixcT1~M# LXXjq+y7EYfîqa59l`5,",",( NhH]y]hp}x}ۙ4]E[.qYg8N z"s_ˍ)*y*r:u4;vyeIsC)JZfTppVMSOٱs7!=|i*6 {΁% ]Zqy븝*5:"^M01\餤{蠐ʱ @hPTC,pA޷9sBV&ChVϲU*iTق۫t"MfjVLOwx]n\^91rŚ",",\EUUu#)##ә$##Eχ$%%jJJrrJms3g9TU@ Cb^'9ysolVw oKbObF`48Ό0_Bw ʗSجVa Lpf`0 *UvHIIsM;ɯ?̀{-~sPzcX :cWv1 hҬ: >nAm2w~EY!:q(ZF~=<@ո*54Y 0N󛟳c%H +/ X\B!czck(/,ٕ|c[sE!ݥB!.;EB||!!A躎wn ZBll,V͂3`ÆybfŊb*جVHHi%03p3Wcxb%P/<=0/_fcE5wJNN!(Wt}جf׃jXVN8NzzzѺKBʪx<У wԆ[3pC ~Wi*k/kW]+i] ^~u.Vٵ|bS[;FM k:kl"٦ $U/H=u kT 8('Uz(@8-{e;;e̬HQWJB!ef&Vgf0 UAӵJF潙T4gHJL$88XrMZh]35#DU32HO (8XHbtEnװdg=x !VHKQb)1C0 inn:(*dvgb*:tP٬[x=^{SyJ:70m[(V>+Nx[L* zj;oa?H B?ǶB!. `XV<|S4ÑɆZDEU%(((}TΉ1aG|_ۅZFdrUiQ5L m b)|+EY3}r_SU,Vد]AӶpM4}'?8 ;!DG CB!D0MCױl@Dn(&0t222HH8KBB6(^=WUU1 0LERbOP2lh4+=`WLB ٩!QbO[a[2,efs{q!TS+BS)|*7HBf#5jDQfu,h! byѽ>̮SY-,VOs]2H(X,VUQsVTz1 0QU5sljut:Ӌ>d)h6xH97;?J_5 Q$Y<GVRB!>hxd=?#_dа4VyOk,L͆vgE.a ȓ(֭m۶?~+B4h! >W@$s$=;nݺ]:}^{Wg_x:u\d1;uvkT #"""cNvl 4yWY8!Zj闳DeHHH`ڵtM~{|Mi6G#нJ!"K;Xv{u/)zѧ9׳ZT5cgѲu|KMIe9ֵL[2VEBhX(9(RBubbb9r$ :ng}͢ѹK4il-V 6CB!b.`&OwߞAνީ}yq1'y/kԬUJ?>`&|<.tm 85 s"=]ݭ/董7:2~lYvchڵ_|@rR2='gϞ-\/do{]΃կ>)1rMNtjי'}b!%%JHhѰQ?IN=Ъ#sfX׭cwu·}w)tlMVp9zX`<8qC4hԀ3f`ۙ,\ߖw>>Sm^Cm|{?OfcǎUVrLz/L2];wϿp%B!]R%ceݼPV|[Zv2ڱtǎSIt:vylڰ9|c1#9q<39U&ȑj݊IOeQ|M\*;wW{F˖-ٸa#.KfB!D+#6u]q䉗W6dIΜ>5c-4YX4 4Q5r8x<4O~of3|>Kt]7Xs"&cCqS;Сcn0rWk*rTUGgԮSra&N[ի믿ݯ<C!t:Tl6RSRԹ#sS$$$빢1r Ǐ_򋯘r߽NPyZk< yY)vO1x^&\ nAm IDATӚ_yXطwo6gB}1Z, 9!#q\pÁ:`8cƍw^^ aj\Q}EQۿe<ۨJHh@vvBmP`Vk F*B@ޜ{'hrenD>}qzwϠA%ʿ^V6iB!ą43&CQIB!_Ӓ!B!F v~ !B!!B!(VRB!B+d!B!.UFe8sh'bz=%NX6*Uʺ )pBW!QlF H%LOe4݌ 4MRSwdMvDFdu!,ɺ1+I#x#4;r.fd1t6ȀNC,un,,$M;Pz]Y@6=EC!Upy\9DBrDLD4*Duq@ϩ .nFdʥb?i\{M%B!X9*ɩ=kҨvBBK*"Kws8;nIݦ>ɸ:5jT ;n/0B!D*.мa+ʇG.OpEWGc6RSAz=cFIWdi^j !B#1EXH9w)j|BXH96+ =ߪs8(PkRԅB!D8Z_W&-d8iRYʩ &U+Ee, TB! T2t]aszJu_,^@7VNF` ŞG~DZ׿_חK~B!ʶug7GemXOj=$s*{W5eQumƅZ2~ޙǎ\r1y*wEHHix-BK7'bPQ<+Ò ]:G%0|ܐSAtٍ&aۊ%ժsf1EA9t-t]Gul6>K,!((׍K1 | *\8e*-_^`{p]h/9\B!ĿCW0(^Z2|nSSS}H&MTq>!S,Jv=Qf0ylݴ^!۱%RAׯ݀.T,zfKiܒܳSO)DDD`&qqq <M(} +7uJJ <7n"8$^~Νd,>CӸ馛8zm۵[oU̝7:uj4!B^9%醎ay.f`b4 G޵4HIMdP<6/{(;c7!}3Pk n>0 Ξ=KN}XQC2zi<^OqmvFMc]=ˠ^C1p4n0 6n#ӥ?=;ữgcIII}=1}p,~=zNjϼJi-Ğ0 Ef} }}ێs8W1ʡ5ynɚkغ} ?bW_qlپybbgNr LL9bvZ)-B!yݥ|172otC'9)忯 O=C*WѲo4M s1F 歛8q?8дYS+r-V9\.23ckLhzC.L aQPNgfb?^Qvk3ضy;Y;F5ԭͱ#Giּ)}91F RHٙRA]^/iвMs6یaZ_)iaT^M63``?XJj &&/-Z/?g/ay_{:o:}MD>Yp!Kƍ8WY L!,hڹSahdĘy|lݴ EQ3q7x왇iV> 5n1Ǿqg03ch٦9/<1cغy;>q?kWQL͜ ){z#V421'Nwt:3: ȵnvSNM>v&?]-n㕷_bdZV^a`Xz29*3dL=,UTet_f&nPQ@f,6\t}UW5#((gRbrq]wpIӹKc*B!Di*j+nZ}n0q9]' àMV|H@u&$b۵b_IO0 22n׊E?ʩ1 sd?0 UUկ<_1_(eH0 n `F%_ϩ)pMhӾ nߙ#Tdd8/(+eL:IK6x8-[4M&O̷|GZ̓OSZi2h >'y0:vDZg_d*(YKƍR }AӴ )B!JբaѴs =ۀeS^{r7k37l.=;sQq".ᣇrm7pQ}*.FM;/ad/|@~vSaDV=fp6,atG3#?yГuk3(^#*su^^OޛTv}sf/' 1{ңsf&sFcƍa̸1ArݑM6P~k3εox%-- w:B!DiJ~=|5.a&x}>qTmy]x'ark/j2BtB!DəwLTaq<#zqcѲw2 74)90y*ZStؔB!4wBu-*MbN .U4B!4MŢj~%e1vvҠtG/Bjyݥ yY)?Yy*<'PJyB!VK4)9'X!#0ۖB!(]4KF Z]qgcK:>wjȘw%BQL+Qkpeft8B\6E=גˍo+Dq01 _IqI\yBQffv1ں6MS)rI%eo] ݕVB|BVP*W–ںh2I4Tբ]xO!BqIEnuP.;T2iT ;n'95wSrMnBHPhIvIҝiĜ9Ύ[hR)@/KYϳݿ)ׂʅEtHB!Dd{L!,8({O6Mp^{yV@7 \RlEnWGc62_gY/S9:;- !XU=sz(BD0]SB9^L嗥YߔkA_q$\Ya !Mf]̼DVç{~&tmVFR,eoʵ &U+EuƒD!(~tbrx27k^fR,eoʵ ^ask !({ o35а~CoH3d֮Yi,u m[%##4IJJfWnel߶>а~CZ4oOfa&gϦ]v4׀tdƍCG72 Loɳw9|H#&=׍7N!ĿGo0Ld?n~g ٲm3}fܹʫ #o ?sf}) AAiX,Lw3C̨#ll\?}?pWt_TU0Ljծɨq# \rht/\㊚5x BCCsm+4ǃihF+ӥ[4[6mݏ]7ݵ3>NMgZj} /"ccRa}&1-o u6NjӤ͸[hѪ9f1Oذn8G\O<'}.% 絗_g΂8RSS1h4/"۶ {^~8~At\?/> sM51/{wr\X^. ݎ(\7~,LX/dۖ|c:s:s/?Sl4 _%B~]$1YZzEhh(‹ӽkj֪/eJNNBDiFxxǎ0 ʗ^ze`!<<>}E~} oRSS}H&MTq>!?ݷCnz=|||>RSSYu5];wύtR~>f>GϾل~Hvn?~&a@ ^&MȤi9r(wt7KV- lkj+C4BCe\ |\+U+x'hݮ#F_ ɘ·$&%捛 apyƌiѪy3qضk7e,YE_0KW;2{ytޙ('gk1ZRSSIOKG7t/*FV(Ty31 /(׎]:ru} ?GvUS0{wC7tS6.v`Ǐ;iӮ5 ^3kmk(g:y}10|d`!~㝜9n«>=f|s|&!,jKSy-@iP!Mo ׭]OY<6l6qpx0㧅qf8޵֮s+[91r~=L~Fy؁-&&sYW6 lpۍ۳'O2yʫz9zft:eb5ia$&&7/C7tj6#]KD{a GӺ]+jތf~ݗk{^]q8v=g-Y7܏]nxV.[E.y frM4n(qߧe?'IIIԗ8?@\\ob H}Ʀ?bq\W2VVϾٱOXzUUFb뼆}v*W̶Mp:3?y}>.9IIN!4,7 6WۺyUVauy׳owf/p=g_mo?ᡄ0`H8=C1M8GKht.\!ٱuqLe T̩9IVWz1 m[pxLfy>UVb]6y͞c]83v9t/>c^ rHyɗطg^Z!fQQ MaLFDFFC/059jͺO::λ_?JD2igʏ~c^R<~_Xʍ^ G'6t_:)Dλc|;wrUDʥo͟ B׉>zZO?k#Νs} Xb)_|/;o?ymj=eZxR 4<ж ;=iȣbJ180_ ~ǹ[_mfaHnm_ۿ'>qL_,O9[kP( ~I zѓ_}dȢE8Zsι˗no|qXt%7t3̧CYx ?o/\?u/N@mR޷oG)ŝ߅4$\rG{'uyzVM׽4k BPwo͑aEvlZl~/#?xQ~_9jY2閛~_z/d˶Ϳ2K/K/_K=o\p1'n8|醛>|gwuޙGz $WuضEgwoul:M`GbOʛgmZDV$R [D_4aϟH{7j$J+kyӕoa,[}{obzzh4ʙ?}W>~dr?ړ`&gh,bݳsO=}(45p^Yvl r9WDX|1vG{2zyKZv,Vo:y>|[Y˶~#vmvnZVq=vp7z|o {A7Ҋ_ws?K]No.b6n: _f_ Grغe7~&gxYr=mͭM|gfI$/ ;2&kF׾9s9PZq|Kq\sٵGzWm"NrWe?ɇ|_>ŷ~ehmkooby/1P( ~W]nVo\+p=rrpn` |7b`t?KVvy|V>#|?X]y9v(P7R/U_mʻν!Bma5o`on}:;XX^\o B"Ô/:ys5?;<{W#׳__9m)vBP(CƯo^ݥUz~y=S/=P( n3 {~jo^10p7:\͛R[>l0g^;>rZ7nR(ۘt , q*%cD ŧ'USQfږ%lHkXϸ%bkYX1d,ۙgiJ|'NZ3* rJT9LvS{CF*OHǘmLL܄ nfdH&(YUvt%BS4MLFetYiv)icel99z1O-%޹ʕ~N11+3cd'oz-gtϏ+mƘ;7a`Qh7A^ v|Q LRH JXFRQ&(Zh BX/`+<_` ' "kZ ‰1(r]9.>Ca;s<\oʰe<ǂYHi" Ic.B&M*c.c{["4cE%.~"Š $|6IrD~޶ayfC٦2f6N0פT$3#9|SfbY 2&if[b-li1]q{={[GAQv\#;Fn"ԘqhDN]| 'رse\~Օاv9.nkt:KCeUhv:C? u)1zȹHW+Ƿ{4g3(*RĥHCL5s 7p׿Οǿ&{HQ1S?M]Jk.j%0b[fkH8YSJ<9_w+xe0>G3I渨v?_>6LY4Ȧх8ccHDzvM5㔻W"SS#raULh4JYN4&#F W |4߳>|A{sؘRclbU>!MіA LeL'R/+(y/QuA|A[s$Ikq?#vJFskXDj-N"n7ZtA٬h9١cf\Yo1c>lڐ0jSql" fSQV:TV ^R4-k`|L!Ԅ] T5$c.:R7h4ٽqهvvۤO8w 6$ \@cw<a.-9 F۬~/B@P,R'^ 6?&M88r~$^ҕvIL+MG[x&xTKFzf!i Z| h$c K~zEwm+wcItI|xNK-&&MMGUQkb;2bm%k 3YjoEMpEÕaZĤLa#aefБX]V["v aheA)u!u0͗(_ ,@k4xuLvkTsY҈D(5)t%ns lm(e؆!,4Am\ h颵[,(9tN1u-o#E[=M˂`n-BV)r?Q=MxIfxcMd|G_Cu64$M*x}Kos\KL'Xӯ3X~dg9:#M/QI%!%5 OKYZ;с/$rl& iɨt<2S,LWlmMFncI~ g9֨6lJN(vMP4.$қ\Jj)c-iDI'fF4$P'LLG!%s|@dƔI9)tk#r`4rQ@Z,N)E*@#LI1! AU1v ;m(NrTeն{>81F5hT$+lw)Z1 sj Z!]D);Uʦ+V4v%^+0 ĴpruʽBe^rlB6]}"bOI$뢍8-dte JJI\CQ5rT=$t@l%{Vx4X5tipzNFRJ0Q*xO;ٵmJ~fMѲMíu%O'zz-R|mO%pd#<~2;ydラͬ&OZIe![ʙbu'eH?jNvEB\vQoA:N>ƌGktelv&R83)-\:K 2R'^r84́}Obfzػ3Q.Z.q}~:tә(ylB:T.~=o`r::*2֔e44'F<ֳ/ų[sv7#'snķ, _ò|t4aҔ1wo`\ gxlS<ƪIZOj#5\n%1#Fbn~OH~gYos;_˗&Ջ8"D"h e?A*糴qOgKu'/7H]Ϟ g)9})v䏗{E&g47>~|"D~X~%od5Gד\{69!3u.ier"MXyFFw*hd̋L%##g^6 {oAmvx}Hݬ7=*wNbY=Z}27\"6GG^ǔhdycIYkI''zvlIЉ\w">~wTzk$Z0!dC`}CO=DɜXNqOwu^E~2m2ivHGQkvl2p2#S@tBdtia|I4Zh-0a Z+6XG5,p|0$Bh"I ñA(D0]V¢Djh ۛ1Y`HJ Rah%Їr1 9UbW(x :@އBRqm:"ch_ILOCPbaHC+ Phu@:ZW*Ru`F6p |o^ߗTr6HEPlG0bJ%1c.p*X;͚jk= # i+Jea[Hnr8UP[9##KF1Ǩ5S0 DR "Q T{$=ml IDATKj5TBih1 @!" 0"H`R' d Ra`H >T%HS"AmX :`H,F ƚ/hP 4JTz舉PS{~I((?pMn[SZ6@Z 4Ж4B͟KG~R %L,-H) <Ll "‹%xxCjD\I`I|*/hE-Rk4D"P~0?.@) Fò!`id < %1ա!1#,|DWYg_m$;3 M7֖fVᶣw'2tS/s)<`LR];̞],q}o;hy, ^Hs:Vpvx[9oqƣb-h?is-Üw ׾O{W5sq[Z4c`b?cˉZ5q2DV9{NBz,'XkP"SOS p#t+YJ/}{zeߣ0'qAu^TkHUyvSDKCdAH9`E}xo7.c!J7O{z!lˆV&l2LS)hȊ'xk ى6_5+CD{[jdIT({$ Qo *jd|Z;N'TL2D`u)T t z@,ARlܥ꓍EF XMP6I5) >4()PB#|iueUD1.102lX Ab@;X2#{Œ5fTTl Ey`jBPmЮ0A!4T71A .!}Z*-7hd1@G's{N smxc#0i1PAIy8V@!ѻe0=B\ACqgLVZ0XӔO1գHM4h`I{Y3Y#Rdzv$!eܸ?RabBC#:3QUPtd鶋Ԛ&j)aҀAP5yȎRS||G}˚JeWedx'1t*\'R8^pgߨ[,Dαn A#WN28E`6AHq('F=ʸ5M4hzpIfpl~<Ճ]`&1a>ګ)r'9lΩ1f dб%2(ckBH(Fk SmWQYXY,%6kfֳo$8eMlhxY1˖&NZ(S8--cX+buASBCܤRLLO'~?9Kgk ЎP.,9aVTL>Ac&bR> ^X"\p5 ~.72:!,bRzmbjDH9L00U[QtKh"ficP-m'@bbahjkH0 |b~Mx7@X R$i3A+,Cԏ>,ҷl"4wtcd~B3eţ%‰H9w{y@mm^EK"vc4,,r*}Nr%YнfIF^j Cw)O{tKi6BxBb2zMEXF%?)7+/Dcٲev=Za>6lAV <3cy}Si=Mm?&=}!VTwneֽn~uGY-ǒ'8Lgʂ~RRI2eE))-6ڭ-Heli+ZDjc)c_l6d&1gi#`=XS zEl4{Xsoz++$YF6Q>ܪX|78~^\ɵvrv,)غ {crySs(SS@mlk⒡'xQ;KiǴ AlTD"ՊV_i+6-qW4AHܲ4SAOILj+lO+6|(QKYuZ&UhT+hp*1Ŷ⏱>8jYey[k3{Ν{G t7@ (B8(YbKJN$ǥT)CRT;I\VlEQ\*$j0%"@Ls;3VNSD?:Wk~&(!oK\.$+))>q=46Щ@/ʨ{U2b#_%<0Κ,-U8H^OcهP?:cv8yyG|q*)]^!57BlT~UWW/Ҙ{?Avȧ|nغ[3|k#>w#wP 3_7[4^x3'/28 OԧiWѵ=]L2}3cv~BqnvtPoe`W0¼צU Y}m>[یÌi?"'Řa0#[94ۍBŹZ|t δx&:?M22sIBc`|68רs|KWbam}]jm,f8w9<}|Ai=#n"uʃoץl_`8osYVY`me?hy}ʥ tUst{>^Q;b"ĸʑ˟o#<՜᧧|UAq=[ .~o]$ؿ‰-X.^L)6;ԆwG;1^IGf_ȿ'yԿ:ǟ,柟g}^_.j.o.r}1>*8ӿr[b15\gqb;[gq-g4ٲԦXw{;Sf^.Or$}>8<Nb8.(GglPׄ`{3 䍌[,a= O'ѧe}kY{E 671 N>^f/Q6;>z#b±27>{ÐASwrUr9Ķ%8vf7|{!8jEQK2"QN(B Ujc"M8nv8= $8 J-XR "AHUDcb.N^G;QBE'lУ!v4K܇Q )!Nn"hLi8yV*6Q)=>PftuW Rcz̠J4QDV!rdR6n3!DMeX%3Mwop2w $NRރv&v|J1e8W}F ~A"vj5dv8ȵG>0(⭈n9GĀ$HԌs qxTtH^ͱ%9.q;Xh IH*J}ae#g9(8cZI.ͤ)GGo7$;RcFyG}"쀾Ji.k5ʵa2I r]ӭKD# Œi@K4JȜ=Fc&y?xeC(N2^:g3VQh>˓|յ{^Nxek"P(\y77?ARq3W++Deڥ7]aSg8z YstuRfeM}_xse"LUޗ1۬,NHqxǨn`jw J hMXJ"7 :)VX!dX@*lrb%|(T @jgRph)1R &^r&V x!Hk шSV %1RkMctKGZ^%>ΛD*{CU^x9g 2)fFaGvH+T܀t6cWfL-{1rEߍkQ.3{f9“Nk̳4*Xޢ>87Mm D(8vJ"5%[nHe/6ihfdE1Nw7|qϡ2d9n>&l. ׻'/0[h[12mfٚ[}(z]HQebxb!N ;|f4͡-6J"ϮBf{ͯӛR[ޛ5*r;_aizF}L +r$&in=hv;n~'4wdR< l13ze}V)ZrvRVԕ1껸ﰳz vDQzdv`[<(LEWMݙ04 ypgXl2p W9#z!w*̖B[\-(3=C\Oorn#=Z1s%uVzǓwcKȠN^|ĉ8yٳT' VI蜦}۾Fd9 FK&ؿF?W#_v].FN C)wIPЅ^) :'L0WQ"u "l/ˌΣm0/{Gr9"Msm,'6gHp.͐\N0(35:ω#|>1^e@s4;t@uA25EVp!"jz | M,ċFCAVuqK=2i4D>I&j$,}'01H# gl\엹|fDo?X\G_Ɵ}ąfa̽C-. ugl6xaLK, d Gii ?de֘q55[`#D2E?g^x8"-Rjȓ܀y#i<=x\)d(Q>9Xc]C& =rݤ`\, -,uE $raPLƥ|ZC_vbl51t1I[]C*'1%T'SR@lPeE}n ^tj{TԆ˧"U3Ś,LW%]`rXi2HrMԉ9;7^'=L-2j8ʘ}td\KT47=:S#q"=SB,<͹"ĆFA貲us?Q1)Ht|gDc(OOq5{[ u{WqMfI7s ):zw"Ed,VdÄ̭QsAv ʉe,g0%EV GF5~Ns!l^pZq^g\++vXcX-2棍yVJ?!Bl$5*MuE>ߓV0\>O۰L]^'6T?M͓l0DZX]qWTeΞH9:1\Tr~SxܹYwxșԃ9sPx|\;#*|nz@P=e',bz;}f{xC(׹>G{4zg@|xJ<7%m8(t,\bo[5jO>fsF5J'ǝYRux9Z%{<&8ys^R95:+JNb"΍W̜pK^^$$,opx'&&8KzZh7(ϗxs)xna)\dNI˰o`\u!Va@TS "yR~dGGe.||lLBd?)U91 QU2Ʋ3Ҝ.c\ɭh0$ Ek9bect;|?H;rGleΫ2F:): #$*` 9U9BjhbxhǤFjK攐zD1E$3!0&-KAdJ1!k\djHx2!u23I4GTY9qz# qRbTf駚R:$V˹O'MǸ〒ZA+L8gomVQxFVGerbɏʨUW|-t!bYIn! raKA84rz#q2h033?QC})IFمП`sqzgKA )ށ.v{ߕ€ֹ=/~&Ka{NV2k.,9%q~bD>#2{V1ZjD!mK-d |F3WkDq^OpņWzA+R$#3rH3 'R#$BN ,'7HJOpIWFG r@z8"Va%JZT' )FzɘCrb8\va;yN&)`TϺr: J7qb'4 S\Ȟ:cj*ⓜKVb7`C9](f4+Nx|{@tQjcB]} %΄~NG6piẺ}.5pA&s}Kk9RRwxc\dd)H9nϡwyCzgh;u6<"74<1{k4v\6"eFS4}B?oesסOI 109 ;C:bs&Hhle;- 2^h~ [ %j.{YzCU1l~Z|RUspB"n ~w3LUʦqq^ |y <Z(lᮝ; /ShҒ`qv:Y(K>;kkT&ATqx8' \!5K}9X1?3MkvX_g9Ք4Kg:jgza1msP۸r5ez0Ջ.s}^"bi,p 'f_K6\^f{'Or7Xh_x$;Xw $ܹ򔓓=n55IX+Ì5GdY5Ϲun9-U`y"xO7G؜4"E{fJ+Pճe h, ! ^P³ܱ92HA¯?U'86lf]]Ze)d[br M n]ei-ZjDʐgܤ$ciIf豏,D!WdpQVc2<26XZ@` E MhT f`2R TF0J=EK"/%G[+ L7'ÒKFH L*NRX%\Smbt)ņSޅ"ލx@YRZCM}eFGZ#ŚX!%+%,WJ)A, Q.% 8>FjZ\O>ԇ!"ROpblR(1E"vOpvo7z32VYWӼse X_x㯟?us)dXI? Ʌ<ņ% Ha0`<.a-Jש"H9mCfB& -&@ɐ֒ CAJ9VN DX)0B z]IyW0"XRMa%FezW?GMf1ĭ\?H/cHx1ojG+dCtʜVpR^vVqom˰[%#9wyt="jNpثn=bi黴l 1G Μ[橋'۔zVSvR"Luq+D%c/maN_!r2@T)H -0?OT3OO9R#F(R1Ag.cUvP]aOZChN2:Js8Tra$4AXH8!ӊ\K:˼"t™#-Lk|!*xc$>om68 %CJ;ww T×1VGăQ]XG,6[xNT] sa\GX2A oj~[s{S<rsyZ#iȥ@0Ai8Xa'#Ѐa' DN!jZD*đIr QVah.6%i)R(P!o;LZrjL>k@Y:Abk"k8lcaq SR]`WYR2.,ۈb\)Ac#㸸i6:J@aOXnjF>U`:pHl,FLbCVH*6{w[GXR=iu1mQc3&M1 53vF:"l@h S  rCMK4;3= F"dqNAfݜ[brRQ$.N w#r_~P#:)d(q)%fBB:9rXI^˘ltY: 4GHT0B. >$B* *l16~>+Ko^z?H8vi̱O%YgqFޛ8&]عQa{x)CifO /sRVYl0lX 6n1q6/:G3>xcka|#2OeTF='~sgr ߟx Z6}\f2rwN! ;HFj^ξ 䁥dր)[EMYFD!KR 2Q6f-=$NfxI!hy ϙx`H GM2ܜWhbQ)"RnHq|jB6{!۶4CI% 6 7#cXHO%J'$R98Ri(2@LR$(r3LJ[ 0 ۍ:nX!KR$@ӎH}8MrKSZ}v%D<rĽQ.)]T*=δ.R.t97SO1#s.F]+eCeT TCڍIe" |2 G Q-ƈC02>Th-#XFQvREg-öfEƔ,̦:9a.IA0+!R82G6Et׵d)C`**dR1ZIre3wk J ]50ӒvBJ,0+8tAij!JCj\r @ vؐhdŢ\M|e<ˌau /3^g 6t)) EH ]i =V{$Q` @nF88VanC; Hb!%?'P?'Iw_PzҌaWxkkϜZ\c .5gZ2[JQ9c9W?gNWi5cܘ wKM68nJ1`$\h{V܅ ܺ:.=}cTLⷿ ČSHOwD{lO@QP;uҽ (]Voqj46 *YI)&\17K] JGydqzHN^1|$h8č"+\2r#:VP9ʩ7>-^Xaށ@יq 8C2ͧҽ5=~oj{v;̙> 9CMI$8V$!رtp#1 )a]"q؁r,Q%vi3eo:t|5<f~۟d 7qQ@l 3EpǗow. @T &K‹/}f<80?E%V'UsZ]'n N4uӒ4)=@(a_x.5)"c;;FMg40eob %e1FU.6q#pɄɘ*ľɰ!<)9!݀ $Dː2e) D%dcq% a\KcjyB0_6H-)} AEh-p^- yV Ӊf3Du`%7 ;Z9D G!-̼&t k"ZA6 U`ZR 3*0U oaZ<`k<՟>yMbcQw%׾U]qٸ$_m0ZI1c~fkBk .`߼{?$dUk4t$(6vãutOj_)†s=q~ VdQC6"]8nEl=2J k!,^xcݒFeB2Dr NpT, *=ZL}rهG7o3YᕠKE{8, }RRHF?WPWƣ|TKd()mRz$)+%X\;H(j C$"$>x b^" G)"UD JbkA$1؀K$QlеGkh1#REX+45, F#6,[S~{$6,'CP0z\l nm15egM(( ѱ͗ä@cRh2)bB,e-$QCq5}Cu9)sO6_q>w-/3$iV?,p[XWi_|VX 6^yCMS=?X[*.3*)Å'ޡs)} ?8&[;bk)}~|:au%~vq/ty0˧y\F+ܚ?|G-pҳ(BB5V+Qӥ2G:t@pҢٺ9J٦ԅIOWlo ' 098E.C*@)(f :ݤ3ѐk3]NrՆqfr"(%4IJBT681-1OTEQHa&AXY5yrPvЊ81d_Iƅ# MM9BTAvzR-bظVQl'[vBƜގӠĐ,~_f\5k[\{+嵟?qS_m[YP#̢sO`Ғm8_uv#TٕLQhG,ј0k\?%[ckGԼOu- u5\F=C"uDqUDi(QQP R ZKt X˳W=:A Zxl;`2atūo5|fj88Y"13=2h krhF5(C, thɕ!$:NѶ!4$*ݕ9)XȌ>§+k`Lv7b'8D`MSjiϞ4*R1'my3OЋÆeNm-CBj3G:cdDVf-%G1,Nj )1._AYG쉄N&o6w;nܣ-UHJAh2%& prIA,VBYAHzb/k\~Y}W{_3T_X]/bOR /,7G`(Lq\=Nnνc0-?g3+8x~Mm3MH#oCh"O/=qy{vƌ}7[/kIŰ>k,bvb КKnsR@I7rAt5-qTHYm5gW!;u1UI"+!J"2 C#Ha~!a9-2rT{|g8M'[N1kf(*4=KׅyxļަnVWC4aOzpkm\yǐSރz@=ЦG_HHnѤD l#9'fN.y0fҚbnfnhmy,$_hTbHzCF4kcv{Os2ӓ_Dl+û|.1߼ϵ}|ϷVUD3[[~(q)Bq=p>s7/ixmp6EQ,^ij[[=:+836Y>M>8Zيڤm\KtVNKF1Z\Us n~ IO~53_2tP>8h }0xx%- Z&FR{AZvT3 RpB"u0éM. 0K|$1_8!r2@hR?2#ZNcuY;}3j#q#'XlЫ@6:"Cں(wb#NFYͨ97'߭UFSȍXӹj8~;?Qur{8 [iA~?Yэt]d<ﳱ"ۖhk$hzsp7«fO7Ҭcbdcse!:w0S!gVXt%tb1v@[9.^ S X@/&g%a7 N2ܱ'7Xm9j1)С{$=b3d7ܤJGH+X 6]S*\Q[R`2`TFxA\ jS}z|vqPآ*a.S0eA {`T.9l( ,CbOݯǎ *9V1pAʖJ!m "mdI M@N. 9uuN-T,glJ=hj9ň5TX0I9Q6@ ]+:SP!zRFhӊVT2:Hwuk!wR?@+?p *N=K Nmzvd!{PP?׆G o,M`~sګ%x`0Zu=>gOq1?Zp1}o 8⒊:ҁƃĢ޺?~j&5{h ^eF,N+pGR/@-pIŢqNKx rZ#a1,u Z_/íTXCڥW3'(/ >P-DF3l3a7hڡ4jH'88膒^s%c_%z\I1=hN4ʜJO6fnvllclƈ.[ NO#v݌A&ɲ'/mS8-&Ր &dGY%tcLEHcjE;J8o"h6*K0#YBSi@FL ` e~^`f&2QSQZltp> _r;j)v!KD K);)8\-hR-ݨDJߒqlJ-o9lnvjaPLQkkuo=i!ؚz%L+O-&47hES1Yp= O(rvxԋ&քvB}ө6?ļ A0ՄPmUt,*,qƥ:a& ]YN[̬A*Ȳ>QƂ2Rm$?hTF"<!і`f585G8C( p>`XU K1v6g T3jN_SZQD fQr2@ĄMD&,CduhavrP LJצ 5;żNiGuP6&g5LsL4$ I1!IX;W>DJ悶Sf`ズЮ uN0j1B9:^Y-q'3܆$Ռj"񋨋רB5#ߗ<K\dng2rWvgg魿-r I|K y)W^G;@#DAb>8'\jϳrG>dt]bp 9ڣr)b"PZ{9#*$7󥈺-R8+Z.|(O[B/3,ш!:/R+PI4'=shg/W(bEx?(N䩺G2HK`z24ۧfDlamx2Җ"2T^#lKpAJ?nXB`+˷$5XbyJ;C-, CUWVdv0{᜹p +sT\ĹezCF ɜ|R2wuBeJD70wf׎x}HOc/oĄ3#9F^y8|@'7Y<}跸~t'#gUJ[0J#DY "jveLF<$BQ 7ON;XQ&^[tHim#=(\;f]/yhӔBkx[: ^7 `#{IIڣ +Z겇S泣%2tzמ|!4fȧC2Giʁ5bĩ0NA UHF!X{ IDATMEy Ϣ[!khQ5 =AڅDƸ4G Sh|^J|1[d#p6wnLe}ZyBp&1 A·.B&mr ڽRe?qK0ШYjy2)%OЫi-n`1RP\_!B$pE5%XYYz8W=J(Z\|; V-~l ^}B:G >}؆o=Is5Uˬ2-EN=|a;=?xO2+_j|ys7:f/YWSmFxz_$=4~W,}/,`\){nG_9(' 65prpAPךk- U.8T*h "vEƓ6?!s3G==!= m&&RƜrMu4A19 ѭ*J Lt!DEw eLRKAHWY]`7Y%ٛV{]z6i)n,kXHm;tzmxۆ k6q*mЕ]G|$#˞`[_kDsVlt-#*9姙48>ۡ{ȓ_c\9H\cz<Y>jkToQ3f`QcBr KG4D6"0X@|O:Eu24ۥr }ltNp||‰`}+bg?L9D5jĺSUvʻrcD}_}bȍ_Q_$ 號f"6w}\Eml{cv@6$ltj zq_h_ܵk^pk1\^lm:.a,dъ񲃪 UD98K1PuqoAJxUhBRէ(!X4"C*aXt4"g5z"*Be!Z8@Y($TD7,o n/7qB>{){O .*3{ǤdVPIEY0PP;IPYNޑF-jļ)ښcRG0gtcRQݥݚrPpD-OHUa } C?rdc(!EH4 BYŨD4ҡB@Xԅ +Rxt\~ܖRዜyſzkFO*=i1 x 6X.+4./=x (PqOcSVixiNx5#\9|ȧֿ8|aGd"P.DBwGL1{][C2bg=zE;s6s4ٰ r#B+.&5=af2A@6 f4ۘBp~c )&uW*&oj"Y* S(+SI6ZcJ2Tu+a);legS۴݀w``>$<.1/0.9dǶRZg<+ 2^pgz+V(.P`1HWI'ɘh)OC'oDMB#RdSNc!4~QKbȄIZOf ƣć(6;_25sV&| TN(q]bAbzp p((@BZxG !Oa F"KbO,8xA,X'bi !<tlrvIY2MIZ'ڃܯakノI;7Qo|s?6*/[ozw_bxi ; y~_S:+%?_7US?c7_{eÊ'6Pk/3[Tz5m0lY hr8%8y~2z{⍘噀δ1glG-uBYDZ풙8c6@aWk2;C2cBFku.`1q'#+ZR(+GKb)hOHLb1gSQuDedxOpe׹jqq ӐqhP/0(4VARuђzͫ%(BɌJS!wSCۼU!}rz ߁W| ._~8ɠ0_w^/v>wλ?.qzVq2Miၔ` Q(aB(]v4ID@%ªxMu37HKw{ycQT(i|"4Zij?Ϥq1R\n1M͙ij q4#dw׏du*~rT  ]Gdjy͏9{nob-jVHVgaFKw8<[bq+X8xpnCsZmn!*[4dq=Όá4q*j4(0.+'$"EYst9r S5˘KXBS`֙ܡU69ulZ9HN25$ӯ^"m.05? q} t 4zS'#:{0eda12s&;od,B)[bY2Mű 1hPLX`4d]IcFqR.ѲKTQBA\dܪWBr̰JC,)R#w*i d}U)#da~f)]M#dF62r0A[PU)Ro8G[Ee !X"DZK8ŌcRLye#Z^`Xʱ9cv"G:T\jRLK"1SG\ ood hllqpl ־K lmaYD!}[B`cP/`6WؖAJMo6V`IE!?پAX LkP59)1ZO8cS-Ǐu}_O;ܳn6~/_~\m -Iw0E;f1oG/}__qDфۣC2&~|di^<{/U8rKyjfmbM*B8$b!pd `HO$BFDZ6("ݴnhme Lƥf]`Yų-rNh4FP vejZ(w4 92+Xas5 /1dڟff[:\GZd"ǦKf]( z;TSWtLҘ4U O:pYф,m pHJ-4~W&uP&%n3)n)0WئNbtoY:9Rk(JTnO?Fu4\gQ5rYvlbz&.a"ᤆLp[P FNغDVz/m*q'1 W)-e [r_1pU⽈(6QssӜ1~c@M M!(!!" F V@ubja2g8s8Ű_eyF Q6 KnG`8פo3J乡V.13W]Cv_~yHu)9{/}[{{ネ :&1ye!'3~ԭ/3"gjhِlN7YBN.Uk]wNO`ysto1=情k\1լ>}5P&͕n]sJe:ϿƍNQpxLv7T2֗yIŭ3 ,X<9+\L.1Yc ~H}I{xK,&MMsI[kD7* dvM쮣 N~嘬jB3,] -XT C %C7#tzcJ!)DQ#ZlKPJ5TǐqF1/ =4 j d$H a t]g.G`X&ȺX 7ŠCۋPqꒄkvxB\f)I𹧹G;˜~XyEOTB-Fgie37Kp >z?Tep;$;3H/o~_/!!4*X`X\(!ȠR2\F]ᛴ=5|L7:x5㑫Ys՟F3kfByj +[Cfde ۨ ']X 1#f&h0U0 8:Cla1bi!*`%6ұ'Q̣QnD!g*]eI C$.2cƽ#*t'ӏn@䒙jJXc)d,KSBmZ('@(M\K 5EΉ-^l!6G a2$85 uh$g iP~DI)CCPc Ɣܗ$<~o%{Xc!FV"ftv TI"&.7 rL$|EUF QH7?FvHrKnEQx̎ wJ{7r^ln (Zc4f}T'kG8r.A!z턽Gg;m SO? F)U^[?v0UY@o,Ap%.?7^a3ޣ+=N0HQUf ~3Ow5 ֛<8p :{W}*Uވ˅U\ߢ^߻΍P '{tz'@kelR]㼺͟gW_{Osŗqoc *&2Ó./0j[I!T{L㐃W8tͱ'-r+WBn^ )9]RP_u,/#BP%Cⷈ-*c #.P"t/v&(ykN}e*5I,S'PUERLc\2X1X+ClQ]B)Z1̦"ʏ3SF 8q`WEX|IEYDJE^A<\/A ƩF4+1l.\gOr0\gL=iQHrCJ}n`"EWJs=&UCwhmLm`#ݜ?|F{;ՀSٰ%^#c.$n~RY0ۇt+(!Y IDATEHM6Ol!B+ 2$2Wߢ!8F+C?ϩ=J`!ӵymIeTG&Q'#$  Ϸy)E _IbHz8 PJ DGe:8Y˻Fhhc۵2#6JBL4̑&ô tF +<;Pm.=O5Fכ8fn}bLt/ج8|P1L'Y5ca,a斀YZ=9͡gk{ԏ$3|)-I!厨Oro?Me^quǡ|p27Y0vy.ǹ)BzkS/RXJcYEIEHcC $sP D -u<^حSybjӺU ;PZV€0˰mSIQW^m"2]DY I1Z)m22KX¢8U(y11a]1V.}2e9ʖ_i2 {&\uAǨ1Qb'-& ^GRjj >2/?M&q~ cGέf 3b,/}: Piv45R&軂+s ^^]Ze+)a6ͽ/1%C fa>tNےvtmzIBNbg5F̔iS>m_A_K;x܊g}ٽgR։{xk*E"F+JP(n]J=]8"9oY27<* 3ZCq .a$Ȳ]!$ t:MrިK͒5*Vi֜ `UN6J MDg99BdTU!wŽ}~7TW=~&! tӔ[=$Q {#dhGBaאy8A.压<JAdG;lP ClϞQrbʡC2bire_=;9R5Ч٘RqR*aԑ|SLb\`{:feNsMV Ugj9 P}2µ v~D2%ʉ26VA^1%(0%2BFR'#ORaQ ML% R"h8GA~N i&dR(/|O2+">9ϹC~g'G}J je:_9 n]{jl:=U/p%-o ~h&jgIOB\! ,c"g~t/é ]D/#¡fFj1 d ߎ0$3"@4:w@MO^\tM$4X(KRh^ O^/p{e0\# S~oXDRկ?oE1Kk&" 2۟W}\[I>o UрoQJ+h[ JgQFR2E QHGNQ jYD4C^k_w;1]7x%W=Rb)pLHiNs&Ce &D~-FxEIb0 s`K6oyXp 3h%p?U#$K^P9tXav9$(,/^Wl ֺa8̌"M>kS,ӣI2{?HnspLae|%} Ub?.ʥ"]9JiC!0hrG0^0q8KkX֢ebȐ2"J] &Oh_/sŨd0X%shtHܔ9?qqc{tǑ$),-r!{S2NNnsr5=hZP!6f fR]ĎG@s'xpU|ō./PIVص(07 }Av<>Ey]q^*hmIr#`:rǮ^I.ތ01֡lO1vL"/ 7J `:S"}T˦NPΕCs3mf ˌDž+$ßme5WeȐ {IH`,\&/G Ef>*XÍ"\YS)p)E&Uq̠df)F1(oϐ9ʆh6YAS.$tE +b.y!GIEQ=*$ZRqdq4Љ4תX0>Nyq4ߣTх6&3kH0 tC M~~ |+8Vʕ./CXrD[Z(V!Q&S0"1s.Bn 3X{govIkY&FT$^Th)) QMBbb#ѹlNRd2C&d C#)97ƶaf㦆Gu!䵳X>z'g v+p#M+;[\^؊6xȫ50 q8H3E!Ȅ8ɐ%L!qa*rcQ-ryD(DQL7GB/;(f+Q̖Xu嘂V 2 LNsdn@g9Rg,KClb픢#3I:h+Ǒ,㑖%7~۬yu|CƯMfg=.fodl@r5V.9f4pSn*Z]hIc=$:>N%46PkM2gaoѱ䶭 9\yŹ\X DzmJcQr@،œ!3Y}`qZ굩6?|&m44Mر{j"[*II-oKlG,MgNY5t1!^Qb5(XePrkNC :̀1>2/`6z~3 $X-J#f&jUe^kcL7OlP%G#Mh"2fCwb@S[<`wrLLP|ryZih&aiIGdU(3NG(WRT!!7EJ. RkTbWxVtll4olT(qmEbMOrw6eo6ܸʂE.vlaRV 5p3yxN9ص9{ -(סdets 6XGV*PwsxY^-旖o5j׸2>GC,.~@l<" qctP+T({8W路6"+(`e9._/s\됎4yr(,5, vPZa-% /NiA˔$$!#V?"*X-,)bC%EC41Je : m,qQ2Gi opb]~!V)3e6XWYS>Lݞ>w^"x'qwN~v3D"톙.kA_).:q xpq/|f}i8{et: F 5.ť.8-/lr>cWE)$*$|pHNnR,7Y**7{|mVC0{9:ʕ/rr0p_'iunsX*͝Loxj\Y<̀1=$P|c8/sd\,K-U.WQsws7Lie\cMd\$=&W]拣|Ruږ5V8%~⭃jL&]OG'rzc/m:yG a_%0‚iRdt<8]go0fl9jAKWZ!0&ΐ]_R60=bdi?#6c &yyۤ$Kr2( v؛cP QӊELSe@~u ;Xv '1t[Y¸(S$GbMJLJFG4 DH{9hECQUP=d&v+8&g>y7}hSlt(=%(8N'(\3cX<~'|OE[P(88VH!bӉ}*!4""#SYb!sEH GNss/0w*[gu&~}ހZ17_X nGC1z;fgYwlP&>R01R^H4RH0`o)Rbn;KBl2\*b,e<;V!!W#s Qp]p,|moS }=%J?xN'nLg1k\qP-H9ޛ=]z};L<[/W?oSc:۟qmu;;ˌE$$E8 +La{חj,E[aa\LwJ$ ` i{O!I(uJ&ƘJ4$ (*v(˂2[`,;f .u-l)A:a< )v(+Mar i@+^FR,2B|z|.?M3Uܝ:yq]s kgȧl.^f=6 g29ݦ֫P=3aavi/#Xڨﲏ0}tY2ϼI G5-.o|}#JP;TD\qeyoɔ_?dt?RlS:&em~fT+%%f͛pp%ssu JjG0]̿OQyL6ߙ9 >80e>f(新!J?ǚ ,cmcƀ0_"uopgQ۳7|N-%Z3[,8?OUbUd-vЩ&)vST1ž6UT@jt@3TRmJr;Oh$*hf;aXYC*Q|ٱinbZL&,#rt¥QJl`*Ve`iDdmg:V[Щi*fHQBяY1|GkB#IˈauFޡYʘb{ Gv}nu$nBMF]Ɠ*T"3]vT&dj>lewا" IDATmtgh%a/LQY 1;Tfl]RTL"jǼ~U&wx!N{`nB"R*zfzg T{+|?vm %HoN9yaزJa$!W9e).Dfw$־c ةK^+dYAaz%T)J@['LO)'_XĽ'O<-ZZ:q$?Ԁ{ye0+ks#Z]H]EoP{o)$ڍwx"_9oģ]zOog}@y[d29(͚iɔg:eh$uSfT!D[>˄ՠ\gEfմ F/δP`/t ;uM7QXnz|sglaخ3L3u :L)ЖͅaMG- bB£)]kaB 6̙ܼJ{x:4i4 V&N*o `J,G-:%NŠ&SOj|<[%iS$ R8 dIE)MJѹAmR]YEFK,23 FY FcI񑖤T'2S!+2bR}'o#ڝo[eʲ%e77>uI<$dIjYZ4N`'+Y4q|[_28ӡ~7%YsdĚEuU/ovRN|Mc4rp4RYe!D}"] YEf\gYm͍1}4,3V|clSdس3SL=|s/]l]f˛,޻X0zu,Z&RnoTR&Uȴn24JPf EbSk<žC1cCmʝYLoU  쬤Ht~TqY &9VLS[HPCAE` ^75Q|_!M߮`~:'<PqSt ϴHeԙŒ[8s%N6~nBk{N4B_&j3' #omӲ IFI3t7YOT6`@qns o{nz{ RPը+!MKAF`쒁K|P(`c%RQ yu, 'ɂ ),F81a E |ڡ0GPjPBcM H |SK\ZDטI==FN IfaO_x9OCU~?"f;!oVci%XoW+gyh1d5zO^B&_|O2jbam6yldrlw+kGLq(ijW*MZ;r-T$*)Kd 1@Ƽ^<py5Xɯ<i[k:+2!\ I;5hj=;\>b1buYp¯ Gx1t17)e2Pf[2?B/|aV]~jj iѻȢA-tؚE$f>k:-]j4< iwXp֛HC*,0"R %rJ)hE74iFABb$~, K 2GOBJO8P 6ĹyNBcB~EFϚw#PYܽ"?yq1EF)Rшg;۞l0 ehs&/J_-2_ ڳ>6ߟy6N:!-w&VHl a۸^@4}l(mHS H$N%!m /^'GK(vch/b6o|[Vl*;9I VaEI?ωK3F~2%$J0~N-/Z[x$԰!A`j}c,/pΏyR@ߴh~/B ?v؝9sT][㘅:{-ɵslO6qDDcx_d0ٽO V?vq g]wӧ2O-\䥗$sl>r TnA$3S8qR ]R<\Jrh񳊵pIǎSܣos|/֧sp" ^7i{ߠ7m!G95wx]F0FC>u ݦhVx.wwLV9/{ʗWb'~ȑ) ^aa-VNKJHvpJN {f’dӷ1G={W_I~ۯ=mV8lFLmDVkr8pBRx.m$*%:CfC*6`3էWV2 1hkIvItaj7j%e_X&+s5vnS8 rnk2f$$v?ŮW`T3"YY Q}'cR^̰Gݿ=,Zk2Ies.Yɽ"M c.V8506*!}sV F%k=F} }`df(HčK?{ړsQn I ơ8k2W䖅-ѶGQm!4JkQ$.mL Q-qr63A3zB8hE / # m I"W`K5Rp-ȔR$|* Éܺu7_q鿤{Ewy&}MI|kZpgh[.[ֹ>zedʩTtk': rusk\ =_ po~#Lz&ӄ>}i~7xf돀ȦYpbe9a(qʜ\869XfX&K- H=mx2$ZVαEn{aFYKBn皻| fNY1Tp5f3lcT.6GXCSňķٮKi{D+;zo>emPN&$b?!˵J\;2#FِɜU1JH<'&*s\[  CKQ(zX~- *+ȠԊ/Hؓ R`N‹wD>޷8x<<)ta^}$cXFNk (\V6CHG{TN4Nqk'~?v:ܒ3B@5nƌ]]R"08vX_qDQ#q  LRbQ#?0 $ewbuqqS(Xd5Ä kqY`u̘=#ҡ#RĂf4TA!EH0H͇Xa ?)Rq?#9&g,O:;t9`ᢜjG S=#H|!~'Y|;tèA_޽+Og7 `rtie+R>`Wo5M"7k.?Y'.Msu&83Gndk46߽3羉m雿"O:W7WWyyYv:O.`ؼ-|veKS#baA ox[ܝosG#Zoҫ_NS(2#ƽ3!vWXp v1L2WpFSse9r}Wl&}J΁ڈMI|fܿA yà@bqLF6A!-+I !rI'.U pGEXy"*$esd$i*y f]K)K -RKbpDԘ3J ,AHF`mWqrq{h;;XWH&IA y6,g&O3|"(æ`qmW í$2@ =Ũz|e"-3޸̨,P:$< [!c(RښlnZf.nlYM4;?< y}e/1i dFl  \[ ,,7ضA(r7CsPa)MNx $ fbRJ |$R+$Xa{Ȅ 8t` +UO0X"lε}l*s'X v?u~Kq}TB6<Ԗ$U㴎;fhQx9료 MM>J -;v}U>;O?[,r{;GTr;2sBV}g%7Qcy!l({ z'Ln287|2Yd ɰ`/`e8u{>lSXJxtx9ŨܰG(baPg13tݺ;w:/|JE0{~j#'(Mn e.BDW $ߨsѹ­ }<+YD{=QmpBlJuQmCѴ8ȼ r'CvWi^KH2f(8sǧqClQ΀.N`\`>'O vꚖ8a1Ќ};%v1G%5* e^K OKQ JT%BxDfdUF^*6 Z`H,,-"%JVkHFPF"HY`}sx7R ;̎ducvyvޭdsi5o svN>~i&yl> '&|h@񱛛LnUjw$_}&2r3ҧP/=,ӷ穎21E*\Rƈ(acY6ABP`8f@ 6^vR%G!Gw.OoILIR٣;0Wqjvپy:DW{Yc>euD`}B64bqd= s ?nKh噣AMubxӽQ&fɶ~rDXoIr&BcǦFrSŐ[.Z{<%ykj"/%9зFlz&|tkVHyFD2pGZfvpFqó6+MяL;t-Dc$ABS r0j^JiH3%*#MSLW$͎G)^W0i( [d$>"jir@Vi6',y65Ql3\Td"Ia"/ɵ8}`@"o#ݽ!ݶaGGU\] Y@AL|5h$JKQt6Y#\`Ug#mل v|oCah6LX0 rİRFxFF90Ԏ5 -86FiFc#a@l#@:.Ѫz^K34=G,^r/Q9p3'=/x; KW $ӌ+wy|1xҺGvZ"[4 xHr+4ɍ/P _7!K쎺lS0i2juJ4)wr~-F?s~ \؆bġs\N;!YaH^ij͌{@eskugW\QŤ%zKsʦLRN; c{ϡNҧ1>#n#)9"&a!iri$w꟒7R*:f\[xzAOF2hBsrc3I1:C.5Q" #dC,E"ӂ"aD1+Ȣ:p!JZ 2R3GOp5Tec J ^Z BKE: FL;Mt~-*?~\7jI~$Fð)AJ.Gڧ,S8bܧR=q!Nn ހFH#nQΜfԏi>2Ŧp2@YE#LI,휮R}ܒB1{ڕX8~t,%KcSm%r?.@hiH4 uA6Tl%$ɐʢR@GD;SZ7Hm\Ք> IDATe)8(BctI EVL nc/E>q4n巩Cc[Y}.c:y1b~fos"sfUsL9޷Ȩ* IOsm3f“yn") h" F( 95¶ oIc(9c]LED6@E6ŗǟ9~mt Y1uHLmṋ[1$`-0iJFD9m&,vUV6pmS!Yܰv6Ȁ k~Fmҧp&2KtH+Bโ0QH쐇?s9_̝=޻22(F@}Z-$TrS,AKIYh#RtA8&xD)E4ߢú36r\`:SpW=vmS)C,hzW)T ȇco_d3䣲SͰ[b~N2f$c+{WByV>|ɛ[\1DH;ﳵ)m\7 0Ҏ~!vί8'I6^llq#&[bWtA_y\K VmgHnH(H+ߪٜ t>3Mxc'y[&]F*%8~]ǫCbduBQ"uBU69f,ŪjL"5k@/P…F%N!p]d?0!B(cl;my8mX11sCMZgA쮯`#Tfc*i0/i'ѡ-edlQx~XVTQ7FB`/D 2U QUcclK DS jԦ;YFd'rdQ$A(rHPZ8QL,JA:ےĦ@m$R`[!Q0Sh#ik*3B)plpJԆҒx€O3l b$X@-U Hl- ( `#5;bl=yuؙ:<%aÆ+nTh^!k6xq$^cyn;*[1oq/u#.s_rbk>+,GK9UVM pf&ҥ,"r\,i:-D(RS,1FX*?1#ná [CKY?6[Tr6~a3s<~uYo3Gh6OG-<5ӓ8}ܒL$% D6dnQRNS}jEɒX樦aPSUd&Y\?7|Mv;{rPh\2`*%U"j"M$ANd*34ie3kIH(aAGGZ#3pq+Bz' r%\<ֽ;K<9uo*_|=7i:MO `l$-Lɲ˖E.W*\vYi&EJ Hdp zRO|xrz.'+5<~zQCR='D,VmFim3?ahGs\=sɛ)< 23);MEp˳6'>;(03+d661> y<;TpW8='A?UWl-'cMMZ㜜x=ߓR6bi+{T8_#\0{zY& $s4ӍOÕT!(?cΠa8z.3K~5_lH5r'1CnBՊӡOqJ(i:Έ87afBz!JFQde|!yY,rSfdQ#ЦDnMVJP(Hrk "r{1SqE$Wruz_[$q> Wxu)YHDt)qpuP&'ƳUV,8R}QG Phc!$F!(yqqw% +4 RbERb:: Xa$19_r~/L '7y~WnN~p fG3E̠eW\hgk[xbЁ ?8Kf,ȝ 0 EqAKf&F!kJb$¡/ᱴV53p)/ugƺc3N*,xȷT'Jg4=PT$s&Gx6,A&46~ %,W~ s-I|YoRÈ㏝%Ae{μ0Uz JBтR iwXd}d;Gp_F-7|@i뀯~^~GDQ ~̰3@Y'8X1$tVc^߬*G*cIS1 "\ji5Չ_c3f5fYyG[ 2sv:^f&8^P\.60.#ţG]axj}N`Ǜ*%9BX6|bQs*E O}n& ΍r.1_=I_B+bH/,QNGv|Zdc\7!sg]t6.MZ-cihK!(OM*8n4XGFe(±YVn,P5R@ F Uʡ0SKw.} nIͻwu=NXs9^{'\ͫws/0nc@dVIUfJ7H!O:/ &i>J;K>N_vy!>_Z.۴a"*-SpfqG<8Xbh1?D#hK2鸔^p;wG~dw{/YVл\nH*r+2@:F ̵"qsteR đ/JC :%EONcƷgi}%~qݭQsW[<̰˘ ?(ͤEqRqMߥ{Cay'+]A B!\Z rmf""C %}0a1(_㸐}zex}ԣ,N>W7?# D˒SMth2-0$36@%%~ugx^ҡ<(_:qJJLG8+\~w+knʏOizK=υQk_կ iZG;o9w~oO mr=ǵ,g}2iң "鸌B:;谻qnR:FQUC5?' Z8T௮29(N.~`IX \4.q#>Ÿp _Z,RYqA )`:|?$>iZIK?(2Mvo~#;lj ט_~ۑޅӧg>5Xo'R> [`izK\};>7:xBӷؚn6z8p,*j`v Ypv0{ˍl[*`U'kYxϯ/2JBaQ54GЬ\$]D>V(q\^8>m+fzaw<1M>Mw;H6J\=Xd2wHQ&iz YYcC jA%gcjL%|qO;[HݢT:b?d˱)UУnl' c&hSNT:YlZE4GOiyB&+.̸t' 2&\|I2]Xݻw =>Nd22V3?Ae}//"j8O]8K{ݵ]nݺ1}Pkg 2dS.JeA+2eqtF..}tp%:/TLńdZ(lL* i= 6wS HhGLyqq 5uxmcb6OxqsO}㫠 , yŏ1~3^&:(V ZׂH4E <=K[aWXr/~c9snDtiK&dίq$s'~!kw/L'B/]TF&[:AXV}R[&fx @XG*#k8l"1q5)JI,'Ht8pT!Ը~Kx (Q0D'9ooc~G̡uW#3%q-~W0(fy|/oX:F7lu:!]F93ghEqlqn#s刺b|_5VF?NX&glTc;{ 9{wnHO A7ƮW$ԒPDfb{#=yMGY?;>^D2 ,)mABesX s%9lrs[~x|3HFnes2m4x`b>AP*0{lbd!wϒN%'Hd.D9ꭐe1o2CZ ygmFO8_a?v8cBqyG:fz^Pb4#x ه6i|SSo&k$on/`R2WmlaKȽ{\xĻGǑeH0;M#@GHXK1PT?Ffxװ^JLG0\k1zDS4%3*9ݲV}1şa\}tVNTZ0f8|'{dYJtCf l jM\>I(kF$[^{XPpe|D +3dn!`n.Z%-rQKӔ_9)WKh `p8UB$;쭧l&U|Pdwc93lQ[.+ȇ?Ǟ}\;9o\ɨ7f5VwrPp"AdczFӛlv`w}t GI3+U3C_'XG0Y"E=wwJ$Ȅ<# BGs.:NA9,l?1gbg#E[(-z IDATBNaYei $%1r(mP"pMrCk "TΡ h0d@k\2} f y3nO=wgr>1#{oֽ 팍T v6vX؞xuI+ Q鐹ڿȯ@?x?q߿[]7Rs]Ax]Q4e0!NjwP\) 2t``47ߓxq[($!i_kڭ1*>΢pGOw .a#O21tZ]BȂJ!MQ-FY#o3tF{NC3m#<{'m[HcmJn(9cL0ZzS#p,<)8]W219dOɓIEMdf L%"0RHЊ0@i0G%1~`'(ucHk\ j>C&1F"d AX2@*3hla%w3a\,"K915EZf7?p36f[L˜y [E_k)>^ƫYRac mnXa?E(/YKwx⯾4*q>~n[6M-y& o\}q4]bO""~/ΐ痙M6<8s|ďO9!v. ): N! IpŻ죜=9@CK96Ig>uIE-)5 M21ViiG8 ?\g*_ kx"m݇"/Yi5R8Hu($)&9C=XBpl71 1ƸY<9Aw̴&kڍ9ŝiA M"&Kσ UVVLsuMՌT}>cA۔[`)G>QdϨbwp V;7\kFt79p^cb8k"#_I< liMZd-AÄ)!ߖ YZQNd!chq#N:OROOq{pK'3.gt*{ a(KUX= #C=?'9FbÎ_cMzač!niP\q֣3L qjM wc /X>Eק`5OXTsY~4O>8'P]ƕ;8 ymߒ eV;(rbHi,A`1Buq|8*'W p)$dFDJ{Igc f m$ k}v,S~"U\et8yn5vst>Ot?HOSX+WOqvW,K|jV#NI$48Eu $7hv |)`P!R MUq!Ɏ1PuW׶EOgx|z:/ ppBd 2<a=4aC< A֢l11 bИ@ hcwさhk`4( 0(! t5 ?p4[Qss{ԑ03GL~̽8vF8.c7:m2/>1NU֑܍*%>u&z7Ҍy'rFuC ԋ=Cf# KlY\_56RY 4v!z .v]"C7F KYqk/cF~+zE$i"xINCb(҇+5H@`>}۞RqHʩiw`0JF,Bo Lѱ%Š"M!M OPhP.XF=NwME\,]?+sDM`1x >Χ۫|U^GfFqFG = mSK$PR Q5XerR\Oz 2'h5]ukvǙ-7HWwCbٰǬPp&4x9vni 06T-:.3 (&0cw^bH$`kê-r5lͱ޽>Co,/,Ԣ 欢HTz;j0V(4uCWF*AjaPr!ӥc#w8!4wPU&Ƙ/rs#boFi*G#+N5֓[ Z_D%z?#|e*][-r8hk|abH x @k0JƜcRZJ\En-6A0'HG\DfC 6Kb>KbY|;vx2 QN&9hG/+|cxgxg,^b.g^au#( Yyi |Gٺ/܈Oq-: PW qSOJh=6XSVa58.*8H 5N}@*r*$>SdZ9Cp!zeG/2j,U5ʼn"Rkr߲Bڵqp RM܇@b=zh1r`l^$ cZ C:ߟōs$V1@#dE\pJc3h"SeO#K~mccBK"llhrُ88 |xyߠ'iqM.*chm(pqh@T%5`C<(l3ÔI-Ajg2F .cp2}*¢C H0BaI@bSRwCBᰔ_Aˬ>n2cNLXw$Hl`7rG%%Ϻ7˹>Έ9Z3Rv7vs3+1&'(o$2N Uqi25N6)T=1" ;hlEmPyFS--w}tH%!(En L|}p [eݜ#$ koK?").7Esb MvJ+cFW#1묯8-w9ţ4_W8'yeh}ZYTҜwu;lwMPF݀EG >Mp_ w?`il-b})diy [47}vp^yHn)TQ"V+0,wHK1t;I&&r0y!nUArQFܻc_a c sZ! {5V= 2b -_t;OX;qK-׷̞>OW7. ziެiSβ7{QJJFW5ܭ3C|& j|rsyNFҊpJJ_<0Oe;9eD<Nj $- v:94)&e"37?H5c{wp0Lmd5vA;&S~BFiҠ4c8eЊLtqMn &#rJ[JiMwBtZd$q-ZAB9SMkc'f>ʍ{ˁ44O)LP5P4n:Mpʀ0)(a Pߗhq( A:BK+0$\<M*]b% DLkP0${ *%xRНg%<,Mb93Ur7@}bt 9jr/ J %:YU86Obb :o-V#H4AE+J#%@mr;B`CK.FxVa2~Ďo ~dFGmZf7?pS%#_<ιS?G͝ѻ`Wi׈: |dTEUUP- Wm<${~y;3/q{yy }e6;[-:2lݗ/"F(g8܀nSd32՗9v2q;X5ׯ^Ï<{YJE[F ^>+d8!V3V*`AkKNFK^ggb'Q|B[i3I`$NyXvq$^|Yu7 2I"-22'8:A;`[eV7o'~~|k *-c3]ʼnyg+G;o3sFT%o L~+8Zt3_eDE^d/݋\i<3Ů{>y>A@8sS~=MiI곙տ_=`+b߭ r*4q=aTCq%jna8^{qY M6)=ta?KO\A ncjQ.K6`4wYn?2H lN *7p3B9vyS~n2FvYxe\͉n B&8rIT>EoL%znZSo8-U9ޛ[~W=3Owy̼9+ FX@l.w.G9쪎Qn۴0cHHBSJ))3q~ꖟ+|9}k-'-;ur[80sy{s[\"ui Up'5 S\; Ӌ5pp_=\xLDr"&Rܢ7'ols*7&s<ߺ~ )fRG( QSԳoen21x?ϝr8Y$xXW٫gienCLUXˑrJgz2m$+|O#Z9 K9ΰ Lcz#'*o ugރ2҃'c>K|N/~}"6i^?K}]Eq 9A `bD]0cZ Pi0+PJJ4IqRXrDY?!LM8eHfS#m#BW#D@0!ʆľ=EI~M/M_y Wϗ!x?؇)F_K|i*ws)sEcq'jz8W~ȋu?}w}o7WtqrW"Cϣ_bbo/B|*ƭMFs}Jh_ !DELZc G`28YL̰1gh{øpv!At޸RBxNܡ(T\0ʹ%l}ARJNXb`L:«(a WC9wQߝhcdϱ׶]&|°[mlVWXIBG8'p[0;F6KG$Ş;ul^IyjvP =S>NP?Ccp$V9%(M\ pV0D"3, Βwr(e6+\-" )lZZNopk>MkIRiYex}kG86r]C<Kl^7qmƞhww.$\p}D3mv w\>ƬoXː/Rͽ_)vqQn[!Ĩ!2e X\NVHZe^ RsBf/ǘZI^dϡ >(ļtҿ٠"YhiݻQl 9wb/ͽo嶌6Wbԡkt'0wd\x8ɷN3 ӽ!lm,ѐc mWZB{?bab;To[7[tm BJ,I7&N,h2;%& IDAT#t@6f Sv6Jo[I7Z$`8yNA/7zWo3ַ %lym>Hd >3 b11"B"-,5ԂM%Qi4٬x pǴ5;"C1PNdڇORDa}q# :AD6#D$>u {e CojO6ك:E$ 8!k4,o$?yo.vvF9r/Y5ϋ`'eq,AFeʦl[loQ }C+.ALv^ ]h[R8Fn['S ">J}MSg;MM;u*2DFihjt 7I7 5T$TgORDqwf84r*?-tʁ!ωG:uoBYolJf0BɹY5Suۄ=cux_X摣 f5SL^`o/K6ͣx[ÛPSr=Hone>n0ƤR&fT( ^;>7Id=E,q+t`u/͞FdPxLN쥞7$qp(YtYKv82s'\\r8wN82;͚16}lfWJߢZ|LkLmDhnM%pAwuro=>q? ekWi̝ *S'Ib 1jաQfZv]l.v80Xag/[PfOœg6Hmb4&KI@~y?Ž#\",SD2ڌc=WXB;S-e󾟻u^yrd`#3鍬st%I3\ݹEw㙯>Ϋ{ćr߃TtƖC^κ$[65uYd)j%bIk#bB7䀌)\L'aV!ȱMcP!mC \m0굀v ԾD˷\CWK8?vQm^GPXiDM4qS>Ks;>)`tc:u+$XVKI ʓ 4y2!RkBMl(8Z9`F;Bh C/0ڢQB#whD"%v ʄD!(8Jt,V ,x&R :;. ݈$b$vQ6F%NENNk%B'ė#:l^I,胱ȫ|>#c{fH[OňSn՚[(JqRt 6H(QEHh*IR%#bL# L4Gb 0 @*+Hp̦غMMիdrn)Ɗrk:^>h%%M`d;- (e";8)G:L!IH Fx6y>7Ki^]t~L~dv6</oLw84z5%.]m'8º*Erk?yύgug~E"2 K@yhjNHZ+]XZXgͣ=(ԟ& a?(yK,̰XgU s2>~JiGPiLkߦ4=aVX>4XsABKO d8: }]~cfWɮOM4&SZN@R0BLXe.*uȋ808խY&hi9ߧEzXu!b5 SZDMTnc{OEw [\L^@ 4O6Co?_[fҝPO֘!=\_q ݢKL&'،K6lHNҖ5"suۊٻ2Eu9Ѥ%vp !E¸HP7(6 &xFbIl-\W!҂,BK"Q*"ލ.IȦ 81)%jFH 3 a~Vo4[B\*~G\L9&>JyL)02bSL*BD,ҏ Qq^ EajGX0"P8J3 ]J\ZTEٛx?N Pɇˀv A-i@I#Щ%M-" Ȉc}ԡ{c.ozWLh I!r2IHH%W?o|21!XYuZ_㭟=|->\(P4S[<4*נ:M=9K_R48"d/ȴ=t="1:*)Ls&A2!!"[\j=d's'N./$IsY^yTՓobXS<E֦'I˚VoT ?8̀&X$D}Ǩ#I~}Vi1fc nc&].ҔhF.W\4Bb*fg pۇ>ªj,(Nv.ef{\i\EurLr{3 _r#d)ClZZfrBU 2s1Ƶ+alܔs\i\m\6X6,қ_Jĩ /{FrgۤKCd+wW+[kj)8\wdt~NM["#c|9! We1Pn嫌}H&ܺ0# 8|5ń%\?Cޛ`l ֏hwQdUk%.b.~FuNvguڥ{i?cݝMJߢ9Öhpg%: р+ɞҕ&^F)ùď\n_z33훡`XPPw/!窒%ņΎd{K#Rq+kCSEᱛ_?][DtsG`kʴ/>p|Q `nJ%rzmN{:d]%8〓C'NMnW7 m:enG3]1'.#73b n֙$\FT F$ d|M%I%$Ŧ I)x=LG;y\ Ƴ9Nw4%o4^AH 'H#ld3(_S|G)I-q BC p}ЃL6+ V16t(dqE1 (w6bWd"=+}iC.㒦nV0xД*Ђ6W"b@-640_]`#/<;qcfKgwvr^"E"4X!iAL`D2mè Yi> K)uMV:x6A"!Ktdb';CǨ l;3T"cA@4< E^8B#bN5K$Dw AbD bL F: e2#Lz]b` }C iRG,e֛x?vVU~;̖og+Y3LS#!0D"AH +)M8q]$X wdJ7XQ/BX , SM֭uܑ yoXza䆪LV|Dۡv_noml30q2Vǝom}Ma>,-.-0vIBbb\ҋ !#i \Iܩ;mG t-۝2lR.2y(C:Ȓ} C{MG5g=F15.}%ԞURs zuV>EG&i)B!fFfj1CH"DTaTXfp{}+P86.iVz[p hZx$dF $80t/XYa$|+.fGawHəMsDqC جZk+'’H9 m2nkX/s tŮÚ208N@һ@r'igU1 s@Yv +\m=dlէ`&De6WjHJK+B3>k1!dJ4`2yO.7G_  <޺̷X};fdr {&|S]F5ܼ˨ l-dO+y5Ҡʣ?x\V6x(p4]udz14dfaFcei_gVW: ?E6:.?3>}CwrIFIhOgkxw-7Ð ~KURP!KSm)>̔GF |mgS+_/{~w_xʻ~FgH ;=Z{K&"k=cJiػwjׇX^\~^_o6(2`P!s#nSe :$aL HBX"Œ$IprEThV-FG>V(F#FۈBe\HpPŗ1!ѤQJ'h)D[)8ؠ] Rp,SRb)5l雘n#V$LXgPZBϖeL4Ht|tDKllyٿc# NY|k;|CSD^L0."Մu(}S9rbO0(dB 6x$-ZJ'A`W M&(aP `1n$jA/@UlB/B(guo`-.3ddjЊ*o7q\J&Y'&`@+$$HnV LDy%#WxåQ $ D]Ad$T0賺y4 vrO 3vG)^'u4IS]4. HA)[**6E V6I D֢e) Y\7c&.'}ĵfaC1D.UZ}KqbZ%T ő)M=r*q$XrP"H`D6b~u׮q`Az$,z|ϿBᡟ8W蓜yiR{pQqbePke:3Z}Qt6 CLUFpmr (ƙ%8sߣ{"G&>JzQ('ݟ-e.`% ["G [[,*Ɠ OjdpwLvXL*G>Ii/;G30k]PH|#wJW⍞$LdRE`PuaNڌzE,=2S:ŨsgkY%x;]zJ=\} 7HSwEpn1n57:P&S)ѡIߦG_g\~?T6d|>qƥ{{4쫋:٣}7^{ug$X@UXIh'81""6opz +lFjSLn{t=CWAvVh<rP2NRN(H $~dqDA'1W1"~E!2]#$ЭX< (ZAJB8dL$ R X"L# 2cp}ALlji+$Cbd* 9>BZo'Y.>;_ϠC\j޵ /:4#I%A7$C8 3phe .Jأ}ܣ=gs̴ &=+b56IiP F8iLPaARi#6pEq(r>QNGӈ%2LFy=Ztz:i'pgX;@ܣBx,Y7D`ЏQv7E`$?]&A< wh}Z^vC*8.YVr7W6yl':r'Y3)5@&IJbJbR SM&l/n@¥\]&ď ~Is>$N# ɎljV)DÚ-R Ґz"ib\8nJQՉD+cH!SK85\i?,lޅ\9Ev 4Kk>}8K7(ϧVB9h/]rt!Z7bflA]GA I{XE*g9u`["B+~M\\ϐ%6Яpū,^]௪cߕ#\M1EnPUH I5vz$7B?C':k-MDD`{qt+n#%VK8OqƝ6e^b1W5D /d[L46pBzF˩gCi}ZV )h4jkl3?nsWxw?G/ٻ"V1.H!;cAā wp3cylX2ōp;@O4l=/yWxƣ\oO8qұ*_ ^@04\Gel1bΝD!&3&y0>ǹi~LwW_=ۼ C]0X~>Bqs>c[<N=nqlΣEQovBͽ${ wL_es~2%uuU>f*єC]`+00Ja"UUrQauUt%,b 3U0#@UCt%E9: ]§(hI@QQ#aNXj@Q͵*$"QLza]O(d' +ɐX2!).e!dFDF+讆i2D0H2(j ݔI+Why{ǪaW~K b9BV0cX#J3& 1f Qb!A-l ItOvJ#B߇DerZv~Q r\F)O5BT$AL\$Pò4$*JCa6f!F[KxmGA;YgM%N/;E Y+@U\GDÇF{I-jOQ4?FAd`ck'9Bˑ䪏>ޣ2lϘ4)%eGHY.o+1êTj8+R+sIKDw4n )ɓTI=ydN)@L4n |C>'~!cldfsUϘ]VS6T#/>mAt]&ν:;?Gܖ(L+h&߰L1 s: &r||s}O#( 9ۨB|||)w__5RuQ#6w-ځĔ}Aͫ ([GQNLSTVLezic:zbS?vd+ xAB']'є41 Ijŀy"e)1c"ڛělplKヅYaarREgx*$M$&qF7b'T&TF]V#5'&8=Gz+'NC.ZYkXJmn%;jm'O.m~,yESr&j4]05^|eCYL6ϸ,auJ?Xŋ;%]>?I^ 2+'4\3水Y/ ߚF}皬u.2128E0yr7LLeeXI1.lv0`ƞ~P$=9ϞMKR-!W2O"}ø&}n2RO퐗9UV1Iv ;h;PljEo0FtSɌ`{#2CQQ*Ŕ,jDG =(Xy89MdJRbbY .S֐G* fb*9z)#XfJD(fBRCPL?#r-Pg"Ra 5Qq)U3B%#k]LQ)SD#]J0Sx>_b+Ӽ1:s{oHhΩ5y檇ėF'! l_Dh4okrb ?,+m7 }N\Ð[ ,^'9ku8Ox<[ganĹϰ>yH=[:V@ai#|bEe{Α3,Yvcr]h  m'|6_˜Q 5kcл*ƶ)J4W183z&u9pQ&_{GS1ph~1 3Ԃꨖu(Cv /7-Yi.%pZ,p>Nc_ҚNp] wPHՆ2Zʀú$љHC$TcL5lV>5֕;=KBܿ1g򍏐|\ҼQ D"x^afE,. 4"8(v(f-|els,FglN#{d6Խ>[5seN4.)] c]gطWx&t"F]fo}q[ۨ}p~5xPW3E<>*I3=Nk3"5[|v,(lň&$FܳqcUdE(B ]`*&qwLRS(@Qթ"H@/3hQL# '9cIdc:*RPLB-)ѩ Ai+q1E"*f(".1biEZ.Z #PQ! #$(1p@( `+:qeI M.rf;[gF;f" FmR*{ AԴJBniFHJVQgR#>mVA\%b5ъ:{]Ѩ{9xh܃O0hz&l,SkZ`vGlwe(]rA|kH'贶?4% ]h #. g{zdaxCV.z,ףbW3ҁD/F#U@I+f6К%=<d;FiHth$"О8UG7&8 )cߡA8JSg:Y#"Azf(%!Aa8W`*2d\AE[!ׇyR5>[|KS&:1ू´C͝,vG!ۄr:po7peJV6& O%BBka#EP8jI:dpl eJO?0[-W]^iݮ#6VD#;3bqF-'015x5fX]g"d1{x.y~Q wn.7^64>^HըX bC]`#s*Pf*2J8&U24K!%0<4')GG9{ c,Et7(nSsaԿz^=.ĺzmċGjh*۷n={naȓdq^^O%O\mw+l|69vT (|lǑ"UL.R =5J 3UJƹZVk`ZL+1%]j 앮:˕/M2(B>k`z&aAV&;S)GBƛ<٧xۿ ]v˴K>RƝo#lv^;/"SV~>G Y_gqlN#& ;8P $DoNAyoڌVɭO\IҰ $&Í l&\ 2>` >Ak9Iea3XM0nP.󅩈`WX+4>~LTHbڠl̦.΀vޥ`ԑyj^#~Ld8Ft JxhʨO 5$>Y-)J v!۸'ȏֹ}un04Fi 2dܪ!['jZ̔1gV6ÝNʱU' ((*e<@擴 47'? T* y&(Z1*^NRmOvԲ fR'mƤ*7n[)uBm[e8 J/͂p( }{,TfwDI5. /4:d{9jӦɩ553N$ DcX\!%H(AۥU &Pى5eDab -+ 9N%#%=%tRzy?U@XEdN"KoULѿ&#~?Nob6rJB\6k~ͥF1@u4+1O_d,]zfC@1ou;xDەl\4B=®@S|aACr/64]BD)R[" "Yc+6C['}$ӳ>8-Ǧ` ;599_BݘKchٴz=\I>^rp vc=}&' bZQ"N=,nJb\ J(1Ia,U1H42||ȏ4(y '.y<5N~I4ZmU|CvLjH2 a 1OcBqU\GJzF#o=3VRudWe!m jq51*,h1E-D7C}jMI))$=>g%py]#"S䲅Z5G88{2nmp$Co x##SS=p{t/T{ /gG x힠?b.14ĩA+@e aSLrBM=Ok3Ws+>՝YHKTȝ+/C 1 皌'26%aQXrh`WiP8v?d9o8NMƛS˰{MBm_J/0F"I1sgۍobZ3$[-i ,N4%X@qMTM=`HꇘwL/۴_t8NH=N?3rk+@ 8ex&:^W5vQ4pMnH|oHQe[5mnAଳ8m=1rrrQ 6 :9N)Z9"L`8s ǾrCCD-}?EJRթR4>jBнeO0u (BQJH!LNM11Sd01~Aه|_~!4Fn${|*tfQx a{w74vB)HJm]OW[nKQZ f%iusZOp,EQ SZ|>\|VSzM"LU!o:ۂ~_\X:1j%=nfex%ƌmrE&HQL Sn -(4#IN0N]WqMӓ%f;Wzt;:aQ/`TREbq\jUuB/ 2#4ID*b-!I%SBHXN}Xq +fr>C sǞL6kmnN7uwzn[_a7GNvyv}VBa?86~qQvXu{/¥>'=gR#*:O۳?Cc+;e^w]5;/ss=8|m{jNgcIM3nM5)O)Wϴ蕟f\Ͱ WkN1*>֤޹˕%5xZ*8g7RQh-l2yPfDnM`ƽ/uϠ}ȁ?2œ9֣O9* V.-szV0EDEP RȢ. ŴLH"/\@zflvr QU)4Ύ C\ S6jM+)n[st=6>x^{Vy 7)J[ \#q 1Q5jC_:] C;\]t\ 3GfxᙏrcO#m}6<2͸\4 ,C7Xn#Y`!ɸƌ_4ёX$N(yL4l5d'Bx~FU404 }Q}r`fXqFy9S9$ڨjF$ B*mI[)5B+QS5\DB*+iDLI-Dj X*a% f*q"D)QWS1yUhhU*GPT&tB e/$&`L*ŇdULJ)ZvO!5Iܳ:'xp)M1P.josξtޞ挶B\~0bq3%\5'Sⱈ(@x|w|/0׻?v3(1I&6",]Enäz"jBt5+_^^':jd T*K ~f"6\ C`Ҕc+ZCy< gᅝ%7:#Ht# "?<a h_{u7 | qc92rQ}}>"Z6Gb |(>j2qOr4F6*C()P}P=PQԸ`1P/Y1<&ZO$RHggB D8AlѴ\&!Hղ8O~0`?ʙ,e*㮁RR[PWm4MCH]E/= R(J{IrI*2D,$(B9PaS RQ=zos1'8scw7fB)qt,Ǐe%j̑O#glN-; $iT5~o% c'kS|Q\:ӷD`'Yc"x׏|8[~Bfα(X67m fi*0z7?wݯ g?p[v,yL79?K`SV}*[4)+c~¾y/fx3]]I~פG֜I6R\O8{&(^K'Wh;J)nSE4+^rgq"FaՍÀZHޤ{M[IKCFqhcQ)gVг429Bz.6B&$yJوT*(V#hUC3P,hV<V@ԑ(aDj2B+ d$):CB%3(l !S"e8Ihr FRIh4& +D53F1P 0AIT%T4,$ D"TKIF(""\J!K SE(IU)*00 Ʉ@(sr@rTUA3 =D 4z\W/2l+gLp}_п-n ߝ=8vc v3}VxkϒOs2w# (aSAs;_h{p>y~c7 5]M ta=Ў[6j6MbO8"-F>S-oߜi~F4Pf+>`!"Ti".*o(~"ܸ7%R'iHj(H2RSHlD&P,Fv/yCH*ȐYR'Cuto|;i~_^*3Rj-TRQwy%;/2igADyBX@F*|(~*I.E#6ƒCmĩI;lO[l8 k"{pVʮzc0Axs;{*E|'2#R5g=/Kz=p{-:548qb;?f}oJEo\?^F,Y9HQMuqJ! EKﰺv(f̔]DG 9g Y0o9:]8 ahE5H%(JX:VA54@S4"EC9"diN(3RE( 䚂dB(LP45N>ק85mn,6io)$yx,}9A@9oU?U\#N^'ޛTUN6ݱW3gsQVG^e..2.R:c`=S~uX'yx=[J( c~,ۦʞ'zGIJ 徶|usUk ez |Ϝ!k)Es4&!ƍ)>u-)<>9/O}VסzHrlu3*O0v?=>c|\GZvm/;uf۴[-.oos29X>FyZ9sGeZ7ЭR7#YHUtDšR$3~L7 Zd}y.A4Cx<痎]*SH$Z o=@h|/hcErΖG.pxmK4)WǑJ{$QkTPrIQӰ:C;pSEo<@+M԰Hhfi(B8:ƙs,/YjOL2I^sǸwQ KW>E1y$I!fSA**% $#,dQsT~LTtE$jbX#SAr`u7 :sο垕WWUW;+ $HhjKք3ȣьa1!XŒhIIWH @&n}s/ZvLQ4یȈ7Οߛh#?Eq(G1d 9u;RVXIxGaTA6k6^/rM7i$?+z:agWWp7$M<&0Yw8t',M7$qX-02h-Qb@YASm>}V k;m$Xgӗ9ޗ72+Xn!ΖE(Ĭ_˚{I=^NY={|@ߛ2%".6XP67yIe1\+Cxң9rpiB $8ҨS%O#k mrCe}wvB;!NXXZa1w"Ԛ<@ U0l1LO01[_UL.! ,vv?~#M'GJ?  "+ç<6l`q,ل h7{,Tgרl&g㨃[.dA@'quNy-]~M*Zӂ),7o`d`yIp~u%VZUU00ːY'.)3s*|7%Y\Lߜ""mj~BZ>˹D B|SsR[;\YҜ0]c sR1 >BAC pQ"Eh$}=Uz{01ZrEb.BSMngs@(!z@xpO`:ꡅpH6$IBHG@O[JZRhȴ<^+mҿWrmyL35Ycy=f]f-.n~j$Aߑ.4i_r+NBuNocw! dop2$~ne͉g!w&{wMXe,zr,r=q~c$ky`w?ez8{% <@Tg8IS#ӷ0N/A:w(uqKd}E6xmtBR:[{O2j_su(+Ki`(&|/[3[ᥧiK|_XlPrv 7(y)lafμ?u9̑$fv$sL}վ`OS;{don;;έn"[.DuJHq* yٶ ]^adlrlBe>iԄb~ߥMDh31)6Bd5+0O@[xi>w@+Q4C{4V+ø(XdSDV2`:$!W14HG[邔ԦbPT9kI"vڔ28} >hz%2?]{{Xr%*=mnkfK$`, gpDTv=E]5$2 Ul0ntڈ$%Ygg=2; (׀X!s@)58&EG"Xs0RR<d3EHY + &aWi4+(qHRR6+ 6$I/H.qpkat׹Y[6m\k&HȷC%tqXmv._wObKLUP-+&\*#}ll f 2^ݲ9Fz YqLz/^3ĖmaLFJf)/RUgyigp 98!^x("1k{pMlJQB q0LvM1xku²|mvi%nGt3eUg4ÕmxcM" n!:Ζcܼ?;Iu*` nΜB b1$hU`w)ٷ[ӈsnGKXցwY㩟 K% !];j %yq=n^a;8aŵdz'zTF{!&=UǛ]˻cTkbXA&$ڇ\8I7g:ŅAN]˃+߾Қy6|{?b IDATϛ4.V;N^b2 lnɥ36 3jcTH>2IuRxU=zo͠!lTqB) L'(H"Oy QK} 6}0d\2<^-aH(< K+x،:Wx;/R#Ғl6_̂%Tlѽ=m,N&ŕr? (ҶF6-|a đ)ua$FF{ q}y6n&H*CCL/,A9=Kخ eqGiL%LGe)ピ En.,Qz8jAy9T;A8Hz4 ipԝ6ˈdRIQDF%RXŊO84H{;1:Xn^:A$>B40Tx8ڂ pQVR:a"NJʵ+g72!5 /%>q4E=ftSt3q.|1D= , '|}s wָtCZ’]-HA4LVoBI7?l S|vHARxB~{KI(S}vOoc2;bv/>yXg?D'&!2E4*v6捓FjXSSwaL W|e=q:s3[@u(au Rh\: iN]Ѿ5H+8s6M# oJ^-b_c-6le{Onbh +3 #OtHLWQ0>u.O#.`І,7GVix{.kWY ~ң'ݍiFGq"kAD (2#mZVH@`EI+Rk *p\X:ƘDZ5Ą(?FЉ&ISФZc8HT"hz6 LF/ƙL$ ynFS'b`p ϲrv.ZLn47\[>6q{1, !ufB6hj伀T@/l&J1h!iZr):]ʣ42%6+qRt$p<KLIBbf~f/x~ؼ!-R ?tkM] v[$Ғ N# HP)Tp#$:]H5JIh58?I0B+ t/`l  AP )֦H}{&!NSB+="LO휂 &jjxRaaP HwmB IjA @upA!(㒤 I͛g|RkD" ۈ~4\!25TFxkڟ˃P=ЮIb(O;cp9&uB6;">`g/Q.MU)Id1V Yq~~۷y-*uCLo=eV6ʣܳP:u {j-GpGv]'d:cc͂GR!MбP)5x c S\y8\Jw^^wZ4^<m /3;PŸ*íDU UXapR! )O2&7 M"4*IݨhRd\Lh daan][R''Tf6I mR' 4:!QS_kf5`F8H} k%=w& BЧZKkKR|Mi4cAiqaĩu (5CA&d{yr`,y!~c!g)ip|8BWw*m#nYko뇸9r5=o]K2^ިձ6(*nr6~WWoPҾ9͑=3ÕUƣM,/5oggiS(v'<[u|vzlK[\ KK>B}8)?E7=*K,7|{pxc4~:U(Uدo.v8-0,$oqȔi 8:Dr,JeWpk{8P{ċ;-K^ch~3̏Êc y!C[#@2Yz \ +#|L^ȂfuibgmSTW{jd.ΐs"yMZfUx_! T00dUt-Н ۛa˽1<F;ᾉ[gA!&uyw3ͧG<{m rS%eRm <Iwi~ b n+-CA3G[g>)^F}|I)K"ts:9io'"ej :jӪ00c\E£^77K'-bd$fiuiv}b_"};SdO.c#MkѬ 71DФE7cyѻMͫ0Pbb2- 8JKWLo@5$ < Ӌ!PD|P_%#3‘!GYNlo/h]'G93*3]HgsOmԬS<ʩt'Vq&p]TA5у|,Ne|gv135};$ף%S)Oߢ8hf?ka?/=J-~z 2S#\\ 8r$R$O$Z~u\xuFǶ#s>&LmPШUT !K:(GkHUՇjA vԀPм] dT}K/ l st\cn/S0Tta7BG'up ,VHpd%v^TG'\^Q)IIt!2ĮX06dqѿ"sker!BtHAe2[ W:6x| v'~^:M8*@ LBd H2v1C; IV 1(Cj Ǣm Òb]cЉ`Cە{!پ_dq%Y{re'{jk!D@A1pF[ig~X*EM6T7I<\ks8x%28VE*s_'j\wƐ1=]$,Ud!^3|NmoIOTarU>M7Èzm8y˳ |(6'3~t /rzg~MaZFH|vlrXrKl>.*?H^nzyFl'_:R,Ζ?sx32@uWxj<V3_̲~L5G5\>8wSfsċN_^kyzvx$;".thtɡȓe"*3Bf![!]kHӔD$ِlơݎUB5D`SC !ĩE JuJkFCdK"@X+VvB3[C :믳=IK'yHep%w+Xm3ܻ8H=HuأY6f8ą+?[(Lv5'_?j|9G\NzKw=D--qs)7Yȿ`SyŘJz\rSE$i槉Z8x3|gtO~Ő<WX~ uny ϓdVN)AvxÃOݔr9V/\Z>c/gPYq_>7wssn㝿&:>hM];/y24ʜU6ǃJwX'PHRӣi-N$ ݘ(X {,ݚaϰAF]XZ##"?;k }6mx7f/1&?o9hzt'GVdU10Kzŕ=p= &]/)xmC7I"]JmSJ,Yi5?Q2.BnBf*ׇzsUg]edDc(& }h7 *e(%S!èo8CmzGyזfu-moMY]G/a. K2p6eVanA!h::^*箳z (K| c8DEHizBmt!,F`1$k- iѩB"G/6FΝھ[`M2;Ԯ .l/b@?WEdmVDMYZpqsgFhָ;HpQP(Xm1.|P5f $)F (!: Ŝ0 s˔ F ILVG2sҋIn!T *b"b.DWWSJ3x 6>H TX]j%br^Mb̢Յ].Zq|kZY2"+~1) v`$NXڢ=HBH+6o *hnM\y |?wy$~lѪ} /g6!oUr%[00ܡepKdgQKW$?``[m*ݦg:dv;?KT:g7ǸTu{F!a_7K!6aU8\;u>Gsj-j [OqtWK[83W&;$  IDAT07țhѝtxanR0u8<{`J&ȑ+q3c;^WIXn[NXN-Aj *~DAaׯ7Y.Yҝl>Nc,14)ڄs+WϰRuzA1I&ppk\O8:E IbYX!UBx¡ިas!X+UrNNɫoeի -0P+n,~+7{F/MJr+ۗLV}zAI,Rhi¤vǧ 8 )kuġr~vB]zn(xRHBu8Xc"L46t=0<`B't(zDEki[$rpF`=@!h%\)l ŌE(цMs]Z5zK6SI'4$0RmX9+R!@[rP"%Y&}k0ƥ[|*\S>_?f VɇmBbe(g>jYJ"Yf``hx'xE+83!$O$>~{WyTvH.8+HQ]Y"qq"yf8} o%_<]XÏUVlt#A(M@LB{Kq"SHoV#.c$ Dnt_=&wuU]e1“X'^.`wJȖ!$IHY2u֣;ؙn.P|kR>W]Xoa]K\c~*?Ye][kg>S{sN堔Rd mi Tદ4風` ̌ <"kB֔JI9ϙw{3=!awo=Ho\~ɚ܁R?N[{@k3d#tX=bsZ8U=L|*O *goeF_zrMـ;Ȇ lf.]Ra#d15rdg'fvӛ-ڃǟNGXihjIJNlEt(qrpxߞdP Gzj`EG M}52o;.{hbᅒPx h]:l27<,2-ސ_*.d&Axa ,4Ӳ[>Ҫ2uK; ??%9s>C-JqSWLylk9Ɯ"Ó77fyO'2 o] xy?>ܴ^,0b}+ Ӄ8<SLmOU~'cV'%I4E0 PBBQ\RǶ}BچCXx- @4LC ZK\-3uPġJcI<@䋈HM܀HFm盜`m\:D9=QzNy+\t7;0X/c9K+ nJ[8N!Fua}ic,#ۜ*~嘈> r댝mf~[ŽQ9.B]ޚ1˗oᄿf|wirI9y7[ =JK+х#<[1eGrIۛSyfJh"b ^;:ǚٕX?=x$ ^cV|WYSsS81qE2%T >i4յ„m;d*"!Hh\0ڐe,Vmz")| =삡 CIfwXJ h;"E’@+u!"\. < Dvmo'n)pBh>AqqW꽙Rav΂^)q3=)'i}Ԫ's1Q+g8*-R1Rdw=ofMabijOO^Iz/4K+khD 8H"px'z9X  6:v;vZTný.117GR,o?aD8q oq/NPh!nCZHS'ada~ck-^uM ?_/fw(a7zUtd1ҥ k6py_ "Nc,S|҇#fώOD𕕌{ V4~Ha>ϩSk?<; ~W!c]V97/r2/X+on}*q<':sM_gS"PlVFSNa!Y{ Er"ЊЃ"Z$fsZTp=7㕋zB>BEƵ06: tmu{7Έ.(ezئ9+8޺L$ج]66 Q8G{Sb^c~FyV6 10d5{ >=nq4ƨKMOި0/.\d0ޠDoyDnkqnbo,݆/q3ͣgAx#e┦u[wѻtb?Lir0[=HĢu4<^bHd 7i'4& h$OM3=L(Xw~,Ŝ ~}˥sUfGk4z`%~] f?*ιr-Fb>C\X.SY`WuaWq߾4mX^ rA,fd1K[1W8ָn0& Z-$Ҍ42 x"r$kV7{Ñ{tHzv+dc2QUnj'x-thfcY%$aLxHRt7@8D%xv_R0œ$r1iBm 8zFߡNI/#Z4K5щ/ VLj) h-EE!_ c&dTd}La HB' C&RD610yl=&J4XW .Ʃb$Z l m[HHWo Pb^^"N ?'aQ>4M#=ٔOt`)/#Eľ7drm;+nk <^HD >>oGتYPr33s'Y \v+M֎_yW)ma7?]^x^獌lۋ+bRUC@~/ y;Ӈ:)~}ؾGY=q >K={6$t`T{?qűz f 2xXv,,RXip({k6|;T>/X0 Qo`̸ Z)z7_tGK5 1#Zut{%{0ɓ/*HP}3lQç~6->l.D]Oxen [E? 礄Ø$ !'FM+anR6{Gfp ~ؐW% <w~[ORgkg@0hfSl\7Ӄэ&㹹P&oRNUCPmX]VUL I~e wyu2$59"Jieyk1AoA,\ l!8l*a -$#l,kI]%jL~0hgPXqs4ž Fz8a'Et{׹wZ䱁A˓׸=F|4JiB(x?OiO/CX*LL(]Hɵv1ᚳzʝyTMohg3:sQLf]7 4<݉ads&̲;BIb~fY1=z$1:{mi+= fHh $VaR^Sg`h4z: m<myrj&IbzA6s1ݻ⏉Xya3-2#;RRE7QX T- [$WwH`llhFpxħreh:*h5*zKn45a!L5|{yȭ;[ܧrQ͑KgٳJƲ$&y)6h_4R 1Ø e T`5 ܍ ng[ejzU奸 &O:WZK샒ވ&heW=~wÜ8oEgT:#+9N?1+}JM'wZ3|| \>·52NnT}_s;xˇ"(K+1Ċq 6{bslN¯'/*h4t:>;N u\*$6I#hW]V8?h=2ɣ/!_S9o<4>!!>٣17 z78䩳(rꕔox=M ]a|- )z _&b+/pu01XAZD,0QcoA1]͙*=970: NO_9AwGU2eqzF/򋃀4ٻF)foȖ%&79]t 5F*F9{yע)6:y/c("9S6N+Ȫ4֘{;CSQ8wyHԞ#]e1;BVbi͍\+@V>V|AqcAٰRz,$LҸÖkYkl4kne :qV $yƆ/32[xAj`Mi£pj3 ۊ3-]?O6(D3N$WB+O;W@@GP^;#)Nb$ҊV]S5^ĕ1ҝf-#=(x_wI'+l=^˷H L"C* r>󛼲jJg;1ÔQA qmg*Ck]O04?Nr/.3Ӕ7|fSp {BJk&J%VB.oT?•^Ҵ'TAp5Mgح k2>c'ڑR0\7_}[5>I_b\P6W/M_dJXcg`qȩ3פ|Hp}/?#\=Or/Oo܏N8+Fޝcar1|me~\F&oޢsx Z;w)~{G,9{5]6.WBvzl3NOfoogMݼFh Ѻt֡=WX$tZ[Jl>;~Ba0dm75N}e6 IP}_ܽ 9`ہ dw{፹_8_WSl}M47 *NZf9Ѯ_wPY:N,G3xJY`\IGx C--$|ʞYλ 8..]"ɏ03=lZPu !G|OgLPhFa_\͒/0ngb țҤ.1"'\SskWV8q\DXINTr_uI\ ?6BY7ihsj~goaf&b>H'q'+ ugd0\P5![?t' SL :٧X R9kz P$$1;S ;nk38`c "88ڕU9ҵ:Eb (&Ha"‚8pAL.r0Tceee@)DFVtq|iiH0"I&qm2 6ifQ*|E'_Z8Ko$!2I ~JOL A$Lmh钪OV AiC29eRj`AEne, )n`!`E62jd2b@MQ2H 7ky$ ܨmRr] "eX!Qt]16H)02CJl,eY,]82OgM$6Dm-- ) 1ZQXeJ\O 7l( BMfk,@(饤Z#2dh,ia9dn+z uȟ_mFfP*W\6&¦M(bt^Q#{JL_vX/m[F]BԄE|pz; m$ ~C`믱*v8 74, ."ya(S{gNc)C ;nah^D0r4;FI6 \PᘌhأvX|Hz7ˆ79_θI [x39o|vB{}.n4U%*}*LDTkZia4|`XpkH[<%7DG(|?e0O#:cْ,m}?P mZ kp?g86ʮP<!}??%X~_Lx |J;騢9Ҍ{g<8)}tEQ]f^*&F a z):p 7&+ې4~Ƞ9JuQ[,Afݢf)̲后g 8>)\y +)=qwފ.m{vNvV@lP.ZA{'&f1q/aZ"dfSrXW {|ͼGۤAnd@YCY kVȯ3=[[g5ӃX5)]垍~:k)2:3+}6&K:DBFz,\`sr/rs1>vQ;df*Y:LL436)ߪqfsAD"ȖܳpKi.|9޺LqAk;0TJ6(Y$€ % B8C4i.I%o N6aslI [~0q'+hO43.^ls|¾F6 uZ4e.D}@n.UE95,}k1JKj6Wh+e⮹ JiتKVX}|cMʰ?0dm+䰈;,ѤLzQVvS̖k&0]mĐ pRi@ih[ȥy6׷sKxˮZcR0^` %\"㐤OJ@u||'Z-N8$Ok6 f#;Fg9o7>H?Svs)3Pn|Q*Rtk$iS ^G% C,wLmc!q.zGW$y"7)nȲ@"2e ce~]g4#cT]I一E)) !% v)I̛=m Bv1X+9U!;cp@[ID25Q J"26|G\k/lB K# ~RpEo@hU}cr}`OD߶)ȸI™VƊW],%C{ 1t5> 64 F'[2Wy7c*I/0a 1>=ΰS2S/sm+CyTexAqm@ij팩"i]T`aSbd g$')x@mtŪ56Z,pߥ#6:8d|vs/'/xۃ^an1v}uP2.:&cv/Td!J_j0l}@z"Dr)G  x0h,̣mK-!xE/rEX2nTaȞGh J˴bC&p UNKؑf pRNn&9:Ub`Q2?!P% CSԶ1YgO^!s =/ ))&5h7ű:H\1"v0c b! }*qLX'HE@FJXEtڑU̶ a҄~]PF7Y=,pK$!fb63 6JguV~!񐎍9!73PR"E ʖ$BD&Ŏ"$8k`IlF 0`F`0Faa$3l i%^CeްǙK|}nfsLN!dLfI篰wb;UrW 4}E~ߤ(ƫ.̦T 'G!Q:f 0*$6HGZFR#ARHKbIJ!RE[X ,ؘtmO 5BG޹wjg46B 6/YΘqka<mlfE$f~^qHU/^ؽgood4KJ{Ȃ&4)&3Oy +O03>H?bej1]3ě ,.\Y1a8vADz8)*4af3^7ayp{k~/BiH$vސinlQ*Պw7)Orh(աFR&b9ؖ43s Ⱥ[|lc'RpLme#ɤBjEĠ=A9'j^XGsfO&{{K]g~{Ufz޿~k3=`fC 9RrbVL6V" b$BZ0` ۪W* wzLފ̺;缇Ux$1|it~Nne,4q y0)z&fp/oxg<̱Y~XFdnܡ06(N0#"$ep=w^㩟!V`aOǟStpl S!>YkD zriWW_&k7mnM_SSlx32R?Z>2q&˲wW^x8{g9&K1vf[&2 H\/Bl%L^$SdJcȊݦ(tL1Vޢmr!s' Az121љ(50d/ِ*!"!2!h6L0Lv$VRB^mACHr.lgjT&v!fT:HacJXI$J , ())Ek`z̴~ IBfP&B4pS9PN׈$6 {c MjQʄnT L>&+"^@15%J|6#_i/($1}laK) u0r. 'qE@ӡ8X-9ALjYVZFjZXKH0@ %JI0Re!  m"tȫJS)CB` @ÚIZ 0R)"5SRSM)m`;jqo/>@ɘ@+M S'n5PqGhH06!g4L%vݓ,BUy?wñ#GqC?⿤KW86=D+l##=hz &B )BiTQ  T*D/T%OkvghˆWcqR xs3W &Og:Np[#J+ɫ:3hBaGR ݚF_ ? F"xk}{`#) P}d0B۴q1f!,XjtxqZ{' y)g+ (GM7Jk`M BˑFK5M"0k0 "ގ>Ќ/50%`&h2]<'-h̆:\I}Шbd#t@O!tC馚>؝[ga[k6zo5h281A3EunRO$Civ/A-O٦^Es@M]9K+zLBY*|F==rQHF4)9me(M@957  jAlC,Lf]jgEdY]-1g_|[R%@I& ^nK'BJ# ,KkO5XFGm]|Bd&'8is,TypއSS ^." 4Bb+؊I>~"il/;-V85W(#lgid%ooxo~P>8eQ8>WER|3^Uɣr)j ˰1φ*1s9FU/*fp,$7X.7jڄisZS7n7hl cšfrˣEǎ[ᚲ*͞MkN$N$[;g(Hx 37ϿDlV71Uty*;84x|?CQ b׽qJqǎI,NV}4J*QGg}¬7>.:5ab:IcI0%ZDP7I)]suq]đAHkg3e9G˷eop[/!Yx>鸬.6s7:.HnV(<:;;} 9ԴC8Dyl+N㓧6"0t,-\+!̈́tE|ۢ XU)g4ga"oX]NU<Ŗk6Lvlp vЃqm(4|Ve?Q53˵Ѧw{]%4nQP8=d *KR؍Y&&6w1܄#2bI[:vAIPm.N9G*<>>x]r: ,v! a 6'\*!Mfzo]!+#!]cJ9,ysbϕ8pJr&^Lhq?|74-"xX]۟g9R̲fnḞ b3,IGߦ؆T6'IFXqɌ0Bv}62{;1hTҷ%]CHHbn'J;TJYf LOPv=pϔ`OiA}cd6یXb\TV2% IDAT>J\PhEtH22I V'ZΜ.$#7i֝ K%Q#p$IנkJ(%0 L H 1A)GGC{Ħ$j:.TݟZw>WyNj#'3O~l Ph BE~*/#|C4]D@޴2I5cZ\.:H s?hag#`fa'Hd /9x?ˏq&mX3QDjXA Z$RPC}U\Gh~tَDŽigB>z G+IĉdFb-ktjANY" AJd\$m1Dl `iWNJT*%R3ǀDphc@' W)Rh-ԃIB$r! ZX!n+'ZVS@уua0FI1T#peMNν(V_8S G | ky?`umHQ\wOS캅cei|pqf?ʉS쌹wMo?OrnrR鯮Rm>IqKt;LV(IuLeK Z 4)1X3L/YHRrduj;=lۡB2";eJ||&Žht80=uxs RfV^^cN3M8]&I꤬J瘷[ڂ߻D`s_ܣOhv=xՄ|Qށ#Wrd|v S"TS4i*C So!E7HٸYreI/110+/u'zċ 믰vFOVD$sCTNXΠVE`9h}LH&Wiνm`- %8M7}wx'_3I0BͿBj"9[I-DbDJ lgZL+͌[044&MbҠWXØŸeX0qe)HuXYS"3h'LQnmi0{Mvn۠~0G&a/Q1ƙ[:h+#]VKq0O.Nɹ)7ǹU jqeL'F/H|eRLvi[ߠk|B%cn M;KmT-J-Ts4ms=W]" ,,V22R {] o<;ĭ%nO};V ;;F }tC&sv7>GIU@ 򩃙:In"$iG  ]/ JߦhM"$(+wX,Ḧ>:s֛KT3\,0V4]f3Yaam6C7qVsŴCKUs~1e4s=rY[4.K+f$bID8ZcIȧVĚv-jߩ@A$1I" BT4H$& 6ZHPa*`XMZH" 4 [)CHI 0DUDŽ-JF!R?[/qrg'i1#wǰ-:#ݯS{TdSƷ<lwI~O{)'g1LP|?w?o1_?9Uڵ*Ox2FDug|iMʷ}'BiriFE(by}RW&hEA4*QF`td|Ehfyz~PIFi!AvL&|9 佔ټ́PDE@jI|̉ ^X扙-^V`XJ;+7<&Su(#08txݜCxSwu 7xke$}׏lHC-`X.EӚ$I昞֌86A4UHG|sk8`R.gHK x;v6C}=Y&u0l$+Yjӷmr|Zb? . 0+Vp<Ĉ\P4+t|I'^XhOQZL_e&` *M&XcR79/sצfCSevoS—oP(PYt.-EUhmw9GE}ܛeM-S4UM *Xnfk;o`ݷhg.3na%YeqưEk"KاY؟%;d*24vxUNAc;lO\B8H28~Xf6ʼnsK&9|n\B"oM&{09o|~ڟ=~%%4^qe>Xg|$YlԘ{GlM^6 ?peznJR;6 ]B&޽H&R\F Er+z hiSzP"Ĕ&AQFlA#hdF"]IreI!P~! 4JDɔ*%p5 y:H6B&X 630\HJa?At5 BֈF5Z$UNw`.kHW"cTiIm*MP(LI(Jұ\j#9`JYikvSMQ } (S8ᝮ-u>]YcϿ%} b]vmmkJԬM=Bj }8{m)" !MC\1.y0 49}-f>e! cQf&B~/l[L5υ+,&g:%]o6EfJFv $ Aq#e+iimu 3CY⤈RXcGf|T?A% kod q>}ϵNt #9cJ`$ws n7(^~GU*:*$!J]2${uIZ07ڹ!G2Wlġ<_]#[MrLvKwlLc=Tb >|7Rtmw!0-,bərкQJ+CMw.lpUy&<ϲ~h'ME3Oo.lL+HVO 6C;e ls:/ ,9 bx{iDVFS b0b"QreFyWМags4cg7C߃iNN2AZ\Cm6 Ygq89mFƏ=x}IP:c4&c>n:萱W'Bi+'86 280aZE38䰷 {$;g3ֹa;}C]<{io8&C\&7rj?B6iiؐ\S]_2cldO}eFKdeߧ1F/\PORqA˖& )`3b4 cxfӄ}פֿ|ܢ_J:0<{枠P4I5oӋ\[3I0TY'9 1 %eo55IRh\_HcP>JmJi"nWFnX(J/n+ F !́J$ lRB-Հ0(@(1z@HDjb%0z TBDR 5ye>ٙ ^`nq/ѮEhZ姟0Iգj0urܢKZW5c$ WbOIFD^I4*W&z0CdI>{-b+Z@Yqk)SY+L]-k\0-v[ms3|d;*]t֨KCԒÆAø7 7I-6KB.rnkq.:2/)fpNeu4}qsdOQ9l,{|l&ϿU 2ng(_mLM;GCGk) gxyKr 39JbQab<5+'X<ɥWv [;G3EXX?Esv85͑dHC_ayB6Mڤ' G]Ⱔ<:FvXb&dӲk&|8cnn /_OlJ7823bSLhau sM]d[R[Lt0S,r )0G.c7A:HM:=kA3ç/oOwD3.((vcGè8*bH`2f4VK>(TzD6q>~3'"owqG$?ؘ;d]b(\Xq[tg6 /O2u u^ƷNgkkϓ6ypJ3ge'>Ag2ϛ1vj5VMY86,nqcQua͌&wg'/-pf8pq)vҙ$p ح*vbe k=F:V!(ѯ*(f)SK4^-JVA$(ca$Xfdj|/QuZp>M<6f*eVctB~`Ԯ}~*ݳ,d̓쾮;]~[޻h/(ZbƲ5[53]SNlOrƩYd+dۊƊh%)RI bk4@[7<6RS^޻usw|Cwrq\&}CSس}Em torҝ| ;>,xsT mx |;rW*1x:?mRI1CʡVH 9odm#`gῦV5Wg1&7M㷰s-xnƞ#jX闂958_R0$%H˛ /bɕ"b,D?o\쐏Mz5ޚ8)x{;ػgճv%hdqu-ZQN"!S򆇐P(jrI'h]㐹GlKXCN_XAjJz4$Z@؁3Dɭ iȵ@"*~%']K\N#J!ˈvؑ.ykX.:1oBngJAPZ,s3å'3KY0dd[W(K -&NFfg% 6٪%_R[ jMJ9f eZZt hW̿Icl'>uC sE&.3.w9?qEkԡZ<Ӌ$a+cLf\4]UVY-Μ`q"-2eW~y 3-y(80v/_|a^OJ}EԨ--G[_dKyh>^_':vy|x$1}ƱZvu2s* wmev?toyĮrA2C1~!<]dq~j-K !^\#;_Bb2ޣ_Dv9Or_me//-Jml&Eøؐ ;yu >;癉rqn*+mKC$bjemw~hz.=wf-Mgo%BZ!(0Wrn.k'g9;w~[8O W&?=_҃_c|Õ<^Y0[4x=9}cU3~YF"xm.<{o*t{bV_.<2{rE՗_}-SX5ygy;":pwr߃p H*;^)3lo<õؒKXIUd?+-yß[&7kȏdt^gf~3#["q3Zd"Tc g6Ymtf)iو-)JFRwPU\(0*Ҧaw=Ŝ9gSKs̗XxK:K"XMie62N^oSC3\ॊ C]CChznboXg9ԢTS,r# H֦t Jk@ .j햱n]aǶ[ygJR:LiUkˎc[?4L(RI#hrTƍ.'X .Ia囬2N1'x.m(5靖~Tx*k%۸4HcncT1e_S===+  _,/_f|?,*x`FWx':ps!V.,wݒJ9l)AWq#,rϏr׻l*Rg/}lor+?H2âtW"ο:X"r'񋆼C*#5`^aBaDt&hzNJdycekXP V`"ٚ$9ٕ(ئ:ĕ9.g1H3MW$FbVP=%(E'{$?"@"LNIɔ0wH]#rR qȭzh"Ehl&.Ų$8?p̼9㊕E(QwY >?c5ڛbcÛ'g  =HN&&nv*RHӔT}1ycFHA{1]=U(Ny3waps{:Ҥ}Z_An?|=)lBRMRmٷ|&Nm,$> lsn;+*"KW3ГS~Ṵ̑Y3e{ק::sknysjT'6I8 Ә [i_kcOjpLySY~Nrg[عm+Nָvg3ceڛsxc9O|}91 fѱK_!8)`KڵwܾS\KmmjCΒw%ƪuv{x`O'/|{a٪D;2Ŧ1҈rR$<@9.;49$#=ldZˌVcwGO%1f1d&q|HG+ryqg))yr<]*t4M}pU¢emXت"E2 )xw݀T1:"v?u8#t \+0(de0qRFwDRh s pbLvtJq TH6@v[(-i<Rf$l55/JjvüMC cb[#|.]zy+,׿{?vVH/2Ap>W׶sPƜ<䥵*WK*g>LaĐ6yBrXpB"y闘k]Sc1|ϝ}K?hҪwz2brw&Z/8>r/xdj {A onrBss~vnkgstt}C%kUGv32{FJ&F2DwClLB(gyEOADKsV>cS!$Y9?&7ɏd4)2\[lE'K s)HS8NܒKI1'OrDy+%)fl~jHM@($D'#Z;VD<|#@ouXUz4@)m2!1Z`·

YkWNr';Ya9H!*ulxk^uѕ1^2Q1z5 w7ՃcF=GZF[9lnqU{gr|fE,.Q|0ȸx~U\ğ_SfBSL{s (NpeNJP:#~.(&J"Ng嵸L"\`mHfnq׽'YLKsǍ52)H)Ib#0g Ed;X ҅VعoЭ7@-OidPaz̭nfvwG _hH%s\ L>@ĸ$L|^ZAi8•S; rG L.2M ;µ!eN4qŌ.-4وċBܭɻm FЉiDڶC-8(e4XH&x&Ę EW\"DFEkɥ!Oz"uoq+GԏCveEVr{ |(cN%oNwlg^U6_svt97| CROe"ϯ+y `1J! IH3r4||wo[8!/=1+U^mL&k+pf̡wUxa7o|j;?>EP )yt]j5YDP(V+~oO.wm-V7pb{$ct.ͽ? v+0 &R ]CJc#g_Eb5Q  o[Ji8%7#a>˫տf{E*h9 P4D䪿EbQ b-^Yw )B!,p~|Klg$s%>W?ز W;ش+}'8_M~pO/:o{+G8*QU9BxlUO͐YS{:n*^ۢ7<.S1q:[T lo10.2?2\}|WWYL.37Ar;u3G`h gP2*r̍NF71A?F2)HBS =T EgmXa-XCRqԺfBlS&y .bEԂKWM7i%OcsWez ٨H^t AZAX("|&!5 )bHYZJE%E n[[77{bvB aKC"^N&o]0+Fu? рTیNv_ƸO!A*HDvsHƀ8,Hsvn|an~'B*Ï?WPD'+>[Ò[#|="yC|ui bj}ʻ KJHf,jݸdbI}Tc6ԑC$-C*|熏H@gB| }u4-sbl,ݬ'|O_nsR {8pq%2R!bC'6XeJbqCyE^9 bor-?Me Zp_-1}UYBTReJ%ߞd/5hRZ E'% #MGِ>ROc]#^Q4{3zv{wg|t5Vl|'yՍhnU7f10•S`ZjQXa\kgw<,-fd/\;P Y4Et,Y uqWpi7'X-M)ۿ9VL,23Wo]"Wf7x<3%^F^ #ZQccMZS ćȓ]y& &H6sk3Nqh?n²aq|H~F%T`ƝG+`:5}JzKkv=7pm/^inՓ|:,Q}?=K< *7[.:TXH3tҦ9bKnT&^Q*}~mfg&Xܣh^|lI׌Y  HL}g8YUWM@:p&FީKo]xBDQN"&'5zD!ax%In%Nh|YaYc).".y&iv`L/Z%+Q)ER^Ð)A;q?_ IDAT):Ԉ3m}ry9r[@  B~P:K񳜴%%"i5X<5wh JP+y{6#K%Ta%c 69eyg{?H$ٹCpl9z +v(큑(pe}3ws|xcIFP** Jhب#C<{)Y8.TBl~}eT68lfJ\pyOkСE  $`w+X-{.#se^v2{ٹ73KYPeMa]aj*E/؆hHMx-7nr?~l'? .'OȾ&qxUViP" )V:mI4dZe(B<45 @×\p FXPY nfKP! )NF R|>:ՔT9T$%RNsj!ɄBz98H!pCD9I)Ƃq_9~p2cBIB_IΌS4O*•[G8m V\?c?Oo+s\-,%\>_%ulgعaDt̬NٓI_ ˖b{{_]c| سſuĞ5-/vKigٝf㲾]^cH,M\YO!ƘxvXK&HM)X *K!rai8H_(4N "k12A6\X%#s&3 w2׮ԀLb P^C5ʹJtllDl45xEMJ)ULG"/ gw!,J^@#yuV7bU@geV ~"rfDٌ8;Y 1~lD&͉m_&^WHvFsЁOguMP&sZ"$6ɱ9St64^;דusj d';u  ̮{,=YO)dB cZs]҂y5OL {ƹ^ kǦ$I$n $m0("A"8!:#0{v#$ځr4 AE8ACZg &Aیرc0/^8}Ü^}Ǫ ?Kr@FI;t CǶw,3xcŕ.GF"`Tsg.K(D)j<^eNۣ2n{/XKeB}fhMm£غD(O_e46嫣Dm;'ڴ'xN1tN$qgqe_طda.70[K]NJYId^3ھܽ\{׋l[" t//Sg` 8 &k6A@V'<|)6N"aInS?ɉ5Da(ѲԒ PB`3"M!#ițu %r4Mн[JP :u=eh#A8X 993$ )w+g{!ȅAS aeo:HJJ8)?aq) 8a@d Tn{' ki~}3ؿdeu d\N8pJXT8'JLOur5<'{}v.\8MRb*M"Q8!pk8'1\wldΠ67Mn78GhB?uouH  fp0?u+d 7m~3qwn%cˆ5?O]~{Lm`Fkp IgͱoZ_eaLoޤ^Kn]b8Ɏ1: 6Η O`&H騍V< >Ƕ=tD䒮R~J .4 & bBRgS&o NUO&pY;Z3s|cߪM/[ QG&X+ri|J]d*ݟShĈ%( ;3ǙCS4NEB#| >*s<\1NDBYc ("ʄɔ!W_\ 0bSK.CԻT7 -0\a oQ0դ]3A}Kw+GqH }E*FTxl62"FY ){0qF D9MV{9JaURhu}Rڔd§%)EVlYqhϣRV$VDw44J>AR4GU4a.3)^BFO`MD$.W$U,dH3K /ɲ0t.^. UHuPRG7N\e (8 *+ziZ8=G^3$X)rLo3 ҩ^MYsu^8y}EwgjF^^YTwb5F:p,(wd29JH8'{Bu8LFG,/\A S$ȗ_aC8뤿ZBoN76gq}[x3<#?{_,wvW{=_㫬'ˋ|Iܿ?/'-WTo]s->9W~c;M*+Wftska6ſKN,GwO3~G!WghS뻙~_=h+zΞ?|ʯOϞ\~/ܷZ?2≯grd=m^<;q8ëk+>~gj|'U||14i m%9D.ud@J\YL鸈Maɻ Y'%IK V؂PDh2@ uu(f''r-8#װ}NfL6aHR4lD&Hqtɥ7f$ipr PA%JN&ٻ(߮}½X =`IV-a1d``c衻=kC$Clْ,+>)\r =ܒH^ZZzU{~Us>{;3,ZgpC~tlk` NIk5937DL|IzXtImQ#X#xl,0&jEN0+m;˔PLM aUi}dg"Zy%oi[/I-4[\vwdX֋T!`ߒ^Ǖ/X?QwwK{w^xjّ?ko=_fiK?~j٤q8|NYtCOovJ_rDiD֙0a zLI%O-+dYJXCsf-3i*٩l:x>k[+cZ,,t63@@U!1%&$$ެ$6  8tH`d*rs8̮ )uBc$@@#t@$)!@)t3%8ȂzbO&jps\Գ0J3R[R]{h2 ˘PO R;(b͚IucIaJds|STl1cr˓cʷO;?m_wjw-|=w?Vz/Wq53_Xvkꏮpo?_ǹFK(%fK<|ppcOx1?~nn^|3W5Mݐ»q޹rޕMnk?~գWʫÿG$srݯ߽u\xr=KV_Aģ9+rw]M?oT󁏼Wr~G軿WOUg.J>lO^&풟٣<_oz+7޺7oطo8µ_R.ǧGQ湊_y3%.}+o|͜8aNJŞ>ZVzƞq%]>|jwKWWדm+VjZViVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVrE/}L؞؞؞ضZ3J27UY:sC.{  'na>kx֨~Õ_p=pWec#=[s<25q/^>wr׉\},kMZgZ 昝aIA]GDc(kB]RĨ!@C"P jXg]Z7_åWS&`,.`N͵5N:Ё#LZ10Ȥ  F#îg~n}ww^:ֳ򹳌G{۳`7vloxS. =&{.B9Eu(hʴ2Ɗ͵uy}<5ܐ9C|è'eG*$׿Iw] >zY I-!&2K"AEޓbĆhBL"&!a06a$Qk¨5M$ 5d4ewX];r:5@A="rRQ Є&,1%*  lW`gPϰs9!HEV{* 4(RFHƐE+HdRtd.2P[KQ@(BPK5Sp!i"0bZ Q,# Ũ,P;ňDPEƄQ!B^Ej(/JGєPUT*f$ qlO lգzS/-!c )y1Z xgXP1͸*!Z`&D8Src(b`NktRMBAP0B 8!%U"MAly b@M{ (ƘxX 5{7Rhֈ1XgpV 6'kTxHjϻEE1$@DA<`HۊW<OwSw.[yMa˹fLXgfѭ>^ϋgw //p۾+gE3yWb*5;줃Ԟ(%[ҏLJQT<&%4H IZ 6M36Ƙb%uF*U t!%-Q-.Y]F5-FR)L>| ^G߷N&2؀.|)QϞ\ œ}(SƑ*K 7 ݗ( \1[5MW`Y U}cO;y09֣!,QS(B )CjN4o14%(DMH:EHk 470g-Y?g~|pp^Vcc'`4cO,s' vp8$ȤdvO2UD:+m0hL#)j$r`nO7YfA m{լ^G9Y6z :kۨ߻Yc*sgqkd@gc8=LM0b[*:(e4K F풐}u{9'Glΐ.馰Qz|7#I$&L,,\.߄K _5K|Y?gIOvo >+{\wk/L~sc6~!;#!k.rBl LXoS_cB߬YcF%Xǔ졛#\p3fZgd|WmnC~Opv3D%e^bއ [= 3ͮbwDyyϙϧ( :bgr&6H!bB0ԙCH(pIdX x! Py֑`,#$y"{LVcpTJ,lj(0K!e/\D&GB&ꆈp¾!ưn8&ZU*I/cPT%1HB"g b-Z˩ No>Jsge~ m4+rWރ{[rmoqQ,N'TSp CIxU̘5;Gp7d7P͘&9Cr߽Zxkls§7?‰ţ8^QL Bd?-{9?/>?c'~1x.."8k 7o[ ~3O[nsݛ8[A߃? |7dg|c@؝!zZwЉzA]5Hs̊Y (L:YNQI*DB,Q9fLrPտ ST)礮"$`(!b'YbMrɠV0⚊*QT”)zN8C2`cg'ED@,t BU k:HLPc3ZJL<Fqq'o -")) P$,cdGIp[ b<(FBdZB% ͛YL+Ԫ@0J/: :5aR_8ϼ?ʵ7|⃆JV[λYW8~r/K\ؿ=p_8^8_ mT Cp%; !PYIQSI1XT:*4YsQK)S "jHF ,xK,3nTzEY1Ӱ~Pzr9.p97~cϮWE762T- esS&5pbyliőۏ'ϑ[zL%?0T|"+C=Vzag Y_l?CBO3N2+lZخՋ|kx]Ib㝌a|hYOrruX(Ȯڵx>=^,XP/XscRibX5=:ήY+'D,[nг0kr-N>~q̮dP$U>cӵ9 0NOe\|0кTtk'xg8!5Naa+j2eZ l鳸U~noq5yyç&\j6ƖUn;cOn{'XwK=PGrn5{ jjak]®<:ʰT ]/ 1&yOri94;Wm}BE2i.Mkqg03:wȮEҗŤO|r:ǘ~(r`0?D .`6#\#'@TBs= NO?jA&UkHDf%GB$1$#T  8PMfdĤLL=T iwʰkZzA $$a$X#g !D 3i{^0dM{^>ӣBc)SuMA@)f*l Ġ"D".`M۫5M+ M۔šFA`G4+ަrhTuFr%.ETKh `g58ale9z1ug]/|տ?p3㋎]G@Pb\SiIC9A M +5f69- ;&п-Dvrhj*Tƚws`bPNr"|$ą vn3ΌO+\sMNw޳zGd&7x.߫Y$w%#fP~ }22;60 [yft7zg&ҿ2"Id5!?qWdj}76-z2Qz`($ |mpg.Y´F;dt$$A2D )'Ċ*| ^qMI2Vk0ЉJ3A7S+ɾɛ")%8 Z[BrD s\MiQND& jEjHЩ 7)6 M2Mo( FɂBWle(R2`K xDC=HDL&YZ &LplBգ9bo'c%Nu4!uŮkY mJ7s8,.+qjq6 &6Ĩgy恌"VXkNC.cD5UΎ{DŽ20^kBQ"Ԕ;=κf2% sע7b5q{Bn^n u !Pkl"ۄD ZR<t ;S$5JyO=-X_d{{AGXlj wLG\?|{LQcxl?]ۖ+1UZZ~z*70#owC~gZ몒w,]Ysx|U_9z`ւG/o}6s,ug9s!N^x/7:[=5>:O~3F|Sc I 6'I $IQ4̀32 fa+6 1Dg>7_1ӽq7>]AF]IA vdrd!S}b*GBP RRPV*. A1N2$Ma ٚ*ۭ\M'v@CJP:GC(DzSb\T!1C2& DQS{*KqRY!G Q*{jS794$E]FSή2Y>Eos}q9xzy.2)gzt֤ON"&}2S$@Ym.VmIY^eTUMHyxqCg֒bsaރ]:΍/Ì`d 3.î.'HAjXkLyD#єt]|w@/ GY>bRp?K'X&ӌ0RL&;v/b3w$iဃ3)Prc?\|l_p1OG9 cŶNK> GYa6d.+mKVq,K|{?^VzO]xᵫu34 ܹ+ퟯY$MbngUw*!)Qb`f;A)FtH2EV .6IĜ$,u}/ń7SnґCEw7~/zNe%c^7{J?ޮISFcG*:'uȜc1(b"8"C D^9ДyC%>zCd:Xnh yPgdA)wIz1$K#$mRly z`ө>WC$ E&Cc1n'PjhW$fYUObw%;8,)&f&iS6$UHt* #`A%kH&exE`C/gn\IY02W+^fD{y(SQخj`F ùH 5͵IONAiN<tuN#fN<Ŵzkɨ3C.51T|cP+LYr7$Ā'ZIPGŚSUB3ST6v&%5EJ䶠})H>w("775\󤤪LA*8L n#&C07OeD'H K=~RLcΞC4nEn` s{gs?ؿpH1yI6fEI`@PBMr8ɰb{`2cEDU6: v),bL$Y;qta?(egWqnRU iۑ0{Ba(Ґt{2Ǯ%nʶwsDzSa:uK4)9稊[X 砣ȑ|qx٠:$̎ˣ-uǺj N܏} tO/{ϰO b>aYMșՊ]T j{. }ϡaTԗR]ee8w=\a ?5.9:z,Eij.]B_[¤b! J$F]3O[7T |լ@ٛMA[Loz(Dv?Dw#}U_Kw*=$rȄn~Nwa|/u~ѽ&}Po192=:'%UHR<ço TbLD;C`R4)BdDÖP13$-{H>K6\rBy'Ea:TszEsCd2 ݝCpF0.a|PbE56۝0aYfz5>8~s ؎[إ 5ɀI3m*Z1(e M6q$3)9O7te-Y<9lrFScۢMF+]\$05:GLF*:N#UuM(v2e{ .g{m E47Ybӑl)%)8NTWbU8.'UEvRS";EgzY͇sIU5^ܺ}ιo~ӵ8={߸7HkM0EQ X IDAT{m#vq' t|hO9a8ac Mà(ЙA1M3q )x 9`ƦbTHr _PeL7}1il.ږf Ħ`sN;{Ubx ¸w P"^oqnW_cbʖSiONxB)Y'LFC&7d'W/sX>~1S"q2{|JrY@*AaJQs!nq}Ɩe,h(A '+5y8# "H_:H&⡢EA.1AYe5osk<͒}!}&)/1ϒ&[י:y=MmK /N6Ǖ}ޙ}Ws(iBPȲWJREzV4觐UIvٚ} QbVݢ!pXgƺf[ۓR(ٖincF Ǝ%RnS.l l(ArP*^lIBEZVbR% inI(IM)R{r][?0ȸ>}/wquܗVx4k 8L~Oj4눲4 򮒆KysVJD-Cy^>O@!6: vwbS\ʉm>c!C ^kUJ" hJ@iTQΛw{]\9Ϣ;thf(cҌcyhD}aըZ*!%&%RAzBXaaCfd.Px+5굈( w /q6js{ ^}J\- zhbcF r qaD( p$Yc{Ë/񣓜l:.d!#>кBns<OJ8II & &*> @!fr6O(ȇ]8r[wp<~Iz;xuncrg rΛL5":>p77~`UuK]~"G.|} djI0|*iP+E(iBҥ}fIr "eP\i!./Ċa#O)bL[6baW䙏RB(,@WS 2#'vDU)>Xл,4Oad0 |ᜏlD=;{ێ?nd|h>q m3?{F_壏MM9>󾘵\W<1?gIdv/iϡyh) ~)oRd#k$AB) "'Y۟JU6j{A@eͱ0ca"ϧ-o7}M+qr_ˣ?5Z Y^E5j1vܨʬܕ&ee+s:ǚ9kd yEM 'O$ qUwKf?$8C.+&cP*/pW-k瘻۵sK= IS%~*%%J:B'84>Z ct*]_]Cd=l!r,:Pcj[R]v+`mG:pc㔒n 2 p+Ҍ!B>ږa()R'KBh"5AJDRGEN%OSR89cҎ5yC:&][o  ^|܏*׮ ӻppiyh9*IȾSlLuZG 9+X(V&2P,Kg#ɼk<?rGY)$n!#߮O04b3U6:.6B2NQOH;q^ơ< y'EE}mBWTT9>2"rDoLG7 UFfF{Uyb8bs8E^߼N~lb/՚zAЌ9AMfXOra4̨:i6##V&GF\؅ vgv9^9+^IY .e8kk5\W%Ɉ7'-&3T+uҺ));DA$ 찃$.^X}qxqFD9éNx7R::IR8j-"N`"wFT1;{ٽ91}nKkv?_C>ɒKE p-"p䐌ÞZ[^b7@U((|GcG* VVCYLJ!&L<&ցX)Kww(h6I)?|1>eU8TTT༅>&yܔ1]ѥ82R}z?gDO/\O`aǖbGZȡ k\=~)ƫM(28{P }B9T!HEIɓgK\)Ke)$NQ XaQBo)Xct(uXm@I *c>0$"kj~f*j2S i!~ѐIP ,*đGg6/ˬ@z߅o ৑P=s3< o@%;Ɯ9)DOptEU 9 ?q iI~6[܌xp:' |QNh\H3c&LvGܬUz{<ٮ*Kba*Vq9v*,phrG6k E~aiPc^\do;rC\,Z-I r$LO5hYc^ zĴml^2~a=NRYaq\U3ӛHMӚ.Hg 4N0h .OUscun_#Z)N.qbz i㊂Q R34o+U@dZVR;A-1c2? G8cU"|ѡGsb 7AЍ3̐9Z1٨s`fBxfM K3t<3Woxh0 >a=dv͍&wwۂac:L{ZXG:̮7$L z $3vbL5yï\t?SB m:ֈAL,D,iLfwV'W.}s+,3-Z _V#hX]_gߠH<*=="`z"#)\ܦ`󺏋OS{x3;0\ƅWH`@`SeJYciM `7tlFS!@R&t{ҹ0*iCT.oS6 er gAмE{s(A2ҾcRxi ! ۰Q"\0PPҊڃ?[ZxVx3> ߚvt Ή>ĻjЫ1\GD/ƒ_<&wSqɅw )[DŽEҵO*3,F|O2j'xi:<?F;Ũs!2\;PJ qwNA2uLac;7iix 8, X[9xR 8T! j Gp\%Y  RJzyOkҨ#m'/*6J#K -.j]'B[D݈| Ρ}0Zt8ДcJRߢ%y)H+a+A$H݈֐[9hfB"QUZ$`p}5)ʨ˔ rA 2MabqLȎu!bw뇸~`th@P7.sBn?^桡\:KQ]$Z%_\ZfQX='s}xa䩃-=xn8GN54O&#vHpMVW\#S9>;hDL!wNIV+S,(>W ے$(8څ~ΦcOJN߶\na8q\vˋ3d*q#8+ְsUжoլMH7wsF2X0,Q'* wvnaAnjTS ,83}ǥqγR$G(F#ܒvaC،IBmh6*dDHIe6[WW0*'@iaAȐZ#hVIz}Fi` BikL'1atiԛUFqL.kT'k-J\ H  '&h[cΰO։ pF"!3 s*gzy0`|%mW۝^TzH?TE 5ԙ Nv{<ก (C$+9Vd.}hATK M .]p2XEiJYh<X'TѲnji2#S)^{Vy6Gj3tqYf=7Ιg(u֔כ@`9Φ38eCMzd +"d#0|%[ks\M͹dKPFe "L"Z!}G~F "&5ͧ1KNuazZ0@`B?"8L.>+(@_AbR;Hڣt@KZZiKܒcug5Y8**o+HӦQO:D'ho ECݔ<- وt8Q>n[?To-t&ؼrT́~|:`й!?Yv,e&ekEE in_V"F YqǓ;|Ԇʐdևg:uF ܀W~,Ō|9 k0^4"n{yfsɵQ0Yu\=Npf۱2գJzǙ]\Rg5<%lV|2i_)E訥gxY0uh)0*ikaݫr.[N P69;qW#ƪXZIs{(ra'> "’x E=lE'|8aILrVPMSD:)ap{42K4#X_ᴠ铧RHX\cENHMn,&M10[HB ӳ ZD`~zb2HjI[mq}oj>LDE!*uQ߁f1DWspVnhk[v]nH j@gg@Li3TBM b#6D!$$eUceSNi͑°`-esl A_+fgߧǶm}~;y<sƕ^(cs^{%TU+K Y>'n֖ڊPH=Tg;LrK$4<F9~9\FB^Eǝ+]n}v(SM׼u?Prm䴷L=9$fmN3oąsjAϫqS5F9F@ڀq L_~/@)} <|ga6N8CPyl:`&Nz?eU8ل~؀߀; -ؙQ<'|F#MՍY}ΙI. 6;#Ր!GqX"Z*P;PCÕ^8H-F+ @VVN|K c$'C-=5(; F 2/okblߗIE\}rW u9 1HWP\T]CQJ$.#r_yLKBk]AJU'hLЮW A,5 ,-F8)ϣhP"R[ƨ#K3w (H Uk,TClZN^:]:;CZ69Ek0ܫWgN8z-H IDAT Ӈpר)P!úvR<16' :9h`ZKnY}* Ü 8ǣ p4zϱ$(vn!3ʼǁo(gMFQƈF坚[㶦[mi-j[ƙv[1ndl++, cҪ+`jLf_fQFut0eaFp0I`8?X\:Hƀš1 K1`ȱ0r{qz}7Y15z9!ZUg~) 9]Da%WR -GJ7Ћ86;k>7Os_g7k]玅Gx plN<)މ| ؆.{^Ac\-?@ *Lܠݡ3꠬0H떛Z+yxQ<psk~&[/Ply"J`K E $Xл|WrV-Ve+y΍U H:|\٤&҂H&G ԤGaO2d-6|q+<|Do _wr-lJ?^kprǂⱁeА`u1(Fqs4rKfؽŠsOI\"y(mkstK6%7RAas[+b]ig!$"=@(D0a AmHb*&-BT ?#-=üjʔD9 'AX3DNJJM),I 56qޭAyaz;+wՉLHqKpLx;1q ,6tz9:.f Bl?[:7149H @?w3[3ސ Q̊pb{TdCKL Cz_ D,qRia-pNXJg#J*X :qi, *97sÅ*I-c>@ oqwt D'wAhA2p݊|dfFfb YBMpl  c) ?g,DRc0W N )\0E.1EҬVlDTDm KD3RR~, )hJ;^佂`$N lg,yH &7د 3{{,$]w{滓Mc6;oh??&[[>{ |;7yW?9&¹~dq*~170g.|eҽk6q*Y1$@"9(E%aY;=jesk7%ųk ySB-2M[Wǐ[#FH*)tH[z~BO(#TI2Mj)C [&pkQɝYuP-#[N Tߢq%@ 1`(Ç138W"7E ][ JovDpBu9{չ09 h`O,[O[iìTzjXQknOn6 9)mf+5A5IiԚT ސF0TZJXE4J)1O!T45&3 `a]" OLOM13S>{?ݧ1q?!%h6+Q AtF0KyukomS߫!7.nXAU50)оv7&)E`{ !bX V 5)Y7/&*v;N[ͮ7\ v} v<m漐en򱅬x`rޔBuPTB ӡHCs2~,+α `]p,Qə?ֹuƹ/>kc%uD$/W~MжH-Ǡ۽-1۩fۏpB!uiS%DHDy܅+Ԥ@j &{r_G ~/羼Y0яqs;'>1{`c?8=.{X|1|NZC3ȝmo~~4?|C.''h  Dbc &4vŸsa2%(sg2w!@: !|85~+veS,fk9h Z\si ?"k!2r2bKi>!'ćҧ&8h27qf1Y qc_8^M˙01"6\)-z,lJlNGOQ9=LZ,Jq3g3p=:i$#[ WB;^)З)-8e34 U%TD>jD^,VUH E^j! ;\)uT ZxGEϻtw뇷~`x,p^P<7H>?HM0]N^9s<4,^.`ϳݫbF go uQgzٞGCGڊ6?/Y7bK}n~uBB!+j|`= ޒ H(S(a lqxҕUs΁E` N8*jiK >0p=ЌhѰ] gpVn%2΁uFCY| 7MΊgq@ 6p|jw3'X 4[ߚll76Cj*j-#xbt:Ć%G;T+ iAo@`'Uh7*fM.:Zkg~)IT&HHEp@@iEAmZmjW嵑7툢( <$$D2'TR3=O?Uz^2J'&hZB:IQWWA8 :>|D,N) |+#R6Eb#/ETFk#UWfl3d& ΢0d.X9FyI)g~4w.!#TLSe*` M BYj$-t Tqr^ĆbcE]+Vhː;TE[HbDNJt(!t#kDB#cRp(%fm$̐6RTT$I_r}/v2Ƥ2OFFmhqԩ)R|V默 q)B WVZY~tv.Izg}O,rtRIÕ:䙤FVXV^i#.t18r, 0'Y CgmawO"" AhF S,ӍAp"es:AK@c]θ3"' 2K?qx˥ )8:p^A:YrE'W'dnT7|ܴ}{VXR5Xӛ*a;~NqcoHFd9ED0hj3ǶMwS˯!${:ulAYE6gf5M7+yIFyXWtQ<N)3T)3',z[ (A ^v`=r>N9\fq!=)8-d垯d* 9BnkEH%NhE Uv0]39>BVfQd5$Ec)hڹ' *#Q*a0%)QkH 72W'bf5ʘnNlK,x 8ig3}j˴w'%FL}4"m紽uLL<# *d[[l7!,h >k[,jK)l+I8*۳M*yNT HrM^^m#鉋1uCQݞ3|{C9C0?=F B :Yא#_HB %OP/ f5$qRI%]zs/OD$ػgV |~~LX:XfطsY3'@!r ǩXl_ 8S !]/`~)@QEF_7߆,$xC*(x)+xvpHHQ׬Bgz֧^EЙX:$ݧLq/|rHlv)Uaq~DFu&=}Q^\荧y?USX!l~v{dyj}#$;6:&=KoI oaeņ:ReYvMcS98G@!պ`EH'H=^d9|>X!VbC F$XgȳwPŋ;gG>Zk1o6Uh49Z$5W.QNjڒʀshgy ͹y3I5>D+9_ȗA0T 8f03!GuKdC|z:һA{?'sr2Rt5DjIJzbY X0BN l( 0+iRQP{)') TTc_tI~f |h:+d‘JKG9ķ> BK8T9DPX!}^-|dh˒m{jƭ?Kc&"g?ײ$G9XNa\!1RΦx@vj l>=f6% |– 5Y;vweb.0n"_9;>[_]"LO":wOHFdr~g>Z,H(@Fc)CQ裥0!)(agJXYܤXEKKU`v][eYd Up"]'8'2ցL\ӔKcl 41* }#x攼f0YJG3#߹rEr,!mj*aBl@cdqѽM&ne=dڦBU+T&FGou9)>%tDyJ?FT50d'du1㘷H4U6h P)$2e"蠥t BEi|T8y i#K)L9AHeb17 \"Xf\p: w>7Dr߱V]ah dv{L.;\lȇO9KЅtfx݈.H-A.A]d({L^D09ns5@!;FkU6hl]*o8R@<k&Yv]Xϱ-":-= oop+C>| Jkw>_;58#[?p; ',hr:V~/|/%n%$^΁>@_ 9e{r'5e5zD( 9$ !(gljB#<2/QL.HghL99VvFa=Z#IbEiL`BE#<>z 'tUYK{]Śiӊz _WȍG L%㎷Rq)9+:mob)w˜x=}_rͭtqʥNwqZ2RK8ďԦ|2 K6C;h-oS) «F+$1A&*oYd__1Rd'Y]FHXpgFk.._Y@QN2[΍v xȩSJ$µ+l!$LZH%P>Eh@(Y--JIpl3%ěЅ_ 4*Ԧ!;E? IİymvL ʴ.J;g vGDZsRJ?u 7%BKCj “ſ܃ St^s+G|oc&Ǘ1"/.DuĶi*3 F@brH4rg Ek/Q*,CYG/dFB .EWX I4՚PpծmAtxC:3 lj㐅q_Ⱦ*SU5jL Sh# ~lW{h+mQN kT'QF`E!F|K(s!$8!2(PahJI(+vT`6H:vG FjC eLI@5|O` 9ф.XW\1Șg$]QRTm/5Xi|SR1~1`e8SxD&!jc\=C_(Z" O)vpXL1N(4vޠ&PtCV8Gd"2n_zCs,#8o szzzbos78?ƙOʽ*kaOrw95xt]jy;+y@oÏJK؃om}Ȓ_oϼvS>dOg(xs2E($vg(ڑ0~qE8p xvs?@Ek+J@itH%Z#%sT^hB206G EBy& 9VV90Cb2*)jdi|knMDU`ZAףX)Q* Y:IKd~|FEt2^T%K~ royN9N\[6M Gǩ7FzmrD5Ў7u?95#OrB'/Z[9[x84~JB߃U]} $"yH@A/zt <BgTZ:Ϻ{ g0G}臿q`}fmޛ^;%GIom!ǷhȣbvgeT梵$j$+IDn|RrVdKC(:%^22iEnQJ.]gcv;#-ѹĞ1\B{ %ϐBn[wG:L4& pNJ{?swr Zo>^ O5~|⋎r{kDPjhWWx;|9XyO6; sqm)PRt62"5ԣ$Y*ADpt琁%Oxa=~ڞ]l y!سե|ZsSlzI=bաZhMclœ o>0ɐocad&[C)S&d@- &n`@`5@2'S`'h{$+=$xkYt(_|U*Uݽ=wf:TX SX/\>3O;L-,Bԁ{ˎn'[9ŻoA]TzU'b)e|p]ΥfR2`xCΪ\f3L CAwM1"rrGhaLN_$G8$Gb#WV>y#O|=_;]>G 9@`ro=<ϑ)SApPZ)QX=HOX%xRP8ՅAxES` B 5&At8-Ü85Ŧ˚\ ourg#6zI2{чf;ce:|3 d\#:g96!O7L= ?4UOiN[#Ah 0TdR!&}pDh2!CKVoqX}itVH?~X_j'xUCx(U^:GO0]sUdbM)[jJdpA (4C}LoJ 20JI6 RX×k"'1{kF$rM5w1;=z7APH- ##JeGCh%zj$ s#< ٍ| `&yRcr@qj nAbBG(~f`UNL~ $/K社k1:!G&8iYiv ?~) >ZRǣ˰ˈ'q}yL.S?aM%lBASO0' 'CbomG2nǯ2\ ~mr| ữф#)햏{d Ip! XR"w ߃/E/S'`z ;%P;c}DWcxi 贆=D3hWD]M"Yg12dyaDj.3] ^{Vj3rְv8Q牸^pyW9w0df{?x9Į mw6΀\ZdkZ os[0ck_xCt l@jOb1x[IH1xV#m-V{3-5bʻ(ZxCXFs;rt,sVyLy|d4gj]mX*SL`1DD=F3Sg~yAk;Q1N+'SlN]M1wv o%쟥 zSgr6fi$ J;0n5Y|aa5FEr~qJ"6iD &T Mpz el?ƾbQMK.AwPls`'.}r&XB{|B :We?{scPǎtX fɂm=p1B;2>oi0YvR>)zWA: ֒=tj"u 6T$ @ yN#R0|aH @&!\`5.([Udw/~޽_cQ_~)O ڻBɑA۳ 31痹o..DoM ;.%)pdnqåz8z[`7n&Rd[^8|OO4p߭\u(oč,UZK>k:盂=G/S6a ,w)1vKV}*re$ y"5 7pX)U )LCHhADR5W1G'<,k2: h&>AM#ebN1A_,\eoE5GmR{<ΐ@nN5_%9 Y8sE$D{ *ʒ ȧ>8w ,ʋCj; 2*Moۚ_7|IN}4ˑ3%tOJ4 eoih92pRe7o;[@KKKAemgdL9`E✆nNj ?_|=_r;%m8[IIK32TCAAڴ%(@Xs9+$S k@FQ0-UbhO#2E'I'm #ƣ%s"[JB`$8)F9D`5B5\>f6]G #6^9CxeodOm<ˁ/w/kݒ"=Tox\v/kgZ̶fPh [Wqo~蒗:N3{x, Xz@Z\ rbNA[ˈ2m>^K aZHBqࢵ m~|ki^)g㈑ѐC#qhtn{'JNAEmbZ}qN%kAH T# \NUԞ [Xl1H  .GHsd7)?ImT)bKc=1Gz -p~d&ǿ6_ALT­' IDAT-b*=Go̻ ;7<͝{fz`  L")bh%* ksڒjm%튲h.KHQ)!@$$ &o~w?<{-sdou=9rdME*#r\.ʑ_Ir'>{N ?rb|?2[FFЖ}.at UH'~ C `Ȉ*hqa!-jLcχ7ř=xZ4T7=pWb8|3ks /DuC< d278~4bz҅9On- P#881`+[Hnטđ XBU!. C&t 2Tdypy(ЎBF':/a/Nr`ʎq|ej(n7si^sOM۴ hWVVB؜<-›.y'FH'ћ׌mn`A:E[ 󱜰V]<ُ+yΗ^<:>gS;7q9zO~v*U34_?jqɄ+wPШ+ Z!5tOiSくW#} 4&k{4s1ɰ6«/_1>`߾k3w`G +"r[4+Vc0ۍ0{{[ł'8! (6fƷ^IgjF{~e2iΥ@x6WڞSsp⭏.^w\18ADPsdA7( kkuW?: 2؍^|%1{Vȳ9S+~' s>yNטx&Jp;<6SR\$ˑDaQ( cʽL*!A )ѪnD_ɨ?;w(?"Adb1,:6g`%d9EPC:>qiNRQ[uk06#@*K]VKD41 (!:Ay SU:P$&dyʊԆ"җp(!FՖ62tc DR cZуx+-cMzl>~/goWoʹ7;__ٓ$}*Z#'/E1d~˝U1#ϱc|/Vx~ncs q!uRm,r'[ٗykXr&E_#^9)!$'5*MȔ+.N(dJA^\DKBxrvt8g[`Z$.Z&IJ9:5f;M⇴CyO=c2u,4tY̾Q|K$Ixng<ھW&#FNa ܻ`5!d{ecwCMpU0ŝs.e9"^}5'Ƚlq Z| OC,s;r;۹S@wOhrp5gJd=RN{zŖ Uqwnxǹiu_!&I]:@%}wo8?Oyhs3 _%zy~wK,?w_ O%؈vwo ZNq#4-![sl8z ?ey>5+昌/_@]x.AXK 1RC( x`˴>'%}Tlڹ_cb̸}tZk>r!I)1#jMmFy:-M,L1k:I(j+켹XE< Y^GN]0cEdc\8+_o_7BR3ʟ BcE E^v(b1buT䏭 YݕZb={xބwfػ̔1UZ hU\#\,j&~^%壵J}J*}x^\cR-ow=UpװiQPؘa + /YYA WHddiN!$6udno.2ҳ)&W`5A>$9"Bi]4=!RCUtǎt$H> OXdM "*0Z!uT#sbj*9+!H^,aH+8uX) 0"@/dNJMv{9~Pqm yWl8%uqSK|jiT5wDV&f '^cK46NpWW:,P@lX0orqn#psHKA*'M +Kl#QFt6%^gp钢-1m'# zm YEP %i o<ŷ*O&1'>pUG<}gN33C U,g|(HIgן:|^{Y:yS=WaIhi&\kBe}cS`3 ,d939tUņ'p4F,H,q'նT?DWL$4!]斸3$W9b09bk|"D\s.~ʝ柧(n\cj1эG#/"f 7G]y#HXL1O(U%Y!=R:,ܹwUJxe ,npy#62o3Qv;nrOpb9jg+tF,Px|qmx~h]Vy8´~ P30}ؼTڿ`\.)`-?z w[oOrgG|PJ2=2j '9b~@HJyy)XgG0|jxF-W #^BXu00EN{ʛĢH .PG$|cuF #*R ̱24,>TqA+җ1tcqHT 3ِ\*BY8~FX1DV crQ`"ٟ1u] +%1HcpaqXzr 9TUL¡b%=yQ];fN=27<  q.%!y6gʇ&̯%WUJI,8lLءO_/0^.26r`}Ő4 {)๠ aZ3'8l AL} ].<٢/q[p(<АH@cAKBŦlkaӥ̏8 oX/+zQ8̮7y3UAz"l+=mzWvWS"?Gr9~\Խ{}>DGm'iCf&`\TLaS x32XQ$dЋ$оȘ8qO90 Xl& `{dmM4ڠuͩ ͐V>VZz\G(D((H,.URM.ګ4>B|ip$"uJ(,'Qᑣ^ hT"<DQ12f\LsV}1[G'Zl >Ji_qG\J2ɱ3{hTxZF@81f$Gb* HY ݆ǂ)4EYAv# &˯ pYBJ_Е@hW-ۦ2DGRѝ; A+9$pO@M0< H++>g_b~^fb 6_"6brI%d 1+4Ox7K gS{nžKNvq%x IA2_Am܃FstoނQ{ > ¯: E:OQDwb2FC!0[)@H!_aBU"ߣU ,撝g0V AKH&ZMNVQȝ@VH 2N dkdDMM"I 2K-ISm2)R`q);,R&Ys(X.kҔ3r=ʂmG]>'Mc#2b[p;xI>0s+w>őaNSl=S<@h Ouወ }/gZ$_=$/''\+fs ~fZ`_MO!/%Gϳ” IDATY]=7rLL7h0.XY! 9O{\~V"Cpg`/lx)ɶ*g4'Ws6F-l[ KoMh^%iR&؄1HVCـocXmcWZ*#t)øRV |^WHA}E.HY\{D3# ,B4WO_C5^97‹٭nK/W8paxTlz/~n^Gp3y$GFyl01:UtLz>qM2bCaILGZQa+U%F!ST d i3tno;-weg͛oTXYLvS =DĆfBQ>Dus5D" ̒d=(5is2Vh :IEldw }]$͇H d#s9N)4DRRD6<$2PtI:hIA͆T:AcJ%#3\Ki\Z&3 n)JhV!BAËpRxcFAG嵺K$ AbPYNQY[Ns9? #d18H!2)ux=1 $*MmQe"d%n)sQPʰHw0|D&tW)2RAc A,}N3.z.!^#v&'F,# ơ*eYpwe_EFe\c`| r"RZBKdhQb9Hb*@y?X6T4`Y0b$]JECH<-XKO:,T$hdJP-ޜ8q9%W2z3///@2S5Z2ro;džs6h1QT2{b ?kR۶W‘Q6ss[g:t]2o`Cعe.a'~gy`C>ǮM1X^rp9B(aMN.|*Ih7 QP(A$JǀKHZ`g8R3.tȞk|F {찷A<!mngVW)SQޅBc(`s0^#IKBv`ႀ+ ԕR^J#쵎*m-{xYu#@q9XaIXԚULS H 캎mc+x,YʩUF# ߇Q>xjZ61&L5`',y68g‘ ^(qTS&ηS66Y,QqLT?*o.9T,[&A(f+ HN67&Rh% 3NA=7]m,~yVȨA=# K% C}ptlşF c%?J#QH4 Rq4Ԇ1ܱo1p.zrА*~@Т| ;>(OZWhJĺ_wX_gqAfphm3[IC?f/3c]y[I}̗!~ϗRSǟbbbcI|q*!ݳZ-aW2h]%qӖ2zPkBM)V2.+BEj ݼǙjU#E@4iICCP^ec#H5< y膚m7tf0d^0"GtkNXXR(tN!)2΁Wd+o7&YuW[=@ eܐ{=~&ā$#8Og[nb 5\ /?ǘŬ<CVFy U]Ae-NSF&~7{)yK}PK8z&BLq]C;OC 6.[;LjA[1E$ӏy5j6EJG\9GNUeDkvMjWGr_okP GW{I\"p!=ub]}+lVx=)SiBwB)|EC9 qȢ 'Gabb2#|L꓋ rd$4d d7; hM=2OhWA6";Fv!n˵L׈;\w=䘏{9Ժ0m5wm\r4o s._&)|KIeHVxZȤFWb[-Γi, =ה"%k|+> ~ dh Rwy8ݪA3/NMZ *R[ƣABm|]xY,lPj NF -r/KT[Ɖ^9:yg>Zmm--=nKSVF*4RSMbO_eX .%rTmz` 8^C| h̹QkzDߕ]!kO{XOsww{>eiYklvvE]A7i Hhकԉ-KdID"i(Cξݹ[, I%@G|{gs|D: *.@c/"/" o#{+92"By(3!;2 yWK1?*G I"ſ#xo [!l9.Pˊ3|O>GwgNYn!xud%qX'R୫ᩕ w[YN Ƞ@MGq>+d?쿌 -x +*my;^ p8p~a*oȍ"( ->}P &Y |Zr쨷o0uv"qէ{mv?/‡Qvr(S Z'm51{8Y1ØN2[8TO1n[ gЭمF`Ĉ"%&h1&Yj 9W/S6Vo-'Qɘ `,DjO$i:` R#EHC%"j|ITIi$/ Cɵ@Z͒W% u!8pH<ătK$) Zp K-VIWX -'<ȵ .$Y?d.י_{YbtƗK{{N) ,4F\l_[9C1A?CeY`h 7Vg3 NKYE)Jb73a }Z EP(%*a?ܕm9Ѥ:I !T[m($N$ O#De(0N#| ڨP#U BLF{L( A+-y`Xflh"?@1: +I PQHāC=& CcM,5Z(B AtAids kƇPt-l&ـr~B҈6ƫ&"ٙ!^D'ѥa )cJq9 ZđJ  1!uUǁBgp{wiUJ78_ O՟M疾>+5RX kQ0)qYv:YOuɳ$C+es2ķom#(ofȽ}&TF98B,Nhl;nTa'l{8ft YHSus$t= j)p .U6O?ձgnބR̦ΤoyN_M )@z?0CA3ib〲Pjd l˒p&d6vƧ|.|>X,Ë߅+3yii)!/s>emKll17O| Vy\8 !G/X{5q 1=kdfbL= 4By-wK +-J,3ٰ8`s7SBZK<$Odb͗ؕ#.!=h+-U>fVx"uRRRqT.qp_\1Jo7hfŒNՀQ*9l#$<'* A97w2QLCD~CZ]~i5?:OeۊD)2Xgv,aw vɜ$ԕ괥ѮCTOTL)$f:N)Em )!PӮBE> % >i^u,vxU"%DP!aI ZB'=34O3h!|T&0o}eJEC5GH]  1,O(Mi=T8ZhsGx\oл*KyB#߼[]AY.ޟq |s5?Ċvō{ NɄY;AoylxSuca-?:_s+#w#͋? _>+Ty4e"ŒC{mB#4 Ue qxY׍NtKZ/K>{{fj.+?/Eo*R0SkY^:D BvH:Ii *J`*rdGYOlUж(̄ W5H; $H"NeQE_P1(/f\$Iz>uqq6VɍCՃ1#+r, ~}=EF,t MʿnR/>sص"|' t| +;\f̵7brU*UÜXg'/nʥ-FUc<_7!Vz&a=^*-A9!%ז^9|7]_xsqXwXg)˼Sqya&A]G 6zkCZ B5RBYa ex^T O|-U^-^̾L38Ry\2H%M!9agۖ[m2;rȕ@k6.V0%;,gfU{++Vey>ux]2s +k[ca/c_6(n P})?}I0D/a "qqZRhG- I &嘱ó X &R*F(EZ0I+(UH4-0py][d5ES0iK{@ t l2#E0? kB,2X)QryU0NA, 0e,‡b2& ^"]!(N!wAᰡb"bcUI4ɪ!ᤠ7.`}8* Y#KmM(L5M޴pwn=AXIT߈|ՍUԔ4UNjS7,bjLKB3o IDATLNB4 uKȏ86 hgNPEIPsC/&}af(8¨dĞqN+w\HL]STGAͱu#8Qغ@pyNiUw!Al|Ozŀ:/]c#Bq PK 1ot:`v_A;Wbs 3ܕا@ΐ}-",IwFœЙ=ʺЧ%Pt akSOiG C؀γ`r47{`frx,̾ <sHwS 㝛GDg{΢nl^rN|/XyjsMDPT\[CRzm=ryNE -ԋI({wvyiCW)%.QT`PTl@\o<=tIf-YRU =xPԂh4*+ 3W(H-)=2P:OKJ8E E]X*T ǃF KICJ(|"R|09I߸ӟ?Z_|/ӝ6?x=ٽ_Ob[ǩv[*nkۗp=.=-wɿ-9{npb0oOK\|r\5跏r3u; + u$ 1*_M0xo HjCzXh)wh"9e=B 7?{o7Xn̮1>!-r'\-t-az"-b9Ѭ\,Qiw )VJI7֡º` M\4-Idx"ַmK:VJATBOUI:?@4C!'F{83"V.A|2nc>t {-3?a6ptqA D"p!(B[@J$ma3Hdq68Ho9FkTqCBNNrQMCP7f7`Z Y{SNg"}}c_{d*A!NhAz,$Fms1]!;d,];,z6no{Z?K_c!e:%N@(ǔ`%[T^ lu<%5?!?*&ғ|-Tg' ;)Z;{H; +aZWH9w.'?'n6I|hKxd18\|FFddiYؿNvٷtgN,?mS!5U&(X<+߆m8qJ.¡_Ƌ008 <8<<݃hΗexAx٘׳20<L0k 6-4>ހG;f T⭣!$cʐr{U0k Tnj sy=E™.ҧX:B5^ } ʍ;qޓDXN}O<׻DҜyVo>cp6cC/ Z_aW#ͣcbBm% `==|X*vֆN2#"V#Fwx멌ŊIpo(X|@Si\ZC% 6K^|ۤsvMbZMq2I1Ty**[vV1xsEކ٩5"o3 F@a#?, g||[H ?|/άr_~Soۏs笠0EFe 4(M&5' j!0|NB{쥫]xDNX3aW'\x}ṽW_/s>aFczm̍ zb1.8$Jc@zNtquQwo&.!|E[䧺#O< ^e>{_pKZ PER BΡEkGH*4TⳌ0DJҕRD, 7gY>}Sr&sYtSMg0A`EEFa5qC]@{|УZG5ۢ=V)DƸ( 8kQYX0@;A D `d'EўXA;,,JXoBx\2 #54'Xo$M6&%c:^|ܡ%fg idw=hPj"DLc|QD RH;-Pd]lb23 qeMUH QVK~!P(s'r'6^cPBh>CݡZK D&N\KW'nV$ Y|ɩ" & 3ccҪè4-m4A$n1%efnoEM9%ͱѐl='>u-) .J K&-4F)LNkce}<.SvY &: Ft\7oqQ~Z7.T i.)Y֞yW E|6w(bH+T3%By)&%aI0Jo=C9*p.AI\pU2}{x]r-أك8"1m!|yh݀~cXB_l[0[¹^#xv#u8]0f(옫7rL`/$I:MWy2\|i|.B^4 .& 0Zs\mk+, 5ޣd=BXXfH1 }nOmi7W%j1N8WD1: 2x2ϑ;qD M ;0zzr/ XQ)bpb=VT!G@S˵4 F(j3W/V8ˬL{nʗB/Z#haBwgfWyB&1FjugYSny3 qѩÕ 츤ʆ#yvoK#pbdR%jRW%-;v52H/jZ)Nk SڔzJ9bm%UHFP@x ]*gHŊ)xM>տWo;O}79s`Ah VG!!QXZԧ$mkTR";Y A+h 2 eR)T=YK2|ۚ׿ {{`f|/vcOϾ@'zqqɵ7/q+x9`Ơ߆\gV!fYAcYe̙7>ǭ>I;ʓn:ΐ؛TcJߡV!lR ׯڕh=q$+oFQ6Gs\Vd9E/ݵnM#ES.pLmekZ;;ŭ[O d %Q$81ʡ`Ǭq`BQ6&+:G"GۄY {:jNFե-ȵMVs|D!ј0;T[)@H+T!G,[9/{`=4zFZ DYӟdHZy?Nu)ڌp_AY_~μ;d p*BY PAOZ( KDXKZ@.,jdkY @Xh$he4+M͐Y [\CRd`o49ulw oknm_h1E`bm6nSy?u#p8lKL$ϝwށ$и~SґA.Z%p0odLN,qf;X᥷swP]6 $VE- rc-I|Tk*Bz}{W#"SS5\;z6]Ѝk TyEaK27uҊPkPAjI?#[%Ꝅ@X'rs~x_1eG+zcr@=QaW %1Ŕ͌gt7ga7andRS.}W`^ކId&̀^Od-?AÔ6 ɨD!up@SUH,!\odmơ4FJکXU" ) 1n$_QzA+MWi)y2%P/8k saB/fs(jÑS*7د*n61cɷ%-ggS˰ܛg?Yrkk6(6+$\-bff3^N}XhE++]LhQݗhɄ4ڎ;E $ugFz| 5X+qzwYxM4h!ɐ GwYa?9O'5h.N1A1ycLVP8KD"q4qqhI0cpdgahgPRČk L ld1FV!E '(JS7N"VJcA.Za& Bft$H͘QyqV*zbfb!*DSEn(ul(htV6C =y1l֠vUlYs"r`-8FbK5U! tmAPУC<Ϊ(KT ya˪>~&c6n`1 3hK4&ݒ}ǯsK ~KF)x$׎PB (}wH:!ߤ*V۝)[\U!h[bmNb$^ h ]bPhߕn/~,9O~3/o04q+'kp<YaJ;Fa5J{"/)1R0g嘖6"B,wKl3B؜J'H52+O^hA!н<Z8H- Q\ +So'CrDZ;STh5VILY)+<}|De KMxk灔ԎH\BɳFmy) D1z 4)'aB("iX: !^| Η0Oe@USo]%#'k;[߂ [/[jq4t&UZ ;ZTH}[[9M!Ѩ Z* /4p^"@r<(T >4D\+o!p)b}B/BS ܺ]PTc=pd@rneK@Œ=!ئd&%>H#-V5Mey3A9pՅgYM'sn*I.`ɲ%a1 L/Xfzbhv44mqDqdRruoi>סhzƟSyamI64*G*[`E#k'&6%ӂX[(@Ą xKd^zʪqRSb}U9.W(C1ѹbg۷{'Nx͒\$՗hv FD% \.121ȠZar5լ*FRFfvGyKHk;t g{\j=umxh,OLӴ;j[VY$9G7α{>&W/0:y*~}(.GOIc[?OebENI8(.yq=?OtΧPOzuG(y kqs;.l9ٲ[uS:IUu%PIxЅ݄DP R $A NݢyzE]|_;9(lKh\8z#;T$a.#u YI')>Wk ED ic(oЉ@)|˔)(gP9 д5qɺwN ,H Ɔx,~U;ڏ>&(fw -vgu7EcEaq4HjSF#5q`(+ *㤤Y13KRŤdT$JETb7͆Bo虤utCPq芭5~3xS#DͲЮ=N tQa >x4!VQx?x$f}GZ8RaZG>HRfKCQngYYm;,<עs; 2802G0#R? \u]o-+8kWw\r2{_-i==Ͻ+9\v?3ph+(xp~XO- oǞ˗ASOҳ/} aY8W%(&PN`P뉅I+̦|JEד֤͉$?/ x("9fa)/2"&1 M4ҙڌ7>j^UpR<{صu m YْDU Q稢 mr\/Ռ|:iw/sl?4D(J֔gE̤ z]f~1Vc ȐhJ'$A5,)Cĕ„+5蜐k|lDд\B!@J )Б>DJuB )$Aj-)cKJ$3hOn gF,QJtQsaKӞ0;DiҊ}]lgVd+ 1\^<:v k6\xLֆTJV,8GxIUTS3%H5P*E%p5)WKS_aKI)EdOOء$Gp];A?0ɀU[zGԸ@zL 8HҸG) ,[z(v%ICDf#/0'Cĝh$nelX$Cs48N7ˈY<ҷβ^:"H[G4ru"Wq_,{_(CMN@+-5R( ztDI#J:nh1Zn:(K^SV .1Yt;MnpJ'Qt-gY:B_]Ÿ uF&SEl3m)̌Õ(x}NKiF^BEDfe HCC>HXL^UY:DӈsG= _9& MIU yx3I҄2l(d`I)0& &bljt%ޔ8W! RM@QY,&*($ITԾ%F(3 ћJZN7* e\V&&4DL+MT#s-T )Q$"&XrmEiUD\:_K+OksC\j4WCE4;KՙAMQ1Q4]?4皤\Yeؓ+vFD1X]teHCjG9E9h%Iʚ" bSh!cRe 2\q?[i.2| -]xɔ';W>>2g *7as3`ק ,_'X_z9ϧ"pF*AIt!Z tP!$Q_&4IR3-WUgZ<{(qDBnQW:dsYQ?YŌIJ;"MV H%D,Ł/ъH9“'ϰP Pd #]iscOHۈV acO*4ĥcS.bP=.hg1MLD2g 7+N|Ky)Ʊ%&q8N)|8%12R( 1(\\?pp8,cz$PknzKx:@Wݟ'㟅Fp 'c4hCX g $i^x*x@PBw YWˆ.ᶏ\8{m'#V3>Y[\bG"i$YXk7XNβkg]W7øUji#}+]<el-Iglj DjF($!P%yU;"Y?nv-Å ز>`|hO ^U%*ZKLUBZ:V&"zܓx.%#4ƂXM,Z86d5 Ld B A5{DJӔ_5bO: <lRsxfpB Bq2[.2N,Oi[Pbiu~,M KW܆ObYk"r3Hy8:ȴ9OQep)l1{8Y6q*5$3D7 v9. 3ŽxiA!#˚h¬Pf Lg0A! :3K2r258wA^~=QDcV%8Q4Rjw͓4T P|Bm*Ki% 7n/|Li,s&~üo?> _ի"8Wl0; NԇfҀv&\ Ze~ ejhjJ6I)S654CJF? 5@h(>BjFRl^DˀC:>Ey T5O4ڈuKoHz}ɇ?7m |>7}>oAo~>Hû@܃ n ppsn~s^0[zCڗxXys`v@ wʣ? O=%=^bf.@#KD)PʡrH*̨5 lR{w¡k^ DU7޸BVugѐ8|f އ{WlF: j0>u]F1ń,QQhcb(:$dP Xiwh:n+/Bifk#6P4Ku>)ieh N5ZiNe^F%JIhea)p(WLRz_KO4N|j9sdDzn}'oxMjqԔ4rC%ߒ/*K:b=OXYM1w'toa_Ӹ\ca :I4cSq# btBK) u7o7QAʈŦRiJ$.8aEbRVx(bDA&&(_RNhGKɡ*2 "tnn޿wFpOsϿ>%ivtDJ. NC18Q=2c!H'5I~? –vYEjaKl_Qނ:9ޙeR<]N6DLcΈ _Zei `Z-vM~hg2w آbū(0&UI4gI(iUOic5U:lҭeZLŮcTk}&+ .F ]SL8#(dt<4Ҹ4M,dJ4J*&<—T(&)T3wmlG:D ,Bʚ,ZKX#ǘM [oڗހ;y^:Yx^L]h 65d5@kCSu*?DGcu %1‡1׉}S)qFB)GʺxZ"k Ҽ}i_h^sӣhkFNg?łKg g6-,K6y೏<8œk's| L >3xSO? W3~]gSMwpBgl&fa.)0& ur]gj/pxjR5x$6Z3(Q㉿sӜ4qM$73ݿY >u?; >21݃=@>NnDG]7,#g7L? 7+{I>L\I]m|_wqLPiŸs & !$V " 25; ^"|BU' lդh#Jp0D 9Wb,Mk&t"Ŵ!y3+.8E#ɈAi&)IaO1/2jLpvy`O>圀0Buo (D3 biҡCRX 5 c1RjtJp eL{'7`=6/sQU4ބz^:QY(dR]hr|O5["A,QWcGVtMemƁ++ѻwޡ|Ezn=S׷]d\eA{N fqnԐ=3 &PO1 `2Vdr*WXt;4M)+&B=iT:TE/<pW4 Q!/B+%A7N!4x6¸@ ; xSK 1P2% qD64|ZsI# :F<Vb呯 KCAcrTSWwuw֐*[3D"A",Q*zI[U\V(bo= 'Q+4 !s- GYI7U ᔵqY1\6nX|oh]{)jI+\]mM2.^&h%OɺLSnj+LB撈-,!m :RIg^2w UD=cBJΖhP*CiВieTO(t:v7#Q S ^Zf'jVr&*xlgwpն-O~=e;wdޝQ3e;u[d-R $fgH%j&ɨrT]wcX]# 3g] d[vpU^|kKb}csLW8LػtlӟJ`ky۶棞u^mۂ{=dZ}G\o~ \kI<%f[ X+ku0}zl./JX@'7˦S!m(_D&Mju? "p,1L#9ϵ{nA8 nw /_} Er*Gt#ZĿ&f< [- IDAT{n_xODtx/9x*qߣ:~^8s w_}eؾw,ÿy |0`򅈯sxϩX(Ov pQ0/IO4O0\>`R 5Dmk(q4!:1Kᐉ› .D 4J֓ jQDbLӻ,1y8džqboo|M<Œ+BFӕ13Opm8Ɔ СAlhvѭ:vsL2hⶨ=n@7ȵϤ I"m|j ZU_ +kQ>H( ip6%J4Ԑ+LJ%^Xҕ=v]_gxᏠ2ݿJgjKGkhoYv%sdVdţ)I5UɄhU< !  QpHQ2B9[~sXO*Bƀ##Jh# uj"p)y u |=EE6)ࡖXU9M Y$mkKy^Ä^k,mݝ??ԞfV6ccIv"FOE)E8xr͹rw}nZ3^ZoAa3=޴eJ7W& M|*;sq7"hؚt>u!UUU fTLӢ&@<ۨC SK،Uaij M1 7%oy;g1{"Q!\ ݲ@޽> N?K3rh@(~^ q{}?ۥe*U1,nce.r=cd 8|~ex=Xm6'-۠}+i8~w?H,_ &> w$\?W|=/zI ;bXy&'$DxYQ W(QGF@6 !_| 8"P0b W:p.fke@{Oh,s klp%dHK$Z$B - QFZ"O){ĥ1[B $(S!I+4"GO%XDYU:# k"4rƢ U?ƣcE(Ӎm05aƱ`dr:LC\=Bf7BZ!ś $HBT1 } ZE銁,X^>,ољ?|vtS`PE "|L4mh44ekUFOi0a]4i5T]g xgED/E,hADnGzg&v0B"<9°0aM7_xP0FUYs+d33hd0Q% z]Z϶>fQh^_4{L6F\V08G^Cs~OkNpư;vmť3L IE Rc=>85"pJR'I"%) e8?4{TH㕬o+wDRѵc3hNGm,xS}p;V_p-D0Y篼H A#A Im.M%Zgn4]J%,lUv_ ){mkɺXZ-nڳ 3sssrnƱK2ܺ';'ϠIsg ?<_6/St%;,}Ri.;(5`ד rB@pU]L) %A' ʚn+œ#p TQ AMV2dƔ[o/` i\{RrӊgROǑ߁/w< +bLvLJ=Cd93{͘G\w }cc1_2߁~|So#k0QXkn;8W킿GoS',K>U(¡;`a|pHnbƄ yv*ܷ1|T0*8CPXȊ2Zpj>1H ֡:! KI) |I4~ϪB{q̖YI2aͣ,oy׻^Zjccp1C ddL`L؜xlcElɖ}kjuwuWwuw}29s:U[y~d"wXq6a.z"kj@oo|-2{7?0#jlxd7uC[OQ@g!֍Tʥ<{UB_YNn歾`0I(Y9h󘘰,ɚ%2P[Cr\HC\L&;Gml2> P $R昼$=KܶHf۬^Yed.S9h2ówk6MH/))-tgi'%98cX*&d5 O@BMo%Fk5;aϰ8'L"v]K(>$17HK ^ {P?9;.klB͆ZLCܧvr79.qQ:vesq%6\ƈ٫SXc:5 ,[e`a2`>\0^ǕVnZ&xeU3`vR,.[DžL)nBBYCd'`QJ>jl~FI춢1ulLlu&HJHZ߁nndRV4͵Cп}#Bx0Y͎ӬG11ݐ9rˎ &JGS;tZmk^'n?_̇Ok|sáW_%,_K?Mm'+;8^O{6 %?OO[ 7\+a|=O Ñ!xy[z+~S2~&$ &QNdBrtXׂD &V5J ɦZ |jo-OU_fᝠCIEgZ/Υ=l()MkgRIVLbfv޹MF;LfC-FXuC$w'#PxHp;@}C᳂:}փ>Aⓔc "9RTarɰlIK$N ѻ5$kOPETF`./efZ[t&^u=oq<^[A^ iW!+$a Z8R/ M)' ĵ+"9VxzQ GL hy]% Z(XSV,(C' i +CKhWyK#9#w!f·b;ȓ [iJcQ(1HJSS1ލ&Ȇc &צuq'UH[߆iiЬ $D ø2lž&z3p"ӃҲ8FWᐄ|&6uHE)j:W L Ԙ01l9?0F ?s½`ct+S)[ׇs|f x̼MȚ[_ ?\7_/|Lp=\~Ix.}FwCs4{G_ /@c-6~ >u<OsAW>7.OIC:܆)ɓ|gmx~xzŃ.Zzm˙G0=]?񍏳|sbH/xX ,0أ(˄\P`&+YoxI C9Ow( 5:Iuؽ9͒!/TkJ-Nj4owPhN_K$MQHQKhK3d͡;)Q 3 7+'!+h7]0)s<6#^E:[7_`w1 :::d”bJn~elROr51V߁YGq(Gl5%ƣ _il /a+8\]^2*E[mP%6mOfmr۬W=d eL5/JgoXLD=F!cv+q@4Z|.['T$Nf4TEĴgTItH:.S>`kIKN"8yCTRb"`M`e*)coB0*Rb!ex;Ch EHpVaU.Cb RŸ~9?@qܗ}9D!Y'#SPZDŽ  $TEb-GJ_+m# ߉FA#%+[A+aZu5kEM5"QWIA1p\AUg#6+\106LqIy#&5A` KvbIY;D#^j5@H3J-j@ab&P֞Ie(wxKlYTRUDv'w hHhvDa'CS](R|sӋT9enrG.p} /ʿof da&͵uMrtG46|^Ɵ;π< w7r)XJ`ig`7_@]S}SgcWxgxV9+" |$O$/}F0w?s 0|>5C~7yNܺ?3gkKWmL Cy>g:lv!4][X݅7Н|i-GampMNݟp,oQxd>9sn}ٞVIh a</ 6%5Fm%ٔbŽaG%"_{Jƻndu]RQDA| ѝySv?{h/+/gjN0=xE`b.a ^M)vtz/='>Hofmгhnsu|_ڻfI$):49tjc׻nwThXaW3}aR.^'n(}3~`y  B VDc8q HScÈx @_xH}k Iiz/aq(w%;g}#GB?rClI.ByDqnoi~rWN8`ds0Azs NFt a*Dqb'EЬP접8,,P$sEKVL2wsg/YwUY WQsR鏌yg [YhusވnCgg l4(w'ÐDQ3:z aec2\叱k}̈́Řrs=?ce<QשʊJ ȽA hm zm+J}2- PaN"BjjBJQ1(A$#"nM:@GLQ@Э7m fK2!&m(`F( !GtW2)b& CoRu ,cِ-jMV 6Ff6`BmP!IjjL'1W[^  Cے\h{s IDATӂA|#4nRmǗ<]5ҏXSKMѾԦ8'K93F#EX\*%3aj<q:\۾SJO"{Zw֠;Opf9 INOSOƈa' ͊ -MDԆ P5[EjQQ^$/AP:QR5,0s)9* CDcKK'$aM]+ڢ*20k%y^LxC4e= <<1ӘO8}7,d_>>$г[lwTK њ!fG|?Xd\R oQ.sWs! ٓ,7qӻs>xp}VOoes+#׼o {J;[{d]0u$K!Zo柼=da9*LQӗ-_~|3+=)쫈 =3J$q&4JBKMLmms;G_K Pa5;k5 ^"DF%;P7-E Fa$b'cܞXQkjvb=HvzrŋXeOf9_CFq柼pb p _e'Lį{ d_g/0ZΛlIÒy~ۙۿJ:ͱAG![r qbkqWi^nJRR(n/h82D& $[وNH:u(YKpq{L753<"iI$"]®:Ԯc f(,iKftDhjY6d\*efZ5E+BOr5Jm2Gl#G:e-JiרW;l(Lyu- E#2E0|=>ۘ{ z ם"ZptꅰGfy6VkWxSNG=Z@hBof0f%Kt͵5U!4|W ٩aHkh4r"#Þsf$uȕ ݘnItmCj)51a8*ɜd1RSAI RHKUi#xYuWo,%gu4lneD')RG(an6nӞ`+Vʥ5LQ!d^7jH \&A hkEAE-gAj1^Q1ʡ^d)$9FN|/jSDUub!nL2$\ur ` ,zĐt%{\~ a9[,50A~N9>,،́$栶vppnhO|w;ewto 6_p %0 Vkkڒڄ,*hirO ;+)8cBpFCZ4`d%̱iIcv~2(bGU=ћӈԳ{0̬MYV_㹗r>X W[<#/yI ʟwB,Zp*(fR#Ty - L&IA[lOKK\ IRQOn`XZMyD=Ŝ/}he)VQrE }6(3Sz:f+[<'ώZsn%+n/g8b8&ѕ!$,xGMH#8\mǎrJqCw"E QG D `;ɒ|3TdLk2bOq5N9[zbZ QQYOOzDV}5m 5$ %"C$(h!8GQx,UUPV!J wA4u*ldZ5-B ±=BYҘhԦ+'#3ԄiH9"cTZ5(_dv]c߱n:[\],NxoTHt8=I3arz,jۘL^?Yy" ;Ϯ܊qPiH w9O].tbXқ`l$]c ] ͥIZ#WaT6MT `-MȊ+}r#._=t3>L%k=!u򣎋,طQݯ)B#+)# eG7ƧQ 3<"> Nb܆0h^m1wWE㝸|`$#8u||Y:/ nhޯ qf7z*Iu ӛ\ڌ~p[NQ;_:|3b|^׳x慊1N]^gK5{  <"~=WLK'<s+'Bnd ~:X2Y?j7&\ ?BS0ڄI C+`xIBz-8QEQZpepfPGpz?ztOrXp-3`4$aԶ@ATͰp?q}tRH6>j"jK s1T5r8k*FXWI&ћң5: @uv,+ XMׇ8mj'n[L$Y )!c罬<3iJ%LүXQ'S"R X Ba=!J#zJ&M3%~J GYظ0r^4~`p/a4^sh<СFz,%&|:lm,$\R49!m@]> \>2.txqjDoYknL9"P{8\#'40}AJ;2R^8`)5dV _l>ARl}`u88d0J[ hŧh)TRO`vT֐\N0WT,ɟUqr!ᅳg,cEL3s& 0\})%>Z22wuflnMp:6ͺn6gTF ػ 4[}K~L:`ObOu*W;n~ظ􋧹N.ݣ@ \-5UQ9x"iJR2nJa[Y8J *__z&`j:6# I TFґߓBf:kB^"MYJ-qiY32-h> ;Ϭ3DA9AIj{v76m^KX}SZ:w)I UT#E(ɄIW7KvL'TLKp4x ={Řt;-t>[CRV,Eq А!)*ĶbD1nt#Cl")lR!i@M`Wc h ԹmN<*GZChiAT8Wb$ Bd`kYT`cOB')*MhO]n)p(LcAQQ̃2=GBS&^Fޥ ὕ8iN5 FH@bw xK}AJ#UmcO_{$ڮu9/M*'<-$ٱgr}p%GV< 0|㹁/]iP¼c^|9bv>E-VcF!R\P=!y>/ZFШ 4KYI&匘Dw^dǍ qaOae5t[9 C₣-0 H-)=ʣuL=Ta]B對ƻԐǒ A2 >¤OHZk>R{EL[ BI]Y*C [JLB b[轲oTѾHy?Х.AB FpzHXZR3У:ѢE#&0$QQWY\pqW9>;|+G5"Ͷf͖x(f]]+*A#`4*dT”D,_r/wN\Y>V.0$giR'j>Pj/k }W|4]ֲޓ_ݒ]bxYx휫β?n>}nGiE覨<ŻdiIx{P+5z=^tڋ y;-KO(>)%l9^`ODG&k̗ЁvMy22f6DS%VB1v(PQjO]aAg!swG"tevz[kW-b#!MRI6 {4 DCM{dt莣_t]ٚ;2Eё()hOQϱѡ$rLG"8S#"S:JqT)iǤ0z$4A4vNk2WS7RezC(J,-ߠ.;WO_coINhȥ$F qNh=(b$F%-[d {jw8]ZL_3<fRΞ 50V^Kx`$x9ϯ/v8\ 6NQO8,X2i)դڀ g05k$vw'<&Ts ֆsSɗg,|>au9rA0 euÕDr˵,lJ:,As IDATt>mxZ W[+y7r?XʟIF$frHC׫̮SRf!8lnSH.}HuI)k=^"/ŷSŋV|f#Ŝ;\b/I;|.f."0j=JGؒQ2\0˔9KXZjmFi|,1#K0-Ԫ%gx}4:^bZ1d7x1%/_|ı-r*(I 7JyUz,_oMԈ m?J !!g;4f]Ҏ B9&S:6(P36RDԠeЊƒw4BC G`F~'SNّ_Vp$4DfE ~ӿNǸoT1sž`o@ۄ~L5 ;1RDb' \)ُ;iNN$MG=h TVJEb5anCJq^k}wӻ.t1!!\3[M.S':':U]CG%$}Cק̌ nϡ;L0/KQTn@"8<oA4M;휣h[ّ akj+(|m(%Q|U&$I(d~eI$Yaj/QG [BdhE8`VX9}_wݵM,?WWYA ƣc Ƶ`ێ Z7p.kNUz/!_|f:V,Soz#v&D 504 gX)/4\oהV̕euB5$;1Ɉߥsn#/8rg Q|eC1y$QMY,yIyl Ǻ)DOI ˜yu)DD!H(iǥc D ]K }~ mp.jd],t7a@A1:!};}My8iJ5Ic(: y,h fjXDK !BtV0$V$+.mXGO@dN%sISb]ILjJ[f)uX:+@y%BJ$BB)Ef T4lEy,Q!V (0X9[(y@kITZ*ySeG:fM_sJ<}qhKYBۚ!{׆ٳ} :(e&'5#_rW~53p-sI0قf̞S3lM3|%Ov8"} QQ@\LZ O\qp>rC 6!dq =uF$hHaԛ)A[fg/gkvpTŷr 85`Asao=a!@>EY߰~e/нqYa=u u9r&6g__D,$,A!I3tjToF<4Om4x=k.2;Ñ4N2+ioGD:EM" :3 Z! i.Bu{&lep)Dc@ɀrɤjZ4.hD:HK^:?ewiFO].r;xc#ۡ\8Nŧi̖s?׾O!\jN{'x{X=¼:&[<ɯ+V;\Xb@wԞ+6K@>90: ضopK\0 BQd "HORu`|?Tz@PC"2Et+=D'%ƄtЬf)kL҄BĄviHEeMzLF5;IQٛY+Ha*U@4AC4t"Ɍ!&@c#:j)]LĀTѸD5+I$ iIDXR)t12 q^#UT33$9}J))d2Vru=or|~{| kh)$1cPQPO&i#,>q!{,s/_w7?Ā)؄yz|oRv@'A@lZ\˚=Q5zJn  V;%g:7X3`ɮ+1Qr˹[l."H6KG럦=Dlt!ht#Ip8+!b#=FTA H"2`4ÜF0ࡗ@_EdPcaL{@{\ rM~PPVD"N@Pԃ+@z(T{?`ئ'Ĝ( jIm2"@v9JH eDƧMJ39+w$eV:ȹܼAݤl+y{'PM%lZQ(2?(Tl7m%I -IAUO}.e>21aʢaW,5Q]2ۮiyJNY|,F6h1oHyΓ8TI1)F D VQA"i`'VA`˃o"r=ljmQאETgKZyp<0ú!B[1XZ>rUzTFsWT4>Δ{5&9,=iدWw(/!2I͠\1KDؾr&:J աU5w`s I&Q Y\ !pG]8n4!v0*J l*AHE[߻LAU%? WP2 kZM*J8)ךc$HzJ\`{O'O0IJ5I b`}wzm_)^s񶥻8$:!9!6[ݹ!Tm2/#Fci#H&$Jx D,.}{ QHE88)%վmDwhE`ӏMR^z"K4o+JNS?,pV:NM _Wy_g;:ϱD#86`N>{v] $F, fƩ%5&$coZ= 41rͷr`)Ce NhhŌo}k_aws8<ڝ<6ٽrUJ]n:fЌ:dMU; 4DL2E(G4$WE #kUBlBhTDxjJ @ >0wk"&z ڤ4eh\KFR[Z\I~mR $Ǘ讂^1#OIR'yC='O|MګVb<:BĀPa=1in\#b{ ,첲37)6% )y04ڷhD""[Zp/ZKڜv ߺc8j+vP&w$K40ך' A6w  aa--0\sFsڀg],4唲?&=,Y$55b`ZN5SD\% 2 &PBL`hK= Hb'AБP1$cC;WZ!H+=ĵ1 ~m-x"[l{ RP:x|ʂ<УuJea H:K C9s[W]ءw(L~taOrenRw/P d:fF= ݆сC)<;+XK /6h܄R c7cǠ-[1ŏTLIR 9䌭@ޯH\&O={.:Ȟ*<ḁfGf_R p ԑ&#BȶKGs!E4Z#%iPJI; %C!s"i4XsD'p}ByJUx/ Ѣ%-l J hi"BJChtH!L*1&HAiD0sc+6zk.2}eFPSA8tDgiHnX\KZ}Yz4[v'ͭ oۜ}(0H:e::iWF"2]fPr~H.ZF`h+N>*[~ìm?Bs\WsdWz,c6!pM'ݻ{rĝLnp}g{l.|ȹ%孼o'dm1Rf`Mڑ!' C-*hَID֡ե!| *k"K WCkްK۟N{Uq? 8rKLVD|'R+%U-8u͌yPN$YBkh[NhIk4xhz4h,ؠU)c;Πq-&oI&FlЉn58, *zllxQP:A '!tFLj~Ռth_=;h>~!?$h@>vwp+ :9پFò3)4x۹h@4a({6~=$mnq|TkHBk !x~%:=ňJ-J fY%tJU2ݟ8ׁ9ySE$|vY9ytfQ.fހIZ,YMڤE8Ւ'"UT QPy(e[p.(&VR2 :u[4Ƞ{`mk'tۮEPH sEk;9VgGOT\+%DT--g/urLW2s;93.ڬ"afY>TWVނǗ{̥qRk%tc/2+~\`j5"r&{ᛐ]p'%,‡b ,amoMmMtx/% 'Q9}M{, Y\W>eņfaD\4Φ7HZĢzbNgeXt7E"dh4F( -(APSD0sh"eyLl}0i1E/YdL Y!Ĝ`=AVM<ѷ./f3,sq|_ғq]ub2)" -B- " % !8"F&*ֽg%Xv h v0.h%HC"S+O<âbו,ܧT  Ȥ=.FFPLi%BofsMbkSۡX'xup@'"i]%.$FjP RщlQǒV-*Ph\d\~UΒev(/5/U "vs*D%Ɛ-C.HL) x2:ːi7Nvyn^YLe-ϐ٘)K ־miJB䆈 # Bդ'˯Z~/n& O-;}6G&זo2iD<֛.+"2ϱ 20iFД&ĦbK$ Ek+Pe2 x-vX DkXZ]P3& (NDoAFJE8h\$BXR[Om&gϐ,-292۳Xa?m$zG ,gΝ?zۇ|;|X96}@uY 83|\n_mX=qG~jFx(8'@Uk5,x'=t"T7鎶{md-F5vV ,hɪJ7ẔEDfmmO#U ]IT bzĩcu5NLݜD_R/[ʼO9K$ EDQu4̐-n_`禋tFˌ&7XcM Є[oĴosgTo%fc0w"+NB&TcvCç-?'lłIտ5'>fvΤԹaiNy`ÿ[]8f<=G%=M!!? MKwpKJwO+  /q1" q@R"C6uetQ"}wY{% 9'T*#1]CzNtD H`qoin7݅wY;.e&C"4 >TV'!% J Ud^GvIJPRKIJ$ET %:ՄRخ  iȌ@sA):`p aCC1"^m r)8 %Iv9@GOmWDĠcE=zk.2[iD/1!"|W헱u6mZYEH4DJDt@h.!KƘ*PˀP )OGZO$iɄn Q :P:P5%ފR4vFF M&2DK!Նij/kYNPB)EO:73t%<G>p!=LP9,t9v)Μ`,s6b5v&د~? >ə ;;Uк_ GvA\\{p7ؽ>ܼ/#6eíwYM |SCޟ_*mhk1`qADj<,0š9[3 @[ڬ!^Oi5gL2(1g%)0QSZ5'!:PdNSع47h_'rTMC"~SMeCЃe Tdֆc'Wwa48 h~~~7ӏmV FrW(ZdV5"t5ʹE dZdhGMܥDe"Y2BG[(S tq,&ȼOp;Hb6ϑ/-/0|~ E5QIPX!Q8)QE ݈݁` !@mE;o^xoAan!.bzk.2$&`Ô ҃/$Qi-BNJTD]u w%5' d0S6Xr)[2'6BR|+e>v{"%OD6CVVDR^Eg_byEQ:C`䃠4I!9-S[JdSb0oxy>OyxÛy{3vf:.o!W}ɼfok<פCsv0/\^>4?ۈgɦ=r9CYK=H:98 I&HKĂ40ȸD B$8 ^M8tU}/om7I󋋒  ǿ>oG~yPT!Bƶc$D) Aaj2#̽oC(CQ7Hgl`R BD! dTԌˊ}ゟ{7?1:r&bHkL* iRZINPZP)0R lKnz}3|b6cO"_9m/{eiU~m&a! ,t-{pan0` G3\ r;½5'\cZZᄍ,4‰{4JИ'B:uoa>Ӌn˞]յlSfGI%Eo'Nš];K(|.-Z[1S]F; 6K5lٽpZExa d4 Z%q}| Ba1' )lu}?yR`ax{ɚJ򓟹W4[ M\Jhq6`]v%,N+$v؜T4ސ3M2.HEJ4]??Unk.pGylƱݿ⛠t c=[Ǵ&`nn gDbpA\݆ 9o$v_U-pZ o;x(Ѹ>b*DNrH֮Uu@("b|?WVHC֘u5C*KBB!TMhu,Pm$SUj/pް{ d[7/EW*]C1Ol|!;ZDHD%V8Q Mw.|wY#XWL5h>,?3nwru({fR(c9Ƿ#_pp@Î+G\<(-o?-S8L Sf|48ۜ҉]GmLFnG::W7ؼɏ k_o>G+FavUĢĸ6t#2 w2ɽⱟ ǻx?FYHIREYZ (k |($HW,NcO:.`DMlĵYja[pk^:fOzc9m>Y 1>Ezv0gle [8ַ fTeKւ9|@C40Z0t|<&FxdN(TFEeMEQFJՀ@Jxq[ʢDip"#){1j23|eF`iyve- RmV(6BpTyE)Jv4Ztդ>d-2G TL>@KL^Thk~1 ?g-GtV5k_ٗHIwլof)8t/{ac_OkO0\ o| }|q7T9{.\+_1YG$lj=|~lySFSO9ڲ? X؆3bY 352aOܾ(| x x-aA C')f{h',=KS{XW\"k&lA6²wGs<^>}> n)+kss\114L]TYHٍI %NDIEYED֢ZV/K 8% i+*c+c> zҢAGFA L^7;O3 ^Y_M{"*9pw]g C,9bY XܟG~R7(1tF,^0b wڟc]/"!m @ {<ٝ %xꩂ6u?v^dOYB3 "q# M喻p՝|[<¿`y 9 ze*F1U(D.B㪀+<*v)0B"| P&`qZLdK6k☙}u3ms2 oۊmGt!1pnmG7Fd b si,3(FF53thF)Q^ ts#9" oe( 3keNUkxбyA$(P9l)vwca]z|[ḱw[2ԡMvRVkP)%Yb@N)(c% >Rb]ǝ=O%bf4FVMToLXcfiN?M޿칗nZWPta s7/”6RCK:pGaHdZpix,?pKa,lP'S `}@xGc!֩'*SO .v֚:%& \py/})&"ؖ5rOjjjM.W?aj0ϩO7MOS$&먁>5aZ0mt58PtD @ !S(O%#.b0lKA {H^bKc욶_D=\ƣ,o^뉞fQ$Da< 1rU};z[Qgr}7 2DUTB /bbP'*H]wWQ"\B W}mHW7ܼG?z+ mس!BߢIC⧹*ϑ+. UqY  dPƛڑ`bA"6hDxxG8<7׆IFb툵G Gvl"*F>'SE]ou{4|/hʹCxM5{\B0ySsxo rH(ҵJJZDazT!jI]sAOpo%y(tfŔ4O X 8>4σ:_ EQPOYtg-DP>t`(l`kާ[x3K|P{zsL_6arZҦlmf[ cOl;dH S䥢u0fQ"*Ĭn_ sŘ< +Gcu \ٿxzzO13^o8baQ2۬w~oc;)7Scx*Sy(e!_|Pۛ a][;}=~:e9d-*oʈaɧ?97%Ap r\F(LuDpu0`F2Ӭڜ]->Պ f) IDAT=ǎ7%Amayh=E/?@L>jb2KBt5lG{`'VF~2stN w<ŵ]IS7#TC~QXE%Bz$*+MLyvGm6(8q.ioDj&"¡E:]j.^:Wh4"HaZ%a t}ᾌ1^oAFsV+")2"!h|!REJrT $HPNAp$*O "Zh'pĕ$耯$^xN@DuC B\;Q'A(DXkVx >xTH%/r^8;&]:ȿ{}ΟzN݅sg8}$oO=ȻUl<ŏYZE.>wEå4k}ixJ}{S`+ج`K¯*yP.x5lRSâjr 8y R)j߯5 K@` &k*Zօ鑊i2 Ѩ Ɉ|;Azh4:qڍ6J{M(gS `f0&K^1пj%;kg6winzٽ/, Vp:.XsM+$)6tBQ9?eU|{ہ+]lP gmy*KvIUdg[\߿^[9mV<6$˂-q/1[ FF`4I%[fdJq8#XcI|NC|%3kQN("),:q2A {#. \Jᚓ6Q30FD;ӜĬV':k.𜸝Gf9up,{ᑠY-5;I*"E qImbFO]q77˩W >f5ǘ=ɜri2'Vβ~]*b1CH=c4!Bm Qgf\qDy`mDhlF$G&7Qa+B8p : ,5PU`kD-$Im^뛢qIR4QF! "'Q-942:)khG"kH΢øOȢ&@%$X)BN'UItA״#A Ue*PU|K]9zraM-pv]qp WꊇN|p圴B3yQfسܱ/ 8 by`'2LHD$% 0mj"CBp0DFbS5[ew8N8vs@;c-˫+왝HpXY0Ma8Se[iO-_Rӆx.q ^ ȈLlŠX1.AYTӍf{ϠW\:ϱA q =mSw'}:1f2EsHj>.Vj񭩾2"DLC&:Fd]2 ENsmC(e[K0jH4;pgDp*.Ҿg3(qpũIe(zeIeEk`G:O(Y*F1j%c|Ǒn7[<'57Lmy.(A!=tPF_g_)z>⡠$sh "MTXƮx,P)#j)$\o"P>VMhk T0l.E-)@>!IEOoT.oϴ茆3➤/qJtYt$46Onx!2qR]@)"E@*Iux42Pzc[W[R{R1ZK("UW ]}Di4Ȩ)cZBjH)-!' Hb]3?*^/ WZ@$EMQuZ""^lzSЮ,&mCHikJ[Y0+̀ ПХ)HG݈IH7$G~&?NEXl3l GlsoiHx0ځ"*A+Zx „# ' R ӂf6bp G 1^$:҃O1 \@F$T^ᾒ ^/cOjxGu<3'F Mh$t}Sqc&^'MڮmZJy ݝaH}~;yd_/^w#=Zmsq3c_83?65یhoe;5? ;Zw]ApB;3-ŹjYiʌI=50I7#kb1#?"3N22vd{eyy~M7ʡ[R+GV,0,y`f9zvv`8001aI-$+X:sӛgxnKpaקު7<{I4Q\%!fކVlXf#~utrF&[s)?,^vLb_>cQդ^Jj:h^>cq*2=dcηzU}Cz VO4u}p5*8v ^c6m72zvtCd$6=,&{DA`RNRD}=Et.zZũXI[)":*aqZA[uZ$2UnJWɤ\k]B c٦)gǃXthoCz@XR+(ۆXD]dJ~< v#:rlhe&zM撀[ZOF @X mkPY4Y"l6N?acIf,#1YPh-lg4vtQl!L*6&- 7己Ev^;JeF[8̰mUX4&Ry;r(e UYW/,\>L881~;ǘk9& vH0԰x l3 PlbBk6㥨w-,8iK!:hAFާHO9WF/Eʋ q(Rb.~1DZk*Zk'f36wL1R(,ۧ'Hf JslX&*lUcjdo.3D_(e(*H XI7( bZ)C taq{o[[ `u#/P8ƀ!tCؾ)aBi >MBh!+MCptB Mk(Y ;!Mk*$µ#7RH0o EAƚLqLz#+ d#B(ȩ* *졻-B*Aݼ% thSVk'-QA&Fډ=:Ѡf\F{jTNc#ݨQO(MALBL&7Z(J,FBZDQJ}beI:qlNqY~GrsKĚb"'&lVm5(w v^# k6ޢhL! XS>bg-8~PeDPb.& 1XZ=@qO%{[d'7b`̹w)؏B%79PA*ݞrTM])c3ڬbIP)mTInrM[U{ysD-`g|2]~A6 )pڊM!vH(,I*A)9Eb$ ]bmk{!g|&zI.fmGdO =#A73H"fFlc6 Aly$5Tc~蓿 \؈qECGFڒ(Pך(@*ү 'tIT%=,c}/T+Hb"B0bv+~* hU^;JZd )2IJ2=Z+C2ut-#{PsM'AFjX(5!cTJXH)JciIIkmc10T*7/+u;G2lPNےHll $@X!4]˴R \cTUfOGmm~<ȅBl6]!ȉLޔF3W&Sh#'2O/_ü||y25~/g9.mprs[x^9nju?|V<'MңJg6Vǒȣu9)[o7/]Y\*݃8*Idi+,diJ4fĎ@T{FʵPa%A Љ(D_x +H;CF%PNU_$SyԸ;$Y؞q r>tzH[cxm3,cR|A`G>Ssr0xKXh[bHh%QFa b Ρ4"ШCLGXh$Hk@C$I-pl=}P=PRPe) IDATZ(x(-MW8ko[HvF LC/+El4V RFJ7bbж. !*o~i"p=4N7Q, A2(a)cNĉkIbjIs\LA4RӅ~DM kU'7(5Q/6lm"J#7vmj&#LFplh\{`C;X_ *iFD譛]oU" 21$b*E+ jICMd IB+Fg:Nѳ#vv H5OKMZ{1 b5Lq=a5z#i1M !&Ae ;olt~wp :Y߶ݵG2lOΑ.7n|)Anb#*l?R$ ^b*JVfʺ '$奘H:l&}⾢"va7('JrqB穯Нz{Xnpam*l8*1J a(jIBѧj8a"ݠDH?ıH[ tԡ뷍.V($t-$\pЎHM>ƨ`3Az |J" #@ߞ\+}Tq=" iɪ%A B`doj[ 0b8W bkn I,.F譔XXbgB``Kfz4~i|y8!/?{aWFxSu,_+qƳYi7 /pr4S^3h4=B,6|~_+?uΧK4+eOpkIs_>,#-oCq(#\<-$!8 JhGώ5 n!hzDw V$h@pۧaZ8Zck3WpΗ/G'_A :K4;p0Z7Q]x"RHR(aOF诅D)xz% `!fA(Q5@v.;x>hlMG!'Y!0m#d.&-@@TƐ* :cG 0 }a[0.sq/i7Me B!O 3|o|,]bkZ ҦHL{`c5EXPex[VӭJ"'3E 8|L 5ll"Lccf1dr0BEF86h ͹5_W[f}Z$9Mc-b2Il̀($Ew;I8I[Ջĵ U:oVays\s91K1Znʉ yRb51kdh qgfDMС\لEp!4qP݁\d[Dlp\7D㚫g4u2KooȎ䅶E* h4<^3"6.ь HuO-Z_p/YLhBJvřl(H%bVl=!Dy4Uw\`'avp˦@WN3?ʮ-oe1w9;: ˍŅ1FZ[Љ;0%'EvCN]!*ލ4 cpoQD,Km"j C-Dl%˝\ EՄVtrf2&U~*Ib(av˦mS/Nq&ct7 #z}ѥ~[(Н+0MaYVJ 26RK^&)c撂xͦT/by=M['niڧ{\۰ -B>?*U^~(2do3q6R"ZHC`)IV+:*d\hwJcez:EE*_\jIw۸vOPBۂH#,{Fݻ,%-TDLѥY+"KyC؉ N4B]larb !. aKALBZ %ЩZ[x !lK2u-ܥe9QHIg" |s+; rM^@̙>XJ{'QNcAƕRߏ#qJ4%,2v&?Gkw^~:l0ȅL-1˹rpp?lp0[Џw탙QKᅯA269 7p^ VJ?  j,%  `, pߺ~7%KHoCa ~a L94Erval+pEw2؄H8w`W`)|&.6$QM:u$m s-IbGﺱGduyze SFl~Va4Hw[ٕjc 'ĉj7,o [en6ž51 nxV!i9\ڡzObKhȯcx|#-R8ыz8G,qYr~ >aF>IG&鸈7I'"T$87mwmkH[u/G˼V[ǥ- MYؾd< y$]MGkj: W&sbdf ݻBxm%DkG:X0+XhH!hǜ?Ji2N #]iJYR[yRO}lGkd-MIcvPz;ݢ XcAzNbmMz(8=yG2T<qpr;dIȎ.;wC{O TTʡ3<3Ľ.NZoyiˡltJ]o,B-p\Rd-Iw0X_'j=='I<IifCApb;M\uCCPX.8&X6JD. XJiYŒ6)WZibe""!,6SOZae^􎽤S 66=ͩgl0³z78zYʲ D??}O|{1 g: l3.d'YZ(c=)_ } ?cvҤl{.a?? "u5<XL,lÍZ ^j `@o MtKp!?jǿ_}<6^Ze_G? Am1WQGml:V~>9n0rm|ecg4ٻزi^bA¥ G\kRuý=}s KH2+yrݛ딋]2Ķe^* r{RQPJ0^HPȁmHFgb`NCp3}˰",;Ǯ-|&˯<~QN3x8lXX5o$z$fzci', o!S)X9 i2k>WK.S?-pd:`2H zg,:r^35@$:9ı2tL>/i&iMB%mTPBQWApWzNPNSv;_R(֨]I#]^xF#edJ]ow.aXbb)dx Ej ?@B7(L+,7M4n^1Crz|ȝ_{[%1ZXe"jRi4b$bZhKXc/mDL%[ @cCCh,2U*2mf -AZrv+tghፓ]Lm݂$bh6o44;W6bisB(2/>\al`qW?;͵l`\ܱK fS# _sM230#&W $BL*&j=;Ͷ俤y,r+ WuBǃ/۲&G(AgaN@7Kͤ暹bF*ptې5#6>t pHaa?3Ck27*~7%vx0 \ڄeDhs?҅ճpU~x,{) Ѩ>1طcB‚Ngm[atnb||*;W>d=UZ]j|WV%C˒؜H֢RVrq{ _djCdOVZ9:Ǚu:̴C{6Ws'H\!\+=Xq14QB&="%QsZ1;gؿl.rpl-~j7^S{CN(O}I|uLk|@O?W=Qުس'&R(am;"4*2"NƢ5?ũ%{pJzH/vr9_z w}3EgCZpxeøݢY[s՞ '-ْ;@T4*_->׾gOg(:L{9~QVS)~H#1/1Un .lWK3[_)gT_} Y5wwxu&#\_g[ԕ*_6/L`X4@ @H4Va,`i) !IC|?Cr]0Y(vl7A{ O5ÏZ`O|^2CTk*<8\}To/@:d RkppAw|4vτJp<@ Yp 0а^ {OX8 Uؿ f puX-C}󻿶OӠU;xR+$]_a%{vJQ}@4=0''|nIrUn@v*^\$Fo <ï in$xV j78tiE~&C]pNG츱Ofm},KP^BBJq}7z` Msn[z2LEX{7}F۰wҥ19Xltl/ д!#IA} ȖBp; IDATE1x D@d9&w]`.CڡR\}CX^N+?+d3=?Mq=" Aa_/3?ԉ3[%_ #V?L_LWH8,;0zͼBoPgrnq_O0aErisZĖiR=*zcf,cQ ԕp?pMLZb[eF9{g^G8x"l291g7;hϓ"Hp0~QSrlfC>{n4B_HxJ#-FE  ,B7?+;B ?=kলcmG|W/ ៝̑:jzHƱhd6"^+&"0Kkiɸ69QvPْ_]IrV>'ŗ^8k *p%ʼn%r.7Њ$NEqえ-fB}24^~OM:74=2΍R\>9u겨reD2rv#y3:h*=9pAˇ1X߀oAۆ 6SH F rA"z+h~ 큓V 'ÃYڗ> w)M~VY*QpaVؘBЃg̸&vmTI*8фy,U8:\w?/,pOR]?HPitdI˔xL^.%f]]Ƅb|%L2!kG:^=RADug2|é$z >(0tҡjDf${|ZW=:Tߨe9bD@͉?qM-7mײ<@]cnrgG=NfDvas࣒;FdD_NƳc;j(Ecf{#n ي|)y$ jZ1ٵ4XxC7!8'憡['K-v2M<H%STKXgIFa^6mT*D-ic}Z&Lֶ5~㕳-9N2æQy /d2sʞ],v9),^fh_Cd'+I*ɦjx"Rȁp#\iXݘ-)QRvZ ЇXW`EhShJ}QL` B(kއ(bɧN\ k8%D}dM{}.$ш"K1Υ.5Em.ؑMb*dvW\/IvGS[rsxy)&tj®$y3Gl:(Yom0:G(pm#mތz!`Ɨdxq {E}M 9D6..<͙%y.l!s|JAޙ䖫۷UdGbDTUϑkmM^X/ɞxNS!:A$E*8PF;c1rO<MZLw2b>uyyO]F66QhrkJXtQG㦴EqXSYxugV#o-;t]S a Vr#?<#<<wg~~!}L6#U̿Q K?B*zO?8J OaD$7~=c&'u;yN]RܨB4 !ЛB8rUX5{ƍJ{4A|cCry+\ЏP; !JsZAuEcÖ`}8XXM0ֈ F<(M}XrޢLp8pOfb7A:ZuIcL N(pk?dkūԣai$d&ҥQ&e-=8\P;&yȎ: b{K?y\Wy9ګz_VkmKml1K 6:!@$N$IN d!؎ eɶeɖ,k_z߫s~TyyF$駫oݺUoխ:}'gq6zx,оX{Ŗ] UN$:[*bRr88ͦx(9YZ^ᏧTHVRs]5ڏK G)7^IԥZ)fl"[vv^L}xK[S01ޡyP?l1|4EE eMJ /H$)JJ}! eטt=6MtT(`E XipMXu$wsymg%2GkYdͰFкUY'7#Μw=_ƍdL,])Z# V͓8XAHr>GQ%KU,MlTm"S1&f1AoG7L%!kBbYTyqQ` '`poOj-X\eN{Ē R?n07!hZ:3{edpF+<<%nf}tk'5Ǟ0szcOq|Eo ަl;F2HcͧP6CھaabqRགwx(t~zIVQN kpi|ùIF.le%4]ȚŪeL|_coA})y]O Uლ~E=pg! 0 he!H|̌<]OZ$oaknzI'~k;%9Csf})_fCr!{%S~׼cގ q[hnèsum#,K-tD)͆צx>{ w5\vK#ћ||.cRx'aqk.BM&]"Ra1`źXa e%^)L&&X7@Ʋ)%}{ϧ#:nI𣚘[YpGQJx`ud L*g0v$V X-7qM]+.1 OD}C&0LŠOApͰlkBD.:ECɁ&)Q oQGP"D$ R@8_-8:gs&U.Hp|EJ#*Ñ.A0:|XCfH&FKA4a[^aBm T3M< $=@Epi@kӑd%'4eNLupA{4;XG{WZ<^𩵥8=j'ݭv3Qoadv&{_k}ZN?Ȣ4£O56ra}m4q,ڂ-{z+ZkmyMSMx}:RP0cz8O 26H w}Y:gelx$K;cZAd$+jpbEms,p2SRYz%ƞs N_\@ Ǟ_ʦ)zn^\to$V\>|Mi.T~ʶ2n^;CP8$n~v#tEmN#li:?-~e l8*iL5+sulWtUOeE"5[xʍQVHڰ;̞/"%Hw43a,OyV?{-t<ϱ^G蘩p8F6M<'5q!h6A~ { i'$ i42h؍R #}sIE`j9F,tu|Vn$w#"G $oGKrKUJq57_BjEHEWLSa;D")Xme֦%PDC(޶CoV tllli"W M]e]y(M2O6X>ZD,nQnfQً*nUcXKQ)&~t7y=UbM#7Gmlc::s919A%ߙ`g{tUiu~~B][e󆓜x0˩PslunZYds"ʙ>| 2eDU9Xte9^+OZXw.:Yue\vщ:6mfvqvV&[4[.ގu2; o#'KM~";R`?X #5N'|6Xi73\E,|-F9QFAKo?wpq/n$ީMj361Հ)smDٔE&-ƨ.Th RR꟣il3^2e+XVxNj-{6&"(c<}AejJOZވOZ/wuQ1Th&XꩃDpXcet VbD:޶CZ9D}c[C=(JVxWnK+A*`D!Vt٬OS .2ZeS]E==\CvIFhlu]nS r%*M\@SE[1]p81CGOO]pT$ 0.v}TĬ߁t=ϗWdD-A.Vxbs6qKI);+X+YT߳hK Z#dCŪWY$+I$%RJ$FW+1[/5le;$lTҺQ'S F>̎Εl(A2a:. ]ǖtKq1\RPb1IǐkV '1tE5M=xV@^*5KU &h21-BX%Q ʶ{ GF8a||4m2 w:+9|(D45w9|TS1` 9<= Ύ9Vd@.fR¨ Rs (V)EQ G *Ha:"zyl8:`'w'l~UW7EX2zz&,8™ 3T{L':9? ,ۙ3uxYxg5Xf>?~M PsxldƚaxGȣ?Y:M|!ͬ3|buTzL=ˉ/<EʅlQ:fP|"D$7\]wʥxnqi(ȶm6&ӪjMZD0T%H:ÁZf ?nC^q!"* Z $jJm$4 $( `@ P01Qn`B @؍ݖY:!PX4 arZH )0R,ݽAcD i#4:_hB! y&ݜf05{ Xy=xI7SXEe‚{V!Gaf mveCl^K6wޮ6Udk֡Xb|r7?Htf/ŦeERvfc gҵ,)2:&S9T;_ۋ(]2O9B:3ytR !:C$8Cw֥uBe&[>=ar!=Eb1Lz)y|aWYA">8Bu `OƁڌMKaLKu, ^u8~qv{o&hU8UkI~x]oі,18тYrV43VBp ۾@gcT3ooyk̦Z 1IFzoDLq$]BO1NqpYG+Oc[$fy@28"̪4Ϩ9DǸddj F5;gHDITss;<\$㽤z_XVe 0K9x4g<,g,*5g$V4U`#>ڒ'JMk1}E[8O>FSi\Y+AZy3HEO] y0(pui\ 32T+jQt&č!be$iAےD4~y|C_@f`[~?| |(հO2#a.$,NgPDQⷊ?c!$DQ<~#<."h_S1^gf[\mcC4jEwb 8{;m~gⴁۇB?^qqw/ps\翨K. +^RjXyٯ e޿XR,Ø_Vx]!~z&YSBċ/. ^zg~,o>fieZ^v##-:Oߞl羽 Ycߐ_;G"d1ŏi]Giiy=^ů~'-ȻHw/kְאy;lcvsS_7%|vNnc|]]yȎ y|!"9;}35ic]izn|ޅ!J}ծ؟g|;`w/O}p$Sn[Mʴ@iLIU6MQ@ĩh+jkMǸhRQT]OP47,G$$o|PZ!s FU8D[i#5% ܺI21]8Hb?QBģS<ϲ2ݺg֗bj&}ȓٱU lewwpŽrU,o8D43כ`6|HxGs 65̸/ZNjԼ}ΒQ*Y U A62b#qbdڻi/r8()c!NPLNGJ4BqNk$u#>b!H=zYMov,rOd-jr?kHufG*"(<m8`|X4Fr $r8_:޷FuԐ:vQ .bCDӘ%0ˢS7)s|ŏO+v}X EG"?9rUD+ݝS,QR @x1$[ìN7nB^q19YYny"rfr-mv9l cxlP]2)G`7vGR|Mn|l*zFԏJnsy E~E_`t\ N-Z0sLчwCAÐthm]CV=]$|[E~/ZPm%|㫤3O~WFpUaN[8\sn6ԛӬomd'O=JN}c'7>ɧO;p걯pVR^W%#iʿc6G@e;_> wQ#_A 2Z {5z.3ګ8j@=-F{wc[ϐlR~Xw8j8?AR| L7' pzбR‰ #!٦[8ԁgi{b9 ދx,c]G+? n9 ?8)]¤ S*O/pf1M=Z*3С2Lc!Qژ"wdX5vNWWչ1౒ox˛=YK3Zq)2=lsY;Wzd >2wDҜҽ82E{ rY֤[ߴJqCrt5i8t)Xn'(Yq2iV9yw.M4cg" &,ku5N.wvO /{G~tEVv1 F@!DzhHl4FЃ[^L ),|݇#chsR[81H-81J&̭F6* aPVX8[,lw];xjC`X˯1(F`bH[J~\* ?.>K 5>  _|؎}㱍|Gx?o`l Q&> \3,+x‡y ̧_|i,ІG|I}a09/ =qw+o#2R^æ5u~;8O\xlk>(['m Ӕ~^F%З`.e_81ŖQݚ'>#!4Lݥ9-wwa *;nQwAy#g5R%; i&T,H%~||(ꓤ՘4}q8@v,ή>,ܱWt+leo .'~Er,;NO-DJ]_d;/ =5OvzY<͆c|"MǷ~Z_rNf]dmqc$5<$z$2s 15*2QݴxZKqz#s<ے)\"ϛ}7 6U:e.>p,զ(ԺSb"Li(+{(=MI:%fNTko'97ʛVq˞ ~e<<| W"(E{j։4s<4 D$0㉘ Any霌G'"A|%AX!H(aO6/L64`l%BH$~cXJ\Q6u 5 (/mE`h Dh`UWFPŭW)-RR&&R<て+!AJHu FhPw 1(bsAD, FTj 6(PjtGU%D<)d\!mtHHݖŽG)1 RU41.P/+ _uWwA*2ˮ?vM K˘τ====۪[G- >Bw2[w]/w BP( Bs"L2BP( B9&P( BP P( BP(tNIF( BP(:$# BP( Sa BP( Ω0BP( BTdBP( Bs*L2BP( B9eʟv=== BWdg~6 /^Qq؉v]qɕg؞؞؞؞^m(%C? c{ c{ c{ c P( BP(tNIF( BP(:$# BP( Sa BP( Ω0BP( BTdBP( Bs*L2BP( B9&P( BP P( BP(tNIF( BP(:W`nt )m,ۦ9*Iߣ;,=B=J&NcO4x-k6+Q XPҾ@  Հz5B,Rp-RMT++ B߃ZܨDxؘ(p$ZH#Q`ML{DM2Œ>cKZ"-{ѱ*,֚J jv,|FJ16)KJaF\4$c-,8w}؏ n;-q$c$ $VS5hZs5DZPAz6aPE\&6hېH"(C67Ǻ72տg{|c?Ek%XKHA-XB1%$B)i эc[ߠQ( FADRh82@FE4"^@'ba|EPӚc)A X8`k$I$  SH&b K"i4-,, ~{Θ}qfKx56tѐS SI+JZ!j6E+y1Cs;{΢~#}S(`:b, QZb,6c '7&D?,Ȳ:s9kzn@EJh"A):,l:h/v0l:ZE )aC ZA "`@4詺>7 /yuVNd$:|aK )#*agX73m29UpV͔lo3r7 ?;`F'(e  'eFfIq/QPg~n:P5(k Lr=or k@G1GBQaWO0?6+|LD:'yOe4 gĕ> YA MV2h@fFYF !H5^;,;D:|˜2 S!4Γ0rLH  T,tAi qbs{fM$ԡb8Sr%fR MI#)SLQ<(7DSLM* ф\1Q a5\zhl' a2… cb3񆉔$ bH)3cgY'1\nA"H`e+lZ40f ΃5]9Df#"Zhɮ¢"2n+8Ĵc-`/JVWµ*8СIKVjod8Z4*!l6ǩ0`Vw{ܜ]hsN2݂kqZcmPm>9ՈNaX@ZYKD f7x2$fJ.L'lW6 A%4aAi:)P_A n6D &nY3n!c-h޳> k8*|MT]̹z}µ_ob^$1UhjpH`|Mnsm?=bqk;Jlh H$mNuVkc*t,Rbo_4%@<[uMFqs!UR6v\JX&2h~#6$%O聥.DzXTx+xs0DJ< h@{R2us3a !O3%5T;G x_^L!0 쀈9qFԑɨw 1 y2bl-WgW- ΓŰΡd jZx IDAT"Fc:fiarB3×mC*+='0Cy Es5rB(jB%dò`1G` )\3̬L\ 1gL #%ljZB%=h.ʲc zsGHB, aPHOLpK6qZuP[XDgsÃ9Uu=qG^51kmѺ$ّ|y'w;H ^98$EpthICȝ:]$Du+$# 8sl S O {yr Qy#p Â3PgWPW s%pD AL}a;큹 %"gxSHON3 u5!$ Fֲ  ].#7 iOxCB0pzAZlVÙaK<.=w%i݇P#a<:+CfΗ3J8Qu\gHD* g % be ,V8wZOe'FB0=MX|&gw+j)&EXmHVڴ Mq8j8 vA{fQѤ!1v@2L*8'mT,zϞw4!y(UhuAWThAj.t jH^#Ĕɬ< lIJ=jA3d> hM0X!eAN3N,rq&lme;3ñsCgup8Vrqo*N.lgn^8^/ChNaupu~o 35WpCC.{.V6D(Q,q.'% SHԵG Y)v8/Q[UXo<ތq \g̎ɡSx B#I, STQË%^9+$Q+u]7tٕ]R)9e*UょԹW-æa8Xfk W/UvJn 2SXP3s8װެb-v2'y8}|*Vqn# "x# }ؾ(k 6ZQtd+U4"}WJZ̳:XC(dp*eU))s8 akJHn QSX!K` *hHKF_X* E|Bz@u-YLG즿_gAa~n3 b[.h jDw\("^=,xM1%,)sP9,([8߃A +$sfx#Xu$  =Lh *2\@sFpWTBȊ%$X({uZS2whQS9pÇKs Tj*xV-QQȭ^RM.P]6caOH6G]k} ΄"*@_^9w 1c9 ;R$$pD|Ŭi?3"wR֝YQ8'K5e)q"Ur oAhѲv{ȍЋJUJ4oJ!H!^$2GES @C,nDV Brվs۷M2LG=*%|+q:Ն[CS^|׍|LvoIҚ[↗?8Bq%0s?C5xko[ڝ䍏rOѱg8oQػw~?!-X56@~o}һhCX g>yÆUƥsg&L^tUǠs̽>SRE*b 󨤘9\!xߜpj8bLv7/ 4\ ϴsW&0olBu6:[[_Ϯ\֍9.?ӌIV='?7ѯ| K)ڽc}dU2=($jуrC#HEW<7M A+ H<]̺xExE gHGFAmQV'=VK 0Cौe#?IM4.ҵp8uģTFv[U ꚦnO5:έ/niVgM모>H0^{tﺽ٨Gwct$̹͖Q\}D]nj6c˸z-QR)2oL4kVYUDqB%iV2#L qN}6%9U*I }0ܰQzEO&z+GWGpK gd,Up; DlQ%h,KőWKk;KbGL{Pgl UDȖr!Ljrɨe.%b+%1A4>P!]&k&YqQ2S;}`I wM$㻢 ȁaV9HJQ(Bi1zGU+-Z*f+v/Ff'׍/1V4:*ut+}‰{n`ޜ3KľWk%G!a~bwR U@9v>t~BW0;B!=p? &9"P]J%.ei3 ,bwAה߻1:""VβB\ߧ*KF{aZZگqoٔjomQjCUpQpb<+ΘMxE#v{ʍqulV$;&o|y.Ynz<Cnܤ ss8:o\$'j>VbY9vH+;I%HZo%.M3+Q|Ϫ$~ FUH<"ʢSmG^=hwT }9Oģ9KxȅLXRG-RUTXLGArHpp,,X,Ҕ" ATTuyfVLqHY+*mYVA5vy9::R9(<[~,͆ ~-ULq3n MlT2A7 Y( ;1 fE2d-|HZ"ٔX#5Y!E1vS#tawC\AwR, -C\Y򜻴҄H΢ET)n)|,|I4PIVy9_z7|Tςh&$'h3H_"˕3OSiYQ3󽽧ErD,`430C`$+V%ם-d>[r9ZuGZxHF-hz8VDQ2ؕp.(U\ՕCc}p2=}ҁ((hjeGhl,T1 E/߳n抅͊Ӓ$Pxe˹$GΕ~VoGyg屏 ˙s=/&;{;ryzm}_H< -.E3oL&U[9zl9~=F{[.el@p"匴ϖ [[;}$j uXF׎W.>g/1y  } 9NCI->1vck֔=%lܘf~r{}?V_%'opq<7ب 6*,NHX-63Af /q/#?0}=jO0<>ϟbыLdjCRT$H1o' k`} 'ی^gާ9vv͑-2'6i_:v-؜(Wf yܼdn1ef̽prc;gܚy_ئ\!^zrpQ|=q}hi% GqJl%Zs HJOijLȩR;Pq%9=AK(3%2+a CcGW=ŢGAGDžVa.Ƅb)pRI39)%lf+nC}]<MĨ>"R1#Yo6=UFm:Xy†e\Bz_߮ﺬtg"2<+cl?YIwsqʸ( $V#oۈϘzء'+jd|F-) :u+%B-K!{Gv*;)= Y*ZE?qPܱyPnv v|DdDD[Σ"tbT˸2b#e!NzT^i. r Q|EȖI8Rx$JJ #dR5P2VlB}CbnPy.5A J":#vJ#3\u̬!QВb{G g/jJߪ >9ŇHK7-m>Bh}+5`uK_lOH'^ ~ s,?<'k|ّ8zӷ$,҉Zw:$RYS]OFq9"`zKw-w31Xҏ,T[:`B)"%y;,%0Ϸ-ߏ8uxվsڷM2)م^d`2+NP ZUNt-r7O;N~co:O̹%~ku^ܠM>!p7lkǼ1^{k43oƌ޾P1V>~TV!@#|p{[{鏰t ~xST3sIvVe;ȯ 8)vfuP6g5ڧko`.}cʭi$4[ZqDCK3Fd4p53c˴Y45tX X}Mx6cN88e1Mjo^6a<[zؖTSmFKb%>@pTb:"}ѫ[;}եjGJK (nk[iNxu^m}nu 564ujh7GOќW' 퇹tӛ~dmB<]|o\/~_@GF\j5?b8Wi*ϵou\nsr<LeBx^qδ팸蘷$\[T*iA]Bty:՗9Nƌql Gh8{|_<eNy~C=p߻yI5XZjynWիV9C?ʇ~1+_`cv1'H Rƀ"{7:sfhkFS>_q*&n$?N[d~ԇ٧ߎWazYƧghßBg9{ }Awf^xW8VnnsFa.ck{l*+z'_=G۾D78?8lRgn|܈g&V}}=Ց:^P;R$H/NQY[A <@ϒ:n)8ڱ W?MC} {-GYlugy.k̸G]c:J|i{7`J h0$.s~bWCRUkR2W6 uLJ8Xs :2l`':,&yQဃSjʬE[1LطH&qYȀ_g-;VqLܔJ@/vSpDr q^asQ#nNkPH u; 48@\)ԑ.ӶX)5*R9ώ#bCR-"19 AY[]+Rc9u<(;Ge!PY"&# ga R,S>. [wG%<&eRu(epB e4Wr%I`T8ź_Ag-,™ػ78X **< x_XfowKQ7׫J,%r哔1ʾ %HVjȉ>WerNzOG5زm-ΔKႷ[;}v)(rW3.lm^ | F`o>=TO~~I=%o|Wt&7!|:Cn285+@3uμ*l~Ý1[[zFo.EFÆzc6:Lu .ٺ n2>dojFh>aM fmT]]v_ro)}`m}Γ`ª]&`ԃj**D IDATaұ3?$vS.p `9aA7 +Dj:fj"ϴ?֪Q3'~zCyV3Cw=nsCϳk NڂYhs} ~@?yWHc f\X;gW~_}?{ >?;/Wx0_T~J:/tlL=?>nۿ5ΝeC7?CM"C<XtP].nWdꡒ@cB%f|qe7[<~7n!=xZ_nN aws o;m! ՗[g=zv )x˄ ^lrl>s8_K{0%OZ;7q"yWpdLWvqNUŌ&<>ػu.]w|.'t{u8sb/Ie/z%៯Y9V*7}gtin9yNf# `͎1cic8o *d E'\{3ֹ7I_ ƀUn4S_]#L}CCm>{1s쾼@$%OoRQ6~[BjEQMd!ȉܰmsڭ"4Ά gp,L3!8b V \lI.bHf]3 9k0!^#U)?0|סBGȊC`T*M8ps&3{svۻ{.떼QqxyvVaJ=va?jK5Z) <5m)QyC/X1*F.MÚjAX0BF0ϐFH*Mdtg( *wo`:k:PeK3CEZy7c՝9PWfC >9r>j.d+9bŢj.—Hɯ0uxPSRJ*90)=*ede}u~skw۰IǢ3y[7g՗J} O).IW/aAKH(B2T++F5` qz{c4ek8neiTς+7e#"zR}B,+g 䭄h`}ӈ #b5jom 攠R\}e-^Fҗ`3S\?b6YvjH\~@Ƕ_曋aFuk/~k_>asc'CVDva7$v૫یdƄJcH\9H9Twn>^xJ.3V!Cd%K2f ]rpk_Wq!k澷=M_gXll2dŜ)oXٝv̆hL5'qleq2ed]l,҄Hq=c[۲b3Ct5VcAwo-.XnQI˦q3U8c/_d`f_g o/W3\=E y/$AM|=V=6\+;J ?tʿ{ݗo"ܤ:yy'<3A~|80QS.9ad {*3I)d--bU&'VrXP7| N]ڂ>xVǓWy|@tX_[c{۸٫$;M =cp&F~y^Ip2>u<ٕHzhJviWc 7IXZ0~5…qn_bfԃ-έ +7+ ?<4̏f9~/*O3+eHyAl<.vuNp/G)ֽsZ}Q_cqy s/Dۼt8\SQ9S vp_zkVq̙rbxP]lǗɳήq|ùw+@>2[mAr6ωŐ.`.P.f1{D=(SHBdT"%G@XlujaҬhF!j\"ZAő!lQߠʉ^q5)Q!-[UBE d\T)_8/է4g$JZ])bB&PuTIZӟ}1#QB Q%9Opg]`Ɋ"n*)/\t*'$^XpdxVpu³Vlf=臨#͙\&&2h_cD~Wʍ]V SZ$*bAjӌhIeT|0!K(UEGaU3?{Nޯ}z3`lHI"HL1%xGmq!^b%MAUwOʠsⰆUFy8g<=c')FlU""6"u)SC$Ԫ58 *(-y ]'<{k, Ec@<}V}Dq >Y3zV63{˳\zhzG.ŔQߘm.^eEo_S'9m|esH]06'ф"D S<1j2;dY/b\f㉢.+t2d=sOxFYl_ѝ6`ʹjP'LA!QoGwY߼BDM8{ai>j>ȾZi.vqgM}lVbz^f>v^QD=Tie? ,eˌ.eR~|/|=Բ>o;G@Qeӭm-3[18@y; ^޽S ɏ{f=7'h5S>ÏR7I^-nбKQwr8N=o.IImmׇEe&x$L(ES%A<ռ]L~R`B}OE$eB<5ac0DYlnt یFa 3f BC&+iT+RX$MS``dFB`\/Sd: Q1" :*aʴ&hԑIT5F|Ezu֕,U]|"^B@ -HԨPN"lnKP K[OG@3lx;HIOf3NcM'N򓤧 cr/&g*XW2җ@Jɋ`W9&a%C.b߾=?ΙmCZl=h Hx.\;Lu7z +GV"]`kF D01258 G1(w;b2-oR>Sq vwpFsx4:QvkEX( ΅( CD\BGBa  AI Bc=6 A!07UoPwò0$k;M.DHXT'\x1#GC]ꙷWNxbڷ ֦!X{`z]ReΜ+c7**/k.ww-9էe?vp3"к+G/indklΰ:g`ZDչ2YH2TI r=\<~k]v' )Os!n0~bll R;'z3ǟ"ˉWM'+Qs s6#6*0 Zp@1hVxH|t!{MSeopN!\7X°&<{|({8ċ~tzlŋ|}oָo4dm bly(<Ò^%44F{ҿ XZ))ڗzԮ ɛJB8E`y6RA|K3fO!:Jrc<%"`x"p._`䲐(E?٩tmMd oz]tGv3@jHM2;Dsvyew$b$|ZgH,}.>8Cx}h~ZXZFzӾ7eDrL`O,BrVӊ3d5@׷ C0[uƕ>nn9عquozIzh2Wa[˥$g%5,^x]GgVvf ߝZ|l_b" M[1d?f5ĉ_w)F4x ʀeN (p(ˑP?l(/ueALpcJٞw8UZ.䕄-4jl1XeXKtV2|h,%;ZSB ertcHV(hU`@8m5i5$?fv R;>ݏb~c^i.^8$ICz#XbQvs/,8^dJHCQD.T 2]N ̭L W6RHВ=3-SXӾ yᩗq>c7ZKar5h ˠ"'cC*;1rO "w)fLCS 1']oR}oJi+OKw3ehRiQTQ3uEyA|S\ Ď%C%T/Ѭ.2ӂ+#vND29ͱCO)^.=/lG9;M!z+ZߠsaX ^bA.]_]M? ͅ$Fi3q E( j[pSe@ohP3' ")p\ro  PaUC5 Ba G^䘢ZqPo1cNǾCD+&ĘWewK|fXfup?*,r?y [}S}Ⴧ:,3UϨWeHK%l cqv:8Cf i5 wQl/[-y6ybפ5JtB⣀M:+TiWы~Njn\3+Tc'csjk[\Qxʭxbo˺U7fo}yQF,#|??63fW:_{aO:2~tDixpّ#I bPpvp1_.1?',&IE#n ;x^I=i(iɌ:Ip8Q5;/P X_nМ(9$ʩ Qo'gD c, /PY1ӹ͍W̸. $AABT*-"A#Df[mҡM^B4'p(cY>%!ZeShYbb7,oJ`%{/} _Ex)/? ݄+O3e}"}"# qJ(Rr|y$=N@üga^ٗr=x[΁e)@FJs{пP5DK^Wyl¾Yv]?8}7aB[L@BrD+g٦7Z%,+# !l"gGO]d<8We@̕53yN0VTrj/)a0XDNSi=ҝZ z( "[qCКBàC.WDMΰGen~&CgKbu cw68{k`cs'[|ÿȑM2EdTi UQaq"R{Ba9b0 ;p<̷#M-J9_gD(ĒHKܓ2aQ})pǥd a*<`*d%WT#y.>κ3=bG {pl}|O{6$M7ٲ{O?5!P%IU^N7f&[=ץ3pJbHpoz.Q׎d k"0z!8?BQQ^̸W![FZϸFe*Ln. *l"ğ"O08=J]aPk~O {0`tTզ'8י'vm;n iH{w qۿ v.~ye5ʨ$WnpY,Xϰ跟'{eDon"0a9DlщpM%l68]cUiʃs W 9 &PLz 5%jٿR@N|sr"/oыK H7q}++zؔi IDATQY A4TZKB*IJ*U "1RbrqVP`Eyp.Ǚ K6k,.7bm 8E2E\" #UC0W; bLR|\y-)'|;-bNb:d)܉^gZY((w3N#0A7jɖ04009R +z~0n2(Gy,Ni:b~Cկɋlw*EZ?#yha7w< gZ*SB ofZUmy\tO@ePBIW!2BΟ!adi6Qx'r, hL@և!]̹˯-n37?Kf3`Ҕ5V.^ŵvwXXgxȾ^6/_ M \SGR%GZ#@ٿgw{?m Q0(!e@T "+EppVmbr:rJ'(Cq-LO \}N0fÜ'y7+=6~;c^ְ;yS <[*㨂XI/x XC!U@'PcAQlxTfvŃCA|`v?}| u o|wH1M]p6clUMIvNl>uںhszVpx^ػN0w&1ء +IƉp,p}# {Zi n#Hs mafR`aKIR/Y6/<;E%X7h$MӍܠjvD8f1J'|sgd | 9C_R>pٸʃlvՃL7( #C\e.R;)~E)9Cl3vאI8˳ O9KT.RG?Z9<91|OQ죔,>—we-([GM_-KUPb"`)7rWdXP'4AK[79FzɀhT#fv**+3q@i0D^ R:#4ZH\)%yAdg ;/6ǘ!pI'v9E>"/RQg,֌q&UIXOMhcl^ .㝅[@)sBN%9Γ9.=ޕ7Q6ZQ֒> %41󎺒p$`E1 q(_*£91iBy|~[@sC*ZSMˉxCCX8̥!囜x| m91`#wGu^Ѹéӧy굯RhwDЍ.A(Ir:;!ɛUҗdxA##5EPKH%-+$yxIrZ'<' e3(ˉdxBˉeTcȷ()PBߤ,OUxAl3:f a]Lgt;6 _&XGV0)QR{ 1GHap"2(ʹy*#x ¡"J|(` ˆaOnhRf# Qkع).8^~Dc&BeZ&GEf7e3ʇx܀ w9MjewkΡ(avjw,|(Bp%Q[9$-[rU(c`2t9!(bSr̂[4<-Gv,C~fK- ^LV@Qv7M99b5\ER1Y{d gwms#M[lz01ȷ60 #tgDk K33TvO#;=\H5ST6̳,UJ%9\P|"I*_[fɢ.qx,Zi=$=$!D>{j)Yprqw\bIwOկG:>~W-XF xiY:OWq}+6! ?vٰZ80xdkYYn=sV=`` OD|;~-V* SSEUJ"e]<8)lLpA)1H^5N6BQ{;ޢR_NfnnҿKqZG xNBFFPd836HLFJ@Rњ/Pa5TPC:AXNCdRF{ai^7o"CjC ÂVe~~_::wDETላOm/hd oRy\r v:,7V@ 6%[L% /Kvhz^Fb 4WI*vTsd BEYctM4>'M Q6I ak =cxÏQ,ay,ȧ-6C+;]^%uD3esp19pm}80ڂ3Ndc݋0o_o?n_E")\dbGPAkYr i,dyFrPi *mIjɃw,|)]#!b TBsi3Mk {1cT>ѣ=}Ati/[)"$0Y 9p= ;G6Xg՝erC|T'GZY6ͣ^]o#ÂRGHdT%D]X1]'SOg{g6ټM@\g.k1Buw}jyxYd<$ j;3qt&`gJN%(h5C0!c̰E2Ae8|wA/L)*ܴk 8m6*Ѕ@BڷӥޮӥEnV?`qP ׷ .-0%L`Q\dcrtBtI %:M$R Gx.}sx+9%JZ4 )L&>xKe a?e~/cvp=17+#$rgY50Pm`mHL1hN&a1C<'1^0LTUr侔/9JJ W mHX.V$UIe#O<"oЋGl+W/g =o(ÿ'=w6m97>pNG `CM9vd;i/opVȾS*.s]7 ۞8LEhX],k7S\ 0nӽA F8Glw0mEJmA0۠>5'L/VxdWp3bMB,:7 ÂgM$:3$qړ+AEFuγ/\^*BWh7=z5ֶS&!!v1%,e ߻?d7<}/ ߤϳ,$Wf$UgnPHG9MPBR-$r4>@ a0C3x?aH#l;H "GY4{ -9k%…@4X%Hg+-mZäZ\qB"@EN lDS!1_~+z_7nD T-u=AѺAX/WSoxP|r!yCIvᱻ?l@VW{>W}qlC|#b~i0j2>;=[/,4̅K_\co])>r <$ꂵ gh_^:jnVb#D g =̓_| 53Yny3{ۉ5sa'km=Z7)W>c) e+iB+(y֮픂tX1\D@G%U@y- +U,l8~vg驽G+a#C 1Md#"F QDU_J8@&*cb \~OpW3}V*%`"&XCjITD\4Ph-YQ#?VxEHJuk^GwD!dA@neUI, Eś(W C*3]X<|WIG2:7^gPgϝciSQ ts:F$MxϿZ{J6W|U3Ϯ6;_Ȯ٧c#})rOȫfFcyo'S o؉{WrzEv6عNՅJ(l8s"6dRXfQv /ZLj&BETx֐:>X"iVHꡈSR:6.yW$EyM=c=/X֙Lt9f1ad¥-UIIMK>2aX5ɣrT$INKTǧIE^9oԒu>by`$~/_~ b{Kvs걻y}cτj\/he\|jm}  IDATS(?+>*oƌ;A7.;^r1@O<.Lf=竔dllGЙ,EHḯD$3%4]Eeb!1Ua۞'u0݊XH 3uhylՆ FmmO}sXщ&::%k;Gػm{OKM5R]h0̳2h%4/0~!f.96=7{3oZUήQmE읞Lz'S̢et]"0'cLsU.G?e?N6+wn3kLF^īϤ<(J:I4J#FxBtعOPfYt2# %?QN1-99LJ7?Awf2 貇(ip7dD)8Y\?ľ83s&\Fx>s({520-mltx #bχ&U [ѕ΀Tʼn1!<1։5_x5h=1nų W=[oV8;A1`['(R[5Ƽg]Td2 %%l- iMW휽J <Aԏ-Q PR"$UTB"mE$F'ҡ@D4,]fg119K-]o)FL# 'Dgc%B{>Fh1 _)ҦYb]rKkɿasUZPu;i,[|% Q EcՈ*Ak2uxɢojSdX/B9EP&F%z 1I "FhS!"4FŁIMFrvo\[tIQA#-T?*ȡlc'v!r9 %o J*DǑ$ddQNZhbJZBVC8E*-3S?g:ʾ('WY},Xh[^Ü=.w?,'O/~7xOY=v#Y pKm?# o⎛g(!Y/(lۻۮ~3j[o>Sc {dj\7((Yy{/|j|xϞ])?K9Ĭ jt羺AɿJeF􊦭R.=I;UE4^T 6BƲ\9M"#ƚmPNBDḱS3%HX'( XYTYE ]/)"Gѽrn_$Ru){QoXZ^Pe FC`]PX+h"Ml0-MGS5ЖcgM4V 6SVOS67WmM@P+nsNCCM놈!?7Y$¦d)fU^^aj} rt{a޾3rGq"d @S"Lq n2rfc7Cw9i;:mWo3I;|*}sp5L^_y$ѫznµ1i+ 璜_;ף/?:]7l$s+]+@J"]h<=+9Czsm 8[:AEYx05HKAPnH'8WaSj2(bP _?×"tHAJgiFc:E %ωA$5AoM*M+68U{b/?}tt7^Gg8~)n>l\~TMllmс8(dW R"Vs_%e )K-CRQO-S l_aD  3"&0PX*$:r[֘P,י ySD W1Z) B854([ҋ!H u[FzRoBG1RD Pg"$Fxo fZ$#|ZkF#_O#o|q<vvqڱxZd&6v: 8Ώ:]㘞#o%3(cQ"‹nu%[KfF4 ٱq:12t] H [-e.F #Ě<"D =6^a>F x#IdS DSb;W8_S}"c;=K hbjԧoG{g13@PXb.Kk)WW9?>FUj4j bո4mҠ)ӌ;]HPҨѵa#uAPvHrC>!G\+F#D8P8`|A˝.e$8ܖ/296 g*,qI*$b.TFY&^0k (W?rr3$Z"AOvEZZJ= X}&9s~]3hM0XwDb+gYc܂>_ǡ\ sҰi ϺCfOJ9LJkpzg~\n^p݅!k0LBA`:G!%Ʀ{jUT(Ր0[qC';[Qgy(z#tp&E%[Ϳbۃ_b:wdo_3/ Q[a(m[oW}X/\II}N,H&*P 1 *!MS(ĸDiȨr)]:E5SQq&5cPdCA\<\\yn溃  u%c^Jb@cu){K9qKkBcwGTdr51W}A2"bq&,p$(&E0AEd#PQ&A@UTn8B:C`0X(]E0}MY:/"ʸC*IQk[aQ(a"C$"3 5^|Q:eB > TDILZjB4ݔ4=f ^*+nf% W j"L)g{YlVL혡Z,ov5bm,.jBFYdGr۹t8l!ߴb]C9}ݕ.fAMҷrxC-K^W"Ǐ| 扅2ьb}`hS~N ":AFa4 dMcE@x//I\} ʩR׿E |&^::=u=-Ѐ*7Lgv1A_OYIF 0h96xp;sm7㉎௎v4|2ҼqTAT89DM1Ex)(Iqz 9ꎳ,ׄY/9D6)F) 01ʦҳ^QMO!WVx u Q >_0-cp͂qU*a A9vJf(ru2rJ"eo=4S5QX%iHQhaO[nУXI4NÎCہo!h z/ȋ_e/7cO. Ba!&R .عQ֎h_x8'ڸgN8\8!hsx8yV3TQPua`< (P\hɕ`$M2-lފKէ,EN#ڞ\>PF9Egz y6Yw TS31`. DsAGeL?_/b߻ܕp~KyRđ\, EEW8e4)`.M6ΟœQZ9u"\#^}bgItN[D4=&5H #s gExv|pS0`- gHk hj1D $Acxcʁʈ6;ų+VG+W1'#ҼdMUReB;iB k#haK T A,)>֏!/?áIRN&&(SgQ7xlO>ùEG)rt 2b2!BU$I EK7-phŊ9Ⱥu7}O"Gg\}-{=Uy~NWĭI.~c78p,\{&4D~~i^aq~_,\gXjx{0d%X%!jQ hj,t=_]Y[;j+ u0>2KLjS%f[?k+7ή4L5kZz8żrGsnZzࡓRRўၧ׈f ibe1Ǫ@/h*h,`T$Zt*h4:4|'d,t<][KIG45ڍ&Ip%zrǞ(6"Bz PzEWp9 L4\۩XG;o՗"G=zA'$QOA*pdPH|I\BJ`zϰexj.f_fkVKXvyɅ~Eid. c08 D.Ep=AcY&4KEӧ@L۴43CGN0~׿987wVq!暷nO׋o-gzXhB Ld[#$YzϾ |~s ݊,NI%7UmQ&&l|!47U?{lts f= 8K.Jrk1>;Ll]5Kw]0 H7$0%xB|pϝnxmɽXH43K<1tˠÓ1BOa[[pEyM$^ $s!i>`ڒb+ےpKQdƷ8 d t+EFHkSM.@H+H(qɀ!: ^Ȉ`4EMw<;vSAOa( ur͜>r׌%v%/cǁq2D $,-s#x4Nbbb}h45ȍ 1m.B+.6mO6 vHi%B;M'ԑiMFt^@EBVF0݀}LA*Hpc1 5:4)Q!1ĦNiW@d tqRFÀ RW+DrإvËX qILСISQBX2!Y5ć-22y={I;SK F;9LjFg=K>ѣ01"|'k8^Syڻ?;=w}2,,,qC{xn#Wɬa[!~Jr^@9AЮYXѯ>O6Wc൯#*vʩG 5AO"B^DEPW(HzN:'s*ڤe=_׿EBeǯw9j0QOv:pXL] ?T#-^0&rNg X[#emWN^quyGiuLlXf5;dZ ]ϙ:^=1=fj"e_IK X^4U?4Œ]y&<8ifkL+FR1UF@DRqM*Ăh%EddRKbפj80(9#NnIi E6ASJ(fQ% Y?KW6%if*,D$~1ơF+H3˯Xn!Ѝ@AèT''3m S .?NFC2}{WLnm@c^ϝ%"461*x| 5 ϟ.|n܀4y2? AUjFڌKl' XDZg Y3X?ʿjj.YEC8ЬKCޏs IDAT#RoeB>0܁a8. , .%.tU>'H 3ޣüdp|jkm:(a{`?ѳ%rCœz( [[{B w RG|>vt G> 3ezj=OP-*u;q<::JBn|<Գ"<˨5?75&Anc *u+虒UbE *5L3d ⁡߮!lt{ˠ"x&L8%sЏ'R!?6!bOiqs(KA!w VQ3X5&3.|EuO||*71Z '()s 1JOB'xdIz/PP,E#xKW#1 rA.K\" Ӂ6~X%EK&FMjUAPgPZ0R1X0#0 D}DنՀqm\_݇)s֎o_MVA}2ƹ;oNMoS]p`nAoqLN,?w1Ecms/~jhDt%_^m(G;19׎lt)٧/N8h$#W>z;f5)O? ê=y+&3G["gbPr&8DPQ`W)LĎ 7'5Ut::~&d mW/ z63Z@ɈDeC0DojNfeCx&ܕLz1K)j#ИLje&Pܧ3߽+oc/!ס-SN(}(WEGxEZ Z#,X¥oo8߼*o/니6){DOw1Ndu{$VXr)BD$ÝEE@8W%!w& $>I5:EWO1yk=+W~C;|$;ܻAz{D;ktTvH3mn%T&IH" lߵ];|l?0 &ZmG(s:YqȬĢceR J)1q4=L!YAG][(1^+--ޔi4Ahqʀ24&$a}L-J-J36L*$fPZ㷂%'"^(Q@ji2LlIh.S}I+?o;iFE;th[w .Ho,!+g3I0\{T>bt&ccqo|.zS.sfSo}=SήZ7Jgԩ)Jr]W0]4QjƱmAץ%>EU@l' NkN#oD"dX`EN*5DD W_S}"u+9ZxᩉP4*==ο-/7ܳ"TEGDNЏNw5c?1*-JS׍p֊MHb6 l;^>CvG8xGKtxex(i>ƴ-ã kzw CKzLWTP0;f0ϕg>9O߆?!/YBl8Ksc Z9i(7@\$y;Oq7 X/La=Tu1g@3,xxQ6Q(jog6 $R{ qW*G7/otIWW<eO>fsߜ=͗,ʳ NPsUn8Ck>YT\5\/F9M=׭OpTvF 1$H!кD9XLdI-aOb1FLWOp̬s3/[5mqGȬcMcbc"zMܖ\ָ[e<335^$AtbXis%uMe\)JGb;dTG6Gg8 }u1'7.'>i"1ؘZbUbтy.Rd ײaG ʼvݶY@ 4AbInI1?q$[!v# M;%&T2^1rcR+ޭ>,$6am$Gq48Io~(!kmRb1݅v|>%HtB "dY?z_מatI>y?Esx`Ұ $$6QI["s b:*(}xd-Z uTfI?'=44MJҁ)`B[P@c"6Vذ@ゝ#0{O.--YgmH)Ӓ0 Fg)̀^U(%_Z'&F^/"UYx4'_E_FkZJ $@H8qׯdz<,j^{my9KW/{9۔-769r<|aw}RAj74I`+<53^o iCibǜ}[]>suII'5PL3Xh*hPG-)qhg\ @_߿{v+]x@m؍^|-qxvJAɸs`dg ț1t$ʺuG)a{=B 3 \+i_T cY*80:`at8١3jB\'R2݂.-{>jy,Z6 s\>y(go>H?qzߐn^C?,.ffAK??GF()P< "?w?f-|CqDQqG^Ж=}Om+fL39(9W-1wKD7).jN|z?m37|<ׯ) ׯ:+5/R ~0O_3_y?A_By5f5r)e9GbuJ=p ~ʀ#\5/+ 5C\-11QLfIN)ba.;L%RG WOkgrl:ڱ1Ś`amPR 5R$ab ]joD  2؆DH,߅HD) 4Hp$MM5R;nq1 GtW,ҝ,{%EO1iA GYԗ(L;8h词:xڰ2vxu=x;; yw(UQvm )EX@fm ֡ٞ6ǦcL1$ )&bmMas qjaL$h6GɩO L\Y?7R@%a$&ۙ|g>Rx1j0CD4O/(KpPd2\ѧlFvo;5J!-hMD$Ho*g9.2RC%pO@zȤIU$@HHg D$iI.'TW2\@{-7/_'>qY_$;ڒ F8}$֔\fggi`c}n])c|cGуՂhf3"Sj,b rVqX+hx 4RKc?./}#7~e]Ck4HQ1-.-FQ1jQu"DŘ%cAfV$J_ߧ{KÊYL1̸SDw Gy_}C〪gf % GЊޮiE1ݹeZ}(vJ]x[5u~'e,=_P%x({+ I*=kc}^b5g oLhct⅗pcϷ_ڙARԄ#1CŷӫCMvޢ[7^l[eug.䉉gH؎%RP tRb [1)#NvSR 66(1|QHe$IKmIPpnN VNSO9mxd汇™C"0{Wor[`<Ϸp?}Mwd1<qR-} 2c`6]б"PUTRI1$Jq=l9Cxҥ+Ql>VC&K2IL~NWmp18kvl0e|z!ZE"&%@R\')XʡC VAKECHĤmm16Uhp8gFQDBk(Nsh`OUy6N1l GFc  1=WƲM&F!)!"[ q|J%|@IyLKNTp&& #6C` $1 Vᡵ#EC/[{)Rw|r Kɓ:v(V,PŠtmd1ae`xPaߢ ʂ F"<Հ('_&n$eim6X>ߋ:HU@-\f_[fys&uiqVPI`{Bh31t;,j vxGA!B0 hPa c\?& ZIQ e7%y8hl"%j5]tw%Ur65ևkaC(u7ZO҄zPI1vtv߻' $$(bޞ`\bK R>Q79K=v G_v zYv^S" Fh!& `j@c$I `цx?+?X0͵>gO̹Y]SWX]_4}\ϵ7y2eq0fsVsG}z½͝:N #_r1>C"S_٣|-/%;7 V|GWTVxfIq}f{&ƭ! \vwt1)hR0ٲ6͚Ҳ #˘&8PpaɠV4$^<<,HIoSa!BTbĔV0&)`0J&s#IM aQ ]s5D35)Hg;?M:ygHSAqԿC쿊}.}[/?6G/r>Wx… غvvi +4g< Gxxe3:;x>n σ8y=|e7.]9&E.hl)+|Uhg3EC`r{3~:>rD"Z``Ҋ:!OB J9% DD+:)PNui IDAT8_G{nblv]mEcge K0f1uEs@=^qzQa0\@*гRچ `JGJ oNy@g-YP_::! A e3]m$ZJEHB1t B0mEOd$uMe+d *"޵)l KvQXӑb)a ?]1c \JŃ{ZP Bc LgCE$;r!t)1W;1/p Ġ()fH"iBJ}VO}GNԂXCm,Lr0J0TxV).B$@]wf]d1 L |@tdxλ/\q͘Dg- AS$ "B(9qt0+Y[_5 }7ls핫0~b&t$WV 2,o@tDK=i} [w(#6HGt~ 4@n쳽HfP0$dZ|KNCb6`0{9Vq֒XfA>ׯOig <=<)u@]4UX⌧bBら|eb]&sn4l?MM9 LahjeXL2^zCbHe !mK [ ΤO'NH-n'5mZZCC$'PwFHq܀+׹ZWrE~Jaav\jvg2Qƥc?ej g0b%wJ8PGCeH$Xtְ1ȣy" $%Eul\{F Hϖ"JLZ';!.Y13ҦD,Cz\8bH/sG8ߘŐzkaQu3=zU"wkh8pz2l˰;{՟KGHx#)! &]Mg Rӽm.V?doƍ+ױڱ:f`gV9wn<bI=)d݉8ͧ>Q׎qw>?`5=CS C[%\0*bOp L5@Ay:XJUAHb(NNuy}ќAz}d{yՖ߸ްҳ]qnV|.-x)׊)_i%#B Z5Pi¶{U2wwn2'v:O.DxJz)qVX ,\ N:Zud/:z}b>3<;6|iSW]Mq+zz.ـ`FPEb%9)zɰwPc{XW:zClDCMd;\U2W3ZRyÅ#k1n(nU9,8Dߵ(}lpe>PPlRҨn+Q `1{88e][8H$ՖE6s2YKŠQP:&!$M0,!p@P)[>wf1(6\F +6+HpeblQz2r,^)*è*8dul9'|]Jopߧ珀pS9JG硨W.c}zΒc a£q7_\g~R ܦiBodE 6SC:|{/|CtW9Z & gJ*,0T)ko ppy1g.b5貃.Ah;"kZK uvt[j,cNF %$B̢ר!EbDҚnx#)=:%jĈή*I $ 3E3AQr7Xդ9W4n:Vb _ƒ)67x;ܽ ~r>?NAPK g0@ vNvkswy;_v5|`J$FȀAE\/-'f #(`=9Mdio%"a%c/8pJoc%0dr8MVS\Nv仆;Kp$1O1|^7Z3@?Xx^Vfʹ?ɧ2ڴ!]/όD bm~5Œ8D uP/&4/ *ŦմHS"u, ) s\>t[ 5l*MUvKKf$(Vp,e3 ܜLm;7Dž[ \$F͛_EnȈ-^|YWFYX6ǫtr&HU׶w^5Aء?Xa?L, K?$ʥxmKoV3P4圙dQbqa4%WwoiyJ.Y`Rv ,3ӻ4_=;Np&uaD7&4|yOh뚃ʹAS`PJ;@]D8 m8L+(_?s͎zop xu~5n5}Xobmюق;bTndhcbE12m,m O34-޸G d^b`zVVWH.Nmhh0e42 -A-jIXֲB-[~ {; M٢ nTҶzXnw@Wߵ)B"GrWHn9LThA31bb~!e);Qna Ce(UKEHbs)FiiI Ӡ}B &Rw(m'Iq6dP`XQQƣYb9Vu{*̻_[-Xu.Ў%RRJCl]skZY>>-0E`ut&wvgs̼,$)MT"xWKp?Cyk!PI)S\bMī{Ӝ Tֳ[GA.\Kt@)ij«dgmУ%]eIF:եF'ۂ #sc$1̌rN$L L$$$:1V!FT Vr@ Hơ!!N5(,ξhPv;Mk]ء_7^\/r2<:OCWRi%js7#}}JW! F,kg.Ju/]w_JGwmHydĐE4bd) El%Y%J)x#р1dASq`i,. sOG#8@48J`,y'Q2""Nh}t}?qbsG魏֢`$!KfJZ\URlښmY,BSctX1ܬAsu Kݐeh@ius[3' 01L.Qɚ$PэUxAz"iv+u9>> Їyk) Ǭi^~2Nft 6F78iܙՠdQUBQ.H) "~ &]ƃ 6Af)GR1䌚It}}wHQ5 <$D,9 w'?y&Zj nĹ{'M[g ~t%rk.|iA3uT2O>ɍVyUj5Biww.q ьH3ٹݮQZww-v tXV gWچK-:5ZvDQ/R 9n`a͹}Pruт/H weL4jŰW`:K cs^ਠyN REIyvzɡF7. R3JY#6hCcACd2OEd:zAYOV&L&:P |RGָnB3iZ-2O\ Nbkt cIĉaushx㏬Q$W*/XoruvCm25bQ&fCPAiIe thR`F'р͢QIOwQQ9^VTљ9)ZڊFj u5&hRBu$!O;$MW\cR".k@B0 bZrf4ڜjH2}A" %$B44\>IJ='\iy\߳ūL4OG8ꂢ7##U=c~Z=mIzL-2h0KԒ*+HFd\Йp$Pե˒n1>W$qyp_N -句YߒA" urcq/O7̚U??C;$^NbˉAG.dJ,iRDb'_DӋ|ƙ <?cyY^z iǿq=F@fu*MΗ$Ŵ*I;oasr]Ʌ vI䔉1J&3y,rrTs}ӂ4`tUFꪢ]Ql)OiOF,[Ib KӜjLh%axbj( )Z -8P1Aw.T:qԙ@W_n Z+LUw(#P|FI4S;RS82ԮƅD0 5H(.C(K/,uZa#gJ\wL I'R 87ӏmJrgl%)JƢY2yhu  Lͽj pE .rBr^Z:f2,S)>˩!l 8q1J?Ed)mvi֠,49Yg8y+=!5BPLKJ0ZR+*xd"wm֤-4NyXN gQ:'M+ YJ@C`l-sh!IDлK 8RH%Zzw6Q -K8 Ӏ"ȅ@9ҡ\,νJb qfk)kmiU5)Ö9'سN}˽E5B'ot+GÍg\̴+f-ɝo1; (wO#[sg,.E/RBPf4Ĭp %޹yVy6{7w/~ֽGva::d͊;͌5RF l=lB A2+ jR![^ >q>YJYْ|-nOJݔ8`ԯjc" HMۡ[l C=n UTL8X$58!Ԑ>uBsGfL(kZr ÷/7߸O(RfZ sl 8rYrgD#ǘv)]ވWo$ТG-͹?$y*gȵ' i6KJ -F Bl J A;,` -pPA?Jtx3ϱ8b<9Os*O|>ڱ}〷_S;,g(f\t/ v q==ds{}Ob 3`ב IDATN~@˙J(GMFR Ɔ1[vɍ 2О6kI94d7;DHù{t7nyfK')I' j/Y >/rHɒ \L!ryףk~].eҖ͚|b}} sLEҷ5F[eMYv&p^r6hStXdPO$-ov\݊^.%6rU ÔzW% fh5}`h@ih5ri@GspG\tP%@K }rv@GH":ii<$Z*J:Z Hx𙆦Pʓkң?  5yZSpdvmd&9TX(ʀ Ly֝zZPǙIb|Yk]4%Rt*ܤ ')JA*M(c#RcjXy9x{,.bw0,]$Ϥ,TCڧ]^kVk¤ $Za]J(QNw`xQWgABK0Q(}JQQ3yJ5BJ+1 Q ,xlUx |5ARyC&%6 õG;ngHptaai|WPc.o%|7,,._ s6&z oùK_9Cױ+zT]EH.ԣ*D<݅:\eP Y睋prmO~=ěxg>ɵxY?rYV<A?Mq:O̹GYzŅ.>cKd,͍Gv]-JF .DI&HgNl@]Y.OKYja㉟G0܈0a|OFQj6nΜT睭LE{n߷|6~;a<@ ظY`[eN=]m3uCOzaB!NITPr_1/߂'NX*7ҼqhL99q}Vgpm fr !DL! w4U&1;@&t=?ŝ,2!Ӹ-"BtTRL.\g] A+VCS | ^ٗYf_/D >DUH!#3nUD0L>&x^}z}yQ#fd1^"pq {1L .;BH4ZiT":[DwaPY1yF #8ܿgG $ bCP(ӲmV|>wx^w/=qO鏝kxooy|y[7xO"_&I@4視߹@sWV3m{P❧YP@ƞss o/EM3_ [ ڽ.'Y\YX[Y\g4:.;B\qaDKIm tB;oR--{O~i(Ξ\L'_˿k\|<&W~P{7 b!ߑRIpGa>?qs`p+1 ?3ܬ96'\<@OtUf<~Ovkm4V K.>\fAk/e yhܓ J:.ٚ8 9Xc5GSK W=[yc~rݘol f%ٱ]xl=z铁)Wk^so dhs>-MZlfǍ$I&, ;p_IlY)_ӯDGNeqiD䮁nj壄CJ^AB vr')gR %ďcmTuTvqP ,\\k d!%ıe<)'HGq,۵gT΢2mk+ȒיWﰪ5s6Gg`40fni MpADqQqFB6;%61n}?!IDu\{OڸN1v2} _6"W9RE 5JVt wסWxP$zŒbĞAX% J)@$JLBcH >ҥ0>P EJ ){L[ncw%ƒH3LDR)ʐyCz$ueh*E)M:~?"%x e=v4bm3?9t;#MMgY`5snM-6{ !}N 9f&_B0SC}AR!eb& C2BTP9Afx!"A '9{$H&3,m֊1Uy &CRxCs

fHihfFY!@yDQ)1STC ୿\y|~˜Us$2}=1W% B*)DlxZӜ'md`L$q*E`dQbY#DDsE p&իwm$RBᩑ?L$umxebFn}r!/~ܼxhaz[{c}%onN8PL2)۷\C=:DRX^'=q|\A4kŒ'7xg[>ݺn[SSέF#-"O#yH~OGJH0TNqXȱ& EkF_SƍzBEԡtL@lS;RC3EDqn3C6 .J{V=fs,ҽxuJIɯpN,VBX Hd9`jPV#O#?[q^Wx=ROpLB9I1̣,9߻5{߉O!6 >`F86תa'ܼzO<+|W~f-d,df<_ ϼdg, urvHEtD&E8P)lIT:9@do2f)"@[i=!ב&Fiqa|\:u;Iu|po\|6yˋ9sKo}s$yLj.\|ohϟC:6Ħ)=?qCTuӕ" ]¸̹>ULe4$FpHhV:{*6#w18:(aPڱ+z!Xdiƨ0CL4W}~w$v058o߽`mk1Xƀ,Lw8੹6o8i+CMnw=Bi =XU$e4i-B3;Jjя1"WRv$"a!Uo7>NQ8Dy%Z*/McHF/EӲ4pPK&Д!X5C;6kˆrF AԶB@o%ӚAh<1#]I4{L Yj 0_ۦ[1qAҪR]) = ||Sw7n;E@WZ*LGh!.$+RawCLRC-NGѤt- rvSm)ffPF"U@8M5Ewn2=,VR{s#KIPdQNј#=?0qtvCCusgq')D:عn&F^#!XNJt*D@ qE8JE̬HFdE VF绷˟]q^z_e=b\`TuTr+!6RRHP:f# "ncaZDo;<~hgig%!A[GyQ8jk0eA9<Ģhs4MV1ilw|A!9E ;#%I>$ҡ0Yu^GT3"àb:aua=Kl x?cG 'ܻbcH{9 jKYYY=B$|/g3l_nutylmܤ;@&cz_ƻ#9ol{}zA8ZUŕTs;`oK c&1@QXҒ%\[ZenbiK'-sE*kQ %k/qgYuLk^eh}"bb{Bs[PͰx!*~t>:?'n2_?Z0E)AH2oxE55YYQ6dž0qb5Ȃ75~FuWJA%zWg&R}!BEPR!/5&hYi%z9YF"3B3P|QvrA:KR|.a48_#mK8WƴjΜ:EXLRX5XC\#)3VޕKj+: UHY^^̃޵.0( Ƨ4z?8oaMhI $Dth o/Nq!B: B#C 7V3Ģ8_ C rK5OJ>eRh.W>XH$>N 3myK|# [5#g)sj E3LUqЯ1,.-:t7O]T ӨNfl](jjﰵg.oRUfɄh6nΕ ߺEg@g7i3Ԛ@'V:/q)!TD|  cA%%Hl$^q RQZC,Z(CF*oq~4u }E c"-H|OIA&4V&)>{"!IN!$`!.q7%Lv}l݀4Ci"s|DQCxd gSr)<(sǨ3j^;9$ n}ZnS=1tCon{"HJ\'lKkBf{1Kx1B૓<4Fϝ@X%ǡ@wme2)!ŇFr=<,$q͝XY.ĬABc^ uR9Y;{h^[-7_?`?x\chqx=ZHp@(LJ ٟW0 g?<)8 | IDATI! VY`qK5t@YT"$fSҵJoQ)ɿH%:%IVFó` IFxb)lÓ"Ӏ<)@z-=Iϲc-س_Ȳ?|'}sNp~?7+_y>˭Gٽ~a鐢Mo~͍8X=Go=7ާ%f3n?Q7*ame1Y7걡׋8W{LQ\b5#BC*Gc\m)i{Bk:Edsg>cO, VlTXgcLxH| 3"A U7NBBb-wPOgd*tHQI jKp{, q֡+ &40)TE%)N OVi/~ULRKgѤSJIDJ GR9D*<](YA X,"E3$2W8@!u-)C2/!(HrEZ7p&-aj31kYQ6mrYǜY|'LhP9B=r{qA䝃 ޼ȹo-TRYAbBFJTTZ "T@Z9Nx|9 B#'7gp$1VT h6$sL*JIØ8, OL1(z tQ <x/ea0J7e/AګXAvC Δ =-4ssI^c(i;/sܳ},̝ ZXvMK RPV#) ὦ43\+!miҦ1La! -s' ČHISBHO")ic$$([Yq~pbՔJf:Dsj,u; U?ٔ',[]G"RUѐCZ2A!EQ3ZUK=#Y9fΩ;錤e#X_jp e DT)Sxޜq枇ʯ~^_[B.X\Y2UB&ZHXgfm}5ѻ_ǸE;fq8_eL>3 4{)*MA΂^Y *"$$c*GL=2Ju:DWxas. 6a&^3s#p[ivш}B A8CFږNuEk0.i$F])3WG!J,,.[X3tMZJט^O/2ߩorrnc&k/3uS>yv/[͸eS yTiR%PŐO>qZKsܾug{hɲє?ϝ7ҨMfH$&8BaC9tV(6DW2IG'n2dkAN=qB2QMW!*OhB#> W'"S eZ+TQ(\S6+aF& B 1g6R(.y_~icȱ6-SʄQz,Oi)i+c5Π ,22)|hh%5F;r:X}-@Jfcnf0!&KdJQ9s,Kj fm{xo(el*Ff,ާxq#Dž@5<:͑bJeFT;Izf2" [Oq :;/PkO˗?4h^]VdKƛ,/16' [9a dfT&S)JeHe CbHVR>۽m>i}:U]~>ul zB }@ǽC:O _Z`Vu)mrG!~{R5^g[W9m1PKV"EH+@hO~/1D3t__|mnmM`;PٌE]'C (n4~6Mg"[Ay0KNLVL>0ڧ BiKᶼKUdX ͙pk|eO75SF!GD)3C:YRqOe4'YrX}-%q~ 'sP. 1[hSimCUmqY=H/M@H2@[!Iƅ`̦LҳaPO@ 87 $J5P |'ǹ|>\cobC;X٦pQѧ%z?+$EL 0TC{ɕ\9sұy˧XZCꂧ^y|RO$'\Nkk;lSѿ0G#a3\bi~2yc{1Fr:O+ocߎA Kn4d//2]8E!C@\c:9ݲO&4ujTkr*^HNU285zyf/9+NY.2* 2#bq3o.0/c(b o &?mށRlhc"_-^uѳL;B^ښ:Dj(ȴZjQP%LGZ bU3-ӸCbcSyFI`ҀMR HAsI |Dـ*`]Vb0dŻHY I66eR:RlP@34yi)pՂb2Дy$"DPC4(>>DvdP;D}&Pm) Ba|N-"  \dgRKbкbOBbMҗj l>B)#*z|$PAe;:*"Ӷ&@ާ!gX*"qԞ#,ӊLaȄ0+(K˸;41gssqVr׾}4Gv (Fdmkw|KW>J̧u(]MxvKL]B&PA$xM^=FstZ2}gCD!GD2=e_+7ˉ=֍ y 7y&*gkk{K/\wGtTQS".LRvpyR²umLSxx\iը39o?G=x:a{fadn1By]˹gx7=%oMLfy'8~dW_/ ~MpIν W 1e#B%F邈$LP~m֫.2,Vc*9jcU-!̴6,(ZQN<.-ߔSc}A7FUw Kf<*jC8LOJ@,E"UאR7 |I2̡jЍI"af5QȈrԦdn J-eyd{ºicoP10BP". ĩa1&SDdUR#eD[xL!ZJ[Qc]2 Ң h#TQ[#T-٭5RP4K1p}@SUm`KyQ%nϖT,gTmgן>s#aLA&,A \;acg\x>ʕԖt웿QM@(K{hΥ/oWx^oha\yB Dԑ4a53mkƾ doZ"MSX?f+0AW遼&8"l ~r8h*@ =aF TH˭gƣŸ<9e9$#]ȑ7ț߆jQ=:}I) Q 2!3ڝ"ɥH?TjV4x績y!t9eRhB:g dާb4zB=a~Τ)op. JIՊ/:;p:࣢۔deI>#L{Q`m-9qڵ-X\*Dg wHl?#H]rwvaȋۛ\?ĉG Wo^?~y3ܽo;g^{Wn0IN,Or?O./!7pjw<%.]ι#GzuEvon3ͤ=P>f<Pb%nEK}Y?.ҩ%?Yz ~Ͽ"{c|}S_`c4Oj=!$C#c\k3!I_d׫OuöjkOecƼ'o(c !M/"syKOh*ÔKtLf(Z4>b '213fK$I*Q; f .VH$i\L$rb&)H+([ ,RҠEA5;;ɗ|w1I2ٍv0mNH]vR6)L6UF/-̕OI!xmc͚3` U#2JSbsͮ6pR̷ g }yOS\5qz| oEY#Q!ʈBG[[/n3։98wK]#<X$x4{-vF_GpAFF>P@%JoVz4cz3_E9C<0?ڷ[ 9SI H$9hmDi,C*Jh1t1CRcI)d8敗8Oї{UxvљC)I\b FMN0]<^zwM.umYKʢC  F 2aotL53t,*iz]dYn e\Af%2mC9;H(]<5m"B/% DBԈ,G27A wq5䮋-$~̄"xS$yFTL-#|O<=%->x3e]s+u\Zw|׷#O6˃N8OQN>"Ks Ql>ӊk.yR_硷-Gpʘ``yEn6\GnN3>/'e!V 5T]v3ֆttjoY_E'9((n/UEPD_C0J,&I[/ALkQZ$wbqyJ2I,s+=i{Wv PWF9|gҖj\f}h#PZCē#uҭmo´`QXɄ7"2z<3U% a Ha0*&rī@aR:ҥa39{Ak y Gh&젊vܱ߀ 3 Cʋ 2dHfvGfw^Q GM ""2:bHS}0gI xId@}%OmW'b2Ic tB:L!v((%jrnXiTѦ.xל_B9qh7($K <-PЈ\:q =s8zaxwJp+xF1-ιE.Xɏ3Oߥd IDATg6;WOcw0 Q|*IqKR7"&;& fC=X6h|CN5~B[0 Q$)^@H RIZ ڀ_4zvNW S|5Ƙ=>$JBԠ<@d&dKV3 L 4D\,WG9;0bo)E 'T{@evjN`en6F\L^ >ZR } P*,i$bgMH:G& 6; )8N0KddBQ&$Q̂x&/ۼ~τObC~cF‹ B $BB%@Y%Ję/ c{gGl8:A9B(d&U% *(P>좖qB)$1y@BIRQ4x?m(&yE |Ẍ.vYTd`ZtpNUC#"yzvc k/f_}_d򋈢FHu V :#3_[o'm4Y lh8D+y!C$*ׂ. (i}J1ILzxI;2ɀZy3t|C,ag"uDgAL=ÉXs³Ѵƹ!sjOWR`T֡ Oc .ZKzoU29O6XZW9OLn: MY%)L,L| [Dk"ZKC| :*Izj$1S.кzZ+R6E2V6.֔QFrJ'B (RJ}MN!dBG &rKEf؈ !W4IJB 2 d>q]brS{j%&ԇDЄ? @ed#'RS cȥnt3qFO#!k7ǜkӼ1bU#QZ)]w!t{Ž]WY{gKڅ7{vq~ڍl/ ;z&5ͬ]_ӣz:=1u5ƾ{dKLxXD'x1 @'tr`CKMkښL}E]ZK5V  *t Ka"aIea[5[]W@g?VL{V61D>V 7]$"!*A }Z-&{aDĴYû`úݘ`6!. Lꂱ n\9 ̉]dآ氫 ;GXꎦ-3zƶ̙|%rvަ ^w|=&#vNݹLhiRD`V =zHRV9j"Ý;Lx%SSÄe), h@%Y2qH yOJh2bąt()0ѡMI )hc:5LL)y%"KfW6PD62r֭gYHT ӥA;J& VUġ"I/"v/)\Hnow|cK\;CvLTÙ''8woxQ!i!CY` Djր]΄F IJ7H :y M`BFӏ]DHp؄婡n+FmvuzjY0%^E2taH'lAa#h $-"FHyɽQ$@$YiklQ&8¢Mv=ȓxjeY-p%P2H2T"*$ --B;;C#X\ZGcSh…W.+kQvrz6:v&;|ي?{`%Z lRslLX#f8^~Fnjw׽ 'ZqMvN%(qJ&:Of(_zsDI VE{97y/s3ޠ̻+ JN$&E0ihcR4’ER k ^}AM(6xT!M  .Q@鿘g)) O8R V-s1+R`-GxGOpWZn^s՚T2d*Ys=),\D0={j8k9<},׮G>y}P}KLV jj"/Y^wr8KN]ٳkq^h vN":Ra@$ T⬻Yh`lCU0`L76V\@y*ei#5;LP ̂[BdV!M2bf*B#&j=:y;<$ ą1ux>`]fR T0j`s,ؚNr,T6{4 /։9 veqE1av-%wwNհ2c%Wn`:ڶbw:\]@AMRwhsM:9!ϜƹM}vQ8αc%qb_eƧ>ǜ_(r%jƄh#E$d_DF&PMKj6$s,07%nn6H\hņTlԾakZPD IZu03ҎzJ.S>>88A5V ˶2d"B+0Y]o͸0Ҥ2-AtԠ,YJ@LƚFyLiW+as rӟE+fZiTmPK^lYpZ%6IjAbJ`u!l"5I-<3IF ǵ;V01K4kq Q*M bJo 2bds4sO_!!{fdʡw|/KΥϢ܇r }KU]tVP}* LS2&Q)X- (O\¡@@=!x4TՄ&[kwC3$J!T (TBBN, ISC Q&;1yAaED.n~T1$Vktq chE2m]*im m'[RI@C YZx$ȤUuR I> G- BEvwFƟ~⧿ݏ~G&P8moy~I?G MX&B#2"u:%kj#"wp¦u2K4M_| (##Cn&d:$HDӄ &z7rI.]>Ew.q?BWck5Tm E 1o6>ɩgd9&/mB2" $^|Y~D}FZޓ!`I4hQ& Cd][G2OD~]5wS*VwNj?ۭi^rnYo}By#;],rͲ2qHnv GEŒsbLҗ0 ]CWh| :@b|H\x9>X3C?x((B\e<3];ݱt:^RK x^J563&4Ãs֧Dn%7$CO)t ڀ 1ɒ(Fbd &6>6H, (>F Em4 q[\cH6ǸȵbON%D;%jdq.g;G/m6ɋ-3ڷʞCGX^:B7<݅>ds7x&o6Ȣca],,p_.)6GZIK+bn2_1. 5ҫ2wSp}?}izb\1q-M DMVh2ki"4Kz" 5"HDψjFAr'p?M/8vw}H +:RO'\9".8 t7o2;_.>O'll cI-By7m\"WAg6Sfȑt4ωG xQ3Oyꓬ <3=N2#R&m@ ^"b5;Ek16,*r,*yk! s~2;CØ١g@A[ tQy$~]NgmqDFAP t Y^ɠJƜ5+gS|F> s>bTJj:|]JXl b >d1c sNPrUErU1`EQd x'Ahs k%?*Qꐫd95jA$; kp9aHK8dٷ*3hZXR=4^G t]ĄHlv(wPVUURJ|H̦-V K$cv &h@SoӖ)'X_[du}º.R[Lf=׿6K?o\S&)^˟}5 g{\r AaJQA 0W_x:Opq01!sP4eڰFe2T f)RV=|t]%5A1ȄZX o*Z+8ݜ`2r:w$)TarqZ%Y?:P4D]pvȰ1J˴T>k( kY-YEr09Zcʱֶ;;?pzH% , sck"Wn* X\b?2xEK2Rh%.! v#uQiFE~)112 ;d8VF(!)CxT#!껼caC94k$u{9 G7?p#~!3_ay(+J ]Q㣒&Lb#O-J(0$Z DTSMZ4XGąd"aJ\%@B0b7- 8A(Z36::,xY%vCj:(s#j]VK4G ;n;4]D_9|ÚNdQHBDL`.']H̊}by(trÛƓ;,"q׀$)F[ʂhk'6;z.1Y8Z"&O-w#!d(8Ly{_}k<7!+# Iyxt2|ڙlnƯ9qZ> ,ko^YYSʜ51fX_.PU cb.?NxspGQ>~s5R}`_퍜$3 hhx'mE` #gNX e^jJINfb4&ژI|ȫ+ʋj#ةzeV.9,L APIr(. 竂rh5o,Zh"11J]+`^vs9g(WV)J9`1wh>`л٪BĎ+ IDAT$վP3^#1))W۳+p*(RoEJRABߥ(s,zrx8%# >;mO5=1;+G F%d u*CT6&Nd%NĠU(":J ,m2wab׼k+/A~`KăWylrcJ5-uӒbTc*(+U0}nn{3V( R@RJꕧ y qB0F!kGŖy -69c$v\6n/¤kGTKҚ01T,% ̮ Ý(0&P3O&kd UPXÐNQp(At1FEBaSVC ,Cj$CHc$D g5wĚgvK8U"e`c`|?P)1Ȅj)HA!hgI0#X]2,!!sx$1 '8 GSlre_w˃)|:Om\Х!V(ŻH @MEbci#^dj).8RAHCPq \^*UR"EOSvZ:P-m?P  Y&gcJh$)Hσ! v;OFX)gi""˨7.Ŝ}ܖdu=j@f@}&WQL&LY]^'_έ]^u/b~ڀNrY.\کEA;\̦GXg0YXZѓ]Ʉ s/~Y,,rH IäJЯ~S&pZKD=;Y[Yَz$+=0< fy{9u> } >d"IV$0)/786>d|<~ǏddZ%.4Crϔ^FM6;H"hG K2"p%Y54)l/ *Ef] $~- '*Y$90VqH"F8"gX ,Iah$ $5a*(mN $5wER ',Ո6FB2LE%ƦLE8bdnRt /?7z0%IʴN BKVggL@9':CaR)sz wW$͒W6", ee6x} *+ fh4 NdMIdGh}‰!8@-6WX_X47w0t~ӛ #b2lB$Q/-ry"g/՟ά!ٌ̝/ٿ`4O֍5G\~%x6G-K⨝52rzq\MJq<8zGSင C .0<Ĭi-eyf&̺.+.EOkrW ;X,(e 2q° yeʰ)Y9Xv q eM!f]h8 W9L+M5J@{Y< `ivE{~tQ;{7 |_}k1Q בnRiiŹ"nСRbD"a ÊuPe\q)Y,1%1NGEՒ4aBHYaH0%&f\фtLB,Jt$_2U7v^,n2_Gx@8QMKl;$ Z4-ysnF=*K aݳFrs`)#jMʪch{Ew/xy$k[,vw%QV q_!aJ?80f.^_iFP,V6JLS|D̩cߍID#Y^=UUC1{oRz,.T0(d4phؿ|AB'Xc2EraTLR1a#><bCʏť>?LJKq>c%f>RT8]Z+60彴7JQՉS'4y5u׆BvSč!vvmY+ƒ`H^ԉ԰r|mMX!SMKŕSPrxRa/APN;PQ:۝ʊc/-*N,U1eY XŦBL*/DTQ!F=NhnFͯe?ڜ0h2Pv,[eXUphGCJL:gzyNhDm [(LBȕ$`blI)g]:'vēGwURb >t b4$WLJhLԁ#e ;@h ,/.PNCSWƧkm6>}kyOsofyn*]H8y*nybXsi, I̓n|Xkv^Xv{>5u5G?b}QL(Eح 2.KzfA,8C">EOm gHh e¨?1p:[?~+^Ϻ@YG ãGq̭9LU%0X↎qmeXb KmdRGޟnUM0, v:F,KoVsb$ƃX$)0 ND_S>ؼ wWfvwxB rif!HʊA&<).>༧=G0h]aq)2lI (PRJ`&H5$uS_`i>L%\GZp2#]_grVHu-m޾?KK/a`a+S+ɎqFi 2lLGeJ;US]) !\H $ӂJ-QL` IU @!B%5QTBv!i(h u-/l[=Y RweD6śnC\ܠ-:wV\y^.EKQf@|jN$s\X/O憙lJ8ޓCn2O= ~{̉UB \<r<63;><{ywyC0Y JĀF WȊfxMH|=-lzce^ElֻOrD!wÑe<4$&Bkjx%al ]RI]2 (Ϋe=Gc&b)w䬥[-#˹Wr't-ha?u"Gw&)wn[><9leWÀ.'F-,Q,^FBV."S߱0s*nBT-KR޸/W޸oJC|%`4ږip"gE\2-b%ԐRĸ~H+}Rħazb9DgG+!Us:HH}4C+2b0#Ab1߃x]C@d?>'#@ß\~Ӝ+WjyA ʩ:En,^P,}8}7_F4 ]ՂAkhv#^@G#{" LFʭ 3c YH"WU X<WKN-=eQ4+W tԹ21ɉ*N ۝!.dҼOy#uWf145$.?7V0*XRD!J=B\ip!k` є1 $ZUB$` %c6 ng&E\)T#4;I^^ [aj bD&Kpo&BBbP0( JD-xtPC;8"g-_{U^ ̸hs lK-,=~[>=y@{ˆ+薄a 3` vO^!NYX⤗ԂBV4ϴ</ tih(8/Dfo|(G$14".54-o 15AlJKK|/kX̝oVRF"æ}bxkyɤ|ŔfiBߗY}+tu3h1I8PRV_ʙ iwͿ '3>()6 -tJ1bIH0+q*7XXv;dsTG")@{h=)v歖epC^|re ]aU~1u0ӈxo鬡kj#X"1,VD(,b:оK@EpdBP@Ց5IJD%İ5DMR%FԓRM1~Fmeڔ Z8ш_ 71BN~/Wt_sHRל⪽J j "0qg?Ea 5YpC7+1Gt %Xx?Lv}Kѣ nohqAyx-@ iIqAo~=/>k3+/x?PE2t}yU<Ş0'8#CÆf>0&WN9{yp 2[hAD4$L%/$pt$$$; Q#*ɤII;~Kî(VaR o/j, R !v+7w)$'`0 h݀80z.lqDw}}z-{o`!EJgش[N(<ǤA!d$%`&s4Jߪ7&WP3- e2=`s((60ІHSgG&+/ Qa0˙RxoO٫* ]B̛PԈ,H A@*JsC5&l9`ʚ0p+qsWY\䌶1_{\2j',%GVyr&~C}B8`ФB{~>x,[n|?x2\2ʡnHY3% aH0 vEe5jqX!20_C0dL$}_\ q̲QPG@dG/xbL l7czp 6hx JGg,݉l/.3qy9\GYi_3}䬚z=$Oh慤y4<{ :^8Hg$@<_730cLg\04==>s-B\ SoKI'}5_6͉]?O$; x R^Q Esk ʢMbp #g2Jv~Fi6( #?x?T唅;hۙ<[bkH]'Lbjr{ʄa$/@,i 릛IqU(2 ,g~5Tch狧1:'$-6_j7"okzȉ1@7PFȀ3Zd>O!!%2!UuBC[+XUBHbbPٞMAH0,I"l+5NΰLꯇAD&Mq8G!q8&Fzj:!Ĭ 0!+˧i 8s4ta)$z q+!w? Hh0GUZ˕'1$4MDB(h%DX 5 rTd7O;cV*D #&x[<w.beMޞA˙"qab|f݇FXg"uv>9*'Wak) xhi&~;1OVGf:¨S+55]c=L]3"2eVA-kyMOJx%HE}`GS% Ϧ&Yz %Hs}ow}/FlTN]fÎCM@}K 3  IDATĶF e3h "p6Q!#N2  h L<,5n/ADl@D-a0x g2R bWcA $4 duyG[=h>-埏yP(<9GUmY8Fvi?Y<?F=!X>CkǗ>y+?Kߓ&;ž Jyii﫹jj%A2 n8!_+'c'&L ĞԫFIb%T̂e42L굮k ʩЃj` h&N#C0a(R [C25*\)=mY_%8+e^#b{b"W아I9Wddarлj,`aW,/>j=R4tHOˊ!3abhM .RФ@FOԿ㹽caQ NMd}$}+ 1bτE=w:q=<$JMdaɰbX=0Fc4 )׷f՚)*:BrBa^M>V+TJ1K#NX19M;V!?}"g_g+bwF =˓ɍ͋m5lS\r[E,/SNׁ_;[-,..H"ynno1fլD*}U9EvoZߞ'az%QM4-pvtZ2!!ig$WRA7̑'xÑP 5<;_KOqW2' ƊuchB  eØ6 XCr;BEzhiD!dE {8XTHAhR!_?ET!\t  ڀG oǜ>_ GBM1G:pA84WW3qn!O?S;ĩ 1wsoi?ʓzn4a.q'MuEJϏ:k:}rxjsӃl?'z|`JFx dge /rTf^A:V9x}cc0rrҸ!B7n\wX&c^Yq;ß?7}9i}{ޘHriY{-, FBMWKG&+:s5-dIDi B6WAm.IY\~z-ͩp7fg܊,jMbxf]f*^m_U" ?ynno0L|.D4*U!gV^(^j2W=v*mqijjs  ?|x]rF!KM^ca+S(Gפhʄ"Wp_$2AK$6Ȝ|N$ ֣#]P/,01B%Md .t=;q:Ö֒2cʝɠc\ΒF/,D Lе5m8!{qٺLB0-@`С 6∩! I]@dHK[0R@Ѐ%fHN#!T/)tk1:!?=w&mΓnv jO\" esrwp, #$VC#[KVx9~~*I=%!3V,~\w3aޝsiW96ӝ*}!=Q9 #NLC tz.|g5OP/ e.Sk '@ n"}gW?s |I_HLGRg"O;~BeC>x /\\7N^`s!s |w'G%o`J|ϗjV8 ՓˋđC̨eeKY*g4v|3=G<\Kwͻ . +g~ꄣZW f kcx^Ǿ']Op7DxR򤋬G謙@'r! S\w2O49QMC+cn%Ν*9Y lQ9><_0aR+-WR)FH-~bՂ#ŸH& $,dz9[& ވ}$>% #rWN91f:dlZ!?UV BlId9{ Kww{X32#ʵ6UT JHBhiZ3`M tۀf鱙n f0fh4AhCJRm}̪̬\*#w?H?_u2,2ss|D(*B9TH0cc脸PFqiF$4V[ۻ9zv= f%M})8M0wAsQ$|')_`o_d<=i+ZD \kרG$-qiT C# (d2LSӆ[V޷d {AE~jK_~צM:+2dbRN 3y%bbQ>F{`~'>P0*S? ϱwn =/,g+3MOd5˰&H(Xm@c[U9bT8Cf 5brwodaxUtFn!t[0 fڈLѿgOXOa+ːU\"-t#&-=%p!ha? ߼ G[zH1ċvZ"V#ΐe~ܢRm*mbm^ LX0wvKl>"#X3ɪ;PKR/rA S#K c=Jhi0>A&B(Hbjrե%}}[Yfvv1C:*¤b 'w 3ʰ^pV`>#c#+ 6VVXGgv1hr{SX"ITB݀$F}FV$o#(ؓHhorn3 ]v WHRIR$Id*6Dd \ )G$q̗)6>8kF3hYjJqwz~hX!#\Ks5iE`lhL!dTv6"\^KIVw+;Rqgг1,>(#| , RJC"|JJPa'Eq^Fz_A\jhI mw)QzPt*6Zݠ]9EcZ*RȰɦe[ezig,l!_LJOYieJTHBZst&j"]"AXhdqڐ O,bW\.k&Hwmp8B3Æ3-rI7qC␋gNq #uN>HH737Σs|lt3N$J2*}9q&Ik)&VxZ`d,]|ӋO1dJf&5UCG]3qQ$X#da*HiP!ooRzGpn,.\L V~&> _;I/:v*Ua(ОJERmVz8Heh:cr,lZhp+0/o|}R,RҮ´܅c$dWjB3HUDi9}5#eC[ &oðx)K(t8ўhgxrFI]y"O=FX1!V Dn19.mBTZS9&_~? jք$DI.*: 3@gc-Q^PQLM)oQ*XsP*khD&A%Mck= EPx8*ϭo|TʏX> GDd=:RPMcN)h#tN֞Ǐ={dF<d.g2z'^|}kr iG(5ntڈk߷#80qm Q5\0h2\`[*1D)#AiU~Z|ƋW{g]Vk E61Ldk6"ǰa;?^ǭ7Nno}ޑ F8a9٦1.a1ɰO5n+-e Y!o"i4912}G3玛Ztu&$+."PNZQIǐi`EkgqN" oiMɰoH.2-"p55RxUcdi4t䱦JL14EY"_=E*̬2lD8iD8FGat1UP†5LtWO܆S (@,QRnz2 scÏ#B8Ī"J%p-$rK'=T!|$`<>5N*SCDS,3t%vrƥ4#fx@+cy^6| 7{+ܹ}8{H_A9FH:E<fb"1,XeArŠ Z”x6oFzK2H93\5Ɔ,O,4:rXFhDZd %w= uLY^}L؉șg`\vOG*7KoOK=BF8B[lUΈe6XCk`萩`%nqr"< ڎF7_8~_c$湩f_Xx[x4ecC~IC֑$oKjVzU=s*! w&Hp-AXƭ?@&Rnlymڃ(!j2n+~o8{_篫 ;#LC5j7IrM_wd6%M[2E$`!>?}{ZT_0इ_%84wM"k g|Ys]'O/Ż{TNTBu$btxcG402#1s5ԓn=GpR9XNͰQ?ب|31͝t.nZ6"ش(SMRYOp5he\˼){ct$˹c2*iA`(;@)$……nU)P]qaXDE/Bͪpx\A.[Y\ZŎoK\?/~y*,p_z1YFKf&Ļ=eŨ-v49b636IC.ee [ώ3r.{d/CziҌŜIlyF“ %5.Hʈq`IW1{<9"scy).XHZԢ:&WזЪI]6t#SȹAd|1Ͼ}3㱯}ɩEjx;!TzAARTQ`giac%BæƂHI&aZ<1$xX_4̽׉*N7FU=ri&w"kE }*;yrU,o^Bvh@b:#0>r[lɪ֫ sCS}v3Gg TeMP)6XRC\xjI cp1?v#CfgP=<ӯj.r`2\SwQ){6F.c~j{: //8۪*Oy鐍fXVry]S,N&DRdNuPpsc)T2l;HPE\Z2ɢjc^~nSnB/$5H)R!T֢Nsv/츰;7_'5i"wKH% O"F)R"GTpN@^`1eB: .g : ?DQL8[EAΗQ, ,8r KwX?h^Y~71ü 9|wmk$_~.V\m+FXrAG5i-z&EH'&]V$+T-igh_!nEhטݝspl*9 \RsX!b lgLSNFsJ~c>~7z+8]88=d ש:i۫mƜr< /\Xǿͷ܉[LM%3ZG 1dn3JXoELF ,Ji(sGNF_ITԒIU`Y zW^}YgFM<\f3^Ν:rg^WVx}A>Z@Ոz&FEhbMIŭ\d˒rjBY&kL_B4o1n ([EChH0K>~.(̛'kKUKދ9u1 6^gSį,̰7Z#f1lBLM'(!L$' u =ULVb˜l7)@PXEY^[Xb,4Y(;Q-/^Ea"$Ry %Q7<~\ďgw e֯xJSr4+TN~5E,吸_xNl/L븅W?zk}?0>#6;ERzr RÄc]ѝ+K Yv=Vn-x'|܄0-&!lzYV3%I>@^lI >A$RDNbGsz#Ac0dw}3ww$}3ȝ BEXkIGCF}CDL{2bKg[w*cdeǬUtFCI|pW^Qp8W a:((ZJzq0r* CFShV^+ j M6kZ 9d~ z U2(%wŔE}a| Ml'@c9qGR k?sӜ{Nb bSS]N*F_cpYQ$ 5);ՙSz0 + 9dD"ţ[u RxJ+IFI_HYo2Z| salQjIT'=t2é>|^=vX=ǒi#"R)ؔ$rDަ]L^8Z'6h@P6V*ԻZȈf?sVuv2́ΕK޶ ^4^ \Ҏ|d %@nςvCK2e3zz30`Es< +m>>YqaVs;n0TlJS,ٰGSN2jˈn;OgGn|pu08Ba[<"҇tzW&E^!RRHIɢp.?Rgo)+H/P9ۭI⧒cDCQ(N|0)%-hn 9-Ci}P8"Hbc{? cnG_)ْ- N[w}EFԈeD-MPHGDC}qY08"0l9[06bB&8#@E|ZJm >HaUa@K ]](!B:7ӠAXo$J9lJP^eAA!QB^7{$^BBpHrAp'/P¸4_g*d|Y^hXDa.JM(Kn;kGiV?.DE[Srh*΁:oGc4?lڳ vr 'e6D\#n4ݗ!WI)\=~zzU*'=ZO ah:RHa6s:tT RU\E{7Oc '_a񳷿Ӄ.o 6]3LMo&X\aFrAy$Zb ÉoFƓe#Y p2'qJIa%CXo 9,9R$l0 sLEkKlcc۞][Y7 wKm۟asͨR=縙=!lJmB'T:矹ȫg6=b:nb%: 'g260{ӈƽͷ ]xj}A1eJuQs TǁZkAFڦ߻O$*kx,Eaf8:{yJwxŦ0<@=YbAڇ|W щȢ$"v9"N$VNKvb3E6y}O}WMWi4h,Q?Y#f95: }<>QA|vQvp>d"j7D$kUvU6R۸FOv1")]<0W\OT^{yC;'k|Wv?G s+mAx#ǚ٤]+#HSVUE>gO'o>ownr,c$YMR? U6yj 2BLhByDsua5Nz0S*MCi`C:nԻ@ (K1} u|eASAD`[%T7Cі l|_RbW8Qy[ _-SeR[n;=̽PNcXQlѣ:'}"={],D H1B ~Tpo¾7 0tp sg@j36`9A#?o/ ^}K#/f?)ؽ?tgYf&̒t= *CMC_IboIAU)1^h"r!DRtIDoW_殣g89oņR+' P8r'ߠ/AgW=Ҟy̒['6̈c"U#$f^E+\p-*+q( a42iAs 5 YD)P7Tg/3q;ڻ47w2?JsK-GT]b+)?ҹDcklRt#Ŧ~04;a\x\1fEec52팪I łplIXX'vrϭVo]TH6pZR`߽y4L:Y0qD_Oz0y#T eL[-dyC2sAOyeNxDjD!S1Pi`^4g9U ^\Tk$;z\RWi-R݄aLւ݅c&/As!>+qxhw3ՉtT |l+ yNiT-у&9fН|=E3&&mI..OrڗIqȱEw7I~?a~ttf#:3&r|;D\O`'7dXg$Me(cV>z8:Uy 7n].'O.~\㱧5x `F%k!h4OS&[u*r&Mq=InL(6ɩܲs\a->O!g8)ӛJ@CjH1{S[;ޏ 1.M?<hwE%ߢHM}QbJ/dy b0cEʈq!CmQxlaBcࣜ/rm]8@A{?R틭Zo=~MJ8SAv3.A7Q $pc:Wh:(d`}~~ī*cd8 H_ey$i`ȣ-u=1TsX9ϲpQNPBDBпTA:GbQ BP;ze%ts'ЌYǡpeb[-B(HMepvQq`SPVChK2&ȥi*{ԽBIT>F+zXvJ%P)9դXd)jP.gUD})_c~CSØ~`|lNrP52a#xҋ3tCMfD]?{~=թؤ1 fy`mu=m T _ffa#i3q6o[ӛ/[v;ش5F :9bۦ}qsޑ8 5R:oOn'3 Y1H[|3lgSus=.W<6dyNM |?KN5; \wO3[_?\O{8}H؀c"lT#bPE., BYAы 3d' bpdRr{b;O+% ka܄86oF_ !w,HR&\TF ai3ٲƘWk@rfgIc{~`ů7ð\#uOYqL}T㣾×;q +*\Q"sHnMaۿIYͮˑzr_d\61( F!88`X$~帘B`Zd曨Aڤӯk=h{ 5 `ژH ԣ +x]lZo ooDޑp۳.2u\f#t-6O"b@4L\F?YG7_ݻwL`mZ;b0f1Wml I6}ħqnڠI'@6m+XaM[+H`jD,OF4+ /Kpmŧ@̹pć&v|3fZ/sRW^qf-ے4%Gu/$zFaF2"M0{'FhSyb U^^tt3O!3MIr.Lr|՜awح=ԛx{o])7<#zR4)L(^{ү)~zO5=+P(pu=ϷylHbeJCdbeyA<=|R]Aer,y6;e,è3eg9ޛL4_ෟ}7zST݂:"u<ǭ7Vg4pq 4n,I&Qf 3 u RfL"tc&w߱pCW(t&h;մȭi~XwcJ!h9T7:.^& =5"ƚU@q~wщ +J>2 =|$wT'kx~fDT"RBo.t5y[9tBPg^(JȤ[`cT쒨N-f{;}q~&M4풕1=ccde[ʻdD4=W/,{'fXs8u\ZF 2Y"Q6 m,N0&%| 8N!Z. $ %RĈ>0Ndh[Xb>&4t"J'$%N/&qh4wz lq!IYnuX]Y_={sGegIJ5Džz+G|*c}hU'dWRB;1־.3 mtu2 W!u ܈j)eAd\e,Vk7oP[J#j~r 9{L[e$lnA@?xߡ05b3}[ⱛ C? bK9nsb/dz$}[5=&.cM͎V:!r$gʵwcQlMX;kPZdY  Qٺnn$~reL?I6[dli4 ,+ra%Ksti@ y"bIEj Z![]켧Cyٗɮt9aT=H$9eXwC7~q,D B&@FT]BZ~#zܸ)J[*^J0Ne Uһ':^}x?G ="s淹㟥q3 _L#dC ;|1?bpTWfC(%yqxqž4U )b2AL nWӛk'밒ǎHa5}i GeoD>%dHt>G^Yڪ?N=J5GU@w:YȻ7=rC0ljՕ2VDb r՗SqNVv8ӧV wh+hgBhb*R7aæ1&@/1.F,>v7>H^} Ffbv>8OΓ<"1_/>ǾBPBtpzvi/f"r Tl728L< 7<aH c.S_AhG+K G1Ix5e,K;Cޥd%]$[`jΎ ~A!{;/OUuJRX!ȴII )73A>feA`l.]8K8|7;?l2v{/12mHa,laN#qAZzG#TmR,L*iߙO[Y浓#Gbbo>8yDS/+ZS9u]<.l8ݴKtU{s2);(hF8O/5Gvx{&㐿}ņfd?-΋g)vY(Ob G-yn6Se8:ֶK(`[$jַ:463;Z\dQO;GRniכJfM>wZn঩ަKlyu i7ߚgߤ,ۿQ5h-Ħ`%(eM-gu ٤ SZְw1mPv_rH̱*r8Ŋ7.2!k]1c5M>=n' ZV:C8]d 8L!LRH&0~D |:o % ~HkAe[6sp#vnnyR ɛ:bwV Vw ߊh zXpeS ř 9&wGw_=+J$آ_0Ug7:/s-.>;-iP^I[j.FdT:yRM$qiX%J4fazv?q<-dQhm݃55{vQt0% b@}fӯ q'ۜ1n"NFoQFJX-IR9;..MHKJ()X:%t,,`cX 0Ԥ-dNEz+K <6?wZ3-Hi<%PvA~R9h!̳9pA69_9p~AKIFJ0R9 ml!I#Z1x 4 v }tVrnv ޱjnK0D1۩3NЋzf;O4RBh5Nb5&}AZ52叞|32n%w0INȖ+ S7Eh.D2.3SF*7vle vI(xgэ6bm[#S7u `tz#?3\lR] ؗ^=ǵ[׊Laß3aŋӯs3CJvJH}Xб"RK!06TZ6c#3 q,R")  oV(9O{mpYf0I$^|=NBRG,c(xCmM4{5NeRt@ګ\8C ^an׾%ȉ c$,'>Uǽ'45&N; ͐Bv20"/KEqq=9X)!=Ҭ@d!e# ߄vC+1# j:KLWHhw;G(o8l(fBJ^AY_?#D-}ȣq 9pW{Hċ6X>O'WhVNfU߉QIqt *~aԲiaiخAY6^i|'zѼl#* ̯c*&GxpBX~[F %1m"I|qaS&¶lh!#Ӵf og(:>kQ6Hkyk1Cs<HG?#a.:58S=weu^{9v\gt! 8 Y!_/.`5AO&FuBJ=( #0yhЉ Pzg%a^sfd2(W  lx %1FaI>hicD #H"ELoe4H$p!%M]՟B hT4.BhXH*K[(K!# !4Ӷ %#HC Q~k`XA!3 ytA&-Dυ ZJ4ƶ0 Rp lY_6Rƿzl-ơo}'MlLVe)q|zJC<02F h䇇I9ά.p-S|cd^bǮC8:uV.a01&`YH)ELH 6GЖ!RPPġŐ7W),ezTICkaf'>tj)\72$s/t0}>ˣ ]>JhVn N> aCe>41d5~rhQq3UdzPf5D*>6z6zWX1&P)G%2hdþ 'ʢ!]M fRcK&4&tBX9X 6LNPv^r=ۓo^8J. ZCDhWPeNCD`2I,,M'X1_i68bc0wET* 2)фn|*]4FEv/Elp_<;tk=8ͲCS,czp#$g\Ĉ@|<`L"0X#T̘M7r):>5  ">J#=Ln|8u^ `Ѝwb݉lMP,#V!(Z nLJAb.auA'9 W]r]QOT%V`eQ+׈{6J +A8b#ߦ /"UyV[T񵢧mb\[Hm [ TERV mFO9yܗcip z~Nwd7E/1bO~(n&ICLYL1|2UVCc1Xp[{g|uGfTz7G-Ɲ.-iZ.vq5y=H#~'1ǦAƢ%;~ӬVi־woO\•BW+A9[Kӧh͖gtq IFY IDAT! TdMŵ~~?8#nNlҔ@ o1|Y7!,4#p701#u0>I %$[Bi`k,*%SX3X;|z=H9JӈFKLN``_u6$c:]&O"I@n%&Veql sPY ASucќ>u7qe&7~/"/_gYŵ R*!Morx1QLԍI@KA-Di,&|G*k^]`ԟ C&T!$#-5NP[;pQ%V")׸'Jq4Rsk"tb1)_ў'GsQ+IwA[#2EpFQ!{Ð-@4Y"` u 71|*TJm~MY)M1J[Xy?I4iC@g9E(K4"֤x(a0*ETZp,0X&f2hE?($Im}V"%,Q#U@:O'w/}krw_Ly[H ]nԒߥg0v Jc wC6Y &@274F0ryisPJ{ Lӓ2"Y[blwyEB7Rp(O*uJbX/D8 op6'H4Phv1KH'K./ Db}'#]pYL[{1*fё!xkw T qqz&+ ^0(p]a:iH6ҳ!4m- a!K3qH*NL8ټzAru)?AgGXpQ3=&PLڌz]>sW%tqh?=ŷ;qۯx\~﷦EωckAymGmI66ڐX\RIJ'MH1P?uElY^jΣ館,b ș;n`7Xn?r?KvulY晈ss Q Ha Щ&M R$OQ"@laủetF6-d\&Gp K6nLFd6j)L#y&ޛvD)=6Q#It$`jFb'麗K 3vVcܔ=p򛊋qӐG+BOp Lɧ-m^ZgA]dT s0<#<\/Mֈb @'ӕcAˣ!&,uU $\RoRu;5LRu"8A&*05I\ %`ehҬru#;1IELb'x&ӯvvǴor.avݳMWc\nGfSNma*q.B(12)Ctz s`yGx~*v\Y*'|mT/5V}7ιkIx4GBatSP/fnÆ S&sWI"}yE0TCTVNrs˺Cܠ~G}=$gԾ 췛<2}5fЃLf/?ͫ ʣn1n$.s_~c=fJ,_( Le>>M>4x+/1rc?(LJD!e d ne:_,6m׀$cXI:Q,vxj>jAL]z?M1JĐJozAȄ9x,GL\t4\+JLL%}e0ܻd a@/X>aB@"ؕt8SeЉ!UTխ8j5\@hxNg"k8!06ZD9]%R>'\UG{l k^2vHa8A=mh/xO)^YLhyɔa cYP+a Wֳ12TvDm>7fw| ucP{7#" R{ː# Vj5>J7C+ |&,A<Şv!ڼnGr"8Mg0Mr /Rj$HܒGj> 3e2`  S4yt( v=VҊA%!io )h|+zJ햠 #DJbdilw}kЉ0kbz `٘%iFݏ9oxn{CdY$v\xg1Ur,MR7p~)F կa+%OZl_.{4=_Svv#mjjvU%1$hQ0 I LH HR H,H-'"MZO|] JX[[ě4' O>rO[.p)LgT'xϪ11iS0;_c9(`.25<8˭Zn1wk{\>6L|$~pỏsMIC:wm4ĢvhI ׀֨rwY6p:{SPh|+2X#v'Kc+݀1G- άjCM-D mtU-mҡ +Eu Q:ѽ *CC%7^Ewȑ\|ة']%xUc w4xZ6vnZNzGwm2)Qc[]Qq #F9S˓s(g񐳎5¿i[Do:(?|pp%i{B#jhgIAA܍g8vO,Rzkoz-VL }zz]]]lqաwQ]wwyKgee־IU%KK,lyY f 3=t{M7m C`nll]^%$k߷3#3c}Gd!!P9ˋw&]-j]}x cā^քʆX\cRyZ[YVʔ3|/v@ISR4Y&1"gŕ ) ʊAAXKskJBaK`3| R( +bHjNTZ@@8*p\UJb5y #P -,2ʈ&8Ӗ!Ut3Rz)ǟQx>Ǵec򟿆r)2lM3߹*'wvlQ֯e>BD"ո1%̒f3^ތSAV.A5b|œ&xzxR1ݳko8 ݌ͥW7rM_A,)}!~~됟r/$#G|IednG$0JCbu MTt)PFcC]fyJ&se?Ǹ~FI-cmS\Q%0\gdnkm:3V6S,1 ]Laou~!&;v+ok[Fݤ%%K %cU`6Mo]߷Ne%L](5lnnJMO*nJM 9T%hΣD³ d`~ZG`&|r J:xGcVco abBӻrK'ݳz[pVL>ymTP6-Æ=΍x E+#n~oFJv7r{q 't b[4$+SŒl8A q`5y3 BjBJɠqxV mCLS$"I)Ijb場a]/0ޔJD:]uJ>4՟7O?EkwId#|hK mQLu1\.gͣ<퇸.Y"{א':)frfNMW~fGv x-S{2Rc8:fq.bW| ω]^6\ĺinu3}f3F }T rH)#|_; - i'Xj/~vq 9{ ^Tr`qC&vPa3΢^ jP{,!rn31k*cE($CRɐmnS|__F ˣD :_fNX X,Ċ~1G_/W1̆gHYaUXJ.LDK0qFjӘ s 5F\1c뤌 faQB6D c$GV/)phe@f$2Ew '2b㐶RN hűHᤄgYCZbR" _' EU" -֏ ـ;e0͈f^NmJڪN1 M&NS0.:ˈoYYnz3%_d#+&)~TbQbSZHKzߊ0#Nvz9r'߸cu`J D IœԈA!P f(k0;*Kb;h&dv+Y<[0d F!)}hkwt$Ppv0Sf (4Lz<(%X?}16^odɷN@0Z(kPYlmG*[N7~!! mJCyu֙ З\>坦)WFaL7gqG/n %&>MԮy?ϭ`7ޜǽt=sZLxdȡKf{)iç5f͍P80?Ķmҝ,/gRl[iz)1=cx@ӮT4&n, +-BRe"E9EHVI*K.}Al{Ǿ7J,Z/<b ͋_ip42H+`Hqw^[e-{\`;|-X]i=w^ş?/w0xN||i85S ^".FJbM04EX h!"&4DJă~4LcQE| +A5PiHg=/,+X`q=' ¾d:r5C2nRd3EJѢf IS'yCH %dZQESS 5 +juMt&vAd LCpbEx5MRp3 Ma-d:c_04՚(ؐ=[ܬqO8Gno\.G)O2r\d4e H#W]JsnRTF'N'J)=R9h/8$Vv"H(xX!R`lFE QKdT i D;vu&# !C4D \E87q IDATάbin(5_<#+8 /8 ]L?vnFE^Mɺ1 L햃,U$7>|քCz͌#Fw7ݚ U6}F\\/^iU2s'8u?Q6|c .3fq+.}Ԑa"QFb B C @5H1XA X X0B b {122Z-".~:EVR+ɊD`M Rcuݑ=]AZlI,"T?r4IآRC]ZLèSK`BbpF:>BJXƪ /k3:lvc4EɬBP8A W"az=Z -1aSƍ-R*D)^Qf<~хͯ[)^yS_B`;g2q2H \,nqk;mL_ Z*/v MH PxD3KI1CRUi(\Jgϴ-aY#/عW $ !eF*VtѴ` #,c.&v]HPb% ,LhM(c<-1yqII )5ȋ#.XdZx0ĤD Mb &xBHu@Y,. RH-BɋB;`tVT%AHE@&")HmPhL+0 V8*h-jc`_AZI@_Lmuy¾Jr\e'9zfߙw}s罠xEmҳ=l RX}~Lxwl kom䥣랿Cvq߽S0+3sz/ys uY! L*' N$)2$ 21AcLY {,@XaPL&1V"T68E 2E#XSƂ02 !ڋ'V9>6N~.2H%r0)dV`7M2)#Q1֤!uA  ;Z Zhbw`j%`a@Z$%-H@8H`Ց끕H+1hȰ O D O`-kAfH#!5X,Z)P Bc4QAћ-_7R.˽L$#n+HS" Rf,d)B@ZcA ^3XaS!$3.*1V#RIx?|&~:{[_LNQ'ե 4wlFF08 St+>)DSb S (=wIʚJ4JdRtW|V2=׺ vVoV| UHl8%eFGfp^,I$HǢcC)2bC]Wk[t/>'}{Z?1ogt^dYnq(—(B\!P{ls߉EjAf~Ҥ7QIJl^qmA6Iyg"~|lq&{L#,i@&zc!P d@Q.HDIO0eUBTm <,b:B$:kSzu F'KPĔE>ؘT@)SB@/Ɔ&1nq':]枅#̶/G,7 ~Fgڇ):nY?gq!O]v؇pyD"~Mù ~hnq_|7 ÎϳSoc~~Vekca$}Ï>u9m\ϱk] 8玭4N][5S͛לf{;,ܩ_cCwoeluO?q-[rDh,GlS|cxΟR)!яj6>B4FwǞb4-3 6g,aOklzMrmڃxy.5o}w!eg=*BWP"&X=f}!$:>Ase?Hb?XXꦷu~Pa6-=@r%_V=jJbN;=䘡c(Ε9YaɈj1}YH#-jǶ󡷰kcfއ-h]n⬾ K>\ɛ ټSnݤu޻Xfۚ|J2~ˏmv#6kC3sw!pO7hW4DZFB02"RhEײU,(50*~17g-NVMbSY5ݔߖy"gczw-q`B9鐙?U}޷Ρ =זyOPvCqhϭt9fOF캹F gR+4f4Y.R$3E;[_&+ >ϧ>+w^A/:p&I,q:L:$m,1t>r4I'+0duY A|7roX`hhcC,Zb[y;vÜјDN5S<6̚ůN4gn'YkJ1k5z1L+g|bѥKAYS?اIqE140rk %퓮-Sʤ7:#m|䝏 kǿ%*}qS+W2>`ץQ6t2ZBa?bc}_*2vSBuCo'< ȢEOj+)5L^v=@9 MoGVT]14Yܠrx4Q=XPh&p ڂYHbIBmJ...ʩ)EX3;cTZx"bR4#:+n3T-EnII23 HLȰ0} –-Bnk >YĴ$p`vgAO aݼ]ZqCǣLv],z |CsK?MT;>nEf=?_j33Vj=F~珟sMNSZ{'%*9>$Swԯsһk|8Ƚ'/in~zW? f|dt_j~8jw{ ]p3y}C?aQ[}Ka;_ϓlpЇyvIIcˈ?L3'S%o2󭬜)1c? g=W-\ټI<;Nps U8ֺf] ƨεQ@:KnڝNȎor:B}v὜_<MP.6̪c;g>f2],mK{ה7f(Hiף8LQKhOQks47 )lԒ=o0}j}te]Oh<&i-.9R7y,dk\aBG\8=ͦ`gt^ɜ=B\`TQ9cU➥h"2Rs/Ij'(2&Dp#nCS3z 'xk^bg2eepaVwBs3/]Fv}%d/dv+:#\ߧ ֶ -ι-Ǝ×c!{Lma~#ŵ0FBNR=]iYwp3s/0G'^{ď3#/aem1f #>, :h!1.}u{ )-GLO|E3SlRoQgNp bk*dbWN"joCOӘ>HD &+*>k6DBXА@B4Xb‰U ذes.֨پƾǖUg~$1sOX^s22Jʱ;hOE X(ZHO:1gK8;XM'WV N}}71u wdC,̮3-88&s m1t-[ȯ[IN]\ z?\TF2l#aۥ۹y~M\}+i4+X <5yic_CO:2yV=ww9ߤ.ݥY={rXأKؒ F`Jxn:92$EV45WyF.- HaxQIŁ^MXeK@lYQeg  ki/14wq]TWezq[kg?2ăQ-lIFapӷK8"avfl|uoόr[~6 k쳜`/p |1C\Íl렳w>uGhWx7^rʼn48®'2uyHRYZ'Զ"evuIN8P5('`1DxiJKxtMQ C\@e۷f3N T26eGbM8s8KZBTecBSI W⑊QP䱾d»b\sb`(f_hn͗]p\ 9G,+xSȍ 8YOZJLd\YFIR;4!S;ΘM%ۧuo3U+W˽^t!: od'A'lC\.bVvDwvXmnX e$n3h9m"Bj2`ǭ}?^G.SmMq,Zbkܦ*ҏ6O}:bC?30:m̱VCGݐœnMS1+N#Y`_%j{,WR"i65SRĴ.Q7ƖH/ E)L`JBOg2CIl_z|4U˧qGh/2U'+R8fqǍb"=D\gM0jtN=ŒZbVv=ڲ׬-D?~=:5lk+.L2S΅7_㬞NR5&P hRC]J2Y&P"+!̎#ePZfϭQhh*B*M28d.a%Yb}C(IzbY zeRB_rJjx)& .7 t"@r7ƴO Ș;pm'XCz ,Q,pzD,:Q(Tf(_S&)}YΜkS' X`gvoanWIfY2UQ]T=c9֐81j:g揀|>4!J/* G QĒy6F&tQhʅ'EFW˴;M n ϫbE ҐڐzdF!t!Z8%Nlz2@YP@!HLRЏ"u Iԥw(ec&R2QdrzCF6j<դRwVZ\ hd2uD`%P|Q8P#,uG[>!eH vSrqHy 4VĽE c!ؔjyEE./8& ;8ej]r/KЂGo<*6١ o_M+tB&2$2Ba1Hq-Yغ42eDHPZ&(%Ur뤯&+8jp*$!Nז|2$%a!3q~AD(J׼Ͳoa{NP G Wxo,b"GzK`|zf11 #Dŵ! DKbE?-s7G &s̮I'fSNѳ7: *eB`F]. IDAT$i[jxׅ}l0?JIߖ̿9Ktz㴳"~bRB\U:g\C5̈tRRj*<) O&WulR!WbfrUҒ>JnXM14%]$.,'*b]& F7w<O`~p {ƙ^exHn^*DUŀ#٥h6A ^Eoh)qV+z*1'{;q=~ga>>w+_f:F8e`mEI| ڕ:#H48P0 ]"-ubz:FxA|"*3p%ccKdUDG/ ݇T #$H(IKd G5·wO~5='qvDV؞!u5b̕\X5IcL܏IFJD\"%+ Xvexo~~=K$[pu)N>8> ^6δ)ʧf_=ϝgCgxYԺυE:Y5T5ri99--' <ͥQmW nK}oY"F`:=p*XG5HRU ŸH) ]7!` 4-SpJY!#~xnFECKDvPE!RE'rC %CePP AgH eM-ߚts|o4p@%Jb"EC(Tʤr\]KSQ%)d)%Y( F=L{k|h| 6J8,ωF)ƏME "8ܠ}D$g*8?&}"B8 Qr[4ʓ+#%\6Zܽ+i|s16:Ƈ3qGMmn-~j |h01^W]c[, E\[~ !Iv%{{@}z0s3OsT9>A|a֜yiåT%*pㄖ4&:*8!޾E LO7^SI$5^9Kv4`0 r!,9D賬rgLRjt=V|yWE9+09 OhzVc6 4 AspY3]!7%9+m!Xd7~vE}twn*Xg'YoyoS 똿zLU֬gcjpl,($*m)uY]jzт/PQ[W= ІH9{sQXl [)~/鈨 n ,p460$ލmrt{̩=Y!OYM'#Er8Etq\r.b0LF$O/eDA%` ɚ0T`"XLbjɢ!@2wtg"%LsEb&8R6D69I!k.iZEHiCSYb(mEa:i')g_=_4{w25+S$xmrQy+O';g"<[>GwAr>`iwǸy)V_F<wK/,O/+%.'e/s7WՀg0!IRczF1^8W¹g/?Q%RWaKQJuPx:At;.X=wh ?S_)޼i/yddCUxhF{(hQDhQ4ELSC>;;풶zdy@zR{zfZcӴ7uFwR7R/z utJ Mqܴ[1gW{Զϧ661FYJk|-/xYwYzJB>'iN/uF`VP);L/{|Ⓩphwp+SFq GP NA:eJJ-e vBHSgQP-2ͮ)E2Wx~8s\a#[ܮ>07f|+ K,}[aqnoϙZ@gԯ []c,ma뿋F7'yAekKy!rj8*ٸK3j9TGxP((ˌI N<=N ‸0V/f#N#ʁ1$u@#bla kj,1Y@WW)/|:P[( $'g癤6)~I'@xQlI=`&y5;TE[تŁ4r?짜x7(2˽scL{l+"ne!B ƦF,#.jڡ%KbTh.R5xѢJD`Z *O(R;h .gP@|"/)CV eAD^g5&&PbG$6UDeb$D<(DԞ5/EΊ_\9rFwtX1a)LR{Mu^я}w0?ε3k-Nyճ#١蝥p'_:wǪɄ3㨋-=ޚ{qbD - G&5oj,<`n5|mԟZ>*LHb9TJб r*;ޜrfN%{]ۦ>}u5FHh/Y f{rj/m|o}6_}⾳1:xچ ;)ϯq}N&_˯Ń;<|xLhkNVlAR[G-w# 5˛}6Sꄶ2i;|kn/QNv,jKy:d܌I=sP7>'9E}ɲC*I&փL+W~)-㆝of_ vl.tQR_ " MM8< A$'#H:0x-$!=ٴQ]t[ !hwҒ"܀?cg&*SDTĊmSYٚ~CtN4& Iicg:ƩltO{TzfIlr_!o񭄢Q$vh;XINV$aS$ iГ.,Mk'9w$G:gx̠9C#lgQI0$h$L(>>z%ZHBЈ'$q4kq$J|1&p 6)1 _P-Ȟ(ݥpP%Av+M)'o;?Ae&v5JClDkBB w)YthDI*3B Eqda 6oOorm"^-Ig MĹ%XU%-Q)EUs|_3>X v*[Ud3T)S]7q|A_y vğkO_#HcFZn+7)ҚJ}<>ze^9.iQoNЏ0e\p-[g~ְԶ 9;Gg9J?SUw^O=76oT1Q^PTNKΈupCg;ƅBAu#Kc<-",WKJҸ`T+ؠ <XQ6E5 cHkQH|pjsxA FJHcu@$kb*OAXkSp#6 &{Ap8,s5 IDAT^ch<$l \A&,Ƭ7 ?ws1Q7a4c1#*%\M($B** &'N0>TH&C" <mh-fN`E,A$-tA8[&LQ`zC2f,9֬! K7.d.1p]aӹWom70eVN.zky5~رy2_fs+f(zQ1ȘRo{qS(Ec@%IfL d/i),%su$o#.x}ר-e'\cFrV:UXQVi. %0\`M۲cR57̢ A_mжRXK ОЪJ't.Q.#CƘt& #$G1]̗oS\kxyO$\$h r K(GZxp tJl=OzhGJO*}~,qMN8%5܉‘<&0+8-N[\|fkqV>xaжYr-,P lژu-7aG~ {t b37^4B m8Ka=O~S5>А~O}yCnWBv"Kކ#|`h1a<^ZR8 u EKe+& t&[[(L$2h%砘hauA/VԞ*󔅡Uڅ(_$յ>fOOEεٺwĝ[xw』wxs]о9,1p=mf|qz=:J=>-jwîm;/1ޱ3q\Y.6gys;4cܔRKQI͒ ZpB;k+X~a<0D*Cڽ}2]Q eEweI*N)KeeMPyJ%6x-01 HhB|ŐVAVAQɐ)bq?'E*"I&Ԥ*hIǜӊp#[tT*fMI$}y]uBis8-Mr4ܠYf{n_GB̮m=lg|?G>4y+"}dm,wZt:FVi1MQw#VH5Iտr .0 ~3{,&Qx1O\8`FWϞ6q!V]M,_| T5.t9[pƗ9?r?}eƖMx32 1ϖ)g_:Iyo ;w8ŋ1'낷Ww0("ԹAb]d9٭%sNTw(1?0d6(àA>@"C6:)YGY-b[#_QxDsq0-Nn.*v﮵LN:VG5ۯ9p~'bG]3%^Vv3o~y,a6ge5Ҙtby]Q1E.8}Ȳc,}~m -x*ǦL OQA{(Ĉ\y P9Lt"rsUvv n1q vwZt]*asB8nv婦II l8v:(fcnXi`c~.xϣC*7x0nE|<(:'1sD}nOs:,K(-^*B)1PA qCh"YawU!V^8 xW z;9z@" <]mSDWy*+).9=) U"ĉh#ԇσ}\SkE-6wY{;<%9l(.I($'b:G[ߤ،>0\·=q(;pTx v%YNI[5ߩjUWP-VqD]g*0MehI 79}8U|p/47z,ghO)n5hB1hyC9KI؄IM1?ھr~Om+M -zvq`}8FQE롵wH9y([[}z̅1wrLR,<1.a")LsZ9hsci5TjK5al3YtN3pG톓eJȫ0dՌ*irv&Ta 2ASM.[#Qx1bOpFq#ɈkQ4k< ?$r>G#cfߑ r1`}}B?ϥt.F(递V@8@Xk <ÔZ@'\#0׸red'lg&vʍ7'u|0*,^k#9Ax ^L\@}ź_& %SsYC'63&!Zt8U=I8!Y*o+n`ͪ]R-*&¹UO(eDDQ#MMQ614ǒZ 2z…=G4&]|ޢ"GK#(sG.#.nݝ #Dwǔلu躘Nq( l<(׮1 +[Oܞse :9y;;  [2H5dr^ݥؼ`qkSO1}݉{ˮg|Η A4 @D Ġ4$R8cxƲ=.U)), 3,Q$E$rr:9EᎺ/<~wyшFDy>$#.m> *ywR8%J|eai>i8Y{ K켂R\=Ie Lr! :'ɲx{ #GL)j3=)ŷ3,>se2?ʙu"ƞKj"1I-`ESBbOCܠ_N~2v_ z3RN'm+4vv .. <)F)ZtR0i ǂI/TuNxFCY!%W19yqcϭk_[:뿗7Ȟ, ydt$AFF]^|`}&*BFAreAxti%1d}hE5HzT,UkM}Fzbi,Iv4jFjt8w#JxdR3IaA1鴋e$R QDKۗi n0gy\#Rl-e~~ic))n)_8Ńg/6bz FeGxa}nɍ$e,,N컫ppq\וː*DB*I!AXȱMNcQ’r R\aB`TJfr.5֔co.?pMB;AA%KL,ƺp,v%&U=:c_fys_86,Oi$왓 _GϬ\r$Ⱥ oa?"L.Ѹy gKY'No i…}8Jź˨PjH bV>nݔDFdVf,.}ޣ|{V>=_"?aZ&}7UL &wۂ36RcP.An#"E Ƒl \)wl@d3ڶAv}%JaȰ`El]'^a4ܥ CuHB fpuoM8~0x%gwjйB؆v`p'#R]tՈZEUFO t̄nc-Dkbf`;.+hZk% QLdQF=0EDO *Y,84yl3# Det^A吹 7rX0%lW`PWTx3G#,j“1J(tBR֫k鎦fcy-?w+>ȋ1,|s{pbg='q xv0St)뒨)]zӥ2^Hv8Vt0sz53C}}7IOqx?ݘ/>O3|!c&2}Hw)h]Bms*a̖6׼:"~Cu1 Ay|Hd[׎xPyҸYS0sbq6Wkgz@Mĺ'`&I^z&V&[eX >^ANmFo;&?ZB5m2$!Qz=¹YBK,-0pu܅٧ҙ2518gQk/v8~ZFP>YBL νpayÈiH w rJ2[VƍƷh-+T7Xk,zn0ze6q lB8SAA W0X^]YC!ac&*#%ȨJ#Rl1(3a#^–5Z8׵QGG$,y>Ұo1W_GwfNmqf%aTĤѪ57wٝ[V-}5c^ T 'ͰJ+5I -db!Ҳ)K*BnkR"0tz\S8(-l`DWCKw޽x[dl77X NƐaKnцC`kT#rå4u +2(J,(@smc<{Ɵ3,4<*7nR6}#%PSi4LK6)f)^8KoWetPy>\6ڔIEŵWlgbF9},!!fZ>֖LQw텍AeL -z4PwSҮ,G=ze W7ϳoO 7)t".?U_>K ^ڦ'B|Wpvp<3NtCz":d I 8jJM&M!Y*P,:e3"4ɨΠ WB ą@bqaT1 <%.,Q*]HI Gy(K Z @)S78M# oA1BZ)L̒IIӐ'[cb2.:sUpU s<]diK0 jZCreRFs.afoO\\>`W8b}q)<>].,Fy ߵ0N@X(Dc ܸBos ]ge~yd:d4 }CTTCH*|R/ò3x$"<_;[&5ˉIA.c 9MIC/7ݡ_B-=$] >zgo̾*yڣ)v3IH pr(z yL9fycØQ"=*唆-U}mR*Z$F):c=b{.CI !Z Dp 1y1=f+VAiXcMULSc"l#Οt Mu}I}סw"ޱOryw{:Z#D٘* TGdCI;gW(wRbϨT6+_"n)D~]_Cm/pB0a:62Bq2RPH <JKS@ IDATȒi( ߭P|="#[ AHT73 Ŭ}t^}e"R(C>G&YxWvQ[2hZO3,͝V Zcnc,tՇhT8!a;!-MMI \QZI#BQ,6h; d9ZǾ:`/څ cGgi!Iv/~C~/\b I9JC 4=L4"/CMruӀ-bk+sa5\Zc&jE%kW_gᲹc1!:q]2:WJaQf<Ӽv*1VVV]^++EX~e.SѾbXxalЮ1Y2\JOa ;>IQ𽗮)\Emth,)͆(^!mҞt4#hJf@ZƉ;لC]a#0RYcxDz,$M6A3(9G;8Xr7oR1y0:=__6pq炈O{~rK9]c2zw^XC⤋R^v8^.\ܦ^M}I֘k:8 3Lz]2'eX)>߻V&K ?hN`( R6QbQwBapt¼)qtPeУtPfI #}`c!Yavq݄QJ-,3؎M}Dn%N\HȚ1Cask-Vw3` |{7G@. E$?| eV{;k*t|4BskI[X"2DUJ$( m&w=,$Jj6X:ÂAY9B B%s,m,$1CvN3wyo2ƩO ̇ aE q- ,s,QÓr-`4{{ۛl|b1?K>.K$vU[6v>oFM.[va7S:}3d댍E,әriIPJ9%b^,DA~r nx4ܓ/03ygMiXg^NV9[>5 ?5~bδN~S/u\y@;|k Iӊa s |*4$Sle8eT;UZƄ;{ U"%8qDf!}%kw!5wD3N~w e[';Tµ)+I Ĕ-L1!NQ0B9(˜Xx4uwE{v<;qf#041h#gV9^"E؂^A'Clwļ6:; p t~ʧ?MvyDme>g A8WCJ/q 3lǥz9V2*`Ox)R@;~qDyepL9OA1"p QW=%:fAPhOH''hEx'!5%. )];0w(5BcM~wlYW=tn4hz+#cm6&5 Q0NqқG__Fyp>s}gy&smfQ-6R Hw&'MAmC )0~(ƽ"ʂANiyBté%/'jfaa(YEr/3cz;,ԬK7^&q&CtbI ؍lAu(}b\fk+D&DTh*g,y Ar)}8FVO1J,7;;|flI,qD,`y zY iwc / t&ngsaM`(%1(;Y`i p9E ]rd)Td`kIk 2f KOiB=Q(l[#+(ޙ %\=zrC?}3LOt3 -8\jq~QO*W.i#1`TCMN1^qiSw)m.'Smnshf g.sq)FNJb0IОFƂ. ѡxb#7;W|p?yRCmtw^wNq ߗ>7/&<O2ԟz'*+/_C6eEXqCi1N#2K^yXnfQ@%vB)+CtK !2bC5Ř(E6kH{T(3M\q5u$Di0iFahp0-d!SW=A]#& &ـ8t[wH}@y dn>d1YꠦLaCyD N%U:_!JiC` tcA9]10(0 ŽJ ,Z`?p.wX[b{(cäDPK|8IB66&T$}_pu/$O.x\c$I&?Sre&+<ɜǝ}k[+Uyoms{Yvx*uSW{p3MTOZ<<ا9>jӚkqK[5Blʛl!9%9z= 8Ǿ:ϕ~!=i.s'5E?H(.sKks>f/%J\tҒcH0 P @ZP% B@! () 1+j+GϽDu6]dGOp,FhFC.>ŬȵL.a zMy6ī3 <"{D&% dŏF3z2M{1 Em…ٜ}d`2#fNx4N>TU<ˆRWȓX;0&ԷIA?JmƩxvd˽qmif.@WpsYr4r>DLEkѧY0$'E6W%6ڎ'[̋%2}ܜ&P\QA]qȼ8tU-5[,e4e<)&!IrHI4U1d+ e(n+wc֚8͔i8 oBΘb?&h -E\*Q3Cvt[[cG!<Y<%q+@Ǽ:ǞZtS^Ez^^ y?"W6ԛD[YVH#jFь' j;J}Z!FRg%E\#>r4E+R.q@c)% r!ژQ3eYάO?m31=m3`{-Nw& %/!֗KwgxMap N]nee%{U #qB4H:(X#d2Jw.1Mu\JyVdx M^9(&z^eQFāR {#cMsŠQhSޡgQLj;*CIfW0S6j[OZij]C+i4Id`1NPP/XW, 5oa{#mK7~d k1 Z sX[yQ,׿}6ZMȦe"WۥG61Pn#[3C9j" zN)O2[TnMV}[ptNzcZ xHz R8d, n$>G%4쎏0VNsnErMgKQSOr:HS[Zc ՙ/"`K/4JD\ɉU^a(;$")24aev=AXޠs2ೆR.M)6P.Y!ZZkPT'v J6ɝmf -M,7PR\ Gݙ|̔h dՔYt{L\R%$Q@hٚ<:QV9[S6m#KrF Cg*ɾ7ᙫ-co =ݢ3X?y8n{-'>_oRoxY4L.o|4k~:7fqrjn*LPQ K+ϻ?u$I3  K-q!ˉx8!{x`0hH#~{{^V#yi_ֵZ{dSʋHĘ ):}%Aظ}EGZd˔<52Y$R䨇:M zsNq}y=bW&zs9+w yS6Ayc{XosS٢)?c.Dz+8O>Qu[l^ tu3O~̤TqerxH*8F^̗h(,V,!.MovT֟ XJ3= *k5~Diڀn[^CM("^COdLޘpdVP-9uI3M'm5m-z621F!dGʨe-vV."d_%qt]) !LlN*vh 8|+m!aVY8[""g@hH u8d a ˋsE8ѥb"y9D"Xbid@N)9M $HNPM'YZrA+{QDcgMj_?V?Ȩ8a& "9'XsteDbm儜w} ,w6d݃(JR21LPw}e)1%YD^P9Jcx;QV!t$\Fn>A!༁s IDAT EoeYt T:3>,Rœ&׶3nD@i%(Zم64(["%,Qz8*m'^:d""RE2b5ETJ<o,?'G7#ko"y`B"RLV /aUпt/TTLC]`Co&*LcMWӇ" v_笜q1 r'_9;򄝫4?g w2)?}#ůx`Tټ~~y sfja:>qGy6JL%P~RGU IAiœڈHfpyԓ9#&@HJ.U' 0u!u Ld (y(qi?Kh}+;M\վQfi4,7=@f&՘CST\Mؽż cYrFmhu{+eg4eT%K.#]B sx왪ܼAOba0wM3.Fk[$`ԦKX g*ˢ|ŭ'-YGltS&g^^Jې!/h7EڞW)53lz-agdcaLI1Uk$UBNI" B!$YP لHH\,sh0BYeZo_R/{0s 3"H>èPS-,wᄳya &կc*WR6JJ,u R%Mu |f W]]v_05Mr5JnD',ym- Z(&MwLy. ݋+bGQJIUQ$34 !*QlOЉDk:+z5U1#P2hBG#(ċ3Dߥ֤iD{{lk~g>{ vA%- ' W"(r7g=L-b³|fCi׍' P9|6wJ_jE[`*&,`hD%3Ā֊BsTzfDyӪ° _ :1uo2" EBdxfŕh](.ߺ 80w84(;G)0&w,Zܭlu`P6&Viw   HYp?hf|ܣ># 22I2V=C/n`@p1 5*5 y^!B9BҚ6)v{i$d ErҘ8X\nDq:Ĕ2zE x#`5^uȰmԠAAS%Ӎ h OyClt|DF4BdC"daL&*/Γӱ3N\fsLW(3S,5en?07ֱD18Oq !guʀq)ȤN@kQD)6wl=Z; y:9R6IeHEȡ+$5##@Y6@R$L1w̋gr-$Ei%T©<:im!-9&i8Bsؾ'; e]C)kZ&zY'O(+OBA"ӹWi)8@Yz}lM(-51ÄZ0$Uf4 ]yeD agfBO<(gē; Z^ӏi-"И+&hP#+F ;&NڔJs՘vQb83B+`߮rB)`SN"]g7@OO+8vTJ}/y=Vj1.zŁ=e] vrGpg$ܩCߡtw^qiRq/O(u*s3mg3LKtoaAͱ8p=IoGK;yPI7⁋ z+>+sq|J͢yG!o$ژ"Y DA HTЍQPIdLPQ07f40dʫ|[Rk/?nk׮RWJȬ8̔$|V&XRv$o4h\J^FER8ܬiTl* b}w^\T}5(΅D@}E#M1L ݴNJO'y|[k6B'P#xXg{^gG8$3fF>\q28_xm<$L4VHuP :JXn##,e-}8z .w|6Jo+Jǿ?S!.+;.KBuBPXz;IbЎ(WМd(A~lS om+|feg|?-fa%ݔmHn\?:a>^_5 k#.K9nJT+Cm$+_,%3}&o?_fiW> I HI+_pwyw}_F\gm[CzI9vkYx5ˇC^)_Py􅌋F?z6 )NRءh0Sb(w!NXRv(]Zwn"RJ"q.#(daF ZG@ RIH"LABYM22H_5)]Cws44DEN2 S<%F"2D BBG7w\qm.6ϜS夻CpG:˞BǓٜvO2IL*Y1ZH)"3o}7a#z"BUfXI/FUF$P-1t Hc MAb!RĔDP E{8`-usWx͛{YL502}$ eb6qn ._cuySXpĠkSI2$ש}"8A]e7# x-miaUU~ʳ~s0}O'x\9ȕ1.{;s C$fC(vS>Ju,Me{8Fw*m6Mj3ҬKmUmb ("gX[0QdF@1є-9 K/| o?UAt)6$)_X}7"vLm6st%T ҉ qi'#Es*scf]# :v ,., +gpn(QE-N覛 7,ju[(b#SS3Q3&G񥐍R´Hk<`20BuivfH24:ۄYM@$ffMU;}Dߥ`C/ )M HdkSnӗMhy Ai^RTBIBBCt ȶH&H(OD#D2db<ᚆ)<fU~M̺!DɘRϞŷ@\YgS;RiR?$ o~<* 3f&xaJ%-)l}s-N02t]zJװ}HI@(')D\tt-~<{X9RadV#\:La*BZQYڊ5r0Tig=>k1\ls84~)Ț-ƾƛ|cZ?B_h}?q;w?uß鳒\9z\DNՓIER( `LjS'#{ʠ=|# LH=orW[$'_ao(7osp@mx}c,| @{]%+[77{O~GrYG\'! #p}:Z*  j}kL6yw_+mG: ++2wl";L 7D5{Vglwt<)mghe_yq@XoX> ٗ- ^j"c4c~hD\2LR1O7̑46uv̖Mv"~> t8h3I E DiJ>0Ŕ,#EPGEE@cR!DR<2!\1#!^=~O:dᷧ xf?ϸ#m"*h|Aјf?F,LH/rm)wҽl#< :? bF, Sg"J!5 |I cSyb%Y6Ce'UcX0m|eBD%8.* e$qF`D$! ,Cs幌+km1\zK'߳y ˾60\$VZ[MȢP N:$ Þ0vb#Wkb/_gx˿ z]'C՟'O1+ikOrT=Iog/Yk&!:}:HwgwW t)xѠ'EA[ e{H-~ +к4ͧ,$U?FRԻ pyF,z=qF2/8h~ sԣ9$pK O}|?xylc4O:Sc|v;Kdq>O%aHz12Lm#4L[;ɗ*w{"{G }?n?<׳<δ1%-`4PAN*IEtc2rH2l:&rZmdRP@a*ǐRf6364(QO d9<@P,y4[팞q|d#PFiA`Vn H,ŀq2 m61]9ƶCg.SG3ׯ@:&u{#$ d#Cbh/tF =6t|Q`RRCN(0tdIo}5S5n3N +W!rTLd E( S]# E(CLŜLh ҘDE&ʔ*:)SCrV{x y$ft"2ʗPi0\i\vFddSSw/r롃Ʌ-3\وM~6;S$K#D O#DB0[÷S B,dI{ $N Z/p=b#K/s{hHY@h*(tSS޿0ڡe~tDQ)QȌ5[&W%v7fPO}~;Nza_O/xT\gcyWѷz.JGLm"'*.Te.Gk'w[%4oD1oM ˑ޽y# i18P)&rI$j-R$+u ᘎR;b8Y+A:*.0̨Tzj?{ڴ!gʯoWל*53DE$Тn_̤L<#U1$FdP)f>qPdOmFBטMc'%DîN嗹x* >dM5UZ )MHRK_MiHY)'5 c^y c&Qk`:cgBpd,hӐ%Rc_ ("Wi0 ;/R(3'PU|=%ykJs~kw`OzdvZȉAdD0 RHfыXimoQV9r /`$iC!Ct|ԯ D]}Ya{:/'eTT'TkD;U4'Smby$a{14p&7n/fV:/~A\q*[V1+CqA>f?؟iQ }+ZXR`2is=~㹟s E.Jy dE27dM9E5G%D 8C'_!Q.zdBC(~YJN(DxPbҬLDjBɤ"!j Pe&{O#a "Z(U|o%2͈s1xծ 1E5"Mu䬡HJMs(Έ(s%9c(LDK*hD!ޢ[Oox|!s#!Rh^5sWƔ"He1 IDAT:2"'X~=5dYUHcu?xq#ɐ٧h--i~e:ƭG.{`u/J&t'`9I#r &Hn"<9@B|gx xĦx +qkI$j$U(0 @t $B!H}~Ƿ#k5!Ʊ%S|o@3SG2B6oV> і@~ZYr0װ+* :2K)E7n%Ddc,C[%8{:w~Qǘ>b*m ._}~]k +|Ca9I? lv}2J#S?`Xԧ+ o:[0r7cLMw3s矤:3Ek[),X^yf/ӹ9bM/Ui.G7KwC|cTz/0'msR-K\iޒc=:쭟xu ?̱;_OO(D=lJ>ؠB JYl@R2&CDIJYj2[(R*W*6wM!bYb_Y Qd!N&U4)j!'d4JF.In$XX*bdqTrUƓ!U$QLL|2EFZpigȯ2\t*^SsQ3 HA0P蝿FUVs.^>m9ĦKDI)R5J9LbL`*!T\ vΣf-ImUzOTF Pg'8b]f j11}#hH̄AKb8B/,G}@dF9s JvZvu)F{Ӹս.q!SṛǬ*Ά_WqSxL#L[%j!*¹fF0M| "719Wh^1>bk򊇠+2Q%DqmcvfJSG^z'nzm—nVAMr8jC2$u~{Hf$Y"#j^ƅ "UL4>+U3kۈҶ> >~S*Q_(2ZKI}:q8z75AjO<¯[ԖRy "P!r .i%۸Gh$kL-ȑeh:AR5@T:Vb D$"Ed >\#C ȁFFBaĘo2F|# m -VYl'}'BVg+;R٩Ym%dufvAf'C=ӘFhPQ"$"=?'﮳x|c|>&IS$NT1N5P"EO5Je(x:i3S&[Z6 G12O_{ţtʂOtD!>dHD0ggh4elܬ p<";Y<0STEhLrX,v!3AH$ 8I m7[ȕY(^ 7Ijp˜(\JYۍ\B7yǹuwO3J#AN-tTd}O1aeZ\DJIXb)\(*u;kn^آp wl>Wr,w=m\HY{M&9Z7Sc|mpar);kvfU\d<Ԡ4;ɔgYot*uFkyb?_0,.r.J9zH& #SaJIv[ a(/|$6{*v"uCAP R2qPDS XIXQMQU0D҈(!U}HgX* q #{1 Fh乏l$$@ꤩ@B*w(  Q #<ȣEaj hK9r *7w āZDn$.abRb,fc[[1Vcpd6E7 " %͆'1kK4{gw'eox>Gfq5=KDo-sH&yX+cfd6f#)4'f P%4(OqjȥRF)D  q0uO.c|/L G@,tSo %',gP/˔GylUjcbw{ӄ&vEMUa]6#lietRvO.^?(P=m zyVW."R( qs2=XI̝-6_[4+ Ho}I>U*QJ;Z!K{S3DֱE/-n'$HgCe,B`$ B?9@z<1,k.c6ͭC!Om2AI, 6㕜3jۙa:yǷY>ůȯ~;\});å.rp { qO'ps{G8vݕ(M])]~DL9673M2[/2_|![wap%q+Vhm!V*xK. FN)NkurJʝGMI*Z/YHw:H {/#i~k kFgYF}ϛ6$W/xWԅ1*#~O+Wy:/|A`{(Lt&QׯQ)AD{ \S_`s[ѻr/~e6O-1j1k!)z 4G) *J& =G xL*ȩ @L H,x r %!9idad[FЉG $Ae:CIH{YD&XRhܦ tІ1hdoEyמ[/.q~ oSwWkoX8$CvEi ō:G͐%:u6&9}]y^ޡ΋4=z1uu[[RZ7#\5PQ{UIEe&ݐSY=S^$U6ZW-9HUʤN)(!)QW8K'oTV7@H6Y#Mc'/]"k4[%xhvʌZo"˛sxΓMgFhlUKI+:-0ztI5I%G*t?A=oZe6$~)?g41ƞu0,Mûۦ|Wiևu!2wg qjQt7sƔ"#um,]vȷf8{}0(Q"z,};poZ3*BGb 7%w lHf?Ík?9>Q̝,Kg &]CA5: 4K}Ə=svBIy q:\Os^Cql0MpA~ʁ1"/#J #;{WcF4)>[^"K2bOF0P<AQĜHRYNՌH4HSY<1"!rY"J豏hm*zF#D$|)'P D'DdyHHr@,d {yBڄr$ڨAd) tHK}FTx_pSt4"z!K.@tPEZHv(D.b5b~Abm_`aon2fTy|@X:s+s<9ʄQ {uUǡ Ҝ!-ȃnP!EhvP)*nS3:yxοq?C;Sрcy@=Q֦žhGK53>8J3|g+ȇFţ3&S_=s[< c)޶Qe^Pcr[D?}wFf9w 8]97szRq%[g\~0^e;DEcE sux >GQ']\d$wk8}o#ґir.g"ȐusZd+P?MtCLOd 7=u}/g[7%E9;![eo hSLM,82xmqn‰#?Axiz/ӹ|qN 3H**?`FmCF|k|HNR J+=V/bu4Jg+=2է|$M>1ן:˷yU#T aJm:ާ{3'h}!n5\Ep0bNTgX7b.$wpF!2BB(DHY)Il=@ȢII2Mȴ!)~9ǖT#DhY6j&qAд~p|^%'VI6^dv8h#tBQK$vpowb%M}Je<@!Ydgq:ؖ*,./_`KqHÔcǘ5aeւ)Ew- 1B4D\<'bEi|Yȑ#GhqŰ bTգ*YHU"QZ; Z9r~1TEcLc]P;݀~5Sdgk1gRc=8:‹eT HvV\y$gLE +t/"UI]`eWp%D@,Zt[mIԉ ;?ߴnooɌ-jQp iE'%b8qv7RÌU30r^!UYg>Cxa. {bOҏ(CvEQDHng̨'] m/3YҹX/sUZMΞ8Grt wmHa+^!i]bF%ȤU IDATiIc(g>{n=rErcȶXaѪ&✚aPLlmr& :`rIl8@:R$0:2lRL(xJN/%V0.Q5D' Sxԓe )" 34f{'aH ~]2pA%ɔ ALz  Kc> Z+$dm+1QQ($,5%*)DUEa# ")!z`"q,&9N2HJ0I IQI;Vt)QŔf")`$"y!3EX@U"EBBt,$IdBydMQ) @6Uu*TV,"}ܕ Q Z ]b$d2x+縻>.)T'kة8H?|P[d|Ϋ?_8e'qq~<<ڌjqQ;@BrLqGG:ҹ3*6#c1& VϿFi~ƝBd4!$Abtẍ́; Ecw>oQ`Ă1osǎΙ+CRHw8.ϡtg c \`xE)\FX0^pwNz<=t:?KMa> Wӄg֢}L W8?s~!aDCS4#.vFf&.ҍK[1u>vȹ!e8.A ?ƍYQ478Xbos\;7ao0wYiWH֧ /0Oqj~ZzW Y)Kv( ɢ!<$AJr]L$1Dj侉D =$F"f8{{ cw{gn:Y'k>k[ABѴ*n2Ǹ]D]F eV;}AV"ҔԒCJFlTk#Hi̡ B4nӿ](NTa*.#6ݸN>Gi ǧi~ɊAm1R[cMe&Sun0v$R,bL5ɆdGBqEeLV>@SG9?﹝ohIF?))Yr%4CgURܡŔ V($#hb12F+t=vçjICIIGXI1.GQn!loPv̠dj!l 4AZ!D QgKLO2t .|1 Q9I~mJ0pq>'9~$[D5mγmTH*k=cjnO5W!{Q+AE$]C8ױ_HSE()q,j2zN_E2oړ2CJ>{J"E c$F 7N'Ȧ1Ԅ"QLȽJ8N"Q`j֎4`1dO$L2=%!e"I$$rE"Mr1#r@ۗ;pYIv}:qA%a蝔Aw?"{X;D Hd bkWsB%Gj d$tu BR )>(BuF&>R~ _̼x3Ø,wpIV.m@d`LGL*p$cXN6 NPVʨE_]B{Y<*-173K-.'F?d{ScI~ks7Qg>R9CÌf N%8=ıŘiaVmNJ}[7_ۿgDoϲ(Tl;(U'O2kdeNVUO2b!wjaJ~A _Gf'+6'8hǮ͏<;>̗eg],C KkX~%H֠~'*ƾՠ|t/2QF[ /[8JDH+>A@3>VO:3X#Mbp~ro."O~ҫ?&Vh#tD/AKJ8!::ЕljGOHR)sBf AG5I[;XĂЎh u[)%Ȋŀh_cRάWEUشr ֐kME*'ǡdY&n`$~@_}ІTE4}ː(LJ@8ln~_+ʀ'E: a? }#MQGa`WlM{rRf"M?D2$I$gED S`d+@: 0 @HǵU\F HEak"c# 2帙Ӆv:ـpyA3?]v^+)uzB'uF riʯ3F(j(|՝UVZ}ćLBtHOw !{y03j 4Ad 4e'P]YEhhA"TG`NnwԄd! Ja3 &jȆQF:LJ!*Kn dN1Cr؛ܞo25jONM$q^i!bg:IK[Z!m !ʍm A`cT9 q\-*|.kr<ehg Dfn|E:68DEPlqqƉ✦VK_殜s ]Y |G"B%BM#Ab.s~:OXݠQcZ_;IǨ&b1vH-R52a@(HJDh3 oÊ 3W/Q s$:{!aWy-N>C>doYZ n;`YEjHRbb (BT T24'3X)y[vqN֛~/O`w2__ܥ0I#N(D>9hl7 u>풎^j3eC-q\+abj  vtGn"  zBj'I]hGjƨ5NԐp?` =obkb⎆PI"Rd.qf+}X O Ld͈aG e 4MWCJz#)øOn?EI|vF[c ^1y5~U3ڰ7NawBs;DHJgEpf_ZmRnuՀ[We}++IE[?&~&C˾!(#l܍4Cɍ-RF uZB+^}BjHDUQY<]C84bΓ$Is#/8|i0;+s;LK*=n} y4G&,Oam˔n^*fҳ%qQb&"Ybw26zz8at-C*>F6 |;BR2/<,E/Q38t eiY9~cd_Ct 'S3LO &ڤɝ!IsdcHD3u>y>8P2`O$^oJuՒ.h 6e&E E,sydmFgͽ%|4v  r~chwmH-ԈbvYeƒAAM#3sh? s]9@-{e!H" DJ"!X6 O>h")^B_8A%˯31rGap;(>*#*I&"Cbcg"~,2"%"#g6#)'b)>.%Q7Y<`lrf1Y,k9T}4y KtBQPA2nqDV00 4EGIR0:MjE6=gCwFRiU}1CSou)v_ËCO!hEH^c0OPz})NK$o-V1h8K1y\i9Lwvd8(Jz8 en7,}JHnA- cslCZl_n=?_}:S/lݡhNt9QPhK"0n1V\Z,(}0X0PENΝE}*a\:IIKʞDhlӴ= &},J)K!ɉ|1hnGʚǽG#ߋflӚƍB̃0˟O]&̗ ]G VjM{)a^ Lj4X,rfgfɧd!Chl-/cuGDڷHPqї 2eƈ;iSOma~-Z뛿o{yScWwuUlMJh#+!;rbօGIVnb q # R Ȓ-2$!2(D꡺k8Ugg{rQ}I_x^偧0V,'=ZP <"UMW|Q, ,-qSfphPDf6O).M;ʄʥyi7Eq19zTbT$ k`Cd)4Ic!wfSZ=BgXeTwYRf)=?ꗑrP#EQ~3@*16[ͳ.ɂo^]3:Nf&X鈡=#MY'lW9uI7P@=pIKx:FIAظG< LΚOfmb+ќH]‹jhD+9Ԡ{S8˸-36S2ϱM6)h{ Ƿi-eN[u]ϰ->~Y3J /Ê6Ҕa>$Y:'`' fZgt*pV6n~Ѯ-{F_p8ί"b3\k84+QάVRbG ryG9ع$'mmo$`FzbY2gUfGm\;xCWCc[ fw5X% NN&=q嗈\)q3z-xFKR6ZLI!x$UsVh#>`~,Ԍ fC\ir}FLkwk[qǯm>`ǿJ{ۨd~G ̥TVNterOЛ0 !gې (ȑʡ@)2B"Mj4DW*0  Ajʼ5LMU8hTQA)۟v`k4HR7j24"%N}J w',5jyFDMhrcBzZYmSb⻻|XSa>Zdت3y68%k¼2&>qҧyeؐ&h¬$fQa<,䜎uvzWo~vJql1J&ܙ*{{v.?8:!nd</|QU޾ϗo1g Sux$ RYTdg8HR=dh~>(Sգ8% IDATmio:>!N%3c!3> =w>zDg IB+fTd&,#KXJj:n%Nhq+IUmNOil,/fMZ1ArI|f3k#DήG}t2(i|v5LK2f"ꨚO^`a0,9:٣0;5:GÂMj6ՏzMZeɨ:drZ]_cKM  &]j-Bwz(RFÜbJ5oѥ4*ᅣ &O㬽;֛le4vsܧwDh";ď| sadL(tNe!B|8 6&E۝Y( :ME#]gr_f {c ?DyMӊ|9g0x 4hiL`rj=%guYIc.SޙYt9^9x={wyEqE=':gSezDOffmeH00{C6 W2&Keϙt=Ju\Z0R˧tMd#p  jX#1 UPbc*M>rI?a{5AJ$qEh"9Oln47V|r<30l6ia5$=W?I[yry3&mS*M a*@*dUA%@ <@V+@ 0QZ~4{}2,>ŶF=[y5fZjka͖lM]Ŕ Э6GNYqp5C0C5Iɻ]L6{G!<3+;6kv`91xG^Ů1炧yA ;O}N&g'vӀmQ ĉI{1E1O.»:9U%t[cu1% 8JuٺdU SˆfQ6NjV nQ>ѯ'C[kg19F#v%Ə-+d6~(0\}?|S&Řjx #TLt mLmwYfڽE'O>٘ǯ0,>j8ED진 74H i]A9y%t2DV9SqY$ [Qw,& ٢$F,H=TtEl'Ѷ"4tXd[,0 *} Iw#m l!(l(ض dc [(JCR'S,G ,'X##Ů$KNQh!ю3 vƪ4]ЂDHצ^1ͥ%%V=&Vn`Hr DIPKQ)ܚBbV0 4 S3mP(_RjEP>=44*P kDw"%0 Đ!%((mAiI)tJMʠLR0e J^_<)ΕZſu݌| sE]-+&ʇR:-XmREzԨ4ltc+%\Z p6 7~^g~YW$ _V+ܪ9>3*ll!&3j͂^ШaǪܡpK,.R췈>{sn'Lo:P,ݻܽԎ-倱&`fXBD%85lr[ bN=epX N NYL>!} +w5ܨaGe2btQPu ,*cNș%%J͙E ‥U CŸ;K׹_c}{^HضsFUcy:kI4[5hBYIFĕ+Tu:NUE3 :iwXif66#zΤ|< LN!ro/m2:N5`v6IڰXu¤.5oB+}s8Hwh-t6-lWQթoct1UXPPa ^3c_\g&Њ6wfT3\.hy頳YaPbZ3AđFS0K-)#0TTq*L")QF@q]7׏R%έؾ,`-lVu-ڏ='(sKOYjdgW()vOﳘevJqG$>fRPDP)Ҳyrʪ`LP݂4ϩڤtt+fIFXl˄+xTEN5Hoy2@ AYM!$YP '!e`c|SP)Hqb@ے*&>ue8PhJUAW"@4 Zanm"{(ƶh!>f{{J1+!<}wf1|Mܩѭ2&4M:qh5\AHe0H-9J 2aZӃHS(ek!F} D/!oTxd/nmt&?i2mT1(jW2{ĭg8;<4Ƿ))sm gHM<͎~rGxiUn]s+#ί`6 +d/]UQ`YmF%]qNow5T=W*;̕k aSc|UɔaHaw֥`I3}gor"BƼ{4S6t%+&bp8cN 5~͠y0L~= Ɯ)Ea;)FwiWԳ9=wvEe)V딓ќ hw+dק^kstoM\> Q)JY_k~rM(4PTYIRB!f!" =GdMK UYj"60n+S Nmj&K lZ rk>gE'=hQ_L_2.m8an&S"OSƓF+g/ZxBBh]fmw28%p6& TYJSi)+BiR'P.UIAEAYeD)4Ai]HCa^`mE lacxDX&iM1G3v~񃗉JMm"bӼyb|He>(~˅4 =|*Q$*K~iL%,)R kVeJ间Lo*L@"RY&IK)M UQH|1'1a", ,K8Fkm,e ,EcVZ"LBCa(* \!eiCJrQWT`(*@2e(@\ @)ۢT6!:7&{K{;ٔ}|?=7|:җvYR9#Tl<*Ȏwzv'i_ak9UË'ûj?ͭ6?hY=l|VKgMeL6iu/W4D:e ZbcFlcX‘Svʵ%ʓucjȓ -C6HX~& VS6)v#eƤy1bA|sij${vs&+?%+͸]ߛهOџfNlz~繛|rm+evc{*{ nݥBFi)CiPcD->!&KiA$}jJc"d,(4-1=TB**gnTEg\XhI4&LQhMӌIʘqBOI)spj&^ 0UNKXC.) D sp)0mQ!T"&3sꆉLD62L*C[6, v(AT9Tf!4NFS(ӧ.2A8Ӝy\΀cwK>c>ɸE{v{3,|@g)6 W%8ɷI.!%)'~2jx:8/k=jeKQ9Mw7}]feզkmcv\l@r)W i9r87yAs>W?WoPM,1`=9џٸUUť_X GF=޽#n"1^f\ $G9otgl4jz(ѣl4[~M_6|O?NXsF*%ىgM$cS&dX@81ݩ4v!XoQ?`;0 IF @5FmsN`G' 1ciX46Xdi3YؓnРy{'.^X-59q$ ZpQj0_~M/Gς(#uKDR Z ()qB(vyTQLH1NѶ]mkc1yqr,&M~A<bXaS5,srٱ-iBԝp+@+'dwp߽[tx,g͕ʥ'h5$:bf((BJ]Ed͛x?LRDllcYK4Yƾr|fsO?j&IS``3 !aYo0:j:2e-I@7rN9gDʤKD5>vݥVarq(01j3FuNP؈nquZG{FiQqh%HF**P'EͥS_2XB5B ˜^ZtiQ3YPHr K}JaXJDL1$]0P[IbO JtT7H1I(Z!&pȯ-2d\Jd>uVA-d]7ɷꬮ9/|_eϡ >[cAb0)nG>iBf8G9s KbYN?vnqEA2MOK21>"֘췸pA{?箳Gp41/8sJQK*R {;=W' M H͓{e? D>;7ƥ~nی6gJB0!k,ިf!84eP Ę qTfT ztNcݺ͍>Ui:51́qV^O|gNvLV' AJ%$M"@B(D\TE'EpCDSF0 $QuTŗi[(AQꢸJ^co ; <5@nd64ؕ T2CU:XھD~#dw0fsXzZ~v4[FtQw#~&l6tu2^l:3TZUUFK3{5u^"5weaԾę>VAe6$"%""৐.2"vIR CK4@.#!#t0B@\4S2%01HPPL1UQ22Z X<\<Ե-+/*JEnZ |Ɔ01,ml n>v[Y9=l%(AP5KuTvޒƿb${W6X%plCW#B٠yn>\ly2Mh躇hGvJ6Fk囈rc) 㭐 c\gmc \ٿfzJ^ "\4,rIE!U"Blԉ'O k6W+0saͳgi~Nj2N#_G0GH}#s ݫԿ}&CiE7=N {^g&r$A Ey @0d6<Ӈ#lGI6S]Q"˗Ib祢&!Apc._>:́fǏp'b)Ȣ߰w[= %A`e1~ zM03C?Q}lǟh>E^H-o%M8S$qrSVkz/Agk8J6.-PmEġQ@ t&˃z =_y7v75@&E[%77-Q/p5I-D ,hDqc G$Eq%D3w1I:fI/P E:A KDaK{rI K[/Se() {5&?|.>0&/E띓l-ne_Ya cIXm!GMAY[tvU._Q2=Hc]Rmw/xs&ג:o(HR\S84 : %Mec{ٰ[yI IpP uHy@MDZ>X5FFș&:hb+> nIAQ*)'uȷ .#d:./ )c; JToO_bjmYعĆAKK"EO1ܔk+JmRbP#/%aΡ*D=IaT@# 4r/ӌ]qWob ۛ8=̌HqW 3m"8uYj1mD_ p" !89d"ev%F=3ž>ōO}2~(=K'ytŭiHIPQ *yKG0\p"Pc'@c.S:|Rc~3hN3<%ÔAM"V+VDS ǐ p6DKV@W]ChX9~a]JQFuwor&jW\ƴE%1m,q\VgR`-*F#;9ݍ٫<`E Qu~b$ M$[ se5ƴ ,#((}DQ' E4FO$BGKxzWMSIz!Z`*-%ByQP](i&^" ) " R}F޴y-ElH$ !ä:""jGˑK~4y LhIܶA[>-T_{Dh m2CGҳA:]L q;ŗ@0m"_ERO(+dzx/ y8~kH 9ɔAC' 7 ۪d2MA4ʬV5"VGgbbĽh; M {r~Oܵ/ ?⣖68r*#`EbOV!ɉiNtaWOѩ vm+J"1h5gNaU]e릨Ku.RUa(Q& RM+5&| It,ˠ-6"D@~f|K\?vJGA%U@"`Lκg6c_'=*n~[ó ϟt9 y;nºJ9BpbKc0:G Kg_BuHf&d,v-8Ξd\V)Ͳ6Xg( f|r($agrrQm^5 Bg9 'A׻؋ZOS͔J2΅SG,(`"9vf>ϾtwpaYHdvs x/6E^ 8TxaD3phr* v9ck&cY8g#;J?ZD2jt딫C8*GF9<˲hKtF*Q\Xc=}hNcpO024GM$Cv"`hHLO4#M6;0^'F4;li+^rhxJ0ol6p5&{/ ˈĮB `K&-?l3BEH\e[TY/9t!P\~oyҨJ~`Ti]zkTUfeB;S*uM$B1EF)ePMZ%U՘Tq9.6zAWaͳJY|e%Q66n8k[-= 34is5DiIaȏQ N(@룠"}Dy"1@XI `b+5C$cRYڸa6P %^h4<  \572WOs@sB>X4i9];:=BQ)b屋(-tܔMe @$+TRPH4g 䠇Ǩ^$*j3i$@NMڞ`)i rHB=ktbMVФRD%TB<9BMbEE#GpbJ$i(4⾝`;J1)?λb^?$a[;DNcR{ؽ?)`iaG6g;W 6Ӻ!#oKH| [o(EB̭'Wx~hF#'~/!NHR WʝJ.id4d7Glll? W #7βgqp#yQ|N-o;ȁK ,k7s# #XB籽 I$qZN0B奨<6yA\B.E98ɷݯ[[?@,!-*t#9JbnB]8O3H^aE!i.VU0/w8<2fbz_XKTȭXu=`'1" RH#uِm*n%۠~JB=F}Lp~S1ʗӚ[֭Ŭm2fg}u<|0X)C[;hҽ1E4`uܛ^VCL[׮Ip?/\Y&?l59+sT֮!l4%0AL-jE69~q!C2h/|h:.[GhfsSOcL(T s[qt>  J?:/"yQ䥫\AV} ?q[q/fʑ裯'P 3?YYc|DߛE.9H~ܠxמ`IyHcǞ~]y݋+>uI1,wv9E]*RؽgDy ]PYm^21PկH--hqd+UكXOwC~7~rvc:ϽxMTUȚF("ٹ2GGL:N&tt,~rQfgcaK[Y./_'^gs<ԓLTF9p`/*a9vZJG @ҐTTh9]\K@B IDATH^V{Ƣo4z;K#@ۤ,'6 M; ^$ 2%$$I!1 5;j!%75]SrvX"hb4ƸxCt'_nܝL|\`_CBWV;hCH"U;L.=TAI@{+y Lg55Y=9;:4 Bv\DFTc|:5Ϗ11 Kunl Ϟe3|%e4۠#FO˵Q;K3l][5RFݕLlooYu"&Ip<6 ^OE^&K;&Z~R&FnW &+ sLJf|fRtBg|$S@;xF~{1j.EĚK1V+?6b6_2m.:*nǸ2 F=7 gi.ims<op:IC|pmG-W۷+z8toQ)+?yW!qXAV "R6jI" II%8R1UJ}Z$M[b$҅؈Q'q]Q{xG(5 /`^QGhv|!\?u"#&9dz.vKp`K|C8|/d1(Y^p#CzJdM6 a2+MG gI7O238[7v|h^84 ]aG 6=}2Ȟ( F5 m>3nm:sy̏IGy0k=HIa7P\xNvBdbs& 䥐ܹ1ƭswf7pUZ%C60bsd`X=He02h*D⥸^1 5+~lRZj $j]\J|>i/ 7o.&wi2t9^;:h׹25N@mn)ԎKr|>T8B|&o?%I1ǴD["o+s9~jmxBQNiri,mR6 [EIύ`W{/ֈKs"SWO~wgvy sVy| [P5fzQzE,k6O| }f}4 oMgq/~3 z{[2K$m`iAX7==v|d|dr=ې!\w!ڙy󻙨وq!m{g1ɤvScm*&x4?6ˡ3^"xf:E8⫌<.VX\|J:vmYTZhr& Oecm\, 0;7){w R*Q$8c0S %=TAˎ0O/-q~BTCdńwD^\;s/>1SGFczlmMC)bZ-ʹ;24a'r /!"Z0MIɚ٬b Y,%ث__ ĵ۵yҶG 4 ?$ې"YR!-Բ,kDiȪU5ۏ_ƹ.{/{BV>`yP~"ɓ(ǘ:~|—p,\_C,+<7،AeM>ּwޅ?sD<>Zޢ|~m<]ԙ9]bޞ?(=$ooLĉַ9&XO5Ďp d,hc@g?Eךnuy",erq7;Ln/)F"GJ$vnqu,o:HNֲKj^'A6|ʎ(ATc2'`'1$xhV-!"-rB آ$QTQ#D U$5TH -Z-NR@QdP؛j@'͉ivBbGQ rFÌM9ۜ ~'Zϼ/c{1F峸+ˤo{@?m[dޏ=rnA`h,il@:=1=٠V!|k$s+?h PJڣ)% 1Gj"@O#`5έPVye-RQw=vG)1'x?,ɿw6į{{g U;U^l,UJԢ'9gf { [Xȿ ח"Go8_;6{W_;WI_Sࡱ/Qz@棨o_'.V ë/vV789G+*vu dє(Q0bV̰IȒ "}Ds 0]9C,(`j/d*FKl- =jo2sQǘ>F/6u+&}~Yj)hiO; n~Ý#lkJs.U ָv3#A^`9s ,>uo c9wKHs}XasKkR0b*3m4IT~fk#Yti"oނ|ce{|mt3WϑQvn f=V\/pJU] Fp6-Z9*%FcOLnnE Auj`H$*Ĉ(6"_TK%wރPձGM=Z7Лj*f# rii~"]4\_a4%d=EB݅^SUP$I11& 2&wXҗ)OHϞLLѱsFȶWma&E>ͼ8.cUxN-8 >p.1ė|;xxD.^/<.{"K>aߤ_ҹ'#l/[狴wQ"Jwskw#O92{846Ae[ qKX֑21G*)ձ-Wo'dl%Pڌgp+80h: bL,XX MQ$E"6(FabE*mS$hjH>B5RzU9:چ+C5AB11kƈ2m1r-#rBRYov 䘞^iPݔ^ͤrJ&D ! C>%Vjl\s#Ts dĂi 0eJ}L`"L\|)F#|%FODB8iI"jNH؞f8ZC$Cʈ$r QDTՀ!_$I!|zQ/<UΗ XIlEN#*zADoO m(y+ބ瘴grl:BHfD@^~tM* ׉SҰU ꃖ >Zd`2UZrh9D(w slⳔw~`3+y'zY)696'4's~r Hy"m];ZTޖZŢ35'2=Vů]d[,W/ǹk9Cm&ZkM-ňo(ѻ,2Ɍ,ec `6*m sz[e`uҠu%uÇYjpZ|],*VbumVI=zh3 8;ί"D)N*c\:p0>Iq#*8/]~>Ƴ 0֋-B2[[Nٙ<}PfS#x痈hH2 75orh)l?-s"{gQ^x~n'wOca{g, 6#$89sμF3( ڗSP)=C4U4<1nqSh)nQgp/ 6X);;bR1'-2Il"뉌cH%>y4`4:l/;gy_pg$ʘ114[ ZEw,RRh(:&te2*B_+Wa?k+"[dE:,K̸ɕ%|$+[0V%12E& S$j M36]-lb IYDAED.QH)Xg9Bd,{Z-L$:ɓl\ov(a f2scѐEk b ,44ϢZ:|)@Kcwi40u#xKA$8fH$6Bj6=wnoDRDq&&bL3Y(/{|orGWxQ~#sC k>_wf zwbh=]#|tω 8gL'>ˑpw+͏]|aJ ~'xv˟K>?f3L+{PzU o7a (#},ۏs?uuÄLT4vգL#\aH7Ȉ<ILH@EDK#AuXNGʲG5;j\*$c(eXס5` nrr٪:m85&OR#oy\70"LȲ݄(+ 5$qrul 3ZΑzMˠI22{\V{"/ȊCgP E @TdBU ^hQ@8!):lS@T]Jr%Ep%QBDC-x":BIJLIq 젹:Z,S"Pd4!m<Qד1ѥ(2Iņf3Y GE$I#Q0B]dNJ\9"BLBSBLnsS.B?`5=Gx6|f7}:<{vݘ %Teq$brLe+v9J*9%*-ɡE (Ly<Ϟ7%<~j~WNj!7H-XBCb1nLoș,]8I$wxrK9F勜Cs:)UN=Oh+KD7=zV-6* fD9ٚso{F\#D:4\x(O2E|-.cZOc_6NRntltA@xe$lQjx EIETB15:5q\3ay#D2MVߠ}[(mPzdQH!pi`8@0UPEypJg:Ki=jMFp?ROV\lh+]b;7Y>FL2i]k_OXZ"I2"'P3F@M^a!ldv??欠3b\*;P+|; qZ#r $(9a: r%f .# Q g8mh)'Af"E`` J2!c;]v&\~w+`hUC'JC Sso! s1KTk-.͖G%(RqT~/ʹcO!w7pr+.(5Gz)UjE$Z? I0M"x%"L="'LP!U 9 O># ,R;-vX\c8"\Ѝ2 an*O,/|tKGOq#f9i♻\<8?*mb?.z5B&g/_g?|:x ePTkgSFFCno,|gH㛿sdy3˴0/0R z̾:E=` oߗ+T懄L\9[gP$Dz,oZ/=t'7 v4O%ws>}lA1vUhSRv`1T)E`;Uj6iK{ls۸̠ug{r0DBXW@Ns^^ijN a`d .)M (Q$R ԔlReAjc SBa:BPpP,IBK W)5/(CDAxQV˂BEBڤRQ LMFD& j@QLW#Q')f =S(`.LqKYɓYtf͗M~≏2ں??90M2W.ÇBXz,\/вTqc#KcD{g!CxU#*X@R$e YC9yds>ETɎ@KY(PV9ts\~}}e?賥睠6Oa<4b &4z Ǭ#VBh0̋`)}[gɉϣ祌5~"_ϱyqkfo dJ*aA،L 3((nQ3oQhS~)~eh>o 1g) .rG.[-$!2HUnBT$Ո&)B~2MԦ JW_tb#,mi IDAT2Xz(~P%6%zUڲE۰QUl2%kac jgXȺRmNkG Ju* "T ˌ]Me(R>BQ;89XZ\d*fB? w3aC  sc4fO}z9nmofP\߶q݂^ vWY_fE_`V31MȍH%ăz;3<o -ķVYI*w1;O:\sҭYf1X&6[n/,d)>NV6x}4VOc1^\m~QeE7\Cf6ŏ/6ɻ]"3ÑS]̨k:AIXh5̟= Ǎ K yAvƸܖ;-k|A(AhFpߧP?1*m䲌"Qd l@r[ggF%&H9zx)LE#n_xmuL_ɬ Z,ϝyeJKe##R"GAjB1 z8qH@K "B4U=S㵛HSQ i%g/Aqs"IITU6u(B: P (pad@wgɌBQG)(<4 $OUdﶰI$# R")R‿R->\-0\y;V㡵;9>{Wy>1ӤΝ;2~f>?[8~釹;ـCM<iI]IXelXDyU6O/X=L6O>+.6Muq&? '8z,ٟ){KmJӀ<ˣLV )FRφAݟ`G::ͧɼA=\hZsxW;o!?<8$+[C޿;y$h 2o`X&kxxgc8),X|9(OK,u'C?.jkW"69Niv]moSnB`|dpowYn|g-ֶ?WnAϛ֕籬 $}/%\eߣ4{em3TᅦTAP7lN蒈+N,ؤ?~9`Y(D)ʭ |d"7h/7hs 寰wt{|z{1toTyGNfXesש<YN_0z6(]#8cǤb%'O G\ۿBgߏ8TjrD F0C]"CI,=\ɕ"`()\ gJKIЫ&$h d"dE)h2%P:ARFvvY^)[dV0Y R#h 2fqO=Sh5G }V dUZ(*,f3ųQU͗^e`:G':UpR ÃMD$@-{`7fu[9e/&6{or?s!;3FJz„Ȫe{Evmc 0/pE~h6[!u%->35_pB *j}6fPY?\ΨެeNE"鴉#sCmqevŹ/vNpxpp4%d<15dũFTXtdy[1]~4assǘ..L٨q"6|6wv&>n5\6InYp>Ab8q?:dG؄qCŢ) ;vp۔0?}_\e|X`~7 ,N8$ڑNq/}G:=^6Sz7s zν۷q:>^٥|%|t}5ٍ~No8>a d}\vzg4T<}9iM51WyCw CJC3;#Qh^H7\VO^]Wx5BۇʰָPnWMx-yc+xiR9&52ipj]ڢ7ٲf,,c̱M~ CFL|73 ,邭Ɲ_acz8/wp2\A8w$P<Ym3u|6.Vs%(vf` k0J6,D:A$>fMSt %az%4]!O"HE-JeLc*H"e>?grtow3vXR1r\0_9>SggpHQ0U' F,&k [w2ZY:݀k7bD_cRaڿ?2;V\`;7(WFc^ҜmPQ(f QT2S.'.dJj;35Z_$0~'2_8>Fx^_^q*-JOhFnլp0}vPYL zmqcq*;qL`HN&# ?k/)m zFKZS0$DFM"Ʃ;Ff>X՜@aXSj@񨌾ЛR6+ CTSyq+8^̙$RG:VL7MmE{c9? 63tOQrR[Gư{ĥs>Z9Ϡ\&|*L5Ta E\F3$1jR*je)bG-pS^B603ѱA&dJJ0hJ+42gAE"rp"DRrqB.T ہ8& B ]F+32#G!SMEZ$Xi$TJ`$ C4]e" FSg2HLBB8űj0PH.(rIFJ$B Oњ@2]C=#A7С"N5fS4Nw.ah9^ U3qvO9aRx޺W6v/,S%ƀg=ۂ?a;tc2YYH*@:r>H0 zW{xӟx8W&y)רq)G$fͥ[;A ǪB`&IP;! :&Zco9zYtt}2$n)c8;dm?>Xhl13 0|áڀc(lQ iHA4<&O/дiY9W~[?fA(RUgM:s1s x:KDzĹuPrc)ubU^5Ni| ?(Y7g}}~C]|W2 r M|> .I<é\^%T.QLXxq 䐞Pk-r{>sm8kO\I]5"*Gxms來UR ]>BpHQ8/#U4vp<4ۿ뗨=Ʊ^O[PØwڽI+MA.Ep՛Wp dJX\@+ jYBbcZP C L+eLFTUz -0hR0w$a4)Ib Q9P(kp\ dJGP"7LIB+lpuސREŲNG`|pe^#/@08}lsj4f`R*Wl$S%V]Rcyayk.|:vӫ3}bu^-puXqQd>y6e)Pv=A l Knj _ɑz2u@,?KtoH+PcY&tlZYAyu LEBΣ7f :>EWP>$d{q4b1IoN^[!Iq^*eGT\ L MFt;uL囄qiSLRA'CpQ69@I]"#sPK&Δu3 4XdLY$` c (Hs吶lbMɅv#Wk$INv*4Q< fDY R"9bP#a-=G`tmRt̼F5 },=l|D)]Ԛbx Q#e!T.Y6aoHԩTJZ\#oxz!trW!h)d$ƐM!(|ahLIhZN&c(@*hXiNQ S/BXZAb$iNz٢eqaa:RN #M4d)G'䅅V s01ny b ad(dmǥ$膎iTKx45e M8svUX6qFj#zJCI%֤Ě1P M9$Il.͑;T: ;,tulя w#T}j"v}3I}exrnSc7瞹͛G1!㦅ݞR9ILcL EU<*E-S{@0u=}ŭQ:4p 9TcNq'BF5 GtdHiuܬO$J DCGA!jnWB+m/62p`"Y\_Xcc.V\/N<>[o~}Dms~N?LcͶVp?M/R"b޺)+%t!&_[RZ =yO?xŹꓘ~[C}՗c$|RBTЊO:JD@=7:y#@q NQ-iHl2)l2"U2L4WI4j^֛tzR 3JR3ehuH!ZX`$ӔR@8yXp lFp5%hWm%6uku_?x=?B$o v>;<ϲMU\HM`m(2u>>=.r$96<~JTdvZWPȴ`d!5]SS!q3IbN}ߢtȜѕ[l~@6Y*3 PD4HAf\P< Cg%S0=$ %HQctS(Y2¦bJFbUrD-tABIJCߴ"ѰF5Tr+B&P5hGHp0(NHف\1g&I/ M8 4fB$X4AQ ,A2 ."'34!Lɘ^`G6iI4ÈS4e3vP(ES{f3K( 'y*y8oF~@IPd)-1Yb ‰3ce)v T(H%9 q80<*NĄDWT2;ǚL a;NSRA)Q(r&a* 2KN@u0Ւ=r9i_ O &;o5^U8rsBFvZ>vӣhJ(`;K9J*&,㝅w 3r9GyLR)=NC>sȰ! "JiĨfA:UP|"Q۔BӃ'`V0g >r" qhb*>s IDAT Cj)RqBuA:趉Qgp*eF6%ECfFlJpt@j.pZcI 9h:ZeZeTcwXZ|Mѧ>k~QH `[ĽfO=ך!I|:< N9:;nBWJY8`tJn%\j`-MRFXb]CIb'B1tf͙YLMC&#f5(NTi$?!Sc qVҨ8 []jҚi)%F}olhݒI(>LԮ8|S<[%;Й XxL2Φ#Jũ slF4A0";aai[Vq).]briVku,:p)(j Х FHwb(R4GHt%F&r] "NM.^aVNc*qtFCl,O% MGMGNAd) <:ӘxkOX>feĭ:IMeE$©6ӑOѮe6mGĝ̢UZfA2  +u*AQqI>Y}:T}R7\,G+">Tm|(GS(jN(? Y ̌>M/΀"Y|A˲"YwCsf405f+&2+)2 ȋEDą䪍4%NȳI R ,0uL)Zg:SrM?ȒrMW LHg0J ,ȔB1ɧ)%# (b,˨D%iMdBa*THQHL rgFeYH |ĩ 2L@:`E6y!juN=TͦlDRhHd(V 9@B.%3\8 rR,APX%Ҥ(nNU:u;߼Zh A劺/<]ϳub-%vF'ZSjȩ;m5۝u!!IN^d`d2X[ֶ VSqik^PI񱅢m eT Ulӫt/?,T:[+*`:Wp(U>_ , ZԒ p\ǤuX.mnj%w[qHsx ':ɽ[ݯ8.m*frr?ó'Nء*b!sBX%ѽΉ}.XV('u0|&Y`*PhäL2اwR˱q,QLh &]2wܿ*)BKF [40!J)Y*Cbmm3Ӓ2# QϠ]}TӲ^~9vɈiߥIubkAhO`,>e1׾࿥U&sFK??Mb^'=^ҬH_X֒T̩VUk\#sTxR. x?gvgVym;_=cFԋ8ʩ dBfKii{IU`G~ߣt Uvv#Y0]MLOc 8xcQFMUR# T G Jh ìqa+ cS6J*PĵcsqH˄%1@8ԥ&+X-*6Le`/nc*hj2t&9RZKFTB5 Y5@ iEn laYq|CkrAjדGM ƛ8ZSpqMyأ:pz6ѕdfHZi jܢʖX1-f-ŚJ*B! jU,l<xhnU j1uK%إ(LG`+ʘ5 3QfRbωNZ}Ieh2q " Lj=إ֣Q9SY(Kl}N V1ƭ__];&kS]1hÍ6՞JFܝ=mvKrAN&gM;}?)uv⚴ҴiVNJ/dM.h+ܩY |el5%/ <ߎ`M;!׸1J/d+'.(X-aT =-sfJd6jDz?ڴj )1sEV&H3!3Q%7"أ~=:Bk&qbߥekiȬa &0Z!`,=֙oPXw5wYW`~f/!$ K޽u3 pPGtvl8Ƭ>v-ItL3cѶRKL'h°عt^!1 Nvyj;;O>Oy.Vܐfa^a:2fEvW7:,Z!4m 025eqD0*s%wyHL m .; =~H:9nXNJ欭G\tf@-eM>b U,KE˫ `yFT 3  0LdxoFt}l"-jt>Qlgz)MӚwp4yvpA͍-o\t\aȆ F(ncr\Z+mL.EQ0_QUN;Nrj0dTHma,yczDqOuid:X!$G 1LD1]hmʘt&RN&'7|<=w24i`5MUi Z.m Cy?|Czn# ka\fQNKV cQ]K$I%l%ms.MƆӔ{ݿGэ9 yr,|J7hqO2)ٗ>1qUJrꁲRٶom!TLPR<{[ ʨda6d͂Oќ-jRYgzKg4^KٽpAo0wScn*<&Rm2acYm:6SvlXCҠH t^0P%e]8ǚF,8:W_3uqʋWgYշ3tpI`kMm{΅] x<*@ԵQWH!')3LS'--*%kh~b?6mPsD(a)SXʂXa.i-Jg)zl!o.j> uuMXr G)e X 0mDPf%eQOXT &HD%Z *F1"OFƬft ,ivMaWUƽvLy^.7.'+ O#ID8pVm8g83|Z4)S*aL0 {s5 ^[ĦŠp5kx@fl4g'Y:c?=bhfheCG9B|(~\>\Q@.F[v;G ";UExXD)MYQ."#4lt"Zz{ies{c]Đg=ܴ֝%Q#r)N"0&, &#PČ+EKG$+9.M$~Wqvz4fNPVBl_Ŏkei%i5iS|g;tWQłͩ3XwG/m8.wS3uf(,J9{"N XV"|V%SzP&)^2Crsv ?&F~ՌyiZZo'?[Mnmc.m<6j&uZKƣF}&I'txB5=?"9O๛drJZB!,PkrqK\|~I"ļq0v0lhC Y*1D>kSLR IvY,MZi\pױ^$[kI͍w%;[q(f #}0L|;.x1e_.{͈}oSlE3E͠AŒCb s[}13!][@JGO-&޻_}MS !']-q:E/S,v\L>Y.l:J:q6%F1*(uOYedb\шXqcRނߺɇ?9mfyB1W /=|??~9Ef%J j%\U kh):ьv.]@7}8̍AN~X3tGxK'j$ !L FY%kS9 5G9.2VZm,7nc.N~]i, ZDA4MC1' *)1YrJo߳蘰 t@-Q4=K.o[-63Y]"LA<5T I,= ;*M5*FR- 'VIX4\6MF8QWKgSq9yvv4WkPIHc"RX5NЖWv(#̰\MSђskmW)JXܼsaUzŭ#dgV&ZR%o=A~1i2 W|ϸH8YXNm Z{Q&^3`sC_ C[ODl0VD+[Lgf$!lFl*"oev4lϡ}s&8XΩKo` IDATr绯1zXVCȨӽ!I1 %QZZB4uMR,9It~EԸ,_ct6w8I࿀Ls@TdB-h elG0{Do$4rVo=q(ؿ[cWXm&Wt{pw(KޛKBauJ=qdatZ`&Gu67סnO< oY5}] !k8̉jJ]Lz*f*Pe84KHG; w`hIk穋@]n|_8WF6Q"NiAlAUT] %r4A%8 \4HPGl6fphNi6CMBDe{ ]wy;Qq%V̦'x= T(%~#./( /poq #|cD[![BbߟxDk!WbpF8r;q 1^&MnTL҄)faH% !R?(2)uD}3 WpZxM!kҦ;aS,P/T WU]o $?fsK7Z[/v!,ӕM QQoZ8HXOT2\1xYc~ap?$#z.Q3g-cbKsߟȘ龇\V&FP'EYXeNmjf\6<6t3KoP+-V=7.&;R%y!ql1>*ЁGm-2 !` G V{~.YX` j-5]:p4v%t_z'K0rgٸ^;mZ2,Wߺu*7{˜Ӻ/gpǭO Mڬw >`눢q1f>ӐKEPc[.}rk@g&$Z+OڦvjkI鹔,LM&E@t-"U8`,YKdVhLMxT"5VHtvQ_ݾ͛KSGdt\)̫),+rt'Py%Ҏ\DFXff15EQFCAaF@4/(wJ*5c1 Gg(h@44cJG*8*q;,s#F/qd5x~˜n^=.Q\Dwo2"UơRc;hZMU#l%_WȇS6wHS(&p-S *wP e0ES% j02k)›S_!m֏R!5+6Md8%߰r{hل]y$+~.pMN4 ![wI7BN%淮1=MhY{'⽷,TArCآi!U0,d2( tQvb18HY颠 |xĮO+: UR(ŹMқ3?.O=?d5ڜu=NgoɏnƳ屵 biiJ(k\%'cbR6q̬֚̚ yji\~ewn~_{~yp}|HÌ^eØLIm?U؎Z*YWj`<{olQ`R4nCh(AY6"4.#$ o.m3[/} G*Hn[CJdAtQlub>{QsxHs;i#М 7zLuR&{h.Gc8=wфFᾈܷp< Y`4_'[]ڧǬI '12E6'7IFeJ3ɜm4O2\>d?g')5_Әʨv="r kP͈YޝM4ӫ<?>$κIL 9vH.7(Mo0M4v K2%̤dJI:J|p g*¢8Tkl' au =;VC3F͹WBj¢;L-X=N$IZGܔ_oȑ8eMhxt>k)نrn=\{u#rc3g\^;©Z0WKEriPvst:NR.O[ ݟIǜRJ y7xexsl_y!М(y =.>8VK_]^m^ɏ7}zd13:*J~+׎tϛ 4Q͈ɒΩK^a`Y~ߥq5WqmEE T̈́:s_UY2!`9cSS&Il$a!MZ R;4 hy˽%˓1ZQͿPdVqZc--F(LCPKn,\36x`t ޚC%iB[] Q3I6j.9rf`QDƜ<(]LJkTu&2=AM1Z4%;SLm@9>:37_쇏Ug}r Z!1mD⇚ՐMlפҚ)U:EجJɽokkKpE̦6jɊPJ% F9v1W SD5VWӷ'h a, CZ}J.NJS9uhcy/~#x`o["p[ tE[fE%J6! M`8 =9`>=cS #6NNLIucc'xMYvIu0:R,K:Uvȵeex]p᭻l+.L/94udg;8[{o$,]uY_6N}'6nOtyKl4{\ʝjcf́w߻§^Fox/eQoN%tF&;G/8U~pw56$; h\KT}3o)zY1W#s?]9K+dKZdM3wiqjkss㛇,~ myJaPiIvJLC^Z+%o?!9k6:aLMO˜ysN_ʚCiW%ۤoڜu}ENߦ^n`o#|qȫ/V`&= 3<|eXԮEÞwmC'] XM !gD^ъLY6fHi>&L҂ڥ,jiFFnG!Ŕqѯ*| 1 ]I<ǧ;xfȜS9F[9zx?'L]VF \TL/ 䔬P]HZX ðX;۫lGLCn dM`rʎOSW2\Rl=^{rY2,~R4cmi$MfK %ɢx_!:kᶲXdL' AӘ>4hTE*[TjP~{kXK l :0*C~c8xOI$K 蘬"Dg \S&uѵ+̢_QBQa5fqp0J4BS0MIeWH:A{O|/E\n2qϳV!9飳\q(壂ޭ OF0ۛNge{myi_v}9N:Jj%Keဣ<00ac]aIaHC2baUbaMp.-.l.25Td$q` hZh5a-{  $LQT2A#t$O=8 HLD:>úv;vd+Z8cZ_&&υ{*G< p&hN<(]#F};/M&1Ss(1E^n AS 9H#% t=8QE\5稾qzLU@i˔jge<ӽgR<*CtDI&%PXpP&2(Zwh<D!$Pz#p:H]6Y("G4}]TIo5hK|*bVc\/lPrB|f9P5SdoNemeA`^$tZzKg.8^aZ6Q{3MXdtG%T8qgXDF H/Bܣqjb1$I. ! ~"H@,la}MƒEr$ "%7dU#&0DiHbGkoZ+V2T$R9[r#D"Mtw,VfeASIib C]DefsB |CGHAߋE@iyuWjW(-˕4j[e%!&4َ, (ix,,HT fBhxJj 5Bӯďd^@I/FnEQ Í"ŐEC"ൠEJCyT*з4B+WL-S{+k%&T t$2"I't|MT҃ZĚ _D "%ٗIM] Y(Ca65^Amztח9aR#f/ZG!Ӎ5+.6 ACLh jPq2aAB! #DQ@DLD@ABR $EC'!o$U33@P:DgDW~N-qQ҄X#ԋ]VBϡ뒕rTm6V]'q5ܶiLMޜEHI:1q{tt}oeaArTvdh.BRmv- ],ȐZ (yAJ :Ƙ#giO/SNyh I@C%8^~ǿBy|' 5Dl8"P' +ZRDG3BvBDD Çh6t-R;\);5rj}#T,~?A6Gl{Fjt>qD7Qg/#܊,>Ǯ{f4[r;>!^$lcXMEf0Wؗؾe\ѡ+ICJP!4em:.Y?CG5Y#&|ih K. "WR cԱMsz^ ~nc 2M{tŽd4M/Dوحm%h4 M>y b3d6}>2 d2r/)Ʉ"&dC3Mn!v^?q74o X 0evѳlBPisvT%V}GȻ3dU'd.J[m4Pʼ:eM$Iy*s-gힻg^l*+9&عkZ$ll=,qcF`aPM5dFes#Qko^չufVڼu&'O_i{mVa+qiUŠ$&1jA,YIoIdwIkr,Mru jt)=;y9bkr{?ƶ H_V^wbv0<ޯP^h:O4l޴Ԡ]la.luls$ٯ>bO=Ӽs kOzY>M3Gۏ>gO"+ ŐWgC:Ul;̩_]"n[>5Gvqӿ9? ,s0az^}um, T]_Xbk=N>B38oNX>C)ƭog7e-x w򣌏<;~kOP\A.u%I)P>Wd*Q4q᭴< J%}ЊU05MzmbLm5'i(2}섀J`KmrrI>eCFY٫Hn[y4~#QM9f.|Ӽavr/ ٿW >{ſ-T^}ϊTK}'~3l\e/5| %&5nX쌊H#; hG 0.?K:$?^uc7^nk#W= ,hR*F?qnN#bTE.Fi|YZ֢v:&|VJC(*<'}OqJ{vJv@ǫ(A0efДqeip["BM^P ʊAO!Վ;+yiĞwW{6b!á]':̟xՑA*I!AgpK:^Kň? Bupp::F X{AO2l =ۣd|E t:B0]g@,Pt;,]~_G|W ,91V?pYѯ]'.^b\ʡ9Ѳ8w^g~() N]K$iy)d;I4] \"n 4/%xjpcsOq3. >vJ yaF\nH41n9>6`2@-G'hmxN#NI`gw~?o~>(aO{LXRaAFT;,L KNx,;wR^ajpiL\Q".=š݌:LJHoF н#^9O*PȦS[$ 8-6k]l![",'Vkރ8KW_nk{F9x˯s{O#{wPDh9V,P=wCl} 2K.Icz(7Dq;t11gsIq5E%IX]"eϟ~N2}/ˍKKT)^Bmc2,IPjH'XBF>"o-Z}GPiG xm*)Z'!dNuV,UŤ$s0A :"87D&cR*o\$U%& 4W })Q\G 9+ ~ͥˬ6I5dc2Q“/pas9̟/;Mj 0~`Ed'xE~gNR3Y/4. N5z$y[81;Уvyl^)B}X*w7.=q??͉Mn~s]+DH ygDdG m/~w,vL``9gX'h2pSɭ#7pOӷHoMN6F#Sܫn!a$)!'  nH"1晟9;w㡗tnO ԡ#NfNl\ZœāݔfEZی5[T_52Q[FjyM5b+XQq%@%!T,B|hl0o DW,rޘ;ݞf`GTQ`:"*K/$(s;;&Ƽ#_Pn(<o? bqa< ߸޷66*"oO8N_<ՎEJ prK4 F!#V VM:kM{[]cIe^t]p⯪|5=w1ڏ8^g(;vD4MǗX~nC;mh&>\վO비rhe7-Pl20ows?coG^,;M8gbk<6,dQ%60 F9?M1Hyˋ:0)pҊklGГ`)0\^yRl|{^v$ȶԄ>[T{/N8KnG8ɩg(#re:>{n14W6pIҔ%hH U^GC]j2z-H$B{v~FV_5P55ﻓPǁ/*7vժѺFޓa(#[#Q \`ʲ7RJe{ϡ xJ I jgnU}P2ЍO"?w[ddvl3NCe6./!6@I/d 3 hzܨSȗ$\?n1,V+ъCNvÆz{ ϯ!'-JQDc^ߣc8vDOlL3Cҕ.)]r"==[XzHҹ\e9ƛFd`"qK譶c"4 ws 렎<0s'~_Z]!>Nӄ&˄KQ&˹e`sT1|=]eW&;e\ %/ӚH]֯?Ij8R?|}ü,XYH\a3l|kz(k9>;!;3礐g. çewͼr86Q%h|2b oɸC&ݚLk1f똫`KhBjt 6Qs)m(}"+  #T.6Mk &rroN&g׎eu"Ca;M.<~Hȧj LAPM!ٔ@rl;5 _=plnR=J1b2Ɗi G{+Y Ox˜17c{|Hv䑥[a@hoW"i㻹5w~4; {oĚ(딝-FI)Senl''t )H^< &K* 7hl__ěy C&o_pmӇ`sgXC0rzR%UB^c)IةL۩{45Kh)aU:8LA$#e'w~>WO5N RiZI! "]DIH I$) t S71P@USitRxWM'̮3}r2y_ ']nϮ-ؠAq%tB<8up#ѴD+bF0(-8ّ-!iUDIGH}YI" V Kt9zj@\|ҏ\q>‰>wݻ8Nop;ȱM^ϐ*u↛%.:80"&8vE]$ Dv;hZQG瑗34e&^-fC .ET (mc`n4ǾäW8¥pM=7?HƙS 3vie/út2HbP65r3T>N1Oӌ73/HFԩ)u^_ۈ+( ,B Lr̐.ZVf3r W(+~ Oddp ;żi֦8Ǎ%|eX6 oq&U>_P>};,NCP6dZ;MO=ڥos-F;iM-1;@=GWOΟ|vQm?^jA\GwQm/=]FC=Ȟi4WIg,F &ҶA:Y` *zNdl-3tY$v\1S?svǾ3RD|fkGH?ꎰ0amAAbP3H; v$c( :-3r]ȴcH*2y3|jfo+'YΟq O4{WlU[&#M|Mt;ezoUys)Eg/qe0pC|qot\ ?37~f=凱jY!.qkkc骀 0)8e{mӧ>sGK7a`E6>'yu+\X==(<'s\~wYuc?R 9oen~_k?Ǽ{ou?sEJ%Z3R18nm+2St)ҫ]Z:FY܍)|80X|_='{xIäֳ3Ʈ::..2.2:Y`(_"I!\D˦fRuRCY>?˧HdϜ|0X.V訂F`Ga,H@P~@.!\fnV3qBtA!] 5LbHE BO6 y"BbN"Rx)Ң H "},GƯXo>#P6I) f Iqtb6%E^N~exonY|Ux4Xmnȷ-u^=7hx/"Mt%iy4DV@t/IoHcjKnqC-S% ''* m/6zS6aaPsq+<*6CJĭ:k;`P^YU^"T( ;Y_'v,37ҵ6!=MNm%A/Ùg2 =u /*|%#EYe̴ŝ/!~0k^tظku|ms&(0OEG_9%jXַ:OʴХ.X\aڿ9_g[=q>zaHhwP^Cn?ݨ IDAT}D]%%)Jh RG0h=ª.}mQQXQA`0;L/o5WѵyIv bZH"RTLC)Yt:V0%i*c<_(߻58z>ΗV߂X}deqQ7l"-U?2tĂ;S'荒y/%2Vl!D>B c{nh_=*@˺!6CWH[w>ȓ7Cv@,T[f?__/11:^B=IwpW-cIwQAڌ\ v#ۏ@3-11<|kE+wgA;döMo8 L2txvY(Kx8Z1K+EO$P#R. ȾC..+~F\Q*)f4Z;4(cQiH Nt"1I!G:G;kn!:hEؒGUCa "Dox@ۈR*(n8Q(*X~' EuV(q6J\".p&1E"hG0ZEXbLnir3Ü5-'$L. H*7Ekܤ`R#o-8Ɇ?mc_)Űz:.J4ErZ ]Otჰ}  RsGH핰| -'ՙo*?Ln'NprK?#>fZewbHu JWDXu-qHvrR$zƛ%[myzy9[,tg2JnP_U} *f^0Y|.OEpѯi6RE#;՗>6VY'"`K&eto9!pU'M DK|W[D8 GEO82f(kh- #v%1 Q3Q%_QQnҒRU&%FzX4Z"jQ$ݙ('Я ~uViIa#cxi.!noWi#o"}gc;H)#fb";:͆2-L?'QHҖ}+/Hm'm<~S'Va=(N% ȒN䳯p F}oN0K7; 9sqZYDY+3SN/WV>IGؿN@jIZQR覾zq3?r0ab`X$qX0˘7lڣ.pKY)~2f6no'H%o4y. ^oyt۶oaz;Yj5rBԉNbmjCm"QWJsFlrb6I"SK)~M}>Gx5nQI:,J+܁g(̓}pLyj/}7rˮ]_|VAQ.6QYzzU.^;zw_l܎:Fwc';+عS;Eϟ oIxƻ{'7ʚ٦;^gō7"r7؊ţ#-¦[ifF.Y%67/;YQ6{C֊.n^8M-Nr 1k>rˆmz+DF/qgYh[; Nr)Ł Is,՟bg(M=RY]X뻙5+X<-3k^AGY16O}c$s$Js?tbEV>~ - [tVK@W#&<ُpBIH2.jF(4Ao#ؑ@iVBi3_E,JK.H14"q\YД J\Q&"HYB@`5nf@^q QՈ >XA$dtl҈ 46F$ Y*~Pq:" a"(` aJ"$b(BM u \Gq nDm䀑q|4AE$Y5@Q3CR7$oFhZfyŤhhx@+3CsV4o[6s,lDկ}-Ό^ h(J~1nўq617I>[w!"ͻJYmYeQhPĪg 3D%*st\be%V Lj09|`C`$lח1jc'tS!c"i; *59&W T!GIllVLec>]F`=Y`bV!TX-fsFqrbQf0_]{͕)>j|1Nԗ>-/x?yzO?Q˝q t7v2n}wM7칯 79xqgꏳx_h$ . .٫^y11fo6%CF6 kvwXHWQ6+$C54:2^"̪LyY!JwH+F6l\Fgɝ7&7RN@Y.y̵5~LJbE`ti[bl<ϰt/,W=E<f HL"G_~Q;Fr5,ӤLHƉ)F@aΕH1Ӹ u4@N$[&SuB"Ox^^>p#mֶ\*ԕ5։=I)"] & 1-@Ն@[6] 3_guD?c'~/`,C@i3{(޾f\?̼A&SId е6݂=ҳ".Dm6&\vR;CwT#M ZviIwJ'w{h>DuVJAz=">3Z-i`u:t4!V}+w5g~ /kűmlxHwMdc9lR~LtP n?'/Ӿ'7;wp7M9ο .쇑%t8΍1ykȷO'{Ͷ?HOfjF}Jg0HR1|~_?xu+:v$V8ɘhY467Xw` t"Xbq)OSK,P'Y3X4ޡ :x.֪ ;oUt1C۸[wɪqR!(ˉaƒ8Gy=N2F*.ԺBq^zs:N''^o%Vn+gZ{\e:;+:۾s Xs6N9pޮ|kNbUN} cyb¹4?՜WkV 2q9J\IQ&E7UfM*0ҵY;y]'x4OϢ{wo;"4`yy/q{זi"W>a&J: aԡH(5<=\V}a-.!#N=WX^;@!J_&0-Cd0 .vٔ)T):!RdP2ibzp=Op]@]NM.6:Ԯ̱d2)rbJ,P1B uOoumhF"npemo{ ;gp ~N"y6e)EůY-$!O#c2!G6UB@@F*UBr@t [&GF#-Pĕ f1& %D \4a/14BA,U,4MDpMID2Cfҭ8A[mR=µe FN! dD Lz =dINH6 T \$ DZDȽ;֦{:bU[[LYc!="V=|y>5G\b*([Be)Yed;"Dfp#nEje>PDFٙ4P(qs]rs:11 *-u:H QQ:VWx6p=qo^UdO!з.e6p_qvt8\.u\g8]d8 Yo*Kp"Aۢ$qf`lG)4Z"ڂv@^"\-蔛(u-_$yFM\`Wu21PPi[,)uq.BYmOff8J9|-nozd+ LEϪ IDATjf$'[ +R-qs)99ToE\@Dn,32gfjg\wp81BLwd[T٠htB"]W jHd1=XF) Dڏu0UbHd]0֏$h +2ȈM[tY ,<!#űe]4VFD$]GQkT.:M9 ̳Rk2ήM!տr;? 0Хz4"QVN\鯛r< Qؑt|`_bw#c|U_`>mlKٺFO|Q> roF@݊?Bɥo/_|އ~b\ Ԏb~V)G̭I- sY.]X;35޳8 ')$(v8#nEEP"@p:JRÆ|&./ogyF@Bee-bik"!G-Y7҆ZW!xY $jl϶P_ 7yCd("U䈆aRG|UӮ{϶r֙b fbG1xy%ެwFEf{cq`Mgz$wS+pB 0a[CN$cJLn\u Uo?"7U~eebQ+8JJ) {G~6}CF<ҪRRtVx vO;ʰX)J.ү8V5?}>Fe4Z'qN b)?8wm'I$.5DKLI>j?|¡%4AGV)X84X.ӱZ̴[ +l'_= g.~ݮ(xUTܱא/2#,BzINVODŽIXc-nsB/qj[5}LoZ7Cz!ױ%DSerdwuVm i"ͭhcl*`己0y^ף4[5Eu%OhHJߏwX0GDdס/RZ[T]vyͱe 5TA!g(t!`eT!Zt< audI^')!$KۯP{_b\Yxo\U88{~uH|XK|9^'U41nR6%+/RX#b ǹJ'\FNDe#/_JɬMѻOc6_QV<%\5=Ml+$1Ƥz{z_L祫X_a8cFK\5C'5R; >OMF)N"}iujl|3SFF\d |8M>ņK1Ns#ܰu^ obW}]6C+.sY-QV00`R?0>rC[$t;EOs|0sï#fHjXMޝ0{8p'GsZ͐|TZT.ftS9ZY Q.SXY XA=FԈ0]_VZۊG,kj#$b,|ԸO-8qhQYVhf@ n }HW0Wǘ^8ωs.Vu7RpVBD.1fGi >zrYUkD(8aD ې%h1:OAhCcսI_8=]Ծ3ګS;\0DNjIN;2L`Cxv-51UXlc璚*)ޱ-;nCyAacڋ\I^VF9,4xA{;?pȰ$2r0<|$kXjBQR kXY +" %7RFcLZH(gONn0_֊,T ]wbLgcwMP<Ī-cҒ\[cI3uGR}M9ƵoqscMUS(v;oOf~uuCl~Z~Duv3ey)VOGt,A.p-4obb؁Gu6fuyn~^ګ.F2X31мDqe$4Ji7<< Q'?HOUt#z!f%Xȶe"s3.pFבfx#tA!JAeQ%c<AjZDBtX ԄG'Y19 V0K Yt$ڒU8Srsbun$ Gigu? {yF3/32P/s[OC4kQ/˔B3xRc $Fb}7 lәY앣 L _^Eh"-&&z0s(+Rc$3a! !~Cň% +(Q`(Ȇ`(BDEaK!-"L,! -H#DVhL,b MکevDHR@ ŋy ~K"P@TDkqbb?E )YLu22`qLߦ;T[M4j^Iqb$B\N,7qB#A$VQ*]L;/ coq_^r&[7i$].o~ޠDZr|ZIHKH15dt%EU0r3WͲҘZݎיEk\54=mE.~?MpmzSyj}i:aҩU^Ipy|YShd'q~'$/1UMivc(y5KH+ޚAUaI^eN7[ yGce`FTq Oo[fg8Ek+]0.wȋsWꤍ(7|{FoĘǹv;dǺɷ55?ܕ4ixb s?=|?{'OXC}V^Zg&8so '_yP60Ic%QA9@c"a-7$ MP0Odw'ix^GB6: #N, RCvWG%a2^G )gX\YTW9xl!'^(R 52$&Pb4jlϫJ ;L Ym5Z&^z:*E:g4Wo1UC]4-siyw3&/nƟi[9K[lqOz1J2ĦmogT$wn' qԳ\l:Elh bbkJsWz5rr3'ކ4b4.⌚:{73ܐE~l"p/nrҹьHTHzkD&ɤR!Ecn 4EOog_f]yr5(nvGC"Q5Q)Y%BVd XLh2vHk;4ƨsOY:9r{7r" q| _,p}s,dr15NAQI yAHǎƑv_>q*{ʳSMH0M3vq"@G |ס($dYֈ|-d}}'M( |l)gljqy(ۄae"ijQ\HH:bdѓ\61]Q1KId| uH)خBL,"iXESbϠIs8b L+4;AbN( tI)YccT6v9 g|5@Hv)x<@{dk(ܞ1\C'oR$67 [ xkG낈Ue1At1Xbm>'x}5'|nSܹK<0c7F:n,"w30fGO~9iSdW-OϼNJh8=ҹxyw!4Vl>?L89Ʈ2·KSpRnaѥqMa瑏7xfa~Hr1ƫwc?ά&z^Ap㼖|jAަ7ܿ $ŷ67fȏ>G믒|☽A ]_JƷ3Z}bRGrH(Iȣk@P! :DvE|!DB<&O " UD4dAE$2I>)R-b H8&b׋CA.B $ M{lv]Љ !B Dђ螊J`.ЊpWGA*aiai#˧g{hxqq{h•r@_K|juXMveoSzvc^;.~<3R›*_zVg-68HpoR)ı|=>;,qQr^! -vǏ6]q~ qYpc$Ĝu2<=={6Nd.C\c-QָV3ci:cJO>ggiR)t`s;_8_v9˳-m%3w Xڣ-D!ͨR!(Rs1+0~JüH\hR|!1aiGxÒaR831e X/R7{yjU>q>Pv@a1̂V:9`>Wa9#U*I߻Fb S3(=+_`*tɽORkw5n?5C3',!SϓIdFi_$fHmX: @@WW 1ҐW.,a  BFhD(j@M4 Skd#qDE&p%@A\K$'}d H`dE6IFOa>#rՇMZvZ %Cc,%a:7~_/ע2vyrb\D){#H +K,;>]F7diYA~ĽDĹ$V)Ych&br-}H=ԇ!euD$ɦxTB@wOG E˕;,>Tyչ/'HOyfjc9  ɢ=N-2=D}{*b; wP2fGU4O봆L.=\7N6sm y`gm2%0'AxDE"uSH"0P|Gd\.\9G3[/r#Od$%%m"J ̰GM u}7 7L> IDATDM35?̧z쿳9Ng]^)r?=%U?N7t*0`&f &Z&ͣma}jog!.jp4F2<M۽ÑW!8Ks-Ãk0y% .箪禸z>F@%=ODeQn'$!'\~ѫS|)LAJu1z'O4ȳSf1+lƑ>xJ_cqI*W\?'y3!)XMbr/orCA(o&X8q#z4A.كU8:l)ԛPy>wpƃ]5PqT~`qOtE*C,NfBN4$Ri(O{]մYIGd2퓢wjqle6{>yHs; @2N_)B63ǝz [`{8|LL-0._d=nϰG=Y=T.qPzcٮJcM{0T?ói>"X_aj-{ya΁ʱwoߧ<}_5 cLX0b Q@q MāA=vF].Njt% S( zФ )WƵװ6z<$*J>Ǐ9(وd?$"lEDUSȞL<$_]=a( ψiYZ8FșA "r@BwDa 7Ie躈IQ_dW:G8Ncж G d$@Lp# 4P,Ln+d̀R,MOhrCo|o7=?.31l^"fpa4tAȌ{2bЎt8h+X Y7'ХĠzmDH"h.%i# Y|ˤe͟ĭy\Buz*%,da!۟|I.䫄#7G0>~!IqHy Ny0A]u!̻e1!XXS\7Yb<qM{Tf:KTgo1^*\ȣ LO<2҈{^!frBLASn]G  {iNМ'13crlPrNȑk@L"Y$YPq% 52>ͱ)X.@RZ ea!vqy*RBXx@#fccOY;mZ\I,<ˋG2yA£x2c%팈pN |1K*3 !^!2N-/IMbXc%^ a٭V=uvɜ!woN%hJCIf-e'wHO ]N&I:ijK"mlbM vk̨^ HMܕ͊2NHg1~IZٕ] "OYo3r駱d3f;9 dC6E^c5Y\ꎓ<hvݡu79m2?g-گ;-+_ҒY~έkor8N:;#2qYАD/<@ f8y*?K|H4NO0|Nc\|_k0g8v\Ήk *<$> YY?^pV>F ;S55ҷE>7z-瘻q&S&@=!ɜ+<`j?5r,U$;ɹK\c&K#R.ѐ_||Kdsdv8q,}4Ke?܈YUۇ}I_fK{;^$z#>Wv&6B T(x~@$@ z& KcE1fn!3V D(~"2-4B@S$ 2b[ &A`j2QP5GU}%Ǒ$D^X @Q%>Xf/a"&Y Y] SP\CQGtLЧ[D~Ip-!г#v I gdzHK.4C|/D ?LX"#3 t5*Xt[-|'eJI:@(F&]n}hn|;qo0}g&Xxm6iAOFcS+g891U~FWhKJ a[aMe3RX ADL`zqmٱqfK}#hԎX[5<"MFŧli6hM%SKuNMBKd4Q7`2y:ɮgv9$|KMn1[6Tk{ :R_@NbC7ஒ@qZN$Ŵ&0}M47y1^TB>~"F&I{Tۜ3?VQC$JHIP@F }$G5BAPm"'uP C HahGY704_)R"rc.bvWIMtEGJr*Li H!b\6."ôL*n@TLqGB DJrHO܉Y&a:C˼9 )Qcb2G\hVMiHs$ q. "b8K) Q>wcFUo ڬ e.C5'E~@˒D 9g"*tD "yB)lw؞FZdKq0567XS;K z{I,#_/,#7I4<9揗Uc=l !7[u?(?Fpo w8n!j!1ƻn;`Pؼv[.اb;4ng Z[XK4^/2LorD~vk_EJw]Rx#\dOz ;"ebFN@SmgȺy#$0 yF{<+/;;Hg\A$Kxڀ*yKb2':>".YTQi8QzĜ6l}%5& 8޾$xs0.t78i~K}F#i:&IhvIbܳt~dk/s)qӼTc5?'2;s%ɸ4= OtCvǤR];`0^GNqm>OyLL΍I5qOHӽϩd4֦I-V1^m oð'<n"͝$Yla*|=sLֲ|!_}: (Σ_d?#L;cRqT w4 AJt 6X~Lwb2gt7^p@# c|tGX8J`JDrDh{0U5`aЯ!HiJ`QG:0) {KUX50/d("2H>!a萐_B@#>bH*|"'6g Pp%QQ ibE+ !IuG F^@$B{KuL@ U]5=MxHGm_R-Bvf EH hI‰<Z\$P4ۑ:~gQ@K;;α/}mb5[_q ߥ+pRc)k15r"EVW>T!υwVkGcb˹;Y*[|O<("JGZC 46ŗ{@T%Rt^"ANak0%\JjFYԵ/S/Fie%~U%^fYWD ~鯸H}8}CJ,S~a6&yĝ(K!"> Lα4uO.T.Ji5qjH\YfbA8onk܃*-.͜@>MfMy$[b<ᣟ8Xfr Z'٩hz ɲ A[G>Xf |Fd b[=Z' 851b3vZ尕 ´4F(Tt92aAt9Noq*t> `m ;cPo(TBdlS AD#EB>Nߎh 6Yt>׈g{C{@35)(!2P JrA[evT`onSHKlȱ5Fzf%b롟rrofs` 6I*$+ ȶBVljf#['I#FÀǥw,ϬL/NМGtQ b( Cs4T&nnO\vwHj5F";<˧4O,u|G4G/ +~c,*,՜I?kLzD-hCFR%{R:QZ!T?fZk.ꈸ2b0dۧ?_݊3w%f>\>Opbxˆ]1J,O(᜝c]!{Iڹ+,hfci髄amؓΣ֏9es}6"<wOQXᰶG되QSDbT29fG{ȣ(Muq³'f<$ * FYw8  w`=bՠOP'˟&n\0 8#:j6Nat 6eR[hc*=B~kd'qsDT N@V:RVg0L$ [)z.yEdǬF}7qOl5hoOӘO~hn] ߉z&㊌B7I`x!iC%LV d{m 5b*A" m1$GYˀ1&ȶD ETc CN:% `I\=袋. F/N&\ "yzaWlb5\+@Vmq!bc9jx8]\Gd *uAlhTcC/(]dQ$o8= 5Hij< 0RȞ˨Y';Fw A]ȻqLs2#Io:YgdAtʉ OO8!a7+2K}R({*=Ǥ Z:Eg\N=uq7Mf2zGĝ(ϝgN|h|O,YCRM?A̵ 2Pv$kPHǛ.=7KqPw\5+=Wet)l)ft'h)^͵9R5>Bf܏sy8YDi4jqJWHqWx')91x84\pmGbT)'r7Xj5H{kffRYZMw()sċ]nVw{N_d7зaEza0#39qdjUΜKx@0p\KNֹl/EcL)Hqne \"?uS8ͼG8W<}2QLeoD&Y9~e12ťM7yFUNyrki/X\ZfIL 6JcF!phCGdYr7l#\ WY4^kê%Y{50P:duLGpIoe9Zd\7do~˫mRM#L$Ak2V.P?i޻%6ʾG45+nJ!QX.Fl2QnT4[L6CL@F%xl;ťO:\kf8ma,JJB[#+E<Ue\4^$ u|ɡ]F"'PN#ZDCN ѵA:g}!WQs۷8x2>mSBGvG,JyZIlVڀZ5Rʆ zLgeV]m+^+rC;2)ps+#gK ]G>F&2o`8u4{cgcxay| xb\) KBǺPHH>-0A =bia:0uo넖PP<2ۍ1^z Q-"˗YV)>i1IZtZej8 3G8J5OIX鐉ᘏ5A͏o1RޞqzHeObvp +>o$jENeƴ!Qߡ',93q X,$ҸnZ Mo Y "m>n(2l$qF1B%:$mP(  t n 1Ra F]rG=ߧS6}ˣDg(F=UD<E 1IIF,C6 -y.ڨICBTbÞQ G*8f(D1Bͤ;j>1D1QhYV䐌xF$"hVNmO8M8i*#' e`GJ!XGp ]QL0C\&^" q"G!r{Ȩ&2XFЯBBcpkn Sx? X|Bw$!>seqRv uݶpjQ"Jc)pW(f'Ǟ$f9Wdnx-7{u-c'\Nxx>@y~b}s,=0^ǿpvA˟'=]&uآinli?ήxd\ s'}<89k&d݀cf*6<>I6/>w0 IDAT)ߤjzUj3iq&.#.)I# *#CjEkF /7dt[%b~LXN4c# g_BԪ1FֈG+(u_XS`esQ'ؚ@ X BR":A'Jm1{2#vvC&*,T Q!*.h!;5 ZRŽ\7e+;RK+HJR ApZ*zO' !) i&O0c׸cf(pKQvQ _3?ؚ-E-B.EAHt(3 * ] v0prlʳdE;4|on|l<&w+\Ȭ8>oMu]p4Gv]fʴ#vEܘ˜⤳Y|A$b~O̞+IisNW2w-M ƚCr1/_dtS\HC޵㤊 y#dw}ݷoUjU޴ZX41 {C3va`yf B-!Zt}ګޫ/=,`L}"NsEG6==FLG鹈Ҁ=Ck=ʇ|*OpF@vVa7E)HAX2]A r&R zǮTǟcV\zgnr3sF2z_>ўS.QE1ʩ9*.=S3wZM{V|c-}Ic*{p_[VY{y";5.,W :j5 ;]=lp`|/ˏ [G +ADsʊ$˔n"6EӸFog (ha@AH yУo(GLܼC=tV#|jeA&BHu1jHM2#Tu&D'%/1I0 q5 %SHAb9GKmA[DZEq0.619R-&ʣ6" 82D^ngҔR?m\\u~/v &?{*$['/r+(w?wǞ/q11k!mEufOP`c{9xYofܿs3ŹYߋaHXuvZfpSBz>c:V;0 lF|̋m(uTw[X/,Inwt'!~?tYfDUh~5{cY!Uext #KزxuS\ɔ僟WVU߷Yoᔑ/32[cZN+ i C 箝-oVeB ,\x#FN!5x8Ϡ=T^K%9?0"NaP*[IYH86RΓ}]giQP48He@9lRTC,mo3ct ګTƒ$A ߷ײ7Rѿm]`%wrvqo5~j%ta6u8\ R0>0BB^1dM]xxfH\`Yo@, 1Fq._Y. ZYz:J oqO]3ĞMF T6f*ym.]Y`xjN':axer[F@ .2Ц2nH*f*Qg|)s+5&{UκڠTxz]T@=/7'п3c{7ٳU6Y٤'9Yl[̆޼Fvt}ω 2cìxf3K9r+?gN %Q;ma(Aa`t=ZVVpV($!i"j.s:R6ۤHx+kQO nN PT+2EةB,7Z$FqDZć0UmVXK5h\,"YI3Hz~e }0FO"E J`*&0 C#`KcأlH?!DǕ9ZA13)1Y*goo2fԊyB&l촶(o9W!y14r BaAAZC?/ۿrɗ=qWϰ]40f14PYڻ#\rEZ`c 1KE*n//k3f?Ybg~[2m/-n-oLQ&힥}#mio{`>` {T!Z3L|3r%UBRnSS3dRUec87ٍ_`{0+?5Ϟ9Ҁ3'6.m杜]c1&~gxl}@իl`i89Na~ǙC#>/4V ѝce޹'±&)/}fNn ?<:uc*ĥ2 r}e7XI[As6J A!p]>ʅP0ګDIJ0mR "ͤ0\k\A7dEz(aNo`hInrðL곇ETWxA\l;䊅t *EU cJU.qD ib*s͌ha!e(9nw/3o3KbfP xF$G)֔E롙^Z  h#T׊ % 5"-G6HMiR@%@B|&( .".S`@sor#G7/ "?5ඖo %3n@TQj4Q$>t.I_fu.PԶ4=X&,ZƵ%oޟ,JzoQ3HGVƱgb%0#"]-b95$$˧0pD|?_ZE9Nά\b:wͪ˾K3LUõr}]Rxk6JC[s!DtZ&z8%3|%o؀7e^ow/-봘,yk3 siå+<3V@*e&[phmsg^Xz:3ژg28,sngK/}t:p16{\=wKn`QLbeRS1M0ℂncf6IxzBQ]_9FǪ*D$Z1@GK{*:̉EBD;^S4}IB.6P*t6-6m8ITO,<1M1&1,ː` ^`Ja$ 2K ]WIR:zWb)?8ِV(8l="MP'^^TO(IJo!5>&|7Jy=k?͌u}/Ԗ1[EDQFQ v$Vvx2oD;x).~T{FA&a^Ơo~a'zy~':{~-c:s.\WRa:8{Ƀ`z ;A\P̣L)r*7]Gqb4*`A-TC }n٫ ϡ?yz(kG^F]v >ӗLw\붨[L߁1Q//X[Ykm ]DdKr/7蛂+G xGq/15++mW/mm468=W&mBU#%Sz1UP1jzEx cx)F-:]aH2W6'q':(^Lֈ&ز-/r߾4)Zr5xIdb!Yɦ 6c" &`6Fy (uGT^ˡ3AFT,cti6Z.8EF.bC.)~#U|֖Ϡ{T;,%2/–1t J#unlL{UJ9Ső`"3dR&Vh ]Ƅ>C{jb(nk݁N3gPuI eb*70y|AsO_VF̛]b9G4.A 1F][k-OֹÄ*A0sM^ipwɃdP<ݍ)m:S.q|ܹЍEp$1Ng4CGnEga]Xm e~/c/]#Kƨ8OeI~M:83oPfod(\dvis>ܼȨK:S>| C~j*=NaajΐNJv>:wMb/s@ϝI8v`EO{ԎP=WY8?td۩6ںG2\@w>9ê-m̙wr ~Oolm=_@kw2`43qQʐ8 4̱O+،yCb 2I]2G%^ZE#L"1$F/wHpcI+k:e8tCRAC b]W-LG#(iڐLJ2 M^ehN$4U-¶B G$i,9JFP5_GlC ( (]Lۋ,A>djLs2Q:A,IX?yaAGqF+Gހ2Iw-dD\GVE Bfngb1<е[Ȭ%>3D|]tM62BpEAM(S6'Óĉ(g2~oNl~&_|5Nښ#OV>śSfJhyc\T L.G=nր/>A"ZtFG)ԫ)Xz'GI]:ebs1+'?ɏc OdtV{T6YB]G.!MbAh) RRHY]b @I+l&l]qza&Lj}^YC3P,P<@4TˈZ2vgm*. }t^o@SbHZarHV=B N04wHӘ5CwnnAqr쐯ۯ1匌t;彔WS+%,hk#'^Go/7k'llT(85X8 `f}U?-T#Rb$h<L nWOg⏪-~|Nj;g.7?=N1LY{*85BzXz 7oU9Jj@ ^.U4栩kl\Ȼ8(O_%v 2&`h;g82}f^d­32qQ6ŀ~b{>'WI*T.()"Rŏ[9R 7Y%t!֊86񂆫H<mF$"eŰzDt3u ʦǭX :xj)%$AD!6)h{PJĞ-)* _xƘCЏɔ>⬂-y*.Q6$2WpP<@FPw"r@69$b^&C ~ _1w0'?X% 6:ap -q+QH92QEd: Y! [rK'+iwC^D>co:»"Z%B|5ظK1;ѽ,SH# UANg(:QW &%dr)ZיQ,)[6h %@ 8&^0F)hdպZFދ KG,y*CG][cҹpR }Cw3EFAo ,0/w \v'V?Gz?c(v ڤR *+إ'-DB\^j%24cdETi^&S ^NK,ƚhHtk;< 7c+u>Fku@6&7; &#1fobC,c օǁ&;lj[gQ[mktj ㇱ]5S?;xF89q?5S2o/9o,^qwv7bMD4O<@sl7CtF^BNY},8.ևY+|4X~ -Wm^w1{9CN.NUoîﲵ2OEwSag96)&r,3>:}jLS-WO;R_,kUu)\^l(1>NɀM:Vƾـ,.)X0C7w-ƣ7h‹WPLJF1J AHh24rtE"躆P3difSi]tA䤴)H"XS IDATɕ %28R*)Rr]Z4%L4DftEL?Edܘvltg98` ZCGR͜V3F]=q*lȥ7\1`sJ 6;o0v4i,џZcR (Fng9dcjNw BEFZ@]e+L&*xݜNaܡra5;FDQA[ -:b y-x~J8*m3^WEUXBSl \}Ȱ8ε` ^2@:B sQ%BKnL%E-L% ȥBlFQ G&&-3\"ד&7[ &d9A位>fr; dmPtK+ y2#SoJ&yyK|)`߃OsNi oϱ]_'p7;?Ul73|;Ak~ガ ǭǿ^UC8M|8z{΅?m?9-4'ߡo\PkƏLr#o)_ }1 [,_?Ȟę'xoXf >>_{?W&g~o~Cv9L޾) uf'jV94[Zb"w"l:ſ\43m}yA"D!3&RN )Cl!T5R3E\ht#H?@$4EBH=g(dR:j$A4"/B !,2E'R@A`)!R %c1"C Xi@8K\! =(PIt=#UbTzTa#p1s b<1+R kX@ Ȕܨ@czLG(j=DuKQ!@ WW֊'15U$Y 3F~bR0RY(O:/ps]UМ( - 0J, Te%gF0Вwgt0ӣ5U'YlPO5ș`cё!LO$Z<qN8X-U'p{\""ر(_XIy1 @rxO Y15i65VkS$ A%&qJ?64X93KaVI͈k7ARnb"Yu;CJBMd]HbE,"u/"f- 1{͊Ɇd9BHҌT$ d%% -MR>7:~&d܄ K_R?~^lf߅6{:.#6CʬS5Mzyr&HȠDc5c#6OԐ>G;^d?#E.)1C' |:!ۈ 7I3]Kk}3GFƺ~~'..+_G y{3,>EZ&yjc ;d!y"NrRiY&ꞿhEH)ȐKCy&vк{=&ZJ;\Y#WhQ&/:LF-BĤUR)5#{R҉pז]7ރ<Ōe4LINomws $"PB"JBHDr='$SHRNU*$ 4c ,r .9PHdx;7[k > q=AE#Q50D(@FX@A#E*!XM!EzDM96P!U%Hhhĺ$tO޾DH* P)` )3rE!A^O׫ Od"U`"@@D"zJO2r)5KyoTK|"725bGqsmHdLA1ĖZ a8 zHRP}z_9& j"c71:Cb0j9L [ ]-%<+,]&9t#M9NI`|I nCU)rvr'aT#iO N>ҮOwfӟr2]H#U@9F설ae:jCd2rf"\;(*Nڻ¤vA8F)t0Kq&U2'HHs"S1,liZc:w^g"$AĶAa=PehǠR154eH/uڝMrAƋCg5Tx9,2~αzSt痛ߣD(,Qm{cA \DrT-wOe+HYl]W{ʈU L ÜRʱ" ڽ 9PH*dMvQ*C>Aup{$r:j)8ۄq 9` Sװ*B*I$(946\5orr3ȸ 'ސgmWywp]G9rIl^6Nj`eҹI(чG׆C^ږdpt㴎S@egWmSVIY>tZjƽEfFg8E}31Te)R3NF_&9} sr+Gf_>ʟ0spEWW=V0*_?=/G06SXWmH}+*QDŻ59lW2'.ʐ M4 %]solq#lTut%\Ζђ:Rozb@{> .mqM:* \(Qk,gKq..zw)Go6n>G̍ɜ\Du3OvMmThQ%egvQ`{k2("-eiQjlȈ5A2DRajRJhP'?-S#BpZ>_^屔1fwfxPaGt<… #M0^1} 1d$yl"9݄BJ PMGMI b!P"a-fC p\I;a7YNr3q, X*(va!l\AztUUȀ=@pugHU54Uҋ"BɒW9(b]#]}緟BWk-Ĝv. QUFd_rb3i\3vQ{ A \)$KLKC9@N3"P^.-I K "ՠf}K$r1$ 5$ \T)!%+(RP# rYr+&Qf T<SJbM%LL \E)(^D:@ϩ~*QШh̉r P)ZJRq82ORirE!8*8O0y "IOQ(S0aJTAaɆ)Kf0JE)~=Mn򷗛AM-8:#S^ȳ2$h9⅌ĵevA@3g6S^Ɂ X|Du\8I.*$4qcyI"FŌZ0ڐ &:#ܡd*JyGU 9[MBhRCT`{z﵋ W(XQj*]zH!l3q$@<Ι3;}~$KЙzY tKZ3gy6%MA|gZ}OC̐ _i/Sȶ6⯂D)hO8>k# C3$:[~sӳڝ/=7bj Eqޏ#˹=]@\M}$5Oy?pY֣3u2,8QK,Qk+ٓDx^y2ƦY_نSѤ7LW)i#'N9D4AbHq2)qXDeljn2ic%ɶ=f31DûqQ̶|g8Iùv ~=®=]l sv$R;?uvz{Rc}w{r2S:a7ӯDjͬ1ܰ{=a5a8H$W4nIϡU )NeDj._e;vv@ kՕCyzvz-̧o=BȘ=CôB 8āq8?AnI惼tn}jSwg-8r0pQگ"&%_"2hwiqmmn]K~)҉8Ox_oajIGדUCLtKiN2Z5aV+턜W@j_X;@ ==1%} oJZz. l: &ⲅk4Ep02[F8BHE8BX7@v6qN rm& :p#cD4%RAz!XWDSy)Xc8tf1@(!2pBIm$q=FI !oVXgK'CDN v$enz]`w)D6įh!m1X\6C&43D̠)M%X32:gc;BAQCoQHIj?c řF{W%`򅌻cܽ&;â* l[Q(]m.^횯f?>/^=s Eՙ(kk@-T( BP(Պr2 BP( E BP( BQ('CP( BPT+P( BP(Պr2 BP( E BP( BQ('CP( BPT+P( BP(Պr2 BP( EbH}ִ3mEٶl[wQU(u 95- l[wQ(]m E]BNBP( HJLPT+'CQ#;'3-JQ8l&|jMk B8;QNΒ#%=VMHgH)4  O?DMӊ}y@#=30&Q+UOmimWP>Vccϴ(Z:]JQgNeVDG!@)% !/)A Х皔B|R HIP{t)/_!@Q4kIfvzWQ>ͦM^\V<'{ݵs{ ~3\>JVxխ d1,dilei^LR"PYrDEF"Rx @"nt#Ú_V1ax:䛝͕W_ɺ0ﵗlZ>o8x -LR"PY XbJOGHH.Γ@J:sM] =q1:R#P7͉a˾\e\2 )p*|æ.BvtN_>(")) 25/>82!1d0>Sˀ8r>{dfy} 0zӏ̧qSJЪu+ڴk= 6h壯-eF\< {_ s}iٸ֫?0Q\(3yz XRJV\O?u\.=&55g^]{t據ʝ {}QPYJ\Zo-8 @M3&R&¬7=,fG&ڳ]CJgkJ"Cxz_|c;%&Zuy# HNqCtE[int>HАRCUOU{6{YhnqcmPwK+&VeVTލ{0Y.B4G+MMع/g‘cYHοicz3*FZj5scl6 ѿt\~emזISg]0i-3Ç'YGj}?tѩ3Rz2^y[{e}t=b1_3HMM~|r\22J >Z6ni3_ x;N{9Kc4kќƴi׆͛ЫwO +iiع#ߘDzo5.r2u9Lͤat4['?E"E}~j3G 0%+;vMl|vFGMȃ(resxgy;HP7KGtdI,=o70[(I'#Q)ysuxEk3Y{Flw [us(YjG lHcs[GpL&)۴NCt$k:W_ĸOf=FtjN~Azzsf\TT(*LFFїӳwO2HKKYO}l6LI|J~7c<|1v|~7zAvmhܤ1I'|ן8 `Ƕ.-Z4{|G;KH-ر}}y4'կ_NwDDoiLovpեW>А/[eXf~[^{2|p]-W^}.1vROYOB&d(,BБ#APK@ic>Y^( ;چ_ZMj,(^Ka|zsI{1 gt3B,8eyl؝ɼ39ec1nUc+14Dm7Y)'ohmA"}ԕWQ>R2ܼ$_X*1"8$6ڌvIvs 1o7v[:$/-WBI;%VTެB:mgF݋:5BwsH$nIe5_n8 IDAT^xr/OC&Uje%}hsMf |:߉ ٵciq2J1o_g=\q޵nCCCq\!0%v!VnyY5sQ̱Nj),,AD3 %9_'g]b>~'CQgvׂuU]]O.=# >H͛D:BH> I~Aq]M8.­I 8(rul;_f۹sL}nNX-&rlk7-mkbem@;OXi*GR |'UV^ETI)`Χ˖M[ظaPJ}{{n'R*#31o<pDGG`6˽YfKHJL]:b>xCv @VfV3#g|?koX{@LYΜgUwfXw0hhDFFkٽs|#31} >_`|x|t&IIpmS/S&""?:^T^{ISgcH$[*~ s0љ<1I"##ٌKFr L4DF滯Ӫ4OlHDB6òA;n,W]z5O>GfLぉѳWS9:"xiϺr xME?e-<64 .ncz!:Nt n=ye0㑾Wwlړзc4 Md;uO`ӋCY0>\wm5z[CGK|ٗ u_~~|+SwqzӷP_(]s 8s M]'ٴ'F&tDpcb%F_.(ԃ<64F.C6|uP(>tdc%.9qM15`&#h <"}'^RGvv6cM&++&Oes/ȌiNdee3$HtK&-5 LvmmK-OiZ`  -{Ѹk.+Mg[b4YNY2IIJH^~MthPz=l}ǿY8U~O>j Emvv-;1aX-AD\nnݍ(ePK)WBQfyϐmw^ed(0Bq}ؑjyCYJ&SʌSɳ\"_dih`#%LJ.ҝlM*`d Bbd(RV\:.ֱlL(>ę$2*"ڳ һooyu[d%;1yyy<> ֮^KTt4N!ЅNNv7|aЃs?rWԦ'3ܤdJ76I9=ˤ+шK 8_YY 4ol:(LFbNvėyCI{㵷XT(j'H3-N1zvMXCZC scAC"q䓖ygiY{n6d(,TRULylvvB0VܵBBt)8􇊯/_^gB=,h %֤ `A !auﶒ_#V)y+CRb/adb˦-Lx_~\͢hB4l߯̌L=Kki_mK9[YjǸnoeUQ\C{t]bekߎIS_*jB|EFA6xhRk4MP! d$2KQ\v6;{*u EZfIV]ӱљ'RвSq搘r0KHyyg[V+ D9:\,; 1~)X2pFҿgf/Ⱦ Gh&"ԍ$)dT&+ݷcbb6|(&߇ǟ_~dHN2 \r5j44e۴q3IɌ؀tұsJz{Ycmӳ{f3k~YEAA~X2MuVLv FvĬaN^O 'DeSӍmҭ:Pn7Iܺ[Uw:HJ?QIx'+9hT1YiqnOV]ЪuImQNRZ_w͎[pX 2B*Ép ($j,~g^+5lX|C |_vaȁBhj.b"DWixAa ?G巟ЁƦ_iju]sμ;ʻ(m$Kx"&M*t_Emj1넚]$m4 C(KĢc6\ 'q ׃VSߝ "fWK$YYĞiQJd2JT1a0R2R4 !%Y49FC J:T(&xY zJE /?q1j8#F /7ҨMMl,fS4#toM4dB,z:]ZBjJ]ZrEr_%ܙaq'C:d7+;x?~EBQ(v6a2=Hޘ4UJgI7pn:K:T(&˅0NzR.}";o#R: J.ml3 ?}̤bqblHo䪬f.咝BTH N9 sGtHSL($*$zʧm,G/%[ܱCFӿ@nfL}tP:6NңU~16t8i9$C #6M>ޅl:(z>,3 fH]'*ʼnNrߘeyپ~'OgT(4v\\~4nܘ͛G=4hЀ-[Ҳe2gl++)R^+!\ )ʧS֛naÆ>/^f͚T֚:[m+[l[UWgY Er00kvCh{87X%n-<&lg4x0>++lf1c.M9Nxb _GݟOޣ94exwD,y.]Ú5upxwIrFnMxb "lڴAX;b1M5V]I$-xG&1M?w!/q0KF1kv קU3MIaZCY~=cƌn⋌;Z3{F-FE4}eɘ7o{!"˜w:s=\B|k,oI=rf۪ڼ:Ed(,RJ739n̾aI9NbY %uFcy}I81v^RzGEcEZ66qe dyO9.!a&lW9Kpjdؼ'l"6FUOe`l.C6 yXĶMdre Z66a )ݶU-5=#|[3ztw&ǒr}/э9W**n?!!MȠYf𴴴J[hd_2{l_تU֭:tm۶Ջ+VT{NwyO\ٶ6βzQ3:q:VY@f< )׳l<θMz.oQM{}x9qcf9GdRc5͒uiӓN7c`Z+hSavԟ~ Iܶ~Ń[1zT_z"q̞葍tSc;ȨcPd]vBm! ս@++[3_ǷfFANҙ§0Ǹ?Kd+O^QZo/`ѢE\}վk;vয়~⪫O>k!d\رت?9dY=d"mذMӧ֭+v|YZ[-kweUmj,d(,RSHeƒ`Iو#i{ O[>y!4έܴ%3W#;O 0aLiʢNU&%-哑-IϖJ@`6I"Qa݂b1]Ovg?ch}o.%ߍ(3Ωꠢ.Sڞ1cvKЯ_?t¶mۈ@4FA׮]ٺukfM&\&=P{d5/ӽl26oLBBN'O2}t.">+믿^m3eQ-Tl[WgY('CQg85JS5LYUl1aj!^qk,OVN v v;ĕ3 uv:xPuPQۜN'iiidzo>oNBBB?NӦM9x ;wM6"dF mǷ3]RӧOg[3gOt:[ٵkf׳pj)SYTgyK,]wEffԩl[6βz):PFLT= ?ӢHNn1Q~ɫ(f&BQרLرc\ve$''ӠA̙CIIIa?~hz)ZlYm,VߗxZ+ >!/"5;U-+33 m[6βz)ɰZdQM;{G8Yk6o_OF w]޹/ɫ(f&BQ[R_j)$8mڴa׮]6lȶm*-cE0if?PEJmZڿ[Eٶr}nFiWgYd4mc JP5{^?:z ALCwE\8_XmWQ>ͦM^rr<Mbلdl7Il&T)%&Mj? Xsȶ`xg4V( BPx)ib -$9QDǜA K\JNF:u7{hi9gmY{6`( BPeѰ- 9HL=gPҒڦm*}:.+D1%iN6=m9jBP( EQ MӰh&,PFIl^ )%uB5Mä= [sŶmV{0 BP(jh,^^OV(N'ŎU{0 BP(N ǙAv,K|qPte IDAT( BP(u %QzBP( B8uOtRI'Τ< ?w9"(Ja@߁$g$NCt}P>}-6QlOBq603-k]S,,N.W!.xe4MjbZLgz켬,e!IqDSaOJקtRd(r)G.9#,fP;!- l:t)ɴj҆͋S.h^J|J)%_"}t:{a0g(!!eF⾸2yU2wt cbkD׵qFL YOmnf %-Z,Ny+Hm 0)7HyjyI4eы)R")]ƑY鴌;H} 7}o(R!M35HUҫ+-(,RHu^50byЌޗBc!H; շ^{Ko EO9tttt]#VTd(Rw`Nbl2D0":8x?pIhF"9!{}NI@ [&&36)F%", ]F{ nMH$&TzƑ^Mx y:?Vc oho'RT,DޣVVVVG9ZCvgZs'D9@ c1~Եv)q? Ѕ/ (xݓ N Ok5`A#_"ѐtKh h[@F|L`ѻLEy9e=w69%jArHO"-裡{s zʮttttl\P(UF cvX[ܨyq7& hm|4oA)ژyr.{%E@xqo3#HmhnQ90&%&Ѩq/NJ8B ۨ"B4lxB=q5%%+)"+ŝ=;jF]KݼZ@t!)]+]+]+]WA׵yr2 ER-H]bN1{ ߴz`/8hFCQdtlʼHI^'+GTCNn&L/G89RǤ>.;"~ǗV]Ph\ /-pH * NKJCq2k)h#WC(K /QdOkJŠgtt ҵ ('CPTc^/V4ʤ)y/w>3Oп짟ev>\>[4gLxjuym,1wK ˷,}B;fW^}aaaꧬWhM|t/-/ff<ǣ{^uo6 \ndgg3b61[tԑ?~mJ'NӈSb6.%ҵWS=7|{믾jE4zŌͶۙ9}Gpp۝fטvʤ){U}e6jt -]_22>CCeU!/BzZ:=<.. ""w7^'>p{0?6o܂ɤSc.w݆-V爮+7u=FLL47f6[(h7:xjB%('CPTQ4/ޟA д4z*"m߶E ?a_A&kbœ`؈Tu3iLy ͫ/ʴG GQfB9%-Y EÆ XnwC V9K+%;xڶ<޸~#rk7!,,{Mxd$tXrP.]p<0q ]/*wwgDEYu|Մ;5c$432;yp҃\0O}p^-Yu23a?~td^za^eW뾮۴k˞={Bumt+'O`??ήeeSX4~gܺNFz&Ͻ_Ԭ c^y꾮WXg?S=E>H$=-p{t9o|~Z.}B ]urhݦ5~!nwn:=3fydeey1)Sqa{&@^y{j2?PNB2%5pZ%SP׸K :e3QE.ԋaۋ #q7LO ,2 ЉmKĀ8^FO.eop99'Nಫ.#,Q~p*͛7vq!6?ikWaaܱۣH)[7L^ZDJֺ'^NvO|-`ۙ:!]ЕkJ {Фitօ]Drc1L<ߧֽk -i)˩)]Wݺ ^&:: ]wEdTffC]x[v.a6w|VTڲk.tEff۷n'55{'h޵~ @z)G"]v:u`tҹjB{MtսXkӮ-)'9y$2jH~\~%w%W\4 { ])=vՃzUu]|jI BQe({-f9={ 2:(F] }q6B~7(o/xZrz 둝M1zx4MR^z߷"ϙ[ e%e%5늾Idt$6klSe9i9]uݕ6] )ÄAFBUo(c@ĘA b..n[okv;i[߭<}y`;[a[z^Nw)O~c0w~1cHN"UQY{EIYq=sCd`dj6l\Cǚz׮q8z0̩fԯ[}]v_=04afT,cbl19Ǐ@E̙[]v'O|˗~ȝ߆~Oöxk6,YV Cf*.(őbǮ[iű'{Z2bi'<0L)&lk ^4<_Wu/_8ں EUg^:mH2| ذq= k˯uӲV|} JJMuST:QoDB+dYBެ<|p=ʟ̚oW. E 0Oi}~Sg]!y*7 ?/ȋ!%Ls6Ox^[nA;dY=8ݎ-on,K8 >OW+ÁLKn'`~S:?]AN zPڡn֮2qG_#{Fx>>;~9@k:K#ȹd8o";Hj^,mGQlH螊C4[ؒG' eZ;dMZ‹z y3A-+ D5Uõ1WcF͐ lZ72"No'γ`7:J(kP #x҄&4cut_`IM:9}6"1UU1 1"IVUQd1$I;1fFO(&pNYGeZ;Әc xz^9u1 <)EE!$bVmB˹ VQ0~ɸ6Q Z;vBek1b%-50}Z.cΚA``܏ BH\mbշI/bӖ7 EcpW G42BKYG eZ;=s  @eL)(.0Ɛ7|F1*2$vD qEXmb1,>TGXFcDbB%v:z(kP u+əyW"=-E¹?yT.Nй 2) L$M c+4q:U( ~]7=;[/ Ӑd0jxSK0hۺއZ;v:QIntz<A`EN߇iTdI!֋Hp I6!;x=XR00"I6AtǛo;Ӝ[ wokySA4"Ӝ′Z;vBe :Uf{x籠Yو"ĩ&,*"y>2EU/cݝo:PڡCYk+Ic`,TdIo^j_"CYkOhA-!$|~9ʐBxLǾ,A!B">`IIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_template.png0000664000175000017500000030663013203343610024210 0ustar jomajomaPNG  IHDRኻsBIT|dtEXtSoftwaregnome-screenshot> IDATxwU۶nz6@ "Tt"CtA4"`Cj !H#lfn9?۶d [fΜ9l4EfLz_!B!#,T良sD)j.-Nv~^^m9'еrQܷKujݛ~[ݖz'k|w'H{q=ՍgJ{.MN'v_Ntks$:?R_vLu1KG뮤}xOĻJmTz]Jsw_>;Fbݔ~@wȽOSu|>I>_nYwWuvQN;ir 52cTוK!B!B DyymB!Bq@e3"B!B1}!B!BPmm2A!B!=ݴ2B!B!:F)8h`;4E L)?t6=}R BѴ|W,ХsB!Bhq۱#888Zc(ae(eU p؝Hg"cMCaY&0hZ{bWZ !B!Sm;aB^Q]]ݕl۶M6z,+:rb#vP0Dqq1';+jjjY~=[nm3dv$BK0ȩZRlf̦z>Vŋ<w5cTս%EB-48шayd %ր χ2.B!&xplB0fΤ vmlj`i`UU55ophc_Ѵ0i0} 㴝Nenyg>tp^;Kq8hA0o"h0-#2{t{&POM"EQgIY+nb^E.D'7ÏQl~K{p B!B/bۄ<㎛i)¡0v3]g`G4*;`X!7OX19H_v<H8BaPK7~K.o< ұF́x? pcCW@WۉKqFP`հl 1t8AüY4P;M\|x6P؄3ڲB!B!tZkC(d#xLm<lj?"0aзoo֭ۀ0P !#g:N4(*O0hM(iɉ4i }-X9Ӵ:|=Uѩ M41ǓAA,bij i ɴ0: J^¡+@7HmȤ 4vs#M <*&v2xnѝ8cJ, C'"mB!B_'BII1~f]/4P"R KٵebǦo9H$g>p8OSYD"N,ʤn"\S@ES0c 3$T71)a7Sljx}wv{lMmZyL>"N99& 7P]8^E82s'qĘdy \q۳q|p;FF^LFfV= +cKo""dp U X3rOd (N̄2kZab>;~,)B!MZ;~hnnƶz.wMCǡ;7hi:{Vۄa^I1;";@'`goʉSfx;NH?zLzf<ε{hM`SS|=Lwyys!1MSh ߽GkdY#H{]%!thyRT{2k쭗XXiYƦU0lT{N3Q=^Ù3eҩdҩo׿YXkh\eB!BNpLB z e}!3#q@dff RhnnNIeۑox: ǶW8Mh`\<~~L[|cp/l劓`éI |IlioMӲ~'4ΰ;N$+vMǛG,aӧKp^?9>M|aPU^;Y`&21"g 0Eи5f߸bw2JrW<_kkN㠻 B!B0J)}wa~ߌp<H f$?tfp<bdv?'0֩"RWȘRp,pc;X%e+hȲ4e,KreK1cۑXxL4EL>Wyj*'8®&rKGFqB Nmd- 4aN]ӉԨdM!B!m0 30 0 _鐼[RI4`P[[KGc='<رt u,0Lַ0tp(u^Se8_'Ɲ{+Fd1*'傡:[q'g. y  <ѝ.Kd׳/~WB!B!(eQYma8*`ۉeYTTT1- VFt/jڑHt,˃ ;tl*HF ˏP]ώb#:`zy2דw# osNC&sw&ЀlYWM3{ie73/O{U{ۗsoi&&qЀgЙ{ljd[.z`VBa¶0 ߃Tm|nj  k4 ô`8Bؘ}xUJCNl3U0ѩoѦL S;47j3Vf xB!Bњ2LHq6lp|Cbk50pl0-^P8& hСCPش ѵe(Њ 6  󫾍p|Ͷ:ٴ2Q±vwB ^'L0 |zGPx~6>S&فSoSzw%;;9M?+)B!B!b4@$`BY"222IiKzv(4 ^Ji4e YvEآmh:vfm8Cy"|?}681bJ)0L5[fmdeeG)ZZZhoϏ뉏fpGGزe+9dfez*M(:>o,`ʛ'lUcrfYa z`}ü5MB0{Ӧ'B!B!ėC4p <Yav܍DS0Ldfd 3smǩvj1<4oMa)32318?;be{X1Dph0,<,Ƕ LfL-k?mDhlіL B!KG 6M+:P#"e]VwX @;i.nv:f5i(Hޏ#EFfb |B!BkG";@삓B!B!k҄B!B!D7B!B!Q2A!B!=JF>!B!G!B!B( >!B!GIA!B!=JB!B!Q|B!B!DOv?WI;!B!/G`xp-_gߩ,7<3YghߝB!Bτ/+'%; J6PZn"ծ1r٧rɷ4MXs4=W#=e[0_iRe.{Fy)=vn<:O﹂?n< =6~ul[?ljt~wB!B! ]>5neFƆ _ }Mrl+{/UF$1=RC>ZḙFL'{ww&6{B!B/}>4~,w>`£/+yq #´yUǙq5;àfz47<0"{czL~^Ype`ʠ2 UV$}O7ee`&~:f's.8\uf Bn`ߟ;EËʘ"wkXJv}.Ap7NaTpN>[8?9 >S<ԧg~YiB!B/}^!s7?㚫E=3TX{91d+I^đݼ՛&4PKcpCe3jH,[^8Wr0_"-% ;+J2pUr`?o*{(G_S=22(<RٺOulM ,+~۹ SY7+#'`KL ELˆڷ_u_Dy8n޻5h ^ L+3RX}S:l(Sx?{`?q?f NZB!Bfߧ],+ҧ]{"WPpϹ' jiɦ_ nB;Q!uq:*G^9xhES c&8C4#yϾΡ߻#X>ȋk '>[z├ljwiIu@!B!H';AkQ4ѳ<Ǝغ Vv..ᴾ8洩{`;cNQDֳh[ORx{ 6@6Gth*k)b UWꆴ{n߸73L.9{;7A~\i (X4袤.̴YB!Bݍ@ø%7e$'kl-;VusOiT*)4eykt<-~*rnj"f>`8pȀ\vU!ۂU$]CӸu6#m"@=^_O3ϞU)WτrvӽN0w7|?kwek>~V}ww=ͲB!BͫB!Bq:eB!B!zB!Bѣ:_DZk%²,s/0TZkZZiii(_=գYUUi +OkR u ۓ~߮r 65WRU^477Wo! 'ʼnĻuʯ/<-Fht,B ʝ477 H=mϾS!B!D׵ >D{Lx=a IezTIol4cVn)chVb豭kɍx j,vCSG1m )Yu vZŞ=qJBvU'ROStG=B!Bt]ݕŰ#9S%uTA,URUUIaaセ^8$*6-8@jʥqk/3ϋ?D"^"pݭc-{؏D]_ qH$o(p, viI=z*B!Vݻ=v\^ObOJuH$ܥ&n^"82b>v]TzH42@6p:M:ցM8S. ^\Dɀtt*Z锺)}T!BuvROJ[Yn~&F88$~vCB;gɽ͉<$tk6+Ǥ4h4~ۆNWb@"Hqpry4›pPѿ_jݗzھS!B!D׵ >8Ξ4' '3o"|5. TKf@&x!\os'uռe5g;YG?O z%j޾ ^ky)dӶhC(qVQhtm88ZO6jڞbWq _9?'IJ M,{ܲ7_R(~0+YfG\89*F'p IDATo!>]!<"N$k7" beRXRAGǧ%,ZFGr#ɷkQ W4ePN`I* U_X ^Oywk~6Ek7؟ٗfo~iž 'K=B!BtF6l q%W(gHA eXm-f[C  #1b8rb=#F0zJA?ᓷN IFDnCuutӯXv]iKtQ6;[>32\y&j"ݸsgw7K4: ayMlOь76<MF1fF + #1b<˲#RGٺ5t|lx=캽i:6@k/'hWݹ}1Vhkr3,׌/.8k鐌6gQ4'z67{+қp@wgdEEp3.y<~_v;'sm1+Κd}Z&:WNI&Vnm-qLWbG>_ M mGEmM~vxMC{cSۉ9G#V2Kj\o/ ]!zIIi8GE/4)e];#n0vݬ)pec5|/U9Oi !B!iw~Nl&P2q#e }Fl > XEL?ჷjsYٌػ裏 ٹs'`Gyk{^Mz:vnbzbnNyTb݉Aͬja%TPK*h޽ma0O/@V=}+7p7p}n=6Nm\nh(fʔA־ƽwf9Gg0<x0/=n,a#8rD יېN/5Nl]}6zܸnR?Z{?B+'Pxr x;#V@; xwZǓVE[3|v#=f.v@hB{2VOB!{46F>8iX?HOUG_[??bWs >YàbrOad#/WizbXѪNtN11}NhRn@cx|/\Cݙ: !B!4M,6 > u.k{g|&rogٛXyo?[9 $C;)r?%A=J}wCiohx3ӧ5e|p&nr.< 36:M5?bko*l 7:Ǹ)I.Vwo0E8-Tl;{Uq :z^|-3dh'z)tJ60Sg5(+r>ZX$B.(ʼnЍ,.7.eݰ"y/ Cb,_MY\ԗfѷ:O=dm &m!q E}N{ u; Tgھz*B!͑l'+c،3\NvnyMȓGv@w[!ldSUpmayQL>a,c!u1 jAh[:@64 զP8Nɽ ٵ֟Oaთo~|^[1q;ChqL@Qg]7J ?Mp;[ग़W'GzB\CSis:A8C''9k I֏Q& +#o qi==~ eb6^]Hc]2sдԼ o#3>ͼw&~FJ,©P"HjIA,8Ih]v",lcRlDaB!k.mʝXCH;/y%{V 0xhM^Ío"9mv=8KA8$c949bLnݛߊjN v4Fl /MSz1/,:wߺBN|&im\v$X%",c t^]3b:((-eapn*jOgv.;aky>{G|9ki Hro:1r@FDJrP;e 4~'nѢfFv6 |[‰8H|K=B!BtiYԶbc{3ah6M7lAL;J7֋w,# #oMdOԟ\ynks cpNYИ9J9DpZчvlX@N6 .vch&9?&G L3cP =l?h3GROs7lF u VB[!BMkyŴdƷOcaVl~)ޭ)`grPo5KXZVIeCs׏ߧ&_b$|H4OZ9QZGhp >2ȲJmAEʔ)j3^5T6?0&Ѐ̄^лYHt#qr"Rd4v}@>x6_KQ^l&O8T'n=N%R;#Z}~?+/eӸnB!Bﶵۅ ::݉:\%7>%Lb=,tR`!ƍxgRz*-;Ð!Cb:qqk: p-:p82 ֘V N4v{ubsU^[5uW"mFA$bzJS!B!DטzڅiZ466{LS*J6H=[ymc[F] !KLHot=>Rk{h3OψYw/H?;|h>OZ0}(7hPzT!B5f[]+.aL>dZkXo4v½O M|UJEQmyNHbm|#HWgo򗔖ur^?xݏuش>f_B!kLIJ҂J{Y;9yyG"7v'H?4kB@$b6:VIz=d`gx=xFS,MXH$X˲hjj&##Jb[:_k}{jtv] wz[m{;U+0U5u'a ,xuL|^A%CZ5|upnC]uxTI;Slz[)wNDkIt妘pzF,QB~-M$\#B!k4Læukyw475sR S2p`V}Yr96hm$*6kȵkowofȓ؋Ƭah`&.d99y(D‘xߍ)(hcwaD<{"_Iϒk|PIǶ 0RI0@@r2JUVLYaypQ%imHn^^<_OB!]cZViJIil|ø&JL/IIk\}F%}ۘ!XLKmȦ保k*@4Љ$Ohhnn`ŲvI#O {f󦍔mHQ22{i":3 I=&>$?k ڡ_LJ2 ز m zߗzT!B5m :2'|7D)C]I٦uDRi~K4@l^~RGwH=!%B!Hhsg22)(՛^?0 !B!>B!B!.B!BѓKB!B!%k>4Uٺ- 33_PYgG!B!Tng9Q]UɆ7a"0 -(qdO&?iKJ!B!=4-jS$lݼq&Rث7Zkv38WoƎ;M$ B!>4QQQNKKqI* `9h8YgE!B!TL3i͇:oƀ0 oSl~]m 7oB)us{b˖2A)ҹS0B!B?VȇrHNn;4ea&J)=nY;Q@{B!Bϡ贋V ٹD"wX6 B_{n[/BB!BML+iPD_9qt8xClZ1( Rߨ.SB!B4M6x|GDt͏5<3†&y~z745-B!b1M+$ <{m=;ꞻff~8%c/Sp %4}'|ZA Qzʅ\x |aX+8f{ ؏u1M!B!ҷԚY+w$/:'@/!95W3ߚō7ūc&]~ylyԱ?`yĘ.ڣ揹2w j{Մ0(:tl9C20\Y =hm+gӎ&< *o97=el4Æ |i5}zz<ϹsELb l?ݵzk-_u͌]_Ɖ\n_ٺz (l ~cCɳcN+΄97+d!)6mA[qf~o8NCgP0u8:/YɊbMxg(~/;\3DME% moj:٥Oy] 9jY[B!Bϕش;ˠ hZ]3fr"i'u۟˟OW[Gsm9d$}=^H]w FkE e~²+iZYKy=_^n*vn'ۺ#!$h׾#O*v12 72zsٳ1[(NG|mP5 3ZZʟO [;:gJ:dgF#x5<(5abcϲxg|ZFGKJW8@g_cS'>=̘z$c}N /S!B!D1M+u t|p{Njye^[&^-f8d TBA@v jz*c)] S*on׷ Ϟs'봩4J̓t IDAT<?>v07ދl`Gk7هC<1jwu{%7ٖ{fcC ܼ)B%@nނ)0ܛ\dYrSݝnIeٲt%4rH#fEk rֹLaC˔B!Bi۶㫥{j+S3?TR^\_̩t Kzm0b'q Jr~=62Zk}*\?L:sx9vhz][ p'aeDθVɖ2uUBezmӦq,n( 2Ϲ[⇛Z!,32{pcrXf_fW)IdS:ܟ"`Ւn7ۀ\d6Pgl;|Bd\<͛ȢѴQ}1?`AEpꢮ.f\}^ۺ}yҶްU=vqcDŽ8ox;R8:L1B!Bqh/?]s@#B!BG>0X {18po撁nB!B^/:`ܕqAr>!B!Ā/热'`0sWq]Lf!B!Ġ#.=wE>!B!KW8N {ʠ>:B!&#=wEAA!B!Ā|P/`箴|8s>B!BڂJel� R|G!B!8.iNTa#HHH" U,8k[go t3B!P_GEy۶@6D]x8R߷B!B> >>pokAo9A; !B!0.ek >$B!B!DPw0oB!B!oOB!B!; >!B!ⰒB!B!+ >!B!_ievڅ.]!B!蚆Bn;Zh6 :UT+?:l>pADu"| 1ānB!B8)+enSODu$~ضMUe961HHHf !B! |];8y* I(PF,4 0q wKA!B!3d`mm E{^xIM눋O@Iġ[J)<^WB!B!?}P[[Þ 2Xt]=y(mM5wiڀտgwmi:JI(hB!b2Ͷ}J8YT!CŴLTt5]':&a9`g*4]E?~|/ րc$ y7RKA!B!>||1f舮, S)tкtH3p9M˖*ڱ/!B!G>R躆=۶~|4xoih҈t)-4oGgp4|B!B!TWPܯUkA3P6hQ*? J'|_0[M rB!BqsA*GY"4=&{îfۈW-m`^Wl3<2E) ےB!B f}vA}U òSk^N﹟+G_ |l70H$q p9lƌ,ò/"iD.FN漫& Rr_@/kˮD[vfp: s93;|ӸE uv[7K?Fii ғtΓWqEc&H9Jqn%z5y|V*}c8̠h}M&^tKNJӎB!B!󡇹] < [(#7/azt/<&3|Ϳx1'G\紌\h9`SӼyC)ܳhҩ[^b?ӗϘp9jm:߷IMa s7RUWS.fpxAǩ"=I%ּP$>Ł?Ǚ9ʳiRL.#۵j rhjB!B1}څԄq*]u+hTQR(eӸUY-ĝw_xb);vcVZ.bo<(iG 3f$|x{r}uVpựkٓLvy7j$?描{Rkmeev!B!b0s_-}~[$ =!Uxf|9*<{SmQm4 8g<a_Sa+mryƒDv aY}J,%w{!0Nrfh1` TL] &%Y +ډ ~gdv5 r8?{´MBIUF֮BEf_r!ڍz:w|B!B1=mnFvragjsH#89_WX?LuimX[ѶQ65e ǭtu?|/Fdt\дvo:މ9p΍L8gξ;ukm2+|S4vOuS m~>e\ӻno r7uڝrBvr+)?<|m>m>^ߞg?zoS殇neC,ϭ D) Ԝ>pslAF>!B!ĠC)a Ӊ9"!!OS𡺺]ا  !B!}P_GEy۶@6$$|.MMR\ D!B!] >>p >hrlܸ/Bf͞I~_K~f͞CR8].,5|0IgyO !MJi}_y Lk k}ݮ\k%Wm[s]ntթlOY`5@2:}x>|cZP~]@mꪬF8?̚Z|n,ݿs;CO:tSP{zWzk\Chpry$f.m^zzzRE`#HaRl5Pg4im[Shޣ;Q=k)C:ծnݶiwӎp~кuݛc=eضqlݕ?TWM&j_q>O0P_ !SE:GY8X|u'fcXҖ()$9êlR- aq#G– p9u_6uw뼿lw)U7Ã9S@;bQ??} NhIJ 5Ct ̂k /tb?mK,MT-fצN[4q ! Is54vr t3hڠ7:aw:fm\nn>z 4]_]ix}<7_xc˵| [?aͶԗq7i l?9];ۗΝwNkR!hk_d<ޣz,~F=8^^bhߪ_LMVسCa}{W$Euw`PQn&)}pws/ [˔TWw~PU{]꯼u~̫dy2MO҈Ưj"0qy&&nݦ0!9Se8h3=LW>\gN{[FGCw݌ag3r|B2ۆˠdf\3nO?y} )gTڱL^;9\#/AND/ꥢ䇷IIQVծZx{D{5v|>yh5 FJ<'uAHU,!MT5Nh,QU@"n-3,jw#38eT9LW FnWmKHi(e`@Ǵ PJCavr0zyϩw} )t=_!zDb^挓Q:% h,mb),!Z6ȯ/  ;SB ,G^6 }͂G*)oQoSRL >` |~=Pɗ+YxZ~wL̐9.4ʼnj;W's`8mZlt 3G0tiKKo O-~V8[+zxsL`+{׫1+'`e\ve):س3ܾek$0]z?Y2vGnLOQ (A ,[34J4\Nodx⑿aTR\sIHw_G!ÂsՈͨuLYk%?}k[ٽ|Qn"6N*YrS`%0dɇFGF>H6onSƬ]GJ%G3iABt,vG}7@qM/qٴ J2yL82'~͏ɹ < S$s\~i#o5!!rz}qM{(,5!3wx`V~FƧ]K5 84c3&~sHP;6m@a\LO Lc[goii6w>7p[ټ2"!9O< gUO,p7O{a*V4(՚ ϫ-:I=IFIM뭤Ҙfkݜpe *66kY{]D]k[]bHnK ٲbFk;%TkRISmI89íd=;Pkx3]AN^6 Nz4ؼ#폶Q4 ]#>qb@i+"qj5v&i}55A(vGll_fGNG(TZx?#Xр *aYl(*'#aAדe3=]1$&#+([@il-ʝ:)\4c@M i(]ưe ֕&OiWwyJف]l9:W}v^e1vCYu}ESӐ 6 wrv!vMץcՌb\|W6ݏBticŃIS݀FI%`բ7 ,tt;LF3'3<Ʈ䂱~rJRyk ~l gc6o3ce8SX+vI/Ro9In+#U?1>ھGK{T;mϼԖ#̲\7'G/ >!Ef&RbbJY+ IDATm.Nf̺a\WK&˗;)]e*à51MN_ɘ$KkG|֏Igsywdql?LT<qldI%˳Iês5շiB!d< !103LM 﫯峘0ILX2j-Mt>GӇ>hYLÌV4l 0<4jJ%]Ӈ[CG!Bc|BΝ˯.Oxٴ-> ɌQs-HIY苿^x*s'1nBAI9 Bq<1; DBfѥ>IѶ)fKp7(qSak1cx! ]GYKrDfȢ-b"r g`^..&זSr{Oo(SWrt?QM!b0Byg72cv˷)Iw[/$EO~7}Aj2ճ+IkFNf.?=uck~y&g(~}Ձ4|0$~`+e: 8 5BADBCRUsϵ۩ڛ]t̓@hG+S=zEOk\w9}=v]GG;Jq@aE(@ `/g7L4-ËXV˪vA?Or:O#>>jj>*B!`"!!ijŇf! 3RxJ6m.vdժ).44`4>=S`Jih0O?={+@ڪrEsmOsqc$|B!NBCRB^&IIַ^&-m˖-N>ͲegRRö 1cFx454K0 YOT!8T|B!aElrݷQ] Aee|xh[ <.{;,_N0UU^ڵ?W%xœ@A!!!B$ Mqx]8#8.5\P^){Wr}ߧ#l> `9n _~y"~8`= Ԯ\JğVz38H9 e}(S\<]\rxIO,R[FAlJHB!h#!l4"cL%2%ܾ\Q8nʷbOi(_!K k]Le>zΝ ߧb֬/yG71rsG}:bY >xş2fVV8dkHHpkr :+xhlMee ii̛ &g m-t!x#!D NbE'h<_z!X?s`#*J';{ WߍRl"FSSKQ(\J6m̤IpϠE3L.ر9TUm6DGO᪫3'nW*/a'$> n_Xb"#ڏ؋AcLB!$  q06D%bz7qCض"PSOݾr-4MDR,CO@,bpGy{W7D2SFٖ|](`6/n ~qh΃i:HHfhz>^={fRmN}0GQQ:PiL^o@i* 4tpd֬; ??QQu,_>pEF>! !I6 gt`WjT4U*`"PcjR( 4 w˧ph|8X3]%+ER: "S:k#N3ʃhX!kpFR NO'NpAtF=u;.9fFBqQWb͚rlp"˲öuFGY`K7ze< p]\ C\t@lۤ67O?}%/yyus~G6TQR_̒%ϒ.:109rF?R]544@("94VH#);jjdi̝5|&za!B0 qØdq#t_Qge9! ]w;S`6*ȢdwayN&/ OPJw1gOd8#hTY{2@eٜ%7B'! > :]bڦĦfEvRE\N̰ e5݁wZ Od9s0\B~Cl|6@$s: :jTڔl0)dQ7߃}6kSWd3vOF1LB# qkwϗ_BZZ#w 2(*Jaʉ7ڕCyy =4deYa1e&NwWvkMuu#g0bb\RSζm6<_9Mm&/t5j3f'rRR̊u ! >! g@]Śǚkk$Mp5E$Wd93a9׉PN wt8P]%eR&dYqx\XAŮxh@}9".tz5"t':h)Zm Em,عpFx9UyETls>l o|4S}4xZ7*4"tɐƓ6m)\$ꫣѴF`;P?ЍB!D'|B+a>s 1CSP@UŮM`ǩ#t1r !G:M u=z(z9/ 2%@Ml3u3fwQd񗺈2@)*wQuw#̦E*h&/G҄D&L̍ZQjG͖WC1|5E]/ L 9q 5}yUyMU6fPC$2ErɎw4m*r>3IW'">Mװ-+7)jQS`Xnc@7(4 c3pGHEء^`BN=JؕGBHAEwX!(YoR_l>3le q(&zg~5Ti狎 4C#uAGxz6!e9Hي"6=\DtFqY2f9/ZoAdM>!R&bg9w<\~b U;l ]DjЌIzr0Lt1QhZxjMA~HutjVQWhQ"iA.;0\F;ݡǒB!a11\fڃi:xQ_XV<^oAddKYYXq$]!8hGe`6)vis2¿~*v#̜3}jMθۧ1t'wsjԃ%ʲyoB)V@Ӈ8xYdkj)You Obb=UZ!đ# !KO̢S?Z#6ְB&[vQ0"j&"I'vDן(h}r 2 76tL"" $A,u(2Cw^+񼘡:s 1pE~JQäxESE)KO`ܥ  I?ϗ1tcD$i. T (BwBy#ΚNɆTsB10n5k&pz=pݶd~vv:Qx!ҖUf4=袢B q,hFʝ~ :Q)Qz?[v[2"1gs_cTn7:Icu~Tq0YۄmgɓtHp EZTaNOu~q&D3x|~$+vy.-ra5`i.U6_꺾t+$"!mk_MVddDMk_FDč0Ș`/a29/ yȤ8F=U/iBq ,B5X⮻#*;29~l&L桇\]VR̚eE)]-L#8ɴ !D4 oudΈV0D}Y>pD;Kp!O~U!K]uAI{_ZQ/뺎'6uEg$8~Eƶᄑg;w g+uTbjPd̹<8nSl{=aJK)x+t5ZyﭢMo΄oI۶Top"c8^O?+!#S:u >)?2118-*ӿti<u|bZW_ 3gz_ &KظoG3 ?S.w. g)iߕ ^w뒓V@ao;-TUǡ<^oj5?k`4>գ; '2ϤeZ4eymkkM a?*uCZ{ux4'D$;{>DMi/*r)&n,um}:ӝ#/v4Hi( l  d >!1'Rx4@i'WqW3rd5S|V:ÇsgbYA,+ĝwI'm&)۳ӟ&,,ıLB 4MDWNpx\j;,jFW}}; cmo"Mo J(voLhC>8#!y\lŞ6k.X(>1p"-t>=.Y~IO QV>5ոA?.^&N:!'R"6F#/GƮmBz&VB񞓗|d_dظ\N%'e||3/Tp8~}hw;[1$A1il&7V@2P Cl62'k {Z!mvV fN~2xx솷`4TM|)P8jܸ'f5^_H]= IDATcM;zsR Ul 7%Bs92|-b[=S,t^s2FTT]y !xoQ|e?Z'?oarS,[fկ>E"38)"xG7`/pnYB%!Ĥ-αOCT˱ĠEˢpS2oz-E|C1CQJr} bݤ=.)a$qeT0,- p2:OIV(.;NeqYq|+EUɫht4A:1=|E=~ B 9z?O~RظQ㓟v6 5mf¬ۗ,͛s8q4;h O3 Mm 45ƴ )[: EUHE-7gHE&\%ccxsēdNpQp'nl;Հ|S?tSt'8Mט}OH8/ke 7OB\$,ĥB2*10L#ϪDsT\s1-c:jir L?{=?_@S'hm)]/3+ȩ*&G?y5 3>fcK/lgp43ns<̾Y^hi/ȦELx~ oй͘jov.-`]Tʘ P0rքpRț{AEUYaRl`P! #9C;B&yvP) N mv5ѵyR]!BL= >!&1B5ay^e}f\@A!|dϓ,J!zZohe@3c]C~|As U]U UU2l7ayu'y3*.ʖ鴾S?LA Vq|̼c9Ek`sf*dW[J,G՜>&-ɩR^BQ2,ZM:z-ä >t]belzT.7ɩȮ,dGo׈륱ArjJrk4:X#NBߍpmD:zOYAT9dW?`MIdB!EGBIV/Ҙ~H`zmoeH̺C\WCe3(YT1HUETT]EЅQs(Y<;FϾ#tl>@T'jKOH-v(I2lS7G%̴mZضihnEuV%l:6gaUqBy i#5(:5aҽ ȭ(LkGf MOA<%(]E`۶ɫ+GD=)\P2M#?SMUR̅'OMKzpxoL, q g{hֱL/wܳDB!GBIg&M/mxqBr4=f'HEƶ-=`HRXj.95l>4*rUUGތJ:I^ܚ2BNיa"}<`7)zT^rސzt̢kA=fj|7OPa=QTsDOl[{ Tnv1bGǧ‡ UB*bAwBr_V1v~hEL+itb|Jŕi{k/aZ.)鰱'IGs2нǤɾ@:J _#H@Ez92GPe|,QuS|M:5LJGP#kwSSJ4.g  (Ebgc9`elL>&>Ks7wujohzx8t#g(SzPE(( eIxPE2E8ͭcB!M?sov.Js):7I# ^]gsg7 >`rkɩ.!10 M|}|5,/3t|ǡMVtd,sL9ضo{ʖhLMtU#~eBK[Y*4Nun\Y {~$~ ^M2(ii$l1;pN7^RsݗhۄD3]A)xe8?t͚@* U@q#!B >!۴8N$sPe9K>fI HYw8bxB 2\Jqh$="1=9J*X157i}3CĀM&auOJԪhn۲vrU?p5p<̼j/\Vk^.x=y6!9h!++c>sJJD)i7j5j3$,LXPT= xsT|* PFB!PM(>91l؎Czz)U/Bw;7W[ ZD:L")>xW]PqtTB:r:6p腍j55L@:`*!DeC^jo1hh2kRpyPpg)xU*|oBL}µ<0FYw]!N#OŤIpE& g'UdP"xshn$B~" g(_C͍SS7'j* 3cc`#M.}XtQ4UͥLO ljvrl{#"m=~%63֥ME@%PRZй-RɢhUl&9g#kwrl{#F2}'18vzPz)eiC(Ҩ҅qnmK (:OFx8ʶI ӹ xO hxv[urfT[Sae9>`3ՠ(N0IQl UWP%ض3c;I HM!B >!.LrmppK7Ml%ImRʹA 4]UBi/#Oգ{:7k2?v ݩg)@˺=$6-"=i[Euͯ!B՝'m;5*}CDj`+ZΘa&}[ t?Eu,N$ͭy|X͝lk!wp%B!NB HB_CDžUGve,\/KG,$L&Hc#D{ aҘ)/q0hyv\~=E jPuMXG֦)Z[jyux90C1Rqnlk]ewC4>WJpg\.llHI`M6F"E&zȞVLVil\~gmcf 2$ɡ!]ĺI f:3)AB!EB)cxL! #OQs!?(i3id$9hɑ.Xh. 댕 Ghl23T!B1 >!)b̺c9%|*3ugIXE"9hIE,2 (/԰m11B!bJIA!N2L7w5T.GvU1P"{F4'Ȁ ej iB!b#!8Y:^6֓=ܚRBE  {\h*2k7M٩ !BqB%۴"| U:KGsvYxB~\>fڠ{o3񾡩>m!B!X9RDb O !BqSB!B&!B!BW|B!B!y%!B!BW|B!BGr!nB!BIi*w9mK{w9NlrQff͚l><+8$ )B!T@xb45;(E Ýwn!kVq!HB}mY dwB!.Y7Dzj=fժ?" /3ym !c$ #]}.$̼j85=ЂmMڨPLU;ʷxyw3!.Rt}) C t} %%~>'*kL{^{{#GYr#O?}#I.;߹ Nܒ ^{TMI1V<,ne+>__eBH!%O5*/KWa! MбZ߄w]IvSq\̸*t燘L+BTle`|/fW_ q)\+! cs.N~!s(+&DBw/} eSQ߿o}Z^"+ko^ S==!9{XUCNvu eKGA.X \^7sᅫD{'D+0m|$x YeP2-6ckB\TUu]D" hoUzsF@뽊Kٱc&fNP9fRS14dЀ]vQH0FO]K osַn`~JJ?O>ر yylP|f|*Y>l 7AV'ajȮrjZ6 |%Ʋ L/L7oFQ`0}}tvvpr-1>Uf߾pa+3f'?֮un& SUU))h4~]];8o!.mW|[%M][?4CRGL\5l _fqڥ!!ޛ$ d7WE2iw2jWAIIEb^\%9uv?A8ց;3+0<{ rn5BeP4 lg𱩻(BW_̙x_=0_غIJ6&DRVpBKˋ#3IBoo}!>}̝Ú5KG_+Ӵص[o~ 5E3B[|B\|^gMEjCdbI_ކL)^XӠw_rqw siiñp g;EYwAN8a߯_L':UO"rkJ{ݨ.ͥh*|1n6a:AxNPk(r9q)ƺu720ȑb,x(X***:ilFBL>ێ_*N.jj? h86%]fɒ |ӿ'vD:-!$ d|TMefyt[$cI۶ s4igUq(ʜ{V]@`r~JS:^f?p=,;٭{d*+|@QȟUvag DD6 IDAT2L9fܺ O(eB ܬ+Pk"r-TUs) wÓ aS<[;APw ւ';E\etnk!.Y0D AͅVC͹^f~-P8b P[ϗ猩P4onXw0tHǒ4Nu0_S4g942GRCкz:ϥcchng r%4dbNb0,x/7[$OXS̠65LC4 'KK0%B !-|B\;,+y3~r=^Ae:m2_~rLP5<-)=s!B3|B\A[{)ZPHï:7ٕ׀7aN@.hxx*~=nu'hnEiߴtKu5wPM8{oaŊVV& GߟljE۱ciСYD"8E/BqHAqIkXO-WP0@!\#k=?mP4Ϲ$% {OeSP8qYZ]ܸgi>wKgS]B8ovͥcXX ;Њ>6bȟ9x+c*֘}ܤM&u(%=.xstjoLΩ9훝@n]#1i8PP7pb]^ye@!x( M!yf6waZ d2 3m h !b >!.if`p XOBaٗ}ohSAqPT@bgL1h|;ٕ0tRoNUN#P%XW"K>rOPV܋o"lקIEb^7sﻎk*-q+n2% 6|7ĺQ4 sJ4NRht8nup//;#;npq3H&O$3mI&ycS'D-d2V!$ 4/0#77@ʬ;`jpcbйV5'"dlmX9w,72"5z Ǘ+ՕrYtG$,'"P )^XGvU1mϭ؞e$IE/nl,tZ(zI 8^LKfvgd* Bvy !B6 >!.yeӻ͏Ss"<ER9)t4AYͫƶ Bz(ΒN͇U!/;5$R'pjc$\~f-?9Y̾o%mmBߍnu/5WQL0i:zfjN 6R# !BK qu]9U8tͥd+X#ʘxs|nl{Nfg !;(֥xsM G[&P$P[f?Npj$Gd}C=#m7lY%yrB!B3Yv!uS rkb.h| /i+l#Ћ2hF+HLO(#!t85~Boߥ'2Zd_;Y!B!&d>!;Pj H7<[i]۲8eqO'rT B!{, whnsꂹbqOǶmD 3d5hnpmN+K_NsT"h[!BwKBqt9 V8;0Ӏ6M; (hp:U!HF.컮%/')HSO1&ӅB!|B efSv,TM%5촽n1 jW9˰z ئ2=@w9 y3{S'MXF5q=^,.(]9U13:!BIBPE!3n]7' tZottxȟl I'F7S:6`$3L[sGA "P;6mx~;Ɩ]tn&>(B!3|B3<.V/#n끆g!3Rnd1T_t m`q:/_? &8(],HCO=78 ‡ }gb0JӋ.%B!]BAe3a1$%슱n}e42W=|B+puupVj;1 Bu*wɡ(~SGuC =+8]NJ|:';c|[!BIA! TYP+|g0߽uƱZȯ+Ԙq\H3Y r[ 񹍴m7Ҿsʠut̼Ƿm0Ril{bN#v T< u¾4e s`ɩX1x}B!|B3h~y;OeZ 7i?yMoQ6?ONEfCC~DN5;'8vTf°8^K?rCo ONxW>5!cDpOA7<5;8 ˴NhYc;!B3|B3HEblޓxBSo`ۤ"qã-N?BóhXONu)sȮ,_B4l&i롯NO :wdzEOM&$><{ws9͌1!zm?()MXoL,yׅB!LlO]kZĺu ұiH:iy۱LᎾs<]15#5;c !BKba;3B!xB!B!8$ B!BJB!B!8$ B!BJB!B!8$ B!BJZm !B!΋"˖ٓϡC[Jd  xB\|B!BL {?QUdM^^?O! Ź/7',8dمB!b|ʊs_dժ?/|u\.?o.ҧC?͗v!, B!TQR&ΦM"ٳ+W&u=Z >aSot2 s'"4|B!BL*2ػw`z_?e|wNO_U=2M7@"J/TDB!BIfLgΜ+w~:TMm^5n)JQQlldzYsn~Ʒسgi!.f|B!BL JrA$`ɒK44]O[.ѣӨmᇯ$10(nx[;O|>% {B!Bm *|[/&7wpa/W_cuL@UUs:?> {B!g?{ XKnnEih(0R_x~_}ALH]!B!Ϋٳ]ɟB >!b (@h8O4ciC'm|jE7BqdB!.0a"6,^=2(0HA!HHA!P,Fr'4ވus+;o٧a/ ,,|`#5/d.>B!0$ B ȆN/} niwµp0QU50MԀ!Tҍ@б3ņõ`5C!SEB!"п~UP<`jA1@PC^+9A lru9Hk"+d񼥄uE$\D |B2`[6iC"!&Jb02׆/Q9ppym6%/BqFykpbaaa6"/TIa*fqԕ }b^a"8xu@)i>OgǑLoo]Q̰a,o_QJQ.`V#'b9L>v)ѫwⲗ!e_ \չm$qV2Ռ70lbJ%:OY5xmx7NaaaaPaGAU&LF+ Ox; ͦMCH( ~?lv$_I*uX1t[H0&ZHAp,%nF&poZK/ rz&;Ek?+$n`z/>; C( _؉?a1/AK~N 0 0 0 |h!?|&81@ $bP_&iffBqW֭:oB2)v3؇()85<GQY~"~ +P7 ?5Nw15׳vTT,Gׇ#^e˖:*<($|6E@۪2 0 0 0H|MN2w%D ieט;w5CcTID?OQD<ѧ7%TCc F^ Uam&B*qVOx} Rap93_I0{HC!^9ǐ \I(NaaaaP6~1 mpsL)$ K j(7@8|x|,2Ab:)E%??s̛7hGƐ?+I1|~úU%|/#$ KY4ҥՔ]H00~_N7 '/t&Žn'KQW0 0 0 89^J:q D >eeazX,D 4 [@<>$,fz뷙cGsmѧ7ѷ*6oI&O6J2eO"h&hF3gRO2jܓD"}Y|;U!C/0qR{,)0 MI IDAT0 0 0CN|%DIl^KMM+hmFKXd_HaJS7QTwBGaaa_10 0 0 0Jh_8vT|jO0 qb0_l7D? 8o/6 ƿa{>s~qq씩E6 0ƿa7×cL%ںOmp_;3 ee߽ntW:gm+ӧܿ{m~K?k+]ΟSvO?{(H+o˛S4le^w]SWzt? o S>0wP qxV=">ⳅMzܿW9nv.;u}^@ƿoaq#Cbfz+EH =19L82vh= df0#c'/ˏ5NUq1?oaagzD|(j|ѧ9[ /1zLfʣnYgƹez\rq#۶TNGj3=Pם(Ey>0kcsFfmxzi:1JAم\v|gl aa=">$mΣ1̇O(-EC$gR:_g&C_ L z*zǮ`Y ?=FMuz8PXJ2S&њI#`S)ЖNq紉n 6^&#>NZӡƿaaơC4{ ?*Oʃy%[8to|oT38)ʛ WU?l)%-erY9h궞袱G2+',橹Wnig;JS23WVjxmo模 y{㏙k0R]_Wy' ȩ-? oaa#=">iO},WH]GE\za O嗦HD|s'|z#gNKVlyOG 3o#%Y\׋ԏpFԬIӹfJB8o\YǛ_s>c0 0 СG"^Ihl􉶥𛆰iU.OpI/#\<sMNBqOY$t3I(/OPR I3tbF]+um-E4Cl4T-gbMTx1N9ahONf>lide0asEeY= aa^#Ouے׾~gEn ~ɯ#{TZ:z&7ě_f¤Z S6$AFi3r%pӌoxE56y s&WY뉧|>vfw>\oOlaaH@,Fv2 p3ϜK4:r(*T~wj Aeß0n kW~g|e&vՏ>m]Ow~WwsaWy:ͭ3лz᪩u$a} P>::ns Tρ^wF"|oaaKT~֗;$HnF?xu3/d ܿ^{s}M_zjի _~a63:0 0ݥGćxa=єa6 0 0 =!TLSad7 0 0 cHM0 0 0 0/.b@ާPmb]HJ 5 0 0 0}i[ٹ{we&  :$yH| O#a6h!+dS&w;lbYx:F0 0 0 x!| { {ПrU8@3D7ׁ &sH:ot-<BUC$8| ~-",^ouk\?>P}6 0 0w{x⑮ŇRC9[`Ἦlle;} <}'Ogga;!rs-ǝ %%pY07A:ܶOڋ#GÇ>"?h+2:zxZGaD`K)&wÐ1*r/Ga_B!Ot.wFϹf'k}xnŐ]%4 ο&3mMQH$ Ak"k7L ǟ G KTD$64˓h<֯y,G^{`:p%jiGU ǀ1rVHU($'\8VDi 0 0 ࡇć yTnz.D3uu |pɇ$< g0{)ro"& 7CO n~\#-;]fw2עPTͨE{v(yȐ6y>e;zLnX  u0Pn*ȮQUC21S |"dcds?<8dz wI]HP 5@ s4nhTBު[P(!b88X kW? ]&չ mC p_~ڪ㯨.}rD= 8׵UrG? _TLph$aaC'8qBa+w\׬hnQbyRlOŜ\ȸYBDqP nsU%dQκ$4?6ʛ#qC&:^@FԹq ko "9HXIhY#$ZDB_-cZ\\_"˖+}$\v|翜 POf=Z ֹ>qhaa;ٴ64.Z{}!/\f"pqXPCYA`&Neޱv \!Xɚ2֬ҹ(,wHSyQ+#7CQd<#Q̓w/YNaWt`yX7?GQp*nݷ4/ѣXKu!㵑NwJ=L@@LF! }w& W~ {^zέS¸TĒvqB&LACT#l3baaƾshtexY7s J|ChvW˺:$uEN|C# y&<"Jm"瞂+QCA"Npc$f*2-cH7dz[ B ) ڊC@\1WH.a|0z,~P!W\ 6g{LGAzTUk=ܻ?TҞ=fJYEDz>pB ktZotڵFi̾c% 8?4}%blg] F`ٳ15d( *ϥkz>pKJY/_N;{8T$O^ *WJ.|.e='7E&EWQ=*H|5u`D9_{Goaa3dCNB3!9땰g!Ѧ-9ez`P_\M?;@Qy_dJFI 7+\SUQ#WVWp5pYJ.?>IV芕(FHX7͎.=<% e&3˭[L$+`$PL91t$uP**_ЭFcmW@V l=c*%0b2 ]"ka ѨJSązϼA03"|B_yXpZģؓN{p4~v}WDtAbۻil?ܪ 6 0 0 c8ć`'q!Yi/"E QTw!Od] 9Qr_ VTyHKídx0tJopW9NkxkTqHɣ=\w ra'0'9c8WpȽVIбH~G>tNZ<օP8e<.A!I#/.ai׀^uB-^~ ^@W.B.Z !cXyjwVZQU*vY[3@Ilպ/: IDATkPC0 0 _dCu#?I %^lfn m@9{&bwPPU0+!qo# kv M+a ۝ ed}UAɩg~= ~ #z{YPX 0 0 JB V,.<%]'aP|HzF6;R)dT"c(%_wHpTR ? <[<Ņb%[fDb\Rڍ:G5}yrm55|B\ ]!#>8֬R8b[/ Qp(d 4s9dvKsagdZNBY"gҜwQ\ k߂3 yJy;|⳪H\m##r:X 0 0 3Gpyyx%j{]0#ec˗/r"M–ӁǀshY#6iUhX8_4ՇvOHDӪ4S; !aa2Ss9)۶B}N6v ݢv! ^|V=OIX-l8-$t8DB.v-Acb@m7aVsm3hN?[{y.t 3N}0'e&OCp(ad4a*aa3dC&o~x) ff9.RnɤPЬv݀ Wa~+ģ*m0Խo^f#a&"Eջ >z{\~2Yl'"֖2-<7Agڋ[r@s3Vvѹ+ڷ]?d==ڐy6 ')EB@@c'`-:ty*y-HL@'е #"PN ;y[$Q]?{;r $8aO\m)YJpлJ V3uc<.od'׏nƱaa?8r>0 X~#!CRL}\ ݫkH#$t]U^_t}.'A ȳo -]U WȐB9'or9ZO<$M^͚lbd}4ewӻJ3UBF<} hnQ6#]ydnT|J߂dFcSPE(Cw[˗1f[:1A(\c:ٲtQv2QsJ~ 3Uad/eHH6wcU0 0 0zp} P!ᕗ+kq~M#5+ !CI] /?ޝIe az!ùg}(q Z®g3^1هsa;pmn 06%9%r{v)۾֭isr 5z%JAJwYc; $B2[ѓ @_HJJ`1sN o Cu`9"8”럹 p$ JاCEo$@<(/V9>10ٖMl6"E(g *(Pr:0/}$u7:Ggĉ7vaanry> Xc+-/3΁Yoy~bCaCkݑ"xQUX %TH{cSG>pY߾$üjIr-_^^͹\{(9BY (/Tz*W:ካUv[ 2䭰XkWïnw&ep=3ėUKyc1=G8EYk;_W˯G/æ ϗgʳpڙfX_x,~، t/ituz_at(k>Vo|O0*9WBd/]hƴv=`<}8Qj' [o\OIr[9caaFOp Ca2_Z >].q N?KG<@@!A! xe45!cpIݰN$Ԧ=:NvGnNJ2L 4+Sn6eTC2H5)TbH <S0\*{\!ddy(*!×sٻJSd,bI˗Pr/\1އn<> ?A^:X][[,g^?h4dE)2U.r 4:x#zQ'Uo^2f_H2^yn1|xqy2¬^#Rr tL^/#?#*>5 m:4"7aawÌi23t('7@)2A3ywA鎚ҒG*W eWރm[奰d,~#'icF<rO[˛sgN9Aw`rkvԬܬhzxH| )7. nWL|}Fx#a9}.@TG߆ݩ#')I^y/Qe(iv]81M"`0T@$>L=Fx/%1֦4L8ԝwSҵX\EI)\.Aṧ\E&KnPxv$߽Aʧ>/%Mo궋w55VyPylN8Y*#F)TZmhoܐA&>aa=Ż >x8Yʴ.ˬ'3a.$ha1yf; d\crˎ\;ͮVcɆZ3%bN $uw0kl^F% r d\<񈄋+Hinkv38E(F~1]ud\QbQL̰P 2tfG[:g%`2*s @nYD5H--vLXB*]Qd45vnе7cʠy8yFEqܲ]lm >6rN8]{BFDւmjyJCHK@1$sd2!Udԟ@ngjPN\. ; Awl(EsK&k2uA82 UYlߙYc baa{ϻͪu|t=;>Eref+P.d[lEOs{t3>Olt}*GF@5 XuNxA`; jѱ2qHTٕWBeoB4v3a/ob>%t@{?1Ǣހ{_[PuPU(B]߻ Q(.$sW ،Ƣ[];;; $InE㹅/+.aA$0 0 ]$6,܋mB6Z3ٰq4g_yUFGW$ n綳 B %2] i{0V{r :&]@}w$B E7aa^pǧ@xi]FJ$gEPU"\a(.m[B!\qX{ Fuj3 l~ cC*ʀ)aaaF_Y,ܵpͧ%oU 9v*| 0xkat%`(ks6'"gD*Taaa &>7(! N}D:~S7 eK8X~G3> XףzEy&۟C[ q0baaj؎41}P4bfTmCe@P>+@0y  }LG,i/(bX: f EC<Cg|;a|ޗM %ERЋ%B܌~˄>M4 W0>Ǐ{b"lxs1KxT, 0 0=|d.r@@}/d dPgvAByFQʽ5@AVTRH H\ u0mU^\lw%O*YOJH$A{Cc P>"{~| yY+H[f d`:cQ8p=z #ΟJQUhDKsH r 47Jw2ܶRH̴6N-cr6ݵU'mL[ ϝՂ͙8sJWfgmEݶJwG(LªrWobӬeaa-VYu@ *{!PZaR*  Qm`P!&Na#d>47)gr%m 8ǐ ~!Y YC!$xp\r\nPbI1ߊ~@ @ K *_Ec\o+oCpd4X76kWn>3 `xK˞F8`209^Ci#R#:m_ :$ЮE#FHd,G>@Avې9 = Q=?_~Vk{;0؄#E22nȊCٵ`;c\J$Wo@ad Hs#P"ay-qmܱ)[zγp8\I}OFn<,L=S < H!80w6Gx9?> ;{^_**U26F-WQh5_6|wo~TҜ{*r &?YmG o fwa&x_Jc˯T)ђҎ7MS#<Xrd&>kQ,o%22Vw$Pxwt 12$ضdۗݿב ,6AY2ƒ09kW+ ]},@ >xf%f<4jzHKj1Mad _3g3ьRvCGO7 g }P%23K/*IwWaSO:gSkVZ‡9|Px~VXsnvB_w>]8; '˹ڢw?}9>rn9,G_oKDS%mA9(>m [bǺ\h\U&KD>^*! Tr tW r$xŎ)`mO%ӄT+\W]38gM?UWڸ½t5x޸QdFV9?X;7u11n0_aLc<p8FЎV޺`Z\˗O>-;]GZl-o4(yq4L`ߵr#ӫW::oy.v?=߃o> gdp[e>chjߡ:{߆o|Ͷ뜏VIwa"Mh֠I-:O0 xqG'af9@Ҡh^Vzt/òF1Q9E}ekoywªxl_9G >G IDAT11 O`B|0~ҡlFF+syșBg|bJyn8 k 9RGI蝲Q~?BthD|Z/6)(Jb[NL1V2UA&|*U("9S8jP1㺀&;?PDΕZ-r؋Vta\!-vcPE-Q#D߻͸f^-QF-rp,G)'u¸oeL+b-;r;+pfh☆WJ w*T?][EZ7EZ1u*:Oo+)=RH7jUᲜYYҲy·vCڡU܊IE6*)O a'azxO+Zi?#h(݊s;Nط]?#\_"}u1tc&ڂ&cz`?9NFCnn^F;27 ,\ǎ"p uoR:WywhEFg?? (: wЪw|9,YM8HK'j ` ?c\؞I8 : ^ΎN8&C' V3'~h)mԞ/ G&-c➄MKP=˶lFsE6 삶u7=+DhB~P+2;:?'֖} V{!tUQe2T =+' f2(/_Rt QA€|\ 1hRVn;b1x'=\e|EŜ Jd ]g%DZ1ɶsmCMjW/K45U<'Mi28B(/ o@LQx"Ϟ@Ņ\@=f2'~D+P]"^ؙړk?immlEQWBdl#')Sb9~K8K!emEԣ8a?PIQV'a)rWMV'_Dӭ`:fm_Jst+ڹ'l [E([ч\kIF1ovp8#|L1&|q>cGi9NzN.Y'C@Y}hB|Wkg}V&cфj%AkR) A_Lo{>oihu HAo9r-f%BO:&Hp>ZMt<93n|Fw"d4l+; 9ʹ9Z"ή1y ̜r=rarw>NEDC2l܇vbhqgWڸ㍫[o W$lEF~*U|+wgp\V'j: >/BVOpe 5ގB; z3*Ph}ښjE+WqF!GK |p81R ·0<#ItuYa$ZdeKd2Bzqz +KQ9z#a p3SoеjZC>!{@Ȃu_I޲.ϳ6NTT*If?YQ%7ݹD2vZQU- гpi9ׇvA{߁zPn DFZZM3V pVi?axq'b/FV T(78AV2eȀ}7(;5S8vZݸ۹!`4۵sD[j\A`Sկ@Ach\G \l+/BΙZ1ʅƵE)DίCVbdE֦VwrL v1eY rlӥp8FaV™SZa,mn4{!̐IEbu¿o}Ҁ z'v=~]JwXV>wyx$οkg`C4qRp4 ъUxߗ` i ?]TN#\M#l5-eȜ]TY4T[]!C(\i@G^j"'7rz }H0JX@O0a 9"8q`صDipGKHr (b9r Ee&2҃n** j` rHt,2WW0\]y I#V,*EY^~8DPt“miSCi(Ít4Q#UG9)ܦ%|:%ܢf|;h2؁&z9@d_?/(-a}HжM k_~'X(|KIyU3_b|WaA\k23pHb2NHn=P%oU? ;S0vtN6oD5hZU-Aӭb)'R[}/wt146rJG+V"9m4 H 3|Ÿ[{"c=#c]z5WK1hnEJqhumljǐSd2=v=;' mOѶ{ 5.Ud}jBF&WК(0~N%7Y$83z2ʆhWx3w`\yp8qehQ+oy(+Gj?O\4j-{?s}JeW;PbA+GSkeo|&MBksh>02jrAE;|܎ F|׊6ɑ#lRzz 5hז(_+g|EGRJ8t@iG]Ea_G,d (`Q D \Dylj- 0 OB;i) oGPDJQ53X p@+qK8(U{&S mu}D;nk`lCk8 S: j`tQSyVNj`%j`66F@EVNj`'j`1@Q- ~>Np8F 1 8ǎvZ+ID.lfW"Mds/__yO\G?A!4IAmǤ4 ]»aHʉH`qD;ߌS'd8&\۲mR%L(wsQ4Hq> WY2x!}GLɧȡH/p9?YEP]kE|^'PQG?JK8 Pjr$Tb"Ƶ 9 (j5pĸY͸2dx7w G? 9;aG֢hj;'Zq"crk(yp9Ld&FoBN9iWpdV\69jmjs cZ89pmd ~6 c:Np8pyhT?ڢlml,Yx/6!\s/pΟ|RQ?jו{ޞD˗!'G) m|"G h9 d@-D> G1w)S@VϚ O)Bo¶:VU^ǝ,F;t=.8W_\O0~_tvqmkmrT~B;cԟAݰ] E2{$hwʀ<"jtdCp8q9ˁ7 'Oou*⠬L)Q@W[ZL^MB Qx;ܘ4YJdgQNk~U7R }hHNWJ7lYDޭlMNe5&gJ#ZPBlFi8~l7BG8ĉcr/rRc^'ǁK0JQ+&<4Z )SŮ:9B v^QL{3T2EЉ̅?j4jQ4@AN?_5לAlEk4J}`Mv֯D+O#1V` \qj\A lYf+PdCe:jPSV"֢iH )D&;wJq7}ՠPA՟"Fjo\nEukƘ.Agk`@ 9EL˩ӥ(b5p ^Y;V[)2B&V(;@ig"$ڠY[K^iO_/qR$xWagrthTJF{U_m֒"FV#Mn'G?>:P)4i~+ı#x),\UTJqQ2z{7s>9-Nmor:xT;dekܸ.Q`?OQB[(!BN2ۑ%7s9+4.CA轻(Nz{(2d4Ǒ!dnEq둱}ʸ%Ȁ~9^PMj!#!d DF%([݊0r(l)x9I4d쇔L =uQcr8<D݊TA{~X(#AL `=uD eȁ8rfc:GKp81x !!4 p*8&t2Ħ|3Jx|4t4h: -%n6(CvEol!1+n1$r4\:m ?oiPDjЎB%݋Pw%'udqIۧPVhKר@FJ0p k!\8tuxBNǮN<귡|d(#eOM g@=Q ڐb?2`#'l+7w EM5BODyr"[<$؍ V'(ی+%;w!r.m V'n&PVwȹt+&#a΀uע 3n4\8lߓD{WY[f qa\;l\;99a4#p8H%LvB:kG ~B~\@,C)IZ-LX^#l4&dٵs<Є5phtS;83$M03MlI]s-PK>=e 2 Fw@/C/ = HJљ@[l~Q-ZTUgXA } darA U $Wj.\Yƕs>;w(p|Iɕ+=Ws*TkqbrP\5 p8̙"I!|P`Ig|~;_/9(:c"~^Wfu fkK?^5TCq?9g/Tt̕ cX{0O6?E}Eq"j,"jԠUVnahQ(jaZyߎJZ9_Vߟr?QظX۱E(Ӹgf%5zV gjNHX"#A750gp"qϡ40W r \PyĴqǸڈY֏ PJ-r*&,A oqL+3inp8qs·p;wv? (o'J_hl@[ >ǹ(*"l?4 g6"vN86@mg$Љ V!cIdvYlFI^ 8)p&TUZP!2& Q'>상ag3\rR>Yr"ʲ:qp#:kE+7p2*'jc~*\7dgrs<ɕ]#˷Bv81rpḍXV3q#'@W}9z7(4=ohŹ9^nA'rXtkԢ>s88kϡJ4r*l4^a;VNj'jr;Q 4CΥ5IK\qeV=Ac!b\GQD yV^9jQdt+7v(s7}ՠȇQdhZb4DJVwrLZb2E3$ IDAT`Vxӥ(5p |qGFh+߬ ކ PX}=G#'ųȉ0x 9$fXy2FEF>o\g z H?`2C1Z䐸h\hCȀE0!z!+!G\6HLXs^|$Rr"̳7Xcw#}ls¸Z;v}4}AG4]x~erن5X56.HgmY1s9qp8k?i’wq CqЍZ: ȟgkA< Px9t\܌9i["=S k(57#H{ѻ)ȀOtN Ƶ }݊+?mP~FZj;kjk%9nu50";f\AsC9.9;˭=_'n-iBCI#'k>8D·nuM&fVڭn؉&}dzd5p8^Ȍɿ$52ތ+*e*Wf;2yPrhk[ ެ7z!p86;hU((b:#lqVckЊPHU P߅pBZ߂BgwXō{O(աq[F W 54Z/6)hu=h,@ĝNXk\ ;PB%Q`O[}m=øk qwjRt"pFqգ4Hj`Q4B-r/A)k 4JIj`㍻֮qG 5(!)V^`V"/|Dp8cdp&`+`ePTtu}o]п9)FLteտuMp8~ЉUHWI8cDM(8~'sHc!>F܈ Dɇ cFp|(882'AF',Qp1rT4J|v<831cȁ29&#yCȩ'' N>F| 91 gLc\ 34Nn7K+]<'V'9Kp8FЋ&i[8xۯBi):gN@?L 5_#՝h$&Q쁒3yػ MVIp(3!'Jdp cy+Q +NG{;`ˉz5rQqpꏲE~%QavWpTACmEj#:RVނy(:}7X4J \s(Uzsa/h(OpJp݋ Q?~}f$VĘLE1r;Q=m|X\p8H69^x[]@: gkAsɧ4Q hQx={Pw¿ ttթ;GȐqoDzx:Q@_ v<ǎWaqe9q+\|3\[AΑpra҉qHo*w |[Jb9I܆ʉB~ /o7̜R/'WVY (/Kau\-p8? D\ZEڡ i8CQ%v EQih|ځ%Tr+#w.Z}h+j{&<M1>;VUEy(PPm<40!M,;eCz G3k(Hc#׎#'oDZiB$ yŎ]~0y܋6~1ܤv^)4uǃ܂"fwh.Z9߉"V }cqۄVws-:Q \aDŽC(9EV](bl:4(ỂӸzk.zBQgS~q_o\%-IUb\!bս`\gQ䄩EjRg},G([hqccc]56G/B\5ȱp ÕQVv $nvC~\ DKp1 \4pB И%Z~L6p8mr>#fE?|x7[ަh8u/Ӄi7*aOCo?ZUMȆB 9A[܆]5uMgl:;Ȟл A^sC%Z/:!b12/סȄ< ?BBoʲ.e8&h2)T )%pޜ 㐑 »A[X@AZ g@A!8} 6IOr FP pi(@@D(!h0^(?lGFDu(aJhr?Q.LADq5zH 5V!Ƞq` M(RoqYy9lΠ4^C 2Fc'@3_j"h`dY?.@ZL_g\ kܶ[ S0p8#|M8 }%8w!jZ%z MTOtv—ttخ]ΆqEQԟf7^y8w x;ыH@1ҷ!29Cdw"6A\VI(R`rΖ%z A>25W!.\u#!9E#h\%a ETy]ȡ4 \z_f݅" 'gp y#h`{ec5Ŏw#>epz}"ߠ1yrRLJp .D6<Wݣk>8fC\h'rh ф)bi:ئN4JK^Njͧ7AG|ū$RbOAi4)[y[p8n; ܅] .DhkDNA ְrt !o ֖~  mU%e\\]9V,A!pMLC1rLtepZ߄l;ޏ-]!ơEh\C+/2 Scxp8/Y7?BMF+Uh'(? Hm*+ ?.D2'~aw 8{Ÿ yy𦟃AVOv߸pdpS(rd,d`V秬<HV'J{52tFn52\X*Q?[^P +=g6%ڒ=VVAt5Qk&ڒ Plǻ9.Yy]?_w;DPςd+O~niYM9j獳 ޓ{=HYkp8J·˵ؒx* <XaXDCl\UQmQχCn._})np8^dtԵdoFӐ~4}{ې.d0G}H/xEM5*ބc? (JAkz?A Cu(q]Au -L28r,E)iqpE1GQzJ;YfGiVD[QzkqkoXk2J}xE-i219-v[[Cm<x[3ZW1ft!ep8#;pIϽ~5px)kQ(5# cI`wt\QiR0Ysݝ(p86"G^t9@݅VgH(,me;uq =QpgXiMk"ѹ"gB=2OZȩ_ZlvXۃD2Z 9!W\%H}\5؉! ֧;c!ze\\48l.ZRL؉vF+h`$1p8Ѓ-`Y t9I@J4Y-&ZV v(;V ` ːFFe2;z3~g{\9VE$(8A!UbڎWVWN&Wr1 $ږmt\vc(4Qk#58$c cc5T%I15p < +7> SAGvxIHhRvVyX$:,O7+ FѡV9# p8ndTV!!+Ws)T"+'*-pӍ+Dz U(]\ F+G A'ɵELGevKn!y܏v~zO 퀠0i<-7!.܏R6N!.V9 AQ`!E D}qCv(AKnoFv9+u3֎)D (o.dgw` jr,> #l11a{pŸ5p %h" wGbW Ϡ:4MJxxf3/F!|athj"&k?q ЪNގdBgP72>k~d!Ms2~!Gh|:;'m\лyZ"bsȡ+hE CNTkfk7X1 9m +z + a0(EKX9%h`&!Eԇȷ=i=EFgAc9vĘVᩉp8F w@C/ B[TNVd?~vlG Ф4 X7 ߇R ̞ G𻟖CH`Af.@6zŷh\V@NI\s3&뒕M ,9#rwikrLsmZ1$8AQ֏aL;cZk>8)t$_yM P:=HbG\D-"r?ދ )ȸMY/6Sf\Sz+Q4C&.#d4AQ5 }5Qz(_ՂAb]0VK%w;(A p^B՟ vh0e힂 v_AbrAv8 \}(ڹ똵;Ѯbx{/^ \$ƴ4V̶vp8w.1GN``ߋ ̫(u!0Fvl1 CǐΟk e3kJۆf\a 2qH`J%x',D%H 2עsV&jF =ickGE+wuVuvL3 9v}}\k}ercڱb+!-!UdX9W1[hw gCZOrMHKQBrH aڕ,!c 9$ j![λzrU>Bʳs!q0\cEqW_)rp\mV.NiPc:цk>8)p8Jd##2~+qr2.+L'(2ծQir DiLJD܌JdtwYE1T"0: JdLY9@*Ah(r ?f+xU54*Jxcl kwGPEwG[ ծP2J,$ƴAsv%yGqTbp8HqWˑ"h@93|cA 瑑ˇ2P B+ˉ6AuۑJdD]@^ @)QQ E>Q h/̶'^4N">IeOsz A9'VY;Z9$Iv_s^b+rXtWo;{qLl\AQ+lܺE ݊鱅c:Χ p8Fp8w% ъ %9 . "rLs!',xeKZc8VE!lC+3Z5vLușpg$dLoCD ԚX"jcݸʍ+hM,{ ;2t؆9D/v_uCo r\i4volL'F&j䤸hvꏷσld>p8/i8]?7nDFf| 3ir%B8hDk;zE^ 57"FA#Q/E88F=ki$%4" ôkr"\\ b;ծ?WNhDngh]lv=^[H\cn2W윎Ę3/]p8qWW vBEo2t ~8@j}~5@)*=`dW #0:m@z2VD݊P'k"x 9*%(Z`v%A/Qar?hPnuZ*sPa|zv%4kVxZku cp8F|pLpD䣭wHmA)-*;w'J5 l$%lDQ@88 {{Ʈ7TYVBz ۑ.td߃^Dq0m',%jFΎ{ᢕrdlj㪶FΚev~տ`|a*Qڽm6##~Gr"k}; ost+v[?~o26UȹPw1jD =lip8O '?/hRB}! lBЏ& hR9ȣd:^Ѝ"#r;28;<"Cu)uvO +"ո5 &\+d_58hMG˙\2k bs\ksb+JU(C_2k#9V优hur_ʧ^܊Rg˜]I}D (c+rTip8F /aM[Z jf&QФ4lmVD_vh7|4a&xnN4ITsE ކVBd}8CG+q!7*+w #42ZCeKpE?Q~>q{B y`fޮ="W ־R+eΨF;v1B)v븝?=lbfudIrkLLh@kLENnbze 1J4h'p^CM 4YJ 'rs!HN~Rhb6[rrEM!?ǜExcJ4yb -xmnDa!'0u: ͆'q489OP!5&LfŗP*A ۈ=)>~.zq^sp0 WF G(U6 TMფNt$:wDwA%Éݗ✟_AXNh"%@|.KX82K!>Bdhn#>G&Wܛ+[r}~N':SHOI\OyߥuޒnWSgںIq13D 2\-.N#vK|fNLm Im=@|֞G,97m6t"E!R[Cٴ>eu+VԂ IOC8ɼX ̓Kʗ਱]dɋ_ ɥ:#Μxn|`"h o~U}6!N/f#  1/c۵kBOs`X |~7UhoEж-_*{jP:LeS$>/V;b#Z%j!:ӈiNuZ1ǩDGx.$…}6a0Zsp{[D}1<$Ф.kt,=캇mЖCY:Z hYjM}1=w|%€5ȅMlYHqiV{[?[0B=5mVXA$~Dz`=L9wps`WK%ؼ "d(b}Phi65iщ~"`cPm#lٴj<>%8D~ 6'؝ȟ_ omOAu.qkn^O\IN_ 7~yT0PWtі-pͻ`]<H@՗*UDF~tP+ڸ>wԆNf5{ :kRښJtKԖ\LmlAV` 1zc:YEgVSj:S)cӾ VkbN_1[T>U&c4 D~$&F[tۥْWqDҘ?/״c״%}?Q)#YD責5mMXZA$~vLigN9]J%x",XZ[#|9 &M+/|Y܆">>8TG'#Ng%8x5x<1?š͛ٲvw|sƷ·+W'GWD\i|Z?~6m[C\==Z|1눘 8A̮SB%)ާepL$:#:ͣjG;05/'Z&:ʃV+@LDLXNmD}сoV౾6jE մ}E`aH>Y1\N%c7?_I-XBBMD.дt<:no&m1. O?7ݽ[Yttk:: I7!|X,QcItѽ{j%T'?@.ßn󻯁  Gl|RzQ&NJ{WCoq8Y.'G!{zu]kv1yT~81 @ ,X /~DwWep/ h;F|"`8Q+Yx]vD1̡C[?gGCrlJUۉ+Rq0bNtHoV/V0bz8MuA @/(I߻5.ۧcR[CR[Ysܴ}}ifxj5fP0qxj+2LZ }VcFz~ R[ˉӉϲ[DQiyGAZDYDp+1eD~LzM#>fDaQ/^ӱum~,Ă$C0iOO~*q5 s98ilCaX>ah ~= JBC̸󎇈G78AܝfmQV=yqr:zض\7bJI0X1<-uc>qen&nj80돷m ِӈB!?uދt~^FHuꃒVhzv2\8|Z$Nbѻ: aPs&Mb3.3 oy{L) 8pO:{#}JQ+?'1Do[N}3q4\nO㨅cӪtl!Dx<=F 3x#B umuPjǥдO[V%nJmLH6P5,=/|$ TF"T8踯#: um LkD{#"kHt'}@n4['{utCj7;{Dfpk>Hs T" W%:ΧMiRkle5)Y sҶMy$9m?2n%P}@sZqb!}Dr]k`IM'K)6Ԑl9߀5]MHil$oX?r`(NJ\9D~85|8ؘ"CԖ끗?-_?-0p`Lxclгρ t1qb?nnS4'|)oVu~ULyx#`ݯR28..ÙjT0/ > _spQ-w5أގ&zDCz!.ԱDAì$D9>m3X)grV($sN?Z]s@[[J8XAm:ݎָVVknmݗL7Ĩ;CjMI{jLt֟L""`xzVz_j`L%B;@!M(IV{[!J"Y f IDAT?67{MmMh2IWrj tvԾq^I`wWVW6M 3|x\E/8AACF?> `nH5F<7p=| 0n|m3CُԖ< D|g> 4{ؼ`Ԙp37>*qb>X"Q_> ['gl5lB8~mwQ4}SexKy݊!V!:tU)DqcHt`aL\iKtWPqmI%,'#gu VWӷsy\z +)'ּ + MȖj!k9C׺kMԖjV/aEz)Ԧ2LJX$FέLfVczs?1Z 6KԦlL۬߰)DHT_b-YIKaqڗ5Ant,SB IFCZcG2mK`Pcn:b PJK7Cy hF\9:8@p਱@d9 i: ^{ ෿G޵A<*s[&FxWE4O U ߇ciWN;yWX8-!:H;qD1Fdׇ3߁ic_xrQ ":4## !nCCHV}\_tR75Ԯ'޳MD{8\AMOE>N/>πa{{[ g$j&$j":ngFߞn7aձgZX3-+ĸoGsْ=m?nG0QL?ˆ[uc_KS[#kUI_#խ:p@][È!{MWowiV xMǥgϱk>Hs ArB=l4 Uzg-Nni |mt3υwAGv%>X4E޷w}rvl'NRbL;WwS)RLio@hInޖڬ6+j!Kpj+,d"Sۉtxs~ںt󩭖)Y{;-uuumEԦdǣ!5,\UwCٱwS$iCNWN!5lx^Wfm 6ſ4'a=`^K18a۝[džX*S Fk!4ml# qͮPN'_)ͯnJhx ZZC@_t"ƎO8+ӕ ͌Z>_`Yi:RvmlLӨ*ځۀa@N9 =mY>bH eF; 1`\KmarV?gN$_H$\?iU+#|;.VV8j,qb~oz3|Į?޲%FYTĕ)[r {llݲ돛cvBMڗy?尯KS-. >aoQenv3=Rꄿ}[ &&zg6 i/KJeJ$I^CN/͛#80, 7I=hB̯mBSz%OcQKxRc=%/ϲݕJ)tP,Ң3kُ"l <qqa~Mᶛceρ׽ ZewjvpKwߏ [QT>XwTpV` L>>V9X5i09o N6_vOU$I#4)VZX2:btZOs"bc{(Uˮ݆V*؜T_C):m~Ը]ySK9žj>LdS>v٪wH~Je*)/M`{;<^N$C(bvODp6uOeX:byXjfzJVkۉfbj+v`)%+QT3P x% N# ΉC/yE,s{pݏ@)Mrz)_鳊JzqLWA`G bX\=F$I}‡PYW5p̱ĐG)3}Q%NoVcMoToJJO &|k*1BcS1}FWilzߺ8(GB(Pd'|/L:>XqD5vN{:4j\mR;éioclZQ }8daWIsQ6rڒ=Ft#:%vXjK$V 8u՛[67ιD}%`Y Ӷ,g0< iAgP[fOR{Ҍ!gqÜ/;FY:I$~quTXW&_#bYDg(ķJ\[L,$'맟;ΥW#FQXXÝYO¤ n 9|dWaApsn|)x0<3FŰca#Pѕg$I)|<9Qᣟc'Ï+@[Y4olN<űm\N>;:e펦W + E R>> %/Z`?~":J'.VDgfv(׺~;WÊ5G{;{`#z|O X6Fz  ;^Tc(pi_l% ƍwX)KY;k0uQ{(7FTPCK__ CL񸂞Xf贳Zw25>6On=No ?1ttN~#FKSS} 10wc%ώc?jt vJL%o6cHzbL7$Iz‡"1 `p\}&x+j?5:ϼnC{^D e.ip3χt?}$bC p,' (_ApL1~6n|,&B}kgjD7= iDS?BhѸRjetf\^r*q¨cc)Nh'*p "ª}6a dvlsn1iL9> n3 ^}ƍw:Iy4#aǺV7ó._,@PʘCiˣ5LӖ&g_F#T3r/.xut>X1"v~p{bs_#?S' k8xoXW594^bCEW"=Y!C=SGxaV]7BG6Ҧ [bG> yC|,z5}^"F7>7Fp w#6Ɲ KLOüҶz'92F<=0y1rh;0,D}[~!ޗj|N!C">!D M;lx_&Ful$I$w)|N+kG NjMK:D<TD9w{+(s UTW'?ry8aXlχ7\ȑQ;<- f1kcKX ^}<-99zz tI.Pq*/E`n<>a jt˟#~X"D qꃰm>חc 'k)S>4,-i/}/<8Q}ߧDB7.\PMmAL{v%P^֤aRbHB$I_?EJkYa馸JOĐ3Ί+FCӀ4l50 ͍)lyjQPwBnmw">#?+MikVCe(p>p6a={~o"XK}5r1bwAc#^^|iܭZCDa=T ex ?q9i@c|j'p ^t@#QٓuD b$àAٵۉV##‡G~eS(㭰r^FP#FA00pEQ0M{({iOGv.`c912b&h"8x2gSS5`H_C:>g}:> Tۉ7$IR E(1/FB7E!:EQBǎ8A﬿LL8חC Dq@cSkh譭Jfcڏ peO;kwv`P _d,Y)}G& !VwFu?'[FPX5E+/$8ܝ"q ESB~'MHJKK[yk~}wMCgԌ;- `hّn5z<~ev!I$AV$j ! CsR`{Ĵ}3_KEPZADb"0%[OL$=z"8@@AP]bӡD@Г@q2(:6c5gˁ':~OP"^75jmZ{AwJ|Ԧl56߼+Õ1G(idK')D'~dR 1 =YyՁěO#*p!޳ӻ@zuvȢƺ?+W7rMo$IA,[^ :G;WvBܘןANLtr}E" UH\=={CӛNMNI_%Xe{{w'=={PfI;ڬ_fQסTYSI7vHqD(F|1)sdxLxb~L)iO@_ {S,6!lOs$ISpʹ&zCM#1ҡ| Z kckbV#,8s:|*`+[~5+6^GiZ/ݯbD_nnRo{w,[yͻPi&c bT2ÀGb %aI4%D1S$I%aX mig &Ǫ-UBha]—F͘SHCr*]GT+c2QoHz? QOe4Euy]J2gS&غ%mX5۠=2ќ=!I$=E>HMP] ܘrǪ7kuV 1:0` 1R`c,̙pp? D]#~Z3ۨM޵n375ڿA6bzҙl#5mGn# WvQu(a=NN$Iҡ > wVWpXARNfoĒ$FA|pmP!` p{isp(F:|QqhD "t[vok%L=Un` W ?n1x1 (K.^о#Qk6&azbdp $It(9‡j!?tqLCpM7N;Bn-,_ǖ}sZ"\ox L z=q,_˿6 pȣ[-DqC8 p) Ċ#a7ß/|%FH,[w9wű5Q+D..I$=UF@Fq] !b?KJOAfxAxǛ࢙,Y"DMcoM IJ۠!=weWD'(ǎf5cj{Zүg DYzGDmFhnTUe:t}{aμ^կDCZR),}Lt 6$)`mG ݋it;zsL2$jq?ieS8Mv |C]/-+I$FCpA: DGyĔ%P^й"TF FD.8XPZ Z``Djs\f>y7618 9ycb"`8[NF\t5^sr0([Dbfu47qOO^$Iګ0|L"F$UWڜ&jCk_j^ IDAT# յArQ$7͞h$vuYh qȆ `Z㰻6<+{pAD2c7ٗJ$IIY}UjH}H=Jќ1~$IR9A$I$A$I$A$I$A$I$ꀫ;H$I)$I$IvQlT}$I$IOA  7C$I$nv!I$Iz6%I$IR"Je}$I$IOS>444H$IWuC~6C{6Q&P_:|_WZ%Tؓbk} iokcpOT#=մ]tOR֭ ݯ+|7~"ͥP(2CZI+J{$iRPxEO=N-\OFu+|5z `񢅴njP,) "=E N {8$VҡyN8$F坷5Q$I$0Q[@y0E$I$vWagP(pf$I$IkN$I$I}I$Iԧb $I$IR3|$I$I.|(޶$I$IzZVȡqF<ƦsT$It(+Jne ƍys) S]Rƾ$rkuKRr`ON-\Oèc-u+պ:<446RIz+6)-#= EnH\S 'Q‡ iguvN$I$==daՊmg$I$I[#)S~H$Iz0ؔ$I$Iyi]$I$I6t>oٳ6mZ۝%I$I: 3{V=$I$I A$ICNo$I$)W$I$)Wv!I$IRtO-b;LK_kƦ]Ç~~[}i_iq6I$IzJ lLƔ[Y:>w\,}Neڔ*[Yp5e340iDFL̖JX†*8xF,rЧI$Iz z:9ཟ23䣗m9#.k H] (Ə-Z<+/wxt˟$I$IJT c CH$IgH$IKՋX49g\r^s;uVXvF$I^)p7:{ޑS޶m[A$I$ $I$IRXb9̓]pݵ߯>W$I$I=4ttmٳy{ڴiV& ۶bO. $I$I~oKmJ$ItHg,fs4i$I$=`^Z8B$ICS!xMpڅ$I$IZ@d.$I$IRj =!I$I?DIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_templates.png0000664000175000017500000030020713203343610024365 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxnzH t)kEzA,ݫ^QTT@zi޷Ι&KI!3nfΜىϜsf4=Uz!B!((aJuV7.bk:fKNXL;qE:V'WO:A<JVǓNLPOXS)dZi*wLu[[PJM JRz/D9rCOeXUR,'QgDVY2)b2s|%V9ih=e-PO뵊,{=w+ \2%yr_IwjRU)XRN݂:[QN!B! *B!⌖Aҕ^с!B!*{\gJȊC!BJɲ,4MC)ʴPy",@CGjXV$[y),:$)ihh. 6322B!B+˲, S)iP5 ] Mg(toYe)^P,>>4@c04lnG3ttM?ƆL!BQ@çz==4h@:TCttii餤$sAvMÁnD#, χ!66&MMDx8٤gc_d=|>.7#ҩNUDEP3<#Nvg@*} v;~r {\g+""Ni\nrshFHH0AAAl)[eq9qzn'8$ -,7n]p]avvBCJdRb/T !B"nӫgOV4Pʇ0 IMMgEx^v{M(eYx^ C'.;5k@INNaɒ<)@zTw<ף%AXBuu4`{o&mnn:wVVVrIIMò,laQ9\w2αsvӎq}# OgaGqWŗ &eMtPGؾa_})z_A`LC96oe<$2U̙ 2>b::ˋ򸊍_wLD eg`ԫWQl Ebb2a!DFFAhh(vOp8l0*2qV]skFsggPIZu=μ?2&F;&={-nᏝdML@RPތ;2-0&'2 ھugj:kP!~[ 4@݄vqm^9&82v0"uXvl/fώ`t҃al]}(5nLU CVzt] ryK"}93P^wflzN}%##0BKi<ϿKYgPZ20sTtW Bǟ-9:C4y/Лu  e8whfpp+|nk#tW6y`8l<~wCXe9 >;J$+ៜX^7Z o+q?ם𾵘?=_ ,+מڇ'ɖ*yEoЌ65d똞 LY6Q+jP!BQLkzS'`rs{RJ ?I˛i^PbĒt$ԪU𰰼z`E|"ݯ_^oD cP0jXxHrN#n7 tfQ+]x]uz %ÆC;ZfxlP lCXD 7N=Vy&ƣobLm8<e;ҋG3de(l * ,","I-2  qc>|>o`hS n3oMXh"6zx<|{kp:\Bˇ!4P2M P\,U*5'/m8Ȭɼ M@ΥnOهK^eC˯f3>z$YB ߄;3pg88t ݡs\? ]z]q}GF\+|%o75g*pt;׏Aߺ@}s+3Y7n{pEͬt\Lܬ Z{!}<1u`GQcz9 !Bbʲ@#0I4-[Y>ݺur6  _PˋUI42ӹ|˻GK/3h`FS2y-.ҬI#nw^2lc^l2MC妓 QpMnqt8R I'Wd ꟦d7w<Ч^ Q*Ö6q-9l~^ދU {,ر^`ٯyiܸ&x;İw<6o} PriÃLмyxB8z Uh?2\J!޾uaYRӫW<|3N'^8s+r4 Oyޱ n;q8l:FlLZѣ'۩S[;Yn%Ұr吙cF{Jk+ 튢o wivYqq!y?nB7t4W"7nb֚ŀk=3VpalN6^e3n&ekXCYdEYdEӵNZZ:Ürssq:89Nrssh0MEzzaoTdddÖN ?:,|>3x̼IeP(Ӌ2lOwtnӑa5+nKgKZne)vd)M0\*$$h>niS\g.,j֬"33 s5߭װ+ӠU5~څ)̆瑽c'RrBkӢU4|l]qŕ^xld!ǭq]4 .m,?3g??QqQZ=%ꄀO/ZÃ3?=9'=ɬ\5>53f\/Egn qQp)!BNfDXXii ]W|}GAkHLLnя Xbu(ehngIJ-7+4$[6'oR #s@war$pCOpLBB|w^N'>ӇVx=ng}mmd.zWÝwOwl\AxM~Jq:k+ kѩ9o :L% JڞEHQ쐢cs:I~`hc!a*2!Ea,e`'C{X1k9s~J`S'̮c)y,b͝wR:;ސ~>!cV^C42B!N3,viT!aG)kȻ7U#5-4BCAp=>ӢM7tTN'KJr !XngAH/u5bB 3=Ʀ ͶXmav=pYTE fZ4n҄Α#ٱo)sGYxr-{2W{:vnFMв|>ck-B4\Mۇ<:Y vT k=4b'hY&Y|#4T"#a3 2L\9<0;v|dgy1KsS} `)n<;xڔB!8tJѸq@Gj;i2-vfaB5zhԨ!QO34v h8-/Q,C <ʶmv25;2Uy<^#^V0CKۓW'CzJn!B!N+ x<L]ž'#77Cc:A&u+[i*bckWG1*zLd(B{_>Er_Fn!lz}opͮ}ۍhٱ=]vg&=/B!X2M -5 nfInn.)) 4 4nMSS@ue)\ni>|?b@˻6l;<YiA:d)-^d1- Fp(6RPJ{2l6ifs{q[al؀3!|B!=6 ϋ` 2tna:=1x}!R MukzJ1y^^/J(ezjݎ2MLytgq52YX YB!ǰ pj6hC Ž",Vy(c-+)ițB!ĿU}֕I3\!BQ> !B!(ʙ?\J!BbB!5yB!|I#C!BQ!B!(WB!Brmd|7{&|;+'g}m붊ܤr*: !BQFYt8S`y7^صkwyZ" ϾH|nіQ/"aq ;|0qou= 5<]1#/fɢ%5k؂bq:ٰ~-,}9:vcΌ1̬B!bNe祫Th]LLS a?|FmMKm/+3ukZ׹kn6y,^YLxD8;AddDE%B!!:\j3eEn{79?/ga9x ?_}za8x 㮼~]{ѱMg.2%Kл{LӤ_/øKKn v,_~ЭCw:g|@FzW.=ݽu g5|>_i 8C=LnnnƐa',< 0hڬi`{oOҮSX׫[ozu;o({[֡;u+gϞmzB!wC\u^X2-0{>Pdmۺ:uPVB;tMصsx7aI9|:u a aF:n8Cb2m'HslMSdjժd"~?U[nkj>‹Ͻħ_}defÌ rHLLdڥ]+)kߠ! eHa|8.ϝeڥ 14gìYu[l/>b:u-7zB!tuKW'P~b-]od|{ʡD4tBmXbU哓ٵk7\v1]<x$P&޽v۱v:^}5R'q*ޘk6 ,֮YGD.xCcm8pzBBCq ,\ o?'ae 4-X#iEGGS% .E 4 0س{7G\OB!h4'Lq19|Poƚkhun"ʲ4˲,Sx8i~_ #ݏ=4MZ׊OOy(oѥ[t՗_f:\iϱ?}= !BSsޓp8 .ӧCbck3Qy]ۻ˜YsϹKR= IDAT1DUqCmLӃOӈB#JR0Zjs>oI !B)I?3>ӃR[uТQJSI,jUxfL.љB!Xa&`^=?W)LUr*WDw =wy3pBOm !BTn&~JS=0z"s*Gd̥~zy'ɘ6m:{J*5}6m",, ˲ }B!ĩ= (_;);yTT&\U G}̇~DpH0!!Ӌ[&M(jծC?XP%peןc&ip !!!ɸl%TB)z;ﻝUp?|yJ˘3gO>$o]v!33=c%B7T|Cu\OY yVV&c.I7a nԮUI9|LvkW,o4:Q˗v*3'òJx'x@tt4XERR#vS'6L欳z?gffrr*BBy;oCvN6W]u{vcN\sk۞3Ӱa"cN!B3WqI2Q*r&+K{y䁻bh\4bVXo0iߣ,Żo#oR>|`*A_;P"55>q,_>yGx=ƫ,uœnzFCQbu73F +PbU4='?_ RsӵtPTҸdX}/]rեאx$e)x)@W_v_uJhC*_Vv;wkEnC֮_C}y{yY@?? 4oќ5Wr-aaen;Cp,,vލfA)=B!gcK\$#=-90;oG& y!e:K&0{l=V0m3t1nt=o{vgoTKWе{xL y,^0KʩPF~كҠQy)P*e/:lij?3>%)1&͚KO~zEޫx=^;GHNJfHO`̐yhߩO= S&\oywQz({te7(w^F굫ؿ?;wвUK +[-Xorϭf8}def,a)={vB!D%u\# e1dfd2h@j2YlY3graْ >U,ncҕlٴq3ٷw 5?#wwKF_z! ٧n 9)L iO8*0D)4p]›[MINJΫ[⎭[wZnɔ>7るFPF4:^RКVyר@_}GDSNVZ!22xɧiӶ 1~ʹӊ8T& ]t>#$4~?/rŕJ|WeB!Def3#Rſ)ڲuHnz kWC+Z;.4g&\4P٤#IXy1К'zvzz.^FMyݗ o.1)P,?G_a:#ȁ~z|0G:{T-TnzPJaz:9G3'dLc?5k֠mL_^np4]X}#zsmEHHTV-oqp0~"99/1Fib!B CGmF`E yQѿ+]3~@)ENӯ4MRSPJѾS;fϜCJr J)rsԎY?(HIN#oR ];| vLPpZbmYi|c>QN8>_n` J.\YY1KйX(@YeWez2UE]|&*n1r-Lp3͚4a#i۶-eqm՗_6<#ԮeY >{u͹md'yǁJҬy3j֬ɀ1 q !B3n3FY` NF[ルxpMW or,ňùq]{\nF]]{p9]4kє^U~`؅C nQ^xԔT#y׈*2T(1܇e 9"BCCS76our/L>Duj7_wSl1 Sp׏'^q=7sKÍ.b.As[_[׽֭qFq|9ӏx81B!Ha xW_x|6hͮ;*]N%,]/]r0۸p',1w :!LkƏI08ebTKұ،åM0>TƜ,o ~:ql E!BFTfI*cN <]i8B!2 n?29O: !BwqpJxC^s*N~Z 8ShgxB!UƱOR|ә2TO:;2OB!gߓ7'Â[VlDARjbEϳRbB!ʉf'F]iԊАGưG{2bu(Ut$ە%ףBJ#+7T&`thٙ5*:,!N OFR9 GZBQYNtD5B©Q&k6gGCTJa6%B!)4 {0U"8V=T! qZNB\g[vn`^OEsbבB8lA֨CEвsE#D+<[!%Yy%-{^DEi=eɶ[XfZu"Fj QiiFpP^C(4[! r9޼qÉʿ>b"atlمu1;a&=:Xm!g"'~qNR20M 1 jUӠN#@ʱ痯Y+\DQsAزsdB3aJ][ ,$ qfs>6l]CF-*U=|=ʞ_Az0q{潷8YlB!$ows2\[wmuvDEFc*˓{FIZ+;jQ1lؾ XWtlo_!"4TEW!,""4?1]!Dd:6vR;&*=J3l4=4*;YRXWT0Zjs>РRʪqB`۔$ڟWe̡EV4ʞ_ʞgeϯ Zc>V%/.Wo4 vz*hRXWU*0݂MON:1- !eq‰ߦRTeiϱ痯ywmp ԫ_T0߸7t: F4w}1V,_]0C !gf7@)JE.n=ؓ~=peװj*2Y8o!C%77L22ߟ+W㏍pwɀ곯Pdw3o;A#Yf*]ѥM7ڶhO׶qtmǢؓo,T~7Zl*260\N'>// U7yzvE|Ǟ\~8~C`ꕫ֮;=f@ρq˝߷L|>/[vdŲܹc'Zvç_q5aq/>wvwuח:/'/=:bH/roّNuk8{-Sޟ„'һ[6(glg&[cĵO=;bYf L}]{qq<%v>fXܲuV\.IUү_v;᷹sb9x"#3UV !gޓa (#++krdQ_'g7~&y3&=zӦ}B=BF,rsHNIG擯:xpmӊƳ{n&~Y4+PO:7ZlXۜsa&GL\6&}?oIx _Wymlڸ|dfNFM2|{}LCRSRQJоS@M~KYP5)7qbkvqcYp ]:#Oq ԹpB.^ʷ3&<";v[_fu^w>HN5B8!-=V\MxD8M[4=1$,t <|u>Gqs:4lU%B+^ӥLe,U>FhX(;vDY;3g1i$,^I?++*U,EXx5j ''e*"##Pf{\e)_~N<ȟ[߻ ?Q711߿77mAYFMr xyqԮSZwrۮ:G dm$99rYnR۷oCr~%WG{g|'@ZاP,;A& K\_XUYZ8Y[X/?o.mWY Ff{qcB9lҏˮIJJ ? ɇ2h@C4WE/?*_gS>}G0>zoJ=p} PX9r \ĆƈuK:t'|iMe՚dfd0m4,,l_}ͿEӦgy&.yY,,>LV-ټmӾ'ٳ ́λ`_4wy$,,֭ê+Yv%sӍyX~ }ggΝ/^3ܤ!eK dq o~|%ga*ȨH7:EnC[o䉇c歘ʤf회s^x9o2#GG8nұkSuq=v0娰PX$55-9ۯ m3vt)9x^1;N~9f-,EZZRkLe0 MJJ)Wy5IN8u+ wq{Ipp0^0oܜ/7 6T&op~2yu\e)y.{}wyfW{_vh˶-:IOOg$%&HJJbU"RN{~e]ֻ̯nf\2n /bLC>#~ .T& `˙L'7z-;T!PDZ#pQ[ؿNnХKg|>,ǞݻiU,^>;n'J^}>d8999$N|:unH)!R^OFIs2J;mo.4>] Yz5kdeEg@o4 w/Pֻ&2yN.u%kW-p\Ec- ϬQ癳0_)Ǻ\Ʋ,}51pbjpMWݳMZJv*<)ce)ܺ!/n ⩗@) ""էnΎvpBLxD8_IU)3-l!F =([ObՌu%IŮWa$'%l2jծIzu{,J_5kn:"_>NtdfdƘ//zDWE, Tܲ%4| G1x -YFrR{cXq~wz^4{2|ycE,^Vq]wp8x}^,,, @)Uh;W^_`|7{_8KlR5 E=2e B!DMGKP%._M l[dnz7l"UKƍ>4MRԫ791cGէ[JaY6x@͙HKIce,Qd\y8ه(L}y7:-><>yl\6gA)Egoy8/EHh/ݷG|LVV)wShպ%Ͽ4>Gײhۡ O旟)q}6KY [Wf8!#*ʳ&%&ygiڢ)Lkq֬ZKg:!$$gy ~3G %(8Ӟߩ.jVub>e_6?qy?!d\.L6ݰ,$##ˍf²,t]¢Zj$%%ZL56loin232xzo"'' JQ`pR]{5s6o0p~Be=LIOK'8$Go-,8^05ݿwoJKgQǝ `g? nggמ㯃2_ow^'v;CF sDEGa9O[~hYբz99tځ3琖FzzfΦSTMZ5?'4qɸ17遼'MqF?!vڼb8eqe3q4oќAҵSWvFff&DGGs5Wѳ{/СC;,^֭ХSW֬Y;ߛN;޻q?A#J!83_WIuDḞ񻟙tl6w\ess{OQB !t"(뮺U)vY@wEDt˽ܩܖJ$7w^S=O[p| ms]j&~p]ض۲1g@=y+T|i IDATwK#pqS|ʙKo}n-| _gyKj Q}|6յ5|֛8%:4o֓Jx#RU_ZA?oϷ_]׻7nh, C7ȴS~v/hnn! dY\xK]9i<,byg knzc+_YoO{r p/F~>vp+ L>;|MFO7srNm;!۷窸p٧i۾e{I0'/W^{9kWO6=y&C_[՗g/1ϰ#1$+Ǩ_I!NhR!FR; JǠ3!҆pAiC|)!H?dr~*Kwsn?ͻmx<|! Cw~ؙfappL?4PD~=߶oLg}n۹=?_os`:(s}c:(5[1l~yⲭ Oȿ߿{}ﲁTmidB 1 2ĈIR fiQ =VCbRSҹ4o2 4? Vx׽n?ud'UPA5{'m/ GZ]:3?5-/?ܶ;۽?#p_ mwsڏމN0_Hdր~ۛ;ؾCP#suϕ0qI=azX?\6mx{&qہ\!F~S6u4 G:] ~W:7w55G:Yca.cepI,v)*:5ZGpX30Xl۱#K2\]%EaM߽RHIh*T ?39B#&ͥ?|Mw(۫F-~0<Tzqpq>vq3mf m| [{M{E zJ5OuıpᏞ.|&pL |Vq C1|[e'cnZfΞyyOʷ7?o\z,i@ڿxBл4(Qt vD1[b1R,'3bLeSY]tټe.^֚1%UইvQT,B$BJY)osfLuJgXQ3.Kqߎi'3.`0 +ZqK ~¢GB!9 212t$vQOGg6 <&1Zđ G„#a\ץhAH' /H$SaYH' :c2Ue(()+4Mj.D6 HB$nj~e|<-T2Q'=/Vh(Ciw['\0$  !dcFggr]de+Yf-W~i3u<`ߛּr,B!B_g_|4 !Bd *l0 D%xN =irqJF8D&c~rT$[Tf16d Nvv`%WL4t`ݼ7P^^tuU2~D bI#xUNy$?1ׁ~0q~D[ԴD1vYm8MaQ;8XHgAqغ٦nwT2h?յ.b=;e=`ޢ#VczKA\.B$t[*VjkIuT`9hA3_K*H?f͆s> CM]?(*w60լy=l|!*JJ_땏UygYŇ?´+ZêW+F>7DXlGS< 2b[66ehlQ]sVQE0d{g֭<@5"76#EL?󘪑C|<$B_$[PVVOpVep-%`ǘvB _vhwov^G{ṷ?߅A7۾O!ν(:J#u0 t벪.M2NkR=\!Cu;}cLZCye|8v=WxeV\fup?[PXsDRI Nod3>e$#Lie|\St:ʞ%_3ߟ-QB 8\H͜ uDйj/?#?+;/aX 嫤M?h0 ΰg0)Pfu7PY&Cm¸yK8}i17`HtyA!ŮouN>G/CMmڱ8O~ nvc~Xj #fy5k/p0^!C` l RJѻC;PڣޓQ1}xAg͍d#3ІLx+_\qS?']|-aM:W6L_IsStJl !`3 o{[#;p$][|Ĕ)[ lU9L Ʋ ii-P{p]?otuz)K~oӏY|ʪ$~h'y~?A.$5A!ޖl63f51r(;aILg[mMk Fd*M=+v}/,~ӔWB1ISRN2thʒ&e}k,c ??@3i3>ȴ5XTW߼1Þ]YK+?]]iRr!ıGY]*{~|4ػb &}13ۗ)834}=ݱZҧtbLLt4\72DYHs' b!\ful_>_v/F1MDZika/tBq0_Zs_?Kwc[M3[BXy!f~}9_~>pTX}'Y XQ_c{!7͝46s$XvQ[<'POs'#p%Bq]>C{AI P>PJ&0a&xS)#K:~ ѽ~>kE`C*!㛝?֭zO`Ǧ#B!86HMN{I|l_ŷg#F]bv'y)?s2 $=v 7Nl =i5|[`/l^O@M$C*wHyQN!:&iҮK]Qtf BKIq;#=X翆dyly+JS_䵕{BN[fܑNB, 2Aܬ ì42g8Hly tMs#ΦH"an~ld%v!ЙdI0J5Y*L4R 8+wf̮{Y4s krR0XúG9SqhʤaV]B։Ҝawɽwj6s94?ۯ [|&6l΋/}UӗRY\t1#G!,d =-M“d. +kpfoΝcsSYLsz tV\Rظt'9 8yhЙ9 hx*L{,&WvYtJwmL\Υ$Tmgij|SiO,1brlr-aC7nᔍEW/IMm$H&Y@K<&ho3(*w+^5S/(I'=F%ѠbG[Yw)&A k7Za8 `rUm cAYl'ᵵ̜'v8̜0ę!%u,+ز{egOL'v̴̫\uݧI5$G9eӕ5qVS$-2&ϥ"`$-M[I ֬a9 ㆿ&b.j`-D7Τ^ٞ"ZQYm2ufla us߯q㶰d^\>|#?5#A'A [tjߏ]2<5/+fS\`-}Ь:WyL·=dzέg㉤@xȠt3NH:Yƴn _mW|+cGRPѯ;|Mۊas3`/qG#@}Fk(:&YO+l#b{Dl7_a|aIE*mgZyΌI2gb(M( *?2cVijt 64Iiހ:MFC |tZ܋i~yo;p7~Mr(~`k$99>,eh_;x2Nmw|_mB${/b=N߽\9ߨ%+h 'hҊ˙0Ho r} ]hZSƖ !^SL~ 2=;~w|?Ú>\3!y5<aPQekGx['f PKgkJe^qx`y]mr)xYتа_RidQퟡyoM]?ä ݢq3Wr fA=Fo!s|X˜op9W}(p!#A~@A "㘥m LN2H0}2^0ߙ !,b7axEw{1KT)s 92bQfe.et[0t.Ċ8+478(^#ahߤiXMl( P1d#NueL>t`6D#8i#VcеC>ZSoI;4n7H0!T 49DPwwT?S NSL:cVi&urmj|fS[gw Z@VT/v30Cڷ):RIsmojqhZXcZgy}Mu:h:6k5.+kBU\iMYi(-$oײkE* EWGM~fV XtNp] ?Qs#NcbǾW 9}AL 2ߊnqյI.<9‰B#Aby9N=XMQLe|Ja?o7Eߘ3/Q, 0,CS 0+4sϚlh oh6:.;2횆s4bh`MC'H4h^vekfǻwSYC>vtR:;wv< 3e,Nn"kJI:i=0hm1I$BBX$d;X4362\0\0<.3(4S}߹1E[SKl9+ϼ1WD'v!AY.t{=\QL"ϿWDC3KSX -oquc;;1ͅli дJ؋ JV8YHl~#uds3A0r @llߣUwRe IDic֐ΘXI2DKdkf2ټ4,{Vj|8*ɦ6*Stt6xoŞwu[Ҭ{9~l%/]1⸖nw (;9!ib~S QGBl'g :oa;5%7 V|ܠbbҘ3kҔ&**OS~gwFY3DfM3ڃi7(SYL3 BдJa'?f,i+Ym3xe kaM~6!QBHM :;9|5)|IVNee⻺)ѶT!&$iTiI&Hd"DZ' yvpnTҡ5Qe0BA(ptu(:)aYq>fr$%x^b0-/7#K{Wf<aP3ҿ.*Ү>4ݍMKƙ\gjvty<_0|zZԿ*8u^3cbڊбEtI;F@@3kn_草Ϟ5'/.:2L.QAbSC#=`76uUOir|UI[s؞_~SrQhL3B㏯?=5tu;m{?vM>LYVn47! q|3L0z5SMՈf!?RqvJ) VfBaIG6Fwtn?M6gP~߾kH;J!w+GN7Ɖ)P,^R:/Գ| !NLR1J .=eY2`)%q76~s5zއY\wzaWs~9 J8gf- s`9+#<1;:CoZ\~H @͸xZQ?B_ th&!tF#(mj#CfNr ټ:? JEoak4z (:1+ Jf)[:-Y2XKhKZd;sX 05aߡ StfM?PFawBh`Ӑș<%AF'*B$ ʲ(P%gt2bH1d4Ө1̆H& Tv(0C4^4`~x?HW_C68LQҶpOf c\n9x\7?D3kl[IF+=Ţ9[IΓTFs-͑(o1`FّQbcUtml0eu6WhsD-hLCSrꝔk`»k,Wk B?2AQtY`MIG!3ؽ;D:mrn, ν M`H'Y!CDWY8'W]^EY  %L"ԆE\94\i儋C6itΦt70nC͸B.S$MPq砱fO< (#N*Z6[,Z]+v?R{ŹxA\֣F6d=Dk^K&4w[lۄ+Mm逽]6+‡ 2vw@aE"?T3tn֤6xb{%c] ;;,T[O\# lCܬvW4E"gw2kE QK,(T9`= h] >Гf'˲l|',4M|f0H1G5eeIz-ڐE,ż )dy"M 5څ{m~DT޺ALJ* m3?l`k,#ih.{w\}ׂء7!$njX\~ɏN}Â*SY\/o𳿟L̽gz o95W ҠԚ4[k5];5(v ( M N7Z ) \NIȚاI*ۡY7,K{ל4$vjIB͙`bzE1(R5#ݪhYtg dJE~Dݾsy 4 ˤ6N"۩5.EҠt CAK" (E`GaA} 1o$P^T@SNɻ3-i(<}%˂a ٜ?yci0A)r)E4MrҫF:X2&ZEcdк^ӵv.G sw=X|ӵUӾI x+MTLaaW'(2D.=}HB!AaPQyfÀX8U,zS4]fK/Uf_ |Cu$wAF/9:0(&$B!`w?!Լ6dz_4~"59b[ؔb%12Iimc 6F=hXqS+ųޣ0|j{: !M͡;.T #ԉ*]L~ wJl,˘]fhvDSز4cZN (ceNkɘ8Al1Dkػ\ӼJ3y(%B죢ޑNp[H˻1-in%Ec=bcq6;xNM@ :7!`5 2y}>it /k`M1v- qS3 lxz~p$Bq cYtQ8g\0'b%g2uJ'}7?+q͔FbuA:J"B:OquB 1 :U~&AsҦ#m2$؂#[!8^I1?z,(aZ1 0,?\qIׯ|˺`ޙ$]E+A΢!u-])[b;~8s&4bvJ;Dd\A +b3F:'E{:̯ztJsW2a3o|Uߎ,$!qIF~ӷΓ1C+`yTsNH!D 5J30З^HϬfoK5]ܸ+MhAKs#nPK0@@2qr@+L6s=B!&A0]QN-fL*2Z9Oh.#Hd Dؿ[/%?Af "Uu#%|V"""Б Az CfM2n3xIjVbu u& hZMffMС*Y5]Qr{r&0<ˌd!6:jyB.""Sy<`/5g4s oO&#0V,;ρH%nHS}0Xg]W~N=` kc ȦقYLF/ cr4%r~"""BțfqpQ79`St ۡb,L>QX ( ID" "" `Ps̢E 8Zda'υ# TLqMVNلm Y%ӯ[`E99y=lBǘ~.LCRG doP@'(dH Q+LR`GG*{QZ쮔]rNq?S09Ml 2XAۛCpZafM#s B8h""rP9De IDATJ! 8<3A$g`;Ny7tbXmqtCލŰ2*Å=-mzGfpgCP3"""~Ry,mܖߵ#lwwǜW!V~հPzY_ >z 0D cD_1""H*o22qr# |{b r8a<˹-CX!WBUȖ9 ]Wc0ȶNJ D!^㫳ă#0 x$̱L +nV,PxqL2}\CZ""><b OLwAH7wd@.θmAq6EDDN "">JLtEɹ&m*.k\Վ0:C"Hrz/>$7ɧ#0e[J""ro&r}%; F:uP+p^*Bu-,:V^<$kI vgՂzFpRPZF.mؿ'u#L=ӅG[}U᡿e[`ᇊGADDDN6 "">ILz?VǞ[bREN߷<`yئGZ¶੯eh lkTF<!"30T5x`aXy`1<ƨ, `Ynay Pn۴Ŷf*`X=)N={u}rpP봧cs1XFwOvj.g-۷؞'hG{i v ƫl΃9jAmft*ޗ-m;z#˽m6dT}l]Fw!2kN!_|y:>cq|?~rq~iuCÑT_2 =YںQ&I1<`1#6y~`;Ԩ{-T *Qjp` P_<@7c]K. 96zbqȖENP R2韹d2!\'a]rјG:m0=\ +3劏g y Žf "Q̐(H AK晴J1W׽夳s9iÂ%.Zvi8V@DԢ]")L/ yXǖ͇66.>yk5^yKk|˰uq~?q5u3F(q n<"̥̿WQ͍ႋӸ. !"""r:RȐf.σ|M,~^;'2op| jwcvN@ɺlbn8̲cM*lDQӄL""""' )kn2c ,0>ey 2H%3<QLgYY1a`ȣᢷ63G(1wAD T׸#T/:#G6cpqv_7Da2|0eIv88q!7pjN ;kIU_g y`NddGhxB\DyUC]saˮ}!H֡^iL>wy̿)Z3u6SG.DDDvu? 29Co}^CUgfm# (Kѝ*#tN-4\+ I1V_s+=fûWQ><\!#v(/$ƴB|YTS+A3~nV+6{{L{&Ö+xCoHů}wcu]nʜ8'w ]N*ׅY 1nϣ9ؚ῿ɚ=qБ"3 3'_h9eL6x49>媳TYN,&S[l|r(""""' .œ:}+0IbI0@GG`UBdP+V'iZNegL99eIs&Sy-opy~EW^,nA αhS,lDeҜ ;#N֘Eg[b"ٵ+ɝ?h }~"""""CG2|1(g[ZF| 7dY;b,ƪ:4Ň!5<L7gɖa86vcd!p8`rM&""""' 9uAnrNaһfFo#6sLwgȉPumf9HRҺQ9sYRw'>+'RӺ >: ?Qe6Jz ;8X|v30DDDDġ1"rxoًW?}w k%'m˿_~zek2[i k%"rbӑrLi1cUꪜ2;vƥNu>[^.Y``")-)֓0A5xFlO 6Ɂ~  *z ~vϧebqTσt|ԞDtlaQn:{#«,kb8#ԕc]Tz39]3G`݄iU OIw^I" Ԙ{POn|V6W gxnRLc+<6nsl5(/@A^ȧxin@Lb9{SIrv0WMP u6N“caY/lUo*q],ZtL|qvdCb\?cj/"R2 >l\@0vM ̐0Dım~ #QFLR]L^MG#VxqNkpAw\"ة0@),c'`=kwNaw 7_Ϊ~A*; YYe2\WB,(qD279@l6G}Vei!H嶺Ǫoe+Wޛ料&`]8nm^#7)0KnD l] *iXxGGXgp?p7C!C{[xd2iX7`e꫘n9;|Xm{$ĥgJ]u9lh9{k&l r8Cy5RW]Dd2#wm-vJ2#kys,{)zۜey#3c%6W`Bb <_>v3ݟ3~Tc.vʆwsO"\}0FJDg?z.YĔ):;F8wi۾C$FEvn/p壕kjp Î-pg:wt2efq,@ h}c3r.Ws AlT hq6{G'kxL!4h^t&W#O,^ڋ IոiuxMHۊ:fus`vS 4L.> ` uW2i2UבaȋI|>ilϩg7L߮z74|l&Ŧu9oY ሎdMdH2e34hS P8pPEIhq.K.*cߦҦ"`j,"RZ >[p 28yDVd0!\gG{6@:K̪KaO+ 30,W%0N ^E0ܚPpGLŴb ӱ# 3k~UX]I]:nRH=yìus9>jLj f-ӗB6ڌP߸gn;vcg!=2ѳpJrd #eB<1cTTqLPcҔݻƎO0v|2+wDDDD8y@Oo Lw^뤪^e 8T%c}9x45'7o{O@DDDDMRvd)g^xj3LooP<Ƀ \n}ɑ[@VSf=3h\ڶtړ<ٔa98T&BkQorHWGlszb>gӝ, -niSqWq YR Oz^ƛ ]NvXd_d.0zwe{bM4~N&[I9:Odvb<~y7 1q'9(d+ 3B==kvś Sqe#tcY/)6k seO;YIjil u&/ϒ0L v 0wI$r2x0ݱ4s!ce1cCi1[щQb962#$]S55,d(P(2q8y N|_u5\ί?a[[AԎs .8Ii4,w$Gޫfz rj Spo u蓮p?/tao&@)uEDJBvz|!G>Qq6k*}|:y3@eK|lbml`nzw~'ϋs`cBor5ԳfU\f_ts>w5ۧAìO3mFz1ki:g;G2xbgp'@-CfyW+nfj?푒w[;]Wf^CKo0El4n^O%\s=#uԃ^ Sr-v1!^H㬝'*'2p,ﻊ!}Tc"" 8NnD~^3͛s#_#g%K>6ehd|Aݿ]۷j3&x0\q}'TV?#=2~Dacf6l<^R,g8d-6X]ƻbLOV|bܛ@bey핔p,XECs|5DOmA V^||g׵JjҩA:ˈ;Ah؍aTr͍)2sbߓ.\E\ymŸIT!td} 'ge> -ԴTb;6̎1T% Ƙ[t춘ڼɴma$SF$Ѥa;-'?E( cLe~5N(o3f ohoP;)*H\ u.3.TZ<'</O6n6zKih #ð) HA - d{xv-Jzz zN|Ǯl`e4Md0c*c@rZ=%1%-K>L}@>APj}v2=1rnz,k8Q&] $b&pnų)AɉZ6:Wy4ԘD2D4`Қ eq~Ѷ?|拉5/% :%y:̭CGq;hq]ug l_q@1[YӸ Cm-=91?;5p .}&OcV~.{YXL꾟>Tyv rs -IzW+?3)(7lu1xCź]n'#v.,r r|''۩ Tp%0x9gϟ \rλK]u99HO@QSd$ Ź'<׿|v ].a HI)dIJ^ Eu1+~|L ncɥny}|p,̄I#zh#!^d(=i̝|$;y[k:/Q!{" 7#ǟFs2DCMv1ў)45O޻2ćiG)N'b į .V +\7Ɗeh+li/ [x0OrTcz3 }]xUQNrcZ<=DNM-ԞDDq\BJ!CDDDDD|!"""""R_)d2DDDDDW """""+ BJ!CDDDDD|!"""""R_)dI_,O=P!""""C!CNhkv uuˬ\^܆S(m/|6uRWSDDDDFK]eO׉mlz'KWm""""2d /"k즼2N&cvo=dUQ2 D[GبH&|k3 %Q]JNhrg`߂A@0e|W !'4WcDJS/yu.%"""""R_)d2DDDDDW """""+ B6VX΃Wj4Ogdl:,uDDDNy "rJsgVB睹XCN3jS7)ړțsD!XCN3jS7)ړțsD!cu=4qޙKoWߨMԞo{۔B@qDzrRMԞDD~2DDDDDW """""+ BJ!CDDDDD|!"""""R_)d2DDDDDW """""+ BJ!CDDDDD|!"""""R_)dRW@N_?ry(W[S8}WvmiYgeFea]0 (^}r}߫_=*۱cwmB͘õW[Zp捖?vp{:H/ۃ/ko.^ݼcnL=ECS=G׆N(t$6W P I)tN,GbvF3i]?c.ZNMM2(/# c,#G6u v-%p+ Ʌ$o$s؛t躍hqXmVDZDe3b\xV|r\iA8 v6:aPHJ !PBHJiYRױk] aЮ=ˆWUaw>a$%Wyٕd!{+]uݕF:zy$+& -w݁>X>8<6$jn*ե UG++s}xdfV^Dvf2d`LJ5K7N&:udl1WJ;> qOt#EsK,K%ŴmbŴld몤`KWI97~"8t5[l?MGFg %/ yQ 뻐WKv/uD;E1u} u)'86GEq$RҥF"C)cϮeXuE!+*Og&B ̚-VePY؅Ke~/ѵ ~as Dq:;$;.$IYAci(<'289H$m蛾Sd `::iPMy,?y[^K#_KZ*kw}}>þTzsLTio+ :}qnC0D@8iGR'czpZ$&ú\zJTfӳ{WQA8 pcz:E > )1 LlxTeljI|8pFI̓ ҹk{r8D)nO ^MDyk_y ۓ%͡n6y--Kx{AI:$4ajQ?/s~+Oڱu<حb 5FϬb6Ud3ˬe65^'o<4F`݉ ;P76+.Qt#I4k$b@1JH$+ @1")*na*c!AQ߇_/{7@VJ4k,W^I=yd Ѽ/ľ7MKnLL<}mi{wY3 Czm^:;Y| \0BqtyzXv9{l91KYY/fٻ$o#6 Sǥku<`yTwFڇ]9l {i=ǰZ _9A#2|yU27͔omwqH lz$X4!`'mrk}i6="*p١(c(FȎ+mB!p_754#h`޴I4mh9Cvqy$ -dDZK{`%>IFS!)˙ddAی%$g ;XAƧr9ORUrm&LbBDWQN[G\*Oɓlxyz8pDh\sn: ̩Vzr[0܁ /weht~ߧ6ʧ4־mo|tn~jrvO8w߫{ۻm}w?~vq\l^]S<"2i`+V'"8\Fι=FA^ '}O 6F|s ?TԂѸ\烺sQp{yѻ}BP`u;`%#2t 5'ȣGP[-S[s82#2ӝ71ry2 DW밉s oGmY(Ko&Miy܅XA8~ݑX]Ͽ8zk8cēa45Lj[sJbZ p<y2AN ga̒SO`MNo {&4e2EhAũSAASx!p۶}[IkFΝ (ܾfE!MfeV[7maMv'i%%lۚOCLl,gt(KAAӒ2nL -Է+.8G7S)S1u"6,j"I\4lbL&IrK)|$xh$e9]~)Xǀn]qEv9*AAB WSSgļ!z~/C0$ q%WQfw`=\qEtػbY琙{}6OqtJ䤯 LN;y(ؚ]krywܹȫWb4:0AA8݈ C8t]'0e ~9|ӨQ--*F}yk}˟n&nmSZb}ARZ޽pD8q{h:ޏ>B rC~Y >MUٺy+<(!CQz&gIz~fy&Bv 6(5AA2nȳX,:sf"j0oʙ#G( de~aD6]scĉф= 9NCMeNqQ~ =-'M֠$&I(%^| /-=Cl1cT6@"IôS?#:&8aA~)+9=zm׶i?d\B3ewAgбK}i̩ә>yjӲ$I9oj5ʞ IDAT[lXy_hApuэ*QUr6*qW^8A50e:Jf[|oAנ .<3G 2*HyM~]sgn- J8 0aMZuk b6 LFڵmCrj~ym\S1E*]u/]p y̙1y>DZM 6([Ǻ5k/Z](mۂGxzrleMׇ޽Hox3`s ]{<׮]vB!r_~9[7mC"ApYVRZ UUԵ e.'L&tf65w`$A{rɕ59|宥&o=JZf5v$dH.'Vil q#zq1kVaJk]1\f3HLL`4br>6r jI)2u%%fB:@sAN.O%xAp%IzHzъ4ng<Κfe,(gۍQ}u.. .?v vcz7%PڡdfWUUV_P &K2)%#Iu_S0~MӉpFC)iH)Ir+htTΘ÷'c/h2tF1AV5t bcohDty br2۷˳"/\&pCu*ONPdh,˱9 D! NfX0CٝɅ?\c"cRwe RЀ,:.,W`AX,B`cn7 {2.ݻroR"冦u~6ouuh;wMh_KK |=rZ+"fѧ✜n t]GqFDp\ANn$vPVRƄwc횵aڴn%W]N9(Lqa13~ƌmqW^%l_~1_rxc;ϪX.ߣo#6{k}TUp0iv; LNK/&:&zϵrr~ TU Qhuuo t"N9&Su 7ث'sg&19/)ݺ5kfa6oM[@!deo`4 IZQj^!lfz0 #Ō C.Ǎ}h[Lzi!N~1o\$ 7:pOUe%;u`3Hmz̏ \"N9ue0 Dil9z=9cd$ӑc`DFF2ښ !iq55dM}m[gfRi@DRdbbchUUn7qd*6z&SVTLђ%)cH5xx)Ho,5 K:Fg4DP</JK+iJHOcкf7۸q,ķh6uDop H3P |6x)PRv-1hQ> ?@0ưW_6Լ 赵7C{6=%(ȑ_|V]^Qn7mA3fS_WGey.Bc>4<%{hf#V1GpzAprkj~y-f3]{t=?k\y%GGHhBwIjl O}%HA CT&' 73c6yIKcDlpEE݄zmXnΚ;PXz}Sm'(7\]QfSGx3(+F~ѤSP^!o1r Fq!yk!Nԅn'XCpNh:QCMHPVVs[CdJW\,QvIc4* E>]Yz7ߣ|#K2ۖD :'yxc{N֯]%~Ȩ(nM7i8C(>r9FW@EY9YӼLh2쓾&)9uw܉iptUCo}&[ƶ4x *;w'uV̬L.b"Q;w]l9lHHN;zL$B0`#EaFHT͉`* Jv4o׼y7dNt&7%[14<7^(lVrA엵E*Z-N!!X3[6mfٴ-}5~-6ˮ'~__^YO>4iHqN֔Nu.ܹ#^v w|J;^ӨMyj>A#% ᤓޚCmM `wQ -n4й dd!Ca -5F}[˙#"mt]U4w5ee֌ c]Ȩ(DMu5qT#2 tH4h3n2!mPخ" ȚJ/ 61Z XF` # !%A'n[<ٱԎF7VT7?(uyOƧNlÏx:S}$1ظCQ[S/JqYƾ}>8ޛ$QS]˦ kpFERlwߍ͌?}[A #3+Ҷ]csAApRjNNKLl]ev45@rQ>'ɠTLJCk"WcʊC@_A:̖y>߄ ))zY+IhfA 2A8h.'r82Jxq@EKJab>  (HLs& bF_%Ƃڥe+[[\S_ <(68QbM;vπ~8#]TUTG_?,_!aj5 OϙCTtW>8"-[eyKYX %8ui zl6+]wO? d2ᮨz^/q~еG7Ϟ5`y6rZhRKp,6mH΢xA8݈ C?, >`gkUFzc:k5ED\|-O((;1-#5K~$_G䙔$KIQ%6JlݒB_^E tAr^y{IbsȀK' e9.;vï>Qb ꮾ2R9v g11CUUttdIb48# "+Qu7Ъғ Nz[|hjW'n'5ZՏ; jfԕi *u*%>E8N._ j #bSIRR"<8]oc4pF(Lb"RQ^κul@dT$uuF:. vuӝ7&' 5;m~v-p0)Põnh[1(R=pǣ]GA#كWtܳh@OM@ ?^Sd:Z̃ҙhۢlFԩ3W'ɪuHGw8@Nt! !R`hpH"&.TlraP G3l2O?hX:: #::YY&]}lvvF v⏸^ :@ȷp;rDV}QF%dI ,`4"TYǿO ]{F:DWK8ɩqҩٲ'x]zǢ @jJScbP78=Vl&.>Cu4DFEpGVpqĤTS>?(S Ɯ}?RDǛ%8lXźuo3iw$$awWn{Br> y))*!n#%5;6 瘿e+4CI)>8iQ GlmfUuWBק U< e6?/щ* i}>alݼ7^yUx h$.9Am%&&)x"GDUUާDq*SU]An6/4U-H>Tp*=Wd,3C{t$H93Ldl4mķ:+VHJa0k`&δ)jzTPd'^BOʼx'NÜ;$]&]r!+-g\ 1O࣏Ĭ2]GGQ$AC;t$@]MC:Kr4` /^n1-GK Bs6Nt3f3d~`KX|+J M/{9ݻ|EC`,~h±nZ^3pw+WɄiHl3?h KºTW^ow&5~6)בodLq8dG2O&&S41}=g'§Ao~VmYD']gIDXSEYDE7+)q diO?oJK}~?k[%o'|DeglƋ/HTVUfBzc*/Ǯigp(LEy9eeGY^p.Ǝ9}G#KU]B z|ZrvN c/ڇ/L7b^uRAo2$rfn;4`lVT+FO'|̴Z7uHNgcSI ^#!&~S!vtvtJw$etUrRWW Ʀ. c;%1إK4lp1=?͙Um\.PU@Ud ]:'cE*8i6!bP6Z.BZ2AdБ%d`Dn`]`0]b=#@`3]H35W0CGX—l9wʲ\M1H} 90tmͧb0k(mvdAיTr}w0+hbdYkZ-nlۚ|O2?x=& & \+/{bNHDz!ŀPbƿ6K6~dص YKD-miۮmV+Q&+0hz<&pZ4 ]:cJԂ-‡鱗Uհ;(eea=A«VH @#\95T=/ckal7!v`޼ں:~Z3[v9+DbawhO>El\,E; qΚExɯxxci)Im2pgo1#fM|cg1my୓aVY7Hzg~AVJ\*WXIeJ!FI2ha+v1^yCy{+nl. MBҙ&J+D *Tt66۟}w_A1,¡0Eh$&VL(M>tA86W_F eO3yo;ȿ^E{A~O<<|1E L,;6__y=zpWGꮿЯKヌ9(];&zs/s ygZ,}ï?h "tnw/>r.:GOؗifB̓ IDATmI[ۣ$1OH4ik|L/5r*W:$i꟰z#H~X[)i_f({vַ}#Y 滈NnJii<4 Tɩ\ok_XJ#]<ˋ\&;=>C )dRZZEe<^zDWIO2ip`>,d]בe`@1JuTU۽rӍ{{$|?kJ?/X̳?x `C _IoO`kRfYVmHu5&Ú}z*I|elf^E̥/cP :f_"_.Z6z8,{ݰGձ=?'n8Y׿˚0 %݊Wq& gGLУ@@ Jb林5!kz># {A|@jңWORnҋZ=A2#"a#n߱yhq?JΝ׬\-[d9`>k7nϾb[J*~9 2( 8NdOgW'IhtŀbQ=:ID~dglБt}k{E! `/MV9N=nlvA~o/dQX:@%R+EOBbJintp4t 10AץT`(f3JHGeP"z ̝+{p9 HJIs6l|gϦAApR0Le XgV/_ɤϿr4BQd,f3zI OxjIHL &.ZJdyc֬Gk+uGF"b45v fe{z:rL4ipb2 v0"!,*w7OD!ׇpI'l0ƍ1B?M;]џHm'WܼkR; {LClI5i-IPPAvPDUMu }!EE{0?/jRYQy'Jl իX,' D!SSӃ3f.؎C6((Ç!СX2c9`3D\l i1єջ9>rɕF屪`;1_x!cp1;`z(H`{j8 QWWz?IʟZ._P6T,RအYoP׎Dװֱ<@מb[D91Y b߰c'-+WN5kOQo2Jվ$i+qe>:#bbc:bx, ~]z {20]YR @csm;oչTUV`4*i * 1܍zkK&= .]y8ǿC#ҿm:muy|>$ለG$V#"BNYy?ڰ9y=fT m23fԷN|gƼmXҹ+uJ8p>yMfUL^TUELl _o EFg^BNNB[Sy91nwc]M`v=ơxѡEh&̅_(ܷ/0"WV5 v= "{{'wl`KfFWu?d3>iL.ds%2-ʉS45%nta^:ɮ&_8EUbPb8lu(8#v+( ̈́Sd/$Y?vfuօ|⶚jFAeLag|2^<`;k0PҐLfu]x+W#ED45˹;H^t>;fsϣtHY}=3~Ehtӧs匡Wdٍ{ͪxjh@r:ڮǓts nlQ^cFBd Q<EcaI`sMRd)֫8lPl!믨Al[RJ2U݇.Xӥˆ3Q7lJo+mVAЦNihw4gZC'P -h'jŇG33ѢPúw_p.!g[Mwu 2 \rg D7R`@St]O™ђbgX@vԾ1Prcq5\^x9T 7/awމof*۶#=0Ƥ$^yвv|޹aWlpߢ74XWԻ7nDۼM 7vKoBBBuuZKEъhx9RtM׿bf 4?B?a;DŽ Tp#j荚%wR_[: *Jbb̘L{$ɇk]E0h) $qVhdcN8#]tHP(D3XdiJeڵ )9)Ɍٱ]׉p:lߎViaC֣;,c6qEq栁U` @I.}"]~lv1MFKTL4)ι_@0+2*Ca/ Ij68mvT6IBXP~V+>w5T/訪bS^ص |9gD:7U|D}GQ m/M!BB B һEEEQX( "Mz;K=l}?» ť33 ̳ss't ۶EV6}PCdONljc lZEcm% 5+  ĞuH|)=mwd6J__^2~RYXvF@mqפR"HbȰ( _9A@^vA@˚DgIFXelBu ёdcKJ%x;Zq7pBeέ[4!U3EH`Я??_||w{A!=y%z/=:uxҏ'H({e~MH$z{z:ժF-8{"+?{A#6#=5kBB}} KI2<<=֫b#sf-?u˘CRHu:h𼚈zG ` {ҤESq!!HvZo;SsbjEgX$v͠Av"H]ե%Ϊ4|W+~qXS P>[Wu"Q1W,G]$Hq.sh,ǥ՛(]ϑzg#;'l *733ĸ>p1cH 0v'ymN7B}&7Qw?@dtC5Z e˖@J0t0c+pTjQ1}уyt{v?pMN,ʔ$;+ 5/<1D"wHLשȆծINGgMAXIJavBE":ʫא\PPLE. եZ8SӰI=mdm0U|ngb: AиK#%ƱȞ 9IqfkRn X\Ͼmfgec?}񼧱߻O̟.y&N8n,;@Ogqcef08?, 4wW~㇏f*r n([Nf{P$|9H\]E" -Ss 悅V<©%ن^D"3y{aUE9d9euHSҐ.KuJ@ #W^Ιe[Ra8WJqk-Q/Tr%(1E֩M Q# yYG>K٨:uң'xq\N$ڕCӽAH,wװs7{[o=%ܰRRS!DџtޅuVD"qܢ([ H?wL6o7fC%Gv\O4nkpFOY2aؚU@}nrq*O2ׇ<]@FMqHn@Q*L;m:Bb%\GйnmsrFe4Q֦-LW+Dg%/(SA8[$.B@ jO,)f^$ ^UQhrӰKkƢԺ`yD3j X'{KqdK3~_;wu+ 8Eh4jJRH?۸wvBSʇkjiTI\J$vZa׎DωV Uj_K=)uKV?d|L2wT ?~XJ5dq[O,H$ܑ;% jCx?uQ~v|]d:rO%CSj[so1ݷ쫃^A=~^ҫ3Q$C; Dst@+y(JJ<>GNF-zAEɻN*d}CE‘cܿ{]K},_墨\-Yt}_ ;+üTZ*s2WϣbiFfci,>h˸e`vu,N"z]x<{v~bXF4l3Rrŧn{۬Ww)DNL2D/Aػs?P( tdi4Z-)z*yyr)YytOgɼ ꢻ%dȒ+84+0{""JN /!Fp 3y9 %br(RpLiek*5 S y %ο֦%/&b"eװ_]K^3`pmub6(j8=!bgܿGp{~>edW1]< E%\ w3 ~t?mDqnjVCK}<{| _hIHU%@"ɺ_'D"H,~W"!)Q+TUEF7bb<=?3Υ©LY,gOӹgcKAo=dܸHڵ0eW2e ~`uԬSaghAC3NI9uk\M .0wl<==6{ϜM޷'oz~̝[;c6L=#ڕkؖ_f7q`l^3f IhߐdHXBPQa)SJ/j޽n 'F>=X<.`HaE"H$]IBl $75R|Z$zIk-[P~ [Qլ֪nt՝,uθ/_Fv|0#⛽ D"qh߈2Ҩi<6{Dv;?q6-ƏA"8b7H*l6OM{:bkԩI [A[ꈝ>'l6b1` K<ҿ_}-΍\5T*}m r|L*`TD"Hg}fZ#bǎLZt3(?NDFJ"ѩ~C;-gx{JEP:ba-̚6O B+TZ%;+#X|7#+1Y|$F{`~w#xK/KMfL@qQ};߽A}.U\um2Ϝ`ǖm 8cYdUJ5iŵ+Wظf={Y|%nҢ~ܺ +(Ga \tM[ b7_{[γ(D"O2 $ U/Y@P+NY"nPhj't_#ՊZl(""Kl|䧥qQT-[lӐ! ye"̩IJA! \])*vP0z IDAT8Moܐ}z>|v''"4Y!Jiڪ`ҶS>z}, +U@`hA(J:tĎ-a"hҼ)^ TRPׇu+0w,CWK0VFnN.CB1p`_LNNaTZ[V ghA2w5m&D)MDdiGl:$^72 "舍kX'ϰid~4|.H$D陓 B@!9V:W].-'7`EErd,~ %pԯW$rJ\:4 El,{l6( 9v-\cؿ{/WTPT1NA^^^~WW*TOTJ899+N IOMl6S;. `2QT4iL훷(IZ5HI~@qZ899RfXV߽GtW@zZq ꑕ ѬUs RJ%""ː @ {.RZ +3,bkT# 0DA\z BZ 3#}VCWzyJןmVͧEks RH$9{BUl\ĥv*UQ/s9![?Bϗ X=8qҴ TmZc)vu !,_NPp0_;H$XY(1o@ё#HF6!<߃}ʒ{ ưQZ,۴$#=sڐd2\d٬V8D:؎)\tqvyt:dC4lw'sF#3x 1"CV-pus;<=p@֏훷ҮSt:n%$;+{qJA|#rsrٿ{/]zuCpZ"C##DD<'fx6bSoKn}ӓ;>uO-"ԽdD"џ(׍EX\hbd+Z' }H","RTʷ஋i\]]iѺ%ۿGO 0XШDW,sb0 kw;qFdf#m7{6PXPH8sn3gLZwlGl?s?,GZf폫A"FSѽo/Wc l^ ??$ v"/7_M*ˑؿg>~%O/Z`;%#-_~GX0铧{X`1eҴe3'sv??m%Z"%_?,UiФndįqqsEgMZ(gӠIcj!}HD"Hoɰ Lmu.$C.PL*PlCG!⍀y·`LP2OfCQ>۰޼Iazn-! ^͠>9*V/ݭ$aW#ٱa˼Jz( w_˨w?a|c&|3M[SXX?.i^/ggaoӲmkFV b|1eY4koA8~vCi^YIz aݎ۹'Ϟ+JoGH8r)[.-w$^Fhٮ#veli+SJe_Iw.Cyz ;bW勗GiLݑ۞ED"H?$f :(TFPc %#Cѿ\!Ci$Ddnʶ} iG ToQ0` ̌g&fO߻G-!֟lߐp > ŔP__n/AR R ___>|o8.nnVR?0Bzu+{3n κ &z55ATjWBTt9ZoJF&3ut&#^^hZGlhx!tVΉ `AT:b"J17ݯ)=;?_"H$׹ ORe"Օ+RN== lܜ8Gz:m6kH.;(Oʮ;b*7"+#hٗG"*&wo^b c¸(,,$*&4MJTL4Q1lݸc>j#*&w1gu+Ws)bqp÷G.MD]]x)/^"*&FÈ!霈\p|n$T* *&S 'ذz#vַ3HLTL4ay5"H$k摔D{xd{ybͮ׺P*%dd*E"ܸ` ՐʜJdǰ-(JΞD"$Jf=wقD"qPDzZs]Yǎ[+MfV#Ph 7';nc xxy&dr& -,($^fǛu"I1oqq1gNج6\Yl%RiɱvGj%1Ξ:M^ ѿd$N'񾋋 vvs%?^V "ʔ>"Ho &fK$\ODq|$R>dggs ,G!FV6wzoɄwlJy$#=65*e92~9q1*V(F#A_Faa"N%ztܓ.oj鏸1vxfNWkXZ3~XJlXo_M ~έ7iܴ 52q ]\̶M[ fG$OEV,7rX{T=FfN'e]E7aƯJ%T]BBB? Z'n |g_6kխC'p_|]H$z$CBL`׶lO6oN)ǩhSS)xs&ܼYS ʙ3X2*!* F=Zuk@3s- =-a11mL$ y%7B20l0*b d9%ln'#-amRfNv6#кC[lV+7j$ "bGlvV᡼ܭ3V|X 9BL+3v/{X23՗d2 ٬̌L+%l#Tʧ?b*wMx2,]H&^y9ۯsNc/({^5(`9w&>~dYU AAxxz>s5BjJ ?[m;HMMCLr >h]DfʸGs5tNЖG@DNv6}-*7FXYY,=kcJ݂Y4mH$d^HK,fm'E "ԏ#84j5ӷo/l7oa\˹s>19Q0C x$3f1I@7{$9ƫ]{c|8e0c4 tǁ5WO`sʦK뎜?s[ր!>HyB&-v*V7u~2#V/_7iQ wn` t76-~:4kCjJ*K/O>u{m0;Q$rs}{m#G^jpҲsX̛1NCݯ͆m^r-۳rrs󐅅b&q^Տ{w]&}IIL&rs8~8V`܇9z_d׶?VѼHd^H]{ͰZUT]zvn8V&LFBD"a)ŘiB&Eup~VEHd >{0g.;^d4ѼuKAsj>[6nIS(W>okvZwhPDqvq)eL9c+ӽOO:l@.HOs{z0m̛9{V:ڷqv՝;nӹe{}}b1SDzZPQGlWp:lO`pSؑCF \58p% 㒈v;>}0Ûo#fZ E&__Tnn;w뱣\cv*+,OlQ& 6>,.|JtH… 'D?…|7KZ-5qivmAF H~K.}TR (Y/в]kBÐH$68 bJc0t-$}N'Z6MvvrsrDGc\\Nێ09H ) 0'nS*x X-V2)2%˖ B9 RJԨ] bHjdgeaXZ:N:'J%k@*rECCCNV6 PN-F#n5֨h"=5R*AA~7u#/'ootTK^n.Y$ (cqд:Q4ySj,ڧKTL4^^m6j!08^^VJzZ:BW RiɍIͺ{Q4PlsrfCV?2G`"(2ST9nnj#_G޷ݻyJݺgcܺ$cP4{kM._ʍ[(^dc7ox:Gn~Ly-%}r+WAq0ݷx"MxJΜǟER9ڴX0Xu&?HFz[%?/)_N&90U۶H<HV-ݏ7 }:$fvm݁b!4Tƍ(ȞX/^B^"ݻjEU{znTY3/(8; yT\B:'J.A@GޓIeH$t΄ YDǎRz~~ MKym,k`/-Mn6U*=VՕ wYY(U*v;idli ;l#t)w~Zuks G ۲uk/9_" wq^ ى ?B 5m&LBF5~4vPȱ ?W3a|$j[C6/c 0,6b[#8ym_nGѧSO&|7o0`BXq5{ tՍ.1WЏo|'0e"Yvv" *-ڶfhsg ? +2clzT(arV.YΌ)Gab[aZPk4h4'X-V <7/7Ww7vM _^6 qus}d~[????:KHKb"ݨQmǸr%7vF|)`0祆pǎ22ݹ;/oE"|.&шbȈDCG#Ѳ{R)HKé[Dh8#CJ`Ƃ9ز9QXPȪe?>gI~E| _ŇO2J5+#~71^p\L.uk1x(*tNݾA7D"/>b1Rh5l_24CnYHR\\]b$VKIFփ;pvqfLRdJn^jTc]\\P"@&+kf9lV4 FDҼ2rFlhZdr#͍`18_w6zL1<1ımnX07w'n;b/mN7B>1iBCYa 8cד=_b׳ufOhΞ:^o>E5'232)2=5l6?9Y9:1?/bYُ,[r<<=F +})ZˁHCBWF\.ü{k`6[X,_T׵ΝI:|?c66?_4=z  Kl߼ l6xXJɄ=.s."<圫T*Ο=ǵW(..FVSRG@D3/(7U$z]8w/kAGA"Q4`hZG3 v;P+RREvmɦ:9Q:> xdg0~dr9UkVg󺍬Y3A5c1 6ǚ+1L8;b||q=ƠThԴ K-b1ꊓN =tJEzq̛1Ղ ̉c ۵G9_AD"J;} `|X,(W#+,SԨZD0TKb~އ2l܀į!0s;- \oӦUkT|ʥOD;OF5<Rew{a!_>xrEJyDWO>ޝF#ljծH>|lD/47T$z٬6T嫐Iy=¹󄆇Ѫ}4D k֣Vе׬嫔)I&vԊMaA![7mYG IDATŅln&$Byժ̩ר)޾O^͜f{R|4sgK$ݸ=qswk)SvMBX4d-s9>=S(((N xxlZiűG9p̦r=N kRV,*;iQxrbz֪mNNN8)%BϾmR ڶQnqb*{SrR=84"`G>>ȴڇ w׮I)ܻ{wGsJwK27a1 '}zJ8? aƔ,C6-嫤Hh4^rUFygX gWhA?5jԂ_jjzcr0ixDenf>wk[V6moȖ;iӸF@qR.`eZ0k6oG7y2ym24ԫTؤ+#\ιϹ"ߌntlҕ6O2DfcpgcZm|滼@7|$VJ>4N߽lJ$ 3NӃ!IfF&C^gS&[-][wnX 7&<1ZWp6ٲ'̅%O2&~9UkT+IHN=Y~%['Oo?j 5nt"Cb麕ܹuϾOF|ݻЪ]kLUqϻ 8GB-zo,wFDdi|ODEtuAYܹfΒ}r$f BQ1n=~JʔX'MDe!;E"$C$z޾qYiL.o&fJ&՘dzW @xNNL>21ԪW~LMv5<%vF> 4f4ޝ4ϗ2~Xn\N-joG?҅4'$,-vw.;U6O>GhOeX~#z4:J\_O`m|7K˟5\{sZEMIe$̥Q]4Mal$?@j,FU_Tm_@*v#!]D/ 1^pT$,_?$Vi.[}j#2* A.Y, O!4@rfJGFR(]ׇ$';?xb*PXHL h4jCC [JED%z5t:xsp 戭\ AԎ+᡼=rF#:99TRM-_9D" L/Ѩ -+ww3>>xTY4 _t:ge"BDf^p>> oEZnh|jׯK&HJLy Z?J;nG"%f3 fͣIP"W/_%+xe@?n܌IK&02k tlG*\8{klX 4"7'o'MkVʙ8p.zJBBChؤLl 臧^O‘c;}]JnV,^F4l҈LW7W?Hvfm:y \5Mq#WɳႈD@tM&wiOZV*+D_ w= nVtJn+dgesm~ZTʍ lc*[+%$ޛt&HyևYرPP^PDbA JRHfݽw~lnz @dsg̙ݙ3`?-r蟃|Sv܅5(,ǕCJr2GdwnAXxR(9r8YIDd$Gk.R&s$6#Go CdggdYܜN⛯oGy{v޳젆5[CA N pØ/’SϼbfْOѳʤ&o玻& ż9/Ko9sYMwo P423Y85j׮_aOe 1]9{ Wx`4_SgMpk4mޔ[0xಫ/{ϋxx,m۷fҍqH2Z5d'K|,zd8 P-lSla[yV?FQ<躎dB4R=Tz)gxw@yq-O?V8oP¹ ,|Uf=nhv퍬k‹̛={~>_o~]p;}zYxe\9_l'.[&d(h vO>EoO K-k;?d}7n\9>cQM7GNV.8sQASLί6ТI#N&4KFOY'sexp:|I7M$((qW\ƷVoSA"eͷc ),,dM şpޫ4jiMܭ+YYLi"6v233iҬ)tv;I3馉DEG3{xu|rsrhѪ%-Z^Ի'{ͤ&RV-n6f|FmߠOw>f\9愎|EAr'Cj8Q\ءz}mL&Dxx84mތ޽PJQXP@Pp0l6ϾjۚnuhzM-Exx8CFrq!ڟׁ:OjJ !1RD0H>:Ңu+ӎw`8dN\]AcKs$6H$+=5V dҎM{[992- $4¨D2N=AAq2Ӻ]~',Tg(Xz vf葤0ܶӦ\]zd1$9;ϸ㑧P "22OW~w1QWygxAiזeV2f(7~+#njɾj9 c Ō:C2;ӿOvWyGa Xqz" B!5~ӶzA iסh6ϭ&Ex#aXtd6C?̔{Cud{7 r9٧ZAbd [ADEGoeОm3/vړsOΤYОӤYSyIhۡ=i))}~m;m,k֯YGOHiۡ=bKd?]ͿN퉩Ãw݇bmٽw]ضʴN%""ڳ}6'ko޿iۡ=&VZО7Kd_y$Nm4jtFA2 AݽF-/lfٸn=N zu4MÞ>/c˯"8$VVt84N-Ԕ ۯcZp:p\>Y[,PԪן}bc[nt ^~D \_gm.h>`1&;-ad].YoBA!#PIKMKnt;֮ d6az [od˦?ٰv=t^nx3N kcZ n֮E=hݮ ֮gϮxaz""#wſذv=֮π~4mތ ks`?LlXup>!#X kדr4i$6]Ob 6';jܥԪS kדɔ柿azhN}}]}alXvn PFOV~ȵnV]߼iVU8h^!YR*ibxZ. "  5%(BBB((( '+4,BhRCpp0v<ƹwed2a[AAA};Fefd`XDwHKMv:XlvjqfLxD.TaZQXXHڵH?vPq:;Fzqfrsru1#<<а0uY|RjC~[ m,_%_ rYYSA8q-a+z2!g 짟@unF~qY{K^dޜl\wٿuV}#]{/z7^Y@FzWϖy}ON|G2fHڹ ϗ|S>r,qxwspQ';?ױkN.92畹j P q2b1pޱӭ@ӭ  ŐݥAAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZTFw>'[CʔPH)O 'FԬ䓭p!eJnL Չ'ARN  pHɼt ''+?'C8/'7/GV%"# ~+T̙f3M_Af"Np֒o'-3f[ ({(4  ܟJ~rcٙ;q sLWSǏ?D$&\ӭp K g-ٹ4ߌt00 @)膁QR S 0^@auRx t :"F M7ڱ;a|SoMenږ|wU)q2FTx4:.^P \JC xO+ LP*0n؈XlvP1gM4}\$99Y-.͛ -)!3#?u?1I$ܜ\ƌÚ K|b&]Yr7+=ݪ8Y PXwݛ< !C膻c0tnXO5#k:|:Su[pq4my{ml?`#%ASV}:uRl?`t?y(qeT~g\$-5~Yn=.1QPP{z㏖gzxgyg_0 .ҋ%}R^@|||$ 4kތZg{t_gP!9?fE{ҳ[oo\_5W]׵wMwͅo10IwaϷVRU?Ⱨ嗟Aw8Nߍtv^ tnq"uI};祓Zp,q skRh 4R7 ?ٍbab v-b<5R|,GCĜm23 (|yxjW[ӟ9RHje 4H^ I!BJEJ sep#=Id9;ZŚiY?~Dr~0L&mZY}۝Ô;uqߕ'coXKxdJgwFʠ DFFP?/I#ehCdhFEV-kT&M”&,|I=|@Mytcw X:/<礥,={iۮ-tU/>~GzzW8x m۵a\q[LaY-׭e}w?omwzY;aF$$ӢU 6mLn]ݷ?ZØqv/tڅ?0v1֯ IDATf*HJjaȡ<7tBNvcǏaú q$>#BCCʍg tڙZ_?)O|}{}vsMjӊƍ{lgI:‹/ϡql߶yT4Mykצy>"## ٯiLE+˾Zζ{8&88褧*z }WYݺ0x`1.e1jO~w_{zj&2!2t_a^ G+aCxaNRt\ 4C<]h΋F3RVܽxzg==ĆaP+y_es4'2SFZpW H b롺,5I;բ^uRWE_b d4tlÈPclvu/9 yk&~8&ͤM+oN=xؚZ}1_7 ͩu!ڌf{;\~/NNRbZ>r8G=gֳ`ٷ_4zts.hO?yʍl2WnӚw'c̸1<~IKM]k1.;];w1;J}>88ӉaLR +\7F\g_H:Ē>pPNms'屇'-56Lc1fZ|s]Es]Ub]OnL>j? e@z>YJ1 羹;(ܗWDS?-4psҽ޵d/ru\lݟK_dQrۈ<$ ZL r=2У;GE8je֒tv BT L+d֒tv9*-MDZ,g LJ_c?eC2(Ug#((W] t""2xz{ zɻGysQl}3B3];wѺMJWUy7w998].bbb0>߰aC#ꋯHIN8?>;w ';ԑEAAWe|[FXX `S]DZ됻jy]_2*)ccz+P1U-WeaG3B+VFݨ~8^؋"l -Cqjw_˥yѴR ]/a1^\ݙ(å|2naaL[ɬg)PY,l6Oȃ>DEpp0?];v1[<La>z)KM RS ↛o V,O{HC4m~g kTf<||yf>o=w37gz}{ӻo4a#1lİ ۿ})q_ƝwO ̢FtY2AC>{hW7_ϝϾ}}jӽ:~Qw_=ڻoۮ '_|RI:uNdg-üP4S wΝSW9$~/#0̂HpbF`ZY!X#ʡԱfZ'u~ A7 cѤlp_<Xg]ט+J{*\lx";,Y _Σ㣥h٪e@c iԯ3y+vem|;QQ߼9nӚYƖg[n<ܓ###뉎{JwbyyDp7/G^EK,Idd$aEbb*6="-[&eL*n/܎FϤpxF-,2Q|I)H+;d !?}<^{sI+p&`/ѴddnuJХm7 U~.LxX4 {a8RC ՝sö!SVf>#ꅃ]s{v=Tr>| \80`8q0*[RS8xL&6>W|O?bxԩ[\AvV6))< ѻp-35Mgٶu[:8p:׭b޽\{|=**:|_s7-7܂lfU)ݕiCe%$f` R~cF iEs4MáQPh;iePyF2 Nv!0y*+gN .{z[MOMOg#9!aX/'3'=knZz{q2eUn؜b?G"*kSY'$M)1@#DyyPX̦WnpQ (VSߝB_"T`dUW& 9bN*eb2JT6eiRزC :atr_/z=|_5Qp:Br̄L<ȳ_y~%Á0o{ҥF3p8 i۝0Bif 8v_!dԎTDRe}Axx&̈́7"Хk+l6tօ-na/B+nO޼.vN]}Hl6+hjծU8+kP7v(xheapff:ieP:{~DYߝB|1lvX8nMSUb(l2y |%&4 1}q0g6Uܱu;"#YK=fp39uR;_cU.7}loLAZ. |ƀ'MP"L AdG%=^ƌOzN&thmƐ'++ JBB|9-3FLIQJ`b\P@f L*}+4)/QQ%g#5%qEfM8x ,Lq:wRqy~v ٰi]\+WVoYT֦& uKm~oKH4`\=; :iePHMwQ6,uK:n'y,(pQZC&a2=H]65U)4ϔoX51AL{=vpOn|rܬ |)]f 0^pU1{=i R[&(:7+(aӺav}aN{=| /i 6Z':1M' *^jNɻ(]'ªJD);uq(=ӣ,pJodӨQ#>߽z:uФI4iRmU3B)r@a(>^s5 4O>aÆ$&&dR-˶UMWY=QWgZHpRtzqCxtfw}'i9vgUtn% <»4BG42Rxpk|:VU_DHh}p^U㋎2Bq8]9GX;)\[ݜ|zI tP28"5hS?_t(6Cv6BBC1M' *]'),zn ?w+A'{fcٽTAA8ݔ\Vg}֭[qFFW_ C3g&LV̞noQ44HFyk2͛ݻtv~G, zbԨQ'Loi=teyuՋdg-J) ex\Tk̮9!6bC!23J w5[bLĆɔRKl =VV_5Bxcda%Msl"< 61ki !&‚5lڝEDP.WskTe+TLU`\UD4X#+6`޶.PEbmAhPaZ00J#z~:TqL$:sTױθ9[Ϟ ָ{Rsiw:\k[2[E FY e˖1zh/^̸q|oڵk;v,ݻw'!!^{ +W䪫bŝ EKGy)kw8)C믿iݻwg͚5% ʕfjmuUIWY=QWgZ!(8tqہ)HZ7uz Z|K8m8YLathYlFnB74DPFlFLFhd {V٧jH4MmhR\EfP٤ ӈWZXðXe)GGg/-ZE!Rd1U=={ruV4!Cpe˖j0L8  4m5@}&}i+Vi&ڴinرcL>/Ұ`j)jMo)MLLӧff̘?nn`Νf6nȇ~X-i*Loiׯ_8q"پ]ʲmuؼ:\'#7?"e]"#N*g#6#8*L陦 mT͕ĨQHMMN:̚5F9r111<4iҤMYZ _f9s8S՚Rl[QJvIDAT}NOO/նaL2 JV^Ѵ۫%eѴas6mHzDլFS^~))twLW3ͦgp`(B;VK)%ThѢ;w,qnݺlݺ:VfPF7TQ}`&+`3~{Tgz˲my*~nFYWgZdԏk$C#%&5 tjߕC[֥S$M];*L陦 )8]&Q?Ar5jfsRڨ t.!>+a6뾨'`Cuܱ2v:U3@? qI_` LW3ͦgP1 ;7Cy@5}dr\{JȖ\?>ڻDMO+[δz p2`ӥ}w~۾HHp(  B9ġtiߝrk~CԌ(ۀd2%k ՙsɶ^|NFik0ѷvƚWt9AA*jR?};p0J[aB#4$BP4h[1&TY a(0i!5:P=l(k wDݏSmAAKik4, !Aad؎MLDi԰tVaԍGÎ-^c ՘sȶ Y! p(ol!"40ӏp yiԴt.hљmYa8u/a!aMOO'N]5m9CAQ MӰh&,`"F21B)|PM0i&kpZz{߲֟CAP OVTRb [Y! p?ӭ T;W~AA,0ϥԋSTAAA8~R2ϋKd=v>*eлGR"yxꐼ>uH^:$O5%8(&Cj{9*yt:p%94 Ŋjr037b-"âW;Z'Sy}*)M3q2A~R)(,b6l j|En\?GJ-h٨> WoCTu+Ҟ+_mRkPeġT}4ye_~C'y-y-y-y}RLQ8]!xd/\rb6Z j1/?x}宛LW%+$8㉼ M܇Jp*gKL$4%*" 0*|oފQU*, CiJ_CeՕ M7Њ*uOP[{ Tac0P^ԀȫF7No~{굷N(7HZIk!BѧB'rBXpfʯo+naCUϦ=\Ji>{{pWT1ܕ2 }Qyk??rE=he;vym4x.H6 eiT,BÞCeϝ>*8C6N q1SJVs ׍(Q X1A@eĨG4놧UFU`=_F|Riyg I)a(e v}U޹(O 4&R"yo~8w~s<) axz5z5z%t%wQ@* 4UӧiQ '5I^K^K^K^W{^ G ANC^c6Z~U Ʃ"y%+oX/~_o*OYt{0)etݭWy(yX$ z254(zkZqS^]=-gƯbqGMin@>>T.W'{*q2A8a ]b?( oyz 0G=4EeUJ#nzS썠>xF:<{&0P+QjX*AO @+R_wrW>yO%Ko)e^}}NQy;L?=)jz(Ob[,_70|.y-y-y-y/Uruֺ! cnGKw8|CɁG^8(+3O,iO>w$ʷhܽrbLIN^|R*/8n=)VJتHxzd5%ES(+-brxU^ÒΞ .ީn뚟a>>9鈓! c(rt;/|U`+beSnWEdx(}ȳ1eʝ`>EH'G阴 (rD|_Xvfr#;1e4z0OQj·xR57]%+zU=e43 OyQ?%%l(9/:kkkoׁB^IV$iRq2A8aD])?R S^7J3JʑHDgGs׸+Ӣ~1چa`2d(ݓ%]S4Q"O+?R*fWWSЌ\)*z'ywQUiNI2^R IH(+E@).~eAzQVxDDi(^)̜{?dB&`!!gȝg}޹<<眂ZKLZKJt2$It v|&Yh 3#|cG+[O>mdfЦMk@>dFVYI?;q )))ԫg>!!!!SZ ~x/l\j|e+ BfV}||| էwgZY bm^xl'?c/is`0@cYǣyhv%+tgx9,NEӡh(UkWjvL?r,M ($96.|VeA% t2<<^z dH$㬀*iL /3Yf)oݺ=I(AbZE/f{ SըklphA&pqXff&7o!;+sgp5z)||S'͕`׻֭l"1GѰgn‰i!rQU0 UITr5]FzMÿh424mքg2qZaF@_TTǽVo͛v2ڒơ䜢~ih&L"L``BHOM?!Lx1 tfacKN|eB䖾Tа-@é'y}Ыa@3B2%,0(fȥFjܛÇ4dFWPlFAt ?HOOa% 8<7o^'$$'N0<PY٢EңW7._y X]JZ~˚UkJ%t2$I)4\JU I*l 6^۸~:QM?YW._lnʄjԬ^] 1CG۫{vȂ0M:`+,j ftpevN 7ԬU]?fЁ|}u4lPTUeul` cع%AUbwΙOyo 9Ƹ&.S'NgAܸ~~/+A+V/zj.VR?@ TUeͪlڸI3ax̊`L8߀EY`B}7 ouxD7nF( v{ ֭嫖Rn<ԼZ˶jm$Q8ǎQTdɌR"B"ͣ m}6999defңgw~ؾ^|S'O^@QUv^ͣg'J^/Í7jW4nҸThH'C"EU }(Žn1菸HU-+~>‡(~&Ofxޣ$^HLzz:Bخe{hΓhwe1>,\Au2p>+QMsԪAs<w8=UB\x{C9 PΣe߾?k2񟍛, EDVLIʗ_AQ]<̈́"FETRkWi=!!dg:?{.DzM_m#x~ xeTUa/ٸa#)i~CutNE0.&^"#=[O8m4jAxD:aش黯3!:-9n*>+ Ik[/DߴO/= B9z/\K4mބ?]M]I]kXGPP]vfD;%ʯ" DRb p|~eoEtZ\r2Nz*իWh:fQ(!A|r ي^N,.:鹀bvi1>4֊A1.*tۛQlۺ.иIB(,B(= SfLM3̜:qڵks`!jթ Vlu ֢ +)+]Ų^Mk ]cxRfF! #2*CGo@_TUžaȡ,]R%˵Foo""ٽGNW N8,C˯FoojԬCѱKcZp%hG0w8|)'C(maaFkWx_<B(K8/8>55| wn϶-HNNCILdHz*B\x'Ozuhp"|2KQf':^EOoWԒ4¹ |vvBQO`C TSUn}Ӻ+W|NfV&B1sN*Xz>¿fɂeܼyEW g1 Yٙp+) ]}YFQYbPQ822 x{{>@vv6mpAO0w<:viF CղqDnaOq[(f4]#ˆlQi~ck|4k 0ٳg d2S4tљ:{qvfV&OWFkIA%ٓ!HJLAtA߼q UUR ?⏗ҹ{'B_30 L:-׮^c;u6:p #0q&OnvkTc`sϳ֕٥+h< N_e'ڵnm?n^1=XC۬{3 P5>6Y?q:/u.2VVZ,k///7dOpף(BuE)p}F1nDzvdeJ9ֺ-Y2z<~^IJbI),7?xzzR%b+B9:X0m n%Sf7hAVf/ݦOn٢nj%'/OΟ@6BC#7,{]Z\~; :fuyfƅjv<@$>ugaX2RR-?@VrȻNq F#k=dee1 dgߵf4_3UfΦZpu.&^vo>'a#wC8HP]u!vRkֶ[GodhMxxxyFٓ!HJmL|هы];rqj\Zb6%Fhu:nt2$IŴqslGvw۱v k؅ Sت@> - u)!vRk=v]',e3Ҹ~ A!UA `jEp!HJ(Rb0 ;c -2ڕu2-)Z|ԺTZ(Nc$^7yYk~jUk)% DRb AUclQN5ԡ|ƶZaHKZ~8xPUNrjAQz-z:._:dH$cRvň1xz1Rboud+diP|ԺZ(=xnÔɜ"t׋ɐT lIS][z' ؿ^ UT%8 T|}JEFfZRk!vi]Y!SiP? VǨRݿV-G: Ay8GOͫNgnڶj'rŒP:ye2m!7IdeZZ\'t؝/,JܝNД6%A ૌH݇}H݇,=uH %Dr?TrCED"H$Dz1-X|IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_tx.png0000664000175000017500000140436113203343610023031 0ustar jomajomaPNG  IHDRኻsBIT|dtEXtSoftwaregnome-screenshot> IDATxwU۶nz6@ "Tt"CtA4"`Cj !H#lfn9?۶d [fΜ9l4EfLz_!B!#,T良sD)j.-Nv~^^m9'еrQܷKujݛ~[ݖz'k|w'H{q=ՍgJ{.MN'v_Ntks$:?R_vLu1KG뮤}xOĻJmTz]Jsw_>;Fbݔ~@wȽOSu|>I>_nYwWuvQN;ir 52cTוK!B!B DyymB!Bq@e3"B!B1}!B!BPmm2A!B!=ݴ2B!B!:F)8h`;4E L)?t6=}R BѴ|W,ХsB!Bhq۱#888Zc(ae(eU p؝Hg"cMCaY&0hZ{bWZ !B!Sm;aB^Q]]ݕl۶M6z,+:rb#vP0Dqq1';+jjjY~=[nm3dv$BK0ȩZRlf̦z>Vŋ<w5cTս%EB-48шayd %ր χ2.B!&xplB0fΤ vmlj`i`UU55ophc_Ѵ0i0} 㴝Nenyg>tp^;Kq8hA0o"h0-#2{t{&POM"EQgIY+nb^E.D'7ÏQl~K{p B!B/bۄ<㎛i)¡0v3]g`G4*;`X!7OX19H_v<H8BaPK7~K.o< ұF́x? pcCW@WۉKqFP`հl 1t8AüY4P;M\|x6P؄3ڲB!B!tZkC(d#xLm<lj?"0aзoo֭ۀ0P !#g:N4(*O0hM(iɉ4i }-X9Ӵ:|=Uѩ M41ǓAA,bij i ɴ0: J^¡+@7HmȤ 4vs#M <*&v2xnѝ8cJ, C'"mB!B_'BII1~f]/4P"R KٵebǦo9H$g>p8OSYD"N,ʤn"\S@ES0c 3$T71)a7Sljx}wv{lMmZyL>"N99& 7P]8^E82s'qĘdy \q۳q|p;FF^LFfV= +cKo""dp U X3rOd (N̄2kZab>;~,)B!MZ;~hnnƶz.wMCǡ;7hi:{Vۄa^I1;";@'`goʉSfx;NH?zLzf<ε{hM`SS|=Lwyys!1MSh ߽GkdY#H{]%!thyRT{2k쭗XXiYƦU0lT{N3Q=^Ù3eҩdҩo׿YXkh\eB!BNpLB z e}!3#q@dff RhnnNIeۑox: ǶW8Mh`\<~~L[|cp/l劓`éI |IlioMӲ~'4ΰ;N$+vMǛG,aӧKp^?9>M|aPU^;Y`&21"g 0Eи5f߸bw2JrW<_kkN㠻 B!B0J)}wa~ߌp<H f$?tfp<bdv?'0֩"RWȘRp,pc;X%e+hȲ4e,KreK1cۑXxL4EL>Wyj*'8®&rKGFqB Nmd- 4aN]ӉԨdM!B!m0 30 0 _鐼[RI4`P[[KGc='<رt u,0Lַ0tp(u^Se8_'Ɲ{+Fd1*'傡:[q'g. y  <ѝ.Kd׳/~WB!B!(eQYma8*`ۉeYTTT1- VFt/jڑHt,˃ ;tl*HF ˏP]ώb#:`zy2דw# osNC&sw&ЀlYWM3{ie73/O{U{ۗsoi&&qЀgЙ{ljd[.z`VBa¶0 ߃Tm|nj  k4 ô`8Bؘ}xUJCNl3U0ѩoѦL S;47j3Vf xB!Bњ2LHq6lp|Cbk50pl0-^P8& hСCPش ѵe(Њ 6  󫾍p|Ͷ:ٴ2Q±vwB ^'L0 |zGPx~6>S&فSoSzw%;;9M?+)B!B!b4@$`BY"222IiKzv(4 ^Ji4e YvEآmh:vfm8Cy"|?}681bJ)0L5[fmdeeG)ZZZhoϏ뉏fpGGزe+9dfez*M(:>o,`ʛ'lUcrfYa z`}ü5MB0{Ӧ'B!B!ėC4p <Yav܍DS0Ldfd 3smǩvj1<4oMa)32318?;be{X1Dph0,<,Ƕ LfL-k?mDhlіL B!KG 6M+:P#"e]VwX @;i.nv:f5i(Hޏ#EFfb |B!BkG";@삓B!B!k҄B!B!D7B!B!Q2A!B!=JF>!B!G!B!B( >!B!GIA!B!=JB!B!Q|B!B!DOv?WI;!B!/G`xp-_gߩ,7<3YghߝB!Bτ/+'%; J6PZn"ծ1r٧rɷ4MXs4=W#=e[0_iRe.{Fy)=vn<:O﹂?n< =6~ul[?ljt~wB!B! ]>5neFƆ _ }Mrl+{/UF$1=RC>ZḙFL'{ww&6{B!B/}>4~,w>`£/+yq #´yUǙq5;àfz47<0"{czL~^Ype`ʠ2 UV$}O7ee`&~:f's.8\uf Bn`ߟ;EËʘ"wkXJv}.Ap7NaTpN>[8?9 >S<ԧg~YiB!B/}^!s7?㚫E=3TX{91d+I^đݼ՛&4PKcpCe3jH,[^8Wr0_"-% ;+J2pUr`?o*{(G_S=22(<RٺOulM ,+~۹ SY7+#'`KL ELˆڷ_u_Dy8n޻5h ^ L+3RX}S:l(Sx?{`?q?f NZB!Bfߧ],+ҧ]{"WPpϹ' jiɦ_ nB;Q!uq:*G^9xhES c&8C4#yϾΡ߻#X>ȋk '>[z├ljwiIu@!B!H';AkQ4ѳ<Ǝغ Vv..ᴾ8洩{`;cNQDֳh[ORx{ 6@6Gth*k)b UWꆴ{n߸73L.9{;7A~\i (X4袤.̴YB!Bݍ@ø%7e$'kl-;VusOiT*)4eykt<-~*rnj"f>`8pȀ\vU!ۂU$]CӸu6#m"@=^_O3ϞU)WτrvӽN0w7|?kwek>~V}ww=ͲB!BͫB!Bq:eB!B!zB!Bѣ:_DZk%²,s/0TZkZZiii(_=գYUUi +OkR u ۓ~߮r 65WRU^477Wo! 'ʼnĻuʯ/<-Fht,B ʝ477 H=mϾS!B!D׵ >D{Lx=a IezTIol4cVn)chVb豭kɍx j,vCSG1m )Yu vZŞ=qJBvU'ROStG=B!Bt]ݕŰ#9S%uTA,URUUIaaセ^8$*6-8@jʥqk/3ϋ?D"^"pݭc-{؏D]_ qH$o(p, viI=z*B!Vݻ=v\^ObOJuH$ܥ&n^"82b>v]TzH42@6p:M:ցM8S. ^\Dɀtt*Z锺)}T!BuvROJ[Yn~&F88$~vCB;gɽ͉<$tk6+Ǥ4h4~ۆNWb@"Hqpry4›pPѿ_jݗzھS!B!D׵ >8Ξ4' '3o"|5. TKf@&x!\os'uռe5g;YG?O z%j޾ ^ky)dӶhC(qVQhtm88ZO6jڞbWq _9?'IJ M,{ܲ7_R(~0+YfG\89*F'p IDATo!>]!<"N$k7" beRXRAGǧ%,ZFGr#ɷkQ W4ePN`I* U_X ^Oywk~6Ek7؟ٗfo~iž 'K=B!BtF6l q%W(gHA eXm-f[C  #1b8rb=#F0zJA?ᓷN IFDnCuutӯXv]iKtQ6;[>32\y&j"ݸsgw7K4: ayMlOь76<MF1fF + #1b<˲#RGٺ5t|lx=캽i:6@k/'hWݹ}1Vhkr3,׌/.8k鐌6gQ4'z67{+қp@wgdEEp3.y<~_v;'sm1+Κd}Z&:WNI&Vnm-qLWbG>_ M mGEmM~vxMC{cSۉ9G#V2Kj\o/ ]!zIIi8GE/4)e];#n0vݬ)pec5|/U9Oi !B!iw~Nl&P2q#e }Fl > XEL?ჷjsYٌػ裏 ٹs'`Gyk{^Mz:vnbzbnNyTb݉Aͬja%TPK*h޽ma0O/@V=}+7p7p}n=6Nm\nh(fʔA־ƽwf9Gg0<x0/=n,a#8rD יېN/5Nl]}6zܸnR?Z{?B+'Pxr x;#V@; xwZǓVE[3|v#=f.v@hB{2VOB!{46F>8iX?HOUG_[??bWs >YàbrOad#/WizbXѪNtN11}NhRn@cx|/\Cݙ: !B!4M,6 > u.k{g|&rogٛXyo?[9 $C;)r?%A=J}wCiohx3ӧ5e|p&nr.< 36:M5?bko*l 7:Ǹ)I.Vwo0E8-Tl;{Uq :z^|-3dh'z)tJ60Sg5(+r>ZX$B.(ʼnЍ,.7.eݰ"y/ Cb,_MY\ԗfѷ:O=dm &m!q E}N{ u; Tgھz*B!͑l'+c،3\NvnyMȓGv@w[!ldSUpmayQL>a,c!u1 jAh[:@64 զP8Nɽ ٵ֟Oaთo~|^[1q;ChqL@Qg]7J ?Mp;[ग़W'GzB\CSis:A8C''9k I֏Q& +#o qi==~ eb6^]Hc]2sдԼ o#3>ͼw&~FJ,©P"HjIA,8Ih]v",lcRlDaB!k.mʝXCH;/y%{V 0xhM^Ío"9mv=8KA8$c949bLnݛߊjN v4Fl /MSz1/,:wߺBN|&im\v$X%",c t^]3b:((-eapn*jOgv.;aky>{G|9ki Hro:1r@FDJrP;e 4~'nѢfFv6 |[‰8H|K=B!BtiYԶbc{3ah6M7lAL;J7֋w,# #oMdOԟ\ynks cpNYИ9J9DpZчvlX@N6 .vch&9?&G L3cP =l?h3GROs7lF u VB[!BMkyŴdƷOcaVl~)ޭ)`grPo5KXZVIeCs׏ߧ&_b$|H4OZ9QZGhp >2ȲJmAEʔ)j3^5T6?0&Ѐ̄^лYHt#qr"Rd4v}@>x6_KQ^l&O8T'n=N%R;#Z}~?+/eӸnB!Bﶵۅ ::݉:\%7>%Lb=,tR`!ƍxgRz*-;Ð!Cb:qqk: p-:p82 ֘V N4v{ubsU^[5uW"mFA$bzJS!B!DטzڅiZ466{LS*J6H=[ymc[F] !KLHot=>Rk{h3OψYw/H?;|h>OZ0}(7hPzT!B5f[]+.aL>dZkXo4v½O M|UJEQmyNHbm|#HWgo򗔖ur^?xݏuش>f_B!kLIJ҂J{Y;9yyG"7v'H?4kB@$b6:VIz=d`gx=xFS,MXH$X˲hjj&##Jb[:_k}{jtv] wz[m{;U+0U5u'a ,xuL|^A%CZ5|upnC]uxTI;Slz[)wNDkIt妘pzF,QB~-M$\#B!k4Læukyw475sR S2p`V}Yr96hm$*6kȵkowofȓ؋Ƭah`&.d99y(D‘xߍ)(hcwaD<{"_Iϒk|PIǶ 0RI0@@r2JUVLYaypQ%imHn^^<_OB!]cZViJIil|ø&JL/IIk\}F%}ۘ!XLKmȦ保k*@4Љ$Ohhnn`ŲvI#O {f󦍔mHQ22{i":3 I=&>$?k ڡ_LJ2 ز m zߗzT!B5m :2'|7D)C]I٦uDRi~K4@l^~RGwH=!%B!Hhsg22)(՛^?0 !B!>B!B!.B!BѓKB!B!%k>4Uٺ- 33_PYgG!B!Tng9Q]UɆ7a"0 -(qdO&?iKJ!B!=4-jS$lݼq&Rث7Zkv38WoƎ;M$ B!>4QQQNKKqI* `9h8YgE!B!TL3i͇:oƀ0 oSl~]m 7oB)us{b˖2A)ҹS0B!B?VȇrHNn;4ea&J)=nY;Q@{B!Bϡ贋V ٹD"wX6 B_{n[/BB!BML+iPD_9qt8xClZ1( Rߨ.SB!B4M6x|GDt͏5<3†&y~z745-B!b1M+$ <{m=;ꞻff~8%c/Sp %4}'|ZA Qzʅ\x |aX+8f{ ؏u1M!B!ҷԚY+w$/:'@/!95W3ߚō7ūc&]~ylyԱ?`yĘ.ڣ揹2w j{Մ0(:tl9C20\Y =hm+gӎ&< *o97=el4Æ |i5}zz<ϹsELb l?ݵzk-_u͌]_Ɖ\n_ٺz (l ~cCɳcN+΄97+d!)6mA[qf~o8NCgP0u8:/YɊbMxg(~/;\3DME% moj:٥Oy] 9jY[B!Bϕش;ˠ hZ]3fr"i'u۟˟OW[Gsm9d$}=^H]w FkE e~²+iZYKy=_^n*vn'ۺ#!$h׾#O*v12 72zsٳ1[(NG|mP5 3ZZʟO [;:gJ:dgF#x5<(5abcϲxg|ZFGKJW8@g_cS'>=̘z$c}N /S!B!D1M+u t|p{Njye^[&^-f8d TBA@v jz*c)] S*on׷ Ϟs'봩4J̓t IDAT<?>v07ދl`Gk7هC<1jegtҝy"$PEU_}_|Ut_W yN'=3iz?j}!tnkUZ{U=z)du/>O @Vx|vZOiο7%!H$D"H$4|Co`lxKx-34 kǹ3}O:UOx7[,N5ObLr%Ϣr t \vF`|U|kS;2 >_V F ,.XnI@dUɾwox|^oeyuy՟bz#e1ӧp;mo_eWuA1yyO!쾋ܹ [t_M~ZsPMlS&0gsa@2^DZ.[dwi;Wx}w +Kils`-Oshy~L$D"H$C> N;/fy޳xʯ'W]ͧ­sP=u<7~7-53/ѓfҮ>K'nsk! 6?_5_?<]꼪'1%/}>7\ϱuXSFăUs}[ϋ_v kض*a!4җ<͖nyit\@J! t {xr߾|y 7=ѓ_x ;DjQ"H$D"H$C|՞:GTd'򂷼r$D"H$D~0\pp,@ ćGuT!H$D"H$ |8| hģ@Wh#H$D"H$9Ҳc"A"H$D"H$.nR:cB|x:u$D"H$ď49b>$D"H$D⨰Z|c/X1hL$D"H$Cϊ -7}(0w.BaADWxH$D"H$J֌Op򩧱vzFćG~- Y5~"!{7~>k?<%D"H$D"(+>u Yn="H@.Ju9DZ;H$D"H$d*w/\\\`{z,.s-PJ#zدu9xIsN<$@$D"H$1s+pr{|ILNMC##(ffw݋b Մ{$Ƭ?)/BlJI{H$D"H$.¹aeb'BV3 u/i~h ?PV G$F$D"H$DQa" WyRB@XmKR J̦q~fUG{Bb$D"H$1v!GϦ +'%yʁ,"TYGڦ%hG5hR"H$D"H$->rvy J{>{x/x k>\iW_0}~٢E.[h+⶞G8o~?G,2PjD"H$D"qrpp/?˗s4X{cyϾ\?,s,^i4 +~Mesv_oW4֟i'OC{专6P9'?9t-r?^˖0WsࢧZ$}ן-}'3^_WL>l t =5xb-hJ9Gbɧ1ɖ;:o^zx哾۾r<->豞glae@pX@җxL\/45x7nCw||p=Xt^xz̨n,<^FEqY}n|X;wSgL:mV|_myUݺSyރ@$?$D"H$ı̃@'׿??,g/:ey'wR0_ṧ\Π-z [l5\oW`_T6ݗŪ:G1l_~^ϛ_2uz/qzyn&'^|^qJbGw~Vv,V9'0ǝ<_Ӣ}?7ص0}<_OG}oJP-NyWI;yow3Sm Ž WӞK^ؘLJ{=8+^8^&H$D"H$"g/nBS.dˎYӂj"^ș;ߺ_p6cGx: A=|W=_Vg^N<75V~NuC_FvOEgxշǞobǢcݙpR1m_,9Gl-{o]p9\p K? ysRا\s:="Μns7}e7lS.2ΜP~!>7r6SE/䮏ݼs.Iͦ SqN$D"H$ı묭レ_{x=XsϿtzq=qsgᆏp׹ۨ39voAYoWy$_l/'m䩯ϼ/.{9s7~ 7;WC|ʦg.7{׾yO#u=ҫWWllWM'x^ǯ>. _y@3q^o=dnD"H$D" b>gsN~tn׾'UMW#su|r!1ʁY)Bn{'sWՋO3]wh";p~y|~KCkzװPѫF2 4 ;XkN˷_߾_ήA|흰_O6[+:̵5'?\q 3pK_k~"An($D"H$Dw%> f7_-n"O{O >»3O5?={_zb(7`n';m|c7_}<2&t ɚ1+_".SӜ YY14鄑pHɞEkXV_x?akOyKyw+tDȴ,&8y⹧5-F oэK~?}çy }p b>$D"H$1a/!翁DI/k@|knX{i<'o7:EM|ﶝtiJΆS;|oo'0Emy/W?_H3qƯ>-;@i!4H$D"H$:C8QB=S/3w._x\/q|b'S oIϻk^>AA ^y>g9iN^̫iW"C!^c:|{B8.v>ead:χr'7A&N/{9Mxsĭ̖\s{?u[ZY'a3+=V{ ').|! >5nٮ9ҕg+<+~E7&NW)d"H$D"Hۨ}+u&ؓE7\m<1{C0`M~ʟ*cꚷb,xs + DO<C`ϗ\u7OK'd*,c;9 vQD"H$D"q'^g>| x~G0!⒌UQ"H$D"H$~TxP]s$Ѫ?(?y1D"H$D"xP1<f0?A5ǑN{h *#vJ>e&D"H$DQ\|W?eJHQ֠R,_6I/8`Q}hR%D"H$Da@H|35YGI|H$D"H$#A|8!iiJ"H$D"H G/ ḣ#I?G6f"H$D"H$ '>pM{(>?\O"$D"H$D0PZ3>>ɧڵ+gaeH+h#H$D"H$#B{y~-p]^vvXz'D"H$D˚5@9rx8I$G0ORzn' H"qK.+Bx+q؏_R!h@&(1ֈJ[PQh (lF(QZPJ hb lu/ 2ރh3ĕB&((tNֆ6{!J0*ֳ^RQhVB!h,Zghh4}DuXƁA1) eA+ XoiUPh| :Z P} w# +Dk3DD$xњ EPf@-J% BQ(B JI7uNR(a2|>B@%>GEUSĶV*Zv={@̚VAba^)HlSk-q<c!0jnwby-"b5^?Sy!jXA[5V԰`&hd9,tbyh$pBp+y]re$cwڟSTCkRcl48nGc$Z'NQBhY@J-ZΡ1ͱ޽teaaS6M3l\x5;;F,vAYn6oi5f&ib bཫW+,W+X ev.eECs57rf` /4{:8{U1G80[Úx\ʣf3GkCsdE Ja.3T0 Ś&Fǹ &+XM,**|y8SKTp` ΃TxpUE=A4(ÛhU4K.>T^t%h )qA,~ф*J^e#0l Ģ"5˽e(祿bN94vͮ{we v 'lEO|+lk [gCˍ7|_VWoo^v\s|)Ab!Hu=(V@vJ c-JKHp(F)A~`԰/y*#_qdVwEpy`ZixQ-4yZe(UGpw*gq ` IDAT&>*PQJJ_.w0&$F}8(WKF=x JP(ȓ2AG%(STpp,PT$ Lfp JPpJ,:  :LOP{.-aDYNQx 2@!8Cfʀ Q2+x5@kV42x`\NPaë(4,lE''#*45hQx`PTUʔEa)}PBh`us`+CU]]G٢eWQxlsSG\VX**93+j8_*7k{9"pm-8 [h8H~Ɏ{$8JH$m*ׯhdeJfhiXφٶc'캇[J1,v%~ ;-nu f&9Xɕpdz~ XX UUe*/Nex@X!q)dEmwnc~oB`f$"c4ML#dYr۳woI5 ˝>ezbm,xEEFZ@n4k'wC[QVXF1JQ;4yahwJ\(86(3S,GDxAR{_DSq1:خSF_FsQ9=Gy ƒZ!?",55%rpEԪ{Z FEfqb`k/Z^cM42mP67g| KHUw}F "d6 yQ@U3!(ET[&qyF(7.Ap{dI}/\Q)g̦f2BsD<_z)MUijKV9AѴxѪ7%=@r$1My X#x, Mq^J)QMσv?®mDkUUD !!-= br0 @=U 3Do ,> Qc >_ln1@W-FfA<ѫK46Ae23P xyh'u"zhX2|SPOiPƠB'{F0`+T^;G4YKnm YԪ1bZc*#H[.NEU^CnV=*GAk"aiibaYiڂ]23>Śuho 3lghk;Q5fYuʰnv& v'1V42 9e*?X,_Vz(= ! = D+ZiչPAgRzeGՅm4Lv;_ ֭r?.w>xZU^/C$Zy 5HeQ [Kf5D)@zr&xȭafj={Xhb&Y\5!`nAZ)V͡ms)q֭m"3*];+^I]5>f0HYʪ!k-e/8p[QsÙI5/-@A!qQ1JG)|Y]ɬ"ny"CϖA>,N ^l6)=YŶv(Zv{C^ F)*ξ7 "| 1йDCPSD6q׶hm1J8~F$xiͱkL,r܆)&&A߹yk׶i "ȋ²pνLat.6'}{;LaTkbw3Z=y m@葠њVVW\zw2u[d0RæpneKQ8ߩ (˨>zW]tWq JT)jg,3"gz 6'? c +H$fh'2wF 416oZy^ͱ.K =:vϳ}fۈѝxy15)]ܽ:.1E.un֯fxM p{}.6mZGa}Bsq}|[+8#9YԙS4OE:l߹VѢDBFc4ѩqc5vcaacEnhX5ZѸ݋VTi1Q^h+KH`,EtnYZ` Zb qi)I,Ƭ7UIHB':Xe8N`e02fvh߯aէUJR{Kz }fߴgư'4 7,@ݿ@׾ bg9dy* jL,Ř[Glqf]^mw&?(8C(2RttPL07Za3+adL4v}9`r2mקR  JkP!a9ظy T-0DCi<&ఙdRg/`IEnBN4uWOfU@$NJ*8O'"ܲ&/8&ǚTRI yQVtYZXkPbPGa( ( ( .Jb .F@>FPiErUE5UŘ:7_ ~(}ƪ(Ń֘GJ`rM%C&!b5XͨF+΢g qA2"ڠK9(Nl\zeo 7`RYNpd:hC &(DNfdY_63oュWrK86xACe:iJEC?Xޢt- 0*!fgݥXFSiw{cif K@h ̌dFkC,eЪAșhXX\BFA4nU^}ʰyMF`-NbPTO0QydD"œ>Uc%+8!WeQ2:zU貏Yuש kq=uE FK ?K4TcT Y1*}_2NC@X`um,hQ4m 1*!Y\o,pJQ<`-t>A|&uM2c YSQcLE;V#^4ȬB0b x,&(n4 U01(8sylX; *sd:Wf참8OTTUǹ6a9a86vh1Q4()peޡ )!gz&0g8 ~L R=XPY#k>`qhh%xbТ1#!>cXx :Գ"B1D*c >dYQMA)\[Q! Ca Ϩcul<<*.1w>~C}.ǹ Q e&G|ZJ2 :e"{w;fw=@l kȀւH|DmMD$3&>Fa|ΥPh`@}vX LN2|_Gg~w3f|3F2oќ_^Oň:;]]ȶĮn[>8k7\]!0O,PijJ9۰9<;~e4,+...@;]8:p #f2A1hf60in;xŝ*眜.LG&QU D!mKRXiES{&UEk65f6wHRΣ|Ncش[zeLO]{DL RREkJsr&>w!`(xMj:[MfI|qnTy뵿1~FW "3>J_6!7Z4/+rvE^T"[ u,d9 i*zCImSYYzmY!)5`u-k!!s!&kM"(d06D)Pɒb$2-ҜLCWR>61BKB!(2iFJJW% lD.ݚ[H卆ڏ JF)-6 Ր2CTSVKؑUA' f7lI)J:F1:^cPw wMo+'qzAK aɽy>?|ER VJh3\֬nd[IY:BT.* XuL$. FIM L$Ag6TR񞫗KA8?Hd4)b $,ucDB& @_,g<r0PԨfM\sP؃'G,//9z./ɄmJv]/e+lf[C;5&!gLLdzBČԴcDa~Mrs>:݃=?~̇~xM U"T@jg}-%k$*9w`:ж-U]Ѷ(T7.o!.N #VwJ;ȼ_p' #_\?%&P2AQBՠ(cCMioYkP_cÙo7.)1=Y Ӝ_k/.Xu=W(5ZXXJፂYA<~/ny#~#R*824˫%>3%O_Ejqx3޾m4]e6't]뎳W/q٤a4 C0RkNkήTӆHʒ*xsy8BYI#I3aZs0*Zv%Ȥip={5g%L@u RGhUѵ(&ԴG oA玷T9 B . ZQf,ӸovdhxSrq:KMrsy;Ac|~7~~;__jFo_F0|v$&%Yġ%KX/2v҅CQP$B6(xe7XJ- NquSї"*a|qE?R'75B*{;kklJ: BIn$9M0+?}oz}+PƂi4pyvuAc 䀷҄t9.j%ct%gfQ J1cWxo#E}-ѤJ$f<KRh XbF"f%いRr(C56r(I$s>OxO?z#Nɓ<~)J̦RGW|z!s8BKԥΨg{*e(q @MLi3f&%"5ys*cʋTrԶSe^As~ t@g|%k0 {IG\T_,آso¯a|cQ5ՊoF&7%̅\uW]_''݊yi>CJH fji&3 qVD^jc`۵&vc`w0\#jE 5OnTnhݰvV{/ԬV}<.۷f,Iž!kBSkUqPϹls;oh0ʒF:KdƢWk1o,%CsR*϶7QSQ:rd'1Rj>XLn={v\Ǵѣ\/"EpV\ ðZ*}%y$ '|rɎ›-QZ;>KAmݥ<~_hh^ (uՎ?y򫏤;ijw+u]2V -IIrTǮ\~3Qt|zW Z4{;'Ghq#,pH /ZV̧' |- iSq fbB){wh*͓^y \my|y-TI0@Q̧jpiC _:6Ї2OjfB.엟8לE !FfRUj_=L&6ME Wz3OÀtjaG *_C=^[ h5WKB,$]U!o; ijf҈W=S&kM2UES2$JEA3z "nݫwzL /z8k5n=wS\3&d~+6M2-W7y0>^ڍ(׸nط77utUQnb!hVQtAh59KP7 %D]Z$ D1E ӋB1$ QtJCZK S2X*_P< ZUUANY*wvJi?s>c,c*oe۶]+ټ# jDˏ?y*`m0lƣ]^^; {iYo3YxqTw#0U%`khB UrLt||k E_AJw駟RyP\Qn,/Z0o?!׫R% eOF=.uDTفz{n^$̉JʚPO$IL*&wi۞Z3=~ᗟxf3zۿ>$ |֫ 9f~_~>ֆŬb2m|K.|W~s{|.h6R{t:eY=[s]\17]2!9h~Xs| 5M˫W! -bR+lvR7  I|6emicR9)HGWpar XB>ר,"b؞_.mv7k=/}yſq/&7kW这Y:rx:q}|X׏6f|`%P,Up`tBj=)`e0ZQ8y\H!S*M8I5*pX1%# !'ј'okTޝa?q=:iBL&86dhhSj,W?'>d6DQ}+O4p`MżTDR촧zqـc#Ry;kE+f)Jy+rXP0k=L d14EK JKJ 8dZ b6ց4!H )Pi(dEf u c%9sb~ъ=)6lg>8QrmGb +j/M1h>Y- $=wqސǃD;vCMDAI$ 1bsSg1*)Tr拦RP04JqqxyŐ])yPcCu+ ^8 u7'-)o?ǃ_SqZ]oYf$ L"%C*Bk512$늺JyqV@% |S1vd%\ \2?Xpbr.ЕCLep\qt0U$tsDm,)&v`"SjGJI C!{b t F@tH*z2[pf>Y89<ôơx( d|qliӰj[~WRlC5ńɤ7 9=~gϞ1p9HK\4_cgν$ETUC#j\Gi@..(5rI#CXw-e麖\ L1=ha5cz)x C1;<_|/>CiVT&gzR2LIZbNV8-gVX4(؆"C`ܠ_|$ f"q3FR5b4BK2WA+U\n^jJNf5/bg }sԾۂ-8F-v':!^$fvfk2 NjQ5BUHZOmm8@wFusni4cRa!RQ$-w~.тc|\g[}◬D1y̒&PyO۷(;|cbYd+{94 #{ g!t)/xkېlaW:c9(vhyL>ViWWLb9;;mGQBQdc+0Ȅ?> ?'BߡZTdrm"w,ng22>rHcW$[aT۩},ґݱLs+ `0c;|q鱓w\*J)$09RHQĔTjD֫w@v0q+Ԩһ!.Q(Ńt#ݧJ®("ܹZh&^ʑLSC?a4ދ^Z}3\#P `Sc򞺙p=j?jCO:rגc&L,zˎ.%m:ecLs&c_դ F)(H"!UDqف mZ`Aj/o_ !0B,n5ݭrӻ'|g\n˘ fGWAk %S*19S&Mæ? .]{5Y2FX}֍b&,IJPZ(ʟ=}) Bb2c"Nް BKlڡZ$_(/\y8Abjr9#O>y6٨嵲mH&AhBdr@PVN:E"$X% u͡FsKѻ\mR c K. Gs?|:cv7hXK))ہWƢzաvG}ҵÌ0bDd&rsE.{ig,Yy Y~4/( 0R*c&Šn,/ x_ s;W@]9 ]#SƥMEw^%jf"X7kż*f6Ҍ(_\Xr IDATUT7qS!$*gQ@]bb]9 }0t4Ö64o?m ŁbK<{@S;@3#3yC4S.׼bhq€3~D<`Y^3=W_wq%Ջlbg@&vGr|8€s>{qwy|_czw 1I޽"SXsrjrŽ{wP%`5ׁϗ+/

Z$e&mGEB0#A^&Cc?$7kߔUL _j5m0FW8J]y,L]ýk6e؁*фܘBJQ2KJև!p"VR|2~m|=С#W!ZhhUnFrbXs UT!-^wKTQ'y@SǹFJex;6*me +F%eP9DInGH J" q$bˉ5:\1<9d1DZ7'xVS@=p0d :-Y]]-WR&br9z׊_Uրi$SiB:lNN2N΢'{o=Az~w=!ffmB2B@aF/C ICA[H NM 9s?+T~"^;YIl(dJkZLVh))mwvx/^O8\ѷkЊ<,0daKv[ g4s8[0#Jc|=x$Q3'o/tOy,JQ^A!;eCy%'rQ %09vK΅I]Bm2Z-bsbu,fb 䨨cE;\.7P k~dPH@Fݭk(xB+w°ϞBr'#CJL)&!,6sfF!f:bh aCK_HqˤP,\~6zl-u/>`6}M?W?f%yg5% #ݴ(e:]f_|Fgxudbvɢ;s2F)6p~d mXo;k7JvJC;)EM, JڬXLgĔ9[9ObX֬]T=w 1^gb'B$^W_I#rKxS+o0,[) 1q ٽ^<Λ\5ȗ=oazSq:  QI0ڳzt)TKV.bt!Ja$TJ=X Qh&(`Sҧ C,Bq )lkӀjA0uԊ%QԶvEA5 8[C-H#)&*b(8cgT*S x ʐh\mN8\ [7X%klm5:a4VHU@94.Jg #9e HsRc_3MmPޱ:{qǠ4dՎ ê!$xp38%朌MZ, J\'2QWĆuݖ˖ ZOJL@%%RnbMAVR%o1&WEBT²QP椪i~_?MX6B YJnh&9r. CϷ? $0SwmbT :cgSwS QJ㽗0#4vdDyS _Y)eߵ#"b(ԻA *=+D?Z] j|oQfgy Tr#`8'ۥ7Lv13?Z]O?}ĜX6Ĝy%J)N̼-?ĄnQ {RMo6vm1NYDn88rޟvYVcCY0΃A=E#Jm~Nb lu0vv_5 u]@SĔB$]_L>ߌs(qX;{f6̈́*uI3{IqU-7n-zbWfxK"QR⠌w@|w^Vn))(5{p@ fM _š{zRn\,$ k=6qv~U;Dn ֑ISa4Z(E1b"^ޱ(ЖFλ+#d<|zTY⳰yTHP)rRF8m,))h*29DYXnzNΰ:1lHCB'f^!YYqP5)yb!O=d4t_fAmߓ2R3˕]Pْ'Q tPJ cڊ#Bʖ X%? (UeʱkIZiJQZq1?/Ra't;ى >4~6q?91뫬E|.b>ARmL&9d^t1,n~YNx3y|"ueJFiNtP8?}]?wķVKR9?]5 #W4 CZ2mk&m nRP2m+j}Q9D=jӳIu|JNLkbZSj3#sxZ(+kUFC!U2|Wy3 Ύb^@ s{~{{M-o~~'{W ļy^orov+{-b5-| !ZA#[]>en0&epF Mw6ҥC8 ^%,U1j~_!GPrOIGRg =̘"0ZLٷɟD  ]UR 1}+)LkLM=>hCfDG"Xة1b*#ʴtRlcaf|AYia";+ "ĖO >{0Ą@VL'TITkrHR*Y)u Ai&!D@FJl=[!Ty=:+,vO$ronWlVh[)YB `5>G@Ɨ^e٬;r8; X/N7K>k}S@}R$=r2*K<5D ,C$ieZ憁H'xJkb1E'I:ⓈI:2ZbYА~y)g\.oB@+ŬnYv[bN&T֚Ȕm#) ik2釲ER3knW+2ثb >`IQIwF24HBk9N&W: 1(a 9J>pj 1qi[&h,,)w,ɋ?k&l*H1EUFZ>S|5|6%eXo6M p)Rrx'3I% ${1DuN[톋+x$$0cnTTn)kRL&&)XkZ쳶}[kc1P;0|m5}>F1ȑ}34FaMOk~/-)z~!cz"e]mv m*a lDN 'wNQi.tdqu2"fi)1fk'Olks||W/@g>Z\u+ROFķ!N;i?h3#]c2RDwg6mMh@2fOFEPT1&*T$%j0h a YKN=j y睇TM-)yU٪h"`Q̕pq"ZGzwm'o)'v S\s$? z4 E#Cm#QH(_e$sM—%f>%tɹ&"?q ,adGyFg*gDTaGƉƎ60%bC(AT`Ihĭ6OG=I[|8cPadӑA [Lj2 V[m5'@Ί@MZ"9Ã55..tyg )k 9Dl]ǠAgV }`z(1M4N- 0H,] 4H:J%Θh]㋸d@,0_;>>`VUnK%JLsw!i"rA947Z 3*Bsy}-V5aհn%caM4ls)+A3h%{L}}1 'O`X7ttQ46?ZA}){yH6l7k5 TaA"pDCBY! BmMe˕M\]Pt-1֒CUrM R5va/QE'm|2r['J0C(s{j\>s'6v9 nͪ]yЏ?)pՌ9%P2.8}pFӶmJºm=΢u_(-c CۙO%9'F@3g1JGUS8'TahGUKkӴa=8-Y3wȃٜ_=k[B8# JMqi9#vU"R"=X&S6Uh*BRA:R'g3ꆵOlH{8/R,p eAËkm7a%r,f\̫4e1o@)>e fM<>eH R"g-sl;7{18 FL<> '9Y\b=A[b l[|t)r01;LD5G?1jь@^l[)P(,LD,6xI8Jz~7&f Vl8"0j7€iGmkLͶ#x ɰ'$@sB /_r!AR\]ݐv;6(jw%X~dȬ@lEWVoLꦨo3 ܬ1J2qޝ$^S -I{RcR4 RcnNU/9hUlК#Ʉf%Ka+pdD %e^c@c&xao$ǽ@]9 k ~QFѝeؔ@+[W6)B |dV8ǶےWGL.+_^owwV__!We~v5 J,_iښWa峯&)$2" )gVݽkMk&rcjZ昪Y0?Ӵ~-f,N8\,,6z7N##(Of\ @Xj!RLS1l[1S(d/b$1!vhfܢIuML9Geg[wWGĿKU[==lz 5n7Os'X]qqui+bqk]K/^qp0e:kX\]_9~ohq_8=9^SMg/OgPIOXmX+-_<{IҊdN6<:suoxZ'l )rI.:C"Gݮ9>:bq0zzhj%=-G"]hfsn7nkXZnZ|ZQvQEIv\=-Cr^5OO\{̝Tb#do @yɆ\謁o"'7S{.YHs1Ts҅io.H{qW^v%jg :m1kDz9?euvdX]I$Ť5'KFcCMttbȞd2J9T2آMTf̧5>\=~DYUԕj/c DZ>!W G-Cv!kpvF)4TՎ"W [+W QBOe3(e<v (`edsNÝ'Ga *%LD: OЋ;PC4 *~0iY1~A) ~PhblzI(XJ@{g(kPMP&Q  Q &)rIVɤe^bJ`-/ 9̑*ѹBjǼ|c ڬɣO.Z =133RPMݴ2'(w9?]@W,ycM{)l֛]Fj7{cQAT=f2=`~0A1iU/9')tHCUW(EgcJ֪ciQ(gJ9bd6Xcq mV˕2gJi2!1&)u]}`y]N˜2dzuzU3KGQ7Y1.YXeZbA.e5G30uM{Vf k2?y]a3dNy8yzIӣ._}2sd6c^cJt0 cli9^ӄÙ1x#xꆉ/Q4<8iׯKyԑZ4(N&l`k+%1K" %L0q&!x<8 /98a՚sz|Bjd2Ag5Ze+SXc99:]DDwlFΙcZg5b!}Yy0IOud4 9H% "XAsvS~1{Cwmo#%I@*Խ>zޟ3y{ oeM Kf9>k{*&n46fRܢCJQFcK@9ƍ6϶d]&kEGqz jb:mG!f<ӟJ<-M#Haskg$EXʄ<T[N>$qvsNǧlkKjB1%Ye\Q9E]˛0hOk4-m]K c)E1fcrHGgK"CXZr fK⇄Z"Y `M,ާdPZGH.Ii?P[1jGvAy냁J[8Zg!чhbOrs; 71e Cnؕ=N |bŸ;2!zLJT֕u+n f)%9bLdI!&Bg qrO-FgBSrjKL ,5Ө=01 vCJi|Y(D \&"Σy_>Q{y|_og[)R v4*U)6xxd!Uٜh؏G?XVc_)YL `! ݑLZ]G<" ?twc,fcl`ڴt}/0/IJa#m*z-ś5A)4~lN`)䌦=a23WR5NK*68AUYV_3;Ǹc>î&Pʂ+D9#!٬YWd)(E۴;ŀ/Fc4f\6%M!95xhQZ5[oa ߡca[]ub:-3L^GPwVx~u3g 6[\_]=n7XXL9UXX.ԛ˛5pS~yejٱEQ2'G8gbϼZo9]k .!3iki%w\\~h# <|Grc!+ZJKP( !HI\5e%oc1_̎@Y|T(%C{TkIܓ%FDno{"-^%&M,8 ]Y\@툎\PZgpmI*:C!,୔ig09A-ˍgo)o[tFIĔڠRBYC !g8*Ŗ;d!чH͆>0FCR&.HƊ#AG !Ц"&lUB$DJq:SiI&qKZ5* _q@=m05(S SFnvo,rb=#^vXckNhdI>`Wh{13zfEQV |$uYYN&]b" 9%Q$$tY;$fB ޗ*͐CXR!HYxGeo 1WG+d*4/e !V  }o YoiI$q{SBމ3B&Q]=fCTy'E캽l~wɨ30N麎 1;Ɖg txf R~݋rWD7\n._XkvhHSimWSiY/^5VP4lʘ**pfc}r2Re2] YkB}ܧDžnёa0e/) mύf>wsH H[o7S$f;K./n${¢,KhJBSzcoJ;fzdzH;i )))\J*xEݧ43G3iX߮Yo7L&sq~qR#=L:zsmt%5S_.1'0VK^_~=pb8l?#)? OZ&S||=00%i e< Gv7ˆ'8 08[#Q)D#w" Z@ h]hR?P9oIA)Zk|ZJ)PJ$LteH1̈ZT]㕰#خ_QsbvɰZ1[he2@L/ysfCI&Wq0:\uB7l77Xkvɳ/`8r~I\o1=:V[b/eu:22be` D(S떦m;,0HAc–R{n$6 T!j0JD,[?> 9`uM Jl;7mbOU`33}=zL;=}G}!GFݹ?d&( Yi!gIOF! `0>JȠł;-w"H;cRmL10lֺ,,”2UUsP )c-TÎѠQrEQu|n9g5JmfԆ"Cqؿ'n6[XcBݪw=0ߛЏ nno|W4 0C牷d v>=ir{VwZ{t!pu }9nJcXVduN20b[&3K ÃﯟkؖvzF39e2?c2?XG3ԕdhٔ2<JhՊGfbU9A+cwny:85cUUޥ:<8"$O)3M)Z+rEUYfȈeƘP72&nzBHXg mR&jݡ C41tHk*)NYn7hg+^]XwaMf~0r5H#!)Y15~g1mkY(Ww"Uxqz2c: aOcw&1<:~O k:{O>x5WUӆ1:0 7WK3_,x}g/;uj8:9冫n=8h^?>:)fB!Ɋv2cQWड़6({rP̦O!P-t:45ZG("u89qqƠmOaH`JVu68bLw:gPsH1T@2)[շ෵iro;@YUı}o'~]o_59|ءH3da6w8@R +cF[K̃"Dy_CNHP9T.xNR@m<ח >2t=U%.rrbL|3B-`9G?g diaﵶLSWfB:aˬI66c3&Lf36D٢.L Xo7LuCvދ}dl(4 Z%'sjC7уJJFPuF! ua']V`8|NQ6SkRZA'bHb!!T#ּ$e#8l0 AY1 ȶMDi AʴR3*eUil$> !y*m7KRCRZM1Iդ۫-*O>hƓ/ߪ"g̓c91&ǙkM=:0Ų6fBlC(CPTs88\#E u*I,%*"" 2H )c,ԳCMb0E*D~P7vBzodGA|ulʤ_b6^Ρ}DRsD&U \u=U,%y+X*g MU 7bC6f٥v4w x S}!c|uw."QEkB$O% b05VJFԓZ%! V 5ZkCQB[ÐX; IDATNk!Q@@F[|ʊRPfUwNf\`(, FlO~l6ދ.{[DHSb7B+L**g9<<\,Dv̋\Q޹t">EV;֌BWIZ{,rr#]ψbo&s=@ȏ_4U}@3{L;9FQ!p0Q GGlfpp2U`{!4I4~uJfuK;044{1RAc9VUU,-sJ;jm-WXoێwqƜbٲ (m7֚|3-/^ް=C)qXm^qs;!NTY &'Ei)1c3'mMPnLgk." gS-E^mxxD0aY`+͟)_=;_n*g-..n9ZL8?%,N88]S,W| Ng,+AO–0VUpuyMS\ByGa2u24a]M1W AaE%븺VY۰YnH)= Z7 9f }Z1WWĬ84΅y-ٵ!LZA{:E(Bɺ;n]vɂq ){^bo+J9o]ְGZ{[w~|ڝvе+PObT1$aPĕi)0N;O#{B( եζ`"&6jgI^psPU &lY:ó3~wʿ`q Iݯ5Xm~{a&sf9/no@tS)L>Eԭm ʹFٲx`8n]!FXJ͖lQ;gcɑ905؋SND4Eq4(1]X->zD  Th"iI2dP!'=%`x7_0HVr(+Ldv$u {l٠TNp[GR4FHj\6$=02J٘1kZ96ŋ/9}!?<_ 9g>oZ LI V*b?C[ǫ|n7 s&=/6&|PZw۸GQz | \UͶ@L}8|퓼|*h<yz.= 20 J1Brdipn8WA u땔DJ"OB73Ln;R@Eeܦ >Nn3^fBt*l=KGZ:v&N/VX/\L(39;;ExH"= Ya x$Q/XJ/$W.Oe2vURAiM!;`#NBWYA\zDl^݇X<1lLAp ޻1X^Fv$e m|2oltNڗpMډTt{^xWB(t|p|xnp@Ts1i>$dYD/wkdq˸Ӷ䩢 m2A?#cTJ)p QfgxߢTxGQh+ak{كgS/'):m\ ɲ8; 1Zwj;ƴ6.{)WDTBT4+qv~hg<P,׌>!v4e0YXHXohbz14'OS T. ! 9i"292 lm怌4ߩњ^#DUfĵ5JڦA$GҮR~>"4EANC ]K'zբD'Ih=iS^J'X s<]Je`ނ &F`^'~JT4Q$‚V1ћte[Az*o??q&Yj8!E+`0+y<|rDؽ*q Op* -Ai"ËjCۖ(F &:B`:iFHp!!4{٢}xX΅D8 i'֡{0~F_ yt`hy]"뺾k<U^/Ǻ@; R-At,]y|D(_z·W"D7EhŖ!8+%Q ʪTP) TtAyM(;d60AHd:b6t䜶01%#pxc͖^â^%4 !^Xo/D,Upݕ۷n"(oxft@#שV|C$Pt,[`!#ZbCw !D/H7۴qeT$S̛<9=_Yel:ABƨΙsmuѪ[vl: bs<4#(${E:xr tӋT˅BUV@ژ\tryBKp ƕ!tÃ=9zv !5iv@oxuztGXʦG;|^КYaN5ZZhxߴ593y}q/xRPu˰?"J4gX'GTUAh^/(ܸ)GGʚ uݲ\UkVECckn^OW%a4h[I:RnJgx都Kк8h!stR#)xelDqBUT%b&!ٌź%{#lӲZX, sgKWn}Oq<[QV-e(?|[v9LX.*n^OXLFz{j+C"Ś<4c. 4'K (XՌaU].Z.WnlMI'|gɒ2mYlӲ{0 R)֋%C2?2-Gk!L~5yz ^c I!|\SK~Qcqt QiXj+dcmV aZ-Tǒ~>`LCGa|^\7z9#Q?:pu&ώOwn=߽orOg=mo v=Km`o^G`X.K=MOJ$$l z2A8AGՔ.*a4#gG4gXb"5hhx,R ~>}̨?&^$\>VFE5֫3z1~?$87P[)me.T }LtH &g҂qmH)E :7^Z)ZK냔%_7XEC&Xace+=Kh|)CR>eHuheUn_2[!Km|Jw/; {@qRҴHbFT@5&SnD.] `]PpOucY065RD(6fǛ(kL/ކF~pݻ5g Ǿ* Qz2@U5(LFXRqLl lB0 ׮8m/F>Dg<)MO~F}gh-iPE :>nb)|@]l\)TX."Ť 5#8>;#$a\j߸ѳg3񘺮YV]w 2'2|O[ ]jsMCմra%c{v@w)&λumk̄nOѝS cW|5!eB6Fop!7v*%ҚeɵklhDa<ʐrpt,Bt(R$IEQVL5w46o1 1XjnޘpzVgk4.犦qcZs>}kdـ^&9=x4uj5G)ѵ}VEC/$ O\?3_҄8ή~ >k,q3ECqp.ɫEK֓B"*oEUlA? hX er;a3f^9~Lx)orgg*)g;>~ϗ\9?9|Vpϐ^q\XԵ%x,ӈ$ іq!~OS&tgk˒~mSŽ[{ fK&{6}F9Xnj1xcb+wf?)uM b' icLӆX),~4Uisupkikw^ F}&K^U8&Jb}DѠznoK2#kcшo}r:$D,71K|{wΎN?cL\LOd"(!#0P:GU)DIF%kfO35|Cnܹ|Q4qK^^}@mYO12?ix'cO>⍯{MBڝpMG2DZ0!j8PKS!TQ5q!p !imDلXl36#! smxĪyvn0lHv\,K]s{75ĉdHkHevL^Rt-(8s4 >~NjXVhiSXاm*#X%Hɐim͍khZŏ?xɼ`g!kd #dȆi:81- H)Y% 'L^2^S65geQr1[8˄pC{OY֌9I뚝Q97v8xqh,:39x%:qصF|~GĖ__1ldr>/fҗXpE~yl*Gx޿zelnR)pȋhȜ!41/Nb^JǍ{wڽ{k7$*mynT΁8bpCH Y@jLw$YNS *B438G@'/ qDFZ iEx fd$QBT4 !$y[ ;I+SXpZҴ->OH>N d㨊$D1"VDŠDF6ܺ*ޤh-rkoR?`Y,x쌃=<XGG:pgg[whhQ }NW =}|?##=Z\ߝpG,x';{׎ww?Xg1( iRڊ3w lkb9rk4c IDATwݟ $u[(p37N\M?׾x3=@\Ys|GQ )#jFU8bm !Ih B"#7n[?Xn@QqDAU{< R 6 Gjx*Ձ Xh-[Dq_}|9yOUQ[o&?ɏtev/sZmC()$aZ2QBq]|G H-.!mbK4q>O\:Rl f!wnG.kw݀w(1fuT mFgUXK+I-FԎ@pϏsnNF*}x;7""rnM]\p^S /iw V!9.IWI-|AcÔysoAkMUn-rh0cL'OS֏ )(>#5A6EԢ#.^-4;t@GuHw1 f35BL%i}J(4##o<8"MtiC1MQ`eGƗXEY4XԸ~֏Cw14.@qvۡnC2"<XTub>gG.OUU!o<ևnA[-a: d0UQsXTqBt6jMQ zp Mw[A?Xh܄ԬVUUH鄐 1Yag#a! rd8htޅ8G4)Vc*c;l0D@!a<sv~[ט_*.vfxM\ecR4MYW/$\8Yy&I W({F!uUn'/<]9&DqL[7Y?; 2gICRz$m^¾vwv98'OK>-eÜجƯ<pn}> H`l%EQΈ4I̗ǘG?/X fqwz$L&YF؞a\&ֶ(%)$bQQ6"c>e2[TXW Y#Xib:=yLX9coeN"hys$tѓ,f*+gܻw4Mְ; eQ((H8_SX7yr6wU<}ŀGБ$Ic1Jcjy+wy f58/=fY.>z̫${y[Oi}s״6DDkbexQ7oPkR, n*/PID,-XXKAp%'ӚÏo~d9$<ˢ(}Ζ+$Y)+KcqP$<}~nNH8N-\rc"øk8)Uȵ `^xŢ3gҤ>gl_GXx៟/1ĕ_~l&ak+^md+ iTѮADth|Ck )a?ȭ)ZqxOOp)$lKo-NOO鑰g`< Ju}Jwqwl<:H4CGm$h-u\NL"(8 om9Zb<$YC$zxVu헓wNvC\!.mrRҎ !a(}ִe(,`FUDCnR*;Ok;z>>\c]RQBRO[N]" ¶TG/kPAִmAH! 3x B"ʺ ۢ\䇶~ąhm Y/-K2,:ݾu_L ) B+֙p= @x.Y|:=z^[& àL8R]2q\gB`?yau4Q[ >c0AdޮtWL9%wϗ(| /92<_~{B-kF .gG2Kذk29~WWRGwqޛ쒦)Ji<  )RC36p. n MsA?GO$h-bFZ $IcmxcZ=;E]ISM/8;{Np+<;]`+beۂQ?nZD;!I")&qx4fI`p#kõ<;?''ږr]!`*ɒ,уg|Y[=5Q@ΐEIwh{8Ɓr5:F>C.%;GGG$&mILX.J&!ƶ̲95Z6$2HL9='2L+N.{co u"]^p|h4D0uV7EzS6\~O !uKU贤63NNOOL/V<|7\c8~>4<[̗GiTm8$CzyٚsS6}=D+#IܧP!."Bmk\kt0D2iO|6GOFYƺ(V !I#,e]H/Lg 5/b;nQBpnYf^TRύI[Xtc$uV+_#/Eg v_nagMaHYvx_%Msw3|=^Tp@()NGMb[FjhDhj4/Ƈ Bט=R i("Q%gS^Ĺ+ҼFLܽ}!{ThgRT3ܹ~ B*ޒy1 f:E5ΕxeK)Cc%MkKk7D&blmqkhX5(co@h w".=_VKc>l uSBӉ( UF-μiZɠYnpqmn#&y 8kʪ_r P@ 14ICW6ro,.۟u]Wl)qjMqG:ܾ+)(EǔEّ$f$0L|%qLZshwQ7~n9ئEl&$̦¢{7m\(uwLއN @Uᣧ(Y{Ǻftl!y o+"O~+O\kh q=$۞=ܻ\5z\ilU^0⒵KHӶmI49<{7ߟJ.ssE\^:f5>; 0|7qK/#"ĺ/{aG4N ro3XϸB1IuMEݵt'!#fG2)d! -y}O=`<4uHLj<7^Ǵv uM:xM&>~t Cis82F4-i: `7θ~mzb2`EꐆlHktU:"-CҍJ2[hsUP %u]44Syx@.8exd'O%HKv7RR5޺tAZf\a!uUs2[! G%3zgAhyC?;CZRWy*9i1(ִ$qJQ88>9#c?CU zueJˆ^73lN]>P5^xEM/K0ME4J:#M,w7v>O_~~įݻFi["(MS1:1MTXTa]ME\LHe{8s@R!,a&CʄVx M`I(8P-Z;ZB"# v-ЈXM:1Αn2^Mg]/ϩ5~݃];=4xHbgwE(!aM$3Y{ZY;bVE3a@_ #aa`YGڽMIVk5Y܈,j*##8w;3#9eNiH8R޸.X5M.k*8|s"G2ut-nV2 <~ʳWҔ>x8ů~J8gDXjkvykkǼx(CmBPٰ.KR q(@=1)MԺTME7,WayC^PdbAD1[!kk i)HjA- 9j@DVtFg;ϟ4†w'y)kH3L\<`qD񠣘S[ jk"-pZ0tD B AkAm Tc:%rO0F $lt=*ڢe`['0¹_6 yY&2k7bA@GPf!`CGnt6wZveGP%;SY΋[ɆK)f[Mc*6v Ӻ< * \.BTez=  ie@AbKr; 8 Էo-= )pA@0#J9TŰyQJmPPbt":hm07AZ~t6 a)fgd2 Bcڱ.PX D $m%8(K4M(/pQUTA۠."ji)$C4{Kk ڎ LVSQ esMwyMM;?|o=f<;ZO$xo;̗k&ӊɊ4OIYdU]3OYVܻ{U[)IP Xo-,VKvvǜG"f2c]<<_=g>G4fy$;K=Xz>qR2;9\TuEIY ^i8Ŝ_ΑZ1΅#²Z[Kl<09@k7-Lib]SV—5H`qQ&@9SwG @z {l0袤b0^hUg !QZ'1E۷vy!ْuQ3.)jD;`Zar5Ŕ}n yumf1~%=`Y CՌ9^!"Elj`'.,,]aY9s:+vcn -Y' ScC:P❠n$6 ~ƃD3&T+G}FE{8F:# K ̓ljBCAƘjQgh IDATD+5u9:՚b1Y,-Va$XzFqis%ŊJ˲ٔ[;{)R:>Gw Jh(PIU0Ɯv}ޫ6Ɉ s릴Fa y/؊obFaX`I:n]n%$Ld_n߿DZ97K2տ vݠB6b.`!Ehٮx$NEcC`HZPxK-Ap('b9r8ag> RTTHe^ZQBQ.^^r~vL8ex@Dq`JɔX;q@@K*ϐ:˚mA`J 5! 9?bk[Ja_ł,di4~ǜ4dCMkdp;͜@*OO\bb]sHqyYb*\5 CFϏƱA2;<)˪$V4O(˂(Z+5n+KJiB\/pei=KX#:hɚ*I;%B;O|(Tz I-Mcpư+{8mQz\4'tf>1۵? AXf9`ݔguS߰kZmмkZ5R(a0@; ݽwK%[[@,ہZA6oK+m%=IPi쌇L&;㌦tU $qBa>JR@V( 6BlD1Jl2պDzF k"kWMBj]A6]P@jZZ"*.4lGݶ,#d-H ZKTuF~@!t$JYbvS Z80P<wZ=p(ʪex.'3Td\J[I!`gg)[{T'T܈-3^CZÕl!\>#qsʪjPec\n")%6uߵoф">s#7Tn7%#-Jp)$ݽI'h'Go Z/Xq@t:r})?-i!b}Gipt.iqvvyYg z]֫5BEL./:di9H't;9w>J.'~{Fb =%4.*ʪ,PGb+F, ";jU=yL`rԃ3Tz?ߵ",;0_8qq9,Wkn<\NWHɳN(aaƳdqDU;zdD]Ι*GCa-24eX\.9=~w0qq>a<{|Ks|s:DyD h$YKVE e oJcVLKtOϟ^k-gx! thʒUY 4Ar]/P/ػsŢ:dw5Y"kuhjC0C(j pko6t;- O6 mB])c!ۘC o4d6MUTE^CC0-ڟZ)RF3Ki1BbN . iO0lJF f$Tuus1 lC3~N6@ p7֊z/R-cCs h6jtcqLc[VUX8gR6 DkW )B2',ɳ,طvږ -s]l'''!ZnnSƣADk}j{>뢕RJnQ'N^W6@$~o*ŕ[u&[dGk7 NFoc?~Dj<~%Osn1T%$_ψԒ<釯{{)Ǘt:Wyge8EN{wPU%g(w{? RI?;3/?s9ǯf3c4}DL+ _|B:dLc/hPw}f6=gv,VP=ܿ3%y /Nr$&!.9<`oϞČ̖kvs겤;֎e`(9X,S;;;MQ#uψ<ϸ12w8;_s1Y( ZQ%Uit{z?[|2-,P:ЍTUpH#R.+wL'!HrTtn/ D:!2k,;UM(KyŲrłJIe唣q;{Cp6Y~U1oH9 N*e)w%*im(9j/Y/ɯ7K6خ6wF$JKZHݽ6㥣2Qe8$,+؛$ORjIwXmt'Myy8~- F|=>g͒l7f< LX+vv</O2&%U4vO?&K»[V4nG)?v|Y>g8)iK$dYJ. }Pwۿ9g _f5WY {x9p'"Nb뢠)EJx!Zzf,MA7&H&ԍY[AЋ#:yk b-0ƄR:Bb\{0|88 ,/+Ts`%emX,˹g)| ղw?yM};c>Pט`aort08R9{@.8=HŠ1L<98CPw(yY3}8ޘ4b%vbNNC-' cdNG4AG;wo- <4PRPnBcjGkѠKU5,~~ӈa7C9dZXG]f9'SC4BP!(J8BibDa0ut"4^{c9UCC`m.*CQNc<:pwpT+xe _olW7Ղ kjݼlo&sBjuТې=b۷Dpjs5?7۵~>%>X_5R{uVhϏQ:dmQcrE$UM%($qđb!Z#|cpx-m!fCDVȮ.OZLf<1GGq5upj E MaJ"bL( -Cs(eIBcWD!Z`'8BAc../crzzo[dj\{owoESZstte(-tXV o> 2j$|ݖÈ)eu~nki\BUYn0/|{&o,|1ݰ f|W~R)F;g4q\Q确 RW;w#d:*ntﰷg]T|)^[z챳3bٔwv3/R~}zgm:$tB7d82ϸѻE?OS>9)q8iLj]|BJOt^<d)Y1WL3FHk~pȧΑǗS4Qr!Ϣ%Mc$N u])-I`LC*M7&3T`<ҭn3PUۆ((']33wߪ={yB]h<˓̖@;*dv ^S%a!Qe9r04M0`%;ƃedYtp!Rp1$OfрEyur0{./)jlv5 _@4$ބ5[(rqu{ҼՏgD¸^f;Gd>ZAc<* }TIЇ]/u(w-[@ǚ$KSh Wï,X?7 *-hC"1u%mjۂr^yŇ?p~ɪ+fBI)/SF(5>f^t[ B}n=WOiu=^ye}Pqzm@Pe>ϞRk3w@z9GS.Y/,3].1kAb$ @XRV5nN dt'UtVkjc( mۆ8J4n0k QuM(aB H瑾X0Z:5z=Bx igM]PN+5Kz I$<*u+#iQ|La C -J& $ZHWn 頓3],N\ ~<uۿܬEwv$1MpC[w ٲ3"36&jjYe{ $,jA;zP(!˗["έ&P3wLW WY om}?! +!8]fJ6)Ǎhc+1Me8A3 ;s,VHއkr.sl3#mG@&teuϧW(!h],B,^F ݪG8.E3p.:S`sW nLScEqcNPi- B޺0}(Ÿ?r6 7<_릜_L9"ex,WA'έ1., JbAiǙ<w6Wp|ꈣnwLU#Ζb_ r]!j,^>gu|έNW;],:<)vY$Պw 7_P /OilaBE?MCfNkvA/)7_0_ǷH48˙/*ypO2:8ʑf9%{#-ixG<|DI+hzbN\ ]M#%ZT֨(g5؂$I2ܹnਅmt#N?n0OYL&3֋%*0"Nm_/ |(i*o D !MNCQuv$/FRWxGSZx|L" i5BK\RnREXlrgӞiEkq*:ϨVk=04*V/_#3ӟoi]"\|0{?m6X"mfh%9q6YQ0oѰ^rPZBc2n@7WF{H+=zo>V^nVw"){\Am/^a9@ t oUpd8 ufb v2m lM.oA쳕Bl4y%iPU5NH /%郥i4mnfCɀ V1FJpWTF`so =q r;zDܖ{Xpccyٍ(έj;_w\ FNCQ-[HRbHh PA Dl,=[x<ފ*PJm]1{OmfL`0`Ӵ%@7rߵon4ߣ7z#,CE4=?ZwC)$Ζh ޹ţG|f<c,Ht\rhLIY)_<.PJZyiY/?9шeZ1N8==FG  Ry OĊ}Y3-Ly9RMwgïO":h6Ă !MuACV)Ji.'p3N'؆~˫Wg:y\\Svw>dua[ZFTm@ F-1w_۠7`:+8\r.rv1ŗ5^ޑT&8r2g?f4L LV\N(+Ee1` w9=;,+X3=kC$jIea8#l\N'a܉aó'>/xQX7]јNax(Od 6@M'\ ^5@‘1qAI VPEQg Rzn%s)X#x.0X KKBe[:(=]x_n Uul 7’XвcCW׻u#pru܍5ͷ%8օI܂'>MmHٔng%y1ƑHyF^-5>Y?E%1ePfX&i\H6g5qoa@q>l׼܅`\ Em,JFSDIP2N]^<}z1v;{Ls? gp{Ju{ܽ6J$dO7&9;Wg`9 kZH%Hx5^p|G[&ڂxk^"c|cӇ|ч~?{[iB4B5$ǿ}l(=!D൸F@ѯλa/<|_ #-$yJfWsV IRcogf?%iv껇{tfe5pLJi/z@B%HA= PG-߯`#"E Oڵkfwot$-67{v#Fi<^xqֲ̃ckkã'gc֠,V?X7Ζ x:ɜw4-,5.Y& V^B .F4m8B$IAJ|CH\r $>21Y^ A;X•Hc6;<=iA%ieF[ÀJt8 @ NoKAWѾ{|_\P‹^&j?抇=S{\.$⼿lŹz: q5]ymmtX.sl-, $!k5-rVR[ ;,Kg,͜EԂ+D0s- q+QB6QGf[YohH`9O8;9fCz8sL)d:4*SyIE*DBPX͍=IoJd8$nuBo-Ýۜ??~QNd_P:g(k '(B{-a@bɝc] @RW2@ں\]%ާ*5@GBd%1RX,J>xOvD惵>VRԏ*(JU?FXQScY.3ꗤEX/vs8JO£Z IeK(,+]8d]C?~ Gk-t.)pRc D$a@Sؚ] V~4޹ѷ9:rrv O IΧ6X$dˊV;W%J;KãWaj`ʂ3 ]>mg}1=a`Zdp8$].(i#˒r QZ7w8>>d4[1|c{c[} >Y<16M#˂$ڭ<%$YdGXӐA<,Sf#"NdEZGn-yJդ: ЌbD1nFy2a6O(ME ;mhb*WL6|6w،\k`9B;gXNSkU|p_5F굯n+%'^<Ư.& \j]!&W#=w״˞;صO_>RˋݻI2:gUTF0Sf7d>_!>Z3cdؗتSl fM:_>6IlFUX4^ sq iuN(97vyNҹ |:5vv jtskXٺ=d޽yX, /y \@q,^y&@m酊oFwxp-`cvh /~d5(W.˭,?cX7@dL'g̦s& Ih#g4fڐ6LJ?='wy͍Ҫ@i ^ `rWű" n@jī^r d KI 'o>)9`{;oZۦ*F(sc>x=˂1pe:VF+y`4FJ!Y\K󔣧LFˊ*K }-OX[aFҰQ ^DI5m$#: H %# 0V2GV*njKRqD1Knܹu0r6J0"nYر(\6j^IXWqpݮEc-Zޭf9QL`uU 4hڝ6AXSr\ :(/u,r5jd@mZR(<|}&AZ8Ujg e8Xg4=amf8uXF.3\ VjkMЅ+UZee`pIgKKjvBQxr,u-:_5H+ /Ǫ s4.2V4+T\+ρU55C:/+\Hs !)+'LNڪ>_ JqYW~3\o>R_V}N(Q]^פ@|wgմ߽W586zwx˜R1w[E{D5^,6swP74N\@(N眞MǏp&~fqtt|>e2r5Xdk}m|W_y )iY3`:.rz~AҐ^gLg)$If00&84wo <x0ORA/&-x4aW\>oAŠL3FDQL+6expEU>9$CL1\Od{4Wx<H?^t1;.89.QvHCdE|ҟff.-EQ?X,ȣyQFf)^>s1s1pFn'<BEYZP"dELs <`oS 4!(6xJ*ݥ EvKlU8i`WLzb\ǯlWtnWZ _"^dXyw5kW~ڵ>;t IDATsxfHվo}֯Gt :KDVb8s?2GEc$gډ0{[i eS#lmrrqt]%&4sVPkE1VJ&EBhtF.'RU{y "ʭzwW1.ؾ!7} H,uZ`Az8:/5Y[@XKedrҀX f3VVe"KVj8Vs|gW%N\0)8[6PJ!A4$Vv(d Zv\/.@sp}j+K**Z@r5pfu]@p.ڢ\%yQ[EQPe߫s)VMu~t[-^z@.Țmi6<;>z꼯}e&w=sct}"Oy^v;hvH8e2];0M8:;ltN !xOAD^ DQ8KkM}:fL{t{];{CК(:i E񄓳)|vΠOSU p=N.&V,qJY'h6,)Jyl O&L3ڭ&$Y!R(e bIb?pz) p: F%p>K|N i%DHE-6K>w6ڔF"0혛")J4qlU`j0/sA9`zكeku/z*s;|g^5`kyz^ktZ1_/f 4KY"2 V`%"A?gkJ=9D1ږ,i,H,#'Еq(i1/.h4R6kB/#.GRXei"800dhDKsJUj%F!˰yF,LAC\"]%b X[ab \d{[J `U e lVc- M$Z;<9>:㳇Oí@Eua>VA[6BZɌ10ˈgdqdF\2I,k6n?: (WX 8<>z9)mE(ChIg1]29+ 37!ˬB!J}(]|=`EZC2;em6ѣYT zNs:WxI`8 l| h 69? -SK O OUh6WPKyՏ֕m!4v?UR_oHUa U,ZƱ;֬fljN=EY\ksKL+%d MǐD/U @\W:핆*z},yNTR*j#r(HB?2[b[Xi^49ZB:ơSJcd@ҕ}`aVi_lEK{ݽ<}vABgq|:n7_A۠n\.񃈿_ǗW4e)vF@d%;[CmЧiQj.Fk6Mz6vt9yUpMM9Ȳ%ńw_%ayf3 ^4MFkO1vgO׷i|}O>:<||uKWn7Y,DqLӜnMKʢ y8&ɲ`Y>R=#Q.tm:OU <}H_z,)V( B._)>dsh¤Ф6]B>/J^ƍ.g ɜ6xBR OD$<2CePXTOIڭY!$, $"C"}R M%w+ rDqppG"0(*3$l˷WfLSiAЎi4|͏W? FgGۢ (ggͽ]D ^|Nop(?kpzX@˜G=aq?Ѱ&3!TLXaw?bIe "آ"2myzMtT$P !OP?~}F$JgUO N>^`SHE`6ZMV#dl1O?[o%c+łçŽW@#>C>yEPdA@Ib? t鯵], )(f0ַy]leP6@jd`-0ƳJ"R °Ec˒B A|*"2%C[ܹ{ @U6wl'?᳇b-g4<7[ܻyG?gP~ a=5.ij%P(?rѦqZ-4'+^x-(X$XSP~)+ @tRT"KKjFEJH2SɝCZ͈ xg\\6,†׳)%0&2+0FcWS̔|QO0>JcAy{st:ibEH@: *{#(!PApӃc5+:iFV{+?N٫m]M+GU^w ш)K"ɐB{ U-@(XmTY9V8ʑ 5j戔jGtDD)ZKjҠGF=â@qp ́o} I|?tUJ,j ēA'()H:_z~еBIEU9¥S4"`>/kP=]iVĪ>EjL:oEѥ rS+*sMƲǭYA@\}dYBBoU .-VAU34}%oqCd2N89q3g2KG5 B)u8$|N<( k gbR lCb%n'(OҌZ4 lom1Mxy+Hk-GG\KrrzFL/SڭAϓ$iyLKfndA |oʠc4Nge^t6|قEQݏIV9{ۖ-~dUxfCSI|8Vb")Y5N'?7_aOnoz6EYf@Y:aOHRӓs:͐{-GAnC*M2M3sn$%X!+C߃z< z-AQj&v` {]=gOGN!nSEK?tzGqbvckGH:k-狌"H[1p2Nf4dN!Z'̱2꽭J_ ~x"ze{xf_€<可CV%Wzaӡ^n^6J0hx>i^"|ßJr~Xg,rltȓ'2αe|s4}ؓ<;>c<6zx~|,[[[b*H !CTsxgltTeID$ YQ*l4~J4P%ˤB<| BJ]֛aCɒ)ߧj}d4+"_"pj49)7u$9aq6Q4}5딺qᄏ/sc>c-FׄOx`@Y+ U[f{%y5 PQUSt1C)V7ok<<J`s.>BuQޕ+})Oq~6"ZH!(u$ZlR#<+-$I{^` 9fLReGxc}<#)Q1›+BKƓ)>v@,Me},N*]\N ZӇ(DHG]BbuA`Gw8,#؊NֿܳWBXaEVPUNhlAqVM8;=E+ A׬/=MJ:E);b,JOjq ʊ$x}brksd2zu_4S.n0|SU-3bYjYguWlGNW# a YہhQ1j g R(4ި>P"CEfH)iZTԒXS}ߧ,K&iM/DŽuLS#6 +pJ_گ^% B깮W~ܦP/B;~,1]*tUYpB K8Ҭ~Hqs5|§%nS(KD7ZŌ 'cˌ,bAU<)8>omPye,KqNA>|ͭ>iV0͟hTnxh4OO,9NFEG`kӪ$.~)N7ojv;Lg#<2Ɖ KgDAͽ[sW )oa4>~A2t9$ZqHgčSlnnh y1Z(fvl6'/Jkq|eEYYPm)+YBi,k{Dx~?ꠓokYJ;{7NPBrR' q5y4tRi.yJq@^$=o;A֝CizNLUI>m#]__FgOa[[3EDaHLf)GGyIjFD$gS)k"elA\hMx|fZy|> >~i~ɒt^'FFy(e,,2Mg153 Rp~zpMZWR^(X.q T=3SV;bȨf+IY, h6bGWŜ$4w 2vLUN()+C/jB)Eae48-d{caMiԹ(TH-zt9%"HK5t @~5p;\q ԿܐGݯ|U×q|p6P\̖:{m|0+vgͦD<]x08< sԿݟ|@HW%« _kvH!%|w@O>g=[k=Pw?R4B9/&`O&_%Ee@*VIL98:;xNeI'o0LGX4@4! Wj@Up|Odgő(g7JQ!7gsx mN9?FܹS/f=]:M*e<Ҭ lu NItKEγ'$)7vXNNit 6_yN8b0Daa9ZEz /@ m) ZEueY+ŝ*PKtgdqV!,BX'ϖ{eCjAy k!ʪ)r_-7F,K+ð=P,#ŗQXeY[ q"ኙsUzjAܧٻE b#`{{b`;`zH#_{#,K*wY(ܽw.v䴣_&@D)[%}m4kk}dYJb>dŜ,Jx jd &D C ͸lh[q:YboF0sC 5v8aa]p+Sa Ц?W6:U_sBF!ޤLE}5JqLލ|6|sW2ɗPW+x(":w~%v q{};|qjuYUKi%) Y"i1A9m{(kjQ8{燼;mZiJ趻d9"V-"eƶHE$"u![;p*n߿$xytО^P:B-+,ń۷ګi+vzkHw9b^{>jm6) 8ܾ&Ib6ΗdU(LΙL_d13V9-c>z=j!t r"Q) rExQXf?FAI}^b\MD ŶHP5QBՍrM4ԕV5*p^]ɛg;:*>?钚1NoLf1'I.*Ğ.ĠJkNh~qum9gzy|#^Ld( kB_ޠ{Z k6tXHFdƬXZV9!-HE+NqB{:J1CHeLĘ" 5P}TDd?䃃C7mU%9"01ɵפ>5 Iȯ ?"JcBAݡ,+:a`޸U'뺆fP҅h%1F XX"6Lpt愅V(ˠ謚#QŚ umj9; z"mHNx' $n׫ H 7{dYF+AP @11JGDQ6MovRFaēAb͓p':$eL:T4D2BJ렌!" Cm.iZ@aK"h"B &2kD3x$qJQưhX';aaoB`8d6=qt7w&pv}u>t" l  ZưBlD*gO> CH,7CH;ܬ u(LmZx4T޿ ܣ4qY, x?ãsZ+"+ϖ,9 ƚwx6$nw,^n%|믰-dK!P7dq9g,q)[WF֕CS.%^._ns(nZ⇟G|iE ?$}ڭNI 9`-(Y,N|'>ݻ(fX\Zm1TxN&1j58fl"tH7ψ,*Ҹ1Mx!QRu$Њd3DdYN "'t(`X]Yp77)˜咽 g(,fyy͑ C:N I9X2__&;&)&a& ¢p ``VI6#V)eƛ<萋96}uJdP3DqӣqncRT×cݦϼOhgϦ8b\q~r744NGk8';!غ[j  @srrA& H)Ңdײ&bhCHGxWj%(m/^J67Adb@J! S3vZ* ),;;yQQ萳‹a-N0̜Ż ]le_o5F7~u 1Qy܏k|e.O4-ʵkV@M~>iE1lDEx7~~q;ίH\S ɗ Xm:W⌬f3>{络s9orllmP-IDtyCtjS{" dłStH\.5pkFJ6s, Ko5ǿBļrB_DI,ؽǯ}o3m?y;|/k 5Fgg  HZ`2?SYZ:F;9N#OO-ܹ UZ E{ӸIP(jH EJ6j+ܽsݭM_24f>+-VԶ&{Ώj,fMa9c3_Θlz60N""6ʋ;N`&谛/ٸ%X,D AƖ] x2QeSNf;;;\[ p"Χc5UKVK(8dAX1p "eW`}{G꺊>7E6RDr*ޠ286AU 5CV4vh0>Eo,ꚺY9$k]=B"'c8IqFıAj*jt&aq(kk͐8qq*cMYfAdKpxMoZeMВTMCeV H4ׂy=9/AQ{Q]%z7 )x"!+fvjBxAUqMOQ=X)Z/D\g_Rqp84oJ)4MbOuKۛtwCUh%KFN;tl>cggbf9YV0t[,;+sl0gAa9i0!EYQW5=9aS%}2(% ntt bS4ֱ)e@)_1Ε Lk8,,NUb(}^y* 8[Tⵃ=&'HSWω㈍QLJT6$ۂNJZVgUڒ(r,!jI^!Zvp2)S{6 KzyYS5ENz6H8̩hD}{v/Rst|ʭ\^giBVd]zfq1(}]'/.#67:6YSKyBV$QBh %4k @m(cT$Hx<,2=cwk EQPOjQx*GbGoޏr3", (ЭZ"#4р#+2SY\^ಌ'3c_) $V p8\U?>ASbTh]Sۊ\p9~;<|5儗gc&S*!HW_%N[,&(F\k%VJjQBH8gZsST& ziĭmHEFAtwSE^rp1j*cC`[d,%xucMR/L'| 82BL7_s i! IUVxqB6 Ov VSJEame-5B6"^b^{|"Fc\4)C[¢u=ynAr ( ‚q,3Vxh_ |:Pı˜…wxW9LL@,UHJ8xxKAkcMEޟo~ )M"GO$4N)"3BRIhC1; 5)+"u3%uUt[m lR&ENB[Ԕs-)鿍2mY}kcqxhŗ(DU;mQWY)EQ\]|Ǻ?U[;ܤ\cR,si@1jʠŰ5 $qv>rl!$ ݊T U{;ı`g,IR..feEv|?~Al%uغfgq_N"[dY$[['봒S3,k$n#(?=q$mɧO^}|AYfa<>%Xⰴ-ju8c0֛gy^Պ6cɍBHpvTJcRVS AxNIvwFA)Ju[lL'ni;Jzz5&!bQ0h'rkѠ3^ uQrdoo2a{m޺K??f#U;;鏺$IxxqVTEK%RyZI×'+UFQeHKUޕt->{rʋuۛloȫ٪$/ǧK"oA+.g99.sLs~ަ(3j㰶h8Ѱ1$Y+^7`gO,[wX9}vŒ$mq|zr3pvE Qq{+.(*@:MR>R ]PAߩ2yN`%ƐeDy>cUTFD@I(7aElĹ_zӠ"ǪuPS/_D+|Q I()Bq_S%o{}U]!TX2%־* /E$0"37 ͻ0.ΎW5d+;{ *jkh% ʐtvX9Fh>'gg *W ΀XbCph yҘ"V!Sb:F{sjalQ+tloߧJDC#/ٻ+Nij,.,%$Iea* xr9D#e00BLFd<(_,0%Sf x{b|ɼI%=D$8}ұч`k& "<!$.!nFȳZ8<ݠ%{J -n2~p5ǧ{S29s>RzƢ#ct$p"'/8l/ߋk 4ME .nUK q!d#CU\-l}ٟÓCpk޻f^URjBU7: |/7+ äQRg%p r_0!w x4@ -luK$&h`6hXPEԖA^:6L.'8X< /]oxǣ@hEY`CPJŪkC=BiXf|g/&M[DA,N@m,iMVdUK%&?g,ar7}A^5-bMGʄkM6 飐 _U֐I!DD-) }(/.)˂b]=[qQU*F"1i%  ܅['0Ө㼻J\+ϲ`?!?/-IG{(%⦯IHq6=ܣ+>?~S$b>])%{vZ uQrz:jX5<,t يɂvͳg|s%E^Ƀ{i>߉ IDAT7y_5O?[w{.Ŝ~b6VeQ|6|>.ΖCqHs9;o2:Ϧއ5v;[vy w< bn&1 e9:~Jhar9|r zBn^qQ,iUϚĨ뉔C6 ܺ`vT#Th9qA$L-5um(IJCc0n= Ӌ1ހ"K?&eb(8VYx oKƓ9k1]8!.;[(!Sl[rFAxGDQ:I.YQ9豽-VEtxy>d$Qewccaoء ˜UY'Ϗz\NgldEgGk ^LʜVmxv>7yt?wX[9Kx"+`ZQQBn :qq<+Yf<7ܹM/XJʲB'1nw`wkO?gwg k*$m[s95dT HcÃ͐T]<vm-JTS8M*N[}pfa^ZeR +RT PfDC%n`zzsz?_tQ/&Z{&M\(Q/}D7i_dG^@|3UU /f}~ƴaqV|{g>)ph>99'$qv\̘.?9tQ4I)憿;֪I>7A&EX Ce,6/D8/Jӊ4yU6!+ PrE|x*p!8ؓ &$Lf̌ R\eM {֢h1D9w=K)MiZYX%Pn$ n0 **ʍm>Z$LRWtcd@Hҡ ԆG a<`34(Â?_ "=yW!5tđ.1k VLB3XQ7L!:(h)<{"|]XC {mLสf8GMaX Qݜe@h8~O6.@ὣ4TXBxUtI"8B1b gkBhڽt!4iEf{[EţN}JUMɳ!$I"0%E;=ʪcx;C\眞MԆ^GJ>%M@rƀӓ .g+~뷿_ =>o%I[[Lǜ1 G3Ar2c9_oRVGcʂWѧO͗cɭ[CF#ζ7'H(yǂ|U%[VńnC#7(j 6Ot;m]m""/ *csk͑'_LKfsKWt-<8`*Y, ٓC:>emr`kx e*x yn7nw>;$[.')`Y"ҤYJa8PqL>+#|IUT^-i CՇ9::AꔖuEjn-lqv6Kڽ<+.^4l {HJ)R Z%z+DL͂,+X-2t̗Sm~(VH +Dz{ǟLlNIĠ*:WܦG]KD,dB[l~+ܹ'_R{քs!S%i#@gvj=w!.E 9!X!LMqd Hdp[h ux/l"E&`,"Ug+U^xR8a6_RyM opu-Tb+*©4DDkEV\NjAf}0B锲ɳ)i'bq1^V}l]PWYh.̱tPy奣sC&\,(!D!@kB'nZ6È /={z z[;<{.jq+g›hҸŎM$z,BG1x$6P̗+8-vۈ=JXU#IU)kŰ˲2s +A } X tvɏ\'|XWMPbn(ZF >4* ZSփZ8c'@yGQ6nsz~N*_9Ax)5osm`x!@)',('h3):_C(`@A B "Aw!3 T>U7ulUk!Nh]ݛ(WZH Pդse' EU_5b3QG WT'gpғQA{.} R<]euH\!5=uSJRe]VƀJ`/Xl@jH!mH`ll\4-D:@C^HNΛ\.u u_/(~}sP9=;ؠ5apLm8@]7 b]w=PAg>)}d@wp(!mjs3@"o|^}eKHak"D=b(X.s"V9JIXooa~{ww8)9<:h={6qsTcËmg+|{=OsoXqc*J*29^8R[ĭ!4Wz݄H L0F`,sVئP%Zqrrl6#K3V *g饎QH<ޘx%'A^(:Ǹڒ^8I8=4R@nyBY) ƄZ4)GU,p'SsMV\̓\D1ZBbBa4i')I!9s`)#OcIZ`ss bE'R #Nؿ h%$) ENY阖l:[<~zlkQ&+sFrp&Yˈ4J像>1/RRᬡIZjE3p6J}kn%INU*F뀚.,CyOarzҒ Pkl5NAMBI.S6@ #bСP#$f\hŽw9owXc-(aX)8Sc P9VVqo>xH6g9rt %d v߈+bx:)I=wAF`%C Zb;Sey{_!msس)ۻ`k?|.jy]R9%vSVub9g%dh^nMe;@5xJIț ~]{ } A@ʲ7N*r rgksǧı`oc b6]Qa<cKMEw@F8bܽ{$Vy0Vc<馼D) 'l q,-j\Nf1@c ٦j>b,x{|/M[O~Č}v8(;w?KR)k&gT;˃+& y&'\N8<?-OddVuDrq>ַ5[C9(h Nu fg{bb3n =ﳿK997Œo:~Ru}ZSN%<:fLmغmu\6(J.f+"Χ ^79W߼NsSΦ^y~\r4]x}2fCGU#}ܥ3 &5xXϬ\`G56؝nsXS+}PU`sI TAIB+!"nHg[xBG3zqFE͖t 收= -V@G5ȆHkT/PrԔ8c k@; (\'aݝý[iV(U4؆h}4^;t#櫂N7cuFC|[͗ۯ Rj7A˜ W/ 8c0bC7Ar3׮qxzFT6L2DQD]l 4q+<MmD15/= iޱ g4M |qvNg0AX2%D`p\ X)>=J@'?&Q#%|GE`oRz˟ƷF8ybyGe Ӏ4E &`J2 8\)ko=HG {²އNl ʃ#"(R:_~>;9&<j9rʵX 1cBmyH{WB>Rq >4޳^|[o{ogOcQ׆$ydя_+8|vxӄ4l {<|xwn'A(t֭=4O 9͘\,t /y~&ostrA]da{wMNܾ&I"bw0`5 ,khjF4șL/XgM:Y[.֖?s'wX8gb?M^ZiMc ƓgOY4%IROYV;\L9:??7dk$I%w>l{ U |ߦHxmF͢CļrO>yrtVQX1Fz,kJF#)d`AJ61kNϥ Z !Bk'#k8pu}5tҫs\R\."j ҵ9?7ܠW%ta/h'!D:3B^26D,E+# nw=B0use8R Si )%M=<|v1"J.@x¹t> ʺ Tj)ڼmߞE^+H;FGO?~aRV-4|^JvZBg DRކw}mG׼paeRJVyce^9ehu犬oeK-QA)5#=?:Kylz ʥiҊ2 wk}~bU_ e)ˊ( ''SVvAFƌ4ɓ@=eoMGb]bnΝno vtLO7ֈRq19#IR 9;f3pU5wOx&S~G,&+O$2&MwYWD&IR[fS=tqAv0Kxv4.:5vq,095Q|ln/P81N`G Zј@s\ cH`kpx:C/t5U]$Tu,kϱg\%UnbtFJxO]bͪ,N  Xh`w;4U |F]"<_ 0*2s?#I:k9oÃOrusGS6k =yAӣ;Ѹ%J9q< a@baX3%mst}I][TLk**kd`$e J]q:4k,m&F+GiX+#OCL`Z>r8A`F;$OkrH%@( S(!eLy*`M2kvKLs|zƽbm` V1uUIX/4ZcPPM8#BZ$18X3?_TLT# ֱźdFO>1569l%noE/C'5O,* hH{}7T#Rk-q 驜޸tba'S^֐v;mEm@E[,_5 PFǡ4KJs>9"eB51yHE%^%4%SLBJ$qhiQ ~cY$A`X#! 4p:, {{_ro;R]wۜNX%AMIk }17~-;oOXxE00Md%F%6>{M̥m81")2ޅLZk<@@ G҉%R@sڴ5&0 H$rO$.fwIHkJ餝;f`Z*hF{(}(l|NWp9)%/6h pJ,"L4q$ JN|9l&MS9R*:b>:DO1{{h\:7|8=gGܽou"Bo>g1o8EeRa?MYNkuDcMG,W%YuIi<1--,MU`0)J ^)¥FG9MWo^cYΗXQI]e)U,KzDKN/4f{eogP1Y(x0bXN}z] DdtZ)v>=TkXMRgKr4{78H%L"}(0g1_xk c*ΗZ)rd89;1o' ڐg :͐Ρat|u1֥ 1U"N)[7C&eED(WT8cNOm*nlw3b)ugX[SԚ^;czǏ)ln$JIA42sx:t:'4;[CVEͳgnjGxOl%E5d׋jɂ'썇Xd8KΑ,WZ VUIĸQUk:]xS%^EbS|y/`!?\6ۗ\>?ۤ]/F}AT&5򈮌7A&p a5}?7|rp#MrIE=9C1Isp&NʔH0vq˸ߥCq qHAK'M1>`kbJPMUpxo~;4֣`k4yr+4"t??i,~_yurF?m_Ϋpmw]|@+j=HMSʪ`:.v9=>Fpv3AMYV-OX΋~Kv9Gh9V[Mzgk `eHlW5{ ym EYCYNQIbţG }z.Oi) \&UtNs=={1ˢ1BE'I,nk[<:<ɜ8Nx^11 z)TPl {''gcxg,+뱽bRq1#bg Aw`r?`e2$9MSE('D,7naia6_;|Rk{c?(kt2e+9{݇O8wX!^va7!Y, ^'#W?`ws{3 !R;a98horf9xC`ӳ3Z0\4! 0tbŒxw!Js4QHt&V(!dqB]Tb3E-֌F)x+Ԝ;F؊ra&$qgWr#\bKm_zx_qe}&jce˚ bHQnNKin|$u"9pkܺͯ}~7:hۘvyHG fgDj߿O<{n'k4ޢD0;Wǘ_86"GuZWmI& 6 g^B@]7xrqhs}`DԶbm7*>8꺾xkIyzl$15j@ /Ƅ!q4ABnv)m[|z(b^cACr9iBt Jm|v.f fWE SE00\eY^2%ST+])-Y`!<gS!}"˺e@`msDJ ·Xޛ8M0/ Z- 4AwfA)p,>MSʢ_< 8XEkI3IY(P[Wǹ*U(S+*G9?rT|;?;kÕW`ă `*QB\JMPJcLlL h< ;-iCG c,Z+$"I"&)~*YV_DQ>z]kzX 9ecC&%_cw{4͘~?gXXȲ^7x%~ٜAovn7C)XSVŒo2_LAJqqNE 1>_=,`߾I|x ]Kh5=8G넢iȳ?iWo@ƶ!֍==<;ԵEiEUU4uC]7ݻp}'qxzxayhۯb\qX(B2|CӠ#tْbXEMph&k'n'*j|/Ep}g,y$1edB):ZdTHb<,ԅ# yX(*"}c N'xywXCstx=&vt9ɄNX~:MhCij'O)w_%r겠vk{5՜^kϞw}»૯`Y5H=y{a7 B\sY5x!Y-&׸O팷^bn*\5%s30F3vQrj]RV :$i}`nbw il4݂'55 3c<1b% j!y+ F9Y&S"ȥH՚b%cdBDfHB5:V-VL*>J(#B3AF#!OYT-*q IDATf841 't;ߺ으6o]fHրLS75W`+, iuY!eϾ=QUN$v FF AFD:&VH'sI t!nR@Bf =T"Q*[X5GǏntucHQ7sh j!]m(SVhUEBPXG3揶)6 єר\ECř̰D̖+4 $A:)4 K,B8!/>PPhEQ!#<РS`nx_Zh}qS+ҊyIª'T :^x;~mc&YR^'=ZJ Z MҠb'۴%UM+|CCߤVHDc<=րCX}gg&:1U%^GycT ^p6t)E7 HZ7MБ tme&`Ƶ ÂЎxx)eY')EaBh6M.Zw_h lsa,^\ylY%eSM'_c2h9,T:LT?RUJaCbYݯcocA)6絼d()tz,UOh4e߰D$IEAE!5`ڬh=Z)<`[JR%Dbr1REwl2"]#M(a4"5UI.ZRV5~t<Ѱgg<~tV[ Hqp}$ytdlX\-ݺNzNbzY 5)YK4?숋y>J/UG}N&d;H!}x!ۃgOicFR..sD?Kzci( a4qr2Al /4F>xo͒%2_/yi0^P 4b<%BFh# cl3_7 >O'H1G|ﱳ{?3$_tA*vΝWׯsqq&Jb6 2"1#.*Z.#6(41m߼|'̗K?z̓k8Ηi\]HO8$XG!AŚڭ=?f0S.l,fO "ubRGik· F[iXjb B ;}vHZcr]r>-H1=?';z{"j)uI$ús`G}N 4d~6u9~oHS?%X,B:V;錢XQ$&uDdnFcr!#E$"|>6/Ϟ@S*G"n{Gp@]@ɥd. eh[9OY՗'@{AEmܙGe{wӳ IJYW-M|]xkP6 >8o{%սۮF3)Er kqA6<ˢAtIM(k˽(XgDKTk;i;xa1mV|X\k%[ "в Rqc.ĕͪ%}b]'@0F>>m=1PDjxLhmR!t4)JЩ"ķ~P(/<[Xc8c[f"!f`SP@9dXh$2 CΔTUÁ?]l]CF0 5ƶp,+Uz,ܿ ״ι`0.Y$2ByaE+}مRס7#LcxN/kTF=YkP: ,Oac8SVXÝOsv:!ϓ6V'A x~Cr~:;9rw޾ţGG<|xG=yhЧc"^?]e +=F|j͇Xjp糇M(um'ɓH 31_1S#4&y#e D0{V5Lh:Ipy(ШDZZ %~dsy5ͩIz!6$5`ڂm@A~0!a[(S(ж(6칻[Uw{s9L{>uM @V8q>gַ !_i(p?S,sY;ՊȒ,kJSݣe]]0z-z6o39Ǔ)[mz>%HAeIHmba9 RJKڒ$IH,VȨEai^ϙNg :iRrb0j9\NB+,B asaOIƳs= kh&yG1xX p Җ&5!7jNΦ$ŭ7U!K6aNg|36ڐ9Q1QV7%>eQ9nutZ$q\}E.>9[88H؊v+3ir5G 5R Ir٘xF?(7q:X^,)Ĥ[ji/  ! S$QʠqNYP8]n݀Fg~BV8Ac)uETy~Vσ+~HgGq׾cWY}J_W{ǫ@ťq8Wu+JYk[.Zdȫ%E@IQ{bdu/sf :}?k{?ɳ2>~ )nZ.J2 ۷н! oaޫI'b]&<, ~mT'76zAG!l"p~ǞHJ}][[aJs~ʯGZh⵵4]?=3px0ь={s>z=ׁkkAwO- "V_22Y,$>Ҕ{'g<{)(%1ʢ-q$1I%1qTb%QqLwaBE!c-~>"Mc|柷}V'm_Lمw8bPpsAQIp//Y#Y鲮|L%gIJ笊 mg%ÆXK* "fuaP ! $Z7% %/7QQ7|PJg~Ƌ0&8 άmFadBڰed:`\`.'%EU"b" j#ٟ N)# J064%Rn7*+TtZō->)ӆv\3- Ɠ9V&QPJ/_!$lov}{$I/sNFL'3?`6'/ߦ(J\iEśv;cq<~&''[SWѰd.|RK^ﲵǛMvRXrc?V/~?c7xS|TYKO*k-Q$hwxK0O&?<"7!hp~]yɈ#uUt4/5Mxe]jy)8J Npbd2w[()x6.ErYv"픢4xg z+0t2NObI8Ҥ6/O_ULY9'$q›}$`cK8X,V+ N*Y-rE!h:qF7xӧ<::J1`ME+Iq*tܦFXVFdqPV hzg^w55=?t NUP`Zk=pW0_.P X3%@Fjl߹K/;Eٺ2Lҝ9:s:ybP-11]-QwcEt0(-E}j9 ڼ'b~58AAuOhbzKfI$29g/^O$ŬK|ƶscdN0EؔJ.(Ab1_&,W5/ONqpp:;k ()°KȢcA,Y5UDȠ !`KڕYϕw7IgDi=&s  8$DYܕTQQOkOq{I 2B ANH[' t*0EQDIK6n8KPq ;M~>ymL8aY pA\n&X.)2.kS4%kו1: z;mclCXXc^Q7%M6a\xƏg2c_W 4ApU&<ȒjцX7)bꚨ:H5ё$*Fv| 767Miצwͤv㸮zy5"_1;cw軻c뱻KUI3sx:.kWXS"()->1)~ 8e9gAx9lRSU{۴ӳs_,lA g [-:s.ƳPr1szrYAb,CmgcMRPU[x(,_q>q2o"CFY;ldyG;p|:u:!nh+$!M-gQ֢ :$ۍW*(`Hc6|n'S^;`rd|AnrZB TGlm Lf̦ znSnɒ8Ҍȩ C NF]Xo[3 Z\8C $G#W$Q؋-V+v=k0a!pe [۠#PA% T/!PRh,a[8QS2dZ-]nffƕ3 6)D`UM D]M2 *{姫IV|z;j[Lmd<]NOaks![=.XʲZK٧NoΛoo6Tet2gc!b/|um8|1ex{7t2$cw766XZiDG 7Z`m" J[*Kr,$:QQVK~g?ńv :-ʕa8M_I\-BR3+rI f(kA'Lgs>1ϞaL{z݌^Cp~1i@ByA<"gK`[UۯNwN,*&U7!>hr1rr6"N[t;miP,QG#F)q3w#:-j ^ÍʢdsF96SWa\E, n&pAh,ڃ4ۂhǫ『wW½y4TTk_*pWv]rͨ!-P2Sq=.*ɐYL=_HŔd3*KE2_(f7}xr?}jWY@H1P 9^RF-I R{(] GM\)A_%xK}/??xRGJ_jh9*8:Ch6JP*'R5é;&v_;1[D +{&{Cj'+fO3|jl_Ӫ͝qSDvATZK^<~K|;5ܥX<󜜏H AbAhVbF$Qgdݜ( #dƒ *Qhn {, =Z`?%Ԕ4=eQe`(F 9{,U^16xJC@ 2aW}eD`3Z.iH{0aC yH߀σpΠ)"X(8l8r$h4R@ oJܚ}p!aw9^)5DԝJh(H7t7C$%vb2f!|4q4)XX¥^k&,֙H|2y=8"o5mr\FW1_î%H!b}AϚ;d)Iӄ=a<_ v o~7wx8::cͼ*g qLH0lhF!ۤNP*OIr:e1[Dt1.#(ˊ,K!I(P51]<='wR~Ko NOψ9;rygoFsQ%3bnlieݍ?c6tJۦE^Q:Gɓ/0lq,,Ih [8>X $Yt)/$UB"E 7GA3tQ)ΰj"$RZX9s([kei˒y^0)nQYRl ;ǤOI4oldo~cNNsU'a0쀸WhM]:v"$L 9h:Ei8>qq>BnR99;؏̳4XVW%, i8ye">w}NޜHjs:ں̣aĵnL[[<]vvz8g$p?|EF;ϗ|"{w )^n7᭷F&0uI2AӼFGV?#{H"MCý]a^AH"= }j}]ggh?o=J5soy!Y鴗[$Igw?awrb1Z.n$Iy?bU3PR %89>`2Ia6[_;$IBۡjƣ9WBȮg%k_pK$B&HY<.ܻuȓ'Q"ܩ5nlN+KV!댐 CΓW'l}>?!_MZYDm R^7dGHbQȏI%">nosq>hd̗KDdzEQXj( k쐅 `"tZKQ`׉`kGGs޾UA?9"S"}HXS(m\ NgS5|%ni|I+vINf<+  @81[(.跺?&\\ fv̧S'yrHlfBHmsɇhF0G8Ik [҇EQagkϟq,MQ2HPT`& SC'@U,^Ce-Η8gщfQW8P;Oi#3HgPM뱖}Q!j/s_*^Յ<],zh?WXC uKBPŕV"rQЋ7HlJWm T9^[$3`oܿach|r&jEux7u{B+j AUSE8B7g| BHYVS錪ĭi+bZolpd8Npǖ1ϟsqtLZLi1R3MaqTEV`,$R::Y-Mpl36W% 2)+)*j+1ʓh)HakH))#1x" ۜrKHbQb޻ыG|yD=(a1Idd4Ty"ָf^`?S9{VzleHX-TNB&D Ft1M9E* NX-U!R" B##puia!*;[?L+D$iE)g#~w~N]*BA/S$*<}BEnүFF1dǯH)ÂT455} -8הg, x~.G/F&9^ذ8^ J _rɜ@H'BgB`Y5 EqGB X!B5(j[UL&uSZ&MOvBiEEGi=M39(M;ܹɭ0d4눘֓_w?@XN*N3&K?4bwB^S5N?ntqy_#>Wϩ9oCp?HF?my_%ٮ 03–_wu\!v)xkl{,W5IKR Y?#;"(8NJ4nC/ޡ$}5/=*hS#@)CZBDIƚF9"4jod`V|PLLN #M)y ( *m0k@ZI]1V}Mn,TyRvh#ѱZFa^dY"lwVOlY1KYƬHL7AZIew߸G=`O(kv#3:G L#k@ɠX#d,f(ZXOq-677Xs66g<ee5bH"}$WC1U^SEI"Ur({  c*]Ǻ.B]qûl(-΃b/pue@A, "\#X]p^ όR oM,~$mѱP: #7;(8ATeV?|ȭ7xs ^n;lĢ(#E˓sڽ^qAjʼFZP$QB+,W](e,+$d,M5Y4{7XJX,7ɳ&Sxol1g+݌O>k䕥iO# IDATig\LVt:%e~z<%K3UA%_}9:K 8j1s-.c NZDZq]UqΪ 4 qj B[7kNNg 2"15"~r@1i!I4Ihq-zG['>‰d.H>$vDJ4IAAfR%oqa5D@6 ~+>0.V+Ҥ9( !II[k)6KH34 "*`|޸h>yl9Tm ڶMgcf hRE(%&3CN6tOBF'MYixx,TZtp8|6tIVl1IJamjb`5:~|@pqDrf>̒K)%6= a0ȸE!pMqzٌFJ[Rdq3 '+~`vQ W䑭v(QL%w33fC?m&xKJh@#;n;̰X؛xKK[!B\/$ ti|YU?ǥS|t~k1z&@˥䢗B\Ppbidy n}LNkk@2Cv dj\[OU_p~p AdY\[:p]18h*WB"dk:z3Q &zd>w ^I@ez"x)uT&PR!*58DF("!i -O)9R8,:j/^)rP&79й!Mͮ@8%1>`HHBE6\ff[@2S1Al~3FaN@.{$$;J3.,)u>3h<&X .:YUQ(`8yNA<,.NLrCJ QPtr@YtPB-X}44^2o7w~yI+2~ r~7 IF_P#H" ؙNx[SL|zj@Fh'3B>Rbsg/e;t{kW?m߉MʲdW6}x؞nq~qfYmjrT(O6ts)$l ãb\sL6ĘRfhsw阖~6Xa'x2ZU9ƶxgɌ] wRe4,+>)yGyɌ?|L]w<>}_O Ggy)"x8lm8= `\շbXO E%揧 맿?!-1Q'VL Qm iҀkRctSE[lm0_)`0=pD]⃉LAQe{ŵSV 1_ˌ3ot:Rs>u1_1Z0,rã=?eg2ƍkۚuUqm{.;dj3*`j՚Ux3֫ozB|@EIͰ18 tYP6Te0r>8]03 c)g6ӌ{{HH'6.I6I%tR*HfPȈpJbˆj#-"Cu$gX/ⲓHWG'j%Džz?k"hC(ŐZJ) 9PIj` Br|z>km"*#; .vJbI4Ȧ0Stv Xvvc\lz?J: ~>dD\F1r\u :݌~&x秱['$c4Y?GlBR'>kcځT322p1崵E)IYfsCUU./l"S<(s*agg+(Ⓩ#0Gf2pqf(yɫo =-V>kn\2\ctWKfMw?_yud-gnj|h3&#Tq@j.h#A?ʸu%]%{F1Ռ_2RHszLJ1[|~yiE3͠,f<){?~#$_1'|c>);;[?i+]lg1ZBpl@̈ 9?;a{{`20g6_тnD)IyF4%xC×tj%A wٝN;Sպa{2|GħAF/XvUyeS?E WKHIRʑ&/l=Uwڀ%{$Y6|,K@yGLlԨSl*t!2b\k\S\hBR |QF hӊ9Bo[4tD{\@!mUFXA) &G.u,=> MSAzt6okP:Ig-Yu4;lgc.D8{i1*'Hy-)D^ 4Jw֣B\+ͼ DGx d$ϳ:[GK^Vk7,V@ (E<3eI^(& e &WEx4, aF J>GfBc/^Ʒm%=|_2 cczgy^;=o}͟}BxXES'ujg/y878|rhxw‡j9Zgɰ]Њvp_dDzwyID,34ADSF b)=i_ᄪn  1UĮQZ%"`X hN!#ҏ;"`BmseSpf|K 2"cOun{w=;%eH"cBLE{I ǔIEAWwhQ2$oUT ]JP!1z}H` ?9|48HS}'s!<@"ڙ$"DH ~|/_P@ଋ')tA'T#7"XbÈ MZGt2]cB$ յi9Jӳ|h[>(Ϲs $Y>A AP#p`vɳgg 0gLFκu,Ǔs_=@@Ĥc4ysud@gY-+..)s4]&wqtrxptkB2s%jj2B̟Ncڲj:րG'ˍ_9=ºq&/k !Z)>EU[u !kd\"b>_}X.OX,ܹ <@ Y-W(KB^{!oe!.|xL] v ~>6)Td= çLbs.AwŎF e= !yYeժxQ1S)uEZ֫h _{|d _scw_<=|z,rm?~-òtp\a'hDUU,L#吶qi]1 (2C4dF3,s\Q2BRs]t4NYg[7o?5 9[#.\gI3_Eݽv :&Jjom16kC;L&%m [Eyhwy?>t_}x+>xzº[\2,n=g{k;|xUA[*:O, NϑBP+j X,y=@!eQ]LV VZ *kJ(\8_Q#tyQ4I͵1Uk9Xv\k:Y,lOε:(#9oq.)$# *?~ >q5>M^>>bx8D|ΧGUU";W%p1y&}qٸw ~\gu݂dFhYZԡ„"+1:'Xo1ALH:[!KY(< , k=J i]۲xS3h9r #utE(}k^bEHM@ OԶ0euL@Ρ䳏_k FG_: (`pIaD c k=:.V22rcM"\Yj \pR',ZpDOڡq-&yIiȕ6:|l+rS4a'jϚӆ&X @ZILQʥ Fd}L \!B2)qň m$:2sÒA@y聶O+WSXo Š{2,Vk<o|%ߏ^WFݕǿ"4qЋh(z|@L,8?= r$PHx 0!Q"5ybrR( <2\t,3mw-M,8hz) z:wJ\| #{"=Ht\$gH'ҤuX$/՟<%RUs׫5"\&cZK IDAT&-(0ٴ(7B2 VDK㫜y^`dk8舿O8)E𐫜td;yR_,xr >1LC6KO.CAQV U "f^!tٌ>3hvm 'kH?Vl, Dh{<9=aZS-=!8J0|Zteqq5ڮe6wnj%,>yJgS7w!qv"3tMbN2I2-mM.JLBR\r}{w}Zγͪ9w^~ tEЂ(a v'{8+(!"{K(׸s5Պa9a2ޝ۾lpLZn=;^k~o[h-QRT+>!"cgX8g987cy ~4FTEIwƛP1Wꟻ{m;<[7wxGx1ؿqhrVy1i9,WҚ'OQ%7o`w{_N|^!)wnܪ(!mr}Zp{UfZuuq2Hm6c!FKqUPp4b8* 3 ԍ,a(|0 .Dc-8_w"9:1oچɐuӱZ7weU=S#h;b{鈯}[xrt:떝2S,1<>|pbXd'Oy. &~`]k7{pp:[ ['#ҜWt~+%AC+̠ª<,P"%clư0>q-lh!FȀ(YZ8SܹMٚ0Jb38؉4vYjA̶Ĉ[қ$/.9Z/C]oI!gB,fZ Rt {ڳzFZ%*Y Wmde!f\Tkyɗ֭WZ3km"ZJy2C*Uj.7oQ#<]P:Ç,ӸE#L#Ct2w"ndh:A>IY 0U:&BH2J1汙bPI*"V)71ME/4Ud2 [Ƶ-AKribʌQB''XLߓ( `Td28*i)Ljڮ#@(u%^ TJHy. %&,Y.s(-h tki/FYI57nakSdy)h;KYf/ IYHr8ɓ r HuMs t]_B%ȧB{(C.{/%CBW~n/bB^^W\U,g]W strFzT Ud(TSXjNIp̗+ 0ٚ0PɌ/A)M=⒖<-mC즳5*UE׵Q_$b&FjZK=5(.CPqV* PR`ŊޣAHPbHЀh*G"FF%NtDb=4m0^H9==Gdz B0n1,F. zU3 O.֖yM3lMH!Y*2GkSmMuP %t:ӭ!'4,׮MX~x?eP n찳}+0Z6e1a4_<>:F1b)zD~'%Xç,VK `$EN'CAlLc},VKWlњm'u+%7yZOy,#-` hz&^$Ӹ^squ:eC.BIPVcEWda'"SnuDK"v(9mCs:[ყ`d4\Wux4k[e;}d%qEKE3GG"]^s3L'CyvrcXj2]0M棇q͚x7xik5j0dyΠ,y~2cnɰu|eQ B|EfZe1"OuL#}`2a2,KRESŬEs C2C87,8.{%9ʴa_ۺB3HXI^eD+?ezm_\uWi>WYIM9%mF#9/Yb:.2:: )%nZh&RXmVt@(QJb% (";k:!rBh,Zs]2ujS(3IBi1b^e^ d`42.c2x_T;R Qb3PlCTB |@ PYΣD:BPh!UPxYr^ Dǀ ML5E))c∈өvDu6tR29$+x:,utǚ)EYe#H5C2H!/5+{`MK@z9Xw@vQ!0*Jdw /g\_ŀ!v3QcjD?~zhiJ>>bR{ zCl um,KH!ބ1ҩdn"5u,(%"jJ:GI ۷8ƥJ$F\TUU . uhƫlPsh>I%1 DKlY9BDI!TKvٽ:B eKD+k:, +C̵)b2)l 2"^xMB SB@) !9oLeA'5m!&p>) Cv͒7"]R(aTȠa<qtzOW!{6N/&|gS"l KzEH*OflReh3D @QMt:3>3!7Ai\Bڵ-ET7ߺ|[vG\R=mQIUL~m;1t):g70WMx`J\\tD 5ݳ3No cgkG <碶oYWsn]ɂ f/F;D:òn.0[,)}0E4~ ./0JtyS}*b@錶enb `8,ZbmxZ۲X4x?a4xҴ5e!LӒ d 1ݫ. WnLi *_yg~}|}.7imsaÍxq\qF"?WOWA_= }Fõ>3B"t*e݊ЀЩL] %RE=J:P8zA3zB>I ] p]z=RgtCfO@{THܬnvqi"3@%ǫU;#(K0JE}@.H|K!0a@t!F]B *`@揀y2@ d9K!D"t=FDc-:P"Dž  q#B.H0],ub螵ky(kyпzo}ҥ ^u??它v# (yr=zut;g߾Mq?TjjJUI2B2!D6Ҋ@bѿ. bd=à?J)޻O>G"ia9y6<0b 7^?~/5K mx•o/t5m辊'EY,k4.Y,*^ 2ӵ2|믲=g%sΙN;{|c?*R_RP Y:muP)Aȳ})mc9>{VI&^Hj\WP7UworV4)bS삛OڡhGʜ(!{W_)匮]G|_3vh8ﳵ}?hY3 ʌoq@JzlF1]$3_`[5z)SuXLBMP8D矗(m𶦓-ƘP 睧(r Q:؝~:JIJ-geCn<#+_\xۑ%P5 _~FEI2co{DdOKw (lHZ feuo6i9VK")R&-Yl1~yHw$C<(  1Epش("Y,VխwګM\{Y%QPDqjko|cP7-i*X%IgOs`uL˒o1dZaOg CSd/K %5=Q8_-8ri{tŴ9ڭ}n*'?G,ed9_ҫL'z9' ggӌ_99wn\ZqK1-#ՠzkIB`NJ+ FP:x}ވ"M񾡗IhZh,KI9sI0/@R0| D6l"t8Bt91`אP*eS-x.V-1 ӍkБ"öd Ix |r؟u 54+H3wq2M:\PmX>K.cR AMA$gbR[J"{6&"^DD%@xUtx$m<rQ cB5"kXFf/DzS ma뀆w}sD)ˤ}ZD"XvX;[>I^Hq-c=@`@B!m8 uM6o.K!:x]:PRIe!~kMEAŢ,Q3i{~3;l2B֐;֒^\uާ}ƅE M i8AxREE5Q&[JaB VrZs˚[!')RpNXSuBQ>k׉TXkF Jғ'xWx\r-[o~J3 "qVQ)4 ,܏e_>H)o68 H: Wxi`uf Qn"MtN(d׬ -U,ELĚ;O7}6uky4RPRXǪ>!ϲPYY$ECP`sFӶTk_{8?2g&e/XKf%}锿wƕ+;,+vJQW u]S7 .mqE/]NO 7Bk__3ϥAo޼y rE}rx4\q4ܾ~ srK.MMqj=ZjҴ]"{9KZ0|)7q4 q>M՜٥ӣCV?;#Sn޼8>m<':f51*&Xj@uAiT_LR-C`(0]&<>ZؗI 6!qlDE@ 2fӭFxE&:YⶈO76XwޥU2mٍ+A.t @%(R:\GݲΔ{d:IV:^x |d{}$㐎  Ћqn]/6{GFvcx[ Xj-Z;rCyAo;w_AHt}ݶc}lgfڴ,n:Eb`X~@W^Fl89j _! _AV` ,g"B tZQ:z#?#Ӣc0{GVJg)D(шՐ}A`@q?rvr˓ OǨ#RTy -$\Z4S^<*HpXf )3lYT:#IRVe cAj5.0M[˦U{ظQq@[!}6w> Q <!~& M#KRxr|6*vVk Lv-p!e&1M|IjMNP,3U#/SΈ/*OQP'.EԾMKU<)dKv )6cunvWe }7o1[L8$Xs%.nc57?%?d^VtF# ek#I.%^/$(JJ)9JkEBh`܅85XGx\I,M{KSFnc&hWP;LosUx@1 bGKԵO>ezO)ѵMVOtU+s De 0KzBYEtX e/#ޛE[: Ң26>+A.I -1PLbAҥûҐta,fm]ʰi tAeݧa"ЉtFd}w,IOT|vh_/'@X/W ]uO~id@t%!ġzx] 61Bbp$Ȝ`cSĀAćc0*Uzu]k=Fq]+l$(.[/2 ]uCn\N-} $%E/5 'j?xSaPNT5rBg_o[;|oyخ80^7l:iRo ]ĸ.L)@hm$dG jUg&A|*HnTH 39=~S62xm\|`{)[L§v'u<~d=NKwdii-DZi&sv#]ubB xl's*0:{$p~~^x/iË Dĺ& T, HXڐ)O;JO!ERH&lPU>TG,[ؐe eĻժ P>!+r`DQ1y "t\™2AAGo.Թ5T178 w % 5$I`0'Tb=[QRr&paR7^`RdMtM+fh~6@8n6[d k=GGAec~k |qM3=`wg.^F4g@% Ƃ a?C̪E+IemP pxg 07''lxekgiΘ>~W^}_<;3v#*yr|BnWzNʕ}V"$[(ykZp J[vs~rQj_-kzE~!4JCkM,iV1<^RS*\"c+f+SLf GC^-|{sX i+gh/&^n?O_<|~i0m ]lBt\]d" /f|7MfNkrF8R!0MC:p/Ae<Ǡߧ,HѐUd=0%elDp UxP%:d̵RO%AR}^H4XKk;#A8EĴ%SJx'G86wh2b{ںI[#vvV?z}mq<]'7n!ɳg~e8hWdYh̦Rr磏[oEpJЯX$I{TMM+2bo+ `a>!5cw*0u=IЦrޣ 3G=^iMCkUfc~ 3 9_~9fluRSMb]"/bcN'p}/֊o q 6.``B&h͌~P SӎਰN^Zs 76\ݶ: sS:s?؛i,d8txm8e l]vEο;FOeE`.l9wq L-#;R^,W~d tہ-8H3^{oѝ{9=uů vsiutר66O},p*+H*4`û ΎrC=>&YVs 1q.Ǔd)UYAP[F"O)rͲ=zŠν;|_DKh[C5'exgfYxE*mx ϸ a(Y)> +޴ W}p\Hu-kv{97-mblo`vX"Է V/}3O;~} d6OoV-/⦂ Gċn\#ݻ_ :gn\-d9$b2 75( Lk]H&& e;>Ft|p,k^d^_*6c~9Ml,gp.f~ή;M@h3d6:[Xvx:yo } rtyq mhVq}ģcxcͲ6y7An|^o,&_:MHƭlHP9cۆDON_7g?~d@tצ7^2/QYjYn1LA8 ƴ(`Gg(pDµb H~bmB]IY!dkճL@5wgs6Ax`^$hbmq<[^ZJc yll 2Mn`m0s8!ʯJd &Bar"؜ɳX?jdd>Ș]JBC@DJAD:|Z6UwylԆPRcikB9&خVUExୠW0ډ#htT6ita{0d:JH1$,HaWzSVS6Sn8űzqs?k żYtt=B0#8 Z$rIX,Kp4HHsjRT  &"] (IjB9(-ђUK#Y+&=:qlC|v~mi){\V8k0F4-7d<,gmsr|׾yi ^ {F!o,%^ԊU 2{Y(/|GZ.K."ɱl[fT,#zOXsS)|K o6W+֭7LθsCOK$fثz0sŒ4Mi))%umLVut/P:63xFV%uc0! 8YRa$zb}!H|H"8g`!M XΨϼ\r YZ0_,qy2׌ zOZ"}y>|Fcy&umo_C%vã.K?+|ygrcQ_|vLxZbl^XVn1,+Y؇ejBJ)V ҂Qm TCuu|P7-U8+4g61VzV ^E$5+mimK53Lf3LkqIuJj0+Y⠵C+{~r9a L TBJ\nK/<1=\޿[O|ȢQZ!  ,ՑMdCKD/h#EL+Ob,lomQ0;Mc:kׄ@g1 >flF'rH eMY&v]q`t¹`Ϲя,uGEt bhJa#Pk$\KD9M E ѵbɖ "e+ "x^J+5HMkC\Ѫ"FLLw/@ s~FIP"h@nZ|ɕ9>p>_UrA KJw!D2LȔ GF` #aF[ؠt=(0= /@# ~>B)YI WY()ɲeZvGDP(g-`oBfyAU6$L84A)ݽ-P΋cg.BUF[WӺuYT8cqβ3t1,Kv3 Bx 1_xXVmE9QʧTo ENz4YR6UFkߜ wk95~@n53 +|rI]~aO:47| iI,h IJ]\3q|2%N+F#vwƀ;nyoȫop~N5mH!O)҄[Aca}j(Z c5S5doɌ4+ zeK.7+&l$IuԚ-ЕYR0=tyt\1$Imژ>ƤibP)T,sg57׮621h BrtjGf}P8O[g-0ΆuFdP4 C 0! [/-zmAy8)Hƶ i8Z XZ&ALklA %t­Cx Ě$2JiB棉LVAE1! mӢۨBG!M"<lH[J561C p&HdhM) t&Nrq 4N4RVAW΀q@Pip46x`M+¶G{9Hq^-h{ ږ)5Rf˚&H pD0H3ZgZe`@!c QD*IS[k 4{dԜ%.UL)2XJőc?7~⋯V/a0>hH~gO>jj.֌ ! *־{Un~i=kXץwreum[ J%qώO`(dME>rXg0MX5עFTX P"2G(y1>}1Ypx8< % g:33!Œג=<?O/yK|x!gI۾D6NYGU|e9i2l³)u]hjfYS.Hz-z]drCca) |3odYMZX\-ϟ WWbR?)_xg(%:0Ah׶Bv?G I3V%u,j-^%k, Bѝ"BSK-??ap :??98]2$p#4 hwU$bD>\okItuB ix'Ұ|Qoc6iIST,Ϙ/ Lpl*.)Rf+h^߽ĢmRKp0ƝW5uk8.8V̗ ҵ׹ 3Vk=I:-I=US3/$eSs:[1Qk7GIb{a@"5[6Gww?Eמ7n.9.yzY ~yJ:fˆ<r~dz"&=BbAK l,$mSQ&D2Lt'ثfON Jye,Uc@ R$9[N .%)diIBEU3l73\;1kc6hayӲj=߁..Aqݷw[[̪ֈ~`J]¢<\99=Cc %(Pà=<=!/2ƽiLD U֥ }{#mHTJsbC6iθ`MMP2>f2M,$O6td΁!Y_--CLPS(xu4“jq>1"" sfeHEay|o$8 qc'QxZ/9S[WA'lJaCOBjd-xeUcBbgRG6I_ >uc2P:9֛ -B8Kh0"P]$"<:^J}W^2 b$‘jJ8X(D >fwwt9uUF潧Wm^]ШiS H)hH4J@k[ӂmI2 Y cyG%^Ap╢j[i $~Eצ/q$ HЃ Mҋ=̗ HpI6lS6++f;=}Nf9L#ț;x53К:K2>d#@B̺r[*v.MϮ $)^z)v,ηř\j=dLav AVW#Ef2vQEv3f mX=&BU٥FH#AJkvĎ S*,zQ&v"UbPeaʀuХb{έk6ьjB+C)̍M D)AkT"GfG@D6{ v`D?C|SF4HH`#+Xky'l~1Cu햤2^ⵑ9qiEY%QkSm;Ж`N䓜\.⁡ b#$o ʀNB +];fʉ'NNqyy^!WWW{{OS,]L}%.:ߓ1 frN'S)w{_ %yysB̙1Og/9QͰRG3.TvF WW~GlpְYw'#ɟS~~^7~nYO1q{,9xdGפ |m_9>J9:<5?_}zɷޛ}..sq3n.R+&͈4'v:03 hF͌|9?<#og|aiwmh;' Y;NO]uVĐ᪊m;PDꌕ{a .a-4Ja)ⰿmEe}/Ŋ9rLQk2nr] F!1ϑֻկ8:yP[è|KVK~SNg_\puuw۞31nyb.&)ʐ'FY'XL,WטeWg7+NNNp@")s(mPs"Oxť6-&T9=%PBz^*t039~pggWx,}3s{s^/1 b=aARriHwM~u@j-w7:9oʿ_]▽kE򉛻UلBc|#`*jE$^:hxh29dicua)O frK Y6CdTۚ1#DJ֒p(Q<]9b);[,2H!(6cR"' ѹ6h *C%7'dE,ZEYl5"Oo,R-%m&)B0X eh٥t'KٓZD>+&yD*Q>h32u9X0Dr2%< JKi:Ϛgv YkrLXHr$BNE¨ N Y 05wRqF?&MH圼6(Lj ֡h\Zeb5()BhQO0:b1b䯡փZum4_1J^]eq q26 m X3&iPڱe I7}3(c ^z *P7]zƛ<#dKo>Tih>Llb =$Ib8>XpjY݈h˨ivssJXkgܭD ZM" k2{\ň),rM~Z}3Hrqp1 =(:kahC X AvCۭ*X!aWvJЄP:a!k[f}j*'I#JQM-f171Gy>CBLBMdᐷIѠsD/~Tr&:bmEǕHjz/kDʉJ[r FL^PӲJb/@a2ZIĕbBI3,e FVdeJQ}%}uONu}t6m=hÛX_2E笣I rvv׮++@=SߤM۾/sZ(zjj 륢iYgcnY1-(?lZW|@;>_}sc2q!JebL'3{s3 w~;<ίP*sy~Cms{q;ϟ*^-yބg/?KGfcfٴf֛@ ֌F57 2dz5 ͖ͣ?W3z)1>&^R ۞~9&a2μ~tGGT5Rvƭ1Dc@5 "sVj;9F*S]@*& fo)lƯDޔkxyŸȨ2կ1€ˋka>Lna˴i?xͦk{ V Rtg4!HC`T7XI}8NBnQcYg Mq&eV-k~ 1)E&cQ5鈫%BCt2%HuS3hلnL)׷+kz2ky0c6_<LJH;xFa>0ٴ-!H-T5 gӗh&=g<1Ay.o3GG~ ?s>{#&#Ï6痷xx4 b>ɣ-t1uhc^]q|`2qu{0֫Ѩn\;ĀNR̬=1& N8^9M] #'E%#G#dhˀs4Hm#Kz4PCGE e9v$T' >(b_"N"e0 3zHZ<J 6(-J;b6 \ z@=*pr20Qm)K&P6Ecv,[q0 Tчl&DǐdJ':KȉUՀVf?(Hǰ˜WF,!ƕvD6J M# -I("Uec36XdHLl'%U,0 c3 Tlg IDATق͆.%t%*ǘagaHmZIB7:K/ |{(aXٌr_ uv݌X+^Шvʺ61C յp*$bۻB[)T.2MLՖidcN"I"cR0Xg~`F~)(^93KA,'^K!vT$-JPҐ*1\m֘aI4iJKDm гhjJfnQCK3>VvuyQ l\ijFYH 8bQƀ.O2>)$ߖZx۾J6(7") K)US@tPȎ޳l̦IJavzWl#4Be?@ݱf4^yzttRZ _V] &0 Vb] Q7{dIhbdqW/.n;P#ƣ ,WK@qs^63!%' |Ɉ[.nw^oPUW[3> q0?*ج._KVútf14Mˋ3Жm )0p||ӗ8{o!1&ޓSů6~*D^uf6Rtd1V\_vo,Zm7ײ$;Zb)20a:llVGreM>}clg7>YmXmzc*c1RWBi] E|ysʉ֌GuhAV̪ (w8'j %7w-*:R13MK88kzYnz5锺JMe5F%& C H3=9z9˕Hf{sWqE3.iF5W ]XjII5CmŐP-D5tijfcǨ,zɫuqrQID0(Cc-Q"?nC,V %y#^Yٴᗟ>A)Am˷?G'GȱY0VQU#*WxK-s%e-FH Y/ni7[zqۙ8o6KLNجl6*8cڧ)Cdvˈăss{ ayqb,!&FNe%`Т9>eȡߧ^ؓ&#_TWM_2"޼onA%t=٘)HHjT65ޭET@$pQM2hp:TFV5fޜ c52!Kn0*X\E9MHVc F3!H{ЊMdTd"} $BiI*1kB0wb`q$+d E%*Z%R?$M,/fhMb+9d Sԙa#:snPi.W8R` dz*dhfETiP afWF "Qh)JVSRT*2f! w6tZXI<UՐ@=ڈu ;TZᷲ&h Vׄ!T>$L٣.W# x*%l{_y Q١QH]ľ?b&URh!@?xz|㠱eP Ycݷol[2yG(m.RJG{Vvywe24R;AB غi! I`(q=`!Hɑ36I9s +ĭ0V)q6tg!J2U4vZ6XȔ/n8y;B(1m+p.LoܻŁUb7:~34eI) 0'^kR4M6/JJA^o4FUl.[`-L q5Z;6Ƙ)mZc+EއAikP@ (V>dژI>։fJ,+İrG u1MSSW.{zȥZ~wLDz?VvP䜹4]/PmxwD%sW&u\GGS6/ʂz2c|dl 'S3!}LcUW۫[b\zD!l&g^UlY>5w {rbeV ǐAuZKUUT?nKTP觨e~HA5,+[V-9hڵ'Ev]'%mGUW\^]ryyIe J8gc&!eTN}fui Ί_2G۞[s8Z釞Ͷ'Qq{sK lZ91-Y~ưZH1S`7w.7 >b<>F&E~bdZqZc+햮ݠHT$:fPkί<}yMw-)kȚzwu<$q83ij!Z mc+a.K^,鄶mH;AҰu Ngj抓94NT&hXnyp4cGccewֲ}=_ .ױ2DzfbC+|>A3sDPU) {PaVXnR@#D7x#1 ^ƨ\v,Z"q0}^ ƍ Bj4J+XgQXF%H 4YH҃mURш|bIȠcb;q"uԗ6HJ%AOIlNd, @nj[iVBV䘩p)E%Td]C)ܨIwPbs-!+j7T| \{ KL=^g*;;o3gPNHԵ* a5MFiV6YiT0JRbuJ#1;$DE$oTvgihs dbbDQ D !cjVivDJ]vHE2eB= b*Ywp%SҔe1-; h &Gxs'Nw;>Dk>}λ=&o{ԕ!'gtẒ̌ !5gl!!RP'փ̰FSY!# 9WWܭԣuSX,6m϶9Eq1d1J:.s#!Yn=hC$TtbHc1U<=flkvC][Bx͒>?^14h|1gvĬ^=VA],w,W[^d]횮vSUzvӱ!2,sDPWk+ہˋ[6kg)fS;a<3t=GWcepsebc;[& W7bx{vCSǘhl*9PLb:~>a`GU(En}M%?NjONiWWWg-9xnGcN Iņهn9>tLG ќg@VbL&Ag5$BbҏZ];y#.KVTMR#q\aL7}_51d 2!nej< ŨQfcV4MŦmK* C٥/8 +蛞Z)ba%b햔O\ !*v]k7b=َ`LwPt v !%a@#T15 nH"6$)DJtY-Ų=eJl͊0 LV(."oa!R|k %VkR6xœujڮ'$xRDJ&vr_I^N )FtZCcZQb6f49d*tooP\- LF# 1J41FQF"HiBQXs suLn<>x.}g5]a%Q!hlIy̳ϯP 4M#MlOk5>x_Ե+aҵ=}Ϟ'Y-W,$}Oϙ&oHp{}CJ޻7c?&LqwS{e>[lxx|94phXZ?X;lшv3oN'cVUX'c410ZQ8nWU01;v\N&usuNgϥn*ZdL2UZ^^SU}߉WQĬ] mο9 '9=3|:f8"*J)eX̧c`9G]2Odj`:o[߿G儾n;04\=>`H,9RP[V+ڡgI:sh!PF(O&t{FcK̑ݳXy>QZSfc\m=ݖtνd4 Fz׆h>pycsd40mϋOH'4AyAHJkkV52ʉp-/S q{Yּ%LNDEIvPwQ%SO{NmK$|JIP+)al%"V|^Y)lU h*֑T(>f$"TOY|좢lWZ hޟt'_+SLX QXJ"?  -ZqR4͘7Ael}BThQB("6IT(V(ѩ >PT4k2-F (B&EGK60 $*bƺଅ^EaJ#V7dmo#V9PqpI59"kňEҙ*+%AÈ* c20@68pʒӣGmƚ\y1s\f|= ތՄ҄e\i2[. 'wrYK KKeƣWY6$@d2}׳ǦT{.4 ӰE/vcB3-B UVS51V_Sy}N_:$~MIigTĔekK#{"kĶ6H̥B%*#Nk^G_f29-QIAV^Y$i@X-Oi)J}ww_2P:;lt MJFrdrڜCgz@Dm|WN@]$hz׌~Jݮpr$X@U96 لL~﷙N??}7f"ӋzBkK]WZ tWETRWBZҌ0ƒzr3|qvӣVqpzݚhD}ht`v2m1*BN(mY,8SsLf3^yJ ϶8'ζ`3(5PF*3g2Q5 B$uz1öOg׬ل=:ήEȊLkrEVwwmO0θb̘{MD;S|L|sd!̐ސE IDATYWb-c| $*Y/0*3i*ꗟΓVw,&5zMu:'W|/GxnnƌvyG,'#٬#rFTN=wwkج<8t1K5sryqpqY"hRGME]dB }O3|,a c>\m5oIa @ 9aeng]mIiW _Vd|yo27 ިU2댈v#Lyzh 2URe%uę,$U<22+s$M^. )6+54z"ihQ.>Y UY<>"eɁ ZhAE$uPc4CLX!ԣ,d$px%`xaa89Lv8ٽ,!T5Ɋ@ ai*[VB[QV">+,Zҫa %6bdW:2@B [TrۛqO<;p}yE][& rs႗?4 ;?~O_]my>j~t~gOs"Cȴ-j̃E/$W/躎m׊Fp#>ш_"}+kMOeAkO ;?}IN{ k5In6l*X,'ӟ\$t]Ow+B]a qsmۋrb>c U辛m;LSU uˊ;bV|!ȰWXw->͊9<;Os6TFqӌY3*&kOYҶ4[$3R_\3t}=Fgz萦c5amp1Õxi{шdz3֛ )F~`N=H֑t20翠rxp:9G W ӷ0jj.PW7|fp<㣧g80:b=$S5#ܖҠ,߹{^[NU|n)R"eQV !A @+!H $Hb )1h0)Y2Iqn35z\<9Ml hkU9˨wqh mۖ!}y Md^2p}yÊ?GQiѾxXn#')lE rɨ FRǀ3䫓1՚ٖoV=yu~Xsώ1S"u V-(tD唤(i4h GQ2 QrEk9sb=eЌC5~ ч.6Ua53n=sw $i,Sʟd:*;FO^D佻g(! $-*R4$ж'aי /@ FQ$'e1@UHDK֑RM[b&}6lnj0_lԖ=+m4.k|kEڠ:Jѫ&3flȦ=9;r!b ZYye%&`# + )*&)TeWP)cƫ<cXK"@GRbm!:@b(`LEƸ &u h:F4w؈ kCa EzKJcgXk˜J:Z -9;P Bi+S%)Zɔɒ'{4$oQNaKKG k ^ SwuA*){rҢ|JaODLadE+^<RфCHșcga:=$x`Q4IK w `H16Hيz5hGJ 1u5D[ -1#W磻Z)oQv֎"^iJ(2 nx0`]wG>mU{^iv{ֶ-֘~"΀Pue2VVvBhjY[Tn -T l:D1I:ju3Ql\H)Ȣv֒0tXc V1`#єgѣPԍ%]`Z)nfA3ˈ?Ɏ:9(Xo7@&փ{4-/?3ѫl7k· IVJHrǨͶ1NtC!fCu}\LfZJ >); zۺ&̳?r21coo+nqaXw c5t#wG/rq+*fȤ9ws֊|s1'98SV%ۭ㏟aT`Bk&>wU)%ѿ&c-q &|pI@8=:Wԛmd9I)|^aT|/^|C۶ <pXkhzAʊgɩs(CݬOL-b6cۆde hE O.M +1C>)$f_o}{,kڶa0su9Ѷ:^Bw^An۶nFkWuވ(I)ܰS_zF=;s~e`͖MpgSGV떤z&$\^/לKU̯g,Xm6UYfW{%M]|fM4MhiۆQfa[ ;^S,X1HzІDY =9C,ZNVKzedg;oݧAQx]6OXnAs$f91?y}~ ۷܃)*zF:[f|[S1\I-20)r8*-E傋 T{ My⊐2wO3 g{_}/{aO1gZ ɋ+{k[ѧδ9'|i7Ѱ%ab6.K 2)Ȫc:Z͸ga8nVNǸ.w JSrۖрjCiw<9 &EffP1fZ0~ʯуxp<{gg+30Ng Fg$'4vu$Kv"G1L"XY 3AShZ@wҚ)(eAQh%ڊIm,Jr#JӴ%bJ ͘X*1 U@Tנ1)· Y6#jOdi$cÑ|$%$ug]bJtӻ|}Je0,xv{\Ŧ3oz8w ޔ{zӗg!JF)JvѴ !ZtfwT{-7a,U6nDC|TZwD~|M`hCR,<o#nNv:j4ι'q7g1ت*E&W$HtDym#No 1FJH xt~WXWdbJ0F#7H=8$bZe T,N:G|yJ4yu~%mGԨpwtl m pQBN:H"eb?gu5ٓ7ZX@%/wt޽p{#}>G7υY#S0Dx@GK5oODv{|s{Bn9Q5ͺGst0h;o+_6<}zAHY-[&8+Ht:b1Z +$n<ӲZG8gxuvzS\*ws~Op1/1?[_b4O|wo3/xo3Z_*/<5ՒJi^]:&Lznx_}^F2R>˫KNOf>o!U8d''{bw)>|8>9`Xer 'spgNy)kĨZs\EEcٲXIJ0l->IrӰ޴삓}WW̗K=NGLպtEƤ仴"ˠ(xpg/.11Mh-+nkސ^UA&# Ģ,J胒ȋg^'=A;g, !{Te ټ:cqy!cJn2 z(ZVkS?aRh)D.DVVt)Ph:R(orfSFȸW޴gfLF a>[˖i9>8^Q:|dp5STvѤK8%ܶ1'`KaшbCh$^YB8X8[*-ָ`nb0 WS$P'BS%mS3- nMW\ Ϲ7=wbjHu'H;ݼ7,MÛ?My ͦFwmW4"盵 D+E(J[’3Qlٞ14D'l&a-Ĭ  h"ڷ#b\qhQZʕ$6b( (%S8ۣދDDe$PSCъJCVEUAxeJc ɢ'1[6I^P)$  .A+F>jbd4&A$$ Ov,iZ)1[l&bb`"&7ӓfcJv qjX>yBLHU ;uZQ%IJFt ~8b9Lg .͑#Y\>> xu cбǠQ'LSJ:D\:J‰Z4Z{)@"mJ$J 1< c,ӥ yuɁDv &c!`ЄIZ$[ҤJ>'Q9wAB;MjMG:?mWUwc43S_EsG*ĈՆ~OJqZ(?K`фsΝA͗wDF׺D8'Jn)v0%;=;zN&u~D&6UznCΕ[uK<"›]Nh%;BiM1Y"GW:6,@Z9;NePFvPh#E٤7B.}x={+:Fw)PJ-Iƽ;x1V塵׿]2 !P:y1 Rcjū%w^ 1p?b^o\W {N)1119اІm,X.^)VJGFUU`ia* eKIRmCU˫Ŋ;}!mDyk*FɈo})蕆9-"?{jx4`JЂ1Pϓ:kR:[}j_ՂٲeVLFc!^+LJ|)zOam+f+[ƞgs^uH$<&2aKb\7d!׳%J[/D*MLpl,+uR ØɤON+`EkOR})cHϯhuta999#1mV !Btr/T/zIYgTy͒77ko7k;g2s[R֩hm1 >J|IatQ{$$>jbSfLT]\xB'Cl[0V5(la9<>!@ [ꭥ4[_P^' $+K)[KKpV"E-f)!`Iɓe"$O&$QIlb#]脯 z X )f:+s&1-Z)0]CRLjQ’;&ITm$MvXs7`5‰Y x+gČi&+b1A(J 3Q\!ʊ$fm$tg]򞜭CqEa WdRQa0ClwodlGfRHO IDAT85 =H89#\Qa()&LaIČ*E:Ӻ"!F*kKP`i; hC6Bu-( S,U0ᠤ7SzJzNQZEQ$Ò`Rϧsn\x\z]G fh_baɐQdcx!Fo1'fx-9MFI>L$ߑ8.o[+% ts 0L:t~#p6c$9FɄ(OQXb&(8Y-WB;_Zsz/_)uؙ̘'mb0i[/>Y"B7`[uVYb8P߽}zz[5^iOyjW{=?!ag@/!3k͗~2F..4MC*rt>|eWߡ/X6~UQ0B`o|M{;!JiՍZ CQԴAbc=!|w)Slϲgz@W4=ڂ_Q8XW]^8.Z?e UX lzl}/kՔG.xx!&|u5bܰ7d`vrǺ6'KBڜUF"9XW, 1e2ٮGҕ2"ܻu̺^KZAkJW/{VMm̋kN썇P75Ud<(Xoפxp./_`P9F#O !p|˳WMPhfͰ*ɓ,sRr4 P kKoX+fKJ醥X>xVk9kI1qhjˣ!0<~19Fی2є$gxC%WsW~,O}n?G/0N EPbUdm+Y2o N|,X-x;ym[ ^jX,k-s0-iۈ2+1m˺IX[Uf8.H!Zՙ5w)c4sZb0(Y %A 7EEh=eYRbcpb~)eh Q`_VYW4혗3|Ȅ1Ƣud1[q?a_B A,1rBK܂%YIon?D YOd4^~}ߙ;YOMS b>D-%kX-״5)BJ)0?2m )}'YkVCDDVw=x[No3;mj[&{#zC3AAh"gr!cT炲4l5#eQSG YKZFfјBXBcFĦ٠". JLgVQ:K@a$xr8 AN>jF>GrtEMgP,e2 C8v($Rk6KG8dαR)Ph;v`p"RCRFuFJ.h QYJ JamI4rIP(LYf82*./(X5ѷWP&&)bV) yiDhe}E(iLJAPZΊ Nk1yfYԾf lI)`r *Ι-ZMRj2HFYbN"urW(Nd:SW2ƕP 7BAnX-PC-q:_n.C/hszAaDNPV;XV6*c`:j[kwns9AFc8n1=`ޤt6١'o"3#R%h RW$HIf^LB@k&m5d1 XL$.tفR,5jgȐ>&26gBu$AMu0iJvkHX )JZhPI.2~d>}&n0֐B jY3B7o.$b,x|wWu*C (%m#НrD)}ʿh5㚳H[bȓE57,L fug#?{Ti[nSoWr~>'WLuhmU5\_L, -׳5MDz^?G}>_5nz%WK{999f1_R3~׾XZ)Qo($L}1Y\T>U`29čƌ*uժ74jCUVܻwG?G1o*?>Pcưk}Wg#-v6Yr%x?R 7T_MkEX;eiꖦJ"m(Ldb* FCM'WmhHXD!DV+3Sm4AA A b3.eipEɋWL2qWՐ}Z 7z0 0W,>X,3l[IR瘯]lv$jS3mTs^ AZik}xȰ 2놏]rz8aPXkas,k?/I$5tI㾡(,e[cm&BR7ip0aX\^փcf5-q6b vX,A qqW WsP0T@&bdX~{%z6ފ*H1`L!.>cS{=R*1YvѴO 5mBUHnu8 S&چ,)׳.Z]"f>UbY? soX݋߰Ͱ)Hc)C֦+6 &K ۧZCXE`0X+W!%&PYX]1v; Yq}VܹuWJWS)(Kr#6@XoZS&0ƧCAcS&t1YZ͘Va)#[2E;bjй3 ]8[IHD΄9Ds2Ggi,i#.g)ًרhZ!W]od״ H0uBx@J1MZRrh(K YKgHd(( %ađHVhK%AiiEIkKrc `dLlkК^c]㴣R,9DtQ@ֵ$GETpNA#AX !$@ h8:"R(}3튞+ fՊۦA/.٢UQƚ{(KL5:"?HB[K&sA qT($:bȅ@*[}Bŝ>u!+1MpCO;IPomжHn<_ 'O+DRh2|v-^} o]h Dݠ- tb!]X^#eF Wd4$J]|VK%eۛO=Q^(F:7畝/@%R )My#'tޙJ:B"]{"fftK`Z'uckC usJ+3:KN^0`%i㔽> 8)BQgv&ZBLo2YVѥ+: |uV;%t;m~e:M;,UtJ1Y/W7U۶^z.zvfwm_/Fn^߁h1IOv5Zcf/ЖSmy~_0[=bo#񈫫5ϟwQ~d`$]6W`ڒRߌ=Ò;wN6d=菿à/FQ:9'/h[/Y3^RU=}ͯrpG0 HlAeL.׫@m\-a}byAW+oǝ)w͇O>GN5lBBQw+g7nY-;/){+O|[Y״m,JF6k-pǘj˳?.[)ST0,J+wQJ/ܧW8zO)?^z% k-i ;z#9r"t뾭 aњ;NU!LVwTEA")3۶c\P2͖'/_AVLS zM[$^\\3O MͪWrix|Φ|qWWk`yQ! YWhN's~8p8{zlɋWf0<?_җs|45&rzf'[p"2\/ Oഥ,AE݊֌Ws+eKҔrcpY+ '"x`VKԹ*4Esr=zG?WLj=:Ja)e]h6`$Zo^6l?PѨHE)# "*J aҢך.L G Ӛ@C\v$lV$Z$H4NCd Tc[oq*u)Y ̜L[zp2ɚK ]Xm~G +[Ь[bkVx0ZljD$JHU@>RG@d2I[h#V+^Q c )x*ף!kIlmJ& P9S&Mc+^ 3 g5'@B) 6hG.3 {;kTC4"dHRDs0=2yX2ypa'i[iL J2(n1yLgZGv<9Ѝ$_D[Ii6hV)r樐H$Ҝ=Z[TE[e(X 'r%K*c-,Rzsad o\7kz`/6=z۲D׳.wQxrFg 7 0T` W5E]d G֫췖uj-xn82 ċWgBkb(fu6ы2uN1QTKHZR.h4ϩ<? :z[vG%SI@;Pοa']yX讘SwҺp1EtNbr"dlɍBkr.Y{yJ CBVM#n)(zͺc8IJ}2F%&;$6MA] ;kuȀd.[h2cFF V~gܿ7ϝpywOٛ wnMY,ѣT]1m#e)ضnz iZZmV7~=c7k~S7F>Mr~~too~fηgl놲OǨX8!rB4>cдp'Ѥx?{zIG`]F;l# O ?yu69#L!w:#[%9sub\k_e}>z&J1;6|/\1mǵMA Cϯsպf2|?3[cTO~Oٟޑ(V5Ւg G|cN'h8Ir>O^3 ,>xDR:zJM`|>LV3 l[.ϯ89:ZC4bxF1Rˬ1d U=d BØ :S7UY k>㌥51mEMeU6[z1*V)@lhcӱ[rydI>վBH H$ Е9^+(  ̎i_Ա?/Ou 2BfDTW:'O/y}=>ZǼ~/fKuЎm:|ͦS}z# Z%R$&AIgngsȍ`$SPqd4]x%JM@:e6sugOpPf魛:TtbBZD)k%BǙDȀ'J ;4΢ $4]LV8"ٌ `4:$_ˆQ Lܹ.>ALZxHh(vU? Udm\[N9\pð6zV^3;; 3ZqC5N>#MRxߖgeTCZ A(G5:#6sz6kp1wەHZr!sB}t=_7;"O>(&t<}y i}KNL}yuW҃7QrӅ8&o%6Ϸ $2:!IuL1 A)PvmIO\&qΣo.`mg*68eO5XJh4b^Ss_|Yz6S^KG0k)IdtKF8q/%M'Z-3V)ibd !OeEմ@o7 >ɷw6l۶@!(uӌRH/T1V#ļ_k-H {,f]c,g|V~zA{;I.BJO`DHߔd|B^k"% 6"-42◔\v(%1h:!*+\ 1Mzk#Ji`^ަg0\.6<}ĥڐj IDAToIPU%R \yѴ?`%I)K%UUu_ tXWE/qLyvl{Ç(98)`Ӑe)<'$]ja^3 rڪg% &:ML>eESYOg-N]gڮ@A|zS2'c6W 9g5_~;wN"롉L Pw8svlĿw?j{|哨N Tj,ʭ9:gqU)i"`8P {xyAQ$I§|d(&2)MI1 ǰiZ4libW2iOFTF$!irTMCRT%!$UUeYt@7EY1" (+6|h/B\\^q;.5k8<ӆj,kJ_r7}E˶\q7ٳg}8 TPzQ?9?ydjCwOϙW1L飗p0I3}6&P$HPR"$\~"]s#-.I([drpBPk]u5^٭.$ooh{z x? ˲D)ÍhaS7+ cI,ACBnҐ%/>%)p MJP91ڴbb4F2Sn>`LȀ!6WZ!D  `[\rdE 4R 0$6}'vkP?{~3Ϯ|S⺾џËfǞCu:wz?zs`]K@]!$J|p}].08mkcCpmGfuu,Wx+@xd YC4V*2u"W]=pDy BCȀ(m(DZw״\k-i[G:LmK+FFvy(GiH)iUr-;R!4R}0JqrP5hC{DYl'ptx t"&!p[]! *hN0 p*{ن0Oog.2]49;)u8g}7?O]͆ 2MtD=N''35gkJ 'G\qttDqtv\ *C)o ?x~_s{q2VjK\?BƟvvCϡ]M:-Il{5WGVb2'{QڶC' !HlT2P}4 :DfK !Ke@9h}A\!AB hv7 }Jػ~KC:yIqn<(Z+6/W,^-Qi?:ȤҢ0qH DK2`w~JhDڢdcoH"!Ĉ[tԦ'4XۤlǎRjkLѹo]$IPBmC6ȩZO=Bk#DDWj )n'_>~-ߠ4"_7?B냋.jl6bS4GsmDxDYVSǧ]^'sJ|V[Yl [i]\w m*qsq{]: 1CH >:ϢMD3/q?1RH !%J9(.Fsj4Ia_Z`R^'\xMd]# md:rw>d"!^rEφ١G,//]:^Lif="ۚR^#qY=KM1jkc@o+L~V*YIo;Vݳbskb˳17OF]1e']T?7m;"&(y}Ɍo~tOcaq,Ue]eC6Qdyvuç{FuI][w\RMӶܼy!X-W\_C;/.X.6TMG-An+|-\9D7e>?jQ2\3¯$ McN"KѽF'!zKX)k$y',v T#q%IbRŭCg hJYU 24Qh)RE9M[SU x؟M)6%ML+J&Ph2ٶ\uYhM!0"擮g1x] "(${LL9E8-){"KʢatGӴjhJ@ABöliJZV5~|k;fW ;n0kҚO '%H8i8_l%u|[0Y_]+Xl0˧Mx<|jxhη޿06e$Fk@}w>+5ɂ/\ꪤ_q|G-[ƃ[Gd"a8HFŒYo 0$}1::΃pQ3HS jƹg -oFKKnh[Kg!lhZ\]wm~t 囯]h5r;w?`k<}r[#G9P@GӀ2QY(%1f@v_.)ꚄHH;Ƅx-d@ٴآĻnp]՜m`0N9\Q-D=t̮^>''sd {qAp`d^zJVG )BzEd>Ĕ;I臡BD&>zxb:ZDP!t9dP5|ǛQ(3BBxѢDA\^fp[z"8|($LB|! 8CJ"E[ \W@K$JP[G J1<s  LGwGp<*4:갉N ,։h*ȢS(HJpgD4h SLK8O}O?u}Ԑ`ؐ^iZLqr8ѣOs&Rh{At ifN[[궣iZ.6/?bq9DsrTp/a>cq4[?ӏ?37 +/^~y{G~kJ(ŵ<UҒɈ(mOZp8p$||_1j׽'4HͶnkh['z@]+р1O4m #If8l)IJIBgTŖ\`oڠY;2T* \Y6kf7N ^`t=B@)"KȤ?̐F4I @뚪*i,k:,M1Fkx:s21MEF1 mۢ">/DΔ{osDnOx3n,.S:%CʝǹRJr\9n-EY^6cڕÙ{9L&%E۵e[o!aOkQ^v#t#M ]29\Yhm՚[Zi8[Țԅ~mxl!Ĩ=RYg!Zb G6HyzL5hVO_<#4ɌXW|Ϙ8`'$)erܒ ۺeixyyEIN"kxֽ BG) WOQlڦ$'5 ^N'λ /xHi}b En}O_>g6bjdPA"7,uQvqʟ-^V$*kZXV^oh" 0ћW+h="M{߷]T@ C HLa @>-(ЊDkR-t4֣ &MWuF DK Ɍ,)\ BAS/' :[:\ :Ƌ$Cm,LQ5Ky,mmɓР"!ˇdP$IŴ&Y7Sʪ`+YApAh\l2M*@ i3Zž!~EOuDN%Dw`T(QF#u4pL8oݶsDoߞ*mp]Gu 䈳sd E('^FE QB}&F6Az$U]i"DAD+(A5{7r1_D:.! cݥ\x3׆V2x0J2Mʂߘd.bAӶuk'o_qfz?.hcxyvџ{?w{ So/pB mŖa0Et2;A? ^Xr|<?FAYVH!YJbɐgWd)?7gwǓR@۵l+䃄وx̧K{p|{JWxG$Yt:!]YlsvۛMͺ`8Zz:$|xtH ,7d8 նWsn3 Md6g:FMޥwT (ꆽMQW H72JRԠF锶֒ѧ6Ih;Km-eۑw) #h6WZK69edq10<ĘG='^vKkO`/.ZJJl:_Ui+47Ǻ1[L'QrFB`<qp8#ig-A.F-O wX.1Ff\nxu~ぢiKH.=a.)D;7})=|>g:l5(?s IDATyGߺ$C3/.Y )M m4G|@8# Wr6;e(i,b@tR5M`"5T"6xR+T@\Mr2_^!PHcшt8Vb8= bq׌o~![u-R`htǏ\\񭏾McK>1^^1!o1r+|4#]m(V+e(Z@vriXhD U-$Rw5]WE)-V)?GW 8L',s^SVet[W\\g$NExIcov.<RٚTf|Kб8PqCfC@)Grlp$Іhj m.?4Vd-+)"[CMtR`XoQD60D"e{E$mPtm: Idԑ XDI 9:%t5JDdx-"H'ELbpe ؘ>ґCCsMB#uFA 3^ A:,@1mPf!;)f^3dptwy{ض&)!uT=z>yWM<߱3Kdh| 1w]L=1K|$qܫi|QY#\O{EcTz-d?,(pN6@Ai;E4)el!vv8v_L Eϰӟ.}n1D]!<Gw[ Q5>R0f,~B-*"nȊW <^NUؖJY |Q۶B{o\.:&Y#CDm=QB[a?Eգ >h[Ns=gt'g~U?v쌷ׯ_>emc"S\ϯ}Dٞ5@;yzN[o3hM!ӘW7+4,kf)uݠ=cg:ҺiHLp0d~Zʪ:Ƒg[0gU6$&p_a[ϫ/r؛Mgk<o2e>/^+6,u/ 1D:sGqo~}Ox>?goޣkAQZ+O9I\h>%wG<|thGLxy̳Ws&){Cѝ]'@ȸF9G?M1o.է{RDbAY(H&mQ e˻8Gj ,6 eèk4!mIȬ8ZvlY=mG/cf]Y? ooܐ,1|o_$f)X-V|/s&w=lؒ:3%:&IYElM[ߢE JH zF588:Ϧ[_(!eb;,K7P䚎% ۦA-UMQ5)(o~#8`7$/Qk3SϽឈ^L@X@=x/E =u XMt1": !q, H"児)*]ԆE Z:Vͬ4uxxsqdLl}j6}3ݛZnADC;Ȍ#C Q&FH QvG%^!$(&z8Lewgq\QEc6cDf܄lc;ON=cΟq{V&tQ#%uEݝ[7y AR26f2X<;=@0 [yTxk EmBB^z[W-9m[a]Jض<{vT{8:owXl(۷x>s,DP-GSggW'#B)x<&)OQR266HLBh2:Sp Xm0 ZGƟ音\ib;ߧx"U@=<Z2m g/9x`` XY׬[iŻ\?9?lZ|;Ǐ'.ʊ=lqu՜x{wimʇOH5?toYhNQAK?!1) M,eI۴ e`g-Xb@z{/όOg+Vk ILpZkZKlO#f|poRXogWK۪5 rx2}mH _S5rl2dYAB6Ԋޢ`qضLF#zpZכb&ITuR62&1Ն4O98ا:^|E,k)iH3P;2DcZ` 0'I\ηt3wM&_M9:W ٬8G7߸ɿg,6Ƈ D`ӵBG b83]/S0R·lX^]!$0Ё .1% {o26~(Im97nǝ\3-Bu#Rkr8 Gi GGl%޵ G$y -'co27,>眻^]LOwHp(E"mIFD(D@?GG !F1DzXeHigLOOoWrqnUhI0/PU]zus. dF\v+$p2:gNa=t,=`]*;! F^Y ФimtbxG˯{x38ġjϳ @Pd!2IM`906ebB-R>q$Ӥ'A1J1zAha2M U1 U=k}\Sq(HVG1;f4&*ٽl]dd҈V =.Q]O#xp Sg R*jYuma&U[,>iǢp$r!֕`ZMa_HHAjɱ5{_n])ڡRTְ/:ى3Y )cJIGF<귚 X<4aO]X(z'QN6Wװ1NII|rGFq]ԾF"w1AGݱ0h;5 wV]|!Iɚ\9vgQĥ3>( OBx*6鵬JuwXJNNq3'TCZ?Hg|9ҙBP>QS( }B)C}/J U3 Q!z~L%8qȩ@GfBoGb;3PBz@lw&=2L}?K0V{VY8uX!x믟}̲,i Xi5n\Cxgoh4>n*E#qwty pE~gmZM2ٌ)KgᄏϽC\Y|O֍ S<'Jtc|対W9,q0β٧y1q?/ _|y݇A1X.g9_ܼy`gkPIzZk~?o¥-~ lf !h4̦jK9> UgM6xo'k+-^}eSt<ܽ&GrEZ6L&z.+Uf8 x<|xLb2 Ck23.Xh|!?*!SV()XK.-N< 1~L"E3M)%IrX;l`sEL 8H K (ʪ )]uQRG1uS `TT?1I̍)K1Aܢ!$1;6z#.n(L8( !nG( G3MǬ㐴2N)˒nǧ8h6Ҵs4kskN0hMi1ۛeA%/+ȝd9[hpɀ`es:raVk,MN&Sv?{n]ekN'ˊ~;R-ZLfs$euX랳`+,VsqſSsxe ; (^aowĥI`>d(N3D%6ْ~Gu^5JY.Xx0! 'DQH&>D[}g*$B+kh׭FJC,Cu *VWzTZamAղ,(eJBQ6(RJ(K1.`pΏn&pp%>v8+>mQ0 yss4\ru".|u~3/҈SBa%!iJ*`4PHF f!S9L^G1NAA N1%JLq" Cth )equv;|poPH߬A8ANV#e[.[mi#Aɀ:RJ4`cmFV`h&t[V quK*j]i)P&Ia1m2!\B2Ϩgbם7?EptTұqq(x{c13c~GMZsl!kk(3 ɳ NJb9cyr\Z/ ֺ:O 2AK,i]r[`H8 ַYνpڥG7pמ~ d/Sh"Yێlܢջm:>n| :'\bQ @biC]`02^$8%ʂ$R6Ƃ>E9jY$U͑Rxi CC)( *4Q r ˆ(<35&ŷ |]"]ǿV5+, yZ]ݬ?/BXYYa6QsNg=+wrt| *cqZ!fW۲KΒCwU:GlM$ϼpT[בc8:'CZI(Yf!o)yQ:Y }Yt?s10 Γ/D[ !.0J1 ,vL6הZ{sog*8Ae4L:|.uDYxY3[A # $2( CmI!,8k1N!8jȧb: kLc3m@kѕ((SJ-Ry0jQI`>2[3 8$y铫5npiG睵 NPT-g֞qS9QO+ kc5,;R6_,X[]'[5uO_||l>e>飔ь{%e_˕ID)m^??|]9GU/΋/>_G%.o1׮n ?Ȳg|O|-/c޿l% Z1o~F[͐ׯrz2AɈ(}Vwzt[غ|^{%>:߸{{L8/ (NIxv*ݤGJHyeoT7<W}!RH6׶t{]^}eV[`8a80ePk5GBXj.]msaG SxVhvFI6A'XPlu+|X("ӖF8ZMZʥ2ޒrSQZ''WPKRSNAT%'C0ʥMn\tTЎ*i6Vm8b8`:di0sVkN'l>s ,mS~} h%8I+F YF f3HwϩAftGSf$N2Ot;M:RJm 80B yv3ʱȦuI8gnrg Sw2$C NIFӡK^}5[m|߳O{x+oa0i$̳g S%KP+78<sV76g?bh0cxdcsP VW{<}Ut: q\@$v9sh ٌu4@(i"/X,r(F9QvKu. IDATz`w4- 턲syQ(Iybh)Bx4 k4k=2gsA9se$(+=Za6#kѶ@R `ӳ=h\aD=GUvMnZ)O\EpWneWwXLd);z ,vo ULʊGɟI/]qNf>2' 4h1y8Lcz+=4Rf*3+h4%G{$ˬd9QBkZH4sUA$J^heEas}ãSrsuF' #r]^Js=+5d?Wy띇7?_!c~¯?g_; 9gAk˯/5P@lKf)(gp|.Jg@~Jb*Dq?꣆ G1K3_&˒:G'%אRZqs|7^{tg?<'i&!߿ # "$Ƹ3 X >"BV0eF=q(|BU g4.  $FK0%E8$*#G|};o )GTT8/>4p _ cYi$XsJ{:(9o>(( -<;@a^ڑAHg9VZC񃤪r!Gboua|$cTtɆ#,E#IpB{xޜRH#$fuw>@Z<BxE=ĞTcs?1K`X$ \nQ,yƓYuhP!#s^+ <,Y!O쯙1A7Q|^Q kJz:Jx8N8Ր̏rEQU?^\TuFRVtGTF{@Q[k1L )$~vMX) 8gBx S=kR#fchz,V˖IB#kt֡;ss,G,66/5-) C[zg| N˒_?$ ʪ n=yfnt澨?:p/7M[Fur ʗ`6H)+y[ <W/oF M?$I"/}%ɬfeO0Ϲ$(J{ @d98es[luB OѧxKgY̿G$qD-8)7._csŘsΈw޹HAՠ%w<$m|vHK\iO6yzU3Q#,4=NN|F"N>![[<8Sw/DΨ9Bk <(3%[$ADuqEa08&9'7Eƃ׬O\Bk|Q1DUER%V;VB2` Tt2cmjE)ɋ" F3TU)JQJJ8D8$T0&M*CYj3}$/]deeyHԶsN$NG53NcƳVtZ]YY. Cn=qlJ7Q0,,GC G2L8Yrx2F+;XV%4+-ff'LJDPN"jQo2& @:ʢd-FB$عK CG+=+-NNi&H$<<>đdp-xk'q²0gX+8`%nC[.ID]% LgKFdB)B8T(P86WZ'HhHQ!Hd ):VFإ&p[gsMǷי$?Z9@n{Oh҈CJ f'I^yk{p~իyh2G~͏}k=yG@pwxH^p[Q̕޿ C Bv `AEZ\l*@pD* 0\H,|s/ }H)T8E)YNMj6-cA(J#FM!9iin SJ&Y8&;SW0Z!l/j59,o??G?OU>w(xRz2}?1W? O*逤n)R o#7nu %%}|iC O\u6,l>9>ܓo/Cډ?8LZ(RF2ŏܽ|9&c6tđ7KO ,vB\O!>܄aXg׃c^Pgx;V4 GAjz "EYyDAb:P-p^P{rCU{E!I:n3.Of ;tXkkc 1BaѬo?"ɒ0 ڌ&S@nq>7"@ &p j%{{XPFtJB ޿N"E ̊fc` |<-* QKDuvo^qQRzhT-$SKB*6x/9Pc$o;7 ˜Om=3L=fkIg%*>9x<7ET q,G] !|ϙ)x5q=0 k"˲Z*T{ξ #lql/2НUUǷ "|vxbb~69fQ68f{)Gc~oXTfs"g6[~Wx6E( ) o?"O?}{=o׿'>4񌗿bi{ˏӍxtɐ,%>7Sxn:{\f$A@Yh:IIF=|;dJi%_5̗iHKfW^CD"yB J4 ONRpE/pɐVz|qOHl>V]: #ɄrsFt2'2ƒCPL _":5XSͿ[}JS˅d8&rb cJRFvpL!EH_v%L"uSN*c*b:_0l`ey.nNg=+?!At>#/+{{GToQit:n3+q^@B+BxTT'(J]DDT@I$"q2OY,Ɯdax2u1pyQ?tAm4lypk.!boi ]d3Nh4Z-Ʉr GPjt?EO]c{LPE!N f^\{GlntEOR)TrVM˼;l^dkN lN*@z4Y[iSThdXv6W$IW!z.vڔf8" !%F@'ke>K\vKbvn7d4XSW[rW(JٖVlOe]..'.a뷹z Ko 3y}Jl_|W%9~a/gfEdٜd]\_g H!BFBI 4,$QSh ,9ǻnmPw]zŔ~^[(D 2`Kh ʼCIwCBOrpl:f<=7 MT,I|ϴ `Q@"DP7~D a' F X <L XH4Dp]A/ tL֬E@E*;ꝉ9Ξ*V43i¿(#UbXJR~-_?l3ڸ?:e7^1} ]kʢ;qB0_,R][*J]aX{8(uQԲq B!$7uQlN)Gc/5ԜbݹT{_rXس7㯿 fk~-az}ryBi+pH+1x?X \k?gi2"N96@ֺԔJƃ2P\K"a RHgMqAm)jX}jhOAq:zݝ%M"b3 ϰaܯ͏>KRtRDfCgqa"*DAaHe2/fIeewfM|t2dc}| lntUIU]NݣL{S|`0wm\$NB&9~dpŢWwve4NfFW:f &hF2'ϗ $\?~}Gg rnx͗NEcmɍWZ\d9`%š90?ڒ0L'o2;N|xRgz/t˛0jwޖeRLپIDާxp7%V%4$LSOLiBm$6R Ɠw &'T&IE18(*|BW̗IVq|:% nlr' &aV/S]~ӟ۷+GK=<+;eI"Z ?J%B)hБl88/5i$hc0lMFBm +8=kI3(ҳC "Ylnsx|Bۦ2'`(!J/2V֥uX[Q8Rί\\VkG G~Q^Po# %误xvYO\>%^%vm3u{ V#8v?FT@"r֮^ >fAุuE[**k !BJU$TpB D1NXzx-)f9i%+}GX"HOu]3L6 [U0EIƜ/DFyƘ8;g|M"X`Լ+d8-;o`mH3YC<F|+_$|3d1~?C'V;L $1PiÝ.mTq'ȫ-nf07>S&rI8A(Tū]qh 88xȵrɈ\B+ms2dmN'bLn8{WOK"1 Q 8>:6Vh[gsܝ]>R: pBd4hPKҚPJ%a =ecS+gIxP57xEi|?StɛqiʟE{=>>ǙNJo"xFQ,=LuVI@!w&dJ \fg,$L'C88Y(&goqqƖ#l(OXZ*UFk%p%TEc\HAk+M! IDATlABWUuFhFNW4 P䕡0gKqĺfLoo߇g93(=_ j-3ؾpF#A 0Ih.!n,x? $@0Ntp8"CaY 2PyHYݺA7AU -4V8 & X.9>-ugLYP )ݹ? _K)UKI&HP!热W(j Ea}J6;;[*@ tUQ9''.l /̇z`rL@Q5k7N&xSƳcAv"RϬÐ, LM)tdAp괙Lg.BtU>*K Z{aDe+$Y80/j`tya8>:i3}G@m0BJ*] <˵XF8h$)n"#NzBi-h6uPTFP1Mx(b Xrsǟ<,R=wk\t[-r+wv9<+ytį]\F I01-HU "K%<'KӰr6RCW0phnm40$ w>xHLb\Üv@hȋCi RN.y.(LHbQ-4ȫ>` JӸ/=­ _,X5Kۗ}"~{}z者ԣKãǏ~kta >7v?k^sk|]7w#0V셗ANX+m >j`gl]m#.h& Ό|||>Aydxt8F|`JAxB42nuZ  $m 1"lB"q+ .4J T%QߗURq𳳒N3aVGD$Y`}v'U), t$<|o⣘/zHO ܹA# w쇚N*[09/qeGoP-F!wP2>@`X~#>ytTuKxŔ+޽#)$ewo,ت ~9Ys, ~r/WTXiv:x12>?O "Q"a0r~rx93Ҁef6b4.L O89SN.1#8g>G qR%YXJ(`Ca"z>"VEɉФB*rBn 쮀Iba F ĢBq /n|ag\݋ KpIɠbLUӐ(rr F:b6Ӏ ڲ>cfn\uM r%UU6^y\ӇjՠM0 vp6/,Cɐp.$/ qS!Ax::R 5tm^{5w_d 9O8^ֳ\.5pl6A h2Dw8[2>#~ۿ4)RR=_z}l{{팳)Q,LơyW_o&_Xkreh͛[$i'jE!Bʕhc EQ!D &{$VlnSiX:MۼZ l@yOSUܿwȏ6G|m>r VHqq~?D8|' )bA9fX%mѥF"0Ț Q/s*]։nJd,S9F/qy.hZMJ&tYR&3.F3ӁmΆ#Fk6f/|QrX6-Tl5yv|BL 'cn_eON%eA"@kSS]e0hs~qJD4MHv NPyϬYKF%Y&d*f>ˉTJ/tmhk*[]J$:˥hw~;l4"_.Ȳc >A[MFĽ!~uQxFafc5kdqDjv4gyQRs2B!&9q1EW_a{[䃇K嘯~8:Crg_*"P,qGU,Rd̫1ͯ'θ9{̳XΦloe2smph\\5In]ރDiIA#ˈ$8g'Z-' .ó''#\— %M|-+FƆpr>:\YEq )cQfAll58>(Kڠ``(C.v8y3XcJAm_&E >/#~~޳%ݤr6:.ȥd_zg'|{W=MۡzAxXI3/=o5P8QJ6q)R1 n h;Ů @d`xzA 쫎G#9G+K{omf)i@thoDY~OxzXF-bo*)h]x RW2v7EUUxyp~~N#ɰRK(q i! s6ט'X "J?D"% ,f J,F$qB#ia?'og=. GquٿzE>1Lxr$ ELl][,{N$ޑ#HOae f;ܺu dmIM*<0Y.f݈PY(7Ļ?5%Mr~O`$B:&>ZyW"PсT6q swxC<{~B+fn ] I#O'X~u1IXfKr1R{|@Jxo\|]^_x8хR䋜ۯ챹dpq1wͯw|orﳳh4e8(Mӌe>I4MMڝE^kwL!8MSy^0_ 0bmjg,KJ3/YspcLJ>⵫g'~(xWr.{|9&m8>~>GKMl795<;tz}~cvַXd2[p֫(ʂ>V.˚bQKgӚ!W5WEz)1災_!CEelsF#CY9X, /DUZt2JF ƩBŁ.oƧb~+c̰ۤ.dYhFCZp:;[[x ;dYB/)+:t1!3W ˜xLT}Z%2U 3}X_Si6d:O0[$GgX N%%kg1FJ$Y#YHBbΑ)y^Mff#kXUY2WYG^g{ky)~F+W;)<|AΠ͕uU?b۴:-䋊N'QK_msm?VOm!"k$,{G>yz7'3N/*{C^yǤ, D#%14:MEMh q$X'%eYH>k ZsF*X_\ 'TfcGEH8dF&VƆqOڭ6E!5((pe4Fk.@ܜ_ sL1_6;W*QIm T*΀f T IWBG Rʠ'@ TMHPF "(9(J>ߣPC #*4#:T$1&x$Euԧx,RLQG_Lj|!Ê(f4$XIRU.'H/$!DeJX;ON`(jiB&/O/'P0)~[LS䪐bMБּŊ7_!3m(*^W@V'iYNBn4Uhc*U] &R͐GhkGT^`kf[šhB Z`z)#@Z!JSvS+R t T 8LG TPf;X </HmKZ4QM޻RR>y< '! SNgggj i+$D-xZ&ENa6!YǽY! +`6T5keo*YY걫1%k}.K6zjϖ=L5c:|o>9ˢ, k`(i?~DFܺh,G)Ѩ(4q q"=>{]kDqᝥoc/fXm^Ϲs*6(ܿZ!$*pGY_oq?_}LQT-f53C^d2C,Y&&?c.i;#k7k7G&C:>ރ#* iIӜ/Gvqg~}%7n]׾rDruN^,+J=g@H * Z/') yd2'BCugt:= ${{;#!Wh5hc(˂^-> ' ʢ9K$iB‹:q\mw(XgJ r( CUbAlF=<%k.YJWyIKUi!8qDE E^v8MpHaEz1hƄ-$"m ^˼u'Fk%f8H4%nķZ̗锝u4s9WJn'4kox~4Ywr<<|v|)$f d<@7R.i6TMg1W^#1\@DZszv:U IDATٌ$UII,V1=YqegÓS9Q3αZ1 2)i6 cU9Yk7ѥeșFRI l|h7QJtv Iю…Y*I(K..yiSt^e]K{x&|_ĈxyyNxg. %ʂ?}+NoHRn]g{[ 1JE0\1^+^)׷ńb^>R["AMIi-|rU>#1inif]<8`r1a/6k+Zev3DI&C$KrsU9{qBkAb,&CPMXij};ՋW"+G"ַ6؁7ʇ-2J1qӐiE-$:Cr],6iv0JP9*tJ#4#+dǘ$i g{ ?|ь,\Eѽ” /.XD8ȉY՚X6%JT,h6 hؿqӧ{=C#k N3Xӌ"!V$F |DN^T e G. KĒZLiFE؇Fg,V(b)BREilHk)WQpXot\ "Q#>4a]V~|.^Bet`- FV/'ZR.M,/2pbe1y(\x+Wpt~\p@Y & NO#I1*BHT[k=!=Z:2ddz; ^qj]hN~e)9$7 lOQkkF  !i9R^o# DA)!IEVỎ!> Q*V!l"yȒ2OkʴeK`QxtUֿGq E.e YW![0*/ 4) M+.yTb<,B^58|ݔ/e/tq#YӺ[鶚L/b5F^QUwy ]9ƣ%\\lnt9:)fcmc>(b[>9Aβ(ɏofowgG}pV{X=, uEIYX ,)|H){CNqz>{~zO?9+rqrrN!X[ms}u,KJ+ ϩ⌿~g(y+F')q$q>(+tdB;{<}vƕi888ƍ-4D ;[X <:Q3Ƴ :n\zdJ)ѺBE͢r+w:)ɇ`m_ʌfn6)s(hz,9邍e3r[pL2>I$I03+ :c19:6y$˚Xְѧ& (ta$R)JEgKZ&FB Wvwxf&Bb\ sKmno "ȋlɵ4є'ln7ms~1d>]dp)=G5;[:P6$܎(;DRaJD`YLvH)(idt9 Le5,RImh ~>O%PT1F{:}Y퓶,$ ͷ^!ioFQs!AHZo,k$ ,%q2B (J,тRX!'38|\D1K-GH8?gK\eYF%BDTJ"GGQݩ8Ofxk)b 8Qĩ,% %RV<>x8 %[TeN֌~C8"k* w!|XmPU&R9O^ ̐jjFW3O2yA=#$Ls /_>/XxqG"9BLؿ|yxg7ݿm8OY%\)%ouv^Ԝ0&l%X믑?}==GJy7cцOxzx6xk()oA/h?Ew) I%RA!o g|{0%?sz eYrv6~fYsJT$H*{e1X4tLH*f7Sܹ;\dm)Ih$w? fkit ` QH3sGծA/|_Eiz38m Q5zv&Mb$a:!t*Y#CJd:S;{T+ %qQ9뜍LO..;"ۊNmDE1?XgvZdLGrx|F\n٦*4Q*:CUnR SZ9Jc#K$GW}$ʠmʠ&2$!\2OT2/:XЛ6yuFB h6M R(J|B TUʋ2=9R2/w;8[1/0d<:8'7kH0ڑ/l ;LsFcBy6v7^x+[ s.#^fj A`QUk 5V)u k62b,p"t8Nh2Rxl;4vMyKNAy6H:K+-MPe0vZXX,s4\B||Bdh]l%8b2Kti6!bZ I%Y@i5b].&s,0g BI 6E%7k8SPٜj/Oʈ:0WWjOنa}X_Xwk(!lV{JSqp߸C{{G ݸBC ` VV1+_re:.V2 qe8["Gwj~ xgw?bzt[, d2?(R6眝wFy0އFybLie--(5$ik *ЅID5Dh:QGZ꠰^6vLx*'"ʢɠ f/߿zL?ԏ/=k ibK_6?b>+Y\]_5@ *[SBBRZ`@y$(0UL#S䅦āu<|,X(!Rh\ ^QJ4%Y%XaD%yn)e$$VNJJYb}B/ 8ř9O,TRI<Q`a / "%=FH^lB*C,"8D*$VjVK|Ģf8Hx>HJ6epѪ`b4 ]ј(s0xA-H:'L۽wa{ibEE+A[I㌢pASIX"b03N].Xlw9=]k]k5JHoSk__eQjhf3H0\) H =S p8[D?첪jI-)0&d{B7;\Y e\ XHT]G 0H c g<0>d K *B$Lmx0.nk(mm02.tJ&584 tRi7 2.sXqx8t:Sx*ɌG|3zќ4IyzxFF)6{HkW?ۿ6wNTnj 7dl,!*bcgw7qc?އ'\ gd$i3B.u$pUN+уC>UeQ*08"#^"k4x䈍>Zܼ#b}0FM4LF]d5n#:XE,i6rNpݔe&|LZX0跙yNӤTZ$iS,PQKENgssN GF1JIm7(ˊRkXЎ"T1Ylh4Macm=ӽ5nk5v!kkm.'M>9n|d625t)+kU8xLb8f}cmË),x(e bqrA#kL'3Dw4!%^$iTA@HY6e PJ1nNj 3/ /ʫ5S0d)ߍw8#lC`chIX4ŌggRśƚ&+) ӏ 2r9vXΧJ1ͦDjs^I-θzeNKbB12QY/%J E5()N<׌=cF %qEIu6(,dI*f9H"tiIҬNhRUn3.i%)x*΢d6E )p&L]'|@T4Hxq ^5ł8U  ǜsmoT(a4*^+a.D/'x,,bK,!>X%4;}9&_ocdpWy++(&dZ#m{c958#:>++5ځt@yELqau.I|0z vfIid1pQqA,828@ _>wW|d1i:[y5EE1rAe+P4 .RBE"hԯ^2Aw)]g-q,ؿAD1B ,*b 󜧏?& tV+v}$XG/hO0b:V#7DIBmgH,MN!#HUK$#*ZCQh0'+I—$Q8b!BO("N<\RBB'Bu$%Fa+O[*8@F 66H`*aA R8ceIx%Z|hd fiȋ1ZZh<ŹD RC̊eg ׷I$QDe}[iXAFYW%`kM@[g8Y699_Z^}+e(Um-A BK"ANQG3x//rD0}PA /c+Wk=Od I/uJHb:"Ĕ68 Ѵ0x)l/< tDB4SʪŠ7,9~qֻͥ2k_z^nMD44hdax`5#^$ЂVj("bڲrϛw?k,fVf|u2=>v(EZi?Uv dz/L㠭>͢kx }04z=̗q@(8* VHjPMY"m'eގ^C@Yug9x't?l3,oXu<=1\2Nv{L[@XdK)/K> Xfe#q8x;I~%0=lkWM2rtF\$3-jz 3FIz^֚٬lη{ 3yUuqa:+7x{~3U~1_0XqxZbۿٟ8Mt-FS(2 xqP푶ڬX yG&=Ϭʦ ?GN h 7?;um<ﳖL,(8p6>cF,Kvhp`@;Q9\%׮^}(􌢪c9_0hMfyi6'ԠG$Yڭ6JJ8޽G̋n1򂪪IS5E^RV5El!ۗd/ X[Qjݔ8NQa6 YfyyEeA'#*]C!U];X'O&^be,9(f0K ( c3,n~Rڂ{YNѕ0 nKqRJ6yKWxg$ 3^uUptnqui~}j(ǔeHǜCL 8"J"ZiJYUI&8[b%uY3+ZzW SR1ߣ*4+F1BBIx-MChVV:nQVv+kf˜^E@#ÐZmgeHViD3\, #%ߎCm)Mtx%k xkuC_s L[FUV 6\s CbGyHXj`X4?W]j~ ã IDATe*OKdz #}t_拯ϼoAf޹Og\u\BHBK3|~|K_i-!I1+|K_kP9FklvZDckkR?CF˂(X5!7? '3я>m. eīxn+0h#V&!;Ξ竝i୮챜ADI׻5|hvE^pi6%&CfU~E=nBQpHw5ѸΘ T$`rV`kMvɊOhjRNSdKܲN0 Cdh TpN~ o$!C%*:&P% RYڃEѶj AJ W#CI HPY#X#($IxvMQ(rky73޿qTF(ĉ !c%tO?AYj%}L; c4*epN!REqNIT7t,PRH_ Trq i{wѺQ] w& /=x#㓳Q֝w*n+|niü"Yg7O! ST/9`)W(%JţXWƟAfyePae8Ǔs1#n֛8PP*)Ӝa# p * p&rQH B[xy5hknX ^VX1GdcXS{cMcbݰV\5MH /(WqKP9~/yYGԕ{r$»n3DÊ>!hd6+`\ :G'c1oFϮmsR(0Nl8âzWat{n {l x7iS $d[=4**y /v*u拊17mO~sw%MC˂y'Ե&Ų7_䳟} [ ϸI"|{ W+ p?-Oqw@Ӽurex`<??"[,%qFܹs)?sEk޽G|׿ӧDA/x[;Kfl_Eg35~űE4̦<ϩS1Y N-}L& =2uZY,(%|dstrFY*Ԇ|N\z1{S5O>ckc$R lD]{ 88鎰k'HIUWt:<Owzg@aGeK˰ץ(rPjȪNेU È04֧8@UEa] VVјYC9*~:=D%g y(負E!RGSfu/m!(|Lգ:cUALSZvL+ (>Qj>Vvn'FdWIÈ@ƴ!> ф!YmJ±s:Mv[LN'ܽ2W>?`ZY6;c>p̍CIJsNG:]dɌ$V z}AjK؊Z7^g#?|Ft:m&J)4 ~кn| L]kPqeOF kEEUgt;sC)E1jtMg*/Uΰ怲95 }G['FVZY{^21f? ?X j"Ns@X%FǜNs2t~qA_ͫe$L'MUdT%r}+76(׾"7aZ$I֥Ͷ6ux("UlED8nܹF// jM؋YmMm'`)R:0Z~˛ P VkoE)Ujs,{#qf}gȗ~6`6-]0i\!H (/qu3.âq$d]n>~kY XXd!K'YT;/m J _i%6[5=y;X,V DArNZ yEU輢֖8JBF1芓C%aA&+k=-^Z }FeF#55 ƷOh89aD ND5NHPś B٦A]&KXBs&Eh2RH?լ|*ҫF GڍkB XEK&uC;C !,FȪM{V1v )"9WZ(Qo) DԵOR +h# {`ڪDejxkus (N$N7WZ$U@^Yk\1L놵\g%稫aHh 'Y}&Ս%UW|o:_=Kyjd#UY1m6 Q3z6p:Αld􀽃{w>bY{Z 6ThBe|p=%/4Q;fspG(ao ap6]{r36oޣkܺ՝u>\ܾ}O2.)2x]\@9R!Ͼ|nÕ[8>kT&B6װ>WY,Kɖqg_a:s'<|v;%Wn0,|nͿ!7_&A WqNڭ2PoI#^y,0p˙ALXx8-y^=H֯;<37R %rtD?-jia(IV!q 6#`^Pd.mnJb$x/jB<W˿+}% 7.ſ{;?˿Kҋ 3[o{'cg,QR PQx6ч{$lsJj[Sh*.1RS9O14&Np@" x.]ME635B)9)*3\|G^)I{ 0>A3,{ALJceksXAmRQ[^pDtʸr6W "(ܼI!°>X'mzG+\ƌa[_HƇDQBe*j1ARk?gT*rPD*Bbd F4sA"]g*DbQAAs3ט0Ak=kohGYY :N.^fz=HŒrcF8ذ^X!M|FH$NtF`3ds,׉ r P}X*/[FӴm*pZ&BAP5o~pm:a0`{kGGHRToʲh| ҁ%ZygN"#IY85Y!R8 ,E+N(@8Q$ O9k7 T6G*EC9al.on Afe#> mM ͺL}Ίzw5`W 6^S%6>ʲrׇJǣXU$Ebiho8ۘy^Bʲ:B"%0[,o$`>KJ F+B=tn.iGmUs"/7`LKg슕\_?khd|.[}?+/KZyK+O 1J!Vy^8 NG1\,_祗`t ?o0888a̸ucҧo\*Kq6/p='?qєnE3gDq`w>"C66z:1Grxr|/q?(j6׮ K#Gg|{qx4:ĩt<3~G!;5l2[nwt (BI>OJo) ƒ*c ハl;P6RU Om at- D&G{Y^ENE1Ny)kgO ֖bICiUE -׮\B BڐWNk,Q2ϖLg iw (˚ZkHȖ7yӆYe:,[XN,MT01˦("tpOY#N1s6 >*8A/qIDJf%Jtij;)1Gt: -W!U@*z6N (ȋZ+DIplpm鈫W/qsg?e"˼ڋ|d{ł۷Rn\1[AH/ryL  qprY0hWglnvCt[u|֢-quS2gA*i1wn\&m)V'ZW2F*Lٙ"i iqyk ٍ(KPGXkv~>iUV+F8C$#tSC e|)J":ơ:R*ϲK(֢,oEX]BZ0N;\)?fj}~;:[]-r. =)dgK=KOx>RsY]gUGpEwyLM0Y $'GKo'{0:QHz.߁0)yIi S?cc-}WA$AK;\f8Vl%̂6ؾ Tq"{^}W#ˆW^yb1{oyS`p![1ĭ/y<1iӖVrM~_`0XRjT9Tai~d)^ZOvK[l1'3^ A 13LPE{ѧ=!Za z i@IP`lw0b€?y.37I6P뚸ʩ{U4JyhJfV@6?c:P, dJ/ms6S E!Tr5JZ",>]f=rMPTMS<@B(F" `u.*WiFh)׺4'-C [1&"jD+3k s~>̇&^ެ @J .-Yu8oHaA?Mđ11 \McM-44hr)WGa\5 kt=৑U"s'FQE#,;]R oXh,JͣC |j]ca(+(z7~uj&%fӜ۷vxh]IvwOucNGczݖ"2_,8_R׆v' BP3fWB'hSNG <'Vi%$zE5Zm8b{/߹|=?P˚57^:È^w@QE1N׈&BeUlt£݋Ͷfm1Jcʛ6la׺) \_th4(jOFlnnrUO9Y.f, 1kۗbm鴺5|N|N"Q q8*Z7%(+t)a 2=Y62ƀnMm,ŒV+ Q!bpgKYAF5N,+N_[c2S9kHiY Sf˥B\h2k2 l틼b0[q K[2.7(%i1Y#:)QMs*8=04rP=~J,N rI{KǃscQrd`>->prtFGGmȄ BmP57F1 eIkiȗL[K2'M(Sd%P[.CF.>9`c ClAק FŔ~KhA ܼC~𓇄Aюg{Tu`m@GTUA % 'a ɘ,99[yi(8g(,tTB]# J K)=әɫ5qPsyKQjLu [ \'MS1~ij\$o}ՏIFnk)kInS2`ӣn\k2Օ"BB`4JAr\paZ,pr}bdxY^} *"6A`X€۷ʧdq4(`@?Y@`& 2XhR`&fekZE+W lABC *sFB X"!lAU>C蚰\C3%)鈟 IDAT|p_~]*]5LaT:g^fQ9 CIE6$;;~Kwﴨk g ;%ѓc*p9Q{XPKpϛJLjMCR*DhX*"HzQ CX1%B-dY$qTO ч1FZкc{S1THeYnЕPPA#wk}~ wW$IUECw_88ڻFPArbV6,kssg=/]wbnV_cΘپ !ka %h+uknINx 9mjtU#}AaȱVxHpkPE7|ܿ!ugQ MM)jzmm+f)Ga<$|nk [cyYj cQ뺡zm5j/p4kxww4CCڛZ rt l:41-0,WU 82\cN:&jUC=E1+қ]aVlݡsNXkYd }-߹4& &MBjCqAA0b]0: u>^LO8gڢD)f.u}Usr2# >Ds^sqr?BkdEɄ7/^Yh!ag{ ѺDzMJD|<(a##ATa&' Jڔ@Lg'@W5<蘵~E67(#f鄛wT5ZTtsm+6~[<} *kAڀ|KI:Ժ&/jևk"g}(kRF);[ID#8w\}qW_ͻ,ENp5:tlrƕ&ٟ0-43'WQj (iu[-vG R6t]2+:$+\# 7}|Be[kmz={QȬ%^N(åׯ 3dM:]ZiDwoȧM9sEQDNO,͂{ܼM sA3 8 0:25N4!Sf NW 7{T֑>"*JwwƳ4_x3ۋ~R:הaI0*ƨ hLNyzw>n6qP P9`<|g=PJhJmL& 3x2#IzQkC1{F»LO~2.31!b6gseZr2Ċ!c#⮢O0zgk[y1F5eQFdȨ D16k3BU*!ggǼs=;[e9?ZXojo^iCU,<{(qUEeI+rMi >%yaKTăŏQ"DtQSf)BQ֯Ѯf9=#tWUi\y;:=&gSnܹ[Y=zG2[TQJv㌵Da^k\ttS~. €PHiڢkGOR5qRyvR(&h|(J5"b(%J0(FS)b@ @90D@C7Z|+q$>;T !%yfc\ࡰbZGUV';FbP#S DcteS4wCn]4: !Um!`Jγ>sRxһ'ֶ\"_fYP ^ԺD4b1MT`K/7a Bw?z4R 7hϰJa!c1p|r1~(8o)=r֍٦kbn'F#JB),8g8Jx_ Aw'2ƒN":hYY.IJ]WEY)oa C8h K*ʲl+Œio$K.qx|eQdG8mڽ-v5:6 !PYV! I#EF$bA89GnB5HeܾCQ|@ZbQ0vxW1|.7|Kk<ݻxM=;i|Rk<⥗O~ kyc|=0"(фvӧGQk 1_.wop.Itm0dd$MSw'%8AP(:l_{d>AkM]k",(0/; K=3ʢÕKzh~•- W g'TGj9ruVr5~ gKo׷\ 2{0Cab{s*)˚ <r||Bh%)06ՀB ^~uƌI8~cnߺʵ+0/\HVGOO-k)y{|)yl0%ǧg[)+S&OpeGVt煫!it|[; c >u&gcSЏCzqrk@^TOsF¼0(#I":u޹vqBQUh8:RG7 $U`Ʋ2U+ع#8[{se?s})Ր!nDC&3"sT$qrXy@>*—}\Y>w!Ls?6 bd%)sjbrrt#i* cHX%uQ+4Jcs} FTE~@ΐg1J(5)>=d @JJcDG|7 JHOH]ã~L\.D=<}B|;L7fȐ8ᣇi@Y=f6/W>Ij-3łg/7{c[v}Z;Tͱomvl0PeKy1 ̛lCl`Ȑ%'nM6;޾rMj]\1I V+wﲹz. ) ᣟiG$>o|WAF :ElG@xG@hZ3pxwk0(@sH6( f2tu5k&"PH4iȂk$*p8c3,ÅybY6./ |еF*A,E)ΗGђ^o~^ >yFӤ\6l!$N泬g[y~ҵ/h}׻`;&`X].kSxAb "׺IҸDz=xց;.m6HYp޼SE>4(uw&T0ٔa V:w뵰Ɨ!^Khv]= Y*NSfy )RJ㩊^r"Bak$ Kjc-d<_`,ٴVbtUmLGԮ1dL^2b _82/!\X8Ųt\ 0XP6}Ǟ:px~Jnxj\7aT+c?w O[(hh|5B˵*EUr\]"βt:x遰lkDalV7soach4p|Zеf>kWX%[77g\!wooOacks޾ʽW_#^}xO}6ﲲ4>)eQ2ϑRRGC)৏v{|W>qp>rxtbQ?o$KH7eu ei880/xsl7Y_mGN#?SUU""gg4Ƨ,y EQq64 B([|26EAUL) ?yYp:SVNB)6Wt:̦Sf4ʈ¨a RJbPiDex~ N1,pf,|:8a{xn^ứK9EϗoXyK}#$QdhB"V 6^#9C,-֮?{~ -<#%~|7B_ş'?#/8a?3ΉBpxtoگrme+?_I(fgo/~ktm,Ó#{om~t,} L A)ʌ0 HPVqr~/):OLh(uIt.P9}·#)2,!GyM. U>A0I6Yu:gzA\EuIu.*l] v|yQϧC~abVVCܸW5GG4)%io~>""IԤ5kӜ.iܹۓﰘ(k͕-)FB:T('.Dj #'-6XYh8HKY|)Os H'%kk "h .br.KT4zAc6/eؙ"ѕ˅,v|k68'g*X^C%lL^DyxAĶܪ&u!Bҧ|ԑi 5Ųi G]VXm.? f`^s(KS|QNjY _P Pf-l֛eƿ^hQ0p X^\zH8I뚺 %PjG ARi YHM B5 ߘ W }T-yVG mKr>g81XU~!IgPQ 7l$.+|ĤZ9/&*gg `44( m Ö#%iFXx-Ȓɘ@-h R)Z[>xS? 7s _w $ ^ϾDYU2іS9OG.Qg38ٳS뭕tezr2CVV:Qlo_"RxG?d{Uv?<$ b67|:G( 4AmeU]W>[3N,I)0tZ/Ҧ,~ JQÑ pq2"P!aD3V-N A׎,i3*UsxxLfcu(X"fEA\ |4i&mlld,ʒl E&R|9d2-Vjc81dYJ'% `4MpP0RNB&R:ڝ GLc471+V;ג7 eէ86Yax+lnux>dl;7;&9!/b# 6:LsfyVoN;=z6J{•50E񅢵k8 Ҹ#% Ɔ^7cw4[%MJBheq`qZמ=5ykkکd}pL ,Ez A dۢ.Kj]e֖־^`4.Ĕ-F`j&hM'|B`9*1d1y@Qhˬ/jqi b4A f4 ̋vBd``<\`V]P0S7WX=~48xj+,IHn>~nln9Bom{ʕ/`jn~L ln_a4Mr_!||?"KzwWz沐'gqq IDAT <:XC@,7c c]+CtN"8WahH$ؙgOt<"KZ}7HX :ȸ4*XOviU1@fAADŽ"@[h?0>$RbRsp5*R[D </_qBz3 Em5§y 1.@]̟Ka9sƭ\1'ch$Bvx- Ԛ}|@%t/<V{f_e7Yl( Wls ON=*|yfp"<׺DA@^iҍ߅@I¢㬧 67pi5H΢s,eU7ݿq' n9O/nP4)|cku X&X "G;O'ilK*)EYRF:$YƛE|.g5k-j1u͗h+V!A47lgtS,MN)9€v>CܺK֎Acd*Z^iPMH O9"k. ㈼,/[R%ҕw{7R%ќo) p[ `g+YV=Zsrr'syQW3Tg먠͗>w $MҌ6d(HrQJ}tހ>:W{\F$IenL's|Q1y8:r>{{7xnh4c:-9x继h;>gqeU(jF6+ ysJ;<˷Ȳo|+ީXݽƵ[dՄ g^+X{3WN|K_[#'>A s68G8EQP5;{ff9uAؘ%:cud<'Pc~}|>1yN]k%؃Vf, BHʺdr5+mti&[km|AQDaHJ25ǧ9iJ&v(Y%N1[4|Dz+dNi q4keJbeK+MXpxrVPA-,%8?;'\ִ $IDh]1NI-ʢC YjcTUZXJ( Vz]pnZ`V.˂Ean~KX<Fق4g^Y&c=3JVL(B|̃{ۜ<;!g#ZN.KEIfhw~/e61N 2kn}G Bhmz)'1]V3 Z k}>"N+a0Z dD@$H9 EB PͰ,Ki2ʢz}·LSZY PQ|aR^U/HOBy嫄Pz AQf%AC8GFaHQVWٻ.YDʂvgzx[|C_&IH~?VU]Q3~~^KFRF,lĒ}Qs)g,AO')iod]N\vW^LJlou&_Wy+ᇴ: nAa0eNpr:ǬnSdBԊ?=~@i}c7o'lmlpe*ApFfr]6+s$;t=7%"1WmS#>~w2CĬGcBe*ɻl_K3䋒n+u|;]ΎGL9( EAKI RRJ2,`>t*ׯ%e $EPxv;5g̵ bַ6\[Q:8=ep:a 9GGJcyCt {;ܾzPƌg3 (2ϙMl]J RExP'򭷾d4h0%|&/"ADi{hbDHhW B ! ! Id1#h+J'| B%0+9+vy($$wfum! Ap)kʂӓvݫ׮_ T".PRi|)ߌGa@=BDa  7 3#_0t1MHЎ"򺢲P4f^Uhk/  nl! / L\z!( F$"{XDgdIj= kjPip u@2],l c3l;'SJY`qV`]# J2C80w)6!!X'=CU8<:CJM7L58eHDq`, ^ġBfbzn Vm6?jZP*ڛC$ h4'$aDQVeLXHd5Bj!j xdW{t A p2Y.?9;|VϺ}/){cF88+VW;Lg3",F9?}tGGF3$yEQ胗>ΘN $q?~{B#\ʟKrQ$P7 e >MlϹqc)ɂ+۫|;Ƭwy+݌?xרem`0j_CL' 8Sos|:uGܾI)Y`MID 6ιy:eQ( NKf98s*h4~.E>,G^sX y^QV,Qn)pƧ Jͺ.p6Q5g+j0\c4* :dӝ"/}ԇOLr>քRp AAA`$QHƜ2hFYkDV35h;$ISqk RpN;!O>=&I^╻wKpi3w3nUM(NCǓ5Ү/U(TߗhVS֍MC6:<;G]ި2/rCa<iac4,l5a5MmqWIiOgb2&8Zgx/}xAs)x]/ Kd?x\J7*J[K⥇o@]wĽ7n eJ!r3%I$a^oiku7ΛXccx6V7c$ȔwR3U.@HӄWx o<|\K m~'O|oAn#b g O(ʒH; EλLWJB(=jkTSYSU5V , Mjj$a0;R~oP$B!UFYST BgXd2;RI TH  H18;8%mpt>f: Tu3rMfŌ:TuW^#$b0x{oT.YM9-鉌GtVWy꫼3J(bPpKBc$T[6)ZS!vȧ9-ѕ&,*ZJ@F2/Q2&1/HUpNJ6,'cy>~n1/|N՗pq2c8ixX JU~ HRr&S_˨å^~YND^0͹u&wR5fCK ^tJv$Y|oUUP);NaC:#UBAooQ0g87Y_Zg)jU_̩>ȧ{dHӔbqp1'x gwhOΰɹ7 G8x;$ -6z~?sl@HA g`ǡ?'Vrt>WwpN_a:98<}E%$W&pJS:݌s(ˊO=j)%f8#vyxnٌ_uݻBl @U[6t{-@q]%}(5b,Ƒ2N9=?#MR6V7$IJ/Hs&—Fz`eYM)s~YC*Aa2A*h<"uIQm1(ʚ($Qђ%4X"IEZ%$qJW5UYaܽ}q֐֌c6V2V&k{T'P AUVH%ȒhV})ь^,i X1)k4۰(P'_}gn7cut"*Yz !!d${c$e‘8fk}^;e

dYk+bNxEWul6J_̉nK@tݛYiw5tM+Kwb8D (pZ'Lc<~|)އWסּ.9 G3>/ͺ\ڵlv%#q&GVa,t OƴܾvV|.yr+>y^_ݠsլ;Dg6>y~FuBeYMp.B @&TE2@U`>,K}s$I0s,Ab/XRegCly#گEF I$ KBV-DhgY6|ZGՎ(s6.6UY]cTؙז0?>? dy}EZq'Veo|ך|)p\8\}8XK%3@g58d᠜Mk)V7{YKҎKGC-jBU&/a-B t^3+ :nhUpF1`Ta4S&B[ ZKQRq>XHBJ$Hj tr~6f4LvN98=(AiG{g8-Hɳ$qrvF"%U3b|:`W!7n8<;alll>a`Q$T0R#Q[!Q@ٸuW:ʱg X $G)V髒X+qBP7y]=y| ^|Ԗl]֛-w-&9t:Y^mS|⚜ck?vH٘5&nwN99bA %T&C=yOɋG C uV?E%Vk/aEŅ D?U nIǣ议GcifHX36V8? ,3Q> A/o0Kmj2% N8+EjC%^>be2vh.3V)IOސSyqJR:,!!g=8s baqc%R6yO`Mt>SNYD1EaMszeP;+K킅8!J2w9K+k݀S^XJ l0"YrƃG%=?O_];`}`mgnbQ2-;IHpv:ݎt`oR4w4GGRllwg[x_}nf1v[+ZN'c~~ȃWn?OGCƓ9}VExg^V1\[]#F]e1_t1ޭ9b>`H6Yrz:Ԏ_Dqњ8 )&'/=E`^{|3/p +X (+OjE!2GvX̦L'S(&M0UYTtF Ik@"( EYDPaļ8]n/cwnJt㻣|P}†nFH,1yuy^p<BFD" bPt<8AUT8gi kkќSYJg*4QYI$ׂ(YÈ|N'A[*낀EN;Mh!ס0`B n,KQ2b4IiwV{Ep8rxJQLV Ӆ):bkkp8&diBh`J $! yt>&o_{xƣcuwjt诵)9n{NxݟZo1ݟqɕ WW9?ߛacu}[!UbB]%t YD КrjQp@UQJdlDhAhFg PH  6A]1XDFʇhU^iGگrr͆]}KSJ.|w"D:r!umPFQNkO^8!Ѱc%Dh( P(HEκQ=5F L"AD)4Эy&=B"d@ Y_d0 @esc:0 q@H"FUK5*S/ IDATYbd//woZ(^\T i4i( ^QMvLk `4aC)En,bNwnכt277x8&X,?Ow3)1 )?Vp(,=)| o! 5ks6ؿR$Ak[}㯔]$Y! >U:p1QD\9yNR놢/-y@Y5>.BPkE!# oEA.YmMℳ4!X|׃^ MfvYkz3aHB4 ZGR53+HØ8(I⚢)p݀ [kSE 0/T n8\s/^i/̕K@˛:Ƃ=q1$0ʪ`?8 2<8//rÚ6/s~=^yp$yS_LH!,,qQ8ZF)ܿUs9Wnƴ[1ścf=cWeey%y^[[9aymއ!hZT-٣moFyٴh67z!yxRԵaXVTfԕeo7Iv`4%"9yv4l),J(yNFy>'VVԮ kܿ{=Yw~t\_ڍ?KAn}EhEm]rAIx`qi!ϭ.̒dDOM[ם{NfY-k>[׶ٝ_rQpXyx^}Z(V||t1/cn3`5?/<;#<3/bokk;'/wH{8*OV|͛,X./<{Oygu="OY⹛ 9]kP/b0&% Xrm{5{xFf?ε &؁cH3Zsy#F[jTKq8H =[jؘW-Ѓ@MKN3ɴf/PfH `q׭\&lI`y:FmKն'OHuTn-RlC%i=8jPc5$,rl$[){xi)ۂ|d@KFE=8TFA#=1熣Eɝ?lӃ*~CI]k6lL!}4`!ޑ')RF7)$V+uوtãSTo@KTdfJC4fRQ8? b'@(V}Drb.DtUwg=5"5k<9٣L!X ~`F~qExQ׽QZl V 8t9!HF)$i"I'M!hB8FÌj!8\_#AHx<(ap *(!ĸIB$qLhzt>ӊmߟgk"bcG[}ܥo/ef ՂE| ԑrCu}4fl)O/ χIg]dbAk֌\rE7Ϋz~gkQhzTUS^S&!>[UUZtG,8|W?_}dslA3壏O|`)mgy(!( Te ^xqǏR.i||$%1 D(?7#>:c~Q`;6yrqן?ُ~l 5gc҄7vw i2fJBp“SkMpvGܼz]/3ȲA=njpx4%ؚ/?PMZ?@'y˘0a=@O^vћeqN]O'$FGSkrVq}FMY}׼fU)pHkmMrrz|ѱ#ͪ(d MU&);)eݡuJuo:bS5B4e],EXkSM43jgcV˴Mqmꚃk1C:|u|%LaLhr{[Ltө,J*F$[C7q׶axE3h0Z⺎˷/9|gx뜞])}1cӿ(sn!Zɭ7y|8|ko Y{M5Ϳu8\aF!Яc: r5b!VSGP C^ж庆$, &) @ׂwV%Պ\BPO`4niʆd(89E+)ḅP4EJ\}XDyoȴwEIj!t5UdgǑ8߶rԱُ Xs-BVQr R|a҄x>E݊@H 8c]w1) S]vZ|41EkcJ\|txkMZ9m@oi[:4$U)w8-HtB'Q ADǼIjd,Kuhi;1ew-HQJMn՟5 W >|2Nz1 tH1ƶl^ye$ĮqP7M,s=i)!:ba%iVU,<2ziB()rt/$pyD4M?WZ%89gEu~79^t&~@@M/̮k{ZDiyAtm !fP{Bxع Ne8yW5BKGr%c|i۶ܢMJӶtEZGe7w>x!nqw08Yn0>u$Akz78>r3$&>3,.A!'&g<(:K,g11xortrBk}*=9"9(ȆA`];nj@zJouc̝r _KcH)Ij"x93w#\ !|^hei&/)+ EQ3Ĩ`@Q_^sQ̸2%eY3}|@9v-8uDaZ8${3<:m/|Nsi{`smgǧ<)uUqU2_W'Ǽmǝg4Uk/0o9>@pzo|=>,7_ /ۖ CuqpD#Mq6ggg<s>ź/8xEA~_7.,#%Bн_|`y|(|JR\ѸNG$e_eR5 ,̓0͗pP'AjLx]G$hzƣ *N.e4&[1mocVxK?+#SBv7>OO=6cMbrn0&ĕ#S" PTT*k* -64g~tE.%V&]I+>Ho캢XVH$*1HE/$r GG["hI5yp Xjqh&|!OmIWLØy#)Gy :?9%(÷ f;#|[!|͐%r*a2#قjq0y7>4xaP*WT 8$|dL5;Z.6I"cƳ|@QDJbԇ'"#5 ig6J?" z.$aj("ƛDP&^}:qk_nOW S~cz $7Y 2c "IM<'6!Dmܧ>B,ޏT8[_|?響C]9)y(˚5{;F|VRHBջ7l-|FyEy|t10Rڶ峟} P-wQkx围M>(*n).('|d:¹x2S>w,ə_,ݝŢ$x u]wsX51.Ƥ]'TM{` & yrl<i"e1¸?9ʱ^,(#lS7J0etyԵ5P Zkm #1dYg{6DY.k鈓%@hƓ1mP-%y@ב$ xpt[!р=d\=EJsqC? {CDdyNRNΙ2nߺItdуZ2i[[cm1FSѸyggFe\%i"$$={͢M,\궍L0 n#0pb(i )&xVHXk ck6OY- 0ligÁE 3mMXy9?;| +,WKF:tɳ7^~0F. :GӴ$J U½G'ڌEɃ9)y.{G1^g|ißc ; &>O9Zܻw^[)9\$ڐOJ;/ػ[,-!+(˔qb ZK/'wpco2"yLhE!uϲQCt 6-1 %X[12Q.sx@+dٿ Ϲ5yOլ1ӵ3"ckq2dj*Wckbo5. RQs6ͯWA}P"2 C~lպڍuG)$`pdE,)eQLmHiX::Q]ZAiK| T}pi-IBG?+jeEAйi<~!Bp&MIWuHH)(0LhRQ*Aʣco A7Gk>>#ȣ NbBـ)4ᙞ OOJd/V_a#{װUÕB.47URٛA:!| HǿF(kJC5IJ/ޤ(D)CHB9X-Kx@Lнu$K3{1\_cID߽&\;Dfx?sJЃ"2x 4mWbq٦Wd1*4^qM8}#'E/sZA| RC )QH)xB|(XH}]4,[9A|^22(MsTeВ4.|\-PR R)lַ+_~wF`X/( YRGlϦ{l=}.&dyΌD $dwe(Ӵ,><%Ibpj5Rڄ9|bFHg]ሢXZumFQkF*s]=%}y\| &,<$A9ro"KE(vw˘d]`d}E3Ѵ qr>Q+ z:YKbR wۋ2;@IRGʞ&#+{P[I %5 @[h,()EMckfɀ $EY2VYd;$26dis &8O.PmJb"#m$uLGL/! ʦ-s0ɍH3CZfr`2ⴢ+R ݚd)q_.=sζ\;4%ш^ D(, %(=ޡdl;H ^>K=($RX"׮q:Ie6S V(tBD >r99γ5(&FZDK\9F-n$ud1r)c>2DC[L)0Hl8!ML&N="t+:JbOk⍃}O~inD\c?S%'NrLb\Z^|:! N&biێ!Y(8;_q?_yC~7?˽8ݝ1FOI)%?ƏH3{|s/u:= /xs{݌_w}~_Lq^1'5f0H"ۑvVOW|mW r_+"+)41lƀg4XK΢NΏx۱jI#e:tFtM8V uuҳ>!DIEyOҘIEuݝ-&d/=KU7=r>S $ɔ"y3Ni[G &=Y\\=Z,O1zpbsxTFJi̊`麎EA5)ZXė%ٴwj$ Eњ(,WoٞΡh|d:0 mto GA%%Z)jPJb}]D՝0KX<>>gșNƽTuD)c4GEI.fUܸ~1'sxgh\KtlGebɽ}sQ])A-q4[r~tF'eQxgFLkxtX?k;^En8]T;ga08c&5's^k,Tl2,c^~y=:a6sc3vydgk'gdZ;ɢ飌,M,YQ<vJ{:XÁb=kjvz Bp}LApsgk§9ٿ6ChZFdZrU0gtkT9pm:w׵o0J~tO4?! LRK~w~o rc")h;lkfC|2;bltm͓yɝGg4A蚎H)xɘ,/կimbqƣq$mn=o%vӨX:Kӵ!(tH5g'ȆNpUl&Fc#39k*K!8&R' 2CSwh{~ !H!$\MdJlՑeIc;:" Πh謋}4HtHTeemD ݲq~p:fQ.hH!5KB#M˲ 8(÷bkT4ތ)5&TqġHעU /wVk֫<6;(`8xDZZ$ hp8;; lr||JK0d#C:AΓE >dĺP@* >xD ФtL"CK,J%¨ |r|t~SĠdC4x둉6/ѐ_w(P'%ʛ63B@Ra3))){m7yxjP7KՉ.fWU%8{Ja^GݝYL6)g>FcVU,hK/D$gg )PRa@׶oB<:<׮mS5"2$U4 ܘZKyCC;sl"Q1IEhb'#=ϷǪ7JLu/osl}JQYV^}Y,O}>]m-bM<)?5g 0X`mSAa]4H^j4$ ՚ٔD'fj<22UJ*uYR)U8؛t]*p8 snYmu)A= Z.$S/*l Z{pa8ֆNƤ!Xtd4n<,O1MDa<-ULOZDH궥jlHkLۈ]QLa8Ș/t>`%$ vǽ<6,VK!Yq>/Ibf2bËO>nQUP ۼp󀻏p!Rݰs@i!Kn`9aUYӳLg|s1I2|UpNуGLcw7xy2(MH-_b{\dӲZVlM9~RrQJ`I)/kmOX-x.;lrR(S~F-mݒCF &S|1&2UoQJ28أB 릂h"xA$lMGmEk-;[s Y=`oI] tE a^F'}osBIGU4lM~s96>~?1[7vI9[;g  Lf|vٿgv|5m}@"obM>LXJy]1!Bl(%ćMCQ7\yM^}UB{bݠd0W?Cf;ߝG{gn{_)w>xߧ@CW9#@Z #K}3=@hW^g8R,6[n=ãÇW`Nx&L 8˄vІhi &qN)4"%$fjؕAA>d4 N<nVƫ^跬lWqri[I߸ooar L\Np3͝b0R5ux7s}uẖ,1%G(HTAfbEf 1 9Qd&IR2/hC@ʀ)IPeP84 ?~E~#kfp5p=CMi N <4c.o_) eL)pE}~,t^1H3H5> Q]IJEG'tW31>^Gq$~ f ":^jE˂Zޙq~6AhPdc1\jDoghD2\􂞶/ZJR]Ct dΥDg}d)!`7Bn"3"eP}:ƃT r pX~Eo>!MS!\yN.&D˫?D17Z,Ii!b/|ؘZ>x)Dzg=N$aPT+϶8Y,"$.:xSpy'P58m[SI"Jm=<µ}QvC6"ojx'~믢[ja%d-f˿x) v1BB_|]9LFf1v Y}'# F&V5Nƣsno9)rUpp06[[CᇏX, ˊf{{Hv\ߢ,4uMܿ`/њ+oQ7. TeMyr[ Ƅ$4+g&8_'c > U8&|:c{%KN|c33 riFLSH &0~ 6-ˢ -;3=Mu+: 9uop)H6}Fws mۡ"Mbv!KbԭXObWtKiBe"\ۄ`w:3Hz B PwL'bVY#bEYZ1aG;1Ն8YT(4i)k)ˊZGkXK*#ApZ\\,I4MsZ6 \TR";ᑽsu'EΦI`}T5-ugXm*,A$XegT޳XCƣ!Q$ 鈢ސ蘺l4f/;x ӝf;;st|͗HӔOrMyv Q|zt۷X[LSX ҖDIᵜӂw iJUը(bw6lcꔯ}m>8{~&ώ893or֐r~kHܼKǧ'x$F(h &eSSlVT:%ӌ ISL1!weq/{惐o9_^ླྀ>2F\2%.C+օ8{ e,R2/W@8pJt_đg߉(ˆ }NWH2 "zѧܺyopM?{k2y&EXF5/ IDATy!I"dHŜM(6%BjsÛH>Ǭ֏qwt!c툵""&!U`l`96MJ@c:vrC*)P6 yQ&uC**ϗNL eY1(H+1\]1Ѻ6iXyD*v%xYWuu`(CiZDѶ;x/Y.WTH yLYF\\,HӐxvg[x<#t(< j],n J>N’9GQUH-:h&:khM? KLgNgyʤuMـ{%eh4F(R!qFIskצo(ʚ;bx<3-3^}>9"rrhh('xt9>3K#6o/:Oi  ?P7ݛۖ7oȽϨxko}6~%aOyMyptN>м Mɭ[><f9O/h;5 3!Q!Iϰs}/MMb ܚѣrxIg:Pu͈Q>n URzlLv,K&)eYX(%ٛPb,#֚A^UZ1 c`RANۚ58:GC"u/'};[ckB {,+P#yhQp?n;|]hNu!tD) 7g $IX1Nu{{<~:(dI 2e W^G$8%E*O17=l|4=Gx (KCWK[>ӶUi8_o#R1_KB YBZ8b]nr6_ƥHIU<4M0aS@Eu$&V "'8QNb("JbP$yD t#T\bo|cv8/C-Zj}x`f.c=?".$7-j쁺J¨Hy(Yqzyےx <$u'};]РZ>ؿ#H+:e peh}OgdyBS5 9M`3Ic#zɕmkQ=KAkp$7H+:c= Vv6ũ#d`tv·6D9v>LX+ptAJA {n*laggCHvvwXb^xV&ܓ1(քEp`$ DrϥXxz@HpC u%x gm rC'ڦp=B\-قSr8h9 .`d25LqXXD!}`H2B CX4DQmsA6A"DrB f]}o2?i~m]8s?:|zl6D#EKY6Ͼƿ)0·yv`22t:棏ܼKŜ;q~_kTUERFGGG Wxkd&z'oX1Xer>_ҵt(;BI~%f:?WnX7n pΐI+;aG:E!a\S%ײ*7_~Uᣏ>X/SxHӜb)Ԓ NFmÃ}r5%RA^ebh4d"N8"V 9LAl? D?A1ۿ_' 4hVDt{:V6|z5|1Chn?zX^??׀#V%'VKT ,1,+ot9z /¹[ǽ'ٞlru!E^ GON>\؜w4MMEqڷN[΄y, K> 0uӳ!mO_h3~m38X*~~Ļ{O1:5$d8"d=O∮kX,6 a6=4 ,+~eYt: Ma7nXaƵk{LIm*,a6G(4m8`]" ـ'88| ak36XKVVYb :KH)X$Y~crlH2rt|b$f$qқ+g/*ʪd'mQIOhAF% O>}gMjt_mY,3Fcg'gI!K/c|DQ/+<[#gw2k;i8|)f~Wkct\CU׬k6M^<мrɜp޾ ~["ΐkHZ {.{_~Is,+Ì8U*z snxjx||A)4g܂H?䄲/ѵҽWhpqQPkѐ ^ M1R+EHHxAR<2QbSaG(oejc}LMKlk%}lr;:먚_saEn W2 yi-Cbvi51(x<ȆmL'81`03󥷿2X*;lpTHi`lxO>r0]7#1!I ] ^ڎǖ68^mx`aa+ %2k ,w>804A r£(kOYK/'Ǭ lpSٯ]!H҈L`2Pf)q*NMG[Nضb:0STJö*ZDL']AIE/07+j@lZDP3I[y7_+/ ~C/}Q hhF>sɽ'D"N4'rH$MPH8 T(B#`@$8) CRݼy_Id5Bi0 9KKh@q }?nzp9dzg*!dߙ]0ڀ( (/ @/hHQu@Mm6tt*舥=rN.`B> `w٢`<0(BS)4 3/ ^ l)nay0E O}sg1!ʕ#yي$c4eS4 $A [7/ixML-$U]!z[zm~G+=ZE*e$ 8&d_8fCtfx֡>l ~ @$$XJ{7pش].<рjb] %dq XgXE0Pl³{b~h6|~ [vE.L ?!1t$iB]ݚnCNN麎ٌ咦Qb$!zN|/x(H3 t>V oR>oәT_}_7~}Jt5}|,.Vԍ!5S>iRK%$`8VUdbq)4ۄ-v-{;;M8vw)Hr(R5՚$ޡ( >JI4ݝmQn6Va$MQxy6DGăx<'Icl }8җj b0$)`>K,D'wԆjDz7q=JivA$JB\hy&qi[h!޳Z|iaUT<9Z+ysvnf:H垶^ eqWn|!;T ]ӑ :V("U2iuЮ7\Ɉ*?YE@ łݽDp>뢦<98&Rkqe@kbR5DJҴJE$Id}GYY&b5#dQL: M;ZĹ N>\^/X(}W_|?󫅫!{̈CG(ST|+&{{8Q FrzERo8?blwlg3'%C&1uY;MFwۙrCdBݳ\8WcE3 NT]hI8[mR`(Ii}p8ecjʪ%Bɇ]uD*xL! kb[h3b5妣j= mja}-QA2n V4< ⌦fNSdQNcxgDh/q|ZrDQ7c/? N~Yc_eO/o?d[_>-cn\1b$$IRYŚjLsƲZV~U'G  R &&8g16t5,0DZT=9^&EQr(LKl6 eհ4w^##y1lB"w` 4"<⸮[ubAjtv%ǧgpq~JO]|_~:!$Iq$H 2t.Xc` mzi[Nedd~1ǚj5$FkCcL1:GTQLȽ=tL ph Q `ײZ.q1Y&c"O8Ckh8@8i;+V5h%~,5e]QU:0TMݱ֫51ED)IY!!DI`4DXlʆєXؔcKp]w.'I0Xg9A֬ Ox۝Ѵ'H8X&qO!Ncv&T%UM9*ps\V̗nOP:[\G$`l֑ġaT-I3rzĚ qP*^,7 IDAT+̓1xW!d(64SRjΰ7Nڮbe[h,8 5ȖM)sToo> os?_l;}c<~W_% 0EUt9>Ϣܠ͂(t2ڬAƬ G OYK]w97n9t%{e:<:gsah؛[y=Djyx]\1gX,j"1@ e "^y ꘶I8}1SteB#"I)1kOlVdt:D71MSS) ZhZ@I"@)q~_6xrHB܀u&%xHya˦͟V/|,֫0BbAB B_D@2t@ (Cߘ`g;C=_^F mkc]=<`T(Rӹ`"z0( DJ"DkEUHҌB@ KQJ]ƺy3@e`LW9tyFUVHuDНyl `!{>A q} nQ-`f"GHpѷϭHa, i-:oM4ΆRиeXk[iek{;#e:G@p@|d]n@fzO&tU@68.Y=^@Mv!Ul2x0ސgA'%W[x(7x.%֬V%~|jUQW-ɀ8 Mӡ{`1MR68c~!MksE4tG>8=YTnK8%Ƹ^)afST khYjLL!MR-K3&N0]lp"D qLr /h1)M}eO:5ƓUUT8Y׬7 y7w6B8! IFuzϓ9%v ;(0S8ZC wjcO׵DG xA^?, . icpmtq,ktrF E6IbŢ`: ~ێegRna e]1Lw ڌ5TMCDl mPm.xcX0G(!*ELX:4ʚaqps\ȱjNM4,UΔlX,tƐ9Uk.Hxĵ/Lr,<8:#!Y2 Qb9go6IǟsoB+E-^hvvxrr0s0ruWXӓsvG)Ɉ'Ggoĉ`6j_I^~`jlPluY,rb]ue}a{lfg8#MF˚I`it&kl@-ʴ7^~|LKORpT]pIMg$ETtA"Za?I|M>jCY 9O]2#8/TO{̪xϺ')LtV]Cj:Z6E I}[EzѶ3f>}?UQvEq%vg;xkdqsFԚ7oxtݽ i^ rl(,gj/gȆC ;| tVc;P]gP:&)xqw6%,M16E8ޟ9yCE4|ɓcjS3th)[9Bw>ᝓD0 F"0" DJ0D!aK8Զ*/ Si:FuH$i"5zrYD:US b7EaZ>; FiHUC0_^}>G6$J^fL|d2!x8_=F E[[6&d$ÌqޠL0N'BE"  )!t 2 εdD:Dຒ,V{%BHBJG(T2StJ>۽\Ok D#E8d20semU|bBp¥ͯ~'t(|~> J\С#,zY%&'޸ok ]$RM(teowyߡv~[i;̐G1EU^QVe(detMC%dx]Ƴ3pAOT/8pȲmNĥ"q1H`2=eP8?] E.-?PoN@B [*Uel?Ʀ Ɲ6HѨƵ஼ K.pTm/ ty;nSC Kq]7eO Q\#:60\p+y$h&$d{Wx|!IӶ ''(1RۆQp>? @ QpM\:n1M]!= V"h)CF%Ӫdy{ 䆮g% ,fRlysyCG{,& &ŇQҴkUN-SֺT`ZJfUFիSV wV[**X,$/zx\,b\3-+,Ϩʊ]#UGl sTEQs$!;ԸuKg;OvIJQRZc@7X,y]G6da:ӷubo"P7[ڶaXpr͚ ٕp~kO8љf_k6-MS,WU9c8f L|ŗ/nًcQ<=s8WgWL!E)8٧o8:9OJnnnQ[9,oL*)3%ZYO,d)]-!K=}{̴,/& †dV2$v5?Sg/9KFr`oSV}pe:S˂͖u1) <ɇ3vۡF-3҈(麖餠* DtOJpFO-{ rXJܼb8:VtGd+B0 v{K Ljlo2"w>?؁ie?L^g{^F "N8N8~]~wHӗ郧k|Dpeh1)xj1[t>pkKFla QUp訉1O>]!UeD@M?@9&]{|hE$TJmضo.")Ӝ9?~%/1`qh&IcHQP4⛞u%3AtTٶ &4 };QEJ'B6%*<Մ#ZZK=`Iȫ Y9fik=yX oQ|B$/ :df( Q P r/c޼||㣇dY}!" ~r([4Cge:JD"4wn}yDg?K>K61c;IƒEҋ_W> (;†_hΓoGASi!|xr7v{J~Z&'%M!^.Ͼ|AI~@#.S n0 mR4MK/px|-H& m[S9]?d뺻8;ѤHgХ~\^.G*pˀSvw$bdWx$wO@AL}b[B=P[$ԕB&L 5[{g6q4)Bqdf'b? >_#J4C)]Ka/>G$BFn'3/=z#rd$_}*搴p_G9&v (#`)Ifƍ /@۱)}o3n<K|1Z6v'?|>=`ƃ}g ;y{?WlW=YrCQdXT(I e bseLrNeXec榆fyd'Vqs(ÇlgajQjӳ4PJr}Xj)mҫBi:l7-lX_^^psyv>o!CdNl9{7%eMCi)4TeC yUI҂aXMO 3LJ@' f0Mrzvz1F B<͚ż}eJfEEfFګ4>}Kpl:I,!⚽Ō|!rW*꺣gPB 7FfyAnZ2)sf9P}.rmS }oɳnzsʣ#Lȑpq3 ]r|rFW58Cw! ]8@蔐$HyɘM;؟nԪIFEFef!" b}PGTL NŘ =:$6y \5*k{sN 2$9}ȵ CG6E4Dk|҇Yt)ZW/K?aӬy;ѳGbAӶ?gٲruM{d; 7[BĖ"KphaG9B(|hD+2@3MfyPD{iFJXb0+!H|[ɭ̃ dCT]ۗoƄ- Z`$ĐL^՗/ $Q~w!$Wowc?fl)X̏PBe_Kb2 7[Kոjo;J#!D/*Now@D-P-_+vEIJ)2c!sO(P0T1ZTbTmfW 5)ssЌRݣwFjW_>Jn_jSSޥs[Pfֈǥ:I)!B%ؐS#3Q4m1^, 3̺5ca[L J$` i! [i ,E$1n)|2ET.%< H@@E>85%ѡQ ܗHqg$ĈܧcD #F,=HI|ӟHp>u?X,3C ;h=)Dؾ牀coyP5e`[UI&3mC=w ׆v0uߤ|&DBУTbgI$#Պ]|fH]2.P9RIvvv\-M]?چ(MAǣs<Ӵ:!O𓟾!@t`ǏsEߧ,S,f%$<)SOSMKn;k:fF[QI_l7 ]oQJ%SvJ ߚOVb5V,TUFQh% tv4eް6lꎲd-7k./ٮ޲Y?ghw5nSTt) Zh^Z*gJج$ m c2vWF 6CG9XL22Np.P9v`my-75w8)($s ivSW3|p MNSXSV99IF12pY~/V2jݠDPV9)sz4ɟLVpܠTUĹaL6=yVD|6KFRI϶hB -Yf!E[od6چ=fLJImbMsf9O ۚi5cooAe|+ʪIΤ|D0tA{On7L*Û5ֱ[?Is)2Ƀ=S{0y]prtȣ_| !\K~ ~`/hi +ɴ`>!jC%s6պᄋ-챷(yHѴIVY8ȴ&RF7<:P:DIqr$yRS:ۦpBvL˺(LJR;srU۶c1!,k2 Yf8~[VG jdx9ᗁRvobe'ݮ;FJMJf 1Jqsru|R2;ZCb jæn-MCo A KI0sîL{5Q*t@}Ho:J$Ijl%F2a#NfYNgN`A#5^hQ$ibAxQ(%FJl'HIꬌd$`* *R =DVIZa5.g& m0 b@cyDep^H=-2!ך2phAZ ?$Mĝ^F"b2ojK 0$0ȶ1:1fd=wɔi\|1c!zɑZ2[T5$(Af iN1cf{1.e73[Gq!?ߥ B`(ѿ{RƎєV2mg.{:,ɳn>|>EIcWeIudeF%f}VzwbDWkƊX$J*L2})v)&~Wb3]bE9"u΍t} Wo{|?)GGg=G4M:<H!36RJ6S:.%DEnR2u3( uEC IDATSdz$}n֛#Ϟ=勗 ׍'$tʈ;!FI4[`Ǻ6ʓ3iT4 v!r(3!RCB$zxԘDbL.c atP s`ܛC;gxH2:~;~=#'Yrs?=[ !$oVZX 'OZw<Ն:2-Rbm+,ء(EMcg99YpyyaL&=_1 J w`GΘLrKW&,Ol/iZK? l%X-h6/78[-7B(F r*6uC(~ U8,T,O,%vKQ }|ZZ 'QY*]1Tx?esڐmɔ kMKl6=\s7E~F$( !/">%XOy맳͈1Z`{I=NYmxprDY&H-7N(rM5y2Mk2c(y1ag|lnD moaL~7:EK4MC꟡_fXWS9]:im2Ef}^9GLo/ysN_(:tM*FVn$^DVlW{|@\/W{}/xQ*kT)kt~L0ж-h14qzȳf}'ՖnI=J 9!=4ٰbC w}_7vE|6n v)@@ҮnLm,,6ź}?0-F x%0HFdzxJ]Iu0QZ4:ReUmxXh19F|n}o6: tnH #~-Er {vT{G?5|悈Da QXFր+.G FxubD,K1G$18`uJezJ2Yҏ\xH\#(NhAژ%G8?z1: 2;=Zi|,[P)Խx{"H6M:EJƈ /1[)3=8ƐzUɥDu<8xȺ)H!lH%Xo6I]mܙHݷG ǏH ;JJ&c= X#o%9c$ztzڡG8KaR%D֬s`֫ko9{Ybm..У`ټdRf7,Ӭ-ۺ2w9`i8R7-m3WAUbL%]Ӷ)cJEot*))Y {Le :#Yn*% @Y֛+:in?=ޞR^w7İ};~]CIDd!(L"+kU`RVxhdJ L&6C36u_>Gkã#ti- RI@-ޗdE󩡐e)ڞt 8X bHZvxʢ*'8;Ȥ*&z׫$uuGXHʲOjCOɍd]`QZ$d}7+&=>(hl <V-Etq8ņm-łڢb9?'^й~Is}}"Uusxp9'QɳwyKa|ɣլb??؛ͮvTńzۃG h%UjٰO\Syij|qb2I&117 FQR&>=Q S.n6X v8umnۍY|]֎T8yMTh ;.;oo|9um瘶gv|ċ^5!V+IYb gM눗 02RtBE}th81Q*C " /Rg! {Ȅ-H*!p" X|(ҡBXF\x-zT2CXku[[J%nPHMFH(ER3% Z&z Hq Ke'69i Pt%& YJLOA[$N DHmI4LI,,(BGG[ac HF(5k{ lTӹ̦3儲) ?,N b3;Yp]rsa7)Eܥ[Ƈ? BJltDR"ւ\(w~o;x?W><Ois[p 4.9Y',Gu;^| Ǝk'Fj#nzKW:H4!1Z!hnO5':1YTT܁*e?H!h?88""8SO>ȓɄI2!eFF %޾[JLdžk>ϟ;P5H2- OŴH~ E2ьU%uͦnɫD^mP¥@Bl+b CO-˛%VqyĂߛ%C߁,Y-Zf)Jjz; dp%$pdRRU9GVy89ÇHϿ<'DbOo'.ūs6[fc~;?\lzg?Q2$G3sb0 |wG"CHOڒO^nYv-ۿ?y;Ͼ;@xnac0x1Lyy?쌡Ç_㫖//~w)3,"&mݠ|G|4u%OgQM8Zrqul6a:@ZszK6L˒uMśl!+VdYF)hWL E mCO8\DŽBflqp9bTL}F}Ə]pb3GZe#Ek_/;t|{ߋ\}Pɻh~G?ǻv8R\LZNn} Bb(HD)j"HHR*xc{& Ez8a%CdBDF!`0X?K1WB:bDFBjRD$D"fx?'3>%&zNZKp)C*y?AN(DipO"tHS|KJg)r<DC 0xL@AkYj6A9Dq@oȰ[SAځ}i >b^9} i>;3.]cn*ǯ|E[hM;I!8jŒ)wZ6;M^.[b  ԥuw>1Q^F eT1R)~0D!;PS\m[Hyg".!"S)\]^ `o*ч1:VF"II7HI!N}iDg}{w1"\duA 1ˎyy}~D)BHAMPvF  ~1wcRVl9Vꎅ@d8r}mߍx122BZ\C+zƄ8D bbiPg7OmKwRnv&ʊeXmӐe9JX2Ν݈bm*ip{n0@-10X n$9xr.QT St=ylߎ5oW4뗬kSӊGH%{ }$rsp|`Zt/x?'G'xEK^ S&U#Gx[L)$o }Z0$RU9sw1ʐ%XlR)[^lNi6Xzv} GbTX1WĘYf2%eF҇H)Y.\7 ,e~- w=+q9::B_^{Ub^QVKD]24-Z%fFj]TTYbjBn-ݶG"L 0XIvdzdRq||!̩CHW!) MP>XZAт0,fp||r}`|͓?ghl6-NYn[V\.k>xSVj餂p'Op%q4Γc>5g-ab;{{ܬL%ӳ ctLJ thkvڶCȻy ?yY/8ܫP?͆J0L@UexY9{?5k!B2ylɋcɲ ),ZJ¬kbLc }דO75hHF&F)ʲۺ .WnyR1_i' :Bcƒzl.X ]џ_4bɅwy#w|PIt~yޔ(<>=&P_aIxG'%vɕw,K%#VLL Z@@F$ɳHRTj)5J 1$H4@Iڎ;d&`ZE(BY??;T#yBIN?HA(RpKYR@<=;i<-;ZFt ]E" "A%2&sh"IrT#Qxd*Ip'*A I1DFzA!#1vRI!q(A2qyί݂ew !AV nߘ;i'cCEz(?HI H'v_c1upo 'wTx9Rq*3$aS4`hn'i.%a<bL)Bawytv-K]} Ad8>ۡg6謥n{k{fJ'X e[cO/@FFOڣ8y I<'J)4UuҜBZdtƨ8g(2FB(#g#Mv/_nv)DIjƥiE%Eb6Dٔm2σBn#!IbV!軖݉"BJPzj,8(@[$C27&l6&  BBA- prrHߜznSf{c?rnS,vMR| ~ ňG퀈2}1(I()oYIV$2&4s.dj@C{!}LY*'lؽ <: o8 KNPJ2\]n8ڒkaf400֑JZB23a WW93<.XY+l6{ۖض-/_޼ J1 ͆|bʢz7a>BIʠt2JEqOg3x1g璡X6h)&SLa#\ ل{kjb 4MK%wdIKq!;OxJ c ϶iRz@qr-u]rs)"(,+4]Kݴf3AN<|p֑UHhvdYBbGTI1DL^Q&3lA K I`lJHiZӵ-`:CJK[&U`]U}oɊ#nV[ky|DU Lq=Om3 *~w>O\[idiYfǟS~wr y>~@5UN*.ɲ)$=֜M_Ƀ==S9?ܥª W7a!$kQBn؟K7ל%]qp"(!dT)~B21л!]|=P@G I3_L{a`wTӸ`:Hõr|c=*!Bx(%2~p=Ssј.fO}d Tm1I DC$($hXw]p1PR7q+@*Qmnꓢ_6@qm(h"޵KQ;]^Wa"]k;9@6~sy\|mCi2BY5Hܰ T`mfN'7R8VD AIك8v"2.R`X{l5 Q0ޣBT`GuMV $)]oTQ|lŇL3 7o.{᪲,iHUm8=96>0ehc{KϣA 7!HT,8ϸliAUk<!"vp Ng~Q4u E! Ѽov/iKV?cv1Ox >,U8o錣2Og,]gh[KOOyv۷KжI^3|9+V=Ơ((NEqj 0,owt]<~on<_PG]!(thۊۛKRhovn?k6m2ɰi5BjP(vhCqmbiy-R)(CiAڰgXGZRO>*qS&LHn$@|Enhe tVDqd)OsBPxy:kXnVQkj6fPj,'zœ'%Bj,gZEEp||r[&y15E7"DR5 u08E I6֚X7ne:zb봌R両n%ϟߐS~sAe[>ytJXkBQYASoa8|}t2fI@gr<{tJ𖼔|7D Y‘g)e-:A˸*i]\^ɳ !]ޓ3358=^mIN2)}CY6c} P5YGKV늓BixEgG M۱k5s SLf!WYv_WwX2|G SǙڡ 1am?i5p8Cp4q,2/ \-W-fɃ.`G3+lp%ūX3(Q􉬄4T0=6@ 9C I1i&>8 TƆ _%HG!@5 8,c!x Yah|ۇft!oSp>I`F\aoJAe}zM0;܆<Cy5z???=~ƶXI%)3~&8z`>/lfvQ@HT!6@!*ӊh_Y;B81B?Lk8=q#"S||ٗXUu8GD51cwQbR J c?q4BoU$=`A8;x<,{*^Um2  h[G4;p9 04=\3,u ETv76^ϟ;ܳ"CA>P`>cEk_ߵoyQT7o~N9LO89{CbB:fr펿~h?~?gNntnYo$petqQ% M*V uJ۵$dH!Mt%S5ii-J~TBdI)9?;ni+:j)uqZ)6aߑ%MGf)vGCKE]WL&SfӸ c#00q}utRZG7-"ûK% \/HHk.nYSDszG.<~H3.n6xjZ5Ŭѓg^?r/5A\8/NN2vb9>ܲZbBYd$ºzSBKmc[kxx~͖dme\Ϗy%::kRs8)N)G<2=;ְ)'1Y睥k[xpv£3.nfR;dS-R):VH!L A ҄"Wi8YinHlY\8>>s1>j m̎C0jGѶk :7db{h1ut8x}mk&EtRp:]@GxxLY=N$Ȳ{Yagmdb(}1`2)٬7w}P[y )tƮ.kb !%"2[P2:\7T<|)d/2~tBA$Gޏe6cm !H4z@ִQ \ꆟqת bh]Do# 21%:o)h)]RYN&?$MA8[g_~Ŝ^(;Tu "(m G-YжZ'I5u|,g206E 9uBk27a-T.Z%%:\KpB`Cy`;FHI۹ zw;cUusFwׯW ɋ\ϛ{S<~B9A>x*rrՠLxf͖yGxt,Wk.ִ-m͟ndƓ'v5m؃N)'i7536zE_bEگos.Z :.TV,WK$F(֘Bi"Mѵt~W3_$I^nvxȲl:93쫆L &?4A4D+&e}Ւ0Geߤϑ ΒiE$ }9,;<$YHlRlZTMPQd vLg%tcRPQ{i5fD}Uťh"084=55))o\a8Aˀ \-L˂@i3l5Rj4gkt,Β kݮWA'{Վns ,I%nonIBj^O(z]⪦^.GP$ӣs|+nׯ.Y-uGfZhYI=mcSIDz/h E d.B7bU$Iq6JG6}DD_ӵ/7~A h%gS~rjE A }yaX|WL,8ʢi[ 5DgjKg\_Edq8uSsIY!6Zcg6nbF4=!zp'I/" ]a?J)>y+gNZw̯| K,gEM1)z گsj; Kn)YqL9}O(gcGG\N.2EjA&65DXb{2OZHSgS$ڭxkV-M+ꚺtmc9jx <5 'hB@yO iQRtIY鬤k/V욎lѬX/ysqä,R|~CrlKL̙M2&eNmӲg-Zdy4gѝ3>)?*{uIS<|p BX('9!xRdNOYLLV4k-ZD%t]4&1Q{2/qΓ9F[tV-s3Hn+&6ڊztf,/^f |g;ѴK֔EF^d8QD*Rh>B AL򂺩JyIɾs]n(syzZǼ}Ͽ=حX2/' Wض!)Czٌ]Ys`lvI(( yդŒ}P, %S?rsի3&Et^! xVYͰ&p4/\V<"MsBl"e\mtSNg\\/ib!C:l:%wе5AjB QQA;$InyA謋z^"e)>t-CWݻmC V0nC%{ J  jwr^_ 8|65wzca@~9mdtA0nmg x7;>axIy1n) x3.0~Uз,d(Ywm6{!(/~f{3xˌ>?+= 7i8fۢ":'8h|zIa> 1:DkMۧ5|IWc%2mbliAScV"kj qȴ>3\ `8҅YNT1`: nKCwE)zftM@ȸz4M(;N쵈6CۮsBD=0ħst" VK !XlH#^MضUƶ4M1Zk"#Q*><#I͞,z} l#D]oZQy6hhL Lgr~rDC8?d Y̧<8?˯^WD0=x6^vtl΋]i옶ps#-%qZ,f3MIB4uh~CkZ)9>̧جwtv!EN5i"y)vS,a[w|{GT'mpڵd H<(WKn-=z{EUU cc6-/UǴXTQr$MXmt]?\^8gLgB,QڶִiB"tTuo2MhISͬ1KYb|FڱGV  1xY"q̧9]K9ejNx d3M4|JuV8޻Eы l^;HQI_K6羘P;;qYj={::p^6뜞(o|)R)#5fj+&`z$c6 }-F$^aȲ;h0A!=8s}_K҈]p?.8?ǰhqN@A`|C>26c&Bp?ܕϡac 1!}n},)F@;FW|//r7gpO{-̒<*әQ'T\hp*7YBPrn^NV[PZʙ%C`$"{wk, !fUo'W.lc^x@+(0!pցM#:q'֊gǼea3uR&eɾ =a"?D9t$?29R,1`e8P2xYd݆,+ ә4G;wD8yC:à N8?=?d)-ZGMJ߇/M@:x>{wӜ,f?<ˢo IDATh/&9\"KxS"KwWN(w `Brt< ծ-zhچ/Gq޹Xba}O36}m8lw|%`B=0=B"/I gTfKRTRs|NNIAL:G4BHdHSrglv;n"lw-߹UhJ+U^_"/rd:;G('QYAtBI8=YWo BB R*Z[E9oNJ@c ]ס$2Y~sZ)#ml1)ƴ0{8yd8'=08[>g9f AgXOMY‡>(AȆЬy_~9_.lLgуO.Qhсq}F_B1"ɨ0C?zc4d183"}!9}Lk*b>>nz {eD u4 w1NxG+!ϳ_-101T@,Znfś/9y$&E"GXT=+!mjP2ǝūki0*c g1 C)O}ӳk!u1kDn3102z4Rќ6:AڞJ{0+ .R$x6xd8;\0Cǡ!<#ZG7nWwb>䂀 qcgv;C%9Y-wS!0jp^.FDqP=CD㼥mDI۶((˜ɤd1)7+L[TM ZפŔS1췛?'s4^vK ?}?f暓c~>l{<~_xAYJɂ~5Cf'3..o"3`ps{IR9_|5={3;KYD?|hєzIh9UR9|GJT9NRjRN2I4MHӄ)uSC-UL,OOOxfΏWgZeAٰ(#ZE/)㚥m JȾ%: U:iXD*&9|s_a1܉M:b:1S^oWɟ|//G!AݽIbHH99xC0ZGqן>薣~'ܾOH揱[n*9 l\5_}5.W\FQ:cT XEjTe @(INp:q<)4(".E1xHwgUx#FXRG.7 , GtC~q8PyT&8C'9;8o@F7)4Ȉ AE<&Bʘ0/dtS3Exp8RmGaF)Q^Ɵ"%t-I1sΡ>ٍQ.T6J5TIzn7-C?}+C"];`% sjzGHD?!A6B8 6޹/GHM 7ob6Jk)ir}Ȓɤv;_(y5ZwwxT =$$!f:U=+gH&Ih; #$/_ &2Y| $/>f'A Hh` ֻ8#07Del)%6T1 bAxH"pƃ2r1 4McJk׶m@Xll6 ODi`;GضLǯȺX ӄQS2:Y /R}g"ڴ !MK4W5}&lQ#e@!`4} p~/} =xܕޣ,_ǀ)MtKm!SJb kiI93 >|'n!ůXd<]] dm,˘fMEQm,Q(,aW'SĮֱ>'ꪣB,H\RcuR9!8J<#;]$, %I4AvWq}u $wΧPޱ:ڦCʌ,]'ЙhWӣŤxuuGN4ZJ_&TUR"EuF5ol6:,zj-O?d%xv}ÃEd Mgy{y>O?N-3t霣Y,/h;|+斫Քi6ӏ>3ٳ&IO~?hrI8NNl6[<P"uX6+t:cSg/j~3<v-;hM|Z`,7{> igGxiB>>09kq|tLZ0]K945A$%!rI9Hwgߓp!55MQ9i9:IU^}Bs<2zj'O4F8ȞLpv2O$Q5ND;Mr9 h*bjɿ n^#NAZ6=45[ l+'HU̵HT $BD΀pZ% T}(.۳bUW-JJT$Y l@\t 1>~i4DKt Z-gF*/^$HMgh͊$h͝3>!^xwTA':Qd_EI՝Sh'En|1k-Z Xm4JNbم3J1JuEL'Qso 8B~Lz3I2( .8QhW ߁ۮjN Yɴ! icF)`g\#C4oImvYF"EJexcT BGL1 mQRc},֚]!Ag $\\@]wG|^ wH;ŅU1Y!$, Va6)I"-ֶŚ d&UYt],/\VTu\++OYJYZq["Zΰ9^h;KVTu4uiztIqH2u]GhHo)ʜ#uKFJXcFNZO~>yo|9۪Tj~=p2-8.3l5YYr2XZ./t3C HNOk>|׷+?cꦡ.dI M-d:H,.y{SѓTpsޒ9eYP58yMtsiM|sں%)Z'VJ$mxU]c'bu %= j%SRᥤjX0ǤOO˾TVຖ,щ$ӴdYfl<\`{_DJMy$ģX9[^#>mʄjD,S2.6%DN@yӯ׿ IUZr;;g/PRr\m 7K(,Xu Ung0 1%zVFHģ"k@JcaDh)[O(JIvU`)4(zt ױXp D ]Bd Q:G$8WQXg Z|@ 0(G'*;P@G*/8JU|@z'`!H<DBp >bIV9BDXKSI2.Nh,]<>&-".x\EK iF74=~ gc UbSdRah0^ 6" ;W6  $@Jd4MšI5ݪ;);I .JB?Uշ7q@,T-BILx"4]X*qe<1NPv28l*HzC$E% ":6DOP4j-1"uP!q!h$ah 4& kI%*R"ѯ\@ЉA%jcp1* jͯض_tz̿ VlW!&\\Je|I\mLcl7n!/fZ+AR@ńiYA:G U|7|d֞ BQ$я. -S2GUM7((˒+dkWyxvFuV Rg'z݀V7޺؆֠t׹wcʍSX|!(M*]D G+C >RN4c5#yp}Gm!ypr6 i4HӀ[1'S.+mPdښTapzuʲ"E!\qIXRzUݎܶb:،(3d{kQi k1(G n\?tEeq]|$p1.MŬRI2uTh5kxiSH4(mI<>hxnF[74lIJkưߝSBK&yRhmMqccą`JRUU,˒uϞga:)ߛwI:q|t@ULEŝ;ϲfIIE8K1,/;Pi麎44lekm'cl5el6[@$U)&( =咢cT"|1slBjXaLRW$_9%mz.ϗ,fs κ, !š )F&[t}NҷJ\74-j/Xn\=ʋ?>u!r3iێw޹|ʭkzTl`{5>}7ރsHo50NM4EMRN4.&֍k^pz$ش= BzN 0't7Z^s~ Y,87`ZUM=ʢ8zbmK<3lQ@<-fB-spOH*eŒ=5=*KPi>p&W?55[d_9U Jf=RH NgcN4#C(9 epFQ8R\D(bMq)xz(Ԗd<:\0D$ypq\P44)L~qxLZ mZDiK cB6EV`< tTX c[TR(LAiZ&j)&YM-܉~-9"!!' 2AZ0Ń@7x*k)ʂtNTzV +ɣ0)"eb`P)T"0hTaZ)0OH H貢A7$ :ڊHDrX;#B*C'1)L(mQ(B8P%m)kI UW`II ?QW5G$<x˄ (LvwU<Ɯ q&iw|UcoЋd!xOYW #%ɍbzX;n%:EN&41z@w&6)k&؁ IDATۣ7ڲL[:b= 8^s640li"$ˆ;>ӪޱpT(>QV|jK I$I"g# L8{v75 "wnDw}Ytg2a6F1]Ci)˚Q$6 1J]UU$u=j\7Pg!& MwϨ;scfŦpslx[J­[?yHvL&ġ&mNSXM#&E3w=1FھcovLptOUjY= AQ{V%n]RXL-$YnwmC{'hbnQx!;h8;pyCcTKa YMYKkrvz΃S^;ucjZ_Ku2N 1H]TEEˆq*m89+O]=B)(c4USׯqX QE f]R䍓S^9%:ok {fг=/Z.W=o}Gylko΃+WY?|jR]K]OX.ٛ^C: uq9޼SO1 S+o㽁 礘ܿB5]sk{01'XVSFs(÷*JERp(JʪSB8==ݻ Lĸ@ H Ml)xܸQ z\@Fmns hSZث|D6qA|O.LIY,M"&!jIKܧD4/2$-BNd:"%.@g =9tBY@EҊT01I LtDb"i*FGER~~VH.1UbtE0 SN;T7PN/e#$a^@'AIۺrpx1KPh RƶDFo&9G*+ غ*1dWD Is*XJ"F7FEJB X[ܶ A FM0 s(ht-76aVj $LSJͼWx cA`\Wp9JTm(%jQMz$1*1-cF38h+q$##Ў#MGVT5Jka؍\UQ* v<TSwG%#617ff-XdtJu0ZcҲQs9Vo%GE9'2th&% 0JQT2' xD,M$BҤi)^i}ص?1f݊[bNrOi1 as;qK.LrppE"v8YJaa4* vlIj5^K5Q&VXĥ_ByuCǁ-:!*~u>'?s>wCjAMgtM+ok!fa"9 6 sYVy2)uFc Kw/iN \UA7xJLAJ,)xiX]F\,7TeV[T~l\5e2ش 6)HlaٴE=)V3{2`nPsMruzP%@a >g@t}_,Եe:Pnp,WK6MKUHO]he:*Q nXiێ<~iY%#;{OT۵=mH«JC[\rlB='/(.Jش U5A)zDU4F6Dim ֡e1"뚮i iEq)e`휪Lf5ea986.1{{>Wop _qxN.WO-MpwZ<)O]٣^9]>ei( CQL( сA g0,&5w++OijCrXgZU4WʷaJ+{p~ g œ)Ez5ܼrr0HT콴IU Q1HY3\zCYY6p.RZښ|Rb A]n1n'Oqpz%bJ1zJWhE=1UHeէ⌻p:!Y'?qfW9?_BaQx|,QjL7eQѢ!DhLg<|poF (qz5X7|on̵C* BtDt U/-LS^o0&`IGt?x$J+SCPMN2IIu:$'i LɁ6qJHD佒"TDt@0D !J^Cr $d 9ND)HPAZχ) @BZ 1( 1]k1jGG".xb'2 XBD[#nw 0bsFS (1]@v ) )gw j-m#Nb{ &F/N)+“,)uE@G*Rµ HГa2#"0N >tډ{FYII_XLLx`$Qi 祉UP8>g+՚@-od=G=nDH0Ve-om׏6{;eQPZS׮0*P~g@bӶ0+l[.x41bً)Jl£ Ӹףa7&]4i`pU!-$P$3SJ T',<8c1A6 Bc]0FTQLQJAcq8v;Fߣi[nz?#g0nSl}lכ Nqw(yHzX-/mA]TEI Izk4T8+Ap^BYeEJwSIyrr+7o\g6!I97*&۾G)!.//v#()4w1EԇvY.o!Bv í:ڑS 2&N%䁇CPIycteG&EySdVLkUZ擉R 8-ΙLF(FVSV5M˃ ֭Hҫ;'],WkKJyQZ~z6]s[nrkrtlgێoOIf Ҵ-4m0VzLJތ(Bͦ{Sry "tQZ.Z9O2.d"Zӵ=q,X-m-eQ۝s+xͦk; [\bLTGYkB!nH1T׸ui$tnlS|E`L7x 8'~hǶD?ˡ*#b|Rcd^KG7^7, ꪔq^q|4eg\'w=ׯR% M#xǕ+t5]? SN8Xs(M]&p~p8'œ]kyކgo.(c>cs)UUOa+/Vvi&%> ZچGS6 KaLqW2MhVSJ1x*ׯqx)lakc* w) &xh[Tā< '{)āZO&l6HІnp^,+TzIB bbZV<3&^-XW|[>sOgHC&Jj 7.~hxD J5[)yߥhܽ& |#s%~~7c8<W9TB)q,6TPA%(A)0`bw=7DRR Cl`54DlJ,8t"jCT Rpu*aHO4$LL`db*|$q)**v,:O n*/)`S"ɗ1"tцZASSX^n< ыI`%)CԲu.&P:$+Tʧ]5a[1)>@ieRk+ PIƩ@ED#&"N2(EnK"H¢|s( B)cO2Am%(1V1 &QOK0TJ6[gFlbP =Jy`#!>Q+ɏ{vVf ljcdDb =N굑B4L9nUW4Pd:e^?jHc?!V&|$v|}/ ̦6Vh ZD྘ѻ]PIt ?eۼ iI2!+8Gv$ɢ H"-ӣAW[E"QVLHHh늡o|LJBM1:Y{w mԝ;{L&y_ g(J$DHKXo:&204톓/tf(tڵk].izϦDhzP8nk>1x\􃌪|5ɂyH;\  NtZ9[l%F|>E 玘TFC.&(%(_5v{TЬK(%Da Hr`u)U8ج[WaEaI)` Gfo_9&sa`^qt|;BOgR$"b6 m LfU)JQ{{ a9VH *%t&ZV I04U>y?5^xWf<<_Z XG]}N/[..rXL Q R3WiRM[L ^y#\=rM{+ج/0e1esѷiɕëz ;3x>];PRr|Yo8;?tۯs:Y-@Em] c>G @H6@zDEt@ NS)$;BJvh&hm6,79>:| ET=;D 9/\tg=;[B+A)\5M+4DɄmoQ P~txG\u XS#C߾72q% )$X`ެwo`A+Ц)C )'c-icHa:-0|5:XdXX'4n 锡].oD!Y`ݕP麍TĖKyqUzO䚘Rd%-dCIuPI\17k T J-IUĎi"j;z{_]$!)%QuQU%ZI; 4:6 FZ3 n< AhZGniUK{|Hf`u!y=xl:9a2zՊlzjA!Mӱ stpYsWEa1v={{ Ӛk뒽R |0@YZ DӉ`y"pqbRWt}jP.65{hӰHVU=$?'5$YMigjhk#]W]`ooAJeY70v=zfoW CGJv{ ).t]'mVeF)uejb>R{6 t}O?Ž{ã=N>f(۷r|p嚺c/~W^G _nX,Cĵ=o6npz>I]VX^^2<};k~[*79;;] {}V 3XnMC5u1d"\41Nl$Wc6I I%**+o1i.kJlyĘ1{c:ڬ9ߧTpr1hbW00zZMдsc)92xGe-0a,>{P9 K2E1VS, PhG=$e,xU|MNO.}>O]]T]5I42v+@>4!mL4-ox9JڽtH<|pΝ؛ŬJr -wQ3:wN:/)Ȇ9 aQ>FTP ȟ]4CGHa4>l:0<;ʋ V'p+آ Cqlc4ɏI&_΃-I^ZeAP%N%HNJdYqƢmI=:@9-xO-o&.BҀO (K& Z+YKqOYlu@9*5>$!MpeܽJQC3hYK9bB$yP=IERjXb4xT$%8CdV[ݘQ쩔I:$6%|'R AxHTS$H b-{K˾'Ӏ  `"w-^!:(qKt] ՚˖(5Qڡt"2{{&>UiQc5zdju˟v!)yc}Fc!w|ryT0f$d 2l! u|;ZC5WJ"hiܾl\?`ӴD$6$:0}]tHnLJϜ-iP`x8_> |44o#0ng4T$DzOyua- K-+Hb+cE)W JIFuc(eYе؞Yv_@-2kޒAbYC2}mQ ;qky^˪(Į:b|$l D颗5dJG8hf“tc iIU"Ơ,< ui}X-N cׯ^ DE- Q!% S}vdTe=!ut2# @uh 9泂ż5Mjbx m,2Z[8YiI1 ՒIe*ܸܶv 999ji IDATlfbysc+!$p55ԓ8Nql i6؂dALgsJkMic>W >Dab EbtVhQ$< 'KXgQ ]qq e5a|BQlT0`jpv~JVLAYVubʒtBbq/bnz EJSՆɤ+k 0_Lhk4,~xpĤ) ͵IIq!.(N9:\0[55?/|͇}*z?9g6)ʕI-EedbHpp͍g >y>yW-|)\=8ysyL*\O3@ , l,I8;%#Hi-E >mFkbKWX䨧sc6TM}1Mi5M1--W(3&po =-~Mr6dQn XM׳*/:X{J&9%v='/??{"\ȈKd=!FtJ8 q)i7v'ڎ@ }! 8yC]Vzz@E0x?:AYJb}[p$0)B9'4OqH#*OƁA keL#); 5 e,Kb m)FGB.n@E6c)7I1iɠ=jT'_@c Q&c[dHDLhI"$0*i7FIEј1G@1m.N%y}AK7z:ё xx)+GPϱZ1ikXta$xy e1V| &=a T XT/ ?>;Td2y;%ɼK3/}/02 ?O0> ~Wke2'ˏ,>t?ɼ&%?g2Y|x?z/#3/}mɼ&%?ϼYiOxO22yg/2̏}?yLӿ$d2L&d2L'L&d2L&d(Y|d2L&d2L&DC&d2L&d2'J2L&d2L&d2L&d2L&yd!d2L&d2%L&d2L&d(Y|d2L&d2L&DC&d2L&d2'J2L&d2L&d2L&d2L&yd!d2L&d2%L&d2L&d(Y|d2L&d2L&DC&d2L&d2'J2L&d2L&ycڊBH?G"(xQǰ/T?E@%Bw"UE"P(c9MeNɟ8J<%ҏ3L&d2L&󗓿y:'$Whw b:㦽ɳYI||eS5倃\hRCCmM7\ b^-6XL4%G6I%8ao}`5P7T#gZ6lx;Ϳ !>x^w'JDI*uU{CCUkLO=>|1~:jt?FJ;Q%@Twǧc8^DŽۉW(u1E֬]'h0^.ȵZidd2L&d2̟77V>:mߒ}I9Tob{lT ND UoUW_ƿ-C9w''ԏ?O~}~;60)BprqM6 Ǎ"H( j7i' _¿%>ڟ?q3K×@ٕL ~Aw4G9֤ӻNZR}/__oؿ7CWFVS 5t'J"6xʁ(BA*/0G+DW==?1uBEM Zkկ3d2L&d2?RÛM6I{B.[3_Θ5SPSm֊,skeg΂g}g`'.RcL,')_W%Du+q/Eq~vol?Dqv'eYBm\E 03l=^ξ݇3eIhYAE5Aw~LEm6\ߠotL3|6_)Lo3̚īx\%o4B9"I~H%B Kj"c8b.y#rP5|)"JbH4NN Q }N/*͟sb;`'6+_{,Y\z}k3hAXy.4Kl HnO|+~K-8a&d2L&uO'$%/رw(?JmX>N?G~u.c[Cx$$q2$1B%j蚆JUs,/.ڃ jLY&It=#0IJ$Z}޼} |uy3\8~Wܿ^˯~Vߓ޷$ _ 5~;GKy{%^n'=DѷRzUTEQd8 Ð(NAe70jO`,/Z/sSz%NЄvg <;<>2ϿNƲl0$968-%IBm?ʛט58w,g8Ygu/=HiN1Gkϟܾ'qq-[8o [*Nڐ("ck6H'lի1C8<0$"&NY~`Vآ . 3⯡*UJmp|/~˞ $iJPh̟2-yDRH("32L&d2̏{6ȿq )^a=O?2߸*߼*XEio;APDQ0 Y$`<q˲p]qtԚ:ãrĥk܎n)>87)-߉L%޽0<Ս\ǚNI!Dz7XVl6YXX #thFx&vW8Ƈ ?$?\~9"#TE!S(g~~r$$!qS$i*a!}41M`h4²-nlv]G85MOoHi!MD0뱱d4D 9~8<dSf}osԟhPUAggo)%4ҋdm[bU @4$a2qJEbܘ2ΙL)MYq/d2L&d~sɇx{gkEș3;oqeA+)xsNKt:m C0D2"3 ,//Sש4MLdood:xGx]΄1yOOOrJDsÿAch~&|KZQL.Z>oX?s%:] AW4 rc9S[v ?~#GPըaHg}}irIfr~H3yu2//:i  sEˆ\.G\faaJW.F u Ev,F;;\vY;zF8C;)R|AGlF7t$O0e411G&7| ^$)iU/JRoOqCRv5<c2N, @Ib(:Pt6&sdnn bS') CX`:Ҳ,;-^^e]~?|pߋ~NaiR*(׮_v(F$* h GCZ{ }JJƉ]ʐH%~L&d2L&J>I̧O3?\`;GM?\q׶Q|pXPk׮qmF(N2L#7od1ӧYYYP(077G\`8F^~=SBq4&IZIk5T_dX. \N1BJELz(T4MVyDn,K,-rtyW*W! ]pHߧX,H/JReѳM #ۋf=Xѧɇ$I#)TJܺIG$ Rb$IvVeuf;I]\cO}3L&d2̏{*OJDTG5Nr#~ t,T*X]]EUU& }vwwmHDXux]+{tnvZxko,va "z6B{j|[F99yfYaw^gbM6 8jkI*0&lOKO?L&d2LG=|0~ԧ(Y%>]^zEF pxGl"2o3VO-#>`7:l"#rԍ:+yyW_g2p t]?L ,f^JE} o0)"'2>6$1R*QL躎$H 2TCMT-l<$6;[#/@ **SNH<<_^mTM祟g1YDJ$DBTg]8\.1ę dbh4N_8!<=5;'c|OU M'Wy,b^ gtC6 (!>B -P p^$$Xי-PVq'vw ۱ͥHiQm~@)Wٜ'yLpL)!VYǕ=dYBW҄(W{؃%z Cr$S*)Cգ_1$oWyRznES)5L Qi@Ȼ=ev-X(!>MZz:“="Xv0_9S<?h:[L'Sיc~~`'uۦ=ifKg?'LB$!H Q7+!tC( ̑lŔ(JT窘IYaNzl3WP$ZB|좃98X3GaüH,?L $IB>3 y&1G4)KTU0SR4n$iA4Nl3&1/ić# .uDFJE cpe:C\]e ;mvDad2tUƋ3 $!aH:r9]llSj<"=r|w/ P“I΋l$kt.[6'񓏳ޡ;2t:̤  t]/06nj5Y청m?QuT [lo1Jq9XS Ei"+rtvzFos_5?^#0lR,J.Q|+]O#Bb%/BA=WC|?3 8UE%ϓpG*,qIjuF &ӲER:7ox9pd [!w_0X`~$׍Ǘ/o#9$zZRCL:l@qBZECi 5Yf!~ n.ȍ#ngaaIHZ*CGcgr}OQQI(:E~c\]&I¢iTU<AL&|'/ͣ9KxJym,3L&d2LH>l&lF35nzA:RF$I$qBxnQ2yAy@Wbj&yBB)anfɅsMvY/Qoԑ`cdl9e j*.a/h5[,--S+טZSl;-_\\X,EI嘝%"!M֐;mkPԩT+Jy9 'gSlJz0 C1[qOS5TT<'\կηٛݧH\Ųml4M<ϣP,]<333DQ`0v6FzZ Jg[>:}OAy؆D+1U>ωF Uo6444}k'O3 %Q% z@5?tn&H+&$!uIrzS0 i@N侧WOOsY++l[=ʃ'd`8`<vEê0&t}YJF >~υ(E*ZilsU\BzaAp8d!3Yg] tEL&d2L|3&ߌɂ?I$_Aa޵v\dLT}>Na +c<#}HDTb&ۣm_<ϑW \Ɠ1jaa(؄1#9X!R",͢Dema>mCTbn $D^GTELc3%f/̰FX تlջAa_rÕ8œ\.1Nqy~c;RT8r\.mѐzMאn`<`0Dtq4*3/4x*Q1dŮîV}̒<>£wt_wIDU Gq&$!d wY}?"u;6z4o,2nh4:vbRtvwufO^{²Lũ6iwZq,y2,c6ɘ i9,!#yCC|H|ǙL&d2L&qO$""D$\Brdvp=pa DQ( ek N<#aWrQ<[J1Wb8.1 89`NDL %# R,$u\q 7g}9븮2rUU4)J C)az& PdE04rD2Ksg.MZxm^^OK?&4d!sB`^q-F:?tޠFkrulfeeJȲLVK2t븸99X)+ Ef+s̳8 wi+//O# ?j!@&LHFw?=?$-[Q78n[90i,rn;<=I/|SY]?e@:ZR(Ðtx<&bzz[ ϔ]H2L&d2L/=|DFNd4]cdiw0zrqJ0#8#d)>E]3!!K>V8fqyB1S'I$Q>!ZD_zlF)͖xwT}$I d  :n䢸 e̹y@ƭ븞{k4ضc;B70NJCJYf d2L&d2?{#D" YpdJEAQP&dYA,! ")"1kɇXI7u Ik6۴n$i9DQ 1 =1i2őQ89htM֐-6;4 * BrLPVh4 pDZN-FsZS& ^;,Y⾍y͹:|Aꏲ$-%-|gf_'w&i 謹ڋun6ަ鲳CVVQ,qy*z0Nu,p*#,)~w9y3=H|K7%K\/rT:ή% $񖯉-o{A 3|T(?JG밞 s'LS:.vedYF7tJ"+2LIz8dKT2E_NoOiD\q&ꡬ3Lv1! s?2L&d2LH>,E1aGbrX&/Hu|?wDJKIHD2QBzbd]FRV$ҒG$IPT8!M<ABB % 1")—}FF4-rqq^8M}&Θap8D44MGu1iZ}:f0 N>L{_eI^(唤 oHiK9&mw;m}}a۵guuZFB۱xc~+Gi5BOtg w$gqI=rj>O|:d7q$mNS?חd2L&d2=|8H$FBI`(:LB@B:POPQQP-CWV0|$I[spt!0hhvDUw (&c8FeE' ErzBҁjHhL_pbFAN*p'.7ڸXtd3: a( J%reru IQYbb׼K|N ,ȉ?!үs3I_xImN7+Uu m.n`$miw% ̐HYi4erszgm/k_槤zG8H~seI$!}{ut?>ȋ 8}>.[tvFܹsFA>GUUJ۷qM#g0?;B~;m$F;X=[Ո4m  =P" -d2L&dމ{&J!ZhHIBeI@'t@ @%n5`}4ז^Zp_S~H@#S$ǟg7ޅآwp4j\y, t[Bwq<잝CivX^^qFQa,//#I{=Fn+WY L.iXNv$&Hrj$ qo|X'qa'9It:=zEQTcolWk 3~'Ȳam.2=MQ*W KcP?וd2L&d2=|(ddT,fJs(ym jUU1t p% #sU&bf&3nɺqDeL//%/:jF*q3͢:F&rDC$5&&q"Fybk~4ۘjmwL&T*,z.v3QzFyčM8cWB~6G;7D僤w`r(BqqNkyI-# '9s,7[טZ6ɄVrT7(*ě 5ĖkܘbMEZxh4Ng:HZ&,1}M_SWE2L&d2L'Ox~ScxUer8.ш0 "]ibds;FxDaD=r8;ڸ +s!.+-"ޕ;x~z0r 8N(J[. Hu1&dI)E*`S{$$+|L}ȭūrmEBKR1n(=w³%n1~ !O& LE4U%|LOqP@tJr$H0#{++t6V\e*Qz CPUZz0cg^0d<!+2y%O^^E(2qհ0ee~0/*d2L&dCQKy\e"Mpʥ 8CX cE/k*ӋvYzd6"gGo<Û7k Mϓkhq*[Qa$I"Ib#lF J#_=֩|9F^`YF+ )At ݙbS B*IόIC}@JY)P,hX՛_r vӍvFJɘ$IJg+_PԋӯK7OP5+"Au0ݙxSB?s9iWPVڌQcRE틌1ͱ4Ki2KAn|{}F~,̞!eH {SPUŐtple[At DRavvZ(DQeMq$I(6삍'HD/2^w# }km qٻ8W>DV IDATi)wN[ 1B I 1 $!l)%&!@^LmX6.%̌4^Oqɖ\%#k={s)sTeDmYAw*Z;zjdO:@XH@(4MG׬Z ErJښCK޻ b|1KծF8e9+ii뢵k Yc:J|>cf=*f2eE~)[֓Opw3P-W]Ƕq], d踹|C/\E*P8+\(N0STm@<*|]"BQ=-snZ7z s WzU '\vyL*;ljjH$˨VuX,F8]dY%GI Nfe>l|0w2B!B \4KY\_ο(}YѿC)FFFhll 49©SdY`u}0JyN;DZx4b,l)Gțy!VH'HDE*tk>zTaJL&M6E *R*M1\"p «Tch`L&K84N0 }!bsgGz1\p9ĹrDfN5sqj lqTJ#M5"Q-FmK@)|]^hمO&|M^bq秡ѫzE9FLOw''gV+LNNA<q4M# q}b)NS( haBͬW٦mRy;!B!x%./] M5׵.r Ǚĉ(hkkCu àq%])>ՊeF,[iM8###xGSSuuu ZEo!P*պmXvs3YRz1rjƓ(B4r== $`Q(%0b~ mow=bvNM͔8̌SuJhN$+8lL&비QC:IiZ;`3[N1?@:\"l! < c9F'p盧ڭM4qxGԎҡw)eahHSxGȌLD$O3/|%32b N=3Ybrmwp5SISSj]PC^+`[60isqp8LssbHEfJ.s("Lh5[y&i| 7?O(m&7gh67GB){% "Dhq. FヴmXNeLLP,`zzι"-|G) MөT E 31zKKR]yaND!B!^*Р1F#b~ jC-))UK& BW sq]waInh^Cm BYܨ1dмU X,dZ'̟T24R kaD R4Pw`Z!B3Ua<4quVf5+!tu>}IYFFN3==A8!ؘ H lڴ|`n 7_Z+RbDPMa>PxJ p(i88LOOa,ZI`MUk?qF|+1y+ZA*7K\f|b 4 34|O3LfKlIF==-n!B!8_.&Ojʴ:{["]V+3i (ܜ  2?/=*bDZmoˁ8ضhF  JOo_2>>x"m/EH0}\Ϛ*шie2?@Nx6B\` P"L֎hZ*QVf $Ja&'6x;gn3{7nܢ݂tzT4>I}$opi?V&'(:qJD1F$mK}wJSl.. xM>Ld|mŒzz>pD !UJRxQzp!B!(]e,Ƨyau.kx =]F>RS)U kaddƚP4@-tw )s%,ӳfZ::: 2[!YIuWbh 7\**!S8J&7PS9e'Gq8#322iZ, ˲fkSqVl|W#E Qt3cl*Sٜ%9Td@=`7j7RG׶6>j|P;iu)7&i?RON(3TZWƭzd3YTeU(A=n1;u2=3LE /FS_غM%P!S*03U)s؎( Ft3VR2&( 朇i_30H,;@{\f8q)ysqݴ>aQoSwc8M/?Iz4S4MFi]B!╺J)iW_Em1}fZ<9B~vj17cJV ʯu4_GwMt?*f>~sƢ Ssx z{ꤣ OgV Uֳ7ko t;أ?ES{d3 k?Ky:O)V!l[q}QRk@M,,d3hOS/0!jnl-[إvR^Fyv>ޅ8W7Q2LʓE 4nΆtu2^]k]0  R,cP/N3N\f\\!/>u:|#tD{hwPnR)Wp{PΔ&>IiYT4 l6c\_ sv-ߴɰcq"&H&0&#ǁ0Tm醦)iQ FGi,B!E|נhP MЯ`={_'\cM"e5I 6*Q<~m:Pl㵕p"lEJ#^F*5t#%z [ugՇn!2\_ڥDT[[t== 9(V"P0MwjkE2(A|FH5&)Y9F^g0ᅥQnnjg;gasx[r`DK0^5xbB gU®ϐ )Dwh|O}yZi+W41S+:T_6plM)Tb6:k|WiWk(B!k"0/ܬnu )=ŗ/QKq(x+ngy>ʯu?͂𔇣ٔ eBEUp17F[nHv}*D`Bet[LS0t`[Pzm=Yױo/>k/v!  `&ג>(_-ST>pCŨP+%Df}3oFm#Iů75nnqq&8`:V\ Έ ?z\zQ(ke:k۹Nv$ +/44T?LLUF,D(4K',r*-z+qE)5\CǝڝܮߎzU-g[V6(\:}=oVoăB!J>kT4F~G 2>qw? hh N=4[խW-͸˽I)7N|icXx>^qqf32wq~=;=Сu6mIO/S|4.\D3T+J'a "hTA]k H_ ]U.ؤ6zʥ&6 /jFˑ ´?]@~-mlm*=lշR$Yg9>>;Nb0Յ!B!k20o:uJJަ 3, +bZ6۵ |1ZUylRĈ]qO|&ncB!BW5|8'ѪZIl~;;pll1?Cհ7귲Se=6A7ݯ(WL:I!B!5.phJz6h8JC.k5YJ)B!B!ϠDaK3Y(y&7SߧbSkaU.+7$1QOLfd/I7]A$WWO@dhW9M$kj E :_[B4MYnV Lel'AP{EEPD=Z5[im0(V\Ff+81%ZcabZy}Jpho `B!B\(}a>Ƚ?rqN~cwhD-;|Y~t8.{U>~qOn>U8|+K noc8G^ƶ6;(>œTLJcS8 K#;לu=3G/w鷮eES ~vӏp{˙ g-' s T3dY|ph1~֕7e |$IA!B!.:pp_:*í`[szn #>G m#U4jqo>םܠ̧9|r'|xO=0E;ϧn^Nq|__ԭ6~H-I$I>z?;7l+>EB!B]\s)8VlXP ^Kwyjz=ZxʰznyuaAؼHٮKaV.ş +B!eHG5C_o:B/Beť%fX?ÜڕxU6T>O?nr{zYR/.v S~?{#pGm007WkcEE4զ ̙(<95x;Zp{zx.Vv7q&3>ϰ*n}=k9z.i/˩_O.sO^i=|%bgɇ6k}̓`pħj$3>]ƝiN '*h>Q#$J IDAT@ȉ1v5 P&i7AWL(Cnlp`̙q+iЭw0U3>bez6 UUU\g{הɨɬ}2~Q{; LZsg̽A); TL)F u|B!BN>0Z0W*<Ѭd㷮nGQu0 #\TqF~zB!╸ž- }EuoDWv9ݫ׳3L]ܧhB>8ԙcacg}9l 7lom+Єk Mi|nQHLOf2ho8۲ 7iޙ!u"8^䭊j_8}Yؒ݋aW!^6Cz2ı;v FHt+ kA܊sA~.i,;:ރ7; %Y8~ūgz_mZx(38/ P6HLq}C+%2#xսJ=kqf L̀sp5p;ː#[.;(6iOGSCH~`1b9y3\[}^B!BRuڷI쁞~d d i|,A, pj6u-ܺX Ts 9^ÆHI_g5򩫶p]_7:+rwglWcòm$CQ:(xKAVnYy#9d 30soC~ 6ʭG` ;_obkvXOӝ{?ۀoseciǟK]Cܵްx<q-cU~wV5p !B!x5]ɇ?(}nŸx0XTPC9}8Kn\L_Oá{Vu 2iddg$)>xU+ B|8+/&@jqav 3pcx ky2;ac" +n8aLu4Av_U@j/[}Wj<@y48ƯdCoo}?ZW9F5Tuau~,b%4jh(QS}qUYcm"_fl2|H_,%z5C.k#_]G1y勅%5 vx~!oO"'l-uB!gE|ض|e'uvHi߳ZH\wM\`7հIi8雎s}o)>뒬:V^GrA3{m6|YO /K޾0Bh者fKѧWMkpoo<%3M|Mem)z`畫Sڳ݇M>͋g|d{7݅H\Gɇ:@8wH9a {7oYҡh; _Y8Fvp킜B!B\mÍo1;֊LCn9s@H={HUO']kj.P`[wP/ wPswyqU?u*$o2F}z96:{wv.{/{=,DWL=?>F >(k;(i<]Ks0´jecԖxΒ@Ħ}0o ;x 62l<*3^t;Fo-o?r\bBÝlfg3|$W|B!Ÿ0k s-?ƸtdY8~>>7+bn`?KzoX[8[Ρ)P 5m۹Vn@Wȟs[]`٦ړg,2K0]Z#h*tH%GP(m;Ɩ_{[+k.x|N?]; ܫjǴ9ʫ  uje޶*4^}ޕ7Dt%{*.~5ộ.y !B!Kq|Xcxx_?p{Uza&8K!PI=mY-p廸tGcϑ tr>t k|[[kP.˰܉[҉Z׈j^܌k6ޟ{b?W3ߌx~x_M)ˬȽzb8mgc^oo)LCm&A m./sZ5V1McsbV^qFM)5_}Bп m?_#~V~k[&j3 uX!;J 04*[z397X[y#y?Z勗sK* m[Ҍ1νK ivG]~~c Cz*y6vg5I]+!B!@_Wu7=O]v#-l>v\B;F\/FX\j@`z|hut,!T3RO춆g7N1kNW>1#H7N3mggMH<-zM*1쎓sg\(ZYr38Pm@> D|ڬuf2]Ɯ)Ni{&FCRpˌTXA NcN :fZwswH73;PJQ񫜲G.&\,.Y29 x~)wi;XDM'1tEFP a=MĘtDYrK%%;sA?Gqqߗ!~F?|)2iϥzms=ayM_PD9FNz3yœԛHf4<%ňcqlJl%yN=P+:FH~P P+a(@3gL|YLhMgbXW}%!B!hk>!B!⧃$B!BqAIA!B!$B!BqAIA!B!$B!BqAIA!B!$B!BqAIA!B!$B!BqAIA!B!$B!BqAIA!B!$B!BqAIA!B!$B!BqA?Y>c6|Y"QWWG}}=p]ϺRUX!B!I>*}Rā{yG b 6mč7H__i$B!e- ^_\HyRVm1M@ a q_l/.gZ E8>Çp=J9ƞl #L?=.B!t:ʀqN:޽{ٷoCCCK{{;;vK.!LbYO: j~ lx0 Tj! B!? Ka>}u<i`n˙Y8^蘮Ig ɐ/hghh`0e]0Np8v<۶?>FGGu^.R. /+|g?)c:$"i5-|g&@ p&фB!8o۶ɤR̎QMQ-q0ln_4R/_aM tQ__a8i\CI#GTʱnu7O!?ihHD 瞱 v|,K{Ib޽{c;U8S3:|1w|xu]RF-ѵ4K,=^TfzfT#~f%HVr]wbƍb1I@!B!^KqrO>Fx)\W^-QH?e>s\xSi;([}B @ͷ-[ijjzų+l&222ɓ'öm(]]]L&D"ƹ/DF\fll\fP=E,+ L5tM=g| V֧mJmW]y̹ιrD&"0dʖlYR}?p~oΰtt:`diaRhwss dkkq ]HЈs9|?[޿ɇH$` ; օ@*hQ&PhM0Ok@O )iPKfXܤxQ(c̵(xo&կ~:Z |>W^//~ yR}[oɱy$c ht$)LB;am?V Z^377ǥK~:J!PU9w{LOB ИFcǎo}j{G'Hp/t@V?/ """""""""""\|)a$ R#C?p:ݍ tC}-J^C)5({h2HH:'ba3cA,QeAr,REU(ܾ}/r-:,,,F" ɐ1 hp~_o~y_rۂ~E V7YZ^'O`tt q鰼̽{x![[[!(Jr!&&&d2#Dߠn\p5<ôLJCCLOOo~|}i| b1T9a}[wx $IN>C:BJ A)EۥZM\at! t˲_.BR4 ^C.]aQJ.^8Od3|^Qbss/Qg! UR8$sqfggx׮]㭷bvvT*{}k.J0;`6\"D4?/E|RH$}(6^~ZFݦh^١>buv#lP4ZP  {.ʆL2t41=:J6!Leb4LKZb=C`kki&&)Wܸq ]ƙ3gfOvW.]|>kƉ'Hes8C27RrK.Q.yWFJA>pxeYdYFGG9r˫iweaa!%t fsdsYZ~)F)JL[w]xw,ӧ_fv>a`&.]yʏp" ?#ϟT*=|A{o[._^=11#G8~8Νɓ@RVy&ɤ3;va6X]Y"/JHVZ:Kүhf` 3$ CC{d"fx*Eڵk'?>`~~VE&affz^z^z*"""""""""""Kvx,c##(T@beu0zUtm 5@Z@=4@ױiJ8w}N8A:2M48Sфd2#u- C!:]wÓdY߬jvbw >Y#WW۠&"{?x7X]]...ȭ[(|;СCv<"""""""""""B4 -J#iTF9U0h`WP0t(F$f*FTdl|BeYO>TvEWl !R = &t^kMb߾}) 64 ŬI&e`YzSr\6h-n͡L!|ǎ>šSTkchdTDKX[[cuuN| vIdbg;H[PlQoM.WSVh[(>ﳾg~"> O&N$BJ,æT*q n߹Ý;wq.#Sćn"V (cryj*+++\|1:^KEK\fuu=RVC ȤMa;D*n" J<*/Е7H $YGK2L\e}}i\UyV8}R;X$yjt8|gee 49p c3wM._̩~B|*Rć/",G @H!`  3-籆7666X]]eccrB333~GJݞB(ʽU~f>XXs,.srYN8A<GPUѪp;4~P%_@'pidr!$hz+e/y52 ;BPk!,IJ&#GPt68q;j !ILƋ&)PÒxۂ{IAXXX`qqRihO'uש\ gwȥAJRJCH6 VU~wWG`]$r~3lm.Lf"ʳUv67.n`^/^͛ds%N>Ɂ$2u:[rh=InwǓ4V662Aĥψ7WEJ|M'}bg'&iz2cBJI,Tbe3]`RZ j:f3jՈ3bw΅Cmv4RZ 4 yC(}P$B&b$i@Sl?C-ÓD[/p3*&=p$}Ϡjqͧ.z~Lx)Z[DkﳽIR 'Yb8^׸x=>3Xð8s4t Ш^/_bBߜrbKE&!2<:eoos6R=Se6lu !$eR,d]mO5yFd F̐vVZF!Lm}v(:67n?1/|[Nl5S⸗d6x|47f{9-ƘCF7L6bm Umq]wEex __PRLSq HB!B(@<})AJܛ?!oXH)QJ.+++!f<3b1|gmm7|w}'Np3LMMb!%뺌y`O>,//o}{AyM:16$m烷kƟfvaҙ¯t?mFs.hMp]NM.RmD^?jk $H@:͙eݼ9}= "ccؖaa[! eG붻E<СLND 8HH%v1 /4O1c7ݻ|,//S,9qa2022ZFZ}Re}|M4Nd||DZb0 ҙ 'O{ru~m\(Nfm G2.۔&Zjtѱ{j2\9Გ5զvaNJ|yFdžAy 18Ŭ_+2;{^C)e=(MLQ&cFebz=:jұ8tXKCRD;~p1|ܾ}zNΓ:lh.KE*; qO%|eibP 6oVY*h dXc73gϐ "!""""""""""+.Ǝ%@GmcS/& bb^jHk$ӧ9y>ظ.9熆UĽ#Xص(]d`}'e!'}OOґ9$,JT hlZQ zM%@BSXi]TΝ;(iFCDDDDDDDDDDėW$>YtB]>@} ǛBo}rJE딜#EM9鳲"d'w*`n>?ܿo|?~loRR dLH),l6K&0 R{'ƏD4h{5p"y)9v/"=0nҨU/-߽*A4[A.Et:t|PvȃNΐ*Nɋܽp{H!1 0G4D\e6{<J'4k$c?aŨW>&ɝ~pZ K:x[EfHO=jdb;IV]߼6w%gl /] :m ڇ<؝TvI-2NCCBc;`'lˀ~Ie6~3Kႉi e8q}yJ+Ymob\.eOբaY||>eY{]eiigpYff0<4D*r ZD]O!<@ =: HBHqz{] K}mw!<@m6]wPA=l`_J"lQlt+d UYɱuzʊ'ia߹H|k 04R*a sF9v'~?sLO nϥl[\hwB \ ?:(J  JKЃ{S NKpܧ4: -,Sc -@X-65(SL𤤦mjdN{ih4iOAH| GtB&!̰ݣ(%,K.GoBPl<2luKAA5Zt&CC\+bJa-4ڐIV(t}+vokÒWE22N.#!edzaCi7"SkV`d|@2 40 kYlI(u:]LӆS*] 8BA應ISb,L:O3j1SaMLFXk F؀C烡M$4|rCg9rYuJA`xdWYY^&Uؿub@ ,1t-'WpYOe~5W^ҥK;v Sjć5(m  @%uN>4Mn߾͏~#~9wE2<4{VLQ|,;HWQpۥd`Eݾ?a9k8xq`~Gu}mDwtb Y0AoBɧ^i8u4fuuu/Vh2Э+Ԝ!y ~̭X-v{=AB`=Jk@ `!`=cȘaZ  504Qiw0CwOMl@!yU˦{yCy խ Ÿd{B-½4a6~F  tp:ha8Mid uzK*d"Sɬ";.PaChT@m A:[~C~M#NZ}i-.1Lauk2 #S3 bYB,ۡ42'Vl1 5@$b-7CvoJט*^?Fv{7#7DDDDDDDDDDDW|얎U/:VA}bb{Hh!Ѱ7… G?wagg ^yΟ?G<# '$JQ1H<C??Pe`$.Ɗ>_?"~Vz ^xu8ި1.l:()6F3/tP|s:=oQn|4N Wk.ٺC}:zeav wX?䪙j@{*،DH#xH;zZUR0a7ÀV2 Gfy9󬮮X譯!}F` ;[F  *HW#T{a-. RQVY[X{*p;L/lJ 1: &Vj{5tF E O1rRk8…1Rda u>IgyB@Q9J;HבN׃G<$#O^ǎctt6Q2nC;č6vVp3`ĀBݜ _in¡hSmPNX`7cpW`hܵAhV7|ʕ+A@6_W^all0C|^@i,.oKFo=') q͙&9o:HNC\ݻAz`8cOyhcSm,CZ}~6F;t^F .懙bOHvLmcZӠ:hю) s%{/)2}.ߣmD)%N,F6S#2)̤ dO#%HSau+|XDDDDDDDDDDD2Oy[vM O? j#7nWW\<,6Ν#J9<*La|W_} /8>Ʉbsd~v-p H#^t\׏m?ic|:nCh D cM Ẻ1?kw:liD`IDIK&=i-1Bc M ^$h/M Vc YSj;}>1135G|% MM\abCӌ7Ru -2;k_ }ҧ\Nv:ڛ8t4ZO,c  ~-!04R !T <0 @('|¥Kz{#0: tzOx'Eݱa X,ҋTvwb9Ha}dKdsyv+=sZ 69E+iro:CÎc.g,93[<|8O(7=^>eq,K`C Ҏd79BHA{RҒqt@2S`are>F BYA>-:r9t: N0`5jpź|%=VaE+)0 d #J 0Y\_lorS=4M:&A!ж@ NJYN=~jg]RPo :}@:xBb|8]dgso-x94p GfR E0.HV!eO v:ܪR_1ZZqF{Nh4rTWrzr}%~`yL]@*g{?B FDDDDDDDDDDDD|àp"BAh!Өg{{ٳ;Nأ>nF)wJ.Pؿc7=ḎRCXSL1,pZn./35}%3c4t[eqRYCSd$RYl$;tͿOiZll`()eՌď #@8 ?W C ;L wY"ߴSIJ,Nw=\7@+)C1=B,~Tr8  gmiVh(,``%i'|X+D`5Qnb>cOsufi!&~ SW *ݛZS.0LfyE6def>!BcH%D 3%s̭8|2`1z Ml  _jZd1Fgˌ'xp7Wp{3GhڝvxKw+Ip=FM-xï1;N16N""!""""""""""O4 j@l{.t@-$ɄP1Fm }a! bV 4UQcПH&;lUm8cQ'a{a -l'<ضM7H)b8 ˴m6{]e~3uh,"|N@01YFD:a&NU@|rp '4Ӷ) 92F *p˴,I֫9|s I" e"]I/vC'M L*|bG(8X$pG-BhWJ`x!qb0ISlh6}NCR\zFeG0H1䠽gW|mPJ`|! l'aRCx)AkEmF,O)1w<\1a=Oh`ZjO]{{'55Z}[4&(5 ZE3L8=+&(;1ZuutƒrͮO ;Ps!s5NZWC41t"!""""""""""O+3#&r bqS<A^CE =>Bm p"d8B *=p@#c*ì΍7rZ:]VEVRAe(S#uŞ҃@K B7R4GbbrzuFw"nXV0vzJ BX8 Jrǒ,gv?fB"ch M5Ҥs#c9=٧2uEßa|ߋM Ai[.t?pN26Bb&%ϐˀ4Zh??[$| >c\?^x'5ЈN½T!_4lMLEWHUy4B!dBlu&V2gOL 0QA)ԖP3;Fv?Q(9s4qG 2DߧS(xרV\zj뺬mͻԚ>H0=3K58H[#c:,m*Zvw" K|_ #1],*[*b4VRƒ@B4|PRLPU#,OSσSN9% Mn 66|ni;0CJ*ƶm岘V !$1O 4h =u=!=K۶) elXIW42tix,4dI d>S`g)2k]&`X.aa>BI#w6mjlHUDY$24X !T:P^-uP>$bL$LB&!cc Mq<>P 0B! hd-Fx|C^\°)PNB)*+WH8) `64M`t]7.;FhxA f\Aov_Npy[nQ,xwDZm{]BJ8aA5AP((Zs Z6nzKUgMs9'ګ*$Aj,YRXjxbƾk]yܒZjn5&; ;PԖ9!@R̝&@̓Yx/kϗ^~.C22~s)JyرFFmR!ER!v\nH1/;rvi3t 睑04z|lonu?&tZIIH 6!-,1qdx-.~3:k37wz71/ŌUa6YQC FKTEn䓏q]W_}}{=zu\{aA'IJ,8eYZ-6R`,~ϗ9qɋ㠤4NCiD(SB*ʤ@I=RJQ.ޏDDQLFi2{B kPT|P=1¤ =oxv="1u4z(88|n -B*cs;sNıD1c<ˏxu,` 2KGb ( 24a+O z v\erji\_kMQHCN)uDX F&H;L&{F`]kZ鰲geb om!Q(VO` :=0V\/PnH (}uv9$>wc e9y=trcıjB/fce6ջQ,(ydZ ^ʿ،5ǽ̍37[g%~ws_K|ѣ 'h*^ye&MlDvH %i&He d. e[4cDQ:vJBPH'3,Hb1ch8)meЃBXê05v2!xҹ!H Oď4B),@Z S]-ryGkM-KkD1!XcNg1FT<.yV^O`1z<67YGy7Dh(Igbɞ#HPp"w.~ءa^$bq% &"r)kFFFFFFFFFFFubh8)-`dB>ǚC@@{=Ze[`aJ25"pFn1Y6S%_(m!l7Xsשo_A@ xo-p{y%-.a[6 ?~j[ƒzoXEVX,&'Ν;\z82Nb5-Cl2BjRJC"^%*02+uDQ{!@c'i&-R#oI<#zp"ai^`νĉ'gF\`[BY*tt$N$^3N;J D1Dq2j2t4FE^`0^311AX|y{.4ainnYčnPI.5RmKC/R<^/ rTjF[{R]-$>)}r(]nsRv{Oh4Pڻ{lۦX,battgƇ222222222222R"lr:T¯U"0ȴ_ׄA C] ŶEǐ`vB͸ǨOcLMNR.QJ1v6]F =۟R0[PFyGYNqw.\ \2=5LÐ&1AX'`{IbwwѪ-E}@jH:2{IyEI|zٮb$y~?BLҝ`Cm=cDiE,er.<%ȘLԜ%1aC$ߧ Ǎq~'He#$ c>2%Iڅ֩p$DhjRώ+cun^'/Qߡ=P=Ba(e?>ȑc=ƖPVH"~I; Bk΀eevpi4vNQtضR qettwkdddddddddddd]Hm[cȜƉLb, zB NGb$N>+秙LHAA@whfj/0u8R$250Zyi/So!razJ۽ZX$4R XLb[2J#eazC&ݨOZ H';b뺴m<ϣ M;W`?maAl Eӎ a0L2{-)2B6Bt$F2iRP4iyM: +Xg A5Xv~}sګ?M;7G돰~"HVhPQ2zbۜt/S|'ܤ.Bqlאu@ddddddddddd&}]M`~cnr/%I.R߇x*@ cXضMOD8$)1?| ?uyw%%F"Nvp""B#T*OMI)l[1YHvcK[(I1:Q(R|FytvIR; xQ 11W\KEN~o~[יAt:;5'g5/KP8P78a9MlЖ!@%i~z%sbMߧRT02C0$e ^$.T(;-q _Py]ڻXq:~zخR~"\d}'+ =<׿BI\2558|~akqmP\!ĈA !lP.xJvp"$"Iovdϋ&>x)B,+bsɹd 1d(>!DF#Cfm2^'1Xm!:-:F}6q ` 1ʴr*'%!0"ZH K t#pzfjz>m[[ܻ}ݛ0L,&FhXJ"DP7E(#r AIe|."pwsqFSLNШ7R2acu\[BGHvĠ&t$ڶP D0X2`}S\.IB <=6`fv0{loU 'N|(%`{sr (RH@Rχ(y/$b! BZB8ŀ 7B5"u9éGqIS#U">n"DJz܇4Bc\4d ߈\l`BL&Cá~N G 6{ NO<)RǐWO -tDzH0B<1ia;Mګm9؎1 hlnnkyp>.FBN7 !A uD "$:qGt $"RR/dbAƏ(FGMDBW`ݣO0u9k3"ŗ1ҲJEZR$܄6.%f#,A6n>ǡRlQ.sK:1Y4QRp-#8m-% }G\Ts2Qb4ƑOei bئE=@&b X$0( R.P& aQwhnYz&?~"~^o׹[!A {腱1lX ʵ}Dl:,0==^|J&E鰹) \_2,JbPJyo $Rb-e} ȕm>Z-}%MQE!qz߆c$ϮӅ56):,-]ΝE2ﳵE8 F( 8O Dk5S*ƲFFGGloy8=U چ -Zyql&k=SW/ґ)_sx(, uFh=߿ܹswDK)\8Nt&mR dԊs !ǴZmΜ9Ù3g(JX 0E|x饗8sL".Ý` À( R! MD LCRq=Iׄ~{KiLE")qlul;T|I!!VWY`skfsnx~{maBPTs9`=t8 ; 1>>{@gͣG~nm>ytwklwmݰ@,(>ʶpB@PP'i4B׶mlu]BbDRaVh019AT&|Y[[jޥt OA:ND^~(6kr9 RRLR&17 B8NO'qz BR8rbLVczzRo4ԨP(YXX`gEݦ=  ΆP8mt*8OPT*Q.V qo>?v;_Z8nbt8{]{·*T2#r9b@XR癙almmj5٥in=|O8N(ea;697) Zj##duT{8}C) er{IgAڑ>:0&}: v{A!²Bk?$Rsy\JBq XʦT!u~~A]J'Ja[m(q ?">t]jť{lnvX5ڠ!bx8P?Hړ?ұ x~> 1lטt>qO%TۊF (qp-@I@ I.[|,u=>|W w8)%re EH(9Et^VǦ B8gd~k mP20220\]ûlnu8N((hH m+>H^`ދS\H!J>BVCA47bB1a%T mAk!QR3661P(VXE-eۛxq *1<3dš5B?\ODzr䓵bXu]G@.qammvr:db( 14ZC\ry#OQlR?J\ćzNP$s1윃 tXl\xO`q(岍њf!cGp$˜aEF"I A1&֘8){| 5,ZJ;(Zf=Fā?9n_BW^bnvb^&~(î C0I U!!hR!dH(!͝GcpzbGD&>ddddddddddda<,ץP,06 _$H@ :)o,>Z?Zߞcbsw&J[or~*!I7(" : T):{:%(aZזؖD$3b/ϻt<}||5U@kzϡ9OqщYFGG È]=zď~#6ϟꯙ=0W._N߷A䉍J`jKIT>b 6Hh"+BkJ#Q(TL">dI/a֠ jJ%p _5jUŁd{K%~w -GaaB HDɘ66Z! -Ķ\le4׈M#[Tu4LFU ~`-=:'(ǎ?%3S=6YY[7)?CQPil5#$Bq,"C5R䜔TT$2 E@:ɁH$[n"Jh54 UHeaKXDRrʑ#G\c9E0tHk@A`jEA"1L!"!FGAD(L ё'sӠT$\&/_"VK8y}'K*M}e\HTV놕*u1JR<ܹõkh6LMMkr 1*5F%NWh~Uh8b! kܜQΝS);,zܸbyrPR>KK ^|G>r&uz1F(Gy?/1;y67kWqm diPrj!adji.]yK+=׻hsH/1FX|=6 |I6R41zysg \"i+P8`z¡ceMf83=c[w\j,*_hrZ-hGX;|uprx2TqfՍ>%9<[#*w|Vqӌ4itun\Ly쟙V-m#:ZڄZp4]gm5.ftt|sxQJ'~{w| L+VW2ׯF!W(n{lov|J%8x(ŕ˻:[[9jAYE^zA>mi2)%| wًջ=:_/obtF" |~HΞic,=U>$|K_| >ܟS>puG2|N{J+[DsS.T9rNp}?->rl~\\pX\|z:A's)DH&|/_&c<;;;_1,..JgW{2|+u\._ƭ5eFW }WW -1oOcj^cirTkUF0bczue70F&c !ʅ ]//o 3190Õ.݇ի;8_1VM~|ɧ,,,pW9}4kW; Mbϓru.]*ύ! X[˕˷>J)^z%Ο;w>;.q H9q὇ض<[vs1=j?;<1[^C\LqM{>-yyff}n&Ba/5###########y\ć!P(.+++;--ο|_^˯P*i|>hnjyO3\ο}:7*ϿC,//s-6667܋%p]~W?O1w`o~^>1HRZA`rqwɵ;;ky|KEoجu,8LMMḂ~Ν>_c<>Opg8,7r<Q~s_ ȍ.0wlcϠ57{,/te6BIFkJ#KtvvCU3ǧ8u,c,;Á{ Nc QP,!+c*beKFjyώs`f{|1;]-AG<^bcc vX^^kT.c!>fʸB`!ql2gk 6k=~{vLNN31> .]~yÉyB7| \n*_=-Y\%V{dfd} F*wsN8rj5Ϗ~#>e155AʲD\J#0CG \PX2C8P5#T<ϣQ‹s":^ϣ)Wr%{$#%gjT6|\^_44kkkZtM]X +T\EvBMq$n[qM9 IDAT4籸~[n3??ϗeFFF;ܹիW9cccxGT VWWw/xgry'Ǎ<`iq6RYȱ#uf]21::B5 o399I?).]"q)oQո{.om]NR>r$T$>HTjю QȊdAԦ@AP }Q/<)uM@Z8hE[PI\:jIv\K ><{;3K.r/~?33w9 EOHʮΨ۝WRǵ_hY9:q9$I~_˃U ^ua{GSJD{EQi9yIΜ;'ΩՑa|l\.'JR+zKz3Z3gڪU+jVb]^:y+z:y'ƚP=flZx4_ڽ{>%/ ;Β.ƛu:ŕXS]R+Tij)r6Ei|zRO>|P?K:uꔾ'_k=$in>YU>+UJ2n*g&'+MS??krrRFCaWЇ> >|X=~{j=]SuvOÇvQwϬsN'.K ӊ{t~~AoS^쬎;_|QSSa1=xpR_O<혜7|wGS2Jw^-^W~R?{;=ĜΜٯW=OVcOwM'ܙevl^i>heeB_W?ItMMM_OСCַǏ륗^=#c;~O?}sW/O>z_׋<_#GUZ^^ӧuZ-i*)u%VjsVZ=P+f+{uZNZҙ3h[roJh{455%IZ\\ٳg^7{nAE-,, JE(jTFmoW /jvy ~@56>>tE:uJΝSQri||\;wԮ]TFIҥK:u~mʫzwjEQ)MV"SjTzZ^ji~~Y{5*hdեK]u:|eUv:](02nĉ:q.^(S5ci,w._<ݎyXESUTKZlz/TF46}H;w1F{OOTk:sgUfl؅1N_.7Ii~zc٧;wjvvV{QV[UQTr={F{M _W jTBN44;P=².맒@zCʤN+RIj5EQ j5}{ӗ%ڷoqMNN*MS:uJ?Kz4;SӧSzyt²oe:Ɍ:qQ-kr&&Bu=]VH XͱϯB;ci}7ZYiHF PfSriaaAjZzJDFC{fffΞ=~[KKKj6z'n/_ݤ u6ؾuVVxQ>'o|?x_޼ʇ|~n{QQ+ 24YؐH>JJZ$1۫nJִfj^A'sffF333lUyjD^^GZ:-Ih6u`fV3{iǎ9sFΟ?hyeEFCABfggsNiRWvirrR㚛eQ+cݷW+ώ(hL(^FijNΧU;wij}ڳg`.%U*, Ca]vCvܩ~?~oN:|?w{2-oN.V%4>QQ^SZX#|S{ݻרծ¥)3ڣUU9n(ެYc ak͎?+keҪ2i"y+KH; ci1O5c^Jsꧩ\{Q>aSP^W^ܜ _U?ޕm]y$UeDQ4؏1Fڵk彗sl/Y#H&52IeToI%)0U0ɇg#)\ɹ@E2.||\쏳 &u@@ mUdMOY?Q?e[U wUp-9k䭓J&sg&|NjUQ`dgԓO>Cz뭷4??o~󛃎>롇Ҏ îL2)Ѳh.5*dRY'WS Dy,3xyJK2nF;gwjbbb0>z>E*5Wsq%W,>K Pba ӸAVkqs&w$^ujZS-sڷo$̙3p ^=CFm---I&&&$QXݻDZz^>$ߧt}q;z/ɤr>Th+ra(gUQ Yd\,j2>DJŹ̂ HamdgLȚXdvUE;++.\/>ޅ2"ckٰ 뇿0JVVpq%(h:pW =97x~SVPNʥɥ&Hch$bDgG/uZnu3:j4=9F ʴ. W^ᗲP:'X%yGJ&JP6CFJAH*zx P:Q$i*IӬ89UkH8iΝt:tW8ZBҠctVI`vءY5 9l(VdDR3Mnt?rȎ:E0=fe\ BY1>",2^~Hd蝵 Êr;C@G2ʨ/3\/$y/#'bEaeй^/c}XV!zȪo9KeQ ~Q q#w@īo(ҤI` o<K4vMޤڔ'&Tn~lM_js-U>8_QCF=YeS)5 ޳(4W#E\u0bu2qFY/EQyuIz=-,,(MLL k (O$Z^^:0T+k޽S0 kʇXVe\ϪMFٔ i$R8E"Eם`4x$kdX&d̘|yhGk* lu26I+(V=#]c RUKgFsJH>JA'/"02~0}py'/y@UEQ*TXk?7zZQ0ȴ8'갢D2>olǪDZTWCI5M ܒAS$ɤUE2˭Z-"5LU9nư}}p@T*-,,j kVGxt⪸^NGNGIZDZ5555x(X ,16x焔6Xh0mLd@6e<#&G4<RRʺ}Z#cF,|(3hC^UQBEa(7Rp>aLP%/r>$Jr2 L0Uč:c}nvج: LP oz)V~^,Ԭ6TVaq6J ,ݷ\VdW:f?x_u*I \H '7_g_VU-..nkyyYZQ$|+5Fm47IRmz=EQ0ժ&&&l6]yՀlE>Ȗ)5EA><Ū B4\aU90K2,w!kF*o$BQ6"߮VƆaJ\\c ThG36\'d)V4 GQ4:2wv&R(tbcjEOH4TRU\柕S ;+k Ne1;ϗ6[!mJrΩZ:}KKKzjS4.T"Y딦êb;EQfz>Xs4x:+:4$JG2 d6*4(ÎZ+\\e`YɄ=ɹ<ٳ;vn"9IB)sXQFQ8n|gX)|}+v`ħq~g@ cWB:~WJT^OnW*d" ҆AP.Y/J Y9c{yՈY0JN;Ud*Ww`$}V]y.S֡*jll\vKIғI;r'WS%HI_Iڗ7zI^( q*XJJ2^k6Al?:Ic6E@QYUh u.n~⬒q+;7a$^ \*|p6"dsC#Va@>GYGprJ`@V8ڱ7dg+`uAOO$=BߗuT߲$ "ΗU*TA{Nߨvd9Cj!بqpFƕ> gsx@R:tIv4W_I`·r!d7'k.؛/gɻ\0 1h~db|>WF}aPR{rc9Y_F 3zBp^ۢJodb=\yZz/獌5V>p&@1$;}Q/7[yS>|*`M0"( SS>AIHAjx#$Gm'AG*~\R(inNWJp&$QI()a˯k Z`R0%Z ?EuA|8q2(jFvȎy|C/TZ(̗LU\dyѰ{q$dPȅyspFC6DUyEp !9Rφige$9y-DHUVaFk2z z-c:'$UD7ʇ1|UiEm S9y1~W<}moak߿q^;.,X>󷷞]5>޵罗Thz7Z]$ztl h~S"s#GslUoq+^;)owg|9>|q7[^^Vo{1/<~3-&>j|lMVk3ؾnV|߯{NO<(//ln?_ڌvk_z!aI2|k3ZmX$I$*mG׾'VBKM |$=?*?􊤞 `}5$I~~?xJ$ `}5~←R?KXhh$}SVIooSV6ECZ:ɿ)Quo>_g%h3>kZXإ4}DnI۩l6uIHU.UfU v?zF/Ws7R*NG] 4^OO~C$ݣl`l"IB 逤}XևXa@?|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|"|CIDAT"|"|"|"|"|"|"|"|"|"|"|"|Pvۘ_ܐfv\zX$I6:Pvaf܆dc66l7 RDZinr[]ܦ5l_Ʈu6VM董G7i4|?}/UµXz~ AZF6nn~g}vZY&"|)u^a:ګ2ƨhz$ڒ~wԧ)^p{zu?\DP0cF2o˗m ZY Z+{8dY `jjzǺ$|g4==їmbڅu{[p[kjA`#fc@ d֮Zml:pˌFk +xe0r7@ժua%Yw%._^R<6v٫c*cr4MDn$鋵$f7~t |1#7K#C`{pA #B'ngLrmu3Tvt55C^WHu566>c[8pw();urn$wn e n՚c㛾_x^^؆^|[/[R>RM%IFՙz?{X?g2+uꏿnkGT-[u-.-);%{^oC~>xNtIoqFjۿGU{5q.]-G ^w@;bƏ4a /F~Wz3N'HZͧ^F˞>o=\4iTV!q o/xI'N̫+iG>I}>>ϼ7$Ug?vNԮ=sk>\ܶ;xZ+˃6h >Mީۣ~'~٭hXͮ >|MmPeUkAß~nP ]MqPk |rox[bM(/^wn[ZC-v&\w. YKbެ `Iӯ~yRÅCIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/Gallery_txdrm.png0000664000175000017500000054753113203343610023542 0ustar jomajomaPNG  IHDRsBITOtEXtSoftwaregnome-screenshot> IDATxw|g\K'! %DZ轅{GD;(bEAQ "Q){hB@ B%M#$|?ٝgg'HJ)TU)Rs!B  "!$$Ql*TUUڬ!Bz$I%IEJd݊b7@׻\o^SB=5N^lU5ʨlG^~@TN!]Y)mwl[^۔Jh%lsu:Yd_ƛ$B!.U9]^'^YB!P ׎]u*:B*nWHn]*: Bw|!B qUKj`B!O3X%sc@  B (d0t:N'+]Q՚_MEQTyJ1N85Eu /FTQJzNbmvbgsDAdYq4gTQJBDQ$.fS*^6Q788Ϸ3&M9'gbWT@ :Y]\Ψ(2 :IKSŮh4eoB cs.IN+^@Q4UUEh4e].U䔪HlJVV\E Q*8nl]^իh~fڵ1 >A`_L3S8/6?i:5tsQM^j-{AA.ũw؛Y.̥81ϺQ%tS.TxlPfQfN|x+ϥ8SUU7m߼e̥B8c3IjBĤ"Y( AA5Ja%$$QJ'.AI$bH%.fgFwO7ID0ͲbMWMֵL25gfۯF$JM[ui.SsFjz/w%>6".6Z\oͷ݌"(Y)ə\sVZr|G@Iw5>HTI%: tjנlIILȠA5}Wx#a"_R2R2̪?АlD-꫅kZ]rRXC!/je 9yb``@9.*{]@J✕u\77`x|cZȓV~=,ǜSM.9>iW9^NWYC|h0?y{YQ{%8D4HsJ|ZuH2/;D@!>V KJLj%\&rA#pjuAM=z6Gd]a#:{ɣfi!r.<}yS0;Cge|=tek%BOJ/\ӹiSL&זX!>!ŗrfSEpfIh0n^:fS8 O6m0//Z4kn6[6TuqpϦ!gbdy'/l^jOsE0L3SI$I ,#,EAɈ{0_U%ڞW @k΁2%/_%NbJVL>n"2Ե' l:: $^uKvI_I!B8cHenݑY*44c\U<\.e.G֯к!3ސR&˲,˭[6ZBjmӢ^eYci8z/o7N --5@6A̋>JMûԴ^D\N/u#Eg%ZA5kժQY@zI']HKTR(Ǚkyv;ѠxFuMDz?>VoܮzLQTP-u:/ʲ3!Icbp6N$%uGPPk5YTJ\sȲDUU٨FlN>cW(HXUTux8': vE NgsJ\T勾M;vUI]tK:rs 7K-rzVBbj@IK ]=#ec42p+v߬}`}n2@/ `UNŊ#B!t#(1"Bݔy) 77/)zppPdww7K]$K /&v̹+W ˒ DeZd`/^  +DU 8(,+Йt %L/mC@hjlrPf%d197N!4?3-=ׯmz9*S >^zbٙNVzKg"mSB!t"@@Qle9EQnWʼѹ.Ǹ^㸾H]%)=TORR,֬]yu@Ֆ]Y̋YOVG]Q9j5n[zSs-vݪ`IħQOWәf:)$;&6NC7wYqq 8WA@5Uѹ9x5zb>4іU2]T7FE!Bg4[ |#\ԖsY(B'U^mZlmWUU(( Nj^-DԄ'ڴ<xO!_^/PQ1u!BwR)ְnXyGtxg 11)66d caF}h%~/t||g[uC`niذnXfffb|˩l՜(]v-;6:'|g׏BIe/z>^{ڛ VFPwN+lզUȓ:uK!UN;ܹw߶oupQ!BrۼqԉӊLlђ{\r.X4vڲ,ǾZ5|򮝺ka'\KѥW.(}t\2[wqqp>unۥ}߯Ǐ}2c]zedd;s>uꘞ5NmG~rWnn(6h@ү{غ~>vܣ{>R+0umth\rUxGB!tDg^uQgصmoW._uUpBpǔڞ={bcbyc̜3'@pkNQLb3G6%7 /$$$_h2>?=v^O?30,--}_{GWݏb0>>>^^#zp_{ !(>W⒯'ߛ}BQJnj3iF';:9޴Y"$Qd"p΋*>A(J6׍sa̢t:K~6XʮRӨJ\ w% c,+3+33-<5[į ]wL~կ_``w!Hua~Y~/nj}hlҴY嫾.:_{c⅟>؜ FaYر_Mn7ߙ\3ƍ:nkXY^pq|e-;ܹpǢ ֬k/;Zj\h禦yzz۰Ư_g洗cHKKoӶ{)w-_xdɭ#zP1X?6yڤK. 8~tt~|^Y'}L7ߝw!}$g&Ut e5ka{|lE\~}GNtWK7_Q B #G BSUB!.B$]SR*uw*ʹu#Dnɷ;wd`P?o-q|ٮIǺoڶ'K!BwčDʪXbҳSX(zU 5 Ps9樘a!M+0rۿQݦQ1g6)B!PHe3Ǟ_aHѽbcYrO?*[x.9ǜޢΡ2$Rq@!#$*Q-Y C!dY@~. @*Ux.9|I]0y2*:8&ϊBHS/˦*y(J7/Pӷ#@ @*[3!o =;M*U8[BV\Ճ,l BUR`+j4e7{'<գc'8{~I 1O;S.C*̱8/2cc:uTd_uG<޻o_,]Pͼy5:~آOM:z^8xcdI[x#BAS{x ]jԸ!etg_֫o;ꍗg}oۼ(ʮ]vj:n.eg]u9rHڇԥcjjOϼ}_Ϳ >e.û13ιV 1!1$4OޣRF?^@Oy7|Zaνv't}>ޛZdWNNINMKM۶GzkӾ{o~Nzs ƾ~@u(LtL,0@EmիWGu,kf6+&&VQ&MO7GQ V5?/A(㕗_1?Э{WLBF"U|| ֜C?“ѣ*voj;Ѐ}yqdY:rH٨q!!9c4G+w֫Sii'LVՠQQ 9N^81F0F %'$eiլQ74jܕ-j嗟}5aZOOvs֪m#1F ˔6m=<݃=6ps8߲U˕߯m_~/Ln~';G-FO>[l??EUGBJp$R=9s6lό+".sOZm#F{bLyfbmOg yp/k6Lu*wֻ3_}]2q r up25gs7{w >;邼QR7oBUU:kDVBÏ>;oBfMyJxGOjo`Ee-N楧yOaB!(̤J,kѕ9<bm\!P JNmӸJЦ>ԪVƗW{ FiUjAIx`Ȩ#BU.HQJ :ݮT1;cUPJ;cY:V-ҪPhG&Bw1UʪjU¡QEzrrrZ6o  IR͖}g6n 1iۮ/-rqeoݺ۷o.t'Fd0p7f~gϞM79j]=1fGw{p~~c4;;wDcG9cFh׭_k_A}tiu'dN;*MVZٵ']38VSV<hI2FYS{ 5hjغi'+u:thmڰI~ȱέtأ_/M}Z5ƨ4iwa11M~v,_ME+pĩ^332 >\+wǎz,;;ȔĄm=mk߼cVO}j+&=3Qjg] ̋<==bc 491qћ6oQ#p3_ctƍIIISNv,bZ4hpgN9rc9srr&<5;v?ׯ=rt=ڲ/]ڸqczZZHe.[5';x ⛕/}\Ο;oZK/SR{vn֦cΝZge׉'m6KIIo:_r=!*@nVUl6ܫ?}n y_|lS>]kmZ8}9#ypfs^n^Zzܷ_vE$%^toֲb< M[k?mkH#G?X4z/OIMٳg=2-+U[TGՌ߬{þjȕ+=9w~ yX*0z; v~h#z }s[]a2}zw_>w~z <~qvݥо#s8[ٲ}G =lg xR!};\jnP<\bB"e4{|x K8GPFU۳?//VH-ʨ糓7w Ӟ3 _7{wΝ1z>/XᚵWNmrߔ YgЕOI2 8e4##c5nM.$&&;iv8pNX,[7okրq9G|2u}'==vt6[7kt׫^zE{w3 nOyy.h/-p|0wPF{>{ @)ԊN9|pPPЁk)V{bf7k<00W_YY^>~c<]b j"-PU[vl#F޵gm+-_ӷn׎ݔ_~{o0''gė_\w8 \~}'_,f1oe?~>o_fs:3Zxe4%%~ߒ埮_Ax5'o~\&--1á[=#:-˸+{7uV!Jr=6Sxp^1]yD@`,ҫ_uW֫ҤX1:Xbylȣkfڙ¡$ߠmݺy[A}Jtz5v2P?^xR~UՖ[|iR?/1Oxpc4++ý{})z݃G tpξ8]cbɏ;C~3:6nԴS Z87٫_SRS=X#fR'WAϔ<мyw-kԓ8s 丹9bΝ?ǙL9R(Um9cL{pߡC{z{ :ྃiWď=sZw^{k.]{t)8gSR&N8iEb4Fٜ{q˗hڢɼ)ɩ7Uۖ7`p%nWc$vN@3DQg,.ʯmP QUU~M?|t$I_}]6JB~ f̜:oBb)}:nS_hg6(yDnn.jU1ל6fSMF/HJk֮@{?0-q`c&Zۺ7A 7h@c)r2{1$jٌcѼcyyyz16phQCcz>Tm?pt̺wxUYYYYJ7r}{ EiY#:u޽{'M9_G9p t uu?mߡ ܏|l6-s>@[d)!E:ms_XX^n^Nmm=3#3++wnW' 0`O)Rȸѯ͘eZKj[6;c1ִE.?RU1-U1-u^'<3#jdu{˶-c,mV$,1!s/oό̬l\3x5JmV9l)vEݿ'=t8BiJTWg΃aûu֟\/Ib:5[k8k.hm6; TϞ9(YLIIlq1WdI kko .7!#䖡B=^2]lŜh'xvU[O}GtrP'>٭W!\ƏߧZ-zqﴊF}jjjIіg>~hÏ`{zc#?uaX|/VƮ=# s`"S Y煑kZm!IR݌&C)Pm%l~t)}Qݴ_Y3[nys%yYHxAls _*lبoM gc 10[g[O]h4|z0Άzox~3%mdzvzwK23=?vcn)˛Ƨk=8nW ճOwـaw|ѣ#CǺquzcᏏzBϾYևo|?Y/f?s`4:xB~#J"ILZ}Cγ] BRѱZ*jUS#K'<9ynXJ+6. oݭ*`9o5'Kq绶yBb2#뷯8:A?y׹\ʡZUm=!PZUs`_sqBH#JnYxYPUB*q@U{7tWFcLjR=vѷ۽i"&#UVPJګXJ|^r;\UBr=ؼ }WPJPKIn22"p㪽6T#r--p¹DdbD DE"+LA (a 8T~˙XZͬ`Ȳ۽VEz `u1H&깪B>p_A V[́Ӗ?H8oY A0*L=^!q<E%v*H(0* g@8}yοPٕH7}r`_ߵ_!F[h2|7OР!uJzO,sk\(? l _a^qvC3xbUnk'M{]?~ha־}F]_-| FBDG4מfv-b4>]}}-[HjЩ4OP A\yX1"R "$Rw^NUVA‰d26{/'_1\8<0wn3߷/ع DSf8yJ̛2ɰ~EKn(KMQN!~5֍EƀB)Pz!TܳS{O1fQw!%_5C|.?X(G6ReY<\^;/(vB8!q~ќQ@B{~yb˖J8vRx$ A=nrD#lǙʀQLk^pF8ΠoJ;ۭ2U)C|^6o%D]Nbz8Ul\wmo(@([Nw5`GARف#\SP3m׮"Onٗ_&&xX55|U?B Jj2IZ(=50ia]=k-O݋)BؿW󉌩Tyd8A1Ab͚BB2ͼ8#&rں5eXΫ?б ~ H`Z=yZbc;f5w&:X,P64n;m y`63>: <zhSs92V_yfST_fm򸇑 |5Ro[6DAއ Zڵujdj`W_&GiV`F#e"9(BkٲYh(: CBT_<^s-#9nm!P>Qrk>>MqL'L=  Z?HEqJYP v-eJ Vk /$*-Ȁ HZ@•U,2Qɹk{Gt. S Pwf;/cQp~7$@9qBRZ"E'8Å'&IDwq??{j+ݷo׫1k| }_~_vnWOXhݮ=;w@N۷%%;lxҫWQ p2w.< pSd1ƍs.y }Ζ,!o3*঄~+v 7sLr'4 k>@9ZدNA< @'@d}S -yg3;`Bv\Wyf>\nn^͍ ^E/,Pٳй30&$p%Mpoo[ݺAgy` KMUҨӦ֮KJ r!Ch߾EI[αr]EGز%YVc.4\$@.K <7 m*EfӧI.*&34s.kufw﻾cҭ[qͥ.PNMK/[ԋwd_4/snīg_pBPO?(tzNТߠri)Ul9O8/} v[?ca!_)>\_k~[595/<7>/?VY{ =OnU/c:fC{Go6 ) 5&fg|?t(z b | oAӟ( >PފWHr9΅p+HTǼ矯eO>E+8Ei4sl97Q߯R:N,'$evpcǦhY?+pi 5GoUB0NNojD?B+҃ iMٍ:}nHfh&mg;>-S݄/ <:O":׿͢灔5XJ@W2?P_}{(g?.ޛy!܇zq.~w!r?o aXL_}xG>\~y}nZSq\eo'ox| o.WgSƨc̪otKOG~T7C'0ۓTӚͦ|I&LL$c|VQяؘJDoCB4C)%DQ}O=(TX1u}z103#!pqyMΝdj {R!;v$J#~3n@OE]/2sx~{91~syՆS3:t8"{wwԃ])%he[q{E=@V@`ov}{'@ygnWm{oxpt޳U7ў=|;w޽޽ JR{" !^T_l.7`5Ә_ɯ9]#a&<_G߯_aLz*#;^=}:t8my^ Ƚp6--.E{@)%XQG%=ʔG~H!~Kc,|V#JSyB'ptYZQJW!jt| c 9< Wtps _47qё -8:"L(0o}[mQ(j՚eeqBBRXJ0!4M,m\LLLd2$a%J)Ji*($4'|s}==#n\#}ʒi~1. @QLcljR@q!h\ƚ !t8O4M Iꚶ0?_U % qd8AI2-f?߷h_cB_5+us|?S"}!Ef 0tnsN0NZy^+Nxc9giBR!Bz>99ɹ0 })%uS(1\._T>4425u(| u11yO(a}:RN!u,bzBmݺV1ƥkaLK/\MƹT2FNlA((R)%9J)BsιaQeNZj15T*n!@$DI$y^RȺu(f (!SJ0R\zeqƅaGv۶,PJHy~$0!p. ]hL0j2;`9ƸyFc\,0Œ1Q*d|٨bL(Re 0ݷoc Kc1BJE&`*%䋥EK(\$,qܜ>iK.^~VNgz{{iRQ$[-zzFUAtgg熆,4L"b8[Ͽ伋.Wn#kN3@T ~h3ɖ/˕E.46]}#CIaD l bND 0nY_ycZ-ɬ9LMGE $FGr!`_ڢv˝eHO273=3R~NfWl<tRO`˖-v]sFsv4 (lZlaXJe!a ʥRJL48KbP*Lyffl*[Ǝ !$%p$QR03tZ&ip.f0fI [n}'DZBT#]w^rٕw}=?T,,2hbf^7tX*uSI$R߬0|0IpēX)9;;'PJ-^<288J9QM)Vb5M%I$\Jvәᩩ!e$=}}BdŊԭz3jML3mҩqP/RprWZC'SjH!h7B\M劽s uۚF A!IpOVf3R>SəA,}9g'B ϣJJƘRQM4 K5Q,f%IjyIi1M!l6'8NsQVK]\5^&FХ9Ylek6^ NZsWq! +)WqƺsWŞ|àجjLG ^tY1;A :R s)\ &T{ 0M0 2˦l1Eacc4 ,e3q:tDu/ͻD7r[VN`r /[{9M=('4Fp{aJf/O("󕺐h4Q7`FXzmY'IYD!X( JI!mIaB}[{sRPbY f B/ô;6Mˠdes8RQc#%cCz:d2MlӤHiz K$nK K\*$(IkKZ-լ%(R(%H!Zk4]ӓϾpN1 ?G_M'% iT\a+Lҥi"b$Ř%c%m4R뺦i)!BHuBƈ&1.xL)D(rR b%`B(ѐT2NI0)ɀuZ~MO!wjL|0T1f<1F˯|MB0&\>aMBq H(!4͌V R488%9]Rjiv!0(m~YPJ)@B0ĄI83-˶M{\.N!8 R3LDT7Ga&yRuSRwի$yɝtŋ4"CeY7 .u$ 8 F3ܲ ˶ 1tdRD0,uAiZ8\.!!Tש۶ CǘHSJ@lgq AJ!`8Waq-e1<525Ms]#\FQ&\NiDƐ&1Ga\+FK$HV!P O|fS07NCËxr'QtKH5N)1M3mc)e:!n]J~vSAH!> 04MJ%GGl-8"q0ι A5ݴ0=/`q"$1(6 ݱ-E0R2J.MH8$$N rl# KZ˯ͺfştEO1{r#mظX, oٲI }Ƹ#HvID`2iW5ΥimQQ8I aYaj`#vrTB@BRR1K(kzaR) X!%08T¸ϐR$9q 'nRT,:Wڻgϝh6:!vuO;t { ~tb7OBkW+vRBròf+jHMRɒHaB_hjt0 @ C'7߱cg;ɤ)yB)):Z&0(B2ƤM"i! n](-YWJ$x~8D詴-C,[/-sОCݔK_}1%k_(H.?( IDATc'jVY{j{}XRCSS#L),HD $QDCav|y~^a6$Lxն?t:I P cB)-v\R #ܞ# J*iXlFSqgy!X22<<mO.[y>KL A(!\o:ks勇,B_wXZ~OB2)O5纡p##KoRI+vjR DrC#f>GdPba4::LH׵׮]I)IdK")#$cD%@ G #5!2DsAtɏavuZEm;RbD _wJ#ʙ.כ$E[7*聩i:*cFW,V+HBDRwq|oKow鲕fB("LuJPK'#L\!ccIGs2IY|X(5\J,\ rA0bq=M Z6 e9$1,(Uf!ēͫ{`tltbXW8thbLc`+xW*/wS#eNX6 ӱô>'OJ)xղiqCql뛟L QbGCQ`I/Uu8b+8 pƹ ;w=>??W*$2 TG )hMz++ ZR?sQ֡sw5acfb4-^#.EwK3gp"^p#wˋ1BH(ӳ@H"Ԯ,( lx" Da|Yg?>gs50PTR,P>kKl12!v!k!Is.]7dJR1,,4MϗDJ%IqkZT~vaӦ7o>sy7_| FSH DѬi^, W+ עA==Vvwܱ;8@ް/k[F xtzCXK#zK^}碁/}I}7RJA4B.s|yg~'7nIFmٍf3B!&Zہˤ~覥$`sA5-vN͙|.[֚K)9c1 R) pr =! P1Ѩ2bW #\V`dd14NEMD4ݴjH7g.-0XBl]]>…^Z$6{?xlWww;w"LTZ` _0MKu%ZXX! 0rQ a5JuC,spo~~~|||EVػom;1Q˜m ;^ 0΄H8G0 @Fq@;ԡ`,/%-WieٶBUh$*u N=VCQ兲mahGFNݡCW/ƐRguo|CU*q#޶ V7rY}6RT^ \7l\qժ3t%~]a9JK_}m:|׮H)Fn:S7pR$I  J4 H)U&^{/j,^V˻馟(p.VZa?7&wN8 }\.|l/4:/c0}6MNKjn8 dwz}̼ ׏tg=x쨳>W\qgǞx;)xOSuH1}_{-n;?"> T6{5XyU],l2B8 C!$B#'4J :0PHq(Q&AHARQkhA.'ėT$1aBBi7SWkf`cl&NHO:Bhf T*YY'g*d?H@ 741Un}#s lXljjq8Սx[=0&$߰0KD`,$9=;R"Pa % r)M$J%(5:1?gj& \7LJ(dLDQ>qkXc bl$U^liWWǑ# 5-Y)cF= [LZY:0Lkj8HS#}37l~Go P|Yj:t_cHɮ."mp-\_GZM8 -眃mٵy+aOJ7a ]tk6s'R:1z`fZ'G׮9kkp,kyU)R$ T$Bp.Ifsq$l~B^۹su׽y w=7Y$E[rAVK񐦣3׺ ~zg拚-:jlpds*Ij_b{wHhբ~}~Xӳx3V؝SW.zbLԊ$oScx+[<B7mٵg_әl.Wll5[QJbN )3J4 Ϛ 0F!h 3"l&SB@0 C!$:B$aL! H0&!@ 4j#B<Y2DZg=L/\h]Y  ӺJ2r{ʳWZ~Ȟxb'c?&NM]K_uERw DFIPT77˲2L' q J,̗FEu0F+I9=07_.gØ3!JE(!Haa )q8)"Rjq* 0B"{|>e CCC 3-g`1D zVPaTk[h_Ls1PoU$B.Y\8?gQO\ˊu:f†Bp޽;A.6n,|s  K_9x#~pWWW}S͛Ńl;o3Մ[ZO_~yߧ?; Պ…e>ɞo0J6'RH8 wzsjD'pΥ>}o۴Glʕ[Z)]G_~9W_5?ߊcpsι R]^o{R( lݪJWn:Ii||rd۩^r}߹axRP.m^K鉻]5 ڊewW񨿧w ۿcmMWQ&C=Bi; K.[`L5!ZZtPz|g$iP(͔q7KLowؘB) Lz߲e+ƺ)V2i6[\h'!@B~h`P#! $ړF008RIԐ-OVfiǘ+t_C}%IMOd\,]o4,>$=]iY!rwמ0j%a& EqTYdJϾ0˿ԡ$/Dܑ޾mw.dd2!T'NʕJ~ BDq mRne\d>RőR 0-R ΋łF i#07ϗ+F#cY:2 Cv !~BH))Ys!j0l-TI)snP.MRB0|^Dk"`,aAakH2Mq8vlWښD|!ۥYV/_QpݷLO#DXr c:^GСo/lH=*| m0 Z6/| jrr,u*)(o~3Lg3Wl=r 5 E)z/a^ &};O|adKЊbje8msW^O Qu}Ŋ!Gfg Es) 8qux?C 峫 #0Ⱥs*}]rgv~e3Dq&t#T])KޓϧS)ȥ Ar__}~?F멅0-?x yՅgo:!%7G?_&?~.ذ {;{{}ǣn&c<804~>W TQ-7)4:5(R;JPyZy6m\rl)(E mɩt.Wo4fg'\xi2Iv !GDQf@qp'Ӷ) |[{ƙ+t:׭P޳tbToN8-_{kgzRwn#kWg,K]v#x5pm !Rt][u ]T0\4lBIؖTR`9Fg;efDe $HŮbaɒօ@Zk>56^עmZO޻j B1ܑJ %A3&G<^;8fY:֨urҍ7ߓNaBp.ݶeRh'[24$!iژ|x?e~2SBl' k )qocHupΕ!ߎMHa<; _0V7+eqggc{c͵׮-_w- ?mcԨEX)3:?p-u3iuWy/FQ}ȈiZ*߿d+#yƬw+}&'|Og ÷}޽o^}uC M~9F{o}rZboK(jFSMKHik>o6;[?_ʗ֬^7MR"[q[455WLwukWv˵qffʣc=?_qPKi$C a@<{ɩl.hb`Nc RRNKPaƦ+~|N8?pha8ʹl()IQx5Az ?4>!0^1Ws% =~hfB=wj茩enQKse! "@t4BPʮ;PZ!kʒE\^Xѭ }!ns+Oul''br ^c~_<)uXs_A2\qŕZRؖLlàA3`Peun0]4-}rڛHk:kT.h5, \*&J)8_SRes̕F\)a}sH7zp\ITiIA7eQJP;-Rg l}xg6#4W/*YDљʁ*3Oͤewg3\}=-$/v4J h/2:t HHG@)۵K0&1q ccsRMUj&ˇٷݱR]i^?8 pFudMWw~fi޼z0wtkdfPF˗Z;dwOJ]cM{ ~rG錦YlÆ Ih7Je|[n׽+ t鍒D3ddś$dxq׬\idϠCi+WRkѢ[oh;;6۷nRk6n]F\:K&[>\t.ZYZmyn\Dn:Pq˪5gơo ~򅗴+6,k ]|q/=}BZ<߶,4IsYR qxJJLcQY ≩j+l54J׮9gᾢebChQϦ Q$& \$IǑa(!B1p!RšÎY $NbZ2|)\RJbʹtkٴ+~t^H1ꎎ2)tK+ !gTk$tL-r2񦭯:{Y,Ip\϶엶#Lqv֞uBԵy|ya\沀qc.q,d3Lj v?th -^6ۍ1HAav-)(%C]q' DcI[&J\HD)PB(  Vg}e48Գ^mQmm_eBQ%g~87eݹ4RGld8<НMn6Åk%KOOOŬI:{%Wڗ7^ξ:t  )u_G)w /}%LmwL63?thʆǭV9tUcp"h%j ddvn9?Yg;wHDk׌,[2@ォAtK#^wc\1ld#Maf mۦ7mD֒fozhRȯ1FzFy_s瞻:%aA $GF/F..؊zu Y&dwt1mKSJs8AK]X^[̹^ҬV2o;T+Tjg .ZTk4B'@Ǥ̤R\ t irn3hQS Q"f擐^8e k\:jTѾ. p9_.ۮ 85=NZp-6$r??Q }UK}jN\60VO*@2);J u=SkVIvv)rLf^kW\J HLNfrV~m59䥤+2B:148yD4-Cer9.\6S]̕ ðX좺|99h&7ԓ rN_oIĀ R\fú|roHn$V+`P @#$`GՄ)sSׯykR:L55ŀR"iO.$Xut+PJ*(G!_4P@)x+ֵΡˀIZ<4ZNvzXBI.P$2/h8dIS?~+|k_1C= IDATL! .!PH%ˆB~~^Yf$9T02/Gad :ST\A=HG:eg^,3?3UpqiB8/K5'J t]+sv$d<,%@`<W7Ӝg%o[N.}H !DTAZW:QaKZ}}JDR}u: Jp0 k5BqgbsS'e||blVg8FEB1 SnV8]8+,Jϵ*~UEb|+$vp7!Oﻲ?8w _|x4]5;[as  ۛou;[T*ESH`)Q ps뫖cP:|Nk?Dxz 0)U2 R1ҽJwfvB%RB( !n*Bm(.0KIg<1>|RB0MPɡR'0C֣;[[(%L/^)8/b0-RC]eDrE`Sk#% p/[}}J@xw}>x6 ƾWi^Z ۞\s]Q)^bC͌E~6 [ƏND@2xXJaྼdњ^]Y'/.Eq?B R@!A(kiN"foqa;H',&Bg(_d;7?;ۦT]˲ 9DDž4lG)0ĸ5)Eo0๶|XJǏWp0)w`d_~!IPo$qR䅮Rhq8/̄h4_ky$9 3DhRy4p<̽eksSͩ(:k[[(-n7Cf"/^^a{q~^VqR DP~'GH(zVQVix! 0N8\L&ɠvw5ܓa"E ?olm<̩fxTc``(tfS]'}VBq\Z,,S 0 Ej863׬׊4oaG1+X(ͳR R΄lӱS N#8leiQzɓaR`rA%9KRVfڇ[xMםv}y8 TQSulXtM8ՍA%qQRW8Q6)t<ԜjΜ:?s>Wo\tٴ}y(ɒ$uǏ9~cs!p)?HFӟe ۤayDBB(PJ`<l&kk+M{..XA9n\N;rti`'(w6AA%04]x4{j/=p߄<!n(ӳ~o8 5PjpLO'c\ F^wrL@ ( )A 1Hаȇ%V|϶M3{ao0+ahfq3]H%KPB*{iRQgo8clz=IkYRB 4?Ea:c9/J[-*qFzՕMMw2 B//]}:yNI咥0lUhacKgcB׌b4733$Fs24UJ׺B T%"#i.Q>EL"1Sm;P)U7p4J!l hVkQe[p%K&B ٶkFH[q\o:EokZM˳ !gyceYV2Qg Ku{<&A}Mî$R#F="^QR*ǭV3soܸLC/}*vJ:ylq~}cSHa[e 4\@[50TYV|scgo C` T)5hDZͯ^/ 33NzKA *ݬ V~5ރ TeA楴ƈPl;D`gggW2Ƥ﫨+7x4qONI&nbVRnZGWrgwG8Y ]uz;_}_?MۿB»˶40K ϟ?~ȱ$-aeYGagg8I45S5=TB |T\hNZ-M=BAvx\V5t1*LVW4T3 ,zۻa8Z@l3gnC! ]p=ժ7jN?NJ9^w3j<~l}m}ccsjj"T8`yje^L8\ӯgFa |bFp3RO*>?uï,`aLB$zjf`EgFCJ9 8-2M4.LsBbjY6LgUk`n>To9R,K4v3&~Ԭv'%Ǟ {A"˯dY{JdI<=3ͭ-`-Tx]οjU+7o~0__>pBR?L\5&#I&/N;YؔI8 .)QIʹBQJՊF,-ȢRuJ$[iɳLTpQC'`g%̓T(H  }zyR kWa,ԛ8槧b8T1e +U߷'A%tw6cTngt]ئvckVs*ݸ5o1G㭵{AFSRi{?ǎeyA=J/^fe_xĉ38>48sС٪e]~XQ.EYYy@HJ&̋|{{{wK42+lg{ Yd)XjճMV*fJ)T N+W.E.%Oӌ F wn"BT*VEiqN9Zl3J#+Ál5jFPA鶦\0-Rz-X^Ň6??>pߜ@P8vri0KP2Y0eedaM36Wp~Q)J ذjݟ]Vrr.(TӤT$mr1˴(Tk7k7>{v2{htm=vڱSg| ;ԖZ-WJy3`' (͸d/~љխN84]M bu}k˚%T_~/ s(%y)YQ9+9gLGaQ0)f˲RRmw\~sT,ϴ[i9ifI۽z-iO7BĈPJtv?%HH.L4MݰLMZ+ D^[Y}~?D pYROWj4A7_K AB_pv,ˢ)mQ$5x2 wPY5pRqD10(7ֻ{eI8_i!FAPYPˣʕ ]/hǓQQͲǶ6 @"* qܪ P}'WBpbgk-g4"TH%FH]ӱ ^o~ӛ^ى³~/YBa&~(˖o.#˲m˄2.R* 1V6q^4`1W|Ga,$yYa;J ^ձaSU$zK[- &(0 5jV1f~KqߛdמwojivRϵyorM%|ڗyzG]M4q&cYmW+w EIh1i\ՕE1,44ΕBJ$CXݽ~},(RZePRmonG"5 յsgӧO~G f=Ѓ#Gi:"`25 [n=}횦)ɒ(\<3=]5ljւ/q BVʗOZpI3Rc!@Hr˿9uVnnwzы^BчQ7Yt֙}ۙ L8N&Dae)93S)4 BԉP2Ytzx%[[AZ~X"XGQYC}`VAHӨ,pQ){,,1-9~[^v-مG.KΚz%iU+~^oiyg뚶i\y]wm;,?!ϡ@)'&>B`jn?-J4O -hr&&e^e'a NRM2ui!!E0 B)PJ .XJmקpē֡d4, 'a^SoRCsS3uR1V+%J9}*=ӴҼBVNH޼>QgZ;^J!JAcH6 AeiLu%r&<˶L,4OwYrBIxT*( ~ \ H!d\AtVQh0r4,x< O٠rL qPZ{fa=C!!dNUmLjP!!pouJV8JzTկl0|BrG?@scOaJ̓_B`[~ٚ=/Ml0R754--gfӬc m+INgs}ygnzsZlmmUd4 RPM p2dyVo@jT,˲<+XYpZͪə qƹL&a, .:91yQ\HM7n#˗0([!$TFըi4J77<׬V+P{Ѱ7#!WWY s(c}/xKmӮ;quayi):c YQ0QHIҞ2Mk=Ϗ---X.B2eyN&qp!FQZsPiYE)=l!vq*+ Ƅ2M$YQE>jaa~H}!T cb;N\[0vu2;7L,wݩvP  G8zee{"D)ɟ}? ƓQrҊgO5l[;XqZ_2&DfzV/:;iOOMY~laaF,4}ޭJd0eaVCMӭVrV%#dδS(yPIgDdC mmj^GW{[Ô\T Hj|V*Πӯyf^qw/9RQєb}])%\z͛a?˓]!nZi!5ϞMc )tvm'cǶ8h+K.8Ƅ,8!e4eQr.Bs4]SJjA1KEQ2I%GnCJaJuB5JjgZ~6F 3(kU!1͖iyHӌTG>ڕ".Aol )Qꜳ||=]^YRyzXjjDCi/Jw]saaf˶pw"kk4M߯W<7K$ [BSBPB\Z2f " Q;iYVnnli J)Bk۾ԛ纣LFzhvrb8v^N&k׮Z\ b@ ֯M?P7ٜ}[ }sac?zY_j4I> L,6™3Y]Q'sq[[#+WrR0jZ4 œRƖs1%MGgoo^qHs. &B`MU,K{{{! Af%N~އv#;o\m7뇏i6jQ]|y¤RH|[~,9r*i 'DvK4v]?NN>cZZ^r`?6OTűNoT*j3V+ŌA[ @ "۩Hus&dfEF`1&c(e !"B(!DӍ/0E! 1rW4I)۶b%S48a<Sӧ[5%T2_1t36T'Gp< tF?\sijuTk~gȇ?ϭz2Pɽ]_9uNwpn\]\]MWŷ~O~I܏QusP'gGQ1h@{ieQ}>.Y`Hdp@1D3lDdqE t65,m%nihyfi L*oj y)UӳugQ7nܐ}#PRlmm׾ƲWGϼ`cs˱/]ܹ]Ez;vvZaEvtif=30ϳ(N)O9"d{+K)Rr)RAQi*AZ]4(D . u6Aay< 5ZJo^j(@$h~i|Cr\w>ZG=Vn.p/>zڭSڰy'N,h^u:'|;"9E~K8# 4Q.x6 Z I2G"A)R $iy)D@D1B%R*E1PnX h͝MU{V8`2,\&qo>I8'+^2uӗ{^iOtM ͮB)5JxًaT`iD PH, !!Mu]-#Uc%PB`$Q(( +˭mM764Б$$0R,M?^tm] ؕˏ!zYV݋' ZYolsqEש$fa)jIFa\A)6 #cpb=!PQb0%" H)* !Xa>aJ]L]sm KD !TPB1!$ Gq:A } CY8kdy12 ٻ?Õ^}tۿ+w|^ f!Ux^ʄq Ei\B5C':T4c4 '\4PJdER7mDk떩P)AQ2.!u쒉`ɳ6J, j--*qf9 T*Rj4ٻšv|uRY?PBhO6gh۝R\U(ˢ*,RH׉cKGN(!bL0]ׇcT%W%9iƋ̲,O3T^0i0TØ 1"@^(Ʉ3@'סR RȊ*!Tq뺩??XjxBwS-a|bqiz ʒRrQGy^9FD)(6 7( F15J$TJ.\ĹEQ2%mTk1PB`(taq¹w<ʲܡu56VR׵x!jnw%W~s_A ;;ʯڜVĺʕkq׆B pʼ$})b% r%W,e@V%X#\2&ydqRFiiYA[xCB؟cmB*Y2vWVҼ4Cӌa\\[lh) %Tf@1ж-<>GQbpRૉ}K-ɟw'.5FPtf %,KTsec8+tڶYAaZ 'xI 49,T V,/D^pƄ"L0BQB M3 CAHR %PJ)%iyQL0J<7umYA(PӨJK.vm~I5|@K]|{ݏrB?́TQBIDY2xV er2F5<7 6u]A9 0YnB/J` 5L`B$JA!TsJEivYkz8It< (AbB 4BHCe#(ozA|yBHA ( AEQGq7-A}͵A(z2 l0 (hsm+חe6fC*"Gخn2 4\Jtg{!!Q P ' ӒrEhj2@(eQ<~|uu# cӴͺoxϮ$IL)ww|uRO \h;[W5.~Ǖk{(y$98a{Ӂ;?ݬ.DaXb{kwkk~_|*!L]3mJT C_[&q0躮kPQJ(% )!T<e@亶Hɢ ݬV+i;OĿMDJAToSAJJ&O+4^qkxc3LRH!%H7tMö5Lw{cP>۬14' @כL2r\TwqTeNxs= aIIaMY_]_.lf%Q@IC&StηoӓiSUN:ϭSzN2)r](%Ln%SiFd\RJl6 QM4 )JkR\hqc2)V*e ۍlֺN ?أȇ+ ֖9M=+y@>XRyW#ZJrߜ̗4 *Pr-+ 3ܾ)r%* $˾"_Ձ 7JIf7:DoR2J9gQV !M/ PKv J*l@$BF nb /Ys$p]ǣH!g|SR!|kWV7ܵ(30429U,˞UJ2Rt:&b=}۳qNl w\FUؖm)@+ LzISvd042( "0   ,\jjjU+ qVJsAP(Ѩi/JSZ׻xAo?mMtiK]Tyb , :$2[zK붍4g""aШk(.MTGG\uKJ! (AݔIv 5 A H3F!ck75:BCRB)/UX&Τ{-|sTzf6AJofKZۛZ.~H&厌NN  &WU1ށ3 47d,bqb:n0U Tx3?B 5]殻WdzvmR -*fƣ>o/mB108嫁lȦNXOjq-Ã+W,'h]>N&n$BPR)IFDD#ΥK *(T2~)'"!!BH!)%HP#ul֫VPJױ#(Ѻa||2q3:DZ=:>>W' yhH}ٿȿ<zZ1V |Ri%7Tebwsģn,iP*VsF |>6jyUZBp2hT)I'l6[{-G?V9P*74^veuuE&D}}J UAIUǒʮ6] 92:\])JZc \sSET2p399FH,7^%D4m[+J~*q"ZkZ5gbR:J(tm7\jڵ^_Rb6XGvwls˦/}鋗3UE?i4&Sh4BByU*}Opi+,&,H(Tnc7&ڛ4BXz'cHu˗/QJM)ZoW|~׮]]r!!!/\q_SO*Vvz2 ֱR$W\Y,":|%_ ޷oҍF-ÐJ3fHP71ۯ他yډ WJ2*X 6]f,Ԑ)۷4 ଵ%20ؖ-[}ѯ}+[h g19?̳x\پX(2+W yq#;5}ǩR&v$ )?P*ܼe~WG)'vD1Z@iX,j1X"Sn [D"n"-sɒD"Z W IDAT8[l]nW@k=22rp_r+l6Hfܼso|d޾UOZ<ΌMYLG'87jZRAP,+ JuY4c==Fvt,ikiJQj7n~g-v:t$GHHHsBRZo~:Kl۾넕dj``ZuOmֱ޾[ӆlf."LbSV=a7X4&~@T*$d2Y&JTXnGKmۈ/w9<q劺l(Zjdd4+_W]\ Z  k23 0 h"xFj>Θ](I:yT11>(7iL4QJٹKj".JΎt&R!il6}kuraGe! Jm[6?{O~nYjohh,'NU  )/;Kb PH%D"S?11Y}_KئiD"yy'cAž}=ibѺ)0dtww+ٙL& @),=y#<4@A%wlϟxrRNѐLVڽsgD"gMӸ嗮[ ~Եd*%eRCT^۶\IS]]iJ{nTjVKTTjmiBh4X򶷽塇w9-P|ߺe35a˺dRIYME;tmޘBrӊˎDDTh MT)`4M-}/;\gOVSW%#4 aj(kmm1MV[8qLZ#e<[__z==}46d2h,9 Rɡa!-[67%G}T*w!-Lj}ƴ#g}TT2ɱɋ>p˴j k.+C }i1pδSHgg3Ni& PBI}}}{{-nminjjF\D%1::19SJ?ƛne,}C[6_hniOvtvj)eԍ6x榕+W&RR,,jitO>%M  1L'lˬà4V}Q=UIYTe%RƦf2b R y\+ܹg?ZUCBBB-@qZ.s{h42\Ӯo,ik f⩥-Tb3 jZH`d*'&ipΒ$ʗ"JHcHWƦ\084"1TZB(%d*ɤLG"N~*bP, bԮuu2-u2#_|c3 ]E0Y|B ]w'Xa:cYQR)}y>*xliGݻkb9e3DM 1-um v7ްc6ZI1c2DАDJNRjhe`"0MC`jjbkLӸk͝|p3 jD^75Xb\0ΪUܶ,!ƨڦ `dt$qumnXr۲u]]R*@;n~͋!zrb;nX,3uHRn2*2d, *hNe"jTJYmz{5Aآ!!!) ,L~"nKsk]]}{ҒX4BIQ)DZ8aZS|&bК EƘTʱmk?A\-?ih\~u%KڳֶCB!qDDl4ZRFvOMD"@Qmٔ#>|?BxgZ`ƍ~;9_Wx2E]fJצiҙD2U*  y@JUTP+˲P ݸiC{Q m鐐ȢRsJJ~N)K?ˤBi7UJU*d4;n j2 !cB& Tc(>x߷M!@)Epdг V+o~+zGH̴nB 1HX5(r4wz8v.7^T~xWe%!$-lrR2 [~C^tIR!D8BIlMNAqܨiJ2>6ܜHĄsW__[:ZT/?=ٝwG)_\~X*~BqƫU1&-3qS)rptt2?uF*%EC}O Jݻwx/z|;?0@M$g̰,dA~cc}*xMkY*7lx\`6yy#@ky'0J}_~Š񾾾斶rRx,N)RX`r@_uտ Uh*DSO|'N8aD@[{GPVx"H&ŠEcCskcccc###_;zaSDa[be*_}+@iYBVKJ"e;% 8wlSKiӦo{ !,R?B \.mڴ1{z駟%vJUZK5bqhJ}_~|ء9rqFu-o=ӥҶm 4ZHEcJxsyտ?bDȡ'/Dh,ԒJ&(eZ+)e\28Kģ=w _s͏{PE,^WBjr|wˉMo"@~P8m۶lٺe];;!?sx"ַ"D _*LeSQuOn޹sM70Y$y>юO} ))#įD3F򏏏V*ڐESHj֬OV`%krݯA DTJO.[~X2h`lݺ̆L3 ߻/|>&hjjmj?}( Z+THHb)jPJV^mqƆl}&\y߽<B)޳sիo-X\,d3m+)v"DRs{AL%9cC\|g3$$$/,f;^J?#c̍D |Y4|#kmMwBs%a5wc0$$$,fAs1u8zZZh||z[:d(y?`#\ 2>z!!!/WH?L"R)A<ߑ8Js P^Վ;lMgdio#⡇ yhqAqck#fَimȁiMSB(%ؚi0BW!gh3$fy֛MvT䌦3.!u}E2-[ "(Ν̩Jf;sP=}L;1Baz49C4YO'Aqw9c jԳnM󲥃{g5[PB dn:=zs 1ٮtDJx%39̨o@j0JAG̜ӿ)C`Q3ฆ(!TSS#RtgL)H * !<2m,F LۓPfiS@I5a1„ 9()ϘAkVpR!H2@Ӎsj1F@84DF&r•8ZWAAIj y!q4!ELd"g*6J DMPS 5 j!h-%"B"hR (hBf!"p{FD@5@M@ B9hBjjWlkɁ9P0e=nx .A"0 Z 6!@ )4!К(B 8Q҄єZ )*H)rFiP#HSJN6֌T#%"ʦ%" BDR (s堼"3i֧ ǧڈ+ %fb1⪀3+@ Pu@ H E|TD3JF3hJfPϗo&#@$PA aV%J !q(QCi P`J0 11/br`R 3  "Qt_~f|;/!O<8ؠM.f9^/j#APjǁ :)4]MMi>8 (@Ƙ(#\b `4$((4'QY@!))1)rB*%}ДX\2"%(L irS# @LOwJ! $֚ؼf+XxYh@%6&%@jqB%!$ @Pay"`)Q!t6R!!,a$ d ZIL`JJ[UmRR@#SJEHdR&(*(0ҚibXՀ3~ZFQ u}efcJie5zIZ5tZ;b{מ+{2+Xtd8=mX7+uSIpL*-`D"ϋ);!V5'ᦫ4n>PיY۾Pgx4FNJi<CxCom>ڒͶFw  ^)K~b~ _ւg7of/ziK4ewyό& N, j妭E^H)TJ)T|O򒮤N_1E a瓃fDy/7)oh]^Ƈi?: Jrifꛝs.P5Uڸk[2뜱9)M]w =\ℓW Z#6.z.a3>!ݕhձ4 S%g-93Ҟ6ѵ?Ch<}K.voy?KsJP+ HFAYNPH->5 j0 󰪈UlQGIoSaڝnk$mMdnTSдU8wϭ#[f薳{ ߷erV6/ғj7mwu Kbu+پ-οlY)_|omǪ%&d9XzɊs_r Fu'GOET\yvSOo'5Dmsyz뮛t?9  6<镍\q]~)|j&eך JIKʕů?Qɴ\և뚸'*ž{c"_w(U9q;N_/T90"2'\T .UcՒv^*uE˸Kj;#:QU;GcY'`G͟2)ԧ|)}uܸ,F9o;u?xߞv=˲gyGl>ecC+.* !Z,Ϩ1QCkȍpHx$pӁi󺓣q4!]4z[R@!%&#Ju4˚\])]̲D#/zE@f1mjRD)JIW@0F%PA,bPDQ̌_)Ae ( c]+J^~#<]QU~G.cxE ㄰!A8c& ]ZtYpӞ sP!̭PgGK  |/̆wl߹|߻HHm #P 1&MRQ*ȨdDIir14f"-PI:L(UX6)F6,"@0.}}B(ՄjEe\ˆ GA24%&yQ4\M 4JA"}azbNX˯;Kp*D37y߉ K|k*0,n[EK #1FF%@Zj_IH֌DF $*MFTp8a2``h>f p!"*4B>dP3RS& 5A) 4@(ԈRBqC 'Fc]qcSu3qAXq9xԼ,0'^Gss888v\^ Spsa T~O-t~QW|өTUo2^Rt^գXEA(tf.?\z@Z(䧓D)$$$$d.d xwqvUU>uZ*$: RD^.R++^E_+`A܂(بFB TL2}Nec9s%3$|skY=z#"zРOlR[xj I[1]?p ܛySokO=30&5>Ϸlľ4Xy_(񌤹郇#@MB!5l:[j}N/&! o5;ʫ(㙴i*f18gAg*J Ea:uQ#-/&!|tb ԋKfsމ޾ )W(hiͅlfz<ϻJU57kCk۹8][X}5\Vr|-9dR4TKmHoѨ`B c8V#Df3a 1٨TR$M-dFl{?8<x-x<$M6sж7t\<(38Q8lZ IH2h^yCLPHqCDs@{cxkkKn%q׮_YL'^~Y㧿!Yf}ML LȽToi35^LS)7KQ)5RA̡N B Khq[Y(٬ H$IήS20 U^{_') #g%/'z;m((DJ[B3l>(O1\,JݕTښ%ЕRODAS91vJJl%@ii Ŗx<@Di\zlQNh*2{dbCey9RôԘ]آRr uaJRf2vA>¯~k7eJxc|RD/|AG2l}Nm']O,k|1q4/`u~ٗ]wOrki'}'6=/}+1b0uOgt蜝8P?\Jk)dzE*ǔt^XWM;#הtQO Dc)ӭ RQ0)ep<[*aji꡽q=8DL3=+rRw=8L6CQ)&D`現-JO;}+,o5U~y,ݎ>+%]b!S 50}99`;WnW#vQbeO.^^f<J#eujeZ?u}VW;ԊqJӲJF527 $DlIRQcHo55xZ3RH)o~$q+{1_‹W[ sf?p~ ~k;^.ɏӡ_Nҿ gCm[gzE;w>p-.?/RXkg1=2; 6dJm֔RQ*s¸C{1֭E܀ !8"N +I?;~w߸j;|*Wx;I-f^{- HoCaNVw{xsn7MG_fKdlFx&D#Imoǜ:}s`m1cU?c5d IF~SGO6t\MI)1Z^~e]$0зG=Y3yT(% K-Z }Ιw>L&'|⑕ti'aw-yZ:>}&X{#k) x<ï{x<3R7(X\W-*]x!霿 hPQN\vz6*/&!q;3lfMgel6޾&wwը4c$';إ{GNv`7!/?}]?.]_}o]O߿3wj5=ѩ:|N>xxY0C\ dz 8+{>{TG׬b˗?pRUߩ6*c˯-UB9D@ǰo¸C{}}٬o(F2Tq)oT*#os<'a¼˯)9pl`Jo> 1;g}ɵΧ3[2c>yKLhR#:6kEY@`mU3<], z3"25RTJi~¸)GR]dɒ%K&z csl7YPoTEX,|㎵MFߝl8|ca켦Bָ'#bcG2[z\#zl?b+9Kq930DԳ砩Zhv`M&_|I 1sf5sŋJ|1MR* B!WNŹP*ii)0lZіi.imIɉ\.qԔdBcL47 ٮ(*#X®X}se !{80qØ1G\"ZګG5;*s!y{Z53flϹhmiUӦN*DѪ MӈsRtvvqOj!$)3WY9"lɲ7|0> Oڱc}>nu#X0e~no @BƦ ,·i%M+iO퇙b@$  T) r Жmiqx!;|߽ 'cݓ"óO h:x2m$B1:Q@+%2B)kz5i<gk1R>MMO Dșq&6VԶvyy7.>"k1FB|J+*UJ+*Lj2&Fɴ'OB:hΆ7X|hx<:^HMBrVR $+n>RBjN 8N6x<[ ^HMBz{W-χS IDAT{qD5sŻW۳Ԕ]x<g I37u<*Bj"-ܾx<[ ^HMBDox<~ĝfMx j]x<g IH5E3=y7Bj暎Mx $Ix<VRx<[~IȎM+TGEy8}mԽBjѾ&nl;kMy̞; 0WmLd{ƉR#[`K(y#$yxGj 6uXƀA-Hy9q>x6#٪hPcQAlp6aL6}:ƱyR 8!rfUƀU6[0mc&63/<[â`cXSEcMd1i6OÐ>˜Vќ9?qTR5貦upKDO"@SFKlzh4(۱ϣn<< z<8#%Ԩ=DTlhF) 5 " x[[|%fウopQ% uĜk15Cld8 8OaqQiw!d8k̲ܷ\{97yƃnMOgk`X1jWܒ]K(rx?]p;wwNCDW.qZQRJkMҰ63fT~v-pcāSi}9i57p-5+62K&ƺX#k!LȈ@񍾣<x!J6@R-qk-%2֢LȎ6Bs*pƐ101ud"n0ԣrƍn^C[GA $C1g{٬ֲ-ygsOD$!@kz௡ek4F6NX4*!w;a8"B c󨲕1_3e 1h #{<pl qd-YbjA"*bJ[)c d 3Q, 3b f Ѹ\xBvrZU.8ԧYJ6cל}!B)BƌEߴ@r8WIN:9. :"cZFd SN0BBX7vMn~gAq RZ1Szx6R7 &ccXĘ@n `IBI $0,X6[I"mP_a R K4GQ+j` 9Z b"c_vMs.ʿkS4ED1&I(MuikG9 5aȔd-H B ,MM0D9#R0Tb c9GkskL-azdsu1֢1<$'10d,M"BQEnөAK 3qZsy椧Gh&/<ϸBʳ`m=1E5F2fVgڵWdۣ/ξV~[p4Uƅ ~⤓ynט5 eHlCinXn%gJgҚ]y}6kVP 3KB'OK/mnDy?XqMbɒT)6~K_]?FI97zk1^pAnk4w.uV> /}I-Z${ЌiN=4U$GD宻TbW&tirrݍX.#LwwhH D"\R8xd޼𪫠Ev]'DQ\="c3;3Ocv5H[04}j |VO9GC yNVCW^v\sMߟԧv\N;=$!\ҕp9ܒpnDϪ.SR_bui'ɘΧN3Z}Nt睕!X0˩\uX. u7퀨E`RrKtk<ȓD' r._tUf21S+K'\y%]կ+hZbk[{\pAZ({BkRhO4~HQ3_|6gu?WIB|ƘZ9o^k1d"9 'd>!x& /dk`[[cko:Bl|МqFrK/u[Sgbx! zj.ixcO_y唿m7QxYhEwܑ{Eڳ.5kwcOG 'ȏ~yzf^|?Y}_{G)@t |3;`վo~._N˖W7ݔ*r2R}|YNO=ݼ<!!3͕Wil#klvᅰn>o50|ON+>~x&˼OR_w]ͿU )6k+*od3&z I8kLJG~mI:S̙,ΟOk6~dsdns>uS5\c?1{y/ }x< rzf8N69첵x6VG񞧟^~I ~J>>_[TuV_Lo5yk N,1g<{߃l6"\JJL[0~` k-1(XD`@%{o5/]Q?uVӦŠWqѢ?N Q_/rJe?\^q/Nz!1;;j. `&íBNՕ+3z~ɼS%:_~W Y<T 8[Lfc"A`l6 JArX rsNôfs…2M%;@+ck,H>Qq˖3VXi6K(uT[WP1% VZHSBD!\&GO7!"Oܔ:B"{oV5kDvڴxΜ7xWWe޼x=(&)N23\Q̞Mk1LkIiڵ =2 DpQXKJaoL `*9Sn 5kloo4khe-0TG$+Z<*bk @0Om )VEٰ.""[r!cuewډz{c@nakScm붭J Bڒ" D[("*XիaaJYԙXXg'Z]xIk 1@@ňڴ?gLVVr5QjmMJ,j˂HYa#c@c\-#jY ~&ct"|ގ[ۀ/)1 ?(tk ;HBX)92 s`oHSgBʳ50ZmFƜׇtB*`wqr/R}m DY/@T ah1Xm-i;@$ZJz !BT *fZu+D1@*#bH906bm-KSQrڴ 4"H-_("""kcPȹ,3ueD9s % Āsj!"" "F1V6j ֲ7hbEr)D%sV߳i8Gx^Hy&?wCl}A *-6pNA?nfΌ9]ZZ9st2D2"BxqerZd \]up Z8 NZc# B) @D!W-ƀR5!B覦.5!|vЭ%!7yo/@cGY#zz4Q0sfZ!sCy`k5 mXylF9jݺ$sd <Ν4}: TtNJ 3N;MzV1[(U9A 9­HU65 p5# c1`#"cs@BuD`-?T{{ (+W Pn@W]ɨ%X}ܗ !zq+. ZD@ PKo΁s7ջ/ KQ¯u^X JXK"D\kT*H!~#hXJyC1im~c6>XKDz{@;JEEVo]T5;쐳V˪}^jn+Ŀ5ߏ_yp)ﴓ}Ypi[*̙gJ"Bc1$ j-P|ϰ$j/o~b|+sw0sݪܩ}vᅝJb-X( :5c&IsH SuS Eƨa?X$;aIΥ`55ka(,cHjnF!`mj-s4Eͪ"=fm[G-XRSfۏ_z)#JLOOu@ 1*ƕN$٬Mq A_c| 0F|Qd1եx!TV2%5kkl\,yhja|l4,d B_sFs5/?D3u*}xy|‰'V.M,`,DmmT45&2N ֦ӟ 7$_h"#%;~coUWd̘l&lZY{^(b1v0DXTx<$g? f1h q^܂?"н&I5Z9X8`3$R0L0Z5`AJR5k|oJyٛn+VN`=ئ_cLIB*+R 8g DT'|[(0Rj"7y-X4)>9Ĵ Xk.v:<'r%t)G'?9_,ZUc{-[o &~2"qDڅN<1=˖EѪ\UG9&ϵgX…:(fK>: MR D-]lˬCgg%57+ֺ .{g#Bj /.DإK_miA!"/ˎc)S$$Q/V:::T6+׭D,ۺ2ʞ{c1fo%ioZT*I")\o͛O' uv&Zrժ]uvv|Fc4A@6 Ԛ3f,ADR 8^ Q"v[n㜔G- HDϛE"ænM+soQV5@ҥ1&/,{ VH[6HxqΉk_[sul=[/ZįhQvŊncLHD˘1-b"D֚K%K1D70b(_zIo=[ IfJ GXAx饸P($"x챞\@}ZoRJEdZՅ%KwsCҔqZ`{R@ PAda3=tR&e2* EWS"7-+_Պcf2BA"ƴ1U' IDAT3"P9I06rYy8>wZ`,NTIeXZxUZW)" 4-HDڨm! 3Dh-he=)uRi8=IR0QLܢ:˖U-QNo7"xa Ui W6IN֝x$Z'nkZ];4(Hv%y9g(e\>V8IRϩUc4ΊsJZwC50Ex< IȮ{0xrSwbRab UCN;!VdV}O\u(URDiK.%Gf2Dsڈ럨ZhoڹPMdem9Jxkmgf/2jl#ظ @=ύֈ8j R-ZFjѰF> ") c1p)LIdL!(M*,"#º5.kV,GdJs>L1[6,!(n\ DZC=@#"—`D4d#$bC>Cp˱#VRgXUԀjLg4"TSL@\xEh:B@5?aaasA1h(`vk=4V8N(Qe)Yk}{v8ֆah-)XkW1>uԶ T֒ ,cRDW-\1imd; \R2Ɯ usʌsQJi1lG@kc]ykH1&, Z@D`"6 ֝C5)IDeR XM~5[rط}x& ^Hy< SSOc[\Dƥ(!a.7đD d mfLA(_#W.D{6T$MRib)e'R)˺*Zq)E[[\@ED ` 5C,dIT1:Nqk-\iu_P`֚JRVApε֜syP8∣J1X,uttQ&d2Bc1xnNۺf3 ̪Uo2ƒ$IT)$" '|jժ--mSL!ҋ-yR!5*>@j@dZ\hV!cCƘ1M,/<:^Hy<[#5")UJą4Z!dmd9mt.W8CX{{*jSN򽽽i(y6Kt+c1! R I2YRJ .D3kloo &W@ĹPJ#bɝN$IGɈ斖BƘ1ځXXld|>+r4M8NT1Vh(MicAr*2BZJTkJS;knfL~a2^{wiƌz)^ΥsaOO r΍0o<_1wl3YygBNCf ꄈs㲤\Z@sKa0a !(RJ"i&I%u&+B(LwQ` @^tW8|s\|k*oJ|2k]2/&!IBD3e‰>8a妦~" ( SL 0>D&4Ƅ! !a""ċR$D)2ɴZk{׮m*wuv6MRpΕRqiZ15(v"Db֬;d1~hY;!jR!cTEQl. Cc ɹ2pڴ3g2E^[vk4uJ)U*UZ+ιARJFD6%[k 岌1MM(RrΪըus9Ec)SN=jhkK.yꩧ֮m/KkHQ3g{Nm]l^֧XѿZqmpΜ9gy*1YjUoo\0 C!d}}<L&d3d٬uiҩRZ}D֒>XkZ) arU. QRAH)yCDhR:ɥ79cswޒuB6$IpYZc-*ҥKj(rTP\ WSa;ZFQ sTI0 Ƙ]Jk \ZsAHba̙\m^|ٓO=WJ[qPbh_-r_@J3)Bjګ6u<O5UDcd+^{iZln$.K22Mfcm6  Zi8Xkm# 0I$QhZL/JqY(+QiZ5Cd2---Rg-#$I1Bgna,"7O fl\.ec4IPVUc( C[c`J)DRY-+RJ,%(tc0d1D)S$֒ kr9ƘR 0,MME)yM1DPırW===.+c(t-M$afa$"Ʉ|> î8I@@L@)S3ӧAΘR\)\!wAr! ;;;˥r'Ƙ(J|V%$UZ q!Xk@|nbQGQ?˅ai_ooZ5Zu$iDQU)euRX(4MӔ1Դ6̘1= %ֺkݺe˖K)"lƥ:`ݽqU ?{ogkZXssL=w3xiq@$AzU~+&$&F$&Q/ piZF@EmgS=~k?޽Vϯ~g{]USz1&:Y]]=2??BGFh4"Ru]eZgY`IhTNJ/h4@U,s.(sZx<"a|N9LJeիW6˲BшTc,˲,G#kMUU_PkkS E$I4M$9r.MlcCR 41Z>#n||S,h k8AجxfDjf;^Ξ{͖6v8o+Eri}#yUm!\wlYcvɓ(j"!i"4feyeXu-p/A޳0;T]Xc, ށx@9Hбa%d+_! !Qd,4k4ߓ$i6s Ƙ&yЮ*=Z" vx8izUw.Ԛ#[o{oj͠zOZD3 _fxaj"f~\N?/'kk{[)7Zx4i^U` eU֯tCjFY*=kB@Ę4haa~\;!qYT5"P J"D&$Iaј.\1p@\Edż[PP>AH@}?߄F#o;h"ChQ1z*RPQ(kC|<F#SŲ"loEOݹneIQ,,cLXXXMEQe9(I2$;y/9DYDsF~ TݹfŌH0S HsB|H Wu~gy$IӼ,jgwIFU.o+SY:W Vwckgck701sݹZ$F _׍,kddiBH)DYaԌbp+K4vC$R`̓O1IE1f!fBx49T*JYy)R%kMeYE8bfIFU!5sYFV)xʲ4}3!Ct8ŕhtusskki-/jXP̢}Ѩ{^D,Q+9|Ĺ,k\/^ΒhT_oyū^ַ~d"M?xg3|aFf5 I7OlCKG_[ovV:e<7?pZyJcZa!R,(Fe,*\uV)`SkV VZQJ!xT\Cx4uU_; {{^D8D:(Cib׉AGӶI&(EN;6gYe I$VLERяNktqUVuYѨu;vo\9\1.֤Ť:4~#1G&bt/Fu;PVDJ"\vssO8t(5"ƨ):ܯ X[sO,iV1fl3?]S^u}(aZ>#D$6R3ǨϢ(=[Q$Z)eY^r%Mtf ޻յȑ##>P`wHtjգ7pcSGq$<frÌH0o"!B^W╯j|n0q<.HZ+l$7tCۿ&JkUk*\cڗ|{B !Ilmt<,!α]EDu^sI 1NA")X$I,!G+}Ѧ41|9+4M#cHGD@f Z@ҽ~/˳`f9׎Eb6fnn~~a~~kHkPD"}=k_uQVP)T B0D5R>Ntaofi@5oxw} $3("'+Ba/̈ 3<9EsYsHSdrB$FiOoKVĉSI^Gʪ2.--omnnt:  pYbt볞Q^UJi ),KZH`fD+4 @kmBaa~~?( 8`ZV*x!Z:uh4z1 Hӎ,)iAFD qDSՄcq QY$;WUMæHg,j/Q̈ 3|␥W`FDJ [[7ޟ;hU$͢<0s,Uݹ9Ͻ~3/fDU`.^8O>y̙$MBDZiCdX8:&`S P T#[XwvE RfqޗeJ)M J4U#1/]}8vs,iA$Cb/*ڱ(H #s4LTL`:!pQDPkx銟eIJ9BXXbff]׫ιXWUE!JMgfkm%YhMD/Y(&r"!JaݪI%,e1A@@A8cH5f6qN6Yȳd\dm:znm!ܪsWp8C7򴓧N~#3ka/̈ O!Nm>>P>Z^Z~juNWSUv$( w&)sĩ /VJkkMSUx4(,K&)DH()eYj kBmL8f3Ly&b@T)>hE'ʲTJ닋+W^=EʢZFHٟ[SE+N눈Y惇"=݈QIhR@ٟ(RD$$EbG:%L  MK׵IbC"RUO*ZQQijmBQ;ȥNiu㧆}Q#bQ,!@x/@4O5m42ApMbIıKX\^uϜ}h\W}?h8>OP_M&a9pbnjH0~.z21P0I~'/^^?)&Yw~NŸ, R*{o\Z^>s($A8% պ*>: 0jFe IS9gnZ;JkDDZ$<@E)}@Cb DG)6F`q*U@D'֪AO :<0OhD=E)9pM5!f8$^E3x/JE]DA 6!HdPWU 5Riibq1f,McRsaDQ@ SV{~]8؝k4r&$Fi ٤ ՕDݭpl#rfrzK^>wՍk'?Ѱ4|E(\S w 3cFfx "J5x9Y7xRWL@8,ѩ'ƞNPßH@Z??Co~獄Hej=z}5 ٳ!pTdYhAo6B!< ~#Ϫ Eh"BR$fnFZ$i9(EYhj8k"z!`%jzy RX.fcF!*'cdOE"ySV|0ŹgOS@:Ы O|7R|v́!0"a\QIi1& )TEYJʲ]$IeHHDn7M'üȱr"|{VDHX?kn#׍\7pxc4MN<$6%0aq"B(A+/R>BDct%VףAReeU83Uf1$RZQ ~Gnogao\/lb֎^yqk,+kՑՕӧNr{?~W㿿7x^mߎZیcP:O0fDj(t=!wyA/Mypǀ'Z& \]` AXW; ;{Y+syFnUU+E DAqHJ)"F<y:m{+i7ݹnh[U$u~LDN潽=D!xEHtn}K.ei!Y0L[_WQ5@2>H<y,;*3!"X8 , Sf`sP)e1lUU#<^ZZXXҴyf51#faFfQ }E9 (kT&53@u>H` NHLBCcȻ~,QecOuY~h/^e2Op׎-]tuZGWW4! BIS:zn.]~_]1@ &T"^b "Q:  &?a &M-Jkea{w_}ٽݝg?<Ϧ""Ȃ)Xv(ByCss^{mUU5^\I2C= CuePy%aǹJ@DA92 6drmSqd:Rquu>ׄ r0#7[[H,&R{'y߭D:ٶYm\yBvq2HLYVP!"Vw:'VV{^{mDJe DČ'gϼ,ވ"(U y̡,z&q8I@A1EP!M(@x0?G9; N\[[;nuHk3ɢiNV܀}@ i\#!I|-ޏѨIΞ u2x}XK*ѤjO?0Kss$znpWwGnBv*[W77ʒ(uuKKZ$AA)zuGε]f&gOw}S ni\(J}|0I|ҫ 00O!cǏ/ _x•kJv/DPʢ!]Օ=3"ֆP1EI49dqnJT)$I6hGjkV)f zۘ3'OŇ{}Ẅ OYDA^4>w_ED!ĐÆRт#En4u51Eؔ!(ıgq)P " b}4Ƭ,-Wݕ+yjRvu-wpdm,IXŒ]qkfvD(!ݑs1&k4ZmEcuQx1?zx\w$)E0Eq砰Ei3ʍEZ]=&ru41׍Fѵӧ֐`8,z˗w7}Upe|'꘴DR1+5MUL afKnNWœ:Ŕ%c080nյt?W^ћ|VR`ct` AXGd@_{  ckSXclJt $Fe HFDc~;?)kWbOu 3(wNz}3Q__aB0 hiyT6 8i0؝9.Ǐ[\}37]wlyj:e5&mkTY"ѕĚk9~7wt+'Pq:< 4$iƢfČH}课S8P-(ƀ=%) cf"P=(QRFG">I֠uTGpj:=;2` C c Uwnk*̸pV]hvLǣG/_#uEq= h])d(Q=i҈$kAJ]9 vwՒV>pG!|.tA-BJfu]1&Ҧ&"NOJ+"ʡ H|06mu]>6}u<o|U3Ji]$ٺF8z4uK""*2B`v>J>hoխ}k76^>.3D !!4HX:(w,`8݉WW\G+Ӥx-"ag97I$M[re޷5-.K!ϡgg=sXg_[9[›o#SΨ.} +G\ 0u+nx'ih43Z$&y+(6bR#?Z/-}oYU'Jp6ݛ 2B—&8"h8Z=|Lb-rY e@@$:i`ʢ0Xh"0DpHTpP2ƞ88NkX=D: IDATA2 BP)V΅lhD Z@HUsI&Ea$.4.dknJ:5->5ۭ# KY@FW!1{/€@HHq4J2S 13 P- \]pv],k) ]{W}tgk,]_69bfpNB7ѣRH]{ZGC(Z%P*swD0"*;29؇C 8@ n..޻u=zyϿP)#@PVxTzdL QXh/L6IlYga!?y5`i`ޞi1ssp'UX;BTε݆Ra}?,(krs3/lRoB'Y]kH}=^]Q_h$;ZSr1o7vpֶ:}:pR@H D(c:v>_pʕ3g9zwXkn]x;ꉪ? _ẍԗ!~W| !yç_@ke)D?{cZ?yoփA*[x‡NQ][fY@hj&C]RYŕ+7cub}yZ5_%u @LIkcŅ7H)\;~Ri=^u2Lnלw5Zez rg~tޥEѻtޚFb>bv?|.,nݫ+6,'ɑs+EMϭyc4u>?{y~"[W(I3,{w~*UV]umC,U1TTU_|Ocsۉd. aPzWnu4gz.V- nSvZt_^zMzuQdqÍ9`u׍f>7=r$?~XUa7b)hK-,@*SkIa.r5/{k!,Mf!{~g>Snm1Q7ݔ~񋯽tm'(;;λSc^OFD_e k^{Ѯ!E4j˿ΞMug^m\~O?|g^x3G2[#y~ ݿZ=~\$tm}w߭uKVѨ,˝F^]W>U+=)EU&XPg|G7-a=T}|A#?Ѓn~~?W>tvKv͟|@+Zy;Ymw}ӷw> 450 fDd@DIS=_^Jnw}BH!cw9~;mupzk3Z+@ܸՒ;~hD;|ʳm> I=Z}o~@Vr'U`51Tdy~闓4|rYնΜ=SɱcD +7M ńƻc뿞ٟ &~ߗ(ӧ~O~g. ;]}ԉI6£l;If $oU厈DD'QE(Z`R,P"{!p"DaUfݿwmm7޸p;܄ٹַγEzss!n׶_sZZr]gao?!G߾߽4﹧G(4sE zQ:sf sCQ}9 ȹ{/?x緶5' cB&D_Y}OOP9Klyr_~>k_'W6(Ng [QvVe}⦅̧J*< CQA"N 8"-8""-4( aL2'<p~]v76oժuVSzN}}{_v; 6cO'n)`eS=ϚU-sbTY+[ɪUx5QoM@p@@Sf!v>~dl1D*Q*{?[eSaT,S:p \jD  Vz LB 0AF5e2Ig׋*L3yr̚*Q**u!vv?ԓ=وEJ+QSx3RoAbۛ= "ڸ1b$t~u=ӜI~k%??edٲq##Rγ!jDsGw)3.[0?:+u1llah-g(NۓG!^t&r_)t& À4ٙLfl,hO#:1|ӹ礔6lg Ԁr@-  XNL|#Vw/)gP&8kys{Z[mgpA|N6eRjSj"v T9.J$0 CιԚR2f"!r̹Mڵwn8<\nyiR)L>3I 76X:r%-mmK]k?yq/|W}smD\vUW^~ hRKB() :P)iOGorRADHI$9ޟ~SGbŒ0|jý{7}}.D($Ru xnzx/T*ׇY>:~4!(d6"RH> EB%%! BFv[[֖;߯,,^Bo1cfKo}\PMfpH)}_"9Hg,REIX*d6Ï_=Ψ|ϗsIqmF1RR{}z:)o/TKm/ɷxhX뵉 :zu>/>F!wx1I"FGNC?yz׮Eɖܿ_)^Mw/;bѫBz{yOxi bαR ʫΟ%UT.K$NR\uRJo#%55[&^tMgfs/diB)K 2?2i>/?p^'TzdZisޱsgîUSAJ˜C(߈ JBPBˡ$8pbwoo&k֬A(D~R:K!iLj՚ۯ_~gׯLܱ#^b+3nt]_ʉ_p&&0o|{gă}lk*yllف.[NaZk$Q&J) @4CA? <}׏e />6v)ǑZSBf*R{;t3f~/5ɕC|銛}]F|S}°fΈ >qi}߮Nضbz8F8Y!pMzٲote>IT2H&4vDJӏ?0yB ՛K_iblIV~n18]m&F֖+m~߽?BH;ﶷ^`Ri[Lx0Hۦjn/ƕ^}9Q;o[R3Ci d L9g®ٿ=CN-B/צ⿑soABϜI,Zѳ³2֭k׊wC'sc1ahHs.O=n]RcHJuk4c\ 6mJ.$Yn\i{ns۷J5kpFʘ}qe y$Gnu?8,],_LJɯ~>_J++*w+!ɱ֕~P~~Z}dhH^|qp,ȦMMʕ"uKz{3\S>TWTKԻݑl3g |=[lv&D$]{џQE~;qϤ־4ٶsʌFrfth@J8O, Ra ֎b.]zLSS)mP Шr)r(64l6[Z҄a(〪q\Be9 Q\w]ӈL)jǂRx,w>!*4aIB@È(UJٌ<DDIq0ld{ӿx;޾|Ji!! # ËJKzkaO$>'%M%729` /VciI!"!S"ֵr)<~)~v`9ZM$@ÓO_|1^s\roR㹱Rhl(YKx˜NZ%Z5Jdb8T*A3 :<ڭJl[s6 '2HT.eڵڦL>Q8Tj?2]Ⱦ#h=s涻Z)/]Y|e'Ո'\(-JeR'_zUL!P_ӧ]L )Q 97S6$0IE_18'N8!Jc9\[Tf Hݻpa="7 IDATƬrBTO<2f _G-1c[Ǐ?^.`ڵ:ЛRzhH^ʼnu‰>{bGg;W|vOO݌YbtFv$*uRo_H5ttZohEj={tOde3cq(FJ"H,.yppsFV*F\ʫo~{ۚcɼtJy3aE`b炕+8领]h6H$F>W`ttdht20 ^>J&BdMd.v. 041xX)],f(U̲Gީ D aQ*7}z<<\<8.ZNTjZ.s]# KEJe^K kOTZFKs0"J)DӔa*R!׾r>piV{RYèk @)P a*| Rӽ% );vr@ibZ^Y !.hiR4!-U!mj$R(fV$%kX5ynӑGNgvM_Z)mz}=#ÙL+%lڎ<zdB"^}σ!cרoĎx5"-'HhH{d._†-K?d3Oi^" BT ftvvv:Q[[S.U*R [Zs%l{=992 8)a[7.c|$dpcz9㬳p۶_ #;7~≈R,b)ɼyMlZ~m{Iϰr v2\=R N޳ [[];'FꗟL;`35krΤ]`1im=0(yd|g Z^gHB$yB(BSz?qr==oW.Y2 I=8 ΏE4"y`,s5;tL0:Fw iY~aXy˶vGo3_|ܗM=Zk%"\hF~MBնӇ3ִZ097.Di_mcUmii?cE5ƪDZ' űJ1 +zN~HryrٲC˥))GГ3 M?>*՗ "1xuڻңzZ/˥-̵,[8v]ްQ#fL%]wJ_1}}Go==^KR߃{ ;) pѫׯ'˥G&A~?CE@BmӺ?jqgg=}_GuwwX,\[)_5ϛ1gDDd"u$zeoƴn.zյ_+W(ioȤ2R];w  RNEvl!E^/+y֝?qsKҚ':d"djppK֒(W^G7nL+}e~Er$k{bGS(.%`Fbް!u\~ՃEE}}uVk/Lȟ. ^3pq۾| ;bKʃ3zHq쵷7'A-hҐ$f  iYN:Di "L56JoOp|ov|~;yy}t*UT}}VD (!hI!D<#^cǁ~sK&:_wi)5r'0>ܻ̱104R*+ ,\. _;/>Z/êF^+B[n7ȟ}oƇRsƏvTJ.ٸ}\}uL)g|],&/͓͛N;L=|]pQs71ǘyzSBgS~n~i.u%6kEuN t+5l;uZa͢r=B~׽}{+===o9p-|򪬝)A\)Ϝ9wF$SR) !JIǬ^gP]l,:9 !RRV??O3/dGLF!J+]sgR)-&\LL:GKϟ>Yg1AGɧ?ݦ5H I|y#eKq~$@sO@iAQ K[λ*? \Q -Q&W\9}h2fdPmv﷦O˖%NO<4cbsMvH )Zc;t,شē _^z|3ӂG3GG#J67::fNBS{{iBpJM-jL(fswVڛ?]_{uO1R*G-}1C'T4̠I< qe ]ѿ>$O}@jZcG~ZWo% --7J{V&\'j8m᢫~s??r2G$0%ST@I #cYdx ,vvrF Z(Qm@s1w̶i&ЌS.@jlڴ~Xl.)0t?qJe'&DZpR mPټY36~_*5,aYaf(D:"y7z= *F tF'⃃v^x/y(SCIm \[70ЧxU -?tqZxIho?%\0W̘qo  0#0H@Z&ETvVfH/-L|;},@)sL) ĄhhBT t:Ӿo`xRRiQ g5kfXLyT*[*UdV*XD% 3MmޖNڜIB&2YU6c5Ǖ֦ hDhR2)ĜryyR&!׫&բm:sY̵MV=|?4z FDz!\IrN\t-n#MbJ4$AB;1(j infRE)`R}RTb*kj-JyxRql$/tDY <3YҲRqrRy'F$eQϛ@Ūi>=FF3 (f0%1{{+I%Ҡ:_gGYFU<Д鄎YO .]pl᧞ܽiSO{xE'rFaJi;iZ÷pmnjJI[2 )74.%RNgMe-m{Tjq>6>L#?}mGvMW+J11<ϤT&1L?z`R˗6!˩#, YC(&Q"J0|^ב錕hPc yKjUf|q0@'&ӧu~7o޷nfOkON7S0%ނPjC?JPoI㹔@) ZR!@ AP!!eԸ1huDM9cJ59]wܚKRImlP'ZD)d |KV2HW*l8RJM2sMK/?Eӥ8Ҡ&MsFTvBPMJJhBjŔD0@!! &HiǶz A79mT ֢J9 Ē Jz(%<<ӴP0m!6aBI9J)\@R9U)L(reضmuNݵz=2NY.MTJs?8XR|5>x}s@RSW3%ނ\e٣AP.4 ƎZJkT ?^HyhۘP1 {W0 Z=*F h$,sTz%uz&41#!a26-Rw\gu{wOK4rܗfYZ{'7MdҦc\.&F0QDnX,tKjDb8њDm*.QkT{9kgR25bBpl "(@P$0q$ f JiCB<}^Qz?D%L ݴ2IR5R@9Z ֍1lք(B93WCG1IJ'R%JrD$Rq)cq%Ԛ0 Xje!aHRJMJO0MZ5E'&' 1ZڲCCI_QLӵɉM.0Y IDATKM"J JJ(y2<:%X xP\. @*ci{>"2AfM@XQ2BR!OQ( Q2 BkAkD0o 7g4 B4 RBI΃-۷ܪ95×3 зm' ի=Tt.Z{NG{!`@M6j(RgzԟWi2@JTZR4 HHCyJ;qbV,z#Wt6e;-f.,JE4,NB>(33s"J3?imu7ηVի=nH d ?$0%6;iG%`dY(Xd a-іH5I75y878U Fc-wqpP{Ϫ^%0!HG: gpV)a'ԩ.e޺'OO! \h]]w{ BRJ)K/޸Ԧ( }T^nsp8I ىP'@Ɯc!s>nZGi" + hӦ2Uyx4r$%I'Z zs?yΝ[w_U.S:۱pH~)1 8嬵TTݜ"Dd؏Ct;LP19@0XfQQdEX͋غcOlm "MA6_&ι%JЏg,c+-拼(ZFpt 6Ns6/K1vZk BDǸDƦyrAS^_rƍ"ϭC_={s9z|Woҩ9B04|QƹJrX X-Q""$~'7e\,tqe c85nHww6F;,@˯?_^%@)sN#Y!-:ӝ| s##""vH~\e-Dly7nMY/ Esq+ n 9b~k!x٘O5Zj7:Fw}c [v4K<˲l6}?(Pݾsm$gE GGyJƍ/Ko8_D!Ľ}k:~w`4B6˓U:L6[-%IJeuIB /])j4 Be-tVWevppnW}p$,,ҕY-s+̐{2jF+?\%**+X8y`@9\EVWO?1S(ÿjtoќaG'QjZj #`wEDpB`j7C$! .O˲ B"dz `<"t@Dxʤs"K} \,YzJ[mXxW/}棏>(JG<&R/t#[H D-(}OM>s89D>D2ةo'a](90d@lq4<^}WN&tHVrmm_;!jayeaQ={Z,V#èFqL,/_5P(J%<Ϫ|/^[Vy'>ϿΜgȜ/D!ăVN=k8$ hdj4d&AH)8gH[g,W~ Ƥ%/hlEd(+ Ή1`\";<8س=686qOxoʄp2 g.T u.V׺v:\GGGGidYVFJf nu}%!˺Rʍ,J;B[9CdD9(pJ6Zc㞧TN@R k#tg:mG@0J$&8"Q\}2s[J +/ ӛ Bݭ F7_N ޻5]yBst 9dC@"8k醁9֖u9GDF,8Dr3ڤYq/.3 _qƥ|5ypofFnA5B9[eBLd9Wu/lmpoH Vlε4{WqZ%BR,DJ[]\X&Jf3N\e%D8<1M$I#c-hD,yh^ڹ|֘S۲s u ΉC;s DOo7 D.b[KEYZkIDTZg6V[gڀshleUߓJnqv;ܿwN׫ʲnAPVu{=?GGI]j5+\?{Dbcs ,gU8 G@Ves"kBeQ`BQKrPRTHUQ~,$M1iw;;J7%IDhtFfoJ!ImHvI^DUs$"c\UTe^觞zC)w#01F~&8o9G't J'sG!CG ˽0h=ܓגdom_X2z^Xo?VCi 灳@ڪh4( |!3ʢ0$Jp\[[ӄ(!؏G8HӀ ~} ]zL)O GTx/9Cku1DFGaJ !@ clʦZJ;eQ9yRՈqjSe%u2NGUjG=ȣWٜd*ڪHW{f+n4qj/󽃃ãnlyYɤ j9՗ə0Ry.'fh }om4dt2:glGj5j9L[͸Ghۂ?|NuoD!Dߚ ω7sH ?ۭVx6e9dyf %(3r)$y $'pRFAeFEAcߓYl6h@(J{v<"_7oF7[~*,7H)Cr!"$G!H!Apc 1huRJxD.9lkk$k5CR+$bwo@5 ǞR~׈qy^ȾZ*X{gy1Ȑ  "gˢ0ƜcR)fsO<ؠ$sc6iCDBPuy*)iRrX8%sw'vv:!Jxss%IO8 8Bl2|{{;b!$BaHƘ$"/nܼk?#V951/nar4 >CRЖx![k^m2MݔBeՈc"`]f#͍V5w>8Ϧl><ՈܸyO?͍ur̒Vp„ q,;bJXJP,0@!gu:a %-O^ZS慵q䈜4PrH^~ _`+/s1&`#kooDp 1!A%yU̳t1f&5*<~u[H~xth5d9c``,HpGqzcnOS3,bUV k Ϲ`!PUUYEEaV[rh6+}Ͼg0sd3jkk}و g\=vʥc5]8qp$x!#v9ĐHp%s =BO3ʳl/3΅"0<O䈈1"s(rg:Ͳ^ۓt04M)%V~7Pj2FAƱDf3]e΁66M;wkͭqN{s­[wf:c[[<=`hyfi5O<4YDq#R &9 .4].ʂ![-%ŋx}Z={.lI?O; 9z\o K|Ţ}s2d{ލ7^ȣ>rppXJ,3Z`, !3'WKJ Z\9~G1g*+SYkueQ|wfKޣ|?+ʣѴJ59kA"v}ssFkk-V7n̟Lusa0@!9u=+VVƓ2n4p6 0z3_}?͟(0ƣ8/ .xA~`C@-]hv6ծӺҌ!kZNl.Vx:gkǓ$f]#|M5aFYcYk#g9g\I9ʲFWjSVPN78b6_t?ZeYdY >L&qUU )RL)q}8UYq/l{ɜ1v(@5cyMet=eMgΚ'x|wwƍ[y޽s',6ѥ b{~ۊ<|Ediu/px 6"z v\85\-x7~g\13uz'UYH)l(z' (86З"Fͥ~;.t4][k }'h# H&Vпψs| H=pof㛍#GBY!oſwUhZi'b9T*#ιTJrN|>˲|o16XyD*3[$x/~L^m00&r~j3&dR먪 clv=tvCy[󽛷KV5 ݖxc` VqΉ3!Y 9piUfȹDs$q! D <.Se:y:IZXZ3F#|9'p4˳,(/}pZu%ԎcO l;;t:qܺu7ϓ|F:\.8 < Z- ,Mᰲ\iknL0ʗY6/G=bN4o{htxpttNdt1sZߘOzY&+|&+ za~iUytth/nݺ_+9k?x ibͩQ)1څ*vYYy^~W-)Xlď!cʀ(s}q^N+F Jy~YF&BH֗qU7o޼tY7776{54].泋uYqJVq̒sV4qn6cΙ֥$+!g3lġ("AN#_j"#wd9H=?7_wzߪ8qaRE`dq>|??wߓRNY+)l6'yZ!RR*fg{ /hCөq4h6Lo_]9`x:/.|qGDacprJRJ!fL)׮]z,Jp\YLdo|G~p4i*+d),Yy^w}C*Y1rppp.6[(#m\Mf햵`0l^$5*+vz_EU\Z[9h7e}Ͳȭ5x>HI8'R!^%x#soy+K{{Ǻ)geen2M4⸑d8-lX|>u+OILLXKΚG(j6#_I%/gXi2 p.cN$߻9BICЉb;ZC_"Kd}zʠ 1 |?/rcc"sR|7:sJ(8a"TUUYUUXg p1` 8csVZk:M VXgZs'0[nܺy5gsK`05}+xqj~ 8RyҒ *+cqdq"yx<4p$+Z/]DuSaYs_!&4gvpα(W61{ڣ֌1a`T m%ViYYhgITm,k#ځ;;IO>T۳~6 'E^,)?hUREYwؼw_4زx7/3++k,h&#h$4A;lcF hK p;lp[0 ,DmܶAD3[XPJR YU9gg>?J%%"#W{ν﬷k>muia׵i`J)EgoYʲ``<;;o~%@l'#!'+" <>yJ l{~臿}4uAW#:nܺ=gQIG(5ϳ{Q[gN>%(t:pw0Qvr!Qx3{vE۶UYgyuzJ[,M(Lf9\[9}KO}{$::El[Tͥgو-DQ4B >ӳ4m]/zыwwwR:"",#:rrݏR`#"!}ДVz02c} H `1YZZvd}}(QUNΰN!$ґ樾u0ƺ,r2u9iREqiv%rGш -j'i˿>cۺ._y(0Ϡ'o1g&`C%PѶMkMS.IS{޿׾ʪII:~YUYqV{laRB)ZZcfMd:e$I꫾C>дx_m,ݸq駝AkvN0319>] t;6⶗趘 :2nmn0ŋg\'iMk/y*(mYeT^74M1,z)RCQ ;纽"[TUid<[,ׇm㸓is~4PyB <((t:Qme b^/x䥧ϞsJIbQ7λCL8EIR)kmIƣ$t;;_SG=VTaEVXᓊOxqǥAp4=~׿_߅ai^Vޠ_~|lmTV`#B uh-8TJ{@E*DonnYGض8ϋleE]7eY/"G`v'z)3%eQTN]7ɬm:%/8>eͫz\5,G8B8GDNl[,(DdB*zVgav|% "! Jýs~y@ ` B*pv2\rXJecFc󢨫zm؏ aM36e-ȶ5hC]pe^,i탭͍sgl\[|SO]jv6[EW|K_?AfVZfvIUWީ@k_?&30<&u2? Sv0Z+Xk._~fwˤTitIAx8% IDAT|OK(Jm ﵖB)9b& 7$Bbj0J闿̰wZ,44u4!jpP̖3jtҤm ܴ̋/}[28|ց5ZVbEVX3g#nox+_o_u0RI:^<˗yV,Z^M!0+,s1ϝ֚8zNY,B$I0 1i09iM]e7u LAvw8YQJġ^UYmkkJʃڲ0,:wⅳ7nܨ,IqRV|މµ!JZgaEQX"&̽N)+gQ 28Duc75dgXkm7ͯ)le(ڦq1UYrm{ Q&vEYUUw gS te>❒;ӛÀ(:(HH GGEY9R!$&r{/>8 X $04%"dGgMuMXJ!%*@AAe_,꺩,KDFsQGA]__#g\}e?|_! +|"R+Y>D{~~ߺu0 (J:($"2M=͊\dѨ}) b$jU\UyYhl:#UUgu}In{tt!qJk96،`6^|yӕ*X,UEqdqĸ:V)ZDlΝ:(cj10Eq4eDD$[[_O]D$d@dd&^ZfD(o^GfbDSO?}Uo 5!.71e_/]Zh35L6aYֈ~ @aGZ29k <|n:=Wrsk'+._fmt| `+ʲm[ip8TR13> 'V筧 zDi@A4,.^L$yNRsuI{NR%E$ٶɲEgDԩӽ~/ϳ(tBII2u2Dk/rVRh8J@IQOFGyL[ow +|"R+֍1yϟ~۷=}-[KĉaaN<Ӯpn Ȃ@m˲`GYlolQ1c댳f:耜#nv(҈ [B?s` @ d@n]EYEq g,YM8N/~q5:I.Zm uK=Nn2l7:I$|=cӘxX˲GuqW޸zsW}m~?,nPR*!A'x⬫Jk&E <9]0u۶ B^s 9r֧H؋/ DcM4(p210U5OGdtӧO:ȳ|:z^&4DdYV,1ؑRHk]IJ??o_΋Ds VXӇZa:8fi?3[߯OL쬵-8Bv!nUUG"/{neYS7@̎RRYffgۍ0[kL&[[ۻ;[kÞij_ju4_,T*HJbEAd<8SB{ Xj-S J ԋjXL&"F0Mq|v_/7)!|dryHtf&h/Oi[~Ï?xQR騎TB&im~wk(@.}3Q N'/1}N5sLV+ ]2MYJ鉔(sh|Jgx꒔" B-9$ )q#"sڪ.=y @I>z ]TgAnoo8PHQȺBD9&9\LdeUU)%IJ18&rGh>Zk/\Jã*;p8B*q4+o:PJ9gQZN8 59C[Gz衇l̼߭ŊHg>&>r#dMWJ䨬7Zq$7wݸ&͍ͭS{e&k۪jqd [`ے5:ۉD+d'ٙg-Tiڼ%$ ðnjk9nZ1Im=0ݩSi2;cYgj[ #`<1>l1KdKWun{ݣx<糲(},B]J)).rwon݀ޡ}{,B #C%I?y _3gf>q4a_=)PJɌx<˲bss8M<{x.3gk4mN=O1U "1s? з<?w"64/۪ڪ:}ׯ^~pީΟ<<Z@)|ʼ8vʲ|GΝ={~vưġ?ƴUua`$Z,^"jmf`k DR k 9 `gg'/ eO"D-h-;GQI{Ƒ#T<+,'([dkK^^') #M| 7Mmm˲2Y5M[V`1vxvxf'V]>vOsRsΝI4"__=Ntv^Cic LgY]]il`wG`D#ڦuEQ5İ;Zib=էtt|vpakk3˲$mAYgN<>>Msᮻõ$MTR"`-Mk,9㈵^ƣh8zN"r냲,яoAB |L"~+>|xŷ+ϞU]5#'{v^^z}8ܸqI@xGϷKg0ǟu|+p>8f"m8uja[g@|*(8uׯ]mw-Nj<ӒCL6Uw}x]vu1gyyãQgϞݬRi0dh6+N(pgkk<e=\mm:!;0Q,+(J@PʲE^Z>5XHb"8$ s5UUM$ 00`5RH{M0 534imk|35^7MpggYk De;+ ej,tzx4:<}pp$yv֭ã#kӧO?.M7o }MUCqvSMwDn':>|>G?w;L]=V/=;?mЅ>?XdPC8o3r _ }Yv(epMfXkM-_nqۗ;NZDL=K^?@䄫2t$I[[[;<<ʲ*r齽S}]dguöbBIg8wX @ ǟ=5.F[[JI!ZcRc\$gP,G"MnJ)!P5 ۦiZ"%DL30zf1anxe/{mZ ZZk*ֆC縪*wU (19GDK犂@"ZšGXZy6uw+3JIm<ϥL֐c !${~]71 @dC-MDtp.U}k? '}KEy3px'j/xt>zBJyBB֛nڶm]WUU$8@ΪH:WϽǣckؐ}d_qޅXᓎ13-3 '#>c~5XcZcjIRwR lQRw?7/l8Te]7b>KٳPlQU5v֭[~|n 1񄭕B(8è3mSs~}}c1_fsٽ0X#֐#BTBu$]d,ʪXh{Q|ܴA2 bU"/8 @)`6MYi&*I_Zy^L|#J!&#ƥK0 ȩkWU4MJI)0)%99ncZӶmkZl '|qX^KB( sJp2J . B6M]:&giG;+cYwE9}0 hAu8@'My{2{Jʓ_x+PIDD!}e&ϲ[JamQ]VUGQ4uud4M&glnnF^@Jڈ2Teg T i+g8M8ڪI%Oz;2%|>"{ΜaEVL`e6_aFOwmxCyRxS+n"ʣ㣢,O>}ׅygs7v{ΩS{Rt]ﮱl-;Ҋ*SA6nll(%n?إn{?uIf"Ɠ (jB()@/իY?of(A6:k",A 08%bSb1FBuiI6 Ƙ_F@$I8Ʋ}( tֆC)_VUU RJJ ܉.HdLˢ7w?R:%!A ABc|L|h{;=Hi1֑b :b$vƶT(R*%yVq'mFaF$}39QsBNkWyU[n2Wn  NL&LJϜ>}…g)(N"%3[ʲ$N+'4(3""&I$an}m&oM>F|} VbEVXs  /C= o}ۅ{t:|*9_deߨ2_e/<"knțڭ;[ۛnH` #Y||QQAXUU''|r0mn ׆8[d%Rމa !0j&@\X[[X|eYZcmf(޼k3,Gǣx4=mfjkef%%t`EQ^i,6ƐsA+ID1 om|2R @|vZ)ݶ2cel BKfRJsΙȱe!% (q1JpZK裸R)M[MPu||\~\Q/ f^[7 -r6)@{NJAVJJdzk~7QRxhZSZaaݬ |׽;gD_<(ulV;f韾gNolX:68J298<ll Μ9szg%2kAroЭ%Dhc !xtpxp0 A?rꂨ¸+fvu]eU,;ĵRAtnXlvxtl[[[;]w=ڶͲ(NE*k[~7@tQatc;,-=ic$f_$UB²юDQ$iB Y#PJ)`XeI Iza(D]iTau{ -LZ2I1[dm8"&&X6Q Fpmmm0A =>KǓ%c%J(Q8@!l7׆E8ƣ|1[w6@A"릮,"X[V:}8/|.QOW( xCWoهy9 nYWNJH*| 1t2zc=Ɵ'ϜzuGlUeuݽn:ue֑a}M|ŋ.%B PټikgA9o;yvgc:iz̩{wc$Q(^%i8,-8RR: ( {nae)rK"R+v IDAT9 J)fhs>Oٿ]eU7&t4 ^QTWe[D* qY:x#O_z;OoQA.thǔȀ2mZ@ec?ӏ~ݽ͵͍a'R "*L:aobˢafT#iXvqAoܼvZ~w|<ʲ%Wqh0TR:gԖND\'71#,*H @K;} 8&C$Ƙ,\AӶQI)sXbBJ,1|vyGDS(PJj|@E`6 H)4 C"~ڂБ `!X"L": idOٹN 82y喔)*ϋQJDeƺ(NU}||=ufͿկzoR!zmбsw^+Rg-VDj>''Y~yMm׮5}{ʵ:,cn~ٗ}yۇMKEm tcir\fe~{_=-)?,'QJT(%@ D(P j̓t_Gq'6׶=hƁa$"Gy9[RN'tR%Eݘ,kkQ-&ičiLgK8ibnE`D;m<لt@~L 3zoY*025|8M}"ú,C!BJύB)ecZk|Yb&&` "_뫵VJH!֘mM:g˲y^,dsMԲFA/TȳhTZFZ8 |J^Ѩi"VJ@pDaIeUUeZ+G4M^~ô'ur XKe]+|N23E1ӿ<~|i-t2͚FHK|_?yMd0lT˫7n _{ϩgΜ˟z@4AD)RB,Q XA(g\$i Ic[*[s>A fsm LMkVx<ƬLZ 眴Q E]7霙 )y;;"ƍwfe"%دQ:g,*t"֗&a,누h }I"F-Nj(Yo_$cirngg' @Ƙ,ˢm$777v6M@P6ܒ@"P&amHTNU@kmOƋŢ, ݕ:"ru$I}JVJID4??~?M:7,y+iƊH}Wk*5E)R~H{Owunidr؇?{j^gܸtt]j@"yz{.˿8 t,X׶'3&B Rj@ !#Zg 3CQ2mӉC1 uZIkδB!d w0Mb4ð*1wB\Y")RB}O'ul!"VJ;L4+Z+f"ޞXeAH!0__xDRk!ig_џ Z1>XCjWsL0D~W mۇG}эS[N癫7Yۊ>Rkr֒+hӗ=w/zzׄɫk(NB[b2Դ$55{|Y !7 !N\X6i(%Yoyc?96PBHJ tYdrr'ĝ6@ @H=kgP_e5!1dmXk,#VJaq/{ʹA~'[k;ל5@VXs+"yhDo( ~7O=o/ʒ8vミ㙎(Itãu:bJ#jgђ,f7gPu)3\YGKJaQ0gӉswH^BD)EqƐ@k\YqEa$Їus綷68QJI)DRZWU۶Bʓ<"JJ?s cK:Dֱu7iƴ'v$95C:* dE( P . V(F|oAD/͋2ϋ,ϋ(Y#tFyYUukFY ):BHanDɒc& A)鯧oz񌊈"cRUU !> Q, HkE{~?cL쳫y+<Ŀo3}+|qgw3|_x;~ws?_,τRNDQ&xG>xaYQ P(&4dHD2 u4ZF!vA3gE]5Ǔ9 j7@ DKDbn7NQqWUs(p'L,t{ܶ-9R@BZVpkڪnʺ)%:&r}-.8㠐6Nk J4I%@JtL?)FVRi^s4dsM۶MEyeUUuU7RJA BsVUc|z^6Gi D FA)%,!2f"g,J!PJDmHI%rn^@uv@sN'~O[~>Pg{D +|bE>/{k>G'JR`6#ٷoy~5y/hB!@Z//tQAWy9].WfVVuWwխ[6z<?0fm} bk a :"Dg ~? >'V(aD#,vni|LtA ޷yE1Lg(뺩lRZGJDⅪ({iiBV($,0Fn)EDBym@>^Il6$ZkD#14W~o~ .OOvtp71v<3vB!@T PC<*&ip69磵…-c͛oZ4][[SJi6d6[zW˱b,u7 ][ƧIvziv:Ţe:CXB!BPZ_"Qkm1VG;@m[J.-hZg|,IBOEQTe]MUM8Ϟ[~K{ AA##`` @QԜ0l{=k-%s;zFɱ1hA\tRd-Lc!2KCl(΅ټcS} e(˲*RQ*T9`b|QTHD( H+HZ^7f8<CoO=\D8ZZCg3x> !_\Vt|.c=ZyEr$e0mo{wԋ^bPʻVBgɅa/ON+|6/"ztʲh>8(L v@  8#;' Bh5̞Ai<<1Y6IRm") @PZ2AT@*7 xiiz~z·ж9: }>"sfV~󌐢2gCFi%"|D!TL:P&2gmP7X \jD}d2aEcهG"@f!@Y8szqmݹtzy,ϳ4MZӶM&u]?w$fÙ(/߅x#Ǐ"/q*P>Ѓmm׏nTݴբY(^2ؙWNǓx6[,s[nڦm[CÅE|ïc.ݶETJ&E$I&[yѭ͓ΥA34\p·<{PZWR􎽗|1Oʲa!xΊtgp21;NDD+"L\QG󡒈U}t2֦Yfe)^\!*BEX L{6.i<\7Kuoat666Ϫ8δ)Y GaUZYwMU qӊF᰾~…d͛mmmu iz~kkk~{_W>*C @133tt 1ωo|7o[K.:8Lg>0)LbӬ!غmjLP,"̚T&JkfI^gy̼ʗ=O_O:׊_nHD$Fk*mWzꉲ,XiӛO}w6V.l4ʣEQ.x27&\][L'mc3Ӧ؟h8#%"[[)E@9VD~R|8AYe/ϪqP bPphk<ךbp"ju]E,Y QYk4?{=.Mj:J97 vww/_(fm<ϲ97FY} }O'::^(QX_'~ʿ}Vm6M[J[aVڬVWGGǣطBئ!"E(o=>8QHdVַFO]-Z cۖI_;Mťj;SJյΦλEDG U<1sExM+%9DTJ%jMF+p`QHiy ,O068}%7ѴcvuI,5VL-eT{DfaD X[VBZ+1*^/i^Wn-6~/yKIYMB`"dY5LNG#BH(Vɍ/^GR+w^$M e VW̒e9"mlnݼ?H IDAT_[*Ri$I"e:(@ܔ)' P+¬uLJ?;XmgEhsV˰(avm~Ř fTxv]1Yr:gD@*~Vei˳~/7Zx/9\\{y^,EY6M3Lڶ'4Z~m"`4GDfEQU^+e6I,6I$ZEX,~ ʰgIݴ IDQ;Z[ʺ@bMI^{q*EQE9NOO|2OFfխ]k;xz| 4-]̿ϾzW?Om])ʚ16VWuZ]ԛLʢPJ~vaĚxg>CCD^m2ŋڧ~Zk2rpX Afi%P88B؟ZTMSM:8#bK_ry֣"!3.!!G@D8x`1fnjmY5{mۖEzѨֺii1' ~?LiuuwUYMe02e]G몊{/xHuTG =sqpozE[[$LιX2[42Lk˪(@ZAX+ ܣ>Vw޶~yw@lix:Hz?fw\i7̶+ 7~j2K_vO_4]RZ+Pu`~kX C^#sܻ u3ʠS(iMFVD(MH@DZϹ 1=z0eZ!L|xV1sQE!%,mTe"JjIe0F}Of=|>g$Ii֦I2{ "~oZǵc4Z5}^/XL#'xmc+K'TG ?txLt޽%_%E1B̢Bp8HD))iZM`n[WӦ=xZnh<({;ο;vkv1/vϿEQ|e㤬 8ؿUU&1ZIb]Of4I4m}:ضDz6[h]{N'']ڻm<%),1(xHi,=\" aƯ)3c{oWd>g3~VW%I/4' #Bp>aÙ=ΊZp׏`uu5 )"JeyX"bfжd2ym[p/"x)XTѶ} ??U_UkkkIbONNgyUפZe6Yiȣ;;;>EQMB˗v^/Imf F=@H`]TE=ͦE p|:+[Wb^~/]|G@ "Z]YQWLӺsy|DuAEbQ@\ih|xpxxxx]w\)[v!0Xvh41J'XmpŒ* ag΅A`Q*Ƞ֤EO}}|be%O<%"XWB,(X&CJ1KӴ+<[׶9x!<[yG|;nOW|;Zcsk9RCk@ںbE$DLt:lo_Z^f4!L B<|桫O]K'ӲYF}fp4R״1=H\3mb |~zߣ~zVV~gxa ๪ EH}k|W|ŝwyڵlv^`{}ćpǕ+h4*"Mx\ΚT@x4Y[[X[Ttk}ZkRv9xK.էFD4&MS0w,c{> "BgO=EzkkEt)j\#"罈zAOm`ZA1Z+w&(b`ŵk7nܸ1͢6U7ZkImmm x0P) $FEļa뚙d淾 JksbRGR$b//3@F|__TM}X43{W]_=Wx葇ǸW\ZI6&o=QȻJ$V}X"g1 q5/t?x4R+JӌZJ$Ib2TU4m",0CLQN$7$BYXXm[nAĪڶ|!)Y8@{i25@tVb ?G`m]Y׮]sic<!H4-c`Z˓L˃DbQ9bC۶UUȏ>"쌨s,8>K':::Hgk:׊{}C_;zѵkOe}Gw/gYz]~{{{^W}W}cOs]M{}5E9LTgE|dtzr̅;BQ<آ(@$L EBR(6IlDm/Ń$8mX+Q(|Bgł7,XV*x'uUr67k.gj,!1 MEaɲl>epVkM8"e8q7UՌdbYYYfI~G s'TGǒNHuttx7N !_}}o#RٽxmE6~__pW|k_{N&mۃ sJeBa4:Y̛puD&sfKM1K -e=ͧd29==6V7745Xs8#E$ΜF>Ţp(󃃃[[Es?%RLD6mk-o?7oꩫD&RG+k~k.Fkt\W/{n:|^VkO4bّRV+@v%Z҉RY[lQVŽ?"ҶΌg;5eYmKdcciׯ?~y43TTGGGRCںS_[@{7x>OW_88<OEQl17=/y+^:8&ࡧ]۽}awbYt>/ln t:gSO>46qk6ڦEmnM&mmlbZ-0v B¾mjpwwݼy+^ZBΦ٬*T]u]gy !m,[_[MY[[e,fpnu|"E7nܸysi[k{օ!),BUy\۶٬,t:%Ucd2I<ϦbH!t)tBy }:^prGw/s˗OOǀxr2O_?>=nn.s>S"ࠪj@T;[k"@m1ׯO{Dolyni`ݽ˃㣣_w4#)QRmӴMR'NJhu Hney^rK?7,U鸘ϵMSefEQXA$xoβlue ޲->VZ!aYV":X,sn`0̆;sUYEwJh$"~{_5"흜uIQKD/䋩+:!<䑇B߄,޹}_/*}.G IE$0nۦnA"BZ][罦A6ֳՕEqp4k_(Ţ.IdYV岪" <8*"Et/I+tRM b>$AĶi)|mm9bfFg3V*NƳ7o^vm2iz޽ H9?NYijqιmTU6YbJ3u@kRJsqR7ݸq#jة*:!<]wt/ xo~7ſ?;1.,e7nO5u]~b&EQy}WnOc׶~}}gl^NgdVTU;_d4MJ$IRD(r{{$Ju]:FĚ4IP8pZn߯qz:T"b(fbH*]׻rY,IeA,HPQq8X7x29:>VZ#.;4ebe4@QeY":&H!cѲiv<p8\YYAĢ()ED~0]z(RO;xG5̾-/ o3ßuҶ٢X̋T[[ű,|>:===9._N(0OǓd2b2R{'gu Dcbm&Ƙ4&ZkhgY~K|0lnd$HeYfmqqo4=>> ++( 憟"Teysh1H拀smB"hJi ཯)tmm-2$S"kMe֚M sfgO>}??ϙGR;"A}ۿ[~GoՕA&ZE.R4͚~s};P$uONNڪy駟f/S+WVkCk,UdA$dzmҩŶmE4mYŢholollyh,RZi766,Ur0lm)E/K_FD(M %qŚb$ͮ~KڶFh4{A@Xm4^˅E)I$P`bTMh4*r(bg ^o'Ec !W{d$ DĵNÏ~w?(! M`$O-)]U(({S6fkkriu=XEk[ Odz7n>~c?Iӭ˻[TDh"t@2,x 1%0+%N$Iz6J)ղ*V>p`!$ (ơV90siZTa6c㉵vt:>9>V#u]wR-c~?Þ%Bc4wOx(@HkC`"ey/ϥ3VeX8|"H$OI*ns@ll1PVb90 !ZcHZ 5vcm)[&EDHzFòll6gZ,"'>7鍧s6A|gˬNrutAtB m@bٷ/W~W޸qÚ5ME(,ʦiVW6,[_]5FWuVT$f'x!={ҥ7n"Z][{Ib!?/#t"|:9A0P"je$Xx:m+BpދʲfJ)TX@4z' !nacRiփ6Yse ! R4̍6+k+ J^X94!@]7EQe4^)^/ɟo~m[",SR"1bX_~[:!ycYv-|_^Ea>Uei4sc 37M㽷I2NOOO}ݝ/z+7/ly\qu+[̾bJJvb "*mTYEQ9+alIi@lCDD1z0*|~UI|,rttr捋^|yܸqVV7״^FYf1 ,uf[ɴuNzkPQ4Mنʲ(2z0' 98{sw}w~#y1ϳ,OJy/ͳ9 :CTGGDS%_̧?Co߿MYkovO&Ӳ**g IDATxO}Zk4il# ib׮ 1b/1 `q||INQk-\xc$ kmNNnZ#x<ˉp2~1J/]Pz(VZ,)qyιֵ2ƒ"DA<:9-&O]Nn& $I4M$M":9=E1H׮];8FaX,3lhgn Բ1F$|7w|r-/N,6MUV,ˈT$PiSUwnQ1>]E4I{zƎ03 8B cY50#R`I)#އ0Lnyם[[[k3ǽ`?88L&4r2Z+kMgDgfEd$*"}Uւm>/zSMݺmƇZ$޻m1suUI2 fY/=qR>Iz v|:!yC##BчN<7 __7d:!i&"ɤ^oemU|o6P7Nm[fag  u|@$xFJlfg*>3f3|qfÛHQH`g͛M IUtV5" RRg{<nIJәs>47m6m&&UJq0c=S?|?ĘrC:!F,p@@aXLϼ^DVVVVWךʹ;NgUUE\`h ! BZY$E I K "ˈ'U )!vrr/_^[[9<<<ϓ$MF$qm[=xI9Єc )D\JNPΒ\LF,776Ek[X[__Ȓ>#?CO=ufQ'QQq^ͥ:: tB?DD$.YW2eC|_;ʲbXhIa(bʭ[qC(RFkm&Hss/c"iA>Z@gDm4DpO'|5_ܗ"sijHӔHUUu~cp'm>JQ@"fQ)c R*tig BO37}׋{qS'>'?yI'::: < 'G};89yVU8 w4{~]קxꜷV6Q!)R XDhjۖCXY]E!8xm{fs"aںnP)=h?E3E0!XFX¨(MFyw=\H &@D2>g~\M)("0 l흺ngh<*  BqU9Ís'l,yـdIKA0 I#>ǟ(AJ *d Vv'0f{hel*9NH9-nn3Tyoy˱qٳK--L2WPjm8irVlj }X$jeڵjU }j&xc 1b1 Z[.˕$}ϟ8Pj$I86A`AӦYk֯[f@Oc5̶&1|.1]H RRaX,syD{=$QZ+_pQ_.ᄔR`>Fب^7zB>Cc!QJ)(=?Zerj^'IZV,cEZOTsH)j5DGexbID &F^תQ%IkJbX(j5:Z-NUZR$DjzY}$0sB~ԩ֚~"dkZ?JcfFiSjrZ8!p8BD 0 g>/n*I2腉ҽ}>cb%Huwu=F%hm 4Di$Ip-3AyZjYreS&OFl]zU\F$)ef&L|?j螞nDBhZI݅*'Hii=!Aٲe`DBW\ID~wO򓾾>&^x,PǫRc 2c*0, [`sG>xo{qo=}DērڔIƂFkc, )&J$I&io- AZcI8ף(5¦Ug& ReKjֵkפj3<$J$/.YٜJœ $&BPZi""!74 r4i1& K%e߿/ƒ zñ℔R``B B@&M}n]w}֔Ӎ1z•|~{|8.rq[ȱf=K^'qyRQ)J֘46 ٌB|>~ZFJQ,1Igժ|aԩ"A J%)ETD4s.?!{fiBI_,t-W? 0l숲?Rcˁ |k5ƘUVysY{Z~63*-ϫ֪zNh٦%H^'Onߘiz88xJi=k|.l1(a8VPR,'H2o^HBF2cܞ;)Zk`"BBZmUViu\o~VheR[QkRcZ5 *T4WWʾuS⨖sLEqGZ-2z̔Z5*Q ND'M!VZ+cL>OeRZ!e=~5Q*=ߓLЌe"~!okkjc,)2=Ky '|rGI~+W}ࡇ;Cñ%؂`kЬϒ$0?'>yYXuNBk I*YkR{S3J)n>*Q*1Ƅaf'tL3LZf6hNG ̈l0 2\!닢$M!jZ&) B|>/**IJ8Nhn__'O!倲t8[NH9-arh5l u >3O=yg" 1*AXOf`ӄ R*1FQI0 }SXq/RZfk:HH #2j"J@ "߭X,Yf$$+ծ0 Zї^gg ,^0L39APպ;׬ERrUk5VkRoŊ|z=?'R}?j*4r>l u8NH9-#KK^wwyWzG-(j5c,6hZ)RzbQUT0 EBrYJ!0JEFDZ=:,T*4­0Tx yD\UW]iUfNoeMxqBp>ZCGF;=Bj rL&8j /!=tZ8Iz5uZ@$!IsM )ekԍG =T*QG?tZ[]:'kMTH/?M7W)W0li)MZTja&f˗kcI} H+i lPU !-dJ]U `֗]v饗^+jvpwᄔx@hs==#sݮo͚AAGG{KKi}gW$ZkZk-1v nIB=OfZ*M7dZ+ NH9#w!bR0^{}{O 6ygp?jŗ\rAƛz{S'O6ˆa{B2!"4F5TK9i~v(du^xwqR1 c\gr8[#"B|w|q}=$-^fZ!@d dQ-żRIZ?v7Xjaӥ8|cEG RKpl8*a֦!JF%Z%ګu?z+Yj59O AL{ޖe k]sa72[k40f0ޠrs8p)ñZaʕ:LT*R^W*QJ1y|nΜوT.Պ2ԧnF4AkHjr(cYVJzвFW3gLkkkb*CGꃑݎқl a:f`chI#ˍ2C/F>NSX6r0.6rXU}5?#&qxċ荡/Ja#yd r*xpBʱR)qFΡF^F<0Ʃ`%N69򱚍M5 Sf{@casalQ8ְG=6h&p8^ NH967~QorA*;b)3.qyKF&:fgs6#؈"da:⡏i*jk'(p86RR ?mt l\p[xpDv#iy 8bCx)wyTPԌg+ )bp(>ǿhU]=RƊNîSݵi(Wkc2Lqs$ij$= em#7^^=eP R8p8!M ͵ugiczzFڕ4op(PxOyMcdkClpHݦإW`  IDAT.1T;͆RېG,T=Mx/SQǫR?ˆze  BrS)`7U! d$ J%T*, ;sSJa6atSK ]@ `w:6c qKOpC7![q8 L"@"dkqRӇ8xƧH '7' xC5 X (?ӗ4JaS7,:W'(nPiBD"`k'#1HH,#rc'A'`!`c$@Tcqj6u k(@fc8RvC"@/D fn2kg@l 6!?d8`< mHyq=9Q"R]sl6bD"$18!Wņ46<s B㹎<#nc~-У9xqBGr a]& Ϳ@DVbbF`>PvfV`QDXwLl""ZO N`1I k̔ &xB`6RSSX4qSPgMA5^̉Yi&4 P߲EsAYf#-~DŽfP ) Ȗ j֓D bUGZ)d}m@ ȀI2O H" CFTF!щ឴)(e ѪZ̞œ+$'| 3(<CRԉA4! * D HhI'AIhX".(hP1(jB!)&!c% 0 'HLG )}Fl%h-XÖ"€0XǖE411< !5@Y3n+1X}ϯ+zW<Z H7NH9^ l V)ȐXq :HT LH:_B0ej[UUzU5.0^ڢb/;B`$ YI8>5,vDׅ8[c$1&cۋ Zj č`"`m9Sic9> KQ>qƆ c^KTjfF{?>=]œhatڭ/1+cL%c3=VzD+))MEL{ˢAV6o5Սthyi*_"+b 5 Z@ ILGbJ@5 sT4Ҡ5DԈ]J_ZO}K9HW˯qm”l!L UjydL\Z_KKb U%gBg+Qқ0IU>r1zFUmX_Pk{;bKUkKRF@ W231_S6`ME35 b , k,FlZQl_ᄔcMHz+U??W ;uo~h9;TS9]Ij 2Kn\__G;/c{WԻbC5wС;#qJOe!Y2pȹ9?!H( Ƃ%d`i}7OR "Ou]?#~te+̙?MDHy)EE_ո jukeI+ |eE { Z |s'Θ-~UrRl_0u)gqځ8ww?xAyς_=+'^?tC\L+mmz[w7>в\a9'pi&elD" P+'5;?N۾UϬ/nwOtB#x38gq}+e]Ktsv6ow~׾|e"l3iډ:舏3y%nCK/7ʂ\~7vO/9w'"X/>kV"@`Ɓ]h,#75cɚ ls'!S@l-k94*@a?nY[{U]_vWyswpU' lӿ->vZvhP,d &E ?eUϗΒ=V'oZt vk)axϞ]|'@|G_O'q}I96u`-XF HȀxte7sE3L葏 v3}ǟ';Y$%) 6gւ,'}8Z B7~{ߊ` \ko'!ϔ&zaK_CSfew:pGJY8ef)o=w\t=3l W|vt ŊuiU- 2$bnl4`-"LToV2U`K?r͓E'5kzUO ~ W?*^=O_Y/oߟ;/N[3;/zoݘ>)O>ۿOmL_>7O^'*-gPp֮j/ "* 4֎ #|]2$H}H.8ʲZM#GR9͂R?HR'_/=>y WOfʶ}7o^|!/{qh EPkޕ_ 5>o'\UVW\Og[oK?9( Bī^+$;勜H.(Al-ku쾇e(L?t[1;T_n8]%3ɡgC2) uBXz%v\~/Y'\zG~^>MKiY"n` [K1@Tj ;.;Yy?~w>y̞zW"ji֯0EIh@>D Gk;+A@ z b`:^ٿ-ە08IG_sL ͝?i, }Y?ɓSBIm eOr'!A#(A!-r$ `ш gT`nA3o3ھ46e*bl#'xg/x߾e=W:CU/S;Cu᥮ZJFJ*JsX;m"i*{[.U֚_|Go|Szd|Wq/-4=% ˟.Oj 1e(S">g1& -};s:DKrU˫wX4ŵ/*U3Ndz;{͚Ɖ*~/c&̀*Xet(|HkxB0*0]娰 WL%> -^k*kDbK9Gz_rߋۂ='{ﳕy03xJ_Sgx}\=-E'>IHD@1k6 Da <@fPHsKo_4mT̀ $5CT )D=< ZYk++ʹ9:&z^zRUU4wǽo?ˍT?q⒵ԵSKSN>p*NT[Vwd X8c0AB}uk䂲2__>I X(e[ Dg>C>= "H D]pއm/22;uR,Ĵ9}k}hWoԝTn$X fFJgڎu YϚ;{@^x0yvkJvժ_|矮}=]5@GwD5ckzf *IΘ߲J%nA?[n l s5mT3kvN1l,0  X4ΟjOef$y)M.2%+ş.9}uJE+4Еں 3~8L1>zמݧUFaUUD9a`"L.AVBYD L(Wl g!L0X -HԴS!؅{f )hDGNƹ-ٕOKM7>$Ɛiۿp֥}hfqc/=`Bs^?gnϏi5ޙ%W_my`:]zF3s~Gkv =m$Ք(B J:q[R)zȎtر; 0e嚥e,*A0ZHqW_'a56b_ϼ+Z,\}) F&AZT^:p,1S&X2ܞ=c?n{ms^/|mMTq_9rXF/LE!3K\Z5YԞȌ {oy_e]?k y^~ӫ}+[uI .ϩu6䂅uMrޡ]~"Q/ޡo:b]?~⮫+myi;ڪ3,07omL3/.yp.oqr5,o56͌棍@dlTdln(*p\8! @Dd΄bwѡW\z%b\ovGH$.j,Gt=vϿ"VNq@"cỸ+s &ۿu|]2Hʚڌ/6w~.g?ӊ2/"203JjȀh]j  j4Oß?@ ?vϣ'u"mj9LcB(.9}烦A;UVQ+wŏP5Ϯ;j E%ɠfR̿=^SE#0cǎ~Lb }խ䋙>xo_⬽O>2kһ~oɡdN>{:"f4RHւf$M '}@ mG/=g_>xSD+Z'cϊvգ=[OUwq򹇴> #M&M?2,O[<Ǯݿ;d TKLu^Q{//K|+!DX/wz/{@0M E_RCܔJܴE (tKpjᄔ"25|n;3;V/bVj¶ 4i]Jڋ#svo'&)lLշQk3 LEIȃNk]w k5j1ы{ӣwZ҇^rŜ&y8k{zz) kQbxk6DU=FB2Kx , 2& uf!C\EJix{[>@@hmy?V IDAT'b1lUB/ŅχOiC=_(JqVG.>W*!͚~eE$CDŽfFŐ}ô} -Kgce6{-޾8q#8{i:*e3O1o8MO>ٿ~UWԩ,8oMH $`A#c>kJ}%M.E]+_xn6ՙΜ F9C8\(P8f4fq!-p/LY(AИ '#EJҺ %yLjA3`X\9 Әv#V:Υ!W̴$8"A$/%ܑDj!Ps#GOVu9M  9@tHtbӀ&(R HN4@t  T"BhXN 9PQMF(ẖJȽxR?Sa(OM (F2MFtnB*R(2>tb^P N5ʁB .. .T|! B!):P,@q%ZDd<$ܰ€!H D"8p(':77\p )B *8@ *4@\0 \0Jp\ҍ#r $ "r.H $i08$ p.e $D5:! @Awq g… A@!8@ ^Fh@(P "N8  R$~@Au.Kn.F> n'(@" D.$ECp݅@4`NA @ aJ8a@N  R'pp".VD)o3;fH  @ 2'p.yeK)eH)}#ӵsQVX0GZF\N 8iB Eb`q!)" @ԈNR Baz\DV;G;"5q\ \QjS\:5hORA rBpDAQQMCV!AaDŽeCp:ccp"AFSjBX@'G'BK  . N0j 5B8!))p3q0h сht$P .Ƒ B@CNS  ܅"!C4n8nÉNt@.UP+2J0R G"]G!@00LfaQD`>J F8#\ J+ Cb@(!i%@@]!QhZOe%OНJ排c8P^sӝD„jO4(CJQtj߹E]U-Bq%P(!ddT BP\&hU P( Bq )BP( DR BP(2 BP(.eH) BP\ j֞r nFP(r(i򻖀2O#|3'ӳӫZBP\5k׈E UaGRJrgq Z&T8 B(Τ;n ^-]U-2璛7HhZYUˢP(%2<*$(t5j+C8*\Q켬U-BP(*ur3UT(CJQBQҡ:PT} Bu쥡|e~.]w޹l”ӧoݺP(+2w}wpرw}rU/¡CZ BQǥ )ECT[l[bbblڰaCͭVk-6nsM׮]S6mڴ֭[|077wȐ!aaaaaaÆ 9Ӎ5}_yBHNNx9R'Ǐō;ֻ D9sԪUfk믿6wiŋ7oo)jS*ڵn^3kܸq=N8῁2d6=ƍiʕ+۴f&v=''3u߿T ťC 핆2X1k֬Zjuȑ#ȏ:tVjmӦYlYBBBHHi_hѣ>cٺtra*7oNJJluԙ1c\?QFvb!YYY {7J{Ν;gϞO<СCkΜ95jXxqnݖ.][2eɓ'׭[s{wɟ}?ܱcǠ 8v؊+^}~ 0`̙|ɓ'MM0CC5O9 yyy 6|ꩧ >>޼S-JLL4iPJ,X裏vu֬Y駟ʼ# %B 핆2%EW?Ӈ|Ϯ^zݺu<={^zÆ ?\`ҥKQFcwݽ{իW5^3ǰo^v?|u}衇RRR^zmذ^[dI lb1Mkc]vu]ֹLkɒ%k׮m77ҥKSRRVXQZ9sH@hz聈;v_{Ti0<8$;wg.!=##.mtJ̙3#--T/B͚5 'NDW_}ջŽ;֬Ygz\|'2Bq&*alƜ9sƌ3}t޽K<QQQ  ֭$$$|ݻwݻ79rdڴiI&/_ҳgOBȄ F]fM_~׮]}111k׮2d?} 6yгgϹs疳ׯ裏HӧO.#P͛7׫Wo̘1Q(Fgp߾}g9Wdggˁ`*<.]| hڴirrrnn4p̘1}bbb߾}>#|w@^xᅩSV^J;w\jղe}l{Ν !/ԩS)ǎLʪS ֨QYf`Z,YSO-\p֭z{c>N4W^AquݿT ťûcWxS!թ})iUATGD0 r\a8Nt:N|K|QMSY&55Ug7AAAgΜ֭t:333CCC֭ۘ1cv) )H$w^(SY桇z뭷\SE߾S9rĈ7K.5#.6_G5kF) r87Ӧ9r_~uݺuG*w}w}0]wU̥Qbۛ5khѢg}v֬Y Ҟ Gy饗7|кucΞ=%&شiS׌ѣG{[n},K/G*ҡfQ!u&#rʡB!%BRp.ô5Uz{T&cG7ߌ;pC=Tb5jܖ.W~RS0V?/\pРAfa5Q$HIIQccc+y*HMMU<,䓏>HMm۶}7eŊիW%۷w8f͚1cipGD 핆ST>ܸq_z!G*N6mdn*͛cZ_48{0`(رM 4rmٲЇ&MyyygϞ S_|1dذa!o9xy[o/?رclc\@%>`hh? 7vmNZ7tSmkڴ:rX, mu=66v۶m-2eJWvιv]~5kw}?S~Ysս{3z:" !ʔJr>juŢjQu]4MtMg4QFe]E~W eH)&+7+33rҠr^jΜ9sȑVUSiݺ5k> p 1s̤4СCSN}k׮琛n6lةSZjUZ7ӦMk޼ybbo&KnѣG/_^+((x'CBB5kf·*֭2eJ^"##G5cƌ2Zl̙3ΝֶmFߧz;.]:pO?t+WlԨњ5kO~k֬4iRbbb-ZԧO{gæo߾/{Z,i\0/_w1rHo꫔I&լY',&m۶͙3b >_/ !d<̈#EPY?m0`@ZZZ6m,Yb>8so}ڪU'%%Qt"]:u߿Qw'Dvv_|1k,QNÇ+.(Zk4HjW 5$  cr3+ڲi=Veq`߁:7ԭQ#F7kvm:m;ow|צmܤ6k`ћojC- )ED_ ) f9r5kƸP(*vsJ ðYZ0o|k'wmצ۝ݾX}ź/uŦu6QT8"?!ivkа ̼S( HFN񔣑aќ !dY2v'Rc NA9s/j )?!D"XanNn@`豣̉,-@.sa7n$L)k]n4pwҬe)&5~ ۴M+CJ|.D!@,G ].^U Bq(2潜天Y,m?9B"7BP(aΜM9~عsg[u㯃UÜ 4\H  I& IDATA(@h u 4ah\csf+P9%Þ6a܂24Mc )E!xǔBP(s"£ΧժQ1S1\t皦k knc1mXmr#ߑ>'ӳ_irE50 HeH)b` ! S(2V=$$EViF hsxCzEV׳Xt]cisg@k:sf[&5~9u:T\I9h ,PR Ѐ2)@@BP(=~۷3+;a8JEFD5k[ 7%ݢkie0 N?|ȿ[`܂Դf /MS.1t굒SOyGĤg.E!=R(@ZS B^YmR]EӘjjڼL(!PBh@#"@{!8!DffEG_vQ 0x)yH)|1'Y|26Jř+ uNӸLYm2Ji7wp!@R @ۻ!}랝@(@ \PdU=MX rVp"x>$>r*CJQL=E~sR BQ0Ƙ'f@^EWC{!25u|?}4 "Ad@,\KJ(;~P0 eH)Jǜg 6W( EhF)!ԝ>?]tr"C2DQbD?/ts艎R B(MFP a;C$^իWשSVZ˖-+r3gΌW^zRRRJ,T GOUD@HО8ɝH~w)U B5R%"BE A@QOO~~SO=_kֱc^z\vvܹs?2wl9HBЬ] )E *JfVGr.0ܐs!8;w}Z(=r|g&"ol.7B䅎4%S6lW#&Cp82v'֌<뮅c$ZDh;^YDk 9C4a)Shʬ6k-~?Gu.:w=j"^xnW;n imi<c+ʉp$l֨'׸1([j //nժU-.Xz2v 5.ð[9>{… k׎7nϞ=7n3f ̝;SN5HG/1_MfF(e琍 AI=O֭[4im۶ݴiS޽v%z?."ޣ|#EN# A&ES?Ȍs%EHR3p&woc|Qa) eьo͉ujfu]/M01"74]4Mm4)d3CYpED\LQ czyMaʣ^cx꼫4f:#y\-#*jY)-6{'N'랻j&$]f9Q~soKhY큇T-VmM׬jX-V ƍ cT-rC+2h:i5"ÜiDO> R:nj">LHMaʣ^hq*u4E>Oxצ ޤfXl\.-GZ?:OUups.}X7RWeP(1}0t[tbgk׮ٳg1cd믿~СW_}I&O>$"ٳgܹs H HES5]Xt-)_kڴC!E4Ji||ؽ{7c̻u>V!DZNiSJI{ L@O")F" !lޱc܍7&… qƍۿttt:2hqCJ )`ZTr*#YИ'JPcgB@mȶm## cbYycEo`ynw@Fh'V]\aʯ^` ck@Hoa Vb2F˩rL+qW'Ц\%BDh&\DvmjoO?-~-Z&''W^m۶ONNH6 Iq?rt]]\x޽G9r裏~6m͛[nߐSqsg1fw>NJ#R RJ9q=JVl^@UǥKw["q-[ܳgVRpd,Y:-c(CJQ!=94nB!@)p.a2TZO0>!*דz^ i1#!B+Kk WY@ v++ʉ8N3;;;"""99u=---222%%ĉusxiX ҏEht?? _tN󟔔؟9e?IQ9m)]S\'KH D[o!Drrrڵ=zoxIJ!wz,|0\G*;/b)q4`# !n$P@) ƈFK%/?b`4vizd{%ȠP 掑25Mo_Թs&OSOթS'##;w\PPА!C֭{" ڳYl2j,2Fj5jɈOcK/E)-:wryrC !ތc|l>nݺ !Ν^.333##Cn#999,,_Wٳg}JTZayYO2uM9Q5!D^,+7ԪwQQlȒ#"pND "PDBlei3ef]nvڧNXd=R5,a^ 2(s"j\Әn5Ytߐ._ܻ$::>HBgb:j#,Nj-YDsv^׮] ^4R2jJ7,^ SOW$APRjfx))w^Kʄ&P_ɦ_Cft3AVV!9W;s!% 7A.O (*0Dc\6(,*2H&݇vۈQ**RM7۶sKtaf|*ݓN)p;ei4AnQHJnИB}eL]5nPr{%Ƞ>w9\i4m',]ӘR<;z )3.*&>?։[3zCUE:*7i07 & R (r:0]SUHB(Yp6-- r 6`u]&9XtM佻D AUN6M((*ќB@ӊ"! H)㜛$J >N EEGߒxہ#v2\Iqma8 ݟQ(ȞBG"Q A)oOrBH>tLa8텡 )Ņs o|&H)p84FX f9 .lVk&;}l5oltC"c^ur Hl.W_EH([ DOI (<}+t e0)z^(SSRT/ʗ )!}p߼Z^4q_{I /6!+4^4 W"#@k7㤲xQcR)D)D)" ҨVʐR(*@n)6p L_RCoL%n`,q^?99#Gz i D mc"/+wӈR]I#gJ!>J!ʐR(*^қ7o<~ ܜC?;n9o?_bǎ왯^f+ֽ}<-##~WQB3Dg}_Nn74k o```vAINy$ź ￷d岂aۀpo-Z;6gggwp+8NX||W.-rD,20fԸM hR^\'y!ZAꎄC[-|WuBHfL ۻgߌ?1do/X`v`zώmZ+-6Uw8eB[n&@:|ϧO\  d/](/٬@#;׸,(CJDv0t|{ooܷoU+>Z՚Ç>ۿ4-+3/vvy.M{sf8yoM: ub?Y:**24,4**>0oXʬ=g߯+ } 눋s O }t7?o aA!!\8zh綀wcGkԶo|-o. RߞrRl=&/R!@R gF?]_0}cɓ'N}?뛝<33~Ǎ~1FldWBnl?l߱[j9jH8to_m陯ZO<3G `ћ^2|_{mRی麮m9ƂoU7kd* sÏ?t8 6}!OxlK8h c'8O6iıGyACV{jSpsێKW,ߠ~y~QBQ1|zI@R֛ ᄋgZ5 _nCZj^-i׾mFFFPH>@C)FKx||i6Diannu>OջW``OJn/(uvM>8 IDATǏծSk̈́onֽ7m̹Q ]PңQ9w@NvK3fW> Z: - ꇀ [|3AKh{2M6ŝar h q/ ںyۗyQb(9weff۳/--mĨ }s878/z.!3F|wsgQ2gԸmDXxpXxpvv;ocpزi#GϜI8x@&.. Shw1yfJWjJ%8"p֥KQm #1m7o?_\8p <3#sW[7)O{JPHq>[Dž;{ˏ=z<"ٳ4j9%+:u/n1"D[=.ɾ[4p($/7۶76jx̹s9wݹew=iqK' &.} TT!eOl~^ (CJEBz6ئ]bHXz-CD90An2w~2f[~ݺMjQղٹ*WlFDGg' [vja}}_>y{~C9ۿ>>H Y÷;]?[ #//Ef7uj?m׬ =b')wmIXSRRH(3Opgɨ']zɝwum>q6r=6QZg|u}=xաҴYOdgmڰoM4cpڍZ p6dX!\!ҽXq]=u/~wG7opˈgS([rn9 J@R E(2m}_O΋썮|*YpɧW ;kѪV_to6hVnX.] %Zrm/JdmߚzgW{@@;ڰc[\h0K@s1ũ̽.qkǝJaVEx \BT֣7'xF=lA~<5E _ȅڟ,U{@@fMoqڴ  6yծ}[΅e(^Dw7srrrC*C?U{@@Lݥ:~iկ7}_oִy]-B ܐ?~s\Ӹˣ?<ؠ\ Uu&Bq_.~kڼӵ\[n_kf O%s~](r1.ɿOU s^?!Q: +ײucGmrS =?o5mDө@XڱnSJ oס~˅q|@r٪uk9,x̙TZd6+/?⢊:)u"=cn^嫚!9'' ۣC^IKR Isuz 0FJgiۡ %%Qǧ{IӸf-^ mpWNNÇnXeoKo̙׮C"%轑nͺe ~|Q5#PT"^3g12:R~m4{qo6Iɧ?3s!a!>>q0L)wT8}…lVϬ=O{)[0ƂCC7uʋmVSGJ ?5d}zG޷|w- ;sޜdž 9ca1Gz-"'+?A￳xY-M{yjñl=Bԩ[g0x6f#'qWs*PHMI{=߅7m̅弤nwhTHhȤ1S-KDdĝ=` qO.Č)/M ǟҴyӼܼ]xIm[*\j9zX=v[&^_MWN*Zt޿Q֢Y+-(~jR\6~? ̑8QJt%^kZJ?}TN#//o3 Gf'{>`~~~t?_|дq|^q~_3RRJ!>WH, ml6q}vBcu]u?S)b)yW66K.쏩Y=%9Yx*G|]xko&_(\3V-Q(RU|J_GOz*<,Zx$rcJ;ʐR(**rGIl6[[om]fyw2O)U倫/B|P 3gS8vܙV DGՠ=]OR E <3;]e!TBD| .&, x7$x 1^5+m1P)5v,?ei{)$WV67VVCn\HEa >cvhHHH^ufj&'f8zc wi?y3Ux1a1׬|i@4z={ 5"ADc(B*j ðA<:cQY:N98ط|7NlG A ۃ⥫o^߹@  tB ۅ/$0RYKu0X> sﶷ&T~ߒ8W*;5.!I/g&rFMJs.)e1RNRyI eW?'ݝaH*K2^V?]2=^% h$鎜 Kao:'򍻌i Tּ\w>Ji (ˎ^mJ{Z;,5D@4So7DDhQH/py`E+3^o@vz<#"SSH?29ijO@*yyzf3Azs뎐gn3*?9'!RHӔR4R?IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/binary.png0000664000175000017500000000027513203343610022176 0ustar jomajomaPNG  IHDRL4PLTE̙333 tRNS0JXIDATxڥA0CڴSiaRBƜ\M>%Xʙ2S'{mYLY:L/kuP!{߬*ZIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/bsr_nfy.png0000664000175000017500000002037713203343610022361 0ustar jomajomaPNG  IHDRoXJEsBIT|dtEXtSoftwaregnome-screenshot> IDATxw5rrk(+vH-11I4`@E0(M:"Ҏuvgy~q{ws/}v2~2Z`ıpaM¢B|kI4 ?1M?4-I aY>QNC4-lyf -n aمMo1LB)PgjR_6- T¬4r^͢X!nQ5Űm# Jw_T$ o&MuKLEEe@XHNN:$TVV|ŧB;鬈IǪ#]NEUU5就ZǑ.MQ0ATMh Ӂjy8B9o0 ٌIgrMe Źq:4qWWS@xbcS7 J4]EIt\1n-6wxQA~L='OOyd6Vo&62s0i779qOՁݬ[O/@3v?떿3}IۅCm;`=5O!s\q@L?U1SyYl% 0 \LH20*kr݇(5dAbW$da܄~Eox ر\y,Fy@#InV14p5'ٿ3{u3{ҿ a'^m\f)HYCw@^+pVԣ^ׄtɁ[QWk=B]5Nw_z˅ZqUo>< %5q  WT&ӧ3ep3j$$xw pze|i_K|z2%VO& &aR$>( EeY]U-,DiN|z%Z8P:*'$Jz{ALz< 2=d(/Fe%>Vxwd`j̴x/7pz|oIB{8F%ɒOJ.F}ރU{8bbq-*8|^.J4xAd/~}JXûϼnݤH'S39]Jh0cs+($o_M{xLJ߹+(!VxOӝM_]'蟟&vAaA&'F ԛ{+ZSs2Q`᪡m^gr.ԭXzhmg*V=fJGMNùw=u(S!LVP`p֘!<| M YN1.aPUTārbvmHQC8/# 8Ds+bskx.r:;~3iO`5oA%qxf$Ͻx҈CZr= JytM/R~2{H^W,1=0ڌԐ t~AбLҊ S{ف)\m'nC3Hmsz@AO)QJ6ovonbFz&1 OӨ#LH#4PLTRgRSYT<=ӻYϐK0鬾5vk.\Z|O`'iJ &y *&Jw /$IÁm2m ˇwyh-S˩F'T⚟{SjKi';1 OϜ+_<η&[s Gr4/&۫IJ{|2Pm we0jjѺeNet:99.|W\t;DKh-6XR:iYsť9TD@ZR]KXR2SǦXo\V.Kf"3co_\^@['pڰZ;wHȥ(v¡|\VϠtPAk '.6ˏπ@1FI \{8bw^+bIiަa>i@M^Nw2L*voaՂύcMG!CBb +سK?/# شC64ܺk|P !yR>+1ѴZe|YZƚeM̤{noK$f_XKi˷PI'_! P]JV%5#cNAJj/ۇrhhbiHe;/?88DGKoZJ6,߂791~RH.(E8;$c=ADni҇YY J꽤 Q3Qz4/|:/V8= h|r}!0>&gi8#Ja )Vt]rК'wiPWkDsv4I?H (Z"t8NJDb[FZ0. P8: 1" ߞ Fcy4)I#iIg֑!ݖNuĠk3@GGeIf40Q1~5BSՉi.!aʵau|Bd8aIjƎXVBh8.V+jQd"d94]cuܶ6?h]hZ;;^macr(ػD66Q-M"xEu܉'rt*vlla& 8ll`& 8ll`& 8ll`& 8ll`& 8ll`& ?`q}/c ml87 ?C}j.̾E̖\WyhYE(c_VFyw7sy1cy\TwOv oӻa[ػ;/y BO3/䂟.o~ 3f>/X&^­"ϙLw a'/ _ {H+޳팩ѓ‘eC= 982ܞ4-^w3F{ g OmT<7\ME&?m3S3Ɠ>Ԭ`{_ Q8-JU_|NNLangVPYp,]or g*ά@?Sf* yܵ#ABQR¦=ّɘɹ7~6.V)_ÔGZJpDϽ{9ǥ7q}a_'37.Δ%c]otGqүG~xyTwd-wrsv?'r52w;Fx4w\~#ϬiWEHyw@nwt2Lo~*=?g4f9hߵ&:9;{hW ho;NeP5Aw8Ԫ''9,Cu=zY=zѫPNRɕ|e8 |U|79h|2E6 ~O閥'$ ͒ӒG3ң8YZ>'2aRCVvgUӃD:.^{']<Ů/FQ&\:"q^>m>+ נSވ3d<}~uP2/`ڹ/Hbĩc"y(`{POIx,Cq6G#+aW$L˔ gsLF JJ'Inő_ȱMKL%^'2Kyb r0a2{jkG^Ȅh5]R? < 3#*MgyGXᅸy,Z̼xJyGHé׎o8@O̕J^x-3~~m( n׋qȔ<q_{Y' }{dofyP5~t]CzDgc9l:+ WT{'p=;Ų[6G?! g`NJN9e(͏7/y.98PMac[66Qac[66Qac[66Qac[66Qac[66Qac{a'GII񖵔}[RGN'>d=8:1JJ}89=DDqJ)jvVOOCh$mG}52Q;PH$!'E_$,(@,i HMg}qCGgdFu]?~ N$V9  @)"j+蕑W7jkGI!4MCJ*ʡ ݯ0ak(zL1 !,%S $n#HS" Uiw%A4V)mt8{hA9omg"ҵ.BHi롔D JʐmBX*>dA+IӦqPMCaJZ%[$4[*mlqtbT4f S_aYPˠ߄)˥T %T)q( RG'F) 2T^BPY exxYvI~f*' 4gî%;hqSOάK,{>&Ž<$yyB-BS!W2גJ :H[%%"׀ZA_ż[YXfL\.Oq|~@;dY:PέS)t>lj?D7)e*kC[]G) PZ| ]U&q83i8G7 ?ļU0>܍;+)^Zt85!6xqBg:ȎxP ?{mUgFTT(SLL22D(kt )-㻼,6H|^6'%,W8fH*)*ܖI<62lw/KD)iZߙk$RY )::rg[Ό7;JҠ)B]H;τt'n<#ry%)'g= _ug2;[*¯ #B. 7dQrrHe9RVS~~4[XP8R LpXhͪ=2Wż/Ba-CE4 Zۭ()Q 3M> )-"nY.Fy/Exo@u-{%j8n : O:Byc0MTul^ #t;-N AJB=OC0JZ} R!MDv/=uj^e]%+(=LK"F,?>%['ӻ?}ZƮlRrl!˩γo5 7D2 yCJAfȭ!7T4#2+Cdpl~^x; @Ym%K4 Og|LSv]Lwb׏ 9CZ~RV#C\iuȄ@ AÞ!rHMaLUxԚ=ByIn`Rޮ@3k\ ǧh2G'$w\S&KB e5e 4a-ҔIiړ]˫2 WRUC?qIIC+{}у\/pltM-z#:8vO5ÚO|H H"Pؓ]IhL_5U*V7WuBLNDJDNu(vdͱqn%ZFR)eR;< hcx;%B $Gu|aUnfoGQuhZDL7oh"t͎Pщq}VZhUWY#yogꉽBDkR6j7gxU -Z^Y'6!-NL| %9`e"κ;ֶ8DCES +'hm..uj)\qjBXVr+3e>Nhy4G'ϸ)|6>.`xjI.=>E2djPcsXͰ;a F]^ S(}TщN&θgCrIDATlͧx;<{(8cb7b=>>c&wh[FqS;n.ʏ{MlqDMlqDMlqDMlqDMlqDM[pacn9JIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/bsr_select.png0000664000175000017500000007231513203343610023043 0ustar jomajomaPNG  IHDR~=sBIT|dtEXtSoftwaregnome-screenshot> IDATxwxo޻t@)P%K6-8,"AEQ@C=㮌-,) z>C{{rHƿo(5<|޸qcvLA`͖˶/cqQ(jr{vv& ^$ItuAHaa!=zpD9z6Ed*FIH/ږSif|=}Tn@4 EQ.ܕr$4 UUѴ+XJ-C+>jiKײ_.j=~XW}Y|MIM)'SP_x̵-l6&F\(;DӴRO/\k@2D@8ږxܗ^f+gQ MY!/Q p8((]$It:fLJVjh(lɣ ?jiFz=z3TUYQ$Ktγd;u:g`AJSXXNf-mCP5ЫhIߣ - 6{܎+i*K.vȨ(e gN:Jreh+VKA2٩ɐYIGnN!6C} 3HKs)8" 5eb~~3*eE.k8 h!Ev(L8e˖~zl6m۶?`ĉ9sMx4 ͎ݵTPQGp'=ڹSI=2ɝwӥz=*y9d  z"½EysG9aՒTI, R)p^':r-Hq2ٯl+vEv;K:Q)m6r3D*:gcTիdž 8pӧO̙3ݻʕ+ӸqdY.!jrяןd~Uo}XGW݌9ćf2= Ms>UŦ.DmrGJ<&Q{28]eC,+(v VK!:hĨ(X. YEU呟$tRm*J(F T YQUkQpȨUo@_tUM30gǾ}駟e˖,jhp(&΃}nBVhFOJfBq*G),UᐱXI.,_DP2Qp Ev88DrΧ gS2N:~ME5U'a@Sv15¼$ }IpJd MلBU"(v 4( ,ӢE ֮]KM6Ȳ,E+ѐ kSĪvged, ?ϴ޼ULFHtޜ̚gfRVdhՑ61wpbxP$t&wªb'QQhstX2:Pps3Ѥisi(\,@ML&c[8nTQ᯹T@t4ZjTb3%3ÅcΜ9S$6nHӦMKS4q!/Q`Dl"SIRmlZsW:&:.qam"e0]+3~W!6sK F7/|6\2)?7&ҶN8zƃ)t~/[cQ:TrOŖFVVn#%ps+̧PJ"##IIIL2CRjUKDXrџw6*>P| R8if;=oz /u<ϟ㩭7P7ZqxzV liX2 Gn z77"Q8W#K=[^:9998.SUU/ WwTZAq8 WKDUvdP uq9ӧ[f۶m̜9TV^MlllJUKf( ObEqXQ%=^zL5!;,(fuJxi):LE-]-8ׄiW_|wK)XF.!?@Pe;Ռޠ 7774l{ 8p撛,;0LhV88G?qp?u}|z 7^yϫ.8CTUgyӬY3EaÆ͹`||UV!곑neDZgKϔzk2nڰ:dv;kk8ڄ;& pCG NFX* jUݻwsi233ӯpołN̴JY|2B gLLr3e>N3ml%^!g^z;! - TVHmdXG|t3*Nq(™LY iqb98flFj1ԬSsHϓHO%N 0S/881 5e[`HWeL$ ̹Z%w_) z۟,Zɛ5(pc\hΏr#;lnEo'h*  7Fv⬦(,X IdZ.) ne%Pܶ88IvziL&@fVrTSU6m6IbC+̧4UEVTKXd ID߯Ԙ(2O\K< (᧮2v]k4rn OU+[ /7Y'=wknj dUE!??$KAn,_Rrɟ?*t+9e;*gAn_~jt&SA322Z (00S9AA@DAAD@A@DAAD@A@DAAD@A@DAAD@A@DAAD@A@DAAnـ(Xv{p,f>b;XtOASk 7[4 9v)_m<j,G>?sjI6Ă;|ٶy?rUFpnl=Uyޠ9u+r*8lI`?-f;VwFޡ̜5L c߾/6!/Adί|!wUX>D7}}IF(6>aڒ>_J z`ۅπTu7}Gxe%{yOWyh|-VHu ŵ = |c͢agE81osk݈߳tq$3WGÇR\1Rq#f-- mNeӇ8C {V2Y<;l䥟b1CLSF `uǐ>s!r<-,ŋ_h=T% Bseh^StPQpY="qw oqvv}s<-^̜UMW2mR~>bA'AN¼IsvW 6txu OQ|u_[۽TLfN[ڃ8LAn u"]%S''8m$cZWӛe{ 7^az?Y6c6_vՍ]x>0ά̄;9 զ}` 6D.Zźħ]\AuDc`eB5HoIўgs]WH _NQBtlmI{1r.Y#Y4=A:=Dwv͂CWYC[9v~D*ѻ/: ņ/4{Gx^ 8RD]z=].ΌW= -P!㟡H&?" 'gz{zh8^>l2Imxalj XC{btP Hxz\T-%'{1FgogndV 8 12jX5-gٴcSy4*i3Ml =8NtF}v >Pyxg|wOF9iHFi@_m4)҈d,U*_Xg)K㽗xАzU|| ~y=|3TiFDm %_q jF?ba,dD@b\8 LLo(~[ZOI4c$s$ev]jp/[Pr&YtOv1F0qjT Ny_`!6&#lZV㩅xu W{UI>Ծ%^|4@Ձ& 3ٶtdjx@2#&NJoxoJOM& Z=܉Oo{sC"//*Tye$|j4#?{-L 8t|SUZT@hKV]Il~ae+ ӃdBB Sa%Pv|K^bYr*]4@J`['CV9Њv8MdLqUjkt1FYÉS,XUݽX1z0?Op&Y>>:ROvYΈ%*;(繺3cW MWZrR  507̼:~,7oh+_}Kťx w?HEѴi `t7ު pNm&1kg9d $::Qa"1EPݲMFʣ9/`՚i$pAqW폏bpL7-9D/QIXKMPU pjєZqTQt_<#hplt54 &:*~ы_%Ž&0]|G:OBԢ<%3vŲoӖc0~L`\ayltv׈l E+"a +ܐ|oCxY,lՔ7g0o9xULUyo^[ ]ٲ=sX֙6A#~9C{ ΰ~Heح`c5h]v}HGF2sb& Dܿz9 Q e2%o 5̻g^gFx|M}\.LzR~ϛ=2HMpַ b- T ^4;gyrfa,݊kkϳxhoLrN״}|Uv9Ċ'p"11˗3f}MJB:OvoqbD0B1 J½Ì|RbQCk"\ n/**PD@h' 's q%tɒ;U:?AJ g.SAA@DAAD@A@DAAD@A@DAA* MHIK!)9BKaE) AxX8HRܗ\!1%-'c \yᚔo[QFEJ\|Ew=Qk{m/UH0ꌴkUlAn,NǺuHJNb@@dYA͛7Ӽy󿴬YaX]]P ­OӴ\a2UUUt WzFEǜ EQAj]w@2D Fox㥏}r> .Q&ebf.Y˖# AgmÍ.~\t585@ el`Gjo 6ɛ-ah\gQUdn4;gaǫ3CJ }^Y_#Oo4nS~?RL;r)Zz? IDATaOK}˩̋ߣK|՜,<śPh ~yV_?f8aGC W@.SUU*%{e*qQgòYt ԙ >=+KxklU'$Zf&>]>/=Nl/̞3'u6LYL{JF7}άEob wkEЗVXK9#BW.:pΡ# .)՟$"\b~-L9X*/u @PHeׄ1pd+=gWXȶO|ihh{xrқF03\s[ٚHQiUVNYra6]JCaےդUzqv#4>>E?{#_>c*u>,YWɤ4,?1{Oņ-a‹ 9ۧLYV~q ;o ]zg6돞#ӢTmߋAYVd1զxYЕpe&app>~ %˾$?Uj*'`>.=ζ#r4^jZG Mw+7px7uJodoiYJSq,\ `j"it$x/4/1f/0苾?8uwv?e; Vz;oAtO 4VB'.M!ʲuD_!Yv&F4M|s %ƨv*=D-ߢ @6 59eiɫywqZ!weKvt:h2zrSH͋ Pi=򼏑$˾ҧ vl>AA\5ܵlNw'|r~:KZ* |L.ke1 Sۣ`{k% ۑ̅+gEAx>%}=cMaoLwz6" c)d1!'K?޸= ˁ̜;GLU }y= Zf]G%gϲ|1a:5Wzӽ:cv5}Zs@y8ԃiw!**2g|P i)tb+"&X{*&&;4R[v~+)t8Fl6""$o=<4Ut!,dX!:U&᪹ %%5W[xxx`YdggrqMe$M%$dE.HEgEr>DN6$ M) =[ue4*!5S>%^Kj [ p>᯻u,جdxwPg mGB`dSS-Ӆ ×$hZ9۴{ 6VUQz4&^ +l1ݙ1 }p)iwGG~q%9{ڵm/';; _c*fܬE܎V'A}9KS\U% >a%B-M܄ZƐ;&mØP9o= ?ϛL Yx;neZ˒)Bv8:럿E}eJ!'BT,s=r]g!(^۪`X}jI;i&0 N/A+م2z>MRmtE/O+m[\r4ZӱiM܁gY|ծ],//%X5ܢQzVՅCxbg{znMbt=3SX?e$Π ROf!L&:u5F4ܱ+nfrcM9.RRtT#,tŻf| Bp}><"[8rs쳱T^|NcBǠ Y?[MgLtt/\+>V<D{-Afs1t r9IDԽ~ccҽ{ SPZ  P~J5Z6 (vOy0क ؔVDDCgԃ&(4}IBT+HW9Fu do4oGɵ$zcWUɋ0=jfꕾ:Y;ʫelن/`ݴ߿wʶL/귨uR N Rpr8I-6O E :MGi [Q^!uxE7&tjOMX3xʉepWeLB[Qy7;tMҼi <<,w#T}xW_cPjgzM%̳ŻC|xcr{<-į2Dz^k:)_Y]#.+/'H/0ڨxГkG ÿ~Κy)O`c耬o35YC ܲCӴ %@{\mE%Sߋs'RfpS'tL2O8XFm+rLw' ;5!3FJQ2HIIN?X3Q4g1w䅍Q8v 'q`"jC:CsgyziJu >ucHAiܰ㽚F]r-z@'ٲk&/M╶A*8S dm)0we| o\ o3HF"F6e|/~y{#QPQA nL@ 3o"%<WNm`NNhW\(j~᝱U1K8M1zVL鼿F2k8Ƣ)mug/0l[H,X8NT(( ܠQEݕEYo~?/ֿ?uJJ~U@wSR]V,9'I}2%y;2^bQA_De"Lpv,LiBqQ\ܩ`u\Y;`Oa*ˇݺ:C6 AT ?Ivb&9<_}ΊZ L`Q*_ucx䞖.W1_Y3GMy˛*sK,T:-G0?v+~ţƳь:M{J֕]6U;'d?Pd8[2AnL@h<&sȽiU=] h9ltP^@L1=y_ɒDydc0GP)9x' :b~[e  O$(i?byZݜ%  QwC?L%lnjzo ӣFr|Py_ˊ at9eXj!rzE5C)odkVO2Ÿ>Z- ܲ$@{n;iJ \ wh%3|/Ӱ&M%$^ʻkxK\}Zh9Gfy,X0Sҿ a;#îY~[2 `7䰮fʸҖdž6JC|q%-JVqӣY5#ZNj>bWU=Wꙶrϼ]ADmi<\aVtsGÒisX1<q`'Ϙ*)FŘEc6Ycp7 vܻ}yDfK@%e<<ן7?6NkٛfPN}3ctѫTr~Ň3SI,5k#c&o0{H]:ɛ>G!oa0ͫYY4Ύ孬=A7$ +FR|KMe|(>ue؁85!Ov X9˗^b{v$B dm˻pΦQK!.0ptbl_E/`똣g\ 7+ 8W/^@k"-?K֡ ʕ2;3W"эOUdzw|Շi e~A 9$>In#M"ݑ?`YbOOPJOoٝӞg'ƎO$yWS#5-h߉MШ2<C`6Ed$ ~bXhڨ"O:ȹ%l  U3kr4Q'd`kj:3Ŧdxꁼ Z !ZIa^%a;/DESXVs:MU@BR>9[cKKI\УbR՜-ufߩ**68nA3X:CUQx]u,fk/>η] y~3xפqbDb IDATžq޴TuBBݪ- ;֤dim= 08PtmW:m"Sًf s?3w9Թ})cB|<4W.GEk9Zk S\i|{/PESs>J%- 5?sܹz$Z 6H"9Cn;ӨGkoLg_ݨ#W.e®݇!M+a4k6my WM <);O\h5Zo`\}:}4(dTtE[0d4|5qQJ@!, 1%|>KRYZt֥/wcGaZ+*!y8դeEʶ`VM(esÄCI\.M\r$<CeҸYWDC(ȷŲ nX7sH>ZN㊢}zo^4z:K`D I犱$ ^xפ/ˋh8eBC}Q\g)ZD.MLˆ oՙ2n\T cyi^q۠Amc&R8RDPNC\r~4F㫭3Vw.~*OB8F ;pxQ5ä}h*FMӶY5tN]x @~Iԋ>/6Jnl*Pb , ev#ӨR&z{℣\M@ kwBZ-nͻ3G=|n[]xi3 2Qupk hW! OiwKNÚA>ɱƬuY7̕$"#w+ޝ:B/]7kpm ۬y0Igdq%7d,>]9XA {ƴnݒw֊}f()9m9SOf΂e9Fqڱ}+;?rBDy&~LDoרvƍX`p-EE֍SS{A7TyI̕APXgd]U#ТrϚ[ºOae[%]9>wɡZ{P[ 8wwl̛e͞Mdp٘C47\sR8$F ]h-l0ƍ]D:݌ZV%4Пq}rd/*V) 織loI|XG|}suR9W₡*|):'wV:j)|qu4nefҾ-w+ƞI!a,9a3MVà Ju֠w-Im~-/a{u ) 7xCܰL:G [7[7U]yr_7ETFC}]$}`+Zs4|:ۿ@qQ*5,EmܻPrܥhqo:]n=tlqѐ|h]2Ubl%KM<8wv&{YF!+fJFnD]%U :=eJFX ɓze6DMb߬~#;uiq wZs-Q5LJ oe(~, sF!Y;KKQh1YB#dWiڍ>F* ~:tY 1TvDG[o$09V~KONcWs硵e&B=rm.A>%r~Tښxm!O3fu Eq#]/,H;sqٛNE~+#كQ]+D5~5貓!)+F~8ԔGS:\% !sƼCch4օ0[ `Mް0%$sdzw!~;D8@\+j9as#2:.wkMc^cɀyUB,3o1SgLSӁtOgʞp.F"}65k@ňpJ׫ǥ_\:9cTb_IM%rXS{%8+Bӿ})Nݟ_ !xn7!Z{O`V+5k%BYTkQeKٴ1p^DEM#rh;@͏&ѿk>)4XT*DtXp`ϜI瓄B~B Na(;~4y_֥2*[qoU󼥡Y痴1}>͡?|1:ĊEdn%x'R)TBgBTB!D(B Q!$! !$D!xû}6);/BaƱN4h/╞|yUBSOpw(Я {`mi4yC[eu!x@pDĨe$s~Z:A0fTu(gW3t'G4wB  AWZP]ld7R<'aS\NRݦLӛ=c)F2 ^oZLMJn84a3[6wʍ#5OXQ4)oJȥͳr'GǑ3c" vb|:% k6DaJ~ TǧoZ!itJr$}v[ mw=5Kxw?s~%])/=l*wk%`Ўt eݘ,ڶ};70mWsuљu !(lO4ν#>S=s)SGhFh|f}է7{eݠwG̃}H/GG7k' gjWx >ڵpBXH`!O5),B IB!B@BHBB!IB!`愨cq.Pp6n]x[а'lĝh2cw'qa:CÈެE8vMAÈL7+`w{1f\?䣷Q&Ä?ݑϪ3zl3hnMk&c19k8}[RUD$>njGQ[e&q`p1n_LcdV4U_)S6-Sg#w/PemПO^NνS7oK?ͮ\TZ> /lIJ PI>4W[m1wYĵߧ2b'}?ndD!xn'!&qF@[{^oukK?fR3Fme!":U#KI{r%=ג_3v/^rm6&P{g*ۦ ɤܵh1zg֠hĭb'12KB4^?t&-}U:y̜ k,ւtnPI˞U=Γ:|e=K$Ι8،n5)b W16/KZΘwPe6M]@tQNK9g9~Fs4Ac[!mPTh '녌mbG]^aw6rklp/վ3lzdC!xeP䇗?xwӢq^P?#04m )B\*X[RCkz.g\{vk3:m *)JL71[|%7/=)B1KB؅Ҧm[O7WAe.UrtFeBೞes%O#׍aڟp]*)`ic{7seo!Հj7R!ZoRnMӕ_1|3F%gIB1ϕ${*GCco';VIWٹaYP~sb7kCA(t\_ZI4`cօ_'Dj7|!6:U3y0OG`]\2ꝱX鍧B.ԺTg -߯T^es|Z9?)ȿ;IDAT.︰ҿuֲv~B $"'Ya1xRL`e' sjA/^Bl/CB! SV @CY s̋ofԢܸs5!P<56A>DZnwBx˳ O=BB!(BB@BHBB!IB! Q!$! !$D!(BB@BHBB!vRB! #'&MDq'EQ8y$qnSGLP@Z嫗"9%1acmEz-Ys+KρԜu=s|3g /@ #~#$!FAQġzi7[viPP/YQ{~b[]b}1${X,9gHW~3xcXڸ]c+XvG~Ncg(~H<䜳k5]6J`?MBAcZ^/Zڠ1]eI,uqi{اJgDnfάez iXQ;LTn6sj:zR4ҏ^|Ҩd4d^Q `L`PZT%?d(RK)>=+<|gro' +{ f:~Q &Q70ehС=by܂{:=q̩)}׏yL1^69kwq6 |b^\=vr #H2>lۂ˿Dhq*ـ7Cb -ɐv-2_-tkPڎ`Ȓ ԷɌw?$cMXzzoި]Kn/SϜ˪?#I*ݯ#t}H<1aYN@g#UuE^ s??w4meik[C+SLtFb{PK>/g,}fгedyGf;*wm-%t ]7|N@Z:㫱9R >}4׸懍emX{hRKhO<4)xry>D\Â/r&K&,^uX :i6ᢖSQ<o0G}0o ;CR>BRV_=žH-AM7w,%_=w$kg.); ?RLɌ }ǾI5`D1B-|J;" g,f!:0[UAT5kH:ڦ~X|M,OP$)}ÓhFCL¿*0Zܣ's .Y?絿uKx̾o9V(_fW-JP-g/a7U> F1uKD5+`P^k[{Gzm2C\wɳx+XU)Q#[v|?SiQW1Jb R"n)'/(K;Q@*W*V,wjO/ {juٕ-!۫$]8C,Df*~߮ƻoP!('e~D3+rAZlŅ hX(zyv-MdjSmGif-~~X%{]ׯ/ts*1xL lo!&YHo^M뱇W>āz4pYa^ͤ@STy nC@I8Ώ|& #PdC+\K49} vmS.q0 Ύ[Adm6/畏Jf2(K] petǷy5 lHtŦ E}oZlND?l`]l>eQ/ACĹVE:.JfC`Kp@t B~{:h]:Lɉan?:w8xa.U;k?OZ{< hIH5X@L~[[-w=ul=r go((J:WODEӎD‹(>U' ь ,!pㅣDy 6Sۚ0-g&-$rNJΉ$煠d0#nhm`(g_PCGM (@[U_&2bi 52XgUAQm(e󤪨*9_t4G:){7q/X[Þ=!ϙ/E͝`w[BEPрBф)sӣ%-g3ֶE@JIXϘgM1}ouyRHB4o2̡qb`t7F|Xȝo\UIéF{V/%Q7r_=GU|J8o8~r ]ʫ^ שL Z0bhdzL'ymxi%%sW-vUy_W&ct "8.Em:gGnXͣJb-K)T :֖引xWs!~+μ=#o ]kh69V5DRjuݷvv]1~wլxp.z)NDKB~1IB4T[}_OCi\t.h\ivD1 =?iA9wkőw+uD^* %o4k^k]_#Uz/Uf"NKM$|*z;G8̶RaI\,^e<|5":[|JQ'?{$Cy'UEM?ϖ' EʹQ`Uf,*`/DECV[Nx-5H;+7ݮ,jŽcmY{5dϘ5 p6ͫa W9s<FhNf Z:/,^-YI۾G%JnOxfot3Q=BLm}Jҥ[0Tq$Uq#&??SI̾õbAvNkRݜA`H[ZydŤ vXa#$!!bx[~dTٗ25ISy{-+?"5~Uqy xvB%hZ/J::q0JЗIe|r-SLF[>Jʑ|h1dEQ޸G!,mάq4mԏ.fwֵؖ8(I9;6-L@ %i-k3ۤuKX2q7v-huA< `z䏅 8wsڡL?/l Yz 6zuì1 ޕQ:u1\?S f/`ېV>w[4-XTGFY_xR&} K_p:}2YseƋJҨqxh@p9Ϭvz?ʄq`0pa*x힆X/|{Cvp9qdFo>>ݚ[9=;~rbZ=suu%66H~F Hl5__ǩӱqHJw}rb/dz̞XxrbZd$!ޡg2{^INZ 0k(,k^|>屾ɉiAH<bE廭ĺp<{$$D3pd2vs::OOO<=ȸN(BTtiiiKKK IDATxw3wGWA r&Xc)F/&{$IT,"vPN ґ^︶uw{}n~<<;w<GOIJ _mtc/V,.3-.JhPoZ`4|Mkhė7wV4H3[&/dbih p1:r БH`i]G54XlZN1t+7utW&lؚ0hC 7x7u_H|[-nݿY5|3[n_xiB!8 JKjHV !FY>>3ettCB4u#uvvVGC!WdB!D s B!  !Ӛ`(H( PtrvI%@B!+ 8{`OՅœL 2[myp:^:z:##c?4=,¶iMSV>lW:] Nqv_U@8L؊nGCl:Dٞ*B/]rܘ(- `tҽՄ^m8_!/թ˱F6ڶQ2LV}inw믬ܿr 2yzuMô۱/W#`8}"z-} ֭WSĩW̄# Uu+X. xu2 q 6?ˍG(MSu?v[_;e0>c?* ;˕` UVPWx3p*tOE6!ZyB!z *WU4lã ;lUfi+DH~vUKlZpf{#g_9!Z,N#OW}~1sCApϷZ7qĊx6t51ѣu°[VHH[%4 =?OٿlwnkL'%֚`08G^_qz(ۋ>ZiY;FY~˸t3J 6V3pFg86_{\N4&͎fҲ ڝFn]FvPXap{LsdZ[a, fi" ԴepLwab laaxy{Fw6~_f W 2o^G_AV]}T ]ʗȄ9g/̍ko?'{!˹վ.Lusu7e95ylMHjMUQ'R7yٵKZ]1a']`{hgmME!M_*K[1n-~VIkҝr[ٖE®FۑtkD~:sU9av #U9vEim;݋m 6L)7% 'KFq9y{x*s6[nS :vNtGwY7޸W>S?o(ҏx( wa>L㶇3겏!_D/F>>-.alpu‡b9?׋m|6K1`[+\4g] 2[7ߦͧ04t2ys^g{lǭ_.sO~yyeBCw.ލ5y>uB$Zkt`0P]!.8b$?\eGbpڂJCb~D,]¬}5u8NdEvvM.i*\2܊Pz>S01*뭷:\ ,G_o&Ϊѵ]u_%]7 r|!ˠ CG`:xy_d0~&耯p mjpXS 4/Y|f䑩@ޔքB淉QwØ.n#D^ |T>hwIBOJ)*|ܖv++qɄQr g34[X>?Jcotж:=TmP@)I{aTVV6h+٩咮TnXP b/U@ÆS]RUj# S巰˸V~+S%eMlȶP`[j)?;TVGEEeAڤ nK fe)~ nmkiB8:`7.4nb=>CGC)~46¶B*q2n>pWLe,/YFk5 յ2jMo27q8پ#'8-ʍ&3W5C.澿Udψ<+,lb^R.Z. 4JkZP=)xQ5h>YUh3q.sw恿Χ˷v%k<1k#vw(chv|F guij#R6mA;~=/jMaaω\ueVǫ+p8$V &8_=/p7hq(eQ}ЗcEox-}ލM.Bwd?@#i4~zwڵ9zp\WG .0ݭ;GQZb1ч{,R6XA^<&.c}w"Ι8B厵?}&3nOx /?=;|cv?;Spy^/=6[ֱߍ~Fr/{/:S7FPc#flr3Lgk9'ĪʲkѷMAT/|[3<1p@9[W|EiMY71>t$%u7Y ?A3HKyxKԿJPk mpç1j;NbJs?Sg}NG W>x-;0M斛2Azz-ZsN*@]pRAm$RGOHf@{v غEGWCvPs 9=l TmVOݒ` e4xƢHvauYذpCa rXZS8Eu;m۲kWt\yy>ۋJP5z|܎ٵ{^i4rrrٲy@={%e%xaLrZ3"h$ $Ѻ†K&qCHhōO PZ|! BWê؛ $'KnPvm'nO3u ]6=ӗm[zr@IQBOAuٶ͛0-?lȶ薗m[q7? B$ᠠ{mBVv!DǓoakyX{і,wY]N՗;zsqp\gSV^1!ڢSj]zW6[g?!֗^lJm}]]AlH"3ft@m6ł\6klC6Ä'3#;;0t𓑞Fp$l!Dt`]!D{'m{3ds 2z;?18#ZonӇ\g\Hż1s%Vr7HNb&Il+;1r5ywr-#6m#1RQ1߿`ޏyWɼw\;:Tʊ)J}ц@m+^˫GQe)_/w-I.eСsYKc9 ]gKkiԙ3fx tVV-ߎ?vyib[^/Z`Skۤ>~6/:U4\p+s;߾]Y{j&#_Ho5_?9;7a'(RCG}gad(`hF(w]a{#/-/ z?գǒ?M̚65Y뻯bTf?'F~Z;+/ɷvs9#*XgɛLHY GF&nTaՏnEw[q7^d l| yLH6+?A|<\\1&Sa'q=d'ǚW AB0abSvtJa_w'*<QT-aS9ĽfQr6V 4rg@8(2* =e]{ʷ.^?i>0哥Ec(ݲ9OP%WOssKQW_۶}qBaz]UچlNݍ7~If~r#OaX8~q匯s nA6 β8_rF?wBd%Y-lϑwJ ]]ŠK~af<2y]2O̅d~3-u 9 0tzBktVDFT1'g%.^ ۢ@e=__ÄܸR`3~ z7O䜾.*0fT;09CSNhoWqHF?a{xhZG&>Ѻ5*ZT} ,q6SFgb4͕'a9xzJOʗWpY(?!ue)  ӹ7iy{lyT}Q 9`￾V?|;{ rS>^ĝ?E /?䈁{i?k^+.´Y6 o~/2U[ѽc5I9k>zq^v;gz˨Mx{/eJ $$ޛ:SWҞX;1< <:NOgռ-y~YWS){*F_ݿ{bG{|maٛ3[.V;?,˲N͂͞uULt,ṇ~g]'PYff5ML;dVa/8bL ?ʝw1r~R!,D iGjUiѣOWNƀ"+Xbywyq%2sMZ"m \73#n9y˛l]<4qGYAt 2 Jm>xɑƑ/D_\VwYOT: IDATLq˳HpL$V0 luZc۫d=7%Z mDŽl 8N>@Zp82ܙ䌖@-D8NW"9$PRo[BlܞEo#Vadadse?]n DAF~VvMZ~/,zUP6t [5![79KF;-loz;-_/h$+;ˊP $Peqwɱf'*5hv]J)f& G_;1H&.#G(p\xȣsnBl(Z_ɫr>;~{.> !RGZzUU !N+Xs l.aن6P8LG1l± 9|"_ !Rt`k!Іso2ԫ糾rmEt^h~Ɗ7sGAܹ7f΢djvW.]v\Gƶ˜F9wrV_/]'r0$4_OͲO+GvD~s) @ΓLj[w-GNT@M?SkGp卓#;)3 9"?x ~,("Ooow }Gɒcη9"zH>( #;⻫ջ.In>qn2l/#q 7M^sGÿ>wr̭W0.&fMɚW1*iUʒW䙷{KѹDy\a gt'%E2Ff)=Oz]i۹|Lf;xПwyϪg=oQ·<ˌ{&0\rkG<\V>~~ %ۄ=>ּW^4pnt(,I;pjU0'nicj]9v,zjM)0V147xqMdI>(2* =e^:{c[?>k͘h5-Twdy\,`,^Z]l] z!! ~C3p`kÑ1d11PT5=~}tOr:{dPA ue)  ӹ7'Nay>(~v%=x{^w̎.^ӰFMW0=c~n;.e]"=RāY&7)g4qy}?Mp(hw[EG1ӻN5{k:T^wM=4yP/ơJ k r" &RUʷ`@}~9;Wҝadg]Sy5+Jm*)?I6$Ncjox%Pʯxy\ɵG2pbJ~}~EL ŷXk>\j;]mc]b/vtE9ރsk`.l^Ț&֙>n?Mlt`iU-KvΝˡ H m"߆l9 UYd.aka\cw d%%5YVK({h ob"-Ŷj]C^I~լx WM *m(XҾ>Cp9t_?KO7 K:]1_nAX.֙ě Yt?~/m/ F\|C_=yXtx<8gP\ca[~R6LBv8L8hHML>>Ό_ELu o/ُ tw86j|غ}ŽϐkoFM+? Mza#K~wʷWgoLϦɝEیX:z9o}%w~/gGd<>{:A_y3㕇z]9D.1 N)<=AL­Gf#k4|2aMK0MtZ+ɢ:5'OO+OiEeǒ%Kw)CN~+?3wavI 0x"efu2޳p34\a­bB3PqEK䌽 c/c/hj'pݔK?vwv|%݇mv>_J)vömBPNؑbJS::?:=UXx9U;,nLD8 Zݢm T4ԜTAdďfu?]_7է+g,-gJViإV^;r?#Q T\kR:vn6nHsd:E籺*^G^Tk99a2eL:JLQQtފIx"t]&n֐@-L9XmE3X/Fdžܢ]e6Ym6>vwW^]8C sA;E6hHU󪫚vD S m 2׷S\jGzncύfֶv贙ؖ]жcz1Kyns}>aX&gC2]ё:9ƶrPQ7~Nl I=A^'=ӜJs+I7qA>+ڣkgd6lmEI}c[Vmmc 45ODiVmGj Am5gW"R֖Y*z|f" cq#ݻf_ϵ}Fvut{Ddq6ɨmkFaEwe,DJt“AUzzqŖM&(LzP\Y튝ulxԞ" 'lLy9 BȄ'v $6ǎ7]i:jzx_ͥ<)=.pG,ଯ[x@fc`pcwm'&Ky}Qdds{CsSBݬjV%EZF2ٵ&ʈV C]xefN]ֱn*4 ڱ ]W%Ggy@fԑұ0zd(\˗}!o!sҵ]߱L6֪~MKA!nZ ^K&zCs2.Nh-DGEJ5kbqj?il5qiᾟZmҺMرB|D#]*"=.`#7\l-76P_cnhĈFrUsR@"#[pwquG jXVZ3 qE6QV; ?V~.#viVoASrTĦѹUsad7؊^wַXs'Oku~ii]g-Ǩu45ٱbٔx30 @ aR2=~G'D?/jm9sjwc|襁F⻴kXјQ0jm!WS5l,_e;hkDblFȩĸ_ni sv*I$*j.AGV @BbR)IYPK@,EJ!㗤v (c]>Oof{c!ِ}q|dXzEۓ1&ٌ|>tjnn]::kkQk&hQR<{b=1a6zA,n-`ҋw#EEl rקJN0="ܒNjusV޴?uvj-rǢ,3+W? R:G 0 =ݞN.zڼy'FC:._ʙf" ˔W"0M!~v&4nMUz>ty^=[*'R޿BlWy7-Q ֭2NWo\׷Wu:5P(u罩%UW=yoOJP[qvsoEcT7T7f]S`1Xb5#A j,FP`1X$I/?u95/͞hIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config.png0000664000175000017500000003555413203343610022167 0ustar jomajomaPNG  IHDRk bKGD pHYs  tIME /e IDATxwǿnK^ذKbhl(+RI}ml/N{{@g>{gyyys1G(F1:( M'+3C/Q!iк:RXh] ^8B4SJE/ íG.>xb]JbZ=LJJŨ$^Ab $И#Ą؛Qdӌ9b Hu^Ap:vdY:rwj><>UWRN'.X ibj*U0QDو4m#XYGo6$wDO !F;@ e^4A![.tLDY©4Ճ~< ]sxM?J~Fr E5c @~ LD$_G%m. ZB3qFρmLX[3^A [3_:nbYgHm{ﭧsIFR4>u'74Z'! `#H8p ?oNU"=H 9{ۥ;#qJ||_(go =DM8ШܵYoD\f@d|~|q䭜?6|W DG@?t,%eɣ%r~v0سy#,%ӆ2NZyu CM&Vĥt[4 osh?S $Bٶ :Qy[w_Kv`5FBwv\6luQOcE ~Ϗi ?u9 }S, :qz$br_@> >kwn٤ )p$` kǔRU <_>!rXvaRYYEJJTLtJ9pM?;F<ȧlHs&s-\_C5\;c:"j$ Sg4>-Qɛ6$zٟ?6yЃOOqAYضRS-q>ō]{1=l-5Hݧ8VN O&lO4[A prW3_? A'&+]Cxj#?8M|j.=IEx'pc/n]P>|ذtިϿ4 W۾^Bi܉*ߤc|"IA$ 5@i8_*daPBAT$$t|oL(!Kjm&$*Yh9bۑ[D1(*Qnj&,Yiv|U !c\DfgCwF|N;7c%AYtM# |CnՁ/p++m+zﰥmGOs($ 1}:kmrrY~o?H&tOD"R֕|"G &ٺRS4L jO5^ ĵC4Qs"[9 nx`2mvg2%m6K3RK+@W5j/PutNٿαɔ{?M_GhU^1kL;U8IRR2EE>_~ &x}^l6aA ৺0M*O2^qTv-t=Z8!_Ɛ nSy\jw"̋ʤOhl^^h~b{FDlnSSƶ/z?M\1w{'♷9䉿_L'gNUמj9JH}5[͆Jk(cT_ q:5rst b (( pc"S<}8m(7=:뽵q%*_$ɿE3ާ/Cr,`3} /Bv)5DݛMdl\| f,&lz]3I|:g)c霟El|(1w3q :,jMek,5 uMvH3zi)]"==IMMCDعs8^~'3! ыtѤpLޝ98u U3QB8ן@yx4P\\rsF:ޚ `s9p-k>?Q@%v S{[AAF"f'zQ|Hlȱ(# EQ55@}tF[zG!^!6&s""PmۤN6'sB41^@G4jmdZ@%`I֕NqlZ&4N{$ Ame I"B@qD) XRb o/fDbt6A{w3gltM?_$K?e"];tڎ̟0[4 o|͗k9W (b/(#F~2~; K /eu?ݭwZbr{$>>>rlʕqkۚUPP{0$} pR\Vwb۞-^șc3#f} %vɤK흷3䱑ca%$''7yc5~9X4155<ȅgL&95ϔs歙"y ;NdE{vk1Ԑ>;^yѹ{O?i\}\wõGoRB2zoo<ʴʤ3.!=5eEv%t3&cEKaE..?ڵ0t^z9<6;g|O#ؓD)PZR(6Tӽ\@5[ogӆM|W>;{"8]:Lˢ<0ٿGƂ?d"r:wٷhuO9j[ʲ0\~U3$(,翟MJR*z뷭ON?j51UdIFӵ#~{ROW\TSO<ͻCrrt;gf䨑2lO>}yxډâ,^+ѥ0,^ukqt{Æ;`oaٝrZ,'59k`e$' YYe)eŤ$9s9_9^|yV[U(>^ń3c-4[7̂ǐp,p͑\~[ K HJH&!.1J uM~q@5 #}zȒLqY/4#rG۫om: ]۟V7IˆB l6jBF'3fRPPheeGWeu+/ W.1I8F wHOɠknٿ8W<. EV%VTSVY'0TVWP][݂Se޲lڦ:Ceu,]4b躎fi:UJKJ5>#OC±&F8^~?.;vq+|??~_vÙON_21Y>,fveE;-$F.ɽq `̠ ih躎;-&1Swg蚎i_uzu˙c0L*YH( (X+\Z 5Mt]oti?Rxoƻ$''3tPA~{՗_Cii ox%!4P?z骛+U~M0!wCP33br ),-dYȞ9=$p˕w9b.t ̋8"!;p2 tLia~=QLQ0D vIچqRc:i*$c&;vnh1 Z $ڪǢD2yptȀڵ|) 膎J1hLDitOjRh4nDKV,bx󍷘w$$&G9 ꕫm/٧_<5ЫtkQ42"1ؤ}87Ċ.tòt] E[h 9CQwK.dRp2~F0;IJM"]ݲ>H7Σ[vC.g x[e똭$I#O]MK{kecf32ͣh aq!iT l d 2v6ENn`-ͨur-p:Bc7oDYY9O:z 'XRئ\}Fh,41Lݨnw荗zyIF9~)VoH*|L>S\{Ռ;4ŇGDN؟w']s޼@1O=/c0⿘o|Wߢ`6N;281qYy_2lP6ȍW~6ݳq"z?2d`yI;^{uq?~sM6LoʿΛ+ߐݣn|>?=O~=Cuoէ⩿?CTrs(w'fRH]5AXC/<=N9hpSNX$* H y~}>z6sGғrۗEˌ3<'Ǡa1j(!Wx5ԭמ -.хfٌ/xʋvP >8۶leĘt\A:v t`Vn9IHgp " se~d?d#~{^nv)`6Ogvnz42ٽso&.x1 -Y6cDn,'Puu5Sʃzjn&Ǔ<ȍ+61cFfF mtAT#RVZΙѬʨ_~._as3xȵ/fȑddsSxgٽk7Y3#A3HmR@3L=64MEA5? N#`@>٬XU+V3³#&>!NZu6|Q'[s o?MuO߀>۳srS{i:f+irC}y.!!!sϛYa&{,[ţ=رcxx|\q<|G7Ϳ‚BN;u+W`옓x嵗̤W^{Ӱ6/zsgvC}ԏS^^Avv6?#Gfɖ:ɩPCDգ*&>QS]ÀQeLD4|~?@,`L Tw `4mLWo`;3ەglAvH|ܾoYf#}rDկm72(iKs6ي FbZBIEE_~9܁OһOo^~eVZM+ox|3g֭cO zv8<,6[D|z),[&rJ BUUi~5#E$Ǯv 5`0UF I:}a޼ytITWx"*7>_dQeމ/һ{jj"eaP2q'ΥWOC%0ކ"<.Gx6`x$!#4*Z㗐Yƙ7K/{[@0gDesKhf9_k8q{={9y3d)G gۖPlᣆ2lXKNIrf:_j2!"4MC$ w})ªkC P'%Z!Hj$IlX><(^3O=â%15 2rFSC:\{5w{1rs]n?.̈jhs&ņxOs٧+ ?,νh<7 Fذf#7n"ϭ:,3|p[>lҳړx|zxUpv)|\.']ub<TM4|_&ٞթL$Pq!IDAT}>i驈ȧ|SG(2e)׹['V,YI6AonHCL =7_$$3/"?k85", InlqNݝo?o5^I'՗_t:)//'%%'噧ᢋ/&--ؓaСFK͟ G pгwOn]Yg]$6~50yHjZ 8* .Yߒ7Lgߞ}>5"dYf7cƌa֧4iCNj@^ $P#2x=^:v$I)sg1٨AwrD /檛Ͼc-/`!'0e;8vF4Bv)wu/l];sntZ#Vok`ms59]ס6pic>'}I4;GʫWk觅 bfyx|\7Zv'?<!^;r渳Xr[rɼ dffPo(ܖǘq'sf eeevv{D_~%]v.>>Ql!jP?<S΋0FEhOdNvvq8].vcrf6|wF}:SatmMnD[6l XIӹc%Ft*m#<Y0DW㪱U]#I@4yd~?vgN<.ٝdYj#Z/tL$K1)t"H@ %%ĸc@.++c\{x<#tl Hkx()_jj)+SϮ!q pѪ[8R\н入ݑz~~>\pL8ozh.­R䨏8:tdF`ꎇC%.Irpʲٿ?^z)x' b"/"=wu~{:]tb9 QNAiK Euxc'Oƕ&otM;;䩧N18#Y(RQ({D(>%n}rHNIF$SK/0p@J IlJ5BGZac۰m(6EBiI 34 nhVj+S 28a@t .1n4M'`y[D$n>qqqqܸ]n.'Nݎ( ׺zZѐ@5tFb|RcI$E0 :gݳ&'9+xg4F(GmR]|>nS/#8~V_!1."S!nʤ֠JcWREdZ2 9>E4B+覎fXXڒ.8g"{ggu?\1.RS@u6ƻөHpG}y#GvӣdgRY]Ō>aDx9rHJH$y/nza22b ڍx;K/LǬܯfw14s"Y /(akjض?@qOqJ*%ztpp8ri2W6L0 ʾc衼p ,Y_ީƞkXame+*h ++HJHˮ˯ɗlCsfsmo0 Z 8l$%+rس/4/AE&oؽw/ >4߻w{>s{fR^YU+bhj2LMBR D+vMAt>%nJ,cJKdus! Fn| ʂ^TƢpn7ɉIݳEzjY~vL>Fosf:Jjj%s&`H-;aƨ:[U]S} I  ohhD~^w?~۶зgN>q,~^CDK 4,4Drg>)c.I L'IHbrqTh*jW,\_'!xthNN.oWhM9wAvZlZv.ްǯi)A tE]N>-2`0 +}6/aH3}}ݥ._'rL%=.CY(D@Ƌ+\hⱉ;FxkWTp͸:[NT~D>\P˟UCqNVaxrv(>$5mk=5ХcffAi{y's]$7l~`:/A}_m[awѬ(SN23$P^QNұ3yN2g0 (6'8~'OE(k.ƨa#)*. {-gM༳&goRh>3f}#?#!.2#Di:_[(cC7 ~ dk-jjjCpy2rH?< à@-4MpTES#G~m7g BM9l$y7$g_=օt_ю{EVu7w^j=5\=z1"+ga<6mߟ~K']]܁kz:{}м~ް)1xjF5Z ױnIQS^ rjtd$}:wtϺ-kXWIe'?,ܟ^0|^2/ZŨM芋.%.ލrt9qحVDm ** KuT&4+MdmՎ)~:g!^U&i)"~@ :("b,J9FmF( bʂM-٢0tART*=6,%Q╢KA݆ﱖD˩h@WdY(Fmg2[6P3f(: lTL$jM@ZnDc؄i'ډ`"& ahvQA61Ũ$$!rd5~)DK$diJ%Rqܳ5A[3glwd(F^vI6(6tՏ*ȲPPI!UNF;!%dG.8b9O{T=D ebjoDs81TCuE 6#EVe Y"6xӒ`RC'ީө=rVoKzc3=`Rt\Cֱ:ZFV;$UwT0*Q$"bEV6%I#*$A Wd?H$ О&?mBѝ$ۢB"7ZCxOEMY áX+oGE"ɐts-C bh*Dv7Ђa*:nxk+86|zeadeXK`S<θ@0LZqX ]XCkRSQ@n]љ&y,q7ڷ dw X TtM3BkXV `k_Byi%O?7)RgC^t^/J|| !ODP].PSQԽEjZ .Ie  &4 0ё$k49^v.g(x9n+_W陸\.qnDAM[7!}q,54"$"+VGkSl d K!&=25;=d3XMOD2S,mdiRXds^.tng X# Iz%c5>anY.l躈aHk!@UJ+U HorX09lVOp#եKG&( s`ρ\dII5 5*y%U{GK׮$%[kahGR-`F>#D C@t ZPdxŻݤ;El۶dJrJ2ʡؖ xH3a;G-Zz& I7t&4"굤$|R~6XS'AvLj I:^vkVaLZ:dH\ L0Ft]}Ec5:Eq2RY0dT-Hy}%:2 쪓 In7vaz.99W)`Uׇv)tL@ 004HiY9F&1)%$[5hh'}R^Tai aURgHrooEtO8粻'ēFqVY78w2uKP"*'bm-I,E#I%DAl"Y> Dg3r-aSL͖r!o^@q 2GVˉaC*!ډ[=qIfl nĎBM&T>!Ȱ?]ګq$(6.ffs-ޣ+diN6Ŧ͉xv'~PCRAt 1)Hq0^COa9G!s8] TKE O8L^?"EѲĐ{f-I L ߷H&]T֘TT+XL]2q9edŅ,KM=d6ȉ`*'XZ} tP6-ItNw86$م$M&Mr!dl;3tHw zj#Z7 Z M.$3 1#^S>=N MÊM!$#+>NkxR:Z'C@ Cl:f)U]qGc2&yEz0" eEp"2ag^ٴŦ:W҈zQC@i 7y /4FFZAy5YgԤ4䎈Iؕێs?~o! }ڒWt_LhmsF|IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config1.png0000664000175000017500000010364613203343610022246 0ustar jomajomaPNG  IHDR ysBIT|dtEXtSoftwaremate-screenshotȖJ IDATxu|߬oܛFku)*p/^.rq.)-u*P=6i\Wf?6ƳIYhfgmF!B%mv u!򧙟Sye <Gʠ}5s tRTTLAA!`Z0 sJM";vUtzf? p_̀cV#3\\?GYF<44F'i'2 zq哏pq%O?1TEB!ZbB /_ԉ(?3UESUt:y-Ü iL:аى^oH07%2T7du 9)hoOb\2}u5U@fF fUN*NFB!2NQC:bسr]v⎟wna4z~Nqt:~~XV&ࢸb4N-k}b8 [uf`\cҰWĩi(:f_+~fٿJQ~*Β3`)YMŦӫg0;/? SraZXWz"8U@Q}}7)AF>: !Af |8b*B8U>q]X2KQ0-*W3E(?BxGZ SS\ ϡ\B!_il<C~Ņ5oS=d g}nlX,Lt=umۙ>s&MhhH=Wi۸,VpL|gA85:> z]r;Sv#WGQVΚMX ž]\=@3 P_o&|M}+/[ƒ#πЏĵû므3O5|Qzb)9'Ύ}Ha^:_=+%>Ԋ'?wv僼4-W6cd/ۿR擌w|1G˥ !B`̗{V l^of~F=Q~fD13<t)Sv %*hN \:8$gRM>YwIj,Ti913unӻ;cnߋQT_ZwKy`n U ?{ɞ{llP t VVQ}޵=b|#B>ʛMn aMY0cW3OI B;7pN2>u6d~q/9Jξ8Sε\tcB!1.ppt aV!q;{iqaH% 10fNՉhh4нk'rs]Spѥ3_FNGt47w?O٧|:NO"׏NO#y˳qV$$c@Wpкlqgb_8'*;sQ-;$i:?_=~ 'DﻝG>]I2K/:dng)t&RvbVZ%BW:Z4UsD^z1.X-p6wL%57ӵ$׊t1oTu:t%EA+Ct~nLW4ՕVVnOhN*cf} lejOe.'&j_35O:& lLք9;q fUſf#bC++;0Z1*c+N eP1D6@;-B!1ٱ Yi3! u+St#'솊E= JJ*Tqb2Si3e9É]Wq0nїL$mU-3&l5l 'h5w^FBjJIΝߚEs.B!:E!SEP=z9{Կ+s7E@:}ꬢӑWXTrA}b4}glݾ _|||ٺc7_| MVs:̶dVl/];n[mW@NN!68S_DZ/ڝ~Q@>)<`c[U>aH+"#[ӳ[dԩ!-iU? qelݲ2WYt<;FAaa *\So򒗼%/yK^既8[괣:*=Y5FypLڛ:WuSV+AAd4XhhPPXdBU55:`*ddc[H;w_NR)fBbZqxwftO/4cA;1{ВbgTQ)ϕ5}KY$! !WQKe,.ݑ{0ėٛV`_4K h}-4p=@z 2>崁?.c^CKڇB!^5gՇhOiigha>}QPotTeg`:ڵ;8LFM cRϯ*@gZ<È/cTv>ĖEvx0etw},W\WլPd/lp˪d0a9n]JXl};:t8С7u>4:s@-$#e[cPY`4ň\^ҟ[/ȫ:`O'iiM|Ow]ǰѱ՛ʤ39I:r~C!Bx/^/9z؉QtQV'p߳J &h={VSU~<(;pog<^ui[i)U̝;]vGhh(}ꪫn7|.L-q/ 5>}[m㕗_BH;` >>A۴i~?111 fkSzjhNx."k^ӛԩSөSYS(cckXhs_6֮ghVZIep8;ohݺun玝^k&L=ЦσҶFpp0o׽mՇTX\j,u[oѺuk&]=xb֭[s>Kxxx"nh=DuָT^xePJttzbf!D5o'>'> <9-˹Tvv6,?b!&&aCп?Tz=e~dUcZh֬W\~;w(ƣԦ͛>|S%,,nݺrĉgp|Nϫ~_b}զ#ӡ}7;;֭dffce\rx&%w?Sc:;c„i߮-QgJצmΈ#pU//G|դqV5=Ϗ?o;fܹ3F$,,ԽΝ;y׹ne{^znf X՜3|s>YZd2"KJ>m>ajйsg}wݻ]4{o=3f`Ædeep8c4Mc,Y\bcc:u ;:M61gN:Maa!;v'`͚5̜5X,.b&Op6۳a9L<+bf̘ڵk)((}L2VZp >SRRo&UQbYYYLzZlIAAII,\_~zPW1fƌSR6TV}|V*;OnFm pi{EaDGEOJJ Wz-W0c׌1N:RTTđGXnE:֓oYd){njzt:]4~u-6Y~oInzV^Ϳ~Ƚ]\l\[>h `?EEEǹG}1rm^vQ4ME[iquѺMk پ}_|Nkyіk+&M-Z{j=oCSUrRPP#z^OvNk׮7[oac\|nwl6=`Qu>d"**mzؽ{\2~ikƓϬV=Iq]u1Vœ<ѿ_? n\_~Y?}Liq&#f}O>}7i̙_SeleӦMk ٵk73f~͑#G63^ޔ)S>:z,u),,dҤI]BCB7ng&L!!!ڵt6+O? w4?{.ZĔɓyy a>ߎbASUРE| M/ </X5&pq3lظBv5(zTU>#:Dvv;4M77^'$8m۶39?~0FaJCcy^ۍ7Х3'p8xg .ӹxT2MJJ%&:R=K\;w$66)'Cviii|ͷܵ ^Oݹk>SN>>Nl1swTU|m;FvN:6mZ3uۜLM_|IRR~~DFFÓoZٽgK,㪞NP'Mcɒ%1 /Y€+Pqe<(o׮ڴou4ܼ<9NN֯G4ZT#G鈏=Jދ!dG]/kAQZ6hb223),,$44ѣF1|PNMXtW //(8\y?󤦦R\\LLL S'OM8pwtLM嫯s J}mپyũە'zǟ`Ŋؿ2Nǎ2o߶#G]#E(?~w{ 4MsNxԳz~|222EDD/nzf͞>7h@p՝ #O=Vv֮^y="33{u']t_~as&&:Nu|\*}mݶotZhe޽L*ir^z^|yq:lܸaC؇bb8rhٳyc0y$?WgH^=ٰq# ,KFF&͚5ޡ95ډXUG*ùռysvͮݻرCm6/ ~~r4v;o?Vr`U ;1b8z$;'9s?g ??g{fzJeQ|\ __.Zݾcg22>b99<ٻ+ ,TǛʾẍ́jۋ/$%%fp8lܼ]ɇh2sYVg~XS)ZG7߄^g޽kN<);>˖ĉ՜_V7^ jQj* .W_)93-%mjxknna*ͣZKyVnP:EfZUU]fvu۲{2)9xzænՊdR#&:Cѯo_44 "';/O;p﷪z~ h0)ѣ|ͷ0rJv\߲+TUlv[eNw tBQv!w>::?N4 Ͽ/ ?KDDD l{᭷ߡ~Lx 9,^c7T+7x~96;]4~#'7PzE2"L&S "222Ω;fg騶ߠw\~en:g{c)Ljbs>l^sM^|M7sםwЫkpשcGxa,X)S۶iӺY[pݻu㚫mokҫgO230Sjl\Ǐ MGuuQSs\W\vikn݊/~}b2הlx1JΖG5oο~͛~OǣQ.V-[m0ꍼ:uf\ }"۫lu'$FGEc4k]wI_?}С?-_^JFټImZZzmڴf߾}u6nDb>6nȈ3ɇѭki3eۣTg޽^ݺSts- ݻv\g!M&/K/LJ%KrUW2bׁYVٺu6ΨA}zm~<ӤLu4k2'y֭L9^{rǏ[ դ9UlvYY[CK9Ɛ`BBB8x0C`غuwf}?6sddfMBBhCb>t2227A}UQ{PRFGE&iî]ٻo#G(n+ (hb-Z\m~MH?Znb^C{Æ_߾t҅xe~b՗K<-^VZr7C8s ?A\UoNĉb@tÆdRVZÈ>}9?Lƙc+Yl(C=1luխ(:%eu9s}sawYgNa49}4m͔k) tu%@@LLL[׮0w&$8bn޽$==' a.lJNN%S ~Vh??sܦNLgO@V{K*-/lܾ>>;K/ vm۲4Mc1LtؑXjW\~9GQڴA4ә={DaarpZ뷺zܳg/ -$%k=U%>>~s);A2E-[xRw>MdPPPje=M[m\z6[sر˥cпeװy.]{~ /?L&#G`ҥ :qE jWel =wgI5_Rr2KnD/]ީcQU>Lnݪm{5}y/2f}= 2޽{x*{pۗg0s%gv;/TMEժojɓTMd5o/>e+_?j-^pP-KQ\в~x+rmF#]vaqk4P5WছFߒinթ]))mPrssQ5)JVPJq5j/2|O?dMUi֡^f_G;~UuSNv;暂PzYݝD5uZ|FDsA{_VB4}J^\9;nJ]W˙3DGG:5kBQڵo mϸaZjI$ϘIvm1MZk?Pm;.Zd0ЗqݵPa2ٲNLdd$'N࣏>>۟)U(*7%$$pd*t1.T-{RafW.;w6NJdd+ BBBP5aÆtRK9 USX-T[~LD6% '=hPs!׀-rmǻǣ>رc ѣ̝;-Rnm۶?֭ظq#wu':pW7b2ڵ+NT.j㈏G3gh"++:mڴftقNЭ[7G|MS\\UW]U<(+U={*كڲ9e?Ү][CCKnwuUe|i+}tU BCB0ڵ.+?j.I]vѣ{wut ݻwC+G|<DGGq"*=(Nӑا7}z>`I]ˠrjޜ(.]F>,V\t?~}V8 4od46-VFu:iǎ;\gK~T|Zǣ*>fswNYnRؾ}i鄆˷Gy`>ٲ-[jN"oeK-i91ι/Ӿăj/}T{U5$8fܹ$F NwAX3:u$>.aL{aaFGɓ|tb]m~vo^t:#lرc8|0]:wWͮjTOZGV}zJqgUO>';GQV\͞={x4U%(0Ν:zj9{ HMMo7@mh^}UUa!oPE9v8vKǏw؃t7pM(;WhZV€Yz yyy".اrExv\{)]lۙ5k6Fi^&\|1K._*fuҁ}8efTNZdz{rvލN#6&r m˓u_b{%vUЬY$sW%* a\]rqY>>V~i9'N 88ovW`0Y|9˖-LJ8Ə_ù2kZrk@@}KbL8t}=V+Ç[nuםL>ӧSTTDBBO>PU=(|k~LJx{{YҿK.+MEx:v3 &&|TU#OoEa<דڵé:1ʹo׎l} ڵl2:uHfcرVUU]Ǐ˫{c6HM=E޽`FAA!g2TczR7Noſz1cF rڳG. Jf.{vLU+ù5AootM:b~Yw}bۙ;o>qqUUճ' -O?c@~ 1GDT[7GI :ի[o1nXBB5yRӣ{wz9s9z={b6IRr27LŽ;fAD\,5_?֯=go?۾xã27z?,cF"Y3lvG~XEt:&&߯sg \zxc(;{_Wż hղ%'SS7>sƎͼ 0t4F={P>BpjݺG%$-J{S..+'ObrljׯѺU vHYo7OrݻwVnb4s\?gмysƌŐ>JR)[osGbD#Z-ri׶-^23|X- Ho72{̞Ŵlтs&+ݵuVy?Xx1~9zp:v耿?Nfdg`ZiӦ5Nѵ3t{_,^%Kh$44nݺ<:;6 ??_ڶMpvυZ߷tُ'2x .7M0Lw~6~:.;s̈́ڼy$w-a.!АZlQmݔOt?z!fϙ÷rחa--n][}}?4M#0 v:hQ)6h׮mIˏck>BTT=F=IJJf27~bXVJFb,իg˭ߥs']Bim·faEmz~nv -fMѳ_{x5,X;v2pJ7Dٕ[aA|4sNع}:Ν:uv-n",,\˥ؘ|?{Oǎ\ݴy36nd2F.>t!!!o; p(_&fM(,,Zaʦ'/.6;︝yחÆ?ߒնںf㏭[Yp!NJhh(_wmPUu#tUp?:⽤^KNhdᐆؼ5zslެ)[S[]ew!湩+;pʓ[[jhM-7͚B5ՅXvb 9R'ٻ{႐qCКZ>9^o͛5rk 1z .<75k׬_SSSپcGF$lܸ˗0BTOzWٴiScFfڴiDEGQgϞMjj*]t90BI9”)Sx0`G!9@\\|se{=#$!B!9J|#66vNwyIIdeea4{hӦ | [m͛O}fDwc=Ưʼy8u41jPP IDATH*G~oGHH&L`С8N^zeRRRBדHXb)))1~8.rw~?_~ɮ]ob"&Ml67f !Dv {=6mڄ``РAq9s &M"55 .rnw;b rrr oǏ 99^{G{Y! fz}uTUeu5SPP@-1s&o' 0Ǐޮe˖yX-u>3+{^֭[o%11>}ЫgO F#ׯ?UVGUUnʸcۯO?gǎ\3a"#ٴig̠K.jՊS$$$ȿEVV}9\+**ߟb>cz!>Ct:-fn 6n'|B˖-袋4hd2//Ӯ];ڴiCZZ;v&**d>#gI}-9cF۵kGNgfdBϞ=tMH(d".6R:={Э[7o eѡ}{V^͞ݻi^޺M:v@HJJb0zht̚5kغmZrx߽~ sΕBTcΜ99s?PZhiXjCK<1bz͆ Xj{Qt҅m۶ѦM}NϞ=9vVBpn+`|XEEEעEpBխ[WYYYj׮YY/6V -҂ ոQ#JJJR:uW hK/;PPp23F }jSӦM)S(<<\Փ$%%%i޼y2d4ްaNg 6Ԝ9s4{l%$$07pvMرc֮]B}ޭ$uڕYgK8ڶij>}f͚z(9Y6M۷y.uZtΝ+ժf͚iРA|7nƏ^xA5jP֭5p@ UgөS'j֬Y8q<<<p3 xfv?\.{IJrǵ%إϾ\$D=‚|[Z۶6KY}-4!pY,n  UƑ.)8$T2 g.fu*:oݬi.~ M[ظx8fZ\\VwGDS);k. .8$TSDD#pY,Y(bqvIt!0PM\vKy` 84!p0 T`V*`*en. SuY8 rv9p!HY.\.f+QfFoۢ&g q䰶o,/OG 8 \ZTiդY7tv9 @yT튈rv94fvegg)VmgQʔgE`8-[]prژ1>|ܹs5g _űn:mV/> 6m۶/rerdddH{=lJ %I9996@\H2EW$ufIR~~&O6XÇ+ @s.nI5͛ӪU_#*..V``:wꤻK)gYY^=ZQ5ԲeK5nXRSSݺgϞ8pNm۶O7l{Gt%#33S*,,ԼytwsI~+;;۱|z-uU>˟ 'j咤= $ٳGovܩ5jk+r./DhѢKL]k׮դIՌO>Ѯ=>`~֫WO$y{yI߯99z'TF mܸQ3gRLLZly>v6nܨnުnQGGڲez'%vx֯_gPf<=?b5lPdIR/KCNNվ}{͘1C={ Д)StÕG||z)kݚ0aÕ$I, :T^^^4ihrss?pkrssSnn. DhڤƍiŊڱ}[WGDA||m==(Ij޼6oެ?gqqqc]ݸݫ .]H5m+WjMw}'Iz߲efei8W^O`K+VЁo?ÇԫWOՓ$5kLׯƍ-[hÆ 裏_~QfM=ڷo┙6mku1,ђ%Kty{{XnM'zJ;wVo9'_?CRVJ߂ըQC˓$78vj]^^奤$}駺;4c CYf16lԩSw^Ik4h IJII$=U:tԿڱcz쩛oYnn ycժUt}yBKJ4zh&MhZl+͟?_/(b>>:V&tT~ȑ#XI[n9m1114h:uGyD?n&ӎ.g.8 " UqkѢEZp֭,kѩS'}`F++3Sj԰_7\+]NJJRnnX8ըQCSNU=马,G&MEzו8ncǎO?T7~gIRPPE:bL_j ݺuZ`O.www9.}رCk׮Uaaվ}{uMԺukJIѬU+pm}5k^3fdl6o߾OT 2dH6>>>*((PxxFd-YD;ڏ9R&M̙3W>5zر rJ}G*++SDD~i]}xrd;kѩkjoeҽ M, (W\~X]? ?Q;{;宰 _֮V͒oq!p0 ipiCBqE~ M!a8py4Uu}fHsv9ieZ pY̴X Rvn+]+\pH'^(9py4"#%Y,. 0daKnwv 8`84a*\lJeV,7YݭZean8+\^Qa232_Y..88D1u)#pl%m[ԤY[\2HgAK+*-u4KP.(oJٹ]Q.\ î,ժR!2*ZYc8LC`&p̙3G|i_.n:8pയgĉ* b,UZpV\j***Jt蠎;wdTj2l6}gZxjQFݻڴih{n=z'իWJ駟4x`}駊LÇʕ++,,Сl6)Un q*fiQڳg:u޽{K~۷OyǎSO>izp*..֓O>={;ԃ>B-_\Æ S~CUfܸq]v@p&/v7n\gjjȑTxx_8peskǎztM7C4ו)IJHH=jJNN޽{&MhȳJs?{LR7eҥK5k*&&F="""j*}:|䈊Ν:鮻))Sh۶m?~7s?~NVZI&u_FWf̘]>\iԩSOq*ݴiSz04l0y{{kX.8]{ƟVpPrrs5uTMC=7y7aCgr2n8mܴI}Q:u~%O\EDDh:'xB5jƍ5s,Ĩe˖|p9[hZn] ?_h…G~4w\ 6L|j֬y}oݺU|&OSݪUSC/ԢE*-I_4iҤj85|=zT:t8c5kuVYljsQhѢʛʟ۷O?Y'xBmnIX%I͛7͛pcǎ);;[ 6n|`vjjS5~*S/\P۶mSԡC=Y1H>}tR)((Hw>律DzcSO=y-T8,Zn?|7"Sjڴԩ?M(EZRDD?F={h-U:1ځ$I]vիiӦ*&O"uqJLL_i[oS*99Y6l$7 7 ŢΝ;kժUڶm[&''1ҥK|r?_9dI~K$G7o /ݺQFXIzv*??}vS:uW<<=yfIRZ_w|?2տmܸQO=t5רH|֬Y{キ Q,**\rI҃>kРA{ԼysG˗/W~԰aCijڴ ЯZi߱ H.8|}}/ki:-XPnnn ][*z%%iҤIj=>`@xA_NgϖnWXX?_Ţ>JN?$ǔggK&LЬYd}gZjРFvڝu!!!8p^ysGLZӦMa/;nݽ{222AUm2w SǕԥ{OXkټeF&O$ kKԱK7T- ŋ5j(9ZAL>z[ep(,׺պmjo䛅q| 2335s,կOK\N~1Bk4l0`_w^+((HԧOg,~a}駟C8NaС.` _Y,n  UƑ.)8$TpiVwhJ?r@˺rqK\Hyxy*ev]%yuRYYGKX,+<}Ti;h޼y?.\Wi/Bj޽TDDڶmS͚5%I}ƍ\Y,~ڵtRGT_RVV,|||T^=uE={lM6MWVff={SN~R\$pő#→K}*.*ڟ~^S^ԷOܾ\}$)--M?P:uHjժ|g \bccҲ@ĨqoݮNaAƏ/7?.tuQwy ӧ֤Il=zT Pvv,YQFIRq%HYYY8p4icǎiڵz7H8b())IW]u;={%ܹs#Fƍ۶m)S4w\%&&A|$IzQFmp~j֬Sҥz-oWc uڵRf͚F+<<\M6 IDAT$hB=zvڥ'h#It뭷jӦMǙ>~}jJǏ׼ySEJKK5uTq_sc8.[Jaㄾ}CK.=}fU1 B J?'tIo+o뮻r^i?g"?~\W~~6}JKKeRSSi&{d 0ӯpѣ=zoooEFD(-5+r+ݖ-[Ծ}J>s_۷ŋ#MZb[)IСCÇWΝ+-3 Cڳg>Ub-IڵT`NIJ}2ݮd٪ǻᆱM6iҤIU遣f͚ p|gJOOWViQj_iNۻ5kL 4W_}oQ ,P6m\I q mݦKyyyzuViwUMX&MRnnU$ SIInӀD׻woZJk֬ѯx]wu6l.\bDEE)>>^wy4vXCMll>W8$޽y&1B=o]Z%Z|~'Ջ`|U7o[nѤI+>>^ƍ߿JvکGzuWbi&Iұc/?WvWOeڰa^~e4CO<~{U:udٴSP}.85rH}6w-_.3<-Z8B۷1d<*"wwwW޽5i$?|*Ǝnq^Zy) @ aQ:uWyș>www 2D=,Xo]7և~Sj:z㡄mڴ9q2w SתNǕԥ{OVʕ+5~O+CAq-a:v&@gD=쭲RgEaA֭]mW{%,t+֦M87zKx`\:\2pX,o_ֽ6nܨ<p rqڶm2'O Pe9R!@CBs|(-\piVwhJ?r@˺w<pz.}K`+<"R^Jٹ]kWpvIp!jx""TVVr8, TDD0daKnwv 8`84a*\lJeV,7YݭZean8+\^Qa232_Y..88D1u)#pl%m[ԤY[\2HgAK+*-u4KP.(oJٹ]Q.\ î,ժR!2*ZYc8LC`\СCڼe.K.1KkcX^Fy;w:f.zp9ۿ^=Z[v,OIIь3믿رc S۶mu})00nÆ JNNΝ;D= uIKK믿͛7+ @}Q>}*agoUjjjԨ(tMz衇$I P@@^yJ.[LÇל9sni˞KaٲezԨQ#=# o>LK.;Cpjرu=Ú4iKOWFRJJ&L ___u]TRR~Z;vPϞ=տl6);;ۙD8|MM7j'G={jʔ)ڷo<<]6mرcu <8Gqq^xEjә3ʫ^bSOIoRAAA\M:U?P ^z8p$Kͷ*yyjؠ6lؠ7zK^^^JLLn׏k֨sjݪ tUW]ܓK@>#lPV-%%%iԩPXXX!IA{6mRTTbbbnF-]T W_}VZ6\>p|7KF9JDEGkȐ!ZvZjf)&:ZoY5kuVYlJm<=ӕJ pdo$ZJÇղejm#IaH*4~}SYYYb@upwwשr K/,ook@kZ`f8eeeuUiiۧ*whw /gU׮]+ QZZZe'Oڻwo-.IU^^^vGT~p~\ GX*''DZWqYN:ڼe۬N;iӦSb+ѱ+-wslٺUTIrLcۮ];y{{s:9se˖۩ۧ_|QO?t!qO?)**JX,СVZm۶ziUfZf#Ώ\(((?,4Tz]X^w%ͦO>T[>\cǎUvǏM7v*??ǐ!C4rH=#JJJRPPۧ?X|҄'OVհaCV:(99Y#F#<}zgm~amذA׿Էo_%$$M6mT{޽5| 4H}V\5k8& KMnݺ4u4=njԨD=Я2} /hiz榄& \;wx ;VCU`` =z8ӵtR͜9SE&G&L|'D1112dn6\,sg0:u^ ~\L]Tqײcn<p|>JK] \ZvZm_m|pt844M!8r٥C4JP.nUttmߺYξ,@~YVqUeNjuWxD<X^ja.7'.qRqMەy@}^8 +;[uv)j޽VHpۯ3{)(CyEe)varXd-88c$aȨ祼c\m߽^WǷ899qv䞵]VVBUX|LdhmY$YgHRyqbe8>9~HŭeIYCEEy oy^N`ٸ/f;k;{UC.?uv, U_ 2aE,c=<8Aq[ vC yxP~Ayu-UN`۝]e:Ѱ6TqQ Sa F.*Nj[.QiƉlq⢇]X +z?]W8J %%%z7u Ga/Fŷ@H#!0d4n\>?!vb|_fq8r aٴtRp tպlaX$|BT~'6'n8褱,'n#bFX! rp*--Մ |s)nf˖-ӴiӔ#///r-ׯZv233e_7xcG￯_~Ea^zzW榴4MmY$$Z^"BoJTHH%\,hMiDJq4kmhq2xNfx8ql gΌp>g{fY4.& diId;~4^)_f߅)HPP)6|?#ŪWbFP\fa2B7SfpA6p8 Xf͜UWWvZtwwѣGVX~=wFWWpeDQ?~|F`sUry8CʑdtH og EGle+)Zm7-tJdsK~Q%^gv^0 %!ibd@Q$z0T-nInG,K`VV^m}GGnbddX P~%%%3ߏ1$ЭYtF]YOL> S3a۶mhmmӧl%oټu]r=RUN'*++qСTUׅk 4;ۊ5+wÜ9[&hXP@1d5ln/,G]ό=()S$V+چeuk W]SV†ntȕ;.U(-r]ukǒZсє B4477@eee Ou? $~aD"ׯ\.|>_"-0=\o_/ֵdF !G2uE|d,e.<}5oc/z []lur1MNk +gޝٞ"߉}q#ӑp偽2?[Бj}arrKݍwE @AA z{{100h4Pz};wDQQ9[n׮]iرcֆ7oÇqBp(,,Dgg'"ȼ4{H^*u:b"fOp'?.g:KJSOf`kLag% \u? xjZ3/d N4z YREDDD\SScǎ… TUG @yy9ߏ`0۷o^/lْȲ*ѣGq)8qaӦM())ÇqYΝ;L4? /6>?7O丄owK;u(jkQW۾dغy*Δ4NDDDDD9Àr """""DDDDD3 8(gpQ0 """"aADDDDD9Àr_r[>w@ ஓ@@ hh2cȲJBVRܳ 5EIKd2#I~^$~^H}@( Iy;m@ wDVV&CkѦ?5|t#&=kiȎpwwC:_ԱY.#- z,$INF.^{L&3zf $VnYF2u֯Gff&Ͽb_UsWѤt, (E`PdN-d@ ׺C- (RJRn`wH0)\u֟^-z$EAVd=j??_t:2έH*Ux{U:>s<=\˥;--fϠyf2l؂΂sVISg׎Xl@_d2UVF)&LiE qqt;%0 _oa2|viyW6~~p-{W^|5hr*k}HJjR;0\W @ ΏlJ&db3gha+w9)O0O4B=}_ɓC&\J\-zYquueiԠ4oȃ<[0deeQ1̈́7`OQd L"#3hdf߷#Ɍ6L>dY{lټ)qcXRِ{G2h@[7Md2(7ٽK4YQoo/t+a,xyI~ -@p1t Ɯl67yY%s99"Ѣ2T7&FS\6ʼbjhZ5ԔTTj-{^OMEuɳQdY#gC"^j`G,~m }ݻyt7&4b޳OFL<9+1MtWsd2g܄GӝEK$!1ժd ԪYpHLʻצ[@ -J( =opW5|Z tf#/x![R=ebVP$$)}L$,-S$ >IeF,l bsxeo7ȏ'Iyt.U޴t[^j E.2`0ɨGeԩƐ&V[hzP~! @ p~E]1a4lirrLjӘN@&ˉSs% WPS-Złl̹ ԯS jN?b2QTh42mAVqM;f7nERDDd*IE||"aa4mnOH@*BhTpV-%I"==OOΙKh$AFŌsY5;`ZsFj$$$"a)o@O@$Ҳ ,2\S}v4}R.2) 77wzkeociռ)>Öm[ѨT*t:fs{u CeǮi٢):Svp.Eᛣ7vΝm;Aѡ 󅛫ulAаA] k4jq0'K]XdkkU*߸IY%L{fy/c@ $Işiz2ź43/x6ܣ3R_{=άz4>\I7 Tm(*~DGGjصg(YV `Гp`]Azo\C ")9koRI\4| I8t({>/EEf݆'$ް>{j`6j5͚6FHIM#""Fl)W7֮qc h4ZՅlf)U %)97̡+@  jOJ«;3{51S\|yo;tWQ̙ق.|oFv)u#uVqq)OInnԮ]L3.ZrdDRպp 222LRIh4j\sL@E./%պV 3aQylc]77ó&*J%e:Lf z]* O"e?.k]PWy/@( VSE2 <@Cs 93օSKb]\Jdd 9J:u BRʕ%33̺L]2~>۩3l3"~Y  [,*z^ [1^V*TIh/.TM);@֔pe& &YQ$ FΥ"@ (?TZ [;$jб6՛ IZ]3e ʶ$/w@ w ZM,F/mtuˢƄJ&MVqŬh?=hըU* @ n I*4 JFB-@ D$4j5P ̋b@ @`b!@ ء %@ #HZ 2n!@ u|m@ @LY @ C@ "@@ @ @`@ ;D,@ !d@  @ vY @ Cs Nd8VBXPeպw7m@0LS*⊗""@XN5Ԭ^HHw۬Rk7 ~w,dfeKͰ( wڧ%$p5 AcTIT-rYmj5>AԨ\ WWF="&!%h)dKEmr6gYvmgiX}qAqaQf#}VmEf<郂X(Ru^JJLU寛-*]F`^EJ'"&/ap.\=Gjԯ7O/Ls&[* gol8 gn/qtlv!G#A6RҒDf<N_պk7U d}gE\V}.#8 g3 $-3IpS>A+Ml`;NHg3RQ8{>gYpV8]w~oLF<5P/oL&#D̳Ce[+I9[!,HE6+ -(ȶ-w2=eDu%˘E`$|<}puq'O &1`JDyLT&gq/j&_B+sӚ/ICH*>yVa("[" IPnxeٖf"go(#-@6f@>-XWk7h1aˢ?3ϙl(Mf,8_ծU<).*V}~|ȊY *5 p[$.EAV9w2-ː;tQ łNdW<q'q&9-s6{guQd:["!YeYnP,_IRY"(2 e?ضHW k r",+?gp69}f~qV&jr#޾cY%44B)Btt4*U*LNݢ8eCV{%$/ *I)(֕_F>WNyG(SQk1@,e1pʊ3ϙl)EQ#8;{>gYpV8]ETdfժ`49ylV,M+׮c]ڽTz=:t7ߠ[n͂^Ne!%%(7[ ߪ$f(YgYS3(#}IG=Nz]\!}\YY>?^U*·w–:?̄¿d{92s~vL&L&StdddܺZt~*/,dȲ̅s4~J}L{EFFWΓwѽg19SJsPnK(J 箇qw7_qi۬{ l63p;,lx;o_yαiLHdE"+2ٺYV,XiilٴlWyx[>JZzM^-X{yG)/Yd YN1|̟+oKEQ֯/v@@?d3K"X[(oB|kVHKM#$4>dff1`:wKΛشBu>\FQ!wqҟt4osfp"lVb:31trc? wL|aZmo<=sG~DfMI8[>TϿ=|g#  ʓgpss#84= xxW.~`^[F =:X!J76JY_[ϮŦ;EM,oeYsNdǗ8rATY|fV&~;ջýxNJBjoY;}AFF5p`AoYKPp~~L6Ѧ0eެmS*ֶJ [X}2=$,Qߖd˞f[yq Ԫ]2W$KSr Lo"<VJtd4qqy@VϜFPpM#xu"C:}2^^9uu<4eO?ZSݍzryt?Azn$נ^IKKݝ/~dt$%%3g]M&d8JKNކkۛ݇ꕫٱ OT*,Hy慹:y.EseŅժpe:tn@Lt xז/UV\xOOO*U*REd/\STZ9O"gu5g5 tlᢷX/2Okp ڶnǩӿ ׯ][n\zzlR6k iIHHM6l3mkҥ3^|mGRZռv [h$)1'8$[|woz6Z̧fP?.OzOFJD 2ow֬߷X Xo0-\z q+ҢW .\Wk!gnXdžR!(NJ= itO27k( J232^<7um,|@aϿp!zapww/ o0d2K(4PIRPwn{VxȊ.Ҧq{Lf#bac0[tI!+bccijhߛGݶ:Lf#kVO߮Ԫ+?i寯MiY`4xݹ]tgs/lUX=ď' x=ѷ/}f?!:B.9~x)bccY}fϙɤiQQ=5װ.bݷW96?Gޅ<\ jפsTZ歛ѱk{[xh$:ȁȷl1ѧs?:4̨Aˉ_le,^_{ѧs?>ܰMbaH*Wұk{ըB8b⓭0e$TO>GV,y@`p...~ֹT@ǰu<1 Q^-FAH`5 l/^?p`~pEQTy@Nm:r0'9&L׶=pÜ-Oӿ@:>hǘ-RɮX=k<6y6mwזy^q_hUgcO`p~r .:||D}hӾ5|9s,[4f.ѣlh _Axxx۶X^Ӥyc^\`IlO-yHϺ [dbbbs۳аPhT/8B@B*o~>\yGq8@VXdsOSi ڟc.#)s$ܿg^bṧG$~!3~/ƕ+W2ldڋ|#y|>{b:ߜ87'Yˮ{d"m}X^ju[۩ڹv,59|;~ IDAT>߅EY[4mє]vn5_oJ ,ٖ0ߖǖsdQy1eڵ[?A=^(ƔT.ԭ=~%*loeE)Ӝa29owOcW{E9CF 董f8wFae7Whֲ)/{%O}kX%Ozןꃕ{z( Ng뫀bksWJ[_ղ.zd_zvEumǒEK t ⻣ߡ(ٳMG*UСիWйؿMXRZu[Z짟|ZQvmuf$:JdD?ezHհ2 T^QcG2fM73axO(qu}}ZuF|!oQFI.XSf7Sgm+_V]gq23+ i=V,'XMfϝŶ/7c0x󵷬~OLbǩR2>Ml K'22:'t;s f>g{>fl%Ξ"˜W^ O>bֻك$Vsݜ,\2}"*2xL&s\+/˅LL\l10aʃٶ̯ ƒDZuG\2T auJ3%I*\~.}ө?}:g>Q#lׇ.-3g3tٕ'+]MC|\<1Q1y/y| q߱X,\8wƍe??BBe̸đ/XL4Z j󲂂/~T^Ֆ&Iyiܶ65:`<|v<2mMVQ3tP>L&#| "7TͭC\2  YYPjBKc1z`p Neзz͚wԮ[YINJ˓QcGSG23կ'^$'zg>tnэFNӃYӯ37}&08*+NUd,v:W cɊE4kՔ?/E^$'%c6Pն}cXhնHJ "a۲ޤJB|_{Sf"J9'-**sENl\pww'%%,RRlM>Y.11ȫK_BQdhֲ)wKNyڷT [5RP23h٦9og2rpKQd||Y=z<:j덢sMzmgD|\\Ȉ(~>ɈrM͇iEיZTT?k-EI zt_?[K9o|Sޒq8@6[LzӺe,o-0%wU-_ӡs{7] !T_/ou6hZ-GíhnZ +lΉ˓g̡cdz/e)+;h~)h,[8!mc&2$%?Gwa--S=p,^`bV )JBe\\pUo%Q6hݜ_bCcOHc.뗑E/fϠ7`2%0(0M>(R߿-Lm{к}k2224k٤B( *s;W_Dמ]Z A!AԪSu[;GGQQXW|V{5w>mYjAjUi8nnstхh`crU={اYgΊmn$p?ݏlMϯZ /0vrIDdzwVNcАy?'eѰaCmE'ؗT ZjDOO?~8+|gt\\e{'u겗eWWi^+U*rD%m+9T ֍[y(B.+vi;NJ g{˸t2̞GPp CF|E~LMt?Yn[:|ޓ$t@`@>ȭ;m=x'W+CF !Czv_B[`,۝'EA?r)ϡ=F ߐ<;rK8ƍ|1fL`` Օ_o5S+Mll,:c8?_N$&&g/ +[?(qȠٰfgNտh߹~E>>j=8.]Lrr2"3$&&uV%b}SVe}ys >ݺop-m{v7 ҅wXbA;ROi={[7oqu>...еggRSX"""z>?/Ȇpǟ/ [6Ɋ>o'Oq-,@Vd9Ym kfլ۶LN}QUD37[>k\zCs dEM\:>H}FE~=Xj=M[6ή)yuޑ-w=pf~Hĭ"tr:N[7o3l1}.Ql`2gVdE&4,7%22Wʎ\,=m6sԔTZoԮWʕ6thXoe,fY X/qDGp܅ː}1g}Zquʊ_A,sRF[ؑ=cyxf3GU^LuΐCILL϶^n'3h׺=+~-Zkc111h~;y7ggL}vUgcCF IA"sՑV9?{Cq+U+V:-r7wO7bHJJ*v\&~;yt%%a7{#!&&opMdEKNDEF-DFFO'IJL.Zy~>ڟ{}DGEse32_|"b)Pd ?=:KLs#S'х>+QC%$4v2v||PnI Wxwˌ*U+t.L|!Tj_DFz&UW1Q,D@P\b0F:wSW&=0jyt34n [9HԮWYs/7#3V9PkԄj@dEnúL5u6'M۲/u+ZMͺX˶_[__'?#R/,Gulc<FÊ!.6OOOjZJߐV~Ȃ/?m;z\:/,G@~oAƌfoacM5UnZ-5`ʌITF`p5kEBUm i *43&9w< tV[7~NCy)[3`}ȊBA};a "[lNm֧O>?iV@?&N{hbAL~lbv8W%%7(8s^7tdܔ.VZwfҗoG˃sf杵,|~1:׬:գ.7ϛ{^s}7:/-c ֟z`KlٱX<["Rhh%nD\϶)7}괩L6ET32nql+۫W/zU@oN g OS5̜=g*_8yP%||y|lT*~4iфw7C:5'/קc|&x,=`ڬk|+kes=r!Y<= ֽ7ws˭|Ur}odz/)r\DEDJsϙl(MfߝgXQh-Z7muT4O98]wFS3q4 &C 7Wҷ__NWV:NcÎthYٔq}Hf\rp$$.\>P.^ ߖX{l+@zVZҬ`ƙLT&gN*3lu7ɳ:V}9޻+ߪ9%w?7|eLS k5.\Rh"g3RQ8{;m}[q6gծI w՛\OwC,c}~ σwdZ'=3|ןǙLT&gq/j$^O;yِel. ZKUyYwğEo{ʅ3ϙl(Mf,8_ծI?b_C*CzGlV)zԌ"yw ?gp69}f~qV&w6"@ #I:+>^T :C@ .a尬@ :$IUlrXV@ "@@ @ @`@ ;D,@ !d@  @ vY @ C@ "@@ @ @`@ ;D,@ !d@  @ vY @ C@ "@@ m1[̜rbxpOfdgw^P @oǩ/GIR?@\b <)OѡS;n,\h~dD$fjիa`0ϯB)BlL,!!fS @oũX'bl1cd9i̔gvnٴY3(2{מ;hCa { [O|M>,u< +5_Y²%x@ [qb`4eلbh6b41Y#_]Rf<3O?[.;+G?@4N6yd4NzTV }= H-2tp豣]CrԯِoI_vC /Q~,΢ti߭//O4 @ T[,3p-VEZ>l$ϞK sxf\dsM\\sC&1!n'n*W|1Ȧ͚дY kG+\væ 7nm6\]]+D@ ĩVf3n:wFCGȲ,K(5#2*U->OO/Omo/{ѬQsd3YoX5jN|L&- ;2|qO1#yxKFg(ր֫ e"F.^F]ЪKlz}zMݭ/III|KtGƭytc'ֽңKۘ>pa?̦ 2v8[~BB{ ӡU'[jӑCGk zMCDFDVMpK/z,w;̭_!11ӤA3OABBSs6i0xy+lܚv-:{늴#>.vڱaddd׼>m۵!==Xe+hۢ=[0ɹd4a M4G^?co@ ùd\?w{G܇ZѠV4;>Ο)g?c IDATpo] ܥ=clݼ͖ 8r0k6#+[F.whN"55@ Lyh wܵ3l.6ȗ`0PnV.[>` ۳>?̜'Yq.???}//x_C{0 ,zy))q}0x >_ѣgw\<͙iզU;gMMFF_+䣭yn޸N;ٹw*K/\~qq6x'6j`{.0(5ǟ;f?9?~%oY}>ھiGB|"v|bcn{2@v{{w|FTT4s)cSUǗ?wWe@P:*@$%mVpcGؑsڶo=ELbL{^}q!Wb#(8-3h@N-AӴYv¥ lyaUh۾-ժWgŅ#/v䩓ౙӉ⅋,zy1Y,_e+ҰQdYf˦̘u֦^z 5oG[?fȰ >JBiּ)[6natڙ`L7Sg͚5VDٸ~-ORtt:T_W瓼ejծEvmxGhǶ2nRv-&N~8~Civ,_–׾C{T*?|ǎӵ{W[~hаuaނy_*U# ժw0ə4oٜjҹk"mLNNǛGOeٻ(, $" *M( FyAA Xy+MD4ёHBBfH\^3gf3s̙͇|DT"ŋw^D>7J+2u3lX_ٽgg3Z1trp´)ٲi+fvf0bc/>ϱǨ]w_c"G||lu!JOO'55'q UU.v)oqK/s,l{JU*8\$)UcY /;"0(Tl6nnn:yoS:<~K&,ntٍeKӬES6y w?ep26ƔAJrJdž$'MV-cK/ hxxr ([cCJr ҭwb_Z rv6Yd&7؏X$%-# ŲWDl6;fxkͺeⓓ.jhBC.9,4UUU /B_=/=2/<%JdI^|wlv!!;vJӰQC&N.11]H6=ʺlٰps$QG+Y}.txr9gÇѽSO\@G>t|Y>RSS3a^^^;G xT#οeʄMff&1{ȥ\jE_ 'Ojr&4^le-~Yw環ZĞ:Iz.38^oĺ-&2ZL<8y2cGxxb/$33ݻrXsgʼn'eW<ōMe+Nkm;?=HJLX,[ؓݳӯ_իVw!ިcQyfIJ˕n=.\ڹpaǍmT" h䧦pQwrO6,Q]:7Ϻ g9];w1gعC)3h@f͜捛9trrr ;M5a葎21ێ8t0S'O];qطw?Po)K wiٓu[װg? +G gċ3^r=ȇG0~:5ˊ?  @Dھ+ݩ{=~C8d`Ə_2p,xM;sߥxqwlϋpŸկKN-xqO>b!rcZ*fߏ0gy9<=a2]uh3&39{??_F\~tѧL?L 4C|f-gqLrIߞųӻ{_:^uY }v,Q:_|KߏvO3c#P̽S'O#d%KqFKKOwww-x/O//ORR.T1&r4?4L:uS.a24e?zY4;zzk?ch :O}{p7n ffeʴg$iYq%:,66p!"E!ӾeG, &wv8"""r p!rsUQG9;jʥADDDn1AE H.JEDDDDrQ,""""d\ YDDDD$%"""""A!""""Țm%ۖMPn*3&, 7 &9%"""" =3g=MbYgs]VoD5݋yP%`Ž. \%kFVź4쐮ɄYĝDq/,XmͧYDDD*e۲KvźTùnOc)ty^&1%ކKuUʱIIM&9dƞcn/ٶlCAV,"""r fQfsrRϝcȠ{H=wu9vAn.5"+Oo"˅Ҵ~K-nRd""""y)94/ f/>_Lʹ|1 /;`29ͥr[xEw\`_vШvӛY^9999}А|ĒMreord7ƾ +CqfqC ;6G|yV^CjUYz }Dv&7{_61%5_\|#-Zȱ_vSz媛i٤5IW,;:t&D%""\.kSLNN1KXJPP~~~䋥u59ͥz-‡Sزtx<͋pUvnZ~cGMՙl/^NJ(݃}HIN/M'L8ƌgE܊kʟwV||0oV%)Wa 6 ]0zmwÜ^}U~m]6f͢q㼝 ,`Ĉ>}??(]bqq v:{S.'dž SȥbnS|5e'L'i(qUq ǣyع#IICrrpْtjۅc8s&n k0ԡ-زy+jز/7Z6hNu٥Ѻm+^ U}ԬU1q4ekx'ۦzŚYYY«h܊f [⌗qoټРԯـM?nb""rs-Q*URJa2sw\Q8ѻo/lm;=FAe8uקY=lۏkSBuVζXxbڶmKʕ=z4Ǐ'-- VZk^IAf3v{cʽ,˨=.UbW1j^}h٪kcӏO>7 wX\±faԧYJ6kʰ{$%%HHH`#إ#6~G-xK֫?o}c|÷Lxz`-L2S'z*23y~$'%3t4׭bPfKߠaXo@wxulG E?>ϺbJ<Ķ_Elش C6^e\sg~`X|֬Z/pCjJ+7ŸED`vvl*U+_uяqy7ƧG o?ڵos4l԰c69oi޼9^^^4oޜ)S:7Mn\L/;999ms]/ݤwܨΠaFC  ~՝~uVԭWm[q`Ǻ2a4nژ pwwgú {Ų fCȘGGsT|{~JxQT)˄}cEDhMHHF7+^Ԭ\Q>L箝5fU=|0۷q[hԤɧ6d6၇ /ϙ7o+TݝBr`8Ž~+O9 q1t>TO _.܀6mtlJff&f=廝l&<]VZs0K!%ӫϝs'{?bcbcOiѪ߮ja=IMM'3~܅^mNjU8׿ވ֦]zz<%Koo\٘)Ul 前VWJ-ZDdd$| ժU+f[Nv14kf63)\*A.vWSߏ2W,g6ߚ611|k|}}ngZ9q<АKE +MjUrB[xq<:/`-&1pC\4lԐ\Hhk[n?0))xWܵ311thݩԨYbc>z3總Sz,Ë@*&q¶U‹U6,<,Irc]v_ yӦM;o+\dƚEy,˥nһ|8w!7M=ʙgc`DVfV2=-'8vOO;]/^%pA233ڽ+ǎE1w[8~ؘX{ϒϗraN?%ˉrJ2~+3}{Я_իVw!c֣+gN^%XQǢ.z\232Þ{Ele;11ٵKR劘Lc6m`1`+}Oųw> ܗoT" h䧦pQww_v˳k.?C9W3 bc1i$֭KFF]ۿX\zCߏ]MC,nಜN<]?X۫$ E⌗xqK^Ə@]fYaC(AZZ:]w;oO8:&| |7 ?^sSgw)^܃_2sJr2˖,/E2L:sٱ tۿc+tn: .Z٘7x޽UBotg 9%aF~{͚;"""ijDMuKM;Ԅ C*L&ΧHe<==yYxr, n挰(-<7_ǁfՃ,"""r0 b*N? /MlI֯WqGO;tZ)AEYd"""rsixtA!uՕ ۋtqf1d\DFz̲lnm6m۷3̓,""""M&<=>V[o:lنLA 5cj'I4Hk1"""""(AE H.JEDDDDrQ,""""fóZd۲yVfLX,X,[~(ACKLlbI{G BB3EJŰm%Rb]VለF0%}}O‚ &=1줤c"W&$$CAV,f6#.""r5fD.2WDD5fD.2QVddd8;q"^ي.Qm:%y޵r֛o3.?ŒqFmgYkjJ&#"" 2JHH rԭ^f [wl$'%3_k6`ά֯]O թZ:~Ize+"" 2 ==YRΜ>OOO>>Ν;ǷVfq##qڷ卹PX1g/Nb/+0j;2 g3cF>tvOST)nxɂrM|iΞ=Kd6q!Ũw׊. C]8ȘcݝRJ9֗PؘX6s([y2Zha1+0j;2  \W<8,<,ˢ#,< 0t"rܣu5k`NVVͭ~qEDD\Q[V*W 9ʶ8nOlL,999T^sl6ʗ/Ϯ8T)'Dn6#"" 2,<==ݽ/cg:^};掺{yѡS{6kʠ0t}N'Bn6^ي.1y^VZ8>00oc#06r%yckErze+"" V"VDD5fD.2ݜ[ IDATaU,fԟ~DDD\QYcJ0cÓEDDpR*nr[d1,OOϟ%95ለFrj"O'-9BFX,x(ɄqvH"""Q̃ =ɰf8;"Y d2Q͂͂&!nf6dr JرڬXmVg""""AE H.JEDDDDrQ,""""d\4j%ۖM{ҏ31aq`X 9d1t&!6>szHQ', 1 Y jU.C!'bϑ?(Ah@7Y +ۖM\B,+֥maSۗ݇$,8p nNJj 9)reB"HIM2d%bhf>"""7QYcJ"~qEDD\QYcJ"IqŨ1klҚdg"Nd+[W`v%jձMgHQ6 ǻH+~qEDD\QYN1CdП~DDD\QY_ӾUGjUÐpa:[oM-].mc˯o~V-CEVԪRw`Rze+"" κt~3?yVQvMiii{|̜*~:k|ێ߸IS&⌗ؽkͬ8Q"""KOg;e#?I6E >ҴyBK\BKZ*n=Rv-vlA˨w׊.]ʕ+xF2DǐFBB+W}jFqFmg]VaaDEE9l6OD^&/Nɓ״oٌ{Q*.ʨ_\W`vefHNN&..D |7#EfM[-\@mqss=3-nx%JИbQqFmg]&A~WyW1dK+*G`'3p(,JRrEgUA\QlEDD\QYHeՃz|y"=g"T<&LATQG9ع-϶o7"Wg+[W`v%kU{翜;w ƽąVDDG<#pvf7g ""bXFmg\dԟ~DDD\QYcJ0cÓEDDpR*nis aY,xzxx,ɩGDD0S9~(~>lcE bX4{Q 1;DDD A!x{zapv8EN do/L&C1ݎ͖m ٱcYڬEDDDn,""""d\ YDDDD$%"""""h 1Cl|44=OXHJc6J j%19QQb]:;$CO<Ş#QЀP=o@ V-XjWKj9;/IXpdݤ's,""RʄDd1Jf}EDDnƬEF⊈Ƭ HHHj5x[٤ȍbv֘r$5lAxg?ϨW"""Kb1=PFu -99kcoeF⊈.QӧOSǖXهԮ]`Mnq&#"" κL} m(>7bchۼ֥mv|#6+EVY6m[ٳv^zeތU<y'zm62tٽV:tjۅk;mټРԯـM?n>eԯـ#JQlEDD\QYb[zz_5))TZ ۄM7mZZ*ON7^UV8~n%/şPtcpMle;ENNfvдYa g9ml'r|Sj֮ɡaê+ee+ jשͦ7c:Q"""j3ө[>j70陧hּ)TVzҥKq`_X,<==9!ܨV%HO XTT-#GIOKCV+nA-Yj5~~<6.2e{W:t~իJ"L8,_%k(C]rRFVDDuZ7k; 6}{3t4ӈ&7̙ ӧY,Ͳ%Y:  W_lj'n93O?"""ݤoL{i<'5l6L@@ <3i*'ˋf-2L?ijCPzТes S7_,ς3u4_˄3kԪ]16mބf7湩3pVZxzy$2ꕭ+0j;k{V ҵ1pgD4bS5&AGDDp:o'=3١+-<7_ǁf?BzVDD5fD.2ݜaU,fԛDDD\QYcJ0cÓEDDpR*gj\P,eqI$&:;HNM`e;;"Ӽ\+łOLX"""R7maڔL:VӞ 9) Xn >5ks0II0hʚ0jH"<Ξ]{.{.:񇍎~3mi+0WDDu'L&BBCI W /J*xh"zE-1j87VƏw__j5~~<6.D2laj?ﱻFyHI97?m_{N ]+"" κléS|||<l6DlOtt y*L nSF5W(+f횤Ө:XFqFmg]6A^x9VV{tXi6jO].$4߭nI|=~]aԟ~DDD\QYUhh8VM0bCc'oyc v̴|uڷȐL!,x>۷[{?mɳsg,_%,h>[7Dv]yg̚:j*n7 Hpկ{]CQlEDD\QYػU =s>#ukIINٳc#Хxs3҈?NՈ;;ٲT4g޸~zUW[řgЦ%6bcc+[W`vV u =9; !QYc"W`v̘֘$-C1D{a۝JS,eqI$&:;HNM`e;;"1bXO7%8ñ#IDDp ]v_J0Ly^=1ի_ b5j+&Ӽ󚷝0i<={p`؇;9}4'>I=8{6H9!F?rSƞskOmr~ rUgΜK(O?]q}SZ6iM ;c&(8;yiX[6ytt$ 4CN,_c݊_ѾUGjVM9{l(]@jծ1L sfuu]-һ{Ծ5M,[NmР< C9r$/U#0n-QnݻuViTQR淵Y#J̳k0qVYA;ivȱc2fL<'Lddd0Iglg~.o~qw/Ƌon:֮o~l޴iS3y$V[EVf&O{dw4`U,j֬;0z$%&q=h֢)kè1#8{v챻t6:iϴiwsn\w[qWX,|MCԩchƦMh۶-ǎcƍ+x'yٹs' ^ 0޽{y1b#==|_|VXApp0#F`ذaMDDn`:t5kXfe_\9/ܴ~4nܸ2SLv ,og|e9994jԈbŊSO1{lFͳ>2_}eZɀJΥYatԓ/ 0(zOjV+'GRㆅqBGxB +}{ۦKwԭW?Y](J.Š!ecZiպe(V2qS awy_K g횵y;us2|p;mZӽg7+V徸TT߳W75kJ&ő#G +T<ʕc ̓^Iٲe1͜z;E --ҿ$&&xyyjM73OԦ Nڵӷ]!C;YKL&{̀>ܮ Ӟy xfTkB=p[y;3iմ #=?vƜ91ЎgMf˯ӾeG g fپm:iτظH<;f/gGٺ':;seשUVw1h@D_F+Gy}XVbEΟ?OjhҤ gΜax{{j۷O?eܹT\Ν;ӰaCl(5f~.\dbʕf6mJ*U;v,3j(QUTaWu,1jiw[*K~О9z+%6[6ӧy("""nce29%bpvXmV6C[ YDDDD$%"""""(AE H.JEDDDDrQ,""""䴴4RRcfee_d_Iۻ~$'%_RΖmɸff&ElΜIm/W7#QuϹ3#0/;;)uJI9GZZZGWE8 3u߭+TwK&Ssguܻg/ϲk{~KϿx?:tr>'wq,al __w~kԨTON_hѸ'HnTs~5^z?S{o㌺ISIOKjs'Y;m߲=goߝ3k.CsCer';p(6 ___ԫ1ԩ[:l/T90oT\ {!+|=09yEu| TPRE]Q^Aרk{{oc++vE@@E.,`0<ѽ3s̹ssBc1K[ӵ{ˡRRR;jFж] i!]w0jb~/'oSmzo:_`nܹo2m"#ؼwSTMMM-nb+V C;r|g.k>1w<.HBBIC4Amdܼq^Wq}DGRRRX4o1 4sCY$M@rR2߹M9[lra4pM \u6Q%+:(ӹr*s,铧EׂT| In?Sf}`ҕ~CpsΉ+ֈa9-h14D|F;Hڍdo݁[w,g3+gNEo31(n@ݨWx_SSSKKK A}JZ ckeS۱.jfѼŤ)gU3Ap 5W2g,\'111XQF J||Xm*ӾS{Ξ>+@[[mmm455Ʀ m߆Ryʦ./C<>eʖL37e+[nť \|&.cMVRL>W+V)SS3SLL{ ?d朙TXjիQ;J)6ZT 8pSS ꏱ1ÇMȣtILLQb2VȈ4qiGŰb077===oNmiԤf%Ξ>Rǜ061T)sj:d:A؛lv܃WִnuikOFʖ+KIXY[ѹk'QUv,Yjt֘w@"##-TgCi6JFٳګXn3(ei1֥)aXZNb?t9annl@ef}m?Z-i^%iպ%ժWuĥ eʔv e ̖wn a8Dڍ7OQ.[ +k+*VHLL yڱ6ľF!vU°ڊ>=#W.˾<7o3udJ抃c Ν=/761X=8s؛0^xIצyh1YYBy +gϹ|(_稀~t~9Ѫu+>ӧDWO^{ҶfaԸ>yF 'mJe'&&ƍ/AM>^”|c|D"jʖ+C`@ vHLHvZJYmDŊ#mژ#]ͫnS#w6sa΂,^y3bpy)ċY\xd455j2 /o\LD—/_\vX"QQQXY[)&ڊpA`U 66:E?UٹKU:g%HVoMtdծِ(CU3ۻO~-_)'Qz5vn`А:.o^.T*@SC1{d:4E1}3.m[?3kܶ}ڶo;r,J)ReRǛ0U)@ E1+A1o40>&#֥ :roҫwOܚdR;H`f˖҂N Bƺ3<7˖VOƹ3߀&3WK7].;"ETW"R`ӆM4iOV.\Xids%^i ,,-HNN&"<9]Je[¦JeduًM;/7zvUX)s$yuGpT ŋqC,J\ۙISO$&$t$2pKYd K ^ΜJ#H{%gϜc޷ +6$ՕE]Zy٭*剋̨cXr1-= ǭIv'D ]2Pyi;m5l…=ރX4o1rEvm\x&.rE n *6T\ 2XXZBdd$~J|=G߃DS޲"% r^*ڕhC  ߥjd̹U{N2@@~3 j(Z!=7A 91.012Cu)& Ԫ#!=cԢT)l[nA\\sf%u($'g>:w`eItT4x@ٲewCs#<,B\Ȧσզ5 lߺCa@̇E{L8 w\}Xε?z>!_-y5kVM"#x>=22!IJLM%455 K"))}x;v:Ddd$^R:B(QVNXXwÓOx9sfΥvZXXVn?u & .iMH$lsUeQVevJgyA؜^l(풁vWvmcmmMjj*ǎ#<,\Aȣ"#JlDM愑n6늶ײcK,s_!Jy•zܴۈ~ǙSgXf헷7 OJ6FMބt2/ܭ9 oyQ9Ϊ*k!s?ϟ=M*UMll4~2O<%*2*Wt+kV%<<_esE;ut^xI`֯n?uP}>P֢zHR)RTf E H RADx A?T@*K_Bx MTf R2JAȒ.R}źKdeFPY)d".APsxI03L| dެԭYmٺe;>#;svRP!:wTvghߺ#ͽ_8ǍkS|Æ WX霕i~S~5 XT3ax.ZF,G'GW(W;/|~[fԫ_zs}ni޲9%J`<~kxeW{tRa]U;[Ν=k#7Zu;/+ް K+KHܾy6[e353[8w<[ӶU;<'Z=PAA!)ZTf-Y͙.e +d25rG\t%[<^WhѬv²wg0[wPB,]Di5˜Yh-~ʄ1pmIcbTfNIK7O.Ȧ?6pqmܙY 04۔!Uv ';HlŦ 1iD\\`æuhjjҥ}7<\[7mC5ڵoKbB]v6Z/V[AѢEi_tѕP}-I K ܕ^"$iC,e A""J,B|)$ݹT*E"f8 2YAN,,m,Yx כZOTW1tm*1bV8O0! E(rUW prȅgrNZ]wc_:k6*pwqkb;os\@*UDk/OYe :C HH44tgL'0'fga;,u3)9P;2t}LS"O#s< ARe!(s(C$׹d:$i!ߙA8edCpl_ĩr~w !A2F9s^& REyn֑8#|bc(_ttQ\TTY!d+[92n reDȌx+Ϟ9b}d !K (o.ToX@%Rٜ[ SAUMMqLwA3Mt|;rΨn9T RBvi:)8ˏ2+WSȚ(]L^7#r"666ۊBJJ W/_ FQY@ߒ4G_|o@\|>|{-RKq^8HI, ɑ A?c('iRb+c_ƿh IDATD}iH4sFH˒##4eV2-:A2#ܒ:#Ƒ[PJܛxd +n8vn~`Yz]zPՑzN ru`>*036XK#ؼw޾T!k*7R8uU8G©mz $ 5:|W?RRR;j{vz{#?Ѻ5]wAO?i:w9M9lۧq3m[W>?'杼|67Q5׷w7_aRAJ%,^**vm%:WƶkMMMցG!$i 2):ҐDDp)#/#ry锱WTFJJJz9;i.RN:Q|4G${:?rHreiܴ۷lg1yJC/oT*ABGPN G]^015;2+z#--M oοq^7x]{ȶ>y%2Lf Hˣ&HHM.ITIV.|ܜ*mײ ,GTJ$2@^^ɪʼn)gˣ!b{dDM9[^<!Ze{aZZU|?6o{gF>~CpsΉ+(mIx9g{lҫlI [G;7dHWq-'LTKWhps 2߻O6nSzN pU|6b_Fn\tU {0rAӰNcU֗.-T ӳovp͕˲|V.[k#7:hĔ S6M=عm{4w4}Ç̹Y"Oy2ꩺM ܛz뺍ғ4Ә#Ab\u}h}ڷ@t=rϬ|rؔe̝jݔgTU4kNғgO3Og2PSݻx]4G;'|SYֹu |} RyYbt053̄"EPfƘ]ȷE}j֊(tmEͪNx4mJek:B7ۈoJJIݦ8WsfȀ!H$)d䰑8UwI_Ԕd$Tބҥ]n#v(sUxz-jרôIHH'MJ$I]z <(1٥5:ѴnS._D*Ҷ kзG?4;5b9HKV89><{D :p( dK=WMnXy{LHg|=vs(OVbX}9y81fZΞ9ǖef9≠Q,ZCs&Lrr2&GO2iL*dM[~e׾VUܼ^7!w8z2P~+\|E\x5lVyI֬\K#u m$LS.S[7eݹ}Tܾ{IJo[3q wllN?GzqN^?r~w9嫗knmٞ2%%%1idƌEk۸###APپ4sw%.3ӏj}:h7i؏ٗ qQ~Hד*bc>|;nSԳB*7HHHqnߤ#EMhEx;7s0M\3fxIJx1%AVo\ ٵc70oc'a^Y8g؏ =G'eTR9rHLD*6қ';i4K,jڡA_ fT˔U(GIxlNո| T?vMJlSsYvMv^m߆R̳9yg/'۴mmm훷:c2f%pusΞdxHhԤ<޽{*\mmm .p^zhjjrx+Es|G sM*VY8sLCJ.\XϞs#&QByj׭ڱ;O)TEghiiQV"V׾bhԤGeTW.]%t$%1+k+:tj[s7ܵ')SS3SLLmnnNuvj$shbSBy [%11ׯ^' 8pSS ꏱ1ÇMȣ̯,-066ƺ5% KTI|Ξ>]5;پe;ڷQF4c/8{\#"Ed6UH+W6RLWVvK+lx5)))XY[Q°~DU}>y2sL*T@ըf_Mi92(i^%iպؗl۲V[ұKGUC#CLLqtru[OAۖmq)^-Znť \|Uok:PŶ *Wd\zb]dE]SSLLM7P6^|9,,-ӿ |R==%>XQFy>m1y7AQyT v܃WִnuikOSgs9饪TWރi׾--=[bemE OՇU*$5߻.A*U=ѭOIVAWW7W)R2*(*PV *o[7q-i̲ˑIToVڶ"'LVaaX)0 U\u]\p"qx!>Cx ܼq W%`lb—/_MUaϜY` nMs0ѼzJ՜2rpXqMg^QINNZb#ʘ=o pkڜQGHV3m_~ / b_%GQmuaUP\=]R9֥eu3')ZTG1.ZT… 6 Ke}ݔQyrz(#.Kz~?.oۨj{@+ȺxIH.AJwT^؈}޿{&+/hԓ֑$},DPq'!K+ ao)R0&&=KkK"#ަ .B1b~uᆆ%1DJt;ee$II}̛p,,ꪬF%R"*}-D"ȈHduM~)}YI3T씡._=2o|&OE)_1(n-!/qZLl~߀x6@&H_3jeelUʯ[GCu)_Gr}lX-M…=ރX4o1rl4Kព&ZZZ 2,,-IIIQ/_)}7 >>ĄD+-=[wn q頲}qkƒK9 ׂ5OҒN*,vx7Q u=ZzuKO;AhظN-W*cmh΋@ƍ]U,,JaS2GZmԈg#e9EȡB\ }#KR"0( &~bug`Pֆՙ4v2񖧹C,]7G:q?)lneioldߞ vL?OŭƊ%+te077GfϘtX^½;g̡cn?ueܾygO3c\Oյ8<HsVP!Zzd9bʃ9~S6GBT*ֆ/U~dECC2et$o#w+US'N勗_ f_Sl+T,O%Xl%aᄅa4 ׯ^˗/ad,Q׾hii1p@fϘC:(UJmٺ?| ބq`AN8Ep{9HTdTBP'ۮZU,,,X` եVg]vN2"##y$*TBSSqqlɫWYr-oB9add#nXXcݽ#ADFF+^zR*b#ʸu111hPlqUU?}Ə!DGE? .{[%^mZ;إBẊE{L8 w7)C-c̹%"tԨiϼ x7oǦ&=]WH?9sfTJ6-9t0'(^|WHR\C P^ %Y 7I'өm@6zfe/]:k.jKԵNfosAKKKiܜ4u3bT?r fNE;+V羽aǎ;Ѧ-|ig& Ŋ~z'444ToVuh ,WlٶSش7,,YfժV΄Yha``mXN ЩKG֬\+.jݦ5_ʶH27<~I'!ác ga h̽}{ f\l4,Yoes|UN}RGnmDkWhhh`[ 3fOT#`U,})cc#~sն5L8/_Pu[ iѽG7+ۨjg˞{9ߟ%pm撧--_*{022bۮ?7{>[wD*RҼ\nӬ#F2s,RRR޳cƏΦ<_kSP.נ.sfeDGES߷mXb/{0022]\U=cEVүgѴtĬ[oV+AҧYdƝ|6bp!R)VXe5㾰hb"ޢST:NT*gP_=Ta &'$K<˖ Vз+JԽ}"BdS:3zud(R2rp֯@t; ;7V04*uY`%{whxB6-C>ϚL>~ûVeEhI ݕկhlX/x6nOg'ۼ& GJy_qqHҘ5}6Kgߴ|]r|&Á}?r ϟ?!lX+QQ۸F}|"S1112 _oZRwAq l+}o5 *ޟ2 P)8eVu쥼4_p)xr+!8i ( (!$GbX'))))\|HRXTFDx駨Ð\_D^/o')))9ґ$&$*9_xo~R`_Ͽec'e[pWIzqow曼^Чg_p"Lؔ6fyecI <|u/m+gK<{_*7mıtҰsg͓1id>yF:G[!Y|uuI)}y><7̛5*nRRRf5[Pec 9Z5jhĕS IJJ¥ܐVA^v!qH%|}6)([E[xQ--"##iR/eͥC_׷>q$kVWa[ՖW*b]ښݻ>1w<.HBB?b:>#5n$|~dd̛=GCXjJ(΋/0/7G[-‰G]6'ϲy]RSS _a_7p|*VDd[s8iy2gH~/RRR B)R3C%|?LLqsNo 2{N:&_:qߡǠ!OJJ +$R6;~ Zd#|ǎceDDE)ܭ$M ~eŚ G+6nǚf۔GJ\ |&^2cv؝G!YsWf̚.:^~JJ5Oy7f㧔PQݾB/^!zueJc_CvkDxÇ 44/TTаQ1}Yfv̚'(S>ŋpBhٞOUHsw>ȣ=s7ωOEVʗTKWX4ooBÐJ\#̲UK>ur((2eKI*[ 򆇅3l/a|+k+̠N,(\x}y)s:wL6-Y7s,|Bre2}hgr>~xq~t3n}9y-Tp"&Lrr2-Tė4x5144dȀb}eSc:W ;GCt2~g1udN!%9~sei?~\ˉSGزwfӳk.9qHJJfej݅m[fjgO!pan\,.Ƽz*VT\1ϲrc 97.3=8qnIrdR._¦-k<ݐ;V}dnyvOP?̜cr7&kа>'߹t!sk =mgd~Te ݐ;m?ĩ 'ԞPشYSs93mB*s[/oŸc8{4:g¥t AУOL7DټR'g'g]FMP3z(N_8Qu|M]_{wE}q= 9EC(Bk-]JTJ=+("EZXlQZz`UnA 9fD}=}w$gf% %//O@|yX}Sd\\|)gBd={zWu4iZJIlݲM)zWO铏?'D}lY_iuΜx >4xPtdUWW?>_wOVaQ:՘n=)7/W ?UW|$۶'t変٫z魳Ɯz[䉧tƙkYgSj$6v[N ~ 1JAG G~KfLedk#Uއ=L:twLkV}f{=3*,*ԅ\N]Bnݺsκ4h#$I-֙grrst,Izu2o^NEջWԏOڭrrUXT ql:nPjZ}^{>ىwJHIBB n+>Լ{02-y"׆~F­b(7/i:jW.ݻWUUUi6ŭ8Tn٦ӆ7|yxڴix|d b\_ ̞jjjQ%7%$$ _%%%+++Ӧ6>ߩzwҜ[nҌ#=vycٻgPQ*++;yW=||(RUUmq8[jZ3b7343jjMzJuݷѤ긡Oic5z4G<ۺuڴiT uꘕ*Bf]hM=VKXc4=~6Uօ\]- 9=P ~@;vh sM^FF`%)=#=8;SWb%''+///xK*)wH]|[򀜓FpFc%$ȑ6m(=n֠<7m|~)]xx:6͜=#6)$xc[Ee?j[lSnN ܷ{ť/4yxzwÆ֛x[) 7]NnxM9S-?kS>={gz_K5s, 9ks<uQ z3X]_h:Uڸase,_UPU1c5 _555*).xLII7III4*]6Ry] ۊw}VogΞw֬YsXVmo,ݺkutT޻[1SzFzDet0~%wPe14z7"~nls\'V-;gŔ_PڈÛ?R ;-Ï8\3UkTR]׭ouGPeHc}A%%۵jꈾ‚=ojbz lYT[S {&r,$k Nڵkk׫FG צMuuVh'-o5z ںeKԫw`זI%%zWoQ#%IgzV˖.Si;͛6K~bֻyfm޴^t(zvi'/֊|mZJ٫,ˊ2arhtθsǛ3X[XƝ?V^jGَfHykVPHVnLeK.Zto/icgtњ6eVZ"G㱨Hkm醸y,YF%%m[}Qn-so_{Colޢ6걇)%%EEb%mq9T&B4h}'z?#X2clyj=Sߠgщ'w%$r~CWT׿W۶nϾ7_S;?ߙ]|kjçg]?[mL+Bƞwn˭҄8hooC^A,K ~{8O>OhYgh-/Dr5jժ&]1Yu‰4疛_ߧ_Nlvˆw]=Csn;Qc#vZȃ1_sلK4mtvpݯx*.Eڳg4\IxԑzEJKK$y6e^xE=\="ͻf=xBSNmwEܵK?nv֪P3f]O>1o%9m32t4%I'|n3Km/ٮ3t変[ģ;f=&MgNS?BNOL+wm<$|?˯L{ܱDËTyڶmc X!5Zp߃s+7+'MTRrn5GK!ܬqɹg+/fW׌Yu sdS:ZcNݤcղ,ݷ7;t񅗨rW:v XcNn&OfUmmdvry,[Zڻw u7+11Q֭ZSںeէo-|Aeeulg)%34{ ;uJMMU^=k?pM9MwyvPzz=PRc{qc']҄K'FY%Ļ'dffjՍᅏ@O@[Kh '۱^(lV}ڵB[K_qϣU/HkFч+)PjJ ljX[KhP!Jk&y%);3G}VmD/`sfTIS>YXjf@•dY80004.˞}{TYUZ>MRS޶RbNbJ?/QeU4oW~-4z}L z}zf9ǑeYѾ9dY9uׅ$wVǼ([jpyޝy0:=ꪨ,O!GmZG;wjuֹz8#)\0w&x_+_oè }7?yKXטߏ:[eyJ:[#,ˉ޺X7S!3L@ܩݔ6]mWrCCȲ"¤%Krl{r"?9^voɱ=&?Tza׶m#| {8z;"V5t ťԵsWegȶ`e[yscKlɲt,un&4%Fnv}吻{]oڱmu{?;r+nv减 u-mdpٷGd(dG<# nE p<Ζ"?dz2iB  x6o,?\=^?ێ>r i׫L]#Gmku n]ٵl;TTJ7l V0/ʯ8;K{ˉ,[I,zQ?m1^֟LٺUd?"gk#-? NW˱Ge' ~0Ɣu6E IDATB@m #+ .u[!$UB۫({T˯zNBx<^dd("5ZBWU2?p W0D.ߝEȖԩ{kcףm8 ZRxqzQ8X"n`ۯ[±?`mV,ۖ_@Npî-'X,߾a Vrx@V9D?#8>isZ?KY -f  kVáTUw\sk"B?r9IoɜQEvbdw[ʨW9g7 ?{0+(;{[3;$t%?Ine~3l殓[>xS}ّ` ! Fَ-> )0WR8؄8*ɖnڄp)qim'<a=Vg[{|[wV-vi+"#9  /?(B;n@SvES/:Erosf/u $9 ޸џ޲,⭠ r$Pm2hm ٶ[pls˯Z4nnpiP{@[5FNmYu\ Bde+Α7Jl ;2zr~`yV<MW#xLAvQۈ:-E\s89#-YYPiGΛ  GպS\g޴ѶᶾrAD0EDp_dgF@󟫨PIv7.;^u9;7xV.b ١wҫX[X~dmKqGZZi($?55JLcvBvU.#mbmfrB"fT;R_lr egg_[_^ͺP(Uz0bDo=p9n3fhe\ZbԠ_QC_39] ckݚuJmNWrRJK4媩*)ٮU*(,Ьf!H*+tۼ;QBB_3]|E.җ_mqƏ4ګWG!{\OkŢ:,Y'sK,=ժU+sJl(I/줼\Mt9\ Z*wuW.5uՒj=it`M$@h*u[ۻ˶m}FӕmŚ4j 8swҪ²ժU+=];y-_d]3ihɣj]g;o> ;UOVQ">gx禟 /s[ӤE1pu{ᆵ}{qlUԫ0_Sg]}ɁC8l 2h|ն/B:(1ђ2zv3juJLLԥ/6nؠ}#f '7^n;KN?sy:{d1B-mb1kTQK:FKVN+d'D{OԼmK Zgm˾vrWbbbwW֝J+_Z%X :e lBB!y5))YimT^^Y]{ZI7θ] GٻB!z(g~PHm:e;2/v|~Uq?cqC4pБ/ИFXQGz@"^G :RmWid^]OXt6'$kP,KRLԪ4jܙzqȽ8ώܠhX|*寿cGUJKJ5hQrBw 7G'2L;vМ7UbF9ks*>w-! WIcƍREE{w%ITdI(%5E{_m+䅟7^Qշaw-bgSuuM#FH /TvmTXT_+S22ҕ֦oΝh"],"\:{9Z9e9:dejuzu©ԧ_of[i7\[f߮ C2v3*SA-%+Ȓ4UPyIHII޳&\uοpn6;|@34f(v(m|x;[_M?Qڙ҉)11AޠU[~vj ՗^կYfƮ H<۷ݪ']{n*u՘\x|>yՈїtF ozJtQ{%ׯCU;vkȫVҹgk떾dи b \?.eixA_"<p#~ҤZGU9j FwonoВW}91bWmn֝/?֤8 ":grwڴi{_Z3|>'+G*ն-VNVNܯ# Fu-[rrs6ݡ=Uۧ۟m|v%aq )Aڰemz_+Cmvciڏfqt.y4aR%@tWC= ]KQG¡MB@ d@@ d@@ d@@ d@@ $i;/qaaYIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config11.png0000664000175000017500000012442013203343610022320 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Eǿ{%zKUzQQP+ *b(bAE^+"UEQjH_nw?.w\zg7>7;'QݺvRKJ@ 'vK*V(G)NR(^1ږST^ ۗZJͩRa ?:l]Jr+XW˨áܺW`g_JJ678&f_v}ۖ~,UJI#?h֏A- U}뫰}u]ZiUTd8TWŚ.=qjUjM(r3%`b۬ZE RN%gW|?V ((>tI+O@ @pݑv$K` |kV@ @P\Ύ?vI:kBUo @ RT__!@ 8T1},@ PUF#FYVPFVEťO*CV23s0H7W3oBQUԴ }J@ d2ðt@]?oBܹ˹+Ke xx_ֵU%,c0䑓$INRLf 2$˽ʊF灉i֤1999|)̲s/FѴ+YȲLPJUU3ʼKs/V@ nyy$!UAQPII%>+;JI͵gffU}GJjjAZ?\]]*]wAFjEF2;_Ys_|-^nU;33'MMfrrslgM,AVD8J`Oa1X#Fd2~hU+ uq1<FC3UZba0HLJwww..H@^^yyy$%kţe@f>? ??DEb6699r F\(321ˊ-xyh0d5`ϒv nz:@BQ 7@ф,+h4Z_OSlEdQPjzeӦirGb24mEUIJN'(NãEj/@p-*Fc/ul.;ܲ 3лyrZL ZmWd2'nn=.ڵj Xf ~%]`@[q!:v˂Epw' OW@%3߯ i6~^ndd0ccDFF텪9vEW&TUL~~}|Rrr6]:@fV6_͹c2  {qBlE~U^{YՍBqY~B>(@*_3@ 8?&9\ 1Hr@O[Si9xDx"fǀp/p,rX y(Ǎ%ichӌ0YN%c2i _(sFӒǀ[oCl6#&;;-?oh2ӺUBukӊ1ɢ i1p1x`?[~-c2˵7䙸wBi*>>޸ϰ7nܐ&coVHP{W:n@ L`(f 2DxpJ.s3man2 zrz&lTz,+uztz=[6'#=r>`M] -pEQ.cH;?Ztӻ;o̙sO?ͽ{O 5zDZ6gEhL&Pu(F]:w8r8_R3A||`z:Q9%׫,+ߛԴkmY "vPsP!~<5'smu\: N )%rG^Qd"=QdqOXh4 l* S EbDZ `F$EAӢ( A<|Ȳ̡#G_nP/RӲ *Xfy3l{IhdY)5?/ψ&EQhذ>M"zĝII>zE,QUՄјgKS$[lҒ%sFj$ᦘ{*B!2fCGӤa},]]8p&FNZ ]Gxj-ǡ4$'F164jY+ Nñ'i߮5o͞Y,_$e9VNT$ s||F&4-xѐkLV0 ww Kc-^wE6{֬Fգhpuul.nIY'ڵmE7ѭM;~WgE;s<4W/\l*t:͚6"33@[Ntܑ}mHX^@pB,57_`CجjE|,Z@4i FȖfyT&SnHsW#Mwf<؋>4YyHcK,*3?.%Y~=EQ #/@FFmes?!nFhH0iW9w>FEO6Aߛ{!I[mgOqsc08 |d%)4k‹OʕtY| Z֭ZHgdNlKl݅EW2nh0ţjpssaҕL~da]Iӝ6TbY V1Oz{043&bJJo ij|C~I6պT8uT'$ ww4hHnnfٌ2m4j.\x*b&!τh4:w݆<F%ukqKϰ̺Wiyyfǘn/_wh2-5l$j4*0e K$ 4 ^YV5ڟ.K]_ QU0i RC1Ѹ{nͱdJN \y3 WW h4YFBChذ!AAH /]ILL$''u; F޽{2tp|dCk@?,@pPd +&JBӓ!y7YZ4&ɔ *NId4*$ipu/@ ,TLɠk(e$Yb3y,![ңVfs_vؖFN jjQ$޹GG}6=si3QT46ٞn':FZb!@ AӰWawu$ Z^$U.έ[,@ D$tZ-P ғb@ @`Xb!@ ء3/%@  HK@cXM@ jMM@   @ vY @ C@ "@@ @ @`@ ;D,@ !d@  @ vjZ@ ͱ3GOd2ִޅZDogM˹1䐙hPy77|p{G@ 0i}t7MЭu/=}jZ5Jfv'㷿}Դkр@TUE UƟ&8Upw,Hv8@ief@ l $NPu=|}"ah[$W4EQPTP94_/?#!"@YcMZ-ԭU77 Fΐ,ˎ6qCLs&-Յ9gY⬺j/EvmN_CiR/cg>u3&Ax{2v%IBA:U7$@Y0HLٹY]iV?gEtrXԍ3ϙT'glzgig[|R][DE ֍kHLn]a4h$;#dE.>+bpc&;̜ $IEJè&s^$$Z5nO"g4Τp>9>g,8_UWMs=hڇdϵx{`29~u16XI.$ Y13K(%UwJ=ލ\c"c$||qsq#7_/_LbϙT'glzgig[XP8qc-Yr~׺>UFUTTE,P%$IBUUŖfΈ/#T.@6H!Xfc(eseaq&9lM~qV]5B)AxPu7`Vd$@e(e:+\U{Gkrrpw ېeeW;&Q<, ?gR]8{Mq/Ϊ*&\W|_j( bYʖ_IX["* ?ږHT* :22E *,?gR]8{Mq/Ϊ^źRs% .Ҽyju<(e-dEE#) [Q2 R(Ԃh uZ=b0S3"Neq&9PU$BB9gY⬺fQF>Fv˵( ))WK}=)-h<8pvn]s2d`VXooOڿޏ Cz`o5Z'mT{,kǵCzY9xyzV4[`龌*ۣ?iiW>͐k}nN.{wV_ujhm릟N_gײGܜ/W[dd2Ul<;K_eYlqpq&~Y t˗w9ڿKHtBC¨I6m2y O/Tn萡EA-3vm #iBCˆOH(qFk@hH֧K,223P]^xZسw7lBH3c/{PJY뽚Ǚm`+eeYUzdElYZYmUd{U+ViW9wJ0{l8eyaƋBZtՍ @Dd8#F ӣRҽWwwgлq0֯Sڬ?+[7̪e9uz= 5G&ҩK2myZTUe%:S [oS_X4VJE}odfdBxxʃ299 y{w3ݏXxEu>6zd۲q+psuiL3fΦM[{䑩1춡Uc<{xJ7s=>uQ_/'2ϐbo3g|D6}k0LxU#s~R]zֳku?{ڍY;vdz%4nڸLMe8q˿\^e!E/?X޺- rj6V[#w9 d2O"<<ϳb r++׬G\K3_Qškl߱ڵkpګW_e^} d ' ?s<ɓ'YryU#0y#EuϩۖXTusjVuuiն^^E[$$rsX:mFPp -P>'7eVnۇA#QlMr5bw#%#ka -Nff&ٜ;s yZDpH0L|~[}Յhbm{{^zY)+bOwxzI$ISU#-OʥyyKoPKɟX۫HojJ*? R% ^Fe<2!Cw8FuϜMHh<2o*`g+Xg;i<ӟ}^pqF:O:m,}4RShܴqdffd2ϩ;Ү0e_a4PeQ_yKV/"<"ܖÏ[g4\O/O4 J]y楧1~ޚ5.jGEr)t K{=y wj"<"ԺdEΟ=O?I]]PJCE b_NUr4YY2G|Qu4[~RGXX(aatVSO<_)^^̙/|rCH/_e߷=СeDFFX\j  ,43l_@Q})gsHHHm5w[ n֭˟vҡ]Gf ΏdUK./oO>a[o@hh(7o 0_kq_վ>V7͛ݼYa%UUI#99 l۲ ??5iX "@dس{[6oO> >b<ܼlU.%o I>~ބ sd|\]](̉'آ3&EyaƋ 3m{GQT<ܗnc~a2Yѧs d#OXF彷ѱEg:茢My|'ޟ{3IObtˮ?w2yy>xC̭=m9ʸҵ];MEȂ2mT&`>S=FhX(IIo|i;4mɓ'PU_m]vcOL{g{N˖-chlZWY gؾW6[ LzFbk/3\x {98²K  (Ev=ѻ-[w[xrS$'')0zл-5b(ZZyo#O0`A^XB}زi+#kx;iY9=PK uև,3*pr"O?o$," t:pAyD{NCPHal\8 kZdE)qՒ}FeuG~PɤG'oxe|IX 0 IDAT N/Ȋ&^2_9Ndѧ£?/ˮ iޜ7VʥD^yR۶Ssт%/|ϛuȊ{sާUVۺV-q&e"󏿐eAZƺ0ݖ$VEK9z9KRS0yc]Ÿcy~K;r\8v+>ЭW7"dEy=\>Y 4~$+ ;dÎHMI[<|?|<~@-=.EaA%7kޔ+\CVlF7s)8~M6FSƱ\x;CVS_;w'^<0y_['e|w:r[ʯa0 lcv8ܺJ:Ϋ6.Sa2{>=hiUt5km;eEM:r۷md6[DFVZn΢ n״n׊WP{V-][yw=/{O_xxy*ccWAei xeJJ_wʊBᄑ߶1=4j҈@UE3X wj'==e9Mbe-]4="<[/LhP!o&?OtL i2aDv''ObϿɈ#%99D /]aFԎWlY//oV._F2lpؼiMNN_hҺh:̞{x,Kmvl3Z7wwN(n#DFE%IQRSR .ok.sK>^_vX.ݎ/խ_O:(Wn|+]w?( G#eLQU7wS/<(lX;_?_OKRbm  ={V/Bj"0(PĿNK\ ?Ϋr9~Я&yHETy6n=fgusONSe]1-|2I\N?'){"2Ǐ E4OXD~~3I\,&:V[yYE??ԶIRsrYmZEQl_Ϊe?>n϶}:ҶC4d;onɦ+4Xj4v'}UUuVGzV}+DZjoEM>xZadgeӮc 1&# mHKUXr LF AUKiHNJFU갶Q~m!K,c\>>ƏGuT_|oahuB6%y&&?^^x{{ֈ]6Ǜs16uۓ>za||0hն%jb*lL&#^L{YM%Jo`\Y׼YZǵ?kn,K$ڇ ?l]Ƕsoϟc͟U#I/.iU:)3jEXdQQ-K(}}| e㏱e^}Uޝ.xxZf'NH}pquaPUw222JСhUL5⻂HΝ=kKe .Yj ٕ@Ѱ>|}}oݦ5_}%bG3vؒ}iPXiݬa-M6dee@Qb#k罀?QU8zQBU4k;2b0zfZWqssa:/\sQ{w7wbZFp?=,%K\8)n8 en)o$T`V͊hǵ?ѥ{g7k] BBh$>ڰ6nR(]'//V^ߗ.,)Y~>$,VTU /o/9=C@?Ͼ4L+Ͻo}K_(7_붭P?mA}r,'EQ"%)~k%Zgʓ0j]s_BBؾwdY{>Ji4ϗsgm=׶C61ޅNWٸedsl yLF/'T' ߴ~3ZbN]:WkQdnCdgk1hݮeKUU4 Zz*87vT$oXV/,nk q Zf˲㷝|Z>uEaF,EQBQUXg+ myTw77ۅ@:Ԟ{<0yo`_>8Q4ok8zK=|lcr_{اeefڦu |Ub_!A*x׻1sظn#4i767GPu*4UJ#dt.:.ٰ~W.B~Z[N91t$cǏudeeᎊJ:7~,aaxzyNZb:.Y_AVƌýckiۆpK+ZgcoobccIIMitSbә>I||K0޵-[B`Pii`kceE X⍖mZ2ȟU)Oe]K>Imf:0(.0f W&ۜ<~g=O[b{Nn }(ҳ̲ƊyRUU$TjOރl4 - d.\_w0yc%U޺ ҰqC6=Cbb"6ş,eϮ|9cG[>hdA,YCsYޛ>߄_}O?~r pp!RSл興 =#LTay}s_ /{VTc8y[6n%11GکH~_wp1"Ξ_BXD(=oNƕt>d qqn#oTJCFbɂs7IIl'EU723x{?c/r6ߌ*lZAٚ,ZEٚX+:#xbW={gϱuϜ?wEUإΜgO[?VUApK>,h1ڵήuݕ6Z3ݏQT7bl b <~PvbE?Ě_oPrmͲ l"אKT a&~+ ={B:s?_R][h:uȦHϠC(BΪkإji  \ۅIQ-Z#ضW.]=/CŸfTTOOOΜ>!π;pĩjK~\)Bhx{w僷?~r \t /0wpqqKP4k=Rђ6VGPP #knL}14ޣ[AY+mۆ[㝹-_'p ## -q+߭[~w.o1^{sa>b5vZKc/#˖/A6x8=g_KJr2x-ݳccK)7Sڥ܏m[~D. (B>HĊ%O`_fk=ql3?ȥKX<WW^4Z 0j׉՟0zzMc5Mp7,F#O>\mۧMx>Z-/?YYY̧)+оH4h܀ǞRo*?N"V?|OV%4,# 5&GKHIIˋѥZSXz.ƣjר>}to[rׄiԴa5Z}>vt:|HRb^^^nߪ\UԿ_>K>Y̧_%';:u@u8wՕ.=:3'm8̆6*QT@Rmo֑^zO'ڶsC21M m0\bPz9q^|?ȸ.7#77!#Y0V fOoOΘ17pssN(_ ]G&`neksy땷f 0s+Z[t+B/[w-Za?~\z[4cGoZ,𰧪紂|PkO`P+1?~+pB[ڶ_.oόgf?bFQ݄0qBaÇ1l=~X[;wÏ‚Ok;$č_Xz铍(WJ8oމ)aGKH7&!"2f*+&nLyҲΡ}U Qةkv*Yy_V<.Fmlddv_J*; A=_\|P|. 4d69\LZ gzf?Om6gOVUWMS]~F6|xx3eդuzv?D)\]Yv]tlҘum+9u$MGd$$TT:P%[,$ z\9>g,8_UWMs= NrߠU7T:=g)ujo=\8IKu}r6}ΦYpV8zOR/&T'RoN=[U{Gp8@6N/5ߑw Ls&-Յ9gY⬺j/O-dc(7"\Ս+xy8dQxy;q(˖@,?gR]8{Mq/Ϊ^R'j`~coG%Ra* rs|mw`ߑ݄U){Gp8@K@RZbI ǙLZ gs6=΂Yu4׽_ !^iAHH\ETTTI /^omb:^~"8 '%2nD@Pv?+o2d 3'+Y'{:}^V׼d*k*@p!bG!}t=ӱz#}@ UG$\nzQ;,cg8\@ .:W"Bjxa[ @ ;$I䰭@ ;D,@ !d@  @ vY @ C@ %=Gؙ#'a2V5^BDp-7w[@ 5U n֋[^x{ !]:**8w;RӲ@ ?srst#/ؒZo:DDl=3@ y|mN_uD_0MEst`4p. )IȲ\ Z@`֪ 燒| y8ꉊX24[אG Ifx{մBvnqc9poՏP5-I Ad UUd2r1Z5nO"g4\>$ + ́S{n(?ShݴIjo$È%t}PAVd̒/n.nX~(⃰pŝiV&Z (Aeli)5 i DbѿjZ@ 2:z?oW;&{Pъepջ& @p-sUd?6߿N:mY "0Ei @ -3{%Kr%>f%Kزu bİ']5=bFQ+04=|6Z_6ot?(ʍD k iF-_bR"b #26m۶cʔeXo߾}{,X 'O`谡nӊVlUe;x cZӆ 喵!+R#ۣۢ?7ksEL7i~(@ ƗXLfRRRqÏDEE{a#ؽw7nn#DGGөM͚ѴYBZ?dUdeeU EAQKRSR=nRҾc;4:8Glb>\> 7Օ c:rꗥ$Μ>˼gxzyo@_=5[דS-3ӕ~XY  XXѲe III_9|$1McY| T1ցDՊM]ظa IDAT>!}NxH8~ _~*Ԧ1/^y-Z"/2fNUQHOOg  (OTyF4^ĺ-kykdff2iCVj4jܐm[N~z>z$ ڹڰ<7{~jAiyYlXm3@ \\5Jʱ/%K 26.?mv}|HMKeԨ;?~<|1&>?вUKTTwh~^믾)靷e-|ȲػRA=Ǝo̙]WCVTӬy>ˤG&p9{,~|U{7㧘sC!#ұEg^",z~mڶhbEl\ YV?V&?0ZQwf\+*f1M9wl⇐ B‚ex *?@ [bQJiM-fL&1,Yooo]umW,[?3$IŶjjlkXK,孷ߢQql޴{Ǝ-f_=f˪\졬TdEJ[#!.` 5 '=ƈ;ꜙ{秿$ ҢUs>t:?nBdLE c=dYaDFE2NKMԉ2gug/p{shZiYv\!sfK_kI_r'00 >Rn,?RgIW,N*E&33ؔ,Jtt24W_5^WƏY?{E&NH!!@t(EPAl 6TEE *RDQ(Aic{ÆXltBHH۝w{% 5~.򝹻~gvVvLya0|F9 -O%+IIF4;OƊopǽc{Ok޵-X嘦p~>|G _H_}^O:tbԴvh$?7~} pȠr/ Bds=aX5jD a޴ 3ósYf aXr?uvJ)[.gN>焴-\ʫk]{d4>&ԴTbbcsy{omFFVّsL66[Wk\2}y)Q4oxw=[a4he||^R{>e󌏏Nrp'w?i[A4ƅ5hhhV~d, QB.>_] aii,X*?ngtəy湧ر3P(E2z(]ѫWOu=]O>k?b+Ny3 '0=Ϥ /ϙ˖-[Y:1<CdP92$`+2{;v/?J~~~ u eRJJK(--5>s=[n| 8R  BrvhmР!o+Dmۆ<߾CXY5#ᚑ8_9{~'fMo?缾}p|.|!Ɗ78ĮߎK_YRއP_3i&Z>NBݔq\|elk|q;伎Zim۶c}v}tB>}ꫯ 6бcGuFZZtЁѣGcӇCKA$X<:uHOOٱ3$/a\9txZ'fǟ<בs;ocUZRw~Ofmhլ oxK_߹C]VVcSSqZ3x=dFrlc7n KǓԮ3W]1[-\8bN=4:>K.ʳO?Gss;1tx2*M wUVn]233iժ&M"%%>:Lo8Sʕ+4 MӘ?>ͣ}{/rwҨQ#;v,'(R|>3222*U_AAA>@KXh){ h٪%{/ym|]6]q){vFWֽG_ǘѷV>:w߀~Ԭy7E:uױdБ5ǦO忿Ͽ2%au+)))ǦPP?ldŬ{w-{%&N~u&yɀw8[Ѵ(ּŽwn +߿={о}{v|?ͥW^Ջ3dsiFqq1\vY'j*~m~m,Y /nݺ<4o޼z P=r%x$oӉv9&MY?]T5v 9sA:,kF\\qqq~a0WihZlqcŃx¦S3fOgi㦠M5%A9s| ҨQC.|(ܥ39s2t?~]Vӏ?WpP?>=zN{Tؖ 馛HLL$))x3fЫW/|-hذ! 6dԫWzf͚qUW1p@{9+i_aϞ= &жm[:tUW]śoYa]AAyD.ƌ߀TnB&8ҴY~.BmxZ*7]vm}ˍq\yՕVRYӟdٳRRSB摒Bqqu\7.عi7 'tN&LK/^z$''ǟImܲeK  CRtXq]AAyD9"ɮTlZJ)kU:$Mǧгwϊظzy]>7 {,\[4gْ3χLEqF /S7KIӦM+G&MX|JLjj* .8  ,"qy Þ|fL?K_͐KW*}rrt]G\8Bxl:_~;w䧍S QQQ<$mn디KZ!ZM6w;MǴŐ!C{?`޼yXQFU*}JJ aFٺu+6l 77A!K,iii{e.7}lf>5Bȱ͏tͼmy.17dĬiV*ko+iy}K`up)'p5M0遇2h(J4iڔE_nqU[oō7c=FӦMYx1]tT֭[ss0ebbb?\YXWe  &8V}ɈV= 0 <'?W^(k =6EH9EE iy8+] LwX{ ( 0 ×[N` L5[d(gs2ck髝ᬋ+~f=ہ+;ߋO p ^PV B#z(zXPȂw5tZ~&MyY̜6[o>X?S:s}?;ZIڷe~ G\Ny9/G&Me7z>UMʾ#RD {unsK*=&Be߾}];w:'9sXfa7ӼEs~a#ڷ%&VFM>cN8xbcc0iry/adP]`#a 3QƏodvEܞ,]!]|M#"c"T?.0Mػw/.g_xǵ$))7@7?x/v:n3N<2*C}KW0wy}S5_{y!͚7q)xdң<6yZP:tX'Oy)&q"H\d,T {RNv,Y \}1MXi6m ?l`oqqqaLܹ?Xϲ%˭0]),,N:ai870t97K-~] |AN~߼giذ!{wgUX"ڵo)]Oah|LEt=+Lyh*7|_Ra]ǧLg'8iBn5Ms=cC{};fzv:O͜#xŧUQ7\Cs{X!;ƌ6{xNֵ^pSPBPXXDbb"W]3OIiӶ5G||<_ֺ?lԡ[(QP9 5]dݔ27kWzqnŲ7hݮ%N"c"T? #3-/7Ү}[ݍ/ Ott4=csJS*,<=xi|v:mڷ gݷKF {Q2ʬgfp{nhYRR+%-F9~߻J/<"PMBz(dS0H ˚UkfV 0K5}6999=&~&t93S^:{򉍍2vt::uDIq Ѥi`l嬹)_ϺQ`eXfbbO$zLG~^Û+ߤNu>ȶXl111؟'ɧL\\\eӧ`+iޢ%b\DEE1}LZmۯ겗)+-<:@ CDx놱~<,kt]Y:7/ϝC=pdD7E8/NLL 66=爓@A0z̍ ׎vb^qL}QF^5ԫΰѫOiNgmpӘѕ 8]oF/E.w?tL s(.흐ϣONfKDb Tbbbiuкu+~)ڶk@Æ 8q9v|Et?[*O˦_eӯ<5}>;7/nWl aoݝGx3XniPyGypE=)svtCYּ2n5:{*UgШ z]J'XBIQI/UMq~n'!jb/^ɏoAlߺ1hHh}-..A$$w) ˑEM.=¸`+Ń,PGۓ]OBRշgt#c"=ꮇ2@@WʐǙgλyEB\*pW#oJP CuC B?ZUʧgǟ%ߑ|pTg= L#>.[ﺙr"c"=꬇2@T GjzJHB(DC !MHOSJTܑ"~ h|FP8DYvTMU& 5Cn B#z(I"Y#A\$%&Ө~#QT\T& 5$gL+P GHC BE|\<$A)1E8|hFq BP8DY㊉ FPmb"AAA!dAAA!dAAA!dAAA!dAAA!XB7# s[#Wt4Xa(n7 -{ amC BC\l!==z(dAaxtO?fQ{Mmr)v1p8Wv,{A6߱2JhQ>Q`/L珙kfPHe!W;YWS{Wv˟o8h\뭡6HGP6 !jV8$xjlzD7<#_.)e[ ck#Y q KU(׆UӃ/j/@i"k6fk#{gZ #>ד 1;1͙$qcB^#aF= @ O'*c ˯f2+/e{ 0uT|߸+6eXk4%y8̸vφ]Wټ/G1洣(JS|æpm0U ?eYF7*S"Cڨ2@nx|Gɥ TQaqBe.?MCyo!@}L9u.-?ay#v/[aw(+نaBiѐ锹6/t^;v +++RI"Cڨ2@@&JYby`/v`\ ^r=Τּñn;8 jv*vŜ3^9nNqKfv(c&0=:|N$+8e  uX<4III?#߱_ZܥsUPp˖-dggV;= 0 v |'a^sX^߁)A:D1?93fYuq!l8{r­"U臲*68L{TP7-YB,^ʰ0 "Ca?mĕC >|Ðq~6_;uNxy+Aivl m;7+1ѝ/z1E |]<^нw꺎nzxto|KнݺNJk ÖִU+^=e߻=Teq{k:aYgO?qă,D_|WɀAxyŲ7~<첐DFSVVVi/bu<=[n_B=ػ_b\Pza qѕ; CËx`IۇS]v<%˵7b)XqWh0ח:{.\.[^·U+Ws'{ 11Wa+ǰkBW!֬^g}Y}c"ϵW_tq93xiˎU6|,_:݇NQٽ;۷sazithu<3p^t)'ĩ'=w݋f93y w!Z<=ܼR\rPɡm h2x>Զ }{O?~32fL'u㤎rٓ lGpԶ 3?ǷEЮEG_6BP!d~L4!ܐ36|N h9\zaV,_. wwii4&ne,ïF||äKgɂ>NbbygYj-ӟz)L8{nj /7W/Nro~>}eKת%ZvTtW z(dz06lt.Arg{.4; _]d'%.]O?l^_:{e+Qԭ[*< #kƴY\r`4jRSN/]GUPjEV,w;/iQQGTTg 8ϪϨG;;kҤ 3ɬTVE[iMzz:ǟБgwMJ:;;Ӯ};4hP){BQw89%WϣQN#F. >3wEG'͛7c(eqѱS۔~Ν;dNzF+E+Z" UNjj*;w$qܮ]PJ捳dRڶkCc~,xu!=H޽ԩ6\{(:=vi4;uPPB~L|gv CG)&yGEH\s'؛7;wYdcYXy &N?(?b\{(>W~V&w'+s_k牎4!1)='/o9,i*9Қ>!z(d91X-]Ή]Nt[uRR9ˉ7)).:-]wd߾BuNOsf?üW_ 11} +#w> ww.gv9~含0 ТiظX6jH0*?TlʚW;ЗG'?7_}ç=pHv\11*VO?g 7ʍҢ WL ih,?~,|7S* ::Ґ2 ՗HC }HJJ‹ֽӳȿEYRRRS̛gx H ih>^ ]NnXir8ÇrW0*M$zLiӦ4e~\.u2vt::uDIq Ѥiy$'Au~ڸڔ^׽Ov++-v;vKHOOͷqiҨQCǤ<=_pB{bcbwض6AXؼr4Cgxi(L<3NzTrw ruo^/<ڴk]OGt"Qe,Dޕ>Ó3f+ pt93O>3{opyЪu+G\Ks_bs/^`'$&PPPP=Q!v$qWyɩ֬H9=ϺIHg¤ ӧ7OiNgmpӘa6?s7ѫG0qcܞ.sì~kVeVXyGyz_k5m627 r9[W~@0z9|0t]gܘ)-+{nfnA*(-co)3Xx۵f3+pNMCmgTnTDz2HJ*@ B|:lnV.v.ѽ+.$$WiШ۷n}v Z_KhP D rpik?|z0XJ GjZ*Ͽ[*DXp*{= ge>AdDEkYB`cup+@~/F5xS"n]DL<.K^;w RZO}K-'cYu239u聱5GpAy?3Ԟ앝u'q~v[b8h/zk( !==z(dAỚU- Ze%э6ψ sFJ}V'+,ᘻ2 @y&vH70jyit{\pʵa`x=.˳ PZȚ `ˆ${CNLs& b{am㘐Ǧg DQe,!PB7ӉJX򫡡ٯKYk4s-C7'`7nJMuZ69yIl3ݳa@5U6v >9j3湰_)\9 *y6{C|uq; AP6 !aߑmr)7ep@GT8{peم :*:AšaPߟPz?CǁFBD{w.@^^111dffpJSkivls#l_=z=&MчQ׏![a?!7\7/M8&NuuA"mr+BL(0<%n?S胶 )*a|HK EEE[V[n:^xIIIF$ޔ" .|@ztwh7^GΝ*a3Qzu͘nr V.Í qǢ iÎmyzJY6ʲ00dDc;7CyƑqQZy#iӾ]h7)~OJ(0ZXM)f16q1`0@Yt9Y˹|e!Mm];0?y{Xx)#YEvNvP=|ۄK.8a<Vj=iiddԣ]vrޝ۹r0N=4::O`?1x%?#݇wzǑIShլ 9 ;LI\0P|zO?EWn9۩gsb\x|2+~}.9w>3<^ccBߣu_zߛ+[@!_e͟iYu h{¾-z諠pkVͿw֬^CߥH5:uW-kwboހRa#+̫2zx%1mt;7̴ʠ]ƌi8nTc<{7YS.tڃy/ЭeK_^8fv)z(zxD˯@NlK־ds#K4KƌEЮC;W W8h?oqaV˘C4m֔y/̏mu&^:K,1w{ʛ;/EϼW<껤"c"3ҲUK&=#&f*& .qݴnӚ{4iĺmc49|z-XvMz6nH<2Q<͑&0~thzlm#nV-G0ټy3ڴ:`ۅA$zLSxt'^:x6m[wS\\_ER^ɤf)SGU/[[:p㸸vIFf3ȨA>xWohݮ5 /8S>r]~C5H,e,DS1Gm`MtN*Jyu :2V /.O^sYӸ[Bz4K/؛ٵs7^*WP@Ro$QPBD0 4TlZ㦆?˺ %..o3TR( %-F9{ lǶmiۡ7wwG\eEYkI$zLCJJ Y Ѽ{L(S.I` Ϫs]iז-ͫ2zh(n$I➉p׃>gCjZ*?K/7r^4Kdq‰';o *[4fz(dr^>L6f2/y?opk4mڔ}g׮ݴm׆_~faHLL QPq2p+{/<3c4&1)6n{|xk*1jѮhx.2.b(7/s -[$**}Q)=ɧv3ugyxi(L<3NzT^y(= CؖǷMh|Lh"!D=PmIKKc+syྉ< dd3]m^}Uymv+ * =G=Kz(^Ǟd[pINNM}q=P=ؿ?w<+,!!GP39:'W0~=CZz\{5'xB+z5O,Quqc=1掛4]=>[Wn793e玝MIfĵޝU ZTJIegDQ4= ңQt}{dAmԱљ]{۵}fZfiTPfA@B 3UU >rx޷s ˉ~~U]|OZ=;p޽+m\}}cp6E1uƸOK_~^\G2Ǎ;g`_8?֭]+<^{EݻG_XCpޝqߎ^Cڎ>>"{0 Ʌ1_=vO䊋5]q^e{i}qæx7_;GL#~~(N߈yX^w+/=eo8W}'U`LēR#~~(ZFv/t A~q~:2tо!fIq)'p6!GLP CrY#ά3G#&ЉCP YEߔ{`otu9### H2&@!{zZ}rmtvGWu7H^ߊ93Dw`&6~8&6uF,XnwM2oZfDoOCD~?0DuŔS;M^~)!YEwOτ?!i" dFoO- ! ! ! ! ! ! qTymGc5{ Ɩ|-/سwQҚqc5^'kbq_׸+u[b=xD^wغ}K£G)##ɱ|Z% @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @ymGz;`Bs Ɩ(x"={wGoO;@^88֮_h`_]&,s˖=[oD^c^)c=uxlݣl1/gO7-]2ǁE1erߘW Gڞc5غG+cjߴ1/ć1x/Yg1pD_xXqqI+w02$2$2$2$2$*ˮ=bێ-wo=\'Mbꔩ#>nӖM7kcێmGiN.:#ftEUEYw9Ko/(","ksGDDm՟#:<>a(! o[ OC>Cmٶ9Y3{ uM7/Y4|YFѕp[_z?0jyQ-+"xկcD<"z"+WT^Î/РCW˲a(Weqx3cIcd j˶Mqӣzy^ޘoDyEyю5ώ"/?ɇ:̫mՏ<<@FyEYW.CBDD2JW#hjVVXdJF f6[(F*F2:p*#M 6 \D{4Ͳ[)y \Dޕx#QEy~ "4~#6-"d?aБ2_Y3Ҝd`TNztui9ڜUm:(\ɴraݜ,Lh1('nh}[lkenFjt֢[V7uo)E5^V#Y-|䬜RnMW4gU&""i=^lpfIȶۃi>py/9\']w0 -5JCoOSA8E{;;OhP֗_·lO +FԈS,~fҢ,@2Nd"Z\if.vdQ_لvqyuF;#Sd=\vȴhXɉmK},%Ǻ^_EhWs) `sgwz[\;77ujoC7O#/hGGX=:FHU`jgIDAT0B-O޴qc\so!Ν9>?_ek-jŎ;⚫g-?+ޫ(ӜP \_0 4'㢜bq1{r>pm\qgw~I8c=Ϗ~ߎAksγcy3~fE۶ny},Z0=՗8[6B :a qݝE1:yf9#Zr>mQA>":|B:)'͌'?ۺ gG(cKV9>7? 6onl%d`\eX=Fq׷Uk|K?#>ziE+jbm^8ʲV<طw_[n򔩓cq-7yd~(<9/:EhW#yqwipXv]yQnE\g/Q掣b86V-˯,n'c˖-[/ÿ3zfh"={)#.B+ϣUO+ޢXg/?+>~U?sFܱ+qz>fLKŦcނy1sfL6-XDlڴ9fΚ9.vXmOS20.s9"k,o~mzcUOyC|C+/yS fΚ_yiy٦o?O㪷\E^ozE\{{~ktwwM}(vls`XqvwK;?#7<<~FƢ֌O_?mcǎ`^\EĽ9/|nMmtgĬٳn8{8w|Xu98z3N?_`Ex׿XlYDC=C/wwAF7#O7#Nhbq΀|\@>c7wu[#WL˼a8}/g-{p~L>(n݉eǎ? d`T DĹG?رޜ֜sVdzSx_喝GUVe7S5dfeX**$;##G&OE&X,sr4G2䥦e2Ǩ qD"H$ol6guf̩EƍʴSS#g&   Knn./&o齬XV#"ԣqMX,VMl9<|wtӳXUmo4 Ga6[i԰>zT7Q"#BUyfVNA@bRRsfffUU^',4LM7AOP?JuPbbQ ://D"H$Dil:)>AV:FkQ?E/ )kјf3 ϏGFfM_,[!ii"#},';1a4,X"" &4{ 7nak#==G]^DɓxԬQ#xgؠ8Q!*N'I$D"HMf|JKS#g&S.Pc;iԠYY4iܐ;︃?\F9KB p'u*yٜ9';'~}gAZ!7 $++gмٵ.2[hF[R鐕m֛2o-,,4b6[JLo5ӳ{W0U@}^:L7/.^@$D"H$gf ݢCdZ7Yy<?z>jah[mär9dehn6ZhbيFt:X,%?k_#|Kܩ=;`0c.Fmƈۆct[t)?we{0 4lPL"KmyꉇKXUu:=qzukC"*Z~H$D"H<'Dcj=s8«2x\Gv; A:ȑ\lGʳJOXX8Νh4ɧo@@vN6>FTUGn2cǎw>FbcIIM'|} |vyiVv~~FL:4m!ǠgђILJq<RSl_$gWiެ :BZzO`cX2r-DGGguxxHIM#0П["TrF"H$Diz=?&h ¾0IcJ^8d]ާTsvǧ_\%T]99X|$VZm'Eͥuz~eazYt b)k6|:H+vD"H$;z=٪˩a5f?3: U9GQur&H$D"H$%(: !BulЀCa0P%~˙D"H$D"EQ0#eܛ,șD"H$D"lG$D"H$edʭl$D"H$\(K\ tH$D"H$2_l%$D"H$HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\*[D"H$AvNӘyeCBtպVA:4D"H$ILνҠfc:7VA J};Z_ۖV@:4D"H$bⷽ;F¢m6I4jÖ́ڬ][w;5)GIJjNzhjT mR~ޤ2y~ަvV*+.Wrټ6wt k\KTXtb<@TX4k6b=nܮչ)Cc{S5iLN?;iX1UoM&]<6}oU\vԬҡ0 4шO7lMИL?fZUg(}S>a>; UmM&]<6}oU\vl#80DC! /Vevh>J|tBB5_jŢ(GDhmM&]<6}oU\vy\T<ϟ]"_)$]MYXKeMY4DڤxIOe6Mo[zU6W]y+H.!wQfjklΓB5KTo7)Lަ-x]UJ˕\6oEf|"m1RoqFڤbxIOe6Mo[zU6W]y#zT7#CsϡQ-H6d?oҥ8\pؒmy>ނ[gϜbRzU>Zj^bKmUUIJL":&#>2HKKܙoXUhU[oq&>|Ue")r:4*zZKJ)_?K&6s_<|JBCC<<||}ʝ>הx慧Щ5qTYl{ʋfW%2y~ަOiKNz}e0cL~VߘKm³3hѲ;r<;Qb>.+>\ɦXlQ4\I}ڥ'xۻH\Cq}|3v+ m-_Cbb\ߧ'NTĦ(Jkߤ$ys![@Fzq1ߛ{[ҽ Ϝ ?p+gc-CȌ3iѪyuЧ[t7B8ҫoO}Fr\ Lz-?odyd /пǠB_<6MDd~XWb+0̈́Sz5n< )M@e2ڦ;:)c2tͬ^ժǪҩUW_z Sq|8G``Aŷs PQ㞸UT_[5kY Q:]qē}ZrR2t;))zhݮ#ﺃukk9v @xD8 7`̄4mvq 2eң|kbb]wbb:?}+Y/ÜWgb0@oN:B&ۗj⏜9¿^5ժU.i{-iѲtgШC?‘2߰Nfٹc'-$ BJ<*.jNIEzdeeqqndDDθ{hNkq9.^OWYt1ь7 `ԙ0qWK}·1z(<F]& zr?.2nz'=zu=%9$5Wa}2220s0sgLJJ*>5Xٗ<9ǵ%/8v=W 0(N$''ӹ['1L9&vŋ3b2}mLJjիr!:vs}yu۵C_,j;];QZ2 m 3sOQNxmYlQ8>-//[hN:矬ΛGʛ/Ӷ}/&2鑉ؗb }\A|B<ϝGUU^{y>o3%_#]w#,+Ǐg8r/1<;i4md >rf &V0@UU.z=ʏy׹x1;0D߿gʯ/UTaitԉٳp{=~GƏ38puaY4on;yLj; I?a뚯0k,N:M*Uf׬lk|Wk,Qg~_ٳƲnZ"#]GVѕ'*Elް~٧;UW}MΟ;?FVΜ>p}>tlх~x7c }չa +ΝwtjՕAV1mӻK_OAn UXBhۤmt`;Q߬㦾CԲ+FÑG-]ΐܺ%--2d*L|8:tiK[/@V?@&r>31N-rQ COУC/ʚ/0[xwӭ?[wc}FJ9^{^]ҭmw>KݣC/vٻg/#oMV]ݵ۷m/6߅ X0]&?:~zkX7^ú[/`ʤG4;~Aڶ"9|ZkNTO6ԭv}m,Zve|{Zq:>}wtlхaoiqM^1w|Cۤ}KS&UXY`1Natց5ҶckOcxnjo,UW峏W +~DD}|oڰ,6mfPQ=*ow~tjՕۆr1|$mtgQd2:wly Sce/Q}aeڳy'kNm?ʩԪ+w ={m_ȥCi&<7zªZle Fk}Be?QD4޿ݚ߮G8#"iնCn];m2~ w Iӭ]m,n^k{m ? UX`6mTJj|-7B]`JeOǑ!زu3ڴ'bڌim+\yY$FZ5شe#l '''Oċ~ Ͽn1nxf~'z´/ٽ{7O۷I QQ,=SSAԨy YʺœZ*ii6Y>:Dx{_fK3_3g,ByZ9WF͘232 ,v?jeXr\ڏ/mEqß IDATtХ+>X˳q[5-5d7œ}7OMywcZZ:dW+0 |<9V_o{?o%44䷟whҔ `/ȸlz}'#.^v*n6^kƩ[շ'?|#GQ5s + gϜcw?RvMJJr }Qd|bO<4|ݿ)iӾ5ϋ_BQ:Ĵ7 #c1[xi|P df ޠ'11XYŪ"mBR UUs_Onvcjxm#V~g-0d[lDӱ5iUUiZ~??.矚Wi.{:ukewc;nj`wSdpfmcuV<ǟ'7/?FuD^CO&6.՟}ɤo>&(8qRiE7Wk9Qjթi+jc3aFrfuJrR2ծFNxo}cB_!Əd_TH}OۍԪc#> JHhpwqRQ||9r(N ;;XR6nX"\qϟ;G?fԬ^;nDFF:'ONt|EUOΝ?ѣG5jCQ.?MJj 8ԨYmJ#`e-`άX,m&8ڡAuCxD_p{ :}"͓Y$'',f<3v uk6#=WS٧=;8{,]{t8{S*4oՌWM]:TS ׿E_%,ZmAWb;=0tG%JXx ?|MNڄ JDN8ItTHu5hȘ{F>y$KժU ;ʛJڵos/L-$+..͛6w! uUhذ!7+RG)˱Gݔ1_7oќO>Qw">!;GfnC%/h۱-3ͿO5%==-w VgϏ (u,/sg'  isRa4s96>S'NiarYbb tT&y\v4ztҡr9NO)8HF7FC9u 7WGյ]@""9~a;_yǧLPUac1󨪊/n˨Os9y;{ 0淓eFy8O~(nZ uw2ps&8_qp7hٺ%۴"''jPf͜믽!9v5m۵a/h߱=gϝrx@~W_y!CIIIIk]ioЦm:vHJJ*5j\q- MCdT))E۬}dRȟn=ЬUSl\#mO<8!""|Z\6m왳lXD=QJAyO.^HMMuI뜯cK95=U$TK0ǎ… ܟk7ifN:͛ .:bZ.lLbb"'N1q܃2Qne[v ԫÜi/qQ.\Ү~v ۳U؎Ξ9޿Xo=ƫs^CGY&]@B+l*q u0̞'?Ŀ'8yQBI6q.WʒOil?~S'Oqؿ|S|||K[.%>}o׬ǭ?~!X=v+/&J[2rнSc.N<a7Po60~,Z /`,Z~~ZޡtNY-yek\ ǎرlZ@*m;YF*T7ӬUS:wDV͙[B[Ϯ:y ?Ӝ=sc:y?wŊW{@ZViC*q -f=gΜرÓoߝ,8f))kujo6NQJzHϲVжcTbUdd卪M@TK`9w.;KowPoxΝĿ';e|||ֳK:w}l);{?vⅧݦyZ[P+:ɏOb3;+??_a@;_?_222{륙M Ν=OJJJl1]dffNxDiiŏӎm?kN{i3^`tl׉7 c?K|t|3qD!h֬)L}9бm'fNA֭@bbY 6oB=ӳ-ZRh]}f8W_G]3r Ntѿ8I<4iԔzPVMFH{)ҟۡqj܅P`KϳbJ,x/J:2Qof[Va G'ҴeT2޻<42330$_*-#o_b1XBBrMBcݏL~~ѳo>FM28(kQȥtz07NGDd8M[6孥oPNMUԭ#>M''DŽ_~yypm||8鶌ݴ歛;/qkO!/z_y'v+q9h٦(U[}xNס cǍe츱‡ ư Cl~~}^ڱ3q1n8ihW_{\>/ZC]oEQ7bG)%_.X?l1W(#垑neoՊ7ϛt^&o^xvSlix^쒙bW"8$! ˏ]?2{ȵգ7𛇕2˒ ګ_|.o~ДAwI+Ռ7ϛt^&oЧXހՓoի]71NŽYRv%=G9Ґ6d?oSx{M?o[Vx^͕l+lވJ/ EZcx{hVM*7ϛt^&o.ުWes%J.7}7;4DܡA mR1~ޤ2y~ަvV*+.Wrټ|[;R-=Erys1BepYM&]<6}oU\vb7媍++WJh0SF%?\2\LAJ(H$D"bոb4e\stR39s4[B)r92e7D"H$Drsϧu:ν;֪GwjtH?D"H$D")EQ5F;2C#H$D"H*/ 1U8sTJF"H$D"T*b.sZH$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$Ce+jVA"H$%0׭E^6eJn^ѕ/!AaT*FKqcA;4>bEQBhQArF"A("ӑ5 DB Pp\]q묃k\8*M@.Da$Y>Qt}2jVN6Ua!ᅮ _z,nEQDq/#:4huMT~3oonup-(Ltأ )=}/_+[D*[phP"6(:UUQ* p*-6 ":@CIsFs9OTǠG*&GupT|\r.p.< +Mv5; gs᪃4>4RӓPT7;9(`jp"@Qt.=U.yQ\9UOUwB:ژpma(vcwNqǞ|%qZvp) 7pM| N_-a_ omԑN#.N= w&Iq8.P]˃@;Aw~ !CD" F>A):XbQeª jEr,9Ot>uEfEQ45!VcTm`9`rzUGmmбڇ3>R;B-\.\ \'ז L" )LևYlx;5Iv֝N|OⰠ8w8}N{;#Nb\ؓi3S8u^at0p:;^h謝 (6SȏaqT¡G|D'H'!UXlzh6.suluȢ;=q;qȰUU잓K'GhڦSo\ڶp.ҡH$2jO0b;l_u/Щja[?@489"r cq)qZ[mUOK,[K?{Sڂq\ew|_i^i_/A>vdiy@/۴.Ww%|{)_Q}\ihиC8v/ L^{ (8DiDPpikZ f iiiDEE9=ԯjIRb! F-cgESǾ{#T|'p*o~98'rrrLɄyĈ\{L>Br:ĸq ÄTT]g ><#?~#ڷoϦMܹseX, xE.Ǝ%GB־AopkaTo8q%t;y)ecY5vI]Ҫ` -_᪟Xp{8T}h⮻P>^{ >soYK}̘6[gwmXjE|Uǝ$<<7~努 fmҘi3_pRC*jj->T\1jh1#h޲9AJCGwP":Bq+~aabK55%6-ݏZSFU!%I!^GԩÑ#G\FҥKMuVLrrtٳ' bd_ɓV~)&pfjժń  -S:ł/*&Mrviիǻˈ#8uժUN:Z^ze˖{n,'Ngؠ'sM6gGi>$I;sag$=гi\yNDƏyܾ _\+y7=:}M>m:Yz?vA}[>6kǏf$Gn_Үy{$Im;7iۺq^qtФXi| pdff$!whٸ5a\~Uŋ:F1ѩmg~2C#1HlXѴa35f,8^#55&w |-#//w~V[sL4ׯ?LhsÕ+N)Iz.sm:[>:ĪT}Ȳ ~[ԭVz#IzV.[ɠU==?ڟ:PLJٵclE=iި%4AùtB裴!3laCe B dwH搬ILL+DzN`fq%EG!;[*@^$0\<tN& 0Qre|}}gȑݸqCxWؿ?͛7ߟ￟_~E?`p(˄ 2M,_@2V%999tN"8'11޽{DժUYrZ``֬Y=QQQ 4HMtVZw̻X5jHϞ=INNܹs4nܘ0<<fψ&a:r9$HM]O>|.^HD/I(ڌ?E6A"_o`)2qD^}uN:^_4oٌ/~c}YIpZ#} ٰy>ZHZ5й#{~ث>}?ӪmKZkCFz&G8AyShֲYt..}q5:uD*Yz 12_oS'^X` [6oaނZ˼4U/㞙'۰7C2I*}ǽGFf9y:‘0H[wb0HܟW|Ȗ[նLJS0H˗SxzX:>؁u_esπ$!7;c`p0 cw_ykۜ={N<=?C/25i4k†aͶmغu+HNN999ˤеkW}QΜ9CΝݻ7z27s.]9seԩGe׮]l۶Mf7ߐ#2}ŅǏȑ#9q: ,`Ŝ9sHm}vƎ˻ˉ'U]طo'OgϞۗ\x V^ͧ~ʩS5k={$--pi.]D.] c޽̞=g2|&Mįj/%%2eGBB9sЯ_?7o~Kͣ>uɒ%3zh|Fرc9r^|">m4v-[ tڵk}=ɪQt+Rav<[ĉܹF}"]i9 =;3xv ֬i۴z^ME>ބQ,޾^|3ѕf-,}v||}2}2ѕ+,LF d ٴ^%dǎsa&8аZkIuղed)L1t~3=%mF`P c&HK_/CG֐ckhߡDիY60z(֥Rh^^u=2*=e+ʏ>  jrD`3OY>Bi2E|>BVyRFڽ3:yR'˸pp\Qg۶l'0(ƍ"2*nҶC6\EXx(ѕ+0pvXQp4CSQP'NjU<܅^u_AH%8@ڹ[gԉ|:? )cQۧ4Ќ7 0uʔ)Cdd$-Z`ٳ^///pssSg yʖ-+¥K8|?::eRJe(_<*TI&_(Y9x {wߥ\rуf͚_h"fΜ?L)_z{1x`tBrxؼyUʕ+SR%^}URSSU=|̘1S|y4h@@@]t>`Ν4mڴH _~4nNW^%88:PR%VXAjj*+Wdԩٹ5h???x饗4￙0aVZocFDEEQreF#G$ʕ+1c-Zf͚V3/ͩSvKrڵoRJ֭Khhz;_)ͮdclq #N.kYՕ$LJ_}I&$odpb"+UD-eHL);l+ySnNr ukUBW pZ:$%GY Pz5*Dg˦mԪS4j$ :w̼7~nZmewQZq8ȸZ4%00/}uy$7ڵ딳hJƋHӃ 5]ecfQ{ϟv=P| Gn}-\NLn]HLL"77|$I*- ~ϊPG{S{>?YYFq]lUg9b"Q WcǑ$a "+3 ހ˭[ߊfA>6׋:1{<Щ=N U:aubj,Kl޸ztctx=g (p X)5hׯz^PpW`9}dW7!<Щ3f1t\txz*moXh[G۝YE|0.͌IF [\t xt1Ý\ϡg9<2lp<Ϛ޸畤\oK_f C|7v{YH 8$Fcٸ+>Жˉvb0"r2uQL|qZV"u]\\"hׯϡCnKGe&ÝgKtt4...$%%l?CӦM\]]'))Xeiӆ"bzN9u]<ӦMc|,YOj_-7n^z3sLv /7nܰ{FKrf`̙z|Ml޼ w^j׮ \ c)eʔ?t[̠AXf C !66ޥtY\96nh77™q3=e%@XܾK9;feGk]{t/6c..'%s?ІKI,p%.&]ltaװ_o/(#BPje׬̸79u /pa^Gv([Nz r??.%! A.aPϮHOF (S#w/)ꑕOO |F2Aj///3cp2~?x32g\ZiAPH0*E >3^ɟ'NBZ Uo%w>23RCuٻxx*7nߴ-ulKfF&?t)"}>$̪y/e],撯ףQB{wĥKIqyyVvqF:,.y7G~[{ؖwF.g믾A$^{ lӕtGٿg/S62LHdhrk [i2z=r˗գ(ѫTB~~>ܹ֭s8q}r)f̘ٳg9ƣ(T^?4*ԝgKe=zK.Y2dqqqϜ:uj7@6mx9q/^$++KM6lK.eڵ\x'Orԩ"5bOΝ;x"N /qh۶-*Tg%##__ŋŅ8K֭Š)ӧO{g,ڭO1e4 VkSO=ٶmIII\ta/r[.] ! e~|2SLԩS:uϫ(֮]˅  8Pq!d%.Kˋܔq,~w )Wgب!+Ih`"!~>+>\ ]vu|ȵԫQ~Z7 .驄R -cݚ xx3湧ڣ :|;۾N혚V顎,>zv-vǝb@ W7zw6`ۓt2b$1u‹Ӧ}kM}}Ϋ,|&BFFABH#;; oo/U+mlAq"*ж ~"e^HO`פM;o6ӹZ&@x|H?fBhX( X}^[$9OV~JDp^}s:5jUCsor?BBWz'[n a4Jo6m#3lPZ~~>72p4k/dD{# A=,͛7GA駟fѩS'<==f}N&M*W @=X`ӦM… Go*׬YpssܸqZjqat:C aҤI > TcnȐ!41VիݻӾ}{ m۶E*?..y.^HPP۷wΕ+W c4oNWK/kVA IDATѩSBuΝ;yg?>~~~̝;aÆ1cXh??Cߎnٗ, v|ʐ#-Vkְm_l4SyGwP<=;##xek<1r0m; ;+N߰mv^tko MEN[QذSô~I1X"8)F |/'RUڻsp`ްi7x?q0">ߠk7+~?.A Ql3w, ;>>ſa3ybۍVHOOŅ%Kb :jv{߈[%;/-7Ry_IfhpD0%>K]ΐπhݾ*%شa3bjj+@A%4}hMLa5UW;mc&=u^ߋtOhվUҺFǫʢEhҤ _|fh85NaHwpN,^ijre}Q>0Nqv}q71( KzM޽Ky1o޼[CVq Fa4;_x\hи mqѝsg5444JNa_x\hи.g=sȚ˙ ߓ4BӇD)N;34xzz%Dff& Qt ~wxw1Jqhp.4}8y%-FLzF:~%-ʿ,B7[c0(]jժ~z:vtވn͛7gҤI :Eи Nato;[7&蔼WS kā>%>^`a-:nn:M%} (iJq/ yG۝ RE)V$Iח 8Ŀ1ĺ0heN d@gcЀb Y5r4ddt.ӽd Ix{y5} 4Y6h̙Nq⅒_K0bc۳ 2%-F)) YF dL0cZ(iLR5awo:]5ok9[g5SʱۜOd$;4]7em{sYo;[өƺ3۴IaȲޠ'+77zùQ,[ȲJZ '&66m0j( dԩիW#I ">>ʍNCCI@oLJѢ79'zYHx, ChĚFJ!+$a@5] jYCVAIB,Cl4e@VJW6vN r+|JEVSY,lGX/$ iYHl@ll5ݶ6U,$ŽLӇCC?LNN۷oWM4ӧO3i$~Woرcyw9qVƎ4~78_EDD ,^?U2~x5>}|g,Zw}$tB>}8vfͲ1c7ofΝܹuGݭиEbhONC)וeڙpJd|}>~jTYp[ ʖ.ٌcȹ8g5B/,Gmfԙ?B2M/da10aZfQ]s3 &$s{Y܏NV]\ ч?5k$**{ƍg7n{ҥ /={, *SO=iժ#G8qݻwsʗ/OZx饗xw0a֭bŊPJ""nB,X%KSCeӦM=xJCCp F%3!0u\eauq'JÙ0Ma,R]x,QtX|vz6wujbdIgQ$+jK%ʲh,/!$NQo|eùaMxx8׮] 11[|r5`0N@@@e(i/_^M^:ϟŋTXaYYY3dx @ׯ_6VCCq FedU]s1u>.&F7SҰp>wy[گE:[AN1]3V#j[Sd٦Nٺ a鼪 By6*Yꖣy[A\GD ,4}8>44+F^^^\\\ztt4mڴ!!!.p*}hhWtTVkR\9._zذa 8͛ӢE tT^S[fԨQ$$$ĬY0a}W^a?777rssdz Zj$''Mhh(˖-?eLCCpFE\t.&; j@qZ0m9eb݁6v6-:uf"TE+fiVunp.f1@v)[U4.QWp8CiQ&=3G5 Ó ||JZb'!!1cưh"~~Bу 0m4.\@HHqqqwd_1cjw1qD5j(={6Ӈ4O ѣ۷dи3 1u\pA2d:cc1(QF9ĴvPM#,n#v;FЩ##AvUrX>!f3ٰu8^ϑ&plwfZgbohp}&rIBj94fk:ʸ\eֻ2,YamqKž8үsiʄ׻t5]t̙3VҬ7nhuOU aÆV37:o֬yٲeYn]կ_;w:L$>>xy*)6 !!$I * e$I$ Iׄ!Ъ>lox񪏩Z!A r[Qn5<ܭ;ae[˗-/,B =  rH%$c$K9]2Z05V%!0 Ad:7{˜`_ߺ\2Hl&Y-WI+M6Zv=_жu@Ӈ4~J*`m -0ݲ@ _ o5,8v¸vj[e!eY=:jou%߲0BFU9Ȳ3(ƅ,$dYF!-ʻ'jg0@J_+Ejhhhq d JgAByWPO0  lҰa.$ǮowK};vz9>~Wf͜߸ S~z5[7O2/a.ύCߝbêSgq ;:RZ]גQO]ߪ]I2vԭQk$)P;{V:B2 ,:۶nzZ$&^R;z+$z%7wn-:L_,fL0߶9]"##[QVunFFF:àSάt5I0HzZw~oՁa J -v:ԩ^6¤\Ӈ$迬Dvn6wJ(.,)Ɗ4``"Yս,1K'!TGكK񽐔zLw>ټ7e¦~V{3.R}$ctAQd0$ soV8˙ B'8˹s牌`Yd3WWW^zώA˗Ӄ14&kBԨQ.v~~~>Ge%`X" oJ/ltӸrI/L[n$%%=ӰQ}S^At=}&dSd9dvRu lΪ(uS:s=dpDkld5ZNVX92v"XmQl]-и5Ġ[ņ?27c޼Fi5ccT y *ͳrs;=™ӧIDVf]~m[sXViB6c1màŬp%uO7bW֙m[Ź!dmQQl:#]v ECCpnDSS:Y(_2JB͌lڴ5kS`ZjqAС !l] ꓟϵ׸pΝNtڅN3h؅ vS {/$)2-Z` 4Ϗ͛"$q#J!#z/&p?@/72(4lsa"^ s}+Wy{\F=46}Mx.eH`?2nCj֮Y<(M,$&6E]b&a= c^cph6[e8v8Q# 5̼nLMonn6Ȧ `e#O,[<9 _{WUf'`Ŋ%#F9 /w5J=Qϴl h(A1ɡ4u0{lF 9|jrF:3^Aݺu OOO-\Ā8u4W%J"t Lb$zlb"$I)#}{13n7ݝ̌LD߁`<݉gB"33êRύÖ2A<7e=|S,08 CX?ÿzj8zn҄)\Q1m|8tў+i|}Z( ~F617iQ.zweܹ 0@=.Ai444JNټw1!J~cXF'N8Ux޽?~}'ӬIs׈_z$ 5Gxyz +úkYr*DE3<0]h'&7%D;eINNGY`)oJ`'4Aa\C# 1k ++ O/O$!(#}z1txz{! '/lƍ$%%Ǎ =ٳXS<<</IFjUN:$~LɷGI4qඇehveϠBgK;aFԨTz5ХcWޜի޸eI \a[ؤB{i?-V% jo%I2$|;nN"""#00^OÆ >}:ۨZ*˗/`Oǎ8w7&,, ooo7oٳӓsQ=z'+Vds^^SL\r3i$mĉ4mn6m34J&S&˧{~px}V烇 fv7_~;P`:vڗF)L-eʖaXQNM^{Zm$FCӹĊWѫwrrrTLxJ˓ Pq1oEQvnk7w}7/"ظ~quuj*ϟEPpׯϏի0kTQT{Aܩ>J(p!defrY/X7_oaڏ)^s InKn~>BD/Mf] b2L-ՠq;+Ve˖ݛKRvm Q0a 4_|իWoٳgquue$$$ĉ?~^\MFǮ$ˎh(^DfhlO8wus#Yc$!vcF<˓1Ϙ8ynnO$K=#SF5^}io͜ìg"2~~ؽX+Ibs/Mk9~Sƿ@\rV~JG~(AkѮ];ʕSl IDATe8VZEjj*>>>8,;$$l<88e!11zVV 2'xB~}544 '1hn m {t0^^^jׂ@對eQ܉>Jƚ ;f<<"i7$=_5eBa,_:1Q" dY՟P4o'bu{8v6ZRA]|JEڍ5CCCTu!#FgeÆ ,]#Fyf,X޽{]6˗/'>>aٶ!n9sPuXb={,ihh8NaД/2B B9[hߵ}vv" Qܮ>J0(6x"ː|_Elk5]+ԬUX@))WOlb`BGDzwe%S'ci5~ӹ|zBٲeYx1tڕ~kU 999w\֭[\2ǫ30HġCeذaSZ5&44e˖عihhJrvzbڶ@e#¨Z*.͸QB,Kup#_oUW0\\\ؼK.+&MbҤI깯/.\`|縻ӥK:uԩS裏xi߾=iiiҶmۮϞ=,[ !jyG￙={6Ӈ4O ѣ۷BCCq FU';7 W ^ }?d|͛;jܲ>JwlIʕT9V~<"0 -bjGj^:of'Rcݕ5=siZ_^{…,\ #*4nYfV3gΤcǎvet:V^{zzнmJwsׇܜ\zt|ww""iѺ9'(8!$Cx烹=V}1jے_{4nK͘8>xw1)Wg'(W>`F<$sg'ϧW~v$oxYGgъxzzޕg.)~aKwwwU뗹V"glxA~{>JG(mZ[Y|W,Y& W,pH^<ҷzCP'y?8xzPH0J'a񓖦}ihvàFJ:qsu%/ 4w77γá>Jws濈{q8As=m߻nB<‹Q;oJZ 4}hMxw 0h~T'S9>k2N{5={,FAMSx ڌDpt>J(m.g=sȚ˙׀NCt2- Y٤@M7(9rrsѹ!qpuqE/0H^uM%CA(Mh34ʼn6Cq;8A,.Y'cQ Ө1I9~@>|qvѥ^S6uVy:˿ZLFY@uS~Y6汼W9&1o#u:j=M, zr3pqqC4}m$(m_I'++ Icƌa}3gׯ_g„ lٲL*UK/DHH]vuX^~h޼9/_z]jx'սr~wbccr eʔQ1L>Bܼy3C !-- ooo*T@߾}յH8A#ɒL"cgF1sin3N`@%|<|psu5}RL3_̳rli65>*SqFP2[,Ʋ07.ڵ頛^*jsYȲ]gZ:j][p+CN~zYӇ3ꣴQB5 dfgLl%-Jw1m4N!l:.娽 >;֣#:Pg, Q˰z45yCm,(XQ!eсVfeq?2:ax G)#l$И3 %-ο2!a46gӌ=^pcǎ1g.]J=ѴiS6mӇ-[;w:ԨQCM[t);wo߾L>qor͆;FLL ={˴z͛PfM5|ر#|A'ТE *UtSnENWWW c/\3$KJgB65`$ N3aZ(lW]x,QtX|vz6wujHlW:: t?ѧɲ>P,;jEIV:Ԗ.J{lrGl9`!di1MoŚ>KȲ,[pRF (-,3|p͛GrE{dYfǎ3'NE}իWIII!""=̝;3yd*Tуx"##:t(E6lÇ';;]^{eUN[Μ9÷~{[3A͇&B,Q:!$Yt][<!IHH/$ keea IHB $Eʻ!o!!w+,tM NA2d*W2ˑ{Me)(+ ;Y &gPI`,%5Nmg՞6dgCӇsCCCCaʕлw"eqƑoٍCѡCrrreϼ+ +W6mڰgoWN^8}4/2 .?{Eq;!!$(ہNbĊzY= *y ;{%;3;>SFO=Zl#Gl{I')33S?$7뽞ڪ?X͚5^{@ /NMrȱ -m˱c~G#!i9e16#~#DžՏ|`}.; ~CꙈnvThvBq ٨Lt9V ﵺbe}NQ+ڨmNj`NCC}$O}j%\{O5jϲ,nZ?V\~[TXX%7J7oݻf̘K*55U~%IC ѧ~9s7Yg]Yg &Hr{N?t/pEJKslȖ-[o-[_|J}飃>X7oHVI1̱m)Œ)JjxH8`M 5ӎK:V^Od 'bR+<(v}s$zE4w裍,'eoŭ1S\{rJE%&޻PIS?\?z^,EHwܡw}W~J_,RJJ7?fӼy۬Y3պ%%%ԪU+͟?ߛ;#Ixz :/u%Ӝ9sK/>Hx\6mdYϟ54oޜ)shBCZl믿^O?.];sMRPC+E)-cIVfj489N CCS V+Uxݘ1/5URhv5,QLzWxRxׅmF/)<+z2ya9Âf>ǦMtȫ5Ln<@C}$O}z5/Pݽex }W7nJKKu-wQnn*++%eee>}wqƩ@}.m|jԩܹnV]x۵ $ JMMUNTUUG}TYYYj׮~uE{챇֬Y'|R:t{ﭣ>Z~vݻ'<.77W~qivӔ)S^f9,Y"qzjUUUiٲeU\\W1 5 ض;V?4=81U޸ضa WU{̰ˆ+';֭[a W*.*i ѰˆkmԴ&?=۶Wӂf:*?N 8#8?«k[vpm×G{xۈ:?Mh.FhHvy^hNE ܎F^/rR{ߓ'D.vxMզM4i5~>>lۂ J>3UVVW^K,ڵk[n۷~g͞=թS'M0A#GB7߼_u7sٳ>S+***҂ t9h}1|M:V/o#Gx܄ tGs{Oos٢E hƍj޼ZnA)==]ovԐ5'^zwh|weu:a+7m<#NrM||fMש]ȉ3#=CGwӍ7ޤ/VVO;3fVRyE{u%˶mwyڭ$o1wY$K'`M>?U:t}rW{Yoj맥?*7/O5^eff S_UkԬpF\9\t It5ԩsǨ uMv7L0[!IJkjJLum=tOzxƒIxt٦2i7 >:n:A/q~1zիVrQ溫fZ :d]Ffէu5k5|;{}=G$W'.ܴ7%(Ͽ9/|y)9E}{iMe4˯tPqq>~f7s?d]pPUUU鑇_랻Ƀңg{)5k,yK֬^#q{y&>1ISNq^W^qow߅V(Kyr]9j]~HmܰQ}tM%M|lnskOJUlެ41g$i?.צ+/7W))j^\S3f}:]JgQ*ێ^ 85_vn6mǼG~M *@5m:cȟ^TeڎQ bh 8fL^l[ZUJϽkKu1aS5#kP#4fk̽wJr{=ϧh7T^IYY۾9y'Iĸ}]tsb7|K>!z*jQw}wz֮YUԢv]B1K~1Fq233dZxbk;$iV- yQ3I5%IM:v=X=4^pλںuwl;:LDC 7(//믾ZIoN:N999q'^9q}۰84mՋs) Ww!瞡Y]n׫P$TXs?]WFF7 <5E/]+T7ǩc*((ЈKFjԱ~[v8Em:̄l&~z5խGWIkԑPVvVT6p,'#o)!nK(@V2Fo:nύSczrl}M.5ԟ}_CG^S_ԍܐk5e;gf<#ZޯRλfkޗ׼/5.t_ƹm]r)g?1E=V,_+]e?$cl!6#cyS>^>C*۸A3G' :.X??ܞ^<. PM}w-k}RC҇U?h"cʌ[h܃w~'GY:Am[YQ$d̝c595{ o>6mT͋v@E>Am;j^TQ7]~YW/_}-vԱsGM³/ѦM W#&b8q@1-mPW_ յ{׸v:MfcTmٲ5[*(--{^SHҸSҿMхՈ i)ԟ4QwvV5uσwiNm˖kwm][+'}TUnPnnIҪU}h=樲R2hƍ7|/W۽ֹ督ٳfkѢE;4t̂Rûz#=#M^t[?״@#UEvpMzz7i^y]3^N=QFjm>ZVŋGm[hZVwzqոI4+P붭t9Vnnb~|>W$E ;#cǽc QiKeTVʶ2N;|pB}ǒy橲R=LM?uVzOGI˗/׫y߱cG=x]}:g/uU7z-k MBwD=f^ze-YT?/[_|U+]=ڵowߞe˖~3UFFZ,8GhΆ0z&>~ZLǝxlvʇ ^ݢvqz4} -n?^N|lfHuz}x6c $a}yɲu]I&UVgu믿>^r:裕[=hڛ1cdYաC]{Zfwʕ+UTT$˲6mhСZ|w̡ǝquU\pA:Tgyf}/85jH%%%0`***$I~233͛ӧ~#ԒbQA*6WooqyǍ?m>suyVD݃f1ʭվ߯v$ 9k5deYmܰAAUmRn%~ե`ME8eXBsv*h 1hqG'RNnZMLF7o֨׫"=;;KwonWbű﹦*M~lVV58VZUm[^M5g\(˒rrs^4[~v;kGUx$' IDATZnҀ  .O?.]hРA[4zhI҆ t 7覛nQ'|:(=OtI'k׮ڵƍҥKqF}7[G~vm7UUUiժU裏ԦM>Z .$/;w>#;3<jժUʵd~=z kjΖ$-_\wu{3n{HNn^j(3+K?B /TZJuQYѫˉUW!':P'ه]Sksgch}Txϯ:]~:}tGN$tM1bn6hݺug}n߰uV}W8q4ic9Fmڴѷ~ÁFrSaa ծ];O￿nFM=DaaU\\ݻVX-[~ӑG5˽8Կ\Ve8}={:&//OM4Q&M4fM2E};47ǵ|Ǒqljp=WٍfZpD7*9>׎+z7_W_MoQ޽ݺuӚ5kTZZbj̙ڲe煕 _\s&NsjӦM0`>233ujر _^'OVQQ U^^͛7k߿͛ݻkڴi 9r.Z᠃RaaѣG{[UUI&qرcE͡k[ϤNQ,rxo-'rxoeeegd/ #Y;V_|qTMձp K]j$iȑ0`.\޽{{{'o߾2d.R5iw{/ZҚ5k8mSjڴ>3k۴kN_|ƎQFP~fgm۶ׯu7|3/\ 7ܠk1w6(تM߱p>S1p٦eVCC}ԿYj|M}S{{5woyp 'x9s96l$iРAzGugh֬Y:S~iРAѲeԬYy<3fP۶mug+%%Eݺu$oQ~~ o^SLѲetYg͛UUU.C֭#{رc5`}uo~ڼy͛K.Dyyy>|x=~@rH@S]C80ĩeedQÔ)Ǯlյ>]K/}W:uOj֬=uVYF˖-ҥKEtG[o-[ XT\\vM=:w'|Rg}6lؠ4effDz?|xTNN$wуo7߬ɓ'k^iܸ%C?̙CN))کXrs򴹲\)I1qҸIV2FɓC}j].裏>R߾}㶏1BݺugCԩSչsgz뭺 _~E_~w_mذA7|:w/,<2d-Z{Ozkݶmo*++_nMߦMx5j2/HҕW^e˖K.$o͛7G-+VzL͙3G˖-#SVVիWkƍzw5sLo8`g$IzZ k RiUXZi>]_SO=5nթS'M0A#GԺut'o$XB_[5iD}Ռ3$C^|E]uUꪫTRRCr7nX*))Qffc뼡p\~5~xm6*tEo^52$2}tM>{ޭ[7;V&MUW]-[m۶7ntW}uWjĈQ촒/,fw.*m6Wߴ,I5+PQb6Qzz$!%`WG%G=?st9ףG}՞?1N8Sw]D4ʊU -EHFFFC{jo:wjPb`;KYJKMUAn; RzZZLh0 ԧ46k?rf`G}O@}YRiIc#`#Icl\F:SޭjzH^@$hh ԯ4cdeY2,#$)gd$ Y)]ro) ضGè>@I@c /)$( ]sM2*GFPNVҳӷ>426`ȍ쭋ͳD>νJ($' moLy1uPz}mYsgRcU*,SJJJ>.Iԯ4&Bp6fܘ#Irq1l&iU2VFJKM ps(i"t" hVsۤ<n{-eEtR"1 tFᆳcL\cڽ颉jx{ w7^T5h2G2_IhBwض,)xcngM0ɑ!$3cjr2h"OQ;nF;͹%Iooczxzkq= 9B 3/Th@ކzY`U[PWIhlc 5R"cmQH&qd;_{Cx"yճd)"ĆpZI7oƦDa4E6R] coqԑCL #{?߰Y8vt9&ԇFv>>@I@#߮:j|8RG8kD$qd;^4~.d2v C+vâٺ 5 80ƫw~oxUbÍwLS#}lbyY+SrD}$W}8Ieɲ+OCL2s#DZA ͐rOJiVΑ9ع!0&oG|kGͽ{'n2c/lE6t݆u(Ļ *E7#>žU#>`D$CIU$Gm)Œ)Jj5IZ㸋=Ĵ݀66#^oТؽRL/B9"\;GFF߲VT/б+W(j5.)4ޕH')Mq얱pLh؊dTxAsل>%BCߜca߸ǽԸ߰KoayG3p{pDl+WK L{XxF*GslڴIWZ}@9՜8q>>@IiHZǶ嘀l' q'0۶m˶6' Tɶjضa WU{̰ˆ+';7ukeղu)io+u4ڣu5-h>{WMԺyO$tG }^]۲lc:v{xplu~  7;^?*`ml;k^-Z믿AOovyカm۴}V:~:NBiE@렅_-cD4Lg͜+~lJ+ ȶGh[hTB pYe @qr~[ee5Yg߽4Y*+(tE^ջ!^Hxud~:#TT}wPtiU4DFr}C΢ '9:3 ?QW_Yܮ͖,Y .*=qks8=C:y) ѣg{~)5k,yK֬^#q{yZjVZ)e?+%5Um۶fw&&4 =jdWUqӯ9WjECueJ֬YÎ8T7r]i:jQZ79wޭG&>]Ʊmrj5m^Ze+m _vn;C]#Q_Ӧ/(ParM6om>$1 D4m=oq4c M|lnskOJUlެ*VEeVs/GZR9z.hK6[/۱z=d;jwyOLgE^1wQI˖U>c|-/j3秪Ey}}|$#tHCZ; 4o^F*hMke [tqGUeQFfqAzޘ>C;H^U/yK^{uǨeVSȥxk7+`xCrk\K~$:㔓w|CraBkt] hj~Ovd_IZfHRn^#j53t7˶gW$IInPfMӏɱwQ0)y1FW^qnյ7ydhzm:KeggKg۰Vsչ瞧mK.; ='>֡=:xF㟚:Ӽ{ َW_. QCv^F۴Vᄑ5'tCdNiϽիVW;41@eeg)K 6#:!}Ή>$w~d}8m!&N?o;S-[x؎Me47]TzOr1FU#L>.:RM{9efe:@@zy~a#GkըQ}eUVzռY}] 8v?;;[G}.R=5]+И2q,y7n/@d{Es]&o郹bs,K:3tڟO16_\ߙ/|S9(z}ϵ312+ H(@!8Q&eucO=II RCzi5#Ԫ9,YaFwt}"uP#}nhQ7]#>Sҷwͷ~''j{VFV]9Vsޛw}[ U{^˲k,ԴogLp֞cU"_R4)m2U]}k.z؎6lب6MP^~NtLzF+П.RNN6n()vv,SڲekgrҼm;wUktw³//?jQ\eqz g}&m?h"L41, ,)][+_~9_M''= h]ctF>ZߘUVVJ233UVV/Peѿ_ W^Y3g)77W] ,C=#G־>$vfD|򋯨J)2(3+SETXLN;ImL{RTIYYr8Eyx`-n7WfjҬ@gL|Z_~1_{~ߜm>@I@2qyy{{:tOgsU:8vzCͅ >$͛7O:a|@iiizpRk(??_~ NК5kԺuk 6LQMfIՌ1F7nʕ*TX?yI0y6Yrޙ4aN:e***슋kKRfV~.g/6oެQ#WEE-;;KwonWbűy[qcUUUɏM֪jޢ_}Uԗb jϽFI֭]͚3.eI9sv}ϭjw󏵣OR8B3k%(.#O;D~i9Qq{}䞄6^NI(Iq#y5̬,-P-JZh+ձKGefeE?\t9ѐCNH}8cǮ^tĀWs_{hW')Mu ;aS=壆)+#SN1 9>[]ԟ4C3kbYrZ7#4n/{)7'/|sGwU*I =4;44$Ґ##;`yS (A}a0sIOOWAn٭J eHy*jQ&JOϐD}4DWrƗd,ege+-5U1,Kii1g$P"Ь۸ί9jѢK?m" vfIhzuC/*(<[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[i ]mܬk- ]T~ne5jhuV^YזUW ˲dddɊ8*1=&3xlq觌{Kѯwm:Ք+T:*[eUشH9ل  6SmXq鲂?=&5ƘCK(JqeBA)+F˸ ^'x蟊Q6G e}3{ێ핳!E#оڣeX j@j[ 5fD 5YD IDATowcINDם1^Q9}+yqOѻ#cN0D螕GOs+m-ڡ]Pgq x )*H7L)71a&bY' * %&Uc8̤pL(o_8tEBd%!k8o|cF,ۏ@3wxh@7DΚqBmxKJ1P%+%:4D͋YQx"ziB'=v(BIacN^N0׍J k{Kv;elPgq8N00h,yo(Hvy/X2rb"C>$.[Ot~/F  Όcd;bSM бbG{9&%,*l]2nfšK2u[*?'=x=:&ED= >ꃉ`bN(P1j@$7룟'RLPDɦJG*M!2az7ti)?7=zaogbY3'H==4P{@9ζM4+!7 QbBNЊd!+lx`Z{CKﺾ*O?\1G꣼ܴ+y{Wo%x6= Όqm ?@3=QL,iAi9.薦7F~a o=V&!դ*//Oa "a@Q\C Pg{USoNMFW=\ KS[!M6$>NZ0q\&?Byy)HKm8̡Z#̝CSz5ҕߵm#̖`2S3S8E Fg;S;Ryl` PgqѨJpuա(M??nh$I~:Zd5d&M>Ca Pg Cs˔5Z֚Wn~Hf"m*Kk*B[d{N_ =.r#qj{jοQ_,ʖݔe?2ҖҖ*y'mH߳A0j@}sʴm75 Ej*G"ZR%XRVjNRUg'Q7c@B Pg A &`YR|Zj^0̡#!IKcfkyLI-wm9A@hu8 Ascr-x{9U9Uv0m@q* '/-wո6hMC^@3cLD;}=~^4D;"2 =4P@9Ʃafsh4:3 8fg*gP{@9Qsh@hu֤qSmܸA ]+//WM;@}O}3Hy8UL+Kյc. Pg%E%Zl~Y[Mk*)*ih;JZ6t1.ohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohoho5tr6nZ-[4tQ|+3#SjըCYyf^[vWA^,˒%+౑Gsl2e,ENRܹžTS.R*ocח˿Wa"dj64:PNmZU~Ncm c-+=VF pq.+x*rD)=x׳ n;WΚއQBskmb/% 6Wqnc؛-wdɒ wmnߍ%9=(^wNDP0xD7=MD9c,n{V":c;W| >ϭ _hvE@9 66"zd0v8 3D`OeEWcdPKpdX((|^/PWD3=3p:;c} Fn(Id")szSl? ΌcWRToͣqE9k -)X2B)F5/&gE92 ء` % 9҇z"8@^7:(Y&|/Q D m@9Ƒ8qLD6mF&D#ّ`Q AN\K4nLl"?f;T.n]Gucy6@3qd;.EmvBZ 7ȉ / !<̽v+=@xY84*I8?(L(D S M =12n8 Pg^sLd`c{{bW J:><'GRk&_VnSSoVy>VM~j:w);rYf'4߉1l ,&ܫnM0̄>  Όcd;bSM﨑bޑp>Z ,1DVN9+PozIgyXx=ى-_DOKԓ#^Psh4:졩Np?>ih|H+J+{߃5SNnT `+jRd\+{cn@ Pg@ wAqgEm 9եݚfj^҇m~YBRh~=b%[I-b^0j@3c!gOŊ'I&QߌÚ7?:WjmeZ6WЪG&ꂋ*QcPzh4:ssezs7ѣ:J:(=3>Z!-/XY!^ݚ[u 94Pk@shCSOn|^I=J]wˈ;&`4KT%}T*+ a=1{g̡#8N6eY_e7/Ђٯ?ѡvKdGvTTHW[0j@ot ׯN?Lo1"VVHk[+77߇D PgcdW۫Pt(;E߶.z~9m94)#j"ؙ ٓkf[SNn?|J1j@rLFs.Nc <^6ݢIܼT9uY>$.@hupMv24jvׅ|LҞl76WGƫ}A&h%}_CGY2̡ըQz`]4t>"yNTJ=t?&]%zh.4:sCΒ@NNzy$AE7Ȥ Ir@2#ѫ\srSȤC7؜I@3V0 =4P@9Ʃafsh4:3I:ƯX j@3'j v5 Κ4n7(77{jҸiC|@~")Q^CǷ6tevEI@3g:()*QWuגe ]*l\];vWIQICe< ]4'.`TIQˆ.4.ohohVr숪*qwmаRd)-5Miii, *ThZQyg1f2^hd/)%I*I]"%rH ¯%s|زtda1Ƙs]?>|3mx޻͍uz_zr!lJIWGDDDsC+UX|0PB#RNN)gNϽ4ӘKJ"""r;?~%80JXsJJ%4R*ZsI~%6DHd`FzfDDDR-*T͡H?Rt\-Q. 9RKXȵ81J5~3  a&K`7kէV̸ݻCx %%&]ECJکS ߿r>%4"""r)Nޟ Nz88FUL$3Fp{/k}K."ѥ'>س{wk#++\IMI9tвkQqbd*Gk[/ך&âP^xiytMDg>w۶;WiiguҜ;w pl7^4߄?Ĕ7&5%H?wK,*|2c^[z7uEZR=cQn],9r- .`kҤ}5kxuֹ_חm=AN}CBB8s6.u˖-d <50!!9|}}_,X9svWWpff&3f̠RJ;̜9ӭ111l߾m[dd$Æ ###]vrJvÇX"`ر[k?yfXr%ݻww3gK.eӦM>}N:Ѹqc>>SyƍǛoIll؋׎;4hK,QFt҅ &oqFF޽{^;:y$:ubΜ9$%%uVƎ_͚5kߗ-F$ך8#ad;{<B5CS{c2-Jtǎ董t}5Fгk/ΚGፍtg>m{o7/LJ+W=iĻSs֫psƴ>Z7&IZ WA;̚1 K/vm]6jMB2wi٬M1I;<~Ch.nטww`(4u˻Xڋ*n:Z55ϖ\p76[ZÏşrmmhߜk{< J*ΟP羈}}AAAn*Wu# B TP\&Mٳ sctR|}}yXhiiqy]J|}}INNfժULD^9ڹ?3jH6ݺ0u;ӃW8>ehUK F=5Gzc1n=ߚc_b/yEjoм4i҄ۻm={6 [n9۷0h֬s[ٽ{7wqǏwe,[O?c={p-xNiV^3DZcnhAvƾ:(4m̦Ч_oѵS<1p@o\3sh~v[0} 4`"O+$%%`.Ww~Qu^ٓPǏB {ޜvϏsΑآPIIϑɩS^scȑ#Gt+Hpp^]Zf?ÇR>FDTv&;Ǔhܤv)ǏgO+WqիWS>UtؑiӦ9?;E  IDATyڗwڵk {u۾`6mJzӧsa֭zDGGe1!! ##0V,X={:ӧӦMcʔ)]=wvv6UTqΛ5jfСCT  <9tQQQE:RSTcgѷc޵7gƼ9'ϊ:mva>bpxW57*&k&T5j&3`M|~ uag+?g? eggϹ][Ƽ8`Ãr `ajW<5l~~__PP*UПҤ-IpUZUXܖx\iigy3m:<ЁGro<8W3Z rU\m^UV/$$Z$)++%KADD[>z< 7܀?3͛7`/Zm۶c<▓CZZVwԯ_6m8ݠmNW5X~|_R4h?qn߾ʕ+YaC^wfÆ \iŝCM֙d#+<֣?oN}b/[Tֱ1$"ɧ:yύΜYsƺEvm[v6aj^kqs.$O;΢?YVO&?YzzwKVV6G+ =5a'iq<2}\A麞 `+wcxa} a'ΧvS}[%()cLjڂLG|q`e#,y#j#v=D`t<# l!6KztͻxMD0vd^[{FDDD1L|8{\+5MK'``Xl=>9y7Ip5Lwa㑧o=E-#:z5cq2>OͩZ-M'QMnjzhsҔS^_J*yw/t)+k0칧}ɜvZ }f}qo^!nbVg gLg4x㝉;yC 4L:tl13xؓ0qM'"*oBhն5k\û3vW~KCMh6g~s6-ت1{twѴc;n屁hߩTRIE%4cv7Ɨt5ʌ{w!;/︕];`),*p HA9#Kä\Lbb=phb#H$係f#l:ٰʫlB@ / -&ħZXXV3 !((s@ P\\Lqq1Fhj/]Ugc6݈iFB+E.ιUfА 6Jmyd:EPg &:PPU`4 #35[}~~60DFd2hfSi׶5BH!6&-e|Ӵ_"H$߀i3w+LYUnP90uoa4V?#7f#77bdzv~gڵhFΩL15N(*,溩0Ml ˖NpPё[|+M˨C[?Hnn!gNFIig+ M ˯彷^s '>D_?ya=-fJڴnItT;v{|w?͛5d2qa^~e%91ؘZ`D"H !kN "bB\dj6jA-#14 -F@5gkba#4A`` SPP@+ycjJl%REޱtUkhRd Τ ǹl.8B~9%6;ݺvgO%/-V.tcGt'K'l6{bÆ X'4 aoӦ7LG{Z~XqK$D"nl6;±"6NZUr5Ct0N1og hBb^^yqAlEM1/=5N j{\1y2w]zLF3ł^u7,f֭=2 .{cO`⋯e䋹;\v_}CėԞXZx՘L&ڷkM^^>1&Cy݆Bh0ciݒO? wwlֶRK$D"7(ʳ(_wEmxo:YJh;/6~mBiߐgP/F1|K,bPPQ8lwe AaQ!HHHJnnm>|[2L@B|٧r81 KO7n!$$CQ}>B`W\>`2ʊUddfѱ}[~pN?h7b4ֵ3BNn)LFvkA,uWOXJJJHNNh4֛ S9kIm/g%D"0|ich`foG4l陴 dbI;f/tE1ںGпPSiٲEEU;f}:V`lZl*bBh &R6JJt!`6-'Wu늋\0j$S&__~W_'(Hx!`P0ǣ輷`Xz ! l_wjD"H$Gf-f^#+bCP-cCX6Da>s;-<P t\ߨvLBB"Z"66`<7iiiԸnΐ!?vQY滀*Y"H$ TXʣ k6޼a0U{"|cC~fsdS5 _Ħb+#4 EQ0 X,D"H$ڣvB4;si) k3_-, @1c4Vv{_#lpx"c'H$Dr0 "m.`pP-M6 87@6U[ ivF@ld[]J< <%AșdD"H$g9y4kЂH((Mxs_Ifzo4Yn7Dld$62;nzu샵ʑCd椣XK]}7_~7gs\+2uCRl#C#hW)5]/*@ͩ 5""؟h`ܠ9f I>y]~}'ӿ`44Ò*P]m-9y;FMh۬=!Ag̍c ԛ/u7Uߜq9Ș ICb@CàόPZ~VX@.K^a.`ЪI[b"l%KqV¾{ڦ'QѨBzFbYv,w^|+O柿/k\կl7EƼB8S!TEAv1D+hWJEm}F7b1RTR*TBDh H>yLwL,>L(oאmg@#bǗo?_o渜}Wd MhhB"4EQ4t@B:=z6&  BbȷvHk/k$ % Uכ-;׻/u7Uߜq9Ș BE ] \=EB.Bgµ?歨` S†CW񲘃JGMPU/|+O柿/k\կl7EƼv!BOT}WQ Mvn)!OsHj,MFyŹ܈3C3^K]}7_~7gs\+25Chz.OaP(!4@g~AqN;iANN.'RRi۾i_Ƽf8o]visatI>'Аjg vL{.*۴i-$!>&2`@}1\e4m•W]Ihxh%57iżh+uus[Lr.F EvJ˝ _jٶ3Nr'e)*,Leٰlf=sΣ_ݏlΓld#BWO]qo1j{ϖsZ:µSѧ[? ng¨ ٲi+B{=<贴_syՕLzcl5MȚ@z>T2K~^X*TWyMn3Xr yy.{!TTn+5%=U=v4PyE^~>eyyyu/-XG}'>!A"q}ݮ:zqXQK6pϿ0ʹj݊nF~+KjԀ /HHHpT勦i >`=D3a>kf%ջRffd|摐#]e ;l ѹ¥Ju?^&]vQu6ּEBs<\V?x47ϜIk_|C 1jx-f~~Wf͜?l;mmTi:徻j͖7dыyc-605i 2鲋/~YV3K3`p ?L{)6Oƍ oM6ToyۯLHhHcFHsL*q7O&}^6VWY/7-f.xZ4jS紬,.xYFbbէ'W_{%-[tv h߱p ]u?s˴XϾb|''x΢#OgȰvTBBk˱Z@Bb<,d.d"ڴ7jBM?y]{t%4,FBs;q Yz>9q1\r@9¢Bv1|P\8r3 9ttΑMC1(DGEE&M4h C 駞fsس{ÇXQL&7ϸ~,z{ˉ'yo⮻.nhbV< 5<<ԓ)l6[ʕ(..f{EQ߄ViŴyWTˆ>ekk9hق')tܝIܿWlU2zuDD#ѸicN =suF6o3g5Ӯɓx⑹'s u^e%_|kOewc6.hӶ5Qb!q&3#6ڟTFs`@]eg]i r/k<ڮȟo%%%dgeWO#x2.¥ }9dg0[`(|mZ$5䉓!xn^xyG/X q1#v#0 ^We?CL! 7fUgЩ=:Q?WshAG|DFӺmkqOc)=&'O;~bm 1G\|N(.RT\TNU%f.2lg}{gˮhB0 GŁxb}^\u>>zGh">p|O7o %93ot} ٺe+oo6?^ڵkx9{n~c6}B]N %--eK;fжCڴo͘ Ц}k˘5sfwBSٿo?;f/rhٜat?um߷wL=1i%|m|/Gѯ@.{)?mUj-'1pF*NʲWQ ^_B}iҬb̄ \e쪍׼QFM%($bc (%0dp؆mZpHhOmؿOWqlٸt\`Y&Gpbc;&c]e~w2}2kn׶nCп Əț®ڪexs ;}r˴[IIIqO}ݹ/*zhÌ:=q~FTLk1 !"JMl| ѱQ;Ka$4cԸ{~m߆{ol>ڠ!غy#]@|ѕ!\M}ڛ\wо#IWկ10`FEN)V++WrՉ9ݤ_:N}/spm;~8;h;A\yTS5'BL\4]wO=̈QÙP]+DDT8Z6ֻnFh];Ch*Ж=ᷝ\uot3&HLJ$33sDL\={wK'g+/!}3P{q&&=qbk1t';#4_ȶ-ʍ[U冏?e⨋} ϿzW3i% ;otW]8Jw8/:.*,Z;nCҿ F7۸h%1 G_LVvkWɴoVecIO46mDbR"L«>`2%16l;(g+> dш*%rE ^7HJ";;UI K&M?iO<%ݑ#ѣ'۶|7V1k, ۾W IDATGbUh$ B@MU+W3k,zs[a3OeNHڶs ^[wͺ֭Ю];.RlފAXXZ\LM8.Zu,?|#2f 8={޹TֆU/}e{YbRSNxl:ŭo׹=ysjvΚ1''{dʗx 8oz"+,]KKiնa*~=lxlF؉c*ſێ1x޾S;rNpX2l9#F D <*vm6*;2)|74oU222㦻/m,zivU偻FQ|n=v%iW]75V1qcǹLݹr>CU!#ǟ]̎~uD 4 ȝWҫOfx'99_:4}xRSCKO>6o*YY4nژ'_kW ]UyUL~51dddVy8r6}!W7Х;~'ynWѶ}n \[Yؾ5W4W¢"|)n}g%,"wۙ7w!w{;k?ԯf/|9=Y|m4jҐ7~7^AJJJ~LTYZy3c捼-=/aB_xǹMy!*CTUjT:cbyrc`8)f;uBxwENzZ)='?VW|& 5[u9ULrr2QQQ [9k'NЧW7iN&_HKOt7oVeVkepQm+,, //td#227VelT/qu_232h2zǟK~҄~Wfҥ{g<)Std~s !mpt 5|7u}\m$ϵ7N%TF7qMұs5iDI >>2QC:7_|QF\:?Qef- _r?m !{K.Md ;w$8ynl\h.2""#:*]i O\| 린7e۰qCbbcHh ld6(J 1)qq9FiSn(SmadP!̞y UO_t䉓dgp2$776Poʾ=عBHLJ$2*˦\BtN9n}d6a4ٿO~Ͼh K]CdT$Q4iصNQ MK؏^r-t-duǟ9w@_ ֳ+ 6nl6TiHQ94gʮ +3ӱi<783ɇhٺ%BNeœ';9! >jadedy=Gdg0H8+'M%44=(8ظ bݻ1 ;(I|M|差==7+/Eh߇P -ZӘ{;ݵ1j~(:&)L滯fۦ qF$4Hb p;}VCLl CFGmo!9z#G 6> *kl5vsZ ۊ Xڑ rE %%%MF >:_'%%a0DDDk!,|=p!5jmW/4Y"5x?|n9e/VW +2<"S٧mFMlFUUz1n{|إO-žL=<3ΚVJR$'-FMo~N|X&''"rHlնJѧp*,_E1QtٕO} <ʺZTcʏEoРa"ݝb% _iWo?i\KQ,_EV+MVmZ 238vCBFzUf-:Un+D+V,{pTG]EO am=s %,,u#KUWv ]pX2ChXCG Zdk.hk嫫IINul%hZP9xe}:s๮6Kg*5^$!j@OPzP6~{ۙVs~(d ٹtJYD>Z>j?}{IxDc&\[!59K\B^^>FEGtPgec IVO1|_~i4XY^~a9>^2f\Z{=7#=`]TJ~~>)4m QgHrrr4Arr2*O7+mb;xח ]xx3Ml(|]>(0]:0jH.=MvglWm`1RT\w[K_Sl-qɥk\uhGNY̚}7;zsz7Lb2>3ظ8Zn'ֽ͛7c۶7qz;`89YֳKK4 1sw&?<ѸI#hѪyk:SSOg+u,y96oX!0Jl~Gm✭&MpTxkAVo_k9◟v]p!9z3oFMѩkG'bAH=ro4)).vO`P`;ۍSeWئ>6K6_۸8+.> Ko y)sͥ׳i&OzU$]ii?u4HJI&bbzڕ|,Y=r"`qͥc0GBh!?/k  =|.; ?zC_a<5u(O/uhˢwǃ2~R'P$ގoOK.zMꊉo~,ҾVYyOQ\311cPvU_6;O9,Ax<7iOp;Oj⦷D5ϡ9%"<; LQTXH=>dO>>>a $&$8z/{x NdPgзw?n: sOsٵ~¸(s}IlE_§Κ8Q=Nv)9;u}غiiii9AQUTW7_~c9r^.$&%0x@rOK+HNN=~EcX5rWOܜ\iǎoټa Blް1./|2Y+k_*llUmKlȅ]§p>¶MϑMл99?ʨq#4d`,_*]{v/gI4r{n,Y"B 6ǒy}J'ʟx?vv7bUU4 FқrI 6%))>|Z~8ƥVf5}f-rN^MвM 6`kk_tC$4a$>%'Ndߞ}4kٌVmZ9!mCx]WYBp!VBBu_ M C7ңʉ'9Q=Xg-++'<|K׾ d[ػ{Bhqc/UOE&Z˫$Ӽl{hnm>#x2K/C=xq"$ٕ6_I~~>1QDEG{;jH6|)o'8Q= 5+W&%%~lWݕ}zs?GO?8z? [g*BUpфsAvXm+5%=,r%Bkk38r/1|p6M8kݞ}=dzyd2sqylkԸ1_Wf}}lxk}_~՚íKAS7ΜNR$>~=&# h BnߚO略+"44]:8҃B"Ţ*_222YR`4i޺O.|uw3KgwIhҺ],]lyfLz6I"6>-` IƮF?%wdڭq7g^wlǼOtKyM, e]?ބ4F䩗!4ATLdy#㮛!?/Fq݌kX Jl4i\WUUq)s8T/^qѯ8_0|,xٷ y дy/W7q#[ﯧm,\6'< _nGhFI7_uU9<|6}1/`ب<2QV{VqhyɄK֯1zk}bDL:f:tnϼOc sm`0E]xhѪyRulKxOPTdXڟK^Xῗ[zN^yq؎g_xxjc ϦOdK <>4ʸsY7| OӦԨѱ<1v)^]S:eC=Os|5 \DtLs?egeeSܺiVNh6f -!=yC Mf MA:XV[FmGѺi[>gŸ#.fqNF]o_o*.v _$,?5*77а*,*˥5d?7?bO'5.W}s6l"c^3"#"H=JbFHHDnAa>'OG{ h|ɩGINAG~kFzV/o?_o渜}Wdkc(|XUն{sHkPu2,ӳӸzܴJ8NZR}yUU"H$DR1y"%-c'b2m5{@5 1H$D"9BBN=s(A!sH$D"H8`1I&=:@H$D"u,$7$%϶R K$D"H:E!nV dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7LDRl6V߮H$O1`20L(RiBk!(.)>Cޝ}X,F\߮H,QT\DVN)iˮow$DDE߈ 1( &U JEVDGۮ84Msmm;_{+ݎFuॼB~jVf^VAGYNfs(ob _,?f#;'9@]P.I$OI>ɞCd !!:jZTn͒B_&xA! 57!)R(<Ĥj5)OPNM T:^&Ru(ǹ8ĮM|;TzT@;k_ m}u zͩ΁p6hFrq)%3]s"3-ҾEvG"H$~LlT>Iq +ȅBB"P @SpBѫFR\*(YQ*Uc&ף g4 VB^6\*5K]4;V^CT.ۆFxh$;`1R KS4rsk'g%DR5o_U,ڲ-uT!49H? 坂-CE)N욣 ᘉv똑5v/յ{zE+3;G3u5G=#? "H$S&fS۹r[!: 2i^(ZiKk YRQ e)e*;ա=l7@OPW:dS)gT9۫(quUToπ(4uJ\byp9g|KEninu{ ۿOp[?Xȩ4fkϟO|||m}eݺujjWaa!7t>VEQQ6+VモX"rّ,ND IDATg5TTME*cVt]ߦ6*BS *T;!T=CcWU}z=*T44TMEў#4^fw׷Jre U O%tׄiЄv;MS5XH,QىnڵL4ɫH-{" Ʋe|룏>"11޽{l[?8W\qvof4MyѬY3kHHH $$;vZ6mڄ(^/{hJJJʵתU+Ν볟DR]b .EU6a/-BSUصvG=Yjw-vU߮Zͮ iUp^xbeTop~SU2$<_/Lpp%WםDDөsGf|#{v'TGeWsMˮ".>Kzԕǟ/20m^xo˯zTƛﮡ{,(I Ke6{wyVW֮]ɓkն7-/=z'ʕ+?>+Wcǎ;v|.vźu눎f4nUW_wacٸټy3ƍsc:T#!/H$ե 'ziSͺ^q-vDDDйkgny]vڜ(zsͺcJSs|||ɉRJʕݝ֭[fy[f M4I/@ ib!|o\dJJJfG9}e+Ɂ}!= `I"O.WH=m}K>"-* Λ. b`OR2N,+qBUn*_g ܈IT>X*U^ mNTTVmZXzyxxxၵ5vvek[;[Zl-?eЩ6dPB6AiіC} CHܱS-O?ӸnSjDND=H>N`]%kj?jhukgܽ{t4LhaC {[z5=z‚۷oFn8<&Ol۶DOΨQQgϞMvv6l 00@h".]Jll,cǎ۷o(7os%==˗/K;tӼys:uľ}={бcG,,,ekתbݻ8pCqu F eĈܸq &|rlmmi߾=ь9R ر# .d…<|Dۀغu+YYYi%jG JJB,̧ş$ vWȨ1ɵXdYˑÇک4aP#F@vWK^| ˄q=r4$ 8T^VˬY4hFp`]=$rڛAѥ'gNRKRKRt2QȜ=!ό@6ˏC*&'9ɫmЪM+[ eU\b5;;{bq%䯠8~qǰ>څgͥ[ٹwńq[U^]G~AGj;IRR\ˎprrڵ>tO&OS&srsrDy!~ރel۶M qذaLělIzu-V}WW\\]8x+UۋMVVB͕ /Uť<y$҉˯G~#TZ/o/W-_E.hJ3;wJ.+<[lS] oShٲ%θlvYq'$$pQU geeBͶՠA-[G}?W`ȑՋ֭[ӴiS?^=!!!X[[{n;Fjj*Z:Zh+aaa\v_$I&lݺׯciiI-ߵ}sAC~ǀ5o`ٲeGGb?K &@R $P=smYWX4K 샽-nrî m]0ھ/FyP8 '%.q׮Ak88:persqI7mH2DDDAݱ&''M6k}صkcƌaj1̟?7or:u0~xvYEÆ ѣx_QnmB^i‘Cr<Ty ժWc,%ھɎ;$;)HIf4ӌWD;)OKI,2o""'''=#pusYj^FF4ƌbGcW?mV `!:pQyѫO/6m/{KJ6HKc8{5Ve%55l^ߛOsST)F~X9 ~Už={LvB޽;iii9Xnܸa$V+?zVk\Jv7&77W~l~1ydaϞ=j^bb"gΜ!++5j`iiIZZOƍHDZHOOG$T±c8s /^Mݷ C a˖-\!CO?akk.T,l pqqaʔ)l޼HbcctsƆJ*pB8@\\'N`ŊT^{-WZmңGW^ _OX95(ve([OowZڂz 9y,QίNB|zx /wdE"M rCQh҈FMr!D"+m۷a͖U 1+U9p5#k<%N"ĢxXZY2elii )Z~0eN?r*~ׇB?{7nr4MyšC0S޳װW4XƜG[s E*|2i:III\pI xlX;vD8nKܺy Yy9e2fE'`ԨQC]pԨQ+++^z%-Zqww|H+ƍ#77zͭ[ -.\@nF̜9͛ӦM4i9smDXXcƌQ1 \r̙3KKK:wLV !44hπ6mJJВubQ̞=z쉅/f…\r۷oSfM4hqssܹsۼ˄ƍK5jT 8X\LRSH4 t:fvͮ9hܬ1,PΞ>GԾ4iޘj=?UX+$Yd\!++??,,,HO@h$'l$'rm.>dre$Y_='$Yf|1k_W~ V,b??DjP//O ghU*B_;w~z|>ȼbkkCwى&1{lƌ Sti,,Yd!?JXpuu%;;}r-|ܾugg'3r~ݽ߮ ;; >Ϛn z VZݻl!!!:ul^ŊL-?qDڴi};;;,YnŶqFƌkf圁ɓ'3y[[[n:{>|9pIڵk?-ˤI[,֪UKݱjժ1lK.5{ߘQF)~J@ A3p"}6[|*x3`HIwr\6M˒_s/.5lmJ#ʗ~z[Ѽe3Μ:GՐeWbtl\֙}SF54 |Y ەX[[JS&L5 IxgINJrJ>yRK!Wc9{ܟgA k\޼S+lڳ~!Q?h7n``O)R\{ϲ_X3iGY$Mw.e]ߟ85ߤRJ|'Džaqqq-+V`ڴi@ 빃Mvk-M@UYwqyZ5yoi++'fŮ`AY_pZ-^É8XX{jɵk׊Uk׮t&{' @9Y8ςYG,j6I_ @`LC,{p! 4Zے >ms@q;">No@Md ֶL) 'O$@ :\$mDx+++l-챵.{7K*^ @ ^]@@ xyM@ #@@ Y @ 0Bd@ !@ #.<,zYxFNnοduik흱{ڦ,x&5.$rm@ Q:Oo,4(8U2zJޕq6s FGQUlYc|_AQt\)(`L|utLy ک(J|]jY10I{pk7R΍2OW$ ,x~=bn\ ˺?m@r~2篝ֺ =`*A*~^qwDeM# :,녡b$$e%_,ʲFca"&5h@1ZE1aԫa&VdM k]YWpNcHz+˲֫jE`{֗W }&c5zŠG{G|=(@o$ݻEM *xƥ+N=w9QedI' QW獶PEp gFׄ^ઍ=&}"5F/2F|WƪXX4o{EAˊl:4zQ]3]G{gbYB! ՄX OǭGO(2YeU4:mP{K*UKFEcjݡ*t hV}!tB{=:;Q=~W5 V(?F`z x,xᰰ=zTb6lK.q']:}GX <уAeYMVddEBR$$YB{Ekuy"+Ȋ,KȊVQdɤ,KpIVtIֵ#IH(ȊV׆_u2%IҢȲjlԗ~EVt ֤i#7|M"WѪU+,YRb"##A%[ӦM㭷*q5kzɸh(U/ܹs&5k%xzzҾ}{=/XZZrԩزe 7o>@ () dФh$IZ]//鄦$i*Z};Y'.%I&׉Zɫ-ښď>f\y4|Uƍի_j?'ϝ6GNNNŽ'NOΝK_^^)))DGGի$zw^۷={6of޽TZ6m͛7e?Ф}I{w)}@PR 0 ( H/BKapc0'O꼼NʒWLZdYH%)OMr|Ɍ`yLl5`7JVgbksaF ƍ|Uc@߁Lf~y Vw=)&=VFFeGٱ{Ə jHMMe. IDATD/%V|dV|I D޽nB(y~g СCԨQ[[[}Z6..___llle&m}h4dO*=vڥzlZ-x{{cmm7}tcƌڶ=ҡCppp`ԩj=QQQTX˽uV7:t耽=hBoҤI_U.^jժr+Wooo5kƪUٳ'C 1뎎Ȝ9seY"'%%Qn]MryO$'Hzop$Ik $>+%v utaJ慳*/_*U+qȲz/rV:NF >5O§\b) ʖ-K*Т+Zk}>ߤ\reqquv 3?\NnJ 4eߓY4lԀ'z o&䍎]i܄Zj㍞,k^=5֢CX'bĨ? EZ X ֭|As*ouC͗_!otke94lNz!|:3$xcWjDM9tPq_V^M=ۄѭ[7Ο?OxxI,۶m#11ӧ3j(bb_ٳg '߰aEtRbcc;v,`߾}|DEE̼y;w.\|XﯶߡC՞͛өS'ۧٳ;baa,ˬ]Vw:tׯ3l0wNhh(#FƍL0˗ckk[6ׯsrrrXb=z;\jU{=~ĉY +/|z\iM(``劌>\E9|ѨNc5`$) mGpՏ˗JL7#G_,`ү0@\f"A32!h\$)w4 jD.=9sꔉZuXN 3b8i 999TRY?axڶ ڴ*vKno˾f>>&;j8::ELL vrr֭[憟_-,T{,,,ҥ v"77m۶ѥKʢ]v&sTre<==૯lْ!CШQ"B iX|@ٲe)S 'NdԮ]y˖-ȑ#… ܹлwoE@ W(.ET CS1(#%Y&'7-b`,s*,azEfPM~52|06m@:p832ߨN K8gO#W>q^=v1zHLݻx=BۄG7mǑ[-N*r?IԮs1glWSנ.i\=<=Hf2];u#F=nș3g*U 4:|+V߯MT⏍ - xzzI=΢nT{;pɯT[\x[ckg?K,jj3rStڅ{n\Ann.>| HlٲOOOu\bb"q)Zl3$''b8z*HIIQ=iР˖-㣏>ߟիW0rHzE֭iڴ)Ǐ/Ԟٽ{7ǎ#55VtE-T4Օ0]믿^dYxB&MĹs0a,"ܹsɉ"MrH0{4kKhޗ{{;}[;[]6Da}5^>pp6OJ]]#++ثpptʥ>4nڐ2elyqqؕK(Ďw)GoQ ;w|c$Y1?_"=<3ylߵÇ2͚{!;C1Ϲ};sm:'_+vA& qvr"f ={{{^ m3md 2Ѕ=U^B՘8e< ~IocN$INr 7hRM4-ѠNrR$K̛ ww\\,|M1?.v۹l\BMΌOsS)یLx{PfL z@իmggGÒ _%U?f9u|4Zsrr"9A2eptt`_pi^>͹+gشunn̚{"9)Sg瑂_g-ͺwNZZ#G$667nh"IGjM^*UcnܸAtt4E_zc۩׏ɓ'MLL {Q9s YYYԨQKKK8}47n@$jժEzz:$QJ;ƙ3gx5ڐ!Cزe +WdȐ!Oڪ  #;;A1|>3\\\2eI;wOTTzb,]VVV,^~RL*Uİa/<OX95(ve([OowZڂz 9y,QίNB|zx /wdE"M rCQh҈FMr!D"+m۷a͖U 1+U9p5#k<%N"ĢxXZY2el3,b!]o@_L‰'صs6$In]n`ߞ}ڛ\Fi7ƜO琙IvV6,c;N&xwPm=E!"%Izlk;ƍx}-wᣪx̝~?Ν;\8Qbmc/iV~zjԨ.|`\p`jԨ/-bS|y$IqƑK@@{֭[p.\[n&6͜9͛ӦM4i9smDXXcƌQ1 \r̙3KKK:wLV !44hhڴ)*URCK"""ԅE1{lٳ',^ rJ*v>}رciӦ65jDΝeK'!>7os~!c.#2?!2[7oY BQӵV,b??DjP//O ghպdgeӴA3J.Z0d`ʕ+WheUD\tt+K.Ͳ_ۘC[ӷW>x= KXxs>ây\ I=XYY1r(|9pIڵk?j2ij28K\z{6mRpB ;[?Mq=WwWYļcckOo ;NSPcYk%FsMidY\oT\h޲gNzjȲ+1|:u6ip.LϾݩ^yK>gJ y)I03'ϒL媕8},JB%brԹ?='ς@|DyybWشg-:C棌,AAbꊬ%/ȱ3HH\ʺ?qqqj IJO= hXiӦ@"빃Mv&j+++WoObaagosڵbڵ+]vGm߿@ aaA<γAeپk6I_ @`LC,_,()lm\9@ xI˸]~BIzB (<ۼ ,xږ8e8d_i$g'_+- @cee=e}&qIŋu)k\ܰQޣB˕s,˃(S_$33rOy%BP +K+Z!N$mBeN?;vuYLO!/ yRyR6E n@=bcHLLxť+u"@ _ O7moBw%@ !@ @`@ B @ F,@ !v塕~t@ ^l,`eizŃ4rrs%?K[h6EdGvN6wu'?ms@R֡,^n>xxc@)ĩ;T򮌳S4?b ;JAf磯Нm|O fk(NEQ W*(Hڃ\yrn}"Yd E^^s 5hXi$g;94ep/^SiR󪈣#,n ^ЉdY/ #!)+bQ4 1AA*A kLE^ 4"kE^XנȺR{htBCҋ]Yķ^U+u$P`0A+u8;͔D!%-jP6G 0.e]qw\i\ Yp($K:hp':o/6_8k4&WmT5PFVY5z!1g2V*ƢY#{/z BXVdыꂞ}((8;p/ߌȂ p&<@ x2>n8z@1Ȳ,yh B[W^2(W~X7VT&_@D꣕ Wى5x =:-mܿ|oF)G6 ճmSFd ؼE I,#)Z@4h;5 1Ubڸ!@S 8L  q5R(pOSЮ[JܤhVTMCB @}@AIx熬Ȳ_ _KQEQya ( #[<W"?85Y*痕 ؂buFv`_WE/&pG6(k^~,xF(  Z-m+WbŊc}~&Ly ЅXH za&Rnj ^ZFC:.P!l\q9*o͏οF0m}à Jp 8x sƍe˖bѣەŰa(]t>8rO'z1Ȳ,ɊHH$K(zh}.OQdYe Y2 ,ԓeI!iJ.ɺv$}9IPP }YPk]\~_!IZYV퓍QtٯȊAԚS]bڞ<>m@pFoiV0ZjŒ%KJlWdd$4hРubڴi[%fz-8wn޼ڵkcgg'ڵ#;;EQ6m+V???ƎˣGh4fOFp4hj'ť8!,$P^˓%Д$-Z%?_o'_4ĥ$iդt:Q+ iIJ^k<]Io[~:_}[`N$dfwSgܻDѰlyglzA§`!2ҡSB󜝝x!f};rssj,Tܺu!Xa5uQoݲ9QaV$B*cƍ_/NQW^os[8qtܙ~DO󱱱уptBjj*Ν֖+V0g~IHH ##pm۶8::bii'Yz}yf͛W AI(sÀ.B2S̶5S'O#INNN ɈQ+& >0ך!.l]}mS`QYyvB6[ r-xt~>&X<?3քp!jԨ-ܾ}[-/666`>Zc׮]W7x{{ӧO@&7f\]]m۶ҡCppp`ԩj=QQQTX˽uV7:t耽=j)Sp5ػw/gΜё/redYޣr4hЀpyԩ+W&44:ハ兏Ӈu֙qܹxB_o@ /B2ITȔFs0V~C{QFϞ=l5vI7l@`` .,bѢE,]XƎÇطo~-QQQ$''ӹs璞˗j:tPi޼9:ub߾}j={ر#ȲڵkM21*UO?eo6l 2M? IDAT;v|,$}DGG3rHc\\GRRRY7x%%x!Ok@{;+WdԘZl,tԍFu0 IylFXh;ץ~\Ve¸9ICX^/j  DeV,B4#8.VEr9 zwMàFғ3N%)I֥c):{(dΞ.C7;SA=ԍG߱-ײM(+bUdff;(iuoݡ޻{.O?F.|>k.=ν;-&l݂ǵ? g?RyHXZvކ#׮]#|2y2{wC'|r>|Ȯ_vbcn5rFF۶mSC6l؀/'ORJᡖVZзo_*Tٳg|+++lll)V/fƌo^ptt$++UQĭ[HII ??1[XXXXХKvEnn.۶mK.DEEEvLPJ5|p*UDݺua/_cǎQbEZnMݺuUOs9tׯ_J*tܙWu",,˗:֭[0`@ 8X> AE1-29lٴ{{d+WQd [׳.r-5jۯL8#iUЁyAF8u>VX9{ߟիW0rHzE֭iڴmBBBf;vTZjPFC޽vaaa&K/tRn߾MNh׮'NI&lݺׯciiI-8x`֯_σXz5^^^lٲXuRB$I. fϜCfmiV~`oo/#ckg{y<ܰ+cæuh>ǃQc?@&IIKܵkdee{\tG<~MR-=">.26U| E.;-ʖuas/]z +KRg⠐9N s>e/ԥ##׳z*>¸~XQիaF$IM[ޫ[amm1TRdddsN:Lz;//J.M*mΝ;_/Q JNNЏ^-Ν=Wb7̽rʕB 4 y󦉇汅zE_f 7Bkgg3񅎡o߾\xiӦѯ_?.\@ҥ6m챴O>DDDAݱ&''M6̅Ɍ?3f0k,Ο?X[[[&M/w6dܼy3g/-HqqqaժU|bf@SB$IXQD:b06`̘=U#Xr$Cun%[V/o/n&ɉ9|(ѿNڄ҄#~x rU)Y8K:}[w"I2wS@:hR4h wS8&Y*dޞwqQUm,+ % J咥UYfګ-jJ{[ZfI{咙;/(";s} fby}Npyι93ysϩS'E& oٙ)&G'J4 WG2)2 GDII =~{1lzssXd>zt#5%.薮rvr,\]]+tYϫmC4eK:/ɼyy+~v oeffk.,X0`SNeر;+++%Irqq1j2 ` 84ZlY5k5jOÆ #** ʮ]Ժ'88KKK9qԩS͛#I,^'O舷7#Guٱcv؁"%%%_6mPTTD`` :}eҤI2b<ȉ'8z(:tښX Ғ`JKKOϯZ%*3f ''#FT@ bq;(]m;\6A=FAO =..87#1{l:uD׮]СZwIu놓ݻwg„ &&!!!2|V\%O>$ú?ر#~~~jjItt///f̘ѣ aժUÜ9s"55UVquK bܹ,Z޽{s}]5kF۶mضm~^z%rrr6l...n'KuV\–q4o`MqO;i.RpRCe:?KNamAعc#d+W9."|} ''̊e_BjΞ߹yyLxmƝCe^Ķ;d-mc%!_=A.))a5e<>3/?_EQQgܙXZZqITpՇ5jԈC5k?ydvJݺuMٱl2u) 60aq% DEEUἵ5k׮5qd://m۶o߾ v'NdD;W^U5Yx cFѣhѢE6҃@W;#nn|4)?[7yj@yb&>kW d󰶩,KqMPJJJprmaN?M&Ȳą̙6883p7AѰx>_}kkkȤiiyګJӱF; |P|)Ξ?Cd;Cj~]VvYPƂuhZ4ۓ6(hŋeׯ_?2|p@s%,ȽA’Vw*XUu: ֶ(j@ d_Ʈg# ; }|P˼ w+K+lm^SNb@ '':IND$",uֺ6WV`@ X?`M]'wm).-хܼ\j׶;)((ձWB +4 XZaei؅M ( R6ẖ3Gp.y#0tZiW@((JJ5@ sOJJMFˠP|,B @ E{Qݫ!zW@ B @ F,@ !@ @`@ b }Iii)ZIL[  VVXYYtBrQr.yú5մ+B ?ns)\ϻ^/ԫ덅JAQ!W2n]4EQŶ5Eɕʹ+GFm|N f5Tꧢ(uJ%c*a>ʓ{NmۚB +JKKsK GM${霹x[xzTTvn^pwDeI# :,녡b$$eL,ʲFca"&5h@1ZE1aԫa&VdM k]Yge8F'1ؕeH|UQGbL@핲/k&c5zŠG{G|"@p7JZҮ]~5@ a꺸hxyW* q$K:h'hR&L8k4.WT5FVY5z!?1g2V*ƢY,z\&z BXVdыPPpw&>Xw!2 5c@ ܜ 8pb_9Ȳ,Eh˧B>ZW^2(CW~XQvES& "Xʆ YHDކe^6hF)zl4jd0Fd}XE f,#)Z@4h;5 1ɻUb֐m)l&QF)KSPbGD);)Waz%nD4+sSKB @>B V熬Ȳ_LIQEQEa ( #[.*lQk\oFle|a]>+͔mUm8#. p,B ;,4)¬Y>|87Gzj5jDxxv꒜W_}ŤIn@ st),^Neɪ&CWh(FVo̭QFYUrۡbܲc4W0:oԽb!Bi"̟?ww uaaalڴZ(..e yWU-EEEfʕh4j/nA ˲&+2"!),裢e絺:EFdEB%dEB+K(HdN%]:E+I"v, ) ZdECu:kʒz IҢȲlt-E篑4(~Zvg<5Ȃ袣y͊*#22e˖ݲ_7oӓmr۪>}:>-oxgٷo޷KKKx'ؾ}ĉFPNڷoիݻwcii+i&4 <.@ Ub!RE+kJeE Z]-tBShz2ѬUVDLV'%YF+z+%J:_t6޷" XuO[nN$dfʽbQy@gxQr1"#ċύ4ixty1 MZMˠ<(MZxמ̛=٪իkݑ`s"#λ6.\BGFg?fv,y oWCpTr 60hРRtt_9nܸQmqoѣ$%%ORZZz\r ?m۶L>]̤gϞdddp^xFHMMEe~m%IReddܒ_@p;Ta@bQNUQ$Lyf(6'?vx;vLtU$dOUZr>B\he-"!R%3U.5_ިHZmυ,"ȰOwpޞsf>>>`:8u;s?gYٚOmwn孉or#ihdeeon}iOzziZIIDڵyV'E~G`ckkKVrj666dx 4|_v~IjZf͚7x{{3d@ɞ0annnЭ [VVzMyf՟{ҨQ#(-[Pߔի{=.^?3'OёgϪ}:88Nhh(QQQ|L67779r$:ub׮]Ѻuk>́6~-CzzR $K0/\eIKKg;=?ɁHk"D\Q)-WYv*-I1ѥ}(U[0/@OOO<==h488ǖVxzz29jg|@Jr ߜijCѦm,,,pqqA<^k/Յnui2ƽƅ2uѨО+@mOi׾-7T~oՁMZSY:!493?@J>uzC!}oRݚ5kxgʕ+tޝsf͚e'[n%%%3f0n8^yQTT~".]IHH7_~ &&?{ŋXp!999;w߫W/՟N:ѧObbb]vѻwo,,,eo$-Imǜ9sx饗cʔ)>|8E=z @~3f fR̙ɓY baTZ vv6;߸&NAAe- }0څ'v>$m=fağT¤&3~x5Zd^~exx~ h%̝5*5/=7T$p쏣 7v!y@N?nd])?/̙H}~6mCyOϛoTmZxSc>77mN:Ov5{ߟoۘ4uZ̩3lؼw@]|*ޟ5cvЧ3R4;`Ej?C#Y;vmck9ytQ.=_嚕G֯Aڴ ~Z5oVy7ci|nݪ8_{xzz6664oޜu2tP4hSz+++lll}O>3gҳgOׯo#訊R'''._Lff&B‚}O?QRR֭[۷/{=z̑nW_}???Zn Ǐr5 &i6lN:Qx]TŅcDzw^e8;; @pW*UT CS1(-%YFI 6n__$Y&Yfu-Bqa&Oձqz4m/J^~>mڇrq}Ω)іꎏA8p7lUٵ'O|Iɼz/!kw~OX-nT*hS;?"|<(׳ nYϓ&ޯOZҶE;NӪo#_<<=ߠ>ǹؾevL|m4lo#߲=eWᵱiσ=H~}٣2`ϥ] -OO\$`ӦMԫWO}@.%%J8~8;w777Uy8p@ȅdffҴiS}mۖ+V;Ϛ5k;v, K.tؑRñfΝ9r,"##T4F0x`.^Hݫu 2%%d'Nw!IݺuׯHݺuyXp! ,7 '''+@ 1QdR¼p7nKa/ No#ckgGycWۆk7ңgw=0Pݳvڐyċ),'E89JJ91:vm[IJLĮ (7oN]W>,..Ndddp?+~+<Ȋ(!332^"?aϻoWpvq6_c~y;;ɉfAj]nN< ggg֯o1bͻ%(**{ɑ|@wÅKEP+Y@ind,**"??6 C!|lW3u}8:9z,>6bBBBHKK#55$kccS!*o04h$%%U:CrYOΰaÈVZL>$ZjE^*Ғ!CMtt4 ښ7nqF0 =='2sLΝ˙3g*/$2mggGy'5j/!G`ܸqYG2baڵɩ@p'F!f$V<%^of|e4߬^$q)W+ɗqrr"YS~=GhٺtQ x(&M0|4۷$dgt)-Cˇymg4hHϼXnR%&R,IQ ey1L8ܜj-))a t09_ OfΙ?Ʋm Ù9mMl}ݚ@.{5S ݪvrr"h cj׮wΝԹ>[t{3wi̜6|RVYff&v2ɹ0`ٌ;.]d$򼋋j&g@@۷oҥK>|*׬YSaaÆÇW\]tɓ%ٜ8qK.!I͛7'''Iȑ#|kUɓ;w.t!9 ,I!\–q4o`MqO;i.RpRCe:?KNamAعc#d+W9."|} ''̊e_BjΞ߹yyLxmƝCe^Ķ;d-mc%!_=tII g|/n O.Cggx0@wpmVZxy{(#_y WWJ3^5ѫKժU_~jboggKnn"!"QC '/7{{ڶk@ %`>K/qn(c_Gnn.,\gg>hGAش ͨ\OTpenv Fq!sf'OL׮][y;;;-[.Ŷa&Lv3eVZ[[vZGضm`7qD&Nhrիﶶ$''(ϊ+*3f cƌ ..-了Í/ebckC_5td459yi4~ЏN@e :~^Ț)OtSw}˰^/RP7%0&|B,,,}}}MRV6/^]~ׯMN s"BY{ggWq[e@ S Mv,m,`kmK=Nvul*]vpO,& [k[dKM${$:NnHR;A@pױ[\JbZr@pa5uܱR;WGrr].z鸞Wǚ^ ,h4<`iv6p(HJq ۠1{;ݿ<2iԦ]YpP*R*ִ+@ PϽJBR<))7-BY,@E=wvCp] @ F,@ !@ @`@ B @ FU,%h%-2o* 4XYZaeeuu FɍݿZ8;cgcWӮ,(QDVU.gp=zM#{S7 J*E\ϻ1fvSPSEfWP&W ~7Ӯ}O@91Pu*(Ovu.^;mkV$ ,(--z5/'?v.5@ Q2s lkQSٹYz5Yu'/D2( ԠEƠj 5S X5eV/ukPdPbWe#WՊF2Wʾ :KjfD+iIvf!״;@ ↣N]@.,.ġ,!8jPNJ.2 \S}$}XQd腰X(\&Xfq5aYMǃF/G_CAޙba@W(DD@ps7}U ˲B- h^*zh _}bQfoF BM6`5F+R'd}$Z>"5kzΗExuZ.ʢ 2\tX>k^_~oFuINNf̙t^ʡCj @pPR,$YFHR)E"iHIi%9Y$IW/%n Ry㢻ך-Zm),ɒȒ.%DW/WQH󣼍$juIj{~&ϓ:o!]6HD…vCpT eW cӦMպFqq-UXX+BZn(**6+W_EV;9k&LpGiY/dYEY IPQѲZ]k "%d 5j'˒.CҢ$]uHz;IPP d-hǺz]ٵ }ieI$iQdYO6EVtBZԚSE/M3ǚȷ#Z1g\nvG}z駟6+RIdٲe͛m۶ܶ*Oγ>{}Yۇ-hѢvvvԫW=zPTTt[} AMS ]|ʺV쵺:Y[fouU~DN\D%]NʔjuBZeXTEgSV#FVSI4x>2,Kḱx͔{!Ţs}O|6_~_Cm6ckgeOaa5z>3wҿ}L>ڍDgݵk n[elذuoܸ]4h_9nܸqiG%))'|Cҷyf͚E߾}RZZzODVsÀ!M5?vIprrYH3F C,] siFX_lY!=COἊͶү,mho{s#>}9gzsl\3gYsfϛe"fϘٸ?K~w7{4Rp,?bmmMDD'88[[[Zjŕ+WTD|||LJ%Koh7_v~IjZf͚7x{{3d@&7aܰ[ndeeѫW/ppp`ڴij7oVٻw/52roٲM)::^zaoo@NNŋ888?pI9{,ΝCeƌCƍi۶-/z}ddd0``̙HRه ښƍsUKMMA|Gf_[@ +T/B2)eTʒw{x+V/ }̫(5D%R\GK%I-ZRZ_B]%U\[*chKPRQ~d}sMSOOO<==h488ǖVxzz29jg|@Jr ߜijCѦmh_NlՂF~IPpS>fW 5 Fv7nFd?؜p!,XJ,YBiޤ#_x5zT7*8qfͥSأ4{(W^|<~ӃhѴ%[u`;RZZ8;cx,;AsCW23xձ6oKGe9Bd4#"<*}Rݚ5kxgʕ+tޝsf͚eMӓ[Œ37njy(**Rmof~z tiK.e$$$o石w^Yx1 .$''sΑ{өS'CLLZk.z,ߚe899}]3g/^ [6meG ع ='c_Ǽs iѼ1$'`cc͏1;Xݷ>u'On/˯UfD\Fln3G?ʸW^"f.&Mo@`ǮmL3 3Lx?v|_\]]"04r~~>[nUS֯_QQQѽ{w<==U{7oNݺu:t( 4ԩSj666T˾|z'|̙3ٳ'ק~j#訊j'''._Lff&B‚}O?QRR֭[۷/d tY*~~~nƏ@:u8r5K.nZ4ٳgѤI}Q&OF-[Ɛ!Cyk߾Oaa!={m۶|f^m@ Tg ЊTӒ,sM``/,,~:nf!8t0QWظm=M6^%/?6C9~>WX~ԉӔhKuGMP86'$d^5;'c{ƿ7JJ*)՝AE|7UEGy^}ޛ޶3ߟm"5X[[cmmFד= 4lۓ`{vͷ}c I&j_KϏdҔtllmVPx0nӪm&Ң9Dtsr ӓ ʄS87ww:wL!ݳ+++lmm?KKKolڴzȥSiǏs8;;Fzz*6o>99L6mjm۲b yYf cǎeРAt҅;ښ;wr~PFx"ݻw7׆ |r\B>}ѣG5Obb"&_t/^qf^xCV@WF!"+J fϧx#,]_0{{;-u]m6Hx{2n@!v>uhCfU/^0 qpt())؎ڵm)..&)166jHl߼:u]8+ϓ? +KR{b@d xiԋ3?ԶOlؼ5/ޮ65%DYZZRA}RSR)**k45/mىU5tN&a;*8]$ DG=c'y+++>j9:hb$d;Gp}||8|1HMM5w666ԫo!,, `gg3IIIaС={ӧ3l0UӧO'))VZѫWJdȐ!DGG̀ƍlܸd.̵HOOgĉ̜9sr̙ 6L:vi/nܸat||o$Ř`nʘ1cظqcK IDAT%mbHnŊ* ˣ_hfΛ_FH~rxy{|'''5>x[H~hҴ ߛG KnO}HLFz&Ia:|GvF̛Va= HU,IQ eqvvfĩ ɱ6MyՑL~{ P˺V${ckkͦO  0tkJteh 9x'^fprrb[U;g''LU ~mٹ iќӼ( 6(6l+vRRRRߟ`,--ĉ8;;SN7o$IxbN<<#ތ9֭[cggǎ;رcꃊ~~~~zڴiCQQۗI&ˈ#8x 'NѣtkkkbccIJJ"((l_M6fȑ,Z+W0k,xC/ҿܹ3׮]3(wޝO?ÇӴiS5D M.uA=FAO = cǎ%ꃊ1cG&$$UVKLL s **TVZ/ #((sh"zm/ 6PvmZlɀ5jcǎgϞ,_zMbb| 2zaÆ~!wbq( de]'9)-mேi*DnSg6Owӎ]$'|a!2ԉ썉C0Z IܱH̕+?OaaXXXKDGINJfŲ/HNJ!5 gYܼ<&6g!2 f/bH̖ﶱh\ 0{2i2tp~jbŗdg`ooOv?KU". Qӣx{Wf~0AH|z%vvv7?cƓ[~0Im{,IS&ޑqK=EW?? ^}zr92S&FOC;h4,_ ߛQ__~ 9LI!ֆ y~pGs*Dɲ>ZUYuw;u~O4 ,q|'"=-q),p!SO Yr2N}`oE FGVu\\\(((`ǟ']GPP\HFbb"$&&9w???}u0;ɪU>}:.\ۮ!D%ؿE7 IAw٫/gϟ!cwV?t{{;,H8ys8::.-|Gaaa[/^X-~ѯ߻#MN s"BYڱ痘 *f@ 0)`ZP9 ֶ(j@ d_Ʈe?l'= b7ncei- pwޥ]=JNuG'7$I[ IDY XYYakaum\K%1z9@ ~NS\Zr.R]IAA5Yp_hx +K+L֘EQ$mAc9vwɻyd2MM"CAT*T*iW@/{= xRRoj/0O]W7ZfY /R݋z^5!ֻ@ Y @ 0Bd@ !@ #@@ XKJKKJZd*:T 7h;>K)TRH@$B UzPti**|AE PEPBBh@ %z6wɥ!d޼3s{v68;agcWԮ,xHMOû܎E@ )Υr/G2Xh,Pr `*1>*`,˺Ft"Y CHHJXeDLjЀ"cPbSѩWMȚ,Qֺ5(pNc(z+˲֫jE{+Y_ c&s5zŠ{|V$&!Zdy޻M.jw@P)솃#;WBRHApB6ѫF[(Y"8KPjFB/pN\1 60zM aQ48K<땱%V1Y,k²"^TgLgCAމ[z,xQHJN­  ʹy ˲B͞ h^*zh _}beoF BM6`5F+R'd}$Z>"5kzgExuZx|]Y`-:zljd0"Fd ؼE ' EN `Ř*z1mlk6du6N(Bd)B\1dYd+[W7ic"ӵ%!katb|hB !@PܐY\]c d,)( (ddqڣE-}Qsըrd]fϐ#G6z{P,m gdEuE( &^Qf̘Atttdk,]Ç?1 ʭ[1cF7ٳg~ ^l]$HIDhZ$IҢf"I:;'$LmA?o\tcHHq{٢f"Z,tEt)!zȿEG"ɒΏ6KGW'VNIHt"Fd ##S'OD^2k,saÆVhRRRxw(YdGjjj,^#GhӢqƄȶ(] E,˺h"#+"!>*u^StmYAVtbRV$FdYҥsHZ+Io' "O"+Z]VeeK+KEe?h,E篑脴"5i(^gE@ ;@VBJ#$7PzaV4ڦM~B' 6,tۼ6mZۭX^{T}z<< ? b~/ZYAժTVW'k썣JVVOh։Kȱ׉ZLNHKVWKdjuljdHPg 7 ˒~ 50RR,<w>;{lݶ[=IȚ Y?d@Pr0`H0iSgϜC$Pc@@ka7M^(9r IPoS19/gn'd{4fssڛ|yE9plޞ_LW}||=S&H۱UV:tڵkckkKzsj6660w\ƌFQw;vP#Z3g퍵5 0нɍ;777lllСߧsΔ.]ҥK3e0՟SR%(ƍPߔBCCܹ3<|Pmgpmz쉓+Wfɒ%j'ORJӧ8::2azӦMԬYxWv(u>O~jժH׮]wXH&%+*Ybc`<~K4oJ{d"DQVQK;mcKR~ mtiJ_*s.j\ 鉧''g'ʒ?֮}i;o{Dj4uj_3DjtJ8 } S?_ؾu;RzCrqntz%?@|\<; mٞToMvԪZVڈ-_>}`aa;w W^\t3g|dӦMDGG3}tFMDD_gfjժK7o ,|{{aѢE߿8[̙Çz*ׯ_g଴Ν;hт]g~׮]t dYfʕ& j?EQݻ77[oqeΝ;Gǎy&K,aΜ9xyyq VZٳ\~%Kr9N<mڴ9^1 ׯ]'--&1vuO...nlڴIMqXf >>>L<___BBBTmllL2 8s lll d=b̘1N:Q\9ʕ+988BDDvtt$$$NŊlacaaAٱc.۽{wOJJ ;v4Y#C{+++N>͑#G;w.^^^t҅ƍe777BBB ˋ*UB`` 'OTmT5k~#%%lK~}=$$$///Ə͛]/@ 0 X,Š1-2lXT\I,fjVN@WX_'p"L4hѣ~~^]vGcdw1j׊ nژGzFF #"`oֽ+[6Ýʾ=Mlʖ-WYKjj S|9zMm*Kx,ZnnP2e\yc0Z_DI)Q9}4|6 wwZmM;D} KKKj‹H ([z\ttt)>gϞu899F\\*6 k-= 䔔Yپ6l… 0a+Wf5~Ѷm[6mj"@ӬY3ٹs''NiFEobŊ ?5kBJJzLRRY[kkk*WLLLL®۷Yp/Ljj*IIIZ/@bSHf( (|,5@- zsvz[;[=\)])֭ZGN!tx-^<=}hԤ wqd_Ai}*i9y঍(Uʖ4"#+eCJP-a[p-7^ّA||Z5ky9&ʊE/S4oԂof}+v({!C@ll,111&^7eb )_<vvv899˗6m "<<%K2m4W;wKKK @hh(kkkYnZk_B5%--42225kY YB 9 *T`ȑiiihZr]/@ NbHnNJ< olVeX[(+BdҸ;xVۋ[qttV>xNX.Z6ȡc<~ T^5k0鳏~tЃ-!I2q DݼE4 lNˆѠ!>.!߹cQAEbe0|m;%s2::^esOJzeYt؁ڶl&+/XXXpC88:/? x_GSYBBvb޽{駟2j(FƒFɒ%MUeKll,y/_~ħA1yd*T vR뢣>+WvXZZȹsprr-Z$ITZoSD fذaԯ_;;;n ֭[UoT%##5kРARSS'00!C0uTh֬&7o/_  VGGGN>M&M]|7߿?4i҄4 UVu,--hKAS,+ee=سsgNgWQJV^܊exzy +ڽā)SfqpcϿO-QХvtԎe]L45F媕}TA"7=zʚkٶeDțOߡ姅t{+K#I.Ⱥ QQ =-=G˧۶lΝX.@;8#V$''Ih Xz5kVsyطoԫWڵkceeF5͛Ǿ}Ipss`ܸqdddG}vᄇӫW/>sZhAvhҤ OVΟ?Optt$$$cǪ1 ŅYfxb,--֭mڴYfjՊu7ѴiS|}}ԒPFE^^^L>#F%Kh4lڴ V#G|udffǶmؾ};L4)Sp<ΡQY &1`nEΎ&͂tJ?i)܎zZq MҵkWƍ4igΜQ#vZƎKdd3ѣGsoYvmyĶ@ dWGjz}vSz'acp"$ackC޴}`M:>Mܽ}?{ w؉S7ޙ '9"K GŔI|/w Ch4_w_}ϵX[[ӬeS&No2~B]^3S&дE0C^NPz3j8ȅYO&W/*NJcDv~%%A ;;4 .jWEbFSۏ2nDFFRre"##牯/SNU8΍!,Y´ir݃Y!@ (xڕ*݉_'Ȃ\m*}=@.9"g+yE7 d׳gOzL}~ (m獕ֶ;@ (8v˽exc@%85)(hEQŶk+(!W m]V=6\T%[sVeN4Gvp#e\)e["Yd Eff&#Ԯ@#gvI Ŕq\q[RxxĤT,N ^ЉdY/ #!)+YbQ4 1AA*A kLE^ 4"kD^Xנ:+94:!Ů,F[:YZod})0 :)[h!V{6u*[A1\~/7\rJZ K9"ɒN D.md,A U;GrM0"5F/2F,WjXX4OdEDAˊl:4zQ=2} {'"n])#BF!)9 "r,)^䙃,˲N*  ]6{*裥z%#1DEAew( ]4Y lHhOԈ!m8iiu]dEd4J>:nm<!/b@ >7YFR:hvjAcwŴ!@-8M q5gRvNݯl_JܤhVTM&ۗѭAT ,<@AasCVddY Xru/(hzMĭjF57FqVYv?C.7eCыfĶ6 ZE//{EQ1c9꒓ILL|tR>L((nbƌ9t >:IJe˞G(N׈@R,$YFHR&E"iH6Ii%9Y$IW/e%n RyCBRk6YjudI֏+K KF,8It~d$u^Zn>:Imd=uRMB21IBRңv㙠( qN` 8x f=G]pp06l(iii+%%wy%Km~ŋ9rH{pQ~O}v߈-O(u,$ב@_ ^ɲ&+2"!),裢Y絺:EFdE'&eEB+K(:AjN%]:E+I"v, ) d-hǺz]X!IZYVƒQtȊNH+~ZvžiX'r}ٽs7A^=EvnEߞ.44=z iӆ~~IÆ 6/MkYb 5eذa8::}LL _~W$J*ŋ YOv2,K1xfJqH(V9ogmT/zߠ>aWsuodffHŊ>ԟݻ oM.?effvZV^OO(ZBI:u(u1ɓ fʕS|BSBy]')Or r0`H0iSgϜC$Pc@@oa7M^(9r IPobts^ZNf[h Eوt-Y#.Pן}zi%:º5݃O>[?5ECn۷cmmMV]kڵ^zܹsG|||;wI_cƌAѨo߻w;v:V̙3ooo Ǝ666t];wtҔ.])S߿J*D/7n܈JΝI&*U 777ݻw<{,c ֖J*{nٳh45]!>>޽{cgg3f@L?pBCC5Zt),Y+y@4 /e˖5^zq?{7n^^^xxx:y$AAAY!ٯl_#'ORJz?>}쌣#&LP?7n܈NNN888ЧOƎKr就K.<|0_ {  b!hg p.Ҽ9p( wiKrgJZF%3[13G].y-I91ѥ}(y[Ⱦn>Ϲ)6y˦XXZ2iD֯@rrZׯW,]=vw;lz|):ut*YKN^KխӾU{v'k\\\(_<}A :v=[PNykwS\BߞQ?M4_iRkԥq&$=L"==QNk̯h\ u0dLnot˗/O>XXXpBBBի.]b̙&߄===ٴiL>ѣGפ9ٯYZj~Ξ7o ,|Y{aѢE߿8[̙Çz*ׯ_gj;wViѢ]veϞko׮]t dYfʕ&?ϟ?H6oLXX17E[nri֬Yc"ӫW/=zӧYj7"qΟ?O^HMMeȐ!|ܻw0r=o㤦sN:wLBB.] !!sѵk|fԩSټy3wfݬYE0zhZh;w8~8 4P~e9w;v͛,Y9sʼn'XjgV7n`kk˕+W8v'Oɓlݺ'Or%u0ב@_`)KN5)`gg}i;*Wcn\,k9r0=q`0sp$)aiՑz53 "^A+e0q$>L~3oWo x6f~EͩW>o> $ep)OޗgϪu7J]}e͊AEy[l%=zJfajC y9-;7cr '>HoФY0l5b .\s EQ8s,/^j*>tgض{ ̜:5϶[mԪU3O8EF=嫗pQ3+.ǯf կcGd,];GOfh^tݍ̦Mԟ׬Y'Oח<==U{)S |\pAg|̘1N:Q\9ʕ+988BDD`rtt$$$NŊlacaaAٱc ޴iݻw`бcG}@@nnn4jԈ_~.\ODPPY˗/sA~jԨK/ĤILk׎2e`ee.]ʊu͝7PdIlll(Y$4oޜM6yfׯoֹa܏,̛7ɓ'SfMԩ믿HDDTT WWWI^+\\\pss#$$ R !!!rIOOOjժE޽)UԮ]=zyPH /Q],GBsbPQtd 6ۈ}i{*V$D} EYq5VR';ISxw;ۼ5k0wyLA=uV+,q\8w mi4?Yv?/YC;1HLݻ?ZkE7m#=##WA[Rd#\sڽ %J!\@mmݎ7#G|4o72mlɉ\rڳ;m۷e 9;a`cT`Pߗte-[4owwz{(`m8991vPժT]˸R+T` z=Rɷ[6SmKț۫myc.aʖ-O}={֭[䄛qqqye-=Yپ6l… 0a+Wf5~Ѷm[6mj"ӬY3ٹs''Niy߿?888> S ###6UV͛M%J`ǎ:t///&MV|ntޝkv'w?&))A/T_pvvJ*/mr~ŅٙB߼#D"-rd+h׼d޷?0mdllqp;vlXj;xd Q$$% RR~Jddq6T)[҈Į +U@Q$m x ggG\r%)AV̯HA!B Y[ N];wTgw#N^^'::>L"+c־elܶy?}$I4k KKK@/zTNzc8$''m&ŽF$ygƗәlڶlϦ /:G|||s B@@Ę;7`eb prr"***9 8˗/3m4 Dxx8%KdڴiDEEQ^=:w? 0PBCCݻ7֤n:>}:7o$<-Yz~ eUH4ns;c"mU&֯KM8r'¾=UWFL#];`mHL|\Q7o$9MӲak4hKw.-sbl ĵ4Lz/^j$E?ۛ[7Ll#ӓZ_L1*ˀpZ¯]ww$̍7rS]ض{ qLZ|E'Oe ڵ$w$&&2j(_͛7M5<ޘfjժlٲ7orq222_|y ɓ9~8ڵK󤤤Pvm,--ILLܹsܼyIÇHDժU9qϟ辐 6 6tR ֭[UoT4UѐNFF~~~駟?լY͛3x`Ξ=۷w/+Oaøz*g̙ >\]#Z-#)) ///ݹ~5 UTaܺuKnnntޝ>}кuk*T{y78q"ۜ9sFÇIHH֖*U>Nr5w<+ב@_S,rDRv8:Qۃ_"a=Μ:8}xxyp+z2"ѪK{Cܬ16ЁCVm[#wԎ1lLqtr8W-OiͧEXgߞ}xrURӨZ*<'UA#Wvj./Ӿ}^zԮ]+++U@͛7}ၫ+$77 ߿?o><sZhAvhҤ OVΟ?Optt$$$cǪ1 ŅYfxb,--֭mڴYfjՊǏ:q۴iS|}}ԒPFE&LΎի;TIk-Vb׮]ԨQ ?+ұcG|}}9ru1]RJH޽y5j$zjo+5k֤ZjoذaիWgرj_aȑ9|2~>s:uD^T=zڵk._Br _u׉9ܮgEn:kd'EQH~p+*lؑ ߰{q.=:cNvlŭh5HLp"I`%(vnE6H̝;q}5T*V&ѪK܊Ÿ~VT411w|J=b{~I7lۊ$lc3|5_+@,IyEwmXk%:qZrF`kkÜMMKM[/hӮ5>Ξ{IIIřW{{c+W|\8wYiҸIc,vb.O҅K|T/]Λ?M9s&|Lzz-y IDATJ=t2~Gރ-m?r9j~><& R8v0i<=zIU(uLI+`v=wbqppQpC~dI<ggzz1cG?'x(Egmڴ)]veܸqݟI&qnݚڵk;v,̗G΁ٵk{&..Hىֈ!h4/^滯Zuiֲ)7?!.)h"! 'Q=5ys~ً,'Zhf'%1nGn`X dy8-ػTT\B?|iԩS=sy%K0m45Y\x7Ts5۷o7ØcǎѸq⇁^#qAjW@st'~՞L rrKiX=IO xXXXXbQJj\|%Gy>Lu qW⅋9ƚ8c8;y0!M6mE~K`Tܮ_>ݻߔ]͟V0iƪ6{`ѿ,t*O3T=OO@ 8).m(FЮC;&&q5fh>Ү3}ޡ_ zsstt}\ΐACٲs3KaiaUUa-ԮS[+33]w2ӉfLG'G}>QMTRe/'H~X0/Gɔ/ûI~k7ٺy++׭6ꏕ+Mtt :6@\\<'O֫yf/]ƳlBY](Jv@ E . bύHEaT?{}{n@k¤ ILt5/x=s>%V}ztŅr₧'h4cK+K<==4y"O[|D^؏ ru9\NF-S=v/uпi֨۶lSnߺMS=!]9~Z0nj'V}k'lߺ]czڷ ~޽ć=ݼ~ſӯNDj4ׄZUСuG? ۫kdmm])KKK9۷`|,\\\}Ugww<==qswK.lݼ Yձ?HFF&C޽{1@5c$h\ uݜ&muVt }87ΜS?,,,pvv|Ժ%V-ƆoggbL2 `\N|\<whܤ1,?ѴYݽkvtNF: h\ ?_e?5[R{"ȿ!m[g j{I+1i upnϮ=j?`SfڴhGj=kUcHPv<@ߡX H(m@]ygfldÂ?g^6w9ojؑ?U#Ү}ݻ[Ev>-;j@h0]{)P'0;W{vgWsZoB1qǤR g;0 j?Ell,ׯdM8::p?>tgض{ ̜:_ƣGرw{nyK.ܷ0j f}3v4?rXZYuȋnvn]N8ۼq BQTǏYyΛÊ+Y2O']vڀ~`OWҾC;ڴkS%KGWٻgG+.ΤNϜ>;$oVDegWs8r( kWY;28pl3(9Ƃ63 |<_ gM|lvnuVrW0?ɤ3fhB:xcM$%="b87oFO @ IO;ڍk(WW;cj} PןZpUuh [sZ~?6R͍Æʈ%..llAxK$>HV횅J(F2T򭄗y ]7w7W(O21ubccy׮sȟr:UU ҥnݻҼes=y۳'p}\]].] ˕+w9oFɃ~FR$=L[ʕ7?v^{~D^{Ӽe3֯]Gػ{=z$ӿoe_6n;#bJ;pa(]4A zA ޳'M"=^ m(Q|ѯ_.X y88qy~F[-WYo/\]])_<9}4|6 wwZmM;+54 nIkkk`ej:wD.PByO̎mooOٺYG돣caZ (fߤU3pi׆҅K$=Lb ߔzسk/ޝEUY]\s/553})ӟZKiiT\h嚨Kn ,s{ g zν @O<ԔTlNNG?I$">A -\Q_ކ-c{{;TPaj^hԀ\ܽ{666VcO[~67+=cؐ}{*Uz&MC/K}ivYs罰y?Gzz: O/Ol]+QѰA*Ui~5SN[[8z#E WRs..h |z% C-rppo#ؽs7ĠWpttDV֣de=BjJj/וwzp"$ +Q߯HۊaY+++TVQfZڹZFDDRrb gYØޅoU_?W!::ŹKg%ӁuQN-3ڋ_ Vu௿/*޺X4gN͚"t|0}hLI?Ŧe\ܤ7^sH~:88B ;=yAx{b7Y@BZ{܏ w?sX\'y/t&N E1}"mx{x/^P}aeexxz]1ut :666ͥiiiF۳QMqxCępx_3bO|,`ْP٣20{lqWkZ$l> (W>s4y1:tL;a,:{ 7n MnOWTÊe+Ыw/89;]n٪x\+Vo(Iܾu߈^)[ナ|v^T^般,<߼ lllѣfv?C?lBjF 7~| |佱cPfϘprrBV͋WAU;{6$o>8VVV HKKC@޿^_>A}K];cy%GF Fߔ^{b7刈CXk{۞E^=F"Qz)6J[dD$PnܸV9%z֥C`-ؾmvm*DDTr23<UFY?V|13l'@)h$"ruQYc@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""R.\i B*=4`me kkkPa@gOVv$ &> IiIe""g+|<A陒D܌ իDDD̋OÕ;ao[ ^n^i{陒Clb lz!e"""'g\}>ey=SDHHMOGʕՐ\.j陣eODDTDOQy#"""cwthS V?:ÇpBY7("&&扷o8'孍??^Ͱ(;;ܷYbwtY(xdgg?kC+=L]֪U O6ΣG L*̜9@35!// -֮ s_iq^뙙=z4lllJ=%h׮]Y782W3jex+f7 O6?5{QM{&cǎ믍͝;~DGG#<< 8iZTT /_.)J$ɟYdӦMF/Kuo׷ڵ UTAK=DƀL: ߢA;fV~V"rrrx>%դgP̷oLgggH駟ЪU+TVⴲ&IR_OjWIs!44%=^7Emܸ\]ѿCqG *rƎ3| ܍ @6E_EVh>ԔTe׮c`7{'i6Opu%_CNhX1Z7}/Xq}f Ͱhb}Ծ+ GABB" :*_틖MZ#v}t 7~"F=֨~A(\~ NԾ+8̓(1?Sf,xV:}뭷`oo*U/47~x`]v)ӎ=H4o+W 5j_UY?D-q#iӧOG^y ]8 ХKeSNUVpttDfpYe [[[tvkܸ1APޒƤI///L0lCLL ԬYׯW͚5 5j@JQFo?ڕ۷;;;4iΝSƍ[[[mW^Uu>>>5Zouh_;Ψ_>9 Q^o򟌌 mܱcaccj t?+V&OΘ2e IDATo֭[ ;;;4h@z;^'~V 44...pttDNp]QB֧ll*oVb0v܊c19#@Jr ͞an:Fvmq!,\)֭^ض{\o8'x ̙53fOa's>_Wy&zgtcnj7y4u".]Ku7-{5pQ O|ȈH˫%'%cV>3m3WMpXjv~8?߄ p-X&L0 Q9B[=im۶ERRΞ=p\v FݕՂвeKeׯҥKׯi:tk֬ѣGxt {۷ѥK۷sŽ{zj1R9sw^#F`v{9t'NO?ŝ;wtٳg+mPKHH@Qvm\p.\@ff&"#u.Bbb"֭*U2#Gxwq ٳNBzz:0b,Xصk<<<,׺D9C! t!788Son/Ξ=͛7cJ /SN!22/"0o\K.!++ SN-zDt1 Bxzy!Q?Jy}4ij3qa<}aPz5ԮS..AnnnhboO/OUG (8/jGz'ڼ^H9th[UVoU_7=$%%;zcO۰?l?bccOQͰ%8z(bcp%B<-BWJW$%'Ku/ ۷_VoԮ]aaaӧڵkٳt]f4Jm6DFFbÆ عsRCvZ?aԴ6mܹsظq#K.!33!!!Brr27obΜ9s"##ퟹW_!jժ-[޽{J>|8Ncǎ!&&ϟGb,HHH@ иqc1/_Ftttof?{ƍ5jg#[ꃩsocÆ شiܹ<,33$)W^y}?#""0ɞ2e 6l>}(a^$m:t({l߾ؾ}2///GAjj*|||鉇} ''[nEDDR7޽{wHFRaÆ~(ʱ*;~VZtvvvVDTXbE mv5-\p _.,3fxnUp۰gϜ˝_A^S×˿eAX6v3ϖcu<~H|{rssѭSwx̜3?MG-E]^'.`%R~={u:i$^z2dbbbЫW/t/ڷoo!#VBPP&O+W*OV|2N< V-[SYfXx1NL4 [\t ]t3vPj 8tFaٲefgn;iii8~radܹJ(O+_~Q飌+WƸq FVZN:xT?4Sn*35Vy8'!!! ŰaL/ja$L6 ϟǾ}JmDvQ4Yٙ/\ltXzavdN7n܈>}SӨlIykOGsGi4VFfrݺuEFe<>ڻmtww/O~,̝;w _Ȃ]\#=E"""2V^~GV=%GfvF Sv;^a@g5m푔)Ie"""q Zm^Y75lp?1$""*kl {<}T ) 5P㺉lH6\cA$js-|a"""zHHHHHHHHHHHHHrZfjI\(v@`]!IRi艉GY`]; xVEL|4r򲋽3""""!7/1ZuBp/.RҒ${DDDDDADd>BJZ2EP@Ha]*WB8w4UO_{DDDDD%Qvbq/.@EJF2xz:8o} Y/>10$#nsTTTTT)DDDl|ddt-\PѮ咒~| RRR{WbˀLDDDDxւk$$I 馾%H $H _GnSi 0NIm\YV2ӧ|픏G~ɩI} ndo:$?LzwF5Q'~tZ~{oO@ 먏|z"AП+$~ 2ڸ AoO$SA aCܸ7j͵x! >5QuUЅdQ %U%CXE 1 @!"9AC>HCkH>AU}EQ'(=n%EOF}$sNNG(9&6 k(*(@oK?]D@$@+迖+ T @Է\(αۿ>8 XK<+|Ͻn  P^+-ox-8;9ÿ?bbe>ʄc%ghE.ȃr^nDS2`C3gAF٨-IV†e 6&%x޾jcC蕃(b 70{RPӿDQFbuaPPF gIR  zWe~Vޮ*6E#<U# oRdZQ.!  .`o3n1a@&""B A .K!F E~4UGư2s qJ7YYJqhQI@Uz!Hr0RqIUB)o]ۓ䶪KuBH0@ (d! 뎵V7297%Зj~π/WWCCKB?Uw!®+.8_%dP¡TR06]tte[)rh8HO߼QLt 0ߤ!*_{`reÍ%w7fG(O~`&+A&""R C[Q="tuБmeLHȵ 7]a [6l'~:]T ,5,X.Fܝ.<:O2\x,Z gqYW,qIơA˗v!_\bI211k^#-5|ѣW4 t[lL; 1#GfM0~8ŒX`(N`іk)TO+I, ""Ҡ4=,%*KGXlF)3MqW\'#<9Wj_ ZXG&a1o?Kr"] #|p&&bso7oĤJjHOK1P7.ޟ0FP,A_,?1'߇w#Λ􈈈TJ,47b V.[SCP_ez6CǍ7`goa꬏`Sbc0჉tVŌYfd, G@NNV,] "2ƅ~+++}xsՏ$J,Lkw'|ZB|R\GY ``mm%+>7xaSнg7SJRSR0iGW$ V[ғB OW/@c w'/Ǎ%DDDT*, W7OQѳϫfCGQ;zbADDD܍c%7-Brr2Zp[S6Z@=fDIDATʆ-s>hE$Ԩzu1o'xwh89;"#=j{ϗj7X Uab섊*~}<|gRsOЇs }RǙbڄ?/]Xv HoC0yf(>Uعu^-*T@@2l \A /7.;7DQIJ>KO/? $Jҽ3B}ƌ3&DzZ:==0p _]g0cRһ)'G,\)6݄% !==Uwk=I}oH,|քSo?R9]_K,vȡ^nƵWбK&m޹ AAAO\w_"իW1נ"vlGp=) (ٳ """*\egs7}lIXZ-P.-^~ [d$HUbLDDDR>I 2/kI=M *"""* 9/|}?Ǜ>#ȢCYq"-WO( A&""RԴTTPMȀ^HKIJOπgc@&""BWW ˺9ZiCffW'8*^ y鈍ËϷ+ DDDT(oOoMqMDE+kyqpS4zU?mWמb[=Ѷu;TWuH=}Sx&U_;*nQy€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDDb avu;ʅS4]PIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config3.png0000664000175000017500000014652613203343610022254 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{-\: %4Dz.UQQQPPT: gGt ({ Wrz A^۝}fv7вE%@ HٷylpgۓwK7?{ sGy (C*( ݦ˒gwZe˲ʟOY%E+$EF>ϿwϛT$InP\V2_Pױ,+^u|R;Gf&HYVPnP;t; /"u?\ȼ7T/*terML WiH:op\G'd@ &["E,2J*J4sDSSn>h4xQAcJMHH0>>"BGнm=jFF& l+aR3&<;xfk"l@ Wa͔)TdVGc-䪟/ZdlR iQ+9b!4@ X,kU|զ&KRjiLj[5{OMXF\___:1l20L\HXPsXI3qcҹp6=e+WyYFPddn`ARckƳ)- (_FAF%ɘm!kX#Lz<R=r4+}j!GǾdfnbGqjz_|H$!h%P,\O6(ABA*C tR2m|0nf͠#p CFH5ٗMq'@P(lb\X412ϐV[*I4 1E [,SƱ^O޽hpwvw IIɔ)Zp K=3FOrgH VY_""sֈ`5'ٸ|!sVEjޓ/ңaU"[i6,Yk.UH:})aSg0 JF~SՀmc3iҟ^k8zSY楙/Ѕ\тB/Min' |֏h8"Pzx1>\pGY_(۱)&ng~ =>~_rL-fF@ ۊbK9e ,II\0s-B2W72תJy`Tt^zr4Ȋ^}fjpWxzIfBfC%b(p_2ELZI qJ +*aR7yrp7Z>!:m^_MY7Jۺs&5C>#^~oʨp^:e+ؒMGDxM0r~~ k:oEL5%[HՏ-fĶq4 IW9*dҼC"]ů#;Ir/m`ȚiME?Z b:<kz @;1njq4)KP^oOcMOM/+2j a e6نNAPN-RSPVh]Ѣj٬E: % @!PYJRP FZ7+߲o]~M]+dzd=ƢIr*i_i@VQ?+z?,ᠢAR!o6W`HZ[cРaG'[]GY0[jTAK|VIg#_ju ga)gQVQ09->A/Pt,v!lTK(=&v`Fߚ-_Ñx:!].)9=lf[{!j [)I%4}1LSɾjC]1*0A5C=&ӴNj~-GtI4B?EnJ:ZIh<&<@휲`[!eNO1ORգEbR(ۮz4%*-uGCL ţ1O DQ fɵMNJ\GŬyyjױ\(Ieˎ"XhZl6VdG}XmTj4MJ%Xrp5j+PPEQGPfUn9(G1g` -ji@AVfRqF?ӌ+3s87M5YIB­UzYXV @ ( $i&(kYz8DRit8l;Q EՠVK|;cπ2{Lt|}}t $>ڞ Th5IZZ&)dT. ͨnhM U.ۥMu!UnUWV$U P̴ya*(oD$!u!;ٴTd&a4aa[E/Eh;bHcFddfhR&JQ$pQi&^&B,|}} KZ-+Vt:dY\LFRRR } }sg>~ -k]8}"5qּy+~Q(Z1~pqRdY\7%v |W5=-A 6\fk?oƾ+(a G8FǓTyDS遾EKuBpjpoݻ4j[.@{9뼇bK.-@ uFjbǾ1C W\M$& s5ÞQc5+ևX$'kNdffbYilŌZFr9ӋbH|M0}<|?Y&gٽV pv$Owi@3l+/U!*P,\PPrq8r)%(&M ?.?]USw@ jb-Lɾ,wKmy*5;L>LK $]C(X,EAQT>SR5O4'2~ :m.˺ @ n JM%XNkLb4T2V-gl@ՠV mJ-[4Qhdd]Ij5:FRC V( +2c7IRRPI*"dVi.)@pQI*TgJ&!@  Y @ XY @ /1M@ ?OVzv!HFf:O X,ZԌ_=@ wBP( 2 b-[1ԴdfW:=AXddsJZۆC wrRS8| l_Cڍ )[ ; q1`㊟P tS W%$(Zp.L! p#:'/'q}ēζ[‚oHMaejVx@ Eh(Mbxr? W '.&Oa&/m$[e+ɔK*w: C֢(2/IHٜc VPPitd(g\,a #B2G799NR*EcWPHLB9vN|t-[@v=_zw6KHYEϞ3dyKl%Ҡ cINݝX!=#~ɗ+!Ƞ0AP\f}H0ol49t wWo@H`(6نl/qC$tZbQ&8Gw ! 3N,3@[EQ7bLi%Yޒ,[I44XRuw'f҉>CV<Ȋ++Xm6$$=wrV2 lM+< '^ LHMa$ 7\>w;Li%Yޒ,[I44XRuw'&{s/;(Y!"cSd*[l~.qmxzҨR3,6 c:bR$"+%koK%YLi[ir'NsQK9ٽJի\a_3,6d2qvXQ$W ,UqlQ%ȲlX> 4Xe*&3c9_yI$V) z+ 2TD݉u. <ӐƊ[={>jCTr,'Iv3BQ\\dY =(&; tvQ;:WpqigI$V) z+ 2TD݉u. NUR$EݏH尒lqd6$d$ٞ^THRMd3zuj-5?hѨGe2nw؎ϜaBoY[KDҨNS:ĵ|g2YWd13u4Ξ9[\6nOK~*Qu.d=f3:L1MRRSiOGN~lϮ_YQK(9; agl&ېe+)))66#۬Xe.[ a9غTʖ/Kvx3b1t bo g@]$IEmxҖ+_Ȩ[)-nUާST\%;O} Iz$%%qARRA/0p n %[A7g?- .b0R2i&^sp>RM=|aوE Gb@h4j~\ĵo3ٹmgO5>e&֮kSV<þl|IOKM=ǟ|d>f[ǫQo7&~˹iԤ`Rގ>JuߟCN~]*YǞIVoZk[]ev_Zn2h@7KzZ:A͹OQd=87lQ ~cKgZ|)\xssG}Fҳ6%TR+'myse(*VHHh0*DdTU~_kywٲw5!~%uV\Ëc֞l6ٷw?s%;mCV>Aܭ3{t`s{ YGd[97V7^yZ58BBC8y _ğŴSQW\L]WPvաת`` ?YKYq#T&͜FzuV.!ևzz|5nކlB`2vJn8Q1그aۖ-Wepܯe8=z «tJ/9!ޜ<՗7;wY >釟^.Ze͒-g۶l6-^tg|uMvm p vʯ8ְa=ȑP~]c؍!,޵?WI{s߃Jȍd}}4?CGfl݂N:һǓ|G|9s&|9WMbuf3ժ2h@6κsQgg$'%Q.55m6_$==}*&}=ѵ{ y5(̩9u@Oį&oIOOuxi 8s,~9N"9)`y&?ٕlEwfs?KzZ:_ k\ 0b0ʻݜ|%AtڱȺl"u|>;ȲG)[,Ȕoq)""*Gy6vt /ΫFMu?2O8ɖ[x}+_w+lϏ-VeC]ۜ3߅lݴF=maȗ ܹ L=UˇfcKpI'^GVqݵ9fQ15;!;baҹ1N9S3o\o+~`(V3*17-k̨M:m5kٌ.$I'sJU)WzB4{rgNŘi$Z4# 箻k(=Ҹv36o7ʱ6:&5ֺއldYvyԽjݮOxй[^djr ר7pQf3=%<|&ı>+Phܬ>2o^퐔LWy+W`cv IDATdɊE^{v 9g*i(昷YT+WÃ|4k d\HLl4^A5ˁs\o Q__Cs_㦍xs~ё=Ȯ:;m۲I_Mcн}<.{-~HNJfM|%{طСy'4O<?/ٴ~3,SFu&ϜJwpn VelްC**k @Ilb=r _?_*DGmiEq;cmIyVAHh۷nU޶t{+~~~8s 9;իV ҅ ޏ0kl/m; c3MZ/K{0}L]Ƞa6h$ #l8{K}g&+1 c| hGx;zа2Ȋ;mxü ze,2aep6oc#GgvQr҅ WǙDΝ=Gsyng#AA }e,SQQCFs=1oFgW5d43|Jbɂ|W 4$%9~V"bAujGzj:բ8zGvnɨ36z{w>'4,Zo5m^A$\B* Աa 9|ƍ^w<9'wXUu6nF\F^2AL&~3/d!BD ģjےkי:[&s %9~OJʌ{uV,~^y] 'O&0(oz<ރyGoA}7YO yϞ>{4t a b{klfxqjq|t7˼ƌ2l9JU8pQ]MwǢVٹ}_~5Oah [Ac0O=FpH6̜s=l,KWVEרƸ}8p+ZlbKe zNqmóc4nmko~ban{t`qqc8t@VdBB79øx>xQۡͫʕ/gV+26f͆hju4jJŖM[xع}j=9Rz=KObޏsXb>?uڱ;uȋr 5U٧ЇʐL? Cq0 pMNFF&/ (/~8ۦ}k z@Ǿh4xx>op>gLTjJ˹^ y)*f3aaeTWIgFDgkh4jˆXs 1y͜>qFCtlTiwNLX R 4e$Hbn 1~tq?`<֯_8N84sGeFUjTUjשٹ}?å םXZ>=Z?Zoؤv{Sf1b̰([.uOgn3*]áSTXם7PJ%4zgvnө`Gƀ>9~8ёL8{C<M7VZԭ+ìishѪ9ϿmuoӦ%WѲM C]joe%eޜ'ْsM͛7|2xt믒o2ew^<3i.^CuWMqv透?[Bbb"SLty#FVYZƵy(l\|u:d?]VS`оS; A0oGU Sw~jש{\iV6`1x!;H{y5*ĘaZIINa],qkA@lXEϗf-)) th-(8gSg(7k0cfsWteX1L\Ȫ8s2l۽hd?bg\MH$\%Z"wս Y1hۡ ̜:KLFWXhrk~ެqZЃao3cceY&00:ubݚzޱw <@hҼ1w}s2||.w3fx^wK/⟋w,F |?zf>~Oj2Q1QHDMPdz>aay9A-t\O<9?nTzR~Uք;'?>C BQew5^ZQ\IBRr tKή zmy6Mqd:a̸׬e3&|1L.1/'3)4V.pWv1g\N;_.Az`4ڮj}wm'y]N:{.%{}sGx`6h ߶,nͮN&\ilV1բe۱lrz?$]C>@ԟYAy GFҴYS})))$&&}LWYY'tXNY:>GA}|;q:ޥZ\5;@tL!!rbb `n*7rk* WXGODž (KT`/e&ΜJУ跹veB=ʴwT@wׯ+Vqen(,f ¹ |t\8elC_ڦRI^,ѱѹZ6e>x M&N7r#\/N nX;lg r2y9v7wt/d'w׫]{eMPp 5kӶc[]s?$wBe.] ߲w^222y3oPkoVYJ «1rg?|uk1oqwjן}CjJ*;CyjZwı%NЩ[ǜcs.7_EXdSi2ʕ/!}ҽAٰI}l6Eyp"9ݽHB˄HոAN{2~̎Z]5Yn(:#]N%2vΟHbuZ.wr <^XS%2VOˌ#vYe(TjJr 8| {H @Qd^ xehۆ/C0)9ҹފ^ŕ&:*J{OggOw`0u,fסNgi_b0yV6#E֍Kв)O=ۣ NȄ3c4^7_̒K֫.d|RkՈcx CVsQxoi)Ko'R$=/o~ČӲU55&)g%qŌ Œ{xSϊ#ط{?u#˖.G^xzP}+~'&ca(HވJGOPysM&r5jQS-?JTL*DFu1caԬ]{_~058E:֫1gݚ =*U8} o}5.eʳ>r\"qKdf9mdbWFFW :uzc{xUd{\4nd%2eׯ3"%jO|8>5Y4ft0fP1mɤ2e|ŻKs$\J`4lڀPϘ;vSjeTj"x [\'1~w?1)S˗MQ=oڵ,'HII%fuGa(_d29'fł62..:7lKs*^Գ]Ƕ[s,gxW:cߢ~V<&-SHYHm 5]xp*WM[ٿ yUn;2"5kHj%9fTXjDW̙s|xk *&q sݨT*DU&0(1#4iވVWz?k2X9b:V#ʾY4$I,[ ;bȊL@PZ6ᗟ~衣7#=g#~3W%@56v(ʵוG8t-qY1t_G~WS(_=*2-5{Юc|}{\|un6f*JG76 ߺȊLٱuGy۷@R~dݚ.'vmRR=~ڝXaosL<5Ѻ]+dYuV̝=E"l7ٝKaKy^+_yUoӶ۷bڄ?zVZ+W9 #_Ζ[IvF媞kwvv/\͎;>YV |}#_|xTRı#ljuVlӜ_FM֮rwn?ӯʖۣ/e׶]|0ڕk̚:Z58{3&Ϣ}]7qlZMD \(^,Y#?[BtlW\crꑾ B oVF`k`ެuwm"*Vp@gƍzJVvJ_ /N`p Μ?v(G;ګգ_UeB<~ 4;lycr*;162a$]ObZXI3y07GvwqK_z|_Ǎ1T*]sE>~$(P.9dR>z%K8cKf =iݡ*gL? ʄҾs;x!! ?~qΜ'4,Qo}v4y V/?Oa0Ez`6aey̙=_@pH͚t'r ?B& (0RVN2 Q7B~iu:eB4$Iojdz=<|?>z 9 9k|;q&-&%9`wjZ瓏b7,Y#~ .n\><ˮZujg͏Pk4DT@&  ̝=og㮺yq|u豯v˯>ϫ L3f쫌jrʖ!!Yf#, S}@Qz=NI_MqViҢ1 p-US5 o~&LgݚhuZʕ/G snmMq_1uL|F#AAAkX9c۠,SL(u!#3~YETL$TQeQs-/EF8&y3"o$!*:5 U{?{!W=mZתlӼ Faء 7?J8=;ü%hO/<<~MfkRSS1 DDbGQZǾՊ. nXL-S>W|ҽGFMffx׾7?|_Lf+oc6  F>G;ԾyCsٲa+]w8tۓڭR4nވ-N*MiÑt77 k dS=ӿdxA a^>ΡeBx~>}sWbw1yGPP?}?Y`?pDŽ_3I|x TyfK̞6V%r͡_-ӐYoArs~H3~V5\`!00"#>vHW9sTL;:cn8h|׻?dyM٦Oɺ3k[~[MInS'AƒʭݴosI>b-8`|uZ /C|e,CGb (4Kz̄S_Aq>Cڿճ$oxSRPXJr:) 2TKw.\lpp!/Y'|XbDQ|ǹ,dW,Sڿճ$[e+ɔK*w:n,_;m 7.nXwa:d-^b _Y-ɲdJJ%;Qwwb j%Ӕoe2ZINI&?PSR}1Z2X* Bg~%Z4% ~zdyKl%Ҡ cINݝX`HJK#h$9- DPP ._D)WwFrZz*.Q128 dUܩ\~vpǐ}-ۉS;)m$[e+ɔK*w:ʅU U]F $$]8J!A4݄ e#Xq@z }W*[no S"A)'5#\rsϢѺ+B,ҍipAiD+@ nT*!e0S6luv}Y6@  I>Z=AT._'@@ 4>D+a @ p$IBj,@ x d@  a @ nY @ pC@ @@ @ { IDAT@0@ 7,@ ֒ƊrIF2NǙ3gYz-~nD!<@&jvZ>xC~emN JE2{>qQ·-@ 0LL6?Lݚ[>]:tc7pO  @ (tg8'NrIL q&rN"99.];S>8.j2|0]u&8$γw>Soٰ~#ρ m6 9k /JD[0><ѧ7c_y%?,S|=U@ B%ؑcؾ$BBCHKMcE|\rF͉'9tsQCQ ̙9( })D|x$ġٵc+̀gg$L(wϳ{M3p j@`ڊ@p3O~T\ jנ㏺4zutvMHs1|HWc}넅Ѻm+{wݴam_d=X'׊gu|Gmk7a5a6ٰnzv~fټ<%o?b歨j~i!K@zo횿ٶu;aaq A/De̜ho;5W @ (>} @{Zx;z(;s;86gf;7]ؠIAZ:DEDE$cS[,xΙ3眓iz>u,3ӏ6'ܱ+䍘?GNj56`߾$$$pn߾ej  Ȗ+^2epI>yo\g#&e?z rJT`z/lrk4nڈ 7;rN:ѷ_4v,@ d,߫T*sÑGM3*j9u>uӧ095cHGJ^O/O=}ƞ{vEV; O/t!/"SƼI/yG]acQv:u\X0흏N)7xIƬX-K-cϮ=̚?wϫQ*wDh4$IbԪf3oZߧAeEYf.S|S-oooO6-Y6wЪMt / 9ŕ+WԵ#[6I5 u[7oq|=zѫO );QQQt}k] Qkޔ{fАA `;w$$0 OOO={FX0,_+#V]Ƨ@ȱILuVs`A_FR% @Ѱj?=jשE !vvva9={pB!2*WBօf,TW._Btt4!a!,Y8K `gyeʖ1~o͛@Cts/>uvvbּ"I2EZ`5FN"ίs4mބET#G={F)YDmۯ}gr@P-mGi{Lv:%JGREv]r ~i@GJh4̛3Y" fs,@ H7 1l޹'Gw'=Y $I?!!!wwwڴm  7%!>h9m@ dvhU͍Hxz|J , @OTT*g")UΤJ*9m@ dփo3 @ ^<6C փ,@ /Y 8`f|6}GwqT[jupT;@ ^@ڵܺyZYR'O9M5IuĔڹeZ :2Eҩ9LYW@ bbJZ6iEUjԪQ7;]{?{>gɲo>0Yδx@4e@z <ȯ1߯\ń'ң[%&:3w$|K%@ ^]"xٳk/>>|HcZvkL9|~Ԯ[+2Bn޸;~ì鳸xEg٣I+O;N0~DN8:gxp>M4[͗ݻ+L^@"kLٻ{/'V<2}2=r[7o1ax\]\eMߗ/ɿ0v/Mmӯh4T*]ϙgҡ g&[;:91h@˞{5-˛i LH^@ .B <[7o>TJ.hն%NNNp}k7p6l^njёxwM spp@Errr$)))]y$=@ Ih%-)5*eXπȂ88S3?EQpsw铧._Ndh4cNn8U3|Z{1Wn_;o\]8 ͖z (@bR"gϜ^hڼ |8˗.1#8>)jܺyŊŹKHP@&#ǘ4uy͛'["Ƚ%JzE۶mѣȂTQ5F X N 39a4ǔ,\7dY,Tݡ-@Jf&bw]E; [Ym!t _ {-cn:EaZ"7j ёS`կF!ZeD-J/^̵k_^E܊n5BAFЩ zY-6>7/dEF$$I2$eI'רY_cE+i-%Y6yƗtI"IZYFu3#eEBAFIiNKK3gA_0; a>.FzFX{%FC8<1L 9ckا3{%Vf?#E-/qY!k,##3,]pqj<5U' I8y bٽN;R`ُ,ݽЧ_o.HƭXtQQQY'O>eذaDDDFtdnBau EQ{ib B29p 6"ڬא+M{R`hllOnCz밈a[rnSa^9Mk2? Μ;Q9 iߗS'( ?Abb"UUP4dִZ-;wbv흏OҠQjd?y/,[-/WP\, bk~z?~L˖-iIIIT*:_\ZF<0"^,+2ZEkUP%G&/T2UeZ--dz]h 6l. ͦ&Y@ARI+E( )calffL:7YB>k|* tqj\zp#]n_-: thGaT\}{ٷg?~4oь c'x>yJ`@p\]\X"E {wҥ[g6hOk1l?ADm#Ģ}ۗE2eʔa VQ$o·e佗p c(T5- K)j*YEŤʆ2U-bf\iVr]6C?NGѮC[._̌i3yWw -ߛZ̍G-ׅaW#mlX///Ǎ7%_>[xzzIҥ_i\adBicȆO cKDytoҖ*=65NجY6nȖۘ3/"^J3E42R9[@/?JBBjEئVPzطwcǏ51+/6 *Yl\F붭ذ~#LvZT\E0ɛ}{1h@ruf=n{{{Zj_uV|˖[&w>:tlO=_h/?%9Iz)ñ1 !qq󅜝(W2*˳̛"+izl dO1c ϲi6a_k:y'N +2**CSomwZ6^J_P"mfkVVQhF;::́I^<#}1Ι6rXfE2o鋿]hr\nmj׭j]M7ܕ3&i_WF0dZ&yh VQdɸM7(Zn%Z]R, $=[+\F S\8x\\\_ ?LjTQT +>ij /d:6YKZ^ڰX4=e,nBd݊8y$QXQaӤhhݍȀtuO6 4C6D@ d޷@ УVu53U˶-k߸9#Zmay*5q]-1E\r歚ӹkGc8wsavG+f3IrVj6myLʲҸi#%nnn\|sΡR,KYeVqK& b  AVVkNJS]LxpoM[6q7jIzI-1RG .H* BeN{@~ܓWGy 5dI'N1eN<m;;$I ]p)K,G4n E\\<Ǭy3{_͛fhM,Ws%Ki֢)oݦi,^0G=)W_/qUEFJxzrnn.dYfoDGESާ<'_$j-,[-oۗhL{Lk7ni۳;{;ɰeX'ڐ?=e%s3waBjB Ae9XȎ];бkKմ6tHg,o[%dIҥl}3ʗ%O^/hѻ;^y%壁CF8w=:^L9 G%6 p|˛ɑcF6lbv=ƭ[3+\\e]]?Z S׿/UUe?tg8;9R~ch_ @F ݻw9zc&H"\pspww0o.\Fަr\8wXYg<==?7<<u&uENҿ+ mIB^:׮^g|<|($ݷVxg@?];.yޥ)] vv6ox~G=| @%ޱlN˯%2c<(7]HXB 2gGWG?#/<9m c{qqt۫ qHR:A B,Ft$q}~Y}OB|"]xȰyW76G(S 0aXA'))+DEEdZ"&:ʤ>Ӻo(yJ)Çek.g IDAT-7o$66A&袐MmJ_ZeOP|y1+M'?2*+eONXA솋 wK9m P.rE}3\.IDBR<,-)ي/^yPnLZMظ~>~L0/>T\t/>R7Pqpy%KEJ~~-5CjP#8VF6)'˺ ' i

χ gw)S4ʔC<~//O}~5x}Ԕ+QWWW?HX78DR%prqZͥU7ԴNEl S6LY(^..޹ZL(M7kȎ?-#_=y¹ D>ķ^])cm+7o"Y 2nrvRʼn@`B#$lZ-gŝw9qu]6IKӖMd oŊr]ͺ>f@|Hj#QQ4jPKۈo0#?ŒF/ h$11-$ʧ~2g<<ܩT"{wc߻8c.JExzZ777,ι3u3l,{D>Iixw;̚:{{;Bj㇏ɛ/ϫnúoY p"ŅsI>3:tk~A띞$&$hb||oTI睗7{^Bkz@ <I$%HԨNcٲQHNx/-ifț//PΧ,,$$$0u4pqutҸ |X<3z4 A4hn\W%45ƍWY?X4{ #?yAQ'E)yk{$I5bJ(ʨq#U7ԘC193'v))ʲJ;Ý}ϯ?_5z(if}1Y睏Ә3}>cF|F!v?aŏ歛fMMpX ,ck^$b@ :?vm`rA&8s4 sycZ ۗߧ?F6qY*J<V HΣT(rq}p^898+'6!;7!_U!6&MmL289;q%~Y+۷|UA|n@9oSle*9\ν'w2TɅ$nƝ^Y??ụHJJ@tщNovo  udE!26y )WJ"+.2+Js*qW^s֮]KdT$k׮W^'Эɝ\ óggu !&&<ַFX𪑐þS׎ ^4o XCV(2*(bbbؼi >l޴7:aEVT/Tr=ue\H.c>*Y=rU !! 7ШI6E !vdjN qun:Ew ֮g)J*!r@.]͛7z [Λjq2B ^VXtoꕫS\Y:vy.:yהԼv$agg)? ^ojqɡ=zuG&yEGVLgl (BEj#ıe%!!='ҭ3SyI['xI-"225kPBck!lksF.Noe܅>/KW,v͛~*V.[w(UOVm[vCڶoÐ*TV?w_ʥ+DFFN^ojٴqoߡx5:Xquu~|9vnnnlٴ3p ٧}nEZţGdɒ/$A.%y^J6$EAQ,&B xH@VH; ~ZuMı9VyT `Ѡޠ^ڽwGaI)Z0{*UĠ!d%|g>{{{c QXQΟ3dܽ{~BoѼespqqrDɽ{x111֗**(buyAu&'f@%2 Q@m8::ꉋad?uBf EH@mIJJb洙t&?usS'Mʹ@6LB\[ZNjpT f,Sn- *DHXׯ^gm=G#IjPs%y4ۢ$66%KLBBueT\Z(-&YP RTb…y̐9&.SH9x0v%dž>?XqNdF2V>C{w4?fcZ]j#$W86S53My'sEYx5ƶ]+EX0:a< ))V9@"?Yl2ciZY8,'x⍋iT d]wf͖JEj G=jZt)ػ{O2quu%** H(P@ EKf4>tq N%C8sv#Ũj (Iݰ˸"mz2y ScȦgUiړzCfc{[˼8閂ӺmօoF1dzm.t-B*Môު!)̒;1:ۓ\|8 zC1i< ?dޢ9̶-T#Ӳu ƎǬ6)D@go៿vWE9)\\\prrvCjO|'NHɗ/W^e.\Zj@ :*,K#eEFh ȄJXz7U(CPMqh#.]Rj[;Pl@a{)@ZF=5IoٶmW7g?zD˶-tj*i 1Jjћ>F0VRn+Fb`&:3w {SEg\  d̼Ō4ځ/MpH#,qN)xXo4jv(Z9EN 2)Vk˼n;8(FӖMprqFRZA^,+r޷V2q$N]8BCrHGkjڵk6C$=)^86w蘮C&Rz3EAVd$m r;`,ie,qZڪ+k]$K$II3>E{/tIJJO;H+Y ڳ9Xpwځ];Ɏ;k3C dR aȲxc=D#̏ b0&:[7oT\gƭUo\_ 䑲S1( ,ex™I i,fV YZL8UNί{Nl!q}mɸ`Ͳ잱/*j ''bb,x>jMn)gL ,#˒%d*xoӾԨB%4o5?1 '?^pUcs/вI+פz| ܽV֢$Z~m#OAUЦ۶n'IҒ$iy_ ?$II$_I"t2WHhP|::u8t0$I9{ZRb ~ܺ}Dm~ITJݰ~$9QDBb"}VI;vߤ_5*ФAs"f1={\Z4iEP՚T d$jxɘ_VUӳ{?n,wU|s.Ʒ?O&Q_7жE{Ԥb* kuuHZ%-O"1\=${ uquNUWc¸I1n4k؜~iӢ=kdqTL4Lvp=U O~8qx>!)>ͨV)޵ZM~ ,Nc+4IN#<}9;UYH e Ν=6{**`ݚ_jXlÑ$1y" w. ѣG|3q:L`oXzNG #>>skPG|5K]M a[N%{,u?!!˱#hҼы]kV Sѻ5|>e EAeF|f9.nΜ={{PnSgN9sadO/O>),Y:pAC흏[Mm<> d}ϝ=ǃ4}"=2g\ʔ-M ]O@~;`2f;s{RA]̜,fZ&ORZvφ|ukixg8xH>|G}?;7lݴ:Ѥyc)[k5w@c '<ջr$A.&\f\6x䌆zɖU,R{2B 5BjPΧ<lNH57X0{Q̸ѰiCcwcѼ:V˜siߩ?l般(H#9t0?  szuùsS޴OzQ߿{5r;.SwnF̣s|@biN||JPD1jE֭铧x\E%KdcvJFAmX8oF}&F$+ɺG...fhM[Sa=N?0gQ1OX0V8̙50edpԍ{ v(wnaԙ C2 x]ݧNg͐~.fبύ}PA;ٺV*@9Tg5w+ZO25gMQ$I)q \NCEJ滑J1fE_ݒB DT3ݸ}6sfؿLjɉhED>VPcy#3лko o߼I e齔cGP \ze ӫ[~{\\]R%]aAvmEĂ(U̘cѲMsT*%EYê I'fhrvT‰'P)9"nb ?#2eKE T 2?z6[ɦ7W/_!**bCk]DGY؜~ʊ r-*@i}x]ĉ@`B&?2Ija^ I ̎u;85f&$&⤕\\=Kb-r5$EJmR'== $O-I .D2H"{w'aTXԯ yMKlHġ$988$l+YV˱Hz_$I6z u)fa熈A%'bN-^ ˊ>6ű HKԖ5(]ʔ4Yxa8:2JpMJ*frrq4)Q}4I".^JEv*Rgg;`Q> 298880dPbbcReKqc6)KY^7/9.|$eqw?*"+^y=Q\xxٽkOclwI֚+QWWW?h~!J*#~C3U{\"Y חlZͶ0b!2Tc8U DcL1nYٙŊ~,'ׯ]7HX'xég2Wɏ!AL?SB9"E"25Tj8$w^~aqq7Ǫqssx;soI~F:cةܿw>前5~֮>f@|Hj#QQ4j֐~2g<<ܩT"{wc߻8c<,섓oO)5iNY זl($IzuS`X?װB>Yzf3CG;~|~7ZmVL(Ze3vh^k| yhҼ [hO3m.$HiԼ!oyGtխgg\\Xr kW+]{tZPUM>,\#>bcSuknl}+u,/c̛98+1s45xfL`I\\ty}FzlH5~$/[ŚU?CE^|X<3z4 A4h]#I?WRDQFAƺ>-Xޝ{iٮE4^Ki\F!@ @Og~G?w Y`Z֑@m:b%b IDAT[7isASXyNJri5ƴ:!u-.'b< 2Oy-z7' 1l޹'GȚ͞=ERPbcuoS34(m ]K/QE{p)+*K6b!} .?x1-ǴS̕wc?q}(^Ə ןE@ 15ow,mR&!ujZ(i |\."뷚~ <'Zc/@ /,y<,nY]@B!g8'rb8z0 ʸ,]DFq}U z>@ ^M\ .Pܼy3V1P'#@ Y. (BEj#ı@ "W b#@ ^39m@ @2!@ @!@ ,@ @d@  B @ )Y @ H@ A @@ R ~i3/>s8Ӧrϝg{iSD$O`ִ!ܽ{)6E @rD 3M$ cGsԙ0ukֱoϾ^VUղ]ܿw?Kmܻ{ "z(g8!! 7lP*r غV2׮]g¬Fղp"nܸ-];w ,],W #Sy@x}4hh.R2eKVhPmٖSrY{wѯw.^۶A7{SRU|hײ=˗@Қ8ܱnT&AUjҮe{V,[i+Ӻ]tCNri>0ZT,_zϸ}Zǿ\%|JQկ-boxn3@nފOi?nݼ}0^$oF՚ÿ\%Bkѿ۳?GI/gg9߅@ x9l >jܗ&iyMWپ;}2۴ L7KWЪMKNbڔ{]=O~ʸIcQ\rWWW_ _OGJLt gN͍2e6xҮ}=<(UUVa FYٸw5m[Q0/^7K*cv  |8t ޹{{n޸E-yG79w .d;_ppp^,O?%22V@cӯїyРQ61CB@ x9ɴݍ@W2$otݐe /PBl78I},0z_l.R# JСMG9fȲyRҡ+7~ұmgBQBْEK_ө]XֳgңkO*V'r 4qFj@eWe$%%̛=MZX՘7{\;vE?+L ڴIƌ=o~GHČi4kь͛t򆮮]{ዯFҠQZkg#>%ZU<<ܩRR+^x @m8} _4ܻ{oHLL$..a,mٴMZQ٧*aAY0w:bx‚jS7o<|2&'>x1mtEϞ>c#V=[4hX.:3{~y+B ۽3~4/\iKj?+签 G UNdd+߸~H@ԨZ?c}(WR74$x񥋗)Ǟ{mai޲9-P^x˼]U^h}Ə@\\|jEj[uSI̢ j#k^ֿ _&MT a$DZ+S7oԟ"͙5Uk̟wkZg)y!Cz *V[ӴAsew`z})uN*Ti̍gxM5Yf6ҭ3=z`"Rҧ_oɃvmsgf̞Za?5-Ӹi#̚yx{T ¹Y8϶`:znb񸺸 ˺/Xt rkߧ?[BB2p(Eaje~; /OOΜ>q(R={`_;bȒD5ժPDq~gxѯ5?{Uq @z${E@ziAFTQDD"B %![M6R W}왝3gv3y3gٚ(Uիg+޳[SysNvM4n҈c'W_3!׮YK(_!>5 ]rcoXxxx$[kC_g= 6L,ZNm;ud 8$ҪMK_~ju,iDu_Hŵ9**Ԏ?b]hǍz}ũ^YfM-]ksqyylܰ+Įyu ދǎݻxzzk.J)kZ5]Ge{cXl%3bCW;{.FL}ZS#?5n)0}twlǀ!PZ._̤VlX”-_~/;w$._*W1QƳ8˗,zuV^N,mQTXm[ϐ106i:rùƐ+WsM mc+yy lݼ-c')P׮J)So(X _Xk#'1S.%BK>)^Y?(ps<&R/\{Wl`7/ >YHǶY4]{n:J(W{K- 8IqptbNwҷl^&jU_Y/1l=UUaƴԯѶ}k^mظa#zJ}+u0#7Ï)Fֱ;t'xx_ GBˡxyyQL)~}wlAV/%Kfv؍lf]TU=]P(("TTO~GBϱǸq%J~FO;DFFHgΝH*ؽF*Wgw^˗?/@fhִg"p$qȗ͏;>zB媕;-c ~W"3< Mv{p~oo/[&Ƽ3E|yTj[e]hIj>A[ԨU3rH|ş[?7ǐprrf⸉%-7_^هh)qP>v8sd94m۷m61MFE*ɘ1#s}rWڼԎC_g5ijXg ZVVU+VSNMd͒:RȬ3ٻg.m؎7y+^li 3eh"4l܀c&pe굪' :W\L&N>MROV-hߡ-^^d ȔhYgG܈x"ndƔFm1ݻli 2e֭[^l/ptrdтŬv/puu%O`>p]2ENgIĝIh֔3{...HqڏO2>z& 'e쎊z"L-dX1u/)~WUU^z'9KdȐOȑN]h۶-ػ{/;wHUWh4r| =)S4#7iѩk'~ڴ-?mePlif͞CXxw%.]HC ^úlX=?|j59¡Y*k;:j̴T+Lܹ\3clj[9 ə_z S'hc'}m?޽{̛ nޢdTY~u߮xdB)P 1o/~d/8$?/{QG3)I/G;q3^tj3 c\f˜TV%°"lX=+D8 krzuqqaAyg,...""'{Q`Rէ'3ݍ*`49eΛOX0Jפ5@`-۴Օki%EܹXB}IsQ:ZȤ9y Ņ?d )W:`/9u%Jۋ˗.3w<2d"@0LǛ ̩bj*Vسd 7`) ? K.-,\̑_ၛ{q*]%QNM|-n߾M@@&>[л+:؄eo@6i:):ͬY2xonіvے9snft։i:];|tjׅ.;Ŧ?姭ZI_]L  c,[^{ӧ+DG?d+Lu2Qby> 7ٙ+`2XsFv8;;3ud6xSg0bki߆,=ٻdD)/@媯й%J k֬6/QX.R$E Eʕؼi2... ܟc&CV~$gKjckJ㙽v۲hbtF/ϧiԓzMn=m6iſ.r!mԵ#+k ٲ`7Ϋ}p "fOO:MǶ=&+}{=zL0I&$zΫse'ڶL_{}8ykܹ}O b:ח9aْxx9Kf/XޫOO\\\| .Z!ҽ3<`5LFsdgofe;i0k|:ږ Soҫ+dΒo@&%H(+dݷ0a؈t6'jݽFJ)E} SLn=fd"K,n׊y>kܵ'L{wxZ#"Xh)]ٙ fvQodYlݼZ`ҴL7I&s}+¢ d/Q <=3ҸI#&K-[$|TN y 8ݻ/aECn,Yb1ӧLg˜DGG7ǿ45͚o<PNM-_ȸ3d0V*#`I6jNq9VRrM:i/zAXr1OCAC)/RmX0ڴksSs֨ 71iE% `=b6[X>5<y)Oq<_b;cxwy!yPNTې=G'T^ƽˢɑ3'...8:L4v <<U}""DO&j8ܺyvq>h2%xz?^ "驖Xi߆}׽4nϗؾ6-RjN1e&/5mE .Bap%(FH`AƼ; 0REPPqwqFA:(Ve^2z5P`q IYx9=dXiJ-Aùs'?C5(?bvݳ϶}᧟ѬQs*D0ʖ(ϰAq}hREBRx9F }ݶ-~N];q#97X,{? |Ɋїs=+*eKHbԮVo|c۞ڸ-Xp B X; ΔSmΞ9˙2kyw\:P@1/Ǜŝwl:f4- IDATgb`0~-qu2eO~_cakn _m2>-||}pqq!:a2:L1L{s7.+?_YW8;;iIO}h |l`2dbifĦټGضe#A3g`l߻ &φױuӓ~5r}6ER%bĩ;NOu`AЩ={Wlqࡃعo;K>_굫Ȕ)# й=;؉ L&"##:q={>~ +LP6VD$Q5x-_>^!jZlN|O%aܼy(+"HO^#g܅FMXuϟ6S3;ϬDۋ-_9B q/6o!8dM5Z lxx8-[bA_H۸D^j /'|` I-pvvb0M\xA_D>( mF(_"E 睷{:{AƌŸT*SspAݯW:ުH" ~ ѽ˜?x||iݮ`kG%(SM?ȿSU\23"22ݻťK[>JTHb4kłbq&T,] ͗H۸Z@`]~VZ]6n)[]:tMذnKWtѲ]F ~dԪZ;-{6l>("F, ׭_PtI\\]}6ΝድSe˗e՚XL:`q];wNR%lwH7~#/>Flٳa6I?ȿװCppp[,l)9sdWS~||}6/Qs= aL OٙM1.Kg䛯- d J*=ܹsq}1FrE:5m/"}ߟ[n1˔bɊE-VD 4mքkWUD$XЩ܋#""""}۾ ) Q@,""""b>($51:37X.sjϮ=޹C^M5u4gRJ>!~to߷29 #oXˇ|Ÿw>[OvjV9N]|~3wMPHPʎyg,[6oeÏlzjK/?M&J.mç͋|C}^gDڍ8}W{ B IUXcs\8'?|ƽ?]Bń#7=%7ܤd+Ylbbb7kJXHQJ勭Y|4x! 7Fx/5㳥 3;^f-!$ RdE^ғ>eIT͛7 ,h.y|7#Ȝ13FS F)SWc`!wfzt CS>?vܱy4m[Ѷe{J)C"exa3>蹴I%5֋];v?殮h̚A}3AvrJ{i-M#nۊ~p1n޸D|J0g^fB>=c.-}-܉dprr"":k׬g^L:͚GGLDrvLⴖw~#[uaЁ7㦯SF}BP|5>`6K/woQx9/G}tR}u|c2٭5%222P;YnݺW ,HH`ܹ}!Rx9(FzMlڱ/&,(UWg0L4݈}' qǖ/YNhp7@R%)Qu9 beɶ[D҇d_8l&&&h0͚董~cmZ,Y:\FumO3ݽĴSנuסWԺLLL S'Mbʄ^~ &SJm,Nر}'gϜG^-X3東=sfFJC}1>t:jp!({Ip'**'"h4Aș3+GZ4kɱǙ:c2/̒: cmj.ZwѫwO,Ɩ[0TQ׼X|%{vKؽk7%P~.@1n=m;AzDFFR 7nСu'/ǟڵFR=N8ɵkL5GG~s45d  &WұK7H<<MTT/gPl#2=qz1Xw~^J74Bl3oH8 {vaw_QP<==iլ5N"P~fLIzƏM[Xr1YfM㑂 A_x~5Y2SzU)VheLFPpSgN`0PFU OKTRE srŮa=:vM8 `2x p~_F\yrFvjކ_,U6?zn=Rqm6ٔj}6%111L2.BR /^fITQ*ժ0h@fNVТUsZni TG;9l4hC(S.ڎ`Ƈl\|2jT_e@jUT";~i{MSkvw=r~M&3&*$}_C Ԭ\>wJM)qswO@r^bŋRte6SfN L,_|_ Q멙V_qppTUoΝH-ݞt} }zAFm߆';crôh!O*V1&9JJpwwc똋wyg,7o$j8¯QVDu?nl>xedhVM}v-sqڶ=-_ap)/LFcWڔq܉LԶ +ۛw*}h۾ [ϪW1w>1z6ZjԩW=RQ}whK8˯@~pssD>t86=y/>o}䉓77Wbbbpuu`xzz&(%k_@BBz5wGɒ5m-ӢL2lں_|O0w<{\]]\lU_hق%-eۖ|2rJ_ ???2fʘ'h4&xGн+EdefEoىNPPf͝_1wHe}ZO3m6m߆7FᣨTm8I=ywgHHk/~#,fݷ(Udv_GGGf͞=Xp1m[}v)39qc-c?,۳H1fR`0РQ}~ڴC=qC_͗7W ȑ3-G6\ =JKX÷ Z`DXX(EѮqttP4l܀];vՔ)Www7jԬ ٸa# 7H ߡ  & s@tAfoۑ[?E$iFhC"nGɢ ˋqSp E!4 ̃';'_ft|MJU1\8RG?qswOߎO@(XwƼMwL̚=#t2޽KhufuC om6Ȕ)~dŭR< zrYd͛bsW1MuL4 g''U(hÃrOТiK~&LcH5k%cƌܿw9Kf˩ fAl֚b=siSӡs{Zj5f=}7m4Om1L61ٶGTZаP N^/7#aԨYz՗:y%KK;{2R TFqEqM l/$YgmXB^܃{9Kf._L``J*:s2MȌ31T{e a19Q<<S /o/5 #gy4vԪS3mHذ{F%c4uO>1 |qR80saҽ7~~t֙sssi&ZаPr΅_K7ҫ ~ԉlgܼy,Y2өkGz"zi8b\rSl4_kL79cSNf&O`n&OH~/v Wp=3SL) kì3>e46f7dKW.f)>|H2h[^;On IxKʗ~GDdRΟ3!A̞mĤi8n2M-VE&ŠѦ]kΞKuȝ;ywGıϗ2maF9x3HDH{@ c~@/s/n~=o7WgYDDDDFYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@c ȑREeByCnG":& \)""""-fcy?\PP<3PpYCάȖ9;nϵ"""""RT._+(U,؀ %kpJ15VDDDDYsvr&[T-Y. CL2 zs?>wo0y7 /O<H-{H $me-S?ܺs~'/3Idu5( H:u&y^9Xv! A%.X`f C f3qIb h>!.Y̆1 IDAT` }0lcŀ3b[Y>]q!oOorgåk kP@tv/^|0MP7a  `ra`Va7t#LԤbyp9~fC|Mk foMl-.-ǃCl{t}X?OV@te6XX YGOC ^lr!nF2v_>.D}l C| fyCs|shl{cgI6 7x5ZE 3#3ٮ.'ͶokdIWd Kqv=.`-b xe΀q-.,m7Ih?c +a}ƦI,'Gk|X[ŀ+Ō8nl O&b`ێ̘.[y ֙J5f:˚-?/nݪu];{1٣9`9.YbNϦEDD$]fLf3Ć-냱Q@Y„)v;֯>Q} şN'@\RzBZfiݦʗĵ!n4a=۝b7OmkdIWf9>= fmb uv\1'_I=\p809q~|j֩l$B1]PkoCf*O- V`;},"""l1c2D$I vE\csؼi3WEXX(L2%y>~k곚)l₟ll6a=vkGs&%Ϣ-·cLTƮ]`GӦr >>>+_W@s;NMYd+Ud4~?ze+=Gc_+ H7%x,DOǺpOڷ`Cvq]?Hdd$&{&[ض%XOh4m`,Vzf SlX}S K}E}[N hߺ#.tґ<\WҢI f͞AjUb-ff#1F#ؑ,Z/dŔb_[c_+ HO^,D>l1c/ɜ9VE& 1nw̘2i& :gggLj4LΓWJ5ldz}vf3 `҅88L;}{K:8tnnnL`e21%nRɴ^K,ҷcjʯWi~M[4SΌ67ocl[f3=%y!GؾKlBR~ʾV@te=|S88U2fdI\PH>F9N?SBulؿodf[#fŲ 8?}GLKϗkX0q&]uH0f͙"ᣆd0 '˖` ?*%׏돳_ =1blyKϮhШ>foܿGWs|xrddzL$},"""*YͤfTR@a0O@  Xvanʺ? dϑRJP(ucO[x| _΂e9VlfՊ`qSKY83>Sl2[,i Vvׯ%qg־~\g~? Ľ6\(F cl?{ܻ{U߬$kgOqZYDDDҕlƔԩ[>Xj̱u ,), طg??^S[g2QP~Z~b˟Lsqn޼I2e`4s;Ŝbw2C$*g_?.۱&wܱB2eʕM[xw?u >>߸G+Ŝp36,4Yٳgԉ/Y<2ĀރU&|bX.nN#}g6iEz~ IB,7'fׇU[NA],a9DEEܹsokwj},"""*L 3Lv?baDFFҡEg>_wyV|0MD`8::`BǏzu,lXA;.4f|OOO^5ul`}|r Q4mO/Owk׳g>~yr _>ӗ/s,Cz)&5Zߖ}y|H[sKxh@K Uz,.Genv^6V7ezf;XMNִJ_O2uG\FƋ!k5Y0AjYߋ*ە udM 2MSlQ-!e iRnËr?IWE 1TUg@ zN?59]J32x=ޒZ+딑Aju;DQsy6$kZ {֩8 2P,%8]NjiI8O/u<dwvs(eIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config4.png0000664000175000017500000024017313203343610022246 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{=tzIB] *VPPib^?"( E);kB =Ww?.2?Nyfn۷ЮmK%@ 6Kyp+u&/1yS/"QTTqԷC%x7$gs{QQPD~)!es(,x/Y!g-6 M^[+~~ϼJ$5#*n?KPRP>U`~9!e)%ԝ3rn%+(0(VYU]⋮Dk3o4ݘ|SxҋV>RD}kcΟx?ڵm%@ @,8 w@ ERRRYa@  ]ۖJhhȿ-@ @𯓚@֧ @ `XXm2,RPUt:]rה SF&+vP0`KK'æ!$<_.cFyRq5LEGXx zUi<6/@?X-V'"-*EL.eds2%- ._j׶tMBvL&3YYHD@^FSV%DɊxKj :@-V"e#!(=^\AQox|DaDخ|+環kHp:mgrTm@'d@ ,f3ץbE,2J*J 3/dޠk0$_(hjbBR^+qn+:5N d\8e XZJC[2ưne1#i[h3ҡBrDTزetʿdx*6ҲimWFDR`ZdRiQ*9d!4@ XVkU|ձkJzi LTgewO5XL&/d$ a ff3I,V{=;@@*5il;?&YdXeTjx1gdea0Ԩ$=ʂr Æ4$-ajf8e$%GKv6&6YqFk 8@HYVŚ͕T H`  ,2Mvw@X3I˶cW@Bc ңmR- $xq0Oe9`Mi'@P(bflh2`6g!3 !W h4H>$؃lZIMMw}iܽs )))Qp k* X ÿ9B#)dz4FE&+]Et'wgsbXg⟘4 6S {ͪQ1̀ dâL_}M E8F~?1zZ:W>W>fՀݬ%ޘaH|Uә2R9#~"Q }4#0Shm㈎ DB_*w^q Pə+6y9'뚰|8oA"?Á_rD=ZF@ JrF*YXSRH̲p9J2FwWҪǞN0zVb+:NBLdE`ǩS&ԯ=ƌYXdg 2Qb>(vLR,wu. K8N]dEBXlT~M޾\=¦DmB~P=m^_t l Qò9e#gAlՀ^@{e=,z+lZ6$#&'Z0KXleХY 1n%\}ߋ#@kLlc[7r*KK`Y20$q|G;3dcѦ}$ٯ!IlW`9w %ו-Fk֋BP@ j!*[f %ϷFl<5Jy#-3Q,VS $/CvtZ ZF ꒖J&Vn+QvT1) B]JRP+&}Q27Kc%#|VwoavfaބIҨ}T+e9hPTHe!-1 RV+9j(4m Ia~?}hԒaAҠo$Wf*vs̕/0~^iԨUj)KNq)N0@ [v;U rf W6wwpt O2ۨ/!_uT6 j8BRrz+%IBPrUѨKA1EQmvԕ⩦K'LUWVbL A9 )4BxEiJ:$cyשAy 6NX 6#aHS(x='0Т`5+<[:P7 %|E<'DQ+}LNI".-3}.kӀliWr2J#}!ZݎfgjTlvصwVJF)Q ] UjR;LLZ2P$伶(5b`ԨQ@9% l4Ul칍VEj j_| v J0f@ka8i)O!}iIH-% K@ AI$l3zOgTnJ|h.jJEF.ͣVA P1pE,ݜ9J,dH´vL&2lyt[}'>#>#>#>SIRq$݄l"ۭNҜkݣ5_L,wE9avS]b@XX8/^@2Yd (NCʕ+l"--uhΚ!ׇOZFu?>j.-;,lkEa Z-`wܼ'|CQPʇ5~1/vhqltwG[7% ȿ>IgLu*OwqNp\ڞȞVnoTizɩ.%"@pШլK6Q7 #50 a]koIĚLlp/vo>-ˑQceX`AFdggcilՂZFr233KbH;7}7[]櫧ٵ 6 px;1lJSlSCB6{H'j\ZQS[@ ܢH >oC(((lY,3R1YL>e7 hd߿bAI|5mP;.u$݊7 iaQ7QaQ}4/_:^]6f r+VlоIg4j-"#!9XIBRӄN#K$3;Pd6e G~80>xȩWI8e1 (f"3;sΰ+a]UϹ:tv ;p d$üs~n37n[Qwb̬ **^:C.YAi`J kQři8;Nd1p k5%<$ll1x I:U(ŮۑJsnvށj!sEQ2`Zzn37n[Qwb٩HZÃ(μnGR@R9"]>zW,+ߴ";7l%k ( ryz犙-6KC}:q? {f ͧJ>_8ɽ͝_oRJGRIDT#25kZۯ=ք<9qN/2Χ\~`=hҴ,lW*?5wW^}rb!'+VΏU+⍗$nm LxD8Ǐ9X_L5 _J &יtˌxi8uœ=>y -`ܔo)_ٷJM捙:w2uwQz8{O? $CZjGu\5(*OQ(05kS'}99:u|F{Xʔ)a#8q.#}1L2 FsA.']FRѬY3>}jժs1^2۷o'Lcr$/o=}v/a49}4GCRI^eL&l/w`#HOO%+X`1|W#Fw<bkT'33;vI58p wvm(BY61z#=-6ѻpiFVh7ŵɾ̵G<L6ϾEe{RVd^M!== ơh|e3|Hp,wd_-bjf>6;zAs.D]~KnFre?0炣qˣ(|J~y>+ϕe(|ӟ~9Qй}N=oly۝{ۺy+ulG;nJ7~>P9:Lpp0M4aaf]\.w{$ *9w +^#?RRRyiڢ _ ѮC[ٍ÷>>`ܗXj-WX,ԬU#ЬEΕ(̙ )VQCiquL4gϓEMrgd+rG >=(3 >~O=Nvv6WIF xnP8u4~9' 5%0.Oa:s(q.F m^<)zmO֭\%:q._I$6;z'y̌L[V\@ xaH{\,]ܨt[uc;-%| z>yY3b ,s!eqo'q *VC>v SXp WU6ǎU=ڻXV.EdTd}q|%[5`ߞ |ls"FƱ#ǨUq~%b9^ƒ/Ҏ9ΘQx-Z7_s IDATCQ[P?r%wyTbyv{^f *e(̲y󕷙g*U@Rbwwm[৅L{._N&FuFu)T/˳ޭ_osPLf׹+o3u$G; Ju6&|5#Nw3O#k^jJ*.^}耾?725kiPT.uCǚiYm 6lүJqBARaٷo?! 0 ˣ8Ê]1vCyz+UHxD8۶le劕tws˻\Ȫbg.ntQ"yL~.]"l; 2*QmfŲ?yn0]:)MY?1tbG/9E~Zi&_{kpb"V.=>u];vȡDDF6ǫˊ gb /3ԨbaՊx;:5jy,4gDFnwȩT"Cs9)}Z͎m;9yƌyaCefNŘ`huZV회}u>sv6$I^⸏20ܷػg5an+]Y_=r5p`_zvEVd""8I""|>~=CQ[P?((+_NWڛ3:{Q2ǀnd2y9[VdiJb?{رm'j&-A=``_yP.E* -qn<;rW\e_k]c~2w>/ Ô&a4x:ʈԵ#O4n YY<7jI~l.8IBBCr~7&1(^P/_qۇ.gΛJBRruPrp!/33KW`X,^G%tZ)۵<9QXdn 6@\c'h4To8c')YX"Z6]Ƕ\MawSХ=V92ف}7<֯_+V;p Fc mnkGeTZL55˖Mرm'?ۭP8\GηЬeSaN ̹iךFa:swvH>Wj;uv *zkR2M[ݽc7;`ڏS`_xe$ DWf)} (dqp6K& y S'ͤm6<oX[wtrn؎KI:ulKXxC}z>~8ܳ??JPTYR6o˯ _2edկǎ;]6eE˨Waaal߾#Rسe^:PxET#!! ('g(H~9WƉc'^ VSd_~O &$$-_xPx9zp.,]uٵ};ͪ?VѱkG +XE2m}cΰlcN/\ZEAޜP҃a_YSg3kj1ܲ,LFYzݻN:`X{ڣ -۴;Y?1j̈B)isS/}-Jw.ƼO?  oŜcwo IڶDQ`WУY5?#(8(O:Y;+Wn8;pt4ժWsߩO*;@#s I8@@PUN~P|FDRRֳ+={pU׃l/<!wÝFgy۵fܙsM;&|=ѝfqw wcNfN1Q$2j{/t {дEqVK"[B>Pu3O!s ~1-WIy7y7~eʗk>oֲ vi۾Mlp:aKLl4e"i =[.]FQQ~v :Trm$'_}ywww ݫ(n>7U`8~;ɡ Zt2T* ZJ%ㅟ5f-H FQ2ΟK zn  _MtVL~+g[wڨ(9Bi0Rϝn^aY~ͭCΡo&}U^dH-JesHڮ?׫ NȄG1I]ys~ay字ҽs^Y=(J+;cҨޖ\ȨՎ[fcC2(RQ9Ҫu+fϜ(4l؀VERbIIIa#G|drX,t:uyٳTϐӶ9TRaZh4[`10<]9.]/?,YDDExĎxǴھ*ժR(W,?z{앯p?zBs{#Ft)ɝh $55+_M焹u6ut<4dXط{?m;q(SQw~=FMRR|ۛc8wuS_ nݴm[9_bx7bjp(0Tʧ֨ܽuQoìytֱ@BzFLl4?̜Gמ]ٖЈPT*Ǐm-=y[L Rn]t:-?Ѿ#e1}& `a> ;+/a Dב1ƈ1==q`9}Q<*UdE{Mt։uyH:[x9My7g~u }<ϗKth~]zt"4,4tQ壨R [¾=;w=3Ѽu3j$(X*qXRy׬N9u _} j]t-4}x5dE&0(rsm~Y5<8]дe$Ibтٱm'# CVdCiݮ% soVfO7^Q3\՘/klAPםG4t璭qY1~W7~_4W(*`-H`tֱP>_-řJ2}'&ȊL:ؾeWy۶lGRW߫/gZZͺ|üئxm[yn*8≽Ij:uk{u읜K |{na(^ rHX/:!㾇!<"NÌ0 |yѰu6~y*g?Xfۭ޷L8^GMm?sn``ѱѨjfN͝ށNkJW'ѸY# JyfІ>t""Yӯy>w+[BES#R$aA/\BHH0/}6g{]q4׮GMItؚIKKGt JOeij7kn# X7rʭǞÈg^9u];Q&;p5**W 3=K,hq 0xaK<0U`X9}[$Ѿs;~5`#VyNqWXL'yE3~l6+c}1r8 @~y]vj.]:3H* q58y"!˖>NRJ4j+~X{Gq׳h"{}YYYDDDЦ]BB 5c:CL7Ѿs;HJLb(6oB+uߝTvl۷Isz+G/TAέ;1nEL~&uks~7wus_5׈?aʵTT.9v!.\sSF IvG"9tKp*#@xDuk3woX*cGfM{GL!@}RF™Sg/\c 臒kZGu(LUݹd+<<=t/O<<$t} J fsR\ǟ~I>11#^$ X8syBGS<槆]9} S&L㾇q4N|=rWXB^|ey!""#8<=^QV,*￙Lמ]8wˬ)s|@c QCԷ/}R+&f|˜is;GR)Wmnk?a|8&~= LhX( 4 (8ȑ&~_&/2 ghMRy=ѣG|u:N;镧rJyEF˯>/T7Шi,SL 4 +;忯 &6U+)alr7sm3/֮DŽ2w0sWSTv?оm0'B@}<(8:khױM9tQ`,m)w{G :vsj> RhѺ9%.s:{PRBmck͔/$C$#i֪OmyLjsDp>O]F͸|Ln:0P>=XWS@c ~͸/&'`Z\2mڷ.rވ*cƤYb TqFyp}zs#?-pEAR| A~"#eww %M&,i8(M ~: s|&j?{d0[=S7JinsO2'=pd]⯯#ܑ ,],#tvcG=d׽-a,?s3f_uw+8(C`iKąpBٍ8YyA0Y^͟v3܊\l6lʗefHMK%8(Lea0`fUn gu/jOѢq+7l%0& IDATCj@ GbVޏ\7 \gXvq1ēs}p{%;7)~9bAדEZjZ&?})AAA?w})'N-r`:0/'EȲϾ+mDDat:s_,_+b,[`-YΦPՄ|92n#ZSREw.\2ϝ?Vr5?`֌ټYml6֯!2UV!r2sfL6'@ &_}DC(>+&ObPVMپ-;7Ѻm;Wcؾw+&`>tX23tsaL3mڹcvt>  yc6~->Ȳ̨#Yvׯ"$$͉'@ ?{EBzא@BZB ^H/tDE)J^Az6DA{vgcw'ٝl@{}ms=9s:tP|% wwwZi@[q&4?}o6nk%N|r;Nff&N]/oP%J I<ܨV* p<9|ȰDUp2^^^ QcJ2&9q0Lĉc'R UxҡC:t:\,V\$I@6iRjWlOOOP94T$I9#9F!n`>ͦ^uLl Iul_W%_Ϝ6M6Sr2/FwƎ3ׇf)+,͛RYe':tСCjA`ú+^!r(X5Pd 7ģccغyhjIX|}oWP!P0 0E"+]%nߺE[:|(۶"~|eMNDhޢMzXX(,^DVSE0է'!hy*':tСCQn`0r헲o8\BebV{tIrb {v!qMiHrb {ؗ'CA2g`vըYɴH;I^5݃^FHEL*mUX+VӹCdDǗ:0} @ۖ` ?| UkX5Jq{BC:tС!lM6P% ˔ذqC||$I2O> ;w "J 1.\ [f[M(U τ3̤D 6N{oB OB b2)[,7I||]E>=7/ŋ0%Kvrm/qo2jHBB1$ITRHfx.ժWۋPhQNѡC:tśJYtkهGi6?:tɈ`2:tС`0pGa >޾_ӡC?̬L<1C:tx$ )l|}ltYɈ;+O˧X~_6=lYt?]*猺_jt_^-|՚|Bc-|sv+svOTx֚y~Er{R4UzZFW9N1vy"XzY,06iCS`2탿?ndRAvM9|JJ 9ί-<SQ(;ΧLWBKw8պr~E6 `xHܟ/2tuPyo~d7Ox$ dfeڈIWux$ QpwwG9dlJK)Ǜ3WZE)rjj֩bNQ3*inRQsbժfy͡ߠ$SWeIrVSk7NW^[墐(*St)jme V^լֶ+NTLTE 6StkmF*R`ͯU&j(UivʄZjVB{@t%IoW^)7?$)S֯NŵάZB\j2Q*ȎIYQ*9Q7I**t,s%s>gN{zdHt]66hn_Qݛ֫}F)tY QD\e9ή-7MMбY=te,zJX6;V;BMqUAEV:&5Xu4՚iͨ/*PĪ'*;VAG4X&37S棤):a+E~y MZ[vDEqsX5^cJ1ƕhogOPIWyJ*eyף*4MJG^4q2 Of rKoU "XzP*d9n *rpXXjQlx'gϱc>Z˱"m2np-[ȟ!D)+NV ]*ڡ&ŹyΫy#GAը)o s_oBPAyC-:t' "$&kVBDopf}p kKaqV.iéWjd3Rg$oc[|U+~2ǏWtO%~sZj$5ͩjWQ )>vh; 8Ub|-SkmJ|U$f >!i}y poݩ8`"6")0,f|2`E`2B$aú 9|ʑ.$lEXNlۺ/#~J$AV|_oQn<tG_x3͢rL4>v|/|a-̘6f͛:봇i|:k6E%(8Ȓn̊%;RU v)]zfQ1??txe?؎?䚳KL?7%K?1Wrz }Yb M6GtVXELG6Ui_17INWǔ}t.Hsm 9|QrښV9?~s]Tv3ϤBx8~~~R կ\mׯ0Oy2+)<<MyEQ ++'|@DVL &9( 9qp8lۺ ɨ69( ;];"++>]~l9}4,QZ`$1 9m2Y_k(dc9ݵhbǎ̞5A9H&DɄ Dk5þ=8%(sβ`߿ xq$'`4f۴Ͼݶ`Z5deev8`ٜ?~ FDddd69xlڸYZ%g{8=6nvPGc*[TYϞc]def:kʱe?lǚ[(]4ya~Xi}w5c~]Jrk-7=RSN`` Qёt֙d hThcW([h#k`-$$_(rʟS%KR><75J\z.ZṪ"G$FXV\Ϝ1 .P+і9sn9m\[N< PLiO_jkGu mRъe+xp;w\VLA"$VAYs']a=ԺO`}_ţG"*kW~ 8Ȃ`)4הUs[WNSԮL#9#Fө}g̐Cm̚KDH%"B*1UoXd>.^Gk}iii9j15@>lG"B*qu9niߦ#MipPt)VJRZtٍ [kC Uw{hy#biڠ9_~BNk9F ݏ'BHĔ(MhRcHNLa˦y\8S%*m:r_l+,d`7L̛Z ]N/tҥݒAC3ZUPj¥KWyb "LzVQ&]^.sebطwwb8)Q4c0GTX q M36 1qkTgM%,<V-*.$VMJUiEvAyk8&7cƭDWݻ$'ԣjt 7nڔQo GA]Fb|$X͛?MvMrJ2(2{\Z6mM* GWg̹6_ ;ئQdúM4k؂؊jM[DGxDH!.=rF#QݦEU#1q(rYԓjKjȜs}`Nk.Ӛ}qeY S'ԠK ??K fޟlֆ蜵AXש{3b(kY͟[r]EVFX ;ljf//Wڤ9ĽܳCs֧jt ^|zATX 6l\p ZtMxcXn߾㰟LiRv#˺ڔLkȱtMцW:yT5lA|Tub+Ӫi;Y9s{U1{xC=JgϜKmY%5=s.ߚ@:k?#*,gyrJu!#hҌթU{ɡ̵6Ph)\m+ƞ-O%K0w/V0lk-E:x ߥL2 gYq ZMѱS0?&(RjKŗ:R)"4ϾqF.9w<ƌXb<_އ&3pΞ9ˌOf1#57B|k^؎_€ݷoow&PXQ5iH& Yf=$ɖqF-˗~~@=HLJDT~֟-o 'B+\Eߞ}N(]*a̹,>&:2Of%9,w2} xY,, էW ,( ON$<==f׷;JW iK-yl*Mgy)絤޸7ww <ۦeZl( HbNk]{t&(8QX4 o59{,φ<Uv wǒ0yΧWެۺFvQ?OҵC7OfҴXE oƭ̙1YS!"֝mҠ.=!0(QcF "EAL ye]?TUWڣ 5kCcGɁ_~ek(\0+XI.ٴc=E!++]ۿChܬ1iZ!w<R>zM6`6$[zbŋ17bk("E ko ҟ ?͛7(]͸,'ELhʖ-R_l\,Z4%a3?^gF ό7!ܽs_N?N^аIxs3{=JcبW-QBE; (}P2xKxx3vh)¶ټq\FD7/id!埥~zvs@E*FFG:3k|8(|||Vt?>`~rc5Z8r('C…8<r Gn;ÿ)\,l:Bx( gg˩נ VKu2ZO;֯=׸Lzw}Lh?حKwna5 !`Ul2JxNpsggۯ;aO=bǶdgpkhٺ> ʖ+C$XXaw&ԡDJJbtؕo&kPBTg?~c㓙Sڣ ;tSGkz >_6] IDAT@ԯ狗:*WS1 ԯ``Sѻ;ŊJ;gΜ`HQPZU+oQ4nڈyscDDsMqo m2 :w}Gؤeggp" _7ٵczv5 _,YNמ]; I gl8z(r//'?xuؓ'OQIW$z|˶- C}z%"'ͱN7y64DV"E˛;^^ddd龾xx.EVKaшŭؾe~?N-(|4 ѩK;{5aӭWWNJ- L:а?= k!I3ΤSN-VɎb-]|7od,eVϞ=[rB" ƖZBu_>+$n;e}pQQ#$OF@@UU!igk|y&E!NnnDEGO]Dr: |u 1q1@E:v@}9)d)ݭ@(]zveTn/Vr>[X6B= _׻a6rqOd SVZ`;yϣ+:Zy^jH0dךWق>z̏r]z&={`~۸Y#M}(y _?_,[0 ]APP!yj5GwIAւVT'2ePzU"*FU=-M4NKK_xɵ*αZ<i*P0 mMkĆ5xh|Kڿ؎Re/k 9#-sS+{QF_%L&SX~]rw7P'%kϗ8{]esjN~ai{37t7Fc/ YyԇlߺL"BlOv*Fi}4(4qc@hh(ޤԫ+HؾuFiڼÓedmސXQ0P`Avtl-gT 's?cXf+]ۿb⻓2|5k 33Fʖ7w+wjmQXs֪U>qdfǓ7%J`sr!Y t/_AA*,?m&No`ԛ#x6Ξ9Ǜ#ߖ-(ϵ~ …K  ecEAȴ3^^7HDDVĪeX5movlEF0A?:۷o[EvQSʕ?wΓhSfҵiBNdfd9dMArrbLP -$hٶ/<(\~r=׆VZװu6X%K,eOyxy{$1=^nÆ'(a_LE%~:ww23mzή 򓪼S= >P0-廯w+Yl5o&7DY,9M<{zyQL޾> @& 1xW\cy6ʇ7N\myZ}CϿHM}(?+V;";;[က߻'ݭb0~Zr)iiitԝvҶ]EGW`xesMm}mwwwGdee1yep;3>zX۳x6o_co8Wlط'R>,SƜvitͥl2H[+WtQ|س\tFM8/['xbtQ{g>CRrb-~bO{wRp!f]=ϹaY+U߶'IbRM54}5RY6̙SS^ ZǑCGINMCB9W5O/Oޟ.FCG39<>?{gNa"*Y(Y_?_~k״IXɼ/$ׯ~?;uRs[Dž\62}?+W(Qv6'sY91~b=!k'ȴr57J{l,ZQTȁ777*D!Egl_.ϖݻYEGoί 9pBG`E ^|Z|(XN:Ҫ] :zk71d B(SO( ܺ%+(-}iުʥdef7DR.]-rT gߏ?q- 1iO&A*"ݍFMаI}F~e-ah9k%"yenj|;<)^R΍$$ՠh"lݴ[v<\mg`o}eL2M(3"| =׌30rm/o/nߺ9|tLevnEbRV]z R?.>5+Ҷ]UIƼ=n\AdT%S7ᵑh߶##9{,LF)Qj˗pdee3Zo0s ٟjWܡ+3giޢR>Z =*G9 ɟABL&H@} ||}H] ą٧G QR==xep_M4ܽcV@EI"2: ՘Tn޸EXD(&54y1>>>'\2jCn.j~kmЩ>j7˖kfYH9rХ=sg'##s}PL).yKQ)I~=c o KӖM!A*5c00voh|||صk/JL|M9GgNϾݙ;c>Td>gjxa⻓xJ…XZ222r7شԕ[n/tjƵ5J9Qr[76Vё|$6Avw+OYtHKKِg)S]Rt ~>]wiֲ)]`Ԏ"Ŋ J 41ӅVE0,? g1l =^NvV6;}m+ l*㬨UUװbj*rMlꔎ}Z|$P0W\%==BAD1`F sÅsiФ>bm$%";3c+iVlJX2sƍ@VM+(ISxob;֭ӣo77kkb's=J-Çi\~Ŋj |iZynBkV,]ūӥWg+7)LYX5~0hծ_,Z(4kT֝R΄Qq]|mT'O935^^*]*1r!s5F: СS{8 觬-18wNOܾ} MHȳGEG1\>2Wz'P0=zugA2)]4۷lg-PlYRץ[n*{jUh.FAgR;iztaO?'}O `ѼE|s ЫOOYAb嗫XKN589ց[PaF||}(R0+!Z̛8\+I}B4n0?ju^&x"+XͬgE")^oa|t>x6W ~@MؿgMA-Zᣇh eʖ&Z4}5dRF_H!c+3oRP 偽'sSQ`>;oݝj5Ҡq=gڊo7n{1w<;~zHǗ9G-ߩkGYt%@:v@\X|w4O搑Adt%"E %[Ezt6edfdH|8}Kf+%I>yS'~@hYeƎGMf)R0TvHi[SF*WIF8],9 gkr>G .DMib;DArLMg?g xxSLi'Tݻ1Hxy@o'Ѫm >_FMP@ΓW;EtF }WR__&M?˓ܛ# aRfVZQfc3?>=g<-:###wˏ/wpP'%Wq9_!7v )Yw\8{1_m[W8ϬC' 7r(UWS9&鹍(\Mb[-:ta:99}owhӡꋒO_2ib-/Y n\g>'"2b%#Q:6 By||}߬[??:a^||{. 5Pd]A֡)O'L¹ T\f|DQoy/::MwС)"##K/㍤WСC3և~ 0HE垬Ez#N91_3L2DV~:t Q_աC:?>_/I%̧N5:t СC:< :s9q(͒ZR(MZ_AF$t(_$|}\o4iww޽K>͊j15ҽ3Oqi۶ҽW7|OM˦hѺS>:t /LuСCO `|nj|+g.ⳑvqn ,Bij|a.߸~dgm6ZiJ$&%އb0qy=͙OEؾe;Æt.C+p`@n醛AWuСC$"EQȖ ߹wQINU(']-I/k.\v  Ɍkl߲KwX37%^updR{pGyP:tןbP1o pk?kWѥ{gnߺC&-9j$T|hVw^/]NdT$ ѻS>ʰ:4$`0탻;>-C:ta0p.- Xt9[4#88`j%4+) *3>/WѮtYYYYo@v:c֯@yXDž C:toۗt|+g/+|sחxu0nߺmWSپmkVaoۚ]5vlۉ$I4o ???ڶkê/W Fd-:tСCǿ❠|+Er%DuᘷU+V#"vK[z 짙V`P :H/o1fXj''QpaV._ITb*V+wU\ 3+ww|}1СC$Ih"+;o|+% 3/TR>XܸsRh ޫm۵I[` kV߀R*֫˚Ukxw#Ldal6d8Wd&#xzxSޞޚGX~_6=lYt?]*猺_jt_^-|՚|Bc-|sv+svOTx֚y~Er{R4UzZFW9N1vy"XzY,06iALr?wKSP)|̮\{wPx9<=4aϏܺyN_$|M/e/$&%p~ڷ&_J{Nٚr|t%t3]Y[PI|.Wds-d(Z+"N^ %ŀ˯扟$̬L1=֗|)W<{poWrCpE k7nHN…Yz oٸ-t,8I6ȣG*\51h@ټq ͚7u5oٌٳmv:v8tp IE www퐷%3gUZڜ@N9Bׂ-J+cUSNmsZPMsk{V=5k}eM嬰~Κj ^_gn䝮VE!?QTj**piSQ+ڦX+գLWO2>^X e1uPS\rjUNA?Vi͡kfZ3* 9(,vrubuHN,ˎXΛ򙷒^!"<D( [vDEqsX5^cJ1ƕh**O oU\TIuYȋ&kSn O$ݑ.Vj RY_OJ ض#"MAENk5]MTusԪPsǽjrH;)t%\nRk}Xı޲뤏cI-՛\E; r8MsUW];FQ1U3 ~yꛐ-rPPgr䂮 ! "$&kVBDopf}p kKaqV.ié (-*[pb5{ljOR*iWT$o.@Rƶ9TZ* RA~r}1msٍN~ժ;_TZۥk8ɦEBsOHvZE^h7Y'ׯ3ܺyf? QEA5uk+h y$KpBgm9|!MsWpDĉ??xAB$.\Ąs=;]S-lڸ rHjC>:>*7A $>pUޛo\245T F?įڥ{Ĥh(oOLh4{cN'/ǃEG9f/s9vz/&qunj\\\k^>.ߵ]cp-k˲v={I .\;IڱK哧/hb>|?QJ)-nޖ7F~4+iXr ӔW2yԮLdt~ h( 'h ܾͶ0im("¹ص+2U,ӧNhb!&L&%X(LF(;> Z4cfϚCp᠜z$dBakT¹sgY0oGL8R0mgn~K-2w\zfeee0{lΟ?g?#h Ɉ`2b2e`iݝ hݶ5[4[P>4eJ?1z`uDn$O>[(]4y!I6||w5c~]X1(߸m޴q`` Qёt֙d GVkD`jt@'q% $3yBM˩??ŧdɒ-kM٫Wѳ{|Errϳ>q9\HVPdg[q=sl.\@B-}*+k;@֭k˩J)M)ߗ@Mt>:M>Zl%N}}󔋄zEHhy ˮohsrzcUZJժ}0֭YGZ#֭YG]Tǯ+@ff&=?Ν 2ٵ+ĀA:|ȿfq&223H`mjzg߻{ԇ|s nnܽs?cQlٸsg̏ܰ>G $yԫBMsX6/Oizέ( .ܹCjC>[ܾÖM׻?O6-eqC˄I4:ɝJIT\޽}69U_iKA2hȭ[.txok(  ,j?FE$ Q:$+#|e˗.Ѽe3:uy̌LNuYe5^^?%Xdr9PXQ[Hvr +j5kїAYs']a=ԺO`}_ţG"*kW~*sdA],Ogȡ#,lƌalӒYsgҽW7fϚÑGXv!L99 ok8t!D/mvZ7oKD*D( ˗~i.QvMnC+:"eKEVLDH%#bU%I/k.lӒۤ_|J6 G%"OΝ=GN݉Xt:S>J&6q˖.qJ*ТI+oݡʧUUzj4iք e|{fϷiT*Qoӑ ;ĥDUfՊthۑo)F> I5KxkԈKF\_+WYq- ;}ļ9 HՀj5B.]l^-y>1Ua`!\tEN7n!*,(HNGlxm2.]&*,}{q!*,2k 9[GTX qWc<6 1qkTgM%,<Vԝ_ ]HZ*Ҿ͋(q4LnlS[w1ING *7nܴ)FYĪI67g5b9~O۷ۛdQd̹lښUsm?16wM ȆuhְIՀ-""iԩB\d5zvñ?岍F NMFb|mhQ̙t'qըԐ93b5'4\5yT5xjDѲI-}L: C֩Ξw?kcn/ZJ:tDVϞ9qTJν8u˙3gյuS1s}th"IIjib4 6/oݺkCGP=6ᱤ$5``6c[4k\Ys1 E8a*VRhe諠ӂ C@!w(JwwVH@q$$~ldB˼ϓ޹g9s̹sX2 -JPӻw(J-Keխ7Ϟ>K7UBW؟JЦC[~y>8{朖m)6hf,v*""~tr AƄj?q$M5O ugڍ:e|˂ey)G:?|Z7ouk5@=L1|״=?w\|ߏ@*ZaGFo=%)̝=%՚>y&˲A5C?;Zıќ_0wk6d@i`EyUkӧRݟ~5uajw0+֢oq+ϙyVvl߉=69سcNJdOj GcN*UH`b: [ؾe;EwFS SgN[7o0˹E&ăyOardN</iӾ5ao[HR%ȷ4onnL9PWF_c'ѽG7 'g fffT\!y *GPlݴzꇙUW3x =ٴa3:vT1gNex* 7F~pp'z)P)1e=bZ$)qp"/^I;Wؗ|J}z#, 'Da xR2=~*(_,FFF=t#P OoOl)9F >,jK^ԤM>eF r d -hfUJT”8KiRlۡ566J/Yɀl/eJc[>._LBܧm~;QY< tf/[5#766۴mގ :[պ ,b`< zvgߞTR#C$Nzkk~q0J {{$~W觩0e4vhC%x-P*1'.^D߁cMtlәv``O||y˦TUQQ(@xx8%[^O {HVכ|2N8rqlٰ!`_W,ga;s}{0mtBB^;ONvL9gȓDž )L5y3dPǏ97FNn@an7{֨B]y ?On0$u j|\<5i # ޞ}{g^5*I {w#-YpJjtJNjS`nnS>zGTC*JSYؘM}Ȃz&_u jrL15m6׮^g̤QDL҅/:C5&]XjMZ4óUUfݪTaLP%?0^m':5kjG]bܔ1$'0ozu͚MtC,]UГW^'KeIeۓQ6$8992"U?PM?zm77A֝/E {S$?_Oإ7aoزq+-+ϞݣypGRc'ag]YǓwؘX/נ.:E 'wQȯ渺rl5U(ЕgaN(_< sУO<<<2'^f=[[[J) o޸Ą\]ˑ#'Oқ>113fӺm+MXJP ^>ɴӲ (АeK3`Pk")y]v)WNhGS,(vve{:pyRFUMWp74oԂ;][#G>J%kWm6tReKq͌+׹t2va#ܾ}O/$ ,,q+*_EPVE o~.](51fFNϫq-q"i-&:F3 9P(046E)3 e 蜬K;rV6lԊQt LMM9qWuj\gW\R}{@OwZ6j#5Lwtg^B g)Z)~Gg 6Rŵ勗q:u9.I7_^Kפrj,yG\'GeiTZJPZ}/Xʰj/"E4׮Z, kkΜxȻwQ)_Fxe8>њ#bcb:iӧOLLٳT^1#BctM+WP67n!iy칖,%oOCa)dJJnݼ@:\3<<&xl߲_`ffFlL,E!Ii%)3'krmMϾ㐟5N+:e5Ǭ,i߹-wHO[xYĩy&++@J8vm;M=|D2ŵdȑ%nߥJʗ$%ׯ^~J,$IEXhUTVQn;F+u1!;J Ps&j)U;{2׭TQJW[+ll AqMV|)=mJ6xk\ׯqɓKo_:VtqJ%7o$ȡ\}GJFk=?9tLi->BCBu3tpfrftYd%+~}4KKs޽Sz![24׌-QQ=,,n)&){ko۸ReJ+$?l߼~~% KgOCʞm;]՜*聕\*յgk֩έ;i\) ףwM k2ߏ77nA5U*$޽MC]$(_,'mV<S9eVٝEw8Kr6ގ7n=ãנF3cqqw\^111ȏK7}Veo޸J۶e;ꮙ(8K2׮^333M y!Vjj*9DDx5jV+;iZߋM)y߲4/89;iNAGll OjR0E,9::gН:0Nޔ,Sx91Hn[1fRbgSf[ MpܔŪی 9YC\z^|:)rW_krj7Sj&c4dfN:~?XXSȿ,2lR$..2oll $aemoA6B)^2P+́_QZ%dWO=fVaaay IsR>uXrjoljBBZNbbҸL& ez"%t62VS|BBu"WҔАx=婾.)) u޾R&&:et 9Y:HPQ]~ KKr0ShɺmPر+ڕXt V5+&N066BRG`RZi^|EA011An('.N^*T*JUF4mItIq۾GNa&6?Qv,ͰeofUg#cc9Stt6Q;TQ}~W|wϯyzvB "6i%+t2KhrgG㦍ptR/ݽs/ݘd KK"#" pȿ{^---L7$CTcNwjG&έXѽg7ܻsUtc||9y/ W\fQ IDATޏ+;s^Jpow8}&333޾Kv^cckCع}'9s$By6O/r3tbS=}:jg=ՃK.q9V(zFARgOQn:VCnu'gGZdbjJJ읍5ܿwA?"M\CLˡ~=uꜺ4gATiߏQHރ_(]$hMjWt n]ٽ}ܣ|Ȓc?8D)y\r}${.Rw5#c#&Lco8K.$>׉EL[տsN'f .@r%yT .T<OX^+;]hsxΚ{CJ\Gs/yʥ+.WJ#+u\EFDhӧ&4N1@Ao.vY100JndwKcz:^>MIŒȷ}#9Y:HCo؆ʂZPI]ZoŮm;7qɓK'WRr dܸL3)>^]rjׯ}?}F|\HJ{xxr9BCBW۴; y-?܀j5PFeʺUZrdev2GYY9iB)T88_8MkIYgw>9"ѻo/.]D6h߱%e]>rfNIx G<:yАPZnZ5nڈ=۹ .[5lrpss寿nhoױ-7nc=r閥1aXP4_ؑc,X2/zp"29}]wQRP"7ӽg7gTaJreHJJ'tA#eiN7"EďCGs==E S\F<ׯ^HJuђJkXR9Sr#CӍS`dlqߨP$CRL0ס{ mJjq)1l):ޞl^k7S? VPj֯ڈ%yuVw=}JQ/F<{ucj}} )-X%Ib{wi&x̯g9v勗겐>C6X4g L9Nv\rcV,^*E%Iԣ#=:b؀ԬWSSS޽}GZU5Kd#;eĠYq)G'kՙz̬ r:vkϢ9K)V(IIJf (JPL;ag-Gm39дevmCiߥ-9SaJr =e χc{`/l8v,qɓk6caiqus%Onk4&xjtK>Zjc[JMwG%ITQgd2 +21 )y$Ѵeco?ҡk{8vY)}K7oe-{ uTNV>RDY ic6-ϟ &&6$]ѳS~7: jc0'TQ;ݵAeL~Koa_vjRz%V.YQ~Mx"onT%{7 7dpt֎[U)&yrW^eYdޏ7sæ ظf3{ M;*҇<(ۼUWg^֬Z!|}pkVӤ522bꥌ1!"I+!VZ\rs8&&\pVaddD-0ZX41x\r2jH̚/{7_^J)E|y52vnۉs PTqضe˖bь5 %JcuNʄ64iiױ*X0w!n>kj\a%tPӨU]066fӆͬ_KKK zҡs{M.Ett A˧[s3{F0,!""''GM+ f3c,V,[IdD$vvvkXWANB@)5kkVc]*LwǷ 2Esq&޽}M[ת!>.e" ֨̓GOشv f.{{;4)̟8ll)R,ss3TJ%ߘ=u%KA|J8K ,BnW2BCRn䘗 cU*OϾIgDEEafnNU^*_ ,QTs>~}Yk^AV&&,^i&|$= PJ4k zSv,>AJO)dfk_ף'6 դwMP)bJ$V-Y͘ah('Kn*FDx8oަmz\"уGsicX8g ;N9)䭹63{h&sg.`rʔ+EA'r177ÿ?ɲCf(+}3:),Es3kJ0 8:;ҵgLQSQ]V/[CUФɨmmӵ;KLt ?Fl쇐P”1K^L=AؽH].Dǽ|:O9/ë74]tkדҶޤG>,Y/=3f_Cشg=9s9iu>e Vpx1s.&ιy>4jPs>dD\lvHND!fU:1a`a(Os1\Ud8tƆׯBXx5^>^8:;k#&:}P#? Sݾ;׸οUkU3(SVt1Y8?LG-Ȕ9155*@Rѓk\K ܾycgb%ѡ[UyGp]Ąmsn࿄”rpI*U4o7b!LLMD|@ X&=FȄ,@%P%puDnhJ9'dP.LaAN\D :6K$7[G[(d `jb\.B2@ >?2 !FF:焃,| vH@ _)@ B8@ A*,@ B8@ A*,@ ".!G/2;r9*dvssfeҴXZZg;O}iU@ 3ȑ¹|7dtOI/H2.߸@Oky)G%));lۼgk~7݈aA@ m>Aq]g((85w~ݹJl|l9 RÏe*1dPݽ~2޹w~呿]r6@ h[XАĤ `ldĤ [YUyeZ~q6lƃ>VOKwg<1kLYd @ 2g!OT;2;#?vn݉LF2 K<͖lK+Kx@5i5ˈc]T*W3*̺5ʓ$9Rt% yQ|UΜ:9vNEPL$66NKƋ/ٿw?gM%7+:cN LRj-YEKk~T*/XBR(Tiި#(X:ȍnf@ G;Ȁ$ 7r"QQQDEE1n4 >N_hbzɦ6b(nӦE; Y|! b̜:SK5)C2й;$:::[z ϜYsiѲ9sSFLe <{~ߠ̞֩]f+o@ Ah9IDBR" I (HHsJ9H2/)DEEq <RIj?Jא!Pz^.y\ؼa gQL)5KnٵcxnFvhؤ2vf~V.[Eݯ+KxN??i-Z6r,ZSS[1E!@ ȄM>=CF bڄ 11Q$%&L=W._W;OyBAr9wkL5]vj/-jt-\*~~Y#@ :=lafIU9rXZchd@Rb"Qoy>jej`aifW^mƎO9/YD-g8Yݱu'mڷ]/ ZeҾ+ztɑ/^JضG'G6,Nf\~h`Q5b4=zwVY666f0f"T@XgT^۷88سzZbcbOX@ OMtMjM9?z@R>`(7ŕjk`inIMMV-` , s zkvV-Xp kUѣ^@hh(Q?`ee-k6yGO !! e=RvMvZ,}{Ӣes^2`($@e5۴k /bú)ptr$nF fMeL4 f*?i @ V^$Ү^i}@ hڋc@ "A@ R!d@  A@ R!d@  A@ R!d@  ׇBOMbb"I$TH_Zc C!z?>$|,M!6>ayFDTėVG Zڒх1 C#LZ x;oW0%mŧ=B"^׃(LpL2K$˂:imrj,*HR&2~> XYXrpFe695%=W w8:}iUϊc^E1Ȃad dAm ں߂ho}\8Ȃ -*-y'7s,[ > 7i|jo~ D[|k_|un޸~*/^d~;Ϟ=d1o?~¹?ȈH8$[}j|-nu,6uzӲYD 3gD.ZF *LQ@5l[>c5x[ޗVDRީS077K.cd2RJiܿUP(prro߾jK̙3ɝ;7(Q'Nh坙 ;k뉉,[@Q@ڷȱ#Dz-܅̝=Sc'۳?**Ӵ_}uo˭ b]| kmԶ3-Z6w^ܼqݴC+f_P\BF:yf-K7oNzꇐSB|||8v!!!t R={6#F 88@f͚EZ{.yɒ ;mqqqthӉoM-ӿ711:xzӳw 8-ǟ_H똕U:=]| m+v/l%^G4k"UZYzRzR p@aIo^9R媕%OArw/ Gz&Mdx)խ_WjѲO!F7nX~ydcc#m߽54}:뗝RP Q~5BzL+勤"%-[TzRP1Hҽ:"ԠQ}Dҽ'wt:cdcc#}WQcGJŋI...RΜҨ#/OJݾ*s's'5nXZ?}LQ,̕S:tjUu4#xg KΒԷыY/wZn)Ν[ʙ+TjeE3pa}vZiv"*]JoY>rJAd>geLlXjTt)EQFj峐'=%GGGH"ًgݻH>>_r#G[. 9RlW[fI+v/2At9=~qqqlX}r1y5W._aܤq,˗.mVYoѲ9m;>[7o#be9oM]Q:̙5ؘX~ql`؉t܁eK/o/Y#G;l޹KKtT᷁LƯƆFR*qpta.aaL2Sfг[/vݎnM)U$SgNҒ6sԙ,Cxx8mZp,^0ƏQ?}ll‚1FcÖ0r9A8seVNi?BiРm۶e^5oFFF" IDATɰդ+^8 ܻw"E漡!E͛Y!dm}ǶT\tؗ}vr> 2uunhH(OP.o8n?1?ev߉\.GNGVf$3kF0;`עqK*WDYڵc7sgcN7OJ2I-3a``+x9M Js=V-_appgӆt؍CI3d>6!̚;'Oen]Yr+~, 4˫XpA~㺍 {qtrԒ_FU֮^_o޼G *NrҥKy1;vƌCz܂d7~ =z۷oTׯu ϲ ;n޾#,4B~577͕{g+SB=50RPB9 ѧv:# ׬',4-;6i& q&>xk<#O. dG#geu]U \=}CSFUnyC1o\ÜRʢPrqt KSf5]]| kَAΑ#I7M? g) jAް~:M52e˗a%uܼ|Keҕqa޽bŚزsV kioP?7oBg.͟I& 5;7nN1c*$ΈW/YG'G8_T Y iH Ɩ-[055~nѣ߿_븯/˖-cL4 {{ꄓPt___ >> dY@3Hb̙58[/}8|}Ԭ]+WԄп:tnOZ52sؑi~;88G2u4O9ȳg>}8ww}r*bffF*8|0]u&,4P˂o}^315!1114r&&&L ˶raem 2#e65ucGg89g}} eX-k: FFF124$.2711͕Ktt73K%uolln9аq~ ~ȱ#(YޥP5i8vExx8uKLLD&q%_9i&^]cǎiӆgϞammѣٸq#AٙFtt4R|,Cnem]\#5Pdd6qq&;4=df;"sgX[WؗuS|9J-nZPf)20i+kkMsfcbV}ϐX֤Yc:ʓO87,--(R4@'˂o}!eoͻwQxy{ȓOIHHHKKK"#"L&vZ?z_ 1??_Χߐ*K8{\2sbӵcwbc>ݶ2^2{ K#qtr{SL |-5'=ߦ]kBBB9y~=E53g&Fq-]+Y$5b׮]ZioNF777O-[Fuz{{{rE^m۶ٖ!dma?zKzѸi#͊MF"Kr xkg$;eu)"2}k}|w瞖MuoF_=ɹ݇Ę9 R2dp]Uјq 3Rd7 *GmǩR sf. Ҷsۼ͞LՈ~pFj긧Zuj`B J& 161&,4 s}9˖BP```ܙkՁQ,yуGҳOy'OB @F-<6n5c6mڷۓfadhH2%IJJ̌Re>Dڲx"4h0eORE S\F<ׯ^HJu뫟ػvL6x8",,jɩS6cG'x,NRb"*Շ}Kk+KtG'G^x+EfIVm[fZ:D]ppp4i###U&M\\|ݻL@Ҷ}{q%:D,H\l,;Stѕ"/ ,3FG8YF'^acW< rڰaFwA>)WZuؽU 7D0%2>zkʌɴzgm:} rC9{v#xL-W$?zB.ĬQhAq^<фԞSgsvY-o9oބӰDS|Yƌ +tg9L<#`llDܹ\w@^x?_Fh,Sƚd<ª嫑ɛGcL4kg0v"*QȯKV,b|߹9lЩ=}ҽ3V,_U+VcieI.d<.?~PF5VO`63bŲDFװ0*S0} ݏKf ަiѪlXEcaawAoadL<'sNg e=---ٶ{+L`OcIHH͕իj۳w/ԭ_+wB 7n@$oݺ5o޼!005kдCk׮ϟիӯ_?\\\%C iۺLkY|5{veͪRׇ hy.qLws|>ΞǦ8{){[ }n"#" *]UVd83Чx`oK2sϽ1hӧЁ?joFU{s. Rlw8SſKzkW#ɘ9me)lCč D[|I72mFmM+ڪ[b!dDhH(tȐU*e'm]%qOܿ{E b _mU-YB,OAt\ aqsrKy<>wBx@]|+!PU` ScSb⣿*g%}8 E۔ _ . ҳA| Q #:g!}_=2K#d˂:d,*04433^yƣWJ'G,%fuQK#NF6Y8ȂLC!fViIP*s,W NF6Y8Ȃ De"/@ vY"b@ TY @ Hp@ TY @ HſAxo'_Z@ &vX 9:ugOcxVE/!ܽsK!/aMJ'x!=8L7jkOtlӉg} MF-}GEqҫEzGTDP{7{1[%DchX",eٰ-}sw{.v̘:^'e?zlA>8 /ЦE[AǶؼq rP}]8tzvECwӡTY.ӯgn\@R{Gpywl_" ~J ; 0ӳK/nKi+׸zGzJ455UO!T&oAQ|[Ay9zpK.4l@E F M WOѷWܿGP;7ŶA`g3(t ڻAϮs mDF8ۺҢqKRSR uϟ?8ۺҲI+^Cܭ38~lr @M066FKKvfglϟ=G.@-H$K$E"NnLLLh߱fNcጌ ſKN}[:1~ Ptystr`򴉜 9M.Xd92L& @ZZxBvL&#==]/%%E>TG4uNYwFr5g|JA}p*g>}̹Ϟ> ii T3k℺(wV\+A>_9&{w#q$a^|WxxTȡ@^zErr2w;ʕ2E='ɹIL&#P 66}wNwn!M\7k >qXWW_ n yO"p"~?pZg*"Gփ/^r6/]s_DߥT-AߎdPys=81u<}QWW'99 @JqswѫkoLL-trNK}9w6Ow/ HJLzsӝwQy$ ^uy u004 >^y_]f*ӧYTʗ;ͨ,gA>/8$''cYՒUkV^-1W/͕ (W,^^TP*UXt>,*HzzJAU|㰱1`7CASSmm-h~۶mmTSWcpFFF *,_<495زsm|}0i<+[m"i4*WAmڷfА Hg 7}+3SѲoJ:~fN,tA ?ǎ|;~lI#',1-@KS;AAJLAA!BAAK,AA!7_b[zpȨHdiu(5ԥT,SG+gtu AxC9u4#nj(OJJ _vPb9   ǼʭWqG:'q-CML͊%Y!sھD';TLAA,y{hCS}:Twe+]8Z:*U矺)?5]AAAPI'"a_18;CS8 n*mkg5UAAAPYҋ}u%T#U>TO_5+}UDxX8ζ'..СuG\E?!}wV\Gkg6dǶ>5bF=xkNqo5|4ռpweVd8ԂԩϢts ׫?~pqޝ]zqcN8E-pwiʗ;_iДh uu BL&2'YVT*ESfw>F]]KA/L |X^rfdHptc-;2$\yq/K: IDATym7 9"O˕.ا'&>1g+]aTJC126W}8t Rvl۩r|2ܻ{⻸8t6Hr=bcrquiҬ v؟eUKtuu9}Ls%$qΟT`EYrB.!PS+EYrTPwR;!ϯ!?Y A֐R7ïRtʙGK"95g/e,{yDq9ftd􈱴nۊa,n=*U~ȈҥKc&Rti7oٌxj֪ILFzzzr=n4[u`@߁t==]ݽg.;aFzuC033ѣGGgGN;I@*YX$IR)#ǎ`ƔHR|,r |woao:T4Zhk K:FzF G}8d]bctAzOŢ%czO3l*e,Q7XHN.N^u߁ӫOORl1._#IOiiڶoC>=T߱KG^|捛Ylzz;SŲ98:9c6fϜèᣑH)u|^__v0c &?TXVA|XRRR8a2qo|s֣+FFF\ͿmAGG2WsW<A(/cWYZ*Rmô3axZnFrZ*zz Smh+אH$xzy*y3~$\0kPo'$G,]&&&2e0udŸUP_FǣGlٱIgߞ_Ò噥3ΚDZsr9U,+3b48&<,&s5RJA&ec7qoP?\3Ёy e2lld><1\ubcd.t }+3SѲoJ:AAEm`gb=w 돯ݺJۆ_+~fub[RR26ȐMjJ /tl۽RW~cFeI88sXJ}2AMGzټq _㘚7Ҳ }yv3wZUq}C 5"hզZ\84TJ@~۰\ܭ3͚7!>>jh:A>Ĕ>s-M, 4yi22Pޟ&qQlڰފyUh۲GU* Ux455iШ>&&&TOmܫS.'OCl۲Yj*?CwLLL|䧕Ke@8jԬ}t2}t} % %K d$$%0f(c̄Q$$Ɠ&K%11IyӵװQLh142k9ڷlՂҤ~3̜K"*Jd*& d͖M[iݼ 5\=G+Q6AJ |ʙ#e4T$&/'/䅣4MkRRyC9r%)r&qp*NJ!KdhjiWL 2dShٺ%odEgasd 'ݱ/_O,q/y'1OxY ľݱFtvqJ#ou7(-NCCZk|z*e^ƜGIMM}=铧*4Ѡs9ݸ~r>^ -mbA%&Ȃ (=}j5 IϢL&C&ȳgD< V}t ˩all̀9~8fؠ88Ѵy5C.ran\>yɻմyS3[N8Mp\kGһ{_Ő\x9a+Цa{Bai̷4R k7F_נa:fMͨoƠ=?}?.G lrףF|?i}ZtΞDZcHPW>({;ng9̘:$M ktb_̪y5eʘ3m4ZjG[9"ՔbnfF =AJ(&  e/&X  B6b,  و   d%&b^E#OVJ Sc3BKZpɑCG9&t*  Bq/|32$8X:Sݱk` .߼븗ŕkzm;X ;K>y?S/qq+\x3AAwRrOl*ۣd W^HMeMˡջW⍶J?ǎ޵G&N龷dw-FD"\r1UU444J,7AAy|7F&h#KKESz$Q&#%5 uu~ 7{et% EMXܻ{XFJ[mE붭J03AA8yE#KKDž{pqƝ=;PJ"!U>/o=}=רUɢaև^~8ۺ[_|PZw ,]r\}iլ 5pvoCvlɸS.vntܓG5;K?pwiڴhM7c-  S;)))HTL8괉3hѺYmTɕWSW#q$A<}VV@۷nӷg?7ma{ƒKHJLb1ܹ}h\D"am|?Z|ќ'#1slfN5+kobj1ffDž0}R(S'M܌  V'i4R222Pޟ&O+TߡCqqVWOٲeϟ[,D"ѫoOd.ŧ7_]DqD$,77K*J r*3jHר ػ{  y,I44$$%0f(Θ HH'MJ,IzwgƏӔI<_zv"H|z3{7nRLV|9d2.<ܼ ع)rllAAxy\μ/1+mƛ4HJMMk22҉yC9r[GWg'Ti)FHK+hjj׃(g/  "Okn4"EsqJr2/c^IřA當 AMM G'$HO{-7oܤrʨ}\AA+r =}j5 IϢL&C&ȳgD< V}tgB^F;=b,aF_D] ^81'q$O`Яyp?p1Ν9dž_7QAAT^5]μm'j0B4R k7F_נX͏׮dE|w &ӓÇ|ԮC[Ξ>nj3 zZeK1fXձ\:u053  ݷ2#9%-69AA.1-@KSK,AAs^K,A 2*YZ*R*3:ں%ٰv#̼}\rʩ9fGWOJJ _vPҩ9qY*+g(cRM3wA)cR+y]iD<`k_!\0hm;sTAAAD%%'r5P_};².m-ީ/\s-|AY UsL314Ů#"lg,''>.s.oU֖A( b '*U,֕l lgSɎW*h'^TD"Q|剁>#3xܝ<ɷ\`¥ƅzup97;:wgߞ_1lpsgͣQ@\qqyq1atW{wjl|L&c܅x΍&qfLO:8ٸPҒyooCY͋sE!8wܥsxyxhLM7OƎjT'OYڻӴAsN8gpzwC]/?m]O\\S'NӦE[ŵؼqұ11|3d$5pws噟T[o%^8ۺүWY|5upwcN5r):tl϶-ۑ142DtMʥ4l@7@ڵQ:;+{TwWZzυA8>>-[/o/"Fxb52gO>c릭y)+¿?Ǝz\pҰqؘXڂysTQ~8y_YGz3d`.E,ADijjX`D45%浫װQ*K숡!W\Ѿe-W&1g\"G/U`ll̋@r[;[Ĵ W-Һyjz]ķV(lEce]2221k֪rܼNM|.'Ozk[c(822D$%%3ߠ,lE\.']Zcٯ&~|=x$JsV#ϼ8x;ȉIo|{bGvna]\qĤőˡ,Dsطg?۷1,\Ő5fqʕ.ا'&>1g+]Xb:8s}bcnu7(-NCCZk|z*e^ƜGIMM}=铧*|1n\AreUp憖VP8ٹ8t6H\QrM*WLU**߻{O瘥(/U-w |H5AK޿{In_d9}ԘS_wАR7ïɩI}ɩI?T,cXbv cccc9t0 ʼnsrCs 3LJV͛ri:O153wݽ!tryo' x'gG?bݚܸ~NjJJP8ٍ7 ;?'$8{wAC0#8w~ݠ9t}}zu9ېd}"J9v۷`Ɣ;ssgZ5Ax_E^b!  ?ǎ޵G&N |tt(cɫX̻JEK5/cִٌf jcr:#-^Ntt4zzԨY=DJ_6,]q,R+TݵP9ػ930cL061 \Yb1/fռz2e̙6{-[a#֭YǜYsjJ173B ŚCQd=ۘ=sF"ҦrPު5+YdcFE]]ʕ[S3Sٹo3`SIMMe4jiBd׭GWXl%ۂ6eq^($kHNIG~MN(wnܿFi3l=mwQ@=dNGZL;K&OD箝>Z/ Ĕ>s-M/QFuJ-b~>(;b_.IiՁ}iլ 5pvoCvlɸS.vntܓG&QGY W{wZ6iVOAgJ}عۆM@fI~+ڻӣK/Ea,)oض5klJ/s%,ܞ_Ku8Z;[۟?P< wcSj^>| 7jAu;Vcbz >pwC9>Rө}\ܨ^Yg+alJ_pa6AAJVѫX|4 ,b~mG㦍KQ@2v LvNȈ &.+ -[uk3z(mٺy{'ʔ-ínӱmg5`޴a33bTΩ1t$:::7naAdy! ԇ^Yin}EY G"_Dշ6.>u2Z:8x8~u,^$ל^D9~~^%#W8T*ea/#njC1m[ ѭgWcQti?~LDJ+vJ-1ut/XBZ5IHOO/TǍ} ;N]:o.;aFzuC033ѣǩ IDATGGgGN\[‚''p)3Jd4c'jիѸi#&D(]Ґ5u5 K§7iii/N.N^u߁ӫOORl1._#IOiiڶoC>=T߱KG^|捛Ylzz;SŲ9{~ۿn,))L07qbcka9p{Qd7A!  9dAAAFLAA!1AAAlYAAdAAAFLAA!1AAAlYAAdAAAFLAA!1AAAlڑ&xo&e].RubOc{.K.eܙt:EdRjŸp!>j'89t5--AA1-|/tgscLԽ~ !hԤD=<, 6w@ &Aٵ}bܪY=oVڱu6v6 ?^ӣSWqhб;b* {yJB[ʖ+Kՙ6s jjjg/aFvmĩXH$D=_O@K[VU115)>?k Vb2q*&%%uuuLY˓cmcEN=x!?6nYO=q'bLOݘuj띪ZYRbNC[du_ .(XkTi~Qϣ(}َz֣+@-Ex8zbۖ߶lJRbv{-m]iE{^U!Z5kC-8ٸп16l&##CJHH&Y j^ j0OW\{hڠ9N;VcP!z`AZ5kCu8Z;[۟?P?!!ƌgf~{>˗yTwc5/]AJJ v߻_.66F)b`P!J}ExAzMqu57U]S.عQӽV9ƌY'g]}49zǯvN6.ڻӣK/{Pk |H=g7ǣ5=kЦ]kldڋ=^xzyRɢD񽧗'Jb`h-/ #3xܝ<ɷK1wܥsxyxhLM7OƎE ~Yz;yСu|'%&1} kޝ^zs_33vع)m׳?nr=?S'NӦE[\hR7nQ  w>Sqq9b7f޹;KirŶ+~򲝓'NѬa \iڠ9'OReJ^ާ4wP̩lި=94w<4'\cׅ| >تҶb hjj~FWWWiOo8/KIOOڕk4j?B5wuݯY|5C?J/=ojj\i{SG!&:?@[G?gP>R2hԤ!F Lp9Voss3ysbc=}6S'M㧕Ks/Yt>8{,/Ɔu߁?d1:q ###&L@\Y6th---̘)`﮽J4LJt&(Gn\[ݦcke J*hаJ d¸prq4ygOG4hX/X¨whXAP{΋6J"99}cBRR2=Ȑ&5%3@BRzEPf8 +p=]!&2Xf=ǍƚѿwOL29vw\1#033eúܓ#afnQ>;555$m68:9 )߅0}R(S'M܌8L> +k+^b`aLU0 hݒ1ߍeL,^1^,6lfԙۋ>^~;{;1`Pٴq3#㘚x.]x2y$ټqKu! F!SK/f·-ܵo6Hģ,*[p>(C#CB_PB7iDocZ5kK@=E[[eK3p@LMKoP.9xeܽsW1`ck8.kEv=6o>s~Z\.קAg >-[/o/"Fx(&'55_VaĨo%s{57jqÁC)]iRX]ǛuLwEƏiccf-*/AV.[=F @չx{wUsSl<*cf~~^7wW,Qglݴ5.0Kڽ ckֶk{w:?BkO&&&J1G{H/T*a4l܀{0zXjծE W=?GDҮC;~[33,*[(>̘2c0yDZU:2jjo}hjjgVM7/첨2Ƞ_1glLJo~~].㴴4K8UGUiir w'ꟹ:JHP?cwOa1ԩCRRrk}P\>8l` FFEIOe B..OW?qJ_4UƏd??5u5455e_V̬w SU͵"*Χ0 k]P ߑB<Rĵo~~@_[6c7cٹ}^hkkQ~Gg4oLq75͹xjjjXXؗ5v(i>.'[;[n޸I*\13޽řAr(쵮X)gt.z~;uA(NyNx<*eaz-u}`fnF|\۷f~*N$ѿ?ZZZ^3SfL2eulۙ4.ّ2טUȵZ(~Z 7wWp"ڴo58ޱn=e;< {G{޼~\X}*W_a`h@B|Ù3gVq95ί8Lj?;zpAnx AyhHuaa}nf(JQ3hFJ<0r8e˖e<1n8ًCO{g/xh̚1kAXX.KBq]ر{cjS`@Ɍlik;R' yt"##XKShܤ`~ycF{抆 ^:e˖v(Ǔ{g|3DDS^]\r׿/<6g%ӧ=,IYB]Q:sa,{5Ng|"܋3ħ~b+0y* Inn.4j\̹/hbV,[IZZQQQ$7J&>E]Ll K^[g3jhFSB28}дYV_ɴ3vӶ]b={,_SgDlL UE ]|k^+!B\gss{<,7eggƺ$O$4,_vbIB!uS-, G eȰX!//[b!B!DqX=B!p#Y!B7>ky8tOtF@@%~7'!Bԙ4囯v3B]bqif@67nH (M ظacdRAhGhԊ{j; [J_>BױqWdG Ov'M"ǺT~ńq*!%; c$&&2n8e~!ӨQ#>999 :h>|8gϞ-~ ;(3}y/bQJ0t e/oHϦw6oNm+hjՎ',,D'Lٯ!!Ԫ]r]Srf8k,] ~ֱp ˇ?~: ԟUWp8.mB!ĵJ,^u֭[NJ+SYfQreVX7̪Ua߿u1}tK2e WÅ7Ts #(Qί J,8Ar9{WXeTZ4WXx]'ӺY"yy3D&9y$ΝK[x|+#o>=I-HӐ:72aDڵlOrBcn}793z591W@w <H4ߔqc5i؄;)tr͓[$) Uh:C#?'ݏƴlҚO^.oaFv|{3r,7uҪuv]kvv6{Z1 -IӐm:msfΥ}$iHfmg'~!ݻFrBcڶhϢbHЦ/>ʝErBcnkW^֯F{xrSv֍0`~{?*q <ǎf[yI/D'<|v'hnz4ޝg]w0Ә2y*/~!ҹKg< Ma2ᇨ^~3D ΄_|<9I ]'&6$dS^|аPf8=[i{K72w(((5+2eT?0͛[ydX-w@_u,1c?xX}Sa'=&~|+ΜGݺu3cG F5<8x]w%;+r=o nƏ}}ۿ΃bȰy'<rc&7z}|s'NLcy<8mۜJWM IDATسg/g'Յ; o2sKpoΟvef}n`=_N:ڷIƅ*h۾-1K"-XLNytXhw[ ȩRW5uրd9p 5jTZC[_v.^JڵrͼL<[0o!)//Buyu*z !^rgȿ}Q+̋tk3DEEʽ bْeߗ%)ЫV%22]}Gʂe7ӠaA$ %)лO/hVs([,aaa*GVVޗUz?N:U}iA;Zv'oz=Ymog~NNN^?ٽ[ԩ[OnPm'֛yЗ͛ͤ4g"wEvV6 :GffժW+V->gIƴnӚ%)ԳOL5 Mӈ ##c>`_T֯Y}zJ%A3^!ZuQ%E\] jIMMrrǏSJ{i~FQG?y&8%˘Գڹy)fodd=}աvvG?B@@ ӧNاؾH+23*~ Bw/uS`@ϟ/|\P XVy[򠠠 uyyyv.EHH]+nEP?SZ`?~)o~6o([|pp0o XFKHH}Ο?υ sW%oHMV|93|D:t[Λ9;+b.B!ĵNzX}|v>}r-[\h}hFv o, }=Q,vCTT$}ޣCCCQ{ȇQF$5UN8e G-dz%%b,{xrK%jxPml*_}~}INnϿ,s]6;ojݒ)7Q֬Z33y?8x]`P?FWZUǫX"Kd aΟ^Gm~P1{!]JŊ%^!4yX\(#<믿}ǫ3f Ջ2eʠbĉۗj 8ٚYy]^Q? jdddp״Zaadg研"!1R^^D>IWX8/y W)3пVbӀuэɓgylG^֤icڵo˳O?$&%ritݰxGI^9bwu!>}ncG1DGI&|Vcᒗ =nMkybSԠ>999u.ڷqF<=q?9|1~$ 0BBB\ˬ:{tqIzuypCFrW ev[75-Z`q8\,3 ?:~,a?s K?ͽYu㮞>BrB˸%s&Mxw?~<ׯ^zlڴ ,[ѣG3tPz͜9sܷ}ʾgs2rhΝ;gK Jy꺀.b,/L{cp ;;*U0{LY{@rҵ /LB6Թ-Z6Gۘ2y*n8W{éS]E NbDj,f9̜>eӔ/_wf͚zJ=??rt CjjOf| ^=nΜ,fŲErdk^yhy< L~$7g_k8 KK+  o,Z]{y,^# zjg@zbSQ7?۴g.kVg{Ʒ  &M5e|LT(Zj~B!ڲwc('NCԫDV=a,Ne|mXRGҤi#z嶆y^ (rk߲ooߗXPƏ}Çեݔ9vm=۳!Fgss{^܍BJB3:v{tٍS>sSt-:ǍB^϶|Ͼ@rk*|!v[}k|-X gsrzj]&0\044̿ 0@p(Ьjίo\g+aSilf~fe4l7v_+utk~kA_ O{Ngy|BthjR B!(a9s /nfG<B9\!(9#ۨ3UzZ ® v&;x}nwcd+<3H^#PDEDО:Lk0t{Du60àfwƭCY#f`wvfxk7!A^g޶ :GjSs(gQ_O]*]> 4M̝m,Þ}f_K@B!D2G2 p%4PQfZtOtOB=FkXYpT:T(kvY]F7:5VkۛbGA}kKCG  sGoI/\Q|=6QcG4g8nw[i/\NBJ3 d z̰5ez4e++Td!B0e8t9i=imE7W26ôV܃VPktVSV0r uvR]SV[KmcN5=v47>N4>?~a$&%|r5ӧ`DGGӹKgƌ{t ka{<“U_ӼZ+9W`ƞmʤ),YBTtloօ#asSY*BCCqΑv |.>12;%*Wnyg|+/fiBqE:%~d̸єn\nBm&<=2eʰݼ4m+Wh;v[1'@nn.n1TP~DDsO]6i(`ph8撞δ秣'd(m@vԊ-Ģ} t1e:t~F #2*e(CF Qf6nr]qY|i83T_TI "YQh_fd!B(_#Ⱦ෽XhY+Hn̷۶?pOTGZDg_pwnzymRbbcSgM!((G<:Qtg3*f`5]+X/S4%?P+#2zeִ={WVPb]}EߘD&d!B( ypK~vlewovNbR6{9.EttN8R:]byם :e(Yg\!T1?k2ϙS4oFJڦ ֈ {&͗ۘ9uOL@TTUjqᯍa'Y!%ˬprjbT`ϯ{iڼu>sx0(`k7{`.Ze ר/z-  !'y}y(F!'.X\*ImYZ2Н-k'.GMYQ\٫j棓̾KB!JUba?0g,0ԥ=ԤVxVS|޽\Ƚ#SAujS1ױfpμPP:o8ykՍRfUº n8.1}<<~$p\`NOWBY&,YY4㪷?d!B^w1$ŬZկtiBBOX)IS%+x˧DN\mq,kZ4naa!,Yy3^f]jjؖrsH/%Bb=!-Zζ/nu>\Y,U+1s 6}MomT)hиc&&vM{^lbF+Ėgcd֭=z]{(KmٻT=jCB>~݌?='Mm\g;t '뮈v"\ !da༰ C:ne-Y!%0 t]U4fIH%?O\,K,$ !DYwғv*j7b7@.]% !DYrI(|pޔE) !B\ʔ#3 Wh]9ٔ+Scb:EDDUl_Svvcbq'Y!%+Zm~{*R0 n*l6ǏYVS^~T$<\Rdz87O-Y!%RLe6hrnΟV14mВJ1 \zthۑ]į~k[m;Rj ~osnB!׊7tH=IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config5.png0000664000175000017500000023101613203343610022243 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{-^H% BK4E EذboޤJSDlJE  ү~\]]Bcz̾y37Y׮ e?Z4o,AFFFFFFFFF;v#Yqxܹ{DFFFFFFFFFƓZ4o,o9dddddddddd;))]m #########_"I  Ff(( J FSUbIDIΈYCRH7CB"ELfPi٫-%3ɩdH}RDzyh0I4*Bx?IH4fx֨ ]Тycﮄ4tz23oo-^^^TiE2udTz磦خ$deR*0/ e+o*c2'Yf$[c&ҡJnĬR"Hf3>mz㳷sVE#2222222'zBTNY?/$ $ ( %q^Z/OKK NOd$IBT;: %Axyi\HzU; +Y2 ?&uWJ Ңw.Y:*o b={>nmbi5-o|a^MLX uܺN3+ ^Q+ITL_jfg y ڇnӻy a>(H;72P[RW΂rAr jEm-s'xq&3 owl$W F#KRRxneVמtr&~j%e0gQ/e^d\x!u:$z܀gV2Ԭ˳hFt(1$3:!ږbFG}W: QPLz+gؽ3h5 "0ZP>(3{wrEG&h9`,3o09$9td ľ0Z!&co1E4Ĵ_rA^/4|֢.Q:ɥL5>WIMɡt4kГׄxw O"^MGmC|R;#S w \nkDL&# :3_:e;Y|~ԫHi%)#alJB*\E3 ZEZIMIEXmz5k\FVc6t D3RPE*h;qHV\B$#:zR 2v3Ճ]Q߼BzQsꭙLgX5c.M^1iYűÊMWNH* As@#;[x9k*HoIPiVL1QBP&e"*B鵓oʵ(89[la-QT(P'9^uA/4*dYFFFFFF~!T H%&F ?ފ7l ]LadG)"%[fz#͸k9BPz+A@r`J/b$Y>9(RIЩSbLc&*R+^Z%+ܡ>ePIG+PxiP ":5UaєN _ H\RKNZo-j$zm1W"ѐS Td9 !*]>/D۫H@Pe<<=-L:RӳHO"-5 8.ڔZ#:tV nE4l8c~頬4P25TqGiAB:_,Ʃ$Jx ''~ljs9=; >tgrbKN#??L lD49}'j<^ZNMN$gHȹtedu!su4j5VA̬L4 (QTizK=v(-jyx)F%~*cqpek3$S ՈXZd)]<7$ )qx%71͟Ksf`[z<꿉H5k8FuIDR@{1Z 9唇ѶcƲ7=Qwc7WBrc-M{B!J"fI!ټŖyB{k˟9)& 7h6q0n!ˠzT-YgOճU +Z?xв.K)n=2z*:ɺemM{,=Va&"hFn'`1%I0 R%R(:fFdE8dex=UF2$~l*'gAoèEAX!a%Ճl2# PXc!IcvO(:{l; Sr'J@!Ydlyrxl̃AFOaX`3ZI@RX] XTV+YlA6cF@D-A d;{,qRy),feCSr ,]/'4,4tfylÓœed=2+zzAҝh1m-Z6vZ^ჇgvFyeڇ`$,m_)E$!AE9A0[;*E[Ev ^hl j~?{~'}F0Ln~7lɩg=W;<这.hbRRS L':x8k& l3=$2<+ѼY ޝF)AoN4\=)V:ώ;󽶧e,[%v->x/atԃоeGn%%>KƟ~!)v=EwzpBug۹c7׬:'9S8w>DjJ k׮e^=_ Cn7k۶nf-V= ߣǘ4HϠuv0)0ma _#ڭ j͜sr* -vi=l[|l}IZZ @bU3OѼeqKu~ﲬncq,_U N;LbȡkP '$It҃+ͶnҎf؈Y|?Ong9E7rĝ3[uSz;۹}#^źMkP[Ory/5?;)W!A( +qsֿ[st'J~<~ev\Ջu՞l01կk/K/%eҩk'ꆯ}cdȞbmn_ڻVБ/Xts̢Lw¾I=ƕ2u^Isq]Uk6o*˔s}\\ Un5es]x? DDEg-wnWvp%תeӯy kҐ̌LN<? B9I*x۷3} ^ of΃38p ׮3}4xիWۿ дY|r>-saK~OIFFG!#3*U+p2ֳ{0f&}X\I$Ij.1~5j -5vɤϸt2Ə(ɶɾ=G>U2c4)_NEEF:RDƌPTNͦ 2rhޛ<.w+Vf} zj5zAХ[>}sw$^^^DDoqþ=)Y$ ʾpݯm=p+ߟ-Oa|(+_LRaj2:ols۷gnA.:>u+P=rW!X&dB{Nߟz8\b a{w7Ubd[F^ܹ¤w>~z|=K KdFVصzg{̯ 7II1 TͰQCi(E$.ZIBDT$FlcE\zL773䷍3㻙$%LJ.:3lG^Ȃ 6e |,;?LFF1È|W\8w;)lvtfQ\Tt#MD7^;|u[Xqg-_$1&fK/w_Ne˟[]c'/6p"_APpF. w,[zg fF Odg' -[}z|ylXI +ǻ3oMh4l<ѧ j .^F#r$cC5CGiTrӤYcP8p/ȨpX눭 0NDQ{jթiljےgz=k\>r%cLl &sgQjSq1 y&KxIMڹ30Mo$ IШiC^{{\vͧ\o~pN 7啫P5W8h+K IDATW͘DM~7g/?P|Yn&=4m+1klnJ"*:oZjc`ӹ2etukԤ!>!<2ܪ^g[}{3Y9}`z_znOry)wRعml@^{oоYG^<bmm Xd%F%"2bqܰa=/oXƿ=po'S^:.T(}<ʹsU(s?;  dk#Ez9IIZf|;#'`\ kVO>4h܀ԔT-E֍hdoؖ "+Gpw#^1zH:EHhڶ_7pbƿ5UIH]KW8|G#$4$ߴ^%prU]ػ{ x>Uy÷̞:11{La.h4{nz7-۴ mfO;e2*V`OtmW-hӧOS% ^̛O &$8-3|5m#B,\9|F ͷSB9=n?-DW`0x;:qcxi/7fl) u3'RC|w\p1,7l`CPp fyK0MnFTZY[k͢h?.B`O~<ϖ[N붍 Gm s<ڹ=g cqtQ fа %9)o}?'vpվD%r5so8jkp;55t:&k{Hf Q(ٵOvC(J5Ld+j]ƲuK(W\y8;vCI҅mm}!Xl s?{,^Cyts#33W w?kkݮ@@`\F1! $m}Xиa}( "S.m 22R1 KBPX_%cP Cͯg;fƗM2r 7sET*y^8w%ҠqZnΝ;̛9VZb4YpC[}}'CG'MQQJQ:{wC@ݵg-djZ4d0 Y;̑.FU.P\[cw@(G8 Ṿuh g gy<ѧ'CG:iY-nl?굪S^m{^b9i޲/:kpp!~Wi݂Ąh4hݜ n|yjԮc{19nz~s\Έ!^zG; !))Y۽+blc+mmm8fL&RSR9m?bu5DWF$||i1kԴ!^^^, к}+lArjv:s=m=yS l\zx 7_`[Y79ӤgЦq{{LTHDQ}vzK.ݝ2䫿븧g+fqQf,f+tunK 6?~X8{}919q"" M@?ǎUyCȫm*['n&ܤl2=}&.p#B^PP rxx8h0RMc]unŲ:RqȽ"Pp;׮W6΍7a;1,+h4_f7f\l^c?Pz'C^(.ǁ'Od0c^gyl{'IXB t5˱v%1smgrﹾ<;r2%衣?&0(j5biӡ +ŗ`rQ23j;så\oP7,)pGwNt{yضe_]Ƕ|TRC.RRRfuΝ9W^r?wv=6qU:;^Z/]<;TNuv2(4l&Il , 'DHtn'sצ˜(U ׬FlC9.?_?9۔ZzIIi:?lvj1Hv>'+`28y=u2`W ]\B!T*Q({1Ci!ˀ$IsXƵ6bmm͐WR,oEqdOW%)0;M^3[ s;0,ԡFc۔9T^hP#|Y7rg)F㥡}&O:5c6˗-yQ~|ƦCp#c)[U9?BDT @݆uX΍}s4jTؑ|wDDG奶\cZ5[cOaۖ팙0x9>.eʹ>Ɓ{9VXNg˗m➱p*ZCBP(<^Fӹ?6IbB6jbJiߒ)_L9xʑ#ƿ:>>?Xko~PE y|wcihX p^y'9<ڊi_OgԪS/ӸY2hƠ7?s  0}mJ 3_MW8~?߫;SZI/A3q#,!)~ma[A)Pf,Uc;y)}h[MZXaLbiӂf֔|$9'zZ4OHXCsLP ReKѻ[sy  o< fM{:__RRRUExqjfQ=URsV|:kS\<뛗íӶC\+UƢ}Ӹy\独YDtNSB\q|JЦCk˗M\9<Q,_-'#J"!( Ο@G[{rnʉFVZlX3fL޾[nR"miTb? !5z=jm!jv,X^m#bb{_N))ٱx.v{ vڅ?t___}k?ӛkֲ}ZhnB{]p/^INm 3]X0*T]{9v^n;|*6m@K2JY9ʑ\to?BlDDLJFPP1.S'NѸYCZ^i}s$x˱6/ls [uVj'˾[7 g?Ĩ #%@hti؛KWx흱i`Q^W vpgͯ2<l;.J"t|?TJ)e gLOKؑк@<[d玲mӏʮ=m=(TV{: Q1^ݱ=Zpm4wp=nX̟// d6q59GT*Y<{FkjKS-7on:hZ@& hު_~5ivztYYWp 2L1͚j1 LR%iҴ jUc&MS"+y n6}Rv_ƽ=q_g`!<=)*T^̩DFGЪ]KZnKנRhݾv2sO r݆v|4=d@;ħ|δy߹2vJً^˗0B:>~Cj f׶]loʖ+Í ֲ-uša"#x]ڻX#}).B VF bWeԬ]tމd2Ѭ%]뭥l2JKWϯ\αCQ^FZ )DUd˷<= }xvQ"4;jjL&=:_8>x {aF=?mt'dӃ)>>tљ3̞2S搕j)a%•r6BAi5 !%AϗJ\?8^Z/ ˟[̝UVJpp:TլY_?_z{:k]7GYZ~R& JРq}Cz*K-vR2>>ԬScԷ;mR%23Mee,[;EhHS{`Әt:=AԮW ??K<ۡhrXxfаtљg>$IhZ)3?ATҸy#bߪRDEޝscۖ5jJ.EUs^m}L_go=e.ӿANG`` uϷ:8s <;gΞo9JCG86|(Æuyݼdv~U0cT-\ūHINKEDd}@˶|Jwn~ߏGZ7߷Ңub3v*1obĠlr@// GekPUm^~1xȫ0 |wKxT8~JvXu1<ڹq^y-ߤrsԢ02ZiNsNN6n@pHfj5bޝӿ`0O1}4vpվCa_f%ٱ:^klΫW,Gf ٳc/h?P(hԴ!;ڼ)W@[ *QL GLA 8$Ma9R"FQ9& ykDyOO ﲟk{8ô1| F#+Y˦.ǍRa|Y_olmP'~$Ot6Cbg qOJ1LÈA g̛# o/Bgb2ҒLz3f 0:oT={\ʼn~m/ F13œed=2z*:Iϝd$$n:})w0p5RuHNHzuʕD,CEۉ[Oճu/ȹ'bϓDz'=Qwc Kp@0BVTn]'95+W"805SdY6&[ ɉ x|P ##97y4yqTZb˗.W8w5nȮyt: =hݶ U1̼8` mBZ5R2%r rty ϋ>3_Ljj>7\8۴lݒ];w3vxN:=(U$ڴ$"""WZ͚Ѷ\pq_+ :'~嫈"0(゙¢صs7'Q^7Oetэ' -oy罷iK>OXd9ف x~s 1M71wC9{?se'AZlA-0\I~H܉DD6^m.^bْ|ONe}ebm$vҘ1u&/8?NǏ~{EwJP -z"{E&((tH HU:6z)$l&n do923瞹srl޾gϞQF}6Dty'NH 䍟 ^^^V-@ x>uhK-8 |=uf&+W5뉌^+fU\Jqc={=™5c6":- Lǐaټi g/O>^< DGG(ԝ3s.m ))Y"}qLtґs=4 eʖF&?~ .̃)@ g00*5Ix{{ӼesݽY{.^ކ`__hzKSDq._ ՈP|D<<=X,Ho')蓔3 ؟GOpI>|D!=jժ*]kW(.^E?RA=~0KWr:]2d1glZnaVLƵh4<#*2"zK)qqqSx@  SN3h`ё /P9h7NqRv/_>ԭ# bqsOlL,vm߂_k׮JF ߰\;;;d2II8~R2] qy&|SOх/a׮t2q dЎ+?wXu$BkɴrIbbexޞeV:uhUC8ӺmkvnIINN!--NK<X,{e(V m@ c𒞫 UU\xbŋIԬ"CÿQȯ-wwYJjשť8s NN̪u+ƥ x" #L&o[З5+rc)[Z]Jop/Oĥ{@jUX{*_%QX1N?Ʌ qr *0t2{@pHe\\]ȗ/&͍${Ҕt܁۷a0=QFܽs?}@ /tE[dztؼq }9SOֽ&@ HU#gC{{{d 0G"8"c$I /7/,JadvHbB#,(J%Oq:KSëЫVI1Osy\QȻJU$" d@FRR`JV|r\u"@ob @FA"YsP`1=kC=*%#&q zVh=HNjB$bcb)Xٸ /Rby[Nx(UNUg*KΑ<g7Jsgy%틅7.3|hj׭*T}.^{\s^|zk䚮jpP GyO^7ߤzpATX:eV:dw`@>,ǸMm(T.Oy}nʤ,^$Oe:pcG~Oy%x9ΝK./~gj dE.m:8*=Wܾ.:'J?c']!O~-_ϘJ퉸|'OgYTX-M|Yǹ3$''s6.6Q\z'q2;jՃhѴgN'>>hNc7ϙSg(P~~~j5燻{q9uMZRL%7i@yTcP(K&-  qtiߕ=KJ֬ZK0Tlu[L`@k5̱*5 V:T.¦ Q(lٸ ʗv3uJjޗ(ɺq vo~g v:ˆéZw--5mNZfؠiv S:3t\\&>>ϩ?Ob2d2z:aFy… $$$РA˳}M:_ԟyQC]-BA`@qq>ԪZY3f[UGW<<=(UCG ƑʧcR>f=<&}T$0 ,gݺu+m۶E.h?~<.\͛7IĔ)S(R̝;%KPVZ/3vنL&hѢWܺ\nOeطgu֦Q)_n=\T<1["QDqZnmvK ɐˑV_bE)X ^^^&s-?o@_j֮I" ( x)Cǧ}06^h_J%"6&o=>>(_!GE53:|d^.ZSRR2VOfLmV2?Ւ'%:u u֭tMl2֮]Kxx840b׬Yòeؿ?[n/ٳhт>;CƏR4/(JV^Mٿ?{cxwS111 4!""wT/۶>uu_RtWҡrdO݈|ND/Q5':*UjQJ->xh'5"8(-Dg c $$$w3rO\U֯W#ϳnmLNgu¿K|QQ$>M$|RRRȟ?m{E:q򡤧++W_IJ/+׮ ۣ?e0iDLGtk&[>,gQvxʭs}`,\=TX?~\.g۴JRTIڴkͶ-?꯯G[n'7Yes5ۢsXX;hLʦ7RB.;yM ^˩ -[u-k/>>;weZ%鳦·`5f$sfͣ_ j5ڴ5_ᄑ٧^޺e 񤧧xr+ms=y#nJVptt 22͟<`̘1]vhtzlْݻwӤI~WVXaV5ҢE 6mDpp0eʔP! *uV}ٳ'{@:6@JJ V&x$UȝuWӣsoDh+_oXØ{T-r???gVR믦x"-\؏C1HdE߻>7o1jU:Qqp \Εrjԯq |)j}_7IIIrR2-Z5Ё޹h_N|gZ$I*#5_|ܾu*Ŋ<|sg?wkvYtǏ ::kWZ%GGG̜>wn8Px Əɓ'\z]7ٺx< lݹ9W9{wN[ua5E 6'uC29܎[lCŋ7Mo%==t2225KBnعs';vf͚:Xɮ.† ٵkObŘ0aF$ʖ-ŋX.]DٲeMuBRPeo~VoZnnnL=i 7obͼM΂uΉؘXnߺ͎wүWӘa6ɰɄq|7 ػg/'G;{Cn qqD\Ki7|l9vy͓ѹk}o[7o1_Md5T\AS:q/.hڒuf~ h؏Oƌϔ9^tiߍMZâE1kjUMfV*6"dsÂҸ^SU"E1j8 JjYb2c[#mޖ'=wl-iͧcƓ\헓:wWh,M4cwKg돿yq ۛNRbܿwW!/ɖ*s]\R]8_|\zMJnѶ}fL۷nsvM̦wpÝ{ypg5^ IDATF޹sk׮ѼyGrٳٷoQQQw7|oFdd$'OM)\01{(dɒ:t;wpi]؎;>.hnР,_ݵϜ9Æ y&,]e"ӧ?#7?3'O{y=ޞzR$i,]9| +OQ*D>pAoҽl GGG<93x>%%&mޖS}7j]ݻgg֨OXr׏ ؤ3XFZLoX 1]dd_~5gTTc>]7O.an={Y![cHwx{L OczB{e?.S,[eyv:?ʵ+l{p> / [ !4#L2Gy3VY3f̗S''/˅pc{ǟrЯ(J|| 0qD5~_ϿbO+)SN j?tkT&1{ḑl=6gϘBէ'Sysr*Κ5'Omo̟?ȑ#=z4ӧ3|(Y$'O 2a"##quu5+ɓ'tԉSNQD /^Jym۶姟~cƍ;v }=5j`޼y/~ҤI}͛#J"5įEFO~d[/R&Ɇ6{溽JR{tN.y7U,=-Z^g תUaÆѣ kȫDС_|Zz) J@ bJ!8wygϞ}iȯW!!!k?m@ ],UU6s~yxY@1ovpvr!U/P y$jӐ@ Y Qqqr%!%)Ijy{wr+ڊu@,oɕ܍U䀓F-0L&Anܞo+d}HMBCBBVT~eO EA@ @ @0@ =,@  䌌 =ѿR|J%@ xx%{)_{4TKH_!~*T{a|9+UѣW@  dBA`@6n SѴaVhZZjZBHXI}Զ ˅P=8}rGĽ{Ӛ|9+d2ŋCRq ;Ɠqa5Y@ fK2Q$5BJTT?[/>{RZ]*D [A'O㝷ߥrjWKRӘ8 B+Tf,\g\ @a@o~ُ}3ssw˓ZP6l8} II4y1O>eﱳL?vE.Z1ZEqgY»7>>(S.ܘ&%%[WtT42eK#ȟ?? @ 7 f/^93pt2 {7 2ˌS(wy )b\.ı?vB4JM"IOy]z)lFYt+[2kWhHJJ&*2R'?VQ @`.v2M})3Rȯ.!84rIعA|ݯ+d@(_ggg߻ϒeҭ }F]-s[. SQ=HOOӃӧsqquܾNm;BZZ:v2eu橭@ ,6{GEhP gʵl`YdԮ[]:3ȟ?UBx ,^rAL?qP2ؘX&Z%g:vO?F]f&Wݜ:c2^^z7nݼm1)عo!111``zIX0q,@![cHwx.>n!@ xޣpvry5@ ^W,@ ! d@ @a @ zY @ }P)9u1 sLWлBhע$IRPAq_B ^8iiܾy *^ 4@ g')_M3'aj嵨>/tKZFP\\@ y!K,$=jZF^,B*T!0 xQ$)O,q%*W JZ]/ooVYboJŲiT ?,1ZU0kl]W_L~T U6GZ5kM`@RR,BA`@qqa>$|(͛_gMܼqDžnۊޢf4k 5R=8*1a$'gQVUe+Ӱ>t _ȱ>xMZR=8>ҼIKBi\cF#0 =T*iڰi\)yR`0 ks,O Zl ҝ-iGJJ dۮ-ܹ}UWP2VsAJtdvv0]vʟ6y:Od"* Z? 0,{%Rp@ {mX6aK~=Sr*GctᎎQl:u5n ׇn=qm]oooԭMJ0a⧜:q$Ib=; ҭ{W@ߘ B*T18 RKQ@U#j.^^^[nQzUJU-5[9ӄŊO[b"Exlݒzd2rw(C!B;o!cggǾ=S6M"tѕN赉'>>(Ql~g˅e܄-V*"Z@ 5<Af W ޺e &O۸``J}qrr"6&bŋP(tnUV7a-@R1mtC@VӪMK(J222pttÝg95Y+JLLlO%Ƭ_? 66GGG7osd2.ȡ_u/7JD`@tѕcfDEEP((\A'ܻ ػ{/NfGv x^e.zuIxpI]ר3va͔ISFWbܾuy}N/P͘`9`{xpQd[ЗT*z@ ๖X i&;׷CV#!0MPŭlg4j6899!˹r9\NV͙4n\Att4/EXJ%JRgB|yC|D>d֌٤Q^ ӴY7Cq}}}Ш5HZ2yqXb:yZ%/ơkh՜C{~źCզ FZ%~5<}@ 0=<};twoQj:at[sLWYb U+WgЀ.] __\]]hѴ%/o/\NdLEhѤUe eVTT[7oQz *˴ r9UBxhڒgϳlՏȘ=ڶˉi޸#K/ˆQ4`U*Vc͊+VFwZNJ,1tΜMZâ (`4ה}Z[axxukԧV{{{~\kWӢIKt[<@ tE[dzsdh}Ԥwu׫r<@ K%UGw5r;; sO,@ !@ @0@ =,@ ! d@ @<'DRRL_A&aoo)ۿ[ uK@?DB܎|. tENNZ7{,=_ ?RD@&!^.G&.Tv8;솣#$+4t2#LtYv>p$m_HH$I20, |xNz7}=Pf$$2P_scIB.s3ʠǑcĠ`J5h!{>tE:r9. l@ xӑ$ J"#g'W+CRL>|4m 4C7LV&CuIن_Ԙ4zI`Rth) 4/73WGW$ta  GK3dIϨ̫oJ4̩̾}5[@T)q;%[`l \2n c` 6ꗕr>,͔MZo(R:KzZLo̞gQLJ3.u/SЬAeg@6+XY[-VyZ Y0/B᚛ak2ZRfnc&<_.uLפƾo$?Yzе0֭5=rg Kט,,}&M"#?k kFeƧ6 24#odpx6I22%.Il C g둾lPWȃ-'( H쉲FBf'3 7gi$6Lk`HfYcyca ˑ$ F}1{ECPc!0X/K7MG1d<7+嬟ݘK>#q:͌hK뙕Lc^Q;jq7coXk聵QGf>W:Fc46⍱dZ`tg,o/7eCH1ƹf5I#MchШUs? ̎JLӚ/GOkfَA੉~3 L?F1I:h|E6s/ rEѠѨzO $Q%vY1 -!&NF&aI'/KǼ I}Ӎ*A2+ry &i^X5qV5ː (q:c@6kTZl[Tĺ|y=WO<5ǺC jF%KiK2ufDc!v22Iq&< $6>˒4RoX;$4R I;G?_j h4UJcs,?OHz2mDPЯ~7Xh,FZΜQabYk۲Whf X*dɂJfa,W#`ge}Y=[zO8ނw5׹x¢c:gmbY6ngleumgqKrL0 01 4іǼ?Ǜdhu4ux5sc4 3׺^#6'Y{j3-o[dey&O34-3W^0!J.Z[+ <&2oMɓ'mў [~qv~gc񬉂.'CіHް>}{ܽ5zc0}, d3Uj&>@Zb:')10AQ=W}/hNEǶS-:OĜ ߼>޵5X6,m ^Q -acܼEۮlu!t~clEk{-U.bcJAbq>a>"%%#Fɟ?EI'Z/c'}||}Q#?A"VpssMBBusy3X<OzJbDڶo ['e+y N}dߺ ^|Y8)Ϟ7|Aevڒό2[l/ q})_FMfȰxxzoʤwGGZFN΍Jҩk';؝ IDATeiZt7?'[^`)ܾu+2udJ(I{]>Qx%I"%{ *Kx>vlG|t co%hbfNYŔW~v_.YOk7e(dtY!RN79#r ˵\++!p<|x_O#*zY5|3nܸܲa$e9onc-&zl.VR 囗efRRRزiyz5|0}Nyk!>maooCpqqF֠V۶lD#i:)I|1 "._FVQ3wPkT#+\.@*%JwUJa 2Ԛ2t$.ͶM[__mކƨzkcccYf<”i_qe:JRRrJ )hC'ڭXҎ 2ѳOw~=y2eJ3q$]ehrcA6si7}ٶixx1}27oBr!QZ]>0Wl?ӪY&ַ)wRZ] SSSUvY'K­ph:b1l!PVn݆JFVfZQVC6߄J ߶g~5vOpJż9 (V9PU&RP)YʇJ_F`ڶh_ ׬VJA!R+A.Q۫?JJ{S̔cjpJ:af&YFJ֫P\E?)*FO_w1 ܺ}['7Z5Xv9H8.} jsVBئ37ХMvT.Byߎnt7Aq}Μ:C&-P͛4hR\|cnݼɨ1qL9#>.ɓҧoRIT F# t +BB*ħcsE͉݀+W3Pv I|Ȩ1#9~8#?=[)Y$W"6b({Y3R)d8=~3p)ӏ[[W}2=qes]6D.hZcr׈$MxsDD\!.kDDFű1l$;·atݝYgTO8捛7#0~4ӧOOҭ3|$BBqvv6  &\Y\3SvMm`kYn rY!u-WL"5۶lO||}ضe+=z0x HJJfuxzyA&hڬ  xD\L2Ygfe]v;,n Inui-.Qc390F{͐$jgʵv&|<<կ'–HNNf˜Xb ٺi-$55PZ(MUrvvbO+2ךKtu2W@Zs >hq0h C,dk7͍Sg0s,~X&hQΚXvIUUa|8h8=zw]DEFag[i,yxzX,ӧLgȈ!\RzsYh,899#} v`{SXQ|8JŅ˳0FÜsZ:u/|Nެb$?,fToVvF||<ժWeUTڵ\jի$>@>~84lF` x޻g/ jMJ&sGnޢWTXw\U{P!C-p#MMif-YB3r/pin-s( *( {p λ>r}_}|7Kx tQIv!2CGG|,Þ=ؾ}%\x(>J.;9ؓMmm2ؾЊ!cNzмus kVEDoȿ}d݆uqswDmXg+ "lzC׎嗅Kضs:`/*VŋұMg K>O+ԬN0E=ٙ|GWgs/*aU©V_^ɼ25zuMg2 J '}{vz4݈D j7@>߰m6B+R1w H+@V͘4㼬BH6CIw7Jtn:<[E/Pr,]^/T굫l۶=\m۶۶ِmۭwl2(mV]O~`q? [7(CjZѱ,Z3 \a8Af{{{KPp:uJOOYNVE81_ Jf}$''l_*>..\8wVGHhU; tk׃ÇЩ[/ܵ}7uADvQj$Y.w Ql7!ˆfidddO?>~ _P;}8v?͞KDGHHHdU]K9vؘCk슻;3O?$(8|MWLH>DQِgO]{tn6t lcuF%vͻ SH e%Ol8&`I󒛛7ocrYQ""0(Ą88:،Ef?)XT[pqrvLiM* р_~x*e[3o|]=pvvIbcTe^tOrLI775 c&ҽWWdYFEE2%1!IEٔNZj(po`洙JeñOvVS^l@RՄI?wgggt<28::r-2y$&Hkg YH&2Y<{Vz_ qSGZ ~AhքZkX| ^˯Lxpj+y^|/::uk0tD~GAunnn |ẹSNwW*o뢢߰>]w`̸OiT1)))@ƍԵM( c'y&oV7_[QW܌ 6))uE4vڼyլW)nJE׬NNNAeşY;z;"K2]µ7,`!=?,&6!55JN-,_; e6vmߥ|c'(Ub]YfѤY*U5|ZUU6ԟ ]{)4c\M pqu%fm,ϟǷor8_tż}JM^P,wQٲi+!j0E$dcyf+8nYT3wN/kOt%Klgxe -\Brr2}aqS3edˬgʛJ~oaIWc umu+%Kвu K-%%%͛Mѵ#>W}^^8::%IӧĄnݼE*J(on8K.wY~ 0(Ih᧙_ןg5ԫ_4]Np4 >&MW,$Q*ZpCO&(q0[E$'жc|l8vʚe9yW"g=KhP4oj'%&(RhKW2uה(Y(9 rt$IDѼ(Wv`Wm|ӽ΋[D1٪mKZjؖ7/6fAE0 ["?Qξrnn.Huqtt`ŲlnK(~l4=bԻ1@$Y]|T^'gg͞OHqDV[kɂyX.VC&ށ\/Qr ϝoG2𕁤+AY\~D<[egg@fF_-Yș3g8y:|}}9{,φ퍇ik$K9޳sjV'jEJQҽ䣽i/{v3D_+*-ߏK/ݱn??_._\]ÿl^%6-- 'ggZ-/}c&ñYQd|9!ܵkdgg_??yf?bwz#ow2_I`CFvhCJJ χ@bbٷ{?7Rڻ4e2)ۓB#J".?\.u%J`zuk8r(ªھ;mڷ"j:jj yOA [hӡ5=ŋF^z#[ppt@oEOLJ)}2/5Xh92CHo~Q)fu՜?OO4oqrrⓏ>K.tZU(g3I_!qXy^֣thZ|-?ٌߴA¶5p(D/1!ܼywww}r?Ŵaxi`zI~>|L8)<R/{)Ȗd$cwٍ㾤RT\)_n=1˯Y+ gg~Iwm'ۼл{w{naoбs"dͪ(jdoh<OOO:tj3#}"jFbbR888͔~b#PWWW:Bvv6z[Ξ`}Go0_O8SgqХ=,X.Qy2|0=*G%9B7m{QB*>Kׁrq=W'g'~5gBo'oowz ^i&HL VAxI6XXltvHDӖMر5(GI׬NA^Czz:Aprq7d\@ٮS[b׭7E=Wf^ed&o&MzU+],֟+w2ׯ]ǯl9y_ْ+fѯNT"X/칳M{s9<(L8::ry =ѽg7:--۬Zン>˰8XӰ$_l_U\3U9I۰6 VW5kAk ԇ~)prvYf8v_RFUvdd SaP7n]_`z~r/YBѬ (WR荶mј+c'a1uAIiJ6M<|?9[3Kd@׸e}QayٵQn8?/X ϰg Y0! *]_+bi1nXpO"/û szQڍj ǃac6iܘ $&$Ѭ _rߞ}LkΝ=35jΟ;ϧp1J(C`k/szmzHffW 222x|)SXX YYY{-x8#6;\ddffp=RɝRk7a RXt '&U LO,Z(33Wppr,֏غq;ZGйG<; |jAxҲ(RA..*d>6S*wCMi޺)P8V܉mc.]ILȮɚTX=Nu)XCn֮)vIvM_X\,2OR S@'ݨhԴ!6i&89;PT"$K+8982|P]{l0F,=9VөyZtӬm3>@&ɏgŒFљl}6m^_^-_YEgGǻ\10ңcUA~ 0R\qrtdȡ89-t,FzRTTTTTFٕW9gLp҃ͱ <%{.N%qw@eMS IDATePzA&ob5Ԙ厷B6XLWiXl;' e?MmYsdA_,]5dIFZ'~jNlMn w+9%$4hxUYEEEEE)AputE!ˣ~ZY6+XjZUfN6 ҰU+ 2%#d_[ķpqpA$rT>%{N9R E-ZcYKEW֘X˲ar,me,d-cUA~JTDCNkzdRQQQyȲ(Iht'ɹ~uysJ #ˠ1*ÖA+kmZ16SP "o>@GB;[T%Qﯬ4)lX2Ʉ2$[̙oяcUA~ $u.sWxĿL~^eY#TTTTTI1mJ4DX+²ҢA$IV-<ˊИ٠SwY }Rs=.,csYUܲf1)Ŧ8IN+>sޔ&ɒƠ`+2bl$@.}XU9z[78s_Uϓ]rO)IwIEEEX I( [v0Fkd4A}-zը4 6 ?--]6LqXY$S1]HhdXٕe"N,\j7鼹vwxQ2cR%9W|/ R sQ F<+QB'ݝ8wﲪ$ Q<_2ј"+NJҡрuY9ҚgUbyFiX%Eɶ%5 J%ؠTH?īǬ*I 勏;ox`]M`#[4)12>({tsV̑Iw[P&7Udb(ܸq㱴%",  " hgr(!3d,/FXV2-]lKDS4A0] #&j}=L4徫Ξ9GT 5ӭcwVG=6w'/Nd社$-fDCX6MPRytDQB0Z >›EE$I3Y5uXDZm~*T}NiIDDDYB AeQ2ʒ-%S~cyh" ʹTbcSr(1빕j8^IWA`ܘZ 7ܲds8?(q vܟ+ Yͱ(Ɋ( ɈDLK%&&CYʹTcއ1Ǫszx6v;E***ŃL2h/6һoo>Iw,KaW._>ӱټs#LŒm61fMXf[4E6Ÿ2fܧc%iSt5 Q4iژoC(- z e@Q4XEٔgx{{+Rwصc7?蕼7_~bޭ0W)/VOi^v-K&kXztŋ ӜIJ~K , /96α7+3ZEfѢI+֠y9U9r(̧cNy.[6[wrAw cwQSE***ww||}ӷ7+Wp1kLJ5ѹg=@^O1䍡͔Ԯ^F>f/f],Zv r-Z4i_~nX=«7nWIæ{#V:~XX(:{1\}J+YAџwSң ޾e@E֬GVHDÌeko[֏!+?~h=zQ0[%l$Vz*1?wwrycHMK3b߅נ.a5k\.UZI*#>`׎]nچ:RR [ @^ސj5xW?EMt+Aҥyt܁'NsNڶh;tWb\x{ӮeT]V YeKqq|>q 7̷ yOz /PBG:(徫O=s^ð3P uJ,ɤ2i*?+aDbٔtscS'OEp;#-ӪMKrsx!,YxoɰwQV5a))7޸-ްٺ{ cM KrEuJU*իI97o2OILHsX=9{͛ >Ùr-)+WOK*?#?>xbFGVG<ψw'44{j>wO4l+ cKڵ6>`4F""+Qt)~_; x[lUkٹ};w٧:hZw߀tޅ+ǂdIh4%_r!U֎'VUGG2OaoQJ!+3FunڛRf JRByӯΞc}kcx՗ NH i遗Aח :ty64 ZV,ˬFPƧ }QKdޅ"WRwGѤ~S8pXΞ=GHh~dXddOQI::;Izm롓-¹ $"c,/;VIEV-ӉYCDf03R 3PbggǺh7O]b̸OٺebE 88?ёݻ(i|ѸAii=~iuZ:Յ . W,IdԲ,ۜ ?Yxs\l=v̳^vԞ7)۷ 0U*ɛ5ڽ+vd(A|c>֭~zJ~:ћֲ:z%ʗcͪ(/Ys9grLɤ/&3{,vśC`7/eR,oQJɑ51Y>E~#-5qѹf[G'[t5 ?noiմ 5_?599lzuMaTFJM_7o!g'>_`ky`v \(ͽ$^^puqG(ۆ-DxxSdIn[y+;Xn'2.>ȅ`-db.ſ/aޜ6'\{y{Hf7SNѴR4GGG:`ookyPV͚gt?w%\ڢPRhׇ:t՝Ç0tٍdFJ%Kpt]5c's_@%j1:?}㧏r h)P0n޼+h"QJzVVH`pg==s*Ϳ iYY\Aem*3"HV [PXY=w^0reZ5/kE+J.]hZul_q3$&&*dnJ))7s+}A%=W)[Yp1M7A%uj˚k?lݼGNв] CZ̛=+0營*3X8{܅"6:ݻp>?(ټi 4;w`Yŋ0v"MGԷ-\|yss55nq N8Ŵ\.ت3gp)=/R9tix{{AZyddd$"5v^u4q29MJ/0̘>jפl@3&|/tFqDc~Ri `Kuxs`d7}^釃(iv N-#jDQNݍw^3Ǎ Qy\NjȘZ>L2229laNL1 c'b%7776`ć!?֬ZCV-T5SfM4+V-_Wחȟ"ecwww3g~ޅTk xq ..̌pQ\\iٺ%-Z5WILȲlIy~[l%L5˔sҾ+'%v8ZwbhުSe\o;8+oQZd9/Hr\|5SPR(Ξgwh]232g|6Zs;+K Z^wrR~x3꒙񤻢R zNN@d(N;WV*]_0A6OYYzEljT?wX|8#6;\|-Ӿʷ`ܘ \v2eй)޳+M>ۻŬG76ѹK'йkgfύd_3id]+n@`@iѫ;7ݷGN`PW,[?)Uџ}'oO~'7$eQϱ sLFmhXLO%ߍUTTTT F3l4|{)|-(FSM鏐 KrUpvt!9nxsB.&^ˣ (ܹt,FzRTTTTTN _oBzӹ8K =OK****pgGW|JU ,#J:=,`e) Y;6(vFEӤ$Y4eeri|eOnYk@co{JPhMVʰg4is?uYXƧ.[TaK%|U#7^!=<kݣ*OZ;J@{RX$ A ]^eXFAi՘ ̑,5h@Y.mgd 'ɒ\;RnI=CΥlZ73¼W)[N"YXup#Fe9 O˖,{ܳ]|Y"## @RR_****O<IOO'55e]Errr *?w Ks{pcG$$I4Q#9I$S#JzDI@ y%dc94c%I#z$B-J`'Jzjچ+Sbaߐ}l\Wf3mmT^/Ҽ`~cc1Lx:B7%M+VУG<SÆ cĉVijbǎwUOdd$*TٙP~g%mܸqxxxPlY.]PR<)59e8I(IdBDxX IDATr*Q2XX%?/"H"dE%]P6ZEA (Me$eɪNõ9]0iZZvM\uZY%tS[iƬbbcs+-~IyILv*UU8Jtz?}ڵkeUW8}64~=գ_sCZm}},g[sw1x$}ߖzÇ3b~w9wnnn^3ge.]D߾}_>u,***Y"KcYӱT|*H,!\ >vwf]DɒxzzV/}{p%Пj5ީN74}Bk0Q:x+S|e.^@fF&vUVw}ovEk8~!+Ѩ?J*!ըX2˖,W[b]tA"IG???-[e/ʖ-={6 6T?~RJ)e`ph4(eZjFK5JI8p /tޝrѢE ֭ o믿Nxx8]vS*** ?<9FzQ&=:̿gsԩQ222rѱD4lFuJ|A϶RRM>׌-* {UjѰv#Nfc?$I{#V:/ XXF^`5*yv#D%$(",ӏxncjȴ)$'NҥCwj@Xpi~I4}(I%!l56[zI0[<-/XX5Ftt ϝg?wRܿ"b^7Oq_*KV0\fF`:7(k.~=lH6-cǾm sO *!"o>իG4m۷Aoic޿w? `۞1s N9App;ِCÐaCXq-vvZ>`4sgߟ]w߬Oԙ|6ϝ{ܹs_?Rb.\ܹsٸq#+V?ôoߞtlB֭8ѣ\xQ۰az Э[76nܨܹ֭[ӨQ#^<]ztcD^ЇϖJ4j҈=Z[y#XZv$",ݽ}BBef (>?# Lr S&>HIW8t0Ȳ^Sf5kդWit:í9O|||k0;_Imv7*~/ѻ_ozoK?u5>>ʊ텣#WxsҮeڴkͧc?)}[+VбcGd|\\~!#G `[Xn-[d۶m̟?fw ۷gҥဓUb 8p '66ҥK+l0}m<]{ՄI?wgggtURJ)۴%]MKgk5I!_Mdg ";wPmټ << ;G%''M7<LyMydJިL3"2(KbB"("K)ݝ4$Q$1*Ni36x =g;lWd-Ȗۃٷg,g>?}g3r1}&nܿ-6xwJ/>ʰW\4.]ƿzkw];v_֟r <<=R^\|YtlǰaK,gϜcά@/}j{t] ٳ6̙3"++N5|JӧQQQY (i؊:t(cڵݛ'edY&44͟N8AhhqX=F8=q؟̈6:4!9l+uݳ51>j״(V,xxx鈊]Ξyfz[ gE 9iѦ9eYh9 $S˗(.c ؠDd$E!/]<Vv PXdW\DA>zkcxgϜcْe+_FC.i\I]m?fZ$m8ň#ZOw2|.cRSif@Μ9JeCFڴ+:vY*/1aD6ӓOõk8:9Q6,iiF̺X.w쫛brN>Mv픸_~iӦ~zvҷo_koN||<{Q!,, ???> o*T`\p})qk֬ҥK;v 7o}`,^gr)~'BCCh4 89sp!VZŞ={r****Q-AιA;tjρ}"IL4=lS9z=z>⎎̌waQoǿpbN`޻Fc[-IL4?5k;vQ. QbyKdwvvvxoݙ[Yf= 歚3kkoZR@6)= M.1n8!$iƦtnfiަ0###OǢyO`بwk/дiSk֭ :1b#((.]I%8{,666 8'ҩSLݻ7{ӓbŊ3ewi۶-?3gͺ4Yh7n@TRZ56o @ӦMhРg͚5899^ !;>7ufMs077|lq-+3o|Κ95k%=߶l݂S'NѲq+T*(P@dOhҼ SOfԙti!FFFԩW[badҩSMRș.;w.j4 09FL$11vҩ[vIu&ܬuSBCØ^2.:#D>ySfp_/b~BWjԨ~J7:+ŋDFFҡCNJVH]gTEbc/,[C`HffhMg,عe7׮\ǹPA=Ǔv]kт6)Ds6SɁ{035ݯh7!O>ŋo,'שSO2rH õ,U "; 7ıS[F -ɿ6}7cnQ &...??%Y!YIO4K5q̨]&AgҦR]jZYafjNLK@?BwEDanfaeBM)9!A? Gx E %EbmeEU}Σ8:VoF4sDO =fL6SX&9; J%ƖXZ{y$!xLMLqu܊8՛K3"7075'^̴b0{LGj-49###LJ %ֹz!Ŀ]ҔVwRҚg(L|VAR`렷$@ТEVRgܶB!.RI~sk!"*v֎(&9>^d!Bl0VM[ۿu6~<6(YN];޴_~Inlٴ:bbwZQMXYXQpq19jW###&G)/KzRjF ;w jc^rt][~{WΞ9˝w McM)O 4k؂ZceWthӉ[>3\giooʜsym:ex-M>!۔cˇ3Z4aCj׬Z:]ŊҨILWmj`ۖ_xN|ؽ+ iSkW[Q(#רNBBB&V(0gI/D q(ZrMʗdPwf|6S/O||<.ߗ-?߈oe_9q8۷3,^ݼţiѪ̛=GQx1]ÿYYӵ+={0*"+=dִ|ԻAu\qm2-co@ëTy} Iߨ 1|?[7ms.lش/oL۩RВs{Gs s:v7̩188kW<~*jʄ.]& Цy;ze_JhhA{ײjJʖ-ýXշtnߕmbT*{H8vYއO>bu !?_^'¯p̘' Ĺ8wkk~)'g֟ܗ֔Si 5f+^4QkCZթנnzرuޥ+];ȈuV=1NZ9 0 H2 DCC8v8ggg&_FTZOoO~=pH˗;sf-piow|:38uwy~2>|رQQQ9*Ңq+~?{kym׻ <+ň1Q,ǏӣKOСuGn\t=)WA7J)NQ:<{̠> T2ٖ+],5vxy{1m֗4iژypjUO tl;~.uA7b,˦Ȯ3{ݹKv]B%ʺc 8yAL?ʾtօN`jj333[ɋt֙®)Cג?~V7R@qpL׽m^^gtmUvvvC8wt茍/`K!}/[|wnۊnũ^:M'8f$&&ҭsWgio:(EY7wnޖjR٧*/:QʋؘVKJ5~ -b/̃mIfcfLMTTQQQ̘2 0&!L|A}wǏ`wli;v[ŗRX jʵܲu <qݣϞ>矰bB:=}ƐC4d ObꌤQ93C{#F~>*ݨ}Hp0QQQ9Ϳl$yF'CV3d'xz{r>h%Q铧Y;8D㦍ZkV:XL6~Ӎسk/kTc8QV5f.R255PB-W fs1"_Dr53~4EaАXYYqIݱET ;;; iJRB*u௴Mg4Z6/5# V|n%pptr} B]cvעŊbbMLL$,1ŀUZUpe|}Z qpO~t܃۷nZ*\ SYڛF?~f̝ZSOJиZĕq8rJ@m;ӿ7ΧÆ},[~]WgNnj513uLk IDATfhTc=qVXZY2z(cHT%&&ڠV)nߺ]4lM7[ܻ{ϰcWoV*w!">BɑOڢT*}`'Wo_Nv5>h #..< $1tOabba߅G<7#BGʫ~Mk˦T⋙FOCuY *o<2+h(uZ&*2*O1=L=% "**c-;a4ܹeجoZRKHH`׎ԪSˠ>!됫3סJ*W9 htZt_L}IdSԨYhN:Ýw[N2 *xT&,<(UE4)OCF*(BBQ٠:J% sn:Su`ԘڿCqoP˥KshҬ1/^`etI5u[6-ڱG3Y.!EV9s,[6mٳ._By̚>;~rڍ y1sf̡ZjSG''YOq "#S/})Zsg_V֍{3(D`3b"3-\ 2μhq =1fhjhIO˱/R~~~\v;"2Ӳie֏R!m?޾u;;LJMcZ+UoE~m"_Dv:c֬ZBHKf䵄)N{T(ݯw0>!N̓A㦍w0Gѣ\p8Iamc5'|شwjϚkq&˖.}@O@BUVb<6->Zf0vRmAF<~ĠRPT^2.:*xVb͆T|*`ُ[7G 髸Þ]{ ɑmZ2z<~'pJ)Ŭyt'>>r8) V:B`,ŋ1kE++f!GCT Jѭg7cܥUl3}+p""6KN?ɬ⏹9+jJm_d2YH_:C$F zXԪi;O7yN8a?.cF[q>D*£BF+ K L]&Qi]8U2c?f}!ȭ83SBd,Y{GKo2u{}z󷾯_d?_Gj^B u-ʹoV>˔림5cFGs^7E!DK ާ섀.ʈBO~-BN='B!D^Y!BT$@B!"ABbbc|nxLMͰoys !ě$2%!aAp-U+㥕Q_iI*gqFSK>,) /Lc3kcʽH_kM{-Z6㍲iFɰDDs{'7!x]$@B""(^uW+Mi|j"@42gϺYK{l6׬I?Y]蒳=Jii[/sqi oBwRL\,VmPk郯K]Еׯ@UQ/ڔ 2ͨ.6,XL|flf/2;.0֤M&˦di?hSȤ´?jɝLB7Gd!;I8Q)i#h(Oi,#i6 ]Йa-qivC![ =f%)M;2l0mr-L"t!x$@B4Z DJ7ipndgw\~iS0 g6t#mФݞp9O$z\f'w.wY!& $F{līհ`+mp}#TԛSnT(:\,9|r`֐@9m\x\[? ?M*ĔEJi@>BMd!;IQNy8'HH;2qqf "%{!GT4ԈLfoN'-fXd󰠡yr{u!x$@BfTȼD36X̹v:037/nt7y{R-2+iݺkN|H>FISٷg?]{wPxLgIGJyìYnȴ7˙XZY2aza,[;~XYYQvM,BhjWǃg23<߂%i۾A>Ʒ/DSWN=m;9}4YV 66hSU&.ݦrBBr;\=wMըJu^ތjd!D^z)!#)~%'&-ƧRy:uoOᣴl҆jj2qd^ƐQvzTGJ3:Fͅ/^ ^ܻ .ulۙ7oVq-:JUʍ7h4|^$$&J">!s鈡Л%Qƽ,]w!!QEB :M?ofԘqoԉ;ޡ--P`PPSMHT%V-h\)|Z:_/&-*];˕n$UE3zXTN&8}, jnݢsT)_>ոyqe;%,Ja_Pɻ2eź%O׻*}kq$jK}R:}zS]珞BOd!;IՠdJ 4ɣAAA?zs s45>d 9[vnly aaa,Ӈ7.P<_kB-V}GPxQ/XFٳgޭl3Ejq? ܾMpp۶JW/_4oLپu;:K $fDjA7}}<{h ڕׅrsެ}Vc:;v+Ѩ?_秵?q]>d߼>$$3lp|N\ 0gLYcBId!;)E.C[FpUFïSf5j׫sA:vP((J{9&GƌFe~+vLH!B+hS5B/ GP`mk7kj֩2 6񓄄VN Zmj?P$TVj5r`Sj5d舡;}h[7ogz΢nŰo|*ٳk/# ǭE+׉`һG;s.~Y,yAr$F:Rrre|>ӃJˣժ o'Q&[L)-LYt>_/\GR^Z/}%Ⴧ4Qժu#jѢE~jZMxX(vj8Ĩq#jT䃍5ӇRFsKjAJR `ggKdTdҾ4 '!>]{jJeLSwbb"}͑_FiƄKz"uj"̟id !DYNҤJГ*^&e]6Ӱ̜?]PZCUiz˘9t DW6i&zvC\tIcV'I+T*Q%xXXs`t9sg~'<,y3`b^Fރ.^hѦ9-j>PGSuiieeRdö+^4MΧδu0 [bgoǰ!#h5XY[P(K++vvpg|֨5N"9B )BwRʬ^y\Ow{Ѫiش'?BCCʥ˼|MIO 6>Bܿw7nwǏ/"P'&Ѩեtht#*̟?W._g0b~,]7lܾu_F۠6~YǺ-Ye5Lʥ:6M^r{M֤k_զڗii[]??yfיD%!!xH=HKX<+nߺӧOy1>c>xWK"H,x'ixpKI ޴ -;x,E]>K~\-0ܿF3l)VV(]f2 21r6Ƶgc)^.󌛶jJ~to3'eL]3jvnEl0Ξ:OD N?E(X@Y&E#rdy/")ZjV/v7[|4n{vL3m4RKѭG4ՌbkgZaa8rfPO٩7';1 [mS'f2, Fv}W!g^7CwӠzn? &%N\r&&iRCzB ❔z:7%!D^YNJYP#é VryBd!;IaڤBm !IZAh"H,x'"/,K/_.!YN*Z©K kczDEy!Bw ˽w户ޑ!x$@B\ T(!?FB!" B!HEd!B!RY!BT$@B!" _ФA3*xTusB!DkV;[u@Y(Μs6teٰ'[DY7wVX(ԉ_;Y6R*tb-Vg%ʺ]v-۳~:n\CBtlә#ɪ iwuslfٳFKxx8?h@res]B!z ԧ';lߺ*իaO8tI`{næ6<(ۓ>|Nhh(˔ښW2eTZ-vJXX1xz{bkcÅ , tғ8ɟ??n"8887ٳjr]勗PTu=B!" + Ϟ1K.aԙT*OG ';$** `~޺e?~ #؏UW=󉋋cȧ9u;?OӦ],ϷfڤJTcy^?NY7w}ӧжE{*yU< KW^W]HttR]ϡ;Mg49SPTmٴ>\>VˣGk*ӶE{Ο=o=B!Ld>tޕPN8EZiѪnDxn%ܰdOF} Qbbbq&˰LBBqqanag>[]k׮#*WLEٽs7a^өkG<<?A=1}B!RӭڴdㆤED5QQQ{SVu6w.sfdr#?>߳vZ]ݨqC"#h48;;P* T&Oe~jVͥ u!M7`9T*&95/ vK#ѫv`mN `/Q'{.mƵlXB)RGGߛL0'кm\]B!0\YV3gFyFFF|k7mQXYYѩK'~^ c&aeeEY` QQZj=  *wKKKJ)E.Qw &112?[ ؘȨL=Oilz qmƏ  ..'OIL ׬\˚ku۟>7B!"EVkn ssslʂ=o.oܸ~n=annF0]uLҴmў;`ggۿElB+++ʔ-Ýwe T*bcb6FFFh&]9/^Dtv`بϩ\WdܾuǠs,Wys :L>g6oB^=te+ju !B 00g˗}vzI½oѵ[xԳ/Ǝ_Li|ؙ?mb7˙8uB>s~˖.gM8:9ğ{0j\tS}kNܙWxXO>B|ؼq ςѰqCr*V@ll,Ϟ>XqT .. yar\\r|&&9wؑTȾ=Yf] SlzG`dlSgAbkY׮^sT!B!,Uҫ^?,B!"&x IDAT%N\B!"5 B!H%ws !oJ"Q&y!n2BR-%Dd!X^,ȟ(Y=]fgeG!'W\ cld2UB!J"E(~U< uDŸseMSо **$k%B\#m9_jَ2YnzOs>>Qp":FmkS'~ Y6KBP÷{vkx-~;wR*eBv]!Seܩ^&}{?W,{mW>ӈHw trF%ʨߘLL0sQ>iB2nl$ֿx_Ԅq✛vJDD~ }u6Ǝ 8(P6nبwO~&,,,#../؇ c&H*T~g_[.z}2q*?ᣆ̞7bŋZ5j jucZ]tGs]0aD>{мQKʻWa$&&VWeYrT*7Żlymuy^]R[[["""XjK.ʊf͚쌱1VVV8:&}[uuVXiٲ%κUVѨQ#J,I^{e=A܏ m"'eGeTG˗gggJ)MGkmm[ 7LJܻ2{{{jծIŘ8e<Μ',,L|Z1j :a@Ruj">i/w^lX^ѷo, >@NHHZwH155uϝ9Gx-Ϣ>{^^E:"/]nXBȈRvM>h؀B a>uFWG{֡P:;;;zILL AA\|`NkWP(ٹ>zQLi*T,Ou9{lQzEFFӺֆyğ{~a)L?kWN|0 4Lr*׳XyƳ(_͜s>(M2$G'GLMM  HW`ˆsmjtuDEExWؗU[Mm)V/^DbeeI& 3c7n!<<g}DGEe{cѻ{V_C*0wllmf߰!$8$booOLLL_}ro Z-e˕5AL? ]4ZJE ,.O= y`"4;.7K7ˈ˃W,CPs.~ڲ%KPd ڴkm;NZ#~W|OMXVZř3g;;;Áի˗f͚ܸqv1gBBBhԨ˗gϞcW^ɓ'_ɬτyHɑ®,cdd[} כ{tK<|@u# )lmmQ*>nYw%x{{1vr4VoX$f( t)3>jƘm;;;̠!=}߯\gfnܧR sg9 ZSMMuP%th֢)YYkN~cc#UT#AAA$&&O#݈"={PpuuՕs-ʅ.F#= ^^W377Cܹ͛7SfMT*ŊtuΝ;?~<Ǐ@d)9xH/e_D $8DJ;mZZj5Z$'->>gwN⃆ B7P(4o՜YwǏ@_ԪZGe/Y:} Vק T88:baaN-ֹvvY0HJ=!ѥh*_Lu9v| _F!6&3ss;~ZD䄄h{ q˗ACx3녴jےiSfмa F|:We{\F?i-}vn%XbYu3ܿ:|:O].5*פ3ff(JV7ТQKzw{عtd4ׄI'< /x{i۾ f;z=Ҿc g\WW&'>>>z=ʃضm]ta\pk׮qFڷO1c |'A+Uҫ^5ße9K k OBqVeАS0cL=-A6-E"6K]vh"6s>ݓq1< zD"^8?tleeѣGZnƍ?~<1vXۿd/^Ltt4&MMVT)e???J*Oo+)_ڗnXLK܃yd!uyC@ʸz Żx(x/eXW!;A>+yg !x'Ȫl>g}%BΪjub^7G. !R S Byx/D151 Ks+TYW ĿB!򜑑& %JK W{wVENX$@B;*Ϲ F$*Q QgoQŎE슊b8HH%ܳǩ&9$9g^=뮽oάά˞ BK"9Ȃ  C   F  PvK0$gOAaյՔ(esF+~8ں&׺UZjCbB߰AA_@rBu(u+SЗ17ng~&ĸb[-  (B!ѧ*hhoFinCyEI"AAYbgYiY-6f ZU#Xd9FHH,  @n@˺&&T&J?^6MZ^AARUv}#‚3`PZ;*A>=z`{S ]VQ`LJKKm3AA_g/O} bZ;ޘJh:ysli?}x ?8~O?Ĩs._\0r EEQWWqÎG_z>7&!ݣ=M9&JDvٲe,]I&/ia^z%.bǩʐ!CvE"=/"7A>봳{y-v<:}17C&7p @f:`Er:? ɬϹlڸ FG_ 9VAcv(/჎p¯r±'ѻ[!'{J54  Bc4)0 4fGI_Jyܳ3)߅,[ѹJiߡC+?9VqЧ7}!=3?E'%?`<6o&3_iSXlirEңGw}sАs}1co@?umOk[n{>Î佹X)?v}gvw~m6DX(m b-vυXmt*#ppEq٣ܒy7oIPأ/=QZZdgg6ǎύeÆ =HO{z, MjhSOL"55gFqWb ]fϪ~u O\\ddfſ>ktBrJ _,@`!}zC?O>!h{AXt)iiidddkdKr'7:@ m0ýohcƎ;fM 5/p<;7^Dqq1P(L$}\֯[]N0٧Xd)K0Úc>%]k/yr '8-p%W 8ss&.#giOyޣexl,̚m7"))K9'w29\~e&0x(11srs93xy>lY8>}:Çgĉ]/5ĸn˚_|̾]ӵC&WL̺_2AA"`Fؘ6$emt#b{jZc!ǂ  ̈́++*Z|aoάkY)  :V,E^  5մm}VEś6AAu]o}V` ^}ذe=;*[ (7&   J+jjQ [ӫ` ''2`-[HǜhՁ6  KRS[MQ&6lYπރIO|2Ӳ8,_/TEAA_ZŶ}V(4IDATG?Q͉${p(    NUMM%umRHKh]26QQYB$M&7=idAA*Jʋ)hߕz5ݐKk]w^>:=O ®9C40׭ݶ9ٿ{.rHfZ ErYy׬$c zZFk 5/?wwCwo_Іw_s>0= >`eg:{=àU?[A@  rs;Rve,K:PҞXTJc0k`V8{h#2 )OіdAA5;iLK8QG@ XM`OPkl8Q]O yc]9mx)n&"m֜{:x(=җC\_@AYQZt"~ xƓZk _ֹ n{'6qsݨViHٟ#l#\ɏvv(ViMn5a^V<[FFvR!0 w8oLo|7-ðE;]$ d֟KnwMW޷ioM64dAAR` ['S-"7NpXѾHjm 3Z /u7]"a,fCS[[os5N9O^ _FS,vE"8~yt+#Z;I{p'։k6WV\?Z: NCdy>vj<wfFMslu.YAfE):_p#: .rrx]e峆 WmXXM goSJŘP]S[sR/@<>U/J1T;h-݈a#VZeMݵkmR8POHcmjZoqx #rҸ_69G N3oo|f, B3|-B F%Ey%J6I>n-mr[ p0h k)Nn"aףhx'e Đ iUpEdFS,/#Рy{pⴐ/D Z`\r^xE+J6-cGѵ[׎+W3ܱ<2m2@kg\wWSi)#[EciB0@/#1"AAhf 3D%D^Z8QFҭ{7 .ZLee% DSѼ\goZXr4vտj|21mleE7#rsF})^a1 g Sk*ᤅ_/VZq9ӱSJΜ.ơby2C&OȪVs[,i%'kp_\۹r%˛VZ  ͏ 4em;uˍR9s琕vqˆ3M3Gzm$$$pʟF0qj eLӤS~'9hwm%۸{/QJѳWOf4@5k|RSS9vZ0MKJQgַߚWI2o p cMQ3nIO`HNMv'̤[/Oȴ#;&ꕫyxڃvTu5#2{Y' /lXy왂y:/Z̸]F*ڮ[.񤤤rJw2ٹٌu.ob_o^͍ndddsIRR"M@jZ*J 1#/䠾LyQJr][otmRD" @cݥX쩯M-kú ,_˯ɉh(qLlƫopT*n/_xi6)Q°KiZYy"AAhVE? z6* :_ƒ zB{gw5ypzbǧ?3N՗^/ 3+T_{43y[h3~o~J= "=ݨDe(kPУPyAݚ#T>JUUO0L71n%MP  ͊yE P/ w2 ֯7 SXG>Ӥg{SӒIMMMtZ@Ffzq~Xr4̳KiB;<U6F! Ѧ2oQKئj1rܿ/_}y wLrrg"@@  ͋pl_rb;thVsHCٴk/c^Fll,SvJ9kî:LSk*;jݚ:uGwM\;wVYsW:{Nnk'nt`շWVZ/+y:bji[v Gs?q<ˆ$7[AYpR,b{wtOAμ0%ˢqjvp`tхL4mTg-R(mҥ[g~q %%%/֙MhӦgdSz;eEVBQBБמvW氽t{صZW_͂/'ƓSӹk111̜>[Š+)VָhoG4Jqʙ5wg῾a췩G6q_wox筹|{L#.>O>}mu濻*6=uK׌ 4j쵼f">x#]z?Zõ㯢M|V^Vy4|{ ?$YAffO5{KOŒyql/N\\:wLnddrۘ9y>1iyP{zen qL {`*Mz]БÇ !==<´Ǧ}R,."kngłpҩ'| i_ܼzxy̙KYi ۛq\C.n]lw1VvFV;ux'>?/8E(gxO꓆Ң r`޿8Xc 海_W^{[XqvE\|9I AAyQJ>`/ll4Mg;V"AAhVRUwX)!X(ӌR?Oh*X@AYqvͶh2ob7 7."AAhVEzAn +{SAR,AAeHOIbII-;KpgggfQj$Ivf!D мt؅KM6$&p[vVٺu3 j́{W!D޲sg-rX;Ȃ  4/9{ ?[͆msgHmy:dXVuY 2:dwV_(AAA\V|9cIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config6.png0000664000175000017500000007631213203343610022252 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|e4eʦ!e2eNąިSp0(DN&6ML[hW͍. WlB!ߢ8cBY8!>9U?[gw=gX:unRu)UΩųGu j(_˺jUjjK{nVIE됍j>˻z_S$|\uX]˺,_j]:殴VHV WunU>tyl^=qB"SXe5VgZRCϮX&bBJJQv0 VSB!Bvrr: 8;aaB!\~b(PߏB!8(j!B!.77&B!ĿQRRB͎á*:^р_r/ 7h:U%?͎(s<7PF#idS !B 6"ƷNOZkXA1sr6h~e@R_-8\ bE! ɄWl6;vo2b6Ի^r :oGQQͿ] B!f#Ψ㹳 l؎Wl?/u_ ī+baXHD@@F??jbZ"2*S{';GDrݷa4:FM؋,[J#0㜗Wݡ:FsP:Ab̽Nr'ȵso 2"PPU(.`-pt zА 2r\W{O݁^',Lnn+6AAfsС}[TM##3PםսB!QRb>m0fcW_0 h~D@c޼!l6 6.Wl\iQEVfh`Ͽ7  ""@_`a҄1Pظ V}`?yyE66M $،iصW갡i< /w^wBQq Ǐ%_"#/(a=<~7Kh׶5qQnANhko㑃ꎊ Wu:!BgDVqҋJ,Zn_Nf Gq>q0FśٜmïWZz?q !Bl6! P6Y<nObD ĶlNs{agGXFUyáb41tڙ]AA v6YgX W̅itYt؞{/F7+tN!7/ =vueL6(JJJHNNAǒח1$Ǒs<rJ,Sd!BzͲ) =Kұed:8y瞅)o4{QiA?̴պߣ H+@ZnCqqv?rvNѣ),,wGfs`PU N`_j3wPOf5r.ӗ_}ǫK buCN)|6.EN9YP).~۟.gb]iB!4Y3¡:*^p^\d)$"8<EhMDE}߯((tk׋kN>ΗK4_oӉ7lB5ϚVwLnGWc;r:WI p( ^.:/RQިMz"LFKpB9?"B5bS# ɟ/P|M'O#Y[ M|'_W#_y9$ FS54)(얞sTUuMsigyoԭ\RDxp$㼺ܩuJ6{]R, ۤ McJ㋏|5_ݎ|5v:tn׏U 9;\ MsࢡjΫeW[u~[@ -ΠT1n0R, ۤ6Lƀ_q+ }5_W#_y9$*9W|EmRzC"Qިs٠7oͫ+WQqhrGg]R|)mS6nߗ՘|5/Wc;r:WIF՜c%^4t JU МW~A)}V~^={NdވiXJ+SU;*N]R|)hFFz15/IU>k+ȥ|9_Wq5ԔTv͚7G5;yQU,cXrsHKI}'~yݔݤNa*~ |nsp&=Ej]:K꾼寲 vINe)ԫ|qQ1#oh* SKC6o66Pzm}nj9ZЮ]{Lv2jhwܕ+VT9rc磮5v|!.͆fW5ny6{v]O֣*w}"/+í7^k:NǴ!.63qvƏg6*O=IY5e7WթΫȚCuGV5^,sZ^*/WʫG˽MzAq%W]N5|̿3ѤI+ @Bx&N@PP`.W嚙1\<:a48y<-[hԔ27~7Vo_FڴmÕ΢o>Ֆ&5ŢiK^YʚגEdd;ͭ1䌱v6YY|7È#\3v8 _%oUZS'U<'n`# 0ǟ0өK'vQ~3v 7ϻLҵkq b &6#11մߘ76qI[GMyI?*Lq]oֳ虗XJl6!!4mތ&*|7qY,9=ɀIUp XaM5|=^x󝥴Юژسgo:AA?K9Oz5~_~}~͚y+Xv=+?\^cTy!iYLp199zݷ/m[uO#ة3ݻ˖\7zfϿfO~ &.!32:x)bbx왅 P` iF]u9{өҭg7:VU52e4"V/6}ATt$S.QPmmc͜3|(c&%((}Y?w{nl67rsGʡ._Ul6ڷ'!ʺqg^ Ji&mJ]Bk+i*Z 19sYM.;41^_h&{Z˵W\ϻ$>!ciPUZ 40W es\_;w$s:Ù7gW4*bж}[qROPh,~6}Ç2vh+C,% tKTE!$,&qx//]djC.KP5oCǑs\q =t'C gY'u%8wh̍\7<,}O~{G2~rslC gˏ[P5VzCrg'ѤY<=N~w沋 352}e8=2yײK1/x!at$VCi9xm74[6Oތ?ʵa2+hڼ) UsOTL$Q1P߯V1V7⫯B4.vq{ANN 5k2a>44~wthyE-gNGhxQ1Зc[\̜6}2׼cԐ1$y#&w;l*1pu搒⊩Wk@Hh0asmO"#$"*ɏа`b9n}o[;۱g?B6kڞ{h M73b(z IxLN.kJOUIc0`F Inq, o-]zR_V&Gi7Va.ja.׼GҧK?KCC董\8bz )3عcgۗydCk.= y jw 4<[0kQ5~Gdff!=;۶F4M%.!jӃIL`Vg?Lΐ~0Pyr L9rUbknO~L=Usp޹ [M52a$yN$;;Uw굜?f C-Jff+kCEΥVqkofб$ȳǰrmشq3L! &LvN6+ͬW֪s[v P9v,o 6GTLNj :bKgú~]{^ǡZ^eO?tc]G?{opp-( +>zq*K^yl5osipM|esůq&}v!i<0*lj立++g_zZ3=GXy5-vWp0f*)5r[X ?wԣϒ1/;8sf@zLu)wϻ];vcnn{ve[/Κ 8{wͻb Ug_fˏԋO/Ҧ}҇# IDAT׿MU廯`Ըƪ߇~";+a1p-֒ZA^DEGa0*߮}{f3 MO~)9g9YM~F޽\󛇨|h _-g>ōaxwӯw<ߕn9ywJ|K|XMdo`XyŮxĮVWΙʏѾc;F ]{j|e3+>t4AsS+]gueQq1 {kn_c.$84§X2V+O?39\;z6o›Λ.b!%%չOTs.Ƕ?zUnm.?;vPU+_9־} ;?-=ATenxȨ< #FCjJ*2=yµVZy԰dgʈY{Aod4U:l'~vGQhrs"2@Ll a%ıg^'7v=ԏN]k _W_N^݈UVh: FkuL:wD͹HϨte4Un4oٜ3Zd|wJ9#jQի6""2A1凟?^r˱j Om}bڣ /.y)\pE~ a53esxV1W x.UUtr:uIiVܦ&D]2W!ip8gPryn>,$UnU:_??[۶Q_A0q<>`/[8h`)"fb ;kG_@Ll4οUUYv\xTBB1R23ط/+:&qixZmҬ Q2v;-犢:>Q `ĀQ0YӮKEQ08 NqN_Y{_#8?)`e7f  ;nYb2Υ9EFEɐg>=UU轏1z8#F'*&*W]VSq@W28u>׾$IX<ϲG$׾tՍǞ]Ȥ c7U(- [mV"C9~,w2ҎRhszFzL-WЩdgФYB8J/͕MZd45IRS nvQXXȂ{Gfкmk4M cy4?ϻ*sSs<8v ^ᓍ8z JMXGʶyp!7,|-`3f׍,5WC\:!8$?#ɜ5/ 8kjRl[Ϯhʗ%IINuJд Ww\.sZ,ZT\׼ޯgWhOVʖ~9L@aCYf=ǜeKգ(?}.viy\.-5 PfO眑Xj-k>>zFHh0cƏ&)ϯἸy E+ֳs :# q֘O jmz^|W^x^)yeffd凟YfkԔTZl7p~FRo{ai* :~Ty߾c cٲO,@;@qqT\oͼ 60)UWVe4Z[OVJ\U~b(pN +=h3bZ]FC9z(;u#uŸlic6s}4?F+>ŊVBtō"Шڼesf^q9w~'99 6];vҹkgZn͐aCHNN㵫0 L<>(W:\SYYzcM{2x 5oJtl4ڴT޲SSu^fk_oFl%6&5jEdT1n.2UXwXݟY߸<7m[s+PU3ʛhڼ)u" <!Y0C.uկ)q;Vw\>{ܧTN/nW뛗+:&&7U{.6. k7QTvU fBDTD瑓}Ls܇&>!-&ADFE0}%|,zeV GUUοp]pF?#?o 6t:)JMI%6MS˷y'ٻ{wx71Qw~'P%7&.=2k*ɏtBZݹ㞢LGFEz.Ospxy&=W·_}ǜY7Pb2ub-[M6<Гt~kXe+ǎknTDjJ*;EII c'a+o??s0Hh@n^^M1‰<購s#s5fKNݽM6Nz_ެ6|7|w=rCû+ϏXH\^{y))|v~='S4_gˏ?Yl}ڤj*g]B^n7]3߶n董6 USٸ3ƌk+_yub^[ &2e;qUmbTi{={|}=F Qx}dedOhӦ ڵu©0tؐjGӜ1rv_n$z΢_BT#ɼ[$M&5%yw?sQ~+|cXpa(S~SJ\B,6/7EJJ*}Vqx>/տӋƛ6MuǙzj*۵"I<__IgjΏ2:KĤjdf |+Ҏ{Pz2>!fiխST8x swϾKvj*1 Oq#<[HK;OaӜm!-5߶n_q75gEpsggQa&>v\z4gYS1ϯ&ǧU2lZ97|Nd^|v18TOgRSvim6 '<"+kȱ#X|KK?9|2hRSxkrRRR姭d\q}=~Χk7=((,􈿺+mb:TTʗ:PAv/o2պMzeWMY ='2AX S4+n>K̙yҴY_,&3 ^RXPDMߊzd.H_(\q1g'q-xuOCAǐ,[?~EZsWહIhUkߢ{TMmǶ\}l^{q)YY٘f:uM2u%33#h z3ڶbl#<"]>ܻnvhSr~i }230tݭƼ6 ,z9 EEDDEзhՂCޅwQnlX/p[ٶS]l-?v.1KgL0<~hߡ0r*r@5g&W]r-;wc<⣼ˬxmL&{oq-?Yf1r.1US Yp[)/ D]™ye< JlwXf]78}[Qr۹~mc&.gq8?)]~y詗Si bmsxWYp#hqFsFr͍W/fZ'OT{\vsZMEO̝VvYӏG՟]!e[D׎vwyo(K?^4낁 ;A>|-cۼOV|)m2[fNڨ&^LOj& ̽ =N:nGWck;x y5Pu' 9=j\|>#yո霗ӹmJr^7&?yy1C*WPX@xQyyuy>{sxc_R, ŗTWW=7x6v,Wq59/s|nBCIMK%.V#(v¢Kg>gb 4ש7 '&#'U5R, _&\?}oWjls^N*y)(N>Rˇihhۿ./pˇFУәE׼ g3},W$ O%_s!:Ey/&%=#i1= RPעBDžBt:ƒ# 0֝[k(AsB!Sџ05g^!d!Bq3HiBJQJY!BvEntB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!;}Kzj_(2!B\jRTTDxxxwCBB96.&MФi\Np>C|˷|k)w`Abbb*̋Os׮;<:}ꃪ|zMLZ$,8Ciiת$"4Vu !B' Otg+KW[rY:h"""HԑyV&,<Æp\!+0s IDATes{zP}zRSR e U 9Zl+y}v̻cg:8ڵodxRŔo:յݜc.g !.I!BOҏkcuUaYZ NbXB!BOּ߬pu|cB!8,B! !BF:B!BB!n,B! !BF:B!BB!n,B!Cc f۰hJt(  z4v8B!tiZLVnG>%ݱVM&P|#/BWHYlvٹg/[uob)YojV2ZvevB!DM,N[vcY)tnݝVױTTMFƓEPY:B!D#iKE# S^CS54@AB!|tiM;NCECSUWA~>. TMkXBQi:Țj}<{橨*d!G'Țq,Xc!NdE _~a>oC_|< MS)SB!*Ov?۰ '_aʶ_1ϭw]Q{4ҫec?xoQQQr+[V !O>7n{ t{ջfffѯWHv]4;v[w7Uw,{vZ5oԋ.lӺ\t8؃}W=65u:W_}5ݻwfzE@@m۶7jŚs,ӧ;>:{6B ! % EH3Hi"r)zJ8<bŎx`a/bEi)dg~wH _OLcgf-_W]=Sܯ] !Ö+snEܦթGzxB>w>ZY+//۽glֿ/Tvvvȼ(77OZ$$&iSv~w?ìrZ,֭[N;M?|yf͚N&LЄ ?Vh+XA!x?ziJwNW~~~gI蓏?={%Iy_թ^}ƌcc9lڷ.r^Wueiܹ%=7nڴiYfIlR}:^4Eߑ[j 믾$}'jz7 IҦ7J:w鬌 KԫZj}e6u;I҆>WS{RlXwxzx|w^|E=h8洴4-iEFEyd=shsg&oH tlc%I+^zYӮB)=RԺMk]6&&ZyVĸfܮNqkчeO,ӦqǪ]vu({k^Tt4iɊQFF4թZ kK/kIUjjYU#Eg ?S"""TNٶ}m_EQFۧ Z($_[ P3ԈGM:^z*((5_>ؾC_|N=TIҶmբ1!OkպWSL%7O.u~n]u]޻ӝ+K] ժM+ǫnݺleee+53 =;/x3SLS&޻SZZzK۴VLef?YIHH>RdɒTJhs(믿֠At7kܸqڧ6w͒scUFI-Z4qS\\B?L$%''_Zf8ǹ4#FEk\W^g^&7S&Mp,Iъ~@lJlJnZ/Bۿ?KQQQȶm-|]:IRTTW, {<VlXٽ< SAA!hsyϞ=:묳4{lM2r4/s ׶?5/0yj;r65zhw1KUXX=K}324m+oje* }=<$d׮]ڼirt\x?3R?g9 n}Feg|vV"iS5tPxRIRddT+ȦOoV|M#8-RV-fܹK|AhssܹJIIĉ $x]hF-tz~z5|gz" ]O-ͳoE)y|uҹm_>mԭgߢ];w)66V=Oa-8M|N~B*̫Txxc233ոIc?>5kX9ty;!!~եq?3}jРԷo_Y&dmjڴi%mժ-[Vb3<#˲~'+22R3f6nοeYVĉ8bȇ#-ԻӻSLLn{}˖-jrɗEEErl蟁Uʟ~y[7o׫W^>|x≐eϟ p?6lUW]wq.R=Z_|V^S~$;Ν;ג%K &‘p>[TQǫI&jҤ,Røaa+4$M4U{Jn}.\}zΓȫ\eee+qGkR(!AYYYzcjƏҕh۶m%رC(11ļE?,qqޜ9s4c 5lذ:5!۶K۾}>͟?_O?tH5jдYS]xfWULL$i&J~nVwuUPPPv#J߷4KүlUrw;|z_D/>EGG+6|wnZ/BcpYr3˯!F(:+1}jذzUb^\\,Yӧ+33ӝb ͚5˽ľ}ԧOk8pO?]b{K.BM4IW]uvzG S[rɿ ǜf) J鑢*?<:3.HZbn-ZHѥnkȐ!6l|IwyA$5lPz-Ik4eeffjЃ>>L$iJMMՄ k.w[;sBE58cٺ4 ]0B}GoS/ǴPbR]yNj:ש: t/nR$M9Msfߪ /8-}j>c 9cyx|u9dTx:St֠պM+u_%I3Rqc3PrnyB?F=ZWXX5kZ5'OOgq}mݺUCU>}n:XB^ziۻԨQ Μ94oz߸TաU /]{v(^^T2j"ovPcc=#}lǮQԸQSg*:2 @"=Z(3kjv8cy؎(yA QyO?T#GTս{w=#zg;(--MÇWn4x`}4i/_]jԨQ[twX='?Ǒ%xG`PAǫI&jҤ,Røaazukw: ^]w tF:t];;ySJ1oQʪo矯8yjժ6m$IzG5sLh pBIŋ5d;V:tٳ裏ʶ+~8_{ӌdV~gOt5Ҍk͛ԩK']2RH6mܬ>}{w^ג'w?򧞖$j&iЙ{O޺b4U!++<֭[W ҬYuV-[LYYY:t$iӦM:餓{衍7J6nXb^jjv}hc;S^lۑm۲lǖ_.\@٧g ScZ믖$:w8%&%*G1L.IZW'QFz?ij9T~}ӧƏwXٳGw$zO@[.92up9*Tκ}vl>,,L[4mK]>!!A2Ivޭ_U]wSԽbpt)bԨQzGoiڵ;wVX+""BYYY򙙙JL'$$'ɝ(c i!W1-V~^y%7֭[^M͓K]/5kT;˫Vf*+</! 9IDATChذaz뭷4j(uA6lP~$I_|:v(Iر6ln/PFthc<*t+JfEzT:՗_k[t\w谡׭zxokQÔbѦMEDD衇RFF֯_w}W)))ɓ'ӗ_~u驧Ҕ)S$I'Nڵk/jͺ[5yCoK^x\dT z)t=h턮z%:ຉIzbRvzEW/B {<GQVhMLL/3gj̙jڴ&NK/T][lQ~Tn]|]f*U'%5WgT82 KJ:%k ;t._UeVھg[ymjuL+5m ۶mo_tlɒ-Y MǒdGnv|?@PNo;nڱ~~C˟80K/w;6P}62z9y9@^ 9uBB?<1 }뫌+ǁMQŃRӃYy Dn߱|57U?l&'.9߷%فVÖͰ|qw-ߔ@<=ڗs]28 ۱eE< ~%M0:#˨ˑl!]>S Mn[U.k;ŷ#9_ica;$U؁dz|Kc;"/-#MYWD-m9uCcd@+,˽pN z}_@,3PǽH.ܾ{`o\X޲,[nH*R,dp@mkے?&XhE7Xj.-A~C+m_Ŗ28n#܌^Unߑѓv= f@_D@ۃ{! 7xm_]vmHH:/Eo,8r&UGVo+ A.JEZ^7sYCYh𵾖 rn˄DHp^dg F@ Ў;u|nuWn1^R++±嵽ebm#[h+ bk0'ؖP||nͪZ mڸY"Թs']},uо7;("sc\gL߭[T1l+ ]G%+v-XD-$xdj^=?3S-5|p>o<twv [o$Kߧ'u׌k?,:?KdG|/qWb_U S]}diѢ4e}ԭȨ(z rRW&۱e;^Urn!h(u歼s}|BB6V(s]uUڳ{u:KGy9zOЃw/޽{u_GY>҃ ʴXTVOmZ 1-;[_4׆xkm#eɶjڵ+\/*B1c4Էtr8ϮdLŢT`O<~}F;G._vإ{vpstƠըQnviĹ9c.],P *IrS{h}۽)O$Gp^ɒQ/B^ۖ~vy:Zm:?OQlQ5lYZ8Gydqj VQڹ}ՠarEH8?¥c.f U|B6EOg>]o,cKJg]sU㦻$I=O;ZnFe*8dI:JnL/RTuQ5tH 6й#cmcoռh%S؎ nRNPXGgݨYJHJMwK;wTzjͻ{fva9+ȇHe6SO/yF̝,5iXu>۽p>4њÚX5oXQnwY%+qqj>z]ua|:﹗/jǵC뼑WxUﭤ pWlmpbQW@Y\5A0k|իpq.rϮZvGrj rW /G-@y a6  ~]U#1ʯ ۶}Pw^J^yBU8+ pX)sc{(Glƕ9?)!I2ù>TJJHzdp@ZLI+&~u稕_C)N*s;QfM}GWdee+.PӤNOm~D,]-շn7#8ڥItl޲@4MjIͪ{ -[TvP0000C$zoeu t [އIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config7.png0000664000175000017500000015350313203343610022251 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxwEӀp9qG9 % TsΘ`PLkEɂYQATD.pyowc^Nꮮ5A  ‘ė_5ʞ :sӛ4.RzʗP>w 5lNU]QiJ0%j/gʨ(FeH-˨{u+b:Xk~UW{@ʯ:iR~@!ږ%aYװWQºHu+0UY5ګ+T4k)[DFQSajA)ՔQqrfMݻAĄTAA#~'sxAAȁ|Z;QE  p$` On=AAᰓ @  oBkN'NT(X,X6AnPuuJ_0 b9$%bw DkMvNIq!  ¡rQ\\ɭ4 DmnW6 **^Aؘz)i&G EEAddlz妠Ёmbvbb"]/J(**ۮmr}DF#s4II@i}w%<*N  %%$ ҙp2A)R X,+ J d45.??!G Y9hY`Jbbau.'M5㺳OGQPX|oKLtD/ګgnA9[H&\x # EcDv:_i޴;3LV+ p8۟ILt40JJJؿ?$"km$&%s7`{6HLHpMEEN"#ˆ*u qLVb#X,\&:`̛9p;g@rR`;(q0Mb`Z 3+[sAA1.R XVc-fYfrth53sIInpyݴ{AA hq:KolٔW-P="z6eW[Zk"//ؘh"#"8{Y ? Z{ [rR-J`xvk[s_!*2M~cԈayDW ]EfƠ淍k(Ӆ֚H3pڙ/NNɄ1p@?R/(#OrA#9kۚDرc'7zu3Glf㯿_#7/'UW[,! BrM.udϷ%p|$0I ]p!G J+""":\:uhGaa];wst9)..&&&+vӹs^_VY݅lVK=DN0/3q8]nztTf)|[# y3.!>n]p;J\psJk@Kw]6\|Ի - pq m0va\ۣ rG^-h.F,[f ?u0Mffӣ[rX=KzvB=,((1duKJ\ ;~0<$-7ђAe1"uĭ7_C.p̠t mYN xsuj䩗KlL?8Y8E3u> ӬXXscm~ aA߀2MG"RtIMCyd2r՘t5P'J4D~OC,V e6M d0m]Y,99HII&9)0PJaYQJϿnow-4M~mp$%ƐStNkZ-4IbB .mڴgInWy Td_=_p6Bxx8nwfg%՝Aecظw0k>g7^NVUdȈp^|y>6ڒ_@JJ?f˯п/|M0Sy@jkۚGiجo?A߀aX#AgB?<%+OKp'G瑥_sU:y^ȳv*(XjbQUHٳ'[o? EEPJ֘yyy<+fSO&-9r,0K ::'aZ/YADry[h Yyqdfeӹc{n:0J_]jGX,yڵ͊mVXGDds_z)ϠQN'vjK/ӧޤ19r$֦_VAA7`Z"AF QQ8pϢul׍<}E^0dZjaau > 22֭P\\tf,g;]N+v{;wnގe(qb1٬DF(qtz0<Ϫk|\d>=WRfL> |%s_zH. bx0b1MEqkEŅlrnu)v{鍚ҩU": ZEp:j?",ؘx"D6,Bd qq[CF_m5җí ¿"$'0's{_4λ\kf6]_HQq!oX˘'sR{ QqXNo/?dHe%YвI+cPJ`` x.>&MFNz|bcwV+hٴa8JV~LӬm)B~KCm 5qotlمF)"RNl}: qj'T8r$-T7 )͈GRk0 IM[6AX-2w]{wӦت3@oّȘZ+_"J4ަPӯ>b`hb@x{BrsBb dm U OyVvn%ÂFc1<{F,*|m\($)6< NINhO[a`н]o0I!7J%. E)+[~r֚8\.'xQPHˑܶPElp(aB!L Tnuf= 3Q׆:W\RD=bg2q1DEB|L<%.0բ . E)+O&ڻÓtm"^hҨG6~B#.GrByF+ @k<ήwnUJylyz7`nd  dzܹuW tץ,dPҥ6~HoԔuAgMRD?*v9 21: \4J{V} u歸Ȱ(  4 Gr9/ԖP_(PzBM?\#$؏O>Bm G]䶅*bB)OH6=+ad"5hBHW6AYm Su%J4ަPϊ/K֏}JHu9r$-T =gP`4=+`xwХ/S6AY(q8˥)F)8u%JT֚V8zBI?VP@BU"cwnIp:lu#={V`E)EVfR5HyGҜv8c wlP Kzo-.Sڳo'v{ |I/P>K%t_^Aw)Qc>d99Q쨗|qQ1W_|5¶B:V-g] Nw+oٲe:5iiutk?B_ӭ[Ro pK(˅Wrݭ >87_}[e{ҏbӆM\8eZHeop78u#eN;X[qccOQXl%J)y{艃R՗^cK$"kQ Xi;EޥYfc*«ọ]vUTo.x͛/EtLt߻"y4uKm~,]ͯڼT}!l8lrsZ4JOL9ZmwѹOH֣߯/oZ?3qKVDjZ*z=?22Ʃq?m*1uEGxƩ"Mu7_nc]lGPgz.Æ2hס]uӼ1]5d4is&oe֭[ǝ͛iӶ >=zxO=w*?3999rep`X{X`!iҫWOx 6m hk뮿ʲ_:ol;]I{KmS[0&Mch\yռh!1X,Rdgg3h@nFg=)gUZguzѼE3~߼w^Ξx=}[IzJ2]=|y 2f͛24?k4u_ve_Vjt|-4t:/ֈ];w[8<>1{ 3q7>|1/7?XH&ݳO=6g^x2 xR%՟OdT/}dxd֣_<#ն"~;w{ ~|׆glWF}C}lh:uH.<b">`)W&!!A`K5QFh<Ĥ${VXŰw׆ZX8Y*<xh0 X4mLܼلϣM۵?.Mnv ^CQd߾8f΄ѧuN^:A}rk_j}4HMyLOߴqu!{ Աttܵk'S8G1`Nw:߯ޟ(Yp|1x{sFߚIi b+8?-Z6>=y?t76Bh;o&&LXX#2y;tnGv85I]vl?M돿Xteilڄ=N-jdB,|+5eh׾=}dF7}q th[nF^w}'?8Jd9w2~O>]EA}+W͜QmY| 7x~Gx#XnDFI&ӄKZF?{؎7?Z Z:`l}vh+bĐ =&t3i }/,`I 3G{k^{dT]mytZ6צts~W{}|-;wҷk݃FsNe2j"{ ⩗ן,qpe3۵?Ɯ&'[upʨ 9FN ;;l^_Y{/Z̩c'q|/-[~ =Y&J/\0"3_]= ^CuX6\c'1&9l?.rq/k[Kzx2{knahޘl6 Ni~U?fB&,x97μ|mlZ10uiX,feɣ/yTPi_;nmr_cuW]_c*K/ҏsCw+ypY5kWy>2˗'Ǟ}}}isx'x'djS)xl IDAT)Uxq ؾJ~|-i21}{>ȶѥlu#=$egiWo|\t.^wTyl;Ͽo|A n؁s||csWЦ}fo_~5ǏfW_~KvVǜȸS{)q:jkQJ1wҁܱ S)V._Q''cfwhkOJ+;G]hݲ Kt~awzF\62Sy5ٳ 6xқ6%=)cǍeU3xvs5=U+7y=l6nXNXX8Vz$'ТQ;V?󜮼>_zmn~G֯[]ӱK'5h*'Ws|3\ng|lL0k.}y[6=zw[ oXvOG5gۋ|tz@Jdc>.05n$|-oF:6njK_ӶC[,^Ƶ̤sN==BM HMmTeE~Qxb͗ =a?qpԬҲUK 5IcOyUep%׍tֹFcג6zKIIf%q)ѥKg͞{غu+G8ڟ0 Pfiڷc7*Y>DFFPFRkG쫜iy:kqTsyŠ4||5"">Dνpr:w^2gbMO~A+~Z3{ucӆ͜zDR$&%eϘ!;3.Zk2grB8KX,zӓnoȨЌEo9a0ϼOVOQ'KS^47mt\N:T#ϭ|,ڴjPWtW޷è'E;fފRU>!2:7]= 󏝪K/#993=yٲ:tjSINIu?ӮC;FΈ1l}Uߦ]rc!g0rH-^g 99)(o^y;va=~QQ/HkCW qرo[To ٻg/qqޟ,ͣ}8m*M(..&;+] /))!';fM6O cWIɉlGqq̺~f/m[ۮg3N:Cpu0~q9j/h9iҧ_/0wu`;m[W]s}≇fƴXkd Y:I YlڰSf-t #**\˧q emOc߾}ϿGFkERr"=zwE1dؠm50g4iژ‚BzIǟeEϿqҩ7ႿˣX4nYӯdjՊtؑ嫖ώIOoֺJٕ+VK/hmۖ7xgg?֚p% kGeSk8=,{[m ƼMr5Ӊ!66IU]6Os.ԏh8A^Zf姼|v\N,{UrN]*t|#O'1)Xƞ<7EƮ N|AtL411)9&2*xWߐa$13>W5.V y;{ NKϫpn++hoL~t;Z,eXeW(ro>R/ԴQFV߀"> E"zV^}Sٞ1ǎfuݼ:Ɲ4|'NbC׮]eY)[4g޽̙,NFW)[p;!@-rX#zNQ#=t@;*#plVDjXe+ȚȈ&{`1aYO\|Ņ(1f83.Iҽ3q-r:l{2p)˷Z8Ӫ^*{ :}+U€_RShҴؠO/de$ywzP^g)pr{nR9-0'0{o.IzcZl_ю&9%)Wǟ;RzD;Bav{nRDDS_Pa- M\l;&iܾ3)؝AZepNqRݸЩ=O<(oMWJN:uyEEMmJݸʕ(oJZսQZ#Ziŋ ^ ÿ2u_]em;x@/IDKzv?,cI5F|j8R}.'҂;J_Pfff}K*%%\p *[n-iӮ (}_cOKϽk`}lmJ+6o7_~K 6ɸ c«ӯox)>Jxnߜǟٿo?oPZ_f#Y:yyUڦ&kܴ1Ϝ>[ a?ٱ}'991;]{tM[XlctmIV~;?mhw Ǯ]Yx_|cN]'?8yϿocriҊ)C^n3/X;X V,xcO͋ _`登y^\֬kn?obpM3XdYTXDDDgJOq=NVG_m+OW>nV.U>a]yy4xBZGHd%''qrHbROWuWQFKXr {c?پ}J+ D=6o>wg?/{s.^v"cwoRi[1'fOXx{2-_UCl*24+=2Q~1ȁa5-u%=*rDx$E @CWDTt$bN}&0;iS9vP?ΚrTqXA(G BiEMy' bpmSXPD sOcmr(g?9ivݝ8N7^TWٺ]xXV^ Hi­DǸ>o+۵65%34]~JZ4LҊrUxq @gಡ)W&kXu}̺ .r.UaozUJͭ2Jƻ]qXour}Mqq1'<}Hf?}Nstl43nˬ ""n겫/Gịiߩ=?Hr_jsyixGY ƞ2F fWeKO?5+?c7mLq. nS׎<2A#99b5HHLʋ<1IɉtՍg_yVm.sءs{*?$Acz2ԱOWuWc3wBm eBLɜǟ%6.+z'l>mL:TFY>[:UXQ1ͦ-%+? j*8\ZMV0 %. E) ZUCVMu/: }<j^WȮ0?Ӯ0d,}~96׺4|߄Ie/ݥ~Nƶ*PiU'EdPҥ6~Á=TR?zn.ϼdPp=\owKYLЋ uNAAQ^ZUP9dPҥ6~?t:)Pps$Hn["6J)LvR_PknuzJ %]PoS(èvboHˑܶPEl^7vpN+ v% s+M޹ByB~KCm %{ԑBHu9r$-T׍W+=FS/j*_j k Um i] %. E)+C#1>7 =^#.GrByH'cO45sr ػw߾# MtTLkC]ٟٕ J %]PoSH'+ȥx'8r$-Tv`p6F~T~''ѳ14nԤe?gS_TAwvSȗO!/@A6bǞuڰnۼ: **E>AbLtd Iia-C{#*2v$AAcch޸V2AAA8lᤧ6eYAA80 H\nWeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl[AAn ۍp0 l66 0z}  B%%ج#9ޑUIDxAMdA]eR*搜Նaȍ^vaZˆ%,, :Zk,' V1ʤѠ8}uiߜ-6(|eۨ*3xlt:QZqv1{Y!D).)&+7;>$uؗWIñÉQzSBn7aDG`Ц1וҪԡT9|>Y1 Eu;4C:@9;8D._6_A/_В6i?6Ȱ(R8qA.sҪ;:z3vѡe/(.`DGDa evGkVMgNk jW_(sSFRg0wX|+ Qxy4N+&֠}:Y!/i{uJ3/V$n[dAv7k7]ZS;eoNFUuDED܄,#cAB+*s-0Іb 0ׁ-P`Bڿ[IhPLJC./riV2~p)Js0R9j>?qAB& ^ajJtdsJ R*j JWhuQ>C9LmxXoP]} h5*@6B1|9yt104_AAQ,CUbA1TK.9Ҵa]ߊVS|9JC ,y8~K_SuZ@1_}NrcON/L#J V+ x8Rv/ؗ|Ii9-.Y+]| 5Pb1hσW}KѡC{.]'W=UPvs@.))u.b ^On\Oo,o%:99eKx@m2}|HpUg)M`!웓CN׻SjW&_UW̬4[B.%%5ImbR?0M)ŕͅoժL_Uorja ڳߨxwIII!!!y]/ 8{WJ)6QS1<5 6=inڅV&Jy3[Bu7 :#o驴-Ky}nOe.ӆ;[xҔ[Wp%C:y~a?n$ttuU8!8{9tlݙ;3`.R֯[p*!S' <:5gq#ywRSLӤ{l!Ъv|x gҙJ.""IgMuUtiҏըN4KѣGy3g$>>TyS{߰Z)yǹky9wd2K)%A& }cװutj%͙Y՟_PSboSii*LS6Mt+oI[EErҕK,},]ܼ^M5=,:9RF[͛;/^_qYy˜r̛2cƍ6Qc5kp7eZzy7Oftޝ#FT[ŰKZ ;>:HN8x~7kxwYR^zE"#"OgS[`}GQH !bCE+'ԓC& `Â~ ' HջC]B IHٙM $9<}dg3!ɼgfeܘq4n܈j(+y s\C.pHiQEgf8p_pQQ⅋y#ޘl5븽lD|8cǎH`#HjޚnzdRcٿ;ЬAMxmI~l޴{%Y+$qƒr5o@9i*#=G$6kӌ_t)'Sܡ ӹC>UU'u4O2X~9k\Kn}Hjޚ4籇 5%ե=}ҠN#pw]傯\>#=IZZG1i۲=;{}zA[sg9d=Kjޚ-vgڹRTҨΐ!C4iRecԨQ$$$еkWy̙Su͘4ר<4Wsw%uB[ƽ2lc9UTZjTV`||* 5EQx{ V\ŖM?Ɣ7<^CV5m=7}~%бͭZhkZyk۴iَMZs/u!X~TO=> [%[6첯 Уs/C9s&Կ"#ȎQLj^dUۤT׺dѰGaUs{MPڶ؏im׼z蟹c?Ynw9|7r[Y<2A.h/rg$ڑ~ZG~X򱯿Mk{Y|*0f?Xkߎ'}E'ӽWw~ܰNVk}+((`ɢS~=ޝ9ukb3Gk?Y8vʕ+|R-_HPPO<r/:# E+xyK10I|+m^K6xṗ\ٹ{:៬~9 "pmn&O':&|7""y9l'F>? 'r1Ι_|ôSqjf+>q$UXz9W-bQx6.g}׵{W~Х[g,Kض5S›ٵ˾_kW?aqkwT&PMq{cƶ߶ڧBy'=ٿ?Z2^'&&o߾RzE]"khR7I.+;wC|_l~ۺ_ ҶgL6+򘗈xϳn/ӦLCǕ6vS-(cm`> @UrW}׽g76md5޳;P'O!**Xby\KbR"5jד~T3+)[x".?!!!>}ګm# tt{Ʌn;vkGiUFˤL:߯Z'sM?aT!b6 -JlEdT$? @W='z\8_ #+-ZR~]ƾ k\Ut@kuE@%ܷZ+a+)-t.K rq%fUT=y/K%/~ϯ+W&;;<233V-}ڵ8y2 Y{K 6ȢoTU%;;³"ϸA?4Qӕ/cTrچyub1gϚCJJ*P㟛<),,D/r\\, ҕKkhh(1b6|(֬c)L|s3iDvZv4M#5qqqbXʺsßg̩ݓ)tP׷˅zQqO1r0^~q4IxX,nn???N"ۼAOK% *Uw*U⮾wb FVRJũZ*g3ܽrlp9"#V{ZJ4lؐ[ҩS'~75j]_ .GXnL*Ez\q珒L 6.+:x9~\;v2Orjծӥl,?v߁GF "??ԔTll\,Ixy=6rZL+U|9,8iGJmw4߀;b6gN1 UUCA "'K:?[Q`8D~~>c;s6' 5%=J>X.^;߽L-dgw>Ο;oz2g+'OdoGiа4Gs!us[5鐟_k槵?ʎ;),,,~`J*q=w2kl8H R$Pv-V\ũSiF|~\eKҿ烃ٳ{oS9~8/j:<'Oi&;C3ylTr/Њ^kdTIJ,ʌsm9x ?&кM++;x9WJ4ƎÏ=D f0gNJSPf5߶3vxtLTt%U"/z}{{~W Yrii฾r?`zdܦp9.&NKgˮ% ZUo[3Lzc?{~+q! Q/ѳko 'mW֬UKڛUв|1~!^K-eCd|^;??_vʤKwx̷fyz9|||HӌnY3cGS:|Ƨᵱ@Fڵz񗄆k7y~GuR #G(ҥ\2s'KY{W46oB!?cٱxJ(>ҭOW݈֯?gҭOWTK,ĕ{|c<>=5x O XݨT»sgQ5l=iݶOԥ)bPiwf 3,=l?Y yʻ 6kܠf$ցKE7Ht6oBQѕV;gOFyC^%TG !llwRGeY!n`>|"/S^CjH n_h-$0MS)TK~Zv8? u._ ,((|*\&'J}t먪U±^!$(ST\ ERWt]C-T W BQAe>RBkLJ@EΕJx#( pC|'Y!(S) KS&$ !B9e!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0)bUh!BXP䃏67/Q?U| #/Krv)g/!5$.+!$<8FVǢXЋʹ˙\a!E(t]7¶ǯ|]EQlv|a=r)G0kL؃i4%6C}szAX5b# Љu$ WP:YYD5c!]-;֗Xi-:6B^ R{J@Wl Ўlj >m}DO_Ǩcsזm9nLtvkLrfMFBiΨupb\nu{6uT(n2 L,S05;C)SV;=uC؎#TK@I@B!*ךiVb5_QTu(c9:hh.hb8}͌gcTVӝwsM~{?t{h]RcHֶQx%(Bi`ki.wpcW1(cko,]cumi_nWw:CE0l7uCXNFz1l'..аrYd!+uQ쉎ˈ1P^TS:J!vm1X sEvZѠ;wl^G%Ӧgy%v! Lzc26#˹gOBQySbjsӅ|]э H%ECr%a::֟"1ȃ V IDATwʢĢLXz Y)NZZ 4رz[׊:z,wu)B!*׶ eJT͊ڦG?J[ӨnڴlǠ'f۶mMUmOUU4T͊U+D"V5+fEU4תZhLrUb ]j_iRUB,N7?iSGz=AB!*>J,< %V CZZ:^w!==b CAA#N 6:*|ٞek$6kEۖ7/^{ج ʙ3c[%hԑ7'Mehߚf:yqe:wBtЅOflGUUf3IӦL7o߶ I"Տ];wyϱcPq7 Y!+<5LGPpuah͛6qhЎ6mzTIνi8|CcU xь1-L b;=|d VkS&LcdZ6IdOcU P+0mҿvn2jDxx(y _3KȺEսjYbcdgg~CBɻ|Bvv6`'w^|||ɡ\233[^};Q5w~FBQyo[V!CӭgWٷg_xQ2=H?c'hll[A!#4 6 ]݃B#ķh^jظXZ':mahZ'sX,6GکS_dqq4hx KW.S}+X!%WB@l֬^ö_qp ciLZ\ ҹm_jЮc[ch|222ܭ:ҎwtGnƍ~ ]-7}R~i3شa3N<88=ioZȪHKKG*?U5>TTY3fsARN{nc}zs1ޝ9Oʞ{jdY!ŕdp9N?+yi2~^uN_O2c,%C4̮iڎI-8qV]{uE4NJC^vX,.\Ȣs8q1'$%/﬋y~{UӘ6-V,UXxoM'ꕯda#RJeƎOک4BBBhӮ/Æ0kƻt؞.ݺ1LROʰCUU+W^:`X"""G&ȀǨCHh( *:Oo޻skL:MFBZ GDY=y~~ԨY'~{MSO]2/<2OQFL&~U4jDAAa!%wӸiC4M4MΟ;OXx}M( o7S?ח:]}1vN[nfǶ]TRMS9avm}Ǥ,Ѳ> ~DN^5VŐN`` ~i z䉧%IWoDdxT+!\{MR~k-MʸWׯ}е}j?r2yPHIVs%!/^$**=GoT*} !ʔv3#ȢS)B!*>K,Ƴnt_rs)B!* p[Ǔ$_ux7=J>s.,١wBar!jhZI2|5 KLhڑB!L|+MyyŶ 'b?LxCDȵ4\A)BJ>T!( EOB!DE:j-1ԮYm{KtL AeԻOvE2IhKrSRwWBqbc$?ɓ'ʻ;"#Hhd?זd!Bk,6:GL!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L|ʻdXU+zywE!&|*モ(%%+<eԻo_B \]ʿ gH8ɹʻ;B!0 '.ձ(br.rl7WGXHx::?]׍k<_GAQ۾_{XϹ:?m9 =S+ la vg{26F l=v^GtCȴ>ttB8te]& NVvQ eX!jDdˎ% kf bкB}ԞRu{d诽@8;C#8#ctBDkc1eimph(?}4qp-0F\Y,r!+|knDG3j[m[LS酢; ;dͣP n~;jO.븄fq<0b~olBkhjup@gu4 XK5ڣF-z_r3Uvt5¶zdS?0/_qmT혣9m6}mI@,d!+|i=fc])l3\U6 *{@89K~]yڗ[;#ΐ묭vF=0oiM%AL5[%4,{VdY!JAv {2jDר5;ke(x r3;\yV4an(eG;n贩YGFȫޘ̺Mkxo/ĤrY,BT|ޔX\t>DWt7G-cD{ss~yŠH6띲((|bz@F:8vզi.h8g^HBQvX.V¤jVT6=QҜFuЦe;=4۶mCլhj{ڮtjVZ!ٷY4+ٿVBcܖhuVWs?RMbcQt!Fw9ܱSޠZl5MyCGnRוd!^b03QqW V0T8Pj/*Qz͗+\ ,??FbVmٞys>(KѹZ࡜9Y>f](IysTF{VIl֊WQLs.4kO]tgvTUe;shX>mtcm;$r]صsW3s۴i׆ZkzKJ}Bϻ SQS:~P^F>?>Yټiݏ hߖ ?GU Yܛy8t`?V_ͨod!빳Gb0e:NeD?4VU-`o&-`.#ЪfKɓbRba6mt6o4jܰض6nf1fhV|&P>;ʺk#GG m6uhC`?yyy?z@?j׹ ]WYl%U##xɇe3Or&sT]rRY^W322ذ~#]lSUlohX(ym&>CNN撙I?ҬA/_Mqsݛd!A!߶4C[Ϯo>&&!ضBFi4l ΑGoѼq$N1Su<4x=$NbXmdϏS !6bi\RWƿ:~WAJ,B+W  z kVaۯ۸{u ]tcb8q1O4RNR-.MW6֯@Z5hױ-1Q|4o>t [iG;ӣO7VFFEuOc}?cŃ`ƴlڰIOKwY̞{4˷_-dUqF}t_ժT*U]ɬ9x )'Sؽk^>9zΜ͉'HMIe1a2l 5 ??|To"AB!*>obq:99={O| ~o_fWyW~̘: vP5.=:kn~ZER q@^]Q5S9x]6 6N?}̉'II9ž=;E"@4M|˾C4/^[Sfzl`؈TRcƓv*ڴkm,˰!̚.:K.2~ ӦũS2lPjծu0X,/Ƹ <21*Juy}\|ڽ+Nt~nn.{ve9q1Iѯ%MFBZ GDY=y~~ԨY'~{MSO]2/<2OQFL&~U4jDAAa!%wӸiC4M4MΟ;OXx}M( o7S?ח:]}1vN[nfǶ]TRMS9avm}Ǥ,Ѳ> ~DN^5VŐN`` ~i z䉧%IWoDdxT+!\{MR~k-MʸWׯ}е}j?r2yPHIVs%!/^$**=GoT*} !ʔv3#ȢS)B!*>K,Ƴnt_rs)B!* p[Ǔ$_ux7=J>s.,١wBar!jhZtej }9Ѵ#%!BV%24 mN,ș,''k?h(Rʕ|CP@0":BDuTZb8]˨wן܋dФ5ߗ LGP-P-,! FI>~'OwwgEFD$~<- B!Xltq %B!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BwD V4B!L,(TEQJlKVy ˨w*p%ΐqsϕwwBaN\t b#cQ, f\ n^"uta׊y(};s9ul`۔s5xhPl?u]w[n۸V/=q<ܝ:Ǒ߉&چd Taa!.drA֍MxLywI!&sdDPzlw>,i كn (0HÊk货aG&5jڶ}]rCq=jf T+;qu>#!A!ԊMoTVJZf*!B "$(݇wU؀Kp`(cp8-F-3;Ŷ {56juه}X5{VAZ4 dl̡>9z AGji}q˺L+( ,ȱBQQՈɖKA4@ubu/h=+_{nqwVSuFEqhG6h5Gf>"m'ƈc19k6 Pta`hZal;5&X&#B IDAT!DEWZ4Tj lg:8B1.u=L: Zgs Ew)A\w ȚG)rv՞]q ͺc!y`l% $ !_ikM4+`/L(:iֱ44pkG [fF1lX9jmȦ~`^npϽ=4 .1Gs$k(mڒ\Y B!DEWZ4TM{ʹBRfQ1ګmױϵUTOpr.1/v;F|!Y[|{a6| |Ǜ!J,t]'#=jZ}{KhXh9BQ:ADe՘(FmQk)Fs%v;6Ptgv ù";h՝;6/FQˎ EwiS<;ߍW&1u@_Iܳ'Y!)P5}ƅop[!u GAEsOm^;eQbQ& m=,'--uq?M4^=i8իu)B!*׶ eJT͊ڦG?J[ӨnڴlǠ'f۶mMUmOUU4T͊U+D"V5+fEU4תZhLrUb ]j_iRUB,N7bнg7~~~̝={1/m]!BTlޕXxAKtF4;Czz:1Ī GJm%W5*uTX/~=we<3Hl֊-3o%_p =:"Y+<3g2K̷ޡKr7%>#oNa*5Z1u4*ʔ)tЅf ܡ ؎~g:˧Mn,߾m@BDv؟v7iԩSBޕXxZ]& #(80pa4M~MhGli=ZȊeW޴l>ơhFe|k&C1^ϝO>2)бu2-$2j~6mw;owV5^J<s̮ iSy>?/.QŶݴq3_}1cGǕ3aRnVm^iDDpBޞ5_@dT$}8 G2aD=9o6c*?_M݌'ӽWw~ܰNV>Ѷe{W_իc%wB!*>obQRIk0t n{Ĵitr]6qƷ˿e_,o^=gG<âҰqC |ٴj_cTle׎X m&e/,Yy凍3C4N9As,[v2j h=>ZXy[h)#NBbunCrŶ|n;% bݚOXX($wJYDDSM$wJq޹___4l@xx8wjо 0uhKL/[Ȩ(=UVegIO`3}4m^KΝx'+=BQy㤹M:oNJ$Ĭ屁`oOtLUb c׋}G/zލ_ Ӧ}+N>#GG m6uhC`?yyy?z@?j׹ ]WYl%U##xɇe3Or&sT]rRY^W322ذ~#]lSUlohX(y444lv[ObCaa!dffR~bv4k6˸7Ҳil7uTb% !w )e2t0zv%//}{17灇%~Ste^\8RNҭg(M5fӆ-TYTfƟ9y 7(wޙ.'`Ȱӓ?v ƶ2OӠaP8}=(ߏp>B|楶%u/گ9ަ/&u<l#~~~: EKtbb)T^J,B+W  z kVaۯ۸{u ]tcb8q1O4RNR-.MW6֯@Z5hױ-1Q|4o>t [iG;ӣO7VFFEuOc}?cŃ`ƴlڰIOKwY̞{4˷_-dUqF}t_ժT*U]ɬ9x )'Sؽk^>9zΜ͉'HMIeE͒EK9a~?tٻʴ &$AXaCaAVa]\EXTURTpe ,EC*HI(9qL&  pFS+<< ^dmbR 2QWX\ho.DvNNDrR }?n -۶oXӞao÷+Vەk93:w Uvkףˍ:5~Ok{@oBtP?gfgߛw=;9<=Ym?T!0Xt%T!=mE+_ed=vISv< aaaعϣGb7е[ OfwaQP)_ƿ? ÁhDFF 9<^:A]>(wPOMl/ 潍S'NI&tV*"kD}DWwܾM7*8&OǙ3GC捡( ^_0sG~t&?1sعmc.W*:]w_5Yyo9;ʼ5amÑ]Ӫ!! L? nh;'/i'SаVDEDUwGq>?W .^{A.ʴmn~V/;XR]ws!:: v yv|e;]~__L*[,$1 1Ҏ ""-uZ怂 `QUt&;Ob|% ǼQUCP@2sNÕQS""""ٙHJ5\PUߟ |i|MCÉ?iG*{JDDDd(W AN a:Ȱ/2 WQ EN""DJ Uu Nl bbc LdCFz:4k_b@$$ B="""@q1qq8 RR+{:Whi_ϊŀLDDDTb_Ӡ2sĈlllllllllllllllllllllll*{TBU7deOlPW~~~Pmsr}ivWs#80ŀ\?gOXF 2eVt&"41U YL1+|.N <,z E#4öϯr )EQc_Z}o6L𱽂b)Z nn+9'yۙLI=UlHf@ yqBLjʞddcϑ Ald, B۝:zsA-^@ B$¢ @ VJ# +SOF&BBHme,q/= !l[OR1Ę8&s5490g% D ʭvZo&7h9]}xksr*T-Q#p^WF;@鶂hCTzF/K)LAX^V ³*V FRx$=T{W!! ar% ƬUUc`u% !*%VnjR@*FWo?k{#ں;$`](V6BYF+|6O_m,*Z_ªK(ҫ:afe8 ƀ\9|QUWk)T^#ãVaھmx:$`kPզ`qida+^yysՓ>Y6^o ]Ff@1 U}R@7֫khEQ)%[X pknE ;~_z;٬*[ i`3z~d<`_߸=fXa#UK*VX UCa@&""J}-*[m =J-QUmx/շUT_πX ~=u,W_+ZP ^ؖ'uMXH)ؚZ!>>pW%ϬLDDTZA6z}𨸚 P^S Y%z (͛'aXX7ىAWZ}EԫF"ǹW_JlߵWs*߸p]OCv<ǀLDDTBjx҅rH7#gDwP|hes9Z,.K{S|b֖'-- 5$]X|y n<2mł+bzD /UAZIfض3}۶m*}ڮB (jc !ܐRпVB%֫]tR[z>c^p =Z(&*גgsi{VX t?>x_c#ñ껕*lQP&e$}|UFVey'|Ly%kvoS_-z@ĈQ8yTǘ;{zuVMڠKb7Lm7oZnj3ͻ(SSRѳk/h =G|l*ޜ$v3Ϝ6\}?h04kov*vN>_ӧNcUd""+AZ,|VM/@"88`oPO==9998r0pcƍ{ѩMgtl XU-ŀ7mvx!8j&<3Ǝ3sga#C^nmvpPlu+!tl 5;o@B{yK/_bba7s,lڰ|6S4iڸm7n؄)/I/NĪ[|2Ro~xӍ~ZL*FcѲEx},u˯(,x-xʔW? z ̜3n5cSNac#w@_ޣ<1n|N8gԙZjeV|QWXR =àGLB K/3ԉ P ˾K?CV- 'ɱO`/Ѹic$eg}Dlߺn-Tly v؍w/}Dl?|h p!l+T!pIKW];aܘg_PPl-˫G\˞^c6mڵA{nnλ@Pㄇ=E戉Aݺס{hڬ)v @ƍ;qq5b_GsNhs_-CTt4?'ԨQ< ۻ\fL_%^Wgo޾ {Ng@Ppbbk .>!Xb|kSOסc8q$9l>ta8o? m6t!!ACѣ DB KWFT$ ""\Pddd`}E^u\/UW?YeXnLUUdggtpY߻ @{ܫ/v???䠰8u7lP܎~-Z~ߏ 7⅗^(| DDDU_>(ǖfӿ7w^L}y:p߃-j,8z,V.>1asu\sm '>;p*ˁH;~hӪȘqh,Yu^;{ղaQW !#F8 V,֮^m[AJ)%ƏErRLԔc !U{}uFn٧$֎E}zL6nѨ߰>>⽢)/Kǹ[,xh0̜7D { ŞݿA/?[U+V!-- G?j_*ƻݪFZj0Λ8RSR{nsތGsDrR2Þݿ?a{ׄIϡsNcd""+AYbq998}:I)Xr'lJaM{V} ߮XoWArR ̘ܽ3T!Ы_Oڱ?].7vFH= WA q`AGB8=}oBrR2Y>Rz{+2sgPWgcҕPcѯ|U`Q'MA4c?s@n]ЫO/tkr9rwyk>Ðۆ#'/U5CB"$$8~ ?vN^.Na&.}"""?^[|~k7F]Y]؃]iZ_wp_~)?($,xΝCttn<×G GDDDSA+ɟF ßF ł+{ť,kd@9 ( 9bADDTDp`Ӳ|| ȫ1oTv~̜perFTlv&G W4T'XAXA!DP@JѴ#=%""" @+ ' .2,YR9#rrrVEC*JQW_5?8C(|IDDTH)1$im{~ALl,ivWsHOGf+X UDZBBDDD(.&@"'DJJreO6Y*X\LCG e-ӿ|lyJ)kbkv&+GR!*2!A <{ 8[cDleOtsdBBp&4!!-ZHz0 )PGTRHRaX z62j`@ m+c-xaWa zy&ܭo/71x襑9P7.'RVH;u -BWt&*"aNvށZf@Eh PhG x^V Ί \sPq c ,3a{[5 z26&{hXc+AXHy>PP]>D3\ W,D7f嘈*SwyB-J šUh[!ZTGFQے$`](V6BYF+|6O_m,*Z_ªK(ҫ:afe8 ƀ|q8""wtkvfw+0m6PnҷIzHM (ګV()6'q}ïvJk\Qa r㤮 )%23[S>䙕3gqq4iڸB 2QVl "Qq5Bf³Jl[mP3X7I+[O°nEl_6W Es3&mg8+=mf }wݏCU.S_ZmU խ^q6_-P}nz[[' !TniwBZ: !팗[ֻU*Pvk_ *VUUЭEFfcg[hSU>_ny=i{S<{=>z(|l纨ƋRSUKj ""*wbY+bPU. -Z1Oe5nE{.Z9k^7ݜWt$d{A{F(mB :x2+V/34*yv>H?.+DDDU r;FZ1n8z@a ǪV"<" @)[AUqҊ]-Khע=:킷zZ5v-p"ԬY5kD511Y&cK#5%nvAƭqXV4%np8hOkh~CK Q?oV~EVmǟ<9.4 H'"e_/^s\d""w$ Fc#C76m܈{tFVuPB,__ y36mG`31n8j!Tsga#C^nmvpPlu+!tl 5;o7WBB{yK/렵Ss.CeO[3¦ o?>-`MKD(+S^)J#+ڃEK7߭BTt>xCLye2Yխ'[-Oab?oߟq%_7}㙿XϱsvRbBQXf9&LÇO ""|=ŢhRj1 ,Y P''@_./ -Z~ /L'>˿D㦍1rؓ8}vWXŖ`׎(pj+wJ׋b͆o1B'NĨAϾ=tܵƍyڲz}U^c6mڵA{nnλ@Pe8၇\Klujaݞ֊G||~r$]FDuuUC?4=s\_oï[~Ť'"&6B6늌 2QBT/^/@b3з{to_C= 3XF (815@,|1nuk⩧@bбK{8qGAnn6:аPطyضe:w툐 !Q"uRŊ+P#* }. b(222߾"s/:b*իBΟC,Ԫ]Lgdd` XW2UU ycxsp|}+v74@zzuV["9)!ghc\&@-lˀLDDT[VFO={1 }k\RGk#5wYظ~3jթ6Z#f 6mO3ԉBQL|9̛fMG`H??ѥMwsl 2OQFJeqy!((8rZ!&=w,wSvweJJ*,:y@#5%}z89PZ5p` +l ""ڊk@pH0"jjbضuy`RBHkX$'%˄HM9REϾ7awQnmt 1x}z@Bkk_W/a /+2W._Oȸ[,xh0̜7D { ŞݿA/?[U+V!-- G??Q]16ۀ?嗭ׂwp;y;r BUJ ?/ȣS&Ūpxv܅FI&DsP@~=knv=[#$^*Oǁ{ p8plz IxgHNJAjqݳȼΝcC3_KWB˾Z^DUVAcG?^4i;I9m6;pF u|K1ݖb!Ġ{ŸGZ*f̞^z_;Ѡa}T^0axL~%Тes|X[xŗq]!@݄|q|VKYAƼ9 D:0G1; mbkX0m:qM77# :PY#;%p_o;F!Cq& #1дyc(Ĝiѻ# ztńz;\6vnۅt4zض !Çc|M.G@V[@2xgrpߛ{Jlsߚ.];Wsrv2 k5ATDt́Jh^5n^&74Y]=؃]iZ_wp_~A!GU"""2y 2uUX\ɶ ""*KYv:ɀLPl ""jdg"80}/y>._5?!34\.=%"""ҝDRኆ _J ???9 S8vDDDDDb r"ȰdBHH>䌊Ȱ/2 _AE5?U382!""GJ Uu{cHX8C+ivWsHOGf+X W B&""%.&@"'DJJreO6Y*X\L'OgZ Qd? E#4õϯr )EQc_Z}o6L𱽂b)Z nn+9'yۙLI=UlHf@2+,,DS84 #b+{JDDDUFFf:فFƢP-:zsAml  -H iE!$&(0RFV[$>[4FuǠ"S$F-{ƶ_"kDyf#Ѧ]q"TUEm/Фioú >r͘=oERzs[س{X8*l ""*J3 aC} ˅Z`Ԙ'вU ZuNzE[Eo3vs^ѵړ}͢pnmc쫥| 2 +V/Gڵ.=Kޜzu[CNdggKߠshѨnp~'99.4 RX6nƝBѦY;lX\WzuԬY5kDhh(]ǝ;{zuVMڠKb7Lm7oZnj3wu߭m'U6x|HGR|u6Զ &Ǜk֢Q&hT ~}~=]xb(nG2l,^N=y_~m\-aWKuz}۱sv$vH 0兗0ʼnX+PWRdL>łdbQ4~yA)V@~A,^g  A /}ϗ~Z?&NƓc_q9IFNؾu;B[ڱB_~ENؼzB-=WBɓ5/ٷ'v¸1 @[WYJZ,)b+Ӑt4i{v[~Ŧ7 *: b{uVuߠ>FT D\\M2e $왳%mG왳p:2#8$5k,yR w!22{tGuCݺסiؽs7۷3PNmk3^ōnpq:22=zވ{}дY d>)k>(d'q/ ٭-[9Nh٬]bޚIq(( w!|+̣Įz긮nYu6 S^x 6lF~~>vKu˯e";;|C0 زҌ5}F^^>ً/OGPP{^ SUG=<׊Gj1BMqfԪS mڵFll#N: g 5(s7 ̚:#G~I$K d@ƍq;)r[3njkW >>~ހ0WX㤦RYY1OcsO~G5UsΣ;E> c_dݛBj1p\f[ Tq0 ""bq!$=bmAR@J aP"9)\&@j1Ԍ*z [:uksN{o ZkG[>Xr &O| 7@LhoX}^b2 ŗ_Ēb玝hԸ4k N[z}v?'#>>}/ uj*?];wiR{,~y RS0klWPPU(,,xJBBv܅HOK—-ªG(r|VJ)ڛ )ӧ3e_-Ǐ~B˶ִgEv$'` w*z];vㇵhI'a5=7T!px:?HÁgгMHNJ; GrR RSc}Eu,l,_EVIDATXr̞6"€ ۴B~1w|(Á`/#/j38q#n~~5w&+܅^z_v-΁Рa}T^0axfL2B\qBL47?l;cV vl߉/'F (({ߌaFwOܥ3! yQؾS&aݽ/al޸YA&""*ܤƼ1rP|EtB?Nz65ƿw,6ޜBEdjWwDDFiBš'Fn7oOM7FDd8^_0oCwc^Td粱s.C;‘CG Çc]|M.G@V[@2xgrpԞ||4nhO{YW}GfշϗVsrv2 k5ATDt;]~ܽ\ͫf<{лK2mU.+/v?j.q|47QE]y1=TU 8գÆaC*ul ""*Y7]ϲIdZPl ""v&;0>IWcWAA9 W .gDeO8Q UuYAXA*A'BpT*)UrD^ȰdBH,rrrV:d*3EQ_~ x2ѵNJ Uu{cHX8C+ivWsHOGf+X T.j! UMDDDb$pA$WtXQh,Q#.&Aegv0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \P@>uADDDDT%; LiH)+b>DDDDDMH/1q,#rr(tXF*cj{r7GrZΞ;<)}P"""" @~aΞ;$4y+A!Hl[:5C|L-DDDDDZ^yHErZuDpPH(w@h ٍ[ס]x!]R~z]P8.0 V%:^DDDDDULDDDDdÀLDDDDdÀLDDDDdÀLDDDDdÀLDDDDdsO ""kKn^. { ;}4ҏ!+;2 CxDG{_d"""*U\sBj?c#(Eӎga^k~5~~^5~F6H?zna W-[/\HԴd"""rr*T-Q#^סU4@鶂z,z c=hI3X)zֿVe>V FRx$Eʴ1$$œ8|k}l&$4YQ*90nʨ8K)`}HⱢ 1؋z5޶؊zLa*³kcHF|f )7"lo`),, /ZJ%PZpn` WSHY%Z20+|J4Ua6àVy|m,!HǪ uiywƸƼ3*u!^àd~N|aEa]`aT+ؘymֵ4NB1"~Zص%~E2~p4ƥyވ2J Uh##w؊Sb-L۷5boBF0qida+^yy'[}_ f6o U3v(zf"Q.2JU@B+yZx=A1Vzj]빝cymR1CdcپbT=ǰIb!%l=F?4z1Ux#m{ bh0BjGl=B]r^CS+U7̬4 BˆJe "wT+7i=fY=mhEy2anDѠk hƺ3gXq4mĬ.KlVi<͘m"KJjP]^VȊ֖<̈́0oރЯQI7T[ۘX7z˸?6=ƍ0PaI筍Pr QEemvO^nc:F- ʰz--l}yf|Z^dAͮ 7#ŜY!b!ݶȦ*GYf7{xr9NѳĶoF"UҪXKk;i׳TZg@.N -{=@j7o~yfxfѸqLo;7}:i9϶TZ[u4@ǧ/ .*""yVT ;Pu3fzc[=?Wj޷U+t:h>!=u+hɫ I tdvZ,}!咷~K*֯ކVKvBR-HI5P\9S=}}*LN@ez@!$)֓[,H*ȷ yX()[4dbXU F;{kWsQZ^ [_OŸZuf"uذ:߈ &Z!$ !Ú%!ˮ흃!p %YHOY+o> qS{̓yӐb1cmʞ YGe&f{ka[ 2t} _$Ѩ \8)s秦h̚]3G'>Bˑwa2'{~$ }@U8i`ai1Zb%7fSi W66cL A>$|b4%fO -pgU[LDDDp=ntsYsh;N'*5/:$I@\Hy5"BhltBC1}2vj[]!YC\yXxQgc \$\AδlHk{˟W_EOOʟ*`T>كLDDD"T3CwdmF#:^鱽v A k,y#J!$$%'yՉ*QёǢjΛ{}d+Cb1 *f{GQt1/.F~ ȒppEHJJOCѠ|ш쳊)DDDP*%͂ee3⡹>;k+W"2*k.$$w#1eL̜mK~n5 z81)s"K7AzF.]l1`CtL u% E9.=h`r$por/=R)9Y\Y`ZT IDATxw`齃t)T`WDE boTT,Qt}OKGffgf In9ܛѽ(iοߗ% 3kתr8eN1h+?@y)C*/Aޮ˒J=Rp¹ʨ(('e?-K|+WHY+2S_vysRb? WEYDiuYV,/e%*;ofqn+(dT.`E FQSb0wZzՊSF)Q1&1fK@G"!!<ttttttttttu8qo$KqgW*ɓ/I>ۂDRE\\ٖCGGGGGGGGG笓@::::::::::g!p\EEUUdY`1JnbQG^y7d3 V<9y&Dc5u!GPP;C0Euttttttt"MAaצSDRcm#3'sY~8_n?=ʆlpRELL) ( B$IfbX0ҊTq8(pq)[21[-DGJa̰^$[_yhm&KR^#uX'_ ]PHÍ[I6`bƳ3-_6`ٰ[ ȒKIm 2, 30q,esa!"i/;|[`ͺ|4{6BQ37TkEtlτ2!}P҇#ݞ(hKz+`O ݮ {8]E$!޲]i*UBtttttttt*$I:(*B[dlwmŗ+7GӸU$Y&u؆WޢlLF OgDEىM̜5KوfTH2v~XY;R 'Brs WTdÛ٣IWX;p؛һ }l8Vrh5:nAlӀ j>y@L}RcJƩ@[滿6+J%I.@T&GO1#S%zD雾雾雾雾U&I2:Uqd!ol>uҚ&[[ND?*;au !6>dbfPPXlFU5jtS:8ߛMxu`vo;H@t1ZGxnԏ+bHFl5L]Ҥ{Yb#y6nܞ$=,hQE#/$XZe˧_$d#c31}rkrE>qhyS b\D\*;>y<*c̷QtttttttttJţxn͡ũ- ,[V9-L͉%_6c4o ق!'svki\߱O|ʷl*aY7S (@t2VHMrɈA+lJ=w QIfQDP]@Fdd,H0</l"\|Oӏ,ߔMX.n )op8Os M=qqζ::::::eRPϦ8xna2\fi-Ϛ::f$IFF"e(@E YGy8\[Vb㈲F_buttttt"c'rr6Gc~"e&:DRB3.ο{vGYhE?@vw=q IK )| SHNdg${g@щh Y/.~INgX:6Bjt5=;=::UhBľ=<#ɄsOR;xTUE,IdHBB*$OZ:1.$+(F %R' :;D#U\kg$ɲE2z۴sMSZ|֌HO&#vnCz߆x^m>z`B I;% )X l4S /'6:U(~XTQQ(҉%>?d!yUGQHBU\P5ߴPVrpN*$㰚$%:j"Uϑ*WUs3d"LŁ}ڡԙE&yq>Ѽ{> QB E*-WA4"؃}uVp `I|뺅TR@<׃s x+*U_EQ /^UPAv:6n|j«\<`n~{Ǟl9sٽg/3";'_H7e̶{ciG y)j$,q:^1&|\7̠FrMj׬C&vp~qq|=0 t9[uρ*3}_GVI9.L={+7K/#卓k^~Ѧi{|irrsw)q _#A·(gހ(*TEAhx G H,wM[9m"''5ӻoOn{7Q_: O{]ln=$IDGGJ꺡l65 ~z$UظRR`Z;B8c Xӧ`ɯK8y( 7d5W0aU~Gٳ>˹_rAv;cݷӥ[9])6O?Ö( kצ{n :eb4b<K-IخJ:Ŵ%=rh5o-#n~Y111eO.xphS-tΈG0\k4fٷw?;!<SIy_ȓcS ȲDJjןǟ]W2{Hz].@meeExe zw~7.ĐCۣ bs+~ɇi&}]$$&s.>x?}3S?L5OIqULy:+(,c<4kє<6Ȍg2|&L{j0a yXjR7:eN3};$kTrsؾmv|3{.o&\5t m[!*vFgY~y]>1}摧nw^o݁$KAe|B}=/G 77a´| 3VW0|֭^G~A>4`A3>*<ʳ}7oAAMNY61>ZnAnN,YϿʞ={y`}e&EOX/D˼yg4ɠSww||</pՎ:b4jƋ.L^}1}W]ueYU۷6b8]NL&N7!1Ƣ`XHMO)WU+ZIչyč}8lG/wyN| 婨¹Rk/ArdzYTO[$[v^V z`E8ݰVKkW" X'a!ia=o֭ۈ]6uh~hKAa!k׬~߅򋱕pS 5JlwjǛ_GȌ3 z/=2oޚo#+8.F2ꁻЩE3?a's>Mjz3SgrpA hߩ=oMzw#+8QQQ\4d0?)3` F7~#L|=~Z|ZiŽcF4=ڋok.Of/>"&۔3Mڱ􆩴jnt+pyg8]~-㢟8yţp7p۝;/? @붭xphjܜ|BfLɡO1xрJFQ 7l&q,V }9TUၻz,L~w*vvZ\s\yP?i|YI#O-כZ{yn7XbL:x+])oѱvݰ~##n?$aZ~8/6nȘGM:|ƳF.}=t/ <ٷSfN]cExP}wr<8Ae<胤ٽW 7O6\f|MȨ=<݃ 8胏fUd>‡?fEh8ݟж} yK/>9NfO?p߃R-3,Ӱq)3Ѣ=Ͼ?cArĬir$(yԨUa7^˕{˛F0=(t(C-5B34t5Tt vۯ*nǿ_e*4}hYcQQQ: ˍ~.o3fx7i -em\.KeMڎv2nc9ЩkG~⡢q[J?׿ɓdW^-SGہ#s|ƌPU~}y}N/m IDAT8z(Wzݻ0/<~ ǎe0?H]~m)9Rv-l6WSoX.ygTRRzPm[J&=CBBC^mwZ4K'׼Of!C^cyrWr۝ߗqP&Cʉ\?&VXEN{/kWcw:^bbSo_/4lb?s<ڴa2bOYIP-FNr灭[qhO<+֫{ƌnʛZPY>dǘsLfhܤO({TX@E"#u޼];,h=O[ݻ( !5h> g\x̛o/@E7Z5W/!R9.{_jjN/9[UUbcchզ%K~Ҭe3l6. ˯й['j>3ƌ{LӬESx|9 Tg_ٗSoGjz*O$$ѥ{gIo5_ERrRkIGtLttPt:{3'=+{4HkA.IB.z·=][ؼe368\?0xi!p<< !i%zR;+P^`:;׵GW&9B;ķc;i(FiJA}z7 ."2jթU O.Xޙ̺4c0hM-NA.3/=nEy4fL ?OFl{#i$$&iѐ6@~=K4E(ohG3RN-oAZTc.\fE9/IR<_&^q<=Y=FbĠ2+j 7^rnݮ/Çacq̘:`9ߘ*k,K Fg$;5L+qwхieH.wv:?q'N@y3Y釟q۝vZ$I:p)gbZ :Ca=oPkoQY tC4h_0{z ;KnN.h;V~Η-e%tv0fQ5׏b+O3ƻrԨY=HMobAePнgҝ?a =_oRSHX,]XPt(Ӽe36kʛ7mJ)Bؿ YY_:uh 2oهR?wа7jn&)ɲ`@%=cC7cbcB{8x7>f#0Lz{:o:WQ"iJjE4%Q|)|ftVR{Cuh6kz?-'i8Jnʧ1[хoTlFx2Ɯ2y<#طu5#{Ƕie^n'NDA9qZd +PG_=NjOOwlр,F7qvB3tnw}WJWup]JߠnU؂/ㆀ#d᎗vЦ}R5+גy8&͛R(_}Gjz*,Ѷc*3ڱMMذn#o SXLyVwǞKE nOy@EZ7GIEW -[,s +C'dfE^/O]V-_źHo_9b!cώ#>!>_WIN}h\\fާ>O}.ń7'_iզ{wse^Ut=>C;.ܮyU5%wߘ]f!5#(P%I%)o(*KE__XGp"$lJ&l޲5(efѬU3]2@3KP }z0)L>/|2|:tiObrb@HpLUkנAFآlܾ˯Rp%ܾw<&UOhQ:=|j! +ZIKC. 6ҽW7Mؿ -KgZYqB:9iߚujޒt}ЧX}5jiz]l%w*vҺ )0oRu6j׫]_>Q>Л<'ΡπޥsJzRSdGLlѲ\SF*qqȲrAgqO\fZk7EQ7mIJر"m;%Ycoa"tb2^D-+oT]F,[wՔX0V}a/s~uE\5l(/tlG v˵A/.጗>!.>t5נ\Ά~ur_:Of͡c4hDtJƌo<֪SFi5JcϞ}xhBjzJ@ixȲLzŖ;oݴ:ҳzeB%(w\[*Ã쿸 P,]gB+ >A-=;C$-Wq ̷_~ǶsoA~{'Mf~j}>o]%C82^U)wy;D;/_|Gvv5k©J/rذn#}.S/36fܩx=eʹ PK^̟/cʄiTҸYcV-_T嫐e2plڵ>%tQylO<F? t1hܤDUUzɇ>慧^fb6icNڥM˯7{qèQ:nIsAד}zf董l\_,'q.b5^sŬZv yG}Hկ䟭IkJ~=ѻ<HԗO~7Thz=f^y0rtw1fLEMػgߛKoʛf4%OQN-!ic}ϞGZT9ƀ;Tt-JSV 2 M_Vlr8e g%$Ӵyf[PN- ⩱xSiڬԮ[oDzo~}@P5~̵jbY%4o՜j A%Q;lcW\s9^;#Go`bs '\<?Tu}{q.bQP׏" 8qsuwo[OĀw>M+L{5#TC^O{!1)2蒁 #2SƿO8 WLP ի_N]b5Sb\Y {I:5=3&J~^Ւ7/:Ąv{~}{'ߠ4t-Fo/~n'Q*Cs!55c q\Чŏ︁#Seӡs{=3)1eT 4ik^!)ZPGT{P^ZLb&3IGiRa7_eW^j x R#zqޟsf%';x _mgGsأ\=Jڴo]yݔ YVѴy1ԮSۓp:A=mZpϘw8}Ҹi#&|?왟rI, 5jנ]>ƿ6LpGvҔ+!!OgAQq價B`Zym+Lz{ />2;q#K4H/= X&jԬAsI}SOywL>ߘDA\\m;m{&Q[[žGg.7_~\v;))أsg u' yWJ:5˴B7NgT^x%$Х}\?sAH%p#yohѐx"..+q(s= a›xn֯K]˝7k$s2sïԮWӯC]l}_d]iW{ d-$1K!DxEH}O*V,X/*oL?o7U%U3҉T=G\U͹HLv]7q]7E*Mt- S/E|Uƈ{o (7rC/ezUwEJ܃U9U,tJFٙ!RrU5Z;#YH-RKL޷| P5C`I6ʸ}7.XzTs,o$}!Bcyo+P,fU(_ǃb%;'3j. ;":;3D#U\kg$ɲE*>}I"  o+qr25L#,$;$.X>Qh{xFr^~.2Qv=m^S醜=~lp^zTs,o$鄮)Dү|z7]:M9JI_:9r많9JnA'sދ( wqttttttekNUx<l"IFHp AebaES=+7E}YGGGGGGGGp:1d6;Ua8NNVJJ$ J\Lz5 ٌ[qtt"!P1EkfWٔ/i}Rx_!ư(2J+ Ԓ4w%mVl7p聲joIpۍ&JzuYGGG Q<>vmhlSd8T5^QԨV9YmѺs^"lAftJ5oo9A!Qy} !ilhE@'B'Cg8+"FsB::::gUr rPlrZ%ὀV-'2dU(>!.h6D_}qRB_ZB!|nZ9m+FB+|d 4|93~P&($9H#4ݙȊ|k)FןȲ=jUoyy\?rJ<._G|EUUTՃ(S"T'UΗƟϗF6U:T՟Ww_Q~_>Y}jQzoB +P%XNAmF F,x1s!'79sp7c`YFG<|F3 촥[ha@U<ǐ(^-G+C+74w !#y5B1<߂"6 o!-E>j ˇ^Vq뮢S玧]m[Λy^$&&벬^_1cG:ttu lpڐdፉ |>??-I ~+YbwXry-)ya"bu7e}v.f$Zb+ % |/4g ⌅9h% dfFIBtd8Dsϵꤳv*dElgXNOϲJS.l{*™e0oμZ7{n7/ eFkn~KjV\Ku*OeAB @U4cYUՃGq*zPT7lBю)- ! ?V-ž=wg( KR%h֢;w@J޾;0cLCA*UƦ^,sAYsS;`p5onRӝ.:S^ڟw9%ݿ?ƍٳԩS)T^(:u9{6tT(JWb*t։.:j5FV($cGc `dd}{*yUCTX>Ce-[׮g899wf?g>ݧzji*[:YҎcQТԥ}H*!!1Ly}.^dt)soM@lǛ(^?\f[:zHHH,M5@N\:d c~Կ/_ԢUsvhdɒXXzljOjCE `˦[+~ץq+SG3+'<,N0I\r ?WnLL ;Ԕ!ÿ&>8PwҹRIU*ܺyݘHhhX;C UKQyfz?ѼYI6"..}ҨQ#΃ꫯx9;w֬YØ1c}6g,HjWC, do ? |JE;{y(m[ᓎ 2>OwY'^z4k4 [K!x}4N%y**tFhqa,֛v l^Z607;7ODDDs.\Js.njVJw6 QLqFҚ[SɫRݸ~?!44yͨWǍ-0} 1kF-:byۆi޸%w-e)<۶l#4xzM}S}rNPƽ^+׀wIUmЏ}?VVl2Sx1 K㦍/s%albw+:5ɓK.adof޼y7odذa 2Wr42oKכ_ݙ&r K c'->e3͢RJ/CB8|0 'Z3~ҏ7[ Ow>ذdW(E.Z45kd_GM>rMP}Kʕs:nݸ%{tW|i 88c'paӝy ֥98:9ҵ{:vj[:DEF1mtoAxx8*0{gJc;;[҂.:- xL"vԪS H? ?~ Z-k`/o!!Abrn0c,OpPq:8FÀ>uAT*U(˷s g+L'\VcA~$?)|g^x 6bkg5vvlX1c~Y)]Oƿ? |Y&#NܸqSf`ee{FW\c⏓(Xݻʋw8vЁ|=T*ekzĄcjfʴѯw6lYjOVE|9u\rh>Ϟ}|x]+ r>Ybutvv ۖ7TBB^Uԟʒf1ԭ^&7Cvo /h1q~ 娺v]ĞkǂנR8t [ntJ8ҹ5NwIi4FS6.o`_9m&tdA@L4>uteTT> H~\%?oΟ֭[aI%ޤgZ+siSUʉ=)122tܾ}HggV۫r%6o™g+@615MVOz{r/*W:pXZz56#ھU< |žtWG/@^0e!@UӧΰqTׯ]g׎]zW׬NZy>ߏwXFjcUqppJڱ W7h$^l۲/^B XZYҨI#]'<{^y}VKy-8vj*hkE ~^.{i*V$vdz(ՓS붭عYmxWx9Q %ju&O24UfR _VXnkR_.Cbŋ鍽z-"M!/B=R8cAGRN`Ϯq4%J|9ph]^fOmCRߏMJ6[4###>#_l°/GPZUQ_'ɵ|u55Eӝm[Sb8Ȅw?Fs R`_k055Ɔ3']nذ;pBvMJM)t9wuyΌGz{Γ/hZzu9M"_|lڰ-ѥ!Y,^$ "RF=!I^ Z_2 O:Ng)ZJ8ͫde~]ռJ땡վΆ!iaXX[Xs7JY;J@XhONݫ[󺺹Rڴo1Ϟ%Kw;ALL [7mı̚;Hijf{E Q:cFIʸ2$&7I~mßѹ[gwj-W3 81ŋWdi,^JLL Utw׿rjJff\!/ޣ[mҽ3+XE}7sbbb1u&4j(=ch )£7 z4oC}i߱yyfG2T*O-q}>nqڒݮ]o SvM euT*{Rӯ7Ԅ5ϽW߬yS&O䉓ع$QȈC2id(_<bߞ})&q4)ݜѣRJz3T-Z4 #'y=KȾrb铧hx-8q$_ "=ʰt2,ZWJhZbU9`ccʰ/`9t0uզlYB`TW}ok{nYl% İex~?S.=VmZaffʝwhܴ$*T,of4/_ΖATd}f )Zc!lllw^wyt+F/8u4EAǂ:~C3zw^.ߺI 0~o#_xENat Dڃ\Ȯ^y +\NERm˲UK$~1JM]:|׺/ALL,G!e(yqvq2q@&MP( -5kLq_ *?f9lݼ"EP7EіRccaa ,Oeӯ7FFF^VbaakiKmfffnۊ?,O6MV_]?JB?.gޜ+^3&S-=OiשI>qOJ022ʕX~^E͚7?Xh 'N{;;[oKeW!a IDAThԬUCWF68r(MN4js̚>=$@~[X4&qŤ%Jhsge#P)Zkf8@2c2'NeĩDFFR|YZ7@f3M`mmMr^|Alhɛ׌6q1_װnu:x[ymUUfwCszvnM(O .!EFF2bDEE붙0yI !q? ЃXi6:&z~EIB!":T[1%_FG bbb͊ allfw3[M I%IV|Ҿ8œ6Y"Eƌ-_F@ 05ы]ɶO^z8vz~Ba`J#"c"o R|hMHe%>!>|Zm<(T156BPy%@BZ8/à @jsSsLxI|)/J9f|8bIHI B|( &ETP$$h151%@BSXe7EHwZMբKp,j5<~ % GM@juֆ !D6Т%N2BB S5B^)S$enf yM-Qdi] !B LQ175UߠP(PYB!9Z AH '_@!" JUjjܤ'>Q1Q<DӇ{B!D.bcaC!{' :Z>:$@NjܸwϒjMB!D.E \،&g Akyg)B!D.ckco_S20EboS "B\ɾ/| `|X!! OH, FM!D,`Tʌ/=[;9!B|p Od[|}5 $׮]˲عs'YVB"H =m:%Kx\R{L)K bi=zDFrJv7E!0(C/ B!DC,@>(^ЯykWѥ}WʻWge~_/Z4Kp yI_~899mP =z* ={PL:uFHH* 6͟?ccc"""2MO\pubnn͛7OOF(\0FFF㓬7ڵk4n333 .KB@Ppt/BfbB!Zmqq1GEEӵcwi$bcb1m}ze͆U(J0GB,\RIȋ2uhK9R{Ϗs]+FHH/^$O<4ǎĄZjǦMt9rNQTL2ErQƌCHHk׎EuVJ%zٹs'y2j(:vxuۛ[0k,]Y+,Y2] !ٛDVH1@>su+fV,Vcgo@R%iլ5wa<}~>Tb=wA*%þ}ٳ'BCCd߾}Ԯ]>#fϞ۷)Y$#_|8p@W8p @'5g~:ŊK4oޜuEz066uܺuRJpB֮]1<`ҤIzrb Bw}R ]\Ya޿s륹pήκݣ VV?woKҡ۷@dᮈK"VVVԪU]vgz쉣##!!{ҬY3 1633K?vX ŋ<~'uuqJ{MFzXf{ߥKJϳgϰFEHH/_|zB.[fks+{|)lŭߎ; R$ҢE vM\\;vaÆ4jԈ[rI011aÆlݺ{qz聳3;v`֭,YRףI`dd :+WP\9zAՉzX]...?^ŋ\zsss!2wӃ[7n,Hk ygYOݶbŋ1r7z/\XXX$,>l.iӆ0&OLpp05k֤Yfl޼5kPzu)K߾}{ŋ[.fff4k֌ 6~zڷoW~FӿɥKxE̙39x Of޽@Dz߹s333T*=Y!POdzKЧg_;o04jE.3\xcG?~ggd7?ښ l2αcTRL>ݻwrt-Bf)d333Z-Co\,\ JHG}ئ37lq)W,G}1~Ùg3mDΔ{&66VѮ];CǎҚҥKJn& ///J,I͚5ucy5kӹsgK6<<7ҤIjժŲe˘;w.UV`ԨQ( ObocmmÇqvvfРA4k֌'#]KNӦM>|87o|B$x"3)oZk^DDgy)":T[gȁitϷmَ_&^CSΞu+O׎ݹu{iR$?쌱1YF\||<5pajjW\+#!!N:QZ5zXƌ+@TZB䔉{/B̐-C,M׎ xOS'1z(Μ>K}IHHmk++fΝaiiəgR,3^ϑCGhШƄy𘡃މEH~͝;/۳qFԩCٶm ܹ֭[k./^ر^9SLɓ'̛7/Y:ubߟm۶/pinܸoƥKt+V@T駟f+ BR<24bŲ= bPTIZ5kiظ!3̤H"]nkŋ4,NjU022b`AܻwE~Hҿ$w}GhԨgĈ4iDˋz`llL֭uJL4'O8ɓ[+WҡCVX1hժ~~~;63v[!x"+d(pήκݣ VV?wsSNd<}9ϛD_NHH~~~zr aaa)Stiyv7E!t!6]fwBA'KO&F&DDdwSBK?4;$@V156yx0!i/;.B h4YZ_% BVc4،x;$B\81vZuI, BPGFRcnf)3Z!"CZ-M| 0 -Z4qiⲻ)B!YT\\x$B~JUjju_YLTL_!/F=!B (hRDm `nܻgrTq& !"y"w.`jlF|Y:dSdaxYjԨAHHH0ddA+;wSgϞ͖Gq ΟkallWJDEEӵcwI;3ҧG_8G1ax-Ys=c:eμY}GDDDf-۴i8}tܹW_}+?~3g'&&.]j G!Odz=ߗaߠhjԨYUXZYrtbO'O/`Ozu(_>i铧qw*W#_WEVsIN<WBxx8'r/YlAςX>jԀf-1gl.^u`naOzTVj5k%S O:է'nݲoJiLӕwc!'Y`A\v4B!0=6)g)W*}jVExB>DFDs-5eɢߖХC7o݁F*^9|cGѦ'(`ωc'IHHpvuNWGzC"##R5훫DxHpp0oxKdd$7nyΝ;ǎ#>>PNMj׭́p!!!ξ+..{#rt>:B!ȶ!fyptDXX=we tg=pus|r襱g=ؾg+ ?׬=Wx1F?V/⅋5p "J+Q~=;P Ӄ[7n,HW+xϲlɛ7/ث$2K" <]y 9:K$Mkaɢ\tK/.7sa7G%2"Ŝ>uK/qHlzj̝=ɓ'5jUGaՊ|ܢ.;cccC}ٷg۷`P{ӨITnddĐ_v;rQ,"kvRcǎ燽}йst屶I&#B|ތ'Bf͛o`_,ZBۖҡyǰ/GЦe;ƏHOZҭGW"##ٻ{{clܰǍ\vhK\\^yIƨiּ.V-Ζ_ gS|Y.swډ)3&s ˗T*(_|F_ A)7cƌ133cڴi"O۶mSNy q 333B!>ol IDAT2b(6EDtxW("#y.Ne{ߟ֭[sdlmmYj&OPPڵcj&NȰaò%BtRr#c"qx &Ʀ È$0!Ύaaa,YD=>.y'!!7rJnݺE޼y?tٚG!N\>G /":(Y5Y!"=N]9Je4@AB4B!"Y&F&DȲB!x7!156Efi= PԘ<<!B2!/6h⳴.u.+j39ff<~$!B"yԂ踌xQ P(QQԘYdu!B|8Z-M| 0 -Z4qiⲻ)B!YT\\xB!(QVQY~%Zda0Q1Q<DӇB~66w#JmvI, "../q:%Q!$B\@.߹9dM Akyg)B!D.ckco_S20EboS "B\ɾ/| `nB!x?'$@T&BcxB"a0** B\;Ȼv«ln޸"];vʜ/t-ݛ)e !"w1jf;zn &&### Sɫ":wBt֔(Y33,k}f\yaaa̞>{,[2jw8:9rfLY#p(@ʕaXwӧΤZfZ9ƱGPߊЗԨR{YȤK"?#n7SB!DYDZORhƎx= `ۖt# Z*kZ N#oP_J*I`Ν;G|{2dGRveV֭]v+S-?fm>x_oAll,-[0>g%b!BmC,,,-Uժꓖ,Z+~itGxiطg4owxW޺?D˦t-GY*ŀ!T{E:F=_t-vIڴhk9Tǜ?I=[6nxiK$ Kwdñ#iݦzO]>iך~̔۷$ þJ붭_];1쫡.F*TB"Q(U`iiAZ5 ս-TTŊ2)]?qwwĄ 0a^xAǎɟ??-['O;v BBaÆYB;wti"""022b…YsB!0lbjj\*U+'{y=|Ą)kfFBBS'NѯwzwcF3ȗhڴl9cǏ& AςPui_T*xk֋5~ܹ}3fňo2(J=N8s,* US%8|<ĩsNNyf׬F޼yRT*Zj%>Cɔ c>cǎ 8mKo8q;\v ;;;] *l2,,,ȗ/޽?Oq!4 -Z|8B!ݛDVHwlddD2}vi-_OoۂPק.CG W%N: ȗUW̚/`bzcM3gOCPPק )ҽg7]9)WEݯ Ϟ*fIM9/#Fԫ_PN- V̞7_nz4):/fm;eѯپuM7n!o޼4n8CetI<}x{. B ѤI0o%@۶miժݻw… yF޽{X[[GTTTiӆǏCZZ]v_|;AA(>E"rrr2?RJ@EE-G~cr e:7hּ)"g= vZTʼn3޹|2 yj)>sܰG 6Y>=}6>?[Ϯ}_OoH$vѣGIHHݝaÆPN##3M]< DU*Evmع}ǎ|k[LLM026&IP=z8?'uz`dlDMlڰ\037+Pnxxx{nΝҥK0.cƌ(**zjJ*Exxxttuui۶-6l`ƍ4i҄ Pr'l DGsRR^|́x?z2l:`7m;E]]'A4m=}=7 88vbmkD"aZnApsZnɨ#ЦcFuV.{nY^}zij!oBhުyˤ2r(\kblbDjsg#ZmYr-joOLt4;kiDQQ^}{3k,*ߊO<DZZ׮]CCC5556mڄ.+K\jU-Z… ˗ၪ*;w,mApK 14ܙs eee qZm]RktRƎF?^=}=455ٵo'3d$''cbjgCOʕ+˔_&ϟ;ч6v6\2`tJлo/WL+Q6N}o'$$oφu y?)?ѳwz7)), <,MMM-Y&Gvp :::YD^|o߲doe߾}(Qgϲk.100wtؑ .0ydU&kժ1114iҤh7PABi2]AAQ *>"@bh7AA'D,EEQAAw"Pd$|-ȪU 4  |O 9tj/YL"Grd21f ֬Y 4  |mYico鈅vԯ݀qǍ73-MJZN?!?&M+˗¹س EEEކE&=s L-](Ëcs ]QAVl],44R5Ӷ}lX,]ĕW8{,Vpqڷꈫ%OԉӴi; oʖ GQ8ۺhLݐJf _CNY8Q. dZ'߻ S+^<!_m[,L8GηTj55i/rrN<͊e+3-WB9ƀA?ܹ}w;MY8ӺoބmvL+}IKKcٔ/_ jԨAPP|~jj*:ubŊѣGs룤ӦMcҤI.MAE|({PnmVj7W̚7ꤥwA|2Cϫ/Nϫי> iȓD:鄆fNEaaH$\;DBz}Jll,_$}SSSy7###BCCH  Err2?N:@EE:u=4t`AroD)ЬySΜ AO]VӹyZ;tjO݈|ahhS QQQRR U\Yg3uLc ܪHBB^LPftqAW],b?й}200{SRE_Fhna_",4,˺Llxbi_B"`mckyJiѺ]vnű)_ D~>yfzzXY[R+bھ[>?&:uu5ACraJiѤYcGGELOnXXXm AA|Ol[cr R)_\pG 6n{0˛ڢFГ 6o]{ta@zwLmF"g-[ 89-[dؑthӉ1#Ѻm+绐ahhgzAf yy.xϹٻ{/uz5x@4l܀;0{jySư 111}\ˣ¥?z1y[f͚ň#PQQiӦ}6_QAz|IY2;s]z>.UmVK#WU\br.^ؑPRRk&d洙L4dLLMlIredo026+6v6\2`tJлo/WL+Q6N}v9.SZ--MtD"AGG;/Gf8q$>h>qqq &dɒ@E&w{{{̙3 dɒ+WWWb(  _/MaĤzO\`XN|f۴ϛWFOG# 7Uv"!)ǡ3QUQCz߃IJJlټH)Eԩ  ߷j-lڰӊ&,X4 NQAV*@0i|>BQ,w }+xB4 EBTUO+ @ME LVY(J%Tԉ '2}qGAoLd{CTZyXGII uE Uyg!OH  |CTJm&)"@ J%4ԵĈ  L&C*M-D,!2R)HS(  9}AA#"@AAY;se..b_|f#]hq%O={0bbb 5׮`_!dk"@AΜ=suVM0~̄6-ރQݹ6,]LH:R~>wϞflTΞ>˻dY=~#HM-Ο 5oUacq |CztɕWsuCҩXɔ86-̥FIttt8q$"Qo1sm[bݦ1(_^L/Q*QrwqA>O"&:~g׎lؼN>ڊ3晎-ɸ|2?OD:o޸Uാ7?k_YXtl S+fN])4AF. gk5VPPPZ --MB߽Q&ؚSF- cNL? H|Q.6fvԫɹ3䝜LBB"?oVXZl0i}Rf=puax";|067w/]!$}`G̜6C]@ͩbWGk'0u4͔ǹ0gy+M(n՜\9Br^2Mp`DGE3z9boHƭ /{i4o7eKLi= zJ.tģF]3W~|3.~1u&n.[:һ{ݽcymGҡkcknO̜ͪ6\ ƙDDDx6Gk'xyg2r)6h#M< /dR=%**%iҴ1 ٳk/o^؈ӨIC Kn0=%11=}=5iQVV 11e7BCCQWWҽ t >>>~:pD+3Gokg[֫W`?DQQr˱`|,'cX"III,Y>=*Wbԫ~n^IțRͅ5V!شq37&*ЩKGꞥr ---l[9}#6@~***x6Oҥ5mòe2}f0336qpFMWvZVVtԃcG㉏m޸0vMW\-?hܴ1ZhҬ|!!,YLyՊ588`|oضy[kȓIMMEIIkWQD V#%% ֣+#F=y w !9rS~ z>ׯ]=+krhhбM'?ze]kT\*X\ z^EEEJ&"<[*JJ1?ťZtuu)UJǏo/_d㺍hjj0|0d2 ʥ+bemyp!7A.dx+PWWGWO7n1@ڒ311}ʶtQ gPPP@]]2ͥe떼 yǮX444PV.҇ Y$DB ygBA2*U-Z5gǶ4ߔѵG*PPʡUJ*U}NyV4l܀ҤyuS'߻ODDUʗOKK#55455OII:r=iSyW%gMҭ3:o{wiJ[=\nݼ @Zni88s ?Zͅ%Krl[7oafa֚Rڥy6勗,ǵ*1?zL6-]-t2.H-Z\xggTy11}_jqb<| yo]{һtl)˼W/_e :>|wv~ƌ'F?{[{ILJ$*2_w]GOp$ ;nœ'ɃPS'Os58tZX`1ظn#N;ye XfJfϞ>gH$lu+vv̝U3Çf-eZӨmV`M89;r%zuú5E,WCUU_󮧯or֭Y̙?[EQJS"+>.ѭGW~6 LLMXrI2ai& ?ׯpTTQM"t?gJJ$&&fJj8vvױ2`6Pr%TTTS׃ACfZ;98&ʉDg) ||PZ4~uk˗)>X"N;9q$=JJJ| C^7.(f;4al\@UE[G[/ޥ'ζ.uޑQ;{[-̳'4,4ձ0bهϞgY|XXвI+;wܞ?]%6Xn'8 ޽ݹ],LխEq(%(Q{Njrcef'E}dd˦p--V*3~49/@UM*fHrZG-ʔ){ٷ7:tj/oM~Azwiiho@_Evn%/061Tj[;[Ir8F|mlp͒g>CcP724y9~7aauHTdvv4)]us s*Uʔ-ϞGZz yK015ACC#~xM)Y$zzzH$.ȯoF݃^<eݒ%Kf_^җŭ}|I*h ȸ=b nަm;֍[l\w<ϸjj5ӥCeY^"m#kVe]8~S'Otկ⇼2Oww7|?|\&AݕKW cxM-HٱF"g-[ 89-[DQ1{w˦m(*JPWWc˦mDEFѻo,~'Naec,-*uf50(co0559I$:uʀhӾ|޿I7'ٟZ4e,Zի巽./^ >.]]] D=MmQWW#IM7EO_}z}`A+WWXn--MXz=ZRJ89;ٰ>?OLTTzlXHB| ʰp"6n@\l `Z}e3buN3d ;4k"FFضˡk1oՁӹk'44JGI 5&h/MYY1gڥptvԉ?z\ޢ+QаqCV\V)-LMM{^D^ّuj&+*>=68:9Pݍ?Om[,-D*MQnҗŭPFxaӤYTUU?2Znߺ+װ&<4ߦN];-[Xt%zqʟ>tؘXtti۾ Zf9K/eq())adC]]{w3ˇgNi\\ʶ1H Ϭy 68Ӽ}z&#p&`bj|?7/_f̩L >摘!?Xl%GRS-[kW#}$h< e <~Ц}kxtDFFUJZF}-MRR*h=s[<'`f^4115S) ·]I-6&ggJjh uymUAAA(҂UJUVGւ  /ٰv##~3oBXZA+9fz;iN"GrБLc ]9ՇAOٸ>Ąb*ٷ'55t :}GҤٿDk1)[:izLL ՜\2qj;ԇoې?)z9mmm*V2—Q,],£yEU5R r JPJ( mז.5r:pK9g|ʀUX\E"QFuv^-BHIM!"*ajXƮ-/%5K6$)1PH2/5]U,hߪ#.\OJJԊ&Əޣpuƙ.!Jl0_w i?ˬ XEuhְ9Uh2 N?OL5'W92xP^z-_ჇGgUeynG gϮ[̯_a@F6_CNY8Q. dc&ХCLi5Cr~sޝwܾ+vTus'4l3N t;}4{KGlhְ98c>YY8<3sljVu̎ٽ#aajŋ/&'`cf;Gv>ʉ73,ꕫ5d)$&&%p+#e'$$QУww4kBlLL[ Q9xQVVt+g:ɩ>mk+aD. Y JiѤY!!,Y,2?UG'jVЩ}"JtwS^.U۾\r K+KkpIy| 8㑝CM044͕'A9Drr2WaɁNrБLouu!ժWȡ#XXӢu;uئwoũSûPQQa}J.]ۖW:߾u#d<usw~-O- `eW(Y9YR$VMΟР'.cquTUUM+:W=X" ѱs϶Z:j/DCބ2`e6*"@B-IQQ1p6qqq Ċ˳}B+[sf%111K w *W.qKܱM,^|%#2/oݡK4j0Skvn-՗4t ynޢ]f-7̔r=}_~#K^xɂy~\'q񨪩iK.NXZYаqJMֽKqml߲/^QdI≉AL<88v8x;R劄m C&3=s}ˤӨPʕ[~hѪ9;qЎ=P N'?nLHZni88sC7sR٬~= zJTdukk`^HQQXW>T*Fjj*111hjjfY*ﻼҗ(/d(3M&l۱c1ر^}ze) RfA"%%L}n!KBQrCRB)!1)J\@@E%uj@4442+cXPϳ.ӸXz=6<7ʀUԮS+ʠDRb9id2BCC9-;_cݚBJJ.[\|tЍn=I;S'McOcqUD"_׳a}Mα?chXiԸaz~8+3UUR)i4y>~@T&+(/T"ޥfY6or֭Y̙?-(/%}W殥G+|>G[̫d-c%HSQQԄe+dW}~R?erbr"^?!}(ҴCQ>&*/elbW\-Pnvu0z:W\Ge 970Ёè&Tnwyuٿ ##6zXڢ~ }k.c[mЪi-3)W%89^rU]PGa~fY3} #@VTHC~v؅:űk.z!|}A?sR 9}G1onvхݽ/^o@pp0:Dl݂lgg 2q*[G'j1i y%QHi@eͪۡh֨.)>5v$tbqnۊ'A.{nФY0vhӮ5*ʄQQizM4m[Jdd[6؈vR|9ttt~\2gx OYZwoC]]UUUllٰv#lZd2Iҽ ;@EEEKʧx|,CX`1jtw#55gӿg\BXX8F?Wom%̋# DEEdžu$'0x 4166bh"6&J+Oӻo/6 DWW[{[n߼MTTtVG% }fŲbooÇx!>n4o E̜>^$%%C&<,M79%JŒUKQRRE<{5=ee )_JU ..>Kד܎ǧr1pl۲9";= feKU&}U~ɯy~>̞ϼ󉏏ў[/a҄we yoFN4 Ɗ%J Q?:y#CQQQ!p&VƬ"˝N];-[Xt%6̛ˌ3INNư!#< rw k-%&%гEs~S^'  ʡ*%H,7^7b?._T*5@?fٺss խ4x)cǎM6lذ;wBvӧWf߾}\~kk\}Kr쾿cc*MBR|֙PL:鄙Yf %!!L5vz~=:DO_?חǡ3QUQ|M MRRQTP`=ؙ9bgȞ{PTP Y&/߽;:JK>跃c~h۲=Wk2ѩmg:Vܞ-sL5||pmuO C^KRƏ &L4;ׯ]ޯXN;ۺ`]ٖs.Ə@ͪY8УK/?6x~TNƍLj#hذ!C\rE>-[ 6РA/_ydd!S!>d2BAf8ۜ;{#QVVƣm೻X$%%$%'\_&ϒQ4oݜe ط'C4һ_/<z fNŅs1#8v̧+6v/ӿ7:::HXl%c(++H֝PUUe̩o~+7% @QQk[mY?0ÿG<}|m3i4oٌ3"29̚>ky *^A?o2+WpzgT3g):VYYzqlo[ʠ(A݋B>R@9^ % ߂_ T)-llش=_=_r4>RiJd@j?SYk)Vsj5޹gڣ 5j۞8{<@nܴ|ҥuhմ Ϟ>œ-[y򖣧P|9v^оg(8F @BJH BGTP{ (*6H t Nv?vR33o{'gL #+ "y+Ua떭4lPM\~uΚ.}n?NmKnٲmۢ鈊?Tݼy, ۛ7of۞Ҧ嶛z4Hhd <ɏk@PP|6A < D̐A9|Jju΅ )y RRw )5eD}r%)%m#e7IȮԨQ5jOtt4aÆq qqqؠ,ͷ Q_[&B xXx9/m#yg7/)Ncy4nmu+(/v͞Ozu{vAxܽwĤD3ҹ. &r]3ILJ;W6g˟膴j݊ YXK/r=כ&;`ט"E2% %Otn%7M*AA\z 'gLV WPbŊرC}`ΝDFFfYڦa}.dȒ>B)/KB [/:5^sgTད`c/ۙ;k)lݲapBA_>ӹaI4n'Eկ!\jYp)׮~~Nlߺ˗.'Oq|kiՙ[[ȥ,oǟyRuq5*7oBFFp3&WcҸNS\=\2g떭9}6[1o `玝G믾a)ݽ;vr<V˗.g9|06nIϟ{CGVZ)}~&?xge4gVr1/YaTSNӻlڸᛍ8~"MYؼy3vbʕٓ2ePixСҫW/vE=gȐ!jSedYF2g#gY2fX_YSY2ھ&S-|NHČ3Vw*>woޠUL<.>>Tjݣ/^z*? CcmySSR6i: ,$-YL뇖/]AThB-]Ϳ,k^i5~K_Fk(֞eӼ^K狡#HOĘx!nnd̜:~)Q%Kd/y'NCy˹Jj>Oۚ9))3gΰb ݻG%h֬&LPi&F ￧jժjSe$0`RS8;;y2h4bDe:G>$*:5Kn^a1uzuɬ]elrz'L=HJJ b͡3s.^\_[36|(!B9moٛ-B7 71g\6o̮; ڔBG~%ONKkiIRj"wδ kP7qWCMJ/RYl"(t|z-?[͍7)_1iF&==pgOʹӞ#:syfDԊrE܋ӣWwz}KcǓ^4xvxU=&Ğ]{IMMӓ*U1޹r%J)͛=>x1o~R+/>6r(_e͗MG}shG/YHKKׇ~۱طg&^#S>~.>k,S?>ce?`B]fXhڼ)wL8cD>7Z^׬[% a4nmIȒ:=_%@ڽZ&6gL-ؾ{1y۷ f:~ }o(Z4}TK̎*_y?ݽKz#k3fGT4 3a˭Qc9kٔ71>q:O[׭͢e Ӓ;qRSR qR^U>ׯ]'55%ԥ#SsIIIZ+[""j]0]:ejrS!yjѹK'';FY8''' {\|޹K"2a'{h֨ 0nX4lF̘3][ai}m<.<y$))oJ!88s֬BM_gǶ_j3%11/V}oI kAFW5/ܚ;v;wxȒ=a,AAv:&}yO/>7ߎ㱟I͘9m'OΔ(^/]xq}8z/˂0 n'0iD]9u& dѱsM<)$'%ӧʔ-͞]{དڨA9iɱf܄n͗ ƮRҳd|Bxj-WV=Q/"I̚>wy?ȉ ct%s5fC ti_X&"kuZ> :[=&6۳3[roFqLBB~k>322غe7oܤi&ܼGX;X-W1>?[ dSs_ȣG~yO6P4De@))zN.ouOp6*uT Q y"..+/Mk-WF^ j5dݼ\ͥ5J)mT6נ. 1?W+g"'3%ٕ1͛d-²NkdOٰd/h޲<űY2"ԣ4/p2>d\ÇoXx9n՞Sy/~u~-WWWRSrw3$%&l:`ٻ u6t҉W;o=55 rݿg;3nKbf)V:ukh|ixxxxY(r3yBnϯ\nβ"7c6蝁̘:?N]:9fo2%}Q1:ϝVZY\ʔ);wէNSeO { 74mޔ`Bq}nO;N 48;cy4oy I؉O S6ȸ3bp"6 55es;эo`_ oj׭͎=F>[ϩPYygg'HJz4"w<گd良K=١It:ZmHFaG\̥)]uU39YVfzݓ&v͗1WqrrUsڧN&sIIqpԏ{{\wrr3%JDWƣG!( K;p[|v*J\!;;;@$wY!oj:{\(YiR=VA~R޿fdY摉8ֽ+kWcPQzYy1ҡ qqq˴nӚ%~+V%Jp5RS(Qjrⷜs>}2w|%V?~,w|xj4ϸOHܿN'1y?8xG8ZKS݋WW^ԝD*TfɎ>xؑ?wl 4*z 쌍 Q9يe)Ŭ4rܾ[R\9b8TNZ0fX\ɏU= >hX=bi>7UpY.ZFaoc?!R0!B1ee˕ -Z߅@<4 vlq,̶߾tbdYF q,(M$If_p"1c45k³m?Zi耗'K7&M,Y0|(WȨHJzeV(Q_kG^oZi >wRD?.O;`9̜6ϖ(QɳX]6~Π1ddd̪/VRAݧfnҒ3ȏ۫^\ > |嫘<}Rs6xh 7o!# :NdTdcŽm2Χ:J)؏ǨfU)9ӐfΝK$$$NhX(s]=hhO1\)/39)dR=zvbotLrr2SVsͷPk<@ xf<ͼ:[m Ϛ< XCڋ_nL2mc΃,gó;okk˰C9|/kc# IDATSiǔ;0!dź5_[ڗ%˓Ȇ xgX| @  @ @`@ᛍlڸׯ]gIY-%@shb/'^nݎOelݲ5F=W._a5>-IOv:pj۳O"z߻|?)O{AylrR)Μ>7_}o{\ #@  O2Z;Ctyy&>.=p%FIٻ{ǎ/@3ml{*u*8D @ 2{6?G@7e+Uf!AU!<@yu;UNӨ|a$>9Rz]=7uTiuчFS%0p|/\2Ν; .\*5f@AY9* fvw>TTZj3b$%gQڽsڴ'4fݚ/mkiݒAai?%$dRmDxtl߉kWi ::IxD֢ͮٵ'OвuK;@ZZZ:p_Hhp5k߽MS/[!"ᕫpLudg[vs_Ru2/~E^#,$:Q,_Bt~ uFZL?)mĆ7oݒOT~_ 祋QF=3hѸa!T mرWz9|5jLm]t{Z4ט'͐Ah՜jSz]?h>]E{waFT ǹOskOvCmxopÇTPmlW}ŗT #5%6˭۩}Th~(SԿ AdCٳk/7[[^z%D&M33d@laC큵:}=ߤY&ܾYx~QZZ'''OgI6oMܒ?-y_kG*| ӧ̠hѢ; #0@ӋǍc'x'xzyҼeLm]IOo>Tg=  Mo,YQ-;cǑ$S'OѢUs~$k̹qmfϟ-cyZ-<@NIM̥? #(S +T̛='QH|_  ; FDEGEx镗8qGaOQrnnnthבR)jaUT@LUʱn͗ų}V|Kpr```&к x{{S~].__y%D7#شqS?̙9.PfMOnU :V._E{2gaٵG-1͛Pnm}/]4AfǼ}zi dּh44B0} zR^(Oh%UVVԪ]?'{vU?_gT ^ooo7GHvƎo޲WAbggcDZϵ}([:իѠVCv_8v8+>_FdT$Mgׯ f@8.Z~jDhg35@Š4ijԯژ4;{rs?DFEzsr~8t0E#j=[{W7Wl؀mjD! ns^J q(; (Uܛ'pRddd0eTkLH@eFERRuX@t_XW AAQnm._V3jWkn^U}*~?;AUqT@+ӧϰ{njЪW._D7ov~\pׯ_'%%ujeiSnp;Y|:wAdNt0IҧSٵ7[ 1,_cFq8~pV͔ЁRJ,5۞ яx;~֥֭8.g{BC8׮^9f ʊ"EdO>b:po@qvvIle~Ƌm[y ߹w:Ur,w^6=u|S&P36c۽^we&OG)V-Z5g؈a7'`݌CQߏ Yjw+G>zp@us>|H"tV?̍7)[,>u޹r%J)͛=q]@WsΏЁ]00cFgG㉏'rGhҋyj[]A}cӟG,WZ[[[fMK sb@L?t>hz{\\|2۴6[z;b2qŊ%F8wA777]vj֪'F eI888Ш>2!ZnpŲ ى J({ʱr*܋H 888Pzվ>u佡#x\t3е{s5~ٖ̙19OTEn;v-Z`ڤ1jaYQތ=bzDuZЂ1O*2t҉Wѻ6^y&QF /?o^8;;ccc=gӸOss?D7ɉ1~8@.chZϞM}\r,3xh @i%*nk=@gH0;A];u|KrU2EYd9 #{@j׭Ͷ_3o ꋕkPW-3wfNgWr}J(AW'KW.fL1b,Y2J{__~2y?Qί׵Z֒,Y0|(WȨL͞o"I2k>QߏѴh=ffgϮUمbŊxb}%..x"Df7)))>VG20u>}{ë>I`P [l3)UB̚1~oǣ=zu'陒mŝ;w1$ӠaO. Yh)-^h_9lmmڣ+&ML,뵷g3z,Ç,xzy>vƋsgx>l5 y݋5L2 &#};1ܼq/z2} 9zK|[5sEЪ+*Vs4m^,f$%|*iU:)̎zwl}qA<<[ayܲ{;F <-RғٲAvtt&%-ߥfrJTIj$&&ZMg5--93sNP;@+Y-W+}O>CRbY|NGPpց@PIJJ⛯%R.Μ=}5 ڴ熱R~Z{q+qh<XPɳ@F5*4[!6*'9D:UOb0 \p1òmс~8O{%@ <+޹?na=cSSԥ66nClf#'uVfߞlݲ3rtoӏK/3 {zjn'CRb2:܋@ o@/¥f:uNddd0q$o c 3,vHNNQhZծƍ7u@ <B F$I_prvV˟j?OW[['O B (7~it wwwzwM7s!6|OU+o~nʙg9s9 .^f`Ale;g$NSZ֭ @  Yh)-^h_9~Sf2aD=z7C{'u?r3z<͕@s΢5#Xb1 -`Qί,Qj @ xֈ@ yL!@  B @ &,@   BKJZ IH{VЦ'')@P, %))ܾwߊst^e4J_Qdl46GA&SyxV-+azZk ,R5:41)1ev}L˩-xܗd?Yd@PY J?Gy򸻹#I:(Lde"W^Sk^$W$46zAs$٤d$}Y(%Y2bl6$YV7hh4굖笉i۲22HVY6Р2nB BPkQu'84 1elrf"D5fk3SrΤ.3 Xգk;1C5P2ׯ\Xe"eY&d|0ѬW6y/:c#V7邻[1.^O@PY J$IY{+(d? Fl(^M*轠b3j5 ˲l hSLU@ndkToڎ.32,:zxU1:&gUhRWL@ (D, %$@],arr_Sj jYmp%&JD[ ~s5"0K"fgӎ0ڤڲuW-B(L<粡AB,H~%YFh`Rq,QmWCzMe(Ȋj7tB@!AD$t~juY^e\ a7ff/Iܭ( 0`=mNkR^Y NY JQf9ֹ;ǎVQṉJe*7bcf/V}%<,=͖ [zs6Vrmʛ{=۷oFrill ZIkQk˅x!A,€ G~8F>[\-dȝL :($ Vk.WeX2A` 09"="F3g0ȼ% XӏNւI Zu"jZtYQ<.jd@QFIDATPX!P@h%:IG@jԊF|˔ "pvsD>5zԋd@^E+Ih%?6-_Z4ŢKD[7{SbU*Uo$Ce9):օjjPz=&2Ec/hѸh%~': )Ӣ UNj%n݁Vҗ9s/:ޅ XZu>}=VCӑղl G6FJG>o`xމFDXmWI׻Q*ʫURTT ݻRBU 0C΄Wqd3] a,%MIf/RJMBӶl۶C=2J@ FY Jx՜ _KLBM3sg/}6:1$%&$iz|a-[.ìsgѵC75bڜ)888=bگ:i:oEطg  p1Jy1j~ 2-;dܼydı⅋̛)E1bp@fK yo0v5~W)/x.Q(FdNmM_bckF2:O^iֲ)}͕+p"R:b;NR^i|F y-;Dα@ F@Ń@6ӧNؑ۸ >>;ܹ H::jS%zN }ovΔO.B͙jΧsҡs^d]n޸ɬsU`7.Kͺ5ZQؽs7 :CjիM)o/jԮ?_eǶ;r=Nڽ*aUسk/~AnXkܹu+4닲3_ <:IoTh4ԏ,̛9ovЗԬ[KoGh}_vݫd9wƒ, +B B,3&d>"5cbcٳgУSL߸~"i,aߥy5[#KfuZr)^j|Dԯiv}zٻkI,2<)V(nBuZ| w$-\TΘYv22܈Eu:y (YٮNg,kgoUpuu5+ L5Ooxk^*n$:-qp7,v3/,dsqN_lô#3LtZ L-Vݽ:~(1sXkiG)b! /B BI ,ۂ L<pujnC0#XKYDߘ޸9p=:-PGC'iB,ʔ++G~T]#(WN.zeC>c6djl!3Ƨ۷.\pW; ޹۷oSdq.ܻw%,ۭT9yQlll 3QxA!Ed@P(Q6c و 5[VVݚL8[T"IZ5%>.$I9}ggL|z=nn$'%G@Ev{xh^hG'G&ҬUSzŧ^aU8{wg쉪J^bfY=&K)#[ҭWW/\#Drj,u_aow]zA ^/P1"666,[{-/6n޼ݵcG~L6-,tu~%IR}1d>!AaEd@P("=WբSDzd2\P-^hFܹ} _m Z,vTg h$ 31Jz`л)PάUCl6 f-bRNMZDjvt:6ϗL|4a qv˲AM_;th4ХG'mټG6߈xh4\\Xf!IxDrei]O 9b_)]4kgj70"Mfق-VoFϾsSL7Y V4m^,f$%=@Q)JaÔOӴ~6G HIOfprtd@P8$Co&(l[ @ (, % :4Y^dLע$^(QEπ{4e6 JQ8k lPP+YcFe*L6ߤ}U$+BX% 3mن[1.\;X{p +"I:գ̖bP*ƕ^FF2wk ! N^U[LOR0W"+Yqq.%C2Oe X , _d IlFS Qʲ G Lܪ啘ZcySgիl,+-e}J>Lc8faŶVHX%$N?TjȈRhLV"k4 F.%vWgҦ} -O4h|N TV2 XXjUw Y cU؛,BTk45 Z#ZԱY A"I:I41P ۫Q}U0b ]5/g-rU!#FұS֫k0Ax0 7نXH*@WYVb X*=H|%AY%[ GAf"Y ut<&fSF>l-5V˩!FLqДl*ޙWUqa ! ! !$RD"J#.R VBUVQFM8" la)($a1a {X93s~罿L1AJzW+?'q;$_ YbhVf=V,cRh"l﮵J9u2{~`[뺚A1_!`{966fCvۺB? ~aG  aFrR0(.9n:?ALl _O>N.H8*2ǃ[4|;e D:JÂ2B!e*lux8 X8g=1v!1_/a)8^@Ll 7v#*G|<8.0ƚÞ!o>*M28m }-lQk(/cm|_!c}헑Z"AA3BJ$;XB4gK9r(:u(M: .⼊GWkŲ},瑮 AX.P>m_9xsó70*B<9r!PN]_RXPȪԿp˭]gyR^Ÿ1ٷg$1)P,gN6v~rc{)UI7dAA 6*Qv1e#11w @R^Y_(zs7sSӧ`횵(HkFΰzv>Lza2o@kM۬,\Z<ԉزy qqqՓCD)K))S㷞+rsL 歒TyʱʾZ|qhq͝g&S~}δ+MR3̜)MQwtqy3Ӧ2o pU:Sp=tm[;<ǡtYqmZ2ّ4lؐ$$ѯx[ȘFQZZe+;׮qpۏ<3~ q(,(॰_thϫsgQTXbbnL(_R\2[Ţsm/]@9_YGe׻fȂ  ``T ?mچ-2i@Ŧlj+4c"uرY<=i-1~HτH E8t0m2ɜgdfX«~ZQfLŹsxc'%$&KdAAŠxEP[ ky<6[6oe ߷:O)f;^(8qc;2h_>{ͩSsw_\z)O28m;9͛)6NlFq8cKkw 7u`盘>eLEllL EZAdAA‹ ,OlӦMط'7u :o1t0zࡃ]6N1;-ޜu#q 4mq:u<SgMp^d$gϞ]WoU.Rnwr4o @duȪp|^e%5hY;no{x~xF 3(Q Em 2I\GlAAX, c6jAFt/XS'ٟҋ<:hې٦% I ;DUF23RPPP|1իC ~Nk+7wZU"kҘRSЦ]k'E/ysFiҚ1mJ/\`L)ҾyیC  a)Sv7Kߴ17b{]Mdݚ̝k>YKz jժły ٱ}'wcpc3~vDҚ!::'ro`[[ {71~ի>f[XjoہҚD֏dݚ8QpEϫW [PSԖ3)R<5p(+-G$aw#^zh} t1)).&U YA0S"Kmv\:Z’8}4HoN 7[ħ QXDhv[TT$+f3}L.ڼvJ||#f2s^)(XFbr"={b܅l|w׿n/t],)L;.cUjNA(;d;:-ܾn1_Ɖ1ll.FLE+xj4r\z8խw" µ˿6}J?u?{Ov]{|;dee]n;`Yq׮]DGIYAv`6X +ǷdAAŠTRaYBB[,RA  Ȃ  g%=lW1Uy$UE V"= dm/"s}  Wkjuk%7xRB"gMJJΒ2Ȃ  f-W$B(ns%?=7^߹1Zg~g$7MA~8ڝ@A!$'1fG~p~4n@INHtL4uή=;sxw FwmBi΃ۭ>?uP  8IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/config9.png0000664000175000017500000010426613203343610022255 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Ulɦ{o{&E@T(( , ("c|}^t:V;͚6`$id TXr*:^'T¿gddcQU`AjӤqCTMRB*! :.UB! 4M#'¢ 0d&ad^ 3 7ݧ?" 1oϐV+iimo}V0n܈ib p, S'߈h`/Xmhgi0 (l5?_OҲx`=Ԭ/q?XTMr$ cn{sH?Y91n];LzF&sgj+= LS5 Ô{Q̘6Ǟ|\qUn_5B!ܬVeڬ\4y9淉Y7'RYz0jXƖF0/^h0 JU#6ZNb6Ӷe 6BTj cH/7;Xg[Σ_|u?V-h٢V+Xֵ#O-yǎ7+՞?_o<I)ԮUg/^GRr6Um aB!n:O53 MUh7bo]'OϤrϐTPȫ>^vyOX:t:lo  !) t:BCC lDQTU`У*!vqw!!}v=_p‚|IJ(0MʛL؋[,9b1* {h,vP\V! !if%'✦\1[е$liIOZC,Fvciܠ#`ɓCGbt J?mAqsp븛X:=aƠSt$$$I͝&%P|_ :~?'ڷ%( ЪEsVi( dfY:y<~̾A/{ΥNG2m2yPN-P헧`!(g[0U4-?l,m]Zii@Ӏ):fr=bXٛkrۭҡmk:̻7`tL&ladӖ/i߮5ݻu{~O\oa:}$>B+/}z1| HKK׃|ճB!Ŀ@ <fu>8:4ȃ{ӕ;9Pg]rv96TMCQ &#B!:݆fcMP펑 tzXLN'S1ח l6[v0CH B!zTSh̤W6 Vt*骎6#e{KNGEJ?B!B+AQt : wzQT.ϭS,B!E *}XX!BBX!B`6[^J!BkUО#tB!B\q_|+B!Dd!B!\H,B! IB!p! B!.$AB!…$B!BY!B !BBd!B!\tB!WVv&:J֜+οh :J#pe"=#s\{zxwI*cФns鍟? ʕ_g~СEGB¯tXB +;KԍOp@(OӒR9{*彽*$W8A6֊Bqeeg^tAh`cH~\߬3uG$ RӓU@TU@AA˹N vd]TOuew^OH@ujs31HLn*)Kuq6[|p~)硫ҴN Bî8a4یOCNnW3Z4T4񹖦_sEAE- rp븱MXs"gfgsi?}h\)>^ZNNTwon wq^[^hh7kM4]IMOvUu_IWCp\u95:j/zUX{UWD,s&~g( F j5&$0C'кQ{v,9f9Qϝb.&wq/įX9_sۨ8՚ӿ_Uu_IWUU ( v^Mf胆RQQ-YddaW<=< %7Uv2iOS,n[<]P\Q\B˿I+R AoD49E橪 Uܩ)hƥKG&wq/qpfs`Meee`ڹ ޢgϞ%.`:uȼqaFEl\LKUU sڕƅ87m|Y>6i9\os-OW%p|u_ZFrW^U}seWqr?J֮]#GٺK~ڻw(uy\ik+>r.3>~tehl4v*/>eYyuka;+UVTUdMŮ:#{WFz:ۀ];״y]3ҝUՎ=Z*MzvNv1W;N)|<Ƀ5ѻ;D@`55v$>>ޕ,^SG6Ja45fuծyvmw?h4Ҡaf̚FK-W-+MXZ6DBBC?Y0#}RMLHIOK'"2C2sΝeFzKൗVn;ֹpуwSķs.6ȉ?dI{?۔ n5YsbUx"<"11eru߯,_벭~ϐ7KxhŖ  f[YlXՊ5k]Q="_Z8&(yucؘXÚkޣ;GߟZk8TC49V*ȑ 89VдҖ/t\Ws6uV6~n)kɿs eT9-)1q#o#9)^OhX(:g߰sigphڼ SgLUVۻѨIX0s# ^Ew=GxyyN~}d||+ Kyp{y FIF PF=*oiݮ5~[U՜W35a!mL@YY ; 5 "aS,LFO.9OƅUt}|ش2339s kx[wՄĴ:.999S-OY~ZLGQ:7~eHߖ}6Eԫ_ ʽror<˖\RboJpH0?վ t~釛lbEXxSMb쭣x%G3c4o_)'`|FۋFr⏿ qǹݓILHQFU'==/oo>1VN/,(%jEU~~ɛvj|g>y9w6NCUUޫ-zs⥘fntk$w ^qZlɑG?߲t>9ݻw#lf>0ԯ_?Inݜu$]vO?…<ȣqyl+_@6n'XB做E̾_s.˰C.R"*<’c&ےًb4MEQIYv9&_]tl-Uǐ7ҭ]Ofq7f'>"[H.5x4[>ܹ-7Vz {^;>Ǻxetlم-jvr^e%z W><㤦8*n} `O{Q5;W_|!}qC!gǎcҸ)tkߓ==My/>>Uý去иY#5miԴ!fWW`2{K.۪rԫ_Q(^߆n88Snnz2zX[b9ϤqSc]`̰ٷwsY9/O 1w֮woyڤjv\EtՅZujұk\f>j֪G$4<<<ri~>ӪmK0?Kjs" ȟ:k3YʡjvhҬ1㷃uor;IbbB爐 wlM7~G? c'ѧKzu|6Fnz2c]N=3ѱeF ~(vUd7K%#D׶=~(/_R{lcӥ?OB%g]8;fӭ}Otϭ;K{/-wwdPl\mع}7 Kv=5d IIl\_MQ mMz+]xa}HBC1t?pW-`0 %2:m_ly)_QNz=vU-`׊Rt=CF o]F-̞~bwxhv(†Oa9 %%0{=tܞnzI&ȂE~x1ꝕy#{wGvbJW,e+hиAܫ&w{| FcǟIJLf 9͟lSt;mБCߴERSR9.s ԏ qиI#t˕=ϟo~nUD9^zѱKG8ČyFfw7kVG}Row?Yl+84mbuwWm?zWv>;669ėۣ/~Ё.^'66cG?U8t۷G <ckמ];r.Bhh 4tNtxx0ky2-jWU /?w3iz=t/>~1y\sZm9v1q)g]Uf %9j׭]UIJL1֛xk;Uκ5<}!$$$y8s}z BU5fY3̘=qF̙q/ξ{q|w>qĂ9<ʋ|!+;ŏ={bwܲ%_㿸{/KĽOcXxW̬sYu%l&66Z{iYs;rc2l/-~)hUV'yCBY“ ܟ8.]Lj1r.Ŗ; X6.'!X“EWTdހh*vvAP \_aaaٜcEep#Cڳ [6cw6};6[Bru Fcُ63mTZjN:^~v7/ia0ԪS0Aݏ9b!"*9Wy/1!`}~=ǚ9?&,ܷUUۖX*cy=| UUf0W۾BUU歚WK<Ȑ^y cLxD?:UUٺe!!2qL>K@򎯰0zĩUu5 !"*a\QrzW_r;}0f+XDMپ}z13;nW˖-`|'ߗF·ȟIVVt4lLiT#n8>/:X tЉRV]zK.YUz{)ry0nmtٕ9 &88ľ)OfE;o|;vځ k;\4oՌg^~ĄD^~UN C\l5;iԬUpYM&IMM%;;t""-[r) ПKJJf?'4 ڴo>gumcc''yvhÑߎU#̌LwllfK3iDvo4@V_I̜iҠQ}4K ;{Ĩp)Mk#ouΝWzYUmUo鉿_'OE㨎~xDFE7 )nǐ.=:3Y뼑T+ŏtӋ=w{>1zhFC%55Yw͊:l(ϝkgcN`b8N_ (j/1)8---ujWsڗW/Eq)ZG}K07e歴؎9W8w7rӜ B)'P?6͟|N. ?#޻Ǡ)^lXU @ֳ}GϾ= gTt$qqe{5^Nj+V?fLkJy1M=iv b]VVHjj*C=ɣ/M^;p#熡\[5cаxy;,ɑ8olNmv+ޞ>d[w+8y'9e9V>%]{tqWWCPt:O~_u]mҬ3F,H`PϞi&=sαpr 4 OOO||YtյH?1{:O<>u#Klj!b(*ŵ7<2Vm[1E ~.gm-=Eq^ ) םY7ty' Mzv,쫋r4 \ZXc!,0AXhZїc8{?|#CԙpuסA< vsY-ŋ~8H&.6cG~'''au>tӧNsХGgBKlA7?+p߸?8AJJ $%%c0]3ԴR<Y#nK. q;{1F/wN6 vnE||<AWd=Y滯o9o"#կi)r-11|e?|!#W*Foi(kWޟ~ҥ"e&US4mii̛_(ۿ؁lbCG ͍oz*VoXś\<5n/= O39tz=gN/w2P5AGA}Yb ۷r 1 ,׽O7ڶo^GTzs1bǟOX=py~;xceiXmV+f]gGun~)}W#rS>%^{"+31cFcou4?4ZLF4` 5cO,b֛xx{Zt:Fҳk/](lU'AOiesI ! cM#>uzmUrrݯTM%"*} +t˙\pe/A~=J9Ѷd.]yf׷ܷ^}h.ۿ|<Ɔ;;fMi"==sDq{F a֯ص+bǰb*4p i)?{zq!"ɥ V_$## IMtiq4l _|%_9YΞ=۝ ]bc~u^ZPt;d`vn/lB/6o ]UQ*^KSj~Av-o2y|EU+"{2gœ͘`0Nu8rw h.W]}'xי=TMu5xu2L&ΜNGuk +7q })7AHX/ w܆nCݘ5fu^;fގ^"##аPy!7a 7?;N'F4?ޠ'"27 ET6m]LkILLח歚ط%!!-|AXz=ucKO:n3r_!Q,Z 4ty}>qx ˞{KMe[y7":oڕo؃OEph0^Oz9s-y8m_dܤT5N抵F6wPV4!ԭ_^oOrTV< DirY;;M7agYJ6_L&]{vE>tj P5vޑ{sHׇZ:ʅ1),{59VƴGEUYp~^|{=":^`Μ;C)OaS L0q&N(&vջ7?pVgU˿vuu7uvԉ=?vN{W/T R]qpwNIvca4ҬeSxHQM+2gڽt:Chծ-ؤyc[Y3˞&;ی3=w3@ߘ>.6Y'If% (T|nK,V+"sL̝ϝb.&w߈W݁m'UJ8* 1bڳ 6ūݕsM$ 9;9LW|ET*A6<8wZ@;;R]ܽMm9Fm.wNP#DI]UzmͲw}jw|z7mwM㾊7W|ET8A6Xrdd;_+cDܩ)mr-wwJiy8tU]涹+QUj+ Z>ѥ+ `T_%{ĝϝb.&wq/y(>ڢ&eWsܕy8]RQl1Z<;WNNTwon w3c+qHͻ Wu殤+d$--__ (ԨT|}~EyWDcNP\YKuq6[|p~ɏ'7Dco{UmJrGdO̬ .^@/D[Q9&,K)ylKuq6[|p~+r^8.#R畧p6J9֦)*}_r m *{B* _Jgҍ*"!_D 0ט4R2܅z`[iΨlQ!_!UB\[t:A~!xc{վ/^>2'B!ĿNQLFO.:Z:$AB!WƟpYIB!UGQ>V!B$///-ZDڵٱcGˮ]Nƍ l6vQF -ZDTT ,Tlz^/q>}`yw+!BRtٳgi޼ye.^Yz5tN߿?Fs V\Inݘ9sFV~}Ν̙3ILLdȐ!vkS!&IRɼ̟?Bݺuy>|xe6nHtt4&M`5j֬IVx$xȑ#yغueiK/DÆo IDAT yYp!&-[s]u !ڣl6rx{Lqw̱^0(EQ3;Iṭ,KGUJJ>ZH~^FVV-#9>!^o@yFAj; Ϸ ˳Nu\u^~?y׮][!!<6tR*5yuI:$IUT煆VD%&&j?U+Ε;֭|d2,IժUսܣ)wO ϽN'YxZ.|OP\|)a}Y/'+**eҾ}UNiȐe| uڞ=Nug,q85A}5[ʯԦ'z[Y <_haaKt]J^zDD+&&Fo߮VBkAۉ={ݶOjUrժ-z8}~ 7ֶǎ?w+u45k*''G?ZԝڶuL)Ir%qAmYO믾ݻ:uh˵+u~ZV999j\y>xov)mwZm7jHM5єISeNWRP: >tH zG|X٪QL];Kƌ{ݧl zƎ^}z)pc~J?iI c;n ;] Fq8K)S/Es$=ڻgbccօm}~q^>Hev:zck ?>{աoWx{뺶0ef9Biu0&8eVnNK[GgW!@0! d 82@@p d 82@@p d 82@@p d 82@@p tpz[0;](@nr!p d 8pr% ME@.'F .`nXd 82@@_ s%IÆ Sv픕g믿^Æ $)%%EaB U:[mo^!!! QժUգG-Y$Oy~vvfΜF),,LժUq@˹Yf?oO>=ou]W999ڻw[m߾]ϗV6mt?裏jZ|ڴiK/T ˚}駟֤Izj[jժO}NߤWƪJ*ݻVZ\wqGmTTIիWWվ}{jڶm (pJNN}ݧs/T6m,pB-YD?ZhaO NroN俱D-\PӧOx#F~\ѣz畞͛0ѢE c@# s~ƍoݺ~a 2~k֬)IڳgOGHEEEiƌ={vzriiiv[!uUWW~2z-Zcǖ;vHRRR BILLTjjj PV\bbԩSr/7ouرeΝuYfONN.6tÇk˖-jРAXsݻ[a"V{L۶m;aޞ={c-_\֛og}JcȐ!:sԥK-X@[lњ5k4w\R'\΍7NUVo+t١CWPA))) U^=]}r\ԭ[S[Ŋgi7n6m]?ցN}rl֭s~YӲe+WӶ͂GGGk֬Y5kVpPAp d 82@@p d 8|Q>n/䁗Oz7ӳ\VVt $u];~ߑg<֬~s=AGUDdTnݻ[+::Z={]*ժ򿞞ki5E@;NRaa#G(2*RKW|*w[۶{ߧjR~}m#;;[VD VRr}$=ܾnZg߭V}Բٺڳgo QbbR* iՃݪ%Iٳ]b]ұ7ln+==]ْԨn5Doi^ϝVMq/.]-v\Ç+;;[>.:.hsܹw0p҂& 旍ԾEZS/5I٫a ӥ=/Շ~;&a%jwo۵EjШ V*MN=RKT>$It_h/kԦmbwu/?7_Ql\>/-|^~%[VC3(h =R={WR咒5?Tzo#1)Q-Ȩ(%$+$$رS{\R6 J10رc:r&1I)I,K7*q8s& 'īz.rdyTQz5}SYU!!!UV˥TNO^1LUff=ȈbێRllzAu֥Pfő#ڷw}ۿ}><Ю]:~<3`ЕEZ;ڵOmXQS~^6I۶nS4UO)ugvYlW B?[цu0).hC3օm۷.NJk֭[uyuIZ13.NuhSR4bحJݙtWѵOk*<<\!>=@y4=YihtInҭKr$h3fM˶m.6m:9eKwA3yٻ}?>>^{=a_O?Ӱocŝ.VժUʲ(ǂ5۷9rn?Fsڴ] @oP^M@.xZɉv5W듏? lPne4ӴSry]ZU u~?~<=@yc,UTѦ6oen5BqL( d 82@@p d 82@@p d 82@@p d 82@@p Ny f mPPn0p d 8bQ@w ĈcS  82@@p c;vTXXBBB^ziժUkת[nSBBڵkkJ&O0DkNJv˱;wӾ}矫RJڵ'I۷_k>|j֬)Iڻwz={ 7ܠÇk%3\(!!A-Z#< mڴIھ}z5kLZ 7ܠ{݈%''^z>|:t%Kpo<DNN^~eũYfR.]4rH{r݅kY^Z͚5+^=r97zhURE2e&NxI￯kVGV:u4gYe[o)11Qԩn5*PP&ܽޫ5khz74k,=ӒHM6MfϞ)S詧ٳ~'-\Pn[ݻwWHHHvL˹8UREչsgX"2a8p>#{zddjԨ^z[nѰaÔ]ֻP\FFۧ_U//^:ѣz衇?hZt,YR3gСCz'xQ%''e˖zꩧ4}tvm:pC 6 7ܠ~i̙SGQfff @ tp,_y5j{Wivn5Ep d 82@@p d 82@@CPk] [Y 4MlЫoй-j_Ml$zq5oR6Q4;jWHi4uLwֿyAA\iZs^5ݹZzUZUtuQ̜#o4m K{^=_MPT%)**Jqjب&NL7;zL;SuAjܤظX{ݰpUTI5kUm諕_poW4'77W zG111߰""#tt{ْv ]ײ,[^ /^<t?.9GаoTll$i޿_~zeY'}۩EVvu]D'LvڡJ.Aw͘_6lҭG)$$${ G()9I5kT^=v,cD=z_/GDJ*b 2HS'ݥA333?v|[+XFǎeyu3U_^2x1:2A1ĢJztPڵ5jH]sڽ{~a^~?:t萒ԭ{7?u˨[4iTDdD ʂ" z*Uh޿:C05]}Zb2@@p d 82@@p d 82@@p d 82@@p d 8@wǼr\6(](7b82@@W''7G\Ac8#md(44T!2 l" ;;}m{ -JͪuFڎV|L*'%,%-l{ed(4$TQ(! {(mߟqjmv:$]ڭ??0 x B IDATYO[|/he0<} Z^Hӆ_)2VNnrs7+ǎӁCkNg;NRBLPդr/rݹ=W@w:_]2M.Kef˰d|4-<;ܷØըNS*%e@>vگ?Te6Mx/_B*TSTdBe̙Cj~V+P9]pi?)",J+UiYwh.NAedYL_ҕ!V '!˒=ؒ'eyÛ IJO7e3'7G7yV:i?qf%^ȱ#ڽw#Zbi\޿K-j&;NARBbnO\=_d`  -Ouy+IdY9lȳoi˔!C,{U]j~jZT)2_+2Z+H »%,jܸ>x223ya+\FH<~9v)#Xы3$++TzU~s=۵k 6r.pr[ʕier=a3d³edzfnusmzs?}uӸ~b[[o$+))Io=Ϸl)xqw,xֱm6OU~..:eպ({z7OҥySj( ._t+ ùnܹm4M=7|}4vu\".QtyZ5i ۶װ+++K5kU*:&Qnn}y:s _.6Ŗg,54u͵Cd,[L'O͛UV<-Z &m۶z7u7ꢋ.Rݦj=FUMs*Eǿ`9$%IZnJ%.gK>yꉧչ}WݴZ7;Ww9-O$##îH?={N}(j Qԯ_?ԩ7nAk׮+>>^111ڵv!Iھ}ڴidUXQ5Ҳe=vXz}vծ][]z){YfAPrruqM8QժUSʕ5n8@i ٮ$ʰ[[9\EGW,uQt]:^ti ^q/]eVڵԲUK_q/jTܹn}''|*JVmKl[n7߬zy= zi„ ͛7xe7ܞsV$ ?Xg7mv\wޥ?_zt6-m4fzGjѨF U]te߁jۺ5h=/ח+*O'u,E!Wş}[Fެ#j%Ilܤ.Ғ>_|^?&&FkYѭFl߾]ׯ-RÇvZ;vLSLZzkm޼Y}G}Tǎӱc$IUT|;wט1ceIʕ+թS'm߾]+VPBB^-ZHK.ҥK` /P ̕;7W-wnz{Hfge)3٫zzNq-nպ\}ޫظX]5*Yѣ0\h"MvsmV/M7ݤC%K(::Zw^ۓ<'W ^b^*4}M-w;I8O?׻ ߓ$cô׵uZvҳZ[ڲe^yUIҡCڟ7O>O;%HMN`yNG/$?cڴlk߯?X 3njԬ+\]/7^Md>zWnXXZY݅U$I5k,t݆ z[ k_n]թSG3fо}qF{^hh$e˖JJJ5\5kOIIQʕդI9shjڴZh믿^|A ~ț.t]xq޵[uRDDD_5k!7>WߜWKaaaN=p߃zUv-mXA?|͘)ܵnJ˗}Q?6lu]g}V%ZSAg}Ɋ<_߭^qlܤ*UVgŝ:hM%%'AREDFQFjа_z~^7p׭[GjҰoT^>؜$&G<F>zǾkTլ]+OpSRwFRR)^@ԂkYnթSGњ4i \622R111E^jm͚5ܹ㕜BÇu!C=pX/WEyYTLT=N /VZU=r uEîT)77WFAԩsGIRڞ=NuQFԢQ+'ۻʋڵkթS'͘1C *zXX vHP)XHÇk : uN6ltӰظX9rmoXצ@=.O<$xUQ=ϴիk%,?>OXr'U,4T rUvmKh"͙3G_}4i^zI?\|U!S-ލ7ި:裏>RӦM m+&&Fzշoߒ&pR\Ɖ' 86<<\v>ѥ={.FIk݅˕_Cyϛrss5~8{ZjUrժ-񶤓޻wziӦiĈz٦R8XyLsp 1==]EӔS ]0<}?ԝV Oq c^GK~fzR;ةo.]f͚+ugjƲUz'+o?-[hZdn$O74h?P[eggeee)77/0:tL+Vh׮]~IR\\o߮}ƒPc;o=\(sI˖d 7ֶǎ?w+u4{Eߡ?͸KeUƍԤYM4U[6oQ4~u![˷'Cu6lUhE6C,O}sS8n)Cg+''甿@iǟhW.}Zgw|LLRwRzz=.ARmpzs:8zQʋoԽs=3Y=9 5oѼuS*h̸Ѻg}G]ũ/r}ڴiڷo-ZhܸqڶmASN㋬:M8QjҤ ]viΜ9Zl*WDn%''ƃ>޽{k[ﯭ[JD3F4uTs=ڴiS\´oe_-,<\ORz\ܭz!-|]u`M6Yvγ{ u?Wgeu)2 C>?O.K//սw_+h"EDDطCh]+$,KD(#nRDDws_F'ګg^zYqjۮ$(>>^3} 68=9m3V%h%>ÔU8̬qweG$VtwkV:|FJ):vk(RfQڳCj6SRBoVO#G3t~ϰ̣y>>ȨH{ZDYq/rmزD'I̬ڵ5ѴLgW?[ׯ3Կ[p{39&=lX|eaH`$P_5;!Op]ң~'U^URT֭.2e@,iCQߔ١˒}Ie,IF*n٦ὊcZϾ=eԳoI2 p&Mko_ 4١1ߝ2dn4Vm*U si1P.G{Ka_Gp\<`c 4!XF!\2棵\2eIc$$y't2@@p '} r49| xEG܁;m9\F=+bcUr5UTu Xǎj߁=WcNoɒϲ,^φs%˒ Ð%K\zWi?{_*`yCӲ|=ZS~G~ԭJCfխUO j%a?~yl F8Ͼ'o{.I_y|YϔdJg=˻]cX`Lo{at<}1 qܶY 5T҅d2(TZ]F4MDG_oޗs?oney ٿ+my]Su{'~G*&*Nn j =օ! b % .BHrT MoE[M5|__. Kr PlhM_2JoL|W0h+Ȼ}Oj%S:_5]cmY2-_~vh5$/{0x~:v~žsM_>"7n@ >ViW@?v߰M8_Ͽ0nٻjX7bE@ŲLSn+}ȗ;PSɞ0\֗ -ar 0,_0rqWuVT7߯Y:-yM7 #9pT"X=Qoהo oEq{଼;"o˚yUxlk't;>q%Ɇ)gwm<䩎Os$U}{fWMo' \W]_9@퓴|cxϚ'z56+f%'S_%wApYy?=(p{;2-6c}'>ʾBoo=--*L0Kڜ\"tg)pom1<  [翦Z' SP jNEfݳ+b!u ='[%oŖ!ߕ.yG8sL?DFJ"X[,ljwp^~?e&yf8u7nt;($=s891{\wnFYd8w_~EV|cK9B0\o7o]7T7,3/(aUY]}Q.9SvquTIҡC96s4v%DZmϐp%m|X UN p&xWDe!C><4bv*TիV+"2R9n|Ȯi2-KnY|UK"/VԱ>Iw!y+?׈F IDAT$'=;ڲy&N%ۭ#G4v85nX?+`fe:NBaq8#I*>ouiKy״lBUV+Q& dY: ߩ5i´;_v<`I@|_^QS>%&URH!m4h&'h͞eW^Y!!!>FWm U(rݖ۝7ΘjIV}צ(bXHA aVeފbH:~HI%)%Ye7~ZcDztY>Nj{PAggi-;11:?]9 9a~ =,fggeԭGWݦnOn **2*Raq42dj{4c=ݰ ϒOky (B 8xF%ir}{i&r[8Ժz򑧵o>]eY/G 34C,J6g4M}շ _xEOW CܲkMm#a4JLNPl޽;O9<2L1њvTutQܲ99,ePb6m.SAW(4e횟{n9Yn{ 7KuTbb%;uBCBʼV8JsXiU^UWGLTInڪ( {Fq9Ytke sb'C6*nQ?ntDũ0d"HEdNg;l1qz?[פWw>Ӆ iu$]6M3'mNǜײTP؍ׯ'?S*y^ ujtI+ϣJMqNpH_=&&) 8r9X'q8cC[\vuB'N~cWeV0ie^ۡ]{eTuZWjGe:Nv%'2R# @=-vzx^ۣ]Eut'Ld|le[_}oY;7hgXϣZdzSr**cv$&߮aߗPd~i[ꣃƞɤ!u r>ҠF]s1ՕPX6EkK@y 5 5n D#QE#;b 2`C@l ! 6d 2`s$ ]0/4=IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/cqrlog1.png0000664000175000017500000007454013203343610022270 0ustar jomajomaPNG  IHDRUEatsBITOtEXtSoftwaregnome-screenshot> IDATxw|26iNBJ!2U%XD@d_P KT(mR6Nq:4-x瞻OrDnn. Bfl BB!s6m.i[i-n2BS >X@MSGxׇQݸlp+;zÆڰ+//P5`2ImԱh}1!Z6 2疿2/WLJ/LJ uvq nXHWWww6iP\laHRU,3ӥ!|?iJJ峺 eOmzW`?e̲ cLV\c\'xLo^sT~l܊ti+v2z^|}}D@@Pc?&®͑bSأ$AQq*4`{s[7m;zxEOۡI6}wjnZRbja9!r yk1HrB(o=Ϛ|MQӇD/m(R!"پ!\BbW 4ED\V.=FM9 g70P@ y7wlB5_W<*_O@:"|` H ,'ƺq9bR'|6ך)eݬ)Vq3j#0`3Q[8#bY6֛_t]o; |0P]avRw׹#P+׀jU%9p*?͓d~N/!f;u=YX 8gI6 c|Rg*2<[gwwg=b`ghS{wt խr^[soAڷ;vP늭s B'i}^$ƞ~-KBN]%*{C!#W [py7׼1tMRzMrR}c&A_?_U2g}*I!R32~vw[()ժ3`'}:t5IK~3I#( cy7 uu$-vCy~Xn 3K ѱF׌BF M?V8a&J*O\QWήq]vVM|v^%bm_!цM9j3 eE(`,e(7/__w^`Ia 8< XAui]:{Bzj`g? GW|6TU6AI@4(.Y}8We+dn>2zݥuvBBZM ;k7{|398l˾ ÆKAC: p?{H씧WS_N|=@FzRIB}{^XHg2_I@K}\8spO6;ϦKW7O&p犯ڙ&;/HlF(?Yb\u!d>z'#,3W ?l?Kk{VZ6#k+8 ) ]'kDjZ,*4AzRѪ9Q++R9$ET )'553~ ]D,Y^LYRӪӥ`yI.t3ky[xq]Zg! jFS':dз?i:YZ/^9G8:[%`nx7vBUj)MseZ -YֹH:z?B!c!P!9BaC!dgݔXV/a2,w=?YYmެQktQ_, >Qea[ u" WUKk9XCVzf5N1P1;};}իn;// S㗬㟡_F!$)`!9BaC!d0!2GB#!?BkQBLY?BLYpBi? !L!Z!2K43 !LaZR.BLYwB!PKOB4vgi劄;q1,\| xS7DyWry6Ts!< Qh1/^lCܾ0LN={k ܾMbJ^=a^~m̃)ʌ'RǢ>X@MSGx@,%FX(n\~TڤE*MٛZDUyhA㿬tlIfTf޸weWFTŵv/r[~wqnN !9RROjV3 ):H:טet?-7P"nnu~O~ 1>k͔nσU ^Ғ{^Xǿ P܌Z wxgԖE7N׻߫{ ecEoڵӠ?w^ڵa]~ïMu`uWd`c_Fʹ/2k-+q<}?.g\c~8i< t͋ sNT[mZݽbu9[>y8k}Tڭ)k| \9K搖{@3_PyZR:TΓ]~;St ͫF1V3/PlT_Uk@e8m  ȯ]YvǎYj^` 6΁^\$M?ykׯe}\"Wo*Spku'/PHwGW!sӒ8z*Tٵ""Ρk" Ъ57( Xcb2@RQ&U_!цM9jƷe,B筚Om$*zʾ"')0"@0,QKr֐ zj T|y<>9,Ց GW|6n2+:#6vվRul` ^(58 Mj3ZPFb(uh4Yi6{J"&=Үw7?0iM}XIu_dEw,w2\>gRv2]v6=DžnTU#'˲ S?9s,pt$K4B鴠?&4%firdAX1SWFU=_DZZ2*`_!Bu'B!xjD7!2GB#!?BB!sVc^?uٌZhmBڼ+W0!"oZbb;ǝba*FVUzo kfLQf\<齍tWçK(ioxQ ү Spn+K*ξ=a]m)W`FF X&-`CrԬbIkJ uvq cA!_k?jJJ峺 eOOݺrҗs{}v5-ENݹ=g '7ڑN\elQ_c7O0YMgk,CJ|sB6no*#69U?{6;$WI ipjcll4ГII@im6y7 u5ר&32~vw:#>Q- v2TBjm—\V&+2:B> rtڿ+ ) F X#"k=2I$N:y{{9> ~HIHwëmAXQkB}8WeV>2Ɉ/|dxe>Tei{/HZBFhOG'<{PpN9x8uGjɞ\^;/HlpFEPt?a%ݧ _c\QvҦPaRԪ]C&Zɿ|㾻~B5.tfoZd>NB HIY3cq@MСjgꕂȟV.K,`7p 4ڽ+7u efgffeʄn BREYFV&ȥnK_ZZk;'ܑC=j$j5INM1XLH/SzqZ+d!R{)Q6?J°,"?2t&HnËefg6M[n^{w@ kJ[}#B`aQZZ Ae[1XXٶt_HRUM,{wOW?AC&؋cfFbS^^i Hl8G[KhVwJIK>B~81 nzhi50Z#9ì2fǶX_CG!d> X5d ^ᪿ+n,^]<%'~=W,0mM:0-[_KsSN=YУe&NW[R/2+uu*fYtt*I,M7~'$*,}A&7zD%`cfÁՓ9ٓ("li3\JqKv.vBxҐ\:XM][Ǧ*Hqq3?mi'pWo?dF;d>j * 082.vͿu!&q9>b \E4!j_A_\v็xRܸioGӮQB~ܣVPt%u}-g$ [&?H."aKtY>Xj_|fOzX.V?jˆPUƎzsIOVòzzr@[xiL <ҙ|=?e1=lt 'jA1/?Vu&R/V+V,`?Nx˲LA̮?gOBxwʂf?BmLOeYgʂw]*#C(OKx*>ݱ7{vqQ_RY7ǛǼ;zrʓo3AXm#%z䯟-s4 @ a!0!u?\ݽ; o-:~޻,[%1,) IDAT OTNc-Dr= b{մCCEdӿ>nã\=Γd9yp6Z~ďa~g\Kcc' ϒX MVnyYN.ԩ*/g4W8e)ǐގI>|ϕfY :3K[?ZtؽQwp$Hz ~Nj2 ? E4uX8)ᆀ)/NbA=L6BT,l0~Ÿl' p3Fb2 ׀vvj?-' {F~aU߯O}Q)-D]`"Ud=)r0 87!}B#@Qv+|K^?=Wag۶|^B ВOuA嵙HDL 4e>F-Z#|q;Z<~s4ʂ‚v횲V,,, !5 umIAA aiUcxr\b-i,hǿddz{`Dvdjvr$ S`FѨj#7Idi?uRl rƦaZ6>Z ZOd2L!Z;ejFit8hpA!T/m$wBK?LK"2-D!2G?(C!dR&,?BȴLYpBB!:$@BdȂOBLbC!dZ#!B-?BB!s!9BaC!d}cX9a0WQ Y׮QFjtQͬ*5zɋY{EXs5dgV#%xY~1fo@>/zխ7bVx_F4Mw nZBz'B!s!9BaC!d0!2GB#!?BB!s!9BaC!d0!2GB#!?BB!s!94w/ߤ"{-qI5mB!TK3?&ITqٴi+7ǹMZ8-A$/Ĥ:Nl5SʺYSlEU}Q K7:e9o%j{Ϡ+JPtv[XEmݲ,}`a bu^ʵu1&>gB{L\z~g#Ojmf%G`Og?/*_qZG>%Io繿l7M6v4yK6^֏}S!-el;tT&|۬bV9f2f֍mGl: `ԫ ;OwkvSw~Oh|/'y\?=kc ,gKאn^\ e^s1;~Msۼ-Y!;N_!#˒.'~NڻW426ӅoW~־ݱcZ908 g9x_{:,Ơ&-J/8hԥHHr:/D[!>[rzm[OʇP_f2FjjU\s[9ڸZg~6\ef:b/ƱqҜR*Cu@ixCJ!u-Rbnv뤡NyV,G_3:!Cj] Z( h  lҢcSyHӍw--%&yczwf[F}UP΂00gb6-\}F?|!ԗB/VWAءcG0X"tު)ܧH|se$@zj+SYi4 ˹}:_+nX}Hq)4 @px,(}k^%JgU唕,p{mc_~av+=g '7ڑN\nUL?GKɄ| ty">>Gѱ6p,VL%BuUqUu'gիj'ҺۨK9s-,Ky >nW=-V_Ht Qsѝ`eҗ&ٞ^{OLyBǃҼ2_y'qѤ??aa| 树f?R6ve_aC\Efr!&n+a:vwyIDlBE!vv-]߫RЗglLHoR}0ه;W|͝<ȝ}G4yAb%ѝ`JYIBeU4>vcgJU"aj& 'fZMr?l?Kk{V(h֚EX=Ǹۺ{#5V- xo [n _w_w\ac}oJh?v@B3eJADONKw0ޛ*4hg]Y+$ ,RhxǕs<6:Uթ=zzL9SRsC;!\9?'Ϳ| ]|EUK!|VjJnͧG׽Ev={n^=Vy,wԴrZ mzO/}_uS\bRw2\>gRv2֓ʲ'3BkUfO.қ|R8|co[]ܼ0%* 'Q< .d(!>!Ms@(+.mo+kf"y bT9i4b%ֶϦx ZZX4Bs8z_(}t\@!qaG0}tݜrݺ9~ܫ0疿2WLJ/9>wzk9){t罇ӡ᳅揬U@2yОO)3 JURJo>_hoA ѱ1}z&:S`:w748c-;o -kG\)XiZ'R; )UP}:ϩ+ylghU%9p*?͓PG)*h¯Q`W9 'Юm1y -jњ_l%vj$)GZ);"EUnyc#MEAӾ7F_uIVmozWUǪuyPx\XdP긐x3oqleɵ6#1F-[*0 y dn9-KJD*-uhHH+=MNCZ|JYOp𰭼nwnkfXǡk"}=B[!eӮ?f@i'vҐ^1L+-48o7ok:8Rڽs^s>y}lK>~5wv?[H+Icgm`o9@aոgQ>]}4[ν>ȂKP}mHqMO`|Tj.C-@EBj''IQ!:wҔm-j̲vp'>E*y }⺏ wv3"oqړV[ܫ[ eY8?DVb>_Jэ$(d]?v<>-mk mz[w~M;3v/X~Nvo7П?~_ ٯ5YWGN91G7.PBv!>z/Qdo+{|LQbe)yVIiQӵF="o~nljѫFVˑV-Wry:ibj5 yy '/ڼƸ~B3ҹ_Xv{^e[ՕyO/tAfͭ1bŐSU`LiEq\RR) VR~FS?>#l6TGr`y/oܕROUiϮ?ek-ȼ-Ȑ5cwf:d15qNNZoռymG_q[-o d}@6}೼Mal=TfdSYujJZ"(bJD~WF|Nכ0B.-2oqvJy@1k*[WJ3ޟ@Yӌ*`5tRmeZPVN~hE2-jf21eUF|J|*v| ~?Z8[ (z!9BaC!d0!2GB#!?BB!s!9j)V>G4s[1/ pt&-`CrԬbI/Rg 2c9l$RGBVV-zv+mޕ#q9 eB>KNM%^S͊$IEZrqV{}Mεy~716~oYxCkMIY^De"-ð,kX [IŢU2sJT 578SXDDhly魛JRsl=<颧I6}w6?P#2@ n~C.Zmz4AޢhPln'䘜)Q eLnGbQG)zwdX7.<9\(fg/O^0ξqjC]*oX"d܉>6Mgs]+cC5T[>ЉG$@W+Iny ׎:Kv=Oo><P?6b˘eƼ2f4ͥiU+ډI *Fb*fXiOAh9wwXB]%11{O^7o#|^ (vǯi'xp,ɦUPaDսp oWBm@3?[Zs{f?6AjE9 Į32~v7R;aCFzѼ4~!dX3?uIICɯYɜ- )KX{w.))[Z7t`/UXFIQDC@fE4r!dX3io++U[n1Minvdv,wccx[*me+e>TOc^2ȿif 3S=o ʊ_dVs76@UPñ,R5ێҔ[{dAXg~B%o IDAT-z1[Ba&3;3--M6;::J$h͌e2"SXeryƿ'3;33+T&X4w[K,#+RE5Tfvfn^ms,޹wdGTOZ4vN2#6}Dp8ɩ)]zFX$n;}̌X$ak}* ò 4w[^trvۃj+SHl˛!a fƿև Eiii5M{@F ,,b/49<ƿV hpc U[9e15%!A-miEd{+²,M_+D 6#aMa7j՝ Yy9yY`g`#i|uMF^6Q^U3r>kEtIs]{:!lUYS7?Uӽ>x{K/u\6zwMhFx/j\-"e_["H\Z_w쑞]Jh=lj,Ƅ4Y~ry'C5Fs roƧ` ĹaQ?; wǤ \B~IQufqF$Z>P[$>|[@̙?܉ BTUk:efm-vAT/0o%UƒAؖ!B aB_'2M},_hqڅ^~"5ϧih4R^TRxڅm{FGǔwTĀu%?. סݺpzEoC'Ɂ2^1q:?Y*l,O[2Y܎&B`ϧ *8쒏lgV?mxGt-jf>u[5ǧҭ[k YѿKjb,^=范uUvk_ozr^Tqa(/WX~~MF~+;PbmkaLx< --,\{VK!9SX9mi6Zazcc##0UʐC8bFPͥ (WmE{~sRl_~۾ Xaީ߭Ӓ16 Zm%|P(4OaX`k}is:YZc! \O|'-Xis /L~~H$=j[f4sKNM s---I/ONMph*59׮I-ӧ'T$A;Y֘z,u:o֞opB&zB1߷aչo[y NFb/M,2Ui[Mm{LkgY×_,DBx^;yxAa_,kee5dk@gO񯤬Xf/R2{YfN[7m;zxEU6Iyac R{Fy[R!"eb~T\ ' 6}卯>?62r#@~=XT+?>$ ɾoC-_S+o0>fW*ԑ]- ~ZpLT8YBlF(dbrɳ[BLFplty`VmdY[_y?)ǞSU-Itvy;Ot-ц5x2ԩEEBW^l|BS(V6<.OΦHJ,y{}(fg/O^0ξqjçĖ^\iY_Ets{ D>Y5֍ Fo𱶖lVv;jE|tDiS u'!xGDFՔ/Ui=._ @Of]w/{<"7jsnp Vonߥ/Qԑ3^. #p>?WpWPB>h)94iXiZtLA̞_{bW*d~N/!f;u=" l:yN<~-C*6*gc=FY9vu/J|̗v|$)>4_!ppKYDWgW^iRkk!}ᑲ;cridF꺭C~uo(fvgمeO`CAEL+++-ʫ 3MM-$1#^3B35X]y9e]~gf}f~<3mb?e0U:W#|~X=E2w |yRa;M_4]+QŇ>cI-=l$:P޽*?_^ܻ>n~7wc/otvno[~ڋ$Kqyxpie:;!'6_R{Y56tL~뺍?(o9gpKLWT eU㟑1\{|3WaQ~ V>_nTJ{'S U&U[2FΌNLѧ>/s?2U7Uh4A9R*P![˺杩 GM!hҁ9MG.[Qtc QPOWO,f 7߮sB4fכPf. nLwJ[4ݷMXrgkdt&bרظ|R&7p A~uYi_b{vr߱o݊{ 3(C3ztxy h@#J A}BJ:|Çӥݖ8[77QUGɻMZmF4kvKL/Ǯpg?KqaI pr<PyE$2z5DZ]L!Hl> %tfҲ~n^~]ߍm QM͛ώ#x9(sgܸcY-/o$b[k?W[S]L /1*_鍁v ﺭw (G%=t 7&Dvv^K;Fv ._ltpr*ZBZ6`&^YmKjJNM6Z9"aX40x&s0u܄797Yq>xIB]7WvݶnLʦ lbgc=]>g0? )ykʍSzj7!s/nYKv[&i-_o)E@DJ珇a}bXI)I NT%CzҕKm#kFDu, t:Nh4xY]Bb_n{ SO;cf}^}H(r84*@Q.Q)̀[CЃaZmR4*G6dt:J%Bi6J՘BGzFH(:pm]*Q)24c͆ b[B<[h 8  E5-ꛙ˱6HLǏJJJl].wƺj)o/eir7yRJ P(Rn}?2K7t:WWwї=e4j5X9-?:H$pMJeX uK$ExDј:RţR\.o h4/ϙfƻoы+XL@!6K7i!VߑCAaQ= iBB!{!=BaC!d_-/]d~i>̳dNb)7-T>#Y >Pi3ЖeD}Z W/[$?AԊ]]le#*N}a8XjVESz 񛂱]jGLWcL`>j`p3jT=x6PczYpgRY=Qe T"a'B!{!=BaC!d0!GB#!?BB!{!=g.sx͚Ri49EdB(ъ?եҿ8"ﰗ^7L n~3T'#}ؒ~Y[K@!jir ɰS8s^i\n 埋gw6zZG?FȣQ--XN3xQ,YqφD;hB(l)m2D@Ow>2" !/C]T3* nպGoqjrOw+:vP~UෝfQ/W6ظ.wOV]K7_HS$!}L]=y< =rYo n)B5 qrA])O_7#G9tdP_w6_#?RD1"w9ǸO'Ao7.Yz|”[9~Ϳupuz7U;jǥ!!Ћѩ >~llN.[!dyYO2=er'VQTXXc$##nr+eGmUF jd222|<l3#i5v:́5.*ʫ704m0eo WxH|("ehd_2 jd9:꥘K,..>rPaaAy rtr›Y?1x^C5zs93zJQq#?:r <$5Yi  j\pz J#y =TTTT)xbD k;|\EH$>lK^^ޡ#?O `=AL&UcaNnH$~c`ޔHyyJBYKY+)I?k(IPaFK6?*NlAsMh/aYg x_1ZKE{>]}o]t?$nJnY;{? +7+Tl{o)oGĢc?~U}}'$W%=w6ey6܏O% _ VWOx\ҩmи8x%H+ٷ+=-зUԠ_m.d]p>=GM'".z߮W}[^AuW}GZg+dX?ӟkYs;wVN\uc]{3Q jb":c `#:/!vF̡ 5+PJ'_#ِ`|Z̴j<0oFy<["XԳ+]aBCyJԩWsaPlV50@9VqtǍl5z9/5'e`\;MM[2-[' 6gN|f_ӅBpn#JL'FkҎ,jAֺYڗ $ƵNxaKj!St}72ǬZ2¿\^#)kVƶZ)#B>+q#cW-7ךﻄ**>P+5{|z^ѱ㷬\Y6Muz2,IH:SWOr?Ou8n^1nár6sOz<K_$GLz0ըϒ:G#7E''2I]*d3bjN5)dYlr]$$j0LyRT3KrwG#g'@S h0͹ 7=4tY.r!9=v6!-I5.{Tn!Q~~e)ZG7i$7nwT!ݛN_W[V$IDAT&EOݢ u7Y١U}bFuSU k_^nVz>֡Z:Ь4^UHFu MJݦc@g^z5AWU<jHq~!]ysZ-u&njGc{0K7k:8ͯs=\"(5pT@y;w u1u &gn7v؞95PE0iU %BIBJ 7Ŭy|=Y#ew6^T*h ߜ4ڹF2WVթja b?\e..o3YAyzϿ -0s z_fBu.*PlLn7^+5RѯkZ\޽] YѤl!ĘA&EKϖN MםJz+7ՏyH @rea={7̜}|=)yr:# km9"@K ہL1cCh Y,N iJ$IDiZK|n[ w!!Hf_lӳtYw${s >Ry-=mnF۫_ecXdMp+XxCR.w~ܹ'n<+_# MY6yos4Ø̯LoEn?*!>lŕKj&-uJKj`x h׮+\Rq fAmE:k+0o(n<՚`JE'>e9HQv[;s8^Z4:թM4F{)gwƍg}+mC队*rW.xSщyђE莢d͛ aC&T-OǀhԷxipI-)ʜ"Bq}4lxT% f=@Ѐ&+GFm71{nޖ>tzt!=:zͯ~uYi^&p7f.3ronL\OZTKp|[K>h-yԿ"y;n3~78m7G -I]$%f슺bqzRnP 9;tiq ~K5Vxqdt/$8TO>A$aovqxzt_. XfCK6ULpju4PG*fd;|4;H\.ӷ]@j V"N|k]L{M6f;ظjoƇMM0Q=4\H*GB['ތֱ7mUBbTBѿ4`u1tx6Q# [|4?vh' @k}1ղ:=O }r3yNjBzaSӓ]"ky:4 r IM@3R"}E.RyjzOr\%d.mo>ٝF=D`,p xs^i7/'|wcnGrVH&̌cE], o a46rWnR1ulaDAIś/+|l1zQP⎍u),vuQPD֕)NNN+ƋO*:KnފH1b:H3P~Z~`q0!jK&OJI^4')$e6>6š((=$MJ5T.H0%EQF߂ЦURcDՒD"oT>sX_x\L&:ΆhlbN+).pfTB2gV";ԋѪbL,R*aCՖNJrzY2MZV+l|Qaa?7sL_>|Z'ty{ :u Xc\%2Vjن$sʋD/rL[֓lIjm964ʿsYm\%B:+ a]B=W w[=[s{^F{)z W !Pc0 MG,4 J_職/I̿skqB5  X,Vj 8. j[Jv̺!PCNSTH,XҔD[UB!TDajϩXUB!TJ%BH!?BB!{!=BaC!d ?}!?BB!{!=BaC!d Z MәY*e.!s$^Z!?YO2=er'b-EO2]n )OFF݃MQ.56!a?*ʫ704Mۺ,ϋaIz5/^=!j _!XTTTc)c52QH#BF5|A *6Թ0&g@2_!A1m)BW;i&"^tꏙzga!5Ѩo߻$Ӝ'"qsȃZRExC?9:n;\ظcrr.nŤ0[88L@MG!T "e>}tY@"yyj*7/Ct&.÷ ^²^qOaÅ&?Y%%qc8ٟn,|eƷio_NNIV[/+k 8\bVU ._}xgWܬei3x0q+otѝk8O9?(οĮoʌ ZF8+ 6!)V$Ú +V~Cw_7">~gpho ֍Yg 0!dVI.I+Fsp''$ތֱ7m1SJպgo-_pwh\9jH[UlՓ|S67UWT>-=?4p:xS C5|Ny2MMOvʥWgggV5|>E"'[lڧs]G k bO)VI-ywXWzIL p<#;<=trʧYJЖhc# N Ѡƿ.,.X,%̧-)I;q7hR*&i3ھ.ؕt%)q G|5K k¬Q]Gzwh\6 Xuv~lg3@؜=;I&Yө;ώy}%#.(>YFfiBlbā`"YB~v׿;3-I6)J));_ڵ*v:ύ3:]?Y4ԗĝ (䘡R>; ޼g+ecvcɓa-CgOO87ԙw(Yi[~OYKt4!T6š(b;3 CQ hEy~cM;'K']Knitd;(WS?FvS_{$t0{+MAMd~.rAEI^9o4kFIXmn1!<?!_TXX sq7@ 6Ecʛy$W*$!O/&eg}&L 0i?-ZzItbai{vnzRDMX;exP][>KW.7!d^T½wIL3{s)~͗9ßI*ƛ^4a)P(k#n60)jFҟKB/fN Hy;/ЛZP0+@;}ޘ̨Z˩›MGF?K2_LU\m!<`ڿWQw1l cߺG 0Ie-GQʇg.?) f=@Ѐ&+GF%+ md?Pg0 M$8 \T¢|o_`@Z]L!Hl> %tfҲ~n^~]ߍm QM͛ώ#x9(sgܸcY-/o$b[k?W[S]L /1*gՠP0VWCB#._ܮM;K#;b8Nn^RTUpy\X(UFߋ&!1/7.G N>*VsSOByE7ۏ :NR "PbJSJ}>;H!To<2 V]rttT("gYmOPTՆ%A! woC&OJIR(.)$y@zTu}9D7oTT.p\wD"]['z N'Jry#>3 h B hOζj16 mTn䠮kmdAXOB XOBu=2E7 B~a'j ꙡgјH!du9 !B B.!PÃ!=OBvԲEKW.S4CLy:LY"D Fm(bhJ&ِ%DDiziEs*m6϶HI', PQ'V-ImUILo 7!,񏢨ȶ^ B!T+x!=BaC!d0!GB#!?BB!{!=BaC!d0!GB#!?BB!{!=BaC!d0!GB#";;[/I$\OIiach6:mt.e2ƗWZ,0QFVQi al>h6BF'ы?ZNN2Nz '=VɯV#n ۯVC,-<,UW!P iQIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/cqrlog2.png0000664000175000017500000046733213203343610022276 0ustar jomajomaPNG  IHDR |)bKGD pHYs  tIME&: IDATxw_gfnX XATbMb,hhbK5nT4 vT*,w23QY&_h>Fa(IƱ $|v.aLa (c_B00M3DRJR8 QSX‘5#|IPЬ5Jfeч$s`E/F Rfx :JP[ccYKċ 3m6>XF6U8*~..J>X\KE9Dshռm,LO6ՑJ&QA+! 7W0pȰ-?B`6TD"Ohq5Ch П\pwNiY$IVZEMu~qS) iY8.{Hj#} 2)!Cy !H$[ښZR:zvUc0 boA}QRcK3=( i0hŻR=l3eI},C`iDLZ1-,ݹU!wz%5Ѧ h;u WaPQMٲua? *woÞXKyKs.Q@qư-0XCm~BR3m4ZJI; ( aLqI A6~†&(94ɴ"PAƷqEaX`I,s;e,TH-@+A{%Zstl[K3zX+`ڛIІɱÊrPTL`nr$m"stHr7Og2^U$}h iHg<7hPZ`gMB)lG m>^_C ve~@"p¢> ʄDHIME9"' a'$!|>A&0L h6z<_|q4m,@i4@Tqzܸq[_UVQ__?~FҼys #rRF 58"F Rux6ڛ6Ѐ+3z8~9AZKM,I*Mc6N45P[b޻xcD}qnsې} ZE~~ZK+kVAMKTUvF5 m*fC&׆3?d 2{Nt(yn7*Db )l'PNgT"S űӸٓ:Ķ%vҎA&"%oى2`K)6&FUc)R |\)eDq ?-B(Biee};Ƿϗy@TMv6Y Z:H-0 {eTbm# ivY !h޼9hZiD;zqJ8;v,Zkjkk1ctQ(%q T: D !{0l V 'ɦ=q iXbvZ[X! 85 E\!s!?m1۟ qĵ\C#5e)%6vlgm;Dir;X vt"-ayB:sFkjx S\~7TVOu1^9&`ݔJ V6N4 WH=MM\ Hٌ.ѩKgDz3-b] m%R̚Mk6HxZ[[JɎjlm"p)eO|xxxxxxxxgE^:tQJD`AmOL&ҥ |g{L:!F٩~lZc,"@4N@斍ǯ i@eNgrj,ne[c #GuiIW{@Nn N$ "xA[΂SE %D &Y-N"02jhMCC*;v`ܸqL2͛7s}`uƀtRf&4.Bn,j6ZgW϶N,@Jhݺ5gʕYcXVJ"D' # ԇKV2cs0IIi=;Xt`ln}n5 S :0d2bV.pYY)vhC8_! lb}2P7>&+%]bޜS;t^QB'swRc)U29G{xpA9u" R"6p 2YE qw"Z9(n z#QvxbCgHv%z$iǨz@7C2fkpqR);RiS -m CgHuQ K|x.^wutALh\Px zxxxxxxxa^R6e< Y0uT}N9:t(\s /fɬ^*3JVTA1tCD"12FJ\efmhh3dɇ7J5ҵ$kq#r 㸢qz|x!lV0{E9qOv:?#— %X2g _+Ʒi2XusŸ5n On2n]vlΌ<'K(mS#\Ze Ÿwa|~<1:l%Өl^f栁ol-錈6ro: Ik{V{wMOW0a\xJv/͜9mPO 2ڧ$ 0 TCk"k>\O(raSQQeYL0u)++m۶tؑm۶L%3tSK]]44dCz&#uMa ***mk[ B~8AbTmp=9W!-6۶8R9l[0ZЩgzckfnyzC*lt}馨Kc|>[x}u%8{|~Iu[=~R&՜!hXhO. A& śgǶ\0= |n嫶!)Pي\2<"Kr(D7r?RDHav)նo%k1Q5Rd$A!Xxbw*AeCeKNڨTt`a[֔'ғ91,|*cFK4{#3m 'jҺ]k?BM07ı P`ӐrhSpпF/|`XO{y' -#Ua^cܰܵX,Zs{A&!tk bD/#֭$CgW7`aP7n]:}ǎl͔֡VJdcvS}H2SZq%t2q/ڌOF&X^ۡlO1%Kґ@9KQ>N:k4ᐅOmt!LqPYJҎqAwe7 mVwkK 2MB~3;U&4 g=$a(-laZ&>CJKiHHC )EQ!-QC"|WIb?HSfvuRFٵn>_ʯNbsٚ.mVMMܡ| MBxxxxxxxx_;3}vFIP=dR*\Be@~?,3r4`Ƣ]H)21 Pc29'lXVT>Ʀij7e'AXAo*?21cgDagZow[Sτi ϐ _ddΥg됐 :6( fBswVW>ٖA4[L;(ƃeÁ̱Su$k2M#WDM\f[;ټ~0hڊ߭!#@$dOmkvuFЊDN"b9D-a!<_֚P(DN4{-]0IE;bF;c 2R{aվ{*Zh,dhݾ-ďճxIKipY K@ױD:ƴ|$&A&\6v&LēISb{N%IR)L<2ߥEwh"A'%Mâ3V}KKqX"SDk瑪.Iljb3HlOYNn7ZtR dRSW%D?`SrXJQEƏٳ]<kc{۬r*6 LںMԸGS)))aʔ)y,D&\&JyNg>8d V&@˓7_NE aVƅfek0L~ɷSZǷSC`y ?@w #rD Y&Uw_JA0Y⿬F 4k56Ue7L+XǑy&)`f}>2}60\$wPYI]Zc_jJ>[H# Wa_PԔ,aƛ]/x*0D_co0MMs^GuDGDٿ`H $63wX_%ְ/ ⵏw@j>|E> H64g9Y3gIyĨ3J(?lͅ/o92 E%TOcK/$>G(t,0!BWeY1U^[VuYšOj08~,njɸi"1%Qw0A<Ǽ-o2NpӟWHPȗ]Ubog䘱ipN l7C> Q*No/?h@ ˾Ǩ1c1~2WK%)9{!Ǐ1'2ۙ +p&#~>3Pi+M2 3B[fvG76;?Of8v4P=,YAm֯nPmÙ>kh}>k+^dm !z_[ ?B~рdB Mnt(xึ9ۣܰ? >o iq(;EC"4 i4V8B2@h>Q@)b4ܜ& 2lCaZcҗK_X#rhh Nj GYD9LJOZ`CDA,C㦓$Ri$%l5H0TOg>O.)qEo_kWNÍ(~gӖ~L4Z+w[ƒwz~DCyEH8hTDƕa)l;zkh>\ 7߿^]ɕZ޹Չ M-4u5TW#/`&Oha`D#F.Z|yBθ.&AGrI& o%755TF$p.w 8Yu7!ʦ! *H.@7qL1t3j\warem" mb ]L"DC{rM}]-FR`X0+\} D$Kq 42^Ca"Aqf,'i%^YO"Ye?&ħ$D= i Lhj IDAToݕ퉜5g;/),1n9 *&0L?h:_᪢Ե%MLev?+@$onk8 L_H$O/}ބȈD"-3s81KJ''S*`/"cz\5 !aPYa!ȃ߱!fOt&2)4>AմP՛-J*Li{޺q/}aXȊex{]t?.!m$FAޒ{f/N4Bֳn*ӧm1Ak7<NxW']y<_IMځp;Nl WOQ]nof E/~^v#4t-oL; WK_u;`R|6 㲟Nc=3?+%%5?Y+I`d5wpqo+c+]ƌW?pCh-qyǟz5U.J;I V_~n~x#ӛ.>΋&]k/pً{HF.]u<6(4˙'t~j PMx򱿲p{;R8nlz~V{vLj.[3+h\"㼶|6i7\ȸ^EXB޵gλO'r2z%;e.BfM!vݡ;Î˨.ȌaO2ޚ~'ORX/ah@471I2b̾Ϭl}.?:~$)e0j G\}|4^my;~aŜxms=<O_q+ֽ9ۥQLz j/e΋㥏Rg98ҟs-<Ĕ@䵿񷷖R6>w*SNA쓼4s@];i?}G«? 0M,"dbf0u3kN "mpqQ~GV*!SC&]3PM wo1|j³(Bt>hF G _x!Zf=x3YD;xx.t2BCpt3?'~<:HWf Of~6Ds f/$\{Xm{Bvqw%ig' bRg6c]lϳݍ)9:!L(рqHᥕKso/gaKH4Ƽٝ}7qT7E>gSqu]#81L&r)߾FԓLaK b6Y3Pb)yr4wքhΘ!]yOPxQۓcs'[ݞkn9 __0C5G'.vH5 焟%V@lJaRuWxP=v]3n_s;Xh+MG, Wmo7g^N 6rJ"`Xt wz&-һFKӱl9 2P43-kogxvZҌ<2R\cƌ>qʥl*VӇCzn/25!]6CL_t>5 ^ѯdSѢ`' }w79=ߦJ/g`fVfاsݓhlpcNȆk,h~9t|S )%qpb~zO<fEc|e[CSKD&~V(zijBq`yi7!j* o#Y3Nn{1}6yz=y'\Л<.U|33!PNVѯs1s J"Cߺ-*̀Ar=eeR N)׋3I\_r殯Dm~AКv[V-L`nkb1$J+҉jt^PZa;L4h ?{s^' {ү Z-y yt˱ykiϿAi8i,En1BI-m[a5~*"gBAMY cڴ(]/>̌9ᅠur(B$bJ̞;UV Giٶ"D",f5XQڵk=o31 h!HӀFpHD*P2=8L{",y-,Nh1 Lbsf{-(o{C{w0hP4|V-kVt㍥ "N9Wᴉɝoa{-Od=s|Wђ N]ȏ[B#ɏv=f>BunL9*ߏg(GIy=ڄ%:%TIm(MnML2QILzA.:ږB!WV8RtGŕ2s2;',eV Dԗ&8ȆjF~ar; {<vؽe'5 V#7FҔM^\>;>0ǎgh{I&x+ДmcN*v{[< AkH+JIZ)%NpS) :E b#O+Ks+xõ&i )Z(,pI48t%l8Zb:3+76yjFip4ŀLALhљ.Q"JR8hUF"9MO χZ!^WA5f4}03IZMޱV>ß'^[DϏ>a, e} $+8z8:hB(@tOw^b9t`sgWy_~gƷ)ʹ χO_Ndf8-,iJWLzمO34 X 1|dtDM0pjw0KiR:0 R)(cMز䨌:00 j CyEt9*uc{eMdJEXZQ]Wx Bia0N4LMiD)jۜS&קpP%5i"0֦s.fh8'[Qn>C41rYiӂ~cΤSY3gL"gK4-jߤVV k>^Saj YOY;|ƝϼđWЊ)MsdtN2L ֬B1Sc5ʨҁ{C[QM9ƟEo>ValMuɮ\==|L.b?x%oobig1~n3|ro9:VPL ~98S}H %h|}a7,"Qխ8Dck=sq_ 0B5gwI9 [A3ZrSSxMKhYGpۣsE0UN@Q;̭|H'!ue~u- #Ɔc;U޹ E$]a}>xNn_[|ǏC4ǭ;'3qDwMʋ,Cv$мs:o_kBOyXQ9 1VВV5,̚Ob]2b=^XNq)nރ {-תw^xQcH"*"]"nF-h<\<4;C-K2fOFmEyc!byۦ泹"3hEo|Y+' WiB81-YĶD!+VyvП#T6,Xr7ĤbGc&0SMs KgX9vp Lf…9S7#%Zϻ``8k7籾Oϣ3`(;|,fe%qZ@.Qv.]֜25ĐA6|^7b̥WW?;ncb]γz*NabÊoHn}c>/2W7]̾:za}}r/xi%8܀7Gh^ĸiLhILY̞U{4FLògxYyu ߹WRXȤQI,{9Rofĩ|t0 x;) U6u*Qֳo?3dHo[9 }$6,yƲ ď ߹r&ә\y< Ke3 9l zI13R`Yi\5J~ѧ3"~J@hKY}.xVnE;/x_:P {>Yv/'v,*,Q󨛒*Θy25+yy-^s Wp WXd|jŸI]holϴ8{hrr^RƴIX1Ij6emC'MM,]ƍAlxf]{)| Xsgx8K(ښAztq]%QpuTaNJQxQ5*u7n+1 1ᓾM {'$Q;dXA ϒvx:Mզ'vsd=Hf _E"jl3%F<k!e8xJDz,bȇI|7- S9da&H5|'e =ii7{t2i囡(H!I4"0 rY*0$xw69G^i4X;Ϧ폨Hiu!v&GI7,) [U@R6﮷ d(vvC7tC7 ã B6 `"JJJZUBdY\2"5MCv? R"4Mk3t˼VBr.[34I&)~kAA~bcccz}! .˦vAAAAlsPJJ0Mϥ4y]Z)%tK@es4vu]?{,"t:}xEpR\\.-]XD"-UvC7t!ơu]̙sDAhΝ;իW7cܸ;X,.x߿0'!Ǐo;va:MؕR2x6i&ez!#GguR2a„v׫˗ӳg.adR#GlS2 z0 =Gskjj(**:}2dm ٳgӷo.Y3!]/ CN8v\.믿N>}A@]]]/1v6ϑ\v Guuu.ۗ64M^|E***TWWӻw.!ƍks2iǏos5Mc˖-lݺNߗ&%KxUyy9 RE7t*2"'tR % t,c֬Y:A@m>",,,dԩ<<>5tȐ!TUUu/ C\=;'MԮhqv˲8Ӻ"hw]>ӯ_?&Oܦh޷o>nʔ)Sħ:BOJ8Gܧ714MmTSA_ѣG' DA%o2abvZ󚘦to LiO?}>={8st8Z !۔ \Ρef,__Bo"mUUUѻwv&k!^ho˗/JYG !< ڝr)]xb1}f||P! AcC*~ޢi%%%-#Ç3|N aÆf]%?]#^0D=#N9ZDptR (D&I^3mL&93[;2v)%A!V]\~HxH)eaXf$2ТNkQ.Ԃv'T`{!rֵ Hbjal޼{2q#*JS;F[ne9RD:(Aܰ+gTq)pw' ln~5Á)" KB} \|pƟ\cw ÐdWwzd DPͰe<~ǕJ?"ep&f$bh-@!ٽe;\& PTdq=V`>0mC_~Urӹpwnn}#~eߦBA*{}N/`8RѬ)Rv{QBjF^K!-zDMx &/w(4]gǘ$)}c)؛2#c -Gc9&ؑ56MMӚ–iQ|pH%7Y;'p4R$M L(dEs&*P!4Dx~ \m$X^A*{̸"iA<P$S98G.b EBLV5/ޓˊV %x F~\[`Ĭh^Z#T埅]x.!CxW/ KJxGa O`B㷮A e1gKEϞ̚5ߎ 9P`Vҡ\)RIT"DrY޿ B0.tU!YW28F[*!>w>Ȳ`]DyJFsTaH(%Jל7t V'ѴW4 Y۳gf޼yuY̼I` n7~iz2BțȐE*ybezs\_f.?l43q6%<"C]zJ]^M'GRvKMy{Ln[4t'G4i-yOrc{ޤIgLi8g"SqPs&'.ϽOo&k}q=>W㛓So1:~^FscoyfۂS~Y#Mvy1k\d#w_X#\^$! 7Z_1(*)BBx I+¯[/% I. B+S5%teC"YlyJ5nC15-X]vQWW̙3,LmunI0Ol."1ddzBn~;s|~ qInͤ4tVs%sx8$$ڬ+s ?N(䂯*b_(WCIn/:w0 "{VsFX#k} ,!u[fA mcljPp/+=D2 䇷%yjVpѷmԧAqKgֈ :o] j̾/ckV2wed d?9_Kee;46444[ q}=v-3fP|>x7}QyGZ$ (&6l/K8usҿ,"~! Cf͚Ecc#FP0Eٻ{$Yd%}eJ>:a c)XJ*zTvoPD=ɓ;# D n%7ЯL-~<;ÿ?T| $5xvw-pa8k|ItiIqVU/RyIROdbKW3RQu+Sb:5$A!NÖۙsXʿO}S|7[8^z|v;~%A~u%W9x", -n,I|tc𛛓)tpG_nOqt?a$F>wPdo yK7[G7 sDôC;59,Jus_lxCn1ŕ)MOCU)ߺ4~+GqɏoLrߋ: hj& C:ޚ7ORYи!ǹ{)FPpu VҐW,~$VqΐQVי,ܘb'YOXyw8T>g-צK4tX<޽{ǒ(y t I%b?;|I7?>̑:u<l;GEQ Kx+>q֮ZǑ,(T!w^֭[Dž^wgnr`V@##&$넑SM!ؾ C5y˻BC c{t@ ?: 1ў r_IYp`Fe/I)]vm6JKKrb1^~e?iKX"t!M(8E1.#rȶB eڑ񕕘|gxϴ wes@ Mr61w˵3vLY7)6KtIJ nˬK:39  h VabI>)Ax (4RtPE/U' %җYomv"ؕXb]5Bsك *y}㭃>;,߅s~4&04OLQ)N+:MXb0ma&o&m  E9T˴>Q "T^Q?}կBhK[_SU6b&̟?s=΂ Xd+ .]w]w1jގUu@jłwgK`zNL; f*V}"ş5<`I|{!X?`I*fkvJ㱿ӳ:ͣY̹:õ6p!Ru"$hzc]f)^2pLv=:8!_Ɋi>bvY#Z V<`QǷ/yuKgЕ@|Rb|zNFx-Ν`oe=Mz4vﴐ]q1%qPo_32lxc4e.Kxd02[}`X\I.: $m CE(! /P$q _(&ĭݎ Kd~(3 )-)a˶jna[ټa-Es<-4@@ף#D$O<vǜd- gu(:N_[67k.5Tp|@uB_U,%+cJU) v$LTXA^x7˝/ DG: PH6<=@Ghьr;g`;h%m*!MIׯgذhC:f <HӬ^rFRRE.tt PRP7DJ(d}~lMIuT=zkAJȯ] z0- JD!P!яGx \>W\.b g(\ (~^ƀ2%Hk{$n)K 1O.M@y ntit$C+ V [gdЃt Q/6[vC)= pÈ?[o3D'B/K>d_E[]mtڤ0Gz~>jM0$XC707u{9h!臨9@JI~(**u(U)t]o̘1Md…\ݻMӚ0,n壳<__0Dn󎣸p$TEq}_a_~*KR=?6lmDAc.K$1 Уʧ&ƭ { jb<-9>At> :;ݣaEeO91q}k?il!kرYg߿*Ե>e:8ghdj7t%' I*A@Dkoz!1#N:\{]y"ҨzE1,IQ) ARbAԂ]J(⺁ݐ> |h2w'V#aT<er6Rѳo`ԏ+oqܤ3EaU< W_ueb\`,4McԨQH)q]:~**ʽPDJIH@%ɼUR$t? aN#gP19W"Pd׺*< 6@څۦ?$e˝N N_y:z-A\ <6#"K$mVy]]AP[[۶Yn]sŤK2rdUWWh"Ǝ۩MУxMR46)rǙÓ:/:6zT=)OD`(-# (D*WJP*EcRDI]`n>zSeP4jlIic肰ZRL:;:Q0ŷ2_e1c `Wc2Iu}}qGGZOj|n%Jt5fV K arBN.T04JjP%u!!IA?o@b9>S*NΎhHP:s_KErF EYY`s cC=eY%p R) 4 -۬4M2 k֬!HP__ƍpM \G,~w1iB.PT$"PFp2=FI|ܡi5|njEf_T<$Fy .dAbS@gZ}:4ƦƐg͈T}46a` d_=M%JTC~Z(.)fofcǬhƞ={8Xne5bgqiڡ*MӨhn*iZ3?ohhh|t _L՛c&uQhRf6K:'0Tʳ0U$cո';%1[؋C_ISZ\էcA`gVgn'RlKn8 hqŗ/OP7=n+"WK-|U9Σ7)5!@)=ڜQBTuKerƂ ek2׿ Cű}I # .w|;> ,q2P|R): b 2;V5> mH7wLuF~Ed,(7ݮfxq֓$rFw]*z$|r,ftQg(J];qLP؛U{ X1+LӤW^s!9ϯBnJ 3KPF V'B.6oP0R@0t^m"n8l>Z-ScBFIp%+J-)" ֢EaQ!.++:R 0>}}4ixjJ +x\y7߭Qn+iQJv)0 #dÐӣGʏ?8]tƍ>"0 پ};a4}uپ};CJIEEEwzgAW\8oMs%) Z$O;  $VP` w|r|f;`8IGl$ F?q L MK$+{b\{?}&tw 4=]߹'gǫRV |Ipx"\ђr , ҀsfbU|"0'8_4Awk0R%闰ʆm_ˆ hs|Bǩ@2zmf>%ȶ]5 z3fL$`.^~;13I>ow]%E1~HȾ 7tAIa&銁(2 |g뻷\S %^㑳s\xg0At! ]`i`ےʂ+/vB叡k13¸naЄg+~6r:fbETP. V#]h8(A* %BΝ;yש X7zcdyyS|QTK/ ?z:7:CSXxGP? lOt WuP A# #E}}B ESQB FܔG:} ¼.Z{^c7G }T9O;洟=~y̼I"[΅U,̀>nXWG`ҠU}L0zgŒeT/+B/bXwI|큯`wYV{<4IeTuw\g#y>*ﭴgb ! aR/.,y i6 sCiZ~.([}3aro ^UL48 ZMYRXL&Cqq1 ͍I-'0}tNzl|٣ҔKu]t]PJ w㎓aZPBa^e>])؏ yů&ǶN km\8[qg>yfH$OT\W[ ~.كo%qNx"8 v<{d_~mP>@R?ZkПcT~R 渊k'NB ~SBJ'oYsnYmqoI/H\`Nm1`KnM0噙M{$$$K4~pZ!sfy7>+ }RcUX6Rz41X0bD11gUE~:$ilMmX/VϘI \;?M: V?ϧeIbշQ#dt9Ĵ8{7>n93u\zIOČx9qOg9iؓЕRٓjbmf={vg֭[ Xp!}Ji˲2DR4]V@& Mk 3~ȟ/ 8FpÅE}}3*4a"hN[&2;,O'B%_w?(uLy\??䘘?;G#' r)V7`Jj*VbISزo-zeL\ٓ?ʼvNM8)E(Aṳɞn %h7"Ou3|o2Ux{E}<`qyz';tE-z/L2ŜG㵢p)5#3*,qTL!YPًaߩSxM<=uvHQB6|C=7`z;URP)Z;w&N@η dWm5 *;dl2Y\T&v9 sBBrd bgcTd//(+Y3|e 4´*5l*`|0d@'[hz!~v1 5yFIii){wx.Z2>3^?pD9S]Ɠ_\FǮ?av|&VPڮg`_v@^X7X(Oy륒 (K5:qEo{(iu>[UsR4{}F_G4<7Qu{ œǤdȾ.}Oɐ)7wa0xdtس =oI*nM :%c;~+VUF~z~U}fO޴ jߘ%:/YTpf_M56gޖ;'J0bR$<38~8P<@JYua#QZ'Cm]vQYYݻ9s&ek:-**osJ)Hcc#tñl d xb-]S~N`{4Wk`T|yw NpuEBq/{.L2ˊgv vTf``b97dgY,z>5s^84i&]FJ p(ߢt-o[_v㐱{?lE]\VoBAچag۬ 8i?af;z?˿]1u5n20Fq0GMz/=Є٣kmh λKgA?"UO|[OVf[鳮۩q/)N mt1w DoØq uuڜq_;oΝ;rض /͂y/S\.*}Ib,`p?hgJRuـ6s9.0Xhtݾ1)<_fg`&//{5˟劙げc~IG e%`j(; ]L#axmL VJ̌ Y8hL^a&DgQ,޷ /cဠH>=IC)+;Y q[^>|AEw_l뙴97_'qݫ[h1p;ScFH,Jя;s|mo{q!y[ӣ)X17E?LCm:E(ya2޸@6Bw`E,2322p2IɩeҬ>N $UNFZ4rc+~Ajq':Ve|n)9#hСU\l@Ip~8ޝ3ͦIuWI)Ǣ_^@FkMAv)@1c'g"DG7Slj2,*=N&,umkZe)^cbEae|vhݦ>Ge-L$ϜQ]Y~O9q ĎhL: Gq(1@fTK"?wABJ(/fy@"%]QA)B (0'hkKS[Mue B( [}X *)MRUU C˒Uyy!Ub*vJ]@%8FcP|9%5d$N`­ rcJ0BrbLfn%,4C%}; j.[Ts0j`"ݖ0j`"-9;39R !WT׵kWnV縙>;"r$+ Kzd8ȍHhGipD%-E沶.*+D _%|[Â6YW>7]y/O?φIvCEX!LI91B]@&MoQ$D"2>5pPn]ӧOfϞ]`@ @uΆecs )%>#]cX%>mtY_\K(dݒ-=(m^G:-ݞ Q5Sq ~:;,^b^NZ7!]G/wD YY-Bzǁ@}LR+XקF>z0 :ԏcɺ|(6oshVpDK%GoQ5jed<4 *a`IW&!S` /VG@#_KJjfS}{q'Kr~ PPӟ_10 >o v槭,QWLߗ4܂,m*G٢d&PAքoqis9.Q;DBZUNU`BQCؒ^-x֟[*:ShxX"xTeVxof~a^,Z,]s+s5&\Wp+pߛWta ':!MJ"-$nY-s))ev fA4eͼiS BHYkYyYĹDl:+BK|.\vɟyR;7^"-$ACSgWv A[ &(6,)LYf TOM1Bl^:|"ʗEo:0 Z?z[\PqU~x 2{-roW9V=Ji*AҼn%TkmCBidIIf!=jS7S徣`РF2 OKJR\\ګ*~쓍_BHTK$j SV"1 3a cdd80PNM:5Nw6Iapa1Wg0y=wTBiE4/ONJIMeCSZUq5$K4%Dei"EMwh &uk !y9j,X(n`qUk E))Z_P 0?yNgi,4K^ɮ2Nt]#11N;muk׮Fhcs" R[X$xI&$;44IϬfD25OJeHPjZ8=)uS{23 `.llLRRR,3 *ԯq8 z̩) v!OLK$-c|i:X5} ygSF L*IڙviШR:)2KGBia,5wuyu-U@ݮH4@EK)IKK8;llN p*E9!ai H0 LK*B4 t*\QU4ME2 Ӥ $;M* 8teh&>5Oc- %1zIn}9L\ B t:uNAW2;4!P~:/:N{ҥ1z GfV%=0;["1Mbl̛í-+%HB@47^/S[EĒ - 7c܃Wr:g\rݾPf.ťC^t;~/_Fn=8G/Nы;7Y"~{]̒=5d7Ѿ|]yڷE﹫Wm<2[_Ƥ5' P>up}WS;.}Wq:?ˣU5'M+46>3Wtu\$ c m}C￉nd%!9WG˲ )BQ$E - Q'*dRq$fw8n TI\J*N;0d$99RFE,?? R%2ʟKg1wSu|[D~kG2Vl܏퟿}#I+FgJΚ8 j' eE5o]ςi{̽CdSU+j_ڍf||,xU ~X!ᵌ~>;~ɭ+ٶUAT2S]XY.GȔ|nEl#I؁accsܷv$t/A _Ʒ'p{Ө?޶G>_&?|?;ϣ?NwZVqz1ĻBח yCN pBE[dɜ66nlUEn,`"k^+NeXX$-~)Dh8%"17?ڈb, (&2ow]Tq }s:+k=N+D$3@4ic_bU?!"B]h| ڎ@+܂YN YKIi4&d'C64j+NiZQ=ɔYi8#I$g3Iw ם*WHB n7\NډkQ}{iZ.~+9;9J "41벓.m&ѝ#pW÷US0N0 -Ƈ/0`J eooDAz{LzIԼLF~> -f8.xRRN]uhӵčcዶr~\xI~clE"^Ϋg췘43|;WCX&Ђ c "jXв% GSqHl]`i-Ro"/"{7c>4tDXd֤NMб 'OA:6[r##FD2c_tx8kf?<3վ?ΉQBDlG?qs^Z9a oM3}D/>cJKZmV^x )uLUԜ=L헅&~jMWLcsyṛh:h7M%\91;= QgSyyW!Gv$TD2^!i 5?GZ3Zf,iԦ+g3hR6L>֮[CANt3 (:m_տ΀o\NU Z]˘783Sh(SpExրG<اLz{2+sMJ _;pϨy[C"t ;##$5!xa%^oQ #~dڭrj^L|O.oI>9H4 =^$onwʵDלJ1zpDGq?n@8nH~u\sZ T y$ܴm&8 ^;cB-xof666jYSG#ɢm!ʹsxũD]y]%~B š(YoV*4;nD¡Ue Ъ?ݪ8!ÑX5w:/8ǎ1oҿ15Iq~T͵7dIxQ6?y Z b uڟwr! iUW'χQ--SL/؊y&Z:BD 'ɕ{^@U!UE&Z\)ih:ۉZ#~^4F.5'^w*1ʈ!p%fU)sJ9j_vY kN&iUruzO ְfKf/|RХNiHaa:s >% y4$ R\^Ϲ⡬?)^VjP/Sgʅ^7H[i9MD@ t&&i a]2#>i^}- DW߽JZye\ڭ*U @7bvB rFF &x3Тm܎p8p4p!>S~;+B`vWTfO!qq(sP Cá9p:h"#8yڈ|̛9ܺ[2nIqSt.؞8`RJpU BGfH 514$`w@hȂ5lEPTk҉s/=e3OZbͅB:{((yٕ੪UHOPj&keJ4 %4'nbYׅ#МX}ms02<>%cf?#b ncsIR ײATKAU4+O]qs6?.4[  $=Yy z儍IWpr<8'ɦO5a~^LBC%w:PI&쭻-^/ĐeYԁ..+.:v3Ь ;$7tU=K?޳5^<@AKЉD P/ TH,0}l+6H"IJ{׌s;X\ĭ)E1[rFDL!96]w³svxhڸ 5gҍ((B2~KdlwѲi鍲tiRSPy;FFR_l,I( J2_)XK䪂(rW3_߬ `4מz؇x8Fr ?H4DžZ{X޺wRvRƅlve?ٴj6ADz,}~~IhK0-lli_̬Yn`ϙW>~]6/%rٰ.TJx9m gmϠkӪ8#~9cexor#A:i;7&X}1y̬ jS?X\JYCmllNt%mX =f&QWȒixJuֳ;vs<|C>tV$l=gTCSW|/Z˛wϠcN:p3{i%EVK(!W!IU1hКZi$*b$~L?WfWӤc\V'x[ʗǑvh"j' @ {9&OwG3aj]E_LJr:Џnx0^r!!Nx7hHb:'+C0S;HיpDu)_r73<3vĜ^\T9J(b)Hָ.yUśJf#g&EXzH(@JC/vd֝ʤ/2iC&Z\3O3wuU Pf*IkPYJv+E>zEZof W_&2CJuhwcuz;*$Eg2l ЉJN9s-Cx|T,X*dL~oٺBBFMWw$,s'L~3\ j`dդ e kS'VБ)}.0R%vCj$QS%1: k= ՓُHc1$r=s#BbKwMdބ0&i0T5qq̨WY_#Kfv=Iũ:qbEwWa THe"q`D +.6rVL6@syhp(n 4KCAbQ%۷JH'=Et\F=?g=AуQUKMJSAk"XTHRq=xΒJ``wu%6qzq$D- BQBhilP47Vq:T>j\ߢ:Nav}Ua*."L=DPRګ#-[` \ZAnIeDpmS):93c,#J-sC3_΅{JH(H d8shGar@5wh< ?RD_2Zy0MH} Cj4wA!%0O"be(:j'jJrTNr#liLHL N к(5JA7mllllllllll[?yvఱ9()qraѲcOs뻶P+&UQ- y+ՁT|JrIHv.tm\ ;WVѨTҔT,6i HI8]6wp7c'DV툔n9k 1DŀvPs5S^BO~sax0X:kچLE}h:ZV~cV*8s:2Vx=^meY,ݴ`TT5]9U`Z5}&3nje/~FqUhӣ7j%˜){|Qogޟ) 긒ӡO_ZeZ<̜uD8iǜOji.j. Rr4B1[/ـtS jS!y8OsZĦIntjYs| v;ӣ}=[Y7:[AX9s*@n3U9Xn;j!2!%WlLA}hSSrA~?،?Q{ѱukX~VΞ/l0hɨϩ2R~ǑV.={8ӹ{m&_]AV.jC|܎E IDAT/oHu;11Oh_)d|BaA/fPc/~7R`8nӇAkDť:ѿXx[NI*/bwZmޛ&v1gL/3qtRqlg9 nD^ݩNH&FQ39h|ksd/bNrF=炵/p2&2v `mGavQ ~%#XZ`G 睥XW_!f)+ åG kO~a=®Rpy'B̟0 x7X>vC,>>8bcݖ¼y)6P|;I*s77`wKպɏ0ن yrXm;_fo>yi SB<9ط/d0o_fk$iNLxv/-,c>f]ȉ,d{ !Fo`|&u"7)IJB1o /8-Β^OV4 7/On{r.G{" $E0_g@gٻ, U';}dzgaɻssl{in_`ܜ˷[%|ҋ|hgo}~~%mL^߼qߋF/\Gϗ/u e(-\²d}2'zb^{m˷Q?Ŧ '<,/pyC&C|Bc&...AYmiWWSNJ(6[~Pp|pGA!L@?e[a-4Wƾ s_٫4{lx\wkS7yws=%)'%>D Dʅg3M\۠6X&jF=N?RzVװB$w:oN@'&qK3͹fHrkwRzVxQۅ\'K Q.܎Xz:{-oe y7ߺj_8J^V$8< f_0.N>t|" †32WԵW2(C?g >͕RAE3n hʌ?}AZ7ٱ~> h *!.MvL|t2Q}gbti..  ӯk]j8mosryԊ4u*m8ΪrCy0'f^}F~½i-V\9KoԿ%=6m cfz(G,pTiWs9Yl? Fsz RY"j/Nb[Gtg[ ?c~6i+c&1:8e\;X r=$JhE\Gך,Ŏ?"X'n ]J;4u1WubY,g:Z1j _dotIs҉J Z✇0h6-Nr\}E-,K"77#BpU0M˂uyV[pT!^53| -v?8VG&Նu7-`W(H NSJV}e(gFnAEXXio]ו6OM'Y:OBQQ.8N@v,D]dgDM6zz:_˔evoȌp&vS;/8b@,QZ3qi\/.c1Ous7RT.QAh)]qo } E#ז*n4Cc*P4.Ձ3UU'+$`iڔSQ/WPPUUU%@QTNĥ@d/,ٚě};/l3jt^.@s#<';P:Y0Յ!%J߄K$d4mDVO 7/`E0=TUs9QqG PT Ӊ¥@je%77k u/9*Ԓu`tY}8>a07=?Avml>:BQ.@)ɛWb_c.E)yC"ӉϽG}_]'bµ-ppfύ_PɞMR,b ",YNz:n)Y{z\6z,geDL RJN?&aX "֡ˁ°bCUbՙʅcZ!#ˑF1߁&dQp wYa)n^r:m%94eėxA_'<@=,K*Hצ|\nӕ\Ƽʐ*F,}WJoGŸPA EH~JLI!|C^(1yzq=: twF[FN3&g/o惑SypX×'&y W\W͝ms|daɝ .~[ϟؗ炯>Ǟ%PqY2[:_-(ŌSa)C>70{i}>Kojh_.LqJp ;RWnbU&0Q*Q o%)toCff-%(%)`D~Ov!+pQ)5dR<'y' n%c-y\1oFKN#=-dRvRc[ӣ|*Z5Q-I_/ 7D}'29}z6&+:U\{K QB P>A fOF+{9Br4C bB>_C6˶LI#=5Rڎ~abvP[^P-ˀty#,YmquډvLdadn( bEEp9"܋(P$;ؼ E(8HR36-n_Y?Sllh1l{.FEX`9TW(Z % ]Ʋ(_ Ȟ /<-[N!'1_~פB'!3Ȗ[R?3*|@8wmiIFd˷T֎SюOJnHCxYԘ4f?YuN@dL& iwe •w\r^r7+k r]pQw+T|;Ξn$pI F`e-aG2$ WM⩉HɌhRwVpUGlF(CW v|*Yq0 ]qh|~/F~ qysxi|HGJ崆QK߸WB7g_EW{Qa?[PU5LjŦyl]6vѭ[4ඉiJ_=eDT* |huе1 I8AnR7cygӶV h04nY^B߆b;B#qZJC ZK")jWBTGu:F.ͩYɅNN:$4\߰!9Ti֑5Rq* 6jDZ1߾ġuzK.c T8l]ȉoGA8&LZz<*D1̈b.xYIy?3@?\t+EֶX)_l'%'h:ɽ|+&[0$fI yFARY@QQyV'fɛk%l\z=^ U ¼l̪JK[lRF␝c>Ϥ+ '}B-C|\ܹۇrJv>|8ϸ$:J(,6 {G8ΙL6 tX&/EcEȽS[t)ڬ+{7u3ZQ\X@ٞ$d|1>G/{X3,tthDEuY.'_B M"6!u4s,},h%}~qHEuXw?FXd!Ǭ{cI9%K . xsh2> L\X%^a!izoV zF( d2&#^dd!`߳ Lh2b01)\\\pdc0\Qh4`0\@쎈Q(Q*O' FD@)P(dω&sL.G.=&ф 9 YDFy[Lf1AG)Qʟ^\./Ӿ"&mBd2W*Ndrrz슲'MȔJʿzy O+tF=mф`da23(Jd҆P9fY{Y(lJu_PʅG쥬^ GkeC{c*m4cB.+)sM.tZ92;7%`eo  :2vudeperGy[yÕ[Xh9N&Z;`&h䈆<.߮ȭ |toE^?wQjhTBfZ ['l5f.>0'1O H<~}+/`˹d Jdxxe蘹 ́ԻT=|9xo?CRKUz }P?;q/׀ֽF(0,DNUUuX ~\ QmG2r>BфʕN#մ9{L2 88۠@%z #T6,җqHnG| vZdXۥ=p,L`,|l ;J_2ϓgP^-#E!uC^&\D.0K(P7fŏQȍ?eڜi@;#zMw".5,#V^Ѽ;zVsF{@R8q:3>Ȃۖ2m7T c%g c8f=?2nBx;Ɠ?3_9{#Q>:%X|52p S=1{m &izz$&rc\{|9&S.O\Y;Sp[y^;m 68uTHq4};1)di$". 4 9~BOn,C Ez M&dJKl(oXw>^8ټ n]c*>z|0FMt]q:KJ;3bhB" 25 JR0k*,ޚ˖N^Y1²3u8ü[<cn,$>S,oz/ Yg u&(տQ4.{'n%["K6Rna)߾^W1K1<2s2{^D۰o7 R>ooK@wb7,k2p|ҿTËwfP$։-Z^hFWҘ!ϫ嵈lN `a0 ϸ1n \3egOw@0 IDAT_vP'BQWDO0P r0C0g4ē:fkA?{i` r•R\! Ș?` ]sMB} "_EѴgCsߧ -f>{[N#ݕW/1arh# ?}{N>'d`U5wVIW sBBZvS  UқP2 m}"n~8IDMF 3SO'??W jDž|ZU{W;nnrɚ/s5%^68MDTdbv] 87J/8 jLT {5ߕ|#VE%ɕ ]ЮR=R/`#r9 NdgP3::[+b|YR0hRy#eq&rGf2;*0 K.*ьؐOO7YGX7:o6oq(ыA4S‚2Zjtn#FX0c ^ ڃ)"pH ,2|H7H\SSFHyl֤L,M~ }O~XE&6L/B~:= >Np(͆Ȧx4ֶι79vB=ݺJzHe88!$K%I=ܩCy OmeqyDuOyO|J3L[L=aC-pׂ."i*'+q/$\I@9Kt&p}>dw_zMiG὇1燽.zұ@PLM¬|2FDc!w*1*p8"ȄHv6DBviZZlwO] 5GZ$^]nOw1xO-)5>hs9sTeh$fQ;TB _VQ@bt|3V}C܃0 2N R3?|Pp9.r(\Li)2@rђ"(VQebAPLkG=n o-+yU3ɀs;[5eVvZlL6ԧ:],wF Yuc=:>2#=ǒEZ1\45,}1Fi{SUC͠+Q<>ն(u eF UiJ,ITY.4>$ (4v*a:ˣD.TPۣ5or9GODF6 f\|2gߦ9ǹXJxXӨqk<]laFXS>frjo'(p kA^W~Zaog t)dϦ_Y^uF_IP`E' J}4r+7e!;sR ń޸f͟pcZx<5iYͅɛټ2vy'O#7ű"M?^k$_NJϧmk4A.;9wR1Jk]ix.:lFa0`N#u?AO[H~%6.[ưX:v }e52tde4ʰ lg<9-g@DQ|d9R}o`yqÖ\=tT3 Q:ZzJI߰%7PmԹ#e(6҃ͱ_<Ǚ8lQEf}47> oF!E;'1:˦LcgflWYeQZ^ )ElU/bV݃L=̆#N 6ղ(gWe5#>@s?僶&<0#*$=5i2f&51ͣ=cq(]WL:{ETJ.v􎦅wbRLcLi2&+[7{45T&5M8rn( XS2+v}ptFL&-+8ėˏb뎺6Ź{4sy;V؟G=vh5U6%*#ACRĩU>LEP \̺3G?}ԣK+,ecfDy@īsiWq:5$r|>}^alVXGqM jQQ w"~x"">Υ,yjL%9ϐ̊C'rILz0qL&䒬6OV4j 9=aP-k@iR>L 7O`ﷰtĘy k34^1u+Yh铘l\fB,9o?.MiPt3E^ k1ۚ>ZFNϴ*o#qE:"rLN܂r+Z{sl|~8$ >;bҎf>eͫd+{满XЌ/zVp}1ta?;kEZ5nq!^9]P·}͚|GqY쾈e|%^xLw_tܱS17nfϕۜaҖfuȬeWopH/pw;PåKgsEonܖ[`ooJzvBhq3!b--{2d@WؚI_*^R i餥n;8_3+T+nݘ0)HHJʗz-ZP7 JK/귨E|Rs*Ža_fՊb ғ&{s$A%,)..&//gg!}~*\FBi:[e[5`Dӣ!:2r@֝A s}poq7KS|8 a*r:Wnm>Um :i9.uXK~_ˇcN~~>{(](z)wDJZyo;T5b,ёuIfݙ>AI,| ~i~eOV╃JLL,\Z|"iDқa.gi ƾ}1ƟaמdhiCFE" mKS )WzF<1lHg,E\غDƘA 21>s[h=z2v`{|4Ērss̋Sy뭷t;v젰Aъɋv$tc„ɨOǮIIKëtHBnZQYx"exYC_Evv6IIIO׽{(..Oj#G\.%?$]ܹc^- )Aڝ;w$(rJv>|8϶&I>$CI1$$$$$$$$*u""b4% JHHHHHHHHHH\WB" 预c;r9n\۵] `?(A0dff"¿/3ge!}gt_>`0paI:ݿo{$jY> F(JI˗/Y ٿsTNE^^w%$$RSS)**Gj#G+ B_GRR0nݺE*8a2z(b00L2(B߈h|<&$_HH^XlU) hD DrHHHHHHHHHHHH$]+rwrڌjqĶ};.Qp?FcwS3oo(0=$ߌMIoRNiFČ' .ڴ.Q1'n]_VDo/SIW}ӺDԬKޟnsoÔ~4iXZ h7h3u/r4C7#"^' ǔ~iui<2q'ZVjlQ1T=m2y᫩V3vD׮Md\ 9o>x#S"V QqDY&zMc&@tiށg> kOFqDԬMLN b7iťu$_RN,Uk5]I|6{ڱ5Ӷ]MznCo)[2V G7MԭM6'n?ɜocT/#Q1۳荹_6-]Ʊ|*S]Gץ[j-Kqy}ؙh: c4,%$ch4Gdt _cch٠.buFc[n My( ?Hu#wxw2B9gR4D߸Lx!2I5V)$`똪4)׆\ԞL_9ڪ"t{{w1?G ܋Y`Yt]/~BމF&0ۙͱ<'ꢀ̳^U^&ʉe90w>Z^d:BTH: @֠'͎C+nM Ur^&P+^F~5f1+wDMd$Z*y9}M3Щ&[>/A,Y_Q@&똺\PȕXYT`YLog.ޓޡe2>9:+<~1Ui r<g3e||LM R}Q,eLZu6&‘3\2ÿ|i:3ؒ8__o}uɑ#@)C#dyTDF!x+ʸļR ?:T_(ikU AD =|ni״cFo-~сk/lMX6#|l7J, pj9#aiqQ:an5-}9#FYϏ#9ʌы1u¶Nn3WJEf-_.~WeY @f~ TbGk D͙#|m{8>5&ﶦQ.n%0ե_O6f9Oc六Wb`İSt ӚzxZh7onλICU.~_x;&v4x[5/Z/D~z@7gLޱ* oKCҸqWGa#=C5mɀeLSZU$1R0V}w\6ӔJڅ /[}ي3ag[QmA͸Xd?8rLTy,*q˲X>^ |3o:[MXdbWIOú_Qh4+wıG7Όbm|D3ۮPP"bH?];qpSPWd$caAk64riqҖvl?pۦ=R z7QmRc3A曽 @0"7D!zQyi;kM* ;}·'ĥbȨ#;=UwO5V8]XVOuWa-o֮V*;*/xS'&kpB>ȱb_z cb. -Um̗.:z#G0΄ف}%d =EVd@ˇ$fd~8gř$-)ّܳNUEɠJxܗRQ2.a!,ΰc^ dFb;54;Atzw]jcY.TUن!u",E&ØkTuJ!%)ej忸W̻'9#S'Z69JCo]==\*W>9Kt%et/N=Oe1^`,;0x4Y~6lAqt{ ,# ӵd,nOF=7Q^K<&Qaɾϫ2q~elOwZDc{ IDAT $]ɤOF1lZvo]i3pL?OԳ {gtr`MA+v1fTjA@Af~<vDeKxxd/X,'H$"TU9v\N(h,ʞ( RT\]c'g2>l+$@Dђs;eW-Y$)Zy#bI9Rxy$s̜:mjS-QdrVJ GULסtDNBB8cF^}3lޓȫ2H'F>:A!P0ed_O8+W SixS CK(o2d*,r&5XLQSzղ&u]+ t8!2~aL~C'Vkk, 8x?f`Yܮ39?|o%n!x3q'Eςio?xLG5W KDWRzJQPcec$b5h-IoǻEM8V*+E[Sin7| 3(T(u<FY&Bǵ\=lV;xg%X<|GF:HJ#WcE5MAJOUEYڳuxWb,@ KcgBVܵrTklrUr) Ӡ}0 >^PY'{o!Uyw }8[5Ng߾z߭D~y'}UTz܆X\`n{Em GtR)׎q]EbӬ{-c'pQPB%ZKGj)0-%S/ HHTpϺ25+޴YxW,֝CNJ2e"F-`؎rHw~ @]N|DD|d;[3hq'ΤGMgs KH+|O]X쯇_ Fw7 u{h-AM%׎pHI \rEZ;=9L=¨\F wIX_ǣ$̮ND6J]g<&gweك37S=l`+`决JKa|;nR[*ӑ|#Bo0'Y%5P|l7p8)?֏U*k/LiP]2X/wI7h~ o.\H_u' D|PrM[ @;{6]oug N gG+ڱ.]P/`3r!,*Hq?@Z׃jlN~=S&Zj Ѵh|CnnEZ,;=iXuEiOpM|FMD٫w,š1W:`;![}p+6L[P$ }sK`A=w4 lݑt5ZwVB{s5.рև7>G݄-^YJ2|ԒHKyKswk9?[ "8?wm&e)elްgh oZ3-|jstЊZp'mKg],[/** s]}TBܱ#X_*>Qc LB..\JYb>;0僎ڼe* Ez Z%+FWعk/ieTԐwM;UL& O{Z}g2me-mv\ؾE[hvcXUͺ X᫐ ċXer9JW-ba'zn#C.cd e-1BjZ =eн˖SKŔB :66'@l=hJC,3/p:gQ-]罬-&Jr鍃%sS+v"<f}"^&Rٛ1z&|[ BʩHX٠t jTrߤPY9Vp~[4q$!LM$u&{/qI_e\ק3wpU|P#͚'dt:Z.v'y9Gцè|Tw*-LXiu\as ǎ"{W+aU\cw'po< e)6`BWDUrdOq ESpM+vBxo/q$"Wj4!ȴT̠("/3'4ۊe~Y`i߰ Gjѻq#GsR3l A6V,>Pcx^99O^ɉUɊի ܞƱDNSx޸>;CBs6I=?`sMݢ۸% 62R!<f) ?.=KGԷqEy@SZvWw a?sAG ,[|@M_#73G`;83t,[m_aZDdoKYwޞU}4r5;أ,fu'"xcOf0:7^QaƇwެ)XdZ /.aס[z!e5"#/]¹C]Y5(d._ȅ3wɯ9oI]PJXd0dxۆLׂIO?9qoՙ9rX½ 9y;m!?k,U{HIuU3}V@D_$o4C[Vë<bלv`蔾/[U֕*UOκXxSY㪊*.5T{{"9d} ќc0 \5e^01X{srSΒNsu;GvJTn:n~%ۗqf d. :>Xk=( S2}VrʙJةdYYF~Lߝ^`^/wױSd4n 1kw(. NbYxE BqזS6>^ _d9YjG֕3g'kW_VSmAL.Qsw%ZҤv3.TY2W{DP sz;v`8s2"\^EZ]NզzEU6}A[psQ*<!M\GXc<.KJ/R$(`;bK5c{7lҤwXvٽ`KWM {;gΜ9g#0 yl\mJwteGF-Ǟf?Quȯ}zS8f6ϱ= Fݙٻo]Ŝ*e{ y8D -]\L"& G+ *:΁Gۺ8uxMN 7gKUa_؈ Zm]}a(. 1 nWɓqIT*㰳o"J)S SS/..@\\\044_N /111( Ѯ]r!4W^L D."""ppp҈@*{k)_:59y${aԨQ$$$|IòV7Jt>]v$jHQ7~-̀W{yo ߙVJ|D D򷧿DY7JH*J˯DV*2O @dZ2FP)U? 8Q$%%BmgϞ/q9Q"_->.&&&sՔv/\.UZ cc^}}}Q1D*҈t*++ '''^JժUEA|uDEE`gg' dddɳx!jXo!j'Q""]4g /l{6mO>ʧ϶ ȗ @1wOB)BW)"""(F»Kn`TfTQ#t%嫫i}kķ _y5%Ϡ9\}߆.Y6% EroV0c_y~GwïVm7Ą HyTc֥R[yR=ѤA-*6ӄ-<*kd5^= ۈΓMzOSt?ѯо5РDݏ%Y.Qw2e@;|kע NaTEUZT^}gq!zmya,֍Qͺ0fr^k,k׈#r"US?j:eVgQԮKZTIH _@FT٘^3)oITmFyG;H7ԧzY Ҟ`BxWMӁx]0c:7ƻJYL@Jh}Rh2l^rc@}a/Y0zn%N2s$~0dg/7fZwȤd=<Ƭ%hJ`qq V7Q|opQEe\-z,Ƕ8/-GY+Q$\MZ4!r3(Oxd.YadFJh]ר˭PSmCp?NTKV]=G9x@ƅ#h>jCxqX5:x$]c_!kSX.G?'(aY* U 'sW҈J䳓Kٺg֧zӯgg8vOQe.I =Xx9k`Q"9vo^sj닍[<*Fi|i≗0E>%JUe֯HyY3[{AI{j<;(ySrEs8ZAÓ-M5O«+lDc#ND\2)Vj按&$]9 I<9a'\<7VLAtC:ZJ=V:iP"AMK]7qJ;JQ;I >: dL9*To;l[ ^khj\c ,`C%Rt)j@Zhrkb>R5L%sdɪ?~,>㗉VH@(A;QB8d65ӧ #77x3tQ'A2e}ޚuƩrkW~gEPˣ+Yu9ZV M XrM020M :&%0ȸIV3 Y._V"@ѧ5ּ2WS0͌'QƦT*"WSҴѤs0xIL])R넥9,9kr~<55n?@)/:)\T?TC{4E 22Qi4y-AMҳۜċl VY(f`:07՗Żk%$ڸVĔ&"kF˶,MOSOc2yu) =DSȬ@2gbC s@1zZ~U{"C#C o0|*uG2om̀L-] 0R}$2{ IDAT˧*ؚQ GYv#<''}"WQׂP:#5c7<2q](Mce/їH5B+%D%XkNrR4EHZҲ&X > a*vOγvu~~bT !9Cs#tJ ^qaNmY̩sGɷ3L;q[Oepw0XAzeqZ^=(R9N~SEA UKų.u1f61Wr,CS}Sǯ2 9K~ᪧQ}KPmƌ y31}z2&iq+|[q=vpYY ˺ՊLnLUkh|.U}1g'n?#] iyR,m[3mw='C M9PR~"E&TC/]\@ 8ֶ6]]1q^'X3n=R`m 7߳ lc|~j+?֦ܾ?D$&oHލ~ӵk{zaTV]pi=cP4.f< QHBfU -q) W7~5?``m>?g`ߦjrxp|1+nwR]}<+:E\r9iGr0~tO*Y}kmjK|C콩̩s(<Nl9ErxYfdȵ֖%.!yeSbH^KL"A̼ Kgp}n" Jwe^ 2 s+wP[# 1b(a{UUBL%Q?!:>%";{۾:z8zBODZ[׌p*늹SU)7,>ZARGwom|㚞NУϷs1ꯟgל:&OX{:6ĿEBˀ2^Ȳ$ؕBVȂDem@jW5nOfHʯb)6 sTbwAշ*EF-Ъ2ʈʶ`hA&-ز"Ob;RZ@eJ>lZI&fZbdi'8z(VX ;㰒$eEH$HAr8'dTB@R*iR~٢O/X=*fSoėiy H64ں?@¾5WY !!jb%KR+z!aҝ:PǦ(7@[>K1HNHd:X::bA&Lܑc)TZGhK#4$ 52Ll2"O}2tۜ1S3 3E?#cp6ӓ:` tl2UnX9SvYKuek20?;JYR :5j{$r }Wg޾l})ۗOaKZp0|nv[NǹRCfnHSucwKYzQ˫s~G)´Ղ]ȋ3Z۲nJI^ǡi:8Thϫx"1X{l]nJp,%^xXT┯; #`$;i 6,G~/W%;[|Ejakk]aa`` ...~Qrj?EJJ xxxc /111( h]r!4W^'0>@ZZHo9KYf='OdϞ=5>i1ڛK %w.;U]SQg?Gזf@DD+@> ȇx[T JߊRqz<D"BD&ipDm ""d$k?k/B Y"xQe!! |EYj5.\mWOm7W,Bw'Ћ Sŋdgg""X."5"׀jZl )|.XX.""""""""""O .X"""""""""""D"n+R|).J)\vT SDDCS|GX|'30@=hTƚ26=QXˠ4+cɛ%nή Cbogl}Z3?zǣ4]*4Èn1qlY7#PRMO6/ۯVrf"4EF f7hNo_ӁPSʷc~hh"(qh=]%:[Z51oΆff7>ҾP6ϜώT~BϱeN=C%5;wk! v*<$1+7oUroOCQ6O3ՑǙ2OJC'7T.m]?oMw`^$$Yg]~ؑ 6H4iس/*þlCjgq=$FesX n ӛ*KL ̊myܼdP+/tԩ>Uv1Ari*EOK@D]# Ѡ ZVqx=Ӹw>==-QgsJAD8gvCm,\{麔i܃1}jc7pt|o:EddT[%{xcl&V *}Yz8^FZ(blrN+&aƌQչ!ndNI4m3OHVx[n%0ҒҸ 11hu3ٟhߛ%Nߎп:vaum3rø$E^6_ׯ||Fti{ʊ=*2ph~3q?ȨJ,J!="o{2wLfļDgh@jқ=! NЀr2\) _Gxva$Gg60j$ۯmX&C%b̜3WlJ~icAf61=n5<49t0CY&YJYciPHFIdskbL08 bhSF4"IOa$l7N%]ʴ9-ZXF/n5յq5-Ac(n?% wfRR;tbNz]J,尊}m0j֓Fyg.c6gܩuyu3lMmhr9MI@2@Υm5#Qj8n^FS-=[N'ޥ P؛L|).YC94zbO)-\Z 7KrfԴ8yCfb.T7S9i+{5| "\b#I3q΢NΨ6 &3G/CGm̊<ϊՁ2?+\o/QE"NJbEsUV O4L֞{W#, D bhwu%ʚ ܺ3X9z^M srGq2%">{—tzT@+\ OKMrqӴ?em>B{1WG7'3ǣpo1wB+Rs*UDܵ묞l[Z ?+T%YAJE{= CK ٶk̕|,mRxS8 e[a\j4-AS$gpQT6- sBQ9jEC`ɴeHyK[t PT"AP^#q5=߲8ouWH#=m)* /ϯҨd RuSб3i[1}\{쁴ݼND6ޭTs}|IcikLsi9&2jRvMRQJVpxLV0|p >Ծz23 <{e1)2[|?s@[ iz,Yij.J2cFW_:N,^#A@@\폾 R)a1ūκ)1v|| %5No9$Q$_luq#> [okqYzz[BKT"˚MzRgfx۶ }&"9.ծoNI)gJɕ]_ifDˀ -~2,boXzu (zQIBPp%stSh5NemWYh0-"}7cw@Sl\|P&dѨd ǿrr2AbɀPӍ?"[ˍ$8go?n1õD)6{22@Ϡ/Ok :G 0`^(hf+GZ̛ᓇx=B?)8eqj2K1q&dmf0c˓PR4p68&`]]g%51\ԐTmJ#Ql# @'/r=84 UD&AP=`͂!@c{@zv~- '|D:U,s+b\̑ʣ,R(&˻1ĊAQx%R[W}JG{;Ubes;|M&K{bw9  L]I4 2~{lʵd$$b_b.>Jo˼lٕMH5񠆧 <)g˟"=WQ'c{ x'\}E;~Ìad>%26q~1ZZQ^U6. 8>nt04ƻa6,'(!oa:ɣP5AVɹ|iY($5b6Td=~>O|s`bOFRGϳߌj+~b49y[r]K6,'A93S]w`X%U̩Р, ͊~N+Eo*bORTਇ[-z83K5 xiz962xXoԼ\/֙ud!EgR 3JniEEi?؂}K_e IDATS6&Rp'ڛV.XӰn96N[΂f)yg0LbxF%Wdw^ȓc@K3S#t^Ti_'Fcu"&D ősl4%zʾGHEҞf0ʶE)tbbRA*Ģ8 X܃=oߜ< =E!h􅲝ӡ[M- h_0NlY'Ձ@,RYb  31ui2rMfP,kO #>'-+ hfdo cbiWX͆y$5 lٛ[ 6,] #z%^:#Q!wDSIkly[| ;g:u@t Y9ؿp~Uo(FWvnZM(ط!6\;dRtaƢYT3=&cmB9kn&AWvs6–*0P'pqq$xf|v'r@/7sN%s0ܑ+0ۦ {GIظ: MǖQ;u&1.ٶj#5X6."!.slYk:X>Oi):^]ErvVeC& ф? Ďlǐqԑ&#!{ݺ1vQ 3 wzƟ73H[BKeq ٮ .gzO eq/K2e]/Q! }Yԁ \\, b:Dd2C0=`_f'\4*4y~pn]ȥg(ƔõH+gݻA1?/(HmQzQQj$3RUf~}LnVQAy[$cYbe62bw^ ,yGgMyK̃1N{u0එ6Xǒ5 v($hP-6zZn,YoϪEyF2Tz8͈Ki[գzcQP,QӥYLR"yDU7s?! N1*d."uQW B-ޜuv"A2s~$R,| R h ޜ_;R;nh)R 7ۇ4Tׂ5[PHHu|+0]u&Os*8l EPPG:₡أE*RRR?^111( Fz*>>>dbV"""Q --s3γ~zN<ɞ={5j vaBa""""""""""RhZˀPXESUTlRƍ0D:W4mχ-->Y> j{{{tzoMMTDLDEA uBLyƱ +9DhXY-VX=8r-ՙ::zoE1緳]UF6Ө1=IB.bm@4YٹK%lD9+= ck CZK+}8CƵZI"Ә#9w?LLkI&}`FZAųT nUؾ!ߘ낐I8t6jҹC=:˻ֱsNUң&l͵#:@tzZ&vmN;WLB.ffSw4tE+\G},%jg`Ni:-t[FIڡ=?s !Ol2nTL%16@dG  0q#3| 'V#m3s!sͺC3~҂cã*nM6@zE "/*AEEAł  6@H/;$HHl#' LJ;3眙3s ;HyĊ/ڼşL]6S/ڒȤ ɱ֣E]۾~G&o n;YHnA5eԬWyS-Ӑ\+<6C#꧳YuQ㓪S.0жK'tDn蜬'uv +5 [,L9.4yTr̟Ϸs帄EKi+c% 7{iܮZ6Z|OWĚ,g]δoR=#X*8z)k罱F-߃MG*΂\2s7nEM|^A} !~wѐv#9z$B|dNӘv C8h%ʲ3/wr ίxxu/77Fo("h:|Z9g}MEf+QFk[wCtU-[ӾmڷL"c 3Iwa(V0PHݺlCNrm?0E4gvMè/-q:-\UeKj!]Чgє:Ō1O3p]zķ3yy!E2ʏ1m , [8VO`,ǎ¯.~`0 7ᙗr06L`-ȯO3o4՘ƺ8qxP}E&s>_ }%l:X99oQgRh8Q dۀ?r= :u-wq~\];gmИ $6{oZlKݠzD I&)FFNx5G" &~:AVRhX0ב?>y{5uMd>'ϸN-T0rtIȭ M5(E"L mޡZϪ Qt]47pc3{fF&;Xpޣx~סψɋܵ~ anԚ 3ne@De1:;pK:gѩVFB_ԠHWK׎o IH@{֪#?$zmD/IԠC(p$ȵ#_kUY+1K(t%ȷsh Z ̴yYD>k)o؛g/a-CyAĘ[pǴlcmԕ`|ԛDEADAvh> Ox~9faf?/dqN$7 u=| {sg?+8+*!,4W}O=r"a 0cJŽN5 HO^)G`VHg:+fe@@x&'A,Ws&-+ضn!it4㤟#Z$ID)pj (@L$pSPDDT9hk40} _WVa2J"$؃)!`"hp{ ӫ " P%J?Z BxLdn/Pz-wꏲf*KNt&S"V= (""FAGxMADrG0Z0.j8+%4$s\ jK鯤!)Nbt"4"2@HZ-4s+ 6'S#ŒS[HӼCJ۞.6ʿftEHOeO)~2L#d 4<}{w$WUjeAʍ/Xuf.")Ոv̓\V:)/( Ď\({q\FUEH/ۉd2 @H:s _A:)wy)/< K|v#l8KIfUדi e~[OAjNffx~r+s.# \lpFBLxx8>lu|- ZHl߹q8R7XUd>^v6Kqq @i6{w}Nk?e]lټS:ҥe<!N Ka@8MhS'}+38\yvkܹ{/|;}*_.+CD" "8I8]0{,sCh$UQ^Θqۓkz74rJMwg#1ʌXO:CEA5 ]vq`*© 1 .k} cҲ8e0%^K#~Go~ dL@n$ݬw{6㟔I$; gB$I"7/~wSٍ8)'=^ AZCQ^Q{E9O]Yt_ g0tV.]w⛦b.U )Aͬ'S^< h|eK$1d ؎}#-|&h|7*R* Ѡ{y1>d`D(܃Ђ`UT=0'ïOQw݁3?apepfSMd!Z Gɨ'RiAV^~*N|_?Tl+{)0aToNF4XJ!'$A)&a45ox/_؀L^n)r?S<+ a10{.=V,x(k$sݘ0AUmiŧ( OyLk?("ZcMcX7>i[ GQ?* }K1ynj&BYVFrs>~gvtk6WDKk[~MM{XwZy9; %Ld>zØI7iy/8_d!2O9Ǐtzt0$w[0}r$rB]RE਺c,S6z*3LcٚCT u=  x]?l&mh2|Me7o3neT2}54OY!xu4_n:Nu 6b" mavVtIPȷogy/@.G)CZZTS ͐ԝ!{=6fƵgHvDjxpW4w?uWu@,X~|& <1ގK)Кzo2~BR(;`Sn2 ܬ&eۛ`J\=;0/.c s$d0jIJ))Igl6`=k2ۄc/-AFؼzq]y-<=n'uz?A:JKKP t5JcZ7C&Q_E0m#4M 'WL:9$cϜ &~Ee'K~P?V'/Fz@A Z0U> hcNňؔ)|r4 Mk67D]/GC:Vp(9ȷnGJ# ]%3jլlV8F5 6v_ȮxD xOzU  RJbu'L&Mⓩ([-xdLNY(6$cn\ktc;chR/?'z9L'#b->SGH?a'v4B! 4 dEdɏ_N#yMyY`,jø#@UBWĶ0$#T(f܅]9pۊ>/brnyVDPd\ff݂/d}B]ڦrH/͠1ETt=qCZ<+xmȁpŜw@yp~ "!J2jCnI(nNnOk8EpgtVU_0Mvhbd=.A:q$ljSy\2>W%ľwqۊL|}>F|y=M }cmU#*%629lXHlv#Xrl76{@_J+Na$~>T[`j/=I@f[p8s?b"+Yi/$4$׫axx:e:eW[PEEEEEEEEEEq@Y]RQQQQQQQQQQ)U7 kqЍ1$v]: RuBeؑ' ݻ0|Ve6B.e}Z3б'wڝ临$4Jֵ8rFve#낹UG:5[Y9 :սC7-=2zmӵMyRݵ矦(eŸ8t7ygeÖ-AH 6e6slEѡ}Cª:>{VW9~vL7/?⥩DvLsKulw"Ltl7ŕ_6'#_ODB :&["!ˊ \ZHoz^Ace϶=^ M;ҫum.ʩHc UkJξls ؆t֒'lbޣ8EBӣ[s"U'Wp`26壉l@Ͼ3]i-)"Y¨ۨ=]ŠMvm?Bˇd ^u~bxthz ˃AGo Q4tvOqg5 #ٹ+Qf*H߲3pVC[qЖ):״}[X1bͺлm:U U"*0"~<$n1 #uVƚД޽ZxmY:<iA^-?T@4W:$9YNۆqt)MEӝ6%CO9`L 0K:\C5iրm?NcwRM.ğ;V_!Ͻ.+}) ܀@SSky}DV g(oK?if};$|3,ʤeۄ0mFm\g/ςos0= `0KIoqلRoAS;zX]yho> y2/MYFWD2R`q@>Ge`BcQ?I͛s ['7S/.!G7|N{vvQƊcG8Ӣ;=tmY+)^UGpitlYl]:٪ut;,-NoE&f/$/ !.Ix ?*r(//'<<7},c?-YCWqb_=sal>?~Yy3boڏט1SV)lXu1tnIe+홬^MD5E/)^0g?ZۢY|µ1U8l|]+3d^̫Leg~ N砽}ZG;ƎNM y(H㈫>]8}'(/:NxH$m+Ml@̉\w_g[2\ ò=Kc'谇@DEF2עy>/P)e_~>]KSG^sPLCtU2B~׼ , O qӺXB߳|ITȾ%߲d8=:$qf3rp ,'^/Opl6$Iԩl|cȲLtTԙdV'2O{nn8?LEE; H(u!Z$7es"d-%mǴ:Xs/~WۺQr{4Ѧ}J2¬{EY4 QfbY~3gW_ҳhZzfBMYj/77pJ.(_12 moG $117`1Y1VFWs.L%v`+bprPf%7GX~fMy$GHs\5a-oGf2ΦM>vf_:gτxM8:I7j@q.Oo jSQǏ=hN7BU f=؏ޟB-Gg G!`Mh]#11hK{| ;9|> Zƪ^cu{yc"ia Ш:k<#n'ghk ${]Z;n xFw~OxhϸY]S طu)ى=xh^W.,XZ:fbyN$w=2Z2 Y~?a yl8L!Rn^mk^D I.fE īAL7sn?+r27DkF/E+*W B#$!"I"?&'&°FھÍN;ѧG!^JZ}ʲ38BMo]9(y $!6ĂAgDoЁ>%X%nP{ES洈`L!o38nm?~u 3۟apC+,_|/=GOݩu0iй'=!G\dfKd5m`IH|RI#% $@%o+hܭWwTB|b-zG & !Ɣgn"٪?(LlJп(NVL9pqgI(s 3Za61Yݨ;wՐ=WǢբt43K';]٤2OU?Y=c!ujK3}) ;PyE?D6^.v;"KYh//dz=<ڤr!tOQ:z^ޏ$?32H"D]95c8d'Ȏ,cye ony>[] ŏ_@0"ZybK2@/_̰z }KgY<oG̗}!CF!ߋ(e4ՊωWAҠ.ewY/taؠ$GUw_*%8J=z'UKۇ7O yGl5|ke۪4극PHZ65 >d6g;V,tgʨx)*D ?gBW5"WRN).w?'xAJJ)45捧 oݓ~g7dPzd.^CKO6\I{q&֯eˢ(c#r #m#]f>7tGbz?ZSr{xlRܖHbUSJ$Nd՚UظW[l.`+/^!-1R'TV/^~'se CIwXSn,y9O_& לɅ%#r=2J ADOwz /f}$?)?̙7_On%IN*Hc!")Mتu1a}%zB񁥼5eC?(PSs0Ϛ]`o0Zʗe>cZ]9M$>C$%cP*8t#FGQ7.lb$׌=t-gp)/&Epd(#s iEP86 O7f"dN_S73l򍄪Jrm}}89a:@SRM <8NqA~ j H_EOiߔ_&udo L0Eyi׍<#jή >Fs0D>1@Fۙ'J]lfݼ7~4 vs8^fdldY `S7?PEehdccꞈǚ5{gDEA#{6$kr>Nt п{ƿ˳C+i|7vJD'[z L*߻ ]pxNT`(~\R2ßŐ6HqM?L|sx~tDIⶡD$X'Z/%L汯}(~К#h;-Ҷ*yHL鵟p]Un FUMjT`䥯S` os$Yp~b>@rv[(⳴;?tq~d[EP40}c3?zNd]}L518 c:&}^1WP!/m-NjwSD'_⦨ M }(|A稫qPf@L-]ﻑ~/=e4oC,eJNlcڤYr(|2EADr#GrDDt}>g>Ƨ',D&3x =59s5<)6Lçyg8y{fP++嗑O RFEVLq Ec Ƣ?w4K~_c(K)Vfh:*,hDD^RBӍ|:*ћ  Bsd¼TUH@d2^? 3d&ї#--~^mȆ: h$@: qB 7WT(q(X4\+J]E-A!Awݻ:u`f+DtF V]pRR/1YXxP IDATL7WdE6t6͇r (3 VeݔawyDz*2dS8U^J]!$"$JZJKK&%%巬UR;"h0Pp;( =gI>v 6[CYq)ވ5(FMiq)n љ DQ_")_Á/Q^] %I(onԲș> Aщ4EN?HvKdԢ}S8Aݏ> ID~}62Rr܏"+Hz3S'!8r"I@LBuP98X%)9ǣ|J;Yzil>!E3.lENviԲ>s_žѼNjTT|R2%` <.=l6m3Oy0%O=HTXɔi4wՋMU nYԘ^J˒z9}4Ci>DhŢ=,|y6벴*-gȎ A, Li~j]np+-tLeJD||l><2n:E'7欅9s9Ylm\_*,p.Ggyse+IQ Ø@Gо.μCQ;H}v#ٯOo-S^^[I!0Yzdo7}G+~w_˼|g]J~0%LqXH4o•;3|2 gÈV& ^vޒ,2\;y:j_u>s +2ظa/5dqhvnT s]Ծk 6¢`XyƋ]Ff3g*F5dnX׿?waQaW 7xt|e:tx]., F#?g-@U!8WmsjNi"QE+s>BMgztU<Ǘsd~O13'}oQ- aH8[y{v;:#S2?X.ad7 RM3_~F .$*3xMem4S5D.`,b'$TOAfwc=( rf}7&A27,7`[$6P+o+b4˦up 7d&~XLh@N-W&V,9ynR!f5"{عzNPɷowVp&z "!*p/oyOlOG.QHzX3Hs%?>O/ZFm A6 ϞKwpw nF0Փ ![kY6=Ð`,̙KֳH0 jUKc䶶ͨn/hAkD/#Ոay^FJV/8&G1CƉ<=F>}I*7{K(>5_Bf4b$2< V漵~l,Zֈ-$x֜~%gTq`ԉ #j#4&~K~>K3I &zx2SzBϿ>vGy?[pRb/CKX|Otn=yܤW:oX"9tF)(_;Az42* .Q\^ 0:5&Zub1}3jAޚؕԦYm+Ckoұo0TIyI+.}kViLH<\~UƯU{[_8k\.(9QbN?\liA&so6..0k9|ѹS*6ʾ|/<xTl8)wuC8A~hF~=Qf'/9 co:"eew4Os{Y3 apSΆR^7^=̘o)D^xI6-a_~4h?qxWgN}MǬFnݺp%㹖ra*HXZ:yޖGS/wڎF7p_i 49=ƾ;'"<}QL]~f97xpcWl0Gtw97XuG6 ןhiIiST=,ydzUo)#;(T79ax}\$Ks#w4O<;놟ۇug:ѰEқuⱙ(rñ }fLk+!][ФU+|Sq|=YI<~$yޞ%?nPc &ӳy*5&\t.=YOcw!T_H~$. 0ڰ qeرyo,?JjcT(Z)\ϢFzupVT,oߏSJ"nٗˏR} gz.ΥU:*kbXM~ĵD=zLIrBȹ~S4rȘm}D#ƽv׌ٖuա{}l+wkk(5_\έit}^B!~u/dZiԴ)`#ݑЧ DŽOqCSMzؾv}eY,`ȳO4c4hҜ;PMU. /A4+ D[ S`gk3` ]Hh#D(Tb@9J0[^aف_) X9;d8T732O'.<Ȃ_)4[L&'1ri%Ul/WSA4%Ff8{1to# K<>|GJ!{(OKBe ("xlЊۍW=|B\a( hINDR/8AY©^?:֝ƈx;,93%nl7@P|%֏,%"0̶ r4w<,+~ʀ*lM̪Ŭ:z7OnL'zվyB[3jz6 :C_PɋW90nFlG@T}<9w:TMẺx_>2:hXǟZUHJYܞAE{fH}6se*GHu99%OQitht%2gtMzX_r[LfU*oMߖ`߂E$%kckdVuxbQ8ǓK l'p<*5Hoƴ%o77% Zdw19,4r%G9A!Xާ-bLjx.dDZ=16zC1:UKeR^mBTt/lIESFFbdH^\ *&%Ed9I}2m0vhK70ѽc)eKQ^q-]gN QgG5 0#⠨ f-`y&a'IaTp] >$qr$*_?`kLSP)N{i!2 ]-i^vdHW d#ȵ$R%TS%0rv$eQrN>L0y  } ]s~G2a TEsO]i&<%g(H89c7dF-ɓdTG4\8y'~CGYefW 7M?K8}X˴AH>neEڰ6"ApLdGQ y@"+J>仞!| 2yG;p MJ)0,{Gt~]>;*z|斛};o?Pib='MmJ wc<ŶKN{Nə,}'-||q?x$Cq!G ADt/p nK"ד<:? ?dUx+pgHY.J>JI~1~*lRQ_!N n+ UjfjbAFZ­}MaNK#ż6C7h^7֢kx]scéu ޙBX#; !R+fGJpST"`:'!طtNIT(,{(cL~;Q#Ic 7Ԗxm)TF=IQ~ ͝[78{2y#ݕW8]r]u>M|Fx#f潳\AYFAG 'M #yo vypzmt}YPv,[.)ޓeXse[WAvejLv85dy.5doNb1/>NР^Š^- GpZ*Z؏ؼ ;gTߦL:;y<󉈸˰sdA =n<^}I)Ԋd"|z Փ]efr,Mlr"6^vYzMﴫ(C2(F@Ը>v rWSV"եkN>vt ĩ 9rv?8I3$""<[9Jd6dAO|4sq1Εy1SFz|XD zbbK>u10KN'Bݻ\=r dQkA|\%S~4'2QPLD'\#DyYN@BR{i9GSBcSV=\ƁP%Q&^C{=Bj8%Q=%eI\d=LA`4PRRBvv6j,LJ$*w IDAT84E%aы#cHM mlxK9y9v%jIqU)+'1ZHJzI"œ9SFZ%"tY>* 39u%,bHKy^&V՟J|/Y\9ؕ#AU PCSnIqW[l!-- ʓ,SVzD=Cl9AJhTa *wY=Ck%<:MFF珣>|b;^TKæ%7Ype"8,P 8=[9#8<tEeeeddd qaoO?qQPPHn^.QQJiȿ+"@nnqrsQP_&@(X "BdE(((((\NAAAA߅ZҎ{p^Mii"Dn(n˯JwRz(n-***u ve}TI())X(([|B͒[޾=N$Zeee?) RU q:QQQqׅ墰Z pkvq:KÁוf@E|>ڮpvb=ׯ?]H>ȈH4R70"22%}HLLh4*Cᖢ,jԨ*Wnn.8u T*w8H5W-oYzJKC\3R V/}|J%(ܒsbO:3v@X,Yi$K(*QAAAAAAAAAAk{R5z6̺ _!(-ԁc Y{1` h존 kxD fAVc:)))AԘ,6z~^BaIn`&(ȂVYb/-+ LV;n*d*J":@C8(.,Po_g\vG*$bҪ"(ϧ]]5YM jLa^Lc\>K8!+u|\@" >*K)p@bذ8 s)"2" kZ!y]Sp#>?_H**b|9A@@Fc %̬UVBqz?," (+O@#0ЂN%\w*)~0n1 (OBPi1pPTj#Ɉj-F ^87$ "$#*QD04?euXސ|TS\VɅU_XBm/$7P_\UkG1_.+($e+9?H@uPTPDKBm0dE'^g+)/Q QM&@jb 6/z?BݍۧnxbP" ̞gxUR:!aArr.,|̘9V/>ggTc"_͸(8g⽍g kʈ.^VpЉ\OLx);Y/;N}"wă"a`J;s*?=k̙eʳv7XW.?4S[5x ix՛׾ެO,)nb*O(-b-&Ge^vk}Ո TtrnrFMGah"C4WfÝ +1u>g6aπ˿ s C;NdѬ!.ϗĦOxw*v:QVw"/'z Rx=^|F=x&7X6i#F`'h}{y,Q@DgGU˦ә%J'.1.51 l?۲tRG<&(So /=EH1Gm pQEn_GЊ*m0Ƹl坹o`V2;ONg Oq@CBr$zAM(?/t\ 8ǚboNJF2|DKh }7CxMV$0x;o/_!C '5٤ Cfw\n2Jm3^yk .vyWmL` #'Y Sq<6%^ @.SFqCHs⛅ߋ#҉Rg|hf {93Jݓ62ij217~4'nXd{sIWqF"Eee>C2}Cpfˊ<󄬙Gc UL8@AP7vdb~ɑpjXx(o;>ݟ2o2|"&>}ǘ:1V5eY'2A値ϰ89UF~mV0 Zqf {U%x]8F:#$Dv~j9+Z4Zn#4})iˇqrVeG1a Ѽ ;(e *$x.bnɤ&RJA#sɤp26 Loy}/c8)xm@l? ]JaCިQԭSH,B6>hD6]hW]bSTސz\v˛7PTw:(*6ǰMqDץ~fsząР%ܮ#x53n'GB@Tۉz S#"[?!,M wćݐf1|.7̱d4kF93~| *^}}PɠCWǗ5VMBcjsh{\ّ*$aX-V+V.sPר};[ {lu `OȹxqB_Ԍ#"<Zq{ QQc" $@#j=F AQ6ClH4GU4X*3fAjuCj4Ħ~|( *5ftjޜzq!؂ѩѪUxr7")(}pU n(ĭ'6)Pk5y@xxVc #!1RPg j#O *=@65bؿCyUs,{[IKKq&+py0 & :K9AҒ0Zb~og,?L!97a-:?-TY2ފ|<+AFфɠE8IvItӃھݬ=•lS ڴǨvwOj:IRTu.{ 58RZҨ#H՝@eE8~՚&Zά<~o3x?xu_""|dj*ϭ_beq jpggw%tz#a(_L6Y+#qvt/msɕ rᬀ5DxOLUn$pR-:tI|':JU*<s>PFZxb.^ǘ{{ЩGO:uEr-14jܐH{?^t3ԥ?gbqͧ$unK%7>=zѩ[LL5LQ 30qT?1 2|šmkIc. =ԞP=xR $6;T$ش(qFG6jŘ>0O[tJiFȄ`5k٥~ƤelHr~[J[nsh׹'ß^@k"(0_wr伨pT TR5M8^3YR~ 7e;VЯCW2gT%+ԅR|MΏe^ 1m'gJx G.o?G3q@ϋxɅm(O,!]o.wL j &mqTmHC\z~X.Q4MeCzm1"7y%,AnMoPo{ 0)Z,c>Ě;/kr"Fʸt xK$ŋWe"2hpAAmfywi^0Wx ۼ)k 7;K&s#6dtl.B3ZcWL:WŇ~mXE %=/uύ[_LȂFd\E}{/cRM>wى|853v|Q?eCԒtfdK=k5g?@Mjw+j"^15'D" *ToZ% yVp_lSz{wG1[4}MOR .h߳r"u~6+w%\tń5[Z_YWC[sC2U\;Mϝ9}xDD'b3io[?σ?E:B3VfAPQηKeA>xƏxxR2_? u:DQS!,bH΄[XVh?keV)uGȵ9(Zyh} l$@(%X_V.Ă:OJf=]}\J=kig^g5WZ'"xyP5e}{fKUo}2v * I"xs/qp^} K/x"8"hr]7w'媈@264 'OOG;l>52Wms_o,S-0  uMKcIZ>3 ϣj`E~65.18ƭh\]ձ>h M&=4$Ö~oϷse R(+7hQOb<ٸ+?AO?D䦽xi/}p?=>'mΠQK j5_[q&-6FZ#`_i9s6I<'(Re$o` Byr//Re k FTS4J6!Ƿf҇O:)s x̤׃JMˇ^J=*<E)GHw^.2vLڇxeDU`:}|f3MQ3u_$@qi'./kODt(1՛qk =T&G3tyy2 "K,!}#NƋ+ TsPZAgԣd2jTve,̺![uT'2~+79jjk0 UTBp~}DcTK!TPKSK^h $bg}\N\nQA-Mp=’ӿ0ٶ#&ܧ&ߜɼ.sbC:1jAFFt-;ıBD">&dJ*]2zd73^O9ΖGcԈ @_ ^_P*W>vNѴ 'v,̷fł|JiX}~bż8-gtپb/`[/)9훖N壹s/Z0\>xtK rȒӉsY=|M-1u:qOȸ*u:v`C/ Oz{|y w&aӌ>3όf{j V-΢*k P|xsU^BdY0zP2)M8+ދ:<8t~^~gμ)52wߗ6 Y N8ړIAxŏ(w k}uߒ gdFu*P%@Yn>-#$܆[=o1[NH {Ӫ?]b.g.+`!mXp+|ٗnܡ ,_<= ivS433c_|5{29r{UZ*Odq03GIo2* 7pY8e$rdQMXh'2&őa@r}|`I~f0YC!j4-ZڄYHSHGѠ@앂BlOŢWVV%{$PIn܎!P# fCNDخH@p ?F#&ɏxcmw"D !ԪWj65n u@uZ&x IRtFڭ[P?1F`&469(03j5i0d-"mY;NroFJ_p5ķh%>9z51ĪyB2_ 1o "!"Zs0vA3@*tm2ԍ2vkҕ&oTEE^%ըZ R[bH0 hujT-FP~'v"a,j%PVo/, Dиӝ3p*33HDl(H^J_P52r G7!׾<ۈro$S)++b䨹CB@kn tzd/'SbJy<пmߩ{w$ZuiI~rQVV?F3=qݻv3x`:멬D؏ؼ ;gTߦL: "Cn~.QJ4jb޽$$$t [Uֿ\9998N:[l!-- J0pk@ttRi 6E||駌7?')-?((((l IDAT((((((((\/z^Qu}mzI>|>7R$ ׃fʊ[.*dYQBC׃$IH>>߿# Η*(ШeǍS`):pqy=S(yQ"ٙD%v WoBV2d)@uB!,q c.t[h"F_ [oF=2d4"l؟)2Jgp6$Wl+Jt|;C{YG2zG*HO@*#"f%;q$=ĩ2-=H>5.˟J9n2E`;ˏS;u>۱|˰/߉+Tl>8[R ^ Z!nj[,AHh?9}XO2>/^l(hEQ UuC[IPEAƠK uI(d * "@va+WɈ2*BƵ(\8;vЛҋbE1Fcğtc5&&K,أX(t)sz}2?p@yxx`^3}3_oDJFiE$BP( Bb )۷u@BP( BY8fUUUƍc۶m&o@ ޓ Bk_]yw4M!q NO"m4ym>iFG !w3; I&^kb.Rr˵JPh7H2|t P$qϭaIt&/>~Xsg>GBFߞXĤn$+syiG 83c. SvXEL]E}x)Ukjf\ґkhx8@-1tXa?&g։Ba~9W07&p]_?)u\=GAAr ̣jY b CTmYu' xGA sլOB|Zz9jee|oB=hSf0A} d?o&W^y%O=aX# i,NꤳrI%?G粩:;{=FV1{>:c j])B%9|oL6 LDm*YkH pɨ\<꫏tmC-ޝ:N,l~8#LYI}y=@y\ HSxyZ'LΛT-Xl#-]ܷ2F5>qnG~>>´ףډY W" Yz1y]7-||3fLCbS5nv1#Og5f-U6!}}qC]cggֱ51rd׏Z6FՆ ,y<&紑Eb{)@DyV-+X1\ڷ#2"Һ;skzZU66=r tMxxRC ~0;/d2hp!?<ʊ]"դJp7?I<iEltM׉BZQLֳ%=r>kzP婷j)OSĵXj=;㒪oa{Jg;.e6PL<;BB~:T0r|X Rh5}4^y.l]u3z@Wv:PN"E}wwOR0#wrZvFs^g/oSD Lu,YawB"O ]=~X?6I.VӢ ս5^ys ΝR/v&nX5vV)?kQ(gtCPQ#VS.5t)$% nb/׮?S@Sl dpÙhZk68 [Sdm{qx,|%0I2}Jfr[gջռAmdNY):[0{ֳp+nL:SiA.~II8LH>C n} 4p fT2 :蒊5-lm6sz>(c5}qʣ[lkdB'1E}WMu ID,ξ>QyhGe} `i؛͜N:23VoU߅[N]4"p1Q6DMZ,S8ċyHץ)>|oDŽE"Ϥ?Iޝ tW]#hZb)|ftѲ{SԻI^ye327E͖:Uhqa S.Fތ(hvf*aK q*ޘ`ϒF.P<=VnP] 'X]2/RWWٳӧzmӏ!!g4$.ZMpUbRu`7nWO?*o$ e #Au }U{}v8N0Kh0t(lfok.n WwOSۼ0W'ua/bGB}qqyg:hC kaS ,emyLnha6%MKAZ&%!)cEQd={W7^iǣ@hoîM<,#t䧣=6ޤGQ>Pe4'7R䎫TEymI#k#N&үݍ)'{AHFlRLzb#$iDٲ֜9sܹ3{9r:yAKNw49*! I0ǐHg~>|c t/ %X3Aw%k{d,➳2Y?{7ϏDwk\02|" +P-{X!\}Jճ${,yDg[l4MGfäLa!hiN$ވ-c/@S]w6: ,h<%!R4,.ԍ3ON)f[{-PQ`6ҒVDXtHþ8Lg=DU 3+s7ەaZt X;U*$D&~\-S2B_y?4DьKg@ ճEq037،9'eI RR]杍d2mhK΂vT}&Lүksy_PkV /AHO{H>1&{Amr벻"-̪0-ӖEy+ :2BWsײ(-^[LN`b0(4%ayi~Cw<&ٹ=uи'LsY1}aۓ8* fK܃Ul@Bgj&ivfIܦڑ *0ƐZk2oS#$#qVFf53>ƒ/FGIu̽lK( K.OMa.SI}IY`STg9UÊe:9..)>ֻ̞%uu]Z#M{*jD",9 mRB]{wj5tŕT8Q~q+[|}QfkD+ $8\a5zNπӱ~rI4P$ɶz M`{x`ٚooGmEevuSN*d?f4=FI/jtZZZ ybY?:u ~i&7:JImS`?su6Vdwʢgxaj H917 <)@hi<8+wGC/(p%f0Gz~,L Y dzc6ڌRԕy),hPMndsՄ_RUzI3oMl/9Ag;Ō}MP[ִCukGkTc-nYX)+Hqx5-\ RxiLg~1Zg-(ǰtAto,س 2c{Z(8jjIM/`-Mң9EC?fuqma*9T e$?i]!Vx!f ZFZ7KI,[YS{> X~=P@"LFvfjaz![]eum ">i`=w)ź?_vxCuj-)uѴᣵei.׶03uf8=q/}?g=2fGxR&ЅHucLl[$u1Lh|~w4Y 5I Vw`x hf*^-ȵЍF=24q$, `tʺerŏ8TANYLiL|Sb:#ǔAx3~Fo)RLasV+OkL`P ZA*K+nGEWӞL]g@|.")uHj:dֵAQ!e MGBމCX2kˣ\pnS1\xdI)(.`r_?f>& {K5"̱5DcT% 1K^AX-K*Na1\4 !}2 543Ak.=YcPYnv?ѽG } 4DH {=vzDv$t F|o3sMqӮ À-4jWkDžƢeQ7--Imm#v=g1FRG!4A{ IίI21[׻v xdglaR1lXY͌aĉ\JP .w) 0:{3DvNJCs8Dg*^X65뢼APhQC<6{R }M~M [/M ["4{G&[,π-/ɒMxBvS:U hͬLXDn4V"Σ/a,t7 M [7nxov3jMS RѤKB3]j;.ίdƺ)à&$5Ƀ%-Qf7haZ }͒aE"io4%<*Ò!E|Hv&%ش\&wam˛viQKCHj&V'57ٕkqZŦZ]:'] ^e&jq[CI]#x<I"::6JTdMtRJ:/OVȢ_/UI\SS%H'VR(+ %IzzE!ЏEkF!Q^ޞ$62iU_nzmsmGJvxXmyȱ\5!ۨ;ځq=o_8x xU;?:7j eyVzZumIҦ)_\)]`quHxz۶GJ.քM_6K$p>=ǟd֬Y?\,Yrߺ:Y^Evj8t]# -q$Imk}~CS&ekGjY`_mu!>}%'lO{8AH:DA itOҧV*3yt]#,,bȑG| } )WsU++ BP( ha RJ,²>b|zǧ( ſ!@41 B/n^Dq]*+ػoTJB8,Nc*TP(c RJ*++VӲ0 CB8q=m値Si( BqqrWRYUi)\Pқ*q]MP(B`j%Bqa~( Bq өcGlV-P(NlۦSǎjBP(_([ϧ7u1xvERmBW(9>ˢo^P( 4<,"7ϯG G.| U+tpU7\P(v"?O Bq( BŢig6bxңh,J<4L$_sO<^~تqu{e5L'H˧< Ux/FK/]I8& uI)1 u0 Ғv #XCE]gsj?{}̘2jB S:)Ciм%"D#=%p5ͤ\C0'>A~9M`)ֿ$y~plG9wxNH4ƻPe]1>-| +ꉦ fRܵ'= 3P;zg?+t5M?LgCLǗәs>)@~Dhh2-[YD ҽw/:f4lngˤs:I0 fێ=El43HAu.$)'aY,]&ٺq={#.xa(ؕ=J]4XI0t;h&]ÚśpzIF@5 ~C5bvT6V0n=QhQ#6q|%RvEpj̣\C٩\}WwE&xFsw/B݊d@^P)B)€"˙=e}C:tE,ne$L̒x[e! QÂW^`s3pR.a6.x\2i(>wAaͼ#O'^_ITnkR :tPFQۯC8vY8  CÚo;Ʉt:aVq?υ/\G/I,Lа|F0ih3 'pYBʨ a%!tO[ߢܛӝWI$]$ؼq=>ӿs4uU8]&sMqRqmA&(N>Xacz0 ['{LJ~p~W}B`w1`S¡X /Zv%ߺa9׾7Cz.^g_~3K*̖Y9 GrMap?V @l<[D 7hѰ:^rKψկo 颙:U3'Vs-iějibq-z_h܋'N#Q3MOnW 0u,'Np ;> D3ޟf?\'=MDm$2rڅ3&ٷYz#*&%'5珢8Ӡ~+<υ?+/<9:iND =pt4Sj֮ڄWҏ.y6g[Kױ>eS6'b[O>r 2jڥ=Va~ ]pO2g_Tf{\M iS!#̒g[1:`{oz!w_3`_OJO b;yYD\//Ex:&d3 }FR3JOUog#g}y\;u: F nG3E#Ͱ}~O5@+zs_ۓiSGJn>ehz@Hv.5 ; zA'1s9w+xqJoS>co5+~3.+ر=DzѷsKd) ՞Ry.vp璝CQ^)D7$rfs_] dޛskhIdswדG34 KOt4{01{-,2Fgz1Y0Kw'6E0"լ\]M.5=iǹGF:U(=)gs|#Q5Wup(CV6%d]1% V,-7^Ǝ͠$?[4c®a৏G5IRm\D*D0-|> χgajIV͛D^|1 >CGpy߹o/%jbY1Voc쩧2fprCM+pm%nC+2| TeErR5[oSKV,XDɱv߻b3b'u/JmQ NB L $';Xț]nGQl.iOvaZAҼw#V=;D:^3uD-[ش-V I]UPa!EvB<+vKꪣ (*(c#ͪG]1 -hG9E=ud&ECB0c /̲< h LUX=k*G2B ,l7ܰt׾Ý7_9Sq` ~#kk:0`)|opY!ڝH^;G5VWj;֑]6ξi֚):n[`3͝}w N?Ά͞us[# ?F9盗0"b@w]5 zgId&q2bs%cdڄX[whMMI HۮG%\fEͩzӘzΙd%ln&|2vP,^; =qlOWR7;߼2 ) H:(Aj/}lr/ōBh,e) dm>#w 7;*ܖ{{OI(}Xv-]E(bC EzI ! !=7M9?nt·W̙3>꯰W|v}KZu;Ss0E\{\1eA.x) ݭКݯ1^ȨT'6}Z; cna]AzAlѾ u\Ơ`iv1''-VpSԉ6iD&Vk twD3_36ޣi\سW _ 2\1 v]sehVvc92BSJQcsb8Ђx~Ln8:Kx4I IrKC1 z01L> FDt)E&5 =Kxs5|(b(M/cQ;$?^׸{3XF;Dav,rsX#[&, Fr\ThӶ33'pӭ1(LEyrV$pB &G^ۈ RM .G.Ĥkfz9fhq8S "mrjUp88Zv+dZ:HYֱK?m4 1+ ((W {@Y4#QҝLbWC )~o?TZޡ+@Y%iMNSvE Pׄ6<CEĶ[j]d^mX;kqf^a|0M ~5{Chfҭ(E(mQkvPb5EB_萨z?1㞋x]`S]p_-FQ|zRcI[E'Q5sM6&?ӉAͬ^u!iov܉RPtmH1siˇǤ0{:ijto<"з}wZ'|6Q"PIٱD6pƑtI;7RÊ&qmo\|\?\z=?q~ԇa_"ZX:T6GЛVL!P.A7n8~9h,$߅t2$k?]ʞPc5.qŊUQ $d)O=Dد~eUugгk"BNBu@\fmK2i QD ?nƐ83P77d#RWokK}Euk\pI%Ln^\aFR7Ѱ 7r X rV !,"",xz86.;_ʹorry(dZL'#ٲd~kΛ1W '&RQ+~IE ,+\wa`ֲ4 w4EPv!jղ(+̣M ϧ0_uo ڋǔCMe`x^\k6|wgՕuk6PqH5lh~+gu)J 2MZ&!wٱ#9S5 OL ]?+=3OOcl Gh=3m!'cJ>I3wan#l% #EldLtfugxBGHхsXF' ?17ntºei":-R7~q)>aa4RB,-8x)-&@GEѠv*dN8 N{''F{7e_;S' %zNՆ ({"B0h4EOe#0雙_l K`6UQRN8Q5!}MAV/ښ4H/ĒQBƐg^x=OJZ="KrĒGae(X3 :L}ĭ,Va*6Ufdz',Zī&`EM82Hͥw\ʿŒye\w˼Y#J\r .ihuҏoƔQVQ&t:gOG侾귪`85Ds9f 6TT ͘k3ە}Ǖ Ig1r<^} nu1S|'%PuQwȭZQ#xWA60G}bޛ=gno/xi8 4PD45jG[ڲkjKmS53aب9EAQ+xK}} X TXu|m*7;IGQH:{6,1.8e[1ty:w>}ogHNjP 7]tv:_΍_foKV*Xәn9g4{k|9&Z ?Qbֲ*MD۞ș/6?5RU[OfQ^LJ"*/D7 ]uZ@epn85'nud^B#4tEu6If@g_Vه3kԟxIhWR|9Lo}>ト]<4RG\X4[^J~>Ln`Oג]%B`ՖR9o6Ѥ*B!~(1lYr4(L:}(wzvڒ=ʨ9 Vn >Xāv3 F͢OL*.a]y#RQF`Ppi&v6Pjա%DJ [)lb!+Jije_)qImh88s筢Ɔ O=vl`ݶrkjYBeĉIt} 7gR*gMq?0\r>_ 7wݔ> 5464i-d[?$"C4%N8DI">9Tb&A"ܫ]fS DL]BA dĎ',/,OvXqj9y,z*wlf,a? Ś>gYN^tRrԩ\QKM!/Nd%# !pXcpi)q9Ǔj8Ԭ Kmb%bl*2Xɶ :Mn#۪Ul-&1\ye ;\R>&?JBAh hdGq侜y\6-YN]l:'Y&jc RJ_pRbHlXκFjPrsڱ4VɦsQ!Ey%zYS6F~fn?^YK]Vn%M]ȉw* %~jwWR u`XftcY{hihOu~]^xFioP_-`M,\܃;pzʘ?KV7%hMx q+?\tLG9j)*@ v704UbXաPi<+﹑1BD Y_A*RsuM~*6"19dJj7Ð8HmYn*J>աޜ:6o ~=f]G6m]UTSQZӍCZVVa4Pu[K|M7NJ5s8#3OYW@ccPd/՛jYt+ >6xw^X;CEz@d7K,`Yھ&Fơ(*nМN !,rSt,Hpa|GRۃ,rG&4 =)غp1ˣ{B7Ӑ웟;gxՁTQi<3n|:HUtv95T< ~KqEGEZfMQ­* ۋ#l|E^{i:_>N Ӎi[_Xd*3?x;s9"a|/q5Q«~u?\yBIpKt!h9FXD~#QB I(jIY f?Az&^gNGS 1}qҌ4::?w޽oaqDhȊ2H kp9?l?v"N1ɗplsεks8%0撫8>1;X=FKAǁxrxܱ2X-DiNs$y8~b,5@s3iYi:-?wt^#'sľ8 - Ɯڍxh[wΛ_{U*o$SŊD;rCuѳZ hj;,Ͽ. ffQHZoL¡&j¡b-_]Bt2@S!XCS(ʹמM͌׹y;%f0tr੧aĸ1zO^:b<\.4]A$qKKcTLOwν,F}s'jBBm‡aCfhh.Ƀ1|.۞{,N2́^͘tt+|˃opKl fhCYA0 bZf<&GOͷAr|ǝ{G1KiIv>&MB7yo/&w/7 F&wyi?V}q* }4NhU,]9_z?oI'aKE#miDhnINѲB:Эd;X^C6;эT㞻D3u/cϾ᝼H%>uG|/ο$Ke9”UKjP3yƴdH%IGBu߳>\ut@,ۗ:i RKz&L>0 f) sS]SGP(- *trb#XBHѓc{o ,fy66Nn`sٞzfI{^/O%;F.\җoO4*vRYD&!-X4Ţl;%1T/i%E--e8DJYONϮ$9 X͎ ?)${M*6l& =H% 1$ kfBJJJ+iCJV>wlH[~"Ul T-jƐQЙDSq#{|En=H PTPm9wVIA~a{FQ,"l_#ݒT^ 0f0)/aW(.5j:?4<]o>⎥œGzՁ2Zlݴ oAwr|D( 5"DfaNBASa"hd[yh݅0++fF¦NNYx"lRߐ(|rPClRNcB.2sM!$ %T4@I DE 'tg;:7x'UMa$ 1gS,Dx..)l-* T\ Ue{-)]S̎P\t,(`z)ꚃWٺrG|zvTӉX a5Q;܂Ndt*w SHJa3zPcS15 p\:ıg=Ǟo8{/+]yS6>B\JɸT!.JYmVɫy4?*k%Z֕a2 roA]6d:.;OJID"J*2@hĦdF*AŢ~6 ujJ(nBNr-nk,ak]،B]۷S-"}Ly!G޾j] Tx6jCa6mU@L+g_GiI)uAKqIA~:n)3֋/²4Z\Da{AFRܫz'%  ;zןދNjUOqǜqv0 IDATmWgȶsi2 7,'.QQχV  fjCh=J˾% 64l8HHv#N ԯϴ#۹iB4piM+Wppk'ˉflygb|><*גpq*`ihz!P^nT%mjl"dH87z{OS aI$p' ڿZ?s_*8i2 P 8=BsXD n%)I&3RZv_,TkNϽ_MAu?o6m!oGKKO!VWkڛV_ZSDuS>\;)Dc DKZh+`a-Kآ"_F/&t=GO;#9eyݾOkW- 6= ZS~_ՁhwAC{mF%7#9$p=hV`d=Oz$nsXupi*Xp_3z5.Mwߨh FfvXȯl' Me\2" 7)_67: Řd&N{ s Bo?nVXL@n_Ө$8C?F{ ʛG7YF߫L &F$o f$ ty*C0wTp|syKZ 7 '?M@lذaÆ 6~S<#0Md6lذaÆ 6lذ 6lذaÆ 6lbÆ 6lذaÆ 6aÆ 6lذaÆM@lذaÆ 6lذa& 6lذaÆ 6lذ ?pP$q6lذaĩ 6l Y^AU߆ 6l݇ŠE,؄}H(]]C' Bur78@|s|=fklذa!.O ^KۉwNguov}Jqi?OW=+jQ~f+4k^ڠew߶`XT_̇_oI?OUۙ&  9uz" - ӍǥE5}RbaM46 +C<$h<@Z:@˶:l,ZpߟUܾٞaݧ(5H=Dp5L#sO8 be# Mhz5ǃ?0w}h# VSH͉\# ji ߞKdOHGd! /Yʧ1x5&^C'/فeɃK?IJkmSK藭Hٶ} )k_>"Ty.l*{,4UGΊ)%ۘ~T>t#oOSo'm\MvSvO]W({>\q0k#bwDtsMOr]|*3| 6=Pa)j<]6WBW{ֆ 6~CЛJQ]C: ”*C7yPv5s L>/n!a(!Ib(ܙ8}zv#Nδի(na`J@Tdzf_z Ǝf-’ոy/<juov˹u3z׽C)_/Ï~t%争dW\:},>13bڃWh\v]"0(McM$3;E9Lt yhz`BnA&"fs%qT|M%9'1CT n{Oۮ(6oiWxdJ'5Vqe46#P$!t3aP.)Q|Y}==5G^\xNNAZ\w TNK SYW ;'tSO$+7iB3A60`U%C!/ӇHN\2K9މp%WXHn [_9" %߲̎'?=w0{?|ԲvCC$Mcߞc]9xjA–`a􉿖K^|yc!cɀd0zpK'tHb+ĔLR=nXww0$BUic6D|$9hڵߑQ (_<T"Ց$NZ p33$>'1O}.u\rp%[Oxo= B=5}ϛ txZF OSk6F?8P3>{\t0 (*'>`SiENJt}W pc<~49P%QpϏcЪ'y(U N#NÜ/~$ϰ=-12f<</F|ji_<^'sјe Q*Dz=t9+40l-nMg0 Ӌۙ_/%:HbuoK*>4ol0dib"QLp(ơXbyݟ6lذ#6wwbZ|=./Ϣjv?^}rP.@nA V1>i# qF"-#QCW`&UeEرMM_A1͆:.A"²OantD0d'.p{y K@kXy;Nbta'slOjOGM;)%W,w<’oXZsiMK(9 2@3vLZHO* B 8n=˖?c;8?qt;73T!kftAT vRcap%NCUi ma1h. gv^u#NMYU ?i2mb;! Bi710,)KJF}D_>|{g0放,`ZBֈo噟*8 ^ʞOQuIHɠnm%u~T _t&a[@lذa7'GdȲE5dZS*(r̜#8tS*x'q{%: &+;\A7w-?/N Cnb6? Һv_F$w _z bM+TEEX%qv!1L:C0"QjE4Hي.Xv(H,BJ W  H?L:h@_MǏo}̂,^K8'JȾq否B*zuPhꍔIIa~"}9&;cOY'S!ܮ,o;tߧ=7p8u+Jz^4-,8J濼︋8$}Y wGn&l90B&eAĊJ+ !1lb/y̯Lc#:h0C fQL%/gk]T-,j6/e?~VJVKLRV?Ѫj\Y9OObp5&4'O᱅{P+m< d%S.Vm1I+" DTk] ?Ng>bgUdF0$M O/8"yJTȡŌ9v ԁq%n9b1WbiquàasoVoVV1)?B3HLWrS4g8[Ήf0rŗ{`!T<WlҽHKy7ൗ^G?G.2eX wT_;ugRޫ`AED@k=FbQX Dzg)KY^fs~HW/侟gٹs|9Sta60_st7%Om\;%.pm#CWG Cd7SRWw,5>Xk|Bn) N9[/R&S y\LONخWU[ҏB(ph[}]ʢpc :|zR9%^wDzr]i]ܙ8Z*螵?>۷u/o%0n{w+_ܱ16 \AC)5&{np$nRc%a")*AMɈJ0W2rq 6q{ǟIOwErPlQZ3kGt#ŧ>/MbNI~Q\qgHV|<1H\r(z7돼Bqϫmd+]k3f0i$nvJJJx!D9z2|v:GrGTO؝Τ\I]oN69<> z#W)%1(`&=Uz nS_ iRk;@(L@w$؟e&Xj?b.8O'ZAn5V7OJ4l B _0L$5pJ !8=K7PG J$ " v^ H$nH%0A>=y= М81ӳS/obJE 7KrphMfEEܱx ׬fפƬ_ݿ +^u!h6u͜ɢe(Țc3vG1աEz(So gl\55ޓV}$_kMcqIx<o#BQ}0 ݏmO/ ו^DIBJN ՆjjHo^ h>ݽ7]Ȥ$:)!CfebY9p bvFM}isGR~ _RRH`;^YOq_0m-j؀{6 ZRRZ4 bI(pKnv.ԃJvBt2 J*~?MYI>lE{@#ejiղ<|rBJI愂BUU*Ftt!]IJJ ٹ?S IDAT|]RX<=4)H' h3ii*#&QLd m+]vX !$Hо]{R{d dێmIԳR[4iopk][[*E~^QBۋh߶}R_{hyͷx'Id lں;ڧؾc;͛7'i# ʪJ6ň=B***l:F=[ouٶ}EۊؾOZÎҧg!{82V|;[ڷm_HMM%%B"ˠY^3֬]sHipe4}n,Y~3oANAq/GP;.Ϝ9>}:wy'hx}L$|R8ä /Ra\>"!?qKJylxr}B~N -k]kR(? WQQA<G+Xq۶(ٶro̩h>>!mR M9ؿ&nL%]\ew}@ut]K.RJhkQ )]\W|a]![l! ]qҥ m1OcQ:'v!%[6:DM D nhZrHǡ5@״-*#YhIYi?@E:=?B.tM$`[6Eٹm8SB{.gMQ5˿bN;{$.^NeFGzZ& [#'^k:8{|a^K%]Z ]BIy8ϻLFeͱ)a=Tx'  2OcB)4pb&-|p^F"fϞ͐!CRrwvukx`ǗحuuV@ .P[ԏ?sNts}>t[Y#0|&K&>Uso!r0QhXNuC$VфvOs 7n%plk+67HJڵ׶p;Iz޾(Zȋ/M7qF0ETJv' Qm&Yi(W!=icWS >>QEçXlnGp,^0J>2OJLW`6.+%h6O,4)%kpU֛> c `DPJIVl,UIo+Nls#5|7{S>y~ q.{ ZT?|R}G..jX=g.?NӚ^1Krٱnsm<᠅3hݱ/tkAŖ,\e /J=۽-0eq d{ Y~} ʵPAf(;Iԑp%њgJ !\*gZJộ{L [L5~F HZ+l[1ֳiB}&C(ᖭYTCdƀHk!,Ee$\Y-:Ч_ . {?DËxA$/B@Rtp }O7S?_l-}8ywa>2Zd)'1/8x=<6hbʔ)\ve ٿSG`Se3f yjO'+Q+BTnY΂ߣ%pœY X Gۖ}@ch5?kRi4iɈA} c (-[dL{_gll0HVb%EX5:rr'OKG'ݜ.kVP|G{?1NRBRiuQiU#뼶R*\)1CaG0$Y.+bqy k̞:vap&hBfH3rpJPQhSR05 B c(x¦Lxqwiڶ5Zy_Lb'q孿8?L_yZdԮYV5}:gb,u7xִ ceGv\=iCH&MӰ, :()/BJ:s얁(Y>7lEw%CP89ڂ AWMz 0ߧ#H`=!Z(P25&;b&ӮG0,C&MʅΙm`y񉔦m~j)+stt ם C.>i?~4 qpV#{Q* ךMlrFZ;bybf*Jz`UHF HgkPG(i{gXecf|߄SN4'=jos}lޖ;e9vռ|ZJ%JX9HD Y>mZ5|>=+oAM#Zx1SJ/7xJ~$K)JH|̘;mE?W3fZ) Ǩe;nׇN"(Grlz*zk|>'5pLLwыzݗmF$90uceH'4㈺uJ05\¶=D.>ze,k[D̙.[̕_Y UA]KF +uy%%h:`@ e%☮ª-/gooDX5Z ->$ a;al!Ͽ8m=']u w.6ԭTmюsKlߎKᴉ 4AvMԖD@?p4Y5=}Uv2e&eHB:6c'm9 UPҴ]k2}.UR-4tCOjF HCC& ˮ$ r, .sALc%?'Ց<~5 c>J:UEYCȕ)QLQ%/@(McyS~B:J4AċLYۋs _yyFr.%owVf1sR0.59g.?E&t|!q,-pK>慗9v~?3!ʮdgo1욋΁ú$-lSJa&+PF+qq-3c$SQ-Э_%Ӷ|-˲X9coo LNXw>Yޞ]9G5acWJW}!f49;Յ&K?zzpMg-mQvQ vlw7> _!tOSf;.֋q8x~pjټhO=2S;T{cN^C}>۪CT] 2œi$H~TlWi5aGJ5aDTaL~xY^2-T9!Mag]ؖIiPXFQ#;,kκ@SrWũ.Yɛh4ϗRn)s) H&mZ[/ۥq4C{[s]żm!=|;!MܔRR 0<3QiPk%iiJ*B>\SMTB9QP:׵-\±l\u,za/;oa !I#X;dJak>~&}6'''/Px'^ù3i`,|q^= u)܍ПDk@{}mQt̪{v9rS1%dZu|_u[S]͸d58 k,_b ׮⛯֓*a[&D"v9oMA~ïg  hv0Sx EBXienkOK qa]PSkx\RN= .rY'MKW&zߟAXpRCĪ)L/]5%YQ@Oc35θ&cdV6fR7k|2jՎtjYR|H%Riռ9q )o~yDBA ќ\306̄E&ѴTSZDfCq._z"rS Yt>ds~`kW$^))q@q,G.~ӧIG'S" ҵd7!ˡZ"))DR„>|v6YEj'Ys66p (c:K;.ht%J |r?[֣rP'S6>i0k+*%` kvKM%MIFMdR&|QAaWpZ&ɽ բ?^{2?&^," >ƾ6)9@l!R]=z /[o1iҤ=u{]G$%~uid,zf+9eWB l4ꈌf`|rZkPsfOP15~t*.ফ"c{N;>! ǵ!կ`;cVFҜy<{s7`*?u5?}_Ue3(– ]H؊4k1m߇ :%(huܸV^}uz? N2J)dʊ(gk/ۙ8дXӢpY-Ǒ[ 4N tq0Vѯg+|Cค &ߚͦ"5KgasL0+^'4v{,\_j͛4;I8A (𡵖K5ΗYhB*$>4Ir"QMML o -B-k_r7sFwtp|{D~b6%md{U ֦=TE[tڎ@ȵ1acCuƲp@Lb??o5=s=e AiT2SP.M)D ܼ8+J1)= )CCiljkJ>[eMN׊N!BO1bn]W4e܇Ⱦa H#Af`jK:ӅV&n-cp@ieuZ$σzHA86feJ(myө IҭQsՄ)Ɏn}hWDc.y=ÛrH $R*bWeFs9D `4Bz$Ԫ;]_~zJɝ4j9h1m2kH!PRX( i_ny[1?n~6g.C4܄]wݟwjh()iltauMv؟D}.mpTi(^LV TI/zޞɴMu9lPЯEh~]2@fcY>w5k39k~٬m5c%(ttJX,ĵb8Т`3VO?ȋG(u !GW982a\#ʹg=̡a\ApuWR4iS+>Eyu"В NE<$ F3Ogk"@Nq/뻌$oMh W ұp\=#]gÄ![=}z. Rj:T F{MÙ:g(JT]SFf-ֽHPP\V#'?UgNv&Ƣۘ<ݜ yn)XD&#!槠]l,m].RIQ;e㒔6JҥKmƧ~_O0T+ IDAT0 233mTkRJXΌ1$?QúɿQ|i9S]פ/HSbɓ\5=iiAZ۞A2ؾ;x|$ ?DXG/uq}%[\^ŨbsM'bՐ y]D"MW1vh|1Nz~2o3[h7*O96tPTIρu),!NM4] V0 TM8vJPGhlŭ%Di:(m9H%~ےvUJ`\Ka"L#trr?c4WZʋefГ׾9ZZ*A37p3IfE0=i∜+_" <q\́u5#LLff&qjzՁA~G?eʯx~j)wq+nJJ9xldʋm?B4 g4NI t8t· >bjj<ZkHk=C6);5`T?p@)`/!mq0]EVޓ8um\|9th kbWHn^yX'6Mz#r0b'n T9M_BɆE̚5 8r7)"'FehO. /k4V >)$,'u].|\]4q-1o 4iu_I(,djzd ='#S8J`5vN]P-}w gY!TEtjLJn.֮\MjHKE }zp߇ſgg9sTt:sW&rSrp@#(9DBG)îm5n7t8dRY pٴ t^oFШٴU;i3( qsmgl8ՅX=g ޽w -sbg ڤ"mg] $_ R UXBFM 0N?.]b:N#BJ3ap]QEDɤCCdOi̙3;UVqy1zh&NC]s|C\</ņJy s,JM * E +h H'$lJ-$f"N v~] 'Mɿŷřy)A[d! r"BR5 Hl)gI"nH$BϞ=i:tr#n1`XWD$ yN/J>{&~˪-;رu3o.81Oa?c=xu]gΜ9{ 8no6m0tP>,0 t]#>6?;b&:KС{&{\ yݠir an#HUSRKyjj =ӭm>%>c" wR\@:> ;Q 4}"ۙ1K֔HԖ*9H%SQl9E;ذ I?Nj`{SXDmʱsAˮز_}eۮ.a|6櫙߳z6oڵkQ! h`q٩d,yG^Qc3?yxM^Wo'r,n}8T_m!Ujq"`6q8k"o+@Fٙ?ϿU[Y5g1{}mYUx'hwNcdQٴmr,^-#G[̖m;rr[żg w3=?0=`,M,bcl=A;h` l/-6VpbeokY  u&f-cI<&7g1w;@(r4}t"oR֢QPPVmZru-Jin0OEH i۹cHM`ywzJY &i}Ο3rH?|2226lsN藺.]Rx siS:묕,T Riٴ@.hTġvNœWtk/qq'a֧sIi]xb򎿂{.Ϩ~Kz|9tՉAc O䝧Ha"v͍蝏^%>m8BCڒ'rD;~ƻ?fTctCu[R~p#LDsKv! aJ%]BvXMҵ1>:Dyf Hm2qG2_;:7 9]8(n+~.e v9sJF8ƛ(i2SꦲJUTd N BVF..VH`ItD cCl՗BT8y.=4NAg.fx2eHvКԉF^x)3ΤЃh7#wcUK06+봴!ID/'o0 G׏AS Ɯte_qX~! p/;0q(/d&2qڤtZ]R[yM|k5m0±̜=G>1uben#MRyy y筷SCo9O3X{4P|ٶMiwv(p}C:lbf,>1ľeH$ibf~?\r T 0]Ir| ؅;dFeȞMyW7ؔ e"I2"=>d]rz$f&?Vϖ޼u-!+{AqSb*aeJ4u2V=Q(Sϱ i,Z@l_9YGظx(| 4rm c"a'={ Lz/ցC ;iX-DFNCobw[öYX?[^~<1?Bتĕ.y9yHWneCu/I㡰x[I)g),(d4467K<‚BNjՈ>H>b^"QQX4۶E;Ann.yy @T1|#GURJ_PN4x6~t8RZRi†X];h A&Oި ۶ItmNEy~ᕁc˲\nZQqFC]_k=c#,kBL>Ycr#ȃj+ I`Y~o:lz9Xyһ2ZQg~_j)Ru=H$T[u`E5T9(*EODV PEQEQ_bo6ǧ&*((򡂐z 뒛˘1cT(((?yD"DQEQEQC 5djEQEQEQ` ]G#4M+ܖٮ pwFB8dBC{h ܕ.`44ѳdҳMdƧeuA|5mѐ;!kϵ:8rO.u>p}\o(( @ݺwmc\eaH\6ͪM\O@q؛TKZײdrb=UnQ*vy0slhFwn+mT8Fo`[S!Fؒ8oK֚ٴN`S&iZ)hS*)bF|@;'Ң~;l0yh"Фtma^<žA _A}ɶ:lnhx*GW)(11.oϷd94?s|Jz;~,]%MkϢ$h"ӭs<WSdb2w?Γo[}߇\Mw*|:{w>z=ƝW~埏,dZB?7/oA.j}O<8{|uo%x|q4фĵ-R45MtMtI'I2HIG.~{%E=C a7o #:jxTt?3Fh7y4mlwU IDATrM\P~EQEQ qb_`Rhۗ>_šOϢ,jKMŷXxl{5O{ĥ 4j]v~?,xdCiz˞~ڧr-"%O,fƤ(~_È Vj~}4v*c6EvWl9Y FR:Jx&\>=F{eBH)!PZ:~a2v1sH(Mw%R3qiIHdxU&#pDhKJD)+@_͕h7k\ӉI[z,_hw l{4[䄠z?FiL(~g8;/!̈W+_p7|) ܾ5ZxFgt%R=Xgf)~c# n,?ws! ~umiF||q WQEQH @j./'3;dIf G4њhOY8n:)6.7fsΚJ$K!d'=:[Ҹ枛8)O_[X9F$h|o?YFν'q$8v`ҽv/= NbQ }AF+1e jϝD~rfn^AfoGDoIxXIdq XZFNLwP!blz~y7d_T/(( R58ϰ>1ҋjNбi g~t-OII.k7Z<K/~ 'aiog>~J?6^)o. ΪatqVKK&Ye4MGvc x>#l\͊N;I;icc23$L[os#Y;w=EQEQD.^+W3Ak0}33NϲniO|htEx8L;MxaـF.'7f19²_(;%>;;\y۷9 ISD?FQ0]n?>N1R]$ऱA?@bW'Rx0JøW9zi\< ~زi.Иzl%9~i 1qLIª㵿U6iYK!`wzDV:SEQE9bcjb4^v-_ι}>-ð,rO&uH+EWwo^ 0<̀4;Mz4`|q=L;R>[ ʽ<7Ws]9?.xyṵԏ `RuB[8rN_#^$ZO/N `٪iڟKڎrsUWIqtG+߲' @2ܹ\USsv"%r+Eܻ`41w%:NI6'~W3do\ƈ )zrlw̧벇9mrW,W2tҩ1/^}>ecUEQE97iZˊn;9g78ҁrbtͥv+uH_dd$]-uh>V[CaTAHjeA$%Q<2I;z3pKFrYZD@=7NyvЗ[+)Β$^OgAQJQHWLdmtK02DDM$km3- ?yE#(в}vi+qhkҒ|8H}f˩6At4ղUP\R@У.m5i.. `5є直7bf Xn!Q Q=]((l˖-|+_ᥗ^'d޼y466"3y@*+؍DJR#RXݟ{ B݇^'Zȸh&ed/Ƹ)qʧ2U1Cʉ=eD-zcQp^) C }hsF0>ghDJE"]AWfB0q_|((V/û.7Z v+ˁ~r8~=c)((+n[lquvE"Ӌ*%!mKKm(W]]OX)WJgb,\( iEQ#Dܖ@몥 F$ĊB#Qψpm%6b4 himǓn(/z(̙m}G_i#+ q?PoE9*Revk/:ӏ7FMS_'p8k wHYm8o6c*ƑKVVV_(Nm۴iW2\)iqH6nb[VUg*rԐt׿O*/ٵk5kٰM$QrZZwVQNq35xUشy+P(( hF"# c';EQuqm Ӥ _'Չ:dY>6džt'>ofUuREQe ۶ߊ((3^!IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/editor_1.png0000664000175000017500000013252113203343610022420 0ustar jomajomaPNG  IHDREIsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxwEڀa.a$+IQL'f=00\;O,9cDODF$/a3=3wY[f+U]=5VPQ#%D"H$& >JT+#닪hJȫMJԈ*&l5ډ}euVw`zdW5MRk&\uIMͼ[(aGM~lԙ2DSO8mA izHkj2.W[>_&K?i5W3A֓q]z+/q6o d*Q#H$D"ʠok%H$D"+g2yD"H$Ɂ2jp!H$DOB( ib ̄L  DÓ"aeB >EAEAQ-YJ3W+(H$DJB 0ML@tLH(UQPUrZJš&Bh9V:9!t00 a+r8TTEmBPl0(,E 󲛥K$D"i[ 4L4-N<stPLAA!yys6m̺up840YuC'S\\L#+$ QVVΚ5kظqcr1th, O,}l EXWVכvx=.4eP5r VA4#( >ǃ-e":n@Ћӑ*4UUbq4q8T<et:u4ҲN<s{:[Ν:r;(ݵӁkמ}6oƛ /R(SΡ0S4^={`ߏ{qoo'PpU1x;MQa::ǟ,`3;f$>"h41#x/D3SePME(nQa Dq|^7~׎ "h5>ܜݳK$DK@ x#njBHX-#iS]p܌1?Ʃ84b;j, p9:.Q(r-kqn=;Ϊ]b/;pkqye4]4J|^/<<3!(/+Yl7q8ܙ Xt91Pf]rSN=ڻ'^+l}|^~:ss:̤%/=,7'_y:Gz޺(8baق/]e‚l0Du.<&G BiYyF*jGdSr8vQ»K^'+%p̳8G7plذٷMnND"HZ3)Mz.^4 5WILPMw(fN7nЮ];@B|'zM1njG4[NII ŁLjYJqvD4-H=W =Js>;8nk8a 3~͡*@>Yg=E\D2yM!vX?3Q@ē}wҿ4MTYӛ_67|W&wv/ȷܕizMWTaAXx1Æ Gږ.Sp8iđGжMQ'1iќrd;'PUi7&#O,gK$#/nO$0 ;l0k=FOZ(qm9f1ֻ<"|rD"HZ= i c@MCIҥ 7P +i2"H$'m9 aѫ`V @6fǜ9yʹS*0+K>LzW]Z[+\.Qr:[$-vzbEEQ*APPU?UF01 ˺R珫*ay\yH^.:kB1z4"c-\.^xE^MqܘmvbQ***\XM72?s_qp,{k NӚ擟K8ayuk7" oӥs'6m5kֆnyUU9jh būzt=[oG cQ>7zE4Z]D"H$I';vl'abAkahp:T(5䨪[ȗ_.l]0MrPp9]|>E 4GwmNer-7q9kZ9\ݮf4[D"atC̓q-Curٸgv[up8ȡ{򟧞O?G6FZb<tx.4P| kPgNvCU1 DUZӤ˩NXL'vSk= $0LߓFqR]+I~?m۶{*۶ne͚ՔW5[vu(駟 UZMm+ND"H$MEu80nn:ş3VULCfjN'.e1Mkaj!]vAQK$'EU@(]]Z\#O䎶Ud ^F;]T(.nؚE@Ue@M4-:ΖiɽX\G-߷[I$D"i\.qMЭ~alيCUx=AL!Gc>BI,?cq&Lq$NhQ.Ȯ`'fbrkbkEQ@um?+|8N{rC躞TD"H$ɁNRshN,#  zQ!L(*Bx\Ԟ3uM!4X4FNN6`cU8U*+p{ܸN%bMӈDb s8S#K54U.>Z yQZ3CuݰG'H$DK$Ĺ\Nh +ӉJXלּ՗uk)Ef;.f(uM54MC\UUPT. e-gMZ0H$D"amp8x<$\_֘AnZf.=Zu3.vv ڜ0Lbhuf,"H$DKHGA>`hD"H$H$D"i8^z}]D"H$^6L"H$DKD*D"H$J$D"R"(H$DJD"H$I+e+eXrOܹћ4K$D"#%/z}9'i1J1d%JD}U5D"H$=of>RFX޽xyw+nە;v)SH+m^o,[G}F>D"H$f+'M;nI sZ&O{j!n&O9>x=ʗ^x<.H$Dd\n¢B /O3UӳKozv_~G*H$D-`sx䡿чScstfZ?~?wO>㛅֙#rjJ$D"Qv"o30xMo&O=4]9=qHC8ԓhGS:{2f SO¤'qPǃ8c땣*ǃw$D"2-أd-MDB\ p!٫TN.rǝ0>oۮ-[lcaHD"H$ ~:ԡY{)QZŬ]Q27x&H$DclڸR8$;'Nfǎ'$;U3Μ3/`;^?6:w̓?I0-D"H$2{|ۄI;5+/F\jg#c<Ärތۯ/>'GpƩg2㌳Y=RWD"H$2jpzH$D"H"0u[%D"H$'RH$D"i4kH.k +v2-E]D"H$f)2O"H$d@%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)d GTʈc-]V!;UH$DJq:M3 VEUBΫ/(BEk EQH~%_*D/TXjIPg=-vZQ5Ug=SVQM)oC'_:f wt:q:Y"hnKMA;ɾPqNG2Usq٘i)v`)fBi )RJi EP&IMҧd*WO0P - ´R%P,PLLS2ڣP+I=(&ҋ,ȸ֤*Z(̦SlھAEPO((/(JZt";weFJ+v 6!ow<\ N0rni:K/ObEUY_j {I$-tt8a9a):cRjʝ@R("g MX2HI0P&iֽmMrHYS]R3y=XX ;OVX C% А2"ii1-F4ԙJ5vbumX?[vnW>Nغ}3ۍfh G^ZBnfmůӐzJXUb5 $QZHnW_j {I$- E4MKE,n]~%1P%ܦBMO*fi/Cl%(&=f&]f²ohۂb&S;KgL/ LQڗ 32]ζ2yueu{6钶ZPڪߣ;QGu+6Tyuɭ#72[V-,nשdM0L k8Zk:vno8kJ$@{-hGi.`ҊR:Jv0#aMOYwR:‘li!<:¦T~I,tCg6]4=$R!tKJ~SOTRjBCYQI/ROs+"^"i`|觻P3j(751z=DB9 mb&5H˪Z[0P] +qvJXEWdچL =T$Ƕ"WHKP6˳HJ˫ymݺvfՁn u 5ⰾ«Kx#HRY* FwFFLDBb䟼5Qw_'IDXE6L T?9䏣bIE+ՕDZh&8:n/=rE҂fc LraMaDfxs !'2()gdZt*i;[2fͫ./9'FN5=FSԬC3NgZsf yUl kmY!{>,˄Y_ϙa'\ ]a܉(j۴ٲěvD-ìIR})~'4js\HZ|jc@cEQ̴%E޲?) "ePS=̚ ]y*wsN\|ŶP$"#㆒No"V_PM0˺NVTWkNb{4'z2n$j=*xtka.y )fU1%T p IDAT3QYYs<9ά! yOMh]盼CUk,QUU;oC^=yw8崓 $Ԁ4MtCCQTbA#-Vܧf[_zy#'E?0A ӯ__>wFD8&O&iy覎n1H׭8SO7 [E*^O1LrE SX钇n[ahn}6MtD7 tLhYr^2ˡaؠ7|lقn0e2GaIXD31eFhh@ahnhfЙ4xtF׃ѷwx翈c0 L%ݧ_>V}oeemkUOX맮7y]׹֭~3o޼Z^q(‚ DU,˄&ɉNs_Kaa!2ŹVL20tϙfiF~KǮtؕuwC|܉|0>}4#neY}iF#/.1lF"9|$]:v^L{7ΦKǮ̺dVrIқ]zs\}599̾Ji&beg{4h.?AYwumڴ!;;/MKMBL>@ @qq1EEEdRTTċϿYgipB'~5M4M{9:ukƴiXx1={}w|-֜:R !P5LΚqF!1~MWif @:wG g劕"f]8.  F=4!9)(K,W^ -Z^[e:z⻚BkgK9w3lڴ. swZgNBcy饗#q=o~6mĺuXj&MO>;va;q8fXM3v a>;rA}rṗPQQfZgİ<64@3 VӦΐø y{;W'28n,k_kbQOǟG>CtCdW_~5#`ܨףD7,+qތ X<ʬfq#}>ׯG74rs1^aY uCc˯pIM>y/n8?xN:>O?,]Ln]=v$N8L2| ֮Yg5kx7,0u4]GSߓ,9P#0tPڴiOno3ԥ^C=3ci&$>"|ea֯KΛ# aÆĽlIoa j*϶:˗-Wi-/!LJoj˧)DK*; g kΝ;k8bHƍKu +5kI3.8"*+Y]F<gܨ5?`ǎ8Ёqڙlٲ-'|2'x"yy5wΓO>Ʌ^H9蠃={6O<`}駹(**bȑL>ݎ]THZٮڏtG"۳}_Ƌ\}\w5|TUx0L C׸xgYt9O=rեWr1cyL^ bs]|nj;/]cd(qO?ğ3-pهՁM S㲫/e=x15_CAQ|&?WSh]{:&u˵`nݺwSo0tg]CAA̷y|蚆[3buMC;n o|mqwi:z'L9_yxmJX~=z<ݻg\5Z>oH4oo[iYWϺs=ŪUYl%W^wNEL;W{kFsh ˦eA{^QXTHYY9Vb\qe8 px N<׍Koe;r.\fjk>r89yhfI$]eՏ:eݺ\5>;op إ#*2_d] Tʴ_nУgwVXYsڸf[ !3'3}tfΜi+%%%<̙3 Ta[!R6H2TH-~z>-]ĴזAWm%_~3=鞰-^^rȁ!L{j"h6$;FŰk:x?ZͲe˹zi߾>L~];ac>r7ml2FAu`OYBLu+^RE_`#9zd2e)̲-|L(";;>ɱC!{R=f5=$Y[Y J`\RDZڂ\_g{<0Bڹ?Xh8:v@m)m۵a"[X"^ؾ:רs0k Ώ+V+o$wHc&焩`˦Mi'n4ݻb]{mYfX%Qs@$f8fޓ qft]W'hN]nOl~B**"(. y7??o6\q]aX?v~};Xr7\[ 8sصs=,Zq:TdQTՖv ,)(&~7ƥЛL6l~a;7 ^{-ͭn23krYZLP%f'd&>qz͔l+3d`|bmC}5yX`0Hmly -nvyvX<"M,/ɕ\q'''Zk:Ol4CaڟNpe >\-[:|(E|B/_ΰCk/))]06mS >py,` D"TTTogel氧D4ocj?ʦ؈HBےaxxj,E B/(2I-dY ж][nMхZi攗$^e+>u[%˘| ڡcf]_`Vax7ZDI:|(.%J8/brN;f6mصsgF;mEOiawfK)C}aŜ|,ZN: |deexb{rȢEӧeSN"iiZl LEeqMc5,^^²TVTPPGVN/d,ӻo/r95aSҍ/ UUWmՏ~/cӦD"/Z'?w^V]*CtIUWf2 k6h^q>Nkz3i|ʫk}TUUa&kVa%o,z!t8 _ׯEVv6o6~|d:[6n2HCԧn0F7ru3f+V`̙֭33gdu]ڵ } {I$-el" KSi:OH1irrmzݷN{wq~2~8.'i2d.f>6oL gA9jt 7ln^./01*+Cr ՙڼ7 1syvN fpσwi qp9sNYP4v- ;gΝع#SN;NxqmϏ2} b;udE31ro9|?G&/要pOpqGeL9D^~}9de0?->#Ml BL8hN>$tf0xӓE-J 7zֲ}D#Q;?ݝ|b nܬ:5m޼gy cu]GQQQFzEQϯTTaJ#aKmܬrA,Yo` xtI°#hO&9%tѵ{s8=6ro)nV>dqG]k\$f x.ɇqS^˖m6lRB~9j3x$Am;վ_U4̦ձyEWT+( Ǭ\~)??෿g|P }\ ޥW=ObVp<ܗžwIKsϜ;q6uLBr}EKбyy|7|7̺}^ИEtͨs+eı8E&YH=v,}9>];w1@и7yUQ5Lt _Dql޴y-WUz;H R(?^$ڗžwIKpkx~pFAa>z z5Ex1uiqѸݮł|o{ [Cv&9~$>#A?;w)2+Jbg'SԳu9ʛ4jrx{M.ObKMaO;q4g" ̈́2ݩf#zI0Eh{%ˁ̂#'b j}0 r 2fY#mz|?wzMV>.KYEY U[gR־Ot:F-3*ObKMaO;idkX$5t: h[؞RB^\k@"iGAr etꔢ Ǫk\Sr2m*L '@s.҅vUP8Ķ[Էv<({ Rێh<ZMg`!Y6[u,+b`!+jj˓X8N|UTHZ"M3gQQYA {o"?:ՠ2"w8N ~-;7n}]%ӽCFt4 4C7m6ŴoSs=/$EQP~ؗwsMS۷i a?q=SV@a.Sr#hKObKMA;@f tH$D"8T/H$D"i6"(H$D"9Q渆%D"H$6 װT%D"HZJ$D"J_E0r[~$^`~6ZLg_~J^D/y/%D8*iH8Rw'7;@W;ݥ穖6=OY.n^MQ^ȅm9{)H$@u4s=EYE)w%'komH<@P@uZ۶nz*++ӧ;wf d! 'Kv]ؼ}#5kۏ?0guN3K B`l}CSD"pl8ޣ*ZEv0C*iH<EbHh4F4իWcڜB ia=dӆE#kG}X<5k/5f%;u~wg/[Q/=#Kl۽OCdIk bqa`MӴe)T9qh%nDjدA4nB IDATMMJjI`)xx4CARtr*pܨjǤD| ̴/3`ҥ_Q-;E?E9zXC}d%,6`vCZhmi[kUm!!$d [VLT0ksBy/%)LE*( @DYhp8p\փQ)..o߾(FpE N[{eSdldZp#Ge>`>nsgoy Nǧ 8FY: Ϸ6VomiTE5B'eaAeI ^ek)EPM 1Fy/%հ)t Bʲ?P(a䐝ԩS8q"y8 VODq:9 (qUQ_ۺn&O9OVHŗQN1s09^<*k+ t4O#"L/P@E& )EPe{PذDzؿAa4%J>Sn7999oߞI&_#on1ΒϨ,߄/Cbv%/lPz&O?'nŽa#+~Ǫޡw)n:P0B1nS1 շަ{ibQзm v:q:8kP%b*֗佔H$VH*[n#'E3v">8^yWcOib `&ݺY0q|L:1c0`Pox  )Y@;˙Ep'g;/ƴP_n6ysulϝ^ɛ{ϋ/?cZ )({aț_mK0_-~?;h`QJֳp׸..7.ۃpv۵/ n:D"H$-K)ǝ+3ž9z<ٷٕ1M#1 Uzg;:K/y֮_iVwb0v^&;@Qb=.{ pϷǶ>F܋{=xՍ7rj!{ytc{b|u-Z$q~o=ӰaAHy]H9#g\'I1浯>7ST2,D,Y _B7yȻw/wϨ't4 |_^>FsK3m}|<籼s]\/G?hąEV-w3q lg\LS  pbx]ȉq́`<'JMwx\Yg+҅_h.ǒM+ؿ?˗/k8o5>Dzb * ~QbjG9:jy!VY]߻s7m׿-wY# ++_}l<{#?7ӽ]X[$/x N~tߏپ}w~]ocY[9sm>1ϫU_p>_p~~6I2CCY99?o'{xtˮ]W} 77rםw?xg~֣X!Ř(L0Qf_ &D,g h-EH98E9'""2BåLGfO/>-R(}D}166Y H$kȏlghF?s 7^Ͼ'366ξ#=0wk_:?O#Q'\y/֛LPAvήg( 55I^Yf%~?Y~B@Cço[w/{%\}cs=|>=}3<3^[^ǃ5|~7/|;{|{d2|/dO:^|m73cG=< f. 9{pEwxK9q9?0>b}ż\-?,CskxbΧw2::?xHԶ90;Bx2>ugR__ǕW]I޽ryʫ&EO,[Y];ػg' ;xhAA$M}oy[d\R_k1u\<_rxjկ-+WwvZW55).}ں9O{[}:^IƦI70Z [wSW_ r44000@3}H9~BosνλO'ؿo? 7d Cf^۩#jjfY{bs9< gwMf wl۾bHcc~o3+H)W ,떟_SO#HNn$d2>G>_|xm 0uxԤ}>v=KO/;n̴ahZk׮3:|+sXuL]Y'""Vg:g8{1I44)LsqAz4TLH8/ 1?.?yK{ czwnH싞U/jsfcC31g|<ĘGv4NqOPoǩ#O\+H9Ʃ3ļϓwo_Ekk+r7cnW`sN?tnn,[ʆ7s&ZڱW\J4/:plK+_ s/y?M{L%K65MMGmpx6H_]sۜa F5ȢƼX J5TcXp܁kh ؓ[yK^Ǿy O<$a^5f/yuf* `2c 1>7ʘxoO3ḮK%}ee]P G9jk=k0/5Tg}{׵=f.׵],- +r]TdTҽ]<]|YxL=ݑq.to}""2_^ O=q_۟/RDD˂ [ZȌS_kOeZto}""2_T ~ug,_E}:meGyg]8]f>tq],R'L}]RDdIYP`g{6nfǮmy%Φl?/ҶCߥ̗5_+~SYT,Q EDDD(""""KA%J@PDDDdR ("""29o# EDDd[o7##}ίrUr9\[V t j-o:oADDD00w^on[vڵkog~9j+\?#_ mSAY4;ڹ乗p+_ 7|%u>SzSSSC^Y>uͳk^Z/vArp%W/^~׽z6mkw~t/~{}z>9S[R>7ɐڷc|ކYQ (""" a/ xe6N}_yz.wM'R:,$7<l{r;>|ZoK.S{buY\uU<_kᦷD[RcW?9 zR/jlz]S~@<璋t&6 >;N:w:wϯ%LBk^T6 6l8-lI##~ubzjj AY^v [oahp\yE~=sWcOԧƷF,vdGw#o6n:휺T{#ell k-;ql8m׷}ϼ},J7x=ON[-\ |bd$Cn7 c '/>UDy{}X/h>>ڼ1we3ߠy5FPDD8Kt}_QװR@PDDDdR ("""D)Y"NdɌ3 j54&@0;e>֯补\Pp gp _XT>ξtPW`PDDDd" t3:sXkq>ֺ` pq\`s16~؆9ͬ\Pf0""""hE1݈u0Wsp811q`s 9pd+;s474HE$lЍL+`ͅA846 IafK]ͥ6JA8'{}DIbM ,T Ās$`xl, &,`\-/Zu. ۔O!H#,EtA*5i&FasA!LolE&  rϘx$;\Mupu+g++"S>yĽf;a"09L LP*^ F߰bz :08Au H~Lvvt+ݫIb1S$c\U61%`P@y +!SVCkA""""}wݬYU+VHhm\x.˄#Y7^yt`u7JP?UM]N;ظ0>*Z~.8{3dDҼSakxr`6iqJ'zN~!S2 ?'?8 VD}1'&8seEDDD(c\-#8wNA9$lijeddt!atlҖb<ݫ{Kf4N%ݖG(>ȢIFM7c6z쎢v6mLg{W툈,6]+XEDDD8E5,"""" _dD0&YCCHYl" Ycׁ1 A`?T&v+kp.X[np;vA]Aيkx(3Ⱥn8p.YX6XSGϕ 9V>kt3k;3⣈,ZehL7Jc*bJØXyRhc `&v% Vv:hnhb{Q|E+•ElЍL+`ͅA846 IafK]ͥ6DְT Ās$`xl,Y(/Igтօa܅VbI ً.#hY%4Tz"3!36NP9{tm -M4R[‹`!T>2""""sY > h(0>{≧80882 g6 ][C]Meٳ]yr07|U]~ӿ8D!Ïd㽘XZZuAbgغsgU/oe`!8Au M$낮aむ-#OfG9oo1&F, D&ZɌgodegd"H0Z ً(#c7pQN!H;0L* Xڌ[+lȢQFptc04}1\%aL<)1&XETMH9Kt'(""""V+ؠיrW18K% Dgq&\bΆs0)l`ԆVQ^,UR5fr40HW :lئ^tA |{ >&̤r1iiNL$1XlE& g\a 1Ap3{y˞ÅNd* = EDDD&®a?5Bt=W_~)-u!b&VϋURP>|FGGPap`Ц^DA_#(iAg>7BP(R,(t3JDDDDdv",dJT?c ~qrIt"֯z>u X &wOW ,~8qr EDDD"b{ z\`%3UٿEΟ܆EDDDD$bAZ,78`P!T W_W"""""ssBib&LU F*σk9hC\D5} 8 EְT Āsni,P^b]6R t\CYw ኖJrf*v'MΓ26Vos[7ةQ~]A'#tv(u:i=!mE o1A>`( W]RzT)S. ~V^W ("""}b)!y Y]~ӿ8)%!*KUen t;K勱AEEDDd>9LoWNj-BZp_)h@ΘxR@uTpJ`hM8B0hSDDDd6"QFҍsW>Lz+_x2ҼXd S@i_z& 9'ExҼ8]ÎcKVf^]""""sa̔88zzo:y破\d *#(""")8H=kxEl6I8Ǡ)"""2̴S-e]fk$"""'AsŢ]հ* N͠agڄp-\#EfNe aWn MX b|2Ƅ3QcNLp0ȼD27規qE;Q9eEDDd^456ѿ]@X0C(V>An~E4222L:0:6JKS iKDDD֖Vv,1tz 3ECxEYޱ$IFM7c6z쎢v6mLg{W툈ұnzڹ/VwٱdxD_=C,k]/֯ y]iRFtP3 ]tǚ!vZ""""I 8d]W7Mf JKXg1ƔιrXZpٽ4Y۹{Iw7wrtehL7Jc}z^xӛ p8hnhb{z}cЃj,bn\g\ҷ/XFAoY_8%W|&r>yD1x<8V󲆻֖3he9nak0:5 (qex'x`}\<acO!Y ;6lSDDDDf/g@SLPr9)|Ptg-: ,#4kV*AA9,}L,<@ S::Y QU]~/Aey:,֮][|ߧ\. 87>uiN9T8Au M$낮aL9{nv9lj>p&(zXWkA""""2{e~yͻn:֭[y:D*bڵ$I"l}?29.hLaU*EDDD",!ˑr9FGGiiiSN駟fO͎JWWW&WtX,l?ME ^ Bk-xǫ_j?ƲEc Yf aZ*pï@PDDDdn"+9~s%oFs<3LLLL&c5,"""r|">20OXX,cClV onn_m4SװE7}Xu=L`5$U,""""27c?8Lשtv-r!(#("""2GM79#X:hh;J)#("""2G-M N7ӎzSRRmtlcRݫ{Kf4N%ݖG(>ȢIFM7c6z쎢v6mLg{W툈,6]+XEDDD8E5,"""" _dD0&YCCHYl" Ycׁ1 A`?T&v+kp.X[np;vA]Aيkx(3Ⱥn8p.YX s\`s1achJ7s=C(>ȢQFptc04}9 Fib;xl6FIB{G;d28Ёs +X Ml}"""""hE q)wc??ζ~?"G (u[+/^˳/<0Kmhenak =|^VN9 mE:/ko]睃a1)""""]F,\%4/o__ƙ=u\}A#筳tƉ92]7l'j>o˞M<),qkxI|'GY > h(>%9/A[S CLk#y$16I=k=xIC?lAYzW-®a? __S~9~9_ʵ'H ('H 53I /(j|j-.Km覮3`qHAg-]GyZ.e"NX$D\HhytĤSW$&~3Oy}6D2!)""""<9|[-0$VOIapD,d"IS8u5 9Xe}N_oࡃm܎u(JDDDDEX,R߷H/[F[}Kguq1612Eu1=ԥZ5kV𺗴RCzr)TqiKbdƊ^׼7M~XZb1Jsʲcoh-KpFM-3ρC"""""s"0f଻g57ࡇևw :x5yKW856܄Ŏ0QtǸ",IFG__x1^ZږSS[K1MMM c4?E4222L:0qxe,koYaѱQZZ孊,Yt`/L8Lt[f4Cݫ{(""""V$.6m̎]ݳ;&Zٴq3]#"""DtucETIװ,|eY2L'jd &j"mGDDDd$̎g?+zj^,U?PڅLw`mCA{Ku EDDDf+ 뺺iJ7ù`?gc [sc}΅D޾m) e(""""VD1Ӎ90&V:8S5!,AV9GsC{⣈,ZdE,֖?|}.<>W9ᵬ ]݆^tk [K@ 0 +<_pذM./W G׵BJ#(#("""2G &*9׽:|R(ݷS$I/?@iR Akp0zjjꂬ^yLamm-9hm[/ o5#apia9$tb]5l\%hXe&-@t +[+YkA""""2{e]؅ H>`ӏ `}[.')Zt: @/b\$ӏ S +]Ҧ^""P!÷J`f 3<_9s-NۦBp7t̢+)gh\.O2t۝ EDDdX`Id"v@0E|0܂ƀ aXĆ Ջ@|XDDDDdn",>0,a}PE+ ]1,:uU,""""27'k8?krFpʬ_ Nݦ^]Ó8xO}L&36^_DDDDf,17G7%J IDATf_>Շ)"""""a`V=/4UϷU"3uׂ9KYFeEDDD&sFp=@pӻYfϭoVJHLQ.Pڷ>6}G322}SsĹRհD!f ͮ'PS[Cr x'ww0q;_]"""T">!::~~k-c|+:XcOY;>rzذ|weGXArYxb |`u]0frpݺ<|@P/)>9sc0{qxD";U Q,$yd(#("""2GMg&>S[( y<|D\.G!_ZG_ky|Q ("""KΏ~tQګ:#wϟ/ EDDD(""""KA%J@PDDDdR ("""2׼տφAYr^]sL\)ks=xۏAYr.ܼoi-f9---~_]s6P,oܕBn9&CY߿g|`p/O<$Ͻ.sUz/s=}7Y-~&o6mt3Z Rlq N@@+ ODd PѫW ( (*(P` HyƎ$Mڤ|?=9o/缎{[R!s'DDDDnX_>gpjꌺ<Gpfj#DDDDAC1y(A"""" HDDD< b$"""P DDDDAC1y(A"""" HDDD< b$"""P DDDDACjTI$U U("""N y(A"""" HDDD< b$"""P DDDDAC1y(A"""" HDDD5 R|V|Z.f]>&2F?s5D5dx H$Hl,E@EK $jkׯ_k""+j=>uyu4l6-&-S_| d4aO'FRlfZW=J%LF~=|:op@R>=v} EEl߽`2`0`2|"ڟ*:rLW+ X^au?r|"`uU,vamΦ"I] RerR%;&b%iоC;4o\8س11xD4qQ/Raֿ^Ƣw˯΂ J_}k>Ze9_o\^MfrrsE8SD*@o4ج#)t_@k>X}&4==B饬w[ x!}롦HYw?ܙsky]/E/'JoC68YD4nĊx湩xlxYdx-32=qP(պ^рE.X:U\DTdNVqF[d=^2/L& 3>QndoSѱMX:b[xvj3 q0[j}ۻ˃Va]by/o<=m2P*1y$L: " VX)aJzP(QTt999 HafQa`6!",z;~؉ۅ!JPTT^o aվ^ٌ/NiL5Q :i`4,t]G 9$/[Xk:VZH^ڻ˃`hh~?8tS3 ǂEmU(aҕz(l)P%h٪e}  887@n5;˝ HмE3dB&a>w g~G&0߇;pM J\25D [t:4kҼXZ1xu]O6ـu@jJ~9`=۲ zVX4lk׮m;jHys..x5č7p3H꓄‚"8׻ 3fepq|'v^2%C OѨEzz:A"71(],7NRu@ V]փz /]\@8h*msӰr*1oAxdH꓄ * uK@ue$"9~;ѐ ]qh4q>!aS@Q1-vvS2^ljoU\p6 _ϫvMLeMq/e}kLiNŴg+~X2Ǟu=v z=%"'q)4 B5dB\̺a >ΌTՔZ$"rDqu\ȸ'7u>\&ֹ;5Aa C[oxSb$"""P DDDDV3^w yGF,EnIEX{yR| HDDDK7om<6w( 0y88i[?o?jOO}_wcݧ>ugzu W( s*鋳ʷ;F5nII15NDDwww͝!:wU}}0u)$yN y-)$"""T DDDDAC1y(A"""" HDa6 4qɄv[DD [[.8&\~ HD0Qf66ˣ93ӳcٝ/w|DD YRHcQrYYwZ~W DTwZ `fF&ڹ sDD պaet￟AaAa(d:95 r~!:nq3&n\AбS":u&M@4H%*xڤxq 6ضahhB"jKJ2Gt˗^}CPcq}ʔ~ǏGǎ޽@*ZFJ􉢈@4nܸhZddd`ղ5(((@bDt ۴.~;ZKތb=2A"QS?Y/&MmB|ӧ`G-ݏm@=гGO  (G̕+-ѪU+h4c [7 Q+?0uq g5*~DDSDT+c^ ujd:4o}Tڶ@W>?kK׵(޸Z*"''}D6 B^xaڋ󏜹d":eKJ2 ϱ_ܗ Ͽ%+{aP*0FJX }akA q%|//2Atᆵ Q}%%dggcVൗm9x2=1[7^?c1V;onƄ `2,#`goHוBR7xj@ȇFcѶ][}#"k&c꥘de^z~&ڶi={BՖ.l>[#"z= OcG}+2q~m잛.a$P>6ZLtU  O?WeGy<[,apۖنP*A"rUZw.ĀNg793hsV6\d2#GDS8|4 .w޲"A\d2a؟rnnAvG˿wd Q2m\XX & +`ܣcٷg͕DDA\g]Xr BfFf:>N")) Zҩ_{Ӽpdpe HJ6LjxkF[&̖H~:Ǟz$a!F~[鍞I=Ѱq#,Y.\@. HpϛXz?tpeE;q=M;d2A&]v"S"Atrl=$xh8O'!"miYg9"HD߶ ZX˳/Y{キ&рGms~k4jc﮽u8y$F>8qqdbĵitj;@Dwr(**PJY{G Ū.EբwRo̟?zD~~>+ADTZfsu0aB* %Î.h4 -ǰd2A}q"TgϜ.[%F5U˪e1:GL(J*O;miaW.QTTΝ;c-0VykW}yѫ[RqUK箝`2c\ n@FPp[Q.q3ݣ*2 _\Tiꋯ`ER^xu-Dwٵ݅zt-t]ZYN Q%IBR$b]XRh:,]>nݺeHIu F ТE |7x6^ 苵BuDT,{F-'/yhYi݋٤l/ ,eT~* {`=0 /]Dѣ[2"eΪΨs#XTtH&M#W"/"}fGF,Wz+1[D4)AǏǰ!,+K8B*Õpf{Nv p$v œ/'Oc̙5v:gOa/Wuۻ MT$&&BEˈ`UWWu$V-h|Z500P@Q>Qݵ`P$O9}-O{!@ũw&"9h߾e p~puY;OUC)%#[4VWGg;wnwGJoݎ(DFE"*:QQP-uz I={Cєikoؑ@[Ďl+c뽣 GZ;Tkmy]^n232,dfdb҅vJDTJ=1(7|H$x ҵ3r9$ia:3VKvz=7e/L&oݎOBtLp?;1QHRh-Z(s<7'n 4$LYe~:`đվ Hj5a2*^Zf.q={-[etktMgnymr>G@`5nlؼG*b{V^uB`ɂ\f5c$:E?v &ϙ$:V-TfaUk_#mf3$ d2tZf3Q (J!Gcv.RVTTWg:DR>X"ј:iz=쏾=|a'3tDߞsY%oAC) &y .^r%Z9V+FGke!y6Lhаrs 6]+ּynk*5}kױcN$K\|[w~/و?',[ DŢxb}~>vųSfp+;*ꨘ3t&ڛ  F^nˮ³SlK$[-ôЫ[_`]BKܾXdֿ^Ƭ ة#f:Rݷ _?&O+zwuoA‘_~-.KӍ7a,&<>WŋUH䑆 flMJbX~)5j2no3iPXXA~s}nde23Wґ5nǏg\kjdD m1)xӷ7>JT*\r!!W6hؠSB:뵿b~ 1쁡87^Y|4hРhg-`"V6"X c ?Z.";҂cܩvw@*.(룅%:$R{dø} ?2l0/|~:V-_a h4ڵkm ApعGK#F>DTB˔O`P -!:Ves?f4X("A-8b9p`{u yU:M@7 cf //۸߽d?P*1y$߃0{/>/BYm~^wa+/ᕙKPе[W gPM^6G _OTu@gCTUF+ .ڑh4 THDu"Cdg߂N(Xx%&Lldd+ ;vZ|m \ g8{嵭i&3&۝+SF5ْGQ՘L&KCfz2 xyyaе{WHRˆ%Z Hs#ϑD"A^^"F@*̙juBTOL$ZjY#"r-A"];vᇭ;ȨH1P|$A^\nY9\z$(+>!PE"557T"ŀA1t"##8woہw㚋#"A" {,H$)ϟGll,z}M*BjeUXK{GJ%:S GTh U$""UDY:w넟6͖ջL&S%>L&m*[%lXΆ@B"HRA*d?ȓc{#D6M6Aaa! d2 , elF֎9ʗ ==m dF8ydR#lTm¿RD";%ҥKrxϿ-hcG Ç#}[fW\1Dw.`޼y sD>FDvW L^nv܍];wCEl!u?Bdd$ 8J* G\="huiaF EȦdXb(r}l0MDl6;mcSd;5͸x9 Xw U`]H~⅗CtL4U\+|Ά**Qs4$:;w S2(}Xv.Owcih<C~3'խnX DT-/VŃ?W(d;a ,\ӧۖ2Wr9J%ȲmUwDiiixC.C.5A1xr8zv܅Ť."Oq'AeS*QM0H`Vhpύ7rrr,ږ@|2l0 9 9^ }M:8t]D̙'cP1r{t fsf<.q?z=-[(A`0@RaԨQG^^^̈J͛7qmSԋDa"rߎ?AAA7 uz5("88yyyXr%J%6mF!<<QQQPTXjn߾]晿V ZET*|zP(Ǩ`ǶNODDATiL4ΝAcصkt:T*v) A~z@T?C,O*ALL 6lBaƦY{ouxx8߇mZ!Y4^~ ?,~;^""zld!rsr޻ˡ_0gp,S Wxyl4N믿 P*WSr>T L $&&p_!==/ᑑC oe ֽ+Zn+)rܩk#"r$"ٟr&OGϤۈ*S.JW^˗/ZLΌ\k׮K D///\~r~؆ O,+,Cњ]%  :Lfcc_ 88J BL&rH$2az=4 d2C ar,Y/'ٺmqr”O;umDD5A\]*3{ƫF~IvWW|9c4 Q-rgU[Б{uak3bWA"(Lxl$ J%zc EZ`6¨ VkUát3g=6aPz{ އȇF#/4DDu ݉c'´ᆵm CwBF@բCuXFK+y-$$$ȩ)pdff> A|`&>k?^)!DE""c$".y3>#)+ ]{t/wEaa!,Bs $$$ &&W\//]-Z >>g:۔Cƍ7e/N<^~JeXB§_g6ıUj ͎m;pU5Muo݁ |&xoBKAʾjCYYY6lbccqܼy(,,Dvv6._֭[Cfff0  $x P(qFSX%7]$")/mHM[0c J)999`All,r9t:i_Q: <<EEEJhڴ)wm"##L ~-Nv .ݻ@]<hhaa6+Y_QK: ɇ+Ik/Dar0e4|2 ztz:=6'oLj# DF2QBjj-.___ܾ})Rpy 6mA᥀ s,Fhx5T~֟BDTlIIf$a/L<~h.~9t HHH@xx8DQDQQZ-L&L&e QG___KKOOǑ#G Jбs":wBS'OCU~E[!>a$Z1ㅙxP1`2pD*9өѬy3$vHDHHT*eSPh0P(,h4B!///^C!J&> ۢidS2err( zx 63 WRO ;oWFDr DToہFmV/|qq0𞁖c& oh4A"F#Χljc'@&!ABCbY>h4(d2ahתxg}o(=wu9s  HRĶB!Džh M evF}H$dtJTSa#c_߁jP*Px?X,b+|v\ =sDDAԓ0iVv}pپ5p(J-O)࿦CBBPXPX\}XOCSU2"A)ӟĎÿAP|+efd"*:ʩωBFFf55#*)JLSCDT0QfmZDFz&c:_Tt2A7v\1A"f3ѫO/YYt`~d//A"R)&>L GD"3=f:Q} <Жdy*A"""" HDDD< b$"""P DDDDAC1y(A""""%1BDDDDEA` Հ9`KJrq,9@DDDDy(A"""" HDDD< b$"""ÙfXJ]""""Cz8}T@B|Ȅ d6 ? E@A$"$ hRALV6A""";LAa>ΧX>AA""";̍?!R&шsǙsa20&80rި A@P `K 5;@dZҲ DDDDw~E~AZ4kTϞBHp([ǁ@"Gސ6G A*\\L&K H ^ސH$epD*fl0:{?RR]:e6 @([t)< v?MjDDDDTlIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/editor_2.png0000664000175000017500000020064413203343610022423 0ustar jomajomaPNG  IHDRAҌsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw3}(  61^{ QhDĮ&vŮQ4H?mS;{W9~ }}gy(da1"[D"H$dOPe$΍ '%=ƢD* G5[t*E6;o5Jք:G'qϬB٪6r׈PZN PfiY7-NS o[ymd~jn_kBN!CD D+M|-P6[Fehy5Z _V]l~ ZCۨ?&mذ TƎ+H$D")/pAl%0??oJ"H$DKOP\ɀ֚%D"H${'ʸcD^^D"H$nE(X%,,S 2((Jr\LJ'E&H@Nc(ڲV TTP"H$"@iYXXP *vk:A&' n6CAeNt0MLS8 )4 ۍb0$mIyE5iR\UJӗH$D4hZzxl۶7zj<.+͢$ k_4└ЧOo +Wnݺr1 h,ƴ>%ZHi~B~6DX]Q͗ ^\n72eP7v PI4#( ~׋˥2,jj#`ȇKKaYeYh&7_]. 0),8/]7((,Ӑ̎.kI>2B9A&%᷷jTT&E9G"H$ :n Baa>iae.4METo?DuIӡ&Fu0kiL?g}`O4gNnv["ʙۥrePTKU(nZa Dq>ωhF~ގY%D"9 2z/U4,̤%/=,?/_~*=>}AQ8јǟ|ږrr"58Y8f$imZ+.ʥ& ӎɇ osg:MaAkqMwD"H$e Kk|>pײgU=EA %]Kز ˃itܙP0!Q0iDt]w䔕)a0s"^a3+ ٿ(^^&( y1#t3Kwњnk8a Ǚ3A3=I\D2y-! :{i( xg1xtRY ПSN>W_{ 񸛌/*m۞izMWUn6Ç`BFA oԒږ.ⓦp8'!@Z>H)GΉㄝ0hjkü3=1ȓt=D"iaa]JD0M OZ񒤬yeY%%]ظa#niRRҙhԖ:iaG躞XfƢ[6n^09 5kzh/ "=ng1j#{Ʒ5lnr'ƢQ .7n0[Uؚz^mڼ!`BX 7σ>/:ѣ3fVZ=JMu@ iz{=n>SF a̗a„q|ѧx=cqFbGoV ʪZ;`G@puW2[N?|rssrD"H= e c@}CIҥ 7Q4+e 2"H$i$9 iݧ`ՆC?pbi>sWWrԃTaUv݂~,zW]Údnp$K]Z[uByE%EtؑʪrйsGWG!?/c9GN ᷷Enx4;jkk6d{2xֆ< ck mrHpbt=ٸ! m..*`AEE1)b8!xUm5H$H.pEϾh0Aq^O*z;r SLl[ ^oR-7 tG1*7Gуx8 cTmOULQYzBf,-Wnib /o^bE膁\V!5MeQ\TYf_u /Y˥{u73Iӽ+fba_)> |W^~C= 9 uvtĸOh>E9Ci>l۶UQٺu;%%2h~miZu$%D"i(]>"(BnaEQ0a3.0Ir`$  G4F16F$eaYr2#16ҲJf8ZBi!p⪫ky݄#qN>87#U4HTo46H]G90gL~lȜ4,>3fh;hʚֲ߾wpWr'~I+~iBY7x>D"H@UU+ "aʛ}(Juu5PQUʪ$wgH( 55U (ƏQhi[WTqy5>8}<{ /mfeM .~ شi#n_xGx,KЩSgb(UUU-.lu}1_k#X]˥ ?\EQq!,'~x\o49AUUXf-[=Xa#+VJ[lYz<.^TUCCq1ixu:>?kنcY"%vx[-:Hޏ2-蝓5G#l <>y5;FxD"a ͓q=j֭V@ $s׳OBw̭ѨX/64fORYe>n6iZBNȗ5Mˍ IozE$cZv7un1xV=n /uM:D"H+Biao_mS4UK(MDX5[M Ds:M}~g^Er˲HUQ ˖4{8]{Eİ8?n/Vژ@5L+\mrq"v\Lԩ3}y&V\AYYpmeEq 6;I"H$p]XXZULʕ+\.n0cYBzꉢbo&HOPXjN^ͭjLT)n۔CDU2G>P].W۴.@A,n`U,-$D"SncZ@u07nBSU>oDK%()wPϘ[˲y=(Ūb1zssፁܚXZQP5y[U.1Zn 0`vH$D"I*{0EcB!B9A|>"E4/nOjON,#//`(תQxښZ*+x=x\.%b]׉Dbvp?BoNjQm4|"jq=왡aڊ`sH$D"9Tn cV go/rp 띝3_^Ζc/(bͥqQ5Cln:²:jn.ihy4[?kX"H$熽zZrGJYK/m}d=fPe I5:2=Oj8)L"Zk"D"H$?W}n但V/(-H$D"ٻaD"H$v `Ϋ/zH$D"Hv!'= dD"H$#RH$D"iHEP"H$"AD"H$vT%D"H);]de;f۶mޤY"H$NQ/GI.;\a҄#iOaǟ8{w{a<ȃI$D"ʹZ8bdn)a.[1ӎٱZ:9hmVqD"H$%;xw(v|.:tYq^ƍA#;gcTAB98qO> %_n3=ӷg˝RWD"H$]Y[C<}O>ew,eSwY3 sf˰?`gl" 9ED"H$>msm}W_{]aΥ^ƚ:s6cGO> Grs8h 'O䴓Ngig໅;D"H$e1bΫ/zH$D"Hv!'=m[%D"H${&RH$D"ijHߞ;TSGD"H$M=]'H$D' ]D"H$J$D"S"(H$DND"H$I;E*D"H$J$D"S"(H$DND"H$I;E*D"H$J$D"S"(H$DND"H$I;E*D"H$Wk2aj*cm]v%7OUH$DNqiZˌ0[ѫks JEQlp( YI`J%C SQ' Sz&ۣ.UZŽR9:a`%p{!* . r~ɮF7t {o_j IvR]Z2UTm'\,˲;A+4)Ȳf(M &DRS2!yR -_AXvdp<JeYiJfB{s&ɺDzR~eT\ER rCR-T!MqOAQ7g (DbUncuWm5l#&7rq{q!\$Cak*ƣ;TGGN(IϽXX 7Ϗk7X iJ5#zL:+b 51wڅulӯt@DjشeA_ǃnYӅ#l)/WIos Sݱg4^R/VYa% :ey)Ək~``=/$FZZe+ZBŭ ֯6&PּTI,eHСŤܬJXMXzXVdxbg"R="X bCٱT&ϣ CͶ/Nk.iG}͢:V%ߙ׍•6oX)M kHnIQ,r[dS,aP!cZAqYklm``߫7]><:S^?]z*LXӓ/E4ԵNp$[BAn{~˺{y4شmz:fg;ea VPVT%#mK1g<\ƊHWH2.ԌzM} &y2C?m(.4iVAѨ"hx Ti1 ]GJoRMpCc3M¥8G+53M([œ-]JA#Ewo+ٕƤ?#,"%^Œ:%]uT~5c *J:t;QUC [*T!') &Sm+iOW҆G$d[!7򟖵$6Rdg;lp&X² @8}*ͪGo٬9 mSSq :VTZKUKi =>1n=DB9t mb%5H۪[4QCj(qvJXE׵d:L =Ա$DZ"׭HKڜ,{M6ҹsLS5 l6*ݨfryȣ!LR* Zf>`_S3&v{D"D!1?eO^l/˓SRKYN"ik"p  L":N@%ysT4ɷhHM8ޤӑ(W$-xi6&$ַ,Od'O10iLz 2α~Mf2SI{9V4k^]y=)7r)1~(;}iqey?IO_S[%_`(k a_P=e[&z=UU< yL'`0HN &Hea::n>5C߾K4~ilڴI?,0Mn6k5W^ˠA937ƞڗZwI[4Oe6xa[?hLoqJocTcZ&%4vӴ lYanf"gyŗ8bFٳaƍÁ$Vk2-D f9PlZcXOE:3I8 t+UK/q-ݎ G)lbFMSNy Kt*+un+#>Fĵ,.^_xשh[#^x7&o^z){&0x`Ν5e](|'Mwf*eBD_xb)..^cդ{βRH7v[[:0ꊫٽ=[O?L=wC7XtnƝl5b1k<݌c&?|8ns9IY~;;v$77 .]OM¨aƌAJJJx衇ڤD$&pesqdc&ae6%h t@)e'dn`Acӏ?C7t,d=-9"nPIQҤk8(ۦ05cRðybh tx*lU 904LTMm[w߰ʃ:.:3GgСCrС/<73<Ĕlk2q5 \u,gGf,\}:>s]kNUeBg<3fQH_S25iY.sS1QvҞp-]w.. \tٚT E/_~ [mZ^WeaߒXalayI}Nҫwq;~N;}./#XRR-œ9ssCRXXԩS;[կ~Yz5˗/gʔ) 0 &9~'5KmEвo#e N'aꤣ>pwv77ldY 8~y!UU+q/5}07p3i&~XNeќ{yxM}l'W^#e1<,zg _D޽{8\n7E}1u,FLnG1M~Gƍ99;LlU]8~2cmP붛}4NZ7up,eo@_pBL`9z} 0L/]ЩX<\́#bQ}٬i c:8<0MƔIS1-\q0@&==7 Ӷ+IG1rH<}&׬°<AgLw>'tS09|f~UꫬZ?U+WګRU]i膁n~'MYra+硇bԨQtؑs9޽{_g.xg &*%?aOI|Db tD3\Eۂl[/C ~xk&meKz LhUPy2Xx MqyILaVzKw^>-!ZU^EU\؇9eK۶mKc9taoy9{9\ͯ9rQ|/e9gy)_|?Y"6mڔa[r*ܳΧʉK:n"ȊWuV~0N;t6nCN8c=Z'ct֍n>S|tЁc2c '~GYN"ik4ծG#,{y2w=w^z^}?\yɕ\sU;cZ:sgϰd|_rEsؤ |:gyUm|ɧs=?`J #0??#w?~5p-;݁-LK+/b'o3=?爩,.Ek9/;o|s׽?a]gވl>Lhyop7gsoeeeZA9a< hjbxE0~N?VRxfV. L]/Ӯچ38an-}k 6/QLӰW~,CQZZ^]"}={pمӡctO4sys9Sϛp ru7f;j(Ld۶mDa|!6l\p&N`w_p9xWyOg̝2W]{%_~]usνŋ3tPСCYf 555OTWW׋_xqDh-Yk89X0ѩKgΈQ#w_<^/'K1-}z`(JAQ!b:_-et2+8cE0tƎ? a< L?T/"Sټk`dϳէt/<7^7tPc TUUד_R҅|/^W_~A[qψQ#kXd[8\=m\v, pI'xђ&@-SSSCnn=// 'u㫫YkYN"ikZŜtc&';}>/EwK8F۶{`wߣz}:/|>o6=iQXX-[uùalܰ]0MN;rQGp'׫Ă}Ʊ|ُfJ?=L$_]u؁@0swW^C3\FڄN;?/haaܥ3sCAa]u ^|<)(,`떭;LSG>LǕߡc^gs,:pIx-EB/(2I-$0IQ":uĦٰ~0S+-Ցٚ}꿬ay%JX5,~1ǜx4e$v޵U$CqqQFXCA^6QFśE2:g:ssXx 'ZٱcGoۖm6GS؝VЀXp!'p ,GB!~?999,\Й` h-"wVHښ6,b3#@HKO&5t M$_qM^^.zI S盯῟|0w1<,^2ݷaz:~KlܰX, yNv}]|-6TMqdA}0uV\ W^\VesES?9 :g rª(*. '/4xe^@dGٝ}JrJ.48愣ygXp1SYUŻo#Y]{aq oЖe1sL6oSO=eYDQGoYp!}}~{s=}z%v8[,EbBiprP#~"fvW_+|Zb)R[_mU1 /O;`ՊU|>&MتcW^̾bY+Wdw [%oQr>t֕#Kٖ- T#'77^{?ww 0 M7)Sv piDQguk3gGeҥlڴٳg3k,̘1o۷3|y'~a';-Yt p*Rߓc%߭Ę Ӳ8_rw[y?~I{ǽs-AC2Cq]1#䪋߳aG gas3P]]Cqb<N91v=Uk5l'sgr}cN#O>}/NYP2t-^ ?Fa3p@^xz r&3/?Y! p2Q-na9nG1m&X=3ɰø}=l\@0C{X,mg%ph$>˷(`4Gl`\ӆ x2f:s=\s5t!#(~dy3R%6opb:kֲvZ|>/={r)1SlMyI~a5E~Z͈9³бU_`gG٫']yIә}1bxz-_hIlvVHښ;g߆cN-XD])(,ϿϿ.j YR GN>}v&9$y o:km^$ŞڗZwI[ijk޽7֬n%)*.׷\KqǢ^ИHQ^1#JM-xx|8cx0;c$^{P9$G7}`(m9)%3B)  MwL iZ\$ŞڗZwI[f"SgLwy߈r PխJ`rqW2y\֗K,ݤ((co6¶s 1u2>?t|* XƚZsS{Dcf1Ty{j_j ;I$mM&$]R'qDaEПC.TTSمk(sYB$mHP D~qG\.wRTX-gkJnuUO2zrN ѳ{oY4ѹ3@hXaM X RFU^ٗZwI[i,"5q (^\Z>!H v=Rը(F^MyAU$w8h.oD㑴uӹC 5?vO;T 0^^ƥ{nRKYN"ik; _[@Uu%Kܦot.IeDpi._6zӪ]%!}FЧkf ŲLtSo4m%tXϽ|Iv **=/${ -Zvʟ~dݺ;fB]ddoG M}ϼKOd/bK-A;^@f tH$D"hD"H$TTAD"H$ލiq K$D"HnaJ$D"74J$D"KYE05DjK|9<;܏?k3yml۟ZJ$dG\*=iH8R˖2z!?@W;ݥ穓6=OEvVmXAev9*d|R"H$mrEEU9]zw6춬M$R @(`q=Ζ[Xf 0Lx,ѹ'vscm䨣rgrGB N˶=k)H$L4Mt]GmP.0TҐx)b1(hh4FuU5+V`֭tx"@ߖeLZSkص'hmyb+V>cqm3qm>^X}MXlmw=M$ 8Lu,G"L.cGuePAk)H$=J, 2I>ljG~Tj\.nP0DMu-nUMPB XcG0-#웇8nH[mw5MLr\^ =VbK`k"! bFW2ZJ$I;cS%X((JUP- hb @4n`4 JJJ8p YC*F 3ɶr%262o/v!qF}w6mwg3`{.ׯ jԔGYFB^z)7VomiFujL_*5&յZxAðЫJZ嵔H$vjҁ );oGjjj0M\UGYze֌+[8~*U<4Oi "U- ' P@EZ  IDAT)EPqK\;y-%g)vy1h J%l|G|Wx<ҥ SLSN!'njŗ_c+뚘i˱ <~4նޠcf6Yawoҿ8TΥ~̚BvvWԵb1.X\4KUR/VxMX^KD"i"i&&rI?Æ+s?[-²L, TEJuUEa_2m4Əϐ!CA1Qv.c j# #R qqhnWjeYX:>;Bcm^Oܽ ]}9*o/<)Gi+oZ"oݶmI,cp|k@o|WT?(0]n7nt,]>$=N;e gGs%n;4)?ibEs5ç;)/)s$::+׮ysA׮uíj%M7fтХ<9 ""̏lgx/}(w ƪ޶p4e|Db K2޳.;v{~Gd@ElSe_aX˻Nݭ;XoY&́]YDҁ՜&{"n5+2~t]G7^t]pn%%%hipĶt-A~Pb;eD7<񛼆ùz)))#p.G^cul>_4}{1o|wS>=X9_-YVqO܏χEL W\mV,9n'>/v1>0*N="0#IgXBiyn͵2@HHao{nѢ;1Gd 6 mE8q'::Cs(+ ˡ,|Z7cV|FDЧ_6nØ7ѱyvz3هٷo:]+O:^W:MҒHLtIVn:`vhxop:YnGߞj2k"==0]9l()vF^-qڱssͣ9YDFE2JF0؉>θߎ 9%s=-O~Ǝ}Oy4J"ORA94ݛAbʋq(߽=BqNix}ppT溪|v?WNdcUVأ~qˈJ4r0EF 1.4a4xծװpB?mY&;;vZ>Ӑsexmlyglz4# kTnD֐kMx[s MHHRXPh̘GxmSRSB\|mfq80yyyd4oQsa>p8*+.Ғ}O ;9"{5. IӍÅ"IsaaOBS㬬J]Q}R(f h3@Yy9Jؾc;~Xto)(347Nvs BɐsHttC.¼9=ˑ4G qcj[pA`綣(?{`ĭ眎IN270zo;v:8K~3'`R jYd9~? Vѵ[:߉|㽷}E;( R>ʠUZwVCDvp[ӟ|0Հ_˶),(q]Veٻg~UWko2nxxˉ$5Ib޽'YOugk #ϐRC+ {""\ "7'$6.OJ).C)/pMLL NJ&$0/OO,?=?=l6|\گ/>4|E.bCjxm(eDPV格Niq2 h(h:W\:r w^57~MRRO?4h{v{^ X>v8#3ki$7L ꚫصs7]s=111 8pjKs~=/K_=g 0kvl9pcCx̬uޞn,2ֱBƥaUC᱃UY6=sg)4@PT?ϣcp6pޞ9BQW^ W?>^N3|B!J )*. ::Ώ]]:?WC$C>K!uAe͆UeCnۡMuzb:=nCuK~ֱf{{\3?KBFA)tؓ{?31\ɉ)tؓ nyX{{R!D]iP !BcϨB!"B!D#%B!D#%B!D#%B!D#%B!D#%B!D#%B!qd|@P!gW_yF:fyaA!wf-79\9*:ۅ>=qw˭w jpKK̨KB!D58W_3g޽hٲ|iӶ ;}6nSsx}zQXPȊoc 'ݯcsJFP!g^ܗO?4dgkRwM9- MjZ*^7tk\n[וQ׏&+됵ȑ#{}ޗ}+Y-X̰˯k7xZw>ztW]6?` 'B!(#FgΧsQJfǟzjKgmߞ5x_@9][l6Đ+jmwn`U)! grz|s>}k> ^Otޕݻif&nRRwjIii)seFGXzf>wv@aa7,f&2*2oC4@P!g#s-wp+gֺ.;uAزy ϓ4h>_4؆։w=ÇaۙCQ &MB!8tޕ&I1+p\5n|r{{Q]yߠ3EqBQ?68/LB!+ B!) B!) B!U RT\@<\tO;*B!8ӄ%,-+p^%1> YPhh?̊_ NRS`t0L@0(VmI@ c(MӬb"PJY# Pa" >&9)iVZyaVh˃8qyONOut,0;؂kʺ궩}k:Ɖ6ۜNyOv_0X)U,-+!.&CC(a`c~@a: laoX 񔖕VIZ5{qv&Lsl}_<ƉB3YX2a`(BSՔih2*3@Up#0B20 } /kWd{CKPn}_/=;]<&HՌL6l.E}Yg ! t@:@pGEOW:P(C+3 W #p]Eux`b ] 7}4Mto#0 7=ad}~zӴ C;G:~jRߗ&"<` #a?W(W4ngT` Nc(U1?wH0дӷ|>nGIg6o9vW"mwA"/O1aq]Sq~ߧSt\L ~<ヒILyv;#Y2!D@Puto Vd̾fA;끇$*#dc} uCGu Y˖p0'i dOI6 Q0u84 +g:ebh{hrv]00/HֱXW#k*Eͧ3'+2 zF; xAcB D tw[L!iSmf)g^Pr:hPE7ϟV=@hۤ,7!~OQi1?lZž`5;6/g K C* T~ ,5M#!&_EVQW~B zJGIFbzt1;Z%:\AjKBR{\v}߇2_ P뵖J_sW,o ]) ==i0'Sc Q".k0oT76N3u{;$ęHuZIq8\$5iTjX)@ӯn~?M3+@@S*;2g0 7Z҅1ζo/#:j;ZVs-~':KHVQ@^f8^EsxcA!))}՛Vq{O=wv"1YTBQĪhF e,fX3!g6hǟWB~y4[ 8'<ފEYK.\ˊg"}= ·X}*2{kFZBz G7|Ožf@y7?/t'gKʼ%+.|>^GnH0t_MiБRt<x>RFIO;Zύ3䎹̺xZN|62iʄ 92*XȡY[*3oMr/2[auB-|"ACT<_*5M##,o2!" #]TͰ'lcҴqNå{9?ʗ|Im(<ɡ6g>i} ZҥQggwr R$2΄%7cxkZ6?͸ա1nTaj Ѭh&shg)I~^qe (7p {bsӶu]~{0@{k"y۸} k3ti*OѾ Plu.<^nv%pj!|oȠB_*0H4*'n=V`pwvb/R2O{'nU68;6ojޗ??{3U}=Ay}Dkq`Ѿ!o2_z;I[@&q/$w_q6Ŝ^SFPxnTk?s/M SRNs-7o_Ѫ=ex_~'[ezHɻyB4ͷ;J.+0)nZ4[ [e f;;B'lV-PT؀5*T3O]`gIٌɴ?͑wr$sM?wD9v@YeS)E maГHw;HU!/W2#X,.d%#phh݌T5(G]cn1=Yc5m 4'MG7PxbIkopXh9>ęKbF/OZl=Gj+lc NO)س^O~*jZ#{~Ə”T*Xs wA)U q*dQl6i}׀KGŲ+ףBuM*f-,ڂf˚A0[ ~oO IDAT^◣W5lY@jsk>R]ond>4jXq`;crVqE=Z!N#^bfJRٺv;hJB!NRuN3-~cs b)BK'h$W,+4g M2B!')|(?:]R+֣ .B),`b|PvWNJKIO:-gBB߀",5omPvEEd(*.Сi6"Bq KF0=%{svg ),ɉ)tؓG!L@ #)Mux!B3pB!T2P-)p; yB!4a KJ9Cmj^eVX)9!i.\U`MMjfyG}p')DEJ0(BQ[ai/ʣUFcPB)s?e(t]0 ?0meJ Txn)chޚp܊B!+LbA (g;gCU&@)4f iT@)3+XP)EBl<;o ǭ!B8a6*j4 4 MTFs Q(\`O) @62B! \ÆAp@4PJCS$``[[ g5%a43W'!dxn)B!j/|AC 5*z>?G+ ϏRa׈tMrb.ICHEB!8Ia u]jfh:Y9Gٺ y_DAQRDDrG$ڞEDGFb۬,@!aժUa=GZZ={նo%KrJ:Dvv64i҄4222۷/{^?@~~>g/`ƍviڴ)c 2sܹ͛7<** !8iX_eݬ߲$I*x}fqͦ En^>v+mw4!ae5D 4 7 YYYߟ[[cx7馛{-< /2%%%ns8HJJfĉ$&&+xyG v/--ѣlذ_| /_~ .ǜ9s&?~K.uvB! a>Fѕ1r붳pFh$md?;rK9RPJqظxZjEl|*k6e5;pO]49`0eʔ`fǎKii1<?[瞫1ѣGyGiٲ%ӦM3uDunf&NxLXUVѧO͛W6vb5sq !h”TVA9}H6m9\.xh 0P> #FBb"N6ڊB;IM#(6B^Qܙ}QCؿ?#Gd!#ڷue$m[l))hyy߲ϒ%x.D߷"~ay?S̚5zу٧׋gsP2cFA55kЮ]cz׮+@٬ 664w !e cHh?n#%98;_7@[C 66֭ڲc22qG ;%}ķ&8M*+&UM履~bZ˜_Lԩ 2ptB 7aP'=8uXhݻwoE|G^Gy'?q(%/obN%ꦛ82d;)..fҤIVu+VXWٷ/eB3fԺB#,MÆaxmٌ VCX@ .1"2QXX 9Ç6ljN' /L>61ol6#G>߾}1bDMѵjfv @۴=zPYYȻzo{V$} R bw:q AaQFѫWSn!gT̬x|:YG &Pf\'Q O ." O xv;S`KK ]%'-[jNv;g5E+} Ç"G;w.:twߵ56}m|kv_z*qK 3T0R뀆ij +4(++f9X1 (?k\Ye˰ZˊN'N< |f#C@#;?>f_߲-[(~Y﹇'D=l;- ANرcyII8{ƿcŋ̝;y1sLJ5J+믙H'삳_E`Xmf1ͰSԿ?,^n߼ҥf߼z'4{Z ^pd۶All,àoÿa$@xWࡇb'8\4AͼCeРAt 6۟w_ff&b_3ϘṈSb q.]zL1PU 2w\~?B!+MÕn6d>LjjyE(8 20ԂF1q8""PJC:|r.\X6w}w5m4]״iSZz)+贷hAZ(W]e .M|X3fXCx/&;H|mXqӦQ6{6+W2|ZCT@FF\.<zV뵶8r i}1l虙On-lj5V̈́ kOYY}˖-c޽]B4L16:K㣅?CBl S5lvmLCJr3"#݀ 9dӾ}ׯX{Ǚ0aB`GAs%3fXNO>Cp8߿?g̙L4 Y3.Ӊ.A_@HW\s8"" h`ԩ؈;=~<E3 Ν;s-ڼy3CeϞ= 5 g޸ެ9MI C+|kPPPOB_g f9\JJ<:yZhCl|<o(4M6T 7(۷nҢi ))"4sqٳgUEEE9jNy=9[c.Z0ZhҤ8r{ֲAonUۚ7&}""}=oe-1c)}v[9൦5n=Yw9pX/{qJBqi3[g:AIMi"cv ai~rssټy7s-i,$pD <P/箁nu9dZn̈́ ju̧z ̏?Xkm׮u\ (Gn5/[)Sp[8*O+p]v(EAp1Æ c`eee\VhɢE$ZHoۆo:0 oo֬Y_ !hXW5l(Tm6-blEWCWvA~ _)[Hj|͚6f̌ ʜrXozR]z>vZg222,_NT6JM5d w}G׮]kuXzʕ+QL 7y͔2`b]n'>,c鈈yZ]Suq+"#il.]+(~)<f3TP!!+A*]ӈvHM!+ٹRZEh"1!D#2*~*bin|+#dS^zI/Aøq 6ƌʕ+(|A\!Chn7 K{OPP[!ۉ8RRBܱbZ >@ |7nӦM#;;}^ Dҧx_cKK317wȿc裀9NEuLL ͛7}֘U5k֌￟;wPS:K/Dqq1.] *6)ycf͚ġCɱwܙ!A}+XǏW,+4nv2*>iT8bf0B)46B-9rRB8aqUCAþ؂Ftt4o_~9J)|֑s9D78!sQegS>gN>Ç)6Z^\\`u2334is̡e˖ֺsb֡JJ( p ~Qϟ뮫uBz,|(?:q!s;Ѕ+s|͔d!Wп}FO6( O >m 2Yfq뭷xPYT{kkݚ{G1 .#gfadek4|ׯ_~YXj͆+c}F~>`8o<"3THJJb̘1'^!a=1>tC?-Bq+ Ha q +[R߫TioUVp¸8F 7}:˅&J^|؝vf u^z_ߤI«ZʙAi&+utQpL(+,6۲f*Ҁ記pRRZLvv:]󈆧@edX˶o΅+.<'s̝;]v_qFrrrpdddp%0`9r$}~=79.0tKɫ߸Ѻ`^@)_0^x1˗/'..ʕGq\6l & 6BԳeKK)*.[Sv'usΤÇᮅBԇeˡuӶf52Q(4sB8\P~e$)`cbٸky(z,Yb}Q>}~ׯ?0z+Mܹs'>,/b<_om( mĈaӧs!,z) gu&LHдl^t #Z56bPײeK(--Eߵ #'[{WfϞرc0`@~aB!PXhцkh0PBu C s@2UL6Ls#N@t0'+-6sA+\NOOϦk׮hт>^x ]ەd%zV-Z`رa}9bx-&}JM0%NNN.UR=h`͚KII ))#빳gO+Ӫ: O3gc„ tޝT:wg} !` q1qh3P?P MYBkf"ܹ_RfVrRxvmC-? @M7j . 3_`sjyuĿ2Dk(2z=u԰5 O2ڕ@YVG==z4Nf`oB),Asf]a=tQP*OX*SzXa;q:u*#'W_m9;j 2ӈEM I PߵkEy3lUV1{lu܌`({=k3Rk-.YFT }SN#Ѣ,[fѣ7-q9|-h(Bp' g t~ݏx}^~{}~yv>Wc(eF,--O?֯pnx+L jx,]JFi)iwf iQXH{<8丞/pVpZZ1A)ŽkvWà0hu]ŁfZ.z^s(?j"uݚ1ĖD)`3UԠbW֭Ic#׈}!'L vT&_|{Pkf! W6*f=y}ݼ C7}O嶚Ѧy 18N4-P>d /_ngfr_?Ə'fdZYj.VBoH_JV,22>fuu>z5@VX駟n`߲;$WH{ <^\s[Y-\1IXp! , x|O죏Z#͉jw`z !hY_Pڵq?s_X1= b>\p"$*z[Xy~O֨QHIIaԨQ|>J^x_}5p V15 (,D߾ϒ%x. [?>:w|v<<kQ6{6,$s7qDڴiodd$O>$~;{7ӦU(oZ &N|\k)SLg٘5kÆ )}m"oW,-)A?t}vkjB'T"%.&+c_ս`Ϧaٰ4l- ŒHn2.Biʿu+E>Zg4h?ƍ㫊Y@t)?NsbcVMչy饗H 7Xv;}S1V}OTl^ݳA IDATWAg2<_ciÇ,]qfW+aKLDy! !a# Cʏa0-(cd)Б"}brJ+6%x|:Ŕ{09/ƤINXM:qDO-Z`ҥ| ﯂*/7 Jj:֭[Cqid$aSFP[}>^㶚Fef33x>ߨlf6 [^XdIȜӹ;j57\r%,\ݻwd,YONNvӫW/ hΓSOpذatkɓ=z4ߘ?>7o٦M6 :I&ѶmZ]8p W/dܹ\;FLL dddлwo*z%J !/@E*3t:^ XB?M6w0?Eѣ=z8-jݺ5Ǐ)(++İTy䑟}:gygybs=]'--36../};z(n;db!,+1/5h(k|B9$Iddd}_FXĄ-Hl!E&B!~V,b Hl_E[c S!B^XA B f^m?ABج>!B4lZRSWY0R<2+9B!'#MdA?*++ A41B!rBGhHpc 4 '(A!BSƙE*J)=۸VV +G4M [Ü)`B!89ala),8[/3+id#%)M7 *d2B!_հa0'w#\l=nEL\,f(EB!NNE!5Hdt )DfB;. t=LiX!$o]ՙv03@,4 XD!dXDWhZ5f R!M M2B!')|(?:( !BIr.qzy<o͛ٴi6mb̘1~ !ha 4o˚ Hbq KIi1YttaX#NÇsWf͚@P `޼y 2N!ٿxz>~mx%'@0=%{svg ),ɉ)tؓG^Yzu}>k֬@P!DЃ`a 2R4\gkZm8ѡo[Wvn;âEسgyyy$&&ҪU+ ĨQСCoѣǬkժ:uBq [ (D]Iݳ[BjI&oS̔EVV~-O<cƌa̙x<]1bsέv}ZZ۶m#..NC!2f>6@׷i͛ଦ͈?=@ʽ:nؘxQa='#33!Cynko&}-ynꫯޝFQ pC '"VkU*[녵XZWgv7.x6m?B&k׭}8|h.7`#F?[K`<zԁ;N!.϶rt+F$(kRhDm4à ڱ2U5۲NJ2(/ q$_LW=P,Tm-?c JO?qy1w\^o5kkkc~:fu5}9ʩB~: 1P#A=DcC,^CG&+UQԵ/9(S5ϟ2a`oSXTXkRcLkaf3EvFW"D͘1 XCo+rr= pZ8[h/bkN2rݻӵ#id<={䦛nB#"L<}<ދK"o'+# Sᗁ "65)i)e˺~Nf6x|!D)c=fYSrg`ȑ?sIN?Iرd=}c^~=?g>Zz:5?ԩ !UVUR\nl} M=Xn{}(.L Ӵ6L+6Ka9L3O5sLӺv=HUVO?҅ǬfT(s :̪*Үw7k?ӬaÆ Gٓ}v0Xx1~)6mb֭RXXHqq1'|2 ;w>WBKN(C3p׳tRT] 7H'1?C9 ~qp~ oa>}?i]իW~z6mڄ磾ުӹsg9ڬbuu5cٲe (((aÆ1rf!D{f^MYAM0?oa3DS"EJj(Ң6p}l'>D <_|!'lq޽hL4. g,6nl@0Uݻk6l_=]v?9M6r$w&57l?9c .fX:/''?tMX~Yfzdee1~x&OqQJAj g.+P%DeWk\o=t/]vws5k{z@L©׵NnM6,^غVRY^}вe$''3u6=w}/KtX?nS[[Ou{wcVW|duI$vJLQRB]]_|1+W$%%.WxVcĩ"0> pGm&'a%>5yt:`MCsO>=c,Z <rOR/  an.cݵ|r;N>$ro\yy= ~ڵh))x?!h^/W_MQTr TVVr饗'i!QB˗t4/>(aLIBQ>wދ+'c˖^N.eIcl݊Õg%_OeaݸO3kj0oݣZ iy&A>blذz*&aBKIF1LڪP} a*C(ӚO4Fx@ m:ך>>RlkvTx"fi)A}M7~gMCѣG~Y^Nq{n=EE};9s]3p =;G<ǷvG̙lIIW/9.](0}b>4'~(ˣ+1gzɊc?BkZ/32?T,bֹRjʮU-*#V O3f̰y;QƆ l=#j-X녖.zR~H̙Ϝ9s/RR{ pcOPʊ>cQGQ0o>}H>>'xM ~po$Wɟ=ʳBgXO~͚n757݄jaF֣ChrQSd?m6RSS֭w=(-u먾첦aUT_qƍd|VyZ"ߏΛGErskn@?zjBDKi hh!t$*^%D:z(C!t=19ƊMC4Z!EکӤꢋbBwjkwyg}~v5vظ1fpE޽K9묳H7_[POh'|cvA F5ӇN_}EެYdsyoMqK̈́ z;H>dRƌ"7|p># 5jW]uwq7t>ݺucȑV2چ.FYю:蠘>uS^7$iiiVj))1KXbM!D|%T@ZyJޫq2b^J(OZ io!!nvݻ7| eee4LzW@O>Ď3}ݣM>}yyxW^}c5+woCX?xnF;?<<aa>>*\d?hf3ŋ#tE1fJ-O?Dyy9#F> QSh;殬dݺu1ɿ?WOk!8PHpiXѴp;!-S/K,{;,fpCTp]w1$xdff۫,X^s1l_nk"J+{J ŋ:tn=KĴi<7S_uQ Sy ;bhlD_'|>|>fΜG+\..B{Oh"Oݽ=^z1n8*ePZxeW.wwG!HkeE v-a"ϵYS8\4DW|GYhR'4jTgݝcc)]L^{3gr؃>QQϭefy1 ֍?7ߐ=}:'Dڵגt޸o/bCDߨض-3-3~dIOOKT§qulL"s\P`SUUew|7`*:QsG% NũYkd?8IQ#~=w<]k4Mseܸq,[>SUUEnn.EEE|׏:>/;quYQA}5+/qM f<d?,Zj*uijz!=Z>/'*A6wLÓaCS"9gCxic68&B'Sfs8,Nv\Bx 1)ڗ@L ]G\.R=pj̟kj{_uOn[oMwQ7`{퉛eMoW@;N5d>0 oq#ׯO>٣kͦ󉚤;fqd\B Zx L0NAߊ`#)My9OEXxВQiRQQWUAo.aPsֵ隍oOZ"n_[z5<g=0ZJ ʕ/͎גI̚g{/K{JKKϞ}̻"+?ӽnBDu"S3* q(!K̵G:uG/V<}*֯_W`͸5Cˣr kŭjOO4r$ `  xFb  9r$}gN oQUNBM©3"(DF|_gi0`^YRxJkpo\Yյ8?5Zg׎4G{; CӨ>Æ yk*vHƅBvsȪ0 $oR,7}a_Vg`':1 ̝3He^|E.b9=Ot߻_X?Jtʙg4N:AxVO<M=z^48aXG]z 0#8Q#Q-^n.']vV6[\hҤ`ѣGtV M?əB`;ԳgOYf r$r ޣ"AN֚}F '1i oYVX~3!CХK)--e˖~z;k\@_~ )S+nE]Q3GDnvs<@nԈ]!c)/ 7  %:cڳMt4F*SsG=)fU\.rg`cVVx饗Z.j_•Dݣs}h{ٳg3{^s…o'h-qvq-{B|u[oG1MipI#q7 Oe{ָ~8/&?m1m4n X}2n ԩv[n)ȠAʤr%$sƍˋY.-G jc=6.G!wNiY)ɞdҲN!5)ukw+aZ 8U,fwK eQﯣl+G=ӹsgnFN @7^w3`~Jh [Rhx!mݺOqq1W]u_\s lRƎ3p 9;YS\c:pwKܽz-]tRRR#bw}̛7y恮Su' 5 a=]_l'uq.\Ȋ+PTGHƤI.]H9/ Snٲꘕ5-j IDATwa=0.IBQdee;˽ȓs3Ow [\AZm z̜9N:nn)]D~Eȑ:uB OެA1JJ06l@{B+Vۭ'55vi\G?<_L1$sIdE 0+*WF{$?##Ge?iZf&'h?{fѣGsg;Pu'Sk9H`ljoݞ&O .ZK|'Ļ<ٞ.?c.B-"Z׮]Yh^z=w _x>NKM O3Gyd}}a…\tEi˪&fm=q󎲳cn[yL7y1~p| }&5Mcƌ5J駩i\Q7s~i{6+쮶It^.*OkqK~|u54w}^HIJ!3#GLz-{=>-[HSq 7\ZNN>wyg~lٓ|pNrucEvʹiZ=?77 pWor̨# x9묳bO8wyy^&MdC aر1_hر 4i{jJKeĉ^O!d=49uv}dl*Obk4,ӢCDm4 ڱ5U5۲N<ۏpgC]4m R,Y>?m۶ك\.999ٓ^zq3x`8ܬ5apB>C>C֮]˶mbJOO_~ߟÇsq1tݾG[̟??ʘevf/>`۶m~Űao~õ^Kff˝VQFqI' <-NJ 7@RR}/cǎw=ۛ?Eaj7f};tΊO"|3;$'3oR MӚb>2B^Um%[ЭNK}k_AxHJJj{Iee%,9(4:wlO#I$Yi7ԓeM*hޭ'aNf6?oi^_,/.g4|(B!@q\YĴqUS3!C}jV/?C/X[@H7 :Ac!hҨ[u~qX'~.i]?rYYD!mְi+R xPIM`4qciP&%Q=]:wT:ZuO!BTTvAE"# RYYIrr2{&)) ]mBCPp l8:Ӵ+aT,9 !BIDWtjkk  @:rssׯׯg ѵkWZ w*jMQ)B!v_쐨|B!Bi؈ .`˖-,^>?z#rʴ**\ta!B6` Y$|Mq(#ڨi(iB!hMcXȿ/{fST\dU)0(EB!&~E }r[oѵ'tbC&A!B61JGSȈ߶~P!) !BQ\=^KD#7;o/B%۳-3[umz!DsBq`K"إSW45Vdc_#xE8f}RJ1a !Cț3wg p}>'HuבzT_~9 -yGnn}MnYӦ)? -[4i{ޏV$J+EwX*iWkJ54n-eʋa41,,2TBڍX]S_k8ap<^ZǠTۯە;-+wŕMgTse3W"|9Iq6mw @ݣI`aaa9])mJEP8+5M00L1M4Xa#>uøQrVqd[uJ_ZbPd9%kN/ye˿! caH"؎͚5~~ո{7kп=%'y=wy~_ZZʔ)S8pegclLݴix@F w0r$3c!&MÆU ԬJ7m 523(G6h${ ԡS1|^PS>/ih. L4 _sεߧq>k4hg}6J)Bc_ҥKq]wQ__CHN깫(--:^/ݛ2x`RSS^bh#:{+A4qIib*iXSh7߳hKMeA4 2!!-5$@P'|1f|pnI<$_dޢepI=EqczӞ0Fy'''s뭷ĨQ/@a틾jSZZ㥗^cK6=g(b̞=ٳg8MKRSS;v, .W\b7$R$qLjp4 +e5ٚ1pu~ɘO7~J#kIR&5 H.eۨ@7C}L%Jk*++Zv6Fy9:Aݺ5Mml`QQQ7l|)$z*(E7ǝ~tImz>|N8MI @CCZ)_[X} $q,TV^rT՚t693J) \OO'#ͅRP-HZ:_dSUOK*MKϋh<=b@KN? !3ij|Μ9|'VrY@%n~v4K|15x9w޸QfYڵ4}%KtooʑΌ"(&nam۩hHgFCDyMywa%y}N#?+Dfa2IMrp{ճشu;fSO}̊ ݻ~oNEEyyy9/fE/zHg T @dk0`@4MJJJ}$z*ɿ.M^tFV `3*lhh$Hi5~:[nRSo^tw };grP,rR][вחC_r=Khr=zt>0?~iR=~<:5;=ٚ֬,J0eddp{6e C&c!d4 {.F-ei ELEie^Ply ݮf?l: MsYۭCۯ . 0h9+$S~ijnǴo()EH8߽bP\\̄ `ܹP[[KAAc%9o+/jL;uQ2bhO#KEP8M,714K~n[nn& 0}RYC\04no %/'-4~q+RT}6o~!H:<,ۛ]+k4+c"7ngqv4~rwӣG~7]vnkVJA4q[Y$if=-Pǭ05|[u\ASx 2( i6pO 'Rlߞ|IzXմ_Op..&lU^HZIK9P?Ty>@&~8p`*%mϳe멩/'য়~sItH $q\Y$irqX.|M^V21\ >]HKRTJAA$JIOiTn TMW^^|gq?3O?%駻}A|aӁ5L0\UE/ :cر{vim_(++QF1jԨ6]CO+E[ SA3!3pgNQA^ S>sH$xq1(bwҳzt|t3xPiiVMS~8ۻ>%K0ey晘hq90{lHb à[ZWv6/귿E_\r +WSNqbKtHbGP8MF P&J~ٗ솹lںTO$[mcul c4V@Ii%;/O7u/5|`eڴilݺ7xn /s9 &ϳi&ƌc'ZJ Y9/DU?R? }ʊ8$Jz<Jykg gH,q(Ǐ歷]']y%a0K-_ā=U$vf,A4qPT:j_OIIu f-lٲx\x.rR)(LJj*Y$iZ+?%A;A$'4 ]v!ݰa1bƆ TDe,|ѕ6[5,&.`nv5ddd8E~<;qQC%0=yTю,]Ԛt:,&p! n>}:E:XUUZ-YYs<@}}>"Q])cRN>}{SZ_/DPڛo7ѣGtnxt[7{_e8lo>8E!ٱN`N]9bPlXͦ>a/vACҩk\#7dV#4-2m4D5kXKpn#eX~/j'/)DWd1RNDg[U9}[yU_(44@AOx ڱiPUSɺ-k[HZ$ɓ'S[[kFy9ɓ{o\}ν{5k>}*JCq-ds:x<[nTT(9s?a<۾"]) IDATNDWEQ׾dg̦ &4N"ZxÇ?_\+MdgлKl/DO?WUxGfh_# alLeQ}啸wGKKCUWcls^=9s&^NBŁ=TdTĥ,L_2PZo:0M#j4煏Sʴ7ul 2܁FӴUDZrYg,cӳgϦa?6KO8.]J^}n;s1dƎcDb%R$qljp8,bZ͸Jr5MͅsL>?OFaeA…@EԁG5PTk+O穧jq: .M]wWo7o@vv6կ+9S]O4~ƍͧ;4 &PPPRɶcl"(&~k fT>@^rG׽k +If?au]u]G0Z (((y[4Ə!+ѕ"KA45%~ɵ#}#HEPؒ^EDt,b$[go"(&naY@!*yH.B0 O&ɓR&̜K/" Gȿ$KtHKEPg.*Osql6 UC)p\zz:cCjZUsi\nRsWY9Q&K'(MBtlɶcl"(vW{O#2jX&20nV:&]KOO'/?1Nzz5CNNn$i]KF@IEP=U$vf,%40 @7CTV݃0Lt]G t ## BFxc&.nXɡnX׎ǔP!:ʍ#if˚0|߇01STfҧ[ǘ!s 9hƼW+EwX'["EHb4U>V7 HJJB7mF8)Bt\Iqb!$nEّeB -i`次 ?wV+EIXF `_R("XNMM 555e0cm2XDJΏp#jELCo4`Up k~–)])cRKC/QfJ5 0LK7 |>>ύ2__])ĢqieêRRS(ݸ"TG 1H_sWi#6~BӞ*G;3S7nDav! ?XF.эPmqepba7F-$m5Xd'I]g ϥTѕ6[YYcr\dee2;b܁"NAT3Z*XBmm-l\qAVp ё%R$qljp%̘lL_l'}2ckdPF E!ٱNy1LMԅKuk4sOsp0cZ=MDIӰ""˨a4>0qUe/_Vcq꼱i `!DtFV `CiY߼5,s PCu]7PJ?lx<=^/U(zdJnjVhRKtHKEP8M*є :'    A`Txnk$HJNF400;N*"(DJl;V*ifQ[[CFFf~E'Rl=d켽@מ*G;3p۳Ҳ|d(-Bߞ*BHtFb 4qvԕ# e͆l*ٸBAn'4.>B-ѕ";F,iD?).Qt-FnBĈZV輸4 !D"ʑΌh4 8Vbk#:{+k=Opvzc7lw}(RB8B+EwXrrZrss[}Wiw=KRB8B+E[:NJoj۹zOimxW$B8F+E;?Q裿f/g,a6$͛f}"MBLjH,qwH"(pDW$8N"])B8$BHtHbB8$BHtHbB8$BGHtH $ !!ѕ";N,a<n+ !#ѕ" 8aV?4PZѕ6[YY}/p.[ewFߗ"(pDW$88|~s;?ݝ/I"(p_֐>d;;sԹ~+ϱ_t˿ Y$yIl湉~oc7?3wfI&bI" v%vںj+~UKQEuEk YEVGiY"I~|2s2<ιޚxwqm  HD5gd*w_"R&"*;9(RpQ HeDDD5 b$"""rP DDDDAA19(A"""" HDDDC?YG#"""GA"""" HDDDC]#x+QA"""" HDDD b$"""rP DDDDAA19(A""""PO!""KU=sθiWpǔ Q Vpie8gf ++K{55AEUuDn 9OwO9Ϙa)cUuA"""r8gdaԩ:b:BRMWA"""r8 GLXϢv`RR̗f}Ea$#''!3+\} wx{yCRUdܹ%ƶ/ A"Sp}i&- ՟N7p%2\]]ZA#%"9fhնADU,1 tZ=ڵZu4uttE~ :h_ZuNGbҕ>M"‚`VV66E1-Mk^Gh_aQ D5mh^'a0^^؏^OY~04 E@Ff:2t*_9m[~) z@?J歛 $ H$HlE@ES $ [7QDDT]Tyܟxw,Ԯ],E5+Ro7a%0 3E<3^O>^?nZA0P(a0y+It:4o͞@L6b(vyصog`4@`4"杛hڸ)4:DW!1šk0j("`X ݅-;"&HxN<FƒK-n@"Dž.`]Ha=e䉓~wpU0cGci!GpR)7k6f|}c'ݏB./EX"\k*ڋcD*@Y#ɟ4Q4% h5Z]]1ھHP:)z(ȦJ3{޼j۾Tx|J0/7g_|ի>ǥ ߝ77M#4_D`P 6߈OW//W&ّcidxL3 ӣoH(rNâ!O[/"2g0Ѫ䕺M:k[dN0 ۵c$N.ǣUd:xlLPjDDꋏZƒg_B:LWO[~8>J3Nx c'[T:XFG;nߺ jkWA*AHAJϼ Xuzޠ7{mT"ߩ_ DBѠ~PU* ǬY28`^׮%VOjվ"U5|^BxiuXgD ܼyfۡÇ`s1wS6nߺ / k r?|RƯ+0eT,_  rd7oI7d#KW#11=: Q%)PӔrʶ`p?wG>TAW*Jg̜6R]\@d|J899W&bŲ1x$Cڵ0hS'~}JB*eT'ޙ9ȵDTq~ .#A(dB8 H?_y!;/B'|FѮK<*ûLY_>غ#ު}E I͎L&2&Ųz8qXcL&0qꊕ(r셗7;a0`0﹧Dd]th~Ν>zpuWA(g 4 )_ -LуR3DDѮMܺ} W hur+m:1QQ˿V~h+[DDT A19(A"""" Rۗ 9As",@Gƙ/}y?0iۦ͛///?gd^`+s~~e|B3R?j-^uXU=RIIc8V4V捷]p й'nT0WZc]Ҹqu1[* 鿢Ug. QQB#0A""""G HDDD b$"""rP DTcڱ FbY,7 ؽswe`$kϿJ$\J/;A"ƌF#>d$%%grb B¬?svGDT1Q%JLINAp Pvb$j[ϮطgŲ`$'bl޳}$"9|[,kӶ5Ο$۹4аPHZXlw(0>jgUw DT:<+DFz=cf=<= H+.-Rݳ{v.#=+Dڗsj A"Nx +Xֽg7ݳb3ϏF^^mӨh + /Y:Q%@-v"5hXjRXm6w/8{鸗v!R } oo/]vEGrR2DQd|.OdgSCsDDUHE o9SFZZza<9) .ҕKz= 2 gqqir^^^J\.G^^iwqmVVѺ]+ h!J xK׬n0ٽs7"DDXуӲU ,_)Z-Ǭ<$4㗟wG{); vNB}BTh4+,‚ׂ @.ڵkz-= ''"AtCźpu5 QM=.!ʓK>X{ oOt'ex#xꩧP(`0Lu/ZZ VnkVߐڵkcśLENN-`Ɣxwm];wQu HDg 7[,oy͈ݼ#F'Zi8Ka^X#"t:РAF `;[E .iv *J{X3rss-̌L yrF=7 ͚786"A*]Xj)<7:_WYd3t j2pq%Tf-YQj0i$:qf7*~&Z^3X\KX3nՆQ\ ,c'9xATBחyXZrssѦMlۺ:ZbN`ޜzꗈǔ7QiwƊe+q^:<<=m3{ : Z{٣(,NL&C`` ~ M# Jp1݌s ^bt/׹ץM!8C}uN%\0_LtANvً/ZҕKph߾=6;kںϞPhV1^?V,avv66lO>x)P{nXf5T*Rt(,WeK@VV&Xjj +oʰ΄A*M Z* :;y6oY6/WyfUp`[lg2%f3A4V"<=q0* 7Z7hRxSH DT)C铧1N.pI3۳4\0Y^ѠyTs8qѭZV-KD53Y2u*j?'WyWA"4g QM3e!\֙@kroA[jԩS ^A3U_ GLXעv`RR̗v۾p0U-ZPw~-- .!lа.'\;ܹs}ipFd׎]/ ApH0BBOSBL.+2pif-2ޗv㈥X[VUt+=&MLDrR2d,ZXA"*DhX(ͱߏ#9)86A&h/Qh֨y?DT9<~?u{t f^Z:T*Y1{[Y3#hO4 _'̌ ;"~K$Z,Iй}?`4#^Tfi7o:UV6s-?u;%3<P͚w8q"Ჰ 7bl(t^zuD_V˶ T AL;E7.\f]ƶ{kXdZ coۮ7U?/ZX`v+ V:CG *XKRA'ùsxp䷣ֽ+r󐓓~AuվΞ9-AD@VV6hoSq"޹ HTN%AB:@vwgpi8b_q hؤ> غs A(xfl Ç1k X׵}lóF#+:>^:CG)WrHڲrDfQ0ax|tJ%T*n\__;kծFjj=y«X/ ԭǨgFV%>BZfm?K"aI3h+ Z:&ܹ!"OZ`8ޟ;#GJ Ap~<[XetNZ^Q# ~ {⅟ ++n0///zܼy>''!n{vj*T|?Q_vbZ!텬,S+ue bz}EQ u1 DT>:AfVF!x7vvvƈيгw90H>d<P*1vKx'fWFڛTS07Էq5Th׾z?A6C?Θ-s]!,%-~] THD՞bߘU="HKZ Q| =iiiɬ2ph-__իWcS //V9.^[[vjuGͥTx θib1b9"*K HNLAJr '''~~4uhTjtA;hc.M+kKQ" 33!JpElڸ!) FƍpvDDAden#8$;wDhX(T*WIBB.v6KX+>!PE">>uֆT"E=`?d ))Iɸtv܍|X1'GDT DT&^Z.HЪu4._phZM*BjaYX컗`]*V*8rƌ @_rSYTS4jZS""t096[cFѴ{`0_pg`MI-+P( T oH$rdC[G`uA"4ANLfs B=}*퍤-+m+^DD6  6IDϠKM#1 "J ("u4]''RVֱⳀ@pqqբDo1Dam¼ye, A"0ػgQhߡ-`.lAk / A*HQ/d2} ztC]M7&)i*<F KF\MM(V0 HDػg/${nxW h݌4 77׬VҌZiCbE⯽{nDn \^+}?f"7Cѵ{Rȑun_=X DT./ZO=Zd2=K.ŤIp}SYEr9J% 77tkwFyyyHHHO?LL ᅗw^\</Mcy9RȪ \&L_b` $#;;@g nի ggg--ޞ $^^^o@_rr(fcnѭ[꼈=OƠc$J'W14̘>999%n;Z--[l(ALARaСpwwGfffeόJݻwq?7"p9tM"DTcp0U_~ޅ>-puu{%(XbJ%ի:u !!!PTXr%߿_䙿v ZET*l޼nnp޹*0Q8'&4 .]¨gGBcػw/4 T*vn S `ڵ R T₰0[ tg齭8x D6FhP8)26 &<_Y_/Q7+X0TȦX*3g+[$"x DT~݆6nk0خc[L&>#tSh[n߾(CkаaC4mw)Rxnnn[.7tQ*7߬ۈ3Δ""z޹7Ro`ٵc7} 񲅈;qA9+ <<ׯ_ݻw!55M4> C*H tQb㺍8|7XݻiU>G*MvV6 kz$@re9uIFvV6d2k#n݂3Q7."E||!F2 J%29N H$޹u_{XϜ:wУWJ*XJFDTqz x%^I•fKxgjޠGdH4h?h_֨5DfF&j5E6<<= 1=zN d27ˊ|nGzmHdqH+K!"" DTmXc'5;p1J ((0 صcG4οѳ <6PB}.\{@ dR)CDoVNKW`y{DDU$jEDd{{nEI$d2_>>>PTpss nn* 4nM7CTB`}3&+ĉ U gaҫ-ufvپáT*5)vzB( z.'\UUKZ9SgO@o)ƽ0)KKKËϼ^ž]ܥ& ^oϡ;cرg; 7QÞA6cv|KDFF~[p_ܬC]?᧝P5X"R_xBlXkZ8Q̘^}س"琛k""""v F=2()=aKMnƕWp5Gܸ~ O>HNN%q5ܸ~  FOzo܄w͛HNJFJr~z_ܽs~))HIN7 HwomD1CXAhݦfN{II8vV,[! löq5̛3нg7ӹ%\LF)DDDD<=\>A@Z Aԓ|B3b'~K/A"0(GQgNfƅz`kZaQA}y -Yo OOL<CG =s3\\]0u<9 ܾfQM۵ ?k6vl߁lThۮ <,wg1^4}A?nâh" ~ ?vS^1^4G"""jk䤄D"N IDAT d2*W(LDDDDT3?yYٙhX1R)_<_?4mD*Ev] o[y#"""T \\L n(]"DDDDT}E4Q4B&;!HHRm 0n)X`. 9({.˭+zDDDD?Q(۫ fIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/editor_3.png0000664000175000017500000032442213203343610022425 0ustar jomajomaPNG  IHDRsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTU?wjfIO !@h!P#Ҥ bClXw"u]g] UiҤ! '3Lz @8Of==7g{{&I@ &Iy='@ 'Ɍd!"^ 6{@ 8{m;(tka0G A9.>n/j2o|_~ꋽu 13@ U{:f LF:>tgr `l0^5W|poj^C L*gO#%"gHdz3iD|]?tU#}fz R OklI#!f5sKa#fM>~8q>_sҿ`2M`;nlX0o{#`2F97s!dOQ+Bˡ]@Fp-Cpni1w6Z%A l|;g~βtu<ЗV4ʖEKٴ?<-Vh${SFq~g]ekwn;ec,>K̹R9E%?놕|8)vx2#޸Ϳg>WE*Juk|Ów_?ar @p"i@\¼F25ר׹3yGߑ1_JޥlK6 }8߁`c;4pi(bϚDos@5@dzf\ӣI5i8ηQ1dvbȵqC&)G4BRJ;;dr޴^W8%qClj9L|/\⅟X )=JYw0|0= &{u8)sDݒwMdOaQi:C& Rl.ﯰjZJUN'|lz qŤTϔ@DGcU8}Z% gI-9i5*jK$.b^[r,uq Oŕ;O9kt3jjP:$4YA/`y8&$bOzӣGE4?vX*ST[̮"HHF_kK E%V=3/af/wu_ ;pjQh][=T~M1g|,ߧ,/ 5nfY3F_%J}T|n 퐃-zm)X=x?Wk&\@ 8Z/~R ?skwe\zDΙx0>T71p.}SfҽWQJXv/1]ѾH1[΍OWRd=^Iryuգ̼;QS C՟?~EMfnz1.Ln\@ @=jb[@ &b[@  @b/AG@ m!@ q l@ @$M@ aD7@ m!@ q @b/AG@ m!@ q @b/Ap 8ȊF]‡۫`6J$D0~6ЩfO]$IBT=w2loz[*48 Am8߼wٙ碰̋˫b.@Fsҿ[:݉S͞_0uE6BBsFAWy\w9}> I\.Or}wb9펼"//-ЙIN]B=FJIqN>n>?ݢOȞj4$I'hnGUU, &pZˮi` ::^\,3IVVV\E$s, 8zxˈx0>׋,(r뉋#&&&(( *"XuI s.J>nF 3r]z/jq*;Ϋ8 [w'M @¦\;9 n2x|0O$~.בJv\K +6uF0˫JS/3{K4#CzŲb{ kwT2,;oYC|ѢXnRo-MW7(^/111QUUEaaaPV+>Ze| YZ'#G_7>y(靑?Y]|y MZ,6^_{wjEi8jdgIJlya{Yn})n&UѰ'tW7s:=S5 v$6nYS<|Urq(N.{N%TUeYz,c0СUUUx^$I"==hH֣qĥH;&zĉ]$Lvqh1mlrKVPO)rssk}h,bE.υI.gG@"=LwckѥE7<Qb#d*MOhU(y [ ctYԢ؝#nb#{ 3@9x`%dC2{+h (hȁ W2Θb*#vbUq X>*: LǙ~,EΚqdI(F\u)={ZK8gW {C4E ξ4 kwIݛH6:#FtbXBe*++XZ߇.J&%ĺ.r5闭ǀg)F4d~XƎv; wI ҍ"{$ѷD+NUpypTn5={B/䀋58y,TfА(lt#L=Mk`|+i)KO=bч,Z"$%FatcAt)ڊAz^vAii)nA5u[FCbƍwT!'>e]0)&$$H⠒GjX=O |)ޱt݇*%wn6%G}$P @ˠG\ȃN`w-!g# %F h1tgjt^8ؔ=B9C;@YY^MӰEG3lŅI8H~a kvk5ZKdb'dw.FFG6n$O3m&&s{V`؎N\0rV/%lrGyZ#Dcc$u&7v"b#2E2rreh^d*ӫ{ 6!H8[JTv::رO/0Oj؁MPPnJEBW N4]*&kw܅0t; oƨg3r7Ϯ"Tӱ_ދI`X6oʞ^i>~Jd5|JhV땻Z5MM6^(JpA޽{ WUEH'߮[.HnL̝;iӦjcpZΰ[@ _}c(CR" J^dD*sck[Auz=>\NYHKekME1ſ ^"/ uXhړ<2r=@.a( z=DX>]tW4Jttt[ӞDǓ\-$пPU^Nh4_ϫ>|>%%%XOeջ)=>*$[$ œas[]@ 8m׻[0}jWZ^ۭz?n=uWi N/nˇϧ Ѓ_:rT..bmntmg 1Ί^U#2e^zw20ipDGGMXO5{NIHH l;\7[W} ^5*x=!=& o8}II; O<{5ElMPU@^TEGQdEe٧ʪpj?0OäZhaJT|/U>z7U4bz3,3#ja==շE,Xヌ-&iioό鷝lLt{p͑R. &bDG'LwE{A#lڵb Qde&Wwzh@pQb/H@ B@ h#^ 6{@ 8B@ h#^ 6{@ 8pطoUUUmjTIltҥ^炶O @pʐ"vIVVqqqmjG5UU)++cB{1rrG'4(([7:0c96q.BZ; SM?{qWj3ߏ7L8$}s0uG I_vRi Y@!&[>l⚰]|'Mi,\Kœ<L-r~߾}deepr;t:bϞ=B@6o~oc6H4DE$tr2 KV>|Ϸ%noViUQlu^_?p۟پ0㦐n2;,gp{η1U\tn&Ő`DqW!6U+t<Y"ZI3J(.f'U'޷:؂ Ä@ƹyL| |\豕'¤#݇j4§r y;_;еWͱAv(Vnvŋo,ʜK'YuGUUrN IX,{9mXTҋ"tw\KO\U[?ωkc/%,\FE%qxSZuTb2!ckc:vlUv|Aa 2:fv"JTTTp…i6oylq Τ13?,Ni84mٲ?RbӆdFL?dyya3Bw ,ϱwhnK,P_7\4<o zyGp{ N/Bw9^c]N,pb7_@Ra߯[pg3c/R׼(rHRͰؖ:.!Y- IDAT4|m.&=˸2t{yz98i`@gbg/Qt#956r!2()ȯ;cBQYtǢpONlnUvɓ<:\` [׶toA:t*8#Azj=3R?C dc2n /eno[VwBHQ`آR(*Se G\@=7jU~;>"-pdi@cy7^f߾?sE:{8+d+CP3R-z\6PCLQz |&^Qsu3r)߀Uʚ?-Уr3 >X ~*5"Lģ!g|j]biz}=0j0wzث'} xlo?aHӴr׭Sm}ZxZ&-8V\Ð5-bOVZihQ} f@Xs%"t Oܖ ;kܿf\15,fpq- :vv 9Wt11Lb[ $Bq ;+X !JCzd]]WPB4[Gvcq#T Al N_AGs4l#ƦCJ# MW_"1k7ZZ.mdBX$IBț`]y1_ v ~СvIF\`#N %JԋwJ+٥;}eōWBP;yBi`EAμ†ڛ~L_'Hƙ|sasya."z%CT0#ԫ K_B*{(7 ~+Ѫy^rCx[g3Hʟ6r<|eQjXȯox(eB19<׮bI ?Es{~KZ(>y)Cn[n6|_6N W8೙+^=~2vFŇr+;XgK殪-OqQf}xZg_^C?X}x:\#D~ k{yLΫ|˸Y^y7 0EJN=5-??bޛu!9={2n#<ޡiDI$ cJI!Ig;cFF}2aO$IDǿ/C!ӵtUrl)<b.-Ԭ8p2q3 vihhߐBJi[*u.A vѡ$IvH2VSoij~&LciDZVݘZ;7qF/vMNt-+-df3w|׈Mjޮa7/㩱SMD;w0:JY~s{Q#830Wufq{:J_SYR;|~{!YbS(g1ew13暰wuCdϳMRѸvʍK k7Aq dtk}^uy}јIFC%*w})բG\=":;XqV2鬤wc׳鷘Wێ@N ӱ_|ċO\N Ν _KqutH.rutܿ CT loǘԍf{ {[v?^*~O> +oo7~>ȏ4~.o୩>Z;Pa}HNNƣqMRÔ/Ą)08GOsLTR-z1n5f){/@Oɦl.6!)d}m;KkVy;e7爤+26E\t3/8Io?rh'::TS.mv<涋spK~'oxOA;tsU R'÷aدj b8m{,_c 4R-H{Ҏn >EboI%]@G9zIdJtiG\G,R#㶧W; ےR8|Ӈ߉$ě³90͘:\棄 4d3E<}X:%u{nX=oCETR%oTlg~Ƥdo"hH ~7{ؙ[sW}>?"tEW׺*^$%F/{_9+2r+00ʻ!hEvz3b švѥΧe)|E.X:#z|J Sb'"K_)`[!$oDh>/Gv1笥LevqqCSپWV4HU{jOW=DI|O2c6}UU;d:6Ĝ*܎.LڐUx"** r/~w>=>t$Dtƀ]e1G4A%۱L0)Epelo(p |Gw=;s%3o/;H2yr 2J Wx>RC!^pN{X_u.2|.m*u0X"w+%wxUϢYF{F sWͤy@B" %\}u@b^=b#|ﴐ=6wZs~wʬY76yj.=ϋrd]l_mfx#Er'9.̇?aެ}0slxV;};ƒѧEeyPUզES0ڙ&LY4 P*֘J|hlՙYK%0bֻQ>"7\^RU.zK$MLYO<^f͌SS(raް_%еb 夛 7(8YL!ӌb 3y+> #SXmn ITxg?G2(^uNޛ >!Rwܫ{!   Tjbino~nib3{U15a:ʷ~z)z%ΐNpM .aE(aҙ;l:/ehg`g x6/XD>OY+:jQg|4k?E_A7˂K$`o}3[j_bdqh˗K/Y_>X^Fx{@״Y4Ø3zft_rhVx+M3~rp.3Hh}ha̘ ˶CӇSaȣǘy] { 8κ p,!W(^:7@ldT2S}Ld7W!V:5B&*;[W İ9v(^/˯'`{n0GXC 颏6ǁ\Ss'Mq0om`T ~ @5P1oRMRJ<!@M*bXpJF(NdҠke:)RT$Ij$5#]g`2tzs'L@ 86xW UXm6 $ ְA/EU5v;a >$6POUEa]hd㦪¯Ǯ?&>B-FkZ͹vi'54$$Ɏ_w.zdd7i'@^8x`}v*&i$5/$~A4OVS{hHhkl۶n=zo,@ /ab⨪ nZMnT-i MS?@" 8w4(N]LtPA>P US 5ui55tEjѤY h-r4}!i*j@ߐŮAʦL p6Zn r L _B7J/'aeUB/ig캯'cCQIy~ }}ȏ@pZi5&%U Z~I*5QkaЊ -Z8!4`,t)fV6{SQn#Hȷ%ͤ緩QOJ 8itS v=^tsY\Ծg*-^_C |U'+g嶲Y|)ꓦi6ok?t>|U}u ÅW8Kx]'娕y,_Yto$*tՓ=`WQ@ $IZ,c}+AI #!.l6Zd;^++Cd ʩ‰*w6XSh?P (w~ߦ,W)wCC S`WK`67^д@YJA{hʧ=?i;Cuw\Uǿ9wʖ&!ɦw $@B5ҤRDJGB", / 4AAz 5@i3sq%`~|fg=3ws{5Fү_ޛ,p\7VA_B蒽@IӒiB=0S9촩e%Gџs#6Qx}V{eTq1"bF"RBmK̆J t%!v8 ž)>jaz`E0]KG;A@MwPU1X<Æw Oa,ZŽae] o`Idϖ^Sw., u\cva|w7s =x>sFf|7۫s^OA}xu_dwnw2cZV֦panu L=~yl͍^ IDAT\ϿK&y_qwͯrާgr0^}~;QpWҠ]q1_ݪͬ[ì/Dnt!.tc@#ioߗp:9`T-8UT*yGx# k^i@[WoK>_E \ϧyg!Z͛s|{x࢙oȔ=(cF(GT0DCoq2 C.$U9 'fMÁ`^hlXu—W`0mڝi7Ƹ+!`D'eƁ~RJo|x3Q`_0l<|V`T/mhC¾ zX>s^D=]T5gMs1#vg=o梿š.woPb8aooܱDS1p3@ SO"u.W6IT e>|~us,j8: ddž"Y3{˗ˮ nŸ 9r X%}N:)V M=B9 =6.׆ qx.hh a4֒7oupY \]L?w ~g¿w}>bQC䮉Ş-DM"5íF(\ e~s$zC:^L1g1_x8 3`5tWZ#?k yyE ZC3T$غG@[+EӎsUqZH;M KXDy`V絾FJRhH[ݨl+bës׻Ζ[l59ޙ;C2ë(;ZaT^y֧-ĂH߻KD{ZH8.zY afp:Pֳq5ºa@2 TApT@:+ྩ'׀n11=Z9GU/ 4֩0XYh"`oOS੊|XH\i XubK7z4717>'az:_üG@u.Xٕ8\\dz%~('='ZX}3k׼&Sv>6V.C9ް@,fX\TY-xwF:F qلZ# h!~*DLy#,a,_)[n.;7y9^#RY,S3Z &a\hn.8w(Û@φaQpQM^9ep e>q cJ8k8D>LƆP;jOj/x[oNlw}X =; 1b+qXRKp^Bi%UuZ=4_GgӕӼ|H+nvׁ2Edѱf-dM4iCf%gGLI""QZьGKgR-49ZԬ:)`)zb>PVŀ\SJH˞߯UDB|ø+Yh DyDdFϹҵf=.#0TsDAqt;Nj¥pg DOAE7 IοR@skH]4j.= - zāQ ^G^`]=7o#eI/}{tL躋JX7Vup)<|yGs0߬6pk ,{ܲB]ѝG|wȰyh^5GG#i- ŕAPi${ ͧ>s0?^# ]r҉.N e&1AE 3[ql`[J =Ǭ'җ࿍G3o@>T-hO`0hx, /@_O9Z_7ㆣ{ENUgC 6> l[rX*}y0ȟ`ז=NVr1O<+1W1n'7 &r9?\c̟9M(c_J|C 5}-7òenT|hs^DG p.,B)X͙e(ϙ#k.̀t-=7~_D=$hfj/v e3K Ӏ*[Bߵ[a e %5WBЫaa<d`B$GݎѡUeÍv:7ft;`Qpu_ :;jG׳;@|_'=Rz.pz#6EtvC vmO-…󩯫#CD(P?a2e*1_ȿ!5ORקg# !3p7@``%>?=DiU(HIK:C7[J32z%<;]29^J[.][igR =`ͮ 4_Zvt4ucawAa:BAPQMTyP9[@㿁GkUnMs>ecyݡS1RJ:;"6axnA2HApylJ+wAX"  ] u=~^\j!,:rt7+[|P{(Y愨|m}~ >%p6un ʇȷ~7e;r΋(DϹ(JHaq=&nL^}ApMq5|nt1n\-5޴ ė[Wca~_ϞUs+ei~yLZ@*ԧ2r&4| B`NW {!LƩ<_/Ps^DOPEMM fEoNOG9U+wL/$J'?,`ܚw_cvqׁ^KO9# ެmy[f__X^*(sp|;@`l{ft!^o9/R;d29`$p"6,LɽmĬU9M u8nոG -=oUw_P] ,{Y, `ƠnS/eyݢ'2 y{N5g.MEUȢ TraCFpeד ?N߄Vcg_ѯ=Ic:F2RŬYe!-V~!?A<no+tA?;&NTc]<-%#M"=z;g77A_ 84?*ڡpIMSB667>uO~me੘W·}&"ڢ3n.92-B&"Zr3AZVӶ~hh^gm'tޛqSiQiǦ9ko> HoY0o- 2KobY7'C  du`LErfs34?. ɑur.hOB =AOLuPNF¤ YPIxC[7 PNAL0Tp!p+C^۸[ovf=qn§|a*X~$ 2W[m|d4Oab_ q ѕ_}* +:E {u 8SD2e8"լ9,U(`nc,YBK)o\C^go`KR*%Sd"PFI0!I\yAK w DZ"\3 M9/Ur: 6 ejw!#`l+X pc t.FBڥuTv_c'JI K@Smg}-Ѹhp, z!!˧.-PZ U-lX郗^ —A0eі4(zh.x7쎾B.>N)@XRbS"z.5{; /?̝ŧҴDra۝-/̛6'Ni8~_6»fq4tCxpmrZY@Qk3IJ_u|}ӜS4hNiw̫_?9w49\˷wmC.q1N4>ñ lbpW APBgäI0zZmRΨY` 7w-@ЅO'e0ʍf5 %IX{ڜOSVZGȼ%HÌ7#8nOrcIz27A^qkM4n~TB~ cj|?z,3thfJn3A0-0j/0<[S ZF{`HX6HZ[ H7àzX7 z*tQ"+a^O7O?ʕ+gO4ca]̛6 珿~%Pin_ W,IP$]9.=4;VzA,vu}j/V)Z񻣾6zTqEGYposص+v`qf}*>OpG̀m!jbbC'2exW~=-sYa=\۳Vޔ0lpƱ'nGib w9i9|)eĸ10C| |17ΰb|cFoϫ!VzЯ"| iIy3SHR..({JZ[ #mBm@k][k*O$T"/.î{dYABsCP! 0I@or!;Ub(ғqJ6Wp(Ѹ9_~,Zk9|Ts8<0U%K2/QLׂ_68oׂƄ ~EGh΋.|5!ӷŨcם<1;{0klQp=  y!F K7eNͫec fwX3_o(\I9@T[ h,^*sXwclED閜\ޠcnR1rU騑? 0u7"oP8k |ܧuWJQym.(-?XaL#66R :75KK!;3s^7b/R/h|wחb>}fގq9i!45kW+' w}ֆ/]5 ȿ IDAT/cnaЀ8,NaWOPI?LL|2*iшSB]lIt1 HB }%bR x h/Ui}m-[8됖y碫«``(7 ip_â|Y~܅ ǵ%̑M{w!mh \++!m>_3BHQV,b5dnN FCr@ `"=هǚB^p{0eil;}7zP!8zٗ 3/+øtZ)L]ƒx3s%_Ɠwa8yy4n9G\Ne۬9㉇eos3b2n/T3-an]ӳcʌaF`&< ]u`JE[Q $sN>:/߈Fb[!`e[ 4jSLi^4K/$qeDgߋH,%8(U#< n`bn5fa@Cpo_U19ޱ`i?`~`tV7qBA]=Ҽ;J+lͷ]|M׶4>ϝ܏iZW åPjħƺ87} &:Vyx{60MmPjfy;qd TR^~ 7&3v7w2a+K `7rT|<v( dIl|g0jWRN?vZxMFeoai9 TT~5Ea!Λk13iƿLoǀ,^@> R \p iE${# . .TԠΒQ!P!m8,J4fA% %D.K&6/"Tؗ$bj]VB*v,"1*VPR^Ŀas\hw$Z!lFYK+FD## z j a!2ΑQ1k2 #_^ -)-̴P,Oz͍PZZBiis\'EN} @Qɛ߭7c~!`E]cS&]&rFB^⥸ L 6"C@~Sw#sYbƒ ab\jg"d A܀BQ´F֌HZ "(bcx.:3++x 73Xkl@` 0b(bAmV& #5A164'oEĸrjLVsz}?F'`q&)0 Ȅ!6EáĽY?,j$q 97!aÐ@ 1g ] BH"" %P w3Ck9/BA)Vw~E|\QE$ޮظ#f!bQtb"{5xApM`FIf$bL>XOlҟ54* !q18w>=K% 5G~8a"7EDf  jÉit Qk0i}J@"(c}EDhEc>fz3%4 6z/'f@# zk-"J c|6"!`U5zZ & z#Bv _F#|J $ah1x.T*`& c`6Cq!*u!M*b T*s(YE!_D] {`WD tCMA(h,HlLń1 ޿n/#FHwEc>oTd>/GhNcWxMy^K7c3&Jm'qfp 811BClԷЄKd`w }*)5QB!THGTAmAƐNh^m)w/8H+A!?A~|_'  {U%Jx|-]LSccQć 0qv x!:ob]:J>>nVoy =Ǽ߼"۱AV̈́^[u&77[ksQjΖҡ@Gl|}U I |z Wo% &NTC4|07GzP'.ʿ7` P&D "6և_Dw?+{I@6mtbn,+HkChEt祓g+84׳h}IvSb] e+ %#7pc"OHU/ Hϙ|o %< J` 8~Cj1yw Ⱦ/A1&Juz|zb U"6>8Cλᜠ"kAS%Ǩ;gsYꄸ1`Ð:T;@h L-wMWpoі"6%. Y80uiiin]W*{=g.L0&o%o: c-`3>Z |.gW(_ Xx<KGFBOOk#E{y-ZAlNxK@ c N%wOk-uj벾| 0RJh^Îr C*.WUh5l+cϲ;Sʍ1`0d\T1pk%ί4:RD^K1m +R zF{9SH$,q/cFb>>'D6[&2[khlJS cZ<(6bl>|K`l&3^"7NHz@BxC~q4Dרq |$@b Z41!ahe#((3ǐ(A`x/@Hڥ#x쯪C!9bb'/8~vJ;`N542:3n.Ω^Yi>Y/6$aya4s3JCЈ{֬Ys.U%%%u^ {C|Z1- *""67721D(x`dv\LcbDI@@*퉒$E"ao`L(N=f\Ƈ=ڍ%r q%amd`c!R׭(&>x+QoaXUְcHAI60Pդc <|/(.[~zBx./15tcq>.6\T0&X\ԧ 08QU<5DE08ɄQ^7x.kxD{"<Ѥӟ& ':oTu( Q^Fx X',llFC5^t `2kYs#l/ɰM۸LyP?O3 峪X xmJֳm yYF-M};kl;u?w;ꋮDAyB*&N=X@3&:i<0S$U AC60^:7_WRC.Lֿl/pcBHN,M ⑵,۶%Pa&GĽVfHVSB %$&"+"z"0TP &r˙cQ~b1T>/T%tfB j pZ 0t)E03v'8-&K BJ AfAhH9wOC -3:KϬ}ѣ;zr3 ~λB&5nQ&8)a^n 1)dR!4̈́/@:[qz'XG*TctlGHu8Ui>_x?t M dĽoaAs9+iP/Ψ<͒2&p~ooF_S.VTn>/8n[ a(Q֝\xp~=ǹWϗ%Z ΅i[2ήm+c`sw3ĥ# $縹kb#|ad4 GeGV\g?Wn5J"n(+@ AEb.i3 ,^Su@[J[;'J$`F0 iƳA!C N $ȥy>>[2[L''FF-FJ@U0#q$/!*L&G` t0T缕E %0" %iƑA`C4 2dPhe4ɺoR:̰Q=S-ȤZtF3ya *tHx'~D~ }%\N S`Tرb8|P.÷:p?e'a;d5syB๮v8*BgB 1 =Z`LA^ a hp)=*̀ `T qx'}ЩeM!Oفv-0{CC[V; ?8r{u\Q\L} Ok?bK2oW\^o_â~C7N{9yU!*LK_U*ya3Okp7_LcrW]/oAvgT.Ybv.{Yf&ӻ)yBP!8b qj<#8kBeKTFðG7BC2"hYzk-OGQ~< hbi$^kba iDftS( % X~À |Q70B Iq5cBC bJ85 8F 9QG` . Q 0VY'BoT 12!R03_km[‚JX9sbWrV?^۹={ۜ7-<)F靰$=NW`Y0i x#@)O$ۃ`߫q?{fYUT:G:ih&$ #8(pAAŀ ( D&tιr 콿?Uչ03>O ws:kw/ZQnc=@w.a<ӧ cך2EmCM|I|Fƌl`8p'?LfF ^ż?ǽ7sAG嬥yt'qs߲*gO1M#AX;0(WY7M)ږ\}%C=fܭs=ΐK|7Q^N)I<)g8%rJaaD=4/:"W8L 9.BHTɘ)cRR;o)ctJjaHyҬ8g Rit"P !F:tkHf}@Alb0ԁ*h <_2a$6hV~OqBae2N#q"K΀NJZ8b[W}!`L Ak7&_7spVr1݀})003Ԉ nnoXr3ž,C0 R06 ~VRֱq9G !^ IDAT ?OvAEL9O싼 @G @_L$vA p GT5۞{Q|^_ os.o+nV5$k=FIniL;Z~~g[k|+g;̭~NJ?>tG*dI\Rv9 Er>)',B@ڸ7' |<Xh%I!GJDF"US)zopK l^2mzÎpo!N$, ¸gfgQ2ºxsKO[rsaC} *G5!pχ!m<NRiopCFvpY;UG&o"Q|?× eK pVY.yz4~HDxW%;Дd\R#hkK!Oi'=nC_ipH |u۲} g% :X N%=멭_6o9%`N}g ֏,*Z*wc\C|<ʣS;HZcl>G3M/8V8ʮ{*tD QR%,H0hxAM)v '6p61aJEv%1^L;Xjde RB\;a#  ]1hr84HʭQB)P& 5Jh"TQ~ub%凎L Q0)E#t+Ҩ8OOlq"$%JqttA[|4ȯvdX?}`2RWfCg#]q8)[?7qE;"p :|оűg?>n`Po.= ɋ&=*Fӽz%mbpp7/Gj U'!=[l <.aU-im3 '"+"#;Iq/@wª6^ \z< A>l |dDX`=oW͐,yk]R'Z_WAG.(?fMmppg~|nx~;sEGS{c8GwMUQ\xytg7_+PK `җ%=u`6KG Cp"1U*2h}M"g<tۧwBzH((E,_{(VȦT ^Zdՙ*cG\K>0V#d,?rLƵ.Gp?AVe "pvpΏzIy!m,Bą0r$\ u{$pk<%е `Nr9jϨlh@G %}I'0?٥@@a[!fIL/9IQ_7G~،q{d=ͼ?L^̸af/Ņ#3% CCB N[÷8 m>-Vэ/jf1\5{W1\u%9HЖrI@ܳ+EO?^)S^1+?ek.CM FEMDDXʱwN`(({|86ֲx} t窈Fe-bET F]hnڍx}{6NSAXY!XKl TĥN=y* gAT"dx;o"bXG R#3o-'PHM Q$cṛ)W/bD],ΜGǚ;0M|Él[ wbl&\Pxxr۸G>;+`qm `$UE }b ֽu*0DX;d|>)3pj6 gWHa$8*30Rt>kUXخ6~YX7rI/3`r?/CSZO?a3G;,G *rY‰ޫM7ɔHkqG4(+Q+ė^JRzyn$a SemiVa:6R*R R^RRXm ͽAGcb&dojc߫Et?ZG:V~o({&MP292Ll&F+36GEB%{V8CBdqV!6)b(amtqJB%":!`(BݻDwgŌhʊ׈ƘDeBlTpC%,Y;gv.ӳXkde/ʺ'bK[]iWOOm?' eY|er oO Z5wߟ$J{,]}닧=f4_i`ːcxrE~ur7jM=ct PĭC82\}_iAieI+K95Ѣ&EwfYpzt:/rt 'cZ*`FKKG OCF8ׅEPgHYJC8h"fHG|_`] u?Q[ ))c5زnИ@E#k/t(V47BZX"0>Yct uB\}-| JJEwTʥ`xHiػt}YX_@#=X{Dop`Kjp[mmּ%uD/ s WHuU0t<|7;&1Bw齝&7o2.z??;BRfUk7ɞtTTT>_B Ck61]#V>nao*\azK6+6aٗODu֛H)N~<꿱iX|5W$ѵb]pk1EGTCC`7|\RDvHbD$<c(_-s Jh&Tx 2h! #%-`ehPS2uԙ\%rz*eI [61|ϼQЁBkJh?")DLjM.9}% R"TV"ͭ/kX ]m%0z0Ow|Wtg@վ )CYX/%p(.@?i^жYX'G<UUl_tvYCVmW~*/ر.og\g.,,,]}m*f#x4F:-Rx\&XCgX[i +~?Hz"\u(|%X8v x  ے9lZ|mu~^uQA+~b@^:lLԋ9ָgލŖނqar(^SlU5LsƍjEL,\S锟qʥ'AJuSW~I]WI5>ʴɷ@h[kXA||hԾ1b|ǹı^hʣ讨A#Kdb4opI?rCId*E&%Hμʔ lj=ٟڄg蘛7e>s1RWXlzI PA'3P!HUpE+(b[rw#Lfc 06mt{݀@8 '?N+(Z Nr4;@PXU l~{6[ f{ [t%p.c!}·hpWV.w DCc5/Dd;Oڊ+&.q">{Z}o7B|;lzJddv 1̙ fShm;cT)E^6 &~b4לI]H]3ڲ FMgXr2*c Ia(ܓ Kcw ԤR)1DQ** (:׳BS imbRwAo9RATt@)*2&D4gZq-,QlRa-#b׍+QJΡǽS=]38!q*-P/$:2)Өb騯$f]^t#p$8#nx2 b>A쟡z_ا»͕, OOhD7?S`h~Bl5JeֶfVb"^Eo~h poLuci55e4}| t j൭6Z 1?&6ο/LF((f \ pAJTv}TV6BDz`.?v}0}k٭l9c`m{J#*['W,ĖPf|\,JXC?,i8q BrVd!n[ܓ!ǵX ȹmduf'=,}ȫ{9[ *bgBt Ёa%"cvTRu(QJlj.6Fbm3%Rb,h`nF(EUn H4}Sbl S>TPWZc@%g).DIJIxo?N, P@e@bnԁpĭ ~<ϏM6/Rߝ%AhjOoesTU@W֗ٷڶ_Uհ6T/&3`F2ʶ_o'fqq8{Euͮm}/ʣ`w[uհpt?`pHq_hE;<0chkkc޼y4772(I)cԩTUU' klBhKBb]@8HД]Sa #Mɤqr+^Zr)i].{l9ZG,ϿEYT܁vM{K8YDNRa }unA9:ȹ-6]$wB@#1TUՐfQ& 8B"4»* ,]JE+ \) ~^(EHF V g. Ϋ!6ֿEj~ uSճhi ]Ɨ"!Bp(HiRy`ެ%gRȎՄ9bZ&Kp l<B <ql tCZA j8r[e o#w Iu.xa( O잙Lza$o=U3+lU4j>n{u'o#!{k-̜9s|5~x,@c ~ B: V O#gEެՅs@*#D2Mr(Jx7@MQHuAQ*B8K6p+%}+A8H/餮%!F"d^=ǂ*E8g0q =Guu5L@rXH#T:@U"%*qQBv"d'&#Ey\@l(/TpJXL:QăjH ߇*ubo+iyy (gZX2,͛A<uV=-W5baLP\AM"v/ fk"PdǽMRX*ya]rj Fpc(:Êv&~{PW~ػNcvP64мmsl>Upr!??>H*]aG;]rح~f_o @7 ѓo=~v.BFO?dm:moé,޵~|˯)O.l(fq97\.G>OWkgp s`yZC(riR:8 ղt4-Yʞ{

{dIͺY73Zfّ8s:ނ;_a-ĉ*f.:&r}f~V ɕx'W" |ORT"|ćW/7=H/MB TC:.^h+"ՕBBjϤȶ㩼G{-O=Dwo~fBqIT-aemxWr(Ȑ}6`_S#v5 ޒm{XpÇ?-ڻZ,~ %͎@ܤvk;X+řlG=c>u :( h-vP֊uiYJ4FeW+$䄦iE UU$ 8LGhmrҫ.%"4cq~B5UU}RQDJ3c1,f3 @!eQPV:fGcWDQ(eez{5ł( ɲ!ul$"]GݔR(C]'b#"1K0b0 ā&!IlP(jÝCkЪ#KBgjN)82[m% ii=~^coPF{Y6@i9?fk pm+Ͷ#hȦY]'!~WL6Bc mt\% UpWaLy iIҌbŌdj6a?ߣlXOi|£wP%e8}dx< dh|I:jFalHXp ĸ4<;c:36DA^)Ϟ>E!i)C4E+HB7>ܧ SơeqK;6۠S9-Pa R%A%ՊlG+z9'J2\ 5lC-cl'[[mj;0#_Qm#7[sG'[{Nf1&[p]G\o.ɓVC+wի3}o65fgY7f,3XgpC] ψjJi=mO @AT|b+k00!tBJSKiIA#.Br^;ʴa ߄,j-i6"$nKHMO(L>|' {weRV2)PHG}0_'3ٗ/kG.f&CHɝP>#PA C ?4ى&H'܂UcLL-ChZ^PmW}&[EOM 8Fl>SOK}p0 OԍXQnE!0ZHu=g:pzzJ]7`*I o[ݻb@kM H㘼(vr5MN$ci?=o{Z% ž_E|<iv\^s9" d_< &g2$ eYS54MMGryy I2e\\Bױ60A`₶1(4-I/{u]szz.IcXuAj^1H*gӵ(spvQR}1}EЂ5bpd8Ø X]rM"Қ04qz$K3FiBl猇\2_ܺwdbI$" x>k9y<gmE?'9oQ>}MK$e:`XgOKԝ,7=dž`zvlCn_[aJrf'l*_-?_yn2 i[֌F#{ @ܞ? J~+<叾>WmpnͺY`yՠ/X6h) oOһ79'ֶ:ym$6F_'ߕp&Sc(%6p>.Sh.Enư]xË'Rdr>WbKZFo 3cٔNzEo~>}$h}> {8;eڰ$GLR"T݆:Wwǀ5);{P^X@0PJ&G\ {rx1; [ia\| ?MFg`Awէd8'[J]ױ^I5A!_]ס84MY,cIӌv_]ס J98穪8In'̶V}^1 Ͽ ;y@c&7Eu)(MS\_$P+CfqO$Aɭ6`)&υfLYVq2HӘjR8 Q`wtMAEhm'(5uID$`@xΕAK8X'yG|Fϟ= BOfwBھxO!:#a`;xw=@-{' F+9l Wqe(l1A½;v,"ƣ1 Pw!I2Q-]DDɀf=$R9/U5\]M`` /+T3 !4N8r]ӑD{wr9Q`HBý`HU.F7}b:+ m[:ʢ$ +mlGszP#\_u0'c ӧ(7fݬgZћݖf$C؜jP9B:I凒iB[BIHHMN} :1RgsL _dQݑBx]`+ൟBdw,KQ ܓBռ{s9T2ɱQP]&Hp,AC6];}LՋh;;XTPA< ~rq&21ϠH[\kOmF"mѥ -r@ddOP%9躎mYo6Ah4\XfX0N>g+CIjvKv;7(ܽs''ޅ 8's}1֚7EUj$!/__[LUՄa5uݐߞ$p~~XJSV5U4Z5AJ`\ B8̈`0@1N0V3y0 $ ^lbZ: G u ф˩Z?rN>ZS GpC׳l톷A׻:p}F?sMMX4fXpr|ff2`|b6C*+\QW mEe0 #u0˚[$CN^|IdA@S5%h5`tຆ*/1L&|:IKQ7bo lZlpt:oȋX3Lyyz /9'3h|$*O2_.X]^G6$HR䞟sCNiZWal̓m=~ዠ g  V6mQ/}_{z3NJBW%;@mV v׍{vJu "ق]^O?vqpliS?hC[1(nݺ9yiZ.'bR Qkhb.|//V,Dn0H4| P,k!0: m,t_,!EњҶӽTo[U%"M3gb8X4MKt-75ݲp]Di:X&ٜ * 4da{xQeQaF+jNPǣ!\#L\VKTs)߄OV/PhX\/M)NK hq:)Ӊ|!NY^}RBKG.$6>ͻRcP\wKo_@h XSZ4.EP&O%WCrl$zBܷz 'Wh}*Ȉk- z>uMӰlwXtmGf;<{ɲR㝿8l %ARU;^6pX(VuӢ  C E"Lpݫ8n[n1PgYI IDATM:'ⶥnb7$źn''3 3&CГsf(7=;rα70L-qސ45 3`PaH:&GꊢV5Z\FZu!;1??gjQ:cO2 _?M./e2e㣵ƆᐢHe6Lcб{VXۇ-:/c4FInO?X猳!WJ)y\ج6tL֖>Ęq^3_-s0-( c^0oIb/tp$@ #zH5T{0ȟ p'(\1 c0Eb0w*Kҽ VSyq|u]xBU! ߼4~QUQh6Q.Vuƴ8\mGմS&M)G1 @DYwtʖe-"+֙R.8"ABU^s^c@JŊwi bdNԭCi#tL8@x<0)HUIÌw% ;~EAL&{mG^wjd\Щe#gwR{12^3 i;(MmW$z w(oZt28O%5d{{4EMEJ?MHs$͆,p1:lAhcAHY5hm{E)gg3'DQLHX`(߻b9i:@#k(6 Պ|UD@S&SlrY̭*p+FYB۔,sb=h?b6iK4p`]'6& #Tu_F+ÿg9~ƊQޡ1gxJߦdo]qFWbiu r2:hE FpUmGz:O,NxQQs- 1, L|9u6Q//I ƢX|7Yf4Us ј(#5c,]Wv( PZ\Ð}8ZlRihke쒢>CkRMj8HҔjgOڮ# I( zur ڊzZm>+Xsps3I m٦` ~у?Ћa8@6`ڀ(J48$'qn<wk-?vucxgh,]]kWw}Zhrҁ@Lg'dyN>lF㜺m9<:n;&)UU1Uݢruh(?[c4zi~^+\*IRd OH\؂Je ^%J5L;/>;f ëogcy)dG|7 ЯAPq2'+°\} w ,I^DJ/:%JR`,IkW7}8?;P_ɾ. |$r0cIO r.e*'C?^1\,HSʹ@0!3^Ln#+K["G+?%s2rBQ^s*OwGc꺦i4_'8/E}m۲sn̹.{ŵ!m̵3IcB<rD6 Nu HSa>ӱEUJlSBY1ZaPl6s&.pX65Y>L-q m$Pcb:9Z{<#:j( FtdzOjinVeUZ-1;)G4%#"ɳ4F88اU/ 0hI0vEחЊC+; C в=laxyce1ȩc˔0/jm0ZӴ gO.؛N?{GY;r`^q]aZ^DQh4bZ;+(ꊝ=`$ 5x5G˫+t$QL)% I㆔` 8'O#VK&,4 H8xWZXo (H MK[v>FG :JAs1ِ)qlQ (cop85nP;jS8 !zۍykipA:t#y'GޓK@_I!7Q7iP[smHxBz F67re=v#le^&L\ ?#[W`lGX(R$J ̂M#|t(R*Vx"Bvw߄ ֧p,. ?o1<\kzS rV}C}߁`$6s`y%R'qD;_#cB2|RF{K-{o"Ca$D}!k\ QOn #8p0ec5&vv_(Q0 /+r)do`ѹl0/\O+\?d|'\\\0%mX꺖(AB4\Y9BDD655[91F`\Jµ#&yWiG8PiF,u1jMZFSEՒ,͈ T1fUU2=<@c4gWDq1ΨW5{8?0h\NۆZ4=WWWClFH/440'IF(,m{IRH!b]X״R)cLru,h:]@M߁YІ4˨iDN4Q^_?GA2Bn&M/l~~hBb~K9:vwwcI 뽧( ޱO\GUD4eI@vO>tdެ黎r%Hk\#6mYU5}ס\ޱ3ʢ$Mbx9~k^.X\ZRQ=GTu ll1>!zP}ȲU!wc6 5=*(Nw}9<ɀm{ѣ24އ_ݾ7o| =?n[C:r}?0%6R?RF"j+ufUz;AoƗAƿW)? յ=?w_}zr`l%YHz.$ ?`4iT \$;씯_@T <xn݃ 0we]} (xo䟊Yܵ2t V*C09Koyy=HaW!9Ooɳ9=e3PALOBcX HΑ;0;<,c.k(Cv"&s,ew] fCy! baRaa1%*(Jg;&6۰xپ{',=P=VDi~!Łg;~k}SW(B៾...pN> `6N(1FYC4*wwh,hچeQ14fjM{EIۉ) vc A4۱GkMdوiAi$%m n4Em ׵ؤ h~//mX( !xPH&,D<\Սta ]%,omxmkqB0BҲ@Ç8xKYt1(gooVAc .+8kш$I2) m zMzL1L$@h4K%3ܬ21 6i5M]3A] IR6!6QD_/W\1i5+ݚ]%Mh}Kt}C߷8yGcgfW0{-jNy @ZsJapF@b+YE>Kn׮1(xMʞ6J6#5@R]mùpsDѵ[/͗ھ<+~^oj]\z);ޗϥ(=NK1^<͏ŐcDϾ+; (?fJ@Gмu#]/DkXmk1րQ c".y]X0*Yx%Ir).?>o~UY# x/A{YbQZs9hPZ|Xk5TU{DqDOhfcgKG!ϙyD4q|N$N5Y]_Gs5ybpKbIz#=; OM D~]nCQ!6P/| #h=a+a|$,A_7M2 W0{N>u 2# zu#@i/;] 8 ;)\<$={\Sٱ4{H@߆\;|$yL@A}PgpmaN>{S/s7P]ܷoRi'0A|,,%9jDv@sHShd_"u9Ϯ@z;~NIp+hQZSKEiIњ~/^pyyy]7cdȲmool u 09Ȳ˫AGT`#k0FwpMCUdiƳͪDz3aS֬Vf)(]tDU֬+:.`EɃ=2k-)4DFIݵv-*ld A1p$2s]G\ 'z`uԌ7|9jq&=nB#n۶64/5 qaWxܒYkxˆʇ@럵mKS9}S^\?pp5WS7 'Gx,R)64cg:Ib,ŋSp^X85iRX.xq~NQVeO[w"ӚrI|=>xgwsşP_\`9e1ݟLrEh Ib V%<"^w(:sU4&(t8pB*ּ; Ѵ ?  >6P0\nz,wDAH9^ur9,56I҄K!V֠H茦it m,b< CNu|Cdwsć!MSR"i`^Ot<%F9EEb-IEQW5s8=<ˢ,YWqd]xgHy "QEQG1uױ\ox(Xl&0*c,czڞ(ģE|k;|𤣌8q^4uc3جbeV+o0QG*i՘;w#@ IDAT8^pU=x0DE~.HVDswVBIbO:LYNkى `b-Fi2JI\;EGw^-XVlLTC%Y#32]\Nd`>8E1yfy/PZ%=>vH]ʳ4q>;NOW4mt~po+Gh *dF?}GGJt`2͉c1)Y"&*I#E^9Bqhk"FGho8_N$C@p=[9L6VʧnDخ-#"JK"rx#hzqthtݨ8hۖQのssCl8w<˅y:­s{͞eV/#?xrP!}V+߅ F߷⯰24wkpCl2WnwaaaldwUCC&ebξ!&m hB_|+.Dڄ&?;#yRg#a?6p]K>1?r,JA} |({;'Jl)>6M \>F_|)Ex =H%Bi(\yW HRo$P<\Ng!+!#W$7>L!U SF+^?d{lrn9}G׶DQ4d[9Q1QJI<%P,kVw=v`F'2V_vmìAkZ$SLd!|؈/I*z稚bUPReGYBݴLuYSv#lB^`1xQ;G?yQ=!hw9j2M9{qb&(Ix'8q8ڶ:XK;8"@մ$QLXI򂎒E0b<\]\phZbJ#c4C92WUy8u֒9M+~aGz;pcHI[ܹ{IZ\$Oi꒪*i[ɿi$qQZS7b76F+LQR#?~p.*YP!uqD-]] \hXuO;9t3N^2N"&)RgQq0Nڎ<'Қ014bZ{G t+E {|ےM]-iJkQ}EbSly?'|qq~&$[n[`!(PЃq\ݦ6PZz^/P3eGZ./^nu]/wjKiPyH$r {#Mm/RxO4܆DK'F!1Vgݜ Q|} Nо G'Za^f{{@]a\_f!} .}㧑 Jx[ 77f,l(\3ȗZp]~7 ;[U7,z .h_ZD@TSZ@[|Vavfsu"n  >on,_1WN.H{_3<xhFn {Y4\X,U[)ίkBS1="#bUZ8 mtke蓡e04$+ֆsMOmMi\!8oҔ+Mձ,ZV4N8(ǪlE㮠ZXFs+Wg2Q#Mc,%ƖIiCm-T~FXa>_r.T̺q@ц QuFS5-Zvf8Xm+ tJTUE(l놀%(lzzN4: #Ȣw=9iӘ9ڶ#"֛ Qru6|<ƣ]srt|"l*t8ݻ|1yMU!cPxD_q$IϽ;CAܐ[U8/; J[Ӗ{iB2~#b]-kO$$Ꙏj )'-P]=s-Sz8qy8˿5=>`Asz0L M۔&Iu i]b2 r+izIflI|CR@ .x۶rKE4R75;mʺ򾛨]yέCx[Y}/MҏrY/ik0`]Xe?ia4^O3pҟ }Eؑl" _≔#HɷLH$)9,.aD"fW eD%)ʄ%Px+|'hsoJLd,C/kگ ۧrL6&Q#dh/ 幜TcHYo} Fz)#9Ͼ6cHdc ^ ់)35DB6` `sIQh?ddwZI|z0lGȚ᏾ao(wooCk:F9uݵTJ%,JDJ$FUSkLb+<+.[0D.i(ʺ1uՊt& >!rrc (LzP9z'ȝ ji6Ƃwt:+lm$Mxٌ*l6X%i9{?,ߙ{zS08͡T`2>~ΘF ]g9(Ŧ(ȢhOl);('g(K+ưE-ޗXcLBFz% ,VvCf-ɆP麒 'G{>A!;:A_[p C-B(u\Jb7Եjpk㖋uM1 -={f@!o\6p>`t4]m7\!sc)쳿ϋoʟXdzC~ٮ;/ߘOdH5} k%u* IE䎘JdD}a*T?H}vsZṭ!{_~~`wbW"38~U!$ȇ^}SX O޷ۅ jUOhd~&lěa"IZ]ޡ(H@ 6<*Pr KllBy&`'Cn/;#/~ 3KzcR=ǫ4 Ƈ¢O_;q 0> h?]u- 璦_sXtg } 2ڮ{VX -c]kw}U3pvvDDZkyxxRjM۶x4ͮ 2DQLY`U40xIA2Ԗ$I!PV5uQ΃M2ra,DQ҆ mpCQ\ >U^Q$KN 5 D](,E<1t uSefnf"M@9=}1x)gWԭx*`S@1 =˲|gӣ?:j_7^/A3_ٷDwH3wD4fTng0z&{⻨Wb$8)ve( ϡО`ͥau|(_C;籺o38l/Й=8i'bT96VҶ+x{b4_T/&kŇ<#C^c <.`HϣY Y*EB 1~WҺ1lԍޕ@,FV_Hm;hxX^>B40%(?c0b7bdo^;a<`<: x{|ĝwv8>>&Gl$IDdRl#q]r ܭxSK,8\;TcL& `D8cD1ImZ6EIvlh@YwstCv&;SN'(iTũe\-k2 A)4`.#(軖}RW, ;,ik"VDbE5JnwlJ8'UlA"Z zF1ek!rF1JkڮgS]^!J2|D'5n`;7 !;ƒb u]I$nOsavwqBYoJ$%="kA{IvZڍVR\+l [vc.ZĴ!~!bvWǵ9]i6CǶPc2xuO\+MӟTzH \tu{erLM[0Aֳ5wKHL"c Fv.q w$I)Wrxڅ7X=!V%PXX]!=Wτ!nv"r!` ~6Gcr~P: PYaPR. ޖu|=?G\+FxM 嘺ՐPGAR@ +(>f=V8u/~|7]r a1 .FEK8i+^?(P(ɋR>9ꦖr$͔?YM 6R6&0e)RhD4MrRW( e)hFz6c㜓ݶ[e+<TDy>4-C{O?8#uq(&xbuPw=QQJںFOܻsBYM%7δnwyMQ-9M XIXMl]lg "qb`1AE[˺0_\De,W+Vn08e<gc)*a@(BA65x\c c Ql^Wr?ɝ^yl6kc$k/Ve9MABix<Mܿwz(!^S T7h,Jwzk͚鄦ibz<81Q>!hzr5II#Պi>x>syYҵyjڶZڶijʪJ?k*^<{E-fً4ł4 ;cJdh_ڇV+}ص]zىx8Ba~: V"%}3Z em/#xچ*iꊾvpgOy-uu#SE X(Fk R_7mrMWo|~Kr\k$;2:Os; [+ɿc鏸x B{/ҦH{p2 A:1?(;nw<`b؜ +rP(⊤_d^|* g`_ 1c0yOnw1KKW1Z<"0%x4[% Ѳ&yHOvއh0!ez">DECaO&OC7_Hn/+Qk1oWD"`rp!E,`v,OFL$xa1\+h "ъCW~\j'yU;O`6mPT14"AjPawV7.0vl띝XkLmCCľXc5eĄ*fai[ 5URM"( ʣZH yXY}ס4=ԝg)!H >bh3}jC4fEtՆ8@,m#Q~0V軞qcZSn*c8v..邥m;l"_ZyVHbh6v8cl#|H@YV+V+&tuUPnV$q$t{TŚj*KȠ,KhcfS4{{MK9=y|2rERl6|ylS)q|ĉmh(C5mIӄ.hڞx1{{xK$X.(MSjǯ|]|sE<S-i1ydلXFItNKG]RFcsƠK!Y+ ^mz./mrd2cwӷ%MRTw%?o ?U~75;Qx/̂G6L0i' 7da1$ޘAwtm{[ݠCR^Sۆy -06n%mړ$)axkES: K^u[xe\2KtshvdW3Nxz$ͥ4ZL ѕY oDcIj7=ʿ| ]# a Xjpu7ίZ]%)YAv/0+~i\D[hb1NW 9>#@ҝ̹F؂d$ Lv,+I&AL_31C9tDX"=K`)](f|MeX9:qp,aHR uG4o%y>i;tX-xFGt]=y>%KGAS,z:WщH]w/p";7 <(EQ8mc:GPlsbZߓD]EzҔ$IFDCD 4w(28195YJյv.?S"NRh< N&dic ܽŜ|D+VAvѕX)Xqvq4g4';,O놪q^X4]h__wpg#daXHj2(%Mh۞9ܙѷW9w_㏿=l$i[Qa#IW%~ 7d6J_GU_7l&`אVű<N(4JyDTe͚3ǚRUezl348t#BWӯB$GFɸ49jG ~]|f894Y̌Gw8Xk7bDq2أ(=v_\|/`otYJnFd>A:*\+4L |2~㿂N6߇WKR{%obl&ᤀ߆&`BBp.sOCG<ϤHQpkp-(v*v̾ 0~tW+sѮEd&PF>"0LD4yf%NkkJc?3.nH\4I\/`9T$q:F($V:$'͸:Lc79?_C=x`g*A+Ʊ^\}`X ίi:˂Cta6#&ĉ&"`ӻk8NN|+iT\buuˋO \\mijDT>鉓D$OF0<:R&eG}D6wu#IPT5M?_(xNPۿqxd}sUN$qb> jĻH$I&b簝kF|K1+ߜ?~%qÉxAӲ$**츇'g@}$Iq*Ҫt.ķ,)IKRVFg?ݹb ;0'S0 ϼG<1|.`^CD?B=߃z+@guO '؜l_ IAJ#*9?K9xY</`/:ïoyP4uCQ]ǟ|"[pNڂ~ȌE#bȼ8a/& #q}s4̶IVaS6H[5],1"NW3 :%9ȡjhڞs7ﹾfVJS{8nZt h҆8͸cg7krI/$a 4lv7d*y(40I} Ȭu$NKTv?/Ohi5w0lJR0?9օx)'K9n6=PLL`jRES<N&SX'@q)6.Eg})Ȉ8I|ze')XjX.Xk/WנDg9iM&r.`ıNdK)1dT Nz%R(V?E&b,LO 0Te<#fuϚ2lׇ=c0t }[Q9$a׏8cZaԤID 33I_S,g׏X xb9umh(gQʡt A)|N"Fz9tӱ ?B'J\K`cuQq% Kn& wssP>? EB%Z78CKzE93ڀ:ht"Ҵ,3J@̾R`+cGѐ`4} >㷄 \&J&FLOShha8&2aQ8~RJx,ㄢT*28+/T2 C(Ʒg=R&@-mQ?f}ެߐe;F٥#A<}],T ab'ƃʶ$#&ߜĦQ W釸SX|M~v5y8H/`@5`eO9шQy?C#فKW\_Aw u߅_FC^`ߵ"Z"u7'0U` ThWBw;[~}i[i 9ppHNK7H{e~*D~KxO}ϸk*%*?pGh ?2n35B+\c.yOfw8^:8NM,/h Qboxqy0JvUFSM70=|Mw-ލxo)65@ȫkSՖ@%w-Je,qqu#s3b8KR6@"XQcG Ԡu1MQͶƎQ )Si0:aW5랛$[2L`p~V"G#H隟p~JJqb##Vt@Q5YQW{>|Hglois X4;d@^y"08Eٌ`{9wJ\33Y9c,zRJBE9ꆪ (%YDYlY/ }'3ϨZCGHChdS;8S8|&;6?]v=Ez7ɀ0E9TZ> `0ma ׵x R:9sH*T<8XKa ͞V $?%Fo[ͽV䜮56D1HoMFLܶ ;L[p'$T"c;ߝ+9MKAFewC?Lf28h MRwy{QUއIE xojBPmHӄTHq]d=MדIbA@ewؾ{vMi2hFC3lqn /Jf}G[q\henS:ONN8jJ"q}3_/2 C8oq \YTp@*UK$q8X2 γR͡ lN59F :Btj\ AdZubr6( nn6TeQ1}ױΑł8t.,C31}k4Mi-Ŭ@fM9~]vi{ыq}}6?z_ۑ4)" }a)θ|EuYV2t1?nڞJ1uo"* Isvr;\Q-כ֍RW6XNOV7$цͮeMi@ ^S9C=')VkҠ?wn:?C'Oާr$c뙌Ⳑ&=Am{5`<`QH$m0j(=_Dmz-^GbJ%3jj=kwJK/Cw𷣓.ǹހ7}K ՅGOޅh6b>~"; v"/Jr{aX vFSfO60 Zn+/d؟My'o@[mlĶEއ x G ;gS<{O=d>E /&2ߗﷇe9GoE"r.w௧7w0f&iɠ~){o2l?Yq[zXIJu^P}&!V-߇$bKP9؃_b _j~藂jɫ/E$qt}Ϟ=8턧!p*L<MJ<0EC%%uIc4TQuew<5HAּ/ARLIK9(YV(4#(Mx0PyN}!GGc}mZGl>{:¶=Ion@SG1SX1 "OnpS١ap.EF$vlvW`N;TŘ eYI;]'mI"6T>r;ÁD>/`q"g:C8=~"Ǧ#9^&A@Zgo+x k;y9pN*KaBt.e꿁)'S T/94p۰1 GqxJ-F/ 1%wtGAq/A]KAiG⩘ 38e} $Idmv;l 6F979v#Pv4mWQKyl`/_ް8 s,$9cL9I)}ۂ:Oxg/SIN~<_wkhIl2qOND74ԭ< t]G%inGdL5]Sc(eҊ$In&Ӱsegja$/ UM1 /^^0_g (+V%vU`I>:S9lV=ٜk tkhv å Y:wEtȏ.>"hz(lGٕij^ Hk+Fߋ}((bNoAOr c%`@~&f@ cv>(^;ίx})@ē\;;EjڶE)EIo|Do8&czsLPg%u=#h֑MdKQ3q@#v#~CF'6Q(%zQZ"9~G@y!Ѳ::{FӎO~c65\n*>=łk1O釁 +\,TMpI)m?9݁9Rizi3tΙ$ m׋Zm9::yuy-y⨔'C?)ȍfMOctد75>}ku0tY*jGӸZЊ`*s#yPS9aOs(ka>eP"Þ,32>!KsVp 3t/i]L)M{)>FRA$㦆[6t@$aLͪ((XV4M#.؇)=j`]h=):v*o< qk38k_2.|o֛f#] ҥGpzpo{jz7ES.gM; eN:-_0kAcCD؊YO-勇pLFlN%*'L[V!$@ a3]A=MU"Mj7 Lߗx^|J"HG0FX@Deg߃MҡF9v.0CO`]X>f .OsMbJ޿?_I }P=Wd4mb1ux/;]85ÿ!8>:bӶE^NY'>wQ(m#\d4s.KG<.yS-lNtk"'2Ɍok@MQ$ε+7[$,g?0'w~>o{_ew8ЏfYL'dyx5,aAOMdif#F"6"P5I* b`ytP3_,'Ini2Ǒ/_( eY h#I3F=gXrjcw@afh>f{sÎW<~L;4,Vki۞j,Moz@g쎘aݠu`nG&mruj}0:%MEhӑ3”a! ("N0%/Y'SjT8aCX@t, 8&2ie4hk>}*׎ 4ۀ#lwڨ&{q->Lz47|QXx.>LMSgpgRĶfw?+ӯA L ۟?3;paȐ=HRߖazC2 X}UdNC#a^8$I'(Wkx;éc.]3!BLJ{NCL>_$o ؟Sᅀ2o:a2]wc{."T_+* (aO $1̾mOa>Xf%%}Ks#$K~&㧐_rT۰\ " QαaX%lnn|N(d"I$_sdYs<:H2oַ쉿3iw֎` MͫsR ]SqPM[#ZKfdZ^~IW.wR_rquJ|->xHy29ܼU- ojnzzkiIۚ/W$qjpyBlJ%*z7&($,MHdQfR(bGԤ_xul"%g{aqV2H )eA \pCG'֚~ 3[HbD)'B>3_,}ŧ}F<~ϟ?5qsH$dyAK//vnZCEl v{P[6Ŝ$ˈMnV!e8F ׷cNvd3q"航~ۼ[fc^mvڎ9ac8qNᜥnD[ˣOU]Z-c/AqD,eVdSWHw828;(aH"!4v1 hb*iDWA33YNL(xX`'c(/O Vl8Cȸ, dެ7W$YȀFHk"K߂l- G6,Đ ?Fo c'׾/gBZO<4'ES}Z-&= %?wDm6}D vZgx5\$BRKH'v$үJ'Ew%r _~h&#ZK_ԟK|nCD#]ì/5%\C+bx7C[(>@BQNQFM-&ѱH@MD*rr ?p{:v~)ZnZ"JƑ$ac{=#{V5jOQdY&]uz":& Ove #MA)\n 9܁? Qs30vKt`$:b^xSp8ж-!YE<~^bW2_,ڎŋs9|.gDw7#ўۤD֣Ec)YY:|i(ɲ%k\%@O;^/h5+iYFZ5ރV"- ^ 8 E7ء'$ Iz}8Z"yYl&=/x-"펣(QݞByh=Mg)f+P1ͨꖬAsh{aĆ0I;wd&e6[65a`%( FPkGcPEv' Aa꒣8t;q 6: ǘ($ Y9n{&-SR)I4GIBd$ʇ;"6r)Rk9'}?er7ěfY WP\h-*) g"bNF'6 \n721O1b^0?;BPOҝ=k0߅Fc?Wd+X?so*d0Kx8nőc<_)`t˩!L ;% !x=?W6ܕ՟aRvEH$),KaL ώrzcG"̩$U~J Kb7nn2[yյ(s:X}p~T:./aY0 sv2j-޳l$3$$SMé#ϋObjV,Ka  ֆ4I'C4fm&ōZN/ܦhzKƎd4/9݁fC Lc' IҔ?l.Ѹ%f+a4ˉg FH;v(MQlˣ?vHpn ѱ;4tQ"R k=?Ջ %(28~Q"u[&6j o{==:5o؏7׼$YDTJZ$4/hjo/a {R+IAdQkv#1TKq vQ)LRl C*wy&4ޛg/#;9Cߑ})q~?O$I*+a iQ8tBIJS?LcͿ ُ `[_ >'߷TC+?z1qB@^b:`yAt"1 d|qxZqDE1NdUJvc$Y,2ں&NbڶK$ynDzC8W?ϟ?-O=`Z)M] Zcxq~άZyv~1՚>8,kxB,-]߳l6bpwRJh-y("M"b3 a{U÷X矣u ^ze8ft 'MsU%h=itk(Hӌ|~s)EF+؉8ObVDFwO`"8{K@!>p}})e1 =v$P0H0 q)<~~wmΡVUNNOe99/0 @(xQQ$0pkT0 a'ùu@%qL<+L)h?/e'f=77|N[$- -~LD>E*;Ϡ[ˎwmq4O@iwJvR<"u,q*Ҡb!D2Ɋ0B`O>b`f"2o_JӣoIez,;1GNL2IURklXC~7J[@RI,9;NDRFK(ntl 鞸w!#_Q-+#ZG0#8U)}-4kJR&,l^_iHXPjza z#߃z:-VZkتI"x4t]|1nvDQt:((o L$xMo=^i4yN;Mo팹MБt +5y3Lv# @Fc$!tV6UU LK4c<4퀄8h9}J@D=+ZA"ӏd)lsG9qrxx@TDɈ^IryUXfY On꺡;,6-noag#r( R=3TW l$A>CsSrS`&ǘT%4Erh+:Q-,&*Nށ6V0A<N=!L6Xq u1_=xތQn:L'ISW5m/$E !bƳ9uUіV-{\舗/qppHU+$Řɲ+WdiJ4Mz"dCO?GkI8(v;Z{O$dyN4[fS-M[4O EL(?Ket^x4;T[cH i;:`m~#ޓDjОt=Mے#,Z(ZhE k]J/Eapp7:&Dme\b[ @f@n9뺎{ah+k97\(w.c><_ IDAT>xn]E,@+^ҷБP4 #_ft=x=Nh=AVX}1Vcxu8p ʰ=8읊<`qLߑ`%TPy>^#Q*~  N=g;qis?BSN ?YB|JRwPx$ # ٫'r# ͥT(Q%B JۿTW;^ JJ=FndF״ l6Gif8DPz,K0_ -@UnVe7X~ؗE;=x4 6E!-(MJbtYUDQ0IxXFdns,ω,y9GG $<:Zp Lߛ5'wT%/|N&4} :֮'IS6GG4}GQ6Д;..Pα-*8Ö-g &I2:x=mιQPk:Ҙ]ZR DE5=8q|<8Iq6/pE`B>5jJ]^S= mU0v Y$)n{r%6tJ$,TUCF(zuF Rg]IQՄqٹ4'cZxM+T$;#M%i&Z1dXpdxӌIkvEE@?C6,˘)ImYgQމ=mYlJe(M-A״ZA4RZ'譣< 4W&V}סe[\( {F?qCE{4(⺹PZKqMɼ~SmϤeT޷]_}- NX݅h-D2)Op})лVOxBZ.94=b֒} O`z*z[03L-JJwWWKj 9+xϤI)WR\FhF]ZW3y9e)ZҐsHgAYbhX b{ߑVvPr,DQ BW:}dskĥl_c^ӫe* cBxm;~,yx|+ @P`@ 3#]/e?f8L&({GtXk9>=e67;nm2Q3MŭvR^e)E?Z{s=*5PR{)Nul9b2e^)Oz֛-I3LH҄}iψW8>sC?k*LF#ʺm[4%Ͳ~(Z,&:EIviFTpzd cf֢1fhNY=h=ZA$fY+Qa} Š5J"v+ A ၺv3z{k]ݯS.8lWloG[]]]})0± LVp0P;i`  l`R8ٱY&$ҤZt =AQ5l=)n"&cw}><ʝdTęi7(;Jd} ܌o \敜mϿ 9iдDե4]]낇⩤j+-M/ G[Jӱ@sPP<➑# ]!zKЏ){"._@P33ˏ[P+ށ O@֏AO!: \!Lէ@ݢɐb@PNPi8 !\kP[+ Fk_sX@0X^""k[U;`.]J"0RQBY?YL{,vWVR͆ibo#3ߛqh%Li{KjbKeX)Q󞳳3e9 c).צZîmj hZ)zD衸qRodýn<: ϿO_иy]{j@TAkfzX 3vݮ;[+،``(82-!잋P:ó@#RLW?e::A'RfaL4XIoV i{ y]IB\ LOD'dg[x])˕Љυ3y['4.)?bpڼh;xcІԦ0;r$䳓ݕWE5`A0h.`$ԣ8c[Sl燒=TtL~ qNε(AUvU}yKrL8AF@3TUO_Aj?R(BϦSbGߵT`k%< !O ,'v7o)}nljQ8JIװ}0)g{ʲXOgucRݮclߐ>6O>ݻ7ko?wy|%G\\\ͷWXјz 0lf A3ߛsQmn ZnےQC|B t&MO82Mxu ψ1MonIMhAA_}on0m&R,j:P4FkFۭrau6M{dA0k^O5(V44 CfEՂICBb ٜ)jޑKh;(9hryweV0ٟ%1Qӧ4y&舔8MyjWlFgF1Պ(!Ibz'i+$oA61M  NE&C|)mo]Oᇜ1ZGmOߋ[(vb;K'$Xl6[h;]?^r|Q 4u҃(qPXiۯ4)N_C5Zb W)8%3&'4 ZP &4O;[oWs!vݮ%x" aGuq1z/ac@4?D|)1<3]kzރw KBJIl^DмWɞa" GW^B*NE0=-v)S7L(^F"uB8 %S,T\?V%ǽDO#CW< +N%'|#їބL%P0gOL" ]Sz& E7eJV<WBx(M]'m9f)ײHxq!|ȎD(Rfp GC`&>j074]`+FD=ФzDQ*EB0/h(U 4}uq|,-S7)Ή#9G`m[SW}M6%/<=`oj" #~l 0|'t% JmY|jEu m1N  5Qbtz{x# YEAP;g`a9u"cʺfYTXmm7ӌcL Nfb  !Ib0N)v[XadA t1pGmf[`{9. }\֫5)vE! [?B_IHe[h0 X<`<+f=679h4M躖ix 6<uޜvG`L8g\Qy]GQkS|3?8 ^(ʒlz&(&`e87L#q4#VKF/ bxBl:j[:簀S~h=kq!.d [KQ`8mOUU4Mv')f7"Ai*uHuik{аە3\F'<)5* P hEGQHhJ_V C%N&H`ۃu{GhmpBYaaE!ab<nYoRvݮoz4Ѿ8B-?N ׁ JC$lDbV+O)!_?ͅlgvOhYطP|;@˭4JV9=A7^ m 3|"S|x l>/OM41۵h,Z {!zұlAmJu!fPW1ZqP|$ sIt7nYɐ?8x 7&AKL._AoMF8g2{hִMOY$~M3СP!{zьzzqk&nx/ZgeYvB6MY0IF8 Q8 'Ole,~sMQuqȳ#!}q56o?{GG\n7i0iږKLpzzJ,%#> z\ٔX @AP/{ضeq~Nl9GG슒iHҔvdowc<1J,  Kv4mъkIzMlkݻG$v;v-H@~q([A: [Pwdܮun?rX)RFDv /P&/>i}dLއ"2X~}qjڭneYs'/EkA1:NB&E0e[] `=9wkۈ/`~+I}ᬸ79+NZsqn By\4a13q2ZSЋ\=4*p*A_KSP9[z&ZrjYRs~~NdiBQTUC:@&sʦgX2TmOkeg em[me>DUYPgD!A5w4u|6e+)?O>#B,% ئ͎C,ǩ+0R;%͜F&(=V2Ym60"NS.KܽǷ]qNf7NP(9v# X(Dh0V:17z$(s4[Vbqܵ=YbIr=\ 8U!C 0 qIKZ奙֡# * &DݯCۮkF$hͺ]v, 0>7ݞ={ w\B ZRB8q+`Oasu˧#i&-M-TC !Y IDATk h%LhU'R&'Oa} J1ڇ2 h%vHRK5*ؿ ?TP4Z-!}I6.BK] Ò\r&ATG%TwE'wv7rM6?MiAi'Iwwރ~_ W# 8@Xls*oʶ!$MZ)$+GCoa'o2꺢(#HdHD5"("s `:E~4RNCZ)0*d(hwmCDkE,PhX Q}eӶRmk1ȁތX6qHQV$qG0޹#j'Os>Ϟ?ꚣcA#9;?zV)ɲC.Y-̘uI]7eeZW?gflzFT]OG)Wyj:d yh'O`mG`(`[hI8NpΑ&4( ҄qbLNSDQњ$ni,6uMh4{A(-JEoX-fDaH׶-)|uν<{4R%I,"^ ZB] /?o<v)$srax<, lքQ'Pvހ\8IǢRg_}w=m׋r0? aҴ-E&SZh;"c&bf:nv=Fj~Ɛr?7Z 0:mA FGQ=i3e8'ׯeш((}c`Q`F6 nUJi^hfhNk +šSơBБ/]C[t7gwn]ӥO@?}W4Ү;|3H<ɏE})ETJ6 ]P=CA;WR_|ޅQ;+8x(+p`r$s\ y!(mڈiH5du8=4"|.E6]$Y Wd>x/%Pn;5 e_t}+%C+Mޅ͹|MFP~Kg+h.9 6B2Ͻ*}) ZM k~ %Lѽ>M 4ds2`h׵x mU]SV뮆k{ȶm6$i|F4t}/ҽpLk  ? Cں0sAj%MIl_ku]?0HӔ(v靓!%N3<|nGfa@,WkhϿxL(+]ha1Ϟ?gŘ dۖ WHҔL&".ޕ'LGa2&",=DŽ ʦdFUog޸4k[`趩bRG48фAwW/[㈮'%kY%ڈ#U${Oۊ]eh,t;K^ & (HOJam{X,d;٠xΞgRf_}2XʈFB-ǝwϠ=+q gqþ&9J0鑸Fn@nޔm$(F i78:D }tW?nsOŗp4!\o#p4Iߑh8J"|ɶ==ߓ/:V0v!} ~ &Rmr<RJ1LhV\kꊪ888jj$:a$qL[4U%E2v!{u'Bsd% z%i 'EbqF~b bE{&<ϨnJQ%w='u'~.lXO%4% CP8 }=1q)xD]߳4 OLZo WUG÷`~S.:O'}745L0Zucr oG1i*]+wfTa:4ECcgɳ-HU$I*[/xĺzxM5sԥqں&2b{zzJהuA5Su!Q\ج׼(RZ_c ͆)z8 //]9Fy}s~v6Li*1MF=`ܶ J grtxb I" Xg)hFaӚv˽{ǔUMtJeXkю /sQaHZvuu,͉jM۵t'Rn*%ڈVm}M}rR5qquy%(*ˬ햪,QJQw%r X mSSV%Jɰ#d6ĥ|!I,lr @3Z%~\98m[Pm]cN 5ކhMvݮ_Ϻn0ۙo.%j!ABЄFw-R@ڀ :; 74 XbEk%?c qв> IkiF]||_YM(E{_ɱ\ڥo\ &OV1oZK3 o><>&лw3^C6f3H1\ܢ9w;vh':؝vOd[b@=^_F0?cЁώEۡCAfXБxOq2fs W"_M7FP!4jkѠ0~6ځ Jf 㘪*o2.8&#Fq<(`Xmּ|dd:EC4P\.ȲLxCE!mPM΋¢$V=nC]Lc6-Q0y|4÷Oǟa4JRܽwi8MFced6,l̦hLѶg:/8{8Kۖ0)bǶ~~ɔgg(0Θ'U=Гzڮ#2!04' Z9.zǷAe)q1ϙL&uMUU#imru`8o缧m[8npҜ(mŎd( .^<:/.)f֚!I˫+t];HNN3..YmK:/wy<{I(P=>WjNLFOOIl6C9g\x0ak6ֲX,Ơ7>9ۖUYQ5* ɡc%QHw Q0%R?|,8ŮX,dy>XAoNeY ^xd2:GQ$ H}#OӔiج4Uzym$xO4ԍ8y/hF)}k8iV7. Ri<eBф4 P/:ރ6h &}n@JT\;sn]Z3)O߄נ3iELgsHODrh0},4%Q2]]uFЮ<0{ W$<C{)S}Bؕ;D$:٧au4Fd_ccHrѣLP:~4n NuH.G&o?imkz[=Ԯԩ3ܹvv7v,'qP(_ C$$>W@D)|!!8j"LHd뜚׼óNM8>ttԩZ{vzNM!>㉎f 0bv%7Bx, M!fZ>Ͽ OnU]AmKExx<&"5FBۚwjn^zo>1bg(:|ߗrFq5 q8&Mj[qA97dMNB4z"bgsʪAylw?y%q q?!p=\G뒶8s(W_єu`8X-qCn?ỳ1(jMHZ\]=|vw(BN4]dA@5#Fw7lV+ƃ!U#:G!(\BVkn!l0jB\rC0!;,"ggk,tJAԌC `8̨c4UQPly۞PU5LtB/Thk05(i;Ml+0a\r\IA"Xl?շQLk&=<X.,Vk[[ܽs,AU ۖm o '`A1 !UU[Hh( È$N GH]Eh늦/P&8 3A 8Jtx7Fa~?Ry}P^ -8 yW>'8|Y폿|"/Ots%\ofb4![!MU\6Q,nM\]O UgLR)d?*=yf-=Cim\l+{u'u_1]% zg 0׫p>>{o~Oek mJ @_J򯃷S8y]'ʟɯ=ku*`bv-׭\A+0=H;\l m`5t}3o$\BVh% |.Գl,A@-XF{ =NM%bp 5dvs}h?swnnWBeкx<#};ӮC)pH׶)˒hjmKۖ7tJrM€7#-I"{NuLhiV(q]Ei.K EUәt0l5mQ5,Y}=F- @.a{̗+ G#8s=x~|s q d#rLwi;qs=fX')>3n߹:Vk4E.Z }/0.Az>5/h1-a%!ѾK76ڛKOB<@&Ͻ]MtFkCEt]G۴l$ׁ|Wn3J"K9eq c>x@FlO&M1CܻwOK:\>|}ʦ# ʲd MU)751ڡs$" 2TkG|@ImCY@&sVJW&':k)z`@^cb6_bTsQ2L@2C\84ٜzz$qrauY_5IArk6DQr䞪@ s=M㺲Ԛ,(rʏմU %ZƘq_Yκ1|blGYdI)r-@!΂ \hVuj"JV*l 0otV>xٓ`ko_Wc^km(:꓿U璉_JÎL^ Az wĂ5`|E+<4I?޲mWmOw]_oB@B62Bi+1A@70|YOGKd"lJI98eW%b-!h0<`W{~\uE_A#Bl\bl 9N D?#tV (sEߒgPݒ#t1ge;Qr.NZ^v;O Hy9}^d)n<9pHl6("MS' 2^~tynlԈ 5pxY!l>ր :(W E-bbն%,nj>nWTu|fO>b9`#~ nZ֛+Fbݽ]ʢ /K1͆|Aj\u\__^t~yhkB XGQ5ࠔC'XcXX0duB0dZe孵!}ð%;==Ny>y^POhݦIJUtdr$qƒH0Ry%Q@,a@Y-NDB;~۷7N7epzzADE>WWb,`ѭ[U1MɳKGk‡OY44M֖:&1kH1uۑbP5-;;]KY&>#d(z& h-& [!]MY~kqzߪOQC<bt'O98<ӆj;v$+& u=)m <c-A`l7tot4/hlrOvq1^ =*wl:wb[n^2ω a%,f״uٯJX:.A7Hpp( UYTo^l^E^rAO&Z 2d=]ֿK^}-ByP8*w"i94 HBZ_Ȕ|Kue"?ճ>k" ~}8 &HW8:V>?y/{օ4˺)~(a pyVmw}9ߝ`o mٸ8r=L͍`s)vKJv #5kX[H&RPSyl[E MD%[!|i sB-[rX}yYhOo;JZ|,h4#qzq͔V¶OD?Ո߅\'\+?P}WQp=^DmےeJ8sr%]ׁLg3!4˰F\-Y.u$q,nOq*u!X.c8,Q,Z $b\עbyJp8eQ%-p\|d3z ../iچm:cCq[ G#(k[yỴ3.?]C[ oMĂЍL䏎XmrC0%q>ˆ C65Iz./B\r{φ΂%x~S%Q{>ժGDQDeLSV׉ֆx|֡($[)w]͚0p@X:a6x H!ME Urㄋ+EQ6$q:l;~O?~mۡj6M]y.(?c\Gv&[,s1p8 G}9Ѥـijvhͻ|Q\ IDAT4 Պgg= xYN@;吗%q6Xm}>Osmqdkkb8A!3%j;9I54aDQ`յEo8a֚Nw(80dm کh 0[0!b0ٲi 1QaA$ϏUvl%-ϥ./aōx G#xBFPcl#s>/H<gBb۬DcX }+au-azKuI*hچp+0hg.vk96%@Z 쑀t"n\ɁX*! jBӂ? -dG04?w{.O$T 1=b :f&dR-E$XWIZ˛Bbc۬?WoC` ZxG442 <ϣ, FP5,cwwS=aoo} FZbZ}S~ AyP.H{aDY68 Н,s,4 ;MiRB2u8xJY\Uf6_`7@ICߴroW5咦n Nt2L4.|yGhXM6 шqK4XXjmwp$irbkk&(C9=b:1$AwsZ')S5Bi9aoC +ضXed(:\?*O4uI1i۶wR@a^]K۴Nݾ`C)ܰQ.F8m]Q>-Ai-- R 06XĎuFt`mKxe4~tb') [m$^Nq""oyY/eﭼz?B p-щ4kmipkꟄFkaQ<&@yc3h7-8! Me 'u;أvOpMa67\hCگ?Os߃ɱg5%dw@|[aĹ |,zO꾖siր;{pU.嚵iD(PT"Z۟O+,A6m{0힀A(g_nG@ `TJ1,N9@>^ =lakZGBjA>Z@X5$YJYWk0UxVexݙ9Y' ,'O:cฌ&>f<*ENE8Jyk\A#X@]W}mmsD6l+~bn("usEGuN5E^:h( ($e^Q9A~!r]\h̦YqRڂQڰ\,qQ1Q$2afxAn+wo XNXk:g3 |7?Yt"/e5;U1')|N^VQ,ᑾí[4mGUU1??&Y Hӌδ(} DhyY NYM1{{ciۆmƐ˼ B\cJoh XMqxan=HxvA@ cp(W !Aʣ;O9ݚnuGhZkXv\qBZ]^/ږެN\uEv+y" `_#yC<{,b/488~^zY( dnC πPXMhB<r n)P /$pymΏb!ig@ ' Mdci\Dte:?'D  3IΆpmcu ?a#ָ''&A'[ F_\K幬O&uDouP{~,zE _R q=b@p.${Krm$V2.ʹٶL^`Yj\ע'93PlnYVe)PGdrض8eIJegg( !a'y {$Q)J)֫˒(hm-֌c|CK%GI3NZ#WJOfXbAETUJg, )1d Cjj;=j73b61FxZbCEek$:(<'B4%VRCQ7B2lh4Ji K$il6%d<;9A@4 +>g4ˈ?NpFtU+o1(R]Gd"s/dzzbtvjh4n*)7+,WWYnI""i (kN]K|_*OP?sB׿ֵ1߹y믂> -T'"V4ۯ狙Шp n 01|M:0Ur~ʅp bwr!L`("uWŊ6{?!a`\ǮE4H@I| `}_ Vq*ۆׂ 5x;haѷX Ft6-+{B3Zm5sCur#KYou 2VI.QIp\o]k b]7]m6 eY2%6U0 yb>{븺leAu*|{J9O$G l6U(lc`S]CuDa_ռUtfmK@&Gnq|6:}ʣG)o}y^WǷoÇY0\ŏB8m4rHk;\||_12Økf-Ja% ִcy7\%mbze]3ѝ}Ik{Xs8`k=iZ,B6yDXzeqk(Waa]1>Ҋs=Wu-L%ߖ{>WI?Bat:e?O<~'O_W9׸w^o-GI<OeJg g(ײE71 [0a>~`:B1?Jlo5yB(iٝ2!:rѩTc|@㻾I ^pd#'. |~3l$kphrNKImv=c q%q0mt:%R>`U2w]l&/&"&;43bZÐxGDilNۊ^o!X,˒(iz yW8~( C39QGq~qR.uN Y6}8!"#,A)EkE%KSiރ^l\n GuK:b>jzM1mk.xbLZ+E~Ws( i]ױs$\\^uyP׿ !l0iwʓ'OhVF(E/֯ufTUE-Imbg ȏj Z85.o(bq}FP~blp@^zZda(VJ]t-[8%4mCX`^㹮vhjP.aC(i[DE0&$G« U(M'iVI;i1PW5E8`hD n5VTS[]_O?$)?cѝܹ{}klſ/u/k5++a ci7iv"F(Jܭ> p$~,%P;4gd3仮4ʕ?mjSh [lLo:SAOj@G5f^wCQo֛(B{Z-5^7=řWIk\Z텱"~{Rp 9?$."x3>9b)"MW=LyCC [*rBX?оLܿ5DX ':mO 2n,۶ŕ&y]lpu6 eYq]Z.Y KQJr.Fx?~gD}Ӻ٬1Fxغ+mqb5tG]Mf;\\^q}}<{άߤ8JsR!#9~Y5録(q] I"qêVxJq8_\]^`e:o)J"q9>CvӄI"IMNQ\mje 0qh8`ހ5N\ܫAf\i1B{QJJ71!KDQ%5ufÀ`6'_f$Y&%VJazWE~@YVBn>MVӱ;D W3h:t6'dܽwg8y#0ڠf27m DVi,ԮB>{zSp}:m888@zA>V^{5<ren)ՠF0zKx_K.zkՕ85Sk` @Eo"-4F(FC踞uovd~"){]H0D?̻k7C/,mWKiX<֭k0:%VD'}NEĪv~!WP"ݒmEW l/^ͥǰ+/J/eCd:۔d$U͇\ESy]}ʇ}[Nխ^$~,.;ފwͧ$ 2VI0 n6/B V5u]Pn|C1 \c>X#kdkP%Q$F#ԏl6 y)֌cSߺG}̃G'ܺǻ˷>,y7c޻ı8L5MC\cuK^p|k7^7y!m,Q$v`"q}r鴥sp,FVe#rf5Ƒ$v'EGao;Y.\lF5aTUκ4M$-B"BYJl^8?aX//"iaZu) ~*} k4qC60 Ð"/Ȳk-ySU6iJ^edwЪc{8yQǣǏnRO>qD-ɖֽT4lo) {{{I K0Fs1e`q Gtw8<:Sba4# <4qB(wj(4^&qg4ijME CpE(- $;b0h cAHɋ4M{!.[P Q шd^Qжٔn從VX\& múl(ZɳSf rvvNJ罛y(RUzYVKʢ MbY&u\:r(Ƹ@6ՊZ[l1Xw /wS s@Yxr!-ڿSO|gzY$R*ۄpy89x+# >l쟣we¿9`$`A%ִDz-'0{ V{]6wقl"^}N6/ G9J^CDn- ywaE]Pra,.dSpz׵< ږfʶtrl-^ nW Ǜ>5|K)WagdSVrC~9 ^ca^+yz)w,Y IDAT'|Eܮky](_XF7~ۅk{h4bgg}( 0bڋ=7dݻ(uN[5̦30mjMOO}ߧkNrY̮_ /Жk$a!Ah{Qjn;(Iv}''Y*8be DcUC;o8d2gױZn}CQq2]G[ =rq۝` iqVaM:E.QLU8@{Dxs/8AkMYӧjwlooOpQ Urt m-,W >qvqzd\yeY08<<Ⓖ(ݵ+B_>ۻ8c\!܀$I1ơ )ʜ0 À4MylA]t% % "Bf#*:HvFoyǧ~kzG0muVWaX2_.ZM5̗sNcq\ m[~xuqx88(J}/ c.[\ ahR5% ipڦz8uKٴxqqVSt F1eY 咶m{xY/Eydo|olo-1ܟ ?%߿?}Y_-Fh>-MI\[&P\˄ Hwh*9V L `􎀐v.6$x?'CwW`*st"nTQ,Is_BݓGw).M`Ȇf=/+H0|VO{ Y%ePJj!ۍB5qCUsUN_^-UhTߴFrT7".0s*9t5l[[z O ;JuP '0 jNʆDo8KUUETU ў5MiF1]q~~pi0 %U4MKQmZcXؐDQ2]u1GՍx6}|5556yOpɟ~Yu]ӵŒ6e9^2XGܞ1OcIӌǏw>fqͳgxC@154MY ?Ly9M.Tl8! C"kG@ԌIő\Ϯ. 6}J\հB& )'G,#߬Y(Y1e5Y%1"_Gq/6wph=Wr%MBnwwv 5MNe CMU!|K "!pxAh8$tO|LY7\ϦloiO-h:dkmy!if!KSSQW9su}-V0d{!eY18:EY8ʣ\B^mVlum ^6,KL %E{ڠgKkrHCƓm(+4O`{j|*Fkbr0""1>F Acz&dYƦȋrI$84ZKhʫ~͆k&$$c8Q%XpYEmHyưG[mCt和$@ hB aZf9;_Λ_MͿ}ߣ( ʲSx 4E׵C—KQh-cTe! [ܞ=;nl6[ƣuH,b y!M2M%24 +; `pxx@ۑ$1łxq&mi*d$JACB=GQ.sw[(d6 'O %{ax4F'ܺscȄ5ILVbf,Cg[\ m+n"8Ѫ#s4a6g4sqqeYȋml}Hyc;vJ8x>暪B]w]^}ƶhHL|NMGTضj;vtmC۶8Պ.ƍ8^r:O@?clGLij3ш,(kaub̢jڶz`!M۲\.Is13}\8u]_㧾Fogn92A(DdC O$!;9 祰"H#H>H(,Ia_\w l(ȍH}1[OgwEwC'e| ;U,TpxGrp<kRW4\wHX2IPJxG ǰ8/ҨN˴ed0z[x V&? ߒBD݅O?KR fU0y[a3.IYLPR{iIt߆Vb}Ȅ܀n xN>g>Ȳ% nG.$g-K! Cy 1Mӈt(25ј°{bZ )8R32 0y^>%TMK^u(c}ʢ<ϙl;S?ηPFdejC8o!뱋9Ucg]ZI \8>9Z$Yw$ixeܽ /hIq>F׋TJkI ZoV(mk|סd\"MTܺy |z,ˡi*\e98\?`:Q?ZEEcښc(˖)m '~ZTT/!XGeY,خ'$g!J$f6J)|q]%xG8$ 0r\a_J圔 <<7}/绝Au +Hg|?Bu*yC/AϠ['?ڢ 44e,єe(["Rhh-fMu,<6 c1EՐ%X]cA4Gx~>Y.2Oې u].u]ĩ4:@t];DiV؛SUW$ fzX@ng;HP*r8$3짍y RX+e/B2'TY nRdr=Y2ҌfֆzCY5шvi.$=f2wE| E.T ܲl9EYoIǼwW5Ϟ=s`:/XwA[79==Qd$ rmڬdK^7\mvtB;z(/xOGԴMCtE=PJa@viێˊPQje,b۲| WW̦S8OfI~ۖ0&dqlo1BhIjjFCYdY&{ a(Ea2 YgmSCoiJ%^ lci) ei>Z)fHmovaXsGʫz^/n) oB&] y"EHNyn+/RM (-j&r#r"YJZiP>FV{xFd]ߑ^c1WO?{ j u1eWd_ »W`U*H0@3!^Y8}Wp l/)b' eIwS5qߒF`rEOnH.d̠UF2-&p 9,daJ>˾{E4=O {a6=/x}n|Oo,0UeQP:rV@B=tewU-zvtX!hu͚(r1]m~@׉ X?%K,#|nܼŝwxzr£G˫yo!t;_ ?ʒ,Zbu2-CQĻNRUٌd|9~zb>eyuvpq"F؎ ʰu+f8h2(+-.( iEJWYdK([ȳxq"* Rt6bW" |XIӌL/dMejxR^"mOme[Yh<*VUIJmОK1 "#]T/F]וAF8~l)0릢jZBvaqpnuFE,/.X\'>)iJzSUS1ҜHc=;k89yFl(놽9,ը"mqMbp5ήiLm;~JVJnpmivdbkRf[9mדeЄ{äe+e|hBYWDa5izm@$'슶軎 l6 'SIJ){ߵ-m XY84(J؛MUj`tؒLes\B"z{`iq|SA@qkHRl[4'%z^/{1-a~GR8V r{Ȑj-PթxW])n%Xsi@Zf jVPBÁ Hu?LU.`~֏Ev53I>:HlNErTL>ʝ4%ʓ D}H TSRdMq-dҤ˰<ƪ-rĨ\O`}8 PЧ"^"pn3g|fJ]@ISޑf'[rߗs:zG2؞F)^#<m@F^O L>M eYc ui^DaSeY(BQZ4`w w8Q帮K$jˎcr\CeA neQydm,JGIm+P|mfG9yzr(m|C}gU+S4m/6J eqTʢm{-0ӌ'iiێ0陀r9vS^m!eQP9I4-I)4%mv1W5Af 1eQؗ\6u|"Dz4m0`˒vO|L #+}KSw4D8k%D*i4o꾣k%U"* e2TCɗg׾\/s}/\Ȍ Ccv_A~>x+ߺYɎ=43O ҏ0U_B7`4"xt_<7ۀ d9^1W 襱(x 2r cxչȄ \<Ub ,m5ıbЦbe^;bt_٫a6d5ilr V2=!弢W! S9_!7$K;Q*.ەɓ=-̯ó@ ޕ*߮L@C@|um$&öVt]ETUCQF+QC!fKmcw䅔C5m'0ٍ8XF:6h|'Mz'1<ĀN"i*Ų]-+ vv`>ڲq=mTlV]9uUz>ј'p0Z&iӵܕ(Kz<}zh4+nvw~jn;Zb3 q! |lJ&\,bteƈ:bZo6-žRhcSÄ*sڦBwmcټhF,Jiui;j]NEhc>z`R4Ud4B=I~;M6bo6c4 vmCoH{(P!]:(AkEiJ]4uM=δ]C5a[c65K|% |<}Tz^o~;x{%;D U.GKZ_}]VcDaFp_dWu)#}=G#BuM Dv&tӾ@oAhͩ49O-, ۆ÷E>;Cx[;Sck g9+44"=S$ʠ8恼@%= =׆_1pg$yL. @/V C!O~J$p0 *VBnj9G/)wC~4 b9Y P\ 5v_K9tԞcf 0U$HAW=nQ4ij<<ϗ$%&}K% Ѱ JM1inh0Zm9ע q H;*me_/Ȋm[ QF ƣG҄kZ4B*Q1R7 |1e1YmvDRo,˙L)KYHdGuC6d$"W+FPR mYb 0ڰneE$)Gנﰌ!Ib a8YP%] ?8]͆29;;7o˱F#` M[X7s.oq 1S?FEc$Bs,LBڮ쒦-ԴⒶzgk p_ږ]+.ijꪢ.K,gS1EAQCeшhBYu|oh<,|DOaٵ a' %U]qtxl:e\ umUlh1c eSU] oñ-;b:`[IQZâ-'wPx2}er\Km0`Ki dW@ U tR|xR+*xA.ˎHaJ+Q}]O-Xwߑև])nT&,R51JHўM.&rw,EzwH DUmB[)o <4>/qB$k$J)lx$ȥL2J+ZDӱ=\d{"yJ`zv(M~ s6"o>:$Wr~]/18"ki=lO<sa7H;-}'7] J̔HOuR")*Z\yѡ(RvBD;$ձDnTE iĬj\Ws6aY wЉL[Zy[( Ow⪒,x}~) g<۬VkN>!/Jnߺzf:LZ#MR8G&"U3뒾0GUWe ,B ,eYԦa67 cm,$wy`WlJl6C! HY"S;9yJ3 ||? Ia:t]ó5Pn6V\~$I(0_{9EUq&MSD#+V֞-39gIL&T-]}?~̽W#<֭Te $!sT@yQưll(Y@Wͦ)}1\շ^;޻B_[o}H ts\zmЖa4 m'&l:B܎w[f=x'1oIJS C1=PFsuSS%J kS׍Lӆx`5]L&ciGe-F}'_C߀`ezERTeA*d?51GW+ V8|a}OV%CF-Xiږkl<4bI2Ux;suu87 4%yQ5{{ 2*w˺i0F\#eA@v;'3 ri u[<ϓKz`)'''U XBywOOgc6+f=6$d11nV(BV%Ifyگl;_}oo7~k_y7+ed>qq2K;hPEuryuo4%qQvC"}QɄzz3gEÛoN50f!씫+ܹ4yE#BcSnˁ{6з MQ؎M$F" CcYlFye Xurb@{ɩ<k O 3]!b =$KE"wE] VMGPr Աsy=SI+\/a}nQW9y7"S<űyݐ6 nK]7t0'DO:6]۠_ NdFkB+\;.єuMtCِ~1p]Vݎhe,V劦8ֺ k 7w-v$.s4|6`1'=<0ˆ9{qy]ofe4Ngll]eS<~iz8.M%^QVW}G]Gۊ8;{"Zqʲ`^1ml,x(E# S:W#iS[pznܸAvD;M(:*2t1<4Mq\(wؙVJ1LіM\m8?9^s.뒶hDZjyTM:d2?do`e'|LQܹ},ٽH^^b@,eEݴhcQV5MuۑU-%-E|cbk;Y~eyuoGm_m];w,Tӷ5UU,PuYk׮JB[Z$6$ c3NHEh@SUMM4Bv\GCZ}m]:7=rz ֻa0L8vi&>ST ( 벋xPʦBSפi?FLgteJuqq쒘m,~)+l ے(z#q͛ }~+eIgz^Oߪ W<X=_$n5n0M7Bn)MGCGRn%%&^bxy_\~_zhcuMC:ؖk[n#86gp]q]zE۲Yhj1aCKdmԵ4}M]& Q;4dYiZ%=t@)EU7D|y)defb1 fqpboOlzi3hc2c6=:P4=m#x Qc^u%m+dHzz$I)GxzrBہm8"+V33W ]˓G̦vkq~vۯ?`|8k?.OOle-bmi57d8657_ǶM!~d2!3mk욊J şQ="RU`ЃQaY6MӢ˒ $vXUM|:zFkݎxL$uCݴ(`2 C)^`}zKY,Wki2/xg?Ҩ㿆0&Ed=O`/|'] #fϋ귡 |zNv'C>z"M(L=s!HlX6S1A߁RD΃F0}49b$tK.}(?ʓ=Gr ˓#N2( 70]@"WǰNeߋ G;"Av /R}OHE,Pߒ4 KAx]JMe>ᚄw(cٕ\+r &_!! } t7LCr:"P/q10>h 5aY<^kQϱ䲋{T Dz)"Mwwhz,^DS{Ե$٨)*a>uML&*IS0DQHtE<7ʊ1UO>FTyQ`i\{DTwXZaTl2(qmʌ.)ׯK"|d"Ō|Dx2%I3$Ʋ4nbɲ pa@v'ނYeGn$M Z˵5KV mW>9lX.(PHmKx+`ŋ I* Bjh2eZ- -!9Y7Ht];D ("2,l6udQr8~D|1mɴ+"_YFQe) %Φ6j݉?mYPdve4 X$i(6 Aկ} WK{v]M4ysoݏkY/Y%_/?sKt_ xM~=0/p)+ށ3+=PzqoT lFX$[DTNҩ+k5oIR)KH@05_.z > ?'=)PHwE*@w(2m%y>G)U]\ISgF |` 6IBI3G$uܙ-[V :!L& ]HY~_gٙbsC}5}(E놨/q~؍Wk_B FѾDB#N\~#zCt յ5][aY-C[:|Ɠ#IgquGcL%͖hqٵ;t":^ˆy ?s7\a`,P"XMCҶ-` YF$IGEU㠇kOaiM]FmQB- @x_!^"۶u`L3!nsוXUݎ;w q>4ˈ!ISV1=H|>Gkޔ$IÏ0:6gWWpv7F |?[~,~AuƗog$ neK: W)+njo\l?5W(;$&CR0 fFiB\+9?`7!Sibʇbx,#?|NKeu;d"1J& 9}#t׶蕆2 IDAT,tzHt1ΤHVb]guR@K'rӊW(>6ڦzi-yZ5W3r6)R[vA'$ uA M#F<[d(%y3=<OCYIQ"eKT3]j}O˂fmLeyAK::txm]z.XPlt-,CY7j$F mu-z;Iũhۖd0($w0e+J(ij=Jq$ dW˕D+}XZR"7k1ozqQU5,U:mbV{ZIz0XDV~y.n/]3V, Dφd0$r@Qcڎ̉P)t2K!| + ij޽C^<~X^Z6ڭyd:% |3L;4mMS!/=3 , VE1)6u@Ӷ8wjIjҕ4YQ1(c[xh՜Fm|@)t Z<9dY0I@ҡA>vCU!'ORŵ#=Nzٽ,k\eʲ$n22x?n_4z?-{ß"ދOP>X?otWꃻQd")W0ޓl!~N_f`)x`_f &DtlZnWrdpπ*Ȃ\vHOMb\G#Fn[]a\@R7yM_J404z$z:YWJ [NVޓ]X>0<Sy`;p~g>#Q?3Z@qc.䗠 |(@?SlE Vo-% ?DBmmHgRglyz?Pb4Z` K4͝hqjRD^ mm;,[CXc"QoE!J٬ mۢ,My[۳8JVG5{.uc"' |躖v1CVL͊Δ"i;;r0f+M8.Ʋ(E4؎+i;^:b;7oRUE߃!E6M^ġ0D߫~{[6[xyw$<yF$Rd8q_[Ct-, 6hcprlNq$m ,8=;zM6M1FmeEN1aBUw-EKBx47[%|hq=.f\\\'1n"M3i% pMQ>z—JP٬1beAL΀m\/b2uXtj1gg6Uu}QP.qȲhꚪ,ɋ%jU%hrRU%4e8_c[)nYsƀӳs%/>s2ʦٙ8~78<{QWǧ<L48/BaYx V) t$5>!0 ]Pzװ{0{]2$cʇ'a;fka7 .N6ME.QS!Օ &Yϲ_Iw OZ rNZL$K%\ /Y6} SZ6ScY7ӳ'P !|Ny8;Zuqq%Dv"" >:d_Yb 3I Gl_ou}} Ú~hl FLo6r\,NwxvJpc]I{>18m+c JmӶkn.mSUoXhӢbꪦi ʡ(>oߑN:ӲmEV8.gҀGJ +8`4$S4x>¸[1Msc, 뚦Z-ӸFW5eQ bWeYye4xUd Ð<cbg6mZ\G>ި-IQ^oޮ%37d0PVUo.$"E!&\_1qLӊhH:XFQUqt\^^:miK)6-6R%iVUUvDP ^U㇞0_Eid@<=9%b% łG'F)MQU%i^7{ꫯrtp5v/=k{uh4&ijm ].R$h# 9qSUA#Ӕ{(J6Ei򲒒mg 9i2"\1a\iEWKT)WD a%BC]xlwi{~[ßyO3, 8Ӽ>>-(:o;ȇ t8w]{k0TBx[ (&si.PEn?@tGؾg'z7?ز`y" O[p|  ƽ"II9Ԉwci0_jmyˇrY皮Dj4<{ؿ+?L\WKʕ/M„<+ wDu{=Z ʕv\ʺwuAXR|:@# ]z6"r~zua 2| qÀ"IjV3EkP qq]GX>6;DQD{4,+Dn ./yܲ,BՊ|r)Nupz$ 8iJfM9:<B5#Eze%14j_ˢi5UtdKYwض׶8Ѹ.s./z3J8NJvZd"M#8StI|,P5HZ,Y$IkmJ,f4d8[L&RbX@xLg,%շ,4tqde]3>i1_.rBe4QUbήk1aH'F[q0- ,r׿mۊouM,WhP{1iۯ_xHjTF_b`XHjޤʰęf0{fj2{|yU(L?>oo} E*U=D]"[*@$޴`+y 1dDl)ʊ6O0ZSy_{$1J*1L'XM^fa2aP]exlCUl5eۡ;MZ8"saꚪnqq/2Xɶ,mAk \#3! H39DҌ˿f<rxp.'G yQ@n Gޔe͆)C4+4ω%I1A(r>'2ǬkE },%(J 0P+,,wpHմqBYU e.&k?h4,r$"疁pix.H#C!GG,K$Fxy{eYsuyɛo im޽׷ 8U]Q ߆RtFЇYN׵$IT遍MGI} d|GO'G w޿L<~u4ӬGOz}/$pny8?S0\C1^|m.@y,f-ކ]5O2AŒ\.d bP3~Wav%SźMVFJ1?2EG"er\| ?CAڳ#. B@L!|Mo8t)QE&R ݩ6hp{xO%᫾42vJQ.+{7ئ㺘Q_ȵ}NI 3}+Xbȩkò}ޖY6 a)ip^Ҵ$.k;E8`Ӷҗ1R5RN$ MReaTmڧybwM+#%^m)eMulEYJoDYXseٵ\)E۶W+^|%>}*~www À 7JsjqGߓfC}=f\^z۶㺬k{uVd@݈~M0[  #uh0h?Jza^u-mY^]2lV s'ٿq'8ݑ.];5c(c8URl8cK cjl[Ck[E:j%ƀ{㹒Y^5' \#r>'"'%-;$dRJ m.qCC4MK$l[i:V),f8ae{m#ofUUaOoI^a?x??^٦)b.3㘝FdLg-wywD0ٗ4=4 M.6q5O#}eٰy2Y^Y/,TXW ^#" @ f;>-Ez%G}y*u&nPg 8O`_@Gb0!C)P]?b!/C%X'@>yn7zɤg.d|M a `0t+@'$ֶ10oa{{,2h;zSSvw?e7 Y˰kd>kd} sK{rҞEf.E%rٛŸ8>F~7{)H솟?cA۶Q)EƷ( eY,%1lWHvH(XJ@4x :C]WE#2&Mʲo[XV8}iYo]-Z-fTm O&JY71fZa6񘦪Xqu֋m/=^€6-cڛ,ZMڀHxYT]RWUQmXMeX`4X.WxC'nӚzsmKCK a:vx,9$!nٮeIضzb<m!IC[˺[ƀ-f1rm~lGzbAx+-X}׍D6mSxLY ݼuˋKMi+wF\<~wXcN38_--HKN?aLfSE`-uR&˶TlR ubk0/(BZ] 7n$JhQJvL]@l[!ӝ)l6K)rl e[n(B>ш}0uMgmC!"!sxYsqy)׾QU07}l6.K6 UYg,|UJ[K{{L�ڰ٬$u]0J⾈҃>%#}m(b8H};8Nkiꊺ. v|V^O?,?Č|s~axu4^,?kG=lGxW0NįvH{ >-KTS%wB=[ނ}) _r?V8}Wv}a=vLfPp=#;.sj%ҟ~_LH*7!d4~S"g-? _ Sb_-Pna"k69 (X<ܝCCb8ÿ)^ە܏ VCr&ұr+@ks W ԯ ^C.9xY5xOF\ 'mHnC=" 1/F~1m 5 a&El79 ЦCkr}!M+kuóAJ9-%S]kCG m#E{{&ϥJ,f\a[;)Jf7k4#"NNh[QVX6痔em[y.%]{Q"?ʪbް!~ \\IZJ瀥5hcOjʺa:PфAHج3lcĶh뚴TMtgF Q\6MC]Ҳ/n0O54b` y]GJܯE], 8&%6v\JqE}n;izo]mߗ$h$5{{4Mjl[1= kk>”>k6-i^ F8" -ׂ}n3IW<:xC{~D^)rlmmnݻp<=-~E!i.-68C5yUیM.]!6xAyxfowx0H?9?!NI޽x<&#_]]8<`ow6Puܽ{O++FkP|eizvoc/+G.``熰'߆Ov_CnlX]JwC]Ktr?4VgWC=AUPA,X'f7ewy[b.wcًE"CX_pMX1ٰ,9P5=hoB+Lӗ-OĸaZl #7w/Ip֔JdMWeOX{pY!X`4FC<ĭJ41&$ QW݇^½ LȤ>cA ݮ2>m1eSDd:008;9E)@1|u{_v#eާy>d2s\Gvy/s|ƍ#)2e]11X<~0jXd=(˚˫Kۜ7b0H</v,K8#g7nd^3a4M3e0ReAi@Arݐᵜ++ޤ80F4QaӌCk:miےM%C[AR]׊ Qur0FD*%M]˰ AB؎z,V+e%ﺮ-"i;0$ksS([ Tж4m1t#,EExo]FØas.ѐ)K{߽6lǣlq܀Xm2,z({٭0B&0  (!<~jl־lF F;3(b2az#޽K;&1q͆w>I3$p~_ha(cOOi-f/򊬯`hݝ|f:۵=sm:łsc^r||Goqtg{%jyG)1<} x^a2PUo">8b |{]rdXo0Nxx8&NG~_(\?q 5Ojx, y_+G߲ē1C8}[i+}7$>Dċ0@>?D$$x{=ñS+XdW n9Uma\CKmCzbL]@`ݵ`]<}iy(knS]Ht%oE.eOJ'ratK_U&f!Q^$z#A#rl%>4 $ʶ;ŽSUIυʹsa2t۳MXcaj3%?|?||,ȸ{O "<~KR2LƴMvaZjo)42 ʧ6W-((n8b XVU[9<:Kݽ{"R6uۈG N$IL]qX;.eM36-0tW FC1Ș!㾼k>msqyE׊hww|vŲ,@ҙ4=DԠRu{VkLn₺x8@,&/+ YgR.~dl7k*\[:lP62)PumK2 H-vMv%X˦%"G eY$ugIdYfe:^iu GhEi%liG9xIBY\\\<}zڰ3ٮW.+OoL?[v _+o7u/g|~=ű\iU&[3e\M&$3pESeiF {gLǰ/{&u q%qQ^\B=8U6$+/S+~ɧ~ZϲcIV)y˙8qgģW× 2(yM]!3<1w| [@' kyr%22/'bBI=ݐy.fq! Yݑa{ E1uݱ--Υ~EǛ+aU: w(١xmUx G~}7Eu>`>J%/gMDԥ=s9]>i Gia{._>s#: Tm&R?d&]=%pzH X?Z1_,LA@gQ/@QTU%?{ѵ mkQ-{Rbv}jEEr~`8HgnʫѶ ?[(&r֛-=}0d8P5ggL&Svwq&C]suF)2C],bzXb| gg52r]w?ubʭY#eж2D/cۑepojWh ɮȅ1Ma{-thFK_Bh` 7,~ρَx"{/"ׅ\7ePW.xrFL#,YB{_~nrAE;.`0bb?|M◅Y_NKb{5zZ#,K(-k"ZlmV$`u5WRnija9@m)4_U|53`JH۷,8bV þs}~,l8Cgt/i$a0H).ʶljx4" Um0Xtl?ښ$ ,f)OON<}~!!}ڶ(KNι{𽀋3m$c$!KeTEZ?>^Rd1C꺦(>V$ aQ/³)Yʵ- !0O׶tM7K<0MCeg[lWs//;_v<5` |lJYTMC;!o!<ںfqyE[(S3_A9A{pp5X~Vg5 _^ӯ~GX_`G4ڈ4(Q_$B xGvo~|_A2 okQ,ID ;؃_4M|6g"iV0{MJ&/aTXtr#lA up0,r{RWo'2=S`\?3ٕǼԳXR@Ab/U0;< ߎx;}CpߔP*8 izv 0}wE:!lԭz_PX@+.݉o+qAƯouUŜSܺ\y#eH@:A۴UXaIȇJ|1NCTUIuܸUbm4k^LSWWe9cY6t&޽oUfm*ѸѐjrK ѶlEkiFĔeG6t+#wmj%Rl,Ȳ,/ &IјqbY Hl4ڀeѶ-fC{ăol,`44mGڄaps+e`x?ꚪ*"? *EDŽaD4` qpԙ1ȶ[lKxG gu5ON b"#@qr@ Ub>G"z7Q=xl$ABXZ,X/$Kg,@qq{4uM%o{sK %e$8"t#mJfd瓧ڬ]f)ӝJ|o`]t*A)ż/{ l6(urr|BXp8$m"Zzb8benmbk[?~Luܿ|.=B:r$|dFM%EYk zcuFT? }|TqO)` s=[2BޗHLbO ݃ %d+ӵw>+'Up$N鱰"jk(72:Ca -\w"]yz ʑA5n$.$7!s|e8{!G")݀L7(7;A{xOVD4 #R(4,?&^ (u>XF? ~%I,@MuXL!>zӚ,O x 6[v V /k KUlij9{X48.!D֌1Pl[v~{PቿRPl}tۿ+h*W񘾴U\=2͸&ԥ zW0? vn1w>nUY;F7arSo}@KPM,1J}"^>LB]VDr]G8m`R@w}xRҷWJ;He텶~&dnsFhNdufn)'On S[>v^{#%,߂*@ ۇo>C pDH>3>٬䘓!_>lJ&ԕp; ettJl{ʅX*:pܒVBԌ1h^\ݸA$hk (n !"Jbc YV0(ĉsn(`Ƚ{3&j?~pzGSDdH|Phusx2M*Ɂh8"SeH?u |)$2^;TÆFzw IDATL>{xѨ=-sC;rڂdnuR}m޷)_z+zs>J3G2}6b[-od8vg2`qՑЬ임sH#װY=Dt@/\q-qҚxBSWu|wΰ(Zt^tY.ŇxKRҦA54uzk|e,Hݶ5x"[*hzg%Fhc#anth8dZZ # t e+.3F"0Jyb4Oϲ `|@iI^Ⱦ-4|q5|KҤyч1]L'c06j+E<:ZKOOOAi[)c8a4&L l2 Mtjh>$4?؝'G.Udy@l2dg:qXP+8?g#/2LE;Ç$(m˻sy5"隖F>͆'GGܾs/DLo}+f\n֜o5gsʪj79GD"{4l8R9ٌ͜{/ISmyI"NlEݖDDÄRDiSI(8;;m+oWcy~M!$RʟřPr ܸ >LwήI<w#+vXV_TyvR@IA 쉕>#HL4&pX,atHP}'>w? 2$Ts p5]]X[[TKٷ =8ű{[o/$#Lh(6P c=x_e1> d Mr6{qN_}]tݭ |~ Xl y+ ADUe)އ>m+Tuٔk>.bb$c%^YaE)}ձW\D)e|h"+8{ں5t2"<]fTp&ծ7K9dY)0ڐf"ڍHnJ,KB-F+RkHя1CkMy{G(Јh{FRG!N`&6kzDJ)$XUMP E<.D 靭L0;dX1;9Ʉ(mq12Ev,K&9'g2#IJd k,MSdy4JkzS9 {H*Ch4 `]aGlk%QvMnM?U $S)nC|4އ3Or|r^;;m|Õ9KsnIbY⼧".M#Ⲻ*̔UEf&NO+,jkؔ[,iZFi1 е e$Mh׸ueYǟPVE&YyWRfSV5U2)Qڠ$Y;wh;LJ};v[e;5ױ8?{s-y~i ل㣧|D$L&SB$|{߾?~į5WU:o7kt!:$~5\ %AhW ^OeI8}G6P d}tt]+Zzdܑcݻ#ZHs> 2و4!Fpg7D_ ȿ#v6kܖid 9lV0OΎx|gdl$#&v*a!iTrgOD|ƷZ9KNf~ ^QMJh郶`L&frу'_FɔasAaOderC93 2 eu4mCٻY#Ey+BRF wc1ŠM6*G{#6&'K ;|WS##VbI+6 ѽK*D)1xcN8FD ;N:Cb4;N?ȳy営mPDyx8m%.IIBm]BY \bdsγX!/Fd(:'t)e 6 VkיwZ%`H>2iMp"|?'| 3$ӫK,X, x:(O>+,$c%Itvh F5XkP['׬=@x1֖xD t-*zk4E[Cb MÃ}LZ0a8a]uLfsV|CCi[&H1,>;szzN6bUQ9y6{Iu6+pD=cF"n@|Tjml>rm RHX;-i"2ҀP6 Y^uU"Ms,@ 5J)%EI:H|$x[" m~{m*hi%P#ۥcZpvz ޡ\K9|a1d:%nIE*}HRFlo æ iDKa-ZAGq]ZÕkV5YFh;6 V$Ze%m Lb0֢U&9IQ;Ou$` mRTz ˋ!(M$iJ}'FI?8RQiچdFɇey|oĽk;.jE1b yWV g2s2mFE4mj,S7إ*&$1NhZR1 ,w"8g4amc֔ uY2@YD|T,gk inSY¡06>jƓ k {{F#>z5 1J1 c-ѐkob:Zסڵs~:#,cq~Φl8\X74]'ؿf9\qw}=O<(؞:;oKb0F3M rCeY2ϹvxM<9ٳg?=MkX#ӭpRxp< ږvKUV8;=Xl6ﶮjY(;GI]IVΎag8LlNmXZMvO/gyIYJoړoCOK>pH1l*EfYw6;> !f%{' b/?Ojio'k ୿١л0>Zt`罃M(B{*[PP=<.~ZhRm ~-l y+=.} 3~6.䁀f ?E~j7.. =I`-}]GYtmà(\us=Ʉ4nhDRZBPSӊuKbJZG(!pzz)m](]MxT("FcVcc6eIUUTM&k\Dáz)CO@&4XBF[Ѹ ׊4LGtRP#\ lN1((cAB2 Q$\G.%Zex/sD:49|MCY׌F#b4=EFL0V5ks k?œ'jI>w'cm h\SSd MUQ[rKS5h Kua"ҝ-%H)FGBDh$4Q+h"{tJ)U`0dqqj(DX$Yκٶhg!n NΩd1LM$3}H9*M8~4ؔ%ٜmɋJi$,b>E!9"2X& u䙕ȋms&kk^Ã]6eP ؖ[LeV\gܔb܋ǫ f"ͨ7Kj ?=W@UZ_7\ʵ8L ץs{@ BajZX>^"Ƴa0D<_HQ?s5x>}C>+_j%Ok"V?E8}.x?çh=} Тe(?t+ mX䆔V $?ŭ#9`玸pPW0{U"bֳ -$> =sŪ0T2E` =dfB  ӉCpC"ءЂVdshv%2_y}.Ȱi9J"*{kTzV=;M!zKH*&Eh4Ip="{QnXh- &Ƶ wwΗ/m49yDc,JRQ݉ڣŹL2lJ ^*5Flm'2.ݳWpINqӅ)&m.`3M5x#*2<9ۺ!rL|&ǐؔ[wWv1ph&І&3JPU$ix6yYQ0L 2kH VOk;$ɀfLG{45ް֑OɧnO^;?Oe4mbA]S%zZE؝Xr.l6)1fڔܸy|;!JiڶԱ 0]@i6t|gNQ 1RnKꦡsXPvjI^lX\,ȋ|>v8>)ǧ/3cwwo(S0):FBxf16V4G3Ys#IzdL&t]l:x[Zl&799>KϟQ ?0Ԍ#\[r!-mYu,p)8'FU8V'̈́gvb$wiɿ+w/&Wa>$ ݌4/hN(nڲT(-%nTJ)BTx hVЋu^߷oLkB871uISn ɘr ajW2kDu5)Y.|ԦAєmjy|˾( |8c0NM۠tmMהd&CCfT0Ak-B^cڬ(چdG?߇k/Gfw`8G(&ٳ>[ }i#Sz&YJ>Fi)k2yI_K Y"7~ LjOYt2u*?f<KLq#'#a+k'n^?>duQm^?u>rRX?]$@#|m;To½: ömK$Bq*+s;LPD'/$k"]ېh`<<[V!躎mp]"E5 4EuU1, Z\pc Yj!xڦhzV k &'&]m.S31X*Q:p R4G' hҖfc- Nj k,O~d~ߗŹ[Z6_ MH_E<#5 =YmA A;apL,m ރRؒxt IDAT?Pn"4L/>ӝӏE{3@Arv_$C(2i}S[w v|*D]Y-v38H&("nw=i j; v4S RV8@T}[̆BrL@(c~I/D.aj -ڎeϨg_0<, eᡕ'lq>\SE2dkŪyr ٟ*fR+1|VsI!skr# 5ea0clJtŕ`ѱ`IaP$yiOVW]am[.{MpIx hHM1F4#z8G[G)9P*pvrBpMr2=TEJyU7(cȋۿaYsvM}*)iYHB?ץMtg㽄MvCU8OIz$芬ik9CYa!M+CmUfx`8b[U<;>ǩi/SmbٮFZkQ`CV\ٗ%اŋb<MzP*Vےv/ ZL!Z{hXD;hZ>;]6.d2* uUYs6ڗYUH"I,$d(kt)וu+|BU$#^7^,ۯz.Hb`vg:S-nw\$(Z{lO9=xdA('v?@,çJI 8&im81W^Asܑs[n-_2xQ(Zމ}Im8~G%f;R((D(n&f!hEރM4)B!/ڔvnD > +x~W8{?ޙ + l.`zCE0B#~V X^/%@+@)YWD+ԫ/I—{{p M@yݾQJҶk..mӉr4iڦ*V.Զm} !i\*R۶JqQҚn:k%i{woZ5m1$ E`@i G 6+.;m[!jgI"]w}aΩ4}0{WEl|6La- 'sijI[IQچeϺ C uNivn<&IQƐX2 v$*'i j c )U8@UWľt]ZbTLA!b=I`m"䫾ﻎiVHqX"Mײެ) uD%. \$F(#/ *[纫k+I&'-M'%X}Mo<bs8S0ȲUњn(Ͱ6a e3lV9I `'FI <E(1!h"ORS&IHi^0NATheӜ4LOK`mJ Unnk/fs&V<"%ISQ:Vw(~AnX{Ob !+)Hx!gҸ#Me HD@!\9dieBO2I(wE#Wfޢ9w:/E7 .O_q| -iVg;ZD6~ n#s/&T@S{T&`.$p#ӿ?YUx.t_&g2PJn3/%й3-LXso>t 2|.k,zgH 8o0_$.M&=?Ff!V|@&>ց Gf(p!#lW(h'w܎vcG2AR Ȯ[Tr]I)0=˦pr??lj9eyC}K=8KP'~G?^]KpDg}1i:; j ESQ(hM!J B\x]ꤢNdC 1"@Q:5މ`U: nZ,J@&S9FhLVmkw/ִ!kDɶ,Lg\Ҝ{ZJLAy0!"C[ւU; *u&x2A["J/ů9"0oZB%Ir"wx/avމKT_/\,c Q 5] αޔtM 嘬.AB ƚ~S䶨X_֬Vaz'u9{{du[V>4X`h]SYM(eiN$4mw]J) 2Ēd&uHŒ庤%  `mh5um{SB&Izʲ,a-cIT譽3B}-gV]}&EY霣k[ڮ%xO t<">6n\1x5ij$j˒$Ip/3q.UCP @h#`%f0_Q.~ \`4Mw~2~/=ۃ_&`+\hPXَW5߉f"Cq 9Y'rz8H!ޒVR8oLRIGя|W p_z% ";@XIR 2}zv:I=sq_(VHw~s9EP݀obMd-:43ބ$ބ=ѷ[y9v_`uiq,ǛM\ڞ9߅?\{MoaK=`艅 tBl. Zɴ/?L3~_ 2KF'ҥv {:-hm{6SeNz(|ֽeus'I/߅AGI1`D45vK]uE[Wtm#O*b5MM]hFAeb(E׵B_TOHuSVtVh!Z "NjEiߔ=$ h"BOM]Sz 3 #ꪦ: (Ԗ-Y1d011Mi:/SڈBIť\0.A] >g" "QcܸZi2qBj;@ vak5Vk)Zܸ-mY(ijIb Y6Lbe`L1 !$aOQ4nj,CZp _xH $gܬ{LmiȄ*PQ65jh\jX.,/!Vu`Kuv#ɄpD6*$a۬aiN:20Ƣ&3\MDjM-=mJYcmVdihX`m[Zꦑ|H҄,, àcl M,E!^f6MBViSSx pY)]iJɝ (+/b}]োϛ>|/ƿh~S㟻_+owjY,arCRcg( S߆tc'ԫ$;"gg|8Gyb;zT"rLLAc*\+WBnPN6Rw4P~J7.䖒>rdwS;6} tJdΞd$' H- 40WIR>-Y;ID;[ ׾7?hswރt/ P -Ae:M륜߆V 0S.%/}~(pDhf(NBDr~.n+!wG<'M,εtd_X#+ $IOe^%]J"1ƞ HtgCzdDHӔT}1&tљ cPW[6%y0$JDBB©WZc4\dGz""#ZQ(޻I6TsșF2L&E~tn`FI&4$I{oUj%ֳ~~NDӍr2"N-2e!xC,6z޶d.eh^YV.E.) 2}ĖrrzƩ XG!GV J+ Mf["%nHcva0Is`{BF‾x{WKNO)ʊuX=eUa.g~|AfG)0uˢ,Q}tr&PF}4͖ 3k8ON*../0>m11#=D5wlkN&6kzȊm]S8b 6ӱ u"&#ö ybΙPLgT)Ʉj2*MRHfYYֆnrCK)k-""'IHc#x:u.뚺齧ȏM/a  &MHhQEQ0F,O.FChMgSѾBT0#i2WOSpm^{>n0|?n=9 O_>t=@^ HʭC:9J4i8WwC }{U8_߯FϡF)VxGyȪu } ^w^߆Gp_Dٱ@F7~ܷV>×`EKxo+*ʏ,TM[M2 7 ߀ى~>tmҐ,uV}_ VS(K^ ̏C߫ȟ@Xr0RO?*ho{.@%Q79C}_5}shYFyu`ސNg}1 Ce!YڂCRs31&ܨT'g %i889`:#K45`jlέ۷⽧!a22;RV2YƂ3)\ EAg"mî08%0]'q{B5F( 3#K#粑RuCrJH +B$F.Fr̹}콧*I,$34ؙJ<__@³u؟,볂OF}mg . }.p[g48}>RB+ nvhrlϡppiITכ~[#}$߆CE5'ךԗT6Eu@ҁo -KWRt/Go.uQ6 9H x7e'+ӻP R?+mN%r߃͉c}Z5$jeQ[ 阌%CWa;f&p*~W5J?az?2{AS[p㿓f9G #Qr;?u=;/t!jucSH LȑΜ tQ#b'M+QS8M@l4?홤BZGQMpYF]o^cߑg}E(&eZ[Sf=4mİ}przH$ʎk]OLfҩ8]'0M'M,OU uLi&˒3فmq6ljIy. `ŘNopO@8<>\Gq`RF Pc(g f#5,hKD뎾k]f.$z~5?dlZb;bXVM󋝐<њZCVN6=]/ m43fBz>PJozljw&ggO8vlNVM0yI#ۦaX} syVPS5m'',W^eI5(˒SK2Zzٹ4t] :01.Ѭ>VZAlD:GQѫB{Oiv9-I7okB Du0NBJX5eY!ewt2y ] ,{> *_z4wl:n'0pe8Fo7j|󿆋9t*`:O֪Cu#u֏^PћOo=_/AYp\{ABpxc l:Pޅ;/'wJ޾@Y\] E2V DR}-KB6UҶ,X_OvNڗ@s,ˇDǚhK/?Ф"Yr-:V?P}_vSͥo;QnH8UpwJ@&T{7NӢ9__g k }?8(W`·֌; P-2Bm8R $DCo3Yf1hW%g^EkY,.mKf;YdS&v%1x̉c97Df g-!XrC( r8_g<"( Hm}dR1Jf^AsNQ/jůޫ7alq> ɱtfȢ:1bV8H L|7(cY=9>>@I^}HY]OlȬaY\ۚm ʢh=auy0+oW\QJvtmGut]EDl\bIwrXm[ڦSMa3M墳nu+'ZK^Z& өHUY͆(p Gorv6yQBκm׳tuC,ut-fOZ9.Tc6@2&#ZC}O q̢p3(=֠"jjΉ!0Rc ۮ`NcT{h.|r: c)ˎ+~晾suwQғ(@5J&`HRK}͗?\Up|YgË>ve=̾&}\A ,<ѓ:(ꈻ2i'٨@7&+5To ~=tA-p7{o(8n꾞)ϥ D*Uiq WYſh:k `RZm.@:PʗUPN]b1m_`J3WjX7˔܋ڿ^G5]ʩ*]h4I[g!7\NaB4+o){nɷa}RϱBK.YrK}П 7wN4 Iz ; E 2}]sm7ky1TL'i1DCm{O4#i[Yz2f3su/M&Ĩ=](HѶusN] ä(uλV.D/}}(7%%M'@4,* kȬskkkezl$4?:H~c(r( ~'(#)#-˴ IDATiʔaph}E!Ci'UfXTB&q`P>QRzv>N4!xi\VL4YUrܸukIATmجMrbA>3;>]ӥ,s4͖v@Cc!23S+֫% ,spΤc-]'oMٜ+o<˩ Y^^ۚbjv!t=g W 65][㜎-ZKLg.FEQdB$[|vR 8+Ka:l!g@Hu.# ږ$=:eu,%Xm#I,(r .h\&MՆgq8L뿸1Oq'?e^",듀ೞy{f<b'D"d3ucg_R p*KK/0e NE )Jt/Cou%V$@Ԭ$jQNU?2_Fq@YIn2psٻ+9fN@W6n 4RG#'Z8NErה`.!G7Ⴧ ;_ʟ^Ӵ'a}bč@9{:דt6uM%ə&r-w(fm;֏L@!M~ %=7} cpQ-,bZ' P~Bڋ-hiPz:%4jr$D0$MXRYK(&DLt16%dɅԐ hQ5ڶ% uG/y-RhB[cHӥl'S7DD(c&FN92!ʡ@yLm #++fg2 MF4 ^#ޥ=+] I ,0@R7 &.'Gz,QFd'{| tI` ,'K[|L2'D|v|!QgYi-v!`rZcYojL&3dY0 M]S%Ep6Y/5[|qyyI׵t}ϦlLf3M2~m./.>PVSQNuv[,KKih\pFUdmMtmMH5RMуoj2&chi9$)X1sdsQyκ6$wxzbcd Vl\n/52닼vՙ}\Ҟо'?͹/>\5VS~DY V&skFy߾  S~GClXѸ:w˙8 ~"RewW d5|RӘߩe_(@X9n-?Pa,PfgB7Y>ޯ4]wuJE1p-xWKPM`>7, !q{԰uؾ/'UYǰ|$M!\ D4ҎIWTS߂FZЃq)LKx?L.Y \EQĐorRN l6Jeg{QvNNs#jXeб@|Hqp. FnQy.5ɹj֧!(-FZl6Y7@֘IGe,!CsV ;"=>tiB5]#_[)L,xLTlV%G) yYHܚO}=K! d;8NeA^@ee1[ i"[`-VV6ǀT^6 GtuiU兜&3>3>J&:zzGrr<)'{egdysu&3uz幼E!t:e2 T5*sd:tc !|>T36:Q QG%{Adֳ@]+Y=D=XѼdmp9(hFI@eИ,.%Q|`4OCO_Ha=KElqХ~O&EiS5 ߃;чAVK}+}@u,5S((mz Pkr8噴ۿkrڼiUѦwGW*cЄ$i,7G称 +߬ԬNoK$qoVciD^/wWuހ+`Rip\pc>  `@fpٷ4Z]kar(A~u,49_ Ȧts_L1Lq];GܛXtF1tO ("c~ `^;}ܩ lzq>uJإ| kLkMD3_+Ƚ{8cFbb\3eLj6O@UM@(2ʪ-|C,*,Ǻx 7ܖ,M' ]F>edErٲ<ͶiZZ5b@n"eQ,3/[Պ(,umeDG";|knǏ6'.#!F :M{-W%1!FȋɠŮjISoB(rf܀4Eb!e ]ʛ0rrXq !rH)ZʽȊw>hR 7\džɒ>MwX&c`vŤ^_$JW3Č1\2(ht~U~dj>:sƹN;1>Ky52>`NF !1\``a~C& )o忀~g8Q!n 79B XQ+:fq ԅEB>?~M@yթlx6|+8P C&Z|n\}װrz|OV'ߓ;T^q›?jTh,Lnj[1*d^JSEr*kXhU9dJgN}x`SOzh;ͱO{%TqS:]A 2.<*{NIBڂ-c(2M Db+P&,OS ѹItwv'zK>bZaz6ү0G`U;wTeUb3 DݧUy^(:D{}!|HC!aP%0}7DUd̦8iyfpx%][oلjVx B&Q3{͊M-2;հhZz˘L)%pu&c|6e`2prrLg rҴ=owS!NO]+p\^rն>pvzʭ[89=a2)>p.`M dGiNƤ}F@WZI >OY̦3BtO+QY&~U~dL/OYhmJ'm&$w "S˿R`h}h\A &y)z#Tv Ƿ75zT* ߁F r(oBӿ+`!Vmo؏i2}CQ 3 BQ/D**Ѭlg$p{;No%{.p.l.+U!ۼt(s"[`@A 􇢄 ,Qb L&#X iIүiY˴dy+@}OZNP/:{XUU=11V硐NEa )JA dQjk.f,_DlhRT ɽ*FȲg>者vwW\gZVqOSpì Me":1CמSOSSg<Ħ0²PםT5 /7y{Eb#+8QGCi\Pe=gSB04]r'Hcre'튺Vݶpq񘢚P>FiS0dz G'lNsE!MSYҶuێ&QC1$n;1ʖ9٧+1(1s`>>,+5%=Q/G %䘶scwFqwOSɶٰlS@X|hJ8)iN L2Ƒ#?k'"u cFmrϾ>M>yܿ;v˨;f k/!6(̾!>PYhŨovB\z ips;tS ۭKΩx=w^~h(~G-Djއ7`n:}/?{z-%LCQ_%{[f#pO6Rv+0b J+<`D {|Ou3Bhc8}I`ux3iXI`}564&I؉75k1Pe7:Gp=]%k7Pj@$?n!Em,fak,1$ZS>Cߋg= k{% kɫ|BvtB<5>TeN[qrt ݶWzŶێfn Ʊhzl{A4>Rrr&l"xumsNaZZNcCT]upR1>?S}4އd\bL6`R/-ˊ{n 5LYF@hZ:Mtf>}PwYPxD*RymGg)BᆀF:$;v 2XUU*@wG,F01ZmmKvirRpzzFÓ[Ƕ?M7I\.td2Ci|܈QYz]5_EynS8O.EO4g2 ӗT^cB},PPۦ&Jޜ 5c^=%JVYr^vBcڝ15y8~EE6I`ruoByG9KW؞'רx0Wf'||KAQ),/LvH>)pK:=6I/ҷjmrKc~ "C:+?+H hھ^_Zt-} a.~| PԐMu>].aZnL_-Lw & m1Y*=>$|{k},˨*Yz :T)˧m}!DgyNɶ:eDV :nKo]8?k)ˊo~"h\ԝ,O sfSYZKQL'SuKTIn̎k G>M$4(" 5a*@֩?$.P2;Kh 5I0o Y̘Nn]E,V7CJʞbmֲ?%&D|av݁4*,s<98397mۀY,(ri{N%JAi WffTWV t*Fp.QM&EZrk1bi 4S\`-Rnm2)j2(:5 <:ƉFYT,eRcv: kHۻcMcqNk: +I/e0Ң$p1n#]81 7=1F U ql ď_d:E?(|e ߳y]2Qu\\r/n|YB5 z즊͕^"X@CkϠ>M%T5]/$ROE `4*xMAV`OӾ 'aoLg3SͶ9??g9\tkGzBӴ,KHM4:<4cak!KAb83xC߷lk.s|^չ c,U%ף!8l6$>>sttk\{$NZTܐ3\o<rD0}TF1heLHXDӉQD胧KҖRX>ҵ)׍#F3N'U*|*z=p IDATQ@æ|!pp00C LqE1:Τcqv]GL3 S2 9GWXmc'vy^=__]O y~-sXܷ&xC֬~&ap1K7o 7'*-50F氆 v SGMMiVÍon(-?ߕ; (MDY+m8WE7e!{]QBP.z翄\EwWKW^nC&7QiF%n~C>,2eәY~]^!,d-{ ])ֶ_Q+M 'sx/=LzIOMh5~DӍ4(,[ IY QVf(Ԕ!hceYP2d#>dEe4v{RNUTe=wxߏԖ{1Θf (8J Ĕ1PlXsV96M?v]q1p:BDѠHF] I[2~0>eS>DM85Vvc$ I CQ(;8 CcC!w@Зq!zLpi>L>XZ2+'0 Ud; C6Wܾ Ӕkp:qAVʢ}q<1ekrb`^'v)9U5ҶI4|?W{+CͅW_hN ~M]z >|S닇pli` -m!pRU@Y ͩ # p_i7M<^V~cea,%DrsS ld+;+D9yAJ>WPӜl~ waVal4C-M~ڥh$f.u~[ ~e7滑% Fҫt5i! 7N4\ NәޮxgpI2?F@¼, 'Z?3RF+/g=dдXpn[Vu!1izI!VXktJUO<-e^$I$] 봍RʕCHh񈣛Ǝ}~f{śI- OHz*т׍EUܣ$v5`L&7r3z>1=Zې߁ߨz΢zuuFL)!eOohM9`HoPV,Os Mы#@=M9 upsMux n1$ջp(Xi"oJ,mZkj]u-_L da{"5l[Ar)< 0Cv_>'_nw+ɑhk4- ^]*0y\!qF!g`||I ӔPU p$|]ruy⭧Yym5CՕCJmQSw4AIαG󉑽I~2@BDCm}Ҳv{ڽQأXt  و @~a&q캛2Sz "ME&=9O]~ YQB4*cN!&INz^|k0\XC2d2'MRqOQk=} p=ig8199`pclT_:qZ(SyK'4nhr?D cwQ0]CыpߐvcWpOU{}H~d髅B/X5e(_w G`*ѫB8J2FJ5 ձ/i?ND:y]}?{N,A7ABpr[>T1o28&._hp,~x*bV-t +ޏs.NDWx` q-Jx_y'C$v']uspՏ2yE~'gzN go|U *ecFP?ܹmOrJ8:@0q-wi6 mR i˜m> gnsF ɲld2MGV+1L&8cjrz~=s܁۷aAuW9 R,PW?xWG3*OTVd[) t:OPha45H>?W&.$ZDZհ|$nb8&F|͕hQF@&M4Vʵx!NNM{ 4n|_kMMn|M<1m>tb}FG$ܧvcσ F{{Hu߃]ێƴ_tO !$ a|OL?>Jo[u<ýQM&뚫K.//x9::{o,M">Cܹs8N?歷ݻ,KVo{L&x4)p&sEgwE_U.7?氺{vM ӗѯ7 >P!<{ ~)gwUgLt.{#qpT@%2% 7W=8\4%| ^ S=Ա.Ѷ5! h S[OOa^X,xvvFQܻw۷o9>֭[P%|t:{l6#2& Պrɻヒtjsex|?FZ>5wy{zSf|=_ź]%P?fnRp\!}Voc`lK˱ݨʚ怅~:NUL,&!F^K8$`v&3OE z.UGkߒ`iz_]W.hRLý@߈u0zmܸp $D\|;]?l ^G4kOt>&'?/lܴx|+XeOၮG,@u{Lok5!K$K~|Uj3 !/./DDAң'Oћ^tCrf躧m OUuL=& <;"oU*$ xQNv??},PL <o:OV͒=0y ||ܾ7+Qrd,cPp;OO/l;ŰZ}ħ69ES;e8YAe<=bBt:S*&#eoo[nqM9::bkkZp8DX_oE1jr/+z7۲q2\ZE"J;^Iz,zH;ci #k&3c Ƨg |Ѩ֒Σ =K0c(\!|MIؙܒ؀xOֻ-9di,l|Pۆꖜ\C e@Q "5&Xo8/E}XRYif固Cut  |tںOҌ0-0kk!u/h$l)4$&o*I]ucKlֶ A܇nFb "2xksx>dXq^,kF>Cav çw睎.Bd8fuN*;Pc/sBw>&YcFȲelbzdoܠ~=H(T*r9vwwYmh4"2NdBE,s677y& .]bm}^G.𐝝^~[n)gggZ-6V{Q.)\l6s~>OtZ bEx:~gP=?i{x!_=]FPh+02uQ/LVREiL.G+@ 3, Xc;d,08֤/+ 37CEHjw ̏fcE5lHwCu~|SҼZ"'mŖgغ HLJE*ϓåHw9kӐLQ1R7 89tT˅DpTݒ\ML$Si6^rDԄҤDsCfv1c *Rv#so،z}׌6Kcw~Ws>/2bRLa7"ߖZMr]c7]W-IV%J7|BK/Z899^Q}PkR>v4 ,1^޽{L&g\[oe7o} ҥKjqv}j|>dt"F{sXXX;`ȕ]hBL\~ REwcXĶ`۰zU;D"6ԭ&aÈ#(@#Q|χRzv*<%ߖ{p-݁/'8q=F]T lbq?LفbCk^M]g>0DR~Ix 9GEHOj20 qrr_ҎF:5BtP46 U/?*2Y'.>t7HG5s-Azq53I/ݯtϯ% iO#<'}^j #.|7 ۸ՆvC#bKÑ`q0zQ+A ezPlA: }h]0}(xcC`b3K4ҋBIrMv(Sߑ oJkHi+W,kJT{];IazXJScX@#ظ.OC94UGWLf)Ed -B4iI +RGk8t]9䡸Ȫ Ԁ)P6]"l'Ym5^Z``4.ts2\dV|8@bɁWE 4@]L\R@W2TbrG(5365ݓT-44/ [Z =RAUT7va@v]3rQZyd(J1= 5iꆏ hi}7^I^B'piD[PۅT 0f<=Yꚜ˚9TemxSXv}IHWu9*o@%c߁,HWK2,,,,3~Pbaa{?џ=#*gUdc)83O5 ]B)Z34[Z.%b45TA骴ˢ@i͗м "\ ;FvJku' (`|,t枊k&zKbzr:W`~t,d n$3h ÿUw߄YKBxl}Jj*"u{N?;֪u EJKF3+@893,ɰxM$\yGM%^VH3YotvVf' j*X`>TwV3I]QH IDAT~C\r .|Cr*r"m^'4?dK95U:" Ն0h\VXW+oATEw-7󿲍u "tm?B YF=k:~8i56dNDBܶ*[PtkaVc&S 3M5LfŹ60CR֜&AY<٩HIσ[z~>,%G=~ ^gSX YXXX|]ǥ,,,,v@G*Hg 3b|yJHb8D QI+hwrhѫ2,NTϖ^UƂ*mpԵlh}5ɉ"@tUHкhb5w?֎䡾B{.4k4#@]WFvƗ߁u#Ic{[فlu>щơVt$ύ%!*I]ijtlх]hIJ_gX(0 eF$C܁˺JLOPu'Sl"(lD3`B?dXXXX<_b wp"T ﯩ߼bMY <\sk8шCع S%1u:d*{ׅfG݌%3.4:\HI"P6nCcMi@F˅:  fLg]:oMk e`m]Ti]gS!N;դ/xc*mrG=XENIge+"`L~Pڀқ+1"IJFw]h  .Ϥp\ V}W1XtLm*1{gT[~"sJ۝HB&[ڰ/Q'!|4S,1ɰx~N%&/YBf+"}>\3"S6EBk*Hڍ$ԮX6g*GyAq0RL%Η4TےUKNttj'=YD++,ґyFF+ MnKLQ񿄠3i$:ﲯѠ4S>:P *Wՙ@yX˖7Ƭ3u}"ip֠ rPsP]ڞچB 7NUC4mpsNAoDCԝZ;HQq!8ׁ Xaaaa ,}rr_.D4Q+ ںƺF|.,Yнހʯj*!d5Sh\TRǁ#O}CVUL_lrOi\*IZpmYF:-nŌFIԜN`t_6WR>=9סl_? %YMIQ4Ύ-n101@2@Ul|Dڐx򮈙g:V3ǰ}v8$ojĪh4/~Mݑoe[/u1(B6xꃓu1Ò g+Uɕ_5N@W  a9ps &CiJUǭVdeA㢺{c=oI8<=VW `*:29|nj uD>Pa2Lz˝J6!Q)(0u ˁ{|&76_=*axI!hl^c3Vn%=ؖFP2籸:=rk"seXA6wL&G(ǨىCCPW"} ?Pxeāx zNj2,,,, ֡l~~^ſy,w/?!D>XŴӮJe9H-zp)\xGŦ;!ᱧΈoD煭eԱPh)){p_ٱ1," D$*mvK0Vyc:^Ҙ)#[h|u[˩<>MM8F"qN䗦b&;_S`q_u RXܖNL뉱!{ܹgrDp%G@eJmi3rUe dXXXX8ht0 Aa:r"ua+ܶ-Ke(]ksVj`$w$amw4RF+[WnNwy(}7u#_ŷ`6}jA3eԔ6Bd[|%NK2,,,,3WT X݀QW !gSX7Tg``p(!,/Bq:{9ԶhT}GK~iA~z;#j`Ių,(EVgzPaՎ P{@7ak^!>qrjP@kK]*uT%NbQ zpP"1QvÉtnNIWYkoOaqQNKˉQdCL Pd B9%#>Ax_TK5?EWHF4@߃M^x=\@؃h:Em&Fȵ =%>SG(0DR}鼬ԉZ=t(\z iy`X᷅ iBށzSAs~Y;髡: QI&Qއ#9@sZu@rhP`r C9u\<_K Uˑ&͉mXI6@4x9y3%z rG_q$ Wc!0F%M$1&''+\ I5g`ND*fgLe}0㊔_DKz]Be[+8=%GʺBpۼG`";&wt.ǁ:A4Q$+}S\ ZWO>dXXXX<v2,,,^4v5(c}G)ϠݨC@Y#88ujfUSU7ʛ*(bflUf$J\\+3ڳ8U jy(BV*n1~Gᕠ{U؅BG8MuD3,ɰxj6xB{I~b*KLnC%}֎zac ' W4Q U"3^d~QM]%&G8R_PJwtWF$/tSo+ܫ3lB4d;}ûZ𑾆 Y:⾜^mocu'"+CupdPFV#i!P>&ZA֕W"X}YNE@ ;Wc|lH@߁PR]]wg 2?km5ORVaaa XsWs G0 ӡ(UFK&T^U8ie:ߔ ):p_LDfzp+ KMh,ל Wqa*Ki.P{rR 2U% U-i1QW$W8Q290Z}i~˞quu`0ډH?{:!]Rt+0R75~Ծg?]6r E븪1. G8q X-==;Ϋ"; ݃|E.UIlr>zWCrȅ'`D噄C='r),ɰ:D. {0H\j);jXqYc;m@yOځ?@-yd4d<" Y1'.}ooRt ׮ Naxs3薂Hk GRWdH kaP'W:H`x ')ƿrJ>5Ϊ( ] ͖G][0=Rw& ф&zD:Lz_˗'qr tYc:9VuDʢ@be;rN$D,sUD2(#c|2 gH`Aa|#b`TCpچGar#"_i**/r'- |׃釐\DvyYƦ?ސUgZ%G`qّi Dڃ,Zv [O,ppvK}*LK:~s]p"ucc0˂69/ΥXd;k*:_*< } Up_&b4Ƞ: ,/k}NQ4UG*5f&<,:VݚxGڑD$)ݒ4cXXq  (_37#&t #6`z"Mj`tlKXNJ@˩m]@ETdނrFjt o_#RM m_%wz]ud]50dzȬ+q7zɓ82:0۰ehkbX3ihkz MsC0}* =he}ƱrlˉFjP&l {=Ŧ[V)-f|=5M>Da|)vG8Fw=FJwrU~]uGl'963,,,^4Py]Mrsb DUxCh\fUW+W>?5BF•fCWKP_.~BuM]F9$%uX9eW.ԡHWoBP"ׁp'"# uTvsL*=⚬vTԯ~N5%i2@.MFf\Q[.p'JTۗ5DW3Vxe|U!PVޅnL/V؃C`b'"A_c^3ŕl@ LJe;_7o@yMek UNW.(󡺮jj]j9Xd*RK#4#UQHU),oij9xv.+hn-[9vȷ \\#@FiD3edGX2(}nB JE;߄rFKrPyWlR?ۺ^gIJ#p@bvX`65TmLdڄoM{C]TUMRuϲTVN 2ChGqHOQR{:=)o{YUf16d 3B%+aIsuxp=uXkcnHk^ij-KоIkq! aVz'qiH=/ץ:S_S?)c"_R`lhMߨIK ^ IDATH ~]x&׌6˪w>VbڃgJ\w%_5ZEŷѳ64wvtBva_o 2ڂc n6X":'Dړh]Ӑ[9G"ܓ#)oI|Ubt$sU69MN$ŗP} W4^O!8P\ԕsS]9Uw-x΃ޡFf|d[IJ GF:v>]nnt r0;TW+CL`P#[Ƽ<_$R^ӡYsMXIWb 6^@h@ mmw=#+ox&R4Xej8сN} S\+#㔿rB:9 +FNǰGkw dXXXXXXXX|G8V1;m*/_иBB_P J_lp|4; Ӽv'韞5i$Ǫ` C8:h8'jj 2;P"Q&ҒHo eٚ/OMd8AW]buV3R:(JSxI"“FuM:ƏgQGXyIr?PvLU>36C#s̒WMn4qkн(`D@ֶ55~LMEm=[}f 3}D='?Ri/4?A+ޞEϡPrKBR]iiLNo`vspG/^TFDT?­lp^{xMнv'r6 kP7c4vֆ3%ᛵn#b!tmV=][Es|K= i1AXahмѲۗ`¿#[ Z }E״`>qW+E4:2;x |;r ^^;@MnYu ;dXXXX<ݛ_Ci)"/M@ݡ$Tjd%**mCӺt / Ɗ M(݀#6X콮EPa, fCcj]D"yWtsFAڛzm?k4NU[#[ho1H{1ik ŝ }.g"?Wjuu_4=k&?ǃCmo/-R_B56{}fށG~440 f$ D(ryD23 U6*ϳsEXaaaaaaaaC|M}0c>3XFhk"ɑhև iӿmuKʭHBgik*dϵ^Mlr}GOF5Po *9|_wAwG: M-+u `|oO *1"Z d83eM;I2# =z1k0(c5T8`)Ju.T֠uS!W=Y$Dw%>jQ5,37\q A"9}YkF@x~B3R+ARrsd:0914I(5exRwE<]DJKKӘSζ~믌~"5+H(L>\b'|Xt1>3*ij1p2}_݁Ɗj (vU؇v&SC}Wڈ\Fnrb Sϱ (\E&gT74ָ"W)Rci><_ԺG3BGuڲ ʕ߆5&cEXBS|X:J_ <WdL6~[:xH`;π% w5ս\{%jG9G Pˉ7P;ˑy_MD:.lC[s+P :;PlCaC+Jg%(,깓%hD3^˞4&M+蛬Eh4PI:xWR`'W7;On^nבmo8qפIIn'E:jmw8 h#,} ؗ 4>PSPat,!|W:Z'(aH`$6"VH*7g]WL*$q~RqK-l뽍)#6"NQG?nX!]X#ҹF\| <,ɰxΰ T#R/-F@v %: =45ws 8UtJGJo'_#tlQ_2(! %D_ !Pau4^{*msy<氺 ck-䰴G":܆@E_ɹ' xmtGkV:.`z۬;2NylwSu}hKH_\5[z=6qm!*S33GncqhG*2S)<%_7d T/p2!yC_kLt8l $qt֗R<QH)KX.5FU_qPoi*8!I uu>j/F M59Dy@ XkN`:# Q",OtҜ,ZH %mE@%5&\J0G:>5`udJCǫG"HCuT -se huG7v-⊗x >a $m6bq /Y0 >`ւ ѨT5ظ+bK4L`]lB\u LHW:uuΏ?a_"Xȉi~J?Q(A۸Z0"BuDBy uו{!@Z{"Gp.A0ƆL{骶eٻm]_N/ktnד~e~Dr2 ӕe]ONZ= 3u;r֟+zn u p! Yo=d+H>LZaaaa,6-ɰxi'@*CQ$=@.|IWgB`m[o8FpJk"$]So@LNKʹ*d;<Pн8P@Z Nc Pm֙/w5IW庐dˮ5x8-щO1E:Fgм,k(0j$'PنFK~j"%3Wb>к-M?X4xϴq*qT'YJR4)i,rnH0BkSA#u&iLǚк չjc!< ߑU<\G$P"-jufcI_Utg܀a[N+hހ֫rXWU2})kH?Rx=L!_V)^L!}Gk L_e[D(Ce]W<+-Gaɰxj 8RZ',,,,~kUԶsJsNA~]-{m/+@. !WGj xg ,QA>C%_ュqzK] P%7ig!שvWӿ|"~;fiW^똱G͟mHuX:E^־1$ΟPX^S.N9_;~&.T4ft ]緥o:喵BGA0FҀCR[4om+'ק)y 9 Xh}S Zفy?ʻ"(CBn%3DnN ^GEd,{*OOf݂ϙĐXrMna=|nE@$XO1E+JP+G#߂'kxF:^2Dc4wKcY/dXXXX Ќ8 U_݃8/"S;ڱդ"`cSuҹFW$M%.,ڽ%ŊHDt2.x4桳Cw 9@"4}_ӁI`y?eG;*n11ih,_ޱ7:UMڊj]r.B|]ב0pQhM3C @# ȝ3] {:ֲ+VT3iP:95+0+R4G6~ZG:g C2B$yPH(zWGq>g 4eǥ,,,,,,,,nF "Rχ穵a{_Zp koY(mWA;ƕvݚFUX܇Cu1)/C[`0•tRzmN/® /9(,dJy<>p`6ԹI,Ei]պgУ%ȇ5o)l_h.PJZxK>[`=ieUu;O`tAuw\N);u\Yc[RCv7=IOcV]icBN)',2"w1x/EIU9x)bP#PNN gy<JN7d:Ox ٪ޟp(wv2,,,,,,,,mpM`t5i"F*O:}}Fcxܖn {&CmL;hH4?=dtb .XڄU6UPCXR)K8TNIl + u3TW0_Q1nAjp, LgMD6/ZS(r"BYX)N2 5?,p; ֛')PUºe5~U_cekҲ \y)q \8?63UoPϼ0Y@I//nػ}= ¸[XXXv!0 ܒ 7i nҩ;P,TB|I+"/Ar-v9k +T׮)}|ց X+@E|K<:<8,`}&ש斴$Q_GB| i?5(q< Q۲)0C9y5 iбdq-pXU鯌m('(_ic2F3iY542U}99żq虌zM_lp|.I~[XXXXXXX|P^Bԇˍ)WсFG"0JMN`pfʺH"Xǁ-zl'l_D3@;>XS if/54=ҋ%qdgrL*-+wZ56d*U,MϠ2F*D! 4/_oܮZ7ߧ l]5:@QmuX&{ҶTq r s-tЇt)D^E,1ZD6BUκHPqG\>.<ѹ7/\CN[,obarA0p*M(l(%:wKy˱4݇PlSUA &̟A OҽܙNþzK|D:l賳)B~M OA)P#Q0<7^Rgat& IDAT _*%mms)GLI4')URgy1smB8qoj_ s(n\er-u9ޅ+غg=֚HW& B{S'ꬬUd9&@NXNVz[4C/:(> gG>aI[zFofOcaaa |UDLlS]Bڡ74 *m3Zjii*M3Dh(WTg#WP$MT8;Fkj)8lQ矿ɷy9 nJhqaTXŰ+ϩs+}E/AcR ސޒ@ "Ŋϕ i$4z;܁RI϶ TMh\ϡ~I9j=o nYBsuWyb s\?Tc=UM7`1uu`HNUH]񅾢dXXXX͕ܳoq77C4 *ۃ%Q*?"AnCsJNzOU={T<$ čɸ}Ck^H}XLTh' 5 <~EWn:&I BQ`U8{ߓ6+p3dtstuu)HGuw5 囔ѵSˡ4'W%dohl9Q 0?i]aw-uQ""a"jq]ei%_>&0yT;rX"ZީIh.k.FcN~&xkz 6x1 w maaqʴnK*c_#P UܒiC}1>=u47Ip k"vFsȨn3'(H݂Yi=j*JCxcm@]"4q.HaoĉNRhqc` qvUO@({>S1HlgjA vkk)[QG鼁"Ҁ(yHXqp Glgs*s5ޞ\e\e=O4?HBy >nI8]:Cwf>}'eFgPݔ&"Wӳ琜*A;AAGR[4FDsVe2"\Ip,r~_mӔk<폠4~WVPk2xhO$b?MJy|(Pa_+_3H#9Q1%+w( oܖD.]B֕ڒl岱Yt $XqbdJ`奡(T/*F:;rjWei4:LFFD]ƒ.}]R3Ch4_2wJO誳,LDZ | $5wK_xI׭_=8YkY* ƛ!">"#d[G*Cd D8"hC]Dq9kpwk߅XA3}.<52t4ڄDeLAqt TS9$rv*֔a1|.kl %7k,_)CbpWB2 O$XuS/mi<+_~c>T{Tuxwp{w| ?]`̟_Odlމ&/e۹s8Yp)#T%ww'0'ɰVӏ+5iF*Dehiv Um@ g?T0" il%Be%s )yi*6U /f09T5*Ev3e;T;f""B9`9|ޏqI]lZbԤp:Q[ݐp"<Ū)tn[q 2:ƗH7W0ae P"18 E39=KJ8" GWkNPuSpn V+7cwgjZ^3r+ߥ };-ɰx FOY"j{McaaaOr*jOYj LtTl( 4@ d@kPOLr5{|^fZfq2C f,ʟJ$^ЃښXPA s%]De]RnDkϠЁz)UpHˑto*t5v4܇yUYkה1x /aF\qnIOBuMϥgO'X]\iydݒ4QO6QP0Mڑ@.O;ln\,ɰx JZֿ|hvA >L\tņ*|H^O}U)Wdk3#Bقܨ벳;ZMdS PڑLapƢܪrMӛй$|E9ICXEsg#X)g& _J\ô^?pU]=.7tӆNN㾮 [m u1 xPuһ8.t6tiwIׁ"1w!}h?|qui69@tkwED0Jk&W#&^^jI[P,6pj_CXgfIŅt*@}N +)_h܂rePǠ;;8vΗ]',_0ɱÊB"0yؼ֡)?%hmd꿕05%z;%_KLNFD [/r/GPc(C!?h j+ΡvøeEP7Jc2z U_JJ!$3{zFpܣW0-2HEdqo$BPH=ڃE]='o_NL 7{W_AZqd+%KXlPD2 簡Aadpduq%Fd뀣~Oh pSh\^@[* Qf4!>^܆f=`"e}.[sXf[P_ykPp\o& E_IGlM~C iX@B0R'a=hlU5HpX˗!?1^_yU B9̏$^*`.`rW"{i/ZɖvcuPAS8P]KXJNW%uh,p,zJ,?Whf[8 |(xqzǰ$]úKYXX[ P*Ir*#y]Xu3i>g+ee&vL0y@ayB u#1% T!l^Nue{dNxd๱!>wU+@Ff 5B6=ճcMT{KiS2Y 6RPB:_j,|`K̈SZ/LNE: m~ ÒFT8XH$^Ѿ!ANFޗ \&Kĕ </K @d||oog,,,. ±RyHH#<3^=l ? [P鋦pgʟMCSr8+@ͩTUB o[SٱVjvKG/i\( `S_p}I]ݓ LJ4`5ΦP,KcGPmfE&rM4ղ+e*,@ɩ:Lh~G|-Лuaa#$9đij rM5p)WD82MsGy.D]E@_˰$[DnC]+3BȞ6MU4/19i-u %jܑ+Tv֍xIx B;2 uޓ30~ g䂔$fRR"w>HsJX*W>Ar_* L_)ȭ(obH?`:dX|Q$#\h-i,]ߕ#7$ֳw"dZgI|}AWd# tnbY sݷwH:0ٗ6PWV u]rMh}_VNA@J1Ti0]?K2,,,,ە'{X ˩]ʹ~c?PO @"WN(|3U%4?r"W#$PBY>Ύ@sWvߑl!q. w V&Tъ@Q#4^5< jX= 64Zt=S,"cBgkʭ+QP_9fJMw ظYC2?l.0(#O 1VK$d%.C=iVr/Kf|*NfF&Xaaaa6(%"kj;LٞvgfhQ ߇fbc;A Uu=PWPl݇,P[4k(W1>3^B3S(S=D*mYV7NEp2d ܪHLgq&=EYfr̊TZږ:7\ZGzfUcq ٯ$v2,,,.]Vؼ u'L.&2dK?hfb\'u1 W$2Ϻؔ;[{P kޑ.! :\_`LU8jhUH?Fc];E8F mGw Һ=7L7#'B*[rjlii\'I̎: Άӿe2ȀPSLX+dkԷIH7$*2fn:ٜT2t$hd7EG\]]pO7̋TWԒ oܚ uRؾA2w]āvģK= OiCu9Juu"ČT$hՕiX* &c]AuUxsYٿXXXX89waڄ5iɨtZ/C*iF0;mIM&]~.C<QAB.P(BmMת5b VCXu9(%KX3s/Y$"8P}_K+r KR/}354(bQD'*U_1GF lFg|]S=U`` ͸ЌO5 i3~݀"Eټ\2?E=ܫP2Ʋ\cZX 3O_SZX2MM-^\@%oA.W\.g-4oK0ԘPa!:@59ZM"L0F@ pL$ɭ@eM|Me\[CCuKF.%pprn[<arŠ28U{fmq!%oAI3r%x0:[NYcE: R3hox` uŊ,Sf)*/'[jH j4`<}8{֥K"R }XۀF ";mW$#ijLp IDAT t5EPݐ|qZrc;b*r˫+΄<3ZD_4`UGGd"YTa|)T>oR֕<{ѩ՛r"m˹HUu[%Eu26$ޘ)*QYTYw&A|/VaaaaXo'{~=^B?3S+[p=T7-@Q8P:r;PAa<S'3cP 3w8`6u z6IaFzkrwc_%n8C{?Tp3 O`: gR( F:Ly!ն:<Wοg\88pG#uOvE0>Jds-ơ)}]NO㺮ci|UrKT"񅽝`IŷI_BtqM(Td!3J08EfuF;~"+M۟(ϡ-Z|N 8X>W?;3žzcP]L2кEhH2:Tq?9X|lfpay(nCr:ޔs=X،{&SƒTg҆FÛ .4JQnd,)׿twa ${bK04$Sd |aZk:3\ޑ/2m#DݓLqK");ꮐ츔;~XXX\< PA4h"ḑPotBP@nF6B_Z*3cW*41T9`6^ʭɁ)C%`w`S;wapV.i YۮB/})֤(_p/ TUgO&sZ¬^&ѻnliG':6iן36oKXZ@ Amk0l-@s}U` _B|`J Fđdzd4,(Qg+nՌo63hܕ})Ykr@NŷEҞ஀ׇ޾0 N%/ե8;S bEV(O?rGHGb9WcȻePII-=/7=ڪFf}ҪP"_nRҬ-&D0I xz[EFECﯥYN`_(|7RD؎ S 3T#u*UIgB8rʗE^:m,@{ʳ^s^I[+ըjH#Xɉ E3X &/kK2,,,,1l'‘ ?ҟ7Jai5XEor~kqU>U+kbuWk3dکOc#5R, k"u(^.!c UPN` 6H@Pq#e^t4d̵ve#[U!{@B} T'u]p|*wExz'&u:g3%u؁cF4u)= /T>Rn$ZgunϗX{yj,AB]uDJ3(DȲzt)ij4?d:PWԒ ,,,,9j&qCع6Cyډo^o&;Uv /reD(&}]c>DEP#S9挍mQݐʖƂܒv [ʋ(odi gOaT|c3bZy?hXUDHh4>,gP0ݜHݏL+P^S"Zx*?z%y؃ҖI^$|TǥP 沢v`/e1r"EYHjwο~F!8PCk-^s(_{ ss0.T.I 5i)3hc 9Ʀmɒ 9@b\Cu2:YY;"@C(sj߁*tV`: K"E] q!.i ']wB= Ľ:;mUVIsCb͗ulI"„J$Q=>=hHvޱ_k3޵#b>*!4dI[qZI]j,,,, {rʙ3h+J.` MDvՎ ̆" 2$W4DAcAk%8P,DVܜ)^SoK ^n(uξTu%< ϾP\ui7иe}A0Vr cVErEْsu<wqJKĪB)C&qh(RY[:Nu&qpS스ȸZb1o:yMݑuxuAk+S$JiC2C׭B^QK2,,,,ނ?FڬP(^Ђ,,,,pCuGESbdQa:ɮho`9sr[I *\Cc:?896eXp9hgԥ(׀&#sMGc=k0\럪~ ]#m8y(I|fs/[)Zr\{k/T: s(UERTk@xMzN :˞Ѥ Zÿ IUL;Xe[+uL|:PW%WQA_Us }- ʊI?UgT#E$cv?!?4HVӞ:E#mi+ӹR/zP-A@%IGd#Y U^لy]<=W5^^c'PsX,݅CXHt%ZO~EH&k@ X\iݥ,,,,ނDau6p60cKnY$V9ףо8ԱYW݃@{SkQ])+؆J];Q߇߅s_JjUE?a|N.TS*TkN OIn] sfdgPn)w Ls-I_TÃs"Roc1W3ש554:@*A} S]3d]Vй]F @p}cug[޽FhيF2yR3Y~R#Sd#!o%6dڐZaBh,w!>P#UeEp?hd)Me[.%Ztݫb{t7?.pZ]aO^.DJ8];6e[[;wt_ VDrP,iG} î t[VX`<߁s#MX} tGKuy3-~)p}X<ilă=+v+_2QC(lvg=XzOtO]-CfPZxB1-CPX02Y C`4'ɥ+APƑvev*1ݡ DOrʐ.ـkϠCy5|r]8zv,!ہTzLV9-g|}P9Jc;WR[jI[?Te;Tѫ/PK2,,,,,,,,mH0Էi)qM#:ق ^O\GpcJyaB:)u&*G0{fƨ3iGxFI54JT)099dp=o''o V@@ҁmHǜoF,wJfaZ^Ps$9F,?UNH< ^} \Q(`:237lܛrZ!Rɉ5DHcksaHĐWuAe/@XM[`EpwpC]vcOf -бƗƀo21qQ_2D)យwrsNA粫MʮHC K9Ph9r:ZP 5NT!)x.Mu4kC{F3w!Ȇ{(Í +o@Zei.uu5a%l_(r{l_\^,9lB]s(Uu?@mE uvI"!NG"[wWn ]-yJ" wHIkÄ+N6nE03C4K2,,,,;daaۈXcbA~Mvtv4* [LUt^3u1ۓW`Xݺe!O#fx_C~E2e! u29i'?@/q*;$-i*u Kc(¥GHk+о о-:cOILEz*}z;k#T1[Vk)qуƺFfC+NrW2ۄD'ʸflTX!X=}m襎|-E8u%c/gu3,ɰxOay$c1Y_cNc˯$D^%&L쩲14b` Mba'@$3ٷ6+"Rل{"ٚDې?ݍ|Q2U}- F/ȸr~*ps0=Ɗ24P9+L `FEUwfeu()["<3ay^x&|L QP$dtb. ?,DN2둫YUz=C̾2-<4#Y$ѱ]KqyԯAi՜bVaaaa&"n+7A8Q7r 3/mYF YΦ&t I(tJǑw;:>ˁ7 ݒsRRiilڥ/  x$,@85Y:F87éHKXYkeC  pwR>) (U·rSYNVdhZ^ I24  o(׮ k qWkƇn*[\.~0^ C=6]Cp6aLLܶYkUDH .LC~;E dXXXXXXXX|KkDj9d(~KCd t%S HπugGͮx u:u {иjpFrU+P>*MF번|]c>:ehhYup.8'At|ߌ\V&ȨR6)+U=e[k\Xk2k赬}cv#(5lOvåz$"%͙,P̬@2]X t%j/]h[qҞ3˼C.& ,ɰx >7z\//hEDsOڄ4\^Ba+w`QƖ:L@cBfdU&4ϟ> ".eG@*G#ؽs<["v#(oC/ )Xln:KOvT*4er)2A"}wf'REe2f$:= (kqL QsV;8){&vYrHXd9^0{ zx΀L?DQ%x JywTOڙ},]]]٩zUC&kkTðFW,T:-|,&Īq2A]%16@ ^e]+vv%}G $;T#w\+ފO SՄdgj; _)9|(́D@Sq kˀ4Ե8ڬڷ2jGL6 ifgT#BSif6TX􆡖-bz#ʡ(QrVX;CO޸,Hɀ"9E7]q]E'KHnPsILSM/R(RHR\T@w@Eۡj-jFZw8Il-qTdT8[|K圔9b}>J;*¿^P 8iI AŮ9uѤFF8 Q{ 샲L?rIU؍M~*0rӭС2hijBBj'lH-OU񤞀DLW(ycSש[5M{BQٮEĺTUi)2FmTхj,M5cSdeK-AՊL*<4 FnDá= JYhPm)g mG4ks=*愶@@5h65TGUQZAiU߭uR+g"J Q ˉjQlh¬4kg6Qmhc٪'! p\z><[~TZdQT8(/U#F 7Vݦ'{ݣgZjMͯU5)MkaV^5y;g/j<倣YOeV9Il ч!? ZSyZYզT͓{R6h16Ο(VKsxr64Y-[|fy+g<_BH^1m#`+2[8r\i ګyjU*[dmOP+PvP9,6ZMZS& PF%P򽆮¡l.5jV2jV2 #)MmPI.& pai#PvaM\ֲyR-M IDATj Ԟ9*A6ƫ вkG hvmQ $X!SL -UφR9Ո^ |R;0*OAjG97vjBB@Dfx ] J_lVZ^6#Ǩ (ڵ۰{ZSB*k2G5܍rk/ SDxvC 5Tح9\5‘S(D!5-;*,RXjq@9lze}wGkwT#,vkCnFN04e4 BLk [2HW+Y]ݠQq2AXv]Ahpp@D(V* ڬlZ~x+P] l4?Wj.e5A:3ܻBk{_߫߻6g.'Q}RW[ǺK, 'mRkwqGEq2ACkؕ~1XM߱AA!!e$\JW|.lj1q2AX @TTTѵ7;{ ܭ[r搑1_M=W|xq2`#fʄYλ7_C_b'˛Z! ppp)))|x<6nGk3;z1cW_0}ƍ=FynQa\֬]3?ż睍G~豣dM-JXASRb prQƎê/VWk>bٖQ^^Y2~DƏ;oՎ~a^{ﺯg}53?o-vEG:ԮtѝvѕeɌ;st?[?tfpJ(eepퟯcĠ39l4O>T(N B5TK(--OAܜ\hߡ=_s&;[9qqq,#V^Ϋ^>DEE{tgmpuY|XŬgU{9܋ϲzJF:3ݳ0jnqpMv?L޽4x W~_k#{\Zշ_7ؼi apu71i~ ?8[6o?믾Up8ҫculٴNt}vtэ 6t:5f$W5c\qmyd˃?Ħ7GeE%99tHyگr57{orUZ!ޣ:#Pʨ1ftŕ)tn8-{=V,_ALxqNr 7mG4{sZvERR"+.E4l6}1~y 4nua5; dͪ5 :IgM%so~K>sxKc AjAhNt::m*+V/nS^Byc$&&ѧ.&1)T+Qu6N֕/V9v0j>[X-97٪e0Gg8?/çwUbccqfv8KYG,#>_̛`: _^{)Eo՗_0v֭]#GL<CqwlA AAㄒbb{u@x<;TY$F>|x9#o7~uU~i'۶ngFzUW3g|B!%%^:u"!1?X@#k&Wu黰0HSQ^^ήl2~W~{())!>> sә4yoĪx85$d Tñdh  DyY9Gpᠤo7~c3bƲzjmʌ[o!55sx<1>>WNLemw2e̸i&{;|&^ྐྵȼG3b*XaT;<< 88NӦruW1o(v3\ٳωld` \z|;.R=w͙_ K/ӵ!9 QFBAh(n󶐴hCrd^뵐ƌbԘQ)gOaSj|֘q3ntHs/>[30Eu LIB\<J+J+}WW'˻ D A8q"Ahx<r2{zw{c1;aF;Ct2B7/mZ; sIp%=䴮յoC\/In'CJ*((=y $ '*&%ImԢDfiR 1ha:5}Ow8 p9us2HmAaffC7N{R̽L-H? {[/d TC/ӺAiW] |QXi7}~l.æ®NI;̧ab`ӵq2M]}e6 '0cB\t74 (k5'l6;i`f la蘦Bre5s]7ll%AwmMljiA8QKof 3q0ߵ#Μs3}.IQ0M1st4j.cĉŋөS'YhQThUzVZѥKtÇMo ]H BTF۶Az#:,?fs)\}lش8[MT{{졧N89< ;v )) 2n>s#Gs]o(ow{,zs饗*DSW/2!PG23#CWA8&$; W|_z+hgvj6=vb…̛7ϗ_0`zE2d˗7X%--MA#Эr2>DX&qݴmݎ^i_ҕKرk[tlA˘kֳ#M0Ga̙<裸n_ܹ3wt҅U}üc4M:ӹ}!ekK4u"N B0"K gRvbcepAjOw}kx?/|ԕ?Caqo fpoȼDG>+&`F40dn Yn1l0֬Yr}ȑlٲ~LDS&~E4Yl]t7oM6kK4u"N B :҂Ɉy4-V*B4'cO9ƈ޿̬oہLLth6n#Q@ P_Zpis5.]ʆ Ƞl8 _`A{ꏅݦ^1yd?'RzcEj@A0j0QZ DH{ȽB UˆmNI)jٚm:p$; MHIVi)ikݎܣQOv:f5"+o=Þ={ضm .dĈ̝;c߳uVv7|(NF4 nk/ؽ{7[l[nӛJW/2!Nt+"/PV~+!*|EOhU^GbB"%%b rIOoER XDM>RSՇV栉u7rO3i$ '11#Q7̻Isrr:u*ҥK=6t"N BN‡/Ce5MlI|B'Ź $ e8!%=ߞkHzqi1:Wl4Ш|3Mn^ב#Gts$FzUuߌ֭[?䋔^q2A"0W%_EވO~Cdnd&A:Xmp f4L 8Ơo6456uosn!cx6n cs8VE}Y x> _mpfmvEk$l6˯۽qFjWh\cY9􍦮^foAfP(ȷQVVPM3&!%J`pa߼N:ӡM:q_&#x #ޕPm쨭`3M}OwdxcS4QGGVA ;ttNmØAٲkk]a}\AN'td̠Aa!s4lh)(Z75clP ZȦiźE}Ow 'uq$?ŒFAhgXS"BTp8ē[Mrq RSPkذ-񱉴NiKyeawM 8 Q$z opmis\LAA80L9DW" qd]M(ixwD:pc:n5>.C9sxgH[tU}OwɐaAA9l8$NB긔h#_^i_#T4lf+DWߓ4[bAAHs4/{!d [AAh<ΟtaS QdM-   'iMM-   1YyX}TVޡG|l߶E"0jh a!n<֍غh.x"dN 4d3W'Ɍi8NN'Ukü\rQTZR8$'6=I- غ[7ucNq2AF3h~K5&%xt؈Ѽ#tЍC)71Ѽv5-hfnbZML߽_ǺG+ L!L~ 4"<4\Wt&GySۈbkuxQh*=dz2m81%t8C~^gTuSI P] ë iVڤ0ML*T$x~a]d {+F3"5Lei&f 540 izm44nUa*7 M5DXaz/_vogzMoHNLv]F'G|l4 =׍G}kRpb|Vn 2[O4G4U*#U`A=_Fa SiY8c).+ IaiʉU)``ZU&$Q2m^{9w6|NU aPaXJN|ޞSo:^BՖ|*@hfFg*cj<\Zl-[GB'CzcSX`2C6_+Qe9oo3YC`z <Ϭ{VUo Fs`]Wz|#o x%؆vhdjhVz&^ aU+<+ 'ȬO`Ti$ pz?bkZl][75\媡W'Czc0r44WZh8ꡩDWJ# UչA1Tw5aA. Uj!_ b#40L7`SU?H* T#3/ewrf\ħo2>̨>;+'3@7D-Hj4PžU}T70L{;{e[b@́rXs]jt9Լ q4V>7rPVfSaO>L# =7L:V4WVWN*ƬYm6Le0 tbW&JW WeUJjz3K!{V|X5Ξp .#xCݼZ@vè1&[Nc.#N 0u<S7y7X%UT**ʫN%eu2rT-3}<`> ~m|>:6-лa~G z/:1FoF@aɓ!.tiṾiVVos?%!$4-:Zl-Xl\X=wBY$q2A7}UǸib _V"&ó̠Lަwz+pLb> f0 t~M(ATMO % 6T!{%Y5|41ь\ЌLZZZz*G/4*jo/z?ZJό|RͯIHHhٯm>^*o/~×8Whj}/x߯ikDQQFݎaO,|4}Ӂf|w3Դ԰:z6{G?LZun([{eodj,x^xEN'1tw7))&~G||g*\wqq:$ݽĤDf> u]׉4M֭]>O>5,#hEɄRB=bᄑ֭["[w/_aհTHPu5TfxkS.ܖp ׭"!!v$55dt?\-T[׉gpͷ1t.rW= dݨgѬ95GIDAT5NMU[F^~>tˍsy'sΝ9n.\pQ\\[)((K/n7ǞW5v}O|[wѝ;~bzn9m[3r_}T~MS}xtyFxuә3U:mǼ#2d tz<-yr>_o#C4디rjSYTT\{< h4kK/[Iaaw̜ţ<]sfs۬[ٵs]x9_[7p搑t==!N &\blAӳ|W哐iӮ !{M *,2vC8sHHkPNZmbk?йsG7{ct>[UL2-7ӳwOt40v&$1Mu+_qQ17lr1;pz.8"wF 7\~&&\p)6A _;e|%-Ꜻu]Уqx<RRZn InO#>!]w]n٣q%1|ѧzec_%p/}z;83Y3gӮ};t=v~=ӯӦzPpԲl,jT~};A^=ټi3۳r**>[9'g00M0qr}Ce0Mt9tO> v?˦6qͳhŇ={\:| .ҢӶ]Z6T5Om[4ys[|rsh֒Ysce_s}|\|EdPr[0)/`+էWW7[+?_Yb޽=ͩ=NEzѧ?w@Ν2Zull"O/6>Oh֥%ݳC|#dggSQQAiI S>˿ߝ˶ۙiABUO膎aֱ܁C YB,[?-*o!B1L#◲7hGXk+~xT&N7իq2A7F2W~_;׋Hӥٽk,^Cda|n0gݜ>h@P>ö-;ر#~Kz4 G9'USXICٺb֘4u?ihтKr30M]t>7|=/ukZX+ɛ]ۋU_a>t3~n7CA׍n$Ϲammv+>v۲7ql#qw[o6]v>NgL Ѝc/kZGFfcpş.;f֫g uCg}Z/yAA}CtCḡ1|ѧۍw@_JJX¢Wǫ.o6B1 GU 2!B tXeHQLӤUVx{~y'?O^8llv2qM8z$dp;ŝ30;dzS延6KW1`s?vj3Fṏ0ds15d`YJ8vaߟo.87^}=OJj \[|wkiόM%IIvHaő,\.֞v'8q,}i.WkU2ڴl˾_w> E<-7!غ[7bƣ7U[T^;>e|v#GLtd2!B0o"{eܤqla3:pf}! n%l.W>[7bƣ6%ccݎV!Bƴ6&gq\W|9ٹL:.dRf]b [S 柰 u[7bƣnNzXYs(ST\ᬃ2] W Aax ȱg+7y qqq!726d^ao!uuT[7bƣ&[7Ø#Gw0y+mZf)%N ƷIV:qSdž_Z:VCzBn u[7bƣ&[751޾vvmq8|dPoe!.&5܍I/d4Wl-֍غh#=܋X-tvvfb8qw#yiX 4ɷNG1L SJ-),, 11!D<(.)eغ[75dMRXT@S3llݾVik_facp:{ ARb2G2;hhD4 tNV!nNa7= (EIi1YYw(9Ea󈭣غ[7J\l%%E81l6;. aL'C8.hINBd dڵZfNuc77OFT%Ǟ5bClxMb۱eN!4;4 "4u!n<֍yu2V#Gl( ԅpsM-   '4%9IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/refreshbutton.png0000664000175000017500000000337613203343610023611 0ustar jomajomaPNG  IHDRk%ʏGsBITOtEXtSoftwaremate-screenshotȖJIDAThZmLSW~iK e LI\"˜>~O\`Ѩq.SGL 32?*Xd 2pX`5PJ[q=T#}{ι\`D 1[I"`H1,Ƌn{CxI31aXr<109%ś]k9%wfn޼-SBD1u:-ROv(@Wbld]lZssg;Y)eF* wFbnQ}`p@o58o C`J yl?v-N. R(%R$'1({ۨD"5b\a`$msYn OїM""sRu>ʢHuLKKmJKK|`gggvvEyzDR~&f ^L:F¹iBjZk׮-//톈MMMvLgNvuf,3A%!ޅ[@U,qG&Dekb9w\}}̨n=d5 d,NÇ%*Ũ#KDA 3C5,Xfy8{lKK+++۸q@z޽{?rFGGnZRRrȑ~պavFFF5##cӦM E`~qHU5FV-c$D̈9sƭ[ǎ۳gOvvuu}WQQyrԕ+;w~PPP hn>j۷lv8ѱr+`hת{x r*D%1f_4"$" 10kSSSҶoߞ3<<{n2`WW>o޼'B!l &8爸`C !&*zqr{8Ճ2#tseIJC'###;v h׮Ym5CZtiqqq{{{GGǾ}rl6#b(2L(7FE oTd) \+ B(!ƃPbbvVVu~ܹW^rwP rNvχBxo_/ )TJ"FSD!@D${y1I'bByϟLoN|uժwkk?mOFƴwnB^G7oJ+f9yyyR956<cjA0(Dַ:VZ Jcvd`~< s93[NҊ*.c42F>dbiH͈{pZB7,jI59gN$bDAi+Bߠߦ!B8/kECqjMEI=3ƈӎ)dT3΀ hg gjMD|_]$ 198ps.ȈnF{!l2_ʷc',zznwW=?9<͢GĀQSy t.~niX4ʗ/ <ɐ1mZAA%ǽwGQ|,RM#YL)Edb0YLEUPx ŸIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/rxdrm_constellation.png0000664000175000017500000000446513203343610025011 0ustar jomajomaPNG  IHDRl(sBITOtEXtSoftwaregnome-screenshot>IDATxklUnTQb<1Xv>`L4D !Q`jAD+)Z"tm & ւ 5@_v{[evf:;s3{>f(1hjjB q(@ͮ˖G_WE"{xc?|>:‚lJ%03M M ͦswʊ+J+*+žvMXm,[T\pco;"R1N"g>}|˚úE+>sO_bGCs6oAqQ5yG~ om޸_ms֊uw^} &n zĉJ|X9Y^I%<+.|gUۿ]2. 0@۹lEl3eS#[ݰGn:mK`@;֮ZxO3ot8`m-"!-3'1iڔq*[vԩn\:jUΛ5c"ЦC{7,.()_odލ% A?%iQ|[ON*د\Eo>nÝa `r)mS2DBzW@-NQalÑ܌; 4 h@&/3f:/} CLX܇UK'4nz$#B^PO۞^#kv>tzݜçюBJU^Yr5J/`NN{M Or;WZ88dFD tCg3s׿zB╯hAߕ| )!dSBc4G 'pT92lJٔ)!dSWE6 \)ej4X܄ĹWUT*!O3DRc#~ER g %+pibvkaD.|}SrM ewuDmk;"F&<8pc$ xP~w} %|6;gF{soOub lP"s ~Ă(l*|Q U`SveE`dgiHﯬpnO_HDHXTӭzbVŰ,OtNE~8S(Rh(1/zTfp8E9HO``fQc y&h=rD[OÜN1/ =%?p){'[HspDNM\fvX,L$ؑ눌xFfU5b <ͦǃܩ}sBITOtEXtSoftwaregnome-screenshot>IDATh훱N0Dgh(鄨驸 t5%5B'@ ?ĦcL! 45vvQYB8 vBdEᅖ?gס`hu@q$C#&kb@ Yu\5{C%$˚?v"BDeo3fM3' ks&, nԓmu-2of>{=c͈ ^N)TYN^8{rE.snKt}M;hrBm%H$:I ^Gm<\ Jݜ-ك}ږi˖]TT[EYпlPl˴#9=g$@x|р1] 1?ѥ}`uvS,9n 4/b1/*t lU*_1 ޷Z_k} u-,Ls^UPWZ[tÞw !ȧtY@=Z/(X#al3"}][tW"㓓,J_-1[B!Մ"P``Tht I zY(APR"s6UU}BWMO*3B®}E\zw+7Gi)$+BB#BRaZcL v,_HLjGZ1͗n$AqXu>y]E:;^92.q.,i8 陟m*& (B~ER'AJW!;(?$"@ߘ;ۨ<={I AB*Mj![/vuS""Bu_),n+T G^ [8+L?:*ED"n+B1%#ًϽ#ĔtF^M_m+j&#)CHO|H$u6@u6}6P2:Je"FgDB0 y9ebq~a>f ].FTnlXj /OV2!e3b46GK9{@`]>t=Īv:,rfQ$}g-5GUeD:STܿEaA#9DWTT5ڌ>wH#^LJo_ki!aM$x֢bU~ފI?C9Rm[_[:eA hnj)}JuF%ʯ(Q~D!&ɻ=(&UٗVjDZs\{HP_%YFύ+Aݨ7}&>5ZКckh縅'^ <%t0;[3[O2iwrf`d[y7&m]~E|/@KX=cnh3: مHFy/it戰/1RO,B>nBL ;4m%xɹ6 Oތyf垗B|vacS"l\~>yUѤ-8=*/[,:3.ppjpȣfҾrԌ}oFi^sA`ɽcgs$x/OvqX;^Q}+ 0 ֬&mp ]hֵwgA>?]wurqX@`3rl:!&)L 1R>:Z !)rkDoOIU@S?¹_+Momh|c@#-- L_.W~q0ģhzf/yϏ-> bnlGgW,?4]>q@ಋ==@ݱl{h~ʏp**IX(,*MI]Lݺ{6i򣿏/7[`KNhQ$G]ߡ/X˓3{ yߟ2H\V~\9ojXYXW*6z =՗n{ٿL02 ^}{4 0ФEmZ?޽&$`L4/]rY;h6úgf#LfdD,x]y?1G_S7[Se⬳wUxQ_\!Q_D"Hq Z,<ڛQlOjifh8?T\YL[N=| p;&&0 5瞙aۡv#&s՛{Km?Eo {;B UQ"~ ,9d ϕSyl |Bо-֟iv\g#!VSx?fR&y].Kfa7zMZVÖ32}ٔ^r E 7,J?֭+0Mpeeid;qk VuƎcv|ร ZqfEdt)RTXJ?(RJWJ(RY_% EG;]$^xͭ.: 66&N+REJ2L-LzkпW-peIz'eįwdaoeh5lnT^ͽ7ޑcff`fke2n_܏_'15κ˱BTvahhc#^? 耳oR6XZZZZy{/i:ϥ`D4c-6 5_u0ɓ,N]ʼ|ߐGvkMIlAp`k-Y{LgV"ڦ)Gcہb6];9/d(eOǕ9smϻ?횭M7RIcls .^yLogjB:yiSf—g8v~wzVt`aKDAdT~O^a=tu1ݪ< ni{wVSd~48"/9υ?=|M *aShhUH0ibIH CfJE{1@[kc(&%g2iqy[ S+QwM\\NLs2adiydJ^uV`}QB7Qc?)(.p/ 70fJ+KW@IKD_;NuR _hMks< E)ewAcӗNl؃Y3[Ơ!0d*O-=h۳5TjaZ$Lpf Iu1o4vGSQ:h5kޠxkFV;f2.>H.z5zv@ Vѩqzm{)aj1;IZJQlоXӕY< C"`4yh5CmS+?[l9ʢ8⪨W'6`o%LD'%H7XuQlt[,B ?ܽѫM k현Dŋ)Rd-qAY#yqq ??GWb"=ABԃb򊊿$]N홲GK?@wٚ1@61i*xIJ<qu2w_V6!}ߎJ]]t:ıN?m&`:wx[ L9r 2ni@Zxm\-,L>4~wF|]`PL /jc'r79GҚ;mimmD QyECެp4q_WhjfTd^ΦV3iM]:R K3߁N=#$) p>DΚy;tOcڼ(5$9I+uL ݥ}.(ޅWJ(RDRK+?NR(ztS?]6T^cv N![wYYqll-Mjk }O|眚>|BXzyB"IF6__vЄ=&6 G5wA> \}-6zѓM7JV܄'CU?=Z2RK3+w1|K`]MRqML9s-|l:0~_ "҃$PfCOBx8s,M|ȒւįG ]#m兩GI}S"#!kqwmД{(.V7slߧ{ VP2Pj"f!ʼm4M&Yp87l$d _jEY W/_ ʬcdH f °T63=xMum,hleE:#l/(~pp K? QJUW[ֺAν$t60V^DVwl”e]k,c!=#mU'BJ"LB1_&bb#Ez|EفNO(% ǬnX3ƨ%S#FB9^]XﴹZAlahWun,`Yہ89wWZe[EX ]ִТᛂE,,i`V'>=+d2 ]M#RF ."J CϚa3Ϫ OHjH)UaNYߖHN BY/)>$v)ae&! uT$d!|' IYZZ<6>Ն'8;A#E 1;y?ھPǹ !jJ^Nn)cw"+X+YM,DYyBRVaxBb칻 (=k] }HZ#߷(QJWJ_O23 퀿^b $T+]f?ꇮa(HۭXdz}忩L9f?hUr0$-{5ZH//Sw 9/I9y?כEb{ɓamhCP/C}[niL#H [ @?{eegB"(O ݯEDb@WZA#"^ډK4yTh4vt ߊ5noX.̒xGʴ !w;5jB!= ?^4J#} B\"!/%eylPs%}} B(;7eyREq=zP,y?`ǡDX^!Ľ P%&o+2Oy-lڙ8ND8 ?u!<  3{؜oM?I'&/I*!=DŽd)$EpNveiۼ'Fe7vԁ3SoNIRœfDemfPWS'l% ũWMhSIQsUOGm0u<^ $}9d}(@.za)N#̑7{PVA!b>!Iba﷘:#y5I9u Y}櫬/.J2 TZUջt#S%T1F1f:0 xB%[|<{DSmw qWia C9:l`z|ő}f)hգuQlQR$!ƿ7a( 䉅?|{?FGKL^;Lښ\A B@`]~qqzlsKK'ʀ֐95ZM9)ͦɚ!&֘dl4P8 aaWq_?Yf-5C'l!lޯC~mlޯCR %ʯ(Q~D+W{0{qf^x$Hq%򦙡G#ߋMG'zMQ{{=~SF уՍayr|NV3>.6g^9{϶:"xkʸ|0.;^ !1v!t˂\enKVf$aƑ|8WC|!aucV7][q0odtt"~HcT&WCMgݍn=7>@EF/?=U _y)G"z+f`݋GKh^vߕu nf~Eu/ HS <<{[g`;& %~IDATB-qnA>2c0IګlE6O )1q^NCnڍ,~]%~@}LHf$X|kǐK6HWRP&k'̿U.vh^w֬G˜l[l&2/q^9r7۩KG0OqlK0:=Y"Doo9s@e~[%ʽG.O2 aSf? ܞNyKypBު#3{~8!<M +5{k!eJ?PrR/,Ud?\n#"(Q-u,~(ޅWJ(RDז!IޕA1y 66&NUs-jXܖWB(7~kǗNoN"&OY<Кckh縅u9TW+Yw9|}E[=(ξ%f&ffnS>* V>39*%\n`bf^I^1013AƘL 7~lJ9\ygʕp:j.fdLv4$ fI\v?xM\䐵|7({#Ni fѺ M|EX]-Z^Z܃b^n nCJ^z =n엻}ѾDz['ڇpz3!T. io1v{6@_ife_hZ<;x#1/rM+_Yf8aP}Zm jdq Mb[U(m(y,^GG7u;P_ }qIz;.KZO%_EoݝPiY,+h>5c˲|ānwTa,(єj my6 o8D \ץ2 7720]jⷡGg~Q:kZ% _Y}vQڲhLJnV9kG`EI9*~0 |YrlKäC6с*뀮WɞAjޫ"jCN>~@~j{J(RJR#RIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/rxwidget1.png0000664000175000017500000171624313203343610022642 0ustar jomajomaPNG  IHDR bKGD pHYs  tIME3W IDATxwŝouyA$198 N`g: 1`&'HBqWڤiROwWhJhM}gf{{fU*1x%x±UaT6`⠯OH5}?NCԨ>(>:Ax7GJk˶?8r5عGcFPI2&x}XL쫬8*8x{!F`x|meq $wf#]q@_qڧӇj?7q Ho/S N#jdwmd7LQ#Y|pH*[5EV#B~!t㳖.{k8yUp)X:24M4M4`H&Sn:m CTiiRJmBش:v i,7 a XR;kiip(RH)d28yE0@(?RJs]$`Xb@p\`I8ḫxB)E8V|(=o|_նDBm^=6Qm ?]PvBdLii\:.7***`˖6֯@( X__uIm&ODUu5y}}}l@kk+yC?bFQg2{x $Hn][B,ۧ r&ap0X,J8t]SA h~ =l! E8dNx٠cx6F(B4  X>/=)S$4w8zd iG0GMc_$lI42u iiv8'L͘*2u0 `¶\L&C0`ι8XYgM^,F& e45+,  pY}9=%][[aoldnB0yW`@b{(z{IҘ0 ).*4ͽ>xB(L92dE pY"{h!&SO3s l${ kW8˘_(`/cWpz‹x0`~{R}\yzA*.jd^Dϫ'f@(ң/Pϗ>s)ō_Ko[ v);ɟmg|~F6R-iI" K4M4MJ8TVS\RD|0R)e.C`6SM,SI& b;ۤ8'QVVLEy]XL|blF3.&?Z6a 3͵uEgaw5#{?<#ΐ<%Ņ^L<$LEқ+Exŕx^Rnd|sqD}řy?H^$aة8rüj `I kIG !3olCO✙灵0la 0VBUȤm*{i~5yR77WX̭w=ϾNEә{l%<5`X-o=OW$n\ԿM4M4mEv?ax<xH-D6=B øK(& bi$cRS3@ 3W@jl&AUU7P0D[[ -M5@fS³8qz9.a2eJ*J[/i#[PXRIue)jnu#dH &ͦZvasRl;dRVG[iQb0ISST%&RiSD먯*T/5ASMv<@L*qu#iN4M4MiZض͘1ŐJb ׯ4,@q'-)'Dl.͹~/y<'""j|37U>!Si,8XO;.rQG|I..]OQiiiZꜭ?dr ae0 a&,錝q\ƏeYLl N1A+ mI _4x򻮋q4!DS=cM4M4M &H%SD"byQ,B)E2">' cl}[s\;mSPX@8SG2$HF1 3ސAۡ܍sF8N頀 ^gyY1–AqvgXbљHlHdoQz(M4M4MZu (a, a- "TvE)ѮlB?ܲr,ۓ ۓxʟCJ6Cp]oߒ^7'!P6?ԳiiiڶUgnWVHWNcdxk祔8M+},+iiiDZ;:#h4M4M4AxkiiM4M4MtiiiM4M4MeO`q{iyގ. 0 };Vii~2ǍuoS9gɴiS0476l]u]v8,]+Xn~Ba0OhN$S)\By'8E,Y:uu 1 L!LJ$pe08DwOB2 TL&ݮ$JL&qqIR:P(@YY)f擩m 1 T,[˷?p<ְx2 aܡ7;^RJR;yL&C2M4M4MI.$)q] \rч}{nb>OSYYEO䢿cY>HJIeE';˲x'&}O8ArwxW1}]|SW3{L^ 3gL/|<PD"Igg-(83~ N99s iO~N<2wlnׯY3gPYY՟-[93 Bc3N{O;jWiiIJLyy~{eYTWиVYXOpFTTwy<>C3g~Gu$64 jj;+ ]<ô,b(k֬%/cZVx-[:ׯsI4M4MӴ'4s8 `" nƍmGam ;X,MkkD4),,d„ [˚kÔ9(¡G=ֶlE~L$y䯏NS3f!ib&wWbqxG"TO$sb5UWJ1~XJKKt̘>7ZN 3gLu=L&vz}}Η @&L93kikk cz/YFgg^!Vz^y*s43OcsS3VTTWVːƚii?/1P.PмiyB L\9)|ݴ=6}*|lܸﻟ/XE*B)E44M2 t4FضM&!  S=4Ɖb!Jp]7NˆB)ÝwV˯}x]~KbTJȍP;m-..⤓N X۹/:;dž )/+s,۔%Jnz;w}qQʵID"aW4MӴي LP@Fv 5s61#zOكh3M瞻ߞX`|}lڴg^{)%~/vGQ\R̚5khjn2-;nyyݻ IDATy,^^=Jb8Koo,{=ܹGRYYMEO)j٦JI?sio~Adl`(7.e!a,].3rVZf&y ,[:sv&yJ質iiڡ06CU 41 vsz!Xv_0|(=ikk㩧f՘7ȇ˖455[onzB0qUW+lR.R^yM6U455gr£l0s'dl'!LޚXn-SLSNn~{ūʘj'|+7dYDzzY2ONiI --<,^)="'O"n[.% e { HStww1glHH$i̞=,\2s!JaL}9Z>}>cTQT\+ަ}9k iiڡq7 IFsB0)%'O>ϝwޅi o|=7KD"(J'8G?:KSf\O?!an-Z\R veHd|D.EMO2Amm 555K8nwyTVVpYgQe,^]=kN,QPP@mM Y9stI5&4M4Mg @ySLc9 ;9~bt۶KxNࡇbѢXr%3gΠ K/sdztR{1-z <"^]]iaf̘K/̢ExvWU2Ó~JðeRs=OiI)"_UX4g446\euQR_KeZmyDB7l$`P  ?],ʭ"w +WNPh[CCNXϺuy饗9nޱ8R@4M4l,vhii)_~)aPRR'>q, .۶)--#rB(d̘j/N0O$+ȵL<+>.W=t`<2N q쌍d5s&/|_W-,.iƓ(p D)g:i$S)<>y.mSL[.\t!{ e[tvr7$ii*Bq:S Ӵ$=zDvC_fsK@4M4MC~Rbe֨F"B)a?M4MvS-ﱡڸw*I}0v̎z?|(ẻt*9j! aY>!-ii𣰰,suue\zPh?Do1ߪaxMs"0 C]9B4M4MӴcͬzg9f4M}`Kc ~nyf أ:5MkFQt*iڈTU؝ Ӯiz M|p¢b}PV\ ]=j,#̨e,aIZ)f;!6s]>V dm-KvVuuEb4MӴ7tvwvݚ?h68A-[0bLM-E[vX3LӲoB Pr!N>5jL> a@_R=*E%TTVm à6g0R5H8N(6oj$>8ʼi [0 u= F󨪩!}lnl"L,ѕ=i644)Y_J8hI,AoO7kVc'ݵfRIXPPXoFiyQP$T >Py%'y@KTUn⤽Z~KK3׭a#rtuHę6c^tKR4_˘߃b7ISث4ojdsM=f9r~`60a$Fs= P?-+65l`Kk3U5ǧi6BLnJ'41e )+L6_1ǝH4;s܉-=t*Q!o_;&D k7 `I?{suJd&P^Q"fZyEEQa(CNEEP7q iDKGC2-ɏT-R#Oa=&Oazjƍ4['4 UTVS;~͛觠NbBĭa 7͍ƙG ZdS>1^ryXئOϾ=||B m^Tu'(g*g2 r5t?sꉳ8q l8.T\{n9O,5cE}WCZ-R V(H()Σ8XlkO8mK7mmݻ @]aDUum2^@?-^:VQو4M$ 섪{^^zzR[o@*;~&8eLQ0MLd% 8ں}).u򰦍n 3U+eڷē,ߘ•Ղ s'xnDz Jc+ 4MR/AcKO nڛf([2G _ayL(u,j+G+;FͰxKdS>]7v`VW)WlHӗ0]'.yJ-tx]N<)q]Ey%Hϥ47&XjS/eabM_-o9Gݶ$/ֶ3'hn!rH4Iz{38ȝЇ@<p*k{6aKpM'ִ>LD4m RY7uKLY@v1sr bڴizJxWo%J@opq<ϣҲ\vd-_4MĬJRm{ }cS2auaD4MӴI?#(sN9=w"{vdqŅVQH$!)KvԬZZZB_?䙟xmKi䍔}Nj'Ou2iڈ!R=>a) $ d8昣yy +C|d˖lƖɓioo^8vHRzd .8WR)40iY\ɓ&?06n݆PFCM\g ;DEZk\ea)=IU&;2 L!>ɏ!P*j /W ד- RgKCW0{hPT4Ey~J6Ĵ & fÛ",h\^3JO)2vBڙ: "vH86$6M2&qRT ;& fppBL dqޜ:yտR҅D#V!}4MivvI&Nu]O~N?L‘g}6<~v!fT L9b*]t:0t,;p$ض07Oj6t L5pw5bCCPhA,1+ͳ9k1/ҟpLuq]wmyha2H @,l_5uZN>t\gri~D/s"bܑt\ JYQ \$SfEKl]u5y(XBb 鱱eJN^0d7e$7Oϝ%fMFe#8.4"qH$% kIinl8qH2Rqiokg/ץx$t+`Q__Ggg' yD@ryC4MӴFf9^֋{c[RuR45v @.'Gɾ} v2}O=sM w}wF6X!4M:&4 K"E%ܒ`8bt-BmuaS"{y"!j ĢԆ۲xC_R02?عK֋_K4g-8ttsW_浃|xeuNxkBaΜ:We|}q"==}<ນku) <3+oD~sMEL"E Nbq rLR7Fw8M~I=`]Հ\uB(nW *.DD?f&XBkDǟ'0R㛷0u;飵Nl[ RJ~+VuIv֞bǮ={m)7K.}?!m4HEK)RpUL\.wKLOKju!a OڵJz IDAT<7Wo6i44Kض)RH |u}+9s='%^ř3'y\"fQbfl)~jqU ]O@,KK"/)RHޑt9]!d]_xRn{LM[ٻ~LL;]] X {+ k.vUMFNwH"EG \ {Wm:ק;504Doj6(vNyW%1I@P/'I"E)R wxmS'"iȫɟS c)$Z2n z)I"Ew{㴯MDQȕS|/^NپsO=\a-nP&eNhWA 2ޠeb~u뷔H"E@z]j]Jyͱ0kYP6I›{5bR RkǢ !cǎ7,|C=};wXw-x/<ݶCT -8 k"׭_ƴH"EWoI0t&qQJoAoO7o[۶mc``mxdnnoIDkͣ<<[oŋ_:BO|7n[-m9$s}J@^h)#B(AѲ&/55'Ɍn١S"E)"!lB!n$W"jLNNbHgΞ! ø!iHøk= #!= S.CkͿ?_tӜsJ:/=Ja @cZdCh= >}РԷXܩY)I"Ew`e䲹 =fG oR(~IFԧ>uy{~|СC|DmJaYA h0::zˤuC, M{ چvy 7(+I8ފsrkUJg|)RXF_/wQ;ɱyg~w^ܹsFd>ib6''r|d7ЀHi H]m0k&^}1ӷ20̀h;?-trH&N0^3̍R'} qu,'ⷿ tͪ;rquFꄞ"E)~|eiO#g~5Ǿ{g>`B}C׮ٻgFv|#D+$}lNǗ&):yWas{n @.ӷ6_|_% yّN "— ~#pG@_y$݋3 y~ %e]s<+р1+7E݁ୄ|~+)I"Ew:IwDZ)Rw `7;;V^&}L$8ZXv?$w:}qM`V]ؾO\]$$6`7릂&,[G6tǂxэ3.wL - U?b(Pi*54,ȯ`uyPMtH"EF(ϲtD*z.c_5H)ɧKZw X%5 $ Rv?s 3)*{zBB)s D`>(D:i7$luZ$ Dm&dgubn2yi@HHlPI H)Rk5:]CӤh,Ac<ƚͪ^G@vuٹ%7Aٶ|-, LÇ&; 58$KU UܖD@ZNUjD5mZ_{>1+7:)?-Xɬ:A$))RHn!MLv2GJ"2Pz"L_̓:5l# *r >f6u9B?@os*% ׀/4tB< \E(\)0ՑB[mzpܥc Z5:^W5X~^-CIg+dwc Uk\V9/Z=^SXsk6īW:Zfzc֚{z]][k$[iWZK[?5x6[~ بj[՚WcΚ c3ֵjDk7׵Eyƚ>w/: |mD랑\3&wvXggn1#^xݘ_;q[?g&736W熹cmyb:Ev<=3Yusla'׍On]&su6 +oZsOnЮuu`:֡պ'o2Ժv|]ֺyȺ{&T4R ƹ>j@ uL[uʸgiH5uS5Ԇ3=Е(ChnY-7kdz5KpDw:U H ΅I&} ɧ'v׾'#y=K|1l ޭ; w0m㘞sgfb8 -2'MV]{Y2zbap>D/q7 o/0%Z+зY|A. ǫ%]4T &0ۦ8[5[=8͖}T&=)f>`mc?{{? w|:;}t!|Jr4԰Bw)ֆ)ݵ2Vڃ:woO0W(D#-/qEav<"@~;0G=%.ryH!qߝxj'aędЃK{Jxv07tT}NQXG)ۿ@a z̟~8dd,KW&_S~%.^>q69v=2irè W\8CՀcaxbofOc; 3I1xyfsbq?Co{УԿpq"itS >|yAqEÝGo՘;PC˻1#t.r!Q=Е F>D^aj^</mK2jSA@g{Xܞzl: }vt3ױRvS{r.@d7'U2@?qy>>鿌0Of F)V>@Pw)>\gą=&oH ^ފyh炤Yp^yjo|{ W ԇye/젿ȅ8z;F{v}sPѱlY`\89[lso}d ٓE9F]Ziݘ[d8ChE3$:C{Kvb@DF!֎vON=1Ud_d04B=sG}L`^/#4Qo<̐W2\Z`%ܹ؜acrsklz>f 7^ߎ{CO! ަkMFOIv(rD3\w6ɱ v,^9HnL>DQd3Ng爲s,G[ް8HEK,m1ɞfpvFEn16sfw/XBB:[o|Bb=r;.FQx-fdw_gQ%z༽̰v0 $2TGueJ6@wQ'(5 , ڄ9 (( w7ԅfDh_lAN5't*+fTbg'g ];4rg/rFz1r1q+0pc-Pzـ!T1Mc#;2;F y0#g\ EYjѩ|ܖjYDs%5?;y_E{Ά=>|@s%#wps!朠,l& ļGo ?aǨE) έ` 5{mfD3 =P59.MT\szH _,ڨЮթ7,.\" Qpل =W6 2-ݢ^ PYh^Y"lLsA1l,h&C!l=LQ VQЌ/5G#SC̵PO6ۈBi[W`sxʎvo@d׈EIԶj_z*D1FTf"p247,jKM.0rٕ:Q,Y YX͑7Q}eⱓ,QX"170qȩb l5Yq}ebix{{:ۘ"-b衐0yM\RD~E.2^1Bu{} ,Sb:,naɆ*| ^ hFpz"2Q0k!w,a0t);Fvp-#*truU ع]+F=ju)H3v/H7Y+ހUrL87 (IrU"rAT6˩Aqx"\&&n]Fk8i|wNirxHLmy$_7q\*SbH6`, ăbBɒdMǎ Z[;:԰ w⷗2X^y?b_ɥM9]3=~RgDgcGjTFџGݳ(FTʝȮN3ov {rdQf}Wqd; t! Žt]$_bee#-,>Y[)c?Clݍ{U &sfʦuh,(ގ 1 LkN'0c!ScakL9Ca#{YΆ='OU &I>FgA9IA˼ʈ:Ylr8e,$޻T W`qzVcxsPBf&h#z+e<*(2Q$2'4"gl`, |'/&JJ[]: I:م ŠV >5`sCt̆oPj1U2Oc&\ w,=gAC, \Fm;0m%͒yEߪ[nܶ$E, )%5aC&5?wί0 ҇s玪U ڑKEL⪩h#4I:Ӧ՜ *%ZM584 f?8gwz 9 ^Ig; NDiS:U `HL "fe '`9'/_ Muh:Yo5/$[ l(y 9Z@Mz')4*=l͒&[ªF}8t|ms,;u8?K,%hs%|Fg ç>zjyQ^&mCtzi DG ?U& }=L@fOc 4h-D8DbH ga*s@6rMd5f\dC/;_uodͽ>npy_aT)@g46Ȯ|[{w9! IS VC//-~9~~&!BL$ Û_MqEF0Xw:Jv#]'S(g$kFoztn IL:y8NŸ/W$ډ?R/H>+n"V HQRCɇK%!z)OMt9?|:1^Fė$ܸu$1GC<>[4g<& +++ AEG%ire/KpYmB6HЉ'>K|L;n?i%%b&?XL2EٍQ!6 tES r7O`9o3_:wwPi=6L|#vGBP\R:,#z9mSCooǏq肋,6|Yj;2eۨФVt ڼT\Z1ib^Xy6ҢUǎL.2{ك9SEvnE:e N! ЦF ɢ\gPq rMpsYӃbih( QZF2Y*, (F(ri(hВc)$F p iNN UЋn@\[ƨ69eFtɋ݌1JiNUh6-,Q*-N們U EnNA9j@g<a,2C{Fdctlz:O590\h@C nIhC4V_f!2h!B$2D1:>3RP$Dz<Ķ YBlk@yɧZMT0ҒDs%by{&$C-1ȼ|/tHaIs36"D3DH7X"4jPDAdbԌ}-fB@ŋ?C` 1cJsPS>zg@yPqqff; X p'!Аmmplj5(MI0lc6ѡL|mK|< ;%a(Ў&Vq]Sv;dl%1C)1MAnΠ&TH} ]F4$'ѵD02!h"m,T&L|TDbJ؏AhK0;T 1O)}C2|bJ-b2# Z=6T", 3$6BX= 1M&tU;g{5[9~̬lLsgQd(Jgx{G-VbN^D l%(|ܳ g\wotI"Z 'au )KYJ$binÇ9|d||.Μ9C\f׮]JJB^?9*2~7!'NR066|۶ٳgJ)<oIww7vX,3[VDqD1ۋPNQ-vٟ~|? `F Q,g#o~hjm>3=3y#x}(If}#5dVC6mR[6LLj_VS|u '.4̄XQMdWOh>JUh~AA93ӃS(Q1:EbPKM$ιpzvA59S8z"i &!Lˆ9̸M *QHpAO9c4Pn@@̃z )]"]r2dF0CeF}mMXB6E *DBA@ t"eIk&o 3\R躀Є6E4 J`A0oC3F &qGmE8J<aȰ9=B>1&#(jjlȻ ɢ>BچB.ֈa!Vl.X:'Bڈs"mtԂeݐGhm m+Z-P&X>"QPEIa!L(QNъ 67^BD1kSX1b> 3(zA&۸C]da!3k /1Mul$]-Br@rH&hݗ˜C1fL}^_܋γP7Yjdbzvq#s٥8`-/>pz٧3Ԟ5sHI&qDULn{܅`ދɘ &z&w`f5S^dӢݡ!Ȗv &\x:!]r^hC&,I2&,*d>_,sl%Wk Z}nB#)ie4q$4~D$g[%c̓5Kϳ{7iV,B! QC6R©r"T*El CQ`Phi$4=lL/޾Yy{GMECͩ~o?s}w D%2KP>2eU 3TUEc<͗S`+*뱥#3%>ّ(|Awg5GEIdp90,#(B'0fw9/6fK=!盬lCTm<^U5 l3=AVt o-Oq)VWW~ ,^=9??R޿$IHӔGyxaWKF_KOyGټr >ߎ??Y1~<ͿO|/g0qb?ϹW_{:f}o M]q2ZN` &~h/>Vw VᡝINʠWY~^xs`7GO b0Sqy}#j]WW_MÓ$e w]Q_s]-f?3jμ9c%?c{w^YyW>HsE-rS[O~Yzu{Els p/>w<9Ep?dk('[|rf}cO'};̫8}] г*)!V/8,_LὛ0ׇp{ -Xƍx# B`0 n p'27fx{ ,ǐ\0n$ dqw"oKU–sQ0@L3"D29^7xq\وb%'HOxh; JXn!3O41W*Qܕs|Wp:6 S<`ϥxLvGΥXz@Q(݆ ;$I>G{ӧ9s,7tӛ_gg}~-}<3\r=;3,ԧ>֚o/rbQ 0ҎG)>{oq~xs|G~T\D0Uu!~fp|v @g7+{f|l(iv㽺;QIǤ;p5TP\թn#;T]Z&ՄJ֚X XVYzW)Y _sѺ<}-<)X(p<}Vp14ǨA'geI}4?MxTpYgvpqfy7ݷ4yh95y9OX!G5gyMh%F$e`M7\ <u'mzǎ0J1nē7ə9P7#[ހ<GFy%c%e(OfT_iR?Ha]\`C?]R.ZPna yCS68&QOm d,^<u([(KD'D̀1$C- 1QU+BDPoCPm]sI,q5iԂVL,$ ȯz>JaZ"%@D *tnPϖس0;1gb2|W`m=H8,8XC.P@>UBgJ"YF6RLHr$]9Z2MYi;-cM ̚"Xpb~ (=㹌]iZם/dd'A -~ Yt9CsX>XĚiEemČ0f)q͐bNŠYB_\(镊xӱ}.SBwϐCAߓ^)B^a: W4wW gsz7[*5ٮG0RgŌ@tYDz wT+ zll(]H=*7vIbd$9oK9[Ud7 f,XqRt ;8c!e){jB_hZ9$]InQ\a_s4͘vR9ZzӎjQuDR قĖeMe-#S0,!S)] d+ܬLLV17(7[5`i [G3į" 2./t*ݚA#cHӔ'x( ɋ ܮB'DR(N IDAT",CA0 ԍDQO|grɓCk͹s8{k/ϿI!&{cs!;h@qIjbop詯 i[I c"pwYGl-$?x+#gcbxl-+Π)\𹀖e䌂Z=xp 7H8:?S\=lЯis`Peq@@f' ҃ &U]s7K|֊XP*¬Ct~YoLk}EGaQX5eMR93Hqs4ȼF[d2{|kN E:1 tK(x+jtUS8|rkmSOt&̬NXG+L0eW9T9V5~60^5 W:/)h:A "lTAfR!kOJ JjqX a\7KF"Z 2-  LSb^LnxP'Ŝ#;HUB.&H" &ܳ$< BcIɣ%-torw9"x^`R0hazPz<2LTқ ov+F`<_%ٿEPx!=zlг @$5]Qaፂr&Dy|WnzVHkQG7~whx DC4wKχEZڈbfp\5j]41I֊xI: s !::OhՈ񌦿RZ۟v 6Io;do^3_ӆ5'=,3{ |$gj9)tGĹ{BCB%#+Lh:ۂA %,"T38 Ɇ%)eJK Bd84({c#HF@Q[%? \aHҗFYibt;'(gajbLӯAR\:6/y©P{r;J-:*`6%9 KI|!9 Zvp@s|^TLM*$ Z}iԋ-/( %lPV{N5k۝ 28?L E#$2=/֚ɟOk-?3?sRJ~x;SyY^^'?z!*>)%J)~~V??R =G)qZ뷴 bM]]|#'n̋kRgwgk4䚽H1nߩE5u' 7sc[6u/iݩ~]8qǃ \}*F lM^?;^w fI1C;8WUUZ0%8`k.Xq"B/ݵBO: siME,&i7tHɹnʃ zRi]qS~<.ʥ%N\ +ϝa7ʥކŽKGپ=<|sF@BC"W[ND]IS%(7Q*טgz3)12\8zuL[M> Ci;(*$MGYF2.HCU7Fdx J@ᑈJTR FgQ$%A1p,Jcz$>juhÁl Gӧ QfMS>H@J8cYBznF tPB ZU$9E\PdwmcZURȐ4+\BT pghc,h!H#Lh*b 2)0M2z#:xQuN AcdWcNZ*H@TDXiŽG41І8PHMpD*!V{Ahb8Z`C󸎭LʑT4 3!+ Z+DǏD)iVqCextc5(CerlZavO:o8ǟ OKV/imW4 A)Q![̦P8\ƭ_ 9a8ˡŖctA6aKz ֓,=A5vD9;mhJRYGw c Zg Q#ѐp2#L3\ORm}t@<f%!EC;5iqZ $yӓI=í秹c?bAN%~%y(`x~+ ǯݑ{V@o߫ǫE ,:A"87z2sG}qbV?x;6ꮄr)ԉ}Щhf38=WL} ?5!lrg:q۰b&7βd83 2|/<[mX7m/px޻ȕ&z%,M)Jn C![̥'3GY̏xB}%lOP :6GoJ ya=L9c,%ܳ:Ͻk#O]LŦV\ -3 f)0^}"CT sZu=ZӜ飺 !֍;3l|vDB/6hnhd޻$բ&8bj! a& "`0ڬ+Nq#b ۣl<Ȭ1n;l7c2[5m0T#]GA)>aŠkc4p :Orkp0ODO*C rw% ̪s.F!f-{‡ g,#7&W+-p&?C`0U }bb Po4i㛆Tp"a^'[$Y0#D`{)%;4ygxrJI G ft _.:l!^\!7gݼLw |˔D=fxSݩ:wy[.nL4 G{?'C砟\ h:kpDRɚ,k*|zjqPT/߹ F32J5 iM*&r\aiP =POaXwcw{z,.L'?+]o$M|o Aׁ:!(J?倈2 .^`fu/3POr4ͯh\ʙG<|쯬*{,-OL .ߺFyr,k[3Q=c%FZL#>a<<쥚`a#熨Y{wF|z{ynn{fV{4]lh $@-EQ6pJ\.'}(V|Tzkp--<^alAdxI ;d> 뱑Ħ"k"a34N4腖WjA!6`\z"s"DST^?+  A ̸9DD?T8%jH 3TiOacM Q c "ҰAJm'k PuqE%m) q0!TAk"jMBdRJ!3-6p>b v4G*%=(p UWF5.x!qU1՜ l$qVHOs|CM=HD[ޡ8$=H$Ei .U[:lK(LsHK*˰1ڐ-a@| H.9P&BHFkG#=CPyXҦR٪[M{]ޭfS=,ě NʪCܩhM79n5KaKJV(o8Q4-Sƅh $~(s%>PZ![!G(;H!$ z!jD8 l(ux1=.TUw>¤ U^ xF %~RPUBz7ӛ͊ˉ*ojF+1iys1^pQJۖ 21m1'4V8"Gc( IUh!)CMf"ҡ[a Hlb4;MDDjZ”ECC+"*+"AafȐ zKji*RL Q3 M.ɳْiw;E_i7K,vN.D{V5e]jգ' xn~ɺrƶ9mV]}# `UqcFRG3NG1G]jZX\ /LʯOf+$$15ҮIXh7K ZeɯN@H(ܻUon Nb͢p9-}iJ$C-300/q]Typ}iË-r$*Z(S a jgdsU0}<$j16 UJTTc깰*: /7\}͔Y- x eW[ O6(JX㟕·w})U@Xqڷ4 A84 #˨si|} _`6uuE=Ci:x"ŲvdviZ{8#ʑ^ޢ*g&fV$j#f X ~R;v9aCy.zVvD%.ѭ7Oo_`}} Z[ N!W,o }~7S>ltOuG k{K.ڤU,꼌j IDAT׭7[oeD[xq5yeQńZyDϊ&t IO::٤M؉o'ݗ\F;È;oXo]:1Q,6[t' ο5: #2n_QVwUUs!_=mg\Be2'Wwor3aԘA/gu|Cx#?xQ'$:Oz Zcw|Z 02rYGP(3>2~ r#hwqS` ^!}L#f;eӇNN4k,*Y 0!Ni3+|8_;<ۃ86i`^A!yhf bXj kc ye y;уK~j+y A: H <~:]`zK@B`-a=W&. X)x]AMi[5*Xug:8VP*N>U0⢃ᝀG\ tmy,N:Y}eᨅoT.eu9@@M8ף:[@jaKxEv%w&tCt\m8v؏jzRA\ v|jT<9 KL(^|qUtaGΫ${ v׼^ݥjuFBm[%0~@& 0C D̘q!<&ckg Xւw޻\~6'KUjd hp?"#22o`C/z4ԿPoiK0Zf)J#e^;p3t /o}1hPgp6npǫ`e셇}ѿ>H^_%#<u >r<%XNt>n8TAwvv삓Ϝ\v Ba^1M djɐS?~̀8;ndzm@_vPx$4FuJwoǟ 8DG$c=O[?@$\٥rYmHxeغ^pzqc:>̟{z_txcS|$T}K^'Kdg&E̓ ?F*"XJ/(n-Wl5Ep]Sc,H>F0 biʚzB-˳79rqfUS?K]K҃ 9Ҕ='w/}b@6%EϣrCqJgıDlD?!`; VFa$A ǴG7Hf$g]0wp))IVcCH F}\Vae iג@ ĽW'aKt֕ G'0J GH'ZP ic .\ ,3b]B? 7Z\ZE&%~Ԃ g3YK0d;Cף]tL"@L#dQA-#n i_#*o<,5LT * 1w&b .{DimL$Rž~%>?`w&9QN9}t7s\ok\egz'OsxWO)ܽ۾KF&s UKBB)44.ܳ ģ&7UFV\ܳ#9Ր^#L,b"$>qjMLxw$4ERΙ?혽kŃ{ ݷψ4## W"oN<Y=6b=Wez~Io4 >ɧ`\`O$ $06 \FqrȠzӂZLoMQG9 E %7+Kxj>897'X?~`Dܯ8 0i?81*nl-?Ywy91g 8˜o+Q`0l@Ϲmko^ю!Kkipç9~5)N_@ ϧ{Ŏv}3 ULn#r Ht q[YAxM7z OBͲbX ]"xiTw}{̀W z >0wF-tR pM.pIܾbwU4"0i{~CL@pϰy,rog ys;d/(E=Pܣ=c् N=z^ {~MaX,7x)p%k!c-v;)T g8= O󬛖H&<13|y3AxA K&IDE-j#!u b%y6 j¡!]-m-su *u)l&;Be=Z\w|Qj% ֠DŚ|H3#=l6@4ɺG0 qBXw4mMEBJdCX1@`[-rV m`Ch&kTCJ=p"X$ZjZdvD/gˉAbke_ 4uJ2AQ΋V$G d힏JBG 5vnl@3Ii+A GH#q(p.$n4F/A 7PPEDX 0'Hu^>o}*g~%2 5mKYKX3 eeR - 9mbX?X]ʸrD4n]$Z&,7͓9`Ӗ ,F[iG=-~tl]+DbEH_Nސ8  Q;}4aDN Jw!v6NDu5 Q }Jì'XvDi6?)=V?Q-͉NV_eOUw]|g$N֌{}|Mʰ"]q5F};U`_S^ Zb RG\57U\0&=i"P+e^o9#.%6.yoqS<цnS.e;b>kN_[3^!eǂ5?ǎƷɝ]/ ;wAj;Ҥ۲!' 4}Nw`I^5^!j09jMwl&|fI+]+H]\<6?q>Zw2blj:hwl<;3xyԝ@:iP,-º'.!D 5!$Zgy쯿]Cd7h&>ǿ߉nmrj[b 19mP\K* "{;obq nxƏzBcVFl?ğl~;c2H_MJ᷎a9!5b6'bG Ai!5 O=E>K⧑Jo!mi͊-\B Q4$G6u~8 Z!0&'[!D;8N Pp`5aG-i|) vag0>u'dXND}%v}̦#۬)g3t ]8\hEL[M7+o,@@A߰]$O+af nU;uSumYFMs=pnd ""2<+ڠh;mkb8ڮ}5*yp:o2D `4}ٕ4 `SRrDGuSH2ޛhSB_! \Yg"1Pbm RjxgNaEni$h#Z$EH@7qa$PʳáD#V$HH,A:ry fMXV,QkMB# oFb5<,jXj[)OZ9H6Ahz{]^T Sv~$-D\OtXǫVgeB%!DFK']FsĆA.ʂXy05[uO8ܔxx! B@s& t qN!ccxL辂 mp4 HQ(IgTۂoK[ț5R'/W0qq{~d\}x,Z" џ=ϥ~~o#W_g@&ۃw~nAr\pqKHt7^w`~+c<ӣ Q%28X.aG p[&BX^$ E(JUG9BT7yِ8: )aEL6p}ģ bgJAD&pTƒ[q& {jxϐ3Mp%Ro''RJtM,;PP$`Z•#h%bÃix$1;y v" X1I^⾇``M~wNF,t&6#[{8A,Nh$G]ԁG-"*ι '=l-x7s%q1 byoI54fuR }M+7c/:D8a V"ai)_B,5=5dBkk>X`jN p/-iv$ITAlGD+(]J0)cK)+rW)Y,W:@xbEާ6=Bq[NƆeQI< 6Diľ PMY٭%GbO3B=X|tC\SdmCzVˌqg [ HqՈy=b2CCEJ=AoT-1M?zGOl;{BE 5gֻ z)̽ FٳI6EA[hr5.>"یT5DyÖ8<,㚀CF!6mn[cUԳaH|f|w"7صϧD{gs?X!sE Ś :m%U?b{-lf;BS(N1=Mq~<29 a|aPR^3źMHZ,^ 1.Ț)b P@hGsrߢ7a,}I\AvVS`\ tZ=;@B)?ȷ~뷢B6|5WUuyG}(^td_9鼺;4j0n||~vJ"/7_#t }]1K:80%l TIw@[bstNG5EڐN$I(X(j F$,Ma%l*ebPb60KVuiedSTB :aGDbpjErӓ=V^Ga;ND)^I@+8G%lОLFu̍0 Ft2$DTЛ*6HAYV sʠ1>EkL(rjr2A4ܡpdђhD dl[R!݀,n3lb_I*;BP3Psvb', p>!̐9K1h ̈d.IX!( YfuA"S6s, ]]pIƁ3C̸X$K&ܯtLQN4erLRk#ńGz=. fWLMHqѝTF lВׂ6e5ǥ!Wp*Ղ%}HhX˖#}͘n1S{dI"HX,Mફc 4 jHÈ$A~hܒ]+X%bUF% ZZ\tz596VS)8lkVUâ)ي, ce#NP)dM$ fEF6A nN;- Vr3BQˀD3NrN>[rX%Vx90G CBYQDdj-VԾCUN3aa'}/+żPl̚SGeNvrȺp Š 45:LFJ'h(FCJ%9 DYNXӮ*| _  YBRhU KNDgMC2 3f&1=SdiZOYyp?O~|=-O-oCm۾ [yOnopjy 6 V0AK:(:u|ɴi_~x~+?I6ԸM0ü$,"6ϸe8Ɍͣ!z!ִ 6LV\JPbΜfF$)|J"n6=zMo)RgٜC|qG̅M#0 #Vg 'O23ң֖4~ :5~Z][=*a#gKH4XϬ#aL ;KCyV%xD-^Y℣ʐԈKS\WYKF4˴OyY6K4 iIdCfx1Q/5_ ;jD)ٮAռ<ԅTC% YbN8"y)qЂ+ig=*XtEF=q䌤8b!=uKbIEDCd0ՔcxNc$URMqzs(49ģob;AW:.8LO4bzkDRA =>ΤU0%K\ ©|d^ gB֤Bˀ.uiw -g+rz)S~Ϊ!+[/*ƬV"yeBjВ=*,<&4oŞYC4!UӶy`PB%80-$)֖tk^ѐjZ2W!9B؜z!}DM8D#R9*ř(^NKMi݌'TfkN=& $=׻^f9!OeO7nM!8kP?#o6Zb^#doo,~x?؇>/گp8.#O锺hۖzt:~_~~moù4{0*g}e]Nʯ& ?ދ. u[?w*2wSdnKcv+ \l++_RkSoL=AnqG䕔  Wֺ3Aӝ/mw&͌.y,Z&p*(vg£yuU).i+MK*E֝/@ah#m4Ai]#'W()Q +$%h ƯX -*y^"x yD uL9@[eDWK@=MZž'"e%3l. #B^h eHc%--.ڐ3Tbg2("u$X\#WHY ws{x^qp߫5xǜ{?l̑}TwpLyPCD-/OCL;n-6qOܲ'2=;^(F[VV᜹DuYds^NSsE90{>a7;*)R IgGޘ20M7ӝVFnnR<8͖6k`E9yf~WrBkhV5 KҶ<4 ,CKD3&0dn/97TP†6Utthg'۫zkPqc(ƒFNj #F'6csY&:PP6*'w!O |Llh @>aR`#ŷ'ڲpK<;qbUbU(3W^7|3/QsD r;ySo|secƑ}c|g'?ɋ/_ rJ/S1|#ۿ۱w|#}_]t]//ހa駟QU|c~闸s6M|uC2;ھʻ;yO5dkoN2xvm+i s#*ﰬ:`ɣIyդg~4aï *tբˀ~}E- yVqj+ٯ&Wm5Z+7ָE|~#Q0pu6l#. R[OlҊVFkE+@38DAYGf&Ў2{ìmgY7.L"΂y5⬥tEgP+5Mc39LqnXQ(,$7[!:K GDqTHKpQ 22'CvT035(*B%5j #dbP߮ΓŰo̔\G]znFfj0{J1bPd'dk牰T H%ihBZ5oZMc&e Xii*<5)kW}ZpP=,iAkH2*fpPXZ؋y|J+SňG%a%)(js7WA b,~59 ^ϲq=ne~Z)i'I2pB==nM:bMOC%lZ$4uؑZ\ ɑfIq8`.,= fYcki:W>= kHC%=-&Bx؜R?\;l Xc3 FOxhG!ؗkWDX91|{.zӛxw7Їx;Gֿժ*!Ɨ9gַ;;|~/ۿ}rrr||~ o{4S?S|;_!s?O~?DN~_a:}]ͻ:eM++>L?ZkkQO@kL>R*Wm)h]'XzHOAr+ӕݚ-k}@ 2 DZZlx nVt6HYZE Bx0ծC:I֌Uak5d[Wn[Q*BU#m Y WGja %U!WKcDW7WE@ 4sPG/Og@D)#</^QĀbflpڡ Udhu`1_Gm#RLTaQf]5֪FOdYhATBJlRbC QEd$KpLfd%!Gì<_,b"ƲU Y-f1 jQH! $A c18XX*`!zGk%%b] xaA*uToq~(c!Kna|tEPa+I3DW-p0CM`c+qR)& fr`<ՊS' Vkd FTi##xz, "%5<,[ܶ¶їrfC*cx$smc=յ$ ""9u7+ eqJaʧpxjO,LMfΙA5pV M-o= 8z.R$eh|fi,rQwi6GTXk-GN[[o#?#?G؏o~1RKy{OC}{773~]qqoz)c=y{kaRp?2/|_}'vw**7/kCH[c_IoyW/_Oyv!/._5/|` ߀_ݥ_#kYqnθ5#+Iծ}|tY& b(Iqn47 $|&t?w,eaLx`R @{}ZyX t&R 9ҋ!m:MS8Ch_",354.ļ ڷL6Ss K/Ћ`r,Vwq c2 9)h2:4A"-ˢ*k G V k & 6 PElE*VZ4YlX7 4)7R7f pN]"AƎX\tz%Z,KYtƙ"V=Q G̔kŻ5Q!فj$ JM ׉W-.Di3ӒSfLrVk+x:EMI6-n2)f)3!\5Iז IDAT z Hcc¹e dϜ24mC:rIKxv1> RU]&Vd):fG52K&X,Y:5! ~CM24וzN14s8/*>XHL*9rm=찮%|Ŵ2i|9N!fb*-d*y㳁Q0g3%!3B2!VE7dc̐3r9 |uFrM=fdgp:f4/K]B> i6L4,td(M1` Ml'рO nbq;p{n!`MN ڞG>KJiH׎=J^Lu6 sYOTy1Wn~~)Z-*${>Ə?#6˗fyfM*|Gk*W}_1} [^͏Rг[iP֐WL{6[-ÝΈSvBt#HK7ЋpK%QY )d9+pz680n*hS >hfI nĂJ{prxbo UÙmhb9T!\nqcüSwzy0H n e7`챝`3b;9= 7 }S/,Zr ;gz1bF(K=j]^c3e ˭Js2iRȢ%%iuA0dưhk"IC蚐yfvʌC)pX/@SܝrM:ZLc} avs#OHg=Gƒ<J8^$‰;lsu0UK,y  sSR5,M`YfeaOXGW"Bv)bLDže0Y.l=Z-+s縹\- l^Rڥe=)]̎=丼0e0MА#)+/2 ۇ,S҈tLoHrt/2jJLgnrF1;b7o#efm  8Jb1x9NH;iXfgNQ[,yKОVvK=; N~f@`Gˁ[:"y(>FN.SŐCdnq0Jo NzɒN "bTwc&x2QÉ U[@Z5WYPwdJ]:V ~g8thn_a iLcB>gj6$ h)1qڸx`:Fp nXmz:7k loUe0_\ڝǼs^1>Ok9l5*/_H. quߘ)(ʷ|ϗM~}Y nל /_e MS'hp(P ȗңu`-ÈNh u4x[F^ф`P* 8_b 3F:!Z mpR慺|s7x9`؋a>P l,k'!e7Z*vŽ|cioUd)fY5+;+o!Ӗv"5HShGasTI[:vd2.;8Oq"[x9?K 6Jߞ|iÑx̲!&.ÃJ >++o0e$`}ma(tOz< #/2BGWʅ0`6(9'їBqxU\CezL'4"0xexrUa0|@L8ᨊ5#ۃPyvB:)aZ}@‰lq q©#6x9a-G<\a5DZbl&"6P .̘gq"OCCm^ĥl#7㉣ia,3p5-H2{JVAAǞ\;w Dy`Yǩw\l9@ :`a&6 4h`'fA#X8Fω-YP28 ` 7'2eXs͑lB|hL"w-nrb)0t\-d`T,yB9V5ER0$S5ȋ &vY~$7 sg# Y @m==KMTx;hf G">ptFbJ!(%D4wT$Ěkl:a8Jo*EdAv;,%f0BΫd v86MX*Z "Bp-Zb9CNnYXOHpeŚ R`ĆƎNQkhDd$ tDhtwlE5i ރӀ d jPC'EZ0A0bmɱ!R'9DNw|w|"%p~v:f4e* Uxcٽjz>ր&*';d3>ݺ7.}߼k~gzٓW+uto*Iv{*<"m#]ud1-nt)mŴ=SRrFpb%%cjF]!e'['W+4Ϟ{ =ҽ AewT#S]` yx6q3&clM Si=a 抦  3`z‰vт7Po>ptvfm:P{ n>s9uG6K&?|w{6z͌s }5zvˢ;w]If '9-)EtGkPnK\i&vSxu=h I2f>[CI\ !݃2$_w-–C_znC#"#l>Fn*ӝs]>vD}k_]>Ӗ<Jgl 8ePgEJ3lNz^Է1{Mo y~ }+\":2 )Ip pI> 区٧\ȳr {{wo`z^;xYs0tC {7fua ʧjqJE~;X,?Q/ 6NfGhMQ R m6,%3Lm mnf&J&>`HJ{jxHuuz-H>X%K6PؙTn(I0Xd9\"G ZB©A,v:dAC99;7x텦 /1^ 8c0nX\DցD!Wl0Ґ_sSPxZҥ%3VQ5[Y\aLY:z$G[0&_hzi8i` 3$Jy0&|2 ̮h лL Ki,6(Y"yhpXX f(H)H=?4<Ã>C-ZTa5svv__^__%'W|# ^YZ]2f" &WzR #Wf*^Vf\A\z5B͑lŢK%k%. V zThf5Pq e,0jq Q֌jQXp`̊B+,r\K+OxP2BFBհA6ƕOYAgl>񁬁Y F [Y M$8i[2X;S|%o&Q񕪊HɕŬ.bbfRqh"V @bEȀYjMiۊ #RE-/P,-6ZBp1l઒a@iL*#Ց ",HhdIޛXvw~w;]jު7DQ˘Cflc6L/{&v؎q2Q{G8؁<ıeKljDMlnR]յݺ9]|8-Q(T[Ngy181H~$z)SPk@E bM:#HGfQn6nF]jbTh(T u++F$rUB PMΝ6(աQ]BPz1Tp;.(NHGPI>c&JX+ kFfq,t33ܱ:dk2֎lnu2y6L񸤰ZD" 2" 3ZLbI`'it+ ƴ!jr[w6͌9Kvm@=xu*yzi s._+ XR F1 12 j^1l,Eny+}c W._BCG+$|Sve޲ȼ\4 7ooi?c%! yV@^Ҫ\qb$ӟ*Yb:["[71$2.4D]Fp;J9GRF'TTvraMRLVԓ1 )x$ APζNZ0`!P^1 gW 'KҖ"U%=e19YCߣ;7{S,ͮav=d6Gpdr?saӤ1|ϝg=`"i'e25PG,|&BI!Q73deZe95h z'rQv"h*T6mfdԎMyZEKs\dF*&1B'K-8m`:G14QaH*2>xљI)7f$ZvAD J'"  Y$\ٚh6< =MXE bB H(2H )G!QiKLH7Sj GfE=y9ΑG6jQt$4A2PQBB8VRjP&C:xCKBu4ZGTT6PRdcT:d)5cѩR e4|lXȅslFX2"- hE>ׂOA28"yfE7,3Gԉ}XK%f5 ˸q6ƚn:&^IԬwpL a4l}gyvfᑩ9do>ϵYu~v^y/n2[dcB4h%eiIα+ Zj0 ^ "PO%Rh$'z#MM/ ]h˕x̟{>3r+w.8s8Yp_G#F Kg&cWXl]pcƛ򱺲BLǎGzka7~k|m\ݚ<Ϲqc}K.| ?<ĵvvHT}sg^ VFQ8ȒBkRTNp`m Ty$ih=30$PiEĤ!  #شڠI&AK"% G&EהX ECwjsq9xon&'9Sٯ,<,`#FF8Gf-ӐN\CQx%8It!DaTig9tgcׇe3$byf4p=qjTkKj*7YL/5%;F\ʹp [(9Pa{~k7?w]fb@P7$:-h4&FT9(DjC'K:DG!۪{"ItUB2cN-1DאL$Rdq ro@yDGEr$jnp&`(0dbhpcmҩ!(P2"d(J5mURvHFEQ$5 4I4)G\Cl&:PGEe,&$bTC/V o UnHF[ڙ: -3n6dG2(*hEM+lfiM &){氩5AWx%QT5Yl* !#25C߂5^RU *'4Dj x, tLL1ONQe(+֢3b@7B9Uv)`Ub3A~^)d0I ʨ0Ck.io~SXij0F1>ǚIeXnG ,ChJm uOf^M)eFELT 9$c4>!o͆V>|\3z;r,h|ót&籾& l&O#=YRjcPyQ|{uyJwmm4)bjb[7b?ׂ7[sP|#vdG_BkC潡֊QTU0 l_o}V@}5`I'BQͲ.t"5Đic9(4mv;H<(އp$!PkJ!7ig&zYTwcKs>Yl9~;;9yk?\H3ǝ5kٚ"%0{k&0Fi߽ĉrwp٬ɓ-yHhPDPIcE1uZe91{>Nqca)6IkT/ 8hϲQb^ps]A6k*4̈&SppP8M1`3{Q{dq9J)h(;5^9Wr%.mqes1\ DSׂ1 "moZ"^ M!Q*OZǸ>Z|nIZ yTD%$ig4&Dr$Hh -劖ҥ-NB5DTHmM$jW:BZXqVkjim&JK3 QHxQ4ArŒ{f1q=f;lM"r@(UE^NF< M@wګ\rk 7ƤJcIdQ6l#4UqjRK9*h&BҮpb[jYJd^JD2Fi<Rff{q{X Ke0d:F) ]#Bk|mQJd(|DUALIL0yG9t7ٜ~pý+<2{}sk 2㘙:/rZ?Djƨf&;Cv4*^Teb`M1;8ĩ|&q&3Ddfp%eJoӭnD3oc`ҘagXyg\Kq2u/S~/'^] 9FgG=^テ*h2Y]fbR3,.LH2¨0̣@򉍨*m22YEc-VyKɢ7&]zW>K'q^mn`">0mLnDʩ{=q[5V6WRk!bJod9ʅΡ"DhįƿGx5_W_mAoD1- ccG>ӧAH 1^#'}ل̏Ƕԯ,Y87Z / ߃?x%%终|8hXvrzV ġERN FRRά@b\b'4 2)rC1Vʩ,/('P7Sw-Is]bdqlxqNw#5 K4|ILHx| k@sCɋa3y Q:qk~*YM &y|ɷXnPysUI;2\\+ֳXn0kFlt5ir_՟4/|s 44d;Iu =jԊ*)Utň5j0:c 5 5ea\2*[K2nE E}\}G? WYnu~9I3#ekyX2;r}c}䑿>n[7~gDNïگv@KJkԧ>Oۦx\r u!FZPX͖1e3l `  8j2ES:?NNL4Bm2BniRGP1~VSYWuc8~A!2X߭8Íjj%r mF=2G.s,No,nЇXmrm{e6 6O[giofy떽Gl>ϯ K>珐r~{}wgZ;F^?Kssg^ۤx6$֎m@'nk5M(MC'H+aXAXͅ] SA)F"Vٸˮ{; zn],Au;1\xӄ6+d}0rW;K4?zu˗O Wjr33Ss>g,#ט_|yΜ³[7 TL&H`&YNauBYQ&㌱8PBҌǚL@ՌpS4ub ZEv@%ȕ6}R.}@H9x K:WT03ԔyM ^,Q%\OP](MYzE0a0 +z-|댇i/2]$,cŰћ(#nF}0pB13}"DHJ|YbjzdJ{4wyCK/>O1 IDAT^yUn_ۢ'gĬJ;w΅-@4$:4B`A~.0LI]T+Ub]Hws3d_ԽW9 Mvqdݐq汒/O[KWWQNzbk 44 r .HL" YtIF hih:32anQUd%jH(--+O#:1mVPAP[ ir8OrcjDLIe=G9v$]}<:̿ gs^MlΤK5 4kS'I8By`?RIy6=ڝϮyסR՗q \-@N@!f$4AD38TLg̰ A,SG2sa?>NEuP!w0/g>I*ߠ?HݡљSPC5t):wyKͶ8p0l߸ƍKU =s3YAu.}ϓ:% ~( h戯%r C" ̴Km\ @(4s ڝYN JC |e\Jʔ#r˧ŝG2Mj(jcFn 0+7aѠk jT#dh2TH\a>;Jkٽ@Hϡ^%f RQyNGTstR(SAWc/bwr;.C^N"Ya;S*E(IgF'+HK%+c԰-̈́&HR g,FIm[6γ[155]|@яIߠX"رcs+<rYSN5ԗqqK0Ai=58TD " L!*ZHIX9}K9XeRAZJд>0GiQPȎDmZƠ1!4#*#آ pBk$cC{۸wsvY0i汫̳_}E^d%";A,9 eq=  ,Fyml+ǘ?XO9Z&ƯoگQk+c gϞgzfk339| B+lmmIFT!֚3w}u1.#8q{眻w @HDYmx1.yTbg<5֤*e{&U=gˣc[%ʶDq  `h4_.gƚ5QToի׷}{νq&i?eukcgg˴uF% fb(4pVU8vY#}Rt% a2)r#p':H3wh 0sj㫊f gH& dl@@B@^f$Ѵ tN PqA9Ah)z=·.õkGq3|̓}t^ɬKRű0$ ED4@bH1Z H%F@N-_}~ݛӈ9Z!SqB2,4ҀbVI6-vIqHHtAXsyN!DyF/!m$~vHӜo~֫& 5 q12",co^e<.sSNV,FYt!,PS7|AU׹xOoiR. ~~-&'=(i4lmmш**`ee` w0 Ȳbcc_g_U·=ACN=?g͉c{k {E%/}n2Zsϡhyyo_=.$~0pX[ڐg*"CKC)6p@dc,R(rhɈ( F] Kih ==`'(+02mҋ˄C9}dOINpϱyp8M:JnobQ}!HUD{jL" 53xix}X 9k62{<S:0:yCOHʐ%TĄ̃Tf?Η OK蜚T lT*9%횤ja q]㽺Z1sotrMXB. icLڇ<&==c3\;@8ȹgեiHk\Y**QNn G,b=K࢜LDhUE .i$Ja3!%儴$'"i1"%<” vh*T"m2 />G899}$IR>'_uɟ ʥ!făa\{5 XxY_[,}D8RgVH\UiheН 7R&eZJ՘Xqc1SB)2Nim,IЅ! i: c& crOm(HLA !v8E 5Hy.%bv7*T#q'vǨ>Kda;PsSazevt-p2 l;@bH+@c!eH-qIu8:mkrT*i rՇ!2B /VTp<dAH*uɢ#QjBku,Ç9Gx{޸s_¬.m􀺅 c/4@fW#1P B֒jKI{6I_ z+%Ȫ -Vcî1J3@K;"RR`B`%Q88‘<:K7ߢ3%}ҁhlN9WhysRGX{h+(]nhϢ1ig so/w%:朻{)Xz].^b5p (nqi$p$ ϡBOeJ8i0$e)arG9, !R D' gP*MrxGϠ0x/Kt_z2sE\L%ł,e,{%&,, >X)5{+;]榩R)r.N3M$Fѣ8Tgqu 矣זH ia(`hcE,;獢z ra$pBAXPqnἱ{eh/v)4Glnۄ,Skc:);G9 h_Iq5Ae}ϩuEYS+P8D!(~Ф4֋ F,-$BI_lY5(i@Jއ,JX N!s0%*>'XDTJL48x3NsXB,Yzw:+v1aI?f#XO)({-06Bp>q }rpAk\Nrb/(U@ ehphQH*<frq{ylIc/549!+eTCh=eKx¡ԊplK~M}`GA r(=HvA :툸"n:KH')a Ds ػRѶn0Xc#*#Nǭ p# / UDG*q~^u U!{&C]2;D6Rf-vPeɢd +3). U4K*s ^4"RYrA;@[ h4<<ͳ5V m d]@:r t+ij ?Z5zv㓕Y*+Y]ʶߐ6^0f01!! ,xk74L䯸<՞Nuȳ˜vb ўP87^Di7a9oE577,-]%2>|'9<@IIV.$0 7ڌ0wUϕ;Ə?RlK?VQ:Yűo 2!9'h=.9])1S-yP`w-:z%k)Wͤ5/.s()qyE >%(w =b܄|zEW0{8ŊWѤi P.'0 W~!oH:OԾce;Z VxaCE!`5*+NtpZ\edh9rQ{c³gr7߾`0 oD4^+<{H) >1žEPŹRv)̫Aq/\ߢ ##U\؉c9ʭ*WM~W3{c-<[Da w4r`R.؏a)9 1TfGv}kK[ njiv:Y"< as"Tn:G2J ԴUt O0x%N9FyȊa)D)P8/+sHag1^80T( >Q('(ECiGjUMMpx'3'\c\v-n-eXj7 ;Yx Cttan4;?s*bD[ .}eؽѦN{FGA(G1k72&Tg66Ə3wŷ7qtMnK޸v:R^lR_??y9|}ji-徜tZpnT'!㰷×Uo1o<9AbXeXxW`2 z06@ax{:0tzpWO">'~{~=\{ &*P@\}Mĭ:џR 6w~ I,^ /~\G/9OG_/+lz ":2Mmy]@8i lހp{ v_`FO d޺hLCw @ƾΟ Aw:lJ|g!~A``AeP4"ɂ$$EF0ep0"pR;tYFjQdSr)YѣS9Ps`l#]?#<"\eƗW%cͱ4gH T4B?oːh h:_([ ],RU[U":+Ce>tpֱ#\+l]E+<<Χ>i?ȃ7跸9)s4RiPCQ#ime ks3l,~݇mqH3~tq g^ ̈e0TWIxG*t0xMER#DL}dv臘jkF$W5[s䝂yBv/(EV!YքZV WErEɀ~{$J$DBl9NTi4nSH2'9Xh?xN?ȇ>I=|?m_L+P}i]?O#T Y#%-r]VJDWw+$ 9 cLGα7cCh% N"@HCPЃOѬH7ga{23um D\FUR.w&F5 Ќĵ}=qra*?3.MB8"gGx|/>^vxTD($ 6HȌ?yd17럣Cu.%4;oiS4.H)#}-c^"× 6hh,ڣ"c1ZC,=J}~c[*|c{c^B Hus RZ2*!+LΟ#}t:,%6laq Y`2O}+?L?ayXET AJ'PjqU$ZK6uHFBz=?U1ZCygy0ZߥL:q'^Aoeʕ2?7V_[]ello\]>Is}ltlXsPހڄ!v='6Kkӳ 序d\ۄ {݀ڑej댺02kp{֎o`NUغ[03 Wa&leކ͛tat7|t%`UU *& Gsd\*Us78(B  (}q99LWc* M CD:C@ j2IdBl)@[be D#Ǡ2&q+|.>{=/ܤrn dQ'`#~00,0W\r(h%#CQ1Þdx~w .L>E&g"R>~+ў]\-kߺBf®rRѮy>0Zkt՘x*<)*FYeG1wn!:M4:E0?BkF/MQaXCG..Ou#QNq훸{$8v ՍWhRYI"B6` eȉBM, 8G(KTCI!%Ւ$B)4pAJR#4:tD E)^y !! csdf/X80Hn܃_$[~ ,N1xMx~xx l߆tAv!o0J Be*:UF8Y ԡ{.-^A'mw(o)BDՁ0F|9.Mpyq3!ijj;f` .a90}l< 7'!"${č yfD|Yx^ËۢDs-!! EȊDOՉH'hJX۝"dT :t\FaRM9p DiL4~yÌv=fg9hOpuJô7/m[C98lVTHW9b'>Hq.!MN$?Fs2>Dۥ٦uWxU6vF4g}{Wb#G->J7maǞv neJkӨa˘l+;˂tu Qҏo=OsR{8u&$LX\[$bc)\X[q;_Ub Ѳ _W82kwLLg;84:)C"a-Nˆ7K @j *J@"fv+sѡ8L%нum*o]"K 8MaKDNPêaJuly\* aQ3*n \J@;216_[ptx%~Gztdi:wPoZ  Õ?hr{`h Kc?WZ(?yְs y? 8 y1 ֯g@ k¹ah6}$CU+Waqhw`ІCws\ 4'`bmga0=Q4 My 𩟇+/xCs o|Eྒྷ3p2L/֦`=H2ǛM-gT *%OkTGKg _Z"ݠ#n9X{h /t`,0R0*rcXAo93 Ǹ9^'|634f(bm}_Yf d&$&e 4iYʄǏ2ďSa{{<.[kmN{sms ^yi^mQ8|'s_e:O1W9癟!jOc>Cur@#L@p8һ/sO7hΕWyvr#ۇnQG$^JjzmB(z@l T9GKsLMwEl@w[/Y c4U4$vZM8Rp)c9FRz3D!sGKB-#)g³}wHP~P[C\8رX vmHyr qi XJa-D(# \ᔡZ{)Va^`ZK0L<מ@ m.lܐn':k= O`˗/H۰ p0scGޓo~Ojzr0y74 O5>۳GpcI )R{SVW=~֯yr/!<@ IQ_ӆdF7h/w<}擰~/~ڼ0A?y06 {`g'T+P9f#+ 6*tW ^+>#瀤I>pU"=/NA}# ($NCy%PV,hŗwe!F8B#` :i.!фVTGhjL38Nz~-Kn6E H`=YKfYN;HStyy& ,9/5Rj?|ps0IvH^3:?G2zv =2JAUleE29^..Ua34ء4[ ͳ9SG/lxsuq`N>8wP縚~몋:7u:y;L2ӓG /ߴ[{{od댺 rt&)C$2P[UVqG\ coZZgSD Z_*r%Sj%,9ah(iK-3aN=ٺƐ7{,>sܷګz_gY0؈4Pit8$O,O~-òdPM @ 33=M]K^U]9~MiAԜȪyޛ]4LѐiBBB _%K 2Q@PJb4n= Crd@GǨތɚL-AiM,ޘIxmۡesbjJA"(@|a ;9~Ž6WOl^n/:ciVb*% ݘ^0מZJ][msOWą6,d;=v PP> pcÜN!ˋ[`P?;`e>,|&wR|>ȯ /C2 x5O.rMFk6~Qm&GO އ_$&O79k`)?0γpx?Q&`?jX~.} G=څ\U|2{w4:ԪfNE*0:(Or {W| ށ拐@ I A 7cOՙB@ ~ IsMOllZS̗N IDATq)>"?PA>2 uD, FF>.M<4c%0Kx98(< --O1*Νf~.^gO2Z$*+6 #LF)[F7Y9 b21O'=tHu3Ù4?wj9#^k&'IrT ȳmlԆG.NDN>} ?J9>:ILR>:;w/C8ݽxx6mWCz$nE sc( 3C9r("S}F+,/ĵc<~ %C{KP0E|$ 8אZ"b͔c&PNp $s_ܧ-'0n٫{[BD:0xD*֑LdsOqcHqQѡ{nH0b')ϷQiF6T$ ;%U8!UR>,j'ya 3K\d'H>x)oQ^8ed2WRjhk(|nDŽxY3l(RYrH/L.VvRsE*ǏjĎ2J5A90f:A^OmB\!q@f'F>i˧Sj kyj m W .Whwy&ULqʡ\vpCFJb2T."=tRԩ{ gJ,,NO=Gz\v4[o7#1mCECHG5{)K;m#T ._#ϒ'(^EH\O!))QT T>LBgH|WWh`[覢 k4~[aV6cU%5!N54{F,MbG GVTBQ@Tj Sss-cn|c(Ň#)dXg[$:_Dc[!b6`τѶC7*F8u_3| 4'QW_ws}8ra.>Esҿ!9=ڋPP!.`\k:|9?Km)F gp!y?Gp&!sAZqSÎM6~?YlxOdjLhH%AhMIC h#`!A8JK0Ƙm"eT6scoAU>[`QK;;ɒu 7=#\[V41R@R18Aq5xUg)63?vkәQ/qi1?]%;}YKy@ަsئ&W(M_jbtt !g+-33Q5&jMs%CU7$0[uQ`SWp 'zO0ܿ W|eF{Oh!wNf/8XYW@d+1{$6{Ez 4q>IDzj8QJW1o2 T7ByL8ƭTߑR;ɴF` caDHa1!$N2Bz 8Cj-$&ı1$I7dqad}FbuLTDd-b DL |2,w"v;kL[|gFΌ{kBL4s9"FP@NbG]f9 q?&=آFhANTQ:5'@TcN*ICzehY@r:mvVK^cuрZJql K7Ӝba (EBi}&fPR!E U(Q]l.1] N1&w{> 8d?`􈻫[rwKtv,4 w )NM|bbD 8NLIpbƑ'HcLwIFDkZn,p$VKd')_*xuWٹ}(&w69loLZ>YL(nYD +h-qLBя1c*0zز{$c;GiXCR&0 " ,`XKigH?Dt;&.cqT,_h5%)"SظGpȥ(%3a\Fܔ&\NY\'V{}]#GR ÖͰF8oȄef& #|TJݘ|HvJr +ާ\~vjO՟=^T\ݝ-^;jf^<ï&d_'NN*LNWn9ȷn0<+w+Uf~v=$p 9Ky\+# )h.nʹ%7`P_LJI8\]kCh2|B;%C?_] ?ӌl֖&Tg .L\ȁT:mS~{;LIK҅_?9:^̏{/wx^89]+~\aGOu0\c;Xjh-qSjDXGJ!^ #V{d#砄/Rd%Dzc(}iʵjP):rJ\QCyDQ']C,]^wom\.A; Jfd&Ĝ?I<ODuңwOyMF~9'.R} ы)F.~{>EkўK2u%'^WB<Q?z87#M=qRdllSU*rD\v$rʅ>v]}7~-dkuڧ?"c)(R9C:D>;^US|fn+/Mqs]#UFvLC@ߑGhdLHp>7FLņޭwq;hmQN#ػf!iQH!KyW{dEEڐ$57d1\12ܵ*$cljp&iTDcޭ62Z6F5-?ޭƛ=\#q!^G唡bp,b. 0Cy.$M \ŠCЊ/F Oxt#o GӰBdBހ!6 G< bNrߠWrւ"K'pCp,)K`+BݧytZj+1=Q G4c1 v&!mH AHU 7ت`lY&8n3Ɵ Ѕ[ޣfBSENLςV#k1e)nݣ6aE- 2CqHhp<We8v)n )|GKJϽp/h~e?GYsVԻS?@a.!\́Ap йj ;0| 05 w*!sS]390P= W{(AWcSHEHy`k\ل |"O5\r6,?$?&rKz5sà TOmc}_‹y^8T.t'ga sul^ 1 k9.[OAF /fу4,rΟO@DS` FNY#` Nhqܦ*f%R[v)PU/ǖ0oDhD'7xOp`$5Yl0ݜ _dZѻ>͇/`HӰMʞf3ͯ(*QH|ڧ j3X7^fgy.ѿ߹|ٟ/* x9ҥt[UC\ D=]!7ڧ9[ē-qdV㌱TJʙq$VY?(U= lFv&V}}ڿ v<\#JMdhD)DN+ < }CQFH|O2Pݘ8>`o6 ùiJ$)v) Gw0QD!8%$fny ;']s/:;*jJqC3¤X2,HeP),*dbm@E8@10p Lɒ(5KW( W TGc30+ RJ©]XǩJdpĂs2@[J@ =g+Lzn̽77xqC Kd5$ {wйSD Ŧ7ɳ3!4#2\WF)Nɬ Z@+ָ{)[LCRR`.sxfNZ-O1\q2n0EBjGdChNCf[32HQJx7?fWϝ `8x*8ʍ 7)5,bd3 D O4I b (I ?LNF)vu\f4ʆ'$L,%)ـ0LR9qK}Cԉ%4l0D{Yg)g8zǩvP`cG0i0[&R!!>Q4 - aG&•\AIR!1Ja]( m7$Uk5_r}yr-? >*1ǚ10LGCvyPu'^YeI՝k?D"HQ2/-r|K rnpwpY{>~E*klírX']xVcwDGm3E*N<_"hG4U?'ZQV8gx&y`1?B?F~}2 b}f@{PRީv :߃?ʵxy/ jC=@WAf*dü+N!QpL±gap6 Gh7N8xf7( Snu(GOƒwss3/AҰ~%H3+;0C^_8;x1X/U~=Pu_3߀rr+4yX.:cHk;em\I $1Sբk,>՛<*y \OY R4AH #Q 7"(2Ħ XF6fDJQ<I:(s2ͅ|ϑ<NT>`ݏ(g5 चMkQq?ʧiMnKܗo^>ޣd]H >{6AaQ~旿D+iVKxw[ߺk 61"D6BڒMRh@_BdGHz%d#[6T1!Qih &3SgX}cS tZ_S]6XȰaHT3_yꅓ)q;λ(޹CѨKR /ǎEY)IWN&!ril(d** nj-jhIlpdip ҀԱd} %QfCKqT@ P["4M;=:XJL[HcRt[p"e[. LؔX E|PJȤb!1XJOU 'w1w"A"堀_@:۔ G63dh)qqHĔF l#SV5Nh*£hML5'(>j k RaǂIJxلIBLJo~,cml6Ip`"!,{H/@ *pqIPQ"4nO"PvңGiǓ?7 B~~Dl x 0x][0kP W UC ^~syzX /x cp}jܩ2GRk03 n^&sWix=?/t0l&43F~ .@Wu|p?wKϼ<d3[VeMvн0yZwkY,')c(Χ.s>?N>iB0 2T_ˍ.d[yW_xya' } Ŝm@J^fC䲈NEk dUq-R 1*K%nEwsSb0G4Jd*7X?+ gth1ݥ]%Bѷ@Xf` $b' ę:Q\quuKۧ B0C/uR]W: csT) jnpsxlBC]nocHEkif/݂YA#*_[U^]g1݄$]БMB5w< _2`QhGđ21JH%(錖[^ൊ O J \!i[eHeF4RS4Ա’KTf@iZP>5G} h@ߢpİݥa4m3).p^|ǯP{(`Nh IDATF?j < c2G@Kwa8 FHnlPsძк"n?p88<~?svgd8nZy P`8ƁepUDLC-K9Rxhd*#RO CDtcPPP>d)߹cSy8HJ/XD6u}߼?bpb"UF834hW (R7ňOQ%rCT[A%u 6H% 62"he1ڢc ȔhAi ⸂3:d:Sșr@.~kP7iGQENߢ:hL!%G;ƠLD]lg! R(:(Gah0nѡb<*#qDV$%7۴6A#v4}Y 4iZcm2tĬ]V 4md},cO9b| NJ&k΁A{`A(VK$GX:,b}he0~B-Mk6XF%cSjc3L3*\gT2M+еɘẖ(c .]ķ-H)sU/s~~hQJq o̥K/Ya pceow_zWW_~mv_o$ W}_};?_^g Bt]~~u޿vM_5~ic2qg!%evUh~=߇ӹQkИg0{<F9X<  ?or ʭf3_sIVoó[p|xP*t{p|/߂,u*<ó |?v$pA L4sJk0ق].?<|=ם"9;ptv4UPл<}'܋O]b8%65SI Rh~:oW6$f9uVbAV #dH@&)I䠣M3KB))I16#M5RQẻ#4gi^}֍Lw"gC12xtDqYnk<0M3>W߽Ͽr,q[__g}in$V86C IL!ędS_/S 2?LQHjDӧ?"rq^ĉu C&MIlԳr3_exN 36&aRɄ$P Mu~yϜenX'ُm0UTtH:nT=z yTSv;F=<0dF[ ȩ (Y‚;wE!zaf54XY y}{mˏp8w6 6.c:.'MբD>o⹛Ӽcu0bѠh`'|溜:fEf4ɘҪ侏3wʠ0hqKcg6ٜ9-skm2Jшw30IAS\6"K˻a14yNvC9(̙3:_U~W~g?w'?I/|Ǐ|[ t`.M>я;;+ȏ|~ǽ5Ξ}O|㬭C B~<^>RX/k4z__>{)ߋ t`ۃˍ+ /鲥[%ȸ{o^bU&i9xN=k%@\Y+Ksp.~& 3% X#?[#?LB`ҹRp*-_*ן? J@la:x݂_wO߅_,CPQ~"M؍=2zD  :*h(M|SC:edRݭ8yCcY}=`<U<0%EdYc޹•*w._GTGק%2Q+FE},d@(ȑG=" $cN9uhM`.}=,et 6 lU g8;!cr#&'e>p {,a!/q_0)sj,Dqabx3w_:oo>LGj}zB"O I&tDb0Tq8OɳN2}'$"l!c lQ]iB! Cf,G&+[C&78'b?8M_չM=%+mYicInz 16y>i7`={8mn#p3 ZNXpLL3.ӭJXxMLi;}M{o9*Mu W4?c<@(7RB#(RHN HL f: ѳq!-&U_4a~ӌg?H.Xoϳ"آ7(:95 $\ xn<=N.E_vcEU&$K#iro|:Owco2ě6& c+ !9!<ps9ODT)sB^'?ưQ!;lAo"->zFwՠnq%_Zؽ띂$9!!Xa&=.:ϡE%w9o2NLmQ+h6!tjVgϯs۠yYrz)W6n'& -K6d`\Bj+T~iR9O?4(H_'xz;N{yhM; >֚Q}Kk~:Jȵk׈Q_0c X5H)Rd08yh8V`))Z(3{ a*%QërSpW`|$o)/[oJŸwNu#2/RנV +eNK_y8vg\r8*%tlJܟR* /,,yxp<0ylC @2RFW&Tm*_1)"ySF yT<& J˭0_T)aO@YJ _wC iXbhP6˒!=@|,y$>AAaZ}3 CU2Fh9ܒ5 fQhHnQPm $%FAKȱLpG3[!J1uǐ/h q{ȬO>jx7:l^auv0Iȓi6TS'ϐz{ ZِXIɋR"IHV`%&$ giC 2גf9yB`eW+o{Xz{u?Xgyd*U[k= v*6䝦qՙk& 2=| iyIdH"gOR|Р_dJ(( 7$sTld0"wsiR hO>as%QtdWٸ:7hMW1jhD%`GAS!Z q&1R.\OT9=B^g0u=F2m.lnSz=bȃ3yz7:aO)r_';L!69I 0fbc1!Eu謰߸rse|cd5P(t=D͢EAP$PeD#`E#ycGĄz17P>Dc(up1I"*6eӽ:.n!E&4MEIA@)8 xdqS964C w;9|dgg/~9sW^}K.O~/_1afii >ϔϓeh]`. /ׯ]GŋQD_K5I<!(""q7x?e2-IUʄѭu-B 2W&_զJFcw 7a{J@6T' I&k0, ,;"ſY{@UHT }|\)tn.e8@:ៀW.g*> m'aan>R2r VvDׅR:rx_@Tto*'! 7K 3COA&va}`u U' I:V@tc_+i0^;hK0gf P,Ao7ӱ_D[ap]!RՀX#qbu0aD*(@ꌠ%fj?HS42*'|pӧhN^?oo4!bK!g,CQm"j\sSX鏱ru.KF+7Ɇ#\2LbㄐuS*uCNʮHr<y8("ף߬8;Ȟ:>W"C*2 M璽Bx5*IGO3D٣eF%:B)D%>^ Q*";Dq(lE'k (o.{F>D*E66H`! heN5b#X}B3)Yl<'ΓƈvNGZ] ԒG* 94`qtgX_Rm^gR*m]: 0IG px5Pu+}2ʾ# L#p*ԁ"ZP/B`O>(BJ|ٳORJov9o/ann0 x>Ư,?NQh}?k3{?}$7>ӽWrS\EJ ڰgz x`|?/ [7~IL*EGFGՑXg9#D.pH4-LL--S\9.beE61bq Fc3 ʕp[IcS̿ݗ.ryν2F6*7$Ǧ$crGT R E$I$iv"|MX: 2BPAZMSLMTN%|gH~xȭ¿Zk7- r[P؂hλ]#0Y.}T%lc! tAں\rGtStMQL"S8RL#@GA2"V|&9nF!f:qk>8[LٌC9'A!QڐN%8zZ\hpSIv|O,xg?[2EAď8?? @8hS&Zh4~H4MyYcyZ4( ccR `'}K&= )x?-dyABʒR2==k10 yМǡs@7q D νp/m̗ݍiX<KR.QR,/Jvn2Hp2^WFv6JыMx*Ofm ԛ%a|Vo҃`: $Ь _c->=sMz. S>;/gKӽKy֝2^~}X}geUzX 肇k̀.K$ÇR> A/,.==~ 8m;6:X 4Xk+BM^)< G& qep!bM%pmM&ouYˈm`X̫ *Cx?ǙvT[نV#B֔W \PL1)H)pa&rX5Z( I`V9m׫8۳;oh\ffE\ i [Xaٔ?Pʔ2e[/Wrnpm:MzՂ$#P` bJ Pd9b @DFcMv4^K(܂a%*Q#cҖ(q鏆lݹ9qh>bEfk̟?M-uILKGsoڿڥl޼J.| K-QR9-$G!pg TiB6=,$& !UTԅ) 0֖ɡc]!Rp}JOrVX2P{I04M]bY- `.}/ O `eN&lJ0^HN$k$I\^t?X\:F'Lݘ`N_oQ~)7;G7PF;dHx)H#,p_}K_{3TTbg;{D2Oa7fͻo]A|dNaACf z*q-dE)rBNV'I&q~]K3>j9#CjE5?፝U($.(BWxĎU[FB+ȴGX'HI_(x`GG~Ym\f~Ia+`Zr5\}#\_ Z#4'(Fip0da0*ǺINznR,I1[`]$پ3 rNtJu4Kt饬ǥH pĽt=n-Lի[;fd&l,8[b{,s7|g5n5ma!`M_Hkjj韢c|En)pr4 CC'@xB.VAd'ØaRϹ*%.9fwmО;h94M5a!Cwm.J\*FZrc0ya}mw6yƗ^B|Cok-FDP=tЪ 4B"p*c S|fR= -7B;Qo@~h}̣q3@ڃbPŕrG%@.cbC`zM΋]8=Xx߃K@_O‹~ `قkpf?ބ\|x?};\[LcU܁ni^蓐Ky)n\!8 -p ]t)} \J3UK/G]ʝZ)9k-='fTzC:0E)^5V n)Vɤ8G/*Ap|O1"cU RXFHZ!mFM P)r/)g*9QR *q<ŽN9!٫m]3L2V M60R[X0i9'YzٹΛ/n~#M6'J0ɬ<<7C1H-*,˝o=YIG{BE[c{̞`\.lht"KH=XJ# ( ۄ(/H(pRH4FZF8E!@i*A4"4xgTi XD3/E ۢL+CX'(;1*x]ׇldΆaSz֠-{0t ?(FYP!#Eٌ Z\)dt%ROlk5gDA2`<=5.sSmƻ{R=fx!M3s\u_54L[A22!g[ FƐ6F0UFR$m\zJs3v6{ׯSѬbGzMfVI s3zȸqHO\c&kr4WTI4}ܗ+6O3"QV30f4P%9R Gܿe*3d,1V`hѬVɫ7pp3Km iߡqyop~G]FV0rݛ%G8+ffmc6f2=z,I ƌ`LJChېj$쩌='Ȟ^ fŷ+t!9`ܓ0bO^cx9{~kBO\JfsDR7JQDLU ҥ zqO t8تmx.,XӕtU.o[}kS䣓8Ύyk,qvrl13;x7@a8X.&7Tzӌ6]*k7~NJ2"𩰨 َ _[]ˡ>'} HÀb ,F9Nt"rS!S팰0P)Iߓd?Cqmoq]8~ןo ۥB]-8̙3g R,$ir݃їKyPo26|Wi_9aqX8 6FZl՞>}-9? ~||/ G0v?xPƎł'\c[- ܼ mP2kUG8//f+ E$t@f-06= ^hK(々(A yfˢOq9]n[~  TjJuA$~Ljңl C{4',Ɍ<[FՔ.'$KD9c#E.ES@Nj-"d%i%"<$s8Y&;܂Aj#*v.*+ ےbb{CvxВ*A''qPn;g}ױjѐK$uK|q xc3M{>/ySm/szkfSbO),VX‚{d4Z3(4hJ'9O#Qm""N`zsBqc'x2"obkڻ W bXdGMIj)5o PǓ SM$VJB0n$󺠯Gܰ1f̃i cIUeeExqDC/;KXHƦXBBHܔ]HJ'M BG]*ȪBP3ۤ$eX !eSyhb %*A[SH baNČ(}R@dtc 'N_O)fz.gc5Z(pouٿzOӄ2icGarVN)98rhtIMɷ2 ˯CRVu? y',,/õjÉ寔Z7{$Yv9ץ-ﻺڛc`kBD-A I!>J!nH"w LϴU]eV=:K"@܈ʊ̼|NFp4p ?@&{>Pư3>Q3s٧~8zUg፯yV}(׼`>LT `UX$^ _at N{$BZ{p@݅uM;;UNס4ާRY!e퀚13kP{im6'@LU3p AAߍR)CZNTH@hGsD-p "_kWdZI1a)7ilq|1NRʧr~͕ *e|M.H!,}83-Ҙ֠Djh00! )qGqXf -{:&X<Қ9}h{N;ƗW`t&ue$°#г뭀.Pen-.QZ(4#qE@[X6GPH(BO֩^HFeL]ָ;#^aXɅO^,ث-M'Q~ԦirKHVdNLȜON"W>_ce]ebSJ&X꫖<|Z`G2v ḽbHҀRjhHF2QMX0`!cHEǒ4%%8 Շr;FM5~g>խܺWS:NC8nH&`j+݊~%a@P. i!ՖbF9K/"`vحG!׈yԿW(9nﳵrX{!"cnFa 7h<&2:iXžc:Ai-tMAP Őb 7Z]nDR{q_8ljfч_A-s[ VlXQuNm0Lc?u>;d[$L5)g IDAT /Y _mߌxҭTZc8`DK4^%[xNsЂ<-Cwu-@ͩ ڔ#H-%* PF֦ R ; SgX:d@/\hH! G;$Io |t_jkQBrቧ{Ob{\F'wsM:q~g 0Y\%[;0ᱳW6S`o c*L9p Sƃ4DSR.[8K/ ^ֆL=m/ޕ_oAېB qoz0Slxvpqٛ͌/)DƠX9<D S١DLH5'A%3 9A) "gY(dP0frf{kL^~3oǭ/St s8sגVύLP&8, /Q?Q页!J#%jq2t J]@b&ӈ UDN]@CI0t%$Ab[7p A uUrEZFҩsq5KgFJ JV 55DQ( +I]rDlmHaq0 Fnc AX(0M_*C*Yx/Q~&OM7yЈC9yc$8HQ.u}L̐Ď T>p hmh.3UIDNfXgpn#g,AH$sg0Fd}Kb BkI:k;̎|O.ܤkGMFw `N;0d) 2m z1lZSm`&c ,gl4X (~ lXЊ}RjCOj0&}yԱi쥧Νa:O=ưEkưWe}\)Rk=kDMqQp>C{j]BBTڎ@C59-árlUPP.\ _8-D%$ ߟ=Yˢ VAiB !n9@Ϡ8*;;4:J TPdBB(A3iAFhDƨT}13c$-MA`ץ4m<[0$`81SĒiM\$(RaJcLc!Yd9A 9ߟ(2 2G;A9ȉT; Fqi=J/+Eh,uW8CIFe''n%HK&`~RX{`wI5Z:Y *\#~U k4Hs"4 y]7{<.ٙӬkI:yD{eRpΧae>Aw1d8p8B`(l`}'ÐYG 8 kP(RLѠ2)5z#uđ<=3Nu,mAI{2ȔPaA;Qi,.2!Vپ.^,$.w : Z GEz"s-zr4wpop&^A D ɥ#-4y) K92' ^B0e v}LUE9$Gƈ4ڜ`Y,s&,7q4}Nm.Ct*29t f <}KUdB{k",kLpG :& %VX`e`M'QQ))o _=pUG څExyx-X<|T.~ åPOބyNLwo LTR>8oÏ~߃V`Ko ?=htU۰ Ǘ<~ŧrmS|G}Voyg]^=smXx6|Xgu<.܅ѣ~a`>ytB{ڗ@2#A>Ξ2OcP쀫x&(k= @4<$d! vAz!Q&,fhJZ/$,A>f=EU 0D P0%:Fb1t|!vGu"nM9$<`ZHfbJt1hmSH$QDH)M$LQb-#f|>f(Ys,9A!31W'}w 2c)]oӿw|Ξ&hs*7Xt[(]Bn@hօc֛ % $h1e)Mӛv B&ˆ \Dە)ұ/}|YÖ{֠}2'f/dw>f)_й>$/!pH"$ 2,8X"ݰ/hInmINXK'EĈpLEY%FDZOQYR"balUJب. PF!K"!`+2$Ep %)AwXSظͨTpvA): G͐Jo@6`}6Ndelrdz*An ժQ54GZ*@;yj\iol62èO%lZRҒZ֒Ze%"`%2z@XȜ7m*: K^A@}d {M[{V` A,z'Wgpg` ;g~6]g_wp8zGj?_t6 |PJ:\/E84eT}ۏ C-+WÛYdƼ;/qpUǧC?6y˳:&&ʟ4CH7C* #c,LӰ&?홦1>.9g`P&c Wɴ>yN^焬RqYJE@2d)\<2[3@:RC4 \Hdͻy{}1IFup F*A#6Hlj0$+{L >4\HDC-kbM7wG4J;V8RrpCdStCuR,"FXmR´AQ #.YW`T2}'s'$IYpdF^f a+(!> ܇?=Plo;v#8)PTHH$V9. a,AF2ٞ ;:;gטkE0bLqet)_= zZuHl \ E*$jyf&R""덣i {e(ʑ`L7,ko2؇Lxf荌$]+8i zN޹q?fY\̃&(:!sh;l 8:턵<9~W::J ሶS* Nب82)epl`qF!n`iuRLP-'!*b+Nt?~7<{JGj  C=%0.??CȮr _xZ2G_R"{n>qwZ-4u We8g<޻eHkPA]6`9A a 'f{qga~jX<~>?_w{s'&`:$~k[_1h ݂h/E27a>E F%ha!K]|*P_G˞yh^gC*bw[(2ր;~Ik/_zX݁|%XPYK :Tb0U&B %U\cŀ,(BIZxk=O[<`.91XLAD]Tŗ5OiNYl?` {SXvI2`";2$SI,3g4Qe$CL X bY-Sa@C ^C8KuX1CBPr&GA[*HF!GhZ&b@ d)DHU"F& e p=mـDC$22 lс~N4.qyRR:HyBhLbkW8 8x(S QyZ9L`<~Ge˜}AiW(4G jgI;PSi!m-v.bT vS`HBtD @ C +E 6irݣ7:FJd*QRzw?Oo,; wטobL1 95Uw易L0JC¯(9eGgOX<03)v|ߑi,#HrǶo=`k{1^|Ovo&!1{IfgRsYڸOC* dn='#/ ='LSÔug5e!:2` + %mSȉe[! d_goqn1^A18@'BZȠ#yAf+1 6 N>b(p&*xb`k\Ϣ!q~wvxWG"ע; "Ma44) -A*5$&T ehG02K-ET HUG1v<2soW8фLy%pl;x<Ҳ⶘o/\Irݗ?Gmc2V3fL^]kg42V2$عEǾ~35;›"g_F:XyF*4J+ Sľ#͙ S\03ʼnj#m½ܐ 6R o 󱽹A\J8W"xr//|/WIRMrC!: c {h2,Ag>>);s>uKр??/[zUx괿H J/z/u29ԓh j瓱&gu#Mqԋ0V55 MxἏgEH?sxoqz=x|/ʠS!@4Ǿ/};{w@x^&HQ{ rҧH.q3`rP#mmK\!/*RSSX`p4Zk:F uМA^d!*q±gNLj2\lSyH6l1XzL#8cIќxǟ=;;[=]҃8qI8MVhTXIߑ)n "Zf y ;6Nrl#_)FS3daW&Hi-:hfATeDQ`e•pf!Èib_ɐBK*z([x6,P(A Kh XGa)Dt@[о,d|&{ZO_ gƛﲸˎ4]| ܨ% WuD\j(&?H#%t!,"43# R9bJ>(*m 嘑\Q-eSp0wha[d_Wyñ?´1a?WqXU³88Z \2IFNFӅ5W IDATmM#0,{Qķ_#km35rĠ*UaQ9t^6'*t$ k&z&vc}n(']|AeB- 8B, MžԌcph N,>8]$w E,P8r3GjZ,89cF&'K,)|bW)VL`DqtJ,h!{0# l /p@@N2ѐBHi DFg &5qhc8pǨ?86)߾M:7R`r$s$ O`O$Q헨t2qnFj1LKm8/t= j3K9Oy}2b#o7~f>?oB}2"MNn *-Xzɛė߂vٗ'f)w q⡿𯞀`g&LO<6~/íUX_A˿0Vb̛ߧ|m4Gޗ]K\=5>Ԗ@ehE_&82?w|IsQR`y?#u|(yiAx>2@taA%E c[:B3T B|3bTRiFZGsL~/~L}n P3x!s_OhO]୭m^ӫ>82PiLN7/) !3AJ\aBK $\Jj8aSJT@:?l'yAY#(_ߵ#Liy$Oֵ9.7*Ȕ^)Z0--BX Pb.  );UB;'hsII,%:P *#c48g_e5ol3wc]rbhsVG9qt}Ӝ8sWi l2@`ňGD!rHkpƗm_ԡ")D[ tXN`-XHDX  %-Qwh{xrV"a)ICYD8ħY|clNI:pi+]J!pf1ЂئျĴ"":}zkf}bxsP3/X%ez 7iD04~0" NA6 c~m{{\ԋ N.2SS=*ϞpTF D:S!!D@dc4} Kɢlp8WyDJI{te78?^0 QAΑ@CbCf;G#DBZU,2}&l~a˱-%G>?1 Ga"^~d~>dP(c|[a˨0{7Q[hx6}qxxHG~:] A6@TOamǗwӛkޘ.rU}z!< |D-ŗ4ͼ yՋ &?̌oDFVed{SLc}8en$UsXir[*x}:dC%-J!p$E(AHҢM֥W%qjhwhT%/.[㦣Mv^Xg` nL, H"cKP/XV `Mfz2Z Cwp\댚="Gq05d6p)9aIMە؀1(֔ƢP(:^ɹ=?~ag᪼CUy#F;VVytz~bpşڔz[bxZg=34K_s!>KD?8}ܭ__s}~g!2P/|o}'MUA_ XDIA0m΁-+n,%H-iP0x't&#Ў,Sx.< ޑ _]2g`l=y3|8y$;^\?n};̣P(Q:0/Ct\z M?<f&C,?/C҄0Ml7ɨ^,vמ@ ]I62`A{CfQ4tm^rY4_Aeg7iW/C V@)BAXR#Z2Y,e MDGOcdD}C3KݜfI0\_cD5«T63Vx!CYzgzpѳ|ԡ]DiN\4& )4%0t\mzc_*")&ńHEƢPXӴs~@oiw al+!:_%Kد:Vpg(7_`wjK Xm0rʡ/81B;g<_)2AZ.-\F#kYΞ;F`;&o{ ?:Vz=7p"E[*MlXm"ylp%u=mf"wu)W}3EF·SL-Qmqxs2h<c jK&5ƒ 15%!n,*:Uɍf7]LV vزˢ( Rz(h%J<G1rNJ? pjp,;dFGtR(!:EE)l/[)ߦE8Mzf*]b)a,JC\-Sܹ{\o.YչطZbdH.)o+Vˬqb X+&'+?GT NJ~aoͣha|p'S >fV4M?SZ6s]wqW#u]1i|泟>Qnuq\iOkkZJO<(#Iwٳۻ}CW@˅R R^9*.d?su~y%P|og>CizJ)W2`WAu׳s?Ϗ؏oNVniܕRWYnwZkQJK8?z[ԧMozS?^m#&ALi1rSA_δ FȝŶʯάg)d8#hL6qq|*xbs,n#`e2ҫCx Ǡ_qSOTG2u?k}PAnJ6냠 k6 g!Ja  `Up_ @p2'nd2 An&%P&Jg3Ԇ&=c@R"=&`rlC[P>J`b gFH.m%w9HOB)&YΥZ y6QyR[t"hYDY nБK""+!I$!|B~:&}l_D": Mk8 ,Uv wxז8|HUX4OaM^A1}҄ĬSvN{2dn[G3{ΩfδA^Et# ބGi= 0jnZf(w#]%I=DסzE^;, ϰVX$؛l elMrWtKJ(L-Cu:$d%oma0*FZޞw NP9EnL`bFpԌ(Wݲ]ӻqMG`0BQ-Ba>+ש\5hh6I nJj ^R2;9T@wEv=rJcWr B@#c\ H7()w 葅!#j<.VaBρ.qj !,(t`yփvUQruH+0 %"L*zN_D C'09z Lkϸ`#tY$qBLPe9F{&n}7]G:y<"`/^$MBNY˅^Y}W^bYM=Mt}@Az hR/E'rq~>EV ς3 :J^:ZKT'csc̜<>y{#[c}駟f=4 nv>;?YW_ϩVT*w&8oO_u\c]?i;-›FZM7}g?m !v|hZ|_%G]|'_>Ho{  t8K|K_5!O=ڈ98r*{]{-_pva8?)u5RRO~=<_+\Cl6{g%J\&ZςngeqE,ԫG-,(&6E t W|3L(X?eqX0]Rc$  )RVbKf$+ٍsJ %۔+ |Z)T$nv1bm(:0Kx1=l{Z? zȗ8W\r J Rp+:DAID8hz yp5 y)4om ݋siE$f=6b#z?V=Hٔc::N%ӬZRhB;75W{z+~m6`P䱪Ě1+kjzEίH(6,p*d._XQt>c!dx!F:Ng?ChBH1I`RX:صo7K7蜂\aq$]-I9`XaH]#'}Xk|AxpDv@78X RHຂXd!V[ײ TdP)|2FH"2G'!Hd3[g{ " Ae1+9X#[ [rzK<=Ag9B@epu :tocݍ|t5TtbܮC (@yip|9djҸFYQhq;&auoJ IDAT0h+PK<?y18@%ihE/зs݈z s}S_%\ۀXLjpUR$&Rk\a^ʥ?I*x33|o}+#G] H媫W~y\.I8LMM1Gx###m4ZpE w{2Q}bL@oOEس#s=+9^L<с[Οg5ɷ_}lά<} $C7#0񦬶 <-X߀',4q8|7nu +h-{ؓ=6-p I8'YQ4.6R8aҕ71^" q%\h qR)w>bbCPC2< )a/"QNH1>ʥ6hMX2ȣ?Ҹ $"7!AT`)I װuF&'f(hH ]2=^rָ {*Sab-;/ Mv֙n- 8OImS̬Or1g-f!RJONÅ 8|-ln 4O<묭!ۦ18N&MS~$|#+8'OWS(9|0ggBб^yKŅyy$a$dsM !4ZR:vۭPV+axe^jwZ}9 WmYL`}p}A/.@QyN? _u;U蟂KG3u%&X>4™W%*Zj?XM6TʋuzmBEAДlT&Ղb-)*06gWv^79Yژd著! _ ,_9*98.O<ď^V`6ݳL[%4i{T/fیOdWvWYuYb(. (@ܐ3w5N3.:%*T/Tu[-QO rnk49b%~v=d'w[%'i(Q5Un10B^jҍ?#7}g;$;.tLZꐮ$!pJ $8CDaB,-%ǒjN  h [O~\č:1}Ӽk}~Xxg1꬟ X<&g׎%r[ty[LG}g8 1ŐBaر.Mz4 GPt*4tLWAM6hϷh戏sL^Uyín tWp,"hfvNX^Z%}b8^Ow|}=14vs̟b. ^x~o==SGz9(=%^I!ZxTC"@-O^w :9Cғ1A\"ǺlF;=w>HY;vNr5!l$84{6=soRk:iKC%|+R"s{:Zt+a\YJ.˥uc'!7\H":}:k9e7}/P^؀P}aL" 8ltBBJM7pI>4)MW o# 9nj1-(ԩ\(qKC8ɫ (UIZ }^u{lWqOqP(yb0 Zs1G;_,P\y$^*91r`#}_u}@<2^g9fych %&Vr*PLIcy &EFi1sL_-Xem!鴉ċ PA VhkHfPX_g9 {g\ ƅXrGd!]"I֕ŘNwK{ n@cjp#UcUEhBʘ\#I:ӫXW {PL#"aQl#\I0ƹt6cȹ.SJO䢿Ac5HI2reo10SĐ7.Щ"̫7 dOqx2ńDV hڥT+ Ô45O{ttn^SKI bP룣8P}/ņŨy  f8ݶ{&ײ1Ή%8f.r~ECL0q[r$I??;yYrOw=aMZ djp]wsJ)^#`yίگqUWb1JEY|x'x;֭[xBٚ6pogϞDQoq%@;+ Qx ^<}oM.<~WfY; `pkɱP̑>}?\kv&B ѬSP*C<*8y.@yVab hl@ .\ȊaX ,gSapv:\:8HBr#d7̓!5 -Yj5Ll-/v@cwCg9 /eb0ٚC˜S7gn`OBq.>%0J[M6eq{sf:%A+(IBQG:A*d([Yo{E)?X 8Y.5&^x2 %I$%) /XKI( eʼnXbBI\HB \PJvuw]`$e7Oĭs)$Xi:0kɉ[PcYಶ6ʄb9)V/ \Ҥ!š`4*zw&} qw&8|KK: JiO14Hߧ-Kl"Z遻,n_Cxb?^x"W]5ExgIN܁9g/Z:',KJ"qDfd87l3N9}" k UD%L+qa6 ,FHeJ B{ ˘J`GxB`=BkHM"2xޛH9w-#ʬ}zcI6I5wAI(e4a`׌@c%qk6ު%rܗq[DKlc<$^PU7"nD}{)pjeF3?G_zSOPAu_XA DGjGf 0+dK)EO0HmY% j7P+#s4鮏5V~~q0DC JJ'f(IP[t:7=$Q%BiB)_tTdPYm,\$[߰ZQ${FpQex&k$wל#if;N&.C+D!œPk' <@BCP8ø9%G'88©}D3axLWԖ7(2Fz{$C@n25.P8$"@#NB> t-p,vB|FTP ׆яK/YYSӯ Il I?OU7dZk~~=G;x']TQ9SSS <(_sėDc~J ~gNR?ȋ/}h$~7~G/"* ~ٟ(?/&ISyҸ{]"2*2˿1RJ~fttk04( ŏ~GrOď'?'Ht y7tHE#mDtؿoґmCȧ-`MA%'j0_Wi= 0l?vVmhZ3¾#0?k%]GBmq?}]ذӔ =p5#v-<o~ ~G?  ƎCc!,7ᵻVFuogs %x3p5 a1ܚRy7e,CabY"g`"tp0ӫXِX>9 ^~oCr&oXck @4MZ IDAT膕b֤6Dfh7($L@q Px!uBR4p7Yqr" b'Ǔ'2y =C7ڸc,^T$mD3v whg"$h=y$^PB54L9G/qO=LNB{C[.s%;q?A.`qj/~S|ZCeN`0 2J jrTT,Ll&U3@w9>Pz׿Nr*z9/ 5.ޥt &1a_%61C6Cu`/#ǟ8?S/ |{ ;$ɄzFN6zS==޺5.\}W҉JAyR{}2eʞ8 W[n.!- (I\'+:^@ qڡ_Yob+ PvmaP mmፎp( SR#tNj|"zc[׷y{օEA0b2xEF)͉Q$ sD#Q!FEnj4_!w`"kׯs%~癙n~= @xZ]F}q uRg>  6{62c C3֣S'ց% oe?uٱ OixlTpW/o} &G)Lё;`J{o#u`"՜"kL_~= GްO|#P `Ef߂}9j A!apcptz  S@%7vgĂUKPב,dd:M؈A+|Z>`Vl 냚мgEdͯ9@x9Kbx`|C5c5"Wtt@+;T MTn)ຂB:, t g#DC SP[~=ʤ^@R{%z# M~1B/}w!Y]%$±@J*.E`O=ʧ>"O?Q&J0!}| sn@#]7%{ҥ$\1oMttN\`Sf!`8#I۬]JpfP1Z[ɯhyUփ!f' ho % ZFlO??"gYlu s*ߡ&4ar|R: 4VPruM0D/pWT扲9*f{~{Fi?kaLRZ[8 =eHә] b/Ce%  ;i2FI|&jgO~9t̽uWnqw,4'\54a!PjCߥ^⨞ix>0s˔#+H 8\Ϡ|c/Yab ,C}fa ie ("424W+Yy JOqی&2KWlap>7ֶ}҃+;ƟX`bցס4t-jբTv#vUwet߂ _.1o:灄%>< " )'0(Eg_M n/FRR;:" 3':!)ώ~(ekTwp|CFb8[hzǀTtp6;7\Ԭկr˞/7p:8ԩ1Z񑔵KdiLy}+8^j^.% 'x*ӭ=|xSLY5w]nT8"!](KAJY K qRNC?I[ {&"b5o^,a]󂲙BHI^Lp9t#6cjDsVrJY@Wa[ NN\$ː{d l=*IAU|1`VɕK.^ E4tQi:b7oP|b{ /O0g*.f=qi#> RQQKT0-~ w&a>Oh6*J#;عs<){a1Aܕ!*p)(X $T[!H="9򯽍NL*y}sl1x _=r-έe0-2rbghY!P#VGzb9N'(ǩ>%}pb4Y5pAߤH +fʩ #{88l쌒Oq# M%!1 RCJDkHЪ82G P}ntn\q5J :fSB%u3IlRR@m-ܱ;HgnxNX$ R#ѹ8\C"<],GCNj'.SH-I i+mtQAC:|Σz { L{^qDWpvʡl\cHM$U]Hg# )QhÄGϐ0V4Gaib.}mDHwIDa<(A ]g(/& <ʨfUdn@> wZa# {ls65G׾ÓO?֘[] e~vgX~'JYjXQ,ߔ '`zlؕ_<^ZKpy0nm UHsx18Ga1x2>,-%0< v>q^j> /}y 95zEsrk_ =7// wavҹGmVfqJLּ^3{:{-Qo@޲.WLAuR06h5Bd$p}#sI vRQ!]T5VʕUd6ϳ~ tpOo=aa;-;7i 8O?}a#C%wjRwߣz0y™}]! fyb&_CJoLֹOPw@ 6PG!$0EeTe={rmrc?*S]!*  UMѨ)d>]"KZFӈ9ÎP9` M\6e@黒Z=Usʛԇ:>ȡ"DI5y_N$Qs H}ǐswdlܣ٤G\Y8FԶ+W!KFn Wi`!̮:]ap!P6ȱ\SH:q|%HԖW5[1.u|" ܾft+ş[cש0zi_zwɺT Rx@ 0(S9.ҮJ|d}nSGKb8=^Ļut2ōpm ]u*T0 :_i4+}Z6%4wzdFA`UI_0rfPe)z6 ܞ`H !)RIڠ]F 8( 7%SDf܀GN ?QP70>HE(9'dӸm٢R#ǡβL6}65k/Y)~gD0 Yc=?۳1Yz8]c|kњ,YUpʰE(l/ZzzXrzrNC +#dn[2aJfx%#Ȝ. 2SG2'6)yQHKdI[; ^km=!0~3g`4TD*#W;$_@<~ &zymïyÏ>uɰz)E;8[(޾Hs,-&!-ZR1@ZQ6$&f0Ͻ-Yǹm"+o:ӜOr^A+Ytj#eVĻECBJ??Oom+<{kg>NV9z4 6nq1QAfJˡQ Lqh T-Z:85H~@Ej .2x}2X$+r \ 2T BF44l_Sר5ޠkJDL teMZ "-^=`d훈oY0cqm{cLvʊ 's݀tfH{DCS'kx^Ht̩\>}:S .%86kiN8TQ2IV'lj֗NP Ԟ=l/s{ YRo#%8 9Uh+L[wYHG-IU24O"F J S\zpF:Ώp{ Zm.ÿgÿ*ޱ1[[xF`vd\;)OXF۞ް|< ^A(K616V,Ѝl@0~ u ("Ԟx +P;e4[ JnP4}5 K)<zC+1D\Y~BѧJBU '*RJ%KFcxyJ]):<$r Ԍ#db6!]8 ř/~BdϘ4EM84B ofl|08 ZFPG RP"|x묺+qqs=Q7swo0Mخ6=⸅0J6EA$@Ry 6K$G"Ϡ>{d Mj!D;;^@3٦b: 1>d1㑉_K2jݜo߁Wr8"AIryeF&ЏDNH2As At#3Wk^ |0fhL0M!WzC]FMN79&E¸!Eb3 +]bD|ӗ%cNM IDATRgz8ţ؂ bE}48tHDΆ" UtqʼnJw0Y2EfoeH@Zcxhs$r~(M!Y0tPDUnI"4zvw#%w a'O,DhC]!4̌2\QZ9Ұk%1" %9= G8{>/Dʬ9K\nܤy Ks?V4w382S? 3znC8z~r*z:VXB*NYXXCh0HJA1OftmUù̗N-TB.1udQE`5a&ɋ|`M:DVcFJhR$O?8H;~n9Rh2O;(H: ^DNU?p~ )#"G*I/Qdn0,`62 &R }zA4hŗٿsdoHf5NQP͛xbIGDRTC l|s, ywPخ~f8OGN@XF&As?B8K"R\z0W+r%*$(!& Ƅga??vȆ{>@la}SV4\k@8kۆʧ@5`璥o]a-i-d*MY `a`ksIaO Vpy fanNF=#0w ނ6Uɳ`OnXկ?a t}ow88˟:>< ?|v(,ܳdg>aISX,LMznWēyQ Ÿ /ATZ,OtJBv5h{@ba/GlhM P/ : Wm ""ܕZ%pn }//Ȏ>#I&)|G &ɬO$s$P409u2O0LSk(=yrX:pTA@hAIVНMyHy7s>s)njP!M&;0w2hK39LQ PVvKHOt4\3\vl \6-6#Q=@ddcI"+%TH$# 1liCo7k]4¡!@{((U@% = u4% za@4c:?2KO+`QcʐuS} fO&ӌah̥{F?ιI>f3ν>DXLBy8~hdje)߰!\f}.^`}J;$ad  J[i(5["@3&RrL}7)lG)Y^¹͛l2v0Z(MY/˹&4:Ne^ ?p#,V?Lag9<0LK&4VkufD`Jp$ѻA z"ZCk9!AiK\@>tOre"w,+v־ o&H~F]Bk.I:{/rnlfq(o.o^'Wiѧn2jb*A6O1_dsc|u I #m8I^ LFiMҍ)919Z8LPN7 %-# *4];kao(M0|hйEzcsML 53\I\ /<ŕ*wHz w Au{jF?Yz !').D\5~`e~ t28Exmxwɧx9HcްpOcY+qN_dY@;!Ia{Fo ^|Go$o݃{ܺ˫mG/;ACNh'CkAeV:b'>V2-Zs zT #fw`1߀lAn3 bT&Y'!w-{)~f ł'ST!mrHe SYd@Eʎt Kc:Ǘ\oxwRϨX_}+*wI&խyj\c~ߡ$,a_^"XZVާeSP`NwO~ArDZs(`S]Զs?1-&۳tlQ^G7X CEB%e4mwE][*c#kn8~GgN3NLe.jMa hT,e=x뫔ڶI#H~IU=p*D..<͵ost>]ch1!}-5 ie@Z:ІCl‰? bcpǥ0~Z=e̓,:9w}kRjUUIb*&F6>0c~Nw^ ^dm"U|E4ʶQG &s8րH0tA*J$&#~zl-jp\'!Un?`i8`Qq8+&h HjK^+{u3 7^ێudb?ݦ8p2 :GQrA܌} w6U7h&p*x~x .Mnܻ u]9X?K1:묁 oZ#pis럹s'_U$%h]wa0l;8+ga;,~e jA/C.0Ts Գ;>?&!wS/2$zrݣw"5mJNYiH FkŽŷX@֏БZK7="Gtb٬/pd9ZZ-<3RъuᄒiGѬm5(l?yXko, >ml}CϻzPWfk1ǺosrӋ244iC+H)뭈# P1MkȻ[aa(6{=!v$2];FrMF$$~bW˩`ZFPRRj)eזY/{m@xCX H}ѿ`T 瘫T?UyJTh*Dv5BJ h 8xe=؞ʳ!H: L "?rtj}] =w2wW[B!ZɄ5u=P:fQc\wc{ m96_{]~6 LPLo]e?>X&kYt7ӡ+#`mih+I  PaVa#;5Y9c~.,V]Y\pk5Of,uh=VZ./b$7r(~@k W'wkRIZSD/?Ci6kZ=hyt Ve.$*ʓdplHY1k˒&5I2Ge3Xe!T& "䂐(`Ğ)άS]e`טl3P Ӵ<W -M'dƊKB a1vPB./%>d iDd 'S-RxHBPw* J| Ty3gFNlجҭX f<]WB?"86Jz`<,}ܨd)' 6!%C+g@]ڵ)=1):3EAg̷̊ Ѕ?O5yɩ/H)AmGm;v|엇%:QYWvga#tM;؁=.blB.>` N4$ $]9عl@ʜme5tZ>= |&@:\{woq09Q*fga*WwSaya~}=M̖ӲNq\q_: Y[k!K5FkPYβkWNԛa^'F/O!8 3p}9n(}н᪞FOul7 +Mbt`{ ę*bC j$E>A$dJ%QAZQK}OѷYl@vV"|?vIQ=K KT[VB&$Fd½a5m /|V_jԬs(CԷ4^|81}V&I}Oݏwৱpxb/!<]D>!KǚWAi`'r.E1k"Gi('ISA%F vjEODŽ5`,]+ LJh2HJ0HX E)MEx;Y9$0wO~ӏ/: r%ԁes2N 2ӎ(l 9)YZA BR'HC;dh# K^tte09<470vA`]623^9<-لm|˃X4X)$u6:W!S⫄Y |OaG)EJvZMV@ ؞x.Y頥 1eBd2# ( cC#wR(5OqryQʋJ_,_Xp.YC lޤ۶.$X]{E#,T[ϘRR=AZD"u$d C4 gM,L1EH^AbIS{ ?d`&L? OsQT$]"$$$3Z:Gi{I6Hmh ݻFLRguFOSdh?s Z)R$u<6<}3mo$ތ #u5R\\iFC桔GBh_`DKdEdIu{Lr$B@FXI B!-2IQIL+C!`qՕ0p%\DJU?=Z/=.bL0;8 aɒE>06 %AUw}Ϸnf}[0{ 0J!'2.ég%W8y]9qض6o j9NC0= J%9k|©tU8wFB(2,l9@C(Y\`&4}I02 /9J ׺B\sÚ8nJ+B~ܗa0Té-N(%v qv8`1h^tBEP< L:,#A0 *Ī^Z {iEVRo b%1B sT)yiQHH]-(4;qeՏgvjcx9u D tB`pwN8h ="4 K ݋=aBRS`sotg7{û}7f'8}"^g]B[,VVӤm{јαJ0+33uc & -7*[ qlw[aꎷ!_uJK,TJ@' XW8sה&IԳ Vp$20n=ds6`tT,F( h|R: K5* h ;6HhE0D%AN9Jk~je 7GVyɀ[Rc(Kκc p]m)QҨ7b4р}]( m`;ϱuԲaI+~>'8S)S3Ct`rNʓi9_3yD3AR@ 5K 9aPQFk HR;iOh) o4w;mdMtغ \AmJ k(]R}vOJҎ%0>y/ Rk)A+T"A,QG(V^cIB I(%Zf R)hRcѱDXת_d* 5d9~(TS:S h$>2XviG73ЖTF<,řcJ: _h!F`m2` )#RH- EPX[r2sLiЎbfo.JAzXE_qZFa}sDQB;J*t$a$I_%P Ҁȿ}!?͐u51~O «<ݭ+IX axDM]{;SaQ|8spp[;`4̎6n68d |YU>VJpXYrSÍ5u>_POD-^8UX^{/͟P,=o= {'"ۡO?QQp(+6aD 3K`]h`Kи n4o޲q IDATsz(}xC< S}^°s[2/CmP<@:6p2=  6]; Iz#^Ć6 PJק)Z1"p lbaNr#YG$ڏHɊeJq?0'%7oRRP%A'#E-VF DxwW(-q/qU yޝv`o0"V[dVzu5dzM2֥*`r}<v?/BH3J$D&xܼ'JKh((=0akeX nLڼ3֝%J n}ޠ"}y#{#_vu׸q2Bmݐal/\C-VVѲN:P;&OP\ʹˈF |DFt~4Rg2qjdջU{ \U$<<tO\M (aꞅt3<Kb`=׈ҙ@ ckU9Ycgt};(UǠzAKBrgɯ3s`>n B[&Dj 7(g_㫀Qk DԠ @ 9 ~έ[gx1\&`*޷hEx*k8Wk>Y@ݠe5(BA— <CXk{!cf-i%p|Mi4 -%Hi V*9(;"4l6Z{nݿ#" J׿w xͦ~JB< 𱴴C7~|>mnS("U9Glya$ BO| quRe0$MSB{vNJkZO~C/#bq}ՅEH6 趠 ZX8-v|f>p"\:wuȾi;<; c4;ӏcQ샡AhXa'4L:'ր/Zu$mO%s˷}pd>pO? w+]%{nyC= wܸG:.X[vSmwUsNCV 7o(4JXrڍc vAk ð{ [#TɁSU^61YR!ZZ$fd‡,}mI-mPs " "0>&6$m*UVy)=F8m >gyM0亊1PDX.!@IAId^*z<`M/ $DJ*%mġ[ē9r{d0[/xq.t Ewn}#G`<'N| A-IOi+{ Zm!| Rt4ӗ6[(_yd@S %DyHtNrd~Fg.Pp(\XXCV葯@ 61 cRF %if5ZNkq:MJIANJJ-9Gg`96OyFSiJ"ehOёL |'(W֢>R@b}IYH)EJ1"@ L 5Q@bGf $c~Z7匰y%#[_z ӊw>xX]H`|n!wkZGRK -V@J2c>W 2:p !g@z!x H 2 1!'OSs}>0Z)a3xk!Ab!IuVI__˿*ġC6z?Wc=ƓO>g?Y^::}m Bw 6sںްg|q.L4| t` $~(LaC\p!{A~Q೫N_;AtsXs(k02Epשd&_˷`.0 TנZs3O8Lk /Cϟv׮8c?-s7>Mr6 - :}PksCav\LqkXX}68 7sZσ9TOݽo}pĹUNA4 s!SAOb+`Z߀- w]Q:(X$E0aNILu@'/iT orC% YҦt:-sKW?r=z!S~>p2*-|(X(30L 0Fbɸm{$CbHpmDh#Y4ߜNʼ4XZVc{E{ Uk/Zn"T tS1ϱ6ȽG%] od>?_cx^_fø\GȬ"84$Dh"0\NYK'c:o-+$XX&; iaStؾF[|b<;gX/ӤAh 4HF;kC^% !OfTQK.]D/"R )ȔGW Jh6a:WY] f ~{dt,Z kʁ Wq kHJeg(Wq?ƥZb°͝X~-J}ԿE;G2osQgeqա Q+ԒPݸ:(g=R8)HBAb-^^#CI,Tz{ :;(.^o}+{>?GNs>(яr}159?q>U>0;;)EekCm~`/J%>}q*@xer177ǯZ2R ?󬬬' SVy{A.ٟYfffv:4H?Gtxs5~~wrwٟq 7wn!g^z<0W]cfvNSOq=yB;ӧO7 -fr__%"?c=FZǹ뮻0+g8K˜仸yn942"tWA{.@mU;F5n΁^]t@^"47` Ta!hހeqۻo!ؚiGoھ.=;SO^K#?,q>XۂF g\]sOC~grd %x0_pn7ѹQ?CӰ0\< spc0p/,P޺.,>r10|M&F9z) %}Y'wρ7zG.gkjͭ(& ^{Rk=JVxq@2Fxn?xk4aIl|($0*GS됕%qG Mk>V}{7̬0ֈPa\+ 6e(ayNZ`5d+X1pRX~+%1,ɒ 8;(<=(o{kV_E'ZX3gX[z1JVZ(ѬYR%<6[x? CF&tgR(,ȌDHJ@ 1lsla%%BsZ@BC` Xr eX30d& -SFme+l,\e\kTmj@TRU 1ӡ siFVCfڳXA ,tȑ "%ȹ_'!JI"EzaDT G7M( Y #wN}k5T)tk-`rMp3w[#X /cIC ߻TXII"WB0Iօ ' ! n%P(@9H*[gA]%5bO^泝+ĭGE\5ʟNiyըAJm53sTB '"` QUaR7mH ) r(佌.<Jy 31QgKwrc_sq6o$LXłvFQ jK.4- 9< q 툜J+E@FK{<ɸiyz+6[- Gƨv(Y c0r[1Aӧ9,[$uϒy<%(s (CdZ6b' 4uwy7dQLۥi(1OR 5[C+ymnq/!?4ˣhnRJ}, isRc*2ba)엸%>=͓Wn\`NGtU/1 lF&ڣAL4JI&^QP% E4EO$h٥"l,F쿚(Z?~y׿,x=?(&}}}ܼqIΞ=?co6<3<ߤu7~{1,޽{yGäiM<.\m{ {3c ~132:ʛf:rO3 |~U +ĉ?o_q~7*8}4Y{W?;6Lvytpe/pg _< Cn_v},|+.Mo@wˁ% oS0C o? ^. w g!7[+C4^TOtkIW;(fP<@I%;$@EPN_Rt:3.д6޻^ftZ]wD끋߂ wcI&qګ1RRдS q"нk$x=/"E(`[ 0NM lFZ6a"i^1R/2zy,۲eWOPK..LXl&y*$-d(LtqHt U$_(OȴO \#OKHgS[OBTGɒ9.OyaJIQ"dRU ҅WvCH}Ir }!耴 q}ɰ)li'-Y&QЧ4^ڍv9> LtYeSx76Xȩ[kXb Ҥkl1+f:g##wAr;?眛^:0LI(H s%$˦ H]c[-JRy -2%SD $@&`bOt~tq{HlުzN{}Cwzm5G_HھQx|A$du9sl"VPudN,$k ASx^J`NxG& |O<;JwHIw)+5‚ M;09.QTr 6!J ?(>+*۽^!r-6xpG,4(g v[OsCS~?om68<ϳ>FT<6BW 5ZkZvRLqBk8\.l6q'IB\ETU-." 2&{n3=5BpE.ׯ_'^z}E^`ii'?Ҕ Ð#LNNǼ1._*gΜ~xy>ǧ?i>~GZFks# MPy.(<7ZσYM? $XO pY jawlQAA;P=Qʝ x4g`Ev IDAT$o(2G*мl?ˏB]~MOҋ] p7riAO3qH-spO?ÇY_+? \CR8p?[ZEFe/ RlQ7.EܿPa1һx>p$'3qӽVpـ}gfm:>(/|HRT B"mLs4Gٹ)쥶NFhU!ܖ2B !I8"+M9ʢT)e8Hk؃ GQ ĂЎ(RCXSgsAvc_-vEds7VC^< 8McL5t<$5ȅOɓG#"4M (SX1 5{8OT|RjUȄĨH( HG+NmFE{l%M[jS4zACΐKԐע^ʺ]Sܣ  1o3^@ZrPZ&g`,0\p*Rae{X-GnB+Xq|i(;aBaayFVTX,M"o~"EhL]:yReljޔ2+ d(40DNPWPL1Ԏl8fTsJ:2"2ꮠnx@5IUHuƽtqcw2 :?0|k|n<'{x%HK2PJ0ZE *("+=bucDcz@bfԗoNbʤحZZm@A}xޑ;){MNebG6neɟdI\_C5M1$A@/S6)J%OspPk GkEB UJPbKud2D 22D4#i9'K6UdXag2}_fk,cBPĮLYwhM&߼#0~7 gY}7Bc+`K/8(9ÔR #GT|d.QIH%qPҫ yL/|RvX "b t'G &V1|׻m666x>яocaaO3|__YdKmm?LR!Ku 4xv>E^Z`0`LLN>o~^pp@2#s_ nFkfgI at䟼4WUz('>|3aaa,ˈ˗/sȑםp!UT`/8|%O!9h]+Z2߇c0W/Dnl럁¦؆E~mA(_PҜ!jg?gzHG =SsY-Rݮ(DXz.(F@sAt|7Fh|w+ng{ ~7feLUL ^r](~8}?~﹍J<ݦ%g~m)cz=ސRp,{:w' 4;BK0k`3r[૳x IƥAE1V nJ]5V AA0-qxI?ut&יl$4Q- Xfq5' fC5aаI@+(U]FjXBpTrHY3y}Pj5IŞRFEB Rpp2zE|i4Yx(8NPG8saA Ut&Ix7 eC:tV{Jb uahZΩU `/چ*Y7 _6|m)ώc#Q113q6& 6f;mĥb Y-I{hvIN&?3ņ8Bueޣ,c` SGB{ cǘ80$M&yr+}7yڛu0V=L6n@厥0!2L|ҋ>GG43(*[ Ki'EfAc̒A]vwu4vԟK_$",{yi\.195֚}C_8F],Gz_?C>:t$Q}_k-_k|~g}jB)oo"~Cu1:yy;;<?~__v~?}Ǚgyᇙ75E̙3,,,}سw/0 < .Y[[G!_uGyC?~0%CkXJ.xFB _"t!hB6^QXOzw^'|ga}PGDX殺 &s * 8u{o0C{ ?XP A_9W/N ~_1EyuFjg ~" KmG ^/r7"4&a,Zh^6 p"lot Ajak(,/NSֆyiVfPé|(]8jx|Fץ콢 JELYzg,_J,KyCq橧32|є-dFGP{*V .%ԧKd1~Y%m; Ffc k 3I$aDLmCyC`k8injA65k!<5W!mZ*C&d9\3`2v:E/O3Z"T$ANBIN{1Yҥ.43BY˗3|J|s緵6} Gݛx软xUS:(^ Y~%$xWNiJn8J-*\v(2=v(,, 2Bun#uл^869wXQ?l^k@{)h_B越})k TADž=ā 39 /$tRdzWa(o.,+YOB0/<#1;=ރ5gRX%4@T('ʣ}uM@C}Z2TE@)t7yx "AGtQФ_Z9JԲ21r$ޠ46NBvla/πq5}05Qy(]Luk8/3>5B-kie m]YA-b1;P͐|T\`уMޜcXMp^A= ̄ 30RtYй$ϷVc&RwC-y32rnk(o033xbžj#MYKu镰#tjaa*5z"C>^7Zi#!4a6 '(TfZ5[6i6]ag̓.Iɕd[ĮB' j9$CϐRANjq{<7\5lOofh6p}*. [Z3Dd5TU U=Aۣڈ$T'7'81ߝßQׯ_eu9.xfBW/e~I82 Sz8;$\fĹC"IpHHM,G1mZMۂlwS-[Oϱ֙ëQBe(" nvJiEq m2ʵ`;rJ2cqN D# RIl2BS H2I\I[1Tgt9b[ QbƸjߍ$Ip~̤\3kMl0:~uH"Sqg/`lq)ǿcx}[X5}EZ+747ZH^U1oLP 3w}oZ.z8A_PT)8~Ito?okF#`n~?ywq13`Z{R]HV!ov>jK BۄB?"K]kh\PcEVrW չ?9Y8u z0=2|{`l ֫v(pO`&> o/2LTNy71LNask_3xӛa/?Uh6F,PfQ;z,*mYdڕoAgA'Pqݧ iCOV9n7#_)愰Ӥn0 z&`blB: 4r5Cg7=0$b|ՆlXıd!F`C%TA_R%˽.f W^bahԙ5FJTnC>=NڻN@e ,QآB^-1.KkZ &].\+ȕ~*ux~3pݔ.@E$~g& !)G/5<19~pIJLB Z>exZEȮyӌ.U[b~Q/yF5XJGe/pf<4_dxrKD]ԣFLrhHTht|ڙU2rK e3A IDAT(2H5b\FM ȬdXu A }KAkvՍ%;SZ%ؿ-Rl2hx"g7ϰtiW.y[$V!#Fxr*/iN6L19؊Gϖ 4@H]68DK紅e% i:OEFǷ 9|wm||shHNV} q>՝/5 cc?j^.AԜ:^A1+E^P~($ZKpv6XlA!^]&x9 Bϰp;t *P: Qx z?|> ﺿo@y8: x >S8.%L l?w@k ,!ppa{` %8<^{-u~c?.$v'Pܨn@v1x@^$™sny+k>*`wCdM nXШDKߗ{ B(LC\a9Ĺ%$K hn !VEmR8 #BqڑN@A7#R8?=u3  xHC,CrA`=Z#D4L|]!/IxJs2\Pޗ62  -d @dW2ȎGfl,n\s<;3{OMel~3,?W7r&{NS9U+W`[2^1)ێկ)>l%(:a($oL]Mћ;􄣞:c67(Y!z cG33s"W1zޝpemLl"1Yy^/(Ksad\uܐ[ (5,%gc|p b-tc@E(&=˖ 9wzG)+ERe,w'90=Ce~Xcsq [hi,CvP un;S8TB{}1c")CobPN2£|q\̠L =cȑ$+i SDʞG`w|2.̐Vqg(;SSc-rx'CxINX \%GY9k}^|2_3F"&F"@j5[pHY*rc%*-9'á+bT}M.$yj5+Őp{* A[ DV,xn@ g!"x1~a]DŇ( :( rHRLS)$VdPLd-er0VѲt q) :#PPA A5|D xi07:jרo\ /Wt+^ t(]9e$+ : 3QT-E`wWĥt Z:PHY A1g@z *8c@- vy nSX+A` @iD`̋gVr!GrYǜ{D9&eD#Vڀ dF"- <V$Fhj hF`ޒ SAxH] ൠ!JKȽ#e &Cx2t!8HmLBcZٸ8{R D7xJzRakŠ qp(Ioւ8-S l1R$%. R@A LԨ!`M A,PFHB4^K@!]@HP) R=  {njfvGdI*> }1ρeI(xYeH:0@ JT`pr?|57>UP <kQRq#! R;ǯ+fя`!?G~.'7~"~>y'/½#88Wpt^񦆫?9,oAD J[DEuubXy1mЀP}ɳf4D@CXU RHLJؙGPKxM/C"l,,X!'$\> XhTP' Ayo{k9|0:15y#Ś f dQ%Uë_{/E{G|=~)6zz|]Ў&o> X&_oD@Z7߼ʗY~.)v`20M8pdjLQ1P-5 S8M#s0w%Ñ WAe& *Hx)+ɕ'+N 82+>Ħzo A@HND 2"@1 ۍ!t dTmA 4hEDaX8WI@ ~W1`4 *}2vE !%!!O8v9<3Orx(b*Ef14/oZC  * YF! | Ca -QAK|duzC!' ZtA{\A M ld`, DJ [ =h<;ơLw JhWژ$`L<~uƈ?T\I'qGhVa.x4x/}5BN@$%>Q%!I@ ID*Xi1)('PVQ`ȂGʄ,Ӊ# IB پ3@$FԨ$!l#}Bg_ ^c(@tK?+{Hh% RY23a,_XGt ֯Q_9FD9wQKpI8q銍8"qp}~p2 ~,.ěݣ%|bܝێ {%xoCg6|&cxz= ?gw.2"­xf8]עRJݍGCx@0͸=/E^*̾vּ~_'Sn}83@co3Y٬׀o}ޒDDu̓ThS- IՐǛ,(+|J5.@92dr[L>s8|C*$( ` ˤZҰN霡O T$ }RJR JcTxpQ͖(2Ǚ%]sAba\dF; ,*Bb-6Z*RQ2B-6Y[3G8*8Xͯ|:i[(ԈTj_x42$14] #噈X`C˹"㯞u)P?O3zqz瘣>p8q `#=y\3#by/<3"X%Cː*FbAzhE*Y2`\XDP ba:,G!pJx)R!,R )"A8ON .s*xܠ B,&ǓG,ˠQs&K3 VkTuxSǙ]UldsLSFq:#wҕHȬ:'ABa1!\y|@ZA08G R8 AŹ1Gs$S2!\ϒZ( Ff<@aA',@#t^t-*g@ R!)T#9 :(A .\ yBS]X8NCBs 5JZ|Š\aD[hʒE%i0*0DjjXxTNWXIRF 4]@'qp$8-r&!ׂ4ޫ1OE(\A:+#Fa$R3w +PrSOrB!ωq 1EjKBZ Ku;𞑇mBC L*YZ?cX$?KoQMYL$wvЬMA/[pg[ԉD@{B]w `8~F9H2X}= |&O(%(g"t6v9@;?kw@? $Q >af(ّnr B3=)7Qz=' $=tQf&^ЧL"CWI60 Z̃שH9Y]3qiRLdl2vE7o*",ryZECB<`X<*HD |FNG&zt >S"=Ii"AXG.jlVԷ?t&,~S0v0"c噄1;3Z'90uKċhX!':V PcO>MJ}0JGk=ZaBQC5;,\ {o:k'+s#{S\d9Sr+=]d:3|<b1TTʨeZ{FRcoE] $\3il!u1E,iitHwG KU(&(YkU@e.;!]f)\@cHeV3գP߂[qADKhދRp;@Rg;[qX滝=gl:ҒcrsnL/lQ]Gߵ${۬籶"4]# IDATA9LGQ#Jx1p]C\|c^bc 4V@ 2 KkЉJ kI0X"Ppc']R ~zMqCi\XmWWs/75y+d1rA,\c2-cz6 oFU~ʦPӎjyJa(Nãts'eK)3$ð]Lܜa;;O:*cWύ9'_!(NVpsqxaeBQw>IxQãe8w6} ݟ|!W~{i7^$C e1?ºݥ!ydp1X'Gk|8>bo?@pDdE`m/Pi5|ClQ]՜ 5k]>Iٜs1tSB[tl/0οZ8vlZ&]zK:"J0I7`cҚټo mQ#z{1n -ёodk ՜Xa1@1[ܣ%%qy1:5V_a1MF#Ce&dܥX*)+-9䰤3WcV?Me-tEmG}Eަ^f2XgOH@o ]$ LNa.Ÿ><-zj'e+Ÿ8EC CbYN \1j-8C#:`8AZ(+b0{EMƸYU˰sKɂ .nAwfX2C>p]ɼg8clB?{ݔ,*GvHo4$t,B1=|" ,{ʚp%A_ɓHn'Yʠ,Hپb+=xg~pq{7y?4aAO2f+_"Irx}/Cʘx ?{ ڵǸ{6W><ہɟ*ekXEsw`#q#{?^Y矁{XXT",(ia .\x<>|L'=H3!/1]vY(sX?-ExCyX O? b=[1m<1$Zo?Y}  ~3_Shpr0<(;wln$_*.|N/ǠlۄK0 h#jؼf z }YK3-$\ Q>41";{y6DF?b[a@ ]-bݬ1h=`S i3sD.7*=΃O44!!-Lװ!IL-F YG#SjOZdy2rpڤtbNo! E BC]On@TO )PR) ^ %TIА:Z^dUnwG䄴KE7R£A5ԎDP&288H d.cug$!&NEB'KZ!' AjlO,JmAr(h&I0QjJ)ARg z*&ٸɮ,`GpI*ͨ甠ВE[#T9MriSNJfOLzIh̙CJ=iCvwWa0MpH`^='Ͻ`}d??ÿg?4XNOyɧBᏁw~޷wBh{( W|cSRI.7fDYQ7=[&"f^VLTϧU#1 (J'OoFr߇mQtz+8?w QzKpp2|x2g~.?}R-w`kqW~ ~w!. ." N߀g0XL/Eh7#((JEUZГh{&wA"TAi9$GZ)>}B[uR @pPT=ry5.t+KV4 6+z.mb2(;TYǴYVfF-anZ~lo~q8| WS'=陆a;ЦsL2a1U僆tX&M0?9U*K3Nv ꥣ +FYm~`Y:Q=} $ ul& O S7^![Z'53j{EþI> +Qѝ[P5Ö2!֌ C8Pj9vz!?w'ٚfv8$d *dC4 ~Ͽbr%[?yiVkOmoo>~ Գ}(JY 6X@ny A,Y/U1@W8wIE΢9a~,9 ~.E3PkI+MwU陬a5XF+t*8+9;yAGx&3 E2\}ۄ$`PBb#W3+cYsf6(@RŪ్k-XރQ6ng<paE4\?ssUSxUn Y >H?ug~ ,_ ^ߌc? _<|)G4\ۆoރ5/Cx~ vZ] eyPgbnB4c [K|=n"E$p9H΁П"XWaM YXp=wwXwe>; j]7z6<308Ԣomqs(iP,:lݰbl9+#rdh&0ℙBd^q7RMގKla|ڌP .Xm)*,XYVÜi4D˅†6C= jme]fyWX猒%hбY;\C,'ń:!I4^0*ĐEB#<{s &Bf #, #$$"6 cd%D9bwGBkVj/:Hr!WsnxupT1ٗ/^c|MZ23dD*J'_~?fuv+U9/dW C[ FhjdLƑkYeGhԑ@u7y7kqn)c[Nmesx#ݥ 3/hְǀNiǘ)gIr]d͒:B ;`QN3855BPyp4=HaZiltHaG9ܗ9fTR5;%!:FHdc d2=j#5X 9eojuI2-ЌٱkK|:ϩ ]ל[? %a:n(R tJqmqBnV-m kwܜ=(j0sւvL lqiCó Bv/NQ: <2fՖs)KWy?@okĪ|;r)ړj?ȍ2 e5!&W_,l[y,֧zN@&%|MH5|2X ygd,Ю 9pc|7> +q.Ѿ8EVB E@Ꭲ\s~6]Ŗq}@,m%7{wΤY#ކ$ ` 6gn4ʮ֑ a~"T5: <.$G6yC"MN(qQ McÁeĥ+'NfpA#]|Kwe!"+5FL M ִUCS$ 9̺耺Pӟ$yDPmb:L$E̥Q%PS UX͊@&[xgӎÊvlar>i|"wdH-H}w } fWYt:`eAڄE_-;t$.X h_|K<^bckMW^G'P/v%+ >^~䓼ꕯ;|;.^(?gUbXo_ O+a|?<ݐ%fGZ˩n"֚xy+_F1|+_^?#"ޞ֚?'L&/++={Dy>̧>i677y_R2 Q z9ymfVX]0k`*X< ˯+_WjVTP}}).lZ*8>YS{P EqA8x-էa8?O~l\*S[^ WCP3.BZ=rъL3pB > KWÉw-pO> C%ߺ<7p;w`"Xi-S%#>zP9[RpS0? |%l@:@1{OVum9棓Ѕa?P+O 0 ÒIv D(NAuAl'N#b =^i 5:PMLIjE݂$\eKBu{E6 =J1Zl ekME1$٣E͠ 1a-34#9> mδփu^6+-KsWU3:k %wt3.F-p^-PfH@"Q&bu0*f߂" Fe,^PIJ^g+e^)qte8RȽ5YYz%|3Xh!Uq1j^f?`ɋoz\uVsp  'HLJHwfV{H#$iq F>:z[A3.#=a؃j-DT-;FzTN.t@HI V-)iX"FP=28I"9Dl+xA^j%#bLi<]9G݄!&S%F}4R$@&e{6 }<-bZPM^w{ꤰ&\Db&t9SwWC{=NPRE`2\tC@xxn-5|N\ `0x BZC.@;_.zVqup"lmÉp0pXqP "(Wx]Et̥R%\{^},3 >3\ϔĶ+nMxȍ \&/Y=nXL`v3߃cp0>_/.YH@_㫠}6d),σ9TWoˏ@~ k `\l|QN)z\cO@iH['ְCpÖc,3Mve@^iPح*EzaoNgʂ K6[쵱F{hݑCq$.ɞP:-.A B1]ʂ139=>g= Xrhr93J@, zW#%ld` ˨p.1X[BavZ|b]p(B{ˁ 2ҝ6PP9WBڔaVmJnw#Tx+-eB{,ɳ1[n]3DZ%1}o0l{V9rx7 A zR;l΂I'h LbO%BTavzNk[\e0WdV`e6C]/MBshX*p`S*c2kQMn kH*MK %g aI%$AӨC{.bh J)۟3`!&g@Іi/}G-Җ`!ĕV%`ub0c.LQs,|.B RI<N.3X1ivG5V1liV'=b2P= n0{Y!'XRz(L&Q`Z|ۑAĐT#*EO);WѨ a'z&UK=pmXEO$Ho2ق%:xΠ _k5Ie"^E1Pl I\MAW䡋3**THyFooP5Z~뮻;#,?%tmӪ'fSgQ^ܳX<ϔ3gY]Y׽K/~\_wi,{5G!GW?Wb61XZZU\6Is4)w=#7k- `wt1\s{)'aY&(X.=.s5\׽ I)E2y_j pvh7B/t趲}^xϯãN;XDw l=U{w Jp2_m= 'ӰrmtؓEܾ} ZJZg'x,Uv! DQ[T td3t\ "4W N rC[bbD8g&֊E1)Q s$ 1FôqF#=Д4\(Q489K(l]D%B`H$B剽!]B K-M(L22̔ yfꌒi VB %͡#Sݓd"BJ,b!i{gFE-m5ڑs`Rf3Y8#GrI3 Ɥt_}+:|723z,NK>v-kncW}G^EuE[fa[ ^G ^ ɕ)DQp0pR6}.4(KxCOkfZM̭K([ɻ>i|2h.y MUMh\H8R[֖R^PΐM ' -DPsqS\1@= e4>ddR *5IiR[-hj#"YkFhPEJ BT0,B"NEk[P"6h!;a4]IJ ]S+hI1%- L tZAC#I}&T$Tġ&&B4JPL;v͠ꔨnvHDJMK|^>bjAL *g41uyH qj`pXoFlEud ZIĺ k:e΅F |)ƐUEQ>Q"Hd,fIз4 цdz5B셖r(=cIU,L=M$7aA,D*@U/Pa%dD 0!"Ak|2=fBp)[!BiOm+5MGdy(ey=U]˝so{W_u?bcc'NDs[oeuuŴn? 9 yP{L԰#>{"n±N[^Vްfw-hGXbbӂ,Gba3.W b253yԢ UdbbU OlI>^4)2nPV"1dk"P@'\:2 4(C"AgªH aD Y_%Q.{*sĚ3)Bt‰aJ*KDe#kNh"UجJ(GhI gI;4-{V IXD$JwB+hX9y`\3{8ګxNoapN]7%[ .%53qW<Ɓof=yrP֣tAX =[H!bɌeo %d2U%Lv Q6h] PRP8'IblpCJ#rY$"' T&erGhD i-,"ĦDt9`j(Yb6LU"D=1e*Y2DB2f@2r Ƴ%_ :%hV*f,@"dըT#'RkH M5{,X Zi>!ga5V[S"Fg*!e]^8b-L{au }\oKә, f=;92`Ao6LC*":PE4z!b:R-~~xв6? p^8p 7pSf~(X"<=-xbLΉUUX4h… xM|'UU4N%\ꫯsKDkkkk_;407rlx*KQʰ&PVW. :*  ʹL'KU-X]yhНR͇a鿅߁CPOagK+q8SY_&%7t9]&|yњ9X W_yo[Yו?(|x0Kᨂ8)ؼ _WJ%;_ aLXf]˯T4ٷK)h@R(qe^q-Sh$Ay/ `cOR,ެd! h4jn0૆ L]PK+\#cKϩG#ԑR"G7V[=^<fh\C;"IakH XYtj@hwLH4hTCTߒ"b斪Wh11 !Α it0=lIT!a>3zBЭ'2CADccƻl /C^ IU4 Fi* R"w*ɚiI,ƙASD7.TyZb4r#0Mu )cF7<fv|V 'nſW3qSYG}z)3lMOsqgE 읆BޟMpzwj%]wΟ) (Xpp37 Wg/p:l`w)U], տ׾z `WAڢYڽ 8Rܡc6:_?[ٝg`ifu0W\T˷O H7C vT7B=" [lUcX#N$?JBl/UC۞:B+t+K5D*zqyP@%ZbGХcB&$Fβc88A[n e3i0e7%q4bNQջ_5W2V=b2!XGBtj7B2ؼ%o{TJ V/ )STxMC;Z|?If~Yc\.M2,ӢbdT5CJSA[ F$C1Vcᑩ'ENe`~ Ԍ)2֮ɫ$I[xt?}ٟ7toy[_>q͵r~g?S/w c x;w*W_}u4ӊ'NoÛ33y^#k"_|SBkͯگɧ?in\s$f)?G>,/7ïsOm?xgk_/} yK@ ˙Ľ>oy8pc= uXwRn:Wܭl>Pgqz;E4M])\ÅKX|+,9xSv/xWD}: ]`4

n#+`bȼ t}i}_.g/1l[biaOJ7KmHP[5 3R̼v ,`# VfRPM0ۂȫPX"WsE'9 4VV۸=p&|qDh1-u=v\4=RKe12Z `{ˁH{ Z ɚȄHH̊q ݌$:T"H߅}+ӣABJPxL/FtjAd4jIiwQ* Jvi@G=i8Ҡ3f`0VH!0 db&ذEDIO@e\]X6ΡPhrttb~Pۄ9bPAd6tAͷ*Tj{=HXIPX.#  -)COyGtRi9V8@z$ !Mq`ܜ#F J%mLt "Lb>_*y@&3OHd4#[DiҸL$avAܐ$HbPÈQ*ehLe$^c]Buh!.d:SѠOc//?̻h!C}Eӎ0;l\G茓ɉXABcA&LiH7$S0b|C;&D'5k81^ǘHKz,,4@(P[3e/8v$ĥG˸QɭAEY)jiL&dDRID#lh$eeL /hE1M,)cJ/ xH1*dнZAfF(XO, ,i'XzL$fHɴDDthj(QQQuѣ&6SyK)cE"FQS(&!RC[ d@)(% P) ؒz;}oXeov|ゕ?ys|@Zt\z.1WIAߕowz Y?f7tNS7H | V/_$o C#B6 ܖ ~K𫟃%+kzt5cuPY n]xjwp-ҩ^/~e/Wȗ^? 7>\ =k;u~݅?x{1#O 6-x_} ~?g/݇߀y ̗k7}XkDU*G;{F6 ,>Tbz]9{X[Ie=aZH w*^_ Ӷ?ǿ."bWjaRR-> jyñ hlZMztWSOHB* ^,YZgb϶(Z`|D5P$mƢK)Cb"e3F| .qZ5Xc0mF1$LL(4j(ZN8nkȳuI\}=U!HFKo V#fAUCiF#MڹCʞ*DO•\*[ &S ev%EuUYo"'k /&R*5IWgFELFB{qd >@!miE[ kU2(E)Lc6{ΐ 1d1$tSm\BmfSjV*b2*Vr jP/HR r0[ZNİ*61#ސբ@!8tB(. Kɐڈ5Ќ@vXk)"b8ŕ̐ 8-!%&SZl.5xZ qb*!d)һZv$: }}=_PZal;F+F*i#g(̹0GɅd6ql=Hfu+h10ɮ0&)ZHYÁkc;r&LH6VB_P, dxUw"yGt7wPi. IҺ٩k7~o)1E[ߖWR׋#TԷ_<O>S!U%?0خBz'| ^G FתԪ(W? Q _PW瑧jw_ XڑJ>A:vŚЧٳ 7,6B4#Ak t tAi3:εa4Sx8h xF[ =Mh*X' 0J3ZE] `}řCLS/n+$M#Y3Y >{4.mPCA$ְ* B{-Mh"3hvP2Vf X mg"wB'Lf`;@_"һg cKk(0ZQ,g0)+\0BVEc/ xj26 fBB0Z9X^UYƙzD +F !Z jk^/<ѷ-b3 .79Rw]̱ŲUV$Q:WGY2D)4 N`+%4saʴQ0\l|-0qb`IpO̹<D_ȒiG!Bbf*Z ʶ0ł4u<(Wsd=Zz& AuFFԂhҀ/`'ERbpZ0i)2Mɰ30Bˌ׌Z[%iI"3+-)^HA1p8υ$5Kha 1;31(entm䄙lO, ٘,EduЛ&v;Ì6۴#N4bL!MuE3#8egZlVLb= K oc_sTq-4ų7vB&+~ޡ+Ri^sI K73cdN!ʷY3sh&Ӣ&b͌ +Ţm CNXAlb,\])3Jd8TK_<3\Sl"ډ]' v`\39Rtp8n宁*oq1c6`9RG zb93/=wւb||UwOx}!j_zO||'t,_X|EDS%UOp LcM`񷭅g`AQdᱷ<1x5x3d=݅jM؏^ӓV3R"1pJ-Vv? +/Tï0 ܹ]9W§n>zz<|6  vwT;ç j]Ԇ}]l_Q 5 5} n?~{q Gas>kx+dH5\;wՎCoA\'<(wjbUsP%\J-waZԂbw!>S! J՚BV?GXJ݄ZvѿBh,| 氀Dk4#'Κ<RS Ǯ Hˈi^0gJvmE$`4 zvII`82зĮd7bZ9eqѱ  f&3a  aua!4:T8WGJn`=}6XZE58nNl,tm!Jʒi҂c]LSt~#bc%A_ F6\r C ΋|0 ȝAGn& 7YٳDX ı, 6Lbv 4}DeA a&2Tĉ9(cܐmf3$vAt6 Lh&:[pdB]L'6I;6ٲ$`*)7} .aZEfXG3w$33<i<))YB$1@;úR3tv)mdJ7d2#LN-{50\ jYfll$ѣ$(G0Y0걕. =0ef`>7HRZ_z|33g BlN&6RSD6]{Eس #3}xMM\{!СJ$`$lf09sh h)$,8] (ٰ5DEI?jY H, 2+B’\5;xPg1S,1jP mÜ:bpNi#H"5Kb[/sL,J6b}ka#I!kj͞Ҹr4Y [\Ᲊ4c 0yGXN؄blX {f;s,;!0Κ;ҹ#-,}.t2szawKgm物u5 uSe)!busUx߰3ķ]HJvUY`%u4eϥpT}[ B5My/y-Q;)}Dsw<}gaspu{/GS`lx? iN8J#e2?g n]7;s=V]=#/UYԪ短KfC/N z  wg n??r/o{/[5§36rRaTI IDATʯ,~k+o4{׿T2ǟrTo8 ƮvxC5 E8LD _s~DlDMK5acWa"tonV1G/ka.dSk5}CX 0ݫ{A"BӂTѥ5wThr/8ٴ\*S!;j::26tcv}Yeˡm 'B4DG84bLq mLSL~D7,<&Kf=254tm39csØ,,ZeA TYc\`&$M`%&X&NrD' =/m@nI]D3n_pH!I3񸤌5/f(LXFv^qZznCcz,VEeaF̮Af_L (2)D(e4j1 U J(]cd /XXTHY!Syr!5rP-Cbʁ gk9p%4i8We !EpdlgNDm`Ace6)C.+dq Ɓ:e56%&X,flq@pFf& V*][@Vd@R#2!yY7Jv\ 1Nbji8LY(3SH. D q|Ap@#m[/zö-m(si30)&%W1<˼F=LMu" c-֯Y@[2y"i %   t,L }Y!*2[Ob3# $г L,n ܵ $y(SN0*LٳˇehJ,bK6q/`,mjybpIPc{V l<96[$Ӭi8E(5, X;L S͑2b,EP9b!kO͙&Dlji3Fnnf 7wX:C9Ȥ|hQ v]Pdʕ9os[88>̌!0Z|*a5*~cq~1%o OBcC㻵.Oӓ0+Zy/@9Y@` IpR=3le},RA~/~>݂4p8:;`0~^ SxAx.W='vVBx!u!ܑ_eX/? /} ;Ϳ qzx0jxu~GOp:U | fam.ÝOէkl| p X< UǗ?Yc~ctoR1X=Ze_J~1}}Uzx {Jڶ/TΈ?S :*wkTԢE77_, 3>  ap; /][KU{+wmpp E3>iOkm`uwB8?wdy܄)/+Ãp϶? +[䩏]h0{8]v ^p+ՠ>~^g`Q_*:7.=΀<;cU/^0;a~s5jb=*"7. r}. / l|GtKhz?Q9L=arojD<x?7hwGn-9k:ܿ;3ؕ9!.qGlGN ˷Ҟ'4oBapu3ao=z݃I䛰?뙧F^ǐ RcG,n>8)CWr-8S;¥2fd6ϤHw[ }.,3Ux}ZjI =F#Ě`tAT; eKK#":O#1P6`Ҭf94p9^ 6stRfe* 2m#r'PĨKi%cBk=J6pDvss,4.oMN:(=k 1jH\NXDK>[hhy*,UQ8,CtιL6}.nfLY~FSS4P ƞ]rT 0̀`99b8a՞[a[/^퀼ݐOTO ͟>4C;#pu}x5ps];BV0_K?>?9T8+uywQq~KOIM_ps? s1g_gU޴_V_$V}_j9z vg0G.rʣ` wåw=xDkB a _YVSTt+zW z}})XBZb PUnfO J5/F'z9X+, Mf\oiTL2An 8 eC{#bMߡ wjkt^+W רܢ 92S!fQl9Vq)!gH4Jn$!$UJNP9]?$$&$T9B9]/Ƃh DkB.2'EE)”UD &UЏT`*fNm-[\ޣsA'gRsc+PR b5\2x)UdV4(Fs\edj"~U)i=b/"IsCi*j !S08+XS(sD.Li*kP @(o706Thb!H#т P=M+hQ Jf1j۬ % 6!2fxɅT]TCb$fY/"f%]&X VVQSI񠊗jd0Reg3:؊z;x#Ju?La&l}@*`/ "ZaR7\(LɅ#=R\ S@Xc'"O) I` jJ%{!6VbkD%HEmWjfA$!M%HI+dd(Qbktwx3Z4g2sS'qk+s&$PHDAbTbQc$lfTf$$ X."V0 dL_%GJR!SPAԂfhL`:83'r#R!dVD(BL+w;NŽ5oD կkx1͘7ǿ~k׾.`y`LbY_=G*_UjZ^| }n'<6<4~_| $|j](g ?|toSlgx|1l`* W7x5~߃F࣏ee|N?@..: X>P2\0Z>j&iF=?{osy3Nw"彜%"edZ,YȒ%kƵDii(Ikh;vMhZdY2qA1)Qx{?uH[ID] q5jlr2kxa?c`O_ A8ih5j?rZkAȟDnVqH+8PAcAk`Dtd :pQ@2K#= R'b6Q.էhgԨ82"5!B$ $ЪHoyDCEg@2ί#DQq#*կ3TpDR+p"xXy8T+՛ᴚ*EF*8.(zF4\⬰v=X`,V +A#li戤X^Ɏ o W{QZv;5` \F( YQ)ѯbV99y1fì3kp!&-[Kiu}lś9eV+x*f%j6(b4O2: -L h~v7K[-j}Z%EA5~5 xqG: > Zju\łPGš"U(վj6'kZƆΡqSEh1D6\<ԣ\9pUPG+: x~,;ǎ;}Qm8846*9n$Lu n#]* 8T,#GI '7̉ւAS|kzCuZCkR-BLZLQ**4Mx4sOk2Z]_x&9&%T5h, CPkƧ5r*ja1,U|2M%ep[zwv7<[06Mpள= F 7_>nE3C{-{-9؅7^ 68z}3<0l/+w=`sOoafiozlßt&4x|ny~ ls/>i-Gÿh"F}g`+xn-.?eS8io^;V*`z)ye&,y޼ D{f:m^_E' V 3x{:E)RJ${H,T R#ETF EuXSP(Rጊ'URWpZZ :L Z@U[]E @.P.)R+DZ1~](Ub&E{UMl,J Ī1(u4uҫV\$jO't"FW`4<-d X& v9'Sh<6f셊T3*Bv-Ujk?UT۾uc}ͪYK:<9@GRˇ(_T{i"5}BмtVCXW%iE#vd Pe'.eiI.YwBR%Z#"z]?pͪxW9K-G;F_ﷲ.шE:@;][ngB_N^V#r'N`5ĉZjE/q]ygZM T޿)+5.Z7\u}=9;\] *BU\9]ǺNRVNs-fRT BBF_mCo*H)xVTl2Հ N(8$;D)!)X(k(:R姠FZm eq`׮<EsEb%EF)lW).9UoYڽ ZXcuQZŚL;׽[m2Z<QI H@#UuֈIT*8k;tGA 28*ӏ=eЯW]?/O=4>sRh=Ιk֮u61x-.`@Vr)oToo&.y GS_v!Afé[}wY~e __8f:x)|P|r0^} ~N9Od/}n|<~ӊ?*l&|g3sq9 ?xߛWUEDI#h$yJPp:$Q|ƓC!TeFRIՒ#dI%P!LKɀk> 7d.0:XH-B&(^3 A(5y&wETF-ķl$++H*!Oj *ڂ4ú{ QmЈ nRQJQ)53OQ&xZ :)" do*MڜU0kWVjP@;c4Y! L[@I:qPR)8-Mji*Ʃ"%cEA([HŏqA8 -Z H .eR*8giAsaJ+ĢFuq8Klϵ@dʤEV\Aը3IjiYɓ#l[aZ hm IDATWg_T 1d̉"ަGi U 67r@&r(t(*8FVIUeJ:Aȝ]QJM[pRtB $%Һh66Z lNIvjC+MMZ)њ BƉؔL5v%2#怫$Q U*J GЍhM\iִH)Hhp֔'oR $8tW2h^g!"J PV|,8#jhhM#?b 'Sm'f*֖ zvϜz4HuԢqpY{G?J#ʯ~<|c㮻2W گ=ǎ_3,x9/}w]O}kW￟4|3'nc]o$qoisVJ朄X<:CS?+UYZ \x6o'? wK`8s nXF 4ֈ۰k_ ^zܩ9H_*Ŧ9ۧu7oWַw ~x'\^?®=xqxIx%,q 8{ /= Ysʻ03avMB</ѝ f?`6ȗarM`j2m K -=ke-]_Gڏr~b@ U\1:W3qZuJ5\6w:5ޙz%+uDM7JV"(VIzVK dhHZF(RXqWIu<b)Dq֞R20qBGu#JPwU4@U cTMJ6=}vlYxrp N-&7вq/ M\ J3ʂbNX:'z+kPY.1um]痄Ԗ0fFBTzjKHaԆ-*BLqm%fz %ӌңJM q8d8D]lr(>42KSF.1)UxU6!FVd4`R@]'犖3DV Mk"P#c%DŽ܊xuIna^:(AW4yB[ 4T%pH 2q6c8uy#D[RJ|ٟ}/_W{~7>rS^_~|S?vv{mN?`3gK/qpxȇ>ABkPXoo5ـasiz}ۍ>t' O:߁Op{Lk<[2;v>0.X9t4 'kfx쬉g'`0)xs#<8M#f/4x7 5cn82>>>=|QGGnvǽƁ~!~Ӈglzs^8" &6[l}.pW)RpƜG}Wyy'Sfq[ Lˇ XųNqKsʪ ҮQjF료~w8MbE$dUIĹn]5jVOe)Rf(T3m@O\\ !m)HJ#΂bTaw9&dV$2@)-5yFMO+)qp]KUZ3(WZp٩۵\b!B7(F l 1TP9b5Phڊ>|rA뒐ӮEAL!rF.gȓ|fò iô6eVO B%jQ7k]_h Nlo*I+ a)4|f5"% g@TM""ܪAS& u]YrT+Sc@EJخc3eeTiVCD <+0`#f##2d`+5u,'e"S7atQzr! EZ> hrb 0DHW&2ͺ2aBY8$r9̨ߠi}~7( U@ܔ%5=戗DIyڹ\K;B_!.X@&D"ж]Ǩ+.\ l):W$D&{jF!")1DoR#4P*CΤBz292Yӟy^~I9vSⴽE׶ri{9ytUG~?iG?5sם5t 7'??é{ ̜ܨ #llW[ig0޽%l 6w,1p}pۭi|I3pY. usf>/>W1Iؿ>l4ܦ"u9C ξ\҄zz,@P.ta{8^ pWX#~*%eYt /=mϤvco#^u,.7,< \TSx1{GhJ^&6 84Inҳ'4< όJPϬG >'cM/#.3SKLex˻9>g%,([W(Ǯz^9Am[JbLU!,=4a"N9{ /=G9L^- ơmvUmgKO '\ãfHǸZY|3aSwH pGO}Gsp=ۙxXq~RVK O?XU؞^ɓ' Gĉ9kzkyuַZ<7Lk Tu|#|[oˌED?BVKxY'79Xe}xN$߂{|~ &÷r.]6N> 7}}֥]8/`zt(?ixכ-כ ݧ3Spg}Μoh'pM cؾ>d]375Ӯ+em>\MsG݆>eӇ;e_}pU-w 8e81 ͰE8^%WZ lPc=ak/+߰j')+tyu*]SuWQp.3L8ʁ%'[k SBHLH9X`mڥqc%D脍~}!Bseɑ8Q%rbвQ=Vi$=M4]dOXDk&dxhĬ)Ӡ˕B%hfIFp0}RYO,#ӹ0i+IBS49rrl+\-:M22{,r lFCghBM9|Eh)^RBQ@f ъyS[ 8XqA*Ґ_/1[d&6=yEӏ~.oUHʉaRk8Nʴ!eB2gJSuŤ Z+ꒅ ^ &JUzEVD7+Cia22FVđL D!st!RG7'VzJ,tYRX USR*0ig06Ϥ+=RȎͲ$XrBfa▞M:8)R\Y"jJfGr@*ӆ) [mi;;Q ˰r 3 -cPVtE*L12=ye8^YLF)&T| poȫa7"eDJx7A^M qBupРCC4f4­_J:. + hp$rbZfímj+#FZp 825wH.&-M B $ǹs1a{xƔɟI9rJ_>^{Kd۵\.gI?s?jfGTDaް}c}};n ^I o/? !g; Sǿ|yx_WolůZo`𳖷q-6Mbi? 77gl -go{'6hm~a{pix`aw,pP2lNෟst\\Zz><9㻍fpix}߃&ЬSr<=6p'L[x W Lay1EylSp]z†=d'7Bs K&R/5N@~0E5B[ fb#qgv%%i:e4Ty4h'U#kl3!juU&JMRHFvW+ՍVGl~T͸Gvk /WʼkIճ}m`6*C.u!RhB,H^Uql9\)+ˈ*Q<:@g-2!*)Xv@ D]D;/HpEh;QbH2*7%rЉkhob`=98FEJWȴ(e;$ ]XI-F4+L<Z }[ QC)ZíC̲xQ4@+P 8_Ƞ_ՠ IDATFi_A Զ#q FH2F ˙F0Qp5PFSTȪиnYiBMiSq$f!u+JȠӺ6C^18揉_+yeA' UvNTS+[A:sˊ,SeL0L fgJeG \%<:1GhY^qBR&J  (W f%ܤ@,#OsqYJ =!Ֆք;PRUFtxqLB/38TP٪mHLH5!ғJp$Cp%*. 9}`$4J˜ $zªd4qnEi,1DFWBBM&F 3Ys9 fPeD9ra|Q@Lm&q]Y6VihQ@|ix) qv}RCBceB3 Ĝ)@%.= h0eWp|Tk5.UsQ\k;^Vn?׷s|ᇹ;x;{7 Xoo 'p]&vj/ϰdq 7_~.7ŧ݂!|埂; 8v=gl*rw{Ξ~߅cxu紵 b.ce+afszWGjze6¯>\~soӿ}[*-0QdW_ahTL|phZr//@W2kmsaA3k=l\ع s}\og]]غo,<{O{̧OO$&jhDYXaq`'J@F$#PȲ-S&%Jd7jv̧]{5b`" pUjoT},_[_MCx@lj?uY(ue4EӢjD$P`3G0B2Rz:ihDI- :4H.DL<]փT b(#}M@G$.S=h EaƎFVBSX60oW:CIMe@V"r)y s,CĎ;ƅDP d/m$[ vǚDڰb^Gz[ :ug}2GH]EusXD*#E(+C%$$'HDVg),$>)JK;KYHrٌ2GZzdD7)H(9F#RjcOWzVR2 x.JϨp`Z2`0:@{U5yG =iOQg1.Z0HvR*EzlQVM{ 2ҏ=6V*SO%#kRd8OINybA Yd-ײI9:cAޥyE.l`x$N'šqB2 A$$_;ڡ%"V :M g PG`TZY22rHjZΡD@F=UDFt _30]򂈈Gc#JE "#kz[ӷUՄ낲ω3! &ڡ\6eP=BG EItEeC=ycTB!L7`N%z֍o-~>~}OT*,<Ʉ],d5g؟1qب.n~;'qx󛉀%4˔x7`4#݂^,e5Pndχp-^pp#`5̮C{ V7j賰v~dH\3TC$ c|-az3 B*#ad*Ud*mְ#}IiNEdž^A`,68ǎ~)Pk diЦCzDCVRʂnuݔ(VT"F)cL(d4,3\H6=rZe.U$bpZhXQVc~8'[eĶhZYsiX ;jI2 O͵ؒ rv<˼s6h4J\j^ آMf-L0L4";ɴYɪ5Y NǺ [U VVdE"rykV2*-yV2Ade֑4Y0 \h"2p],f&ҵ<"론ՂS0"'n7a%r^K.+.l`'( 5/-2>0jiϓwlVRa'@N#N\p~2ӕ$49RY-zii5]X!kY)E-4JrfMAQXbb"AvmNsǩD6JC QA1W3bpF!` tɪ8Gps669AɢXb@'xB %<*Z𦕼ù"Ror>g(26%Cp5gG2aK2rjjZG6e/h]rH1f835Y`c)$[f(X~y0&F g " 4r e2c9PH] G`MXË)Fta@l,ՒY*c 'ąAEp / zbDkuЭ YXSZe,hJ=>e0wyfRVYˑ͌^*?G7Ɓc[=B^2[3oاҔ0a\nVSu mJBе2q HXs95 qE#н@n[jhZGGJϨ Zk0zG>M]yq?{Tvd#X%dg 4INRb˰߀8:pJBG':7H Sj^0/߃ HXso~'ѥ*ar'~o&qSitj~:<Jt|#)Sm&`4~<<(\y:yJ~Km?\N`:LI;K0Xބ]ظBU7!}sfxơR~ct5^mmp2c;Pil i< hXTH1n^k$ً\@Ge,yF!f`J#hbT64kK ." XR ra}[3< {fgvl ņC)/T Q e3}ղ,$Rͨ WF%pk a D'rA2̧YOJpjzac-ז"Ƭ y1N11%V BS38Yq4EÆxAݜEB;Ai1Yh%؈52*>CњU͆3)Y,*ɎLF(!TqVay/ oXi$pSD)SQ7M!: 8IϨ&/C$זY\8NQ7zt4s%CM9ˎ::1<,ux9gYKeAXm`tɵȠ2ZGͦ&jzQ+bJC%b}*Hjh3j Jj&>Z MB5LEX %Titm-G=[K0-5HSv恚ҚD;$J d>DN]=SW,=@/ x+2!8C!V>Fg;,&EEdlJX3_(,Ҷ 1PH,- ,d}dkeH\*22K桥 ,g7#2eX/ @ R!0 9#(r p+rZd~'胣_z|0Ef12ҜzShE(AՉ Jf1rh<8LRa*OfؙG,$NfCXǺ&dƨޱT`MzJC\360 aCPdH'Ч}`EC4 ramp= &buf=@G'"2zrJQ1HK4A K-%},=$BcgiD.޺ l {w(I_1)SxDKR;I'Ч"4q1\g?Peo!O}$y!҅_n[?:_| zoB$~2 璔%xc]xt>~|gw^{//2wLλ)<~=7pmsdB^|? $e6꫰$ݗ +~ .L7}T@& MO `EQV #s'/`8#X8&9k >G{JTÉ"$QxDAYw ([kѓ3h@)dt8?w%q>e#A;zq!$sB RDD K "2zFh $DL{ĠNpMPL@ң4 uG.Yc A0 AvLa;H#vŰ1?ro[֟ dHXoS^~|=8y\ Z:߸: (K7AsT2 oͷabѾ ^9h<\ʑ|W k۶HRw՗a||9+e_és1M4s/;o~ ~icxe.gF7oÓ/|&yJ.~/'|0`y=]FaN+ `螹KNݎw௥(m`*<㏁j2$[Pn&Ա6P5ŅߗPv gͩ^2@逈j-Q[n9wdy@Cu"7WMAE ]UCZb#P.#_EPHo Ki 2#V/#* Q" 2z, sfܜC"Q#$\ !PQzd)F0V?Pxc1jsT,;TkAX"-gddd=2BpD\FR(a+2f.#;v)=dk#v@F3p-"/N4B-C4/R$۽5mDnWxMt vH  NK(lD h,g]Z A{&`JA҅0-ƪ?E}G0GZ:(J򜀊ץJ*FDm< 8>"]k*Chh2B JKx_BDF`xsb A8\l){IliJ>ҏ h*0VM!A ta 㣦vcTd=X!mqd>^:1b dLF>thw \Ab.Xz DA#+2`r҃"mV  qx#}FBc/9Q hS9dmöv ɖZu>,G>, # x)N3oJ|T+6Ub扝0sּK湠9)ZQHjr(a-$eeGz( dKh57 "ĻjF3o50` `Yt= #EPh&Be T"Lj9%Rh:gc .c=p笊KQJX  pl瞬X8>G9ƣCK6" IDATijr XJI0q( ql1΁VhPbaE [ 61 & ; i":@f3D'xPt2qh3d>P$킺((W\Ce* '-cPʀ׌GB EtR d5J W+VDo_ϻ OYI zASAdS]=C/C%F.H+: c8ꎝQep-A&-[쿃ZƸPs Y{{Si0bx?ҧи?yM(lhJ)3"bOЇo,l]}o"P흃WpxNN8> } 7၇ᑇRge{8 BWĥ[[7x[/O ?8ޅpa ^p4OG_ K"ط{6| A Cf}0_o\],XW˨i8<g_w-Bvΐ>'A0툪,mpߡ^fk\RubƁ 0{7(<0[Ҿ[h~stϡ,*vNx6Y73^x^T|1K櫄ghOlLx x0o lƹ;zeMt`+|q6/2w0yެnhĹYǬup Of&R7Ǽ=5eyfg4;b~? ܰ|QklTϥC7u7sIvp[sݝVkG9OT+^r=(g?S_E>w93繶-.5q?2UptpƯcAǵSx}JP+'. άDwņoRT/Y+TۨT<_a"瑯<`/6+uC\SO]2++p߻ fY16^sW9/{hO.r>G^xӣ 3 p4| =g9xӹg戍3Rb)ȯ^|pɒ˗bWgX=XrikCϡ7y}^}=+;yn3|׉}eڿ-}rxg7y-0v |d}GFg ]o<-O.rfRƠc~V7|*}O-ݲӳ/Uw o=IL|O-E+˂ɨΚPos0[7G b?0~a߭([Hn\O9<qa5>9FƄw>{\6͞7yDlpVL{9%۴ۧl gK܃GR_ə?pָNomrr"9;n38ۭ9,yǪ۷S7ҕ;j҄ki^a1OE˿7+G43x?xԡ_9<%8>Jr)Wa/#B^l? onT> yP> 7RŚgֽk} C az$l_s! [9 ^w:H䩈cG ]\95 ͺ?U;yw|#[Ӗm,٧bW7?R#]dv9J8l `)*o׎Kakbl}xIaNmv;@U o<{y=hb' _⎋ !q^9Dl3avUt51ZT/v !j]s,V<)\s 7(VEyov?pɱˬ~ѱ3E$.(v ryY  N8Z]dr}0? *ylq\/1}X8v2lP|>eovG\Fޜ{?(YYut*ĨGǜxwGr3x(oѬ+q%!a&*ƋkOA 1DbGDŽ)*"n!vrnYmQ h N"9=̎w8DBtwȵm"YӅud$wLEm{Cf !SͶ&urc|˨v U,.]7Nɉ=7oq|3PU湽 o5ƚב=5SuI@՘ P#5*o}dNqs6/ v 3-RGL8qie#ǵ%.1&y>4ec*]O6l(6Ä~_Mܘ@7 3!`uqF1'S\p7,툙úmcpYL̻ GUAg;! rP@X;stH #ksn ).=8%w$%ϯ*~-xXR,-¢GdT"|gS21$#%Amc<[04ocKzd`Lq9N?OӸ3Î>:EN衵+%]Ԅu"ܐ3 *^BIUe>Xx|~}Ic9h&PN%v%-P\~cT@_X#/:L[3[:vKs㉠gȳ=z1gpRfԓstćnv-F\0xz5kYLJOXw ^sLH~UQR\L#k##=4:(P?S! /ѳ3zV9Euz*QWTh|goR3j.oë>z O,{9W)?H/4E W~[;W[Ň_,ۜs8Dm*Iw"e3sAUq4TKG}<4XUf©\^F{uz e9T8pyCj1I߹ '7Zpi1t='oL#c <U8x~aUe<P>p~o7"uzpa`Z.? <%ބ݇%M+>)^}4cMpB5}q-ӷdVGV>ҼLo>ݠ)]SOZ}[FtB/Yׄ!SzF-L29=CL\_@`1Kd ErBIdHQ#LIy@,d'd*FP %I-"FjX'\As'wYnP&eƫLe,cGF& .mOn5*7>+B=%2(pHDBFDFUB I*㐑̔H@V%II1#GȡƫD@L8IR Gt)Rѹ}Wd !JhI"(yJ`*Qc@#xP֞Ib6t1 F%ѫI٘$)qSV`&'E$D"0(S!dg1G0J RIt&K0)aR)@'mI'@#)@bEΈ 1JftHLbϨY,רH(p";ET@*HT- cBǧOYh.DhDϔ#=3RTjar8!Ș0FV rH@RN!$*[+Q cM΂) jQ:V)=y 1(ȝ Y"s. zG Qb)3Z$ 2!DN%RI2!*HSTeX12"ƀ4uȾPГ@EM%*L29R*kԄZ!EKb(ź%AaiR؄Q#4t D'!K(?nP0ԒzTђbI3YQ'Ee" /]?C(i,"wc(Xi2g&O#A'Thb a4 TbBdO %"J-$n8}៥@V$l/_kePճNl@B9GoB*X黼ǟa4"T[ Ay8Mo^(|w/a~w Cw b ~N|.;ŋrIz mxGuϖ0diD79<|~f)ܓ_-g oeKV#opxo _- LoӷqE>EiSH}V|Lj"eԟDK6d2)drhԀM2kf<5- \"3=&NP3z{m+\ӚQYyN++c` D.ey,FzEzD&?I?D猐Be]s{'i2F!]B4TB0g'bdŒB#)wjq _  +lj'FJFjӐMC/%̎,"s9ԂO C^U+DC#rL5-SEGT;iA,R#-=3Lʐ=JTZ`Z$ҵCX+Ä ~E+NlPU`1Ȍ3=#6 IDATUgHWC!U!EXOaFثrpmfo`?! q>+5Fb.L~@$-~N"cĘl,F.Jˆi"#4tqdBդh]@LQ:b-ڊF7A%[8D; HS7h*b砋ThCej`>D $R(L]Ac0xr5,¥N| jto%+k`Bd ү:Y%%PrbJ1P;59,mZaϐc ׸Le#2$DA2hGtG~0LvX 8YLأ+ ψ| atE]kRL8S([W'"MUcC`Ld$!&K&F"=qr'! Jsg4 9@3(vPx"oYn=ۣ5b`Ĺ MԘ"Pm܆(v4&ГvH2-lۚ0qϑd Y&-FYȱgHa5P!#=!B6&ԱEԤ`I}S80iF4mG6㈚\ e#rHdKhZdȘ 2Di ???Z3dzzV~j0 bm? CX%wb r0^< L;>ǞCs ]8XTW^_{.ȹ,n. *;*:fi"$s*͏j /8 ? >#rV5+oȬan@}kw`u>58Qxfr䡀X>{ŗFV?wV{F!\RS㾃Ƚ{ `#>, .Q~qhu [6.|{o˄nR:%8EC- <"+%fv0:MBUM$Q 2G+05M)«1 &3Q(S1+%+i*F!q9!A'QKTUaCBˌ3C"Yf!و:Xȃ 1dƒBT i$&i@!]DnrBD҃M(![>Xkܼ%7{L_bhH]+dT.$"9#d@k͌HTD]Qɮ8UB(V"FFAT;T1T$*IdCawd!RSKM2H4$$%u[C8SM,SEapfD LH"ŘFBDdTNp"@4Tᒦ3R$e$p1L,V"v`Gf֠XXA+Ґ#T´SK8U1dVHyɉRH Z#t"ljdC63DhReJB-Htcb UẗѲ-T# r垛He6LFj .s @m$F ( LE,#B 4  CI"!1TA£QpWD 3K88aɽL[gUx #ʕ{5Vd1T11,M*J|x#YR&iM& j`6*KD"i3(RTIr]sy֐ hK+sV.JvNrf{3d$*M F0I5.9mHFBc`Jj$՚ML%UD6;r=sB6l@=>k5d;BqT1c'h$F"r&>{IvLyOe2 бC{)%,O5 9CU[7kb1PY=or*MX2AwoZXSOeeK0~PUYdBN_exٻ~_]? cD\wބtrwWcί+|7чy*v~UsAeA߇Y o?~N[b_| v'A-=%NGFmк p!bo  M>'.Ҍ,nzQ}f OJQxV?ڧ ?7+` UƐHo B l@6eMPR"Ԝ\glq`nk0q@l'*/fld](58:9|q7z1hzL#Iy L"%^ ۑ% O]9sl=1̐U`["9"9g" *kP̶ 6|boAuEE z¶ZhvBёpifcBcv^g A2M &cy lQ_{D25R ;aKK X-ho [õj˺|KvG(V`L2+8s:*#p4ɗ[A\f{γ b=5+Ǯ5c=*V:b<8`X젭3YDX$~; 1uq=^8jG*Ɗz`%Zi쁦 šA厰,aR#"qiB YD %:2NfT ~nZiF >G5G aqq`T2P.c褣R#E^N$'P&u=$}#%, NH]bF AqcV\#Gzl ݎ@lZT8Ԑ)ipԇ+Deq,t{C\4eb#zVW!jh=Da]\~yA#.:66ĂQ2.ip.aoDW/9cs9l8ILpl?y5,ć<1rW?nheguNa;86d?:}%U#%*(&;qOJJN01"r@'tMj9x?zBN ‴!n2j㨆mirԒXqB4@,&^f5r8bIGun|E,\,3W$R]}KvٺyoGgg' ЗUOð-󓏔 E]ht_|ס}4\| m <,u +?Y꯽^o&\^8Vh/ 7߁'/ \ KӰhAɲ)ܗKV?.{o 7mP+s~830ٺH?q8_I` ܯ2 h=7p ȵk`lوm>k衽 n ͧaFi*(mY(Y HOxS#+*;Հ225@"\B;E8xHeuS*T"?ӊwfxcrY8%l ^RA<@x!'w}Eb%i>0{Ety@k״5~|c׏7o65P'?> f(328}dbё^$~NB!tOS?9-U޹0Mԡws*7GDH7`4@A\x\$wZ:Qz$ j l If $W}tX aM7:T Z$HA-#.qE#Dp^Ή0,JB?I` cB^A$Zѐ H r{ AA8a?Zc3qgaTk2-v9 l>&qoH_*(2[;ďK% OMOW+c(/}OCsU/oɷ/jt+1QtZQi ǁx-0$a&AZFfK 2qx%pg5ẒVT #H*D5rw^!=^\`&]JG?G>g o֤{2,EF]fֈg\GmLW./ef5V ǠWxW}Tr$<'N4agI,G^44.sanDh A[Z>jDǙVӾ2$l@^Qz"tLc4!y@&b_ILVR+din{ +ҕ |Fb_QWT='H3y+F=5kV/(ՌӜꃞi3Eo>kꅌ qF@jkT=2q-^/vL xd_jڻ&Dlvjϸlz%!6`܀ɰ ɘjDɈ1}U\G QjO:x3˶ $+9^ w$BVEbziDtIN 2+DwoO KsKeq_+7U܁-YdOa7^,^~<)rgJb; DٮrȿrgӒ,u5xO![(,ܺ < |E?? /><_˷%Onq v%jgq}%w~r=bDĿG%&mX(5Y63êD}N~6ra\lDz/[`ER>zhh^/SA$j/'QU5-1OȔCr_d:: $IfZYlڣI*c뀖K"U{$7^"m"v dD1Hq)4.%Voٱ=)+L1ae{[#uj$4cճ; u$v=JtFu$kdhh4 ǘ (QD&:IFq"}uJVѡRjȄ7f6$4aJ*`R Y/:0œ@ h6GD"*P5b҈0ufx)Vmaħ+PC%1ސv{tPBN`ZEB`FAFv!sMqB")g{HVa",@{*񣦛at`DܩHDmhG'gz,wfPab!#ԁw%y)i0ўG(ْ1v>b6POYAԒieQ* 9I$J tb,ޒE9,彼K5"#Jvmڰ;N:GNu8rML x_nQ̆+D_R ~w,>"fm-|!ѵ)\@(O"y'qr$NFI.NGzgݜzph1Q4G`X;26Xf)1^*^e#mN>K x!n" %0@v[ 3!0TПof&qLv{ tαI GI Syv;n#2xgj3uؘ_j DŽJ`+H8`-9=&<\HR+tH%%U|{ ' 0964/Mˮ/f-iXO_w@S./pwL_8\ ^\c/ ouǟo@Y?.F,S]OO way [x*S/_+2BslxП>~[6zboeSt|^(2f7`q { ꅲ17ː&'ѫ}\g^`2n 0EO'_IՆVΝ|݂㩥?Wkv!WCnFfy#7>C+kA zyɰABKvkŃ-.9su1Rs @Kn[S 'AD8ڮ@˚mZr,fd3DÑcjhlA=ȡd>gũJDo#q0,<'fpP J23#;_rK+ܲ>8lS2 3i%٫"v\ Ŗj,+BR<ǀ3p|(!߭:}3 HZO5eV'V3]8!H6N0[lwLyd+|N=ݣ;g{bRLL\5-//9;[3фRKTgnَ5C%sFsfÜ$+1햴G3W4e47#ēO̲u6 G|]^2M=y;-ɎN:^it? Iа b>}gŇVLJ,ոgNI.cb[v#jIcz;" 7l2̲b[s6pX+V4cN\2r[1p?tQd'Fqq_u^T&*Vk.x`+.0R3NM0 ьqW8AFaoxB/b;$iCuC|hkHvBnj䊘=POXYO]%%m# G9י v:%Z\ݱ]`Ơ[th(*h6bɘDWO=.;Jq-lάfiJRx̌,REJ|)-cm#[OI=G0o7?2g A` }>`;p*ƌ~߄LW xFB;8]=?~ߐ~r.Co5x  = /^1Xu%Ƿ`ͧ@KcmK_?=R-}Ypz 9֠ڥp58 l}? 8~CAv`!?U(?\G">|nU cXI{;fs"7L)rZ!dqH0 $&u2ɮ}hӌZF'x<>Q1TcN3.Vֆ#݃b* !NKi %-,l<&\+NId{wqDULr-\/<ۖʼnƝ<ܐVf_Ɔ놬"[*G~S[27:zx>ʈyn˃q`yn)[rEKzj,W(0DsW5 8߰x%~"{;>$G>p5fr^򹔈27暷K^0r83:jX<#Sqón\u&JnDɧFk}d3:rgl)~d&5_a\(*x<3>l'%v׏<9+I=͸-xZyjQtÃ9WڢT%x&x&Jrs$)^ ?1oƟ#j֌me;= \=zYLg=|ؿL֣-l~TA\)Э ט-s`K\f%Wz'vleVqHP'ˇՈröKV傧9 |x˵ wS/ͱfi [?THG/Q/1S-4<(,H !]f}g= K.]@9x$;,D$ y.a%g\xjYtqˬm򗮌U7gS],{WwU+fP=$JhR1eo=f+@6="inc@Zp~!ÏSU5un6µ)95nSK_ٟ|?dːuG{j1b=.{x9G`NLo0YxK;oO~sJ{t1I=''{ e,b]8ćX,+oS 7_?ܿ ^ .N^g ckw L/_ =x? o} _+@߂מ4*۷`=uxA2C18}<e`99C8l|k_a͝Bo 2!(>^44E/ dρ3X"3;R>_pGCBz:wJw&O:x=F1M_2FnM|Ά Plc*@ GKzMWOa00y&]FvKsClgl}|J/6ɫ/tE i!N6^uQ u)l4_>@&K GSh(TJњn>hg+cZƊ5y2$=e{g,+85A5;tKⶤK1urk;39#{u(GzƸ[sc5/ټpvٹ~O{cYjYjQ]Pͫt][Ƙ~kIkl-Z[r,WyABenݷӇ~\<էVCъo4&.pDO 2![zh6ooxJ8 !mI1zS #÷]]2VQ#15~|v\[p.37ND:;WwC>yZD/ay6rtIn礝 -9}]ɾ(N6A9I Il@j&k{rN;TgL M90s~:60RI`GsQ7&]=~bvp-H/B+(s7Ih6QYbfGKgIjhPF KxD(84s333''~b%-%4\!d[\+oGGB8c:٥?Y3l@͎ՌX֛oq?B1|ӿΏ_m'}~6[;ܻZvv< w{~šu~/Eػ,{7~:E_^ OÝuø?1B=u ^z_?|]}_!oAyL^Xopp /÷ g{V!tpƹԵat(;?>Mɯ~W`x߁`ut4- g/ %wxn`J9%lwޠrܨ&ξb{p+[UvaІ $&|emȨU,BAKɻF;0jR;81ܗc>̧(̇1|3'3D{#f&;fcG$_3Yn=Yi Q!;>c3Ehgd4eD)*bX(y r"34c"w=u@W eyЇN$f񈱐d@f"FQC':޳{'G{QILԬAGȊeV0L6/=07c.+5F7) OʮɓGy%*bM;ˡhX?a(-ݦcQuz_/}LՔҢZ)f+!-Hz~Hx&SK'Z]+S\"D#b!3C|Aԉ,B6kp}Fȱgd,eJ>˻3Nږ*9iN$,# b+{t4䇒2@2|1hȆIZDH5bcD%݅ ǁ|~uD{~gfFJd ~'Iv3SϩqS7\I䫑CϭE $It,V:A&"Ix V*DVv5F.譡u!s!B7 fˆn8 ,,R'kr>l {zByV|̖{gFL$LM w:K fvS;ӆSYWlUsqyg9юq^S͚ߚ j9+HSte>6\8+h֊;~^( QlLY# M\{xFEP[V#V_1nt5Y@kCG\ng|_ y1+f5W&yX%F֬).QYb@ d'hCOu0\ǁl٤&&:/MDDGF7Pu=sxfbHy]PƝ-=/?臨ce+e=YQ-xz#cko OFԓg@`f/ _RCycXA Y (&èC"+` xnv {܁_ c}/#o<lc߇$9|yhУh |+)FNlљ# qiS)S[&J( D\G1yeW`RHt?^ H"53dq080uv Cb1gΖ 4_Tb'?'Ó>I=?M /<x+5s

p~ះK~oܠ7 &[4<"^_lp տ +9xaM]@G,LpL×= tV8f7y ܠUHXw0yWϳ>GoT?oß-/G |T"'&^hvQ]MzjS";KM^ K6$QSdĺD5aGD ^B+0-c DIBH谮ck huz:P+ d&1mOV+cZjS.!C9VsAׄ Bgl+Gfz–N> d3ҢvtXw@!!UEN#6v5aKPg=ͱUbr!aLxb61S⑦=qBPT*7(P^tM-/)B 5+H)*툍+XUUȆIxiP & LG,")U ]&b+Y-0煙#Bc'_i.4eCi%f:kq.4Ct 2 ILۜIܔBh>AyJz^ђo 02BT:{?]rK^4]BT eiLC]' jW!y_0;m%iGh5ul$)cްb`-ڳ{VJMsYJZ~DtMp+f%-s#\Vp"ߐ4QVh 63%ٖ75D,u5"2*<94U(W\e-YR%WMF׎tH?f7$[iT#Rfl5UHSI;R2dsYUPD;4­(+$dkHVP횽J#m9]+6S4MLW&A-[F‘IJY'O_j7dQ bO .&fE5;'AA="HB0bRANPDHQK Xa[\0LC$ ;QEBT̼ 66 kcǂqM TPv|`%UҜ(@āҰZUog+l|/]F˷Q=ΔΡKl֨|MHECn Ӟn1iw"eH%okY.)ȝDGd\ +*;4Et6!r?ƅmAg͒|בM̈́1k‘uNy&Yv'u҃^w {rXGd=!v 1'dp%t'¢ (a{30j3DGPj^"Mޤ=!t-ܶcQ_L4891]&=N!n #C12qttz!Y2'A,2õ|Cfkڡmq"'3t.д +s7Kږ!.D⥗4o))WOOz'cX08 Q{?B M0 R>'!{RnM;ͽ8!|Yn:9؉kѰ`vl0q. #XR@aHs`֜; c=&Uкi[!ͅH^}{9=ðoyq<p,÷0TsF]Pnհo ?>g @C}rQ)"5>\TJW4y`cbBDs>HߐDHZi԰E+m iL%5EHDn, QQadklG]荣P#.u=UY Q洱(F6nC:*F6 +AGQ=M>' bHbeVԲK-߀!#z959Md"Um=rEfyƜw[E6C0U 5nh9YJ՘eQe@jO1^FFt1Ө0'["52mBDyؚ!߀!Ro2*q 4dyDC#M(ޠl5v hbghhV{ c2s_2. 6}Å^P;A+-' z4N0YnVI0R;Qvk4HsvBפڑ+C# 1T!Ba"B)1]T,e%>zfü\5s'SuW\2VrLB{sy awq[3Sh Jbƻ1TyݕJoe$J*ekj%6ZJ_c|DzATTaz.pBel*'v->I=?8*H ܶu:!#ĕ п@y_w7|wG >~K O;?W> ӭa,,C~`~心/}]^{ ~3Q߅v@x D_^e[-xiƗ!>,ΐD.̮߆aM`{6s>{v4CwtF?|.h%!(48e!sqLsO JoyLk@Z*)!86#,ҩV{(ɖV=)23&[$iq"bz/8K#LⅥ >I%$%I&Ҵ-18G` ]"V;Li{Ik4sE\ȣ@È$QC(Akd4GFPIzKJ *B*r9bLG=ݤ`_^yĄ&A,X@%TdS " SBMKOC1$H!B xӈF iODKwg"C/}+ID!u Î *Щty[RN'T ޣ e!DYl )d]L̜zbtM; U˴$#dQPZIHe;(%ZӪ6@E:J|LڀX+hO-MW;k%^Id<3LwXw&®ȺY 6JЏNo-)Bkzi%\"CE-&B,CICVʤu&y*zU}KL[`P2S'(Rm+zܕF"$FA+< jɅ?FJpZav@qd K$ XCl)Zȵ.c0c[b:'i$dMe#J/2c"4%fbe;3PӞ@IT(Eݶ-v@ѝiI I_ p#7#tx5KE(g>{qϹX'Lܝ{WZU}ߧ(HZ$ڣ&U,VP R=E5D>0 jOH6ȪIQFD&LWR[fciϰtW`cS<)LԆPEc[ƍ6_uDnvjE=La+iêQ MM HAEwvGajDr)d ; [4l\glT}M%"z 1ೠWh}O(R CH%Ȃ ̐CvI2zL@0(fPyEdPׂ ݨq~H\}67>xZQ=[C3Ћ}ށ=X CuN]ؾ?y|L:}C8|fwA>˰>o߂0~\,qqpy|ǟ(z z>կ槮'>6o۷k_1?(kr߆)/L,\Z0< {޼ zph?BcCH?xWF0awܿ:B?329נ02Y.}wGJn g?y82;E>76'mB$7MlK߆9A!36#20i\ȇ-EfL*?ĤYh4Ui$`7` i48L Y1l=Yؘ0Y65|̰؜ !(Y  n[]|9-3_ƻ\M &J3;A0=HU$5zQV"@Sdjޚp6>3G8,dmg 24lk jhJf#PYb*Fb5ېYP:P9Om40fݨwzFQ CyaV(۬Pp+aZy"^kLL_q*)4kl'fm3+#*dzGe ȪuX^PUlFn9--PiՂeٓI AnXĦ%I4P`(v2k5^{v:YlPu#ȣzT?_bu! iyLfē? ~ 'e:y . |ހFp?X[o۟u} >0]M7h8</[ |f㟄_᱗>u6|37.~-^7fwpq)V?JXyoxq5SxUX_ n64(C4iAXvt*q@gG  _RENݾ%}=AQՏ]mawfOznopn G x?<|=8ܺ ǟ'f' s綂K-'_','O:Ym ~ 7}c~õ~8y ~^W-8iX~̮hk׿6N>oͷfm#`)Tq)[Y/|!/B*U*&3X F@#9}`8.A͝QuG&O0B_0yv_N@JQZTi dGP ^*ɠj|;ŽI @#9G Vb6IESy?dAFG%{dJlD,&jsA2Z$G#1 :!J}_,YkT0m`{EFHDI@'tȍn Bi!"7XD/ŔU mٺ"A)ESi٘ qH$I2!&eZ:V9z^RD. VXI("Vxeȕ6={B f'2puLe`23&M hO(%wLT) 1=c,G\E1W 5z J 8q' Eԑ@Iz]B*Q-:%HkM$f O*]FSXPKEa VD5k4#M{GEo$I(B=FgT!45:"z۠BBQR .#g&Fc*0AH x1ʪTֈ١V9^=NDbגB@͖TT4(l0`54@҈xGI0PF6l@ vJ @U"F 4  b`p@+R#p6!"DD4z@L:HU8t'v y0,3΄1:VkJI(pF6 0g>s+)쫀X־Ld*I`R؂*DM*d2soQJ=0B"p2dA@c ybKY4 @=61{p _K3t`=xg u?+Λ.e2޿N.=yVgpKpŷ><} SNweP{1*7+/}P/f3hw0} >=JĦ|_vϾ#89xeP ې.&bwK<X}~v/)v4Op"%hѤ!&\(zCè5 BL= !Sa5J%L#A I3)Ɠ}&oRMH(CONh- )L (H%Dhq9KJ ގG:w2haUUFREUQ%Bh rlpW̡ז y("]#QSbB!b"w ]d;l!ѾBGRP8҃qdRdF $1iiEX*q9I!0+ xJ=LVbJH$1+)̹#L+%C-B 1ڑĬ2_XT*)%SJ;:JDTP[D-*};()L 5&󘀜AE!:R2V+ԣh9AWSPzQ Dz(')sC0r*+DPJkYR`@"@DPdJP!СPTjV.0cGoSў, BH3%#ks(P h`ZMPL #D)4$*r A4p> BJTPK)2,BbLBHJ %)Ed0(T䪠 y}SHd,jP %Bz%L3*dةv'ɲu F]AۂT! ERHcB oBK2Xzrhɐr8B`]ABB>:_&ч O8'1L_͹3?<+`6z0ʎVJdgODuz.OGWG) ~߁ނ+pqڗFg1'YW4߸ ܛo?{¯<yF^H?\=x*|Mxi%8plՃ1kyT5_w pVӏ9u9\7J`xs6WdM ПrWt+0G9U:qABF ֟o3$cƢ1aEv`뚪8).8v rʆhMCPvlDn@A,j#%1@ʚXn7`tgʬ\" Bf =ua0fzjURѧ@j[TJ4$)A dL. IDATb;4b{\Ԍ 4Vc=lb(C);&¦_1h'cFM(R3Z/°bg9BLϐ}_MƠ[M5NXT DQJNc%B+R$Ȃ$F4`"W o*B% RXeMFWfL6 u&zlPY2$e#A w7ap"u*P\Ƌ\)$kMR 2E.J Z,PeLS!L[Ѐ": TQ1u" GAt=TLb8zpBTC%"ѕ hGXK ġCH 9k tzv_" hnddYKSi"c+OtsJz,R*f4B- ёF-FpۀҒr@US{B"%p-xK(&LR51&J mHjrDԔy\\i!H]iyCvm$Bie sؗeuq]. Ih Y օD`ʀFX=+YDqA&Z@ bm(MO;SH(g:DuxQd$OaDKIV2UN$PU& D)覅yCQJ!d"$ cC5N( mp;;C$IP5V`+ hb1N%cP%*$UeOlը2د299#+EvD0F9r"ʏ Q=t-7`8/Tf\oeO1|]r ye>t/{m[3q";^4*fcNMsr˵6].Dvq-=WcÁo&I:dD$'dBaQIP;L`Х`)z":'&Rq83gLՀTy˴ H0OuFwe%Ibf E/F7NOtFMyZJ|;|+㮂ZjJH@aOHP(؊0XDZ(LņA ƒ$X lMAttr3do<u\fO^l%w=!XfI],{ڜi-#ٕ2ʐTš<){%;\S˪AH2TjvKF22)O)W8e88K[Yp&cL zv~vLSIxBDB vYyPL*Xԙ1YN &(.eUmd%GF8hD'b•L 8q 9ِ|g`O@#CVD=[-Py27wc`ٺ?pBfL"6WL6 QBYxJ5RZ78,92 ! (?Y|TQ].tLo]PG@3.cPyr3Jַ~\zz8 !@^hOg <)xwGGL:2..߁O# (ڮᆇg^ƌr7B#oO 8`{_?m0 ^s|]xQ?%hF~^7*ث}7Jw@ P?960qJea͑\!Q4P>)bl9?=䤔 H <r`m3:BYnǶZqLq /`b2G}o4r@9ӢL6o(1 ! - b! nj"P ߐ/ z7 %8<$͘ܓHB*Sێ&$vB%u\):n\4t\ZC' c,7ĒXi&2R R&x=s#*7F`3/d+M*3;~TS$ `w HkZE&;E# JH%ZE]MmF5> pI{L3#DV싞lNL:w<裖ǍD3b"jJ$\H9n m*C[f>@I$3P +)ŐRcؐUoB'@/4*NbEf/ 4)QKK(S!둪 IA(aI⅂(ZatE=q,S(lsJH)Y73Պ'!7:TT!XV%R'I $p(3XL4ʸ8˒]1btdHTdQBqPF-ZDT6F{ϹܞP7[, "D,H3^0Tʁ RV t !VD!A4[ B4.J- Ї#iUb9"Rb,}6,KM-Za;!rFLSP(*$oRt`)3iZQIB!"$T`@Mp1BIYhze!&i;;E>jpuc< bk$i,%P$-&i_w+ֲ<Î'VN]]]'tOO8CѤF-ʴD(U`/hda$!ь8t](8"Tpq}qN{ַVw/&gfw~gWةJJ:ޓB8J=pNh#<,%D!jiVHLj. 8-sZ[3R0oA 1" ɼ$Q@%$tܠ 7V£`^CkLwE(ī 4xzBU 1]nT[XR>1x\?jۤpMQxݸ|Mmp!ݮ ]uIkOi j'tW\!}}x}xHS8 W];y>xv7'^_ :l<]xp&?q52|u) G/᭛ŧ|B\֧߇ouRC4:HOFvqBFC3P_,vy;DLj G>"-$??vn}W$p'L"K[Ȣ$` NqM nq'M4|r*ch']{80uԞqٖ+CeKx55uRc!e:>yFX$3͌8]p9S+ҦUFaj-$J}K.<۶aY!~:e%mѪ% 2:J[ѷO!#h d>j>C5PƮealo`-sXh& I ؠd6EztpɔÙQENZ:tNȴ!k؅%1شB iч"h0"Lк"$I sOI MaIP 96^q.M'W~5=a@]c '!ML W[:1`DX2)n3f H7͏~MnRۭ؍2@{C[f%XF,%7xAeTy:PNZD'@ jV@tCu@/;78=V m˨d K NAGGeDm*fZR:2H*zR",LJ), ݀>%*]JM݂  q=bF&6T\hnAg;B9*䑇vePh 30: >#xΝ|t~CxMS/uM(!|—P~;p X<Hp]F(`|[`t nB:5ssڃ;O\ &D}zֺ,< y7S݂TTǪDG: d= kv N!D'rH1^'G1쮋pxt+ /(|#OW0Mzz2l 3؄L zcuDԈ"*%2ZEj2@<>)E ]`/Kv5#\@7[풺 H&=t#"v {֞4J\Itd$g%/,;EK!16 UO=LatoH'iJhݚdoNA4qrQ SeTU?ܸH4gsL{y&Q}q+}G2#ւb$2cGW*d1PE& A@7g!a.lꙒ}5FU=FÇ$Q|b ᜺iOYϢjipoaf MP1A|aiҙ%VLU䈑dG ,2EՃ7+N*$p]s{rٻO+IFmJOLH*G FKj@Q>yI"ei$Rlj5˧_<3.qn9I%HiDldHKYSvjwo?vNX`bt|$dIB g8r|>Lv4pBbfB0Y;(>HZpv)G7)j>_aDԛM5' HhZBJaQ Q ZA|W=*CkcT?e*o&< )HV*09ܐtYs^z^e |%-"OX?6B'U4qE9dYK2:v>$JE½QK2=S4㘸?%o툏Q^]_⹗~pUw>o\{>7Ȧ%zZR0-uQQO+J 2`- 2K(r M\#eMPqBlNbe S)0]-hCK]I|ψ Fl%VZDhI}@тf=UZw< IZ%m Ta824!HPYnm2YUF 4!R?+Tܸz\?FnMJotͬ}"p!9 w M?Vg_?ܺݱ qnѭtOw+N_pnvɮ׃ή:BJعܭ=%-xae?*1]DŽ| = ?n{]Ba~ t0f֭Y d:!C'Э[(cfkف:sѽQvh<7QXfꏴc:<D=ЕJ`BFRkGTGIE"- 4e N%bEYM5b2/!JV,&-Y1xBBEC1Bq$Dʠz $BUi6&6)Cq옗/؉G8h3譎X;8ؙZvfðf]VhD3`y۷|\h-Uf Y۲av).jXC*՜zGΌ jbDNv&pmӋ,h>V b1i{0&7o}h)Dgn8"F)M&Xੴ`}zO* 9O[LZ=dQJy~I~l\g$YpBxOo|jdj k]t%cWHkTq8vYx ,1 'E"LP2ֲmj{\`D"%3 KX cDiI&}Dh(,K B<01Us.֙lS7.qxM|PPOx*:$$M8wRJ(Bg%Zjn:#q%KIX%7S{{g$<ʼnqɆNN?u T7ޞrÆڊiu2Z5$Q4C+*gw/<2~Fqxfd5Z=Fg>Ó^>û_{_睏ަ 'Ħ[K t,W#vB iʢd` 2ba|Mc,e$B0os_D ZOe,#OX5Ȗ2̂"{1 ADXKj,+ӂ~d)&"l(zвAi!?6f׹}Ο |\p}[ #oXSy[3'Tq'ĎOep5 ? [``&ܙ&'uǡ /v)|c|Η;`e=X\ɥmyNoYk]? _y`+8jw>A+CpNN@!Nh_~_k0o@苝6F, 4؇ ǝ/ЂAv{=`:H ?x( zw _+ mRE -h ^ D 2VxhPAH=KI=v")EIG,E *<X5%+G9%-DfDlwfq4*A%A"E쀄)2TGkBv~C_c䘧O0Y$չT3"Z;x J*KV߫d-J@ӄ 7*f{M -=eD.8e%b6E5t ;Zf\݂~9;-N9H\p ʆ}j!ĚĈ[mH:^ 5$y<0EˁÌqvm%,[BrLz,ufɚa, zD_I.(BmXZ%z,=Hz(QDpc/%zWV=p1ق՘Q%"mcj,ҡ92d#[][XX<Ѯrkw=y7e[JzQ}bcH~W R3=xAB6E H, K n=RF*09Vr,?sS 1gE5+ Og|`8:@>c? >7nV5;k#SX^qN"?|_ëOV.A XY3gaex7U㟆]Xkp& u^w"tq< , 7!i`\p;McS]aЏ،cYӛ1,iE]U_Vk88KQLsuƓOV-B=3f1^D!/=Uc9DrI8`!xOFXa_O ߓC`hSr4R)(C5sT#M(Icl;&rSt skz@k@`_#f{da Td${-nM)Xaa֫hA_1LfaEl٫ v|K.9*!uB$W͐`:\Mn{7?h=&wz0W5R|LN0Iam0h&QX Js 9B }DU3Fac)c$9.iB"qNn[.&!vI-im\+0".`= yؤEs0ćU\?b|i-4ڲ6<rpm9BĴB(KnH hLXƒx*$D X0:0+3zcmDBlHx*$o֯1bp扗DS>' .=[-9bF>;my$JP 9&Z\"gZlp"݃0&ć} sXCV7 80`ю )6%IqO ScH>8Gqq;WMKd,A:Z,RL03 Ph(DΑ:%00X o Q40<\?_ԏՔg,1c]Ox~k=>qGDq&]S &#.ceM/,@I`ٯy; AWNW8~3I)Rђ\V4C"*EH%<^&FQ g:Acq 4QJ ʓ%s,"dq=l\ôp_w.K >rԥӝ^DyrÑo{ ?p]x.*<.WDk(;|p$he ׿^[[$G Q0^u9&ۛ_/O_~;Eg=^| aJܽ [a=w ]3#_ՇW}:fb티h `,D9|sV>;_0nޭx@uрtDdJ?T''c}\Ă 0,*xQXL#k]-xޕ9Q@Oབྷkn>-~ҿ\]N:9OXoR!u0,97 XOnMx 1\ NRs=u[J\{l ߁z O0.E`X$YG٠._D 1{8$ @U'AaU\yL9~bf^3yx٭C['{d'h}Ey#\LT,ѐ D*|g4;ᡟ0=7ǜUEmdg=B>.b"!+Iא4.ҽGmoM->~8] w C䙭͈*U5}9sa>2 O]0Zm5qDd`hŭ9-ELXHOfZQmJCMM3 )!D~` o`T $ E9x~ -|M2!+o>~~]^g>ٛ}߽>ͽY.D]Igp$"=ڠwT;vc]NpEݨxZ:HX)u`uxQCF hQгP;2Q")zm4T"8 s@qp/"|bMMSZ/fTfbŸF盧z\?v{7OS w:{k@¯C΀7`n> Ag\>; /5C>l=L~t6cm82|fG ,*xB@^]uF't"v `"A`z&~sj6ar֛­ѝ?R_@v!b]S`?z2luznN{_2ubg|=Dm͊4l |Y#1##}Aֶb%Y ]*sCJHJp_*|83lÎm!"à 9䔩Q涒|O%u-Z04=ɔ^(RxPrMK'-Kaaf<9SlaYoO~+|@r.EoG+-dYtawqiy.˼.?-^wXhͶ|>"R}r 2<pז |ֳ\<.VW{lP< QN<,/GS^s}=^ /pW_Rr=N1ϓs5 RNP& | OW^y6#;z1an7iubgPB"H52{Hʓ!$mCDcA ihhEEdo3ڿxq)~Ulㅨŕ-v(.*~ϼuhVKu|P1پCuTΊI][}$c!&Շx5~ݞd>8! Pۧt(LMBv}u4%uX㒞#KkK_4vA--D,in9lZɛMj?`p8?1 $7PO!-{ O.ib7ЦA>\I-g^|cC-pMFQ$$+g̋YGY=( Yh􉅦q-C7)* bo,NPwR'<ɗa|a$_"^^?^[]'|cP y EXu;]Ө͔9c*ST* 1+f& jA@ d0O(ief+[F2gPYozsH"1Y®/0M$X].Ph(+AĖl$QFh@zE {՟fÊ#́ ×= vMlv7 ـlEؾfSok?4|! W׺vuz Ts_هAڱ1m{ t|Э{>r>hU9\Yؼ -la1+zk+ؽ K*p\߆{?x#я`c*wg3sgaVQؾޅnļ43-V?!})=|zG:emAٻ ŝwtKmGu`wߗYG eKٿ\ DJM%'[˃6uCtI-TgAZ&!“Ɇ%A (hn=!# Ռ_kQ0K )Q3r5 _beRz"ZqAHI-8'@~chZ!*C)\M!㘴A]_ R^& = -~@]f5 M_`u}ItC˜:M  TOZ{EMp OD\B0=e2=8 N82:zc{`+JObBE U. )>3=~ Yn %rYy.Bt8hF” UgYNGŠk1-[=S>ړ}#fh3…G'IH£~ 'Pr 39|'R~K rmvsB4r >x,V1̠{F- ހw&h4I3T߷ ыgyf9qE ~ϲ3\yG5ll)Eaܜ],G1GbJnFx ]1=rG'ptՎ mt/gĢ$QmqC,1K-"p h ._3\:=5Wp~xӟl~%Egy nfJz|y\(L)ipgb5JYM _sPVZ9AZtn $>t.cPAPŊ=dxdd)Gyd8)`j !,68Jf1}K^nww69)Ŗh:H BI8 zCp FQ !E҈dQ\3;۝Vr퟇"m!PdEtPuꜮdlb2[Jf( $r;,i%"Oz:}#ɧ`)GBgaV`m^- Wah?G0:]ː{=) rB .Ri[Z!C >,$I68C VG\`H:ނ ,~P2.֝BC8܂XV Bf IDAT;a.Xȟiy`@DNQs6{@`B YZ ^AD BiC4*Z +Q] ?.'qj,y U>mHllrW4"gfNЉR=&L#2E/{,&ttejV,\4´4C5H$S$4g%]4B 6BLɅ m줄T:Gh3")'Z$8BEVѤydUY%&%d,]Uj+>K8v >ɜCmXl)TP&lX/.ŎznEG6^#^^wcS#vc c$gyL+KY"07Y4?ѳ/ѼR a BFԏMSM[^(MLtU U4H^ ɽDh!C0%$Uא /!2 Q%C& PsHUXYp2qD2XUPe-^Cm/ȷZ #hTPKȓ2B*ZGBvs*d_Htơl9Op:ALh1bVS!d9ՉLC)UY4BS=)E]j@bԝa)r*yFu5 *.>qj'>P(93cvicYc܋#܏i]JS,pbo4&3FN%$,hyy dVWĔ#N=!,bӤd b׈J:i,֙ŒuDG IQQ  }dJw 4>HJ}IRg(Ռa;!\FR>RQK5F ש;)2uiub֟KֹYgY[}1켴˶f}e7 L梞E B iI:h&';j2QcD1rb"&bFc5VmM4T%Sdry0JDmf8u*5'vt `@SZ#/eg+hBAM6(,&'F:9JH X&FrL:BA<# JTƟxhFHb(HQ5t A,4Xh&`DDIđ^**tRFZ҈IeґSמt9tΟ.»qXڀp5 Bm~ z˰cM<$TpׄcNQZx m/|H:`LaH8_+ٸ(9l*Y8؃ɂ9 '~}H$ >[xJa<<܁skp| sڄ\ 0*Ҽ6^.J!ނ   N iZA!c*0R,q& EX+~`ς( P<i OHЅAL/ + j!ꌳ*y_2e G#ɢcDxT73ns\* 4Y|J9Q5k|BY,xӄ4TRM{>Ď?d_ǘ/s?R{ My>ͦLGE bT%UZ s`쵟'Y> YA#17ɼ&|S!CthaEFcXфFEh:$3BvC>=jvS8x;GTzub.ɪ.jJKbaԔ}:#'&rj]rw\%G&!׉mr*HC>jHbۗ NzL'5ʔCBYY{ 'J-ʊBCcU|1:/xe>=lEO){xMV%?ު{>FKnWtS,}"ni^5TbK*'1WgVgFg &]=N=W{KUɤX;`F,pn1~;DG‹J!jy:xhr!L6 zOjr2.$c8JH@XԾb:%s*Ɯx?ehր<{UzSV93<&<|u_m<`ЕAIА:]ɡp0kuO耍J/k i&no)gc}@yJQ -FYbp&beun9fȌn/rl/2Tjf1F-T$Z+]{l<@,@ 3|\E:֭H]jo`%px18!E ,{ a`-8 8s` v&RT\+&RՀ 67 H[,}^ڀ&tl)H?Q&p܂> \y .v *=%8t? I_*64 fpV `ƅ jHΒR|Pk@ z.!3PA_ȯd*",Z` ؠTk rg!ϱs#3%tu_𫕘CK+f0sf/xGLj>5%ptq?GcJꬥUɘ}EV;Z7x2mCf\H4ʂ;/_r99 w~K~;obƘN ـfhS\jglIo:/Z=ƕK=rx~ai.KR^⵶N&ʢ7|3^'ߘrCVv ĝFNK\_K g M &Il_g Ճe^uA|կ>8#%27}f$92[W:}c.ڗ*C*թξamTj $,H]ZBD; !MH=HCU<%SD{eC?!Pm\F=`ު:;DNE^I\9NZeO$;5UoO92%n{'\\3{ܭ.~ c?ew[<\:|rg%ӐcbqR&b(O>57y.nQ2 eD1рɹzaZf=b&%0j7лDZ]FN>NQ;'6ΣƥM 2GlmPvpAcMV^`wfZ4p3ڹ;A_ør;`9x4*|xRF] l7]1|X9<1 hUgpF^>HhDBӖ'vL !E}:Oq&(wG%pk2Ǜ)Bne1kOBMc4CKLܜXmVn"liF؎MTa-qn9i3֗y/Ye&^%2y%ܤC8)ߨR"teI9)2 A$K$,( FK2psp$\@o#LXxhȡD67v*0 œ&8_bC SVQ")Le*RF sܷHh\땰#|Ƙ0J^ w$rU"n1Hdd'tA$t(RHW+:*(I/ vd &[߯#D8ZjJ,UHPII%'WjL#9HX^_QIo6U>=$!LYJ AYMEDUH-cA[SZM<$Rw+ʺ`͐NR5B(ՙ-쬆ltbcj+>>BXmRn2mj'ɆlᣄyIv wBV1֑:anS~~ VECwk NU$+,@e&Ђ,N j1!3Ήp4F/ *'e&dGD.Z8yg%$I;QXI *h by^ /jc3D.7لXg!^Bv̷!q8ƤITEtE&}3QL }C]F,"UImFzyZ=6>. E*Q7CN)sJ(E`#$ؕ\hYgz1=olOt>;qKAT-≎."D J(@ Ym2}O6䔴K(gvA!͑E(ɓў8Gm9dV!JꤖFhL2IbؾAA2G(+̆a g.a+>ŒU/%OU$C9$4 9nҾvH7'wٹdR*e9I-P;X) -'+h@vύQ:nC(Vd^t{Mf{.|*^&rj% xAqu=I hʒ#KBp{f"=d^>$/Lڕq] Q$̽eXQrj'fDӈi&hP,8$&* 9!kL@)8>o#(g L&wMNLP|{KLT.\-ui5taP,1J>' +0Nn^*u2G}V89yR]p' xn =ݢlO6d}B4)z3vqX߇l.5[ >"& ^[_ynTjڃټ0o\Mn݁^ .IxWDr,/ l67 6m8|7 8W$e!iP)j B?SS 0|DyNI4#;VtVWv|/xBLBC /b X8 32S9EGKamLsyD++ e;š1$Z&T-VΪ%'`_Ͱ(#M#>Ni %%3HrJ[)ESE m& IE&is|=w|Mst!q~yVuS,% aW_٘f0q߈U⑂t/Frb +_O1뛿iY< 3NK{ Ô}&0@MѤ=*% *rOђoz1[Yb4NP$ a1fVcQQʌ!|;^Ց7I6!^}@l:z*_,]r)a,-,,x'''h @ؑEh664})?F#j ""2qϘ&#GhX$LH H>^48<\7wHҜ,mJ> "EʷQY30߄`"U{ni W˘gYv[O8O'Efowxgkkc IDATen#]wKa3/B }  ΓUb({!c]xeFRr~!-FEa0,L-fTBI$Z0UHJO4gXHM\"I?Fr`v>G׎$JHIWg2.CD5#"xacQ0!@a,*1TxGdcs3^&^Aa~(s+ zųhl"ޜl$̱I%1.Y4qcF:bZpS{C9eߗj2 Lx˶1Z^5ej-7H1IQ&-]"ろuKg:RYHߑ!ʗ\A?&U,~EVvk"s R']#>P+ԔC0 2à$|2`~|5O6xutGȂ0T#afSb#ɄfN ˌP2bcJjFa_%zȲKuG!WWRj b2)fY0-U=NVR3l2OC{ 54 ,v%oyv EST>I9?Q y!(X)+cKJC.N+W{IE5fZ7*@ ,hM !M@ӊr@M?]*$Q|mp*PSR 0 CRۧ N/G* 2Ai)kNE(fq{n|$$uHEH?gx??4l؟DBbh[ R 2<1掇$5D*0v3}HW}ƈX %Fc G:SHqa8EnΑ)ThA9etL*> n#t7E_jHj bj%A!TDliUZW:#\h}jvۛ&Xkq32<,ICdb27~>'B{Lfaᐧ 9"ƚD)^BlK.ej=$m43 E$rwH`&tH:vl&"GA!yB%45 q2#X!YCu\"d6JVALPE?d{]` uqOd/@LX! CrIOҼAH$U׀!  3jX!< 4\50CUԙ68s)$M+'%[*5d-&TajMn*DI)1Є( RY/sy{?N뻴l7l=淫<9,NW! Ѐ__%{k֑$K0lM&XUlc{pglzHI#A+ex.CG2bYDh@"t`6Pn,3/T$&\($<2I$Ge!r؂#!AeގIv\AJ|/ʅt ɾbY qpS8x' DK:G̪ _|>}&5/bɂ$8 /GHJ4rHaf81b:ErnzH锌)S #T(*j,j`.VJI[ FJ 1 #Qf>R"p- C8' IlbW#RRGMLĻJӵO.EtѠ@W$1}p XWك|'k Zl+p|g*{0CmL}~._H T}QPb8 %l*XtN\ڛE4-i/|@ągjW 䢐#HsB0Y$Q!i~xD>wʔA CO@\O}"FD Q#$oH33JJOHD4ds\"&>4; e9 '&hU-Ep3$&vU#E0Q <]Ef\&ʸIʘ*cJ>#c)#pE]^ꠂnKl~˵!USPLRՄ,BvHg%#RiBRK$,d0G*ih9Od*((iHa.Jܧ!G" 7E9p3), -dbx ] 9S8[ͨt/xboHTS%tJZ"Bck(BGtFoFW\|QG&'-󤱏{dI+LY QQNm` ̑f" ͢>"sľK#2IJA^& DZ)Xy6f`j>r:#rO`:Ksl&e:ZS9/a8ތZ`<dIa3dT'STT@N|£ڂuK2 =AXS," 2DU$RpeK2\J(p>%<3uQ7{9- n|l!f2ܜ% 83fӍCk#))< /I% )$ gȱ gQҘ,KL!Pp #bF#AţL^|^xHyFy P<: IN U+|d+?wDUD =Q}2BM+B@OQ۔ԏD7P+HQp@QdLer#Fds`d(6Q%9"Y]F P);(y IhDF[D͢J={}tΟxn!]q^,lun݅A*\ /ʳa"2=W# ۂ_~ӟW_׿?[? ]X_W> ߺ^oq0?ݿ Y3uks9M i E4r,0 Y¸D[U0 PDN!ӨXBBj(ǕZ L@)+BX5H%A:@ceKJJPvgrJB #ȈHS !8 % JF("j, 3e4Oq{oS6yMn|>?fHj@(3US6al #E)2t<5f8ûܻIz+PUԉtQj@D1UBYE C1R&%V1Y{͚ ݄$KcL0h6u$ +.A@P<44*5>{l{wRg5YF1Hi)A4C %F[JLҬH"'o?/XRa ٹB[1遤j!tScm#G 2C t%Ojn tlJI^Y!5N8s][pi2@-"7d4)wGLq. &)"PxH\U4YA[dDKtk!ݰ QP4 %TTZ bʜlF3sE)+Alux'W~ o6<+`ԃ_G=8rx,X'NB /mkLx>)}J0ׄոx~ooǿ_OM_z4/p)t:pc%Ou[dI({P<ʲ׽Aq}O!{礤w}`,kUЂru;'}Һ##Y@ zeۋڱ<+`98s%53A3Ә]4 Pi$e\!5rz"ԔDB)(akvh+H$2@ T8 i<0Mk5qBfH$ ElEBQ(3"& 暄v%?;k]ފ"ﲿ+p㈺t#tt{IqqVc2&u)wDf2S->LʗO` d3~ӢdVԌDIM#0J?^y8o 4׶fWi:>΄>38qEVR:Q#0Xq $d2ch2s}*sO$= TDzM,)M}`qK3跰' (kd"R᜷{sɨR<4sѳ_`S*ov3r"9THtdHW02cDyF9ߦrgN^D1l̶?l}xז(/4)8eظ"(P: e"S-`o7)*QÝ/30[Dk5q65cbMn$ n!4%6zNؕl.yS|LX5p&%jRR0AmչqtIغ8h]RvԔ(wLDQC,YtYܱ3TVO0?6)lw(E>lY/yYu˔6 &#P` ,(],%UfXB 3PAP fK ܈1cp `8=wUqT(]ED@M|*8j0rWT"]t|_<i?}qc:zF-r hqHBB  Lpo9.єVU(ŀ,PY0J|h $no9nj(ͻh'pNaL($ -H ѐpM@Dk& xDzT2<}i`C}㑐&  P58$9  ~ W3_z*wamzN:<)̜#v1_ .O~>&+؅ߠ~VS0\<_uaЪ`į^w/^Wo~ N7W/B"CW2\ ƻp)9]`", ߇G>:T;ƒ߁0g_6[xG6?* ox;^Յ`C(PM5;2DdXb1!AB"PqiQT0H 1Z(iJI5ה ABf4P1 cRR䌝rZ<⊨i4%WJ(Jj!v`p8'Kz6eШ[$5}{tF׏sTlTF=`/X@>Z.b:P΁=FOn$!ȧUჷ{?j~ UY\ 8(RzcE(2;G2ZÜ ې]:ww^:)Fڌ7(';&y}f]z}ϝt &9=ǀ-\{ N*wׇ]$G`JKuN7>a=>(>)a3}p71IɺSB3RdV-hTMA %JY3fr}`cߝrm7Le~}2|r T м>sG`ڃ=?0:\m?/g}^?ka, \}p_Jw{ 87?γPK[}o_ԟ]}^Hu5a闽6d'%0#(F9p{/L _q`BuhyRI735KXcG?|""$e@7(]8\ݡRTi ڄhHSJ+hI%IM2bRS)#n$1!iNXCf{ELZhTѪjV 9KV1(sRcEe[kǻl;MDB7K \s=k8>]P,:G{ Nrc3H=Z  IDATΉ2$`nҡ6)L$ʰV-P ȳ#>Gx\mGB2{KYbZf]\Jj'L zXeokdB-#Ɩafw bt)A1 Q{1n:z[sK5eMڬ %nʸ.%Ne1aKdnr \cLb$n} )>iYr >2f>Y3,?;}0 HF1˱#=cї$>i_`9WYXUne&M Ai G0u!3HЀ%G mΡأFdp@ݧ5x;&ku&sI$ sd8ZZ̀&SQ (LƴY;hߚ#Lx|`F*: D!V"ژdS^$9I:˫mnh*DTFm0j;#l;LaBo%/=\Ħ鯵(8։eDQnz8sҧC0E!F1p/1;7꘣gbXX/mZIEՖSM$ bJ%< %[Q44l^^M{Ut!u ( ʒYŕ UN4q=VpAXz8~cJfE V@pd$FYUTmJrOb&BH9p7踍nȽg~fJ\aIUGX7%Kv 4hTD2p̈́ >%79SLm!G~~m8e=܄F tSVՊߖoi{jOtЯxv?t>:o@{ӛ#^O܆i8u*{CQ䇅(4h5w Kpco;B4:Ԧ/>O=fkZ[)ѠL==_{7}p`C ?癞ŝSVa> ]S~ u(NY\[64A1p Dw׫@!_\. iMQw]6e<*Q%$% R'$cCB0XIJMZvDT&#'䦬0+؜tbRT"M I yE"ʘN2$+|W8zܶ`'^SK}o&q dhdQYAL-`gQ14 ,+ˌf}F)㊠(ҰY8 i3FT6ZOax Ѣ℥[ rKxztwD8h$uMv6I&s*M6fVfT͍6ъZAh4Km9dG*ӂL҈87AV - |AYНKǭ-k#6wYF&LCa v.Ʊ9,!>Jd kneéŬr2m2| \JX%iKY4ˈ(_q aȂXax2;Y*$7ONX0 &E&<"h#eڢ :8á HCGpF l쑨dև "EKe6y;]: R*A@"(wІ1TC58r gRAs@P,9[t:!E"+bm?x4A1jJ83f\%B쭿PoS, !,5ɭ%s[UGg9.r O}AsBIQWf $(k K郳\bpCBNdLi?-^x\1Ok6)yx1s4 n޿ɞ S\=D*R*5O+#*퀉jp}-d6nUSd4@ dùPP8S~5!Q=`.^&oAr6,< =娲~w'w᳗{.q߅?}xo܁N }XՆ.g}!z n ;q;N. pg(|)9dO^{o៾ ^6|7`~ ;>ϣ ay>tO;. dc8ߝ)UY ޅ߁Z]-)<5K >U^b28[>snD?% f(`wd6_qCɖK jȪY" =ؓ1:a@0!{s{AU4OZ8L͑1'5RPjuN#. siVSW! r&p:ݼ( CV3 a#(f9yǎ32/s7+?0K"1 X#)Q̢8>R!!#q,2 f$p^ٝckaɷGDtcU9c(RT4`2sKߢvd+KѦK͍F1]Qǜ.(sL آdiI>p,ϩƎI c,Gd@90aJa5Iղw4YڤU@1=Qg凊a؏kp=kuVB2 e* єPHPj̅/|xs3h8jLJ|S>~OG} ">wz2{ +=V /SNr◎F0/ɫgyZLs߫G~J`1v d RPxY\$H++iWW>ܓO|1:kg;F:A9W66'S"7FE-'C*aeB'p9= P'\3&z1`EdÔP PV  DRRFtQ%XjҦMAe\ Ǐ7 +p`5Q\ -aCvwƾjBMo7 `,\y}kS/;շn+žmOy|g`<g`vڂo/ؼ?ܺ7|yH ꚧ!k07wN‘yG.p4H]}ʻsۇL BPzH.9BYEP:\rޭD1Ʃ)R"pHI,J8DX+-tY, a 2tPHE0pZ3Ks(5& 3(|AcB U|ˤk1ols{dM-Ihcq.fna`QE :ƚ9r(7(% umA(!5zq'APMjCI+ɸthIVki1@1K23%mS څLt @a$/%eH)9YYZRȭ!`=?9-Y,KD{7j7>LyFI:C e$X򍬳3p# !))JB[`ֶY K&|qX ͕4O:FQ !%JBZ#,tIZI*T9A#qv祿su[W;p6qRG*( AD=,7,Xӂb8C,6:O{Q,х!i!dRc8B) BQ$S9fRP"&qwǨp';|Ov#9ȐY~CB xi1d׉nWi]ΞZԂ8eXgܤhEQY\@JJ16dpM%2窬t/xfɍfK:֠q؇X0uO,<ar8P<~d YVaC` Wofoӡe:Nd)dDN PҸt{||kWY_fuuF ~aF,B5 9PhL ega mDK8> aiAH. zv{XBFVuk-,SHKG 0Vi@I!AJH $$8I,2,XP(` Nvn@`%h)uxi!0TnLcW` 8BzΜ8[D4⒇ӒpЕH" UT8)0:#F"$70JSpJ Am! +M=t "(b9 FU c;q`}-*H"\~)yh ]05ҿIEfP)(f9uBM (M!E|.PA1I8!b( 8C&4Z Qc" Ғ.tV*"Klff9dd#p"ԡX:?Is$ȍdQ҉J*1S'KǠ THabio.3{{G?~wܾ6KYyƫ@3k齨JD(fTƅ<+ Ϗox{[w_vL' $J@f8l0e'޹˭[pwr3_9sO88Nނoq= {H:Cçލ)[A2VTxOojbA8FGU(TV B "PB@8H% </p!HzSsT, rGJHDpRbB(d`0+07Q=10-v^xk?r8^)i~HpᲧK_}&,}ƒa4|/+|TPu$xݧOנCpg^VUx qd~zS MYH l( ʇ񗯿b;p8"9\Mj"XH( & ]raXbò#K"9rvv{u˷g{\P1DEU@Osso\/8|M`W#8?9v1>,$jPx@IGe#C`zp0ymx,TQZԝ6?Ϩwg,?Q;7sv9;#~2ٴh (>fش?g^>%YWټ:&D1Ec3)ۧ(c?ٛ'[9 {:}OS vm@bmpsUؿΆThPK*zj5ᛞA},4?5'sH#;\=/i롆5Q!#Pajxg$Tcfc8qU^Y_c+gpćp9W4ݫ9K/3iO>~wV ~pu0>rmºH ǣ0( GIx°=r6s9:;|I.K?LlaR7~Э0xn~3 M=H& E> vcl+T$R5:X vUA*}hoaVHXwmAF(rX)d$hw" ºI, )ZVh-D  U-x_M@t> ;d0`N d( 5Z$߄Sf>,;[YhBM k+O÷.v3 O׃-߅Phl V C %xЃYsgǸOTaj2.|N>4, ulaOơ`d`v *ԃ5-n"Ѵ^ }wz:/M.pxZpyp-YjeJL(Am,(F (eq^&- ]WsdE*#Rq;bTK{ EڡMTlK)+1sܟd#|$W @P;#!DEL13 Ǟy&nm0;`gEE!/ѯ|dM 6P ;c%Re{ɉS F[_|'ۜ6r.QD2Ģer(实N!Drc`([{9Ěvdz2mDi; GgzS!4'1ZjD i00m.7V_ߡS`Z){i1 xdkw!:̕D'#c {_[7Q@l\S{Z)Px!Ay\*1  U0)qcbJ߽2;w8qQ7fyo=BX{Y^Qb-p*;1N?<=B́gwR~L-P̽ֆMZ]JMaPI pH% VF̧DRc"7x!v8'u@6xeM:Xx@$51xJY5Z$^3G/ zK}Bpnlٓa?: G!̮q"P9QZ_=8.^/{JcA{}?s@1Xj@Mx `a|N= Q 4DO~*w̯ކ do'.rV;G6-[/Í7;?@iZjC"C^^ntEV[0܂nnW wvU`u,RP &GfNKE > H0: ˜qY 4zI&=j%)L_^% iТScjKij@ K h精]Q[!H $":BłX(m@N -s".1>GE8 Es!/H$.}` Ɠ X dt~ͧVrq{oCޱ%[=I6A_ȁBPJjQiEN޼Z?otXXMa٘ H!hOI$}_1G "5ZO9QxS˻=x|@O0%:4q LF1Y捧K^bgw*^HP ymcNmDf2T&JB#]5ׁV#;xN˘ϱ<рk- 0=8+M vH8g%8O!=F:*0!EԞ9GҘ:Gx}~pȍ(#XoaLriL J#!UŦru%iE”*ɼ(-2~)aDѓd;;6ys/fsdqCEV>6єJfivj:C>(:̭͝s,1LQd9VxAxDedw&@U1ą%{D$Q S;چtX/# mͶ:"ζIxD۟㚐L^J#MkP<$*k0ow,;*=6Ǹ(phd$PRG1:U$8RZj(&тTE"PH+oD #ICF^g*"Cª |'5wdڲh5ƷJ 4-2F\lzˮ,p,}0mVCoBc l {UnU @.Bу`;R'v߀ Qi&A`ka`x3qy (=p\K|NΏ 21k`y忀pa5*3`fࠄMX1(6߇B.2\@8J B~nNDDRĠcMeApsmjsޗᶥۼϘkGa` v9HFxԔMiXB'%[_pydS7;]rLDqVF'DAJx.39ءK4ʹUhIe%UuP)Nj>N{!1P Ӟ!: $9?GL6!%y/~48\v``f: ys{!V6~Nz@ )k6-ޛ-| |guN܂;{7ᑅp.fR)x Q :Tno~!൬bz11ӵ WHZJ)P&IbKG Ir fZy(jJGxo8J~v6^l*hg xX! ŒJ>g)T[J UԠs1܏\x-+_7dH9~AA738\:Csh4VxѼ{b@YV|`[A{@u0F +MA v jv'Ƚ=6>ͷo1(CݴzaĔoh`i' R4iv&_c9VΠI"zNᾔA-_1QiwupR uH  Ōv~z 5 9eR\Ci%K, ҅?ȍ9ܜn@BzKz&6źMBq]R s! 2ːFEdPo&"y$8^E ?,_Pǡ=J5_c"њd'wD)M*a-XI4=#W2ۮCE a"bԟ1Jiodt G)-GqИ$x$+?@gLTNm]K,~xG$-T=&[Gh@vK 'd}J"6rV↧y,]`:v 2_AefbffH3&g+&X^ lw- ;0# YH] Jc:tRHcyII6sfĘ: ߨ1#㎙@+XF|OYѫMν##FtO|]!'݂^xZle5xσ [`CVʄ$/~+#%\{kD XSel V79.rpBt SOMd5l| J(=B两gy^s_ ׆ΌYHɅ+L 2r T e$V[C(,2lq8Nr5Wa/AH7[|1a#{w&ϮSu18ug[{kRj~ª;'?| k7^}ꈃnߢl5+mQ1DzZ0_)28U+\_ N ä 3 a+ۅ)n: BVx)4Q3X| zh`o|,kF8 1fVao oõχcyBoVOt(kRs1[ );pNH 7[=]bǿ`[x7,Ð}QX6Cj_}xf? Z ԺXN-,^:P{V:f+F)()pEwU"Ge6Xb4C4̴*=CK'UG,LHRO1wWbMfpV֓ ,_Qbųι wh"sX3"OX|O%?4_;\coCQTH1bXj3R83hlXLj;av[XLDBZ15LP~ f> N=OkpYIz͵1/nWp}pw$8@زpk@%i+'4;=gKиVQbȅƗIe4b0P6HaL Q ˪撹\sVQ<LoQ=-_RF¹ddihU4pQ}v WO}E%$ q A[Z=}3ixo3crmuW.W4fBMBE'Ύxp򱄴\`x>>},QV V)p 4ЈcՈKJ ?V9Fx;B8YdO% (b$CH ,RO+Y"OқDVkWwaU)iK u?W~ .lކgFV9O|!аʋqί5U^/p(ܼc_EغE  Qx & 9'BBB`ic I? "3n]ٿ75ؽPw^WV~ނj%=T";`2(o@BvN. opL0L,փ( `ԦD5,iP#8#%[SʒdSl) ZΡ>3SNyZo54CɈUVkGNsKx"_gspanDQi rjJIZzqEtJ&) 8(p1j!hi0e#%o\Ⱦ *ʭVDg l@6 E' K Zk)D$бG7,ڣŦB)BclMDkʨV A37_B{D'JaH9g":`e\0ܝw_Nyֈ}Kmҩ_mM|v0cid1gO :ͰtQ^<ܢ_LT9XLb^Xbc8*#ƞ!Q{(Ze{ $!4>1x`g$c*>{c.~;9f̂ <DXUB{-P֒<'zwU)j% lq.Fj@|;hc~LYtSIEj$"aXzȒ(GnVb:Ȱ* A9wFx NT _igfB֛CuH8Q 1_$Y!}~wRxPq IJCg# *Ke,6[>7ϔ,?0#mgop4d<8ͦ$4S,]Y"!'#t"G !&8%LLa)*^TiuB%Nlf6BF ^4)#f] 2z TY`V? /LЇz,r9G T#4:c8UBR&`҇C oAGw`xЙlr}< ^ C˃`+!m=a|s%FA4݅'՗q?a]84[p%p7 x؅? I@*A Jg?pft:0X>B^04z v9 MUBAҀ _ poFKs0`Н  Y ̅rΏСё%T>>佸aМ ?Sw !.X  S{OSV ESQ=44GYFa& l&AMđ!qr#L:, r{u֗]!o7)r(gz[_MȢPkl{seN{>1;o?uFQqTxF^ A x06X6KCKLB$k5u?BH℡r&ؐ"{M,u-olp,J%2)P0I @ H%'dIC[pf83=t^_}ۻ=KH,Y?@TuWo}}}]?$acD˔81X;cZi8Kt1TLIL%M䎲[-f s{]cL&">XUdA1#Vp@I3| /젔 l~D=FH(r')JA),Y6<^WL&@j |!6=ģ)~>j3R!I,ءy[*tAr%8}Lp|TA#3Z(Nee G%"cM,h槿sV/SIj$ TʓS..vy2/2--'[MaT4H =8].Yu;U3Ilql8 "XA2Z-ByJ= taYplugɖ8XdZV\f}H/ޟsԌYhiR8Ux<k`{^h.nSasPC)--k$*Hd4%c#DDVkڅ2$x6г6K5"'yYo\I6:´: U6͚SϜknߚGb{/_|JTDVHYq=j14D\2!/cPZr@ÄPA )RX(<Hek(l¸ԉLǞJԌ "wMo <=b=PBQPOf^(A ;pD~j R*\ CKBѝA4:P:81T!`*h'4 _+KC`i1K}p;}X^/~O7&<|XzKa]7yPt}|P{߇c30CV;;a}usch}>H.3Фصh|އj߿ĕnp1XY2AZFı V*5H&$#eCA\qSLU@Z`U>!#*;P E\Fѣ5L]ZKG9 Ͻe]wngލm[P:]B*%OHH9NWyiM7vH|Jq~Cxpx%4`70c[>'.G %W7 Cɱ4!i\ʤPhb"0bD$5;lLuzDs]~~o0^]F8դjEȤ"Ij"đDJCal"ST d*BW+s rHQ@"PJ"3A# 5XHP/\YeٶN/⥄S㈊{t?dJc&7+ \HC^cV޸O[+*eQ m NňZ  He]bC aVv`k£n{n ~>F,pE '^xp 8l?a2 sAx%X{?'!}{5-;;]05ހTA4^ S_{? 0TaP,V s3j6 td1 0̓H29,Xq̺(0S1Td:ıNbcSh|K$w<(`IK˪fOjgLD DAĞ%UJ eN*w,ۂ֨IWkɅLs9`5 =?:|bste 0eqM@3V ]b/ʒK8ۢ$bX.=\|/ЫVSl ١fb'hJc#6-dTQ1}#cX7-Y#IY'l1؎[$u*n…Ik0V:0JZJ/h k`S( (sbS1 GTY `%#hKv'yA#9bS5*[T >b,^@c%8S1tW8Z7M.>CPvyrvE{7sg6ӣMZdk۞b+OQO$ .cT *oɢ t0YCNcJy)c5o To1E\oaV=s#fqIr356SfLA "wmsϣG>IC5Gcʺ9G%6}FMu0Yt͞.{D3BF 8fx{|=PdN%`>38+, *gLa}jM45gp3}#l.d{ g/$8QjufNٔ#cm Ukq?#2C{jB[.ߤ&<4tڏ9<3lrqМ?XGol'1BiL1B #`fQ>"BPF11J8$nL#(?K5aLF;QR3!%*@QLى M߃S^<H雏!Ұ;: Q̜.c0pِg?]ؚZx,&~9 K_C9Vn܅c2? 3{a'ׁTxҭ݁G߁sҜסq6h7BdX+\:@]@z|AF1 ^ &ėӪ4" )zm=vš>Q+#bO& F! .]K.A( mA`bI94y>,).V t$Cl5e Bb{ǐ& ss4'_&> +{k!#- $ʼni&P(a> I`fję.<%bw&$yl)ȅE(KyT/h"'QAd,x<3\ s 9d fNJ %ʳ.`T jURA<=štdG8ZPOfظ9;56HIH9`\x"SGv8עi^S>ݶtl΄G5>z;S5FvFZP*uVF-IAy*Vyth#2밿ӢUaq.x3LMpZ9q|S>לjmRnAΨx("Z&I j4C1<$';1`yHD%, NEHY1ck*gȥ-3"fb+r=9FK^ 4B:tIgJ =9zr58MD<4q~`_Vҥ0  s,*hqޜw쒺gxl"҄I$=A& ؠRGn\ DX08fOбb;˅9+GNQdz89ETDQRłXGVx)HiOd@0LX(Ro@8Y#)XJ#Dp ΢4EQXgpE [t6OFlwS\e-]cuԢ?c~t JV}Qb"aq!@128)qE=J:+TG:#:&TT@B:b_JQGA )呑E:Cd2JA[“PQe DMB\8seێ?i <=I[[#^[!6InWa Kil0ۃ1oBg6`$Γ^< YGBd82; 0G^ |?Ut \𖬭9X]sYSxQ~!49?˛>_eUچ?/U:\[;r;|>5ظó8 ?yO;|ƣИX"vjAc1Dw IhJ0{ /<8D-J IDATU)nCt8P}ֱD 7A݇ +Z~/x_%[9$Q'E*Lhި @%44#-Q6x/74Y$h+H4ȳ84s 3(k|LHٞpi.|<+X]`7k~YNKs_=}$ R }I󕯝`o)Sb3O6IPrJ0*#MGĸW[ ݲ4o{MܹjV(D".aP{H 4&"|X~edV̉DG?E5٧`k}];oZGJ: ;[tDLGb3lXGU`"ED:/F(#R =>/g+t3%qB+Njd ]}z6vlmJuĊQy@6*34p(5 LFY ,4 IO森su5U9F<>=O/v&~gd7P.a=(MS5%Ϊ Q2 F ߀t.La\6x@6޷ۇo3Q0Csd%^<|Z pM8vNkp-h`'/}ނàU; ?A3N?c86+0exgA}(,LXc|Ju =} 30}<4uo}1SkݽJ];-R`T-^4,;/hzR0~&$(9~/4{@%m6MA"5I`'%!*SLL5F^ѵkPŌ;|,Ȍ! u.@1mUXDHQ !kKW8g'aŃY>njJ!+B0ij@!DRnksGS*>% 'OsMz;|O*jO6 L3l) &$9pr+I.H2jh C˒8ZRgu΋GOegDIԌOxt* ZL35ĭO{:A"|l@-qbiuʌ+!_m⧫Onnl=&z U/FX RJw#* o)*MY:zS`R-S!dMDN1S16'y>؏JEK.eXZIȌAC8Jx;1Zthd< d`H,:)ϼ!MnL1IP.1H5',^6E%sLKɥKY[zg~CvWоITeIwuLtIJ"$&$H02z+')Oшb%6-'򂴐Hk8.1ëjG]gx M=:OCDʸ0a58qvĠD؈+X|. $_𩋰*ȃ x_= k346a-I;,/qXfν(_ͫ!ʌ!\PFkzʵV5#y ,l݄VTBahCҤwC:NJ4X.4.A !> 2;L+;NA/ԈoNC'WvI3U5t3F7&#D6&=UPѩ&izbYbYk-b4A4!&3I4s? %L:횩4w1^D{cD-.3À!u9=PEIGbhi23?ĮLb:ͻ=Nko4*I2J3iPGf"inAh+_`ߌt.`5(U hHZUx8E+AFh_"Ze||;.~-DJL~orGCc4LMo"}\83x[Vhwږ򮤻QFob|dI]m"EMH̯yvsD&c[l/NFx@'9}Zyj#8|-ғI$4 <&ı%DuLbOVT m/[B EPmt@E/XM0$ R^oxr'9"|$~%ڴQ@(&J8| IlU`*"J5H0]*4lhDE UD#%{lR6N;>/e ڝyfgg Ho[i!<=qx>UXaHp!Ap(;& X{Z,(!Rbʼn Z D$qFk*\s(@J|DRK5 @&)2PMC4)- "XQm%J] L%"HTdD.BEI$:RhpU &i^!` ^Q<= H0}3K8UPm@DPFa' =Dx0O?(-߇/ao!Pϋ߆KC3φ5x=8\|+]?Sw!zO &߀KW01M8?Ma߃B1t7`qͷ\R%u7x=3Aqڸ K=<]ǐ@.ڗ`zX>~6x=! j9u@70~SaBrY>hfArNjC5 c6~ʠ|Y\qu ''VX!ulk?TU Bct2HQaJIhPDF$}%).R.]P?Dr1eoHitIꨅ(xK03opxCw^Rnd,#n]MhlZc{FDrثgPxSQ[5_l4\cC@{!@&҈z29L-4 U'o!9 *ދH$*]h''ѽKE̙ii_ĩI^j4n~poٖDE4}54x4sЀ% {fir̨s6#8g[ܹ>k~ ?qw*Inw 1(=g=GGg^x/Lqb jDcs@quc?7gOXpAI,3S$)[5 >HYj Q)xGMGY2(FEj3Wwoݤ1"=QcD$+ $đ ])4Ca3hմzTvRԬ>kin`xRw([R1WɊ{X<+W;w>iNF{hcAEJ6(a*^vݻ7|~D"a^2`,VhAkca)HO\CI9k%fdۻTGO(!fB luxB: S߯@|Kxz)&!* (-^i@$+*4!01r*P)0SXMkbe`0-hh)k,:JP BLBW ߁ K~Ï4ŒH|Y B!H,A5(I1Vx)T5ĄDPĈRxBE 0[_߀8v/}+9=—!0'P]qH YiMߓӐ {P_15_p!4^rMN~^u+G*p[n-=9 t HGG\< u[?qB <9vt ;dK8R"lv[`zF..}u۽1_:^v>|&jaeu~ܹbup;1zAUހ][!hC,L]cp9\u %(6C"g=Z{pT HjGU?ϸ@C"4xbzZeh#Aj_HgкĤ c@xXk~B 磫^n)A1S C^OحL0LKE?wCd;˜L.pCA%ـ)Vc<;%>WO(y{$ 2Nd2 0Y v Bzb,a$Q9XKZ8(I&Y8`bsZ[EjAzX]OeA+Pޘ3N.%FS.=@La ^FYT0K87D^عAfᦇyRX(`F0ph)]7D*z E&k31.~79&wG\~27wF]lJȔqOT I5JԭAUZʡKnC0^`zM&lGj_ /j|N [|Voo{{v* dM#~4Z|ƶiF 8G)`u)UJnw>Ûl<`B2 zY7 "r0 h tI[(" ;ZyLU4 'efƌG9[G5>2-SYbɜl!d Xz@#בMf:fes ~l< Xw9DI4FNlIbJУOn,-(AS$OZsNsFII)0TF0`B <ꁇJD&I`K<[%`d-2T$LG_@əĂԖcx ,EaP V4#OR૘ "AՏH,Q-fPeDd ֣K*PÉ,GH"X inb XBf*zAI\dkKlRSSpAL(ň z_4`iFAuN j/CqAְkg:6 IDAT`N]o,B~팆Мu:\nCZB}MI{9*: |MQ5Xo:Lzw{Ξs»߁K ~4|.;vф t%( s >[a& C}^wۄ$PP=%w!u6Aq!,KĠ9p7!^r)/`Nԧ.MOιtvC~ąmQ@I%6+dh+=Az [Qh%^Q 0ASJ塕&pı 2J:)aL 2$4ˍ\$g_j⥄C'uDtp:]7QH m34<"W2ݧųL˜'H3w*sU2L}`:>[rG6ErQ oO]93 ~ 37L=i %~AAa5@H "J#&А:,22ځ:*vIg4V ,EQ*#/s~A"3qbJ}o3uf|Ä'c!汌]"W8+!XK2 Rsiy1_3\:Yͯ`>> RtDTXd89KxRWCI@EizŐIAT96!~o̝?T" /=K3&uVU6doi`OFi>K:5gc6)Jhjz3S4 H%K r?: Noos ~3Sҡ;vxT18kbĠNWȄ(s:4jޫ1Ņy sLmDAi>i $aYjt>=KsD;>ӝl`hc 6=>5g嘨+YJkD=\?&cOO #Zdָ)4G(KXXBcH"V%Zv? 9ʥKs z>`1l GUa>V$SRa$(5ѰNBthHB[ e9>1R%asٲzxH0e;o!O[ȧ dl; *$軮U7Q&.O"Tڃcw}kzw̧sW2o]h ( Hp \4ak0>q燇p[ھ힟Oaqޅf?wV_;.%}oo?e*[;ѩR@| /p w`8Tζx{9֧=8a0;o@ Ȑq:߁؈ủ蔽!qƃmvې.(D ד ylkazt6~Ϛe6N!4=FADD:AH4Ә nK_0Av^}kɡ-Im@Z #"#VBT&d>׏xw/1H E%'$A,V$3]jk%r} ]<83gAf"8ʔ)񌏧3rX?m,~HXRJT󟰳9ɻcVdFRYJ ~d`w HBn,2:~B͏=)I\Pu̞4!U4rm4Vgg.ro4zsC:q`ks89I]*UCfOn2[^-U"v)/l&)1 6PWP"zB8NGUd`E 6wVH :0LDVPU|(a(%S]2Od0df)xZOoNs,YE Aya.@PLBЂrie| of.;vg{c(ZW߃g( YR[qxS1*)L7!Uh34l@>sf^|*/û!L*ЩgC%ք)̵k_n߁n1Djc[VS]EYϟ;MN@VA4[yf]Zybf932gbed=~Sͽ̓OX9?R(];Kܘ'S1/'ܴ+7nwOz=א$#֓Tɯz{qS+(A'TKIncSr|:ԥG`d k҂ܷ mRxA[XyOR= wGO5\|BW+m'cΌYd 7g(g/`;Fo0.<; _#gGw+q %<[[gQdUJZU+Gb"NEbuDt-\q1,38)DUA=r^x.T[\p!/^F9G+x1>FPf0KE/yCɷf$b<7i2às3mGOu1AO"*P%aH.!)sfLÅeۈ' {'Ĭd!b|~OPB03Lbzo4;T[298hg|Oh~ q̳ ߾C6-Ls1ƯkZ09+ɐ2 >&;yBd<[1=v>TOơ49|Q2Ay1V>+cx ia9إ7y‰)EOˣQh_YkZZOips췄X"'ν w /F꫰__'?9nʾw*˰^vw qgu r~' - y4{ kW\+P Ï9/5߇q?yKVYsro^wpZ`N$#}nx OCO1ݱZ嬋`p srBuk?rs>>A6qV8]ݭE(;q *iޢ[֏xY, ,iVC>n,kӀfؙRbZsHWq(ћ~A^(6LoL71kmsN{ܓ [!t263wvh{қ/S;O>S13?\`u~dy @ ,dJ0~!x 'UnVKVvΰazFmG g :Z.RأVKPeN?3l *bl]n4> #t &7*c^/'fέSzW!shq:{lpYB8`Mx9p1}_}jt<# !hю+/DM^pMl*~3 8dɸMWdu$(1B)fUL"o N8˯D|1k &c˃AӫacnmL}wop'U%'F;G7%m_O?B|ow_6RNByDTetEJ(fh"z|<8nnQԮ3T&" $ykL""[GG$5.}2.0 BP2or^pDĐ+ ?P"VZ|GYyToX[&\ mrPDxvK)=eLӤ;Q-)gΕ,,Eǟb|nʓ_af9Pi1"M#86EDwd9PU2&#sS.=s4]22"40|BG~|/MqTatsïS$<&_ާ0g..F%\x]B6w.R~LA]ړ#"bD6TS*OBW,'THgp|rD¢ݳ$*x kDw98r̼ ^\? a \Vuscc |=ؿ |ixP@ހ!Yvn8w>; >tkvG]y܄ ӊ 1v :HûνjwCcB0{` d "eazBB`’ӌxZڂFf-',``sD x(P_yjdg3?}tJW-qd/K Lg>XR&eNͳ$FKd tB|AR!;ϾN-%߾5 &`[ s@.e `Zp7O}GNJ(`FE+WX=qi.#=?h)L=p:$1D5Ce$3#z#-r࡭%DӉ P>bDG~ zȁO!" *3JGSǖα i< -v RiDE1)A%8u'tO3|"$'У>y#K4 vc|2E({V&-+|6-o ޣ[0) g4 +4bMHI!f5"KȭHmQ!W}TvXŜ˟䠨s29( I)#9dd,;#w dLUҴuNAcD.f>ۧ~Dm q/EO|( -f~GxЬs wG?Ѩ4w:[e1֏ADQ-yT_%M簼Grz,-g87@H?RL*jPz:2c4 1DLuER} fl2Z 5 M1)lLt0c:c"QKH7FR)EC٢1&0(?{_L l뾈@+(>:mZ MKsӹdڇ̞;?5A0@>wan% @m>YW'{tqͶY^Kpr.doϿ?ЪMw 8څՋpM[0혏K{Ӆ=Mh enN" @O/,sk{z{CH(l+A8~<(1G'/ߒEl+IH2ٻ{ꭺ,yEJ@S?ꋋ|M1kP>#թ#xUآ%Zͺ`aTwđ ^d/Z.g_7[`I0[G PdLMB0g!FYE@w$T^A EF ilB@N HZ˟a.X9gրWԕs-D&<Ecâ1p=Km'Wލq&Y+w8yI[<ƈתmA}ejDy*DեR%1c/,[>c3s~Yd_̱^Iq( LtA G[@dS|M|¨E!+JTu -t>W?/p Hp->d:l)R3>Tc)YTNqnP>JBk_XL~H$z4Ul^3e4c~rCQPb^?+0qӼ.QrY %xC384m%yS" _Ё,B&yW bc4}aD*/82( )bG3Ȉ Ґ6[_:a;elBLH bPBguNR$U?3\sۧqD?6̏-H"S`g0(&C<FDbBT"&<#Y>3ĴBDq)xe(~ oL -=>wgͩ;&5Oa˼":ա}FD$MI18XlriΠZC~i p# צnoF zN>l=|-ţrK).q|'W#Mii(mJ)%. \3" ? Ad+Z24%Y{RĂjv879PaS~U!Huqxb%lmP ]B l^ߣe$' x%\8ZP2Z:;"<5xY";~! '{R /OӄR{X5c9Hi3Qa9TBPM %H[F@&ACVPs@{4ŋ$xpA*tHsc<"Iq.4>ɟ|t֞]:b͞DLoR7 B9נ]½Oz֌O慳.|l'O~ܹ 瞭;qX~ [uGЀKgk)W?_k܃tLL.lnR@5#-wuQ`uf5֟#@aG5А699@0:XR(8 Vo`YD9EʫL)M.' .:DcZ>‹M^":AZnHѪW'"PK/Au8D(b._ nUGWv 97 1Wrui-/3=0#fV Ϋ7PIL#$C!bKlW9(.wr͵m̠B/TP)%iMF 8<Zm6eZa;#JBՄd,=N;yM{uBq9fI۟bLT &)K-] (h=[a;aJ ֘ϵhmĭۈo] iSbtcO0P|eaSfe^ ,PCƒHA:)54NJrY18\ o&3<#|촠AiLl **1xMKI=F.:zd$; &%  렍X(3ڛq;󊅓 giM' Q"ZT`#70TŐN't\4$g=_vrJw`&$&`+"3Y1$!)XZT9}+/98F̂7% x0+OP(v:1. ⓱?M@nԟ5|,p3s֯J9EN=*E-&sa9c$$`GqTQj`c^%s}yH{LB̍Z|#lTc5E1"hf"btQF Hd 4.bUxdUgFQ oҊ tu ]ڳ!*B?$bJϦh =pߑm\ɹ!Tv$ڪqmכl]d}/[0 h< ;PkH\4av. AV1l}f^r um@g|ZR1)yik] j^q^}蛗w~ +߇|:ga>x6Y z 8TqA ʍ?W?&C d7j"|৿DկTuJ+3Ob#ZU~1 \3TG%@(ΰi E¢ BP4*b+lLFV9zYΒ>i(dL>zTA0ÙWJmA"Stή’f5]qr6} OuĹ6 fbr/U9N&G0eA7@Tp=:Ѧx.@?`L }A{)&ATX(ASs2 p(Z] ZU..֟b%_m,y=]A^KE!8K1u9]>3J#z *^85w7(G8f^h"k1EI&ۈfX\(=uJ$x)I&DJ"@zuվ;SXyMى١̡T`Pg G끋$F3n dac#(!6Ԍeht-. ł0@&[1BX ]#<ȠV4 YCqF^)efeAD CxJ !p~L3m5QX%Bڐ }GkE0:A*8)$hb>yrI`QNI0,z z™91VXQttTyԁ .ˀp(Dj^%Fw`z< ҺiN<,Ju𝚕B܃W~>6g`z]np"4-rc?_WIϜξ0Jp}߄72G !lܮ~.VR̯5H(nԯ;]4=5qtrZ_T;u▙@yZaAEƘuٟoBR J_Z< B!؋qe?KɌ=sL!eBIc E!) WdXC5)t^" IV f!Z+Ҁr`dCHSbq&DѰO2cq[>+p}~. ƚ4%lό4ОE^) GX@" д G ٔw]:I B92 p"ʌVx0uGQ9.0XgI)הy $-㳪#.4ZUv)wWM?h98DA E&&DԥD]%(h >K&*޻;)،ٺoOԎDB'&( 4y蓫&69n"0YH ྱTs ̄Pk r&D+S%%H"7<+e%Zآ"7 qFjASV3P KCrt;>kOVНEҮ:u+$Ȭc=p!Q8ukrΠ"ܫc6ofs+qpң%Vyx#Ӭ8C[ ]Zd̢0%2*|=ϚQs܈ʲ- ,!@D" a&9b 0j L,1aJk;gj蚜[[͊Y)z͓ Q4k5phCޮٝ4S;>m4.d)rA:Oczy~QؐJQA˖ta$2 JUe]訨<Ԇo9iK-@рˈ pM,ȔBZGmӺGaupxnN2)GB8~(GN&HS"h㨀>΅0tb${vʴ].!-B*oKJ)>]" /$vtc% QHJ'v3F^TV0Ԇ!CG]THLX $ei sY,AIj k쬂V??xȔ<@~G~O"MkoHPqfY-v̡LsWɹz&uS9?x3Sѵ_Xy P| %@w8lO^ z?:mX>_z]Ϭԯ=އ1|GuN52T_`v 8bkUM2[wi!8==h]b\v~^8gj U q5C( 1df\Ocx_`g"&2+T %9=cKOf|gBoN *GBetS$ L1i )S}n7YMp_qbgFro5Ss*QGLNqU.ewΦx#>q )P9bdsZw)_Hn9D"QE8GT Ye%9@Ja0ی5nW~ڏ(~ا9uqJlȸ Cn6}`LxE !u$#sE92]Bp N%#8|mz;:}gN%hA6o ^IU#{W'/{ x ϚC(SsgJT0L#Pe E''|-^h)+nŶZ xlW3D\7sM N Nfc>ٽ7,&>y:| &*<:+ IDAT1CW+ 2s[(SM۪kD*fNclJlpNE1c$9R4qb }HȫLǜR|ۙ3 n@z-cL˻>s7d a8e*߫LŘ7!|6$;2ai:}#&,z3UM/DK E4͙2i'g؎} q(y{d9ݏr?̓#-X)d-o]D}pf띢\[Eh?ˠwT S5!ܑ7@HApY>6TWX\c;a{_Y!8*|!ZͲux7`g.ú#<%|f:N8h;]Z_3p>sNk1̮xZ5v?] 7{wҏ 8Y3=5P꨹<\|zBȇGGcV3'?akztگfy\,Ou!u3OArzldB ,49;6^s9iG38Ǯ %i`bgɗ㷮I-+ WmJ 3x7?<[E_I%K4 [\y*[ĮN&-4KbY{;_<^=iS2\Z̙JV DZdgD0"/S׸/S~0ey2[a ֜Y\`YB[L4 hw8^lX9ն, I1GPjx)xs EyKɎd.(Eng#b7 E NIH!'"v x&/6-5ciK[o}1Ng3 J>|> KuqebR ۅm m{Msr_1/=S;~D5l1_ÿ$OZ'pēbqlE'jFVď".WdGsd9Gŀ˴ɷR.|E1͔- Zrn|5;f=E0hSa<(9Q/Dp ]Yt' '/TX=|$dm񵳔>Fp&(5&/ň'ךtmNA11v&4nEfUT83ӂ%Al)K<yϠU -Mn<Ϯ{i} bJQKܾ}))U WL;1Bu=y8?a#yخ7( Sy ol5E-7*@u?V姠" ^= kWGzf#M/ŗ>ῂ3Ol܂'pf[_׿:ZrgQoI;5pG |opiMj/H>OC~[5w}hU9fJmx"`/6E$#->0m\N)kNt<#4a\’ <"a5"$V)a`#KTԁ(lLtB4/-xFcisEQlAd#B8L&mQ~mp }WCVN/sTt/'-\LAMdtیO0&ʲ ^¢$3K4Yo±vt[]E㸝sua>fxt"=C^daiO3<&yL؄6K^:OzCTb>Uc\HFېEhJ :8 P ]TBGf͓vZXatAV=&%.:s^K3b^13G) *BhE. :P#ӊR4v&VM*3C)%sYQ1abJ#.Y"=*-S| sՐ4XLLD4{^`*yɲV7= _'gy0ޜ94MA 8GnIkTx8Aͷ'{m͚8 _=y܁OSI?_!ay3h%0}P`}=r>u|Tq7G\gnuo_iS^Zgj(evZޕ| e0ai+V8]xF\-mfq7í{+̮]x͒Ӓ-2 k)9푏aoaILqCq |o!}&Xu$!~nrv-%zvw5mmqrs@`;48y~>A?.{6+dohk|"+ OܜL:7 `7DqkqEZ(%ӊlYqFTP%㸅|F+Y '2r),Y2MmixiE9@s%R>q*)"0aڠW1"Kc SKb$J6?C.ylpGG_@@iF'pӿ˴Sh"@ܨOamנwuL/h C.Dg,BC؄~Bo5$y_17pp^ Wg aox 5o>[y1z~__F~[0R N;0A f9A>جa%ڵ*CKIaq'aM:nsj*X?:Bv~WkԬ{ ٲWgbu?ܤr 'VP6L WVAwq&ȸʅ.;5spP%5#yiC^"A,NPF7 \8';lW' ©5h} ;/9h4wY?.Ol \dC]j*0 wA,Ac=1p}ㇰ㾸F[\"Gl47w~t?ߍ~r97#?Hi!Wr"viD[T}"Ŷ*1y;?"m>F!y4%W8 [ z6x 0ee =GuK<{WӿIb:q0žQOQ>R8о;DZ ?r^s샮d.մLlR4M`L?yνgy8}!_1싘mKdW Qp1wʫie5);>樱v&VϮVX =5`gdv!d~ %3"vɉ{&rDE FZ2a3@Ȑ*"!&b0mI4@PARB#04i`5 gr8{:ok‘%)+W=NwCvk D{@ 4;-0M0g;ϯ obeǏhoeu)a߃^#LbtBրnQn)ܻ良1G#~$kh #1bocoZ5J??'gr䡴YČQh_яA^ hYKsކ\~վ_C.W*/Rpa wPl޿PAR 迅4u8X߀3E:ը WգE1 U \߅=W\_~_+~㟂,<CcӾ 18"k@q.:^z ݇ғ|(5lXtd95HD!/*0yȢSOq]̃?ƄNJ8t\]eCbI.bd1yvhSBbs`pW1 d;d5Le)>7c>3mָj8 CkQǓϡUqI}~I Z[4GXqLU! fHb69=Ӓ- g/[; 4W9?-$>; lmopỹSx; 9R(*(#XIJ@2$D uF9Dgo2rKf3ū̋>> _g8z8Zh>1yse۝{̋NfӻFVJalė-|0I뜺~ ltGqO1qq.-s NBuR,rq3~=ɒ-rbbʼn^->L2vopy_iҬz˦ {zj2Lш3?])g!/YͯFŶYnU ;>;uR}wkM&#~(o s%56IJ=xDxɾP&L25)M&aY-^,ϯ9Np% ;hMZ ӄs0F45u5ˤ:AD)]>σ{D_o\]Q ?51rQ)0Uu9cE\خT8\ʜY[/7X߆Ƙ;7WfvOha'BqH-] uIj-/-O[kw/L`SS<>?39|~W! ;.%ˬtXA%):C5Q ߦO7c'W1.JZ\Du8g5uCSI%;%?k&{|"Lf^'Nr% TM=]'G1>mשk*MpսN!ޢ?vWV:ɒ=iE79mhS,ئW0 &fC!'̌#iD2}+}O0.#?X mJ]*4k-4&"@XfrhN8o:$i = yd$b<|D0n*,y?̓s̟o 1XWawixsp?-Zew`a!UfH>+ LL hNOmC Ǧ=^.L_| # E6e`+ o)95w[wehHVېPq;y,g7{pס݇!J 1ԅ0A0qH}g&L[Ec:LA׊0ރfQd搮@)Ex "@ PaB[xP lU1![+#BJ?FWX4bsf4`+"dԌf9ÍT7qu뜶!I=L IDATAlp6, 3"0M҉!A74jX'#4‹D4=A=jcE "wMM:4zgy=K˳X3O%mBwH_W)6sbMn8 *d:-#:gHCB5"5ɧmE]cŚ%xFD}kGeMf3bOKJj3?Y4cq5S g;#ACEtG~,ɿ̰>b:HQ}KCr1Uh!EWp+[,y< K^ހ]d5eԒWL{zVa*{;{~rybcS#Ӝf-Єh"XF8Ecvc8u)}<41layc}ܱAWj{dNuэ 2og|+4?zmBL M[r$$%gȳ6ZT@ŀE ?͸aAU]B Ei q.9^+נQ8@ZR MT̫X0 z2Rf*w{+xn؀kp0o_l4|kX܆G=W`k_ EU3YWk18u|W v+UBV!RB⦇i;nBW:+pWB%lл~`u,"jYu@("m3i1c㘔K)#$5q?6h50ILPut 05e2Y|,]gb)HP- Zm)R %Kp TATQ VTO x趁}1%1=c=FG"z]Ԁ&цȭ"_b@>C;r"X|w<=0evIsSai씨)GcR{ij̹)|i7PiI X(!-F!U0^CbUGfU`@U9;$:4c YKZ &ϔ0愦Eu/;9ˣ DfP+su\df8lZa_#8c?H9/54eK>GILH8iJq9@BPCZcZE18Hɶ+ٰ3LDbrl{9ﶏY3F Ptye4'JE t'ҤN={ n^!XF,6Jb0aT 79*'d2#L&);D'M$m\d"{Fqr \ %"%Гk@A͘\Lg3>'L=3Mpq|N?$Sɾcy{8VqLU @-G#r=-H|#R,./c.V|7qҳt <ݻ~ 6yTeBC=]V$@K@xHZH0Km+2*™Hk9֍*kC%06gI$`7B J? <%O JTqa`ELC <0 < QIY6DCt+p0'}`d~›ih=Zޮa},!\T@`@di$NQyBpAQB&(0# Tn -mHi0b/HЖD`cFјT[IJk@#- %,t!p?xB<'gz!M+ Fpn/b]! > 6ZR w`Mh}. ,͢ ~8mW{ù9spb>(Ͼ\?>~ga;.}LG.Ҧp⫰&Į,sO'@pݢz /D[}8  a q\{!|_:ûP?Y+`>̾ aoN~k{hQw _NCH .{5:-eâ Rſ[ .oLJRtNzJT?DCG!EYdbJ0U $`_~FWhv*Մɦ"6F"qŚت Dcn[ nXh<.Z=`}RԡEQ3RtX|M@(MV@dO$ {c=(WbH0Rt "oA=ރlς8ڙ"6`dPqţU*+ę(F*F)Ss5N}׏84eޭMct)101OѤ>=I`fYF\@cjT4]B=GD f([8q]"ʈLR.Ֆ61(aĦa9L.!Àaj)!7mB[`K+m"YYPt;&0eLHmI2YU#8FQNn4Ag,$3!RBr1L0*Gfn/2b apv z ;V!QF#bs̉.2GzCjHsTf!RI/vFtpIAEZʩS6 c[R4LIlc5cu lv8#g@m!*F6$Ʊö> /S),f&68#% bl1+) NrVxW9=`\#@)qQWȀ- WLI =HeʾHu~*μ?aʼJ i::rf+cŸ;CU9rGBE3G*ܙpnFM|/b-N8U Zu Y"+zLFAs&=3 V8 Y#*5RnrSNRbƦA:%FfMh,RcMr)s!RCAf3<#0RR QQJP-\3AXFkd`h(21@fV#JIcy2O1 o Y.LԽ,x| *HSuh}7jޒ_IYG {޽ P7!q`kEJe^Q@<K[`V`!8VD[` -ؿ7o™=$n =P}F Sq=,!Vx] v}EFtxE)rW"Ob+KIRrPE6PH$ :Q)9f"(!$ HX!*OP<4 dl#)S;͚ tDhfGP#@\DDk񂲂b[$Ju?ȵO1xj>*N">ii>@(}8D߫ 1*еRCܖDkWΗDJ_UhQ?ܨ(└ qT)>%3Qle Q85[/OK %z8`I ư\-1TA0BB0"ec9.i!SE`L/KIN#\3%$U%,-slSI %yK%R$C)͚XÜV CbMJ i VF,L߆.7at/Brudpa5:LZ}Xt̽PH+vo<^HǐB)1 wt҃"mzzD /!)r+ΰ؎+lRc,k<~JZgHr8T)*da5y6ds4 3SJ$;Q .]T܄F٣\NqP` 8ĩb*ȃ : RҨ*fD%CglS8ax$ :Dcn~8D$aq[h.NH̔.89R%L"L KMFfŶ35Ý%hL5'!,Q3M Q'(V%҉;I_rPMf |  Zq0+c,*P@Z 2 icZHyfFۼ};_a]LҧKw_{hLހkPrs8E 8uQhU~ѯOR#|.+'0P;}8؅J0£χ|:ܚނ=ف_كs[\-8ñ,QoBDhAqh` >$u'_&Tk>lѩy8h@L/~tԎCy`v>}";]4'[Ł]iZ Eև> >KEV,@C_(Ħ$W1Ukq<+'5Mh-5t".Z WE'1)Gҫ%Ff t, 9au19L6@f KTHD6# :=Ĕ&c$2AoEdr@nN3bc5l%ss]B6рRXfSDqހ|zxP2r$Rhgkh#e  IC+1Ks,(h1êƨ!Qy6# 6F+/X)hy+hqr-[PiX&# &#DrAhGd*ŋRJδey$ F\uT23J ;&Qƨq!;x(8slm͡ `A?v2j0ไ8GXoW5Ltq>F1IGj0Vyg"8"[ 3iԀ k[ 3H h̗![EVr' 2}b4ĞO{.T[2mAw:@E] sPp!f1qHOllG;NJS)k݌o0a)Fȥ'#eb$YaD6 [01a@iǩ$df?3)ySRgQIlcxnΤ3ARWD.appl~"<LvLCQ74cґp1Y/I3ƘBYE: O|^j8ߥoJyLMԽwOhFQ' d̟}Ҵ?t E8_g`r^0/PB<=y:߅g6f~SMy /+E؄- IDATCxeX~A 'OoU"MTۗ bEF^<a}~ '>ja/WwT^[xWTf .zH?;waY:I w˜|x|`=p Ze& /PEEw  ,Qq${&~tz?s&œ"K("8'&C> }.n+}􃧙G+qwG5g4Jݳq O$UAXŘT4{9ZGhkܶp>jM} > C !"YBČ-!H'wȂ Y(PIc. 2E:'1" .CQbdĔF]NV33 INXd{Ӽz r)-:C~\F~ X `YXSiڅF5 i%x%|mwq;R7xAujO/{mRac.APa)72!j\"|αl``w- HsޤjJkLUP/oŗw6?쓉XSFe]m2퓾p:MTėwz!3%]V( kXU!naN‹'#הm82mVR~ʃVJd>y_kP.FKt} T_g*W9^?r}HCb,w,KDkyEzC@uhFl-Mb(Eu96 }|GR}}zAFdE5Ր3Հ ך_NxɈG?>fNҬ3)&7{ocyv}ZL/p69\GH,/$[19`$! HhKLGɡ8$=յ׭(D$+~P{޺绝>vZ}w$#Z)n+\_!GyJ)k835|Eܾal'$[}_~Sgj 3XyS \ܟ{.9&ͭL,Z R^dSgO&lEl#"[+fY8%`vc{EU%3C%S6è?djk|i9I~ş%$P5=+w?; L>K-ySgܩ0>+{8xn\tPot \a-x밵@A`a&=84:0؄>\~zD`0kO!p=h+ 8w665Mñ6LC_Gp-(s@/7op&`Cֆ:$M OY0%诇rBb&㢒`g( GD= ZHRCI0y<0Z,) hLjkXQZ;3M'(2H=D+*`Vv.Y8f}{ :N1\m(Zr;fH0#rń1C.ۄ>,2^THGp4Lx/9 Xk+*fp{Ћ>Ev(UI;HM&L:`O?`CV-KxL/ѰQkN<4z9ϾBwqdG{bV#(gSk꺉c j3C9JB =L9'*>3h|1ŀj;;?C~H1mщR"(V{">u?N#H4f=E5rϩrEOޥJ1K4ovȔ:3-ϗ)+I,;Cn]6ERD%FHm;(\Z8E!zXa%2*hv i`(K:d|Űh҉Lgt^!ui>~ٽV`,&ܫquH'JH a֤H(&#]5/{q՞!R|R%y쨎8J_QLM۟Pf6!%AnuCef* 1P, 3YR4|F]Bܫxf{Jb KI'?|>!:ۧL>axĖF[&o_5CEil2&5!QU/Z49>Ն;;|"ȏ}X=XO%!KY=t`< ߺ&M8g6rO>| CȹE'_aqOek=L-CZӡGkX4vn@ua??;tM 4fa}-I8&Q+,ev2xIّR08,$L@qiH{  L+RGl{KF^P׎tZR5tTMXAARID$56h+HGnϩө2j1ŵHSI\KyhB!2z |X(8pID֍GHE] jr<8CPsaMMS%^V-y_H)U3š6Baq]b!}N4Ns:9{llIn2D;?DZg>KS27nͥ^[HHR—Vv.e:Ar8?qLL[VhoswK7iCEn+ҹTTDMs\2"\.5C+=-1.mC9Urn㊃fIDx H>q#D[L*>}4? 84D{hµQHṠm{P C퉯sW`Er5\{m}4`zH: ՄsT55\X[Мe{0a{,HZ vIRXY @ɧWCw|Icaf=8p~`X w#:L,0x>aE8rHEXH݅?܆Bl`/}Zۏ{ҳ0`_ k0e(/kh)7!DK!O\\:dv_#؁rbԉ.K k%dTN{&:Dja"Z tT X!dBh2;UZsG \+Y/g#E'=xp 81SJyH)a' _tz^åY>+Pk$E3MbM$4*QqT)eU0TcͤQ"SGB8-Â$nF)RTyREN@L']I ~,)DJBDT"q*=-+,^F\נJA3iFr']3;Ou}ɵEP1xڔD  څLxSa(d:ir|٘!bͫWl!9ئVa,Cj"Wh.Zh`#CtCAn‰gF#rQ +&65'5LL r0|HiLG!IjC=FmDC\Q UT֑5!k'U踤"C[ h,G5B[ZB9H9?sOnwܽAUUhL9m4f,l\Nzp!ZQi_ Sv@9\:sĠCn&V,HuII9g D1#/2=&ikDm(/^vGgϞbs++{wr 1HJT/<nkC*}`i}#43PQ2*Fd{4Mpe̱Qû7kGyؗN6筏\p̥pfeZXW x  fР L52S5#C>ygOA(M%!%1Hz0#qkQ cp‚1Ëۘ.A`6A^%A avK*Ls=zdC1VTHoоE-.cTN*ڧƓ҈,ִ=h')DP Bz=ʂv𪤋Mi1n ~R!} _@aGhCBԆr tNZr!Bmxc/ӧ_~Bj hzpw#piXk[p$8 O< G?χkj)[<8*?^ \64|k0HOnm׷! Ͼ=YU O >dS;+f8>/#5a+'gR;&oCȨ.] ~{Pq5^s|^HJ΅&uK5sr؞ ERv3jyY7ƀxD,љB{I 4Zbpȉ5o$aUUhቼ'FיuFխD5D^fRK ß@1@ij^D0HE~`. &X 0߷,]Qp;P} " (.C&e?x~dlDy\y)~z ?~z ?^f K>YûaG FWp;7D?f6Le/Q2aQSВhSLm嘉0"v(_&"j~6 z-V͆^`"M «LD;"wO? /Oi5 b-k9OjJT+ 7p. 6 i:dEOr D:pG8s|8wcdx )?\Sgȷ1F 9}ӧO O$;U|I< pjL }BA"5N8jQ^'*| ,Fv1^hsd$ IDATsg9. :fǧ*7&=v S6%sa'+xy&\Z=a曭<7__|n˓ ;UK&QŁ*6ƻ (ej 5[x*Ş%y޳ּ$֖v$2%A"5U#(`̓y^5ᎄYObx*FI~gp9xП??z6__z= ,ȯ~,S-1,= 7@|{_sWBooZj\ka'+s-hA1gz+|#l:qe ʦ<.30"L.Av.6'7#PmJמj=/j@XZ]G"8H6I,Nw1A)l+1:4Y?1_58s-zX Nb"a&m֋ {/p+=SplrŔ;[L6#ldT:e7H[qB48HklZ:eY3ܧZT%LEP vhp":FYfzw^sd8Q[\')ˣ/$/!7Q|Th#l9jRfʘX@ӡX+ d%v;֟g>:hV-bK{Xq45iwg(wSj"\wH{ijP[TWkDmL7bQ1ULN+ZӉ3 ~,YòdeQ{9&-AҸ_ t Ӌ ͣy4?}*,CT: MP$ؘ޽ }= -h>Q †n{py_ f^lݺC GTh>t~|v~ }sp4lއ`'P Boҁ,?ݷgw 鿴o~} ~Q6-8kkfa>ư~D;{geS w߅i9{τׯHH39{Ii.&̽1WnVc4ϛ 0 ʏ ,.#3-@2qmuQJr`ג!ɥLRqhD&2G`^!} EmY*Z{&mX_"CY}(j&ciQ7"KHG![D[׸* &?|T7|h!#R)%`b E'B`T5bRxڇ `zBsX@7Xq-xeXsO4O"F4w9Yh! VD6 Q@4JP2` "ȉ1&J b3+|v|/' >NVckT)A%(Ѫ=1&@iddP?1iDqDa{&x3F(ljFehR-\J3>p5V*::C5Q2%&T><"tULJ#R äb6Kj_"{ZofLQ (5'l4X-Ekڛ[%^SG6]p~md9&)1 ͢cF2E&ty s5<ܷ=J76i]C/#YOu0eTyE"Ƕ%NP&̓m Љ3%?RT:!׹eCi&AM4Q )&򸱦uVCҸ&v J3!Oqچ(wB3Qґ`uM[z PTG=o#h61\%acnݺ^gk ̪_y|45EC Ct s?̶+P0g9<7a#B/~5Ȳ ^vz"x"N,_?*>{ &0xVBu$kn5$g{n 3pg^{By6~%HcN^߿pt ߂i<1K[aX#@!.ե{6NMoAY3Actۭџ`0A}g@X41 ̳?eǯ7jj$X }ؓ4aމ& vGP$؟\ L &>Ũdܭ%7>w2NdrEn{gL^awPlm31%^4gA5ɜA:O#ܴ÷#hUE td9:39?L6QCw΍w-~+LRHԸ #cCz.'^} \Sn@oD!{9K5 b4PQ:)v'0[v2xzlI)$DsCSORZCmzLpnL p$*$~Tt̜{=SP)A7W.-+>tPl 쵊O!ւ$^I9o"'n:(B- J !N 0h 3Mfpx1b+t$#Y\J09mOp=Z۫xu7߾Ijv0CINIX0e4L)GN|b/04.mJ"rz33/g>^uy%w'kz"zEA z AZ6ʅ|lN4:ʳc)Mx:WxJP !*y W{xŗ I:: TIHJTxP;XKI-6W+B A "s6 aw1(c!>n۰r=Eb.eS`:,k# *?9TAN:vUƨ[IvVBNg!&W kZv뒍YJQZҥ^G[q~1J(\v 4Smty)dL2KtKgxϼH7Yc{cwrYe}7'ӴmBSAae:r~%f7lP#*~YtI=1T42nta<$C84e=`IBxخ3ɣ m=6 D9 q|ʐ1gÉCO: RC-kg$l9L.Jj:uÔh4@O)yjX[ 9A7Ylr7bkCź[hbL|NpdAECS5:!*' F525jC"0+i-L2q4F֙>;L1`R'e"dž1F~:۬S" *#KKi}(ib\?בTEd uJlb#8!?N0yK鹰)vXS 0IlI#y^ GD QΨf7m#V9w&e{zͺS<1q>F8D{0HY[t;e4f}# ?PEzUsj˼c6yqm)[=T<#|E.Pv V>1d([B30Öa `DeK{D!AR>r)ǵJ2ǎ@H? e A{0YN B 6G {PuFY2cF$Q)+pK?wkL/ ~Ύ ơb( _Fڄ<Bqj>O~Af e@zsC譂!h-EJy3CKG=bh7^-<Y w?yh,:Q`}_o} 6x<9 A:g?~=Z\[? s9xp<4&gaG 5߃Ys?CD UXH9ޱ#Z?d6f._yެ"pS> 4p8S4fp-QPR06ܹmO\p83қJ54a$9C;4$EK !D$#9zgmضc, P2 Ƕ}9j 0v Fbtmfb1I}vDy*{ Y *h1jf/#<H8K]F%Ĭ.2i4%!h87x'=>8VOLuC81$5,91=QI$ 76QnW/aIW2*5+i.[ȥ,7x&E;bCCe±a5-[XA52``axnns^ѣ8=r?ܿuq{Kԝ"3cLD>wgNzR182ɫ'};ol2,R:W>0nCyf/ ,c:GZH)*bPE$pdBvglyr8A[M#|'$5kP(G7&V@kXK[tlNFT`>0c% _Rғu` LNJ<#J-ڂʘr@dD:bsه_gi^lZup!kCzsP}P9 > >2|`wZ4_`I͢A._7GVuMHBb/A}Nÿd} G$KOkS׮p2t!w]xpO0]prNj 8%.jr!-X-o߀A 8K03!?g8qX>O\Ga_ Kw^?/_Sxw` $z"/%bfuXW3x+H}> *h9RY*Nt%TِѠE5r 䐻yfS lNUCɘQ"Fh6vo_o3/]aKHN{ۜk\q}# <ȝqdkyGJgY]>-a/f-Kڐ(Ǹ;-`Wrk!R |\4khq UK$BHIN~NKq{m*39c^ÿ>@]ytDmSy <͑yѫX` V«LL<٧W]s5 vRȸs u"ݒ {\;oQʟ穣GyA%}.3{}^@>No8 \oev7> w^dGحxګ$}I>W΍>\^g՝42A#`ާ1-=eDҝ{o%W g(`W$>p=$gGrIO`:⢁mJY ;py0co]{ш8%5>b%\u\a%rAũ*nap_õ780ݻG:S9tXh>㼣=6夗0[k1ލLR]:+I=;.O8-*Nْ_[܎c7vHWH>J6s߅~PR.p7Hq[C64.p -ZLHM9BݐGRbPTLY%a7xO6/s^|:j0C—m76Ę3HUWM{IRvQ2٥dFdDfA'd;_dw5)nI@1xuxtp7"L!{zm[C^]W׈㯲{S/mɷnt]ޙo2'k+, *ga~Ɛ$.mbTN0 vt*D2N eľ35Foۚ:HCklb7z&x*2ӤU7qeRFfIq̩#5)<s}x\UeݜY7"2G-|gem O2P|Ȝ+ҚL /";݆<,\ )HnY YYM0vMXK>pz`Jpo*~{? &[P!װ%X8 kx0pEy pt`vbH.~μnag HPgEa?O:< .wF~ NA`V()8uv˰ ^[4~  >(`T}suV~jze x#A@x avMfgzx_뿎D#?hA:hPN"":x |1"B1dG~nPi&ֈcq&1S=V~ !EFw&67yĶqU7)Dpj6 lw5=6Uj1]Zk,$D5[ЧHl|Ez8<*w*K5yW<Ϟl#_˝4ari5IX.Gx|Tup-6[5ѤEkijgț}8ns9?3<8lqb%RSX!vO.PpaYv 5n0 յK:rurF76zOYgwatvZb$?ŭBOO!Т9EF~eT6=z?0+ YtO-i^5|~Ԗ1R;bG+{2O%H&7*m4N;jC \|"b1A^UF|~~-\*s#cvn#{ҒdG N1'~{MvoqA#mn?:k#^ qsP)=*_s.8-#A(TgpAkD8Y?cߟw3\zOÿq8#n$؟=C\_.[亊/3ӘZ,~T͙O0Y]b{ DqCwU1w&4M.m> ?EE6㔱$,'$'h܃i&+0= gɮW*>b'iA yǜiY̡ۤ'Y3yiYp}67>χ7h{#r[$+βŏ16 7x&pHm,C.cH^ޫیܽOZd*z2,LZ=)ʘ7 <b mGV6@Eed|\Jdet,C’{DSܯA6~%"<#CӤ'TPeyMy#̴:HKɌ76#$z=4 5X0y={pp` @mtnbKP?yh ?_GEx 'auO,yxPx)~ϿW>6ob8sw:Y4~p8z^}$T*ՁwK*B(g~~' Udm.B &lBeBUx#.| ރ;7 "<;bmm?o^x1]cx!o ˰nf a o{ x *D0=u>ȷ}_"$eG#TMm\!1cmd&d!%!)k)IFP^ 77"CAR"Q `!NB8PHHHj'zohhA.X &9LHIosܭ)ڿN W)Rdi fre]Ls 0(`%aqfJffЙDfoMJER1 }#h] M_nթrc:D16B|Lf;n{ރ:h}H5DX+X0`!{X>Bn[/lE16~?mfv ͷ#TOjƱ5s$#dLSGގb3zx^)jYIG#؃;aLjZ)JXD0LrZX7Eg`nfHRh.4,1KrCw|؇ zXIKD$;/>]4Y_ڀ"x7%|濂=x헠6df }~KpHP> 7.WV` <pNC(L\(R̥|O(Vn&K]Px$Kp8\u .V޾wa\4!m[ ׫qhuv ޾y :b+Jamf`,\Q,V/mOA)N:Qd,C݇Vag W %Ǻİl.}qHұnSoN<6߫{@Ty6 wGzOkZ~6WPq8D+=P~=`]U``2—heH q ҢV'WtqL>T RDn2p*Rh.fHl#PSZPc0p}5P=o8q\s](m7| ͋:`ɩ3ql!,9G Ndϔp.C]!· GhҘE;S)A$ր3Ml2$f R c9h0$IO;{Rm0>NLHr-Al0̒8HY`OM Vbuړ@NN1M !MK AAoޮB K|MTvmK:O3}L2VF GXt <RTgx(&dv}إN0n:hrqxr#qLvcu $ uV14AOAiه[CC(N) '{ 0 iة`?lsrz?k 쀔 XYB] 4BqdTU`.Pzvn3*hR=mS\`U%@6PXci6aaE!rȕmp[C+uQ:EA^JYmuqr8Cj 1ZAaz]Kn: .Il|7X=JE`(srr, p%~6\ {7w|[e]| =]#`l&`o@;q_7P o`ѧDY1||\1Bu83w_r^*AS|݂Ixv`|Im\z>QҬ0*p}.>~|z\yP|_BDžZ;YѫAtPtp+uP;S\JM @ATd`Z9P1h#4[Aأ#<UA rF}qIp"ҐK ;jA[l)LO@ kN.MK=vtZ@V<+mR xXg9(BdJ b)ɵM\*^Noɲ=6;ũ)k%( !s=_yM.[&]|e*>SDȈ!;qG9 - :!l` &`EL#Xd9EL #-C+nc 0/YA~hB Uab0.မր>}) Dz;!;^t[`!TEa89\Ēq/ -* W+hwzz:DWvX WW_~\kφ8dTzl#M:ОYw w=Ѵ5(0CfG4g*' 02]p\E"r $y$y9Bȥ"1=,10X1!Da"P i蕐=8a6HLG  >6r~Na`.vhm罋ϳhJǩxS.m05RaW$LD5-t^!eppiwj )$>u,ega FW`D!nϮ!3%Ŋ- ,וi*9! [/_MKHYguYphK}&ّ0#CDyzh= ֠p$@.h6FX4I2m Zt%bAό\X9a4B) B;\ Tc}!$vWX@9 V+귘+ zX?+XtQ^6_5+o ?aDavtd j+Eܼ\ ~)H'*и=x9ta|XWUx9&H^keԏ.udV;?]F7W ϝw;/;])|! oBhg? =o i3 _{ ܹY`y-^ cUX{K!/߇[a();_-R[;ր2hn#A39V\{ tZT{`McYp %Mr\Fa%6gˑR2 IDAT]TI  ɹ 56(/*5Hos6%sizeM[)iIK[\=|XCu(YŢΰ"C#𵠜Z2a rDQC~KH^eJg6PF `h>e 2 % 6Lу:c߻ O0:%eb$;Y[FVTVVUwWUͭ)JZX3Ao3<6a:6 ,ɴHI![M6ں=c'dMQʌ=F% +do wwY٠ *!1! bvѳ 9s pH'$xВx?Ni'ͬIX%x>9<f7,t0Bӈ 'BG9KH:jJioQ; ELp9^B<-Eрq BᨩYQ, U9XuMŢAC,T5h9rb787rv#f&x4pkx:@ U_b(+&:LmԊI>vN1 mQENR ibЈ Fi!&+%L1LЃ+GG'mV _eSH&ðjT}o7(Eϣ܀xgfHu{L2(̓± G dj쒺}cꥣ?6|.W\msevB") )OWQM #%4w862E$ܧ@29 }pGpSr]1{HM % ª1UI<2Gp':쒸]M!*(|)`7¥\ 5 ȳVmtQ H*P |~̂QGW&A(Q!JOpM@Xq&u*W0T`¹)5?&p3Ђuu<̭>S?= Q!h=Z?Z9 翋ojC_@`#P7KN > ~x-wڅOMg0)8?@XKZ x>2wa0_K_+_kc᷿xgy&|&|Jѭ < wkߊAC1<ӯ>k1 ĸh[9~ x#[oEoGJַ/o[Ӈ_}\Kû?:"/Gʏ@u٬ 32fM_dHg̓mÉ q;^G043F&J\^z]H7qgSg R)P'Wcx!1&O > !E!Q#Bb4`-EBtPU=|,"aj>wtsscFgrDHSh 15c bb Aa%<)LUa'k%(Nyծsz$EG:ӃUZ hGM:hb#@,"kqӼyKi}`& \g& L{D!) Ld! TBsJbHP蚢v:ĩxs"?Iqr|b9\#0yUe ypA t'#%P5X}>`I-P Rw vB ų9I`.0c 1<ˇ8W`PI A@ 3e+jL&R'9ƤYDA֠c ~ӓe y.,s5>!o߻[)!"5*@40x1Q ӈ cP*+*!C%(KԄxf*<^ȃCR%(RHACcΌP_[1)ABԟ?Z֣_D]ߍz@tF'!߆HwSX&Y`=Xx6{7j>-~߁l=VW@_1~:ҵpp ۿ kbߴBf{1&j\n\5J"2ұ 05'5_,B;&Rxip%ځcx)6=I K%\|xnnt M |6ay vag;:w!su:o0N v~"!( px1j<]p_2u P 0!c9(Gc| 8R`Qx_DJ)b+R]AH hH$V-!p38@9jx.xmyz`%dX0 C2q GUx hϲ3WwG)~NYbB<Bp`(ʗL-Ü9 +9^=HV#*Kq5.0u)݁ě*(I~ЈHDhDUZ, 75brX+D )Za L!N?sDӬQVOMb'ѱB `D Zdl|@A$Q_OBl7{ۆ DC0izJe1HPGQ*L*ʱÌ3M_yՓt _eiZ^#dJ  `uu&[c'6JO^mt8xT ()QbL*f&+T@Z ^ hW{<߼K91)MvU|qu{2Q<>F5ܙ!K Ŵ[Lw }vz0*%4R~T pґLTA: I U8'͆hTc=InPJJP 8 K1ď~dB>7a9h~8 =IMX]|o~' fYt ODs-8sOÝDD)]/j߇W#^&as>|?۷;%Xj9-u>ɘ{r.,? ߂U(_GAڎsp\Ԅ|_WV0Fm84^6΂2)"BU͐Eǟk:V,݀yJ9sTPi! O2mD*7qMH%2AzTBi@J4AZ=B+LL̕"kGzu*X`G*2 ) wB_8hx#Avhͻ콸giYFw(A _BBQ]-u|>BBޣApނ 0(8x~F]Xzbsr@}QBV"l OBWc͈ēb;OLK(R 8/] ā[FT|U8Dō*v ؀2"HG+"N!R jx]?ypsq6bZ$ClXJX-(dVoxM~ˉmvz-/~3)OYTl1c'#nӦE-AY/I 8$16eG(I4QP Jz Fp 4@CE!!P*f}2>uAht"oU9O/W|~KO5X2%z#9qm;ӛh K-QHx(+4r@ u'k ou6ԄƁrQŭ)0&-mZ !Q=?Z˗g' \?IPs{ nl0ano[p|ϑпތڍ ܂tCֈ4-åaXT9E=4pmXٌC͗A 8:瞁럆AD@݀OQtx,lCXlL\X3u{_Ϝ'#٧ݏԪp6l=x?۷hk&./DmP&SIcpMh,Eh wc(Oz ay}v=s_/ (hCEXBXtgp74@)J\B"A, IR#5A$ \to!$ AO+ h6FɄ4)"ը!dP9C"wYɬP$㘂>#* -QsZaZ}r; |qL0t O`N3Afo; adB !ǸB͊\X&U cBhp&H44NlP~v$0& H 8<0CXgcM4 i< <"T(5!@!D\>JEq:"Ztiڠs@o`1@=-I J+Jt$΢'h E8M*`+ǖL)ҴFѤJ_`+AO0:$:O ($@ޒfǤ'3rْ 1G7woRH@bZGx3%Sқh5Vf,*0O8_'v/GǮN:!xTD0(˚"OfNt!p= ?-$B{ĬA4/cs7PaZB&ÊkwO_ Lk`LEx[ǩ! .Gbf\93YH fʹF#Iqv!9.e&@Ǣ<>%28<>gup?GUD f9@ɒnY\d 3\km4=ՍϦ?7s7 XF6B,޵tLn襖2qޡ4is! YGTNB ! Mda͘&Td8#p@VHxhLgLIB]-Ztx#``KSƬ! ϐ]H ͎M~?fǢY2GtQ)-wFj34 A=$5) h)%!)MDQnDlFc)Mҩ-I*, O4b {((R* >Cs,CJRѤNuV:S{X2釜a}x=Sg\*U1IH0>AՑ S6aܤęw89E1`IU01IÐmJ$SBoni3enƅT73-j.a(2JQG 'EPPkAՀ"UȐdBO}YVv8fi5~Ƨ:a]uP8Og0Kx|}495F6C@r+h3eB1c$b ,&$q1m$)-0dEKLDʩh"6Pi 2%इGO*+B qP$w_"[ / yԃl6-h0y70w2x qxx  x8iyl ޹ XƌfYlCi g`kn#~~t7jE7eolÙ8ws`O?-h7kP C{C#\_%oKzo1st`|56Bo!(ccy_560D@& @(+<: L*I]@"K9bE ‘JFS9Q4k 'H=63䅧LaqQs))K iHɪ^H*:Z(N!IPy =n&&vp;5{8dX3O,QVo|&LD$c+}ey.1/"]=L{CrlhlmZZ9hxK+r1"AJ!pF@]yhHEa@6ږd/RDȑ%3&A!4!c%<2PÆ)u IDATKR=,XXZL9I85VLual %A;ATtFC"wGkmʻ'rlx(28gJJuM$NyBQ"]&R y4jOH`)e{qwiEϴRp aAQq`6yhTSᄣ{npv$I4GrLYÓ ɾpZ2H$2L*o)A&[սwZs[c6Z衄 &CyJH Ifh[2I.n9JUc&NQ1sՔ4J#MN 6 ,J )A}.Rs.Q >R'V?n߉w)WpcX?_MX{ .}_[m bZ}EK1la.F|޾ s2p+p\ pCHϲMGT1w &fZ΃.DG#?I5gn@$phZhh4"ט(#u¥^M9F+dJ2 k2HSE'68C3L`Cs qRRS0%1)d% Y@MX?W9LbBk D$K8_Np{EqI@Ith`ɑtEylW &MYin' 74EZQ#L)d݉?7_Q0 :c@)nGU黠zic$1,FD:.(#PGx5k]  JS mIێM|֨>W?g- \ \wv;\'tLvKL)jqކ߆YPODo?mx{N\W^z(>&s /~?UVrSGHp3˱br,|娣 څoA!,/!(vڅמ7|xUډY8k Vl!لFq(nQI學u0w:z~g`A-^YptQ$(EXrᙀIJhS*('fv9aܤd@V*KJ HkL%gZRL$yIT並0b %R&%!1#P0ƴ-iK"#\_1F5$ѿW sco-Gf"}.J*Rl*r\D^|#TJMMYXs)Z6wG; jv5g[tfO|ugqj9 @Ng6 arN` u,(EԎSYy kyM LD"QL' l\̐2>_ݎ 6`:.IaڇiYǥ AI* |F kP2X o}N~xW/]w*{B"CBJ(J ((%)rB1 "q+%(@&@ظLk*qkop1/ߐۂTol|o.dRA}kkqȤ"k<~rK|1\~hE1ZPT4FJN#rG=pR' <3 ''++sgxa 3or2,Q($ (#.lh$ˆ~KTrŷȭQ_ħ&aEi֣heCуa0g8HIݰo߅EnL װ|)2L޹tƿYq߹uèaM0t9Ŏovނfn\' 'oEj1?Qv7Wco ;qS>\V?ch0߄,c!Blf{Q'RKc5r:,e߇$'pPEmµKp;U(V/fĹCV i(c3Y݃lʠfOg_@)%c+c}??eMHǑR$<4ZT1\8hȦP zh8=舮\tLei t`f #E*<-N xK9 C [c!)(:=v Mj{~kUsY2`eA} pGl$SXGC_xj RicǬ< bc,9瞻l&̐jVIhA<2Adp1`!$1_؆#9-YhF#p8dsml()c>@Uw޻wpܞu=p O zL;d' C(!:^$@ןBxr0J4 ׸.&#\D kXDGa]-{] ͓8ܔKG m9끛D _bC {<۲& -[ ip'@᠑(!I')"氩lx)VPx?=aE-̓(7GuKKQ23k<4_WXlwXhn XW`@RHPZ(}E"nS V>e(Wk쮔3!EhgQ6%>sUCb)3<\wR7 ZYhk2Ѳ',yE5(,p̡PZ mh@ ƓGzazXw0}u>?#85/Ay7_J+-W6kn^ͨ<)iB%H|j>qOg,⼌;b *ShN#E#5`4w;wN Z;'9f9'pwKpׯΛ.ӣ1ƶ=*$&2-;mYفDy΃h OPs"Ux$ړMƜJ/y":Mڒ:LW,@^8Z$ :>^`<-ll# ӸkA!`=Xe?V:@X~辴! On1SOC.? җc`WEl)NU469G.fa-K+pg3jAg60BTwau- 35\ܒQg".ތӐs=#|^~&_C/ߎ6GA)߈Q oO~N›4Ÿ|#: >77KoF_#$۽$֊+߃cJ=YV ZwNםHMH.!Ve2TQ*;2B)!DZ AHOV2o'茥rsN^X|kQSM9F97eg`Jm2v~%ػ~YC7]MSch;fN.XYѹټu ZH[9=NWFH6(/Q|t^8EVgOU\[ -|LEt|t,ґBgjSpbs#/a) .ZʳO$lܬUko+noNpws5C7/Mt;2X܊Wp,%GlxŔ'*Fӄۛ#~e^[oufttRdĸ;Bm]O+~o.TO͠ ic?AI=^H:@uVѦD`^2z|WX.T@Js`1H:!c# gB ߂紶2MAVݯ]jT@]g^A+[JӾ Ltzw"݋NT_X '=8A)BO|4^E;cpm x|ޅ'~ނOc4>ND~3Q?x߂'>o= ~j&p~= ﯟN +/ 48vjPO!d$O0Ѷ[ 62Pp"Bh:hfƼ=*ũ:"cq.0b~ u""Rk<"=}!}"şeYqj"Ek3@:7/bZJEPuJK{_jDϭS$~~H5wXBx?ԇ~s=|9_rF![IG0$d&AAY\+U I]Ӱ2XHRϨe"*ʒwE SL:@Ya:S, Š2,jer+HMlSwV#!c)E8*oIF$.j18&'z6B?AXń7.pѴNh#ĸCn 9۲4jez~U ׮P?VŸR=6#t:Hb qzcL7\\^b>d3\ T$Uq0@)C-gԳuAh.plEԢX_># ܂6-z09P! X:vx)#AAУqp,p44{MVŲH_-;vU(g*LRX"( #!L*rˬv z[|}] G %#E2#QbfLWjAu <A`#`dҒ JBѦhciV^|/>a LW%52ɘep@GWg!)*)߻F7ڧlU/N$ԤeBH%FhA'Kp-:TO#UCʔ8U, IDAT*> Y(cUSU"k;ئ.amq:C+YzM];a0۴\zf,V(*3 JaZG[p]B;tC7-!P$9Mi1I-"?oENSOԋ^=C6H,*N+?SdK]͚׮5Jo|@- EBׂQ#Э,R%v%2z..~<|ĭHe,9x`h:ܐcUGxMU2 =4 A@* 0 Bia%8\ !5>f$4JГ=`P4B`MSy_EiAy갩ť):GJ6XD)h af@k NP&-"y2mA]4B)G;? 1zKB~~z?j^ +ud6kgw4`@XT0oûߵ_`9{B)"/ZD0stfTŮPQ.BH9Gd$sem;N)BϏ7Ae;$9 b~|}¼C3?7 Ez,{}'Eyp Eh5R;EH!r&.8Wx( t#SF)A:O'Umm7(rc0FѠf'S,ޑjL cMRK;w1L{ &MŬaYLX϶װHG3l=2m1^d`j87r4ʳ|Dey\_C+bS8Бʩ] 6ŶDw!TQ#Qzt 4 $Ki"4ZcVnp{ޯ(ry³<أ  GRpB4,|߽@]mYz:bˆ1/T%2Ժ"?`丼L7xk$R,'T WK[W^͛oM{Tqxp@';tFa5!@R ` ')Z\ )}љSB N<VbBIz`Q C-)i-RH$xE*0~`#wFJUͼeiV>)s1k!T|Ngjݻ`=X_ve0lySXA8x㐬EnxKȳS:vL> 7` _sn 7_'iXEpIp"p)e8 }>s?_{9Eǟ\hyۑ|$BgW^ZG/?S/K0K~p|;#|] < Oi?UXXGm}ڷBoKi|'RWs.Ǡ ȴNN dzma 3+"S@ւ‚RۘliL~CX Q4c[`$t NQӢ 6V"UW-5󄤃4w:6M`KN[Z8;$yRӉtv;%W7(v#,C%Fɨ6T)z#n4fZ w\*YZ`c^hR!e q\ZҸ4=ܡ _5V),НE ZE'u) G |YܬHJܴA[6VXP[M &^4`sf-,}lJ-C6& :SgԌ<1i^7n#uiÔAvm9KJC=pL4ׁM’}ll.0Ӈ[8 h m7O"E5&5wvrܝSC$Vu$6CU Zj 0JPKOEl^|@*JU%S4;q;5wxw-NMO(].Iݻԃ3r [ Tw`XMvVI|~wݚ;g!ITԱTҩ@sDkI6BKX:#&#QiŀѦ3oז#\٫Hc6)X7[]yHG>jC=ږ)J}`e`.t8ރ>|sqVᱳVGx,_~'9vt*ݸ'k0~@9vxv/jBoCz>NC.T5k>E!}HTFV"VzL= D+I >Z7VY:h%醐&mxE$Bz.N̪4Z6'm}Gv i-RE3ZC*=L;E?琭V!4I BLTL G7yE^"O+Ѕ[AWx|+zITz6] 4<=aQ hrT%ԝ`5() ɛo~"Q$yOUpx Q U:6?߻%B(v(m`2:Q=' |S )-m҄{O54,IB^SnXYpַ"[@¡D mӑe9 Y’w 7jԈAזVy4M J :yȒ ,BTbS"Uq& ۨHAzF6ҳ}ZW2:8bo .*H$}WcjpO/iuq`PR)p jX{AkaȟZ0I|2= й`lB@g;BkցT#EOk c(7^b9A h3$H5DeLu r.ӔQ`K =O*0 )Y%Q`@s3D-h|qas4!JM ֫4V1 \whHNn'8A"Q ~69J0YEƈAU%(p*_$`\(Õw旿;\.S@{ĥ조d!16abأ%:(E4! D(!XTJC2Q4d0dӆx#X{Weiu&@!TNhJAt-R$4 8# $. R0D6Zj},Cx25z>_6Z5Bavkg`vũy8ẒxcPcpu.sQ*i ͇$"6?\lf;"C4,=7փX|RQ*d9q64`{$ɦeX`;8pPfHG,>,-ԦS#k=)<4zN#|QIلZ4&Sy"Ij`@nԺd:d$fhV ƴ*@>UN9jr992Z vo5$&"`v!cI[KpCB|'CJ!6.7{_8 y2N:0X:Qb;B $y >PQm@JV7yp{s2lW(U46r$Jhc!r0:csŶfxIeM-Zfk(&5ֳB@'LAYt~eq~G`$xh| RiM롱IJY:0JtK1 V8U@t;s7тfƑS8ǀ ŦK[wփW~hH>~ c>GnKbk蝄lƛ֡%*RVxq.wwc{+pEtށ[@> g?`XXqb d?:_|s ?Ĥa|>|qHm 1cdu^{7cFcߋ꿀uQqxe3O{r n1{~6>ic/] ߁pmuP1~r)~h5RAh"t1gR ב 2/jQ\+fV {ta:bb'Ȍϙ4E5 >Gi1f%)ۙf&jg)戽$0ɠH-nTc(Qq7xs"S슖atfpHWv+e8M81F+w8'=YNa)2m,A>qϒX^DCN1HH`f+rgY9 zJ`k2jepc, Ţrl=i4xhqo3\~]$z"x]&U l O_# o_nQRƅS̎675bD5"& *REz {쥁6{]{*J>\j3m~8cOg@rnâ8yy%5Z{I}#1#БmeXGQ5Cg³,(8z6A 9)7*'8ljRwT̮A5C㎻Ƿ8X~#7q"=E.Ohwy(*cnr2c좼s-!2hѣӏ T0_TWQ\G_K[y(Q6rBA9l0FotF_CZb3И0l J JʝZ⹇V ~#l]T8{5` *xLM[:} Q>Ldr`}`M~uWQ8 PbJu|ley^ّp|1|PC9l~Yx2At{ L9DZĐ'0CKbƀ+AYX- 1Rbd1AU e(WXm)ʣ}B[ փWY}=^JbԀ1L`> ݽA_|fw03.f#xǿyk1oBw}hg;ҿVrg2goE)݃hMk;xEpN_$5`YUp"Ы܎""~m=r9 QcG+;QGه{8'oނ߈V]_ә"K߄0\> GWo{qڲ}` [ bc50tz0_{n!4*14u޷'{;%_At=aQ \J"\Ec$u3MBE@2<`XL u☕JG*0AGi%g8p9+=&0tBgnIǒ$Y3k\YbmB4ӵ$b 4m0MN d,db*F*9cг kJ:[@.k tB_Yeu[߰uo]=7<4)(QذbDN$~C'%q@Ȑ XȲ()R$EITdcUuUݪ߰*&)tR_㢺g}^3:fCaQYWG]A]&u&E~^j/tUh2cQz׳uN}&ORGum WC*Łkd8 w*\j҄]ɊZzIn´m&vpHYy\d(+IjsҮn1Ƒ܊e O_;d5O.TJ JA3!IX+FQ ~8".CyլJ<ሬU%W tفF9\SG IDATCO*WXgC5|z%LҀjWG L.;( "n651J\aAƚ}W9lckhi ԾV @/2Kg c|-i]Xxf96t}Ǟ/i]%#e,KJkfU39 u0 Vk( 9*{iE%H0`. 2I{!еnV$Uk`w [ ڌ. :WK: h8VB`441dEO]x5=/(nN]߅B\!D pDXeJF`@z*=:_6(!"וY]3  x>]gtĚU]md;l.j4Hө }\y67Kp}pxݦ  .]o},0/Mj=7cg)lFB߇v 7]}Q a%xn?|'<ܹ wow@Z?hv#qcO$ڏ%}6 4N3aG>R./)cFۨ4e F#RB`H] S)dt$^;J\zT\Iųp*Ć_/>68ΠTn%%p^8T%mR.MLvi*Mr̴" x.3Hmͻ$\ *gʫ,JjnXmO z`.lN3L%R0k% t42>FzDnt.~lc_o@ \kmbhlu/_EX A5[_5&E&i+^%8Zyia,+'bkCh֖ V^|I+ȋy( ig)>Sbh˔E b߲9MGa_8 eeyCo˰oٗ/'_= 7£go/ϼ>MJ}> .3|6>gom_ xg>/? +SZ,®]Çx<X`{ 윞'}p%ؿ QX ;V@~/[ݞ Tf:;`@lFכHZ1\BJ v] Y*DWGc@Y3A=2ZW jUaw= kہI_R}hRjPB*5ITH4'BH DžJnm…C`A%f2ŭ&UFrM&sw ߐ?^C5őU8PI %S5~'RH.vX9ZQPjZ$6A,'qO7T)aRa 2l]VsPZO[6 PzLJ/uF|r _ mor1t'e~PWfȦҧj>f ቃo*exnh6!u{ykļ "&ZPVz oPwaI']0; 9˸}p<_W-,GG GIx߃_C…M _?KJ?NAM3bI{Ljk ~F£w/>n +? oG O{NM;0=;p0? x5xˏs ?rqR~5m3#ç?7p~`fNpT`,^t_!F} ?{"BWھ\YJ* MTig>GLV:aR }5Sp0ueP%(hZ@pBIsE_{^: aF «G GAY=h-Iǔkwbj^jʘ1<+ ZM$*beV5!7 Ml7p5A94@8!V3 Lڳb  SPFuʢD*\ѕ " y ߅C/u{` \A]0n¯:d+BNMX~ >< wu)L'WѾ*lmگg;w7ho%< nnҽ7^|6+߰B+'#}gLsp?83X1q>̣0o᡿NrdPe׎NmåkfF O/pYSz^3G- }ryxIg^{n\?|P&sq -,,ô䇻$ͶZ%7nβ3T5j?rU;VQ%۞e~0up6èI+"HU*8i p5[m 6,7n8 kqV$[qCɊJ7WLe̽(ۤTjUZbXu9HLЂjҢ ˮ5Ε !SQ "zeZm*UD 8hE5["#3}!/9%}g}v?|EģE!Wus,e}H_bh@@Mdd7~MaB/4"T0UC0*}1ӱp8sQvv#gqfT}&f -!NmRnzl!`?Jō.'ձ13OGq(Q`cBSZɈbI]78_#U=F-*PP$Y@ZcDFUKx/Ў׫ι)Q!`D 2a4+㵯Zq+똡,lzWk8Vn4o{][ss*䕤vȈRP?N d|CP&ësUARg{/ 'BTJqi T*>,|"㈶7>Ċ@)s|k/@n_^cm^X<{,(s s(A6MIO'{ɦ,ls}#9 r6?~Z=>Sk> o7A:@~4c4px+g܁w"'[ ;Ofӏv ~>ϻ~^ޅx cBx+| f`UoG?v45GO>l;6SVuk?gx&p< |qx_p-&{۬ %ӳ}|os~oS3x(vwd {%m?bj\Ӊ%2o~_=wa#GѼ-+f(Ξ1P۰8n,zɈ[pe,:x ׾ ;~altssHg$lrC$Lg0 zű20heDEh[Y5 3u` Dh5h, Nx KaK $%3]IiS $WIjK*RtƆ*1cA"dtĔMzȄªakH`.,'Z$ S 3vP'9zeІDأJ 2kɵE\# -+N)KW)Aɭ0 &DB]@9H-}iuMTdn`PBFhL'X wL')sf @36y@^d~KFwHv4%PDDk;q4s(G_2O CJlqp9BYK`]p彬ʝxp1Vb ' m:婳t۱Se6n(%}GaŞ{"Y3߳5ÌIhJLd"GcL5ܔC2?qyms#SEJLX~V([y@7›#K>S(iSj0X ̠š„l :gg9OVR87$6 s#ScNgL>!GBXVb陴R_͋`0I@ SB ji!vƹɮPj& OFTi%GԄ<DW7!R(&BQ)5ZǿP7md&ɭy ! r攦ŧtO+hXUpaI+(d6%n:m n:_SXyieFHi .,)*]"̘bX (^oE@.Z*FrHR$C#-*:㇊wi(Qh4:rj^Q՞i LBrz{GiQXɔFRɑf¾µ>{L=s`<;#{ol™_͇dpz'M7t%^pc0ہ+l= !*l gKC *`vlo%`I8/ З v쫯™ QsYa#n|)'_Ih76|?Zpyi0<<|C?iV/^ਇ'w/T7få?v WGCkEA7Ptl%32֟$)ŵ>3[Ġu;sdguSF`*/Dj @шk-H4+gX)vF2o-δ7<*GMZ Ņ9=-}$S!8#NpEHa:0-!#5ZmeJPgjQkQ&dWY=lG@2ښ$gۤSzhQ;#zK0sdUbuĒ RT7ByJ+ -C3e-Z馁aAfHUeXbil# l;AY)ָ66iePEjPQ IS-S? 5Ll@8KgqKO- L A]%m@Z \p;18Jb][x)T~$8xU xhu_-l\ 2SFGLt t-FvY0 h]!4j4D6*CO#VX[rp85aHxu#@P0e`R*5X *\ Zx"#M*-Y&hHn`ku %C!1k5G0'#)pRH" @H 8 T( hPG\^[Gh,;IhG4#k#PSAœ?"4Rl͔!'*CbOB VJ@f ڰ&،g%bӹ _ %4qLp4ZY2A+%5ɠ=Eb7Dp-uIT7k31|WAG1idMS&`?Bph\UxH~ U~;;pn{;Y\˷s<:x%3`:* MaE'i(DWpYQﴍ8n}??cjNgf:9 w4؇8 <ymp:uu>qq7N›eSn _}$Pو|NoCHn3I}܆ï~.ӰW`o|K^xͺ\}W/ùᅧ ~SG͍L ?uNVftg`]훠:ȖMDżC4}T= ⸺eNep)ޮM)*,Zapdߙ|͙zh 7z^*=RͬVc&xa#+u!n68\r0m? TXSBOѪ[%$ߣqQi<B6G̘6\N^rN&9SG\-pP`=S0Mj}3EP&#)ZXߚC4 LТ !UK:|EbPA{9¥H{,2k)8Q_uGt@3*qKq]'zQ+4J`ckVyw!Bi52a>E?Yg{O]KoBi{X0 =G|8NdR2чr!8SBX̖MM eb-Kkg'b"3f" CP@RHeYeY**TrBUVQVI*MbI#@y0s8Ng[d1<}zZ{}ހuc4Fhdk쳎.',:a mz*3`4aJ7 @E;dFM*nlBH,QrK 0LL "E;&t"uSUT!0!P/NpD|Jӌfd-J)XeF +mIM!5 :0%X20y:7ɔ u$\VVryY`vB"AEaE!̌l (ԖؓQ%PcN]c7Rqtȶ"D:Z5{{5jE\E@%בuBʖ][vmHŠ`^ǸvBe2K&jZl!MC.@gv{^``]ohe- %YڦAX(Cj&t0+<.iV١ RV,v`MG+P؆+o+ZJ̱b KeƐLp"I MbRI7̨l/A*POL=ֺnlCM`kC7O(iP_U8t?\y PE<\o;a:՘5P4h:{ua2x4\'rA*Spm ٯW_*$#x~x?xm>0ϟ_|xYm0_:WBUGx `Rզ.' 0HS2%Hk|'  / b;'&  2laLLkMiWrqD3o;!w۵jAE;&gĩ`)%QG^pFwǔc'#Um 1$SkTxR{c2&qZmZHsY0#y^f 6*L^\/tbP "L,e96qu Q%asACv@,՘auRmh e LgH!3LNK`eBHI'#4tQ!TNBainXyՔ3mrɊ C:"tTb()HD(3&JfZڡ1i,]]NP<{:Fd<+<#k09h,5$gǔ>CYf&-e 0Z';<8כ@nz[c:p1 xocT ;\l}#e EOM3Jt!E WHO@ {rW H@,y<$9GcKbZZ JWSX R̮x UT[%בG3)ÎaӤJfU݀"WBBQXp]FRBS&(ccH@F  [p60p¶B$, 6-“qĴT.ضJ<4r@n[ϾoA>g- ܡ pi ްpi8E1)A;-/ W_*{|n{.&, 5`0}pY8.8| .W:x:yxIx5 a} ξxp989`2AVWԻ|Yx ~=qw>xts?O|~f}=>0# mAT_|Kp.xgae\ 6xu5< 7o_TwCw\ʁʶ$t[fOSM+t;GJj6Nk29xRHH3Kr k)\5!e%IQ:7 9)ѿ% F l U 2vqƒ ͺV>E1wE=?6`ݽ ]N53$4eGQ[XliFȝ @iD;7"6cgІE 4n &2(3V=a(8k)e0T RE' [|]`2:KQbKR@9`CsC4>cOaah5(#v@RlIF(%; cUgWwd|(TV @),R+8YKn31{dhhF >"k1) D cN'[J Z=ͤ9Bőn@M/%#9A-:15=Z*_P:ZIVq)˸aDk5ƶࣾiD'=Ϻ$Nhi4B20&ˢ䀥syTe3B2J$9iVD<@6FL NB>Xg"nli鏙FA"r}Ç ^7lJ, xK{w7FeoŲ s>l<%Qy)ȆQTC1 Q#7i J:QIbT*G!41c!9 9Ds[$c~O2z^1$3ADҍM߳9hON@nՏ֭/PНv K`ʥ0i?oA[aC*J"0:0ԛpǽ:MVi8r7rc{eg >x >?r^Sί=W+o0:ROȫ߀Cw5z6`086Dk"|}MctxN}Ϭ<|L?RB׮hd_25E`NK^Ir\sR_bUuoV5>Pey֨z c4d7ȁDn3UφoS&6ꈳ)1hƇfy7%ʹ X,8X)d/UNe3-5-REnhE(m~C Eb1^^MK6S`j:(߳U}dh~:" F5V({hrBxF(En; 5c3Y'.AVbm#7`úS9 Pe7 7NC=M{F1ibxhL:awE`>d"F@r5LbQ}3WVgv3tOzLG+rU,%>“o$շrSje{+_&,a׹%7m؟M\{}n}U^9X%ٽ`Aɒ zORH CA:C(pfφ F3rľ9t=]$_V$e (E,8Œ>gIb%:pPY%dPQMD,tVDʚzϜ2;0ӋߧDVqkZȸo1P(jl} r:n7;T.OtX3/cJx:aEna䨥 K?f:~>}f5ƗW,/k/0̃_]^j4jڅkWa윇;ʎJ.悚quQo/KP| q.^_7z/A:,A`ϭo '& ֢0(Wisl+Jian #hd-3 Qt0; D$hg/:,UvL(ijRaHDJ<ݬ#Z1e!Y*o d BG"K22eEL T0<'杇βl-Հa׻Ƞ,H6ZBa&p#]vVM IDAT%aS*#HlBHvP8˨hl& eDTS"AI(HFLj*WBց%" ;2 mdꦬTG]ŝwmGYz8$lA+, kd='Ц̎bHAg)E8l3G2v*a5aI!ME]hYm&l2-)E(rdV$ֽCK)1pEX B]ZDA`FR?GxIxI({p“Fxw6|cuȥh#Sۑ;(9SZeZYd!kSkXR)!hTƓ:%&||'_c+e |} o~VnC* "5=.nH[Ct4zfa@B?ٸDȱm@,kGښO!L3mn쇍O̫x0'p$9ƌjNAU*Qɓgm`Z3 bZv>>ǠN+Mh9lZ%@b ;~y bL{r.Č m>M mN-訤"f5c0EQ V}&a.80(?keKwRU#|؈;7#ԉj+q<.mSmﰏۘ :nN;EKw(;hwK<Qa.v%\fAA 1]}l7 5 Gr2$^a7T 0n)OXdE=C6.~#HM( Y 1(e t_է7x9Dj:6̂y { ӏ\F]?y;,,yҘQK4wf'5ÇS<[r Pʀ2NǮLw3*sx6( -s}GW7_I72ؼpOX\z|Ҽ~O>jy.?Iwl~, YebdY2 \c(5+ "Aact?MhHlm2wa$W`8s018@3qto6;~`ޜBmGo'6g X+;)ۡ}ّqat;Gvȿ>|/) .p[VcX짝vzn{2X <7D L O\-Ɯ}u aƟm[Hu-ı*bmy tb1}&31=I9*kog8yI껷iƽ=:Ka&= ֺet7taJHׁ}ܪO ]z-xv11mX> PvG4Je2#N-~vށ#k?݆8f = SWS{U O¼UC{a} _;3p(^'~ '? prz@> 0\V K~ZXϾ'W g7uC0@7֞+>`Y0ف x߭D˰uo0^,u [9K¼Tdҷ^=՛`C^6]޹mgݽF\o[5.vֶHsĶAecR>5gi̮n1okfrMGA` ؤ2#Sm7<ǰN\a\&/d61& 4`3 Y]`v{AlV a TlHt&&;.0𻘫gRHݘ)$-aR0ʆ"7Md&چi{0;rL"P@8nz M)r&l ]PhB50yFaXᎂ4f̮%;Z"dvLBB&fI cbgi[GX]cb}ߌ⋖zG/VWZ̐"/vX )]ױޚco 3*#{eCrzahuCVLw]Gq׌'.]#ϮDƴ9S1W \) i3 ,~dpvξ8+TMKgXD#$0L{qJGbPɜ@/w~%!c4ְ3AjխL"&p|x>`wvIm͔OM m+*NwmFz= ]kLƳ*L ןM= XsP[$SupjarVr ̜Ĭ=G O.R0jf-D.-!.|dR`B;toe6MI3G*9r_C|Ĺn_Į]jdxm6Z*.ychL&J_'^ yș720ߚ|#9);Mi`ޢcB1\g7AMM\7`Аwg[ZYr5BZ<_u0!b׎;ZC޵s1cw-m7c{0%ѦL,8yHŹktұQer[gҵ@:C^Ϝ[BAjG+*X&iZ0Lag;Nic&^د`Pmdxhv1 "n|8q5uy=مKW]?[W4q%Z:/JyJu</p,ynA~Z}pǣpu80<=c4[ccw^/^=oso}=iKEMЉ=ڼ'T7;[ ^7_;ovkvKppIha@|GS}=q8r>?Uɿv__9w*yn&]7E/ϱ1SO7iu+ތPbMKI(Tyܭ D$6:Θ1gQ N9~E;ч8B* aj fxsC*3xz76-|saS@ϵ"R'P4_'g h\GHP]!Q8pE ׬҇VɝT.lsxG؅IW)t,Q`Hڸa&mɄX`b˂)KCdrcBIS&LIlXdq!&FhN2o'%`gHU$/GUG*?Zǧs%I AƮ*(e+w [8@EfcdHH*Ve@s 5b{,$-PDN))UH1-}M$n@mAq< vi$l%GԄ[ V)mi2W j6Z|0ܚC'bS wúVro'@|K!i,pu(ڈ{'`7..MFX9{gNM28Z5Rll+ i7|LXN[lQT}v կo4eEpcY"2&PPBd0p6Q7-KJ@61Ad]2щlb؄wF<7 NMN{!Fs1#[Fn1B) IW&md )$` ҵ1D <JbRNZGs+p%\$'PptpvrF#Â)MGY%ʠFDnr )bD˜S{S24Ƿd7 .A1#nn 1/qhuKE {+ֺ zWϪ#!a-9Ahπ? x'gUxi(JxgWwLn|ᶏL/? ;"ǿGF ppj'a ౏M+^}G'pQ8u%56H 8O{?i2/jVսg/ <,/5dKʎh"Pڦi+Lo#W4^3asDqIG ׭,@2;A2G|em!%sPWPeO%%i(Fu XlQwAf])J'X7 +۞[G :'`>&5^1P h(W}&b w!fr[xr&斁{sБ6LQ-@BDO-Idw|cEGS޲ _о_H#-LF[D|X,,-ڀf7lD96%Ht&X|R CȂMfP,t K0@ƫW)<6a#, ہp>1KޒXDTdO KRσʀPDJB`l2UKZp^32`$%GC(LM̽Cb 0̙b0pHZ[VXpP%p1'dޘ hn`bI z$FM"Du|@D&ŤfȽ2j̎PbnF0ǡg`%HiXڜ9eRL";d}웩9{On&1ZhC,0܁jFԟ'8ӓ,jw"tG%eJj|o J Y2%)awG- w@ T_^A.eLV 3DpYIl]NMP8:b$)}/~4^;B!j`0&"6!Ye 1H48K5 `# \2Dhp+o[;^s7pY=.ħ< R9 n,hŕ߆@uNP6~r]*UX,Ӌ_ 0 e` O_)8QMHO<%dvS}qACLAW`߫7}}u^Y'9/Gޫ'C>~s>=wކ{BM̦~nO޺ ;yJC\]m@{okʗµaGTڶBj5=(H%!R+y4{W߀)еJz#]#JHFw0B@A(ulM,D5 ǠHY%/f\m(Fk $G##(lY :,Y*" |HA >z3C'1H;Z,uY`ب1x(% '(1mu,N ۚfveg0CLKr\aiCMɁ h+r)TRZDTKل UaGU*(5BJ%V,Z=4S'5VJBnlK$:bW>c2.C0x:iM#2B m&[;͙.餩a;IBR3vI02*:t:@iT)axE;ܑQ_Ěd$&JדSPYa( $Ri %[LW@G&ԆA ]MH+ -"^8ZEv i3a\tʂ&:\N p;trPިD 9N'9!q}`ȢԤosErѯ=mR>NK.*vo bɛԿ.zѦ%BOn; 6'gw7 QķCE}@;;E(ō̬RidWN dXp[eN7(e ;#"LUDB /sfhZR=TPwL3A-Ltl$Ia B=C䜐݀Hʷ֭uk}g+N@NwPfV-:o7ðe-?M>AfcQCO38Vi/n>v pq8|S| /Sݰ~JwO~Po?9؞+j4?U8~@wÇ3o|~Aw8 _z^o|(|aԀ_#Wr L[~pa}'amy 6NW>t?_k<ִ:puغ K+Q? ]ɲ{k, #=3'S5 B֒mE0{J+&ZX /SPl.Le#_zZŎ:\@N1!8а&X JJ ceM-{sont7 $fEH*2eŲS9Nr]I*'TeW9|KI˔eGdM)"EIg$И^s{|Xu.ɲD[.=_k ʂɭ^'72U.BiAAtBYu1:Tu@1!hwsT҈g`ЕQQ7E0VwRL['<:xNI04z7dÞp IDATqLcUPBRM j1(݆?OSIR0aożCaR(']N'-.;){JVzmOհhXf#UoE²"E,]Om/h߉U ds:YlOs_aտ. 7CB5x}2jcsZfTtv<3߫#Dw2MFhkgѿFȍuc}+wT>Bv]G\spB5^W>]N@}}w4g?.UéHoO[~ g~6xNxns6,o{;\_{ .^xw=?o|3 s|l Q?>Uc}pƒQ?r?\>?OgbwǻϼEw ௽7xOw)x"<n ޥgGag~{=K-nP!?u71@C~jB VZGiGâ4P<0 nj t8We5{ռcwm[B$TX̆-%xg # ҀPԖS~x^yt L\ ZmvqnzUԻ ʌPՋt `Zkq( R(3xszhs۵twr[ڻ^Cf!Y@ I$(F56=sB--&Ѕz kE7m4qc/_VŖasLyP,ҲUɣ5fh9w>.4.q  ]tP*~ Qr뺖t>Zv-7@b$:/Ƶ5&̼k?!!n_fxh Vq6E~0BoszM9ڮYmc"ʮ[5ۧbY 7h-Xgl$ײe}E 4j*Pk9]>WAӲߴ9L5ϩkAlF׿,DZٙHxD_AY6Bm_0*sLuƺnobϻ\uɓ{@au/_ >M?4l 7n/_7 {xnǕYx/}}p7a6Sꚓ;7kHV+89߀/}\}~sx&H[;xcsx[ΛV]~u7 ?YxN+? 0 5$Oy<~t>Kw瞅w<xig+uځ?ӞͲ.>%x~/.څgڧ oY+S\Qʹd}5בzqjs,R GA60'58fv88(Xjps۔F%)Qkl$Sz1v;?4@A-Ev<~7gII;[;!:"~B5EOmjB ExXk]ꬴ P`2`akwi@/L)2#3b]`EzdP߁O@/F z/Z[2{i]1bF*zɻu ̪'[+H썅(5;dLdX*.BaL,{iCZ]+5:L9N K3djQp*3EHAHQI5P5ĥ쏫 y:p}\z|ȿ[ii\L:IB{%\ >>O,(UW*FQHY0BKv:YBsG/z@@2G* A AodZH%6-^L ts TGyY$Ԧ4 [vŊj :&rXݶ<7)VoNIQIROGYri M,B!EmZsDˆ ѐh w ־rk}db 5n$2Q*Af>`S1nor azH݇gw}̃E(6pΟ{vy | |q =3^v nn/tN<<\:r˿[o7<w0yr <4ey{< w "n[= '[; ݻq | n Exr*~mO~w?'+ܧt? _=N6x`Fxkpm.@?:W^6}+;!-`$M=ߚ~cu̓M@ݨ}.ѓjdKXе 0[ th#¨Ec!M#!$˄`.ɚX-Ƽ6xgJ7Á9P+]O^vXJ?zB}텞-1\|hy; T\Iڵ~-p(#F I#KH]#9EN3jt¦u6Mڡ(:*Hc`FQT =%T*`:aʩƁulX7`6 lqIGjncG6S,Pi kڄAɡT[*;(#Ha[2T&Zh;p8, XL(нjTS%'7sKYSE YM3Q,SoRxI:SuWR;B<@`+fE4dv`XS.Qa$냢5&26B1Ǔ6V j$U8ٍHDDCaxנp.N_M)Tz*YȐiESe)Ƣ*9̤i)KVVI\߶/cyK [,Xs)Aht&,k 0qC9}RC deuY_Rhvs[ٯDG |8Co#;e/=n`\3ڰcӓ#5Q:<8bE"#215jCҶWvQYրY`raٝ2{%l8Ѿ& ɝ㆖-u KۄmcN3Q0A?q @N"PE؈ M@.kDQ3HkǨZ*[0G.0k Vp#ƺ܆{0[Y7; 'NCg?ؑP};g| o\sw=#~3 n;K0g᥋w-zxh|%a9PN|= u^ -aCbd4/HI~a2,l BLeU\EIZw#1O%UVx,I =L2uBl92b,t2fɰy4BBGhIH/PaJvf1niluk]l Լ˚#j,Vn8E98`̙u%CЍ8bT92 ;] FU$t]5M#ZIT~S2,<'tB j 2`&&R-}Ǝ."$°!kfHbB R:$(+ ) DJ*1;jQ&a)\fcR#eZ[bqɲu%@I̝bRd˟ ۀsnEJP-"b[BbY%!,5htL}%r\]S\ZLA!!`T M^9˜B(1U5Qf`PR"T%>6a0r7Q3)j9RnU[4uB iazXjOܬ3!jo!h(DfTW3a]pDUjl%&/\stZ_a>Hh4jt%Л50q сBڃ.>ljl2 gB pQN&Iil}̅Y{#dߧ]GM >-R)!jPzL8Ў*EBSd*`H)ck_[!ҥ0 rBقő8fΘ-2?&!oۊoәjPY@%HW*EڤL t04b+,钿CxDX7uzƋ@s?l©SpazڧO2kCW'_,z߅Kx |+x |zǭ/'% 瞂>O{Gs_9~qe_: {Wwŗᾇa_ у{nk[Né.?/j >N58߄o>N_{)0~1n{;k֯?iXtpW];2dV8<{էJ~p_} au!u 7PN em?F1Pc(KQ )BJ3^|v-ĦqjdF*FB RP;Քb kK0Ā&%= #^ I!fH(7>lPr0syWXJ V -MIYDW(Tk:4WNO!dbY!9Bo 7j1ăJ;bE Akb*M`ltV P.tE#VI3KbG溍W#:_K1'op2K'hRbH@)5 ~!&8UDž%)8%T1Ri>|M@vŧ(;^Ư`0cK2[)nӺgI®VH_RŐЄ>C58M%7\/d: 59yK|[+k35azlkʌX\He!Že"L@*nk?r 7J MF%Vp=Ћũ{dk)6.p׎^5cjLAum\5eNR4P c ׫&Mq ZQi>j&\mbRh5>T]1s:W" 6D1UB$ JS ǮJnL1BնL$O0-{ΩK#'Nw`&˩T? m <6ʫw&K(zM<8]eOEz ɬȝaX`dJ?zl'e3QXJNZnXrrj?-}K$(Sp-ܹ+WPWLPkh"Y`cQ2֜BedtR`d"XF3QR lgR(n`HvL0;V\NK   H3ni.(^թRT >Qgf \ħQ[t1 n (=i3 C̭k1M` hgm 0 &XO^P-N*L#-\b`Nʸ>*snR`w|s<")(5B]E0F]t*L"B/#k V+")uJq"+U ìFLC!}$Bv0QgaHUd~3ݝxO;})X<+qzHX7iE nz^{m;c>@|/q_{~ƹ߅wx6ǓOë9?Da8VK܃p?pOM^#.svx<,}s7ջᣟr>5>/>1agoû|CpT_<$Gw.HOU/6<UsCu>5x;n܁O-¯^0|l7Mr<?[+)ԙw7bqt58".i_ z>vխw? 5nM/Cfp..5ׄwBoCЍF.ACej$րK HHeEf-J²P1aq"DeR?V]`1scCrznldu%LTA؄ʺTrq2 /W\zg?`I+Ԓg[ \D"*w %z>QG&$ ff Ɏ n/W=7$(9lJ3&΋h,cUP$JL,6F7 sP,B[%RXJ5s6aZjVRܶD J1ˍ)BQgEv@VkBC,t fB@7s)).Z= +Ht V}+҄0 >Z96JƬƜԬ+x"c<$J_XP34uȖf;.ALHbt]&o)c4 lM8 }r)֓Pvm_?3qBD ^i ;n^TjӲ)@~ݬgRC=CHLTرm"2.5Sl-`%r"j-Ts0D+g Qlɢ, lcNی[OwF;"JG&`lRErǨ36e!ۂhlDjI83ea_8Ae7l8*=YƌVZJBWˢgh2gf&OA9`$f+SBKv;dYR'`ZBe- t?)ڵ&9xQV8<NƝkq_1 IDAT**,{kmB5ےٍ5|u}V ^zfL+:RuCrcX%8l^x), ;C O;@pK_r|#tpӝ7%XK]ݟ+6<;6r[W__{^~t<|]{rw>p4ĿW/_q^dOo8O/]< }^}N5_"l Ov3yػN_U>[!&"LpA|m[07J~Vw+$w GOByi{} =Ԁ[fұ̩SDz@BHbE $\u*bBDo 0)]ӧ88?Xnt~gC'X!`V*%QiN/CtnJ,0,HP ==5:똶2#4 U0Rnj8l75!Eɔ`HZ[v XgDu@SFы1V` .Ԉ"tv yluhT-Ĥt'{د)9%,HX=2{`]Po~u `L!ҭ (FJ:m@JEIq>Yf`kfTYPC@u$Pz 2E(j.UρiV tD6 7X`0ӂ|#PCVK.\#R9(csfBDN tJف,+q䱥YG*+0 ]3 rzbџ텰_q(Ⱥw@{wWwiWW}lBtj._e'l2E*G!`cĵJq۾Y5z?ۺ/)a#ފu\d8$|c@͍ucX)z n_v֛}Xvȕ'}t-_7;}9? ix=x)A\n;+_gNz P/|§G8u%'vpiT{gEM!opש}w']-=5`w'pz-x%x׿i[g]q z'|[S~νn)_ ^O({7??W)zn+ `{^H2}ړTV^n;C8 0;G(J""fN2UlD9ޱ_?R4JAsjby7-YXh*Ѡ&k[NɈꔪԣP,Сh4B >1D51jX !ӡ{{R@Zhĩ&չu-&4pv":[)T\|[Fl -qL2 ԍs/بrlTbYLĩ"c kEg:n2X))P>)]B%G y 9S -` eXo Ek%kvY;= &R'!`P56;W,ѝ-W>nFS2@#}UAɕ0*}ِ#eg,cF׾ųwL dE3iR?saf/:UEXE!]l3},*YBg>͝Է^fV&m&`ou|67֍-WaU{Wp w{p u9zS~A~c?U sr; >|Njzn}?5;x"So<Eu]7 W8~><}3L4 z'3LCpi_wxwᥗ}8ga* $@#]L0LT'N!J߄urEZL"ڱثd*G(s~i&"&P=>R3*^ F3d,7{X#=OcϭsA" +-?"g׭,XQ> ,Ag*4q<28 ,tXL MأK8[1r+YPMIDm(X*3k锶h"j54ך 7ZJ[P{~$NSMUHĉ]#pt/IdQ "h$&"4! m{WwUzYYʇm@ɧVIzs徯?k "qtnE Ja%vBR?A`=ՄTp}$zN#٭! GiDͱlg‘zr勥bi@=jҖe\*dZ a(5]qЃreXYBz84XYaVX*+t)z)6NcƳ4;KLıHN5 B[cY(@q8 #'v!8j% =85;^h>s aʘt& $q:6:Nk#:NKR*6HXoV09`\d]8.|c3Yfβ0w%W+z' )p1Tgrhwu$+b ;4yȉdƳn>5 o),_S{'g>ׯ'[û.߄i-pf`^RStĩ5d#"oS /[Sg| Wjb|p t>e'_&nvN}Y&58w|D WpcނϾ@]{oy >`a"O÷K;+-xXxZ+/^9RMp"z }8XG:JWaoo~XÍZ|Dc8]*+>"W=[,45ES |bHXp>`1YRqQ"/7*K_Fa{rrk{x悛Nx[R=Ts63kyB54̭Ge`LS-x΄WsaX b!$p]Ďq+}KWY+>d _i:r3$ +gܝ-H@۱Lzi!6-LʊHbRsq2vג1"$x`}=B-)@( Y.cs(\2  ɻ _"nxbL"``D~Fim!E-'b8Y)4"̀պH'e[D&-s">'g&0Xs@TbnB4 >]jy1<ͷW/` mTjPz#J͵8 Uvj7tֱIv Fy`/rX }L 3dLdpL“ Q>EgRNj[Jnxx~QTxGDULpj5D$kC^2 ,EHN82g8U`7)՜q3lz:8p\h&-R&-O O/T70snǬXL<̖N׹-ElIoGb92{i508zQzнqN!zy;m*B/U:zR2ɝm\)hYbŚ 61]80Tl'5y|/#NSz(dAkfF w9߇{LӤё7#\ &ȯQESQYE-潴n7~4ZpHaL1T Ҕոp.gfVP)Ey8cN;a3<̺aJNrgY\S/& /5HSh0:E5v,/An`ک}5'T| <x]j&/ᮦ 9< ܣcipOp,zT vC?oHO>p x!xΟ?mw7<|?|:j{f{s?|eNxas_ ⿄w}/\|nCਅO)IxpgY o~n>ć#o-xmOeIHs/tG8ݒo 5tk >}爍\ڶ="n`:/ڲ>ԝQmw-04L(w5d& 1a˘$E К:a3{fo40DO_FKf$JQDWj}'`5Ut j"%=Y!dd\f{uT8"Q7&2zl2 Ye# :!ZBdQYGL'L*YOA%Ya!'ܯqWSmQ[a\õ潬qB'cj LˈID3p$DYK6j4LMF0yG! vcu%!Orܪ#TP[6D`A%p/DQ#H焴{&\O̱N L-Bc{5MʈUJG#=)sQK 2!fAΨax֬\aT؞T%M/kcU !B]25+m,#+cpFa1/P,ɈD)H XaE\P#C-W0"d8w f8Ėꁹ1 ёRQ89>p`$A6usX*'mf+6JE0mT tr }(2੉tT6 8, 33Ȝ*5#‡7x$zcH9ॢ=u=OZ[ާaGIJ*H!;n/e$Rh2l0R5 t[F:VZe&5HFr$CdF,{"%#6DhX`H`>IW" ԶBd@jab*:B@A"X?T/^;κĂWί)'\hXinA zZ4Ѥ{~(حӚ>-`O ~CVhon<}T"' l7Ny#:UI$x>~~OC?o=;Sw<oib՛!=Éc߁<z~a۔F`~֟ [srO_Oa |^Kz5w:Ek_|JS?fmO_g<7_'`p%L vEa!yF&ac>QTs:D\cYYçK`TDl M LG \:3QP5ir͑Vk~A8][$b-!`kVVE8[YG 䜸˝al99{s<) :Ĩ.Z,(7m P@-=3")2Sb}&B3dMen2VA\diZ0tPZOE0EMD-Ri{8 v2Ι=c,&vơDT#.45XC񖋩"|ZlQv KMj"TƲ=16IIR]ⰉlmhcB_yr 1l1 IDATɐD)QkLM&P2ek^O#jeF2-{QPacns\n܊ӈ'Hj/;0 t`V V޳p5xM!}kqV!+JMye44̲ae M]Qf`d"v0*s 6<9*jT2L:tFD1#ƶF¢~,i qCCc#AH\+,h$1j-9YV0dèX2^f@p3I CpQpD` F87*V16XQy}J"}C=XV rLL 5L2^`2M> !ҋUN1SLYlC[s3:(:|p*|`BS~ڝs߆aMJA~yeܸLk:yxAy&? mZ}u%_?^~ &= 睚UةinM/~ _&W-x9H ȏi ׵mNh7w8:]mq ?[qOi4F#wCl5#7Qc3R݂rύ*- "`zK0 j&tW %+/ i@x=iN[&qJ>ͬkC8K^f}l?Pp|n4[5BHvv`L儳0HpVH_(sa52 ``z({C2dMS]G=MUB(%ROtYVw,@Ou!, !!"(r[nBh0  M0Fa$FVDoXV l8S^hnYԀC A:Vd[Mer<Sj Չl+A&Y8Mخ"wqC2$fm50 -i HCfwNIaM9kf^)\)+PsțPNi]\dRgI iWșQ"&Z|e-C0nup,o}ʍCrmY/=Mb@5&SN86Z +XN`5fCXՀp0bKOH7c VUnD[k)n, UfX,\%d ,ch$B2> qC PbT3y\0ULzr0  }#$)`'aؗ3:d 1X#H';ag!05`Ê- 8C6^CYYjpSgLzjޚ(R0vQ#+Dr%,&JdІlqucCkD UE=L4I,v2T-mi8le* jQT=iljhĮc>!R0)1%9l)8a1ÖG4&a]!%hiz?ّ͠1jVRp- KF5Uɢwq3q=B(n7pm LO>ͫw@w֝oV$Ȯ z8gd+t /kUjw> G׿+0yzloC LQRyun|\ 7 sa|swM%?uJ9XM= |j:?x^YpH!uzz[ 8#LmĠ`mx4wKX5$knN*;lJ7 ~m2%f\r;JH)ʪ>) VOU f.VS:bPM5׈Y7ХB4<ԣ2b%08!d1 12@k;(K5 |e}_ VƣS_KUфu/²he0hL5)j6%P[S(!#Y1tU& dpsCעcHa'0*P,HY yZV(d &$ E ׽Ċ`&Cq5HRDYjJ ꥩDwp~}ƢE-H,9r. CAf^pkoq,RXg-Xr7(h6a{J>?uNGFnkW;q/}M 86xa`ghPCe|_G N#^Ә޻M?i}o.?z/a[ކ!< ~])gz(;<7 Ջmpe8q|Y}=zP>\ >'7絻3g) b/I,)ќC гtdǻ~(q! H]BcՈX֛3-k@AAZoTI9&BLzPzmVײq"L`Dib)?q\2^ q+N}ԫ #CZ-VsA_YRPAVlVs- "۬;:}#_g:Sa4 YS&G|A Tb]lفQ D\FH&$G )5_!M ]0 kRJ>MY%i4+ oUEeESLZse;q@ĐzKHPReMԱuѐY(E&5&(>>$YjB|qz=AD9;G{J EÆX* d è8F)#FH^c+LE 1FH bI5"&PD.{S/$BcV ] R[}GZm#K0m"7JeH#.}MNĵhz^/;κEhVݘK"fwmP9MZ] Fp4U}E_G OaL/+-}r^MynQmP'a:I@Tu| Fc=<s?{{@~?ې~DW{][p|" 99* o_+G{cQ=d|)&Y P # bne!1㳡fUOc2F*")8񴦃QH- RScIXdgq0Hd@dl8jF f`N6[Zgvc`=՚LrR{Fui m3JflqJlX`JOJJE*R<"EEtklM-BH,uLG%Fd1dk*o'UE/xA'%@!N(n`kj&xWa9C\Iv:l1 %<7 IpN* ^I#{v*g5GQ03fL<8^| .Y4 -CdPja(]ƥۚ['dŒH(LZH1hi}Dΐ I g"bbD-b[̒P uQb|oh 7 DiH/a"D10T9DKd)"dh݀/a- idki(9ZwHHXl,3 R2jihc1Ο-96MB)T3 eהr% :l2κePC!K`k`}lX9&l3sOBlayغN?fK_֎56׸݇ӗ_ǞT 0sn]3 R {+KG j 14<,Wy /{Tʅ0`JCo_v7a`w'+ww YkO>rs= OGe/= ǗanF 57;Pc= W#Ge7-06 #?lȨ|u.#Ϧ١^߹BYrYݢ&8[@c*,EI̛F0BN+M|LƚGY E 2dʘy& FoXX\_ *\Q/l+ u,-̶%3y(f9&'DOp{ļ()cxL96; U63-rS"_noB8M6cԵvYڳqJ ;yĬ$(aU: uRl#N;K4?:P} F8Ì 璌w9.# iƖ{0nv 6q,6 u: 19ޒeq9Ι!cXȼÎ"v,Z9aQ3K{b ǑbRv#V. mA!W[8w]TRLdGOc縦FRWͽFTf2 }bhW䘱VSKl"u'aį>ŴENɂFªʴGS$mǑ>Sy،Y97Ld ,o~{go`s<T70ABF8`ћF?pF7̖ڀ`J`ILjƶJD5,,ǰ PJbg{N=:0PmK(gI-wה"pI8* ; {&{5Ň9r`9)JzƜmw0*&"iNNsʒU8 /\M1sH~)%T&2g⾧~24Oa ]00>&KEhI>t Yъ/\}0&vN4m:G ޯ*CX=ݴe3f\ 3K-y{&y(-jiW.; ;+,Cz5Zsο[ן+{U4}@eOkJ4?>X ''ߥtx%}-pܚ %|a_^~A o18RSF>{G%~pR]?O=S| ~ub..܃' qO?fY0 ~7܆Wat$lW^To] Nx뿠Oؿ~n?Yp#Z@ZTLu\:K{2`mf}J0Hի%h7/b[O9acʗřHu)A\8cT!=wWe^5Rb{^'ۈ2@*;U2c̬f4Jˈr*l1iCfhdX'd!2Pu2Q$Za UHBZjH8b2K/x%}N.g:${/ Ojk\ӘBp 55d=XuZF#tQŌ=R(x EgMpZje*P~ m&hJ D9P"LJ`f"/cK-ϙH %ʒ-s#L1tV=.x{ J-i|+')YN{!B/Krz)]W#XfJXvabF>#x~E5dٕj: 0:ĺ9&l1dLCBMCJƳ&K!a=Tف18z%=( Fб-siтwB6:ӗ1֤Qs͝NGW$krZߙvBcԠ]Eҿ&̺6ZKI2qtXB O y.r|X \W(-Gԥl;VBoiLt:4*1e!d9`;C6.E̠Rw qH*,JDa#c|NN,#?Ē6$G4H(vL;wsvYΝ)lԷmiZ߄s-Ӊ ,ݦQ}o TA|O (vᖗǷmQ$@IT]L.I'{0jƝ.f !J6eԕB,axpD  ASi㈩Jfh#JGX'I\LP uV"xz,G38@??uɮR }Q$=HQgKl(@ SBqUbZ BUƄjḄ'A̒RmO>RTI}LJI"EM$. I5ޤ+sX՞XAJbB?Pʊ<)L$(C1/PJL zGB)4ќT9%J ÇGBU\D]"9Wv.)!и%z0q>gVIf2L - "BhR@.g`B^C T$ R(Rp(9{*^qE3:X 'd )xdp`f^<Ͱ4},B$Jo))>2癌rT"BPS0`9۫ztNH%]f=H"ԁ<( h G%4JΦ j\T$r((l&b;1LRGYyrYn:+wr e{^wueÜ׭S _:aT7ziGsq> 7/5ؼ\mvY(V%fngox{^6a:\9M8xey|k||cп p$ u?lÇxEg.|57q >ªǟ;׿OYP[:*5ń}9R㽨`YJGm]@HEJT\43b%T"h$8F VF'3( '8'ގf ֠S L>|1竢AԃgA6c*ʒB!gG_]0;T%c@*:2LH0Iw{^;XQ@PV%ƃ-%ƶTjǪ#ɑ DW#4 zr ji{+) / cBPR-dH!8#AGTѐpc-w7Y"~6İ]4B)6nt)p7k}8,D(a C.8zo@q?\-H;ppc20pmR[6;.0ce-٦x,aKS̷sWᮻmo7oY#&x |cFz2iә,ȣ6}XsW^/|kpϾdq5_bJ3pn~We!M x{mkV}p|^y&3#p1K~)x: TwCf\y?g=KN&$J=9e0maӊ%j!@IJJ a/-57e'(pB^;zO u} Kh 9;zSKN(6=jߵ:d7Il"%Qi) Bi (K5KFо$ѹDT3b}dۯ<\#"%Q@tvByVV&gra[M1{ OdgiF2*Nj&!8D+CgOUXئwkWM?l_[_~ ~ Λ|O>М0!QBc*_|:/?''~?Spp~7Exvec2]X }gyܲ7PTwX!؎>47|V ϼa刐pNPű"8!dE$AF:~]`ԢޮA?NZrb*5H5 RNGGsLܡ}<̫dV uޫެvK6a^Po) sona:oRU4].!u&Em 3"FИ 30cgUp1a-2,~*c\9cI9x:hQn2#RApMa'RD9UiQǠ%ӇB.\@MIP(1r\D~*2Ũ=C[6 JhVɀ"4["a d Õbsjs b)(gu(8qPh ̲% 4x&;O 7=Im*,lA cX2`9nXlJ7P.R+8bnj6NX &Х(ٔԐ2h+q"4fx#Gtc|YE+Ȫ7uT:^cN2GGaEe'ֻJam??e[_}/_Dx{^d8fs;/Aw΄7C \z6%|WO5x嫰u/scᓿlXR勶oXtc2 x[Co4z~w#\d/?x ~/_kO<  lY(N/7/DO> u.x2< ?qKqk< 7waQl ]m z>.Kh_oG~ܰ: ް{=3G!LaxXۡZd(*9Z^-|' fWP!&DQ=+Vř!nEu}1=DV1#BBDy#A @u'&xw#s²աP}e-F1\1l(c&XČM$(JiL&|ܚH;rDr1g RDY l#Jը#>dȪ(~:%*­ptM#B*#J)f)2=ܿQy/!ԩ[7X7)t&zI1 u)4G֧IiFa!59)V?jjx7v?LfЍ}l945<Ua"J=))31Zee@hP&qt86JAV]\L7M@ l|NwՑHUJE-J_d,)ޙ# voi{3PhUgމL E~`0fxx  5Ke%F[*+ص Ů8ŭ:FJ8JYd@FfJG| ('80[:WQA\6*ZQPALo.mGr d9>8Jj%/Dz*ӑXc7P/0dǐ MXݩݗP؀P[FZ[e8X8z&|+D 2BWjNF>5wfs2?|m0ozk9'-8`wph."y%<6<\ 6\SwOͥn1a~GO;_4!kp{3|^1t ,~yn O}~LT~bz~ x.CkF* o/!oF:8w =-8vIvn…mlwË/ڤb~܀`~??ᙗup711w_KWM.~&K;;pCX>m| =y?׭*]ٰ?+ VBy\RH%5`!Ж u:Bs' &uevlFc( S1qH`ɭXJ"ڳr3m]M er2=X9^,d%SDmOX%8Ju-!\f9e/v}z<  Kčiq*#pJj @[E%E]QD#)s35p\t8*t9Cq?q#@.4SȽg9S4CRE\E-X%VX.OO;*:\*@@}&c_P;誖W UQXcM#WƷpay gV /sҞ_@;)&&R ([ë0.WxN?jNջ9Q+w.cOǀg f>b>ht? i8hY/^;/zI[ # x <~qْ;?xqfM> {~W5" O&oF`c5|v|̢̗> Yx[=jPza 0$\߂etˍTr5cE4~]Wl_Kf[a;Xqf-p||^BM]SQXYUɞy~<>1/ʼ!B8 u>ZbXQ43K%V &(d0{c:8"0tY"9dfsacdq뚘RX(, Sj5h W ji(L( Sj}1@ni,QFp\yE̹jrV/,lj\ 1}8[:x%ݨHlӂK,Yd8Ҡ D$F̞Vbt,W"Dq t,rPqIUZW#SYx/,#ŊA(驃2b:1K8ieF;=}ϲr֎ԘNXpuɑfV7(R0®WXh"g}w Γ5:P`cƄ5>0`ke&YVS;(0WhtJi8 6m?p:n(邼oVzjvTifۭq7 ܱtN)!\&MަSbQ*SWR.<U4Rell)3mGބj-V5R:E^F;TVnw2elZӧm]|d%6:ѵr\J(x?I ykVdF @-pZp}a^C59NȐm6f`͉ gnu7ͱ)2;9huBl-挥jkH&Z3DN݆O418y.\:W oI 33ի֍j2&ΦLaU`& ytgoK2aj~7܌f u4p3%́]Y Ym@}  &2mH,a,6R'!\"1( jqSGKgHɞk}W@W0XPW蓲w =ɡFIġ3mHCK YG-")k4ǁݮ&d(͒,VJ^B ш*ļT`UcJMЄ_S;:e AvQc` #̥!hSCW `etD_ O`JC&sM?ڐHų(C 歜x O3Z{+(ХJ xlK<=b^zꝁa0-;qm`82ڊ 8P/"I,I8:%mTN臂=5r>Tȵr3N &JIҖEY-zd(edyz( )QLPU! uW+C8[ 5^K5A .]k X'.3 e k=[25#KQ7nPtr|tCaBAYurk|X" $cdz:ʑiCa En:*5dm$9[B :}bwv6FYUY:YuH"aMY%^  6GtqJ je3m@zBV^I0ػ[f\Q. 2+Ta",)IjiBc!Ӂ^KV#l*Rd1 Z)N8X%uRu[-H(jfӵc+R*]! Xk`~ FA:s لN*iȝ)Zxb ?W|ppEhұ)N']) nAź:CeWSh%螆m֕c @kMڳoZu.k׬>';Vd)̹; l3o~tj߀?>/\pr8s~.?I«8O_{:BIU5Bv'qtkCf?G*z^q,˸G-U9±hqN!LrO:aݫ\d A Ni,n!@=u?G{8HȜn#syԟgIuvF[Ag(0"⨛#tO7Ky -&ДKt!ԬBhJnh@yfoG2{só_K= xQR͓}~ -o.xmp{a}^{vOÍ{ ~pS/qq][y8| 9 ~b- G_xãK_} >vCu~'ܑxpqν wٺ~߃ݳ&k{߄u]cvxW의.Y [ၸс~54^exul|WIxz ZYmZ:ϸ!Q.)>*GRG+BG*Mαk *FnB FQgQSZ{˄2P#D(0UGC}We!:B#&JBI]r,$*€pMb!4M~4+M$R jbpRj,lŚɳ<-AB.Ef0e@8Pdh8Tp0w>+ՋPQYjc w$&NgwX "nQoy# ˂SDW" QXb584 {J#i1w$RIIqiz4 \@ӵUAل”@*:ڒ-[ӞD),"*,g ̔QeDxc=iϓ\`QH4&O2e!7Lp J߲Z9r.T!* Nf [B+r()͘'J5-f +7<5* y h_S5T +"R1}sWQi fn'YZ㢧͎:xЀNKG@]AW ] }f^'0c/HsD!BWlTO-}5 JtNxITC8$QaΑ;CUj =1,ZROqbHBkyjEXh>:+$!Nhښ0SyOXV34ݔI]bΉ %!gHUMDWCr@&hZnw&(D`֜M)e< SlRH rOupq-zKExʺH 11"DUŧ}Í1Pk7ða,lWZ3]}{ }w={ _\ۅ`Sq $=ܸ g*X}ݛ6Mڂs|kp~r"<?</4!Z _]65p8ނ{ ,Q^_W?YKSwBaS _|W,G䋟 [Zz_?o ?"L?/ڷ i0n==k LHH( oNLʼn*ִc)[,efDy^x-!:D.8| GI8\vxIAYУW .]FuDɈT*uv5Z11[ġq-uj2 NA+T*vRI `0lc3M'kůXx)~m;@ofe]4rga9^mQF᷉ 71R}u3~q'vPKɑ B8e9Sb uTdXX(kT9EqR۪+h;z U<{Y!6­y&NJ,8TWL@^@Hqk<&&g֑ vg'mƩ'O‚ths0Ⱥf GUܐ(1YHS)'mdCd?\8"$ws!#nZ@ {a0jT΃s? boy՜.'#pNcA'v7gc;شѰO{O-uڜ2R9/B 7 }Kg{,te8߀TړslXb ±i6uMuibt!n,4o[gu qv=@ [ub?EbͰ5F m3{k}1S,%Ƞh>I?>wIrv`?͹}>˜ȯs.S#XpvٔϳO2sBG =Ō MsXgrLܕg.s]p̩K$ <҇l8(9%SF,jNMuScR4TgZ튍= +˾%`\{cafZS2|{ǹp91q|}R͘Yޫ[64AXmY%&);??pL}@;K!< y<w}M._V(^*-UGulqbjoŇהv4) =9X^-Aҵg9W6=o ~1xSEc- NOa[۫o6ÃãϔW> ~[^]~y9>mMxlO]~%#oz {t]yu/[>-cWx&-[~;ćD߀e{x>S;Upj--upSh@RmXzՀY#r3eAf/l1d%41ʌm( R%\ nV\brdu OA3 c&{ AJCcT 4 a ϊ"ZN{ԲnqT5Lab9bSlb]O#q9sR칠Z5h,k![𷧁_;ˉ@c{vTd.g,*'qLEe$Z[ih-*GV$ZLjL])Wgq>(u0fݱ+v{U.](| Ig`lM&QDGAi݂,Y+rx2DkahPfU^ sg80^,ʣF65.IXt4D&ds$ E8\a 3rZqs{ػxSxm8 guX #.3פ͙k.wqak>EOc8l%RL=xi^6! Wqi[1cs+79U-iB\SŴq{.{gǁW g!/5,ڎ{unK_'9\ɖl%Aœsncsp.luffٖ̍P2þQ:2Nh犙InW+{9:rҒˋkt[pȰB T+,cbq6"7GnHD;x\.I{g7_SO8Us<tgxOGg=yܻqv >\:rU>Dq͂\'>g<[wƝ% m˳b;~m~CpK>t ]L-NLG0a:5p2lן,bM O> cػ\yaLKP}ܼWu_ 7_,+%?X?\޳[w#xeKiJdW?,|=Kpi&p%?4׿ȣcp&og>W~ .×?OJ pp?n})Lhx r1;sNȗ+Q-ڠJcCl]OvpW'EMY( ٖyXC"+<77qrq!Z+D S0ؾf%Cfba$$tgǯ冣4t.yj\5 n#ː jfd3یٞz~4c_A2+{Aaպb =b \"T|!iB6Y\vWoZ =ض=ya^n-) {&~dL!<%>'1C+ZeW0RO' 9A$`a#^ l 4vz$|2 FD>;eI4ǂ X֚=ƫ l4`\fW4ӓ0B=6fLpn ]:SWIi*+#"(&ZƖ'}E# "zfoY%omӡ2I. 2:%" WD]O?u!ڊaZlBQVe=?@z쉧DI3`, [! oqzp6$'jBv (uq:f=nmĹ'>;p|%L4!B?Ĵ_V3(=!2OX ً9: na4̀:qvQPɘ HP~[ky| 2[z2au; !PSI<0 o &Šw=g vhfq9kmR@90[Fx;b|:KJ7h s|"da;Dp/QF Nc#C-]b9 f34;u {\ #b ȅX21\:؉pfX  @gsG=سB0jt1  ӀΈǺg922[߀)f|S1'dd"xcťA>V\`g|juv/i4O;j;C|eJ?-X\)G  /-nNNZؿTU^Ye/--l>o-Vnw]+ګK\T2/s/3ۿTp IDAT l_$л g咸&x%?o-\x~8Ŏ5W`x/ x'^ u'?{wB> 3:sOJO!;*ًE;6'A#ݵ}l3]) ">QO ^qBg4~rF [&jbR0K3g&)$%3CD %0EawG GYhDdNb=7ʨ)D @ՀqBv# ف&&yAÚVf6SgB4OV WUP|8LˌZ6ge”b%oK<AkydH$_kf8i0 ⱌY18[vEPl0y  oº2P bDeJ uDz'nb.E% DtB@ئH 3[#Ц0 ɁF0 JX8r>SK۰-j3CTissX3HCHɚP މMҏBJJ/rhı"`v@ da7608CNLb!wN- 9,r- lŰJ3Y*U̬#4P˚s-xc9+wb'"!W1##XLeS3UA$3u#Ța[|Nj3a:OEai@>fዋgDZqnt 1YAPvK0V{4^-|Zh T0re\>;ay…9,uio}Em˫jFm-wwƝ%'\9% 'a~67O*7B<ڃxZgOn@~VO?z?o)"胿 z.W,>|paEs58ZOO7 ~S? |[ឃO6x8ae4vMxExm9\އ_}?_v.[{ ~鷋%xSַ]؟Ó/?KWG? NwX:õk{$`6X\hBazH- .mY^tE;k//뻿;!yx2in> 4L*U&3U_;1"j J`!IdJXB4@ ɉ7T]U- U,t1 ގ;M:$RLR'6F&݀B* a҈EDq*(2BѶ+шư"eB<;t9P'%qwu+w7FQ#4Q! a5ĔCZ (* , T_Rbp)&"QzhPWx q} G.E h]6R/&k*xFM$U,7DIS@\,a;- 5i*j'{ِ!0fW0(whS.ٝ\/a,]BSBަCe&Peŏml DBqSK){Q-rx } #B)'Ea,1X%4cȹprO Z^ beM\)QdM"PJ0R "domf-CF3jW*-9m͕+}j؝[Iw-]eP=Hnsn ;"+̘a89k~%p] ۵ˢq]xͫ=OV>烿/ֆ i8-(0 Bx4$gZ8 \3S92岍%`ƀUŒw Mft0a=^F@J%v֎^!hfԌt(Ep\ۄ`B0fw-)RFSV Y3vj eA;2FBLv$d-Y"Ul{eD+OevݘBY (GJc@i* i.w+s(떃UID 댪RK,^ye,Ӑ*L+w[^AxLHIv:0QGay"Ô@R5՚z>+sΰIoS3-lo_uNTqۮqM쪖; )3$FfQR1-cFt@wnca un7GNf7<])sq0]tB P UDela0Jbʐi4DM8L̙0w@+J`S5Ќ f0:1Ob(DID$|Olw'4ĒPLR<χr:&&fdRWGAk1`T|iYRQ̥g 2T)$eҶJʖhRrTjff-9vSp5~2a^bʹZg7όv|@[T|TfmF""X;u$ۄXD.YR4%AEH6 d:.W:c8UqxSJ۴!ș%*"HPn ,?;e'x]6$”Jc[Zp4kW \ Q&1x*`Q, axz)%6 '$JTaǸ$;~Fڀuh(՝a[ P%YTg :$ݢc*}4V fr2b0Mޱ4j, eBƓ@U"g-3SoHjZxUÉІemrY %R $ Z0Or`=bԂY(nL.d^ =Y4&lYA14~Ij t*i,V~4ȕA:Lrf2R"BHZ#d:AqQZ/iqLfd{]XB+=1lgy ®p, !-Ri4 uK$1Dj"Nl`]G $U$ Y,HO3$-p9,=BkXr-8#0AŤlAGG*Xu h6@CtTlu4Rj'0Ɔ4"4-޶TRHO}X5he 6Tvl132HZ'dzd*scY`bY,U21t*Xy-ipޓC>}`"Y$, H'I7 *섬 jHtǙ:;θ3 "?3ȏcDD]TW-1F*9/|UO>C=ď0Ϲ:~>~!=??jZrsY7֥Պo}yǒĿE`U h8h 89j+:Yc 25I5-#1nt \(75vAcWG49؍ !qS%,͘g-=n3SLtۄK3 D@PЪDvRάsX/(Rl55\U de#J_Odl6J',d [Ym$>%hA H)#ܴ3.LFiU11 8"XÎ%Pbp` 0{$f$L^h*/oILt EHlcNb%aUհJ7(/?29 7POȨѢqE3AynNKK>@"&aD03D9ٝF;$ID'0O210"u^fN>rcfĜL$^ OQS596xHORh LQ2[j䨣7`#tj 18fGX- $ĸcX0bG#[9ld"}Mg5l ]28qnC9vmV&`j4ȭ>glsŋ+SC ܢJBkb~hA iI`"7h,QAϖvMjat u=" Q}*dp g?M1X)T:p5jBW$[A65! ML&?ԟ!⑕%aL;Z}n~=zW_T3}=o{{Kio~o~󛿬-n8Tl3Ĭt6/(đt"3=M-y\N#1Nk0p"%L%3@mMF,dtgJ`@oKa9 [WQܠ:W=Q"4qs]-PY1:K&\0C jdj&4ّlv 3 T Dtd1c(#Iٌ#5)H}K씴j3,CgBW+=T}ZCFBYaO} 8K̂ :@7bkT .QN2w:#SN_jHƠ:@+bK`Blyqk1d$J+!fCgCJl&duBd2'gZc7["8%Du€c ZL Jހ`PDwF|/Hr Dpe曄aYNlv+ Ljd<τM*ժ|]O3t8I'5FF`<DbWN3Jd#m 5$9&V 0f:NPȲT+FB k X(f@Sz$B  ql8G%K e}VqUF% .K*9D%#tm駞m3amfn_z+Vpe؈6l6˗0wߠ7;vFcc#\v%;o=[1,[9p{eƍE^_-o{8xkaa˖-L>z֭[VgybȪիd2sq2gxI\ݫP%tz<d" G"2D#Q!BEQ y% b'2hANMuҰP5xl(L'ٶpw5~" 4[B^(D!: ~!f! IDATv,LT3GTˈbW)5Qud)b*P%% 2a&F6 s!4UҠdSPDȸt;,`dOZZ@Р%FC+"j RxD8'(qxDqM:*Y Q C@)bFY\QDҠ<4V@S.& \Īm4p٣J˫Ct3Ty.j'00u!$jFhMV2F@6jnp !69BS@4K$Daʎi|jF19OāȌBedC/9wJI%$dM  OX$PhƠ"ø TKX_$YFX]eMpqU5a"pHf"1q4x5GP ٩ UTT!39DVA%(Պ4$WC C@ Bԁ8,zCqBAd ٢Z&t*GȂ#rHҤ:T/!0Y8, 'nM\% BGot0&'<\m"q }*DjEhHPסW$l M:8BR]ek' c Zg:P:Dt$ď6YSUD-JhP! GdUnHP$)EHDYǘ8Vm053&%pkt~t4C DY~P#r^ vzX)DSGCF6D*$xKNzGZXimkaÆ1}t?֭N=!'t"?ӟMݱ̖Kɲ_Mo:ں:њbpݵ2kL:>HƏ?(BD)c^̿S׳x~/PZ~Hq]#F0bp^y֬^ͻn P,yaRVZ}Sba+k=z4O?ǝwʹiS>|Ϫի9x'ITD4 'q5D"܂Gc<7I Z@("A(d[$*1@"< !F&FWv0qT*0W85I H&u4Ri^K4%B(\L A%2$M @D(YJԊd:6I^GHdy?ij&!EiV%Ī١̖PIm9hb6dюL$hFg$F@-I:Ud(bTz]%R <)t a0R%YytP"C KɸAMٯ(x!"IbdKcc$R$Óˡe#(ԥ*18E)Jud6$P貁^9lmP"8"LTUM~cH ($ٷ2I;&Jq""MgBz1c$xOŌHژ$ǐdk{"4W(t%QWj!>N]Y2$D4X/F <ݙO{m B4Q #@dMieHq2NEJ "'.J$HH'N]!c41()7@ EAt KE~pH *0i$* q#AC %:#YF"#$ӡ+LUDH6PLPJj4'nrq#i$5б@4+L *ͿORZ82u04!1hbai#]P^)v%Hb|cb#4tB%k/qt%qP $0"O!щKV嵏>ySU5[#k-Z,{Ar98R!+V ב_ xl޼qx~f\bc1b׬LG:-N:Kuu5BZq_>/1ss1sM7ݴBfq\W7np]ÆsE0yT HЏ@@)ź똼u2GfE3oZk?1}ƌݙ \b A!A1ƃL&DI]BNH6dBpԶH(9EDUgZ@/iوaZc"(MPNXDEIZL8 W8Nc?(rN*ڀ.$z tA/3y̧ƦD%N.@SC6 DHeۓN=DIg.<&3I &*q>x \11x&FKv4dEҗ8O&I /8 B%لIPB#%‚AF@TXÌA1h;1x2.RIFp\jKIFdL'.klNڂ_,If3I%!Yy 6/p$n#(I*VHSj?h)ҮII"F I(9phB$L6I]N.4xcS#) ']k PQb'CDI;*<'L"NXl;/2T0 TZB҄DEG'ډ4&{, 4d3#J2mr&pYLDmrpU9x!`UPH:ŲHG{EEƏGHe^J\z%,Z<6lCpwO\OTQNk͜9s/ru]̞C]]=}6jjj}L:u8&1w\~_pх{܃HbL`0L~>ur}UU:|wm6;X.rq,Y”)S8㘧z-Wv;{.qsYgя}8):P |fY,;E,o~RQjݯݵX_q^}BVMC3|UX,UXaۥ~KHk6byCQ "bJ 7Fu1SB( T6>>"Ibc aPDz.iJbA6(s+"!cbXD(96-X^3Qaz*B~q\1c.BR4@=_d2Q[׀b>ٲusь;. @YBM8.5574]m¦ hٶYIt$ZSS[KCC b9 rz$#Ų-۶|UU,llټ&v{W~+kVR[׀1k o? ^Mâ#t{O'xbgj͆ (dYwiFf:!CY?;Gu{?9sNqYں~KX,G}1!"޷"hUOhX@ef͘IMM-RrLZ֝j8h6GJ6_Cބgi{DjViw ;B0z8$s`>q ߧL/mwۥ~&Aq:\+ byXm93_@&Ak:dʘ c;bS 5yӺZh1Hp7lr8SN]j4CMm-A$J;Na5?u*}9d2͛1'?hNRCN3o VtuB?p]w#Oz($Â0@ݷ b,"Ecu<|OåwEZ?lbWq/~ n/}K*),(~/v #_r&_q9߹;@=Lt%ІSN9SN9N:~0(:SrbX,o0J(d6y<bٻ,\k-[?<{x_C="0#W_k}[۶m8_~9˗/G?e]e]ƒ%Krhi>*|vcį^K.o}[?y嗹?OGG+Vࢋ.+/穧jJ2N3uh_lbXVi },>o+ }Gy&@#t}>9nF֬Ye]s衇9f1ڼ;{$7 ÐUV7MΝˣ>ʔ)S{y{f8hd壟lbXU`Thiakf̘Q$>tP.]ٳٴi|0^޷RHo˦Mx8hkkcɒ%KqJ }Xz53gΤf-ZC OOPQaMO?ͣ>JUUlذ;n@m]{QkVX, #@<ߠ+&K+ Cw;ǐdb,_SO=۷/|;l6ٸq#'x"ZkFg2&}n:Yz387ofĈva\rPMUUBcc#6lx :4$ ؖ;v[}Y֯_A?VhoZ3m,b!phjt%\>|F֮g ~_sSOQWWٳ|+V}h yXn ~>7nd…hd2477`R,\N;mPCkMT?2m^W@FI6?)K.-?|:,XիW3f6o̐!CKk]6} mbX4b1zvLjj :F]i|, w7fZs-tR~!,CuuutttѦ|w555455!d477ƙgɔ)S?N]e%B!}MW1|/^Έ#9s&]wLìZ9spp! J4u]l9]qPH݊A+@,YQ# 7.bJw&}% +>,Afر;s {챯`)E6?o.':!awsvyn̙{?NƄEΞw.55̙=믻0 .@㦦&Yljhßw]\%>=&ff`A dX,^5qc~ z$?j4]C8|1Q5z V,c܄^*\G;B#TKQJ-3H)G)1&0Z#|~ H Ү ׵V*N)5|P~-JUg0~5_ii 7bX,4G"ޘw;Fłb9DMMb@1q4V.%Ci-Ph9 1l6KTWvL\.ЦaڎO\c=~&-/js9|?tq @}ץP, +(q*) vs. s(X,(C* x.x!.f̴h9 i FRW_Gc}?DMuMm_ѴlF.( L8h=$ǿ},BTu }B!ϖ͛h9uuu[ 2f}>*<ߧ{e}g;oc괙}ѥ>HMM[7olUcX,bO|\.Ȇ e2d(G}3^|}6C8摣Y>+ں:f? R2rjjxꉿE!jh͈QXis=FOuU5qQU]Gɚիxťoh3nms~b!Ϫ/c! C sbfь9Ү~X,b@!Rv1vđ,}hX,b,i.X,bX,VX,bX,+@,bX, bX,ŲH!YNabX,rQJ*شqCbX,#-mX,qV0~bX,=ܸamId;d1A7J ikmh95aj$ i1}bH; ϐs\cX,GbٸԚL4 ma>= G!YCoTʌ3JJ&H ! [ EѴg4}Ri`۶E06<ߧ'۶R,Os׿_驍}Sz44[ޟHŒ1LI\ gHٳδd7oaζ滮˴)VX,uN}l6kbü`K ᡵv%`i<3 og)nFc_Pjֺl0dc U^ ֝7 fBZ`IDATA8BcdLֵdq$Fv y=g@yab @YbX,}HExӦ¸2d=o\K.OqރZuŹdP?Π]}֩0)wo{i_SrJݘJK?n(,rQd x,OzCӆʍO6XbX,AAJIuu5AYq[&()%L8h "J%Lkad2xֆbX6L! #°%Z.qL68N (%$KL&VnuJ *)%ZryHRJaXne}F{Mi娏@R|Dhꊾݿt3fшT<)@'|>)>1 {˴X,kE//g`מ{n!8d.1eqƙg?‹/ Un̳;֚o>\,[ !xJ>\15򑏲a8?|9=?^ 5[J0n~cXk_Zg~3.":6n؀r-[ou]\ .K ٌ\om["CRJ͛edipnu]Xjǿ-Րz()`I Yf1o<{1Y /k>qYn6m"~60nܸuۖ-/Q/~I&aAv_F!2= 'c]1w[dĉZF~l6ˊ+xꩧ0aq~)%vmm]'2k,.qEiaw}7^{mb6c/DEFveNT1@1Z2IW:?O}'9Yv DQٳ^XPt(<,---.Gq8SUut^on}8ٓɒx8 81P[[>28Q'$D}~#,`ɄQ9c%K8#3~l݊#%#93%X,k" Cꫮλr_~=_787ՍoB5|[oy7z(,^Z+f͚I&/fA1O`yǝ<🨫O'6m:7x#ϼogŊ<`n|xX>3i8Y8㌽_gCW VZIK6>l~HY42e2k׮eQe3~ƍ?GR1#G6uƍ; ByviiwV>ŀT eVҘ9r$۷og„ w}z!}9رGfڵ9-Anm--'?K/dxa~_R[[W^w93Ð%KpI'Opӧ>ſL4 xf|1@:'e1R?r3͛^#g̘>bGJ80ƌs 5L6uYDSƀIlHw ȞZԔ;|R<#v|+_A C_d *];woy7>Mi[:8zp[J|Ŋa],hjj}C{S8뒙쇺:xgXpg @JK/̯~+V\u Ð;7~|zadY֮[K[[J)&ODMM5U(Xv|&fԨQH)ye:;:Z3~x5} 7cC4EYh1G}4qϩr +V,o}+J+jjkhkk'(g'JDQT~7uu| Mƴihnn`Zuq}l|Lwwf֮}bٰq#hvN㐤Z}\x|_ €0 Z۷/W_1s?Og_eh4y27f&LO>۷9$%u߹R.[jw{_<|eV8I&ɧ¨<;!CPUSgKN?Ϥ:A_7w_BqҏM?BMGtIy4=sOIo(ut32 ;#RDQDJw?L]lW@,2!XnYd qm66lȘѣˆ1?>0wq''tg԰9_Ɨ~8唓4iA$88nKϕ!PJ!(P%lW=ؤZ4$n(\G;?( lٲ֑d2dxq}Yn3A1W1{,eOʕ8޲Y3gnz A It2}`4VSQ6= !=z >s-d7h"lBKK CAkUW]'֊|E}z&cP(dNz!;I&K/1o޼x.^[I< ľڿ]\n9&51o]GΙYb%yzɜu,_oy[Pb% ƌÄ|T40LgAQ}0zif@Tac( }JK{xƀ8~{,^駟WD} bUmFuU5$PR)-Z_q˪U8[߾K.9\|#_(sg;uuIfÇydY΋/1n$1}T|?<=v$0ejXt)BV\IL6eV8/Ǝ# #5Ә)r)T1U^\e+k?d„ |k~M6sԩS9唓+--f1l0FN) wF](TcL[lӋ7nX6m/~ >u ]w͘1f) .TF ȑ#G?BCC#Bs)&MfٲeL4oǽab\>f˩k5 ]0l"&_Q" yӦMeÆ Qt?M444GJvU~RtzDζpYTt \t>Q,λ8cf2 Ʊz'JL(893ߋ0(>ly(+@,Ųw00g $y y䑜}Yzm9C9 p{# ǿQ#G?۾5Gё}pU\Nf{I]0wӰAH45 #W6>sqol !Bp5+?.$Wᖬ~^fTgRQ6K5 t*9]v?K$SKϸqhkkc>N=( PJ]RX'jjj87s5ׂ1|C~'hʃ>G?:h^>9c˟٣+^jXWlh{/i'HfK!2&Hj0Zk<ɧ湅:t(o{ .ä Fk(}f͜ K2g~r41B&cBk(U4ѩ(ߓq2PCX)F3dH#w558r2N WEa-鰻Q ƌM2YbX,SN>9Mr(adn$qXS0:xTgjkAmm b455NfjjjM[H|zA]ȱ[qOřgQ!ߏ7O|%i4}Ϲ\pyNa2m4nH2-Q2(F>)N$&DL:u*]r q;QGY6BTₕݭukMg_6kPaN(N8 .3M+]tlRZcJiK} ƀ| d tڻPktHe-C>;ڛhi^&"n9{h:]>VBT6Bu~m*mQV%W#Yv+K>6Nd#&-^eȑd"碣43::yu:FG.߳;t0.y=@=4G>>o SJ4lagxG=XbX,ݴ -Z+QI8bf9ErAܮF뺴l+!RX#zU aP[[GKK XR 4 AێY(xKlU5cMd !%R &Ou89jؾ}{7^)>S)%ׯcilX ƌ=Jf[[bX,;( ҋZ<Է5W'r *4eb6M60|D3}+Vt= '֮[WG4G!jwl7cipTɠsZ+ŤӉ SUEUU5\&N& <Я~nN>RlbX,oÒd&Sk/Sj!#0]uD&IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/sstvdrmselect.png0000664000175000017500000004333313203343610023616 0ustar jomajomaPNG  IHDRzTXtRaw profile type exifxUK 0E箢K *i =\ GAȠͻ&<2t\"1R휋g e] Q>Kv[iΧHؒ9ޏ_9U), iTXtXML:com.adobe.xmp QWsBIT|d IDATxw|Uǿ3s{ziK EPA^P]ֆe]˪kC}mXU) IHwf- IHܙ{g<0j0"R5rE+ߕҟvc_^E@B:Pҟ~%jDmka")): hL_F& n0d 4â9L$$0`( LB`(# د) !Nj@ !cl8̍nh0INdXX 8kJb5KVF.ejG(_>avJUn@It,3vHƎE{+ xCY`pU>"sEujd^2NM^6._79n#۞dۂ](W+d}+0أߢIro>MIQu 9΄-ׂ$cڈ1!7y^FGNG[GǐPqQ1;$r̺~>٣! =oxFe3 7=DH2f[of5vğ DKdy`L/2HL2lvL_Ιt{6 j}>G N>ݧ NtOkXMXU)t(K'ʀ$˫#d̈́дY]mF؈QoL?3h4g1hCT f. eO I$ɀߍ[8QSTd1kpQn⛯֡;c.8`̅L8LߺnwOș3aӦ=# ;BtL]n;c.Mwϡ”̰g?QƜxŤ)pk5s~bdiSʻqN2M6έdkيfLfAx$0NwQcaYHdeF&,˟Ҹ5>UG<b/a gH(fƬH 4|Mx}pĘ亊GCg"չ9>.H,cZ T5n X1Ӌ_49Xblu) yj(c[|D c[6ebEX@m6,I 1qź)aX0[jZE)acks0b/FJՀ̷XO08bit[C4{0πcɢH&1ޞaP G*, ŀâ0`X b( b( h";pwR`e`}c}4$N-Άt CQ" =&8LȒBrJx䰘(E _H"tJN΃/0wvJM-xlRiE!<VK$DX7\R%E )) EWr覥v4\OǛ3o٥)(1 2֊b!y8{*f:12}NA5цDTEh]bI#8W ^ m!AG5Q Y Vn%IĕE-CJ䧸)0$蘵(:]p D9()Ghcs<(@ +Isʁz)x!.$eM38; ҍ]>ZRBH;'^?57<-uC|]aW˨<-ڃ_i3z#n@|?]M&r2=A+cٻO2br2a`j +}l~1( AԕtA!e :{h\Z{V D@J]DQrtGd٪ٷ'_+ϻL)bղ\|UH^\12FũlGԙQz?oѱGI-ֵ'NlcU0/KMORng而]T9E}MnXɆpލL*k)^m)A ogktk5-t{ н ]C:."|!SkVxǹHfԉٵE-Jy9 UG&Q'w!\ւJ&iuLxIM_iڅMXxrele|7uK/<ˬx;ҳW7I"~[uReT ^"9,O<ngD\Π i yT 1}ٿp~>]Jr؇u 3%ϯyނ2 bǦ}t?*j boRΧE}^ O\XO8FY᜵$!2$aO`ꍘ'?Ž/ΓNҊux0Ш8վY/!Ѕ*\hSE8?խ {xߨz:\ٷbN =! x̝cj<|kAݴDs08JZ{L!4FѴ@$ нe2q$ RQO##-r QRuX/ ̠/=EhYdMؘ. `jz$42paaA97wPDIBEpT#Ox ZQ1S@G-󅔢 EAg X hjDga1}4!I t!!!E 7p ZP". B;挮Af /FI]Z1 SAW<_?J4*G'Y,c;&AF*gلgFJzBB$Hwqmzv^"өgPo /RB^;XTDԺbHj 8(IGEC쌃sqk{o)Q}!U IFG2C?Tk7=% @[S7yblb˒-??G,SJLsCx`n|;f3/I6t2˯>2?+34_QD2, =Gn{/%Xf>ޕĩ<-E*^x!^>W^yc`ZF0\L\$OT}Hkf4gB?syE#}ۛ#-3z=1䐬ԮAn%Z5۶CFN:JNZM2hZ9&8O[!8UHɐ;kX;dY&775믻?e74G7ܮl7w~v(as Е. JY̓C 3n<2p=ɺt(Z:/u%~Ę6{򞩼-&⹛gt??H`,^4 L{hoN߰T[7]?PUE`?hSa֤EqWr5K/qiгWYb1cPUu%)bBk߀$5H1mkw`kkVY(gŪ<- ұ?,=v67V~ :ciRDȋz/Ŏ ,XG2NȄ.[gkߐ= ɜrD7tLlLWRLau,ik5rZ XKt:8ڛAd= E o 9SҖizV",Fᡴr 9Ƞ+p]vq u*٩ JqWxH:hiڵ?J>lZ~aEaGyٌboKudY .vLqu{HX 9fwFJ, 70dUB`n%< cs)qSn>yf"9g1{<OKz9j.q"лW u≰ /߈-N>Ənql5j6].IUŘLVGZڗ_Qc^ʋ6קnȅnu 'H3IN#\N;ͳ$ kX-j?icpU'?S=yhSyĢjv2RI=yWqYXlj%pI=^n0:@M*_СCtUxna SN< +Wℤ$v{3{!N= l8LVT%=ېվ/1R>L/!zbh]GbJnPmF zo|NXWQ(+Y.QujhJwEQꥀO[(4NtIJTTtJDGbj##fsV9;ǃC>^B"A'ɝ0{ we̘|5ѣ۷//"qqq믿xI 9C)M=bmC} #wgHPiC*cAΚrmKo:<40ip x/ⓙ7 Exk˃dCgTU?'xl >_gM=t?-;|}&/<L˛G+8׼͓o܅bw>>wM\F^q]eUL7f>gBɪ`J9#ۓ53ƣsMidY뮧O$%&p8[y9Yn:oQ%%FK ßpO9܁)VѭHt> 1B[ C ]Q5cW~<=SnZǺ{ oqNdWNLd\=6&7buA)Ny#*yDAi )X-wﻚ1:%pގ4so?qSV+'pÆcUt|V]G.T/㤋/GcQRh@Qe$!PB1K`psVJ|\~ (B! 5sur,`4;Gj]4upҨA>2\62r( aѣ#GڴMk";+P[zec%J-[/qx4pF+R7-jSEpl)Bݬ֑G9a2p=8(^vI؆dIksC8&h5f}k':O,˵t%.Ul#VQt k8d"40&B N:8!7",KdzHThMS9I\uYZp|*3(W %+-Onߜɀ_fcXػUz>՘K$X(-9QׄݦHEɺ54Νs(lpQlۺ_>$#{b!cGtGOQZSX$tNN3ֱ( 60`xe@3d(-Q*(Qvt=lAEy)kW3TC 4?/ܱ>&4P % R=P-SIRr1ׇ݆k8k)))pIv6iiG'/16.b:eͣ[Yϼ{.23OH N!% 񠺪;#INjgܹhG ͆>vD">!USc ,IQhqT"BtV*JTz84Qqq j*~EVku0(m9FYP2k֏f^]N['r8=brx7ԋYlC}x88$wiSl3dcZ sy?/+%XKNjr`R)TH@ \-Ll F><'j?m{?oyYpG_ª:^zݥHCo۶,ǷzY̱,n=r9 !PL&.YPx9ArHǹjEnyo)3W`i x@6Y}ϯE"&+NO3t0-cZ:uZ\ y[ޞ]ߔty1钉R/_{PejϠss{'1e+Uokp6^~N'MO}_| ߑI/>i1ea%\F]̍O]jR* $ie/^C~~ :tjC)Q9LB:ˣI/Ah}Yϖy qmSg3B vġ ([%tջ e2@>C]>+/r`?ȌeLi"P$`M|'7b12G kYY[V~FoP3$= qGG^f 6ePR6Ǥ/f`" ]@sG̟εW}HA{߱1mB66 -Esx痢Dڅo|{w>K&_vf[w|Nlk9N n۰#'߷*7O7ό.ᒫ1cRpT([Ʒ+q1na<\Kjڞ=}>gg"7OtEv=:(b2j L[}f!\sMLKD0"%Hdzs@o׃~13Ł= k JQJ Ե/=)Z)/}Z¼".CG2w:)vd;ӹW'"閦PGfڄG-yWɽ:|8oe?z5vYR8p YXU$B}Y wۧ9ltnyw 4 @)kU#;Y#̢X4k(!n2" ?`5^^Ur97BE,ca [.gUxh˩#:`6RT hxWJ+2ځCsˈp҆U?GfS8aMLrRi;NMrchk,LI"5uDuqҩLM_CTiL9k]+qĦN?j׎'=ix?s;Cz͸Uq\|JF}t>#qHʻ6I7 w4.yloȩAۘbrHCf&(۵HKn;/y {Hl!oyN7%%drɍɔHgkәpMfo @#=;f +K]{ xm}x~Ϗ,|k: ?974ebSb*>ɖDtQLrӼl씳Ƙv5g^c/_4TuY2ANNζ,^#sib`}֥^V}K2~$NOcfFN̸ ;Av`II9;o;gJ /UtҞ'<0O dhь!zT(Q$v$M7xg׌Sٽ9;q lA~ǃ<٨ﱉ$;b|o)$b}{s9&?Wc7|^2"4m$6Ր4|e:=7>Ju 76?Jira~'SޜŔ>ʐKb%G1\Nu+ /ٞL>x~-c.ahâ^ǐsՏEkb@PȀf(  0?E1`( b( ."Y/(8eဧ!(+KUU@U.$Il6HJJCN@+E -V[1-tqh.|qS{ѩs~?g^%(9ݰBΡmj ?Gy fөKWL&{ zVX>{ޫ>{|:>vS^" )V!6V6SYlݴ6mn7;vWXJy )J:f!&qP !"mշ0 k.=(Fl:*˷&fEkB^fO8%b- f3l/䧥,٢bwcQt*^H"Od@ΘLVzT߯*E  M4 Uq&0En6=HQ4Mub?}YFI葮'c6A5+a*C{& j pdHe'ض}(ʼnRh&)VB wyaY+>5n *zŕx*v~_v0bP#sk7bozٷ "E "$=^Ecd(Ys;3 vc#xe9Lʎ 06-yyzV>qz!1tH@e&t)?>{ y ׭U>?>M(쩠ʅb&11vPRZڵ9O8"5~\QC[b+VpK6I^1cpWY=`jZU1z5*E LNf{"؈}~b- 'Pd=c((dBd"zaʧjT4R`.Ye3Ev6}(FIe%Xg]gYI~$HO"ɨB$4[LQ8uxn·T.t@ vlJ߮q(RIr2 @`2AIUtnDFXVXy' "zBx*.@tdI"p/t4UqjPU5PIQY{|2VҪteZdTϫut˪]1 yvK,jh5½*Yi[U m,1x}m؜"z ^{|l/,SqQUYCM˃둊SF"`楼FGB<+ڗ5,;xK,4E5Qt5Uh^@mxB.-Iӫ!ɱx|b&>]>xĘUtN".BR5{$<@NidYBU5|>B p:ݸ]\nχ㭳(.(䗙bIH22 {ۙd)9D-FOxṲ5#I2 ѧSŤH TM`Ix>_Эs{vryx<~|^ϋWSMS#b(( 1F"T!l_71(Pw`AJ Yk(|Aj7>`*(X3^_8J4j43A)S qzudM]j1=dUU8=S]  8^>!lz 3LC_ 7:2zY >U`3 $ tM%AjFM= z5\o#gV$1=Dk1bK_a2%c7{r ~׫bU,RZLE݁&~ JQ*ׇ]C!Qilbhn/mccC{8n_VI ?2'tj 4U= zg#bMu@˞l̰λ}7J2sW ě)T]kх `WҽM];崘>bfjbbBnW rAEQU ;hQ4MlzYℾ1lYjI IqV;Y6aaTI:NBѫ(gY9* !bc,*Wft:%el͌ MӅNq4MTU54%0~?2Fёe43Wh`7 #_g^7BpH =c0M쏞"#-.ә|ʌ6Rf.|~)jǫ|*3_v[Ih~bD._ *XC[YOQB?%s{Wgy%Ք* JhQ@U TtiWxl z[Kgғ$zd0Wm7{$}@y,\XTv7yyH oW#9)H~O+зk~.,SW[7z8@[һ[XE=}O+зi?Xa%LTTT~@EEOg?> tWKwCyKJ 9 !D$ ss:/m[‹g>~ 9C-(,QWS3wAa<}歼:&ƞKLcԴ?-jjNN>֫(+s{oT0ceeI}hO=koZp)$4,77WVVq-jj I%YJ> SG yu W.Ĺuj^~~^~1QOp;I/Ԛژظظsa!\@a[/(, }N{)""OE͚b Q4z\RSʰԌ~qꕘ'01kqϟ>z=w bJt:sߐ௎ 2ds_#8{0M>q$򾡡|*:y]LMNHMNX`>58Peri7_4p :#+ B7X,%%Ňwo߽}C^d6{lŠ *++#ǏN9b8 *))Bl J|s~(** A~}+++N:"xnfox}7x[#6K g̚9CUu}6o߾ÌU+ijhhjhxmɫW.7514p4;ËyVV6渻@vvN&b"nKK_fz[ Lf7octu016k#8^6o74"IJIĴKϒR휀f#YK[֎Nc΀=}m]csq~E \?}WP|_\R3gTaZǼAkj蚘qʶXSCs̞5]XVal2$1llD">||qo0fҒL.u$6sqrrl-jXG--C WP>tmt= ()Mtt,,-Xͻv6" H#7og65  aMll8˽_~]LvX,l$l!Ly:fOZzژDZ_b/szi.SFS)e^mjl a嬬 =n?mnnd<~ $#HKKR 132ڦpR7xFffUUuQQ@U]kw5eeK'@[ j055٨ /֭Y߽-?ooo11W66y:t|SRR*F>fXm[W\i3DDD޼Ly` uӧFq11~AԴrhԞG@=2XR+VD7TWU-Y$*fjbB98P9MtGlZZZgϜ74ow_+WVQQAIHH,!d$ {{wo޲e%݉GPRR47ͷ twz[֥5g~&WRRPyN8H^a23!q\NNVJJ xVű׷ '@c{wݻsݸh̟-+'WVZd2;*=a?y*))NǑsk!oovVfB|ܝ;wSSz/^UMGC B iiZÆqE22aމpP"#UVUi UR(mb#g-/7K\1c45yzzB ^YQ!,ͦ[m^~TS8uuuzgEy ) >ioOwv&TCCÙsgq!>ޘ422t<0kGeeh%$ l?OVZ)룪:ijz[oDQXСm9s=$$s99< : L&q;ڧN!**rQ]]]O0Av[M*u7xce)T}kUH@JbX,6e,ܺeAcrR(&_bIS$%> m[#?Ϙ: !={<㝝yr_EyOu붋>aL>~>}zVaouukVs*G||'dFgXje|@Gutb &h wOzwx:G:M =gl6Xr{x{3IރX6X z_RZԤla>rEX?W^WVUIHHhkOr2"ȩ*&6.0@rK`iayFk++NwvLws9#?]G}0=~2qҤG}{wstppp:W+',x!) Q𕥥cWs^;;MUu#ibƶ޾qTM ߺ`ǂIo\X|o\\\|M a?Oυȼ|`65b!/z_OCWWW{yf٫̹6E~~EEEl>BDDf+**vL\\\ |e}wW뾊$߯9f0;۰0)$IDATx}Lw[@uRT&bpډ{ L4' n2V3"  (*̉(/ B?dnq\'CCz|s,UadL'ryy8 h҈ص/Ϸ#IG^85gVoڔ"r=ʪȨ 2w&({:QuqwZ.Ox}C>|]8hG!eAU*.Z GTn|Rk;Q)v `ɋW1%Zȍ`jEnX:)1W1hRGVj<֐qr<eE﷭nݚ1$ʨ3iH2Z1>;؞1='oB 2wD';,ٕ#K9WLl)b Kg(=9V㩬g/W6ܽyhzHM:ǁ wfV]|/ﻟo67\k豺z_MoH Yo(PIof_翯R銹y|~Kk^nrO&X?1kōĔu3dvF?Wmq9smoߜ*z`&BBNE̲3FnMԧ~&DnU8[щ0BBY# !d +((v6!99 [/ bA?gal%''sۀV,=!0VpWc CXzroP(#mW|6]clbod[pJ;&0 a8B6 GBȆCٰGHU޹0wd%F{؊% (fM+VC]*a+0{ 0b C~B 8B6o2rIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/transmitdrm.png0000664000175000017500000110052713203343610023260 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|V߽yB!l(a "*⪳öZ.kaą ٢0 ;yƽ{F&-Z(((k鲕.urЖr7**?/fw/C쬵fCw@IkAu%Z'6)fZkjݽ?iƄيkB;޷)f8p[V#hX+Bmhc8N _%lchF-saʶIG)ƁvzXN퓃V EQiRJB lӴ.pHtMCut6@ӝ aCJ݊pӲlۖah 5ttM?Z\JQE9nDAmϧo^.UP-`X  !;:eJyyRPPH~~>^W{Mp$XE0[nۇԴ4۷w&ÉeY@Y}1*;$}ɯfUAon+$.΋FM?Z&%%m@ H]Mz\ۀ~j&n7q>^=fELjjM!]ŭ7jja$$ڔI(Bܤ' @X H4tx|fCjkC->M|c3% DoB =KLfT Ⱘر7zu=4Mx*߻:Ο}_YይƟ5>}|j%\_ޛd5Y[8yl.;P[(rm\/^ĉ5=3H[bBL:mRZh Gd2heƍ',¥;}+AN2]Xn&L G c-#|UlYa`kߦiRYY0w.eSXz}yTTTҩSzNI:Ng_U]?ZϹ?Z.^w;/ ns)ՆB"  gۓ _{ue0!9Jg &n [/tF,g&NC1'Pҏw }s ZY 7#6~< ^+#.!Ġ{H^؃ R++ `X&|S*~q,*n`O!*(r܈^Ya :3e4]{vWUP`6F\\uu~"͞3ii-%Ex iӥK…,ɸMip1\eqv2efEu!J&:շlR^G۠[_MT!tuM…ÿp@!%qq>  Gmm '/{ihS,iS'{r@1oDڻKxl+m TUD%'==Ѯׅa f #3k7ުZFL1,_cbe挞@>-עVFPZXL@ZTnD }ߍ8[:Ÿ Hd];iq.*߬*c[I~!0WE9Dlƶm\.F>`N׮Y(Jtڭ+~۶E! !֭+ Nnݺ8D6mJp.4C gwc_>jͤ>*u6íú2(=-~[W{%Ǫbrgq[w<6 ŰS(pCxnljSڇ~I@׬-Ĺ(= ool;<~;':?~s墮K|V7qfƶ>E-jQ185l &ok^HZԢE@ ĄB maY&vx n Iw:bㄓ@( 95~@ _ E(">mN:e"-!)IE!vr Gߺ?RNALZ$xז8hx'/cG*xlenj7:Z3|0M34Ǿvj;H8N$ F% H2;dZ; >aF0ͥnwKfכз7`0|2q|LFם6i rRg5A9IIN8#-|Y,y%N]>uߟ}H"rY^W@ȥNmh PLj'qS_>H_R\JQY;ϲ,\.WT9SO=W_itꔮ t-<.NͫL|ZFDGH_"o D$EGt>n 8"\ؼ7W򝱧暍 H!7~XMש Zjmͥ}. C?O<&>>j#O? m]Ǩ@N&l uN'MJ )$"PKUm z $f& HVinwXT 5G)ӫ5yNlYP.ulȀLAdL&q`zjt06<-ZԢK}MFduc}.T)E-:ض6s7hu4[-D7 BNeeU4r-w P˲ *+[@ Vm"l-~T SGr^7?>6W.5pzZsG\󑚚ݼ+{ _AIVVUUUhxB>xf`~=v)ChqL ˻Dv_BCw%wH6V^ߚݾK.M6hGyLv=> ބ&G"B:<.؅3$b/>kCn|F{\Nb7Ot*p̞hTKDëf!nJmxZ7^IsTR"WߑEuN9o7 qN2$Z9 (J4p\öm4MУ}'墸BGo3wXɸ-D rI ͒ 2&ύg $7TYr>I1xw"wo.UYYgq)XTnvٻwmk.hnUCϦ?D JV<(x #0*w# 7’JW6):4Nb sײUTz |Ma[g0}A]]fN[G _I7{{NH3{8ɘ $(+B(ǭRap-[W_5\~;:gM4tMGuhI("PVVN 7B4]ðp!#7ΠJR8eT\ ñlɰaC1 =tU6G4j8Pz_|<p,2l]Vn> }0R6xBw{X[#Y\c2͖N;J0~xZ9UB}茮gmSWWIBu1y#G Ku}K|^ն -Lӳ=.:Yuj-p̴RUO|95`ԚΌ5pŶ6!E|75&vai/Iqs=&6 R  !hS(۶YrmFyy9>On]ՙQ+|tll!''Zs;q^ taKo߆rq{u !I M1*& |g"5vhx<f$լwY$K3:mwro =ztK2Q4Mٱ};Zώ;?r[,˗9ON'WIm@H88MvzË}1t ׅ*vw8~0ptt:Fqy4=ޘ..c^)_ڽ9s0{l1\,SN% dRRqw^0EvIL6%z=\萵"Mjkjٽ{7z t۶(- 7o:t˴صk7B^ZAˠFj,4bts A3?H&a\VSB85#s$ 5ȭ<:hkEQDb6K ##CD] GuwϦWNOR(!Rxx, )d5' "si4Niʶ6BkBSEQݨ3J+*H'%%8/MQ' C j($i_yLrr"ݎٮ(|u7md2nN((?M`0Ȁ^2*8i" sg~{Eirߟ1{*̼.=q痷s'z:ZI=";%4X7W.ź/vҢ2~FYQUUů((t,בl^ou(Amum`oϽt֕O>?/NqjUWUu ֍;h'6Ot}Il߶䤎N((-iRo67^&=УLx“y=w~>t=zv3}tr崱9l43KE/[rضʹguVvKbq\qɕkg/[g1.oN=,\uw8fOJYYYfL;IcO7˲l(;b\>v7\M"{fTWUo586 P\\˘#JK_n}t|sy`<|z)Fk~?)((G  ~²KYz)={hveK7}͹˶ؽ{ϑD&0f:U+ViI);wsw.‹wOE ٳ}%?G gy)/kđxfvsWpΙyf ?,j{dْϘy,JKx̞;hF\\\t]ZZ))\p/\ K4 ]/:fO((JӎOFkٶw?ARAmƚkr&qBJ4MGJ>ͭoJ\P(D}ykK>?9ȶm2gM4ƌØqc7Fh^c]u'G((6O㡺 +SXk\ݺue~Ξ{0M}=,?~ !dm]#蔑Nii)lێ93={_^[v722MKuu5)'?b]ykKFlmǃ.? b[6?cڹ{|vBAEy$$&0~8x JK8i"oTVT+sӢaujb^ 2:gХKQ?)((Gd;\4vpمQ3!k|W<|߸˨_~< +oowݳ˙>u^{A=az̓b: > IDAT ݠI⶟yk.}}=K@F Fz#ireWSZzy#ýwk:6o=DqQ y\p\.۷`̹rOغu+fK/bYgD[I#ig}Q?)((mM?Z_A\~e~f͘ϗwtRiүN((J{k.((( EQEQEQ>U(((JS EQEQEQڕ*d(((ҮT!CQEQEQv},ײq K 0PG']ufP!::9(kIPvsKBFiy1^In& LRB2ut*6o5 2g"WEQɘu̴}'u:b '|!_W2cL2R#pC9x {ҷ9-oPEQEQ:\BF  `*Km#tD àSJgr{c !#5(X4OFj&{ a }Ã((r|jPȨ.gίك9$;*]mV믡h_lZCn0~$dՀ\_w\Ã]JRZG'IQEQEih!# iFNjrBuO5 ݧG?:fufdFJIR|2:naSnFCQEQ8-dkF7Rm"aiI )tԕ=q>~=<``A,EQEQ0E *K1h4:7Oҥsw痕ν[qeG'DQEQEih!öm108wƹlܸ˲Bxذq풎u͏!-- )%Zn222ZuѺ>Of ^- ܇FQEQXG';c -Ghljr}ݠ!h&O=A//S'sz%Q]fqodi8\BXWe;~>[z< 1F_pf(Ԋ8[>O<$$%%167vGKSEQEQ7 l!R]]EߙGϳ>磏5.3bv YR:5--ᝢX&0h`Ο5)%ͽF0nx-\O?]˜Qc2d?/RJ˙;B2#)--'Ma 8[o}.fo~r-?ODk_f8#YrU p{Y_V\ ?˔3x!eGoQ5((ǫ 6B&HfVHABbS<7lDHAUu=cw1+Wi6q:o&B 3ٜ7m>B 6g~۶nGHAYYSǟi,dμs䷿j6B:ml={п6l_} gͺ<ۻH3x`%>x?O;)9K/!S:~fj>]w~_ 6mH}ybf{jJF"-[~ˆQtdr DHAii)g圩3e?Hd{³/q޴YL71~/Gpԙ޵NQEQE94(d, $uYY >^Ac{ fڌ3X0!7nŷ闟g^d'B &L+e+;a %%%za颥Lz_ҒR8bf4u}4y /k./ZƌdC\\PgigO ǃiH$P4=h9>-g-iZt}7/_!ދ2;/"\R4zܽ4F`{}TWWfZF٪{((\Q_!h~fl)kxYs4MG- ~JC~mۜ, i85o(G v:~[Yg za-ݏl4?T"d}D/@($>>p2Dl_$*ٺe+V΍9Hpٙo6CVV`LϹk#K&׭),;x ~|` BE{xM˂t2f͝٪{((_ CG]FtE$!W|2oBF g^۶);PpB5yo}!8PZ!E4 s)u݌0o!CͬY!ag[ZНG;{P]]ͩ 3"'' ػw/3gl-nsBRr˭7[~Yɂ;FG'۶,+zl(kppjnS,]6m[w0bV;EQEQ \Q_Ȱe}f`LOqzg=]{5Q.= ̚;ӦN$.~tuAf_4+p9;wq57۟{GDlys^_ވN_}RvĤDä68͍.2.~/ fGNJNmxM{^tAxϿ|4fyC"FO137IѥZ;!wGx<v:~_g|o `c ^7wc ӓNޫN(( @;k ŴBvvyXb{ NQq{y?|1{q~MI-vyؒFLR((㵏_事*::bg9&wtR>: x9 ]•^ˈm.%OQ}t%܃#ri{kn+~p]2{((_ TloMm'ѥb,bGs:჏}ݚ%EQEQ Cǥ;~(gt]kG:^((H7K Ԉȹh'pt݉p((Gx7:,+vt((pj2}2$۸cStTD}bG'AQEQڅ[fwB/(Gk2JʋtpVG'㨪 TOQEQwuUTԔQX\ .(Te `3[l|Di^w)Iԥwl oN;߱V&LOuӻ[_Rp:8}h~Zd:ƃ>(wdX6Fye9; 9-x*h4D~/JˋYJrs0adc)%յUlȧk7d?-3k*d('c4ĥGG:OG3]LV،W5ʄT|_eu99zmQ !Ð4,RHhX[d} 'w=g %1]s_R 8ߟǃ:-^Ɍ3Hd;fҤdFC޼mNSGiy}IQAXڋH6ID~s‡Dp$ңKJ3a*>W%9! cj1"I$Rj̡&i0ohJ :7̔ $iil߽i'  _%v^oR:ݛ8Owl 7g{N 5D5QE94\))Id8!AiI {ݤ% _F&sHKJe-t|t2RgסpÙwhG̞G+; ah>0a$wG )@:EBnASc'4:CY|'R@8ͤ"lXhQ|4x6;*ٴkg`@N. ģw1[_CAشރ),)`IiJ;Qo@N.d((GَB'tΜٚڰ'_Teo 3L2 eqDN靀H4OH'#(|4g0!`'(Ň?h=JYU DWĒ5ZԱ۰kЫ TcI! i6Jf֬?ǖfXْ^H_p y]IҴ9pߟPM;72pRӰ ;ۥiN>=)5/4C$'7@RJ;(~R`6Zig JL^qdvL^q Ȩ^H~`ц*aPR{f{ţk7,I5t$=Dgg}'Q WF~g|Ax{/%AnA>[z@'Eۻm+fїPQB'—KÚ=8_OWw?Q[L7.ݻ2>$T"|>wW^^vx>HFPF3 1)Q|f-R-<栚vk׮%///m͚51yyy,^(rt8"Qߴ$\ph~ ݥ%7i[VǗ_HJH! M4Rҩ+E{zEQg:. nhFQ`7z2cd'$L504yJX^mc&`WR1מʨd444'ɘj9ڲaS)DA}[_bpu^|}W\s=̳Wv.mӳwmL`5 wxoVRٞJΞ5_w_Ni4<F˱EVٿo?۷m222׿/nd!E_$#&>uv P]]CnYO1]$4"v(9FIL^^^`hɂheu8&7RFj7Oc 9l"\8t|*K1h4:b4&ҹ[etnѱEQM憰B85)߾bGު`>s'ppI:y\555zۥ3.2v9 ^It~h?fCdGMӣOq}guU$ @D*?tHI|%!`'W Ѵ8!+koG uا^9nO!RPvx* ػ9s S\@NvK n"l|[J׬.EfFNII> "Z0t$躎in<~ڐρ{ؽk7̟Sa;m#q HE ,tzFC8/~XL[BqYQgg1ԉx\#>cɱK>5%z\U: ([϶mL+ Z^MNW;G[kpO8;D[¢lMh>"))s2y8y:T|y7ə![bZe}l~"+ٿO2wf.)InB!~=WN/|z4q7#O╒pC]xɞay7m/\}CѶitMl)qaYP41MP(eYض$ 1 OB!*++ٷom2ز O#@.$ ?%Aqn 4Zv-#FƁ[.]~N h˪K}pwZNƕ|i N{grl_Rʙ=i-o,eK1M-8k1zlf K>]œsp{ a䨑Wb8{½_fΚM\\˖.c9lfC?Saㆣ{(J3 R~oǘ~֢2Sݛu6uvxMf`w7cj+| !]񽲴eY,敥5mOH[RR̦tҒ:܉N&#`M⯫mJW;cztrt.sҹhNrƕ%#ݨՀoq}y* *ȶܡ~ɹ}V,H'f]:ٕPSQ嵞+)h1Z'NP(DJJ DuO~~>EEENf3^dAOO&+ENp*ۊmc )m5HGHDlk6N?˶mˉCaFjNyU9#zF߶j7^{omn+>Baa6(G#m&>K\_?ڴh|BXjU|BXE˫/i'qrL?+Wawyy'bS9|àރ{0} = g]?}fXŗ-/Ds!]:p_;sɥ0gl>[挼VUUɵ{Xz7n䞻$ o? ϲL?QZZb.CQBo'eٰt}C?qD }aj[s1S^E+ ^;T|GeE|BPف2n+ ؟$$hb>XIlۺY|naQ\z%ݽ}rRR&d-[NrrCr?>'Ϳ#kx^.bv?w{;DJIJJ gW^EJIQQ駞֟Jbb"/"y#xB!.('w3}2THL$5΢q$V1gh-[fTTDSR"1x6w:Wϊndit~^NwF]%W.) `u3EQcTS6s!*x"Lgˆ`$-W6~.tW{/oGCE;FfFqľ_h"G9sRQQsnr#7wbpS IDAT 84:?'H)Kb:F2͍(ul?4/RFxsy"BMh}hDFFv _[D/tM֘, ? 9)aPFem:4ܩE;T|ɪujBSR󎓪MٝNYXP(]Ba$XM5Xb쉊-QcE%Db!DAeμ{Wisf=ÞsϹ!dvU7PP&Z6rW_VHV*,kCHyz'|8z)?6w6\׍;L6n_3axfFA8馿q[xWT!CmWh4=`0H RB jlW ,–L4t2lR ;7J)LƧ+>`/tcu13~2Spb3{ܾp<>q47sc9УijuO&$)ML) |jhi>f&$ݞȸ\C)̑5W^kCCfD4YGq?#Y[fO! HSrıl;W?DmE.y.m[ocv;2lnP.åv wOsrƏOE jtFrr.xB7$ Bm/<ljNm Q@KlJ1;dQxdv8D~x%2Ǥa'o`A%b4R(Lk9qTVxBR߭'s& W_0~ u=?:-S&0v !dO@PTOkx ˿lb򄈯_J)XssGѣ)__{”)Shnn&H2S}kk1i mVVfH7oa|A,Y2؍^XXw}kˮ?>Y 8` zʛK\95~ Ik=v*LM`;vSwq? d}u 0 Sv+|&}"Ư.%:D9xnZ<{7_{/{nwrױ}톰6Ho'{^dn|6W / Y!ns+P(JKkk]FllOFfH8xԷk ,YAW1sP˜03w{ڲ|-s=+pn1vm\KM ߭1ۅ>&T0ql?ܫ?ϰygeUle`ؼofF: Ү  `؀wߥ"^,er ҏ(TA bTo1t6Z8w,8SJ)E XB8NJcT˗/7ߤC>’#atdVWZeor]sC;g_l#*B>4^{uL `=y:pU),E['Bat~[%^2ka+J0hp?VMwB^nV\8;q{Oč]vyOBp)OeL9=Goۮc%Mzmjq}s7qɯ.Y_]L,̝iol$ɹ?#<Q_WKFh#PP 9R IcQb" I7hL]wȕX22g8C:B{ˆb@ ȁGƼ~/I?<=%[Y,]I%jazh5Pj5Zi7"bl_&cBz0+>0LauT._[ǔx!~4L@ZZs{1d3 ^`˖-$ RsY7)keQgeqђ.Ֆ'# Ιvjrg͟m1iIlaUk\ߠAJC`0if0ȹSYH):kO{L&v&V}QGa_">_۞Fn(a{qﯠ?]yiԭژN4ٮj{;n,O.|笛oNz kd:h-**>s[hz|dH))€RgMa(Y̼P@SK+E"#%&_{#yqK^H_^{me^ SޞiZ o0e2 *b-|6l2T#1Tc\BK]u[P 4uAA&4!c9ϽɻDxwBJqLS~mqay*|>YpjJJJb>0ƭ_G}}=rtLSBTWWǁ"GQ91tϭȤBd]c{w5x':7`~ .0q##sw0mƴ66c*zW"H Eg?rިY{d0,v'x6l?_OW.ؽef{pzEEQf:N8ҭ'`䉄!9 vyGOYWUFOyYR6{^~>i4cƗcᷔҨbAp4BjH4f^ ) [- dRQ$Yfn}DBeC* c7W])k.b [Q>BYf7'5+Z??1 խ1PRi+ '$ EURdsAJМ[ |n-0樋2uRB~ŕ{s v Xac`Sg\d[o>gfX\  _~I2.7'#Mj9`)kvʇ̲Ua ذU;m _9:x t8ܳ(,,dL?PiӧrEY?;? fM=40`mn{_.=?=~>wޑޕ>:tFFS]ю'y/)HnOFW4ww᷐kF(^[^OXDWZjM֖tk#ۗa1AHla̎I"+OLc[hLҧ+a{| Il& ~Fѧ3(,3ʚIW6ۓB}Tÿَj`}#āF$DlЌ Hgvh'_ۏ\'7a7on/c]aERr}|fвf e;56mwW̶ݕ]`k&4F=Y#kbq|0d)˻(UqVj*!1Fl$*=jZ/i/c{iCq`dkOHxF)gC`HJ Q_ &e8RD"[1[4 !n;xm_[[&d*dݙtxZ gFǖf I"Ԟyb`9ͱt^HN0$ZTDUs4|Ew_%_|;IrlDUu-7TmȻ:h4&$B( -,_{b|:DZ 8VSP\ /64A(JaHE+̅ݠ|iޘ=-eOQRYIe+AOaL )W)5+b=6Av29gc4fΜ9{}&3g{}_PQ93-duI&qYgmU۷~;@srН̮~Km k@ݏ]7;-zkt"Pg(cӓ!2@0ǩkT5JZ "TAy("." fY`2fK{>05#c{uZ;R֩҇?Sk/{\r1?8A$kbݧǮԴ>%%7~{NZ=g"R}%ο2ަ-9v|נPivu7|4{ѴjY+/}IߠFWޟzJJJ"UR /M&-yĿPVtP_}ME{-k8~>/UW.-:a]z{xS*饘f4;1iI;cPP(ބ֌o0 Jec1`ęڣd52vaME%ٲl5&3aav=^GWޟJ;"ҩIScom% P-w+ߊd+Lٛ;|(Ѫ4:&Mo!QU9fOYNmp`JƏޛ=^GQWQJץ ZCoO5  PXW .l4#ZnF^ګSc{[ ;uzjMZI`IBp}=EJ)q +%tdlKVmuJ^ T8{;D2J1tvt1h#Cjd 4!~cV&Jڵk6~L7Cҙ,0MHAb¡0>ħJTrPARƈYYv}vj9D T*U-/Sӛp(LQAJJ≸62(JQBnpx~R^#O:a )C!1RLd B_Sn(`'(I3hz 9 ;FBHI(1KapN4tLi+~'] wLKe'c~LQz˭Sʔ|3B  s~4BeǰN>Hw~ϔ;<8c2r䘦ϑdoFc2y*6tu7RIL%2/lEѳcҝ6T*5&yowƴ0'%ҝrSR(w۫^CmӐJ"]3oxJ zY0t9Ӵg:WBkyRtc3f[ӓ1t~h4a|n.pC\0[OS&-0!(>c»shf'w:sZz򻊪޶ڇ)L r iRwQr⡜g}7D( )e\5حWj%ҏsȬwS!OiF4624FH%0 žY5~d8Pڎ>t#]/ɗ)\mw̡tF Vhk!c(# gLG˿;`.Ӕ 2eYyrlqd19g}Cӗh4vQkK D$RHi"dJ&LY 4SHbIi D)|Ү?VI_~e#M#GKScs OV0g3~1sKILJ_6ELir`}V6t&Q^L^)vrdִ嗫[s4Ch4z=~lFg_\xQRWǢgmW^)%B )1x<g~Q!BXI%tVI!0D(eaJB o_ªAI]c >G§ihhmHzqF~s1|$;o+9 >_/OZU gC;"K_/NH*fN=ȗfZy@ZiIq$@(JҝHk=O]cO-|lhlʇFәh#Chz1o_r>3k6ov-^.gV4ϲ_\¦MLؗ}.a&haw.)ja:3VrS ni#)̛;ʁSY9yifȁu LiFp=LR(CtǣfKy IDAT=r!L]q=,B0oc|T81GˇFh#Chz16m⤓Oo7|ٔ͜R oos"ȍG:0F 9?8W_Ica^sm{p7lFXJ.fhQgZ&(+Ǔ|x!=3vIi5 j*,^ªX`! SaxI.WAii) q!{7jj6{%|aFyOoܜLH4m*NVNE~W}S ,Ut6zFbn?w,x9 ` }?OGz/"p3bHfqg}~|ٜvi<9wM'b㵷^!̌fp2|@*\&%~#lE$Rf-\> ;H!w?O{TE `ó=WOP"K _oxxlPv'->Ǝh,9+ϡиg#v27ʇFh#Chz1[Qѯ,NiFUUuuu<9N9d>g=ذ~>/;2W %s*VN# ՚u0bݘ6sZ [a?(H;OOɶ3AAA=0ǟt<ǟx<|8_g %K㏖ys-/k׬I6h:mdh4M/bN k0SxNPN#"Ȫ )KhP74\?ňxM|JN),|)2~KeoG>O.~1p 2]>}]>4F{24B4Z/f?r6,Sfps˟_}9OW|QqУu;úx!PWs B ؟3.{w +I <\tŌm/̘54h#Ch4ӵ+o2ctʾn@+o -=df=h#Ch4T U .)B02W-Z>z(bEGFT Z5ي1/9K "Z~v[tD>T^҃IFFh:P(DiIM 1ޫh*%IBO*otHDWwI`(jo[Eh4M (QU u[hjn.m3JJGqPH_@HmdtҺ4mdh41 VP-A;chPH>nJHY24mdh4f rՇ鶄62h4mi&1MWdfCZ;H_M)1mdh4Ӊ (ӻ+EkxkHaaWwwƿ-|tK M&mdh4S1$`pha ~ʰNW#Pv>R֌{/թ ?孆:=vҶ mM"B4:<EJ)q qvXQYY^)rnO^r?s[bIOɄO>4݄hEGFTL$Rp(R Ke+( aRƈI%1(Վ}Ⲓ)%UJsT  STPx"  Pi_(MWOkY'Fj<>#!eH2$=ƀRʖvdaTvDTZ(Gvl 6¤:V( fZBFTR) þt g)pUpO*̴Tə dJҫS* 2&W3j[N[J)%B?fdHcl75gUV's|^]^1JluㆍP~YYWY[6cMTqbQm624FH%0 žY5~d8Pڎ>t#]/ɗ)\mw̡tF Vhk!c(# gLG˿;`.Ӕ 2eYyrlqd19g}hF+(͖' @i7>xFt:V@JIH"&B&4iZiD:ѹӟ)MHbIi@Jw.喛oA$J9vI҅ҜKH%z;Hi܇"dU)LLl/IwL)e)R֘kߦH"c>+OR:e( x]ITUv;\92k܇-xnP7X^PX m624qIfweϑc8pߩq۝^nɛGJ¾$BJL)09nGlIkGSg.'DiªcU2R$pv{$@()NY4BXy~\.|੅Odې%`λȱ9r y<[;{͛hM`˵q?ga?B&݇M㑹Z +)%_Ɖ}q{NC}BHj/$M/?$_WPSN:'|ʖE’)]oM|rk yxjӌeGcUW/nKC!elcB-OFcdlch4}-uuy|2{^s'O-xCuZ>[7 ߕյSkD P"q!M+gԨ0]M)0L0fҽfX [My+R}ĔI͝Ge@˩ȼG)g5773bnywq ~zy1zwV,_=S?#F9oRwd^~c17:~?z 4inq/w^c?7>w.B*kr_)Q6VӮϭ#´;">fG#F>޾88Kп62'c[ F i8SȲQWWaΞ#0rQ444j*;vu4y<+?[ϼ0qe.ӚѶ.f?^HR467\9`pRW^Ә<_n}By<n8{T֕f*;Y`Vb%Z ؘ\5F0z|?˫Qy!{o*8c!`]PJo}c&eJ2r4bx"i;n7^H $)Lm||d fN=YSf9`ҁ$E2C.|)S X`aB:xVDo12j֢| nmeh7JUFQJ˵W>gʏB 88{s/= 17]~'$a0r)7 2 7>4d xj's2@[)h6ىD ۠*]z{3qmƍч`3r܉ʒWXr*P=p7>q0[d3(-+A3#;Ii&Ӫ,z9)xdC_9<> ~xׯ? ;n pj|ܢ])% 8N9!#D1lal=s<$q nY=}H$p571r>zvۢ[GeNp}ȨB"ey,c>QSK}h#Chw{'3gțGQ VݳHJ!PRRH!H& )Ry hϝDag{2m4+|;yƍdz<S_s1Mi3Xg蘆oZN>T7Ϛ/פɌPJ2p@p겫ʈR_zkKNNgnimdL;Ӻɨj %4mhlSg:b1N2լc rP%gHC"Bf<}HlXW͞cF+(Kk25ݕn#,/UpuF8mӏB-q/ ]CfޞazIVh4N]HtpL::_f̚=/!ZasM-fhpü4):k3B>22f;n{b; CXbfKԟwzs; wχ3d Ft:RJL){,v$3q4"Hƌ[d ].孖Ge[1 xq8,}($Ҿ?,zC!2"& {mdh4qN|Zy71{:"G622-]*^/X'YlΝ14tbasUZ!xj7ž} _ĄuLyh#Ch4T=\r%?%RPX'ғ-]*Je<Zr_:&=Fg7AK=+y~qv陞 'kѾK ![5 {\f.DFT Z5ي;/9K "Z0z};mՙTҍuu.֕Z{V[b\, % 2ՌexP 5^]rߏqYصW;FFh:P(DiIM 1ޫh*%IBO*otHNTh`pxR:׷)MPh}d+ɨl \8FFK=Eh4M (QU u[hj熔PYяhPeїƿ-Sh C4at$ya0abe72A1ؒc Ft2BB J%({725 P( }gbGq?ݗ<Q> -/-!7\i+LV#KU૲ "h4mB(wF68a-tvhK\_{-J†k[Z/2!6FgMF)C#}FwRa;fh#Ch4LbfNTv0mM#܇<KYK;]E4i5XH>OB1(5:\Jh4}xk+`h1[V&[&vug }gbGzT[fo:(i [ԅW%b`J*D2hֻ[Ki4cIP ʕa+J)F*M| a^ګSv {[ ;uz{Iۂ5ъT EL _) !v))amDedgo{i9s=ymJf'>H$>T:.@i=oSؿ.#bB< icd`IիR2/o?0$k#!sڵGtӼwyOHH I1e"]a>+ Q* |ѩNY[s<M=MA%cF`=k"X=F[(R }'+i+Rg'(p= 1mRफUiL+3i-WAJɔWyiv?)S̈́ OSb(TO=0B(3eDd|=֘^gx=)rǕgSҩ˪qaR3r L,g SQ#{Pgfdc6{6?xm&#GTA,HXӓMF#(=ۓ-\12"I0ړh4)Mڥnbiʤ?gLx^Tko Yj*R^Ha£C)ϓR(or~,#D4!MFJy<4 ۥ S"aޚm8l͚%0d+G,kuEEw6ΚcA^OFq.U[E8;d-l5FWR"L |ڡPKw3lǻ]x('i xG7Jg}JaYDjW vki+#DBҌ ix͔Ay.+k{\ z26vC`plOF2dQFOΘ\wb])kdʘxۿ'*ٔpcs().$}=|#ޱ0zSn 59p-9 662ZC1 Ri% P KR_DF\{uX{V@JIH"&B&4iZiD$,]ʭ܊fIL3T!MB$Q*/dҮ?VI_~e#M#GKScs OV0gԞ ?_Ԙ9%Q$H[cf}"T&J49>+OR:e( x]ITUv;\92k܇-xnL(mB~Irh˛F~R[>x>Jp~Y"Ԫy6å܅ߎ7 ߚw/% "PHf ԟ~AF x}y[~|VտvWlV)K"ĔSLSreW1yL7}[Գj*']N*4BSHR{; /.[oǔ0;!zt&B8 f#xj444Yg^##H2bHF scxW,m=--랼[Vgfj%Q|46Zuu|[kMCy2}3mx36TF̆FNu=56'FIg~M4BJ,Z[=V2/ %%lE%W33 q(_+YJ0~xßkd ]C̴CCQ~9DFoXr2s¥@W"Ch4Ywى3>Ohnn` XŹg>o}C;^3}.<Ko_7SO<;o+s/[nKR[W+}a#>˿_~#^#g# ?D}|s8YDcQ;sǽfԞ<߸/wrndmSMk˿5i<_݀㤙?oE^s<~O=8?8tw'pG{H4|^[}Yz{{vi<o/S]}3>wyN<[oU'uXw.r}~u ͭ7/0e~I;)ߙ\}ax^],Yd}L \82بG 2Z1[.dL OK$W %2>]JI¥@CCQU^DRփlW2GlM.Zdh4fL:mߖŋ ZsɅ`;imfim;?2^7b8#qKrJN?Kj{Xf L<^}.¶mLRph,o߯p1ڊq}qL:%Kke]wfM8Sל.>xٷV{s r7y'vۛ GUu޼WɏJ[{{Z6~P^r}f| -=^׿y8ؓ93qe˗z>3QPR6'c(Oƪ2h_V-EtOLR""w 4eBG P"#.5eIWisN^Q^y0Wdx3ޱDd|<:'Ch>ĢQR$iřiB9\3[-?^{pwORaGc>wcoZ^{{r.Ǟ |OyM"0DB-,\\ߗ.:~ rLWo}2xu9C#f㹗ɝ!3b=pS=ϣ/:犯rߠy% J>.'rF"C{24BMM --tvtH$eʔ)to:ЙĊbRi\v=7y{O#Ozj\ϥuL&y>OƊP(\*7'c(>{!螠DF'#7jS =*4 a%M芌ޏ6ȽߨG 2r фK+d]-Qؾu8mCJ9#KY=#OF 2rI[DE@ڔFm11y6!:\Jh>t,:x N:>'|ޕ{W~7oG|dxpmﺺ:^|˾uP]wۅ9~~mƐcՅ `y5qЁ9d2Lu}}w]o}w˶ ?f}犋M<,Ţ솟RT$fKnRhk{2O>![ŋosAR.I*y;EƦ|44'p Hqx2 +4>j8؋>]>*c BW/bC Fln1{e\C=Mײ;ETU|1#7W|Hlc(OFMd2{5*BsD| #t)\D̝}ZXԬG;"|`Uե<דWDdh4fsTr᳘KĊs7F[JhHl# .ד NCo+2f.GZ(DF2pwnjĹT֛)`Uu) hZGf(x֔f'#mBȕ0~?7h41hgǒ~DA8_-2r*dj(rs2NqI].3 ۵_k̫}V\yl&dQ0pE^kkM\?; ou.ga֗Fl 'Ch4cNIuLk:|&?trGbL+L W ^K†#>qPH`x'ܱL&PA:8i.m}#<[;9%w0R)똗LW/LOsXҙ0s\53VR4+_~erԕ3[qR8f%:&9"#ţd͆ɃI-24F3x #p G'00T6?c|L.oM\lCDйk8'?+?|ݹo7?7!&)g鬋;yNaCӡ凉#w3ǜ17 ~n6$CC Fь)aH'?*[jEbf~ln$RY{^a ]:[`sZ9 >u!.;3x;r}v\]6\ ݋HJdFSlۦX! | Mp.55ض'?*3i4_DFь)mS+c\-ttۿ wm`JJ8Vmm dK#1"C%EFhh$mUP+7Ba`۶yl9$ْ"Ch4ij FfF FlNq7ٚ-0lڲsS4[&Zdh4fI$ؖE,Z.iX|'$IRD#M=fEFhƔƶ,BVX)PxǨEHP>e<(FgF_ Fwr.ٱ04G4Bh{?5(4F~ԼqFH )z} EInPf3A Fь) G)c[v 6Q݁AYn C=]h68/6Au;J1`A"cDՐ/2F+|o͛mĢ1G2W0ʡdp_t笫m!ZCO_X!Y5(RZ`M R5N wu{k"QHՇ@2h_ u ;r A2ߞ쇩A2A|H-rs3)Ur<ַjX >*Տ0Lbj@a2?χ= |ܵ2w#~zoݹ2ߵh4͘>a6Ӥ]60m엵dX"HDWA}qˁ3`1:ΜAq3n1<[ͺOAn>w y=2u=U@Efb` tC(*,D'$րۦ6Wco6p ;rJ!Nx#vT<,N-/ 8{l$>' vYeZZ5D1D!y2Q% Oؕr}<3Z,Q} z9+Ϗa "Ch4c{ rUvhB->k"3Ȁ V2?xd{\ 1m=Pcg+]`g5*4:*NĘuUip^) SVwc-! {w^[ ar9R ~4t<:"zo5&n@jEvd~t/@sx.,Y ^_v pox2EPV#^ZZ*0lgn׾DE/)L6J0!T$sݠ=pՍາ4C2m+!-R&“-24F3渞zF1H%4\o0t ;r38+3: ŵ^B#?%zW'8G9 !m^@hUɠy>֏0 0XFӳ_oq7RSE -n2B`UXP2Fz9VF$cǁb``5AV)Y~)%R Cn/{".лC|UNH2 Nx= .8rqp|(] `L,"{B6ж E@o~ue&!BG>µ_7h4͘{V 0PP-p ́ ~{C.2C/8ߏ1 c4Ұ˳k MA4fr$FkRW_7%. IDAT~1`(Q!4M!FF`[nx rU ?'$/O!Iw!⮒oX"12$H @1S`CJ0!Z]< -`m)#$;$nPÜHBxn0J;ouF {ٷ-DY96xqHwr-24F3xzkO!P(f o8™Gʌ[H #.l9n^#\= ~9${z{[n8au)g+E*&Z,Fut;HJ@R}g%顭!E<J4~clk5@dk:^0HY ⲋ@bS ^bP7n}(oK  }k%$jSƪ=P”<:߂I-1( R N b@uBliDK$wS")H6j$m~9B N nVdg/\n89$+k6!6v9{"Ch4y|cOP?﹝;W5.֥#y^NwLf6ケ|+ho{|-sKߺ 㡀8/0;jx6 /aob{ ?_3gy1xiYg^zVCѶ)]fC$"o_MI5=A-2~+h%F|*[RV/q E"p]EBDVʠb\ein M bkI}ɻ(";QBzޕ^sR'!R|MP=R+ Hv[ԱM(iI ! > 1[`P'8>C FL‰W^ 39go{STTG¬\E js ơib \x~4kq'z2_8 Ln[b1K%HhОe̮7z(5 U$ՖjwD7CgD1xm0ĻLr8| +$V1T r=(S"&0O0%rGEd%aex=rD`a"-24f3[WH|Q~2!VB^2 (oCjp*jcAKoR~5ĉi p2܁D8]€|?'] d()$KWLwT*S[bpUrfؐZn0~IG e9{䜍H]OKR]kUjp ?!>862wÒr{$$ͮhh4!L}9SYb%T~֖V.>o/z|vݛ,Y5؃{8ܯqdK*=\c S?I__?'$ ?pҩ'pֹq]zeW\ʛoqu/>x..?WqB#Иm|V#i3|"Y.4bhCtzxɧYHz$Y?wތ!@/P )1U5B j5Q|Or" S@tWHhTBJJ]E׉ Ge]07ϑqx+8fJTR*!9Ac@A#t_SaHGRo' {DPdh3 ]! TUAj1#"N*Ci{Y @>հ#n;C^\}# (&ubЇW׫A={c]mT}E؀'I}@XU*%@ F}<Ϯ),Y.m3OK_~{r6|Y> nVG'杷_Yg12yd@( 2<.T9V&O=g~SO?uyOpCwc&_;l&O̬gs74)a<\ב~U:\q}ؕ?z7^w#?爃"H9M4uG/26!l0vT! ܯQ`Rʕ$Cv1r/J }?!oCuฐNPpz l8 yHAK "hZW+P^i:Rdz9 R]e?V}`GoagJ諆t:T< N3;ʹ!Q\*cZ(dœNIpVIt:$s J܋Bè{Z≐("udC6Zdh4fW8H4„ \K9la^00 ۶innfřD8~CF_;^7bpKeD>0"[o3n 1> 0 ^/:HJ+8xiο8xyJZZ[YBj mXŪ8+Әqк mOkF``pGaFn>2U<nJ TɛP1IDJ&Ô+"9 ePZ$TCP\)aUvP* {(^ ߃%#kխ  Y 5PT ()AAjwGmJd_hdDx8r)>0iTo51ږQPlwsz^nCwH>N*k%.R{}C-24f3;o堃g XWp=/̂$#﹮x|=ϗm\y^v[\t*eZضw=7c=wrh4ylg(7%!GotHȄo,ш7& >GM "0<MviԏC)\[3p2]"s KXaY$0mը0$ե\_0~? 3, 1u[vv{b䜛Ux 5FQ__ϔS{0qƍvH$L 1ss?VJּ֖m܏~@(ix G3m!o\|i ꢪ ;I;i]];ysW^er?}>X"c]1śเ}t>t jv=(PR bQ0fB J+7ݚ=yl E,"òD`XZ稷9UBQIxUTrC C˯+i4x ^t)?O6m~ߍs/޻/ʇ|чK?̶bV9IA|{b}`ЮY猑Gy9|;+s5?v?5`B|odiW3#l*!RVOJ@,(Y$C!o܁dkv\Ô1GwmtzU2JTlGYVZ%B<@E x̵岝9JƁeBhHwAr JtF51!?L3,Zdh4fT+cl aFGPŃHHyZ :PR(VHzDK%9=*c+,s^w@K͋T_h"Ch4c{x/Us"Vg4xcC:zi+=#*YII㻮fjb֐Y4 #|LJCG O @$ ʠe!`^ףA`[zqz!W%iWUH9E5Y7h4͘dh4)X3C$XcW”e$$ UdHmVY %5/m8"Iƃ+y(E!G_7J)˔>X C Wb吊fu cXh4͘T&k6gf͞ū/άٳpV/R'('rzVR),uwݥz4΅R!aa{(D`t1̈!' -P\,}=zi tvB ҝmKCP5zE HKg ̮&-24F3H O[f=F"\tŅD#<Րk^ hY -t4A[:w,~As6AJɗ-еZ*>dZŵн *Ddx>AU ,|AB@]5LJbb%Lښ{ 9b@JBlWsͨ"Ch4caEc$]͛򪲂^ )0 c#(5akV jwY- E`BH7AGj6$:$!2F>v8#ըzAPDˡ be0u{8X8dWx̂?$tǁ펔~r%@b(SCeP[==^5$Uj(JΩ[JړYIH]חE1(F3wc[/˶)+)gu*̐jP@D4˼7Տ2^ Pݒ ٿ zTnD`bzk;|y(!, bP9ePFh}Arl=S<)%.4J)k@߇ Fo 2H uzF -24f!:{۩,07eQ+a|]]64MBqʺJb%XEOHGeXAզBoù\zirד, %>씊W m-RV0 ūTi^}D8I).x'![%"0$"4?`a%؆*;3.ؕrl-24fhUJ#ﰙb&H˲(lk40l"Ny u6l<$1ҸNFu[%ލVS_BG;Z$"x2$JM}88k(Ι!5Xoh41bǩ;3稫ޢCBvh#h>xG2M˙AzJ R )] f$E?X-͕܏T$iwA@_*=5@h4k"k"%F}Kwh41{ļ7vt]ufK&dhCEEFь1GSh4-!*li6Zdh4ff,Y֎VRM׬l|¡55LiܚɍS)-.۰4[ BhT` @( ˡnyGroX.l},{&"ˡQ*/%z R$%_-[4VB$ M`4mXl3,[VOỬR:p!iluD:i&/.ZBMl*a;c:l RY*V =PV]_yt6L0aI@+$ cvCỊR*Y/פ_U1 \8 eйVΫz2F{3T{յWU 9Hcš9a[row7@J.'!=*eRjTeÌe"F3Rs܅PH]M= f3u]$-ͼ[.6 -ň}pNT]rTJ:zSjTNl2W."P߰|8kW`l7y1UQ0V!9vTlY[u\TK&bBP1A'2UƷd\;iy )W7b1lj01L CY1;eJ]vY&$*ۇTgvt2б ]^)㩰*E*[$x9I0&99e* xr c2dBO!?IpB]j֙d FP\&ʣ!ANi˶xD0+X?Dtxa^ F|L'hZ֓2uF3&hB7Xt,@Zyip#RFy&Ɛ#7-b#/L XO'[&4A [ IDAT)9~ BELA(&l:r MUцmBA&k[Q60M3{,K| rҲ,!c&׀'c$!m8ɸ,ky'!Z*$l"wO3x;]DJj@6[ >9J7 pk丮j0'%o^"L="b<Zwf+Nv R*#,'9:fH F ѹ\ F#N9T_븸K8"o{N:n[:lky_{uʹ#a(;4iMr>;GcC# :\jcJɕ?ޤqb#Wԏgŏ~{ss=Xb?*nw:_f`Ykhla¸+?QwDtfN9)Ty@^vTJ j'.zrˬ EjHB_JjH )/+oC*T'ʄПhQ6bц eR%uE3aJ98i1#eJ:X0]e$A$MCbB2KU+#٣œxs:&Td?x qS6Ԇ%W/ƉNYy"MJ*Er-}O(晐[*˓P\u1DDxP3U0ʻᧀ~ hh4c}kynUf%]>yomZ}-od"mGq[輋yG6y+V. | wj¤M=-a\>ʽw?U<||37~7&>ʹg E6XJJ#4T@t#F*DyOB2НT?|^:2OJ T|j UEJU2$;`fg7\Wi"Rb%“RE-7D8OQ\ͷ1P2׃pDBN% 5_D ]*&{L_7!-!MB 8]l(b$֐ɞ}pS%U]W5}4+#ztn*yTTR d"Ch6|dx ~w- mO<7\w#r?޾>N; \r޻O;s/8Wpy1-fʕ??AcxG=3|_>L:KXh1m_+7KOO/Sw)3t!|Mgs/sL8?ϑ!LH%S#>\f}ȦMQEGw;xI~P).oŽ$-qɅHJ@j8XJzSflw*"d6*W!G*´Tm:)By=w"rP*B%wG$,,Z%eN 0^ H*;"_VyNX9BURzҹ#ʃ#aJ1ӽRT^SDߓN\t'NGK"2r@ F~C8(N<vma;fDz-_e8t\gG'4Lxl3m9`.Rv筼4%[=˼&rʿCuuw'Rpk~I&94k3mSӲhYBcCiSYQI43:k tK믽}o65&Xc}8# n=pz%>?#67 p*%&&{Z*tW)opb #%'͓\Ռ/Qc#=0)#Ϫ7n'QtTpV%Z*}_+Š7*!2+纪~Gd9>JD!1]%4R}r< {'2]M•s zdϓcx'4Tn|Pl Io؆AFh6_ƏǫJ" wnދ{Cf-b/r QYY '~9avg…~1 C;/;oѳq/_{7__{=v 9pto\\ޘi'Ǔ8zh4caeknm[o-_7H.8Dc1ww݄3rp1~VT/yI| Щ} K† -w<;V,IE$!T$^ASPw%)H2Z*THbt(d"ڶN𤸌r醝 $l 9iLʈp]/.A{;xno9cm]mS\\ .]-x?5l;m$ ՏG?_ fK7<<#R99"ðx4C&Ĩ72c*/+grRq;nGJŘ E :TGk$w;*?xz_E&?Ro-HyB-YEURY)ZSüS9:9ࣚPyn_BFcbJDb(ɖ-*Q6r{p7z6-%2j n\'@"!\--X|Z*ސt;$B,x.Qc{s4.Q9<A6ߐxdEc@h6?/9zÑ=N>)Sx8__k?C~u멬GMkk[1?/9hhO[[PV^ƹây7jm Rű15s{"2T{ ˖Dg\LP/-;ӥJQHB հβ .'*#z?UpdlׅmUqk(r4.Swʹ[u@\O0$';%$Ʉtg(R=- )?kAui׶d{Wxqx Vܓ3Յ= Db5cK;`MbOEO\bTWtUq*T"Վ!X1QU晤yeDcFyw^9~+욟~^cC98ԓ8{ݍ+~/~v-Ō?n1>{gYp1x8;3?2-&Ll[߹_:sXc͌ӄVOiX~y2}4y7יN;nŶl.\|%ض/Od*IqQj#e˳^ `A~6AWDԋ:.x$!U!ziOUE!:+0R g,cHbt@y/Q wOw7s}P*74ss U(Qa:d:~$~ːJġvɞ_@Z}2^, Zy JP _UUeWSXJYoQelՅ3MnR9ե4ϩ©ˮ3 95?e_x_xޠӦMg}~}$!0 .:PqnP\\5{:󎳫wrdRH$$(CAiQ)>QD"SA@P"J@H#ɤM휳{sν3I&qx{g=ouW1^l1䄒׸wkyjn!ply0B2`$5N68j>D^jUuJ+Uo"8 ѢrkHA z7T;K lZ y`ip}(WA .ʒy@`V=96N,ET:VιQԖ:Б(W&5.(2H2 0A4]EMc39:vRskqGc|/1TU'o,ZB㵌NBEZ@@I>2RHE*o&߼~̚=ˮmo= 2VW"2 L ưbRzer8,H5jGj}܆in}Eg^UHIWQz!;йu0vVl|ù#]" @ZAupS~"1D .1e{ö7I&V(:- A#) Msu ^U!k 9S\,z/AS%Kז`g!LdvD2'X zKFq t(\^QR p p)q2*RTL6-ߩHE%_6:jZtd RNi7%HVKEP f q36%0dA'CddΪBЮFdRMn__ ElșN{"Q*r]_G4:Qձ2&uZIێۤo 9,Jл*2imƯ_Q> O`"h? SFga&БFX* "HE*2"" |Ry+RDrB#&4IV,mjW:iS@/s-t=Ui @I-/й o\;R 0^Z6dop?"d%R:qo9|)-#VJ`K `Rr)~3a[6rj]s~_)Ѐ[HIk+*`un ݷqV x=˕IO=J"8A(,x+K 57f Iר{ ha%5:PN◈^^! yl/E*RTdD%WQ$$mkvT""e6"b3r-_Xy:rڲaKg6$>N*Ⱦj;iLO|y-b lT(ےiGr+@N3bQ9{$&rs\yT$?9 e%LmPW<]Okqb a Խ)u~3Cn#ȉ[c-)_Ԫ'R:{BlM#/SGOsW_-2 KNOnYtD~4>Y'.wq$Q40_ VR$.)Zu=7|?l;n9E׀WDcuN, 4콋Z\BOyW$hmG]0bM?e1Nl,&VlxoBݲX(ϔ1c64!cEl "Pu UVC+믙ǒvGMcMܪ`y_ jP5]1@Jk%-ڬdy/dhHzOi: _AcmNA'MRe|&LmϦ H㹢xNM|((h2Bv ?Ǐh<‚~A}diPm BYqW5aJB}LM.sBl6*v/.y.뿺@~ W"DPw臉D|ۉ2lҞ+f΀YÒ2 DD%2W)qD5z;(eX@A'_0iºJTZ 6j{|;_,aZٳTncjZHX~|x(`qVNy*W(@*ʍO.eN=EDZ WstJ˟$=!8ut[pQ>[o,g)7+Ǵ84<<¡,_(3_>wDfnaOB`s}|v&>IHxM(,?ݸ!f' >̛grء+BFE+|s~J@0 ޢo\K?'NwZ[;ހ_Ic A"%4ֽ‰;}cB}[kFƒUt'RS"G,}?EO}ͥwln~xE~(|Fp-8Srs +߷x9TO0|C|^$ik%؎ڵK[GݩfGlH}y~|-mwhÍ7XDdVpV +RT]*Y0ݝ{ʪ_T|t uҼkOCURvm!42f: V%xe?^~O]x!WV/y<ҐR}KrR0afeCO@.SjF,'C|:4jQP~ >$gB$mRU"ˑD=@VBStLz/`{d-ò_oI'wy͓y>N9qkI?% ?Cadw~'m!޼#H]uT|5:.Ѽc<~H#{W.b,^5Ղv OQ.%F=/$xzɥz|~6_uS5&ؕ^ w>AR6R ny@ DNCp``)*)==@kp3(AlHÒiޥa9}4d+mOF/=,и:r= tgLzų!;`>z[cl1<$\~ V{ ~Nqn`WT">*pP{JW-n07F#'9R֋Yk"ER M:bH%XN2ЫPbCn`uö/H][K uTWKԡz=qT''}gkt =waԬ1* (RFۤтLTOCq) @qrJ8S,Dj!9 K{e;Q8bVq5py[[ tD-Qnati;udd>/j.\,B̏_Y:KhX}}?{ >xh$Er\U˧OB"J1MIXvdds+MY97.h,'Ӽvw@҅CN2ookn8N}*,~@pu;F/piQ IDAT+˻XZ-mg t/&Ky|/;OX6l2[-pO[cV9t%\1u`Ѱ^/d=g),摯{$tQ ?8D>__IїQJ s ɽ9߼7u]+h9 =>L_B.^0PXu> A,dLw݂[oޅ'őx( t)nŵ$6>FO'il8DdoG1/:2~| xEǣ8?|Y.x2gΓ 尀]-HcڪqN*T8'K~t>^/~M\0Z'h :ys$,xOdVՀUn dɲ-+ĮѺ-5vn;ZFC辫S΃I)m-մ1Vе%s┃5JTLݦƦbK"g${xJ|ϔhKzm \5ɾwWqe*r!K/5c·%9w3oҰ-9nMoFc"O8;m{ "RY9щ'G~@5>Ўހv* t){U#xаt]UheZnYբI+I2Cjw蟧_Ze^s71D u 0Z)Uo" Oj*OBzR2d_B)J0(_az-^݌j?o@V S>*uQ19Z?{mpc+[BӧtV05kO1y>rI[,7gyy 9{l"V]g{ ek~d V9lK} lCn9!,wŮ0+hzwe2=uBN;{;" Fw2`O!:'SIj`]a(^ə*9jUM9򧈋XDZY]E<W&÷M>15mB2˂DiK`jX*ge HP>EvO7$E d?Tou x:zz1$;HQ 8_mZZvNs^=$Ʊ#_r 4"=@^mKU\jMpSoQj~Mnk3?[k%Φr؁paMv\?\d{m3vE}.*2rhYD)6jw_2Z uLpθSN܈VFiqbJIn: ƝI0qg_lTZQS$f@,vK- &3 1jNVcJU uP3G)ߵ 5pZ+%QbAm])kn@RPV fT[c`챰0Teq0JœBۇaQzf'mX0xHV*z2~ hZV 7e+l5fwb;l〯E -q-y׵XL"n-nPNjS๗Op-|,Ӿ6D#X8c3X$@Rw)/'8UgyO/?PJtK2IlD]jQF@6itЅj>cS/N'MS Ұn>K_}Koig DH{d]ƋؤZ/'Kqx|$M>[p h!eP_93r1Ǟ`]:m,^^{gr4>Vdddy\}bיs9xgG ~u7o^:W]&f'CS:X y$wlS9$m:w0jRěߣ"6UMddcdǮ7 Wѐ`|'a½5L~w)uӠjȌUT\ʑQ,B_z]"d{tފN6(G&* (|N,r:@ZGn x:vI@1Y SrQq8XZ*$͕4U<^,@e| EMDupo#kkkC=9j$*eմ~+(YpM龐܁d\?¼S|Oi 睪 &ʹLst .َͬ5xRa4$iZQ0dFo|As%|3T?Td%NJq<-!e x8wv'uZxu3kl~upc+ ~)Y2qypvmW|\EE&d HpE &լ{E̮Z"!St5vhʓ]™괒mR蝘?eE~> *(_oaggy}ʚJc;*,jJgj!ySYDErbՉ 4EYq'V5(z[S,UITHWa8<[z|RPdl_ K@Sz+t( jw߱n {JSCf7iJ\B &ydPڙ/<r7bUAR'CO@Ìc)h+Zb D DxGd #~ #YίLy _b|TAqh`.E:hwPT3yg$jn#E;sixZB:)9G )d>8{qx)YNoyr@2 axSތD2A~i&_Jp6)`9#U{?Ww{%6q*-k^ɧ/O]"7Sx;y'i\GD3֩g6 nlih2;A%IV9p!#XJCDUJ:x4m>ʮ4lFʭI>_*4_N<0 a}E+t;91o{xn%o_̂z9搀\T@ض'/VW}.N^&8]-K2_%\[%i2Eԇr;oGq~8ekjy㾿]聁{O-\qciim)fWcK/6_C<2ga"#'#.^m!mch6ܬ]fQ:H "+ 70}AU_LɁPYRmMw2y,m}/ @m+d! uMHLiNVwnRuPӤ|jqL:>Q wNevu6۲9܄0o[jLEz4LXq\Q{vbJR.Lv\;y_g.h1*AmE缂j ݐݠRCR@eF˨m9{Y5N/;vD8DC[dBH02_; \~G/g7Z8 m%$ <)9w'B(BDS߿y*c%JnBP{lяq')GXw!/}s艒NL%Sݔ[Ӭ&3 VpDlNk= OB+-^ffky?9<u)+f+yf,_S VY!3S(Ͽ"ԗ\p K8LC6W`Ʈ1O2cX3\VpvuvsŚ/-z\$@:A[B)ȡT։ۜai=:gm |{Ddը,u 6(EMBURRIHG@$T] 6H&(jSuW5}qv;4Vu5)LGTP cvUF|B1p!N~XP~m =P\5u@L9E5/v̓Ԋ " A**/>%ym觛@1eGt)# ~]R3c:nNA,[IZT3OfY"am|%\5M5 d ?(S5Q!J~t/X; <4JV.Cx\l M͒\-L*aQM &Nk*i +J>G\K撊R_5 WNfO?\7ޢcYao|fcVʝ/y}*}>3+۬L:b%NTz:V]n/]*&{L}D)`x䎣ٗ{XqѱqyI<ŋ6r9t. DFeu`񽀍6sؕl䶫q5P]y{߶Y0w?._z?v/>skVa]k Ͼ,Sx \wv/7p_نUd$dŎ;WaFUrsf{Q__~}y7R G_JDr@zL(T^JBCiGPcvhw6-Ckyؙ\RSl[M]h NR%H"OJ"J)[=j댭MԩU5OV5}5HFOLUur+3$F($vFSY/C[gƁXVxFտjT?d@#4֗83{%R O=}36@:3 >x84pNm d͚o!Rln7/ [%\u]ߏ @ 7H upu>Vs-Vt6s;./~? GRPF0}>dO]Ө;"[:K8o'I}b,ٗS؏N|+w>cʺ$wپ5=4;0IQUpN~譋c6˸oZ6Õ2a_K6.u>'f'9󴵜u(OX )UqmKzY3|$)+:_C Te5M5"F|)-j&FI[r1mwv[ֶmN\8q&OQ1p|Kݫ.uL+?0vn/я)Sp7.ÏgI>l?a<8rWK7~!{>pcX=wn?2kD?# 1X+ݾ~Rh{W Ld$OC1胜ݤR*նIW M} د}ӗ%"zS 58mۊe񥫣[z IDATWck4Q& + Ԙ2uzh. n2GYuQC,€ y@[6Xbo.w (a͕I([W ZDi& `ْ #?TRi0c^g qPkk'Nw-.U4UexɔD@X qd45PelNXR,{\c-+4da49nP!^7w|&KNa=w ,53o[%nZg*1:zb VI挆5}Op ,ڴЩCujod7TMo,\;}uD#v[/b0-=ݜ!n 7H(% S&nsZ̲R\xUw77np;|>z Rę!9 l?Qw@mn-SpOOoK|ZZs*5,oXny[45 ޏt"7{%/\w|#EOwvƵ?3`zIzAFig|+/Sމuq溫#>lvf~8z;ذ =ٻlG̊D+i.~oB(>T$jC- #%>w~VC]pj[}, P LZDC"/h7qʶ(e@9F&ReҟE*a)(422PSvhQ_GA)ɨ1fƃנ#{U6LQƔfPV t.p 7:UQAL)?Bɰ@F BZ%+Vr< xH;;M: ?Vc$1XȨu2:uct~~oi=.Y ѦSK;V6s/_vʉ37 >1YrG&^X>*O0vkǵt(Ds- ZBH>/dT JM Hbͺ2)SՔАk|% yMS&hSKl װoɠctqظM+]lbrq)DP^C Z[%CJ?)m&sO-xt36fG|uD"|eH ]fO;sg͊"L ?ܬٳXlaɱSO;SO;eȻ[5~v8r*h[+1 QJ+gg*sh8 Ք#OlRz"u^BO V=M `+ XG|^(BR/l);ODRy2}֎"::Ni|-@]x*d.Bej2/,_¢CQjL/W̌<@Id>JD6am ?6v"peP @!%4@Z+ #k"F2dM<џI :XdSMq cF3x=X3O0eoJl)oE|lC-\ZRdĠӔභQ"C_a[Mci̐+)uQC/һ&l>WJiq9w&V?i=o)~bNW%U&mC9VHB~e~oYB[6Kk:Ioga )| |)KC0WQ٬>_!xρ,Z]xWI=LԨ(|!9`_i]1ldWaO͝ߜ;\nw8lRʑV./O0bB:\ Nb;),;$pld:E",l!&HI)lvPW&F*лRY`cIȰRL1 +$RPK>eF  ?,a `l6K+""APXydҌĻQk0'|_cJVOCm> ;?Ա-5"Y\TFy$ӟvJv!m&=Rgjg]fUT!VV]_vpB/z}$QJq1cwAvPOMheh z`OEK: s> j5?kl`X`ׂ$Az X /2\@mcaQ\z+ 7'A reWoyd(.¢wqM$p~E.,M`.Ж&[$a2BlBGҥ°qwkKI ]ºL[A匂xxsun-5ߚ?ܺ`ɕCl 8)l'A""S]E2"mTd"XJAx0JA-2Y-dA@ %Rg Ix# yaY8nBѣ/K6'Jfߦx~l[XCyzzp"WX|?a=j-c\ĭ\V.6N7bq?ou:x dkna~9T"L@BmGhpa?fp]' ")pYMTρ&R YHT~܃xe.!۫V~)CƷ!V 7EB~_E}JUhTcmRU*YSOq\jsE)֫"M^#\O)QW;\HU7.~'xcfEF23W Np $ba ̩܀`*jàKm.a>7G'R{UR6mHV"ëƨv3n׭vR$td*e;E*t*e[R Vijb@Q)у! ЗƜȸU#~@>_q+-yqX$vH$O*P(xr^@"᪱Yz立7Q(,6na3a*Cq[g$N|@Se)zE|ϋQ+"Blm،b Bg_ *U "HdP[@)Ѧwd(W8 Ȳ!.wA^9&'Ҫ(IndA^X xG zgFd׀ ܱԀ?Zo5XM  K Ў6?~QWu-ocĆdHIdj `ړc{Z ݆Dhzd麱FfiT=UW;I8Un5!JNH&N,qUU5ضeYXRLLc0 ՚e M} (:7@#PNl3 eIx^qq]˶}NRɤ2 l6Rӧ|ımRJMxOTWWS__G]]vQR,;ȿh*R%6TUe"" LFmA[5>rz;"|0/Zj|_SJ&P fUWM9%ZGgM;+R-+JgiA=#.5.cA\7mQ\v`7ArQ)!ۢta SzQu4\R]M/d;[6'-"z6jg(t:u+. TR0:zWN|OqC}|g~dTA,+VHV&q)25$ZNghiC&Sva, KXX86BȐΤ@GyX4M+/c|3 |״H b Ca )="~0]ץ, vD}EHl"LhV@K{d2I beA:.Rftuwa;)\/OO٬nHEFD^Ƕq&p͓zZ}ʏ]W/ :v۩p3] BV\-VP,7 EMI*YБtD'jIڅ7ߋ6BGY2JIA gimGEn۴;[ϑsP]ʼn> zUF@v-U)llnR`` XQ_XDeG`]QgØɰ„|qq&=E+YP(l*&r4BS oNhpd1 bYSuˑ#V])Q6׭qkH$HVa96 R;" uTUФF%,e[XBH`v HXڲ!:nK RGd#, HreQ[[eI&Տ.A>H IJl}R[8t>)f8nvH&]|y855P tun`U~?2ys Ѩ"UUgTͷoAD DE":8"e1$'I Ms* [yꩪs{}NZZ] /a$)۩zkR -72m4?y&&47_&XF|^Offj!O"J@j*7¯P5ElJe4lgwˢ>du=ʋ`3h([cxdU Q&u jޘxZ%SPX'j:m;pzat Kⁱ*9G{d #Sį"O8z\H! z>S[}aq9(v; q=OR/-4 I 57ŌxQ\ HG([i A ZJʭ/@ 2[Uʫ`өI*EKiX%J<Bb$1PZbؖMTfll$R/"So$Q6~DWQ+.@@Ũe\4Xy&}+ !m@Ai\F$eW{~\@F̓bsGD2'%Kp&𥌢$,iF ICWpϑ0@j巁(&d2/%k#|,-m:oe.NCc}R81-kS*a t&!l*`2Vʷ)viիs Ż8x` 5m28Y@HT !pL} kvp_NUp.2x$P%{&W º.ۂkiq^ ςA=TAm6:hk"c.\'sh4_ii0c?2d{rźhR d*zT!IvbؤcOnl_0e4)¦oɵT}EـQf+k5 yrjq W#d \=7 8+B(e S#xx.fwڅTwQε> Q)*7Uʭx+ <wEP-)@{xk!av6ZdԲ WIs9W<'½JWS>1PS=FR~}e-bIf ǭU\\,` ѐMJGTD8q[Q^;xJKV`ܴXX /N,J,#sdPcy\VDiMKiB6;NTZH%~8CC$qZ[Sn,tq=5b cI%C0h'F7R /lb1Ig9"!aa)KHRj4x C)?PD(nFp1/l'F3amzZ~F۵}[e9f8-Kё&RJ'(Sp$*5{m%g*^Ԯ'lA$2UۉX2 h8JTj!hfIUHY3'GE@@`qI`1p*m0{. sT IDATZ CXBeAɇ|VxmNT!>qXQwJZhDxlۑH`!6K2?bQεFE Bb3o% 7j!i-UG)y@Go3.n%KkpP.!N4H ȈPerl |e ckml7y5Re]OuLv (ŋz^0:<aBj"=3cnoT K9AD._$+-E2Fc#w~,X{;U"R¥-bʾp vPh^xa w~ CCE;Gցe~@X$" τm dQx )PP(x{*/DEg,K4DaW,ʹR)FaM"ux$g^3xRǧm>^X}SD:"-Eժ*EM,jܽo"?ѫxl3dPQ{O}d{#l|3|ߧ!bD:ZU,ڵ.lRe Q8 ̛4( ca[kX qI![D%Ie06Vhia8뀀L_T 3@A -Z.r +e(\:QK@NέsAU)JU,]I1Cx"[2=TVs_,YKm7֝UK vҷOURƓb#Gy}q2J@2)\* #;/6-Id2P9Mx$nDȎ\I ) C>ˬ[uk|szI8E,BO*aarW]ŋbp~˸HZqRx6+ kT$>ǿtH%,\8P*(˴ Lux鹻ɌMJiy ;쾀 FEJa6]38ǐ%>wS|sSKd~4ZWq6<tݴ}S D(?ǑGQgxz˿Ș]}7LB&7Ŗ)1Hol&ˍ7g2js ]D_o=DG2_2LV#h {axY񂙐F5]5_kc|S4O4_*akxU, ^/.庍V)S]E BT r^V%cL:f}1FnhrGCƻ ۭB9ƳH(y+thb ߭JFm@F€K ۊpyFI7F|0oG-\i+!DQU+Q˗/F=z57t릈';=6]~X,qN: AYXhL ~k E^^ukWpaf]v%r(5c59΀n9 kq{OEGx:BrdbGo[+^h-څw>S(2Y|kԊnB&7JLа%ē 0W79~^=R |Sld]v/Teb m(fWzbDː!Nn3(˖+)Zu+LƢ6ɹj!c,Lq/54H&S964йmG /0}WžWjFTĞ s!Tоh2z˿^  fPMz00J:f13y1>zwRQ+ٸ߂X nl_dX GDs 𯞓p!|nUo*$hS[zi>&G}#Bϛ) $T vNB>{᪫<3q%g": 8L9S%tOt^{?V u7l8ndjd.\/>PU]vP{-!K 0D (/Fމ:0CCw>'>A9gϤsћTd #6_S1V9]Qi}g9sm0 "b1t{̛znX - ށN< K=L7A@"Nb޼\˯L61͉ K{o_-zMA;Ekx=eKs/f횵̝7̞3{}e2.OD2E\ǣ<\LXRG{va\c6s>zτQoޝ.kcppS?p*Rٳo1gv7[W3>G?vWߠ:>5Zå>?8_+ Rlcbh`C'_+Xϯ:r<:$>s?[~qFGGAl杇9RZkBt2N?Lx>[x?˿1/k`L \6;| 9ռuMfD*RU K<Ukm`'LMSZ ʐi9(C!/ r?1(_* B)1Xf^__lܘp, cr~h4@]+AHG!Ȓc*TW咤'MQU[oeyC6ټjO쳧oY}}5TV.Å/~Lr}/+j#B= ߀gm8hm: sυTJn'{8cjRuHvW`Pg1,YP,sNn/I[G;]yB֜GO/Gutt[)Q}Jcw/= |$,'}x++?QǜquZxiP26}}\Kp~ϱ>?(CmݬZ=JWGX'7.O{アO?Chdš?Yqs N;_ qf.aL6mR~Gap/9::{V8n,"cIP8+,:u̱pYo [Y= 7݌j7/ܫ1-o L=%=I?_sNz<|cgqqGrwJ;@$VϞ9m{\~%eo_λW~g,s>>YE\+#r?{uy{NǞd%/pʂ Oϭ1;PJ!\tɅ|/p{%;f%y(rsy5׻Dx2*Զaзvىo]M >nu]N>41oIyș攏Lu],Y~3BN8wrCP?wW}j?G`sdżi]y'}EK7GjnU #q:ɮ6Q-F ['ET\(Rs1J_MR6QŸuIBy!ʶeLIZW8r^3H?$Sī)b5Ȍ XdC< p$dG`iI_ꂖ `pHj^x7d˜PQ5͡81ȍ4حH]9<S@D)G0`1#RVyseM-hrL۪ŶazDu6 0&HWv|;&,_x!SgV]}5ꨣ{\h:WZ\"眳eZQ$(ҒK*Kό9̛]3Xi@t.A͜IZ'?^]}'3y?/(~/77Y}x?=߰3'3, 3-ǒJqG/|z w+XEz}.^Hhia|lV6/Gy,¶,(,XPs%!JɪkY|5#cƍ%Q2ϙR@k:YbM*׎J"Jib[GDTʲp$^,x zh#:Կ}],vOc}k?a %a07t:=)')'=Ͼ/,}뫕7*S\C; Bc?~uyGxg98'VMu.ao$/x:"2jr#| lyYr5&}ij ÏgN"BVZ0q?C?L/'B;P(>C (J/-oֽܼ:>YjUmWriP.k Jk&e^V 0p?4$b}3m¢ 90 te_ n\s?j!VU2d!r̼c`Eyl?^H^~@@R XzW(!W50rSKte0R`h1q\ƌc @r^<%%B C%)f4lڌob`|.NaUHۦfזiԯ1mm}ɫ4tQ_q6gzJ)o 戋^/@_}r/KEY"ԧjfNpsPwKOΠ{֛ifY[YWJEQ^"_D&sӂsҩB/$_̳bP,_}w߅hW\̳jr޾;ˆ^| eUkB˘v'>B>=z0ݭ 'Xu?XI3s/,KQ)gm {udh3kV DeV~8BkG@׎H$lf!FVkI 2/F#EJ%\j mhGT"Ea CukgX/>ϒm䞘׫a3[qO%bXE\Xӿ $& ښoC|cOpwos\Xmwg 'ao}mlƶm <<,0`Yv@Euo|?qV@M0ԏH5'"0( &edזeQ.ql)@Z.$W`aO]_u<K)QPs ~<> {h,bL-ۄKu^ Hx)kHd+mE*njT=_=b |(d݄JU'7)+57ȉ>6bZ"MZU,)GT:qqe9 `)@4xt*뀖Z*g̢V\ϨHRAy=vF4s+_xPqkʣΒnTv, RIf$@g+kdLeYloT$ӟNgYpݍc E >1確^L'?--Uf6MPz-vL笷1kۙ`ϛMkK mV,_\mmDBF w}d%w_.oWvh~{+&9.^|tIR&,l\QMx~AT,C\ߠxOa޼Lfp?ĺub U].E ёI Qέ?6: ~GT2M"AYb/Wk׏+#DZql ۶ -30ToFwr%Kx3jp:ĥH$mϋ%H$蝽,Qw{5:@@˅I2PL^ $u7\K:&N˿ha\1O9(l'u]_UEV91ozWx1sߎDQD\&|7:k~x |5Û>I֮k-7nf͚yd(ˤR^ϋfKKx|-[!ވRdԿº:^DJK7{_ƺ>엹W7}"B\al|0 3e_yS;| @F4zHuKk! 2k!; \pcƒ5% AZYc0F`x U0jy0˰f1 O?ARX$//~#_*"%$ .k; xμC$uR01o *쒩9CoHTa O~x[+$,-2m0kgE]d>GI5((.լoVP]%\Q_>q-K? 4׮YE[K P<o&^V`vQGba{ࡻI2^w߭qb|=0H~]">z0~RL㺐JJb,#Cr]g1%|:x1:2g"q葇r_!q2K_\G6ӯ_yMm)VBw /!Pa(kg*=!c*QX% '#&j˖M:Ҿ[}$;!= @v7eNf=tۋB9z V`"A ]{A{x4B<8ـfI`;X4x3 6ƀ" .h킖Hυ Zfzzk8e㰤+Nu4sK)d0=p zRś1Qފgj?G?jj*@Rp! <+lOb-$H${1$ZRaHp&YצnR-Il[Q*itsb} /~I@1:2DX0),( xV˰?tK+Υ_&^}-{ŋb<&kEXgDq W%8/};AلKmmm RHFؑbά+ke a ~٧56E)HV%v\!Rf|nBjhJGRė<:(ik/Q.eйy;r( :0ҿb)0ȳo+tw{aFm7{>{f;\I['l[dv2vr{kko] UB6es_jh{՗;5l;W~۝0;XaW{+ar1s1Wc9> Lds~G8inYÐ=~+7~C+9H!+\;  ЗD"eW~dJzT!s[O (N8)E)/) jB< 7ANOȯC22W,j܅%T+ap HK&ۑP,+dj`Kl/^}mC$I>vU2&ctH'ۅDɍJخs1"pJL:XZ 3٬2uPXo=е=sOʼ YP1pDcZ8 M8UY\[ǰ&%빥kZ=RŁH (.n4a@m/Hs[5jUSOMh3ձ kے_C2#2KQ+XF8 ծ:)C°|beQ_SmAw墤园 Pf ; \yE-GSw;>],{V_z)#|%k~ҰDz(V dm 4f[gtLkX %e`֤&QIZRw|%!V:j-([)< KS*WE?8as jXk}HvP,j ?xKx!oȄ1m GB^zaiö=~+\y^X#={]~vq.hO8CXf͞Ɇu}7O<] [#ENRLD^K6 {{ GL?SEK*A~c))rzPE Tv\ 5m^eX f ;-:XnL-5٩r#sn6Rocmn큖4̜/z@n\ Q(s(衖t'# zwH&ɸۿSΣc o k_c_1580^eY1629483dnLL :Beɹ4ۆjƌ"{j͚֮m+[n16S*nE@8J/<ƱJ715 HW CXqleh`X<֨ 'eZZf=rϜ!|2=܏} zg oYD>X!_r1\G Bw vZ[GŲ-<,R%t`5Ub'm-+UJ~Ϯ%Eq}_d̚UzHGx^ jڣ1-K$?*d)V_tz::nh{V>ŘZ?0aÃ~a֫RpFA JfF z /C4:)h0fVȎՔX(VR"( lrA#ʰX)@W.Eh>um[<++B-  ȏp\A :rxw 0 AI: Od!}P@I* }A$sgÕ%<fmOu/de-b3xCrrt(]!Jzw+Չk26u-u:%﵎yʏEk niT}hHfX8Nah<mBJWFl/16sjDhl(B=R8i\;p]uUe[kBijQ,f|FfDkR]B/Pݸ~ 4%Ftmuyl۪h@\X 8-T*I2Ղch]dFO Wυ˲lq;Mu2s tmBa[IO*%bY*:a 0]_QlZK?>6²㸞T /B X[iiy]JՓ1-pO99ȃ'Sz,'X=(cKR< oj4R#Ai\H0]SpQ&%VrL8"вeX)(;,7 }YnPR6XR./aGn\9x9 8Z(l9us0R&$*4)k#߄N6<9O%2t < LSQhA_ndJ6Z +Ax\m懖˅Hn,MV`^Vؠ}Y]q<\͓V i.A؛Ci2umN6 MjGP\~%_TCs/,&_4[2m˙STUȖHCevRK$-f)\i_~Q26gL,Қ`L&뉝In?|k%ܰe+c'H| }W utt0R!C U3n4c#0>z|iMoOZytw;=< >Z+tiPY+dQCׅYD:Z:ѕʹL˴.-j:o?z̡<ȓz̡S)-9q 0 d%lBVPh{dMs[$m +%\'`N7#(H9xy@آlm$36}e0R>[DX/ VCtJNHb- HQaҽ3N\nfvK$X+ ' H%v3!_ n.B&MPS1U 7^ &e16 <8躈$@TJ8@v&֭AF+fM.zC,\XSϔjW%׮mw\G>q68vxdcu󨔶W k \ED^ݗˍ%7GfxPZ&*r5…;ɎS*֊sY3f`)%/FEvO8 x^Ŷma(|#c# Кnö#EzaEGف) rukUN,̞vrm.xmbF;Wt1dSfA4OFnfArx2!X # 3fC2!z?8Hdk )bQcP(#;j܌Z.ͺd X]GlN:p{lBz[C^ D~\﷟[X*U9`өXOo=O7=8ޢĔzhiGk,Neud] Ȏg?{7N!֬^XsfWێ3xu^,EP$HGܼkJQJL˴l=QJ'(jQiǓ):$㉆/OUq2 V4j Sn ٲb,D4VN\a㐷%˔2 A `a`X C6+*FGL̚#񌀑|FB2wI^ɷI]lΊfΓ~͋ SH5uCR@nS.29ziXVunڲ7$|@>W&sx5y¤f:P7NX*FzZ^_iv5ݪ} Y[]g}W @Q_Ut`[ 2IRnZ[ }cNp/E A|7@JldGjte <3 \^M%s>Cv/lM≉@\=u nJqе د_OŦ2*W"ߵFyeWu;wosdDf$4K)!@HB`T 1VvaW5nW۴ ,h76Ml6!, h$3I)Șo~w87L,/WȸwgTov2|4ӫ98ۇfAH*%i)eDQvs QozY|ȻyȹLbq Z<G`\<&6搋VOҵ j=^q~L%RUj67kƇ yZ>X.x e^WmS jQViQJ0,6Z$`<\ϟ$Du+TA#A>ʃxkoyۉ󔘞6/xCc GuW~eӰRtD7NO259 ʪ}J^@ \"OHV)fo+׿퇰kRr2&t]WeFJƞqq*> qGT e&.'$~H^zerɇoXS*v;^eБ*ul)bF@r8˩&10>qXZm18`Xof& 98R* PCihILLLf mm(B fcЄdmyuVےJ{797Gw8L2-mٌq!onկQL諔t$#ӥjosvG#ۜdz;C eĖ_ͺk"&kl&ZNU7xmOt1;-q8?θڐJ|D)03rjx.-HZ=z94W>ŭ`-m6J!z`M6YT5zTcbVJPUۘ"̫q "yx+5V+. IDATY>*IX'-] _I,' >ypÇO11||Llc>?x=qu7xӛG_'Sw#O>^@_PI&2 iP)h;;^@G1^~;ƏNXo"׉C`8H _&G6_b;&ET i(6%*4oy;ȇ?@_ |#*Ǐ#~אE.i9݇vx{?j;G/_\ã..m#KeCב$)I|/Vk04k22FݟBV`{A!1ny"3k7lJE?F>-rhueZ_n1I{q̜F$L3齜=}J//,a6Rb1L\{$R%l$$-u2e#~C}."ϜFH45נ& #(Ei› ʝ=/ALu]<ϣ-B6R" @ކ MT/ 00@-OT”ǎ>|-eh e'R-Cit] L-SHƠ29֣MՌ6Վ oQ\퐍-,(xf[ifMm$QTvQe7LU6=ՂjvmmxS`Azswm9ej9lTl:B؞`Q1YO ˪7| QVΪH=6sՆ"f=qa"ra3g&ɐK˺~?}x7WÁBA6";)_%_9O]ʑȥ%x]?O&0m}ldd%1;$IE\7owfS -z݊|٭H]#~>tDBneeé49Zv)@=ݭRkzg ]7x1ffgw~&G1 33 x?ͮ),@ӵMFq RisLcdt܅X_872k9*} 4#DiL$1 (M  -c1~#SD(7k8w˧↾v`3y-@6e@͚kUw8~4n&{ WY@S K=eUtdF|9|mCP~ŋ:uJ`eڈjK}d÷ն6Lڙ,O\n%<ڰV 9o@ܺ>Q3Dm/7q^ISݳf+{܌gOM2.>D6m|p]a8tH # 5SzΝC;<|Xz?'G?]}5=~D@@&1#mdfgΒ'/dm:o_Lc@`lE|kʮhw:[-l5ʥ g(Uqh4^3|w*`װwy wq/ IdFRq!rggNq1 :K5"B43>6R t@ap7APdllw/sWrw@٠V[! Bu321A:7|#=ܹst:.N8_ n+nU2W]ُߛ4lduahɋn%Z^G!IbL Ð4IIMISAЇ[DhG3o*S4&)hc:Jťe' (3CCCLd`:e"pIq z ;&n?|ع;xZ *[R6pj;QYRr@ϩGFEOΟAϐ1bB ;΅nf7o<^jׁQZ7BJaJ/v'\z;?cn7^O.|~5|F`a tΨk.QR Cɻ̈́cmE&*^TB\Pmզ }eo$~;J4$Nj*6-U@Q-JZ],ӢVS(:hJ;d fE%166ęst;=4ŴZt D54FKsf0Qz~Cv6<-ؘ'TcL𱳸:w]i5v$Ij+,.p%rMݣG@KX\\*B*e|t2c8<2̮]㬭0skhuv횢\X,i㧾KfM#$yLivF_%)LUupL>L!gcС %I fx?kK20MZm^G& w^2nfA' nf+D*rD4HB R8M e/)VHe4!ju(BJ}t$I@{|7ړU;tOɮn΂o>Lx|F-Ox<.`8!/loVJw l(e,CI^)ZS'CסT*yiBa GcfؤRla56{ñ$>0 Am.TS* 0T׆b1r3v ܍d0yk&uocq>ڹ4ݡX) R\)F n@Z-# "\vaѬwAJ,RBP(S,B;=6{&Gpv! ÔFKaBf|r{!~SȻ7XY17/)!RQRo4TOףP,r5Wsl[n|c#8RlfxxTc U0?pNg>i;kMm qb[N$51 bJRJJugii[`5Ԛ=}< 'T%J4tKVK+Cm&%Ɛs,,-HY+\U S ˺xJxrvn$ u\|q'Nt*}ezm^/)p]R%Ct`rrj]I },-:.in|/Y^3==p9 ^H1MR)G IۦR.$)Q)B/sՕ(]ju2-/}v'M"C^:^u=R:9]{޳qCJ%,²,4M#MS@UC àZ214͔0G-~45J>IJSu?{W!IUuq;aXhB҃uضcy$F? r]uB4H۶4|Yשz4)+Da!tx~rʕN.t|RW6Q+`:R$ĶmV#$ B44M8&w3BUh膍i0<ֿu?՗]}sereՋGQoo011A.c}:u믿~7lr^* OO8! Їx P,`||->n<9p2voOFl D/BTT-) D ePg堾͓0"(3 D8 4a`]س[U_eX]TMog2 ίf "}<0Yn cn9ED H2::L-40T-Zp*VkӉ5IJ'.z~)?W/C__0 '>.fO ;_Å-R~6t HNsxTk,U G_#,rRqR6x&LOi$~?Ѝ8Ӈ9 =@6Ra&&0t|s k]} IDAT8*:@h./wm4M0 x ݢmp٥C%jf >ah2fkGead m SScx~DJ.RQ. ^ rqz^z@u9FGGؖfaHX4]WOtuN?#Ggem=#kAD$oK"m,`sg)m˄( pMh%CCΜUU#]0<2ٓ욘ՙkPoK$IG)B4;]0@mAD2㦌 J y3: CO﹜>EaVB0BbRotɍb]nH Bٍ)0$I$iV &U R|G]O$|pI74{wzr%]?$C199]\\\.S(ؽ{7)Z%\'x;?A묮266[ox` `{ԗ^zXU2՚ľj*_i RmkQX>W6 3`ު<3+?d`)Ֆ%dĞ"G58wL)TEp z`=dp W)CE0h)( Gյ9yG=9uCBa;gRĕ LeKSJWFA'RϪӆT&lUJ3߆d<(.F0eѲ^x11t|>O`tK:|yNX"MvMJ.N4 !S9KhzAt @g vU)r !eZQ+1]¥z yΜ]f}cM&żM_E'6(iC|9*}}$&LHj+ $E]Ξ=C\,]Z4 &hחY8Q!J^`h:H]"}+(Z,/Ͳn0IJ|O5 |m;T%4c&a(r=wɉؖ,6jVAXY[tR!) -0 Hw<9I!HH@ :ްskx^J&MA;#t]#)HIG Ø\N"=?T_ $A8EaۦJGSLR,DA߳+P+̙3,..*n1&NBٳgTfbȁسgoy[>@P<}yWm\vԥv5K; T8V VCq J@DY%zqȍ { d8/ӂpJU^VƠ{U8e%0t9C˄0PnQ{c /$@ž Y]P}`Ek,JrXy/CireO^tǝy{8vo۟` iUh-YzV[}O/O͚T.a6ԓ=*NmLBߠ |J:6ꏫʩcZS*t(&olW'Yu@l!y!2']U®Z7׃b?8ĘF-1j:J[W\?A>OQV)˛@L2^Wnr6O۷7%l+ njqSV1QN~ ː n`pI, <4_0B*m_T3qHh Yh +'UҐ:2E9mw*WfhP̂xM}g2"T Js$<-@P_ 504RjCI-= הGVRqO{hAoF< ˋ,6nKTTmkgJN@6< hj(l}UBa1 F9Ca4[IbWsM. A.Rض k fϭp7cF N.gyR D:XTʣi2Mq",,x/DZ DfVkϻx&Fʒ8J 1II(e^/ClbaG7m6S0ᑓun+8yQH5,ǦըV'3>1=zMSǹFBF3tWխ{{[]'k#C -L6J|e9-sGE0)`v$;6C7qkМ[8y@*3,JqS; fB!hvfZESTJCU)) 8sJ5v6A mڗ8'[ǧXZBU0Q>.CyB)t;Y07mfr t10Imw1m(VeN[YFG6K%pES6Vkՙ#q (azz/A{!vgqY2;7K^ÝwQSXy^@6# C*a ;-C39:::T+LMO|F``Pn&QרkLc442A8M.Ydrb?YA`lOWWE|4I&u0 PZkP(?S-#!E0 @k0MJ{㺀Ztlg=8 F )\_\(B077M"",qENpad}]|_bm|k2WiI68 w>*ʳӴ_H&h4X$@k$[6c *jIE*LLcXVD&T6ct8tt{ۘ6$9p_ "*ՐFwi|Gk$QZW0 0ҘAevia04C8 .*,?E]9T)JaYI|!{6k"{D4$ےVp<4a`X >* `uIQAyOPp+05-J:/so!h-j3P[&149_ ;+bh0/y2VP A*"nT*zE z1YCjD$Uqb:߄ FnE Q/#r\ӁP?,hLk0Q՞qhXگG.u{Zr]A#%׳: ^)L[Σ]UjhwF{wx8B);߉޴ =< ?< Ddէ%:\DTVC~FuVUAxd0:ҹu؎E0 ʒ :ɮsCRT0Ll.͏a2?qοeaD&H_b.aM033ORv13;EE8Ep+96lĕ|D(H9GYZ/S,8IQLInu׽M$C5i묭tw>ۦ^k`Az &g&H%SvuL;ÈܦG?4jm&+c.}qmlg9eitvuS(X?`zn)J]LL6|fV8N(s[d2%j-jsτmCЀe5 Н0 _Ա*@RhZP(%ň J CNp,n w1$@4 '#'({6kB ƈfF(3B ?I=(ZC$2@&^*7C:hI+#m`ے@jɂW`V  G!KtVB(KAyae -ɲs圃ڊ) Jnlj>Hw zSZ/zMAGb5]RX{e 8 ɊunfH BK(gDB_jMy'~|N +b )"ηr%. ʔǑ `@1R|X`$ܗ!NڞWGLxP }U[ny\tBk: ;ڭ坬& \ c-$ywq΋;VFtb^lI6oV)i?}a!|s_-r$T0H4Ay{rݗO[nܳik;}ذn=a}gm')簕ϡ#.)+A!Wd!gCx=Mrɋϣԑ |?@kEҩ4|f|>Som]%^]A(mۜK,p Pщx_{_ݍq:'\ Vae+3`x#ˋc/~Atnᶫ 7w.;OCofE&#ral?/| ߧ٬|?4ZG$ZussplR tF[@U6+tv6O}imFAVajjNШ7m011);O&?9Y ›oAFmj c(^nO~{ocuzzPO0lAuwafH i'D}n 7짜q\͍7hnh{. 'A:Y)0l s%>^^յBܠPOtӍAۊ|ZmaBRBO*:zGa$ȉe0 1 a&0a%;OLT"B}|@1[z!EFU! rZE@ HCX+K7sR%IrgƤۂl$nW^D49AcHRm$d5<$ɷ70n@cgzqjqRT ?sDŽVe٢\A2 G hO^R$Ζl4B&vZ$gh TbC xp-_ὼO^;_|!M_m$,@mu$דMh6G($6<"/i6qI'(DDz90?m|_ccMQHP.޳a2Lغ-а0 g?Ɵ}(/.$y M 㾽3ds: !aAS"3nzq|@:%MSܾN|j#G1-mדs2QtRn2j5AaXERh0Fnk iat8Z֚0 x %!W/=*++ i΂;-Œ$Ǡsz1]OAr#4IdQJ"-@vIf"tm4'͸\ςqSЂDFY$=j9Vk9ct/9Ai4lGeAP ({hq2.N k[J['siڝh&?7s= EHKyvNCpT7Y9|4%ȑ"E?+QfdRTIA@Χ=# 2O#$'u.Ri  ?znCN4+_{#P@Y\j /"#֦i:jf\6IDǝa$ mG:H%Mcl0/?L;BR!Wi#fߋni6jEF7|Sfܱ/tR d(E:|ЊHGF%_%2uN8+Z;DÄ?!p_*xKADiO#^o}0BgsgM#ڭc+;);Q;i꥗ 4- 8UW.oLi| }],4kh]J 2<J)t +.A9E& GykDF>~xrb- E0 j` EH@k Q 4lE zi鳱>`B8XnJ'$4I3#l$Q nI@R\  Xݢi@KQce!h#wnN@vTGH BK,k!M:%6" A-Byd0S ГDJʼnD"AfM(n$&{؄bk<|Ug<]\ڋv`LA*X*JAaP?"c^JXI9 @ qҫ8q(d Z?j\v J]B}2O0m +a.Y>67Es Plۆy7Q}}k25~rٙEV(Eضh7Bi sz0=5·]z)f`ǎh3ZZ6GV&FkQ( À聻?t7/S5As_EtFX#˔Uvbn11?*Bw1*nK^J$q G#ŗe[X1[7_<|CDa:ʦ1? ?+{aNߑ劗v=eW<.LU7FKR(\X^b=B3lr>ёq älc4o\ri`aF!APX%+l&t׀2-L+)b-b- צ%Em>%A7z gI !IzS%I,@eu;Dl'DLKPdvVRQ8v:$M@W/ nƨzm)(@ב 6e?∴a R4ʘ7re Ri) A:\IZays.E]PEV`SŠОrLSf8H464M(d{wTȇTE A)-<{'V8S%`gԁis 2'1N*KP@[sv%c)Dă_~Hc<}tN<`R,1hPYρ?Q%<6/sKi~ԇ}C?z+ή"Ȗ-d2IڭЍP*NH 8qpvnچlMX7<]\_j84_ꢋ{ZKq*f1pO'qzKe^Q_hF43GVYφ;Wm}Ka~wl.fg) UIgRXJzc`uF4xuL2P0aDO}_!NaL ˲WəoSƌ[ fhDQf c+{"U1Huߴ9(P4w 8!oBfAs s?cAj@S\(vxF~{-)X:6ďl%cd.[-w!bzS;-f}I9߱н]UѸadv(ߖ5L] Z{yAV\Z XT9X߆RtezeܝbmhIzםT.HWrJHIƝ`vI3A3 B:q⊌eyshgљ Djvn<JEh 4Q^bԙg#aq@o|:l<صJkAXSMH{ش^PD@.A2T:z=t+.~y'Q(虨\7AGL݂a\@.$XjJ)l!Dxwo|ebb~|'-0;ZEҠ,6^} Sǎph}f;q$_΍""76l qݗox||ho9x#o}SOmUbnLXdvTdR _>AXwZ|g sc'lahki+}PkӞ}.V5Dj|{\vZSVeK45fH6=ְ7 YXgq[dH x9ZVBY ;PaRÇm1Lͅ$Kt0]߲<0 Lp#db28'7J=Cw b(㸿'+'.N|7ۀ&$&}cO! Hr[/ Pb, (6Xe"X*^ ڂHa~( IĻ$AAnBW KEƒH[WHJ VbJAuAlnJ1{+Xyp:űoB5$P߬${gPYHf#1ڐkDY8HF^Ri>4޲.{~d/F= xѐ$l7|x;P?ZkL!Ԥ}O6e&z+رcm{lV'M˙՘$}GIG7;Dݎ$4uZ(ͯ߱V/#ƹhb#7\k_n|?7QVZGR[Xl8\6G_?[++_>/~ yX){!RD!\Yքb]P^(s@5ٿ_H5fna C,C1??COW?Xfۀ2x`o{{@\;+.#̰8u6ej՘a`f< ks6 e8|`wcq _Dže(磌d"v}ݝFD׆~MޞSsEE{R ̘ʦPj ӲC]ct0,l+ANTk Y̳>vlnJd$#L%ב$^U׭0۲]\2zz2YYm~AvM&_-À!.Ԥ6>]S`&#I/)i=[9Sp2vU&-(]upAbbQv N=J!b#\ŭAC}r5!lRS`PV)zШ#$qt%kf'o̝wGPdref}!# RNQА!/uQ?I؊S_Do*Oh:x>yVoG?goX'P~7Hi6QFGb~K^o|#?3Yg^'H SK.B@pA3EwSIqޞeI;3eӘIѤzlv1i/}F u}0=Eՠ՜eIرÃ[;^:1߀ӨcQ6^W߻c <o@;ﺃCrtwM>wݷg?Z_ӟ@t|+Mx5MCzf~vj嵗DU)_"R}=s.nGؖ&B!jd*C:LR "RI+lsҋ"|`/cKKf^O˼yǝ |i^Tꝇ9n ccGp=?BGK q&P? UVKH6 02@zh4 5@,K0H'aHRJ:GzI;=Z,,,+gZkSx7x1J9^d?OlIY}+=Ԯ@8HfӪC:1JP d3Xd;Ӛ̀qtVEEehMJ]1Y"@SIn[W+|'TcSS" $YoWyI@ælF74g12t'o, И1%d't‘QPvSq"v !: bM2l7?+2;*Z1S"Ew{'?)I XQMo:E"Hs W ?aA*b@}/FB;>z}mO^*ԛ-oAri%~"cя|)x砮7/0aBE7-mLsZA*ir[i6OɡC(2-91-iP&g.zzj0q ^uΒql!GP>e;/]&dXaaD|hCS0B!ϡ)n#Zi8(]ހ? >&gibX[v̄E&!$TV=QছH8DDZ޵|ÇcT\&z9<^se\u$,~:g=SHHap^q;B6\c[uqy(u@0LFF4j- fz.FzC>(Z],qሢ@J`nʶ>"4Fߙ(?.牏?߫gz$A7D۪vc J"H_]syċB) H7+;,$X# \\Hlp[;QP !0j[s}Ah {Ī/F?iˢkկ>A &+!թZDOo߃6:C'&Wh"z~HT/KD4/czJOGQ 2TǦ@04QCC&tU'mW-1iM~@ksB3E9w'KRพ' WS0G'??ú}{q_*롁6o]VSx&<]cp`;v<(2i4ݕ ÐP($:xhTFMQLWVA"sR/hJeZDb=92,iH$H2$iL!ɐg@'Ւ{ۺB`e@[ 虿UW?c&i8 .[y}_^X{Et#oԞ=p]qy;~0R0Q!j4m;DQi)fDPQȑ˧q[ai^0  JrD& N 4Bp)߶sNO}5sKѷb{hRo+g |6h4^j~dg>}+Qz_0 E ÇcZJ:@'XhM\*%␕Je tttCu]R 0 ( +h`nZP{ؖ 9%ʀ`鑑')e//F"̤h{*a!PqߙztG/QOm4suwu~t;X"D߶zzaAhmYZm'꺒l*CtKuD im2;w#Sɤ,jA6CWL&n_K$RIv],/iZǕW^:. P_*N"AW~R.u^r(Z 0mEG7fv^, ɏ| !ڻ-wWaiw WE)~yOn(/]{/Nt= ,ƉݛJ۶`Xj(CH&2yghWT&#}AbzQ\iٶ;ie{.Mnyx ]kӖf۶tw. Q2=5BAWW +=2VB)H5Rl.Z/!p-ѕ21 uyki<ߺsN'>NIكϖUAz! řȫw? {`@aDhJݒt&ӢWh?,Vo7't]D%pz'tfIe,+E֥8 yؐ&99'ŢLc߾\?a8@SNm`m8 &NjoviZu4غub1G~]ܳRG 0"4(28шXʞ.;q@e%4 !`XGG?=\:(pVy7mư퇮IJR2ر2= q>D/.|Ko|>w;jgH?Lw?CJ,W SSR`_\"N37iLOn3@2"#r1@%qΖ}cd Yoׅ,{{M0k1mtI9&:T|@zvt :QoiR^@cr~A؃Cs&F5BAH"O(I2Bu qcx{IA*'ZP}y% k9 bF1%(aU'UH_NcۗVc!nz m6+ik/xk_KyA*ZM\N1(6 ΋=(äKQȱ~ MtI-0ĴnU6>ʪ*um(#»w/aݺT S-10 |_2l \~8|s_qo# #=DF;^S^JRU\d$_?|5/Bavu൏p+(u#$}p@a_wVJLXgݢR S\{n7a,^ާH轪2XXWdFQf^TbhAB $jǽ M /7dֳz羞Q091i[H""L.{v=2ݻ/^eXk\yŷeͲo(L?\4U.S;4 ҩV|p(ƚ=iLӢR05UdAt81CPs,0;3Ticxs4Mp.B>2p}pIb-ݹyǝz_z1wNCC䄣OM羙{|>?h98>~'f9!y?>X Q_|1]]]dY޸죔To f]3!c!dR )I[ I/f9|NDŽ,AqDL (Wρå0 y'l Ҡ)܏pFɵku!%xEǠCΩYjnɳ xzsI(%8sl$yأVۇ ]~9+i'p^MA -(fP0=q+>hd.V\m$1Ij:2T 2_¢|GE i EYd%I\YX _),8{ϩ Gjuk6x(No|$Q, zzzF^`hvb,Yy18iihsMxЊꋏ4sKwЏ?^мB1JR-iqvl#RtuuR*Rc`qwӴ,DiYmCG|LӔiji(hc"d`&D1lO~att|q}}N>Sҋs>RD8[nzzϿ}D2ـR!,O_ĚC_/x3p͛7Nټy3---qy~zzUVq]w88뮻kK.}/'x"_1gNE|grrRM;3O>O?g30$wˊz(I9zt`${e;ˆ۟XT~2}\ ƶ9Dx8;dE=TDr6Ҿ̈.A<+ۮ#R(SH[LH˪RO&^nd)'hz$"o LT yvA$t- 8{ APiݲs ~G0=p^AJTTlzf*)s`J#rZ!ՍP\>f:Pb|-'CI|J"~ ;?ϫb9`ddDJ[3G]qjzWs CsY΂~kTy+@op90 MFu sW1<ܒAEH<1׭;40L Ӵϒxc9&R\ʫ^.:D9z`U[de ])>- 0&؜7l74G_cJ+ї/XmrD"Km5%vR,Y%<6?$ޚjkgGZG|̂ h6Ɔwlt?mFހ7*_TC׭]\k_?O`@k 8C&x<Qo4]ٵkd24xYoxgd10=߇@W!2{;0eC*?.FGk̛?˲8g𖷽,|?cNCW;7pN/^<ӜrqoAT"J`YPEW}&'ؼy3?9VP L&1 իWϾw1g<˲xƍV#k֬K/\x|>^:Z[[Yz5R)t]D"Ato(g،I[9xD>Ȱ$u)Ҹ$q.I;7E HR(Y=) W mZ@RE$*Sź#$sRi8 Ds@sHh7D{q` Owj(tue0˓"S/#vM8iXBy7 8 9na'Vx[`dWsbhW@@%,  ؈ʜqzMo!TV^> Մn Ў=ۆ?Q~W uqjKx?5smDSc\q%K\0׾v>wɧپc'eocx8Ïn8M +Qm\|GJ 8G5(Ͷl $+sFGX .nH nG`6&1|j*4> J];{(uORO/} /G߽& ;쟏;JeY!Z[,^./>Υy\A^XƱ=b,V{`?0nמѠKg׽|glt|uX ߙݷs9KcgdxJi7qٲu C Z)091HKZTyEjW! bF0/ڬ iq\@Hnqup؜JCC8_ ?8}tvEpQ#0sϻwӧ?GYxy? d*| T)mNReE~B~ 'mo[\y\s5qoSD?!֭{šJg}9~_suױb :,v >)4xO,,YN9>L&^_?NCPV' vBK`^(nnhLJTTě"֠*YQjz$/_D}$'ECuM)\3c[4, 7 $º %#mN-֋Nx(I*xMi2r-Δ19 n7FΣ1Yqj IB,+Ѵ,w'ovʀ"~-3 gCeD@`iRHǂ*TU9?-!(pBh,E5=E.s!w02B28y?sB*Nm_|_'k~񳄎8aaFw*w+Eà̀?svOԩcV8Ï8+":85% + j::hkK _<ܟ{p g˽ |#d/ncऴxsw> kn؀ɵ rVcs0 lYsp+wOjmw71.0!k~}?F0=RczƣdsUjI ͐?n s+s>c&>}a|@ KJߵ=Q-Ғ90} U W# K\(G JRX!z@hx+9f=C=wYgydOZϫG&!pm7oqO~ƿ[ٯ} z9t _w=CjD" [77 ~?G>NsUWqrWOgg'BkY]mLOOi&W~~_~zZBD"}ݾ};isNN;4֮]k^g5%g+*?QH2?`لBL$ ۄDȍLqMAvʓBk1 IDAT{CQh/ ni:eݙ'Հ7 u/f]$\W1BX26SAr,5 GiJK]Vf6C)20& p pҌ#z=Ѿ-f\Ycٲ=E@ϋ?6Ѿ=y󞴒򔱟65M'm%u7{E1~{+_X8OcװyJ@C!rFSOE4?.Iw*ʫzw`63j³y^@ll6NGgd*NRg=,Xs}v{-r9$cؘNW4ʑ9ՇsɇsO3gy:Bߗk5L.g:F̓La~jPv04 3e{'e9}:MKՌT1t, vy7YV4M'hʔR*ڥXr##+}q꧖6 #~t t<՜rz~whFuNu!sgquýwc߄s{ůyG{ciƩ 7… я~'tv]v>[qnFvWCDbM3G'g6Xh'p?3j|F2s23~? +q%b{7'd:"1@GKC:̰~13 N ڳ"?'{jIaw+4xSBW:h Ac*01D>u`3 $ (Q |b6c0P{Yߢ_ߡ\ԝtR)A]zLGԧ=o_28T}m6$ֆ7O~ypNu3F׼};nTnWc^ ?B -8ދj=>r(E=r3ދ?, XWr}}rma vu|05ozBwO;Q5xB3_wfp]kmم#=s@CH&uGѕMSFӮRȕF M:2:1͍w D+.]͢p@77X8>xpx`_B&8dSNſ>B41:;1/<l(߇j?k{CAVa>_μ(4<ǁ_KM|%@@s{aYcۮgMk`@;.f wa¬mކnn ̦Ͷh43XiY;.zzy_etuw?G^=(J)o6r?CTfy9g?_ztsx)|wb[륭!\!H/ZK?9i'uV4Mcy/g崶>SN97|?x^5\_ 7G |%_Wkoqs7s<^L)1C|{#@m r lmȫV8-@) QJYMJt3$M'ٔvfQrz}$ȍȘFCA)^Uqσ.(KkaJLӵwCe3XIiK[$7LQe E5M܀T&b0,ՆtgОD@2W^RaT*ߓvzZ{\8{0 ZWɱG@LfOah Ce\U9GA}is uo!#M *4#r3g//C)W"/Fu&@ljL.ꓟD&"ڵ`qTmw`fĬTa1(}'{M(ƽh#xC[;aa(iHB7Ȥ4MV;gUyk>D[{7J -- t's iR\ϭa("ͦDV:qwmǟw4ӒU9I74&wN>UN'(ULL Xs{5-:3q4MBE[FNîJ>P ·zzO7j@aYa|EDp|wG?BǑHWu*ULv彤Do}ʼฺu4R$:Hv] 9ffWi<1\E)!Fp34l\w<Wxn1 4「_?7x%.[ʿ~_Xb67;~/ﻟWʧehz3^q:??y5jTeZ'?΂ f}.}7^pӟ4$ 9~}K|_/~_dٲeg76opAq?}E8D"t]6,ˢK.W+Fb~A}HV\>Ecmm50T2fB F!!S`Ek;QYtVaZ!nHtKk@IpZ]}S¯(QCHդRQKwu2):(\j'6*:޶?A4=&LLξ5LfR~ T]E0 Ko6djTp`,[vqkF-]FKGq/]as٧So3H$N,cxt>@2l-%|_ ]b)V+-*ϩ&%OBƌF4 |ߧMSy@ $%u r4i~@ύP(>Q>ɏ>6o}[x[]]w:n-xl]œ7s4e`_.ڕ/G8gL|ՙz,>tgpg\0[9xT1.~_~nz"ફzcLNN>k_?nUQdBX-l0PR"â>D-tz;-DJBI S0r m%٥1` mҾj! R]PUu*D'< tUYϏ$t]Z*S&dD16B|N'g|!%IC\Gژr --VfHƍuCq>G A#hR\C(NO@: nT>RfRkzEBbGx`π{B~8C YF40Tt4O3oR)Ԟ=PtϤ+3L)Rm<1{(7f|:dQK)O9m?| |44D  qQ淽LMhm == e:L #BaR4e0=]X,ʸM2 N֚]a/ [g{:;!|M EuO5Ҩ‘ÓAGp^`K{&I Qo4 ]\  k;['&&Jޖe,A#q}Y75;މs{BYÎZɼ=|DԽlktzA$n(@36s4=ڝ݈3O *i3`4euLJ feTJm=q],z\YrxqPz_sNEIԌGca4-BGGt*SY݂=ߓ^'2H7o9=+Y}A|6iP ӀrJ,Rii6l>ϑy{q\+&bX.Wv3=U$1=|(F^5u/:WV CHyx.W1 h[o+Y$_UX ݚiWCCxc,[k|=F0 1PXNVJD BL zx w=X'9mRHAWCTDH^ܰUvBU-n)@8*Rn&Z70aAh[#JQ.I%Q[jTXEa&!2t&&W#LB"#R vo.iҶ$I 0`@m@O+%wf{ҬJ0Ql .UTVm JGG@6Nۈ$luLbِX"FMP0 WĬP3s:_1S!&-r # dZ]g׎.1ByŌxJ!2,v=g bIV>c=}{6o Oqk:n'%#㌎Ψ}ҙ'v:Qjn5k1|50L6gǎ!b$jRm{ O0>ght޾GESLL.͆#\ y8] >yY)W*xxfR}ljhxE|(o/KO@M@<Ur#)/ dVeTР8-FLbT]Z牛y~L@[a9hB@^ʁ bRq٧j&IQrX V{ā*j/YJɘ 4+ӃiƲL"I=_qXeXu<443 :p-J ᨎm+<&Il4(LMhktJEd[SLOM\ehpZNo_B ߇JDG{tP( fq& jg:Doq~s=܉+ACYJ"иFVö Us7qIGRȗgʥ MummLLLyjӹ)l tK{JRk,v)Q,H G8iVA6+*y.njH8JY_9! HҒxycϷjH_}e*j$ohJ7|';aRHA4Po}C8'j3ݛWWwLEe) 89!i(Μ4:FwKn֬I5YD 9Z1t]Apl]Y9! avM@iBA0Qe'T9.dIu# *)BTOuA3Նs/ov׍n#zʛ sM,p1R2)5gc]x!ڱ`|2 ':68LM孨={Ph$!*ZZ@D~vml~t;-rPdϞ1FGPeaT*ۣYojoƽGIlqb IDAT@a&p\eT%MK"BҁxQ=6@[K^x~^x^;]j_M :=SP.@,)J~C B,%Nqt!aǻm M|RSEPFL`bz Ew!/IpSM$./J(2V8CѱP"vnX;JÒ 0Bls`R1J@]Znc8}'r3t"@;0lmYOY9X qn !2$XPD %!T1 UiTmR".QP5 !G*8?{jB`L"Abkhah4mFA7Dr4kJEPT6#fbtue("Uk09Y$+bY&-T*56nƪ L8TŋTjdimMGGj G(]]hmxv+ Q.WYt{tcZ&P7Xp iR,3H=Zנ9z[Qjvp\q}vi&Luh׵Fɤ3Dۗ&Xۍ;0-@GG3dy n[Tj *:aEiNfXVh(oƽ](Mmd(@/u]LDסt, vh87kT,EӶ=t W2FZu ^a&1=A,ctz]c;NEa+L{Kh/g2n"0UIuCx ~^YGY7%Ꮇ@"x = 1iq]&Q&2e[뾕09$ )J_(H奊Hr۔:( X`t,>biChTВNJ6JE&&Lh W[J[YW|WVBws*M,UKBy0GDьJA# tk^{i6McP*-g~]+ @Nɜ:ҨajX)8n K~DH@UmOd/st@_=$Yiu#ڶ|_r%RXt84|iI*d./01=yqZi.a˖=,[…LN1uLJ+d5SGOW'IJ,ZqۓbllbLk[ua͚̟(uloҒN& ,9O5h<(,1 )f=;Y 8ӓ-4cMwW;qa AG.tL<j7:4rC^sj4eLM|!L#LT#A4_cW_g`ېHxކ3;{#tD4BVL&} Cp]WXTQ*W4(x;Kv@VoIތB)t=ybu)nhoDZgI߆E5nR}B'a/Ja&aPJy_`煎eTBqI8@P!jF%o5OZӲRkK`c*GaL*.0c쇢":#V`$mc䜕1j =rnv EPvŀd@AEʇ[9͠թ)Dq傕߯@ A|£` T wv9Ouy%OLíJ EC 4'D铠6,ß"p:BV](}9J.WV4)PR7H21^ q&K+NA2;KwDNZ!i尵˨V*~x<ΌC4jy.hpE`Y&6mA|3D"!mj lFrrhQ]]Yvd׮{|'bΎV,[t2N:A388Dl&c=$I;CGF]]jz{z0a@b p%/@y/}SڹpD@FO,sEqR&??gpo0:"x/Ri̓Ⱄ0IS?>iB )衬QDԓJZyp ٮ<}e[(Te!d$@dV@$ F ;Ͷʮ.WD1emNq}E>n\)<.ʄ>$H/PDFl{%P0ske=775Bw.ɚAt f0/VĢQ+ײ2}ATHӏ5XE$\ Ne{$$;K1ܗ_ Xr -8}_XLPgr+9 J8p8qk"u Jxce30cZ˴Of]}{ڋZa&i2Q6G}Z''cW/(C}.aS[[]q6ׯojynBh4&o<:&81.l׿=.qd2FMFgGl.%k \ix=`<lv{4 ]V]=<c5(d4$%TdYFj8jZa$ a6 Z&i OU~>MWvCe Xij>A9PҼ&20.4ie? RsԼ5y}ZU!C;B0 e'N}h;T1EqԺN K64IȆWٿ2eȂS%VNK(LgEߠ+ϲ]ʥ^ 1#QQxF_aJH{YS:t%O:Cy ."2+vFy¾ 2]JB#\ׄ!nVNS@Y7_6=Iׅ\3oY4$KmT0%^gr9zS&@JdDeg;K-NO$IKKd03UV ^I]ce!q)E9:'NܼywHsX][a8g9>}<%KLfLc&Y2w[6ofg<ڹM"O xZ˝i;85M8%%igjjnd6#"鐕"Z*8 u\בa(ŹBkW}p$9-T%(Ä"/0M9;;4Tir`Q Ӳ\f׼5 !>c 5 `_YOa7E >Ʉ~9WrkP"4@#0_FmVaBʀmI.yAvϓit.р՛"]d)V`.a?eѓ,*,cLG֤qzCCX@Ha h.s.ӡG0ؑ<# jAP ɵw|X|K&''WD+~Fޓ< &;[{&By2LA&L?gETsTXf\5ħиreu.$K6>#-( tRI(Ľ>,,a:,x+X N(& #^u4- %1iיMgdG!#$C<|thS(r3q8*8N1M *vvlKh6}_…]@8::nr:.pE޽K$>w{w9L,lbWcX6q[gitti]jC Yasu +L<Ǥzzt<,  |!:-H Ej RXZ˞TENVd%驘12YJ7p4)(*~3vݫb3yE lۖD!6IgY4M\`Y&eV1fFe<+IY)`6b&eBNR¶ <4K@?s/yk^UHv%t)]}5nTjT$м ;O/ kC@}]Ԣ S;-hVvu*9C+qB(\0i!Kw74I˯T"ou IDAT)MsU&eQy7E^ L 0D>:*Dn' $I$U*"+ǯN]ΕgյPF|St4 }KўLs >ꖲ"fX5hW^wY-LJ:x}*VsMƧeEE;BpF22t^P(h2ū<1 Ƽ%>30tyZG ~ͥD'9i:cv˨e".J{{Gܺk؎{Ztrrm<~|@ۤ(JK?$M2,aiy(Y[c֭ٗ~?|se/ۿ?7EdD]E뱼ՠQNa o4g;:$˧ؖKݣm3{6ubrajq0 "5avڌ!%mQq.(d*"׸ؤIBYY&.T#Y86Q$00Z$a`YR^| C1`@Es$׼5O[#|Vgp ӟzh*`wIt3[]h_vg+jBPDUփ/"_.-7ǁPP`g0݁%0ϲe1 r;>1<cYR%{UJ<է갽Ui %4`p :PT>k3ỳ*X E,Ѿ]PG^Tyeʹ>O2U:9i^L8.HS\yց$}[Us'FtoT2,\Gьz#M38'3Ҵ NRa 錢(feI)>88ha,--P-0:(`4sxxJ 8:zZ˷.s_~_ ͦ;PJFD瓘NG48҃H>-K^z2Ǘe5ͨl5yk^*eޗFdT 3GZY5kD0lz҄ft>4^zyUV Wa)נ% !͠ ɋB28,WD,uu&e.,ިhHu Pr'zmUrN˔ Jx%;y"k`%`^K(K:P0 lOa`xԮS ` .r|* 쨚L909ٹP(N+yba?ד=*9^ʿhfo z$@]#Hb{^ω k2~*˂OZ// i&mԺuk-8x*s4ò,Z&z 2m/l4~~7߼ŋdyN<Dne_ѳ 8ׂJh8CQ( J]9k^׼>}3jb P{8#2ՉDiu;LJٓ&4޲8%_F{M< Kk2(* qEKeJlV0;PS~堵yK2BQ\KR%nDi ]+M}G Hv0ܕpj({L~[r7*St-i(:ӖS2X.³X6nC~`pl?s**r LtjbQl"Jbn"ӧO&/cN ,5H:4a[' [h\'IqEXQj%14$Sq (*M&b];tiRDQ.!S QIk8u:\Z_"N˱AQJqtxʍ_b242ô^h4ܽNƋW~'v_ XXR,,.?*X!3=ŵ]/d2 ec L]#L`gwY\j?;! ӄQ4c\iŽgd4L]jj5(pJ,j Ԥ lfAi tJp\`<ݦ%n"Iΰ>جay.tiY8JL1tbm\ < * _M6*W>kaw<ѨA`\w%cՔKWvOӿ,J,ı{ ^̪I7J=7,9snk^׼S,keqF j-5e6eRaXB+OԍH}0B;_N%/D8O:%KBںi.)5[(ve.Th_h^"2_"NNv.L$ tklK392+xbk{Vne4YCkhP&CIVOۃ*>F{Mt4=vfr"%ԱV;/Ʉ܄&G SP苐J螱z ŐsDU.c2~*5ڠ 0twJFry.'qxxh&N}7җ^_}AaXyNe|qB]aE1WT[q]2i4|?>d2-|y<+0MVVDaDa X趹6zǏwW/c%k-eIg˫l6g6 ^g;+ރhf 77q0r#(fGD!21NWI >z0ap<e2^!a8ö-L,f: f,e r/ua&/RWbͦKN,]}{O`fp4),h8BZ\ '?L5DAɐ8͉Ӕ,i6,.tZL'}2@t!juE Zj5N, DZ.E),(uQZ(%@D y7?yk^_}E%֖$7xReCTSSܓ&2X!x"!׹,CCǐJc %`erlBЗ&}}WO}Uaм@Bgxpi]>a<#ј 29ّ\zSt(vO(L%:dfUaC|P}Qd5ҸŒLLʹ(!Kۀw6``$cy;ܓcߦClݫփc[jsQD ʚ>r< 'cBwajL&)aNK$ac˵k؎a G!YɳMhmۡ ugliJt^ &qX5ip륋,vvN:xD`HdL7yݏyw ]280N[7E1گ.^_/cyp+W6dY݅.Id8gg4Be$IH%|۶AyA922x*)c9(׼,W~*6Mig'YӇwR.FE" cHM ςT?y,&;Նɮ4ʅ$zg@O&7vE~QjP g//"48*B8xHE kB€k3щLzNw`|_X/2XRxBl\ےޝg2Cp6DomKl銀< #>"W:8rNER\  <օ`_g 8!sx~Gyh4B4IpZz&NrƣZ&N HRvkwHFݧ,KWy{lu}GҊ0H {,vєfgiCLg!FʒUƣ {1pDԕ$, i>d)Fes(Q׼5O4n[4ʔiӁu4ŧ!2`L+]> EQrBm!t`nzǠ j/C.&]JZXNp&SPB+@=[[~ !yߖ`0>K2`u$"ɵ}Greb"2_3J ) 4:]A-:]p>yY$T(׃LOtQY>WAYz?UZS2WtN n;ƒ+#4.ӓu8M}Uq SZ,<∍TXﲲ\r|>1簱G,t$ZDZ9:3LO"rqIۮx<%KL¶ ]b1 8:RDa {'(Ͽk (Ux`s0MW689fk8?x66(ϯa[&{w?6k—q]Ӑtlsa`;Yb(0 E.]E%ʐdxט$Cp%1G3n\Ƿ)džGs|LW? /:t g~Ӵ7`0F)8.(~xT$q?oS Ӫ6Eelng%[W10޶ M+_(;ưQbШE,bM6hz ( ~Nx߷QFpHL6S4<ט*TORcEQ2yU?z|1yo["rDĝ !iKl(&ֲ3fHҷiUf5p"e[B1-^@8Tg@QV2rʿܔDTi؃!q2lX~>F1 9XddU~$@G~F}zjİ qD8*qK!"i[ r Q:ë$'.BD˯$%:UŞLCt<"r}0x k p58]G4g)ywOzݥzi:yHDIٌz)_M<²-\3 m:ux$yx,f04A͆O%L&[[kZ-tLhN#Of|wPtpacǶ~rŋk/4Os>Ztu!qbY&Iܹ F YH I vvk>yVpr2G's!+iJiR]V 4Fl]1LC"LR}a1䛕}Pܦd,#$p5KYhKNtL6_]-yeH?# c ҇/mYх: קqSPܩ&!"j IDAThg I.FgE&D}h_*UV8`xڗ !`QPV.P.DDz(LN%e:r߁ϋDVt SދVL?я'2zF_x^t1IG=(rdFE(4V[ge泯npkk[ vv(˒,-^e:0eR% Mr(KeгT^b6iL&M F(_;Efe{,K0 X4xKL3 =I,$K3VVp\~w}&a-щt:$',--8''M%VxDI3n(2K,S^Faufq w{XlO#jWs=,Ӧͩr)udw(0sQs6K]522P9*ӏߡ, JR^wYeaP ӀRWz2l/5+0 BqwX@劒4PAV56б>-Z!\>ߔ(sKeٍ2*PRT.좬Ρs;(+9xW]ۧ%J~-u d{SPQ g?GGO4L$l#޿ooO2׼>e;?<Ƿ/>r. ΄T'Õ\\wU}LJBOj-; ._>`Dq +a^)>RIcm\Ѫ*Atqkx<S-Zů}sU%[/{ogY~5v5WwW!ݙCBBB`@ S=(8>z5ǛLGQeF` (N:ꚇ=kxdzPA}{']^{wk~ϳFƠZ׺zaHbkeN| &S crq]4臙zvlK*b) eB[T' T;% 3F`*b+ 0bmLy)ǫ@nE?]X{̝[€dy(\h,°^J8x@ N5ٴ:, dM8[^Spd /q%,D,8OX4 m;& @cCC4,Uqx^Dܢ j5̬ҌXq7[y׭jjs;%~$QvSx.4H;xX†u]$@c,t@uP{P;IXCk0K%IeK%,ab I5r/wr/1F؍<~Z> )j#)WCRaˉ*1+'#=7 j%@޳E|nͭ@zȧP?IM)[η\탵,RA91Z0wZz (5$4cdAX G3h_aAm\Q_ ]S߂+,S^3 ȥ:%YR>ShΜ#k,Ш-: `g;(n56g&K;v {cA5*@Îe7йE/݃j40_3P7c BOՅŽDZ\WFU.LϠ:Hx&V<}|[{uR.ʲlg"!_(366@Ta2~,CkP*u-,05]PlpUx{9zt/30:u PFV>J9(e({7عsN)qݘH&b\`R) 6lBJj ׶ 48cTlJLMb\+%WsBΤԘmӅֶP7zz+-tgz09I(0 -2E{$'} >_D*-=9.=+cTr3era&`GkZYjHu GbUijt%7F47n&l@rTn/]9-H_,3#o/]0WI4xDVQń 2Ԗ-GA^b5D_vTmĪ K m-yZLMxJD60g'_d1?WBJ$oc]w֭ b 6ȨUz72GhT*ıcl$RRXT0(Tf{bWk%KnM) kXڠ#W>):_~t?/b+(1BtiΒh>sђ,WM4v,+cbb 5Vu|2+mT4F8`˫bIXjɷ?Wؙ&jpkj*7/6n[^+_}'l>gXX]]w'%P M鼂$֙(@ X!wI;ASv"VOBzX~[^#&$DE ;0jyO m* +-rxC #άDi/GƋW-L'c7d{;xTթ Z)bYrNJLƈjh NpL+bL]R+2 8OCb Sr!=*E=*bTR &-OOY] =Hc&6a bYPF_nwu8OqA@ٟż Dw0ǎ* 1FG1vW>9Y~x6Rg{W~X'NZ( il#P +޴ y VˑN_To=BֿK|Jy7aY 4sEbLM/b;.k3v9ꘜOPOPQ;,O:ozoCw71"Cڊ ,8sz-НMvsI <<}!5~mدy-:CGz@ѣ “'[  Cqgz$1>qJLLSߔӹީɏ;h%L,Z׷\&x{0s(ϓfu 'lF]s fގo"w|hmxhz/f0D 2=7ƹ!ֹҪΤ K?D ku:iʳk)v2sCtl}ΗV@DM|мƴ޿\2¹ooNy߾v9H_MPa`$kWJ[/D$ͬb$霬eX<HWfsE)?%Qs0 'ґR:`ɱ]2̰H$_%\݊J7OFIR_.A*Mk%ݽ]: =P>WArda(`Dn[e%6^XFI@].? fa>PzU fEkOH3N; Uj>*_ N<9aZ<%Xҕ> haXHI3A ܢd[1{_KEo;|1 Y\48&_׾yٷ\\nxspYH!K)¿S_3mo#}ŕ8Z/N׽:ГC/ÛތKa[R8JᇚLO/8KRv9zZk O?uO1\~;ɔ4;u DW P1LB>Eì&V/vӘ (Ab[ɸU%h mZABd_zz+ٱ-oޏD^"j& (,0Vk\ĶD qk5D{D4ٗοL[;jf:/9tUJO,Xi>iaՋqc̒$M90tkhn:VtֶPӱӉ[4@IDAP+cpGԃs]6s0y\V]<'Ґ!|*#垭.JǡoVPY:!46l4(%0s<*A[v ~(m^/)\lPL$ʅ-0]?A؜ՋHu" l$wI0Or4ϣ gwR†m,_eR>%+Fm^@Z,^6 .ȸE^B-q²szuNX cd~b}!9(fX:Eۊ }1aN8Lƛz0ݷt ݀/Ӆ8Ġg_|h<ĹY!yNa e *QWmð?9E2;_E# "PP*ZƏaY6gh4cnaDZP"L1=֠Cm柠^m͑*]/Hp\ lAHc3w 2==O |"EÀǟ|~kp?}uzr9 RXl/A`SP6_GkԦTˉ% 8 'qFAZ6DyRf9F`jZ mٔtjCS1?~kqkX<"t(MUKNK.X YjwhH\+G" 2.t0 8x"PzZd qP8 g6@5&!(/apDŽ?&B1R޽f(dLj6!vT6#^ 4+CmQX"5`)yLtyRN@&t^<.,H^'>Г]+%k12e0$*[x}X ?a|>(%/zA~z r-p,4Qu2 =Aύ*R,(>H "y2e-a V4O,^jQ+1==O^?=O\Am?q%;V[?C~y?_u^Ήcp0! 7W0FS( i5X(!rټyO XZ3m۶_H)̱/pʭ6"SH]RI<ϧ4><ںUJ>0_y#z~. inf~/Zp}1ʕ::#(i}сq Ʋ q;֮0FwNG*L.[=31E@dZ Ś~ị^BI޷n" B t2!K/˲ZGkFdH-tkhK;2%{i֊و0ʢc5+iv|uy68X:/fIy˟Yz~K?~K)#?Vc5Vc5.h_X7#>| $Iĸkx某Fl=7J2[8 /EP-@iFH6CwۅQLC0 _G_ UlT=J].ɴWcp0lW)v̐4LBa]BzLǢI{6^3a EMw*BtoaRwx$-tt pJ8xtm^Q~D2~K P^4\-91T &]h({I_KuA<J Qi)럂fu{&#[lk1ݏS6{w7|Gܡo:6(|N!Zw-LOOs`J%>`;brnkVf_e3y<̗|OF}Xw!":ORh,[:Ab;6v9TM'?ٺ 5GN'7oOW]~#k)}7ض}#ǎ$OR(TuH(:BGH uef * LN`؇wnylˋVc]|jCw%1mEwTܥXsVȴ|t lK1aGmYQgL$U4JNa IDATtM6Sbq3s a}"ڡj=P-vnhH&3:ٍ%g:-ti#eGT{Sf٢AGLSε2Vc5VP/Їxd6>z$rR(HB|jEd)`0 a<7FV+pѥ0oxf="MՔrES0B UI,Tž_'2IiKaÉI_G^TK2ܠ/r 2UxTB܎ŷIO%_{ts$%HaCK\' 1G<''x$Qw- oJߐc[dn:W@(P_eTwIWgX\ 09+sz%%/8q0lN,m|<#4Q~5wY'>zի0=糷FZM}89ϾƱ` ,e9$I2c@\'Ú{eZ<.~Pw}1Q5 ^cm6`MҖ򬴚o$Env^9gX)wTXan'ʋV%XϿNYjl:AuZI20AYضC<DzlAYŨҡY2ȗrZF*PI|s^_҅a z:wAuq^x<>N?6."dsXhDrPi9 TJT*%#Nsm? 266;HZ:y[LL<vc} \/D[~S{<5k.ك}mX/gEwEdܮֱEsjϋ6}䒳[B9=\=?jC 1XX" w36:B"R+s,kL,YMVN};tC-tj,)|q&TPIlժ Z@R`) [ p3Fa,W<3[mqEQfp% _&%sfhUhnq+Qjj#2ԀTK <)_u͂w!Pq)뗥졈GdQy:tNE JCc@D;i뒪PA 3@ (GIJ9OQLu;917H[s ~h< ?I,.sRuNK$JS*3 4-cM^Q/CP“0|#L} Ar4bjR%*7W  1|X6vA2x@3,=IٮpGH*yFw52 Ȱz;1炂-K}#ӧp<fv/̤(}a`^ d=fBB5ٌv|*EjCnqT R6R~jbCXP,"ixOSWyˮ0o<o>|z+%|w@c;8ЮֆO]MVe|?Ǐ[k;[0#k-I5>jpc'*U1SgAJJtGn$CY!QR]XQL˄N,*z~O~ 7~,&[ނcR$;mh[ d_KC܅V"KpСB@w`\X:]bAůh1,Kh+2+@AJjا:dDʠ,9Z|3UϐLp\X?F:*9l[mZ@a4 mT6ih|MYߒM@f3@ۏd?PUY@@A1*ZXf \.̂Z!bFPSe?Pz[@@F@ JRKZȔ܌,%2XܸHRL"YQy)(v_ 4Ίy=*6(UD05{U|zqˆYW*UIM]d^MIRP!'v"U屛)7 pJBN<鶞Y!?/Z#^:IZ =#~I`}Tnۛr\H17!Kn|e g'WflLOoBzaQE:_L>qI`t> iϯ8t(vA3G1 Pkbo5@ÐVo`rcweFy)/e׮l\?eb1kr͗41fYXϦT+ $ahҟ ;Sx XBMb25ͣy]s)W]{rM'L{[ojXz}2bfe1I[*/S'T }lz3t?3ZF蘬0cO8R1M#}.6,V83+8½8ᄏCy͛ ږ#I k_C۠RRຶY,՝Aʻ6ON_R\e\˲1:@)C Ef CEql4QrʊreKFٔ'LɭAF*6M'zEIsf=mcՈ9!1± ɸkCѠ$uKTZ׉96qz( c"T4:LSkDBֹ8K؞G>"}~ڷU+Rfk5Vc5V1VГ%ev0P$/8]{Jz59G \ FvtJg!iaŨ_V0J]{CĊ,;,+1qR)`Vʸ5 uKVԞ"*0IѲ6Ju[4%dLI=)c>8c__Km\X5Q9A=[avia#WL* ![>mA9fzjAY:~J:b^o~ZC΂7$+<#=:>5RF7Sw^yE/Xo׿aqvf_6LzG? ?s;r1} Lb1]u۝-Fsj|\$#У{.4"ݷ>=,egz: Μg1.޹D,{cǶey[Oa#}ø%_M:6!ggDw^705k/&34<|ڽG|Xwc"~üU8/y 7_ǎ?ʶ/O7ǩկ_Dp;oEw:嘊2g)\n~hjg,:'-V;5:R(vD T,Az@~SjG3s]kib4 *GaDr+P6`cZS+F-tV`dF˱r4} #_?P\\$izR.:JѡR-Ol%MP) \V,*D5!^s\mQ n|hڲ-G )y,]Xոat][9R,k/OCr_Df4&WjO/B B1'2[Jix5X< ƫDlGqa9!b0xK Z'oG i6T+uyOӷe lTg!_TݝkעP,q5}OV۶ aۆfn>mK"aTBVB)HeR,}e-<SAZɚ9t 9YE`ƤGf§k,,u1[fHn~(K;m7-Dwj:.RVw)h2@G>BD~喳{ܛ^@⍿sV+U=F<=peWP<MؔK>źCղU Awy0Qszw96%jFQ ]C\mYBbbJ̦ gxJXg \ؔ +̗a`c|P1(v "Cw+積YliSnP7nɅ YLjO)tC@!9?+ޅTTɫ!Jy2H7 ZG$C.Pѕ3`C1Iút}ÐDݫAI.3ҥIFH˯Kz9l]H"+&J`%>%ɵnw۾D TO( |/EPļދky3QB}5'fGTgeSt4~Q.՞>*ݖWU*SnVۅvY\sw O \P@%jeǎ GBG\lUff0<|Jn ~W1{4We emIӏ+殻0/})Yk6lݺ:TB/Nٵn H%ЃiZahKų+V&\'f&Xat:b.O"Hyjzr,,>st2>.>Ü=N,KHYm2c:5qǍ?~:%0{0b4#;Qu\'y7;Co:8`o@_\0;ST(200@P@)`H$Kl2Ƒ'IҜò>}jOA cANVCYYa:\d7~QpЕIȢkIDVϴ/F}+=@ uFHJs?*Lt.H= {aj.`nIyΊܧ{Ȅȍ_z*Q5$ naղm[dCM@HG[[X4G1(dEԕ%ңDNevz@:vg+:/Sh-5 JXrT*{\8ZԎ(BlD38?N ەNb׍} f -oi?2k/ oy _ W]%u 1zƒ!k_7*?|P?[1'8Žol7lBlۦXcY V8E,6B{S.{voaǎQ>#RIN# %d} IDATSYf MX&#RoW%.΋Ĭ{X:\,틧yȭW<)}2s#Y%]G$_.@J"*vea~\E46WM4*jRI,EX u2+Y "e_@R0`J <˅p!=dLԧ F{xGCMR._ y?)y u>Z/O֢K<xX$#v# 6$ C]σ"SdIƮ ^ YO:eUI}/T?Z;QKXF/vc~RdS02n NKZ삅qD7A0 (cc)cr I=gd掋z^.һ-h{ dR(_^k#}y':5M͊,@J/{o,uy~==߾^dVK^$f1A7 0@4xf:1A4D7134Ӹi%Ƌl6$վ}=~ϙ?~*ɲ$~/+_{oޗw@D< &>=;.N(Cczu6KhoKyS_>qz˛QOc/\ S>+Sh/]w0_. ~@=\J$Q븬nyvu'޿+y''asm;mBĐh̐ZKg 3z.(hXLDn}bnnXXu (?9pZcm%' Zg83g|ҬɌ=d!Ek4I-ij2O? YYd5NZ's#@26̭ޟ44A;r܎c 13=[\W@Lp…وVv|8:UIzs-IAK2eWe>[ PGarr 6t֤t=lAiۥ z&b,\oκP*KF[" -* e?z\ .WAL,jКץt$}ZcJ@HsRTdq4&eJMϊM'U.%Gn(VXQwEK@(y 3Gaqh=,n$ҜJGO^ ؋471%Z SC)gb"q|ڢ![`Ch+kH>cJM ^%ꂌGzǽnz/dSO?'3?W'n{{x/n\O{`{@ŇAG'?0θ>5VV6yU0z$ih2O`x2.o7q4;T9jz5Jk_k5VWw\<Ρ|=#37Z|'s Gmj9:5Ŵ䱷ãInkf;}~  ll;:&IY&&5p;%.(K z"vQVg&cL"2nI}i%NMÞЭUDDZiZ*B dh!V2+ǐ"<"}K|ǢB*쒸bul67\Uqnr=y\iLMqKrЋLTw(k 0"eGya!L+w> E_bCږҒ\~P)CG!a6/[ꧡ|pjH*x܆;{IG{l +~f|)e~Ujʯ|Cr þ/^ؿ 6ڠUƒ8&v{(8?C po1Iz֐$ Q)i,˰:^7?zؗrm0i)Ib_dGsϙ9e_EӴf>. G0"{nk_esY7ߢ+/~ĹsWHY[?)j #GqN݈Snpow/ezۧ)`nY9w;57z?ֈ++P 0O$_E47g0+T<0qcX1Q)y8 I2+ҸZ>$g۳(G[,U|?Jc\>qlFsPiLIe, QDgDIu<v1֒fInQʡ^+Y<",#(&\5eee}7LgȦ47g< cEC[1F,3dYNYFQDA ?GQ1q' Q$q1 ``8?QD/?:zK2a<EZ|GЇ*J:w>_a M̏ Djpٿ>eu@ 1F=,u5SSc$IFr"ᐭSS iwv8EZ;N|CK_>(YR{%׿LDĥI#A Yo@Sota$lwc;^gq! x! #MUštD[(}m \K[{iݎhl1ȊkZZ)A{eeN5hT );l_v\8ę+UsJŒK!I33`0R* `{4byuŹJ.X9k{oV56Fh} E;ı% iaJAe ==hHE.(AAZμ`ϟðW84fҸ!Yr`]yo]%: \Qvvڳ>PB\hoQyܨ;y 3>IE}IGPJUF")ETdl:hcrQquɢ`B!NOnxM[B 0 tT lO΃r%.mږI=dhR#1-t)o(#p;:e7T!pN Iby}|)2QJʤ9 3haYԝYh!Nra)m)}b՗+- ZS|MnHCe?GйRLf`PV }8.Q<Z3 3l ';l TMF$ԦDޜh-@z d7%"mC 0rL |F/J(ll_#;E^_}SH_8JE[">˲mR6n]n]ۣkljn CyB) { Ӿ1r$ywG"jl [2ۨx9EW>^?Qoa>Ey[{KK zv/Q;16VM>J{> @#ݢlaQ ,pRAZ}g9QP.y4>Wb$INܸffv^D^gz h_?aܮ11Qk; _Xc4R{q??f_<*w&'qjULnPEOc!uZS'YPN(<9?K,-v{Ϡc(ff4N%+W;~D'8{4,ԪP)cK%ўZܞ ;a:Uga0=x:V/({ bKeQ-hkK 5Ge@a)lm|[!o/ 9^DXc >FhC9O?ѪW U&%Nbcݜ!S|* 0qhUp" 0 S$1 HX֧S0<9)N&}k%}sKhk } 5وE/U17QcLau?^󲉸EDewt \4j}QGdAꃪt@ii ǗiHホ!Au\3z+0hؽ g\&آ>9 aXjO,}S L ;V>, žehƛa䀕cl r ۗ(T{ESryD;PLpޔmb*U;MC}ƧeWRfEx2q}r͆d}v@?\<dqQ&_{ Ȍ-Nc5އ \J_A;>S'q}IyN>7GQ@Zsq>NZgee~< 3G9s瞻O^"~_:qws{α챗ǡVca$ozӻʋ|Z-sy&JAբm|nvǷ}{&/9ހ8oJ\2zFV)4`_}jhz(m q*nѰ`*Zba(Z"Í><_j,PD/Ṛ8J%t1g IDATne05f*u:*G W)`kRJe֊(1 G1eL*TJ$Kh5nh8bę\i5`{(BFĪLh4[((j\F Yf!hl_$@P@Q+: d"HS9p@N[V7 ػ (γz?2K^&ҸnEJVpiC&劈Gq:VtGNoE-Qyd 2Oʬ 볩4NԽ%=hJP'6yp̜tnԢ()ٛѳBxmF[?q hy Pq]CH(RHlg |]RaCV4f[̝yH@_V­B=%H)H^x&+0FHţBCsTSpdv 1H ֆ}f~ S^N O1)*i&:<psu:U猂X(eshC͍.ԩClhw#๚+7tt:#|_Z+WV8rdgL&cԪrw}&FÈ p=Su?:TeLx;g01>6~+y/Dk1==wocY3 ϝƠ7Gϰ0ɑ#o;'?/ㄛ7WV|@IEeDIBlTklmmi3>" i]N,Ns4w.yD+8q$*&8XVP ^@A aܧ#QuPJr.WҚ3HRSnV6Ui:*|n)n5J82d$,'q&j?ɍYNX-(H:#*8R)M('eZ5La,,m"N2TQwsJr$=!8+T+0[@҅ژPJ>XP 4$#YoNJ5QpY &fa%QWSXBй ilu+r^0{J(\n1HSi';u@'e&|}pKlJJvE%XNHCCI$ }[u'TM?.S"orh@?{ V2}ٛ,{aBI6h$C-q;g#-mH~"Wr?D̮rАFۿ_[M:.E,S۽B2z ϛcbRs$7VeD,ccu`1;;.;!kO~+uzgrNn0̄;DgO#Nz>ij_r7ַMĴ}j f$Iވ4Mp\]P`du>rR g(G"Ir*I+̀5uю.laeG)G G#=M^'ɒ4q<'Jj٧?VRZ;"2*4ydyF&}X Kv4F9w5SKcv=HS2GhN{=E AvzO,~B$^Оg@Ğc\[٧}-@>oRh2+hJk0`QqKmH#nA~* oǡ8JM/gSnA8,o#OY0I> ʋ1Q>1M@: }+ #cPk ]_jMQ98vOBa|w!mA^2 aۅcVa А! hMWuNw U( jPB3ޘBͻap /\\ђ>t]) Yd!$mEP@Me\*QOD~KE  WHbytJll>xB Wqu0x+KnޘǯMqsg|ʛt+<7E8dx8 )K$I(*@no槙Y^[#OSM9|aldzn4 f(q걽'_ S8V\\>#ۘ!B^[gnnZm00??`9/-cq2At W1LycxcR\m^(TX_pHS0Ѯ.Z,^!q ( ┦_M herh>\6<*>XƙGl bpS;9$QMbLI<74nU5(BX%Nqe Kh6j(ff^%Ӛ C:d&gjca~9_! "Fa+&9\qcϟ nQ3d.V{Og(e({.^'sU |qiaWdf5ξ)2C8ΞȈm12 #CA)6nU>.F||A7#z4 @b|,u$cD zNK?i+tʘ4M=Cv:GEv4`^Ii]$u ؞P)7.tua3;p3mYA[vA98$YI#LG]OAeIZɰD/wd_1{hPB {rP%,R{+ZS-ԧEZdј ͣj{t薋Z0L-jBJ5!oZx n@6CTq&wYWs&(cA;abe8 Aae`Qh\YbLtjD&8@f!~ʉFސ0̙4G#:!7hiVVvray2Ap\]߯pWi4k(SW&8qb+WVrC3]bffk7>':mc%Š,iz;\ٴcZ&e9Yf2\Ei47$yvkڽ:aJ Yn(We40qH)ע! uW;LO6gPATE\&rs\etc4ZH9#Hs Vp])eiEf `إx cKw H8Nvv$6>V֨S)vj|_ȧTAf{D/)a@q}8U_3چn.b\!I3^[a>E(c_b Z2bm9dXj-`E21K=(g(}yPuPr·Yi/d(MAav&yX8 vKj V= [˷J[oWC+i{DtBIw PIdci:lNZ;8,a󚈠uMƣO@gPoŽ\alJyP=&NL Ҍ!߅C{H'Wr^O`ޫɱ &5VW&<8PZ N~L'ڂ]c9%8Y\GI7d\x;bg0qcgdy\;'{X/r2tnj]뗵<۾LD\^i7y;as{s񯢴`l4cMڻ=U !ymC5F WBwx*c&K3Ҥ̱c.ͯdK0,njߔUB>C/Cp k Jt;Pf}tA.58!Blą ^ SE\OШPE~G LL*d쟣oȶ,\4UBH}EhGa}["6yXl ( Y;/cz.}\Uj2m -HsN;m[#Son{yO0i PCȏ ]FqpƖ=w<ȪrtYR6ŎS^ 2I8:G6nImcey; x#<7qe ZKXkHbp]MQc8DI&Qx 10m15=k ,--ɛ>s0lIfy8ON1a,bZ9 s8dOx%Ee|w!j v?y}wuzwA\㳟*;e jph_/댏X^Bqn+. (fcpuh]% f3# QҲIBma%09T^ &vC&'DQHr _qD8[4e|Dw+S@oฆsj,,a/#otR&*1u}K^ShPV \("Uk6W R* .@-3u&ƚev4jFفMPP4ccTƦhUh4}G4kD^d< iV [l$=_< נ< .Pq4F+Ag B0XѺ%0ܲhCPtC0ɾ[߇"ܦ4ģ - C"6&a"T<֬ж:p =F@=2}poaqmcL^TNn> ˱ͬ\ vAw%䩈uw3\ )3g`Kr.Xt\ۤW͋)ɠ1nq0(K0vR^c)2*0yGS)l5u׳n2ݤuru~W$g{{@ 8Pyb ]4flAe{C*CբTJ׸<9,g}cn/f|\RSeڍuZJF)ACwSIL2"KV/gks.G}ǨWLiwGQSĉ90]z.+8ȑ9JK?;l6X&r pEj7Emz8ea~6I⺚<7aTD[+a.TdKQ9DQBC/$Q%MRT.8 \/\.|e˜(Ck뺔|HSC ߳F *um UT+.ZEt Gx>-82QbLB0兮D4'&qP:UhVHˆ&dqLgơ^k(0<2,Y,4$AN{grj٣Qj84bhTj ߯QkfQ*fylf!Y7,=~\fSm˒L Ā g$F*|qrc' Q"$"M]]psųZ j ޵ksiƹ&_lnl0`QQ _wOE| 8;.M+ AqXW徃A1pg#?/y^Op/'ɜN== CiOYUv$DTY횠*-3Ȃ?'Kv~('Ү,~S;uo ct $NJU_?qUؿ!RSev vV >kZRW>z~yc'>6&@}9 ۮ71ݝҴeNNƤuM9GSL6b:[hVdg;hݽӜNFQVf3VVr5/z uɏ|O嗮ˋ_i=&F拂0 7oާO>d:]rUY+R<NmN-c].k\O^=VyB IDAT/?A$2WbkcZ9J)_BdƠuSұ\R g5UYc$EqC4 ( &2N@88Zp+1MAcd9VG)k$e80<֤(I&I2vh1CWT'Gk35qN,Ƙ.U>N rN](YY0;D)J'Y/cEP~`PD2 QM=o95acm̕)m+?b3C6n{vHc4~Q=z:>Аu$ҳu1G}:&#G Ayth#2yBƨK2Z?Jw׿k{sq2's2_4`.n^9 )}'0yVi,~sE$ɨ> P(r[$1g\&KqA(E~+rŽݕ):_H2F?̛Dڵw,˙DyW`r◰=(1++1{0ڣyZw䬰m!2ҫa3wͯ5i_3yPؗ[lC}.O$ܑ׋-ׅ%9 ^HٵCq싐tv\L `y]9)d&R?|^o7`{Ý)_{w٭#34LJ@j,NmWVEI.1R.<_ě;S3>5f4/85"ubHsws&/p[9>^zO]7oŗ_yVbxw_9y>?_˜h/ EÃc:ꗞa{OӶ|m.^d<^/QQJN[gOq)0F Z,l6C)Yքm+:C:+VI2hx)8ê@5{2Rʶ&%Ӥ =(4MQFᒄ:Q6ۊZeb oH]wR$?-M-Jkb 'L91$um*T1Z3 FFL o) uC+yc u1$@?.Z&*^FFNЩ"9Ŭ¤cZ-p$x23ੋI/mjٔw`=&}h逄4k!}{܃'C(آyTϥ1>VZ~n4_߲X,׿%'s2'3:_HCi\HaU-9AXlS{EN!XJ4aKzk0ہfF8S`aAS1b߅gpN fnCss@R$!+bZ&7sb. X.F8p#Lqp<usy_{ [e=#rb%^ iW wpSY f?o( syDi/aAyT~| 2TA%0 WuيF]^+~Bu"{!xmƌczW_oWw- їF$.-n4bN-m~gNs^9o8}zp{o~R'.7ȁC.]v9=nٓc3&\>ɍ!ǢJ\Sݥ5mnn$"à"3D31=K0 UpeOf¤7/PZsnG/Z4RK:*uQc_"**Y놘745hZI>6 Ħ%2y?1bYGbèHY.ۊR@rꥢiZ/U]RW%U%A9F#2ʧf9\xGY-٘ Z`XRqp̊pCEUk" Ybr`SJںRa07K,ODtN΋cڢm+%'K*CKTcş%(`!o^__w~_{=o/ɜ ?vF QD>39 瞗¯;pe)k*8I5,ݤj[eԥ=Y\XEYK߃A) 7~[UT V`tRira0ƛ0>;v.](uL**/J%p]kD*G@<*b|:Ů`ta-R^W/l ץ|gDdp6`;)6`zv +tHn[IpRZ_r1.[AۄƃK,^o}G4`Kjg7vh}K/sF}󒶭%J.gƼSܹrYqt44ae[ጺQp?|Cs|(D_2b QZ1XgױΊ&_|4%uEp(-"F64m#r+4E+iG+Ì'3,+δfg^0,Zp`U q0E(ᣤ]UAU4m2:ʨ@T'GA/(%,ɧ7,%Ųdee@YdMI p4eUKC(֢CC#Yj;-,>qf8=N;T:)beS-y\W9 =cÀx95+c6cIЙIbq6S- Ԣ c,m}$|L&LJgE'Lɜ| 9 է*#@(%c%A)Y1oSaph'ދ\϶ϢkYP}YNYUa B+k^mY V7p)aұegKTb`=!1T@Mۈפؐzɢ<~sbc+jVސVv ;}@5TY|n$Ez!_ }X?',J6N x &* h@z B@,Rx4Ϡ j. 򝀌<> 41$I;x7K÷oq%д-U$,=`#~}Ĥ=guuZ~߲gTeo8˹ ,);w!~+\$7?`{lSOe*O򌴈Yx)})Y`mv )`Sx"KZ?'r?>%'\ZݓpEkM(fnr ik{ M|&A)8JB?ܔ[wE1݅\'4*ha[tFo Oá½0#Yc-R9vlM_'ԦxI#!vU\s69l ~ 4HxO+[CUn"GbA>gQ_ܜtgij\l\2? ΟYgpt``-mk!u M,+ܺMiz=K2]G%hS{}ъs7y+x3||&[[S|ןdXXԼuƭmV|׿N`p o/QJJ!2Z/r(яmw⭺S-'׏z1&5Y D=\p0)[1+ˀp0RMRAeD" 99M !mvTTI.g $IDniH:K)-jGĶXms:aV7m A=e(RLMC"đ-MY1\l<(G*l6둦ܳݰzF4uij2O\✣y&au`hՕ5nP u#KR6H+G )ܫK THF1m:?FWcJy!Y?INdNgrRY`W&FLݑȇ,m% Lm-+ţ8% 7pk]Gđo|U$B`=.T 1?bWtN_z1&fW6컰nݖP.`!ֶDfvp[Q J o~+ S>;㽯A#kyd\2 <u<^\t=H#24Ja5\#@S^p]_| IΟ\)f{ RTMEj.{|kRMo=E0D]w1]Kǎ]K/}?=NdNg}"Ve (\4;)y|ևT"SHuV UiEnYR $}Oa~_*#r+x<FO ܗ߼$5c$ȟfyY ڽQf۶IpgŔ]apJ` Oh[| m mi~ݷU= 3H(+g3hV`mSI OO蒬]aUv~UCaDoVkx֝,Lg\kPW]tM_<#@-Qjc<' dbK?%u8ǿE^~"NYY5]ۥm=6qԵEJ9ց(ze~H]N%ebQsIJ>Ob Fix&5<`{7:Mi%HxB }{{s̑UE"r6ݏs|\Ԓ~G]U}t[$t*;;u{߿h7src :Å [k;|mLƔeʐX_qY1뢨ʒCv{h m9~ޛMӊs[̒Xr >Fx7ll8m=I\σ=S5&hI^I |Yq4&~QEC +CZ,L쀉*" Z5.!r$h$I X)˒,MMMpD(qV"sU,s^qXF>xOUf~PI*C ć,uL&izyOkzkMVѴ9I0&'`\ǶE$fӶ(! 4B[d)QNuZoĀj}]I Qɜɜ_"2#1;Ptޅ[ķʉBPB~]S,~F+CͶ`р  Z^XTSxR%TP߆ wD&T^J^++ 8V/m"4俷,M!F+'9xX[~B؁-jYy9X ~HO#i35 bԱk/1]nQKmXwyJd].u&| kg5X\7ĻR܏d5)kZ]ޓ/&L )nCCvߑ/&c;W0G`:/52W^81Yʟu)lA?#g:BY60ǧ+9eKR ,hzuI</HSCߣi tV1~ g/sO>y9;o0t㘌&DQ60pAƊ٢&HUb,,K^4l:C2oi%($Cr.s%HYsuY6̈(M n(LJD!>FB$Jὧ!*uǣxjU}d89N< A%D!P4,>%Te돹1 E8pbM"mKha+ \ޣ$XIk.և@TRhHCwxepi HjɜɜOdYTepg$GF:/fw9^Ɇ0O쪩Dz^%?6)zCyZdA^ٍCx с%Z|{\. pO]eY*kp;ї== Lg~_\VhavSL/mhx(%m8RJ1p I=/+>JAɡ)M퓟 ؠPھF1 KZ̺+p| Eh'ry2H1}a_' h=Eʢ?zS: ^{ J'[5 vvkb(W'Y.k"+>m8[s)y*7VHz {.__{;' [ J)c/TP5ZYeRK{[X*GC*Mp^ P7%^iyNCP0& Q}t$o b)0-$#Dr(YÑw$  QIF[;#CI\NW"ƪ1H&gh}KY7!2ehi}(6FR#E-'OڦAeUIq]T XIvڟ(KRiF k͵ۖFA^YI|~Q$qDJF Rl6@%ccsmjb0iFTDkbxmbEY0IⲌ.]a'(azi_WdNdNh{`0hn wxL& P J'ˉx"WKnyn6n^k Gz鮳}Yn}. K؆8bW}@CI{.K{[<˒I4UH)p^ZE;ـp}y޶dGoiQ&또Z@I]Ȟ0e-ޕHD1} e-aH>'"r0)> ־"ךtll>}ؗ QcTQpr2 3^3OE[ᅤ6+P^-\,t} %ēn iQ<_$#˼h7 z= B}/*CFW<{1EcX֌'}._:ǿ_ 3F!I2 р|A(w_Wr>M%kM`L:+tQ'r6p#Ivh-m9 5>âQ&%)a&C@0[*Rh- [$UU{k,mPi',쐤?&X|V=Bhf%UXB$IX3D M{RH#@T,ԐXl=j6Zm=UY@@Q AEƃFPH(^ȋ!H5i"𑆈j[uX+S^,ɒO@OV[b67 m<8CZ=@l8V+t$M%VIOFshcĀ e99 `,?2_z{URڛPe,?bxxԝF??}(O a]M&,w`gG7`a,5POޏ!YzوGc%q !<#gvG-yq"sva Hx^n &0\D?X@NXvqI!`}(iQd>?wځܧb+X5}]RN=I"j.׹rI[2ޚ{1[ʝ^S߱/C<&"ޔ!혧z)J*X:F>ރuH !_4LREm[ 6F/GΝoXT4MٳܸhqJiU4MiU8 (Y]]e7$#RJgRu#t(ibAhӆYYV,yے Ӫr 6aI{=h %.X%9^.CThmC cZ#pLO)$UEPQ佴/ib)5i]7ҩQic-@D4sG/ T4 x٨%ˇ@btZǷ UQH{$b,Kʒ4D  QIkwh[TKX,w5A @ S]w`c,~R?!NdNddB+r>8%i#BVN+&OmAYg]3ȇ`Emμ$46,TlV?ZLkW46`wi / 0!jw ~ qe='A)d ̋` \9`㼘}۱+{ U 6,Gua/SJR@pUY]<Ƭu v.w!/ )TK:T?9rS)PlkhC=PKہG%$UZ0' l*IɧپP~qg΁z*;Kfc6Vugo/'HQԸ1VMCY.^a:++=~O9:Z[gϮʗ.=4QLV&瞽L,w30TUlݛ3Y+_~#6-b-J'l'!p1_W^uwqvQ=L&޷b笤 5m$I} cN+Lt4aMnMΎISGI^٭-vɗ%:lo@Ж$Q4匬&T9NQ,.5hۣnڪ&/[ưV\& 8Ӛ/rSUs꺡i:TtH{Pj\2`%}bi2Q6-yPTƥ,%`tY|+EgB n#qeIRY@&L[CCfXJ@WPQKP]Ib 4$ AB,,^KKXʪ-JZC lNQ!@ <;$ 0zV:,Xb3's2's2ISCx$Ƨ2|(q4JK4Q{eE~#ЀB/~N@O?~Deq|41xYOa~cŲ`W\8e/=);;GLVWt# KS>R6OMmC/˘Nmp>G{}ÃcˊOkHFfΥ4/CA؁@06eYTܼ}/GDg\֙UNS .qܺ8< Jֲxm&Җ-+Bɺ=MSSW%m۠,Zc >=JD҉j2.ՒPZ XYCmPjc8_(J^ǾQZt)JwdA|",C'N7{$[v96Meko[؆3f8bd"gM_A&dB!3ьDjI}rYiF4G MT}ofsvZج Va\=ТF+(pc8h \K2l?'{_7G #@5 dsld.E\& .ߗc\@f+!kY =+sXVOɏNdGᶇNԗ"| ~,IFpWܬ PBM]3&^}Fָ=cl?s1lF}@an+{|Gj9 ^ hC\p q3?CοɒuObɎ4uMt|Yym$Tۆw_Eጏ>|тgyܹsȟCҶU{}Byk8I^Pw=Dm-rJӶdL&s|-yE)3>xQR7Zf8z- NG}EocMM_JH 9ץ{|.\r) ( ufwd_1zl^T=\4 7BwJծŝjIP?E-貄F8+Яg0#_Eqb <[PO ?=J)5g2K6c x߁OUgcPI\cP,`U$H#w1J?y=vEm^Rt/C#cX 2Ix[ |[gsqʦAɱg|0Z~u2~i*BG~Y&t|_oC~8/;;9kNNq|8ܽw{<=>YOI[TUŻ<&jߛ1眞qxCSww黖[':[bl-wOګ'>%CtK`/SW^=QzM9٬x9NLr7L'T$3VhIMF^|4N&M 1|jgQeE'^|I9abEbT]G?4eI+-nIbᢣw2'ܺ}>Kvo36-ZI\?x?3+1)eM%Xg9`wgiBԲ爾'IQYB9=YbQtM LfSLT)t&z(ʒݲཫF'z޾C t88QE& ZS~pƐ(P~;y?E<Ɏ8ߣ: RvLGۖDrQR)j蟀)d;I-lWp7{CeBRyId] u3qpP{B%>p_@cix5NC]|=CmoVBsB6Yl[CBD:A-8 B.0 J]^ˤÖQm`s#=lVeͲ t[ԡo`p12;Ǽ1c+S Ċ6T`P2Ў"t?ϋ$"@6TbD>~C$-Sû>O'O|o|u&\^57<|645\o*6p|W+0f?#ruY43XIҜOV_sy!F}?~9i>PW"8α;g6ɳGsܒ kL֛+|͖]Bl8:\c8e߷E,KY,87H8&<[lJQt}MדBER&XISc>9༸R tK4>Trewb>QJ(NݺbR䓔I, Oh-&ĩ!)&il4xxRE u >bmJGxRXu=Q 'sBi@[WLku#ʹxͦl>x$В'݂v0tӝLAh"%A -y^/v}i{4C'YM3fM:g2 u%,Im\wEjH>J{b5яVcQ:E(_W5qIN,Kdes?qS7uS-`o4'/TDS ődHTWAxa[;+0;xXB,L6 (PZ4s% 5}p^hAI %}|9&ه"\r!6P& C- +h`=DMC/#t2Qu:U2NC 1, 8N޻DKX1c>vGYn%PXՆ A}tҹC;F`Z]~M#1Ohޖ݃큄27 0hxD۞krt˟!|bV=ֈkLJ<}zE4Z>`5(pN!z^~ J=KwyI[<9W|rCDT5Ip}+y F,VU1o~Uѷ8;`AYhvv&TUja6ae)n؆@{5 yᆎ0t":FБU`bh-恵 $ήTB*sI΂ӻ/LQ ]KNc舲 F[o+O(K`2pމpAm#fX%l* < u-@& ]OYX>HM6'Jkޣm[R%N{-:F IDAT0VoR ޢ$I(cyFdܿ>xB2=b;I8==!1V|r45V'D1 A iF;t/ٝO VkD]Kh,Qeج R}Y5$%+rfIVb)@NEPLeشT(蟿?Zz@~brvB?_Ɵ H%OB[3L7ΞlZtWτw0x) *ࣇϸu=izO/ym\mHӌ)冦$#gqxKY^{X\$%M.Q 1'L b?_E+sXe4cB P$IRDkQ\/_,Yur[" &Lc=}'G p΍;)} ]6wCZM z%Zi70 =Fk,- xO]Uh>w-Of-M϶ihA Xٮ7diAMX]]$(@Z%ƀV4ɔ4^=$".'x yc 6y>Cm2bJ&@YDGIQ mQhBlK0%>/9zrNib2 =, 0}:!0LȲ0 K_|M/cn2Lhͷld8,NK7aWϤ^]I?5T ѵ($ɮz`>G!c`lSy|&͘=͠XH2dSѐ QE~Wkc\-Yh+'P\B5߂gˢ+п& h&\JKRyLB> +uy&NI$(6nKr{_z~)N}p\'@/_Pl9L=P|1:d}u2~+u\ }tCp/{w}w-KnSm?Gl֖ɴ`6,5ZsrσOx-jWч 3O1p}GgU+/b.u[}Ϗ~#?e·{G<{']W Y JEk%(01jL yJXkp4$:g6AdiBtMֆÃVkvw詪 ZűIpfO5XfKNЩ"ism}`dyJ1)Hj{Qd]Y6Ҹ$sbMK7ȴ ]ߓ9E^g )yQ752b2av?ą@9bK]7WL}U' >MΔmiێ4ϙfn0Vspt .BI)y9?}7x"Ze4u]"-n\(*B-.PYA4Y"67jM ލCRٙZilcG(d"Zg/˿|sn~ꯔ&~A\M ~*9Oށrwĵ(JؙVp^ͫyM!lGW+ߖ[i^Ti#FՕLC&BwF RKs++`qKK,|Mb<7d=[Ҹ/SZ lߗܵHhQBkH[yޮ;[&~C0?(ed]+/a s1$^ͧY~+?*@ä2F X_o"GcW7 㗺'9-Op ׯ;".8u~/ɱ7Kyb͋Ks>>f`Ai /;S pzzdZfVlDjqmDf%ՆΜd(}Q i*|=]גm7w1*.M(G@HlBghQ#lQf9;{ Y1zeRN 7p~vQ ܒ!J0(m1FVXTiw4cNc6C@b@Hh"EУ%j!z )ʒjS99~ y{'$~˼]\-/w.כk)j0ְtHg4UdB7(6y)ϗ␥1qPZSL)&qCb٫o бnzЫSٴ=UՀ2dYƺo5]ߣoaph) d</HgSYJYL$EE1d W# G_7B-~ Wfdrǰ$'ds9[ ɷ| v &{pC[{[@} '߅J,em&M8Ak>p>!&?8 8&zr*7E^X2v`Sb_\t1{y bZ)4.?RF}LTQ^u\_z sy򃬏I`KKGzm)Rz 2зPIi(ZTֳxKǭWOGb)b7\7 㗤_1z?~n׊>~_liͫ AquAۄ#sCw4M:7G'mB 7 JEϮQJي$pr":9a>OYL' -C|7_GhꁨhJҚɬ MbLS+f{!nɲL.'њW\V_jy`qtd:^bݒ mCgp$Gr !/YIRb075W%R,)I] Iе=I^2tБ)lxh-}/_"El;X])} >\Tde,:-Xl'餤Aw=i7m ?tt%q:IvT"I8Ap1P%;=IZNG+Z5#mm6Mi{On2`C,--I>|E&ޓL=vmpawS9WÝH'"RvD{a ٩}?T {b9, x0SLӈz)&u+fBJ W Ҹ)Fp"8.$##^ky= Bk7c拣\KH,naO';mC- 0rԈ K>]/:9 O@@/\*(dϬm_@`V\]M]ݣ7OWr>DeAQܻ:Y<~reݳ:Bpͩ-y(qu.;l eiQzB ((˔-Ur&1uΜh xlfsM?8֛4 営{Kq@)EYNZFc z UkOiAbCB3r=Ba Bp+ On ]Ncw@YB6uEj4%vMh2ZKg˚4/&b2YQ{<Ē[z͠:iRI ;0 I'IS 05ڊIJ UQw[IAb-w죍d]IS|N;i"{wĠGw. y-=YobKC֒Zwل2-%f0B;L%دi#Jt3DMeY70}.?+[^tYW :s 9L2MjX% J( 5z3N,Zaٺ+FO__niK{oRW+V[$k\-rrpFY ' n$ FcIJ?c68:hjMS@H=&1N>3bgk%#9bmZ)RMgĐoPC"$Eླྀ6$8%BOvpd:-YVX-&1di[ 23H40FQlB먛r:%b䋔ybuf0>c 횀HQ@4ւ2 #MӰ^<! ZY]w@XTfI(*ԒS/zBTXkVK&`P)vb̧ͤ%m714 ,{;.IKXD]?$iN? m II <t&-KTgMݰ( c uShC4c*kK&@7@a8ڕi6K28}4z.Eqk d~ 9|Gо .` 1a|%^ hUiOd21qvZm Ử\}6 (2Yٹ/sыebR}'2mw{! <p}Z'?߀O pߒǟ}(о?1̾5:]ѳ仐]!89ϴ /taXi60UE^<}>g?0dJ*qZsIywvp\ sžn@/mem~K~ћt햫 xezxbA hLb9Xm{ma(˜ap0xAD.%]c;ԵϴMwcZk5ekQ.%sFͦ`mZ|E91 =֘QxJж$iJ=!x qea'10  e!|hԂNȀ'ibYW @8 1)*Qڊ8FS mq} X1Z9 ލ_`lsV55Z){; c4m`cZ7jMc1:4}GtMM[&3I-;#Žӌټ؈ Z6tRO'tj{L]m6d/N`@Pg4ۊvu-ڈDt2aTd~ f{O,7e:]I8e(ůL]~Y([W+Pqtk88` qrkl( tPܓp ]J'?FsX,a;:Jڷف}zъL!$?\ߡ7 os) *5eM[1~|U;wRh .]g k mMsfoo(*֫t( 2GݛԭPg;<U IDATǹdZrqqɏ~1j^y)D ( ! c461"6`M鈵tF$IR4H1:\װݬSaz"&c &9DnmFksXwIPd1hV_K%Dh=A.wдP `%r0}`S5E4MAZ9IblF mB{ (8~M˔emrk9meZLZ_GOo}e 7iqR蒣d:S]},="\@A 1Bt˳ 3WwXv}'x8:G(U\.7\^. 2m>d8_+BP۞xdqΞ$ߥBP)Ϟ^v_yl24ŋ)b1gI1e+G0]iYeؓ&e!Bk-X!K3hmFi~@D T:'hͦ =pc'b*Z5&)0`l"`) {z K VHSqʍ{QA,[D#aLѮsV&?.Y| &+)ܮ%kGK H L@HћgӕJmX~r-?xh_G""_ P*$_ (ZW?2P3?~K-DMBb#:F2O!?i.db7eha#tq;A-Sf#>G4s;M > 9}wAy|>.xm&mpz5.v|\]UD<%O_\ɏ+Go~ M'>fy]qO^'!YG;8/_%M̐:uG&l O:L iR4+.:q=ʲ!F\ߋ iM$YJvTuM@DkP*1JdžtEXA]#Q,Ja!@PVB@W @%-&xׁRO(Q*o޳G4I:gr]n y d6md  }Adن €a`$dAräxœӹ+?~qlAOu'UU_Og(и:yE,@DhgskxqAQԫ( !$̦g CbpLep}wLn"ӏZ&pDt^Ҵ˶ .@`h:F1O@ ]b[Ղ^QhE?qxnlp~q!.cʒ:=x@X-~Fs2K^XM[vI3\GWz}2ouk]UH^V)Bi5eYPYLhKFRMh<@Ht,\m[c!D&Ud~A,1VcHb1kLb15JD LF;9dyA8煖1Ҋ~^'arDlFM`jKvQZ3= W=ZӫDb] Z"Fٔf=(7gs||l2`gB[˖ r-02 L2!EQ;Gc?mBQeN `2:}Qۖ"G笖Kvw(^O~_m[b2Ņ@+f GG(p0%2.wYYZ׺>RI܃|f3ڒ퍔pψ6a.< x&Q} N ]Ȗp7 %QZ%>z8&UE+AY_{o4[IDC( Xll} AoOJr9|-Ӝ5ؿl =_DwDq;Q-Jֹm9VmTwVf%\; AfSLˤ#/)-h/ĺ>[\>C(؝49few$0 @y k+f$1k 2~*d#|_>8{-&T՘]vw"ѴmudołA)i[,/xW _wYm;a4GhZBV-QFȋ%^O bk[V9eQ`a꣔!h#FG6Fی^Dr6bwDLdNS<V FΕ|JQTXk \>7z!:Z)OcF! :.BGbTX[`IT% f{L4-*3b"QT[qz6e }VMےe9yVR%*'T~ YQqei5씹WL/ιX4ɫ>y)t˄>l[]d>aXqﳳt2/x7$A(KĢ@۴=:?%-, b̦Src 45G'x穊Ry6c4{k]ZL•JK_ST#~3-tq +8啸m͆"Tz0Uɡ8I-=`Bڦ,T؁40юXJeORDc $g;ѽ#wT ߅z$sm1"X悄5tNpn*v kk+[#mbIDNhqpE-5V۳ {п)ӣ/Cŷfw/@ǔ!r!l?+vx*ԪKZ&4jm8/d?7^?}Mt|fiB? k Ѯq)){ Ƿ^\h^oc,W .GedIUz! 32 9wrxxxx[8:b!xQ8-{SC{üج)S1eE iDbFK`Yi#S/*(At̏L غ%Ӓll| xpz({`r Y\?U`9璦J'oPT&Ƕ8fzAt Y^Dsv_K@M2}̮l$ sCn{q$Pڨ ҀбяzVk^*6b|ʍ*bGhqyA5ا?.eox.er`:_2TMZ[%1V^ ?367򯼈O{G|pAׯo3>еuQIzqN36PX+Z#s1 R]r1(_B~N,h'MhZBhqJWz=)#xk0zƯC(UOB3"cLV7d0KDs8= +Ôqryф&.dQ`~!ۉr^ǐ,'P?gK2ȞLHS ~V c]?l BΙrqڧ,7)M';&6ڤ?YwGh,]xQbAzRzՒUbog^ AdFeid,dy. }D@ksrU+E㱀5+`%94S%y.<1EEeeQ@f1`\dh$JK A)9u(PUbW"*1EV&YM؎;rmP eCQKŀr-66TÊY8zhQEΠ_2ؠs-gae fh 1(C Nm$ೊ&v GC̘T:Ś8j-glqmnj0f9JI^_mݵ(^@\g=vymB'񼼎Fvՠb;Tb9c|N۶EIU& m{_ћu]Z]9d8-g"\n[@IsL 6/B%˅Դ0y(>&DU۔ԎE<_'(NG/ *<.8)E|~8*σ -ءbm Lk 2gJX# 9R144uC\ж$ˇ&eoM#򼏵Yp$T,Y.crVuGu9[j1GU6-gg3l*Ju-1HY|+4I3$W[$O]*MP9jrz7ij\SeZ"T(Pŧp Iآb 2ҘP>b40EE^YѠ-;TȍAk id} X,W:cGb|jY\.Mg4+|eX &(zJ+i&yȈẖUY"GX` NAg ]1R%&**FZ.S`Xƛ[@Gň6c5*w߮x?k` d\QdrBS MXXo2c 6X1=@W7׵u|WJm&9d ޗ{Єn݅oC /~%kPa3(`u pE/I3i͖'Z϶P[0% /du38yn ZA08ossY/LO%VI kVwj+EX$.vtGgŖ%pz PF{ǰvV q dZaYJB&PG`EdP9pyMaBL8;蟂ߖ8t5zp'OdGl<*cS/19ڔجOqZȊVkQb૪b6 !ba(1Ѥ 3\MY4Jҵ@!&eHӉcX,uh^:BS8x*}\GD]J+xc/b} IDAT&t,”A,B3$&# @)%֮AR(JEbj9eoL[M0Mu u6 &m ijT =:FL!*-(JwbKu4Msrw󘳹FY+^^^m֢(3C!D\XMM٫Fc%` h bDkCL~%Ш>o Lʪ#ܽ~\ouk]RD ZJ,eK)n )=#ǒR=+N4RV_H 9"$! U5О'$e2!y4v\IP8z-&,'NHBROބ3r`S'+!x_6pz_-8}З[2cd%}Ȕgc`xMHiD&0ˉu'Yt2uZ xV,C#ǣ2ũE X\^;q%c6q+p5m3aBicJȋ>Ɩe lVM6RI+siu^4Ik"L+&BBl1FZB0ֲM۫r+1y %i;* z$o'nEѶ-Jk"L:$qcQYJx[ y t ed=|bDgՕЗ:%Mu{h)l++GW}f  ȣc^/i"xWJS/k:(y6(Gc2g+꺥*6[@iV= FSze!Z"!1pkf!2m֒ke4cy<1DBSкZY`dkrt}'_䭶uk]?AE5, _0്g4?ar" +pAV-,lN!~Pp3ipH,mL߆k?~Wn"4'"INE{ @Av_,/P=74~o :w\|~!V߅ȴpZl<ߓ ]0 A `ay(` (ǰBGkx# RV8@T wKlfC%9&'1?BUp-~w4jmG",_k.*^!<.tx"6 QڠEi2fm x`!`w_$1`\6`M)q^Y&@$M0.E]A4ڤ4CBK}s~dA)- 8OvdYDp ͈^΃Rd)UΗ"W=T!FEE e n*٬JwsOJQۜ| A5fE/SxY-PJmReſ1Z,9EDE`>^d&HXոn%ӊdC߃ 7RT:Z#ty))JE2P>袼ƌMbH׊w9=/y,s?^ֵu o>JcʿMفgB9a ,N9 B N$(÷$toIu8{$i[pm8[{MwrGz-Q\tkfSw r_)u[iҗudB2$۰&9jȞmJ;Id8D +xX)\􍴿cVfimA&l\iLb?/e{@+@IKiFeyp_I0rm~w2|Z5X\U?8IC)7y򇐶m}(%B֢sP>*mGC e?m QWOx٨w]RW`״U ͗YfB; !'@ۤBDJSj6V-*L*T!ye:G>BMP7-uSJ68~V]^@hZ:b#*.3t-Q1p~vr1R  4Ղ6抢 U(XL.XgV3wx&˙=ZhZO00#M6XK룬IDѶ EsyYMb 5j:\. >xs Ql JbR*G+ym/ХlAnBk(z]Koɺֵue+<ZxF9LO;LD1\Vg7`ڣ iF?zoA [28kb3= ƮL*&d"B_ sNe?hwwdҝ!\n_cSc |X' N5~W_[࿍h$g(8U.r< ߂}9/p!-b[(h]l2Չ.eOQ\.tɱےέs` ؀o~bW`^>/s,߅+rރzu>>-uyǴB,h.Yf#ԡw{,d#TAwΥP$^-]] pKXkɼGkNhE r#tK-Hظfi?C(VDחCcRAʻ@>1%rCuEe5|MV>D?dc|vz?Iumy^`LB)E׉-i#!8UA$t:PSѵ;sш꡴%/KrM*2,Rd *CB,#Vm P,ȬQQaI4y[|YDPRhMq5(m-[Up2^4 M:*Pr1pqqNSp+s.ZS9hNS%<Ɍ!kȋQׇ "vWƠj0*9yQP%UUa;:Ib (z"|mP]F:wȤ:NӍfIԸk]ZϼWD8IL`t]Rcg(]y f*d["gǢǘ'y͹8GybzTIC{oB9^o3 e&ϥAVwDWR~FBn" ٽ龻<csz6(j4ڂ20k;w4s׾$40P<<܇Ed]V|'oes>o;ߖk4?;ah:(Տ&2*ΦڂD}Amǒ3xWL_^;?dWҩ2o]i}pؗL, 5V3' Q+x6c,('QRUͲ+CLnRB[ 1 yj*]Ѻ4(6Z)LQѣ#zET.$d]k2Y͂&nb˪sRf-{s!R%p]ucqS 6Yf4MCU%ǧ4*iD>^NXkY59tVFc1Z@[YbP֊]lD%NKN1+ !(3Rd[&#fDZ%gg眞P%;;;lmnR'4)k06jЬƺֵOCXq:|4Ikpz,koIpN_|$4l5VB7$0XNoY-io +x,x"{Ft+@J+o`t)l, od5LO`4BMj^dIF}.My|>My5ڤ!IaZ߄o -[q$"fO]pN5 nJFVI`%Xe4DKhhyUxksuLrSeK(ƂVX1HS i3q/h]e\ދ ɬ%xOf%s hu0f8'%.@rd,`]Z׺>S{_ h񊌥pda,Υ5dC+y\X܌ yHȔcu!`RLKz[~ʇV0V'tU8 ځ[_we R_@/ 4 &:Jo&OD10zN(T˩8Hy \|l nAQHf/JY9(-`)MxH\ybQ[nRB:;`yN߅P43mR(-Y}yL2Zz WZU+u,?&Z}X' #BwFr2ؿlAƺ>}&Us _HN>ѧ/ BjcHM1byH*ڨ'BV&Bte4>P`HRS(N!qe%i\8؍)S< 6X*<#<DYAbK:TatcԐ6t9I!FkӤF.~)L<Շ@p*% 8 E9dului!9ێSZ\(L(\YF\vMд "CkBYkF@ {!ȍ7˱uk]?2{`Ay)`g8;JnۥL5^X~4y%kXVÉo\7DeEHSKr `v ں%!xlߐ7}3 +#(nshIA~G'дб6BnBm]-˩IRS3X/&Y#W @35,cDSh3_ ?dه>/IpP#)WE#Ag=(%J g9?t쳢@%Tm&t+Fs(HC;Yp|t_hSG_O~ǒf^ϓU/qo ˔luk4;wHBFv]#纹/TLVNh4I[r򦀐_v*4+\_I׀=|>辋OVȿu|&FuD\8Jӏ%T֚.knҪeS}I_qO?&~WݽOeZ׺>銝&ʛ`jldI? F\]vBY`vK6a ԰8?Oşȇ/ 5ZT#+]H"盰ZJsIM+ f(n.YN`BkW h ,z")l Hy;p6mG[;Ej)%<. $cPuu[!l<'S١ږ _F6,o"bm4Ɋ']Dc]׺^ @rX@ |ˤT@:S?K'_?ٮGu( ~u%Y׺ֵO4z}XX\ٙ4 VVRKXUv{G@C5DDSZŤhNKPDV; @[z?'"k-qS ^,[U!ꖀ@~ W"͛B}C7_W|챸j;t_@ 1{R5}2sۢhb[`HQ |2mpd96^94PMf_}J8m<&2aֵ霥ѫV$}H6 ^?0O c]ں`\>/݈5X׺ֵu^Ԧ10ߒ)a'+c )-NQ4Do˔ %r-HvZ(Os0+Bo,bISJ5?&}h7eA):6F@3/p7y/9%)| oA,l_;]Vb[+,8yr,ӇL|'[IjyeTd Rib Sy)ᯋT~CUe\LC[)s3?#qs5Irֺ!絿')_X> Z~S>F>/S}I?RѽF׵uk]Z׺1A>GPDgLeU~)m0t5,п&6Rlf}ɚ?x-5NVykp,%: a ${(΁We6f?iKYs Vsxh.oʼnОK *? ˉ8*ud L=S}zw3Q(T/mVt"N#\DPw25Xd9ݖS`0O`2UPܐ,L3V\6z ïe8A- IDATweZ׺ ?Ozֵu}jKI.K^{!K_3GvKV]D(ݜ Mg'&PtoCwfe޳sęǜU((Z-w-틆݆_K lAZR,9O9Ṉ|LWV]g}~6"cPk{O~#~G>%y >TwaVv\mU0HvղULu/'p+,T uY JuHBeMϫvM?U (AFeQ(/G J۾{jK96Ωf6"};@s?O#K]'I(e\DA3UVn)X)03PӿNRv"Ceݛys?k="8=Um߆{؇T`e ^fƚ~20pCX{>J cOt_Z3{e#9> kZ9Q[! UF)Q=~m% _Ez1"+!NT2=&T"5_ pGnۣGuKjYCᅉXTW6$Q[] T6!@S U7lqL|%(k#c֮`vb $=@`jEoy:T"mQÓx]fa'7X x2QUc0@XW%(2((~WϭsN!zfU2nt7Iǟ,}AtljHy>jKotWEݜv03M]{U||svp}MW\q]%ӟ߫=ÐxQB%:/` %[pq*( CqK^hֻچ?g:3%ᶈHؽSo*R[?֎(ܒc ԶTmʐ^ڊVޅ?[S|jk0ct0wZ{A0C9t7րR}2mU{sub l>t ;w:?<_" LK=l\|)xUA,%C6a>'SﵑT$KUT'}85 `L,  QKQFeQwy`sJ'DE13bf w:vwbis8p*q^=iqΏK v|ߗ~wKKXqY0N3~+>w:V5֖4ɧ8Xߔ2Q\;u?E[Ky+t.bB@@ށZt6g )= |.祉8Mh%:Ntq[ !Jسzƺ/@R6ѵzۺDmL7t{BDUs:cM{V^Y`=V9Y,<ܙw>WbW{U%X{M a2{>?}h\Dft+JKGE6%ZΟ ~Hv:SX}FzJ=DסwF۫L6ܵ5x&;X@&=$=Bbr&ū9C} ;纎񅎝=]k;Ccp<4n9?o҂3a :'ظ heOM9mUT. CPR3+kAsMՔ 1*ϑ⑞sX~~4Kp []2(24=)*U3Ԗ4kOf59;{΀fڌ&yiF'-Z̕-Gcʕ}/hsoڟ~A,-R<"3[7wPy[pYTa U8z]U#0*OZ@}ZjkJ4ZʚLsh͔G{>㉪I G2}c_Y*o+)nmC%m7 T6`>йv);BLb`6t?^Q2(2cB-b 7_f a}JyK6&ϫa/˳nVX`̎7:̏\Mqn-H]@,W)߳*B#>o~1eN@bbaZ[̌|՞5T2j:?k랞z{_+7$c[m|9կ_I.6} RjXW6BmuPk+M\S?Vdz ʤϾ N\F^!)֌}gˏcUhNt"dGjʧj*UW lj١ܖ`LΞ8~-^9t 1d'נ u @@#JT jG*eC* iWڻgV\3?z~DU;0r dQFeQvY͂ml[-W;OB-JK E p湂enȢ:`f݌<}N\?D}quͫfQG{yl"ۻK۾HSh+%σQ!E^up*G kJ>onK9-2kMRI)4 lґA\RPmWTVW <1:D/ShߖS'G/ O>57"~ީ*!e'P݇H L3dOZE&&0ӵOzj3L/po@tGSeh5U*&;7R{Z6&Ѻ]>d%C)Gou=-)'Pl^a2(2Gtx6CnM} Ŝ0=gEVVg %cpPX-_fpE69. /]hq$%phDZ̘+3DΑ[KnsKa-'tlUQ5gqnk-}[uk|H滺Oȥ%0>PX7 G84g"t:È1܆H0Jr2+ cp$-*ƞW>n8>{-E ԚXUdvaڗ,kx#8D8up=%޵Tv@.AS#~]RXXLw ]/ y ?@뎯pL`tP,zM Êԡ~$spST>HUI厏ĽIGY1L>l߅zXmZ7l* Sj+}=KQFeQFs,RhO-? ]KmE y~Ɣk)r>5kmZ %p6)D6^j䜗] -Z.E3^$\y5J`ipwiOř8hM2%sừ^,{R5غ!S7PNv'Q[Zv[ iE(E s c?J`gdλ#UX 4֥tړjU5| $꜃s @mHaEJ`ť}[KD`^ӻ/C.B뺯 h@HI6!Y980 Vî$fēzDLnF5)4_.K`} Y_ < og`]@G_i&Ost,_*[:f/{T^Y2(2cA^ P(M6B)|B!W‚ИyJf@֑`wb+3-W [Zmڰ, -3T&ZPJ]^^e^4~ c+Yi"kK*NUz)]l"cjcE>Z3?:UJT<؀CyISUpacWnԣ ONmgJ dW_r¶S}!j[o@|+ccc?۴-'} 6nI3 ERVt:dyŀ9B6 e `Ɯ&5\% Z#z}" YlB15:|oA7\Gk2~KM\2w݀`C`:@-;cXc|%bWվcB LL{( Xc:~F|p6fdx@u%Q"~c`(YxM 5`H* 8!$m @mUG3m)tRB>u6s9S}]ҨE;߮&u(&,yFxdބ/{%tƬm}U$KwҔLC܊G@5U&U}ƸUt]&x-v{Rۿ(AFeQFe|16ٌj2+qf=η;( 8>L>[wY֛34`I[YkUhn{sppP'9ggJ"-ݢj,'JB%(h7d 'TmQI8 =ec{ň(]ڝK#r_ `Yv^YWCoX}™0}jeHfK\d^Ukx,scE-Mb\3hH+oa=x| H ~" hux)|MRHX~5z=-mWɧ0ބ;0\ՍdW,"c:_Aq.$;p:Ǩ+tD^;瞧G\Vqg#I`WRu%ن| [CFjJ\jϳzLNΙT5= "b]MI=hԾ4<GJ}|*00ݼ񯠷#i 3˛8 _ѹ-w>C%5)[*cM?4 5?-;IR߼0ht"O7VgKiO $XSXc ={~ CZBO.@ɛ6w_"&2Qx1Ҙm!C 4>Db,2xׅg0xeoh 2(2({(Z$y3c$&dԲZe0ʰloo1M(”I"&Cqޛ'l4:G\JK@ά2 ~\f1N)Li@@,آˆR>z''8kvs)tӓׯi}{OiLܪ-p32{TrSxP-KO`"K' I4Xgi+8 2qpJ^i~r4HT%ūy6G'nf64X"g;lQP"Ȧ޿F; c+u&׹4jzI_?# blCRLfP%$e/ϗ_:'0oSw0Uh]ךO6ķXۓl秐n.ݙCfރþT? E}WOjө%chbRidMSyZdc9_?a:tdlӰS>\}UOqKW=4|;U1xܬI-XvgsnܐFƗ4 ZQtjkP@vXXtOj{6k4 094m'"Q[\b l@kPTפDGȈ/eh 2(2({ܲ$j/v1k=23j .^' G%{g)wX[m3y'rc{F15dx5)кxcAvzO DݣS1Z75*5Bcǜ1avghJ3IdIBal31m([JL] T̸5߁9lS}>/t mڗf{ ˣ3)( 1m:]ݴJUfuv~nD1vT]A0WIG<ym_#΃U10 IBtʳgp}YA)FH[lcS㓧'|y̻oܡZI6[` D9݌Eag9pg$4A,;~ϞZ]K9o/dx2w2r>?Ά<wH5}~ ذÁXxڕ2ԴJA\'#%+ƛja:{sCq2Q]fuvvޒTq'`jUme2e87UOTZ>VH!;&G"k*0>,oyB}yЖ7(|TI8ToTs D-OTVwe׾".i^I6xeU=!&pjDB1!L܍E 2(2({,1 #0_0 "44*FHvzJF~o@%NloЮ?{4jrzgwTTm$CU$kyyeE)_507yIZo1$8D`,O{Sv+ЬT"K^Ӫ|$H5wϩ7[t \BLRe`5c,)%2j{k#aD!a(9ߢj%sߍM> 46$:ƪ~߹ΦZ|n%ా OWpO{J|sp-%CܕQ)==:WGJăN>7$eK i0V2J&E6| POR3XJKz c}%B(`{н/ڕwR SURV N4 !>ٗ$IAjT TE)297G(0O6F>]3Q?A}W8Wd >{_óUhA=XU75Τ%ó_J6>9r񮫭Ν-8֏)߷%(2(96,3͜pj" 9TU#VNVCl6e:C!OiUlڔnA7mgG'9{k)q`L,9Ulaa! 3.ۖ0pU /+ ewqBZ7ƥO8|vGwh'1FL-6Za@Vr3 9;+-FSW'XWG̪IL-)041q 254gd .ڥAhm\cz '1s9cך2LTɸ8*fl^S`zU*Ta;ǐ?DBP4U w9ޖ>Yj>>Ra6N|RBGHi&%r$7p-+%&5tGOL`}ݣJο^$ө/BVߎVn-mW]7ubȜ\m=pC`.-p6Qbc {ޓ#baZ'+ 7"OzP& )2jʷ(AFeQFe|1`}m~}:WfmsDe7~} 4R螌^~'8nj]sQ AnxY{kblQgG`\Isi]$Ad4bC8Nt/Xjl)̭  iAY=11˸8Ѫ^]ѣ'4۫~}UOPvP`#sX9()k $B0cf:}ja.ƪ8 \~G+6f!hp߈VTM0"Z9ME4?{ qz";+r Kc Ύ\oxZv?cGrO!rE625Nǩ~ tt)dz]mS3wt.t3(T"M7K Mzus=y .2Hކw3} +q@glM-73R h\46v6 aSV.:+]dQFeQZͺA#0pN>fql77V┳lD\9WLG)v=減rwB0;bYs/Icz N`D\-,FU C`?oXi FQG^!&4WXU*ClWu{j!j,S0cw:ńBZ(aF3jJ gg{ZX,LӉ&8 v1 0@AV Iq7/dgrɽ@6\C:U_%w~(DU %;?,E l7)*nI܄_k,E& xXxb:8H"a=ZR!?>8{ "y)NߋZlVTy<!~&~Iz6 U1CUwª/;?T%ැlqURJ^d{r4zoD Ns^SӁZ̢;qշum `ݼ 2(20Eʛy3u"\6pm{k+09{xeTi50i>ni$M klnv88{ʤԲ@-0!&,(8BcpڷUxs1B):Y q`J4gc DŐl 4tVVfZW4+,YrΗHm@7s}{4L#L+!\P:G^7:sk "0@`1qLdD!ac#iT(iCXT=;d%_C!t4>d(~Dh>  g"`{Ծ6W"[o˩j*isI]%4kvՏϪ2m{\0?1_JT~UعumM_S{l~c|= tM!؄ x *3X\uMƊkuBUŠC-xЕ:T 0;r^ORhKx*+gzVA;~"}{5MOa}\= ]VM1@dkY2(2cم/  Ya$ 3sRzױ_ڜUNN.N,^FFOX *yHقhH8JǸJCMfQR nGagXTg( ɋK!Irz ZvBrҟnյ z.ᘽf JW"N&p8`NAGh0Sg%@l9mcp&9PKw.5-?M!QWF)L@0zӿ=_ pD(0}^WR޹ sh@kMQ= `+Jhki\ϵdGoIT1jt48署jG`TC7~jV6g}dKGTQT9`|сTTjCUZUU|1@V%HT=~mxE"/XWhP,Wc8'Fsc4#}$Pn)ȓ̼:_Q2(o1Fә6{JJѡ^K-|휗uDQo7+]Jt<"U,` :hHHA8"L#:0Ihu}Z*fi!Ggv7M&qH-D88 CE&^[ Kr7OЍ1 iZ@%j! JH%1$hC2 QR$خo$NΎ:9S\PKjc&)i3!a{%3=Tpf35)T!r&[xe/ `|[~7 PQ{DqFR`21?Co}~ 1 P &`)D KDUJEھҀAXSql㧋gyUT$u[q]mTzf4l6njyk0V_@eOY& @7=ob#:a뇞σI"NEkGgaL.$k;{jsJ|)TgxUyS>!r9P݂.NnUtY&JQFe-p<;^gmf3֗d?-UWgv?gW ?7+Y_K\97ݗwW_Kg}?_ExI_hڍa~L cF)Cx UcjiEVt!aDmp|: 1ӻlnoW8R3Ma@Z'Ԩ!kHy0]<\}>L KY_Ъ%<=TL&)vSXN.A6A,8?=4<8:**qx<%/ Ip4b4fueEXNng (((|  =3qKoK0یdWƊfg%08֌{)LFs9hwTB%*Ij:cXQ`tHw64"q9:"Odnw~}RnbTԌړ\;FXQuc8+y 7DXCлL]HK*}뚇ARjl.2!I"oL #t 6. ;l@ PeHxA Bc@MJi^8 gQbWeQFRt{gڻCі%hP,R'%ߔIUs7$/Ii*%_߰v }xyd|h7͓ܽG ah>V;#(!cx/pBV#r3TV02(: ǎ^ $4 y?|W׸{"26"iW+5j€qSIj&3a>Ү A`Io*O3 9iA5 (:Ҍ1Eݛ(\1I3,ј>q! BBc8<= g~=Ӭ ϥ*e"pVbI_Ż}aS%uȏ:+y >؂5P<^/{ Ү* Hmz_hzHǵQoU58Q+1 UהO%SGG^UωڿX`w_ZGUXPܒB6| )ٰ PĪM~c 䴝Nċ{[DwVړZw'Ou5hjl#k⟑Y({WS`MpS畵|etleQFR&cZ61\q}2pϿ#|YR_aB9A'EӃCI>a0`DILR3'`LgC_S_^0u{lu FFB2fm|zDQDR_rڣ<';XW2/:4Ka8`Q sJ j~gޏ#Wj`|񄃣zgTk!*`tII^U^!h4bCaU( *Q-=ſ ܼ]0nQջBѷQSy+3yMw_9XKR'&# h^x0 OyW#amSEԟXjML(о!}@*/ #ۛfVXIN(Q{Rd>@LAuU讨m@RߗRm#h ]`GMXWB_<.t^ YꎀG.L  _"`g2~$[]sk=P`eDi,Hwx$y&Q)?&;?1i,IM%U `%508W4b0 RB&lAT0~(%0 ѳssܤ]\o[yeQFRXg]q)/{>^vmN͘xYnMɾ .seWS櫕%W8r6fw;^J7W="rc? dVIi8#o 0D$S'Ӝ,DE9M>1Ah6t㘠R!/r&YNb0 0zNQ'`(y%]9z{R^]{F! ؞a1!ebxLwxc0B`#@ HDk[]]յ[99zx{3ofެ~.d$6֙gg=[ùd8?(m|<|Jaʦˈ`*"It󴠿֣ D-˒;! ȭ% Z|VfdKѣ<_t+q ثMrsI PyPRÕou[t2VU.sb4y^ &{>YU4N:^v|z˲ne$߼W=/41mǷ_%an/G;{ʋceNC'4 l5B[XP `<BjxF{OӍ5}ͅEUjUӬ[GeF+VL2%ˤEVQ{Szэ';lل0&:QH?t޸L jlmi;8׵Zm.6itmr;kU#dwԈHb Zc 7~uU+J@Lumͫ^s8O䲈"W(%T n_Ui]v`ڢpe}3@`K[װ2#cy8zt BqF(RP\਀[+ 9byMWE:ݗmߡ+UjUwjWEuiE KlWԲ۽^|ˈ[^/SaQ4Mt{eB;`:X.ee) ,ZΡ-KRɒiD+VEY;%v,Em-=#N>$Yđƣ>Fځ"EϓkT$Ƙ"Cl%98"N%C,+Ş~2 Ǚ=NpH܌\cL=6S3!彧Op7'LsӠZ&9UeZaރ7qFhE\qEܾ_P@>@ƪVU}Ζ`i>U7/Z6;PXܚNg|}'O=ã3/rfS~}?ΏďنM[nBN5n|IB+N'X[\.Ee2IJ>FTeF3[$+b<1(y>)\dSrș{),aAL@U;FC'W5:l3_, <,>ZkeZ&5YQ5,mP& I(QVb~J*3dyXP2YABmя;dY}ֈ*0A+c|_FT:Gg.,XF)iA dۀP@Y(j|CB5ȫ^!J$z-ť$_ǐɞL%pM1B Nm,g7IWq@,7 j =w5O‘{eŢf\q1LwZL;&'W9`z^TtNdL7ZwrL+Vʡ5&0l)^6 z%X? 8g򾽇`A0qݏ04r?##4.B.y$@Tl~dַݗj'WE+^G:<z~݅`j%y]vY+UjUw{1ȸ{/WY 2^ ~9O~{QL܊y{w$ ×=N?`- ~xI /mh[^fO^jwHY9FM(qhmd1QJъ[Z 4ڋ8\l5X&%ee @z0RE߿,g7؟/H[Bt1ҐNCvйB)yhVX[Ѹ": mBjW EQS;1HVP^3a@ZB (F;PVuiB4발7lGhGeihC{lл- pM;q! K<S/!h B5Az[ۙPZbZJ~72M}ZZDz)eCc_,hС}]B|@{Cޯ*$@pBju]%5 HHm9H fоz =JIjMr Jv$ HrGal^@І'ip}hw)U !߸ZժVu7[fS䜥i|'qַk+~]?g/#?>& g=??kS, oza1w~?|5?W|{+_~5оzs-lk*W}bV?n[qSU%ցԵ=p!D|;^7؛8jq0KS8׎S F=gf]HҔ}zV%iYoB–u Qƣ,+J[x[Ucpi2M(c钤x>IV9ֆ`BJW7S*dz9k6XLk_siGbBfNq itBZq̰UA]vQQǹ339Om1{Ե,4Ɋ 6S Iz%2 B~h8'e3B-L>)ɽNI)_[dH3:<4s'`?#12G?߂, $WPBy(tk]\ pxN䊙Ş=voo#׼*MR&0GDpqZ { JK1cO>Y\`|Nt,^,@Ji}8(oeB :P Kw,4%SHv<)v.E㱸r,)Z h_/iЁpB\JjV cUZժRY)C[6Ȱ1Ly|y,?{u]-|g_iOZ]?`0 y썏~ ݤ[i_ʲ/|7wQ^՝w1P;<<ȳ 3bm6U~rAa#|CrIZ;i WL\\nitijUUSyR7#M!Oƶ#h91~"m+RlU6L=j(%[䴃=qwRJ jрA5%3eQQS@q)YhGUDjQGsٓ\ \Y:hnhRFMrTE! CVkV& vE~TAd84dB ]&A4|_VŃ/wDZTdҔ&ُ$;Kf.uu:ׄ:U.2a`6Į%2pA¬';\Dd2Ck$!yڄaz>AV.V΂z J6@X&U%ND2$ͼ%ߢ{dC6PVMx$q=BWrЯ]eQ.丽0{MׁM(C5i;! ,<%`$τ&\821n5tePV cUZժR9WKVKkvܿɌ?~ _fm$ɢ:9Irm>cowoo K3|~W^/?{x ! }7s\rK)c[[7\G^V(t#6TUEتjRܸ$?&5R i5G:pbH$Äk,ʘTBQZ5aԙ{YHg(gY.ɧ{hnFt&s|r8?iB7$ dY|Vq^dUrHV@b.^0\O d턢011ZsϜ@VX\IUWh% k+k()0^ mrx Gc8r4 Y&ZB+5 Fr*C5$9hLCp_t bn1o{ Yc/VZJ^e?4$}kCzQ.S [H?ߕ钫+J2(ru-;!}8:qf Bo陁W'~$B)rbqȘ V푀dW~ےAF6v9p+ Cم4,DOу"3? 9W3E)gq3ޥrOmr5ZժVuJ4/A\u?_G?;dX_c/ƹk圝.͟G^~Ÿ/[A@~'TQ+QIh! 7@;ѮVnE89ՊZzAvrpuIQi)G70icKvl?#<95lSXekxʒ]z<<hHr:QLb>1-Y[_}6,1Ԅa1އ"C".*K1't<"MI VL:'D}:8,`HNJÃz>tFզ*ϒ% :!3Gn8'x!dxغxIn1AсPRƺZ|cP[jiO3_*?7`$\|B 4њ,L&];RoI_7ve&ڊ𸈌RIZ2Br}'m;$p~,;t2=zX:HDssdn41Fb-Zbdmч6:ӎ4ER2&RB@rG/,~J4 \>$BzPҪTE5X|_ܲGK[a,S(g;"l&9~ /7ua-spP&&eM-ET_mmZժV9V7}?Ֆoo?oky?( N Fp7'4lϯG4c IDATq>򦷼dJZKUYkEQdƯ&_eo ײ?%@j2I5aKh(J2|SFVmPagdnwHsF6˴`[aMyI U,ŋڜ>GiMAɜj{ FՍ=-DJ v"Y`˂,+iwLy  ![f"UU0/2fXC/}$Y)G?aR m-IJ{df b€O_.ot;k^' m%cڿ;b8UKQZGJXy Tmyu'/QNu H`sR=s%~ :"e:{)u亸Roʽ\-fK8 \4؃ӢظƟkf:5Ӗ}]?GE7_\֖кLI*TX@`n959c=%ڌqه1-r% iOՁ (*Ly].P~(qrV>͓B`䛴"o#'^dE@-"N/@CWIF (v nglk2VU.X~Dh2=_n/~k w_oFdms}oC??79<8O3Oo^ZWSyξn:)}^;<0Eتd}4b6LS,5NR~n^'MDr`}=f̉yBЎH+qscBӥY5Ehp1y)ʜ3dYaDYUQ9Wd"LuÈnNi<' |73)R˒Vd>!JfyI aW%qg?X,je< ɭF8QdKzkg9>FʢvP5^ak8h5xAir45sưڗ)X+5ukCڔIn {a)@v~XCuVVkhq>Z.tP3>c, R *Pi*v~6 4ൄTN'y>.p9%z|,I7@6s+a<=_ԁLGBt)Σ݃1m+E=݅;Gd 7!3{L?2WWuw΅"pUE3HCj pJ൳@IPENQw(m)NTE5x~D$V:Nw`)ש9öH-F*x>KL&Q☪*0OQ\ ʕarFyE VG.&,4YUb˒!V(S՚J{̲9k[ee2RӒ(҄(죌a<[,- (H%EV%A0kuC _gz>9G29@FC^Yx(0ȸ)Ɋ񥉾8DJPODZ١nEo U|.;ЊPpMy̽?*ӋkZq=4i<0~@VXS4PEIFKZQ 󨋒nKք?3KP4@vLZ<1 ( |%5lJ{?,rITyFeL'yƕ%(dz4=tƣB>WS5w)eu=r_uPhP( ,2XN/M[!&/Q2rXr L`z$\-蜖*Gaqp-dU %g) CFpQXE^݃;xINV59ooЗB_C ƶՈ;5Sl7NZ 8p+Ӕr=X`pn| 2Q `r af*l@P]z?88|'{!+PsD 5Zؔ\B[B'Cq7'/XժVT? kWV}ǚ ߄(S(u@{Y7E%'w[氰WUA4Mj[S` ub2[h/"+*,'/9-<Ե,ٌ,MQD#/Ρ-QFq]Z3о#iԋ%d8DM/KwJx9.)Ɨq*Ƣ+-CXJr Ch=,'\W>)7B^ZUjUKn&~0U߹&#I!/[2€,@:|_gB3R̮r؈H[-f8LAb:fNwNZud9>yV7>5x$v>}&Dp΃ rUeqkZ֒рv]i*SY5R̗WWāG{UE;m$3 4kk#*4jAՎn< %~(BƆxqa@84, eMFt-Fݽ^ 'e{.4;E]HNB<W5oqsЖ}8+NPL<@xSږ<D. oLVܗX;JI&dOn^L>1>|P{?!sgShE>1]̐fsmiA}7~dJ (Lf2Ql -xDž?#88dѸuɶj$X(R&/cy}9F;.A#(Hw+oDU`#^$g7oeܽZUjUKU&IKʲBkHh(^EQTϐg QRU* mM1% g)&~2+XV5)\x̓&ө(fsk׌'[\giu&S45q: [$)B㲶j<ߧKFǠ!]V`+%)4&I0vOR8?nE( 88@UЊB0*Eá8݊ٙ-yS$YYQi8$+Dq8]H+*m deɃ?qpX_S{v4M֒gEԧZ%K~V cUZժZmmn̥s\r峾~Uh/x^xemxOU$If)q!Y&Y.h:A-],Y.p<à6|9xp1 *df̋12'l3K25F8| ;"4G3I_Wɦ97עTG|-Hw~ [R5?~3;r;iT)C1,҇ѵ@-z+y/'$EPށ3阨*kX&%iDTm͗;O|Hm~)% h/p~%h,fɑDF9^ "5z*)a}Y|$Cm!6! 8=bIBTSnBᙎr^<h`jEϰ0 wׄ_47[QNnohP-{e9]b?~Bʢ$3%XW$Q BP `hgIڱ]LӘ4I*DIF`bkL`{.?gz`42,ْ%''G<=kNNOh{{\\/;Kh]Qz8u*hp#Bstms@xQ:Gc6nG+)ZSPcrK8"ƣ)]Q5zh4~5 x[p0Hw:eH0y`w }(gCIMA2+9ےhY/=4 k[hqV0=-BNو$}y h\F7ۊr\Ҙ%`Wʹs?%,{A([j!d*,RFF yW6jH-F_"ڼ%D ! u1H:7W~A6R2M9aS~߂Tπ@BCls4-_6݇c*{{8NNO"C6u-M5L`-ۢ `6s}}9D;͊0Έ FQznG#bc):|”xN+i:Gg-I*k'-(Dff p#kR{*MZ G`9 EZW_OtO2c=b點^Q5}g-A](v 32M q`<Src4R}y(RĚdQBC&eLF)qdX,TmM)Ҵ]=m##1,msଥ :48O,+L#|G|ӿ{l.2,Vkul2 0l7;Q¦Bсzl5dp͆+..0q4eӢbIFvi6O?=ga{x#8(Z0:0!ϙ,_MJnxnwV0 şˠn1-f'b/: y;e`R!&^4+p!Na{!M~,&|6R[#F> /K%ߖ~4g }~K]ןɆ ? Tp7ws5잋q<;CTX1lWȮHp*ۆ~'%ď+`N)e*>$l]|"0H!~ V ߃ thiu|E rw>ܚZ ?{{0quur`<ʉoDŽA@]W@Sbp`t]O84 h:Qx0Xܽ{mu&*V'ώZ׆4Ø5IQ6$!Fܾ4M kڦ! Gd k{"Pb 7dI(iڞuQ2;x2%B>OMl:)$"bL%әA*O2Ƴx5.sW m)pҶ khi8P5UWTldBR(&Њ<cqwdyƝ;늪.Ikᬀ VĻLFs8 :\\nBU i!Ɉ`J/ʰ]2\~ӛ!υ.|ݑagRK 'OWp{A[YȆe 2=8??w{8@6 F7^̡xC"J$Qvhn6"eYEM ΋v{)'*&jvi9HVȪAԼ&@w"qbN|_=\?Υaщ;Cʵ7彶B£'z^- yG@WG$c=c=aap} CZLak[i]YFyx4-uk9y@| ]Gm[|3Ic-Sz (b<oBUa2S8dqu %0  2lw;l H Vu ׺i)bu>U{w@ 5Y,r4ᚊ?o'/KHktP:OYT3Xٕ%I6a:OZfn;ưX.N+8&JSgGG9ah"=m .hqMIuKoZ1rR_By yK kJ8sꝘ㩘w`Pɐ$7a K>gr{P}&O h[셤O`5`ET{!񼶁 ߷/%{@_OtO2c=d2ٖ8GpmjLaC]RĄV-}דf9%{0ɦ4#ή9Pe'$qj!Lr:(i߷+ILЄX38} 5h=jmۆ]Y< 4uSS-m',󞓛8oȲ)o+z[Tp&)}׬%Dg)@lCKV6` &r_)J0̯4z]:tWX _3!mMQt(M!$CK6c6!XHHJ ^/diWtK!}f$[0S3eG; 5إ 6K9>]j=c= GW7hi:6F)b2ɧخe[,ۆ{N4I\Ofu!tAg]bpu3Mr@# MY)G:ΨۖxDhЪ f7OcrjE&S\]]e+B?H a4l8|K6 O"O'g}-6vHRt(x3BVS~SQ{#Cq~*1!IW_ 1jQ^7$0CHn=tkfi dsy]79ԿuNMFGm涇fK&RN>5:׭Πb4a*P̾+zIrRlZbܤ//_\ܽ-.`zG>򖟊=R]Wl GTHݖDTM~ }?aK~6 @+&Zz=S?uן4'{{ #N<6(Pw=Ub"Ed Q,ЫOOr,!^[<QL>}~d"zm0tn{EI[x=ζtm865͂mQZ3v4mOh ۗYo EhĮm1 EThpmuV+4JSJ< Dp_0 6tR6!9l) ]z,~ݑX"k/~)mTƃ!B~29<a~ 7?3Iھ]1+հA@:%O͍[Y,QD(h|4b2P%/6 =LI 25mX_JQ;?/Y2T yg_Js@z.\< ss1x܇W ZLbjDd&TJT<_Dސm*l~ xvF2nޗcIcx.Ǐxw0~(RZ}DANR_l3C!h#`kŧB/E~59$u o'%=K)a#?@+1-r)ayžd{7'B@cvuOQđ!RV]‘1Ů_޳\ɳ{K\3Nnh1aH$I"IF$'Bb*<&*$Au툌x(6*(+P|G](88::9W%)(蛊 nƘ('|F n8W S4>d!Q&ƶ-EՒOQTUSs0㚚!: 5m+xL m͊rAA@heUޥڦѴWCܵ4YןJdh(8z")Lc<"x-F(·!/l Fע[ȓ_B=HB|`0=GW;"x14[FpVo^@2{Bs3 w`3K)%iDfs(yg">tm1`B8_NYad^"# /ȹ۝v+Izsl^H1K|͕׭򼪔A9}<ɟA(ø p^CwG"qcG \ ff Fj~C63 ~;=8-m+Y\i_b{!d&cs.~Zn!)Qa&9KF?H2{+^ B*\5W]_ #9|Nn 𷤳$9פS(>O{$C&׭<߁ b7 ؓ=c=qx|L);IBwk{"07c2α}k)v[l*ƣ *L;X 8"3ڦv}_Bi(g,MRC4 AP$i-:,:i郈AEEkE+bņ%[a­w JaInXmJyAͶą MgG*.V=>ݾC\o\9}(12CxC8e|p[Oޡs>SɄpr㔢(`3^&֑͆)A+گS'$WexжPȠ+Зb+Xt.Os'&`RWWi]>ZɕDp+m^?=d1y ۗԫl30sAS(z~^;!j8޷Od)(/ BRf9x,%}nA=UEcBf]'IPLJX^H HJ$S?i6B!j.5Fdne=c=cffbÄ@غDŽCVZń0o}(cq񚋋j;O#l .d@-۠S hB!x\5D'B0_˵;>"39ח= }Fgr !/ ro+񥔯DrOw$5 HO͹xN?A![__9׈=c=cohxAOY|OJE4䓔PkҬVK1)Xj1S7500IB:jYvxcpByk=āojLa $M|&CIk4TyL]lJ%đ7+kk"ElWcn*fw謣m,Mk&8QT,^]e)EQa4]|N$d1&J9=9!]Ay|B]UMbyEZٞÛܿ{ JQw4atcBÑEW =AZ߄D'CZ< CsO WpT=!U`յ}Igz\?Bv#PB~C޻P d~dex)(6,ϠBZFdz ۟IC|(M.~ E4m1MIґ,'i.D& 7g+!={?!%^{\PFI׭r'PJHH'Nxs٬'f%w$ K8009 г㛉x8/pVeo9U ؓ=c=Q-a`CC5; PJXqJ19<]iȎ^[/2p},@,BDhzG 6Jcw)1Q4$9Є#J6& 1&:"ed}OCLj\N IDAT_]TR+>@T6ͦ;x#**r &0D?ęl2G8NAHF(p"4yB4 Y/ ׵uu53,%5+=EUlL&QD,N$:U)y¯hfS?x ŘF3P<w X|&qv04]7"m* Sy/DDzd5lY3S{A"_> }[*a0\R"?j ݕeO'0ۿ+!2rm2H^W] Hr1k_&H$[19݁4{;= țsR6N& 3v} א=C(B45=!u:yG( ȭH4Z7DUD$c=c=aasny{#/6&28E=(&C&yJ31*}OQ:G*ĵAZtq}GוdiV;-HMhla@ӊmM@8(?ÚS: ɔ0Pf%X$Oc<»vw=`txI!Ct y弣%Weҵt:ev]@yB6Kt$Lwv8(,/:i{8c2VD1"Surx4nBs)is4$ "j뚦*PxV(+ڮm{RM!ڡ'k0)OXJ蒩 t! ?X< -} '~!C+1h9,_/eSP/l*e!>~VC]8ȱؼw\4$`$K%31;ߓ8ٮ<독P5"Zz)3![1Fw+$wtq1"%\JML eZ6p$k5p}%`9τt Z\f1Dz`,[+/K1rwe|\ds T&߃>/ҷ2ȷ'{{ ƄhI(l/cPUɔ, jd(k TNsF:"H/VXSAYG\K[eI E@mWI J ^45w9Oɘ]ںeҶ5]MY:6vcV#yJY3먛mbk=_r^2Ŋ$8q( CNP#pi(^СC?i}oi[~1$5/d99>J EQ@dOe{/S23譐葐$Rb%fBݐ܄ȼU\+Ƿؽ 弳2o_Hrz D6oar|1V\bH$M]6WrL_ʹĵ_ VIzF0 N$JK`}?75kȾw5L6HIH;@dL׀=c=co @,qhM'VãM(Ҿi Bm$N@0::LsF֢uhLBģ+Ey x+)ʒmYCCz>&*BaiҮփrL:'b={vMGD\ $ssܺuLe("I8{KXkͦgEK#:!}qti>mKtx4Y~=p.1Nŗ2bV"wR2;'fD IT*%|Wx( Z~ŕHH۲Eix`ȒKxr|<>^S)4-w KTd*I c ]\K'{ +p?my"x*ǝcΗfwG-s/خ%B=ɄnMMu=mS.jֻ-V߸+"aH5?9C'dHXg4JCa6ˈ^fQ,ۆ8'DY O&Ru!9pK&l? Ib|CR$$$)C RR`|%B8QIf\T 0boİl~&+Iυ(ՅȳLBұGu5| > x_1|W } 0CX> o`@ ! RIʏ-^mh6M[~Goj(b,; ϐ7Χ_^_ݰFȋN>ݓ=c=o#C5Ae)mS0V+#kKPW5JI;u/{oeYp橪Nn%f0667kEĹx66Ɔ$vl  #yk>9=?*g^U]g}}Xblj7*8i" Ү9^Hʎa[8X'MzQJh|X1~ @*"Jɺֵ}>ri hԼ>#zv!Ø^o@JضY[_ge"^0QSTÐ0\L&M:ae+vR Er"\t&C>A Q'h6bY6e- C<'#z#(h8C>c]tMX:r}rR*0 *NQnw /!rЅt,gKnwRG!s~Lq}Eb(TJ7DZk =Lx55-@'cOV{ @.I:8ͤЯCqMu5B Qsl#㰱D24-=HqV=i^O>: =ef!a;zvNV\"̾BIC3rHkVǔXЕ ̷ @3$.vxĉ 000000xxץͨIJb0`hef8㘔"B(±ҙ f" 9qmt6K&Kqy?HLprcp݌z}@#NKm1<11v .^\dxxtr9<'Rq ’ƙ:_ϫ`{N~z]d%jj`lyvX#YNhBdf[ ]0 Vcfd Ja9k`D n>iuxIv Թ/u[knLoq4qsxޟ$q4a" aWLBwFp򼺉Dq Ȃ;%ѸT笊|{Fr#rq,VMZ0$42f9p -q /YS2xvaHϋ- AEQHFɘr0Ķ,Rn8kE;;49۶e< &D:!eaB $.N,u8!m۲ eF$d&Ll*Mq*|R(*AmKo!E!|˶8"$uY!l7rGdRYE[A{"2{V&v:.nʥZ2 (t:$GZ}5(uV*P3cPߧ $t37'ډ*[HIzHo&6̩ݮ#o mUZ-IJ+QRjvue&-X-J.%mtTk#,28C${b_`ȃc*k JN))W`|mohk WڦDrpҖ˗>0ue>f$RBu$6KIWɇP)i,A0 %(Co99dUwXۑrqJ¦D;=0$yF6b6~.a>m% @qhB4cED[G;`[D-YJAz蒘NJl( DǠ$n aJƸb8&c<6ڶ~,%[6a0HtmuS]! | S:ME nDŽQDEa`[XS aF1B|^~O: HRxՑ4 7Xye'5O K`mAܽ# C3ָuw$nRC2 oڮk9\?8g$-u*Ơ V$j*8n$8.Dҙ"0$Iޢk_)\sPks d,kIE` J: Uu $b. C:ק#R yubOA i=%+XE6qJx;j߆8 #0z]>}hw -BtExPs)ͤr ~_\3 H tP/Ax= mkE>d8,|I!iRҳ08 `J& +{ `Pj%>a}^VVF! OrKD)@1(\܋z &iQ9?v'nY'u;1X^JjH#gڲy.VNk׊TJE;nQaVϩ3ߣ~>tAEs"NOX7[ԇyʝ"/=t9I6N? сßa```, 䧞%|xw2 *pרa4TZ@* Q A  rjMٮ}NڧabƟs<(NC^YO;2 MN I= p.oBk-e"8TVr` Gʴ\g295Ű&X:Ö{tLg]nI_9 tsw 6wAs"{TZfw&uP!݋m"q`x+,?!q}~NNx zpGԕA$-h + ;]rzaHՈtEp'.(Y02!uWCګ;yW$0dgڞϨ :.(,"nR] yu< e*CCcOخ$Cd{J&NiBp d`hFډנֲ?8VsQE{/md4`bQI+\mһq>y3`=uN2*|:'e@-'0eJ$ϗ٭c׫t!JA0NF # {o@J _Nk\nd,-J寧.owl:> T;i( KKޢFx ȄaSEv4N^Ck>a[~)9vT#PkO)WU:L [cٱJ0WA:ORުqh@z;;seMD_RV`AD^sZcټ4aa#2qK4ġRbyaRLْ@v(\vNAЖ&"肷E 9(uGë`DކCHL IDATIrzF],(d.5&[(q aJ^GU @;}{a```````p!PiV\2Bd˞6U4Bү q au K̝0EPHD٭(-{`Uu5rf5h''*IZghzF)|/UјS4rAj'DARgD R (lbw;j@W@:+8XP= GKnZQgB.uMm3Rzi=oN`Ud#܄{{uߝE +!W朴!o-OJΨChP){bkg4^3 z JZ[k*wvIadK(LHjUa[U{-nXUtQ:.42{oʕi~b)0WFED`hVvSJ6ؐ[" 3(\'6GxUH DEhvA[ᄎ SJQ|^Md ]scYn]z̄:C u% ==Gt$#Lܬtl{j*òD@-i>+ᾈur3PVԔF2>e=!W#u{5w5{rAݕdQ σ*UlC#0<.wA)ԅ<vA ByFBz7`C栊E-+!?+'e[ޢ5Y^^"1G~w @Fir8!KrLAtDɚ7]X,S"7c"IqlE5蝄4 PY}AuJ[xHAzNZC@qD޺]#P NK2HD k7:zWKQ 7]"1fqԅda```````p5WvUNLv:T~A&tj, i(a)ubu@٦N_84~Gz7u ijDT`^Q9i-4[HăG$"? :*a0Bz/MCe\ź(Yz:KJeh-AalKM["ǑI0MNs +·8,%c:βJCjL$4KZOoEzӳr vYZҴ:ݦ>Σ+lZzf"q2kpmsl````````9pfOHOh<@Q90a%.}wCc7թӐ!RR L.ɥ ;.Tf w-dw .!@~ urCrF8 Ǡ"V~_hѦ~C׎BL"Nع 9UM@yX02t3RrXʔ0-ʴƟv7$#=5RGv߃BUmq9\pv]cM)OC$!=!QArmꖴϨ3"akFFqm Seu ? Bv2"e7+jHBfnH j;cvAv7BI-BmYW#WV'@P*3Rg#4Z*0ufGEvyLCVPE]c׽PS>FKoW]ɠh42E$g&/@yTW1&-{rY(_(\~d;XD*@i4D%- wlu|Ω`Қ,=-݌\Mk`rCЁBnw0{oh$-8{zrtK@PģJcz:]Q_y` NSd\mSdn'L= IiƶTxڎQN\*uY֒Hs՘NQWg!W֎z& q]TTFNIc*v4aq7!5ut(d*r8qԡkaf":a W8lA/+ ̸BED<';)SKhޛ zDU(UsnוYr)V2IBpw@i/PbY >LC|w"-c:!\?_Qg```````p!Jp={vˣzU;Tw704) ބƁ[Ng;}Nv“" TFkhHRG δ 0,/2i'WwH^ $<(j_44jG-)-pPfMֽa㼊ICy:.lu.(_<kI䣵!”>h4 QH_3~O(랗A8 +Vܡ%}N DIB߼b囿 _ya+5}e%[ަ|E 00000000rڡw3I?h(WGTn˂nC~Bu T,?Y9>qٮttAiƂ64Z>+u ʉkޗ> VQ1n"@kHk0@AVcavJZI/un&\=נwQkITg[Mܬ*vz^V` @gFkĎ#(oU*(dЁ^_UNVò /$-9E*-9HŞ߸.!/+M20000000i&3'#r9uY]BnS':cdƠ|M"OAwY;Q[DcblnvWͰl`56ݐun'u߃4Tj>{ܭ̈85w ޲~W#aS -A&AxfL$Ahԁi,AD(V^HqD˅+=vEЛ"h=qQ6ѮAGuMn7%ގUBo:=][VzE} 7Yׁ+`pӾ`HՇh:CpQ&l-˒3J۴iKi :o4Y)NYyYA"*+IXDgA]V .$֕Ȩ4 uul K(VR)럆:>=Z)с#*ڊ!J[Y}cN/CҽOdAb了'aMaWVЃ~uWpd{K\uM@NFhUgrP[8*ĽUG& EŽe%vcd*%R3h rrKr`R8,p-ܢbЁ-`v{Mݪ5 vbҰvfj,1v:xvZp'aSN:'5ik?I.'%{ʴX+}DJ"Va *vBiơ6JD;"v,I0"4'E%>dh,]ކ3i>ѭRb[ ST>ɌYxpX0 Y59 k\baJ`cYb\YZyplu=:kJ_<}PQ-Ig`JpHWU, /BtQ;n^WEjm7AKgauJcjC,+:E(e]o,ک(Ba "Sq^ܧ" "J/ڃҎx@lYNW#tx'&z|[6#rʖ3!l9g"/,@nQ^b[ۻ<99 S=t5!V@#Xђ3mIt76d\mH}5﯂$F]ּjsڱ] 4Bxʚbr 81l7Y)Qh2 SU{ j`4 XpkШ8NUEt&nU)ʸR]0 YfUH Pg<kTG^%Ѷ_Kl| P8 ]3S[ ʩ:*8KDNב|=PQ-kQڧsTnr)brgNgԕ^3)!7,B0IljC7XP5$jC$n[vCvJ!?rr̉йSYVvЇVmP4un ZML5k"$ȉJll5˞V^D~Z$ŲUt!I5/&#F畋.k-E;u@]qdCtXʐ,5u2I7'XTò`h\XFe9x skNR"cX"ͳd"AhU>Y ۮ(7Zw@zڙ<"Fa yBn(7CQwW:1$7  nVDb?H1s*U甥`Yl@gw 'Uϣ̆֏+;kki(Uvd_'UŸ.Tgq(lN{BVݣ· `)#2U+*WrHׂ%s'qd(;aDfw/z Z[x` A-IlE=7ۅ*Q6%"/x s%Ij* I3*ܓJA+8뉌IlҤ{D :4@-(0"/|E77dY8yꞅLdi7U`:*rĖv]d i8I1t^r ڧ!CĦQ𝛂FZg%BbRGohTv565uljZ1h>sDSԃ'fv4f"a gUƠ: s@mQ*R=D88']I^+xgUʌ~qU24QAbNN"z2EvQ"yk!uCò3\*VLƻ`Pq"!4dHՆ9Jk>Qmgr0߀lYvŪ 8k" 螑sUyJϏ;Rڮ.T@/li+ :_2רⷤCF ʡ82 6+j4Wa1%~>h'zEeQ4alh]j(]S*\Ƅ *UXeʈ BSDAa(|/zQ{V%Z/E:8{@mt2 Jr%cKn^(TxX1١ױȘȔWV]+";vBⶽ&nڹ/9 PE8MXvГ㨛R,I;fW[:6">? FrTiR _BaJZQuW. E_!"!u,Zs?$) i|޼Ԡn,tHg`= ^# `6 ޚej*ww:~p oKdg{Bkd |; 00000000`@zG]ZwF!w!"X}R]l:0Z*;afvwf|Xܭ :6[(9e[%Z. ;^b{n.aְr^]ښ$,ӘPPUi}ud,%ǨAOڑ{[ R^[0 F+,0BC&q^? BDA_]~;AA}N ʶ:PFK#N\b?U7lvp)[D../mBr\l&ÌK\u =$vx@nDQ\a r4hǿ]4TwjZ8fҮX>/bDjQGTw.ȁdi zmxR#CPq޻ 2QѮ8ʔE @27iB4rb&űdTlrۤCQ12ۅ:-5uU5H)Adž Į"I,1XOyesX#' ҵ49 kD_n TGݙ8ʝ:k@(ò n}1+93"340$[Yu2E>lNI04q_XMKcAİpD!A%*{Tt׎BVVwJ`Q}[$>v Y_T!ܚ8DN 3)3h Sa6 seqayȍk<;h!<,{ )X%tkP'"dҮEତ;dJn7wY!t^w\D!],׹܅gG*Xr6rJOޓ)\ϊC(3I ?@C7 ŜlwT;Tڧѫ@Wٴo!Wt: ^W٩'#BgM5)0r]X7Q#0 g1)%Q朊O%bcԙ*FID<7 ;`p,qD*Hǖf5FGrcy6G=a4W# h׿Ȓ6JH.!%}8UTcA]]\gZIQF %N5e[Lߤ8.}~{bFhy*,Y ]&HY蝇R¤vDȦ A|bE$ WP9gَPƽ@<pf!\"ht\Z*a6U0TngSr+"=שC9JHk`OA:0V5!D59w#ZNOaC܏t5"W 00000000JjDQWQtS )T+Ru A?Lp%{!2]w.HMF&`FREy!,(M6|z)HU_%7q~ Я3X;in%@۔ R_s'^Rzf_niH5S,^&j4'S7BQ4ˁ WƟgG$RoCly\TVu,U; Evi-;3clN%a```````p5JKDH`W؝JK(l`t?t5SV hKИPaD32݊#&d5w;".y'XTۮ'aα~Q?GPAH'0{构 TpP͓vNEx 1S&}Y xTiך}hխ V'QvG[T,(40RXI "}c>4hR[d$:yhnȌkH_e f;$pp(jDIw%!LvJ%1Z)o"&jDzX@؂\1INCy  O^NnDFu a*$WuK@R $}]XҸU+׃|;VG܎ q91 Kg%NoM2/:v& d)f" "; s*WШH$yX;.xPڦ > K PyB;ueH轱eWtp*Áܡf^\)I %=xTv+,nHj-?r\O&ri  @~= 000000002.@o`}^"Ɯnl xOs6v vݘ`l3* a9.n]*K$c"ǡvAĦ K_>#;}P[EdrvaJ.E`*3C@YŽ]k'G&Ƴuh.)$LC+xmxNϡ0*,,af*98,g++ %PV &fu=woRAŲE64_Q_fDĭ |ge=Uz.RկCt-"=CPD=brŒƬ$ٻ8S['*faƥ VkHD~=嘳_~Ƣyx7~MKٯSg~O^/<O瑯>ڼ'ɢ9@i1p߸nǾ}_:S=vgȣɥ%Hsz1M.>c:,yzpg>)_戽 C2 g,6w>?˿q)gd|K|S?0`HU~p ϼ;6ǎ_wz'w|+^ç?M>^/J>|N݊/}Kq'<# 00000000J{Gyյt wC'F~Ϳ\l| =wqߍǞ<# 00000000Jʋ_r7|A/`-!=/y/9|/9|x䉓n._o{_[xL199;wd=<_ 2%|+^c>_yr^xqa9Μ>?Dz'oy9y/?7>8?˯گ?O-ܾz^:?/ o;_pym 00000000JATbjz?U~%kk"lGԃOoٻ7O7$ħx3_|sշY<|^7÷Ͻc?Mo'Nr)\soO|c|>ŏ 7Vy+_!O#O%"/?9Y }uS'=~+}(۶255yGIRN}[n\.;.9t s?ϙgs [z7W}nh_㉯!2X_[gzfxkC__F>eu֛ٳw7ӓ,_\;0Gv#?{ٶmx'>"fmy~,oxoZ9s R^#ò,lۺ|G?|?O|??Hɤ7>xq׋p;nR?r?|+/'>sc0 VT*+^ >'p(oP,>)ı='ٵ{'gu!o{ko>9m}6| |s=^3k?~zd2|'"lyƂ;NOu'?||sz s/x}~xK_|ՕUe! 00000000JiwHaRUlYWvwOx_}䱯?;nѯ<_Nf1Ξ=G!s^Oҗwcu7+O!gg4o9x=rK_ Ͻ^b,,2L? O=q֟~|#>̖~wX^Z&N?`xd7/P*H/;wl?oٟmoe~][ᗉٵk|:{~xA\&UAW5~Jr?oos ?8L"mf<#0W/oyB-޼_Uw}?W(5000~} b/!?yK~}?|/z|?x{9s,;qnz~M?4$2LC -ODLqu]\}N|0 &"Ư7v-:^;>﷼}_tͼW0$~:W57|n9p}~_:!Pq=6k,~+<}* 00000000x> N?Ρk&%}./ڽ6KytnK ߽ cl C2 m6j4 08r⳴BAw`E?nzHH5tCH,(((v‹8Tp(BP̼>fwSȒ2 y<;Mlؖ _+ N'DH{gԪ^{]z\ .^ nԹjІf Z^$[d(Ѥ#dffҰ~#Z7kKpPpm:sCG 22Wr B(;4c:)~X %MHΦE4eR-0{+P޺ "8|]б}?=)%f1,Ǩ( _HRkR5.vC4[RIP(e ł.{ֺ<]H $57+kko[bY1ɱyDHKK%%5-"nfaBǮ۰m؝|?v nC:6\u†:[%%5Բ6?+s=sBQ1E I:~GcR沯 @j'CJɋ^Ͼ f㪫ߦ[n6^:6 ]PW: ]9{%}BJ4|=&Rp#qH44m_'⪐ EŊj%Z̗f̺Y+>xC>z#4?x?q-}{;<}nk7+Wcp/7_ONN.ڴDGӣJ\,SO3{|oͷF4:tLdO$B(e|U)pQy_9qs[bH[ |0֯z**EUjոL]gaZN?Uqfmі\[yd\>Xu,c1F|uvSg܆F0aDڹO>^Cd<;vz8Hȍ,< {ɓ_+V0zh˦@/ok-iVNFZZ!!DVjҤi>s֯J޷n3|ԨYiOg׎]GD0ed:_#nƁC{[>[u( Ey,V6a4GItMXHVν)qt/{&왳f~_Ю};gkkhԸ!4OƙjPSv-IOϠfackeV=o6W=oHuU)NB(j Gpp0/M6e׬3w\YFU=4}FAs2ϟr4egg㏳aڵ+7_*imI<t2_{P900_Y /7M1s,4m?_}_~ͨF BK OBQ_!'7d]6CBu̢(h; ⬗3n浆1BRSR FJr ͚'-'/g꯸m<0r;ʋE㉯ϖ[}Ʒb l{K5[R>z +?]ٳZ5/L-4] BQw~B;7%%u/\@\\F>ZQQZ>̒%K={63g`ƍmۖf͚/ޘ"pmI<t2"""X#}+_sNr9[|K^^]99dgeJ !4$@iddad=lQ""v, )$Gm۷w?ϝ[n$%3m׆C枻E4Ν=/GΈ9|0O<1c]o0Li/0s OٵGV}aaq:o.\ģ>jR(LnѢO?5I)yG]6ӧOGIfAx,cyl  1q1gl6WYyqիǴiHII~?g;^y{1vےy m5;S4:uD.>tsVsyH̘]h3#!!h8BS(+ukDDqAϞ=vグhV͡JmӚL(0o6rQz'yvx^">>999tԽHs%Ӡa];wN@J\=fǎhFǎٺջk׮dffnݺ&M.]yH[ |:GE4֫KZjDV̗8զօ|-[Frr2UxZX-VrMU(.jתw۶ҬUAAf= ɌA&>~"0O=O=@R1o$/yѼI=?^{ҰQylٴujӠa9Jꑕw[K.{vX4 kV!YCUaƬpmhب!o~vV6}V[*CP{k֭[gjtg4^zѦMv łMkIꪀ9}8~,u<5)wDn~lr$pÍd bJkh}9(P{.g/"`۰Z-EpPW/sHGat.ߩ]uҸ)ıIIOIK~Ϳ])!Yt+HtBH4Qkh F.ΰŰB U;uuį!#q QqBqԐ$*U 0imj4j'@thQg+Jk%ZQtP(ҭu:yv0"B#Z+{ܽ/ ݝ W`ƹŻKJ-߹…p{F8 )ϚN(aJXp8Rr𚙓ITdet;wKgoA"HW%U]atYz# M83BsVՒ߱¨48/QI0*B O{hJEH+N+JkuIVd(.&4)$T(cj)]!Hٌ񥮹Kpww/.x= &(}gѽ.YIa`-_ѐf> -'!dd{C)É2Z+V oܹ飹MCqg#F˩qQp# )h2_ ?NtxS驓<:Zr-JkZipEG9 )KݏcIxvY[Z[C!aN44Wktw]y<6(nymnd~[g6;Rj5}#Rً⩡+th܇+`djhi 1pqM˟.VgMY~OmU\8tq;դ@w䏟 ZiVZD&\]UP(Jۑܑn=F9[Xм '^qQ Wrǘbcp']8KBͫ04KX\9Fڟ~R tf|zZHGό{nwr&cڛoH^)3>ctK4O|B >t6ҮVZ+G@IW*P(%F GWYYv7ivq40 ͸tPfηÞtIviNf)FAgahӌ#`<}4kTQx9Od.8 vE%Fjfhz? ,q !g׻^iz;{h=_nu-TƔJkҺZ_b:P(%FH#ubvf{d~*[tRd4O2235j4 / 22e#9cw !\1rox9ht%<[( 4|V,ɓU0^qpMta49 gsW;%^y!yANZi6"VZ{FB7tRr2 Eqp::yXD]qy 1|^hzF5BDy<)1yHivKZQP(J^yos 232p>3ڣ?otИ=EV,_AXx8K}Ho~&OBJJ H\\\rʫEb~}/\.@Ff&[ M5vǭDFFէw_|s7j W|l%,< 4>WHdygmazHOO[jb ҢEs|59v=0iDbb}h ?ۯ>Hw snX-Z6hFL<11ٽis,|A7,boNxD8=zg8˷֦͎O^YZ?Oעks|V{ /$3~3n֎(Ÿgǚw~7OznݻЈqOX,Uз~t$aa6W>_o.X?}Gґ$*EUbܳc]uضS_`Wl޸_'.cǶ\ Rc|#zŋ ';P4>1ODP(J{+n|1 c0ݎu3=X߬Z9azZHKM3&3V]L|v"όkua֌,ϏGs2+^΄FاWPZU*TZ|OgV!K^WHA)};x 79޹}'0[vl&22"66JBpC8lNXD;~ӣCD dϟG|;srE-VZ;xF]C1Oócչ3i$&MxŠHOK'##Ɛ8^*@'}kݨIcN];}#iӮ Ǎk7x8e)3v]'%9_}u_1s,xt ޚ/Ư+_ 72$vL$%9 eVN-翾o|˒o4Mh⡵]H v]'3+?KaWyx}\}QZFzz:CǑqxnD4޻펭3zkhаŽ BQb|pJiErk?j֮WkDFWMVetHJJ +a7wDBdt$v_#S'O1ւpaXff&V&;+ÇpIޟI+wԫWFRQԭF4lL=ؿoM7ER ؙ_DJG^p0m?L<0L:;0~DZm=#3h({e&mnS4cڒVqMANݥҺ8u6=NLLetFzjѕuaDD60z|#_^>Ms`tFjj{w<1Q@]~E8 vt=5Lt ?E붭KT8ό"c{@ELl),^nCY G̙Sq`~6kb~#u; л_/O[(Yuq-}XdY@PNB(1~KIlHdd6 yS'OѺm+z58_mH&H5pOzQOlٴonQ36aa]DzH,l0CQVr|,^O YSG5fzl$_nѢe t!Rɒ1ᆛgҴi] ӡ{4lܐ^{yvV%S_Iy8} iV]kbaR>Ah] ,[ _\sW Sc:O}) 6 t;?`IMIeoh֢Y+͚'j*t!شa37vrHqqU8{ 4Dw;Kޢn4IWXZEТ{E%KI,&qu^FMs9Ν;Gnn.Y{3߬wƯ~߭<tg9 !Չ%Tpi>[ڴ H|P(%FHKvf:Оh|DR:v68w6B~nύ{w?~ tW_ӎ*ժ]?ҫOKky-_t_Ŭnۊ=vZVwm}NNv#O>:R  ;O}*C(ytɳbEV۵KNL8| Mn~.i$٭ ¥ԺZ?#{?`ccYnۃNU<(?a#"`ӕqmxɑcrѺy%IFz׬{]9u[KVi<UC; q%#:܏ZI6z!<4 {v?qM ޷$HZ4ҡq캯#.j]>x9y=U.WP(J M_oWƉ'4OPz5Snך=?J\,u[DzuxEu0Hw6s2Hty7 <"V[vz>J6uaeB" BH3 xvz uaǶ]Ԯ[a녾xע Vr.*b 5zɢoahFʕ!lݒяeȰH)s@o-xvZu,R˵4oٌ끃QQL8FN9ο ~#}_~Fnq;Οٹ}MH:q:oyfx&'C۾ABruQo0?Dq\ = e׏[:?3[53SSS/хNvZqO$_Heۖdegq ts؟v7jPՂƑ#Gх_"JwYcS~3s<%isuk>ʺӳύg@o-lAH1w?"3+]عpg:'z=8{/gfeU,})G+7Z+PP(%ka.3"j|U?8Ģ7⦛oI 8nBXXc"'NS8{1?rM7` L9ٹTτ dﻶ(K+"YisukV+QHu3/xN{]c 9n2g\oBHvt o/]DLl ;ϙϔ3̚6]gܤ1\S6ƺإҺTJ6-2yrrsY2v!ueBxϸcxvDzI.)X]:ݿ~E;90YZ⚇]9'$$qܯ'пPN3L{nϞ'Ro?HV{2w@ ;^㥛YrpQzvCxxM5Ei^"j$//_buvY]ʅua O~ :]goiӄ&e I|L ?@Nq&ʧ9s4h8bS1k0*|URcI}D-Jی+ yGzJKҺPZE8/-7;~<=9Y|m3];Dpp06T= s2Md8C ݽsiZnAXx9J#K* X80K}* Bi]z(Khp`, FBXV< d(ci-ŹeM}n`7[ IsE0+E1\vJCi]zAĖ6M 0i:}ؘ8VE׍&P(%F] ыaF뻰a&n՝0]}2t]/v,|: (KuQaeH(Ν}jb֔RNB(1FP|vns5)൞Ci8֥Һ(L}>FY[ ].VkdjzSNB(12bַa!a!p~IS_uPZJң|ds[^6{DGWuvXAXV4Ld(.#Վ M 'זfx[T@pqR iiTu)X̠J*~+ҺPZi]Qy.Si0R5-m,tNpPr2{Pᛠ *Eq`+V H)m:Ucz6ǽ۩NM"#*b ,228}$W@taցAi]z(Kh]Q #33, AAVBCAPAV4d(. z?AAADGS'QI*7TDX"ã rkql{4xEZZ~+J.=֥GaZWd'FHanWX-V, ؈(la3:]r{]XtE$ۖK^Y[}W=tҺPZJҥ"IV+V\=EY}P;ܿ4hEM) |u顴.=֥*O 4T( Eqˍ w?ӡP( BP(lXIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/tx-with-template.png0000664000175000017500000155115513203343610024140 0ustar jomajomaPNG  IHDR]sBIT|dtEXtSoftwaregnome-screenshot> IDATxwE_OawDɠ9띯YQ y3 g8 Y@r^6];f xNwW3U[e#GdʕmB!Bb&6K6U짰\<@h U$݊W.gکЉp`Z4B!Bтn7gq@0&[a(eh+o#^I|tDEEp8&J) è4M (0MҤz%T8:85| JS_?2RG{s0ZځM9Bez\ezl)q`~{|v;N3/XTJ+-H%e?T#B{SS jBleP(KѬ?p0 0|baX:p]*d0 S '22͆R ݎjj uX,oFlsX,(B!qX,|ZO7  S f<RSSCnC c͚5|4g.ٮh LR>_.ݺ[UiGGbU>Fq IQMdd$N3K-B!Saa!x6@P0 {tؑh~{<mFii)1jWujc G;g#VPv'ڲV"##(8nP%>}&YDlHFT㉉ -$B!B2pPZ1PJxx<_bĈ7.TxŊ|s=QXX§u4hiZd,3.O/>89E GTvgBh x\ٸs)/RC\\5AD1p?cLm6[YtK$"voۇ%B!BxYk'޺늀[**2?SO=?c„ #40-UB2d?#ׯ_믿&335kУGFijzMIRի--- -PV!:pXh϶<S#Wn:>aP&EeyKUW.Ey\?g޼00~b5%@2L`DG@x]|q=k dei8tNjD'P wSzB!B5]1MoU tL#i`H `ԨQp ̚5kײvZ_رc)))2XW:'n>TĻzhVNƃaYu2$A:FT>5n?91P1"pR~~/+{s$QbF@Ѷll3iL:I ؼ&@Qle&?6{ lD*XO_D,wSȈB!HԔA`n&0 UUU&w~-֭ ҥ 'pkT~O:Ӕ:R==zٳ]oքlLV^GŧĀ >w-)bfT8bQ;G5Mú%͓7&:GIM`DWRXʢ=d+gp̷S"w)½<|q;:ϫL5B!B?wm0,63t0T%+V 33FfԨQk+eb|֑S'&a&'OC… ={vhĻv1`u Beqi gE3aC6{1Ua2/;}80 zf-f<:L b??vUy{ [QTTDddLB!BW9 ƮxL][j*^|E֯_OϞ=ҥ 999lڴg}iӦѻwo @UlԸ>{,ZN`Æ cĈC)ņ  _~}>i%$}0+_SK+zBD]=^YΫYUM5~@ Ͽs۹ tԁc~Ϊ,7td1/<YNz:gՓSٶe/݌,?Qʎ4 ƾ9QkB!B2]Vϛj$ަj}wdeeѽ{wJƏϲexo!##"#SG  ==:ٓ@ &X֭c֭5իWux ! LbjMl43Pv|Y6};D1k:q[$=>j`A޺rHv;f!,ƯkE15+%^ 'w%%wl P.]Hƫ,5Mb_^~,KB!B!QmRP9]9l&7pCeù6m(SUS0ꪫ .4Zuw^L?Mbw*P0 ^/eeer饗vUѣ\s x7ٛ>w4Y3'^x͆աPno8SLS+^/#t!B!B#QS\Of}PdF_p4W)Y+]cv[FaAeŸ\.nEbJ6-ͭq,@?B|yyyh[!B!vV'hX&֏TރG!B!DΆW8"(((hB!B@rr2N-sB!B$B!Bт$B!B!ZP%rwkjB!bBmCwƕ[FL!L:O\=QZ#}u#|8' `zػ3\gW i, S,a??^?/d=1oB!BCQP1 JA˞Q%t^l*x OLG:ؗ>g6g{ox ,͢yLpW5'tJ5g<_0>%]xv|Oh8qӤn8=`]:8Rvu1$YMs"R{̘Yۡqwf?/I3/_.D|㌼UcB!x2w.n]/ 4|*[sw7 N5||k4o`z6K)qtuhr@ `ӵ6}YÜfFoU];~ coT*ySld:7(ab7|\V}/v͗ϼYVĤa餦ƴPҭX;^N v3x]D ͐,yA5B!d횵f-+Wl`E:7/뙿NwP 7y.DU۵R;^s:_z|7o+t2e<~wr&=j.WxL^~I^7<,xn1'nM`1tv m7jA߷ 7avWm7 2g_wMcݗ O=u5VB!BqkS=ڤ<ț7.[,߅AbhCP\Lfɷ򒻯pk iHe=O:گ3hґEmvQ3Qukbß1;\y]\10柵]\ @/KᒷS) YhB!H&S[4@Pe̘n-Dwmkmi32>wp&aRCZk#z!7w'@db,vM".IZ(/{H5愉=st'X+;sC#vYルu30nMٟ(v^`xeQ]IXZ`a8m<~>zn:;h VB!BWwcl]8ڳ8:J~#8|HuZ",F^ %i,{~ۋ$DuSK{ռ*g5dnnfK㔩Wql Y=\w͡o-v=|#{Ee+q9֙<$$ 5ذde+xˉ4N!oly[m:v,(:}g|kV[!B!+ Pw}ۊ(ܱe/]MAAA[f;fS0A>pZnyCB!BTINN;w2gfΜ ňB!Bqi3{m!AJ!B!'#B!B!D [!B!hAx !B!-Ho!B!I-B!B IB!BĔR/{n5bjQQtJDjT4MkpB!BMsr((,`$'%FL7!B!8\5xFL">.~}fIB!BFoMRb>5//f̘1T4MB!B!ڟFoMPJafkij_LczG`x-=6_^p&)]!w.O7i=[_v&O:xJJRXXHll,S& [NFB!B&xלj^Uoî\ a(#S1./331uoeătw*}᧏$9"-u׈i8N&M:8RDG0)DDD-ox !B!hQMLr?Gs_m7\MC<'\s}cA)7d[bM:~ bu`i?&M<4&OBTTtǚ)#B!B!ZTF#4-@ARlX 8)])Pу"q%ZWO2`aUf4#oy005G0(o)A*Gks8x`aW2 CV5B!BѢM5MC)K?41նҹpyqCK*w5ˣ,L5Og-t]o!B!-ěZw;R9]@.x !B!hQ&ޑ=n'*tv0|I47B!BQĻsd"!>gDk*>/%tܥCB!Bqk4NLH4MeFLt) .&B!BFo0ء#:a4zCiN hPB!B$AB!B!3-B!BCx !B!-IS͏4+2<;mJ;6#k0CB!BÂ$޵MӁ:VW 0gM!3{ !B!tOK"6Kb#ij?u(B!BqXZ4a2:!B!8,Ȉw-qvm@MA!B!$޵$9|mBvB!BTb~[>ោ9NJ$$;}uWw|\|["B!8՛xc7𿵔c-2[!;zI:!B IDAT!a{銥4$~?~5cj32zaI[  I}MAϠ[ ^5Q҈u5TLWF/ǟx !B!D=J?fǭ]y0{@ @r#~6>{G窯 1Iml,ǻ}~|-&֐5f6\x7 qS .H}AuUtYDN!BѲ[&hZE#y?,'FұP&_p@]`*Zq5Oڨ+`GvuEVYPU?Dٌ m0E7ٰ! z H' Զ;}yҿ; !SWM(g Pmߙ˂xшIǨ3)DTJp =U>UQsMջ6wV5o!B!hi &ަRe4 e(؛Hfmb{t+Gɟz9Tl |W=<YnvfĬR>zXa;yqݤ;Y<^5o0us^t%޹`#w"?g{Ay׹;,`E+W04xv{ 'O}3xsVr=@Q|r/r~Ϫl?IG2F;M ^8s`=4:40A{9c.{Kl ]cM n`mʬ1FUfe= 4,caQ mT_B!5x0# ʤ%oS:m^KWryX60ݔyֵL={qP|`6JHOW$ڵ9YUk626GӞbEI<ܵݷtyv&%Y97\!^;ZSĂyӇs| IGtьEE$;đv; t*XƊ^7F[b ;AO^LbXzo%דcطl=| G! k?s}CÇ:Cэ&<PF߾>=X9겇DWL4 ϣ|hѤw!ӮDf NExT0?B~{*&t)Ͼ=,ćNSnO1kk*>8tSlysǘ/ChB!Bi`BT1T\[qt|Ylr|~|1YfF!?= ,؆C_Brr,63}fO#Q82LJQ%@ J4<<?_;?k@ɦJu ?p?q01M9d?Fqt"*ǑԂ#h"{3Kt7y<f:+Rxg{Y#wǿ{ysv \tg!F ԗ^]|\w ekX9[B!!\VվVT(NfMYqdT|].[&53fag /tvT]߫?!M58 yEYUvd3׉x +gO5^s?ڣj SPkbI%=8!UpPJDxq p ]0cPf>+m7;ڂe7 !7L^W-fE錭8Y7qh3_֑?d^KH2+DՓhB!BoEkt%S^1ٔd}_olI)nHPb_g$W\<>axz`ux)Ұ6067reʍjSCkhGp^~l= :sәh]ͥ4ܱ"U1/`q xo8徵TӚ͉ ()rQ`xXaZixʲ) (X@)lN+"d΀j)Y)E,yzU7xs T$`RYX0U[!B!h86X۬\']yy{8Z6TloMԿ̉6!| 7Qڅ:`}>83L7PZ&g\oW{eU2'rG̊2C bn֩=GshJ3s6}-!2ޖ*4?X8^]K R}Rc[їbs?2f}797)1/yT>óS+^>ȧ>؄'Vv+9#;2ٖdz I51W\|ll1)fIeœYwӱ%ಳkD構ذy={1tO7^5GG3|[ NCdiB!Bq4@nVn+p t5~>ss톄OdTJ\](KsNW\2կ﮹ZhXa-qSX9i)ՒsQ%\̅+[Zo5k{TZ~yאg_sVa$'%}8$C!5G>GeTp$mrm[NCm^ޗKG~Yq076!͚xkR TꆢePP8I6cm_BӴ"ڢEZޯ2-ǁh8݋2uLO!z:us-/5G>GeTp$mrm[NCm{8|^8C>-Ł~cH"7{N/?)g^%:pH[zwv2ap,2"jC%D|\q4ơf߻K.o=ɘQcHvIvznWjdl6ђ857 S@磟J75zeD ư3dcqT_w8N~Z|>wmo#_kvtҭB%-G4:ruB~aghpL,)RX-(PT=;VzY~ 9_|W)Eؿׇ@#vD %J=%X9eRv ~/Ho8}](<ݻk#e(K[s0gh8J8uFޕ>Uaz0ʹ˾}ضmaбcGz]Ñi|>"##k|(0 LS (+/'--Ν;!5j;iۃ#mrm[Nmw|^\SǝoK4HNǍ{(\We>Sg>uJ9 ^݌ ϸ<{'l>g}KǛ~b Pk{O5O,cßY)EJGD;6BztHoqDh:-bCspI4M/jbBXQ]t`nf/(/2 =F26LZ#*^ZB±GҒo8}6AS \.݂% ,qx׭<Ӹ].a_ݱeqPxO<_dP}S%0.'ӴcrP~DZeѣ4ЇN\\ibXv߂EadffҩSCwĻנ큓m9Ҷ-pPynM}uL4=o}o.dg1}>GcY߇SKS$].wyvKf_]?u|pV"PBk-p7ҫp :/&oRfRiss.|t/ʎo/û-C|/8U󙼝 h$ޚ`mGo`.ÒC['Ny]nૅ2 yܳ4sY38M G>ol7pT={Q rq6̎ݦQ qua ~9cbV>$KJLr2mUEh*E8*cC;)q R0MM:_MvcBsL??v`9ࢳ{1L"22i3?soTws,J%VQ2.]|rt5u۔83f R χjbۉG)理}a%,f.&;G4M4M}]ҶAڶH۶煦J.+p8Jh,5P~Wn|q!p11m#5ю?=6;`܀?-v[_J7(L?+c5k}\yeleO_=3Ӥn$Mm{8?I n/# ј}G8?r: j!]Ǐ >o S9?&BT ![\s LjJڴH l8j'o_]Ya$z( 4:7&ѽ+O¯7(^̹1$=9<..<3_ ?1h Ntf?} 2I>]:9{kzZ~ڵ+eeedgg(RRRطoiq&ۘ?>\>z!Ł\9S\û-ŚFr"w4.y~7%35ǟOޛ6r&߳:Wѥ [%y(aLI,{:p{װ2]˻2ZR^f8^s̺.|] QmҶyǝg;H038*:@߰@G+3mUފ2}Fu7Ćh+DE\t&{x4"S?s@2n4BCG%PY?/4%]D* moʨwS cc)ڞ+N;ga߶z>7q]BCpOoo:},рw7CHҩl9.B ͂R5?V=PM{"x 2׭$;Px(ܻug3o'%$N~V Fr1kyX1Lc ZI\)=m6޶U8*nnێi=} sF1|1Ne:r硳G.)Ӟ\) IDATA|DRc1P5iC`28˥qZu$AAAnv o߾el6жm[ͥU b^d%va93k5n~{b{w%rji[9u$tDvi^Ѐøaj|r-rD"VW0q B^ˏ+w`k?% g8 0rd[CD,1-_μM /齈Q|nyR^_s{:Pڸoݽ܅!?uu?gl^E&k>huNea$?}5 v:CC}`G-W\O/#s[S\9*Z'rE{5e*ScmgYNjg6e0(qٔ]\Uϋ+OjԬWTr7ǔ<̡ (l '"t:՞jgkvoQmѝgR1ҖoB.IX 땟yhFG։dY|-itlG;4=֨㨮ott!ѕ[8DFFEXX,s(.[erWp"""liZc(x?.nݢH:{N'hG6a-#0ݧ[:\@r]P19FP#P>⑦sDy8nu5]gw/hq̺QZvm{e:p^ʼn#8*x}YsP2or7t$cDY%MW^ˍ38[NqWTedn+(o[@i=˰h | U4lp_jyز+ 5Uu5|ʍā0{ \a?p$!93ƍͫ]0Ѡ#u̸7. u&f^qW{'ٞ]]?`"KuC̊L }#9&1w҉7O:r$#V l>ϭoB4~:ŦbTBIE@7XgC6EQ[5PGϔ.qz xt~IX6xtlai]rs`7WP8*]Cuh]ޒmnwG@Ut S>#초 b.>'\Hz 8Еxt P42~5(?2s-(.#""J..6a~z =z}*cȐ!fBCC),,nSPP֡hկ#k~矷b=f KjOd  ʶ x}[+l]BǼ7r&RqЕplI̩DTl{P~ܯcWym&qRihZչk([snf{+}y 8_Gϗa lk'Vϫwtԁw^E۠UgL-hY(ih[ NBU_ڬ:'Nf ޘU U՚Q߸]+z 8hڲ%!r׽֫ 8t .xVM-Wx5cbYl{dM`U.]1>%m䝼gGkd0r\{?Wb ,Hg=\dFcFwKp] !y$"|)߬{ރ{R?y9[l4k&u}G­wa3?0z " *E8۳RB62M!4 mU^MS9$Xgà/{IQ8|Lo00|8;]R[6!c'24b(cHt4n(wt=f߇>{^u5CUҮɳ+enn.6 Mӈ[V"ϜW|%,<-KnqzvvمvBmxsB/iG+ ']ŵs7ӼGr6ܭ޼ 2Œ%qΫx.JPʠbV|`"ki}{P1Ѕ7@hr/Pau "vUu_>/B=O{w|s'Sⴓl:D%p~F.8^nW Ǭ lJ r]ͳwrq%viHiF8mmp]rPwu8U~sHuqx_sH5G=۳ ˦PFUÁ&dfrA]f=ڭT³EG  ,b5kkΤ{ZNyތ S{V:Coބz<&\GBBRb ˄A7AJbFt\ SU58|̽5C/anv61;^C~a;V̐^Q@P ~W@(GT32:cǜWLqh6qz쪝m J :|@-YH]G+g˒縤C[mkߕ/.lFlaj_݂ݮr򘉾oMpw)w۞-999:uHf3G]Aߓ'G< ݁NjL,K}=u9,GO h=/@f yVZ+tl=Ҷ}o$kCP,֭ͅә~Q4Fh_9) 6`X{ռj[ܻ7] hn FFG̸2b)“/bڭ9X'ꚦ#i7Oɴ"c +H\hԼKs}:\މoOV[budN|{⨴V-壸voXR|cS1 ~ oϫwމNw9ֳRz_FTTAjG.޶m poEPP0&~AA WwycnǪ\jAgk@j{UbSyr''.u| (=_V4=m}*/ܙ;,Nן#w 2L{Cy}0_H<[~]ʩF"c,fx[/ʽ_Ўs?f%^ЬBuۭx:D"_4?A5pnTz[Rnw*igVl‰;8YEeUΣ/i^Sa;aIބzm`PW#) JldpΞQ|V(_76 ;T*At+VY,]r8(˖-cuʇ(c41 8}Tzwvv6[Fa۱X,Μ9NY^J3F p:qr8| +m _Ɯz3DEE>>籞hG_2~>{5=6R}'h6˖j^ج°Jq&4M#)!]Xiy[B C w}Cs5TZ6qҿl6[yt8*zNGPPPWΜ9h,jƍSqm[cvPQƺ^ZLf,+aƣX<^qxr>Hu~5Y~k?oB߻{{ng0^k}vE|00wy&hl'hc%ڵh4>0]j76#S|>v65d~.n[n9  ph~ vߊyxj»[tEfNjVypmAhh,&ͯZ׽~o߾t~cjvgp<%u#?SUn|*ˆp""G[K~T,+-JgoK|4TǪsي]Uƕ7!^Wv3)VM!f׃?c}0:署\32dYȞ&:Z}hGMvƑ}׵^44TՎVBJqq f Պk͌4RGcZؽ+;˦F>߶mGEFKntZ(񚫚Ѽysfs]+φ^'<<6nF&?3zV-vv5|x̕ J+݆V:ke؀RL"޽N#qaqWބs .jsk®t[/Cǽ-VJZũ\UGkHBBBPvmQCkޡǡSzGܕj*ZQp̮۱KvSu`2k]&AsqѨ*>Ojj*|_"AQY]Yջ&qz"##+-/;,, scQNς(ͥ4ǎy:itBCCIiBRb7mHnT~p*D_ s e+44ct:ɴJ5f|_ۺm@\ 8)k}.Jw8C88 z_$Gr[$(KB4E~-e7@'qHgB(q!DS\wC pz IDATq6q!8KB4E~T(O(/PB! p>%!hJt B!BєI-B!B#)B!Bz$B!BQep5!B!D`SUcITUDxm۴%U :56}]@9Vxoٲ_B!Meq,'ӳ{O:fMi۰(ǂ_[ Z !B&J6t#ޓhl6[CWQtԅ{vKM cA !Bq*2jmPڼy3UU;U:MX[!BOLֿ/>7e4t@CQ4MCUՆ+UUi(Jy:MXB!Dg': e~5NAu:} GMe;ȢS@SU۱U;aCG1tDf"Ǯ.s.'v}VyhNCalދk,{S t}x0:ā#94t<͞FSvP|;=2i u=rAWJ#zF ߹|70")95sM o!Bf_ovſ0[Ѐ)i( [U"M/31i~x7H폩b+f=3b}fǐv[~7:ҹtp3 vPw(ᓧ0M.?-z-1Xy&'\~54MÞ> zrZ>sM o!Bi,:?\6mxw2rabt `{`5`4de&iA#^2{Dgb.OΰMk3c[d2b2ޚ?iӧsրisDPNbg{f2a9t눮S >yf\Mcfަ343%c>bӏ2PLֱd=ʱS΋_7j u ؘX YgdŚ!**#jս^)qK0g'K,dG~Esl'Y{2CȹE~Si_*a_oWg :\o

pa(6/A{~"Gߙ~׬ sE o!B9Lg0-zq݃q{e{S6EE5Ns'6̶ ]RU*rJ~޽ݻw{ ǚ\3/ 7<2  #)/Sٚ]4['tՓ2蓮DM'gXBcX|0φ\G/}&f](WygBy )=RUuR믌F##Gb/)(, <<_AHHpl<#FylDatjo,%уkG"!. Zͺh6o'M.䣽tV#Å$0> M亵d'Z;_CϞ$nVh9^fxGW +1wR3Wk溯lp5_1w1ӹx[B~#} B!sLQVNL")3ILzw) ]0|nj0 &5vPx{V1sq!CP0G>'lcHW؝CW#a>&xOʋFŜ-Rwqy[@(C1޻DZp)ز ~:KldggL0ڲe HB!Diixŵ:n:V}v뇄ם>Q5NBm/[LZj撞Ί+xgiB!eWo*v/-h@i ǂB!B*hܣQ@7PNS8B!<t+?Z9i ǂB!B01߾!\xg(̈́9)uu± B!硔)8BtT4!FI7V|ڤiPBS cA o!B!CIIhcGPR6+Otԡ  v Bc8k9ʊQ7JZ1?|öQ3yﰭz0U,W(_lV/_ˆӱGRx !BFϼ%BOl~R+O%[X,tl+tY8s٘%p=G#l謖gKfPȷedjkcKy${7W SDޞ5W,2&+y^ׯi_܊NGdm.{|ϣt1 ]<~*o tZb[vߔ峄cXf5xӭ<#nCuU޻Qc3߁:(}OΜ@1\y>[C-!s+~դC'&WEWQcX8B!^M"K_F3BDIMBɡ%Yoeh=8@ h ssWm Bѩ\XVPMӜIXw K"@47o"\8ǍeCa[ts1%%&u&Wd2ifVOgҼybumgs ;SO$~R3N[dc#K2|(,FMGVݔz/IA}:4iܥ>9,䵵''eCN{^;vY3o;bSph'{w4fLFGk7w pH-B!=(u'׊P84.Z1 q|Ʒdk(̢z7wx+0 SɻbWj;dCO䭗vN>ؘX YgdŚ!**#κ{qdijJ0[qt[> q%kB ~A~Tq_Z?c. z?,I檼 dʢF~,vSnɭ!o2 x4z6"]ȴT.imtK,')B!D׼oo)f'?j+9; NIa/ @Woutޢ=mǽW'!0eS opvw8'WwcMuph"B`u# gV\ϓglAAA1hXr999DFFr^ׯ1HD0(AEAQ;ڋץǖ4Eި_.'co;oq8/)p{UP*hZAur8z"_'&B!ȁpWy+Ƶg?-h!̿#|07-|ŨL 1s&~r7CC0M[Qj#l&r,yw؝l)Zg9S믌F##Gb/)(, <<_AHHp]+!-t]Iiǎ~9遠vLFzt+^vƅM}Q_ă3{ސkf6>e$̙qjk kڃt3NPtr{L1 6;i='i}bպ?Ret0;Ɵf7kfz?™nW0dX ra[bF}v뇄ם>Q5NBm/[LZj撞Ί+xgiB!ML؀g?6yCvܾۗi CZ5tTnT^\[v{S:MX[!B4-J8=fg# hѨV (}_W) Rx !BqRP RxC4cA o!B!Caaao.³KQfU:MX[!BPJd!:*cHCW|ڤiPBS cA o!B!CIIhcG6 }ayNn11z" \sw{N x?ϯEӼgutݚnUy-zƼ%^[_j?u.^?oskǽ-K5q5yl&W|oovLpm/\⣽u&00綢~[ C+>ש`|Yt)&L<>Vvo Bt_?vb AQbqw)e['c[)q0 k(dfx#OoM%<~|ËfrqpgkxXtN֗G4:Sx|v&%EM|1@Ve ()ѣd=N˜Zؿ&RG''Jpws1)گfTWkI5k/;un~k -;?vУm$fAqP-^؇pcﷸH{7p e`Rg{&.PZW1+us҃;nݽRl(6]D@Ll?Ih)j-11آhFFTE>ݙw=>׼}fg̷7?VGR/qip)N{7?q WZGu׷_.'z=J2vzIV};0ګx{Kyls*]&_GgF]PlcPN7K"6]κ}{srƫ9 ;ifd޻#Oy%\K8y?9*2(v M|2e"s؜:Ϋk['ɵ{N;Q1x`XFib[썻eQFea0&|L.ϢŤ`.SǥXFba92LV_u>~+Hwട>);ޖH&SKp?19炞jYK2 A/%AZ6\{˾tf-&*u)ӣl`7.ۺ>.6Xd Sͽ>&ZZmNa9W"q8SbLD0 U_?Sͮ`_a,n˹aT@1C8/8s'%ws[o%GZs #N`?67`\+w!չ9rCW++[5{gNILQ>N<Ç@=inng`Ŋ<=0ݵu ~«Bwm>D?Ϧ+Ml6lGzYaܰژ9i"Һrީ-}o[.i>}j2sv^tjXtZznVU/6`=EXwEl?]?+a/ɭRU}낫+$~b>6Wpc=V;tO]{n b3mpp4|󹷠+x+ f|cNX [i2B ^ns(2␋a(x nav{*yGnaL 6>%GMσS.> QgFc.ha[`[˺lu[z^HRؕ(l߁9vN||mu5x"lrکSCy}]';<{yg,feךv@kjzup[ |\?F{ilxΠ )4P5pgٶo{keSScA\Y͸V>~`6</zGSnpSW[GSS#LbŊpL$K>e$ wQ`Θ:/ޟ̤ 8zsan92wkx͉6: /R bƌ̘1cxǹjL5/\v~-~;glèQutwƈ !hoo_xv^ !4V/?_XHۥJݸσ; U>0>4HWA&oWN$/b7r$KtaY'ۋMz+cҕ.@EeY|j}PFeQ7[c|\xz|<\ ~ws~Wh>@#%8u瞆%`{0zy?]A~k^d:J`'OZ3}cӣ݊mQ6}HtҮ`po+?2rZ6آ/_nhW_WϽy%k]@17)"wcN{%ۏ9MOM#aJG>he4_[)E25UU0 RT}_3f+7qGlُxo07>XO5S*Pdv]9pxbn}eb L<"8qí<ِOq_gR3_a0ʎl~[.iVX앥5Jk<:c>#X%+;/ߌY{ gּ~>O GQdQ:⥰(7y pۏ>sy$ }Yyjjs|q6aϝּ(2fO0C!VG|51VkVg7b`N|' 3*wdyWUQwm\{ګ*D0<#=+}k6=~W=u \mH$ɤ;745}ˊ.c[M=7~$W>+T2L߾8`āTVVuwg#˟o̲ÉWpv4(`;N9LjvC7 Y N?7_S.#xxv_v W-ɐ[O~gܱpKF][[́RfI|6a7+~sї#Jz\Mͻ]:vR@ |)y6G\u\I0/]#L , z^\ ǝ 1TBn_asI^l9RK΁ˮ/|/0g9~ԪߕnFLI$8u v(2(㛏T+2^?G I̛Y bxN2C ԑ0jDׂ=x|ۨb0C1]FmA{écZG O<~(GB%H;idrKy m]{uN: $Gfec6'H2 ګ׷ m.f/)r@#|>cs_rUIKuoewh-BU)Uy߉4w+S3/)6+_qw$&a`gO{Cglj%IF ; ʳyǞ?r{w\4.e\#(OeNZUxq{8zzƢmQ躍΂(;w($Qd'ЏClgh]#5l8v&ٜO 0G Sv҇pA|txg%jcV؏{`ΕXQFe¬P&QLH)5 agӣ˟^\DA$kgo>YoX\sw)ژǎ>*k+p+2w˥W_g{_΍72A^asگwÁqwxzzK-[3yLDpk^eo58+[Ѷl^7/kDsO9gwj:J1Bֲ'1<ѡhïZz㨮='>8.Ϩehtm ԱjL3y6hhZ}zl46q5bLLXV8ԕ6M7{Gt'}(^-2(㛏 XAd{U0Qljhn+Կ!63bDzΒIW\ biP3Al|+LeK>a6?b9_bcxeu'Bׯ\A=%_?8zA\ʪقdK,,4੧eǻ v;~&=J ݴ>#X㳪UEcc?b퉓ѣZG3N,X!3 6Zo#9lUש BοQdy]y1Y ?67auwgH> ?FQFe@U `bN+RB 7`ms8Nx؟I#_tyf,xTq,QYpQ,gONsu.6qKـk8Eӿh4Id[\p_/p/d 0(vSңG2nD^SqpMsN0f8zaw7K.G=xM?0z0m?/dX3KGa'aľ]ze*Caxxl7,Y. ¿hAn20(-e(υo tMLhl Zy}y=yq>O׽xTAzoFKJ8+p4rA\}7z T0gwzگG a;9SMP5C40cٞh_27QYYI= mϺ3Nk,@=Meisy-jƌG}z1v8jkk;]vƻ|xj4o [Ft-6[8Գ+M< Bv{@ R->Z &7>޶[c=:kC)TYtLcS[X؉@seq~Zz)x, NP^U[n~ށ9D/ݭX}x#l‰_S9eeۏкaYWz}CUe _~K|E}2fP۷'Ǒ,`cG$U16ʳ'w(jmw:EۥjK0>2wEAs߂ᓎnE$=(~Do WaݦHO7+;󼾜y:.FLeQFe|qnЯ'Li(Vp+8>0צ#YDzdJ7v7aD:p*P&5c9/Ovl4 rO%|kؒ_e /s }M൥GқLQzLR#b+ fCK݊߰W^c$/\2[)4B`3aDŽ yZe|3MnC/~]bp({1A0́XYmWfww> nS] %yi繇JZt0lOp>Eeǣ>FC|Z`]X|Pa{v_Mw6V,m-qD[f80çG'Ыת0f=|=ѽeQFj5V=[sA7aAk&^[&l윖(wG[V'wWg9,Yͦc>O1OK80]siqEj-2ʑ;lf)'8ۙ`$ "YTrI'&[n]njobevQ!`M%t,{5q!({ 0kf#+|IyA_纯.q]6G/2ʀx ÿKB߾0b8>oO>1|g(6VJ[gwL Ӧô| b loiϳsWUWFeQ$AqٝxQFeQJ)>[ֶu]nEuU5l  Y>k=0v,x˘E)p1eˡб41\\lnGM(2~3qQ9 jq(-/~mҫ  ,_Y`6Y) 㽚Ǫ}!73`eQF0IeQF2t֑uuuulŖ̘9x^[o), =P(ى<NHYPbǨhD)e\@k D*V HHX$WQKߪ*yl|Z-qrYQIu:_G!adY5̙J)\&mضmvjillG/@hjkkioo]<ϣΤII&(, !L'Iv_QSYE2!A% IDATSH@"0` ,@ B @$BJ) G ŠB)네RTUUގ .aWVV@EE\5T"4sЏK{k۶< RPQQA& `v6kq\0kX^-JXZ ǶmVK8V"~A٩T DZp]6Timm5Mc6JWܬeŶmӟ +Tqq<q3̳555ENRi_``(NyɧiooG)ضm3R);{l0ܰIUE-BupBK Z"\/cIPVË99҂$})m3TfE;MݕRHdԷC.ӊJĩ$!4T",^ʪ?[Z(E%h̵(!15LJ|iO#:Vx )%{۲ ZۊsG-$++hnm)H$S>BXv34Bi*)6՛D\.1@ҲhmOlٲR_ʾZS[UM2Da%H!\Ut]QQa;͸ amO2xNH`,ߣGh z0k:]K$xw/3GKK v`Vu~祔TRTWpeEe(P =Fu,va-Fk,b)t#X5ɤ)OX\{l/ xHYhQǮٳgdioo/K -g p=Oi,;`c !1^D"1r٬G}dj!Pib6XoHI"aL% lq >X=ɯZc +pCmmR^%{V9  3rFomu3̹nHIFh#/8 o=5Q`*ho(}md*8) &C\ypW ȥ`.68PFݺ%,8qTH@* Õdt>35pт%@.r͆$LN*I^\h 6za`iTTW!$$n5mfqcR(2!)5m#3ʈGОͲ-5݆ О͘_ceYd yYҙQ 盍_ $I3e)CZHGiF:@(.L!k$u}0?BDyWC+P>m ,1 mTX/= ;B(Im4B dHdrYRi-±,l)I%«@Ge |I$䔏}4CBgB`1K*Z>O+tHi𵇯=PQ@  q}a{j >EHtw],+>; #HDB`aY(J.IǦ"EefK[zY,[$,I_8 )߬y K:8v3ƶR3vJ 4_ID;Y`'mc|'v'91tc4il3V bF#|JD -uD4'_ hka#{>^`=  Fi ,±.;@8 XvT4V5Uw p6ZZ(Z+-0i X9[Z$S qG><|µ J}MP8Hąf}6L&1aehp]ɹ¬PA` Fᣵ>[m);55 +-I8vayоyY"V*_G`;7lF#^pL]VV%eם^p7LB!{>+Jx}_pe휰K_l)~r,@ǸxqJ2}2O+_bP*ǂc݌u8eƻ|4G y3SÝFi44\{TA^F#" ͵S\&@aq--%B٭e* y&:t(S Y%FrL3~a]~ndj'FLlL+j;jx 54A[[[L|1$KEuL&yJB$3$: ԮڣL&ӡN&TUUH&pABM@:H$X ?" <K+&$ZJv?SAq[gҖ{|\0_q]|^mSSS!7<)ⱎ7.(vqXh7CuǶ"p1n86d~ iFj3ŭ% $0lסR#Yh)8p V‰\ cȜJ}H$> YI1,ywl7#΢?#aYDZ,|ȴzmmmP [[I$ȴaIАf,D"Qkjʪ*[hMihnBZy8LP>n[4Oiz._/e]^kXg2Gr7:Z經ᢷ;Zvt ӹv̙?#5眴H|Wvnx.9YPњ5k2t+㝪$mn$²G:!1k|98 .!ǂ%RJEXqJ5~R}r|0s&j L&S@wF2K.@n_i*E3Z\!Lɯv=M¶a uuuyBN2WyQ-!8 uimmj=$4RJ8 l{8HMCj%5*wQ#>&A,O.f4;#ʨT̰FE3> i$l+RnK߀9o&jKhZA}O6!}zITQBQx3yfϞm' ` Rm '=|v86׊4i\.ޛ9BWN3&l*?${7UUP%VB1nmݎր` l_ւ5դl>zКJF{n]6,tfQ 7ѧqѾ"U KUUUUX_)ڌQcs vK͞|r$S)L0aCEEE`TW)%oSZ!L&"U!)|/-T$$l39>sIl47⹊AoZm3V&uuu <^$E^%ŠA̳{aʅ"06BAkk+nqeׂ ^;6EyEێ… =z*%kdKQ%INɺ45ȚUW]X1(&3wL\?Y ,y5k ;K3y(I¿4vDJ~/-7N Mi-h 񽜲H:(%, ?M<%RJd_?"]͝Lđ)1cg*L0O̻Na>Ҵx~j ֘8-ΜtF]ju04︚d =XR(?'Gr܅N#g2q)-?c_F nnISQUp:ijjAJ[ a…Sc AU$q|߆2;JGLUHr9#Ma\A S q]MSk !QNIy(K 7p d2a8a2BQ`M#˯֥Vy ";|.XU2& V>:j4܌` j dAQSyEu\4Bò%K9`Ԅ14Q=ſ 1"NE ,, e[*s] VFKssL(rQpU!\ΥvwV~h hnnG<`c*뺬X'g(ٳc\LlJ3d),'Bem)CN|mFQtFHMkגB)1}-+܃Z.ۉ9Oq=dCK +a^s5(f},2yu"P\:Kq}QH$w6.ao0šosw8b,g.؋C[ӋsĹi$WL0p+筘[4 9@}w<_=iWp惍N⼳#euʣ,Yvg4|oycu>}Feug33A.9>3c܎_ceOiP[2Q*m0=SWr/l)zHfMlKW#ۏ˖SlmoO3Odb6ؠog2't+m'h$9N8Qbk9Dz`L(e@Xq,Jh>*, >MPG) 9d{+4Ɋo|Ņ%P#&SQQAϞ=#.ձO>f7]K_0Z& P S rњj4 F)|g94~3rl |'$#!h$P oVoM:6uYτߙ0|m-V2;p] 愁(󲹹+p Y]vcJJ*̭7R!XSccc4Zgќ |m+g;dy,pKPJE!\0t[4}1\ ;JYI6Ƣ YlSf h|}"˜}<_ŬBR<ӟqeú9n& {T`ևks֝0[ T2 u}H;",r]X#z`]C"`5u]hߨBK);., rONyKcS |8{PⷦGxz)d߹ ϽI _eLy~-wL_E^E?_Ờ }o SS*m6\~86x:O8mQ|1{!s<q杷swsy/''R.=?4}G+J[RhCm9ν%ZX7XDoO8Գ8mkȼsʈ~‑8~zh[1x.,dd2 _4|ѓ&z VXSau Լx+y&VxԗDa>Ic܋/\\,xޞ+,d2 F\JB6>0XV*"J6_\a: RTiɴe˖4.\1 CD$b C9d-#Ƽ-"x#fB":w޽EbADx-4BDRѻ8Ubd\ClY  ПлO}47"6;@mu5D;]o+[ZA )CTVVvtס/hy$XyHEi"͒H$p%K0gΜc#BۑHRA`iwEf;E fe IDAT !:AĴĄ/qt2u}XG_|i AKc?#ɏ櫈zG{{&8ڧд:D6V L&o!ZGkC۶馛œ~˳Uk[(+56q!"Mq8ǡaÆ X 0m۴`Ivxţ{1 g1]%S 'AK[+2^ q>e q}!L׃ ( iӊ1ة *++8cX$L"M{)#F=2ȇ fq*S)EIPJN#?PH$+7sb%:l¸^=Ѷl~ym B(T1 u (VQͿA a;yłzuNR;+-$JH#ҾU4?zulu<}/UJIeeJr,Zw5WC#o6qO6+'{3f0c f>28"9i3b!iܕY+l?2\^:?!Eh@!obd>$ISL8%8 Y|N.BIj4|i4ZAg+IۼLL{(_s3wf-L8"zg)^7q8`S&b jjj8CH&%/x m2s\$d-fY@ ̔Z[[#d\ @]RlȐ!Gt?NrXgIUVnO0ŁAGUUU<}CaОx[M}}i k׊mGfF{tk}i%JKAT{gIQij-av y,CKe dS.$J >τgUJ]ؽ%KjosjH~cAhpj![Hrzm"|vot A -@!PDDLU ᜀ0qeٲeQ*5~լkpzOyIP9ZzدA:K.,-/ga~2>rL O屓pχx_?³_ _.>͋/i<]oְa<-|^uG1<4>|/9q7?[O|Gx8u/ ?cCOͰH꺊y9'BO89vIVpְ+>>pm?ۈv o?b=O^U?>g&g>^uCڜ~YLOflp&fs=rI@]Gآ$MzӔ 6e55MJEMtZU={9IEC~#4DaH# l>77G>W`}Vz(x0:(h[i  )6}wyqNIP{j8˸-A|]wynXS !zI̶y+ b f!7FքqDr6T/!d#V uCkַ]@YR)j+(b˶$iJSXl$ 3'uhscD ?@(/6~ L _=^!2HJd sdr2Ov 2>>Zk`ms=:͈O<# h| +>%~,<qr/|o᝟.M',>ws{\y~}:^x`9vV!Ow\Y^ǿȹ /OڤWr3"=d4Oz3_9+{&kv_ׯsQ?}Ht3yO㰝WOW"`ݓ<W}oݴ|5MNYYsc=v j$M"}ep3:Kٳgog>OtWǞF`\qiA'a\7먃}ۣ Κ5kزyk >MnjrFEN ˾p%~N<ɯumr5?W}ƛo {AlՒO|/p`Ŋ̰qFpj>nGfV7c\Z.=mNEZͱU*YxEQp'#uN#,2IPX(wԽnyaLAIV(iƖwU>Zöcys_` G(–,ػw/_ !p$BVX9DD->ԣuN3GrQ7!w^tojmj?Cޟ^Hk ÍF$I<\JkM"2 8sp/i6y#!`PJqgn 117bMѠs>|.^D%/nG."5ƣui#C% _|;q׮ul6䱏;Ls4$33"1B#Ƌ B"1ǑR299iɾYyY06W|8&/6l0wȜ9Ro<ԣe=DVHY9oѰȦ4MM0VV~mpPTg\M#^\ͥ~u9|-,,x}~~ α1y(Yz20sSt:n6{nR7M#҅̚AXl&{~;)ZF~rl2c|W_s-\k0/_R|2Z x9ZEglC/)縢(ޑFk׬ⰵkh5$I?( Yz5E^Z]>|iv~Qe_*iRlA/r9v¢ɠJ2(gy֜õgqkIS~^U_ǖdI~rP oiK1 !:dIh462ePb1A0{"Sͼ3ld:"04MٷoF#O=[cjӦM[,HXj6XFТvzgB@[5HT%,iy.s.AjD[v欳΢hDEVEcMm*)*c>m1r[y!3N?8cx/466k?@ËD2qvߟ8q "w;]@sϱ:H79!_eoS!!(x&CfDFf9!.|9PE1 +WBk͉'>+W{2ccFnщ>~R5΍+y[GꢵG1i6qO9ó,KVה>ceY2;;ʕ+iZT>O5+#J6tI9%,a!%MS84XN8RW| lr WSؒXXE!Xp."iR7$r fec4?xn6Th4eI;'0Ql̒6}E)s@>!9d`]6J}T:3m?GD;Cl0 X]$ B[V8фnqTLM.GD'ƚ qGG1L"M^ιW׾d@?OQYBgʔܾc%st~O{EQ+gf6KH)-EJm {&NguN5kְo>JQ/ Urw +2{DQQLЉ;Fڵkټy3YhTk0y~¢"#cЇrEyyÎ'vllY<'s֭=$) +4sFQ`j5Z)7o,3 .vFo)DV;$}2>0*+餇<[oF P266}c g!N$-|OJ;aܒ׉@˻g*R"%YߔT{q-e$k« TFPo +dz4]\4=6u+OuHYM^xQDFKEh17$IDdLWuێhIdeJ{V *Poa]Ci" pu߿n˰:ms+o/2>83mOtGvku?!NaeE.޻#TQ+eupqꚱxuM><mN.R"ְ0Z+2Hh>gttiq|ij5<m6T*AHA{3<'e7 (pgNWh+VgnC Q,#`20$Iϐw5,:})Eq#奜a)eYXzs[n1#EQp7zGj+7'VvQtEQ~^70Dž!9v.LynKR$˪y$u055AiFQ2(yQX]aHhD56k1ce&T hQNӒ=UhDh-~Yb%Z]{`0i^ IDATc ֬`׮9@iyfղpH«:N?tJ:QuuϽ jaqh7p}fYjeWΌ4ɼ9S&N~oC%Is͘4͌K]-v0}}?˒Fnhč>ÿI9S~v !{~}_%MA57mL^(fsҜ?qאbtH>7[i"IT:2  - 1rJzzy^rZiS!So~vĦ1> LIjȵ0$"mɨhbׯo s}[bvnƐ =ik֬)Hd# E',Ҕ*M@Hf[ \Gd _iDq<93+8)VАEQgMF\ Z"-,[ssd4 `쳏OJMJ^wxYj[s[e9-S:MwgЊyIAn 4ǡ$KK- C[:i\z3%fa@QM\wudinK?c*ahjk ԫS|j ϵfAO9ӸkM*R` ^k#ƚ p?`׮1_80= s8:m BG,R{ R5{Fz/Z?$)3@i$%ٷg.60{SogL!J*r.R~Dfm *d)ԂfI򒗼2Yf {ff|n޽!,˜0 H:@ BCNiOWMJ*Y\!?Kj.Esss-\dٹӠ(*ڸhGp7126Etd#ͬ`rrMY K|z"ނr xEǻkJqH= x;X15\w] =]$/_HVE琠uAń$ME(.f3fʕرÞ&''ٳg僀2/ R0iYl;vi\wu}4'M2yql2nنf,M,ٱ}'v,IL)n7Xb6mQ́.mAEJD͘[nŧdIr$ghl+_sMY|K_" %KsR8, EJ:(~_XÁT&T%5fy?o$V!kM7eI8ȆjgRkApA E]Q^QGsV%;XHɜR`M6 $FdmIMVs/n]fWWrO, JL39JL|B+]`zzffaaJ)V\޽{Im>(`n'"A1=Gb_C"HCF:ȸl~o7okN֔R^! loRr6v0pPabQ[]|4 7 9$(<^z$/L$D\-n1FTI_>h"n{a||s]zN;wAUQsSG)(<y8"C~74G,a6rR7hGVgt2psml۶$LLH"Ø\r%&(6DhQ<}vO8p5\0ɳ(P@f(,me4Pf* 2HAWch>`Q۪$\{-EL^=^vu ltp:RWƷO˾n %OR\Z X.5qYF?\kP\>^zX`an(⺺ om"Y'l8m۶M@fLOOW*Ǽ0uֱu8~K_$M*L@|1*m ؚ^ʮu\JI'3O, \gӦ&ꭔ (i4cVZŖ-[(J ai\)6uMBm5adK!Hwߗ2d|ItglI~;DJaƺ~=ߴ,kK$.JO$$S))i`JrjS*_-RB =")?Ԛy\ب|(rDsNQ)MR+۞q'eJFigK=i n^<5li ^ {Df~1.hbT0;&[1=2'$jl=WND)Kt{] `||[X~X{S#`Z B.+.lYiӕAk~'Oxb_ }GҰٺ=#8l>"ϳΖ!(V,IMu6?_ v֚lCGY-nRkɾ[U/5E@/!dll<Y 5.ӨQwfԠRS=ٴXFBSJ3gS"X)U+A&,WOSk5T(_KmF#x/yn ,׬?rYm{gz1G[pahű\&s?#=-@M֚,+ ̺ΙJ\8]Cb=ɏ+ /hs.g@?\&$6$'aH9u/&QZ!I0GTAq?_MM e}u:O FZy4' cU9RBRy ύ6-E AҚF\E1%% M4G'jk46դ!PPDQDo/F56BzcccdY#q ˕=hfD MצȾ34W4B{mNFJi ˆ[ַn d@YU5 1c! %"CީLYaׄpG~lf-S[:O KFҌ\ʸm=]%wLS|^;Y^gKfu Z y~1iOIGA |ηy6gƥ0 qlsä o$Kw//݋䞨9l( [wr1a_wA\dj$iCl+_~eU],K$~9o4e}Qyl^0淚*yΠag4MPsOjKfNQp\?ğcpxײZo&&[1ﱛC>/foGs o҇mzn6M"9ǀ -%e DvVa"7nBc6Yj6{gU\<_C(MV,.&/K]ϾYdpN_#=[1J:ʸ{_'r-[˹M=\qHa<) Y`f[yٚ6S.Q R!ur61?sN-"Bphx;wifv;l$Irh_F2&^-6;w|pee&FCt7 CZy\z:Hs B g,;ҧٳϹR af >uEe٫eIs/7 }06/CҖӟޅBJ BΙW̫Ca׮4ݞ-`` } v3x O喟isբAQu!@D{ <1Ơ({pSOꫯ& 4nDtgoG{lP'|ߤ%j:Fq99+x:;L! oyq'nGηQj{yg\SU0jZzu8o#EW}%D/e4}8U答"j9࣍#mZxBϟ!322l8(O~kn\i@\?ILUPk#lmi1.Zk,oxwQnwv.eWڨ)0e뇠KO6^J^䱏{VոBc2HH~c8\bC$9S!a$xZxqL2zk4Av鏏/~Uw6$@ p[6/nR9v^oz?_i{o,;cHhx_E1&#;P$+ySM,{-ͅyS&Wxkҩ#pRJ6ᓻnJ+?]&y5͏Pv`zt_xkqʑƵn Q^ S%SSS~mpbͽF֘)OhQ@!Y^ ![NE7p] `[8~"I(ڽI #aG}/;^"Z4Y8e1\ƒlUZD$%Ipםw6o •:3!۶}?tVEuI>wl5Vv{13-s&>O/rT2Jdǣ6ñI:e  ώb`tk6O7qx!PZp@}5n,E\V0i'wEzC_g0kW?6uNU7Jcag߬{1faI7v$I(TSWk9!Wv6 !ʰ/,KhLDk||+ΰSJQ6rSUd\qxAyC~1e (IӔ^"hQ?ʤiMQ;iDJcw&B)s he%Q" tYG2Qn),lNnշ1q IDAT2TjR4Aie G{UWzTZ뷩ݜ{I8mUZь= W$!Yg8~/!"4pu~S/e#ǁW"#ܕMCmY35*WÒ:!B'dYji = ؑGΦ:3]æ$ң'sk#klHM Kx~BβF7r^t`[DSVn`8;*ZGd80R! CZ6켁 }Ual3J+ ,RVfF3,bX`Lr~*ovq5,^1Uz ZCgwɵfYȺ}p c9&$k j(YIh!e5Ð=.[sRhصkqV֐wbt5<}3c7 ziY`:5P|=eb9__7gQ~Nm>SFhfx֡HqQcE휳.EAdu9(!M4ClE{B+Sl`l>|h]z|&x>sQ|szBarL?,Ӕȸ{F#%w dknn+U _|.RAZdzzڟW?% k(;&RV1z<-ˁ2y*SLkg@{TF{E)͑GwoBk(l5I?]+Kj·sGGhƤI:aeXz1l {qpXT}FZ"$!ԑ b^z& W^o#"䕏͉ ۧu=F ~R(:dXsgk=xm)*SG cI@z*ڍ6(M"wi5/%O(X61ɰ8ǽ=,me:eu *lp~k3:xvg%9&(x: qDEcbq#"٢4Mۏu#DkaeyeGY59ݧCЁ@ ^P*8\ /P2ut}QZk}:nyo\(bkۈY=yfo7X6(k0, U~%MeM(AOQT֬0ZcǎE1H'ܽ0EaK$ |:@-)eC>?SU}i~mQ [ǫc$;ֶ,Q8.brBgRB`Qzvp~kqJMfuE5B(K]cjdS#(3`Bf9+O?e/ b9Qy/);+d©4qpN4qpWA=v·7?mj̴<\_R'm/u2"dE yCX TG)O\nk=-7A^@ ɊƀF[@ڊ5?١%^YP۶`XHSZ=z^UUhz1*jc\P1D_'4,#P,<߀tPJVnSnB.x͵?%~(~Ov6(صkWdGWB NӦ.]ozIaei^]X@+++eʸ2Et`_hS{bd¥1IOz68K3gt Jƨl+ xpW{!8._o]UЦRJwcC"Yٜ絪JiaFMAWўО,chaC}0FRdr=obٶc;IF|][  R$AǗE4M+~-=$Y_k<'N,}F'u-c]&l߶7(ټ3.U#Wt(L zDZ2y_ " ǥOߔMٔM$⽸05,EZ@!'c +++ؐTԻ f͇[wIũy\֖.& @=@{E sbii)m5RW6I/O|n{C&@ l%~ɻBD6nepo:[ԇ2:/o)~/[cwxGOTJ;֑V|)WO: YNr; M;"Wǿٍh )_yٗF.{{X]]( z^GAqkkk]Ǵ|X 2%Ç_5 lٲhRp_OF&! t r&l<ɴlT1o26Xev^aiz$bi}N * fa)A cuW]ƈ!%fqp8d8K%fa>dg;suh$cgL>nK?4MKb\Z9xc>޽1.wFUUp,]t'OzYRa+$ʇ F&)L0ƅzTqڐ#GP׆ܷK]ضN*BcsQ˝6eS6eSϒUqA`я~4EY1 g՚hLHևkG?#Y)h,*X AImbXv/h2ϟv[iRU;[Ѕw ʻD$KRuYeڶmywZ6̍\m2(ᘲ,#y[eQ1"@'A;$m7 ~YӾ,} LOC)SfxO72^>F#~5W> ku^Y7)n\jҗ|}\{u]6u zPD8'cIdJUYo?$hMa>)m{֚,K-֧* Hºw??۔MٔM?FW;@$/}DtAa )B L;LS#H:8moq߃#/lnϱ%kJ\k5BZ,JwchQI@o"3/"Q&Lxyz ZVC!̚'?ZIRXb Űu<`mXF6t]"Zuh2b<SeLmԆK}wm yi{FEG^x^*o2O(}veS2q7keQ~/S(q);c~rEWn< z $^I<qxRPcjwO:]j^_)g5j-]սžFm8Ecii)tdu*E3V|)@KuEz{Oqg:ދ6"ܻwR3d=bnUJa4-u|Ə{ضm[D.if:D#ӗa)JS5v!MrB\p[=Clr-ؐeYT:$q!gu];vCzFdjZeQS׎=|beik,!Ѫ ޽{Jo+y]kCŃ=xC$m;R@[_1>OPMߒ]usJ8"88`seΝ caWHRph8!g9om۶eM.uTDX 08OUլz!:}L9NI`RxvF鵵!Q5yMkmf?۔MٔMy j.2M0 :.OsngQj`m̠J&@ IDATðX[[`KncSF)%GJQ߶vj,O>wAV1p&I?aMw[r6r[ ֧h)lkqyփL* KaC.N±CZLֹ Ξ73y1g-꺦`RRQjӤj:vy~yOx;!8F! ձxO:ؾS'rA5凼:AcF)s8RVYM ̯u|q/0^|["}&B:E}{mĐZ-;n,r>$]2X)u1'Jy!ܣfӊHޥf[MFt AȞ}myF z}Blu∭p ;сTMPG[n%IV$ı;OqьSSʛ1m$(0kS%={=s3ԧ8s('BI>rmCڲ.8FOiKD|bG<ڬ1L^s=(uǷu=JeS.3 bX?7lv 'ålM÷tUg)2XӇ1r GCs͏H^Be,RBY?q'> ,//SU.-_U$,,,Pڳ[KԵ6/eBbrv@ULlʦlʦ<EYbrg0 'f쬻n-oeȞطna ߘn 5M,_dCM f.U jAXHS}d;B:gTxzWgq;:)I7T'DZELupȓjUqg5,{B!D={nC21b T3NvmE pAݺ#&ԧlYAIl+{mdʬ1ߚF,<1Kq5D,J`}25=*!G薇ʲ'wj;u#)={{_.$S-J v["<0u"$m3N& mPGi{` o7Q֎DqIiK߸Ҫ];CLb\2|K_ ?]HLxe5kwLDw xTeEBdc,H }%[ٹs'ȏ0?`n0))\ %]P3rC!ٝ9-- 7 ֬܅s)ZUUU[P@M.w(穙:bP-FQ4L.DoS{GXYY;8}ۋ԰8 I#];Ρ+:y ~'x ʾQ]i7~=qڷ5mOvEѥ*Gm>$x0۫Cc r W]uę ƘH`a욥l5(F?#˲5TuECuW^ztv@:0#"IIu ̑7HqCkNYOs.dii ]dyֲZ[<)ƏN" L|<o7Xa IW "BlԷJ^lGiBK yE$ חnFy^eXbT1?W]ʖ'O}|h麸D6 5oqV Uj4 i"uhߣ@j]Sd{wؿ84\WxOizZ󜅅O\0P=r-'>h̛v4fɛp,.:v%%=T0Sp*m*Pi?!ȓ47MZJL@H*B>cQJ% LȤ U.|GSb4^R aφSkt_VksOT*E],9RBS8/(h5RJqy"`Ν+hM.QYT|$u\B  ["1uCю*;or|l<on)s}V,wRhf&#{]׎{䗗#):"u0%dDp(>$ p @&*~Zևv2ʢf: [}$2+!cAM%R6 '+9e(X^ca~Vs.?7f|ڐ$] 6YXW~"Qw>/"\Kia4*Bf1ND$>kcؾJڵ !++k ADcCYa%eD[XǓ}ɲX$_کmʦlʦ<~U>6Kg51 (WO5Tqw9f w^#3 &uoS",2I7lsY/)(UnA$hFeAm ( ʑ+D[f5^B,x( W=x\\ij1 7|&U__s //?,\oL=JXh\/\ZCR7信~w>Cw#6ĥxwOפ>HӠ|2+ĞS c)TuVX MSa g u9qx$uMXv%JQiu &m%-|Ɛ̽+ɲ~ mnII`\\ve y'  Э;˲N]:pH#ū(!ٳs^-`8QaZYFUܹ  O+,EYPd))d+2su0zĄ &g!)<9uj3Xk9t&*B_v?!yHtrP8vfYć8Ѻ9ʱ?;K:w rϒ(|gCXbJQiMe &: nL\eU ˋ(Wa|!V!ϘlD:Z0^y $8ytc[ GTLNy`R}#cnxksv]Z$iB!~y{(f:"&i%~=VZ`TRʘ3x꺱[{NNb<w6J@'D$x7yFxz[j8+WmH50[!B<`PD E)OVE\֚$KQiBgqYdi`v{ Ӌ~ngy<ǫK ߑ>xyssKO{۾!sx'uĠa/NGܷc45eYr*Mޫre$I›|K y7\ WD ͛㶶=-)LNGfy?qFqA^Y(Ox4TPt guw~q߰bz~( :(TY_؊[zoBԺL3ު^nտyyuȄ-FW3O#7xʩ[{e:[ !%^`04McOg( m<$?(8eBrMx<ޓP‘eyNl%#?0[knQW5 [e꺦.w8p๜z <uv*Yxw8MRFyɓzE0E;,() zjY__uw_ D\!6]VPM>֏ 8m]}f$%0j %S^SߧּdhT!"^)q[,˹.iF^vet{g-a{+n&ӭ_Ș+)ByMaH[ʂiYJ7( Ψ7t¶W[zt` J%hz`-?a~?bO4~1ݗrpȒw.#M]m~m@XUX(mRݻn[:^^GD}]1X}qwS{'k6eST8_3= 5* `}PCU<ǝ{ϐ)X"{%?̆f\SxO|uX8f6ϵFLmO%#ݔMٔMy5 R@5xhy<@=11M%.jkjY[K)\acbjݍ*NljrAzmxNSM/3t'lͧXUU%yfe"9hkĮ]Ȳ cl6bǎB Hijfڸ\n, l'wr˴ *3ZN-V?{nt^#+e Uَ 54wv a6^nxfysg;yka[& 0U~;Uip?[Ul?.@-c6^owK/$Ua1vʿdIsfd2Ŕ{5ڣ}Dč6օLtP2/aaZ˒kzU1"˧c{ [8ṝ}nz,gzs=0u01Ȫ.ĉ1xW#Q ]׬LXp}_R*wO{hCRlL"e>֚> *(:F{8y+s$el,+1 R^sHɚ\tdp+_޽{3MIӔt$Cp8E9gp|!v2!.>s%˲LjkX\\d<SUc{mL4tC$!%m#;jϧk#vM^q&M/K.ga< 1>oʦlʦGݖz&^* @\[R w:.?6"RU AT7.NlgE\->IP>%$w>|yB5⼠ HGzNeKixI{kw} ~(m6*dX}1FHFim7m; GG7حkxx;m^a~!3z~|H |N'vm>݊KG/n12C@YIU?||bm1^YC4i-.;돐 7G~rʪ2Z哸?$#B0Qyw< ykW9 vh#fH֖n%{7/aA?,*/Fgz#Mc28k#ۊS%ÚA uɨ+aS(#l)c6A!wNs׏BāQhL9f<}$yGs7G:qHnSyC~X;q[٬:0.TUAH__yV_'7QjQ:DbSJ~nL^_@K?s;G$I>c]^^f8vSrIt¤4,Zެ{SU#~]mH~W~8uz﹋"$!~޼S +[//$hCOW_e|i:{vŖys!ɲ8Ee^^^&ϛI; iؾ1/%a6eR ,HN( ~|"Q'u)cҥ St&9JI0u 奤A{(ɾsQJ;Wc[nVkuֺ\2u7P<j]f<2&KLiXø4Y!'O$I.niX6( ,&w%S`aUHlCmF&-(>Be\2 g'.I]Fxq><פӺaEZ#7FMxn?mg_`pn8t3U];%) @jb-j_47p\Jv^PW„mvI,.nG#2)x:Il/sgEH !W|oxI)cI/$[.!!W3n+ZL/ۇG8TDl8oOcI'Mo$f;laބTߺ`;lN:߿~[9rKǏ$ z~ 2mqNH`L7~|#ZzŰ( Ժ ]De-tcԌ J1Q RR[˸fё/R Z:Y1J`l'N|<13 }J{\AJ<c<O݆k^s 7 h=L]ʲD&Sȇq =v vLQew\?C ΃6k%9xQ9U}fGOX 9m>w;nk8஻\<)T 㑂+Nws~~0Z)g{]%3 }pW8 v)) YHP ϯd||;(o{"6ݵN|N˜gUItK5{E(^ %dLbeԺ瘻RZ{Ez V|?")}~zvmGQxHYPȾٗ:`2Cq+֬gSKHhqv9SE“{uP9LS-?^#> v,.=A"_myMb:Ku`)?T7SX R}[vh+*;IUF/A A|y'.N[۲B"hi )k|u)z(zUUCףl1X[ַu,数ҌXT}PHJ bS>X*;*׆)b1\i#(槛~X2puX B")R$^kaR_XREo~u&ZTH`hÎ;:)pZ@f!MW\81r' sSXJu"=9\?wCV檇q1?̻AidXju9F\i%.z]Sx`sssH-=>$2֬phƒD*# VZG#:I:%|_$MS4#"*Z@e Qn^[hX&UT y.pւ$ɜQL@1 *ZP*52IPiqX$eIXY4$#ck㼸BTSP~u\I3 m^ߪXXCylf ,Zjw jkJFTf1e]9# `#sdzno Y~56mvwmBRh뺎qA&n{ >|[\]OȸY+bC۴7SnaB᜽{2弿ih еoKK7&1HBhƚ:/lX³CHNmWAօGKqm.͏,Q4nLjڨɷE(iGmZa@PNW}ZW|b=9/ '\! \oT ?~4}\mc[Cx}SimB%~Ծ!^s ;G;@ Z]0MGLR$O~J=ޘd3I'6{Ļ7i}t+V=՘wq­"̀Yuja{лx3mѓkCn]{G* 2v 3??'#zbnByGI6J&~-dYҿLS>SH)X7!D{ __"㼱"_OךwMp4y{$]0,?gcbjCoqY#1A[GX@W"T?{xͮ;J*J*\&Q0(tڶVzŁq"z5`+J+Ҋrm#*H3@H`椒TRө3Þֺ^{T5|:{i l Ǝ1P4T$ aJό3k,r,Wc `"crT6ÃE]A07$8EUg58XCxeYdm^Ԇhc]q97=ϧLkjmZU .wC3*msWُ3 A?]Wy%M Y+(a*A"leyl TěoBiy<:1'! -dnn_ w5XbgLH*R~?0N/I0ݝ#Gd p)Nc$!sx~)UԀ6püV7Vߊ$)$SujŸ}:?D=R6At^pPT͢*)6U箻fgYh̷(zk+++0(\cg5,rŕ D) (>O;+^ۿ.l}wquq뭷x4ʷ0ڮ6ce_ϱc%*1$Ix _ɤuƹa,rh'蝛c4y8R :XEFvGϐk#t\mq󱺺z@\X7k^6(t0n~-Daؗ~9wY6:W$~xDp\]]E)2^i8 s)&)%W]u'N-bn=8`"I"0Tdӊ4QL i`~n}{W!` wpl3#ϤznȎȎc/[:ip5h_*Ν;k -[1>Ζcmt {)-uUן̰0pc$ymFc0r;yn@0e}LB3sXF&6}T"R >a8=Ryxhk#0B#[0I!#_;V eNBqA_[9AFd,JmK)yo%Ȳ/RjM/,0mveg~һm΂ iAI:{4Ǽi߰ln-OxûQ7772HNRJi#Uͺ)鵥-A>8*B2 m{-Vj~zvwE-c"乄FOS3rՋ]~+oii 3"v}Oa٥ ?o^]c$j NA/}5ͱSH=$)@ys5c-wD>}VweY(Nt1g'Iro5,Jfm4EY kiүn|/#0 {Kˢe̩HRp+7F de)GK{<ܲM0zߖ2(c%|U&( 0myRt.?IӔd Fc]#=DY1l]+`c=hM$y$;'u? "bsc:Jm@fpB`*mVNvM`#TZxC[tQ +^UMdUYû۲O5] .{e;Ž#94MMPLGƀH"ѣU9NPfi#-LEUFh}%0o[FW;} lI~&xkK넨i,+kHu})-8%zQ[w:~1=M Ftf~Y.fEfˆWyϑކ7txs[J5\=C$% "XX83):15Ctֈ Msx4Go )y?c5`! $!Еرc-a/xH>w8)ynQR DcĔSIl쵎 (ɍJrcx++K=,i4 \,%2'V9sd⣡Rm(A;%|co)a&Mc&2댬XU'*#Q}ޒcty/-f3jE[J:ͪW޼-e p0dqq8 !:$IJk=X28fc}V⭻}B|fJ5?;ڎJuYѴPZ\wږ! _93ynZk~>sssDC{:xˏ^F{Rec?D*6vk%N8ud }&"D\1Pq䫠 qic#;#;D/ko)%R)ٔjdZ! jƖuOjc,i*k cG/tW{x;F(+͇0|!DMh= F6J 亟o&^W6u>P a0ڶ5Ic&#UA5 H^/e\CmFtjG_?kϹ[v4OAOGx F֬`h"ȧ5P~ddL'VVVF!_(㈏fG6Եޢ54agvQ.0N8t.\#l*Kd77 L&TSS/wY.\`n2ID^;4´Q-lͣ% E}ڦVH.,uKʮܕ9?I'&u[G*F#^eYzBLa=w7o5y eYr˰޳hHսv=O6˨UENQn_LBȺ,dJbS҄sr8{e!D˺tk_sPV%锇~8I)*;KKK,/7% ޅ77$l{=DYB>׾4ڶѐ;ّybTU줴dQhҏfgTQJ(emTi",!5T1e1_Ȳw4t4p~3Lc$P(9Yjh(*KbIAY3y <,4FI4ڶO9Fрi`,(XRa>W)Ҵ4+X)JsgS8Aou&bnaɖٱ0eNrm >5u%(."&"2Nڔ(t6ueE/>Ld*AôϰG I$U+,j"Ҏ)Qt aXZZ"N7 Ieh$I-QT^UNiJʮXori ) SG ]!k;I T$[FkȞ6Zm)a$R$-)6[U߯ ov+{gdc Imoa\*)7o\{V/r9!y6yRSWhu#YԳ$%_k;k`߾}%l!'_g8e`0<^ǏɊ}IA+Tk/dʉ7ul=Z@䝵AY\ܰvEi@mUDR-v^ a0i⾦ƴ%Q%BTh*XoUE?>=kc u.1fh#m@qFMeW L;#;#Ozw{!IkhKi}CP!+VaZvʁg9R!Ri qc,L i;3⯼qN‚zuIO=oU^:rir]ևA DEDrD% e,*1RFHDH(*NHR#cX\\D.G=$ 5 0{!Zew[Ӱi%ҠM%ۭZ nσ>Hq KZcJtu%MSZi2ZHt% )_g377aښwDqh4dmUۆF'4d(LYhV_y9m4CL2L& Ӭ}#l#PJge|Pk -8(eB4Ka9\mat噆# lqqSH~~+20g\V!O3˲Kw(JR_[UIj7]C? Qi_]g *Ҿ^lj_U)'Mss?v-խv̭b;?"λdaa;3o{P\x Cnq;3u9$Oe KN<ޱfuz_RB>>YusKEz:252N,Yd<:*4!%$\;#;#OdyY͝xw~gn#uzCrf0*J-A[Q"1گ} sV6QU`ee~}_caFκ}i`\i&F21i=RJ!JUQeY*eYRUV8pB;c:s>7pC뎢$(NKI8W[Ʀ_8"MzLfyeRn2`vƷo$s677f8p1mYPѰFeh^*>2(Q|J/9vW]땫uo V\uU~|s*|qZB>m!4t<UD}dֵihuJxpRg]D,|LJIV5cg)yryJEOG*nxQE-- )S2!RD`>&cw ցb!MSp΅{>3:zy?v*c *.^Ȼn*#k1Ӫ}8Ʉ`2)RJ666ƵNK=k%iz8oWe&RJ:kgn,ҦF,//3aIFgWJR¯"sg꽯k|ujQ֘nMi<o)sw KN_u)PmVia>\Xr$Td:jۋi%FHB6ҝ\ ͺk|4媫ޘ:4,P6FfAvŭX ^sg=A/F9a5ea;EqEI^Aw7NY[[k|J |8/$Bq 8~Y>)|S㔑-#B52nyYx%/LY_*vCeJH@dJ "Hf2$iQ˂RW%!6Wʎ9Ҋ*xғH$xǿ\N{)4u eʌ9U{tz*, mHqwc*eJ4jgT}8}gvS6|ekq,\_:/1\p??'m*;CkPF8|_2~ߖrjxat0 (˧/GgaޒY::R$///XÈYF$[)16rS4$m `0n|p" iY={']4F.7n `nk:Fx?؍hc,i/IAH {)me7nN{9Il d,%5ӸF)Q$OYHb PEY9S4¦ZU*S Et YޮpUU`HF[.;'֚nHEfVP-(hR{U`>Fl4i/zS0 w BKg\u18b~~2|)J)ɓR֊so[{ydiB9hwN+ d2Fŋ-ӴRuevQ6XhvuĵA A)U^(ϘFЉңJh8'C<YX(Z[i)`1&nWB{jK\;ȋ{R>`5Kcg5E9! jSl<|eQ:ƍ%sFsy`0Ü8qjǭBBUT;SM1Ra M) zի>ٳgذ!ֹfȶcHɸz>n>|842<೟{;x<`Q?RD<Ĝ#>k &USט*{%<[C3~[ˬR"t腨`_rn9=+Bs^Z'EU;X쾥jV(HS簝}_fE|*K[Lس%"h> vʪמq=$cʢhլEq ݑّyjxѽ-erBu)ӌ__sr,kAYlVh;=ɶ<ΞAk4-m#2`nnh몬 ,1;mea00LB`7{SK0h4bee8XqqsbT%~<箻sL<4 Q;GшpH`U:3^GYhYfpp8d2p]j&ν%Y 2HG٤3K-TbL%62QT}OC~}i1V5Bh 7mɉbW78[F7ianlIw3^A4IXP3xh9ࢴϒ1jVtãPo۾S;>\:Yޱ>=uL'SR0a5*ΰ{ tWuC!tJ8ڙ #3PS*1hɵg[7?I6m)}ñBg7FYլJάߩxu"/Zԅuڽ6 d\{X9O 2irk9FY1? ڻxĜ_ IDAT ,zi:Qp[I44^{o}[.GJxvX4L;У(2l5^?}w >T|+􆒻3f@ۉK/qMMs&dVWjy_\\ A8WUȡnng! zXwt(ছn 2[!ɡ8ma֡JDp{fwJuJJIUO|4P&`aĦf8w]5tr8eQt:ˈiruݱߑّy"jxyY28@C*&j0OX fyNDy?$IƖ{vasB(]Y ;YcmAP̷pHGJ7Q twy'\$n[gs2XhH!F?37s_w]{ΑID+d2 zlRrLpVi!c~xĉcudY+ˏ/I@+FhI̪ǘyJ)shqN=UrDوSTD5ϽX`j[@7.+"Nzq EtJ+}%t =H& {㦽*]Ȓ{q|||tx TVN܆ :x|w'yzp/ۏ1,௴-PM3BPkxWYƓЫRD|/msz>bu>o6Y< }( [o;QıbaaW]u%< Bs^#,^5ۥeI`?j1mMQ="~Qсa\̫ ɦSvr&(%F#>SY?I~,#5"`y ~9 ~'w]>}umnnVCWqxԡ6fpu!DQ%Vhͱj!u)C34gUE2uu2 6hϞ=,//kYQذL0Bq0s2RJa3 X˦ETJ4˸+9weMY=!' yknR\8~[f9l]1|ّّ'ȃDkD6XGZ.jRꈩcwʂP(yK^dYdS)ш<'>fZ>9dc\கkkW ˦UU)I~Bلԥ,\ Pv?~#[/gq\<\qXcZx->~A$,..r~e͋(ɋM6 OwtW%D6Y?[:]E,ҥ(+ E%6Ҋ`8 61bs!z!eexC  RY9ӼPdY+k8 SפjYTCZ[n5=\ly3kzM@-W#6D%1(Ciq6XgDIŸ3e1$CȈJT=gNQc] eimu9.Bcʎ?:4\DiWJ-H<(aB([C\JTw8T"tMQj0'Ep3a$X@(I^ H bD(bF5 m Hi@cPq$AH.\\!]VB`cc3;АC6,_k{M y-GkhQN=z\\v{/`cc>/&tmV,cGvdGv eAiyCK~ّ]Υi<؂`1xLҷ$%>.nN ]|[@(U+/7*NN^/a4m!~rc* 65877ʭrveHab}Շ5޴nl c#캪PRG%d]__)_EURgB-˪$M_kkk-"7pBGH%vkgn_v}_A)6( ޴vwU.)r=xdKh`MDs?#?3zw3E:齼I>1וS8m$q+^w^⩍7>/^.a \}SȺĖ[k)S)mx#e_a=rѷ;ֺkَ:{S|w^6xCg#_ʲe9!* 9W}AL‚ݾ;[UcR{9qQFmВmמ}u#Q*N,M>{f]99k!&L0[\<Ȳ̷;TDM"k]1F|65l]e+r]X_2K>]U7tz;͙O:ՊvōOC7sj;RbcM񇩴uX;8$Y s]gdl@.QJmq>HTjQ [8!wf}}}fD}XD٘a>7m·}ԕuI7]B#o9=1]=Ȏ/qٳǖSJP9IXĴ ~(xsdu-5qC+d\u =c[+$>۰VW7E|ZLRs}TBR 핤JyC(rХq:lq̠g}u `n0 ,C6:hܬv5]4u,rK8 zōƱn@ k|?%_6r<ԹO~ķFSEySld( m+VLy }ԻIqqնbطoKkY+׾eϜ mE.u>yۧZ@px_/W_n$"@?;ad=c){c+&H= EY 꽼F-?Kn_ w xרO2a"f1a[i\ _]!vDiݾ:t8)rfj.;RJA]y`d~~x֚`g<z+F>$& < IE 2KޡMJk_ۑّy"jxڼ+Q"u6gozgk'5%Ov6ްKSGaB+sā( %E) Bh%#S`u78YXXh"O^1o"(aAnN’k>/tKBORvt7qTD 0o_L| ^Lm)4-p.jR95ofrzz/~bm}swlms:sߖ X01=y [?*XeMђKicI%u82kVg>d2֯"soፏjە]MgL߾-[ ضο.Co#:^>;!.` 'S R18{l@P6{G5VN0MůۇJpMDBEtYo^by&o7o^42Y9XfѐѼ/er:cyi;qn kkkEuV*#R-N:jf3>[f}̈:1.E;w毸`993y*>*UךF,xy3cP~lllEKKK,//7q95uD7R $IZwJ)K K*󻾋o,{ua>saѶn}ܲjGgŋ;$k;#;VJQ2CЈ=,!+rD"&%lN3)X'QKɞ={Ȳ< !@:͒m.knUIYLFp<0A5 iLQd,NVR9ۮdeӂUɧo4`oof])h"fF1m^b42Q ˫oW>wK_WFO˿g;A1~BۖE 6-IPfȓ'8/-hQB!`F?*5w<~Z~y>2&4v \~dٵ֝OHɓUO Z4ig7Xr `0R1N؂?_s^t0=rSkIp/W$q|a[g>?xA~nh';LT_e>S(jB' :/0 ?OOr&O/?͓̭k(s[y}Η_ezK ~Z_oD9lWOxC2if4"2O}^vuߣ(b4y%>=(rz>skϣEbɪPft)㢔eͻqquefKsAdLmkC&nV(Ar1?Bpw3_v"" 3 b sss̛sj`KxW/("(??'ϲ fh]5Z&TYewKȿّّ'ڣ;aݺut;,,, b-{o?fFڶ &҆%brhcXgvrx:_Y\4!_~lNz;S)3vjMNvi6m1/c@nӦM=?KABC9PA6UUq-7yW^mݗ i6[b* [Ri&NQ S#:LitۻyEA, z!!l=Xv؁#8yeJ^>Yyӟ?<?^D{Xy/2[Ќ1hWV{E86UQ;ܛp*Ɛi 6.#RQ2h6iZ!JƺEA?~f9X Я2ݷy[ *jـ4 $BC cl>[ǹeGRVج*C&oZjMUt)\wMT$QjP SK`S݌J7 fTBPf ;ԪUTg:N`f.:GMzQ`ʦK?]$g@ "CN2pϜ J=GW@]۵mx~w]vH`|J41Os̱f(t5`ŭ9r~'/7.nw{&}#f-yWuyq/\ѸyzeU `X;t`s='l?Zu?yVF=zr?srXϻʳ9? ٰR IDAT]g0M tsUыM^< GRiٯ WjT._ÊR빓טnET:Nmf's77'&p (%c[ 3?Ah~T?"P}B>PqYdڵA؇{vmךCRxC 4i_¨z7Mccxu (mG!">3~~7^ biC{dVhV׉<.=%ʸbh*s(=L_8 2YSe<3RѣN \,V{aUZR**!TP JQrhFʙ=OW8]w`Zi:2YB6T0=0J=[\SiT~hE9pT,WP| _S(kz(N};~ZYr^ޔ~J:/^f-[=lp?z[y\2ܒ$A4Y{'SxڵAePV*Ȏ[^@TC+o-evر6Өº 9fNB8V,&7,mn6YzeSK*qbT>Xi2LfwUUEVbUĕ{S,cc݀,e phnm sȴ֜ر*k9堠,+, [vvkZ}HRr#l06)݂rK&XMIUYEli Ro|_/ 3m(r+oѰSw>PED97q'qdv-I%ujvʍoe(+;|AaA*4Ԕ MUCb 85B\a٣B{,z#rc׆ą=Ol J*1 A:]kCi)m!aJT`K# |Vh~>%iA1>2crq% fk`0 \6AQ2,9[VîX[T_HSD%#2P \n/}7||u-Hx 6v90e$)YfYϝ/q?!9),y1XoKCx1`Y^i}@/c5ֽ֚Aek֠fϞ=O4yxHZ\ 56 3%C8?T RMY!@!y\qUt:rm97Ń@;hny:o_ sA>.}dj3^k8!QNM㙡0DQ|}@=bˢ:́9|( 3TBa˖-۷/0lN'~˃y5(ȜrOT S$ ]slnOyM`Ԅg׭EUAa\]J[gKcFΫ^@$'Tv4&QelH6ۨ_cqyy , Bu~ˉ.ÙEj &9ijN@'21 J!qO<7|Cb@dĭϩ`ͳ?waxD淠5û04͹kC}0E#$ $2櫡eo)Ltpl=WY4==Mo\Lծmg^K%M2c(Cx};L(扃1"$.]Yۯ$IX\[bbr1 /%}.DЭ*>OƑR OҒE'd_ DwבX}-߻#iPolڰ{"iJ#IܷۡH0[cƨ KR35XNdiTjqF}ȽR, ZVH)xC?ھj "|Z TM>MaxD̳Bqz!za;)d?:<1azيE %ëU{f9aJ ~G=oU=ߛ,~ULSJ~Wgw[f=yNQTL't& yk$ڵVy㦦`2ةOMjvZ ;xWPUԔtrӫ*bf݃R]ܟD߾a~~1J C !}4\3a|'th*Hfv ?x<疛n*CCg]yE.j٠U_iܽK.$3u3qx+hQqD1qcömؾ}{-e iRV%SS/SI@ ('jSFiJ`iƍٹs'J)+|Fj CT6}5ظZb 8)/uT,FsYxyLTPhyt?4*(̯wXWhVh~>U?vl ,9kRNbFByxh]nG ?PJGy=_Šic0Pdz>x!ç(*à(_ ק2B"^.RޅP .Ro5"ez03ȍ;6>fiJ90=5Y@h2|昚&"Brz %u>я"?o_e7Gm^jX+O) ѳMl-ڹ=yZa |}(8WΗkMخCCGЄqi))&&&ؿ?"B"Z8z8v\m- ڴ)`wn<5 [P4n&%N~FTazB CFߣVm6o5ݫ¨(FsS,M1qT$βW;<'ϛrZ;vpM7QT=u}ֲ4!#VIX~,gGE(;fs; cY?{G? /g-mf͚`]7o1f9[?~S'`' T'PV%O|Is%UP,<{W֑TEPjiړbgc %CWFXY#NR,MIްB+B+H=qf&R 4O;.zl#zϿc5RN}rZZLʃXj!98%KFmw<3rN@i1Q>P|EשFi 7\7ɋx< R^s dG(w1/6mVg SbQ'%L/'HmyP*HYRt={jeS5lcZgqZF|>/# w:1ꪫh6*q,*ԮXF" li**1Ci:O~fħ s)~UIR+)L}wܫ,/ȿF I>﹑ SIR[S=ٖ bg޲kɌikV;B8w J+;f7/Q %_7ixnLFǾQ_W[ve:@"c[/=-isw{\IlY2֐(tᎣ~`]+́hZ+tX/nRX:G _x|M z|Q ti 2Dq}Xi&6#%jVy ޕe fF?N U$kta sR4lo*}fa!, 2"G)Ρiѽ߿^ C彪*>viLOOSZeo4IjjJx|~carr F4_cZ399 Ims3aFfɹ{Șy-^[׫}Zk26"7FvۆZZ_e?f!Q͵j2M9&s]WV`U@w̫Y\ pl99|@|%j> oHk%t*{DL%\Tf3B7Dh(6 -&߬eήB^r?V7JS+x3ou|MB;]{졨N<~J堂1sWUU-z`0qV[U#7A׋Jѭ9tUyvJ.l%`0֬qTUO?z (4i3oLѷWOݡ~4jyumq~.6cFwGXacPb#'(lL'4qs0Ai9ܳT0]ٱҕ?inI3X/ U s=ћ?Nͣ$NN;FM&~CokN{͙ڻ$~Sօee^N٦uE Z0w0Tos9ŝjr͛7_{RXa-ӎEY %UeaCDE!į,`rCxYrh8sX3}rOeYu3Z?>v=grrv=m1u}>쀺)bk56={vSFwϹcaa!s~QZ<  ~n)}׸3w97-oy K{#UQ.Y'J Z=y]v:ckSڬ HqXU5G,< +i,QK|Α9ɂ9:]r19$Dߘ1h9; Ϝ 4ܴh8@?uݘPڀM"R-xr)yΞeuyߓ|Ð4bttW:4W2<7aT:K/4;]Yt@el$3+VHv&IcAӤ18w/M?5d~ TA~ړ1pq)I4#d~ptca56NNоu$ꑏ=kP>t;wi 8ByTC5za.ϛyÆu0ckZ4͐C.jߦ=u/H=k!FyA2Ý"YgŚ5k  {I.Ow=*,wQms E7T"Aװ-ԅ]>B8(yϣZnx??eR󼖒̟th#=Aj{(* *Y} x|Si.BShږsZ%T.Pr)$?ZWkײnÈpQ{qYI[->5(Ü]e'O>;n x46#w^B ӄB 3Kt)"0D{#ʪ2<(U,>'VVku+ߚ&;g~ci-Xvܦ&T:MH D)*SS[Z(}|rr֗28RZXX I.2333})~…! 3338+֧1ɉɠ5dՂ PS;MڔFccوI$:|Ab~ f dVV̀aVk8#<6K8#՜jNO4t~Ƴ'xgxVA0/!Y0=92--NPR٣Oz070\—R͙ >eҚejIB=CÁ ջABG6gб 64_sSFG' F$13\ )fW  *ʌÀT ZUEX >fPT6U2EQpƣ0u tjWY(uX{sY`JA~Tbvu8r@ IDATX&a9VnX̽;I1)y֕VA~fZ% R$J% {+GUwA=C#_e0RDe^0kw{14󔩉Z Z qk{yUb^\/v{eی ؼJ F\ q;brǓ䙲ۜ$BY4s] ?gܼheӠT(U155@3o0(zdmgw\A!)"@ި/aN7m<5BTnv^t)IVq(>B@"*A%ZZjZ[h(yw}D+D+0eT% PbD'Y?R$TQѴ6yNl۶-cC $ʀcʷPiQ1hw~_̎wfZ[5" S@,I\3UeiS rJ.iyxFRUB6&(RR}@= ?gĘ3\ج7?.PؿAʒ'>L&͠\,}$EQR61Tnz ijarMlS84>.Mؼ؉ҡ?OubQP$ ^$R B%]^eY2??ssslݺ>;2 - Z(ĭ5`Thh_|-v;!Ȥ`*noؿ^9Mo`}>8R+ nVhVWS8De7?sջc-ΊE+lHޅ VӳBz0$IV,ѬCABfn^kwQTg84M0G}±LELbHCpYUL$:_9 '!?*?޷p*LCOj~_q}{2Qd 8{4ec8Rf>V26l ]EL^_?ǼC iù(af2ޛđpEsUkX͹K-(.4J~`P#qL$!KRy#0PN3 @Iߦ 8y%Z+Toe>r*F^]( ;).GmAeaa~JV@OM, X{4hۏj$yS3k}}0 #X/,W2ưvZ?.Dp0gw\njoYDk0աm7b@`x [BxXr-s*MuV+xwjYxApo v>wq!4_wu ^ܰa,h5lA4 $Qa= 罤, VݲUף6]He ¢#6Ph]֊)G M)fV-iSUU9\#xε"BHҌ|t"Gzf( "wqW\ q0åTiQaG) H,.5Z.re-q"y37;{s?V *X[{.,) *} 5|)+T)]t-B wUDY>1rP)E @ yP#䙵4z9},%JS)8G2Ax\^eKŕY ~P|(x{lj /<`]:5qu ^+{"w"ʴGmT)KVmT>7 ?~O֬C5ñ#ȈSe˖x)4MXcX~=sssyڤG?  Vq$)-Pq,c׮]HME2>JD -בG!y_ҰŭmgՓQyuxΦ0ovFi=ck8!>Inݺ%M sAe}qG4Eeׯͽ/wdg2r̊~ L9ZcknP/sst<Nc: iu@zꩵޣʀw^o@U /}˨*A+k%?t05pNndBwtmK)EYYNgz4o( ʪƎTq@9n*Yc]Ŋq}q]="BVUӡ}`*SY˻pUE+!fpl6g12,K˃ 6ybXUUe }՜LEVJ, @;䀧q Xpnj0qVRoM܁!6T^ɭCsG[?333x d9ͿLYDLNbJ9VyZV&L_g\̡dYF>1K i}Ҕ$ώ[xtY*+xo%=K0a2\gnHV(lY2GF ZYk2;!Pf(v Vqs$dwm`a'pX| JKEF2nP@3<.>Z#ϲ b':U@e#%Y%vY6bj HNɃowW9W컰ݔ!1 7I2`hZ311}ƈ j;uT(4SJLeHY;~y:<(y}2WP%dh6wrT瀎)V8p 6?яjxaOc0cdS&sy)4K/+_*M&әs|QIel= ̨֚,oX~|o>QA9~;n7XbGQMv|IPDmJ~ϥ^ʪUl;yeUQZU y3;7=xK}}IPd$ )h=3Pqk%q9ԋQXE+@e@@k.w}t1ѮfӞ:5x߻G?|Znza)>R6033!F#yb :}\e!` B¦@M27zwT_|(^#J>GEyBg>i\ NYHPRGP iH -M4-I}>>8vl}ZG]=fUZ۲,sZ355eS4FK[ 3)V^ϝ_J5⍎Z2Cc|{w esBUS1fggC;G!I\۴}Z3So{8 X*)=)R G #_{a:y=.R__n:NV,D{BjV:VcˑIll,i45hYͼycJ):NͺT2W٤N>6 ,xM MRػookUg3׷ݶ)!h5[,vu\{^'IffҌA,ѓq Y~3 L:)Nv$D@'A >JO4&:ĭcI} , 7n e4ު,i4TDdZZ?}nBpˁe6J||{9H"^OAr2 @Zb3;ItxPi ,jچ8/Q]6 ɷ]y7` P?C$ ){E 5u Gs[\z +?Kշ^HlsPe)6͎e.ƎJ-Zue~n1`袣{}00kiatU _JٹlTѲSg˵XVJq\ *A) i3Xcd֟q|nO9rSAr?Sמ`1[ER$àtJus$Q% 2$Fxh 6/Qf(g{([ߘ>UZIYZVխjQև)ZoyNAET(n8*+Pae,]k7(c`͠,PJX n'IBU!xU42hzrMnڝx穏D(\^JZ9\ʺ 1Bu'*)c}gpP?!ꋅxoU,:>{qq[}a" ҄tR96CFuHB>Jj˽Ѩ `/¨SaGP)^A63`wF.`Ve m:]EAe };d/ܳCCąFGNXWvQ="nbbŅ$ v xgRZ*}4 r饗-+m_n5s>}pčEbfnSH5ٞ`͡ ut/iCLPa@"R:mi,K9dAjv@_ZUTݨ4m>񿧙M$Lp H(YQ&ձ۶mٿw"^,˘ PK>k ߓ4TNc}ᅟVH|e_+~1jyA1M>M j@[`LlT>ZEU׎YsrzC`k?q'85,Zlj$U6@%`K@ړ`}e=3)b}7cu|] Tq$I|tVV wWqz}oH[A08O@6vO ֬ ;0|Çoު (7{짪%8%^%[ʪp)I~@WVS\oߘyy;&^s\m/Z;~Ȧ"<N?:'ȵwݫ]`9b}gw71zamrrv 6mw"/;EBkV" yqF˦,5ɸ1,>/7Zive P"p8|\qt( yT>.$nVhVׁSwU+^JJT`HeYQ%q/*0J7\ ke$ip(-兦 H4<.: :I,!e5|q9zWǕ'AB"i.(/b(g,uV Jr֢ k@CuZO!1^Qv󨪤PiNpϫװU~(IApW#<qmi'gC=LtM0O-ƘQkald0Gã:?P%MY-Tg՞P_{ &r`KO4$)UiD#CEEC~ KkTO,1yLhS|M+SsQ)In+fgg4-yN$頪6ulWDXJM2,D kONd*PcntTư31Ϭ?7#[mә1s;~@T(iXIO{d {xCvDMQ';mcZR4FM,Rwki.q+3vi|_ AP)i 4Z7 ')yY8~K !=]UU$:)^X^%|n;yz?2Uk/o^yƯyƑUƀRG#%^ǻn3n'ǹsh\_(6kppJ|e5R_L~b?_u7/MyR׺Te(x$r:OSԑhfTclhX)o玃H-1<ٜ.YZusE*oxZ&&8dY׬@frϻKKѨ1V:(FhCzEۿ6v{e*iǭw&¨DǤE5*T值ՉLi*L9ԑ#r7(Osdor!D¨m,RW^n:ffIu #F50F6(jy<3vjt,o dX t5hpt ?V@(I˪sK ݗ<c~aAJUiܗAT#af_?KKvȒ:, X4eJұ`PrW#s ~]5Y5EռhFE;n%'Ɯ"3qF[f2$>+ V/\e7%Gس, HjJM!ǂ@&dt^OFyf;]~.e5oRB:gTFI)EۧJTnk'r+pܹ3ψ&~)ccc5Y5Y_Dso4 :?'1>6TPJbD XrWO g x6qrVmHZg8txي T4،AJAo zСxhYSsPJTT4i#Ҕss҄sGReG)<\%yD"9WIR sR<2k;F̐0e:E[nǍTEH'VNh&c|z0lP`Un/G}FXVw(A/V#OQxr+*+@|tnGq_zl=i_9^ii睯pan7N:[6DZi9 oJY|_>Ee*wzllCcHw#gD>ָp߭j55_+pv{h~qLUd.~}WCi^kMZfg9[FyǺMSQ1 Z}u,8s`U6vY»1nV^ #< ,..%ƚɚ5[ iCTְ~$ssNw{t8%xx; NsS=Ǧ Ok~pL=4]7%D @}pZ)#px9'O\ʋb|JKEUI~ .d3\Ucccl߾7Zj,dv+/y<*osZaBDxZUN rیYPp5֗_W\iYN~^r}hQ| s3g0sRs^v$p^5H>ݩJ xx/7Aep˱lL%TE6l( OMd)Rl>aDhr? I|G=Cp8>W} .L>_Gvc)lȳee-n:/߁M叶 ױꆏ#d !mέ\W̃PosUlF KݺSpS>?<߼ Akw5Ɓ[{Wq|p:Kol}=iFď=$ a]0· P2)e5Ə*ִ`t8~ꫯ&s\R !S)Eȶn?g5xf&}uvR5Qq(9ްa$/6j9:X ) \kerҰ_ލ8w֧X(8&6mDۣ~\M=k9c*$n~}\ ]~|3*Tyc%\mF郳h51,#! 5 &J04SO( s0FGť!}뭷RD%&F5YNeOp~y+ Қɚ/ܭwBTN<^G*] u/.) qo#v6Hcz~&%ַs$RÈ$: *\V)"qCI<~K 5њ7ھ̉b)KƸȆFR!8-<(74|S"hT>2ڣI4Wr@b"0Aݻw~ ibS4>әfaxO=pQ#€v r}Zs>,La}(o>Lo%3go'&5VrzƸ2Yʍc)Ç㘮 kFaGZ 1ޭΐVMރgn#)NB WFi=bWVR+vJ\Uk,KiqisݮC?/8O & cNѣs[jٵn[`cw Ǻu8t!=۶mȑ#qݻw/R~-J8iRn$^p;[(Z{MdM~n7$1Ј8)[UW0fw'PCkl8G|gۭv]-y<2)o;*eSmL5,Yuo~rz"I,= yduog'ox-zL6##¦Ȗ" '8،}df#"@3ҔLfXkr"Ub!`0ʒbnq.ķaG!(^/7 :*=5ePQ6.>Bq'3|z̀kYBZyJAoG7+GXbuHDi[<\ėKgl6tX9ufoǹ#|Jsք_w:_\!ڃ1eݺ{#X 9E^w'?w%=ѯ"v-/P{6gOn*0`V"lЭs]R= tFM籪K%$yگ"ZR DS)eL3ވBy?-fU)˓C-5b>-{Nʯa(. 蘵cAԕ KEwm4au{QĢ(`a~>~w"c97 [d\3=b0aCmyΆ b}!2v)3w}gE*S6`'0YEtUE#|%VEߏ{y +u(k8\g<"zVU􈖻Df$efv&@7 J)Dd1$UTmՕ;g%RP' ř<嫼Q.*-:>fSA&KDv5{P5CǨgv}ǿo;d 䋛Nޛm˛w=έ^_I\,_{̶\!qIeǣ'9ހƖAq|"Wo`8.fGY_'xDJ7v(ɯ͸>TKQfĶ~*2);ůˍq((\CF p?Oϰb< kAs .ucm"HAYP Jb :`, :c>5F8(q0V=SsƈRbsgzzpbӸafffíVk91Wxd7]O㦱f0ğU`Fl=c.pkpuѲ>g?^LE-nl;B@UV(F FT`uMF{s IDAT1{k C&rbX;H@Jy{,^z)i:#GGctc!:n$eUQ &m!u&g3ƒgRFҕyJ2g[a`< =gaqka0 dO& _N!X\1aiJSIHr XZHhDeZ U]}=R 胅RLţJTsWѽnv1 ԥCkOH} gC҈|"OB5 ;>K3UIg)Rհ:Bo|-m/mGy5s&Qp4K,S{tׯg~~>M4CyE^FyKߋ%7= %˲ MA@fh{K|m+4Ynsj|NvMdMT[ 4O^B0 Gggh9♔~Ϻu똟iz0'gq ڱ׌WfֲCo_;0'C;`P,DX*k0En֢ C+n;|G A~g?ǹzQ|R#2)j0 ,'1|_+GXK7``}:Ek A骽T066Fbvv˴h]t*ֱL3JFSxYe^1鼔 (>%^5<~Mc.I}\ i[onYLn$ձ͉JкpUpɥg{goZF<^{]K<[>Y155,g=uY&b3z_7 k<7lw?8k iGrLTPfq RXt4p~ָPM<ڽWJ5 V7]յ+O&]w]yN#~lqQLdn&ZV9 db!2J'}cG?Jף* KeX$nٷ@]g6Iۼ;Yfc̑$-ur*(nqRT=NG<8Wʣ Pˤ?re&IB+k[>OfPV;0aX0`sT۷s0 lܴߞ"CVX} 2/WbWJ{U]R/*n!`#s &&W*T&mųͻP|ZH((n!8Kɛkl)x߆| Of3gq3s,Oy>=qjRSSLLN0?1ݠa g\lχ1͛7sip_95K}5s{+:ti>cL,Wr4µt۶mٳgȡ_XX MX}0xFntJT\F']YxCt腺.S9ɚɚ疻7ۗʼ2F I`#jR~ y Te ]J+0xw׹*z;ȾxG.m R9`vhxZp)0P;(EY"  |?'˳u F͉lo?Dm#M+i (1DoJWԇ%w0z#vQ  %RDLҒh~6jq Wr}Ę#4eQJO=*(}u2v/Od/OY}$E节RNS"x&h] ]>rmQiJ(I2Q p}[ZGklfF}9@$MeFBS7gj\@9 |1ƒ&` 33312m0WUEz,X"ggPiLOOzĵe*$s9bܹM$ienod`5 ;?O>M7w~U$D ߿nu"EMs˪n+@YdYsZ[KV)T5DTF&[{Kqff|P?:l _2;L'4~֒d8J)$PilUJT8̝z m{np,.yP񛘘`ӦMܶVp ?S˚ɚb}gn3*3==͗sB CyUMORo~Ὢ44k2RYPC.Y7Ρ~R^_5IjHOeI3*lIlC%{mB$_[Vh!$mƊ +J "ILJ>${hMYj_OS.#kqnĥV"1#]I HsMҘ`ֈtGb+GtB׶/ziR)%E'm0o?0X*( SaP ELJc 5N*-Js#wKe,P;\DjܾnfTt6:8Sx26nw[kXHo1]5а,gV{aUBiʝ?iVk5 JЪ [wm&YPW6(UƛNT el 8?yΰ"ٮ ֪6Ra{r< Q A^_:]|gͧ C[ºҌb B^J\n rb$O(t $? )J)tY!!K Eu8G"a۲>>] 1YRb_4pOp4IhZȸQ hmhD;@94w屝Iǃ}Z0veAhDt%RVn:F7cuk56$8 ヌB蛄m~-[pb:[HCCeyן.Q`\5Y5&̧xcϦMa޽| ]ܻ_7\B(\yOÇF5)7c-5[Mżc 簖J7SJp'Id[}*z a YSy&RHnH2~f|a=bxgYAD|{uj4vN9{xW3i2CȌNn޼9*1MGT3kgJ<7ENeYgZر4mqG xe6#-os%Sʚ9 pio)]b_v`#I2Ƌ.gbQN#Ҟ7+y^unVlM\P>?3v+~zY >QUè攇 k]ޱZKA3`m۶qNi_3,-3QdYbJH7H|9sTUֆwki='&5SZgtu(=0ҌI(֯_*ʬdP:tO|EAM"E6;ǷQnHcH3nvڭs3I%pӍ1jzf5DtgJ)hLMMD.P]yLwp Ke^:lٲ! s5Y5YjrNF{fl006!\),XXXbl*_=6%x۵Zc#k@$YIײfJHwlUUh-t~B #MŏTו&IkR a(4V3L>Oݯ- tgll陣 !gp۶mLMM yC_$iJUo ]xȦ6hy \,uD.1.-}#d]{?I|"Y'IBeJ:=:KvM)h uΑEvbXu5é;%>w 0uc.6^4}Ci\~C Hcll%|DCP{^-<.1ut2Y+(J&D-ݻwSU4"NQ+^s6k-xr4W"^iFumtaX51o|)pSF]h.Lx-WЙ;3Sx~/;5|\, W| \ځ~sw'9^f4 \ۊFYZ!F\ppZBÇc+Pyj΍aXi:CJD !5,=R[$%A H,OW+{^ mT#q4"+mʓUEȁ7\v+FOܺ\K^JƒIIGY6o`I̳PщDP-@0.D*[m,wv-g|' % ;<\V,HZpéc~qa0p<.ֶЭ>:F57od׮] .~Ν$Iu]uoXs쐔Eq\GJp 6˪5O84ׇQc!xvi[,\MDZs O6mtt(\eUUflbsH)yS‡>cɚ5s(+p:%w=@\,UK^a .J4%W(*(nca\RTu]V*qza=L g0:&&& IPP$r `^ZX$KW+rHӔ1ka,ciii(72 9E}"_7y{{ȓNk4`uYmtX#(z0kT"U<QRq{X,ӞtN;}q%i+>ֺ|VneYBsD]Xgj'CԄrG@Bs pE~"IRJJ2] dz(︝nn|5( yp [_ g3(mi0aї/KӜV 6.,b՗. J a} ).SSS..ЅCkTI5]n}J6ic@:W8s3ώc.Dy%5gtl6Izi:F#? 333\uUH4́,ٳg?xݍsʎCΥdxa 6R,s Qw^$~M4pbԁ\geVk֗Cs=oRJǏۯ/Rry库xu;UͨQr'ڟ"GYˣͧQ *v,FtEKә(4r<,֙iQKo]}&9Ut%c:+466FU TMQW nwAQ Ȥ IDATFs 4`rհ$8FHk0ڼϦ]?8u#m])Ofzz{TNO/Xr%7 x9N;aMdM~Fp Yz6 >FPh"g!*Q:%::sWP ZyN qG?|c4뉬D܀-P6qP!|o36p:06Bj7n\ѣdYB ifa4,tӍAC$ހ$I[`Ϟ=H9Mfw#҄3L;C 4H9(J PBQf{!ƟDYVHؼ+"< uTe9CW[>jlJ˅^ѣG_!*,9̂\y auYkglm-FR| A8+rlUHE+X+4ISgt]TjB %x{V1Sc78<> in5B)iF?s>8O$=z4U4DG%·0T8L3!,I6;Wxr@[2<,c40[,YqsWRЦe/#{84Ykaaa<dJԬo8M/ϻZ]"s8usPkR_z3ɍ=n/8ă7iM俤(`?~Ѓs߭P<ʮ6ᔓ(XaCP|xa? O3llQTRޛ[vTucN$$L!d $ QG@q~ AAA<#BHBHt;}sϰz9v'^ɽs޵kW]Q4ezzBABuJVhjT,]`:/V kd rp U!ӄW5,z Z1K hkLI)Ҹ-b%8IVqtu ix]QLMM1r饗r52:zpLMMU&~u8,;Rα~>M̻ɺNS9ٓ,jUR@ֳ:op@KL V:z+FI&)y3;; 'pXz{pڛ ߽VI W j>CEQ𖷼YW_9ySq{mO, J&Uƹ H\9DItw S:@3cܬŬg#q[N}o~+8<|*`7j'uPH5gQp_$JS Pp|Ƕnw !sssU"[s>sƱ"OȜR8rklgn{ a"B Qq•X)rkD6ݭճ$ A^OVru߃THQX,YI#$%jv; \ ?i*7MS$s6V?m۶UIR^'TwShIS(p y/QWIp !\Ia`ͺdL;HcD (vh]2* ^X"rҔGŋ@Ee.kK1&F`qE+̣n Bt?@@QA譬itxn*@Kz[ yg>>!72%֠p,gBZp&-˲9 ;]v~:9Aw"/ '0zU֊|ۭ+obh[WQ;j55ygߞ#GV\\*ADpo>ꄚv57n( >iN4ҔrZ+!CUZߓӏI 笭!~eOnP'󃲯) PQ*P\@8WC PRhmLКVc@[^.T*b!)pO7*wh͵X+Ah3+ozֳxWwFju!YuQ-[xΏBtySzh+1i )Ԋa0n%[.!%\b( 8v })k}*YƗ#TD֌)%6myU3WVtRKD.VJgٟtR?#J8ح Yvɀq=6a!y+wMx=IZcz-ԅh>{Oyp8tTFT:؆jz2|Y4Q sh=4Ig^x>WbK!o3l 8֚uMCDŽ< /9p' 8B rFq9xQ6~*b۶mܱ(+ G{&#aG4uZA5pD1PJ3^}R+P*BiMatIqPhxS{[kni쨟سg`Lj%avfssNpkdka)Q1IZCmEa걉5 l#fl>GD$xuhv ArscpT"40#P#2r礍C\˒=>O6 MX#o)ZUtRwf MAI^;W } 1q1ؕ"-&{2(ZJ8My3ꭥY!yX[QUlq\UM4Pj8D͠~En^d=x *d^v=AcֺpB`Æ p.ho?}#B`?Ăra®NWV#5| hT + i$S%s E@7``˖- |Ҳ p9B}38'JTETp]:3;"iIEF%/. Iak%Mb$ZR8q8Ɛ)lHY!ш4j5YbEEu5v,ڰav%)z}f魮"֝oNdQ)'kY,R)yBY=Ӯˁ iY<smG_%KIM[kzÙPnLm;'ҍէGiqN[:Xg\JW˭5!F.U,s1a1Us᪫☹ٍ,..1hS9 k^o!, t+)g6%4[eU nNX8P~BV!:w\y啵_'[riJ6!?'f9GӚmk~Bӵ0D)ʼ,RwW'䫌&p̯WxK>W9u/ɼQ~/!^7s#<>7QX,3اGH]>~)?_{){r>c^bG툚=rTRXl+[l =z5\&;I]5sU׳[,YǶ,K*ReA "_\&NhR8-r3*oԡM$N޷*yQxȃo[|STçBԱ9ՕCDz$OT̨ȝG2‰NX*L@-8$q$+-"9tw>#yh 1o*Ϊ{g= a([Hz8FJ5`Mh cәnWuq Gj^k%2:,#u"ra|lڴ={PݭNR'lڴrl¾} :rs <np9pCzߐ$܁֖$IV"h0nlܜȦ )#g_|S'm%dx\+C`oI4T[|'Ͳ{nLV3M .ɆJRt>^̜/ܛx^)@hKNX4![@| ~^Wost" ߛ?{WO^E摳Dgq~=Lq?g.#'D';.C~=+9 \q)/]M}9.*gGK-4;vkBtgl_C3`o2C$ ZizS{X0uFJOj~$-l F"0^(r-[s.D# 6 %$hZi qWM[p*U@$SpPNg iAS(a== MKMޜ(d~m0 \;]nFn|75hj]v~>>l?TgjjQ`JGYXb&h%-ݵ>{"dN)LDhovڱ%jka]E Q 8EP7 0WC`+2+$I|ͼ;͛7~^9J5^Ɂ [Guȍ\M̈́(19Zk| b*JPxQkZ ߋ=C{E4Tw- M][={TTJy *ط@}*7; BkdoSr߾}; š cו3.BJ$ $Ifokj tC\v]pD0*(d.cPJ-"aш;wPb0H z(XU eb!ldu%\¬WW[ Tui kPtP2 ؼy3HT`n^D0NKTG o(+֫twB9ݵsy 4W| t?/}_{8@s7UN|y1q'ۊ7M;}$A+AZAMp[O{rJ(5@YkCIn2I\d+rkޯ} pFs§F9TM/%!-ڀ`:3&" pnMgg%h}V򁛜DP:N^ū_jLqEm,V2Ggݽ"Hc$=rpn\-R(/QQ.SXʤ@@+ɔF6)z~=X,k(, 5-]>I]p.T2,4VHc8(QJ ߒ9D`%N9D0nu:yZjŅq͠:bvRG]kiuI'PԐpoǮ}M`QB$+E]!@!wk("h4ذQ+[V% ZGc%ލ ׶&IZH"pL͚SeRB=u3<áv*CA?fI*Vi) DUy׹KFͪC= Ƅ~WbGC5hwvϥq Zqb+޷ױt<!< Y.D9d(VCkf{ȅ` RgXESvManv#,%E-$%Uu+H`10!rԵ4~֢C$y(WM( M]b5RsP26n`84@H(DEu]V[eeuFb @QՅŀAh.hL˭? FVzz8jVI$%EQYZY/zփ>RU3dVStva !*CbZFEC,C.֕WDYLq삜4q%vl(߲:bJ"˔6(45i+LY#a+J8as#m !o}[qȓBm{QVoY96QhS4w]EݻZC#1mU'Z3UlSyw 26m%U*!э)辟Yq8 ;n^!aMhR"5#p5^8 Vc([%Ic;=<Ǩ?`ffVE[Q^36{\gr𣏕и̑S״qJQdȱWs/_B3EoyDZM>'b Kml}?]E/ijp;?|_ &gm$X܈|]z CףYVhz쾌F#v7LnGeADJ#SʌYh௵^5s_[du8钱-)rDZppTttdyNE!uiKBIz>bKӚAu&L6Nˆ@n6- I;Jt} B3~yTLzi͵}$LQrI zmq3nVRr7;MvݻbT\9(XXOn55\ uM]0'4́wk? ƸAAcC337w}\ Ͼ_y/䥏ۄcx3~g}\ _w︃Sf~Yq ?me~i_~{w׷}uW?_>9%)N<\sxq RLpDH%BѹǯizCIk _8gr»[sxޯ=ZGDّ/Gӈΰ%VheƢͻ.h$Y~Np'R- uޔgre71 )"9ٷgGBIti?s=l}w`h457NS+R76ِNnx;3,-pmS$AI$^*vM$%ٿN8> VtJNER{5F :3{x}\6(Vt]\pWjYO{vBKMFoR^_CAkc57]!u:.[BV؛7oۙfUf= ngMqx&+&߸.!^՘">ߛdfF'c CJ{vJWȋ:vٻwoU`r PL`2/L~Gv;9ط,zT}d dWa~ܱBJ[kG4< =AHp0I;%ª%YeMNޚ{kҚ=ˢXO&lR/qiHY>0NNy],V|ƩeQڞdsM_zxkaλ>?|':̕ rlq3pm}Xa 8ac {6>x%4r{>Ƨnz/9 qّ}j=WKOVnw\oQ JJBbB}~sҩ%XEb=tX]DHe&iN xHE.hf5΂nj%<,:~ȽaN<2/,C)) 셒hVjXu z[k]SkQN=RzFFi pɅ1T~TxV˲~7|shFl޼>|CJ^)c:Cxe۷ogUr M) _WG\_p1ox/ЗEwbLp3Hr'?^:[>¹7s|6օw^Sy" _?;nؿq>G??]-;Y~^sWv~=J5Ir6/"SZ6y#NQ|jI$ض} )WqOL lH$ aJ,.-AlI4 U?o@)W'F hCcuaǽ)M]NvfeyEY?O;MY1ԼVeɱ_hY~Nŝs\%ӯ%K69Y^ܠjrjsܢ:v5+lWmki apz=놴o'TEuƩrut)Kkyrw#4PK婱>sT\MQh:jP-'" KDQD@[)cעTa쀪-X(Xk>1U6n:("P(Mthf](\OS6&7aDdr }.4QQNOOWu҇}uIF&mO'M1g9RDER׽x5(\re(BJ8ncftP7uPF(_Mxfb Pkө$Y8NѦ$I(vmCk05R 3E AKEgVr>]%ƍz1bm5&UJ&֕UHkzS,C *N+/?6父^ (Ơ [δ~ւFy҉II o]R1f~غ,A 햬?jd!HY!)> ڶ~dH[mbM6q7I'JVX.#׬-MDiQ9fggɲ̡m , yDD)e:~z =\-2u%!FX(Z}aKA^os [U? !JH%0q"B% sO>chZT^1~{| v(^1w(˒^W2=4ZBEHײs=8:|'fwN՗sǷH~='>f>ȯmn:ow~G?1gw_9ne*x=InW]|BM?g/_Gdәw~f K&c _psQ2|o;(e/'{>󷽝wII;͠?Dm@&ZY.B⤢///WFs8u]'׬} ֚=))_S,J{h=PGs8G;JOHdXW5mB !Dp($F.P=< N gt"Pr 5IQ %qJ;$;M8׵p`X#­ F/QX3 k`m޼B$I*m=0TLIx?LN:8&2V`VІow)'n{yN_xˍ<|oi!Qm{ >n} O:IU+۝;w׾F$;=̔DILYwY_@mxAèuc@Vcuk6;6>xF4td#x#hbnŽo#"Lyj@H(Ls8x9Uf(9گsڭ1 .f"_К䅶%s *v 3,,,tDJ1A9?Ngg!~EQT  (Q@PZ)[ZkMjKGN%b~:H)f}d:B<cs `,:/P(>i`]02EE^^^C,DHˆ4fwHLIbȽ:wpYx [9_u]Eq=s!WšT&V]d +6/P]FڊIGAP( 'rŷ٠x'BVb0\m"Ƣ&Z^߃ƅ%QQٳgO;!ٸZ"yA5M+IA XXXp=q#ƾsuuQ &ռn)%eE'z%%%/±v.Xn~1b]QQJH6 Tϗ:`ѦD!\//ёnQ., /\9S}ܧN;}DMբ(\aF_"X3gq7|uWK}T (T(%_yxJ7Y O> Ê5>?==r(QJsΪUӊ%uV]Fy$R fؽ{i0iB3Ef`h8I8#c5Z.f#`0blڸݻwxԣ.֎kqiZUwNqUbhiAkTHwjxXFXb4{E1C\/Eޛ'yֶvY'֪#^KWJ[DJڣӍm؉>OkGc]ESZ.ovNYs,1m]nS {U]cs2ȳjtͨl_>cC|->rt5J`YljrgA IDAT1\v t6'1ozKi 먦g33Z)Ft+^ #۱].Dn% G+ (ظq#s _=6mb0TDeȸ=ZC%LufmQqjoѝc,:,رc pe)-y>٢f7' ZzPkL}ɭutC Am#B8q$It:,..N_7(f`cT߇Z8MVL/OTXB:-W1**!/u ɲ6αk.v"G/Y!cXڕDq9TC"qXyG 5{8sڵk,KXV1ATwee xFY_boD"U.SN#Bs;Ȥ 1Oଟ&i\ԕJVVVXZ\(47HTT^xe}ltZ  5t8 h`0Vs YXX/bMx1 7^{GkQ'ƻ<0Ũ KpH9ʘJ[hľdT3TqlEWn:P!޵bLs;k<}A-4JKC׮o"fZ,'a^< <46jZ ?Vvr"ZŽЗ7*f rMfOaL`;HwadTe]7;!| Ħ馛HGmB8Zi 9C ÌaVppRVmPǵfۣZ BJrC{C|e`# UcJDJ j =pQatX킲 yS cKҝ{$JOqmJI#זEy#W0C38nۅk.(αJt]G&s^ ({v+K= ۡibiee+֊ EL,BgkĠ~rgjqsJケ04"=S@"JAQ`)c6n$ѐ(M--c%K6BHKl۾T]s՜ٙ .iYf9Q!ꦃs.X|c=/j,(( v bZז@F"N.P4hDIK$6Ƃo'> - R1Y6tɭVH ʜl $T$IS%m$!ݜ%%yt,+\RϻĽ<G(/AũGV( ւTqu8f0"2.%cNZ(r(A`!2ִ)VtJW%m`Kaӵ,s_^*2\"Fcb-| b#d$JDRȪ  l,%EtaDLufXFB;@KYhL[]f#˙g?Hc^Fj`AQ#;a ?ކ*QJ!uCXIR cd 4U4M׼'UZeIinM4vlHmTͳtH`lͲRJq@Iw1?$X(MxQUz(m[ ?x?)ӛM[* {YEm5S8(HNﻳסgeH+?GDT@jJxvV]F$}xycƴ|K\g}6K.J|8jG5s>,|֖IVa~V%M<{`iAzZyDMy 8X"T{ rS!)HxPgҩV[_$&#U|WgSJ\q ěy?~>/rF :/hJ஺.+]sg!}b5uьxC`WmؿҩS:G 5ŚDS4CQ)ÎFYC\X2sj13-KKSΙE٣("81 \' )ĪVn"#Um߼Q)T"ɳ82 /TXo[nߍ;If 60  Iqe33w&wzo -e,_@MQ [DM'  %o$N{/Iٺ~TUw3̝ 2u{<-[H[@)&9>?&x'x}<hQQU-wI~F-fciR:AAʞ50uhoJb]]TyN^G٬v m~{>Yb[l -"o1j 2h6!c u/rTTV[;h@|_-4B[ TcP{|}s*%% Tah>J_4Bu<_olJ4nǣSI \ĽbU$a)<\BH.<͚!RbKIx`{pH7߯5Bvb0i4ݻn7y%Z!mOO~Їi) R+ |_,[;4qiQ,+t:&%eX6~>/ oT48]|lI-nЅ4p"8 E\}/:‘\͓GˡþGۅ5LM$g)«ߋzf2s=S`Or'sj= ?N/د QCb諡QvEߚ&]w]%4JYӤc'"4hW vQEùт6G; {M6}bb.f鲹~[J$>Kl- e8öA0o!nl߾vM7T-8s0j[Ê_`'Z-2FWJ`KK,>&-Q?v0 9ءKEtЖ`|Ee:iLL@z+4[[eJCTJڵٽ{[ A^H!^TbC):ºϞn9uSo5haG&‹AQA]jh޳z 4z>˛{hyjW͞g?@-Z-ȴy$O_+=^#9(ˑ|ʔ^=T(> ХK_%64m9;.zi92"*|֏.ņy:TJNq:'q)%o|?Z\' b *]p1&Dw{eѠs *b[*`ke͚ڵZLW W ^Ifz$SZZvŒ1/KӤAT,kjsR1*:os]9k,0zxQE$ܹ;:~:@ vekEAȪ ]; #"> "7c ivP[^̽ҟRORJtcQ_ZjJB~f jU ! lɲYctx/gTˁ r`}0QT$tWh޷~Y~17DEd(H:DѮ8h,16Q5*RE eP U D tvetZ?!?qڇq JR36t ǎ%,Pa(jn`1**h(j 6.j֌nj3r[6siSf (Tz ,Q§$0;;7E2C}튭؊Rͭ,'##Q۳҉MN)!x|N *u\bQG[wċ/5EV 4uLI֦jK^rKhMiBUF 4P+@zy o%#_[ExS>-Y#zh'>y,&q^MNT9c-}]"ЁR:L?hTBU9sAp܃[v0[7jOZVwQqXVŇ?'ک<> h\BLK ++ X^ۿ #S8G΍}{Q1 8iB@eI]Dό 2ZvbAM-pbT&E!ںf* iOXeIU +a(tYH K2*rAEgZ ΃K=o4%bԎZH5ADnpB]WHSpp$yK]}iJI'v2c7n:=X&&&|$L{e]wEQh5;lP}V$" |΢8(19U J(kptI|͕/0Ck3h?\/fE][5[Vz.IDB-J@90E @#ukU4ZkJ"C^ p599Ӟd0ʘRIń9+?fhw:Zv@0/~o*E᳃P@jɩ ILqGIT`cY"E N ց9YU ]6xupn|n{ Џ+ShJ)7``!jeffЕwT K_lNf#V_8R*y &I^HJci5't^PPYr!.nKXY;jjWqɵ)su.}yVRUC. ު:#fiիٶmۂkϞ=U::Εq{+˧kP+JiBhZH qΝ0j+]q4'GM6V57E ]0d ֭[9Gqws¦kVt<W,K6UVzjt`K˕W^_Lٲ5[= ?(!,0ErpEc1ngR{F럇T)-R1*zciRh2~.Q}`Zv- yQTpxrM= TՇy2ҔQlzu->e/k`Ykټy3E"s$%W^\ubKU3`ˊ؊Ϛ-+DHwC.5-&IDjV{C d7SAv``*K,²Xny%j,diJ;y?"=^WY*k*R}ЗzAQ؉#:ݮ`EMu8Xvv=Ŵ̃* uQ L0" w9Жx˜Pn#Ϲ[i%?c1p@NR}Hf%t+ $TB0`EB>`;£bYkZ:vBsϥH_3GGD'Wc[:c%y?T.eR,(5ЎE:xQ L6J1JrbK]ͫe_Jeu? ۮYZG"HxWכk SLgmk@9=OӴ1FW6$i0 Y l6.s"'F#$h aL4qstlj-7u)jXDOM?ciԪ]4pqg޽+b+b?c;M,ZP &<ٱGliwDJط=1Gv(~ \m  @ c a雲mӅ[$Rt JGFBQM U8BlEXAl3 ~SMzy/ .m!W͟#cEI֬Y#e̪`@IAiJ,Ŕ$>LQ` NI#m*Aà (O{=%qR̦)ӱTSC]o@5Z" K/ٸq#;w$]$FIR[%Y;LRXYaUZTa(]~ 4í Qncn];TsW3ÃdcKPԷ#KSϯ@G !)_cPsIUG09߸N8#>7Qϓ01g@yv츅US3~WصwG{rvB`NKރn 0J"-h^Y|G MG90G]nx% +jaBE1 ]$>JF9-2Q* ǫkHh)hVt [eKzAٷ{wyaCT,kfoiBP:LhѴG dXX,f^_8{|G T}S_;wkY:RK"چ2_NmڊAѸxm ׻{n&-:4'&ٽ{w{*ǗsdI$zB\s yRRWeϾ.j/!Mt;&''1^-3,DGأ*Ga&R۷S,HViY="z?hNy4M !e,K_kb*jX>"g"8`pz PEi,ZHG>E][*Y7NFBɔkӟ[ ڌbf)f;$xӞ_ªgѨBR~՜ ҢKLVxqB].zV9L+͕`M*fl 7Z)M~?|00X|!r:ա<(˜SҤoٲ%W+ GcVRt}VlVlٲLeNIW)dN9^,˲zZ%reϩUͭ+\ >Ÿþ.ũlgm@bFiF 4:S~~";laKQb+Կ?TC;D#{8E$יu92Qfadmx6ϴOfא=lZp꟱v3#&smf9}h:bpΐڙj?KO˹]I.Wx饗bjkQH-~NVIE$9wETJt(t?rYH:$ENhKG"wشt zyQplݼD*r 8@92'd#ĵm ]xNHծ )iAiLq 5n~z~TT0yzjfgg# ^#:}cMtFE=E3_&ar9b֔cy(\E7?lšxk_LYMjaLÞ8VVN>Ny>Mlrcö*Kx}WVoZ^糊AApaǨp.jSЋc˸/Ju>9}v.xNJSbqc4->W1ZqF6o\U C)5Reb ?1LLLn,o؊O-듧_hqGǘ,M(u/!( SI-7m<{3r!{&ky>mFZWx=з{芭||WFQ6$JvZ :/E)sO(Q|~úrM8g$Lg 溭82H헼K|~>碋w۟LX3/o}xx i*i+=Wܺq-!֯gm]©!c{ OQ*ڿo&zi;rqnGrd _BEWеvvM /CS+m* <#ʼ MN/:G:X[ie}լNBf`~Ν;27MڸxRn=wq"$6Bаk7sάb~~c˯ҦZ0 {ƒZ^5I:mEr݊pn.^)s"|X`mg#`Qv;@Jb?n񾰭ޏ2KN^T,˻x}3O'%{yW'M>SҺ0+S`fժiU-ڦuA^=֬YC+P*HdەsuƍqLLLhr^ɱֺņWvz1gJ RJ:AT^p,uexEigPھk'"CeEbnryqsn# ,KQ62vi\{N sZ`a?R)?T۸ e.m)ȤlkyU"V䙎25lP)F] F:j [ED͗dyc$nsUWqM7мgo>+Ѽ{Gϵ7^ϖ-wQJqZLV p;l,pne{9ivH FDZ??׌R)1"Ve `C,c?q ukgh!D|z~L#_N`;N?/{9-1ӓS[6 hL(rP ƍYv-_CPBXBPh98 n+0-EI֨%WH5=6\J!zWz oxfBjqhL1O!D%MEu z *ǵH8ԟYq!vCL֗>צ@ʤjViOT&„gg$Ft0\'8npUOZLKP=)=TbEY F ~N[fVP{Ŗvˁ.SNUA J\>Q#$PGE}fPs6-ƜO0\mk1aq$J$aki!XdYlܬ){H0D'rS$QT): ,*l~zvر F&]{0lȘkϻt뮤[@k}quW3zbme-o91Tue`Jb!0 j}[9#wYNqՕ5x u;)ۊMY _b>yq;Dߑ4sJ$ηqm(<˪78~rr^1O۷se>Yy=h HÐA)> j(:rp *1ur& "Zŏ fy,(~+eG |1ѪIy*/e=LSU7ÿ |+ I׿up^/4z=i/9Ex'LliR^ݻ]'"鐥)[7oa]w$ AЎvYӞ(kBiN +,RKɐ~ƺSx( @+X=}Jn)F K}ޝfpL:(ʼhyꇈHں.rpI )^\]T/۲vjy\H֊J .lSa5.4_@)sWزes:)I#i1;;SB6=h5:ERKAfY[_ok˧^J}+o!??bL/cyS IƢ+YA\΁*e0 2v, NZ;@+28FϡY&ս . s,sFFdwBIE߯t0M[Ki_jٶN?_8|bOKgŖuWC|_.dOṿ"|s>ai;h7gJi#¦~!5H2xgʬ_ӆ8 ˶&?ZnNwK8ĩ`rn-w_g<<[p3_\¯:zyAZ'IB4DI&&&T}:ay|{ւ=Y4Š ,i$LΫ;x(}a^{g-޾UM\'BE-('X$AE5M0F֤(*Gn, R%F.yN侔C[R|@66D3( .44fjJI% '}:D,'''֚nNj'J9:kXp'˲{O9QYS>["j}MLLHG7ƩFͱzj6{,9Εۚjزy;J6`~9x/Ebyl-1y|탟q(*Y)@n Zzܾ*G/ZR?ʆץ80-(U\Ƥ1 QV>P=@?<,5p>HF py< Mc̀(su/ՖzY,2vEe|tM *IEIȪ7=̲z!{Z͉E Z :1:-ⅿrq׮%A< t!~̎CyBvץ|?eX.g򐗼\>9#;䩼qt۲#^.zk ֞|}wl\`s,|[ڱh[#~p[ϣu߭@pL;~Vly#aq IE$`M jJ:,$@^qF!U-p@lknd 0H¿`%("{u.˄y0mqU 'sv#0S}L8׾|n~;j$Cۋb?9M~$,ftތX9 cwd`ӱGswѝ#7!bNb'8Lp%Ùdωg{gTÙ [8ld[Q]79wcºꓫVa@O}P /(P}iFQDbxSΗe'Z&$(IeC[{"%U)G?<6n?GKEaRd(K$=$s',fBA: V`n >JBYti4BD"BPʅefƉm%DT[HE,yIӇϭVGHRE3Hξ}{ER c-iBE܂Rh6$ joDJLnA{R/8Շn 5w޹@|[s N](1&z癙/KQLMM!`޽7U[XY8BXu\.v~\jrFc q=1}9!U~_YM){ l` leNpTi,*G+aPͭOZاS arr2.x9@$ȹ;)|yOm JHD%V9]EY@Lq)IrF$K& _oƋd dž}89<}\/ >ygG_Ew?>~mg*z!z |ފGл|ڂ _xXS]}nb=zo9s2n5 d-Pr?˨[W x RB(6HzZ(9GĊ-!DY IDAT|MC@'$JqF{+GLG"1oÛWtUπ%O_9Ҥ_fbbncq3怽fKqAvaDT>obY[(ꅏt7֒^Os˭w4ED2/oE8*2rO Z!X)S'fc/-Ж?Dؔ)s"ڗ%<#??狿r4sI|ۨz jvwTI69In,I᪻O18Yn- 3LoKa7s9y;myf73}z]x97ܹncKnoSO\+k _i#K3JQ[jk@BC( )q|M RB+!W@`[ l1\&O'JˬnQʾwŲn N -,=dI V c J2eOdq=x<'S=_ǃ4.YB7kg<(YkiMθwIY7 |2֢u ,d|5{ۻyəW1O}y -Z8˴GV;l\D9/ZWz{!Bki6Rz4&&НF,sFE!٨J)^nڵk{zF 'm61LZG9yr`~w=PIRuc.Ao8YDQ%Bw՚~?sc_+ZlJJ'pk׮o,8ucQUJP ԯZ5IȋodQ@׎&C$,N[>̪eH;RwarHRZBffR4ˣoѹEk~A=G/t1>#.nʣvn[r+d[y4H!\˯;r91_CAkA>3e+Eao}\r W\qB ʆ8ANJ~;Q7|32H`"C5J+CmNZ(N k* 8^Azv+ϑ/-\Z)$,!I$>'-nZ4ǟ#N<8]Mi =f'qpa?]4>u<~Ǎ1B;X*d"4 |ivݏTi56ÑY$/4Z`1E >',GMEvWyY$M0>}khq=g5U!QD~A%tna UJ8:=Z=;S,k2??Ow}U;S ݼ_MVoCq@X/𕓥 /m Fk.yܙOVTm|#DVUv B=CUP&s=U#k΁qh9;;c9ϧm۶enʧ:EꭏSR"U @HҝS RGf\[1H'UNDkEh[?P"[J~gl>e]hJ[2=$mBaF^AqVTN%+O3Ԭ,>j_eJԍlwĠc؂c&ICsg %أyF[ťqǥ`v8Gll!ȹ[yڣz1g~|[f[yXsqLr'7u39,E5I/ϙ ?Ǚ _$_5𐗞̊τ-+.lԊUI&]XjRP *( kRaIx !Ȥiڤ Vc ߟ}X,%lvrLd@izHa-(m 4dAvyJr<%My,*Hֲ\T âjMOl'gg5i8ѪGpQoHY,yާpi)&h4%?0xVx`uz R$N%Is<϶6$F8,["`g+By}*I2k:+@z=Vs*-B뢚c۶mPsb~~-Jd׮]~B9H4kMi$R B#B[.}F,3#s:.V@jx]RQ!?@m/]dzQԀa}}0* %QxWLV.um8sNl#yâm#S-Ž}W R)Z!)Bcujƪʱ-&1yd>_ztxĶl#4SL3hiR3 ܐs^ C!iVTimF# ڙ 4Z th硾Gc h"|U:,"C=TgW?U[w[ύ-cMݯMb9 1Dkr 9` QT3^bL|d5ص7ena&bЁcW"2fxcMwpImeYViQYK3מ6wzw039pg7\̇_Zn~Id/ks{9g?8;Wwk,֚b΁1)qAZTEK9#ʄ6}v:ݜ,t]/CQ9UXщkzLV8gpl*2g.~8pVE.\0tX Ğ`eYjMRs DZl5')')VۊnhlAe-JR'G`Q4VvJ"h<.j$NȦh.>l*iR$o7CxpN:SF-ޜԿAvql6dYt26k֬S;Dbpױ?poN!E~P dĵ^9!oxHkx.RA \%R\d7w)I v坤Jo"Ej=&:Y;Qr0O~mU;,͌].cB V` #ހ74gaE>*r?8x_%w$;xܪF:>mjUt3.0`%#H77׮"uiBЋ(y:89=3[hc+eyQRW%fLI5^ o=zecQuvUJ.ƩIºƲ=xvM\*Fy= h,8ypg BW3̧޿?藹n?uz_*6E{-NZDڲϣIG/&_5'^ < b#{SypZ{&Wx gb VM(J{hiZ/ XN1 7mk݊]Qݞ{sqRޛvߪZOrN!$aH$ *A A+ pQ$ x* ӋcP1aI@$gsNPUjZt‰ w^CUZky~L]^cy]+O֕&ƐE1% ,Nm[(IKGK^nIP%ayZD Od<*V-{e7 ! ɧ$G[h+PzI, )-R)7*^X]Qά}k0:U/84kZY1n%`׮]x5~_S*k/RRJlA(Ҥ2PϓмQ61dYHY0HaEA">5Mw )&k5M>nN &1+]¢(WRjQJэNLn,Pc^gD *PHDYv>xԎi06fFry#l:ۼvms~GQDe6ʎ-qm]T BXiiߍ㸦|APDyu\.8j*Ys.M3WN<ϫk\ǐWMCEM- [{?/e}ikvE' =Kvc`qaÇҬ6oNuǞnZrˁ}M7dz5N~y#=%y' <'x36}-؝1saʕbr{peJ &&/ [Mj*Ժ<+8g}] 8ʶoJM Qc颢Y#Wnu[x%}oM7`0F|eҵw _ηocnFR[nQ~ hkPi?0/Y(_`zwYE5Nu4\Ϋʰ$֕7mhZG=3b+Jcy`)xr^$IVW,Mzaq8Rmˈz$Iu]sڕ#G8|HvZRtޙMKEuTW cD%*D$ODw/:x2 j֢/db߈&Vǝ1nTK׏(j#~ . 1ZımUɷH69RI-Dq#R-PN}QP^)swNM|xͣz˲,16>ֆf<{⊂'p*ŷǦs/ LES|aCb,"H'f߳N s;/5R.B(Ho$w0vyޡFJ5a^vhVI6R0G%Jl‘#f;Z`wu}܉޾c}67p~p~)&j% @.%,9fj#ϰOˁCr՗ΝSBm.ܡslmͣ-^\4ʩI(48@+MP k5s~e96-º˘>fMJ䫁E@ OvRE{[8c!ѶĠI҄,DZ,>hUEJ(c1 .W?FY=81w=ZR5/zk-yT VFyi-.hK"pbdazVTQ!^V\RJD¨|/@p7oTΪ}JA"}"ƒ5k,IqNaBb&yR$&a\0B8 v~\-k/(s2R'񄅅{⚗eYG1c\JEQ tZ,ݲ0(I= ב)km .^i=AwNq :Ro7ڢ(;N=Rʖ`SHSEs鮞YFqo?m۶Q%{a6"FKt)z>@H-\,,,ԟ̬|{n` Y=GP鴮[hӵe11W0l}8d*!rTB@GβU6E8gl>β)xf8qB+FF)IVW +T%N' <πTA_5Z_vؿ Z>*@QthOIo,KN BB# #.xRDRFƉY6H3.r=BgjěP|Wͩlmhp/{Cq%O%O(Ʉw{!eY!e8 ;A I0(VBm將-;OpnVJ p+薱%ݴOYF1 mE}T}aa툾 IDAT.*td7$f:(N_*5ڕJ"c1~n8[KZĈUhQXzz8fyюyQKKK &"^yTϒꞐjsńJ|07ua -1n/%T@|ފ7EqrW!(j ΧP:^x΃woadY)]%Дr%'P%`L&\%ܷ%T;DЏfu-GV&=6m@1f^?$I?w ]6mlEG Ѷy}oVy8@ F\d4yKUUl&!s>~dvD9YM_O,o#CG-ϙYYO1UgmnرcEN陲Dr'bt'o /J=znֶіۚG[iwJA,prtmRH ~%HKX!2Ak\w"DƟOtM|,RkQt HVj_X&T,##^R%rOŮ*A$,<ӫAd-K*W x[ t1ĘIUj$v0S(~Za > Lice>_Y C)ְ>%^ jsHhRDBVහBXj>E|UEu\=4!}kyA1I;v3x;p3ڴSWy0w8oȕr)pMz=,R0˱\C#ۈ[E.ǯeIELu~ pQO;4v/~$w5˫Q!-Rcj_˵6q^t 'gL,N'Ԇi1nsoOmor+a=mYSapߡPD SQG*PCDъDjDy'2Z*:`A2|Or' nUAi]eY"Ps HGOX'R]pH" 'm/Y"UDt4xꮕhST[_2xQz7@e>GI !-YN֗sѠn k7^W3͋:%EϠ΋`kJ;{SgE區|F. řIMMgTeK"F$u%6enmKuj~h)4JD*zlF)%a1q3Wd!HIG#W̘Uc[Ҕi^rݘK WUV~͢r4Zۙ%DNskVNhQo@HJLXm_<Veio mٖm_-m$jLnW F|1(۔[v[t ZAǜV2AӖ0- G]͂=H/"dۦ_ѧ  R "YX%i͐[؃< ؂XwXx\^溜l1H:.teA&1<,ρ r=,{ rz1WP֏+ˋ::<r)\wuw@`@v{JC0+b#I#{rA'4evɄ;Y9r4btE-,$rW#Ke/%Z["ShԴx,T(Q~wyoe0pҗLYǜz\{"_|:/TQ+[h0nk6,--3F.Q7~c2_s6o{{K___{U'jSo=vB4i( B(D5н倫}׀^u7I",cϞ=\u~LȄMT+`ԅ9]7Mu>[Dd4t x.+"a)Z93fyۉ`d2H$E6IAIPJVQ( Dq(A>k$nDTK6r <f,hÛyy9>?ۢsb[O2\Z'Ӣ?NM/x 0Գl\GЩ"L& mQD߯aYL CT0r\UR!oj3ן_~'MSC-oQܰo`|jk9';`Mbs*F'' ݻ "nX2]I2kj'j[e[eY6$*C\$R;i-R*'>Cco%Ţ1sXvsc<Erh r&/Wpv#0?~_u_GOR!Ht:Nܽq .~#1UVE.M[GݹV܇pIRyn\Xa(R5+֕jErNK>Oˀ1ζq7 R3SuH>SXase(m:TX\fLOѨEY`cVw:` 2B[K-9Ueiad߷7] (kQBb+?[k5q(ȳ$dn4dSb, *9#P҉;Z+*W0֭3s#6,҄CGV҄ %9{2oeY6dYz0#96aR(Y۾Pv,,ӥ6BXJ:898x^Sb1BMc 2+4lNvm&^)p耷ƒ;/%(I[R53gwYmdV) i*:w. ! c=7 VTo!٤@w@ܑیmh;駷l-~/(8~wX=ޕ7y_eGs* r*Ulٖmٖq^ة, VȰ h(\BighXA wˇx&G:rGbumZevTV0?N3VСCH; \o_{t'> Jud{A(kp4ob\-DM>kk\[!fk]:05x3q&ʏُN| ~|(Ǻ㈦v遊_$x5PЦKRMH"|0Z(ŅYfAɆ oSj|Yd.V9DUfN s"ҍYVT_ͻm]9GL,cT-΄t f7 ?~.c먮*vxD2=5BYU !I &y Knf-EsMeQ0eDݯ1L|X+7Tu t,"(:Ợ ?u0i`]sSwLy ̼V,q#FX"|cCn*[_~T#W˼qgjo$c4h8/]b(Y tvf+/֚4M]!PJh`+?7z41F?ߴpֈ}#eШ)WNruTotYQ.kilRq KXFQBg:tTY*@8N!@>}kkD͏gi 2()m# w^7eD>E J]XʈHU4(|.lڲҔnM^EZ q}m&IO$Uy%qrB;Jbl E3Sj,u5y%)3 Tƀ1 %IJ#5pvhCF(-;qs.g`Y32pĹ#2;: JH !|.BVVH6L);Z7cZHPR@@^"(•V7wH~Ad9#< D UN̙wJhŤ)M5 'JUSghY'-z<JSo#vEٱc't_WHxL"R8"N#.[#*qTR5ز-۲-aAE k 1r۷$V#%f~p%%CךIx,_-!zy.z0rW+$QIT$ NG"Ƹ>:'_f E8(mjy,rmCɚ l9?U G B irx]-D}o_Q|,WL}?9vҪ&:2ɐdE)1 dD"$q$m]EC!1ɱRd.^ɘAٯŵbTT^a Π@ @ϓ6E<,F: )3(nQE#)&GBiW2/2b' 4W$XZZb<px̧xֆF+9|0J J8CZW#<%R-@,MxN%}?J%qFa] nsDʋ@AQ rLd|Z蟴MNh@iJnJ6[F[Y.I5kBfih Q;?/2HӔxs;6iT9ǎk]pܓ$( ,C3M"Ti(sP3->ifAA ֟[S+Xѡ&}w%"ka/`U6&ʕX)[ߪ8cNuIw_u丕R` w`;>T;qÛGܴf4qY%)s-%Q%uc5h:h˶6c 7t]{ݜ->TN{.7z[vWp^D*NbeMRR(ǥLJ B#'m<~GuoXDbczMϮ!N: keU \rF#USMId4Hcs 33%;8VX0DD*;Ϣ=6V헋ÌM,-mCZd 9yZjjϦf["R{{eF,rݬer:X ;rgEa&fr"┻8th,XCT*䶢;WITV4q0؆= f` )"ֆٳ+Gqb**fSն]{nvډ2!۶1gUL*A$LQfLK3 `<=ߛ Ԛ#GB E=U{ggkk@n4A4USTK,j"ѣ+{2i}_yim3 {hs568FLjNJo[+:[)%%D.x2DQa"Z"6lcY  #d}؜1 Ӫޚmf-@U2C%Hh> @0n'vlW35 Gn cTmDy劺z_sf8?w:k כ}lNߪsoEaq_mȌ&;Fip8tL~{l˾[ysus披\ 쩧z\}߬DGQ DM 5X~O/4hivH^hAHdX@>;Nn>>2JVL(QzudaoE\l#Uwj^.",!fBRBɰ8Z7c>+ԴPAq@ +!\.4fiMXD\O:^(Dn0GTXC#Z]"FR_/|^ta^8j%rU Lc(K[/et6CĴ[Z})tٚBn@,>f)6KZMd̶>>z(Rq9 碋.(KzoY50v!&_T9Թ9>׺>n-Zozr~WEEɍ+րЪcO9:D>?Wp6>|9x ;/!@) uod#^v=ww-3c`Fn/b[`yFhlV{eanOO0?s<_G};|û#[eߍ]wumv n-m[^ߺ[ڼR*o;4/)প; ZbQ2R_*3x6tX(ZuJmK!Hm4yVQ5|bkKRYYTUDmrT}q.H.O©p IDAT˔"R<%'1ZL8X lJ>{gb<;O-h@I:eEӄ`4yYdMsdBWzY&C8墋.r*RHԨ„Z rEf8 ^4eQ~IOK_+G!s4l۾p@Y|_`0vi`p5ad  $IT%Xz(v,"|{A$u Y%'q뭷|~j#b5(!TczBͽo|/v߇y*Dϸz=>^{-fR$IMk~b p# ?n>F"(k8"^lN=Ʊc8|(RⲍG8&ԓKc^Kk>D"T.KZk,;0tPD@e cg3¢cH; RuI;rNQF*.!BRJ֠$E-ફ mB('4쵖ư IBpYQq@Q|M_.RH{@)U3Mf8JEn*2޾; rr '6!9Z%xB2P[\5Q~յ5$JU)T# `QmYZ^baqNMFhD +j)"4 GǓ Y@X]8%=%rN&uy< }/JstW N|#!*BxX͎V2Yw%YAYY*ѕ2.&#nŔZϥ"}=d&Ή%b:͘Hˇ?a *'[p_͡A)bhyS`Jap b8zۑ8 ,,,KKs ,..h4&dܐۍI nɑ)BO"%t,'NS` 2]EjgWL[8*Nҡ[v-I`0; zADC`N)X7t?f,˚tDv3dBivZq$ISkyQpuU M;Rfٴ;Z6ӏ͞/! Baی.K$T!2W%bH%jAYڿ}dg\G֚¯by߽,w,oU;to3\n#<מÏZeX]_>y<[kRnzxen̵^_ !܃Z---qtXPo~NMiz 7zup|`Ej+,+H8t:q޽'g\#јCiE{/k5BD?mNpRk08vN8ʟ/Ecq \~Y::rsGij@r!Q~Q^Ѹu%h*y%zqq$T}iƻbq5-I҄<+plQke޽=L Y=BAMt-K]A){Neyy]vNL&wQz=M8|d]㪔%^CZ gy_:q{g6)p>d'-QSQ_g]9T:r҆tn񶅅Lq|nW3b|ߪ>egwii(K7EswT@oLհ9>_{:w|v[QXXX`82({Xk9r{/i?nv7S~O?:ތ}Ng*_g)7_~x/gcW;!r~ΎVn }֛i<)1DӍɤ$MUMB@ +_ K~1ֺ,M4W%?G/СCɐ< +3%SnS?)[k EAG-p 3JcWQ2&`V;cK)5 HpBNJm9r:5m7#! hप[ͬ{b>ݤc4Q`[!E c,J `"ᰦF@4`@ *A|"nϢj^!ߏmQE=uW_nl(iJ)1s^6{ƱK.+ECz9ӶDT c'`v$9t[m`ǎ;ww8k.kj!,sOéΝ;_s\pHLI-crt>.JX+Y+"܁H( lM(0v`I+gnpGLDt70E6RVTN:I;!-kxFa&z sۧ,q]ZTO/3ج=ԋ|0Ԏk-IC:i=\uU>xY8f܅2"ʰ~A{G8G\qUsvw-b~g.c|xp=|2>;?o<ߣ6|-t/i#_CW1l}9i$ vuV./:?*;Y BD>qM͛^Zew%\ξ9Be8DI"…ޭIʧ?IR{=0Ul,"[X"R**\}aJ|HAYe9qdI^\r-ؽBWɜeh̎moW`EDTԂnTuY7ɦȦ-;NC1s'r#p9Nx;K`0+Q2F[YJXi]=Ucs2j8m*^".,*a.}inԩY%^z)ik.:W\QS%34nQkܦOSB8F(BVIҩM~oԚ[Pfz0dtG,vF}"te5[GVqXD z-gSލO>h*+7_$'"Ik]|sc DIı"N&a"3PU͗m`]Q&ʣ\*FKV;m6}6,e妎?آ>EqFq&R$6t(SnfMK0řsw+'ɿM~bR1HҠ|]0!B 1#"v6XE˶dccbjϳ͜mn?#⍢Q,sa{M0nJD`^٤fa֛.t%إcoۙq{+)̳O;<=EQE4ѣP=WR@V缣$IJn WO眻kxKKN~Sxo=^wqe_%qk?]߹{凙 XcxOWc+.->~𐧾<,9ݼ|M 8_pv9ZFB>|麣׼_? ?c k??~9< yO\ @suy9띗qܗ=?|nfyמ[yϱT#|s!e-o}s®8ܟیc>Op~qgqޮd,+,tSjE֢y"DQZH;x#5<HA^Ү",j@.MҊ R c y(ؓIF ,,mv[IJE`eK艏xEWV0. _{{kVJq(ʒ[C[$M~:W^y%e}EQ XElpUhDw$"5.Bh,Z|,#LidЂؗaMP"/J.P`d@e '2ƐD165tm[?(11͸,ɍ8F$UԼFcMɶNn7壟 QC.,ۖs-#W>GPUhWDkΉr- 񘸊ھ~BqjYmJď U^} DqL'"Mq0 D#uRjpQr%"0dY:udJ/IKNXV9RQZR`A ,e?R$/4v(qx]{Vt]- 2UveaT'%hq@JkQBR&%IOh&!s8gQ8T]=յRLMo|7^7FL[2eiwX]]eu.{0W9%-"1;z)Oxrځ}\u8z )h 9dNSӇݜA]Ij_%Dx5@^Ug}C6땡7ʿnmnpe8ۿqjfY.^4ZwnRM#)*&ynYG2wknH"+]\J6Yi tJ5Yor!ֿSEeR]iMcq ㅏ;o_|zбo,?S@L.\)N.0~Ky7 Nm/yE>^t}|-ooQ{\o >sW?.<;yY/?~<(W^~G|?￸˽Bʣ  ;;x\翐_8c'8Yw^mw{o>Z|,/_=.块ݓ'>g^?gYUgr>7,+<kqoDI&2 " &C+ÞZk}ND`|s8=a}oyůb# ~IDͼO+_w?&>h |(o(&+,`E;?/9t Oo{3ysdٔlls3k-&[֔Y+MC#ecsiF9<$"==XEY=js+U(tu=\砖eYS6Uﳸf :aԸt-J,'>|~c U-$".hyu,P$oVzY١(J<39<ץuK3s`GyC١(^k ui;T0 ySv*2C+A1U3 Mns獊WLxLE%/0T[A+Fi_`bEO+?;٨9L7&怿_Mt]GAш k ]g}ؼE^)\UWqfSh?HT _1>x/o]* lrl+|;oN>5_;|-7|"_ۉF{@6|7 *\~2OZ}o' 3+<牗)N`kn??ڧw k?^66Y\\)>vpUHTFQDjTzff`y^"%DIL^:*hjB#*u6QJ~So׋AY$RR$F97[)gՙ Δc&IӅ\`6H}cc鎳%{,n.ŹRzWLkE?1e˻DI#2M0Guj(2Y\=w8 aS*%(e\Ԯ[9u 5e9 {^mucMJW? de[UީKӴvc{^՟)8Giʲb2)YX1Dnr| =(꽯Is;OK60di(3nge b 2-hz抟=:TR kzs KKK>,--1r|PH|(jmS jB}9G/fʰG>w?~Z^GYVM[x5d7W*i3Q4DϘsԉ8S8d'q! ԅwM.|zK8grԉ!(Ay03nX7ll^ l*lxAش9#V SB%sV1e^Q0ӭiC[S)賭/Ehoy'|9\\0] &ϩ3H{M:R4MI8Iy>WW7kC4Fk(LE6gǏ3ׇ߼,qsFNn-.(Qw*t y~V`+b'k-~TqM_* }~̰\+5[jV- n}nv_O;Ӣ^ےh=jVLzvZY5C>#fL½Nbtݺc: YmiQd]Ŵϧ]ϧVnh`J]윘FW ̣(yϩil ASKh_{~knEMMrk-yqĉ^⺎֊̵<3 .TC/syU+\_%G/ocw xo׿O4;O7nS~rd(^L^s  Y|K^{7( /KH p;o}ǹ:`̉;ƴzߕp='kWOo6[/X+ _[ oF|lʷ?t ez$-|}8 > Kˮ}ﻖ+myl四k$IxӟŻvw <$M]|7 BVNZnN,=<9O"+r.Q}ΨɻZpĽ0auu_ 7|o·HD;:t(+wJCt:e0 y5pˑͣsWƮ^,sY[[[/sHIگEsAA}(v ?oEQEQ_[MaLN .^_dac}gϖS#Dt8}[ʈ$<ۡu(llt9?o"e5g;6sMC)E^hsC(B).߸fu]vl؜ٱl0MJ$5̳cΥm9P˲dss)usvm rQ9 z8>ޏSd[lD~OA3?s[n^¬uJ*~vzE";(J6nLJ+%EQwj磘XHr嬵fqqq,ٗ1ѰZh:"cQֲBnn핈~_]1lz³̅}Y9u,OZJಳ,3lvH/`:1mp.a ,)g\8gN+έLgltۺ\K>s3_QyavyWW41Ϟ13.di{B\ln WwJ@_ssBp;0: (I(dހВ$ȫ|߯+.9MkeW, jyK(~y<~D |ܞrkm}1Bnm&)OڳG>ȷ> = Gԭ|wx{|󁮿z'zs43mn~)Z$I'Xȶ9,_FS{& =Li].Ǘʲ ct[J)Pπ߳:mMUe"[[[ع|88>Rw6zת=~^ij6U`DJ HubYl$IQpZKPY^9P'AP+K}-.ۼ~/r90Ƒ$Iw:ɽ[+vi#VJ /\$T! Kd5<#tڨ ?/1sN|cޞ)3{_lefJ_} c :|!6K9wңN]wU +)Gu-6jԴVHt8ٴ cz֠җqW8T.*UɄ͡sHTT*wa,da=>sq{>ISA/ AAYzTS)T@ EXT'T߈/ E5w 8v%ֿj7Yqϲҝ!Ϊ-Ί*mtShxfM&YB,W#jȑ#TRH0U^T_;sz{wDXꮇwb`׺m@>[t*ʲ_FVc21ZuylN5Ώnh4 k=͹MT?!/MJrȉ L?Xk J~d~i:zğ?C%ڶAkB)?Pg?罍b0x%Α$W zz-7?.γ@lWvp{vͦut}[^^fmmv.chԢVJy1aY UKkmS3ɃV1ư3_`%~?%&(ɤnJ{mb0hB3Ü%m3]<*jD+݈ UvVWm-y;JD(p(MprU F;(R=y}0bmktG8d;nڍAvNq;thL`Y0M8@iei2hHv3smC𹣥N7 k_0I0[(!G+T-$XʨAÆ:nZ鴝(Uwf#uݛx;^i/R&{yz}ƻ?,ٞ[zZf>e5f0)#"MHe;pI$ͬk܋E]z~Ü<}/O>o6u,/./׾sV|q?|Oȣ:;#z.S ]eO1U| |E|-z)m //'ְ12ı~wp~.[nΓ?<У; U@̫BE 윓qsh!Fm3y; V~-/NKt9z󺚵Vk+2&"8,!Cmh]D?VP9ֳ %lʷ<n`4!dq}=^Bd nEm qY*DXwc@]Q4ZSWrZG\v\~ʿ(WU|M[žC&gz:1 ?־s1`}oZ Jn-֍UޭBFf:Lg9XPl啪qH 2MHSMU:Bk8:zg:Y6OlE-8;!h0'@hk,8x [;;艳9ʱ yΙ uK94NjE(w;D Yߦk ]uH{Ή1Yؿȍ7ވ-ixR꺿gϻu0,-.~eI:uޔK;99d6OS ClݟW5,8Q;8y#g?9l28(05ZtOhO`EQGVKWLP%`}@ږm=~:ߢOӴFZ#EE?s; QcAEGn?DWȰx7i ח#iS'82(*X9б#3 I<4#VA\1ea.!,.k)֏ &s[D)Y#|Pf8sP8g!DcbF l! )ʗ퓑%I7,lTAOK̭*i'ZukvkYY34PEj}YU&#Q%P[dڣ8Y D2j~PfLJb&O.zw$纮ڌ 5ڮ$\uQm5]Hg\jT Z7`9쮨V!=sN)e6ovԃjS 9vȮGWʲ]y;X&3^Φ7pɲ4MɦSvx?9_wEM }ѾB {HYvA }-4M.ǰ)R"TIݡnwѪ9\3PO)[5)r\o!P )$q,E0y=obss/v'^Z]}'f[S7ܷqB:YBa? 2WƠS*QJ"[ i>;c: %RśoA EYͳpBRT9R 2S} pP )Gm^:p6Ca16(Wu^w@z:7Dkފ`42:"V}jԈJeniqhn8Urd:Ao8*@PasӼT#Ϣ^$pZK[(IPǺ?Pv>$N.n훿s !L'3H.]rb 4u3^;]n&7s:J1,b7<*7#Ĕ E8 ւs^*QNbĹE]:]T AHO5BMwU'nkmKlZ4j0|GeGнح (-//c S)jq&OTwFg.cg<5m< 8R;Dg<moe}49/TLƍkGxZf1>QJ<o$=/ؙZ.,Akwon9z]|V֣sW|MUU8\Jm3ۈ+m]~nuߴm3O7[;۵\ȫ1L&jByece0cZhK,!0;9}tsQG;֩*8|8ass0\S/fc."4>EQ`AJU_Zh(rrӧ}T3!4EQK5yneς3$;3}?Vc<W: ]epZuQSv)-aI1k-؜] IDAT9L&oGgw 'c8_t:ѣ^qsV%9^?8JRm_'rM SmG^7MPǩdy7<~O'YP mohyn-1yvsǰB4c9Wv)BF;ڹը.7A\#G|wvuFs2]յnp(Z9݉mcJFCYPfxѶϢ() U*ArKNܽÑ#K(zk)@:w2ӌs%h_;NsUQO`ys(JSֈkhTI)񌆮@ZAsu??AQ%#qQ~QN@ZwiQ9{t c z7yb:28.EjnudU fj,PE}%Ccwr䉯\Rz; t eQL&gvI[ͽ _raqI^` !ҔϓHnBĮmnr H}q^c`;g>HwٙG\} '^,%O߼ }"V$#/]UXss=}ToaʹoڄTPnu{gПC4Z;vNb<$IMjUmRM{Y(IPJj~L4v-ӈ<3CַL礽WcA(2`p\@˝O||Wkt+ zV|WN3\N tp@S%Q3pQb) L=-ey^QDZ0)ٿJl2YH".A@/3K- &9zGc ++1Ͱ)}0z~6}y=T,W_t)^`$)5Eomm1a*Hyai_V͘ TGdj"Azv8Wb] : Pcmsj]6ȳB6(NGbq1fmST9.AHtb9}bccRDDPPӴfsOeYyi (ɥX[պ !ɓ'Ƙ2jCoƍIVֶhpC(Ie,J1;;^~ os%8vQ,jUb`t:M!)g9_C`8r5p?P,/ G^"_Re)/㕿;|_@%) u;(tuq.;*9SΉtqU/ &@JҚi6fyqw _JkWK+SwPCV(|omϖV uC~[8-bZwxٯcg}8Gpd=R3hZL-=,`'EZsI%CL9B8IS1~¡E679p0n¢Ne\`0ڊ#"MCTБ,s,.Ȋ *k>lle;RyqtvmF#?@8pA]Z"kkh<]牬*@vK #4\MpS&cx a4C ˜<=8{[\u 6~9AwL&`\ߓ1 4Դ$U,,y搩E( d\2\|,-7bcP?yLAewa`!-ě_Gأ(c(&Mc6!?.lJ, MΫa^TM\&\hj^QG>URk{_HU̟<*VLcHZI~=y\wulll~.Eh_vA珞Pֈ WqAN-8 }urfz޽[!KKKDzcqSt,PT%aGT;d!ak+#+SSK#J8\-w KRr?%T:lo@ȉՕ5/x`uh{!,iG;湚$QmSIZ}0hTvA jJ=^#E_SZ3:z}Ɂ BT(,觠tE͒[eu0S=ZkO1W4#EB(4M ;Xc)p ө%('lojZC}66& ~} p"W\&}؃xsw 7DͷEGc')ĩ撤u8C{H0n@ ӣִ`qyx4) JiҴ ,goAd#Zk._GQxЊ{6No qV V<;;;EpoR>w_kMR ( 1#Lj'J(X QNR$hz}s2DZ9ƲeBKP3|t}[V=:hXDq2D;(*e2aת_s!vNb kVaU/i齴3ƆEQ‷[O,#]vѾN:$O}nvUթ,fZXSNh sY`*_:>ʇ>Q(QdyE&TE5pe;v7B@'dEIGypmW1*./k[U)O1k X͙14RWv[=})ꫯ~d\wqs=‘~iG%E2^.c.NIA ,C)kyn)4zqn>' C#9xڛ%T,0nIw,P1 sh^<(*).Io5t:%l6 Ðf3+ސF&D'[=$i3xņPNmly`$iidc 3c>1pP*#"셛ccc)|6[&dİQ}h:Ƙt1~^y-:sB}MiU+#i젰s]wq@w<m&tkSb (ig\7wRʚ% FcuNwjV߯M|@ RN'xAXs`BP5Yzc;V vח9v5+/Z@w a;Q毯: !j>}wOc,uԝ]pӿ-*~,Ɣ鶭{ cqY|3eru1'KisSZHnw"-Jv:x3=~5p)^,%XHGv:GMA谴h QNAA:iNRk<}8|0 yospI#5d{{6X_c <8*ٌ~)!++H$)n>0 ^U_> $/ |1q ~۟_hhF2Uƌ9NJ4sTf2j~ނxw^ `_rƬ˚93Տmق%;<ر1-.w4>J%ll\?GHmo_ӁNpn[Of[?ϭ FB/[o=G?q,c4*h4ɓ'9y$J))vg7ZS*WC9Is!Ν=A6t:.^X5kC:(Y/e +ʸ2w+NȊ(uQV,u\)Ibۉ\pĕ,8|`?8]}(#$ݝm$H|QhG]NKH[ e<.:[;Vlm]^Fye"Nk_]i20<'" j1;v1MiO9hsNUzMtgEQ:EIF&kaccOFa4p=r]P$eo,hE㒮IޝE\wJs".gp"״miy ,-5uϜ+͖\cu} x5஍b_Mweo(L^& 8V^p<ܿ?W'i^~gZX;qjD&,j;SjNH!N5r$5r2y őI_)@n/7u6l6 bb JpnclѠa7Y13.t:(x'`FQfƓcpt7l[ld{7)DQBi *ѠJϨ0-oLr>ƍ7?Ko=[p?lWFӘd d5tA=:>!q{9 Pe{#L"[J \wd\j윥VHoc-gv(/[SԮF @)) m5(UVrz)ZES&nm [%YosF#۽U6<1Y*\{{5?+f{{4M㘅x7>뮽6 i첺f?ήo8W}sXǙDs Ng&OƳCtfg7}#ZkΞ}ٹ6[k4!:/lWdYaeD/^ɶvW xu 5&1܂G_ t T N?+.(,]P({uQGJI+r2=|?u/#o;?[-[zY!mde;; r=y.5q|:+˜Y^,(q[)J J83^m{vSӬsw0@vDSZ=PXϧRz^СC.Bڻ8]KƉa׌u8MX__ߡQ0 BU2c%:ʩ͕3~63mQ.8u줴( deP'tɖ(hwDo]w5+p"p%Q$dG̐"׵bLc UF c,@E=g qNqO2‰r=vTxWҕ1|, 673]Yv2P + [#q‹!.< c[/sj:ah F!aq]n^Kl_Y<4\{&ֺF1i t:2'fygϞ1]v٣ٖـ$G,δ\G(,,c (;!!&1oQ@!SSv- YVvJ((4N}ԣWvYY[P|cc9r|JM?b'Est{Hsi6Y Z_}&ul0#NW'XhA"p^jh⇔:oozӛNgx|g/ickk,/{9~w{s̙&!%+y7.q׻1sC,d<^.| c,]{36E.oG3m6m´1tC6R9dZ333C|ѣQ,B,rekaYFJBaL P/^}XF7Q13/xoH>o^דgF&YI)݊Uu]8{N, /)J_h)wg>>OpK| oΟ@.G}?'.y9D%xFOӝ/asp~x}mm}Wƿwh=x/3[=suW>~{v1O|sȃ5|ݡ ~OKo=B/wAe7_{Y~O'{kxo~3#y7$ʧS8;y{32wy"El4 z[8BLOn1ZU@N,cɊp97BZG*1)X[/ BHTt6rK7*ڈ:V ?ٹD)%yJ $} 㠤! 0eF91Y3]FD1(TXQ>>bi =m{TE5x@^WqRGq f@%p.9 cp Zk ԧ>}e;`0nhě s[ؚ`i A۾^zExʭtw-5E~5|eP0&I8nh">S`o;'ƘZ='CvM FiPݿh]0 {ꈋ7"<<#,ͳ4ki@2yxxlA-@m\v9չ[i@3)EQcO=~\g.CN= AvqEx øBd֠O(\᳕o CT@.ΜZ8c ڬ( 1aA<Ѧ = GIurQ^MwSk9L FA >5hMxuQ-5h4EDI%{e9EnM$iT'O2??ϾWƿQxY_|:fS7Ż.^ϋ_'GKO*W{?Y~w{=ۿ[9py 7R<[b_: zY5V9”[cP / X7j>3ښimvآCmomҲJV%)3BuȒ>mAn^⺪#S7PS-fJ =Y.30iZnի$Ж+yŬa r FH+Fn@o[csrer仒k,$iTLq "Ia<D9ԝ8Ch4i1Nby{sѨ84XYY!/ EnH UōF[S#j-c BC߳N8-cR\ǯ.H@:M; ~+P'5. e*LnQWSM4C 㟌aF[`TILӥ\ Ȋt[6"W c]\ޔr49|$YZRK#7ةt*::yO9wQTM{.v {6hBoB 6ҋK'FAղ9EAQWy^>4 &t7Y0?a;;&RȒNk- r8-Ӻkcڔ:/.:v%ӝ]ssq`( rT:3Wl c=wSٵ1uC!LyGl{k{% W[#,Td(JہZqÃ>HGba4Sܾ{WȝM)a;17Pdb#せ0sqQmt rme(HӑcxFhQd ^FJQ\W"ʴ{[ CYUϞ3&v%ƃa z$r8,z3L{s,..֖)Ǩf~gt.fcZquO@XMM|.C뎝fE]K(Bf άOC)iDC8 !E?4|7^ ˵CzqEւ<8EcEfq)$ :ѹ]ڍ6wUc|ľYw9xx$loabk>a D@Mx@mEr1O =A_%s2Zy98$W;kWW+^lL ߎ3?nd \p9:)Tcr9"ة$<4\g͘ C|KK4€X=yyzunh,.,pE[hU<ރ,B52Ghyqq;3]0 =Q8#pAF4\@h=a:7t@hmO]?>h"חL+ 2=mQǡpSO4KOӳmw~Yvl,G%;LOEaMR7ڨ;Z .š߿p]8};̵ʛDEԹ&ij.jaE3=.h4f<W@(̀nSo2Wi( a[vwŦ u (h0w~={vf}\}?R.ŕ5ERO,B LǫW׽uR8N=Q43"6B Cg>њ\:XIte0X4!D݅~Yw(J89%ߣyEǢOk+j}rwh ڳ5O (@\uOgggk-tzw?5-t.sgaRT)jSz`]~5v,d$ݦJG!13i°Йn}#R6Y1),JV6dc8"Pj׿Z9F՘ltY[?wl,c$ByN8=^8:mE$@ ^M)A` !/qwㆡ\ YZr…&eiZ&RZzhv$Nu,BffXk*8[@F`0`ff^Gۅ4t]677p1qL:k`0 !'Nu6Rӏ.sGb(Gs"Cvm;|OIӘ^ߐfN_^<#?=ǝ}!N!׷/`! ?t8\˝w>F8C>{Rr7|O|XVD񀃇`;~e'PI_ 7#ï.gN_P:`\f(b8UG \F-Bє "pbc4iFE=Ƶ#фe8`vȕqڃw(߸'$;%P_?4 $__;N >齃ˍܖM_mCʉ)t0bh~I'^eQrUf] H k6c}RN {LM.TT*-> xaΨR`HKx 6hYZ D18&ˇ4[j8"lH†m3EihNŋ#677mγ5˲Fgϳ]446yXFQ jӴղҖTq屄Z=t( yx JY=Vw{]cŀA-ȅ[YV@m$IIZtڢCz=XZj4-.5uk/2cM{^X0&z={y𡋴;)X,HӂN˚G=n.xVˡ9a42\s1 A0 8p`hgff9יauuR 4MyY]^py&#6snkos:3m._&JƜٸUKXΉ'cFagϢrtwi^C.ʑ8nAGӻ[IPE;Blngk<>x?w^W?~}|-?}HqЮ/Ep=׌5Fnʣ'׹*+m^@ Q}ΝzKnzɏM<79|' r{NZ+% CZV=7<kI(=f.~TJ\吉),b74Dʷ{B|>Εp{or;ÏGw~/a~+a^Y|}T%zMC|ŏ_#oS  hzy+b,s9A JNcF1ʑIFpudъO4Mٳx\Rwvҩ צyniR9형q2~F`vv~ozT5y9~%f鹌ӌ)pJ6OeeH)cJ6a %մUG籪`"]Q qq $"|'cn6X\ ܊mXEIY0#&qo,K= 4~`uQdyQSЂ:LJY4%P4LuX? ,q~ Wi֥uWzz}kh.FZZ#,fm؊B|oM?CMxwqg V{(3+HfJ[_ !6`Cv?z6nڢS R1jH%z {g} }9[rEC鞟S]H^meCwf{N}2C{N{37}A}^CGMtotQ*c xŘG"LLtLNmgwׂtі7ՄZw M)52IN(# 0F2D1 B 2=f&n bbt 2h;OxCI hpqkDݢ+A7B Z tb S֣F 4 }\\8cvѡ;}z8熸R ÜaP86N3 %/.p~cno'(7C򒗼F<裵f)O:լq_ʅ ܒY.f3ur Fdcv0Y[@,$M,H Gd Zљ?gGpxpApmގpM-!7$ڳ{5,4r큛XUɓ Ҟ#BӤ)on$%?gan t:'mwe]94}wWWw[vW 3h p00 0P BReқg8|YU 2_D|s=~qB7ıڔ-YjzbFm"40VX\Z$wLSMn͸719fo?O|@')ב/X8A %T([4A-+ ְy0MgΛFK%צiH+sC-qc:fQv7jJڊ׵0eup00LZԱl 6%I"[1!қ&ܱL(ynϻ)%xAfC4)Qısl 7h۶vEV%YT*j=v˲v۽*u4^8ð '#UngppiN8eT*{u݅($Z5~#;{}savRjav#o}"BܖKejZo]w{/I%p+i~.\p^x%Lۢ{| G[CmnRVp+׹숋>y{3ak]$<,F00+6rvkKCa' u6ADA62", q2qcStiowDEuDٳgp~S .]tIW_&ۨpo|sk!2 4j-eF+-/cYJ(O/^u9s2Νu8pEGL IDATG.P.[ `Y099ɕ+WR.nm۶_ya&'I%l@Zb6B7 ;gLmHC%l$ ޻+v1dǎ$AF?rQn&7f܌x+*/ǛT$M溁1AVq JV|N[phȲBWNb9N;:^MTDT={Tlg4+kT;R^5ۼ6qc_U~:dehHV㵻8Iqt|SgA <,LXc2-R]3AncΥZ*9\YXI{")4 -SJ cC=$P(VD2f zb;6J(o^~Wo/oeIp҃gԩS=.bo`3.˲Vϲhpq* Ah4tWؐA0nBX+z]k퓲c18lv7u.{"۷ BPBOk}t)072+1}=F8t5d6;>o9{ àzwg4 b_u]A[zа,P"Bm GU~Rb4PjS$W 7{Qbi⸊(n1gabQlpϽē_ӭsCLNs[{>j:+,\{>sunI!jA;ӛċ/=e14<šC;8v$7ػw/ihZiMKVg>jePfll%u^c~ex>}y#&n)!k82fqr mumHa$aHw]S3EBK/sQ^x%T0u6u3۾7f ߑĻߓdH)輪 S"Pf 5&bS cr9Ri (FJy~.soLJMQX]=u;XmЍ[NP4M!׉0%J0-ޱLKz]>%&1~-O!D>'ĩ0xPҮKA(Cҫ12Sw_!U EskX "V6ꈚBo\l&`OFղI LIYiK f an;2QZ߁v'&J5#"fFT an:e-Th4THy@HSkY_2==Iij["rLHktte:QHto;8|m333Ν;{q҂":ZͶٵg8ٳo$6 Nui٫ ˰tnT@}VO3VVV 8ڻˎma242k4~@:n#fsџxO} ),{~aln;t+z?2tp㰴;^?y¨S_ )*9MVnCۆ}16Y]_#J?'=raDm(q iG qO? 0w| . CO;Q9yL.- alaAl}|sI^\҅޽uYY=l;҇ldc]84%*<\n~e*s)Dѽ>8%=̾$ЗeΧmꬕکeڰmmrJ)5l]{|H}RbݮCr \sۃk|~Nks-eu%6g,Vj)ͺ) G¼іI0ѶhY7b >$h)F;}sa5 C2GQLj뢂EnF I^cXO^rDH(gzbE`SȰOyV.^9$(t +F;\i-c6W\`tt?ѠuPXV,B",3AJ,%'Z n>eVV=ARy("lXn&"ۻ"nNۧ8A±:*?o{Kz~:EQ6rKEBPo EypS*8B@@é+ +++t:>Q1Ү۬.ċ^ðs=r/Yy`ABucЍcQ́GD0 lu۬X # Bx~ɠa #L eyteBp.NF!چĔ^~ %N̂)jm\c9."O=\BիWBpa*JKf^z%xZw}7ΝP(Xew=!촰BR@Ȉ\ v Vw4I$T@mvǻ.0^b"ah^}(Ib QN1N=~fl9,_x6VVV) 5NT,XY^gd,/:٬i2P25jRBQAPWwuǿ ;ϝb}}zSs4f~ïxn^r \.A&V8!qBP~CuMNbz.^Ն0M*O? Y^̕]3ose8N϶f܌q3[j}#{Ȕ{ʵBsT\ \v[C MC+lCO3;cr=|F ̓02k_駟MǐDw/̊hQ.,66H Z8sBџ/];Fifk lEQć>szN vۧ\htݴC ;~6=uT?zAw,l_M&&͹P:Uh o_צi!a# =y\^+@;>Hq UC[/-"uQ}'.L?%u7l+@["%qLU!sR!=˲}n],{o55[-nVRTYi$uɓK%!Q )L" ǾҴ-"tJȑ#:uNEr6Lo&B`\a~ &/&T*0drvg?ljR) ]qML,:ZV@؎!QVX]1l\EcjV=UgSK<իW=lPYPev\AS*k|Q!1U2;'F/S[Ӟ:^\ A%ϧ\|>PN~~ϧ>G|ux^4$ naY|/w0MSؕ"Kˋ. \ǒi5CrWW{v^St1O%C| j!dvvs t+!p#cR`zziE@-4 E8Y,[$IDH%-~lݶAX ~|̙3Ls=PfAC1::ʶmx'XZZbvy5 X__ghh /R(XXX}~i&''t:>};vPT6ROLLPY B GJf2p*@lbnqq{+glm^r3~n=B# qRHˮvMhZ⤔jt>' MQ&Cn_w y(2zɀC(B5`A˿?~ $s j4׹%"N%E>hq,tЯ"`X&R6t42Ž B}]t'1n=>4ĉ'h= ˲:m4 E>'I:iDV.~}qYv \iRV9|x?B(|? lՉ_^AJ*B'\[{ōRtٹY.\aXf[uz87…vn;Qy&ڮіkӎTx݀m\]Z}V*I'W9 !ð'BuW{bhzb!f8<0h~ez! # I4B'Bk!:V 3aYF ʒAX߼m$+VdsusJs{oHb׻tT=8pAΝ9RIڕq~q--'q]VVV4<>Ϻ]l0ԞC6#&DmDVDW%okNU Jid۶{wq2jz[~Ѷ-)l>\}(8ʱ|?ԩS,m* Kz}D°lPXH H@m";AsU/@dJ;Ikql?U$ "-l ѹĦubrJm.˘2a8p'Np}4<| h?2CLM&ϾrԮ`_Xax g aQ,Z\zq buRJ6$!-`}M&V/)Msex݈ˑAPXHc(5_n(rcHi؄"l+GBFׯ/`~~W֙9$A жIj/&VǼgB!E,S,;ٻwog7hP'IBu{Fst#X,)FSsEbrLO;Z:\+ߨ%5ٵ}\.׃-MZٶ.ωs8v$^]222d[HCk;8_vUhpehg! hKh51J.:I|M6tǑ  m[&0Vlg_bif_aaiju.Pb1k4f8v{ƙ[Q()+{}|sʥ_yO<=?~ _iy/'Ol"1|HO fx_ĉ3(n=|ӜȗEX*C2-`᱄Za#W_%Q!p׃yVgx- =~}:ﻓbdtlS"-4Gu:+9_[0UlPpo<`sJ/|} 'Q[du*/-?̹3ā]+T_%.u 30+A&@f-hP v#e"6y:2w=-GBF.3s*)o"w̸t;l;|4r9Lbvaz$7 cwMdLӠĹy:]Ƕ㐨}_)I B_Eߔ'z۝ Fj&qeږLlu]/YwrM32ffI$ڽdFk쵗60m'NR$!ڛri?֌_vbjh"_zm-ZHk"tB8LKܮ_q76КmYD~J@sM@}]){'IJ,iulVְRu`(l àzk;SBjz] g"AEe! (L ߻=vكog+a'D )Qhx"hxucǎcfffb7Ϗ>_tjp[Xiw? e?a`.EX$Eʫ!XX^ѰFcz3X6FB`.sD/RbP,|lS;,Qd1 v.aBkmBTBz,/)mgF!?ĿboBJQP}uYi7p"#ˁ)Làڻ8F>KWg=9 A a(S,\}L|4G:K-2xW!I|^x9Ǧ: ^|YNLaxprRFKs7g/1=:Fz#|ዟ-#?< ;]2c,|FZ˱ n1DVAY7]=~^yvv#Gswg_ftrTޤi39xȏ~?JTܹs8vo 'iGQw2t'.n9o[ CtES4ssU46DAB2y>xEqyn@ӎ]-ja&qmyƸuB+zߌqX~w,θ-0ӲQK(azcaQ qfAw0-<WR+KC(I)FV*Fly2*mqe+Y\ͩ?s}ߛ$}NGUHg/[sg"v7P>Hn֕n&xmZ-Ե͒| 9NILBR샸&IJ`FZ(Iօn= I_N- ȻFAhQ{^þjs&tmAĉ=KfXLKܳK(`Ȟٍ&,ܺl jXir9:6գOqZTݛZG!"Aak A/})MLK7y7,Ts|Y__[;)j:RqAnR:C%rnV+ֈ0f *Du$bmm|>OE`@J/׵CNK]xV Mh$rfm5iEP "<~FeHQ(͔Lٲwɏ' $Okn,/FoMʕ! $"yK! F|G+sP*coܕ}Ojv ZH޹+m q(###< U`"8I} KЌp c4+LEmarvA]7 jИr`4qNѭZ Ur9JW&L<**S`Mr9ŋWc<:WCL[O "v*/~}0}ƲcFD>?arjɉ8 >(O> •+|?`}nwQ8t+v[v4OO|Af7A<:/"yٿ?aZQ&*/+/ l'O<reXa{쫻i$W?;ϛ8yCt_0 &Hx^و.3PѮK4QC{vܳ!n=n&jc;{UJQfIV-ngʴ3*%$ rk"&qL]^!Q[ e `#86 j D,0^QD_[_B a=Z@D?mۮ&"UA7`39HԖ_"MRz-Dsm%1% I,L5]Jq|cXmjYܟxe͊a01E)i)6Zv'1/''q&qPB(m$%lݳ!ȋ]?_%EHӴ۲1o4XMN9Ꞑ*T/M q% DмL+"LàjHBƛ]N&<(_Iw[ڃ:Iyhck}$H!V  سgW^exOY+KgzjnXmd) 9NG ;r8ڙm&D)=hxؑ_%Re:A`H$ 6hѺ `X~Du> 2a k>#96Οݽ*mz/_ 011ȈV,O#-%V=p:y+U EbjzqҡkQx2z˗g CjuKz眝8L [[9W]usz\W=y{=  طo /ɓ,-xR~=Jl+|Y!Z 5GF #lk qBNDQHtAeeEӚXE vNs\t\JrLH-zm\<~ `i>L繜8/r{x2=wsص/,way;v6j⤅+<#5#`,Ŷ~NNæ!1IxD%{v%!fа ~t] z[ k8Rqp:%^?۾oamx~k)FRgfaN3zs\\,,gYFY$ [1NS, gHR4X]v5F8n՞Sx֦i繕[VJLW_- B#3[f&iMMƑΈj;F)1:̍RRмݮ-..b.eն#=0ky<;ya4QE09=U  ̼NJJ\`rȵu6Pd+ DN&zHKp8Das틢.`DHiBu}> d}猅t}$I 0juh4p{c U9 @kMRdRJ<%S;A<1 /TL~ ֌gMqy>~m۶)p_μ QEܔ:/׏kaoGv6ƥxH._}nk -$LyīyD l2pS/$:U]>ӛ+DKL f`lEǠ=KYYZ $p%5EYGrGd(`OLne$d- WO%Y\Zaaqɲù@ad{ [̱%#wzv{׍9~ PrT,.?NV}KY,Vsz1cV/} W!>:33mcj&?Xq91Gٶ0da[o=I4i-͟dja>w۹ye;yBnf|lf?H͟ KkiNҜb Y{ Ǚ#ٻ|CA&cD|UAbyyQJ–W?cDId)ktw=~Wً' o,*شgu?>,|~#E8;&}_O_9$GGxo GkY 6ː}F~9^~K}^?_; ΔKmѾ{|R8elVdH΀dڬYLp]3LNQD\)ڀPkiZ3Z^d А%Rֹ,/`ZUE{+5eV‚8طoc$)sOA^f%܌1+ryƖ.mjQe&F]d˳5W}5[8t}=kA8RZ>) oZYj 0` zQQǛ^eyf͚kK\:u+y3f4tZ=tyEO*7r߸%pw;wt܎hl J311H"_1- .%; !SLMA _T{<ϻNx"In!4De`Ǚr!|S W6=χ/w "gj]&ԥE0; !,0]+.t*.&Kw3)i9xiLIvI"Í7~Alzs[]+4F .&G"oJرv,-bq!ݶ:xI )RuB^LaOY4D03<&']FsCaG#oz+w  Cu@`- M]O0m3&c'IBvIcjs})(C f_o%Ch2Zqt̎i8 Cj)%Mg,v;1Lpu|zEp}+& 2.Åyy?Ap ȲUҨͮKS% `~~Gc""9W6fIy1\q =%!^sC}~ g"rgOXAwo>ȭ+;y [3=[/y?Ǐ}jqO˛{yn_\+ o5u5oQQ)%qRb_R\10#<%ĨܒH${qF50ԚQ@ X:\k[_X*K-[Y9uD ,2r-ԑbuuh,=LruF3# L399Eg'252 S7[.i7xb-Wjͦ Zҙ]0 پ}; J 鹄QS"%092(FRt! ,,Pvz~r;!^}^_ieir)ja2==M/(0ux]Sly>{`==2m?t<UdH!z~y衇ÐAdrk^qSCGj܊q0֩/鉞_*)rTr x!PғdG|f ֔xѴR?9i9G1Ͽ*u|Ͷsqru^YW?Ρ yɋ^M7#ɦbqjx\?W+.D8[.23/{!|kA)Wu AN^!v}uOVnWVXXqsd~"Y^^ey`VN\šBm0\q-9᳴/2 $u'jyt9!˧ؾ}}|fΦMp4MvV#HR32.b?α",u28GIVJs"@O2Ms$yѼ,d$1¿$%?W]J/p$}WĄiQ0F6^#'CY?1ڧ?!-ٿf~Gcy(;:y+7y{U|Ý4p a7hļS*Nm\S\m_Y.~L{98 @{ /ę5gv6پfluى< d x/YzuZgDZ^oBI R"({A2[[׋̬>chpbeefipQ6S4AjR3J)E8 2j5$d>6.0.#:x tU,u} h\&''Y\\$?yV#VdTpje}ndVtgEWc$%i+ъmz18,וt0 }נֺگ/)V^53>>< V/YZ&Q%1ؿ?:RJP:ɗK2m9AT7c]{5ngYTNedT0xR梵 4~n2%DQD,.w/{q1Dml#iw{Cǯ# L&z>{=ua׮ X<=q)N<;XC޸^ koMѢ0.Xp㧗ZPsk:lY0$,0h4~o 1# #hB0Hz!>%h-Ů-K@*XtP ¾`a5Lhzzz8 [PgynS)E{9TV\X'!Ԃ>D/_~r47hڌ0 4]+I'>H1dnVeBrmPc>)3ߕ`!])l0H&qQz#4fuFdrbi'YZ^By$ 5 ˏ 8'|6͉, CAd<U=#Hn`|0@Qd 6r__ʭo.HT^P'5l91F@j"ۣ>l^x̨ }}Snml-4MYYcU#Nj;B IHP'ӭBy_7I10Ywi8o7pi:;gcLB; cѵ xc x;Ibp" C}Oy?5 ,2n Fd0̋}/ C 42I7*`B~%*zbxG,# ű4P4IbKML(N}p7~ A0ɖz0HzeljzDadkfGp&9N:4; F8^nJydixn'罊׼5LŇxۯoc O i>b4g_Ys..}n ٴkrl߾W^m{\J~7{oW~ySbee]{-7~FO\37%>aIoU 6/DWٶF6A'X^X"|i%"42r8% 0BrF@xF cYaUY3ץy/?mGޱ~:)u7B[G mFW3}|ٯe?u5r&9ŇoOo=o[x?!'eZB_? ~⊉ +gv6پ{M ].YisO@IQ(,ekliW "[NR׭\LLLXЖh55jBʠe>CeY9+pCWkbܬj-Br>.%$ilԹx4QЩ{|5fϔMoz#@ei1&G+A&)q w j,,,TV;H+iEKzo-5٤!phQ\XXv 6+sATvQq6mD*ng֖S7 v# ۦ0ƐQͨYpcBiynN>`0R A@[rQFQfȑ#kMZfWVVZifz Rq)L!8o |ԆC]SwHFTa}3!u' N22l`GkGe$~qh,-0i_2)|GA^8g˜ah}aV|@&BO)F4C Tk 24r IS q뤒*%XeDm4-*8qc#I*3#FF{I+)e9-RW ᒰN8 4Y [9B4p^Q4&*GҦ ,A.30 (m$J aQCa3F9R1hgHA9ͳ!2´Mj3Z6#l'#c7x&Mlh4F``k) k "4dy8]pD 1|G= }f"#;GsKdv{,gIa359C%m*I I!Cv!'Nsvm}y!WSp K q"YmKqwSvs.&>pz!lقz=a|\|ܷ4M8K_RNW K|6>Nf@¡CXYY[82Wt8wL/)[}3qsϧĎ['Y&䐾Hy}Á5˲>8E1YNB"8+:NII J&m(\4%ꚵք@Y#Fgc˃̂'s8t0@oYg% )\5ĝXN@k@]udR\҂+*Yi6b.<ǩ^TVd k#u}iXB<$z׻h6i^2kϣicH6K)  5ql2e]X .J9\S(dNU^,8 !_)0yᴮ5=vݕ݀4tcǎﭿ:Sְm6F: l$<$ϔYls(Yqĉ8dsb8VFre3嵚Wsx8qZ~aii c ӭkXr޿f`PvPV)JqFPnjACeLXy:PDJ'EVE[?SFQ/2td'dVj55Jn 21q0޿f*i82i^J}e ׽glpP3 YH,YyF3@̖{fmk<_m)L!ijpLر<1 r+}! mx)Sh!AHH3xnNPSDq5aԫa$F8V댃-Ib]n`>OMjk2e \aLmjGzO#<$Z"!Qڍ~5TZ-Tca8Qu L^`0`֭i*qkz?3??bx-7AEmɉ$no C\!yt;!<]w}.8h;h޶nMo:P}롂1VSh3#9p뗖N˾rή M=V[f4K+HG?Tk+JznNWdl2`0Z&$T`|^gK?$@|]wm//;ůᗙXbzoG6mˑ?gK+)/ \@1Wmqk.iy{mÑ7"^fꀠqۿvnwFWIٌfʇ Ukh68N}K/oE*{c'!S e<# c.)mU9R:UO9WqLL̾Z-.O2JIGH鞱hVVG&̚wt4Mz^'QEwF%vGEJk%S9* 5K=o+5zWp .xٶ"CYMֲ/AJi3qaUR jof]aGc BAV^$Rndz sHW^fbĂ຾-;% LLLXC IDAT#mjJCR)׊10\/M$Qðb8b픁K˲3)g4x"8Y.K)Kȳ idecw-K6 7f.Э3,㸀th6n\%f92,KiYYYezz 9C\׭|F߿2Il0drr~Oji` d!ROxY O6Xu-$-ޱ}CN:,/wض\93,`3¹;HnX1 RC6åtA`(26D>fgf0:\G"fw~!RV\HCaĠxjm,pE:Zk:xWUon3 زe5sOez|A?e 'ۋ,tHӔ͛7 ߊH2=/ȢKOP59Q-DQ-wKY?M^'`4M-ff{\y啴Z->L;Ӯ؍T1 <_>^1@J)vLN߷7Zqc-͘a&hm|ߖ}ɲ,+.me+{OY^KG>HּW=ppX;Jw{cP| /}iY*6=33y>'S8jD3.%WU\Npr7ss +.pt민ݼScY'kH`~rcmVGY^^[nq\sNEv+m3\!J3Z e ,۾ې"rraAVWf(y.\Mji6JBbϥZkc3"߭iW$jlLQ&-\*ޣc?b,(.k"ֹJ[F@QBSPK8M52])gi%ð;7벝㙦c-Vge 3{Tiѵ0.6f T{)FwZS\mcuxRK q=dBY);j+)ZڑE a͵PU~5S^o=#)=K@i,`ٚ@ z1 [3G_~5_(ˆd= t^'f֟۵:fFDA6y-l(*-i`lv|=v[st2~ceճd&㭼.x\={vcRZQT8h/JHRCjE 0LPY9innnkK5T|>YDۑz+8-6so2+^⭴6٠lڴU/}[oYMռ?>AmƸմ5|T Ye#hL``  8~D,[2l[︅ͳr5;\vq5~9r p]qz8`_Ž?JD}[}oNb~xۈ8?[su:_M>}˧y ^>>wxɵ/zUnk_,vÇя~רxQjЖHҜI:NQ.Op}hp.,[4˙hԪF'ȍJ9})]ðT Jhs'p X2X}?k51-k[mEgDK0.Q\E{u1щa!0ai60Xsፀ@ OZLفr2&oYtt/֔ 2i|>~fqzb,FFLvZkYC7Uzuk2k^kVL`B L|Om sM3\8 2Soʷ`r40̀f}` |e76ln_8(ʇ\G}f^#$B2e++uZ45Je- 5eRm̘E ǃXr#8nXp@,Ro_6"KrQxF!Ҥ`$iw|ڮTFH$d_s4 IKly1)y/Z# G 08*k}B$sg1 -@ P֩Z(X<\% *JwȴVF@.G( 3C2v"#s:>p  5jM&"*%F+ܲҔr7ePH\ GA3<~!{n֓@ 4>2 # ϑJPj,'K5QG]i(ti0ʂjGH4@IʬX 4| xjX2^ױ>e-Kg%Ilkfө2XcG_Vf,#f(a9ZuahG8|e1H׃ x |kc 9y}A- ̫@ M)r֌֟ah6t]oZ^|7LE+OұLgGñ,*q2v ZCX'!뚱dȣ1CۤqD ,vXC)B`4C2PuLҲ|m)+(8M5vǨ\fLQ*tAF˓!2A/W&''gE/4ߏ!C/2 Hw1qy bt`ZtۻQԫ1}Wa8Aʵ .x=}*dσA<{IwF=}"tV Sum;g˞bzanKcl?XḼpK. ƅ8 {?oI鳏/o ߉?S~-os6qҜ7_'O\堅ƑYWoE]dH:sZ( +2><Ox Kl{aY훺xk. N6rG>;wd޽q 0&8&b޶u 0" pͨwh i#4瓫%^Nf$I,:x. ;Ʃa^âSZNUx?gIuB",Y2/Bw8~}.%d9% pq{č7 Rxαh4ZtFd!6j&Iٌ4M1$۽kK{U{-YUHTЇ!GGGzڪDQҎH'vVչ5""4ř}'>ُƖ_ZJe f%||LTً"G`O 0yТb*YA7R]@+Xܨ ؇˵]M^;YI{'n7$'M` Y?aVOR&E yHHz[Ou)5'Y*sFM*2  sD5w2s$i)Ci VDۭ -kkp)KRaBmm ya@^_Hk=MkQw%vT-2;ad'smQDPXF8*ZG6c'}fPJQH󒆊RuUEz E,_܇X<ʼLS$aV['՚{Wf[ϳ繩Taۻ랟Gh ߑn1M[]VW-˲ ,weđRpN`Ɉp7JT)sb$"ͨl--گڰedgykΟ;auR-K#8Vr||܎e!*Q+]'I{x$:x/ZI>?Qbqeqx4p%؎-A֝0.yoMwLh1+r{sW0+fu$XʰsL&p*oi yh]SW.REzp&kk+r{{{l]m0"sy.(`gL1eDar!$QTy [TH)2NB75,[᫣kG7X6֯p|[?_}gɄcWF0Hg{y{ņ78%q<AuH_}%R:鷀~4յwzSNmތxwdVЬ 7۳gϲO$c6ֶX)d]q7"eY(`qHLg /)km^Lآ,Bb]x)i/TNhԪ k8[ "?DGOs"_{h_x>/~t8?:j%RahrALfk윣7 + X5!Aj: r5M1++xe4j M jˇ{Xz~K8gK^}u8tԧzLիS I"|IyZ7"l x' ˂p*&N(̊cbgۈ7sw¯&sQ :WԢ=XHbx[m vd@ 2@eJA;E\tmX[;M/\tޔxmM{IΊ`՜0P'UeYr]"&| -B*D!=ֹ`%.WUveK(bψdPόp1/:a)Q2Z#’f {YBvEőIbl)ZX:8š*}O>[w$ <(p_v-$x^Ԉ7mԇN//`$I{X7 I#ʪB Ԋ(RZ`uuB2( >]!x<ΎK<.gGNEg|($/:`d+1`6K_"sptHGdŜ$(ɇ2HAؑA֧,Ei(4i|: ͛7 ]!% zFI 87QctHakCHah B?Ku%vk-*!ֺv?P'}X5sAܭN“MRRqsppPEVG~tv2X L:߻o̫}XH$Ǟi'RLtbϴ .V0k'8^k8'6Uɹs+ $Eŭ{AEl'qJAW83q0;ʻ//s䢦[z8V\}%Kϰ>\ ~J[ |&DN !au&~> _zc7h$DQD#q(ڙW\C 1ͨ'm!w_]d<^{y?.2NvkJTe5( 7pY&vxT` \PpFZQD밲 (lIA.k``\$+a ^9ty S<~'g-FO\(ĉPk<?Н{t=͠>yj </2x7.4Z:W^}lտpks%o74ށx[~vw1 ")QneEJ`E 8lI,c:16x`uԸ:ANgOf]A)mzA !ʲmwwDʓe=_, ӢՑN7J^iȒy|^ Xi]EƢ=]# IAɽV7gWwN#*?}yA*(ƚ}_z $# &E,-Hʝ;wA'8 RFQOvhfE֚ޠOYXq@Y8FKEYNKcӬ3-W ڃy)jS($@j̻ͫEc.g?ւh&9Bb5飻?#(BAqͯt% _˄T7c~ɂoaZyDǻݎ1(AS; c>w$I8Ex+T|7}ӳDOr5vvQ%Z ]4 Cάeoo55}6?<`2Opp|/f O?s+W/2̛\$W.۽nݾqyb XGYQHAoZ/qvDy@FE2^cLx7]~.#Ie^[Y,c#?t\xgRE`"aJMh4B2B_:c2qx08ݻݘ{,VloψbGY\&a<2ȧPpjYU)}'|wkI,?l?Ol6kBkd >k|6|jE똲(HҔbi<:\xK$U4?&ޟKx s6B)5a6 C?s?˟>F>x|݇X^%~;dZh n%`ft|xZ uG PBXGIgtWy)qq_+? 55v96DXA")ay߫ B9U_K, 1i3)u' C,'< `?Wj164mFRJwK/MuY$Z)E)VCۂaR.ph2`2:n'UUGqxxXF4ux ].ouw҆s A] *ܞf[q`%y&(q]ܢwLQ͊d=1/e\2{$Ei5N1jyv4 `㡞<6?VqZs~8^RlןΡAP-L'[o) "4h+! R%GEDQUkE0PŖzgy۷o#9ҡ'mljb!H\eoo`u) yyqLjS?3O]ݼ kb=9߀{kLb1F0{s?hpR^z k+-~@+H_W"p" Ļv^MȢ(E,5D>3nhDUUBrL&nm*"]3DTDCAKH 3Da82F8 xH 4UJܹ =gt4#PSBʲ$2*(WUR;~p6+1^PX5Sx1>!߁<8G3pOwF|O3:'N2S?t1h|sߒs,toBIg͛^q_[&lq#$س :@+xxb>F+&BH !nڠ,8ihRq4 1+*^yr  7cy>O?-އ]$c38h:?θKI3JQ9- $B]+!I:8Z,2p>$ڪ;zIsUzY5.XGl-Xݻm%=c|Gd:)(BN4(tj4)ޫZ=Q _{wv^D-n߾t 3"!p~a'W_ &sx+͹ 5Ȇf2J#k>1%ނitʪBw8JEQYGD:&RWhIʵ$݂Fx"mp!p; y$V+ޓzu_>uѕR}Xڢ 3#꟡s@y W!$jkV8JD,Q` cœȈ|Tuۥ/!lv1b:;JI}F͎bՊY 0zH)БQCkД"J:WR,:??/~3su9ql=.muᥫ4Asܯ]:Wlooo! >mOOrm?G_yh}'=3*O?ݖ?~ga2[Dĩ ސRYֶ6Gy~o TabkG RL8U!"Nt 5Ó$ڎw/**#\ph pA1 "K>ɋ[7wEW W%Lˊa1 o,cL8<3Y)8:F12nav8`uq_޼toOx>Fv"R4LZHZza3w_,Ktp}[?"^2k^UUDP\c[@KjC^|Šv_(i|ae\Xx_wX1U}k쾖o/iۛmh:u`!T@lH: 5_ZQ[)@ #5(B+a,Q]ݍP k 9g[a<%IePB dV$|͖b6Gn"t@ۺ*^:gƄB"xwE ˳+ǡNE_wx H3Jj5Wz(i-d, ^^ԧɥ=y]߅P͚]w-!u~(K`eeM>www:c=ƥK&",3x]' GLY6Ůo˲)KYxL&Wko_e(0&1JbCZˉâI&n"6cY]w5IY2Tz=VWWz8::JΟ ZbKY[al^/ɤթ {vb|l8g^}%yT :ы5B7ܹtoH?0[/F!i?*"1%XWa YpVd`pr.-^}6 dR PqL1___grxc+߯>k ]ѷZ55eQSUͼV?8FNzҴԊo+p8 خ LJ?a> Rn .,ܻ Σ-,LBrN]o2}/|_;/t8.Zk$uW=u'?kOӴ=VIP9 "tC}1t)@CyÐYCւ5]|_ɭKpj{^R J|h׹*,\ƹ01dB:QnZ۽L0qq+0JkLPH=ێrkW5jK뢉]#vQRp&Rswn >y/(mY}/I3Bz*p_R{ִ㷫;/? S~4Θ]>8)fu d=]&ӐK0Dkx5A[]UHfXG 7ID<-Ӫx#7fbng֪-Z_b>1E\?۵]F#nݺUk[666_8}}|+З͠15- 9Y gv q%>^_JS*Hҝ*t{${S\ @S jf.,}m/D RÀR)/"RVPnmm!ceem6ϭ~ڙ'8?7/By01Fk믿|w†s?)3'CyTCwǜ0d>h)<׷\1Fp|Q  xCpֳ߳҃}cLROp;p;_:w f>2.A hL㽲B$hREQ4._D]P): |+` Q={G~N-sn6|Noi|z<ē\|R0;p4tӪ 8x &[վۿMf6Yo$$6~`i-ᬥ4VLsbgs40 7uWaTeǃIkG+N}6QsA$*e p||ao+Y7uuVpH!뤣j& j5@GriBD p4>&/я>XD-Q}[EjmúǾ;k3cx:k.bw͡%P5p9z7ak_լCi{ce6-ɇ_Wף (xY YOo~m̏ƅ [ܸC|mbmvu^:yt*"t#DXwS&|Fڷ}sK8nVkhI,,BShZjM2Ӡ}FEp)I׼pM$W^} "c8-umXRݢ-F5GTYF |Y+76$%;rmM*6779::¸<]w(j59н&^tJ) ͽ$<z@ssm]Ja])B'EHBQ*M2a +{£;yY_Ivq"br5>Z:G G#P?Qwy?1RY?H ^Ȁ@]lF֣GtKCօ#AQL(2Jv3πJ@E%^Q2!52^fߵ =6668{lpUZ1:g|9IjMZ j4Bl 67ϡOTz7b0fq5ˬHZ*| ׮]ct6$INMhuF'׼%Һh9'ϥk19/Nv)Bk~i??Ai,jͭ.5GQLUx-{رw' ZK$2NI<΂C;!P2$q>1~'!4w 7:$UU EErb+׃0D'"^/d4J$V(t!lW O<ĐǫrfKVW Kάmpm̋CVkBE%q`#Q:yCbJTyTt( օs9G̫+Wܺs@YFqJ,}c%f9O)/1%Ue3Wa0O&#;䋂[CyuSDPh u1'h_iYӛr_od:q;%ۜxMDd^>s?OiC"TCP3U=!pt| Aonx|l^7VjNgzr_K}Pc<`!"ƁRg XTa2 mtDZS,Kϋ%$~{TG{r!<_[Lxo:7T+i%_pRIvDJ3Hɧֶ8Z sDZIWd5$:!!o|>?$Ixy[( fAGA~amD&P\=V# wR#T՛j!eNU陋x:C)CgX8h<%J22'KR^yMG$EU.+(V%g6pttԹ^D2Q">T"*V\rׯn(/e p]VhMQF>l ^}o Qa[$*sIx]iJC~2X'P:)!BGO<@3Y,_)\꽛pD Zt m!F8t{sRwnٜr=,x";;;o\!ɢja\[K.sυUܻ7Eh4b{{,$I@P7bgJ)BƪEd2 id2a((9{;~//Us}&cpַҪ/ޗX,gΜ!";c:DMzـ~ &t}G<7_mm͒dc֭Y\y'DYE9KuHQL'C擜7Wq:e V.!CG8 אi $ 0&X7g: !m-!vR:H${fܹ{=E+06#l"0eAUJϦ4  %mQ3K [`[Dw>&Z B-9F -<2W&R?,24~wƍ :h&zLyۅѳG28$ [[TЍ7yLYb (!%K1U%6Q -m1 b'MmL$.ݏ(!vyԫ+CU9.$R)HiziYHӴwI`ZiHNH[0It]˱H>W^ XQhɔ~ɒHile^y~aO!VҷEPUnm`{t00BG*(9q{Ѿ: ??Ou5cuΑeq3+- ' &qOuX'VŶZk8(DZ+f \𾳳j88m',JFuXiĉâ ",kBLA_>z\~1@kXK(l=9GYUr^HeB(6ĩ '88g^H.D.,K{t"8+q(  Aڙ$܏s7NNm3{ߎc{>x@QQUIǠ>)N9Gw~48MqmxKfL|t LM|Ljq1{RY?y%]ᆬJRUIeٖd[6m14ㆦ1310pNL@7 @01lL7dمnTw5"ț#ƪ9ԫ͛ﻸEqbXrE)5>} VDk1u( Celaȵe667yEN;t$(%hooFK@ctӅ v HP $9K^gA!Q _LS8vgyy)+I^`ermXgU8vJgu\z3k~$,--,`T=6 cjB\[KEZ=zI` \U]"/ ~ϒZhkeUv]T^;rロIh g5SC%tkp~<_o!&cZϒ>q ZҦc7E7?Nc mݛa=*mB8lrZlpPs2,I!I|VRsl(?exN$Ma90k8-]w] "7r5\c8kۿΞ}ླ{;C)ǹq0; |/0 zOCaˊHmx4T]eYrWhYX1w7ޫyQޱgYֈUzVa-Q3wii _8wϟСCsonnqeuu~ךqZ Nˈ)4a5j w{.9"Z=Rat`1u#G1lu_*pBWtF ^W,"L %2i:$-Ig[@%+*ԟ- 0t@Z"TE3`4]| ٞnW"d.*IMSݜ.2r[Oi^>{hzFnZ4q=7YM}3; ЌèQN@ͻwIUKM4MT@5qRꊓ'Ohc\C`HS%x^ǯođTP:N՞+ljr;]k'\~?pY"nM:o[ܪyU$>|ZY^Y]'3MS DdF/;c=j|;¯w3 9xjV7jhK$HwYQ 1T=\>Vҵ3 4_q ;˶zh4j2I`< ΨTB;@Z'~ jT ӟIR-"b{ 1de LQ:}-~iHZW-A >?sQ0%' y^Uwwy+}H60X]]emmoEC8wv)YjQ|u~n pD=BUA6׷tQ6GMH`}䫖< Hz. FLǜxQʈPhɲ&Iv&RQSTrA`IUmw萲LFal& .XҋN[h2kɄ+t,neW/c0(b{{-\`+LٷEF.R%q &]3V[v-Gl8ۧWSam͞$SHErjd(gϞm1Si:r[CYhJ8Dtb?Gѥ?zmXQQՍwf֎_H=~׿?_ÊL??3|{~'6,xOy[GwsߣW^\>x;w; gvCߍ: ?<ΗꥐZ*q ?ۃBQBPSƓ2+0VPյfAS.ޙ%I5\t@l,w}_ V|aA"T67e/{oy[^WW~'~pd/|/<޴iOFYcs]wЅP %A|vIKRV$P8|/FtgcܦET %]wryvB%I͗;FgU"AR@nMe21wtugN1 PDiqlcts6fAZZZ"/2w$QcP2@D$BE8 ?1X)AՉ18.c(vqooskNJqu 4DЮ=(]-Z jcY$qZ5MX|Q1->|UO3ͅVdGﯸ3d<3 mXZꓥe fcV7E|{",!݃Z`@Wc+tU~os{R7x (KM v@Te FFIJFjN#D BYtTP(" T EEFdΩopuy)U sp*?(k~x:,"I]!8.JޮϾ3iԉɋ0<8>}J $ItJ9( ު u'qlBֈzꅵ dݩX[Sd Ll5okA Z{%JMĺB k5Nh6aX[:tD UwD݂RmpI4*(t BJG)* YIgy&K]Q@Nj:L&7@qX#n*OAt7nJ2QHl:Z2Z[J0@i521֒/Zj 5Ay ~<@k"=5BFG0Ug U[Y0XS*F]:A<ωto Q8M7w#5)1R1"2ZbTl›n鰾?kȶG_ĝvgOmEFrh:"/6aٲHXqp8G$=z_1Vb-PPUnj~"@ ;v|-R2 X\T rb5/"nllп]w_ /.LĝI10bO„8(d%W\prmN ᯏO?CVހjXw:x9pܻN>Owڨ5fS~>e P'߹syAѲTክa XdG*BX2jIL yA+MmShpBn7!<. #,L-,sʪB~,q%BŎu>&.H+XX߸FFDdل`E6 K.^h4jOUU\y`tYq'O^*嚫n$K]I ٳg~s[ -aNVE/u{]s/BZ&ш5& ?DQ&IBQLSF]#7P%_ss|׷ZV"?3s ?`9ŦsEW %:f^t]5N{imy)E^䣍 +h!j4ٽX,.3 D@@ֈe\6Xm)󀍵)QNZ6IuK>}4-^ͣŪ, 6P'jޖ[n<+[Z@Kts ηԅ6MwE(qzr3OKD,ww]jh~}]^vm;vl>llsR:_ZZb<>rGd=[n/C/n;;a2/~ooFIMґ{ْ0Zڥ1m!ybc,IJPCEy~S.r.ymC9b m[Sb?4\{:u Qaۆ/ZeYF'*1˻YbvHƌڲF`k83um. !ȋblKYw.]$UW<.> 1+:~|fJ+CoG6au"hd rP>O(+*+IOV}ր|Q$\ЀLfxR҉v=~~7kk~wg}Z!gU"]ʺ)f/qKln#xh/[_|iͩO;?X[/הuRsA C [k9@'Ҟ%l]l JA(ݳ^։yʲd2Iڒ4 *&)_~뷎q[D<S, ݳ)PsIR S !OZYKg1{_qqig=_E{%UHGۧ]&!*?dYl%.Z# 0~(uŋ[ln u1IG^z$KJaCDa` 0 P)RAL:6 )) k,g{Qe?tKRe;q498{16%$i!.ck(o뇢Uq^ޖ r}c _=u/J @0 p]bkv Tg-U8Pj. m(s[_knWYDرHP>ťQj^R>;%MAKWpɅ"D_owHHsVG66 {W>B0rLD/Uk0Zm۫{\[?u⨋"t[%JYiA\'=X\c x/ln c8{ 6*@0Y_8 %{'`EB!U,ҕiX?7t5Kj6IkKu(JJr!SؚRxg,B$5kY(GSW&" dyAb8}SdZ+BbdETeIns0F.z"[#D*$EnE_9|WOp&Iҭ I~AU6.J m%$:}gCE ۤ1eQ MB̙s,--w*'zgϲvL,v"W--<1WJSh~Ȩavv_> qOs2;!j,8e\7s^;賀* kw'f)a6 |#TBJ)h7󼫅.c'Dy^O} 0i`wl]췎n-p ƱsVJqA}1݄̄_ \YCR?/ms.fye/BH:s4]eNUHFNH8МKl<\5NYZZ#q5P>s9t:9r{9V'~f| ΪF g-Uw:G^rcYN&K.FRL1ozӛ{9},qܥo|#VJ i >ᐪ,Y\\$|z<=qkk8^=kW/3Ⱥ`o͝;Z~o8BBWhY/Y^8O#DPH rS0B*<(4u*q$1ET8wUXz.W굆tؠ' wy'a7u]n|Y$9^o>ȩSSWLwi|; f݆EK)yK_V{j;)EUzF##$iĻ6TB|EeYHDf`N0 (X0^5KI.J Φk:$v|o'N>+Rt}'Zv آVv2.;T]Z?9-|g@Z 立ppcZSUU@i<ٸim**y A<[ݷă?x9E2\2|\2ˊȫ Cˍ3>_[!o:"X>‘ܳIQW[mWe ՎfrG4+Sf7sRm뷪GLbhfw ?miVP (.IҡeLDUE,˰qkxbBK"*p8D[?3%$2l 6\ϯQr:ZZ@(AV@MɲF*W RMV#f <p8$sVWW*`ӥuϔ,63I *LӜ~;O;|:o?ggbs\g#.N񬫚j%aP%A<Ͳ+BKM5VKd<'&Ikl85bSYE@q+_ɓs_;5;Z7>\s5,--q pv a',dS0zˊݲCBTkJfIC5E$Iv)ruhC\gee˿ow]`!qڪ o?Kk ֚3gpmn%I>Jpeu5{Z3)ݢ{>1s5K7jm4p8䡇bcsDѣGskcct >EXUtK"Yt$=,سg7|3N^qtU\R-4FO(z|OOPG)XXð!h}QX96пR/'Gɢ,KT=fBތѾj(BŤH_R4łJ+\/'N]<'#́Ŋ(^hf 6#<ɋ>FÇ!wΟNXknCdí`BCJ$Wh<"5eU"k ,kq9.xijx !뮉Ku:RT^יY. US´q: a۹QK!$EmVk+҉,ij@ /1)iQ!UiOޯN3hV5t6٣gJq$t "T$mD#N~۞k0s)Ji"ÄX!A#U+}`k=[$Ql8FI54DP EB8c(1Zsk8~4JJ6ϟ'0}ӌ* \H(*sDATk t oNGr'f ) D"H a% RJ&P%ͦ2?H S!zm<$T(#PTAeE%b ӉGh(m+ u?,-.3O:"LXH+AK AκFλ@apfO) gΝȑ#\w oy>`5h ,i*ςV Y\j_qx[Vuln_Fe}CI3iFub/A' S).҆bYu`tp`󰅍-5 53Sw#MGD]KO zcư(PEA;Wiڔfmk- rw/,R)Z if8N[ɶ {Pg]*Y^0Yohb5Ic:8경 Ea7w8ifST4&PCQۤJʝd$bW7pN,wjMYsC.a~~܆xQfXm#˳X~CWhvװtWHbQ󷭽~ҽ}*nÇ\1J $v|Hħ˜M'VNJpBfEQ9mc̑()H*mHYΣwr WvrC\Y%EIm*aO2V@,d3[y%#[׉wa18na#m)m^[ܲjH?{~W> ;I6ӭ..36yVMMn&e k*^hB;:˵NɋvPK16_<e< #kh"ak6hE7JRb04׻E T28Cw̹s U\})Gydِ?*hRΞwsAVWW,,,p&;)Aŋ\./S9 m\'+r9g>O?л:s_7[:9gݗ{Ѵ zl3ݳTzDLfyPKI^P!#BQۧylhQQUy>+`&)H F )?rMW$3Z-$a쾦XCUy#kmvq"/pX*cGqY>rlmmqY=v!n.vx.#ߩ1΢KJNf[| !`:RaloVmx&h MQdDO&3\w:|vxmUUiBi<-#ss {q`xDauu$G4(Kd"fTn=ccMV[yn0ƝYIc xb+"/8.QD&2SHOj޹ !|n~=?54 5 Mj IŲȕ+W\h0N++} Y6bya@K@`v,--qS_ *:33G}:lڞDv8pL"\|@PhpxmZ `Gӡ 5Wy3oXIc<7|3o|"4Vwy{bFUųwXws`8r+WPq*9B`qEkUMY[EKfeem<%6^Oc-Z=9K2)km._9Μ9ˌG@J٫\{ \ݣ=yYJsϾ3ou@-ۆj>u{D$s8q8YSOfkkcǎq*)~yT.'x-,//I;em E8ygXXeeekK4!N8~˗/0yh*}uq:/M%w4k۷0v~;.?ۣ^؝և& Q4pσüEA$|RȝuZmEcL.<666v4M%y#mEZ/1iɋw|pxi&:kSn4veQTc{s{0Jtk""jJ,~9y$W2\%c;'?p~4rQ= q;Vloo78Bg8܈KhҮy*I EbE>鰸tͭu k-&iy,^)([][wV!JP*Vmdz0ky!%%5!$lGHY@J! r9jkթWzu,Wg3E{a pO0;;,h-| q!:Kuw݉\]+V!K l-,nRW2OӔnsT<鷿}C1E92 AB F٘lbøeIۥ2%.e%d(Ke$|w8R1*q>*x|˷;K67+MY:x8P\\\$ϝ@NYUnCY0%P*gaFO:6A{zL T3),-qJV%+ XY`AqqR18pv=?K -/+|>Y=k۠[C;V8OI( A} ;YSp1{äWW{mpa[]k>읉~~q>ys:3?kA U'U84G$XSrUUvܰjV_u羱FB秹n\BbS_tfFiek0|[i TgYu>ֺnc:B/Ԯ4c Mrq;7X|~{Hiw|[ EG^,p8`kxF#>qz_*+1¢L`)ʲ$MZCЮ IDATSQ!vvNh]t|S|i@{Ncvor6ǺDz6!a"_|'$F(ϨFE,t:|w|=Y>Ӭ\%Mzɏ|z5/\iSffri+t[s m&gmqh9cwկΤ6 SbfS~G@OǴm677toL Kg=&mIZqLkM;ʳ"v.5w{]%Nj{}ݠExhi!D 9HXI* i:c3hPGޫbmm,IӔ2//9~¶Ҏ5nTbϛr&9lȔ|ӟv>%A,`|bZM[S.UJ"uW%Mȿ_Wr 㼜 1r}q8!\>|R~_W;PMq7ນQYbq+'>F|)%|EEu% ÛÌGo!wh L6:%sU RԖzK>jVtAM[`PRrE $f{T"*H[%x8IF1.rH%^  k}J "" _0Gln V`Pk`Ţ@$"eI$܅jvo ~a{P Jda[uh[ݟ_k4btE$ )!!5pn.NV!Ʋy^v^]xc@ȸs‚WkL'cR2RBL4~z^m333>'N097h'<< wZ鰲Buﲓr\4"Θ)˒sc͹޳Ý^mk;шEE&)Tt|('{92F#j/y}c<%dR u|C9Os݇O5fJVGnlo6lzm$BDT 5 (,3˔CsYUwh+W(f+ʒ$ӝIXYґ-qM)%!ؒ ΄S2ߥXj%qs3)vLdzN\G[w4kfADiEwΟ?_߅g4*rZ377w&~~ǟxQ隸X,iPvy D!e]׿_QHWJƐi뺆omwoh,R&`@i#篾m\\ĸ(rmg_ sCyZlZ1^kK2TZ)Vxm9ΚhXZZ`{{<1m1gh]1mQ @['ʫoC]ͱݣT-"Jxs"u!RF p/mi6;A Y|ݽh4Tvb/$&ẂJf ~C\E !)kܜ8?_ܫuHJog\\_`*}}':RJz]h]0PPh40,$IΊÙ8񪢨07m}gNcFYEǠDz׵39X'Mc^ݝO6ֵZNxtx:*n|\ h]Ri(~xz,&D*֚`0v+y3M8u1=i,c1zMZ)[Cx#f|Q9MӔ9z!y]XBż 0INϹq}{)FWd7:}{ K`4$BXtNjys;5 M8x_Kߦ?G=iɣ.ê2%*r_DK5$yPPv9O8ȑ#\pR u_geF׏VOaWR2iޫxcgvR^p*^sss$I":u ,nBJ,:hIO r&A`0Uɽyj;!^\c\x(ڻ(”c6779=SPF˗/COG)WJw6f(_~/u5kjZ[NneY]Z(0ưoZL"tN;ۉkc*= &N4^c? *Fktssx<&"ַ[;hv:ó칳YvEc/ۧ~)ocnnEܴ]WNG7NI>/jj}J dKE=7;p4%TR1DPI+ѓR9Dt=w@kEHv,5_S'K"I"@E+:N0mq ?lnn8^龄pɲT`<رF#F㜙9QFf:q $ڝ)¬#XXX'֛ qSs"vdx<ՙƩӞ-Ȃ-yCUo_3ytM]/NK3z6ʲV`pSkUo䉏= ˴._`cm}'/zulkLL[a(YN8C'PΩW[5{}zd>s~}凌bTd_ rf8xvb\={{^v~ǗHܔ D)TJ&1ykЇ>컾NkTҖJJ]&J^Q9K@Z$q bb#% TƠa^`,J!#*cQYdU^<%EmJX1336 s#A&ǹxCh oxЇ>DTO}˭u]etTXc'K> S{Ur v A$X*QR;>V ñ^C"y]ʽB9Sc}'7uJhjuXw`{k++h:T= @7@`|VDT8j#%R>l˼$m%t-}֒;w"qkV0V`%ĝ];d{'/ŠrS_z] TᨏGG !%ܣX!)=d?RT"r]n$R2v,dŐ4Ru(j/E~c--Q lqsu6piWݙu]a)%nQ6T.eVa^,JVA oyI(+!\Aae O%Idw(!IbgI?//(7PC4vPŎx%wGq,k"@ ?$8W㧐b1j$zڤӊΛ=PHYUVˉz=7kţ3r ǎ-Y>xK=\CI>y$< ^;R|>ɶ)Mh _/:kn3ds)FrŀgO嗟zIR,>+Y|c^#ل)O /(9:BNcը#6r;!+d_Dz[XT(WAQM*Z1?K!2I78t򪍴DvW:H#,|7:CGu!{F'qL^$^/&C~ffpH3'PgqY,.s!AUD1gϝOc?|w~Ԭz6^7g|ztĚ9]VBYCc llnG1I|>Vvmtxk-VHṥ;`ib[\.sss}\Y'x^lll8Q 5<\myr|c \pHEygl-3f45ID obtN I 8gff#KQP?OFۏï|K>m8nHc?d W; Mw%pNPIUig!w+ic,H׹ԕvZ.Ҁ:v֞Onty p(403HQUZW7tmw)TtܚfQŜX^1 :??p9eZ.XEWtrkt1< nO!Ĕ2}>v(jt8K4ɴjՕR_&tEA&;{Vn k-$LCC7;mY)NkHa&ϽX#,M^8ҚD%h)t©Nh1 :v>xRFSxnGZsabnįc :Ѵ4nXFч>J3KUFiMKc}c%MvY1Jk4|$RִmJx캙>x)n^nY8ydK.1??56YYYϓe(zIʲdyyph 11=_$I,J Nuo9|c2\No0PdH˱#>A=]wǟbnnk2Ffu_nX9nڵq#ZqjUI+ItBjb\_gA+=Bw E`ټ>p۴Z-GQ۱b6p/Kq73nZNy!aLӄ,+x_ͣ>Z'.֚v e(WncpN?*kQ0m:q<3XcPCk-q裏z+mfRJO$rPمzZt)\%8QoGyEUoԃq@E\f8DiO$?C?)ךocpPᮓ4ivwMDZ &qIZTzE$s5-[=ǩK<nA=OB!fii(#cN8>XUBF<4J)"eY*NOJrBu5'#1)d ''V&*H|W^\:xm:>UUM~zzϜ9S۔.<q(0L֤ I~4rC$rvdqM-yݵTVTafn(׎)iM)_.4MƬ'?Ibyy ab$qGϟ' 2ʲG+W(˒tE+N<,.ΰ1`ׅIhX m>ENUz)()a؏TDi"%M^Fu}E%5JH*]!pysQ.^.ph֖^ I~K1})y?fMxrɇP|&ISO=U'$6Y՛ c\W駟fum4Qh"yHpYPBr*0ZiB̙3ܢ iqAz_N1IJD|ʍ6ıSqֺw]%Uj繷V(fܜ㠎K)p0ϊ%=Xoa,*;yvv7BreYrw,B\"Նze^׽H3Q*O-G"s,,4EkVeY֘"i-*]SUXiɍ+ 2 \B; Dx/ok&7yJYλ];{Bw-%qſ??GHT Dǝφ:'[eqP۰N琖t^dΡPxM߈+uAHw\J|,$`ii'NpZymmUN>=I7q9sWt O=cwm أ8_qEI$&ܽ|`Kڶ ]ITRFNy[M~%{:Ī~ݢ$N kK9NBݾKɴuhA*;\tm4nhTc~~^I%؍؏/Rc?nFTNhpbvv+cj*퓚nx< T1R 8IIӈNi;NgY]*3g?TUw*|>}:#?'O$t[i 1;e ^j IDATP zqA:I8n7$ϋ:z;znvF^=tS'bwkkcrPIWTFj[mz>  R[AUeq(<Ϩr:ܴIgٿBW}%RxADc%chBэn Py=$IRoBY)UۘJѐ-H"RN]dQNA38Z-NQ1$,"];@?v6qiP 8c hOq o֢aPXmm)jH|}# Tm$y6ap$Q׍D #.^_e~~y(ɓt]8x~'N<￿hYՅq}MbE:t+.#{~yarj.+0YN5_:*FT(b.ַW\nh8bw"ll ƣJFIch彘ŁPWJ['<'mBΪE#@`18q<ϘJspAőntMzuC#:K>Q&pRN;e00? BXDs e ss c8)LQX3qXYZrZ,-_2 x) KeRHmh]w瞥P%P֨4N١cٹ Ұ8v5ݦ݉𲗽Çex+h\xpX4kPDvt]G D4ohb:uj6VwR?7LFy XD';s2?*//PTH8"IVkj s )$^.t;]!ֺq4OjjaE[lqyC<-u|ߕGD־w}7p=?ł0}8䡷>ֆ;뿗{2J;OiN~y{y1??[Ӎϻc?%j:jxXĈG²E'`9ߏ/y}}DH5tsjrkPAD8!a^)z5RQ y~5|O|nL7|/?]o=o|wNz o.\tkl~۽t$@G):e^#o{'4؏/xw;MWm\B#P( Z}$4yɱcǸt9sv-<+]x!IUc'A]Jm^*I0P* PڍW*SECǑBr \XYubre(9k>oLm:іy [ Bhzy;|_lQH;`=uUU۠<]k3BXG>*=RnXA1Ι:K<[ms΁+'q*V;n4 n 7}3]\\dcc8-]hD8-iH|c{W(*Ce%8Np:zԄ]ݺS[AQkK'ٯX/eXc:`Jo*JLRf&DA4Zdڔ‰6^~~}3~g99M>k|w̙F?͏~V.?~'Woxouy~o|7_{hKC[2؏pqvM,L߭xLo8tHtQb 4c|}8p>-"t4t37 G3I I[x$#8qMMNiVۉ@'REUN`1)F,L!kxۄn0mxPѨVUӧ]ҫE(}'ܦ},KTc҃t(y XMIKv0ni%-wB8˸Pps8(jꂔ3ΒYz=hmi!wrXDѤSB#)8v`j9|0ZfggY__ ss3,.w8|0b}}^ǓO>IQ8%~y>/| ,,,pe>j ͼ+L<ܜGыŽ1,neZ-X]]JOsW:4fݖ4rE }rO/}⇾癳8{_4M)Q3c?nwܼ(;ȦPr'|#]`S'>ަ)pwcH[;*"$J]'p>nu.,RwAK(B߰B;??O߯8 %#:݄_yϻ{ >_ay-oy O>i ~"DLT;sbĵF_E/essH[(A<<{6wwwg{{4ބncj~.DR R)1 .@ x9{ON#7şw77_y[N}XɻO58C7d:ޖO<dƹ+(k,OG /O[p䙿'^{i{vA9666|"dium ːňڈ ]jc.\+Wp@WpܹĮN̫6ns!M V71EUnw/vr8 (Zp5^~Wu/4JϷfݤ־ʽ78KYWJ?- QM>V?CRJ~0cwƆw1юnju<.h{& yѤiNS[dY5pTXp*S&UUBj]}j$haq3ϯk_]w.c5 Wḡ!ݱEpz;-@{.AF8ԞJ`j|P*i y!EzH) A\o0ĽJAϊEwSZy'N@)̙38q"p5`ii;o}xy晛\r_|wDĚ40;;}{_4p0 333x`<+!Q~?'Őf47XנA{{͵XgIik,˼ucӀT8I .rͭvi{_BO#?}Q~Cw~O@ĻwU[[Cq7p&Ww#>r-[{p_dy)CG3#^vy4}%ݰ YAԤIzG4d׵ffϣs#AQ%+nI5X,=wS!X]_#VD8nbqł$* mK8sh]Qsc}}Xct|~/| (IXl)%RQW:p!IItcXD0:AYy0ƴIR7`m-P%;\(חXSu25U)<wmM''zN{:_ E,$Eq!=1N%~TVs6csMe'ٌuTo!RQ%=|ܹlϫ88 ; Bs҄F *́ .pvs>SJq {TA/aw 5k'Bk}/{`b~X 41uMYZiGy'x%-KKKmq( t,//ϳ>ۛ%W^BJu.5F#+rwKذn'}ng;~v[<y$7{1!ZY]Ք`4ۄۅֶ8ntCf#KT2xڰ ϱAHL73>un}GxiB,[{8Y^ BNBC1nZc;%|:vڽJ}daڄ8v{E4Uﭭ>/ a 5DI,PC5,,}7_x?~w6$U8S#eBeO<W^jjj/xޖ\_^ҋ8IRU5áOT:D@AR q'e{ݤs5ۤXfz}vvw[W1v)RM~nx޺ N_-[N2DɢU,h!xi x(.5NRU5*g»R,4)fܵ󜦮bz -roc4ݳg/}3;;˭[B0,7ɲ9) _Vcϟgoohč7pf9u9Uզ1%Dȅ&S|gk}Qng}Ѱ[XXl6r‘HŠgwkCDpD='&4q?gr{˿ RP5GYWo몝w㶄ZGyk!0 j IDATgk{C}C-O3us d9J֙#yy+$4~o B)wćC{ORךN8 !ϝ9߅*4,KkTdIWk%R}`dYNRi{gN?+z9>I .p$=C4幺E^wߧ/ZȶW69 sE6BI*ƐgТd8˿+(a9~KD:*S?!ʼ,|_k⠪)Wz=ŢȘ! za8zA䁂 {IEl4K(յMɾ$hDa/An9yd/sΑ<v/ZYq _Oqz<=؛#^s BqΒEOe^1 Ah}D Gw8]wvwpO dy00?wkNcӘ=x+)Qo[ߍP'!1j"8 fcio}[&*eBxQ,nExY}FHVI{y{S 5V)v㚊aXzyR'LJ;&1av+ԕ/&dYSN1 ƛ(Jfmw!y|*ii`0`}}Z .e{{{8q5VVVSzt;7xCƛ+d02ZY_!(];lΝ9hXzC]Rkٹq} ;oxn;axƽ-7^'z4'siA:T8 RI666v; $†y)qhkӌ]T-SIc&YFm J>1Ȋw$IcF#8!I Zq%M+oyeFbbn^+ρ?\x$K9q;Ɩd3cxя:s_q&m!Fz!/"nb&'gN⥗^BJ;LOA>IceCDP׆BJDH.?Oݿ H$4̙֚3KAUcGS8/A01FUՀt`ff@5*ukѻDH)wvQRUH{l,$8+h'-ŸzZ؊K!JHvwx{g>L(8/.tX(*)%4(l['Puu b8'ZhC(mcbHs"lmm݇{Y;+uڃ0<ϩ SUO?uv()NZ,KN8"+++̴tc <ܺu=y\7pv}Μ9N~Q֣n_?7"΍KJDLH׎Aq8ÉƯ??uPJz!x>#/ݧt ӸRtèӘss|8 .'Oʭi4ӘF0Ÿ{1J{DRN2UdYv8~".z&ۦiӌyVo"Oƭ[:^DoR|򓟤(|Ct,xgf!KS}ShtñI/}}_v9H4NM~ק*,ʜp_E(Dkw]64$\3k}R>UΝI)mjkk4/~?-b0豹}ٖnPU,..>ǎ\_^OͲ0 ET U 8v1S "#^`j$GA$ś)+)HɤD)$8;bv!H{=,EjC52I0ڻStgIԫe1q1Md17wҷ#tOJ4<^up)7_gsmooa8,) pv:h2F'N੧bii<1P5;SiL" ,IfH3 YM|ߘY~}\rCJmmVD;q41;Hg!i-:KAf- H8,8b\8H4pMTOv-E9F{Rdb]P],' wDb \Xg?/*գ߈kDMî ԁՄJ1$iof>Ocq ȧJ9{Љl' A8cfniBAW(ucgGofxM>~+pP ː0MRb@4:2#e I )ybspcܶ<ȅ%nyf$M$+;emsJ|y t2]~ X{W܋tBAEZ娵JeƉ@%(*愧ZZ/"403u ?<~oy[8~8KKKiʍ7|rK9(zS5^J:j^Lډɹ^&$UX4d@ ݀1iQi_Z7< DRj"qHiH5ƣE Q*i4Bo"rNk1iLk1BIn]7!uRx]dǸu9ُ)hjqo\G'}~aAͨqR}QKZ8ζNGHsEQ␍HT `uy5໮3ü#l17$Suͳ>K]78k5ijz{[k}M0 Bk_<B"[3N q>ԍ3A,C孰a7h-ytV`m7#%l~ "kWѻ06i-D!au1:o߳C/M90KkH4aZwb%Kۺ]m$C354p ~'_me)I^ ijΝ=òB_ B,)˒QΏ5452:B]3_xRު( zE.E/g4,QY8ڴ xTwΑ'Y d@$Ń@,YSd9#4sŀ:G,Q kuk`P@Xgyj B:EOiL,!_X~Pno\/he=R{61;k-Wp ;VӘ4&9w9sYQ7,wPI&%IS*IP>U8 !PAHZ0oskc ˝asE]UrI1HP8^x%9lom0ID Ņy7VZ*W3VZBns|Aem$*AM]k yX?1[xX ɜsJ%gǤB$,ID7 uX8&Yx%w2>@ IDATUM:T֭TeB?ym>୷zAUus:D2 o!,Q0YW_/GWP#hÙ_Ỻ,IX[;$-B2.|/"()= p: ^,.IRvFT>@Yɰ"7n4~}T4m}=`!UEY81>+(~jz5RrY^xcDzVCQᜣ,h" i<L6A`0Zx8G;q\PXG8kYJa%w;5{~bee}>3,.<&Yvl"+fnnﳳñc8vJ)VVV|2J)8y44M2VWk@le~OǑt9NOog^Q(~}h8}G,WdiMihh9øb~T7K˛{>qҺo*)B&&9Ǖ+\2gxh~4ƨxe;;C I?I *Mp-*bW]fT)j>J`#u8p^J?apb@:K,DVn{!7oε<ܺu݌"#E^P+(&4&2}Rk(7D$'&7wF _FlnnRW *Ď38([kX8ءu nH;E۲,'GS^fL$EAYUQYϷZjrmFU|hJzwnhfg*0RPR!r^=Y5i BCTA:3e;Wl?}+,.q,24ᝠU𯪊^CMtn"9_3Ad*$cn /=Ĩ ek[$1~.n*vI N ~Sl[l[jM@>xԃ<[#X^^s$̙3Ԫ i B-$u=FXkQRpߺ1! u4PАp{=v佌Ņ\~4Q;N^'\uV'i ֤iq-v8JE#?|cc"I8m'Qḛ*G2;>p[D.rDQY9m"MSpc/Bxh<iL> K+@$J&sڍbw ?xzg> ݠD+na%$Ap\2n,ps%|mo{'O~YVW׽\e(߼kkC<=/ 4/ JIӰ`0رcmb)U]#KT;NMCLxz07;~ _XL[\up^C]w&:mI3)$af0*7oduu^W7#1X~I9}s{'Nd%5i&IsG:o"֭NWsh%mA:񈼧zpWh9Pdt\i Δ u9qrK:2)iF3 J^9g>EcD~P>o9EعVgnTh7!ѱ{Y.^B%Te͛7oKzcdY  ._/O^gu^̍HOt6;a rGYY[C5m%2*ߝHgkH$J"mCah#´B`G^≓l2x4_!M$9hTr-D\~80)Ңw2~E>cR)⮑};>/mqq[:z3 M{$ .\ IVVV0pM`oo'NP5[[[w:|Ip8?=s$LԸzGru]؆,w~V5C0}պGq4kIPVeK2!qB1/\Z[[<ƃ1~Pc:_ӘƝŃ]dE2ưI;uH62!U~QGLWNӔGy> hQԝ=dR?jh4JUFT9ܺI?BaHdۤu29m|ǎ#˲6 QaΠ3Ni6JI?a⸫aɋ/@ѥ uǒi FkYXX@0ضL[Bջ~1CL]hK`T{Ǥ[&I2ͻVZ6+++~6'ag;ᯟy{/s8kPRlG#ۯ,I8~8t GꬓʚZ7m"a",%1Ok-\ZgڵǥW^8y$ѭOc< 5 ^1FIK+Bg)~_19w+Qzs=a?~e72zK>3Ù3gxꩧx`gg,yfxOc0!1orrI , #8hH)Qlɓc3,/ *ɳc,R4ƣƠCȤEt~x8l3}Lǫ?ĸ/oaKKK\zMNw̰IY/sڀNbKb'䥗^ !rhgBCXH u5,Wo^w+$g_xɕ :_JHTTPU5o{'NWW)ˆr4BtZ\X`um^[f}}}-$zoo$i=\T Jyo>VaiS% "puN ֖z[[[Fiڪ4FS]?m9_]5SkIdPfl׆K)qB P^&N%A|Ԁ@ ᯱBeGhH)Ӡ%YE/a,C]cH]E($iFaucO?HAc:bMDJyy)uP)IGpNtBx|VMAIxp`iX}v%eshƠ&q,k@"oj_Q65{smb\f$ >Op5Q޾myHCuބ!$a4dT͛EAU??ʇ?a>ݽ40:NӘ4 Я}E*8뻾S'OݓGùsZ#%mE10(z>>su51DHR)pcD[O꣢}/sZ $X"oX‚5=wm;$UlA֯IG'x#:9!CX&c4ߏ=X[t)_l_t88~&8y.yv0ͱyN̲ .\ׯ_\p666Zauu,z*nŋmq֭[,,,ĭ[8s >(x{㫉W;><͇,kv󃡵mG~^"ǫQ{k;֎IHUU J}J)%~=~>܈wWyICxPwӘƃwvcDz eUVQ1!J z&F?{ooiRy~#rys*j(BEQ{qau-queDGn[EqÏ -nhgV~GD=7oVUI{.F$I1q;Ԅ1iow)DLD8;992MYviP% s,~3g0 㮻BJYtφӧ馛k,//~>O"4ݼIYO gbNEDמ<{j->>11HkSœmH=D133Cse2a׆2O6so}w[?f`[^uWel.ͮx[l-UQYҌ Ss4!Mc>Og-JMPcL@n8Vؠt+]%I3<, Tu(JĚ( '>h16Yַ͡Pށm4XEh*Ȳzt^Zp@@K)9OMB̼o&L>]ix<?ʩ~"ջ@&A@fY^N?r&pxXk7Bpnw43/#b9ξ$I8vmweF;#{;3BxQ4  Uqeb|e>PxJ]2iZ>z\pOL`GQM/md_fff06% nFgxOŃ3)u5 ]w=y}$I8p۷ s6\\nƺJ*EUUH$IjyH$촰?{;{ } ?s_|%<=٥?wP  bС}u˳;&BPtsnAI\,EVUnBD2dv&%q6Rls\z!Jg| q S_d$VQhskǨ* S\ۄ!eHuqysss{[TriUֲw˲tcA_N[&TR)1t:b<OaY!xKH*', D8g7qQDRj+I^;7|l<MÞrG*7Ւ8faa !%2y9~8NGjN> sss:txNO}n?VP&AȚ{ؽ\E IDAT1"D>]PYъ T$Pʐ) (7a73 g"&{9%$!]z2LXMH&I.>;u-R={J}f.Sn%@ V4b~~~*|1vM$SY;#+ġ w ]]]@VUE+'JvZ]"E!ځ{,Ihfs,,3ȽsP :syֺԍNZYND*sXrA,k2TƏro>*k$֌9RL9;.#.u/ 4+L9&qj Q "UgB{]̚c8kּ-;>x ,ac[#%ې-W$쟦s: 0()HiõQMAEz?}4J !/IӔnKQ8dAUqBJ;UOPx!w}wMYSTǁ.|9*ӄg^+8ŅF]u$?x+?MPRֺov Ľ1?yB'Ú$I`0`kkgrY> ,;vNÁt:\s5t]>kkklmm)7|3c8я~'NQkR|8u{gbqz]UIBDXC1E13Y]`nZYѳn8^~?̿s67yN{^!Gq턄ͪ Q%?0eU:صEg3ε֚$Ihloo}Ez=cv" B-GyVmqN%C;w^oR>8o:za`lołD69 yiyUDLJXYYZM <7'~&kaq6vR ݝ{nQ`c]}0)wHa`ckYn I.PFXHFN436!1UJmOv h!+>gۡ\ל,R#n]c5 TbmmmX^^UnwI?,--eUEA.fWNۺ )+90 |@U~eT:^ 7 \w-#xqydo=. I7`#@+W$J+I&#U0:dq18beal5߻ғ*17}1VyZ3/d; qi̙0XB0;;22Zk>nn _/wmKgm5i?ׯ xٞ]]e]T;c \e]&p8C;-8 ֚)HvU;E:h߸ oT=50n\Y(hZ=(FIqBwų,bv4[㻧p0~c;ƅv߭/yϳNۢh:t:-c4B%Tÿ́/&0 xhZ?xd[ |Ȱ($F1a\AHWwffvfQpVV\Wυn)VktYN3ZՍ>BFv^VS4Jɫ 2R M +ގDTL@;M[m0b8̉b;C9Byg_SVZ.0ZCi&0߄{ҔH(+ȵ^˾}hZ}y,..y]ﮯ9# lmm@e83Weaa(X^^X핬.$gO! }m@D%(!vG^뢍+L::Lw & qְ&N]\>|<"tU"}v{!jM T%`*Fsveǝ'sۓveWjnJ+ai)0XWH+DzOM(#D {^x"DF @Xz3C&_BΟ[ui~M$#.Rb0ciRm :|O~St:-FӾtڎc\VA~Kqj@j{]Bq@6q\;RHI׿G殽GoE@bNVVVJ;G((d먴2;ev)\Yc19rN\ͱc=jwFD>  Pk!EJ)ZFcn, ݷcd8x #E9:gt̤ĔTC4 8$c4"פi$r4ȗ2Ʃsl:h.jQ3v`D^QV*hԺ[2BkKLK^OD b!"lpV$vhT&VWDGyn4qIF 0,jL&p!>IPTƐ&mJ=?izZO6Y M1nà?b}!YJA&5g{ym,ɲAD$ .k4F%"W<708榛n,K~M9rJ)g?\wu{cFsssx㍜>}{>ιsKs-0;;GFJ J)>9ČgԬrΎEG3E3ku)F@ >|gk:+:Yp)~Og2{gfWS5opB?[gss9[Ih]rI ʝ#( ┲cnI1Ũ9x*3E_Eu]TUEf/9]npv5׮t뚇KqR!cI7yo>4b-;pJG\CHb 'M9.be~'=1Y)[Lj8oSh.Fpo:8rװ乯lB?X+"T}V֚vMEA$xKkC=\ċ}eH)yO !"Ƣx9$Jb00;;K>.n1.FMm=h-@D3Gay}Taz{g ܇l [X4ڣ94MkMż+_{^667cieĭկNS?F3+*++!=j'W5(J.X^^Fby5:u p.g78~89s~,/|`{Ga0x=h4*( -G#Kx髞f!~D2˨05z?üAւkīkڳ) !?ɇ`nn^Rw]|c|΍#qļk&l5C;47>[^ƵO{&wr?`}yw~a~W~o=_滿{X]x˟ū^*0( V%Z_Ջ Y+FQ==U=۳KG7&-ula`4MMM4( 0h(mEiJle'#g,+^ξ}slnm1:vU,3@2qᄏ}CXXX@opK)8u@`HsOW(F*X-Do'Ԙ oH½EA(S cd$I҈ M?•ŠcEC3DL43\ 2zD8XY>xT8ĝ+M"2窫b8R(1PtS133CQEw,'AG(ď?0vDQ8s v+T#]?jj 5Qx"p-z\30X#1. =3u!E1ΣR_^2M--QgҬ,!%V svh`X ~@]'M0CP+d; )# d%cjmq8vcԩS!X\\d41/Ϲ]Ù3gXZZb>>t'OY__g4GS₠%g?yKx1FI$)Iȋc|wj 9 ?sn'=VE:jx7ygdqzTA#^LYvH848$RQM3r'NRRbeerG 4+_Lz/FsE>{8?gaşi_bc?<|X\򉏝̋5<5ǏiW [׾oA2ޏǔRSd,U KpQ{;<^naf Xٞ]]˧ 16{"ºWU9,c48'N:E ?sE$bfsk k!Mc^nN.j!R'GlnoaeA{Q-yRښSpBWp(&4_E;W /'V3t3,(\-McFyEQj4g\}Μ=lc3+\e1{vl.7QS0%,H" ;|H@U0(˒o߆8tcӯf{1l0A+|ڔ|iES~fe/? +u?##5Wt/_%_tEt7'(0C?I= zÑ/&뮏a< =}yi1$IoR EHIL2fW^F Ӈ`M^8z rk_Zgy@UZ!ssxӮSZ4!sIqeDrzĽZTIϓRS{0|c$];I(ڲr̀5HYpcnfx>ٳ1pw2:-ngc?a,1DmJ)2Vg s tKar'}?eo_9i7=o1Q<1"sRθ\Fa~6~@Bca7^wnxϞU,,̠bf6ein:3{?˗}Uh@Tl ܼ;'o~K0?;XU_J~<ooo7moW_y*.0j. ZZW5eU:Gin¤]u]L_ʞo[OZՄK' j6b8L.$(ruN$K z>Z#'OB웟cqqGNqR]i3 /8S3[rMJ)$y! IknPڑyJPA ˸mo_JCaEB{[m 負j F;tWdpb!H%W\\HN5EYWҲr95xkerҎxnPz)@Z< 5Q)!,ҺGa2ZpBx65bUm qL0m5*ȅdc0vmExE$]f.c*rw)@1>hNJ ?I0.rd!DE +b=6Np-(СC7^ӧ yc ;cvV2Sz3>qrIf'%.x_b"COIҜiq';uV`#|pH'rkLg]nT^ehx+{x89FǑ`*qS [p k^0Gs<s(hm 样>Oa3je4Y(K8˖)YSjN>U?ͽOKR76TB3p9Μ9`8L_ΞkvcǎqE]w_Y&~aw?)ӄhk)*WB 8DT2Aɀ (iM5ՊEѨ*)%ǎԩSH!xw FIDPF28K.8}],`f{7HN%fUR0G)y"*+2}JЌJKY#lh"0B'fSϾ zVZ0v4%vh'I%axQrYPv o㢤(5F (N*Tc&xBHb8oP|F,Z-|u56'[7r1 ^|oݭR3|Z-M<RLwp1.ؤ IQ%qA&[,FXe*]"Z@jc' @[אZk`N-.!$RhS!W,Uɲ,Z#1+!"z}1>~yl[5i:,E7> kKd; r@I42g{P0;"v9{$#S|)CtZ]PE)G^ k>r@Ui3B-0*nC_zgJؕæJFqTT@#SDR>ni"" X-|}7\&+"8b8"_{/}X+P.~uݴ<[L(N5\A& IJRYa[XI&@asXޚV4s`ЫHE``Gb6厱Ry K;vʁ"//6A?1t#Ąmi@>ŎgO۳=Js>-wәhft`$]R |(sʕ h\avuy#ec_,<}ѕUpd]V%zƳxmRȺ8> WcTj`JbKK^>bpVSM'׾MWVimE_RX cDEꭱP[P1qQBʗ?~kC+*]r`<⋿_x!d qMɛg!l m42<ZaH e]qR;I"b+HTDҰN]FPfGsеEhǑ7z:ɂD$+W\y%y MONcjݿoڢ/.FdI4\1[`f^:p1Ξ=Ce}bB8p;0pk⪉dL8ı˜UBWtol:8Jp$BD }tTd<*PB䁇 B.Qύ7=cjA1Z2BW% mD:IFaD`Nj)ǀԔVu"ҿeY e^q1' jA0DJ:ȹss/5,&tRX2R+>w<3!_r$\oXv+]Sy Uؓ{i^"ʪDI Hy꾱!&';.-mg{g{l5=\0 7c\,"MԤSSGACIWXȢN@"g8˲DR Ģ|‚vvo{*@;~Yj$EW.C_U$ "lV58g,3BW"dV7wd VK '9!ܜ4k>Jd`F~9޳]*]67i2{5 7h8n}46,~uPFc6}`iri5PrW@Q V% dFd T$\ F[7EQ oN=SxJQ.+ oaJ$8r }? ̋y1N1^n4+v;>VD4ڮr߮/u㙂riXc3!srDkGթt7˚iaMEUt2Q"d6.`0`<Uzis8rb~a,h\)6PҸ@Q& e>Ƙ aK,%ަbG=6771Fuf5YYYiT`u"߅h>j0VѦr KKH%՘|%V*a5N%+sC?K "aʽ5ʏ+cdZ#shdvxzz@[29 IHn͎2vv/ USAvbY7= 4ǣ!Eƕv:GqY jٞٞs˚NӔ(1 dgo7N (qU .$< G\pR #/[ M#c4?ktE8ᖾ}߯*ׁ$?D nͰM湊I)e ,;3Q2XIe TQԅf\UU1IdRkg 9OjhajGoP8`(^5CӦF9ozӛo:+d#8y" +Fưpq3խp$Nibuf'φٵ_,d 냲$Qxq֖kMbAUY M(SIvhR57_UZ:D ")X[Y&"ΫAJIӡڷ3(K$Mbgx _~GYX7 ^hSҀS9tPq%:IŁxы^ğ]Dq [q^`0b0DIC2Ak'H'XBwfqY"-D>3(B7=,Ç`eec+H Ua#ST?Nk$Yk@:ZKSNX 'Nj;k !1@8޿XGx$q 2!xC Z"1"ɲb4FMeebL~lM#ܓQCN8AIXX,eTR[8Z I 0Wo}?ҍA#JkQ8rT4W&} JYFU IE hRCƿiM[hf]ɺ,Cל+h;0yv;cmSa<> -*(Z0rnXycZV]2sU4ǽ(aj= A,KvI4 ;;1 yf?qJ;{g{jsusU\x ̈6?8L7pNkx̐`eWMT Ç9yNw:mP7:=*mnCJ3ÁOLwVM`B'd(6EQPV%R]D K8nh4Ak('8&: c,W_}5?@F^ee4|eoq{IvOHK音5-؉@ypNo к$KtϽ+*ŷw$!81$ [~%f^3PyD83d/eXa+7;7Goˡ"u_P|D c77F#DՙFkd#ceYDr2TQQUE]0A %)$MQ}w:n.t7E'PBf; sEa44ԅ71Sc ~%bThq2~8rנts{j1KT\ Ҍn??fckhJqx:C{|ݴA,> #e/~{MCkIe&9m[HF)-MdڣdZ6aߛۋlw;y$Ǐ?|w#?ӗg{vڨ9~!bBL/BkMY~1,Ϫ \gN13;V 5 vGJYjafYv(wò`M&P N̈́m! NH,\niDZ'yp FНw.t=c8尚j;77рlx@Hx`Y3)*CI'IlF_7ކ"?GѮ|ۅM`EđD~cW?tߵޝ@&/WGh|ڸ%pu 0d؏I]`t: JH*]"iƠ|!A*E9LpaZw˒Z- cې$)w(euuqQZ vKF,Rw[!5!'N6qx\" 7^1Ku$޻[}{s==31b,"?Hp+)C[HI(*NpqlH(۱1X iF33}?~kϹgFMҫj}kGh}ۻ=sO3hYqicd =8%QPrim}ke,US˵^Xdtxtw1)]2[7n8{yݣs=/_b:Y ux67oL`QH UE#֮2JE<< kq1b+t:~F. %͕S e]]e<1FumےQ 3m шx'xE] P1FΞATe{HtD6FadTfQAҸ 괖N)SC'3|H'[?iFlo˼ QZ6#NӁɟ4=s@QR:o<$ykSO5v*Ryepg4R+=k,v)kH_M׶Զ*|pEq-bVO'ֆAN{'ry.^݀kڽj7*>ywqzOq(/A$;& cdv$C**\_8FGesddfgNs5-T /u"2Y15RBih &kSKFƯ{g>ASCJ>[2j+2rFf 3!Z$#[ p\i,!eoXJVVlo6?yz><h"h}GvNUp\({˥rG.Ї7AjmkfAg_ y\֪k~a>O 7ki) `-5<Ԏvad.wOgXPh/bkrS2oJ6˽ẐWT&3fTn&@LϨ"A %9ߢ1b`9xťo>f@֛=Z(m1,d1'h4b1cNbEckw;;{ܼy㨸ܗ~7BSd H|꺎N۷3\Wܾ}d͐m1P_EHo[uZCIM֎Hđy[WUIŲkQUv_9"h 0J}5)K]k-jzq' Hz 'x<Sٳ <AGtB(-K IDATMi.jD}(CVQS1uׯ_/ݤllV\ }tt$^}WtLly__,E 8AGt}f.YK /^wlټ8$Xe*- }{DD,hȜ}ľ {{;\ػOcXwD"q\y%_{jݸ>_a<"FhF3\t(kkg]mCCBDUJp|Y05+78LJ\>fӡis[W} W._L4|RWʈlY2buR:S;h|gSPUUE< ޥy];!\LgsF >AASn#QG#.Gϫ_fSE eHVtu΄bJnfg#d5j[}]"gx\ܻu¹tmەsV٪|_[myͫ^+|PKs1=%sZV|2~u!^FϟG+PSK~-8R"t9lZ|UC\=kd=P N<~Ko[.R!UDz:VyW" O֯~\ʳ6T=!v-]1:{Z| C)!8j[sxpt:*5B"kIJJ|>f0/K*AS 6PzYFi)az< GO_Z1<3ҕ){W޲3\w{^?wnlw *Em-ecF\|VBC8:uGiMz|! 1I<_{dK!z5@e5ZSC 4HbѓՓsjUe8n;WI@SՐ8@Tods4GmCч3B%uKɑJ)Z5gv( \| 2r6 ck5]ptbx%Me؊е'= Ne<6TK B&m0> t}h[`A1?:ѶJI:j ESh'5߭MPF\ZISb*|KP許ʈAmB)#_c0DCH`תd&͈:VXx:\$:*mfvP?[AJIvQ~TGQJڐf Z1އ%"fuQ&LʾA[[K=*z*[) k4}bM3$HHPlZva-+ JmjI˦Z,TG. 5nUkU J)]K [[[LJ{NȬkKpmdp֞AnVx'Y3$Gh-\15X0}7(-Fr9Gx|YD{d|1Ҷ V8e rAIDi>kk3gpmɅV"fL΁yUXSѶ->w\jHYىj>DRcP`ub$%FVVZst,gLh op̙ח:9UBf{QVjSO)U(oA6+?V21P.nFMɦ2)9.^!h"dxh2&Fʽd8I/F)5osACr ЌG>ppx̥}6K!!deʆzҶQ>.|DS]gh:ڤҮPxIpq'Dէ/=#pY-XY#b`DTRrv HI4vKFME;lmo"4FX,FݿߊU^]'FtB<dU6dD BVWz(q}Ol[6{q5tϟZ8Z^VK0_]Ҍj8WsTwxqIεR}c]{:J^k5ǸB$:Oԑ@M*f@+l1xK_=oJ&5t1FP fyAk{6|^*˭#uò0Z x"Bje\g1l!8RBusSيo1F'>~"b Ĥos&^Vڣڽvt[ߗYr1DJ=UpkZSUUY0;iЃ!.CHRys^m*:g ^+MD()LOju1R1$܃K>x<R'᰽ũRpN7@R)dB])&"5FxQl~|#>tNʨUU}9wB^H|'c\עX[TgkרJlHWI) jǨJ ҧgh&jt2{|6(d(PCsttDu2E꛹+zC~?xk!+D L 䬤b>'5ec3ϋ:l6NqnR:fcǃc,gJ@P5C}jOcC=>DL.+ 1 ٔQSo} ]t*ϊumNK N2ʡY"Gn/ؔuc_Ӹ9 MB}ɢp^Te=-ض{{\x=u(P;G" &W7Q$RJq|xt:iƜ;{W>0F#QSzaus*9K!H)&z<|1]V%s2 _ &ce{b*_W^p9vvq]O=P[غfyWz%hDZ$`<ޣSʇڳwnoLj;(cQT!gK甠89۝F͘Oq ݳZ!b(ALƓrym~|ic8l;gx[޼v/yb։iBtL#|@u(A=Dh|3ʋ=aRaߚlRnl~J?PL(E1pڵa p]Bhy`1@Okvٗ%q9ęx0%۝!]~իF(Ԋ9.w0LkuUlѶd(QfsN6ZR'n޼vo ;aF2l^8 [kS\1?{֗ƖK%0ٱ;m\Rg3y0pR&'~ Mm˸e˨BX8R9>>N.5lY1(QKY[!0rR@=Ok9t ++}R\ (ƬqHV&[#&[ͷ(UvVz1zvw}dt0+Ȱ*k s]|yTj)$2FRjFB Y5,-4V(Y\vO?tq>/\86ӻݫj"ۓOLJ~GqfZUMU'tOSTA &,o_]JD\U,<&Q֮SImWzaH&BEl?.;Z'hE5(Kr$~!A<\.ٿqO<6b wV!.y;~e6=Ll_"9>ж-JB ek5f+*Idelt.[)2=DQ|!Ԙ ڎlIŋ,[[V) "^4ma*u(ȅ 9!" Iq ,PO;\>^ȫւ/HώVg 纪RiH֎3\3} %-kd au\k,;/6#ڶyǫ_j~~@iUUJ ZZKvfukZ|*ޙ5wXcy:0N#1ozl=MSQז׽QUj/RJ=fRO4.k/)N<{^Rx+p@;׋HL&y/_^;~vsF0(w7/sHֽ*߃lmu -ʪ9su1Fƣ1!ʔsyz{}QA 7 Me8sfcG@mQECxoR{I+p𮵩w Bnm8l$$ -y Ç>;V4V0v%س\ Vłzr1c1k }L|~1;!cl:vbLf%,PFG0&0J̀ -'j9[]Fct vw ^Akm*C]"WJ23GW 5]r z[.r]Yϧ)VPn,@/.kJ/԰[DmV[i^Rզ ׇfhOoĸ1!oA o+ƺh7nҜ9X-͛i|V-P(;yT %kXXsqTdgw{݂j.AfU}Wf0P"8%^|so;)V{W2>*F0JỾ81&@mm츦1:$B( :!87!ږX%MUUt][>2O*?4M $J\=[[[ѷ/l-8|7BS%abȜsOwM>>y>օ/ڿ|߻x/%;ŷb59MSwqkwi[ߙ=t`sD媚g%ϩ*Ĝ\؇p;iB. #e:|Q =s;_Clt:=Z@p$&[<tp/RZ#x~>0:%j[$A~Q6JzM\l/nẹN?>B o]s66 lgz] XySOї? +?=.NԴkH95Aˁ!q;و w)18\/_|x%!Ƹ/nۖQφk6γP51DSϟMd^Cr81J؄929R@$ΙE3q= 7K4C%< (hE/Fl%uQ hl̟)>'!gGw}*DkOZmx>0nj|V|#IuWA}q9|7cft%OWnk5|+8O;w ̕)Xhw޲Ji2}0m}SqpΉ(+{ھ+6O:  P 16Ua! ĩU=ECAid>kò]cf:X :#/)%1uU x4왳'F!Y[ܼqwu}ӿ*~}i;:&{{^]wu3JDKrZdPVlFl:z-oÍw"ֶ-ީסʈJ)iQ㩔-PSĀV[1)G̻vߟ47xŸ3F\v'6.H*ʴyfe̕R4.w=k%٠Mf3;?ٝʓ*/:z>9s,%;;[|~/Ue۷MU_ ua1?}"O a^]sv$@7̴n64#6n-TUN李gr:JqmyWRזG}M )K&N}.Xm򗿼Rȫ965 a3c5JUc)u||l6KYzJ `y%fY)B֪h8Eͻx\\-h}Z L=,A׼|۸twjPH@y*#jٔѡ+0h39u dz qAY:鼧_' Fw@kt1:i}ͥTNpuTVO~}C>?0.LBq9}Ѧ8'={->Q.łZ._|Eփ.huPCBHPz4@eH8!"xhwZn)ylvQ3(sdM>[k_NŒܷRp%R9˷,9`f:]!~\pvR29g?ݡ쬍wFlfsF$SQg]fLl?i4&,Jzn3*9W?s?Kف͞痔1ks$?ܻ+Hӂ(ù~r>#)gۨO*2c-g~ |jkTma'޵xףQl6לօ|v^^nX̵fhy3<~Ӊ>YzkW+=D)5\5RY.Dۡ k^vF*4 {Oԥ4uA[Q|5EA{nfO!{dh8 yvks:}CΝ;'or%?OwŸ~~Cu~h'~bI;_P[K9W'R pCXC6`:'~W^\L^Td%ZV\]H\_OOQt˖-ڶeujGO{hD]Wer-)km]/|nB|Z.do{G]Ͽ??cinp=(F19ڮ .\{72c=VƷT3qlRo XN3S<%\u;;;Q=҅tyDał۷ost|T<\Nkmߊ-X29ǰb;fHT*/^*!ż[T\p_;EW?ɏ [W?H}kwC[ߙu]q4Jd|dP+a%W d9#:䴶,VWB -|*֘*qa%J{;g Z(m2޶!_>{ilָ _KhDPKG$ίkVH2=@mݑk!잊kpܠBɒy".5 z2m-ZO4;'hjX,8>>,#.0g/gL[nzbp& Zɖf'O [ꮛJpF8ލ5r^Ъrt)(p!ǀ^{;IU1a1[\2աґ3; Q¥Ϯ[CO-D8,/aľ#Q\{׽j$Yg9Oz}#xLUy^C솒U AiT 0JRt>Ї 7oӻ@ ru: |&;VpDJ6Ħ<=1*bS7UqrK=DDЛR΋n-U4FG!Fmcu%t6>~!m OjѰ͘cQq]6RhFZ3oJnWks&R29gvw] !HM+~#%AZL;OGbJoGPJuQY.֢Zm5T" 2^jڶu6̘*r^OWUUjf|-3-9׮Ӈ1)V 988X+ >I0o}[iA/š.Y 3Yh̹W  j߭7-%3}ª TVix,/1|9W!Lr3ٶ-{gϬer ۣ;QN0]T!Y!~GL# 9~jѯ8U"$8c@ZɑZup=欖R fqϯ+<0n:Xˮf`)YѸ)x^Roױ=a->d!MUҸXm+H}6G9<͟w3ak}. w$4ELHSUEk[׽&QG۶mKelq(zj+Fu]8%RF}b!5C(:eׅ?k0PwXO}>Ko8j;>#Q@tsb%5 d=_u_'1x(Bίg'DO(Y̗TͪN|rIS(ŋo_EDEy-h#9TYMkո&gv-c3.]b+rmU LrUQ] 2dc>1#Eħ=#"E'2à{Yr0[\xl@YUVhT98<`.މdby'|M1N?!MAg~z8ki/l9{z]9,[ m'b-0uNBwyNDRjM4gw]?w?X0s^׿~_=;} WUપ7M)7PR'Za|nyG gy,B@F1]);0 }s b-Jli&L1_st:-pvP5pnY&Ėq1" 21TaoodF. ~Ϥ26@ﷷ'Q,Tm:4;yN8]5IVFTUSw*qR;!%bp, qGG˥loo.23Q95}-㛝rVzUY&)[ȍ)t ՊKI]jkCE?(DqYxz=駋ќ5n6X)]wI,Z|KCLh,99hRqf8= ._FRYy*eʶ1 b:}d{Қj?ٌ{i]S/r<.;T5scXPGGf]x}s=t]$ &IjN֬uW\9J2nUףUdՍu4ƈKk 9]G@B1Χ&:\੫W!**LF4M-. 7of'<dK\v`9ʌPV u}E' \ZLUy]/>|@@Ŏ~~ǟHYO~b:{@巶0e:"}5a4zOBOi6&oz y-LvJ:ӄ J\i#nt\G"w"yfGz@(@Ν;'0 r(TX"bF# )Ň#|$sWy]kע}_oÿ?#[kNLv9vkn}gv2/2i(%b>cː8QZ I\~}ql~kxٹ} .OJK6x\'CE[*kiLJh~?-]8-X;LN--vZnRCg4VQ!g<;RBM6#hPZ6G}. 废@E麎hDy=qC] g21/1&c1yyd_ ]3?AZRǻJYZqv${a5)29u]aVKIikc8,eqԅ'Q#jՐ`N]h;E0vTWO"wU# .pt4g%cJ̼hV#:>)z]%cYyg7$ @BHL ;2w^,\ǩRcBk*θ"JW% βBa-Yܺuk ѹV@]4UQىcRSVx(-Rٔ`9[c*n𚍮X瀜sdl6c2pm]%kA|, GfRkMU1Nc Xh*Q! \|V*OUC,YT=*ڔ!\+#}T Ղq̣N-?.gF(U윣idtK eQ31!ˋRPR#W fyr2Nf29 Wʕ+<Gl'h[PhSO>aQe??ObZ4UMXbHέ1t'*e276(A`~Jqhg @6mQ` Jp% ZO8ۂ'ښa2pppd=F+ 6K~flL&Zk*i(MJ+fysG>"TikrFl>3 ;W>5.^vݕ.}]~3٨Tެ:Ν;^5q kNi}skٕ,FV_Z"~yl%ӵ-JAFZ~1Fm_t4s: b+C]}>צ/??+_m"9zի54Zל?SFS7 }'zMm1 0+*m@9{U[{]cƤiZZY4J#V<<8g!:%Г+u\sY1Cc_3: {Ξ.3wfXĄ\0aS1I !wm#loXyHeTJuK%2^;'|?Qc!aw-rs2_GkL|UF!mA)%%629?,1cdУ6DcĄDw:<Yhiڶ;;JE+W_PkD썶xۛ$İA3 UyTX/Q'X.ljFB Ejug-y'x9ѐ\.]NG^=s bIQy}:_A9A EP7ϳyzY[7n`:얫#=km`7{dçO|˽\-u$CH$CR Xv@UCiɒCYí/ //0NYfBcO7\)ZPwjB4;92`, Nnr|xT !zhl繒A7BuK&HJyxBO ' =xj <>(eÆPVp=;-w!7jc>8xg."(= s8GEj{zR2'?zqJ}Q4 l'(}/l(wQb9 ϝ_̩JJTJD\RN$P5f4ũNɜ0̖3H}_S.j|QK6v'LƌKtqp9PI!1fD0Fa\pA~ 4M-BXM$wj J%QN'"i.CDAbSY *suZSffm眈}%A="h .ZӵmZk~5z?^ { \Nm=}{tRY[ ;ȳ_SϬ l5ZyF ^֢Q3@K@w$ ,`Kp;PZ* B D.7od<]| A3|vwwD*[+Ak-fD4e=ܻ^3NF ,_1OVBI6Bɏ s}k~ߝ{^{xtPݾE;<UNk:/r-8sOWMc/_.v&k˅lSo| 5mW:>"\/WxdƿVdy vΗ it;"h4)eѺ.0i,o{˛k \>=eqszTJbv+_r|#hHSW~ ymb,Jʤk5-t,ʬ0Fo;676B88R<=/K.}@KM#hnK,|A_wo|Z򣇩1Z˂W ^ʗqv:>< 4u]bW#|qk_x`EX8EQ0FaS֚x :gaՇu~W}xxHYtṾrR rY/btMY{x؉ix %oCgܹs<Ӳ)Ŝƴwexp?(x}f;=3Z{麀RbOK^ya5V:1e +TuxxH+'Z+ak"K}2`6;(,yK_d4lO:%uT'|x<k$kX,PɩzZ,qc,g9`[WfsA9Ƒ>tL&<lllϴKj۰mwƔ(>0G#X׍Lg^>%daNscݕA?mCys%`lꕓ=6]H @^Xhrjk ]iQ4M®CmQ)kklnujsyd0""Φk1:K\T> )븨G9VPaQ]u}2Ofccz-U:⺆׿=9@<%8YW%XӹXHۛ<3jSuGDbr[Z)Ō|#xg5֕R"3S-|j:ʲ"FQ% kkʒo~~ ",,l9n\AAuE(v3&3PgOs@qd\@9qx7ooq**KZנnj*^qU"$.  ~\5!w;u*K>R;!Z:g8}ȣ>uB>1(:X=8666?ovSN^7 2?;ǜ>ſ_`T I@9C, o{tWhѭ!>ʒ *{XgMF+?q:stN NHZ9kw-Jt{{޾gb2ѽyr$n6i3 \ZE67729 yr 5 [c .Re7Ylm>9*Ag^$;& !̂FjJ[pͷ9=QHlT*5VuX:Olڵ=Fȯz=("㪠,G ]m+- QL0ZZ UJu#]K퉽'mDDaR0MԒ5s9e4s۫<~;lQѴ]1y툺$hC]eV!¬$#'mrN&-ӆ%\BV.1ۜnoq1[ΤAdH œ"wP„::HaSSOEad>SpӹYɧ/|%C,38:1rּ5B)) |`.y:yކ2R۞ACߴ4u-2[*ÔYwѡgTXn>„?_/}w\[ׁ5x˦a4!kHQ e0.J4J"mD8mm+cI21 z3{/Ƚ].=DmTQ12*AQ .J2nI;Tvo%#Z -c $ c1噝kbFedFCh BF/}k{Btp\PX (c BZʲrScyK)㼳F4qߐ1=]B us%Ȁ;Ti)CҚ輣(-cUhP7ټ lTY#!3o>jR6TVd>K/øl&t!+KG>ŅQ>k#YUzhT\KiD h!}&RnS5H9GTKh fgF") ַ/ /F}mۋm3Q4DB{fȈ,QM'yLDjCc:;n .'urso=p5^Kp\K桇`khD00?A#l(k"]rju5&ATvW0g\UݣVUU|/=8Ee<ј5{3,ƠvF_DLFؾ뺞@[ڦf sUIXT\!4Ͻ3SqTk`2󖷼'8xlTE6%CJX)ڷ,Նe|>*-颐"A_R*uҵmllpeϝegwWpG,mC@R*eR 3l+%۠P*JB2JK&i(z!Ì0묢^+PAAzNđNOZgU'B(dxlr/@a5z2&+*9ǙS[]cf +x8V1* v? :CL?姯0Lldp t] zT:iD%~Hs(=϶|V c_g#6 ʺ( -#I[ k]\4U(EbcK iZDSQUYp\H;4iP| K3ΙT0ϋ(bHҙo!f'%sO2`3h67t2w S 0t-E5's;S^{S[[4E1"/^j?y5EE6@IZux:0b"wNdBz{SJy7gxb tQܛ % J>[Ee4xD1촋XG%[nK. !0N$ֵ̱0ï{lQtm˸)O6DٌD}ZXt5EpCrtlԪ.|ɔd38 Lթ`MA4 Y\u|ω=<1Fկ0_̿9{t2o-M9^p;/|:dSLb*N'cJeiwDieGLqqmll]]}u]Ga FrI (F#]VcF5C6ٮ8skAὡb3X666X,=L-gx1#! Q0uEW+lYp8atnf>OX,^d%EYvMcG!*@O5~1|>H )]@Eʢ_Dta'?Oh/j?eYtfg#((1սg0Qg?~X;AHP=|t*KQ:){g;M[se [P7j| } ~/qQ%Y y֦~/,މ؋^e,/(v]h4X5L~m^%%5u' k,M+2<+8QG!h#8}hyc͞(ѢxסQ[Js!$=Vnk,!Riz>8tR=H y|>^:$xU ;p?W}1$(\&c!F& C}^.{t"6m蔻38^pLYH͈\˘vr{^Cty @jEޘRikei ͺށ:Z\: NZ㲢"U6eDMX 6?zByhFl9tЇNΕ+W^,]?rmp([=88j־h{+&/6Q^viؘRl&Ys | F5 ')N᜿18T,3,E6nε%FOdkoSԋ:R}9ЙGLJktqU!Q2]װIYZz6, dzm[㜴9ghgN~~kF()ݱF%DNDɣ:';1@t/€"{+mKSF*8&*Fdvpȿ__Ԋ'6`ؐ*F]KLV}2@@cjU#Nʲ_71Z"yvy.^Ȼ~gFRk\bk<Ǫs@g{Hkqm'3EThkh-< |7)dq-- t.S=Fo7p9n]hǟxfdJ}tNq!կ?//3|۾WwJ`L~N}t$2GUU}ZLc:@:6&RyOIMr5tyy]t2Rsyv\_\'ɵ~?yWv( u-$]璼ɋQ/sVמ͑DZ71y[kԽ:FVM +0/=rieB*Y u١ s{(&uzmmxe&9zY$jE3Ngei:t*>ç0֮;19 Y;z}#ˇ}#EgC ~@i4)wnoc!8k+F뤫uԉwr3;~T}tLC£Zѯ%ɉ̚ealᡇBy뺮ݫ,a,ϿkJʕ+HK<΋ڵk3>ۣe_0\O{+.? x(u"!zGufa7n\Nzss/}wqz<*ytlky]]w_yLz[}; RѨ'2|onnrm$?QO} i43 Ufj8"e@]!ȤԙU%$(`i9fM|>?v ~Cx֭ڿ~<%S%][Tx;߉4Zrg@vۀ]'ZsxxWUB }CO\m9  : ~ɇ!Ak͙3gxӛ$:#f,b87Q[|.DI*~3H)umX.tE&ƞL'*׽/S{ 1ܐ;?ěcJz8f<Ũcpҫh\2Lx=.Ax"SNAo}!?uX9{,ɤc4עΟ3t`ÃB$R&([5(;?=3reYJWc2TBNG=;qI.jfq֞Z9!|;-R:Cm88`6aS2KVv}F ]5\xshQk;WQJKZ]WjyVUuX(Yi{o{]i5g2#~9usv]t2%/acc#I9&ӱG~FX+v5:j󚧞,^kE!lJ6nn|-EoE)@)Q#|+l'@d1+_}R<19esjc{lAc;nE0Җ+͗ˊ>1bQj("G-(e`s.- !^۵__~%V[\PV`ki 5wDutfoo8[n<λ^[X,B̙3lmm{q`SB2O>ކpl5'?O|f8+;_K|{Oŕ>>;~_? n#k0Hk( d2YeSV@kWg!mTbˬJdv @a 7bCF3JCwu)kd d|b/ [=$eھOs{x>cѶ-H״( ^S[BGⷖd=Ƹ&ͥ/6\%ED6$,u6Pe- 1jR|d.eS:B9PנEt3mLݽFY,%D%ViΝቫ4v-F 27xZk˅dG IDATPn8JyC,-n-PF6N!_zW~O= 4^PVc02ZB2,4MPU#hGg<<kZ 4r?ƺy霰`r'\L'ٳW?6 Z *w7}ڋ|f#x̲mzƸ./e9Dh-!D\"Bj+#{VjVF 2+ˌY,4MÙgG?z,RkggC+65]K^G>[eYv ӵV.^(g "jE~/%(B\t ^ONz'/;:Ͷ_5҉lGy[٬ 뺮'= Qzpγ/"t 87FHhZYRZFl={4ly$&F|C>Dq,\΢0)3Ys5cOìR͙m{eUk̾9:*Fedc=*P@]Drqte9Μ9ÕOz0X]R*bg2ַ>/_zeպIeY9CI_G v1}#<~;AgANOYH---k5DcѺduAXfNQҠY_5.zwcf>ae_ݬ2?ZTC9CWz?ȇ¹IrDrJk-:;Gωن!:Fu$+5!@!g8q]+m1a?ρY w~O]zoo~I(˖AƓQ$gKm]o[ns"hLWNH8Fvd"0.W7%c%GCUmQ2lQ&6*J{1{ H#b(}>t=gG1ժӽhrd\ѨWo5h4;}t0λ/HVL&*ȃ,s"ص-=S[\vcI :J gd:Z4˚"D7w- u([13;c9eY\m[׿f;w=f]>O6OF!(ə/D,ٛzbx".ϦqEGs\|">|\xafC@!/~Ȉg{& ꟝peE9.,sa<1x ;6dZkyo… 4MùsqڶeUQփ RYz~*$Sn}fkW D>!^uN%s;mJGibyH7eF ob`M$ E&zy} #-~ZS0s\|xI@F ŌBh8(K˕g1BZ ikʢɱ+nj|wZ¯N|e4=P;j~Z yv!SSe/}+}qk2 O|IAأ@yYv'.zt;;;=$~ >k-ŢgώPAPX0>J%G05#NtTʕ[:W(G=>I=\fs:/)_җF#|u(e|OHsSgqx/J6\p&(̫讠R"0DTۏAH$b KtwN>kaS`2`Ka>x&ECvX呿[-trḰFYCM5/;JzoecI߽ *0<' SO?5h.I9g$Y!Y2Ğ]xΜ妛n^I:;us]Zp ;]1Fǝ[, ΧCJ+({/ ;;"4IsuaH!OwF?e3]Ϯ k­tm-@Q%*DLiư)N`+@2 :Fqx˫BsÙ|Y7Υ jJP(54!Ze>; f$xfV%El-ɈlAQ|穛%Z5v6UBbf=tuMע CiyFO?ݷ߉/t9ys ˕ݫh*EjA1׼>FK_z7GPʪ‡U8DOѨ]z?#ocBnb}- 4X%c>ؒLA,!Z^%޷e:5w 3[ؽv[1Eɲi![ei -^P 31p.JI?ϒ@ODP&5>-s ~+ڗk4U:`Ҡk0t.$iȐ|!"udjlmZ,JsFFD[ >TQam%D8ΔǞ.tbO V`׮&9*Hҡ_, JmJ>!2.Hum*OЊxҗ EqAmSbަU.401L{@E$(rv1L\3݇@#Dҷ]iUO=R}&Od^/1Z/PVbt$W|+`ʒfkicXWi&crvQEdE{SR0vYBQ"c簅BѳugvpN`VYl%*TQZ[ro|`w瀺yJ=~ z<^,6?8w@GZb %*X4KFeATs7msᱯ˂qXO_ΉQM@̌躯7eqQo׾>N'SV Pnhc}*e 4^c=}"V(&mFY 1*&iJPDOp*~3Xx:TFk סG:s e@}{#Mi^cHɂ(cdg$Չm\pkI=ON6cO]fX{A9j@$gEeUɁ|K_7Gq{&qBfv3Xol+Uދ(k!RX19T/ &IZ>ǒ rʱb:L`-قƸ%\G5gq;u~5vu=7|3oy[9mø[ yS|8ٷ,ȣ* ?x_;,FSOGP *C<>B9SG)A?XSB8]Y;躮GeUSB#'Iv/|?2)%#QZ^/,ߙ8,ύ ""B'.]";N"gr( #@k*jRѤ&pY}ܜ2g°Um=:Z絤M."[ud,!ODq\ס"ٳr>qM)zl'@#w IVmJ 1 [UCS-Qzul&O&Uvפ"Ca9_0*J lCT Tbe՞|@@7tz*8ڷm('3ߟZJSܹsز̙3%ɔ!tz:\,qN]Q75?i .m7!RhJBeY*m1Eo6}YDI1-_gBYѹca7sC~mTW̌2JcW5Qro;U ;ώԑz=_[J=s~ΫoixbbJ^:NgG^Lx%:{鍬ncѠRjMr1Ɯ_<67Ơ|VU8Ţiokֶvh X- ~GXboo,ٹ rFH9udY/ xf&^zK=Gxk^Ã*g;ױ77J^q6 tSyU?岰,64mxi5[}.=~d=i??R"7HYO9? ' gC85uz<Tq %<9\-x=ßWy^?H؉[$hAC˩1te/ [2Fqٞ8zµ|sp0VJ'FVVܖ~ϖKP=C6w.tYʫE* H2V&#+e_ӟ3;M#ڱCm|C8H6ʕ+veY\׽j9Gmp!RVZC$Q;88Xs G$<-o]7Imu9$Ңxʲ0eA=*O.!Mn4Rq⸅!I876KksW^,>k]SҴ.kΊ A7L씟r9,S..$[P:9"=|9]MSӶMG.^_3/lMG 7]xcrTZ!c@g'8tNabQvvvpIk{4sںFJ>ο8JEʺ.Hj J::BGvt\~GRVă!A}uCu;wz)jͩ%h:e6pd-4g77g[)KKΜ>÷?f4W.~Q N&}"eO}nl@ f`C@ڿRtZv```(=m%W/% LYcdϵY{AYc{tF_Q{{l7gSݞ(ogr5Z? A笾rb0fgO?h/Jի3C3gΰ9`TV="JH _O}'L&d(b¸C`ss-ʞ$'K ks9 dD!Xd~6<:8{{v?011K.dVNb 4M1ӧOK g@)ճݬ?]eY5S}V{;|нljUA노'&_~# ;Nrvr}@$}$Yk ~Q4b6qǝw]"ˎ ?Fc4O4v9ǚXf84Ѵ+T*9Iz\aN|sR) l!#gk#3lsx?-ι?gclLX#Z0mSϼk &4$T妛β}`rQqoD762υ7yJ\pFp^x}'B2!r(%ε|aX,kܰQ(TVc*\9ϗj W:ڎxҫh8r^2mtۚH*]""@u˵G.QobI ߴj"*ٌqY&$1ooRCTL% +:eOƂٳ=kDu0zGga&~=2=>K2=ﷹ>-+Ѐ38gosr\I]/R<}"|f30[dkdЪ*8ƿ㮻s7>{l)`e;^]FUU0. 9ln:Ǿsv{c\U;-o+KC:d9CY~@g_҄}:ף޵+;sp=Ӹ. IDATˆ!Z[U~~}/],G?rd_$u{_ulP=h,х$WDNޤk*:Q kEf-4\2EQ#xa6λH8u, ѷAū^uN.FGyFpJ4*zTL\vDVM4Ǫ"9ݓ`UvZF2H@z(RCt]$sQQ#*XO> eUl^|n׾F 2|=ak] #"'9; lW7(NKA8ޡqNd\pߜ%/_k ;^7 ]d':l K,G?7ŔHIs}C (Yx P9!Z;s{{{\J?wr>$4EYBqv٬?0|(( CYZV ,?d#Y!yPhi(t+yӟ"D&j~ߟ[#;1K(0Jcԧ1WUwһ`8, HUJ1Vp|RJL9|Ã67z3%,"Yēxwc5k% Cks q5n~i*Uw) xM&_)EQUt?; ,(F6irk|V%&Cg=/ea5EHGN8];38¹-.BEdkkkmWJq)EՆy>統lL}F;j[>kAiiBKЊ6Ո t^/]$eBFk۠ Et !RoqK^@ ?{odYvu~r}̪RWZܲ@ ea63 a63€#f#e` iEAVH")\ǒhBp9y jh!!L_%RHBk=$јzM][,gyh\w AXט5kҶ=1!9]Z耺$*:u(-f WIBt4O (=)OS؂\GQkEe4S}Wtι x y^7|se> yXL)k׮4)ԪnټxS?'׿?շ 58S{ 1%|8de5QW!D 21Zbssj6{g_DT4M]w^䶝E/yww|Vgro^NXr0ӿ'݋iF#XgㄓsfzЬL"I(24qtp,(T^i\w&{}[ϞBAcu6d S,IT~IYiaXz-0dBࡇo{ m5s呏hć>+|vm&W|Q؜$QJeMa@n2{z0ヿK4e1;^:7fʔ B+Uɢ^RXЂ:}Nta`콧 zhTg<^*H藒sΧVEQTcyuXίTYßR(؁\aZj2 Iu]U,NH@י\9!j/ex!! P}ɓKnfǹ3gb2c"zL("$`4QNR {w::dDS\D)r; AńBjۍΟ?/OP;&W+yL&xTƵDJڝnv^6ht:+yy$!7}71ͨ&cÃ^y/Jsn oz!fҿ\̖͗Ҋ4y)F'<ӃdT[-vg4+'_{ooL6xхIݖ|kMI~<>_̹\Ju^7S|fa$u֚{'=ܾsSt׍X,' z>,~yPoI!fłvk .7 Wa^;}z_o΀8uZyr(!Gc^W_]J K:m)25Idm.f5U{Ul=eai.߯5<m 1(Ї9^s|a,Ew=<_ѹfbKN ^drjܛB 1JEZiP*6(tUhW?Q)Aid2o|#g00^9>9lY06׾5|?Gƛr߱C8p>h꺖0|S!1`,9}{(»71ZZT+E) aCB6S[0V%A!=TqfP aRּ1wuwAJ;q|Rn$(2Z䥍(D{/P/\&XJm ih1B'ع3g}z5}{Xaa-x^[E"EOPŠZHZ?R=}Eȭ_c;衺ekj 殻|Zf,˼fHE) &76ƴ)fwN6c5ׯ_2M>ܠܓ6eX!s+u0ݘ_1 Y_UUQF/jo~70UlAntoRe*]/brOpWW^o{-.˒zP.j\"IB$&M׬s+z:?o CkM$u suKZW9?S?Ea9 "(LP[-#S wɷ~j@נ\}ٞnʵ+|΋wI/xλ;LQ@ߒa#i˼ETun;YwVXRbNăڮO(2Zk0HφobN2kD!)jhʊ/r &dI E rMFmxᇏ]h4zU@ne2ȇؐ"_o~=7햘{3o~_Clvtک}aB}fny>-*_ :HqNc}z?6}GrA^azH] RESul>mӗO&_1 …uW7<$JLrlF> z%`S'Ȟ9mR&C|F$UkMd]0W,=YՅ>{z3sӴ)H^PaVyƭk*煘g^F b`萢QFIBP~EFM(Fp&$ 4jRi&t$K+y,s/^*JF)Jk11gɕ^Emk"HpǎybdLlϋHw5i{p_ᯫB޷> x(T-hr- )T:y-'|z ~UE>H ՠ'x֮.K DۥD0WL,gGd{k~D sv;3{?Ch3P_} NUYog5G{h$"mim/Z|1_z.K4^EQp߽k :hݠs2{ak4a-VZD҂'hr~tt2й.r,ۚG&wN❣06#3vww AH:{_ >vu[A+U^FL5MGTȏHLv_};o#&2ʏ~2O}b[e}z<~7T$MR_D:M 8nNd ,}b+90U%_c5u20U|۷gIQmlo1^9Aq P0F=ܸHVzY/3>~njF#:'ϧ-YTJ~GǤ:y<>n'V*e3qboS\+Ktfc3L`dBQT$FUgsW4OEx~h|( JIRXcE7ڻ.oNE u * b["r8ߢtOXܫ3ާh!V9sGh:J= @mǕ'? :pN-QP&]ʴR #1@G|p ?XQYq5vys~x?RN!b6gc<~._ SڂvQGFyZFe+^>Ȏʄ9 E'rF=,9:8` ֓9Bwϑ՝ &>BZY.ט-#xmv:~泄??Ύ662.\83m.=IoiwR;\lKb6 콐*+^@u{>xʢdY/ћٺt˗ӹ1d=˘,3$w(Ņ;oxz&Ty̾I؈@)˒ .sXM9_%՘oo`6>]mJ[ZxV4 7n8֊XvZlONj~0o~[~O,(_}8=w{mJ{Jk7#omM-"OTš  qT(5mܤmk\r=o0;S<-t.7b%6ĄFz[G!kecBq%~G4J4|x, 6P] aV #|Ƕ8^ Ѽtܟq>v΢I&ѫzEM!:t-55c1B=Pǜu+Ld1Jc א:y3%`F6j[ b圪0)+q(QFcgϞ-4[ ]|4lrw!<\z_஻o6먛:c M攦kq?'+m{޼*w}gwJc YrL+sA@غz^Ն˟{;3{ SzR}VB>O#"tшMkbm\La Jw]||Xk[4;F1Xn4a>@R5{e (DOk/Vz|胃_[_eS; w%rw}Yj+Hh/p`8FgxnL~- kЊ{-Cy!pTSi ^o IDAT/c:g h#1+ ԭϰ.m {+ê>Y)D,IJ) ɤ"Zgub*ßq@ )o|`SΗLFrLEuw?4 jѱu‡IbAQ\vMz5]7VSىʥI6ǜA!:=8NtRcٹr!o0F\̰Vӵ|"D9sYkyO*{)~^PK1xXgtFw\ AkȖ}|84U%{(J>Rg 3sqlχt-ZkA>;9E1bc֖r-V*G{l-Ƶ(ס}A~<^_O ý}, kp]V}#1?u#p:!y_L4looͯȁg^v?\W", _' l=T٘N+^vhL `JJlX_M\qk -5kvmeY cQ1؞L6OﲩAifuaZgBj;zDiWUUl,q s@kOSp8((d=3n{pWu܃uR,Ul?I V 7~UB:&N;xt@[x'(n0U|3}𠂙{9)JҤ}Kx\qpοOI2,emY%7RP,Xi }h͉Y*H`m st:JB5'Edl[G>noՂU_#pJS/(2Vǣ03q81}x\na1ecc*zQ%@hMonn<1FdǨ_w`粐@UzU&XڰғR咧~:WB(WFaRБ;RM_v cKPR}iqjTrttR^RMcHt2WeuT}&?u W]& );^03gxCiN׌JkcΟ?b`:z@7vZwy>gdƃ :Wub>hҪ~v((hg:Q6UOw3Xs.#0R"<'4T/#?r4Vnn ^o98:իh3sNH:fe:fbFS |els]͎Mxv@#[ ^x1×Ks czUªVkZU!"1) [,j }sTUE׉J[AšD9hC$+lu%GaX2F`6>'OFc>rxp2(zB7TVW#NFcb?rV( :/6oѸk4=l['Grz\𠅁Papvb!1;#;џwB^s{c7ӪV|TtNr:DX08Rg=h:!.&yE(=o}[zx?OT`MlNG tX-TetƼ~PkBHw`[cBgr J)ڮ=9sꦥs[/-b`ST%]ӮJ胰8 !dqvIY >ɴKpw?8TBZbFc0RR*VTUa{%kڜ&mH+*%QpZn? gZR"+KF ,ܸqDZ.gE0b9?AbAY ce\u bdX[79UV0'ᚢCLhx tOXVUE:pi/b:Ν;G:~ʕr[7c`bP4Ci &q>W:Dxg3 [\DQbjpheݓi!?C?$ }|_XݯNW'I,[܄xV2W^:{/ M1VcMKrR+}j6Wӝs=wetB*\ l9Ga+Vuvdb[k-=)8$AV8[Hz AZ 8=~/D)}gPJn~t˚J\EVF6RP&;9e:HU;kuYzbߩ֔U%AM.ABsZ:׈.`% љX'AYq :׬{0I~uuko=:f((-.h:Ё8ǡ, TR|lhP&,Tǂr AcbcO9Jk"t]'+dwTqNHTFT*(x*B thqaV!pX8m ih%ee9Ĺ^$ʿL k( {%(JƱ1.5x^JDݘ(P\QVQ׶ZqE(M-}Nb e ~IˆQ& hs !CC@g<3ngksHƂyd8*+pmursycEsy{#D.W`4 t<.P^pU_y,N$F%.tG-䢞ӵ)r.805w-D;GDŽLYR F[tmÞb}f/ Pqc5]r5Q:C-_"Pm50F%.܎ޏaa:<ږԭˈmyYeK AaVҊ Itb.dA:xy+EЊ9F*Cw_mT7-(~4M$`.z 2 SXkk]R,(²Q LZ֣' Ȃ(!Q OAXO1_o ݻ#$jͲGsAkО8N0JBLި!(F`Xv{Vq>#kJkuKx~Z}m6}M#1FR%e1+@Sd#~5|3ݟ;\jFAkSbtBhI 'IGNNwȐTMr'm;X rWҍɘ# ۓ[jx\CxZ]ל?>ʘHxWgW/dRh4ʙwk,jDnf=rR%M֫=CzEȝPh CozӛVPRhXPؘ$'Pmn$uyAYVl9#'h Iҹ&dmj|{rsu(׮r5LYp(Fŀ ])ҁj:@ Ћ41/ϑ8^m%Y˾Cy9%dT7v~d3 !GA.4H2p%=i2w|E\koNyYO9_A5ݐQke+:U874}ư:k'VHu01f\fX]ݣZm3hh|&<(vΜkW8'bj_{TB)Q 2ޟn U!LzK jf1F!KĔ^J4:(eh^ s'Uy b[*Y+8|ڬp}c僗v-&~K"i[ab7?(O|3XޯOR2DP+Q/dNWOw±t:~lO[x'KMvrBNJTRE'P&pܷToQ KztR |l1e{k;gSӲ^2(cOJ)B.s"YWZibڽN6v>2lO=T4NM c{GEW<׿ (-0L3>kΜ仿o=e1_f)cRPTeEUkMQ;wNqF#Ξ=KʐLs^ŚfV7Q!PV劄59, { Ck8p.`k{[3'Ƶ]lY}@M]qiKŋ5_M1ޓ9UUa",4]tsԋŚ3jGyl'Ā"F5D~,Uy <"t(<йz4zՈ.@AxqȜ9vwwٽz5wws+w{Ռ1, |3\{owi Ni"'MiaW֟I:CXy'߇G8c+y666w'%e PF{ET&HƵ]_6?wI,}F{jEU# SD.'ߥ |HI|>*S򖷠[O,F^3LIcXe =?G?8w]=ўT.LR=kj[68<<}_VeqzH\E/׊G} k eùs,#j9dnV]Jڠ?|ǟΎIB4] J؋=RkՒ\i:+~4gB 9YVfUy̆AZYu>#d2a>q}ok73?0/וURVw7] !H9::umzcxֳFlZ94Z۩+}s,?R-1*-X5]×eFq !mF(E`>>BPeI'Z%w>(BG<9;.2ޝ赋gY1Kd!O}|}:vj/XۘlpE.qTN[x'grȦߏF.K*-OS},ZU|::A6;.{{{@ڨ@kyW*2amC0Sقa; p^ :x;$H^mG3ݥ}vh4b>V`;o4i-R6FiΝ;Ǎ=Ο?3)q]Dz/m9wYϷϲ\Ay J2A)ҥys-*q0W]陫Kh2?U u+M9X49^ck͚6Uٳg;ta3=C:+'&bA$,> < >9|]uWgHtkg66_Θ919m1Wy\0(,3Y"s5eL"- aMzh%=!ҤpAhh%EY2;<Oq%ZEYNկim"Z̕Rmyɧ OF#^|$9)<)t钼~@Gd+aG1/O?x=_ǦZp:k)2k]e<M Mgo:9$?{IBs<ͰE7_E&QK1DeZg쁠q m[.]$h8oipƍd)pmCutN|&)?2=ixlNd73^v{ cutsC H_Q벣( UU XaizGV99!;Y$Kàlÿۏ=J)_gS4ւ1*io֗|Mkv}RUW\9iL.4~/})Fk`إLPܜ=4g4*r%她43LSLAl:2V9ܼOEm lc.Fx IDAT!5@{fqx f<¿ |1_>TbWL&+Š͕G"gΜ,Lu3g=_k;9h^񊗣lwz1-]jMYhUQK>ɯ Hᓞ*3)R n.HM'2G6u]'}T~Qr_ iYW\7km˽YOma&FZV*d6v((m;~ywfv9{GL67Pc''e,J9׮]C+sġ],PV匫מF-;1g]@u@y} Sae|(s9qQJ~tmK_Ҿ}Pg+!qc>ewk]DzkY?T"e }˯t\|9O'in)!34T#ko:ˆhcuI+:e qJU};h+*:6v'Da ޯ~M\}F|NR7^|6T^S}ac6s[ة={>kqzn?^vK,Th%{_^|SZ'|eURpi) Kۺ@CѾ( 9 dܿzo3[GSRhu M ,7kcI/ĺurX@ѓ6FJk{;766Y'`&qc= ~7>Ib&(-sF,W$@WfGq״mHtEɕ';ɜl}xZ&W'>9sV*{њf(Ӥ\ H] "9T~kFXoj%W^IWf&ZC[x ׈V4MiJ1?p.P*r<Yǃ/JQRf!UJq\(JCQfWdQ`59ukqml$@H=!etT/狜Ks~ŋuyca41߭Hwm,w߉_GĚl6[1KIuٌk?;G&W~:Vu3Gr~]h[G t|({@QL& Z4Kjn8<<yڷ 9߮yASsv9Qᜣkٳ2d¯}tmιsy궓* cfk&f Fch~d<ɿWZSօߪy~ ւ,8m#<RA༧nj;qY1% ŕ+Wn\6|fT15N @ )"s]AʊQaZ}*I,5͒ooΉ!C" NN~-x@w*[ĵSDFSQEd3|K\4(^WŪ򦞷>8<tBpx*1PaRpbhTg cV,i2,t>1Ap9p%rMK]י:UZGY kSzO>F~kW*k떂a1Kj'YzI1|%F+^.,Kr=p2͏x}%]2y+"BYS9-l]lgmġcT;/9ѡ$)GGG;s3gPL=<2~5kpRuߞ71EsȈl^*;)K|>xNՆXr+82~;xҲ*Pڛc1~'^h m]l1'O X[:Q t)8Pp_,΃6VQ\ƺ*\#(z5 AThHORp(0sѮOpQ%RIJ|Z-( h;GU\re 9~}>;ّhG9Fr=eˆQKQ'쨰T%*>gTP0qookh:Th1a -F9\(Փ ʎki||/(6̗o/8u8Bd}jC{=]Cp=$]#d(kc̓mZkOgԓj!*ے )L%q?*NRT;!! K`p#l % ~zx}p3a >{{H:{>{Z~u0Jh=]CFUDz{9;Kh*D.ZWo\'W4ViȲWӫQw6\4C AC+Α%0cRT AaTO{̅ghsi85!DVxwbZXn;rm]Ӏ xא:"yrm(us/#O>ɥgY7k5k kU؆gv*`@tti:dو/K]~w8;h~F_Z"#Dy2Bc&eAL͏ANRE Z1[imG@!Gd&@`QB1 Ey/JsfgWn}F+TLx+ y._M'} a/} MaBL)EcG7-cwM7Ơ\;Њ̄jR}<^v(,J 8-rb Lc9t_ Ai%(Mlo-nxM|ִOa ,L" A\Q&,=o|nܠnq}Kiǧ${=zB:ҿ]ήZuv cwnkHS@dq*D=[/ eҴzˆ<娯co.G~*//@YƯ5RJ~w}u4 eY6XZư[d)a6zl(2ɶ,f@X+{{;4͒Ѩڗ ڐCkCl6{_)MyECZwun{E隆rIY\pAłfYy"ocqYUqLV2S:26u߭|k׮Að7qlA1=ecT{N[%GHk8>> yK",״AւhD38T^۶9-΁/:^^D1T!0)4-||+9:D4\|ÍA&t?drCZOb2F=?WVz*X21y>Ξ=}m?o:$&~y;N2L&}7{bCSϻҚ`-.\[k&m}OpEv]dbt{ZX)Iʆa2}ƣ??ΎPcB JfUZ4OqmO[vؽρ]5omRHdvppBnڶoXpҥ߳cwݱFrbࣞc3kV+>5/϶2S]4m2FޮMZhQYaۖ}_PJ|#oZt2bYK_rx:"g6_J*3\qt4dۭ*O/g4ưHO-:Þw\tl=҅%>O?Mɖl_E)w /@~UUճa%Yi;$􇖂5* Aثa6{)IrX6]q˲}OտZW>i9wWZ J{ m3;$ P?Ԡ'3M4N(] x':O$rҾ ~=Hn%t1*wՋɘL,f3]yG5. Y.ŤMY)ѫTys}vvvz5SBt7yꩧ0&d'!iւA*eEE]g3!e<KWeHS9 s>J=hD\DöۜCGaR6K Zkz!yBE'-kaJ)6ne7kʊb?,IU#Z19K^iIt voܸA َ|ŵ~?D0%S$äw>~=w]:x~x{й, JiZQT27-9>%_<}2&+ى#4ڶ(? x??d28::%k1(\+<,TiOZ9ɢNKdRO mCgF*9E\zm?JZ@|1w$˶iy^f#2'>Cs?Ow}8B5Su(eE +mN&e(zdgbNt.`XUj%]],WRdEcDmޣB 3f !/2YLu8|b,빠ʔE4i贪*r 7,$I"I3jJ&~»NxyFtbI,-UԔOr]b>icQPA ԍ@$R bxvyQ I ^|0~Y2( ޯ9D}# !)pI"RWUmbHH!QYǵ7zGh[%qxx=ilWL ~~/7KblJac-90Ycz't.cT" &/>:UЕD:xX,v]$ҹ.U=9,JViJfX^-D}={g:l>O[dy]A!k'"/P, ]PF,fGt zTL&̗pq,5݇Wb:cHZ'>' ccrL Ίx5Ԥz Bp}@p~hR2=]5kFÛnkE IDAT(7 bF%M>/DM!J[ɨsU#l <5(tkXGuG=1 s:>WAzsNX,X, 8v ]TrV1W^SJ/$cI;{}p9:uݶ-c C%J>-GB9LsU*wJxGyꩧz,ǽ^{Z iM1/BP,OM|^eĪX.ɳwc$ڂBc{b>o>&_*)1SڶݭWzi{ʲtrZp۩1J1.դ/' GG3>3_Ϝ !X,(rk "/+ɳ &3eLiA,)#IʝpnoZ%7UcJՓ(>rF |虛S +ILUx9Jy8s( bbkḧWYpv֯74c1X~]p~ŀTjF&aeT)D&B5EQE?gZF%BbAYUBXeם%Z)aAL1rh㞻f2 ChcQ_z|/-2#Z?pMflOUQ^im@Qd\xAfR&s֧0/Kk -I9zcXY%|x\!! ({[$Ior %Jz{sÃ")txt(.N鹏-8 &+]sI])w]Gp۶EA[רꫢM+ʺmVR F̯$ˆկcڦ'^QvQPky;ԯ+}"5\IrMe<|jnxyaTEɌGR>uN}&ɔ瞽̿4Ks32''m(xNP{Nό1Fe}>l5?4>ZDw]ZιPF|S]/f\x፞lwgd\(F&ñދJ[Ikaޏ(ihRl)˲EkmX.tj`~ҥKhfM7~>]KZ'jpOPJ=ꞻ;;y;)k)<"}22:ݒXᤓ6[1x7>io\VW:KfQoaZ;Vw,eqMsi(_WݧMtu8l`ql"9Ȋ2g1Icum 7!S3gv6MG4Zm[Ip9G(8::XabHuGGG\r3ϩ)BMICZk5rYIRhdF=WyފoH4O)Hg[a2k=U^]FVU{$~8 -ͽ&^]0HzMY7ݽx~K=ydk(Puӣhl(~=H|gY4 @@1y‹/wooId,X,?V2"xe2`mޱ]9ǽk$ڶܹskn6o6O;I0ysw+:#e,zXF^A3Ny}acck.n?4Uֻzhj.?Tdykt,-ce[ڶm-mhp˜2?ŝ{NO 怃. 5ȉכc}-P^Bsw9ޙwn1McJQ&w+nk:L@;\p=LMw !jj- /:U7,D)+E0J ~,#upŬ8>SW(CҚ;pmG ׊Es"ƇX $Q&Caku{wsE۾lA9K^/ ~.89!.8RFGk~En6[{VFV Q|9˭SdZU3D3  O~ ˘ i/: p{E-xOA^JƸ,&oĸ*4Azc+B`Twh1E d\xCK4}Fc^r#(/qNw0ZHs^3|ozcRIfibFy,i>**&4"mv_8,FT |xQ5yp_6J;i%bAR纾rM<.Ԋg"PΣ|`1;"7Q)zԙr 2qdJt%4ЅGWn7qt\[`1 Ӳ_O*mTa6dy9J _d:I@0LȳFӒ;|еK2ox7F;Gub] ^j2ZqQsQ>Vг@QX,6GkۖIY-t|DDg[Tp,Md:ēOxoqe2Eccy΂͎)3;ֻ5.p !d_c4^{;= -m^ x$:0*+,(W'( jm&\6E֊o%w%ZliFe%/BCumǷz)NY. ѮhVꓟ w,]#SR[H"dS5`vf=}x*v]}j5wݱz'kދ熥,x4\~@O!mV)DJ;O&MQqwM"(k^Ο?ߐoICziҋiX" /Bg/st4c4vBrz{ 1"E`AӽiIiI nwdkZ7tCB/Ru=LgY- q2yVt1/Y.dt".~|)}CFjقkW2(?&uCH#jJb-Ⱦ>m[8ZЩLU{ȟ?&Ō4˲'`XEruh,F*]0FضugNN`s?|-crOv$lt;ᨁ9 ʹ7w1(rTmNQ!EϣЏ3K,1 \0;ԗ c/RJ;LMM{VU )e ضG y/}'U :\իWmM h N *h"r_^0Wkހ+^)"&5hps*Pg^)wmm& e!˝ ڦo~3M~2-|~,c4b#iXNOZab)7/2j :ƍ9kX0Ud~C,0K@@x.9R[wq gPc1$!vGJ4{EERض`8>Al7aѐU\8,6JF#~(o۱rq9~GD|.aA *$bw1*dx';kޑF:+:O{H3_ ?_c?!l"3rVMLm[Y&фF+zw(EO a31PniL> |Xpi5,fQGjt%_0\⾻ ^{bSb2ϒE8%9<]t:f<1Ֆ?lw^yYFm)Ha5Y۶y< X,X,P}=tPwq|}QP< [ Zn7r=|˱ˆ~X%Je9rQBʙ7-mv'eID9>2^U#i<wg^hN:ZLm5gy"x"o{ۘLRae֊U)!3 Elle¡eͧx3mbd4/<) &mk\9b+ā SeV }:>Kgrxx(:=Z)R}P*&꣫v`{$+rf9A옲qxÏ<._|Cg I~={{{~i:'k#(bn=#e'3PVz+f#/| գyEUaGt:ٳֱ5X__)y54jNsϓsggG^g=x<|>WG$麇OJUa<Xc9C:w0J-̯M1Po4\OI6yDx63ҝhk_{l Vbp&mrL"z?}sU)aU%[ŋ,{>$@lS].\ٌ?uk)K8&di.?3.3_Kگ:*sU-obE49Ġװ\X+h\g 8`)x&LYqjL)OcVQ? Z+->w@uɒGiLRF#iUʞږQ̙3kwr$S8ۂ~h:8r4>8^SyVS .@P m{.W'"ڶҥ/ t;V஻Αe2L\o\G>ʪ]gxO3NFEƨ*"J!uҵuKݜf /7$KD]( MFf(&|{9yWT'F-PL!$ 2FɳW#a5zXmXc'? PSQbt.a>nWآ9(KȲza_r]p||L]ה]|le+Z{_h1]c: sWq6{ܛU1w~OV=tN&ܥo[ŚS=\inH {8 ?e}xR7@ɆqN[lV|PWb s~G~K^mߓrڸ ysY`]ffHvuc[A48gΜz I{q/3QjW*B=`_OOPͱv 9Pst(LGJ8/v mLcr-)X|9:210H1"/T.d*? :0N}o ZƇ{% \(mV)'ɓ]f=d 5xLUU}?-離*Xe9=[LQws57cjPE̟ aR0A蓂0LvЕpL +-t׿uIs$ݶvQj8N1FөhWF?{TE>7 bL3gX{_ޯ+=l8[$BX?SKATU|ۣ^( 1Q s6K]vsݘ$\"ns}~ác |cOudXUUɳƺͬmh?8(qJ;'?~tfY/EAƻ5ֶmOs6܎0{p=Uʵ^zIL,V +~ͪnU߰Kݒ VuM]gxG} ]*àtegΜ鑙زbCȹҒLF읃Mz[IY!1ϵkb+6F89uΉ̗V|{ExXNi =E0z@ ;&ȩs~ 6 '~>rW&|}] 9q Ώ1d?Nq#ASiiyWpj!j 9)LF]t:] 㟎q]w_=s%By:eRZGUUeww _rـW<<OK6hJSw/"ӽ=<©bHih%[H2ȶ+yロ$/Yw6B e =)1*&=9ׯ_0:8:>0Z mZ!f')+5 J4ζdZdiȗ >q kF*11kυY.y LIa7UG~0TPcs91O㖂`n{QRqY93*:&2BчkRRsΝHnLJ9٣\nI5_du63!xueDh`4E"Pw%ʅ՛Vh{֔3~so Դ7/}b>rl7!Z'ޯ;;M>t@ *u2*'A3TJ0 tRhc 5F8Bo h0S#1J"YVA(zw}b;ͳM´J238}jGZ4DgQ-gG3#ȐqmaoGvwwy2aײwq){%& 4١ئ6~pc|fc{`Cd|vqńîڢFk;zw \=nz%vht=*:"es/^h4lXMhmN&<} Xv0{!M:UENX9a-V?ysnk*,F,ϱ]x\zJ)DV:68aV{/'˿K_Y ^:ZC+ʜ顕S o b{T9^~ע$X$rќ_yoM',=|oe|w}'ւ c Ʉ4&/p!N.y ֚td4*iPS&]P"tFZy>c?Lez`I) ޣמ'?r1+)>-Y͆{0β3}:ƕ ~,( oTLT(J;W`b8dkoKm_SJ28ib4Xe#)\9m<9?VeEQ1MC߃Jj'j}ef9z*׻>88V|>Y_ןH6 SoGB`2USi~:W\}trdע\\[À{iJqXʲd:r)jA^-Z .2Ӈ8cMtH+۪T4 +lZiڦ*p%X]$xC%ɤȜ8n5 ]v*ozӛxsYFg6,7α/wɉ_~2C9LVb9n_z p֮UA^ ypkLζgz']~gU@|3kێ,ֲqNM)yY(w"Ҷ!΢31HRq^ܐ \>Xv;vɄ|M(.hTX=^7q["%ӆ=D8kvU*9:ZP  g[7Jgf T^e *ZHìR5<{-,o k!ш5}xGdIL k"sd]Rcjv-;k矐S#9A ZgRTUE4Uwv7-Xn55cq@ECo|G/>x{8n8(ڀȕ IIpSYVJ1_.dJ[A$ {*Zl 2;\BA1 Bb6Z y֪0Jݑy5͒g$s_ksHV)6a:JZPiw,o=c.%;&[ pSeY:aoK^zEs "R(Dj3G)(B S6@RJѡG$jAغ^qlKph D6gDVcLn!4ʠ Q?>~]qRBmf7mŌb;Qc?܌ m-#`ggs%H%Tvi!^kʱT1| V=ۺBҮԶ-x骪(CjJId+*Wb $c<s3糍32 ( 1#PawʍC@5J-@βL☔@ qe*2NH }wYȻc?v[WdB`TVp]` !vrt4t¦mVLoeD. UNಢ'I=Xk-z{xb)}L:[Zuap R!mr{8+Ԥ~סDk vRtA䟋/H_tȄ й oxUUS`Ơ5J+2gwwgr=+p &pf]1]aH)Y`fg0hbOH[RB 8LQ:PZ3xy<-‚T` IMЄP!DŽeQES 4U9%xSO|ݽΟ?} +7(!*Sz^A)I`h1Ϲ~: 0;L R/MJaiZj^<YSrJGQ]D7ڦeP:v׸ ֊xQ}4o J&QߧVycohC6tޡhNJ,% SB$a2RJljZgqA m(!ӊh kŎθ7sVg섌R&ԊJ)!`ZAzD :jAꟍt?> C}kWj)pQ(_9k6QuE_ܱ{75w_̙3={G?={vܶ#fO:IZrBb!V" }ϨLt)4Ɣ^"2w&9$6dERb~8T c/2 cSI $ +>#UJdpYb8OmDGi:W8bO3g-Z*UxA$^|E~2Fc:L'5\x?3#M&j-IfA;CWWIf<)AK]Vʵt2'R)W;oɀ 1lXWqLH]AXB?O0Whٚ#Xa;ⳒDdىOL1 _5k̈́hwI]!EO-=({;{ށp&`{$u3^bi-( Op6X1\F\u==қb)R\@]p@#PJ*T(.h4춏Z2O.p'iȸFg\QC k2-*pA t"J >Ͻy+q65"ŻռKd\=.찿7#0yBD$Ջ_4dJOpDP,B#C>g{ȈDh)D53q!>?Z- KYF+8K!#[ H~r9LV{iBP)Yᝠ8V^Tq\ xЕL)(3**+3O?F Ud9IxL]Q:@L &!moqB (% +EPJigG .HCJqAsaʡKcU4B1"'{ހ5SW+bS {h$}9`q~wº b9V][:|Q+9*k#<,kV%:In? U2;1Mu&wX,PBIZ.ܮ6ZM&iamT4>>W0CnW |? #$J7F)iF#8cJ$o@x988 ׷Mؒu@iW+ZOľ`B0'%r#d`m\t:-Ȗ94 xcOUH"*) >sRqiw$]x*ٯ䜫Zbb>}wYKHcZk?=?|49. ?󋵐~tSh?@߃}y[H2R`8K ڶmS2mc Uh*MPv}E˪yJZ)fP~f3鍧Ms|l؈̫1Ys\tw|/a6 ,;bN*I3tYZ8泾k찳!PP/o{M1B|&+`w|rU[VtPyFu>P)֕ug8a9n*;ugNMkGq:H%V˨W\SZ{*\ج,nkD@9 Ikf8{ tgF{ޜ8Ӆ )%p99lðu b]}"-ABŴhKb$0&@C߿W MG1;@BNH_"ũytՐ.'8t:U4vu󶷽-/Ih!Ċl8u~ij0c{Ns{K3 8-@g7wNuq _0͛߹,Dr,/H]m[vwwq.fRJGi\*#B`-GG܍ )h4OV%-0oԯg&β}6{g&rguMFg>qFe!cxvx$G3/A.㑝!Sbda~ީ1ic'sfR}H6SA5Rb9xv'\$buyLrtrԦ3.-NNhF#.]/|β0 -猛Jjic 7n`4E=t<@̿_$Uc뺐ek0]1g+f3fhMOzwh E4u%ayyjx\ٰj1xWwAʄ q&|[6[ Ƀe!"5]RXkVG'~eO? "޷,mSϓ#@s˄ׄV*˕`x=fL1uGGGVU_=˶}x1FGGGh.gMfCnn׹q߾e5@tU_,Y)7Lv :$"N0;4 ԕBIT|Ś*X ΆS( b&bg2EIɨ0XôVu{Tk-Ӟ!M)nz[U[@i}W6Zgzb# r߆a9=Nv2U|Uq; txv j_+Yy\gj>cy%s JYsz IDATf(w{(Lu$=08:>zU"j#{OC<}y#dSWUs*As:h]`wwʷG9$RGuRL?^1`>_C(즐=[_4^y麎Vt_ |?Qj5G)M3UdXteZB4\߿\,p6x衇. FU]ﮪ }$̽a,'֘1ܮuo$.%ϻa]5q519шG}Dy/rt:RfS!R_p(Y}7Z+1 NkpWH+6w~[(?&i)`=J`5mr!Ju6o992Vk `71Dh<@L(6ZFujdv|ݺbwSD\ܼ=:hMt1BH=q~:V3ItqNA̧.w(y"U)%y2rq"oj=bOzcXi]Xg$ VJ*$PIEUńg:q+20j`{cc<Xv-aO>$O?4ͯ2N3&sFmݽ/vjL&\z+N",n x"=9 { =g>N}ymC6Zf$6"5}ۻV"ߏ*ihg'R.X(>oMT{~">/^,rt|f)VG]E߈^WLrdX4KdtIњ9 !o>J!$s|b;F])3WQ*- 9 B?cR둉(ngg')YҢ+?#&d)]uiS ![RHCBAV킪RI< ]O}SrCI]9)>HUid1i$ExPiY=##t+/~ҵ >|G}qS6ܸq+Fh *-ΠDf:O&XY"ja8ɺ[n"g3A%+T5{Gi!rٖ h!x5|Ҥwƶ0}(D1qs% b K@.$Es^噭Ay}c007b7d-߿JXRǟD<_2YW[j2 9rJN@n*Ȕ9<|/S z7<׮q8밦ekPٞ|bN])9BO êOkgxKC~˗֛\oyp f|À2F90@AklO?Hc7zPA {<8) t@g fR ]PUr|ʕ^#kyMM"R\rE:Qä'Dz^x "b@~LTZTZG3rMG){fE:w"C /Y,I[<]bZ񩧞CAx~&cq-[JITL3|(I~ "֕JJ)9::⃿ cxU3>9Ojq}/WcmbX29Ǩ/P[RE؜1Qnt=hT3ɱa:Z͛|\~^i( ;Pc`Ƙ-]זuUUq嗩늪8e]۶Xii0QUiyL*3jv݉A0͜E"d3cw;;;hU3=`>X"(c 0:3)}yk5|^P3֚xiw !`slہg^, v'K'6iHrxuyNWi@4& ]!9]rR17`8z*}\KZO]{ONOsٺJOAg@Z:J:(Բb6[Z,S#-3!OQ^c –9SURw$*b.ҬʺT B5,ZK=Q 2*mSkCmDGy^hoz3'd\ 7]|~||*VsЯVXTzMЭZ__pBb&" Հ8.'5c>0r p¹2&! XgҚ|t|3>-j$hg-àdC-!&LBpoܹ=~?&V+Dh'Q!M/вBʈ "XU!2 O$z=fTɊZQުE!Yܚ9\88M8w5/d8BL8r2BĀ8dR ):q <.J0fV;;>{dZv+? >cT\pwEa'8<>i8$S|G_xOsYˢ,hD)9oo+ Κ3Eq˳G/ 4MU~vߕ+>wMUֲ2By7NM{KvwM]Mfvq9ryD/?9>+?ǞY~7~%>ܺuHdFkf(x]kbPN*6MNǹs6bx}||l6cZ16dwf31{42f;;;(tXXq6DMbݯtc]U3/0">#,O#C:{x)*qR&S>ll+]dN ~>R~blbbVZhoiLSk>BIJG-s6'`py so.IR-뷞Q ~UJSU6 +5wcE: LJw?_kP_V,; *fJu<ӭXx~&+D]8RʤUt˿~DrdA'''Rz&O1#%AH,卉 q x:foíã4#S;NPq\ի|;GUכ7H LR#ރ9訠V~~nh"k̟0=Egz ?!P!vX,|#a2Fժ 67CqMR"(TU%gcrAc H|i,9QՉ-Rr;1?JГGUqMeXVuIPH)#G?,Nrbi(}[~/Gh\V91Ngݞ2XV Y4TC ޗ[Qam^=ɈѸ֊bOOFGm2[MM{?oY렷$>:&ri??Qg@ ZfSdJ:'"%]qoƬK𖺎DE7JyKOx0F1G¥k^$|X -E'9W-,&8TU2JRYq?G1XV=NI;5ץG:Osx|\p_g~k Q/}XsfqL2Bo|;j$M~r$)ŗ^"9 :$+,MF֎}F ;QH hmc mМt]G kzr%;;tݥu!CdZ%f4)~zRR#$9Ŝ S?=}E_;u= qxIӷQG\*H}ٓ֋nCR1c "=d9JXȢ.D#>>Wk=Iq_zЃ[3xJZTT C̯dUyk=:|^z:<1/  HeUoWz Ρ6^ueűȎX콵U7f]!"!gWi"P>VMs4ɑ ":QRƕyA !qʁ^IIom'!1I!^`4Mj'su#)u(Ypw3?RGX^?RDyMt5!e=I)bmC)Z7[4nݎT]gyS *RuolLlW\ga, JvHB!UFdD`k4 D>/H}哓cvwETI&9@KNVP@o#EEk=gZd-K0 UU 2΂i$7L^`mt"+1P-]Ubw8Mߣ5'Rpu2/x1x'c RĵNWV+)>!8/"pDj*1XCgctLJ4n>"DA=ö|I Y=jp}nB҅k15[4-\+NDVu\[EDx)BҮl늺RIc /dL>{(]V!%;F1v5ELUApԢ9I}̣$V Pz%|Ρ[O$K& qynlN+*tK^/W$. ~pCK(M oGF};/HO/EAP5u]6&9=O cYZ77n<1H{5-$|꓿ɸVX78 yI=N@T7`鸢k}RsydlB70i^ǝ;'hʴX]@+h[z3%np2[q?poܡiZ`LmMypA4<[۶m$Is`{||qM1FUTsqqXZK$bSl躎*WH R)j~%k9'WL3ٌbP1Xg7**fZ@vh`e"?rs6L͕ 0eݚ u6dGIH}=bUl/^u{|ΥK8UEՑex֚zT3vX5x5|+G3 CdFZ+W7=a? j \J0Сu8<18c0mpA7djʯe^ng}+7OL^Wr… qyp%ԂXgGfp֢En.U1\~`ޱ;c\3Ϲs'&lv_C)YC~ t;u=8AU5Vx-o2b%BvyNT;Z0Ø%XuH,eYߋ{:b>[3!N$kzPi888( 6wRr"IiF||On -owOUehww7%TT=~!g9K LvC8mca:Y͹-xf~âV>`XB97xW~"!g" |R> BsCd>X'2 !dX?2=.%;=:-(Rhe/D IDATczūܷ/{Mh ֆsʦ%C2ph9``&.YƓ >(p2ݶ;fb~Va]ב71%g!V8CЕf<9wJ)Ǧ&#ҥCM1!c{̎O/vsX?'>΃`A˚lY^TtmjՕd!?3?x<)Iʳ{vl=y!"Kߘ2<]o g@,j=6<3>6S=RJu8r) :8<+sg^gk&w:+_|u}N +39uXo| ޔ}R!%qt~hbߘSԳq{BĞ۷oS骬a?秓!YL ||HK7ǵ}<:>G_;u y?nWr9"$ 8y;s^0=[|p|aq̉#Y=`Bd>!"6Bur/gFL G'b>{]cخy>.7$<5_JGOYTtb)s5LTB% A,R]ך9q Kk[TusKy z{kajyռ-Lv>꯹̃4ME%/5J(=GEVkI:$Z<yӛGbUR Z"mv8(Q)hTl⻶&Ujoߺu<\( QJqy&1J2ЇUv(Z-KY.?,lY;6q]kjX\QEnfh8V n2h$WȐʉ &1oc>ד cm w!,Mozx;p>>DI* r;s9IS2mu׽,=kl)b>/'JCŪvH RcґlYrߥ0<2wAj۞ ,wj H 3-u C⥌,/IgbMD^-D[H-"d,vs)hU4ί5Z~\iZ<Yؓl^g oߤVxmo:fG{l!Zub 2L׬{Cߟ}m>co^>91<7M&3DH)YZ8ݿ[a<u5t{-V0o'x1 }x{On3|Hg-p<3wEHP#{;19Ktv5JZz]1 8qŤ|Ey#0TE:-Cϫu2M@5H.Tc24 U`iJIHjV!Q !ULf%8&G*nQ 1!5R J,ZK38Ec8o/J\Dnk֓}Iڍ g6"aC@H$zfC'ZlM" u 뜣nwzB2pcJ+>gjr9J(< "rS;NXIsA ~?tj:*CYJO{! nmͱT09&%/^L0Ø@JafcN$fR֩\J)e u99 iDnpڵ0x-%/F;-i\c0@<}1V.x1ab7|T{|򓟌sE|W5Ju[0L4ٟ;_s ILP֠d'6P6Q{x g[SY<\F@$B,7nߊ $Uoj*DŽu&ZZ~T Lj# Xz${TDBYX'"u[kyʳ\iV. !~d:¯n3;YmB8 ƗD, r7@'=Ui\=ފ4ÄV|Jh]p: GSV*8F{b0T{6$B}vxF^`x`4 z݅\i3.^:@-%=d4.s Asppj?p!xO=n9< шEQsxFnPZ&VX#[eDZ֐kD7,4 ` eɜ g}V%8y(.U:"i{۟k{G@HgC;::*edd"F !8^PU-ۇ ]W1 tـoTFc0"X);(M=xq? @R&WuRX"3gg7gۨU=񄺎ǝ]M c4_Vc'X #+@B1sty?LJ%[&[ns`nƣ>Amyq[%LbݥFa@dK=m_a߾>ik(&3k/UMb2& FZ+53; /QW Uk#c:\Awne[ow}+tu]S&Bb1?pmޛPgWI=__aB%0!YTX8g6L]D7 UU%.SO>ZƍRS Ck1Fb& t3xk>uHLFy1Qv򌖙U eԵmv몢c ]V~Ys2,Àwۺ2;9fXsϱ\~!6S(4 B ̽s(NgQZ XgبP7!SB6*ڒtt:E%"ָ拤ȢX&zKkY9*E <6X5u{۪*}2GԜk¶ ]SoS ǮUn,j?{w'I^wYYGWU====s p:(xʂx,kwqQWTD\@AKg컻ʬȌ?"3c{=ꊌ+#"}~CR>BEL~ ?L1_̪k&iܾGV#2L4Rv\ 㑧itHJ]{sM9O:M#Fƶِlo(g 9,Ha RC'sy>2=19) rA][8hfOnM;/_9e?yΝirˍpi^딀l:NK hz*h6T*rKͥ5 ,țVyr^t=OĊ ̆r  k4Z2jA_ mlذr{轵)M3; #diطg= s|llioa >{|>K]fM1-<m4  bV/]ٗs-6mk/VkGβ51*]J@L{mvo5K3Kg>}];Vil!CZ \]MfIԥ+φl4j5tPCMb1q3OWQ@}&a׮"JeaZ&j}Q)>i&N<Ɂ#g׮Wfddcrc5J (+}\q6\ea|+.Mmtv^~|[x/j2[֏0E~3ezz469{B!BBPڵ|0"(@܇ i4 rо^R`|LQ]$ps Fcz{:'궲Jqp:&i`ZueBB$0 C[4>E;aOăMpHF S-y|͘}|O~Ƹ[0쓼`(_}%_=lϞc41]| %%Bo!B!DؤuL+RnީSM ذkʸZ6b).ߓ IDAT 0II> 5v\đ<ҳ -8ilyݡ&+v$ߚidurL="heETÍ nӷAa4CHlȣ¶MrMmu$媫´b.߱ v3UX8@bYez{{Q*,Ͻ' ɕy/̫y߿ý/XuPU1L-ɓ+ׄ]v{^M#ZDm. B!]x|a9!/y6^u%jc'cD7>Ķ^_~=N¯15e0&nޏ8-rLO:o~(`(J(}I7wݻy_ifX)͗ì dI!B!DW$\_wXL">2u ^u#>S`zև/p-PrV868q A$4]?pzHiҷ_gy^yN^vM\kx?+v:МbQ Qk#z_5I^#7u눢b"r|vv$a91!B[oj } s=,];6[LM4yK^Ž#̠ji(?^5C qu=pپ:%o!B!D[eū~7p5;g=#z( t#(_1&fќ"|gca|")x9]3i5>''4sP&:Xv("ʛ:vʃu^-0Xrn{~#^F@;c"?FK`Ϋ9&FI1]S^o粸X Xx`:^PlP(8J%vL^)j!DnE牢f3|y'>kI=%m6۶1?Χy|/1W?%̺ !^```f#i??8;wӜ8q}70M[W>)zzQ8qlZ_v>AY?yGh+E;1Y8Ǟ?`YNZ:K?KaHg=wKo!B!D|/hQ ƈwSj1Fky0ʱeĥW( wzuF!(Iehhky)_ÑCShi\'cGǸ;ܧ0XYa\l_,|kTO󍯘5w! vqb>ϡ4G9~=WbMr_hLk_mXN@eðk147G^6SGԉㄢ#G9tHc-Y?=a\Ɨ`,EOۯ*rmۙ}{gjV޺YztI-B!üͿwa;;8U%w?04Ƨ7غ;bŰ9Ogd R-50`1)iSTGL!Q1Z@7u\i*%MS,<3Zts@j/#ѩNIi@=Y'Ppc0UBdm1[dq!_2=ffDqD0x=G> Ɇ&[<3>6 L1u16111Ɇ ַgDE$o'[GC)fggq<;x|27>I43?1B Mϻg_\(x !B! :̿?|gfm٠:a t;f:lXaߴ7spQ? QsF=" &m/ex !B!$$~ijDQ|А/e i?@癛m8J%R 3Hp]]R4Msxabj5B MliBid}T Q:~LǞYY9*1RӴ(lODQDZDix-avڧ`mg<_j$c0nA5o X&|.nNNpC[$ P $B!Bt%IBi 4E$ z P' >fZŐbceS  L3 clLڴt$l4 mI`SCjRyn`ǻ@#5lRAU0b}bҪ jaSͣk&n '5bnnK2e3c(b|ŲX$j0MC7waa?#PSAm[E}!B!w q8NQ*u4Z40&cDCK4zbh#;9rZmyW'&Nѱ =˲гlAD8RQTJbS,|NnrbT:0kx.w^u{R ~0~JҸDϡP(`Z:^bɢB/CQ#|)OP`˖M4>Q!S3LMM0? gj$ sp|tؑEbrJ@"LR`';پs˹qiR&B!b?H SE,Khg~"-IX=mż+~uv4__ObFKSnqos4\u 4]e~?/k+6g=/{_ʖbT]&'xJFܜ:퇋T*e\>ucc|$ClۦjQ3>m$VkF:4A ݢM64\26c9+ ٵZ%MͅB!]c Tc(,LRE*lL@%vLSP+B]MǵhԳҲuńRDC i6ۯO00 J-[ rmW808R+pcT|VԵI684NFضXDz˲XE,ˢP(078y#0(;vnMR [8>Kma̎e9^طQ#az$'ye$,VI$DQ /dB!]J),K2d} t4M\45Φ֟TaץQ.{`p@¶lA E۶lپ rcǎa==*8N)SEX 4+[f5M-)V( .'l$} öC.K)oP.:LL,p1= .2~8G8Fph2qǗ??h*ysTU覃nei+H B!] E( Tr7V6J97a:b-6MR R믻}_]ee}ȥ0lxzFݱu]'Q^[@ð*yfs G'<SNb7L+%N||b,%5Fv^B4}vc9+߄+|9ANLJ9R,ivi6} 6`۠7M4Ô%Iaqn6I J)FF8^5 QըVHLSLa`V #jiZ6Y'n4l谎ɾ}gj=9IP'hՅC|+` A+!,4S'WytiSBAFGG81 4Hq[!BU,(T0#hY=== K]Xd71Iix >暳 GCVB}\$fY7㇉4 ajK8R ~Pk1#<fQAR*UX] I4|JieY*o}r WT2g#4ȡcђ(ZL2d+fjjM38| ^=u-mHtWxyT>֩i.U aB!BtaR)i7|3V+kJ߱adM;Aah+2؆57WJ3.;v3KdWg&J)(3 [lӒ$o',=_OoE,; &&&گQi7{$ qwSJi!EeEQZCU,0 }zN$A@P`ћ}l6bll'O.Qׇyd]qB!+eWgtt^VJh$ ; z$6 dMo]M`||ٲe Q$x݈O}m åA[ԸvzNL]..0 B!]J) R,0 ^կ~4dmq4е^<|AUkVL=9 `7p'ORi5CBB*Z5&*45VEneUu3ᝌR*Qh4"sz6R GwYXX3F>f&#:ĴJV K^qr܊@\\z$B!B,C"c<]R ,eBe6GRCWl>Efv%Jh;oxDžĈ0R tX'rDK360,]xZ l&FjumMN@V7WJG&a`%iBmATA3 UB)TQmOǨ+)4M`*ZiiNib`` }lLuctCo!B!DWe}u=?#ptxX(+qYh&e-Y9x9M4- [n5Բ\cddS'1MH,}vZ ɑ#GQx.g1JWUdn]0 `4lm= 4djjbb=y$!Y&HSYwv0lLTbw%B!KKuTtj#x:J%`XYX)XP4Yn{R(@c:qݦq]706;|;y7Rﱱ1:-+ G]b$h.R݌v #@;+q 1A2*4V]hbN(p58J(J1"L8'$R:)\1Tc9h< 'vB!B.$ 8Ų dž([>'8W]8`RGַijݠ45s&J ~衇xY~T&?k=z4!4jb1z{8bbFu>}> B!+)YO|){/[1bv7^k26x'X˗d[MRnwIDATk>[tAZui9^ޜ=_TGp|_ڤB!Q37@>l+4MW9N}[)?~###;6O>wWwˇZZmQ}!MS(Z*.\~Nk 3v%t˚e;ƹ4\L$" G$-B!8RY$IX^tkF__Mۨ eˆp]ߦi9]6MMN)0$ a288x~/47~*ax&B!K׳-$ѝfVYor+_Bo z QN6|v/\i݇ѣGlJ)Tu+5Yw=[_n?N{קd5㡫'.=x !B!:dN@l֊qc6}}E8K_RzwɯʯpW:$\޵zw3>zlik=:t\w~fc|gnib#}B!];Mκ?{-|fnpuB.СCfhhV++yms]w155mۄax<&ky*a?u(5wWOOOJ7!BҤ^lK"ՄB!]irj5f<m?PV'O$ <# 8}f\$*i?dJln,6)XnFth*bI'WPx*i˃oi~~i'B!XF?& kA2B!B.غu+V 2ӄaٸqjLӧ:E*r|>B!B󘜜ĉlܸ\.Çω'p4MϘa^z=R+{ZTz{޳k ?zρge44Oפ\?B!Bl\.S,HSg9|a8Z ضm|:tY{)X䢍YZ in{y^[zX=ISs!B!DZY߳ -}nzŭڿւػw)SF@\D"kRI9s)qqSғw)ꨤ ɲqjv`U7F+R'o!B!yGСC|f||˲h4}x:t8<x*YeR|3[c@ +ȧk:~6&;;xw°R>c:9<ↈ`?_17 z."#B-':ii'gO!Bq^Š5Z\ѣ\}'~κu똝0N h'{NBCJ; 죿AႽ2XZ 2'@o/o1㔟cf?ICxK(uK3; MxV'B!8ݻٰam}GB0Ŷ"J0S+0׻" Ƨ?u[o6u!_91x9.3z|譼b _u=9y:v?ۻ/aXnw!B!s¹%~ ҷdgw?+_7w?y~mK\WB!⻄$˄xvHo!B![!B!$B!B!. B!B Ho!B![!B!$B!B!. B!B Ho!B![!B!3=O~bB!Bts1C!B!x^Z3ݏ򜗦^6Ioμ)g^Y_yڳ_ڙ%v:ѴϠe3-{V{ct?϶y~Rٮ3wi~>{O?[ŲU_:ө.-~a>kon>fĞ'. !B!'=}Z !B!К8/~!B!=|عs3ގ3kf!B!<ƙh B!B#B!Bgv],gB!BqI-B!B\@kV5B!B,G_!Zhvr~jmf\ro=Hs;xM/?I-B!bpal+ ݻ{8>{6\͵WNN(t׍{UZ0s`^SVx_ڳ@o!B!ݞE} ??x5=ȯ}<{r^{ 4~lwM߽B!BqVqHY+B!BHy>RرY`70^ZB٫2g_sCLq!;,VۀW}ïKYA-]>DŲ2łyىdj=XcA)H&gU5RGHϜRIONj##8kU~AONZՙ a}fm]5O6d8zkdJjtsz__@LPҲEQl>OeyƦan;?\9_;qC@[^7JẙK>Jܲ8qm߂&n0D֚f]5xDzD?O nu"X0/#sqX쬪>Ze&ˬ~ڿqs 26Ӛ |g#E_.$t:J!چ끁zIݾ7날oLL.EͫZ..z؄7>!"F;q0a˶xtCC//y} cfot$^~ >jPƥZWs_t"'bԊ""u8ycF44x׳޹ CMMl 8)繙v;-{ʋ*!UzQl'/W f{I%=N.`vyr`6Ģq,gz4oM?<<'O&b|/?l F%\?4W"ww㻽?C|B_Iy""2ܲJ9fC2e%+zv󋝱!Ώe~w*KD2,˲ 9/2"ZͫZYZ-G 1GE&ʝ ,P|z GY29L=:uI:MEnzJC|<{qHdn'"yQE~xQ|,q܎_?1091 R<ؚ:lvgYVũԼZͫU2J*R.j8^=Ւ(IrRB*j啝yyB{Rc 7m Q]ګ%'RS%%`+atV%'E)9sի($Oy>PCCww~(B營$I=e.*s:33ijf:.~z]nW옕#fDz/%J47\( ~^_I!IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/txdrm_options.png0000664000175000017500000003143013203343610023620 0ustar jomajomaPNG  IHDRNHsBITOtEXtSoftwaremate-screenshotȖJ IDATxw\Gǟ;;@@i h@)*( *vl5b|5&kD%j5أذ0v%5jP~vf?voYND~3L}~WPNs㮞2եd$ǞצqՉTJyٱj%'/SX"8Ԗߪko@u`o^N>AFNr#Ufc-oz /;'^m/Z snwjD*; j]aS0ẸÍ4*ք2R!FoD*7ֹ֖F(Һ]qe(%RVwp`2_@( a2눈RL7K01c̺D*5R1cG %@;~#RZcQy|#;c_͡FuN""ϟϝK5[;gW/ #Ξ9h >|RFa?wi,w@XW.0& SO5?SݣVX5| F捛G''G]^ݗ^?y/gϝ *r /_rΝ;3g /_TTK,aeYSR ,:"c{ -5m"᥵Mb:q:*VYYY!kkq ꖖ BAQ\أ쟇vntg*w?[i}ktBݻ׷/%͛ KMrJJy s]jD Ѿ _%b:S(]úm}:;I8ܟ1=|Kd9ĠVrGvv=!nck/uglmlڦetJRf/b}&Ofӎ ꜜȎ=/,W7n_?}g.Dv앜̍@` W^'ŝ>>lsڅ c3XXX(J:":  =736k0)7Zפ{=̤:SX*K6@ܢU_Sʏ?lݿOپ+F?NDT'!n?ڰc0%cHXa ׬?yvئ97"Tpبp~E{KR:pRQ/f5RB 6ڻeB I|SsDJ # `JE)-{C$)u~"?FSLjZ~>*+'\';7˘Y<2H SJ{y>AUA'R:YU,V՜})80T8򈏣dfr*5׺KI`.9;LJ&#"(F#L=GD$#"RD) 爈sDDJ` 09hRT*oU˗&9yyR mY!yܼ|LVGR%i{h$Ljn!b&- 6'%|XML@BRb.u0L|H~+B˛eh=Gq  :m8 l&Ί655%{#7[,$_ @VgS4ERNhaE0毆*DNrхHhLA0ϭ2KDJ" 's|B((W  ( !o'.`׀k"K%R sX۴=06 DQy@8nPlFJA0UE  EZp\< PzdY9yZ^BKa8)tx+7rhϔ;$ wkJQ6' !(Rxg"!ڦ9 fs Es0#yB(`{. (֝ۊ^ `A{ps۶xxylڸqà—:.Om51#Lz{i /\jB̞mlm܃H[ѻZt5ޥRbFoT~u blyfW\%s%aA=[ 1A k=}'1P 4]BeamcxNrrr-YbɊJIaeK.aSܾ1B͙دiWX%,3vQٹ}_f-B~@.j]#D0S4AXw_ab԰O|ri7o{ʹl:eHP}ϞwT룚]#ھkjo阋_w (6l`@hEz7邎y7S'\\=>}k7oܸqaBKJLhܥ;4h`B^t9Kxff#W.^^dsr:|$"kM&uٓa:wawx"MY,B.?}L.C憆lݞmKLX0G:+JrnmmyRSLX٥c'XvO/%+9&d{ }l#[mqH\H`\.GDMYiS|YX2xƨ !mѽc*cB/ukĿhZec'})7o z \0-˗Ms(Ry`ARimJc[MqJ 6_trj!Y6m2Tbk1 m֊6Pi,_bkHf:|Ȗ7H9RƜJQ_e`LD-S/D20&e`DD-SQˠ| LsePNQrW@D-B20mD-B20mD-B20mD-B20mI`Ϯ?N^l7.]4lP^"j!jOݰUP5gOX뛶2V=9/tj!ܲu!C2qF%20 kkݰGמ޼ڜ8~͐0\sL ȰA-䔔1 kڦyZ7oc]~?MY̙528a##f_yTO gdݸֽc׬\{[wћ)>Yw=OZc9 DZoBV{yy{ƍ; rhSl2k;>>E[Ҽe/_823E;~̥k#" & Z0oA9ff-чe`7wn޸ԮwCo**Q|^<|zta<=6l2d)>!?5Qfv)ߵi޶ePz3aϟ*M6ʥePϭo@FzƝwbqۭo6-ֶ{wUOa#FM!yeeg 0!5^xy%TA &ۜ~6ڴo֨Eƭ*>۷8zb9jq㻏 Riψ^ [ | g䢥 e0>bc]j!!fŒ_ULd BL㦁/xǑQaB{:o[&ePׯl$#=#//os&۵}7=rw^gN:o}[]?Pmmh*V:r5+0~A;Ƙ0[n߶ͣV~#Z4~R2a!2e7:t+GV=8h?%&&]{$.V&7|uy` Ϝ:$f|`7 "ɹ[mOٖeP~q |333?rk}{4ohfV|ʛT$έ=nj-I%܄Vo1f65zܗC?3K{w /Vj.zmhXMigb0>~p(qh44E\M bd32(!665kȱ;5kjkkg  9B}SgNmƕ:6\`yZ=wltg?Lh1M«W=}n΍%j 2(>NNNݣ7l-[\kV^lٺ]R[!6_#;`7!> ٫Pz{{@h9"+Mד̷Doi9,yδf˞Rܿ'a@`}%+DA ˝㜉&W3n9ׯv6o\ӷvڻ;O/Ɓl~}$ 71v،fGfg'J}pƩ;wܼ=Mr/f~7MsyI'?kZy29EQW.ru[W! J Qˠ9J"wh~m䀚ePZM"Gѳ '2̀Qˠ L/D20&L+QZVD}!1 aZD2(D"jQ#  e`ZD2YC PEDʑ0TBD-c"jzD}!1 D-#"jZ僨e`ڞCD-rZ"ji#ji#ji#j8{쥋OWS/^6 vH2,: j#jObp˗FS̚^Ut:6'MU#ccvWhM,#ԙ3Ax5]oulbM6Aݿw[xdO'Uk5h^w9¢͙دiWXI[4!e 8eRpΆ"+U*ss3hU܅ڶh*zfVeԩ.j<)L ѡ5jhbDСmڏՇeC---ݻ+_MRSR EH 5a@VVwIDAT];vkݼ SY*#7iܰxkiҺݺVZ*4 ^N>zamw5]/]f>d4ml93._F|9aCٵc7Ё؛7p\Z2Snn>GQK~]WΝ BH",--{WT`:iZúvxeO.ea{W AHC0˜AXF4⤲0 ! L͛7:ul?~7ĘjW/q91*>\]Dyˉ0f WF e@h5 bu9{ӴLڱ޾D!%Xo)1>/^daiakk6䭻sxBhE2 hZ6mM _jѪv%`E_oKaa`|un."W*U_u=++tUbcB,O=t{H¢.y ͫUÍ ^5`3fd`֜1СC#G?~ĉߩ4Lō0>o%i#uXWbs32n\{FwT.OBC?֦Cg4ku F*Ԁs[wdNHimڰmWbnh̹l.6lrXxyo{&A_d/]Q<|Do7 SN{׮]ſThn!q7f nT1r֝GO]0GV?|T*k~{K=~]q-(uUˀq'RRjA7 !t}{o۽/uQHX[duڕ1 !`Fד~7/-\6cO|N]RS-[K&&&}t';;[xd]̘gn:yotv E"fϛxԘC޽sϤO_8W_;cv>~!//Og2пj"񻹹ݸq㭦((1LM@/g-;s"\]]}3C/_(} 8))@SbbbѥeNuZwduSZ!~7G`Ź s/'xz{ty}3eж?ڍ3n;dKx દ(y1G'}@.MZeqo։zw`]аJPɻj<::준 ҹAj FXВm{6ooPϧ޿7\ށFחyyy`gϛ3=k~_-:"9i4A-+f͚O>e?y5) sYrkGo[t^V[#NAP˦HMKKOO߿@A#B0&adffT*Wuam*UJ،Dwp7rtZ,ZSx=qNNH>mcnONJ}SI@'O\t)%%eΝ{.)7h6pB!|)W3n9ׯ|S[.d릭j?/f6>Q*HmD}>'SCZ=z? :0>Lp]c̟[fi7o}f-b>yjF}=­G%L0BH=3ӥffMo&O7zaΟGdR\ޱS%trrr <~8S<}>w P$)rs.߽jo`miE4MWuQbYe,pj߬ y+8(ĂXIOz~9G&ͫ.Ѵ&rSZ.iGҿsr9zp-Jӆ^&R ilE]QkHyb7Bb*7m\Vu+S9kH Iʜ'//oMzb:6&v1#G`Ӈ>x ٠a=͘emsgm .ydtT~t ze;;~STRtߏ="4lHAAZ@5*Qpi.qqs}ɩGƏԬE3Q*]Ɓ;?]^KWJL&}*}Zm~:~"3d  :{l-<~X`(Dơ)"񸉟)̯XdØGARg9SSR׮\c k\zWsg>oZRbZh=veFM6YwcwG?q[4筿mv333`j{+G\\\^J7ΫĤZ.. u)G'G^u/8¼J[Ldzf(%+ ߠ7s*n w K_ҋt@b+HOOK+IS&vx̬ͬ~y_J0bZqR]v/EdDFջ?"5cX\.Kb1HW:?Pr}'}{w]<Hppt;eشucCԳGCV_9˗433U˹"={|鰐a [N}jhVuY>u4-;whو_QD,0j5~|LrϜR3nt{[iՠAz޵'d΁UZNY4@O+rS9!dʵJr{_:w_οS;F%i]]>?we}/[$HjZLKtzwT"E:D;T?ZfbR)pE cT߭?b1˰bXBq,˰&Pv 5'T8BQps BbTpr5)TrRrGD"߶Ba)(JpYsbZ, ( ?!!rLZɰLi1,ȮZ !a !qBŨ/::mZK'UwQ(#T]pV7~pCe]cedgnM nMgJdhkB*st 0~_~ު56&ַe{aj+wnޤepv>g7zO+Zw50khڲo._'sgϪT*a7 PIr:zfէ_#3H,ϟ~IcgL֍[NNh;rhw5ÒW._m[o߸GF=~vkWkl)H?@eT9=30aB|c2XܽD"է׈Q7oaC$ɦ~^xe=e$%%c+7OQG}'g&M=D?ؘ̬SD4j"`?(eTzf 7V1}cĸ:9;igkӮMT}(mݪi4.&WW݉ͼGΜ?EQ榦bKn 8dС`~?*wS!ʫ]v Ysgsss#F3gб#ܾ텽& 1;;;>rƭ_yWzgiWnR!f|"^VGر}/?w.{}{b6ś/YѫOOHԨq#ToPY[X%=}qIOm6ӸᣆiϜf͛ ڧM[W_ēmg@g}!w5|4!- <ޝ(⟔<42(c9.5#97G27tq!jC"]-^**wQBP!$0 B7Q S {CQ-iZ]*,PJbfU*Q1TF@ͨ4-%frsD;B6lPM+]@B!@QEh*Yt)_/!LS,[|~eu&xռnt&M}9:M.UBԌZ*#2Tf*3퀩|IEEf ā(l4mW5+^XX=Gf4^OWp)JYP" Ce8±)*cR@{ ))H~" _I6*êצP4MY:Knb՜Y_I5qoN6+N84"}:jN"M2FH-ީLԯV-gsEwËu_JrͪrE+ZQm}+$ˇ›g:Ej*Yڷg_nN=F8ѕ ˰*F-%ǁiJ 5'ɯRnEݴ,lZjZ`nbߧ~\? 2,˲R)\vAn*eJL|Y\OygNޥ8mKRkSEoZC?[l  !DGGY7J/Rte(|h[o^@Q+^VtRyyyǏG4lxxJqܲ(g kf)U?GGEۺD=`=W/_]~!V^ 8R,TE"mRa{Xc~2Yψ6Cѿ)+skѹ{Cw9⥔Vy62+cFnb<`pGqEX:x@HtT+jv*~w/puѓ 2Qς9993!w.\K.ӿ}~/Z#W+6͟GMޡMvƎ ݢ{t/04x˄[ةۯ[~k6tرol 44}rlWxR}t?he>m7{5ð>2ݾmG=ڷzZcׯ{~ݺᘴ ey9 a p<_2 /f3VX50U3N53OԔPX`a8ѝB?ɖ~hHXIGvnѣǞ>yz칧O=z,;'[wsw4Bw>cz :sde+ؽG9}-Zвu-~Yriu7jhwnߝ>y?Ϥx6\ڋ.M0dGW/_At̶]oPNlcE۝8AQ nus"O>q"_ѯ׀nA]WeN?e 2I 7\+~1egK$aW._m[b#F:"eQч+B;wH)))\:P(Κv庯#V&&^M]־C;Qi %%W%d2m~-1ĖP ]a048 DǴjĴyڲ]}=1]wMKKaڮzwJu0(|v| Tڢe/^ulGizq7l)ew =/(((=Rs޹ۯ`Xŋ*•ޗ|?%kٶBbTڔX XxҽQ!Ba/=˔LL=/|ApڣɿO7jڕf}vUUU ͛ dd8YcR3 K,αdX仫_[0W$9񿊌,DzK<24M3 #JRZ}V$D4ӕ_le6mwDDY VmoRWSDzH$R4-U*ǖ\OgYq>>— "8cYb{kiv66֥ R}MUҲ,sŒ3*FżH$ڭ[NT>{o.wc7m8NR_G[ުWB^~]2!?h`$Js@RwrcJ:8?z;ww 1WdESn=[c9BS8BDZ:33m6<2ش4~ZNIIUUmrD"f9s#φG=K\S9*[kWɯjuZf+DۚfdWuؾ_}B|?2tpP#Y`k/צcWoS09CN]+m~V_EQT{v/^ߡM}_3 ڷ~͆{ 2]+_ΩȊ'RqBD D~fpMmhf̓L=GOy2jȜ4mG;|4#Qbuٵt5)1DYJubċe.R{^&RPi󆆍VuEP䧼N`k1C9}M3D9qokTQ(4#e떚{ I.7e&Ri. Wo4T'͗<ڲMyk9`#epDݴn{ W 5LnuSRbw3/ܤ- U7 E~bKLV/;7w-_7S""kkt:+7{w߾s{qomJ)ѣGJJJxx rssIII֭ӧfeem޼ƍ7v،{LUV:T1l3}&??άv?w监rcǎ>>>RY"##'NH`mm^lfI&|>4L߾Yjò^:zʯgIIN1iDi+dɒ9u:;;;;;߼yիWVVV/^ҥK?ӑ#G޼y̵tƍV_uoߜ=1#h1سq֭\jem584B:OmX⒒ZjUf!C}O>}/_^zxw9^K믿V^imm]...YYYV\\W_/Zt}N>ݺu뷮[ՙPtaccbo\ۮmvv6嗫s*USL9p=zشi˲7o 3gB>|haaٳgL0"aw6y;9;=~hݪuQ鏍}e޽vOwvvo{yyիcoooee5aJrJwww++q׮]`mma[[vegg_~]{Ak >)_eocߨktyVM>'*n ?npVg74J 7ouwFIDATf}#Jn"/a "3|($TbZ,71{,+7Er3GU cTb\nb*e\SCe"1r4+e|U EQZ,8!,`3CGY5>@x !F= ;M*qg#caqQ>;N n|tgqUpp>+WE6>~(n+W(n+W}6JۼU&Q-ԩSҪoTJV/_¿}MZ9_1v Iw}6o9,dW ##q}[kq_ܽsWvL !3gtvv̌SNJJ ?˗ٳkOJ~ǏڿRTTεjj֬VJx?wwwqΘrWn^㲳s_=w񟍛4nrVfO6[X\z3LH$]w8zBT}_C?uV~x,BJKK{iƍtݵkWNrrrS={УG8~8KMMMHHxO?4rHmV%ZėGwtŚu%I>Fye.m[.@Pԛ6o`.f?ζ4H$RԣcpHIN֣333MLL,,,h'9::~weV@"5ڵkCuҥf͚i,\pɣG5fdd 4';;D Øo?*1nNEQi&*><{lqn_3/~\327/!gss֫;nؓ6ߧS@GJu]8~k@SSS%y{{oذ!?h-[ڵҥKW*;v}'ENN:vXxxx&Mso^z{\5h100pƌB$-u~оyW+03TUzvԭw9ne]F #928x'L88t ?4`rK677?wƍ###5kOںuѣ/[y󦓓T^R_<:u*:ujڴiRU&ig~qJJʓ'Oo~m&èDKٴIdW{ wf =}ɳ5Ĥvڃ x~ZZz)]>|^zQPsݺu[xvJV#""/xTjnnwz}}iZ~<<<ݻ]\j}2$x֌_īc;_B=||6m[;3TU海[);殮@BBèGÆ f:8dM}dGqVd>CBBo#((rþЧOK6}n޼ٶm[ž>?s5o64dXk[6m]~gO';4ig ZxMePoڼA={"O}w`-'<{3 5ӸJZfw۷EӦMƌ;Պ+JhѢ3g\xQO׮]{ڵk?VoV&D"{{{{{{QF͟?gϞz|o=+49iҴ*V 43n|FٟD{K[cϐSU>6/rpgcaqǕ"}62w~8쳑1ϸaA}_7>VB\K@@ȸ Vx d6[Y!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 B+ Ç 3/NQOd;5w]hffVBx.]Ի{A;u !d]S=y AAQ]:] 널Q+ զݷW=z3fM?~$'UX-W5՗_}`ffvҙ*BFߧBH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*&.6[cz TcT.TAB5vXZ=BEOTx dYBP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$P}9mw?w |EU !V{?{^<!qZ!dĊB9[W._߱ 널Q+ T޵[`#Ow޵ 널Q+U:YyyyR!֊QFNN b*+vK=//GUUmZ!B_>cjuBP=狐 C0T C0T C0T C0T C0T C0T C0T C0T C0T C0T CR}k Qjʅ*8(@@B\K"VkBf[e2z,`!a !a !a !a !a !a !a !a !a !a !a !a !aXQ -SM[Nc;#B<8Svfai9ϫNb?a|Wsf6hX*+M?\{WUmJ'Y]{_(T~#/7wPOWPuBȈjo- P̀S!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 B?Kq1D=1*P ?T%bcVuP)IozCe4TpNUWIlmm((eB^^MNNaYv737{L.(J@ --IRS(H)JT曘YFVXUy"w¹ggg 5|X,T Tyy [[;yy66ֶ66Qlmm_~mmm@瑖VbD%%q,cb"UU *Ȥb+Cl$JGV6DDsd,*ʜWz8^DѮ.V]uqweiiRv6Vn\stKe9V_֭+p9Y=H$V99nueg%ʖHԔ˗M{VUM>>'#cT^M&пc~~^⋄Q \\"[D,dgݾ}y Z$`^gg*9J`HAjIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/txwidget1.png0000664000175000017500000121045713203343610022640 0ustar jomajomaPNG  IHDR[sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|TU߽2HcAD,]Zk_u]]]; vEj vy3&32s;73\L?Fմ]!B!h%KWho!fuh_óukpQ6"~k޳Qջvܿ9uҴwZw^_MTXChBZJ7,Ysx[ix:NZU5-Fȟ&5RxC3A~Yx&PMnM1AyPk:NW8ob=<(B5r@}5m/:Ba~II u&eA"x<.U^!B!DVZ#ɓ&ѪU:ecY6mn\.Ka^':CsR˥3~ڵĶk'?Hz*'a֫s1Jl leh]ߓ|.A^ZZ$IM~C0 QJ9ɐ$.EFF:>uD .VV0<0?~e`GB_&<\wZTJVVVsNyT9 â>鯷;''裸$PiIK1cr2qXqŎƸGcY6/Y뉿H pU +8nD>pIc(fI<)eli{)'774MNlD `9Ss[WX "+ه,}r:'vHfHGo6yP(l߷7e Џ.^x! !dA辂*cKJ|ͷ6Ç70zrRS+- > ~dfŲU4mv uR: Ӵw]lݺ?iXkzݲB! l,ӦCV eŷ|z!m&+9s(gpVV{B!خSW>[aKtEiŤ~l`o5;oƢ |?LY^~iXNw-x:x %%ɬPa2bVbAZٻd?JAΞ$'cۊ?=8BFΘQ#ؼ%>8e%$%|mY|>2b;v"+We ,\[n~Cr?ooPJ&@0>;!fdn ô!z۶_!B!8LhhضErRLKTl4 2IJLĶmP`IIID"*u*X"1^mYaP tr$y{!gvMb1AZ vi!Ƕ6y˥ѥ+ס.Ǫ]уnZEŴi݊v3((,rC8?}4N=e:3O叿 7}fN^k~Eyy9Æ G ؟|ER1&%zyݬKݳGcon^4zFIi $&:s^KJk, F2d0W^>M& !Bq8PZ4 Ո4eVԺϸqc⽨W|XiFV:}X=Nʈ'vQ}R =g|Ņ3.,)h`:SqcYiӳ;p8z0 |wMNrl޲6[q/GB.|_[0LzAQQ ;w>gt>#Vt%}U+>8+gg*4M#,zs:d |2ۊd' ݹ+tFٵ;]׫7L>}zsUgD"d7}5e!B!OK Pi:'GE !$PMs c#0!q_k9|C G?WZZ7&!p3۷W7or u>_kPy3}ql gzjk ǷPZ Pr?<,XAqe`B|^w su}{1KIOT!BÅR6ѩyʫjNii)JGuKLghL ޓiVtMGCC]Xbƶ^M&XǏf/BGs˸w2}SYu0z9SIO`Ϟ<o.(x=^l[Ѯ]{%%%ΰ];wrϡQXK:%:.][hݦ2 Ͻ0HĨFlF]ص;MDV? Dg՚/7=4tTon+Wao3}q᧬\DQeթc,t$B!ArGR˲4]qjIeU$n\ܺ Z=εKaU56MVx<47hƏQ^^8 ?=z 0-oz#Kwxٹs;$E [><-^RF:20L v.|Lq3L6-yea,F5RlwIIMx\*]ep$_|[(l8]^Jٿ|B!BG)p\zqz/u W kvzAKٶ5$teQ ?&8ض{5 4ٸa#D?.32PZ=Btfݟv9zJXv ˰INIŒkK$b8I4&11vӳgOڴiݳ͛7K PB= 6"nN},B!-raE53Zq R'/ұ-͛px׈dޮTe/ ScJ4I!KBלѝ1hRv+PJSֿB!BT  C0LZ^4KUi+E$ƲYY9%e,v܅m$h^p81+0EbXXDI*a_>iƒRׁB!B!(xz^ $ LrJ hR6Pry}xxYy[[)  JRr>ϹD"S\\vE{H_0 0=eL6HmJmͦEA?+d .#tMrRKR!B!hNq0 LĎNj*D{5}l/(\өǹ9.WIlkkauzt]C]x<0ˍCw(Hc/S^˹e2NAb2:zx'PƲlPdRIJB!%lvjўnB!B#+B!ٸVsC!B!̙'܍B!B%IB!Bf#IB!Bf#IB!Bf#IB!BfsP75W\ ey2ӧ` ݌+pus7C!B!iRRӭ#}L4Y`n>ma3q$ƙ͒KoϞ=\l[ֽۡj9s|U֏Z |WiqJ)y݌5QCps()) !B!y|UiT7p v9/!| WZx1V~%]emcs{D[',^9}.)l޴ԔnB!:w5+pU=xC7x< ]yg{ܥ33s%OOqѓ5t t:K>_];a NeYL|?nm۸K;|b_,]'0nF Ͻ@qQ1\p)N S(((8Z}Œ'3c5af 8eL1'r jJJJz=$%'rݧw}cxmmqW1n ?__2m۶ǟ;?OB!B%MQ?jBau߭Og{oSϱa:vHl9f$}=[leeaW+װw^:vgK>%rqa'|2N=T5ҷ_^ko}y|n݊ϗ/OߧUV8cUUNݳ}/Ͽ.Y@iI ޘWeP8Dnn._YʂھO?1‹ϿD02y֫|f)<9w`{oOXnϾ4V-aQ\{ C$B!PROXj KW-Kε[RN>se} $0vX +,֭s8ܳعc{sץKgzIv6ΚUk(,}xX-fs/iav]k=D?];}/11ٯwϗq3ǢsYӦm4M#!!!-##4< }(^i\.f]egw$B!8p4,+pHۿwfUzKWXAkra+(j,S$$D"ݓy+pgӏ2hPYy~Uڹ}bicǍe츱\zᯘ|lۮVC$B!z^JKJ?qs_{ݻsطoAՁ=?_vl߁a|܋\ur9sPJMYFкM+).*& aYV|̶t҅Wf91vԴT.w85c#oXl9, K0/5"yX^fA^){k6۲a6EEx7w0b⤉R\Tڵ}7iӶ ۷;?OB!B!){x}\< 6og_@ dࠁ<5 7]ξz|xMة#]r!ӧU񺛹ޣ;y:۱O_]t:#8ҡC{NIMMe/ӦmF7U0_#GpwvlXܽ{ILLbډ83pl޴N=`(E\3Na ?]G:C4N8C$B!ihƏQsyqxMߏ /ҬbݔzM|<zj!B!3O> B!B!)B!BѲHOB!Bf%IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bfn`9|]FsPx<^v$9B!s?~ As_4$@~a._In0t2)IhhݬP!{WȁiB!h#UfFr sZd}-pLg~3ϤMz[gr]Jb*[V_2cF+=B!BIi("{aY֡h!rh֖M`ݖu mhMڤO#9lN!BqkTRZ\Z)3}#ɟ|uȔصw__M؝C&P(ud&hзk^[0>nB!]-XuCz #5˶ GNyg޴NobRRQn2J)RR1a{k:wCS!B!c.[wT8{:"5)P$t*ZJصwa-na};wٻз[nB!t հt_q#ŰM,X#h2;ºئ,AkmsXܭ~ysF!Bq\F$ea#"SM} 0vEB!9IiXy@cW^=W_y5C 嗗ĎH9s'BqinBh(n;H%8WT mBGmc7SB-{;#?| ]oxbQzYnz' IDATib6^}GbbAiGco@)e;M6 PMN<,v&%%O?lD??T*ΝB!p\kV-R>,>\/<c?^ktΈZ}m{ )[li/3~i3OG)9g#wx~G3 ǓO[c={v^禿7߅m[,t1O~6'Na2E4/ ;mL4Vb˗.c'_Wk{(*[y(.Ho71'kBΞx9MP tJ޽زy+#G9=/pR##}0L@cdgoxC۶(+-e 13Ҙ3%u8y)~cuW_۹q㏜wѹ|]~}/</]m[ضEV;!B!~Id@)9o[RR\ӧ0_c6+$bBa}'2V(xx#l]~m^E_X[ ^Md8~iU0vdT{xu-EE\ ЩCmB!B ď%zɖ#ZtzؿҾx B!Bq\Б92zϠ#^!B!DD:Zf/[SUIJIp%)B!r]$ TIΎ4H9GBb-B!ϝїi*~M긔"vtG9<A!B-tkm`n'H;s?~ BQ'CVf'wH?#DҨ s&5²n!U*=bϟB!DKU(ݹXSFCیn-F:(CMΝB!OKu2RZO&U;VI#S!1TÅihZt9Ԕ  ,gݖ؝ È4k[</Ym;@!Z(MyHKIY;FEp6beń"ڨo)i$&$JDb*YrR|u7Zr&%ѹϠs| x˭7_wp˭7ooIFBG=Te&FTگWPJaDXuCz #5˶ G5Mr^{:-_o\о#T!p ƴ,7Ѷ ^]\G_2[[)\Lvxoe;s tKDtR7--: ]s>`Wx%PMyOΊž?ü9'yaMo|~)݇KvncPG!l1r#Ǔxe7nc\"F tԡx((+`+ߏ m Mrض"9%Jlݶ;o+MH.cĴjCly+BD-=?֙m٪QbZq쭯C,RR EBc9Io݁][ۭI!D䅎lF)IM[`q}ahtfJaQt.R-{2ymϿ-9tFsV.4߂7w<ʎ^f)kCb'Qu~Q\o}|M ӏǣ輮/rJXEټȮU(3DަͻK0S-ĉX}'zu͏ק"B,]{sٝ[,mҫwO\zϠB!| D,Žj JhծJ%WXgi:q3(9 xx~!I>5PЬ <4 b5M XɱR<$p*s}mIIiYl-%uKMJoAƢ-=4uXZ|!I|Y5(-4ڮÈY6 _.$eiBGC+╅Ŭqi4̃ǭQtpN&x5ӏNzT/?يx=xī p9`XIРՈV O`u!G9_Mj7}69ۆ0LiѢ6<ݑ+ ٓ8~xD -=w޷n]O4 7^#JaOP{({"3~Cm w2]k"ƏiD" 0 "ia . O+iii(D"eY(N6n+!Att+:=4V|mm۶`۶mt%e]ƣfj?7B LI]5^|9nF<ӛnطm_>UsSZ,]-Ύm iMϞ=-KAA}ܹ͛3My$wUjD+ǶTC8o q$ό@s:GUT]q5~ŗ;)((]v/6r.074Ci.f!G<!ϛπ%?~?g(b^d?Q1#{.R\9D?6ɶ{ss鐙\o׿OgfΪEh,:Mv0{")fnK`+iUϲ)))! {JMӌcǎqxH$itڕT B]%^lb $zQ*^^9^=x8ՆGs.gɲ8p ۷o'--_(:s/"t ~; lnv p,^tVkvKY5.⋕̺wΗ8J1d.>c<#$$&:}*x^VXͬK~埒^1$՗_㱇R-/QBѼ6mSTf9$9%?3`YI$HJ&{f "$'/߄x{v3ij*_ut7GE?[iҾf(xaGѫ%(5spmkM6'ߕuWao0$ybFsezolߑ x;c2{hxT9cWfj1*C|7`&eAl3  {nxfo_^ן@ @>}@(zXWj鵌FնnUyc&O\-1_p51e#=-\]eZ .:ݑvc۱{Nqsv`l$-VXʈʮ7^k=.-+Ų,ZjR: B>/I΀ԡK. WV6[u.r٫=p8̇}ĬyGPR\̅?OreWs˟=9{(+-=5 ˴xG(-.3 !h^M$PyŊ6)0ڢ22ʿ{ /o|<Óy /]G}H PN~ӣ_vOE}򊻕fL4"]qL>YzkIsJvOi}V\I B\p~NK/_1Mw{ݬZ˗m6rssٰa ]~=˗/gڵxJ Q{, ĴMLۊ{4mK!Mz'^L,fq3M!b´sZҵ ~;GrM7;g7 gNRR#GuzwO{ͬO2r(^~e&3?ŋC擅Ykg}7p{e5tҙ^z;T}sJcU.3ry9gXrk[?{&Gu&zWչ''I1Aa:G6]^{λI؀mA( Pi$hr:3=ݓ%fB!:Tw1ܥPݾcٿ[Tu?*o =Uy;}Mkb?,fn`aCs n G[>!JjRYH5I[NN ظ?&5h{L"Ƨn(yBUL)M1زu+ fԑ4TN\ƌ Lח8ėȤK_)_ 'q*@pJI')Ͳk.I̜7pU軃 ::ӨPu.]گO)@uu5 Iee.[eF>p8qb>ڳo.͛a|~c;Rhk0s!1svoy9Fiں ͬs F9 ּs|jnm,[~!+V.g\yUyٛw\~6n߿}ÖKA09Tس=_{׷N.㦛oud\q|eYDJœp~g'5U+-B;>r<.~Ms"H 3e}C{7zݝ,#iAf Uމiyipᕗq?_g}lD*s+tu 7s"ڎ۔UYĠ5 h=.-mq|M0@ֈ/\='^^G9-zc'~_B׾wT6nw9JZ8NP8Wi:.x|w$bC;'ZBt0dYR]]]̚5_y}k)r: ~` CGR`Ac۹GP ݧ4e]~iACCH=`3fΠ6‘Az[&:;:~8>C=?ϱ`)3}'&~X> XP(S<r?~ph4:)Bǫh( BUfo\}5_vul2Ԅ%!H)PԋsU5|_rk[;7s C]{'>1ŲSK [e(5SK{šեա!ٙ"ՙh:^i* &֚C'eSW~g: ,Kf!7ͅ%5T]I~ 48֘ raO7K<@{{;MMML&Ys٥~(]]]+q4,f4o;BÍ;-o<RwR04i %%%XU*hllgPRYYIcc#194l. #=VzSֺ(3:ztLjʃ~9r|v܉cҳnW=J8k=。~w|>Z"%҂fJuo*??/knEgćqwﺖxi^J'ؽWNnO!_ƍYtio6KII)^D"x<(¶ o?S|ᕻx,h.,ewx2Ts܁>0l/0zlpِT]]ʏJj&>{0`ڴigԩ߿M6Ip: חqv:^GUܼZ\0`v;eOk˳mі+KY:+ݶ7 y{Pz)V[pC_Oўlijijj^`ܹx<lDFs%l{ p$}W>|t3 ɔNα#D! #Lvir++++Gi&糡^w{Ι3ymmm~`o{CC ziE7 [^KCm\zz\5Ko_}?yvY>8mC>&L<}i?xS_?hY[ۃ.멗BQ$3͞Y23͖-Lo}.BrALxp9 x,wR\y}2Ҽs/=@ }&e4!bD\(h՞ű *C.ˬr*A%38T!q-93͂L|h\d~~u1U28gVSR?ow9p0?XyEA1|>~eYhz>mmmڵ)S`&8tVLӤwDx<)*Os t4.f=)KYL_|˲3g L&5V\rΓ| p]4DH~W0'gۊ1Hy@Nh"nc(wBu=Egj;:Έkw hASlA0a@Y,H=:|]U4`Hp\ڧ۸mu/^X ƶM2\Й͚d鴃m[AY/lw 1DyM*cfBu9/;]Xڠ]~_.,e?+//&G-ضR ǃixmcz&۶immd{ғF9Ǻ56VоmypSn=pO"$zS7uc0q(y S:VcBW4^ ŖL+cbU L_Kkͱ,;y\}f'Skӎ -y9.A*@D`Cϙ^ie`?&{<e8^N뼹 Q w 5%Tf4׍'3v$Yt*N^Fdj:o~c`eլZx شucxML12sAq2Of$gLz20{!hs@M  rΓ,ƦEH\3B!65Y٬xqˑ3,+Bx\@Wv$ڙbju ǩ Р\4 ?İt8PymG|x7NS*o  2U3.MgLSd\hJBP҄7eyYpKQ>-7ľc.@DvDnoeȏoN=Tnc8$qhlZ3GG9>ݝ''n8_?ũoVcu9=tL)'>륧VҧT!IeD]D"%`@ `2!jn'TUDs_O^עT#w_oXO/PlBs ƒ}cx ;7qEv#wuxMy-/j'`"BXWGqҙSf奍PdOD"g.Z*Iy'UΤZhIg,XWC̛,;濯x:XWCidx;Ga9k9TԎuN*(P33;=n<4ጅg3f'Ty` 6TllXҪ79 uf&%Uj+sXZ2B ⤂RX;i4"Iy"QAa=}*J^A/! 0{3eTv~[,!tP*x I'B1L@R!duB!x2 ?c]!ƭʔkhC!Mc] !M餛.?WB!^>JB!8)|W!B!ĘT!B!ĘT!B!Ę[!BCc8Z뱮(`eaY`uuxST!bIg2Xp0>&cgHgo  !B#cx-@ >ou}V~3^S ]g' T,0S΢Fql,;oB!8|0B)Utj3cF}|p=_\ZhvU.07AyܳEm֧M Hxyhy,BZ)ٴB JB!5RX/JcȢ I3Y.iFJ=h>Dc̦aJJ~J޲T~`=oi=YV]T_s `Y>\DR!BqFiܓSܬ'Z_nNk m D ˭@+a 6{|Y8}m{[vIvW'(嗢V5\.]k&  !B3J)ƠYR f fo zW6Tos_gMlAq8Lѧ.b(j[nAgQ)=cAFW?¦GHA MይYmq !B JB!bruw٧goަtgR G4e]78{Kd3sUOi>`jERzAtbL#Vo=4ro575Q7Yk J= !B3Jڅob :`f?n@EUi[-쨧0*SV3*ϣx~s?$of,ib$$B1Z[ZʗIoB){rpܤ\-WU-Wn)l.nčvAmz֪lݗeV;`8s=cq'dJE !B~?kn~#}뢔UnMqIdh?*prnvrя~ڵp՚ /#pn_7bNܾS 7~&WT~ru㞺^Giѿ|'(qSFAzq=)ݻ+̼sx?Ŋ^wUB JB!cMeNYgO0:2}55ՔSSS}wW}Y!萠T!hii;~pw\GkKoP~3-EKwKW_>^o;uR<,~[=V\N+XU;qv~ʫZkdV^x r_by8YI|߾E+.?7}8eSOsɪ5\t9y>ůe++֭m]G]Gg~:}Y~}=_ӧO3˟J)>_-^ [~9.u/7\xrIul;o޷8|0z \t*U,'׭ύد};%rs J= !BWTO~gL4{=&LGyw]N**x G%tw@Qlݲq\h:(jР+E0vBy}~|(Vlڸ|bq:;:9oyݷcf {X[u'MgƬ8@yUE:wo7{aA+|T:i+葠T!FD"a{u|0MÄabPpk><urY||G\2FB(xo_ H33O=K<C.ůot[QB.fq+uϵR5u>2tyQݔݿseoL M@dJ=ҧT!HCA7.x5~\%Nyhok;~{'"jjk=g?ׂu;9x.f8aX(q:m z;p/#*l6K [0@w3`OeU%U.xse`>=s GxL/}J,cO2B!@2" /& F5V/\~~??拟~`9K+ٳ{Wd2gƝ1d]rd T o>zr7x 7}4:w^×o?7Qo$`B8 JB!0d Gn)?*K͒hW1 Ie 1$(B!G,ˢ$RJQ<^!xµ]˫,b4'I!b,p 5 uDH(BMy`) AB!ĸbթ 7CV#nu̺`kT#ׅZT , WύL!:t8-6m pJ9e53)TVdtʁ |~^{[ m _Bs6>*pt 7'^&m`gLޝVԧ~vtҎ( [_sN9!kGjaG|׮dc:r^S]7F:::NZ幗#Dfk4.|FRᷙUY>!Ce@ִvuxhJ) `WQ02ك|>3.4M>gK4ka'({y) e8ff2 zhіԽTOp3ro9gCW&G3w,pzgX-~6d\*ge2A(;zز}خ4%~Nh);%vXlX͆0 $3gjet5-?#G=bڪfX!<M00cy̘x!B;*B9̣Σ2 =/e`DP88yd&`m ge_y&%U"͎ͻuZؔA6 ]Q8 xh,5h5y \Ac M{hj)JIx2>z:YA$j=Q(wsMuVJBǘ1%w1ix48s af X7F[8QqvOH &Z,>|*/wik" M攊8Y]L+uOCbsKGjq|21/1'EE~AM`V:f&yx'w/bwkhڃѴg( ) wvs9o=M5$s{+R~H;P6#TlSǬHX0-Iô G[MazҪ̛n3nì {Yujb%l4vZ;-}mL%zmZ}Ş=؎i:A,Xݲxvda]-OMj7{iS 1-A ZqN]lvgۅB1nzPjdp= Cw:>9Z*M ML`AcdjF\T4T{)~Zn@[L&&^LJK)d*.E7oh=Տ5̖2f(Jq|`fMv&'|d|$\ᡃan9X*'bEiCdyS\5W􆈭Iw24z>8$9@%I)hn=MwЖzu,8خhh}˛0a%¦2h˳ r,FWs/~;w{KSRk؎7JgW tE=䷕l߸Աԧ"i4~uy%:6Hmmokaڴ猞N.=Md6*c7Pт%'\; /t?~+5.(߇sH\G:T38*exA~oJ2B!SML h LLkJ*b;qpopYH|vǏpڂ4ybQA6 -ikC,־vi .!l/Ac1l=em캊Pj%ͱc/C}LYtJ;?f`v UԻL@IgDB'tB Ixס0iXL(1ޭ-TtlpS*}fF_w+9x>F|5z.G̻PT8-Z)C5I\0 ,|c=wsugߍ/pYU.)2NT6@W"aҮBj#JJ;~YaJ<~Aɸ:.LoSҪjPc&NP>-]/c%vKvp<(k(a%o1qr@DҤp;?>$fϖw.};)OǟgLی_.}yǷ7r̙z?-n%ivXo vDO^)O"nԿoa޼7/JB!ę̌&#M_Pӱct.xm#4غG_,!qp2afcOa;f̈́jg: {4Z~DXta6rD ::5{^.gяmZʋ%8q"BWgTTZZ RN(#A{~.pTPNI`r+k_#$j.yYo_PM6ZxJƎq1‘YF"{w5_߭[xDAiG5[ģe;QEE[w,[|kB0xGڟgYݩӉ7gp.sPqBoT6g߁֕ |i .{^1޽AǛUCWNE3`d?1*Ҝ01&!nr Rcnab}|&ٿ~:jb6o wBwz1zusWLڻ,mN }P!ȑ w:&AXG1/C ң C رWJ}m/~>=hP,[$RmJ:&Sgb L/=`ZO`Is;eX;9m1naIf<\5˂ >ݦ=&6uT?z}A= e*{b>X8~ ?prbv2aљG2S\BgX"dQΞeѩKgZ; T8%z:8e6tS!\L<Sѩ t9ޚMhٽ⥍Te%U`NB .b PYSؾ}t;q q _4xy0SkLJ'DB5HAˑrQB:CMO`7qL'hT3tvx0JLp g 4=,+pY M(l|1 ; bɒ5ZYq>U_)SI\hn$*c'el_r~g7} FD %i&* 4 = rQunZשD@YH>'?i@$&YOI:D4jFV(.', J#vf .p壼Hő9 +WNRݟҁϏ 4<(#mtv4^S[g*ڊ\ώ>s##|ҙҁiBCs}Af]ޢ!R!a=C[d~-alǦ _z1vWrD6`49+;7"o䊋4CoHĢ\V+U`o*!ȐACP k/[4tt^TލIF2N~kiSojkVsL|`RI-8:`f4YPtdM*wf"IЂ0域)}A=f3H8rh*& _?z&?~z2>}^v4{h$\P=~FK$`p4/~#Az{Ģh=~{!I&O>;P8?Fm$@---!N\+ u4Ks$j"v*L4;TJLX('cX *#m7⚹=Ts Z7-!?'q24[1|G)k96pXD%AŹSy;ń>N`܉cM0C柘0ySF(+qltQk8t4NDs-.6@6YFE3t*Ȥ"f.锁 V:K[Gw*ȣy+gQdRF4%x}g/lxjv_0f,JSWVE!ՠ4\l <:H6Hۀ.4ʱ]IR7iH.űfTZӽusV͎0s x< ӲqHq1GW$[0 n*loF i;׫ 5ݵKp\G(s.f=yOsÜ1_7c4AF#{ ;Uq)hmIs5c7|ǞlL#6fb7bbwcb6fazw}Lx-#:HIHI$[ q7~#h ʲ Uee2 ؄!Rh6WH JEO 0!F*{6i'.Vl<+GB׬Z4ϳ&;4RUaLjO3V<z d{f~AD1W?A:F{,r`N }=:;̒Dwf܊`Ue3p6[wA[%jfw` |[o06Yi ޸6x8Vwm"CU6C:Q7Ĝ|E3/HbI%B@~,e9x IDAT(x~ OҴ/cO.sWL(QD%wf-nRRktIshB*9b~} KˆNOc$1߾@Xhlu!ZFmf&R ,YS7ً?>ʍFpv)ojp EҒ$nN`ty8oK_[#HLB֢'.`l()V^aoit*hZMS]<}^ c|9?Ehϲ4E= u}ݎ:Q21ˬ H_M[{.swt5zvnJ_ʻWB.~?V1~_}_D%J6\HR!F&Uv5Im0ݶ:UAU {LҨu/D)v&E^y2 k6܊EU4h8 **v$*cCJ'Ԭ^`t4bx8!!FT2’s!HUD,lWrSpeWЛ {s|mȿE\o!-.*a0DIՂ!m*1J5:Qwu*b5^ySL?bnugVF ᔡP"nMx`53ramaZ|Ks7N׏ŨOǜTejLtOs.Bz[ٿʖwk_ |Ó|FZt&F=}aC˳TV1 wr%T&dpH~~ g[` I"ƕZxX?N{3T)Ԯ??:xg[D%J~vRi1Hh]lbdv$*f& {FyL,w 4$ٮ߿³:j2Qj7]$Ƞj89A%R@ Lh]M 6+ ЦNqYk^d١VsV""ajc1k8?+/\|>p@Էm ?]XB€2*!TY%JdުrG FM4жMbuߋ!ЊLbd YiCZv$ Oa;Dmn'ElM+ 1ex!j3D1ҍrIǍ^vu9y}N${KTyCl{w,IRЀveꓯqAFX i ODl'1alBJS JG,*DIGƸ#} Jfd$ftc#<2 /tK(Qzb?z\o9c~/ϫNN&ž'a[jv= ߞpfOںiit(u6]^> wբ8ʀ 6!ڏSu &Vi_3PmT'1\X}ɳLO9* siv9 LY7r4>5IA*EgqozMlk'Cm~M"1˹osˍ%OzKjCIKQШH u%PPTvrn3RH`" Dyn4 nZ\d7;Md&~[wonğgZϐۯnܰev"ݟe g/yٌdDͰ{ku~xԄ33o Kk'"̦sQZ̾.|)#K4~O7lۦ|Am*]y/3\74F,j=딱9i3}t@Ty9ŏ~j;nLۆ<͕ L7'4}vQ?8#A bz<C'Vŝ<Ë ƙIQ*H_曖!lVڧi6ɫ+l3RɯQ| qo?YyCMFn-j=&J$fh tmDWVF$(ih']z6-]9uLHXf旆oz -2B5|bН<8'%x-˙s!ۘg]dN1=Q7$KPY>} ez{/| M0wrGz{c[/>WT6Vk1-v|N㊯>,~;6]9,9o ۘ''/r1o/QD%J|໨1FG-o# MܺPo%(ݥM F!CLz]䖛/ - sac4Py2xWB/r9lwӂ?v =Dat{Jv iOh?vT> ?J{0 ]Tn|o_fNK olPջQ I6?B z*aY+?`eL4-q}  {&{|3Uxv<11lN4k\\Ą@Z{"&v::Y!;{sH$Fpz ^ Xn0dvQ&z-SkFkC6%֡Vq|CP aq~vԣk`'=y}_B]$>@ Ͻ"ljZտpهiǒzγooFZ,SwǠv jr䶍eof ;?uŋ}g#c)7i@lacl7/O.:)O2F}/=dԦ3o}DKiG8pYF&,.Z녀qc%J(QD=ݍ!x7X}ofvc w&$"&n%~S H 1t8Oپ'6p߽1> _6k"t!a답TByLŐX  ,]p.3c1m4|Cm^}(tzb7D%C->$+OT,MxO˜~kYjub\E!K``gV1@^:SMj֪[؍`mFqa\| CZ6Z4@qyeKo n݁c b`!@/Jf/dVcb@բEg&yl5"k ;w`L {#^\z C =uycD] bg ifhM"Yk T/~WX]GKZAӪ~gЭkm{oG֘siMWɯ?bk$/Xe]NXa ;fz}pAأb0'_[ _~6/8Q8ou|uT=47Hؾ4(QD/fR*|oOl_>Fѭ 4S=Şۏ򁏝W!k,qe>2mE'Wp O,$F;(t!ޯ;fgI gЦf)Q_5~oszZ^ C )XBwz %W^fGYUh&9w%J\'4;GGykiHyﰩ:[iDg{K͡tɪuazZBt>s{ͅŒ~Zf6\CXQv~?i6ȶ!C=XV{̧i/n9c,$oTĦ0i>pSL5l+k{cӨt)3_9őΛna%ya6$kc֠&h$\DG<{W8|}6073Ɲ cW,U}_!}|Slǘ;nI &*A$N$ %/O'>v_|˓ZkLo7vRCr4?m w^YMn&5FS`VhŁ'KPln+-ν;b4U䦭yh c"] 0iPĶf9<|m-WBd4[#Dfs5V+mOBWgIq4/S_d|2Ҹ|1Q})T.:$ $0:̶Tu7m~"?gٻw>O@m=!`r*>7r4,u+b=$kUP$q1z#<]21yel Dǚ}2Β{t{ڛe^?ED$PMg퐨.Օה(QD%~p]!-[ h7\TЉ``аiS̎]=v WmlCó۳0M[[& Cp3t% FtE reͦۧOs Vȷ>SkPC+LL}; CmvpSo2>X6BHq "g9[i;iG:VҤm/2XYa@)>`&Ǘ^aBuͨAkHzTQ latiۮyv&3yiVhҋ1 S 18MpBg[FmMo`6[.r㖫/V)Y[+$ؽ4T.NkUؾme͕!BQ5Lly7{fU;2zg ~Q{l{zðsw?z`cOa4q{6ز9n}Y}"{TkWns၇xmtRh3͗91܆6Xa;vJ(QD'\{+zRxoG8|\ Z^=;aώp0{ q{x]_>sEx7NN!:l{?_L]U+<:DU\]+]Nk,~ϻq_دk^+ƉQ*QD%J\#*3O>i9ySnb'!uX >}Bf-TB$h,ֺXKs?miq@au8#5J)Xkm:]QGd}I^ҝɘ :=;'})p~)%a' ֤%ߞ-4T R ?.$v주 h/탟'u7u=Vk)_6Dt{rQ RBLL~cOKq_y[6-.,ifa1c-RJV]"֗+E3=N=ע)I=]k]Ob9ؖ^62v/ zT!͵1Z S,-9֭:6nۯ{++0;w}*QD%Jlk&Jy /:. zj&6!A:x)>j3%0ӬgZO@  ̙sEیhM XhJRJA5ZB$hm\XcLf?)D b+ NpU6D@H削 S/Dh,֑b)2K@ oKNڋ_dٜd{ IDATq=K(Eޠ$:7LySST O"ϏKf @HulI?^P Q[6f-_"vF4㉝FGFa 7u,tlj(Mh-7Ԙ`X-Oyi=4ָyN:NȉFoP֑R -Bq&n07cEI\:NNRfkZKRabbeݮV QJXRcWquJǦ5Je׮1,gZ| $gï=n[uIcƸ9B#~ll_]BcbC!&YX]$lgϸ $hJ|a(;v0oXYPA@ya~,B5oߗKD%J(qqͤtzY]kbAJ{2Ud69{~&.`-'S@HJ"Z&F3AH+/ [LcȔ$뙛*`6H B8 ixh(G촣DRHY1K+rB''A(VʠMHP*a *&RXe B"$J# bkx g'pXdV!#땽D6*! PQdHrQ@)$*-!e!['m뉘++֭K8μA!K<֜J1Hh` IיZ QhB  eM=J#&,BTV",Ԫr׹c{&]y#Zx"lҵ)VRBӞZ7 =)PJOa765xRwXHwc &I{jpH_( %ڵ__x2֥Iֽ UGV%/k/u?2L!( 8 A*'Ys:ҍ"X%.R"#!Y#PJ=Vػ{7 K9?߂nAHߚ"z^L^`0푊?% `|bnE# Ξ&g(#6x) "@JJk1kD%J(I^ϑpyr))8ev~q8N/#R:ὈH-R*ՊyN )+e5<<7m($Zὀd#$6QB"B#ACK#rc*@pT\eik_e|Nb-hmz@lתX њ$I1'{kcO~VC'J)EA1|S $&= Ѥl}J54TyWC)u* qeGYw.K(Huēgߍ1XƑyu:XW}mCP(>-<<>l}AB:/IÞ=]X?TVnuL[k9x1 MN"9pD JĭHK̇,RYn|P5H'q!8tK)6e !b ^`cXQmRPש.UYk`-U*Hܿ EHo!$UJQ~ b}vK(QD׊k&N0LJ))hqb@*gΣKhOř˻RG ںZ()a(hR$񡍖n:͛/|v#$&QAIXkH:z=% Z A%ZMkxnn>5!D!71: R,>rF!0$gl̬ƸhM퉜Y7lB{q*8cal߿FΣ_}F!aCMc-:N t: %FkObscenHPn^o033믿s8ۋ tv>; fyOnXD%Jxpͤ)Z2 r],#CE'N`k\[h$% ڜ!I"ZCz5m\`/1ĉ$a‡{zmL@FhB dS |^,Fok1ZS -5d}M ZqYo,OQT*n/ mEK% zq#N0ָg~&1I^#jHdQg$8OYz@="kSs~ܮ)9us֝.[9: SlnugSМ RYl/Ns-F@$XޅQcI'{U0|]]$z=S$ kkBqu20A?ίs?VWW{ O5a[f!"":7ZOT`)sJK(QDw)8y:h{IYբE$:q!FfV|Bp[#_fqyőH$GM+(z]fHg22Z{uyޠWRW_WN 2ϫ^=AM 1k1+@2<8RZ&bΜ1i^gv:XmH48%G'(ͥa|6 Khg|oZJvEZs-!|(u^g3JV JŅP}i zA}KkOֺ8000'OXZ^a"}xμYDjJb6q>h{e kۦӑGEF'igĆ,4>_Յ*Zіښ^?{"W⋞ N1L~H4֢&FGc@yi_n۴@ oVҠ*Q008(g*IV1/no8b'N~ ,GUOHhs]ݚ߯c!,ʼo8ʷήW>9ļ@_]#?"-TeeeՕU _<|{ב̙  XZn xPx/ȯOɞ.EkS P ?C{kX[k:ofn({Ímm=qO0s]qD%J(qͤ4wDjqe._ŝ-^ؑLc !+2<8%ݑCیʦkAd.W 4_Wsssat^j,۸(D(G ]%sv+=Qng~XOtFE#)FFi]@5 ]/eya%kI(ݫPzP_>P'I"8[ J?̻lH%yCWM8tnrp+tVQUXZ\͈ d5>B`Ϋφ_&2ou* pɺI3)U;ǷRZka R!癗XP"oV`c8Z_`jj ?8gΜɦ-Xzk\Y4]nqrk.GJ(QDLJ3W zȳPN-i~䊸yLnE+PJؠGےҝWέAyR2jw,pE hk$Z't:-Muʛc0Po0Xk `ayV@T(ukB_݅)EE/)Wf^߽ƅޖz^VI4@Ra'n4d)Ȍ&TX!%y1yq coKU b9XU@NQ.-/[a3ןv8"]ǑSQ B rWʢw-'y!Ǵ@\]^r%dQi;RX)3XHU4K Y﨤Phb1I]ݢ$72y:$I5/tyl a1Wg3&L1 _w?SZp9a(ڧxRX?䵢WN,2J2SeU iSi<|MjxTJw7::;y뭷X]kaIn'3.ӳ3O?rwRaYxk{#$-iEKOi%J(n os嵣~ym(X]F'S_B AZ{8?!Rt\諐?&-%1|"h* h.J)rreL sHXJyT wIgVuDC'E,Wܼ |_jHgJpxDI[XS jrT/nC(d<<G|_ 4'("-ĥM joiBuGGL8R'Vj/-'XMJgP*t* Lގi#Q/zR~H"-{2\.uZAم8&6;.ܗ6psӰؓ37n/!a1*GFX^Y"I4^DjK |iu֫R23H;Nk!}\t@0̜ZK"M_x#aa?:*PYH/'Muy3ۥ%Q,6_+%J(QDwNJ_RP'u:_6kA *Zw Y%z!i=wK9I ˱a4'\tGP`iO`Xi[$! QӌONr0V  4DrWxOHCZO|RMh#H>8'J!Z77jz)(sm*`*9{" k<H"izZ(ͫ+繼7-rCe- 9RIwդ%@' =|/4I2U1⸦N>81\ڒ)v+˅ wGVEXMץH׋#[., ;Ņ D-Mט1&?T̛hLrZ $!1ي$y;aHYXˏ@ %R  qxYY^"#Qy1a֐$;8wF*ZѣN7ΨMO\n֚Z 9Gv籒-ŬwEbF5{wX (3vÀ+](=qXu^,?jjb%J(Q]5@*eٙ{lPȤȕ wRX5;WlŸUZ:^;Bh [cswH*${xU8?BBN_evq #J)un̕P+^L_+pQ aҸcz $2 IV,/033Cz aJX"xBa0LJE:y}L5 8ɋ@_5+{uīVs?w% z;GdH=~B",߰Ⱦa<ֲ:};W檮lvMEʡ"Kk$DAd $FAɉ`%RbQ!l=fuU5 w:;p}Un Mw5^aOgr+պ*v@HfNbgEkSE0$8&RWI nfM9q,%z<*٧ʗTQ#)It+jgGv@i yk,qwi2rF %b8:I_aM,tkZ:zT$ƥAQ䒨 3\|g,wVXW<,KA.fA+)Rʺի<ܳGFk(ƍ\*c_sU̷J9I٘`f+ IDATgQ4eYć,2{;LF*R+0E#5_-1R2Y0+2,þ$[#tuC7PP8c -la w J}&)8eˢȇeT݌2Oݨie4JQagkpV/mc}8go߳>H Usp9:![`'5 h4l ,SNjZC#ώQ;[# %dm3C03sM=lRSrollR䒝U)MYd9‹;W0d\ `Ք7W5 ;[MfNX3uK\p5qKFȪ?vǰ[kCKfV'B:;Ī:ƶZ(E.I|9 +&τc.la [kv2v!N ӆ#I`bm/ 8!^}_NTfGECU,Y@PKL -ml{$H[x A–֠BɘEQrF6+07 Nh1IpDv`zsoC%sD>u0Lj*`Xa\Nc\7:ٷ30ܳ ud=8~ JZ:_ҹ?VEm@Z: X7'ٴ^eYzS?~d9e饩[]|7g_gTɹl)' Odž6WgxΆQs@[I9r0WnxPZݔ$YsP j^{Y 7t(NP*Ex"yk"y "Z(Մ2i<7c<1 j[z 1o6XpT0-la {AF,Mӹn/]sR+qKccISFٙjw:QBiJv lr`zuNw8[q#fV$HԐ&Ei[2Tuą QRk/D7Bx ME,- 0!S&{$ē:aJ8MSȫ64j YF53o" +Dh`d :}|IP:.rsPc)0yC47ht!aYSd4M5V` Zȯ=ay*XQtΊl^֔*8rgÖVkg( UFTȖdTg[hkXSց"KoJ^Qk_Oz3QpW6Tm0L{Hs}5c̛syw!Q=9Xʺy c{{!*2i'68#ԅS+KQf&Hm]U[7 PN2mk_TCE-la [")5FHD>yŽ8F`%2URa`R2gBWҮ5XCJNPK2CĝY Ȳ!m&VP!4$ 5a LLi\X?sήP>46;&2k-W|&ppk;0;#<>y֯nTRgmHbc:T]K>yV0A^4SDeNB8WJk\mIq Qc;-la [vA ڹZ( .U̐bf$w&m88Ma\ǫ A6ε'\\]g<ɋuv7~YcD☣عNJib%C6 &A)z^rEi$Hp,)M$P䓬H2Us8)si؂Ѕ"/J&qIJXiR:HZ*=RRDQX+=;KVoU]z:li ;V1y^TNnd`Ie [-aZk_*4b`$a,+W?-5ɲZY`(U~ ֕(͓  ``Zck8{!oMx~Q=ܨc (U3ɇf10Ke<`nny^odYS;ڪtjcnZ;X{5uS/]x<ƖU"akW0Ljiޝ2>';)D%iiUvԝ*%;,m8JŸSg58̊ lD^L+xKwt3t:Ы`<' [&]uw@ '+H3,b.Ǜl2lb=0 Lݬs>-v[X4,YĐ,Cu$4 aLxp4ۦ(3vmSf5W4IܥYK'Y"9 /06\v{$}hTM@YC #kfAVY28S#/cmUR?꠴[$$r'i&v*!L_TM9ߨ5Jstv_a+SGV6:]EK)Rފ{nEw9=78n1"/<そX[=#͍EcYav[CY<]3&/$cWdj̏ $uw̬`Ɣ0vml5]ㄅ-la [nRgkCV_Ij$dHАZHAyk-܈:YڳrQPyIaMC5bͤ&O-Ɋ)Y>r ஓtq~gɔq>d V⟧S(] G F$ߋ)ȋ Y1fm1Jaɮ *Q)K#/cJW{Y0n2_e< Ge&RZtwS% .˜Șf#Kng@:Pc^wbljw"QOD3`I!csi+3shUk' E.= d7b5CL ;UMs{yCf;QX]l%hsPSC` 2G)"$EJ|oFO`P/|hˁ> n֌ p  )2ɲoJkc&Mb&s.[I ,JPJ&Pr*v:$3E7z4JR&xt"5t{q<7H6XxJQBh*naFhocWk[\2^(Dƭ P}FcI"&o[Ң7-6[>p9ui6!) [{RtT~0%w{[,såT9gg>Θ慇C^,!Uκt~ЇP?䓸%,8<:EU uē~OXS/-8Z”T@?[yzx%R)tw8N;yNx l,uyl[+} V3ܮƎiѮ[:NTJ8 k*aL*x2O/eSRإ%/]Bz"vQ|w#/!3y7#kI~g SQ P>{8spŘ80\U#MS\Y6;XjE"Q7]z<o]ϜYT~ε1iUkrQ?clb@)tz)Z)cZ~ ¸YSj7ׯ֒,-dP<@־WhJ'&-la߷.Rى3v΅nCA'߽{E< sYʲ b$i0=hxZT",,43 dSN] *z,azC ܅ O5}ҡ]^zQ!ǣH>iC}`MN>wNGc@Ȗ?UiM19N-Cqu!0<(i;wmIF`W߀ R=pnx\|6#*dKNc|y'5SSJFZ̯i;9Z`y9duLJ)+D$@3ՐioK<^ղ7lFUi~W8…91wǣ#w6 Hd嚖Ҕ~QQeWF!0)%˲.e x4QҲ(#M'b}gϟ~x?k~o<ހ>O7c [4x>'-la?@lsNX 0m8!e)K׿ ? ?ӵlo|N;Fie?S"]^Ε|somͿs4S//;sFGA;w pe)_{ F#F$x歙} ̃v7au尖, IҒSUN6R0/:mS[qf+jqI{qjǡ,yk{<_ éCD~qW[]7Ğ:>v pM{/P'nƽ:ΔL1[k zё}lL>Աc`U3O~ﳸӧdY@c觀*x,_Y!{UgHg09gނo24Q$ko>SirbB$?9*dSE9mǓwv{Hcd$WFy舴z=>dLjIMA`4Q{<?AmId+Br)U1i\y,mWzʗi53_YQsx:?6EΤRM3"|>9ܭ8jfg`kk;O9$f!y;C#Ib} Nn_Gs\BzQT#C>oW0 [ְ$N8v @]uLRb5#`ư3.U8u RөgI;jX<~~} Y#Lg>aڮqo?Out' Nn > 0e)xHN$ Xz4QuT(ȭypcTj$ (-5a_ە=e!%p j.gAo>^~[!myJ$ɘcńe+qLpOa_헤UJb 0qJB 5#洢/wԑf{{-F6:R궆xؼl%[S֙oْ(6-dV%tAMjZJ1u8/̷gwZ]Y(k-u~Oi6Z1Aˑ#xͳ?bHe|R")Q%njZ`Ly/la [wJ!·sh*R-"'5¤"i[NE]EY2YdHj)Jā><q֯?g"nDZ'(%2)AT1" ?ue'eczKcy1liD)Y)cfn&! Z:EQD&EH3; g(Yf]1.ˤ~fK{t}_c8ӾXJqDQȑ3kkٟIA^+#qI8)5A6OC,8{O,)rF.'q݋.M%nq=Xg:ItT^6fGrJ`hea0Aq$VK: jPYW4oE#3&8i0mazg\+4!@$1ֳ1ohEy#kmY8PsM$i;VQW u)͵v#X 82 vH&dSԀpq֚xA!eli5RirUjxo5V^C?r[B]Ԍ1dck?}x}a|sPj1J6+{ph>_(ISEI;y0 dxF#/sJ\TkS<u7OTD$FCsws ̃N9"uz$|A2.qC@i;D|FY+qʂ Z% UI,AR=3J6kr_kZ)Ő9wEbqJ[J8v9$Yš(tUE+Z+q❟CsIkB@Ihbo}ِd:gIu֧snW L(J (xr⭓$|W^g, Dl|z(W)+߻akHlB5%y!,e#?O~X8g(3lcPrb\AQN?!YAKW=Sԩ(n[Ővtkk|˟#7n}o:QӦ)[[iJd ͥ~Mv tj{0 SX_aPqNɼϜVgu՗NGdplsFөHDN𱊁q !lRЏ?uy14#_-lNY66(nGQt{98tSNVҤi)ar2k13?KvT6HQ$CQxq/i0YHkX%7$央zlmhɲbOgqsSouQ4d2~W6ːn,sZe)sRngc <ǽ*C?xQOW{ ڤ(tCYC4ǝ XHaZuvI.IٳWWjZnѣSoh%eaLI35bǎGsȒHX6KSRYJ”[$%TUnY}i]Yvw8ٸY 5N]>Ρ8TjhoLgDR9^hS*oN V}8 eyڳUJʆCz<-"(N|Pflo`F"w(+Gݜ*.0 *2y7MQ{={P(_ ՒSVUv>K/b`>_d&Iox^7#-Ln,[|Bd޴~u˭Y]w㌁-.*,:)΀Aoo&Sl. ̷=avEZnEøx9a%͋ y1asxH, <8R?iǸ!V;R:R" r:3gp/zø88]{lo09QׯWSe9,e+gn=SZ(xA+)Ք0$:rX$!R c,Δ&I6bs vJVz, !(kM*stPJ11굼HI6~Cj+6Zll6õl^ɖlHJRɤ|ͷp]wGGǓ<1CZ k:&_. 'qƭh%('ę4nɔ<_f{K?rvCb9+'_}ڻ, Scɋmii,'$IYZru|DElllE(PJS6&Lt:dQ"׳֊t'*tB*J< jM|uDKgPG;[gݵTgLrclڟ@% %ko,$6]Ic`}A_'EkP<{e׿{;r t[23Ͷ:O# z+Q1e%:04,1 t7B=Q ƽJ J Eܧr//mAi]"V}Iפ+*|PZgEFrXH fؿ{_{hR-0#I]g T9N[&lN~E'R'5[2c-jYafjj61{5ItL&e-D P7Or6^ xp. '%Y.;WnIg^;k.l7m1,laFx)G[,Y¾/-4J5'屶"T5de%z7OfsuJ)W$dV{I@z[d΃]>#֢&:8p"a<)☢˫8ku{g,e^,UIF-i hN&dB8I"2l[`1u3W 8FiEɀo eh{CR{k^75`w8f +?EAMq("&n\aK}ג8O<yI;?S?ǿsϽGG/Bu7_vR.A~z}؋k8~1r}kO+'2~~o Ox8|2Z+G|COǭ^}XX[҅-l{ǠT{&,fFENS1C֌]S'+y$JvHRoeHwEQҿyė2-1Ve` X^Z볽D.Qh~Kk^:fѨ}~i]ZEt6ըGcukYӟ C fWpƠ%Iָ(*y76po*/~wɄI>4L^w8PVahE[Ks6~\x[8` 1Ѻ¡ \n$QD:&bacHE(3\b39{7`';G$t0qvygS^ĝ='Lh2bL^LȖƬ,%M>S#$M<|:۷_bFza*YV415FX/_%MEz~f90q>{W-flRhșKD5 @v>뭀!&E^JC365$]2ֲ~jE1iBJVuN}V+3h%4V3/Z09 W59 5ln ,|-Z\šdʌnljX%h_kXֶ _14o~U7~O?#.]u~6r=w[/)˒_?//>k;܅s{?ӿrI?pV_9~~ҀW^|_/_eii7zVٞlmmX¾o3ڔEYJƆ{} QH\%r9#;&\Z^^Ip gOVI쟡Ntڐ2>>|I/֙looi.m9)-;*$AN}iQ}6ąRAʀXX'"%uCn&@jp*krig>[ Ǐɘك[+tJ{w%GypMA+ d `c_g_b 0 659 BV M4N[J&cW9OwuuuO=<./gb~񋘯~<ƙ4AiPek 2n2ҾXh!jzM1ϷWK >⊔L< Iϋ=6uf|Xۡi֥ՙau cR^=PW\~MYuXlr5+~뛘ؑvwdj7ݤܢ_h "jT+CtsҞY-GXQpcc/8~ ;nOQd0ct VbM-q|+5<(0F $A~{g ʱYA)(MF$ݮ{R`1nʑǜQڌ(PsyYЁȊ#Ii"̥;nt湧}Cʂ Z$ I*Uޞ=4$;]Y@S) PW}@)9؝煋-N 3^}_DJBӕɟAڃ|wb1eBRjuhԱ!Ԋ[Kcc*3ᛰo+wckO!Q3XJ|ZѨ1L1ic-ݨ3΀sCc tՠZ3P?y3K^rC%̵JkcarO]4ZαIu}y.XGaoM@Itgh4b1-R# QiD~]blkQ*20AɌ椕{4`D yz@yl%~(ZIA6K9ٸp)lyʝCũAyZA& {Zz,}(1^w| ^?Ӻs_j333?v, Rrq)8 e9PJgt3K.>Q.qo^W𒗽Nm$9~09~b@88r(+W~ikzV&&&W*?bݔv͕W]sn | p-{wq'ϹYʃf%wݼ/abW^u%{_c2õ/x^>4m? g6lqW8 ד˧%Cfb*QZFO^ejv0Y*i쭛ͲqEK~06T(Ɨs)<⑘O_?w!Mtg 7cNfXDRTYNOanAmߎ]"}- +4Zd& (O@]r r1vmkޭaX!q%]y!@PܜhW_8惸.L<#٘dJ%ƺ? t*,̐~貹QRV1;;w{4@2L9|>鼞[o$I:8\,x+^Ư}/䧸/~{/G^̇?>_4Ie+L>V^߿VXA&Lw0><24RȤZbfIVG#_z%U6 Q ?LOaaz(2Ts*jZI*Q%#F=$TQRm؃߽QdO| O˴JԧC;[x̺L$ +Ao)8Ya)I{;+FFPT$ϻva 8%ʩ/}7F3:Q+xzǻxVOߙ`|8_xÑ#G㯸^ի8z(K.eff~_m;[9Yw:pƮr BIw^7qϏakuZdYd}j50cIP 1a?R( V)0= XbG~Sh9˲̱iW- FړOy]q-] yQ4*JmK ]zM1r> 9Kz>I4Md~+MҊ.bvz#RBn@^b2r/R,EԫT642l1)iI4KΖ-n:{#\y%u҈UPڵq~mu+ W§/r$ lbT+MU s AtvɲlB%Ejl9īǏ h 34c4*2yb2c\@h]# cPI$iG\Mðgfj kKhrJZݻ1:F3a9X(zL)E5@@);wb55* `.MƐ9\;߁Cݽ ۦI+%~ ZRۗs Й_8/JXkeNfkj~ R.ʳ(3Ir}geVfeYYTgY)ȂϹUY1;;hd;==IT,RՓE"=`\dVk-gKcnƍ_`k__|#?ŽS~5[nϼyӯ}_;h4Zr}<OgE/jqEEN[\o_q9{v4IPG)V6~vͫ^J;cӣ7azJ-[~ӏvMZy7czF#Ɋ6`@G!Z$`X9ԪN^Kl_*Eg"$fS(zs'&`2غTð8,J):ݎO-2?HR Γﮜ#t SB+'h@k5֬Yñ=|l!gc .6]o{PDaL* "tk3CtiwhgiuH.Ղ];1]^uҠJ&VoH2Q hݒhIda1XJUei,Vi&m+?>bC_D-`nZC3C'i3$ڍAXU@:J:5 3c̶̐f Y%͜max{}CCG?&u]}Փ_atfI]mQvtКH+#sc;jF:QĵRqJ}RիPg ,>ηQwM4QXG ) Iz58T:YeECuPIֹf+?jLx/5ɳn{_+Q,[e϶׬ĔG)%j9 +薧\n"|ߊ\6.c?t̷q* ɟ%`+.zwP"z{>>B"P,$-^lU/ /}K/"l7nx\ą hy7~7Ư{ƍ|a]x7mJ)~70O{ 7/oo{ o}[lc}9A)ˮ w.qO꫟g/ o?Uq Qw1EaE@&8dZu(R!YɞR$*5` Cc|"Re|AlwX&ǎ}лNj5VjI`q$Z'-٬=s`"/ (eԱi/2)DJ@V!iƂlae*Ch-쯥*C:im,YF-u8ZrimCq:2<\HԤ&tLT6oR98|l[&CpY$4;>ȟ IDAT؏ݾq&QK󑚤RD)e=W@F}Zm&%gq| 3NMaoG[<3jU xpJ-٬MѺBRk2CbJZeJA b~39Dm徳VbMRʹݻɪUR`r)qY$Z~)Vl8k=Gd:+dE[+9,y{3E^XY`IkrNYS,[:,V݉z?'hd0gѮ<(%6 DaVܜ<( 4Qi.L*0q[/aY&_))wE°X]0+}(Pk A2J%nm8|v݋rSEš9ê̽4EUjQg #<;+fI;wH>s_htԺu+,M۶AwBՑHw2ȥMZ6 r/]8^Kfff(J=?N.d~KXz6/-ֵW2ZcmJSb=e)j&񹻊Xd0h0::JR5}'SRl6_<~9ckkj6?ԶW Ҍ0`:A,ddiF'0A Dn6YA.i,߬U}3*dvJE;5n&!I"lc׬)@iúu"=r&'V jVcӦMyL"bMxnR꫋Ba!-Yc$Ť"ʗq_֓Ř(ryhhϦL;ՃJ{n{K/xk} ~z8#jqVN?5VToϩz=Bk:/-/v`A\K[׻Iʙ_%˼c ',$X4AG7ޖ-Jbs)܍T~%^k*(Er0=5ZfГUsS^c9Z0M|mzXF΂g= 6oC$')/n#;)487bWF=ј.+Iw.h S$o3@Yl6֕>X -4o7Ihw*U@C& CRNh Ip,s91z%7bT>,{* LY+fG)hw2F{"-:Cƅ0dA;G') ח0\_J:LrUj߽1 YL< m7zYY*@0s3tE%  F} iJ9"{.GɎu٨ n&V“ kג)Yvɽuat^/nY@\S\.?g^启t.RP+,I@TJ䓈>*>qNº,>5F?ωybH;zny8&2;Fsnw3ֱ0G-5ì\ݻwi (Zvt:dYSkaHA|tq}Wv‘vҦVξ\ _5,-vo=A bw_rL$T,xR+\mfI0X$"H3<#] $f{ࢋ$SkTݰ|ŸŹcv:t7)V%\8kzg w#2҉QkNgjzfIZ!:d-&{̦K255CiބT]`H-IڴMҴCjdADF@FH~m%ta>lڵz8bKhMƔ-N)i#S5Ʌ"|ÄNڕ6v抲'k (na&aP=eynN9NҢvmMGC'*Ĩ(mN@ĄHvq103 ¹9Bs58lFcfgJ@1;`btGi CCugJ$kM߅(E5Rd~ =kϭJ,zP[>nٯ TՆQDnB(Z)V\]HO[fH%ۍ377GZp򶽊:IBj2KV f,־-r@gߩ)(y^iJݞWe43t%_W?*qKJצ/z,aRN>w1l>I$b})ZRpAQ-.Y{`,@=aU^;<[x&Vf c aLZDc!6XVZ {gm¬BF)T?B7m<{elrp;H BV\eS|,4sxlYSLi4k_MA4Mڴ`!,YI !eIbm+Ҁ){R8:@U\iJ%tӒkⲻ5!w-owq]XcL839 CtR&ruS7`LҬK'i{+PkOc1D XƢ#DUTT`Jj?[b55>.qdAðGwoYuli T@Hqr+VV FFwnSE!amw3wMZZ VZ-e {ɇ_b玮mzzpczvOPQL;hRy5Jv*,I2ۜ#R7R9,PګL_O|Yxuny5d_{p[^ ÐJ34M͏ГA hoБ7=Rƃ8QYlk>>A bĩaP%Mzr QGI8ö A2<\gv (+KQf˔I3@Sc,$EkjԪ5gIro΅ [Z hZ^By3z%b2rxsz͍g`ǎ_HXcغmK~33MGM|b nٲek!웪Y Iti]@g$m:I{-jF"?xv.: f#ÄrȀg:IN < gzRg33}7g ƩuٔVw\(tN@8W\!CƋS 9HEU dNJ՛@[M"!afmP\z ({7v*x(BW^)Ek:iF栫E/Z5t:XF('M#EI@krh)l :9pי& p²UZ+4!(a(%t r&3 +سv|f4MٷVbF҄.XKV5s.I4<I+X{um•1Y`E)"^f M-gLLLeXI@=raJ46A b n\MWy>Y3̐:穴&1XC'EW'{'; 1A b?xؠ43 (A9Setj@&Ia)CR,_c[J[T e(@TsHCEHN=Nk4!͒"R).3΀VSXYl IҬp"T.%K%Gs&GKOǏcn|'y~OKjJIG`N\+.Qq,Zc8uYl8[n\wt:bTa6JU&m玐n"Q\IsÞsك=x{b]*CA*mZ ~=‹,{h:u3k_#a1WޘFf$H$q\Va5Iu%Gt쭛%tE;7< 5NAuD6NJ Uec\BqHL}MWASەa%s*ew.g zdl)PM)#H}0>β4BSyM҂1ǽDO#2fzNNkUQ]s˃}Gn+}5=Sd>1Tv7E>ёΙ4 R 1A b?x%at*0H}L~Z@)rh4P6k$eD!jhX(j2aXLDZm@`y}j\g*a $$LMTJ gƳI8 I&rN11X7zS+}y3߿ A)M^IVܽk]^!#ԩQQf[dw`n-ASr X#yVWSSS=::]m2Ta+#貚 JE1#ǎv:$Y,deI%}Y?ce<\ Ae&nw8*lYCÜqˀΥBL /\+c8;;g4 -U;̙cZ)Km̖Қ$M9zh~` 2)`f ak@n$Iz4M{fMFUjJc|~)MSR+ZN']W8#oItϢVSE0VLNXG766ujpH8\|FyccH ?KS, |Ţ!I,%ڹ̉|7MmEXd= 0:q ?] 1A<>S,P(R1|b)@YЖT) t>Sk`Y4$h5:Q, 93ȄqzZXno6Uj5XCC0{V%?p@̞=pw3J <2,K<ԩblt5evZώ؛/FL8&m6]wu&eGLsj!"Mu%0:*+t"3=to/܉ٺ{=?% j2 k @fʼnkVRŵ{|Y( ;. ~ IDATtz $2'IWqp(vnbwltQ(0fPJclcWٶL/[˗,h%'8`eH&{vcwn݂`ڕ+Old Q9cs2G!cެAQGuR9~ w}d|:v.N2Lo9ng|Z$9Js@H^k5f{ȽRW:_PeE &F^Fl%?: zQYj A/a2\J\=>,۾ Y⸎zYMӴ績M/v RcEι~G\5wۋgY庖354RgsffVn,MO_?Mf=/zN{n{ĥ=A b8y<|P&T F(E`8"VZd4ӌ(e18:Xgςf5~2c?pr|rYftY%!Vk0F/IGHu g5"V!$6₺{)`LJf0o¥lз;ϙT,ҳԪuq:-p-X"[8;qu#˓,DZ6vԚ5QKbG?wMTI)cw/m+v˜0c%GeW+qClT0gݘoD-LPcE[ Z&4vG;''|`,0? bl #98VAL=bγ?|9jXjj ZU8#2FY&pr{vv-2| ! ,^H} a׏eUFsARZݨm[{N7RQTRry&ʃ~  Aʧʹ8/: 6&G.¬E'9ȇ +3Λyגg9>ft:[qѤ: R+(OVz!åSjnW8 ABIh+lpȑ#4uU2B21ϝ/;[w|髹vK'OB$*_%ܗU''cǸI/>i?\re>p/cd N*Fj Pbu; "mi׬8>lA2ͣ@k `Sk7,&K?m^C73d8d^1nڮLte2b0xw!R0ժN09AWb2V([ҲsLOwF)EC_: kY;uͿ^@NU{=$v6 "3mFQdma{v x#-ؼrN<Ƭo`\m-\s)ұq;7{/d$5dӦM/0=5͆-p8x >l^ױGkAd'=F@{>>oezj5oy'7Wb gLNNo}C?A b)gwvT!h%rZe!3("`缍gS+D: I-R^īa֚\nǠ̑tE 7ĠUUj:ZFZ-R C0@{2M; ͙ZqnÇEbA^Ϙ,b1^LԹ|7@dٷJT#" ^rX+lcpBuXc -=%ChT50*Z-H9cĕwFux}"!0+Va<u>VQ5Kd㚋8s< OPqYNϦgEB+M5nr:\y!&ΧV#/ICk[JA"T PK.s6htt*00aPYڣKVQH˜Ur)JYtnEn-h4H҄dareRl cRs$Za $P“2֍)i_.cWK/E/E0' *p_N}36gɐ/я~Ķm L^oܢڼHRj yv],uQ:QMmP1%g&i;hYasҟR*̝NGFi(P7ѓqə!ˌ{ʵ?iSc|NqɌ%,QcDw*^̧/]u_*O{S Ð7;ħ>Ə_wmmLxf1|_^{mO>~cr>mw{lmݞo+Z{޹A bgJ$Ngth={M0bѠ97KfSmw+Md(+̉H+0kg_ *qKvWiE&Mfgf0A,ayÇٷw_)L!A.h&hQI\1ˀ4gH:L_W\)kH R\x?km9ַ(.E!q * M;̐%;AaSaKR4DQL7q7A5_[ZiejNRZA^ON ECK fgֵEڔH /q rb:maRjTոA*?>P/7Z`>F3Gۤ,!ɺY_3> tF%QѨG5 S*lVDe9rfq(0/khe_+qTQ_Jz~wTRq+s0Ad8{ Is@,R7֊A"'^r$/MMOs!"_+JN(lR.N:y |wE9ק#aKyLPʥ0,Vo_6JIηgn=yw߳~c7gbhhJcʼn;E 6lxnq>SSOٽ֞W|o?f}|_o\k-??7e/拟"ϟ{S7|ȁp׬gpr=0u|ﻟɣG?>^=S 1z<|PZ}V\Ɂ~@RٚZ9?gȀTiog BEVd3Y2MJB|h{oU~cεԩs RBxEBH  "4}[~-WHhz (B@bCHB <*W*U9֚s?s͵>:{5\s57@ys j$'Nl`}c>)zdnj~Gmpp~XкҒ&& 憭uX"Ґ5,s,wiYFG0G|asCr3E,|,(uS 8kƴz~o]MƠ7@#Pn\P"bZ͸FmQvb_FI'u{Ykz ;8njP uS5blD,.4@_/C82 2e++XqhtJ@#rhA=LvDY/0(w`yQ)1L3Au|bШ +w,p#N)}3bfep^i8Q9X=Pa%CRJ<0Z@z>Ќce+|6`"=+q7ވ%)y"@$i?ISy6S {[6g6&lyVMou]W=GA2kȊ!RdQzR h|DISob9KVWW~b=%Ja̴YE;%:_;cWVWpٳ/U^S?[nOz8y9 <'@+~^?>ܿ|c^#7~&<&@E|o/pwg݇LBoI9mPB踧13ڿ@(0I?@b1,< CUGD݇Y\ZJ/%R@@Yxa\BL&H) %c* d:>a4 RU3iGwspuYI;ƄZqC#ڪZ,講^Ą,syk#|cç9Шb KCQ,@ Xp8`?9%VH\Z,z3gKKCݻWba/ŝJ8O. :R'WBO&f4,($Ŋk\#cey JbȸD#)N}KB$Z g;CKg$b nԒ;8Hh71ogn.j\@0LASЇ>c|;$S<2D رtx'5[9݋6rI9[M# DpR47vtq.zU=K;i`0@a2#6 \Y&@>E1WLWQD׺{tgYsd$>w9ʁSSnde_[@^ζckA?O_iL& S>w!kcv=#{KЇ>$ >g~ ~wu]#ou/yv/[o;>.侗zs|o]w8t<x3._<^KN&,, J͍M8. )ٛ@^&!͑*ʱ#,4MR2WL pw3!D}u, ILu5ì/Cĭފn[V%\|bYrca4W3+,zL\l_9c̄eٺ.> " }Q0Ib{9F#% nHP=X__G];Qx4?61+R_k/QkIܗ>͙6?YМ婪1n ` \}i-jfͲ JPd'Ni oYY2{ZH$n.|},PxKP̂|ޜ/Ę*@t:v 9kÉ1s$eI&Zվ,qF{ HG\U] q3mBɅ5BYhB[i46uD(>B?th{A'1~y7){dK;{u.ghˬі!H}xx]d]ފq (W nv_=/+Noop/܀O}oV9s~?_/o=.侗oy[~~ '/}nO8x ^_|ŋ1m1nb! YBB}z6'/YO};IsgރI]crBp5jh*g he<`A' <e(034q޷{9;ܗ\WVvb=}D+L@D/)Ayx2#ڻ)=BΡN\WCRZt,zOυw4hZqb$!SHQ1" .i `\^Ν+87~c{Ї>z5FyIM49LʴHLXH$f @tcUp)3 ֻ.H1 Sֵs2OY^fq'rRn(CmWO>Y@ٳykVVVltqvoMV IDAT( Um82KXYYq񃘕#;щ-岼=; k ]ȿYh}?O^-d!柼}uˇ矟~Libji:saeeǎ%DqmӘK4n&*SDպPh<%"3UGWf,Gz d&x y( h42`2@).j Ur89b 9E&l[: 5Se\x#܁{u6C 8bHk ck(PY@^ϒu,/c -:ͳ;Xee'Y~ERfrѲaSf3p,402:s6 m`N2Y%2ΘFâfX3[-C41۴&w:ֻ+7Ʉ,1 $/4D9hƎY]uk>%n&-71L Qյ$ A\P <ۂ-+hsA:@Ά-3=`8(PuZc&Xvu*f0pp]äbs;8p(9zU@0*T RMκnpW݉rPF 3d.\*[E~2:u=MNޣ 㡬iPz' uLj5 kMMh㒢,nɀiR#NweckR)#5lP $:B>O՞Cqgs`PXƘ@p7g#pK-Sh+AB9WOɼH"-FԜ5ny,I@jހ,zivy,eCYzF)N1ƈd$If v%CҎ%IL5o9O;ene-ʀG!NiMo߇x8'u8s=ɐf#?ߞӍSE'h{KǨ UMl,d! YB[򂋒aVkL'8p0ԖThyfNS8 [V!̎ a?%2T-BIj)1pp#f%0o:Ah4]wjU&t}sIS666pcc4B%k*֨|[h\Di,i$zp|jYlRMO=/5{)bDșbEk#<&BZ *1.\Mq;M${2ʬRWƍRZ_oΎkU:1j"VN`n)w 2P5`(A`0hSe,MKKރI4{+vhcJ%n HiRbU&>6&{ `JK9'{D0( I{ qMn%a MŅRhPKҾ]2^8C _n8eO@4b1#\1ՠu$ŷ#,Nn2N.^&KC<.JoFNEFJf:smLqΏ-k;LfD( J"3B`Et䌳Ԗum99@Uw'Hv!/=@ 3H5FXE'`b4Yd\.jQOϏ Igo,ݟ#PK;QUYdFfwPݔ%k6anB%@8Ke2V{M x8mdY܇\IsZֲ'sGnօ&Ǵi" 6'3M\guu>˲ܒaDyû"b4dbXaJ[C:a;W%5aTa@Rk)y0w9)egB+KI~!uNs9of2݌#ݻc%rL!FK)1D&@Z) n(hT#eV`"{Ч[-0)~{c4A0@-gK>@0 Q0bu.lll nl?6Gcn @.FF t1!CWxeePV@vqy#|)y/vlN3Yho=81Z󕭗dATOmȀwN\;a {sɏuD(A0K.s'hǝgDhKH't_Ρ',k@ dm£%uTrrVk ࠭9{}w$;4㱬х"ӑt(I +̌:TV?wwoY9DGۑfmz!8ss'.ɸ ÁC9"4&D~0LqP1a= xps{C6F#e qMlDawKu#ҴM @䀺1a)K290;QT8Gd0hB,B1 12 AfJMĉ&~uS r^}(Y_36Œ䁲(ԣU1ا>F`ݸpu޽w< kWl%ʓO~a7#"&F8x0lj*YǷ"Vv}&#瑲 ,Io{kRj~6 GEquEQL1eIC =6cȨB}E/x~ڳ}B4?<!5ۇ—1bZMt! F[,|nPMޣ(K*^%Ǹ1-ạk`7d&v1$2F3;܃“PzG"jP[h0H_=DAuz:,8p DbcFhjehy\F2H Ef|R&L3;?p`Q hAУƼ% >dӹj@hfT;W[>1q[___@ w2(';Fe/`Zl[})YZWB[y*˂U&cUSK<ڜ`<"8WBM(|]߅t(<Զ蝣0֎p.skI;G7jKx gl͍# FISGh8ӟaixd vYzWVpωFDS6xcϼ#TUHĨ51j"vA z}{hkZ2NqںFt9N+rRoj"6IRU,*w^s琭-'6pbÓJT;1>|>*T: {gH$VӉ,23ccV`)spEJ'yvD&amanII8{Z ;^A5ZfUt4 NՀK]ε~jbzͳ,cddnЦ:'[RJCs YBDN}7/>fb$bx#ccsS@Z\Uܚ11Ϯ'ʵs4#•MS#"$7ȒB2c@V1/a#) x"nET&{pWwJ؆IL`:DΧlNˊ0G ymud@,l,Ce':¡`N s^2k 0I.uVG`y# !Y]]s

tzhSWxZΝػw)ꟹǙv,2e,t%rDP$x+GrZ h9;Ϯw3o܀-ȯ&K,%-j Wzv,a Kfˍcr#}l! YHWN}$V"SZLrZ4(L4srA̴ Dٹ#&U@GLph";,'6P5 :4h`EFɪ:oOb: yk!.YBݙ%S*)NҌԹl 6[/2]\ Ed V5US!{BxeG(Cì™!j%"9~cj"HJ#Y"$ΒQ1\Bl[,l N'y6:=&Z hx$eW[73*(x\f=73(%e-"u]w*labS:3J.d\jjPleyY8uk6N8'%oN~Br*"{yLlաZX4Oⴏ@hB;.{s2u3bJh# K(X>~h{t-6IOdE:1H+x枲::3/d! ir=,PcVW,S`b='Z׉6\#-uSd6L,v XYމC' k]PA0UpM$JޱB3/60PHpJ۬*v8‘kKƂin)8y(c9~8LIԸivn'1'n.׌})ZOuI~K(2F$fAԂy Kɖ̔3|{MȒd1^l:t\H\Sּi\#evivAjC8zuI7lܷn. ˦3d5``R.D@ l(j9692oI1`<3K5bLr֐㼇/ CMw<2GV$REе@eқ$3cyq#!ʭ34q6G6ހĊƠ.6݇7<Ϭ͵S(vbFzZUv>,45Fqf M_G)vgu IDATYݹ{<67FCWe{m{!%ƈ&v/ˀwgd|1“80ϞgflS'3cfa/s@mƧddg;̮3O1Ό1gƭqHޡp^~! Yȶrڠ4mXui1$9T`Ǩ;h7q*b Jݜs@cclGMItmnl".esqh u a7`^iqÒA3(]̪HY_z9p|꫱9T1qLYd'i 1"0b8*4ʚ;lFu=ӭܩR1/ fɘ ֹd@{f,CgI۱${ FE,QUu8͢)ט1ʽYj$M$J11|wby h.* {셙^$FZU$hrԂlԕͬI3[(-Tr81v|W 5v-Y~Tf2xs0B`ZM1XPQWaHTfR)&Ђ 7~-QTOkDmɳ 5f Rj*Tb6f>%G| q6 t[O'pH%QޣaIF*!ܗ&h U%q˵SJ+۱)i+pNB.7AhdPdAoԼ^"$3 ]W9B ʢ@3jmG88P%v?c<c2(#/MUnM>Nw#ls7KWO}SOBuHݟBjuЦ+vՓ65m95~f MOnw tҲ_2ѧҏvo|8/׼;,󿐅,#_SZ`GKFL6&e| 4ZRre}rzn 33< 8 4Nr1V3r8|| k1ɴMXn`9眃44Z 8cO,,jv,yQIdi"g")$e7 \"etp 1p@2i_5đ@GUC#N5#hQdf&8AnvI$sR7(]D`B`Fp1JaL +{)F+!:bā%G=6^׉@!S)},L,C"1(ZNp20XD D `Hc WN1tN:VL_ Cc ,t"ϫ.MN!F#Q٘ hYЗu9g}@f n 2F8ڠ,ش.'#ǎa&I ㌕3>%/^,}:OswUž\YKAs~~5GS:J1f@s\n :íQ={8s빳u@VUv%ɭ ev='gA*!Ar].wu)27+{}yu3P#_҅,d;9R(I!O[\+(6F'mO\iVUs~4k" Ʈ]s':xud7 `v*\;#k l3iAjt3 !Folh OL |'R%cm)+8cZvl|9:Jnr*'+̍"1 s>+s:1*v\YCu:I 󘽨Rw6"mGD9){fsIu9r/@rX\V (rˢ#B]թN=˜bQ̴ܲ?|Xqs 5&-{J]4XdX:1,1Y2h{ĜJ]lgJ/8+Y:RVcl;t޸M Q|ޕTMR~̺R{*/:p7>buue>˞lpg?1)Vy/7߂K|åiy2ٿnݸGiO}~ow&#xUW}/rرc5bآ-d! Irڠܳ#ɚʴgEALVQ΀iR  '.$*= C) $f̀i d<yʹe*5sN:UN8Txdp)MF-#};wR61SBD*-&YJsʜ@оX23,+7".'۬vB]5 KXjZlg]CAmP[6ld6"%R)]˒3 }fFv?ZGBZIyqm3c 18'.Jqpĉ9r&`ޑð?@S՘ye " J<V%)9"k '"&dc'iħF$LC-$6%,@~ e=VVVR)H,I9&UHXXIcty41"2}~3[f3 uˮ))HdKN# dH˪h3:y>|'e̅d6 Lo`!o@y0|C\w%Y*@X^ޑy?6r}@Kh< C)@Z"kfiދgXCKp1MATP{'}sf"BY([a]5a9FST:\ ?~lq=΃AA/H2ol]WHa 4(Q7 js9>K\у%&`mmw}ir  -i5hK"sݶdab4iK&:k# \K WU(ٱgta{' 6DXv qCNF/G  F( b *9kXN_ CرcK6Y-zN!!vl1 5|o'M`_W\p#!F+. n+g{<?\+?}xK^g<2}Ou53z9ߋkp5y.\gO y=~׾!w~_>i۟W;nƑ#Gg~+^}wKi{~³.}.Yg%w?%y)G|S⻟x%Ƴ.}._~ ÓuiR/i8??s<<;.v%+³\ݿ&68rQ{^>R\gpbs GWWT {Ā&{#Yϛ3}Ώ=޾Kfjl9ov~9}ø [}'OlwY҅,drLR3w "-{oY؍I5ő5@anF˲zR#A ai0 @Fp P:=%y+%C+"Fgcuu_>dv<5Ҏa2$Ϣyl'm7y2H97gNUФ=/݄~#K_2cQ<~ꯡ]??0&׼ǛO'w~w_v%vm7މy>v_oqݸQy%>u͵|⺿CYx]3x%OM7ތo;?o_?u{~Dzoݿ%_ _B_jѿ /xxs?_swG>~[k*e]J|'?in;t ͏ /7/Cѿƍ_x/3y)^w}7>~0׿ W7.{_>B|ӟz1j/'W2Vn޼/@Brr9mPBd &q׬:S|6hk(\]e"aW]ɔRVhQ*cp0p8PK绹䮛!T16z}E#Yl#uAdJ]f.'iB1zھI#\xcp$DB2ΉJJTAdTSuV7j*mɥAd+}KV>Le'$4юY.GVS?sQi ^(@5eL)35z`VGz(^hƄyJ;arUlfM16rm*֩_pf8}w]l9jcE#U=ƴnAo3 a_˲A `LQm]g` FFPcC$`&cQ !J"8A'h[{Rbgj$B@7kb&5ڈ7-gaG,вrt:m3۸~ @n^-#[E-Z:2^*W*a VwM7_'Tpdb5 Y kkk3 q /Ͽ\#4ػ٠4<;[O'`< yE;?qn;BM9§>y-n_h;މtޠ/?dk#gG3?JYe7:̩ʵE YAh2$w= 'GYpΡ*$*2Ő%]Ș$?PAB! a3\ppHvXnTahWI }SBh%E9cAGx 2K^b"3:$w1F7+쉼XH?YAiUt[Jnprb2DԈFl1!,<' \O> DzXYYAUF-`%OXVu=UX(>vvW@G3wCrNLQ766N`R&' J_bC%E8f["Bt"E)KS@8MTT(HRڵ JF8^_`%> , XZ^‰)?{oqw~߼3dAH$A)&%-MJWm[ײ?$1(\FAD"p_rEpfn议;vI ~4ل̦cLLdj6Ǚ>&Zh,?y\*eĕY2I bpϗs}wb͂cvH\76C;baƇ:V B8*)'I}1\ɿ)7kY~72#ϲ(P(Op<|p欣 x"R,0^1PS0ڹs'-\|+Wx_dr4+rX\WxժQ$)V/|)P'],lXZ]`z~y^T?j=?o)1V eO!"$D//[kw7?msfA5,v;kyƏ;`0^Z a Ai7MG)lT{H `=VP3Z}&HU!^)$WW[`d;Zy?Y扏6FSRPM`3c##4G,,.$y#|&2(b.*񕤵BRcWZ#[rx 2:-I̖Ιl^˹ϰMREanaxFc(UX<~&.\Kq@ e?ހ*JF༣ŅsW\qrۍއ>'YX9SUbTq+i]fa40F1&wQh)(a s{P.##2Ok9YOtTqU{ IDATtW6lB+b^<aYl\&0F!Pw.,W,3,@lvs>j{Y-SNlC͋4FE%=68]N2Omcrhwmy_TK =W]/8f{=Ν=[6-ˊua\ o/>SxCJ6dʦ> +P6x+R ߚͲ~_gr{ꟳ]؜^q[nW~s9>{''XY^?wٹk'^tGd<>/5\M`iim۶qi:G>l߱ݻwQh+w#رgyNmwʿ_Ỿػw ̼e՗U+W\[[W|#o~xٵgKKLo:횝cjzyM7`%#VVWβgn]q_g-;f?/jv J FaBOZ'59 9R%JkC Ld-UFp oGލ7hT8RJEG8/>3Eg`k꽧^q1?Ҋf~26BR%`.D-Z4/ ǡ5>6K.+ذj~$BVd9aZZI6Qh`JxZw^}AiRk5kƦE˜`\Ǣ+e.Y ?G2Y=OVg|d cH]C-V1eUtv9xGh[/Ș㩑m mӓ5={.HQL3_|/pf2yG7QI3fll;#) 6_">"~+ȗ_^|]?.b4F)]èD@6pR?KR&VhS$3r9mr_e)UXmq),}E(Ps*|F!2a!3"_FiJp߃ǦGNd!,k~ZְYA[|І$5W]^NSb@rsW}*/lo 8g>'9h>ۦf8s ۷mg~ymXn-Z`~q=;_/s26>λ}}~/+++DQ.[~,~8Ϲuw~?{Oy9=5<~/Ͽwf>?~?ߠިΏ8]ß?y~N5^o|Ic;hW' Q9  ѯ{uo|-Gov+׿+Əu_OOλ_;n‹ۻ+CҌ\c} ~ß][駞ox$:*O2]SV<$ uZ Jт%Hr8?(|O3a{/urkB "$D)O{HΕW\ӧ9;;:BF$^AIF/66OToA.Xqt,kr."lj'mҴ?hEl x^4D Iۃ*ښV+M>B>F>F{O322BΥ2nSlIZ%_ٔ`V zƶo>1(.d{F hrrb现Y 9^XmȄ9_rフ("DE5r`^0 y!J>'sbWLc`r fX>Z.}%;`gffN8Ad"հ6*pv$N2r njbǡ@ű{e.lOSua_]Eheh6&qLTwd_cy WYұ19[KbB^WR5G2NZ'o#F[8>硐[C^A'e1g8/f@tD9O-A)mQG`n{QZ{d{F]wO>sk׸Jrj5,w-B!FZڔoyw(4beɫ򷧘#<( &ڹaTnO]>XIgOx콐7fy?R{5:_v;.m߈s>zg?O凿OOt:ď$n%Gi6_%FFFnmh6G|wMO.޿17[^ukQ(|D!o',|)ϥW]8m!Sq,9\r1?8RaZ^Mڣ;tރuDFjMq-@jH YppG\F ǖ;ZҬG/ *$\p\{-ꪫK`TnEZ-XXSO<QxXX 5T=8{̉$5H9N1gz N =ݤ98fȐf-+ /()ԵעMHX]Yθ}>&#uP"[/7u(g)s+89_9G_ Dq18\yK LuIڣv8|)}*ƠC_y%ʫ{v$ǩ?Gg@{Mj3][[a]VUJ$0p/A߂A${Yɓp$,-N LQ7&"uZ} *:*(TLp1fJ{+ k)&/#7X 2Jdʉ$gѨؓi% s1:iNO?cBQΐG0bELic\ϲw^'wmέ٪1r2M 5}LOOl69V|^׿cEMk/)~<Գ]+7/q~kɟ~>> /ϜÀFΝwc_{{wq9j܅ǰt8lP*=}l6kt;qtUUm\yR&E֑9' yM)clnCB2O?T*[HbPw"G14EiMkX[:桤32̖v'6s9=8Ņْ@*Efi0_##pv;LU X3F&0_ϡx{0.mamNɓ'Ipc֟"EN@)tk 裸|Sj؄K5)V#(:z&Z* }uri_Ys0VUCE蜣Y,Xj-ۼ"߈9Sj-opؒ'xP[Ŧ)4&}VNGYi/Tm/WbxKQ;v,@8BE먑p5O0yp޲6d];.+$(Z[ w6UWsW,T*}~~s`K:LLj"HT,rׯbjj 5`JeHҼ[=ykX+Q2p ^g*%ʾ|%'EZ4L_^XY^!u *`a(NzszjqΞ=;XK? E_,u϶BST7fb5zC6 e\/="0eV[b!g+y0ӟ7{#wʑ??Em|kp;}/yq[{HEz˝-Ws eRO`[aBdQSzW yJVHv6 t(Z)j1؁"4Yj(9ƫt^yzyp(pTsd1Q &7,3T0wFFLAsf4Hǘ>OvI^).^JxՍkHT.Y qk"ދ  e3l[6=.Flz@]u!ȿ=G>'ꬴ,15jQML Y,<ᐧW]ja*$@mZ .x uUO,r|K/ bs=跾skZ}׍AE#iu! s+9~Y01F^ע@Zo.X$ZzFd_^:x9 s~Mhwxj&㻈6ț?={QD]uuq5|< bD E*qm|``eo\ upwXޙޣVjt:Q*U|"O3x0nʺ'WDuX*;z݄{.jzX,y_(, ZkHlŬrmeZ maƩE u">i.W|Ar 4;oh4[Oǝoz]юj23uYȒ(kM-޺DƖPINY26fP GpG<LEz8ZoaR&B0X]ʘ*֜EqUtiAyyA i1" nڑO`Z+-/lHҮRܻ|ooDEQ)Iӑz]HR2T4067P\Zط?Xd++8gZ( ﳸn,1;^Wy %rnHKҔVg4#Q&G gn/R_/c.uVw3 '9>{X~¼;ѯp̟7ٽ;M%TZ(0JS,aN/$A_u5ދ{}w{QIO,6P式FGDr.[oC]t!n|w2:ef'G5Qf,.Ϝm 30a|f49z5A^Y0Rդ]CcQt:]^oPuh1{nٹQB|xS8*h~UH +{|ömpᅨ^zkJf{u> pk3z5Z`&DzHA>Mf?Zg v~Μ[Zű\]A=c3"%ׂx_+vTlSr) Z+lp%-VV;wdtl#yƇ&AO&7onT\,fx@+n6ES.Cmi0AAD۽9“ӑ_8WNٲ)J(wԫҐ* jxY;+܎/r&VNAvuBWLLLrŗϳZ0Pft UyRT؍3o=?_\d"C mZQo(ưFw8|LHͼX +rE>'{D)˅OL"#Q<({7)=B3^a#2LͿ[ˁMk ˁҺ0;~_0!>U$:GuBdblZ@)8x-}z]t<_#y1XZYZf7Ȉp \?4%)^1(V%I Ǭ絯GwmX^ڌNoK(fƷoҖPr="W"ߒ"oepn3Q^ωc̯K@Z ;w.jX'9+\n3XlOz8|0o{`) $U{ASOgļ(-EYԙSĢз!Kd?##pA[ފ_}~8z˫#L/+cۅ';x 9" QG׵A ׋QZ Źٿ8LdAmqbm4[/忱8%⥤}QJS0O@C#`f%z>94QLE߸pv8^o̔R4M&KK%8 %G60g+6x`nxh0::"Z:ǎ#IR#UT%uPҸ kJ2B)Eޤoqߺ1mbK[O֨c牗kK!ųn"'iJaEZް|:\W:Kq6=51ŠzO<т[eɔ]!mUQ4V5(hCmjCd mUD.ԥd.+}P܂zhJh+3p$e .SOgQi ]w;נ}p$!tmjQL)+ ԡChg?!ٳ6e5G=S56~߆|1LZw~t񹣴bjPs]n\M[ئr&:gY.sb0NLs=Wc^?~죸GGqi*F++p¹sJ_:xe5_ymoN k LۉcqjQ4햍ė*/#VV0 ‹z=OCXL F^bq*0tz=CF+b ya )Z([,* Z\9ʳC"b]uFU 7.cyyYj]Ap廪[]9ARxgsbIoGl;ʟ~lK\ |odB yU Q=lsx0QӘlT &wԲ}r;&z\0_()W# R%dYZymHWCYفH "chja# *g9,3Ԙ9/=J߮ 7aΈJc]OE똨 =77ݥL07Jm*,-tС$"{ Vyc034= ssGowG4 QsO}yGB-Q3u^B# cur/&(Ck^e5G4kMf##KRx4+CW߼v9pKB IDATYZ4ѻޅ6nGr &=?(ia.ӬgN U ?u̍7: o6-ʱ6xgýBcwOş=^X(B5;s'_|[ea$#EuFGw022Ojvv6I$ <$\pa J/;% tTC#@ {p蔟s"7C61ኣfviR(/%TXЃ۔a-++cחrPg=^؞QHp[`(Z.Wh.aͯW~yvyzL$ioYj1Y9[̃ХtֵeI/3gcfl6]=|ѲjLMj5\}P&l#7!U=~yraPJӨ700{AV *t8|}JLMrƪ*rq+Z_xs Z)qҜ)qE/a>qݷO-"7rE&?뒔eS2k4Hݰ}3LKK"\X'C\.O9prEJ2AںQ& 7I%o/I0~2,A7&G5 "助M:$Y̦r^ عU 8xG{O/Q rS:V8[nŷZp:iZ^1)}AN~SO~B A_y5U^zhJ6|WoCjoH,C+vm;7iPNN:2ژ`1fO,a]ø?# QwD.C╸C÷$Iv{8nhcLD9jN3HDHz;˃s4\voJ+Y:~Pqt<"ϊ`0^6;-KʖZ-9O$HQXrQюd,|m:@*ώi%aʣ, ,JrUW>`_>e6WZo靴R\B e_P,( 3Wjuk^aC_HE(ۈbF-,6,+YMW18`d0^D>ʋwe濾"=yO8y\tITM_]@u>"*wک(2@V4'YppNFfdT$8ʄ!Qld|.ϫ%=C,.-iԛ, [z}ZTN9̞Whe0&1&W^K@SRk/ﶺ1z#GH^eY$9[ejY͠E. O}p I0r1G+ P|Og6e‰#,ZkW_Za-k?(ak{s=/qjw~LW^W\GRҤ΢|*ܗ7yUSnDo9[]*Y-!҆hhe˰[U+UP(ױMz->jgEd|w`-}V1ilrkn)kWgfP_'},O(ֻ^N];=[j^vw̦"u/.}P9Я{=K_c%gtq.%2fs(e0(qJ4מ',a^91w782rNʗadVUmm{9pŜ:uvEɉq%PҖ ﱙ+ R%dzζ W{4GWr8.&fQ2/OСԣ:fjRc<2Y@ɽ-u뮨Wjװ֒8v+rY3M&DQ! Hh?W-lN;p {F#-"zy2_:Nhkxv`oYڽccc(haSqG"P~_PiJfMІNhܐy01 R'1b/=!yxzp[\Z 7]wIOɩt-@I[qh4ƈTKbefttn-&aݾ)/%^7hr:|e^x!92XZ .E!2ֱ1wމ?Salm68fC ^eB̨bLٴK 2_zȟs)sO#j-hF63RL'd#ARUD= aKKGA9#v)عŏ ceMerNȁȕtY>4 )h?P3w.YhqfƷ-v*f͕N-FnNwUo sa?Aܣ/)T \ҤJ{4 -ч.G+-zC:{ŇːeD&f9rz`r/$\H.KݓOz O~F\kwno~R( m嬿B@(Zz tWΕ,\}5ꮻd+,31 hCT#eVU_<~1O+eˤt=yVȒ T x첃l/}gc7/GwsB1g}ee-_yv-kPRDoQ_.l|p3UUs^Wn)3`@LT+P%%n]Du(R"? (e+lD]n 398qeJi6av^,K8MU@}#ӧǶmhnx4Gзފ?uJsa]jw˧i֚X5 ́f) b>klamsgXqˉԁ qgNc?qCKks$YQJ̞DQT;բƹ79ޚe]<('P`g. 5:bzb7 +g_9-~n,PӨZ v{r|V6%M{d6ץWw8EKiw ;N+ hEWfmKß|Fʠ&1dֳZF<48I p揘~Ȭ%Iżr^TeLu|g =wZs6+r*ʒ3y([(%' ٬,4J+]:)˟ S* P/vS9d`VWpbbZ4ZVoQ+Y@Ń&4MYZYcpͥ]c7.fGhGٵm0m/^G{"ES0FQ9n %qNܑ#$(^ ë_6-V9Gkm >6ȄrM^w݅z{4MYx!߁'(RnwwJ)ըI1eL aRqe͔ IjQwgpݱuen-‘"w]; ctF@Q3 h2YD8v 5?{ij].'R8[Hq3Qlf Pr(e mHm3֜Qa*fiIĤA]pjN|f.% ט /sR:Y3'vW <ۅG?PAԘDqZ)s*l d ~@LuZ`@ jg]p5 T]_(8vy^l˞ S#^dS*mc8Zb +B¹DZ0RyzVUpg.̞D= 60 b>̟{sy(TִhCCiTיv**lم\{+k0ohl$={wa cX/HS#+FaLuu xpɥ뫫"{Eҕ"$)1ZO<=_t0j#pΑe= O;w4yI? 0ձ|2?.?zu"t襙'[;f"ZhEº6 c0-08NZSTstxW\cFD'25RP):yYھ$β֡{4 Ja~C]~M=#x\ʉhmBۋaTZ$w#m̮e5G/܂y!,{!YԀ)L~nw~勲Oe~ Fkd:.-E~?~IGuf&wѨ8L0(]}RJ4(Iڽj\q'DfYK8+MUx&uۢ6KXY>E˓Z ukQ>nu~ $fd0BRtj,?c9NQkX.u)ٹ{6X\\"˂P8ZKoB+7(&&&' N(v)&2(']1h/n&z U;.Z e(>[ct:Jm\Ԙ*ѤiV=bd# co*+fPXXX`}x9=lwZH+sYbhtG1ҧYmcȐ~֔c& e,yBK@ ljw}N`0yO~ }fgEz8'pqQ%掿Z Wlz|\j[wldm CZ tD.G%)ͣד+_{/#MV9;[m@=8# "oM Z:$EqZZb'SF)dL\ty/Ye0g"ɦLHm)-C^y}E#?#9T:x}F<q =^vo$dA܋e6mq|,"jnFt3j.c?Wz϶vOhl{ *I=B-TZ^/Yg/-(xs2U/w!c  j6#v@5:Zu^LT~)B}Y,^=KtdRj5vib?,EeD)6TFky;*iӤ v~_f%ȀT.P_^ KMzҾ8z7FW7QJiAXF;s0E X2V\%pɅ\[I'<r.}W(6q\osͧ.}rrbdt4M{0x:<2>RJᝣQ.Ne~Qd~Uسu"SJ2rh 7ɼLH)ӁǯtPҎLJ`zih䈰/O6 zikr.W KE̛A_wwK_X9@d^bŏ*hޓشd]F@^J/DZ}Gk '{oeqw""mj몮 ;AAQHS (C>G-l ĎF޵/o%b{Uh6)AҼSeFFd/~hR΃]uV3ϫt; TZqF=@!?~.$>dӂ`L~?4Kz5aUнw$J ~ qx^XLu SiWi O|`|+/%V_/30Z mln破 r@.Q7c0 IDAT%iBjV,hmPJh05elllehjJ==4_Jxu_sv0S###޳jJ/jo 4IIR ژ_˟K1ǫJݬ=\)ҋFLұU0|pL1a cc :KlS$t$`AYPN 2;3z(̳"q=[ BҒf 9 &'xKxAg-MV&jnlc}E: /Y >'yf㑑JFH=RLiK8D&qDh/BCJb-R*'L;B_]0&8\noѴAc{9Rr@{/g8 +!DrkSKI2qbje7$w1@UF37%4ED2^JLFnWZ0: VZAQP x|m1Y/y EֺZVjf}WaIv[󬯜e{ދzd(o~b=ԩO!4:@kC(s7 Bj*+Th3 sbQMISiK:TQu"qX`PBVo035CTQ?%cd.Ou!AX^.-ルFJ X* *h4ϽϽbhC^.䌱4v!{mJKVe%J~ $0IB#umC4GGA# .*]jPVW 0hI~B} k t0K)ͦBO =G`4(Eyĩ)ف7<HK=˿n[A2S4k6ŠgnOLr_y (NfE];Mqy9%u%}UVűch>++*? Xnؖa}mzIV%/JG}!"jnnAv\35_G܅޽u>y^no>MG-ΐz,/A$j,գد?;-NZi;:[jWg=1נry.㗭YgF<8i foWVZ(kV$(Y^x<6cP|u\-n_r_Pنnv?A8JsflmuWuRvETW*uJ[-Ep{Q;fEJ<-Y-Z-,gY\_KY @z8??Zu*A(]K}?l,Ћ: +ݟk\4m7AQrd/E(a5q33 z6IyTY.3PZ46Y_]`m Z(uÍ%e ϜO9ԄqƄOkX@g.ƛ#(Js_ ʠ^@vi)qKc"U^U ղmɫ.]1%FՃGk6 積❃\GR8%*t ?s:c}/mts=,-/cm*c4e&gm(QaCV$Uξ?ee[j{0ZQف~xM\\s:n&n&:g:v}7w榛n "fffennn~rv?βm6nVVV{_c=3LMMyCa|bS:a c[%33(ڴR 렰 `VTjj[z=x͜rtYCs 4&7v:a(a\ M0>.@(^7 ˟QPҗxH'ݔCiaLH,DIMN0F*RVT(q 8b3Y?Nq,K%i0=6%=V,y4P.ߏl#>Z/w&ʼ RQqV6]\w=' o[.I'VϲZfr2*_,m,iL6JaLJ<2IRA&gR,"0sT)yGk ȤfS$uZ_H(Sr=Q[ˤi$(>OeJ(a}$0hVw=¢ y| djvL6X]^aurfaS**.[';ywҙ?S>s[ ئ8$iR1./De4+(ߦŖ-n\[_n73Ea0}JQJT:YI8J]trl۪2g]щzβn"?y웏m:G /dGy8&y.> /0>> /w_+~~.>9>, {!S:a c[%?IњzNVcffCxAZ^Zq,Dd9L,Ty*P&1yF5CN/ᮻ`a".g\KMT*2 j@"5s;iO^\gR~_\ (Rr둤^(,(E_k81}ƉiQ =9r;^?vbu X|{o=BĄ%cgsQ恩͞"Xb$_pE}&צ!1[}ڨr]rZMF)4X_ܹW;{?ffc|RB}|'ac協E(y'?G%зaa\Je[-︎;gϯyŮ]ٿr(MRb3={E,=+ݞbLM!Z)4Ls(o>BYpA:Fj Fi=ep-BUUR4u:%cwEzIZJfsUVVVrP+%tyb\kb-ҡv~^8tHi=jq~-3A FD=&()ܰRc8X[[#ta}Ȥ~l,F[+\ٗ,\r11$ꯓcj|g\^Vw u^cL$fYX?GD}5נQ{q#~ǠZCC]E=+Iiu68r^ܑiu*` z(lK"u +Qccd)JԞ9g8҈3'ImJT0ki-ninb_Q c$bvLe'ba|3F QܡYM5s0@#MkgYZ:Nu##W_B8 }w7ns& am e*8iHSZKr훨3)FjdeN'X MZiwLNk\VC8S R /SgkZ)==h0O&dbvn?k2n,D슜sq8K\lA6z&"cgCDb~n#^ّ **d?;[bwժH$.q@Q/x892{/IҔGo??$A5[ąiRT8x _=Kĵ^A6/w}o]w]~'~F$G]>O3ϰ]w]woC01al J i:hMdQJ'&+%c`S]u^dl·4W΂f lvzO;6"8ɥ,ɹG6QJ/5ٳ1FكMw)Eˈ%Iz8[Rvr9ZmܩSyn0A><SU~epX3]€FmY:QuF7?ڎi{ދڿ }My[E&tmVyY5Dvz:]F/c_{ k0>T}˭ӧ`q K$bBRQ]4s=Z)@G:^e~#q*a5’Mhe Jw]bWOn(+R13f *|W5I$ΞJ) -OX{$؜=uWˬ|M9IW (HkY.vW?CWwķG?vE jN8Aaw=J;v~c_y_5ſ>|;vp?|ӟ77!'>01AirtIҔ $#ԕ4ťi8F9~ ݤ$n9`l`9I"ΏAl*>[o14*&˱WXE^iJk&գRoaM0\O]܆?n#wNʺIk 텩e8r˪& Z^:rIƶڔupz;1ؾu A|Ce LZ 2D|R`l\̎ʆSer`|swr _.?@?|?~+ miZ&^-.NN\AoCE7pb5ldfU@kݸ͚YMݷ?gJ+L0Ơ&fb@cɾ{ViPI2S|յsV[n5:Z39>3OP&IMkSc5,O;Ŧ+FѸ4%I6[QHĥw11:.NQ 1=gtL若CRي]~t:w59È7I!zHǜ=s+/9x8JXelluYp$J 7kF̜B0Z= su}>yPu^e;"Mm :kѽ^ϷYJ8JI]b=/tS>V?/"ǏgGY߿<|cC)ww͇>!>?|o7M>|_eÒ00u\2(5ӐK+K>7P!vV㍺ݒ鎟F^1>ᰩevf,..m-1n"Jt[EN;DocE?o" DgЕQ@g GdNx& ۬FM1(p6!#ķY1f*%p~D~O4!I"1|sE1(sK^H5GGAسFNJ㮯s&amXE]*b&ml($8ƽ~Off.HB2ВMFUkE55ŵXbJ5>!-Bmߎ6̡лv| _O> B&Y>!/% գsQ_oezQK'X\;H}z$8&zª`xnx_ysE;^:t5,igAPRiPdΑ*g ޏܜ,G9;zۿ ^S1qU))oGwNX%&>X4+|(kQqshG\Nb)z0əz-N [3o)%JO56+c u Z%W kA[)1rыDO GԓO.=ʋ;Iu̒ҢMY,9{5+! (_(7K+IJ+RDܕaKtċ_e=ʓOOO}+j0..L01alCReo-NnjL,w(ѿjUr`URl$QVP ~wҊ|)Z-X]`Gˮlq$*W &~[8dRi9FΝZ1Q$lSG/_xjeaq!oQ-EB >.+cWyC,E/N}*#X[aLZLgߗY)$W/{{? /(ׯ;fwO/ٿ?zwWzG}bccT*(bzzi0dvv>?'Ol6Q|??//[[a|w1)01{( u^6 7rsKKT))rL>+V`Tфa@vqAMdrt IDATY&Op\f8YKkmȶ˙d;OIO|',{ddʦn&8-qdjZ?3Jw}ws[w5K'Ct0K7:`L{e|EK}:'O H­ozn{'/+$n^D2FR#5MEFuuk-xB ׇ62&,I Àn+J%#5&PkaH9oI,\ZvP ~֦tkaJ kdbU$M^o^"-ܷw;o*8'r'}Ƅa-#xPܥŅ'}WQ:0l39:Ƣ.i?v+w}7YpH~ y)Aa @_{0YD|3#GpkFiaY9ºHjK/~QԁY(أ@G/YX=ױkr&S hPd5 s>2Wh+e] x=~<<,VtHs6$*\+c*4IqޥZ'j_ w ֮\ |i܋/+j<31֦$qk(bmBF 05 yGuxi+`^)M%Q  BU"O#qY_$ 3;]$¥) ㏡.ߏ~IߦdsFXō:I `[sZ[Ҥ_"{_ Ï~+~Z1<:q07~0?Cjw!!.MFmWN'ѨR &u)qң[gmc QV?tjsӻ~|mM< c hN@@RمXZ9eѷ܊zN­b~OaӘnkS8)2t;|IÓ$ 8T@F%g8"˯]m]ZKJQVlѮ\כ]) :+רm*cs[X[HVVg\2grVTdE?VA g}S)3> W{Y)u7\LJz7-zc埳JO{M͡fvbgwsפz9kdZKi=U5^> Gp|'i.y: ~֒@JwDzK_l0(/mVa]f=2yg=8Ȝn Q*ڕeTXR$Vz R/%u@+:wرWbdLRymT/r+mVVrZfnB 39qҹBN[,|ho*s7g[> KJQTHSK}Fe;Ak1w,--"i'Z0TWOZm_01?=/i+RQ9%"\ DxԐdzZË/i[Ǝp$W9RA@ k!]+Nؐ/>*=W^);G1=ztb:KRg%%b@dY HO$ڊ4=uYt95Ò'/sNԍ7 p^:KK|;-Ʉ6 T#9KEJV;9$EZsiμIJ`1jkn-yp'N J_y}ܶKMQ(uSZ 8ȍR9ʣDiTռ+ؿ ^SQ(#}t;7/}El;y>t?P #kO~žF_޴z}nDסp]žo[O/N}j&TBD'OLM`>W^ןW 2wbWWqE-&}n.+D L=(sX.QzUȈ^H"Pإ3Q>%Fuw;b@ S\6MX[[#t{B쁙S-SsNӄ v8b~VW9s,9~ O"JZJIŹa 畤/1GeYS9G$ٳAljVϗW ks௜0;?L@`8ɷ2o}>f0QK/ #3ȴc%sB0ؾ$/ X`N݋5G tL*U \ƃCU3Z[HӜ-ՓVW^Y\"~{afVXe0kXO.璦$Z玻jPͩʲԲ0=JRF]PhbbuH`*"M{rӧq=ꮻ$gwrR77 56W] ' 6"lAmwa.;Í [?9>EVi'&sq9uAp69=Hz"KZ+)4K(c;8t( GQSS].phٜtL1o:ufCaWU A6N>_l2ݹFuS{ٷ s,m,$'H}E}i)4:Զm.z]Yu2vA (jnR,.I|_>8,.BDPaf.QE=ZFGu>Y cP##=3;sṱ Wo/Y'j-9#ujIbAY){9 -r={]a !P$)rs~Vi qXTB׽;lWjðșR()(|>fI-@"(Ʋ^Os@_j57w}w]Y&}1җu?De,uh6Q##H@,~;$9N("LÌ&LŃ!F7ٹ[ɴΛ] P֌6aQ *då&˕ Y#2X~^?Фu'9ZZ>Y:,,̋îgU?w5M&gIL=\j6AiŅ,x,khԷb?Ȟun77w<8ϖ&')msT-"C&N^t/|ogÝ?{01@qTE aפ5L5 TA&Q$ _#H>UWTzCXժ0kceE@"޽53Q2fleEqq}aaO*PAZIĘ}$ϳxAܫ '7ă%gRi5b9MצkKIU엿D=[X;NT*!YTᜰiX $nEvloj~kأG|K~{|]~UԬE9BsnAkg^|*ѻvv̢MF} yÝ9};/{(ثcpK풙Y=eba(`v_, }J߼pm ϋsZgC)8KNcqÎ4|_< ՚qJ空\t8Ⱥla_%q9V\RiZsó,iK4x&IAy3M@.[aE QJrlm/:H:cc,-.ZV;x) 0ڼdT[}&ϲ]01a cߏrJRWj" ^#OVӵ<̒w'O`dCkE  3YCDc s3q gOUV@uR*qކY.ǠE.) Mq C$^hRA`V5^*rQZGT U^"I=8Y d2i(j37g4,MBu ٔts}4MAI^eC9k d$1k[9mHT8RR؜4=WP.t(MZg۶m,..E6?SW\ Sl?g^sDq$NI{Eҗ^̏%9z=Q~Ӧ ɱPFcLH$7υh- &yctxQEyo36rŁ$a9eRxߣ8_T*IpTNJHTq#ŔYA3cI$'6ap3;'ƠÝwIȱW}2 ]R*;λ{Y3^biq)sΉY2S=HvRm4H^띋a0۲|@tzV8uoaIvfnzK)=Ɵ}RaE^<3s̷XQK&EM(04nD$" \_/SI*1[sD{=;ˋ`;4Fe(xu]62iW*1"* * *Slu :Fe(QP*I=Mi*RoyNƄ4LO`}uD~ySY4kL&Hӈ$/A]0Ҙ 4qe?R^<5LNZ&J '{^Fj#6lqE˒K|"bBjV\/~oa>#(K ^B*Rw~a 4\zf8>gNd< zNދK~; JSԹcͣ,39^9STJD"% 1m 0h .-MY.re6ئ˦j(P`0B`e0rr̘p=s{ F 7繜wnӞ Z+nwXn36ωS(_ڔia34J8iQq7t;gM,US0heP sR I8LKdTTlެFY5NDMd#VރQXiy[u'^g.)\ǫ@͵z6IG$)5㪀_KYa`zeČFF;L@G 4`,u6L&5g9-˒ 'x ҝL{aGOT{m}_'kٜMɞ(-WML/`4&h: @.}iiXn!d}*M`uzMRkU@[QDd= Aju d1n%UZWV0՞\U_zmqL:$Qf4$1ShT{s6b=MúZIk+Rmfٵ|F̕~|n vnE/'ORV刳Îرq-ӒD{RQ+ttټ~K9x"2x4uMg?G֭C͍=H\b)" (mOS(2 i;q êdX v0181Cc8'TݜSa=ַR<ϱں}̈p1~m5i+Om(< FU* ,KƔnHͷ G~Y\Yd˄zέ;A)ogk'6${B4:86OZtghϋ!ё1v$MX'hۉRwvz>mgX^l¿pJLH9,Ne0ZQ%3Ss PU֌[ǶuwL&Vѿ{¾is3qYhAR›"0A͕taVb'Zj`oSjhcMѢeng,&*}FFSi\iAyNC0DsT-붱e9Fj19VxdM(iajIf?|89U FX^bvfOlX]֙p}M"ģƺ -Z+.䩜qV+^JgHSe)Sp)?Ibr.da쌑},Zx'hk˲ 5udD>GO~(5&3VW UviR5󎙵jd_jc;$7|U:mp~XSxbO;[s:YKg&s0ٞ(u1ux/w0 p# H_<|$YSI &kǎAZ'@֨ 8Gkh~:ɮK] Tpp$=ELy8JvWMN;˨j6ϕщHN ch:/e&)!^E (sLdvT<ЁQ(SId/|}km15[..zәVDR#xS2脆TxoCWSb/Fa)ym ujeGgk-d08?giR+ d9B0`i1<BC'=Y ,Gd3h@{n)(r8WʺƠP恇GJ{9,Ά=0°bN 0EkCϜsͭJWzdzR:i\>fz!}5>kfS)YVQUH:3:l[ǡac tHv^S>rBlPobIN̗ظ.4Zײ6Pfm,PAzK)n\ܐg(w K{ "i#ѵt0; }!2NrM HUefb0+fR 矙 Ksc6)%,`,I ok՚ؓ֜NٷLlbg J[It.jq,cjJ`nECCCBjY? & atBD(NPpY;='6Z,fEiMբJ dNOuīUV5Kd? I ⣳t$R8[K4XۄF <=)񬙝 UTm INJ5TT/+"T,đ>'%$=[벴)9eO+u&\kw}OTv e 8Iќs  gm̀ A֜m 3PJ7\Lc?>On2쾐M6g-7ldυ2ko86a~|@9JLWh- 'm<۲,y|/E\~3yZn[VlR9-˒\\ssyU/}#_pI_ϼjkwϿoyc..6nΝ;ٹs'<袋?t'?Iϊ`|ӟMozSuVvM7սo .m۶{{lݺ۷0MR7l 2:DUYj&I*Wtޣ_ K ^Z40<\Dgʢ" KQGԶXa1 hjY Q)/i;lF<ʪJ\L zxF= k(šEjS03⌉pûZuRBg0lY;"\MUw[1U5`& Ga`,[A!6ɫHHe[ #}h+l l},3dZ59yIֱ^Z30{1G7d!0oqk  |\OK{AQU^!$[Q Mg{)m}AVp$nq?AWe_[33G'm N͆5\{ NrAL6(vU  8 SU/,qgg9rxi$NXn/ cn .:E~Z)Val/LZ ( rt"% K+(`WHjjz1qG^ WgC)!YpXP7iu6N?NNT5Fb=E9Zߩ`Jo}VPE>`̖଀;R)@71_`aakI}}{wq_~9/| KYXXo}ロ=iDA*;f)U(\SE$)YǛ MIp@ehm0բVZ]k׷ rhmJNO7Bd>oI:ͨ ۇ?r$u3X7zc((ڂT2a!$md%ZVV;eIQV4a KQhoP/X618@ 9uNyLcCd333AjmI@VX;Jk"DUP*QzRg8&Yg9r<++Wz#4.ִ J 5PxU}Q>Oq?Ķf=? ?_Wk>;v˻~]<Wsmwp;o37-Vkս5m>;_#t,..2n< \O'~wxGrw{wuy6n8WUi&~~}s\zkpWw ݻm6g}뮻7rWen`ykG?e]޽{X\\`۶'G+~lx8r08PV <';*l>Š@{0  }m(}7VZ̍&*`0d0r<ƝQq&[?*TH:rM:G, 13;K!(6rQv\'G{UU~ы^țF@Iit6QڐZ+O359HV!sTiљV vUe)_zVZsIJ 25SS]VkdX}8_e+VNWjP-0>&EY3EIQXyZQbRk4KmIٛy}派«)M񒗾n]]W)Fj>Op饗|=qB: E>.2x_>^vWU^җrAvڕy~}-^x!^{-wNa<ٞQVHN@YU5k]g Nt`b; $^Yl/GR8TR=C:5:*3r^qK}MY|fưa:N-.`yy9Gt $EM5^luR*]D*|_o|`(Nܐ6Rgc]w@l3RPq;2c]7`0(+V*\4gkΏ*{JWyX'A?%}T^# 9LOOK%ܑ&a 7FL⍀4No]*?;8k89Je&)70 5\0 kPl%<[wsԑ!N,fqafgymwqn5QV+(UY 2-)!F;'Ɩzal%"@Yn;,/PVe`ZH XﱮJvnY^ZQTsVԮ 68ob|F.9VVVBG96Mҫ4l!TY%{[k7'}d9xp3>dqHkY? =Ẅ́p%Nuv:?(ZVߛ)ɳ(G.R},]ϼWxO>O'nN_iw?6mĦM~GckgcW* ;ע*T8F!&Cϫ֮8!edgU?5Hgӥu!uVmX$3q:^#0eY%4P)&:dzg1N-g@o̰0,TUu lp;_\}"vg|\*VG];ZKޥBk/̹0,!RG óLцN-P_"K繤۲yU}wm49nbw5- ~wR`ZYFimj*i_J䪲~[UrXDt߉] V6{PQ {9u]!7_WC{~nY\\nW>jfgg͛7xϻO}{cl޼RU%3Ӏԗ^tSxΫ_{wdǯ9vv;H(y;^%\}S馛x^>1^sw}ロ[k__رc<9?̗eG>>"t%p)>Osu}&yb;=~P~[xDhM;MЧ(*`?tYo9P. b4#Ry8~n֋kED1%8YawBMX]9CQ1ceXz*CX\QurR\VzK|響L *lRet]xPK1U҅{V>"΀tT)ɂgu2ݨërx{G%rC9S ;,[^pPF*8ޥ-Cۇڡ*v.4jV^֍祵u,`iyJ`󔕴J h`jFt񎣫 m۲d.1|!#䜤gD.ȑi4Jgx#鬾V1pTsݢX?)Ay"Q#rNxbnwR{=c9<{O;7yR&(YHV92d /jޱTiP(pزD{2i'{"O$+R}Rke:8J2%5eYTk9S%8ՉcЏh9m}=*[77'F 9u`B]7`\=`\i(=.jPZatFۥ,˔?އ ʄ+6\>7 X?O׾ŅE."~{/ٛ>>Nw[عo,t4A{wӗ?˿bee}Ħ͛y{/HǾgr׽᧿>裼UGaӦMx<9`Ϟ=3?3LymFkQ+׿"{vЇ>/׽uz=z.2zo~u{o{۾ d?Olbg J/lk 9!yX@{8WK fZ&{}O7<-R%t>Sȡr8ȑ#R/ J\!D5yzz*Lf0 EOb|#N^1ͲJIԪC+-~$v`T8bdqaETd7'JՓQB5##j~5#5%kNGhDvԇrU:''r_k7Nm (-V:+g:'AZk se9 0Zʕ܄(I՝N۷qr~{iVd&G+rG9wT9gu čIv(a%vÐ}Bs+g195J>͍Fhg-6lcGYZ^7/|1:0 }dqa0Wm ^u'1}j0};{s81->3)z^bPc/y6DkUE(4m¬?KNߧx9/uw߽汱_}kۗe5?U?W}WW#u]n5n<ٞS*$=eUWLcU\<:9LM# 8fSFx&Sg b1riʩ!EaAqTg&"Bs D)25FM55'r!U^X0=,Q^a(NeqFc͢HM5u]̆?Mw9O"39F)e@Wʘ lk 4'\Օ SÑB6:w=5>3qCT*2 &/h(!}^;g =^S 2i&>Hھ0ۈietdP0?Mwb!8O>;[s:YKg&s07(΀:)L&)a t4J=Va }~q13NJrTH0[3lݲ<`xz5X˧Up7#Cet&3NRL6%`2/ xz=ΕhKUZwh!rW P6ICgZEŮ](G5~=<|'M@22BӍεi9>t++`1 4WnZ|$:ۜ4k+qVQUѨm@ƼtV- -[m!oyp~_baŃ>RRUu7'L_W~s}TJE$eLi kEBnu(KOqs#R Um̑#Gط{*c1(h9v+(yz> tWw RD* m;:t֊AW>76TY6Dœeɩp;J^jr-Fbѣ8Vn]z)gJVSJjӘ8׫)Vź9Z`ĠD߰ƞ]g&~O>;[s:YKg&s0پ'LitBsQE.%6fT)/9Y %,Mh:|dյgU|(@ 7 ++=16ZK Vp!h.;pJz[&NjIɒ#bq^ &*`*V#SOڱr@頬lW'tN"6=HE(Q*GPExAT2e*#an˳Άy(2NCYyNfyyYjwRX!OڱD409Ѵ:mʢL7YTQŠ3UzX3wdzZ%@=-bؿ<ս5}\c TA'0sTbstn,X^a[yƱ'p)W#Zf27A|6c 8tl[ k=KeR=&rx+ 'y}P笤 ¡("o#U7N`֚T~?pEYR8xk!Th-5)`cbnfá_jU!P"i6U)w`YRF%O^`cye^~̚,޻1NTmh-hZv%*; Vw[QY br3RN>i(ԩźvi^l0+O:;[s:YKg&s0ٞ0(c{Tl֔_uN(ZTUj׾85}Hk'@@gFk-eov9b~J' [tXb-VJ4r6*|i89W^IY8ds+ɲK)}ݦ-R5k^V]3jbKf~LbNFz+X"!fR`r4Z;Xo ?"A1sIݛ6 +qq7d;9cǏ[5ƺ"ƍ IDATAbEy*tx}56H)^5C3OV)hYS jػOVryT:YgP 9x EQ$3+)"aNt@^ify0: X}h1mPTU CzHY([5x'} V*3xA/Ge=ʀo~0U/mS"Xmooj@Ap~h+*Mj;^q-5SEֻN6:HGL\rc*O055T~C:gxxDy{9o)ZRXk4k7!N;)\''Ycܡ[Y DV҇\H}^;Ïbt.k裏Eq6U_:jw)٦nw"0%a5k`"^g(("l: gU [֦FJ?ppb~+;Y!ϖv+-17lĞ-,d4kt'btvl&d4Z\ѠC5R>mUB<}xEi1:,ɱ\LzpjpJzoj%* HD_kMnL;o~JDseg߁#z'V[m>>t/ VRE;.հ£\8X ӴZ9a s+CL dFAv] x>!?SQgT^ 5wAG)I=8Tj]qh\u*|&Xִ6ReaCV< JCQV[BB 5G9ŰUe0X=ΗX&%,C_*u$eիЗ!3^JhUYK C.-,OZvSyIo[-Ő`%Q WE{0:V&5xzFnC3FDr>pz$XY+OYĺJQ-#V5Ziu}¢PQ-:!}W Huҷce 8'nCYYl„5!-TmsU gUVISF}½pX5l=dA^zb+Va9X^^&FbC(q8o#Q~zI*9JT"?c0c\q>d M`)@8*XZ\j½g3NɘΞU<'nRRP2YKgOlb?H=C5@䙈evR$R_ OCH7Lzss<12hޟR"ceieRLJUtI$(jzӳW:3$(XĐFj L:c"` rP 1a:,Ʌg1*u>$*7TlcuDt( Ne FMXެJ8S1}4t ~@`D_@3^@I!v$]T89C"\ % uz sx>a| J^Zɲ k">셸&C:ַ]P9LS 23AJ%]nywXpNZdTUJ闼_RNTqG*`0HCg *]CUŠQ7ypNr pLsEnp13M/xݬɳLz|u@ǺVYLQTy?@LJ Ǐ<ۿZ/%-l&6k9(m:PܝPH=\U.R5333 Cvt2?p72$Ib:1@i#fg!ґe-(+rxN5E=z_AM(8̋Ua#E߶HB:(ˉcfߋǪ$v5 DHeK\Q‡@=3ibՆ A!T'](::QXX=zjy=1Y1D;jw꘲,1퐠iwAє;e@FAlFxPF]zw[rL'EZ= @HN Sf >9}34\ATV}3PbT[)@?`b}*/H a\: zpҾFJ4bz'8b6meF?~ 'I1hP CJ7eQQ}1!$u萍Ml`N}H>]_7m3!F)"n&F{rΗ;iZs޲?EcMwug,'Di|i`?džoy{zfK<SgkZu;M`~LÚjrFBjsHd:}C-؁@4EطG!;i 4&Ɂ[@{^?tpK"}fX,e~{3=xHGNU0'f iۆE{ %LicP DO^ޠ[44΢,FP$bʅ$MS˴9^[U;D,ΕXtQr~ `-$!ZkO$g9&6զUmIP_uѿy?tgY1f0U'Lj(SuiCbFz}E2fcbaBǔ )ͷ-=tTCZ9UB8+4fz^fktH:\pVk*9~ ٌPho5g1&mfbfU:b;%RhnN5M%* #(cȣd)enć]hVSÊ:eXfRrsh3 MvWe[!O6QI\w%Z0Q6u6BzCIM\|{,&S|?;v״̔&,gFQ)IHm;::R9c4^ݶ=V۔CO>#O>C󷇙{K_s$k/Rݮz=kGQğSG(~f&,wnԬ9Gf2+RF'SP3#30^)>;S G`$ƒ]# טm~4j͠6m͸w>MYX"Jk8t?a<\SbLi)i72rӈK,~Nb9]G3<0PKBMAgHg{kɈ>r3jM0jxKLګ!fFqXtq)ydKǟR}E ^Q_3 P,ZՆ.g۶ *"(!4>k G|5&vV 3|0$̓>MӅHڷ1P_#"sO5V}ZۏGm9?襗V09ߊ? TxW]5tJUWi!~?n/qz c>cD._ڈM {s;vrMKzAu MAQՈIL/π֗1vT9kx^;⌮ K$t"{coFYԨF+c6Y1Y؁eyDӳcDe͔ȉKnHFcpoMPZgcӲ!˼ /@S7m&mo|[bNu>%)Sޓe I Ymv4^B۝x߲GK"4 vH`1(;tMs;J֎4`}5]n8tn qT3k=1X56Fٍ#Qe&6&Ƹx96詪:7PH KG/d +4mza> H6-W{;mqs-ꐦC}wit0\?e7gӋƺLkZl(hBQ|V+]Gw`;o Jo7Ա^:ƹGu]'U4 55X#887=h#u5&N m!;O>̷]b+T27}͙ |: s6iB*KYU'4tN&b}f$yFN9R$b;$Nz=?IAYHl\p_V,byjcBmF&u_1j*wO;ɱ}}~ w 1j jzg h`1ְ8Z6uULίheF(Y@hTrfu 1~1 ( OI6'MС6Y1 &n83>ZG.: !HQբ{687SG&rHbboh^T!BHGڙVSG1" uKݤY%u-m髣%A%Bj^4'4y ݻ!hB$sߩ4s@iT:6MC!ໆwRU;_cұh:l~qV]z[cxnf !4^DItYEXMÁ?~ݮ}ʲ\]Z{[9h雟gPZk.`;v7@i$%V6`+ T1j Ac;;pg/_|YlJah?+$M\,uU+KZHy!} PBTh:"!8痭wЍ1ba1_cPMIqalSkhۚ9R=Lt^*h . )Ѡ]ueIu ':FOy31v2O=9]]ߒ{ҳ~uS@I9|#qxNw"Js3T2yefg8@53M9`[m 0?ށ*EUGN0?hk0PeM&D]&N{&Bae{{$u_ u^gwv۳Dsw Ix}ϡjC+4?#ќznRvB/y{~l`0ڦgLn@&5sk鄦𤮼82~fqzIuS i)pfq18!l>ސrqzzzrMR'Y~wpft,ѽz_>`D++}ߖ{H=vߜ)9(j>0l6׫$}d?YKOQH5>nBc>ES'؅[! /]xvlVД Gu00?Q(\aq]Q}a>M3Ad/RzjbE0jޫk<86M!QUyYVk?el$+tkcr2P39!ae4$ǁˠm%*[fi;|aDM{`4:nضQe!=WgFs3O7hw*{hs0^UN>]s:z,I[yO@y/ɨUKLBꊐ% Y{a Cuۮb mEm`2u;D$I(k4ʢO9ph- sF0.8|XҶmkv;=1vxwl@g=E1:1yuRU?@~]6[s`;/{'H $s9~#~Nk Sc"2" ZߖC.d5Xu11y uՒHIA%$Ee>Ksha!p_~A]׷֙m[SSBVC5k9$ b,nR"*K:o''*@sL(sqjcZG}T(() !9IԳ5voYO_>BJUfv`>;5: jlN肺^z&J cmD%'YCck~R*(n}G6th!ղ 0d|N=R$ djtĠQZ( a e9u/ f˶=0nQ]ܝҦZL =,(JnWPTEs jł%ƵmDZ\[NۺQW086y}sv,ρ.w&+kLK\]]ӵ-Zo7=Pv(7*˲ׂ!⸼`lHm8x{sX_as<{{yJuidW@HS-haHǖD RN!U_+R#tzՓD3`N/FR"bKC#>t]ǶrD ́ JG,W:I牐IuVv?ΝNS2Q9unO 846_DIPF3cDv3{p ;&\0 cO9_ |yIZHN0BO7].{=fk lHU8Ak _A^-u߶M "L&vݰNOqzlOc30ͨ4o/arf އ(=v{ߊN)6i٨::s)V GmXwuNT't>;2zc>[RNg<_Eu|$]̐ҌOKIA}"a!OB>5#EДLn *2 %G$p#161#2e$сS4|1''lo ?WwTɁ-tJUUt'DsoH⃌HJLf@`-6'#7WlhF`Pq/ϤZ, {G'=8e{c\J;W1SڞA 2f1)aѴF^O4\^G1H0NG$ٕϕvK;4EUM)9WB[p }o.ՏziT4jRAg>9>4M߫~(;=<ϗ3C.:|]$@զJ])e9J,8R/YBǏyS}fzֽ+꺮|>{O@U{Ο8TNJ|ټuv`;o˾3(31pXkS:ov.,oivqnS7fTLrv?Np|||W~`/ft.jGUW=+F;f- #Ѓ+ܽ{FSV+en} e.3~}C,$$i,:˅+֥nw~UyɡT?/1dJH\]_aRJnM" ︸8'DKZD4],'5Ξ->I%ɔjŻkLV , k<~gϞoxrNŒ._syy]=Ї~ٌ'B}jOǶ"W7_(wݖ ܃R2#RE^({K:u)k4(mNdJbξR?y65Q flnҜ1&FZ4U5~azB!sv?l,Zï:? ̮ s0_F^;a;-.rw Ҳ wk8Pen(h?y-źa}gF+PM(,8bA(,DhWkp,m܂mV#:#5qG ua:2_F3P:H]7e;窪7^;szft8q0<[ntc L CaK| mHa+]GaK &D(#U۲n} pVƚ%pjS*bqty~ q8(v!ݻwW^iPVwwEInl"` e9aXpuq =H"@4@ (n֨ܬ*D,hNS}SJ]1tN{HeKKic$FjQ/~^Z|&\ݞ'/wITE75'hmi.Na:w Ĥ{sڻN >D Һqgkw&a8YNu-Ogl`tovlF:˙ 4b݂eqghCE]STA 8ѽł:Z?}uKz&ӆf,'K3>~pGg{t03..WqK.sv-]7T+Y+k,8&v %%?w ;{ݓ KEb: ņP m[ tDl8 d~/xq~ͽx';]>A'Œ{p _t/Gݗhn#L:G;kL4XN),c[lGۂ?Mǂc+LCU4jC`sY l;nF8%?6V?_KJv`;b1(+mJalYibTܲ(ֲnɝ1ƫʐ.$׶EO? ~sj CĀu㣒g_Vmyֻ-L]U-!spچM`DŐd8ghCWW7?Ջpu[|$-+nn40(~Td)<&9ӣC /R 3KKe:|6f T t1ׂbhI#lyca ^*C܄ڷ D+5"#LdEsznLǿsă@Et/m531tjŤΥүQnH XWEY0rYp w^D3]F:RlZ)Y'H k/z:SS{at?\k6 ˆ9~N9/pٝ=#lɋ/׬7|r%Ol5Ie1k}Ƣ+dٶce#; )զ-94EkgB3Djp`;v˾SM[fv)'G|՗cqx߸'<>1]0!ԏ |v$b%@ ~,eh(D֛O_цZ(IF]r%|Rv5VJKrl6CDkXk麆vJMdb |B'FOK !Plw;$BQf-"kQBuXc6[okZdԔ]k `̄tI9* HX5I*%I6MY9::f}zsŮZv5M7+dƬq8C޻dB%TZ#UdShmO2¥\u~*8X44BM`Ux.S&~FIlg*]z ݃ tw(c1 8S0p$͡Tsb ri):$i -u._㯞Ӵ[9'G'?L [mC[pt %Δsvfղ\DJ1H4N#=<'= /WlX̄73tÏ>dwrFiUK&䈣{gj IDATS)SǖX0t80KO>~,;Jg9'lLC#o2E O#o*6[::'GDtC"xhyNx7hfPZCK{yk(-םg0i}zʕDSc3qŲټۀ'Mͪvη5I܋@T_l%N,Lڎr&gࢡ0 ;vo1( E( I!u0"\__+ߒR:EYdx'=tiy97uCY&eR@*} h>_u{6lCgЊ0N, i-$đI>WP=\Eɢ30mt۳Qy\IŠ Mn1Cʳ020FxMS+ WLp#.1ivx5502KqwSzsGjFik+WpS\cNvL& &9rFaJ \<'nYT9} ^ް]^P[:v !5*\ɤ0.9=ó_s!wOr,6%Hн l.ɟ ".p"WAb6%YQ[tp$Tܱ7՝%5w/7Գ;ďN؉!@L&qDlNoQe1B* 5m uGι`m &bjZ^+vW?|wϸ2T7[b ³,0tDH.^5nMK[7lv-j SlήmkjuVq Ca/B1R:ڳmiwk&nKDÉbc \,8idjK:jTNheEÖ8kE8 ̴)#ԍ: 86s/-5P 8͎vVllVGh;͸(iKk먻H M%T岫y֔r+^m# !LViD 98hSMDZA X ֤g }`;wU'P^UK>?cFǦeHGǨێO} >kCtvQ$~ɘcJE 3 H}b"tN[j bx;u+kTƺc,m#K4[ι i,0mT~g΢bMIQk96g MڭX߼k+b|Ũl-44l.ń8YNRj".)E/xy5/oF恶kVk.W|Xcy#~pvtd2gtSU; a+ϐ5@ >DjS6'c4jsnIYֱam[+6a}^}Sol{_4[k]uq"om>i.(4L b %%n@o2翠Vsr~ݐ$W覴 az~zsIl He>x^\(ǎ0q\'Vp66rX `5%b(bN&t.'\.Y9pۊ O\͗ۖWU5ѝSE,w_₣O} n5/rn9ĝb6Yp8E&%{n3 Wp.Lӊjcvzj/5̫ɒb%G*pz}i(mdRr4{ƣq| )s0k NjulwSwoN8-y]kהQu2dgPA7ŇՂG/7]8/LKwǶ>`N^zcw$ĵx>eނh6 "Nezw=2lDn@:I/EEtW'k8z;viߡ6UY #}HT %#>a>Ũ(=ᵜ2qTcynH>> >tWQ96=ӧWװ^;v1fP#!9\{5?|gg|g{ }Wb!$2{;mDG4>H_M3.ƼE~DٴNب^{>|b/?g>7x^{A~3{Y.a:u7~-޷l.5pt|O]v1pq /_Zxgȧ?@{/T%k'ݎkӟo31FPzW R3<GNa1TW5<}?xqo[>DsDqRb65|}tXz6k=1 J=HiͪpI)Җ8q0'v]XmoHhuͦE ErZFx+,,1Dp8IEBaVs,XL Lv3f%Ggf L Olr :PL^<cM,̼y[][t`  ݔH`1#L v!/GGPeY-AAl@2KVU]]s9?̼y{@p "޼'{ncV@V72xf if7P)3Rrw,8R\(Gk\OS k)scz()YS8AL Zimo*KҲ]BCۈS$t#Zq1nK{%6`{n9ELcPQ0V@q2n DBdq"C$Zc :V(66āy/:udp"Yb'Fa(EɞŴ w"˖1즹#01a ?(M5`,ŲR8I*NDvd>pj Bzm`Z >\jn%ER,e0z= ǏVE|Onm z\k=h$R焁U:&;O8Oσ ੧~`]a?݁OHO6:O/cl"}MgQNa]xxe"ǥX,:NavBĽد|E,w_fNOZXG= z=iȵs(ix:t}y9Ǟ'v !2ekb޹}pnÛXZc# ,nNJ%Y 8zP0>*KmB  wp:ܾ ЎcYX5T!jKԎ"HS (^ĿۢP|8R5PhJd؎ҮV\9(V43`! k@yWq=b,j\]/I  ϝ8g˪Qyi-i !TuoI ,ʯLfIYFicSSWCW󟇋PqjՊ%~r$곟}׾8g=yOMJ6yNrʆS3(=3p._W_(X,266N/Ԅa8h4>z9u`^{ {6\ ۤ"jGfX\cy:&V*)_`e/<VGbO{s0&q< O6 tJ)0B ͽW[M~}8|VzV31Lo  –{LۢVS+8͝Glm 4| _,ʹ'}RL 4& ?/64xk+J@2I.Ũ*uRJ98htRbSk5i/* 1S m 6_P$igzd|lڥi25ydHO&1Uʎ ${:+HsO:S/z\]TP;Fc{' DvdڽX Dr~{O)lpe8IPxy"aWa*ܸ..RI!Գ'П4&a6Ehw~@1_(e =cZ66K/󱏣~# ^+GCyjb}$Σu3{.wwnƽkL1=~PjVi:J+ӑӑ[>z$}B}V5>-2B a}_rD]/]G@mDgk&cc$'`MHo84O^yEr8Izb{ڄƨ?%Kk&Pb ȵg|\̄Ema2F95Wy X*x^✃EhZKU&-7l gVQ$YT=ن۷?tAJM{Afkf"<"o302*,2񗿄/a\~lS8VT>q vcxm xqwX:x,%,Ӈq-:?sY,yPf6KK˿,ۡCšJpM0ucW"MuQ v`&]{rϿ~ C[~|n2אܢ^cUg`-X"W!eq}/vXʪ%9F2V&uȶr@Ó1yē01a c@)0:$o${;#lW ‚@r2_O Sk>m'r\@{ r'~{ > ~AtZӻôZ+_*52(+v*s/\;Xkxy{WO:.cIywu8\'w=! M~sԏu51VZı8&G I&AS)v(f֊N^`66)VHR!+5/mMHc*NNکg`XLl_A"{&RNbNkB}2ɾPV}f s OJg9$`*QSȁu E~*dD7?^MRF@F M<雜DljTtRs8VNm`5N}lM߷;W??SI01a ?|It{Qv~&X IDAT9b^BIښ0?gHI>%i7Dg?RIlRaq(&kow/hMA\. KbJ#nR8.yEC0q,ca''q֨1Ө Oc_{ 6aLLCXu nosZ3|D&yǘ1H=D|>AMN8w-`{o뷉ER]r`j+'$cN8'W*"<( 5U e %ixTɤ?aR0g_0:tZ &X'$ REhE_RYٔ9M2m oZ)8TiM&aMc[*QHˬ9*oOgh%R_ԔrLl-|hZsdT&vj>I'!~$-xyN0m~Xc% پ 1& W)pUbd /^Jo7_|__?001aǨHSR -`⠴ϔƱ'0٪:'*edt} 5RnGgfg%Zz"C.*a8Ғ69kI^e(ȧ@)$RHW eh{[d 68 JC!>(|Ff Q# ;q㔏IIVW 51az]ժ4( =:*GA#s`i U p'R% |kMv ~Z#[YK#t;ˣuK" R N@]x:[X+1qKXavr b&twnOMOFhwYV~+N˳J]7^HAi*%{e%SR]?EX/)%<âfC$y$L&a(JTej*ŢGsq]IN[[kw(TIg5ܧZAJ?3lJģ)ﳡM)-&Di?恬M?j-?GJ(6yhIv6avHFctzAT<"khv;z$2ǁ)¢Ib|BBXfQfOQF](duv` W0g<|z>\%huX~@Tr`R0cE5Xf4FYǚjU(5(B*Tc-\:qk0=9 ###xluyo`cc qIze 8ZL3VP ⚌Cd-mceeW+ygyﲻMhbb"LI hR/vV8qUs]9GG'eV0!ЉY$TeBZf/őBr*J.NRV+b|,-aR)6YR-%)+[tJm.a1 ^G!C5j8zsO=͉'Q2>/\qu0B]=qN>3[\W%a;뼽|^̥Koqu  jYl6cEtR6ZTd1XtXK7]gjj7xNKT|la c0{q\cQu10)"W98g*I@sϾNå˗F ӂc 5X}`##LSzln;Isщ<̚AI&;& `lTشt:PFKk\{ajĢ0L52$Y (+LRgg3㌏2|CnO*`~^G;GR#sDz0X%GILLkP.ܸjel(+:wzszl ]*bNiwA@u ^M0iϟGgc) hjj[7n8ρ47Z{6o'ַ#C6LsTJ sD-*̘M> "X[hDd6TC{3 =rK9|pr[C`k vm̫o[XmJ1N:8LyFEugw_mmmloJbIf8=3'bEyۼ~uv>$mq(d @8rxcEgq -y8(Bz>Yoq}.ܿ{u#y^Z#%]lP8 .c#!Xfnl5XGq "so֭;e?ygdbc@9DI%SVnƬk+*Ze%ob *\կlQR ܽOϿ~xQf|vO_\^&M#:Z-18DZS51s/wt;Jh|5jvv!GWAgo1E%9-.ʢn?!s7Gj01a,Aa/ J$<>b_iB@XվB*\Wd|69AԢoYkZ~q8h]zJ]<%TkQx%Nӑ-;}LV(8>. Z< hjUR Dq,`9OJ"'iwEJF:|09%ڥad$"AחA`|"yTSP طbx[c0&"6Q_[.&'d_Im%cq %L@Pٓkmam4(<|(P=\ՙG967kl-SQڭcErVTh؝vwjug8Nc^~aL/M-R瘬̼g߰+%྘c|Z-nAMe61%)mScnSf8e HQ"XX,mZ-/;wrZjDAYc1Bi]}= wя7^vwP]uX4FG.da:FcaQߥRqxK_%h6rQԘ;"G.pt|9㘱kTmLu{hb L)UhΞ<̽uV;Mla:Tk:92?Z21~^tQFaHXdjMptSLpH+N]BAk"NZYXN|)JxAYv f|Aݹ|sɡÇ/Om=1a cO J4 kgGDWusą*i80)0F9Ӗkׯ's~&I^Fn%iR\vW\M8pkWebZi8>]@رV3 dʽBSUqf\PoEq{@)rcS,vxk{x7qV߆{1bzB][y4gLQ)=G+.ǰֽ1!H ׁZgrrCxI.Xu7q݄{8.v :ĺ>Ej49rxhiGQYhgZ37s3G Os %)]s2A{bBy^DmAmrË0 K ”J8o]1A G'z,uA&'֖8q|XI&#Xb59w'fwvP]MN{$;= 9”j AoFݻz>ߡ~a΍sczV^gO M") I2lFyF&/x?R헾n01a cxϠ4αJi("N_LMLy8*1؈Ɍ>-y4J,*gVNcRPINr`TÛ㢔0<A&CO`D\`1Q:uQ_jD#OkQ%eQtvp]/Bٴϰq"9Y/010JE6c1;2 }麃% }4Icr]ov# kJQ*V8G;jvBaFQ hw\!J廎:p@jݦx,+u,.ƨt _TMM[(r57q${br@s bvZlR aPW"\h%CiQEcdx^?*̯<Ϳy5Շ6De(#Sl *{zops2^J!Na2hhcgm K<³/p2.i51a@3Qr,u;[w:4(N n!VD4 n oL9׵&M)[˦I11i#){@l&Waj *{[Miȉ:f&eAql a.]贈8alT9=;-QsG# x V˸g|iFo'.bc01ޙRɃq BVaUh+bU̱=# XÎcL/q(6'4FP9٫pJvBDNr<:v"ŶP*gPUDv^I/a]zbu: <*U~(Gcì8WKY'0R7re p| 01a cw23NJ3+@K\aRcb^|QdA Pz=*d^%+QmqjAéuժR&91$rRS(Sshohk %Li~IBEvTgOMFkyJY$HqU2AKNӁ48Fֱ|Ҿ(W .>ywbZZ;_װȞR>DǡLӨסg'3ڐ. (X-H9_G|6 ekV" :}.ϓbޓt@uX\HĤ cZ{NnV)v=T* ` SDfeWAR:;+`SEY|exlQH|FơyN-.pAYm3~{ҕK5T+}=րqqmTXYđȺ"Zv+ ;h\z;o>XA5w+UNahЫu V(hpHr;*!yzuP*zL9|8O-,rR^[^E=c+TnԱlB`BZ z](;4AthN^ٳgG)7(8EX-^E=\E?| i=O''0_|(iwQ=y%Iѣ8a2wasZ'yqju&ݶGFYX==+e|\̃\ƆZa(@"<~w F$cm n5Tp ,,{)S@*o8n=֒Q-VRbT(H重 X_0̝ 1wnߢ)ʄa8d:XMhsRxTb:OGױ_smHC>_~ HRqXF$2|*%,l KIG5Q$y\yVzɻ7J%jvؤ8b IDATHڝ$DEi(œ'$QFyiޤRoR~;wN;} K/0K8Tbdl#K3O<+D/_TŽ`":qI¥C8sΏ^A6wPAp(3\<^۸?!W1qq.8 # O"8y<Zp5v7@YN<ơSO3ST8&zeM$Bjm "㌏$;{qa;jCl'^X9Fqvڵ2A*Ԩ<*&C>D=JfgX߸v7B3Ztp 'xyQ{57PM@YG^c9Boj^F7R肇k V#){;W'1ZzF7KrI@eq,;~ {p37ޢ~6؝m硦`.a}un~-S1j ŃLL(wx",̡Ke/,j~{ݣY?&_xhfs8p\j{.VEXmPEolA;+GkX+;jg:Q4Qr5]m4P{ ,+wp{{[Q-+|@4w[loﰽIդjnu(}\ס:;MEE 4PsssZZs}\{J9JBXq=Aj5ڤ%Ľ<q@(GE& N^¯5,j evjwMVks?khוZq'sM\&{Ľ8G!6rIs9Z@kQ44$UZe9瑗 &;\Tb^(P;(;Ģ2Ha(9Vr-WrIv7(޼Pr3kz:}Zo\_;7D=J5X1ְ]SV,S77"#{V N?du;\9>Ss<Û7y6H0,:5rjT\1GX _(R^UQXd g+mQi|jP (Q -d}Ny0qk\׸@B*5eE'DQRyr}Ǭ sgᕗ؉iᮮ|/BXϝZ-1`n(9]VS`_yEn_P-K;;ĕUrZbv06|j ||>2&q˰ o}ſIo‚lX%5 Y*s21,dZK`0ڳ(m/6*qJq>;MM㢝sʩ14FZ"(e)SkExLV1X|ꋙѲ'DWkl6~g):!Usjԉ/1`hE[Ip ?,rNj=3r|Kǯ=*lbagg+#nW$E—_d:xMl>MbW('qyRca.{[8IjS $Q 3W^ JsS;gwcS4¸ &ը\xEPaXWhjD$Nm4QQ* ,qR`Y.NpH]Yc(7he`P9b畋Wx7^o kMnݺ[u.aMMDu,)A͡Gb~Cs,\W_Nߡ(`\0ZXhw|ˍO?ß[=`{qIbR;T6ˆۦhsPheBuqNf|.fz}Br488adҨ5=IV#bF)* QkOȥ)kU‰ 1&}U&p&Ѕg$ dqqQGzW5l69w7Q׮͇bP k/3cw4q"C>_DMf~aA2&MqTۇ 6<}Nu]8>ctGGp--ozK纨B?ma͌4$mHn:U+UT}tK49 yl<f3{_l8Ȋzy;A\b;=f-oe;-h-cj&IiٯoD(92܁[d)6 &^y(c M&cG[Iӓ'4"7q]vHRa bztF{Xϕm-Er~D]aGa{v,+<ťvgoϞ>d{nV)u뢴q]f\YX期caN G/-ѿt,?y>{xA!Q-G2biG4z}Qnإjo7.6AcE%fpI=OެQb}UhǓ❦9RDy/]޵uGwpm>>Hs^Qb%^Lקe:9nBZ@}V\$ *G$QHdSF*IJ1kk$._YЏ;!;Ez{&Ͻs Ssl-! s89:]L)efej Q#kh# ;VKjhz$)V2t;4k\׸5_aRMǿ(i)VP|Ёsq3ͮ==#l-ŗDº#NdjRb56q,~77}Ș 3` P^'ctsP=!ِ0\2`帞p ў^O:<|(ݭ->|g-\?|$u+K֐)qf9̙AV株UAHl;40ѴcaY''O3cDV:,C̎8Ϸ1, j |^&#LJtD'Zmht;i4jXFim 'LRgR.@ni{,%Zlt2 IkwkD!e8͖ h>Wd=xo /ZZY^-1GGQikW9rO?~Onh P:M(e(,3S=Åj(֟[sx CBD}vx?yLD$|b8XeʒSBi74 ~4_fLJ 6$6J '.먭m$ uP6jk r’* pEIgb\y./̱ ,NThbQ 70C:;KN }p{(FBH߼Z~J~qs+=Ss\=bgGi7(e0+Ijiup8hv4UFQ%}LMsuv LNh_|ĴL ۻ(堬\ 3x/{88|׸5qk\_jRtGxm:Rd ieL}x,K A`Z ?iu?^,@sEҺ ? $CP\H|<|_nϜwb:v$dv7KtLbahvc20Ͳ&.(}:hCcQWbGN_|x f4:C(ꓚd`y"@!xë̓HI`qзx7M/UiG'Z+/=OؿȎ55>41<:|(Zr_ ~;=?' l#`4 oORˡZ @# ȹ hDkIpnux(On~]sxAuq ~p\t}29=|$,k#SE93;=x+;>C=T9;Ú[{|p>[;Q(nBQ4"l7qXZ] Nv Ś0 iBBiW)[(`VJiJLR!,*6 9d 4C& Liet*H/h׸5qk\_JAh迳g+9p+_3,q .QboH*I",`ϝ;j+ IDATkɱ&2333.zd??Iy"O45f5Q5`5JۑgU>1$z)mM#M˨(-WV0&'q$63nz|垟o{v%t^S T ,OP=a<^`_z6F1y@fj-`P JMXcZc\.ߖ9 eणo)2WGMaJR/VJC$&%(5& (Q6*P$NSca=8fۤ/hYHluH5:U(1XOm)sA*q\YZ""th)?&l[Pۡ풤)Apeqj<\R@) ^/qԠib>&uH1q}::(ťv{sq, xJDBӕءQ0b"o̲8ݬstF7񸃒c bJcR+}YZ!~ _;!=7ߐ}Uh53=rݖel"jhJCS*4xEؑ p+W ׮,؟-aHa0;t:r$ΪA|H`2ᡀ8>G;>䴝D2հ}IG¸ K}<0Fso^%o-q)+h،8IXDX<ĺF$! k771|?@9uе<\f(eyd ǃ85ĩ7`RhGq] Ee6$^iؓb jR {>Z9Rɉ3MN1S)R< Gz4SxǏcrT ݐBjOcEzGq̓ufjͻD699E}rK)_@ᨁPqk NS?CmmawQ.Nb;]i&早rqL&Ŧ)GaL}rEjPR ;ۨ=tRָqл[5) 5mӘX]i}F}$JV^jy9Z 2Im ggm{8$h7(8tYd4(^(fw{RrDqa&Ӆ'O7o%X=1I3"S'(ƍ^jHTd_kuDSE?>ݞ=qk\׸{A ^yJCaffjGFeW; mCbL cbVAz F nh8q\4PJXTfρUq흜pdR/liVZ+q䴧P/r3)2e͘,ҧT6e ^hfT7kOR_}ixP' g_3ز.٘QJXإ%y zGNx j(=8Y4s{uX`Ǻ(4F#RG-Qϣ lgyxcP8._rФFdܻ;f[, !:$GLv-& 4Q%췏VCDvcCzJ1J874n2sФ9'`Mʦ8V(v\8堟9U7ح-T uF&Pp>qhCKn?Pv稖[^denBND:}ldA[iƪEyxxKVx׸0=Ll\"Z^Ѯo2?=>Z'_oAcT.$SF|@+&y^܍>j33L./?VZiQ* REO+{v=lַ&Mϒ44wv+T1>\.G69)B!Z*2( 8?!w O76Zdbir/O%KhK7vhzRCsE)?ҚTYɇ}fjm)hwZ2&cJog/F9MV 7Y&/PLR ;X6*_mw0&ʼneevKOIϵII86,w t\׸5q}3R,~#E$DQI l4 #`/MRjntEVZk #Hp(Sf0F$PFnB&GE\cXN1hsk ^}e?@IZOnbu<0ok5t ,jcdaOج?;OVYvOcvQQ(]P2ș|gӜ)Y43bW/+5\'IPI #!Mՠ)^Auql$ F1 ŻݹIbT.uf S^YLr0s{pv0IQU,"U[^epphWE?ੱ?yU Ky&,r yfelr`Z&&TU,6`{l 353Љap ;kktZ~AS52, z}2 gPt#kљ!Z?h!895N!@{nEf\4,Ԋ<#cYl:rq fF>ypf2Iޞo}rP۰:j5lJ5}'JF+GP- @" C] fOuq^PјO4ZC|E};bޔmIvю;[{6vsCV߃iԹsػw# <(((p1u,j~J.ǙYQbѴ:M]0&@9^':~ UA$LvYi=9e64S3T'+,M3rin~u> TKUK``RI3JQtsҵ_]Z|>Gݤ$,1՝r[{6Q'sOQ= 5PboڒjMXZI‘I8"|nM 6nD1{L yILbOe4%^4yPU6DIJ]3bT?^0 ǿk<<␪x灄0Y+=hGe~ T޾%gPkk_QܠZ8n$8u{W_CMM [z0R:`J$Qx,aiY E]+L@sW@;YKGŒZ%u$}ڇ|$9Gghz5ԥK:v}]~C(ng|whqt,' 2-# !{ds|uǑ6"'O0#}'[LOO2穆1m[{?C?}t0wvZD# )>)N>~<;JᰅzubR~ezowO>onle`2'}?ƹu>P9x21BA}!>|j`Zyt gϜaanB!ݻx#OQ[X%=J:e~vu.MHTazҹˬ^;۷X_@IXXcyyΟ; ӓT<wI`Z-\ v܂9|eq/i[=yJ\!-U fQ{uSt>FKMNSՈ;m-Zl\Av(5QDϓG|@yx3/XBn'8~ԯ:TE^66xg{8_XMF86I܃(޹OP_꫿ ?1׃N4hlq2ҞBWЯ gCI˕)gЮOߥѬh_A=#?dՆJP?Ht(wΟg!Ts9^Қȯon;mtUU<2~~jLnz]"ORlچ;qJ2˫$ 4AlvCUheЉÇ~u6vذu8sN^~t.^H?~By1 T"HAnhż57ϥF/IJO E5 )v(< jký:b]etQTGw TCpY&.NcܜP(Q reӥE]'pC#lSgfy*SݍSY=e yD[*㠍0A7[M&gY`~j6*Sʤf]uԘvv^j+L'}J7\GQÌ#̀cjq* #6QaBt+ Vzp'DY6׸5q)䤣 t Mhi-ou/zRB}~g&4cnc:q0<&'E/]^0/R{$Rea&s3w5f5voEZz6}Pa(9|pڪujv;LzJd VozU)P o8j k39&VT'271u/cBOVRݑtq=4藵5x= k2w/,uX,IIgox#cnmasw/^+q~+R~zq_SȂɳoHT~ ayr QoD$ 4|K5&j4^N$ , |QHPkU*ookIwvy{pƐךKZsӻ^ma;]{"tZu"5."ki51*pR`/]FW8Kp <}} *{}qC$?4[ѐ`a{*9:{z>Ot#w vQ<Ģ~be,,IO!(G؝-B߿=:vOz(GA!EfC9Uh+kn>savU|f8D?ZCmm1k{eP)PSJ'E" Sn؏":8j"I~Z}&*rU'Ȧ M%t 5E(V[;LT' S+ѽ.I0f ׶a7Ux0H7uT`O~\׸5qjB IDAT J+Q{F{A0r{|#<|g.7Ԓ"%7cZ+7&6'|{͙ɍ|tw rC].Ko pu}V<)' (C1:dLI$ɱ@|4G?]V‡|dZg43vRZLlh߃~,*Y1R@yPr%75 @:kUZ >d(_)#yP zUxm_xx]ffQOPpAz4z(4=HZ̬\"3nnvpzDf7EV")DVč{}17|dJx( )"# 䳟o\qls/z:ܼ0xv?8qEnJua+7(NNp PARXelI࿉hv/دGЗ_ۄ/^IS7,mֿ6ݟm@ $h$p7/c|r<~TJЀUz&c7qPn%}˓E X&W7f$(iL Ӫ=zJ-k|~QRV w5nW,8*: ,W/ol3=1LqJj<_,i,E,bX"3(7YdRh` 7ѷ߆]x6ƚV1UE~ (lM|6|Y{voq1_jؑsFptdS޹lyl|64j_7<v>y<7Vlu ~]3䌳Sm<Hqޛ8=Gjx"1~ZZ7a8krrb&G@J!O*2.]e޿b\qh~NVd>vdrH 51Tvm~cc}K on<{f,mr%D ~g~ﻭc/,lu'ɉ)+,]!MeC]Cf3]^F. /UJprY[>u?0c*֥WX^x|Ĥ˔͛/}ɮSXr e*~m5 >4!}_~к|Mϩ]3ue t|09wÝ==kHlػz zo;އzZ7*uNMx xG̩Q'hY:ګo8x_}*8,u/|Tpz*m' 6?{XRRb[>K[^#繿M^v׾J9K<Đ"Ķs;m_ z×_[}?'Ibz:e:0fL!am`IX566yiik7}q`q!0)vހ*W_DKo20p{OA]']8T>zd}R,E,EN ./ JYzvOMIg3؎}]O\,@(J5IoyG& ܵ2: ;V3$n ŋG'Dt4&yÞۉw q }cw1[i57o«[lٸ}![7k V6 *iIDŀefcb Ħcl斁@H Uzx'ψ&~|75RJ*8q'6)ck{yˑ[ҢkY& h7g?C}c-l P9rڴ&$.w =yburbuz!<@ΑGйѓ DT >^ׯYMkޑmSvy<{Ϥ˟|2|>ft$/q::)z خa6.O]3qHwE, A ֞#G>7'?vg仸 uȎjG@>4G(Þ,C}o:`@W;ؘfX[볻:I\KLϿ?Cvti34umCmvMcDgm *+[ea--%c}E>o=eoބkW^ܤ4gݻ4.?%ܽNڠa_]៮oPlnWo\G_y7ip̝C?|]>gLlJp-_W*}!Eo*k7Ysޡp?% h"hQXK+뷈,onγ?|یOy 6/]0AoK[g壯·kOX&E[7og?[|ehBJJ͑[l ''ݼ+7~~5mrhL]7B'z#<R#0*Z z[poR\?@q^} ܠiVG'YN}{gjZ-|Swޜ1?}/bX"=>UMeYh2n֨ڞ$)&Y$+oU[ GӮ@xK5IUY@Eɉ^eti8^t:Sq<1v.?8ijTo<{oO3hI۴:s~&c_s7W~yy[3Ԅ`mdจ&q}5hl߷1E3 l ͐3 kיv`2EU^̣Lgf^cmv +sLwml?#>xc|" lets4 5{WSC~ N'KbRBlٌRlnqN(.3t#~񄝽fuƒ :تZ/j:X'BP*Fnpz׮_mJkkk8=쳻GUW7 m+-^i N{|nHǨ ʲkBvE}-xNy} _%!rE {Dm'^8æ:4sYQ2h I5W@EI2z^:mk_t1/7p@zjb=o^svn>wΗ+,^b-V6iQk̦#SMG$ŋdMc z%6.nraU(*xm$@jƧcV78:=ttx̅ pʍ 5 LJ1 (8Y-aPzGh5Y"ãc^u )z^{uӧܿG\zK.FrŘ!2)JihP Ӳ`VhNf3vGy1Or|tR)阕Ueܸ~W^7^f}m*)xNTc=c6P--1+L'5]Ov8Oy{;xtU]@Tݹ%12Nd2ewO^&# ѽG<|?9>`4>%D3joz5s5M`g ''<{7rk>N0Q#NF|x?awolf8 /ĔTϿ7"8PN,b/7(ui=Q5G$=,˂X$/6^NG\skLrr+n/U'.4MG(󹘤s^/h=I]#BK_0`|ildGvB,JKCqh2fVUmKq_W^Ve=$Lσ? |9*{O=TblH|UrH=3[.jHTc)<-zM*`F|dXv ?fzK5=DD$B{n0k[/sӄ/)>eYrmr=v~D]M~tW3$,XY_eEk7/j*N{Y,c/ &YK cNO~W._`){%A%6/nr3+kzHb#^G' pac=;d[ _=FB惏;.+׸ƛ\yMlt>|Gҕ )}3!:O0MM4} ۃBgTUx4b`j҇>\ʕ\prih}DZ??m:qppG1/>;P;ei#A#'#Fc?;wX_guut;{Vֱ3Qg5x>7 !M*'O& VL0sxthbT'_'u^%/xJk!?X"XԖ/bf 8߂\_I2I}pcyÕK4՘jrH5=P7%_eo&Õ 7We&F$ MPu+7 V2>ҼyQ<}~N,QRZi3b[Q8!P7s>i4$:&R8s̢rxrL g-k&4<|'O t#kppUF1{U\XYⳟyY٢XZ[B "u0CG-/_cuǻ 4B}i2&%T(HS7Ե!n['9;vI5zƓvw);8'9/{ AnMCS=.ZڿJ3$v)ZG'&!hd+9{ywA^*YElCKl7N9e1Ьx"E,bǧp d\X@DLԡiʫF>Q]̒uYh.%EYRM IDAT55!9fpjoٮ+ 嵢 gQ9cт &hEmeuniƸ3>OB&T6͹-HT];lmtM5v3$GW Jt(:;{Bu~Η 6i*[Q ė U Иr~ zEI j[@U=D^kT&&gP)zXX _)􇫔%|QTЈƇ9"){"J)53T1Ayv~* hfPU=r$)|[Ў1oӦa٥899Cám T"d>+KTkk r})Bۏh'x;8cR 8=:z(DuCp4?;=Mɥt~1|Ir9ڛÜsso!)SΡ0tgW۽5oo7YA~}['}N{&$吧|,rڲmX;s?H{mVn-bX"_k|*PJ9t֛毢,RldqwþRsN#`8p2ւ#FLsien2ie}Oz!/D£!4Rsc>\  E:p8us8?F P:`p:㼣(J _&gsi~.bEeɼ^R(,eYRUUڦIE2U0O-T/$TÚ; N{K,Fд6u )00_|LSP'|&'^]ŠvyR^&69+8oI(pK]_;m>霽3PZFG5ty+EJRhS/bב=m1O`c܊K;}'%^hAMrZ7c=%P|\ٶ5xHH',X_]ʕ\rB'+ \ak$?6|sXf#varr4[JĒI9O]Xϣ!}9 .?43.?W*o7if\m" ͡l 5<icmHM0i{g$9 s?X"E,?_w5-&Tu'aV"ձQjZ9 Ke*1CE~A 3P3UD"sl߯ryھwl2Oir0d6%"N, ^9c%yB_ eval\稰Ϟ=KNȂț sB'ŋ~tJYMp83bwo;>1UmXIyh) P5b&Dz!XH?^Bm5ckxGAXtMxͦƌKiu)aC, gؚJؼt$bL(S QLNP ͷ,pFZ 5.KptEksġn0(;/,b=SI{a Q^/8D9}tδIhJv g62cr/bX"_G|:ouLIDZFtˋpa"_??1;u@+ mނ⽧pV9t,s۷nsxxe1h42I1dhbRAƘیuLڲq&02$2lф٬"4s]itKt~wQdjA41Lh\9ˡ9{י!Q<|}>9:OLl!*j篂Մ(MhPA~O5&ŖZǟ~%ު*]jn.ю12M ):Yk(P5䨂i6 qԭZహ">$ %MBwT? DJ1wgw~og|N%|^|J$pkC'xZ)U;x}}LlLPFcFW( K^~rC~S8:ܗFi6>|d8xfKԷiqV羊g~.m6gy3$we>Vy<_k o^Ft? 5f\!YNRn5刴xΦ_n 9٢iZv*6uJl :{e^3`JE,bMǧM2p$uiQR{p3+bo~31Gg?`i[{t]7Zc$1ᐍ fz62G}j3( XLzKnU~3 ̵Cϵ|64d41m5n<%w!D D]&= ,K56wWDp1Ա1qqh>ŸKuPe+Ue̥%:ԁ}EOQh` B $=v^$$#$0 m{QlJ/]"E,b̶%R dۓ/p6\5'#Bmꜧﳳ{@d6? ;;D%bN>z??9>|Fei8~LLd׫fJjaՕez>j;e;Fw1c_uM{qqh05s$b5\%\{ ''#=F@@-3SJIIZQj{= 8 /KMMv)* +̓37C3"ƶmcHծZ΋;5W_睷:1֒j.[7.inN}4fc*k%NR+$uV'jPp/!TayYjZ>D)P+&hL_s&Gfv&$HMG}.AE,bX"~mҾԛSQ$Q1Ij/ .RA @90@h)ƮRN΀a/2  ŵ^m3G5b0IBY  H0~6utM'a,PzN1LMM[jliY\ 萀QDsW6'tQM = L[滐,O6^L1ҳlO2(|_K`te1SK=f$Ξ^"BP*|pI!]93d9<-pY[,-5q:I"T-)VWl Fϴ#U" hbc5%;tX"l|:# e݌]LgSqpʟ[&&aiG8jGKӂݵtլjyXن—$Ir 4T|:7cfrKc:<Bs8飯 $&﬙]s=U(i,Q<T@<^=UpNT fd253%T|kMΕ/QLjMLsր9{euI\TqaaeU R})JG£';HMiZb+\kkJDZI+O ;{'O$EkMĚmGpр&jj=!dJ/] "4Pte6E5!"uVK"(|f-Y.N' ,wّ$FҥbyF| K$/!%H.1 ,&!vxPu~>ʎ%aA֣$AfVJM!N:׻=?٭Il}e˃!!ުTUec#/ZS ;>y4?x5uCƫ2VfǙt1͠9&6'浽2$sf4ܠ#)==$3D޳u"{H\;s6w35Xݱ¬jLj\CBLDv+"^KWnRŭ商PP:/y訠 M<'ʃ:pr>Sn߄˂/MSRՁSw?yQ`rÉo8(.dPcDI]1c$Zd* \8*R1#,]fM3CKRN絝1sƕT8>y! JbՎŪ!5FS)R̴ز9ԶIs2W0,uU2"k * ޔ3i\ t=ڭ aJ0{ls>Sxoq:6^И c\+Ow^&\RSM"u.kWJ>{#4 miRr{"E,bŧ>@\Vw8}!y||YPƞfq&D^ռ4Iށ'fCNd &MP \q({/=YYI4Vf%bRe#"H`nqP΋JR[@auu}~q= ֧ZБT/$Iv5& ۿdm:\$˳3 ~ '''4nkT4%AՆj}k%3,emҦDX5qKziߚ>#v ׮D>sWj^ ,/ʾRJᅓ1w;ɳiH a,&N Gmp ,C&…*rbEegy߁4~::g=YEZ!BV<9VQq@a iOԘXsC\l:I{s/%=߷y0hiQeg I96>'󭞍tǪv_j䧠Sx$Mzxo/ռz+5.6,-70o(Ov#~nڙ)U Sa6* IDATqL'floFn܄Mp/HacͳpNƊos˙䜐'X"E,.!Pe`:%0WGE ^:ع0Ł2L浢P]l>Ò!dMTcyg9g g@zR?q팃sN[f lvPN,aH2d+ļE^f_3+>裶>6KkC j]D+R@6.,(:h:lr9:cn߾s23͙ )k(ǚ2HɝK6֙'mBlQUqE\GP%^i҂ m<ù9{fm[dVKt>/iAzӘLmfP HRK3zYZr\*| 7_\XY3pmB(?}_я<%ט̽D[R8 ca:S Š&rVasS{F7h>.;Fsu 1:ߤXV-~ @T1R* {8?@@&Y'4uMSU&u0%{uD7|ّdM5 lJS'W zKo:&p|5!ƀ엩Oef_^^٧W=*u0N)unϦ|Lyoǩ֊煭Lk ACQV1pfGMG?|I=ژUX+#1z0vw#%4 VהS,F6`m- :&'-LjbsnX"ESvå%V9<8d:ZF`F#Fu]'( h}IXH2͈//)M u DLyi;e0]6W&7sF ل&drH;cۇyOc6QEA뮛XʓmO.3xШ0yW\Fp$B%s1g­VV q }L&&9,/ p&9[hvjgsɓ'69v{^q%&sh~-J?tdy^k@n`$<Εh6^@<\|v_\԰( MtL])ɓ+#Dĵ5^p(ۏ=;Ge\{I4bK{l[F. {aAsm 0xs<   Qtwu-YYK,{ǃGFusd_#3TEE5{{šF1X]Wn*8cP7hABE }x)d?Q#؞hhyor.Kkd6p#V>.n/v8ncaQ=<|phu$e F|oV HPN(FrF=b哄fb|=Ki.t7SG3SfJi*)^liok^׼5_ΘRa<sz)r"<"xpzyi6T(K|屉XfG&3"rUUOU5ue*~c;3=ϖ3Hb#&!+6INY$ I2s5# 4>+!AALgOIAn,oz슉,DG|nݨ3clץ>Xʲ Ir=g>fע5"l&qEd:+S4Oi\41M Yޠ,= `|-f ~܈NǡZ&dUǕk[%-BzU= Md2QA&dJ 3Z+:+2n\pZ4(zK`\ އ$.lMv4J΍%By#guy7 kosxtO?]`}%a}9fcI8ڭn:ZUYkcm!v#a<%xo) >hUzGm)%֐o}̭y._>㗬vrv/]"g'AJ,EZy +6 rg/;||/cK!7wߢ,9>Gl\6ҡ*3Xnrq&׿mSH$0K+{Kzٱi5tk |> }2'xgH陸 Q<!B5W+:튝+\LjPk-֎r{0$ {‹uNLpiez׼5yk^]N"ab\0#GoM sess.~? 1̄(17 !XC,,27A¨~OKstidy*6֗h4r^0e:e'Zb6窊}(BJcs]lQZ(AB\ITn(#Frcn!/qw׌5f}\ k&FLH3 &>П p-8,,PD ͝XUX鴔=W=; yndZ<|<*{]!m.*b@aTj7Մ鞡гٚ7IbrzjxpvBȣdX#qdzLץ%nܸ?oS~~>k 7n}\olr6p6ǿXß7~/ 9F^3|wo]v-?YƇ%ܽu1 rcc|Ai+p"lmfcm.5+g_ls"_ݷ$`RV<1. vw߇mer҃ S6V llpygDףww{J׿~=5.;onWb4~ *DDFSPn\sܸlnz:A͒$nƒpsCKL9x1CS1(ƄH̨bV b V=Y۰ݴYX՘h(.CCd^׼5y7d0#s'Y9qma@!Jx9Q,k5ck$>f8B d7Dm-;s+b xh!~kiY @.k>sL٬cdiM&[M^i1 ^ &n.@1ѽ~c| sf(r") &cp☺T0`XԆJU%xβ4&U>+#34xE+Rkh6rJ2ļU&]h甚۬w`0 W'SI6Z{tA{X ]EQPTTgj݋UKۉR@ U;#E%KؔN˰yp㊰nh5Sl+(K?<_|nq.H'K=ya*838pz|ckų"6u,d 뗅pob`l$\/t,*j۔nu[|_ypzWve nI?{ {/v.([[6rֆp岰{V`-ܸ 7w=7BzldDž=ןB(ZJHх=ˣ/ڒuwo+(%8=|#_x=/%!(+[{ ' icVZG}d0`1+Ylz}T%-.\/:xWJ=`LbK(k-ecj8&!()˂$ ςU:2 6Q;eT) -坄۰b0F F-ݑOyz8L {{KQl#P*Wֲv)5i2ļ5yk^$fٷf/ W`LNyq+5͚1+λa~NʩqS3y"coo, ҰH>Heq C&pV M?G>dj4;D[ G| Q{8պsmWY&`9Y%.HeD0`]\ $ 9`[NSTr-/ϒsAbhkt1"q [?^*hTFW~ ܰsqF486,|5 ^\!?hQT]`ˤߩv*>7RC^ŦJ'o`h hj8EݥG@5UI}cLθ#iNWy|wpsS s4DپhIsᤫ78:B3!o=nA216\'Eh/BXHOB\J y@ rO1, =V:`HUXX[ ?o(6GyܰEŶlGl`CY Z3Y虴ԗM)+˞Rl5~Hcו'e?U~sloΎ%EX`ع l*IEބS8;W  ¥M٭?dJYH ~p Z kt)|*kq䍔 <+ŦWTBTg18cibÚf^ r>=ϝ{8[rv %aP O<)Z:S-V҅ŭ<˫BkQp ՛V5yk^~g0U(KWD UUs*wGť:݆SwNҾ΃YV313ʒ0KF{3ى`]i>ȋ쏺/V"#Dd`M2a K;]  5 iTH%m$: .^.?@Qh臜Ʉ"3 =}CμZ!O ^+* >S IDATxlSF)hUַv>ϚA ΐ IhP}pWG^#g{W-%-+ctƐsI^OA{WPAw4r勻G?o}n;JPκ=wQ(^ iȚQY^܂[ RUW{P{tj aiVWUڵﺵK7 OW]x_3.jRC+bROFwh/,b4B)8,:f$IzWnr|b8968$ FZ$ &ƞ FOPo~S * Fq%80["lƚЁ4 ݝ xp<ǰ U043TY\P.p][lYYn1<}w)O _= :-eX֪|i14Ȳ6y&6\(Ii5* !IA9 yѨ4Bk V`f**CQy`Y_1kܛfp@n6ٶ8`8T=s3vj+['5yk^~ׁ4#RU udBVPȵ~iB'lfdm:tFemFJhX^"$,6Ȉeț9VS͠x\)< i0@xSRؐ7:8=/AEyjHFsc41 lowS&~Cg-'aoE"ogT,˩,J0Bf2aƩr{s IR0j)Q9O8I-ԚZ:YT(Ć\E4Pn~sp?kenZ5n"u^<˽ cL!SC(I($!3%o[]h]pA2C%caiX;nR$ -g% yěI$7 KPM ըh0FI%R1WQ T%RH)wr7b%jϟ4a .]e{ Cx]x lÅMwee0T>|j8:2 +?ݡ0V@롲"& Ѹ10Q1SH⑰}ɰ}IV!̈́ŎίW?1ܿ|n`熟~hӚժun`c}/|27o^ݲ?\p5#>҅Tidʾ  j,sTcHFUuѓc}B$TU(NW̤ɹ:Usf7F?_p]~ FCbNC j:#e5)-L{@ (\dN"Q(]X IKJ-C`%R²vJg_t~S AD{5ANk3L:+lVp"b) M$H`4$ RoIJ'HB1Ǻ(}r*pol&(iBfzr+m͚Th heW(NVHK GK!tgp4͌5\.[ E<|~Gsϵ-e}۰y};WDac9gw. YK9> -hCBSyrq~`_ !Qc\oo ̚Mc}+1(roc  Y32fQ9 H0"a 1,K)*HVf`0%1'tLdإر:9rt>H z!s|ufMxLnʲJs{Ee&hyְS6sn *XPƒt0x 7yNA383lXܚ: hUְIDnLd4XS}V-!|y8Mqr] cd9Q VP 8B Wa4P2<ē$J"I=/%Hh`~'2cp=Hvec%"/][7r:m?ml}Wt7FU,/HYX ِ0 $->ɱ^4Ҷ8KWb 8 Gpmؾ(տ}<}iz@WV LI0/ ׮ !trO{V|%<|y_>ڰ ­]pv}&`a!)Iü0$4M|ӹ\ߛNT 4Hl12eY: nR/X$ j x!1EX]VpaJ"fB+7 XV*4,rpaADFv% U$5H" ~=ſ3)s5yk^׿VMkBfnf6g4rTFKY_7E$8,|2Jsr`AŹ1 ^VÓУun?kyp7a֝PǍ ̘ ŵƐe)YLj9x2ιjlp&Hx(zYnrDM9G1kB_WZ6 F7fTX@tRc~ s0f 1v,@ 3tSpQԼ1aV@Z)4r9έfuxQoPq| &`\g)>RUL L*6ԓ6&VUp8`Y_83&ID50Qx%o1I)8(X! x#bA4󜵵5]έos5|qSRkځ,SKL*X^*J G'ދ(\RK, KYg8:NOndQ.l;VVJ< ``jY K>ʫWpt(8y A.m[[qhW? >TuX\1l■F%}1eեP`I\#Xg4r1Py%"T$ESX!q+B%^=z9J`0(gnB*Z/NN3Xߢ%Ypf.Ӳ8 '*~w> O)o"`&&p J5:0£28Rc%ϕkXy>43O 9JHs%Z%Ҵ$wkz8QU)z*  iH 9@RK$KÄA߄>TXnV<]ȖF'{=cTVk9Q23 sU#ڼiyynߪu&}:+^!lVw^GUil`d}4 45{L Wc /0 9::> ,K}̂~͛Ԡ+*~ūCrӸP4^L7Oް?!}UjA\H1A2iOXH|(N*Fn$^X)EO-&Cߠ/ 301*Kg@1,#/两(Q)cHJ+\ˠj`Lȅ,RaH)[Mn^wweeOxWN ˰} m<^ALy"pQ5C, k K~dBJBO1 grh5+kG1bac4~1'b *XZvX4JI F1!-88 ,$Qvn0*`$1 l5џ??Q׼5yߊ) }U25h 5^TGF }g~Hw97 dg3f S,>̖1Ć»sI/i(SaЏ'3U59`#ۚWipBz\s!CsBARyGY8_ Fø/T}xF]=:wr=nora,gXY* H^6N Hz="q $(yu3 &}Xe6RBD}WyO!RkN%'XL{Pk*7{畢ƥȕ({u&je궣xz]uFnٌC`з`vh/ ͦpdV!ARE&V:mC(gUe8@ă!F͌K;[u-n]d4 Ϡ a}V7Ia<= `[<<.|2pW|w簾\$pxYh×= }XI ^>83C$MM E '/>RȗU܂eX\)psA27'/ Oy']# m僙h\9=)k+9?'3 xuqIp.=P$o2V~bc+si* a4+qCG#1/W\ZYT ¼LӠ,3a8Oi½0IH`TBZljij׊(ʱ2q3k)׼5y뷬7(}C%Ԫ6Ny- T`I#.]W&ېsLx?Nj1S=S(oE:zJUSH}hᐢ(m}= {eKL[{8CPYsĖFYt'tM3Ed&]ɬe2 դA&@jPYU9<w_X9@AW{Ue>{3fSc`M+,`.gs5wyyݼ[ڶ}Wp 5 gg5V5+ŗR%BU\~&5+@d:go %Q8==kiKe.[)x }ixLll}dET#eHC`U 2;!>g'9fG[as$ ܠ:sL5KȸFz6^ZvNQH ;NggvngRNL'afVMnu0F^.ly3*²9ddSG!!z ;c%zmy}xM]5n|vQ^Sn\U^a dzԊ$Rp*O gp+˗n+ !8\FkրvsNѸJ`{2p}rv|&&-i&O7Xgy4x2I"9y0?#%NKĘO55py#ޘ[X瘞 ~0ZڜDjfi0?U#!O IDATNRW1ꐑ@#ff$D- 3;8q-`DZ;͛7[oX*VUⷋo:zq'QDerδUXnVvA{64t}[~b}+ -F+Vxx1&t&%\J:27)i꥚u6Pesmt6c:kAœrͯж]qh=9b770.DRa.!0躎*6?oB eP51^T3f*/0mؕY^a߸4vdf94zuE@2]" b\"Js:x:GsndbwCjUꞵϬ[.kX Gǧlnlc + Vۮ8>9WA5L ֚x ̏T֘(fBCPMq0H4C 8Ǵm8k`,\_ mUaf=Y0M=mDQ|Pdua0CB5b5]N#8=rM0i$G@4\z?;_ !э#𭷄w*3l*ө23jٟۗ*xMcyzp2s8]蠝*#Kյ]ɔSf0P^W_μ:zE_2 9X?r'LM}rGk鏝c| /ͱrknH8ΣyXH;{|wihc:3jA<(\Gt.#L2'̴U::pC xԱye&%3n8`ƙeF!!NY4F?dA;3/  Kzޞ+5YUwl'QF.$JKOlX*VUĔ>/1g2S3rp}~ s"4)yO%|^[{P L3Xb{9*=by[Se>uVc(Z(W^I":gC82*lnny/̥K\ڼ'Ĥ-Ehmh/{=7/P>sPI1hSk!M;L&ޫRƋ\bdσ䒛hVZPj. cfRX۞a^"B(-;v^v3)uhlK?.vRBqdedxl*'pcް aT]PCap.͕L9> \^W^~=QsnbwO9>fne%%֢i5X_\,ll3x/WUj$pܰ}:&6/ OGyNN-x5x5%xsƽBWNOkkϕ=3XR'p| /umJD׈ݘm8 qAu"nRukWW^wއW߀KK?!ܸ~_9؇GL5@׃x&||䐇_~2HpK w;z͚Ҍa4vhɥˬa^'|v8>>iÌ}jfD,Zim:c6NKz>Q?v/-"o^ntZ0i Y`Ky ]mTYzrw]^g@LYMZ?VgM ##ēc>S񱲷xW@cfkS%\0\ LftO{W?lp.gL@=áꭎvfcMX:8;uc:pVWE1ٺͭ^֋/}0d~pvWwW_{Ԁh~]yM[\=f.ggG_fqf,? Λz@1Yn3@Y/,hE)s)'cU=pm_A0_c)Ӕ'{`C ˚x?h܅_ڙyec,l]Qnx%e |G#+aۗxk`k?ά-ONR,J@W/q3sbBL eOy(szOQ *Gx񓖍?vy&SAg8PR|Ĝ*.ܼCh@G4DG'fvsBDA#zɌ'{=< * }fld9|hy$H;Z_=*^UR[cJJyəW_}tΓ'=@ry.&&?tEֆ =[~];pԪ5&p%H )cέȨbZMHM(,K1Z }[|Dȇ~Lkl!)f)Id"s`~Iwe:D87D3hq8އǙʵ04z2z s <|"ܽ+ΡQޑ:`'3x4x<¼R{'rEόdCփ7))] pr~tJ{?SVUbX7S m2f&/koÉ>O4tk}bv4^H]G*.diBak|ut[=VX#c<żV6r_RGp-}9EJm3'l&6'xgj]ilQ 9Gc#kPkt.g)]gq/k=3WJY-֟-{Pj@N4#\AYe^/\{(+H(jedx|/oyZQ[84|1ytO>~Snqx[o\/Rׁ0s*/&GNgaU0Y2cHmG;;<%T0DQhXỌ́ʽm5b6*`Z o]kغ vzrtv|J?Q)ew(zw8|Qz]es;/ף:sclΑ]*VUbAE@9-=={X__/Zs=Hua".F[,VeR269s f*Hb"V‡m?z)3M✭oP|$SfnS\RQO&4OWam^/`08=9uG y` {8pֺ{c]fs+X[3<77hiul.ϟ.=A/U0iSq!ͭ9._z~澱k VBy\5k\N5 PqrܻXC]4I39W7~bФT. NLjEʒڃ!;ͬ#uz+y/3DNֿwΓ/thG;ē'ddҼֆ qC>c~;\߾?1ŵFfƨI9}!w|Scɼ Pom]( ,c3!&e;? ?& guCntrd:+qeu 'QR4s?壏?g{ӣb*S'Ӗ;ۄш|Rkl"x/>_st6ZCе>Z"gVg)69$xc$I筷2ʣC503Vs-OWaͷux!3GK)fb1p^_~89D 3cfVUbX7XM9 b_m dRCK] FhKseU jʜL%]죟7oؼ`8ȷTf=<`6kY:F>g䧬^9y/%lAezK-EO ?8`.3f)g-g<{|{|[/bm}#qeN_G?;~/nMgĜ캥ΦG4z.M.yHlll>#v麎d r1ϸq.]`hR^,8NOgཧmsp |rLCn \4 8Fc=P]̲,w98:jT!&ju]_#ɹ㞟Q@y{jPھ!MR6EWoc I.29r 眀Y,X6ϛOKX}dskRWi￐hXS7VeSh&g$]ܕ$;dW鰵#8T``4YvfmA o O)ue^s&J]x\KܺxKdFD͉1ӵʼ{u3ϧb }/hJP[%e3ѥrzv S;&G0kI#bI Rd t RעӹA PUpZΐXmU}GH{&=53&q!sՖ҆E~mvҴDE,Wέr.et2f S^(⩲[R1V81gsOh+yy3r2ehYzxbΜsb]+kЮ057|Me{;52]i\DB IDATlxOo$ڽXbX*V>{fu^>6jx|hP4EcL.{vg@_%__qppp8bkkGE;G3Pcc&j1ƈoRZGjVȋǑpRq^ZuaEMgmmtJuI#Sk9r[vƪ\ؗf}/LgZ8GC Ԋިs93ٮ8s\ic׋W~5r¢/oS+l]t\rM='LZ\t"HS[4w #:Qi2sNO7ބ75eXvl&pF뉟$rvȁd\N9ٺxowo{mEig>\/NNdg5>"rB%3-\6g[<#5q4*)d(Q sҪFG]B8uhSP"-1bL^?pKaۻZJNK鏻ָ {)q9/ g D4buރopޛEk۹ppz9yy݆^RnETMv&W6<̜NHZUz=UbX*~Ք2adrʗwf6c/f-Λ-3w ?ɧb)l_ x+__rppDSsSc㺗gK/H4s=]cMʕ˜us7 ggJCX*$구u裏 &+Wic|>|Bmc F\@YlTbfE\%Tl1ZkZ+&Wuu)%R6yq5ֹ֢{FKv: 5!GGdP]w0Y9&f]* l Vǘ޻2'{ O-H7b]2[WhR=W3귰,L앾PIvBi0y:{ Մ U嘅EEc' YqVR˪4>xk7%g5q0k!Δ#UJת;DD=رCɑTT&4a(c.CcʚjeTXͥևb- HVW,' 9]q_ARQirV+xYe#ڀtwhL.[V9sJ^ҏ~iү+?R_ cJeQj~3Api[o`e `#^U8p/;n2a $Y*Ц,3ٍ{ę;!z j)ybmQU\0WtX*Vrι'xOٶМrܽ{2{FpHh'&,q`ȉ J}W^_Q14VGٵ1.Ijxq8ASQW鷕ϛMJɔσPqBZ}Tr;Ah OghXk7o\'g*!H2=LיZڹi΂ 3|k^,wjV]bfuVFu.IZP;%VHq7I^/!!9G,̵SEg#/Dl5d?4@"v4t?[ECrT{U^~VOKn$gX*VU㷯)uvJ7bB3OS!s& -m>']ƐyMCc_WØ,㭷䄝gNC`'h04c2sԷQEm;`@d+dpō)k;b9 v1ˬ/z`=Ty4'r.tlf]ܘRFٜ2K@g1ۋ9~ƕX{fCB.G gȬ\*`,Iן&g"?{pY*KZgxV3Աq4sefׯqf] T1 ՀJ|RWQy'+-R1BȩC/ eC/Kbv66k$&܈yEUy72Cp0/.Ɂ6f饥,uM8 {uD9%qG# %KUbX*V>X7Ӷ7)d2e>RT]s{eGDTK!~JDfgO/@0(,a|y_*֋v߿MQ_rt)s|rJ63'A;UЛ+;p.3m.TBV/>XM3 (!]ʜZc!^=7NRK π_r'F l-]V 㜔Rrh$Q˜Tsa:+iC3S*Ikǐܘ F\Ytwũ4Z 91Dj*J ^ %rPeu65E^nYq]"H}mRWy\v9"0pGi1bu]LF ڕ+v^)ୂl^ 'do}\V@K0(Q!U1.,RRI8; /'~Q Sy ~ېZꃅ.|r{X_j<{ROj$81Œj F>I VF֒ u暨W#ϫ_*VUb\FGuC_9c$4̽G.?Txo(+躘93N.¼ZK r|6f9pd41h&ggXXҕK<}eTISUmu5CҶ?O,nJ=\7)'3V)penx;MJM s(KdtlohtDu̦ߟڢ=ŢńS 7Zl&*#~ntQC x1c yzy> WsfHg]ױl=΅UX(&o?'wߕ #ƎJ˚ZkǬMhVUsr,J 2*xA$j.'62]+) x\rqx@mg7=6%Kd3o{Fqwz%$ZܦQ\6^<&5(  3f)%FRh!% I^rM.,IB>ZSogzC.)Z\@@$VoxH"ÕgNJ@#XafEMsxUFG>{Jm,>GZUbX*VFiB8GuI–M35unņ\$Wy3EQJ;*yt xN NfltμۣRq-v#UV= Ġ*)'&ӳsD gT\꫼F#f,!ej(tx2rc6@Zۚԗ ^vgaz)*ǮpvvV$ϜbrXf@̀ɿWӦUTA#' C!m۞뇻8wF{qk{&4<~SK8`=]́ؼ<{:227Ͽwt)QimB5`B< jr]΃6hkb 1bT k%)eE4)J@]D9&FOG&7Fd4 /}'aC|ӷЂ[\tDŗ߁l1ic9FSN3NNNZSOd͌E t}Agx\$auDm&&ڐQ7I^i )Xnxt%|\dilg 1ϭv֌j2PK1p1qi}u_u.oPogy p OxMDhFk 5͈& _$`tJ`2S)lB[jBsGFp$jg8hm0`-Ĥ^ytH;11: %VjrN-:'VT GzCAcfA ?W_*VUbAI hɩ{h x4k¨TgQ\`̖⢓nu[=em+{߾|g^[^l{ɥ?04yotީ 0SZqhi!d/}c-Ju%f>ͨfrNfTZQ6T@Yey{sLj9U<I[jkP!0,CaBa= "@ [ ?`[mKEC*+3+12"3;sFfbD/dVdčsg{< `sx,=JKٯzK5 JM9P.!N~\/vRJ+ h-W4$@'1-9{ F-i9fFfpmJ`=-lToͰ‰ 5 YNHCG2 ?en޺>IhT X;Fs24(ELB5 8ppam8%8!pỵ[ܺv,,,v[ۙsTȕ$ᚍSC0:W6I*81Vb'{x7d{N<1H4"T ֖O~,+iM3 vC&BXj֐ڂfƙCy>w7T.p3'gtR}p >)(\WyC߁\aDI0T|`#ez2Ν䉳TeNy ZB8ؿǃ{&Yw ԣ[n+ ΀ε!7W3lE BRfjNE[.bTNjRԤ&0Fw` w 4 >|x5Ku |op7#nyKJ#d@8.aiHvJC,vcڀbL`J &0bMp-r.Ġx('b4 c`#6CekC[bVYN"jBYjs*T?! 0\/_=NC֤@`p5x05US;c JJ~E~Kp-cmyMbIX\R8cxld,jgJG2f'(gEz%H z/x`SO&oGa/!ǐd0A"\XZL] W!(6jiX5 JE.\˯ùoexU\`DT˞zu>3^6 ĝ"Z  TyZRc(lXOfwZ98{<|lfʠcH-$ 9xC&A*. }I2 Մ5oXZTz8yă'y_=A7Mi-69uf_~ Ͻ+x]csӰs?;p |X$4SJ=5*kۜ|x[I"a+8y.]ak2p~CbRIqNC?(3dC_'-Y9_'jyr4 &BxHLE0HV5ckνs|5%|59!BkFxV{z}$p:&?Wi.xwgw`IȻ\-_MPH5\xNyx^gq\_rիAm B|pFp@ 17$<8g[䆴T=a|΁[' };|QfgFf4!+eq+S}t4xX3yM{@^) ˝;wWIQ 1&Z pfy)GLp-ӽKx!AOD0bP,"_dQbJL|̣zx~th 4^Q:6u ¾2*FXz7!.XBBOfh8>fE|#`O׋bxfZEYJqYՉ (0 0Fި02 xY?{[?)^\XWfa~J}ٽEvəU^}Ezu7^b^_sWiBV}ΚU) Cb!YOfe:aeiZmiv+AXcȲx^QI0j`TD4A<$Q“~[`yIx:཯rIkO/Ӌq{,W.7xnxe%)Hl6V#_ k\xn qrJkJZrN*ag6{ԫgy9w"YqwZ\rC!/µ (lY%"fc; ZONCC΋Bb=IEH+[JE+0p^_PHC8 2'8qr|.͔[,|LJzeܻ߳gsP'$U2%+:Tq}(`\÷n qU[ ,prYyueg6X:mevJVX[z#Pdmy0QTPh6$$k 5Z-70ؼJ:OޢZ=oKE}6r3  h06Z:TKYNǯʅ/| $Ioo2;;;Ԥ~dxk-J^Bs*w1SS/#4 =J<K>@6oŬOaؿR~oo5:݌@9%Ip| >wK k0J\C>$Lj;H{ xJ~ WDCBcG4\~oV$IV Uem`]/<Z xWPxG׮j(Ω-Ic L`;_¢!3r#va=|j Z1$R %9g [l#èE ZCGYc\.!qa%K=ZΞ`i$qFʥp뇱Z,,t?8 FESJy~oޖxSrC9w*&fpf-6.Gѱ9<7FA2pa&4J#UT>GJ\mҨ7Ig),Zu$~DBLo2쓉ل'AR".Dy! )[0IE>OR?O՚IMjR?EYSD/CX[[ít&ajۨ*ͳdv,~E?yI!i0VJXiGd <^견5ny~A[B焟 9%J%=?l$dVzx#_{Lgn/d;qK+34*3zvnO$ݢg0@cP&(6 " =*`PȲYL&(㿧>"År_o:ZPؔ\=6čzKpG%W|YN`PAIp᥈F/ .|]!.GA$Pi~DPQq-K>tb3gOs 4]Σ6\,wZX3Nޣxf/n?ͥ;•iH t˳y卄f# Y8cvX)S2{M3X) =ɾ{$‹W^~5aazJ(Tl=|\|k_" ?jsgiMY_OSlߞֽ7Z M!‹/ë+gO%ZM[.)zU׾bxO{7 KOT|NRr_W ;;s@Y?yDb:7Q#dI IEH[5:ē>HOCQ6$q5Dυ&Dya$hH W(%Y|TaFlD7IMꯩA?̏Ν;ǟ~G?M'tRԏXP]k09ʐ-X1$g?`/0iv(Fr(>c/4' HˏIh/mxaK~ٷgrGE?pES{Ɂf+Y$E@QOo8.U{)BJmWL؎s!+s\Ĝ0EKQ: O 1I 1oT*Ν;˹ ]9^W>xOR 33yh4.;On`Y__W_ez49{Ʒ yϹs[y F4W*ʼn's}ڝ=n]I?ۢZU8:HV{Ҧ0=mX]ga2RrX$6\<օ~O\¬:ero{BUC?44&ӳkh~FJA&t;d ƴ!)+.pn@VQS8C|pCw w)3ӎzF(ӉcfFxyήeOSfY9g ހ_M\IT8D47:7b7] jH٣1o~?1ITp/gϟ?ӼgDs9Ԥ~2:bqsXeo/\Y6PG弡X4kAXJFQl`YadP0@4MQ.Ph gYϟWJ渺#]QaNƕ2ĎC#BV'2<$FȐ5TRK ef#a9Աݲw~%iJ$ @jNO5IeBُ+q!,ɲN7 $g5fIJYù2L\?IMG~`P a7tH,'#%Z2w2,ÙرKp?DV9LOOE h>gjqkD?4=2L,z"k΍gJg7zǀ&&R`Oɺ=[ۏ"Ad*]Qbȣtԗ2gCe\0 Us10 G5JŒ.t3$IPUVWW'>Wwb]4R!Әh%vс4HN1{M`<Ō,lI0 +" }'VNG vR\n@e[xŪsÇ^Qt (娵H4swJE-ylՁP[Lp^ƁՔS'9qShnpFʭVrM,4xs[XYn߮p}0CZZ9̊vR4dU[wܺKjy8T:v~{"6LJ}+7ܿm61RhThfX_͗^W^‹XZ^'$& ,U*T TO[PyjZLd+8._vLXuVσi=njMcm k4NyE;Z @m,/s)66sTq£Py:wnX/ʅS{GGtztw:GB;h@!9A ",98A;bcVlf I-g9|$~"!`5ڥ @)eQԿk]9$8G?n;T 0[rbRzJHaD㽍C -埐)YR2+4M8y$OvF;JunNvȊ|l/JP3 AB=<ӣj&JI:tb!{z|\Qh!n/$С4SUaLI=DRSy`D"e*02=$*+p݄M3]VI1Zhٿ/ݨJ<]@gy\̂T mxpM`_}1I}t($IH0?Ϳ?K᳟,FcLj[>I}w1,þ-%(P)r&}HghK\6ĜA[NGVWWs.^caw/@N)j22HL翯V=!ZҌXq.8G>=n}T)~c¹m+݉9fܣ#A>'$c/gGvڽ+loZY!{?pG(qΝn_H1F  IDATRdȬKt|WE7@" Fi4j=xXKRP{D\L`vO VyRVPJV_]n2 2Bs`% Qjz1, 33ZY8KW?4ܼ%aMav1w ̵^\da~kJY[^fia$ZAA2Etڞ{4TI5,d$v+w h,(/=ϝϙ[]]]ely66 o\p2 J޾n>+hԅigis ?:_5=\ƥ~׮<׮bșZٔ^Me?vwo)Ξ}/X\CIS9X " i3>ۢ57lk']|gB1|idIo^j5_f UIB^ Ԥ~ԫdJK oYg=~~Z//P&tRYZp!`zhbĄHFْe_&{ڝ.%fPM,<jyQy5@y"$&9ulqؐXah$!6Z 1˲ah,ulHl `LSFB6_1x_ucy>Hӭ:NF6amJR 8FhQo6':.M0&w9G DGpla!cZ|=00p⪰<C免sͮhoxlބ EdI4\be\O¹S+,,54[RW CCyvvMKj`Z6󠅡縜bg(z'Z㐇[xsIΜ>a U>U 3sWMۍqzBk0CO3,@ַp9 /ZX^ȅlnm98̥Tiecmz¥KBx/l$w 4ΝO2۬4LMU$J%"?3?CZIMjR'<χal qbFJ8v3l1V p @!/c֣Þ KG?y:4~3dHzG a33 gcټ*_[V.h4Y"AGo`!#04bM`bqLejjNCg1$<@)Tc1b`c]Yɦ>HEFNy^ x#3(U326I,?Cn>(24Xs"Đ}TEgyE1 (5Rh<2s"C` v7(FP Q%M+Y~,ިqkp:b_' RıXh֤ۑ|;\!UV4ƁP jUJd`'I ӍiWxvO1Zf+7-OC#J-QZ0;ߧ5s倩 Oq Hʃ&W>0ܽtA\`CjQGN<<n2Li:: dyT5`HکE04]*@Bf&yԕ2oSVJ]hԄa+T+9dkӲyw3]o0;/&L5 'W ~Wz Wz Jp /V}9n5\& 5/pa#ޘwyW_֚&#S+l[zQwoB{?\?2ԫ)=QYfj&\8U$Hӭd(̓ SizzI̘øV\9\g,ڒUޖCHP,$NjR?U1ܼys^ǯʯ/|ǀ&5ImJǝwZE'ĉ;F5J&2), IeϝԙY(R<˞I,6 - [͌ïeoTV,//w*'/?VPǏ1 P%=^WnC6Y&%UV pV*lD n0Gx`XGj n厇ITaԸؐ|фz6FR9Vaaavn.\opxxkG Ckf yI,B}#wLK#&h/qݡ)b僧,) k<7 ?W ɐdtoB?”1(Szl87P),0B /2ᔠbFg &*VՅŘ:(`H.Mq~$Ϭ2˝ >7`$J/B>ges,W>LCCHNك5дZC5Yj]I9T7 f@;rzX4 jTG}88T #37@k 2+RQ e~p7n{f-Nױvs<~#] i5aaN97W/+A#;iC#q\u..l(7[ o+// h+뗿ƥKP5צצY\M9WXz=CxxWe*K'X\jSoNCnISZ ` eW !5)jj1E#H1?|7NGY } ^$Fx*>?ISIMǨJtgg|+*]~T*P;IMjRC=yf<z'!$״UiM,@a"cK_!wn$b*vbaGeF φ)>_idž`.nvΰxVu:ҙ  )an9OvNWd6D,xsXdr[3bFB/KIJejA3a\МjP6;_|_{CcR˿6i4'Np]z1Eyi`{>p=HQ8:n7qclPƀI Z@ZD,yGp-J`4dOKuAњ$Uvjrz}G79<8@aF fdyoqsyo7笹llQH!4DP, eEA@  `zMM/f7kw>cDw9f%5I>;NİcG[:A*Nﰿœ7y:kK,H) KW5;JWyr{`(n[ ίs0Q%sS(ՠ&ceovZCpxCh}Ajk ~WU0ZDu~ez* ins _*{{{/"]?$In~iR1y?0(aD.cÇdb4%M(m$4IӤ]~ϲ0D'ЁEemq+}Vj,<Ǚ+4ꋘ$R5/)[['Bf9/]1h8#,C5=?ׅo9`Pk,6 5];FCvOPǞBbnOY^a$xL_ͱ6YX[O U!BY?-hכeN"=>G![x5^zu6No@-M'Po +/(>l`NcLƎO0v/}KW ;\X m7SZ:lنDo&` ܹ+tAj!ϠnjQo05mNbg^5M a9WT=eFO@\ +^{ XPA=q}4c?"q=~W~7|'Oۿ_5ſ/nRc+~`P\`4W`Vk/gvL&(I2eŽ]Z򟳵3O8!"&T{G2 }{|X繇%wσp\PH}V[i44uq`Zr􍎱S ~`ƣՂ k-rjw~NXSc~< Rأt j[+s.xN0 &!9ίDBUk)LX%<[vZVQdKU4I5tQ/8S?6ր*!,8(Tʖ0bA|5dF먢ӫ-ƶ2S+fν>^@kg ]Μ9ť+9{n[[aAk 7?0*I]YXVl*k#rVZ_ayi֦VOՅa@IRERn7ӁNIQǦ Xé hu Nf#0Π C=IqF`m`V@ 7_+/i] b%x)áTyWuGy n~<p]Je9qbF<˛\q`.osyI:i I z]X?.y<ނ-ag[yг yva2 |"<6NYhu|fqq!wޡhQ58]k+ܺ݅n@K=i;i5`ˬ>( p30$!YKxꦏU̫VTEUA0 3^|T)V#{9~|+F_5l6؇:y0TY1ɳjAG 5^9OJ-,:qUaU52;{<9})vJՠQht 'W `8ǭwxxcT,Obu"7)| %z  (8)>-j!9T\I t.\T:5"(U0NRW<UOYn߃ᆪ|ʽ{A"]xVkY6]d|G8Ǵo|Vc. iHLJԭpb֖ zHyGW{+߬`amuS/ݽܽ6o}{]Z&vSgk;uÓh;$0׬a +$҂0#(㑡pDC.AWݘt Ld4us.EAMJ:RTqć 1)4y(s?swxשjo6o7 cǟxo\:wNMȲlzJ vΟHֻ*>}LAك({\$Ih2N"> |.[{qDM@QۛJ_g1MݷVDk {02ll q7Cu}83el˂vcpjaBMMRfmw&P)\ OсPdT,p--Qj6c#dqW'5PԛMZ I"qP3˯ X=Pvw-Cg/s/W?,.,흠Za/pVoeIjS'Sʉf##AFiT .*@F [5 fQμcJV:=Xc}qk, ϓQu(pL-Jyh5Eȱ`vXSr<~?'ҥK,..oK׾5>կ<1,bMϐL1ENݴNQbb+=ڼL3):0{9΅K@pO8#*h4PUƓuuD6=2O6 eA-V I",--Qx1/VWf;%6D>4ț)h",ec\ef)ώ]Z69&4N΍jSePtV&Msjs*'GĦa"ZW%8qvg7IpkEGF I3(M-x{49&mA\.ڭzTZTrGlQ:朒~5Ь78kW^_ꥫ,/f~<}$H(gya{C>$4HӋk 06Yg8P|ݦܿ[ ,-ySjVF f-,(+"xi2/ P8 iY={l=}p PN'8<.] %5C)X6o(++Bh @\qG-^k&'}ށh(K/(/e7z >sS9F"h aPB66 A'7u KX^Yaeef[WSv?rH(r8`85awOB\1I,Hp7VF(\[_Ja<e."*BⳠ?$^d]A}kQۚ=C`QZƯclVK?S?{{Ϳ7iZ|c J\!M!2R!ϳ `,ՉGAtF%if8*#/h%|`&OϜ @}G_|2̕kU釋T$Ik*'Q[ktL&cx̙L(0Oǻ)Ax|tI$BxY\Z(ḒUS5 ̬9#h` 8*83E ֢0/l7k M  qz@* Z,sXpu&FWQ|4{ '' ؾ$(6s$ޟބ6)Vnqn$"/^<=J %lV)lj 6@|$MYwk<ݱ ad07LF9Qx+2sid[z=EDxQ̴ !q҄Z=e86ܾ{'{`xd 4^x| AdFyTzFUШ-FhLQ L(VcI4 V X'HQd+g6Orˬ?m/`O wH9p+ W^Zdu5V^A{7KZp8Fpzc_R.b@H'MZ$iB!H <opk m4(NCeo۳m\B!nJdDF܉UB}qF /,;wL!c@)2١om[\pBouݭd~MWb"J Y3J1sSfEE#9TyG)u1yO{wiJl42R%S(TNt0UѼ"J^+IbwPD+j|ѧ.JZi$6(l\c8P-j,B`RpX̢(*`Jg6H 4OIЅq(=4Aȥɴf /rJV՗TKo_' &5YNMXp$xݭdѴY%ТHh$e9;FgEח=7a>C(^_=MpytM:4^ A7&wV$}zPnWDWD:ZGfX"pJ, 6.^Wy*->NJȵӪ++ ʙK9S 'YX MB>4Rv,6WNYzܻuVjt'qƝ|yr h]i`KWVWዯ.]v&N8+O`0V /:GxClpzyFIp#6Դ6lNգ-JxC}$JLy5%A&cEģ*$5 @(9 }axnBc qի//,~~]/`j=Kx»;;רF\i0^Ȱd0fwwOn\ܣ8P+eaw#x0W@$tj5M3 0AZ$fszY GKgskv:Klq<1y J:*!"#aN`r}3<4 ^sc2c fS3=zԬNivG#iͥ xyi`i#2&H084UI‚d*Pj:,0|S Vk:KKKVTU9wk8 mt<lX1X 8 6-lk#S\v(}9:qic[ 6sAjL`枷OCOc IbypU^pc07`RJP؈cpJ,,/3C$7\kG M/sy%{}`0rl'}Po$F 8C0%>v˱.CdTCc]ɭƄAd}abV/ĤXCbLX#$ F=68},.\칳,./sO0ũz]X9`dNQ 3e؇~&ӝxmϵ۰ZM^x<_xkN>U޲s1B"f)YrZ- ꚌuN2 j *`rFȲN"kiTLX^G`ja8XyG+w(ynN| z7 &SXY/<?4dy~1 E  _|s_Q%ќVIZd{w~O7plsuwTҀFF+Z\>Je8ɸqNFf'<7}Cgmx=3i8<%miZ9 !&#&yVlR ϔO$-oRɡD<1yc?Qf^gA]p#^y1# ?wd۷p@s@f ǏŽF&*iB&xWXn8ݻw9#x #ל~Kq}6y~){hV6@6"glYk95]5]hi9r+'P 0T);塱LٗVDf{Zs9)Jఁ԰m1 Fjd n߼EVpGƸdcmy2ƘT4Qqj/8wx2ff R*9V,+P;\o(R59o[RH-֡ `Ü!DE`NƢ`j*t]Nonr /‹/pfci{>B#UVʙ RVW-ˆv'EL :;oȴ=R2Q."b ([gY1UbEM|o<1yΔZx@w.u= gtu}yAi5H:=zL4-a0g+wTIAE:L&l?>S JV , 1^OUv;y^ה4ukZdHO:gUFD첚J9jd*]tLo}mr{n=8R.c52JV<):VsU5& J:u BDs) &[&g79W$A}xs,/7=z/Rg#cX6I"ơ %-MbG:HTiiULD DF ϞKl\pAO }Z i}QJkҡZnuV$+BRyanR:-#d9 {۞ɤ_O!NBWLc IDAT3Lڄ"!H͎XEF\` snQ_cI I&>(%v.2e[)t@jdĄE$B]4ɎYn5JT&Wֶt9q0jJ3$%R⃼XM Cy"ct08} /\dIw˻x<R ʘZ}~TǪۆӂZ{w[r1aaԲW/Ϗ9gwtw?b{FfgoRv}W9:[_#UCv ;G JV:/\v| ‹W3}ʧ}+YXsY8EHN{|up^.2 6*͸9Y=`!i%,#nܺ$ˈjVN`B CuҠ*Z%Ácl\.ť lMWG 1_fowow" 3eZeGZVNO(K+Ov;ϓ7S?I'Ly q*Zx|4*+$8_f Kϔ, ±ٜŞape'~LxiBZ{|:yϕ˧)!IʹN%gu.l)|HɳMetŘ"(Cf-(ׅ// 8#D 0(s0Ϲq&vzi" +mbxz~ y^q2vcLoHNyTT*vK<.4kObUfF1yc$~0;PM8tuS2g?/Rm TcF Z|[P njw6"UԒ^KV4 v4jXRa!ui:?%,kh?X*Uz;Zcx4?@,È α|X073.<Ϧ6LE^l9<Q ݲIAܟW&I)9.Eyn՗ Q̋ bR2aCO!amGH4QB4VU1k0({ZTλS=,14M0䑕LF#>~=Ha6,|99" *Ff-?9 ҘPEJ"b'HKRLR>2|v>GBbpk֡6Oe}v&*~!N(ݶEe4ҚӏвL4H ay66˗sj\.׸X-X<bVؔ})C! :^P'$+0zO o5r XRz prͰn8w.tL\>}[|hC٢QoR79aSLYV݋M]~,L&YSeB&>}$:)8^y5O?}wngH P{}rSgXhwi7,,ި7q_=Pn|" m'˅Y6mzuAR)M }w3=W2s9yc<w߅ fc+ gfs@~΢9a /(T+J KIQ81H ,'ǎD^O)}"X2T9h k51A.+ѱ@q@QL[̾N6M@KipXʾ z^o`R Bs܃>>%X52:;v}VWY^Y̥4qyF$AzdEk['ޅ8KeS)ߌd/%] *Su.gϜj#){{{QǓ8.5)kk۷Tt=tQ ϲ2MY*V@M(& ?ALUC,žw$BdL+[ծ0qB.uǩӻy)K>R%d1I;vxN_VG-֖ ~ !hY* i +-/\U.^Oxo[6VϜ* +4]Zk g6 B&GB 1u<8T,4jNDX^ 8{F8p48Y\9n~6; n,t..lij$W< oZ|p뺰ьGx}454haNR\_V^xA9sZq2;wxxع&SEcww7q:=:f^+ˡ+|;`EBRy8q"ؤhHN(מy|2e_o÷L/=Sm<1yY^SY\ )(r*zt_Fi'OaXrl-NY)b)ꕭOc`ZF%>#PhS9RX#X68t{e΅nP-~玟14LƓ"S5O $t9d2EB)O.ۼ$6~j$emdo̱jgg$!'<#L"fC`|jg$GJY6$P؊ ,\jmSI͍N{LU*G1?;I +rRk9"tDxB>- F&QyuX&Ì_o_!A4B4*jRZjPzZN5y ^ j4bMjmk)iZ$5LjYN)|uAI?q>wϤ͹3gp8/aJiT&,-Z%pSs#q.(2Nynz.\1t8>%_ޝdلNF]HѢaRMy 忢LƊK$6Th Lʹhix5VZSO=I0)2v7ο Gߢ?d4F;9s68A c-@B% xee8R?n߄:YXJڊYÅB-y]y!.P>Ay }PGO߸Io RSk-ޤ۳|5W*yr.8v 4 HZȌ{)箞y6UTv-;rCgƄ<1ycsTbɒA|VYnv;3mOW4,/vqYdbeaqVGqE&YQkKxYx;ح}jPT`٨z,#WAQGޙ:{{ 6%5D:Z=Y[k8,(t)qU[Y1QHbO͋Rz dyΰ4G u%LAֲE 7c!+dGdUS)1S;KUUse」-:R%J-[rlKrcpnIza"4@wÚ^k`0`z&pmh %U)T/眽B¶Viy^p>/r7ShϫڲRMl=Ϋo]hv\zE<Ѓ{}rOc%> ,K (=z]wˡCEfBx/8#+ϗJ_x+ީ_Ȅ/(/T-!XC%eYRzc-lߪfOfǸ;y9u8-[rq?]yrv۷5RnC+E-kK kFANW3:DΝνw͑Çz-lƖm;LEiC86M*'0EYB0FFxzƕJoG1&FLBcݑQlLLDaʏCÁci@|iQ<<JMXK] ئ֙[ި%ZH/D"HHsXsp!</`sɵNqҖ!1hdt:Ε\Jhuk|nghS?mvYvbTl︥n,ɋ>wa$ q d ҏ_|Fch< !H_kY 2n?z(xQ% ht*=ǟ$khw2’:S$EU\P-{>0Bj/{rւ1j A'B8y$~AnrQ Kt橃Lwtq ћ06aS {+%B鄕a">ÏX?G;:N49;Oi_ G-: Qs a=,rN8x>=8 e-bu[(JXD"H$u>@̉.ؾeG2a4Ea7j3 ^`痰bW3Q{B8m]{梞\gAq~]JaV嬂2Zk2cH@Y7+`8P,+jdYM a^$ZZKf|@;,B@K^U92066=etQ{3?ʃ/399J@P0c/$YʋXmT)WnZˆ)KK%yÁc|+!mpe ffVc->/2z }ŕ( FkB^l)¡;hߚIB`\0jy[Qs)kyꔉ~l$xQ TW{ol1d8 (GPP gg;gxŅ [WyZVLfLQR ^u_g)pȩY~I|޻xb~+K`tɇ<ћb * BUAAcш@pwamA)J3}Wg#Ӕeu8obZXdȉS4evw>&1YFf/hQÅthEQ:E)9sj9go,_~>҂7[ͦꮋo7rcdr5F{GsampSHhkXxDwg{2p/[G ,7z H$DY-̘:6Ź9 B?bHUҤ^lL2Pd':/E􌅥 /z(KlsAT돤Zۈc} Т7=VŪFv(:\VQsc!; -f݃|ZlA9\豨"9ǖI'Onx^Vo;z>׉ _ABow7C33h_(DЕB+h[@6ۋhmL|̠Дl1Lpoۡ0>?d %u .A,*T7T|X`ؾ2ɍF'Z;h ew誗2a'gb8@9:z2,c'ϰ판 FSs>y'xiKy^y\E /,ǎbt/'>Uϵ_/.-[7MBEp)|i'Oqq{}n !GcO0:>Fica 莗nO)hNW^e6WU\q` a4ǎfnvY_`'w ^'`W,--#8zwqˮ=pp^t;莍Q?j(ffyCwɧrQN0`ǺWy&z!+|04ot0lHü̉)?@ojwd|d*tyBjF3smQ:‚EǗQu҇RnU4spW/-F\Keyj[kv@YQϪ:(km(04CU!Ƭ&xs/cA-D.KC01X.AWiT叮ފS]:9$hgg ;uRg3 ˽sK,/!5jz+} ˜yxٽtF><˲~\~eO$D"sJgʄp(je ĵ!U!UIϦJ+lݼ|X 'cmq9AXqhú'Y3Tlu>ʲ VZa>*Ti谭[{~u'ҳlyL Wbuxo;Nv*\($p!U&,؝(x/Sȏc(ť%;^?\ĻLl IDATW/cN_"rH gMR(_`|^QA^ڡ =ᕧ_,ͥk(U?wyJ4wo{U^ s )3A3, +}3:2BQi,b-X\X?\ڐOlo`(0Q|TsySWχߛR Op* 0 \5(ݕ83Zc2FngjQ{m0R}X\^dai2/BDkgQ6q/TCWY7=) ^+ ƕi6c_j[̚ׯ׿[__iY+7]w;D"H$ώo+4VQ ~\U^J`ai*Z؆JS8׼'pw/*/ґ|z!%წLs!., E&')ucQJU^z,nl_l%*Op8;~3ִt2+ձtxFÁ1l\{8V!|RkH@7*qA)<[9!'NAZ0CskcE,־uNr8-JT '? I8B%uEZWe78tD"H$}-QlZkh|/̼Mn12RJ^P{)~0F20AqϽ3ٺm }M<>: mf02\{T9t، -ѫ!"^^oU (&6Xw bA l\rAVraN>tRgȲ g-NBdA_+~*/6 Csqgaǫ U x4-arlEr|zuφ`VQ Sh `7H/9"A ^a8߰F; 6G2puD"H$5eQ.RᥱU_ |G!h՚;z:b}qnMݢL!%‘PJy$eۄ#6,%タip"W Ry-7Dn|O(,/-y m*!n;nMj]9JX) cخeaq/Ҽx3A=Djqg#P?p^q|i,sj^5(jaY3( KՖQ)^͖֡B qX;bՓ>5B۳B A]5aEnhks!C !ѓQ5HU{ϔ/T &芰)[fd U]g𚡫^kbmkQG:퐪sm㰭F ?k#[6ohY5zq_ͩjG}W_j;sl@j8Fh.*_nM!Gـ՟}{}o,H$Dm:o, rB>ƠƊ ;(JMgp!3m366J"ށ1_m|oA瘞\PHJcs%VŠ#º5Ł+JKt,m,.@ 9ԫ=b" `Ŗ'sPѠ\ePRà䨞a!4hv*EU-nSXDT=`kfDѩ=l+LG/HBwu{EhC|S ݻ GC! q |ZC+TA`(ȴ+;t^]c:F!kfRdJ3`Ti&bGq^y#c,+81š+b BC)0d:4#)᧗ \#F(LW8.ڽw?|G1p 7pq8IIٔhe4#FƘ,7Q䪧^`0GH$DkN8I=u5\Aʋ XG%xQpKٲ)q-C'Y`W=yWE]>cm j9njR/r0bHUޠwy_LU[u\W{:T@bp|ZH,֤nzquZ(F.ηhqUp+n͂SO߬jOƺӌP90"4Q{^y[A 9u`9atC21wj>Gs2%/dܪs=ޕW)(gKμ([GJ"Z=4犮c*| &*V&Y60VO8zn5nҴ{iFo|mXl ՜ͭiR_(dϠeL:T!,\@7RtF3'"~,,-"'YXZ‰/NTu"(-aqCS'q?OD"HxGbSR WʽBYP&\hT2eV׵"Mgmʐa0vF sϘ?Ξ!!\͗HQ9PtZmVz}xaoXZ[y7|m8jm6Μ V֪B,l]YL+Z~Nu~~~ն7:04Ք7j (zUVW jB?-_"WJ|ޞCz",;aA_dU7k={*\WH*Lgsp☙wIAbXX>tQ4SS{YS:G QU Uq6zxeOe"H$g P1a_UW)l$_<  *9+'+o7C(#K !oT+/E0ɋZug/,MXXjBCf`8%(Yj莌t]AA%}SR+q\ `G/ŇZGcRĦMLLLT sZEB~:p :s;?<69ṋc\͈", Dbn x?>",=z KV>R*TʇRÞ晚bia`gsB`dВ.x p#XIQ!G\j)B~½T<VT)½ĬјLD,Ε8)1- v܆ɢjiT}2gFYIw]?} cct:1lڴVa|hm߾/#F?gbl L44!0Go0~i8~\vU+,sαR,%=4s83c)hPTp;U^h ;F =ӺuɩۈUUCSB$E4:և8`0RH'%D"16CuY7֋ņiT\︈nn}WQ`muU%ڭ]J%~Ywgx)Vs_gD~kͬ*~\MEN.;oejfa9*GΚc0Y10ȇXg(FGwnКtև*_\hqq6lކZm\ϖT=Lȇ[O>Sɇ )W|hp,Śѵ^:dzޣkaX;~O}͆F/?֎> c3%( +-cnn -!Ml}-NXXX^]MOwhQ󅳸 l+F'e^Y2JM#_9*'W_#/F7>A[T]SuPs{}o>#ERWU_o,a>ž^[7%V"VWʟ+*dN:t#!:zWBDEV6'4,$*3zQj:.z6A g# r=MFo4^g:U k+.LOM;:9_ܺM9[ͨzA񸃗U4֭c%JF4E#4V•qWk"^0st+O{" ʺs, E{=vA"|7/ n2KKhr\6 y J*aFK+sI>`Ho4>6 V4<(Y~Ӡy. ;4 Ҿ s.^?ӭs%ymEi+k!~Տ*8[/ÜYX"VmQ ĦϻU2_ Fjрݮx/?}uu:%D"xړ JoIZ%!<>l4D([{VEu[mf7FUZA2MY N4KJ4<4Ϝdx*UP;Qnb+!SSSXPыDOֱ̍Y0Ys?kp(6]Z[Xh7Fh|0>~lMʧ?2yn,!T\g96qEQWeF m t:ָ 3VFaz<D"Hgϒ L+r8z~~! 抈{,<Ț},?w6P׿.g5?ˎ~LO_{Qy^}gv]$-7z<Ӽvz&/kG%73|eeCӠy Fvgɰ1?{dJ81uc|dqx$D"xn:J$D"H$DْDi"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑H$D⻝?=ׇH$$JD"xy~\B"H$kRn"H$D"H$SH$D"f!$g7sfԹ>DyID"H$7KߑO0|n3>%퍐o|֝\ux%F=L<8EVWud ݖa<E^zF\jҊSQ IDATOkY x WR[hy%7qH> ,R؂V,[=dr`2Rr#&X>w򋳿ħO|K+s]bY0.ߚ8&.^ѽv^:g2f3!#<4/"ek9`f̒}We >H$I4H$DyLEpF+vȠ K$/C,چVCOtU eq_}-mkp\}urde4獌s. 3KӸ^?M{qƶG:fCGʽ98=M;=Դ]ŵatq閗q\W\Ǔi.̗fXl8}`1gbJsz vYncJGy^LWo^o9ewlz/~7>S<ȋKt(ZC:(Q[z $BGD"H$cZCr!>_P\~x6NL;>F~ye䯽M4iq<t;Lg<~OCc_cVZ#\{7oiz+:}Ǹ`6VO<8[nUz#%#-ˈrhf,Q|V}{ڰ؃n!W/btFl*8m^Ķ(6[L*6= ud`[ 3촢ӱ F>]c(˂2 # C/)i SYz $$Oi"H$a(Qa7XʘbbIg &Lz;xN='G;d3̩CC .Kz`哜pΗGロ nu+_u^q+G8 bih9u ^_jpeW1gy0kw?sstŌaZF;˸.jZ{e+=dϸXc'OOw&[YY飋#'Ʌia.Kʲ`DJlا;E="̺\OD⻞$JD"H$Ǹ IJ(?AxO_@D 8/D`Q!q@KN|xCR(N4DA D (PJ!O)?nGQ8Pއ)-҈8]a#D;DSqCa- K)M$kRn"H$eQ(KJU('8^j,B%W}4J+)E" >oW'΋bA!QAsH>a^zY+T ZX*QZ V1/;Ca0j"xNID"H$1(/R8J9XPNY T^U .x+ h8D)1 qXHP- )(J]5t`E/#AE!>7Ի0` K^LZbExQ+ b u~D!m @ESsMD"H$cj\Ѫ=K+B\S+(iR`]e֭lݼV '(|qtt"!7ӊaQ*T&("o Mj/Xt>$Tվ''ضc'9}$+D=J1ayPFs)!:V8'xP8%&)I&D"H<>+> 1V+Z(h)AF /Z.*6rI&l_?0X11>[F~-KFyfnms|>?~Y^XDYAZm2^ier]r]w2-`Rn.r^җpٕW16e{y;vmMs+;v\HKk4uª,-mN\^rf]~gn-?~K9v&&?ʗn#/^@+rv(M$S(M$D"x#xB}.FBBY[cCL My`݅!\7q ^ʮ-'f.{S;' N^t_~-#|>0_pq_}g>e+o|#ؿgk\sS?xW>3dOײۿr>?#^χ ; PA v]zϻ߆<(7O56[d:_2/B~%7I(DUaL)L"ܒDi"H$F~JCFkp) enQرy;{;a1cg5JJNafY;eӌϢgg'Xٶ4nv!}}O<ݷF ƷKy~/K\|^rݮK'{v_=&~g(ghW𝙦~|o_~;:I9`1>d%MG:jki=8weWo#d!y_VY΀9֪*LYsND"H$c BW|28 /_yϻ3XFUø#nݗ^͎??2ͯ!ϻ8v7s]sm}yNjc=wq/W-\.<0FӿbͨSpN>D;x}OPKK U. 00woM2w dNh}]_Fډ})?1Ko@m+%-s?[SbNPnNWAa2e_` EaciV%YH<$QH$D"{-71?<ģlmWp|}=\py %Կz>NdϞ R;% ڱns֭|ߍraZ-N_}mu1_ɘѕ{?I.d^r; R,0*RZ-xRD9%D"H$1.#5tr邶3/_^Av0ꦗpo{?'\2goW1WS%y;Yw⃿Y\NObvz͛2.ر/xG'N)&/+~K޲G~3 ZヒﺗY2 \3g"3mde׊#Ǐ2;}sw1?=eo~7ȦE3 \hnf~oQ7q+_xG,296K_O{;c[zXm-,.'xe׳ҌYA\sE<6+ 粽oAwZ/{???avރيio_=|\hpCGypSQ'K3^|NnܵL9R >z}߻z?r?/< !:3EN7`r.߳UpX&yJ} H$D"qvT8E! :="\|ťč!^q#'a.?vr㆗q_,ϐp;p 1 , (L T3sf^I~M[V]X0߉Obۏ(J_j35?#MRAz'|63_D?= /М>}#KLz$~|?j.2 pwC7 /@=[NͯzfXZʜ=[W5,8eBqD"\Di"H$q%kieK|/>'^2~>Oj_?ՂͼE/r =⅗'cׇ3*:CO3sDB< ^/rA@QPW,(*J0  $d:S;=9jNOI@>[µ::VwO:$Z r$T\ڲZܙݡc5,ޱށyȤ)b\* Dǹ:` cXj+8o!ZܠiHeuǟp9RVBֲ~6ɕvFvUs:u8D7W"eh:rfaL6zD"] L!A{4 PJU9111Js#N! FrIu(*-#0-)~%\Ȏɓg֬]KBQT)+B]9p7 N\Ggjz殟g~A#r|ދ=N]58)љ~"GkM Mߦ&?w7Eo,oSΒwxf?i2}>qRFka^ُIK}E~׽/U{Q]_u7j4a~$vpg9;9o,XXv /géNܙ裨 Ӑ @,^2j La]߀)Ҙ Pp@¥a䐡L8O=Nd[>lEΝs{Qo%#r8e)Izl(Ҟ ݘOr%gSe92MHQ!޸\Or]{Ȟw/X/~3. atY s+MkM| U v~vO8Wt++cs'\cw+^r¾={S[E]ޤm;?.455!"˯ҳ '+Wl/5@ӀsB7s 11111111G1*A sP,ᤱ٥ UWt'Fxw~ 5f|{X&~ _݃ eǏ[`hcm\Գܼv'.[K(Fv*з܂_Xvo-~\S 'YA-[pQQ Zf-cL3e+׳%njS&ѵmd,J`p,VZDL#cȀ  DYUgѢ7Y;*.۵ !FK=(T~UK7111B͈*(m|B^ZYGBxiŅI=i"j>쯯Gm }h8x6VU3t@?T!"OTa))Wٻ TUbȈ[>;lo݆,ǟf>+(l܎ cWDۭ jT-Ukoݵ \nC/~r3?0d4kG *:{0i^[9PXRu[7BV]F㿇+'S[S+(Ҙ%11111111G3hP k,hcCw{VgÆݓ/ `2r (30_Wz v`4Le>:\9sQ?PHuA-3b?/OsǕBJx *8Q {ɓ~=bjV)$ٵm;{ipnjС(-Mđ\畊}G/Sd=֭'V$IQi#&&CҘA$|˖c]~~urܔNz+*wӷGWzr]z1_A]hu8 J4FQg~+nLFx+Ӧ=۶iH_^cNB=;dv ҥ {DeKwtwc܄)|2ԯ{nT!x=p]"]o}VڅE {et.J(%UAplE׳W{ɥ=(2ʨ؇RaR\bQs4f&~]I&R*vCʠpXB9x$sfaa+/)ҥX8c˿Mjj*PhR ]l,,f悗5)>zu1mt.EMpSrH:b,o-]}L2Q_F:1s_eֽ|bـt !u}z0kz46!͔va,|e!|S \.ke4M,vlg;k~y5OqZB .u* 39^_JPu҉ sTU׳/3Xf , hQ)"xbQs445j 3"7=?_DPQO|&h<_Cz2u=A⎼lxl.H.)Lw03 6\kldȀAv%od|kցXB  JU]u˨cG1䖛)6$ph-T5eH2SIE;zCePa1z;3gҧ.ּ6^S>KcS vqF q^|[sQ,[!mbo^6m歛6G"ZF󡬣ϿD kؿ@!(lSYysټs+dպw_ Q"60 Ә%111111G@um{f'QN ֨I^F݌\g[o:X$6BЉk-_ ɋsMB$:B]`*416!jJm笹{7:me^VwxHlw=]H`пWvUPQ{=XpZع]Zim0E gYH*KS.`媕ZB!֒:t",&]T%=?)09]}a>=/-C S@"e!B IDATB`΅ aVr81ўBklRE*BcoU{_Y(ZSh-8Q:Eo% _g׍5nbbb:XFJ:kᒡm/\rg9N–tiG慨PV GEI;2^׵/Ht .uG]^pW2cmQ͹C=߹FppJ ;q. -N (y qeJkYN8/Bɰl雼MP.Z03t҅Ɗye9 Yb {qD_dm8ĂA-w] WNp4?б8!@"ιD緈V}o@DO"}D%U-付3"1ֵ111B,Jcbbbbb\t," cmF#hmRgеuQ;3_wsi^ۖr"7"WE*KhچvQ[m;ޖyfGBd㭽h6jG^ڼo;Vu߹f!{+턫F]]i9?b < H FjET$2,pl9*pXidݺw0Fs`:-YAh H@\hεf4/ ?DU(6?@kF$NA۷U8%+墐];Ei (ΐ[ء8&_XѾ%8-#:9-76/f K8x}[ﺖ1i`n!yp*w҈Qkhpc| 'J\$ PI+ /V1"X hhcʥaK.Dre[+yߒs!.pF/%q,64җpx~B$.5у$ʧ+)Pzb4sX4|^NGɒu脇8V@ųt~ Ҙ$111111G_K*hZyA 6vZV"rr[iv{hڭ5=iv4ۻm\6nkZEPC氍ڲ-cim$M3/u.hsomvZ J(kJ Ij$BL9.L!eBiD<e 0@*9֠f5ąs549vŌO%49u ТH%,W' =P@* J.Dw3)N &9hs @{z}cbbbQsD8G!Qq͋V״ע$[F*}a>(!P<$,bZ"y_Vi-ۅǶwhۮl'N^)֮ۘۜXk§9=No*зpd+C&%|VHZ% ,Oቢ@ ,|"Ԃ x C \G@Ct"4?QT9N9yqTS)(@ ,ʼn'f9vT#%EP\w*/i 6r҄G&)exEmSx~!΅֘!111111Gs6o! EŵuWm~۴}V4bu]j!m\Ҷa‡sKn..k:[B}EhDv/j[||,G(oC i<"ei'g9FJ2$^3̘>[ -!5i>Sdȹ,c$δ9|X498 6k AWͭM=_Ѽk C:]Ĥ tJ$y"E&‰f0cNr\uU@acH #b: vEiLLLLLᤍSz$TGmNQ=ȶ0[ݲ)/t'>g:vi=򪶶o okڮmJ=HM76;tۮ }/l* Y=ѫ_,_I)/ |UQYx쯊n,&B*AÇE3՗)^5k6lf-L?TA Nl{Y_幗^fWqӦNqR4=zr`Ɯ4tefߞ%XIO̩)ڍYO4e#6aQ`BZsΙ9M)(LPT0 !sB$y}ds%BSi5j*$\ zcbEiLLLLL.|7 l}edGh)< b"3&NW|/.YEW >}7Y=p կbCuQ#% (|ʛ8pj9^/Ζu9Rt)NqE/EXX/Ϯe[ 7O| 賞[WB}gIhrLҹha^'fS28 1`ő!.x$Ǎlsf4r926q30(9ߢt9PڹGFAUr姮 _q̭wܚ/re6N{"^"p6JXےK=i;?NhZWJ)!Va< w8E q ABYLHS>ٜc*ݓ/LTdo~e{#N{kDG*!>'l É$BZ!.Ԭ⳯\XcnM&;`X&ޤ4&EiLLLLLߛpz?H>ـ$g}f?Gh7eIuW8i6 ~#>ӧ}Ouu5C׿Ͽihhd܄|@w.󟛏֚{y7F N=zu_1wW 'ѹ,DgRa@aHMQ:G~Ү ,!%Kt°~cBv 8f"5 ų 4چXq9yd^\\-8/RĂ5W^*\_!@;.*/%U5Pd9dH SL=M85z }^&ؾ~$']ľ:R9|/֒ t- ɔ FQTUS'*z$Tt!h|/Ee CzH9lVG€F*֮EiLLGҘ#ཛྷ҃9$ik^55C:ˏ 6w?^ŝ_ ?pMY3g3h@GZˮ{C%~yzLƜ4_xYAkMTUF.qͧsGrGywSN tI }zʡFͦ4d}{X:N#Y,,x5>II'Ǡޚ@h+J ~xB!A>#ѦePF!Ч%16}B!a:Cnw6<{CΖ[n&/'h ӁCRIu'111111G8Ë~#>MMu-g{zD,_]D.3dY%EkXt*i0|ܳ(T7vW~ 5Q&-$>&g˦͈LȻp A:X*ÅŊT@%)V+\,)h( ,xu )MAzk6GbM{wpUēѳ֯S\aӰv_OE~ªU=9xOÖ͎E0oaJ&)()p|틐ֲrU>4A/ NW\zW8} |,A%AYɔ`F)}.Im= x(m2TB. )cCD³]@2}4>^E,Jcbbbbb'%̇UD_aZyXqws1qNs/0Q#C?><0ϝWn*JN=}*@KD"A6kys'SI6(ŒCr& *Fu$=K*z|OXop*jgC/9H(S'K `LMIJ;Yѵ+L"),{*Bl W^~x>RG[g˧J([[OR*I|ky)4{*BݍN%l؅"O@Qơ¤RTBd@‡\Q1d0$0ier|M`!phe(L$!FSbbbbbbbi=G>?v:\٫'‰e¤q7؀u!UUQD\:pb9Yr o'm@6!83^op-uCp29ܵDGࡕ88NSx," >?`'A:L; !PFNa40!$vO4Na#9崓yμH>Jsa[_4 $-6n+jw* ')&M|p\%ds%o:мG?d(λD/4 6 r4 MWzeb͚MC-@'R\`qX<hDix~ю{5=t)RMIi |`ABFNL?,&&&&&:'͚R;;ogO_!w9 ^q )i)Cݻro*(*.);(((_-*ӦHʇ{N;H@ёh'a yNI2TPvl1ѽG{]Nײ7=i߱rnoH.Ǟ^LԌ?QcBSTҝ >ڦCI:Jڋ=ot08P4 Weg(29n,n_h,9Яk3tO+*j3TTH0pa'!ǦwՔ:B5&111111G$::kZ0r_[>ڝ{hWss9ÔS'1Iv*-gtHfΟR^ծ#%E37C صQ|<,uP\dmW$|\%9jڡĢ}3N;)Ӧbu191nPX0 G4+=i̧59ZaoֻCccH}C' #+νkQ_"[w^]`)HcʷpG4|[PY8"s{zK))vḿN;Bҥ%g<LKrYT aCXĢ4&&&&&8-ab5N F'olKhV屫²mW.nH4+V:|iljMn9,dIkc> G}ig*ӳFØhuO_ ;6jmV\ts YlّMML‰Q1?> g Bs B" zcͺ<[Vʚsfɧ'R)W ^̙c%@Sǰaa&R>)YBX|!D!u NX0MzL>.)c Fœc:A)hbQsxY t(U*2ΰb-M +Ԥ\~ ٶDzs{e Ca&V k4Z ьȀAifȪ _pl8(NXdrIn8PMQjkkUqOүAE @ _},_モϿLqұ!'P8(gٽش39 8г)o❝*2 Vr>LK$o9P\9P(O!Go)Ѕ\:UkRt0(YΧ+1GEiLLLLLk@yP߰voѯKy:EYc4!,u ϽaŠB 5{W؟W{s>L$䘿rq((m[9̞́У+z ,X(p@% 1ǜy/ױop5a1%R8q^\S&@]GGbА(Cٴy+s\V,Y1|0y%gxABs*20 24e455gfhMddYFs"3<Ͱ{C]f-{wkn`۫0Gii)} ~i>ÿ5?/H&q _ O/g}ݝ#&111111G@ƴR(<ѯؓs2g6ǜYX*4OB[Θؓ:e+ =IL$"'l޺mA,R4b4spV+scr6a9DkТ8P p6Dl=3B X@uR;7}S(@9(^a Sd̛'t+K3tp墏&ؽ^A%*tҀ -%Y*4O3X@\!heϞl.BΙҘt)Lm]-EtWbRҹcQ>Y͟f"dq si.D|G,ZIvi>d5"s(0F,ap<N(b< C[ Q\<8 IDATYVX@ $:HH*P"&TݏKL-y(Da5; S_ȩ–iyB 9PIx+& i0vlKwuwަ]`x饢 *UpXƎ; dzq&2 { A`?eW| 7𙫮o' og[7~iʐJz)ԔgϞ1d > 70d\|.lRڹuƜ8K/E]mhrnf6oマ7b⤉G7=cA0|"]'3s168qL;/Φ&N4o W\y97t (9KޣEtwb>@طw/'ߡЂ  N1b/L,Z 9 |Kq$K/.mvMhj"}M<$s$!F,7EId$L ТYBg`(bu#W*HRyaJ)v .>aÇqnoofK x'߳m[{'!o܋GJ'?o`ㆍs1wϿ<=Gk^Cee%uϚ1ǎo+/w|7,垻`y,^g L;ⷿ7|8ߍ50ptXl9'cSX+\|Ek?t:=wñ)sfaޜ>!Ģ4&&&&&Hս0M7s;1 ]tQ߉#r/`=DP*92QQ@y [h4q !@օX1(Dk*| PN!Ƃ0.8XPa7KF,yADB4ȭUD(H+Р#4N EZ8bB&I!JQ!f_hr@o)@)C`@ഐthbwf߭=9l7a5TUUͪIR9*WһOo.żu><1q{x?aÇгwϖ5٬ZKΏ֫fYDHX:IS&ʂW?ag}ŗ^ggs綜?gc=:߱(9BzuM?nPRTǰQXbG{i:F dHhuv$A,94J|Z(Ey>V/!hR4J@& %/PNV T8xp(#HhP ADPN4(TRU *GQCjA9^u.f NxF״jTH~mkXG`4X%:2&YAP9 CZcH {SWWs9s9d2M?"f{'ܲ>6ɰv: K_{v6kQǏb]"JהtTh9~w[?E\Ⱥ|2$shm+ϿSG3z0;yOOڵ۾N;c߼~*Ux<8k%Ĵ&S%Y| I )2f-IсpdwƷABs^b0ӆj4iZDa% ĠhWH`EH*!' ` MRS/B TBz@Ϫŋ1+p sq)1x(tA`CDظe1+W~ƼOHԱpb&{:_/<2=p\ y2)(/1{ڵ\A7H DG\Р@Q.heܜeR^^ηnC&tANNHeŲK8|cx5\~iPPXW<ٹc'pos? ;;p8}zrk3NGǃ=/K~0? =Srrra׮|ۃ59s6-fɇRJ7 2 \{\r%OxAC#sċX/rߠZC4 n(%HHU!0R>B>FJt@DWqca.~ ᰡ=lGcylvt0f Le"钮K mC1|HRV"s'94CzD8vSy=,mbyp;q3G2 P $yn-s溌VLWଳrQo=O}&ξ7_ F;i"1DY*WߑPhYELBU8N ||-:kJ#8!.QDŽQ'$'m稲*l۵}%{۠MPU5~8!K0Gpl{6+J-bX( s ѨJr8e:AE"\TU/r4:0aYg㕷4U$/Oy5U?jޚ{K|<28Nϣ_*>[ݻtdoUw bu\v> % a0ưv`Gq܈*JinLeg__KgʠraD4i!}H!WowXq^!&~ob_tEX_!=ԉyں Ő%R*MXx(%0{++9p|Tʠ^C\SQUq ǖkksr󪨌VE<7piCVbX,F= uq`O?A*ZɮL/HI1r2rNau-MN,bX5`{˓c8H0cBIFU NEi|@г`؀vZ(;ŋKW,ZԓϷ1;ңa;0BTY!ǜ.~̚ _:ㅗ_w(>HK+ O?.Ơ* xP@j'E `R~G/<\^|Փ;qйKg9-}RMK\qF:xƝ<y?svhD@ "Xk+ R d ѻ[^t.9}xW0xE?Ο䐑ďŐ"ʦ +΁!f*س[,ؿo;}رaJ(:3qx9v<#֐v|^i!f%S1w{};w悋..[&O1o&he.ɀAC(:?#NQ'ƛ]`_W u!tLyA4X#?"h+Вh3>B BhppF8g%= 9oYu(`P$O 葝Aqh ez㎛m.owМ3EӾa 1(#(,_֕P9=;!4aqC$;tph ֬5<0]} tɇ}7_"Adyq2/ͷYÆu*R<%ؽHfv{ve FI "͉6I)馛ׯ'V8={6#FOdƌ\r%Ϛۆģ[ŵ)u_~8<65ơ%vݻ 7ְHB!relټ-泅թn:mW6mBV|8CRzͦѷ{Kh9FyYuz{#*vwzvQYQI^=(_|p9S=X 4yy@q3DȎ;xͷ7sNo5]]w8|Sz-ZmH4 o"Ў!1JAiMX8A#GQX$9sZ28YdgjxFa%Z)T%~m47lc)d a$ZSd(_'bYS\θ^6l<+ ZGt ]#Q*Pd0r(cF׾*~4Hdbo B._P D)a)z4}t'MĖ-[jmݺ=z~z֭[heH!5կEm}ה?wy'ᰩ1--BAA?O83-o.akS9컅 )^MeddV'9\pI'hÙgIAAF oO1_>.Zr2BvZ qEl|RHKө}ZQ/JeUE֯}3ϣMgࠁ&땔Kѳ=z`o&iiiP]0**}>[NWRJ ?9x-}P.Jq\ȈD{i g]tdeKAK C )(F'cHEk-%FR>׹8sf}"^t!e 6W_"D2D|nHS!  M0eU xrӥ{OE}yO971GV .]N?P^=A0s1Mu:j;D&BVZ2PJJZC˖Z]L[emw x饗K)//gGHMH%OB0vX͛W1 cc=1ӧsUW_`ysi [JD}A@nn.UUUD++ 5|8wW#oY`!yB!*++IOȑ99ɖ5W)EMW1J(EbW>f쉌{"L>k2J)JJJرc'Y.0y^,c'R^VqУgwV\Eؾ}$,qIС Xx i  cZr@Il0QEDB糥̜)tҜ8>BE 8ݦ($jhCfD2rᆯ9t)H:u͂ < VhԠ] W_֧;5{ѡk.\| FDxY3[J)(B8C1'oSh !{+o0lXN?Lt~Y8\8xRNr#(pdXТYZs=ƺ(((`ƍH?YC8RD0`!Y=S>[M… 4h޽￟O>ޖ~VBLYdIʛCkTZ$Jw>OYYp~2xq^h4e+d`)gr`}91 >1OġYRP(DFZ[vl 鴮0Jh iD,q8sL{g3rdBMΎ;ջ']~ir&Cg=<3D:QH$M{iii|',Yuڭ+SΞ&Z,_vtAÑB('Rk@0F"R0t4FH"!g+COѫU>ԎN~󿒋6̚) r5O3>QplmھY(y9!)*ejB('/˂|xY:dDa'Ozf'0Eyh?>̨њϾ<9fb&cYz<=~P^y١hA(}b: "hH- qB`Nod8̋/ FJ9:9՘?$ l7o> =ܦ8T賺[(..^۶m׳l2`y[TZ?kA8h zϝr\biza:nYK~dfd(W*J++)ڻzvJXMQ Ыw/ڻWz 8gLT<{!/?:aTrS8Bǧ"n' .EXPUӡs 7ϯaۖ;}' g8N,ߞ緿%6o}F="#=LÈaN #:6j}n(b¥G?f3U0ip1ln.B˯PV\1>FϬ<͜QoIAO.vbe\:[1A#¤7u}]w3f`׮]/2~x?1ydMbi~&4a˭%L*ܦ8TȮbߟ|g9mFvxիvlm*bЫ%W֢-5-m >= JX,xr +vю:}CL-Ϝ͞JGpjSs3UQ~F7oӦСC.a`̜5'{EƋ0h eo!##l@(0Z+Z;lݱ,PTcUst^ͥ^IQ'бs@" ` e%?{o:eHPZ E\KP={yg)Uѿ@dHE0^oaT>R tba\|r-$p(!+Qs[~eqeuR8hk l{¡1ٕ&cҥu5TZ֦bE!;3 Hb}n‘T:+ Ҡ lٹ6VhV$Ti|eddk,fMl޺yc0"eoq9O<O<"z.XiA "Eųw c#4YI{qzAN1" !`/GF (5V~ L|$`"^۾@'7J iBNCBK, ]&_#pD9RlcְXQjX,%F9W#A -6%q2!#1'1I)w"v#N bcBQT ij jct\8 <0*j B PJQWչSdx)ЏqCUKBD$+EB@?ݨDa$F&-.Dn26 aHI)U#K ԫ0SCNqp,6Zͩ\Zqle}Ǐ6mMkHkHb9Z2ߠ*qhh4Q=yhPBb|RHc Mb" VU d`#@%T)hP:!pu"W'Z 0A ZU-0A D83H1}DDN1qA F .FZ-1" a A]6w |nژfEb+[MɑҐb^gwQO?7zS[wbX):a¸3Z{ڱ5hUƷ̐BI;zZ1c Bc\kZn0&W}9O HSiuTbt#pG^IJbX,-H~"{,# a2Ҳ :uR3roLk;b5EK.^[iq=C!{ 6d/&'+u3h_ǝVjSjmBpt&q+Q!ےhQp5h_`tP+QDqG\k?#$^j&Pmʡg^lݵя1=+Cě j=:'Dn39'2DZ$זaEbX,GMuR&MM3MJhM4mzE\VA"T! T;ή_ԋ2q5uLB!NzJ!~Pc,} I8 ']] "׎TվՎ՛^gguݠYaK@u+f[,84vn !LT7Xׇᄊ4+J-rP 4pL߮KcPZr4*Y'pDM>5fu3AЪ 4B Q_Ԍ&ctN:&5k Sl2N8ѵZ96&݉MvMrGɞceduxx2>zuR[Ӊ:7 I2%ʫ#>z0EI!藩9N ATN;։5thiF-uï- 6F.jRV{!}}kKӱbX,m4Q Q]sLϔC\@FNjuߺNff@CSR3mGBj۝8AI8:yZTccX]5kſR*2Qk$4 OM~l$W 5Ω1&cSKI5ۖg bv_5PgbX,5Z&%2\KhpDܑKD6:: Q{hg O5Hj#:jAMkhFk`'7wL$T;Y?>h]x*I{kMqN7)uϣf{qC~zSkZ㒈$AF3ΉgWududIRSPCx5j4v*Hkk쁋}e`VZ,rF),t8vLU|fHŅAmG3~4dN)I&JSIdOjbtܱ]:XrPjNwPDT;VUGk/1YkժG&pG$"P5H\YMSFiݰ󞌔_8:0%Xqql3ڨmbqX}8|~(#ÙЊRbXRQ(LL/KSRŤSV惨lFFLMNҺ꤆h~v#dff։%EQHڻqkׂT0^f(фN uYLQéN:©H#D|:4qg<Ƥw4KCDij m!RƧ UҀ}ЁJhçMIԤ5 \׭w_hNFi9|pzR+J-b9J OB%7Sk0 kLV^ B=Nf#kQ]z¦Ix/QVZxz]DgiN#hV MLSQhҫ:NSsK㦑c$`G@Z\_ib]c]_DSZy6&GAkUiI`s&YVBw_[bw>g?rnƍquɧzW^zN{a43ߟͽwߗ<^^Vn;,w>RE}s. g= PV^λLc4."233mQkMc,xgyտ'VEHKO:jȉ̙?'g|H$<ּdggSZZʄN VqaȐ<MG11e֍FJN9ԐKՆaz6l܀!} 8P(DII1W.qի7 {~:oXt˧Hٌ75tv(d}黭_C{Y%"wUU1츑,Y)%'8!%Fkz^%]LhQr2IDAT+w_'H9{!ģ~GIHIq׽w{!c Z%--BpÍnoY'$XQjX,QJ}u`={ҫKJ%+rs&O恀={__W. P*yN}4SipdYDt㵗^%/rk/5_]3y컩溗ko?O[/> >^_&s?Cff&W}vd䠴溯^^6e_|Q* }}cZ땕ƢHOOψù21|6b\5_aFDk>ocm=WIWqQ [+>nE`w '$Α$?/EE|qitM![Fpëkו >AosյW CZn99ٜ{9ޑb48}+eeֻ5cƝϗaI ~ ~0|_͆8XQ l H?dm(Tf\_е+sg;w|gbҔIX!A@ڛ~i4iA<8?ӷ_~ˇ|s3-U;ҰbX,`?4iL1ijV&O{_0f4k0hty=6N;Phjd؈,]nqg'ZYϖ߷݌1 c4_n~'yUUUTT1lcشi#K.'יvٹc.{aww1uVmߎtϧw>Cɦ7Cy_}z<'n=ڢ4 3O>?۷g;sPXQjX,QJCDNJ/>vL ]N@| C4 8ƌ;q@pƔIƿ` > R6zJi~Џ9zDzb* O)^WNGhn+W.1g !7DaawsrXt 1@n݇7P\ۻ6:_su;mV*ҹM]6^ 44$T^NEMPUmM]%&BM4(jQK֤Iyswajv=W|w=m[![%f4f"dq;w} }wز bMNy,Ï^~}uqvꕫh (J~0UԜ)-3,iuV4M$!,gƍ8>FkkkZWwK%onh0xy'^2/f֘]ZA)QJ*h$20nqw\W~kxQX#:?# .`ɀ2YIxNV vhGD(Ǝycfja=8{| t_>y3xWlrO?8q:NԋE ;>ygJ Y}77,$Ip8=胮q À|.)@xky,׷ٯsKעK88)XnX#Gk7t%B. @H!{(R""* 2[Tۅ?)!upHۯ%zOL0;;cm'?E}},t'牜C,x篿OvTqrAeCͯ`y\1>wƙrzz)'m3``6_юmfJeYs?C1|Lio?a9xW2M_D00 tqmU3|LJIQm?࿆=xZ!IyR""*e>klƅO1f[cׯ(,wϒe.u2r۵M@swDZuXv=dY$cPJDDTtC *wTJ >vJ 2kfZZ3JL))- 3S3rp(b6 c :;CBlYRA)ŹM, T,B*H;K f@Iks9`/Fk \ sP\0ZU~]8u4)mA$|A= "I~ʠrV A,h;0=: aXj/0M0tha n;dMšeZK2=@`"ڈ8ty#8=Jy uadӯkbS03ZI 6 X: BI7Q]@ғe  VѬ%˸{mJ'R;#} /Zͥkn[l25 r;AGU'efThTSpԳe9A 骏es/՛͐JkqOVD fQ;0]vU۸hA#USF/ Y[U "vnܽ*Į`H"4'OG8$4:Amw՗bI.<1)tg-tom?`WxM@ڶu5gI/=ͯFlvaLk.[%S IlF%r_k@ΒtZ{'O*|1Xͫx2?wtێ90"`lJg?D4..V#^rIW\D:zȞSR=yё 6^mFJVIګw `qMI7@,RQ* ]Ӌ>?D|tx2d5A$:#\1&^Fm69j}u%ayBPhg?h3r?ZƒrM ie*:+8QZͥ0K$hI'RIM r {1Sqy(9+lBiÄXk4U{㇣GCiQ\Yٺn W)C:AlpDM/ae?^GnZXA-C$:W`dTқ'׃#<@L}j!Io4gNrܻ`?^b.4e1@xE u3AMq>P+|i\zͰeqr*@!'ii=݅fueˀp78bZ뺜C3\|Xʢ8[RX(RRŬg7-Lnr DX)6zsRëR#I#NUh7+MVf׳F2ǮscD6qBIc3i?GzF%)D$,nٰYHsG#z#6lHHX~v^ ŕչ0"|Lp߄˖aQ֑靅~1VY mL$o"iV=ȝ;I>ͽ敽ymal euҤ,d`T?EL "3Q:wjJѕ{_"-ܱ? HȐ̚scfecM4qiuLzV )]pq"E>=کJ@qV4&(y =ymIY8}sT~9u2 rGFWfrټAHUS)kMxQ1hBHbXD֣;qS[=[ŕؠR`IZP-u C  0]rS #Frzʢ `AypT=832) g7i%=r2]{NLwiNL^ŁWOz=&/p-n(#0`+ NԸ7NH6e=9Кv!ɴ;֝d~7ZBdncv7BEN5Bq̭vn'*zjƱ1&-Ay2NƃJ=:t𵁶M ʽs+DiHT~K$ aO9+5%微9LE f'N.JY[PL()bgmD}7m8of^\#>N>=v~%[%8-lVt_?]ψCw>#KjOeKY E'"?'jcűMp$ݸ*qt@q:O쨼o a]7unT!< >&<`9=U"3d19F]/j6HPs  jٖ $j df]H6>t{xtC4I.B#OVpw6: zOTa]`k(@ȍ}+~[O}D pW | & 1ꪐW۴n7Ro>K͔di<֪?{ -;Êj6c i= TH0g3杴תP1x s ł_⸃?i0 0-2YpM BĒ~U!".o)] PIm8! GVouq,dݸAGV /lIz|Q/_lB3S4ji2Ț+KPjOp\aB3It,NM*ݵO8@" >jgDl%/[Ke\H#AwZ> ӈiueèb)޴ g}7]o}7BN[h ugbWdx|җQ}dʳ' ᜺D|uD!#s lYkbqjF.(0ܻ(O*XQ_7|H,rڛ 6$yiEp($ڛ۾lWTcۼhKب, Ğǩ%iw ɾ 'Pqć:w<ƴz4ۡ{7In`uţuҠ`=Wet;9O.1 [APDd@24e?U5˶fAaTeю~_xWiξEnX;sklR16d}cKvvŅEw Ӱc/5ВH 4e9L/z-[ܠ0-=NsZzOFDWSuҮT64P6C4YǸo*1{M(!nyWBaxMu@[iz<)֐X-lj}6ԡ*f岭 .NTIlRٍNn) ъnyjUN%5/WNȅM湦}#RQXW  4&'R$kDZInоM4ś#J;x3OYg]hMyߣyn:9_.ӎ c+K]hLf0{b@!nV)|y3>OUuJn39spDnW<  Eܤo_I γn%!(K`$'R@: "Ic}fgj MDq˛t{}ST;n*`FR'_,Zqu ]32였9lg#Tn_IMNVRݠ:.zQxV5*QW CJ.8;1HGV{oR5i8캕>DRd8Wnr `4׺n:jLZmUA؈>GJᜭG0˧C3/'f]ĕ&䬔+xvwbTKM1M?ڰvv:)%Nu˷֙٣C e"I1O-C|t7xwƾ<%S ^2ڏ?UKF\mu$vcTٻ3(h]"}?)Wx'dwCpU+MYg)'+2uqVoˇ80MMՁ]>Ug|cizyvvۿ)GնlMROVOѝHuvf1>S[V3$@n \{vxۭH`p b}w7._-Ms'ZnOEYZRC0u5XռC[,+%Lk}R +pr@ȄNh|އaҏZ=9-:X\ &"u:+ v3ϸ@W?=G)*7.(i,KL r+;>g h؟Ri-3Zx(.U oof,-\Hoݬ}Ozs3aޒLIK ge?v \QEzUǮXs"cX6:qx]i/ې̪nN_E|k^ 1[]MH"ȝ7}Ŭd[$M%^Caǃ I*Yӟ*_K+[9eévy尨$'S4ۋ7cx)^_r _L7s Zx/6i=xEӡq'q\6SqW񊍿2dE2 b{v呑Y f3UoN40; ҞZ`]QݻIuV#%\ĶP6Q$˺nO3H}0p溧57XF[fZr#zuf;Q bPt#Έo7 |[SIm zվaH='V9'´͖~bMr:lJ趡Ԭ .r  k^6ώ^ٝ{Y:\f$`gw]E>իdM!tܪA;CI[=}k:6~ڬJ{jJcM;:9-..{.-}srҝtuIt" ~5Ÿv/+7C PTldgQN[TCp3L GV)i .Ȟq&͋gAb6Q7|ky*H \g:sʢ>t/ {ȁ"4ww^p-lDit'Ќ:!)R#&LC-:X0 Npk'^.wIj/FbJܸ6gyR*).o~L055&y:Cf+غ"FAщҫtƁdB`׭~~{VnY6)?Y:DFX}f+1ݙg:"*#pkvɵaٳe3d 4vΌN,g@_ఫjTےI2I'V$$Iֺ-.-Ad}&$w$i|xF/sΫl0.Ng_K&|rc*CK;bvjֳ+t&4.W|}P]j:ф|l[nċjz3u*;}"P`yS\Bo:]NÔԁ&]Z @ԟЦr†<܉ D"k<8ed'B2iVyC,@$ʍH~P6NN[k6vRM w9Οp ~PGIROJ@_>~z!ZV)]5U~ U`ɸ9x6tevd}%j7qE0H277n2mo}! V ҽ@;|遌/'̓$"ѽCb0xFÕ-N4-=UќE&aޝpeB5T^dbt=glT2NTUaD`3ǴAm*7%F"($s̝z|8m 9I=䬮t٭OJ'HbGwN0a. jup}lq ioxaLi&Kbf3Op^^Yˀ*lApR| 0) z:{L>h*?N"u3~ 8(6^Qr(B}?TU[{׉!ʐ۸yNF3 M!vpY9,0نmHHV]:3ѻXTD;G%Ve[E :L;~0oH=( 9fFR֭:3jnP:f!tD H=.y+ʒƣqh4P}K}>^i܅"╤/5! uo}W-}:s;jH "6:m{\xw* M'I>Bw6¶Ʉc<n [JYý h _9pT,djNQ#7wXvWVR$W>#\ÅSH$FP vԝj nAޏpj۫!6;1` ?7 `襃4j D16Ahebei'-ʂ?bǰ(Y*jkv,\s(3( |5bH>ZHcc78WGTKDG~Nƥ/a.KO&;x؎DmT2n GOE8`˸#Om.vɼr5&N_Wh75wipr2M;㘪n-bsuǎC5Y!2-ە_{ϐ +tũ 73Ɩqʂ@;M8Iwq%}:5fm٨6 #*o_7 X{-koR=!&tHٺCRaW/ƦRjou͉NT}"?Ƭe>?ޔp;V5[" 0@Tn;1}o*:_>L-Xk-U;I5ח}wҫnܘb$j4MiG;y&"eiY/О %0ru 1߹ղئRNҕ͝5RmIO}*XIxf++{g~4tbSk朵3ik}7Bc}7BgZz#ƚ9\'ljE_cí]¹ʗ- f`9}< {B[Wmy04毉cr-*KCp i[\pty34rE^2Ib+L#x;kKRҫ#蓝JInαvۉmF25ǜqYb|Ƣbz'`[wuBΠq XUg y,-qb=ܸcim&$4 Ӹ^-Xhw{*=S9'\g] W\+=)w2I>gƌ4PD;Rӥ(4ÁJr5: oϐN:wR7T.ᦾoh@$pRXL1BLy@^~XxGv O1RSfe@с'έ#(G9@y|#,Opvt7_CH!cϘ+6957JMBc߶+j .6ÚD1}{,m%Fd@kk<Pe4ՙكP!R1{@1ɩ\QN#BŗqMQu[]~hm?msP 0msdKϏhҸ{FT/h aVhKזU 4W"TѲaݩ!{*;szCaNje?}W+FF)2.!Oy$i֑HeiV  <ҕݪjs@[b"cL5Z$eu^#Ք5 #O@ Crh+>u0KpNУ1>J9E-OgI5QaB)h ({Μ`˾@-K(3JDZ} Įf2P1lp 0'c 9VYAb}+\ ͒0V@!eަi-e*D{9P1EP'Q+E*bųtMXsZWώmh'm|4KNs4 ¯ %$}*s KrNc{\{yT~U.C 0WqxS­eTM{%QqXo߯MahA+ {ӡYG')wqP^nGx;?1ԟxU3i'jꞯk8c5wVS mw6|UaZ谾ֿFɫ&K%?IZ{*@tއTr*~ Z Kg@{g Gx${j*ZEwfI k#OL Ex8Ň}w?+O[Qa 0V/I#uߏ)^F9;,}OThӬ`Qnc)/@ n?LX@'X;U?ⲂO=ꩉ5E4p<7m}?,y'@?~蟾+S>d6y`So>2_WhP?]f_kj(Ьu?殷CpF&>ҡB:6?BtKzٞ>z!YPltc NoĹPz;K?Bn~%? |PF70|A>w}w(QHVp}~j?BﳿOW?gBm^\?gPm^~ηj-7\EڽUl ?5 [ ,{wf5B W(Ql) xQ[XWhRoXE[`(v (qsstv_9.2.6/qsstv/documentation/manual/images/waterfall.png0000664000175000017500000050360613203343610022701 0ustar jomajomaPNG  IHDR&hsBITOtEXtSoftwaregnome-screenshot> IDATxwtTڰMOm{o$$@  "*6P ( ]Tzキ@H#I2I&23~~z^{?uw7f{a9Q_%_[o_Bſ V%_[o-Ya@h3'  TZ ,@Bz bxRیRIeє=0z'} #6`8F~U8;܋P~@~ 2kqaRih-DFck5b!e.0va)Orve;q⍽41?|O`ٛoz tj(#‹Y ļ~$ׯQJm+:Ųb/&>F `>" 5`@ `ЧG^w(LE892cO18>N`.\אېY-1 u$WW$}xob1Q8Z M?ߞQtuq{-R!},fvޢG.-LF\FO*l$›w+݁rypC83 ^ xy@`XXgїYL-Z|9lsVkB[`bioBX"Q BJX;r;G<gy 1яh,"Ɵ-HkյCW2LF3HG@M(`ȃ)k%#xu]z ֳ{*>9EC1K!)#>ړy:#vFe-腅5JjN]")ud#VRD ,rhfMW|j;hh ,,pˋZ= K֐6 )t(yy&\+AT+prUMQ1'/`2qdBe#%x"p.5Ոyk &Iz7O_M )`` ( Df1ptEOe Ne ߋٓy7yXDR4{F@tq;:SΠO1ٜPbcX2R*jjD"aT4QSOp|\XBJ4qXxKs,AB`0?{{SS 4]`ا΍;@yD'#`k D oQh]: :DfEJEԏL: Mr"+/EĎ XԱ6s'LR:yk5:nK{+D1O#/O}%3ȄBcm2=9baFYAtt35Hӹڅ7^lCYyRhSm7於`hkٞ$Fc.Tz2WٵZ<:KʋNVD<y?/Ka|؟@PtW&#ɁDyw꯰(qqZRNq&GGq6\7GY1VFf3_n^bޙa}va`+m )_0w"Hg\i1흴EKz`&Ee:Ck5TאU=.#qu';qPLG~~XQjщ6 1YB1؟8QC`Js?bi190-[=qttɲ8Zl{+ 9 t2b*~q+ͩ,1 `w|@~3!x{芇-C6P@c+!FϕGts 6FĦKq%_`AJ(gW4&B]ޏWE7 ctB'qp6GXm2RVcGĠ8Щ}+y3(![w0eT  v) `3 0t|4{ kqq.8Aj$j=RALLO{<9|I|3g`>ymcYqNgZ /c=ט#$8>tY2{K"@c'JQ%988D'],_%fx#r|)ߠ U#kx'cn&tb7=oK)st95٨[1#paiP"Uy7xa,%$Fq"F䥑 7)exmԴg4kCČfH g~::ۖ=D()lQjp@#?Lܡi`P¶L^ȶ7u{pb%|x#%+ 3XL ؓbD"nt7Ѥޞ3[wRHYςHl:3qg= p+(Ms:F=⇫˖݋rX5VoPΘ$">uy=4Lf 7Zf B"QgCV 3"sװk tucmIkVLDng/3e 7+&:bTa`n3CIFi9)WbL!L]4'RBS}$ja@eEGPʐYP} @_c,)}(߇Q!~ xNFۛxv Kl`+NV>O9| ;.^~3q !x#E&%(68/TZʎȼ ϧ֎c VڻyXE՛ +p.V2DSZĶ@E+|.c>l{X{qe8^vІ@r&]te9S]he.v? dmQy>2w`4lMu3Q Qkqa*Bx|iD<,2^d li$nQ 0ey{̞+8"PܺoW8=h8cM;.֘;,C +oXhtۍpG ؛ qI\ZK'n5r! e7S`eLlc C?{b0:o{w++0j<̦yEv/Ό븸`B}ȐW0'Pq;0..Geqn]%CV`L $ʇ1?hшXh2&"i=4OGƄaeHETrd l6ىsao^˳Gυͣ3l7[SDy- %F#CSƍ{ͫ3* v&>Y ЬOαL\L1:՜x,;š+x=f" |#СRdt=,I;g(^s_-ZƏgY.=uL /f'HfHS13ְ"ULս kAPDbN.'h&/Vp?;zԄ]U1޶L@ z@ԟD_|<`ᛔס3]ȬhS Bjq3k0`cIkKb̘O^+~FMD4Xg{N%ҏaOgF]hxe͈Lf:ġ|.Od\vFNgt$_w碯c IzLx#$@m#j-޸'aɄG7ҿ6#OYac0`0zgI9S>}p \$~{\D$2=O$V7˷ 8rmVm_JC{B.ϪD~&76t_ 0gJ^lAI=$s (qq5+X{ 3V牅Z1MDx'l9Mc#!tkX2(7vfp~M?Je4zںh`h05́|ū~*Mz ϛzϠS]˪b&`_ kIBc>|*Bhٻ0c2[FH eQʪ݅X!8;34Z:xăoY;~`oY8{U+,0W{q"[Wk9'7n/XRQو}΃u Ω(c;1<ɡjE,3ervb~(z:s0W#2vvh`T! xɱ`ʞ_cvF'Pd1lϜzgp08 AdV9H/KρwNsfc){ ,+1n&Ds}$>9 4KcI@ QɊYQ2._Xu{6[?pOy\G&ca=5m<~JJN6c,JcPn?QuQXN~%$1%D͓z=P=@(͊AQdߤItk3[k2sE,LLftid)}>:ޜF/ߥB\HGLP4&]jd,ObP(! ga@RI R~(>POcʱu7+єې#$Eu$RkxMؽJsX -̓Ǝf1}@fMXEU,zG `bRoul8Jʯ,=yɜcjJNgAe|IA,"$+DB~/d5|~ ~ф^׹[N :58ڳ o[BkyXLC'*%prD(Ǝ%4D8;2>?@ͬI694*YH?ND{"vNӨE`ǜ͠H|0#s#߷bŒ 'kxѭAfr-dDEE!j^쾁ٹPBa.~$P\l8:{Jj kG1cr(|HM)g/=yth@(E=n/S~$ $t>,e;}'@.HG c==(tm,LK++!=G Yc 0@IHId{jnzqiSxc 21f2>J߸O28m @͝x 6nv|DY;}Y&^LOb)%DND & coX PێrNa'lLg` յDx} f"zb1W䌯3؆9vhu\zJG'0B$^OAAjޘNe=kjYC79HXIN.9a}lm!(+bg"y,!bP 5n0͵8Z1)k3Z[ŕaXcoG59QC1h `;<;AD>9H("u .! ,m~ tHK4"tD`,u+Ʀ??li>O"B;B u",ы6%oSRþ50^ME'}GX53y쿎f&R@] r6*zɡo&<s).Q^—o P2JWo"L}_0* hr/cP4ɣ?tF@vd b Idly fsκI巻tuG+խr2B<9K E'nvLD-ō26}@iƥQDv27,i[^IF2:y<) xڲ,j%"G*dWXX2ގ|w,1`;jVbJKh@$9"a,b ZL:zOŠ۴Gh0!(JL@`E t*^w58PN1w;LO/@Om LL=9oo4ja%ֱ_N$~ nnbPoR MlOZ.L{Nm{n307a(gy_"/8X`2ao̘ƨ09`ck%:ѳ n,P!0? s)ON |> XfC,i~LԶ$9\mu7nT7a!v 7^aZm: nEͤ ^A#{Bq%ro*Juw34 ڇV;h''̛ؠVc2b.Mŋom)o'?A;H c ҏ2tbqv @Ƚ\ފU s ԥ!E} C">8_zx0kvߢR w|F#2 `vm )Wqw ޜvRGˏW+E7dXhl3 u7斜z֣Y9j^c׈䗯˓r}FFK/b|~Ea=_l$ԃ6r xRä?O IDAT'XHC$>LA CQN~1-xP^8Gv +_)L;חDݍ{3a2{9:9y0lgP\JH z T`4`Ƴ Dф59X# #  .!1eHy_Z (o{f` sDC ~P|g#? s' ׳-X@u.pj5ݸq/ +w*ZQjxXȯ9V 0$NY#A O*~@F%#5}wɨ0&DSDmEa,eZıƜ@giY{('+ Zuy|X 21RB8p>i܃7nn *HQY4+IT0& at8QF`ahz!sv5O*Jډl^ sq5`43p6 K7=:#ޮ,oy5ZPkpeFR_%yi ˢY!>>)닿k *9ro>9 3,pu1}'4>QFOioAC9gD}tEX#a :tGkkB$ BB7:ө?Ubl騧C(8|\ELe3y'8D𩴷u;j)D8[:ȓ_}zz~LD f2O'̍-7|#Ƌq&f%j~ZIfOSʙ{%cG=U<ļCp'%RƓX];&b$$K06py-ݵ8dȗo2 Hɠ(ڻpZAyY79}6ĩ,L&mCi56xؐ'ߓOn2(0#ܓ>YJM+tvΗGX379Fu5ad^E*%܋HL'n9`F*q y P\ElX4{y[񞊍;ޑF5~ ^&oD;v`bh18G DG(è5gg5sgZ@޵$Ok^L}\cK n?/Өd"$"r,M]8PWknI(ћv[Х}aFpT:~'x |#I 5&'b  `j_}8-:6fϥ]G؃#yx9:4i[rF3<y%Hj$8Ԭd# $Šc%´q6̢NɕBZ2mUh7U\Ke:yy(z=&t&I:;{p#I)IfYEM0& ҉ڙӉeg"EʆD݅v<)A70b 2w؍RRJ5W^=Pf+`Ќhh5XX-iJ`ªj6j1i:!sz>bf\H@^:^L$26/@ǜY6`* & P]#̘L`~z$GkВh !+LYs(syy"?!aFك5 | ?.1wRKew9 Ɉ$bf"\ʥIYIa#xP/! bRt D"3g0NaJ ?Ƚ(4i9ΌLdP B9RH/!;;*_Wف+j;xR^OEvnlގdўKs;PX[l ,@ҡMc* WON-vMKY"{ 00! !@BKH{16`{ݖ-I;uɝ^һg=kye'$wŒJwyЍ-Y3; ] wÒÏH)Cс'[!a[T‡[H baZh೙5e>%lN#]|:[LI=cpeMwb*߿R(&*cFg[h4̚@v9bEGُQhߏ8:2=5C,8GJWGGA@)o 7 +8{ +[_DFyH[. @h{8 IQ)bPw M }Hۿ]0BqD~ȼpЙRi}D^8 @XBt(rSRrӉ<΁Mol,<•x9diBcgMUX21mpV2t"~e$<

^FfNwm8LF]K4BE ϐ]`,E]/_v{ 11.PA8;[NHNC]IH=BӇ>, !NNVȢLv}40 cv, _RXĀ " Sr\cHZwՊN LLv?/B ewI D&%pw(,Na!5C'0$Y[$0u n8Ipz-^}Hv9FD]1.56C) Ǯ"c.anM*yBSĔ `#†*NEJCЦ+Fܬ"s6_Ldx>A {dq.5XJ:6?&%bip:Oz)"@@|:rqȐAmJ\'*bih32,̉G_{U1:VDyTR\C'ZXuq$K|σ\?s1% jq^]jO3JY= B01RQAؙ10v9%~$1 JsRTGZ%xY;/}ZPJL\=9.5"cJ\f†Ҍ(g^&Z: ;'dPU͓[L o eDc)XZ%1#C ȫC?38:8 Uy01==6_!) ~V#Z'+K adpt©k CQvRs?CDF(̢:ȉYP@)P/zt#Ic/pЄp Su!"h>Q$tvѥg.1Y05)I71vN[˸ӡz<- ϦM& JY?GʛزvbIO#v=,ĸ ^V{sǾ q,>Ab$p1a^hqD|ȥO PXKKPtKu q!yӥY9&wˬى`7etYC͉,R m=d"\F o4pY$3Xs ;bm Gcz57K"5#kw'xfWяhO,OVN\<qtezō4)G>eZVTSYJv§S9(сe&DDӇ:}AP  _GRO} t BM9E)X1A%`ㅺ'Iz̐aDOn|3q'_"j ~r̥;ͺ^/{Ȍ:nQ03elF$AL>$y3ͣQ|y2J gpB+F}Uz.1Hϗx-Y133! ?kFNl%-%^?LBIVS_INvfly2*8Ƒ+Ԁ8[E|8bhxFQ׋<9E_@٩:%hk3 NOCu+hSC{+^ޒIg7n"]$FeHlW30b8{|PՍ1c)+ĒDZKѰb&F$SN!zzl>V9Y 7136'@칚 VD_kBG7Jn^I]+NL|+x΅ \XϝBBO-biE_$KpL'Y)q!-̊N?#1Cjq7klE F IDAT=+: wTӧ# J2rS.xڐWKc; 9՘:5(ŜECmI+%y8ʘhNAnLbEK+ >8;^fH*ΣTYojKAE%rsFlJ}ϐs8 Gu7tb=[w.R~&:HP$Q10SPHKZvb{(gE ͞zcl'(m#ҕ87ܭi @[쥦&୕HMiPhOc`)oFKz4vpv5 *2a%Q{ 3B^^2\}/+HaH^sս 1)*֍(qckEa>dUfcEt(oձ6Jl3s>A͍*XKG%QZG;M*TPr oPuPY uE$X8LG* }-!Վ)NPFG>RZF[*4ՠ)n4DfE%z d\񣼷z8Խdp(-mRF0wcW ϛyp4U3XK6If-f<wk CԄ%1X[xlhaV<=WA @fh& N `b0aoɱD;c"Ȁja%gEl-^{nl `%=8g {uCzFWgl:K7ʖ15A_ZQk!D83}704 OK/ISM#Z5 ^MNa-|6Mm9՟uJ9 ;pco3)WȪÞԧ|6O'މSc;b)G(dB)HBZ=::1X>]LIHlbPr1V9 ;a)]q" ʗW*9>mOgB -**[KMM77Tʛq3ڟ[iv|?*12@do$%4ccG[ںm$Fzđ V^>/ wŜ23\̤KV^YtND($i LHC+18X'AQ+RJ9v !IL}ZJɬf8QBT,W2âx3luMH I>o8w{I˥A__Eƍg[T*b-X7E[zwAR7Q#K )~}Ut6ۏ )BN 𧸖]Z3 ZUcHmX_On]]ZɦϨic*їbg|FPG]# Fg1;B]1(X=n.d2&ٛG7?%%|xYOӠf^$5?1r|ũ"}E=x]״A$/$afH_])ht7Ihd ]>,])i`B4%P| R>GZ6ߝE*gH4[or,_(BPY?"܄3g ~ǝ}W0?gҵ1-oqٕ,EM#I臓% !lEi~9#1g~ ;)bD$e0q#U#KnBnȀ6q"ЉoMI嵘I jF;pL?7ͦ =!z0ߛ-4"+SD3 y~@]FE"q oIl=?G ԚXEq=N#%' jf{X$.,:ʹ8 \ܘ7MR6h1.2s K3dRӣCR.}͡[ b|QD8dۇH ׆]ILێ4r֣y+P/U+5sSsni,ɜm(TU"q>V\ảp)C L~Cw)|C3&c%]ßlr> Q=KMG `nf%bf q;#<嵤=c I瓓20hiF 2q F!.S76:ĹC8~̉}yPppšj:{q㧕T$tVc ad@7~8LiB]hC&p.qzXis.[KfR*Zxo4C7*% AчHL^=1o59@ϻC0 ݤME9bbH{ֱQtZDC|@31u sL*lʸP;KMj;hUqM&ttlTcn9Q1uJd2F3ܟ6n4V%29rQ\Ba=bcz!_a,C֦Om=.|>z5wB~4w 1E):XJxQ3iޜ0DfMm1.>xbhʜ>4Aq T=x FL}ݰm-z-k_0?uE CNKut&Еւ4Z⇐@ktvb\I~F0e"Ƅ 1y9U44|8 o 7E'V\1?ajPȏxX3cRI+g/qs7@6Na%g7OK)mAcfBp'#4”A{eCa#MfxZRҝdL l8D>1}hlyP̥$3n!<m™?7#33qD@LEm5ZCkyUnmɨo{˹#5#T2"c#DA8O\cJ9cQSBnd/M>ń`Fr=?@+TQ^>=F/rpZ5b FF̞B~ wI@ D; 'sv4Rq&==MJI+cRwPw_SDV-EII^KJg2=>\NHI.a:@HJk"GSF 9hr;-\wqX7ѧCCHj(;Pr)T`aNF _o@Ă ػpnVa$_PkcyRSeH=O{ #PRoX]+?ơ !EjAFtgЏxQcgAu/Jc5*npdTT˨Sc&17ߞ8k7 K `L #L FBe rNۊF?$ڛXOuؘ2{Ȥjdq8٧Y1YuDDM ^Gl6+g_ G%sdr>I-7)mdW?GiĹ#ޜ|xs|&嵜L'%ҕ00`lbL>1bic&N=brlZIE_t?q~xYP1cgɹ;oR#t}t(.2>Oi#e;x./IU#N2d$בFK3 zvV$6 \! ;/i `_d뢷=@7UDN(!QT")Ј8yD-$?+3&ȟo6eP?On8[Sۂ%&Ag@c6c*''3gJoѡǓ蠷j8 !jftI1d:S"  OݨLtCuZ7'zJ[;ccNf.54*8 9a1(ZIehb0sOt.81ee=SCzxnW+Xb<^ѩaJSA›' [q }dWpV8La3c~>u]ĸ#ɥLLdؘlƚ#L`QBhY\h%؈%SǾ Kdm":+r)Ͼ`W,ooB6/ sDlȵ\,f'^ νOg/ Wҧؔ|wT5nê}-#l,>?fJ4j]˶YCA"6[=G:b}71tJ+G?!2d U-D G'1nbcڙzfW~efPDiHE=8LBQLʡ!Ҫ\D) 9TE!mJj+hm y/jnKym/?v-GSsݫ@ I zZh،ߐ ܌N./$s/a@K'psY>_ໄ6dtc覢^ҳꂧ+qUE+&"lX8<-X: 'ғ);C Dцk*[PD$G9\&O凙1|uor<:<I6r77ɞO0IX3 K£8ggdx&aJ 5 GU FhQP`n*Խϧo0'9qvV :܌s),HPHxv&2e,:q ͸ZIg;\NM+DIm@G$Q_Km*r[l刍1@y>u54 @lNYѕNo~ţjSL?EވFq"+zZ0'%.Z%90g* %mm4ײn e TTq%dG'p9i3\1467fF<]mbP]8H rb 卧Z-֦L|j&(.4up c9==VGA3pOq`)3r6'yNJ`6N 0 «>^W=Kؾal<38o0U~ZsOWõ Y56zXYpʅ|j}j> HU AFӡTЙ4$oW/Ġ5=Jz#SD6Pg)LAUC74uEӈ NVold(K5lz5&-&̉6/ Љ|ω xF&BqD{~;`jZKU#] ce\-'յt?-'o_os)Vs9=Z!5J&hhE x9RPEC3~,ZJB(Iz3ccm[aeb,͠+;SŒw8|v9cCx;%}BUΐ0q4u`h"!COFwF:\D:Z;@}Dz1%i1@4Z{9{@hD)Y8pGr9xTBe j 18X"^ke`v\,A/K4r'caNe,%T)ilexm8Z0{ӭA uK,0\"kBkNs>C IDAT1ѦTLm-Եa!Eb2a<}D"1[MO{mXf6TeU0%~_F #RZF[7-MX:f|zGPR EG[=")zIOUcWZkMDTGitG/ttq>E@J+Y< S$2,fH fP͇sr+X8$cp ZT;nHܺKG 6VO8]GKN<>dl3q;u5:EB|)q|>(Z(BdȒ ΂^v$[Wy^ɊɫF30BqaLCѨ_g\Ta{(v[$1Dj%${oX "<(5ٕ%zzX /%؞t:5<gkdn~KI9C|+)3gv%1V:Gc7%ș}[uB*%!G+T\xFe9/5|ϼxZ>GӸ=:ʌV,LY34jkTOsSO8sWFŠIޛE;:~$bHLBKIXˈ(EN=,ʡpZcq@ XK86Eߋf=8Sv=h;@  ?O?苹o`$Q 0s3 F#4G"a]Č,w6#A{ܾ3"9@| .8V_ a 9xb5!#ʋ <+# #1w+1V"ؐ2p6^8 ƸY3o!N_I]z8g'$/n>XǔT ` M0 U\B{o^5ߒ<*a\').XJY T7rx5w+(S X@ąCdN= L$$2+f<,"@\qf1=3q<Չ`eg1c |yS'{v% O?sg2 '>ƕN9ZAS _0К{<:C_jea^"zzi87 EUt:d> u6l xBOČɄp>R04ͩ6q+!ltLbm3)F9\ːbmN!_ˊwi 2y+j%X1 @nWȯd,#ʅ>,PyZO ahǯyXD8r X> DY"IB{șEE,؅}+6J1ߝF_Ģ4vǙ1ᔴr9sl9hʺ \-aէ̙ϕ^Eށ?&ڕ5͛(o7^j<ܨYϑLc8{RL'X9DDcA$Iعq#zFʊ1/'g ؜HJށ 1XbTJN q6j)5? ="13Z/~ E9(>+;';KLMŞ;O;uy7V,LϗFO@J8p7gƾOTLWR?Ɍ Qxu6B5emv 9~{H5˚|{ycfVKq+z7o#]mO**ʪ y#ɁD;캇 C;X{|6;4xzAlj-uˉQΡ:˥BCS3V`z0L c&#P)};Q"x.i1FSRFlLZ6UtQ>8C8݌ ңF]=O)tw9Wi)c@BPw?:5 @'&QuQY:H]&& 흘anAgEO/KW3Ubr'T@HN@8"8 C)%(d>a`Nv1c,cyHOC:v@an¼WMx,V )'iEe;g!i.AZdGl< jX8ϹS뇰6F#&}>nŚ9HG75Bvajɳ5RVΣ vsCP+g:Njlʫ񣴆M_n q2]W6&%(7AoHPq#*r9KSA#*}쿄-ad#C̎]UbcHT4V繜^+^&>020H́0d2:3F4 o4߈F1 hy! B䊶@^{4{ZFGm`^">`^)2AUJ?KFO"Hui8'"ߠW_ 79ҫ9t0+(&wkl%Rׁ@K @_?N\N>t0 $z5(W_XsǓS^FCf,Hn9e4tQ/'50̊Cts)tU: D(P)cU8zFbgΚߙ>pEK<~!睝[W `l[3l-]|;@X9axH,n+򤚕3)7A;5Wn#>D&ӡ`SJ06&q_B$~.5Oo0PMn0 v&hG4z8l/ؿ Z% d8F>5@ـ{<KtGIstuEPdKB҈JH蹰r:~ >lWQq,S ,qco|"+rYƴ5,]3,5o}£,Q(顴tTLX6V8%Ÿ%3ʛwXV[S0'~ĀQ03X+ҟ!䃭%|'|ux ~NC QU!589~n><G MK7{Cqw Cr,%=WnDKz)v&DR@s7B̝|D| n*p^! 2N5YGS\JES~H߰E4TP(tbv] 죿 Bhn0pB@]["B='GBGXRg7ܡ{'07[[*r)8ͪ82e>o?D*} 9 ܔgeȔ<,N}W*Yxc=l, f%bH/&S #/+by9x/ދPԀԀk fH:TaO<,)Bw&)XE;}anȸw) ]="& ǝ 9SRw 1SF}#k7`IVFkͼMo ݽ25o5.|ciw_KN jز'c#"]`+ְd %/co/ciAi%;_ˆ7v tTcc$!!5a PVDIp[H<РV"@U10zN; Ѐ  bw815:ѪaDC<̘Pq r5?L)1͍s712%u"QiXBe⧑¡,0&HX u`*8#Z1 WLnΘXbhF, &PP_@aG>^R=mehTb`NFckZᷔ~5bGLJ9b 55̘Į,Bs+cfŦD[CO[<(kWCB]L5\G {_*ЊAY##Y?G3k> Sz̘A15cx5|mq2gM/D/,LyZJFpOxq:i|.bd+>i(JoB U03~yu$=6m&U vt6}jn<֊Tv0q u *+1F:QLv%KX-ikK~Z^d| zzlڄS"wnӖ)3”;y\Ĝa[ủE5P(/D37-g~ |OSFQ:lM'ns7_b|J)3To ?eD"l- yI>yr =MM:d(4FTO{swBИvCIB;tuCQ ?]w!v1c9"CG/KL>A\td;9_bG DEAԥx92s8eDݿQzzb<}ZM\ׅNPJG$/*g(j!5S;u9}E/m6Fx2S[26۫|3^ fr2*rĆl$n`[Z ^_K'p{>V&2c8|%#xPX=aA| g8`퍉7?o(o/!̍! [’* δr$-$+V3>4hxCi Ssn>qOfE?ǟwD I|+=2P(8 B]/„֯^4oE%jq񥪒NcM7!͔=nstd)}?BTTC' R{ 4|ˤ-a+ }{0<#2/ىfDY8=}@;%2̕8yIr0rHtfIYA؛~"Fwyu G BxeL&ț<:yƎ;Ic">Kc 楉l|qԓccbĵ4tYAVdrUco[Hd/y'IHDl)$wƐUˋ;X3_ (ג0 憜IY! _mOœ#5H?q1x$iS NЈqQxCq v0C`__SC#ڣgI4e@At#7uΥ36 )#2.y8XlMhU̗?OG r}420H2]*0;>Gq0GBw1,2npK,@]L AsB"n`k3ԝCGSIҿF+<'9*D_HyM4tk+`ӧą y;L=d\7㹙Op-mo1T#bd Y 5cR PIYI2#5pW.y*ٺ5 IDATZ&}NNn9Rt4捤HESa5-:͜d3CB<ϛ0 ; }&OɎ 9ރoE"vi:9}Wfc*C5 k@}O鼅-F[\HAL8_}56>FS02.֯F>'ְa>U`EY #±F_V/k&$1ӌcZ~ZvtI'ZvS.#gQ+k=0#W3>pv/ah$\*df+U^NGc7#!Z͠C?`kNipa|qC Lnc2"©ϝ{GitPx^,[)HtrY5Xx..5r%]K%m#b_o#&OxTIau,Ow/"yXpg?%S_bYt:g;^ϤwKf5zU %N4g@BmW8Mr ߼#mr] 6~Mv-j8:KUOdF{@@I33fǂ]tMZ̅|a,LX8Fd9}׳we2qn<[Y;k}L3^mxg=㨖1܇S@;d,x@#f!/[clϫH,==4UĆgCFV5"t5v΄$?qqЫ|5Nl= ]vi5VLugԠFQ` jȝs9BtF`jKZ`bFz{3n!T~,F.EG3'/"?﹗K2^2.B5/K_JB($y?XҡɌkkNdEf scT hӪNjKk9 x8sINLRxpvrY6A~˰Sx\O1&}}Z v=Xr05E_Da%.Yv jCPY{/Xd8: Z-;m A' Wyy!=*>j-ZX̉c(1}+_r:{O a hG5Etʩo͝~ ZE&f," 9 "vD݀VhrQ< a_B= Tx0PnÑ96b=Hq/%9r)a.E*LykK/7=PQQEG{,M >S$v 3COY=bmߝ4T3lN)8T@I5 qՉ0w>LQ5R* fqױנ'BjHa#5]JPһ̊eoX; '80}"-& :}+ZwS=.#ѳ_o(%2k)bdCg=:")Q# ڏH?T̩81( 4Q**0_'>DxZ)ʤWjSqJan$SaaIK#VFtRDy=3h2 jr5F(d4ZddjOwܝYOUX9Х"ʅ(|^]67ӑ13Bum8Q:ȡ\$]CVdؕ(zXOֲo)=?E['2ktr1v||ãk-A\+%%7]L^`cB9L[<*m/kS9/\A)k`Ɍp,'>|eQΧT P7#r:<3i/d9olAh\ПxFNS9A"at =J2ӫwZ1w#0Eތ E*.k[0_w=[4))fF#hM4SJg/D̕ TjJO@*Wdb-K[bp4cA;G7;刻5|v|fG'] ߎm7P,Vb$e ~8S䀧bk؉oԀ7,==LMT17dE**]g7j 3x1wν"|+x\DţpJ e"j12`a,#a. 7knqA8ػ[hTWO"/8FډQ TD!ADЮ@jMt .v4kϧ)L@1B=v2MX[QMWX۷c?k^$='dN'DpɌ)|ZN iCelLɌV;LsfLch()#- cdDz%9-q4ƍӎ#8U" &6~ĨT|4hɝ{uƑ<-aHwA!5w! y01Ki* TU212;))Եq.n Ɏ@lx=cpx9a$IqE `&~ymyy8՝ɣg[Mq+>:x}#KDR`m'h$ܓ$^LE{ù\b(}8r pC M &LuibT8'RYCJf쿍uC P.QJ} QĔ>?ˇ;xm/OȐhtDz.O0u,~tp"ři,GrJhG2rJ_Iy#Ύ*r@l02ebBB4ݡ˺ &v0'bk6.^E$Rb*B} e 'ȯ"?AGsIȱ1A,"ЃJjd+ZF$GK*[~ "c9D:3 ;/8\%&ddb16(mLX ~ʭ,;tQAI y\)fEV&҅W3ɟO~Yʴ ؙ1Cu&NCܬe8t/Z.f39r_1'==d lkPrSX™"PsEք=.q/Z&QWqsa n1\{vD$ym'bFV5#=+D0)FTTSA'/g[4w`,F::lCL089563Pc툋 B=L0p 5q{ڿ9{hz*wBBJ n:}0 *yAO|è()H }L?|s:F~%aE?!ڝYpOz m CKr4Nl> 맪H05`U#5NNssctHM09cq'̝sGmIt$ )y}Oq+n#n4^MቖW$R&1ʛuɜ_'qե=ƖD$FHj6͡G'?]Ig3zCp<?Gąq$5a((>/yrP:F6N_#y|u y,w2KA1 ؀ciKyQˍMpvYĶxEaHGRUƂlD(8]. G,‰Ag'Q=FwF`ͥdL%4MEaHCcH!)ִmA׵XD!6f3/z[@0F jx `7bfBn.K2"~oﰷ`\= VܡK_Q©Crg YF#&J_?Gcoˢ$,$s.OQ`V+07fAO.f^Hs7͠ )dV"SqV֥P<؛D 9v=h烯ikc \A2wj6h(@.ih)$xp Ud>ǓF"6xVAy-̏e\0d"><-eV;q.ۗlƶK_`>I7;=S=,;Yl8FyKRwHL io+, ަ" K m+gh*8Dҫj4bc\}hAǀoAٿQ`5FT <֢x)=tBMe"rwkF1 \ݸyl\O')NLJI~ͻ0PVωǨ8++fE>5D ʛD??cD`njAc0o&w\bE_>9gSGX|%rſdO=2j; *3ڋ0c$"e4YOf5 mغbj0˒1ͬCz'^X 8mGye&xޛM':Ef7O!o$3qww!$X RJԀZ-ԡP]$@ !!xF=guNo3?Y{my~$F8xY-e$8#Cg1܋ /1F #YṬ2V$`;̎6YIV Ã;XFc:x3Ӓ/R/ Ҋ)]舱E6q Ae nt,BF})]U(㑀;eO2۠lD)^\'bLg7- $c' B!E`=a,L˄j:htV"}4cƌcеDǒp` MDD$nOZ-c!LbXl\Hbco\A kc*LPfIU;ޮDG 0 [6a<6LF.rvM֘BڻdxEdzL"&SSˠ`ںY&VzSP˰PvngO4 xP338G^gԶ`wރȔ`ƒt?n0fEU'rQ̀(a(:cg6c72? ybeBi##FRRΡ(\JOQx:iGyw~Eӊ E߄! "KK1=S|5#04Ε+wn(z1A@ہ52DѕEOhJl 9գ(;w:)onn;Nw/Nr.7A_9Q}ngG])]ݜS<"*]:PiI óƐDBrkWLm:"C]`ˑ;!&mt?GMdPRAY#} ue?^urcD ||JJG~Kb\ܘ==>.#)aZ]~ 롡Y3rR |+y<=AY1/-+Ek0a=][:6kC]k OtP4,J懅/N-d0=5 p5  yT{ JJIL B㘵  5y H7Uu\ycw3%uS=>C kP)m?g~Ȏ(TD]-Qވ]LK;%f! { BtlFc'COqȺG5RׂBLNMYafB!{drڰ6C%Oڻ%*2tw扭?,%`=Vт6d$|xT=Fbk/N9爑- `E` 3tb?czDR0G(-1eK)L15az,uVr:0}<9{s?S"F`iAsBc:즹GW0?rTLW?ajN<6%rr$?-%(GNib^Ȍf23n2>/kJtt8B[q4Eŧ&eH/DO?@sKww/t= g)Y0-GPdF@fǮdWHQI~Ƅ9cGQ?!5?scb|ɩ]&CY, O6;}I+C)eI6ԴtRY“G|Z-gMBOɘPwĔ3xR歴%ԁ˹H:Oz!LդH+YuԶ!rjdGQ3]#t觱??8.]xHe9R!cp͝e $h#118w.d}VAn!߼>󾠪N˳*8;U{$d -^^"ݹMz!dapEdͼ! Nec񵧮j %n6@_$clF|vFr@KC $dQAW>>3/w ,U>%Z٫f dmʁtҝ@!1v<X Ȃ,3a4<.dt<-[9u ??Cmb!]48.SGe.l: իT'f7C13QNB8"܍B :eiMglέB>>`_E5 i:/+X 2~gJe}^ y-'3%3=g \LW`wZF !֕nۼ; VzQ)ф3Ev%/ q2CWLVH~J^*C i%_l:Dy>83r?  )T1o"5dC'CxXH| }p2Itvp7OXlueR lL u.51w;gA!r eRh<챚HfCPO1wCC*M{y50 SG4 _C+1C?%Mj@/S{th@l.ZUƵs HA1C'Gt!39ݦ)ON/$̏:L /Wר殺[N?AG/7(h֘/ү"ڇVLg/YKt$J^=$ܝ6Wɬa|AQhBKײPk/Ȭ%v '``z9vXdƩ$¼ГboE'%2?ەԇĎsJ[aaad9?-=5`bFs KYˁ0G@c[\zUQ)x:ccʁ?Kb"[xVEK&FIv2:)Î%+~-fT9"rns0)(17{/QVx`PH{ߏ 6ߪy߽ ȁ>A}v |=F$ 'grSΜ^zSB} LG,nQ?݂X]Ddf9keg_DoՔl;9MHU1tvjϿ"p5N&;1q&<\!FYd!(Gs<ۈތ(y!K~G;n⇾œh$ȟK\؅@lmq).hG}# Mۉ2dΈu${$( LG >%h2WׯS6V1 FctĆFob[$G^%![Dj[xŅB%t22/ad42y9cj|#u3lQ\ΣJӢQhiciBxy؍1H<:EG?%3s5I Â}swbv 7X yow?ȁxXlg,=R:pn|4D{/R.B_[)mC嫵|@;̍ Bl@0cbFbaaEc;ϲ8k'[JP:s)vNuї06Ki`\'};2ԋ4ih@e;G"Ok@C'4~!PD{R)CmY(UPSC[:~#uG# E)9/(} aX.?>b{ sh™<#^:\:Q֡J:U0ӒPR9 ! sC:TD MX[3uSSЩѩ``!Nn EChXͥlǧq&aHT;'g%|сp4h+SN<ۑY#Szq-_XO.!`cD'#ʉq~t#1ŸH#|v603g^Ai'yws>"ҏB-G9Go8 GF:Hep&j;&ՏX̢!*&~us)Je;T!0) &bHhl,ٚns3vnF_t>Em~/9vP۹3gJ>'։;9Ht$(U5 2VpF $h]@Q TC$J61h&>B쌪]74j4=HWHp"@ GG}&T0i-^H&2gRUC_,!F~ȓ{43w !bqG,&ڏhWBԴqw:>vt`)an Ꮈft\}).#>f M xb$a3oclb>3#"H/r<Ć͞7czx33`w!;"/~%L sDE O1̓^ c} UI;ƺ of oM"+#Lph201b]"{PD+ 3J[A}*q1GE^ ) %TanLM3GdVNf&Uudɟ ELO}3==USKOpvj.a7NPUH7/ж"]п\M9(Q5-R?Df 9J!R]ڄ^ †RC@0O3NS?36[5 s3X2*HġcD,0tW56^eyq- 2`1ƺԵ>6!^E]W@7Q/G$Bfb0X~}č>< ܽ3QhH*KZzihY Y0c$U%8q!^e0t$\IIJ t!Y#y0ܓɤ(TTb*@_beEVpy73`.>iGyˡ8ϯױglLx;tufH0U-xp.?w=ՙkُ7줫=k(m dfSBT7ՋZ-ۇKIyʓFƳk2@JSwaz|z!Xcu 0M}IJn`h(o Z^%2F6TGAtwSH@Oɫ ʗ.P|1 aTm=I#!{AXPԜaלZ ;G(/Ofq7Kc $,~)GtB+smx^̃;8y!VF4wSz;I*d;>HuYSЕdCVb1 љ`eVeQ^F=>a uIįEzdSX *mX0Du5t\({I-U88R^τܼBS:>-,Îv`0:(g:Wq߮~ 'blx"]x13.V} ."~{JW?XH.lD,f>ξ^ν ؉h8cPlg~FPZ70m }8s)(gDlw0 ʤ@"|y _WE٬YZŮ 9ӣ z9:"| \fRzFp\GUNz 1 @2=8wZY=ݸ:s&|~ | m)ur09H'Sr15`:΢ SuSPl=4F|LL#'XO.p]`,< "*[<]X3/w*CB(B, ~/t?ڢCOCAՈJFO=J%>tPA9;[{2n"#406o̹D}3ϑ8J̠LzՈD:bPVJv*6̍^1/ FÂ0u2_,g|ˣ"ΨxƓ^46RňpI,Xĉ?!Ѫ?g`V ϫ*em\{ɼh7F9 }SdJf-_ xJ%L\~ɦ1ӟpeyQ_1֜Y6VB/!'ȯ$0gս#l0#u(R=QRbZ10D0m bRcp6MR.$SW͟329>)_Sb6 Ǔ8?4Kŝ(4ȺxO҆O%b$Z5-jm-_Ps0)Ey{ JFq=3#o+,aecfc$`9Սl\V7[q *ك!Ȱ؀~HO832!^˂}ᄹX B%&q" J5s=>9}x$Զ30ܛX7Lռ6 /KBRJXO7I/Y8C]~OKV*GPQA1ПZ9K`oQ֔"G cjndndq: ]RJ%1%j5Q05[/qI`/y~`>Zh_uyg [6SΎ7g|G3;0XN]cL^anE }_ʒIС݊RqV͜13fT㇝zj.4cFA&  Մ|c)yHq5Q{Re$XalLCDKZ!FzRt7`C]BCQ+\F@0k&ɏIH[΂QZI_?}Y;Gx)KY;'^oqx1Z-سk Anqlռ{,Fu:Btv .<Ҝ0$B>IURpZˊAS<~NK7q'#KcihX{lf`^uj3i|UTlMC*>y-}.4hX[0a-{Pq!a^V#>o@$l\ʁy5Dl֖OS[\N<c]II3X\oci:嬜} ^zlgRԴbnq罥Z@5Cq@ɵ=̘$v]=e [ U<Π/ɾ(,t&(EabK1dl'`hAmR&j6NXQR3>ԵGLń,y;7kvԜ9#P8p ME5']19zT^GxPOo(>Jh#ĺUσ"~ sf X9{JxRT 9fFr)9Mw?R%SƒtRv&/Q|}>GH"b6aǑ|w ''4r;R,1#, o5R/)~NbЧDC *0gIIg0fD0d5GRP֢VwOM̎T3v@ > Uy\A*L s#yZέTj>^5o7 IDATJ(J6"((UuEH 04%, wbjjƎvʳn$n6uDSt<1:ߤٓ\or4U%({sC/.SV C|ioi29!Fw[}-М #ȽVM==}ðrS\ #oo<o׹Yȝ|4 H;BILf 3]%LGme-ryfE}+Wv8y Xwg7ήɤb 2k'81iEԴӣ ΋wf{DMVzwhū>q5vlXͮyy̡d5Y:yT̬0J:0Gquf\Fǰ{ QՆ%f(aqWcσ .&f9B}#iD0ܛYxQVF!KƲgSH&axdKQ)i TᑃϡAkFAw)*9.!u}K21q6N#n<Ɣ,.O_Mv>JᬟDzL̐DE%88RՄYɧS@7O𬒷?bHB)q1"`ڧh c\fia*u*T4#Ư9ZPhfT&$"%Jx{R1WsrӧFN#mxXiɅd<)nĺ˶f0|4:jH@z[VRPOM3ɷmbPRRQkHJ5rK}/7˘ G8\߈p`6 \m+3kۓC-FZF;7 X .s_-$bDJ/Զ]`h \=w1eV2Ћ)݄œ_FE3V KLq045ci3j ]m4W 5=_>җ+Y|_嘺Ӕ>d'tdP̈fƏ_^~h58N #|Nq٫ ge =̵̘lN!a'L]='tb1w2.ܢ }S -YH>YVX"R]DeLS_, Bo}~7 %FPVJ2Q8,\.s()"aaVQD8g{01\I-'ڍqCo৯q/Iɡ>f1xm{qq ^ #0[1c)%5OY >= -?HCllDsr\2?!R62ng:nGZc qb6 `CBpBe6†FfXfF3e xpxƌę<ܐ^l؍5CuZNiBCDb̨o͕qt)8xKC};碲 9 k 4_cM =l(˃]ԅztpgJ |4. .4vpnP3abץRCz/BAK&baJ[Wh:taS$ 1B?MeAB z3 3{fҝHHDi4\¾OE>/eL N2(v"s.?c=Vj5lFS&1\Cp -_ssmյm믻խV+3 s46`L2cs Psnux:{={wZk׬W{CÃΊal8ǍtSX ͝ vE  vN&Pي1]fFP܀~ GWLx8Dq}qtUxZnSH8_p ؑ|b.KHcr4TdqBO0_Qul:OMY-Z _wzb_u\&D02nd ZB=B<<'Iٜ>5|8t% @?3sL'wS+@jMwrc*jQS,&Fgyqm>!ϯ($6o#ױ-(Wx[p>0Ƅ13 f Ռ$悥1)̛8o#ołik5 k)Vr^kM#"&`GF2lLRZ; rD# W{NŲjFj63˂RBY:cPFtjB#;>UPk8(IJz$PSeLxBS 1#u^VP̵8u<;W3ԓƅFN O[,L@gѫׅ2=肺DbFf< yʴqLDH0IJH;ו_31=yS^r<"UROg(liCՇ;i(o+P~6ŠE] ݈1 93:i/Ȟ2@vxQͶU$a"%s17^5S:<<ovf>{95]X[3@`ΔHb<M]/v̤'9[a[sXN=s>;1?6go E>]S_y:*vZhK%eXGG];D_΄0ZFHU <̚i&PXLWe܊)v&CAWGI*U'.Զj^V7 .A^` ޙ{N>'6/gx `t 78Wj`g{ P6'r)#==J#%+ dg=i l >wt O"; =C,msd{Fًo("= ?1=N懇 9[(#zI-SIQՐ 3IYȢ@cEu|/4vijᆵ >|3+ tD*3#ZQI\Qc3#nlxVdFXDw/1HDDdC| V#D&gp pKo,D,">ogЁM *`R|f2? )R) c}eHmȮOc(dz|.ǬǎCX8|qN2^XͬY>G &o/)-Q͍pOK5AwVQq(Ć(ͤKʪ'4c%M 3tdݢ2daHdIs#1(eTO.%r#-X37WbD ;J)mLNYVk)Sт#z p@,TK9}dUlz򲘣O02-!50{nS|PX ;̛ y`ξ|}iwRIv ^Y~h/dhBTJٱ =.=X8Z?,QrϢ2@bN|_҄&&ulXEy+N<؈@wϓ,gLCjȩGM1  c{LOM;k,G"& =Nq3Ӣe  9F^ IH&d`mȮ$#})e5!! <CcTДOOv)-1C w1tDM[Gъ14F`D_9h/Cӈ@Ɛa硰1ILJa5J,{K));3:LƝx4( $dUfM3ɥOs+ $ t`@Or2ij%4,mpCA8RwgN0GWD:3ڛf.=],eOúIxXbeu͆9 ʪM@Cy_[dhL%ۘ4G<8rEo"JAC']Y8};揩Um8b„a)ߎ{fF8&2"vLd&dQRLR6F7s ymEX(xt$~䳔1z }2s7 0i eV-Uf~ KӧAOc {|ZP%lߕ=Yeqh:{t{l 0B,kHF3-60._ϓ#2)q}#w_3s>֔7TXΒIC!o/8G($ճvf̓lFG OZ< n]CV` G~9v['3{p?1`<{̎xən p.k1tu\Ibj5HSbmIH41k6#Fbs)YؔXv܍cP0 D&Pp[-qLAq%CX2<@q",70E,—߶4/$ӯji``O/XL!uHVSzh-$Ϛ$K[dhVہq(<+*Sc&xb[HŌi,EF)L-je}2fɥ Y&*!4uѷ@G׼?s)L! uAP $1s9S0$ʓ"7)v'3|t7;9 G"">Ϭ %8Z03GCpLX4( 9`|Ɔ8y[[恡7b`Z!؂Ԋţmf<|\@ ֍'Ďv~h]A`F{"5c6X59 2~2q yXA[+T2C4CY |0:ҳ` &SFU J 8p!Ff G/3maeFy6b !1R:3}q*L|) 0gz8{,'Sh4{P3?FFͿ:#x.D]bq >YP ^d^:ѕ0-vC"@aI[v\^ıWpZO_u1l~ -bd;YEaR|43:aN(E :@xo^V'_hDG3713b;2:0E(&Q;Ev%3܍c qgLȮʘ8o&5Of )OrbH O#:μ(=Φ`nܷ)e\=";΃OQՒ7dz{1#i?j5Ieae@O9jp0gTp=z^$ F\h/oDYl]=H)b$%*Y;TE]^Ό@BJŅH `j@k'y\8ƸY*f¼dQD2ғUxd.9WdM];{ө)΋f~v^ʎlRs͍~1GYw+>Ns32JQv!E8Ӄg(hmFȖ1EADhͱ)cPUm3ONGL=ACctaCՇ@k;$~Gy)Nx{L#n|LFByȘvWPH`-%)}JJX46:y]|qSjyMUUïЗRTͰ5/13)o%} ؿ1رf(sʛGȯ#w3lM(gnkn wI)3}'TH$<&Ė1݀ˆG)os1_p/6%GVc!Z ;Ë+`O#5Uu*[) qa&?Ͳ-ѣ&$&Wb&Nnvg^!oK~8O 哷rWS,Ja{SZH{7O#tb_ewl[ܹ!aU?EY6UQ$nPLG<8(`YmJΞ wqp(o>ϥ:ٳ%XOL@Zɾ1XPė˜kq5E]AC肮7sF%Mt0eK1/iS`a|> gMR<-Զ$c mJ[p&6qv5kG+6,!/62hѼü8ϗ5$c2yk4`t'P~^<Nlʌ8[SxUTm8Y? v]+w2k/r\qH[8XC^ )}̍כgSȩY!M<+bȫӌe{ ѡ[p3k)@; ՔczH Ju"|E#H9rU5s2"4);;pKbRL]ȩan>wp7h|͢ aGV5v>`UȌh-EV8BAS'ѭg[r`>c(A@kDta놁YAqL|1GDۄȆf]p0o+Bb?ҝF{7VӔd[YTQDA(Aa#nAX!lG E!=Է`ɭ$7(YfT#1WM .flقDsǙq^Z- qP`Ț}X|"7-k^d`kȫe.i{ejW0k3̍S{|[>e3sBq5gN2sJ~zT)*'kxrh)"G^Ϡ08{p.rO(,@fv4}LUډ5Ѫ15'zJQYU?/na2*5g35Y!3u"ğGO-XEȼEe* |""O%v蛀.R/@ldDg_PNpcGcSv馯(p@ߕBD)-մ>siDWǁ 9x8[)V@Y GaLW*Z9y_>Lk/*-Q\J^=X(QQČQ2f V6Էc˂ilr2y vvT^L/ʨlC7< 69 ǖ603;˒p&(/KqwL~_:^By5XDV:zOμ`8M97{LHȭIQ݃::덱>Nb뀾b*œ2vϓ,:\Ɣhgj&O ^&9s'e.f61j"C${3a ZȸwATw$E~g_lrHE40n8xo"|woБp0kѕ!R`Pl0D9w;4aI cP(|jG"AκS#su)Էx[g pQ[5't$TOo-J;ihp1g >cPT5 E8*X:AØ0dރ̀ā\&Vv6bĜZ.3@c'լơ4w1sůQ!eR=8ZnlRqNF ϙԴSY;.u@g~Y@;Eqj'/錳)Y/>ƒϊ"'W9z+9USPCM+h)AƬ0>3C|m6!̄9%!!8)X?O̍) k Liʼ$tM#Ν.fQ Cc@3y`jEU>Xb=НtRw֧hQ vl,1HπPԽ ̓fho"NA-Ղ@!wԜ,ҝ?Lh}6*{i2s# KSbD4m. <"c* )RK3ޛٟGhD$ڂ'=Sxr p /JxN}b]@G[X; }qlkS ~ !o rqn=nԴp;vܢ[Ŧcգcz fMaIu4&2]leb;B_"q^BaVGS'gٺKZ6Fz̏T^6&&c(K̴݌=8YU4s/r?dl qt7_FkCK'l>"<:"=č[1/{+{l љDzhc$|5 ;׉"P`56jJA򗳙ف%:(ޑ+$zXc7 ` " 063~  |y bb&Ȍy*;=@l=:Lʰ5eX"!swt,]r3 >ɭ#s=8H.5|0 y?&m.MJxIe92%C Uҫ05S(m!_} aD0͌tE%ceBI=ؙBs7A%4Q^15 OL<OAn]b=s3^$ZX/qЕC*|j$ԿЌ^%Aw/[Bu Z:S܏<ڕXX#:ZhlBj̀@|pVp=#a +9vX)pq->a6]q3#ŀ}[HDC " hF_GԵ`;J*n% 7ewtv0(m|?r4]xk'9=W5抛9>6jmI% aw x[PlRI+ wh:fZj]P®5}#ȒpVett9:5'gQVϡ}ϚļbEv'rnQmT_0c* Cr ?{|gE cGR?\b=vHuQ>zg0;[&\|Q9ҭGd3b(fR2)*@tE01s&QjK]M f=t+ օi#"68#Û*[R!0G7{P Uҙгƞf,,Е_w0}C`nʕXY:ZRͭ+#ST! lR;Е1 Gf+EMWòm,JC;5d239Z(eJc v ~x/Oq2 }+s'xZhˬŴJhV(H,d2};fdlXs7+Qmzfj4n,PȑtRHdEe3'2~ wGb*j=,ȫ`&As'f zcC{ߟAm̛ӱ7x>4Z\I@vOdqGz4TZ>2f  ‡/fɭB_0:hPw*q/Ti1O+D_sՙfCj3:a늉 bRP6yn'I م }"{ $tQX+[kJj=Ĩ_WV5g*-F)lSXO;](kȗSX~t(9z orpÊsn돔p/Ss.ng3i !vxdP/tZZ6wWo a^bpbh( $|u%]yo:v&N&εsHaG_H/9TZyRNO\0< F#܄Q錙 jW(8ON,H)];ΒȨFeo|=frjPX<1^\L˒`H,,KHOQMLf 5*fCGp0:",EħūXؼGkN:CʞG1ͥht$""d0BGτv--hQUwhhI < ـ;3'b)C 5YDMDOX?ё`$ىwP ˧^H t_jRsX1SCCcğ5MɁ56m"qEtWv"E[3؝73#uN>)XK/^,16bN(saR4ld$+E>g¤@xxZ4we R⋨N$ЖH7RʹCG ~Ù@)JQ:!kVHS'U-v2Ǖ'yHX12v/ x& 8^}<=gՇLMi+x_{,uJ vHx']`iBK,C(Ve9R@f0G;^vl8y#oa`B}y3F|V.@GQ=z''s7]8y3Ǽoyg_1tns88@F;Ocb;(AhCZ,΅$ܜ)m!>luޚ`*ZX'h4,ڑQkɧI/︵w6p&_N-=18a]!p?W^E`A d!zu 'gjv#忿 U%4iO}@3}Gct9Q#("ÐX Fy\8I#}ㇲ7brٷ:\D{8]j6N6 Fjl q)2sg, C+D r!9UWhsa- dZM5aZsCEy Fc7Ӄ{.ō{@2D/% 1wEXBQ$66AM-D:P|HF!-L՝b͊;w~ eccai3xJ_-ݼKa:9%lϭl|}9}߯ca Y)as_\%%t`C J׸`&Gl8!>fPHN9J < ٸF.b52wڈv%1#cǛ{d``@~5qYlhn{H\qq;N l-9} < R,0 tuD[Oᆥ\MPJZsW; zjoJI6Wg?.Ӓı#C׳p2Y?(;B]%cI> Q੘s7x,՝; <6B+jx +(1[ә<Ū|(3q"0ՍNC-V@K;ٳvތ_0v880g*b!1 X"r=^ɈBEh(ΘSxZse3qq4vō|;˭lv&e#xT考5bv& Q1X1d$cLơt|PxP,Y8{ ' #ZP:GZPkPJe77qvfLD"e54Vh '%lasu/M҈e3ƺT_H/j<DZ =Cl!hx ,0<+X;bb5D`; 2~}0lΒ ǃ\r*Q w!b8/H|20%G =]O7F`mLanމ.3؇Mq-MEWÛ-h3s]_^lIB?UYW,ϖs͉Xz5|0%DCJ[39[8|.5'兙y܄\xs19/U?냻 i܋ BZ0 H;16&H} ͞rېZcl%j_sCAEo=@[6MiHӧFǕ4 1A% A b2}^w`f E>\! t@D0ןekB=8ra26^P |rO?emŸ1oK%zЪDWStkx^BCp0B!9!f!`$a.[&bcFCJ-XI0*%Dw3.= 04f^ZX=`mؚ ?f:eSـSy225Hr8!aL hb"[ͱLMvwxV'99R݆V- wE_NM r{iꤤۯ8ءD jv#::X<_I֢\ǑWBq9:r>XNc+nAO"6 GQ1IБSm맵 1F2WOCV<\\Zd"hFH'y#G4nq7 T*1O;D̡Pt{f̈́tB"<= ǃwOC6Y9>9ġ qטYtZ:h1pd.g]:>b,v?ڐ#͓+X1~ JʘPSj6Ck'5]=\$.YQ9bfL-|2 }O֜<*`ar,ME DЩrƣ;TFߐu.|21$nƒ_Ҋ)+eBlςykc Tdcq? {h3TVَ_NsIa#Rh1b4(2o6uΔqhPa#p]O1\3=ÅӴ1qG%VrCJ%&c@ҪxQȗ hK("'|`7?1MV፡ ^{ LkfMČ2ڲ9(*~xZȪDnHuXY0: F "&:6|3~J],ߋx#ËWM/w?C"15BU/I)N%'%$t4Qyf$&3EGJS%I!ؓ> >}9L_ 8L5VdxrA|&d0wC1C*k=Г!42e4C8z3pr$2g22D]|6Nȥ pag̼`$1Ԏ G=w&"YFI3v_+d#cp4ވѦ{8n.ڀ_st%FXЅ1{`>>827W,4cVrnBc5n;01ɓ5 v'&㷙2NƔH+(e(VOdb0F"D׈NSgyiH > +~Bi1k7Ӥ@{o炩҉I~KHH(70&\(*b?%8xLx$&ɸw8V)i!,#p 4sѷQňE%d_ @S1F#Gk?`B揲M%rEǂ2T9aGKB; u/e6Fc=e\ wq:.bmTvBfĈx:P^KG+!R92g.GǵtAIȴ:uTs>CXxxp` _ 3+Q{vlk Xx`#:ޙȪ-LRɭs\>Bb1' ƒ r?o-3?TS$B3|DT]tTj& 6ՙk6؎Gyഈ7x@;m#ZpfDt#7 zU8NI%W7"2gI^5G~!C3Va0EVk3~&$wP ,IlK3۟/)m k H0]-jx[d7%h+=jք4v27obaX2ȏ;'hJBGǴue"ss2d_uf30T\1_M/c3`N Uqy^sJ[8Z͘;q؀ŌC*a Vt23(0d&2IpDL DnbKI Hօ+?tdTPFbn h5~aӘFL"ihcx^ zzAP C(Cs $;'@¦^'Կ\4>El?eغ*Iy7U܈Ijcf#n#} 1hKP3Y(8Xӭs-ך EL ;7_oL᥸:6 i<XZ c=4|=_SӎPRQ @; dBLWΡy(hҀN]fy7pߝ&g` +dfXP"do vDV6=W`Ud, 8CK &zc{.L10ϻr9i%x۳2V%5] ;2qUC" TzjXy0dU!QYͧ9B:0YJm+isG>$#j%gBS;;nJ<,/@1ʥ9at&E=l}hϮ#ЋRkDỸ>5uBMc>CQA`8Yóܼo&jZ {:\? #RFۏ !NHDSDk!cR03ֆ>+{/oRׁ ЗRxmc_XiNsJ\LYrnX, ߖ><}jJp3 f"3^U}2–i Qg/ -}zp%z:[By3z2E+"1$ x*Q݌H{#_KT]gJX5T(8HVO3)J 8 _B+RxEj ]#cN0>K{32C<ƣyRVC }2؃ !3:AL{7+7`Bn }t0ā&jʑ[ӜOm1"(HA]@̨g/ݤч@Cg V` Bq%EA_$@n@;~+yHOb/ᄉGW-=]T*[a"O   3cDϩdf~͚i71."b(>&lQ!z6G^Nge-V6^g/ȴ)hd©Htn @Z^.,?ĵLҪH.'#86$s!añȬAQCp1B $%@+XwJkdf( )?AW'Pr U3RnA_SEK5Fp/*Lzү}'_bЦ3җ%И !r>&8qg\>7:$œF[h̡݌CG0'̌0`hdžW9Ե2y4_޻dqlbk4-6w%;І>: q~f Eϔ6DoVq$_]g'G~HD 8 l腷M\1Hlp!1 cYQEe)M3Tz`BXvKGr=mkwr]_QF}#1hUAz2g,R}bwaRBGSZ+0@$@ȧ2+gav񪈊*83Εp #:mmBt"G*ʠg{nf/=b{\QqF|O ,` T"7o%UП^%NdA?>oF94,C(%`zUgpY{Ql]C?ԊPܭJCEɉZܑHH.ԕShf?(nQETp;3 t9>U5PGj R-ix RLd<*̀ZlxgS8[a ~h/5yrL;̭lAI3fyD+,u PDΥbcȈPaߪVNSٽ}ħ}z59J$cfiGk' 9( :|f-NTb뉲!|zJt֣/_QSB]^CT ꦿ*Ƣ/H{bm 0@s[JS ( hOk!'t/:F)>I[:g:iy\BT^Njj![^_+α, P,GВɕO[7Iy)6QXaNuc+;/xTjHÙNs)h"#yMtvw= Vk!r>H 2>M#W-jFsy.( Y )GBYK\MXMu,Hg+/T"&=)b0fL| R-b_6sn5ێ5RGm7{RNۑ+n[ٔWdڼ5I).M)}}z^Fh}_̝(܋C$*D"NؐDK`(hxxg]BK Ы!rRq;:Fiy49ŠzG% Gd@?ƨ4uV==Z]F8(LcT6ĸgad hԌ[Pr*} ?C ?tp0$f.#z|[C5~rC}u,EG0eߞ $== X#qN {mG -B${ ]\Ąo `4Al<ƃY/ q%u^JV-q\Ɋ\I@se PT"l0!rT΃ރo<e 2Fz'gm :r+Ewԟy^FZ9Al7g!žJr)^]4A6||dbl8m9)V0>#C了M2k"<ߦ~&g1L[l-@*x ]ZDo߂&\AD'nC>tt98Fs6,<T ц oE|w>h 9wچ܂_Fz5B!Z\>C_ɳJLrV欟Nj%"A;cgjq}' lY ?&mNVcHm=~KzkXĝn =qXʹ̯;ٻQ^ȩ+LȬa| ވMk0fDeDLvƐ.~Ɂ/lDE /@C sZT zbXLR>S".vv<򏈜Obaφv%M;Mxȃ$.l@6emh*DD}#iT'¬jx~l`>}91:&ՠ@SA8&TGӘIVWcFw#=oH\-b7#3JҘ\j:)M@Kx;@>o~NkYT3)u/ 7BwR`rB #o 2ě&~XɑSyc־OӘOKCکlք&$"lgyGm1o`8օg3Fn++P[D'dca+TE7({HZ !UeUvr4zzX6pw*ZY5+HgbN%ZK(jلƭf> t(q M5̙C72xx\̹gPX%nVǙF'JI9/;5sH*$.BƸ連Oq=c&GmZp 8i&(0QY:A@'4SpdMD[U6*[,~TjfS|bSuArc2| Z IDATFrDbl] .&>"6`XِYEA6!#Go:PRъDJf2^v-gl*˖2աv萕'ГPq_d$1ß=w2&>_WZy!ZBFGTDl]OFU"ik$6 j,hKx&tQ-PIw}h * "u7c<}K4T*L-қ$!3!3"Wo36a%a>D8Z`F 4jt匃;v~[JN7HeU8e-tYl&>;p!ǟ-Ȼ, b8fs"܅[VGa|gvSXxZڑL64ɒeiH̃11΅pj?Jm54w !Bߊ;h& 0* hAG5*siLGr69/)?ЊEQ˙EZq$w8n2%-nDBlpT΋lR(<ό2h:Z6fĞ҇xNʹ%B#Z D;@)?A=wz oG]Z5= EF}z@b7<>܎EXކ9z>#kAO iX ٙir6 j1v%CHNʼn!| Z14ˑb*xgr Z[1b>3c??`M.%RNJonY,Ŕp. G&A$Ps[D"r G,Er#[ ;aKN-O2;~ėbK^-z=m,?bذ>} lGQԴL+Եbꎹ>Ohh%؟RD1̞/leX[!sʈ4v#E!H'5S5%Ȏo%3gH["5}0ޗ/νxqr5}BKFAj}B=/5NE[=g@2(A45[ḋUh@o9s?Ћp踡9JQ"0rtk'/C.D'ԛrN"gX4]řSTaL`2lM}n#ӭF*ѐE6~oOӢV>dEU+^,En$fTbfB`2JH{Eg){ѓr*u{W۸@U;T(X_\\P{:4tF0%A?fTacD}'R.~ct-Mw`-h17;tZFB.xـW{.\~*&V|4 ?G"؀z!uN*!!D[BR!RMGV#!kΫLq2e8⫨廉7ƐW= t1}0g$cV`$.%ԀGhy\X=.*<'~ALG;ixFE3<1DOY}Щ@UA[-.ͣQMw}j^/ҍt0R5#G teb큙 e6 6PXO2/Z% 9;GèiAwh;@g'w߶WE$-%#*}#{K\.=&o{zFjR0P9EȭzIv>vs=ű2rl$/9|]@rzԶ#/(Uda-9qXXP_q,l2w,3s~ Op-i<|'WYI ~bD c8tԁw/ZLofzy~@kgH ^vf svEKµx6CQ Van8`emJj)䛏;1\LSy&}̟319lw5 D46I#;߄5x (#-cTUEl0񡫙t5baK^"5hKե0cBػ ȽEբꡣIӹ'gD"nmnz`-]$a瀲V|HLU-IX7p 4tf؊ ="yZHRcf=-4PXM`^V򼄒jn$_HjuaC+dɽq3Me+F\dBێХ|9`d7 )dPx#"j8V(!pg20k̈CN'IBB0QNR}l!M,fLN"N+CBKH.f)y%#^22i$GVt*ŕ31܇:Ey9--d"Aq>VSىk?FRRJc)Z=Û:ӵSŲlYrmzCHBi$!@zIC̀)6cpݒlYǐ=ߞg{[ֱtjY}e@,_ς?Ho{X @Dm:U6:0t/0 ̙,dTc9y77cz,-8#:@Nl'i Xɘ3W x^Ou5R?c&(-Eߋ BC&ktL$tUc+?R؊~%V[JHtբ!$r2vuJEfE %n{m-L? wYc&: FN^7 bBL=O&+97n߃ΚS1^Ah35>B/ccEQ#\8ЛGuԴacgKv"28 j&Fe~;F)Ѫ&w܂,F&rۗwMMf6uLG `|ȁLSH ggzNJYFaq |X1)&n\8~ۊ' 2y=xy!bgt j2+SSbv[{G}7p65|z s^jnD_=:,A1ܸ4::zK^5#2 3Z ӣeԠEO/<>M43yQ\|b)܉Fy;A^t\@KS2wИ2 yfrrq~ ˙{$|&3ikbp]9%sk^HL77M Yo3i*ą!1;{>VǯbfdU<GLWӦf~>%6:&!<dR)&(9P=ooN".iprvdU(H ݋//bo.WDzp%JG$_g:NA΍#wܧ2t# Wabi=ČW~;K(C R: C[t%"af*^lM.D10/:Tthig` `r %DLWcie=ƍ艅9F\\Bb2dR OzTן8z'Xޘ@]7o82+Z2=n >*  ˎv`Op .|r<1$xȳGbǏ pGqMu#9V+XRJq?{q;g{ v)bmI7?B~>YJG31^:-[c_1(Y RUL/C~>w n:aͽTxk,ʼn%>X.߯ؒ((Xm?C@i!\b0@a!ccOB){L>:;p-) LIS+Gh{M%xoL`fC)bW\XNMw%';Wʸq˅sĄ𤐿|ĄH!ѧEĒ-8s?n+Q}n,hdanq]R`&l%ɯsk9Hȷ\b`μ^Ϛc1l"Ɲ/S_AoMǎo~oWFa#HD#! @GS'MIizj-wq&h e-<؊؋]ѧCۏT„d~LE+kױa*x̳&^IA ]Ȣ 4-3&,v,?llhˍs;KbV0+1tߏS z5OO2{0cYFy{0(X|'__0279#s`yGOϦȈr-s13u s7Gꀉ A1HZ4U}xَFp_'os ҉JtJdGQDLP wq ]?cp)v `v '.>YK>Jݤ `Rl\Ę.3 -&ċc0tXp,`'V@`w_3y#Й2>fƽOB$fRb#t"΃Ƚɇg𤞮> Rގ'2-&>|{W&rDVRm:cy٘Y!d, $)I߿-*Wf\,NbT #;GMgih}^3Q?4_@,J#>XZ>͈_Y9ۈ $Z-s>Wd,MN Q^H dDoc,)oe',T=e-(ظ b[Ge7lE/<.gFЫㇳ4#WТ՞!8L 3H 7lM?"li$1 ԴqAԴs"I}0 Qp41qsòdj C\­g,5> R>)o`(yAym=L֙^!F֐臃% Zxu*޸Zq:3\]F*ӭ }FC'')II|Hm/8^_ Ap(D/Gϧ Ka%Ou,+: )O_O:=r^c\F,bL$b :hNr1oٿ ;F}HvB#CA6>e=,ɓb>0trATtѫBy6q>p."_ϡV{ BUɣ p`x 8[ȑL2s7ʑK!il BmCY>ǎh4T3UOd`0׳*2@[3=ZBlz&LgD1p%{s^H3_#Kd좽m?. ң ;;_g6f2"]7 5Vp<65 6=K)inNB Æ_ө\%Q14{KM&/@{+acӓq< o1uDr J<,nblqhb7Š4 GbE<5ӛO}%VL^l}qu$#6 .ǜfBtsҰL 꺈Y41y$ɾk"d$G3 n2/yq8n|vWk]t&OFD=MyKޝsv\/Sxmr9ΡW+f$=7Ni †TvS#ƱWg29Ҙ#3 G+,o&R‚j%,[Ny-L~5!㢰c*zZҟ"7Q)>Hg>Ui%&mټ񥦕ÑK70qҫ%53n1-t'ȉǝ|5PUB@(ћС&ʗ_-1l\k D((5t:rqsb:lBlejݨ)B7qu:j Ai>>hT<-=l~m/75=#,=؁'NwCqwChN75̧[-lR~=“JLDlU;A,x~ ç`w2+C 1v`hKx_Պ-n wf[\!BY4L{/'R"ys LZUl<͋ܩ ~"u8d"_ʋk_0%.οǣ:.^IMS HĕChgÍv@'go2k:b $yl:B7R:vDF#/gYt}J|co1itWA;3gr$KY3;8\,iR~|B~#6t "Ƌ}|0nSXoW TAyzz`a IDAT_g#Sz#ݙfjrѩ Fw־ NDž鸎p9c m2 U} 7"$bb<<,E, -~9 ܜx.Zkxu92 K{6.gv,0vX'@t>$`Ǻyr JضͿ"0.[eTG X#4cB,Ζ*(af k,zISX&oɁqԴE=>f86i`*jK4*=fP;$!q%> . ̘r.c0:1  <$8'{tzM$~W3#| T_bUIqlOOK['Ϟ٫YU NN^p?͐`ϓg 9}凔̥qҊw =,:\QcaCL g"wFfM⮠)eBDߢ>CƟ>zc;& MK1jqHc}9,њeHJC~|i$C(r*b8HKK7 F׏ƕCvpGO LMqrpxc$Xv ECQ5d ՝Ig'Cq 6N sro;B"xZKi% I~RPM}?R AN,I6q AF6*˴ܭyE^$,> |W=c9ux%zxy1I4V%! JqrC(k9UPΤ YɌ4 ƟRr {2Dx53LG]ɩ)#6e/ʚ)(#!G`"Pӆ31<=|̈́(UttL li,1V`cIA6z3bPQV%GU.iR/ǿ )è0t rCꇉne] p/F7u aiӋ2/.:,{L2N;6O˚@'*;/%9`g} ~^D]خr1x_<ꑌ eU 4T(Mx 7ra;]:4)(䷥[s~#'5D3}2 -Xˆ`yXK8 쌫UrP-8 &DƎQ3! wi꠩y1Cr @tFLY#wna<$&ܧUPMh, RhSt81elfq*~^ۀZf%i]GI9ST{E\Us;  GPx amAi: K5t>L#rڻx O->DMF-}ӿMo @CFMX/BhP%. lGM M0<-Ut)Y2.ZڵFjBmdL.\gwLͷW lDJJK #B;HELf J}y'38hc;x50>OWzl01 87J-13a/sa""e? r&0n͂iW<\9}-X;1g\7xU"c;DNn.U5$M?m$~OKC7E}͏cf8PL`΂uk:z9,73ʘȭ=d0|عV5BShPqx%Kq*FwpڊϦOf9L'̇[mcC}+"졩ۉFILLC9q{$DՂGܿO~"G &>e(GdAW-=*;@.!5Lb1@h2k̹EfJs~JKB#w+_Je 2:7MGx\Ȕ+xE09VZ%T5q& &Er'Z{u%gbnJQ2m^DWgŨVL`'3N̓j,q/_ ߜt/e =R13c1X6y }ma(:>9;adR;vմuQ`FVS_7s% 5鷸;Je-fcfJrSI 9> : #x1")"@e\LD4v΄1x3%>8wGy5#hZGi ſpI"ݏiVr.3_Dɻ$1. /2eBSmb*{ 3G%$(2B d0OҌ㷐{R]Dk1>7#"<$\=EQ عp"k<Egu$Ù3bOa8s=,C}%?ļ\Ak@Tu?3/>tU e%')Z"MTyq`Z% ":beAHmY#IBG771f,ɾ<&س3s\)a SǼ-9?_9R֊XaɮFo`A7 fe wɮ! wwplĢgQhHĴPЪdGY%wn90 ^=f.gƮӸ"!ҳ1g|f! ݧXFoMyFLU'^"vܼ()%:8{ :լ^ŏ9z5\C2s(ZAK>p5ïyF GÆԴ`鏲@>oQuAq6r ESZ3%a *S*=VmZSq7o2boZbtK91Pvχ(uf N0r:bolYX?0^ď90ߋ\EfFH/^Nb6~5v2&_l^E;f&y8wT4u1%ef#QC9.攷h6iO3-3#&o vR1E pBB _ۖFz~ +x"5\.%ˬ'Aҙ= g+\Xq4X&f# zX^Ha)՚q'-3S|ĎMdRQǀ`|>/SBK5$Ds;wG(;n%vdf`aM?SƱk;%1 w_E_tD$6E4>d[goWZdж+G>cbu"-迫n4#Dl?:$bsc?qYHs# 5xs1cytgz!ttPU2 |ٙFZ\9>;7:3S/XK_6%d]bY;6YAi3՝< ʓ ,8]sΔpb-Mݔ@}Enk],nQp o&w7RDPVΫC)ɈpS1u9Jl*wnɏYk /?sI3͍k{x,LY6s@XbKtRTOBsD-7K)kӇm;cʼn OD"LMp^'0L aꈺ 9&yS[=ѣ&g:T@䈅+'oFy>ebdSh+RC#Xܦ"[/LC"V\N/DLc!: ͭh\9OԅG;cIx/gm>\ty{?-\a$װ4#ه=wd|ĺۖ7Ӹ+ =qdIk78[s:S_`x,RJ1,b\tΎhXVPD*K"!EP Hx92.E$!ќ~vt(Q13Æa]0>ZaO'$%" g' \ h5t!tBL/S;_#&>=Il:u6uWahFAs 1#8ysNЈ܁^ʫI/+Nٸb,ꚨzLĬOQ~. [ Ыcqa=ΞQ.8 _1av2{N1_QXSGl8fŮtR $_n?g>' ( 0{XAa hux+hcX:{ɾ |O;F#ؙɡl.>%9u)ykɼsV06 ˎ8ap`47'3<_1ubY;(?_>6]ؑԜnb*&DNOp"{scXȸM-,ڂ=O (|B#1=*.';Fފ@ X"d6k AG#lBׅy?!˟PWWX4l݉G_taBo! edfX<(_ O.$2!B1J_$g[Uj˱G|pc8QO>좩~Ez FCb9Sm$ ['<ˉI8?}8r{'*[s\+{)CG<IH%8YSPDDE VfL$e/em~bZTo2 ncbFtу(,A'鸅c)xKcz,3ʛX1Tuqʧƒq&[s)-J,L)cT.킧-n+%͗.RYb( S[#тZ>E3N8z,X4灌V]xىؘ16&+ظa-13!|q7Q*9fjiDM29=Ebk JoQ_4z#7ndùU'HJftAׇlAnW3qصLƣJ@Du5Yt2Z 0R '/]!UϨ#qw17A(,he4NFg\Dy+n8s7Dգ 3yXGYBC/anL)oE^N<$;pgOUq*o/'ԇ;Y4Y2n~:;Cb#dx1(`L_T|='s:?w<Ax9ΑU%ӪՇwDn7o#9S\GuLN6Y`ҁQL9#hȍV]hhCK+Hz;?  'X. K!⩹\B)*)s7'Olm 5: s(IԖ;7jvL85ב@wFlJK*f VOdT87KOJM*V #p4\VG qFNu_ܬ哳\&ޟ kx²4yB97+Y@Y+^)b bcK },K}{ k$dw;qNr4`n| ̬B'rSԔ=iΎ+k燯yקn1N"30!/ד2 ӧЪbLuh4"2'g2xZI[ eI=}"I#HSȆbuz0v }"dc؍c2b\&cPGKm{ 3>2I0`ESDdb>=x+#Pkpb'`JZ Fz$œH ]˷ M!A^=E7:b+% 7`k>17Iu+iUg`ΦW%,x7W$`8܋;Qδv]\Hn9J3/ a)x{GJ8//)~ki\AKFfBK'a|w d"#JʚfN ^cp`u, 5DVdGW«q_Ti 5t*PUOO/4 -ߧ#K)1h(>SRb BMPd-)Fc*-9dHw#רxSMSBUuh TxS.J 3gRraL4.D": Β"c)Aw!jgqSȉ JʞlnSh>˾ ^|;qWgm F:cdBǣFx󴌵'?l9㐈i >D_ɩg$p*VbJ#/дD!8SOVV3Qި컆Ԃ = 9 E`N#e4** ۂk,@H%`=}:rZN Q=Gr-x[p7'LLq4bLyhKB>wrГz'V$a< (HCۈ3䋕ԴyC)c0>:%]{ AG^~}BsUlʭHXHDe+k>Nc~5\H);i%N&Kc79uقfX|U2P1aϔcb5'c`p۞~Mlds*[V \cx<~; - %SY1ctD"R!1ESȂ$~2'⻍tgˣ4j޸ #ffL6oFiOm# #ȖmWطJ2+>wm<'b0UXX23#;Ms 9#f@mmT}hiXHq#m5+zڱgkSǠ6בVŭ֡V1.ux\TZiysqkcM~8?+l ґ'& œhTawE]RYu9sǠɏ|<~GqqG &-@Q%t6#"r9'q%tшɒV<"H)= ~8ȁL 4*9l RdY( GbCWQP}tuxBUM\UAS7R 2)EET5z$źХD5y|P͋}Y0Zqn5Rp#>@m+1TTIĄGp1SѧjJ}ʌ)7a QDh? rVN}fF^昚EiuOOʤ *ZX>V)绱u4s&shѠ ʍF )^f$dI BSI* 1Ăv"<,0F"ÝNSq4 aZ(Z†H"`ϣ> ę פf`l@}Z/VΤhQp14Q@v 1I<-G a.p, ~S#4RP̾3 z1 -1??"ĉ { e*p#g؏Ȟ'7s:}̚d3ȭgH8r *e|_|@C+c3 #s,,I4b惞" 2_qhy8b7z9a1'(~Aⱋ}?@yZtta,1SX[rQAp-Mꍖ(@ͮ]+B@MM v=DucHIB1_B;dhZҒzmDCZdG3 Oaʈ<:Jo+MnDL̎kY#J$d؉%EO>ơXOWh3% &}Jn.M̍LIh Gp GO,aS5gQ]AdW<-(%ՒB^~=ƲOX=9?v`!$G 'WOJ82`6ȇ󸄜"&Ow/@7aiT Ne ~#&|C-^[N+-R؆-n8Sه8{N D VP_ \Kq((sihC4_(+BJ)u˒l4HthoFXQWuabChcA-0v܋Rps֔f^dR_E):r8sB[_ ;,:|~IQ1u<80rkhS"g?v8p'Vug Вk0v.ar<)嫳 $& cR+Р bh餥Z]ĥp<.ah+gP{:n8qxxXsJhIgS5Aʤ\(^dϩU_q M1o/M_0i.@JZ4w`t"'S2#ny OgMZ Tp xe+9Jx }zxs,} tu 5ՃA \9y&PUܻ36jA'oB,T=(0 s 8Oy(o_r AZM]P{<ڃ"~CO1LbŹo-=7$$lBSL]+6(aV0W.oa?8\^۟լ=9ϯR[o6֘)dl e7zژ飯ܟc'E}AY3p|1-0y8:Dęd yQTڻiC(d7Az%#W`%dI8EK^>3s1QFN)Ȓhk#hp*?.CKM(ko^9^m]>{;.Wp7&(u, bCw7ٔ3BIi| >vpMZmo,׊|D^+hiPHQJF!+&;"m?Aق hqpB7tdߣgN9E^B%B)TN]Xҥ}{_[{H)_6hu;ɧ DSL' ɫ&-mng#1Dˀ/2 qdwPK+>SDJ>)\|hy\Br6wTA~DsOS}͖l=Zq.ƑWϙDDyp'eC sPh֖jhP?|rQ%+݃lX54\5Kh 8؎ Γ k1^ ptm^ Ά9NV5['8#sڜZIQ3Wt8z`X_4E\CĈ $#$Ij&,_ON>(lf%,!p$Ant(K s-xZKnR j o ܝq8@i,g7qhnҗz$ 2bv򺚎Cɫ8܄s4QHPyq3{Ć4o?a^~ZUG@< ,N\Iy-t {l'U71 w0M\ih!&M\JH(:Zz?ҹ08R 0+w^ӯ9@[ 0 t)"iױ /."Њ81ؕ^5nHF*(NV儋uOah m@*sŃt^@+.@%}Cs jDz\@w60"\9ɉT43K*k]Nd(fxZKjJpO>~C׸{+L߉'覣 cupM+"Hz=. ";cj&y@]&p; \M|dIb"q9mM&^xN*6PQD 3ϧVYEp:xXHAl) Z:|{@ChϚ3$5/@}& v3>d&|7Kf.yDTDJEm;6Me$8z#QT8{[y՘`cc37y9X%ߙN`v^rSFb ~hc?/7;Fec^%C*k(kщ:fW IDATz{MMlCL XIc]q(adՠ}-_"jHG˽Rx y9]D"4Ifc⃝'qms%!&r97ǻX:\f<Z!7-‘9?f&ffdV١$lrm] cs$J=0t30ȋIqĆ1lĒuZ@C 7H[_++zc)-7=I B_,a\,3:ɱlOU ?|t12Bom rjC(#E#=ɭ"1fl=Om# :L.#iQ v(0" !ͭ%h(ܘߥ E^DD\#Ӄ 9G_ї׃_70B\0ō#e "1] TOYDoߒ/xS7l/j`8+/j0AK=ˢQ|2 Un휼At8f6p9XüY}oۂ+Ρu ~[fH+nqL1nz}T5j(?%bU2}8m1/2 {cƓ]HSvJZ>3t ؽNݤD};*;ّXH;n`!G3žz{C̹̎U6|8"?D?1bIьgӇؙiͧ0ܣoQ~mhP *^BA)s#^ҫ"6&^܁7VL/EQ9.hnDGf558@L J'ѬC,ōZ<+;A|Ü$Bf 2  kϠchR\A F󺚄cbrL r9 0s;06 ԋ3 #ă y&avFLs,)'q5Q^&,6<,&q+/~dL"|O3z uDZ47j }jVL@Z@nmˋb.nCWbǓl L 8RѫAv½)&s31E7m5N8uup)38\ !o:ٞZR=A.EOS]D.5YzaHmR?>.nRprή S;ԴagD^m#S@;@(Aǎ "\t &C'Sԇ"}2f6¨h]*1z6QxIU3N;q k>db$4S M(Nu+c'8勆6ΫHGUG jn3dIaAU3KǠiĝ3*աC"UĿYg5J8[t0c7~\Fulk]8><˫Rαisp6QhLZX:;c|ёcVlC|(B֌"5@3wɮd"? 4= rN& sC,M o TάLRɊZh{b`GYUHY=< Qʄ8Xȝ衧Gc#x}e.2FRk0^)ɤ%ҧ!Q#@BR=B(`x_ov~:N,Fzck̭] #jh΁OcVa/G!7<%kb&Dr#t(qS,d{43ȗ x[0҃i8[D./JXNZ"q10~yA ~˚,`o8f7*r; 1T-{Ȣu䖐Uέrʎ+PDz&Vt(ZXS%#%fAd^fcmȤ`sɯqBhRS󯣉Six~{tӜzƔ -a`_@S{Ga(|oc{+yGbn<> .뷢)f$d0K"X89hk1SiǤ),cKk'st }m CS37.!>%iRΞĖa'%+sZCqq3$ORq;7gk v-"칌 -T`!%UX2e70"k)n\.:FdHO1VՊ m+B`FK56X#Kzv_k h9U~&t5z(Qm(8f$Jf&t)iQBYD"8/;ޡ 2G]pVR7} դ3iΜO[Mb]h{6t'YmɖnK'Nt^C`& Be d@HiNޜ➸^Ԭ.?l߳>:lYѽZ|l c)JrORCI1|5cb r9n{ B08p 𔲫{sxttE>OPI̝~:*,nfj.:REQr45zAJ&&Fc3 Ev6^aDC2 k} fዴ`3!D+ 4 6`E hge\_!r"VRq͸IR%;hˈ}+[91}aʛ2^"lbu)Č0"5+VRU&Gk,IJ'Y,xO&K$pmYΆh-m  N>>Ő~QLIDo&.>g-ɴ !O >(Ae=~ȡ(!x 9<6٤&Ĩq8Nٷ4gNb&я /rPFRR(/Cae޼A|{6ٶuyZ~!5%/&$ʫ1ػGd!2H :xȓ1Ho" G+"'Cj *|6~j;q?fctBܝG`R"wuL7$`ލ{ @ NqXqq 1 U8C#m.Eɍr#Lh0egh'q(rąpn&%܋O0Mff`uq ƀXlZM_%c29;LIB(⓯Q,\bn$@KC/cV_/j0 PS[+HAKe>[4 c`@50p:)Me3f'ܨa d*j/b7c'z>'hDW#J-F7" A܁J Ï_1CqHD /M!y1V! x(a%(hy;B/xF?^F .Ao&NKr8 b< fnvK )C퓱;taᬜxLHfʆh7sK6\bB~2.B}o|Y5WɊ@#gIVq^isa]9xLOWJ/'~r7x9&QI.=|6qGsPT!;5TN?Z +X4/ %$(RiA"fv M4p ?%M$~Ss*no SQȸa$5i/ng4FL&&~b?:7p;|tNn{ Q*J"X6|4gor}'ZT97MDDK6֢J/vN޸_IQxcچ0`|;L˅2j"QZ$ <9:@Ǧ``c$&SJIH'B qpʫtƽ?ފFCbui83aĝ(a$TL&<UW̟!_ΑZ榑ŧ?㥠"k'ҩO|; hy)&+6xoa% H%L䮏=E?!\`q:Dr5ayxFfeP}~\"R"x] 8v~r2bh{wO/l19KH {Kx+nT|[ǻ- {N6 f/;(IcTM4 f\nb4!%po>4q}i,6#$%HN5zP*8b aZm=c1Yy6v=:BDxQgȰ!Ҡ;4{fT <442n<4d.nS^Z wэb;Y{j% f=OE/X4TρGH K]-H ]s_l᱕*p%8Â?S31 ys$^2ҹϣY wwVd½q=@F. 53DF0-aVT|(9-D3sLP{S>`TPxi.afq2.o)TT̂l$&ovSuE)?,#Y=uGНՋuX ~ێS~t\т,+1]D*Cr.FҐbڎ_r5Q=ɈO2(ZJԓdN<W&- 8^~ji"H8ğ據CH򓘒@(/ފ-*&/~={ d9}es(b5xX nRBFB'6X$"|,]|&k~i ճSғpHR[Li"k`ur_)oz&-cB"[Nct W14ƒ4U2 v\ @-B% bЁ,YrWl2e:2e !&X?aJć0RљP|6z.E&gs{ YyC dhQEp~s;KAG0UY\=( fLBT!#=XݴD@> >HÐboHoFVhC?.P "(*%N4:r\*8t4 Ƙ22a %8^]LF6Gsm(k>nI\~c7@ǗdO1Zr39z`rOE%gʋ˓֗Эcyl.JG(Xīy0r.jذZn/qN" 7'v-nŽSs;a&Bs'&++ߣ)E|nyÁ Nwa!'!IeXΙT>TR@d8]}e2/ο !5j{)incL cyZVvU|N<0jD"K=SIw(M#-f~)/r3V11덜+w/qw⣵ IDATʻhf fAÊ6v:Jr2r e]XGI)Vlŭ^=Gߎ`G.x'#f,.,Uh 1z&=/Ś3m&ވDD֌@+d/, '>,]O_祷BJLycX4 <0KxI_"?=LM9(rhžXI eNyZl#@-/ʺԳmȽHѲm»p$δS#'- NDķ'Y;XQ=ЙXEe Ḧ́kt>2_AㇷQv7'R PᠡS (h*{x'E4t| QSH "B@H[%Hl'z ?~P(Up dpg/3"c߈O>z1}B0CM4W0k59461XMlzp-Ёۈ<i$?K?bt 0XGX}(9RCܬ$40F?Am=gH]FwW7 'R/Ѩ9u \4 &17h䁹|xf1/,qp(2CmĨy0*HU7Ɂ<aM9O_49LFGWP׋É+yi\lO1i콎O8|0fm$'?He+n_ȁ| w _ò|@(%ρ+HDsh#&?7C,yKēyN fpV֐Nz-L<rO:Ҡ7i&pMܒI7k ,,'[\Ćq(TSQK$Cf*=ͼD$Ҩg R5LIBE ch~Fz^Exɩ(pq?\ >#qp 㲡H%zu匜@U w2څЏP (ԅ#Vf E#3#9ROxYZ$bq%Kc5Sz-" ؝Ep*r92)eF/~SLJ0 ql_bTxJ0ȋ%7H`i>C~¹2>br#b*nR,xk]̜Χ2$SFP( F hT㍯u_M´t:u,j;=8JCFs71vN~37 VHiavw*x癬߾Fނ܋!=Þl\ t&F|nkuDC(' #PMɅӄh'=$?R)`F_BM>T{3J-iBAJFH_f+3>)wehqp6]5ﶓpٰ`oHk(anB2X>7INd *f"3˼QC0~ӹiʘq463aTܤ)eV|G?4MP̰cϱ&XbƮ*R)䉧gjox~/V'<_m%P 28Fkw (=ӅY᫻in䧝pNTIUȌ_Ee:4tGٹ6k?SUu] a4 ғ`?;9#Sj; &]^ӧP~-[Y: 7-zRF""2Sۅڋ{By% FAu,"%jbeyM-kj1vP?ʲ<. `r*r&%h36 쿂˓~˸F|yn9:8Ě D8@q*xۈ/=JD8?ڛ[֓[HqSIʷs n6I8LH˶M.: O %?#gX3㓂ۍX񛆾)%f h`6pVߣ9~?QP4 [=$,,&*q ) ̃e£0A)SIPiBz2@F?,}=L/QP"1hd[rDGx)y!n`fUjYGn(TS9r"$1j䎩,Ŧض' !?鵘idrNcn dGRf|A^Lf%"_OA iAٷY$;#o|Ej*x*8Įo:H$Ą}X{sϽ9±ZP'*b6b@jf7^,zӸioOH|)7rz ~Dh@ӂCUJFb^6jo~]+HXQb3չ)M/ٸ4J݇0[iՇXIj+F_IxJ)$:m0(000Hf qIxy↚V0Z;b|DF"Nf؊ tN^ ʟ(uΈ&HB]NYٸ@1CE̹oHäl"8aIw=)hSQF0څtUg4)N,#U%{PL)RUjX 89APW42 !iMש1 P@BnM(eB"9Ep8ALJYX04uRUŨUEHD|R0Q/F<dU(d5T23)N"+HJ6})cV @xh2]'G8SÀGK Kb=K'^Np\k XEm7&tjͿ[4׾E߀Tq~F1tΆ/тWCz6aix0Co dKDj:y!׳hK0^++||if ~zO@Aw%aڛ&8_%mX'Ǜ T4bE=mBOzpke3UĔ"B'ᛊDFnz uG2-Hf6J9©t4sr4t9N<-o"5 L|q7hP8A,A(u\mf!2C4:g~AˠN bƵְ@_y×n2~g:,.rS(j/. //IP$e&xE7P[;l}&/GqDδ9lfVj:D,)$s͜؇wRHC3!LLf p/HQ47:yh&>T4"Xf8Lsy$D`0d%EԵ=RR"eN)aRa/Avb#9?im$vbrFKqxKnS~1LTp_1 (]@\R'9uHBS3d&ttQH[-6; DPʷI!%wckvwGRM]%/C;P*gRX3<.F'܏63-Y(ͥ no/i!|PVd27:ܿh_*TٿQSŞJd b9ihAR8'Ūi8l ԗ'r>DŽxrgv::j{1`8O\&5g&-o/T^jig~臘 'O`Lj(w7/poQ^sKyy'P>ovs(>Fc21L_`t (ȣNN@">F@X  ' - %n"~S@ f#&5B+}HGp#FqXA~1~l DM;٥*f}+UfKȃxKyYhTX˩22r1 H$="XE9g!\n\``})J=O.!7[TKN[M(FܺaE"ng51=>W{$O1r@;C!Dj/ϛ,ho553&$2f.Vcd3K~$G!p,R9\im0N$,VI(Y͠S(3LY0"\Me'vaaw_䫴X ~dhG{;K7@h(&`0; '2! HnFQ[~`F)}v"㆐62 Lf3;'b.OD$ÈXV2SSGe2n#QDQChE~xSMi#`M9[LLKeh5\",^V g## KiGKzqT6ˤX|=9ZʗH:ұqD<8؝+]9PHV$CO.ۋ /%s=!8A\<P1>w?s}xd)}LLc^:kHDiDx: > Bp27Y(P7H"QZR"Pɋh2^o@'uS0 / /~N@  C'0{L=t%)X5 \B&62OzA4 9_݁šHawpIv| u!$08@O<ÐHE_Y0X:z?1xb\M>jGû[/a|f`}6#7}CL%>9h|Km6?-b:GBv"z>:H8tBz L}w5DŽ ܬ߇LyVmƥ|skexATD"+X54ӿjSRJ m,/"=YHZ q 6nSuǒA\7h ^K([^VL .bU!򭝒tyh1]$&` 9U2҅~XQM$%P {ZQP4bFPQ`È9h)Ce[+Bo }p :JP! 5Ds*. Px7u,ePDr4IdA~GM &;<($g!Z$$&VۻQz37&M4Srjc-j@*fHP%BXǓyyx[8sIF("%"8e,Yh|[[ V1 0%\`勌w٘ͤs?ȓa$tNw3m'Qh @ XpGC4|4bdJ\.Pk荧;*HJU BfBW ڏ24ֽ );KQb7HA*Fm@o}'[K+LϢNVM.b8|I\Yέ3HP'l+g^z,}y`4`1OlJ'vB/c7i`wrt2fF"孇xo_McXq8\^.^3⏏7ܶw7q=cl$6#y 6z+E"vxaSxn$J^&bgGm-g~ 4 GI!Hl~uNǓ~5 5SӊDDSotӈc7p-]o@?PD"hf͓npq b~S+jJal#%4PD".n@:%ɫ龉Rza(@( k (9DF<D"8NfFs͇qvlDaF*V,Fz!KG 8"C% NT1ځ<0]Bw(*B?j<8@7OBa(΁S( GA3K50F/)MS L7 ! *"Jh; d48.2]aSxs[鸄& o# Fw{h6V΂y.I8ĥDQHk#AV1FPIWN; 6+=8ư ``1Qܸ@ױ x"+nfTAԜDAߊMd!z[ 0rE>h&F# cCDৢ8E<p[ɻ+㓈Ǩ92 VJ |iRHK$:NL"w2ܼHFb.@Bԫ-$0WГ4 V4 VЏl{09WU9wO`0 0H4LQٲdZl:ږ%ie͕LJI1bB&sS@Y0OU=~ cH!1ȃ1(P^@P6..TV5j]-Wh+ҿ("5r;KԽ@Qd5m5 F 90&(nqUm`h~'j.7Am@ٯR[<A/zx(tW)<^m"|{ϲԽZҋM hi0~g2=n+Զ33 ùEmdHe{ U~y1Z }RDu+Ǒ<(,y*RXj 3)\ K~A KG_.Ǝ_Eӹ:H̥ǰumwgN3{Q&"[|]`a< SJMŽSk V󖟧"Kd&=ɶ#B(i =K9K aBs?H0sS=H"$ꩨBiq%o/F2uw X6t߇:CfcLIHA%7EbǘvH]AĿ`ᪿy3Bk L9ӱ-E;m?R+zBv6۰!s Y_<=uYjĘ !+t&o/fm'?A_! nCpQΡ!Q"d~ YT`QȰ6i~9sX-Q: r+VflAK> &B1g|d|zO -C-h `Oધr73O`iH>wuWL s#7B{H-s[YXfq1BM2j>4+ ]mЫ 1%mtނYQBb_ V18F(?Ӽwe|lnGT/di(AbUGҴBS׌aEXHKf # -hc(.9^q^s-~·Gx^ƿ  P:o`rC,ao+ c1}1r?٫1TJQjU  v2TD $ZAv㴼_3-V.aremxP| tmTo/7X>@21r of~7alIZ&E :CM/[efPIaf4og>\U>Ol sݨ _t=C~,> f<@~ c|?x qW`>D$( ǻ01"jv_+6($* 61Ц6D ȵqǶ $ŬZn܍nH1pSy/DO,ށE'ߏۑLx?͝_aloRȵ̾`#7b.ad e,`5:^jjі9>#Y`$ߦͨy~;DzD'+̌Rʒy0c4,O nų1L0&Q7 ~H-aeg> ,%LLn/bGUb4!5^$ {KMDav.b^R9<*^jrz!VX~[@qI^4S\¨ɗQPu+.+ SL!y !HX3J>fc;M.?q2<1-(0':z4ȔӘ31ѷ^]H"ߧ'9f vhYo:Ԍ;'BDV!GFB-/X7YJ;p?Z[p{Ȧ}Cyl|.ߧIlzR4CSIS=O}ݙXMCDbE=%V0?Do>?\AԳ՜?ܳ~W}-XUΑ>:p3BMQ8=ӿTnSAl D0; U{ײE*Ѷ|Iۋ'F[[h!#|Q!?Fz'Y%U&e*՘*Xh>*e<@ۘy̹rFxzTܷVD$IB?K3?_ }]^H~CXz]EJ h ! 0Z5R CKۏbj~! XKH5D1Fy00m0>t !}(~wo@)澍ҁ6Mp5[D`>**zg0Ƒi2s%|@4Z!\r+La@ R"' {~"#Oa-Ѿzg#s 7PX T:~6(+T"wkaiȱ<>F/R6" ^,ߏb5*:(Ћㄣ$"&qT"[0TMPH;Pf0 6qkTd^BHE",MenH DY|j( VN 4JZ?P8@b67Gn"r~`F+қZ& 1'@ 9˵ (`-) ;w<0:'y1ƈIy>QfqlY xq+2(b5vR:l'݇KkW28 FΒ{$k9Oo& cNۅ:Ma3cBYAo <.?O;7~п3x^KcL6W=xm[=Bt]\/R[nȪxX2bյ_YnO"#w-qź֦7%[\wn!O۶m^,ԌA P.!* >?m!ˈ&AO}! ɕ:VĿ=$*عZ[89s'f컛:@n`(<ŝ4HMFS>)?Q5|QSQ\%a~R #1c.7[d8qaPeڛXJσo}lh7b%nң$#&dtLâ:HTE0,3Hk9nʗnoo+*2^?Jjk.n܇M^{_}/vW8DKͤF[ tPTqV$Sb0}?Ny;{+>DYCijInDKltKi.ϣ) ?GM?y;|_q7pSL,]?<s#(~A\A j 'UF6x o^G_S䫧ʩ Do'7m|`lfWɊ,\_ 5c`cNQXk!hH2"gEŲȔIΠ۔Md|vrU \X|% Df~T Y&8rл*(^'!$kչB1`J'+nvQ:i ޅ:V\O%CC,k&'APHNӃz}Cv ) " 袽dy}S& u xkg?,BO s# $l7 JIYۢmIxߧ8wGeQx}%t`xW>ůXo~AjJh{;F $"x}} -=Is`:~1f˛̪ERW&j8W/gZ^Iz* AS r JzpP=09I$V kK^GYQԈ)% 2XJ<$ç0 Ƚ /w_(N 1Y2,eml"bʴf("n[FDE #|γr8_Pj*([S^YD[|IJeNʻDFhM$SO?W)Β.8xh7Gn1Tғhˠ!&6!)"zЦo)CM.&D3` ufmƺ#$7{>HAeĈycTIVa[&.A9qXtrcWZ\ aVfhaz,Hgۂ t?HM;(b chNB@Ɣu_!cwELRShWD[P | eYfbovYvo(r;O1 :%0透jQ 4<CW=5>j5SQ>6D%2*  $+EC7p'%JcniCOG_g܌5ڋV~rݦPwY>/mcW`=n/?e-] L(ux.Ҙ&L2fb[H0 IDATn""e( pǐV#U9<̵%5wet  ]B P9<K6-o ^8 ۹DB%<7 s*2[9!1SjQ| #Z ۢ *s+Q*n]8'>mIEtRacԳ/i$|wԇuJ41!)tjpHsa t "_%TGn0Iz*0VR:𧾌OK-EjcTHpKTD0U)g fvӺD q懱,e"^e@Y%uX* ,h;n Vfn\T]^դ&IoC7cOt}r9ix ri믪iq)#u *f87λwwFTsQ1H~xƗPIZ@`LuJҫ$!m͍҄VZwEGQa.07΀fߠ a~llwH-0?=OwBĉխn =PT7UzItj2ɋcs4ƨf$@شҩ֝;E- (̭PFHґEKld@wNK& X%,R3$z(!TF1 $\K|9ƙAK(gd YrE<( 'x-S:uAW=Q "2nheE^+8"H'*0F.67GQcpbx oQbjQzMiS e^Pf!1ˇ>D@FE׹20/"@^0MYƶ;"| 0lq\uHXsBcE07Q܇܁kƂrt/NۿS,/ae 97anl\E"#Rw7$;M|Npk\`7)ԇEipb]ϮOOH^U#?ꢄ=T_O\E$!ExH4T#$a5RK$Ays  *29 @3qD=w`Nw>FɅI޺m㖐P/h%ƚC(ηsiKrn-Le)).S@]Atalmk[m[uEӜs[MNr9/7zNxcb,(o/7(,HUnrrMT&gnâg G@6f/&=V2NO% /AZH.!ʃjI&h a7Hg+CoeybhU$@,bN"ı+o2yHýd>J-6۩{7ݻ|n92Zlطf3*"齝2倀t0 UoE!̭tE MUA2 -0᥯u+@. `4~nphWpފŸcXrVCka]sfnÿbN9B)\34Û=zCxEnPհ*B3k'W A, ~n 2iC h9j(,|t'3 w@ HD[`Mǻod[# hs2HIԯ9g BLwCMU*IɤR\K*?J*UfX9>J7O`ێ6L:L 1U Ej A"K_]͖ۑ%x$ z}wrqlD%hgډ1p'N={ƶ3-LM*&aC!!FC6]#uAUFF a]m7Q sNc㖨(O#DT)x @|hxe$i=( 7kS\eT4 VҸ[ÜB 45T,vNM2 CuPTM( ؈Ibď࿅h&YȒUQ(&[C;DBXEF/W#S7u1z[Q\ P[˕29a/F(qMjg0&#m7ٴi5ƱSk[\X7kxn6s3h<# \dG3>7H1@zQ^fb*a Ne*cUsԆnR"3cq~a*g5^< w K,L .1-yk.rQ4(U}X E^Q-`,"Lgm0"?A.Ee!EpXgwמ⧾ğ}\=dTiT`hyLW@2fcw7v o rJip-zi=t1L`k76&moIW )>ӠDՐiu$QH%ISEǁc=2^>uG[1\1NP.S.P}GhM^7W~FFxFCE ѺWeBiC/݉BšU`[ aȭS 24 r6 k`e0,2=h&@ҏ[Bq/xUDzPu dA`K @g5v}_Ogj'Ћ,#@Rn=^ %Q^dev̬uzEMH^E/0ƭLv),O`*h:2YyZnm( dxpЮ"x0V+ˢ!E^A2ޠWf{-:2, EDvQw@ؽ}P5D;)\,B m.R6"ȖqKM^ eJy4nUƗYZfiQ\1IY&J9`9^p'fѮ{\.2Nkafo.?EnAC~Hx(7 8 dvS*;]6V+ D }}5BVUErQd=#w'9lg -qK=i`WxH q6]bfr'^4ɒo "oEqS2"xqWTrɡou&;b3$r~W2D9)mXG:]#a*[nIlXd!w_R?J'PұmXE*X&Y,""fY3-dJh*nx(oN0g .$Պz7x8Lh2-ۣ7(/, eTB-aD ELR-R%nyj  fSgY䏯~ڻ#e,CFHcYh&.v1x 5͏x{_;hKb8^f mTtRbfGxwhHǞ1  q%0a"f1 Dl >?};rn>E#0;I;IDiR-Ύj|er3Ծg~͠)nal²݈yiUbNb҄6<K6y'."( u人I 'AJY;M`A:?IW/ͿE"b)"v*) >Ax,#I&_ljT9Q?\|^Oe-< 19y4n,N |>k:Ouxcüg>2"m 0sʫct& ^ԇxD32կ(D|$;>y:3ߍsFh ")"%lyZg8؞GZxdKEY%*Q(&"ndtՕs{現F48hUNxI >O?d  ˼av"m-iB8Vca3ȃxv&޸6by], Gxh<OSˑ*r#B+uObb0ug:F_wZ"~@r $J3L_c\8CKT;HVp=I-I vbT#8RzVFtW`fD`_3嵆!uvS3nC)%e#vTLX,Tk"$S*5$T>`%gpAP6ĕxsyp9Cvw{T\Tc.,P_=KX-<͋_6 i ^+n^~ϢՍgbdtr, it&'<^+ی*Uj8aNN I #|f,A 6eхۆ͆ peQ 0~y66\ Rb &ICC83\}arqp4S_ciثo\CcfIc!{%'Iu.,_$u[0$wnRXTr(dIVV GȗPeRy!UT&;} &u\}V(A}=I,QOqrAm\#gzY%N<&`k/@;@o`k3.n剭XU\E.רx??8H,(2>o6 D#|U>)>E8tE?x,Y]煓|m7kF/1 ǎ.FB8'TS1)Y@G3ɟEb)&b3sDH_!v*+-Wf.dP.kw\1 &(#m=vΑH&UXPT%16O(X-hyD)**eE<.5)R@Fbۊ}#4}$(fL2LilnFohtt( {ۍgxаj5efi!;üqbZla歜 K*߽LN2 pk( n^:F=ISȔ)Tei&pcR"C2V3c:SKk(z? 27N'x?V._D Ւ 71:L Y!܋O!65OIK{ Z@+0 PO?# A ]@1‡p*484 `P|$ l+Z+MWO27XNpLJt`ष4G׹|92 ̟%#ec.>?{`&REɽ|{,3ɾ)D>?O`8q PQC2vP/cKh"?ϕ#wP!l Ѳ²jaj9ş*uS7RϢx) ~v Bx.x-4چYemHnj{*; 1;,m̛/!p߃rٗq @5R-s6 \_s\`md@qj!!{я^G`J,.w.G_xbr!̛qI͒My}bn׍xQn tt 4kel<~F.r}4DPApc{EeW xr65.BRy8|Q7=MMz?=Buo={e&.Dqh&Q =L1A%AcLi">Cn<4u4O@G^c&ʓE$z 6dFW ,˙e 5x3P)wg$ڤZڴ޺X=PLؼpq8@׻%7i }38(刾i>3o-sԫ2c8#T2 <$NS*/0&zp,׻@@bq fi[!fE>ϵD..;MtGשzp$( 6B5$ T'v-__ic"KghG*5Z9K*g0oEQZg_W^Ed"zŋd8Ep"6. #9J/< E& 2@V>ZiSbb`Z"zmcZḦ́v9 |7ast=J=A IDAT3:km Ne;@m5P7EC(^d;܇Ԋo zϐq;86m梐!>Mg Aߣ$GВ`uv7>lMtmW>'H̓F~ ehY[dL}xfEJI vSrOAkt*+(m j񳤏{dh~,f!+JmASF)ipR2q \1}|QT+" l$#爏a < :'A` (hG.J.C rTTi h 0*6J#vѴ`#WNR+PN`\M"F<:s X(ͣŐM؂ʆ'O׻DI^[eϹ9sSذ};g.c[ ߺg S1lM'>hBV8ƕjsnAvFim _>Q Sdobq8@Gt~#f8;wp(N}s}L>ǦO F5:Cc78i74m$%9{8Cwĩ >)p:ɇ(`i#1sqL=|Nzr3Nö  3IuLiT&jS(sh)̾)1EQ{vM ڏd4d6թ Ii D,fk;j PƶQB+Mcm `öI1_ˍI}({pOCR"r~2*&6Qzd+ Hrui}o]5.l0$<^$vam@CX}$Xl}\Wl2QpS=G&X4t2vL,y?4|ev2HV,~LvRS {H.Ż I!F2Jw=Mc'c/Nr[y JzڈB~Ճbo S/W09@0q6Di.@k{wn]媁Vk3 ,*&Q7EH$ AT /QѸl{{clUsJJAMarqx7ybK<7G\>Nbk`=܎]DLDI6*e>g"Kb_2q~+X$zJ~cZ¶Mshy~׽LQ$i>9y۩khEP,p(t0TJ\>gp3^%f²H{^CSM4#TyDf牽g t7ɟfh~o0E(LwVrSװTZOIVd^EO@2Hha,0)%zȝ4޾%Gn eJ7]bͷzkBpbWj+;bt=Fd|HQól`E{(%ZC?=#\gqn" Ο!b!R$X)͡c L6m[ = ?j4(rD?Z jkZ˚ ؄\7#ٝg7=Vxn|+ 4Jm6oZ4% Տ ?1y:IZ ;Am0[ U֡OQט8MD.dKB `qߦ1$߲7ɥ1;\MLNselV}^|;A mG9uaGװ% xL_Zgy "|j5<&h`vlNj Qap75 }70؎;ɤI^e v7i 硏RySDFd~r{+Cg ͏"̿A"۟Ve(:{06D4Fz]д :Z_b'2n/(| NBz IAڈC R#SQ%zON}(^:~<6 5H>jE#8RHW'1PĴ с.@OQcNΓL}VR?F-B uX,kLw_ޡ -ڐ`Kv sɷ9!xoA1j71 *|$OboC+3WNzn0]>/p5T7zzΆ\>Շ#_BpD9Y>q^o`m۩齟roäĦOpn1'(g)Ũ&1lV]d{N2~P7`k!="xp=J>$Q*pĵ;K8S.Adaɯa63rC(>I:JRjdlELA$=i*yD>c?h6$+^ V$Z,ȆVXD~n[꞊܈)Dyzv + p0OujHVj1EJ5G5^AL2L0ԦW9xn:qъ JzɄuC <̵h$&%j5Hc nx[F&}K Md1ס vCT/C0~uZ0[G&I>xla*W0K O8:][Lx{bv{ H-Eý8|,\$<܋l .?LQ|-k2Iy4K{Tdq@;sMdgQT3TƐ =wQ9ndM䮠'<(R\ katƴw\-HDR#[)'p6E-;Or3 1SM@={#^lST#ԗ0wRFi8Uѳ$GЭTfm!S<[x@POFnM| }4naU*G{2s-ǁ!Db [Y^g!߲}\鶴T̿Lb޽lWRLAmˍa\ TDf^%3p/.?9bWɞ`i8$ƉIWaXqꠘ ;I}\=G:>f_'}p~(+\;OSH'Haӻ2?JuRǸuWNi}08< ZS7ch1G _[4Gs7 Hj8[KTmk3%PmD[GmGm:(dOI2D/`0!zQpZyrgPLZ5sI% w9-EWnE͊Jױlxjn*zM((][Ъ:>A6ױ R6dL~ogfJ bۨ8.3gQdOy4C]b(K*ɝdo!I\@>B)1=iǢ2>E&6s/!—)ortLl.ɟP{5>ŗ.zlF~ s?sS̴uDo7SszjSK z$3m(WAYp9)pع1>f/c+,~hBf(d>I/R+0-T{ke#KEm;f/6/ü[b'&SHSJS[8)F(Mx:z|MCی}'yթ[1EbjeD mBO,ȟarnXdbeƾBvKcz(dRºm,KZI9Y+lmD80&"f N֋ʹX=GL:(S, Sp D>2(6LvD -{X4o/7y9 X Z8cr/q7P8_ uɯ\f rm6jdRL'<VL69cWEH!ZR^XY`k&s{Jw+^Oзf$BA:[طaHޅPR &ۨd(_'I,D[1l;&ѢAD j`4*˛E^rqgi~o|@7OPd"׻Pl~6<)F)]Ķ _'3/|k@aJ/>Fu (>W0 :(&@ QJT$߆H h%{^ \w1ۺe9q=cbAF * w5`+ν\Mn㈡F=^Dc列@-wMP( N8umWh 6K ުt m #ƋP? u?bG:?+m[囖m=-ղpN)㿮27{3o;e]L k&,+[@l\>ZkGrO|Lu]ח=:8ѣ86S+˿:D ]b G ԡcd6*+| 䍋<5!F 8ivS?df?&;$Zl;!?}[^WO3fc3x[qDt+d'bo'}o#(4 :"?ʷ_#L(.PN!N~DNgC P"2ksgZY4|IW"O-Fͭr!T/mI'7K6AJ4At y*XBxx43nv3́Es:zktP Il2UbEDe,vJT˴oY3c">  Vv^قŋ{ Ӵ'8V 6&wxLMgnshO2'P4&U!] _UA96؈(aR1Vp8F4::n}2V$aQԪ, v:?L6]>΍7~@*!ITƮ̃=N-#L^w|zͻ096n&g'*Z[b_9|Vme{+v3M>X (nùf{+Tx2/ 9e+ȫ^Pu?kZo.uZ٘(߶xV5*Ж@B<yZ26[_nWmˌ/Rg&ʗ@j>iAE#29wث<}!i$ ?_']>.- <(߳p/q~}㰏{G J!LgnOO2F6?H6J2C`r+7xc hfsK930.`>MpQ -@:ǹqa ضPr9fy3rqͼzؚa"K2F&Ŕ5EBnۡalB908lq6$cW)i 1q'T}mnnV}P/ cۈVF>o!ˑlbEPˢ6c݂rib@$`1cQ~I^=?VbE'<"_Uo@l3rؖ IDATbع @<=V;fz&rzW=N 5v%;8t.4>g2K4E*cRpid#`q~ ERQՙdJV̰4Fu *TSٵ4< _"yAJ4|Dssܤ [P:JxYFSZ$>JLQC la A,]H=OٷNP2aODwgGOGBlpjXa.űiRq sf'|ڇ׭1]($D[ȬV<< .Wܭ0[%4y316ȞrGl\wbIxN[r;qzj E `4n*jeC/Y)V QE)ڟ5^'iI%Ip݇m7-t_>ht lJvt k+ Tdpw IP ڀ6ҫe("\h%[<)bt7o7fC(oq qcY@nC l4ץ\#{\փb|)gM)3;|z u=ucG =*Ll*Pޡkӆ`F MM#\%""Ƀkhu D PPU\>CBːMR;ˋ#( {ݳ*i&ՆvS1P4V&r ] l~ F*e .5vMME-Ʌh'p;;;$J00s/SQOm z-jMZ&rD_Ya!w\eĕҁDOL= u5+DB .ݑCv[7}{sY;E4G~flRi#[$@fI1MH$G@HJ %@CHd !zӖzia}+ Qa_B@ZMhJ/Ku ^j)2,A)Bp8F)J(~mlYO I0CHdg@Z( }xF쀑85t 2J QԂҍ,y4"(ko0tR듳 UЫq!5"rJ}Zs9ٶwhJ/S(HE.I2Y| DIT8>^22& *)C, BB<ՆjۺPKicqra,D9 VcHx[$6rq$("yfoD x6ۑ۩?3b`%R%z(W giv:ˢo˹oUk3Xt "NshyJPZ}yiAu#xQT Zբb(;3ܮڿX56 tBx}X[ Pfl꠿cW0L5ƧA>ًl^'Wmf>()pI"bIm*.R4P4OFqCS+P+5 n]8;r# MwmTCTbm~qU6܆&\l^E3Z=BO =T&,T,G+'D#q ıL*r%ٷj&U`Y %yTn%7a$ a5;0p;iⱐ˒)q N; 4aQ@׹pmL'q)=~Ƨ?,67TGp#>;D4fБd(S͑CS#xvbv0ՙ\AF[?8>|?L;.V,[$ƻq'77ylM6K\"Ȓ-ELP;z`z?3HIu?w~-ajݨ/A0OR,7I@-SIanBQnB ]FR)EѝNZn=LX?qoaʶ7.ӷHYme+`MMd1Idv6fDp54K|w?)LbyTTD$"ifXda¡M J|`9 )Q0 B@S$D.}e3g걙)@ w/*Zl=tu"OW1i-Yeʤ_˒sݭjS6:VN}'B,׽៩)MoL&ai 9d Ռ !.ySUC"8"&BJŰNd $ VÆdD%1`rO 6p8SGI#0wP42FȔ*뜗B~q/ Df\`w'4As' CneW[2k7^>ub0>F`|3坢ZؔV^,v"R (P5bI5ȠTT^ՌKksY]3A!@)Nu ^j H7}6b/"NV}k ū(CaŵzŒL39ٌMeA2NrV2˅9\hwKS&wa5_DJT#k3ƂqMFִ5Cص deSBՊhTPQ_n#nCXV"FDH+*+CNIb{d"b ig`3Y[Q.39㷑-w5{:18X8YUf`^4BF_+Yجf`Fq|!K>4@C#HT H"(Fͧ#V-#PyGD]G0-3jM PB4k G |[h56;T3P 1!DŽ sDl[ ~ nbfn&'zCWrl&yf84 ͼ;M~XM8@)0;gj݈ t vql`!D6#C@;mpXE_I:'HLFyl{v7]>$pjp?@[k%dbqXAFWn9cgj!psܺ@aຯᴲYm>up~&&&Zd,#ɥRƱ Ӏe٘jtΧ=uGif&FsY `1񉏃H"@~\~w >Tt.4`CUbƾ2 tD\^A+bEYR(Ӵ-5_wI}yZy0[v4\9Y}U9ƯiG2e{=(-rf8GىVT5r?_(h kO?.B3&l!4(q>UK8|k)$y"pXFB+b1 eFlvvU\V A'D]ض9@-GoqɌ2S54PbhPW$.U!t~J(\4Z"wJ=;9F2'm,V+[tJM%t R t1r1$ GbG-+ȡuRPT4&2ylDRay VI!]$})I EK Xy2WQ*.?O5Tl`$H#HHVdgu[ 1 %.6ܱ%l&JTP I$8Q|nj,f{.eayaamH~[UYp3!bfOQZ ]0HiOToS1^>Yԩ?@t6nqGP`V=F7 X>(z2ɉux[ uD<~4 gm`ݴn N75nJPR.p8-[D'PhDǶr G#0sToe~ji,!h*31+><]Vz 'hxsc76L60~,606а(&T53-T>79{w(>N]ux( kRw`u`6qo ܉OGb=^?,92l 9G 2'q#s;)& 63ݴNF&LYQ(sl$Mq|L]]ւ]]3#pEQI#fc*J6zXC(籸LSZNPӊ1,^З G)r# Ȥa<;hJ*NlW^?cHFgx.&8:˃aBd3#p0I̓{xұd;L.#& !v1UFhUĕk\54柡Wp5dcHǘ~WE~jGHGI\CwmwߣE ?X"7j#eDv^^*7}DsTE5<=LMJ)2c;sT @EO"7jc^elfO-Qw0 o#nD(M@V h$0I-Cɐ;k9R=@^AñrlH4<,hw; +Q]$!)^E'1HPñ%EyAaG#9#kpGOY_Cv$)]{p% 6;v=itEÄi`dwL0z>_AYZdRp a$<{H.#Ʉ㮡\"csr!};Lu+ڄR.P#H r'M8d S`0~>4S?"4oj9)q<fG Րי_J.;<6ѷz?c)\7UHapÿYD طQöLNs%Ú?23 7 i%WThk˘B8ּXm%yT<;-PsXQ+kw3uB_@ ^2 b Z,`08zAKs!C69H*^ T%ln{=,gI?F< :ރרDi}h$HZ@pqrם92zLJJ׃(6kpv!T#ʤq7]`xBNi]x6O)Y9LRDtbo5sh> ~bl ɤ8wdeb1r14 Um0!;y"/ (GRՂ*G0ބ.нk5_ESR0=~K~ͭN\ 9LK7K ӪyTt2䣜6rëƘU(NHlm%rgAAp#QFD_oZ! rڍl.X'W%)V*"8ZTW{[|b7Ɯzn|^Dai>^FpogIL5#EGUkX\KmXTLEqd`nSk l|ۼB IDAT;@Ή"2 };FEEOckQ6&ϑ@A߄O`ǩ 0=BqkދE"tKتP+c%w'igx?-NTsf戎@18Kw0M`B-ch`ie}(9f} *U>.${-H&O؊3V!Ȏ{(DJ.:ZI{? m@@n`a~1HihۉTbъE-A$;]rG7>v#5^ Kc\gę;ʫPlA95)s#7G!)\ʉvS!װPCv g/ 8Z)Tm'o'"ȵh(%j ;K#Tr)ێez0YzJf8z̟ӟoloAA>V'wp 3'[]͝DJX'y:>!PqlN?V ZNُ2كEʣd!Ņ&Ʉۋ$1p `M1]>DkbK*jx'dm`)jT lMv&ł[/< LvN9ؽddђ|(v#̾2@,Nfbçh , N6c2 #PA!K(CaBsc jF+!G,PBEf<52K:X RbS.%7PG;H^AYF[MQD Z!wE ֋d2 ]X\(̡quӻ19E5_5숶p5/| ABShIb;%ApSddԵ1tL}x%P#j|r42Շ8˧dj cqC9a dSy-f+s4t8R"z 59ŃV!B6Af8״3)^5{CLMa0ˈ"Ħ(w%g>G/05?'aC&\O!QJN|%M,ȝ">&~W3(1 Fq9C cd+1p#Hkd=/>00>ªSx>ea|ׄ6wPb6TeB[$wm?NM`7v:.atVI ÄqW!Ny )PՀLF~@!u!P Mદe }I 24mX]"eYԤm3Q}xi$wOEep@j#Ofg|0`",E/s7 ̜C4QZ!slflf{dIN#N:E.CjEo\S?%}vHt(er9ϒ8A6;?@cc*ػ8ma=tw?j*%Nli604R>|!2nny5h`bWP3#&[q89]e()HQLC " K!^҄2K$gH^C_y[~cuذ.|wcuPA3r| Z~`ȞZiӵ8cfdF`-0jɍ-Rpط\tA*Njt|VYZ"!"5K5(z{YfznjyZ[9 q.мsUqK[La}{/ Q XfHyY>)}Y[\b<+MT@GW_cM]h*3Oo-"E릦+gkw?<@>Y9EA$v ь8w=K̓6S.t1xO ~B^ )|#kSg^KxZqHBYH%ҍx rUE0^yh'l@G :H6DuV CO9@` ~<JqD ÔRHfHN,^A60?h x\fg@6(=TyIf?QG~WŘ8C,#$Ǩ!HF9M]X/7Pi8)\=<|۠(\sGnQC&I"5 \ K[Pa;<Gj8ZSVcS11m̖ۈ9$uNNNnCUB!J ?ML&IMPW8Oqkwqe^,;p:(xK$ӃTJxL}dbxB&$'LRBy̘[e $麛LɄR̒]"ۏhCS܉PCkh87mf-srB0I!֠F8rs }=8nXR5j$zun6w,ABzˑ?$_@60ogq08o'%ɜ2Cyқ8߹P 3yC IӇ=Cs'(F K46fmLr~g_FR$V?لZ)E4y+e.\v~u({'&; ?܉ *k#HuLX9il"9J,g G WUY{Sk7̡anK?\^y/oиB̞Ev`tUvyK3>[k$rH6I.3~b,e_҅IVr6iڄl!i_OoaeLaJxlbE$E8^w;v7x8hXۙA ZvߋgO&qd\q#@)By>Y=HUPV$"B-{MoԊ|6;ϡw? NAi8f,uB{ Őt1w!M0 &СcaԏeсL-G0chb4LuP1wNsE&_gt=fsdޢ,AGI-*M޻㧶 F}쿛 g <B!I%:zOl|"Q"sG,@`/n1 Os' .K}uarwC4inBSyA6N~@;$Ж@  /zN=Gn9.G~׾لIl KB6fQ1#JXh 1d?[QNL^JKBTdN a a~gX`FBy `/1$mJXzPn| Hwo o(Є^-TA-S) xOFө(3;n` LjKɥ:dxe 9(#d_ɯzMÌV@[~^x~@"{(\ǘIrРQkfw%G,krK7 =A^^|U\xzP=CXD`yB;̓;{̗Eb1>@U4?܉J w5LX?K}N*Y0ɜı@]8X-y Wp#^0 =e/㫦Ӻ|o"7qPJ>S̿Y|w lc1yO=ױ H4`'I<,ĽMRSljƮ+ZQ xä?C'Q _`xai2X`Y?BmȅxR #ą#p7YG-Jm o'0KGQzBYD7po{ 1Ck;Y89<P2p[#J@ih¿k31JJG 8zх7 40} S-2&6l[jF*45O'B&At (lyΒXb%›z 4l$pϾ/OV^~ (`=aFG!?cmsSo&xx}lzk C(:*lB9CaQi."~}L _T&cߧ(va>=Hs'2($hf/V /#xH"tO9eT5bme ~B)}c0 kTd(컋"L]}4#}'-wREE!1hfyx <–xeې-,ĽUf)'^|S=q;pV3 ЗVRJ4@iJk3٫X"T%el0WSD6SjwKW,v*9r}P1VX=w"HWvqWCY |b%gMMTf<; -Ƀ:kjB x4daW(aefٰ_"|' M;( Vc215̓tj zr-{pTv_pɗ߉2uwWϠ յ _b,zyq6S#ِ-f|s$^Fn #4`$@AMi[-| ]&=\$wS;[bZ飐a@.b'|.'uO c2Y .KL=#A21"mMcpB{$³xH.<XZ1)%"xݺ]\1[sץkX7a"3Bɵ~Qݱq /ym"P{> @>LF9OU ֒;k::6q-9Zkx5.J8xPhjhQJf^Cn=4Ux"yQ=3۫Vޫ%ٖ{`b05`B/IH!Brr.KBI)Bo1`-ɶzZٙMrKٙ@e|70 ]U_B #p0MCo#-:$a u6 TQO`|H:F^""\YFk!фi: 28E {!_3d+ddhzIw'a?zEel%,[^c\6'ni^6Kt} Ws`+LF" ~ʒÝ6E1)?bf.&fUrhkF((L$@V!eelEj.7P'nLc؀NJ9W.F#2bm$Ԍ{&ul'#=ԃJUBo$KJ&C u܋ O=lyyn1IYl 4=?>/&0ݍTClOZEoA4F4߈_:Cᴁ>):й)QyC>0"HNr瀅7A 52\rCA)S22MP@CqU01K0š!t= IDAT,Bm=v9D}ؖb"132щ 5%y5܄GQسh k s(Y"S&!+/(<`-?b嗹G h Ycb`"EH$[]v?o#PXMBY *V¸prZh5=tI"(;p /{pV2:J̾eW[ڛȝKad` *fӸF"4Bן{3!!c:gLFn&.7*&"d3og\`9]['ErϿ`YE, z`q F n|_'L|6mo R7V*֢p#@1BJLŞA4] Dn{4?1e@k7g]^ώ-t=i3C`'Š*DWDy¿s:}T?W zdl`maQވo/jTomZ`b)];'C-DS#x$7G 0`p0Hɓch=̠!Y0lR: py ՌG! 2I`+&8<͸N}<bl?> Qٌo3']`$(*#a$Lе_ctsMpv!38u_b$Ag+jʖQRF{ {R̨)\,cp`-X̌shuނ VS]C^ozy~tjy3=D?$V&ɭ`ҳx3l!&ĆA`- 6X2)"; Y'fi:^F +{z @%:FJƛ0.v#4%:BR1IY) 7$E8jǷy7s"{gZ2|ki} k9s0)c)1rv70ϖ@S)߰7M4 L;0C,َ6vK*1i@3eÝd#e ǑAG'3EslfxR) fL%70\R)`(;-%.$?$Ҁw65ab"Ms߄k*cĔgg1Jp9d:H*KSn܀ DCtp#n W06'MO%2lY$D$7J$mh j{J(cF@ZO 4':1$Ih IHfLTbA5g:f]xJ$ȜAb|QA a o*z3 `A!mfzPCU"}6tNLzyO1tJ_flrJUhy1*3g)MGL~ rW2R*0qY墦<2*6I?G$VJc2ԍg.v7^ AY-#(3 c}Dw`dCg#֍*2ޅ"0g1CEs8  A$[~4F:}"q  113D5E%r dTM`*${:d#Y}5Lb#FfIE4A z63T-m,ux c=-\KH%QzPF!G!{@NG !\!9QU^#I 뀌.5 2Vcj #m\hɖY2?dS LXȞJ?%DHh %K~am:q.ÙG&^# ao& X/C,_DRHFDnEb%GԱv~9= XS9h ݛ+)w?' @L}O=xZ4Ta- >Ό)їGp/v懨D_1^JpP3Ykݎ9`Co\ϼ rRX4 e$㌾|6v{<"rl`CVNCml 0Z 5E)]6㝤Xrɝ¡ߑsfr0}StAəL;H%W"܌d#üoi|+:柁ʖM12@nfá,^kQ2i47QQ:6(zj~VɈQZvEٷ?BJ"mED5+FzH:wa>7ԊNblF|`ߊ Py&{^D@S+.@S$ux du%E=gΣ`*J]dѿF q|$èI*fdw0{QU4S=v&CGHD=^,e!c23 % B(̐%|a&1rt{35ht0a٨#zDa~\ADobʹ{6)tˑtt:L$„HubÖuDZP"؊VΈ(FnecRw~-bG $@"!gѭH"cI"A%dzp7 ^uWG^IpG6#cLtQ[ˁmBرW|i+ҹw #'Q5<4Jǟ $r3c׽_ P\E{U3˯~4)s}+RvZۂ>Zf_sD GgDoBI)d= g9t(9jHZ#]RFBUȚ$"\u4L]x%N!5i3Ȉҫێ܊keZ)Pt9l^'9G0"Yb@tM1NZ=:>T zP` LS))( Rjޙ@#"ޅ>eUd=`%4 %řGN$g3EE݄3L @p2Z-GIi=f tCJu=A£d2s ĔIKg5~b>| Ũ]Fi5/S~o;  ]>f:P1|BjwAl_ȶ#;jRUkߡllFo'Ij.J!$)8P9T,!.#'Bsi}Q%q;%+)bxK|.EE B=8ɬ]5[Fv9[̔&5SQՄQ` BDڵL "Eo[5= AP1܄eNVPz! R&dGE@A6ɛ кb2y <w}O ^I%83$X=H>ێB12% t~7]4ɐNiQl &"a#Ĺ?"/C4C~-xK$ЅJέ.c4|>v3{ %vhta5;c.rbt"xٻkI< s##[2YUH,@p޳O{60Gg`ƝOI9u 0>D~{IS46H!x( >Ed'e6u.}8*QνF: (? ȭis9.R `:1nmrocE|Y=d5c;x=|b}9!z;! zIx "QЕ :$"MjT"B4grAJGf՘fSU wL̾$QO;| L; UcxwL.Ys޹m 픮x)>{6UPE;\NBʋfG}5!w*b~io7Aa)ZFp_#AG~Cjiдu ){eg mǵ3QDi>\0Tal@JCۏ"f^B$dFW~ly[Z>W؁5W.xCbpFh{G6 Py>I 9%yz]!(} `'cXR6 TO'ϤI a(ĖI?{9wj/I5o]ueW_?w'^쌳׬Yo4鎧HS9`Dlܛ,67$ RqPA3w~+?d7<60[)/~z_ kYY~үҟmɮɡX湷;G|ԯ@=^KkM̷oJ<$?޵8ʜ"N+CFԊe͛;Ccca-oro(Reg}+g:cM|㛫]O͋\'Y+ XdJNr `jǕFld Xg]U7|WuWc?~|Ys}ky䱇:)i%IYqѬNxwiyE@ԣé޸Zwۦ̺2xZǺ'nYb^s]xr]Ӈl-E?x77-~כ|' =yGYzhr\Ml _m)IDAT[2sN1ea}*7~S74PQCṷ\kwm9?n?Rbo<:e!iJ2~V>=2TL9ᔿ ދ䑗~𥷒yїR=( kMzYcۜ+?=ӭYd]ý]_ @h v_-o\8+j|`˺oܪ_7hاNSdx0!Y$Z r$=>_.-?RjChîxu,-{F{ϜkQ㈼})S/z7GNޭCS%I5ٕwAE"֝V$iDxwFi'Չf);&}aPtgk&80>;9 ۺq8 ӧ2UX'YIB2,[꯻fq4]9&QYGC~*ⳟ_?/NOj>"`p~,"GEM-WVxO 7IgZ]&oAdS'jʤG\u:W_UR\|xS}e@Yy~_u٥k * 'X]NoQA\f| n8XiSk.X@/XN> -z0chڑpPoAAM_Q^#C.UUORooP (&?NdZ0o$ x2|,Zٗ;D^Xy8ywa_NVUU6:G[4<2< xي(Tt:]Nn^kAx?9)eoQRc(CrRU]׾$Ð$)#f+UUp8~y~Q/Ch^=w UQwSU%uڍS(=^oVǕ2GzQ8'e"['>8F8OX 1IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/wf_bsr_id.png0000664000175000017500000000640413203343610022650 0ustar jomajomaPNG  IHDR &QlYsBITOtEXtSoftwaregnome-screenshot> IDATxypUǿNCHH @Bw],,#KV#Ҷ\-)H*M&Sxx;h[|'˶X+sa-"RI)Jycbl%,_I]bqUqq8Min sl0ʢc&Qt:,_+N.;5c"cK3) gzɠGDȉ%M:)9,_%c+%"e-5**+[wjUZ[DFjnީR.+gܞf*|'\*J9! D :M?"2szAC&.:$Cfr۬Ջjˀ3pIeI+_?g9Nf.xc{=.M` R&fo59xKAD$#@ve~fR :mDPb;0ZSz|hs3*n!V|qȇ-!/o+@L=q#ӣL7&* "uI+Hh))yW ϖ;S"G~rOp̅:ڣA5DcbUcۺ:Ŋӧ/ILyYrEpI7 ҉~¬_\Xyή]l;$$YuDvB۸.؂{WPs I[&AVcEAk{5\E*|ʼnorWUQ_}b+lRS?;j{DIuۄ x0l֫À]i L2. N3E\0oF臗5&ߧmO_kg<>VcN4Ih&Aɉʽ &UWV.e]}{zw3.u h?lG⯞L\)AiRCM$Es>[}oȯ|>'Ds\9Iɣ@kjG;WpV> l)N+H@9.z>:stћ R᎓-\$ o_>%{ߔ1;o"7 ]-ozfL*[9#g37$^wkeu::{qҕwS֦YVdLy驻Kg3ntv鯯s3 {-oj}_ ?q"],x_Gٰpޮmէ:غ}n W Wyz95J{ޜu:΍wǮ_Sдyr{B^ x<(͒^[>XWܲ-{zg,ة=?_ձdcϞ_:L277Y RkRlbEZ 0r]zU4I ..;½.3[+=.9"c-,:9wpww+ nO( 9"JJ`DwmX<ʙQ˫ށKH)@)/v:˪^^k =,]mщS6V2PM; pw eT6h-K*wYKD\~^|) ?,Ч:W HhS}qs&p" xb35Rc!n0'. ]}ňAELiFU{]ߵ탇KD 9g8ξXS1&HSA\G`0nˌBߺ=܁4tuԷk~r ׈\8L1)Hi[|~'9&%4R̠ѩFvSwCi6Us-T49/eIljȽL,_+N"G:]V=L 3iO|ɽg >q18%I$ˋpQ優oUjOz}u= "G8@1WLъ5@ wz=M)Gl[#  `JlkUǏFK+I#"@L`$r_Jk8x-K9ޮRZ܋x{,c`L'=M .{SR{EXCԣ.MsκZNPyޘ]A#WߚI{^uTwARoEn*?}d<{uuz^1 &n2F1j휘X}ohT hq-N44;ܷeEUUE~EJаmF3?1yG҄IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/wftextpopup.png0000664000175000017500000005327313203343610023325 0ustar jomajomaPNG  IHDREx=sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|T%DBnAR`"Wџ{kAދ"^DE (=@BIvݙ̦@X$;@{fΙ2\}UBQ䴐 0[7L%tݲd̵Wzbn`v9e Yq=ٙR.L9.S햽b8eY)5y˜lISIWz"e-j~eJ ]F?IʟX$[Cޕn鲔^7tIv?+w%YY,x?Duo+y rП@h8.zJnF!`TժşR !ytxAQwA2Qw!]N LtSSaRJ?u )x44MCUUL&Ōj-U.DG,S&}x領TKp`-wnfn䊚dKw`< Dzp lRΗ$ШZ,1{<?AtrۏHMQPt( ͆l:xN0đ8-PO t,T/?ݧ֤ng+.3&԰;c5OL]ʑ(kqt{ݴ/YbxwuԢeO+xOz?'BDXMYaVԍk>м9$TkE51/#k*f>8 dFu&(Ppjzjlְ/Ɛӧ:}GvPAwIb%3:<7IwʜQ8Q// t/'t>&UG:B }=GD)La+5dG+]u g~,fʠXe)Oz>'BD!ɢʵ)8t.hVV2 X*^c<炂$&&Á@ۍhf5k$`?ͤάqx!|}"]v_h+^_,5ɎיOˋf'6Z}*@P#Ƅk\f* .>|өjcWjѱC7SoT+'"(&ÁZfBvhb9u#t U)t:,X$ĘQ4SmR^~QBj 3}/ow'Ǣɒnwo !Lna7\Nhp/qzKiXÁc?b[YD[[Gٌ̟x|WS^eQ:\l[:M6:O}]v`VlAe[W3anԤSqk_Ћ?+yNh FqzW.I1S'/yV]Mױu睴mقGUk͠I2/Ҹ_[_odLu?V?,G9χ%AL{狂 &ڎP+[{ $\w/Cx_R9a%xtAz8\z$0[Z,|ް`=[]B:&[nbqmZW I\ 9yNX+dY_h(& -Yլ5`<3̜ԙ$Y8_U:ݬZݘ1أL'-GN5tYr?IUQ*(J#J`:f??},ސpY8_ϿK+2 6J[e1י1 ZXeQLT_zR )@xqm!Ģ4bsرY@t݊IQH/jh ]R#):ϋˮh&{aެoqqPY蜘I{(,tiǏ<͝[`]îlCKNJWTsTExX,|>^[ydnm6;i[x} >0lKOPH|6{A7ҽGKb?aV}x#;6qdn;fE'gUE,慏6ś -LAܧ,ǩ:)AlOf&(1_w9',g(|^|/9~Ea;"Nj *fWQ?_QQ,3&yH۲hIKοy߻jᰅQL&87}Nz Q5i@s]K^(*;xqq]׉,L ^8۳et]cWEU+3|v8TV?⏖ɧNՊ$&&vpĉGE?ĺM385/WЪ/0tx}l7\f(\"&bTMv=^z61%o. kїq>rX.䣧籵Dϟ()7?N[C+Y,eM֜NRjm>!c]m:qv355㙠kNjPHC/,@52~|>(90 "11&MRf-TE?ٵw9әt\]5m-~XWЃЇ(EAXP]QPXb%Qrnn_ deŌ+M!&c˛^r8]^| g=.>kGgZe]@~!XD<^oe.q~|>jjbaO1((*IbUFx:l BO˿nBBB ܧ^J!.Sow!>HBQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $|+lIx6!EMWurqv$Y! $@BQ! $@BQ! .PW^9B\"^ٳg3h zm_|m8qy9ÇW^ <ŋGdBSX[oc^~eׯ#r[zɓ's嗓~UWDBѣ|,\$իs=ݻiܸ1?0?ছnbڵgy ԩS~|M>:v@BB __\:wĉ>`ɒ%Ę1cԩ b̙$''#DyΝ$&&SҳgO/__ϴiMoժƯ7_70m4Ȋ+5jTm:N8@KbL6-s`qXc2m4233֭?#iiitOPu2mժU<;v0p@ϡCdۗxׯ=dffҿEnݺe@UKBZZ)))4k UU2dH$۷oO˖-޽;k֬sg|^brr2"+++8rU橪;$&&^d2:ڵرc۷ 6H( qH(֭[={2}t> FԫW,_$j֬I.]Xb9998qO?]@ Nps[nE4N'{m۶l۶~ MXd ]v wt]gϞ=lٲmk3f̠uF!.0k}~ᇙ;w.#GAxyg;w. 4[nٳ{Э[:/ .u֥ٯ_?t]'$++hϨQ#ծ]K!* g!8W$@BQ! ".'2j(>?jΰaȈ.✈H(Yf͚1k,.]i,[ۇ !]DZ- . ׋i\./^̛oܔ)SرcnVZa6IKKj2m4ڶm!D"RS֭;ѣGxbRSSx<,[<5j9r$gώDQD$- SNetڕUVѧO}QƍGZZZNUvn߾9V!N%❷,X-ªUԩW^y%=s YbvZxHE ڱLrrrFfV=a+"x!6lرc7o6 Faaa$w#Donl[`wq.nw4l6"gl63`Mƒ%K!N-lv;M5GKQE N;D+;qA񱕜nghve2fڧߋm!ηSۯҪ 6{q %iUA NAPֹp}5O!*BwH B@-@ӴsSsDӴc:ٱP}~8p }e?p7\v۶my着3ݛ3h LŸY~vŨQ1b7n ##ÇBk:ԂB^^zZ|nno!Cr3y~'wn7:Ͻ#Fu۶RxsMxWB|9Lx奨fh<ZѹDQ<_>7_w}KLL ǎcԩ+zn7n̬Yz̛7z,^{w$^y:tY{*#=ÐE_K֠**`0iղ%_}pڵkYhwy':ueJJؿ냮{n7]'??_zR>#BQ5EC4 絡%//JTT\ܓe˖T^3bĈ b6ӧO.\|ᇤ3cƌ2Ӊjc>L=K/ڵkQUI&qWD08'BPx_M'ڙ(#F0qDٸq#/RL4LƎGVV4lԈVZq7k2)>==z|rNL~Y=#1.]VXXȪUHNNFQ:wLÆ C;xgx<?7|1cƄ,uXt)3₣[ʕNhhыW$qqz̚5 &pC<̟ܳ?dw1cN6ٵkWx"%;q(St8|8?S$Qs&C/Zkyx),dsDGEq]w`a II8"rOg^۷oL@tt4?^9r$~;[n%==t:wwa̙yL<̔)Sࡇ **|0(9.7u\ v /9A![`׶+WR')-|iӆڵkrg'޾}hؠ>{ܸT@6w`: yy<}2JةFsMxdfǶt.W/J( Q4JnukuZBڬWFS(yܡ+Ų[dBȹ IDATqѡc29 E!*5=_wkq9H GT4C.aoCBQJe)4,|# -Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (pVv헑.BT mu8BJA.@BQ! $@BQ! $[m<"8*)^խg!ECVnr,Ba (Ba (BaP,,,Gl޼9dzϞ=ɩv&LܹsCy^իرcFO> 4K>|8zb,^ Jq1 bY^/?8gϦf͚am#++>C ʕ+?8~8>,7t7tyyyn:z-&O_NNNNp!^>6'|MJ[~=Æ c̘1Yjcǎq5i .';;;wt:9p۷!.BohyYt){ NKKK#%%f͚*C Y/77ARRmڴ᫯⣏>[o%66\zŢEhҤ &M>@un$83Ox~^x@hL~~>QQQ|̞=.rG!@չۘ>}: , **D#}8BYZٓ(<m۶e۶mohƒ%Kڵk:N@-hРCnMp:΁BQ^{5n݊i8N{6OQExÇPV-&O̴iͥcǎ92dv{̙3jEiԯ_SЯ_?t]'$++hϨQ! ! e7 [6aBo~))VR?ThB# E!0PB E!0PBbĉ5>1l0222" !8'"k֬Yf̚5Ki˖-}ԫW/Bs""- . ׋i\./^̛oܔ)SرcnVZa6IKKj2m4ڶm!D"RS֭;ѣGxbRSSIHHYgٲeѨQ#/_ȑ#={v$"g$"hX:u*gϦk׮Z>}裏2n8Bwk@9x`$"g$>/X[nUVѩS'J{1̙bv`Zz.cY 3SzBC F4:Ć ;v,fa(,,nٍyl6W߷Ұqx#G4gϞwߍlfL6%Kp=Dr7BTiG`iڬ9_Mx(JpZE.P t(9B[%_!UlP2 ˚Vde wA۷nYNk2JPa;$ZS .dɎYdVx%ðedR ,(D%딾{@(08Ge<'JZY8ސVg= E!*@mdCjGe4{#9qp۶mxN`p)S&Xb#ל4Z׋(EI( Qk_*u)b>a6߷O_rI,вe+Zlð;߫W*zWE3c )!(7%G"BZ8ke>D]bQ8)(*UBhMQ؟dB>RֵeM+:NY!t ]W(DUo .󌁈a:Tb@4J.麿xH0.9BTVܢ{T_RXMQQ86UQQ(:nUų"ZZ6RS^=6o]k LFUTA5k}:QrN4g5ؖ%ꅵ_ E!*FMXn-?|TKHB֨r %;yXcc+μ<:t־$d, _w߭t"]0QQoА E!*日]4!BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BY۵_FBQ)v(ilC!*|B E!0PB E!0PBn}ޒlC⨼xU. [BH( !BH( !B\0yf>] !DV< BU[Z5 Fjjj$6={عsgĶ'eH(1LlٲqѱcGW]!9qV.}>?.]7h 222g 6K?)!Cп>+h(zx㍌?!Cŵ^ˏ?1ԫWs璜ҥKSO=#G0sLf̘e˸꫃NB+"-d2q!&L^J׮]ysOgv)((nmҬY3ɩкBb@ݺui۶-vꫯ檫⫯bݺu 8_bO}裏2n8Bwk@9x`$"g$❷,X-ªUԩW^y%=s YbvZ厈#XV&999gLf3T(+x!6lرc7o6 Faaa$w#Donl[`8v^Kam#8{lnf3 `ڴi,YDF4d=ni|)E N3ο t.}=~^aKFw$v헴iס )`3$o Yִ ~' (\ ؾu ͚_vZ\٧DMa;$ZS iڹ)9iZ1XKNa;QrG3^I0,벹*cY5E _Y8z118v~' WfVh@UTtU{BT1Bq0}_V(3(hyʕIJ"E |>mڴvZ\} o>6hc}$'7nc?t|ԭSL8:i<;}QU ЋP1uߵpYX>mo7ÓYeVl ]aw2g:u@H3RC@QoJ@/&) QE?l--z>L t=,E@xJHhakBT 5Etc J~Z׊/58Ǭ fh"5E!CDfXt9g D UǦQzpYMQ%x JQJ! N~nnѽDn@  )?U(c (BxXn) Q\R7LWz5@('PUTA5k}:QrN4g5ؖ%ꅵ_ E!*FMXn-?|TKHB֨r %;yXcc+μ<:t־$d, _w߭t"]0QQoА E!*日]4!BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !NIu4MC]NBQqJ>ǟx|4M;9/#]!D%xx饗zjjլSv(ilCQj} OZ*akrWp8xr((d֬YW_M#+U*%hѢ_~%^{-v#GSeQBQQa^D۶mYj6>E9Ef3;wO?_~mvBtt[6rqQP{qx^f3f?:j.]mM7uAcX5ūt9h\|}>_:zb…qج6sAcո3*8'^oڨ_~̙3z/ @ E!Dj-«ʸXv-n FihBTXxJ۶mٽ{wpŘaчءC2BqaVq^'feerw3rHzMFE\|&Մjaf.$Vi <Ǐ3p@FOmrOQQa 8))\ڬ6qƱ%Nll,qqq8 )#55={rגJjj*dff2m4C޽yGYʕ 6뮻!Cx2yfnN82}vm;v=C \G}4~ǎ?TO<_~ᇐurrr;1BT1z+;v/ > 999<o%mfn.H([^sײzjV^L0>C>c.RƍGnn.9s0i$>sx >cRt|>q ѣ<ٓO>>G4QuލѣFҶ][]s [_'66vq.8p/+L&Ǐ'..hFAݺuYb ,`رme]C=_jlZVX`դE, ,{tMvv;-[ Q}1CV^QQQLzAfΜI޽ٶmuֹ`;mՆ;wҺuR'm۶s!ڶm2M6y NɡaÆdzrJ ŋyGزe Ǐ?=_~[oSLd2qBT]V>L&SȽ.]0glkn8+(Tsnn.u֥w<$''M͉%772 #~>}:]t k"{B\TU c ̀믿͛|/̜9#F9Nl6(&&&XaXh߾=sv'|B׮]6l+WdժUzٹs< B Y|6L6IDAT 6d̙vߟ5kBs!"شiSQFpzzzz60x`ƌټysp8HMMe޼y(œ9sBgbs,+|/\p]!0hB0\!Nww$ݝStvqD)N(EF>1-#n,X:N ˅~gAvvv{- {1<2~3}vTUU1)\ϰIӴ{ծ(m UgfqH1Ε.]Ӣ_oc%gܹƤIuڲsa8fՄ k ԻAX jv{B̛7}]cr] d"[k'ئ58>6nwl?(7СfϞٳg74$`j2 lnK1\MQ}M)F)b5"H#I)NdRj2h26.řp0Fe&EƬGP;j?Es2kIB$3KuFt@q4߱&Ÿ 8N̟?<}]]sx>}: bH! ZP$e˗qɸd=IpXx1}5f͞j @eUϘ,CӧC((,\ ^kPya 8#5J4sy׮]߿?f͚{&M͛1l03 b 7k̶>&,/ -{=??M 6 '':y途())A޽޳zo$*++1c :~łC ƤHdz15C)>DrAt1a?{)7. Ng5ڷo!v؁#GSBBxGAdHK\J lt2n:s=O1c੧›o𾤤$\V  4%Xn "|]Z۶oǯw#+ ^C AZZWl߾ݭϝ8qz[L^Mynw9Z␡DD-DD &E"""IHHD`R$"R0))LDD &E"""IHHD`R$"R0))b,応Å x(FBb"RRRzUgX,ƒ%v\¶CԫХKcM:&v0 i5\j9qcq51)F)_{т޽p:9so'8-BMM ty!-- +VѣGt:G};w|Gرcn7LΝ;!m݆oY,j*ʣS4? IIIkbA H߿ WF׮]qwqcGɏ}QQa[󢝎?l)RR:WV7^ǰaði&H)PZ/^e=z?R ۷;w^coė_~Z/زe Ξ= Ee7Fu8VO?:t۶m֭[}JJ ub !!iiiشisuKuzkcRs0k/| Fizz:m;۷/rsso>%1ʇDˠH!8qe9r;y`BTKVcƱ.M88,['ڕ=z:uĨQqpƉ5%3z!I H1Grc[Py8QZ ˅76;u)r صsWT@ jg5s.\).?)P]] OMMշ/v0033?g@xt".^Vko3{q|qMkcM1JҨ)/Ipܰb`'[0gݺs;oM`Zquyz!^9#FXx1\.7&N.>uxi\.?: ++ yyobG,cMUc4wB(AZ>/Q"PZ>oncdNx#232ƾ}jg5*x^>1&m8SxLU޲iEOsnxKN~jIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/tab_h.png0000664000175000017500000000026113203343735022002 0ustar jomajomaPNG  IHDR$[xIDATxM@~ΒEv"!d*rGq={SݧH uO^[_Xvyұ=VCff{R%_rug(?gh\i>|sIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/tab_s.png0000664000175000017500000000027013203343735022015 0ustar jomajomaPNG  IHDR$[IDATx݁ @@ѣ?Q"%If6[HQ<]dr s?O=w'F -~rÍ[芭m֬ݯнF)Y% `n,9B!ь\<#IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/nav_h.png0000664000175000017500000000014213203343735022016 0ustar jomajomaPNG  IHDR ,@)IDATxA @BQۛТ) ) aܿoRlIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/nav_f.png0000664000175000017500000000023113203343735022013 0ustar jomajomaPNG  IHDR8`IDATxK Eі[BmkHprӼ.ꎤR6Z VIE5jliIJ0/u޿6sH yIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/bc_s.png0000664000175000017500000000124413203343735021635 0ustar jomajomaPNG  IHDR_ kIDATxkQϝ̤I&m&156*nąܸR,4 +H(Ub1J.(EmߏhJmKS'C(х & r3g(z&_9}՟@mu ` h`ԯ &~M4%3?h)\Yi>Jb @giވkg\轭EUv+?E"pB\Y&$vM+Dn)}:Xo 3گ'.f0u9Ljf6%3Gf#sm(,k*ʒJJˢou_~ r]%%mnu]zr5[ưXeImuľe5{Jկ(bl}`UyacCAklysA7oJ .Be. Z'-PyF.lp&.j7rez19HG%qz׈c_k_")HJn~֘5 q5#+9T Rܸrzϴ̝ =υ{áOfwg|/$;֙ƭ]W"/< DఽB}yIEc^=[VhM$l];Kr¦* t$]M;I1!M (f<5~z mՠ>کIz;u[ie^ӳNF6B\}7+,'a -yHY,^f~?Hc{Z+4\sٷnߣFơsغD?<vkx0MlذIxdEEAMg*YE7ۙ^[uv[wG=Edn׶l'pGk+C82 dz3H BS[wŘ ~xptmţiQ歉AB1fى4uI]6% 1t.NJphz̠R1"3-"&1[:N mW0_œ 6&)ꦬ}~{m]zMP~^:eQT_*798ˍ 347E¿uSɻU_ NWeNӏ|;;d"ȉ޵ᆴ"ĴMM+bY_E]PXKНIޥoE<_(EP|m,өZߺk,kM`jzeU t36˷r}w:Χ |TܵQK_pໃYd0!a –W$$/\$ 2mLH dHV,:RZJaz*>_NT(‚^SVFU8E܈nd;8\C]=m:bDd=ߞUU5O|]Pv\]2"y[yzg{Y{Ù5;w{N3nĨwKݭ29Id y)P8ũ@mPwjl,6 hWd ump.DžtwR xBδYcxg*vo y򑕓[?V0NO난~󒯷h#Hk8kӍ^q@]ӓ,56-κUn[>]@nϜp[6# 4tn:}8T9_Y$/GK(ђM`dѺ;OB &P{qhJ+閧l2M_1ӫtlya L^y.۽[ u/]iS}N>e1qjf&iT\=kϛX-.84V5u!TE .OH4zwTr. xքHHg hT$yqzp< qrwI]I鲘s":ՖbզL69VW<;3?M3AV#ޯKUr9!qtH+6V/TS^pqgLP'5E ޺ n"2|;W"֬TwtO' +W+Z̖<&nO,I06.Z.h*INڒOegBXZ9hDSʍ A/c`A"z|ş;H#|%OOD mcƤqmu&~n πZj =_n[nN$_bE)8?6l}#bW( d-p&a"9ņ$ڛA!;{~8ޣ10`#kuN Qbh 8Mawhq(bK Z%m֍(J)@> 7% {y ohf>{p.­_%glZ\B2B #Һphݚ[<#SpA7Ht4:|gtL*($Ʃ$;b`=MM5ǾHH.HeA5}rd)T};Q5i2O00;,냔}g]79_{C>h{.II?[Kswz6u;OJa˶zvd l舊yc'rTWӰL |ʽhB T'ò]K(=Kx  L,Pʵu׈ž1ݫ;pGDxZY kf676oھH~޸ 8Up6(? K+?%ݷ/19U?B)l @=ޞkIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/closed.png0000664000175000017500000000020413203343735022173 0ustar jomajomaPNG  IHDR KIDATxm @!Gk7-`&sts@k}2 P%_N .:0Dk›x" ֛)x5IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/open.png0000664000175000017500000000017313203343735021670 0ustar jomajomaPNG  IHDR BIDATx 0 ׬ՙ\39b!9{|I>$#ߴ8/z/>2[giU,/~\ 9ٸIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/bdwn.png0000664000175000017500000000022313203343735021655 0ustar jomajomaPNG  IHDR5ZIDATx DP1lm rj.e D[ɾ|6V3?Ls'(}>+ Kch` ^ލnIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/sync_on.png0000664000175000017500000000151513203343735022400 0ustar jomajomaPNG  IHDRw=IDATx_HTY8i4-g6&kQ)!0URKڅ/PE>K-+K.YdEPaAZSܝ;3wgfsWK.Da'q_k DQCg 0Y:qZ)~L0HV z-C%g68%wUϿ }? ?3 K@h aaUe s~2&&B*Alji*˨,oƣT,d[3-*> LɟfkҠw#*AEjKUy>&{8m5Ki jjD*Nigw7DmzK۾M!k?o_lX#~XӑR*EՂדE;6e"Q(=Ezæ5Kؼָ_ 1zBJ X96jL^7{J1i@%8'7M_\Q#Uy Wo x8sv|Sn q_m >b[JX,4[T{Ratjjzz'ȶiIws KC^Y%6ꈺ]vhiWvh'̂|[^YrD=ѝlU_?]Y(N8f1qn-etm 0}b%׌=0?1s08;_ W|%\Zð >舽lnp.a{ )t; b n652?>Oдunm`׭ZWjC~>־0+ {{fMŕټ` ݛ%uA6,]kWu]7ihu1 l Ҷ̺:\cxhRQt$ fd<4B[fd7=.M9//O a},j?.5ښm?X2#d p(?c!a1ޗةܾ7dK:)3],H+ku<|`LhC7e םt H$^2%l.aeÉ|s }D^hz~Rá]|#@חև[k<|(*ݹdtM:,]' X_n| /cfOIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/nav_g.png0000664000175000017500000000013713203343735022021 0ustar jomajomaPNG  IHDR1&IDATx1 OHf_ ->~M iMS<IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/qsstv.css0000664000175000017500000003007413203343735022116 0ustar jomajoma/* The standard CSS for doxygen */ body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; } /* @group Heading Levels */ h1 { font-size: 150%; } .title { font-size: 150%; font-weight: bold; margin: 10px 2px; } h2 { font-size: 120%; } h3 { font-size: 100%; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; padding: 2px; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code { color: #4665A2; } a.codeRef { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 10px; margin-right: 5px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #C4CFE5; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; } .memname { white-space: nowrap; font-weight: bold; margin-left: 6px; } .memproto { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 8px; border-top-left-radius: 8px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 8px; -moz-border-radius-topleft: 8px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 8px; -webkit-border-top-left-radius: 8px; background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; } .memdoc { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 2px 5px; background-color: #FBFCFD; border-top-width: 0; /* opera specific markup */ border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); /* webkit specific markup */ -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .params, .retval, .exception, .tparams { border-spacing: 6px 2px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0px; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; margin: 5px; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ div.dynheader { margin-top: 8px; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; text-align:left; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { font-size: 8pt; padding-left: 5px; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } dl { padding: 0 0 0 10px; } dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug { border-left:4px solid; padding: 0 0 0 6px; } dl.note { border-color: #D0C000; } dl.warning, dl.attention { border-color: #FF0000; } dl.pre, dl.post, dl.invariant { border-color: #00D000; } dl.deprecated { border-color: #505050; } dl.todo { border-color: #00C0E0; } dl.test { border-color: #3030E0; } dl.bug { border-color: #C08050; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: left; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } qsstv_9.2.6/qsstv/documentation/manual/manual/whatsnew.html0000664000175000017500000000663413203343735022757 0ustar jomajoma QSSTV: What's New

What's New

QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x

  • Build on top QT 5.x ( and also compatible with Qt 4.8)
  • Better synchronization in SSTV mode
  • New SSTV narrow band modes (MP73-N,MP110-N,MP140-N,MC110-N,MC140-N,MC180-N)
  • Changed GUI layout
  • Gallery window now shows all the rx/tx images.
  • RX and TX images for SSTV and DRM now in separate gallery tab.
  • TX Stock Images for fast selecting preferred TX Images.
  • SSTV Images only saved after a configurable percentage completed
  • Setting and reading frequency via CAT interface
  • Preferred fast frequency selection for SSTV and DRM
  • Editor/templates: multi-line inputs for x,y and z
  • Pulse audio direct interface
qsstv_9.2.6/qsstv/documentation/manual/manual/changelog.html0000664000175000017500000001740613203343735023045 0ustar jomajoma QSSTV: Change log
Change log
  • 20170817 QSSTV 9.2.6
    • Changed the .pro file for autodetecing correct libopenjpg2 (DL1JBE -Tom)
    • ftp transfer - initialize bug fix (VK6MN- Mike)
    • Help manual -> path correction and corrected some typo's (DJ0MBA- Marinus)
    • SSTV initialize bug fix (Adrian)
    • Camera support for Raspberry PI Cam
    • fixed audio loopback use
    • fixed transmission after stop, image was not restarted at top
  • 20161022 QSSTV 9.2.5
    • Screen size reduced for use with smaller screens-fixed.
    • rig control - added capabilities test.
  • 20161022 QSSTV 9.2.4
    • some minor bugfixing
    • eliminated online status setting in Config Notication tab (doubled with setting in Operator settings)
    • bug fix: incremental counter on filename wih hybrid mode
    • added filename to statusbar when sending DRM image
  • 20161021 QSSTV 9.2.3
    • bug fix: memory leak in tx DRM when loading/resizing images
    • faster compression of tx images
    • bug-fix: hybrid mode saved images with wrong file extension. Receivers tried downloading wrong file.
    • Added all the patches (more then 20) from Mike, VK6M: rx/tx notifications and a large number of patches for image handling
    • Added new features (such a save waterfall image) implmented by Mike, VK6M
    • Todo: update the documentation !
  • 20160929 QSSTV 9.2.2
    • added CTRL_F keyboard shortcut to switch to and from full screen. This is mainly used on low resolution screens where the top and/or bottom taskbars are masking part of the QSSTV window.
  • 20160929 QSSTV 9.2.1
    • added low Resolution mode
    • changed SSTV sync detection
    • some minor bug fixes
  • 20160703 QSSTV 9.1.8
    • The program uses jp2 files for sending images in DRM mode. The file extensions were not correct. ->fixed
    • changes of the configuration do not need a restart of the program anymore (adding templates, stock images, DRM Profiles)
    • images in the gallery are now resized.
    • added menu option To Tx in Gallery Images RX and TX.
    • image in viewer is zoomed when resized while keeping aspect ratio.
    • Screen size reduced to 791x684 for use with smaller screens.
    • Added voice/data port selection for PTT (thanks to David VK3DCU)
  • 20160701 QSSTV 9.1.7
    • Normally the audio is generated on the left channel. There is now an option in the soundconfig to swap left and right channel. Some radios like the TS590 are using the right audio channel via USB (test done by PE1DFQ - Gerard).
    • On request from Michael DL3YAP: Added CW ID button to manually send the CW ID as specified in the CW config.
    • Name of ID button in the lower status bar changed to WF ID (waterfall ID) to avoid confusion with CW ID.
    • Fixed bug: Waterfall font size was not correctly saved.
    • Added "Bold" option for Waterfall font.
  • 20160628 QSSTV 9.1.6
    • ftp transfer crashes when transmitting in hybrid mode-> solved
  • 20160416 QSSTV 9.1.5
    • upload received images to ftp server (sstv and drm) gave file error -> solved
  • 20160415 QSSTV 9.1.4
    • rx image save button was not working -> fixed
  • 20160410 QSSTV 9.1.3
    • fixing compiler error: missing function cleanupcache in release mode
  • 20160409 QSSTV 9.1.2
    • implementation of image cache for faster image display in the gallery
    • bug fix ,race condition for RxNotification
  • 20160408 QSSTV 9.1.1
    • replaced jpeg2000 library Jasper with openjpeg because some distros won't support Jasper anymore. Jasper has not been maintained for more than 10 years.
  • 20151130 QSSTV 9.0.9
    • directories are auto-created if they don't exist
    • additional CAT command now also works with rigctld
  • 20150930 QSSTV 9.0.8
    • fix DRM status update
  • 20150929 QSSTV 9.0.7
    • fixed hang on exit
  • 20150928 QSSTV 9.0.6
    • performace optimization (especially for Raspberry Pi 2)
  • 20150926 QSSTV 9.0.4
    • added option for slow cpu (see Options ->GUI) This makes it possible to run QSSTV running on a Raspberry Pi 2.
    • minor change to ALSA sound interface.
    • some more bug fixing
  • 20150910 QSSTV 9.0.3
    • xmlrpc bug fix (persistent connections)
    • manual (a lot of) spelling corrections
    • compatibility with Qt 4.8
  • 20150907 QSSTV 9.0.2
    • changed configuration frequencies to allow for data modes on Icom
    • changed Editor, you may need to check/re-edit your template files (text offsets may have changed)
  • 20150831 QSSTV 9.0.1
    • first release
qsstv_9.2.6/qsstv/documentation/manual/manual/installation.html0000664000175000017500000001362213203343735023613 0ustar jomajoma QSSTV: Installation
Installation

Warning: from version 9.1.1 and higher, Jasper library is dropped and openjpeg is used We need openjpeg2 (e.g. libopenjpeg2.1 or higher) and not libopenjpeg 1.5

Step 1: Prerequisites

Before you can compile QSSTV make sure that you have installed the following software

  • g++
  • libfftw3-dev
  • qt5-default (qt4-default)
  • hamlib-dev
  • libasound2-dev
  • libpulse-dev
  • libopenjp2-7
  • libopenjp2-7-dev
  • libv4l-dev

QSSTV is compatible with Qt 4.8.6 but mostly tested on Qt 5.4.x or higher

On Ubuntu, Debian or Mint you can type:

sudo apt-get install g++ libfftw3-dev qt5-default libpulse-dev
sudo apt-get install hamlib-dev libasound-dev  libv4l-dev
sudo apt-get install libopenjp2-7 libopenjp2-7-dev

If you don't find libopenjp2-7 you can download it with the follwing commands if you're running a Debian derived distribution:

wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7_2.1.0-2_i386.deb
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7-dev_2.1.0-2_i386.deb

or

wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7_2.1.0-2_amd64.deb
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7-dev_2.1.0-2_amd64.deb

and install the packages with the package manager or simply by double clicking on them. First install the library and then the development package. This is the case for example for Linux Mint 17.3.

For specific instructions on installation on different distributions: have a look at the FAQ html http://users.telenet.be/on4qz/qsstv_9/faq.html

Step 2: Getting the software

The latest versions of QSSTV is always available at http://users.telenet.be/on4qz Download the latest tar file to a local directory (e.g. ~/Downloads)

Step 3: Compile and Install the software

Go to the directory you have chosen and extract the tar file. Note: replace the 9.1.1 with the appropriate version you have downloaded

>cd ~/Downloads
>tar -xvzf qsstv_9.1.1.tar.gz
>cd qsstv_9.1.1
>qmake
>make
>sudo make install

Step 4: Run QSSTV

You can now run the program by typing qsstv at the prompt of a terminal session, or make a short cut on your desktop.

>qsstv

If you have problems compiling the software, please give as much information as possible but at least:

  • Linux Distribution (e.g. Ubuntu 12.10)
  • QT Version (e.g Qt 5.4.1)
  • Dump of the compile process showing the error
qsstv_9.2.6/qsstv/documentation/manual/manual/gettingstarted.html0000664000175000017500000004220013203343735024134 0ustar jomajoma QSSTV: Getting Started
Getting Started

The program is build around 3 windows

  • Receive window: Receive functions and configuration
  • Transmit window: Transmit functions and camera control
  • Gallery window: History of received images, transmit images and templates The program will remember the last position and the size of each window on restart.

Configuration

Before we can use QSSTV you need to do some configuration.

config.png

The configuration tool is accessed through the "Options" menu in the receive window. The following tabs are available

  • Personal Settings

    config1.png


    • Call sign
    • First Name
    • Last Name
    • QTH
    • Locator (Grid Square)
      This information can also be used in templates (see also Editor)

  • Directories

    config2.png


    • RX SSTV Images: directory for saving the SSTV received images
    • RX DRM Images: directory for saving the DRM received images
    • TX Images: directory for images to transmit
    • Templates: directory where the template files are stored
    • Audio Records: directory for audio files (where you save/read recorded audio files)
    • Documentation: URL of the user manual (if you copied the manual locally then you can point to it with e.g. file:///usr/share/doc/qsstv/manual

  • Gui

    config3.png


    • Stretch: if checked, the image will fill the receive window (keeping the aspect ratio) else it will be displayed as is.
    • Background Colour: colour used for image borders and background in the gallery
    • Image Background Colour: Default image background Push the push button to select the colour selector.
    • Gallery: Rows and columns: set-up the number of rows and columns to be used in the Gallery tab. If you're running on a slow CPU (like on a Raspberry Pi) select row=1 and columns=1.
    • Slow CPU: Select this option if you're running on a slow CPU (e.g. Rapsberry Pi)
    • Low Resolution: Select this option if your display is for example 800x480. This options sets the maximum vertical resolution of QSSTV to less than 480 lines. It therefore removes some features from the receive window (Rx Notification Window in DRM) and the transmit window (Image replay Preview and TX Notifications in DRM mode). You can toggle to and from full screen by using the CTRL_F key combination.



  • Audio

    config4.png


    • ALSA Input Audio Device : depending on your hardware (e.g. default,hw:0,0)
    • ALSA Output Audio Device : depending on your hardware (e.g. default,hw:0,0)
    • PulseAudio: native pulse audio interface
      Note: Most distributions use Pulse Audio interface.. You can select the audio card settings through the audio applet by right clicking on the Speaker icon and selecting the Sound Preferences
    • RX Clock frequency : clock used while receiving SSTV images,(see also Calibration)
    • TX Clock frequency : clock used while transmitting SSTV images,(see also Calibration)
    • Sound Input routing
      • From sound card: default mode
      • From file: decode a previously recorded file
      • From sound card and record: decode and record to a file (wav type, stereo 48000)
      • Maximum recording size: limits the size of the recorded file
    • Sound Output routing
      • To sound card: default
      • Playback: playback a wav-file (use 48000 samples per second recording in mono or stereo)
      • Playback and record: playback the sound and record at the same time.
  • Swap left and right channel
    • If selected, audio will be sent on the right audio channel instead of the left channel (e.g Kenwood tranceivers using USB sound interfaces)
  • PTT tone on other audio channel
    • A tone will be sent on the right channel to enable PTT. If the above "Swap left and right channel" is selected, it will be sent on the left channel.

      Note: To playback an audio file, be sure the format is of type wav and has a samplerate of 48000 samples/second. You can always open the file with audacity and export the file to adapt the type and/or samplerate
  • CAT

    config5.png


  • Special Serial Port: If you have a separate serial interface to control the PTT you can enable Special Serial Port to control it. You can select RTS and or DTR in inverted or non-inverted mode (i.e. +RTS will assert RTS at +12V when the PTT is active and -RTS will assert RTS at -12V). +RTS and/or +DTR is used most of the time. The same goes for DTR.
    You cannot select both +RTS and -RTS or +DTR and -DTR at the same time.
  • Enable Hamlib Cat Interface
    • Radio Model: drop down list from the radio models
    • CIV Address: only used for ICOM, if left empty, the default address of the radio will be used
    • Serial Port/host: either the serial port (e.g. /dev/ttyUSB0) or the host address (e.g. localhost:4532)
    • Handshake, Parity, Data bits, Stop bits, Baud rate: serial port settings
    • PTT Serial Port: serial port (e.g. /dev/ttyS0) only used if "Enable PTT serial Interface" is selected
    • PTT Control via: If the radio uses a CAT command to activate Transmission then select "CAT". If you have a radio that does not support such a CAT command, you can let Hamlib use the RTS or DTR on the serial port specified by "PTT Serial Port".
  • There are 2 CAT ports: -CAT (voice port): the normal setting -CAT (data port): to be used with some kenwood tranceivers(e.g. kenwood TS-480) to force data port instead of audio port (source: David VK3DCU) Example: IC-706MKIIG via a cat interface such as interfaceOne.
  • Enable XMLRPC This allows you to connect to the Flrig program using the XMLRPC protocol. Flrig will handle all the communication with the transceiver (including PTT).
  • TX Delay: The program will wait for the selected delay before transmitting any audio.

Note: The option Enable XMLRPC excludes the use of hamlib.

A sample set-up of Flrig is shown below.

flrig1.png



  • CW

    config6.png


    • Tone: frequency of the CW tone
    • Words per Minute: CW transmission speed
    • Text To Send: this text will be send at the end of an image transmission if the option is enabled.
  • Repeater

    config7.png


    • Enable repeater: enable repeater operation
    • Image Interval (min): interval time before sending one of the Idle Images
    • Repeater TX mode: the mode the repeater will use to send the images
    • Idle Image[1-4]: images send by the repeater if there is no activity for more than the interval time
    • Idle Template:template that will be super-imposed on the idle images
    • Repeater Template: template that will be super-imposed on the repeated(received) images
  • FTP

    config8.png


    This is used to save the received images to an FTP server. The images will also still be saved in the local rx folder.
    • Enable FTP: enable ftp operation
    • FTP Port: default 21
    • Default Image Format: select the image format from the drop down bow (used only in SSTV)
    • Remote Hostname: hostname of the ftp server (e.g. myftp.home.net or 192.168.0.1)
    • Remote directory:the ftp server directory where you'll store the images
    • FTP Login name: your login name on the server (can be anonymous)
    • FTP Password: if you need one, otherwise leave blank
    • Image store:
      • Image1 - image30: The files will be saved under the generic name imageXX, where xx ranges from 1 to 30. When a new image arrives, the old images are shifted down (i.e. image29 becomes image30, image28 becomes image 29 etc ..) and the new one is stored as image1. -file name: the image (or other type of file) is stored with a file name derived from the mode (SSTV) or from the file name transmitted in DRM.

Note: This FTP server is unrelated to the FTP server for Hybrid Mode.

You can test the connection by clicking the Test connection button. It will set-up a connection to the server and send a test file to check if all parameters are correct. You will either see a pop-up with "Connection OK" or an error message showing the reason of the fail.

  • Waterfall

    config9.png


    • Start Pic: Waterfall text to send at the beginning of a DRM transmission
    • End Pic: Waterfall text to send at the end of a DRM transmission
    • FIX: Waterfall text to send at the beginning of a DRM retransmission
    • BSR: Waterfall text to send at the beginning of a DRM request for retransmission
      Note: you can also use %m. This will be replaced by your call sign
  • Hybrid

    config10.png


    • Enable Reception in Hybrid Mode: allows reception of hamDRM in hybrid mode. If this is not enabled, hybrid mode files will not be shown or stored.
    • FTP Port: default 21 (cannot be modified at this moment for compatibility with EasyPal)
    • Remote Hostname: hostname of your ftp server
    • Remote directory:the ftp server directory where the stored images are
    • FTP Login name: the login name on the server
    • FTP Password: will be encrypted

Login name, password,hostname and directories will be encrypted before being sent on the air.

If you want to use the special server, the directories to store images is relative to the directory HybridFiles1. So first create a top level directory HybridFiles1. If you leave the Remote Directory empty, then the files will be placed in the directory HybridFiles1. If you put for example "testdir" in the Remote Directory (as shown in the above screen shot), then you need to create testdir under HybridFiles (HybridFiles1/testdir).

QSSTV will not create those directories for you.

EasyPal also use two other directories on the same level as HybridFiles1

  • OnlineCallsigns1
  • RxOkNotifications1

You can create them on your server but they are not used by QSSTV at this moment.

You can test the connection by clicking the Test connection button. It will setup a connection to the server and send a test file to check if all parameters are correct. You will either see a pop-up with "Connection OK" or an error message showing the reason of the fail.

  • DRM Profiles

    config11.png


    Used for quick selection of the most common settings you use in DRM. Choose a short name for the profile and make a selection for all the parameters. The name will appear in the Profiles drop-down box in the Transmit window for DRM.
  • Frequencies

    config12.png


    • List of selectable frequencies. Click Add to add a new combo frequency/mode/modulation. Enter the frequency and select the mode and modulation type.
      To move a frequency/mode/modulation up or down the list, click first on the entry in the table and then click on one of the arrow buttons.
    • Hamlib Data Command: (only used with Hamlib) As far a I know Hamlib does not support switching the Icomxxx to data mode. As a result, if you for example selected USB-D1 on a Icom 7600,changing the frequency will switch the rig back to the regular USB (data mode off).
      Hamlib Data Command allows you to send a "raw command" that will be executed when you change frequencies.
    • Example: FEFE7AE01A060101FD and Hex button checked: will put the Icom in data mode D1 (LSB, USB or FM) and the Filter 1.
    • Hex: if checked the text is interpreted as hex values else it will be interpreted as a regular ASCII string.
    • Note 1: you can put any valid raw command here, it will be send on every frequency change
    • Note 2: Flrig does not support FM data modes.

Calibration

Note: Calibration is only needed for SSTV mode All SSTV applications need an accurate and stable clock. The accuracy of a PC clock is not always correct. Therefore it's necessary to execute some sort of calibration. You need to synchronize your PC with an network time server via the ntp protocol. Every Linux distribution has some configuration tool that allows you to install the ntp client. Be sure it's active. You can check it with:

>ntpdc -p

The selected ntp server should have an asterisk in the first column.

remote           local      st poll reach  delay   offset    disp
=======================================================================
*stratum1dc1.bc  10.119.37.19     2   64  377 0.00386  0.036853 0.06850

You can now launch the Calibration.

It will take several minutes to complete. Be sure to wait long enough, the progress is extremely slow

calibration.png

When RX and TX calibration is finished, press the OK button to accept the new values.

  • Note: You can always enter the clock values manually.
qsstv_9.2.6/qsstv/documentation/manual/manual/config.png0000664000175000017500000003555413203343735022207 0ustar jomajomaPNG  IHDRk bKGD pHYs  tIME /e IDATxwǿnK^ذKbhl(+RI}ml/N{{@g>{gyyys1G(F1:( M'+3C/Q!iк:RXh] ^8B4SJE/ íG.>xb]JbZ=LJJŨ$^Ab $И#Ą؛Qdӌ9b Hu^Ap:vdY:rwj><>UWRN'.X ibj*U0QDو4m#XYGo6$wDO !F;@ e^4A![.tLDY©4Ճ~< ]sxM?J~Fr E5c @~ LD$_G%m. ZB3qFρmLX[3^A [3_:nbYgHm{ﭧsIFR4>u'74Z'! `#H8p ?oNU"=H 9{ۥ;#qJ||_(go =DM8ШܵYoD\f@d|~|q䭜?6|W DG@?t,%eɣ%r~v0سy#,%ӆ2NZyu CM&Vĥt[4 osh?S $Bٶ :Qy[w_Kv`5FBwv\6luQOcE ~Ϗi ?u9 }S, :qz$br_@> >kwn٤ )p$` kǔRU <_>!rXvaRYYEJJTLtJ9pM?;F<ȧlHs&s-\_C5\;c:"j$ Sg4>-Qɛ6$zٟ?6yЃOOqAYضRS-q>ō]{1=l-5Hݧ8VN O&lO4[A prW3_? A'&+]Cxj#?8M|j.=IEx'pc/n]P>|ذtިϿ4 W۾^Bi܉*ߤc|"IA$ 5@i8_*daPBAT$$t|oL(!Kjm&$*Yh9bۑ[D1(*Qnj&,Yiv|U !c\DfgCwF|N;7c%AYtM# |CnՁ/p++m+zﰥmGOs($ 1}:kmrrY~o?H&tOD"R֕|"G &ٺRS4L jO5^ ĵC4Qs"[9 nx`2mvg2%m6K3RK+@W5j/PutNٿαɔ{?M_GhU^1kL;U8IRR2EE>_~ &x}^l6aA ৺0M*O2^qTv-t=Z8!_Ɛ nSy\jw"̋ʤOhl^^h~b{FDlnSSƶ/z?M\1w{'♷9䉿_L'gNUמj9JH}5[͆Jk(cT_ q:5rst b (( pc"S<}8m(7=:뽵q%*_$ɿE3ާ/Cr,`3} /Bv)5DݛMdl\| f,&lz]3I|:g)c霟El|(1w3q :,jMek,5 uMvH3zi)]"==IMMCDعs8^~'3! ыtѤpLޝ98u U3QB8ן@yx4P\\rsF:ޚ `s9p-k>?Q@%v S{[AAF"f'zQ|Hlȱ(# EQ55@}tF[zG!^!6&s""PmۤN6'sB41^@G4jmdZ@%`I֕NqlZ&4N{$ Ame I"B@qD) XRb o/fDbt6A{w3gltM?_$K?e"];tڎ̟0[4 o|͗k9W (b/(#F~2~; K /eu?ݭwZbr{$>>>rlʕqkۚUPP{0$} pR\Vwb۞-^șc3#f} %vɤK흷3䱑ca%$''7yc5~9X4155<ȅgL&95ϔs歙"y ;NdE{vk1Ԑ>;^yѹ{O?i\}\wõGoRB2zoo<ʴʤ3.!=5eEv%t3&cEKaE..?ڵ0t^z9<6;g|O#ؓD)PZR(6Tӽ\@5[ogӆM|W>;{"8]:Lˢ<0ٿGƂ?d"r:wٷhuO9j[ʲ0\~U3$(,翟MJR*z뷭ON?j51UdIFӵ#~{ROW\TSO<ͻCrrt;gf䨑2lO>}yxډâ,^+ѥ0,^ukqt{Æ;`oaٝrZ,'59k`e$' YYe)eŤ$9s9_9^|yV[U(>^ń3c-4[7̂ǐp,p͑\~[ K HJH&!.1J uM~q@5 #}zȒLqY/4#rG۫om: ]۟V7IˆB l6jBF'3fRPPheeGWeu+/ W.1I8F wHOɠknٿ8W<. EV%VTSVY'0TVWP][݂Se޲lڦ:Ceu,]4b躎fi:UJKJ5>#OC±&F8^~?.;vq+|??~_vÙON_21Y>,fveE;-$F.ɽq `̠ ih躎;-&1Swg蚎i_uzu˙c0L*YH( (X+\Z 5Mt]oti?Rxoƻ$''3tPA~{՗_Cii ox%!4P?z骛+U~M0!wCP33br ),-dYȞ9=$p˕w9b.t ̋8"!;p2 tLia~=QLQ0D vIچqRc:i*$c&;vnh1 Z $ڪǢD2yptȀڵ|) 膎J1hLDitOjRh4nDKV,bx󍷘w$$&G9 ꕫm/٧_<5ЫtkQ42"1ؤ}87Ċ.tòt] E[h 9CQwK.dRp2~F0;IJM"]ݲ>H7Σ[vC.g x[e똭$I#O]MK{kecf32ͣh aq!iT l d 2v6ENn`-ͨur-p:Bc7oDYY9O:z 'XRئ\}Fh,41Lݨnw荗zyIF9~)VoH*|L>S\{Ռ;4ŇGDN؟w']s޼@1O=/c0⿘o|Wߢ`6N;281qYy_2lP6ȍW~6ݳq"z?2d`yI;^{uq?~sM6LoʿΛ+ߐݣn|>?=O~=Cuoէ⩿?CTrs(w'fRH]5AXC/<=N9hpSNX$* H y~}>z6sGғrۗEˌ3<'Ǡa1j(!Wx5ԭמ -.хfٌ/xʋvP >8۶leĘt\A:v t`Vn9IHgp " se~d?d#~{^nv)`6Ogvnz42ٽso&.x1 -Y6cDn,'Puu5Sʃzjn&Ǔ<ȍ+61cFfF mtAT#RVZΙѬʨ_~._as3xȵ/fȑddsSxgٽk7Y3#A3HmR@3L=64MEA5? N#`@>٬XU+V3³#&>!NZu6|Q'[s o?MuO߀>۳srS{i:f+irC}y.!!!sϛYa&{,[ţ=رcxx|\q<|G7Ϳ‚BN;u+W`옓x嵗̤W^{Ӱ6/zsgvC}ԏS^^Avv6?#Gfɖ:ɩPCDգ*&>QS]ÀQeLD4|~?@,`L Tw `4mLWo`;3ەglAvH|ܾoYf#}rDկm72(iKs6ي FbZBIEE_~9܁OһOo^~eVZM+ox|3g֭cO zv8<,6[D|z),[&rJ BUUi~5#E$Ǯv 5`0UF I:}a޼ytITWx"*7>_dQeމ/һ{jj"eaP2q'ΥWOC%0ކ"<.Gx6`x$!#4*Z㗐Yƙ7K/{[@0gDesKhf9_k8q{={9y3d)G gۖPlᣆ2lXKNIrf:_j2!"4MC$ w})ªkC P'%Z!Hj$IlX><(^3O=â%15 2rFSC:\{5w{1rs]n?.̈jhs&ņxOs٧+ ?,νh<7 Fذf#7n"ϭ:,3|p[>lҳړx|zxUpv)|\.']ub<TM4|_&ٞթL$Pq!IDAT}>i驈ȧ|SG(2e)׹['V,YI6AonHCL =7_$$3/"?k85", InlqNݝo?o5^I'՗_t:)//'%%'噧ᢋ/&--ؓaСFK͟ G pгwOn]Yg]$6~50yHjZ 8* .Yߒ7Lgߞ}>5"dYf7cƌa֧4iCNj@^ $P#2x=^:v$I)sg1٨AwrD /檛Ͼc-/`!'0e;8vF4Bv)wu/l];sntZ#Vok`ms59]ס6pic>'}I4;GʫWk觅 bfyx|\7Zv'?<!^;r渳Xr[rɼ dffPo(ܖǘq'sf eeevv{D_~%]v.>>Ql!jP?<S΋0FEhOdNvvq8].vcrf6|wF}:SatmMnD[6l XIӹc%Ft*m#<Y0DW㪱U]#I@4yd~?vgN<.ٝdYj#Z/tL$K1)t"H@ %%ĸc@.++c\{x<#tl Hkx()_jj)+SϮ!q pѪ[8R\н入ݑz~~>\pL8ozh.­R䨏8:tdF`ꎇC%.Irpʲٿ?^z)x' b"/"=wu~{:]tb9 QNAiK Euxc'Oƕ&otM;;䩧N18#Y(RQ({D(>%n}rHNIF$SK/0p@J IlJ5BGZac۰m(6EBiI 34 nhVj+S 28a@t .1n4M'`y[D$n>qqqqܸ]n.'Nݎ( ׺zZѐ@5tFb|RcI$E0 :gݳ&'9+xg4F(GmR]|>nS/#8~V_!1."S!nʤ֠JcWREdZ2 9>E4B+覎fXXڒ.8g"{ggu?\1.RS@u6ƻөHpG}y#GvӣdgRY]Ō>aDx9rHJH$y/nza22b ڍx;K/LǬܯfw14s"Y /(akjض?@qOqJ*%ztpp8ri2W6L0 ʾc衼p ,Y_ީƞkXame+*h ++HJHˮ˯ɗlCsfsmo0 Z 8l$%+rس/4/AE&oؽw/ >4߻w{>s{fR^YU+bhj2LMBR D+vMAt>%nJ,cJKdus! Fn| ʂ^TƢpn7ɉIݳEzjY~vL>Fosf:Jjj%s&`H-;aƨ:[U]S} I  ohhD~^w?~۶зgN>q,~^CDK 4,4Drg>)c.I L'IHbrqTh*jW,\_'!xthNN.oWhM9wAvZlZv.ްǯi)A tE]N>-2`0 +}6/aH3}}ݥ._'rL%=.CY(D@Ƌ+\hⱉ;FxkWTp͸:[NT~D>\P˟UCqNVaxrv(>$5mk=5ХcffAi{y's]$7l~`:/A}_m[awѬ(SN23$P^QNұ3yN2g0 (6'8~'OE(k.ƨa#)*. {-gM༳&goRh>3f}#?#!.2#Di:_[(cC7 ~ dk-jjjCpy2rH?< à@-4MpTES#G~m7g BM9l$y7$g_=օt_ю{EVu7w^j=5\=z1"+ga<6mߟ~K']]܁kz:{}м~ް)1xjF5Z ױnIQS^ rjtd$}:wtϺ-kXWIe'?,ܟ^0|^2/ZŨM芋.%.ލrt9qحVDm ** KuT&4+MdmՎ)~:g!^U&i)"~@ :("b,J9FmF( bʂM-٢0tART*=6,%Q╢KA݆ﱖD˩h@WdY(Fmg2[6P3f(: lTL$jM@ZnDc؄i'ډ`"& ahvQA61Ũ$$!rd5~)DK$diJ%Rqܳ5A[3glwd(F^vI6(6tՏ*ȲPPI!UNF;!%dG.8b9O{T=D ebjoDs81TCuE 6#EVe Y"6xӒ`RC'ީө=rVoKzc3=`Rt\Cֱ:ZFV;$UwT0*Q$"bEV6%I#*$A Wd?H$ О&?mBѝ$ۢB"7ZCxOEMY áX+oGE"ɐts-C bh*Dv7Ђa*:nxk+86|zeadeXK`S<θ@0LZqX ]XCkRSQ@n]љ&y,q7ڷ dw X TtM3BkXV `k_Byi%O?7)RgC^t^/J|| !ODP].PSQԽEjZ .Ie  &4 0ё$k49^v.g(x9n+_W陸\.qnDAM[7!}q,54"$"+VGkSl d K!&=25;=d3XMOD2S,mdiRXds^.tng X# Iz%c5>anY.l躈aHk!@UJ+U HorX09lVOp#եKG&( s`ρ\dII5 5*y%U{GK׮$%[kahGR-`F>#D C@t ZPdxŻݤ;El۶dJrJ2ʡؖ xH3a;G-Zz& I7t&4"굤$|R~6XS'AvLj I:^vkVaLZ:dH\ L0Ft]}Ec5:Eq2RY0dT-Hy}%:2 쪓 In7vaz.99W)`Uׇv)tL@ 004HiY9F&1)%$[5hh'}R^Tai aURgHrooEtO8粻'ēFqVY78w2uKP"*'bm-I,E#I%DAl"Y> Dg3r-aSL͖r!o^@q 2GVˉaC*!ډ[=qIfl nĎBM&T>!Ȱ?]ګq$(6.ffs-ޣ+diN6Ŧ͉xv'~PCRAt 1)Hq0^COa9G!s8] TKE O8L^?"EѲĐ{f-I L ߷H&]T֘TT+XL]2q9edŅ,KM=d6ȉ`*'XZ} tP6-ItNw86$م$M&Mr!dl;3tHw zj#Z7 Z M.$3 1#^S>=N MÊM!$#+>NkxR:Z'C@ Cl:f)U]qGc2&yEz0" eEp"2ag^ٴŦ:W҈zQC@i 7y /4FFZAy5YgԤ4䎈Iؕێs?~o! }ڒWt_LhmsF|IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config1.png0000664000175000017500000010364613203343735022266 0ustar jomajomaPNG  IHDR ysBIT|dtEXtSoftwaremate-screenshotȖJ IDATxu|߬oܛFku)*p/^.rq.)-u*P=6i\Wf?6ƳIYhfgmF!B%mv u!򧙟Sye <Gʠ}5s tRTTLAA!`Z0 sJM";vUtzf? p_̀cV#3\\?GYF<44F'i'2 zq哏pq%O?1TEB!ZbB /_ԉ(?3UESUt:y-Ü iL:аى^oH07%2T7du 9)hoOb\2}u5U@fF fUN*NFB!2NQC:bسr]v⎟wna4z~Nqt:~~XV&ࢸb4N-k}b8 [uf`\cҰWĩi(:f_+~fٿJQ~*Β3`)YMŦӫg0;/? SraZXWz"8U@Q}}7)AF>: !Af |8b*B8U>q]X2KQ0-*W3E(?BxGZ SS\ ϡ\B!_il<C~Ņ5oS=d g}nlX,Lt=umۙ>s&MhhH=Wi۸,VpL|gA85:> z]r;Sv#WGQVΚMX ž]\=@3 P_o&|M}+/[ƒ#πЏĵû므3O5|Qzb)9'Ύ}Ha^:_=+%>Ԋ'?wv僼4-W6cd/ۿR擌w|1G˥ !B`̗{V l^of~F=Q~fD13<t)Sv %*hN \:8$gRM>YwIj,Ti913unӻ;cnߋQT_ZwKy`n U ?{ɞ{llP t VVQ}޵=b|#B>ʛMn aMY0cW3OI B;7pN2>u6d~q/9Jξ8Sε\tcB!1.ppt aV!q;{iqaH% 10fNՉhh4нk'rs]Spѥ3_FNGt47w?O٧|:NO"׏NO#y˳qV$$c@Wpкlqgb_8'*;sQ-;$i:?_=~ 'DﻝG>]I2K/:dng)t&RvbVZ%BW:Z4UsD^z1.X-p6wL%57ӵ$׊t1oTu:t%EA+Ct~nLW4ՕVVnOhN*cf} lejOe.'&j_35O:& lLք9;q fUſf#bC++;0Z1*c+N eP1D6@;-B!1ٱ Yi3! u+St#'솊E= JJ*Tqb2Si3e9É]Wq0nїL$mU-3&l5l 'h5w^FBjJIΝߚEs.B!:E!SEP=z9{Կ+s7E@:}ꬢӑWXTrA}b4}glݾ _|||ٺc7_| MVs:̶dVl/];n[mW@NN!68S_DZ/ڝ~Q@>)<`c[U>aH+"#[ӳ[dԩ!-iU? qelݲ2WYt<;FAaa *\So򒗼%/yK^既8[괣:*=Y5FypLڛ:WuSV+AAd4XhhPPXdBU55:`*ddc[H;w_NR)fBbZqxwftO/4cA;1{ВbgTQ)ϕ5}KY$! !WQKe,.ݑ{0ėٛV`_4K h}-4p=@z 2>崁?.c^CKڇB!^5gՇhOiigha>}QPotTeg`:ڵ;8LFM cRϯ*@gZ<È/cTv>ĖEvx0etw},W\WլPd/lp˪d0a9n]JXl};:t8С7u>4:s@-$#e[cPY`4ň\^ҟ[/ȫ:`O'iiM|Ow]ǰѱ՛ʤ39I:r~C!Bx/^/9z؉QtQV'p߳J &h={VSU~<(;pog<^ui[i)U̝;]vGhh(}ꪫn7|.L-q/ 5>}[m㕗_BH;` >>A۴i~?111 fkSzjhNx."k^ӛԩSөSYS(cckXhs_6֮ghVZIep8;ohݺun玝^k&L=ЦσҶFpp0o׽mՇTX\j,u[oѺuk&]=xb֭[s>Kxxx"nh=DuָT^xePJttzbf!D5o'>'> <9-˹Tvv6,?b!&&aCп?Tz=e~dUcZh֬W\~;w(ƣԦ͛>|S%,,nݺrĉgp|Nϫ~_b}զ#ӡ}7;;֭dffce\rx&%w?Sc:;c„i߮-QgJצmΈ#pU//G|դqV5=Ϗ?o;fܹ3F$,,ԽΝ;y׹ne{^znf X՜3|s>YZd2"KJ>m>ajйsg}wݻ]4{o=3f`Ædeep8c4Mc,Y\bcc:u ;:M61gN:Maa!;v'`͚5̜5X,.b&Op6۳a9L<+bf̘ڵk)((}L2VZp >SRRo&UQbYYYLzZlIAAII,\_~zPW1fƌSR6TV}|V*;OnFm pi{EaDGEOJJ Wz-W0c׌1N:RTTđGXnE:֓oYd){njzt:]4~u-6Y~oInzV^Ϳ~Ƚ]\l\[>h `?EEEǹG}1rm^vQ4ME[iquѺMk پ}_|Nkyіk+&M-Z{j=oCSUrRPP#z^OvNk׮7[oac\|nwl6=`Qu>d"**mzؽ{\2~ikƓϬV=Iq]u1Vœ<ѿ_? n\_~Y?}Liq&#f}O>}7i̙_SeleӦMk ٵk73f~͑#G63^ޔ)S>:z,u),,dҤI]BCB7ng&L!!!ڵt6+O? w4?{.ZĔɓyy a>ߎbASUРE| M/ </X5&pq3lظBv5(zTU>#:Dvv;4M77^'$8m۶39?~0FaJCcy^ۍ7Х3'p8xg .ӹxT2MJJ%&:R=K\;w$66)'Cviii|ͷܵ ^Oݹk>SN>>Nl1swTU|m;FvN:6mZ3uۜLM_|IRR~~DFFÓoZٽgK,㪞NP'Mcɒ%1 /Y€+Pqe<(o׮ڴou4ܼ<9NN֯G4ZT#G鈏=Jދ!dG]/kAQZ6hb223),,$44ѣF1|PNMXtW //(8\y?󤦦R\\LLL S'OM8pwtLM嫯s J}mپyũە'zǟ`Ŋؿ2Nǎ2o߶#G]#E(?~w{ 4MsNxԳz~|222EDD/nzf͞>7h@p՝ #O=Vv֮^y="33{u']t_~as&&:Nu|\*}mݶotZhe޽L*ir^z^|yq:lܸaC؇bb8rhٳyc0y$?WgH^=ٰq# ,KFF&͚5ޡ95ډXUG*ùռysvͮݻرCm6/ ~~r4v;o?Vr`U ;1b8z$;'9s?g ??g{fzJeQ|\ __.Zݾcg22>b99<ٻ+ ,TǛʾẍ́jۋ/$%%fp8lܼ]ɇh2sYVg~XS)ZG7߄^g޽kN<);>˖ĉ՜_V7^ jQj* .W_)93-%mjxknna*ͣZKyVnP:EfZUU]fvu۲{2)9xzænՊdR#&:Cѯo_44 "';/O;p﷪z~ h0)ѣ|ͷ0rJv\߲+TUlv[eNw tBQv!w>::?N4 Ͽ/ ?KDDD l{᭷ߡ~Lx 9,^c7T+7x~96;]4~#'7PzE2"L&S "222Ω;fg騶ߠw\~en:g{c)Ljbs>l^sM^|M7sםwЫkpשcGxa,X)S۶iӺY[pݻu㚫mokҫgO230Sjl\Ǐ MGuuQSs\W\vikn݊/~}b2הlx1JΖG5oο~͛~OǣQ.V-[m0ꍼ:uf\ }"۫lu'$FGEc4k]wI_?}С?-_^JFټImZZzmڴf߾}u6nDb>6nȈ3ɇѭki3eۣTg޽^ݺSts- ݻv\g!M&/K/LJ%KrUW2bׁYVٺu6ΨA}zm~<ӤLu4k2'y֭L9^{rǏ[ դ9UlvYY[CK9Ɛ`BBB8x0C`غuwf}?6sddfMBBhCb>t2227A}UQ{PRFGE&iî]ٻo#G(n+ (hb-Z\m~MH?Znb^C{Æ_߾t҅xe~b՗K<-^VZr7C8s ?A\UoNĉb@tÆdRVZÈ>}9?Lƙc+Yl(C=1luխ(:%eu9s}sawYgNa49}4m͔k) tu%@@LLL[׮0w&$8bn޽$==' a.lJNN%S ~Vh??sܦNLgO@V{K*-/lܾ>>;K/ vm۲4Mc1LtؑXjW\~9GQڴA4ә={DaarpZ뷺zܳg/ -$%k=U%>>~s);A2E-[xRw>MdPPPje=M[m\z6[sر˥cпeװy.]{~ /?L&#G`ҥ :qE jWel =wgI5_Rr2KnD/]ީcQU>Lnݪm{5}y/2f}= 2޽{x*{pۗg0s%gv;/TMEժojɓTMd5o/>e+_?j-^pP-KQ\в~x+rmF#]vaqk4P5WছFߒinթ]))mPrssQ5)JVPJq5j/2|O?dMUi֡^f_G;~UuSNv;暂PzYݝD5uZ|FDsA{_VB4}J^\9;nJ]W˙3DGG:5kBQڵo mϸaZjI$ϘIvm1MZk?Pm;.Zd0ЗqݵPa2ٲNLdd$'N࣏>>۟)U(*7%$$pd*t1.T-{RafW.;w6NJdd+ BBBP5aÆtRK9 USX-T[~LD6% '=hPs!׀-rmǻǣ>رc ѣ̝;-Rnm۶?֭ظq#wu':pW7b2ڵ+NT.j㈏G3gh"++:mڴftقNЭ[7G|MS\\UW]U<(+U={*كڲ9e?Ү][CCKnwuUe|i+}tU BCB0ڵ.+?j.I]vѣ{wut ݻwC+G|<DGGq"*=(Nӑا7}z>`I]ˠrjޜ(.]F>,V\t?~}V8 4od46-VFu:iǎ;\gK~T|Zǣ*>fswNYnRؾ}i鄆˷Gy`>ٲ-[jN"oeK-i91ι/Ӿăj/}T{U5$8fܹ$F NwAX3:u$>.aL{aaFGɓ|tb]m~vo^t:#lرc8|0]:wWͮjTOZGV}zJqgUO>';GQV\͞={x4U%(0Ν:zj9{ HMMo7@mh^}UUa!oPE9v8vKǏw؃t7pM(;WhZV€Yz yyy".اrExv\{)]lۙ5k6Fi^&\|1K._*fuҁ}8efTNZdz{rvލN#6&r m˓u_b{%vUЬY$sW%* a\]rqY>>V~i9'N 88ovW`0Y|9˖-LJ8Ə_ù2kZrk@@}KbL8t}=V+Ç[nuםL>ӧSTTDBBO>PU=(|k~LJx{{YҿK.+MEx:v3 &&|TU#OoEa<דڵé:1ʹo׎l} ڵl2:uHfcرVUU]Ǐ˫{c6HM=E޽`FAA!g2TczR7Noſz1cF rڳG. Jf.{vLU+ù5AootM:b~Yw}bۙ;o>qqUUճ' -O?c@~ 1GDT[7GI :ի[o1nXBB5yRӣ{wz9s9z={b6IRr27LŽ;fAD\,5_?֯=go?۾xã27z?,cF"Y3lvG~XEt:&&߯sg \zxc(;{_Wż hղ%'SS7>sƎͼ 0t4F={P>BpjݺG%$-J{S..+'ObrljׯѺU vHYo7OrݻwVnb4s\?gмysƌŐ>JR)[osGbD#Z-ri׶-^23|X- Ho72{̞Ŵlтs&+ݵuVy?Xx1~9zp:v耿?Nfdg`ZiӦ5Nѵ3t{_,^%Kh$44nݺ<:;6 ??_ڶMpvυZ߷tُ'2x .7M0Lw~6~:.;s̈́ڼy$w-a.!АZlQmݔOt?z!fϙ÷rחa--n][}}?4M#0 v:hQ)6h׮mIˏck>BTT=F=IJJf27~bXVJFb,իg˭ߥs']Bim·faEmz~nv -fMѳ_{x5,X;v2pJ7Dٕ[aA|4sNع}:Ν:uv-n",,\˥ؘ|?{Oǎ\ݴy36nd2F.>t!!!o; p(_&fM(,,Zaʦ'/.6;︝yחÆ?ߒնںf㏭[Yp!NJhh(_wmPUu#tUp?:⽤^KNhdᐆؼ5zslެ)[S[]ew!湩+;pʓ[[jhM-7͚B5ՅXvb 9R'ٻ{႐qCКZ>9^o͛5rk 1z .<75k׬_SSSپcGF$lܸ˗0BTOzWٴiScFfڴiDEGQgϞMjj*]t90BI9”)Sx0`G!9@\\|se{=#$!B!9J|#66vNwyIIdeea4{hӦ | [m͛O}fDwc=Ưʼy8u41jPP IDATH*G~oGHH&L`С8N^zeRRRBדHXb)))1~8.rw~?_~ɮ]ob"&Ml67f !Dv {=6mڄ``РAq9s &M"55 .rnw;b rrr oǏ 99^{G{Y! fz}uTUeu5SPP@-1s&o' 0Ǐޮe˖yX-u>3+{^֭[o%11>}ЫgO F#ׯ?UVGUUnʸcۯO?gǎ\3a"#ٴig̠K.jՊS$$$ȿEVV}9\+**ߟb>cz!>Ct:-fn 6n'|B˖-袋4hd2//Ӯ];ڴiCZZ;v&**d>#gI}-9cF۵kGNgfdBϞ=tMH(d".6R:={Э[7o eѡ}{V^͞ݻi^޺M:v@HJJb0zht̚5kغmZrx߽~ sΕBTcΜ99s?PZhiXjCK<1bz͆ Xj{Qt҅m۶ѦM}NϞ=9vVBpn+`|XEEEעEpBխ[WYYYj׮YY/6V -҂ ոQ#JJJR:uW hK/;PPp23F }jSӦM)S(<<\Փ$%%%i޼y2d4ްaNg 6Ԝ9s4{l%$$07pvMرc֮]B}ޭ$uڕYgK8ڶij>}f͚z(9Y6M۷y.uZtΝ+ժf͚iРA|7nƏ^xA5jP֭5p@ UgөS'j֬Y8q<<<p3 xfv?\.{IJrǵ%إϾ\$D=‚|[Z۶6KY}-4!pY,n  UƑ.)8$T2 g.fu*:oݬi.~ M[ظx8fZ\\VwGDS);k. .8$TSDD#pY,Y(bqvIt!0PM\vKy` 84!p0 T`V*`*en. SuY8 rv9p!HY.\.f+QfFoۢ&g q䰶o,/OG 8 \ZTiդY7tv9 @yT튈rv94fvegg)VmgQʔgE`8-[]prژ1>|ܹs5g _űn:mV/> 6m۶/rerdddH{=lJ %I9996@\H2EW$ufIR~~&O6XÇ+ @s.nI5͛ӪU_#*..V``:wꤻK)gYY^=ZQ5ԲeK5nXRSSݺgϞ8pNm۶O7l{Gt%#33S*,,ԼytwsI~+;;۱|z-uU>˟ 'j咤= $ٳGovܩ5jk+r./DhѢKL]k׮դIՌO>Ѯ=>`~֫WO$y{yI߯99z'TF mܸQ3gRLLZly>v6nܨnުnQGGڲez'%vx֯_gPf<=?b5lPdIR/KCNNվ}{͘1C={ Д)StÕG||z)kݚ0aÕ$I, :T^^^4ihrss?pkrssSnn. DhڤƍiŊڱ}[WGDA||m==(Ij޼6oެ?gqqqc]ݸݫ .]H5m+WjMw}'Iz߲efei8W^O`K+VЁo?ÇԫWOՓ$5kLׯƍ-[hÆ 裏_~QfM=ڷo┙6mku1,ђ%Kty{{XnM'zJ;wVo9'_?CRVJ߂ըQC˓$78vj]^^奤$}駺;4c CYf16lԩSw^Ik4h IJII$=U:tԿڱcz쩛oYnn ycժUt}yBKJ4zh&MhZl+͟?_/(b>>:V&tT~ȑ#XI[n9m1114h:uGyD?n&ӎ.g.8 " UqkѢEZp֭,kѩS'}`F++3Sj԰_7\+]NJJRnnX8ըQCSNU=马,G&MEzו8ncǎO?T7~gIRPPE:bL_j ݺuZ`O.www9.}رCk׮Uaaվ}{uMԺukJIѬU+pm}5k^3fdl6o߾OT 2dH6>>>*((PxxFd-YD;ڏ9R&M̙3W>5zر rJ}G*++SDD~i]}xrd;kѩkjoeҽ M, (W\~X]? ?Q;{;宰 _֮V͒oq!p0 ipiCBqE~ M!a8py4Uu}fHsv9ieZ pY̴X Rvn+]+\pH'^(9py4"#%Y,. 0daKnwv 8`84a*\lJeV,7YݭZean8+\^Qa232_Y..88D1u)#pl%m[ԤY[\2HgAK+*-u4KP.(oJٹ]Q.\ î,ժR!2*ZYc8LC`&p̙3G|i_.n:8pയgĉ* b,UZpV\j***Jt蠎;wdTj2l6}gZxjQFݻڴih{n=z'իWJ駟4x`}駊LÇʕ++,,Сl6)Un q*fiQڳg:u޽{K~۷OyǎSO>izp*..֓O>={;ԃ>B-_\Æ S~CUfܸq]v@p&/v7n\gjjȑTxx_8peskǎztM7C4ו)IJHH=jJNN޽{&MhȳJs?{LR7eҥK5k*&&F="""j*}:|䈊Ν:鮻))Sh۶m?~7s?~NVZI&u_FWf̘]>\iԩSOq*ݴiSz04l0y{{kX.8]{ƟVpPrrs5uTMC=7y7aCgr2n8mܴI}Q:u~%O\EDDh:'xB5jƍ5s,Ĩe˖|p9[hZn] ?_h…G~4w\ 6L|j֬y}oݺU|&OSݪUSC/ԢE*-I_4iҤj85|=zT:t8c5kuVYljsQhѢʛʟ۷O?Y'xBmnIX%I͛7͛pcǎ);;[ 6n|`vjjS5~*S/\P۶mSԡC=Y1H>}tR)((Hw>律DzcSO=y-T8,Zn?|7"Sjڴԩ?M(EZRDD?F={h-U:1ځ$I]vիiӦ*&O"uqJLL_i[oS*99Y6l$7 7 ŢΝ;kժUڶm[&''1ҥK|r?_9dI~K$G7o /ݺQFXIzv*??}vS:uW<<=yfIRZ_w|?2տmܸQO=t5רH|֬Y{キ Q,**\rI҃>kРA{ԼysG˗/W~԰aCijڴ ЯZi߱ H.8|}}/ki:-XPnnn ][*z%%iҤIj=>`@xA_NgϖnWXX?_Ţ>JN?$ǔggK&LЬYd}gZjРFvڝu!!!8p^ysGLZӦMa/;nݽ{222AUm2w SǕԥ{OXkټeF&O$ kKԱK7T- ŋ5j(9ZAL>z[ep(,׺պmjo䛅q| 2335s,կOK\N~1Bk4l0`_w^+((HԧOg,~a}駟C8NaС.` _Y,n  UƑ.)8$TpiVwhJ?r@˺rqK\Hyxy*ev]%yuRYYGKX,+<}Ti;h޼y?.\Wi/Bj޽TDDڶmS͚5%I}ƍ\Y,~ڵtRGT_RVV,|||T^=uE={lM6MWVff={SN~R\$pő#→K}*.*ڟ~^S^ԷOܾ\}$)--M?P:uHjժ|g \bccҲ@ĨqoݮNaAƏ/7?.tuQwy ӧ֤Il=zT Pvv,YQFIRq%HYYY8p4icǎiڵz7H8b())IW]u;={%ܹs#Fƍ۶m)S4w\%&&A|$IzQFmp~j֬Sҥz-oWc uڵRf͚F+<<\M6 IDAT$hB=zvڥ'h#It뭷jӦMǙ>~}jJǏ׼ySEJKK5uTq_sc8.[Jaㄾ}CK.=}fU1 B J?'tIo+o뮻r^i?g"?~\W~~6}JKKeRSSi&{d 0ӯpѣ=zoooEFD(-5+r+ݖ-[Ծ}J>s_۷ŋ#MZb[)IСCÇWΝ+-3 Cڳg>Ub-IڵT`NIJ}2ݮd٪ǻᆱM6iҤIU遣f͚ p|gJOOWViQj_iNۻ5kL 4W_}oQ ,P6m\I q mݦKyyyzuViwUMX&MRnnU$ SIInӀD׻woZJk֬ѯx]wu6l.\bDEE)>>^wy4vXCMll>W8$޽y&1B=o]Z%Z|~'Ջ`|U7o[nѤI+>>^ƍ߿JvکGzuWbi&Iұc/?WvWOeڰa^~e4CO<~{U:udٴSP}.85rH}6w-_.3<-Z8B۷1d<*"wwwW޽5i$?|*Ǝnq^Zy) @ aQ:uWyș>www 2D=,Xo]7և~Sj:z㡄mڴ9q2w SתNǕԥ{OVʕ+5~O+CAq-a:v&@gD=쭲RgEaA֭]mW{%,t+֦M87zKx`\:\2pX,o_ֽ6nܨ<p rqڶm2'O Pe9R!@CBs|(-\piVwhJ?r@˺w<pz.}K`+<"R^Jٹ]kWpvIp!jx""TVVr8, TDD0daKnwv 8`84a*\lJeV,7YݭZean8+\^Qa232_Y..88D1u)#pl%m[ԤY[\2HgAK+*-u4KP.(oJٹ]Q.\ î,ժR!2*ZYc8LC`\СCڼe.K.1KkcX^Fy;w:f.zp9ۿ^=Z[v,OIIь3믿رc S۶mu})00nÆ JNNΝ;D= uIKK믿͛7+ @}Q>}*agoUjjjԨ(tMz衇$I P@@^yJ.[LÇל9sni˞KaٲezԨQ#=# o>LK.;Cpjرu=Ú4iKOWFRJJ&L ___u]TRR~Z;vPϞ=տl6);;ۙD8|MM7j'G={jʔ)ڷo<<]6mرcu <8Gqq^xEjә3ʫ^bSOIoRAAA\M:U?P ^z8p$Kͷ*yyjؠ6lؠ7zK^^^JLLn׏k֨sjݪ tUW]ܓK@>#lPV-%%%iԩPXXX!IA{6mRTTbbbnF-]T W_}VZ6\>p|7KF9JDEGkȐ!ZvZjf)&:ZoY5kuVYlJm<=ӕJ pdo$ZJÇղejm#IaH*4~}SYYYb@upwwשr K/,ook@kZ`f8eeeuUiiۧ*whw /gU׮]+ QZZZe'Oڻwo-.IU^^^vGT~p~\ GX*''DZWqYN:ڼe۬N;iӦSb+ѱ+-wslٺUTIrLcۮ];y{{s:9se˖۩ۧ_|QO?t!qO?)**JX,СVZm۶ziUfZf#Ώ\(((?,4Tz]X^w%ͦO>T[>\cǎUvǏM7v*??ǐ!C4rH=#JJJRPPۧ?X|҄'OVհaCV:(99Y#F#<}zgm~amذA׿Էo_%$$M6mT{޽5| 4H}V\5k8& KMnݺ4u4=njԨD=Я2} /hiz榄& \;wx ;VCU`` =z8ӵtR͜9SE&G&L|'D1112dn6\,sg0:u^ ~\L]Tqײcn<p|>JK] \ZvZm_m|pt844M!8r٥C4JP.nUttmߺYξ,@~YVqUeNjuWxD<X^ja.7'.qRqMەy@}^8 +;[uv)j޽VHpۯ3{)(CyEe)varXd-88c$aȨ祼c\m߽^WǷ899qv䞵]VVBUX|LdhmY$YgHRyqbe8>9~HŭeIYCEEy oy^N`ٸ/f;k;{UC.?uv, U_ 2aE,c=<8Aq[ vC yxP~Ayu-UN`۝]e:Ѱ6TqQ Sa F.*Nj[.QiƉlq⢇]X +z?]W8J %%%z7u Ga/Fŷ@H#!0d4n\>?!vb|_fq8r aٴtRp tպlaX$|BT~'6'n8褱,'n#bFX! rp*--Մ |s)nf˖-ӴiӔ#///r-ׯZv233e_7xcG￯_~Ea^zzW榴4MmY$$Z^"BoJTHH%\,hMiDJq4kmhq2xNfx8ql gΌp>g{fY4.& diId;~4^)_f߅)HPP)6|?#ŪWbFP\fa2B7SfpA6p8 Xf͜UWWvZtwwѣGVX~=wFWWpeDQ?~|F`sUry8CʑdtH og EGle+)Zm7-tJdsK~Q%^gv^0 %!ibd@Q$z0T-nInG,K`VV^m}GGnbddX P~%%%3ߏ1$ЭYtF]YOL> S3a۶mhmmӧl%oټu]r=RUN'*++qСTUׅk 4;ۊ5+wÜ9[&hXP@1d5ln/,G]ό=()S$V+چeuk W]SV†ntȕ;.U(-r]ukǒZсє B4477@eee Ou? $~aD"ׯ\.|>_"-0=\o_/ֵdF !G2uE|d,e.<}5oc/z []lur1MNk +gޝٞ"߉}q#ӑp偽2?[Бj}arrKݍwE @AA z{{100h4Pz};wDQQ9[n׮]iرcֆ7oÇqBp(,,Dgg'"ȼ4{H^*u:b"fOp'?.g:KJSOf`kLag% \u? xjZ3/d N4z YREDDD\SScǎ… TUG @yy9ߏ`0۷o^/lْȲ*ѣGq)8qaӦM())ÇqYΝ;L4? /6>?7O丄owK;u(jkQW۾dغy*Δ4NDDDDD9Àr """""DDDDD3 8(gpQ0 """"aADDDDD9Àr_r[!;/︕];`),*p HA9#Kä\Lbb=phb#H$係f#l:ٰʫlB@ / -&ħZXXV3 !((s@ P\\Lqq1Fhj/]Ugc6݈iFB+E.ιUfА 6Jmyd:EPg &:PPU`4 #35[}~~60DFd2hfSi׶5BH!6&-e|Ӵ_"H$߀i3w+LYUnP90uoa4V?#7f#77bdzv~gڵhFΩL15N(*,溩0Ml ˖NpPё[|+M˨C[?Hnn!gNFIig+ M ˯彷^s '>D_?ya=-fJڴnItT;v{|w?͛5d2qa^~e%91ؘZ`D"H !kN "bB\dj6jA-#14 -F@5gkba#4A`` SPP@+ycjJl%REޱtUkhRd Τ ǹl.8B~9%6;ݺvgO%/-V.tcGt'K'l6{bÆ X'4 aoӦ7LG{Z~XqK$D"nl6;±"6NZUr5Ct0N1og hBb^^yqAlEM1/=5N j{\1y2w]zLF3ł^u7,f֭=2 .{cO`⋯e䋹;\v_}CėԞXZx՘L&ڷkM^^>1&Cy݆Bh0ciݒO? wwlֶRK$D"7(ʳ(_wEmxo:YJh;/6~mBiߐgP/F1|K,bPPQ8lwe AaQ!HHHJnnm>|[2L@B|٧r81 KO7n!$$CQ}>B`W\>`2ʊUddfѱ}[~pN?h7b4ֵ3BNn)LFvkA,uWOXJJJHNNh4֛ S9kIm/g%D"0|ich`foG4l陴 dbI;f/tE1ںGпPSiٲEEU;f}:V`lZl*bBh &R6JJt!`6-'Wu늋\0j$S&__~W_'(Hx!`P0ǣ輷`Xz ! l_wjD"H$Gf-f^#+bCP-cCX6Da>s;-<P t\ߨvLBB"Z"66`<7iiiԸnΐ!?vQY滀*Y"H$ TXʣ k6޼a0U{"|cC~fsdS5 _Ħb+#4 EQ0 X,D"H$ڣvB4;si) k3_-, @1c4Vv{_#lpx"c'H$Dr0 "m.`pP-M6 87@6U[ ivF@ld[]J< <%AșdD"H$g9y4kЂH((Mxs_Ifzo4Yn7Dld$62;nzu샵ʑCd椣XK]}7_~7gs\+2uCRl#C#hW)5]/*@ͩ 5""؟h`ܠ9f I>y]~}'ӿ`44Ò*P]m-9y;FMh۬=!Ag̍c ԛ/u7Uߜq9Ș ICb@CàόPZ~VX@.K^a.`ЪI[b"l%KqV¾{ڦ'QѨBzFbYv,w^|+O柿/k\կl7EƼB8S!TEAv1D+hWJEm}F7b1RTR*TBDh H>yLwL,>L(oאmg@#bǗo?_o渜}Wd MhhB"4EQ4t@B:=z6&  BbȷvHk/k$ % Uכ-;׻/u7Uߜq9Ș BE ] \=EB.Bgµ?歨` S†CW񲘃JGMPU/|+O柿/k\կl7EƼv!BOT}WQ Mvn)!OsHj,MFyŹ܈3C3^K]}7_~7gs\+25Chz.OaP(!4@g~AqN;iANN.'RRi۾i_Ƽf8o]visatI>'Аjg vL{.*۴i-$!>&2`@}1\e4m•W]Ihxh%57iżh+uus[Lr.F EvJ˝ _jٶ3Nr'e)*,Leٰlf=sΣ_ݏlΓld#BWO]qo1j{ϖsZ:µSѧ[? ng¨ ٲi+B{=<贴_syՕLzcl5MȚ@z>T2K~^X*TWyMn3Xr yy.{!TTn+5%=U=v4PyE^~>eyyyu/-XG}'>!A"q}ݮ:zqXQK6pϿ0ʹj݊nF~+KjԀ /HHHpT勦i >`=D3a>kf%ջRffd|摐#]e ;l ѹ¥Ju?^&]vQu6ּEBs<\V?x47ϜIk_|C 1jx-f~~Wf͜?l;mmTi:徻j͖7dыyc-605i 2鲋/~YV3K3`p ?L{)6Oƍ oM6ToyۯLHhHcFHsL*q7O&}^6VWY/7-f.xZ4jS紬,.xYFbbէ'W_{%-[tv h߱p ]u?s˴XϾb|''x΢#OgȰvTBBk˱Z@Bb<,d.d"ڴ7jBM?y]{t%4,FBs;q Yz>9q1\r@9¢Bv1|P\8r3 9ttΑMC1(DGEE&M4h C 駞fsس{ÇXQL&7ϸ~,z{ˉ'yo⮻.nhbV< 5<<ԓ)l6[ʕ(..f{EQ߄ViŴyWTˆ>ekk9hق')tܝIܿWlU2zuDD#ѸicN =suF6o3g5Ӯɓx⑹'s u^e%_|kOewc6.hӶ5Qb!q&3#6ڟTFs`@]eg]i r/k<ڮȟo%%%dgeWO#x2.¥ }9dg0[`(|mZ$5䉓!xn^xyG/X q1#v#0 ^We?CL! 7fUgЩ=:Q?WshAG|DFӺmkqOc)=&'O;~bm 1G\|N(.RT\TNU%f.2lg}{gˮhB0 GŁxb}^\u>>zGh">p|O7o %93ot} ٺe+oo6?^ڵkx9{n~c6}B]N %--eK;fжCڴo͘ Ц}k˘5sfwBSٿo?;f/rhٜat?um߷wL=1i%|m|/Gѯ@.{)?mUj-'1pF*NʲWQ ^_B}iҬb̄ \e쪍׼QFM%($bc (%0dp؆mZpHhOmؿOWqlٸt\`Y&Gpbc;&c]e~w2}2kn׶nCп Əț®ڪexs ;}r˴[IIIqO}ݹ/*zhÌ:=q~FTLk1 !"JMl| ѱQ;Ka$4cԸ{~m߆{ol>ڠ!غy#]@|ѕ!\M}ڛ\wо#IWկ10`FEN)V++WrՉ9ݤ_:N}/spm;~8;h;A\yTS5'BL\4]wO=̈QÙP]+DDT8Z6ֻnFh];Ch*Ж=ᷝ\uot3&HLJ$33sDL\={wK'g+/!}3P{q&&=qbk1t';#4_ȶ-ʍ[U冏?e⨋} ϿzW3i% ;otW]8Jw8/:.*,Z;nCҿ F7۸h%1 G_LVvkWɴoVecIO46mDbR"L«>`2%16l;(g+> dш*%rE ^7HJ";;UI K&M?iO<%ݑ#ѣ'۶|7V1k, ۾W IDATGbUh$ B@MU+W3k,zs[a3OeNHڶs ^[wͺ֭Ю];.RlފAXXZ\LM8.Zu,?|#2f 8={޹TֆU/}e{YbRSNxl:ŭo׹=ysjvΚ1''{dʗx 8oz"+,]KKiնa*~=lxlF؉c*ſێ1x޾S;rNpX2l9#F D <*vm6*;2)|74oU222㦻/m,zivU偻FQ|n=v%iW]75V1qcǹLݹr>CU!#ǟ]̎~uD 4 ȝWҫOfx'99_:4}xRSCKO>6o*YY4nژ'_kW ]UyUL~51dddVy8r6}!W7Х;~'ynWѶ}n \[Yؾ5W4W¢"|)n}g%,"wۙ7w!w{;k?ԯf/|9=Y|m4jҐ7~7^AJJJ~LTYZy3c捼-=/aB_xǹMy!*CTUjT:cbyrc`8)f;uBxwENzZ)='?VW|& 5[u9ULrr2QQQ [9k'NЧW7iN&_HKOt7oVeVkepQm+,, //td#227VelT/qu_232h2zǟK~҄~Wfҥ{g<)Std~s !mpt 5|7u}\m$ϵ7N%TF7qMұs5iDI >>2QC:7_|QF\:?Qef- _r?m !{K.Md ;w$8ynl\h.2""#:*]i O\| 린7e۰qCbbcHh ld6(J 1)qq9FiSn(SmadP!̞y UO_t䉓dgp2$776Poʾ=عBHLJ$2*˦\BtN9n}d6a4ٿO~Ͼh K]CdT$Q4iصNQ MK؏^r-t-duǟ9w@_ ֳ+ 6nl6TiHQ94gʮ +3ӱi<783ɇhٺ%BNeœ';9! >jadedy=Gdg0H8+'M%44=(8ظ bݻ1 ;(I|M|差==7+/Eh߇P -ZӘ{;ݵ1j~(:&)L滯fۦ qF$4Hb p;}VCLl CFGmo!9z#G 6> *kl5vsZ ۊ Xڑ rE %%%MF >:_'%%a0DDDk!,|=p!5jmW/4Y"5x?|n9e/VW +2<"S٧mFMlFUUz1n{|إO-žL=<3ΚVJR$'-FMo~N|X&''"rHlնJѧp*,_E1QtٕO} <ʺZTcʏEoРa"ݝb% _iWo?i\KQ,_EV+MVmZ 238vCBFzUf-:Un+D+V,{pTG]EO am=s %,,u#KUWv ]pX2ChXCG Zdk.hk嫫IINul%hZP9xe}:s๮6Kg*5^$!j@OPzP6~{ۙVs~(d ٹtJYD>Z>j?}{IxDc&\[!59K\B^^>FEGtPgec IVO1|_~i4XY^~a9>^2f\Z{=7#=`]TJ~~>)4m QgHrrr4Arr2*O7+mb;xח ]xx3Ml(|]>(0]:0jH.=MvglWm`1RT\w[K_Sl-qɥk\uhGNY̚}7;zsz7Lb2>3ظ8Zn'ֽ͛7c۶7qz;`89YֳKK4 1sw&?<ѸI#hѪyk:SSOg+u,y96oX!0Jl~Gm✭&MpTxkAVo_k9◟v]p!9z3oFMѩkG'bAH=ro4)).vO`P`;ۍSeWئ>6K6_۸8+.> Ko y)sͥ׳i&OzU$]ii?u4HJI&bbzڕ|,Y=r"`qͥc0GBh!?/k  =|.; ?zC_a<5u(O/uhˢwǃ2~R'P$ގoOK.zMꊉo~,ҾVYyOQ\311cPvU_6;O9,Ax<7iOp;Oj⦷D5ϡ9%"<; LQTXH=>dO>>>a $&$8z/{x NdPgзw?n: sOsٵ~¸(s}IlE_§Κ8Q=Nv)9;u}غiiii9AQUTW7_~c9r^.$&%0x@rOK+HNN=~EcX5rWOܜ\iǎoټa Blް1./|2Y+k_*llUmKlȅ]§p>¶MϑMл99?ʨq#4d`,_*]{v/gI4r{n,Y"B 6ǒy}J'ʟx?vv7bUU4 FқrI 6%))>|Z~8ƥVf5}f-rN^MвM 6`kk_tC$4a$>%'Ndߞ}4kٌVmZ9!mCx]WYBp!VBBu_ M C7ңʉ'9Q=Xg-++'<|K׾ d[ػ{Bhqc/UOE&Z˫$Ӽl{hnm>#x2K/C=xq"$ٕ6_I~~>1QDEG{;jH6|)o'8Q= 5+W&%%~lWݕ}zs?GO?8z? [g*BUpфsAvXm+5%=,r%Bkk38r/1|p6M8kݞ}=dzyd2sqylkԸ1_Wf}}lxk}_~՚íKAS7ΜNR$>~=&# h BnߚO略+"44]:8҃B"Ţ*_222YR`4i޺O.|uw3KgwIhҺ],]lyfLz6I"6>-` IƮF?%wdڭq7g^wlǼOtKyM, e]?ބ4F䩗!4ATLdy#㮛!?/Fq݌kX Jl4i\WUUq)s8T/^qѯ8_0|,xٷ y дy/W7q#[ﯧm,\6'< _nGhFI7_uU9<|6}1/`ب<2QV{VqhyɄK֯1zk}bDL:f:tnϼOc sm`0E]xhѪyRulKxOPTdXڟK^Xῗ[zN^yq؎g_xxjc ϦOdK <>4ʸsY7| OӦԨѱ<1v)^]S:eC=Os|5 \DtLs?egeeSܺiVNh6f -!=yC Mf MA:XV[FmGѺi[>gŸ#.fqNF]o_o*.v _$,?5*77а*,*˥5d?7?bO'5.W}s6l"c^3"#"H=JbFHHDnAa>'OG{ h|ɩGINAG~kFzV/o?_o渜}Wdkc(|XUն{sHkPu2,ӳӸzܴJ8NZR}yUU"H$DR1y"%-c'b2m5{@5 1H$D"9BBN=s(A!sH$D"H8`1I&=:@H$D"u,$7$%϶R K$D"H:E!nV dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7@H$D"HܐY"H$D"qC dD"H$ )%D"H$7LDRl6V߮H$O1`20L(RiBk!(.)>Cޝ}X,F\߮H,QT\DVN)iˮow$DDE߈ 1( &U JEVDGۮ84Msmm;_{+ݎFuॼB~jVf^VAGYNfs(ob _,?f#;'9@]P.I$OI>ɞCd !!:jZTn͒B_&xA! 57!)R(<Ĥj5)OPNM T:^&Ru(ǹ8ĮM|;TzT@;k_ m}u zͩ΁p6hFrq)%3]s"3-ҾEvG"H$~LlT>Iq +ȅBB"P @SpBѫFR\*(YQ*Uc&ף g4 VB^6\*5K]4;V^CT.ۆFxh$;`1R KS4rsk'g%DR5o_U,ڲ-uT!49H? 坂-CE)N욣 ᘉv똑5v/յ{zE+3;G3u5G=#? "H$S&fS۹r[!: 2i^(ZiKk YRQ e)e*;ա=l7@OPW:dS)gT9۫(quUToπ(4uJ\byp9g|KEninu{ ۿOp[?Xȩ4fkϟO|||m}eݺujjWaa!7t>VEQQ6+VモX"rّ,ND IDATg5TTME*cVt]ߦ6*BS *T;!T=CcWU}z=*T44TMEў#4^fw׷Jre U O%tׄiЄv;MS5XH,QىnڵL4ɫH-{" Ʋe|룏>"11޽{l[?8W\qvof4MyѬY3kHHH $$;vZ6mڄ(^/{hJJJʵתU+Ν볟DR]b .EU6a/-BSUصvG=Yjw-vU߮Zͮ iUp^xbeTop~SU2$<_/Lpp%WםDDөsGf|#{v'TGeWsMˮ".>Kzԕǟ/20m^xo˯zTƛﮡ{,(I Ke6{wyVW֮]ɓkն7-/=z'ʕ+?>+Wcǎ;v|.vźu눎f4nUW_wacٸټy3ƍsc:T#!/H$ե 'ziSͺ^q-vDDDйkgny]vڜ(zsͺcJSs|||ɉRJʕݝ֭[fy[f M4I/@ ib!|o\dJJJfG9}e+Ɂ}!= `I"O.WH=m}K>"-* Λ. b`OR2N,+qBUn*_g ܈IT>X*U^ mNTTVmZXzyxxxၵ5vvek[;[Zl-?eЩ6dPB6AiіC} CHܱS-O?ӸnSjDND=H>N`]%kj?jhukgܽ{t4LhaC {[z5=z‚۷oFn8<&Ol۶DOΨQQgϞMvv6l 00@h".]Jll,cǎ۷o(7os%==˗/K;tӼys:uľ}={бcG,,,ekתbݻ8pCqu F eĈܸq &|rlmmi߾=ь9R ر# .d…<|Dۀغu+YYYi%jG JJB,̧ş$ vWȨ1ɵXdYˑÇک4aP#F@vWK^| ˄q=r4$ 8T^VˬY4hFp`]=$rڛAѥ'gNRKRKRt2QȜ=!ό@6ˏC*&'9ɫmЪM+[ eU\b5;;{bq%䯠8~qǰ>څgͥ[ٹwńq[U^]G~AGj;IRR\ˎprrڵ>tO&OS&srsrDy!~ރel۶M qذaLělIzu-V}WW\\]8x+UۋMVVB͕ /Uť<y$҉˯G~#TZ/o/W-_E.hJ3;wJ.+<[lS] oShٲ%θlvYq'$$pQU geeBͶՠA-[G}?W`ȑՋ֭[ӴiS?^=!!!X[[{n;Fjj*Z:Zh+aaa\v_$I&lݺׯciiI-ߵ}sAC~ǀ5o`ٲeGGb?K &@R $P=smYWX4K 샽-nrî m]0ھ/FyP8 '%.q׮Ak88:persqI7mH2DDDAݱ&''M6k}صkcƌaj1̟?7or:u0~xvYEÆ ѣx_QnmB^i‘Cr<Ty ժWc,%ھɎ;$;)HIf4ӌWD;)OKI,2o""'''=#pusYj^FF4ƌbGcW?mV `!:pQyѫO/6m/{KJ6HKc8{5Ve%55l^ߛOsST)F~X9 ~Už={LvB޽;iii9Xnܸa$V+?zVk\Jv7&77W~l~1ydaϞ=j^bb"gΜ!++5j`iiIZZOƍHDZHOOG$T±c8s /^Mݷ C a˖-\!CO?akk.T,l pqqaʔ)l޼HbcctsƆJ*pB8@\\'N`ŊT^{-WZmңGW^ _OX95(ve([OowZڂz 9y,QίNB|zx /wdE"M rCQh҈FMr!D"+m۷a͖U 1+U9p5#k<%N"ĢxXZY2elii )Z~0eN?r*~ׇB?{7nr4MyšC0S޳װW4XƜG[s E*|2i:III\pI xlX;vD8nKܺy Yy9e2fE'`ԨQC]pԨQ+++^z%-Zqww|H+ƍ#77zͭ[ -.\@nF̜9͛ӦM4i9smDXXcƌQ1 \r̙3KKK:wLV !44hπ6mJJВubQ̞=z쉅/f…\r۷oSfM4hqssܹsۼ˄ƍK5jT 8X\LRSH4 t:fvͮ9hܬ1,PΞ>GԾ4iޘj=?UX+$Yd\!++??,,,HO@h$'l$'rm.>dre$Y_='$Yf|1k_W~ V,b??DjP//O ghU*B_;w~z|>ȼbkkCwى&1{lƌ Sti,,Yd!?JXpuu%;;}r-|ܾugg'3r~ݽ߮ ;; >Ϛn z VZݻl!!!:ul^ŊL-?qDڴi};;;,YnŶqFƌkf圁ɓ'3y[[[n:{>|9pIڵk?-ˤI[,֪UKݱjժ1lK.5{ߘQF)~J@ A3p"}6[|*x3`HIwr\6M˒_s/.5lmJ#ʗ~z[Ѽe3Μ:GՐeWbtl\֙}SF54 |Y ەX[[JS&L5 IxgINJrJ>yRK!Wc9{ܟgA k\޼S+lڳ~!Q?h7n``O)R\{ϲ_X3iGY$Mw.e]ߟ85ߤRJ|'Džaqqq-+V`ڴi@ 빃Mvk-M@UYwqyZ5yoi++'fŮ`AY_pZ-^É8XX{jɵk׊Uk׮t&{' @9Y8ςYG,j6I_ @`LC,{p! 4Zے >ms@q;">No@Md ֶL) 'O$@ :\$mDx+++l-챵.{7K*^ @ ^]@@ xyM@ #@@ Y @ 0Bd@ !@ #.<,zYxFNnοduik흱{ڦ,x&5.$rm@ Q:Oo,4(8U2zJޕq6s FGQUlYc|_AQt\)(`L|utLy ک(J|]jY10I{pk7R΍2OW$ ,x~=bn\ ˺?m@r~2篝ֺ =`*A*~^qwDeM# :,녡b$$e%_,ʲFca"&5h@1ZE1aԫa&VdM k]YWpNcHz+˲֫jE`{֗W }&c5zŠG{G|=(@o$ݻEM *xƥ+N=w9QedI' QW獶PEp gFׄ^ઍ=&}"5F/2F|WƪXX4o{EAˊl:4zQ]3]G{gbYB! ՄX OǭGO(2YeU4:mP{K*UKFEcjݡ*t hV}!tB{=:;Q=~W5 V(?F`z x,xᰰ=zTb6lK.q']:}GX <уAeYMVddEBR$$YB{Ekuy"+Ȋ,KȊVQdɤ,KpIVtIֵ#IH(ȊV׆_u2%IҢȲjlԗ~EVt ֤i#7|M"WѪU+,YRb"##A%[ӦM㭷*q5kzɸh(U/ܹs&5k%xzzҾ}{=/XZZrԩزe 7o>@ () dФh$IZ]//鄦$i*Z};Y'.%I&׉Zɫ-ښď>f\y4|Uƍի_j?'ϝ6GNNNŽ'NOΝK_^^)))DGGի$zw^۷={6of޽TZ6m͛7e?Ф}I{w)}@PR 0 ( H/BKapc0'O꼼NʒWLZdYH%)OMr|Ɍ`yLl5`7JVgbksaF ƍ|Uc@߁Lf~y Vw=)&=VFFeGٱ{Ə jHMMe. IDATD/%V|dV|I D޽nB(y~g СCԨQ[[[}Z6..___llle&m}h4dO*=vڥzlZ-x{{cmm7}tcƌڶ=ҡCppp`ԩj=QQQTX˽uV7:t耽=hBoҤI_U.^jժr+Wooo5kƪUٳ'C 1뎎Ȝ9seY"'%%Qn]MryO$'Hzop$Ik $>+%v utaJ慳*/_*U+qȲz/rV:NF >5O§\b) ʖ-K*Т+Zk}>ߤ\reqquv 3?\NnJ 4eߓY4lԀ'z o&䍎]i܄Zj㍞,k^=5֢CX'bĨ? EZ X ֭|As*ouC͗_!otke94lNz!|:3$xcWjDM9tPq_V^M=ۄѭ[7Ο?OxxI,۶m#11ӧ3j(bb_ٳg '߰aEtRbcc;v,`߾}|DEE̼y;w.\|XﯶߡC՞͛өS'ۧٳ;baa,ˬ]Vw:tׯ3l0wNhh(#FƍL0˗ckk[6ׯsrrrXb=z;\jU{=~ĉY +/|z\iM(``劌>\E9|ѨNc5`$) mGpՏ˗JL7#G_,`ү0@\f"A32!h\$)w4 jD.=9sꔉZuXN 3b8i 999TRY?axڶ ڴ*vKno˾f>>&;j8::ELL vrr֭[憟_-,T{,,,ҥ v"77m۶ѥKʢ]v&sTre<==૯lْ!CШQ"B iX|@ٲe)S 'NdԮ]y˖-ȑ#… ܹлwoE@ W(.ET CS1(#%Y&'7-b`,s*,azEfPM~52|06m@:p832ߨN K8gO#W>q^=v1zHLݻx=BۄG7mǑ[-N*r?IԮs1glWSנ.i\=<=Hf2];u#F=nș3g*U 4:|+V߯MT⏍ - xzzI=΢nT{;pɯT[\x[ckg?K,jj3rStڅ{n\Ann.>| HlٲOOOu\bb"q)Zl3$''b8z*HIIQ=iР˖-㣏>ߟիW0rHzE֭iڴ)Ǐ/Ԟٽ{7ǎ#55VtE-T4Օ0]믿^dYxB&MĹs0a,"ܹsɉ"MrH0{4kKhޗ{{;}[;[]6Da}5^>pp6OJ]]#++ثpptʥ>4nڐ2elyqqؕK(Ďw)GoQ ;w|c$Y1?_"=<3ylߵÇ2͚{!;C1Ϲ};sm:'_+vA& qvr"f ={{{^ m3md 2Ѕ=U^B՘8e< ~IocN$INr 7hRM4-ѠNrR$K̛ ww\\,|M1?.v۹l\BMΌOsS)یLx{PfL z@իmggGÒ _%U?f9u|4Zsrr"9A2eptt`_pi^>͹+gشunn̚{"9)Sg瑂_g-ͺwNZZ#G$667nh"IGjM^*UcnܸAtt4E_zc۩׏ɓ'MLL {Q9s YYYԨQKKK8}47n@$jժEzz:$QJ;ƙ3gx5ڐ!Cزe +WdȐ!Oڪ  #;;A1|>3\\\2eI;wOTTzb,]VVV,^~RL*Uİa/<OX95(ve([OowZڂz 9y,QίNB|zx /wdE"M rCQh҈FMr!D"+m۷a͖U 1+U9p5#k<%N"ĢxXZY2el3,b!]o@_L‰'صs6$In]n`ߞ}ڛ\Fi7ƜO琙IvV6,c;N&xwPm=E!"%Izlk;ƍx}-wᣪx̝~?Ν;\8Qbmc/iV~zjԨ.|`\p`jԨ/-bS|y$IqƑK@@{֭[p.\[n&6͜9͛ӦM4i9smDXXcƌQ1 \r̙3KKK:wLV !44hhڴ)*URCK"""ԅE1{lٳ',^ rJ*v>}رciӦ65jDΝeK'!>7os~!c.#2?!2[7oY BQӵV,b??DjP//O ghպdgeӴA3J.Z0d`ʕ+WheUD\tt+K.Ͳ_ۘC[ӷW>x= KXxs>ây\ I=XYY1r(|9pIڵk?j2ij28K\z{6mRpB ;[?Mq=WwWYļcckOo ;NSPcYk%FsMidY\oT\h޲gNzjȲ+1|:u6ip.LϾݩ^yK>gJ y)I03'ϒL媕8},JB%brԹ?='ς@|DyybWشg-:C棌,AAbꊬ%/ȱ3HH\ʺ?qqqj IJO= hXiӦ@"빃Mv&j+++WoObaagosڵbڵ+]vGm߿@ aaA<γAeپk6I_ @`LC,_,()lm\9@ xI˸]~BIzB (<ۼ ,xږ8e8d_i$g'_+- @cee=e}&qIŋu)k\ܰQޣB˕s,˃(S_$33rOy%BP +K+Z!N$mBeN?;vuYLO!/ yRyR6E n@=bcHLLxť+u"@ _ O7moBw%@ !@ @`@ B @ F,@ !v塕~t@ ^l,`eizŃ4rrs%?K[h6EdGvN6wu'?ms@R֡,^n>xxc@)ĩ;T򮌳S4?b ;JAf磯Нm|O fk(NEQ W*(Hڃ\yrn}"Yd E^^s 5hXi$g;94ep/^SiR󪈣#,n ^ЉdY/ #!)+bQ4 1AA*A kLE^ 4"kE^XנȺR{htBCҋ]Yķ^U+u$P`0A+u8;͔D!%-jP6G 0.e]qw\i\ Yp($K:hp':o/6_8k4&WmT5PFVY5z!1g2V*ƢY#{/z BXVdыꂞ}((8;p/ߌȂ p&<@ x2>n8z@1Ȳ,yh B[W^2(W~X7VT&_@D꣕ Wى5x =:-mܿ|oF)G6 ճmSFd ؼE I,#)Z@4h;5 1Ubڸ!@S 8L  q5R(pOSЮ[JܤhVTMCB @}@AIx熬Ȳ_ _KQEQya ( #[<W"?85Y*痕 ؂buFv`_WE/&pG6(k^~,xF(  Z-m+WbŊc}~&Ly ЅXH za&Rnj ^ZFC:.P!l\q9*o͏οF0m}à Jp 8x sƍe˖bѣەŰa(]t>8rO'z1Ȳ,ɊHH$K(zh}.OQdYe Y2 ,ԓeI!iJ.ɺv$}9IPP }YPk]\~_!IZYV퓍QtٯȊAԚS]bڞ<>m@pFoiV0ZjŒ%KJlWdd$4hРubڴi[%fz-8wn޼ڵkcgg'ڵ#;;EQ6m+V???ƎˣGh4fOFp4hj'ť8!,$P^˓%Д$-Z%?_o'_4ĥ$iդt:Q+ iIJ^k<]Io[~:_}[`N$dfwSgܻDѰlyglzA§`!2ҡSB󜝝x!f};rssj,Tܺu!Xa5uQoݲ9QaV$B*cƍ_/NQW^os[8qtܙ~DO󱱱уptBjj*Ν֖+V0g~IHH ##pm۶8::bii'Yz}yf͛W AI(sÀ.B2S̶5S'O#INNN ɈQ+& >0ך!.l]}mS`QYyvB6[ r-xt~>&X<?3քp!jԨ-ܾ}[-/666`>Zc׮]W7x{{ӧO@&7f\]]m۶ҡCppp`ԩj=QQQTX˽uV7:t耽=j)Sp5ػw/gΜё/redYޣr4hЀpyԩ+W&44:ハ兏Ӈu֙qܹxB_o@ /B2ITȔFs0V~C{QFϞ=l5vI7l@`` .,bѢE,]XƎÇطo~-QQQ$''ӹs璞˗j:tPi޼9:ub߾}j={ر#ȲڵkM21*UO?eo6l 2M? IDAT;v|,$}DGG3rHc\\GRRRY7x%%x!Ok@{;+WdԘZl,tԍFu0 IylFXh;ץ~\Ve¸9ICX^/j  DeV,B4#8.VEr9 zwMàFғ3N%)I֥c):{(dΞ.C7;SA=ԍG߱-ײM(+bUdff;(iuoݡ޻{.O?F.|>k.=ν;-&l݂ǵ? g?RyHXZvކ#׮]#|2y2{wC'|r>|Ȯ_vbcn5rFF۶mSC6l؀/'ORJᡖVZзo_*Tٳg|+++lll)V/fƌo^ptt$++UQĭ[HII ??1[XXXXХKvEnn.۶mK.DEEEvLPJ5|p*UDݺua/_cǎQbEZnMݺuUOs9tׯ_J*tܙWu",,˗:֭[0`@ 8X> AE1-29lٴ{{d+WQd [׳.r-5jۯL8#iUЁyAF8u>VX9{ߟիW0rHzE֭iڴmBBBf;vTZjPFC޽vaaa&K/tRn߾MNh׮'NI&lݺׯciiI-8x`֯_σXz5^^^lٲXuRB$I. fϜCfmiV~`oo/#ckg{y<ܰ+cæuh>ǃQc?@&IIKܵkdee{\tG<~MR-=">.26U| E.;-ʖuas/]z +KRg⠐9N s>e/ԥ##׳z*>¸~XQիaF$IM[ޫ[amm1TRdddsN:Lz;//J.M*mΝ;_/Q JNNЏ^-Ν=Wb7̽rʕB 4 y󦉇汅zE_f 7Bkgg3񅎡o߾\xiӦѯ_?.\@ҥ6m챴O>DDDAݱ&''M6̅Ɍ?3f0k,Ο?X[[[&M/w6dܼy3g/-HqqqaժU|bf@SB$IXQD:b06`̘=U#Xr$Cun%[V/o/n&ɉ9|(ѿNڄ҄#~x rU)Y8K:}[w"I2wS@:hR4h wS8&Y*dޞwqQUm,+ % J咥UYfګ-jJ{[ZfI{咙;/(";s} fby}Npyι93ysϩS'E& oٙ)&G'J4 WG2)2 GDII =~{1lzssXd>zt#5%.薮rvr,\]]+tYϫmC4eK:/ɼyy+~v oeffk.,X0`SNeر;+++%Irqq1j2 ` 84ZlY5k5jOÆ #** ʮ]Ժ'88KKK9qԩS͛#I,^'O舷7#Guٱcv؁"%%%_6mPTTD`` :}eҤI2b<ȉ'8z(:tښX Ғ`JKKOϯZ%*3f ''#FT@ bq;(]m;\6A=FAO =..87#1{l:uD׮]СZwIu놓ݻwg„ &&!!!2|V\%O>$ú?ر#~~~jjItt///f̘ѣ aժUÜ9s"55UVquK bܹ,Z޽{s}]5kF۶mضm~^z%rrr6l...n'KuV\–q4o`MqO;i.RpRCe:?KNamAعc#d+W9."|} ''̊e_BjΞ߹yyLxmƝCe^Ķ;d-mc%!_=A.))a5e<>3/?_EQQgܙXZZqITpՇ5jԈC5k?ydvJݺuMٱl2u) 60aq% DEEUἵ5k׮5qd://m۶o߾ v'NdD;W^U5Yx cFѣhѢE6҃@W;#nn|4)?[7yj@yb&>kW d󰶩,KqMPJJJprmaN?M&Ȳą̙6883p7AѰx>_}kkkȤiiyګJӱF; |P|)Ξ?Cd;Cj~]VvYPƂuhZ4ۓ6(hŋeׯ_?2|p@s%,ȽA’Vw*XUu: ֶ(j@ d_Ʈg# ; }|P˼ w+K+lm^SNb@ '':IND$",uֺ6WV`@ X?`M]'wm).-хܼ\j׶;)((ձWB +4 XZaei؅M ( R6ẖ3Gp.y#0tZiW@((JJ5@ sOJJMFˠP|,B @ E{Qݫ!zW@ B @ F,@ !@ @`@ b }Iii)ZIL[  VVXYYtBrQr.yú5մ+B ?ns)\ϻ^/ԫ덅JAQ!W2n]4EQŶ5Eɕʹ+GFm|N f5Tꧢ(uJ%c*a>ʓ{NmۚB +JKKsK GM${霹x[xzTTvn^pwDeI# :,녡b$$eL,ʲFca"&5h@1ZE1aԫa&VdM k]Yge8F'1ؕeH|UQGbL@핲/k&c5zŠG{G|"@p7JZҮ]~5@ a꺸hxyW* q$K:h'hR&L8k4.WT5FVY5z!?1g2V*ƢY,z\&z BXVdыPPpw&>Xw!2 5c@ ܜ 8pb_9Ȳ,Eh˧B>ZW^2(CW~XQvES& "Xʆ YHDކe^6hF)zl4jd0Fd}XE f,#)Z@4h;5 1ɻUb֐m)l&QF)KSPbGD);)Waz%nD4+sSKB @>B V熬Ȳ_LIQEQEa ( #[.*lQk\oFle|a]>+͔mUm8#. p,B ;,4)¬Y>|87Gzj5jDxxv꒜W_}ŤIn@ st),^Neɪ&CWh(FVo̭QFYUrۡbܲc4W0:oԽb!Bi"̟?ww uaaalڴZ(..e yWU-EEEfʕh4j/nA ˲&+2"!),裢e絺:EFdEB%dEB+K(HdN%]:E+I"v, ) ZdECu:kʒz IҢȲlt-E篑4(~Zvg<5Ȃ袣y͊*#22e˖ݲ_7oӓmr۪>}:>-oxgٷo޷KKKx'ؾ}ĉFPNڷoիݻwcii+i&4 <.@ Ub!RE+kJeE Z]-tBShz2ѬUVDLV'%YF+z+%J:_t6޷" XuO[nN$dfʽbQy@gxQr1"#ċύ4ixty1 MZMˠ<(MZxמ̛=٪իkݑ`s"#λ6.\BGFg?fv,y oWCpTr 60hРRtt_9nܸQmqoѣ$%%ORZZz\r ?m۶L>]̤gϞdddp^xFHMMEe~m%IReddܒ_@p;Ta@bQNUQ$Lyf(6'?vx;vLtU$dOUZr>B\he-"!R%3U.5_ިHZmυ,"ȰOwpޞsf>>>`:8u;s?gYٚOmwn孉or#ihdeeon}iOzziZIIDڵyV'E~G`ckkKVrj666dx 4|_v~IjZf͚7x{{3d@ɞ0annnЭ [VVzMyf՟{ҨQ#(-[Pߔի{=.^?3'OёgϪ}:88Nhh(QQQ|L67779r$:ub׮]Ѻuk>́6~-CzzR $K0/\eIKKg;=?ɁHk"D\Q)-WYv*-I1ѥ}(U[0/@OOO<==h488ǖVxzz29jg|@Jr ߜijCѦm,,,pqqA<^k/Յnui2ƽƅ2uѨО+@mOi׾-7T~oՁMZSY:!493?@J>uzC!}oRݚ5kxgʕ+tޝsf͚e'[n%%%3f0n8^yQTT~".]IHH7_~ &&?{ŋXp!999;w߫W/՟N:ѧObbb]vѻwo,,,eo$-Imǜ9sx饗cʔ)>|8E=z @~3f fR̙ɓY baTZ vv6;߸&NAAe- }0څ'v>$m=fağT¤&3~x5Zd^~exx~ h%̝5*5/=7T$p쏣 7v!y@N?nd])?/̙H}~6mCyOϛoTmZxSc>77mN:Ov5{ߟoۘ4uZ̩3lؼw@]|*ޟ5cvЧ3R4;`Ej?C#Y;vmck9ytQ.=_嚕G֯Aڴ ~Z5oVy7ci|nݪ8_{xzz6664oޜu2tP4hSz+++lll}O>3gҳgOׯo#訊R'''._Lff&B‚}O?QRR֭[۷/{=z̑nW_}???Zn Ǐr5 &i6lN:Qx]TŅcDzw^e8;; @pW*UT CS1(-%YFI 6n__$Y&Yfu-Bqa&Oձqz4m/J^~>mڇrq}Ω)іꎏA8p7lUٵ'O|Iɼz/!kw~OX-nT*hS;?"|<(׳ nYϓ&ޯOZҶE;NӪo#_<<=ߠ>ǹؾevL|m4lo#߲=eWᵱiσ=H~}٣2`ϥ] -OO\$`ӦMԫWO}@.%%J8~8;w777Uy8p@ȅdffҴiS}mۖ+V;Ϛ5k;v, K.tؑRñfΝ9r,"##T4F0x`.^Hݫu 2%%d'Nw!IݺuׯHݺuyXp! ,7 '''+@ 1QdR¼p7nKa/ No#ckgGycWۆk7ңgw=0Pݳvڐyċ),'E89JJ91:vm[IJLĮ (7oN]W>,..Ndddp?+~+<Ȋ(!332^"?aϻoWpvq6_c~y;;ɉfAj]nN< ggg֯o1bͻ%(**{ɑ|@wÅKEP+Y@ind,**"??6 C!|lW3u}8:9z,>6bBBBHKK#55$kccS!*o04h$%%U:CrYOΰaÈVZL>$ZjE^*Ғ!CMtt4 ښ7nqF0 =='2sLΝ˙3g*/$2mggGy'5j/!G`ܸqYG2baڵɩ@p'F!f$V<%^of|e4߬^$q)W+ɗqrr"YS~=GhٺtQ x(&M0|4۷$dgt)-Cˇymg4hHϼXnR%&R,IQ ey1L8ܜj-))a t09_ OfΙ?Ʋm Ù9mMl}ݚ@.{5S ݪvrr"h cj׮wΝԹ>[t{3wi̜6|RVYff&v2ɹ0`ٌ;.]d$򼋋j&g@@۷oҥK>|*׬YSaaÆÇW\]tɓ%ٜ8qK.!I͛7'''Iȑ#|kUɓ;w.t!9 ,I!\–q4o`MqO;i.RpRCe:?KNamAعc#d+W9."|} ''̊e_BjΞ߹yyLxmƝCe^Ķ;d-mc%!_=tII g|/n O.Cggx0@wpmVZxy{(#_y WWJ3^5ѫKժU_~jboggKnn"!"QC '/7{{ڶk@ %`>K/qn(c_Gnn.,\gg>hGAش ͨ\OTpenv Fq!sf'OL׮][y;;;-[.Ŷa&Lv3eVZ[[vZGضm`7qD&Nhrիﶶ$''(ϊ+*3f cƌ ..-了Í/ebckC_5td459yi4~ЏN@e :~^Ț)OtSw}˰^/RP7%0&|B,,,}}}MRV6/^]~ׯMN s"BY{ggWq[e@ S Mv,m,`kmK=Nvul*]vpO,& [k[dKM${$:NnHR;A@pױ[\JbZr@pa5uܱR;WGrr].z鸞Wǚ^ ,h4<`iv6p(HJq ۠1{;ݿ<2iԦ]YpP*R*ִ+@ PϽJBR<))7-BY,@E=wvCp] @ F,@ !@ @`@ B @ FU,%h%-2o* 4XYZaeeuu FɍݿZ8;cgcWӮ,(QDVU.gp=zM#{S7 J*E\ϻ1fvSPSEfWP&W ~7Ӯ}O@91Pu*(Ovu.^;mkV$ ,(--z5/'?v.5@ Q2s lkQSٹYz5Yu'/D2( ԠEƠj 5S X5eV/ukPdPbWe#WՊF2Wʾ :KjfD+iIvf!״;@ ↣N]@.,.ġ,!8jPNJ.2 \S}$}XQd腰X(\&Xfq5aYMǃF/G_CAޙba@W(DD@ps7}U ˲B- h^*zh _}bQfoF BM6`5F+R'd}$Z>"5kzΗExuZ.ʢ 2\tX>k^_~oFuINNf̙t^ʡCj @pPR,$YFHR)E"iHIi%9Y$IW/%n Ry㢻ך-Zm),ɒȒ.%DW/WQH󣼍$juIj{~&ϓ:o!]6HD…vCpT eW cӦMպFqq-UXX+BZn(**6+W_EV;9k&LpGiY/dYEY IPQѲZ]k "%d 5j'˒.CҢ$]uHz;IPP d-hǺz]ٵ }ieI$iQdYO6EVtBZԚSE/M3ǚȷ#Z1g\nvG}z駟6+RIdٲe͛m۶ܶ*Oγ>{}Yۇ-hѢvvvԫW=zPTTt[} AMS ]|ʺV쵺:Y[fouU~DN\D%]NʔjuBZeXTEgSV#FVSI4x>2,Kḱx͔{!Ţs}O|6_~_Cm6ckgeOaa5z>3wҿ}L>ڍDgݵk n[elذuoܸ]4h_9nܸqiG%))'|Cҷyf͚E߾}RZZzODVsÀ!M5?vIprrYH3F C,] siFX_lY!=COἊͶү,mho{s#>}9gzsl\3gYsfϛe"fϘٸ?K~w7{4Rp,?bmmMDD'88[[[Zjŕ+WTD|||LJ%Koh7_v~IjZf͚7x{{3d@&7aܰ[ndeeѫW/ppp`ڴij7oVٻw/52roٲM)::^zaoo@NNŋ888?pI9{,ΝCeƌCƍi۶-/z}ddd0``̙HRه ښƍsUKMMA|Gf_[@ +T/B2)eTʒw{x+V/ }̫(5D%R\GK%I-ZRZ_B]%U\[*chKPRQ~d}sMSOOO<==h488ǖVxzz29jg|@Jr ߜijCѦmh_NlՂF~IPpS>fW 5 Fv7nFd?؜p!,XJ,YBiޤ#_x5zT7*8qfͥSأ4{(W^|<~ӃhѴ%[u`;RZZ8;cx,;AsCW23xձ6oKGe9Bd4#"<*}Rݚ5kxgʕ+tޝsf͚eMӓ[Œ37njy(**Rmof~z tiK.e$$$o石w^Yx1 .$''sΑ{өS'CLLZk.z,ߚe899}]3g/^ [6meG ع ='c_Ǽs iѼ1$'`cc͏1;Xݷ>u'On/˯UfD\Fln3G?ʸW^"f.&Mo@`ǮmL3 3Lx?v|_\]]"04r~~>[nUS֯_QQQѽ{w<==U{7oNݺu:t( 4ԩSj666T˾|z'|̙3ٳ'ק~j#訊j'''._Lff&B‚}O?QRR֭[۷/d tY*~~~nƏ@:u8r5K.nZ4ٳgѤI}Q&OF-[Ɛ!Cyk߾Oaa!={m۶|f^m@ Tg ЊTӒ,sM``/,,~:nf!8t0QWظm=M6^%/?6C9~>WX~ԉӔhKuGMP86'$d^5;'c{ƿ7JJ*)՝AE|7UEGy^}ޛ޶3ߟm"5X[[cmmFד= 4lۓ`{vͷ}c I&j_KϏdҔtllmVPx0nӪm&Ң9Dtsr ӓ ʄS87ww:wL!ݳ+++lmm?KKKolڴzȥSiǏs8;;Fzz*6o>99L6mjm۲b yYf cǎeРAt҅;ښ;wr~PFx"ݻw7׆ |r\B>}ѣG5Obb"&_t/^qf^xCV@WF!"+J fϧx#,]_0{{;-u]m6Hx{2n@!v>uhCfU/^0 qpt())؎ڵm)..&)166jHl߼:u]8+ϓ? +KR{b@d xiԋ3?ԶOlؼ5/ޮ65%DYZZRA}RSR)**k45/mىU5tN&a;*8]$ DG=c'y+++>j9:hb$d;Gp}||8|1HMM5w666ԫo!,, `gg3IIIaС={ӧ3l0UӧO'))VZѫWJdȐ!DGG̀ƍlܸd.̵HOOgĉ̜9sr̙ 6L:vi/nܸat||o$Ř`nʘ1cظqcK IDAT%mbHnŊ* ˣ_hfΛ_FH~rxy{|'''5>x[H~hҴ ߛG KnO}HLFz&Ia:|GvF̛Va= HU,IQ eqvvfĩ ɱ6MyՑL~{ P˺V${ckkͦO  0tkJteh 9x'^fprrb[U;g''LU ~mٹ iќӼ( 6(6l+vRRRRߟ`,--ĉ8;;SN7o$IxbN<<#ތ9֭[cggǎ;رcꃊ~~~~zڴiCQQۗI&ˈ#8x 'NѣtkkkbccIJJ"((l_M6fȑ,Z+W0k,xC/ҿܹ3׮]3(wޝO?ÇӴiS5D M.uA=FAO = cǎ%ꃊ1cG&$$UVKLL s **TVZ/ #((sh"zm/ 6PvmZlɀ5jcǎgϞ,_zMbb| 2zaÆ~!wbq( de]'9)-mேi*DnSg6Owӎ]$'|a!2ԉ썉C0Z IܱH̕+?OaaXXXKDGINJfŲ/HNJ!5 gYܼ<&6g!2 f/bH̖ﶱh\ 0{2i2tp~jbŗdg`ooOv?KU". Qӣx{Wf~0AH|z%vvv7?cƓ[~0Im{,IS&ޑqK=EW?? ^}zr92S&FOC;h4,_ ߛQ__~ 9LI!ֆ y~pGs*Dɲ>ZUYuw;u~O4 ,q|'"=-q),p!SO Yr2N}`oE FGVu\\\(((`ǟ']GPP\HFbb"$&&9w???}u0;ɪU>}:.\ۮ!D%ؿE7 IAw٫/gϟ!cwV?t{{;,H8ys8::.-|Gaaa[/^X-~ѯ߻#MN s"BYڱ痘 *f@ 0)`ZP9 ֶ(j@ d_Ʈe?l'= b7ncei- pwޥ]=JNuG'7$I[ IDY XYYakaum\K%1z9@ ~NS\Zr.R]IAA5Yp_hx +K+L֘EQ$mAc9vwɻyd2MM"CAT*T*iW@/{= xRRoj/0O]W7ZfY /R݋z^5!ֻ@ Y @ 0Bd@ !@ #@@ XKJKKJZd*:T 7h;>K)TRH@$B UzPti**|AE PEPBBh@ %z6wɥ!d޼3s{v68;agcWԮ,xHMOû܎E@ )Υr/G2Xh,Pr `*1>*`,˺Ft"Y CHHJXeDLjЀ"cPbSѩWMȚ,Qֺ5(pNc(z+˲֫jE{+Y_ c&s5zŠ{|V$&!Zdy޻M.jw@P)솃#;WBRHApB6ѫF[(Y"8KPjFB/pN\1 60zM aQ48K<땱%V1Y,k²"^TgLgCAމ[z,xQHJN­  ʹy ˲B͞ h^*zh _}beoF BM6`5F+R'd}$Z>"5kzgExuZx|]Y`-:zljd0"Fd ؼE ' EN `Ř*z1mlk6du6N(Bd)B\1dYd+[W7ic"ӵ%!katb|hB !@PܐY\]c d,)( (ddqڣE-}Qsըrd]fϐ#G6z{P,m gdEuE( &^Qf̘Atttdk,]Ç?1 ʭ[1cF7ٳg~ ^l]$HIDhZ$IҢf"I:;'$LmA?o\tcHHq{٢f"Z,tEt)!zȿEG"ɒΏ6KGW'VNIHt"Fd ##S'OD^2k,saÆVhRRRxw(YdGjjj,^#GhӢqƄȶ(] E,˺h"#+"!>*u^StmYAVtbRV$FdYҥsHZ+Io' "O"+Z]VeeK+KEe?h,E篑脴"5i(^gE@ ;@VBJ#$7PzaV4ڦM~B' 6,tۼ6mZۭX^{T}z<< ? b~/ZYAժTVW'k썣JVVOh։Kȱ׉ZLNHKVWKdjuljdHPg 7 ˒~ 50RR,<w>;{lݶ[=IȚ Y?d@Pr0`H0iSgϜC$Pc@@ka7M^(9r IPoS19/gn'd{4fssڛ|yE9plޞ_LW}||=S&H۱UV:tڵkckkKzsj6660w\ƌFQw;vP#Z3g퍵5 0нɍ;777lllСߧsΔ.]ҥK3e0՟SR%(ƍPߔBCCܹ3<|Pmgpmz쉓+Wfɒ%j'ORJӧ8::2azӦMԬYxWv(u>O~jժH׮]wXH&%+*Ybc`<~K4oJ{d"DQVQK;mcKR~ mtiJ_*s.j\ 鉧''g'ʒ?֮}i;o{Dj4uj_3DjtJ8 } S?_ؾu;RzCrqntz%?@|\<; mٞToMvԪZVڈ-_>}`aa;w W^\t3g|dӦMDGG3}tFMDD_gfjժK7o ,|{{aѢE߿8[̙Çz*ׯ_g଴Ν;hт]g~׮]t dYfʕ& j?EQݻ77[oqeΝ;Gǎy&K,aΜ9xyyq VZٳ\~%Kr9N<mڴ9^1 ׯ]'--&1vuO...nlڴIMqXf >>>L<___BBBTmllL2 8s lll d=b̘1N:Q\9ʕ+988BDDvtt$$$NŊlacaaAٱc.۽{wOJJ ;v4Y#C{+++N>͑#G;w.^^^t҅ƍe777BBB ˋ*UB`` 'OTmT5k~#%%lK~}=$$$///Ə͛]/@ 0 X,Š1-2lXT\I,fjVN@WX_'p"L4hѣ~~^]vGcdw1j׊ nژGzFF #"`oֽ+[6Ýʾ=Mlʖ-WYKjj S|9zMm*Kx,ZnnP2e\yc0Z_DI)Q9}4|6 wwZmM;D} KKKj‹H ([z\ttt)>gϞu899F\\*6 k-= 䔔Yپ6l… 0a+Wf5~Ѷm[6mj"@ӬY3ٹs''NiFEobŊ ?5kBJJzLRRY[kkk*WLLLL®۷Yp/Ljj*IIIZ/@bSHf( (|,5@- zsvz[;[=\)])֭ZGN!tx-^<=}hԤ wqd_Ai}*i9y঍(Uʖ4"#+eCJP-a[p-7^ّA||Z5ky9&ʊE/S4oԂof}+v({!C@ll,111&^7eb )_<vvv899˗6m "<<%K2m4W;wKKK @hh(kkkYnZk_B5%--42225kY YB 9 *T`ȑiiihZr]/@ NbHnNJ< olVeX[(+BdҸ;xVۋ[qttV>xNX.Z6ȡc<~ T^5k0鳏~tЃ-!I2q DݼE4 lNˆѠ!>.!߹cQAEbe0|m;%s2::^esOJzeYt؁ڶl&+/XXXpC88:/? x_GSYBBvb޽{駟2j(FƒFɒ%MUeKll,y/_~ħA1yd*T vR뢣>+WvXZZȹsprr-Z$ITZoSD fذaԯ_;;;n ֭[UoT%##5kРARSS'00!C0uTh֬&7o/_  VGGGN>M&M]|7߿?4i҄4 UVu,--hKAS,+ee=سsgNgWQJV^܊exzy +ڽā)SfqpcϿO-QХvtԎe]L45F媕}TA"7=zʚkٶeDțOߡ姅t{+K#I.Ⱥ QQ =-=G˧۶lΝX.@;8#V$''Ih Xz5kVsyطoԫWڵkceeF5͛Ǿ}Ipss`ܸqdddG}vᄇӫW/>sZhAvhҤ OVΟ?Optt$$$cǪ1 ŅYfxb,--֭mڴYfjՊu7ѴiS|}}ԒPFE^^^L>#F%Kh4lڴ V#G|udffǶmؾ};L4)Sp<ΡQY &1`nEΎ&͂tJ?i)܎zZq MҵkWƍ4igΜQ#vZƎKdd3ѣGsoYvmyĶ@ dWGjz}vSz'acp"$ackC޴}`M:>Mܽ}?{ w؉S7ޙ '9"K GŔI|/w Ch4_w_}ϵX[[ӬeS&No2~B]^3S&дE0C^NPz3j8ȅYO&W/*NJcDv~%%A ;;4 .jWEbFSۏ2nDFFRre"##牯/SNU8΍!,Y´ir݃Y!@ (xڕ*݉_'Ȃ\m*}=@.9"g+yE7 d׳gOzL}~ (m獕ֶ;@ (8v˽exc@%85)(hEQŶk+(!W m]V=6\T%[sVeN4Gvp#e\)e["Yd Eff&#Ԯ@#gvI Ŕq\q[RxxĤT,N ^ЉdY/ #!)+YbQ4 1AA*A kLE^ 4"kD^Xנ:+94:!Ů,F[:YZod})0 :)[h!V{6u*[A1\~/7\rJZ K9"ɒN D.md,A U;GrM0"5F/2F,WjXX4OdEDAˊl:4zQ=2} {'"n])#BF!)9 "r,)^䙃,˲N*  ]6{*裥z%#1DEAew( ]4Y lHhOԈ!m8iiu]dEd4J>:nm<!/b@ >7YFR:hvjAcwŴ!@-8M q5gRvNݯl_JܤhVTM&ۗѭAT ,<@AasCVddY Xru/(hzMĭjF57FqVYv?C.7eCыfĶ6 ZE//{EQ1c9꒓ILL|tR>L((nbƌ9t >:IJe˞G(N׈@R,$YFHR&E"iH6Ii%9Y$IW/e%n RyCBRk6YjudI֏+K KF,8It~d$u^Zn>:Imd=uRMB21IBRңv㙠( qN` 8x f=G]pp06l(iii+%%wy%Km~ŋ9rH{pQ~O}v߈-O(u,$ב@_ ^ɲ&+2"!),裢Y絺:EFdE'&eEB+K(:AjN%]:E+I"v, ) d-hǺz]X!IZYVƒQtȊNH+~ZvžiX'r}ٽs7A^=EvnEߞ.44=z iӆ~~IÆ 6/MkYb 5eذa8::}LL _~W$J*ŋ YOv2,K1xfJqH(V9ogmT/zߠ>aWsuodffHŊ>ԟݻ oM.?effvZV^OO(ZBI:u(u1ɓ fʕS|BSBy]')Or r0`H0iSgϜC$Pc@@oa7M^(9r IPobts^ZNf[h Eوt-Y#.Pן}zi%:º5݃O>[?5ECn۷cmmMV]kڵ^zܹsG|||;wI_cƌAѨo߻w;v:V̙3ooo Ǝ666t];wtҔ.])S߿J*D/7n܈JΝI&*U 777ݻw<{,c ֖J*{nٳh45]!>>޽{cgg3f@L?pBCC5Zt),Y+y@4 /e˖5^zq?{7n^^^xxx:y$AAAY!ٯl_#'ORJz?>}쌣#&LP?7n܈NNN888ЧOƎKr就K.<|0_ {  b!hg p.Ҽ9p( wiKrgJZF%3[13G].y-I91ѥ}(y[Ⱦn>Ϲ)6y˦XXZ2iD֯@rrZׯW,]=vw;lz|):ut*YKN^KխӾU{v'k\\\(_<}A :v=[PNykwS\BߞQ?M4_iRkԥq&$=L"==QNk̯h\ u0dLnot˗/O>XXXpBBBի.]b̙&߄===ٴiL>ѣGפ9ٯYZj~Ξ7o ,|Y{aѢE߿8[̙Çz*ׯ_gj;wViѢ]veϞko׮]t dYfʕ&?ϟ?H6oLXX17E[nri֬Yc"ӫW/=zӧYj7"qΟ?O^HMMeȐ!|ܻw0r=o㤦sN:wLBB.] !!sѵk|fԩSټy3wfݬYE0zhZh;w8~8 4P~e9w;v͛,Y9sʼn'XjgV7n`kk˕+W8v'Oɓlݺ'Or%u0ב@_`)KN5)`gg}i;*Wcn\,k9r0=q`0sp$)aiՑz53 "^A+e0q$>L~3oWo x6f~EͩW>o> $ep)OޗgϪu7J]}e͊AEy[l%=zJfajC y9-;7cr '>HoФY0l5b .\s EQ8s,/^j*>tgض{ ̜:5϶[mԪU3O8EF=嫗pQ3+.ǯf կcGd,];GOfh^tݍ̦Mԟ׬Y'Oח<==U{)S |\pAg|̘1N:Q\9ʕ+988BDD`rtt$$$NŊlacaaAٱc ޴iݻw`бcG}@@nnn4jԈ_~.\ODPPY˗/sA~jԨK/ĤILk׎2e`ee.]ʊu͝7PdIlll(Y$4oޜM6yfׯoֹa܏,̛7ɓ'SfMԩ믿HDDTT WWWI^+\\\pss#$$ R !!!rIOOOjժE޽)UԮ]=zyPH /Q],GBsbPQtd 6ۈ}i{*V$D} EYq5VR';ISxw;ۼ5k0wyLA=uV+,q\8w mi4?Yv?/YC;1HLݻ?ZkE7m#=##WA[Rd#\sڽ %J!\@mmݎ7#G|4o72mlɉ\rڳ;m۷e 9;a`cT`Pߗte-[4owwz{(`m8991vPժT]˸R+T` z=Rɷ[6SmKț۫myc.aʖ-O}={֭[䄛qqqye-=Yپ6l… 0a+Wf5~Ѷm[6mj"ӬY3ٹs''Niy߿?888> S ###6UV͛M%J`ǎ:t///&MV|ntޝkv'w?&))A/T_pvvJ*/mr~ŅٙB߼#D"-rd+h׼d޷?0mdllqp;vlXj;xd Q$$% RR~Jddq6T)[҈Į +U@Q$m x ggG\r%)AV̯HA!B Y[ N];wTgw#N^^'::>L"+c־elܶy?}$I4k KKK@/zTNzc8$''m&ŽF$ygƗәlڶlϦ /:G|||s B@@Ę;7`eb prr"***9 8˗/3m4 Dxx8%KdڴiDEEQ^=:w? 0PBCCݻ7֤n:>}:7o$<-Yz~ eUH4ns;c"mU&֯KM8r'¾=UWFL#];`mHL|\Q7o$9MӲak4hKw.-sbl ĵ4Lz/^j$E?ۛ[7Ll#ӓZ_L1*ˀpZ¯]ww$̍7rS]ض{ qLZ|E'Oe ڵ$w$&&2j(_͛7M5<ޘfjժlٲ7orq222_|y ɓ9~8ڵK󤤤Pvm,--ILLܹsܼyIÇHDժU9qϟ辐 6 6tR ֭[UoT4UѐNFF~~~駟?լY͛3x`Ξ=۷w/+Oaøz*g̙ >\]#Z-#)) ///ݹ~5 UTaܺuKnnntޝ>}кuk*T{y78q"ۜ9sFÇIHH֖*U>Nr5w<+ב@_S,rDRv8:Qۃ_"a=Μ:8}xxyp+z2"ѪK{Cܬ16ЁCVm[#wԎ1lLqtr8W-OiͧEXgߞ}xrURӨZ*<'UA#Wvj./Ӿ}^zԮ]+++U@͛7}ၫ+$77 ߿?o><sZhAvhҤ OVΟ?Optt$$$cǪ1 ŅYfxb,--֭mڴYfjՊǏ:q۴iS|}}ԒPFE&LΎի;TIk-Vb׮]ԨQ ?+ұcG|}}9ru1]RJH޽y5j$zjo+5k֤ZjoذaիWgرj_aȑ9|2~>s:uD^T=zڵk._Br _u׉9ܮgEn:kd'EQH~p+*lؑ ߰{q.=:cNvlŭh5HLp"I`%(vnE6H̝;q}5T*V&ѪK܊Ÿ~VT411w|J=b{~I7lۊ$lc3|5_+@,IyEwmXk%:qZrF`kkÜMMKM[/hӮ5>Ξ{IIIřW{{c+W|\8wYiҸIc,vb.O҅K|T/]Λ?M9s&|Lzz-y IDATJ=t2~Gރ-m?r9j~><& R8v0i<=zIU(uLI+`v=wbqppQpC~dI<ggzz1cG?'x(Egmڴ)]veܸqݟI&qnݚڵk;v,̗G΁ٵk{&..Hىֈ!h4/^滯Zuiֲ)7?!.)h"! 'Q=5ys~ً,'Zhf'%1nGn`X dy8-ػTT\B?|iԩS=sy%K0m45Y\x7Ts5۷o7ØcǎѸq⇁^#qAjW@st'~՞L rrKiX=IO xXXXXbQJj\|%Gy>Lu qW⅋9ƚ8c8;y0!M6mE~K`Tܮ_>ݻߔ]͟V0iƪ6{`ѿ,t*O3T=OO@ 8).m(FЮC;&&q5fh>Ү3}ޡ_ zsstt}\ΐACٲs3KaiaUUa-ԮS[+33]w2ӉfLG'G}>QMTRe/'H~X0/Gɔ/ûI~k7ٺy++׭6ꏕ+Mtt :6@\\<'O֫yf/]ƳlBY](Jv@ E . bύHEaT?{}{n@k¤ ILt5/x=s>%V}ztŅr₧'h4cK+K<==4y"O[|D^؏ ru9\NF-S=v/uпi֨۶lSnߺMS=!]9~Z0nj'V}k'lߺ]czڷ ~޽ć=ݼ~ſӯNDj4ׄZUСuG? ۫kdmm])KKK9۷`|,\\\}Ugww<==qswK.lݼ Yձ?HFF&C޽{1@5c$h\ uݜ&muVt }87ΜS?,,,pvv|Ժ%V-ƆoggbL2 `\N|\<whܤ1,?ѴYݽkvtNF: h\ ?_e?5[R{"ȿ!m[g j{I+1i upnϮ=j?`SfڴhGj=kUcHPv<@ߡX H(m@]ygfldÂ?g^6w9ojؑ?U#Ү}ݻ[Ev>-;j@h0]{)P'0;W{vgWsZoB1qǤR g;0 j?Ell,ׯdM8::p?>tgض{ ̜:_ƣGرw{nyK.ܷ0j f}3v4?rXZYuȋnvn]N8ۼq BQTǏYyΛÊ+Y2O']vڀ~`OWҾC;ڴkS%KGWٻgG+.ΤNϜ>;$oVDegWs8r( kWY;28pl3(9Ƃ63 |<_ gM|lvnuVrW0?ɤ3fhB:xcM$%="b87oFO @ IO;ڍk(WW;cj} PןZpUuh [sZ~?6R͍Æʈ%..llAxK$>HV횅J(F2T򭄗y ]7w7W(O21ubccy׮sȟr:UU ҥnݻҼes=y۳'p}\]].] ˕+w9oFɃ~FR$=L[ʕ7?v^{~D^{Ӽe3֯]Gػ{=z$ӿoe_6n;#bJ;pa(]4A zA ޳'M"=^ m(Q|ѯ_.X y88qy~F[-WYo/\]])_<9}4|6 wwZmM;+54 nIkkk`ej:wD.PByO̎mooOٺYG돣caZ (fߤU3pi׆҅K$=Lb ߔzسk/ޝEUY]\s/553})ӟZKiiT\h嚨Kn ,s{ g zν @O<ԔTlNNG?I$">A -\Q_ކ-c{{;TPaj^hԀ\ܽ{666VcO[~67+=cؐ}{*Uz&MC/K}ivYs罰y?Gzz: O/Ol]+QѰA*Ui~5SN[[8z#E WRs..h |z% C-rppo#ؽs7ĠWpttDV֣de=BjJj/וwzp"$ +Q߯HۊaY+++TVQfZڹZFDDRrb gYØޅoU_?W!::ŹKg%ӁuQN-3ڋ_ Vu௿/*޺X4gN͚"t|0}hLI?Ŧe\ܤ7^sH~:88B ;=yAx{b7Y@BZ{܏ w?sX\'y/t&N E1}"mx{x/^P}aeexxz]1ut :666ͥiiiF۳QMqxCępx_3bO|,`ْP٣20{lqWkZ$l> (W>s4y1:tL;a,:{ 7n MnOWTÊe+Ыw/89;]n٪x\+Vo(Iܾu߈^)[ナ|v^T^般,<߼ lllѣfv?C?lBjF 7~| |佱cPfϘprrBV͋WAU;{6$o>8VVV HKKC@޿^_>A}K];cy%GF Fߔ^{b7刈CXk{۞E^=F"Qz)6J[dD$PnܸV9%z֥C`-ؾmvm*DDTr23<UFY?V|13l'@)h$"ruQYc@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""Ra@&""""R.\i B*=4`me kkkPa@gOVv$ &> IiIe""g+|<A陒D܌ իDDD̋OÕ;ao[ ^n^i{陒Clb lz!e"""'g\}>ey=SDHHMOGʕՐ\.j陣eODDTDOQy#"""cwthS V?:ÇpBY7("&&扷o8'孍??^Ͱ(;;ܷYbwtY(xdgg?kC+=L]֪U O6ΣG L*̜9@35!// -֮ s_iq^뙙=z4lllJ=%h׮]Y782W3jex+f7 O6?5{QM{&cǎ믍͝;~DGG#<< 8iZTT /_.)J$ɟYdӦMF/Kuo׷ڵ UTAK=DƀL: ߢA;fV~V"rrrx>%դgP̷oLgggH駟ЪU+TVⴲ&IR_OjWIs!44%=^7Emܸ\]ѿCqG *rƎ3| ܍ @6E_EVh>ԔTe׮c`7{'i6Opu%_CNhX1Z7}/Xq}f Ͱhb}Ծ+ GABB" :*_틖MZ#v}t 7~"F=֨~A(\~ NԾ+8̓(1?Sf,xV:}뭷`oo*U/47~x`]v)ӎ=H4o+W 5j_UY?D-q#iӧOG^y ]8 ХKeSNUVpttDfpYe [[[tvkܸ1APޒƤI///L0lCLL ԬYׯW͚5 5j@JQFo?ڕ۷;;;4iΝSƍ[[[mW^Uu>>>5Zouh_;Ψ_>9 Q^o򟌌 mܱcaccj t?+V&OΘ2e IDATo֭[ ;;;4h@z;^'~V 44...pttDNp]QB֧ll*oVb0v܊c19#@Jr ͞an:Fvmq!,\)֭^ض{\o8'x ̙53fOa's>_Wy&zgtcnj7y4u".]Ku7-{5pQ O|ȈH˫%'%cV>3m3WMpXjv~8?߄ p-X&L0 Q9B[=im۶ERRΞ=p\v FݕՂвeKeׯҥKׯi:tk֬ѣGxt {۷ѥK۷sŽ{zj1R9sw^#F`v{9t'NO?ŝ;wtٳg+mPKHH@Qvm\p.\@ff&"#u.Bbb"֭*U2#Gxwq ٳNBzz:0b,Xصk<<<,׺D9C! t!788Son/Ξ=͛7cJ /SN!22/"0o\K.!++ SN-zDt1 Bxzy!Q?Jy}4ij3qa<}aPz5ԮS..AnnnhboO/OUG (8/jGz'ڼ^H9th[UVoU_7=$%%;zcO۰?l?bccOQͰ%8z(bcp%B<-BWJW$%'Ku/ ۷_VoԮ]aaaӧڵkٳt]f4Jm6DFFbÆ عsRCvZ?aԴ6mܹsظq#K.!33!!!Brr27obΜ9s"##ퟹW_!jժ-[޽{J>|8Ncǎ!&&ϟGb,HHH@ иqc1/_Ftttof?{ƍ5jg#[ꃩsocÆ شiܹ<,33$)W^y}?#""0ɞ2e 6l>}(a^$m:t({l߾ؾ}2///GAjj*|||鉇} ''[nEDDR7޽{wHFRaÆ~(ʱ*;~VZtvvvVDTXbE mv5-\p _.,3fxnUp۰gϜ˝_A^S×˿eAX6v3ϖcu<~H|{rssѭSwx̜3?MG-E]^'.`%R~={u:i$^z2dbbbЫW/t/ڷoo!#VBPP&O+W*OV|2N< V-[SYfXx1NL4 [\t ]t3vPj 8tFaٲefgn;iii8~radܹJ(O+_~Q飌+WƸq FVZN:xT?4Sn*35Vy8'!!! ŰaL/ja$L6 ϟǾ}JmDvQ4Yٙ/\ltXzavdN7n܈>}SӨlIykOGsGi4VFfrݺuEFe<>ڻmtww/O~,̝;w _Ȃ]\#=E"""2V^~GV=%GfvF Sv;^a@g5m푔)Ie"""q Zm^Y75lp?1$""*kl {<}T ) 5P㺉lH6\cA$js-|a"""zHHHHHHHHHHHHHrZfjI\(v@`]!IRi艉GY`]; xVEL|4r򲋽3""""!7/1ZuBp/.RҒ${DDDDDADd>BJZ2EP@Ha]*WB8w4UO_{DDDDD%Qvbq/.@EJF2xz:8o} Y/>10$#nsTTTTT)DDDl|ddt-\PѮ咒~| RRR{WbˀLDDDDxւk$$I 馾%H $H _GnSi 0NIm\YV2ӧ|픏G~ɩI} ndo:$?LzwF5Q'~tZ~{oO@ 먏|z"AП+$~ 2ڸ AoO$SA aCܸ7j͵x! >5QuUЅdQ %U%CXE 1 @!"9AC>HCkH>AU}EQ'(=n%EOF}$sNNG(9&6 k(*(@oK?]D@$@+迖+ T @Է\(αۿ>8 XK<+|Ͻn  P^+-ox-8;9ÿ?bbe>ʄc%ghE.ȃr^nDS2`C3gAF٨-IV†e 6&%x޾jcC蕃(b 70{RPӿDQFbuaPPF gIR  zWe~Vޮ*6E#<U# oRdZQ.!  .`o3n1a@&""B A .K!F E~4UGư2s qJ7YYJqhQI@Uz!Hr0RqIUB)o]ۓ䶪KuBH0@ (d! 뎵V7297%Зj~π/WWCCKB?Uw!®+.8_%dP¡TR06]tte[)rh8HO߼QLt 0ߤ!*_{`reÍ%w7fG(O~`&+A&""R C[Q="tuБmeLHȵ 7]a [6l'~:]T ,5,X.Fܝ.<:O2\x,Z gqYW,qIơA˗v!_\bI211k^#-5|ѣW4 t[lL; 1#GfM0~8ŒX`(N`іk)TO+I, ""Ҡ4=,%*KGXlF)3MqW\'#<9Wj_ ZXG&a1o?Kr"] #|p&&bso7oĤJjHOK1P7.ޟ0FP,A_,?1'߇w#Λ􈈈TJ,47b V.[SCP_ez6CǍ7`goa꬏`Sbc0჉tVŌYfd, G@NNV,] "2ƅ~+++}xsՏ$J,Lkw'|ZB|R\GY ``mm%+>7xaSнg7SJRSR0iGW$ V[ғB OW/@c w'/Ǎ%DDDT*, W7OQѳϫfCGQ;zbADDD܍c%7-Brr2Zp[S6Z@=fDIDATʆ-s>hE$Ԩzu1o'xwh89;"#=j{ϗj7X Uab섊*~}<|gRsOЇs }RǙbڄ?/]Xv HoC0yf(>Uعu^-*T@@2l \A /7.;7DQIJ>KO/? $Jҽ3B}ƌ3&DzZ:==0p _]g0cRһ)'G,\)6݄% !==Uwk=I}oH,|քSo?R9]_K,vȡ^nƵWбK&m޹ AAAO\w_"իW1נ"vlGp=) (ٳ """*\egs7}lIXZ-P.-^~ [d$HUbLDDDR>I 2/kI=M *"""* 9/|}?Ǜ>#ȢCYq"-WO( A&""RԴTTPMȀ^HKIJOπgc@&""BWW ˺9ZiCffW'8*^ y鈍ËϷ+ DDDT(oOoMqMDE+kyqpS4zU?mWמb[=Ѷu;TWuH=}Sx&U_;*nQy€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDD€LDDDDb avu;ʅS4]PIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config3.png0000664000175000017500000014652613203343735022274 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{-\: %4Dz.UQQQPPT: gGt ({ Wrz A^۝}fv7вE%@ HٷylpgۓwK7?{ sGy (C*( ݦ˒gwZe˲ʟOY%E+$EF>ϿwϛT$InP\V2_Pױ,+^u|R;Gf&HYVPnP;t; /"u?\ȼ7T/*terML WiH:op\G'd@ &["E,2J*J4sDSSn>h4xQAcJMHH0>>"BGнm=jFF& l+aR3&<;xfk"l@ Wa͔)TdVGc-䪟/ZdlR iQ+9b!4@ X,kU|զ&KRjiLj[5{OMXF\___:1l20L\HXPsXI3qcҹp6=e+WyYFPddn`ARckƳ)- (_FAF%ɘm!kX#Lz<R=r4+}j!GǾdfnbGqjz_|H$!h%P,\O6(ABA*C tR2m|0nf͠#p CFH5ٗMq'@P(lb\X412ϐV[*I4 1E [,SƱ^O޽hpwvw IIɔ)Zp K=3FOrgH VY_""sֈ`5'ٸ|!sVEjޓ/ңaU"[i6,Yk.UH:})aSg0 JF~SՀmc3iҟ^k8zSY楙/Ѕ\тB/Min' |֏h8"Pzx1>\pGY_(۱)&ng~ =>~_rL-fF@ ۊbK9e ,II\0s-B2W72תJy`Tt^zr4Ȋ^}fjpWxzIfBfC%b(p_2ELZI qJ +*aR7yrp7Z>!:m^_MY7Jۺs&5C>#^~oʨp^:e+ؒMGDxM0r~~ k:oEL5%[HՏ-fĶq4 IW9*dҼC"]ů#;Ir/m`ȚiME?Z b:<kz @;1njq4)KP^oOcMOM/+2j a e6نNAPN-RSPVh]Ѣj٬E: % @!PYJRP FZ7+߲o]~M]+dzd=ƢIr*i_i@VQ?+z?,ᠢAR!o6W`HZ[cРaG'[]GY0[jTAK|VIg#_ju ga)gQVQ09->A/Pt,v!lTK(=&v`Fߚ-_Ñx:!].)9=lf[{!j [)I%4}1LSɾjC]1*0A5C=&ӴNj~-GtI4B?EnJ:ZIh<&<@휲`[!eNO1ORգEbR(ۮz4%*-uGCL ţ1O DQ fɵMNJ\GŬyyjױ\(Ieˎ"XhZl6VdG}XmTj4MJ%Xrp5j+PPEQGPfUn9(G1g` -ji@AVfRqF?ӌ+3s87M5YIB­UzYXV @ ( $i&(kYz8DRit8l;Q EՠVK|;cπ2{Lt|}}t $>ڞ Th5IZZ&)dT. ͨnhM U.ۥMu!UnUWV$U P̴ya*(oD$!u!;ٴTd&a4aa[E/Eh;bHcFddfhR&JQ$pQi&^&B,|}} KZ-+Vt:dY\LFRRR } }sg>~ -k]8}"5qּy+~Q(Z1~pqRdY\7%v |W5=-A 6\fk?oƾ+(a G8FǓTyDS遾EKuBpjpoݻ4j[.@{9뼇bK.-@ uFjbǾ1C W\M$& s5ÞQc5+ևX$'kNdffbYilŌZFr9ӋbH|M0}<|?Y&gٽV pv$Owi@3l+/U!*P,\PPrq8r)%(&M ?.?]USw@ jb-Lɾ,wKmy*5;L>LK $]C(X,EAQT>SR5O4'2~ :m.˺ @ n JM%XNkLb4T2V-gl@ՠV mJ-[4Qhdd]Ij5:FRC V( +2c7IRRPI*"dVi.)@pQI*TgJ&!@  Y @ XY @ /1M@ ?OVzv!HFf:O X,ZԌ_=@ wBP( 2 b-[1ԴdfW:=AXddsJZۆC wrRS8| l_Cڍ )[ ; q1`㊟P tS W%$(Zp.L! p#:'/'q}ēζ[‚oHMaejVx@ Eh(Mbxr? W '.&Oa&/m$[e+ɔK*w: C֢(2/IHٜc VPPitd(g\,a #B2G799NR*EcWPHLB9vN|t-[@v=_zw6KHYEϞ3dyKl%Ҡ cINݝX!=#~ɗ+!Ƞ0AP\f}H0ol49t wWo@H`(6نl/qC$tZbQ&8Gw ! 3N,3@[EQ7bLi%Yޒ,[I44XRuw'f҉>CV<Ȋ++Xm6$$=wrV2 lM+< '^ LHMa$ 7\>w;Li%Yޒ,[I44XRuw'&{s/;(Y!"cSd*[l~.qmxzҨR3,6 c:bR$"+%koK%YLi[ir'NsQK9ٽJի\a_3,6d2qvXQ$W ,UqlQ%ȲlX> 4Xe*&3c9_yI$V) z+ 2TD݉u. <ӐƊ[={>jCTr,'Iv3BQ\\dY =(&; tvQ;:WpqigI$V) z+ 2TD݉u. NUR$EݏH尒lqd6$d$ٞ^THRMd3zuj-5?hѨGe2nw؎ϜaBoY[KDҨNS:ĵ|g2YWd13u4Ξ9[\6nOK~*Qu.d=f3:L1MRRSiOGN~lϮ_YQK(9; agl&ېe+)))66#۬Xe.[ a9غTʖ/Kvx3b1t bo g@]$IEmxҖ+_Ȩ[)-nUާST\%;O} Iz$%%qARRA/0p n %[A7g?- .b0R2i&^sp>RM=|aوE Gb@h4j~\ĵo3ٹmgO5>e&֮kSV<þl|IOKM=ǟ|d>f[ǫQo7&~˹iԤ`Rގ>JuߟCN~]*YǞIVoZk[]ev_Zn2h@7KzZ:A͹OQd=87lQ ~cKgZ|)\xssG}Fҳ6%TR+'myse(*VHHh0*DdTU~_kywٲw5!~%uV\Ëc֞l6ٷw?s%;mCV>Aܭ3{t`s{ YGd[97V7^yZ58BBC8y _ğŴSQW\L]WPvաת`` ?YKYq#T&͜FzuV.!ևzz|5nކlB`2vJn8Q1그aۖ-Wepܯe8=z «tJ/9!ޜ<՗7;wY >釟^.Ze͒-g۶l6-^tg|uMvm p vʯ8ְa=ȑP~]c؍!,޵?WI{s߃Jȍd}}4?CGfl݂N:һǓ|G|9s&|9WMbuf3ժ2h@6κsQgg$'%Q.55m6_$==}*&}=ѵ{ y5(̩9u@Oį&oIOOuxi 8s,~9N"9)`y&?ٕlEwfs?KzZ:_ k\ 0b0ʻݜ|%AtڱȺl"u|>;ȲG)[,Ȕoq)""*Gy6vt /ΫFMu?2O8ɖ[x}+_w+lϏ-VeC]ۜ3߅lݴF=maȗ ܹ L=UˇfcKpI'^GVqݵ9fQ15;!;baҹ1N9S3o\o+~`(V3*17-k̨M:m5kٌ.$I'sJU)WzB4{rgNŘi$Z4# 箻k(=Ҹv36o7ʱ6:&5ֺއldYvyԽjݮOxй[^djr ר7pQf3=%<|&ı>+Phܬ>2o^퐔LWy+W`cv IDATdɊE^{v 9g*i(昷YT+WÃ|4k d\HLl4^A5ˁs\o Q__Cs_㦍xs~ё=Ȯ:;m۲I_Mcн}<.{-~HNJfM|%{طСy'4O<?/ٴ~3,SFu&ϜJwpn VelްC**k @Ilb=r _?_*DGmiEq;cmIyVAHh۷nU޶t{+~~~8s 9;իV ҅ ޏ0kl/m; c3MZ/K{0}L]Ƞa6h$ #l8{K}g&+1 c| hGx;zа2Ȋ;mxü ze,2aep6oc#GgvQr҅ WǙDΝ=Gsyng#AA }e,SQQCFs=1oFgW5d43|Jbɂ|W 4$%9~V"bAujGzj:բ8zGvnɨ36z{w>'4,Zo5m^A$\B* Աa 9|ƍ^w<9'wXUu6nF\F^2AL&~3/d!BD ģjےkי:[&s %9~OJʌ{uV,~^y] 'O&0(oz<ރyGoA}7YO yϞ>{4t a b{klfxqjq|t7˼ƌ2l9JU8pQ]MwǢVٹ}_~5Oah [Ac0O=FpH6̜s=l,KWVEרƸ}8p+ZlbKe zNqmóc4nmko~ban{t`qqc8t@VdBB79øx>xQۡͫʕ/gV+26f͆hju4jJŖM[xع}j=9Rz=KObޏsXb>?uڱ;uȋr 5U٧ЇʐL? Cq0 pMNFF&/ (/~8ۦ}k z@Ǿh4xx>op>gLTjJ˹^ y)*f3aaeTWIgFDgkh4jˆXs 1y͜>qFCtlTiwNLX R 4e$Hbn 1~tq?`<֯_8N84sGeFUjTUjשٹ}?å םXZ>=Z?Zoؤv{Sf1b̰([.uOgn3*]áSTXם7PJ%4zgvnө`Gƀ>9~8ёL8{C<M7VZԭ+ìishѪ9ϿmuoӦ%WѲM C]joe%eޜ'ْsM͛7|2xt믒o2ew^<3i.^CuWMqv透?[Bbb"SLty#FVYZƵy(l\|u:d?]VS`оS; A0oGU Sw~jש{\iV6`1x!;H{y5*ĘaZIINa],qkA@lXEϗf-)) th-(8gSg(7k0cfsWteX1L\Ȫ8s2l۽hd?bg\MH$\%Z"wս Y1hۡ ̜:KLFWXhrk~ެqZЃao3cceY&00:ubݚzޱw <@hҼ1w}s2||.w3fx^wK/⟋w,F |?zf>~Oj2Q1QHDMPdz>aay9A-t\O<9?nTzR~Uք;'?>C BQew5^ZQ\IBRr tKή zmy6Mqd:a̸׬e3&|1L.1/'3)4V.pWv1g\N;_.Az`4ڮj}wm'y]N:{.%{}sGx`6h ߶,nͮN&\ilV1բe۱lrz?$]C>@ԟYAy GFҴYS})))$&&}LWYY'tXNY:>GA}|;q:ޥZ\5;@tL!!rbb `n*7rk* WXGODž (KT`/e&ΜJУ跹veB=ʴwT@wׯ+Vqen(,f ¹ |t\8elC_ڦRI^,ѱѹZ6e>x M&N7r#\/N nX;lg r2y9v7wt/d'w׫]{eMPp 5kӶc[]s?$wBe.] ߲w^222y3oPkoVYJ «1rg?|uk1oqwjן}CjJ*;CyjZwı%NЩ[ǜcs.7_EXdSi2ʕ/!}ҽAٰI}l6Eyp"9ݽHB˄HոAN{2~̎Z]5Yn(:#]N%2vΟHbuZ.wr <^XS%2VOˌ#vYe(TjJr 8| {H @Qd^ xehۆ/C0)9ҹފ^ŕ&:*J{OggOw`0u,fסNgi_b0yV6#E֍Kв)O=ۣ NȄ3c4^7_̒K֫.d|RkՈcx CVsQxoi)Ko'R$=/o~ČӲU55&)g%qŌ Œ{xSϊ#ط{?u#˖.G^xzP}+~'&ca(HވJGOPysM&r5jQS-?JTL*DFu1caԬ]{_~058E:֫1gݚ =*U8} o}5.eʳ>r\"qKdf9mdbWFFW :uzc{xUd{\4nd%2eׯ3"%jO|8>5Y4ft0fP1mɤ2e|ŻKs$\J`4lڀPϘ;vSjeTj"x [\'1~w?1)S˗MQ=oڵ,'HII%fuGa(_d29'fł62..:7lKs*^Գ]Ƕ[s,gxW:cߢ~V<&-SHYHm 5]xp*WM[ٿ yUn;2"5kHj%9fTXjDW̙s|xk *&q sݨT*DU&0(1#4iވVWz?k2X9b:V#ʾY4$I,[ ;bȊL@PZ6ᗟ~衣7#=g#~3W%@56v(ʵוG8t-qY1t_G~WS(_=*2-5{Юc|}{\|un6f*JG76 ߺȊLٱuGy۷@R~dݚ.'vmRR=~ڝXaosL<5Ѻ]+dYuV̝=E"l7ٝKaKy^+_yUoӶ۷bڄ?zVZ+W9 #_Ζ[IvF媞kwvv/\͎;>YV |}#_|xTRı#ljuVlӜ_FM֮rwn?ӯʖۣ/e׶]|0ڕk̚:Z58{3&Ϣ}]7qlZMD \(^,Y#?[BtlW\crꑾ B oVF`k`ެuwm"*Vp@gƍzJVvJ_ /N`p Μ?v(G;ګգ_UeB<~ 4;lycr*;162a$]ObZXI3y07GvwqK_z|_Ǎ1T*]sE>~$(P.9dR>z%K8cKf =iݡ*gL? ʄҾs;x!! ?~qΜ'4,Qo}v4y V/?Oa0Ez`6aey̙=_@pH͚t'r ?B& (0RVN2 Q7B~iu:eB4$Iojdz=<|?>z 9 9k|;q&-&%9`wjZ瓏b7,Y#~ .n\><ˮZujg͏Pk4DT@&  ̝=og㮺yq|u豯v˯>ϫ L3f쫌jrʖ!!Yf#, S}@Qz=NI_MqViҢ1 p-US5 o~&LgݚhuZʕ/G snmMq_1uL|F#AAAkX9c۠,SL(u!#3~YETL$TQeQs-/EF8&y3"o$!*:5 U{?{!W=mZתlӼ Faء 7?J8=;ü%hO/<<~MfkRSS1 DDbGQZǾՊ. nXL-S>W|ҽGFMffx׾7?|_Lf+oc6  F>G;ԾyCsٲa+]w8tۓڭR4nވ-N*MiÑt77 k dS=ӿdxA a^>ΡeBx~>}sWbw1yGPP?}?Y`?pDŽ_3I|x TyfK̞6V%r͡_-ӐYoArs~H3~V5\`!00"#>vHW9sTL;:cn8h|׻?dyM٦Oɺ3k[~[MInS'AƒʭݴosI>b-8`|uZ /C|e,CGb (4Kz̄S_Aq>Cڿճ$oxSRPXJr:) 2TKw.\lpp!/Y'|XbDQ|ǹ,dW,Sڿճ$[e+ɔK*w:n,_;m 7.nXwa:d-^b _Y-ɲdJJ%;Qwwb j%Ӕoe2ZINI&?PSR}1Z2X* Bg~%Z4% ~zdyKl%Ҡ cINݝX`HJK#h$9- DPP ._D)WwFrZz*.Q128 dUܩ\~vpǐ}-ۉS;)m$[e+ɔK*w:ʅU U]F $$]8J!A4݄ e#Xq@z }W*[no S"A)'5#\rsϢѺ+B,ҍipAiD+@ nT*!e0S6luv}Y6@  I>Z=AT._'@@ 4>D+a @ p$IBj,@ x d@  a @ nY @ pC@ @@ @ { IDAT@0@ 7,@ ֒ƊrIF2NǙ3gYz-~nD!<@&jvZ>xC~emN JE2{>qQ·-@ 0LL6?Lݚ[>]:tc7pO  @ (tg8'NrIL q&rN"99.];S>8.j2|0]u&8$γw>Soٰ~#ρ m6 9k /JD[0><ѧ7c_y%?,S|=U@ B%ؑcؾ$BBCHKMcE|\rF͉'9tsQCQ ̙9( })D|x$ġٵc+̀gg$L(wϳ{M3p j@`ڊ@p3O~T\ jנ㏺4zutvMHs1|HWc}넅Ѻm+{wݴam_d=X'׊gu|Gmk7a5a6ٰnzv~fټ<%o?b歨j~i!K@zo횿ٶu;aaq A/De̜ho;5W @ (>} @{Zx;z(;s;86gf;7]ؠIAZ:DEDE$cS[,xΙ3眓iz>u,3ӏ6'ܱ+䍘?GNj56`߾$$$pn߾ej  Ȗ+^2epI>yo\g#&e?z rJT`z/lrk4nڈ 7;rN:ѷ_4v,@ d,߫T*sÑGM3*j9u>uӧ095cHGJ^O/O=}ƞ{vEV; O/t!/"SƼI/yG]acQv:u\X0흏N)7xIƬX-K-cϮ=̚?wϫQ*wDh4$IbԪf3oZߧAeEYf.S|S-oooO6-Y6wЪMt / 9ŕ+WԵ#[6I5 u[7oq|=zѫO );QQQt}k] Qkޔ{fАA `;w$$0 OOO={FX0,_+#V]Ƨ@ȱILuVs`A_FR% @Ѱj?=jשE !vvva9={pB!2*WBօf,TW._Btt4!a!,Y8K `gyeʖ1~o͛@Cts/>uvvbּ"I2EZ`5FN"ίs4mބET#G={F)YDmۯ}gr@P-mGi{Lv:%JGREv]r ~i@GJh4̛3Y" fs,@ H7 1l޹'Gw'=Y $I?!!!wwwڴm  7%!>h9m@ dvhU͍Hxz|J , @OTT*g")UΤJ*9m@ dփo3 @ ^<6C փ,@ /Y 8`f|6}GwqT[jupT;@ ^@ڵܺyZYR'O9M5IuĔڹeZ :2Eҩ9LYW@ bbJZ6iEUjԪQ7;]{?{>gɲo>0Yδx@4e@z <ȯ1߯\ń'ң[%&:3w$|K%@ ^]"xٳk/>>|HcZvkL9|~Ԯ[+2Bn޸;~ì鳸xEg٣I+O;N0~DN8:gxp>M4[͗ݻ+L^@"kLٻ{/'V<2}2=r[7o1ax\]\eMߗ/ɿ0v/Mmӯh4T*]ϙgҡ g&[;:91h@˞{5-˛i LH^@ .B <[7o>TJ.hն%NNNp}k7p6l^njёxwM spp@Errr$)))]y$=@ Ih%-)5*eXπȂ88S3?EQpsw铧._Ndh4cNn8U3|Z{1Wn_;o\]8 ͖z (@bR"gϜ^hڼ |8˗.1#8>)jܺyŊŹKHP@&#ǘ4uy͛'["Ƚ%JzE۶mѣȂTQ5F X N 39a4ǔ,\7dY,Tݡ-@Jf&bw]E; [Ym!t _ {-cn:EaZ"7j ёS`կF!ZeD-J/^̵k_^E܊n5BAFЩ zY-6>7/dEF$$I2$eI'רY_cE+i-%Y6yƗtI"IZYFu3#eEBAFIiNKK3gA_0; a>.FzFX{%FC8<1L 9ckا3{%Vf?#E-/qY!k,##3,]pqj<5U' I8y bٽN;R`ُ,ݽЧ_o.HƭXtQQQY'O>eذaDDDFtdnBau EQ{ib B29p 6"ڬא+M{R`hllOnCz밈a[rnSa^9Mk2? Μ;Q9 iߗS'( ?Abb"UUP4dִZ-;wbv흏OҠQjd?y/,[-/WP\, bk~z?~L˖-iIIIT*:_\ZF<0"^,+2ZEkUP%G&/T2UeZ--dz]h 6l. ͦ&Y@ARI+E( )calffL:7YB>k|* tqj\zp#]n_-: thGaT\}{ٷg?~4oь c'x>yJ`@p\]\X"E {wҥ[g6hOk1l?ADm#Ģ}ۗE2eʔa VQ$o·e佗p c(T5- K)j*YEŤʆ2U-bf\iVr]6C?NGѮC[._̌i3yWw -ߛZ̍G-ׅaW#mlX///Ǎ7%_>[xzzIҥ_i\adBicȆO cKDytoҖ*=65NجY6nȖۘ3/"^J3E42R9[@/?JBBjEئVPzطwcǏ51+/6 *Yl\F붭ذ~#LvZT\E0ɛ}{1h@ruf=n{{{Zj_uV|˖[&w>:tlO=_h/?%9Iz)ñ1 !qq󅜝(W2*˳̛"+izl dO1c ϲi6a_k:y'N +2**CSomwZ6^J_P"mfkVVQhF;::́I^<#}1Ι6rXfE2o鋿]hr\nmj׭j]M7ܕ3&i_WF0dZ&yh VQdɸM7(Zn%Z]R, $=[+\F S\8x\\\_ ?LjTQT +>ij /d:6YKZ^ڰX4=e,nBd݊8y$QXQaӤhhݍȀtuO6 4C6D@ d޷@ УVu53U˶-k߸9#Zmay*5q]-1E\r歚ӹkGc8wsavG+f3IrVj6myLʲҸi#%nnn\|sΡR,KYeVqK& b  AVVkNJS]LxpoM[6q7jIzI-1RG .H* BeN{@~ܓWGy 5dI'N1eN<m;;$I ]p)K,G4n E\\<Ǭy3{_͛fhM,Ws%Ki֢)oݦi,^0G=)W_/qUEFJxzrnn.dYfoDGESާ<'_$j-,[-oۗhL{Lk7ni۳;{;ɰeX'ڐ?=e%s3waBjB Ae9XȎ];бkKմ6tHg,o[%dIҥl}3ʗ%O^/hѻ;^y%壁CF8w=:^L9 G%6 p|˛ɑcF6lbv=ƭ[3+\\e]]?Z S׿/UUe?tg8;9R~ch_ @F ݻw9zc&H"\pspww0o.\Fަr\8wXYg<==?7<<u&uENҿ+ mIB^:׮^g|<|($ݷVxg@?];.yޥ)] vv6ox~G=| @%ޱlN˯%2c<(7]HXB 2gGWG?#/<9m c{qqt۫ qHR:A B,Ft$q}~Y}OB|"]xȰyW76G(S 0aXA'))+DEEdZ"&:ʤ>Ӻo(yJ)Çek.g IDAT-7o$66A&袐MmJ_ZeOP|y1+M'?2*+eONXA솋 wK9m P.rE}3\.IDBR<,-)ي/^yPnLZMظ~>~L0/>T\t/>R7Pqpy%KEJ~~-5CjP#8VF6)'˺ ' i

χ gw)S4ʔC<~//O}~5x}Ԕ+QWWW?HX78DR%prqZͥU7ԴNEl S6LY(^..޹ZL(M7kȎ?-#_=y¹ D>ķ^])cm+7o"Y 2nrvRʼn@`B#$lZ-gŝw9qu]6IKӖMd oŊr]ͺ>f@|Hj#QQ4jPKۈo0#?ŒF/ h$11-$ʧ~2g<<ܩT"{wc߻8c.JExzZ777,ι3u3l,{D>Iixw;̚:{{;Bj㇏ɛ/ϫnúoY p"ŅsI>3:tk~A띞$&$hb||oTI睗7{^Bkz@ <I$%HԨNcٲQHNx/-ifț//PΧ,,$$$0u4pqutҸ |X<3z4 A4hn\W%45ƍWY?X4{ #?yAQ'E)yk{$I5bJ(ʨq#U7ԘC193'v))ʲJ;Ý}ϯ?_5z(if}1Y睏Ә3}>cF|F!v?aŏ歛fMMpX ,ck^$b@ :?vm`rA&8s4 sycZ ۗߧ?F6qY*J<V HΣT(rq}p^898+'6!;7!_U!6&MmL289;q%~Y+۷|UA|n@9oSle*9\ν'w2TɅ$nƝ^Y??ụHJJ@tщNovo  udE!26y )WJ"+.2+Js*qW^s֮]KdT$k׮W^'Эɝ\ óggu !&&<ַFX𪑐þS׎ ^4o XCV(2*(bbbؼi >l޴7:aEVT/Tr=ue\H.c>*Y=rU !! 7ШI6E !vdjN qun:Ew ֮g)J*!r@.]͛7z [Λjq2B ^VXtoꕫS\Y:vy.:yהԼv$agg)? ^ojqɡ=zuG&yEGVLgl (BEj#ıe%!!='ҭ3SyI['xI-"225kPBck!lksF.Noe܅>/KW,v͛~*V.[w(UOVm[vCڶoÐ*TV?w_ʥ+DFFN^ojٴqoߡx5:Xquu~|9vnnnlٴ3p ٧}nEZţGdɒ/$A.%y^J6$EAQ,&B xH@VH; ~ZuMı9VyT `Ѡޠ^ڽwGaI)Z0{*UĠ!d%|g>{{{c QXQΟ3dܽ{~BoѼespqqrDɽ{x111֗**(buyAu&'f@%2 Q@m8::ꉋad?uBf EH@mIJJb洙t&?usS'Mʹ@6LB\[ZNjpT f,Sn- *DHXׯ^gm=G#IjPs%y4ۢ$66%KLBBueT\Z(-&YP RTb…y̐9&.SH9x0v%dž>?XqNdF2V>C{w4?fcZ]j#$W86S53My'sEYx5ƶ]+EX0:a< ))V9@"?Yl2ciZY8,'x⍋iT d]wf͖JEj G=jZt)ػ{O2quu%** H(P@ EKf4>tq N%C8sv#Ũj (Iݰ˸"mz2y ScȦgUiړzCfc{[˼8閂ӺmօoF1dzm.t-B*Môު!)̒;1:ۓ\|8 zC1i< ?dޢ9̶-T#Ӳu ƎǬ6)D@go៿vWE9)\\\prrvCjO|'NHɗ/W^e.\Zj@ :*,K#eEFh ȄJXz7U(CPMqh#.]Rj[;Pl@a{)@ZF=5IoٶmW7g?zD˶-tj*i 1Jjћ>F0VRn+Fb`&:3w {SEg\  d̼Ō4ځ/MpH#,qN)xXo4jv(Z9EN 2)Vk˼n;8(FӖMprqFRZA^,+r޷V2q$N]8BCrHGkjڵk6C$=)^86w蘮C&Rz3EAVd$m r;`,ie,qZڪ+k]$K$II3>E{/tIJJO;H+Y ڳ9Xpwځ];Ɏ;k3C dR aȲxc=D#̏ b0&:[7oT\gƭUo\_ 䑲S1( ,ex™I i,fV YZL8UNί{Nl!q}mɸ`Ͳ잱/*j ''bb,x>jMn)gL ,#˒%d*xoӾԨB%4o5?1 '?^pUcs/вI+פz| ܽV֢$Z~m#OAUЦ۶n'IҒ$iy_ ?$II$_I"t2WHhP|::u8t0$I9{ZRb ~ܺ}Dm~ITJݰ~$9QDBb"}VI;vߤ_5*ФAs"f1={\Z4iEP՚T d$jxɘ_VUӳ{?n,wU|s.Ʒ?O&Q_7жE{Ԥb* kuuHZ%-O"1\=${ uquNUWc¸I1n4k؜~iӢ=kdqTL4Lvp=U O~8qx>!)>ͨV)޵ZM~ ,Nc+4IN#<}9;UYH e Ν=6{**`ݚ_jXlÑ$1y" w. ѣG|3q:L`oXzNG #>>skPG|5K]M a[N%{,u?!!˱#hҼы]kV Sѻ5|>e EAeF|f9.nΜ={{PnSgN9sadO/O>),Y:pAC흏[Mm<> d}ϝ=ǃ4}"=2g\ʔ-M ]O@~;`2f;s{RA]̜,fZ&ORZvφ|ukixg8xH>|G}?;7lݴ:Ѥyc)[k5w@c '<ջr$A.&\f\6x䌆zɖU,R{2B 5BjPΧ<lNH57X0{Q̸ѰiCcwcѼ:V˜siߩ?l般(H#9t0?  szuùsS޴OzQ߿{5r;.SwnF̣s|@biN||JPD1jE֭铧x\E%KdcvJFAmX8oF}&F$+ɺG...fhM[Sa=N?0gQ1OX0V8̙50edpԍ{ v(wnaԙ C2 x]ݧNg͐~.fبύ}PA;ٺV*@9Tg5w+ZO25gMQ$I)q \NCEJ滑J1fE_ݒB DT3ݸ}6sfؿLjɉhED>VPcy#3лko o߼I e齔cGP \ze ӫ[~{\\]R%]aAvmEĂ(U̘cѲMsT*%EYê I'fhrvT‰'P)9"nb ?#2eKE T 2?z6[ɦ7W/_!**bCk]DGY؜~ʊ r-*@i}x]ĉ@`B&?2Ija^ I ̎u;85f&$&⤕\\=Kb-r5$EJmR'== $O-I .D2H"{w'aTXԯ yMKlHġ$988$l+YV˱Hz_$I6z u)fa熈A%'bN-^ ˊ>6ű HKԖ5(]ʔ4Yxa8:2JpMJ*frrq4)Q}4I".^JEv*Rgg;`Q> 298880dPbbcReKqc6)KY^7/9.|$eqw?*"+^y=Q\xxٽkOclwI֚+QWWW?h~!J*#~C3U{\"Y חlZͶ0b!2Tc8U DcL1nYٙŊ~,'ׯ]7HX'xég2Wɏ!AL?SB9"E"25Tj8$w^~aqq7Ǫqssx;soI~F:cةܿw>前5~֮>f@|Hj#QQ4j֐~2g<<ܩT"{wc߻8c<,섓oO)5iNY זl($IzuS`X?װB>Yzf3CG;~|~7ZmVL(Ze3vh^k| yhҼ [hO3m.$HiԼ!oyGtխgg\\Xr kW+]{tZPUM>,\#>bcSuknl}+u,/c̛98+1s45xfL`I\\ty}FzlH5~$/[ŚU?CE^|X<3z4 A4h]#I?WRDQFAƺ>-Xޝ{iٮE4^Ki\F!@ @Og~G?w Y`Z֑@m:b%b IDAT[7isASXyNJri5ƴ:!u-.'b< 2Oy-z7' 1l޹'GȚ͞=ERPbcuoS34(m ]K/QE{p)+*K6b!} .?x1-ǴS̕wc?q}(^Ə ןE@ 15ow,mR&!ujZ(i |\."뷚~ <'Zc/@ /,y<,nY]@B!g8'rb8z0 ʸ,]DFq}U z>@ ^M\ .Pܼy3V1P'#@ Y. (BEj#ı@ "W b#@ ^39m@ @2!@ @!@ ,@ @d@  B @ )Y @ H@ A @@ R ~i3/>s8Ӧrϝg{iSD$O`ִ!ܽ{)6E @rD 3M$ cGsԙ0ukֱoϾ^VUղ]ܿw?Kmܻ{ "z(g8!! 7lP*r غV2׮]g¬Fղp"nܸ-];w ,],W #Sy@x}4hh.R2eKVhPmٖSrY{wѯw.^۶A7{SRU|hײ=˗@Қ8ܱnT&AUjҮe{V,[i+Ӻ]tCNri>0ZT,_zϸ}Zǿ\%|JQկ-boxn3@nފOi?nݼ}0^$oF՚ÿ\%Bkѿ۳?GI/gg9߅@ x9l >jܗ&iyMWپ;}2۴ L7KWЪMKNbڔ{]=O~ʸIcQ\rWWW_ _OGJLt gN͍2e6xҮ}=<(UUVa FYٸw5m[Q0/^7K*cv  |8t ޹{{n޸E-yG79w .d;_ppp^,O?%22V@cӯїyРQ61CB@ x9ɴݍ@W2$otݐe /PBl78I},0z_l.R# JСMG9fȲyRҡ+7~ұmgBQBْEK_ө]XֳgңkO*V'r 4qFj@eWe$%%̛=MZX՘7{\;vE?+L ڴIƌ=o~GHČi4kь͛t򆮮]{ዯFҠQZkg#>%ZU<<ܩRR+^x @m8} _4ܻ{oHLL$..a,mٴMZQ٧*aAY0w:bx‚jS7o<|2&'>x1mtEϞ>c#V=[4hX.:3{~y+B ۽3~4/\iKj?+签 G UNdd+߸~H@ԨZ?c}(WR74$x񥋗)Ǟ{mai޲9-P^x˼]U^h}Ə@\\|jEj[uSI̢ j#k^ֿ _&MT a$DZ+S7oԟ"͙5Uk̟wkZg)y!Cz *V[ӴAsew`z})uN*Ti̍gxM5Yf6ҭ3=z`"Rҧ_oɃvmsgf̞Za?5-Ӹi#̚yx{T ¹Y8϶`:znb񸺸 ˺/Xt rkߧ?[BB2p(Eaje~; /OOΜ>q(R={`_;bȒD5ժPDq~gxѯ5?{Uq @z${E@ziAFTQDD"B %![M6R W}왝3gv3y3gٚ(Uիg+޳[SysNvM4n҈c'W_3!׮YK(_!>5 ]rcoXxxx$[kC_g= 6L,ZNm;ud 8$ҪMK_~ju,iDu_Hŵ9**Ԏ?b]hǍz}ũ^YfM-]ksqyylܰ+Įyu ދǎݻxzzk.J)kZ5]Ge{cXl%3bCW;{.FL}ZS#?5n)0}twlǀ!PZ._̤VlX”-_~/;w$._*W1QƳ8˗,zuV^N,mQTXm[ϐ106i:rùƐ+WsM mc+yy lݼ-c')P׮J)So(X _Xk#'1S.%BK>)^Y?(ps<&R/\{Wl`7/ >YHǶY4]{n:J(W{K- 8IqptbNwҷl^&jU_Y/1l=UUaƴԯѶ}k^mظa#zJ}+u0#7Ï)Fֱ;t'xx_ GBˡxyyQL)~}wlAV/%Kfv؍lf]TU=]P(("TTO~GBϱǸq%J~FO;DFFHgΝH*ؽF*Wgw^˗?/@fhִg"p$qȗ͏;>zB媕;-c ~W"3< Mv{p~oo/[&Ƽ3E|yTj[e]hIj>A[ԨU3rH|ş[?7ǐprrf⸉%-7_^هh)qP>v8sd94m۷m61MFE*ɘ1#s}rWڼԎC_g5ijXg ZVVU+VSNMd͒:RȬ3ٻg.m؎7y+^li 3eh"4l܀c&pe굪' :W\L&N>MROV-hߡ-^^d ȔhYgG܈x"ndƔFm1ݻli 2e֭[^l/ptrdтŬv/puu%O`>p]2ENgIĝIh֔3{...HqڏO2>z& 'e쎊z"L-dX1u/)~WUU^z'9KdȐOȑN]h۶-ػ{/;wHUWh4r| =)S4#7iѩk'~ڴ-?mePlif͞CXxw%.]HC ^úlX=?|j59¡Y*k;:j̴T+Lܹ\3clj[9 ə_z S'hc'}m?޽{̛ nޢdTY~u߮xdB)P 1o/~d/8$?/{QG3)I/G;q3^tj3 c\f˜TV%°"lX=+D8 krzuqqaAyg,...""'{Q`Rէ'3ݍ*`49eΛOX0Jפ5@`-۴Օki%EܹXB}IsQ:ZȤ9y Ņ?d )W:`/9u%Jۋ˗.3w<2d"@0LǛ ̩bj*Vسd 7`) ? K.-,\̑_ၛ{q*]%QNM|-n߾M@@&>[л+:؄eo@6i:):ͬY2xonіvے9snft։i:];|tjׅ.;Ŧ?姭ZI_]L  c,[^{ӧ+DG?d+Lu2Qby> 7ٙ+`2XsFv8;;3ud6xSg0bki߆,=ٻdD)/@媯й%J k֬6/QX.R$E Eʕؼi2... ܟc&CV~$gKjckJ㙽v۲hbtF/ϧiԓzMn=m6iſ.r!mԵ#+k ٲ`7Ϋ}p "fOO:MǶ=&+}{=zL0I&$zΫse'ڶL_{}8ykܹ}O b:ח9aْxx9Kf/XޫOO\\\| .Z!ҽ3<`5LFsdgofe;i0k|:ږ Soҫ+dΒo@&%H(+dݷ0a؈t6'jݽFJ)E} SLn=fd"K,n׊y>kܵ'L{wxZ#"Xh)]ٙ fvQodYlݼZ`ҴL7I&s}+¢ d/Q <=3ҸI#&K-[$|TN y 8ݻ/aECn,Yb1ӧLg˜DGG7ǿ45͚o<PNM-_ȸ3d0V*#`I6jNq9VRrM:i/zAXr1OCAC)/RmX0ڴksSs֨ 71iE% `=b6[X>5<y)Oq<_b;cxwy!yPNTې=G'T^ƽˢɑ3'...8:L4v <<U}""DO&j8ܺyvq>h2%xz?^ "驖Xi߆}׽4nϗؾ6-RjN1e&/5mE .Bap%(FH`AƼ; 0REPPqwqFA:(Ve^2z5P`q IYx9=dXiJ-Aùs'?C5(?bvݳ϶}᧟ѬQs*D0ʖ(ϰAq}hREBRx9F }ݶ-~N];q#97X,{? |Ɋїs=+*eKHbԮVo|c۞ڸ-Xp B X; ΔSmΞ9˙2kyw\:P@1/Ǜŝwl:f4- IDATgb`0~-qu2eO~_cakn _m2>-||}pqq!:a2:L1L{s7.+?_YW8;;iIO}h |l`2dbifĦټGضe#A3g`l߻ &φױuӓ~5r}6ER%bĩ;NOu`AЩ={Wlqࡃعo;K>_굫Ȕ)# й=;؉ L&"##:q={>~ +LP6VD$Q5x-_>^!jZlN|O%aܼy(+"HO^#g܅FMXuϟ6S3;ϬDۋ-_9B q/6o!8dM5Z lxx8-[bA_H۸D^j /'|` I-pvvb0M\xA_D>( mF(_"E 睷{:{AƌŸT*SspAݯW:ުH" ~ ѽ˜?x||iݮ`kG%(SM?ȿSU\23"22ݻťK[>JTHb4kłbq&T,] ͗H۸Z@`]~VZ]6n)[]:tMذnKWtѲ]F ~dԪZ;-{6l>("F, ׭_PtI\\]}6ΝድSe˗e՚XL:`q];wNR%lwH7~#/>Flٳa6I?ȿװCppp[,l)9sdWS~||}6/Qs= aL OٙM1.Kg䛯- d J*=ܹsq}1FrE:5m/"}ߟ[n1˔bɊE-VD 4mքkWUD$XЩ܋#""""}۾ ) Q@,""""b>($51:37X.sjϮ=޹C^M5u4gRJ>!~to߷29 #oXˇ|Ÿw>[OvjV9N]|~3wMPHPʎyg,[6oeÏlzjK/?M&J.mç͋|C}^gDڍ8}W{ B IUXcs\8'?|ƽ?]Bń#7=%7ܤd+Ylbbb7kJXHQJ勭Y|4x! 7Fx/5㳥 3;^f-!$ RdE^ғ>eIT͛7 ,h.y|7#Ȝ13FS F)SWc`!wfzt CS>?vܱy4m[Ѷe{J)C"exa3>蹴I%5֋];v?殮h̚A}3AvrJ{i-M#nۊ~p1n޸D|J0g^fB>=c.-}-܉dprr"":k׬g^L:͚GGLDrvLⴖw~#[uaЁ7㦯SF}BP|5>`6K/woQx9/G}tR}u|c2٭5%222P;YnݺW ,HH`ܹ}!Rx9(FzMlڱ/&,(UWg0L4݈}' qǖ/YNhp7@R%)Qu9 beɶ[D҇d_8l&&&h0͚董~cmZ,Y:\FumO3ݽĴSנuסWԺLLL S'Mbʄ^~ &SJm,Nر}'gϜG^-X3東=sfFJC}1>t:jp!({Ip'**'"h4Aș3+GZ4kɱǙ:c2/̒: cmj.ZwѫwO,Ɩ[0TQ׼X|%{vKؽk7%P~.@1n=m;AzDFFR 7nСu'/ǟڵFR=N8ɵkL5GG~s45d  &WұK7H<<MTT/gPl#2=qz1Xw~^J74Bl3oH8 {vaw_QP<==iլ5N"P~fLIzƏM[Xr1YfM㑂 A_x~5Y2SzU)VheLFPpSgN`0PFU OKTRE srŮa=:vM8 `2x p~_F\yrFvjކ_,U6?zn=Rqm6ٔj}6%111L2.BR /^fITQ*ժ0h@fNVТUsZni TG;9l4hC(S.ڎ`Ƈl\|2jT_e@jUT";~i{MSkvw=r~M&3&*$}_C Ԭ\>wJM)qswO@r^bŋRte6SfN L,_|_ Q멙V_qppTUoΝH-ݞt} }zAFm߆';crôh!O*V1&9JJpwwc똋wyg,7o$j8¯QVDu?nl>xedhVM}v-sqڶ=-_ap)/LFcWڔq܉LԶ +ۛw*}h۾ [ϪW1w>1z6ZjԩW=RQ}whK8˯@~pssD>t86=y/>o}䉓77Wbbbpuu`xzz&(%k_@BBz5wGɒ5m-ӢL2lں_|O0w<{\]]\lU_hق%-eۖ|2rJ_ ???2fʘ'h4&xGн+EdefEoىNPPf͝_1wHe}ZO3m6m߆7FᣨTm8I=ywgHHk/~#,fݷ(Udv_GGGf͞=Xp1m[}v)39qc-c?,۳H1fR`0РQ}~ڴC=qC_͗7W ȑ3-G6\ =JKX÷ Z`DXX(EѮqttP4l܀];vՔ)Www7jԬ ٸa# 7H ߡ  & s@tAfoۑ[?E$iFhC"nGɢ ˋqSp E!4 ̃';'_ft|MJU1\8RG?qswOߎO@(XwƼMwL̚=#t2޽KhufuC om6Ȕ)~dŭR< zrYd͛bsW1MuL4 g''U(hÃrOТiK~&LcH5k%cƌܿw9Kf˩ fAl֚b=siSӡs{Zj5f=}7m4Om1L61ٶGTZаP N^/7#aԨYz՗:y%KK;{2R TFqEqM l/$YgmXB^܃{9Kf._L``J*:s2MȌ31T{e a19Q<<S /o/5 #gy4vԪS3mHذ{F%c4uO>1 |qR80saҽ7~~t֙sssi&ZаPr΅_K7ҫ ~ԉlgܼy,Y2өkGz"zi8b\rSl4_kL79cSNf&O`n&OH~/v Wp=3SL) kì3>e46f7dKW.f)>|H2h[^;On IxKʗ~GDdRΟ3!A̞mĤi8n2M-VE&ŠѦ]kΞKuȝ;ywGıϗ2maF9x3HDH{@ c~@/s/n~=o7WgYDDDDFYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@,""""bGYDDDDĎd; """""vEDDDD( Q@c ȑREeByCnG":& \)""""-fcy?\PP<3PpYCάȖ9;nϵ"""""RT._+(U,؀ %kpJ15VDDDDYsvr&[T-Y. CL2 zs?>wo0y7 /O<H-{H $me-S?ܺs~'/3Idu5( H:u&y^9Xv! A%.X`f C f3qIb h>!.Y̆1 IDAT` }0lcŀ3b[Y>]q!oOorgåk kP@tv/^|0MP7a  `ra`Va7t#LԤbyp9~fC|Mk foMl-.-ǃCl{t}X?OV@te6XX YGOC ^lr!nF2v_>.D}l C| fyCs|shl{cgI6 7x5ZE 3#3ٮ.'ͶokdIWd Kqv=.`-b xe΀q-.,m7Ih?c +a}ƦI,'Gk|X[ŀ+Ō8nl O&b`ێ̘.[y ֙J5f:˚-?/nݪu];{1٣9`9.YbNϦEDD$]fLf3Ć-냱Q@Y„)v;֯>Q} şN'@\RzBZfiݦʗĵ!n4a=۝b7OmkdIWf9>= fmb uv\1'_I=\p809q~|j֩l$B1]PkoCf*O- V`;},"""l1c2D$I vE\csؼi3WEXX(L2%y>~k곚)l₟ll6a=vkGs&%Ϣ-·cLTƮ]`GӦr >>>+_W@s;NMYd+Ud4~?ze+=Gc_+ H7%x,DOǺpOڷ`Cvq]?Hdd$&{&[ض%XOh4m`,Vzf SlX}S K}E}[N hߺ#.tґ<\WҢI f͞AjUb-ff#1F#ؑ,Z/dŔb_[c_+ HO^,D>l1c/ɜ9VE& 1nw̘2i& :gggLj4LΓWJ5ldz}vf3 `҅88L;}{K:8tnnnL`e21%nRɴ^K,ҷcjʯWi~M[4SΌ67ocl[f3=%y!GؾKlBR~ʾV@te=|S88U2fdI\PH>F9N?SBulؿodf[#fŲ 8?}GLKϗkX0q&]uH0f͙"ᣆd0 '˖` ?*%׏돳_ =1blyKϮhШ>foܿGWs|xrddzL$},"""*YͤfTR@a0O@  Xvanʺ? dϑRJP(ucO[x| _΂e9VlfՊ`qSKY83>Sl2[,i Vvׯ%qg־~\g~? Ľ6\(F cl?{ܻ{U߬$kgOqZYDDDҕlƔԩ[>Xj̱u ,), طg??^S[g2QP~Z~b˟Lsqn޼I2e`4s;Ŝbw2C$*g_?.۱&wܱB2eʕM[xw?u >>߸G+Ŝp36,4Yٳgԉ/Y<2ĀރU&|bX.nN#}g6iEz~ IB,7'fׇU[NA],a9DEEܹsokwj},"""*L 3Lv?baDFFҡEg>_wyV|0MD`8::`BǏzu,lXA;.4f|OOO^5ul`}|r Q4mO/Owk׳g>~yr _>ӗ/s,Cz)&5Zߖ}y|H[sKxh@K Uz,.Genv^6V7ezf;XMNִJ_O2uG\FƋ!k5Y0AjYߋ*ە udM 2MSlQ-!e iRnËr?IWE 1TUg@ zN?59]J32x=ޒZ+딑Aju;DQsy6$kZ {֩8 2P,%8]NjiI8O/u<dwvs(eIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config4.png0000664000175000017500000024017313203343735022266 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{=tzIB] *VPPib^?"( E);kB =Ww?.2?Nyfn۷ЮmK%@ 6Kyp+u&/1yS/"QTTqԷC%x7$gs{QQPD~)!es(,x/Y!g-6 M^[+~~ϼJ$5#*n?KPRP>U`~9!e)%ԝ3rn%+(0(VYU]⋮Dk3o4ݘ|SxҋV>RD}kcΟx?ڵm%@ @,8 w@ ERRRYa@  ]ۖJhhȿ-@ @𯓚@֧ @ `XXm2,RPUt:]rה SF&+vP0`KK'æ!$<_.cFyRq5LEGXx zUi<6/@?X-V'"-*EL.eds2%- ._j׶tMBvL&3YYHD@^FSV%DɊxKj :@-V"e#!(=^\AQox|DaDخ|+環kHp:mgrTm@'d@ ,f3ץbE,2J*J 3/dޠk0$_(hjbBR^+qn+:5N d\8e XZJC[2ưne1#i[h3ҡBrDTزetʿdx*6ҲimWFDR`ZdRiQ*9d!4@ XVkU|ձkJzi LTgewO5XL&/d$ a ff3I,V{=;@@*5il;?&YdXeTjx1gdea0Ԩ$=ʂr Æ4$-ajf8e$%GKv6&6YqFk 8@HYVŚ͕T H`  ,2Mvw@X3I˶cW@Bc ңmR- $xq0Oe9`Mi'@P(bflh2`6g!3 !W h4H>$؃lZIMMw}iܽs )))Qp k* X ÿ9B#)dz4FE&+]Et'wgsbXg⟘4 6S {ͪQ1̀ dâL_}M E8F~?1zZ:W>W>fՀݬ%ޘaH|Uә2R9#~"Q }4#0Shm㈎ DB_*w^q Pə+6y9'뚰|8oA"?Á_rD=ZF@ JrF*YXSRH̲p9J2FwWҪǞN0zVb+:NBLdE`ǩS&ԯ=ƌYXdg 2Qb>(vLR,wu. K8N]dEBXlT~M޾\=¦DmB~P=m^_t l Qò9e#gAlՀ^@{e=,z+lZ6$#&'Z0KXleХY 1n%\}ߋ#@kLlc[7r*KK`Y20$q|G;3dcѦ}$ٯ!IlW`9w %ו-Fk֋BP@ j!*[f %ϷFl<5Jy#-3Q,VS $/CvtZ ZF ꒖J&Vn+QvT1) B]JRP+&}Q27Kc%#|VwoavfaބIҨ}T+e9hPTHe!-1 RV+9j(4m Ia~?}hԒaAҠo$Wf*vs̕/0~^iԨUj)KNq)N0@ [v;U rf W6wwpt O2ۨ/!_uT6 j8BRrz+%IBPrUѨKA1EQmvԕ⩦K'LUWVbL A9 )4BxEiJ:$cyשAy 6NX 6#aHS(x='0Т`5+<[:P7 %|E<'DQ+}LNI".-3}.kӀliWr2J#}!ZݎfgjTlvصwVJF)Q ] UjR;LLZ2P$伶(5b`ԨQ@9% l4Ul칍VEj j_| v J0f@ka8i)O!}iIH-% K@ AI$l3zOgTnJ|h.jJEF.ͣVA P1pE,ݜ9J,dH´vL&2lyt[}'>#>#>#>SIRq$݄l"ۭNҜkݣ5_L,wE9avS]b@XX8/^@2Yd (NCʕ+l"--uhΚ!ׇOZFu?>j.-;,lkEa Z-`wܼ'|CQPʇ5~1/vhqltwG[7% ȿ>IgLu*OwqNp\ڞȞVnoTizɩ.%"@pШլK6Q7 #50 a]koIĚLlp/vo>-ˑQceX`AFdggcilՂZFr233KbH;7}7[]櫧ٵ 6 px;1lJSlSCB6{H'j\ZQS[@ ܢH >oC(((lY,3R1YL>e7 hd߿bAI|5mP;.u$݊7 iaQ7QaQ}4/_:^]6f r+VlоIg4j-"#!9XIBRӄN#K$3;Pd6e G~80>xȩWI8e1 (f"3;sΰ+a]UϹ:tv ;p d$üs~n37n[Qwb̬ **^:C.YAi`J kQři8;Nd1p k5%<$ll1x I:U(ŮۑJsnvށj!sEQ2`Zzn37n[Qwb٩HZÃ(μnGR@R9"]>zW,+ߴ";7l%k ( ryz犙-6KC}:q? {f ͧJ>_8ɽ͝_oRJGRIDT#25kZۯ=ք<9qN/2Χ\~`=hҴ,lW*?5wW^}rb!'+VΏU+⍗$nm LxD8Ǐ9X_L5 _J &יtˌxi8uœ=>y -`ܔo)_ٷJM捙:w2uwQz8{O? $CZjGu\5(*OQ(05kS'}99:u|F{Xʔ)a#8q.#}1L2 FsA.']FRѬY3>}jժs1^2۷o'Lcr$/o=}v/a49}4GCRI^eL&l/w`#HOO%+X`1|W#Fw<bkT'33;vI58p wvm(BY61z#=-6ѻpiFVh7ŵɾ̵G<L6ϾEe{RVd^M!== ơh|e3|Hp,wd_-bjf>6;zAs.D]~KnFre?0炣qˣ(|J~y>+ϕe(|ӟ~9Qй}N=oly۝{ۺy+ulG;nJ7~>P9:Lpp0M4aaf]\.w{$ *9w +^#?RRRyiڢ _ ѮC[ٍ÷>>`ܗXj-WX,ԬU#ЬEΕ(̙ )VQCiquL4gϓEMrgd+rG >=(3 >~O=Nvv6WIF xnP8u4~9' 5%0.Oa:s(q.F m^<)zmO֭\%:q._I$6;z'y̌L[V\@ xaH{\,]ܨt[uc;-%| z>yY3b ,s!eqo'q *VC>v SXp WU6ǎU=ڻXV.EdTd}q|%[5`ߞ |ls"FƱ#ǨUq~%b9^ƒ/Ҏ9ΘQx-Z7_s IDATCQ[P?r%wyTbyv{^f *e(̲y󕷙g*U@Rbwwm[৅L{._N&FuFu)T/˳ޭ_osPLf׹+o3u$G; Ju6&|5#Nw3O#k^jJ*.^}耾?725kiPT.uCǚiYm 6lүJqBARaٷo?! 0 ˣ8Ê]1vCyz+UHxD8۶le劕tws˻\Ȫbg.ntQ"yL~.]"l; 2*QmfŲ?yn0]:)MY?1tbG/9E~Zi&_{kpb"V.=>u];vȡDDF6ǫˊ gb /3ԨbaՊx;:5jy,4gDFnwȩT"Cs9)}Z͎m;9yƌyaCefNŘ`huZV회}u>sv6$I^⸏20ܷػg5an+]Y_=r5p`_zvEVd""8I""|>~=CQ[P?((+_NWڛ3:{Q2ǀnd2y9[VdiJb?{رm'j&-A=``_yP.E* -qn<;rW\e_k]c~2w>/ Ô&a4x:ʈԵ#O4n YY<7jI~l.8IBBCr~7&1(^P/_qۇ.gΛJBRruPrp!/33KW`X,^G%tZ)۵<9QXdn 6@\c'h4To8c')YX"Z6]Ƕ\MawSХ=V92ف}7<֯_+V;p Fc mnkGeTZL55˖Mرm'?ۭP8\GηЬeSaN ̹iךFa:swvH>Wj;uv *zkR2M[ݽc7;`ڏS`_xe$ DWf)} (dqp6K& y S'ͤm6<oX[wtrn؎KI:ulKXxC}z>~8ܳ??JPTYR6o˯ _2edկǎ;]6eE˨Waaal߾#Rسe^:PxET#!! ('g(H~9WƉc'^ VSd_~O &$$-_xPx9zp.,]uٵ};ͪ?VѱkG +XE2m}cΰlcN/\ZEAޜP҃a_YSg3kj1ܲ,LFYzݻN:`X{ڣ -۴;Y?1j̈B)isS/}-Jw.ƼO?  oŜcwo IڶDQ`WУY5?#(8(O:Y;+Wn8;pt4ժWsߩO*;@#s I8@@PUN~P|FDRRֳ+={pU׃l/<!wÝFgy۵fܙsM;&|=ѝfqw wcNfN1Q$2j{/t {дEqVK"[B>Pu3O!s ~1-WIy7y7~eʗk>oֲ vi۾Mlp:aKLl4e"i =[.]FQQ~v :Trm$'_}ywww ݫ(n>7U`8~;ɡ Zt2T* ZJ%ㅟ5f-H FQ2ΟK zn  _MtVL~+g[wڨ(9Bi0Rϝn^aY~ͭCΡo&}U^dH-JesHڮ?׫ NȄG1I]ys~ay字ҽs^Y=(J+;cҨޖ\ȨՎ[fcC2(RQ9Ҫu+fϜ(4l؀VERbIIIa#G|drX,t:uyٳTϐӶ9TRaZh4[`10<]9.]/?,YDDExĎxǴھ*ժR(W,?z{앯p?zBs{#Ft)ɝh $55+_M焹u6ut<4dXط{?m;q(SQw~=FMRR|ۛc8wuS_ nݴm[9_bx7bjp(0Tʧ֨ܽuQoìytֱ@BzFLl4?̜Gמ]ٖЈPT*Ǐm-=y[L Rn]t:-?Ѿ#e1}& `a> ;+/a Dב1ƈ1==q`9}Q<*UdE{Mt։uyH:[x9My7g~u }<ϗKth~]zt"4,4tQ壨R [¾=;w=3Ѽu3j$(X*qXRy׬N9u _} j]t-4}x5dE&0(rsm~Y5<8]дe$Ibтٱm'# CVdCiݮ% soVfO7^Q3\՘/klAPםG4t璭qY1~W7~_4W(*`-H`tֱP>_-řJ2}'&ȊL:ؾeWy۶lGRW߫/gZZͺ|üئxm[yn*8≽Ij:uk{u읜K |{na(^ rHX/:!㾇!<"NÌ0 |yѰu6~y*g?Xfۭ޷L8^GMm?sn``ѱѨjfN͝ށNkJW'ѸY# JyfІ>t""Yӯy>w+[BES#R$aA/\BHH0/}6g{]q4׮GMItؚIKKGt JOeij7kn# X7rʭǞÈg^9u];Q&;p5**W 3=K,hq 0xaK<0U`X9}[$Ѿs;~5`#VyNqWXL'yE3~l6+c}1r8 @~y]vj.]:3H* q58y"!˖>NRJ4j+~X{Gq׳h"{}YYYDDDЦ]BB 5c:CL7Ѿs;HJLb(6oB+uߝTvl۷Isz+G/TAέ;1nEL~&uks~7wus_5׈?aʵTT.9v!.\sSF IvG"9tKp*#@xDuk3woX*cGfM{GL!@}RF™Sg/\c 臒kZGu(LUݹd+<<=t/O<<$t} J fsR\ǟ~I>11#^$ X8syBGS<槆]9} S&L㾇q4N|=rWXB^|ey!""#8<=^QV,*￙Lמ]8wˬ)s|@c QCԷ/}R+&f|˜is;GR)Wmnk?a|8&~= LhX( 4 (8ȑ&~_&/2 ghMRy=ѣG|u:N;镧rJyEF˯>/T7Шi,SL 4 +;忯 &6U+)alr7sm3/֮DŽ2w0sWSTv?оm0'B@}<(8:khױM9tQ`,m)w{G :vsj> RhѺ9%.s:{PRBmck͔/$C$#i֪OmyLjsDp>O]F͸|Ln:0P>=XWS@c ~͸/&'`Z\2mڷ.rވ*cƤYb TqFyp}zs#?-pEAR| A~"#eww %M&,i8(M ~: s|&j?{d0[=S7JinsO2'=pd]⯯#ܑ ,],#tvcG=d׽-a,?s3f_uw+8(C`iKąpBٍ8YyA0Y^͟v3܊\l6lʗefHMK%8(Lea0`fUn gu/jOѢq+7l%0& IDATCj@ GbVޏ\7 \gXvq1ēs}p{%;7)~9bAדEZjZ&?})AAA?w})'N-r`:0/'EȲϾ+mDDat:s_,_+b,[`-YΦPՄ|92n#ZSREw.\2ϝ?Vr5?`֌ټYml6֯!2UV!r2sfL6'@ &_}DC(>+&ObPVMپ-;7Ѻm;Wcؾw+&`>tX23tsaL3mڹcvt>  yc6~->Ȳ̨#Yvׯ"$$͉'@ ?{EBzא@BZB ^H/tDE)J^Az6DA{vgcw'ٝl@{}ms=9s:tP|% wwwZi@[q&4?}o6nk%N|r;Nff&N]/oP%J I<ܨV* p<9|ȰDUp2^^^ QcJ2&9q0Lĉc'R UxҡC:t:\,V\$I@6iRjWlOOOP94T$I9#9F!n`>ͦ^uLl Iul_W%_Ϝ6M6Sr2/FwƎ3ׇf)+,͛RYe':tСCjA`ú+^!r(X5Pd 7ģccغyhjIX|}oWP!P0 0E"+]%nߺE[:|(۶"~|eMNDhޢMzXX(,^DVSE0է'!hy*':tСCQn`0r헲o8\BebV{tIrb {v!qMiHrb {ؗ'CA2g`vըYɴH;I^5݃^FHEL*mUX+VӹCdDǗ:0} @ۖ` ?| UkX5Jq{BC:tС!lM6P% ˔ذqC||$I2O> ;w "J 1.\ [f[M(U τ3̤D 6N{oB OB b2)[,7I||]E>=7/ŋ0%Kvrm/qo2jHBB1$ITRHfx.ժWۋPhQNѡC:tśJYtkهGi6?:tɈ`2:tС`0pGa >޾_ӡC?̬L<1C:tx$ )l|}ltYɈ;+O˧X~_6=lYt?]*猺_jt_^-|՚|Bc-|sv+svOTx֚y~Er{R4UzZFW9N1vy"XzY,06iCS`2탿?ndRAvM9|JJ 9ί-<SQ(;ΧLWBKw8պr~E6 `xHܟ/2tuPyo~d7Ox$ dfeڈIWux$ QpwwG9dlJK)Ǜ3WZE)rjj֩bNQ3*inRQsbժfy͡ߠ$SWeIrVSk7NW^[墐(*St)jme V^լֶ+NTLTE 6StkmF*R`ͯU&j(UivʄZjVB{@t%IoW^)7?$)S֯NŵάZB\j2Q*ȎIYQ*9Q7I**t,s%s>gN{zdHt]66hn_Qݛ֫}F)tY QD\e9ή-7MMбY=te,zJX6;V;BMqUAEV:&5Xu4՚iͨ/*PĪ'*;VAG4X&37S棤):a+E~y MZ[vDEqsX5^cJ1ƕhogOPIWyJ*eyף*4MJG^4q2 Of rKoU "XzP*d9n *rpXXjQlx'gϱc>Z˱"m2np-[ȟ!D)+NV ]*ڡ&ŹyΫy#GAը)o s_oBPAyC-:t' "$&kVBDopf}p kKaqV.iéWjd3Rg$oc[|U+~2ǏWtO%~sZj$5ͩjWQ )>vh; 8Ub|-SkmJ|U$f >!i}y poݩ8`"6")0,f|2`E`2B$aú 9|ʑ.$lEXNlۺ/#~J$AV|_oQn<tG_x3͢rL4>v|/|a-̘6f͛:봇i|:k6E%(8Ȓn̊%;RU v)]zfQ1??txe?؎?䚳KL?7%K?1Wrz }Yb M6GtVXELG6Ui_17INWǔ}t.Hsm 9|QrښV9?~s]Tv3ϤBx8~~~R կ\mׯ0Oy2+)<<MyEQ ++'|@DVL &9( 9qp8lۺ ɨ69( ;];"++>]~l9}4,QZ`$1 9m2Y_k(dc9ݵhbǎ̞5A9H&DɄ Dk5þ=8%(sβ`߿ xq$'`4f۴Ͼݶ`Z5deev8`ٜ?~ FDddd69xlڸYZ%g{8=6nvPGc*[TYϞc]def:kʱe?lǚ[(]4ya~Xi}w5c~]Jrk-7=RSN`` Qёt֙d hThcW([h#k`-$$_(rʟS%KR><75J\z.ZṪ"G$FXV\Ϝ1 .P+і9sn9m\[N< PLiO_jkGu mRъe+xp;w\VLA"$VAYs']a=ԺO`}_ţG"*kW~ 8Ȃ`)4הUs[WNSԮL#9#Fө}g̐Cm̚KDH%"B*1UoXd>.^Gk}iii9j15@>lG"B*qu9niߦ#MipPt)VJRZtٍ [kC Uw{hy#biڠ9_~BNk9F ݏ'BHĔ(MhRcHNLa˦y\8S%*m:r_l+,d`7L̛Z ]N/tҥݒAC3ZUPj¥KWyb "LzVQ&]^.sebطwwb8)Q4c0GTX q M36 1qkTgM%,<V-*.$VMJUiEvAyk8&7cƭDWݻ$'ԣjt 7nڔQo GA]Fb|$X͛?MvMrJ2(2{\Z6mM* GWg̹6_ ;ئQdúM4k؂؊jM[DGxDH!.=rF#QݦEU#1q(rYԓjKjȜs}`Nk.Ӛ}qeY S'ԠK ??K fޟlֆ蜵AXש{3b(kY͟[r]EVFX ;ljf//Wڤ9ĽܳCs֧jt ^|zATX 6l\p ZtMxcXn߾㰟LiRv#˺ڔLkȱtMцW:yT5lA|Tub+Ӫi;Y9s{U1{xC=JgϜKmY%5=s.ߚ@:k?#*,gyrJu!#hҌթU{ɡ̵6Ph)\m+ƞ-O%K0w/V0lk-E:x ߥL2 gYq ZMѱS0?&(RjKŗ:R)"4ϾqF.9w<ƌXb<_އ&3pΞ9ˌOf1#57B|k^؎_€ݷoow&PXQ5iH& Yf=$ɖqF-˗~~@=HLJDT~֟-o 'B+\Eߞ}N(]*a̹,>&:2Of%9,w2} xY,, էW ,( ON$<==f׷;JW iK-yl*Mgy)絤޸7ww <ۦeZl( HbNk]{t&(8QX4 o59{,φ<Uv wǒ0yΧWެۺFvQ?OҵC7OfҴXE oƭ̙1YS!"֝mҠ.=!0(QcF "EAL ye]?TUWڣ 5kCcGɁ_~ek(\0+XI.ٴc=E!++]ۿChܬ1iZ!w<R>zM6`6$[zbŋ17bk("E ko ҟ ?͛7(]͸,'ELhʖ-R_l\,Z4%a3?^gF ό7!ܽs_N?N^аIxs3{=JcبW-QBE; (}P2xKxx3vh)¶ټq\FD7/id!埥~zvs@E*FFG:3k|8(|||Vt?>`~rc5Z8r('C…8<r Gn;ÿ)\,l:Bx( gg˩נ VKu2ZO;֯=׸Lzw}Lh?حKwna5 !`Ul2JxNpsggۯ;aO=bǶdgpkhٺ> ʖ+C$XXaw&ԡDJJbtؕo&kPBTg?~c㓙Sڣ ;tSGkz >_6] IDAT@ԯ狗:*WS1 ԯ``Sѻ;ŊJ;gΜ`HQPZU+oQ4nڈyscDDsMqo m2 :w}Gؤeggp" _7ٵczv5 _,YNמ]; I gl8z(r//'?xuؓ'OQIW$z|˶- C}z%"'ͱN7y64DV"E˛;^^ddd龾xx.EVKaшŭؾe~?N-(|4 ѩK;{5aӭWWNJ- L:а?= k!I3ΤSN-VɎb-]|7od,eVϞ=[rB" ƖZBu_>+$n;e}pQQ#$OF@@UU!igk|y&E!NnnDEGO]Dr: |u 1q1@E:v@}9)d)ݭ@(]zveTn/Vr>[X6B= _׻a6rqOd SVZ`;yϣ+:Zy^jH0dךWق>z̏r]z&={`~۸Y#M}(y _?_,[0 ]APP!yj5GwIAւVT'2ePzU"*FU=-M4NKK_xɵ*αZ<i*P0 mMkĆ5xh|Kڿ؎Re/k 9#-sS+{QF_%L&SX~]rw7P'%kϗ8{]esjN~ai{37t7Fc/ YyԇlߺL"BlOv*Fi}4(4qc@hh(ޤԫ+HؾuFiڼÓedmސXQ0P`Avtl-gT 's?cXf+]ۿb⻓2|5k 33Fʖ7w+wjmQXs֪U>qdfǓ7%J`sr!Y t/_AA*,?m&No`ԛ#x6Ξ9Ǜ#ߖ-(ϵ~ …K  ecEAȴ3^^7HDDVĪeX5movlEF0A?:۷o[EvQSʕ?wΓhSfҵiBNdfd9dMArrbLP -$hٶ/<(\~r=׆VZװu6X%K,eOyxy{$1=^nÆ'(a_LE%~:ww23mzή 򓪼S= >P0-廯w+Yl5o&7DY,9M<{zyQL޾> @& 1xW\cy6ʇ7N\myZ}CϿHM}(?+V;";;[က߻'ݭb0~Zr)iiitԝvҶ]EGW`xesMm}mwwwGdee1yep;3>zX۳x6o_co8Wlط'R>,SƜvitͥl2H[+WtQ|س\tFM8/['xbtQ{g>CRrb-~bO{wRp!f]=ϹaY+U߶'IbRM54}5RY6̙SS^ ZǑCGINMCB9W5O/Oޟ.FCG39<>?{gNa"*Y(Y_?_~k״IXɼ/$ׯ~?;uRs[Dž\62}?+W(Qv6'sY91~b=!k'ȴr57J{l,ZQTȁ777*D!Egl_.ϖݻYEGoί 9pBG`E ^|Z|(XN:Ҫ] :zk71d B(SO( ܺ%+(-}iުʥdef7DR.]-rT gߏ?q- 1iO&A*"ݍFMаI}F~e-ah9k%"yenj|;<)^R΍$$ՠh"lݴ[v<\mg`o}eL2M(3"| =׌30rm/o/nߺ9|tLevnEbRV]z R?.>5+Ҷ]UIƼ=n\AdT%S7ᵑh߶##9{,LF)Qj˗pdee3Zo0s ٟjWܡ+3giޢR>Z =*G9 ɟABL&H@} ||}H] ą٧G QR==xep_M4ܽcV@EI"2: ՘Tn޸EXD(&54y1>>>'\2jCn.j~kmЩ>j7˖kfYH9rХ=sg'##s}PL).yKQ)I~=c o KӖM!A*5c00voh|||صk/JL|M9GgNϾݙ;c>Td>gjxa⻓xJ…XZ222r7شԕ[n/tjƵ5J9Qr[76Vё|$6Avw+OYtHKKِg)S]Rt ~>]wiֲ)]`Ԏ"Ŋ J 41ӅVE0,? g1l =^NvV6;}m+ l*㬨UUװbj*rMlꔎ}Z|$P0W\%==BAD1`F sÅsiФ>bm$%";3c+iVlJX2sƍ@VM+(ISxob;֭ӣo77kkb's=J-Çi\~Ŋj |iZynBkV,]ūӥWg+7)LYX5~0hծ_,Z(4kT֝R΄Qq]|mT'O935^^*]*1r!s5F: СS{8 觬-18wNOܾ} MHȳGEG1\>2Wz'P0=zugA2)]4۷lg-PlYRץ[n*{jUh.FAgR;iztaO?'}O `ѼE|s ЫOOYAb嗫XKN589ց[PaF||}(R0+!Z̛8\+I}B4n0?ju^&x"+XͬgE")^oa|t>x6W ~@MؿgMA-Zᣇh eʖ&Z4}5dRF_H!c+3oRP 偽'sSQ`>;oݝj5Ҡq=gڊo7n{1w<;~zHǗ9G-ߩkGYt%@:v@\X|w4O搑Adt%"E %[Ezt6edfdH|8}Kf+%I>yS'~@hYeƎGMf)R0TvHi[SF*WIF8],9 gkr>G .DMib;DArLMg?g xxSLi'Tݻ1Hxy@o'Ѫm >_FMP@ΓW;EtF }WR__&M?˓ܛ# aRfVZQfc3?>=g<-:###wˏ/wpP'%Wq9_!7v )Yw\8{1_m[W8ϬC' 7r(UWS9&鹍(\Mb[-:ta:99}owhӡꋒO_2ib-/Y n\g>'"2b%#Q:6 By||}߬[??:a^||{. 5Pd]A֡)O'L¹ T\f|DQoy/::MwС)"##K/㍤WСC3և~ 0HE垬Ez#N91_3L2DV~:t Q_աC:?>_/I%̧N5:t СC:< :s9q(͒ZR(MZ_AF$t(_$|}\o4iww޽K>͊j15ҽ3Oqi۶ҽW7|OM˦hѺS>:t /LuСCO `|nj|+g.ⳑvqn ,Bij|a.߸~dgm6ZiJ$&%އb0qy=͙OEؾe;Æt.C+p`@n醛AWuСC$"EQȖ ߹wQINU(']-I/k.\v  Ɍkl߲KwX37%^updR{pGyP:tןbP1o pk?kWѥ{gnߺC&-9j$T|hVw^/]NdT$ ѻS>ʰ:4$`0탻;>-C:ta0p.- Xt9[4#88`j%4+) *3>/WѮtYYYYo@v:c֯@yXDž C:toۗt|+g/+|sחxu0nߺmWSپmkVaoۚ]5vlۉ$I4o ???ڶkê/W Fd-:tСCǿ❠|+Er%DuᘷU+V#"vK[z 짙V`P :H/o1fXj''QpaV._ITb*V+wU\ 3+ww|}1СC$Ih"+;o|+% 3/TR>XܸsRh ޫm۵I[` kV߀R*֫˚Ukxw#Ldal6d8Wd&#xzxSޞޚGX~_6=lYt?]*猺_jt_^-|՚|Bc-|sv+svOTx֚y~Er{R4UzZFW9N1vy"XzY,06iALr?wKSP)|̮\{wPx9<=4aϏܺyN_$|M/e/$&%p~ڷ&_J{Nٚr|t%t3]Y[PI|.Wds-d(Z+"N^ %ŀ˯扟$̬L1=֗|)W<{poWrCpE k7nHN…Yz oٸ-t,8I6ȣG*\51h@ټq ͚7u5oٌٳmv:v8tp IE www퐷%3gUZڜ@N9Bׂ-J+cUSNmsZPMsk{V=5k}eM嬰~Κj ^_gn䝮VE!?QTj**piSQ+ڦX+գLWO2>^X e1uPS\rjUNA?Vi͡kfZ3* 9(,vrubuHN,ˎXΛ򙷒^!"<D( [vDEqsX5^cJ1ƕh**O oU\TIuYȋ&kSn O$ݑ.Vj RY_OJ ض#"MAENk5]MTusԪPsǽjrH;)t%\nRk}Xı޲뤏cI-՛\E; r8MsUW];FQ1U3 ~yꛐ-rPPgr䂮 ! "$&kVBDopf}p kKaqV.ié (-*[pb5{ljOR*iWT$o.@Rƶ9TZ* RA~r}1msٍN~ժ;_TZۥk8ɦEBsOHvZE^h7Y'ׯ3ܺyf? QEA5uk+h y$KpBgm9|!MsWpDĉ??xAB$.\Ąs=;]S-lڸ rHjC>:>*7A $>pUޛo\245T F?įڥ{Ĥh(oOLh4{cN'/ǃEG9f/s9vz/&qunj\\\k^>.ߵ]cp-k˲v={I .\;IڱK哧/hb>|?QJ)-nޖ7F~4+iXr ӔW2yԮLdt~ h( 'h ܾͶ0im("¹ص+2U,ӧNhb!&L&%X(LF(;> Z4cfϚCp᠜z$dBakT¹sgY0oGL8R0mgn~K-2w\zfeee0{lΟ?g?#h Ɉ`2b2e`iݝ hݶ5[4[P>4eJ?1z`uDn$O>[(]4y!I6||w5c~]X1(߸m޴q`` Qёt֙d GVkD`jt@'q% $3yBM˩??ŧdɒ-kM٫Wѳ{|Errϳ>q9\HVPdg[q=sl.\@B-}*+k;@֭k˩J)M)ߗ@Mt>:M>Zl%N}}󔋄zEHhy ˮohsrzcUZJժ}0֭YGZ#֭YG]Tǯ+@ff&=?Ν 2ٵ+ĀA:|ȿfq&223H`mjzg߻{ԇ|s nnܽs?cQlٸsg̏ܰ>G $yԫBMsX6/Oizέ( .ܹCjC>[ܾÖM׻?O6-eqC˄I4:ɝJIT\޽}69U_iKA2hȭ[.txok(  ,j?FE$ Q:$+#|e˗.Ѽe3:uy̌LNuYe5^^?%Xdr9PXQ[Hvr +j5kїAYs']a=ԺO`}_ţG"*kW~*sdA],Ogȡ#,lƌalӒYsgҽW7fϚÑGXv!L99 ok8t!D/mvZ7oKD*D( ˗~i.QvMnC+:"eKEVLDH%#bU%I/k.lӒۤ_|J6 G%"OΝ=GN݉Xt:S>J&6q˖.qJ*ТI+oݡʧUUzj4iք e|{fϷiT*Qoӑ ;ĥDUfՊthۑo)F> I5KxkԈKF\_+WYq- ;}ļ9 HՀj5B.]l^-y>1Ua`!\tEN7n!*,(HNGlxm2.]&*,}{q!*,2k 9[GTX qWc<6 1qkTgM%,<Vԝ_ ]HZ*Ҿ͋(q4LnlS[w1ING *7nܴ)FYĪI67g5b9~O۷ۛdQd̹lښUsm?16wM ȆuhְIՀ-""iԩB\d5zvñ?岍F NMFb|mhQ̙t'qըԐ93b5'4\5yT5xjDѲI-}L: C֩Ξw?kcn/ZJ:tDVϞ9qTJν8u˙3gյuS1s}th"IIjib4 6/oݺkCGP=6ᱤ$5``6c[4k\Ys1 E8a*VRhe諠ӂ C@!w(JwwVH@q$$~ldB˼ϓ޹g9s̹sX2 -JPӻw(J-Keխ7Ϟ>K7UBW؟JЦC[~y>8{朖m)6hf,v*""~tr AƄj?q$M5O ugڍ:e|˂ey)G:?|Z7ouk5@=L1|״=?w\|ߏ@*ZaGFo=%)̝=%՚>y&˲A5C?;Zıќ_0wk6d@i`EyUkӧRݟ~5uajw0+֢oq+ϙyVvl߉=69سcNJdOj GcN*UH`b: [ؾe;EwFS SgN[7o0˹E&ăyOardN</iӾ5ao[HR%ȷ4onnL9PWF_c'ѽG7 'g fffT\!y *GPlݴzꇙUW3x =ٴa3:vT1gNex* 7F~pp'z)P)1e=bZ$)qp"/^I;Wؗ|J}z#, 'Da xR2=~*(_,FFF=t#P OoOl)9F >,jK^ԤM>eF r d -hfUJT”8KiRlۡ566J/Yɀl/eJc[>._LBܧm~;QY< tf/[5#766۴mގ :[պ ,b`< zvgߞTR#C$Nzkk~q0J {{$~W觩0e4vhC%x-P*1'.^D߁cMtlәv``O||y˦TUQQ(@xx8%[^O {HVכ|2N8rqlٰ!`_W,ga;s}{0mtBB^;ONvL9gȓDž )L5y3dPǏ97FNn@an7{֨B]y ?On0$u j|\<5i # ޞ}{g^5*I {w#-YpJjtJNjS`nnS>zGTC*JSYؘM}Ȃz&_u jrL15m6׮^g̤QDL҅/:C5&]XjMZ4óUUfݪTaLP%?0^m':5kjG]bܔ1$'0ozu͚MtC,]UГW^'KeIeۓQ6$8992"U?PM?zm77A֝/E {S$?_Oإ7aoزq+-+ϞݣypGRc'ag]YǓwؘX/נ.:E 'wQȯ渺rl5U(ЕgaN(_< sУO<<<2'^f=[[[J) o޸Ą\]ˑ#'Oқ>113fӺm+MXJP ^>ɴӲ (АeK3`Pk")y]v)WNhGS,(vve{:pyRFUMWp74oԂ;][#G>J%kWm6tReKq͌+׹t2va#ܾ}O/$ ,,q+*_EPVE o~.](51fFNϫq-q"i-&:F3 9P(046E)3 e 蜬K;rV6lԊQt LMM9qWuj\gW\R}{@OwZ6j#5Lwtg^B g)Z)~Gg 6Rŵ勗q:u9.I7_^Kפrj,yG\'GeiTZJPZ}/Xʰj/"E4׮Z, kkΜxȻwQ)_Fxe8>њ#bcb:iӧOLLٳT^1#BctM+WP67n!iy칖,%oOCa)dJJnݼ@:\3<<&xl߲_`ffFlL,E!Ii%)3'krmMϾ㐟5N+:e5Ǭ,i߹-wHO[xYĩy&++@J8vm;M=|D2ŵdȑ%nߥJʗ$%ׯ^~J,$IEXhUTVQn;F+u1!;J Ps&j)U;{2׭TQJW[+ll AqMV|)=mJ6xk\ׯqɓKo_:VtqJ%7o$ȡ\}GJFk=?9tLi->BCBu3tpfrftYd%+~}4KKs޽Sz![24׌-QQ=,,n)&){ko۸ReJ+$?l߼~~% KgOCʞm;]՜*聕\*յgk֩έ;i\) ףwM k2ߏ77nA5U*$޽MC]$(_,'mV<S9eVٝEw8Kr6ގ7n=ãנF3cqqw\^111ȏK7}Veo޸J۶e;ꮙ(8K2׮^333M y!Vjj*9DDx5jV+;iZߋM)y߲4/89;iNAGll OjR0E,9::gН:0Nޔ,Sx91Hn[1fRbgSf[ MpܔŪی 9YC\z^|:)rW_krj7Sj&c4dfN:~?XXSȿ,2lR$..2oll $aemoA6B)^2P+́_QZ%dWO=fVaaay IsR>uXrjoljBBZNbbҸL& ez"%t62VS|BBu"WҔАx=婾.)) u޾R&&:et 9Y:HPQ]~ KKr0ShɺmPر+ڕXt V5+&N066BRG`RZi^|EA011An('.N^*T*JUF4mItIq۾GNa&6?Qv,ͰeofUg#cc9Stt6Q;TQ}~W|wϯyzvB "6i%+t2KhrgG㦍ptR/ݽs/ݘd KK"#" pȿ{^---L7$CTcNwjG&έXѽg7ܻsUtc||9y/ W\fQ IDATޏ+;s^Jpow8}&333޾Kv^cckCع}'9s$By6O/r3tbS=}:jg=ՃK.q9V(zFARgOQn:VCnu'gGZdbjJJ읍5ܿwA?"M\CLˡ~=uꜺ4gATiߏQHރ_(]$hMjWt n]ٽ}ܣ|Ȓc?8D)y\r}${.Rw5#c#&Lco8K.$>׉EL[տsN'f .@r%yT .T<OX^+;]hsxΚ{CJ\Gs/yʥ+.WJ#+u\EFDhӧ&4N1@Ao.vY100JndwKcz:^>MIŒȷ}#9Y:HCo؆ʂZPI]ZoŮm;7qɓK'WRr dܸL3)>^]rjׯ}?}F|\HJ{xxr9BCBW۴; y-?܀j5PFeʺUZrdev2GYY9iB)T88_8MkIYgw>9"ѻo/.]D6h߱%e]>rfNIx G<:yАPZnZ5nڈ=۹ .[5lrpss寿nhoױ-7nc=r閥1aXP4_ؑc,X2/zp"29}]wQRP"7ӽg7gTaJreHJJ'tA#eiN7"EďCGs==E S\F<ׯ^HJuђJkXR9Sr#CӍS`dlqߨP$CRL0ס{ mJjq)1l):ޞl^k7S? VPj֯ڈ%yuVw=}JQ/F<{ucj}} )-X%Ib{wi&x̯g9v勗겐>C6X4g L9Nv\rcV,^*E%Iԣ#=:b؀ԬWSSS޽}GZU5Kd#;eĠYq)G'kՙz̬ r:vkϢ9K)V(IIJf (JPL;ag-Gm39дevmCiߥ-9SaJr =e χc{`/l8v,qɓk6caiqus%Onk4&xjtK>Zjc[JMwG%ITQgd2 +21 )y$Ѵeco?ҡk{8vY)}K7oe-{ uTNV>RDY ic6-ϟ &&6$]ѳS~7: jc0'TQ;ݵAeL~Koa_vjRz%V.YQ~Mx"onT%{7 7dpt֎[U)&yrW^eYdޏ7sæ ظf3{ M;*҇<(ۼUWg^֬Z!|}pkVӤ522bꥌ1!"I+!VZ\rs8&&\pVaddD-0ZX41x\r2jH̚/{7_^J)E|y52vnۉs PTqضe˖bь5 %JcuNʄ64iiױ*X0w!n>kj\a%tPӨU]066fӆͬ_KKK zҡs{M.Ett A˧[s3{F0,!""''GM+ f3c,V,[IdD$vvvkXWANB@)5kkVc]*LwǷ 2Esq&޽}M[ת!>.e" ֨̓GOشv f.{{;4)̟8ll)R,ss3TJ%ߘ=u%KA|J8K ,BnW2BCRn䘗 cU*OϾIgDEEafnNU^*_ ,QTs>~}Yk^AV&&,^i&|$= PJ4k zSv,>AJO)dfk_ף'6 դwMP)bJ$V-Y͘ah('Kn*FDx8oަmz\"уGsicX8g ;N9)䭹63{h&sg.`rʔ+EA'r177ÿ?ɲCf(+}3:),Es3kJ0 8:;ҵgLQSQ]V/[CUФɨmmӵ;KLt ?Fl쇐P”1K^L=AؽH].Dǽ|:O9/ë74]tkדҶޤG>,Y/=3f_Cشg=9s9iu>e Vpx1s.&ιy>4jPs>dD\lvHND!fU:1a`a(Os1\Ud8tƆׯBXx5^>^8:;k#&:}P#? Sݾ;׸οUkU3(SVt1Y8?LG-Ȕ9155*@Rѓk\K ܾycgb%ѡ[UyGp]Ąmsn࿄”rpI*U4o7b!LLMD|@ X&=FȄ,@%P%puDnhJ9'dP.LaAN\D :6K$7[G[(d `jb\.B2@ >?2 !FF:焃,| vH@ _)@ B8@ A*,@ B8@ A*,@ ".!G/2;r9*dvssfeҴXZZg;O}iU@ 3ȑ¹|7dtOI/H2.߸@Oky)G%));lۼgk~7݈aA@ m>Aq]g((85w~ݹJl|l9 RÏe*1dPݽ~2޹w~呿]r6@ h[XАĤ `ldĤ [YUyeZ~q6lƃ>VOKwg<1kLYd @ 2g!OT;2;#?vn݉LF2 K<͖lK+Kx@5i5ˈc]T*W3*̺5ʓ$9Rt% yQ|UΜ:9vNEPL$66NKƋ/ٿw?gM%7+:cN LRj-YEKk~T*/XBR(Tiި#(X:ȍnf@ G;Ȁ$ 7r"QQQDEE1n4 >N_hbzɦ6b(nӦE; Y|! b̜:SK5)C2й;$:::[z ϜYsiѲ9sSFLe <{~ߠ̞֩]f+o@ Ah9IDBR" I (HHsJ9H2/)DEEq <RIj?Jא!Pz^.y\ؼa gQL)5KnٵcxnFvhؤ2vf~V.[Eݯ+KxN??i-Z6r,ZSS[1E!@ ȄM>=CF bڄ 11Q$%&L=W._W;OyBAr9wkL5]vj/-jt-\*~~Y#@ :=lafIU9rXZchd@Rb"Qoy>jej`aifW^mƎO9/YD-g8Yݱu'mڷ]/ ZeҾ+ztɑ/^JضG'G6,Nf\~h`Q5b4=zwVY666f0f"T@XgT^۷88سzZbcbOX@ OMtMjM9?z@R>`(7ŕjk`inIMMV-` , s zkvV-Xp kUѣ^@hh(Q?`ee-k6yGO !! e=RvMvZ,}{Ӣes^2`($@e5۴k /bú)ptr$nF fMeL4 f*?i @ V^$Ү^i}@ hڋc@ "A@ R!d@  A@ R!d@  A@ R!d@  ׇBOMbb"I$TH_Zc C!z?>$|,M!6>ayFDTėVG Zڒх1 C#LZ x;oW0%mŧ=B"^׃(LpL2K$˂:imrj,*HR&2~> XYXrpFe695%=W w8:}iUϊc^E1Ȃad dAm ں߂ho}\8Ȃ -*-y'7s,[ > 7i|jo~ D[|k_|un޸~*/^d~;Ϟ=d1o?~¹?ȈH8$[}j|-nu,6uzӲYD 3gD.ZF *LQ@5l[>c5x[ޗVDRީS077K.cd2RJiܿUP(prro߾jK̙3ɝ;7(Q'Nh坙 ;k뉉,[@Q@ڷȱ#Dz-܅̝=Sc'۳?**Ӵ_}uo˭ b]| kmԶ3-Z6w^ܼqݴC+f_P\BF:yf-K7oNzꇐSB|||8v!!!t R={6#F 88@f͚EZ{.yɒ ;mqqqthӉoM-ӿ711:xzӳw 8-ǟ_H똕U:=]| m+v/l%^G4k"UZYzRzR p@aIo^9R媕%OArw/ Gz&Mdx)խ_WjѲO!F7nX~ydcc#m߽54}:뗝RP Q~5BzL+勤"%-[TzRP1Hҽ:"ԠQ}Dҽ'wt:cdcc#}WQcGJŋI...RΜҨ#/OJݾ*s's'5nXZ?}LQ,̕S:tjUu4#xg KΒԷыY/wZn)Ν[ʙ+TjeE3pa}vZiv"*]JoY>rJAd>geLlXjTt)EQFj峐'=%GGGH"ًgݻH>>_r#G[. 9RlW[fI+v/2At9=~qqqlX}r1y5W._aܤq,˗.mVYoѲ9m;>[7o#be9oM]Q:̙5ؘX~ql`؉t܁eK/o/Y#G;l޹KKtT᷁LƯƆFR*qpta.aaL2Sfг[/vݎnM)U$SgNҒ6sԙ,Cxx8mZp,^0ƏQ?}ll‚1FcÖ0r9A8seVNi?BiРm۶e^5oFFF" IDATɰդ+^8 ܻw"E漡!E͛Y!dm}ǶT\tؗ}vr> 2uunhH(OP.o8n?1?ev߉\.GNGVf$3kF0;`עqK*WDYڵc7sgcN7OJ2I-3a``+x9M Js=V-_appgӆt؍CI3d>6!̚;'Oen]Yr+~, 4˫XpA~㺍 {qtrԒ_FU֮^_o޼G *NrҥKy1;vƌCz܂d7~ =z۷oTׯu ϲ ;n޾#,4B~577͕{g+SB=50RPB9 ѧv:# ׬',4-;6i& q&>xk<#O. dG#geu]U \=}CSFUnyC1o\ÜRʢPrqt KSf5]]| kَAΑ#I7M? g) jAް~:M52e˗a%uܼ|Keҕqa޽bŚزsV kioP?7oBg.͟I& 5;7nN1c*$ΈW/YG'G8_T Y iH Ɩ-[055~nѣ߿_븯/˖-cL4 {{ꄓPt___ >> dY@3Hb̙58[/}8|}Ԭ]+WԄп:tnOZ52sؑi~;88G2u4O9ȳg>}8ww}r*bffF*8|0]u&,4P˂o}^315!1114r&&&L ˶raem 2#e65ucGg89g}} eX-k: FFF124$.2711͕Ktt73K%uolln9аq~ ~ȱ#(YޥP5i8vExx8uKLLD&q%_9i&^]cǎiӆgϞammѣٸq#AٙFtt4R|,Cnem]\#5Pdd6qq&;4=df;"sgX[WؗuS|9J-nZPf)20i+kkMsfcbV}ϐX֤Yc:ʓO87,--(R4@'˂o}!eoͻwQxy{ȓOIHHHKKK"#"L&vZ?z_ 1??_Χߐ*K8{\2sbӵcwbc>ݶ2^2{ K#qtr{SL |-5'=ߦ]kBBB9y~=E53g&Fq-]+Y$5b׮]ZioNF777O-[Fuz{{{rE^m۶ٖ!dma?zKzѸi#͊MF"Kr xkg$;eu)"2}k}|w瞖MuoF_=ɹ݇Ę9 R2dp]Uјq 3Rd7 *GmǩR sf. Ҷsۼ͞LՈ~pFj긧Zuj`B J& 161&,4 s}9˖BP```ܙkՁQ,yуGҳOy'OB @F-<6n5c6mڷۓfadhH2%IJJ̌Re>Dڲx"4h0eORE S\F<ׯ^HJu뫟ػvL6x8",,jɩS6cG'x,NRb"*Շ}Kk+KtG'G^x+EfIVm[fZ:D]ppp4i###U&M\\|ݻL@Ҷ}{q%:D,H\l,;Stѕ"/ ,3FG8YF'^acW< rڰaFwA>)WZuؽU 7D0%2>zkʌɴzgm:} rC9{v#xL-W$?zB.ĬQhAq^<фԞSgsvY-o9oބӰDS|Yƌ +tg9L<#`llDܹ\w@^x?_Fh,Sƚd<ª嫑ɛGcL4kg0v"*QȯKV,b|߹9lЩ=}ҽ3V,_U+VcieI.d<.?~PF5VO`63bŲDFװ0*S0} ݏKf ަiѪlXEcaawAoadL<'sNg e=---ٶ{+L`OcIHH͕իj۳w/ԭ_+wB 7n@$oݺ5o޼!005kдCk׮ϟիӯ_?\\\%C iۺLkY|5{veͪRׇ hy.qLws|>ΞǦ8{){[ }n"#" *]UVd83Чx`oK2sϽ1hӧЁ?joFU{s. Rlw8SſKzkW#ɘ9me)lCč D[|I72mFmM+ڪ[b!dDhH(tȐU*e'm]%qOܿ{E b _mU-YB,OAt\ aqsrKy<>wBx@]|+!PU` ScSb⣿*g%}8 E۔ _ . ҳA| Q #:g!}_=2K#d˂:d,*04433^yƣWJ'G,%fuQK#NF6Y8ȂLC!fViIP*s,W NF6Y8Ȃ De"/@ vY"b@ TY @ Hp@ TY @ HſAxo'_Z@ &vX 9:ugOcxVE/!ܽsK!/aMJ'x!=8L7jkOtlӉg} MF-}GEqҫEzGTDP{7{1[%DchX",eٰ-}sw{.v̘:^'e?zlA>8 /ЦE[AǶؼq rP}]8tzvECwӡTY.ӯgn\@R{Gpywl_" ~J ; 0ӳK/nKi+׸zGzJ455UO!T&oAQ|[Ay9zpK.4l@E F M WOѷWܿGP;7ŶA`g3(t ڻAϮs mDF8ۺҢqKRSR uϟ?8ۺҲI+^Cܭ38~lr @M066FKKvfglϟ=G.@-H$K$E"NnLLLh߱fNcጌ ſKN}[:1~ Ptystr`򴉜 9M.Xd92L& @ZZxBvL&#==]/%%E>TG4uNYwFr5g|JA}p*g>}̹Ϟ> ii T3k℺(wV\+A>_9&{w#q$a^|WxxTȡ@^zErr2w;ʕ2E='ɹIL&#P 66}wNwn!M\7k >qXWW_ n yO"p"~?pZg*"Gփ/^r6/]s_DߥT-AߎdPys=81u<}QWW'99 @JqswѫkoLL-trNK}9w6Ow/ HJLzsӝwQy$ ^uy u004 >^y_]f*ӧYTʗ;ͨ,gA>/8$''cYՒUkV^-1W/͕ (W,^^TP*UXt>,*HzzJAU|㰱1`7CASSmm-h~۶mmTSWcpFFF *,_<495زsm|}0i<+[m"i4*WAmڷfА Hg 7}+3SѲoJ:~fN,tA ?ǎ|;~lI#',1-@KS;AAJLAA!BAAK,AA!7_b[zpȨHdiu(5ԥT,SG+gtu AxC9u4#nj(OJJ _vPb9   ǼʭWqG:'q-CML͊%Y!sھD';TLAA,y{hCS}:Twe+]8Z:*U矺)?5]AAAPI'"a_18;CS8 n*mkg5UAAAPYҋ}u%T#U>TO_5+}UDxX8ζ'..СuG\E?!}wV\Gkg6dǶ>5bF=xkNqo5|4ռpweVd8ԂԩϢts ׫?~pqޝ]zqcN8E-pwiʗ;_iДh uu BL&2'YVT*ESfw>F]]KA/L |X^rfdHptc-;2$\yq/K: IDATym7 9"O˕.ا'&>1g+]aTJC126W}8t Rvl۩r|2ܻ{⻸8t6Hr=bcrquiҬ v؟eUKtuu9}Ls%$qΟT`EYrB.!PS+EYrTPwR;!ϯ!?Y A֐R7ïRtʙGK"95g/e,{yDq9ftd􈱴nۊa,n=*U~ȈҥKc&Rti7oٌxj֪ILFzzzr=n4[u`@߁t==]ݽg.;aFzuC033ѣGGgGN;I@*YX$IR)#ǎ`ƔHR|,r |woao:T4Zhk K:FzF G}8d]bctAzOŢ%czO3l*e,Q7XHN.N^u߁ӫOORl1._#IOiiڶoC>=T߱KG^|捛Ylzz;SŲ98:9c6fϜèᣑH)u|^__v0c &?TXVA|XRRR8a2qo|s֣+FFF\ͿmAGG2WsW<A(/cWYZ*Rmô3axZnFrZ*zz Smh+אH$xzy*y3~$\0kPo'$G,]&&&2e0udŸUP_FǣGlٱIgߞ_Ò噥3ΚDZsr9U,+3b48&<,&s5RJA&ec7qoP?\3Ёy e2lld><1\ubcd.t }+3SѲoJ:AAEm`gb=w 돯ݺJۆ_+~fub[RR26ȐMjJ /tl۽RW~cFeI88sXJ}2AMGzټq _㘚7Ҳ }yv3wZUq}C 5"hզZ\84TJ@~۰\ܭ3͚7!>>jh:A>Ĕ>s-M, 4yi22Pޟ&qQlڰފyUh۲GU* Ux455iШ>&&&TOmܫS.'OCl۲Yj*?CwLLL|䧕Ke@8jԬ}t2}t} % %K d$$%0f(c̄Q$$Ɠ&K%11IyӵװQLh142k9ڷlՂҤ~3̜K"*Jd*& d͖M[iݼ 5\=G+Q6AJ |ʙ#e4T$&/'/䅣4MkRRyC9r%)r&qp*NJ!KdhjiWL 2dShٺ%odEgasd 'ݱ/_O,q/y'1OxY ľݱFtvqJ#ou7(-NCCZk|z*e^ƜGIMM}=铧*4Ѡs9ݸ~r>^ -mbA%&Ȃ (=}j5 IϢL&C&ȳgD< V}t ˩all̀9~8fؠ88Ѵy5C.ran\>yɻմyS3[N8Mp\kGһ{_Ő\x9a+Цa{Bai̷4R k7F_נa:fMͨoƠ=?}?.G lrףF|?i}ZtΞDZcHPW>({;ng9̘:$M ktb_̪y5eʘ3m4ZjG[9"ՔbnfF =AJ(&  e/&X  B6b,  و   d%&b^E#OVJ Sc3BKZpɑCG9&t*  Bq/|32$8X:Sݱk` .߼븗ŕkzm;X ;K>y?S/qq+\x3AAwRrOl*ۣd W^HMeMˡջW⍶J?ǎ޵G&N龷dw-FD"\r1UU444J,7AAy|7F&h#KKESz$Q&#%5 uu~ 7{et% EMXܻ{XFJ[mE붭J03AA8yE#KKDž{pqƝ=;PJ"!U>/o=}=רUɢaև^~8ۺ[_|PZw ,]r\}iլ 5pvoCvlɸS.vntܓG5;K?pwiڴhM7c-  S;)))HTL8괉3hѺYmTɕWSW#q$A<}VV@۷nӷg?7ma{ƒKHJLb1ܹ}h\D"am|?Z|ќ'#1slfN5+kobj1ffDž0}R(S'M܌  V'i4R222Pޟ&O+TߡCqqVWOٲeϟ[,D"ѫoOd.ŧ7_]DqD$,77K*J r*3jHר ػ{  y,I44$$%0f(Θ HH'MJ,IzwgƏӔI<_zv"H|z3{7nRLV|9d2.<ܼ ع)rllAAxy\μ/1+mƛ4HJMMk22҉yC9r[GWg'Ti)FHK+hjj׃(g/  "Okn4"EsqJr2/c^IřA當 AMM G'$HO{-7oܤrʨ}\AA+r =}j5 IϢL&C&ȳgD< V}tgB^F;=b,aF_D] ^81'q$O`Яyp?p1Ν9dž_7QAAT^5]μm'j0B4R k7F_נX͏׮dE|w &ӓÇ|ԮC[Ξ>nj3 zZeK1fXձ\:u053  ݷ2#9%-69AA.1-@KSK,AAs^K,A 2*YZ*R*3:ں%ٰv#̼}\rʩ9fGWOJJ _vPҩ9qY*+g(cRM3wA)cR+y]iD<`k_!\0hm;sTAAAD%%'r5P_};².m-ީ/\s-|AY UsL314Ů#"lg,''>.s.oU֖A( b '*U,֕l lgSɎW*h'^TD"Q|剁>#3xܝ<ɷ\`¥ƅzup97;:wgߞ_1lpsgͣQ@\qqyq1atW{wjl|L&c܅x΍&qfLO:8ٸPҒyooCY͋sE!8wܥsxyxhLM7OƎjT'OYڻӴAsN8gpzwC]/?m]O\\S'NӦE[ŵؼqұ11|3d$5pws噟T[o%^8ۺүWY|5upwcN5r):tl϶-ۑ142DtMʥ4l@7@ڵQ:;+{TwWZzυA8>>-[/o/"Fxb52gO>c릭y)+¿?Ǝz\pҰqؘXڂysTQ~8y_YGz3d`.E,ADijjX`D45%浫װQ*K숡!W\Ѿe-W&1g\"G/U`ll̋@r[;[Ĵ W-Һyjz]ķV(lEce]2221k֪rܼNM|.'Ozk[c(822D$%%3ߠ,lE\.']Zcٯ&~|=x$JsV#ϼ8x;ȉIo|{bGvna]\qĤőˡ,Dsطg?۷1,\Ő5fqʕ.ا'&>1g+]Xb:8s}bcnu7(-NCCZk|z*e^ƜGIMM}=铧*|1n\AreUp憖VP8ٹ8t6H\QrM*WLU**߻{O瘥(/U-w |H5AK޿{In_d9}ԘS_wАR7ïɩI}ɩI?T,cXbv cccc9t0 ʼnsrCs 3LJV͛ri:O153wݽ!tryo' x'gG?bݚܸ~NjJJP8ٍ7 ;?'$8{wAC0#8w~ݠ9t}}zu9ېd}"J9v۷`Ɣ;ssgZ5Ax_E^b!  ?ǎ޵G&N |tt(cɫX̻JEK5/cִٌf jcr:#-^Ntt4zzԨY=DJ_6,]q,R+TݵP9ػ930cL061 \Yb1/fռz2e̙6{-[a#֭YǜYsjJ173B ŚCQd=ۘ=sF"ҦrPު5+YdcFE]]ʕ[S3Sٹo3`SIMMe4jiBd׭GWXl%ۂ6eq^($kHNIG~MN(wnܿFi3l=mwQ@=dNGZL;K&OD箝>Z/ Ĕ>s-M/QFuJ-b~>(;b_.IiՁ}iլ 5pvoCvlɸS.vntܓG&QGY W{wZ6iVOAgJ}عۆM@fI~+ڻӣK/Ea,)oض5klJ/s%,ܞ_Ku8Z;[۟?P< wcSj^>| 7jAu;Vcbz >pwC9>Rө}\ܨ^Yg+alJ_pa6AAJVѫX|4 ,b~mG㦍KQ@2v LvNȈ &.+ -[uk3z(mٺy{'ʔ-ínӱmg5`޴a33bTΩ1t$:::7naAdy! ԇ^Yin}EY G"_Dշ6.>u2Z:8x8~u,^$ל^D9~~^%#W8T*ea/#njC1m[ ѭgWcQti?~LDJ+vJ-1ut/XBZ5IHOO/TǍ} ;N]:o.;aFzuC033ѣǩ IDATGGgGN\[‚''p)3Jd4c'jիѸi#&D(]Ґ5u5 K§7iii/N.N^u߁ӫOORl1._#IOiiڶoC>=T߱KG^|捛Ylzz;SŲ9{~ۿn,))L07qbcka9p{Qd7A!  9dAAAFLAA!1AAAlYAAdAAAFLAA!1AAAlYAAdAAAFLAA!1AAAlڑ&xo&e].RubOc{.K.eܙt:EdRjŸp!>j'89t5--AA1-|/tgscLԽ~ !hԤD=<, 6w@ &Aٵ}bܪY=oVڱu6v6 ?^ӣSWqhб;b* {yJB[ʖ+Kՙ6s jjjg/aFvmĩXH$D=_O@K[VU115)>?k Vb2q*&%%uuuLY˓cmcEN=x!?6nYO=q'bLOݘuj띪ZYRbNC[du_ .(XkTi~Qϣ(}َz֣+@-Ex8zbۖ߶lJRbv{-m]iE{^U!Z5kC-8ٸп16l&##CJHH&Y j^ j0OW\{hڠ9N;VcP!z`AZ5kCu8Z;[۟?P?!!ƌgf~{>˗yTwc5/]AJJ v߻_.66F)b`P!J}ExAzMqu57U]S.عQӽV9ƌY'g]}49zǯvN6.ڻӣK/{Pk |H=g7ǣ5=kЦ]kldڋ=^xzyRɢD񽧗'Jb`h-/ #3xܝ<ɷK1wܥsxyxhLM7OƎE ~Yz;yСu|'%&1} kޝ^zs_33vع)m׳?nr=?S'NӦE[\hR7nQ  w>Sqq9b7f޹;KirŶ+~򲝓'NѬa \iڠ9'OReJ^ާ4wP̩lި=94w<4'\cׅ| >تҶb hjj~FWWWiOo8/KIOOڕk4j?B5wuݯY|5C?J/=ojj\i{SG!&:?@[G?gP>R2hԤ!F Lp9Voss3ysbc=}6S'M㧕Ks/Yt>8{,/Ɔu߁?d1:q ###&L@\Y6th---̘)`﮽J4LJt&(Gn\[ݦcke J*hаJ d¸prq4ygOG4hX/X¨whXAP{΋6J"99}cBRR2=Ȑ&5%3@BRzEPf8 +p=]!&2Xf=ǍƚѿwOL29vw\1#033eúܓ#afnQ>;555$m68:9 )߅0}R(S'M܌8L> +k+^b`aLU0 hݒ1ߍeL,^1^,6lfԙۋ>^~;{;1`Pٴq3#㘚x.]x2y$ټqKu! F!SK/f·-ܵo6Hģ,*[p>(C#CB_PB7iDocZ5kK@=E[[eK3p@LMKoP.9xeܽsW1`ck8.kEv=6o>s~Z\.קAg >-[/o/"Fx(&'55_VaĨo%s{57jqÁC)]iRX]ǛuLwEƏiccf-*/AV.[=F @չx{wUsSl<*cf~~^7wW,Qglݴ5.0Kڽ ckֶk{w:?BkO&&&J1G{H/T*a4l܀{0zXjծE W=?GDҮC;~[33,*[(>̘2c0yDZU:2jjo}hjjgVM7/첨2Ƞ_1glLJo~~].㴴4K8UGUiir w'ꟹ:JHP?cwOa1ԩCRRrk}P\>8l` FFEIOe B..OW?qJ_4UƏd??5u5455e_V̬w SU͵"*Χ0 k]P ߑB<Rĵo~~@_[6c7cٹ}^hkkQ~Gg4oLq75͹xjjjXXؗ5v(i>.'[;[n޸I*\13޽řAr(쵮X)gt.z~;uA(NyNx<*eaz-u}`fnF|\۷f~*N$ѿ?ZZZ^3SfL2eulۙ4.ّ2טUȵZ(~Z 7wWp"ڴo58ޱn=e;< {G{޼~\X}*W_a`h@B|Ù3gVq95ί8Lj?;zpAnx AyhHuaa}nf(JQ3hFJ<0r8e˖e<1n8ًCO{g/xh̚1kAXX.KBq]ر{cjS`@Ɍlik;R' yt"##XKShܤ`~ycF{抆 ^:e˖v(Ǔ{g|3DDS^]\r׿/<6g%ӧ=,IYB]Q:sa,{5Ng|"܋3ħ~b+0y* Inn.4j\̹/hbV,[IZZQQQ$7J&>E]Ll K^[g3jhFSB28}дYV_ɴ3vӶ]b={,_SgDlL UE ]|k^+!B\gss{<,7eggƺ$O$4,_vbIB!uS-, G eȰX!//[b!B!DqX=B!p#Y!B7>ky8tOtF@@%~7'!Bԙ4囯v3B]bqif@67nH (M ظacdRAhGhԊ{j; [J_>BױqWdG Ov'M"ǺT~ńq*!%; c$&&2n8e~!ӨQ#>999 :h>|8gϞ-~ ;(3}y/bQJ0t e/oHϦw6oNm+hjՎ',,D'Lٯ!!Ԫ]r]Srf8k,] ~ֱp ˇ?~: ԟUWp8.mB!ĵJ,^u֭[NJ+SYfQreVX7̪Ua߿u1}tK2e WÅ7Ts #(Qί J,8Ar9{WXeTZ4WXx]'ӺY"yy3D&9y$ΝK[x|+#o>=I-HӐ:72aDڵlOrBcn}793z591W@w <H4ߔqc5i؄;)tr͓[$) Uh:C#?'ݏƴlҚO^.oaFv|{3r,7uҪuv]kvv6{Z1 -IӐm:msfΥ}$iHfmg'~!ݻFrBcڶhϢbHЦ/>ʝErBcnkW^֯F{xrSv֍0`~{?*q <ǎf[yI/D'<|v'hnz4ޝg]w0Ә2y*/~!ҹKg< Ma2ᇨ^~3D ΄_|<9I ]'&6$dS^|аPf8=[i{K72w(((5+2eT?0͛[ydX-w@_u,1c?xX}Sa'=&~|+ΜGݺu3cG F5<8x]w%;+r=o nƏ}}ۿ΃bȰy'<rc&7z}|s'NLcy<8mۜJWM IDATسg/g'Յ; o2sKpoΟvef}n`=_N:ڷIƅ*h۾-1K"-XLNytXhw[ ȩRW5uրd9p 5jTZC[_v.^JڵrͼL<[0o!)//Buyu*z !^rgȿ}Q+̋tk3DEEʽ bْeߗ%)ЫV%22]}Gʂe7ӠaA$ %)лO/hVs([,aaa*GVVޗUz?N:U}iA;Zv'oz=Ymog~NNN^?ٽ[ԩ[OnPm'֛yЗ͛ͤ4g"wEvV6 :GffժW+V->gIƴnӚ%)ԳOL5 Mӈ ##c>`_T֯Y}zJ%A3^!ZuQ%E\] jIMMrrǏSJ{i~FQG?y&8%˘Գڹy)fodd=}աvvG?B@@ ӧNاؾH+23*~ Bw/uS`@ϟ/|\P XVy[򠠠 uyyyv.EHH]+nEP?SZ`?~)o~6o([|pp0o XFKHH}Ο?υ sW%oHMV|93|D:t[Λ9;+b.B!ĵNzX}|v>}r-[\h}hFv o, }=Q,vCTT$}ޣCCCQ{ȇQF$5UN8e G-dz%%b,{xrK%jxPml*_}~}INnϿ,s]6;ojݒ)7Q֬Z33y?8x]`P?FWZUǫX"Kd aΟ^Gm~P1{!]JŊ%^!4yX\(#<믿}ǫ3f Ջ2eʠbĉۗj 8ٚYy]^Q? jdddp״Zaadg研"!1R^^D>IWX8/y W)3пVbӀuэɓgylG^֤icڵo˳O?$&%ritݰxGI^9bwu!>}ncG1DGI&|Vcᒗ =nMkybSԠ>999u.ڷqF<=q?9|1~$ 0BBB\ˬ:{tqIzuypCFrW ev[75-Z`q8\,3 ?:~,a?s K?ͽYu㮞>BrB˸%s&Mxw?~<ׯ^zlڴ ,[ѣG3tPz͜9sܷ}ʾgs2rhΝ;gK Jy꺀.b,/L{cp ;;*U0{LY{@rҵ /LB6Թ-Z6Gۘ2y*n8W{éS]E NbDj,f9̜>eӔ/_wf͚zJ=??rt CjjOf| ^=nΜ,fŲErdk^yhy< L~$7g_k8 KK+  o,Z]{y,^# zjg@zbSQ7?۴g.kVg{Ʒ  &M5e|LT(Zj~B!ڲwc('NCԫDV=a,Ne|mXRGҤi#z嶆y^ (rk߲ooߗXPƏ}Çեݔ9vm=۳!Fgss{^܍BJB3:v{tٍS>sSt-:ǍB^϶|Ͼ@rk*|!v[}k|-X gsrzj]&0\044̿ 0@p(Ьjίo\g+aSilf~fe4l7v_+utk~kA_ O{Ngy|BthjR B!(a9s /nfG<B9\!(9#ۨ3UzZ ® v&;x}nwcd+<3H^#PDEDО:Lk0t{Du60àfwƭCY#f`wvfxk7!A^g޶ :GjSs(gQ_O]*]> 4M̝m,Þ}f_K@B!D2G2 p%4PQfZtOtOB=FkXYpT:T(kvY]F7:5VkۛbGA}kKCG  sGoI/\Q|=6QcG4g8nw[i/\NBJ3 d z̰5ez4e++Td!B0e8t9i=imE7W26ôV܃VPktVSV0r uvR]SV[KmcN5=v47>N4>?~a$&%|r5ӧ`DGGӹKgƌ{t ka{<“U_ӼZ+9W`ƞmʤ),YBTtloօ#asSY*BCCqΑv |.>12;%*Wnyg|+/fiBqE:%~d̸єn\nBm&<=2eʰݼ4m+Wh;v[1'@nn.n1TP~DDsO]6i(`ph8撞δ秣'd(m@vԊ-Ģ} t1e:t~F #2*e(CF Qf6nr]qY|i83T_TI "YQh_fd!B(_#Ⱦ෽XhY+Hn̷۶?pOTGZDg_pwnzymRbbcSgM!((G<:Qtg3*f`5]+X/S4%?P+#2zeִ={WVPb]}EߘD&d!B( ypK~vlewovNbR6{9.EttN8R:]byם :e(Yg\!T1?k2ϙS4oFJڦ ֈ {&͗ۘ9uOL@TTUjqᯍa'Y!%ˬprjbT`ϯ{iڼu>sx0(`k7{`.Ze ר/z-  !'y}y(F!'.X\*ImYZ2Н-k'.GMYQ\٫j棓̾KB!JUba?0g,0ԥ=ԤVxVS|޽\Ƚ#SAujS1ױfpμPP:o8ykՍRfUº n8.1}<<~$p\`NOWBY&,YY4㪷?d!B^w1$ŬZկtiBBOX)IS%+x˧DN\mq,kZ4naa!,Yy3^f]jjؖrsH/%Bb=!-Zζ/nu>\Y,U+1s 6}MomT)hиc&&vM{^lbF+Ėgcd֭=z]{(KmٻT=jCB>~݌?='Mm\g;t '뮈v"\ !da༰ C:ne-Y!%0 t]U4fIH%?O\,K,$ !DYwғv*j7b7@.]% !DYrI(|pޔE) !B\ʔ#3 Wh]9ٔ+Scb:EDDUl_Svvcbq'Y!%+Zm~{*R0 n*l6ǏYVS^~T$<\Rdz87O-Y!%RLe6hrnΟV14mВJ1 \zthۑ]į~k[m;Rj ~osnB!׊7tH=IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config5.png0000664000175000017500000023101613203343735022263 0ustar jomajomaPNG  IHDRzAsBIT|dtEXtSoftwaregnome-screenshot> IDATxw`E{-^H% BK4E EذboޤJSDlJE  ү~\]]Bcz̾y37Y׮ e?Z4o,AFFFFFFFFF;v#Yqxܹ{DFFFFFFFFFƓZ4o,o9dddddddddd;))]m #########_"I  Ff(( J FSUbIDIΈYCRH7CB"ELfPi٫-%3ɩdH}RDzyh0I4*Bx?IH4fx֨ ]Тycﮄ4tz23oo-^^^TiE2udTz磦خ$deR*0/ e+o*c2'Yf$[c&ҡJnĬR"Hf3>mz㳷sVE#2222222'zBTNY?/$ $ ( %q^Z/OKK NOd$IBT;: %Axyi\HzU; +Y2 ?&uWJ Ңw.Y:*o b={>nmbi5-o|a^MLX uܺN3+ ^Q+ITL_jfg y ڇnӻy a>(H;72P[RW΂rAr jEm-s'xq&3 owl$W F#KRRxneVמtr&~j%e0gQ/e^d\x!u:$z܀gV2Ԭ˳hFt(1$3:!ږbFG}W: QPLz+gؽ3h5 "0ZP>(3{wrEG&h9`,3o09$9td ľ0Z!&co1E4Ĵ_rA^/4|֢.Q:ɥL5>WIMɡt4kГׄxw O"^MGmC|R;#S w \nkDL&# :3_:e;Y|~ԫHi%)#alJB*\E3 ZEZIMIEXmz5k\FVc6t D3RPE*h;qHV\B$#:zR 2v3Ճ]Q߼BzQsꭙLgX5c.M^1iYűÊMWNH* As@#;[x9k*HoIPiVL1QBP&e"*B鵓oʵ(89[la-QT(P'9^uA/4*dYFFFFFF~!T H%&F ?ފ7l ]LadG)"%[fz#͸k9BPz+A@r`J/b$Y>9(RIЩSbLc&*R+^Z%+ܡ>ePIG+PxiP ":5UaєN _ H\RKNZo-j$zm1W"ѐS Td9 !*]>/D۫H@Pe<<=-L:RӳHO"-5 8.ڔZ#:tV nE4l8c~頬4P25TqGiAB:_,Ʃ$Jx ''~ljs9=; >tgrbKN#??L lD49}'j<^ZNMN$gHȹtedu!su4j5VA̬L4 (QTizK=v(-jyx)F%~*cqpek3$S ՈXZd)]<7$ )qx%71͟Ksf`[z<꿉H5k8FuIDR@{1Z 9唇ѶcƲ7=Qwc7WBrc-M{B!J"fI!ټŖyB{k˟9)& 7h6q0n!ˠzT-YgOճU +Z?xв.K)n=2z*:ɺemM{,=Va&"hFn'`1%I0 R%R(:fFdE8dex=UF2$~l*'gAoèEAX!a%Ճl2# PXc!IcvO(:{l; Sr'J@!Ydlyrxl̃AFOaX`3ZI@RX] XTV+YlA6cF@D-A d;{,qRy),feCSr ,]/'4,4tfylÓœed=2+zzAҝh1m-Z6vZ^ჇgvFyeڇ`$,m_)E$!AE9A0[;*E[Ev ^hl j~?{~'}F0Ln~7lɩg=W;<这.hbRRS L':x8k& l3=$2<+ѼY ޝF)AoN4\=)V:ώ;󽶧e,[%v->x/atԃоeGn%%>KƟ~!)v=EwzpBug۹c7׬:'9S8w>DjJ k׮e^=_ Cn7k۶nf-V= ߣǘ4HϠuv0)0ma _#ڭ j͜sr* -vi=l[|l}IZZ @bU3OѼeqKu~ﲬncq,_U N;LbȡkP '$It҃+ͶnҎf؈Y|?Ong9E7rĝ3[uSz;۹}#^źMkP[Ory/5?;)W!A( +qsֿ[st'J~<~ev\Ջu՞l01կk/K/%eҩk'ꆯ}cdȞbmn_ڻVБ/Xts̢Lw¾I=ƕ2u^Isq]Uk6o*˔s}\\ Un5es]x? DDEg-wnWvp%תeӯy kҐ̌LN<? B9I*x۷3} ^ of΃38p ׮3}4xիWۿ дY|r>-saK~OIFFG!#3*U+p2ֳ{0f&}X\I$Ij.1~5j -5vɤϸt2Ə(ɶɾ=G>U2c4)_NEEF:RDƌPTNͦ 2rhޛ<.w+Vf} zj5zAХ[>}sw$^^^DDoqþ=)Y$ ʾpݯm=p+ߟ-Oa|(+_LRaj2:ols۷gnA.:>u+P=rW!X&dB{Nߟz8\b a{w7Ubd[F^ܹ¤w>~z|=K KdFVصzg{̯ 7II1 TͰQCi(E$.ZIBDT$FlcE\zL773䷍3㻙$%LJ.:3lG^Ȃ 6e |,;?LFF1È|W\8w;)lvtfQ\Tt#MD7^;|u[Xqg-_$1&fK/w_Ne˟[]c'/6p"_APpF. w,[zg fF Odg' -[}z|ylXI +ǻ3oMh4l<ѧ j .^F#r$cC5CGiTrӤYcP8p/ȨpX눭 0NDQ{jթiljےgz=k\>r%cLl &sgQjSq1 y&KxIMڹ30Mo$ IШiC^{{\vͧ\o~pN 7啫P5W8h+K IDATW͘DM~7g/?P|Yn&=4m+1klnJ"*:oZjc`ӹ2etukԤ!>!<2ܪ^g[}{3Y9}`z_znOry)wRعml@^{oоYG^<bmm Xd%F%"2bqܰa=/oXƿ=po'S^:.T(}<ʹsU(s?;  dk#Ez9IIZf|;#'`\ kVO>4h܀ԔT-E֍hdoؖ "+Gpw#^1zH:EHhڶ_7pbƿ5UIH]KW8|G#$4$ߴ^%prU]ػ{ x>Uy÷̞:11{La.h4{nz7-۴ mfO;e2*V`OtmW-hӧOS% ^̛O &$8-3|5m#B,\9|F ͷSB9=n?-DW`0x;:qcxi/7fl) u3'RC|w\p1,7l`CPp fyK0MnFTZY[k͢h?.B`O~<ϖ[N붍 Gm s<ڹ=g cqtQ fа %9)o}?'vpվD%r5so8jkp;55t:&k{Hf Q(ٵOvC(J5Ld+j]ƲuK(W\y8;vCI҅mm}!Xl s?{,^Cyts#33W w?kkݮ@@`\F1! $m}Xиa}( "S.m 22R1 KBPX_%cP Cͯg;fƗM2r 7sET*y^8w%ҠqZnΝ;̛9VZb4YpC[}}'CG'MQQJQ:{wC@ݵg-djZ4d0 Y;̑.FU.P\[cw@(G8 Ṿuh g gy<ѧ'CG:iY-nl?굪S^m{^b9i޲/:kpp!~Wi݂Ąh4hݜ n|yjԮc{19nz~s\Έ!^zG; !))Y۽+blc+mmm8fL&RSR9m?bu5DWF$||i1kԴ!^^^, к}+lArjv:s=m=yS l\zx 7_`[Y79ӤgЦq{{LTHDQ}vzK.ݝ2䫿븧g+fqQf,f+tunK 6?~X8{}919q"" M@?ǎUyCȫm*['n&ܤl2=}&.p#B^PP rxx8h0RMc]unŲ:RqȽ"Pp;׮W6΍7a;1,+h4_f7f\l^c?Pz'C^(.ǁ'Od0c^gyl{'IXB t5˱v%1smgrﹾ<;r2%衣?&0(j5biӡ +ŗ`rQ23j;så\oP7,)pGwNt{yضe_]Ƕ|TRC.RRRfuΝ9W^r?wv=6qU:;^Z/]<;TNuv2(4l&Il , 'DHtn'sצ˜(U ׬FlC9.?_?9۔ZzIIi:?lvj1Hv>'+`28y=u2`W ]\B!T*Q({1Ci!ˀ$IsXƵ6bmm͐WR,oEqdOW%)0;M^3[ s;0,ԡFc۔9T^hP#|Y7rg)F㥡}&O:5c6˗-yQ~|ƦCp#c)[U9?BDT @݆uX΍}s4jTؑ|wDDG奶\cZ5[cOaۖ팙0x9>.eʹ>Ɓ{9VXNg˗m➱p*ZCBP(<^Fӹ?6IbB6jbJiߒ)_L9xʑ#ƿ:>>?Xko~PE y|wcihX p^y'9<ڊi_OgԪS/ӸY2hƠ7?s  0}mJ 3_MW8~?߫;SZI/A3q#,!)~ma[A)Pf,Uc;y)}h[MZXaLbiӂf֔|$9'zZ4OHXCsLP ReKѻ[sy  o< fM{:__RRRUExqjfQ=URsV|:kS\<뛗íӶC\+UƢ}Ӹy\独YDtNSB\q|JЦCk˗M\9<Q,_-'#J"!( Ο@G[{rnʉFVZlX3fL޾[nR"miTb? !5z=jm!jv,X^m#bb{_N))ٱx.v{ vڅ?t___}k?ӛkֲ}ZhnB{]p/^INm 3]X0*T]{9v^n;|*6m@K2JY9ʑ\to?BlDDLJFPP1.S'NѸYCZ^i}s$x˱6/ls [uVj'˾[7 g?Ĩ #%@hti؛KWx흱i`Q^W vpgͯ2<l;.J"t|?TJ)e gLOKؑк@<[d玲mӏʮ=m=(TV{: Q1^ݱ=Zpm4wp=nX̟// d6q59GT*Y<{FkjKS-7on:hZ@& hު_~5ivztYYWp 2L1͚j1 LR%iҴ jUc&MS"+y n6}Rv_ƽ=q_g`!<=)*T^̩DFGЪ]KZnKנRhݾv2sO r݆v|4=d@;ħ|δy߹2vJً^˗0B:>~Cj f׶]loʖ+Í ֲ-uša"#x]ڻX#}).B VF bWeԬ]tމd2Ѭ%]뭥l2JKWϯ\αCQ^FZ )DUd˷<= }xvQ"4;jjL&=:_8>x {aF=?mt'dӃ)>>tљ3̞2S搕j)a%•r6BAi5 !%AϗJ\?8^Z/ ˟[̝UVJpp:TլY_?_z{:k]7GYZ~R& JРq}Cz*K-vR2>>ԬScԷ;mR%23Mee,[;EhHS{`Әt:=AԮW ??K<ۡhrXxfаtљg>$IhZ)3?ATҸy#bߪRDEޝscۖ5jJ.EUs^m}L_go=e.ӿANG`` uϷ:8s <;gΞo9JCG86|(Æuyݼdv~U0cT-\ūHINKEDd}@˶|Jwn~ߏGZ7߷Ңub3v*1obĠlr@// GekPUm^~1xȫ0 |wKxT8~JvXu1<ڹq^y-ߤrsԢ02ZiNsNN6n@pHfj5bޝӿ`0O1}4vpվCa_f%ٱ:^klΫW,Gf ٳc/h?P(hԴ!;ڼ)W@[ *QL GLA 8$Ma9R"FQ9& ykDyOO ﲟk{8ô1| F#+Y˦.ǍRa|Y_olmP'~$Ot6Cbg qOJ1LÈA g̛# o/Bgb2ҒLz3f 0:oT={\ʼn~m/ F13œed=2z*:Iϝd$$n:})w0p5RuHNHzuʕD,CEۉ[Oճu/ȹ'bϓDz'=Qwc Kp@0BVTn]'95+W"805SdY6&[ ɉ x|P ##97y4yqTZb˗.W8w5nȮyt: =hݶ U1̼8` mBZ5R2%r rty ϋ>3_Ljj>7\8۴lݒ];w3vxN:=(U$ڴ$"""WZ͚Ѷ\pq_+ :'~嫈"0(゙¢صs7'Q^7Oetэ' -oy罷iK>OXd9ف x~s 1M71wC9{?se'AZlA-0\I~H܉DD6^m.^bْ|ONe}ebm$vҘ1u&/8?NǏ~{EwJP -z"{E&((tH HU:6z)$l&n do923瞹srl޾gϞQF}6Dty'NH 䍟 ^^^V-@ x>uhK-8 |=uf&+W5뉌^+fU\Jqc={=™5c6":- Lǐaټi g/O>^< DGG(ԝ3s.m ))Y"}qLtґs=4 eʖF&?~ .̃)@ g00*5Ix{{ӼesݽY{.^ކ`__hzKSDq._ ՈP|D<<=X,Ho')蓔3 ؟GOpI>|D!=jժ*]kW(.^E?RA=~0KWr:]2d1glZnaVLƵh4<#*2"zK)qqqSx@  SN3h`ё /P9h7NqRv/_>ԭ# bqsOlL,vm߂_k׮JF ߰\;;;d2II8~R2] qy&|SOх/a׮t2q dЎ+?wXu$BkɴrIbbexޞeV:uhUC8ӺmkvnIINN!--NK<X,{e(V m@ c𒞫 UU\xbŋIԬ"CÿQȯ-wwYJjשť8s NN̪u+ƥ x" #L&o[З5+rc)[Z]Jop/Oĥ{@jUX{*_%QX1N?Ʌ qr *0t2{@pHe\\]ȗ/&͍${Ҕt܁۷a0=QFܽs?}@ /tE[dztؼq }9SOֽ&@ HU#gC{{{d 0G"8"c$I /7/,JadvHbB#,(J%Oq:KSëЫVI1Osy\QȻJU$" d@FRR`JV|r\u"@ob @FA"YsP`1=kC=*%#&q zVh=HNjB$bcb)Xٸ /Rby[Nx(UNUg*KΑ<g7Jsgy%틅7.3|hj׭*T}.^{\s^|zk䚮jpP GyO^7ߤzpATX:eV:dw`@>,ǸMm(T.Oy}nʤ,^$Oe:pcG~Oy%x9ΝK./~gj dE.m:8*=Wܾ.:'J?c']!O~-_ϘJ퉸|'OgYTX-M|Yǹ3$''s6.6Q\z'q2;jՃhѴgN'>>hNc7ϙSg(P~~~j5燻{q9uMZRL%7i@yTcP(K&-  qtiߕ=KJ֬ZK0Tlu[L`@k5̱*5 V:T.¦ Q(lٸ ʗv3uJjޗ(ɺq vo~g v:ˆéZw--5mNZfؠiv S:3t\\&>>ϩ?Ob2d2z:aFy… $$$РA˳}M:_ԟyQC]-BA`@qq>ԪZY3f[UGW<<=(UCG ƑʧcR>f=<&}T$0 ,gݺu+m۶E.h?~<.\͛7IĔ)S(R̝;%KPVZ/3vنL&hѢWܺ\nOeطgu֦Q)_n=\T<1["QDqZnmvK ɐˑV_bE)X ^^^&s-?o@_j֮I" ( x)Cǧ}06^h_J%"6&o=>>(_!GE53:|d^.ZSRR2VOfLmV2?Ւ'%:u u֭tMl2֮]Kxx840b׬Yòeؿ?[n/ٳhт>;CƏR4/(JV^Mٿ?{cxwS111 4!""wT/۶>uu_RtWҡrdO݈|ND/Q5':*UjQJ->xh'5"8(-Dg c $$$w3rO\U֯W#ϳnmLNgu¿K|QQ$>M$|RRRȟ?m{E:q򡤧++W_IJ/+׮ ۣ?e0iDLGtk&[>,gQvxʭs}`,\=TX?~\.g۴JRTIڴkͶ-?꯯G[n'7Yes5ۢsXX;hLʦ7RB.;yM ^˩ -[u-k/>>;weZ%鳦·`5f$sfͣ_ j5ڴ5_ᄑ٧^޺e 񤧧xr+ms=y#nJVptt 22͟<`̘1]vhtzlْݻwӤI~WVXaV5ҢE 6mDpp0eʔP! *uV}ٳ'{@:6@JJ V&x$UȝuWӣsoDh+_oXØ{T-r???gVR믦x"-\؏C1HdE߻>7o1jU:Qqp \Εrjԯq |)j}_7IIIrR2-Z5Ё޹h_N|gZ$I*#5_|ܾu*Ŋ<|sg?wkvYtǏ ::kWZ%GGG̜>wn8Px Əɓ'\z]7ٺx< lݹ9W9{wN[ua5E 6'uC29܎[lCŋ7Mo%==t2225KBnعs';vf͚:Xɮ.† ٵkObŘ0aF$ʖ-ŋX.]DٲeMuBRPeo~VoZnnnL=i 7obͼM΂uΉؘXnߺ͎wүWӘa6ɰɄq|7 ػg/'G;{Cn qqD\Ki7|l9vy͓ѹk}o[7o1_Md5T\AS:q/.hڒuf~ h؏Oƌϔ9^tiߍMZâE1kjUMfV*6"dsÂҸ^SU"E1j8 JjYb2c[#mޖ'=wl-iͧcƓ\헓:wWh,M4cwKg돿yq ۛNRbܿwW!/ɖ*s]\R]8_|\zMJnѶ}fL۷nsvM̦wpÝ{ypg5^ IDATF޹sk׮ѼyGrٳٷoQQQw7|oFdd$'OM)\01{(dɒ:t;wpi]؎;>.hnР,_ݵϜ9Æ y&,]e"ӧ?#7?3'O{y=ޞzR$i,]9| +OQ*D>pAoҽl GGG<93x>%%&mޖS}7j]ݻgg֨OXr׏ ؤ3XFZLoX 1]dd_~5gTTc>]7O.an={Y![cHwx{L OczB{e?.S,[eyv:?ʵ+l{p> / [ !4#L2Gy3VY3f̗S''/˅pc{ǟrЯ(J|| 0qD5~_ϿbO+)SN j?tkT&1{ḑl=6gϘBէ'Sysr*Κ5'Omo̟?ȑ#=z4ӧ3|(Y$'O 2a"##quu5+ɓ'tԉSNQD /^Jym۶姟~cƍ;v }=5j`޼y/~ҤI}͛#J"5įEFO~d[/R&Ɇ6{溽JR{tN.y7U,=-Z^g תUaÆѣ kȫDС_|Zz) J@ bJ!8wygϞ}iȯW!!!k?m@ ],UU6s~yxY@1ovpvr!U/P y$jӐ@ Y Qqqr%!%)Ijy{wr+ڊu@,oɕ܍U䀓F-0L&Anܞo+d}HMBCBBVT~eO EA@ @ @0@ =,@  䌌 =ѿR|J%@ xx%{)_{4TKH_!~*T{a|9+UѣW@  dBA`@6n SѴaVhZZjZBHXI}Զ ˅P=8}rGĽ{Ӛ|9+d2ŋCRq ;Ɠqa5Y@ fK2Q$5BJTT?[/>{RZ]*D [A'O㝷ߥrjWKRӘ8 B+Tf,\g\ @a@o~ُ}3ssw˓ZP6l8} II4y1O>eﱳL?vE.Z1ZEqgY»7>>(S.ܘ&%%[WtT42eK#ȟ?? @ 7 f/^93pt2 {7 2ˌS(wy )b\.ı?vB4JM"IOy]z)lFYt+[2kWhHJJ&*2R'?VQ @`.v2M})3Rȯ.!84rIعA|ݯ+d@(_ggg߻ϒeҭ }F]-s[. SQ=HOOӃӧsqquܾNm;BZZ:v2eu橭@ ,6{GEhP gʵl`YdԮ[]:3ȟ?UBx ,^rAL?qP2ؘX&Z%g:vO?F]f&Wݜ:c2^^z7nݼm1)عo!111``zIX0q,@![cHwx.>n!@ xޣpvry5@ ^W,@ ! d@ @a @ zY @ }P)9u1 sLWлBhע$IRPAq_B ^8iiܾy *^ 4@ g')_M3'aj嵨>/tKZFP\\@ y!K,$=jZF^,B*T!0 xQ$)O,q%*W JZ]/ooVYboJŲiT ?,1ZU0kl]W_L~T U6GZ5kM`@RR,BA`@qqa>$|(͛_gMܼqDžnۊޢf4k 5R=8*1a$'gQVUe+Ӱ>t _ȱ>xMZR=8>ҼIKBi\cF#0 =T*iڰi\)yR`0 ks,O Zl ҝ-iGJJ dۮ-ܹ}UWP2VsAJtdvv0]vʟ6y:Od"* Z? 0,{%Rp@ {mX6aK~=Sr*GctᎎQl:u5n ׇn=qm]oooԭMJ0a⧜:q$Ib=; ҭ{W@ߘ B*T18 RKQ@U#j.^^^[nQzUJU-5[9ӄŊO[b"Exlݒzd2rw(C!B;o!cggǾ=S6M"tѕN赉'>>(Ql~g˅e܄-V*"Z@ 5<Af W ޺e &O۸``J}qrr"6&bŋP(tnUV7a-@R1mtC@VӪMK(J222pttÝg95Y+JLLlO%Ƭ_? 66GGG7osd2.ȡ_u/7JD`@tѕcfDEEP((\A'ܻ ػ{/NfGv x^e.zuIxpI]ר3va͔ISFWbܾuy}N/P͘`9`{xpQd[ЗT*z@ ๖X i&;׷CV#!0MPŭlg4j6899!˹r9\NV͙4n\Att4/EXJ%JRgB|yC|D>d֌٤Q^ ӴY7Cq}}}Ш5HZ2yqXb:yZ%/ơkh՜C{~źCզ FZ%~5<}@ 0=<};twoQj:at[sLWYb U+WgЀ.] __\]]hѴ%/o/\NdLEhѤUe eVTT[7oQz *˴ r9UBxhڒgϳlՏȘ=ڶˉi޸#K/ˆQ4`U*Vc͊+VFwZNJ,1tΜMZâ (`4ה}Z[axxukԧV{{{~\kWӢIKt[<@ tE[dzsdh}Ԥwu׫r<@ K%UGw5r;; sO,@ !@ @0@ =,@ ! d@ @<'DRRL_A&aoo)ۿ[ uK@?DB܎|. tENNZ7{,=_ ?RD@&!^.G&.Tv8;솣#$+4t2#LtYv>p$m_HH$I20, |xNz7}=Pf$$2P_scIB.s3ʠǑcĠ`J5h!{>tE:r9. l@ xӑ$ J"#g'W+CRL>|4m 4C7LV&CuIن_Ԙ4zI`Rth) 4/73WGW$ta  GK3dIϨ̫oJ4̩̾}5[@T)q;%[`l \2n c` 6ꗕr>,͔MZo(R:KzZLo̞gQLJ3.u/SЬAeg@6+XY[-VyZ Y0/B᚛ak2ZRfnc&<_.uLפƾo$?Yzе0֭5=rg Kט,,}&M"#?k kFeƧ6 24#odpx6I22%.Il C g둾lPWȃ-'( H쉲FBf'3 7gi$6Lk`HfYcyca ˑ$ F}1{ECPc!0X/K7MG1d<7+嬟ݘK>#q:͌hK뙕Lc^Q;jq7coXk聵QGf>W:Fc46⍱dZ`tg,o/7eCH1ƹf5I#MchШUs? ̎JLӚ/GOkfَA੉~3 L?F1I:h|E6s/ rEѠѨzO $Q%vY1 -!&NF&aI'/KǼ I}Ӎ*A2+ry &i^X5qV5ː (q:c@6kTZl[Tĺ|y=WO<5ǺC jF%KiK2ufDc!v22Iq&< $6>˒4RoX;$4R I;G?_j h4UJcs,?OHz2mDPЯ~7Xh,FZΜQabYk۲Whf X*dɂJfa,W#`ge}Y=[zO8ނw5׹x¢c:gmbY6ngleumgqKrL0 01 4іǼ?Ǜdhu4ux5sc4 3׺^#6'Y{j3-o[dey&O34-3W^0!J.Z[+ <&2oMɓ'mў [~qv~gc񬉂.'CіHް>}{ܽ5zc0}, d3Uj&>@Zb:')10AQ=W}/hNEǶS-:OĜ ߼>޵5X6,m ^Q -acܼEۮlu!t~clEk{-U.bcJAbq>a>"%%#Fɟ?EI'Z/c'}||}Q#?A"VpssMBBusy3X<OzJbDڶo ['e+y N}dߺ ^|Y8)Ϟ7|Aevڒό2[l/ q})_FMfȰxxzoʤwGGZFN΍Jҩk';؝ IDATeiZt7?'[^`)ܾu+2udJ(I{]>Qx%I"%{ *Kx>vlG|t co%hbfNYŔW~v_.YOk7e(dtY!RN79#r ˵\++!p<|x_O#*zY5|3nܸܲa$e9onc-&zl.VR 囗efRRRزiyz5|0}Nyk!>maooCpqqF֠V۶lD#i:)I|1 "._FVQ3wPkT#+\.@*%JwUJa 2Ԛ2t$.ͶM[__mކƨzkcccYf<”i_qe:JRRrJ )hC'ڭXҎ 2ѳOw~=y2eJ3q$]ehrcA6si7}ٶixx1}27oBr!QZ]>0Wl?ӪY&ַ)wRZ] SSSUvY'K­ph:b1l!PVn݆JFVfZQVC6߄J ߶g~5vOpJż9 (V9PU&RP)YʇJ_F`ڶh_ ׬VJA!R+A.Q۫?JJ{S̔cjpJ:af&YFJ֫P\E?)*FO_w1 ܺ}['7Z5Xv9H8.} jsVBئ37ХMvT.Byߎnt7Aq}Μ:C&-P͛4hR\|cnݼɨ1qL9#>.ɓҧoRIT F# t +BB*ħcsE͉݀+W3Pv I|Ȩ1#9~8#?=[)Y$W"6b({Y3R)d8=~3p)ӏ[[W}2=qes]6D.hZcr׈$MxsDD\!.kDDFű1l$;·atݝYgTO8捛7#0~4ӧOOҭ3|$BBqvv6  &\Y\3SvMm`kYn rY!u-WL"5۶lO||}ضe+=z0x HJJfuxzyA&hڬ  xD\L2Ygfe]v;,n Inui-.Qc390F{͐$jgʵv&|<<կ'–HNNf˜Xb ٺi-$55PZ(MUrvvbO+2ךKtu2W@Zs >hq0h C,dk7͍Sg0s,~X&hQΚXvIUUa|8h8=zw]DEFag[i,yxzX,ӧLgȈ!\RzsYh,899#} v`{SXQ|8JŅ˳0FÜsZ:u/|Nެb$?,fToVvF||<ժWeUTڵ\jի$>@>~84lF` x޻g/ jMJ&sGnޢWTXw\U{P!C-p#MMif-YB3r/pin-s( *( {p λ>r}_}|7Kx tQIv!2CGG|,Þ=ؾ}%\x(>J.;9ؓMmm2ؾЊ!cNzмus kVEDoȿ}d݆uqswDmXg+ "lzC׎嗅Kضs:`/*VŋұMg K>O+ԬN0E=ٙ|GWgs/*aU©V_^ɼ25zuMg2 J '}{vz4݈D j7@>߰m6B+R1w H+@V͘4㼬BH6CIw7Jtn:<[E/Pr,]^/T굫l۶=\m۶۶ِmۭwl2(mV]O~`q? [7(CjZѱ,Z3 \a8Af{{{KPp:uJOOYNVE81_ Jf}$''l_*>..\8wVGHhU; tk׃ÇЩ[/ܵ}7uADvQj$Y.w Ql7!ˆfidddO?>~ _P;}8v?͞KDGHHHdU]K9vؘCk슻;3O?$(8|MWLH>DQِgO]{tn6t lcuF%vͻ SH e%Ol8&`I󒛛7ocrYQ""0(Ą88:،Ef?)XT[pqrvLiM* р_~x*e[3o|]=pvvIbcTe^tOrLI775 c&ҽWWdYFEE2%1!IEٔNZj(po`洙JeñOvVS^l@RՄI?wgggt<28::r-2y$&Hkg YH&2Y<{Vz_ qSGZ ~AhքZkX| ^˯Lxpj+y^|/::uk0tD~GAunnn |ẹSNwW*o뢢߰>]w`̸OiT1)))@ƍԵM( c'y&oV7_[QW܌ 6))uE4vڼyլW)nJE׬NNNAeşY;z;"K2]µ7,`!=?,&6!55JN-,_; e6vmߥ|c'(Ub]YfѤY*U5|ZUU6ԟ ]{)4c\M pqu%fm,ϟǷor8_tż}JM^P,wQٲi+!j0E$dcyf+8nYT3wN/kOt%Klgxe -\Brr2}aqS3edˬgʛJ~oaIWc umu+%Kвu K-%%%͛Mѵ#>W}^^8::%IӧĄnݼE*J(on8K.wY~ 0(Ih᧙_ןg5ԫ_4]Np4 >&MW,$Q*ZpCO&(q0[E$'жc|l8vʚe9yW"g=KhP4oj'%&(RhKW2uה(Y(9 rt$IDѼ(Wv`Wm|ӽ΋[D1٪mKZjؖ7/6fAE0 ["?Qξrnn.Huqtt`ŲlnK(~l4=bԻ1@$Y]|T^'gg͞OHqDV[kɂyX.VC&ށ\/Qr ϝoG2𕁤+AY\~D<[egg@fF_-Yș3g8y:|}}9{,φ퍇ik$K9޳sjV'jEJQҽ䣽i/{v3D_+*-ߏK/ݱn??_._\]ÿl^%6-- 'ggZ-/}c&ñYQd|9!ܵkdgg_??yf?bwz#ow2_I`CFvhCJJ χ@bbٷ{?7Rڻ4e2)ۓB#J".?\.u%J`zuk8r(ªھ;mڷ"j:jj yOA [hӡ5=ŋF^z#[ppt@oEOLJ)}2/5Xh92CHo~Q)fu՜?OO4oqrrⓏ>K.tZU(g3I_!qXy^֣thZ|-?ٌߴA¶5p(D/1!ܼywww}r?Ŵaxi`zI~>|L8)<R/{)Ȗd$cwٍ㾤RT\)_n=1˯Y+ gg~Iwm'ۼл{w{naoбs"dͪ(jdoh<OOO:tj3#}"jFbbR888͔~b#PWWW:Bvv6z[Ξ`}Go0_O8SgqХ=,X.Qy2|0=*G%9B7m{QB*>Kׁrq=W'g'~5gBo'oowz ^i&HL VAxI6XXltvHDӖMر5(GI׬NA^Czz:Aprq7d\@ٮS[b׭7E=Wf^ed&o&MzU+],֟+w2ׯ]ǯl9y_ْ+fѯNT"X/칳M{s9<(L8::ry =ѽg7:--۬Zン>˰8XӰ$_l_U\3U9I۰6 VW5kAk ԇ~)prvYf8v_RFUvdd SaP7n]_`z~r/YBѬ (WR荶mј+c'a1uAIiJ6M<|?9[3Kd@׸e}QayٵQn8?/X ϰg Y0! *]_+bi1nXpO"/û szQڍj ǃac6iܘ $&$Ѭ _rߞ}LkΝ=35jΟ;ϧp1J(C`k/szmzHffW 222x|)SXX YYY{-x8#6;\ddffp=RɝRk7a RXt '&U LO,Z(33Wppr,֏غq;ZGйG<; |jAxҲ(RA..*d>6S*wCMi޺)P8V܉mc.]ILȮɚTX=Nu)XCn֮)vIvM_X\,2OR S@'ݨhԴ!6i&89;PT"$K+8982|P]{l0F,=9VөyZtӬm3>@&ɏgŒFљl}6m^_^-_YEgGǻ\10ңcUA~ 0R\qrtdȡ89-t,FzRTTTTTFٕW9gLp҃ͱ <%{.N%qw@eMS IDATePzA&ob5Ԙ厷B6XLWiXl;' e?MmYsdA_,]5dIFZ'~jNlMn w+9%$4hxUYEEEEE)AputE!ˣ~ZY6+XjZUfN6 ҰU+ 2%#d_[ķpqpA$rT>%{N9R E-ZcYKEW֘X˲ar,me,d-cUA~JTDCNkzdRQQQyȲ(Iht'ɹ~uysJ #ˠ1*ÖA+kmZ16SP "o>@GB;[T%Qﯬ4)lX2Ʉ2$[̙oяcUA~ $u.sWxĿL~^eY#TTTTTI1mJ4DX+²ҢA$IV-<ˊИ٠SwY }Rs=.,csYUܲf1)Ŧ8IN+>sޔ&ɒƠ`+2bl$@.}XU9z[78s_Uϓ]rO)IwIEEEX I( [v0Fkd4A}-zը4 6 ?--]6LqXY$S1]HhdXٕe"N,\j7鼹vwxQ2cR%9W|/ R sQ F<+QB'ݝ8wﲪ$ Q<_2ј"+NJҡрuY9ҚgUbyFiX%Eɶ%5 J%ؠTH?īǬ*I 勏;ox`]M`#[4)12>({tsV̑Iw[P&7Udb(ܸq㱴%",  " hgr(!3d,/FXV2-]lKDS4A0] #&j}=L4徫Ξ9GT 5ӭcwVG=6w'/Nd社$-fDCX6MPRytDQB0Z >›EE$I3Y5uXDZm~*T}NiIDDDYB AeQ2ʒ-%S~cyh" ʹTbcSr(1빕j8^IWA`ܘZ 7ܲds8?(q vܟ+ Yͱ(Ɋ( ɈDLK%&&CYʹTcއ1Ǫszx6v;E***ŃL2h/6һoo>Iw,KaW._>ӱټs#LŒm61fMXf[4E6Ÿ2fܧc%iSt5 Q4iژoC(- z e@Q4XEٔgx{{+Rwصc7?蕼7_~bޭ0W)/VOi^v-K&kXztŋ ӜIJ~K , /96α7+3ZEfѢI+֠y9U9r(̧cNy.[6[wrAw cwQSE***ww||}ӷ7+Wp1kLJ5ѹg=@^O1䍡͔Ԯ^F>f/f],Zv r-Z4i_~nX=«7nWIæ{#V:~XX(:{1\}J+YAџwSң ޾e@E֬GVHDÌeko[֏!+?~h=zQ0[%l$Vz*1?wwrycHMK3b߅נ.a5k\.UZI*#>`׎]nچ:RR [ @^ސj5xW?EMt+Aҥyt܁'NsNڶh;tWb\x{ӮeT]V YeKqq|>q 7̷ yOz /PBG:(徫O=s^ð3P uJ,ɤ2i*?+aDbٔtscS'OEp;#-ӪMKrsx!,YxoɰwQV5a))7޸-ްٺ{ cM KrEuJU*իI97o2OILHsX=9{͛ >Ùr-)+WOK*?#?>xbFGVG<ψw'44{j>wO4l+ cKڵ6>`4F""+Qt)~_; x[lUkٹ};w٧:hZw߀tޅ+ǂdIh4%_r!U֎'VUGG2OaoQJ!+3FunڛRf JRByӯΞc}kcx՗ NH i遗Aח :ty64 ZV,ˬFPƧ }QKdޅ"WRwGѤ~S8pXΞ=GHh~dXddOQI::;Izm롓-¹ $"c,/;VIEV-ӉYCDf03R 3PbggǺh7O]b̸OٺebE 88?ёݻ(i|ѸAii=~iuZ:Յ . W,IdԲ,ۜ ?Yxs\l=v̳^vԞ7)۷ 0U*ɛ5ڽ+vd(A|c>֭~zJ~:ћֲ:z%ʗcͪ(/Ys9grLɤ/&3{,vśC`7/eR,oQJɑ51Y>E~#-5qѹf[G'[t5 ?noiմ 5_?599lzuMaTFJM_7o!g'>_`ky`v \(ͽ$^^puqG(ۆ-DxxSdIn[y+;Xn'2.>ȅ`-db.ſ/aޜ6'\{y{Hf7SNѴR4GGG:`ookyPV͚gt?w%\ڢPRhׇ:t՝Ç0tٍdFJ%Kpt]5c's_@%j1:?}㧏r h)P0n޼+h"QJzVVH`pg==s*Ϳ iYY\Aem*3"HV [PXY=w^0reZ5/kE+J.]hZul_q3$&&*dnJ))7s+}A%=W)[Yp1M7A%uj˚k?lݼGNв] CZ̛=+0營*3X8{܅"6:ݻp>?(ټi 4;w`Yŋ0v"MGԷ-\|yss55nq N8Ŵ\.ت3gp)=/R9tix{{AZyddd$"5v^u4q29MJ/0̘>jפl@3&|/tFqDc~Ri `Kuxs`d7}^釃(iv N-#jDQNݍw^3Ǎ Qy\NjȘZ>L2229laNL1 c'b%7776`ć!?֬ZCV-T5SfM4+V-_Wחȟ"ecwww3g~ޅTk xq ..̌pQ\\iٺ%-Z5WILȲlIy~[l%L5˔sҾ+'%v8ZwbhުSe\o;8+oQZd9/Hr\|5SPR(Ξgwh]232g|6Zs;+K Z^wrR~x3꒙񤻢R zNN@d(N;WV*]_0A6OYYzEljT?wX|8#6;\|-Ӿʷ`ܘ \v2eй)޳+M>ۻŬG76ѹK'йkgfύd_3id]+n@`@iѫ;7ݷGN`PW,[?)Uџ}'oO~'7$eQϱ sLFmhXLO%ߍUTTTT F3l4|{)|-(FSM鏐 KrUpvt!9nxsB.&^ˣ (ܹt,FzRTTTTTN _oBzӹ8K =OK****pgGW|JU ,#J:=,`e) Y;6(vFEӤ$Y4eeri|eOnYk@co{JPhMVʰg4is?uYXƧ.[TaK%|U#7^!=<kݣ*OZ;J@{RX$ A ]^eXFAi՘ ̑,5h@Y.mgd 'ɒ\;RnI=CΥlZ73¼W)[N"YXup#Fe9 O˖,{ܳ]|Y"## @RR_****O<IOO'55e]Errr *?w Ks{pcG$$I4Q#9I$S#JzDI@ y%dc94c%I#z$B-J`'Jzjچ+Sbaߐ}l\Wf3mmT^/Ҽ`~cc1Lx:B7%M+VУG<SÆ cĉVijbǎwUOdd$*TٙP~g%mܸqxxxPlY.]PR<)59e8I(IdBDxX IDATr*Q2XX%?/"H"dE%]P6ZEA (Me$eɪNõ9]0iZZvM\uZY%tS[iƬbbcs+-~IyILv*UU8Jtz?}ڵkeUW8}64~=գ_sCZm}},g[sw1x$}ߖzÇ3b~w9wnnn^3ge.]D߾}_>u,***Y"KcYӱT|*H,!\ >vwf]DɒxzzV/}{p%Пj5ީN74}Bk0Q:x+S|e.^@fF&vUVw}ovEk8~!+Ѩ?J*!ըX2˖,W[b]tA"IG???-[e/ʖ-={6 6T?~RJ)e`ph4(eZjFK5JI8p /tޝrѢE ֭ o믿Nxx8]vS*** ?<9FzQ&=:̿gsԩQ222rѱD4lFuJ|A϶RRM>׌-* {UjѰv#Nfc?$I{#V:/ XXF^`5*yv#D%$(",ӏxncjȴ)$'NҥCwj@Xpi~I4}(I%!l56[zI0[<-/XX5Ftt ϝg?wRܿ"b^7Oq_*KV0\fF`:7(k.~=lH6-cǾm sO *!"o>իG4m۷Aoic޿w? `۞1s N9App;ِCÐaCXq-vvZ>`4sgߟ]w߬Oԙ|6ϝ{ܹs_?Rb.\ܹsٸq#+V?ôoߞtlB֭8ѣ\xQ۰az Э[76nܨܹ֭[ӨQ#^<]ztcD^ЇϖJ4j҈=Z[y#XZv$",ݽ}BBef (>?# Lr S&>HIW8t0Ȳ^Sf5kդWit:í9O|||k0;_Imv7*~/ѻ_ozoK?u5>>ʊ텣#WxsҮeڴkͧc?)}[+VбcGd|\\~!#G `[Xn-[d۶m̟?fw ۷gҥဓUb 8p '66ҥK+l0}m<]{ՄI?wgggtURJ)۴%]MKgk5I!_Mdg ";wPmټ << ;G%''M7<LyMydJިL3"2(KbB"("K)ݝ4$Q$1*Ni36x =g;lWd-Ȗۃٷg,g>?}g3r1}&nܿ-6xwJ/>ʰW\4.]ƿzkw];v_֟r <<=R^\|YtlǰaK,gϜcά@/}j{t] ٳ6̙3"++N5|JӧQQQY (i؊:t(cڵݛ'edY&44͟N8AhhqX=F8=q؟̈6:4!9l+uݳ51>j״(V,xxx鈊]Ξyfz[ gE 9iѦ9eYh9 $S˗(.c ؠDd$E!/]<Vv PXdW\DA>zkcxgϜcْe+_FC.i\I]m?fZ$m8ň#ZOw2|.cRSif@Μ9JeCFڴ+:vY*/1aD6ӓOõk8:9Q6,iiF̺X.w쫛brN>Mv픸_~iӦ~zvҷo_koN||<{Q!,, ???> o*T`\p})qk֬ҥK;v 7o}`,^gr)~'BCCh4 89sp!VZŞ={r****Q-AιA;tjρ}"IL4=lS9z=z>⎎̌waQoǿpbN`޻Fc[-IL4?5k;vQ. QbyKdwvvvxoݙ[Yf= 歚3kkoZR@6)= M.1n8!$iƦtnfiަ0###OǢyO`بwk/дiSk֭ :1b#((.]I%8{,666 8'ҩSLݻ7{ӓbŊ3ewi۶-?3gͺ4Yh7n@TRZ56o @ӦMhРg͚5899^ !;>7ufMs077|lq-+3o|Κ95k%=߶l݂S'NѲq+T*(P@dOhҼ SOfԙti!FFFԩW[badҩSMRș.;w.j4 09FL$11vҩ[vIu&ܬuSBCØ^2.:#D>ySfp_/b~BWjԨ~J7:+ŋDFFҡCNJVH]gTEbc/,[C`HffhMg,عe7׮\ǹPA=Ǔv]kт6)Ds6SɁ{035ݯh7!O>ŋo,'שSO2rH õ,U "; 7ıS[F -ɿ6}7cnQ &...??%Y!YIO4K5q̨]&AgҦR]jZYafjNLK@?BwEDanfaeBM)9!A? Gx E %EbmeEU}Σ8:VoF4sDO =fL6SX&9; J%ƖXZ{y$!xLMLqu܊8՛K3"7075'^̴b0{LGj-49###LJ %ֹz!Ŀ]ҔVwRҚg(L|VAR`렷$@ТEVRgܶB!.RI~sk!"*v֎(&9>^d!Bl0VM[ۿu6~<6(YN];޴_~Inlٴ:bbwZQMXYXQpq19jW###&G)/KzRjF ;w jc^rt][~{WΞ9˝w McM)O 4k؂ZceWthӉ[>3\giooʜsym:ex-M>!۔cˇ3Z4aCj׬Z:]ŊҨILWmj`ۖ_xN|ؽ+ iSkW[Q(#רNBBB&V(0gI/D q(ZrMʗdPwf|6S/O||<.ߗ-?߈oe_9q8۷3,^ݼţiѪ̛=GQx1]ÿYYӵ+={0*"+=dִ|ԻAu\qm2-co@ëTy} Iߨ 1|?[7ms.lش/oL۩RВs{Gs s:v7̩188kW<~*jʄ.]& Цy;ze_JhhA{ײjJʖ-ýXշtnߕmbT*{H8vYއO>bu !?_^'¯p̘' Ĺ8wkk~)'g֟ܗ֔Si 5f+^4QkCZթנnzرuޥ+];ȈuV=1NZ9 0 H2 DCC8v8ggg&_FTZOoO~=pH˗;sf-piow|:38uwy~2>|رQQQ9*Ңq+~?{kym׻ <+ň1Q,ǏӣKOСuGn\t=)WA7J)NQ:<{̠> T2ٖ+],5vxy{1m֗4iژypjUO tl;~.uA7b,˦Ȯ3{ݹKv]B%ʺc 8yAL?ʾtօN`jj333[ɋt֙®)Cג?~V7R@qpL׽m^^gtmUvvvC8wt茍/`K!}/[|wnۊnũ^:M'8f$&&ҭsWgio:(EY7wnޖjR٧*/:QʋؘVKJ5~ -b/̃mIfcfLMTTQQQ̘2 0&!L|A}wǏ`wli;v[ŗRX jʵܲu <qݣϞ>矰bB:=}ƐC4d ObꌤQ93C{#F~>*ݨ}Hp0QQQ9Ϳl$yF'CV3d'xz{r>h%Q铧Y;8D㦍ZkV:XL6~Ӎسk/kTc8QV5f.R255PB-W fs1"_Dr53~4EaАXYYqIݱET ;;; iJRB*u௴Mg4Z6/5# V|n%pptr} B]cvעŊbbMLL$,1ŀUZUpe|}Z qpO~t܃۷nZ*\ SYڛF?~f̝ZSOJиZĕq8rJ@m;ӿ7ΧÆ},[~]WgNnj513uLk IDATfhTc=qVXZY2z(cHT%&&ڠV)nߺ]4lM7[ܻ{ϰcWoV*w!">BɑOڢT*}`'Wo_Nv5>h #..< $1tOabba߅G<7#BGʫ~Mk˦T⋙FOCuY *o<2+h(uZ&*2*O1=L=% "**c-;a4ܹeجoZRKHH`׎ԪSˠ>!됫3סJ*W9 htZt_L}IdSԨYhN:Ýw[N2 *xT&,<(UE4)OCF*(BBQ٠:J% sn:Su`ԘڿCqoP˥KshҬ1/^`etI5u[6-ڱG3Y.!EV9s,[6mٳ._By̚>;~rڍ y1sf̡ZjSG''YOq "#S/})Zsg_V֍{3(D`3b"3-\ 2μhq =1fhjhIO˱/R~~~\v;"2Ӳie֏R!m?޾u;;LJMcZ+UoE~m"_Dv:c֬ZBHKf䵄)N{T(ݯw0>!N̓A㦍w0Gѣ\p8Iamc5'|شwjϚkq&˖.}@O@BUVb<6->Zf0vRmAF<~ĠRPT^2.:*xVb͆T|*`ُ[7G 髸Þ]{ ɑmZ2z<~'pJ)Ŭyt'>>r8) V:B`,ŋ1kE++f!GCT Jѭg7cܥUl3}+p""6KN?ɬ⏹9+jJm_d2YH_:C$F zXԪi;O7yN8a?.cF[q>D*£BF+ K L]&Qi]8U2c?f}!ȭ83SBd,Y{GKo2u{}z󷾯_d?_Gj^B u-ʹoV>˔림5cFGs^7E!DK ާ섀.ʈBO~-BN='B!D^Y!BT$@B!"ABbbc|nxLMͰoys !ě$2%!aAp-U+㥕Q_iI*gqFSK>,) /Lc3kcʽH_kM{-Z6㍲iFɰDDs{'7!x]$@B""(^uW+Mi|j"@42gϺYK{l6׬I?Y]蒳=Jii[/sqi oBwRL\,VmPk郯K]Еׯ@UQ/ڔ 2ͨ.6,XL|flf/2;.0֤M&˦di?hSȤ´?jɝLB7Gd!;I8Q)i#h(Oi,#i6 ]Йa-qivC![ =f%)M;2l0mr-L"t!x$@B4Z DJ7ipndgw\~iS0 g6t#mФݞp9O$z\f'w.wY!& $F{līհ`+mp}#TԛSnT(:\,9|r`֐@9m\x\[? ?M*ĔEJi@>BMd!;IQNy8'HH;2qqf "%{!GT4ԈLfoN'-fXd󰠡yr{u!x$@BfTȼD36X̹v:037/nt7y{R-2+iݺkN|H>FISٷg?]{wPxLgIGJyìYnȴ7˙XZY2aza,[;~XYYQvM,BhjWǃg23<߂%i۾A>Ʒ/DSWN=m;9}4YV 66hSU&.ݦrBBr;\=wMըJu^ތjd!D^z)!#)~%'&-ƧRy:uoOᣴl҆jj2qd^ƐQvzTGJ3:Fͅ/^ ^ܻ .ulۙ7oVq-:JUʍ7h4|^$$&J">!s鈡Л%Qƽ,]w!!QEB :M?ofԘqoԉ;ޡ--P`PPSMHT%V-h\)|Z:_/&-*];˕n$UE3zXTN&8}, jnݢsT)_>ոyqe;%,Ja_Pɻ2eź%O׻*}kq$jK}R:}zS]珞BOd!;IՠdJ 4ɣAAA?zs s45>d 9[vnly aaa,Ӈ7.P<_kB-V}GPxQ/XFٳgޭl3Ejq? ܾMpp۶JW/_4oLپu;:K $fDjA7}}<{h ڕׅrsެ}Vc:;v+Ѩ?_秵?q]>d߼>$$3lp|N\ 0gLYcBId!;)E.C[FpUFïSf5j׫sA:vP((J{9&GƌFe~+vLH!B+hS5B/ GP`mk7kj֩2 6񓄄VN Zmj?P$TVj5r`Sj5d舡;}h[7ogz΢nŰo|*ٳk/# ǭE+׉`һG;s.~Y,yAr$F:Rrre|>ӃJˣժ o'Q&[L)-LYt>_/\GR^Z/}%Ⴧ4Qժu#jѢE~jZMxX(vj8Ĩq#jT䃍5ӇRFsKjAJR `ggKdTdҾ4 '!>]{jJeLSwbb"}͑_FiƄKz"uj"̟id !DYNҤJГ*^&e]6Ӱ̜?]PZCUiz˘9t DW6i&zvC\tIcV'I+T*Q%xXXs`t9sg~'<,y3`b^Fރ.^hѦ9-j>PGSuiieeRdö+^4MΧδu0 [bgoǰ!#h5XY[P(K++vvpg|֨5N"9B )BwRʬ^y\Ow{Ѫiش'?BCCʥ˼|MIO 6>Bܿw7nwǏ/"P'&Ѩեtht#*̟?W._g0b~,]7lܾu_F۠6~YǺ-Ye5Lʥ:6M^r{M֤k_զڗii[]??yfיD%!!xH=HKX<+nߺӧOy1>c>xWK"H,x'ixpKI ޴ -;x,E]>K~\-0ܿF3l)VV(]f2 21r6Ƶgc)^.󌛶jJ~to3'eL]3jvnEl0Ξ:OD N?E(X@Y&E#rdy/")ZjV/v7[|4n{vL3m4RKѭG4ՌbkgZaa8rfPO٩7';1 [mS'f2, Fv}W!g^7CwӠzn? &%N\r&&iRCzB ❔z:7%!D^YNJYP#é VryBd!;IaڤBm !IZAh"H,x'"/,K/_.!YN*Z©K kczDEy!Bw ˽w户ޑ!x$@B\ T(!?FB!" B!HEd!B!RY!BT$@B!" _ФA3*xTusB!DkV;[u@Y(Μs6teٰ'[DY7wVX(ԉ_;Y6R*tb-Vg%ʺ]v-۳~:n\CBtlә#ɪ iwuslfٳFKxx8?h@res]B!z ԧ';lߺ*իaO8tI`{næ6<(ۓ>|Nhh(˔ښW2eTZ-vJXX1xz{bkcÅ , tғ8ɟ??n"8887ٳjr]勗PTu=B!" + Ϟ1K.aԙT*OG ';$** `~޺e?~ #؏UW=󉋋cȧ9u;?OӦ],ϷfڤJTcy^?NY7w}ӧжE{*yU< KW^W]HttR]ϡ;Mg49SPTmٴ>\>VˣGk*ӶE{Ο=o=B!Ld>tޕPN8EZiѪnDxn%ܰdOF} Qbbbq&˰LBBqqanag>[]k׮#*WLEٽs7a^өkG<<?A=1}B!RӭڴdㆤED5QQQ{SVu6w.sfdr#?>߳vZ]ݨqC"#h48;;P* T&Oe~jVͥ u!M7`9T*&95/ vK#ѫv`mN `/Q'{.mƵlXB)RGGߛL0'кm\]B!0\YV3gFyFFF|k7mQXYYѩK'~^ c&aeeEY` QQZj=  *wKKKJ)E.Qw &112?[ ؘȨL=Oilz qmƏ  ..'OIL ׬\˚ku۟>7B!"EVkn ssslʂ=o.oܸ~n=annF0]uLҴmў;`ggۿElB+++ʔ-Ýwe T*bcb6FFFh&]9/^Dtv`بϩ\WdܾuǠs,Wys :L>g6oB^=te+ju !B 00g˗}vzI½oѵ[xԳ/Ǝ_Li|ؙ?mb7˙8uB>s~˖.gM8:9ğ{0j\tS}kNܙWxXO>B|ؼq ςѰqCr*V@ll,Ϟ>XqT .. yar\\r|&&9wؑTȾ=Yf] SlzG`dlSgAbkY׮^sT!B!,Uҫ^?,B!"&x IDAT%N\B!"5 B!H%ws !oJ"Q&y!n2BR-%Dd!X^,ȟ(Y=]fgeG!'W\ cld2UB!J"E(~U< uDŸseMSо **$k%B\#m9_jَ2YnzOs>>Qp":FmkS'~ Y6KBP÷{vkx-~;wR*eBv]!Seܩ^&}{?W,{mW>ӈHw trF%ʨߘLL0sQ>iB2nl$ֿx_Ԅq✛vJDD~ }u6Ǝ 8(P6nبwO~&,,,#../؇ c&H*T~g_[.z}2q*?ᣆ̞7bŋZ5j jucZ]tGs]0aD>{мQKʻWa$&&VWeYrT*7Żlymuy^]R[[["""XjK.ʊf͚쌱1VVV8:&}[uuVXiٲ%κUVѨQ#J,I^{e=A܏ m"'eGeTG˗gggJ)MGkmm[ 7LJܻ2{{{jծIŘ8e<Μ',,L|Z1j :a@Ruj">i/w^lX^ѷo, >@NHHZwH155uϝ9Gx-Ϣ>{^^E:"/]nXBȈRvM>h؀B a>uFWG{֡P:;;;zILL AA\|`NkWP(ٹ>zQLi*T,Ou9{lQzEFFӺֆyğ{~a)L?kWN|0 4Lr*׳XyƳ(_͜s>(M2$G'GLMM  HW`ˆsmjtuDEExWؗU[Mm)V/^DbeeI& 3c7n!<<g}DGEe{cѻ{V_C*0wllmf߰!$8$booOLLL_}ro Z-e˕5AL? ]4ZJE ,.O= y`"4;.7K7ˈ˃W,CPs.~ڲ%KPd ڴkm;NZ#~W|OMXVZř3g;;;Áի˗f͚ܸqv1gBBBhԨ˗gϞcW^ɓ'_ɬτyHɑ®,cdd[} כ{tK<|@u# )lmmQ*>nYw%x{{1vr4VoX$f( t)3>jƘm;;;̠!=}߯\gfnܧR sg9 ZSMMuP%th֢)YYkN~cc#UT#AAA$&&O#݈"={PpuuՕs-ʅ.F#= ^^W377Cܹ͛7SfMT*ŊtuΝ;?~<Ǐ@d)9xH/e_D $8DJ;mZZj5Z$'->>gwN⃆ B7P(4o՜YwǏ@_ԪZGe/Y:} Vק T88:baaN-ֹvvY0HJ=!ѥh*_Lu9v| _F!6&3ss;~ZD䄄h{ q˗ACx3녴jےiSfмa F|:We{\F?i-}vn%XbYu3ܿ:|:O].5*פ3ff(JV7ТQKzw{عtd4ׄI'< /x{i۾ f;z=Ҿc g\WW&'>>>z=ʃضm]ta\pk׮qFڷO1c |'A+Uҫ^5ße9K k OBqVeАS0cL=-A6-E"6K]vh"6s>ݓq1< zD"^8?tleeѣGZnƍ?~<1vXۿd/^Ltt4&MMVT)e???J*Oo+)_ڗnXLK܃yd!uyC@ʸz Żx(x/eXW!;A>+yg !x'Ȫl>g}%BΪjub^7G. !R S Byx/D151 Ks+TYW ĿB!򜑑& %JK W{wVENX$@B;*Ϲ F$*Q QgoQŎE슊b8HH%ܳǩ&9$9g^=뮽oάά˞ BK"9Ȃ  C   F  PvK0$gOAaյՔ(esF+~8ں&׺UZjCbB߰AA_@rBu(u+SЗ17ng~&ĸb[-  (B!ѧ*hhoFinCyEI"AAYbgYiY-6f ZU#Xd9FHH,  @n@˺&&T&J?^6MZ^AARUv}#‚3`PZ;*A>=z`{S ]VQ`LJKKm3AA_g/O} bZ;ޘJh:ysli?}x ?8~O?Ĩs._\0r EEQWWqÎG_z>7&!ݣ=M9&JDvٲe,]I&/ia^z%.bǩʐ!CvE"=/"7A>봳{y-v<:}17C&7p @f:`Er:? ɬϹlڸ FG_ 9VAcv(/჎p¯r±'ѻ[!'{J54  Bc4)0 4fGI_Jyܳ3)߅,[ѹJiߡC+?9VqЧ7}!=3?E'%?`<6o&3_iSXlirEңGw}sАs}1co@?umOk[n{>Î佹X)?v}gvw~m6DX(m b-vυXmt*#ppEq٣ܒy7oIPأ/=QZZdgg6ǎύeÆ =HO{z, MjhSOL"55gFqWb ]fϪ~u O\\ddfſ>ktBrJ _,@`!}zC?O>!h{AXt)iiidddkdKr'7:@ m0ýohcƎ;fM 5/p<;7^Dqq1P(L$}\֯[]N0٧Xd)K0Úc>%]k/yr '8-p%W 8ss&.#giOyޣexl,̚m7"))K9'w29\~e&0x(11srs93xy>lY8>}:Çgĉ]/5ĸn˚_|̾]ӵC&WL̺_2AA"`Fؘ6$emt#b{jZc!ǂ  ̈́++*Z|aoάkY)  :V,E^  5մm}VEś6AAu]o}V` ^}ذe=;*[ (7&   J+jjQ [ӫ` ''2`-[HǜhՁ6  KRS[MQ&6lYπރIO|2Ӳ8,_/TEAA_ZŶ}V(4IDATG?Q͉${p(    NUMM%umRHKh]26QQYB$M&7=idAA*Jʋ)hߕz5ݐKk]w^>:=O ®9C40׭ݶ9ٿ{.rHfZ ErYy׬$c zZFk 5/?wwCwo_Іw_s>0= >`eg:{=àU?[A@  rs;Rve,K:PҞXTJc0k`V8{h#2 )OіdAA5;iLK8QG@ XM`OPkl8Q]O yc]9mx)n&"m֜{:x(=җC\_@AYQZt"~ xƓZk _ֹ n{'6qsݨViHٟ#l#\ɏvv(ViMn5a^V<[FFvR!0 w8oLo|7-ðE;]$ d֟KnwMW޷ioM64dAAR` ['S-"7NpXѾHjm 3Z /u7]"a,fCS[[os5N9O^ _FS,vE"8~yt+#Z;I{p'։k6WV\?Z: NCdy>vj<wfFMslu.YAfE):_p#: .rrx]e峆 WmXXM goSJŘP]S[sR/@<>U/J1T;h-݈a#VZeMݵkmR8POHcmjZoqx #rҸ_69G N3oo|f, B3|-B F%Ey%J6I>n-mr[ p0h k)Nn"aףhx'e Đ iUpEdFS,/#Рy{pⴐ/D Z`\r^xE+J6-cGѵ[׎+W3ܱ<2m2@kg\wWSi)#[EciB0@/#1"AAhf 3D%D^Z8QFҭ{7 .ZLee% DSѼ\goZXr4vտj|21mleE7#rsF})^a1 g Sk*ᤅ_/VZq9ӱSJΜ.ơby2C&OȪVs[,i%'kp_\۹r%˛VZ  ͏ 4em;uˍR9s琕vqˆ3M3Gzm$$$pʟF0qj eLӤS~'9hwm%۸{/QJѳWOf4@5k|RSS9vZ0MKJQgַߚWI2o p cMQ3nIO`HNMv'̤[/Oȴ#;&ꕫyxڃvTu5#2{Y' /lXy왂y:/Z̸]F*ڮ[.񤤤rJw2ٹٌu.ob_o^͍ndddsIRR"M@jZ*J 1#/䠾LyQJr][otmRD" @cݥX쩯M-kú ,_˯ɉh(qLlƫopT*n/_xi6)Q°KiZYy"AAhVE? z6* :_ƒ zB{gw5ypzbǧ?3N՗^/ 3+T_{43y[h3~o~J= "=ݨDe(kPУPyAݚ#T>JUUO0L71n%MP  ͊yE P/ w2 ֯7 SXG>Ӥg{SӒIMMMtZ@Ffzq~Xr4̳KiB;<U6F! Ѧ2oQKئj1rܿ/_}y wLrrg"@@  ͋pl_rb;thVsHCٴk/c^Fll,SvJ9kî:LSk*;jݚ:uGwM\;wVYsW:{Nnk'nt`շWVZ/+y:bji[v Gs?q<ˆ$7[AYpR,b{wtOAμ0%ˢqjvp`tхL4mTg-R(mҥ[g~q %%%/֙MhӦgdSz;eEVBQBБמvW氽t{صZW_͂/'ƓSӹk111̜>[Š+)VָhoG4Jqʙ5wg῾a췩G6q_wox筹|{L#.>O>}mu濻*6=uK׌ 4j쵼f">x#]z?Zõ㯢M|V^Vy4|{ ?$YAffO5{KOŒyql/N\\:wLnddrۘ9y>1iyP{zen qL {`*Mz]БÇ !==<´Ǧ}R,."kngłpҩ'| i_ܼzxy̙KYi ۛq\C.n]lw1VvFV;ux'>?/8E(gxO꓆Ң r`޿8Xc 海_W^{[XqvE\|9I AAyQJ>`/ll4Mg;V"AAhVRUwX)!X(ӌR?Oh*X@AYqvͶh2ob7 7."AAhVEzAn +{SAR,AAeHOIbII-;KpgggfQj$Ivf!D мt؅KM6$&p[vVٺu3 j́{W!D޲sg-rX;Ȃ  4/9{ ?[͆msgHmy:dXVuY 2:dwV_(AAA\V|9cIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/flrig1.png0000664000175000017500000012654013203343735022122 0ustar jomajomaPNG  IHDRdsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxUnz!!!H*M A+( D$6@Pi3,dl p;;Ιs$@APx!9iGf0?^ #2N>˵;Mv5JHBp-gS8aVZF6W Tv `k<*q$̊.ILݟ|/t#x{닛Z֮X+lvr$YEAe%Nm*Z[XM6fmǜ>۬rϮ8>OY=6s;mf<cnX_;$H1-"ŎAo^ǨUhpvv~H_EQ2e~_v!EK~SB s'BE ''UZm#k@ (,kllHCV[dP-B۪U+ӧ+WL6m0LV1e!nyaPA.eJ=xoT?<`=5һ'o'|ier-рgyoqNo1f}u97 eE{slԦ7b5'' ٹLqmbceA$}QU  FY!9ɄOg@-͚d[ f)DyOmZMm`%B$ֶٙ<̆4TNd+ǎի*~:+͛7V٨ϱl-[6:,NW F=2LӆH@\Lӣ2&=r*֥pQUmU:|fN5P wy:.5vcu((&=f$I٨X]ťD%A'ϊ>.fOذguW JEȯgcxK~'43:L'">>WWLBT!cY\Y:7,'N`DEELʕfҥ;ի]6gZ޲e ?s65jD&Ma9I+jrt w'3ʨo! xB@MѺN4f6%pK^+cKWoW`K]wTG6dWPLd1yP F:POTx54-KՐ qjƘŅ#]6&F>)Fu\lZ.:@Px>3Ie:ғmϵkרZ*/"[ѣ\7ow^/*c6eh4HRRR6C1ip:,"4Hը#Wz f3oՙR]EhHMgѹy/`_o0-͵A?$cy[{)#2F6 ӹ"vϴ/pUmF ԟ`w SR̭q|*.ggg%/}]$dvMn^8NJ2u vn!LH[  O5kLdΜ9@ip3z* +|NFSKhj5.nfCa2<_/rhg-;R$5 ͆4+e5eiu"R#1d0j5\Ӓp2gCr7.%^NYf@@ ?eʖ6P$֊Pb'%QQEQ=TPby2 S~{2җb6fdNY5c &ڿ >TRR,$wn'i 6癑Mz TVkIWzÎ/Y3l:ftB!cj%,bSBJ-3jK2Vv".IѠ+mNZk"%M'(l2b0(t:Z9Z,F@Ph|}}yeKwXZÔ{d J!%"}J"׎&5J&Oz.۷IJCJJ Tx,ěKI2ox'''[G@ wx{yeJvkAs3v]Py"bfҤIf.3J @dd=3J LA2s@ rM Q&+,P9.b-%DDD3g,i3˗/.gΗ`  Cls?Ʋgai.]p^&BhAA.b-%%vLbz(u;wMQ90 mJ|bxO)G %99^Rؽ{7]v-i3s)v]?b$w^/һu %m`ѩݘ*[VuϑC;ާ j%}#{AL/nڴ)Gtlٲe5jT>jO#ky!'>6*Ͷ5ӽ+J̚);?9YQg},cDzTk6%m+NBNJz6ì؊=A/X32Cikl[Q0뽢Tͬɱ?Nz-3PVFt.ᠢ\Ixǫм\HUz'-![Sx q߼\ Ou_^*/[އq6GCZ]0sT[*j2 ^Sz3In=5^^b b!oJsfۊ^;wUwjrM.ތd4s"8} O9& Yȷ1 zps(Nُ0j ~}9I:Nd{ Ttf7s2O&UE)˼XЩ\4${ ~.":.ySۨ4VA~@9-JA>"LOcwK~/3O/<ҩ֨cX@$ #7Xś?_DשnV=Z$юON_aV3zӄeC0oJsmY;y.z R>Olݤˢ4TbrMij&5iX׋@Ug,܋i<֮ u+h1u ĎwY+/wTUV9z 4ldП;P4n%ϸlzYZ64E_P,68CW9ɶS7urrhC KaJΒelxZ;ԉl.6r)s-bF8oVl\ݛ*%ÿP:Zpv.}\~blZ5_k\|NS}b\O%xE+yUUK)[zI%R}De  O AAׯ9Sqe\>6=l AclE{ٌ02jLeN"^[_.Ử/8+xg^VHNg*Ƞ^S;^wfFƯ;#Tq m| :P&?<Z2xZy`ƿq!6 3%N'jBt}`&v[ ^:yIN9si^ΐRG3l'Jif5og6|L oc]m,Sns){QWʪ/9v6~Uj7t"5CAJTߖsP?җO>C_jIA6]iӦ`}`|B˭ۻcô`޻GtGV3}$,{xw]%~^簽Z^ z7_? W9a○&`ޭ; d;8@Xk$@=jZ |>LRBݤuÛ2s*ak$=u4o k_~~!v;Qax= \,uT^+X.s 1j4|gaDھ_-ЦpO6tbLPKAərUkFS%U3g fS!x$4.9?Dd qtp3L5BhkPTB셖/3iJ#'\w4>Mcq[0qqoC^"\R :F. oeڿM[6|lSn|<_n?LܾM\~t6v}Þu(?r5\WK;m:Q%:#s6iѤ:oDꁝJΟQrx$}:LFN9ŚYlش9ݓkm|&HTm2O7k\EP85K ?atL_.j'ۢ,- ߐ@<(S#^==TD,DT )|e9p:ֺ4$3՝wtDx/.PשYobWޘ_hmmHOѮkSI<7eƽ>2a,3YՍS"hmgl:Q%5g4Z(}m5]_fwԍbiE1Ҏ0'Oڂw?i>5z4;o<s0/ *0w e4m,eUBc8rPJ#Ne}| /.O[#KO^?Oc*o='ŝoGuyO.4IЙiwfZ>|`b]/fF{yd ځJtVe9br-ǧpZ+˻M;g=ڷ3t]ҩ 8<2O3QK~1/c:89MPUxr w4tuS'$W㋋<71ν.=`juɓFf(G#̫ 9׭yzҺ]sT5ܴx uJXUUź5ٟ5Kn!R0濓o.v+j  *. q,kb=CTJUiGM;1Q\1TvMiv q/D¹MH_%q[2WO[υ1əMO IDATΩUb蹰+or@Vfzo;;-< M?9 dˡRrE]u~IFmsBrly;_FI; ' *kseضd;TlӋz{XC z.B dPVG?N+ 2gNc=͓Ip&'wBUb 5rϿY%v}{.jW] -! kXsr?*×ro<ɡ,9v6ƦtO`O"F[r{~"V,;ZTVuƇp"Wv|ʱgSnGB$6J|k~[2gxspuŧLUZxV9^Glal^$ĬI_Sm{֬} 4U!9pܛV ds?_+T5Zm*;1#;6zt~2[?Sץ [/9{-|g ]eT5ߖuGF2A}ʾP8I[Heѧ3o,a͋_A~Ws߷/qbMx0 t۵]1@ 9Q/M.ɧXg]ς> eYзwڟ&3d#3æTN6d sۄO4,zLf߬#M?u%zH,U[3x4T mB~ޔj>52}n&qnosx􏌡YEs $`fvJ0]y7{v ˀzc+Q_PgA1ƬXhwdxҺ-`ӁG`+ϋՋS|h9a>c˚@SJsq*TX~W7/`䢹<}o֍\Y+eh:ӃSsA^!D>]2#ʔW8~!8e"## -ui x 3k1(*Y3[[]_C6y_=kPm7s0=6{-%ܫ[tҥدSٳ.s%>s̙gBw_ɞ;4.WKJ Wя=D?؇Qf+2]2]Vvyce|x-!1qt\& "f]2#~%M^k삇I!J-@ F:BCC_`aA KSfۊ^YT (iuhh(TT^Sj:t(%m@ 9@ r G6q@ <8,˖-+vcQF7!O#OJCp>dM'~ ?4feNG8p@I (e\|HaٲevŹ&A#燣[8СCK A)cԫWzϞ='""BDQV3ӳM2&L h޼9[ne̙gBAވȁX运mSm*C-KPtgC.] <*bѩݘPKH. "*g4Tlޑ>eϋ+"f@ )u@@9@¥ll;N:bHd~t2KGG~WzV1: n4MT;G3JTm>Ɓ>O/g O]'1 iÈr̟k2l_7V[;=[9B!bE8 rm۶%vkzk~цt3 n4h}g\vn[!M2^@/ӵ ʊ]X:f4ug{ROl=d>Wrkʤ 9 77ΎE+#s߳ȍ"Pھdr\0~:,h9"ZaUW.1.5k3)W/7QU덿6Ӕ-x%3rL‰gqDxM=㶬Y|$3GuPvJ/ձu<].lC<֙ECYɕJq7*3{rɣ KTJO蜑l=o5Gm>Dls37f“TTAYykw(39FHGp^- .>X_g=>%|khtx~wֳ$^ըUӀ&%}:jΙLrEoG+K=PGPNY&7M}֦㰹,5@JߜVnK&hD8ՎMyjt#[P)|U2oZ֬x 0D"*ޔ醛g&WQVvJXxM`)}ˊ*Q~]@huRZ.E#u0_n7crunI 9Q& ]&9B$r`T{=.ǓR8܇Q֪|:q~+ޑQ8d IDpP0(և;O_`sզ2_;):A&:쬚8((UCP }y;7F9T}8ƢF ߼d&_y|ʷgXg,C8Y0%\'ŽUxvN9i;ʙG#5ępO v3RI}ؑը*nM:P:p؈$<6=l Acle7楬 M|bgUz'-![Sx_<Ꜩm.˻ 2HbOg:ԪV+'UcjGaA8rRELgE̳au={Y|h9a>cDzi߸4.NF)\6srFOU+yA&ƚIf%Ḳ),?oqt(rt>S/mxKasU97ߏd8q=駪1v#RL$ۢ,];Ws&-9l9 6=OQNُ0s/gӖM,۔Od70}}koe;[/arq=®@'*k(Wݾ[UuVJc3vN}{+')#(ڝoGd*:/c^][gwɽݦs`ҍn f@o̽eEiՅ|SO:!W*3`T+;4 ԏ&sR:OqMor]Vs`X^ٙMecrA u4:}"]ƌCՎ -A_""=Ǝ?Kè[!ex*Hw&ѧqJx'^bI6D9 L/P%af8Zu?>Yt~[g,8tZ2Ka-_DX<6ksvj=糯O`P+>;-O~ٲr==bds/3]gpz|VdDmCUPSpPV%anVWG?Jm9d"-۔r{1\a됖tʒ3[Ϊ:ftzvab3>/ӂwܷضm۲zj&LPҦJfͲ8p ^粖|B'-Kǹ]+̡+r':|nUBpNbےD#Q9~}`H^h29O)1\< 7|߉&-T 8x]ENe/}·9Dvɗ9O,$Or/ekP'* lA-8fQ?տ&*묺8*ίǀXM\-NSɐe۵6fj:(8p|qV" ,(i3˗/J3B M h.3zOu$2+˚@SJ-3x8]ֺS*-{L_g[A췖u֐XVfNg2h<ڄ|PM۶x^gf0*hbr|ɺD$wNm߂54 =q}{/ÉҥK|̙3GB ;.g*7ma8pؒjҌ]!<؈_r)%""3g:|ٳRӁ ۄ%.%m@ (&XB2D`p<\d.]Ƃ ە&2_|D~l@"ĺ$%%}R1J`R"x0[APP粢N_mFL_BuaiU!{xAK2nاgjՊ:)/{7L&1z^k_NN1 jGà *ȋjx :̟݁rK0?3|Aw,w??(e^8unesHq$oahYKI>xpڹ,AՂp=5ChXs˕iyΌW X3 Ȟ{wE{eϵ~=oE R&_8߷/_Yܳ@Ob&a&j)rח3+؝{XDfGKEԬ-vgޝ㜦G2:u~)=߮f[DΞCy?p @ ,]ģy-.cܻ(ڑsśŨ-j :.l@P<8b]/f9{h!ҤeLPUJasjGE!B^J[@ 33X'($?uիC/Ѣ<:#rsg'nV 7{BmQԑ/[\ ~8)6l 2-*<=-&od'Q%=WN~:tժb_NU%d%v뷥~l{/|}W߫Ul "L W:5}wem zO3(k_Çm"AɑIvvLF«q_ oNk|ȕ,9SIg]`w'\b!sA@Au<` J#n~qm0f+wD}o}i6e}ҽ]od|n<06]6:v=ꗴlg<g}ښo7wBXU}c5ߕP;ȁQ:$OJ'yj1R.SiwDf;¯2w=Mktfǝf{p~f=Qdɫ~'Iv;P)_lN4?xjV&-@wJ~"Cw4fo|ƍ}(/8x Կqj3i!oa7?w ƨ' #6bN {Op# F>̝֎VS(H亂D+~9!MH}9d7&[Oܚ29*ˎ 2v1oXƦY!{捜k.X3$g%ߗfNd @#Q;3w5\n=Y =KipFzmYų~pI=PG-cMR1#өK嚺lMPgo6?_ΣMasY6)*紃TDAu)d̞=.]8\fϞ=ּ˅)[ڦ+v͏|nUڕ#|?Ɠ_O%\18}x5z4A:oFgX? 1@lۗP p86cw# J?BK1”- J]fFIF-ݓl30ژ!D,`^|;֒5 h2 2TujX/7@Xp?Ag-rEW6t9Ȼ Ή wIWJL♓X]wfmrwڋDEL^kϜykuX =ӡ|qM, mUw1:Ft # z3j?W#FNG?.DDD0sLϟ={U\ S4&3 _R@"y|F.ˌ;fx)>ɱ-'gwY3vhӰ`^iu.NSStHTs3yP $/.e:x߼hωH3V0XnENs`3ͅ#q2F;aEDŤZ*mϰx@UadN*x=B){X9aw>Ƈ6g xb]  ]t Z600T&3iGs旎{[uڞ؛r+^nmz9V 0S39Σ?{$'FP<]E$H.ll[9Tg2Zs>zηv EJ^u \}aBNfP"åo|%ilExLf)$wk9x3*xhϳ.Dq#q1c02:9ՑffQI2y>~[=TsZ;#I홰b{u?[^XvyQ̱ ݝ}GLU&]E½ug $\:ȆL˦_F)%8+2X׹ͩ@8[^ܐea;*Pھdr\0~:,h5ĄcdUV'(L~xq{\}-T eh ( kYҭ{non9E iyF)<=wq5f?7mR cܔmdc &fceٲ%5c>R햖[~v{{yp=p[Fm6 "cb;ڌ;ED颬%Ⰷ w0۵Bڪ / EBNq8i܎֣O:TYϡ.ȹEuDǜ ppHZelP􄽳wś mـ0;qeI-"""RJ=$b_T,pY,w֏fd\&aӈ3 СOZG _` ;S7O'a ێp|EjC9G~j4E$^}l=ϱ ߠyb> Iζ<ϝڱ8x+}Tٛ ɨץ9l1\H ѣjA:[cB8vKFNM1IkiH[[>a"*3>>>%]E2SY-ֲY]҇eї| yAx ?C@A:mx# CzXp$L<:gzh?)rgzK\FŖ=c[||"Q~F6I]ttBF️ԍUI fޠ,zSCkա;;"1A<9{{jCU6RىB-"")SniXӹ- mD5d5xg:|7?Lcה4Lݨ$u2ק+]:eGXƎ7mG9~6yRZinɣhS\xW[IR0u3'''3j+% vk0t? uvB-""Ss9[,72}s4m^Nİ;sgWy y*%ؚ5y!a籑oTA _DDD$/>MlWdHAٺ53DDDD߿bw.gN+U|KaBZ.?ǒ.GP5QRT^DZDDź2p@pssS8_˅ョg~[oAXR/_V8MooBX(7_W\UEDytDDr$,,L)(Z).L\UrE;""% RQEDD4+颈䈧'K.ё={0sTZ)̐ma0eVOEDy- u|||⻹+QU__|Yt^^^R8L.%U/""iQa<@s5z1yRCnijkK9o*vqQSۍ|D+|[ÔtyzzPbl\gNT*U|3ҋ͗"H;z!6HҌތ^v HNw[l8︱aM4k<>L9 ?ar-W~qka#A7I'%KֶZ hak;J7+M9[.[3!=|';Mw3TOMFqx >u];h}) dIC"&/k~ KوuÅ]Қ>/|V֠*Sd'42xJX %[ eޢK\1!n{bƖgǔ(xy+؛IɄ4]tM6=\u6U0L%G|.y{9o:B9|3]Ts0,dvrI4ץԞ̭Q}+a΄K/ZF9j<٢K)i9h1HMۯIO@vϫ•( |vuRMϷ]S 1?ˆ-clZj 6s^qsJCy QAo@ {rmycQZ[lO6vhۀ2}MR;f]WfIt.tӵ󟂧ƢY K+kѸ(~lOE|YcNyw;)R3nbxwm޻܋:2vR)Ri6>x^SXw.޹x v5u>y)&7?92}Rk}- +Μb}K_Rrݧ֟Mcnncs7.Zwfo|LDǜ ppHZ+GyC=1pް_Iixo51\yW% > թo{DͲ0GNovn H0әǞe΀߻ZM͒~ ]A@lv-pmHE: Ɋeh:x>Y5~ OU\Rt)wY?78E!Jˑ~ W\Aᘿ#$kٝ%YFQ hBYx|>gq9XɸLXÎ;X3/6gdqǷsa ێp|E{L t muHL ))++GQmo`5i=r_^Jݝfj5 :dǮγ7&cdHik "4N0hٟ׳C,['cRAn,!ҌvnOK ѣjA::^0kBfנ?q ٓ4L.ȋ z˛ m -IF_r~vyļ\}-6s:[re $>p޴ &N&C& 'P%U 'd gv,Hj԰mBi5 $ ~!DjTLr䏟s.oʘYLqAԤd^1 ^O`ֱǏ lݜ|eJ~V)i@bނ]*q Fѩ;2eZiԩ[Gk: 8ϛ R-Axe{wҚo ooqVYo`רlEE~: <<=C3>K-99:λƵ%zƖFrQ-!"HV R,~"w |gvDU)O*CMLq&S`JǟX05 cO ׭`׉qu4 ]/Hڅο,T9TQnLT5fɯò%ݙ?[{ }|J>Ƴ ЕxtǓrj:&褛I>ݴeߚf"O~,شߔ?7mY4cٹr^ݾ3h5Z̟w|weLa'd2 :{~6-@֨=8=~mbd81B|)QOJ`dc14skX]L;a8} c8V{Gs>$oL ";`nbE˭ #5ɤw/xdDkG;L5L-kZU 5 FAԍnug:D_ \r_Sr2P}6Sʨ),+}X8uut+bj|xV<Ax@[Z2"I03J$",[`XP$8q@'}g # ^eb|#9GIkU?v-Sjؚ84mnmf@A]m`?/*t[pvt A!י"a9II Yb+մ  kkׯs=z@yc?QgHSs^M"dNjPwItvmj׮M5WU}9d".郎<>sp[ʗA#pRxƨ\|֎ $2`aP?0?V7T#p:@$ӣ# I|CfPW%HPW2Qےj,_}N9cle4hD9 JU3YfĪ'9o<+[ǜ5wz+I 0ObѾ˄>{sf7vǻ <=4~xU0r_k= <{rSacKԞ.oC.,7QoꃆPP3}z/tO`Ȳ;^~*æJR$Ln(_gI;;.:XzUk[ Ar$>ׁMMa'}AA]%yl3{]^VЙj{ה` ɢ9y8Q#Ž#Zz)d:4wqctϾKacqILgLow}#~lB/Z TfHc\xWᑼh*(>kwN>ƤbrUô6^Tnia n=K"Ts}xlXp'8z?X\I G@)iHG2{P}; gHn=+B5d5xg:|7?Lcה4vUq2^M ֞}Yv5>gS.\ʀjyMehQP\b\t<>6MO} &n>«@ ϼw_ tb}ѰaԫVKyt1p_}k&|ڗygED`֍IfNH;OO҃gN1NK/e4p}^D+++{lEc7g5Hic&=65~ҒGO2^^+th4e}զ"7d^HBUq͜5== I߉ˣWN 7-e`Ԙ-0mL=89/)agbU,qOsz#Γ6ohJ'6y7SFJ aW7P@ÜVjp$غOb^>t8l>>xzztQDDrd֬Y8;;)]crB!JR/a&*vOIՋrpvvfҥ%]  S9;DVQk7U4MEDyOZ)X&w%U/""""%gHiEU &n@@q~IՋHI!̙3..j.%U/"CՌAy”3 MT?-k,h\KKK<<s > ]۱N%~Sna b{8peʅw#tb7$t$Nkg{,tAٮNMob% j\y#Q IO.eS:ZVXYעqQN<ǜKvRRgNej~E0҅xɯ8B~]0 vxi{;##h'"btKpLNnG'xC#9PX8)6۷Yu -%}yJ]'=a]sfgj6-̱}/N!S0LQFYEI!J<>pM<) 17+'S' ۣ%#T`́kܻ{NXUMPѐ)bD.04!1hOGe0 Od}eI>z̟cA|~:jtX ~Ԏ=[ҽٛ ɨץƂb9P['cRA'e &cdVnN`BY v!kU\7G}f&*jHe{&<· v>3rc875,6CI*Eں'cמRYx2)M'YO>kgO/}z&U bK@0$EDAkYo`רlEExifp~:,ؿ;X%fVo(C]-)+h[=asԒrtҡ2"ā(ժI3~0U2M9 s^ [ɭZ,1DX D^UHa p?mع'zcnEsi8+G%[;VY,AȈ:=;T@|b񨡭QI4ӄo΋*""t^.+?IZJte0W^]}6 %2>J1G$ZVl–AP19 F4\\r~8Bq.jexyJ^qGWo@TJ```Qldy6>G(i`aV*}p\ͩGC[Kd&umXn]Rf  oS_.! 7F< OJk TV{ISz Q!mb!£ݬ]y(;ҩՑ憑<6ťMvD+q-{!ܧ 6LaսP% vk0t?&HYz^8="E^ɷ4vB(chEe眿F Cm^˙&?DpD$Z~7#`Ԙ-\JY \.x9#/ld.A]O:AA|.hH>N;fymƲ)բ!)RBo 0GsN /)OG:f }aсi;0-kzv?Ƀ%.~{|PE O>[xmOS>'ģ~4sJ'fFm д ]':ֽgÿs+Pݥ^". 8[ʈ;bָ+n5=IoBue䵘|鲛h*t?! Iz|Z4鱔?y|t!4g&]|{ҍ1|7vѲtfXdnaDD2S<%a PmȦPG|D毻g(Ԡm򡄲2u#]ʇEZM`+~n]DvB nm]ATܐQ{\DDDDD3@URX/"""ŅX0(eX/"""ŅX  777r^>>>xzz槸EάYpvNYWR"""yQ~Xee X,7_ٙK*8Hj(z)<*i #Ȋ2QUĕGUE1(""OXXX: e5X+n "X0-L܀Y;Bkח3g*+]\ 7 I쒪Dk$MT54%E'K.%,,DElFk۷y* <%Y/""""%(YE0+̖d|zNNN;w.ϹU$NiAkJjO %b]c\ߏm`.wV[dYAmq14FM8; vZVwY?7476am\xO٪hܫK3b=#-n8I g-}q+5¨t[J~a_USRQbE?xb"g6/gr,°8զV *? ?wi0;m$}{,LZHWK&wP^AneTHnP\t6^ 77m: 8hQz=Z}3ќNEVcHˤzm[RF=-MXk S5TrC#ru"- (]i "cRo&8,Gl`˷Zڽg'2a5G3-ٹY-TKz,cW=6#i)oSZw崿5wMNFg8v-opd= gR􄽳we;~)?Um"5DvFs>뗱U Z9|h-s1_}J]jwŔ-0'ru*Գոm>l3}<Ȧ9͙Wf*%+TMQ#dCR$WwwxNElێ`f \dHiWʟeqso3%g}%\HRZ}Տ'hԮ`@=dD^:-n퐟,2D$HKH*G|dلI1aa5 $0p're(~:* ܾ1 ^}'[D}Ŏ4rq?|&7w*:[??(B9-+O_b ME#p\VDVsLGffJ Bpd EuG$ Tm!%oSۄI"1 1@ҳPE]߂GI ~`N]և0 Q 4*, & jVT"`ۚP}$F틄)kȷ*1|VkѴs+|bDچ P1|aKwgy L܁i5}')?Kǟia?0y h1@ 'J` zylƢ#JP+:F;/6c膌E7eSA g^Ck~?U쳑6h(mMFz[˱u&Dnj:ͿgPw,!'yИUL-)t-p˫5rc{CĘ]fEXA"ܾ|-%21axu1WY(ݣ~f3FeRcKe8F&!ѩm8)OCLRFё<*yBJR3]vvvOOOϚ5+_[0j7-^іOǑ' \t4i5x*,[ق֣VzTqM+:ZOlzlleV)hۺ@ bC%h)f#qw`zjuHҥK[ܨzDJb[*JXkX(F 0qUZ/1zDJb[R>G?CJ(5b(lץX  7771p@B|Sq!?UR""""Rb 8__|WF7Cj%U/""""%(*LaĢ0qU}EDDDPDDDDDDD%ߞwQCD">"""EMz֭EQRL5 ȑ#|rQEDT!>"""ŅBb-󉈈#G(ž8'"R߿, ל8'"R:$,"Rd}ꖈ###n7* SJEDDDJ#XI@@ [DDDDɈb-+iBPxOOO.]*'1\ڕgR7¦Gǩ:C%]V;>oۚu;q 2rzf$'xnjax[ț޲\ad<:iBQ?vWv>=a)mf紺O>X:^*Y4lMGS(*bя%^D=:Ƕ%LaĎ03|x Df声N^'42xJX % E9$` Z@:3M3xjT@C8N{UR~>13RGrח3gt1J//b49v6YJػcDO5 ҮkQ.a<%m~E*:bhZ~eCn^h a?]Ma{ye=}zazw*rXXZaTBQ<]Y|7a^-HB6b^5t2NO?gC6vhQvqh/Br8KpFh41Hj԰mBic2|Jwdu|||ށ?q-1.rƳ>_W; IDATijզydߍCxX,\ rt Qߍؼ<|"mj@|L^O CSDVA֍!6z,H"I^i(S*Gp|ϾlEe-!7lP,"9t%*`q5tIpetT[$g޾}[E)Rj/qL@@@-YY[ݿ}\ׂܼ onaIYo]SiN)=z?]˛pc0xOeٯ|ATۖovVdە+eE_c&Oal=7M`5żJzLe7ų`Swd9=굩S.iUp OFWP^ʴ 0E2(1\/rl!S+NZ)Ef^dG @Me_C%fl̙-ӿk2iWq5!1$YQZN{ޑMdWƇx{.vn&X<۱"{uKcOҐݡ-z}|W$PtaF6]g CD1udÑlZ6>-Q{p#zĤVI?X*GLAбvsC>(?*-KMWY1,n $(NRMϷ] J:wψ9F R I$Ѯ8;l̾9\5^Sբ-zh_C.q>x5cۊ4rHLH'K|לsV ~ISka҅ͭ~~󻇃C%+]sE[x55RE VvH9.KV #AK`M篁UKnQ3Ft37g8(.<<=KE<6PK[QO<{Q;[cecCZ8fVx[FX7p7Ùb+k{ \8HM S Ba~>2|$~Sna b{8peʅw%YqǂrJuXNA-\XUSZ|(lė'v$+ΗYxlgt5?WqIaI9pD~fmq;t.t-2gׇXc&_|7g͢n(`~IQ}]4>ت!Mr"unMkkٝ铜1) F4\YAF 9 oؙzz=J2bd|%"Jqŵh^D@Z嫪hN]sJ.t%9_ qFvA0Ar oe_`զAz/6:IP6bܪeIzٻx6l@Y[c_&BO\]seu 6j!Eq1έRś8OǕjͿS3t<<ܜ2UlLC w~!bnwl$*F;-=G,أLB+ !tJصgO.H~aώكZ]T ӕVթݠ=~b}0fIw]]J2ٻo ?G$=ĀRu߾. ΍s T.OIDn6>(a|Ya L1F[; xqJ$N8|,N+GhUV'luЈȤ.s5wP#Bۆ2,Q Ξ]$hDш+' <1!%ւF9uиN4 Gҋ)mM=qG^qV' Ni=50̛VFSҧ0:ticހq2~ cǜ۶԰2ڀ,KDZ|M.NJoe!?#dL"v_Ķih~@RWZrDlMwyk,rgh& ke;~Z0:,uH'ٲuNX K"" 6"b`ϵш&QQ"1!**{O4$X5F?{7)Va]v3s}y;zjҹ]w3f^,rd8rRL9 p#Nu:CUE#Zyq?s҇_ˌK\NA>muf<݌l~7}7,8L0K}2 V)YO;9{8Խb5$_6YZ :$5maߢmi< 5sp"YMulGKaLYS]kֳkD6>]*M2:eT,_Rb LĘZ]R}Ol)[#Ɏ䖳dx62gߎ|$z/0Aptx4Ct SQ\!|s)`V$1ùE\&H9}ѻw(~'Ie?_w6PbXZS)r79R*[$iJI]uԌ ]f􈓧У;I)r k,4k+G^!ScjU-ՠqN ,[0OL86Ȝ;ңZm9Gbs_f_4썽QkXCq0ɝfKrN{=TrTIظui!^L7 >r.;x(1Vtp`%P]UFytz?JSmkк`_]Zzfq4/в :rQz|ju2#3cA k[bz*RsGMܹ@&ֹH&w=l|iw˱\HUN'MwឯRs g|]#;k!oblkiSXVI&GF犨#=-޾\7{9U4AH $Jו``hPzAlܽnT6j ZOth7@^p5Ru^@.ϿefVg) ҩ 0㔏K,:bLOpr={z,NI͹2?<@SK@J-2G(kcVHn8JY۾VVӃFוiMY>FʻNC$':%Z]dц4;ٿvygeD¨ )!OW)Y{]U\Q]xɾfxm 40W/L9C5}\~N\|\8ANխl(yлTc\d8zݴh5h` &*6#[YNqI1άy=/uBA51 gn~4/1|Yۜ(|sČAl;8N61_CBFt(\UiX6=>/XNH>k~4Oj3oq4羊ƻ6)D t,'ؤ4Ħ%_0Ɩi\'@"|~]xǽ;Id!cc<=ޮ9l݊:3|c<>1J~­?r*3!}kxi5(a+ELZYrmw4?YbL$]:5if&4FTbF$zTCK?tLL\hedX,Hc(;~ x%hV;NOnJ% bܭƀQXE#~])ѹD=Sw\INE_cF߻jE}4 dRm`aS lxu:b=7.5áVZRXf2 nF~js-h7(Gqw*Uݮ/aJP0O&VeH9&_nK̍ol`[&! "Vd?s܈M% -"ʟq(lߍfq aEݶ Њms6FN {cN~ewam4} ٕJ tTZ!ʮTu{"TFۀy5[b;p~5QXk:.pD;k"XPԌD2@⚓+.rj6 &n=j+'K^f&>2H>9\ēy35³zN`L<kMW^=Nȉ3oG#dAܟE h~+ hp 7IØ*dp:jN0PnMPu$]?Mbp 4k̈qjT>P߳1^ާgaѥ+Ѝ*\jE@yDmȉc'JMKDuJ-Ń@ (JL#U 9rD`B 23'/6Lk7|Y=N͜8 S+{ű6W uTIˊ{ }ifd 0V;[se.WS("ǬOwt/t/aL;Sы>Q y@3wDo|-c9"F^ilQzR=j(G \,= ֈ%Wg4)< %zd ]3Gf錛)5,w~-sNpK̩Е̿m0ptQ֗/֯n{5֧-rΌ'M5]nZf(PbT~ \(ݟ OɎSX~)#;.S[ mRQ@ LzFDD>>? Z f^xp;ho-!<*#öλB&%˽P$2:ږRשP܎eS>aLjihiu>mRQ@ m;zȼVm+K?sXe*7bjW?L?2&JL{JV4qRȟq}ڤ۱Bږc&7{wHYl̿{Ϗ x _[ξȓDA/:1wVxC:0p=bP?z-kW$_c!t{u>~USZ"E !Ԡs h\E]V9sez ;U8v6cґ?L;W%20W,cHҚՌN(_g0fu¿c2y*Wn 5H1l ]oӛfQ3Hٱc@o[bu#W Fe0_]iDNF%2!10tPwN ZP("H k%ԀnyڕbTsBh2-)} @ M'Os;$@א1\<llؗDq_3Me<<1?nL&v""W$u5ω??}&Ar̸[Gc YzFץ:x!^NzJHL12xmSiӞ[(w:'+n&\|& [pY9 vr %pTKyָ^;ȁ=Q );ƠkM{`R;]d{tn_:ӽ[і&RkH+R RUOpol6=P&RT,!TM%:ڼԇ>6|=6jpMR h TU:R'+W~]yX#'K^fbϧspL< ^8/ρFx2Ri'Aɮ`.ΜM(ȟsLI eӂU^E/ȼ)܎@vͼ|Rej+HMLU !#[YsS#wf)1sarKu2rt$үFǜzؔUgD[OeʨL#*[0rllGO>[ @2g:pg-rA7D;j*Tn zԻq7USXT5sRy.!Df/_ZaRI-Rӕb /o֦?O)R^ h3ယgf|{-'#=SLSxm{w睅yMrngqNN/[`[AZ׾Dp)s'nȃ7#󴿌ޝۤJ!+ v/a%]UZhZ堗Ұ "&h S;n9E$6-אl!4Lhv>/w`\ 6X}t.o{.RV{;*`ދQr5N筱n|1C%?֟G9ޙsGi=2;Ķ%}|j\Z ÷ b6@BrX+wr>u ʵ+c'Ƿ hªT&/ZX>[WH^7xG3\OT'cTsc;kS3P$1ùE\&RPIA̙A J"+KWrա-THh8]Բ 9Oi3if]:mѵ7JXbߌXL`Htαt~ocoxY&| T堗QɌ;o{u*nח ΰ xL&8XK,iB+ErV7f2#5`!ӣ|h BZ1tQ,q"C@fAh:IbE&4mĚas 7`̞ƁCwV%ֵ)Gj |}}9rf~#Sdf[*6|iPb(ِ2{R;⹲{!rB_٪s|q×~K:EȗD~0ELM#y@3wDo|-c9"F^i6zHyUɓ'xeط՟Uvms+]zY>v=;ڕ$jAJ>[&^?y3F/h+^lt[vnH0uboAyβA ,5Aųyo/[jzd \ρW61C11@u®MTqNiSvEI ֈ~`Fe]hb;Ԫ5|^:FvWF{:6ɟsr8~m>ɝ ǃlj3##MWMא`$f)#'J%xb^#"".+(};fֽD2S d=k,qs4EF0=ׯȮ.vj[bNnޘdlۅQ"ē;3?u54R-u|Z5mm^u 5l6}ВŠF5 ׀sֲ7AՋh]YJpޒ [&nhdDZ}j0w%>uG]G7|3w )qNJʙ4o]|ui2uTkEÁzRDqa:h(btV6d܎Ìl@QbbIII*[!ԅG.Z>-QC6>E nJԲ+غ &+L2J| k $?Ԁa@ (;J lyQlC*@ JB߈D@ 2 .Y )/۞ @ PNuTTTIC "]*:uj xVb=j(Ξ=[u%xֲ(z@ Pk@ 9j:%%Eݿ@ "*`mm͋7kCCCR@!e] @ Ct@ 9"IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config6.png0000664000175000017500000007631213203343735022272 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|e4eʦ!e2eNąިSp0(DN&6ML[hW͍. WlB!ߢ8cBY8!>9U?[gw=gX:unRu)UΩųGu j(_˺jUjjK{nVIE됍j>˻z_S$|\uX]˺,_j]:殴VHV WunU>tyl^=qB"SXe5VgZRCϮX&bBJJQv0 VSB!Bvrr: 8;aaB!\~b(PߏB!8(j!B!.77&B!ĿQRRB͎á*:^р_r/ 7h:U%?͎(s<7PF#idS !B 6"ƷNOZkXA1sr6h~e@R_-8\ bE! ɄWl6;vo2b6Ի^r :oGQQͿ] B!f#Ψ㹳 l؎Wl?/u_ ī+baXHD@@F??jbZ"2*S{';GDrݷa4:FM؋,[J#0㜗Wݡ:FsP:Ab̽Nr'ȵso 2"PPU(.`-pt zА 2r\W{O݁^',Lnn+6AAfsС}[TM##3PםսB!QRb>m0fcW_0 h~D@c޼!l6 6.Wl\iQEVfh`Ͽ7  ""@_`a҄1Pظ V}`?yyE66M $،iصW갡i< /w^wBQq Ǐ%_"#/(a=<~7Kh׶5qQnANhko㑃ꎊ Wu:!BgDVqҋJ,Zn_Nf Gq>q0FśٜmïWZz?q !Bl6! P6Y<nObD ĶlNs{agGXFUyáb41tڙ]AA v6YgX W̅itYt؞{/F7+tN!7/ =vueL6(JJJHNNAǒח1$Ǒs<rJ,Sd!BzͲ) =Kұed:8y瞅)o4{QiA?̴պߣ H+@ZnCqqv?rvNѣ),,wGfs`PU N`_j3wPOf5r.ӗ_}ǫK buCN)|6.EN9YP).~۟.gb]iB!4Y3¡:*^p^\d)$"8<EhMDE}߯((tk׋kN>ΗK4_oӉ7lB5ϚVwLnGWc;r:WI p( ^.:/RQިMz"LFKpB9?"B5bS# ɟ/P|M'O#Y[ M|'_W#_y9$ FS54)(얞sTUuMsigyoԭ\RDxp$㼺ܩuJ6{]R, ۤ McJ㋏|5_ݎ|5v:tn׏U 9;\ MsࢡjΫeW[u~[@ -ΠT1n0R, ۤ6Lƀ_q+ }5_W#_y9$*9W|EmRzC"Qިs٠7oͫ+WQqhrGg]R|)mS6nߗ՘|5/Wc;r:WIF՜c%^4t JU МW~A)}V~^={NdވiXJ+SU;*N]R|)hFFz15/IU>k+ȥ|9_Wq5ԔTv͚7G5;yQU,cXrsHKI}'~yݔݤNa*~ |nsp&=Ej]:K꾼寲 vINe)ԫ|qQ1#oh* SKC6o66Pzm}nj9ZЮ]{Lv2jhwܕ+VT9rc磮5v|!.͆fW5ny6{v]O֣*w}"/+í7^k:NǴ!.63qvƏg6*O=IY5e7WթΫȚCuGV5^,sZ^*/WʫG˽MzAq%W]N5|̿3ѤI+ @Bx&N@PP`.W嚙1\<:a48y<-[hԔ27~7Vo_FڴmÕ΢o>Ֆ&5ŢiK^YʚגEdd;ͭ1䌱v6YY|7È#\3v8 _%oUZS'U<'n`# 0ǟ0өK'vQ~3v 7ϻLҵkq b &6#11մߘ76qI[GMyI?*Lq]oֳ虗XJl6!!4mތ&*|7qY,9=ɀIUp XaM5|=^x󝥴Юژسgo:AA?K9Oz5~_~}~͚y+Xv=+?\^cTy!iYLp199zݷ/m[uO#ة3ݻ˖\7zfϿfO~ &.!32:x)bbx왅 P` iF]u9{өҭg7:VU52e4"V/6}ATt$S.QPmmc͜3|(c&%((}Y?w{nl67rsGʡ._Ul6ڷ'!ʺqg^ Ji&mJ]Bk+i*Z 19sYM.;41^_h&{Z˵W\ϻ$>!ciPUZ 40W es\_;w$s:Ù7gW4*bж}[qROPh,~6}Ç2vh+C,% tKTE!$,&qx//]djC.KP5oCǑs\q =t'C gY'u%8wh̍\7<,}O~{G2~rslC gˏ[P5VzCrg'ѤY<=N~w沋 352}e8=2yײK1/x!at$VCi9xm74[6Oތ?ʵa2+hڼ) UsOTL$Q1P߯V1V7⫯B4.vq{ANN 5k2a>44~wthyE-gNGhxQ1Зc[\̜6}2׼cԐ1$y#&w;l*1pu搒⊩Wk@Hh0asmO"#$"*ɏа`b9n}o[;۱g?B6kڞ{h M73b(z IxLN.kJOUIc0`F Inq, o-]zR_V&Gi7Va.ja.׼GҧK?KCC董\8bz )3عcgۗydCk.= y jw 4<[0kQ5~Gdff!=;۶F4M%.!jӃIL`Vg?Lΐ~0Pyr L9rUbknO~L=Usp޹ [M52a$yN$;;Uw굜?f C-Jff+kCEΥVqkofб$ȳǰrmشq3L! &LvN6+ͬW֪s[v P9v,o 6GTLNj :bKgú~]{^ǡZ^eO?tc]G?{opp-( +>zq*K^yl5osipM|esůq&}v!i<0*lj立++g_zZ3=GXy5-vWp0f*)5r[X ?wԣϒ1/;8sf@zLu)wϻ];vcnn{ve[/Κ 8{wͻb Ug_fˏԋO/Ҧ}҇# IDAT׿MU廯`Ըƪ߇~";+a1p-֒ZA^DEGa0*߮}{f3 MO~)9g9YM~F޽\󛇨|h _-g>ōaxwӯw<ߕn9ywJ|K|XMdo`XyŮxĮVWΙʏѾc;F ]{j|e3+>t4AsS+]gueQq1 {kn_c.$84§X2V+O?39\;z6o›Λ.b!%%չOTs.Ƕ?zUnm.?;vPU+_9־} ;?-=ATenxȨ< #FCjJ*2=yµVZy԰dgʈY{Aod4U:l'~vGQhrs"2@Ll a%ıg^'7v=ԏN]k _W_N^݈UVh: FkuL:wD͹HϨte4Un4oٜ3Zd|wJ9#jQի6""2A1凟?^r˱j Om}bڣ /.y)\pE~ a53esxV1W x.UUtr:uIiVܦ&D]2W!ip8gPryn>,$UnU:_??[۶Q_A0q<>`/[8h`)"fb ;kG_@Ll4οUUYv\xTBB1R23ط/+:&qixZmҬ Q2v;-犢:>Q `ĀQ0YӮKEQ08 NqN_Y{_#8?)`e7f  ;nYb2Υ9EFEɐg>=UU轏1z8#F'*&*W]VSq@W28u>׾$IX<ϲG$׾tՍǞ]Ȥ c7U(- [mV"C9~,w2ҎRhszFzL-WЩdgФYB8J/͕MZd45IRS nvQXXȂ{Gfкmk4M cy4?ϻ*sSs<8v ^ᓍ8z JMXGʶyp!7,|-`3f׍,5WC\:!8$?#ɜ5/ 8kjRl[Ϯhʗ%IINuJд Ww\.sZ,ZT\׼ޯgWhOVʖ~9L@aCYf=ǜeKգ(?}.viy\.-5 PfO眑Xj-k>>zFHh0cƏ&)ϯἸy E+ֳs :# q֘O jmz^|W^x^)yeffd凟YfkԔTZl7p~FRo{ai* :~Ty߾c cٲO,@;@qqT\oͼ 60)UWVe4Z[OVJ\U~b(pN +=h3bZ]FC9z(;u#uŸlic6s}4?F+>ŊVBtō"Шڼesf^q9w~'99 6];vҹkgZn͐aCHNN㵫0 L<>(W:\SYYzcM{2x 5oJtl4ڴT޲SSu^fk_oFl%6&5jEdT1n.2UXwXݟY߸<7m[s+PU3ʛhڼ)u" <!Y0C.uկ)q;Vw\>{ܧTN/nW뛗+:&&7U{.6. k7QTvU fBDTD瑓}Ls܇&>!-&ADFE0}%|,zeV GUUοp]pF?#?o 6t:)JMI%6MS˷y'ٻ{wx71Qw~'P%7&.=2k*ɏtBZݹ㞢LGFEz.Ospxy&=W·_}ǜY7Pb2ub-[M6<Гt~kXe+ǎknTDjJ*;EII c'a+o??s0Hh@n^^M1‰<購s#s5fKNݽM6Nz_ެ6|7|w=rCû+ϏXH\^{y))|v~='S4_gˏ?Yl}ڤj*g]B^n7]3߶n董6 USٸ3ƌk+_yub^[ &2e;qUmbTi{={|}=F Qx}dedOhӦ ڵu©0tؐjGӜ1rv_n$z΢_BT#ɼ[$M&5%yw?sQ~+|cXpa(S~SJ\B,6/7EJJ*}Vqx>/տӋƛ6MuǙzj*۵"I<__IgjΏ2:KĤjdf |+Ҏ{Pz2>!fiխST8x swϾKvj*1 Oq#<[HK;OaӜm!-5߶n_q75gEpsggQa&>v\z4gYS1ϯ&ǧU2lZ97|Nd^|v18TOgRSvim6 '<"+kȱ#X|KK?9|2hRSxkrRRR姭d\q}=~Χk7=((,􈿺+mb:TTʗ:PAv/o2պMzeWMY ='2AX S4+n>K̙yҴY_,&3 ^RXPDMߊzd.H_(\q1g'q-xuOCAǐ,[?~EZsWહIhUkߢ{TMmǶ\}l^{q)YY٘f:uM2u%33#h z3ڶbl#<"]>ܻnvhSr~i }230tݭƼ6 ,z9 EEDDEзhՂCޅwQnlX/p[ٶS]l-?v.1KgL0<~hߡ0r*r@5g&W]r-;wc<⣼ˬxmL&{oq-?Yf1r.1US Yp[)/ D]™ye< JlwXf]78}[Qr۹~mc&.gq8?)]~y詗Si bmsxWYp#hqFsFr͍W/fZ'OT{\vsZMEO̝VvYӏG՟]!e[D׎vwyo(K?^4낁 ;A>|-cۼOV|)m2[fNڨ&^LOj& ̽ =N:nGWck;x y5Pu' 9=j\|>#yո霗ӹmJr^7&?yy1C*WPX@xQyyuy>{sxc_R, ŗTWW=7x6v,Wq59/s|nBCIMK%.V#(v¢Kg>gb 4ש7 '&#'U5R, _&\?}oWjls^N*y)(N>Rˇihhۿ./pˇFУәE׼ g3},W$ O%_s!:Ey/&%=#i1= RPעBDžBt:ƒ# 0֝[k(AsB!Sџ05g^!d!Bq3HiBJQJY!BvEntB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!HY!B7AB!tB!p#d!B!;}Kzj_(2!B\jRTTDxxxwCBB96.&MФi\Np>C|˷|k)w`Abbb*̋Os׮;<:}ꃪ|zMLZ$,8Ciiת$"4Vu !B' Otg+KW[rY:h"""HԑyV&,<Æp\!+0s IDATes{zP}zRSR e U 9Zl+y}v̻cg:8ڵodxRŔo:յݜc.g !.I!BOҏkcuUaYZ NbXB!BOּ߬pu|cB!8,B! !BF:B!BB!n,B! !BF:B!BB!n,B!Cc f۰hJt(  z4v8B!tiZLVnG>%ݱVM&P|#/BWHYlvٹg/[uob)YojV2ZvevB!DM,N[vcY)tnݝVױTTMFƓEPY:B!D#iKE# S^CS54@AB!|tiM;NCECSUWA~>. TMkXBQi:Țj}<{橨*d!G'Țq,Xc!NdE _~a>oC_|< MS)SB!*Ov?۰ '_aʶ_1ϭw]Q{4ҫec?xoQQQr+[V !O>7n{ t{ջfffѯWHv]4;v[w7Uw,{vZ5oԋ.lӺ\t8؃}W=65u:W_}5ݻwfzE@@m۶7jŚs,ӧ;>:{6B ! % EH3Hi"r)zJ8<bŎx`a/bEi)dg~wH _OLcgf-_W]=Sܯ] !Ö+snEܦթGzxB>w>ZY+//۽glֿ/Tvvvȼ(77OZ$$&iSv~w?ìrZ,֭[N;M?|yf͚N&LЄ ?Vh+XA!x?ziJwNW~~~gI蓏?={%Iy_թ^}ƌcc9lڷ.r^Wueiܹ%=7nڴiYfIlR}:^4Eߑ[j 믾$}'jz7 IҦ7J:w鬌 KԫZj}e6u;I҆>WS{RlXwxzx|w^|E=h8洴4-iEFEyd=shsg&oH tlc%I+^zYӮB)=RԺMk]6&&ZyVĸfܮNqkчeO,ӦqǪ]vu({k^Tt4iɊQFF4թZ kK/kIUjjYU#Eg ?S"""TNٶ}m_EQFۧ Z($_[ P3ԈGM:^z*((5_>ؾC_|N=TIҶmբ1!OkպWSL%7O.u~n]u]޻ӝ+K] ժM+ǫnݺleee+53 =;/x3SLS&޻SZZzK۴VLef?YIHH>RdɒTJhs(믿֠At7kܸqڧ6w͒scUFI-Z4qS\\B?L$%''_Zf8ǹ4#FEk\W^g^&7S&Mp,Iъ~@lJlJnZ/Bۿ?KQQQȶm-|]:IRTTW, {<VlXٽ< SAA!hsyϞ=:묳4{lM2r4/s ׶?5/0yj;r65zhw1KUXX=K}324m+oje* }=<$d׮]ڼirt\x?3R?g9 n}Feg|vV"iS5tPxRIRddT+ȦOoV|M#8-RV-fܹK|AhssܹJIIĉ $x]hF-tz~z5|gz" ]O-ͳoE)y|uҹm_>mԭgߢ];w)66V=Oa-8M|N~B*̫Txxc233ոIc?>5kX9ty;!!~եq?3}jРԷo_Y&dmjڴi%mժ-[Vb3<#˲~'+22R3f6nοeYVĉ8bȇ#-ԻӻSLLn{}˖-jrɗEEErl蟁Uʟ~y[7o׫W^>|x≐eϟ p?6lUW]wq.R=Z_|V^S~$;Ν;ג%K &‘p>[TQǫI&jҤ,Røaa+4$M4U{Jn}.\}zΓȫ\eee+qGkR(!AYYYzcjƏҕh۶m%رC(11ļE?,qqޜ9s4c 5lذ:5!۶K۾}>͟?_O?tH5jдYS]xfWULL$i&J~nVwuUPPPv#J߷4KүlUrw;|z_D/>EGG+6|wnZ/BcpYr3˯!F(:+1}jذzUb^\\,Yӧ+33ӝb ͚5˽ľ}ԧOk8pO?]b{K.BM4IW]uvzG S[rɿ ǜf) J鑢*?<:3.HZbn-ZHѥnkȐ!6l|IwyA$5lPz-Ik4eeffjЃ>>L$iJMMՄ k.w[;sBE58cٺ4 ]0B}GoS/ǴPbR]yNj:ש: t/nR$M9Msfߪ /8-}j>c 9cyx|u9dTx:St֠պM+u_%I3Rqc3PrnyB?F=ZWXX5kZ5'OOgq}mݺUCU>}n:XB^ziۻԨQ Μ94oz߸TաU /]{v(^^T2j"ovPcc=#}lǮQԸQSg*:2 @"=Z(3kjv8cy؎(yA QyO?T#GTս{w=#zg;(--MÇWn4x`}4i/_]jԨQ[twX='?Ǒ%xG`PAǫI&jҤ,Røaazukw: ^]w tF:t];;ySJ1oQʪo矯8yjժ6m$IzG5sLh pBIŋ5d;V:tٳ裏ʶ+~8_{ӌdV~gOt5Ҍk͛ԩK']2RH6mܬ>}{w^ג'w?򧞖$j&iЙ{O޺b4U!++<֭[W ҬYuV-[LYYY:t$iӦM:餓{衍7J6nXb^jjv}hc;S^lۑm۲lǖ_.\@٧g ScZ믖$:w8%&%*G1L.IZW'QFz?ij9T~}ӧƏwXٳGw$zO@[.92up9*Tκ}vl>,,L[4mK]>!!A2Ivޭ_U]wSԽbpt)bԨQzGoiڵ;wVX+""BYYY򙙙JL'$$'ɝ(c i!W1-V~^y%7֭[^M͓K]/5kT;˫Vf*+</! 9IDATChذaz뭷4j(uA6lP~$I_|:v(Iر6ln/PFthc<*t+JfEzT:՗_k[t\w谡׭zxokQÔbѦMEDD衇RFF֯_w}W)))ɓ'ӗ_~u驧Ҕ)S$I'Nڵk/jͺ[5yCoK^x\dT z)t=h턮z%:ຉIzbRvzEW/B {<GQVhMLL/3gj̙jڴ&NK/T][lQ~Tn]|]f*U'%5WgT82 KJ:%k ;t._UeVھg[ymjuL+5m ۶mo_tlɒ-Y MǒdGnv|?@PNo;nڱ~~C˟80K/w;6P}62z9y9@^ 9uBB?<1 }뫌+ǁMQŃRӃYy Dn߱|57U?l&'.9߷%فVÖͰ|qw-ߔ@<=ڗs]28 ۱eE< ~%M0:#˨ˑl!]>S Mn[U.k;ŷ#9_ica;$U؁dz|Kc;"/-#MYWD-m9uCcd@+,˽pN z}_@,3PǽH.ܾ{`o\X޲,[nH*R,dp@mkے?&XhE7Xj.-A~C+m_Ŗ28n#܌^Unߑѓv= f@_D@ۃ{! 7xm_]vmHH:/Eo,8r&UGVo+ A.JEZ^7sYCYh𵾖 rn˄DHp^dg F@ Ў;u|nuWn1^R++±嵽ebm#[h+ bk0'ؖP||nͪZ mڸY"Թs']},uо7;("sc\gL߭[T1l+ ]G%+v-XD-$xdj^=?3S-5|p>o<twv [o$Kߧ'u׌k?,:?KdG|/qWb_U S]}diѢ4e}ԭȨ(z rRW&۱e;^Urn!h(u歼s}|BB6V(s]uUڳ{u:KGy9zOЃw/޽{u_GY>҃ ʴXTVOmZ 1-;[_4׆xkm#eɶjڵ+\/*B1c4Էtr8ϮdLŢT`O<~}F;G._vإ{vpstƠըQnviĹ9c.],P *IrS{h}۽)O$Gp^ɒQ/B^ۖ~vy:Zm:?OQlQ5lYZ8Gydqj VQڹ}ՠarEH8?¥c.f U|B6EOg>]o,cKJg]sU㦻$I=O;ZnFe*8dI:JnL/RTuQ5tH 6й#cmcoռh%S؎ nRNPXGgݨYJHJMwK;wTzjͻ{fva9+ȇHe6SO/yF̝,5iXu>۽p>4њÚX5oXQnwY%+qqj>z]ua|:﹗/jǵC뼑WxUﭤ pWlmpbQW@Y\5A0k|իpq.rϮZvGrj rW /G-@y a6  ~]U#1ʯ ۶}Pw^J^yBU8+ pX)sc{(Glƕ9?)!I2ù>TJJHzdp@ZLI+&~u稕_C)N*s;QfM}GWdee+.PӤNOm~D,]-շn7#8ڥItl޲@4MjIͪ{ -[TvP0000C$zoeu t [އIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config7.png0000664000175000017500000015350313203343735022271 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxwEӀp9qG9 % TsΘ`PLkEɂYQATD.pyowc^Nꮮ5A  ‘ė_5ʞ :sӛ4.RzʗP>w 5lNU]QiJ0%j/gʨ(FeH-˨{u+b:Xk~UW{@ʯ:iR~@!ږ%aYװWQºHu+0UY5ګ+T4k)[DFQSajA)ՔQqrfMݻAĄTAA#~'sxAAȁ|Z;QE  p$` On=AAᰓ @  oBkN'NT(X,X6AnPuuJ_0 b9$%bw DkMvNIq!  ¡rQ\\ɭ4 DmnW6 **^Aؘz)i&G EEAddlz妠Ёmbvbb"]/J(**ۮmr}DF#s4II@i}w%<*N  %%$ ҙp2A)R X,+ J d45.??!G Y9hY`Jbbau.'M5㺳OGQPX|oKLtD/ګgnA9[H&\x # EcDv:_i޴;3LV+ p8۟ILt40JJJؿ?$"km$&%s7`{6HLHpMEEN"#ˆ*u qLVb#X,\&:`̛9p;g@rR`;(q0Mb`Z 3+[sAA1.R XVc-fYfrth53sIInpyݴ{AA hq:KolٔW-P="z6eW[Zk"//ؘh"#"8{Y ? Z{ [rR-J`xvk[s_!*2M~cԈayDW ]EfƠ淍k(Ӆ֚H3pڙ/NNɄ1p@?R/(#OrA#9kۚDرc'7zu3Glf㯿_#7/'UW[,! BrM.udϷ%p|$0I ]p!G J+""":\:uhGaa];wst9)..&&&+vӹs^_VY݅lVK=DN0/3q8]nztTf)|[# y3.!>n]p;J\psJk@Kw]6\|Ի - pq m0va\ۣ rG^-h.F,[f ?u0Mffӣ[rX=KzvB=,((1duKJ\ ;~0<$-7ђAe1"uĭ7_C.p̠t mYN xsuj䩗KlL?8Y8E3u> ӬXXscm~ aA߀2MG"RtIMCyd2r՘t5P'J4D~OC,V e6M d0m]Y,99HII&9)0PJaYQJϿnow-4M~mp$%ƐStNkZ-4IbB .mڴgInWy Td_=_p6Bxx8nwfg%՝Aecظw0k>g7^NVUdȈp^|y>6ڒ_@JJ?f˯п/|M0Sy@jkۚGiجo?A߀aX#AgB?<%+OKp'G瑥_sU:y^ȳv*(XjbQUHٳ'[o? EEPJ֘yyy<+fSO&-9r,0K ::'aZ/YADry[h Yyqdfeӹc{n:0J_]jGX,yڵ͊mVXGDds_z)ϠQN'vjK/ӧޤ19r$֦_VAA7`Z"AF QQ8pϢul׍<}E^0dZjaau > 22֭P\\tf,g;]N+v{;wnގe(qb1٬DF(qtz0<Ϫk|\d>=WRfL> |%s_zH. bx0b1MEqkEŅlrnu)v{鍚ҩU": ZEp:j?",ؘx"D6,Bd qq[CF_m5җí ¿"$'0's{_4λ\kf6]_HQq!oX˘'sR{ QqXNo/?dHe%YвI+cPJ`` x.>&MFNz|bcwV+hٴa8JV~LӬm)B~KCm 5qotlمF)"RNl}: qj'T8r$-T7 )͈GRk0 IM[6AX-2w]{wӦت3@oّȘZ+_"J4ަPӯ>b`hb@x{BrsBb dm U OyVvn%ÂFc1<{F,*|m\($)6< NINhO[a`н]o0I!7J%. E)+[~r֚8\.'xQPHˑܶPElp(aB!L Tnuf= 3Q׆:W\RD=bg2q1DEB|L<%.0բ . E)+O&ڻÓtm"^hҨG6~B#.GrByF+ @k<ήwnUJylyz7`nd  dzܹuW tץ,dPҥ6~HoԔuAgMRD?*v9 21: \4J{V} u歸Ȱ(  4 Gr9/ԖP_(PzBM?\#$؏O>Bm G]䶅*bB)OH6=+ad"5hBHW6AYm Su%J4ަPϊ/K֏}JHu9r$-T =gP`4=+`xwХ/S6AY(q8˥)F)8u%JT֚V8zBI?VP@BU"cwnIp:lu#={V`E)EVfR5HyGҜv8c wlP Kzo-.Sڳo'v{ |I/P>K%t_^Aw)Qc>d99Q쨗|qQ1W_|5¶B:V-g] Nw+oٲe:5iiutk?B_ӭ[Ro pK(˅Wrݭ >87_}[e{ҏbӆM\8eZHeop78u#eN;X[qccOQXl%J)y{艃R՗^cK$"kQ Xi;EޥYfc*«ọ]vUTo.x͛/EtLt߻"y4uKm~,]ͯڼT}!l8lrsZ4JOL9ZmwѹOH֣߯/oZ?3qKVDjZ*z=?22Ʃq?m*1uEGxƩ"Mu7_nc]lGPgz.Æ2hס]uӼ1]5d4is&oe֭[ǝ͛iӶ >=zxO=w*?3999rep`X{X`!iҫWOx 6m hk뮿ʲ_:ol;]I{KmS[0&Mch\yռh!1X,Rdgg3h@nFg=)gUZguzѼE3~߼w^Ξx=}[IzJ2]=|y 2f͛24?k4u_ve_Vjt|-4t:/ֈ];w[8<>1{ 3q7>|1/7?XH&ݳO=6g^x2 xR%՟OdT/}dxd֣_<#ն"~;w{ ~|׆glWF}C}lh:uH.<b">`)W&!!A`K5QFh<Ĥ${VXŰw׆ZX8Y*<xh0 X4mLܼلϣM۵?.Mnv ^CQd߾8f΄ѧuN^:A}rk_j}4HMyLOߴqu!{ Աttܵk'S8G1`Nw:߯ޟ(Yp|1x{sFߚIi b+8?-Z6>=y?t76Bh;o&&LXX#2y;tnGv85I]vl?M돿Xteilڄ=N-jdB,|+5eh׾=}dF7}q th[nF^w}'?8Jd9w2~O>]EA}+W͜QmY| 7x~Gx#XnDFI&ӄKZF?{؎7?Z Z:`l}vh+bĐ =&t3i }/,`I 3G{k^{dT]mytZ6צts~W{}|-;wҷk݃FsNe2j"{ ⩗ן,qpe3۵?Ɯ&'[upʨ 9FN ;;l^_Y{/Z̩c'q|/-[~ =Y&J/\0"3_]= ^CuX6\c'1&9l?.rq/k[Kzx2{knahޘl6 Ni~U?fB&,x97μ|mlZ10uiX,feɣ/yTPi_;nmr_cuW]_c*K/ҏsCw+ypY5kWy>2˗'Ǟ}}}isx'x'djS)xl IDAT)Uxq ؾJ~|-i21}{>ȶѥlu#=$egiWo|\t.^wTyl;Ͽo|A n؁s||csWЦ}fo_~5ǏfW_~KvVǜȸS{)q:jkQJ1wҁܱ S)V._Q''cfwhkOJ+;G]hݲ Kt~awzF\62Sy5ٳ 6xқ6%=)cǍeU3xvs5=U+7y=l6nXNXX8Vz$'ТQ;V?󜮼>_zmn~G֯[]ӱK'5h*'Ws|3\ng|lL0k.}y[6=zw[ oXvOG5gۋ|tz@Jdc>.05n$|-oF:6njK_ӶC[,^Ƶ̤sN==BM HMmTeE~Qxb͗ =a?qpԬҲUK 5IcOyUep%׍tֹFcג6zKIIf%q)ѥKg͞{غu+G8ڟ0 Pfiڷc7*Y>DFFPFRkG쫜iy:kqTsyŠ4||5"">Dνpr:w^2gbMO~A+~Z3{ucӆ͜zDR$&%eϘ!;3.Zk2grB8KX,zӓnoȨЌEo9a0ϼOVOQ'KS^47mt\N:T#ϭ|,ڴjPWtW޷è'E;fފRU>!2:7]= 󏝪K/#993=yٲ:tjSINIu?ӮC;FΈ1l}Uߦ]rc!g0rH-^g 99)(o^y;va=~QQ/HkCW qرo[To ٻg/qqޟ,ͣ}8m*M(..&;+] /))!';fM6O cWIɉlGqq̺~f/m[ۮg3N:Cpu0~q9j/h9iҧ_/0wu`;m[W]s}≇fƴXkd Y:I YlڰSf-t #**\˧q emOc߾}ϿGFkERr"=zwE1dؠm50g4iژ‚BzIǟeEϿqҩ7ႿˣX4nYӯdjՊtؑ嫖ώIOoֺJٕ+VK/hmۖ7xgg?֚p% kGeSk8=,{[m ƼMr5Ӊ!66IU]6Os.ԏh8A^Zf姼|v\N,{UrN]*t|#O'1)Xƞ<7EƮ N|AtL411)9&2*xWߐa$13>W5.V y;{ NKϫpn++hoL~t;Z,eXeW(ro>R/ԴQFV߀"> E"zV^}Sٞ1ǎfuݼ:Ɲ4|'NbC׮]eY)[4g޽̙,NFW)[p;!@-rX#zNQ#=t@;*#plVDjXe+ȚȈ&{`1aYO\|Ņ(1f83.Iҽ3q-r:l{2p)˷Z8Ӫ^*{ :}+U€_RShҴؠO/de$ywzP^g)pr{nR9-0'0{o.IzcZl_ю&9%)Wǟ;RzD;Bav{nRDDS_Pa- M\l;&iܾ3)؝AZepNqRݸЩ=O<(oMWJN:uyEEMmJݸʕ(oJZսQZ#Ziŋ ^ ÿ2u_]em;x@/IDKzv?,cI5F|j8R}.'҂;J_Pfff}K*%%\p *[n-iӮ (}_cOKϽk`}lmJ+6o7_~K 6ɸ c«ӯox)>Jxnߜǟٿo?oPZ_f#Y:yyUڦ&kܴ1Ϝ>[ a?ٱ}'991;]{tM[XlctmIV~;?mhw Ǯ]Yx_|cN]'?8yϿocriҊ)C^n3/X;X V,xcO͋ _`登y^\֬kn?obpM3XdYTXDDDgJOq=NVG_m+OW>nV.U>a]yy4xBZGHd%''qrHbROWuWQFKXr {c?پ}J+ D=6o>wg?/{s.^v"cwoRi[1'fOXx{2-_UCl*24+=2Q~1ȁa5-u%=*rDx$E @CWDTt$bN}&0;iS9vP?ΚrTqXA(G BiEMy' bpmSXPD sOcmr(g?9ivݝ8N7^TWٺ]xXV^ Hi­DǸ>o+۵65%34]~JZ4LҊrUxq @gಡ)W&kXu}̺ .r.UaozUJͭ2Jƻ]qXour}Mqq1'<}Hf?}Nstl43nˬ ""n겫/Gịiߩ=?Hr_jsyixGY ƞ2F fWeKO?5+?c7mLq. nS׎<2A#99b5HHLʋ<1IɉtՍg_yVm.sءs{*?$Acz2ԱOWuWc3wBm eBLɜǟ%6.+z'l>mL:TFY>[:UXQ1ͦ-%+? j*8\ZMV0 %. E) ZUCVMu/: }<j^WȮ0?Ӯ0d,}~96׺4|߄Ie/ݥ~Nƶ*PiU'EdPҥ6~Á=TR?zn.ϼdPp=\owKYLЋ uNAAQ^ZUP9dPҥ6~?t:)Pps$Hn["6J)LvR_PknuzJ %]PoS(èvboHˑܶPEl^7vpN+ v% s+M޹ByB~KCm %{ԑBHu9r$-T׍W+=FS/j*_j k Um i] %. E)+C#1>7 =^#.GrByH'cO45sr ػw߾# MtTLkC]ٟٕ J %]PoSH'+ȥx'8r$-Tv`p6F~T~''ѳ14nԤe?gS_TAwvSȗO!/@A6bǞuڰnۼ: **E>AbLtd Iia-C{#*2v$AAcch޸V2AAA8lᤧ6eYAA80 H\nWeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl[AAn ۍp0 l66 0z}  B%%ج#9ޑUIDxAMdA]eR*搜Նaȍ^vaZˆ%,, :Zk,' V1ʤѠ8}uiߜ-6(|eۨ*3xlt:QZqv1{Y!D).)&+7;>$uؗWIñÉQzSBn7aDG`Ц1וҪԡT9|>Y1 Eu;4C:@9;8D._6_A/_В6i?6Ȱ(R8qA.sҪ;:z3vѡe/(.`DGDa evGkVMgNk jW_(sSFRg0wX|+ Qxy4N+&֠}:Y!/i{uJ3/V$n[dAv7k7]ZS;eoNFUuDED܄,#cAB+*s-0Іb 0ׁ-P`Bڿ[IhPLJC./riV2~p)Js0R9j>?qAB& ^ajJtdsJ R*j JWhuQ>C9LmxXoP]} h5*@6B1|9yt104_AAQ,CUbA1TK.9Ҵa]ߊVS|9JC ,y8~K_SuZ@1_}NrcON/L#J V+ x8Rv/ؗ|Ii9-.Y+]| 5Pb1hσW}KѡC{.]'W=UPvs@.))u.b ^On\Oo,o%:99eKx@m2}|HpUg)M`!웓CN׻SjW&_UW̬4[B.%%5ImbR?0M)ŕͅoժL_Uorja ڳߨxwIII!!!y]/ 8{WJ)6QS1<5 6=inڅV&Jy3[Bu7 :#o驴-Ky}nOe.ӆ;[xҔ[Wp%C:y~a?n$ttuU8!8{9tlݙ;3`.R֯[p*!S' <:5gq#ywRSLӤ{l!Ъv|x gҙJ.""IgMuUtiҏըN4KѣGy3g$>>TyS{߰Z)yǹky9wd2K)%A& }cװutj%͙Y՟_PSboSii*LS6Mt+oI[EErҕK,},]ܼ^M5=,:9RF[͛;/^_qYy˜r̛2cƍ6Qc5kp7eZzy7Oftޝ#FT[ŰKZ ;>:HN8x~7kxwYR^zE"#"OgS[`}GQH !bCE+'ԓC& `Â~ ' HջC]B IHٙM $9<}dg3!ɼgfeܘq4n܈j(+y s\C.pHiQEgf8p_pQQ⅋y#ޘl5븽lD|8cǎH`#HjޚnzdRcٿ;ЬAMxmI~l޴{%Y+$qƒr5o@9i*#=G$6kӌ_t)'Sܡ ӹC>UU'u4O2X~9k\Kn}Hjޚ4籇 5%ե=}ҠN#pw]傯\>#=IZZG1i۲=;{}zA[sg9d=Kjޚ-vgڹRTҨΐ!C4iRecԨQ$$$еkWy̙Su͘4ר<4Wsw%uB[ƽ2lc9UTZjTV`||* 5EQx{ V\ŖM?Ɣ7<^CV5m=7}~%бͭZhkZyk۴iَMZs/u!X~TO=> [%[6첯 Уs/C9s&Կ"#ȎQLj^dUۤT׺dѰGaUs{MPڶ؏im׼z蟹c?Ynw9|7r[Y<2A.h/rg$ڑ~ZG~X򱯿Mk{Y|*0f?Xkߎ'}E'ӽWw~ܰNVk}+((`ɢS~=ޝ9ukb3Gk?Y8vʕ+|R-_HPPO<r/:# E+xyK10I|+m^K6xṗ\ٹ{:៬~9 "pmn&O':&|7""y9l'F>? 'r1Ι_|ôSqjf+>q$UXz9W-bQx6.g}׵{W~Х[g,Kض5S›ٵ˾_kW?aqkwT&PMq{cƶ߶ڧBy'=ٿ?Z2^'&&o߾RzE]"khR7I.+;wC|_l~ۺ_ ҶgL6+򘗈xϳn/ӦLCǕ6vS-(cm`> @UrW}׽g76md5޳;P'O!**Xby\KbR"5jד~T3+)[x".?!!!>}ګm# tt{Ʌn;vkGiUFˤL:߯Z'sM?aT!b6 -JlEdT$? @W='z\8_ #+-ZR~]ƾ k\Ut@kuE@%ܷZ+a+)-t.K rq%fUT=y/K%/~ϯ+W&;;<233V-}ڵ8y2 Y{K 6ȢoTU%;;³"ϸA?4Qӕ/cTrچyub1gϚCJJ*P㟛<),,D/r\\, ҕKkhh(1b6|(֬c)L|s3iDvZv4M#5qqqbXʺsßg̩ݓ)tP׷˅zQqO1r0^~q4IxX,nn???N"ۼAOK% *Uw*U⮾wb FVRJũZ*g3ܽrlp9"#V{ZJ4lؐ[ҩS'~75j]_ .GXnL*Ez\q珒L 6.+:x9~\;v2Orjծӥl,?v߁GF "??ԔTll\,Ixy=6rZL+U|9,8iGJmw4߀;b6gN1 UUCA "'K:?[Q`8D~~>c;s6' 5%=J>X.^;߽L-dgw>Ο;oz2g+'OdoGiа4Gs!us[5鐟_k槵?ʎ;),,,~`J*q=w2kl8H R$Pv-V\ũSiF|~\eKҿ烃ٳ{oS9~8/j:<'Oi&;C3ylTr/Њ^kdTIJ,ʌsm9x ?&кM++;x9WJ4ƎÏ=D f0gNJSPf5߶3vxtLTt%U"/z}{{~W Yrii฾r?`zdܦp9.&NKgˮ% ZUo[3Lzc?{~+q! Q/ѳko 'mW֬UKڛUв|1~!^K-eCd|^;??_vʤKwx̷fyz9|||HӌnY3cGS:|Ƨᵱ@Fڵz񗄆k7y~GuR #G(ҥ\2s'KY{W46oB!?cٱxJ(>ҭOW݈֯?gҭOWTK,ĕ{|c<>=5x O XݨT»sgQ5l=iݶOԥ)bPiwf 3,=l?Y yʻ 6kܠf$ցKE7Ht6oBQѕV;gOFyC^%TG !llwRGeY!n`>|"/S^CjH n_h-$0MS)TK~Zv8? u._ ,((|*\&'J}t먪U±^!$(ST\ ERWt]C-T W BQAe>RBkLJ@EΕJx#( pC|'Y!(S) KS&$ !B9e!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0)bUh!BXP䃏67/Q?U| #/Krv)g/!5$.+!$<8FVǢXЋʹ˙\a!E(t]7¶ǯ|]EQlv|a=r)G0kL؃i4%6C}szAX5b# Љu$ WP:YYD5c!]-;֗Xi-:6B^ R{J@Wl Ўlj >m}DO_Ǩcsזm9nLtvkLrfMFBiΨupb\nu{6uT(n2 L,S05;C)SV;=uC؎#TK@I@B!*ךiVb5_QTu(c9:hh.hb8}͌gcTVӝwsM~{?t{h]RcHֶQx%(Bi`ki.wpcW1(cko,]cumi_nWw:CE0l7uCXNFz1l'..аrYd!+uQ쉎ˈ1P^TS:J!vm1X sEvZѠ;wl^G%Ӧgy%v! Lzc26#˹gOBQySbjsӅ|]э H%ECr%a::֟"1ȃ V IDATwʢĢLXz Y)NZZ 4رz[׊:z,wu)B!*׶ eJT͊ڦG?J[ӨnڴlǠ'f۶mMUmOUU4T͊U+D"V5+fEU4תZhLrUb ]j_iRUB,N7?iSGz=AB!*>J,< %V CZZ:^w!==b CAA#N 6:*|ٞek$6kEۖ7/^{ج ʙ3c[%hԑ7'Mehߚf:yqe:wBtЅOflGUUf3IӦL7o߶ I"Տ];wyϱcPq7 Y!+<5LGPpuah͛6qhЎ6mzTIνi8|CcU xь1-L b;=|d VkS&LcdZ6IdOcU P+0mҿvn2jDxx(y _3KȺEսjYbcdgg~CBɻ|Bvv6`'w^|||ɡ\233[^};Q5w~FBQyo[V!CӭgWٷg_xQ2=H?c'hll[A!#4 6 ]݃B#ķh^jظXZ':mahZ'sX,6GکS_dqq4hx KW.S}+X!%WB@l֬^ö_qp ciLZ\ ҹm_jЮc[ch|222ܭ:ҎwtGnƍ~ ]-7}R~i3شa3N<88=ioZȪHKKG*?U5>TTY3fsARN{nc}zs1ޝ9Oʞ{jdY!ŕdp9N?+yi2~^uN_O2c,%C4̮iڎI-8qV]{uE4NJC^vX,.\Ȣs8q1'$%/﬋y~{UӘ6-V,UXxoM'ꕯda#RJeƎOک4BBBhӮ/Æ0kƻt؞.ݺ1LROʰCUU+W^:`X"""G&ȀǨCHh( *:Oo޻skL:MFBZ GDY=y~~ԨY'~{MSO]2/<2OQFL&~U4jDAAa!%wӸiC4M4MΟ;OXx}M( o7S?ח:]}1vN[nfǶ]TRMS9avm}Ǥ,Ѳ> ~DN^5VŐN`` ~i z䉧%IWoDdxT+!\{MR~k-MʸWׯ}е}j?r2yPHIVs%!/^$**=GoT*} !ʔv3#ȢS)B!*>K,Ƴnt_rs)B!* p[Ǔ$_ux7=J>s.,١wBar!jhZI2|5 KLhڑB!L|+MyyŶ 'b?LxCDȵ4\A)BJ>T!( EOB!DE:j-1ԮYm{KtL AeԻOvE2IhKrSRwWBqbc$?ɓ'ʻ;"#Hhd?זd!Bk,6:GL!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L|ʻdXU+zywE!&|*モ(%%+<eԻo_B \]ʿ gH8ɹʻ;B!0 '.ձ(br.rl7WGXHx::?]׍k<_GAQ۾_{XϹ:?m9 =S+ la vg{26F l=v^GtCȴ>ttB8te]& NVvQ eX!jDdˎ% kf bкB}ԞRu{d诽@8;C#8#ctBDkc1eimph(?}4qp-0F\Y,r!+|knDG3j[m[LS酢; ;dͣP n~;jO.븄fq<0b~olBkhjup@gu4 XK5ڣF-z_r3Uvt5¶zdS?0/_qmT혣9m6}mI@,d!+|i=fc])l3\U6 *{@89K~]yڗ[;#ΐ묭vF=0oiM%AL5[%4,{VdY!JAv {2jDר5;ke(x r3;\yV4an(eG;n贩YGFȫޘ̺Mkxo/ĤrY,BT|ޔX\t>DWt7G-cD{ss~yŠH6띲((|bz@F:8vզi.h8g^HBQvX.V¤jVT6=QҜFuЦe;=4۶mCլhj{ڮtjVZ!ٷY4+ٿVBcܖhuVWs?RMbcQt!Fw9ܱSޠZl5MyCGnRוd!^b03QqW V0T8Pj/*Qz͗+\ ,??FbVmٞys>(KѹZ࡜9Y>f](IysTF{VIl֊WQLs.4kO]tgvTUe;shX>mtcm;$r]صsW3s۴i׆ZkzKJ}Bϻ SQS:~P^F>?>Yټiݏ hߖ ?GU Yܛy8t`?V_ͨod!빳Gb0e:NeD?4VU-`o&-`.#ЪfKɓbRba6mt6o4jܰض6nf1fhV|&P>;ʺk#GG m6uhC`?yyy?z@?j׹ ]WYl%U##xɇe3Or&sT]rRY^W322ذ~#]lSUlohX(ym&>CNN撙I?ҬA/_Mqsݛd!A!߶4C[Ϯo>&&!ضBFi4l ΑGoѼq$N1Su<4x=$NbXmdϏS !6bi\RWƿ:~WAJ,B+W  z kVaۯ۸{u ]tcb8q1O4RNR-.MW6֯@Z5hױ-1Q|4o>t [iG;ӣO7VFFEuOc}?cŃ`ƴlڰIOKwY̞{4˷_-dUqF}t_ժT*U]ɬ9x )'Sؽk^>9zΜ͉'HMIe1a2l 5 ??|To"AB!*>obq:99={O| ~o_fWyW~̘: vP5.=:kn~ZER q@^]Q5S9x]6 6N?}̉'II9ž=;E"@4M|˾C4/^[Sfzl`؈TRcƓv*ڴkm,˰!̚.:K.2~ ӦũS2lPjծu0X,/Ƹ <21*Juy}\|ڽ+Nt~nn.{ve9q1Iѯ%MFBZ GDY=y~~ԨY'~{MSO]2/<2OQFL&~U4jDAAa!%wӸiC4M4MΟ;OXx}M( o7S?ח:]}1vN[nfǶ]TRMS9avm}Ǥ,Ѳ> ~DN^5VŐN`` ~i z䉧%IWoDdxT+!\{MR~k-MʸWׯ}е}j?r2yPHIVs%!/^$**=GoT*} !ʔv3#ȢS)B!*>K,Ƴnt_rs)B!* p[Ǔ$_ux7=J>s.,١wBar!jhZtej }9Ѵ#%!BV%24 mN,ș,''k?h(Rʕ|CP@0":BDuTZb8]˨wן܋dФ5ߗ LGP-P-,! FI>~'OwwgEFD$~<- B!Xltq %B!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BH@B!DB!&B!0,B!d!B!L$ !Ba"Y!B B!BwD V4B!L,(TEQJlKVy ˨w*p%ΐqsϕwwBaN\t b#cQ, f\ n^"uta׊y(};s9ul`۔s5xhPl?u]w[n۸V/=q<ܝ:Ǒ߉&چd Taa!.drA֍MxLywI!&sdDPzlw>,i كn (0HÊk货aG&5jڶ}]rCq=jf T+;qu>#!A!ԊMoTVJZf*!B "$(݇wU؀Kp`(cp8-F-3;Ŷ {56juه}X5{VAZ4 dl̡>9z AGji}q˺L+( ,ȱBQQՈɖKA4@ubu/h=+_{nqwVSuFEqhG6h5Gf>"m'ƈc19k6 Pta`hZal;5&X&#B IDAT!DEWZ4Tj lg:8B1.u=L: Zgs Ew)A\w ȚG)rv՞]q ͺc!y`l% $ !_ikM4+`/L(:iֱ44pkG [fF1lX9jmȦ~`^npϽ=4 .1Gs$k(mڒ\Y B!DEWZ4TM{ʹBRfQ1ګmױϵUTOpr.1/v;F|!Y[|{a6| |Ǜ!J,t]'#=jZ}{KhXh9BQ:ADe՘(FmQk)Fs%v;6Ptgv ù";h՝;6/FQˎ EwiS<;ߍW&1u@_Iܳ'Y!)P5}ƅop[!u GAEsOm^;eQbQ& m=,'--uq?M4^=i8իu)B!*׶ eJT͊ڦG?J[ӨnڴlǠ'f۶mMUmOUU4T͊U+D"V5+fEU4תZhLrUb ]j_iRUB,N7bнg7~~~̝={1/m]!BTlޕXxAKtF4;Czz:1Ī GJm%W5*uTX/~=we<3Hl֊-3o%_p =:"Y+<3g2K̷ޡKr7%>#oNa*5Z1u4*ʔ)tЅf ܡ ؎~g:˧Mn,߾m@BDv؟v7iԩSBޕXxZ]& #(80pa4M~MhGli=ZȊeW޴l>ơhFe|k&C1^ϝO>2)бu2-$2j~6mw;owV5^J<s̮ iSy>?/.QŶݴq3_}1cGǕ3aRnVm^iDDpBޞ5_@dT$}8 G2aD=9o6c*?_M݌'ӽWw~ܰNV>Ѷe{W_իc%wB!*>obQRIk0t n{Ĵitr]6qƷ˿e_,o^=gG<âҰqC |ٴj_cTle׎X m&e/,Yy凍3C4N9As,[v2j h=>ZXy[h)#NBbunCrŶ|n;% bݚOXX($wJYDDSM$wJq޹___4l@xx8wjо 0uhKL/[Ȩ(=UVegIO`3}4m^KΝx'+=BQy㤹M:oNJ$Ĭ屁`oOtLUb c׋}G/zލ_ Ӧ}+N>#GG m6uhC`?yyy?z@?j׹ ]WYl%U##xɇe3Or&sT]rRY^W322ذ~#]lSUlohX(y444lv[ObCaa!dffR~bv4k6˸7Ҳil7uTb% !w )e2t0zv%//}{17灇%~Ste^\8RNҭg(M5fӆ-TYTfƟ9y 7(wޙ.'`Ȱӓ?v ƶ2OӠaP8}=(ߏp>B|楶%u/گ9ަ/&u<l#~~~: EKtbb)T^J,B+W  z kVaۯ۸{u ]tcb8q1O4RNR-.MW6֯@Z5hױ-1Q|4o>t [iG;ӣO7VFFEuOc}?cŃ`ƴlڰIOKwY̞{4˷_-dUqF}t_ժT*U]ɬ9x )'Sؽk^>9zΜ͉'HMIeE͒EK9a~?tٻʴ &$AXaCaAVa]\EXTURTpe ,EC*HI(9qL&  pFS+<< ^dmbR 2QWX\ho.DvNNDrR }?n -۶oXӞao÷+Vەk93:w Uvkףˍ:5~Ok{@oBtP?gfgߛw=;9<=Ym?T!0Xt%T!=mE+_ed=vISv< aaaعϣGb7е[ OfwaQP)_ƿ? ÁhDFF 9<^:A]>(wPOMl/ 潍S'NI&tV*"kD}DWwܾM7*8&OǙ3GC捡( ^_0sG~t&?1sعmc.W*:]w_5Yyo9;ʼ5amÑ]Ӫ!! L? nh;'/i'SаVDEDUwGq>?W .^{A.ʴmn~V/;XR]ws!:: v yv|e;]~__L*[,$1 1Ҏ ""-uZ怂 `QUt&;Ob|% ǼQUCP@2sNÕQS""""ٙHJ5\PUߟ |i|MCÉ?iG*{JDDDd(W AN a:Ȱ/2 WQ EN""DJ Uu Nl bbc LdCFz:4k_b@$$ B="""@q1qq8 RR+{:Whi_ϊŀLDDDTb_Ӡ2sĈlllllllllllllllllllllll*{TBU7deOlPW~~~Pmsr}ivWs#80ŀ\?gOXF 2eVt&"41U YL1+|.N <,z E#4öϯr )EQc_Z}o6L𱽂b)Z nn+9'yۙLI=UlHf@ yqBLjʞddcϑ Ald, B۝:zsA-^@ B$¢ @ VJ# +SOF&BBHme,q/= !l[OR1Ę8&s5490g% D ʭvZo&7h9]}xksr*T-Q#p^WF;@鶂hCTzF/K)LAX^V ³*V FRx$=T{W!! ar% ƬUUc`u% !*%VnjR@*FWo?k{#ں;$`](V6BYF+|6O_m,*Z_ªK(ҫ:afe8 ƀ\9|QUWk)T^#ãVaھmx:$`kPզ`qida+^yysՓ>Y6^o ]Ff@1 U}R@7֫khEQ)%[X pknE ;~_z;٬*[ i`3z~d<`_߸=fXa#UK*VX UCa@&""J}-*[m =J-QUmx/շUT_πX ~=u,W_+ZP ^ؖ'uMXH)ؚZ!>>pW%ϬLDDTZA6z}𨸚 P^S Y%z (͛'aXX7ىAWZ}EԫF"ǹW_JlߵWs*߸p]OCv<ǀLDDTBjx҅rH7#gDwP|hes9Z,.K{S|b֖'-- 5$]X|y n<2mł+bzD /UAZIfض3}۶m*}ڮB (jc !ܐRпVB%֫]tR[z>c^p =Z(&*גgsi{VX t?>x_c#ñ껕*lQP&e$}|UFVey'|Ly%kvoS_-z@ĈQ8yTǘ;{zuVMڠKb7Lm7oZnj3ͻ(SSRѳk/h =G|l*ޜ$v3Ϝ6\}?h04kov*vN>_ӧNcUd""+AZ,|VM/@"88`oPO==9998r0pcƍ{ѩMgtl XU-ŀ7mvx!8j&<3Ǝ3sga#C^nmvpPlu+!tl 5;o@B{yK/_bba7s,lڰ|6S4iڸm7n؄)/I/NĪ[|2Ro~xӍ~ZL*FcѲEx},u˯(,x-xʔW? z ̜3n5cSNac#w@_ޣ<1n|N8gԙZjeV|QWXR =àGLB K/3ԉ P ˾K?CV- 'ɱO`/Ѹic$eg}Dlߺn-Tly v؍w/}Dl?|h p!l+T!pIKW];aܘg_PPl-˫G\˞^c6mڵA{nnλ@Pㄇ=E戉Aݺס{hڬ)v @ƍ;qq5b_GsNhs_-CTt4?'ԨQ< ۻ\fL_%^Wgo޾ {Ng@Ppbbk .>!Xb|kSOסc8q$9l>ta8o? m6t!!ACѣ DB KWFT$ ""\Pddd`}E^u\/UW?YeXnLUUdggtpY߻ @{ܫ/v???䠰8u7lP܎~-Z~ߏ 7⅗^(| DDDU_>(ǖfӿ7w^L}y:p߃-j,8z,V.>1asu\sm '>;p*ˁH;~hӪȘqh,Yu^;{ղaQW !#F8 V,֮^m[AJ)%ƏErRLԔc !U{}uFn٧$֎E}zL6nѨ߰>>⽢)/Kǹ[,xh0̜7D { ŞݿA/?[U+V!-- G?j_*ƻݪFZj0Λ8RSR{nsތGsDrR2Þݿ?a{ׄIϡsNcd""+AYbq998}:I)Xr'lJaM{V} ߮XoWArR ̘ܽ3T!Ы_Oڱ?].7vFH= WA q`AGB8=}oBrR2Y>Rz{+2sgPWgcҕPcѯ|U`Q'MA4c?s@n]ЫO/tkr9rwyk>Ðۆ#'/U5CB"$$8~ ?vN^.Na&.}"""?^[|~k7F]Y]؃]iZ_wp_~)?($,xΝCttn<×G GDDDSA+ɟF ßF ł+{ť,kd@9 ( 9bADDTDp`Ӳ|| ȫ1oTv~̜perFTlv&G W4T'XAXA!DP@JѴ#=%""" @+ ' .2,YR9#rrrVEC*JQW_5?8C(|IDDTH)1$im{~ALl,ivWsHOGf+X UDZBBDDD(.&@"'DJJreO6Y*X\LCG e-ӿ|lyJ)kbkv&+GR!*2!A <{ 8[cDleOtsdBBp&4!!-ZHz0 )PGTRHRaX z62j`@ m+c-xaWa zy&ܭo/71x襑9P7.'RVH;u -BWt&*"aNvށZf@Eh PhG x^V Ί \sPq c ,3a{[5 z26&{hXc+AXHy>PP]>D3\ W,D7f嘈*SwyB-J šUh[!ZTGFQے$`](V6BYF+|6O_m,*Z_ªK(ҫ:afe8 ƀ|q8""wtkvfw+0m6PnҷIzHM (ګV()6'q}ïvJk\Qa r㤮 )%23[S>䙕3gqq4iڸB 2QVl "Qq5Bf³Jl[mP3X7I+[O°nEl_6W Es3&mg8+=mf }wݏCU.S_ZmU խ^q6_-P}nz[[' !TniwBZ: !팗[ֻU*Pvk_ *VUUЭEFfcg[hSU>_ny=i{S<{=>z(|l纨ƋRSUKj ""*wbY+bPU. -Z1Oe5nE{.Z9k^7ݜWt$d{A{F(mB :x2+V/34*yv>H?.+DDDU r;FZ1n8z@a ǪV"<" @)[AUqҊ]-Khע=:킷zZ5v-p"ԬY5kD511Y&cK#5%nvAƭqXV4%np8hOkh~CK Q?oV~EVmǟ<9.4 H'"e_/^s\d""w$ Fc#C76m܈{tFVuPB,__ y36mG`31n8j!Tsga#C^nmvpPlu+!tl 5;o7WBB{yK/렵Ss.CeO[3¦ o?>-`MKD(+S^)J#+ڃEK7߭BTt>xCLye2Yխ'[-Oab?oߟq%_7}㙿XϱsvRbBQXf9&LÇO ""|=ŢhRj1 ,Y P''@_./ -Z~ /L'>˿D㦍1rؓ8}vWXŖ`׎(pj+wJ׋b͆o1B'NĨAϾ=tܵƍyڲz}U^c6mڵA{nnλ@Pe8၇\Klujaݞ֊G||~r$]FDuuUC?4=s\_oï[~Ť'"&6B6늌 2QBT/^/@b3з{to_C= 3XF (815@,|1nuk⩧@bбK{8qGAnn6:аPطyضe:w툐 !Q"uRŊ+P#* }. b(222߾"s/:b*իBΟC,Ԫ]Lgdd` XW2UU ycxsp|}+v74@zzuV["9)!ghc\&@-lˀLDDT[VFO={1 }k\RGk#5wYظ~3jթ6Z#f 6mO3ԉBQL|9̛fMG`H??ѥMwsl 2OQFJeqy!((8rZ!&=w,wSvweJJ*,:y@#5%}z89PZ5p` +l ""ڊk@pH0"jjbضuy`RBHkX$'%˄HM9REϾ7awQnmt 1x}z@Bkk_W/a /+2W._Oȸ[,xh0̜7D { ŞݿA/?[U+V!-- G??Q]16ۀ?嗭ׂwp;y;r BUJ ?/ȣS&Ūpxv܅FI&DsP@~=knv=[#$^*Oǁ{ p8plz IxgHNJAjqݳȼΝcC3_KWB˾Z^DUVAcG?^4i;I9m6;pF u|K1ݖb!Ġ{ŸGZ*f̞^z_;Ѡa}T^0axL~%Тes|X[xŗq]!@݄|q|VKYAƼ9 D:0G1; mbkX0m:qM77# :PY#;%p_o;F!Cq& #1дyc(Ĝiѻ# ztńz;\6vnۅt4zض !Çc|M.G@V[@2xgrpߛ{Jlsߚ.];Wsrv2 k5ATDt́Jh^5n^&74Y]=؃]iZ_wp_~A!GU"""2y 2uUX\ɶ ""*KYv:ɀLPl ""jdg"80}/y>._5?!34\.=%"""ҝDRኆ _J ???9 S8vDDDDDb r"ȰdBHH>䌊Ȱ/2 _AE5?U382!""GJ Uu{cHX8C+ivWsHOGf+X W B&""%.&@"'DJJreO6Y*X\L'OgZ Qd? E#4õϯr )EQc_Z}o6L𱽂b)Z nn+9'yۙLI=UlHf@2+,,DS84 #b+{JDDDUFFf:فFƢP-:zsAml  -H iE!$&(0RFV[$>[4FuǠ"S$F-{ƶ_"kDyf#Ѧ]q"TUEm/Фioú >r͘=oERzs[س{X8*l ""*J3 aC} ˅Z`Ԙ'вU ZuNzE[Eo3vs^ѵړ}͢pnmc쫥| 2 +V/Gڵ.=Kޜzu[CNdggKߠshѨnp~'99.4 RX6nƝBѦY;lX\WzuԬY5kDhh(]ǝ;{zuVMڠKb7Lm7oZnj3wu߭m'U6x|HGR|u6Զ &Ǜk֢Q&hT ~}~=]xb(nG2l,^N=y_~m\-aWKuz}۱sv$vH 0兗0ʼnX+PWRdL>łdbQ4~yA)V@~A,^g  A /}ϗ~Z?&NƓc_q9IFNؾu;B[ڱB_~ENؼzB-=WBɓ5/ٷ'v¸1 @[WYJZ,)b+Ӑt4i{v[~Ŧ7 *: b{uVuߠ>FT D\\M2e $왳%mG왳p:2#8$5k,yR w!22{tGuCݺסiؽs7۷3PNmk3^ōnpq:22=zވ{}дY d>)k>(d'q/ ٭-[9Nh٬]bޚIq(( w!|+̣Įz긮nYu6 S^x 6lF~~>vKu˯e";;|C0 زҌ5}F^^>ً/OGPP{^ SUG=<׊Gj1BMqfԪS mڵFll#N: g 5(s7 ̚:#G~I$K d@ƍq;)r[3njkW >>~ހ0WX㤦RYY1OcsO~G5UsΣ;E> c_dݛBj1p\f[ Tq0 ""bq!$=bmAR@J aP"9)\&@j1Ԍ*z [:uksN{o ZkG[>Xr &O| 7@LhoX}^b2 ŗ_Ēb玝hԸ4k N[z}v?'#>>}/ uj*?];wiR{,~y RS0klWPPU(,,xJBBv܅HOK—-ªG(r|VJ)ڛ )ӧ3e_-Ǐ~B˶ִgEv$'` w*z];vㇵhI'a5=7T!px:?HÁgгMHNJ; GrR RSc}Eu,l,_EVIDATXr̞6"€ ۴B~1w|(Á`/#/j38q#n~~5w&+܅^z_v-΁Рa}T^0axfL2B\qBL47?l;cV vl߉/'F (({ߌaFwOܥ3! yQؾS&aݽ/al޸YA&""*ܤƼ1rP|EtB?Nz65ƿw,6ޜBEdjWwDDFiBš'Fn7oOM7FDd8^_0oCwc^Td粱s.C;‘CG Çc]|M.G@V[@2xgrpԞ||4nhO{YW}GfշϗVsrv2 k5ATDt;]~ܽ\ͫf<{лK2mU.+/v?j.q|47QE]y1=TU 8գÆaC*ul ""*Y7]ϲIdZPl ""v&;0>IWcWAA9 W .gDeO8Q UuYAXA*A'BpT*)UrD^ȰdBH,rrrV:d*3EQ_~ x2ѵNJ Uu{cHX8C+ivWsHOGf+X T.j! UMDDDb$pA$WtXQh,Q#.&Aegv0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \P@>uADDDDT%; LiH)+b>DDDDDMH/1q,#rr(tXF*cj{r7GrZΞ;<)}P"""" @~aΞ;$4y+A!Hl[:5C|L-DDDDDZ^yHErZuDpPH(w@h ٍ[ס]x!]R~z]P8.0 V%:^DDDDDULDDDDdÀLDDDDdÀLDDDDdÀLDDDDdÀLDDDDdsO ""kKn^. { ;}4ҏ!+;2 CxDG{_d"""*U\sBj?c#(Eӎga^k~5~~^5~F6H?zna W-[/\HԴd"""rr*T-Q#^סU4@鶂z,z c=hI3X)zֿVe>V FRx$Eʴ1$$œ8|k}l&$4YQ*90nʨ8K)`}HⱢ 1؋z5޶؊zLa*³kcHF|f )7"lo`),, /ZJ%PZpn` WSHY%Z20+|J4Ua6àVy|m,!HǪ uiywƸƼ3*u!^àd~N|aEa]`aT+ؘymֵ4NB1"~Zص%~E2~p4ƥyވ2J Uh##w؊Sb-L۷5boBF0qida+^yy'[}_ f6o U3v(zf"Q.2JU@B+yZx=A1Vzj]빝cymR1CdcپbT=ǰIb!%l=F?4z1Ux#m{ bh0BjGl=B]r^CS+U7̬4 BˆJe "wT+7i=fY=mhEy2anDѠk hƺ3gXq4mĬ.KlVi<͘m"KJjP]^VȊ֖<̈́0oރЯQI7T[ۘX7z˸?6=ƍ0PaI筍Pr QEemvO^nc:F- ʰz--l}yf|Z^dAͮ 7#ŜY!b!ݶȦ*GYf7{xr9NѳĶoF"UҪXKk;i׳TZg@.N -{=@j7o~yfxfѸqLo;7}:i9϶TZ[u4@ǧ/ .*""yVT ;Pu3fzc[=?Wj޷U+t:h>!=u+hɫ I tdvZ,}!咷~K*֯ކVKvBR-HI5P\9S=}}*LN@ez@!$)֓[,H*ȷ yX()[4dbXU F;{kWsQZ^ [_OŸZuf"uذ:߈ &Z!$ !Ú%!ˮ흃!p %YHOY+o> qS{̓yӐb1cmʞ YGe&f{ka[ 2t} _$Ѩ \8)s秦h̚]3G'>Bˑwa2'{~$ }@U8i`ai1Zb%7fSi W66cL A>$|b4%fO -pgU[LDDDp=ntsYsh;N'*5/:$I@\Hy5"BhltBC1}2vj[]!YC\yXxQgc \$\AδlHk{˟W_EOOʟ*`T>كLDDD"T3CwdmF#:^鱽v A k,y#J!$$%'yՉ*QёǢjΛ{}d+Cb1 *f{GQt1/.F~ ȒppEHJJOCѠ|ш쳊)DDDP*%͂ee3⡹>;k+W"2*k.$$w#1eL̜mK~n5 z81)s"K7AzF.]l1`CtL u% E9.=h`r$por/=R)9Y\Y`ZT IDATxw`齃t)T`WDE boTT,Qt}OKGffgf In9ܛѽ(iοߗ% 3kתr8eN1h+?@y)C*/Aޮ˒J=Rp¹ʨ(('e?-K|+WHY+2S_vysRb? WEYDiuYV,/e%*;ofqn+(dT.`E FQSb0wZzՊSF)Q1&1fK@G"!!<ttttttttttu8qo$KqgW*ɓ/I>ۂDRE\\ٖCGGGGGGGGG笓@::::::::::g!p\EEUUdY`1JnbQG^y7d3 V<9y&Dc5u!GPP;C0Euttttttt"MAaצSDRcm#3'sY~8_n?=ʆlpRELL) ( B$IfbX0ҊTq8(pq)[21[-DGJa̰^$[_yhm&KR^#uX'_ ]PHÍ[I6`bƳ3-_6`ٰ[ ȒKIm 2, 30q,esa!"i/;|[`ͺ|4{6BQ37TkEtlτ2!}P҇#ݞ(hKz+`O ݮ {8]E$!޲]i*UBtttttttt*$I:(*B[dlwmŗ+7GӸU$Y&u؆WޢlLF OgDEىM̜5KوfTH2v~XY;R 'Brs WTdÛ٣IWX;p؛һ }l8Vrh5:nAlӀ j>y@L}RcJƩ@[滿6+J%I.@T&GO1#S%zD雾雾雾雾U&I2:Uqd!ol>uҚ&[[ND?*;au !6>dbfPPXlFU5jtS:8ߛMxu`vo;H@t1ZGxnԏ+bHFl5L]Ҥ{Yb#y6nܞ$=,hQE#/$XZe˧_$d#c31}rkrE>qhyS b\D\*;>y<*c̷QtttttttttJţxn͡ũ- ,[V9-L͉%_6c4o ق!'svki\߱O|ʷl*aY7S (@t2VHMrɈA+lJ=w QIfQDP]@Fdd,H0</l"\|Oӏ,ߔMX.n )op8Os M=qqζ::::::eRPϦ8xna2\fi-Ϛ::f$IFF"e(@E YGy8\[Vb㈲F_buttttt"c'rr6Gc~"e&:DRB3.ο{vGYhE?@vw=q IK )| SHNdg${g@щh Y/.~INgX:6Bjt5=;=::UhBľ=<#ɄsOR;xTUE,IdHBB*$OZ:1.$+(F %R' :;D#U\kg$ɲE2z۴sMSZ|֌HO&#vnCz߆x^m>z`B I;% )X l4S /'6:U(~XTQQ(҉%>?d!yUGQHBU\P5ߴPVrpN*$㰚$%:j"Uϑ*WUs3d"LŁ}ڡԙE&yq>Ѽ{> QB E*-WA4"؃}uVp `I|뺅TR@<׃s x+*U_EQ /^UPAv:6n|j«\<`n~{Ǟl9sٽg/3";'_H7e̶{ciG y)j$,q:^1&|\7̠FrMj׬C&vp~qq|=0 t9[uρ*3}_GVI9.L={+7K/#卓k^~Ѧi{|irrsw)q _#A·(gހ(*TEAhx G H,wM[9m"''5ӻoOn{7Q_: O{]ln=$IDGGJ꺡l65 ~z$UظRR`Z;B8c Xӧ`ɯK8y( 7d5W0aU~Gٳ>˹_rAv;cݷӥ[9])6O?Ö( kצ{n :eb4b<K-IخJ:Ŵ%=rh5o-#n~Y111eO.xphS-tΈG0\k4fٷw?;!<SIy_ȓcS ȲDJjןǟ]W2{Hz].@meeExe zw~7.ĐCۣ bs+~ɇi&}]$$&s.>x?}3S?L5OIqULy:+(,c<4kє<6Ȍg2|&L{j0a yXjR7:eN3};$kTrsؾmv|3{.o&\5t m[!*vFgY~y]>1}摧nw^o݁$KAe|B}=/G 77a´| 3VW0|֭^G~A>4`A3>*<ʳ}7oAAMNY61>ZnAnN,YϿʞ={y`}e&EOX/D˼yg4ɠSww||</pՎ:b4jƋ.L^}1}W]ueYU۷6b8]NL&N7!1Ƣ`XHMO)WU+ZIչyč}8lG/wyN| 婨¹Rk/ArdzYTO[$[v^V z`E8ݰVKkW" X'a!ia=o֭ۈ]6uh~hKAa!k׬~߅򋱕pS 5JlwjǛ_GȌ3 z/=2oޚo#+8.F2ꁻЩE3?a's>Mjz3SgrpA hߩ=oMzw#+8QQQ\4d0?)3` F7~#L|=~Z|ZiŽcF4=ڋok.Of/>"&۔3Mڱ􆩴jnt+pyg8]~-㢟8yţp7p۝;/? @붭xphjܜ|BfLɡO1xрJFQ 7l&q,V }9TUၻz,L~w*vvZ\s\yP?i|YI#O-כZ{yn7XbL:x+])oѱvݰ~##n?$aZ~8/6nȘGM:|ƳF.}=t/ <ٷSfN]cExP}wr<8Ae<胤ٽW 7O6\f|MȨ=<݃ 8胏fUd>‡?fEh8ݟж} yK/>9NfO?p߃R-3,Ӱq)3Ѣ=Ͼ?cArĬir$(yԨUa7^˕{˛F0=(t(C-5B34t5Tt vۯ*nǿ_e*4}hYcQQQ: ˍ~.o3fx7i -em\.KeMڎv2nc9ЩkG~⡢q[J?׿ɓdW^-SGہ#s|ƌPU~}y}N/m IDAT8z(Wzݻ0/<~ ǎe0?H]~m)9Rv-l6WSoX.ygTRRzPm[J&=CBBC^mwZ4K'׼Of!C^cyrWr۝ߗqP&Cʉ\?&VXEN{/kWcw:^bbSo_/4lb?s<ڴa2bOYIP-FNr灭[qhO<+֫{ƌnʛZPY>dǘsLfhܤO({TX@E"#u޼];,h=O[ݻ( !5h> g\x̛o/@E7Z5W/!R9.{_jjN/9[UUbcchզ%K~Ҭe3l6. ˯й['j>3ƌ{LӬESx|9 Tg_ٗSoGjz*O$$ѥ{gIo5_ERrRkIGtLttPt:{3'=+{4HkA.IB.z·=][ؼe368\?0xi!p<< !i%zR;+P^`:;׵GW&9B;ķc;i(FiJA}z7 ."2jթU O.Xޙ̺4c0hM-NA.3/=nEy4fL ?OFl{#i$$&iѐ6@~=K4E(ohG3RN-oAZTc.\fE9/IR<_&^q<=Y=FbĠ2+j 7^rnݮ/Çacq̘:`9ߘ*k,K Fg$;5L+qwхieH.wv:?q'N@y3Y釟q۝vZ$I:p)gbZ :Ca=oPkoQY tC4h_0{z ;KnN.h;V~Η-e%tv0fQ5׏b+O3ƻrԨY=HMobAePнgҝ?a =_oRSHX,]XPt(Ӽe36kʛ7mJ)Bؿ YY_:uh 2oهR?wа7jn&)ɲ`@%=cC7cbcB{8x7>f#0Lz{:o:WQ"iJjE4%Q|)|ftVR{Cuh6kz?-'i8Jnʧ1[хoTlFx2Ɯ2y<#طu5#{Ƕie^n'NDA9qZd +PG_=NjOOwlр,F7qvB3tnw}WJWup]JߠnU؂/ㆀ#d᎗vЦ}R5+גy8&͛R(_}Gjz*,Ѷc*3ڱMMذn#o SXLyVwǞKE nOy@EZ7GIEW -[,s +C'dfE^/O]V-_źHo_9b!cώ#>!>_WIN}h\\fާ>O}.ń7'_iզ{wse^Ut=>C;.ܮyU5%wߘ]f!5#(P%I%)o(*KE__XGp"$lJ&l޲5(efѬU3]2@3KP }z0)L>/|2|:tiObrb@HpLUkנAFآlܾ˯Rp%ܾw<&UOhQ:=|j! +ZIKC. 6ҽW7Mؿ -KgZYqB:9iߚujޒt}ЧX}5jiz]l%w*vҺ )0oRu6j׫]_>Q>Л<'ΡπޥsJzRSdGLlѲ\SF*qqȲrAgqO\fZk7EQ7mIJر"m;%Ycoa"tb2^D-+oT]F,[wՔX0V}a/s~uE\5l(/tlG v˵A/.጗>!.>t5נ\Ά~ur_:Of͡c4hDtJƌo<֪SFi5JcϞ}xhBjzJ@ixȲLzŖ;oݴ:ҳzeB%(w\[*Ã쿸 P,]gB+ >A-=;C$-Wq ̷_~ǶsoA~{'Mf~j}>o]%C82^U)wy;D;/_|Gvv5k©J/rذn#}.S/36fܩx=eʹ PK^̟/cʄiTҸYcV-_T嫐e2plڵ>%tQylO<F? t1hܤDUUzɇ>慧^fb6icNڥM˯7{qèQ:nIsAד}zf董l\_,'q.b5^sŬZv yG}Hկ䟭IkJ~=ѻ<HԗO~7Thz=f^y0rtw1fLEMػgߛKoʛf4%OQN-!ic}ϞGZT9ƀ;Tt-JSV 2 M_Vlr8e g%$Ӵyf[PN- ⩱xSiڬԮ[oDzo~}@P5~̵jbY%4o՜j A%Q;lcW\s9^;#Go`bs '\<?Tu}{q.bQP׏" 8qsuwo[OĀw>M+L{5#TC^O{!1)2蒁 #2SƿO8 WLP ի_N]b5Sb\Y {I:5=3&J~^Ւ7/:Ąv{~}{'ߠ4t-Fo/~n'Q*Cs!55c q\Чŏ︁#Seӡs{=3)1eT 4ik^!)ZPGT{P^ZLb&3IGiRa7_eW^j x R#zqޟsf%';x _mgGsأ\=Jڴo]yݔ YVѴy1ԮSۓp:A=mZpϘw8}Ҹi#&|?왟rI, 5jנ]>ƿ6LpGvҔ+!!OgAQq價B`Zym+Lz{ />2;q#K4H/= X&jԬAsI}SOywL>ߘDA\\m;m{&Q[[žGg.7_~\v;))أsg u' yWJ:5˴B7NgT^x%$Х}\?sAH%p#yohѐx"..+q(s= a›xn֯K]˝7k$s2sïԮWӯC]l}_d]iW{ d-$1K!DxEH}O*V,X/*oL?o7U%U3҉T=G\U͹HLv]7q]7E*Mt- S/E|Uƈ{o (7rC/ezUwEJ܃U9U,tJFٙ!RrU5Z;#YH-RKL޷| P5C`I6ʸ}7.XzTs,o$}!Bcyo+P,fU(_ǃb%;'3j. ;":;3D#U\kg$ɲE*>}I"  o+qr25L#,$;$.X>Qh{xFr^~.2Qv=m^S醜=~lp^zTs,o$鄮)Dү|z7]:M9JI_:9r많9JnA'sދ( wqttttttekNUx<l"IFHp AebaES=+7E}YGGGGGGGGp:1d6;Ua8NNVJJ$ J\Lz5 ٌ[qtt"!P1EkfWٔ/i}Rx_!ư(2J+ Ԓ4w%mVl7p聲joIpۍ&JzuYGGG Q<>vmhlSd8T5^QԨV9YmѺs^"lAftJ5oo9A!Qy} !ilhE@'B'Cg8+"FsB::::gUr rPlrZ%ὀV-'2dU(>!.h6D_}qRB_ZB!|nZ9m+FB+|d 4|93~P&($9H#4ݙȊ|k)FןȲ=jUoyy\?rJ<._G|EUUTՃ(S"T'UΗƟϗF6U:T՟Ww_Q~_>Y}jQzoB +P%XNAmF F,x1s!'79sp7c`YFG<|F3 촥[ha@U<ǐ(^-G+C+74w !#y5B1<߂"6 o!-E>j ˇ^Vq뮢S玧]m[Λy^$&&벬^_1cG:ttu lpڐdፉ |>??-I ~+YbwXry-)ya"bu7e}v.f$Zb+ % |/4g ⌅9h% dfFIBtd8Dsϵꤳv*dElgXNOϲJS.l{*™e0oμZ7{n7/ eFkn~KjV\Ku*OeAB @U4cYUՃGq*zPT7lBю)- ! ?V-ž=wg( KR%h֢;w@J޾;0cLCA*UƦ^,sAYsS;`p5onRӝ.:S^ڟw9%ݿ?ƍٳԩS)T^(:u9{6tT(JWb*t։.:j5FV($cGc `dd}{*yUCTX>Ce-[׮g899wf?g>ݧzji*[:YҎcQТԥ}H*!!1Ly}.^dt)soM@lǛ(^?\f[:zHHH,M5@N\:d c~Կ/_ԢUsvhdɒXXzljOjCE `˦[+~ץq+SG3+'<,N0I\r ?WnLL ;Ԕ!ÿ&>8PwҹRIU*ܺyݘHhhX;C UKQyfz?ѼYI6"..}ҨQ#΃ꫯx9;w֬YØ1c}6g,HjWC, do ? |JE;{y(m[ᓎ 2>OwY'^z4k4 [K!x}4N%y**tFhqa,֛v l^Z607;7ODDDs.\Js.njVJw6 QLqFҚ[SɫRݸ~?!44yͨWǍ-0} 1kF-:byۆi޸%w-e)<۶l#4xzM}S}rNPƽ^+׀wIUmЏ}?VVl2Sx1 K㦍/s%albw+:5ɓK.adof޼y7odذa 2Wr42oKכ_ݙ&r K c'->e3͢RJ/CB8|0 'Z3~ҏ7[ Ow>ذdW(E.Z45kd_GM>rMP}Kʕs:nݸ%{tW|i 88c'paӝy ֥98:9ҵ{:vj[:DEF1mtoAxx8*0{gJc;;[҂.:- xL"vԪS H? ?~ Z-k`/o!!Abrn0c,OpPq:8FÀ>uAT*U(˷s g+L'\VcA~$?)|g^x 6bkg5vvlX1c~Y)]Oƿ? |Y&#NܸqSf`ee{FW\c⏓(Xݻʋw8vЁ|=T*ekzĄcjfʴѯw6lYjOVE|9u\rh>Ϟ}|x]+ r>Ybutvv ۖ7TBB^Uԟʒf1ԭ^&7Cvo /h1q~ 娺v]ĞkǂנR8t [ntJ8ҹ5NwIi4FS6.o`_9m&tdA@L4>uteTT> H~\%?oΟ֭[aI%ޤgZ+siSUʉ=)122tܾ}HggV۫r%6o™g+@615MVOz{r/*W:pXZz56#ھU< |žtWG/@^0e!@UӧΰqTׯ]g׎]zW׬NZy>ߏwXFjcUqppJڱ W7h$^l۲/^B XZYҨI#]'<{^y}VKy-8vj*hkE ~^.{i*V$vdz(ՓS붭عYmxWx9Q %ju&O24UfR _VXnkR_.Cbŋ鍽z-"M!/B=R8cAGRN`Ϯq4%J|9ph]^fOmCRߏMJ6[4###>#_l°/GPZUQ_'ɵ|u55Eӝm[Sb8Ȅw?Fs R`_k055Ɔ3']nذ;pBvMJM)t9wuyΌGz{Γ/hZzu9M"_|lڰ-ѥ!Y,^$ "RF=!I^ Z_2 O:Ng)ZJ8ͫde~]ռJ땡վΆ!iaXX[Xs7JY;J@XhONݫ[󺺹Rڴo1Ϟ%Kw;ALL [7mı̚;Hijf{E Q:cFIʸ2$&7I~mßѹ[gwj-W3 81ŋWdi,^JLL Utw׿rjJff\!/ޣ[mҽ3+XE}7sbbb1u&4j(=ch )£7 z4oC}i߱yyfG2T*O-q}>nqڒݮ]o SvM euT*{Rӯ7Ԅ5ϽW߬yS&O䉓ع$QȈC2id(_<bߞ})&q4)ݜѣRJz3T-Z4 #'y=KȾrb铧hx-8q$_ "=ʰt2,ZWJhZbU9`ccʰ/`9t0uզlYB`TW}ok{nYl% İex~?S.=VmZaffʝwhܴ$*T,of4/_ΖATd}f )Zc!lllw^wyt+F/8u4EAǂ:~C3zw^.ߺI 0~o#_xENat Dڃ\Ȯ^y +\NERm˲UK$~1JM]:|׺/ALL,G!e(yqvq2q@&MP( -5kLq_ *?f9lݼ"EP7EіRccaa ,Oeӯ7FFF^VbaakiKmfffnۊ?,O6MV_]?JB?.gޜ+^3&S-=OiשI>qOJ022ʕX~^E͚7?Xh 'N{;;[oKeW!a IDAThԬUCWF68r(MN4js̚>=$@~[X4&qŤ%Jhsge#P)Zkf8@2c2'NeĩDFFR|YZ7@f3M`mmMr^|Alhɛ׌6q1_װnu:x[ymUUfwCszvnM(O .!EFF2bDEE붙0yI !q? ЃXi6:&z~EIB!":T[1%_FG bbb͊ allfw3[M I%IV|Ҿ8œ6Y"Eƌ-_F@ 05ы]ɶO^z8vz~Ba`J#"c"o R|hMHe%>!>|Zm<(T156BPy%@BZ8/à @jsSsLxI|)/J9f|8bIHI B|( &ETP$$h151%@BSXe7EHwZMբKp,j5<~ % GM@juֆ !D6Т%N2BB S5B^)S$enf yM-Qdi] !B LQ175UߠP(PYB!9Z AH '_@!" JUjjܤ'>Q1Q<DӇ{B!D.bcaC!{' :Z>:$@NjܸwϒjMB!D.E \،&g Akyg)B!D.ckco_S20EboS "B\ɾ/| `|X!! OH, FM!D,`Tʌ/=[;9!B|p Od[|}5 $׮]˲عs'YVB"H =m:%Kx\R{L)K bi=zDFrJv7E!0(C/ B!DC,@>(^ЯykWѥ}WʻWge~_/Z4Kp yI_~899mP =z* ={PL:uFHH* 6͟?ccc"""2MO\pubnn͛7OOF(\0FFF㓬7ڵk4n333 .KB@Ppt/BfbB!Zmqq1GEEӵcwi$bcb1m}ze͆U(J0GB,\RIȋ2uhK9R{Ϗs]+FHH/^$O<4ǎĄZjǦMt9rNQTL2ErQƌCHHk׎EuVJ%zٹs'y2j(:vxuۛ[0k,]Y+,Y2] !ٛDVH1@>su+fV,Vcgo@R%iլ5wa<}~>Tb=wA*%þ}ٳ'BCCd߾}Ԯ]>#fϞ۷)Y$#_|8p@W8p @'5g~:ŊK4oޜuEz066uܺuRJpB֮]1<`ҤIzrb Bw}R ]\Ya޿s륹pήκݣ VV?woKҡ۷@dᮈK"VVVԪU]vgz쉣##!!{ҬY3 1633K?vX ŋ<~'uuqJ{MFzXf{ߥKJϳgϰFEHH/_|zB.[fks+{|)lŭߎ; R$ҢE vM\\;vaÆ4jԈ[rI011aÆlݺ{qz聳3;v`֭,YRףI`dd :+WP\9zAՉzX]...?^ŋ\zsss!2wӃ[7n,Hk ygYOݶbŋ1r7z/\XXX$,>l.iӆ0&OLpp05k֤Yfl޼5kPzu)K߾}{ŋ[.fff4k֌ 6~zڷoW~FӿɥKxE̙39x Of޽@Dz߹s333T*=Y!POdzKЧg_;o04jE.3\xcG?~ggd7?ښ l2αcTRL>ݻwrt-Bf)d333Z-Co\,\ JHG}ئ37lq)W,G}1~Ùg3mDΔ{&66VѮ];CǎҚҥKJn& ///J,I͚5ucy5kӹsgK6<<7ҤIjժŲe˘;w.UV`ԨQ( ObocmmÇqvvfРA4k֌'#]KNӦM>|87o|B$x"3)oZk^DDgy)":T[gȁitϷmَ_&^CSΞu+O׎ݹu{iR$?쌱1YF\||<5pajjW\+#!!N:QZ5zXƌ+@TZB䔉{/B̐-C,M׎ xOS'1z(Μ>K}IHHmk++fΝaiiəgR,3^ϑCGhШƄy𘡃މEH~͝;/۳qFԩCٶm ܹ֭[k./^ر^9SLɓ'̛7/Y:ubߟm۶/pinܸoƥKt+V@T駟f+ BR<24bŲ= bPTIZ5kiظ!3̤H"]nkŋ4,NjU022b`AܻwE~Hҿ$w}GhԨgĈ4iDˋz`llL֭uJL4'O8ɓ[+WҡCVX1hժ~~~;63v[!x"+d(pήκݣ VV?wsSNd<}9ϛD_NHH~~~zr aaa)Stiyv7E!t!6]fwBA'KO&F&DDdwSBK?4;$@V156yx0!i/;.B h4YZ_% BVc4،x;$B\81vZuI, BPGFRcnf)3Z!"CZ-M| 0 -Z4qiⲻ)B!YT\\x$B~JUjju_YLTL_!/F=!B (hRDm `nܻgrTq& !"y"w.`jlF|Y:dSdaxYjԨAHHH0ddA+;wSgϞ͖Gq ΟkallWJDEEӵcwI;3ҧG_8G1ax-Ys=c:eμY}GDDDf-۴i8}tܹW_}+?~3g'&&.]j G!Odz=ߗaߠhjԨYUXZYrtbO'O/`Ozu(_>i铧qw*W#_WEVsIN<WBxx8'r/YlAςX>jԀf-1gl.^u`naOzTVj5k%S O:է'nݲoJiLӕwc!'Y`A\v4B!0=6)g)W*}jVExB>DFDs-5eɢߖХC7o݁F*^9|cGѦ'(`ωc'IHHpvuNWGzC"##R5훫DxHpp0oxKdd$7nyΝ;ǎ#>>PNMj׭́p!!!ξ+..{#rt>:B!ȶ!fyptDXX=we tg=pus|r襱g=ؾg+ ?׬=Wx1F?V/⅋5p "J+Q~=;P Ӄ[7n,HW+xϲlɛ7/ث$2K" <]y 9:K$Mkaɢ\tK/.7sa7G%2"Ŝ>uK/qHlzj̝=ɓ'5jUGaՊ|ܢ.;cccC}ٷg۷`P{ӨITnddĐ_v;rQ,"kvRcǎ燽}йst屶I&#B|ތ'Bf͛o`_,ZBۖҡyǰ/GЦe;ƏHOZҭGW"##ٻ{{clܰǍ\vhK\\^yIƨiּ.V-Ζ_ gS|Y.swډ)3&s ˗T*(_|F_ A)7cƌ133cڴi"O۶mSNy q 333B!>ol IDAT2b(6EDtxW("#y.Ne{ߟ֭[sdlmmYj&OPPڵcj&NȰaò%BtRr#c"qx &Ʀ È$0!Ύaaa,YD=>.y'!!7rJnݺE޼y?tٚG!N\>G /":(Y5Y!"=N]9Je4@AB4B!"Y&F&DȲB!x7!156Efi= PԘ<<!B2!/6h⳴.u.+j39ff<~$!B"yԂ踌xQ P(QQԘYdu!B|8Z-M| 0 -Z4qiⲻ)B!YT\\xB!(QVQY~%Zda0Q1Q<DӇB~66w#JmvI, "../q:%Q!$B\@.߹9dM Akyg)B!D.ckco_S20EboS "B\ɾ/| `nB!x?'$@T&BcxB"a0** B\;Ȼv«ln޸"];vʜ/t-ݛ)e !"w1jf;zn &&### Sɫ":wBt֔(Y33,k}f\yaaa̞>{,[2jw8:9rfLY#p(@ʕaXwӧΤZfZ9ƱGPߊЗԨR{YȤK"?#n7SB!DYDZORhƎx= `ۖt# Z*kZ N#oP_J*I`Ν;G|{2dGRveV֭]v+S-?fm>x_oAll,-[0>g%b!BmC,,,-Uժꓖ,Z+~itGxiطg4owxW޺?D˦t-GY*ŀ!T{E:F=_t-vIڴhk9Tǜ?I=[6nxiK$ Kwdñ#iݦzO]>iך~̔۷$ þJ붭_];1쫡.F*TB"Q(U`iiAZ5 ս-TTŊ2)]?qwwĄ 0a^xAǎɟ??-['O;v BBaÆYB;wti"""022b…YsB!0lbjj\*U+'{y=|Ą)kfFBBS'NѯwzwcF3ȗhڴl9cǏ& AςPui_T*xk֋5~ܹ}3fňo2(J=N8s,* US%8|<ĩsNNyf׬F޼yRT*Zj%>Cɔ c>cǎ 8mKo8q;\v ;;;] *l2,,,ȗ/޽?Oq!4 -Z|8B!ݛDVHwlddD2}vi-_OoۂPק.CG W%N: ȗUW̚/`bzcM3gOCPPק )ҽg7]9)WEݯ Ϟ*fIM9/#Fԫ_PN- V̞7_nz4):/fm;eѯپuM7n!o޼4n8CetI<}x{. B ѤI0o%@۶miժݻw… yF޽{X[[GTTTiӆǏCZZ]v_|;AA(>E"rrr2?RJ@EE-G~cr e:7hּ)"g= vZTʼn3޹|2 yj)>sܰG 6Y>=}6>?[Ϯ}_OoH$vѣGIHHݝaÆPN##3M]< DU*Evmع}ǎ|k[LLM026&IP=z8?'uz`dlDMlڰ\037+Pnxxx{nΝҥK0.cƌ(**zjJ*Exxxttuui۶-6l`ƍ4i҄ Pr'l DGsRR^|́x?z2l:`7m;E]]'A4m=}=7 88vbmkD"aZnApsZnɨ#ЦcFuV.{nY^}zij!oBhުyˤ2r(\kblbDjsg#ZmYr-joOLt4;kiDQQ^}{3k,*ߊO<DZZ׮]CCC5556mڄ.+K\jU-Z… ˗ၪ*;w,mApK 14ܙs eee qZm]RktRƎF?^=}=455ٵo'3d$''cbjgCOʕ+˔_&ϟ;ч6v6\2`tJлo/WL+Q6N}o'$$oφu y?)?ѳwz7)), <,MMM-Y&Gvp :::YD^|o߲doe߾}(Qgϲk.100wtؑ .0ydU&kժ1114iҤh7PABi2]AAQ *>"@bh7AA'D,EEQAAw"Pd$|-ȪU 4  |O 9tj/YL"Grd21f ֬Y 4  |mYico鈅vԯ݀qǍ73-MJZN?!?&M+˗¹س EEEކE&=s L-](Ëcs ]QAVl],44R5Ӷ}lX,]ĕW8{,Vpqڷꈫ%OԉӴi; oʖ GQ8ۺhLݐJf _CNY8Q. dZ'߻ S+^<!_m[,L8GηTj55i/rrN<͊e+3-WB9ƀA?ܹ}w;MY8ӺoބmvL+}IKKcٔ/_ jԨAPP|~jj*:ubŊѣGs룤ӦMcҤI.MAE|({PnmVj7W̚7ꤥwA|2Cϫ/Nϫי> iȓD:鄆fNEaaH$\;DBz}Jll,_$}SSSy7###BCCH  Err2?N:@EE:u=4t`AroD)ЬySΜ AO]VӹyZ;tjO݈|ahhS QQQRR U\Yg3uLc ܪHBB^LPftqAW],b?й}200{SRE_Fhna_",4,˺Llxbi_B"`mckyJiѺ]vnű)_ D~>yfzzXY[R+bھ[>?&:uu5ACraJiѤYcGGELOnXXXm AA|Ol[cr R)_\pG 6n{0˛ڢFГ 6o]{ta@zwLmF"g-[ 89-[dؑthӉ1#Ѻm+绐ahhgzAf yy.xϹٻ{/uz5x@4l܀;0{jySư 111}\ˣ¥?z1y[f͚ň#PQQiӦ}6_QAz|IY2;s]z>.UmVK#WU\br.^ؑPRRk&d洙L4dLLMlIredo026+6v6\2`tJлo/WL+Q6N}v9.SZ--MtD"AGG;/Gf8q$>h>qqq &dɒ@E&w{{{̙3 dɒ+WWWb(  _/MaĤzO\`XN|f۴ϛWFOG# 7Uv"!)ǡ3QUQCz߃IJJlټH)Eԩ  ߷j-lڰӊ&,X4 NQAV*@0i|>BQ,w }+xB4 EBTUO+ @ME LVY(J%Tԉ '2}qGAoLd{CTZyXGII uE Uyg!OH  |CTJm&)"@ J%4ԵĈ  L&C*M-D,!2R)HS(  9}AA#"@AAY;se..b_|f#]hq%O={0bbb 5׮`_!dk"@AΜ=suVM0~̄6-ރQݹ6,]LH:R~>wϞflTΞ>˻dY=~#HM-Ο 5oUacq |CztɕWsuCҩXɔ86-̥FIttt8q$"Qo1sm[bݦ1(_^L/Q*QrwqA>O"&:~g׎lؼN>ڊ3晎-ɸ|2?OD:o޸Uാ7?k_YXtl S+fN])4AF. gk5VPPPZ --MB߽Q&ؚSF- cNL? H|Q.6fvԫɹ3䝜LBB"?oVXZl0i}Rf=puax";|067w/]!$}`G̜6C]@ͩbWGk'0u4͔ǹ0gy+M(n՜\9Br^2Mp`DGE3z9boHƭ /{i4o7eKLi= zJ.tģF]3W~|3.~1u&n.[:һ{ݽcymGҡkcknO̜ͪ6\ ƙDDDx6Gk'xyg2r)6h#M< /dR=%**%iҴ1 ٳk/o^؈ӨIC Kn0=%11=}=5iQVV 11e7BCCQWWҽ t >>>~:pD+3Gokg[֫W`?DQQr˱`|,'cX"III,Y>=*Wbԫ~n^IțRͅ5V!شq37&*ЩKGꞥr ---l[9}#6@~***x6Oҥ5mòe2}f0336qpFMWvZVVtԃcG㉏m޸0vMW\-?hܴ1ZhҬ|!!,YLyՊ588`|oضy[kȓIMMEIIkWQD V#%% ֣+#F=y w !9rS~ z>ׯ]=+krhhбM'?ze]kT\*X\ z^EEEJ&"<[*JJ1?ťZtuu)UJǏo/_d㺍hjj0|0d2 ʥ+bemyp!7A.dx+PWWGWO7n1@ڒ311}ʶtQ gPPP@]]2ͥe떼 yǮX444PV.҇ Y$DB ygBA2*U-Z5gǶ4ߔѵG*PPʡUJ*U}NyV4l܀ҤyuS'߻ODDUʗOKK#55455OII:r=iSyW%gMҭ3:o{wiJ[=\nݼ @Zni88s ?Zͅ%Krl[7oafa֚Rڥy6勗,ǵ*1?zL6-]-t2.H-Z\xggTy11}_jqb<| yo]{һtl)˼W/_e :>|wv~ƌ'F?{[{ILJ$*2_w]GOp$ ;nœ'ɃPS'Os58tZX`1ظn#N;ye XfJfϞ>gH$lu+vv̝U3Çf-eZӨmV`M89;r%zuú5E,WCUU_󮧯or֭Y̙?[EQJS"+>.ѭGW~6 LLMXrI2ai& ?ׯpTTQM"t?gJJ$&&fJj8vvױ2`6Pr%TTTS׃ACfZ;98&ʉDg) ||PZ4~uk˗)>X"N;9q$=JJJ| C^7.(f;4al\@UE[G[/ޥ'ζ.uޑQ;{[-̳'4,4ձ0bهϞgY|XXвI+;wܞ?]%6Xn'8 ޽ݹ],LխEq(%(Q{Njrcef'E}dd˦p--V*3~49/@UM*fHrZG-ʔ){ٷ7:tj/oM~Azwiiho@_Evn%/061Tj[;[Ir8F|mlp͒g>CcP724y9~7aauHTdvv4)]us s*Uʔ-ϞGZz yK015ACC#~xM)Y$zzzH$.ȯoF݃^<eݒ%Kf_^җŭ}|I*h ȸ=b nަm;֍[l\w<ϸjj5ӥCeY^"m#kVe]8~S'Otկ⇼2Oww7|?|\&AݕKW cxM-HٱF"g-[ 89-[DQ1{w˦m(*JPWWc˦mDEFѻo,~'Naec,-*uf50(co0559I$:uʀhӾ|޿I7'ٟZ4e,Zի巽./^ >.]]] D=MmQWW#IM7EO_}z}`A+WWXn--MXz=ZRJ89;ٰ>?OLTTzlXHB| ʰp"6n@\l `Z}e3buN3d ;4k"FFضˡk1oՁӹk'44JGI 5&h/MYY1gڥptvԉ?z\ޢ+QаqCV\V)-LMM{^D^ّuj&+*>=68:9Pݍ?Om[,-D*MQnҗŭPFxaӤYTUU?2Znߺ+װ&<4ߦN];-[Xt%zqʟ>tؘXtti۾ Zf9K/eq())adC]]{w3ˇgNi\\ʶ1H Ϭy 68Ӽ}z&#p&`bj|?7/_f̩L >摘!?Xl%GRS-[kW#}$h< e <~Ц}kxtDFFUJZF}-MRR*h=s[<'`f^4115S) ·]I-6&ggJjh uymUAAA(҂UJUVGւ  /ٰv##~3oBXZA+9fz;iN"GrБLc ]9ՇAOٸ>Ąb*ٷ'55t :}GҤٿDk1)[:izLL ՜\2qj;ԇoې?)z9mmm*V2—Q,],£yEU5R r JPJ( mז.5r:pK9g|ʀUX\E"QFuv^-BHIM!"*ajXƮ-/%5K6$)1PH2/5]U,hߪ#.\OJJԊ&Əޣpuƙ.!Jl0_w i?ˬ XEuhְ9Uh2 N?OL5'W92xP^z-_ჇGgUeynG gϮ[̯_a@F6_CNY8Q. dc&ХCLi5Cr~sޝwܾ+vTus'4l3N t;}4{KGlhְ98c>YY8<3sljVu̎ٽ#aajŋ/&'`cf;Gv>ʉ73,ꕫ5d)$&&%p+#e'$$QУww4kBlLL[ Q9xQVVt+g:ɩ>mk+aD. Y JiѤY!!,Y,2?UG'jVЩ}"JtwS^.U۾\r K+KkpIy| 8㑝CM044͕'A9Drr2WaɁNrБLouu!ժWȡ#XXӢu;uئwoũSûPQQa}J.]ۖW:߾u#d<usw~-O- `eW(Y9YR$VMΟР'.cquTUUM+:W=X" ѱs϶Z:j/DCބ2`e6*"@B-IQQ1p6qqq Ċ˳}B+[sf%111K w *W.qKܱM,^|%#2/oݡK4j0Skvn-՗4t ynޢ]f-7̔r=}_~#K^xɂy~\'q񨪩iK.NXZYаqJMֽKqml߲/^QdI≉AL<88v8x;R劄m C&3=s}ˤӨPʕ[~hѪ9;qЎ=P N'?nLHZni88sC7sR٬~= zJTdukk`^HQQXW>T*Fjj*111hjjfY*ﻼҗ(/d(3M&l۱c1ر^}ze) RfA"%%L}n!KBQrCRB)!1)J\@@E%uj@4442+cXPϳ.ӸXz=6<7ʀUԮS+ʠDRb9id2BCC9-;_cݚBJJ.[\|tЍn=I;S'McOcqUD"_׳a}Mα?chXiԸaz~8+3UUR)i4y>~@T&+(/T"ޥfY6or֭Y̙?-(/%}W殥G+|>G[̫d-c%HSQQԄe+dW}~R?erbr"^?!}(ҴCQ>&*/elbW\-Pnvu0z:W\Ge 970Ёè&Tnwyuٿ ##6zXڢ~ }k.c[mЪi-3)W%89^rU]PGa~fY3} #@VTHC~v؅:űk.z!|}A?sR 9}G1onvхݽ/^o@pp0:Dl݂lgg 2q*[G'j1i y%QHi@eͪۡh֨.)>5v$tbqnۊ'A.{nФY0vhӮ5*ʄQQizM4m[Jdd[6؈vR|9ttt~\2gx OYZwoC]]UUUllٰv#lZd2Iҽ ;@EEEKʧx|,CX`1jtw#55gӿg\BXX8F?Wom%̋# DEEdžu$'0x 4166bh"6&J+Oӻo/6 DWW[{[n߼MTTtVG% }fŲbooÇx!>n4o E̜>^$%%C&<,M79%JŒUKQRRE<{5=ee )_JU ..>Kד܎ǧr1pl۲9";= feKU&}U~ɯy~>̞ϼ󉏏ў[/a҄we yoFN4 Ɗ%J Q?:y#CQQQ!p&VƬ"˝N];-[Xt%6̛ˌ3INNư!#< rw k-%&%гEs~S^'  ʡ*%H,7^7b?._T*5@?fٺss խ4x)cǎM6lذ;wBvӧWf߾}\~kk\}Kr쾿cc*MBR|֙PL:鄙Yf %!!L5vz~=:DO_?חǡ3QUQ|M MRRQTP`=ؙ9bgȞ{PTP Y&/߽;:JK>跃c~h۲=Wk2ѩmg:Vܞ-sL5||pmuO C^KRƏ &L4;ׯ]ޯXN;ۺ`]ٖs.Ə@ͪY8УK/?6x~TNƍLj#hذ!C\rE>-[ 6РA/_ydd!S!>d2BAf8ۜ;{#QVVƣm೻X$%%$%'\_&ϒQ4oݜe ط'C4һ_/<z fNŅs1#8v̧+6v/ӿ7:::HXl%c(++H֝PUUe̩o~+7% @QQk[mY?0ÿG<}|m3i4oٌ3"29̚>ky *^A?o2+WpzgT3g):VYYzqlo[ʠ(A݋B>R@9^ % ߂_ T)-llش=_=_r4>RiJd@j?SYk)Vsj5޹gڣ 5j۞8{<@nܴ|ҥuhմ Ϟ>œ-[y򖣧P|9v^оg(8F @BJH BGTP{ (*6H t Nv?vR33o{'gL #+ "y+Ua떭4lPM\~uΚ.}n?NmKnٲmۢ鈊?Tݼy, ۛ7of۞Ҧ嶛z4Hhd <ɏk@PP|6A < D̐A9|Jju΅ )y RRw )5eD}r%)%m#e7IȮԨQ5jOtt4aÆq qqqؠ,ͷ Q_[&B xXx9/m#yg7/)Ncy4nmu+(/v͞Ozu{vAxܽwĤD3ҹ. &r]3ILJ;W6g˟膴j݊ YXK/r=כ&;`ט"E2% %Otn%7M*AA\z 'gLV WPbŊرC}`ΝDFFfYڦa}.dȒ>B)/KB [/:5^sgTད`c/ۙ;k)lݲapBA_>ӹaI4n'Eկ!\jYp)׮~~Nlߺ˗.'Oq|kiՙ[[ȥ,oǟyRuq5*7oBFFp3&WcҸNS\=\2g떭9}6[1o `玝G믾a)ݽ;vr<V˗.g9|06nIϟ{CGVZ)}~&?xge4gVr1/YaTSNӻlڸᛍ8~"MYؼy3vbʕٓ2ePixСҫW/vE=gȐ!jSedYF2g#gY2fX_YSY2ھ&S-|NHČ3Vw*>woޠUL<.>>Tjݣ/^z*? CcmySSR6i: ,$-YL뇖/]AThB-]Ϳ,k^i5~K_Fk(֞eӼ^K狡#HOĘx!nnd̜:~)Q%Kd/y'NCy˹Jj>Oۚ9))3gΰb ݻG%h֬&LPi&F ￧jժjSe$0`RS8;;y2h4bDe:G>$*:5Kn^a1uzuɬ]elrz'L=HJJ b͡3s.^\_[36|(!B9moٛ-B7 71g\6o̮; ڔBG~%ONKkiIRj"wδ kP7qWCMJ/RYl"(t|z-?[͍7)_1iF&==pgOʹӞ#:syfDԊrE܋ӣWwz}KcǓ^4xvxU=&Ğ]{IMMӓ*U1޹r%J)͛=>x1o~R+/>6r(_e͗MG}shG/YHKKׇ~۱طg&^#S>~.>k,S?>ce?`B]fXhڼ)wL8cD>7Z^׬[% a4nmIȒ:=_%@ڽZ&6gL-ؾ{1y۷ f:~ }o(Z4}TK̎*_y?ݽKz#k3fGT4 3a˭Qc9kٔ71>q:O[׭͢e Ӓ;qRSR qR^U>ׯ]'55%ԥ#SsIIIZ+[""j]0]:ejrS!yjѹK'';FY8''' {\|޹K"2a'{h֨ 0nX4lF̘3][ai}m<.<y$))oJ!88s֬BM_gǶ_j3%11/V}oI kAFW5/ܚ;v;wxȒ=a,AAv:&}yO/>7ߎ㱟I͘9m'OΔ(^/]xq}8z/˂0 n'0iD]9u& dѱsM<)$'%ӧʔ-͞]{དڨA9iɱf܄n͗ ƮRҳd|Bxj-WV=Q/"I̚>wy?ȉ ct%s5fC ti_X&"kuZ> :[=&6۳3[roFqLBB~k>322غe7oܤi&ܼGX;X-W1>?[ dSs_ȣG~yO6P4De@))zN.ouOp6*uT Q y"..+/Mk-WF^ j5dݼ\ͥ5J)mT6נ. 1?W+g"'3%ٕ1͛d-²NkdOٰd/h޲<űY2"ԣ4/p2>d\ÇoXx9n՞Sy/~u~-WWWRSrw3$%&l:`ٻ u6t҉W;o=55 rݿg;3nKbf)V:ukh|ixxxxY(r3yBnϯ\nβ"7c6蝁̘:?N]:9fo2%}Q1:ϝVZY\ʔ);wէNSeO { 74mޔ`Bq}nO;N 48;cy4oy I؉O S6ȸ3bp"6 55es;эo`_ oj׭͎=F>[ϩPYygg'HJz4"w<گd良K=١It:ZmHFaG\̥)]uU39YVfzݓ&v͗1WqrrUsڧN&sIIqpԏ{{\wrr3%JDWƣG!( K;p[|v*J\!;;;@$wY!oj:{\(YiR=VA~R޿fdY摉8ֽ+kWcPQzYy1ҡ qqq˴nӚ%~+V%Jp5RS(Qjrⷜs>}2w|%V?~,w|xj4ϸOHܿN'1y?8xG8ZKS݋WW^ԝD*TfɎ>xؑ?wl 4*z 쌍 Q9يe)Ŭ4rܾ[R\9b8TNZ0fX\ɏU= >hX=bi>7UpY.ZFaoc?!R0!B1ee˕ -Z߅@<4 vlq,̶߾tbdYF q,(M$If_p"1c45k³m?Zi耗'K7&M,Y0|(WȨHJzeV(Q_kG^oZi >wRD?.O;`9̜6ϖ(QɳX]6~Π1ddd̪/VRAݧfnҒ3ȏ۫^\ > |嫘<}Rs6xh 7o!# :NdTdcŽm2Χ:J)؏ǨfU)9ӐfΝK$$$NhX(s]=hhO1\)/39)dR=zvbotLrr2SVsͷPk<@ xf<ͼ:[m Ϛ< XCڋ_nL2mc΃,gó;okk˰C9|/kc# IDATSiǔ;0!dź5_[ڗ%˓Ȇ xgX| @  @ @`@ᛍlڸׯ]gIY-%@shb/'^nݎOelݲ5F=W._a5>-IOv:pj۳O"z߻|?)O{AylrR)Μ>7_}o{\ #@  O2Z;Ctyy&>.=p%FIٻ{ǎ/@3ml{*u*8D @ 2{6?G@7e+Uf!AU!<@yu;UNӨ|a$>9Rz]=7uTiuчFS%0p|/\2Ν; .\*5f@AY9* fvw>TTZj3b$%gQڽsڴ'4fݚ/mkiݒAai?%$dRmDxtl߉kWi ::IxD֢ͮٵ'OвuK;@ZZZ:p_Hhp5k߽MS/[!"ᕫpLudg[vs_Ru2/~E^#,$:Q,_Bt~ uFZL?)mĆ7oݒOT~_ 祋QF=3hѸa!T mرWz9|5jLm]t{Z4ט'͐Ah՜jSz]?h>]E{waFT ǹOskOvCmxopÇTPmlW}ŗT #5%6˭۩}Th~(SԿ AdCٳk/7[[^z%D&M33d@laC큵:}=ߤY&ܾYx~QZZ'''OgI6oMܒ?-y_kG*| ӧ̠hѢ; #0@ӋǍc'x'xzyҼeLm]IOo>Tg=  Mo,YQ-;cǑ$S'OѢUs~$k̹qmfϟ-cyZ-<@NIM̥? #(S +T̛='QH|_  ; FDEGEx镗8qGaOQrnnnthבR)jaUT@LUʱn͗ų}V|Kpr```&к x{{S~].__y%D7#شqS?̙9.PfMOnU :V._E{2gaٵG-1͛Pnm}/]4AfǼ}zi dּh44B0} zR^(Oh%UVVԪ]?'{vU?_gT ^ooo7GHvƎo޲WAbggcDZϵ}([:իѠVCv_8v8+>_FdT$Mgׯ f@8.Z~jDhg35@Š4ijԯژ4;{rs?DFEzsr~8t0E#j=[{W7Wl؀mjD! ns^J q(; (Uܛ'pRddd0eTkLH@eFERRuX@t_XW AAQnm._V3jWkn^U}*~?;AUqT@+ӧϰ{njЪW._D7ov~\pׯ_'%%ujeiSnp;Y|:wAdNt0IҧSٵ7[ 1,_cFq8~pV͔ЁRJ,5۞ яx;~֥֭8.g{BC8׮^9f ʊ"EdO>b:po@qvvIle~Ƌm[y ߹w:Ur,w^6=u|S&P36c۽^we&OG)V-Z5g؈a7'`݌CQߏ Yjw+G>zp@us>|H"tV?̍7)[,>u޹r%J)͛=q]@WsΏЁ]00cFgG㉏'rGhҋyj[]A}cӟG,WZ[[[fMK sb@L?t>hz{\\|2۴6[z;b2qŊ%F8wA777]vj֪'F eI888Ш>2!ZnpŲ ى J({ʱr*܋H 888Pzվ>u佡#x\t3е{s5~ٖ̙19OTEn;v-Z`ڤ1jaYQތ=bzDuZЂ1O*2t҉Wѻ6^y&QF /?o^8;;ccc=gӸOss?D7ɉ1~8@.chZϞM}\r,3xh @i%*nk=@gH0;A];u|KrU2EYd9 #{@j׭Ͷ_3o ꋕkPW-3wfNgWr}J(AW'KW.fL1b,Y2J{__~2y?Qί׵Z֒,Y0|(WȨL͞o"I2k>QߏѴh=ffgϮUمbŊxb}%..x"Df7)))>VG20u>}{ë>I`P [l3)UB̚1~oǣ=zu'陒mŝ;w1$ӠaO. Yh)-^h_9lmmڣ+&ML,뵷g3z,Ç,xzy>vƋsgx>l5 y݋5L2 &#};1ܼq/z2} 9zK|[5sEЪ+*Vs4m^,f$%|*iU:)̎zwl}qA<<[ayܲ{;F <-RғٲAvtt&%-ߥfrJTIj$&&ZMg5--93sNP;@+Y-W+}O>CRbY|NGPpց@PIJJ⛯%R.Μ=}5 ڴ熱R~Z{q+qh<XPɳ@F5*4[!6*'9D:UOb0 \p1òmс~8O{%@ <+޹?na=cSSԥ66nClf#'uVfߞlݲ3rtoӏK/3 {zjn'CRb2:܋@ o@/¥f:uNddd0q$o c 3,vHNNQhZծƍ7u@ <B F$I_prvV˟j?OW[['O B (7~it wwwzwM7s!6|OU+o~nʙg9s9 .^f`Ale;g$NSZ֭ @  Yh)-^h_9~Sf2aD=z7C{'u?r3z<͕@s΢5#Xb1 -`Qί,Qj @ xֈ@ yL!@  B @ &,@   BKJZ IH{VЦ'')@P, %))ܾwߊst^e4J_Qdl46GA&SyxV-+azZk ,R5:41)1ev}L˩-xܗd?Yd@PY J?Gy򸻹#I:(Lde"W^Sk^$W$46zAs$٤d$}Y(%Y2bl6$YV7hh4굖笉i۲22HVY6Р2nB BPkQu'84 1elrf"D5fk3SrΤ.3 Xգk;1C5P2ׯ\Xe"eY&d|0ѬW6y/:c#V7邻[1.^O@PY J$IY{+(d? Fl(^M*轠b3j5 ˲l hSLU@ndkToڎ.32,:zxU1:&gUhRWL@ (D, %$@],arr_Sj jYmp%&JD[ ~s5"0K"fgӎ0ڤڲuW-B(L<粡AB,H~%YFh`Rq,QmWCzMe(Ȋj7tB@!AD$t~juY^e\ a7ff/Iܭ( 0`=mNkR^Y NY JQf9ֹ;ǎVQṉJe*7bcf/V}%<,=͖ [zs6Vrmʛ{=۷oFrill ZIkQk˅x!A,€ G~8F>[\-dȝL :($ Vk.WeX2A` 09"="F3g0ȼ% XӏNւI Zu"jZtYQ<.jd@QFIDATPX!P@h%:IG@jԊF|˔ "pvsD>5zԋd@^E+Ih%?6-_Z4ŢKD[7{SbU*Uo$Ce9):օjjPz=&2Ec/hѸh%~': )Ӣ UNj%n݁Vҗ9s/:ޅ XZu>}=VCӑղl G6FJG>o`xމFDXmWI׻Q*ʫURTT ݻRBU 0C΄Wqd3] a,%MIf/RJMBӶl۶C=2J@ FY Jx՜ _KLBM3sg/}6:1$%&$iz|a-[.ìsgѵC75bڜ)888=bگ:i:oEطg  p1Jy1j~ 2-;dܼydı⅋̛)E1bp@fK yo0v5~W)/x.Q(FdNmM_bckF2:O^iֲ)}͕+p"R:b;NR^i|F y-;Dα@ F@Ń@6ӧNؑ۸ >>;ܹ H::jS%zN }ovΔO.B͙jΧsҡs^d]n޸ɬsU`7.Kͺ5ZQؽs7 :CjիM)o/jԮ?_eǶ;r=Nڽ*aUسk/~AnXkܹu+4닲3_ <:IoTh4ԏ,̛9ovЗԬ[KoGh}_vݫd9wƒ, +B B,3&d>"5cbcٳgУSL߸~"i,aߥy5[#KfuZr)^j|Dԯiv}zٻkI,2<)V(nBuZ| w$-\TΘYv22܈Eu:y (YٮNg,kgoUpuu5+ L5Ooxk^*n$:-qp7,v3/,dsqN_lô#3LtZ L-Vݽ:~(1sXkiG)b! /B BI ,ۂ L<pujnC0#XKYDߘ޸9p=:-PGC'iB,ʔ++G~T]#(WN.zeC>c6djl!3Ƨ۷.\pW; ޹۷oSdq.ܻw%,ۭT9yQlll 3QxA!Ed@P(Q6c و 5[VVݚL8[T"IZ5%>.$I9}ggL|z=nn$'%G@Ev{xh^hG'G&ҬUSzŧ^aU8{wg쉪J^bfY=&K)#[ҭWW/\#Drj,u_aow]zA ^/P1"666,[{-/6n޼ݵcG~L6-,tu~%IR}1d>!AaEd@P("=WբSDzd2\P-^hFܹ} _m Z,vTg h$ 31Jz`л)PάUCl6 f-bRNMZDjvt:6ϗL|4a qv˲AM_;th4ХG'mټG6߈xh4\\Xf!IxDrei]O 9b_)]4kgj70"Mfق-VoFϾsSL7Y V4m^,f$%=@Q)JaÔOӴ~6G HIOfprtd@P8$Co&(l[ @ (, % :4Y^dLע$^(QEπ{4e6 JQ8k lPP+YcFe*L6ߤ}U$+BX% 3mن[1.\;X{p +"I:գ̖bP*ƕ^FF2wk ! N^U[LOR0W"+Yqq.%C2Oe X , _d IlFS Qʲ G Lܪ啘ZcySgիl,+-e}J>Lc8faŶVHX%$N?TjȈRhLV"k4 F.%vWgҦ} -O4h|N TV2 XXjUw Y cU؛,BTk45 Z#ZԱY A"I:I41P ۫Q}U0b ]5/g-rU!#FұS֫k0Ax0 7نXH*@WYVb X*=H|%AY%[ GAf"Y ut<&fSF>l-5V˩!FLqДl*ޙWUqa ! ! !$RD"J#.R VBUVQFM8" la)($a1a {X93s~罿L1AJzW+?'q;$_ YbhVf=V,cRh"l﮵J9u2{~`[뺚A1_!`{966fCvۺB? ~aG  aFrR0(.9n:?ALl _O>N.H8*2ǃ[4|;e D:JÂ2B!e*lux8 X8g=1v!1_/a)8^@Ll 7v#*G|<8.0ƚÞ!o>*M28m }-lQk(/cm|_!c}헑Z"AA3BJ$;XB4gK9r(:u(M: .⼊GWkŲ},瑮 AX.P>m_9xsó70*B<9r!PN]_RXPȪԿp˭]gyR^Ÿ1ٷg$1)P,gN6v~rc{)UI7dAA 6*Qv1e#11w @R^Y_(zs7sSӧ`횵(HkFΰzv>Lza2o@kM۬,\Z<ԉزy qqqՓCD)K))S㷞+rsL 歒TyʱʾZ|qhq͝g&S~}δ+MR3̜)MQwtqy3Ӧ2o pU:Sp=tm[;<ǡtYqmZ2ّ4lؐ$$ѯx[ȘFQZZe+;׮qpۏ<3~ q(,(॰_thϫsgQTXbbnL(_R\2[Ţsm/]@9_YGe׻fȂ  ``T ?mچ-2i@Ŧlj+4c"uرY<=i-1~HτH E8t0m2ɜgdfX«~ZQfLŹsxc'%$&KdAAŠxEP[ ky<6[6oe ߷:O)f;^(8qc;2h_>{ͩSsw_\z)O28m;9͛)6NlFq8cKkw 7u`盘>eLEllL EZAdAA‹ ,OlӦMط'7u :o1t0zࡃ]6N1;-ޜu#q 4mq:u<SgMp^d$gϞ]WoU.Rnwr4o @duȪp|^e%5hY;no{x~xF 3(Q Em 2I\GlAAX, c6jAFt/XS'ٟҋ<:hې٦% I ;DUF23RPPP|1իC ~Nk+7wZU"kҘRSЦ]k'E/ysFiҚ1mJ/\`L)ҾyیC  a)Sv7Kߴ17b{]Mdݚ̝k>YKz jժły ٱ}'wcpc3~vDҚ!::'ro`[[ {71~ի>f[XjoہҚD֏dݚ8QpEϫW [PSԖ3)R<5p(+-G$aw#^zh} t1)).&U YA0S"Kmv\:Z’8}4HoN 7[ħ QXDhv[TT$+f3}L.ڼvJ||#f2s^)(XFbr"={b܅l|w׿n/t],)L;.cUjNA(;d;:-ܾn1_Ɖ1ll.FLE+xj4r\z8խw" µ˿6}J?u?{Ov]{|;dee]n;`Yq׮]DGIYAv`6X +ǷdAAŠTRaYBB[,RA  Ȃ  g%=lW1Uy$UE V"= dm/"s}  Wkjuk%7xRB"gMJJΒ2Ȃ  f-W$B(ns%?=7^߹1Zg~g$7MA~8ڝ@A!$'1fG~p~4n@INHtL4uή=;sxw FwmBi΃ۭ>?uP  8IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config9.png0000664000175000017500000010426613203343735022275 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Ulɦ{o{&E@T(( , ("c|}^t:V;͚6`$id TXr*:^'T¿gddcQU`AjӤqCTMRB*! :.UB! 4M#'¢ 0d&ad^ 3 7ݧ?" 1oϐV+iimo}V0n܈ib p, S'߈h`/Xmhgi0 (l5?_OҲx`=Ԭ/q?XTMr$ cn{sH?Y91n];LzF&sgj+= LS5 Ô{Q̘6Ǟ|\qUn_5B!ܬVeڬ\4y9淉Y7'RYz0jXƖF0/^h0 JU#6ZNb6Ӷe 6BTj cH/7;Xg[Σ_|u?V-h٢V+Xֵ#O-yǎ7+՞?_o<I)ԮUg/^GRr6Um aB!n:O53 MUh7bo]'OϤrϐTPȫ>^vyOX:t:lo  !) t:BCC lDQTU`У*!vqw!!}v=_p‚|IJ(0MʛL؋[,9b1* {h,vP\V! !if%'✦\1[е$liIOZC,Fvciܠ#`ɓCGbt J?mAqsp븛X:=aƠSt$$$I͝&%P|_ :~?'ڷ%( ЪEsVi( dfY:y<~̾A/{ΥNG2m2yPN-P헧`!(g[0U4-?l,m]Zii@Ӏ):fr=bXٛkrۭҡmk:̻7`tL&ladӖ/i߮5ݻu{~O\oa:}$>B+/}z1| HKK׃|ճB!Ŀ@ <fu>8:4ȃ{ӕ;9Pg]rv96TMCQ &#B!:݆fcMP펑 tzXLN'S1ח l6[v0CH B!zTSh̤W6 Vt*骎6#e{KNGEJ?B!B+AQt : wzQT.ϭS,B!E *}XX!BBX!B`6[^J!BkUО#tB!B\q_|+B!Dd!B!\H,B! IB!p! B!.$AB!…$B!BY!B !BBd!B!\tB!WVv&:J֜+οh :J#pe"=#s\{zxwI*cФns鍟? ʕ_g~СEGB¯tXB +;KԍOp@(OӒR9{*彽*$W8A6֊Bqeeg^tAh`cH~\߬3uG$ RӓU@TU@AA˹N vd]TOuew^OH@ujs31HLn*)Kuq6[|p~)硫ҴN Bî8a4یOCNnW3Z4T4񹖦_sEAE- rp븱MXs"gfgsi?}h\)>^ZNNTwon wq^[^hh7kM4]IMOvUu_IWCp\u95:j/zUX{UWD,s&~g( F j5&$0C'кQ{v,9f9Qϝb.&wq/įX9_sۨ8՚ӿ_Uu_IWUU ( v^Mf胆RQQ-YddaW<=< %7Uv2iOS,n[<]P\Q\B˿I+R AoD49E橪 Uܩ)hƥKG&wq/qpfs`Meee`ڹ ޢgϞ%.`:uȼqaFEl\LKUU sڕƅ87m|Y>6i9\os-OW%p|u_ZFrW^U}seWqr?J֮]#GٺK~ڻw(uy\ik+>r.3>~tehl4v*/>eYyuka;+UVTUdMŮ:#{WFz:ۀ];״y]3ҝUՎ=Z*MzvNv1W;N)|<Ƀ5ѻ;D@`55v$>>ޕ,^SG6Ja45fuծyvmw?h4Ҡaf̚FK-W-+MXZ6DBBC?Y0#}RMLHIOK'"2C2sΝeFzKൗVn;ֹpуwSķs.6ȉ?dI{?۔ n5YsbUx"<"11eru߯,_벭~ϐ7KxhŖ  f[YlXՊ5k]Q="_Z8&(yucؘXÚkޣ;GߟZk8TC49V*ȑ 89VдҖ/t\Ws6uV6~n)kɿs eT9-)1q#o#9)^OhX(:g߰sigphڼ SgLUVۻѨIX0s# ^Ew=GxyyN~}d||+ Kyp{y FIF PF=*oiݮ5~[U՜W35a!mL@YY ; 5 "aS,LFO.9OƅUt}|ش2339s kx[wՄĴ:.999S-OY~ZLGQ:7~eHߖ}6Eԫ_ ʽror<˖\RboJpH0?վ t~釛lbEXxSMb쭣x%G3c4o_)'`|FۋFr⏿ qǹݓILHQFU'==/oo>1VN/,(%jEU~~ɛvj|g>y9w6NCUUޫ-zs⥘fntk$w ^qZlɑG?߲t>9ݻw#lf>0ԯ_?Inݜu$]vO?…<ȣqyl+_@6n'XB做E̾_s.˰C.R"*<’c&ےًb4MEQIYv9&_]tl-Uǐ7ҭ]Ofq7f'>"[H.5x4[>ܹ-7Vz {^;>Ǻxetlم-jvr^e%z W><㤦8*n} `O{Q5;W_|!}qC!gǎcҸ)tkߓ==My/>>Uý去иY#5miԴ!fWW`2{K.۪rԫ_Q(^߆n88Snnz2zX[b9ϤqSc]`̰ٷwsY9/O 1w֮woyڤjv\EtՅZujұk\f>j֪G$4<<<ri~>ӪmK0?Kjs" ȟ:k3YʡjvhҬ1㷃uor;IbbB爐 wlM7~G? c'ѧKzu|6Fnz2c]N=3ѱeF ~(vUd7K%#D׶=~(/_R{lcӥ?OB%g]8;fӭ}Otϭ;K{/-wwdPl\mع}7 Kv=5d IIl\_MQ mMz+]xa}HBC1t?pW-`0 %2:m_ly)_QNz=vU-`׊Rt=CF o]F-̞~bwxhv(†Oa9 %%0{=tܞnzI&ȂE~x1ꝕy#{wGvbJW,e+hиAܫ&w{| FcǟIJLf 9͟lSt;mБCߴERSR9.s ԏ qиI#t˕=ϟo~nUD9^zѱKG8ČyFfw7kVG}Row?Yl+84mbuwWm?zWv>;669ėۣ/~Ё.^'66cG?U8t۷G <ckמ];r.Bhh 4tNtxx0ky2-jWU /?w3iz=t/>~1y\sZm9v1q)g]Uf %9j׭]UIJL1֛xk;Uκ5<}!$$$y8s}z BU5fY3̘=qF̙q/ξ{q|w>qĂ9<ʋ|!+;ŏ={bwܲ%_㿸{/KĽOcXxW̬sYu%l&66Z{iYs;rc2l/-~)hUV'yCBY“ ܟ8.]Lj1r.Ŗ; X6.'!X“EWTdހh*vvAP \_aaaٜcEep#Cڳ [6cw6};6[Bru Fcُ63mTZjN:^~v7/ia0ԪS0Aݏ9b!"*9Wy/1!`}~=ǚ9?&,ܷUUۖX*cy=| UUf0W۾BUU歚WK<Ȑ^y cLxD?:UUٺe!!2qL>K@򎯰0zĩUu5 !"*a\QrzW_r;}0f+XDMپ}z13;nW˖-`|'ߗF·ȟIVVt4lLiT#n8>/:X tЉRV]zK.YUz{)ry0nmtٕ9 &88ľ)OfE;o|;vځ k;\4oՌg^~ĄD^~UN C\l5;iԬUpYM&IMM%;;t""-[r) ПKJJf?'4 ڴo>gumcc''yvhÑߎU#̌LwllfK3iDvo4@V_I̜iҠQ}4K ;{Ĩp)Mk#ouΝWzYUmUo鉿_'OE㨎~xDFE7 )nǐ.=:3Y뼑T+ŏtӋ=w{>1zhFC%55Yw͊:l(ϝkgcN`b8N_ (j/1)8---ujWsڗW/Eq)ZG}K07e歴؎9W8w7rӜ B)'P?6͟|N. ?#޻Ǡ)^lXU @ֳ}GϾ= gTt$qqe{5^Nj+V?fLkJy1M=iv b]VVHjj*C=ɣ/M^;p#熡\[5cаxy;,ɑ8olNmv+ޞ>d[w+8y'9e9V>%]{tqWWCPt:O~_u]mҬ3F,H`PϞi&=sαpr 4 OOO||YtյH?1{:O<>u#Klj!b(*ŵ7<2Vm[1E ~.gm-=Eq^ ) םY7ty' Mzv,쫋r4 \ZXc!,0AXhZїc8{?|#CԙpuסA< vsY-ŋ~8H&.6cG~'''au>tӧNsХGgBKlA7?+p߸?8AJJ $%%c0]3ԴR<Y#nK. q;{1F/wN6 vnE||<AWd=Y滯o9o"#կi)r-11|e?|!#W*Foi(kWޟ~ҥ"e&US4mii̛_(ۿ؁lbCG ͍oz*VoXś\<5n/= O39tz=gN/w2P5AGA}Yb ۷r 1 ,׽O7ڶo^GTzs1bǟOX=py~;xceiXmV+f]gGun~)}W#rS>%^{"+31cFcou4?4ZLF4` 5cO,b֛xx{Zt:Fҳk/](lU'AOiesI ! cM#>uzmUrrݯTM%"*} +t˙\pe/A~=J9Ѷd.]yf׷ܷ^}h.ۿ|<Ɔ;;fMi"==sDq{F a֯ص+bǰb*4p i)?{zq!"ɥ V_$## IMtiq4l _|%_9YΞ=۝ ]bc~u^ZPt;d`vn/lB/6o ]UQ*^KSj~Av-o2y|EU+"{2gœ͘`0Nu8rw h.W]}'xי=TMu5xu2L&ΜNGuk +7q })7AHX/ w܆nCݘ5fu^;fގ^"##аPy!7a 7?;N'F4?ޠ'"27 ET6m]LkILLח歚ط%!!-|AXz=ucKO:n3r_!Q,Z 4ty}>qx ˞{KMe[y7":oڕo؃OEph0^Oz9s-y8m_dܤT5N抵F6wPV4!ԭ_^oOrTV< DirY;;M7agYJ6_L&]{vE>tj P5vޑ{sHׇZ:ʅ1),{59VƴGEUYp~^|{=":^`Μ;C)OaS L0q&N(&vջ7?pVgU˿vuu7uvԉ=?vN{W/T R]qpwNIvca4ҬeSxHQM+2gڽt:Chծ-ؤyc[Y3˞&;ی3=w3@ߘ>.6Y'If% (T|nK,V+"sL̝ϝb.&w߈W݁m'UJ8* 1bڳ 6ūݕsM$ 9;9LW|ET*A6<8wZ@;;R]ܽMm9Fm.wNP#DI]UzmͲw}jw|z7mwM㾊7W|ET8A6Xrdd;_+cDܩ)mr-wwJiy8tU]涹+QUj+ Z>ѥ+ `T_%{ĝϝb.&wq/y(>ڢ&eWsܕy8]RQl1Z<;WNNTwon w3c+qHͻ Wu殤+d$--__ (ԨT|}~EyWDcNP\YKuq6[|p~ɏ'7Dco{UmJrGdO̬ .^@/D[Q9&,K)ylKuq6[|p~+r^8.#R畧p6J9֦)*}_r m *{B* _Jgҍ*"!_D 0ט4R2܅z`[iΨlQ!_!UB\[t:A~!xc{վ/^>2'B!ĿNQLFO.:Z:$AB!WƟpYIB!UGQ>V!B$///-ZDڵٱcGˮ]Nƍ l6vQF -ZDTT ,Tlz^/q>}`yw+!BRtٳgi޼ye.^Yz5tN߿?Fs V\Inݘ9sFV~}Ν̙3ILLdȐ!vkS!&IRɼ̟?Bݺuy>|xe6nHtt4&M`5j֬IVx$xȑ#yغueiK/DÆo IDAT yYp!&-[s]u !ڣl6rx{Lqw̱^0(EQ3;Iṭ,KGUJJ>ZH~^FVV-#9>!^o@yFAj; Ϸ ˳Nu\u^~?y׮][!!<6tR*5yuI:$IUT煆VD%&&j?U+Ε;֭|d2,IժUսܣ)wO ϽN'YxZ.|OP\|)a}Y/'+**eҾ}UNiȐe| uڞ=Nug,q85A}5[ʯԦ'z[Y <_haaKt]J^zDD+&&Fo߮VBkAۉ={ݶOjUrժ-z8}~ 7ֶǎ?w+u45k*''G?ZԝڶuL)Ir%qAmYO믾ݻ:uh˵+u~ZV999j\y>xov)mwZm7jHM5єISeNWRP: >tH zG|X٪QL];Kƌ{ݧl zƎ^}z)pc~J?iI c;n ;] Fq8K)S/Es$=ڻgbccօm}~q^>Hev:zck ?>{աoWx{뺶0ef9Biu0&8eVnNK[GgW!@0! d 82@@p d 82@@p d 82@@p d 82@@p tpz[0;](@nr!p d 8pr% ME@.'F .`nXd 82@@_ s%IÆ Sv픕g믿^Æ $)%%EaB U:[mo^!!! QժUգG-Y$Oy~vvfΜF),,LժUq@˹Yf?oO>=ou]W999ڻw[m߾]ϗV6mt?裏jZ|ڴiK/T ˚}駟֤Izj[jժO}NߤWƪJ*ݻVZ\wqGmTTIիWWվ}{jڶm (pJNN}ݧs/T6m,pB-YD?ZhaO NroN俱D-\PӧOx#F~\ѣz畞͛0ѢE c@# s~ƍoݺ~a 2~k֬)IڳgOGHEEEiƌ={vzriiiv[!uUWW~2z-Zcǖ;vHRRR BILLTjjj PV\bbԩSr/7ouرeΝuYfONN.6tÇk˖-jРAXsݻ[a"V{L۶m;aޞ={c-_\֛og}JcȐ!:sԥK-X@[lњ5k4w\R'\΍7NUVo+t١CWPA))) U^=]}r\ԭ[S[Ŋgi7n6m]?ցN}rl֭s~YӲe+WӶ͂GGGk֬Y5kVpPAp d 82@@p d 8|Q>n/䁗Oz7ӳ\VVt $u];~ߑg<֬~s=AGUDdTnݻ[+::Z={]*ժ򿞞ki5E@;NRaa#G(2*RKW|*w[۶{ߧjR~}m#;;[VD VRr}$=ܾnZg߭V}Բٺڳgo QbbR* iՃݪ%Iٳ]b]ұ7ln+==]ْԨn5Doi^ϝVMq/.]-v\Ç+;;[>.:.hsܹw0p҂& 旍ԾEZS/5I٫a ӥ=/Շ~;&a%jwo۵EjШ V*MN=RKT>$It_h/kԦmbwu/?7_Ql\>/-|^~%[VC3(h =R={WR咒5?Tzo#1)Q-Ȩ(%$+$$رS{\R6 J10رc:r&1I)I,K7*q8s& 'īz.rdyTQz5}SYU!!!UV˥TNO^1LUff=ȈbێRllzAu֥Pfő#ڷw}ۿ}><Ю]:~<3`ЕEZ;ڵOmXQS~^6I۶nS4UO)ugvYlW B?[цu0).hC3օm۷.NJk֭[uyuIZ13.NuhSR4bحJݙtWѵOk*<<\!>=@y4=YihtInҭKr$h3fM˶m.6m:9eKwA3yٻ}?>>^{=a_O?Ӱocŝ.VժUʲ(ǂ5۷9rn?Fsڴ] @oP^M@.xZɉv5W듏? lPne4ӴSry]ZU u~?~<=@yc,UTѦ6oen5BqL( d 82@@p d 82@@p d 82@@p d 82@@p Ny f mPPn0p d 8bQ@w ĈcS  82@@p c;vTXXBBB^ziժUkת[nSBBڵkkJ&O0DkNJv˱;wӾ}矫RJڵ'I۷_k>|j֬)Iڻwz={ 7ܠÇk%3\(!!A-Z#< mڴIھ}z5kLZ 7ܠ{݈%''^z>|:t%Kpo<DNN^~eũYfR.]4rH{r݅kY^Z͚5+^=r97zhURE2e&NxI￯kVGV:u4gYe[o)11Qԩn5*PP&ܽޫ5khz74k,=ӒHM6MfϞ)S詧ٳ~'-\Pn[ݻwWHHHvL˹8UREչsgX"2a8p>#{zddjԨ^z[nѰaÔ]ֻP\FFۧ_U//^:ѣz衇?hZt,YR3gСCz'xQ%''e˖zꩧ4}tvm:pC 6 7ܠ~i̙SGQfff @ tp,_y5j{Wivn5Ep d 82@@p d 82@@CPk] [Y 4MlЫoй-j_Ml$zq5oR6Q4;jWHi4uLwֿyAA\iZs^5ݹZzUZUtuQ̜#o4m K{^=_MPT%)**Jqjب&NL7;zL;SuAjܤظX{ݰpUTI5kUm諕_poW4'77W zG111߰""#tt{ْv ]ײ,[^ /^<t?.9GаoTll$i޿_~zeY'}۩EVvu]D'LvڡJ.Aw͘_6lҭG)$$${ G()9I5kT^=v,cD=z_/GDJ*b 2HS'ݥA333?v|[+XFǎeyu3U_^2x1:2A1ĢJztPڵ5jH]sڽ{~a^~?:t萒ԭ{7?u˨[4iTDdD ʂ" z*Uh޿:C05]}Zb2@@p d 82@@p d 82@@p d 82@@p d 8@wǼr\6(](7b82@@W''7G\Ac8#md(44T!2 l" ;;}m{ -JͪuFڎV|L*'%,%-l{ed(4$TQ(! {(mߟqjmv:$]ڭ??0 x B IDATYO[|/he0<} Z^Hӆ_)2VNnrs7+ǎӁCkNg;NRBLPդr/rݹ=W@w:_]2M.Kef˰d|4-<;ܷØըNS*%e@>vگ?Te6Mx/_B*TSTdBe̙Cj~V+P9]pi?)",J+UiYwh.NAedYL_ҕ!V '!˒=ؒ'eyÛ IJO7e3'7G7yV:i?qf%^ȱ#ڽw#Zbi\޿K-j&;NARBbnO\=_d`  -Ouy+IdY9lȳoi˔!C,{U]j~jZT)2_+2Z+H »%,jܸ>x223ya+\FH<~9v)#Xы3$++TzU~s=۵k 6r.pr[ʕier=a3d³edzfnusmzs?}uӸ~b[[o$+))Io=Ϸl)xqw,xֱm6OU~..:eպ({z7OҥySj( ._t+ ùnܹm4M=7|}4vu\".QtyZ5i ۶װ+++K5kU*:&Qnn}y:s _.6Ŗg,54u͵Cd,[L'O͛UV<-Z &m۶z7u7ꢋ.Rݦj=FUMs*Eǿ`9$%IZnJ%.gK>yꉧչ}WݴZ7;Ww9-O$##îH?={N}(j Qԯ_?ԩ7nAk׮+>>^111ڵv!Iھ}ڴidUXQ5Ҳe=vXz}vծ][]z){YfAPrruqM8QժUSʕ5n8@i ٮ$ʰ[[9\EGW,uQt]:^ti ^q/]eVڵԲUK_q/jTܹn}''|*JVmKl[n7߬zy= zi„ ͛7xe7ܞsV$ ?Xg7mv\wޥ?_zt6-m4fzGjѨF U]te߁jۺ5h=/ח+*O'u,E!Wş}[Fެ#j%Ilܤ.Ғ>_|^?&&FkYѭFl߾]ׯ-RÇvZ;vLSLZzkm޼Y}G}Tǎӱc$IUT|;wט1ceIʕ+թS'm߾]+VPBB^-ZHK.ҥK` /P ̕;7W-wnz{Hfge)3٫zzNq-nպ\}ޫظX]5*Yѣ0\h"MvsmV/M7ݤC%K(::Zw^ۓ<'W ^b^*4}M-w;I8O?׻ ߓ$cô׵uZvҳZ[ڲe^yUIҡCڟ7O>O;%HMN`yNG/$?cڴlk߯?X 3njԬ+\]/7^Md>zWnXXZY݅U$I5k,t݆ z[ k_n]թSG3fо}qF{^hh$e˖JJJ5\5kOIIQʕդI9shjڴZh믿^|A ~ț.t]xq޵[uRDDD_5k!7>WߜWKaaaN=p߃zUv-mXA?|͘)ܵnJ˗}Q?6lu]g}V%ZSAg}Ɋ<_߭^qlܤ*UVgŝ:hM%%'AREDFQFjа_z~^7p׭[GjҰoT^>؜$&G<F>zǾkTլ]+OpSRwFRR)^@ԂkYnթSGњ4i \622R111E^jm͚5ܹ㕜BÇu!C=pX/WEyYTLT=N /VZU=r uEîT)77WFAԩsGIRڞ=NuQFԢQ+'ۻʋڵkթS'͘1C *zXX vHP)XHÇk : uN6ltӰظX9rmoXצ@=.O<$xUQ=ϴիk%,?>OXr'U,4T rUvmKh"͙3G_}4i^zI?\|U!S-ލ7ި:裏>RӦM m+&&Fzշoߒ&pR\Ɖ' 86<<\v>ѥ={.FIk݅˕_Cyϛrss5~8{ZjUrժ-񶤓޻wziӦiĈz٦R8XyLsp 1==]EӔS ]0<}?ԝV Oq c^GK~fzR;ةo.]f͚+ugjƲUz'+o?-[hZdn$O74h?P[eggeee)77/0:tL+Vh׮]~IR\\o߮}ƒPc;o=\(sI˖d 7ֶǎ?w+u4{Eߡ?͸KeUƍԤYM4U[6oQ4~u![˷'Cu6lUhE6C,O}sS8n)Cg+''甿@iǟhW.}Zgw|LLRwRzz=.ARmpzs:8zQʋoԽs=3Y=9 5oѼuS*h̸Ѻg}G]ũ/r}ڴiڷo-ZhܸqڶmASN㋬:M8QjҤ ]viΜ9Zl*WDn%''ƃ>޽{k[ﯭ[JD3F4uTs=ڴiS\´oe_-,<\ORz\ܭz!-|]u`M6Yvγ{ u?Wgeu)2 C>?O.K//սw_+h"EDDطCh]+$,KD(#nRDDws_F'ګg^zYqjۮ$(>>^3} 68=9m3V%h%>ÔU8̬qweG$VtwkV:|FJ):vk(RfQڳCj6SRBoVO#G3t~ϰ̣y>>ȨH{ZDYq/rmزD'I̬ڵ5ѴLgW?[ׯ3Կ[p{39&=lX|eaH`$P_5;!Op]ң~'U^URT֭.2e@,iCQߔ١˒}Ie,IF*n٦ὊcZϾ=eԳoI2 p&Mko_ 4١1ߝ2dn4Vm*U si1P.G{Ka_Gp\<`c 4!XF!\2棵\2eIc$$y't2@@p '} r49| xEG܁;m9\F=+bcUr5UTu Xǎj߁=WcNoɒϲ,^φs%˒ Ð%K\zWi?{_*`yCӲ|=ZS~G~ԭJCfխUO j%a?~yl F8Ͼ'o{.I_y|YϔdJg=˻]cX`Lo{at<}1 qܶY 5T҅d2(TZ]F4MDG_oޗs?oney ٿ+my]Su{'~G*&*Nn j =օ! b % .BHrT MoE[M5|__. Kr PlhM_2JoL|W0h+Ȼ}Oj%S:_5]cmY2-_~vh5$/{0x~:v~žsM_>"7n@ >ViW@?v߰M8_Ͽ0nٻjX7bE@ŲLSn+}ȗ;PSɞ0\֗ -ar 0,_0rqWuVT7߯Y:-yM7 #9pT"X=Qoהo oEq{଼;"o˚yUxlk't;>q%Ɇ)gwm<䩎Os$U}{fWMo' \W]_9@퓴|cxϚ'z56+f%'S_%wApYy?=(p{;2-6c}'>ʾBoo=--*L0Kڜ\"tg)pom1<  [翦Z' SP jNEfݳ+b!u ='[%oŖ!ߕ.yG8sL?DFJ"X[,ljwp^~?e&yf8u7nt;($=s891{\wnFYd8w_~EV|cK9B0\o7o]7T7,3/(aUY]}Q.9SvquTIҡC96s4v%DZmϐp%m|X UN p&xWDe!C><4bv*TիV+"2R9n|Ȯi2-KnY|UK"/VԱ>Iw!y+?׈F IDAT$'=;ڲy&N%ۭ#G4v85nX?+`fe:NBaq8#I*>ouiKy״lBUV+Q& dY: ߩ5i´;_v<`I@|_^QS>%&URH!m4h&'h͞eW^Y!!!>FWm U(rݖ۝7ΘjIV}צ(bXHA aVeފbH:~HI%)%Ye7~ZcDztY>Nj{PAggi-;11:?]9 9a~ =,fggeԭGWݦnOn **2*Raq42dj{4c=ݰ ϒOky (B 8xF%ir}{i&r[8Ժz򑧵o>]eY/G 34C,J6g4M}շ _xEOW CܲkMm#a4JLNPl޽;O9<2L1њvTutQܲ99,ePb6m.SAW(4e횟{n9Yn{ 7KuTbb%;uBCBʼV8JsXiU^UWGLTInڪ( {Fq9Ytke sb'C6*nQ?ntDũ0d"HEdNg;l1qz?[פWw>Ӆ iu$]6M3'mNǜײTP؍ׯ'?S*y^ ujtI+ϣJMqNpH_=&&) 8r9X'q8cC[\vuB'N~cWeV0ie^ۡ]{eTuZWjGe:Nv%'2R# @=-vzx^ۣ]Eut'Ld|le[_}oY;7hgXϣZdzSr**cv$&߮aߗPd~i[ꣃƞɤ!u r>ҠF]s1ՕPX6EkK@y 5 5n D#QE#;b 2`C@l ! 6d 2`s$ ]0/4=IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config10.png0000664000175000017500000016717413203343735022354 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|{%ޛ((MD,?PAQTP"H"E:" _qsISg%73͛73fg$ SǶJa@ c?I *)HR9(X1%ʖC*@KH-]R"sJWqy?Σ R*|1J%ʮNlJ -7/^Eϥ2YR~@9#2hP/RK)ﲅr.#ʗMQaU]t+E*3͟PQpc -Q"XRNRh)AG٥5c"#N*~~% @ HJJXc__k@ @pINN'$MNByo @ N*>>w@ ஓ@@ hh2cȲJBVRܳ 5EIKd2#I~^$~^H}@( Iy;m@ wDVV&CkѦ?5|t#&=kiȎpwwC:_ԱY.#- z,$INF.^{L&3zf $VnYF2u֯Gff&Ͽb_UsWѤt, (E`PdN-d@ ׺C- (RJRn`wH0)\u֟^-z$EAVd=j??_t:2έH*Ux{U:>s<=\˥;--fϠyf2l؂΂sVISg׎Xl@_d2UVF)&LiE qqt;%0 _oa2|viyW6~~p-{W^|5hr*k}HJjR;0\W @ ΏlJ&db3gha+w9)O0O4B=}_ɓC&\J\-zYquueiԠ4oȃ<[0deeQ1̈́7`OQd L"#3hdf߷#Ɍ6L>dY{lټ)qcXRِ{G2h@[7Md2(7ٽK4YQoo/t+a,xyI~ -@p1t Ɯl67yY%s99"Ѣ2T7&FS\6ʼbjhZ5ԔTTj-{^OMEuɳQdY#gC"^j`G,~m }ݻyt7&4b޳OFL<9+1MtWsd2g܄GӝEK$!1ժd ԪYpHLʻצ[@ -J( =opW5|Z tf#/x![R=ebVP$$)}L$,-S$ >IeF,l bsxeo7ȏ'Iyt.U޴t[^j E.2`0ɨGeԩƐ&V[hzP~! @ p~E]1a4lirrLjӘN@&ˉSs% WPS-Złl̹ ԯS jN?b2QTh42mAVqM;f7nERDDd*IE||"aa4mnOH@*BhTpV-%I"==OOΙKh$AFŌsY5;`ZsFj$$$"a)o@O@$Ҳ ,2\S}v4}R.2) 77wzkeociռ)>Öm[ѨT*t:fs{u CeǮi٢):Svp.Eᛣ7vΝm;Aѡ 󅛫ulAаA] k4jq0'K]XdkkU*߸IY%L{fy/c@ $Işiz2ź43/x6ܣ3R_{=άz4>\I7 Tm(*~DGGjصg(YV `Гp`]Azo\C ")9koRI\4| I8t({>/EEf݆'$ް>{j`6j5͚6FHIM#""Fl)W7֮qc h4ZՅlf)U %)97̡+@  jOJ«;3{51S\|yo;tWQ̙ق.|oFv)u#uVqq)OInnԮ]L3.ZrdDRպp 222LRIh4j\sL@E./%պV 3aQylc]77ó&*J%e:Lf z]* O"e?.k]PWy/@( VSE2 <@Cs 93օSKb]\Jdd 9J:u BRʕ%33̺L]2~>۩3l3"~Y  [,*z^ [1^V*TIh/.TM);@֔pe& &YQ$ FΥ"@ (?TZ [;$jб6՛ IZ]3e ʶ$/w@ w ZM,F/mtuˢƄJ&MVqŬh?=hըU* @ n I*4 JFB-@ D$4j5P ̋b@ @`b!@ ء %@ #HZ 2n!@ u|m@ @LY @ C@ "@@ @ @`@ ;D,@ !d@  @ vY @ Cs Nd8VBXPeպw7m@0LS*⊗""@XN5Ԭ^HHw۬Rk7 ~w,dfeKͰ( wڧ%$p5 AcTIT-rYmj5>AԨ\ WWF="&!%h)dKEmr6gYvmgiX}qAqaQf#}VmEf<郂X(Ru^JJLU寛-*]F`^EJ'"&/ap.\=Gjԯ7O/Ls&[* gol8 gn/qtlv!G#A6RҒDf<N_պk7U d}gE\V}.#8 g3 $-3IpS>A+Ml`;NHg3RQ8{>gYpV8]w~oLF<5P/oL&#D̳Ce[+I9[!,HE6+ -(ȶ-w2=eDu%˘E`$|<}puq'O &1`JDyLT&gq/j&_B+sӚ/ICH*>yVa("[" IPnxeٖf"go(#-@6f@>-XWk7h1aˢ?3ϙl(Mf,8_ծU<).*V}~|ȊY *5 p[$.EAV9w2-ː;tQ łNdW<q'q&9-s6{guQd:["!YeYnP,_IRY"(2 e?ضHW k r",+?gp69}f~qV&jr#޾cY%44B)Btt4*U*LNݢ8eCV{%$/ *I)(֕_F>WNyG(SQk1@,e1pʊ3ϙl)EQ#8;{>gYpV8]ETdfժ`49ylV,M+׮c]ڽTz=:t7ߠ[n͂^Ne!%%(7[ ߪ$f(YgYS3(#}IG=Nz]\!}\YY>?^U*·w–:?̄¿d{92s~vL&L&StdddܺZt~*/,dȲ̅s4~J}L{EFFWΓwѽg19SJsPnK(J 箇qw7_qi۬{ l63p;,lx;o_yαiLHdE"+2ٺYV,XiilٴlWyx[>JZzM^-X{yG)/Yd YN1|̟+oKEQ֯/v@@?d3K"X[(oB|kVHKM#$4>dff1`:wKΛشBu>\FQ!wqҟt4osfp"lVb:31trc? wL|aZmo<=sG~DfMI8[>TϿ=|g#  ʓgpss#84= xxW.~`^[F =:X!J76JY_[ϮŦ;EM,oeYsNdǗ8rATY|fV&~;ջýxNJBjoY;}AFF5p`AoYKPp~~L6Ѧ0eެmS*ֶJ [X}2=$,Qߖd˞f[yq Ԫ]2W$KSr Lo"<VJtd4qqy@VϜFPpM#xu"C:}2^^9uu<4eO?ZSݍzryt?Azn$נ^IKKݝ/~dt$%%3g]M&d8JKNކkۛ݇ꕫٱ OT*,Hy慹:y.EseŅժpe:tn@Lt xז/UV\xOOO*U*REd/\STZ9O"gu5g5 tlᢷX/2Okp ڶnǩӿ ׯ][n\zzlR6k iIHHM6l3mkҥ3^|mGRZռv [h$)1'8$[|woz6Z̧fP?.OzOFJD 2ow֬߷X Xo0-\z q+ҢW .\Wk!gnXdžR!(NJ= itO27k( J232^<7um,|@aϿp!zapww/ o0d2K(4PIRPwn{VxȊ.Ҧq{Lf#bac0[tI!+bccijhߛGݶ:Lf#kVO߮Ԫ+?i寯MiY`4xݹ]tgs/lUX=ď' x=ѷ/}f?!:B.9~x)bccY}fϙɤiQQ=5װ.bݷW96?Gޅ<\ jפsTZ歛ѱk{[xh$:ȁȷl1ѧs?:4̨Aˉ_le,^_{ѧs?>ܰMbaH*Wұk{ըB8b⓭0e$TO>GV,y@`p...~ֹT@ǰu<1 Q^-FAH`5 l/^?p`~pEQTy@Nm:r0'9&L׶=pÜ-Oӿ@:>hǘ-RɮX=k<6y6mwזy^q_hUgcO`p~r .:||D}hӾ5|9s,[4f.ѣlh _Axxx۶X^Ӥyc^\`IlO-yHϺ [dbbbs۳аPhT/8B@B*o~>\yGq8@VXdsOSi ڟc.#)s$ܿg^bṧG$~!3~/ƕ+W2ldڋ|#y|>{b:ߜ87'Yˮ{d"m}X^ju[۩ڹv,59|;~ IDAT>߅EY[4mє]vn5_oJ ,ٖ0ߖǖsdQy1eڵ[?A=^(ƔT.ԭ=~%*loeE)Ӝa29owOcW{E9CF 董f8wFae7Whֲ)/{%O}kX%Ozןꃕ{z( Ng뫀bksWJ[_ղ.zd_zvEumǒEK t ⻣ߡ(ٳMG*UСիWйؿMXRZu[Z짟|ZQvmuf$:JdD?ezHհ2 T^QcG2fM73axO(qu}}ZuF|!oQFI.XSf7Sgm+_V]gq23+ i=V,'XMfϝŶ/7c0x󵷬~OLbǩR2>Ml K'22:'t;s f>g{>fl%Ξ"˜W^ O>bֻك$Vsݜ,\2}"*2xL&s\+/˅LL\l10aʃٶ̯ ƒDZuG\2T auJ3%I*\~.}ө?}:g>Q#lׇ.-3g3tٕ'+]MC|\<1Q1y/y| q߱X,\8wƍe??BBe̸đ/XL4Z j󲂂/~T^Ֆ&Iyiܶ65:`<|v<2mMVQ3tP>L&#| "7TͭC\2  YYPjBKc1z`p Neзz͚wԮ[YINJ˓QcGSG23կ'^$'zg>tnэFNӃYӯ37}&08*+NUd,v:W cɊE4kՔ?/E^$'%c6Pն}cXhնHJ "a۲ޤJB|_{Sf"J9'-**sENl\pww'%%,RRlM>Y.11ȫK_BQdhֲ)wKNyڷT [5RP23h٦9og2rpKQd||Y=z<:j덢sMzmgD|\\Ȉ(~>ɈrM͇iEיZTT?k-EI zt_?[K9o|Sޒq8@6[LzӺe,o-0%wU-_ӡs{7] !T_/ou6hZ-GíhnZ +lΉ˓g̡cdz/e)+;h~)h,[8!mc&2$%?Gwa--S=p,^`bV )JBe\\pUo%Q6hݜ_bCcOHc.뗑E/fϠ7`2%0(0M>(R߿-Lm{к}k2224k٤B( *s;W_Dמ]Z A!AԪSu[;GGQQXW|V{5w>mYjAjUi8nnstхh`crU={اYgΊmn$p?ݏlMϯZ /0vrIDdzwVNcАy?'eѰaCmE'ؗT ZjDOO?~8+|gt\\e{'u겗eWWi^+U*rD%m+9T ֍[y(B.+vi;NJ g{˸t2̞GPp CF|E~LMt?Yn[:|ޓ$t@`@>ȭ;m=x'W+CF !Czv_B[`,۝'EA?r)ϡ=F ߐ<;rK8ƍ|1fL`` Օ_o5S+Mll,:c8?_N$&&g/ +[?(qȠٰfgNտh߹~E>>j=8.]Lrr2"3$&&uV%b}SVe}ys >ݺop-m{v7 ҅wXbA;ROi={[7oqu>...еggRSX"""z>?/Ȇpǟ/ [6Ɋ>o'Oq-,@Vd9Ym kfլ۶LN}QUD37[>k\zCs dEM\:>H}FE~=Xj=M[6ή)yuޑ-w=pf~Hĭ"tr:N[7o3l1}.Ql`2gVdE&4,7%22Wʎ\,=m6sԔTZoԮWʕ6thXoe,fY X/qDGp܅ː}1g}Zquʊ_A,sRF[ؑ=cyxf3GU^LuΐCILL϶^n'3h׺=+~-Zkc111h~;y7ggL}vUgcCF IA"sՑV9?{Cq+U+V:-r7wO7bHJJ*v\&~;yt%%a7{#!&&opMdEKNDEF-DFFO'IJL.Zy~>ڟ{}DGEse32_|"b)Pd ?=:KLs#S'х>+QC%$4v2v||PnI Wxwˌ*U+t.L|!Tj_DFz&UW1Q,D@P\b0F:wSW&=0jyt34n [9HԮWYs/7#3V9PkԄj@dEnúL5u6'M۲/u+ZMͺX˶_[__'?#R/,Gulc<FÊ!.6OOOjZJߐV~Ȃ/?m;z\:/,G@~oAƌfoacM5UnZ-5`ʌITF`p5kEBUm i *43&9w< tV[7~NCy)[3`}ȊBA};a "[lNm֧O>?iV@?&N{hbAL~lbv8W%%7(8s^7tdܔ.VZwfҗoG˃sf杵,|~1:׬:գ.7ϛ{^s}7:/-c ֟z`KlٱX<["Rhh%nD\϶)7}괩L6ET32nql+۫W/zU@oN g OS5̜=g*_8yP%||y|lT*~4iфw7C:5'/קc|&x,=`ڬk|+kes=r!Y<= ֽ7ws˭|Ur}odz/)r\DEDJsϙl(MfߝgXQh-Z7muT4O98]wFS3q4 &C 7Wҷ__NWV:NcÎthYٔq}Hf\rp$$.\>P.^ ߖX{l+@zVZҬ`ƙLT&gN*3lu7ɳ:V}9޻+ߪ9%w?7|eLS k5.\Rh"g3RQ8{;m}[q6gծI w՛\OwC,c}~ σwdZ'=3|ןǙLT&gq/j$^O;yِel. ZKUyYwğEo{ʅ3ϙl(Mf,8_ծI?b_C*CzGlV)zԌ"yw ?gp69}f~qV&w6"@ #I:+>^T :C@ .a尬@ :$IUlrXV@ "@@ @ @`@ ;D,@ !d@  @ vY @ C@ "@@ @ @`@ ;D,@ !d@  @ vY @ C@ "@@ m1[̜rbxpOfdgw^P @oǩ/GIR?@\b <)OѡS;n,\h~dD$fjիa`0ϯB)BlL,!!fS @oũX'bl1cd9i̔gvnٴY3(2{מ;hCa { [O|M>,u< +5_Y²%x@ [qb`4eلbh6b41Y#_]Rf<3O?[.;+G?@4N6yd4NzTV }= H-2tp豣]CrԯِoI_vC /Q~,΢ti߭//O4 @ T[,3p-VEZ>l$ϞK sxf\dsM\\sC&1!n'n*W|1Ȧ͚дY kG+\væ 7nm6\]]+D@ ĩVf3n:wFCGȲ,K(5#2*U->OO/Omo/{ѬQsd3YoX5jN|L&- ;2|qO1#yxKFg(ր֫ e"F.^F]ЪKlz}zMݭ/III|KtGƭytc'ֽңKۘ>pa?̦ 2v8[~BB{ ӡU'[jӑCGk zMCDFDVMpK/z,w;̭_!11ӤA3OABBSs6i0xy+lܚv-:{늴#>.vڱaddd׼>m۵!==Xe+hۢ=[0ɹd4a M4G^?co@ ùd\?w{G܇ZѠV4;>Ο)g?c IDATpo] ܥ=clݼ͖ 8r0k6#+[F.whN"55@ Lyh wܵ3l.6ȗ`0PnV.[>` ۳>?̜'Yq.???}//x_C{0 ,zy))q}0x >_ѣgw\<͙iզU;gMMFF_+䣭yn޸N;ٹw*K/\~qq6x'6j`{.0(5ǟ;f?9?~%oY}>ھiGB|"v|bcn{2@v{{w|FTT4s)cSUǗ?wWe@P:*@$%mVpcGؑsڶo=ELbL{^}q!Wb#(8-3h@N-AӴYv¥ lyaUh۾-ժWgŅ#/v䩓ౙӉ⅋,zy1Y,_e+ҰQdYf˦̘u֦^z 5oG[?fȰ >JBiּ)[6natڙ`L7Sg͚5VDٸ~-ORtt:T_W瓼ejծEvmxGhǶ2nRv-&N~8~Civ,_–׾C{T*?|ǎӵ{W[~hаuaނy_*U# ժw0ə4oٜjҹk"mLNNǛGOeٻ(, $" *M( FyAA Xy+MD4ёHBBfH\^3gf3s̙͇|DT"ŋw^D>7J+2u3lX_ٽgg3Z1trp´)ٲi+fvf0bc/>ϱǨ]w_c"G||lu!JOO'55'q UU.v)oqK/s,l{JU*8\$)UcY /;"0(Tl6nnn:yoS:<~K&,ntٍeKӬES6y w?ep26ƔAJrJdž$'MV-cK/ hxxr ([cCJr ҭwb_Z rv6Yd&7؏X$%-# ŲWDl6;fxkͺeⓓ.jhBC.9,4UUU /B_=/=2/<%JdI^|wlv!!;vJӰQC&N.11]H6=ʺlٰps$QG+Y}.txr9gÇѽSO\@G>t|Y>RSS3a^^^;G xT#οeʄMff&1{ȥ\jE_ 'Ojr&4^le-~Yw環ZĞ:Iz.38^oĺ-&2ZL<8y2cGxxb/$33ݻrXsgʼn'eW<ōMe+Nkm;?=HJLX,[ؓݳӯ_իVw!ިcQyfIJ˕n=.\ڹpaǍmT" h䧦pQwrO6,Q]:7Ϻ g9];w1gعC)3h@f͜捛9trrr ;M5a葎21ێ8t0S'O];qطw?Po)K wiٓu[װg? +G gċ3^r=ȇG0~:5ˊ?  @Dھ+ݩ{=~C8d`Ə_2p,xM;sߥxqwlϋpŸկKN-xqO>b!rcZ*fߏ0gy9<=a2]uh3&39{??_F\~tѧL?L 4C|f-gqLrIߞųӻ{_:^uY }v,Q:_|KߏvO3c#P̽S'O#d%KqFKKOwww-x/O//ORR.T1&r4?4L:uS.a24e?zY4;zzk?ch :O}{p7n ffeʴg$iYq%:,66p!"E!ӾeG, &wv8"""r p!rsUQG9;jʥADDDn1AE H.JEDDDDrQ,""""d\ YDDDD$%"""""A!""""Țm%ۖMPn*3&, 7 &9%"""" =3g=MbYgs]VoD5݋yP%`Ž. \%kFVź4쐮ɄYĝDq/,XmͧYDDD*e۲KvźTùnOc)ty^&1%ކKuUʱIIM&9dƞcn/ٶlCAV,"""r fQfsrRϝcȠ{H=wu9vAn.5"+Oo"˅Ҵ~K-nRd""""y)94/ f/>_Lʹ|1 /;`29ͥr[xEw\`_vШvӛY^9999}А|ĒMreord7ƾ +CqfqC ;6G|yV^CjUYz }Dv&7{_61%5_\|#-Zȱ_vSz媛i٤5IW,;:t&D%""\.kSLNN1KXJPP~~~䋥u59ͥz-‡Sزtx<͋pUvnZ~cGMՙl/^NJ(݃}HIN/M'L8ƌgE܊kʟwV||0oV%)Wa 6 ]0zmwÜ^}U~m]6f͢q㼝 ,`Ĉ>}??(]bqq v:{S.'dž SȥbnS|5e'L'i(qUq ǣyع#IICrrpْtjۅc8s&n k0ԡ-زy+jز/7Z6hNu٥Ѻm+^ U}ԬU1q4ekx'ۦzŚYYY«h܊f [⌗qoټРԯـM?nb""rs-Q*URJa2sw\Q8ѻo/lm;=FAe8uקY=lۏkSBuVζXxbڶmKʕ=z4Ǐ'-- VZk^IAf3v{cʽ,˨=.UbW1j^}h٪kcӏO>7 wX\±faԧYJ6kʰ{$%%HHH`#إ#6~G-xK֫?o}c|÷Lxz`-L2S'z*23y~$'%3t4׭bPfKߠaXo@wxulG E?>ϺbJ<Ķ_Elش C6^e\sg~`X|֬Z/pCjJ+7ŸED`vvl*U+_uяqy7ƧG o?ڵos4l԰c69oi޼9^^^4oޜ)S:7Mn\L/;999ms]/ݤwܨΠaFC  ~՝~uVԭWm[q`Ǻ2a4nژ pwwgú {Ų fCȘGGsT|{~JxQT)˄}cEDhMHHF7+^Ԭ\Q>L箝5fU=|0۷q[hԤɧ6d6၇ /ϙ7o+TݝBr`8Ž~+O9 q1t>TO _.܀6mtlJff&f=廝l&<]VZs0K!%ӫϝs'{?bcbcOiѪ߮ja=IMM'3~܅^mNjU8׿ވ֦]zz<%Koo\٘)Ul 前VWJ-ZDdd$| ժU+f[Nv14kf63)\*A.vWSߏ2W,g6ߚ611|k|}}ngZ9q<АKE +MjUrB[xq<:/`-&1pC\4lԐ\Hhk[n?0))xWܵ311thݩԨYbc>z3總Sz,Ë@*&q¶U‹U6,<,Irc]v_ yӦM;o+\dƚEy,˥nһ|8w!7M=ʙgc`DVfV2=-'8vOO;]/^%pA233ڽ+ǎE1w[8~ؘX{ϒϗraN?%ˉrJ2~+3}{Я_իVw!c֣+gN^%XQǢ.z\232Þ{Ele;11ٵKR劘Lc6m`1`+}Oųw> ܗoT" h䧦pQww_v˳k.?C9W3 bc1i$֭KFF]ۿX\zCߏ]MC,nಜN<]?X۫$ E⌗xqK^Ə@]fYaC(AZZ:]w;oO8:&| |7 ?^sSgw)^܃_2sJr2˖,/E2L:sٱ tۿc+tn: .Z٘7x޽UBotg 9%aF~{͚;"""ijDMuKM;Ԅ C*L&ΧHe<==yYxr, n挰(-<7_ǁfՃ,"""r0 b*N? /MlI֯WqGO;tZ)AEYd"""rsixtA!uՕ ۋtqf1d\DFz̲lnm6m۷3̓,""""M&<=>V[o:lنLA 5cj'I4Hk1"""""(AE H.JEDDDDrQ,""""fóZd۲yVfLX,X,[~(ACKLlbI{G BB3EJŰm%Rb]VለF0%}}O‚ &=1줤c"W&$$CAV,f6#.""r5fD.2WDD5fD.2QVddd8;q"^ي.Qm:%y޵r֛o3.?ŒqFmgYkjJ&#"" 2JHH rԭ^f [wl$'%3_k6`ά֯]O թZ:~Ize+"" 2 ==YRΜ>OOO>>Ν;ǷVfq##qڷ卹PX1g/Nb/+0j;2 g3cF>tvOST)nxɂrM|iΞ=Kd6q!Ũw׊. C]8ȘcݝRJ9֗PؘX6s([y2Zha1+0j;2  \W<8,<,ˢ#,< 0t"rܣu5k`NVVͭ~qEDD\Q[V*W 9ʶ8nOlL,999T^sl6ʗ/Ϯ8T)'Dn6#"" 2,<==ݽ/cg:^};掺{yѡS{6kʠ0t}N'Bn6^ي.1y^VZ8>00oc#06r%yckErze+"" V"VDD5fD.2ݜ[ IDATaU,fԟ~DDD\QYcJ0cÓEDDpR*nr[d1,OOϟ%95ለFrj"O'-9BFX,x(ɄqvH"""Q̃ =ɰf8;"Y d2Q͂͂&!nf6dr JرڬXmVg""""AE H.JEDDDDrQ,""""d\4j%ۖM{ҏ31aq`X 9d1t&!6>szHQ', 1 Y jU.C!'bϑ?(Ah@7Y +ۖM\B,+֥maSۗ݇$,8p nNJj 9)reB"HIM2d%bhf>"""7QYcJ"~qEDD\QYcJ"IqŨ1klҚdg"Nd+[W`v%jձMgHQ6 ǻH+~qEDD\QYN1CdП~DDD\QY_ӾUGjUÐpa:[oM-].mc˯o~V-CEVԪRw`Rze+"" κt~3?yVQvMiii{|̜*~:k|ێ߸IS&⌗ؽkͬ8Q"""KOg;e#?I6E >ҴyBK\BKZ*n=Rv-vlA˨w׊.]ʕ+xF2DǐFBB+W}jFqFmg]VaaDEE9l6OD^&/Nɓ״oٌ{Q*.ʨ_\W`vefHNN&..D |7#EfM[-\@mqss=3-nx%JИbQqFmg]&A~WyW1dK+*G`'3p(,JRrEgUA\QlEDD\QYHeՃz|y"=g"T<&LATQG9ع-϶o7"Wg+[W`v%kU{翜;w ƽąVDDG<#pvf7g ""bXFmg\dԟ~DDD\QYcJ0cÓEDDpR*nis aY,xzxx,ɩGDD0S9~(~>lcE bX4{Q 1;DDD A!x{zapv8EN do/L&C1ݎ͖m ٱcYڬEDDDn,""""d\ YDDDD$%"""""h 1Cl|44=OXHJc6J j%19QQb]:;$CO<Ş#QЀP=o@ V-XjWKj9;/IXpdݤ's,""RʄDd1Jf}EDDnƬEF⊈Ƭ HHHj5x[٤ȍbv֘r$5lAxg?ϨW"""Kb1=PFu -99kcoeF⊈.QӧOSǖXهԮ]`Mnq&#"" κL} m(>7bchۼ֥mv|#6+EVY6m[ٳv^zeތU<y'zm62tٽV:tjۅk;mټРԯـM?n>eԯـ#JQlEDD\QYb[zz_5))TZ ۄM7mZZ*ON7^UV8~n%/şPtcpMle;ENNfvдYa g9ml'r|Sj֮ɡaê+ee+ jשͦ7c:Q"""j3ө[>j70陧hּ)TVzҥKq`_X,<==9!ܨV%HO XTT-#GIOKCV+nA-Yj5~~<6.2e{W:t~իJ"L8,_%k(C]rRFVDDuZ7k; 6}{3t4ӈ&7̙ ӧY,Ͳ%Y:  W_lj'n93O?"""ݤoL{i<'5l6L@@ <3i*'ˋf-2L?ijCPzТes S7_,ς3u4_˄3kԪ]16mބf7湩3pVZxzy$2ꕭ+0j;k{V ҵ1pgD4bS5&AGDDp:o'=3١+-<7_ǁf?BzVDD5fD.2ݜaU,fԛDDD\QYcJ0cÓEDDpR*gj\P,eqI$&:;HNM`e;;"Ӽ\+łOLX"""R7maڔL:VӞ 9) Xn >5ks0II0hʚ0jH"<Ξ]{.{.:񇍎~3mi+0WDDu'L&BBCI W /J*xh"zE-1j87VƏw__j5~~<6.D2laj?ﱻFyHI97?m_{N ]+"" κléS|||<l6DlOtt y*L nSF5W(+f횤Ө:XFqFmg]6A^x9VV{tXi6jO].$4߭nI|=~]aԟ~DDD\QYUhh8VM0bCc'oyc v̴|uڷȐL!,x>۷[{?mɳsg,_%,h>[7Dv]yg̚:j*n7 Hpկ{]CQlEDD\QYػU =s>#ukIINٳc#Хxs3҈?NՈ;;ٲT4g޸~zUW[řgЦ%6bcc+[W`vV u =9; !QYc"W`v̘֘$-C1D{a۝JS,eqI$&:;HNM`e;;"1bXO7%8ñ#IDDp ]v_J0Ly^=1ի_ b5j+&Ӽ󚷝0i<={p`؇;9}4'>I=8{6H9!F?rSƞskOmr~ rUgΜK(O?]q}SZ6iM ;c&(8;yiX[6ytt$ 4CN,_c݊_ѾUGjVM9{l(]@jծ1L sfuu]-һ{Ծ5M,[NmР< C9r$/U#0n-QnݻuViTQR淵Y#J̳k0qVYA;ivȱc2fL<'Lddd0Iglg~.o~qw/Ƌon:֮o~l޴iS3y$V[EVf&O{dw4`U,j֬;0z$%&q=h֢)kè1#8{v챻t6:iϴiwsn\w[qWX,|MCԩchƦMh۶-ǎcƍ+x'yٹs' ^ 0޽{y1b#==|_|VXApp0#F`ذaMDDn`:t5kXfe_\9/ܴ~4nܸ2SLv ,og|e9994jԈbŊSO1{lFͳ>2_}eZɀJΥYatԓ/ 0(zOjV+'GRㆅqBGxB +}{ۦKwԭW?Y](J.Š!ecZiպe(V2qS awy_K g횵y;us2|p;mZӽg7+V徸TT߳W75kJ&ő#G +T<ʕc ̓^Iٲe1͜z;E --ҿ$&&xyyjM73OԦ Nڵӷ]!C;YKL&{̀>ܮ Ӟy xfTkB=p[y;3iմ #=?vƜ91ЎgMf˯ӾeG g fپm:iτظH<;f/gGٺ':;seשUVw1h@D_F+Gy}XVbEΟ?OjhҤ gΜax{{j۷O?eܹT\Ν;ӰaCl(5f~.\dbʕf6mJ*U;v,3j(QUTaWu,1jiw[*K~О9z+%6[6ӧy("""nce29%bpvXmV6C[ YDDDD$%"""""(AE H.JEDDDDrQ,""""䴴4RRcfee_d_Iۻ~$'%_RΖmɸff&ElΜIm/W7#QuϹ3#0/;;)uJI9GZZZGWE8 3u߭+TwK&Ssguܻg/ϲk{~KϿx?:tr>'wq,al __w~kԨTON_hѸ'HnTs~5^z?S{o㌺ISIOKjs'Y;m߲=goߝ3k.CsCer';p(6 ___ԫ1ԩ[:l/T90oT\ {!+|=09yEu| TPRE]Q^Aרk{{oc++vE@@E.,`0<ѽ3s̹ssBc1K[ӵ{ˡRRR;jFж] i!]w0jb~/'oSmzo:_`nܹo2m"#ؼwSTMMM-nb+V C;r|g.k>1w<.HBBIC4Amdܼq^Wq}DGRRRX4o1 4sCY$M@rR2߹M9[lra4pM \u6Q%+:(ӹr*s,铧EׂT| In?Sf}`ҕ~CpsΉ+ֈa9-h14D|F;Hڍdo݁[w,g3+gNEo31(n@ݨWx_SSSKKK A}JZ ckeS۱.jfѼŤ)gU3Ap 5W2g,\'111XQF J||Xm*ӾS{Ξ>+@[[mmm455Ʀ m߆Ryʦ./C<>eʖL37e+[nť \|&.cMVRL>W+V)SS3SLL{ ?d朙TXjիQ;J)6ZT 8pSS ꏱ1ÇMȣtILLQb2VȈ4qiGŰb077===oNmiԤf%Ξ>Rǜ061T)sj:d:A؛lv܃WִnuikOFʖ+KIXY[ѹk'QUv,Yjt֘w@"##-TgCi6JFٳګXn3(ei1֥)aXZNb?t9annl@ef}m?Z-i^%iպ%ժWuĥ eʔv e ̖wn a8Dڍ7OQ.[ +k+*VHLL yڱ6ľF!vU°ڊ>=#W.˾<7o3udJ抃c Ν=/761X=8s؛0^xIצyh1YYBy +gϹ|(_稀~t~9Ѫu+>ӧDWO^{ҶfaԸ>yF 'mJe'&&ƍ/AM>^”|c|D"jʖ+C`@ vHLHvZJYmDŊ#mژ#]ͫnS#w6sa΂,^y3bpy)ċY\xd455j2 /o\LD—/_\vX"QQQXY[)&ڊpA`U 66:E?UٹKU:g%HVoMtdծِ(CU3ۻO~-_)'Qz5vn`А:.o^.T*@SC1{d:4E1}3.m[?3kܶ}ڶo;r,J)ReRǛ0U)@ E1+A1o40>&#֥ :roҫwOܚdR;H`f˖҂N Bƺ3<7˖VOƹ3߀&3WK7].;"ETW"R`ӆM4iOV.\Xids%^i ,,-HNN&"<9]Je[¦JeduًM;/7zvUX)s$yuGpT ŋqC,J\ۙISO$&$t$2pKYd K ^ΜJ#H{%gϜc޷ +6$ՕE]Zy٭*剋̨cXr1-= ǭIv'D ]2Pyi;m5l…=ރX4o1rEvm\x&.rE n *6T\ 2XXZBdd$~J|=G߃DS޲"% r^*ڕhC  ߥjd̹U{N2@@~3 j(Z!=7A 91.012Cu)& Ԫ#!=cԢT)l[nA\\sf%u($'g>:w`eItT4x@ٲewCs#<,B\Ȧσզ5 lߺCa@̇E{L8 w\}Xε?z>!_-y5kVM"#x>=22!IJLM%455 K"))}x;v:Ddd$^R:B(QVNXXwÓOx9sfΥvZXXVn?u & .iMH$lsUeQVevJgyA؜^l(풁vWvmcmmMjj*ǎ#<,\Aȣ"#JlDM愑n6늶ײcK,s_!Jy•zܴۈ~ǙSgXf헷7 OJ6FMބt2/ܭ9 oyQ9Ϊ*k!s?ϟ=M*UMll4~2O<%*2*Wt+kV%<<_esE;ut^xI`֯n?uP}>P֢zHR)RTf E H RADx A?T@*K_Bx MTf R2JAȒ.R}źKdeFPY)d".APsxI03L| dެԭYmٺe;>#;svRP!:wTvghߺ#ͽ_8ǍkS|Æ WX霕i~S~5 XT3ax.ZF,G'GW(W;/|~[fԫ_zs}ni޲9%J`<~kxeW{tRa]U;[Ν=k#7Zu;/+ް K+KHܾy6[e353[8w<[ӶU;<'Z=PAA!)ZTf-Y͙.e +d25rG\t%[<^WhѬv²wg0[wPB,]Di5˜Yh-~ʄ1pmIcbTfNIK7O.Ȧ?6pqmܙY 04۔!Uv ';HlŦ 1iD\\`æuhjjҥ}7<\[7mC5ڵoKbB]v6Z/V[AѢEi_tѕP}-I K ܕ^"$iC,e A""J,B|)$ݹT*E"f8 2YAN,,m,Yx כZOTW1tm*1bV8O0! E(rUW prȅgrNZ]wc_:k6*pwqkb;os\@*UDk/OYe :C HH44tgL'0'fga;,u3)9P;2t}LS"O#s< ARe!(s(C$׹d:$i!ߙA8edCpl_ĩr~w !A2F9s^& REyn֑8#|bc(_ttQ\TTY!d+[92n reDȌx+Ϟ9b}d !K (o.ToX@%Rٜ[ SAUMMqLwA3Mt|;rΨn9T RBvi:)8ˏ2+WSȚ(]L^7#r"666ۊBJJ W/_ FQY@ߒ4G_|o@\|>|{-RKq^8HI, ɑ A?c('iRb+c_ƿh IDATD}iH4sFH˒##4eV2-:A2#ܒ:#Ƒ[PJܛxd +n8vn~`Yz]zPՑzN ru`>*036XK#ؼw޾T!k*7R8uU8G©mz $ 5:|W?RRR;j{vz{#?Ѻ5]wAO?i:w9M9lۧq3m[W>?'杼|67Q5׷w7_aRAJ%,^**vm%:WƶkMMMցG!$i 2):ҐDDp)#/#ry锱WTFJJJz9;i.RN:Q|4G${:?rHreiܴ۷lg1yJC/oT*ABGPN G]^015;2+z#--M oοq^7x]{ȶ>y%2Lf Hˣ&HHM.ITIV.|ܜ*mײ ,GTJ$2@^^ɪʼn)gˣ!b{dDM9[^<!Ze{aZZU|?6o{gF>~CpsΉ+(mIx9g{lҫlI [G;7dHWq-'LTKWhps 2߻O6nSzN pU|6b_Fn\tU {0rAӰNcU֗.-T ӳovp͕˲|V.[k#7:hĔ S6M=عm{4w4}Ç̹Y"Oy2ꩺM ܛz뺍ғ4Ә#Ab\u}h}ڷ@t=rϬ|rؔe̝jݔgTU4kNғgO3Og2PSݻx]4G;'|SYֹu |} RyYbt053̄"EPfƘ]ȷE}j֊(tmEͪNx4mJek:B7ۈoJJIݦ8WsfȀ!H$)d䰑8UwI_Ԕd$Tބҥ]n#v(sUxz-jרôIHH'MJ$I]z <(1٥5:ѴnS._D*Ҷ kзG?4;5b9HKV89><{D :p( dK=WMnXy{LHg|=vs(OVbX}9y81fZΞ9ǖef9≠Q,ZCs&Lrr2&GO2iL*dM[~e׾VUܼ^7!w8z2P~+\|E\x5lVyI֬\K#u m$LS.S[7eݹ}Tܾ{IJo[3q wllN?GzqN^?r~w9嫗knmٞ2%%%1idƌEk۸###APپ4sw%.3ӏj}:h7i؏ٗ qQ~Hד*bc>|;nSԳB*7HHHqnߤ#EMhEx;7s0M\3fxIJx1%AVo\ ٵc70oc'a^Y8g؏ =G'eTR9rHLD*6қ';i4K,jڡA_ fT˔U(GIxlNո| T?vMJlSsYvMv^m߆R̳9yg/'۴mmm훷:c2f%pusΞdxHhԤ<޽{*\mmm .p^zhjjrx+Es|G sM*VY8sLCJ.\XϞs#&QByj׭ڱ;O)TEghiiQV"V׾bhԤGeTW.]%t$%1+k+:tj[s7ܵ')SS3SLLmnnNuvj$shbSBy [%11ׯ^' 8pSS ꏱ1ÇMȣ̯,-066ƺ5% KTI|Ξ>]5;پe;ڷQF4c/8{\#"Ed6UH+W6RLWVvK+lx5)))XY[Q°~DU}>y2sL*T@ըf_Mi92(i^%iպؗl۲V[ұKGUC#CLLqtru[OAۖmq)^-Znť \|Uok:PŶ *Wd\zb]dE]SSLLM7P6^|9,,-ӿ |R==%>XQFy>m1y7AQyT v܃WִnuikOSgs9饪TWރi׾--=[bemE OՇU*$5߻.A*U=ѭOIVAWW7W)R2*(*PV *o[7q-i̲ˑIToVڶ"'LVaaX)0 U\u]\p"qx!>Cx ܼq W%`lb—/_MUaϜY` nMs0ѼzJ՜2rpXqMg^QINNZb#ʘ=o pkڜQGHV3m_~ / b_%GQmuaUP\=]R9֥eu3')ZTG1.ZT… 6 Ke}ݔQyrz(#.Kz~?.oۨj{@+ȺxIH.AJwT^؈}޿{&+/hԓ֑$},DPq'!K+ ao)R0&&=KkK"#ަ .B1b~uᆆ%1DJt;ee$II}̛p,,ꪬF%R"*}-D"ȈHduM~)}YI3T씡._=2o|&OE)_1(n-!/qZLl~߀x6@&H_3jeelUʯ[GCu)_Gr}lX-M…=ރX4o1rl4Kព&ZZZ 2,,-IIIQ/_)}7 >>ĄD+-=[wn q頲}qkƒK9 ׂ5OҒN*,vx7Q u=ZzuKO;AhظN-W*cmh΋@ƍ]U,,JaS2GZmԈg#e9EȡB\ }#KR"0( &~bug`Pֆՙ4v2񖧹C,]7G:q?)lneioldߞ vL?OŭƊ%+te077GfϘtX^½;g̡cn?ueܾygO3c\Oյ8<HsVP!Zzd9bʃ9~S6GBT*ֆ/U~dECC2et$o#w+US'N勗_ f_Sl+T,O%Xl%aᄅa4 ׯ^˗/ad,Q׾hii1p@fϘC:(UJmٺ?| ބq`AN8Ep{9HTdTBP'ۮZU,,,X` եVg]vN2"##y$*TBSSqqlɫWYr-oB9add#nXXcݽ#ADFF+^zR*b#ʸu111hPlqUU?}Ə!DGE? .{[%^mZ;إBẊE{L8 w7)C-c̹%"tԨiϼ x7oǦ&=]WH?9sfTJ6-9t0'(^|WHR\C P^ %Y 7I'өm@6zfe/]:k.jKԵNfosAKKKiܜ4u3bT?r fNE;+V羽aǎ;Ѧ-|ig& Ŋ~z'444ToVuh ,WlٶSش7,,YfժV΄Yha``mXN ЩKG֬\+.jݦ5_ʶH27<~I'!ác ga h̽}{ f\l4,Yoes|UN}RGnmDkWhhh`[ 3fOT#`U,})cc#~sն5L8/_Pu[ iѽG7+ۨjg˞{9ߟ%pm撧--_*{022bۮ?7{>[wD*RҼ\nӬ#F2s,RRR޳cƏΦ<_kSP.נ.sfeDGES߷mXb/{0022]\U=cEVүgѴtĬ[oV+AҧYdƝ|6bp!R)VXe5㾰hb"ޢST:NT*gP_=Ta &'$K<˖ Vз+JԽ}"BdS:3zud(R2rp֯@t; ;7V04*uY`%{whxB6-C>ϚL>~ûVeEhI ݕկhlX/x6nOg'ۼ& GJy_qqHҘ5}6Kgߴ|]r|&Á}?r ϟ?!lX+QQ۸F}|"S1112 _oZRwAq l+}o5 *ޟ2 P)8eVu쥼4_p)xr+!8i ( (!$GbX'))))\|HRXTFDx駨Ð\_D^/o')))9ґ$&$*9_xo~R`_Ͽec'e[pWIzqow曼^Чg_p"Lؔ6fyecI <|u/m+gK<{_*7mıtҰsg͓1id>yF:G[!Y|uuI)}y><7̛5*nRRRf5[Pec 9Z5jhĕS IJJ¥ܐVA^v!qH%|}6)([E[xQ--"##iR/eͥC_׷>q$kVWa[ՖW*b]ښݻ>1w<.HBB?b:>#5n$|~dd̛=GCXjJ(΋/0/7G[-‰G]6'ϲy]RSS _a_7p|*VDd[s8iy2gH~/RRR B)R3C%|?LLqsNo 2{N:&_:qߡǠ!OJJ +$R6;~ Zd#|ǎceDDE)ܭ$M ~eŚ G+6nǚf۔GJ\ |&^2cv؝G!YsWf̚.:^~JJ5Oy7f㧔PQݾB/^!zueJc_CvkDxÇ 44/TTаQ1}Yfv̚'(S>ŋpBhٞOUHsw>ȣ=s7ωOEVʗTKWX4ooBÐJ\#̲UK>ur((2eKI*[ 򆇅3l/a|+k+̠N,(\x}y)s:wL6-Y7s,|Bre2}hgr>~xq~t3n}9y-Tp"&Lrr2-Tė4x5144dȀb}eSc:W ;GCt2~g1udN!%9~sei?~\ˉSGزwfӳk.9qHJJfej݅m[fjgO!pan\,.Ƽz*VT\1ϲrc 97.3=8qnIrdR._¦-k<ݐ;V}dnyvOP?̜cr7&kа>'߹t!sk =mgd~Te ݐ;m?ĩ 'ԞPشYSs93mB*s[/oŸc8{4:g¥t AУOL7DټR'g'g]FMP3z(N_8Qu|M]_{wE}q= 9EC(Bk-]JTJ=+("EZXlQZz`UnA 9fD}=}w$gf% %//O@|yX}Sd\\|)gBd={zWu4iZJIlݲM)zWO铏?'D}lY_iuΜx >4xPtdUWW?>_wOVaQ:՘n=)7/W ?UW|$۶'t変٫z魳Ɯz[䉧tƙkYgSj$6v[N ~ 1JAG G~KfLedk#Uއ=L:twLkV}f{=3*,*ԅ\N]Bnݺsκ4h#$I-֙grrst,Izu2o^NEջWԏOڭrrUXT ql:nPjZ}^{>ىwJHIBB n+>Լ{02-y"׆~F­b(7/i:jW.ݻWUUUi6ŭ8Tn٦ӆ7|yxڴix|d b\_ ̞jjjQ%7%$$ _%%%+++Ӧ6>ߩzwҜ[nҌ#=vycٻgPQ*++;yW=||(RUUmq8[jZ3b7343jjMzJuݷѤ긡Oic5z4G<ۺuڴiT uꘕ*Bf]hM=VKXc4=~6Uօ\]- 9=P ~@;vh sM^FF`%)=#=8;SWb%''+///xK*)wH]|[򀜓FpFc%$ȑ6m(=n֠<7m|~)]xx:6͜=#6)$xc[Ee?j[lSnN ܷ{ť/4yxzwÆ֛x[) 7]NnxM9S-?kS>={gz_K5s, 9ks<uQ z3X]_h:Uڸase,_UPU1c5 _555*).xLII7III4*]6Ry] ۊw}VogΞw֬YsXVmo,ݺkutT޻[1SzFzDet0~%wPe14z7"~nls\'V-;gŔ_PڈÛ?R ;-Ï8\3UkTR]׭ouGPeHc}A%%۵jꈾ‚=ojbz lYT[S {&r,$k Nڵkk׫FG צMuuVh'-o5z ںeKԫw`זI%%zWoQ#%IgzV˖.Si;͛6K~bֻyfm޴^t(zvi'/֊|mZJ٫,ˊ2arhtθsǛ3X[XƝ?V^jGَfHykVPHVnLeK.Zto/icgtњ6eVZ"G㱨Hkm醸y,YF%%m[}Qn-so_{Colޢ6걇)%%EEb%mq9T&B4h}'z?#X2clyj=Sߠgщ'w%$r~CWT׿W۶nϾ7_S;?ߙ]|kjçg]?[mL+Bƞwn˭҄8hooC^A,K ~{8O>OhYgh-/Dr5jժ&]1Yu‰4疛_ߧ_Nlvˆw]=Csn;Qc#vZȃ1_sلK4mtvpݯx*.Eڳg4\IxԑzEJKK$y6e^xE=\="ͻf=xBSNmwEܵK?nv֪P3f]O>1o%9m32t4%I'|n3Km/ٮ3t変[ģ;f=&MgNS?BNOL+wm<$|?˯L{ܱDËTyڶmc X!5Zp߃s+7+'MTRrn5GK!ܬqɹg+/fW׌Yu sdS:ZcNݤcղ,ݷ7;t񅗨rW:v XcNn&OfUmmdvry,[Zڻw u7+11Q֭ZSںeէo-|Aeeulg)%34{ ;uJMMU^=k?pM9MwyvPzz=PRc{qc']҄K'FY%Ļ'dffjՍᅏ@O@[Kh '۱^(lV}ڵB[K_qϣU/HkFч+)PjJ ljX[KhP!Jk&y%);3G}VmD/`sfTIS>YXjf@•dY80004.˞}{TYUZ>MRS޶RbNbJ?/QeU4oW~-4z}L z}zf9ǑeYѾ9dY9uׅ$wVǼ([jpyޝy0:=ꪨ,O!GmZG;wjuֹz8#)\0w&x_+_oè }7?yKXטߏ:[eyJ:[#,ˉ޺X7S!3L@ܩݔ6]mWrCCȲ"¤%Krl{r"?9^voɱ=&?Tza׶m#| {8z;"V5t ťԵsWegȶ`e[yscKlɲt,un&4%Fnv}吻{]oڱmu{?;r+nv减 u-mdpٷGd(dG<# nE p<Ζ"?dz2iB  x6o,?\=^?ێ>r i׫L]#Gmku n]ٵl;TTJ7l V0/ʯ8;K{ˉ,[I,zQ?m1^֟LٺUd?"gk#-? NW˱Ge' ~0Ɣu6E IDATB@m #+ .u[!$UB۫({T˯zNBx<^dd("5ZBWU2?p W0D.ߝEȖԩ{kcףm8 ZRxqzQ8X"n`ۯ[±?`mV,ۖ_@Npî-'X,߾a Vrx@V9D?#8>isZ?KY -f  kVáTUw\sk"B?r9IoɜQEvbdw[ʨW9g7 ?{0+(;{[3;$t%?Ine~3l殓[>xS}ّ` ! Fَ-> )0WR8؄8*ɖnڄp)qim'<a=Vg[{|[wV-vi+"#9  /?(B;n@SvES/:Erosf/u $9 ޸џ޲,⭠ r$Pm2hm ٶ[pls˯Z4nnpiP{@[5FNmYu\ Bde+Α7Jl ;2zr~`yV<MW#xLAvQۈ:-E\s89#-YYPiGΛ  GպS\g޴ѶᶾrAD0EDp_dgF@󟫨PIv7.;^u9;7xV.b ١wҫX[X~dmKqGZZi($?55JLcvBvU.#mbmfrB"fT;R_lr egg_[_^ͺP(Uz0bDo=p9n3fhe\ZbԠ_QC_39] ckݚuJmNWrRJK4媩*)ٮU*(,Ьf!H*+tۼ;QBB_3]|E.җ_mqƏ4ګWG!{\OkŢ:,Y'sK,=ժU+sJl(I/줼\Mt9\ Z*wuW.5uՒj=it`M$@h*u[ۻ˶m}FӕmŚ4j 8swҪ²ժU+=];y-_d]3ihɣj]g;o> ;UOVQ">gx禟 /s[ӤE1pu{ᆵ}{qlUԫ0_Sg]}ɁC8l 2h|ն/B:(1ђ2zv3juJLLԥ/6nؠ}#f '7^n;KN?sy:{d1B-mb1kTQK:FKVN+d'D{OԼmK Zgm˾vrWbbbwW֝J+_Z%X :e lBB!y5))YimT^^Y]{ZI7θ] GٻB!z(g~PHm:e;2/v|~Uq?cqC4pБ/ИFXQGz@"^G :RmWid^]OXt6'$kP,KRLԪ4jܙzqȽ8ώܠhX|*寿cGUJKJ5hQrBw 7G'2L;vМ7UbF9ks*>w-! WIcƍREE{w%ITdI(%5E{_m+䅟7^Qշaw-bgSuuM#FH /TvmTXT_+S22ҕ֦oΝh"],"\:{9Z9e9:dejuzu©ԧ_of[i7\[f߮ C2v3*SA-%+Ȓ4UPyIHII޳&\uοpn6;|@34f(v(m|x;[_M?Qڙ҉)11AޠU[~vj ՗^կYfƮ H<۷ݪ']{n*u՘\x|>yՈїtF ozJtQ{%ׯCU;vkȫVҹgk떾dи b \?.eixA_"<p#~ҤZGU9j FwonoВW}91bWmn֝/?֤8 ":grwڴi{_Z3|>'+G*ն-VNVNܯ# Fu-[rrs6ݡ=Uۧ۟m|v%aq )Aڰemz_+Cmvciڏfqt.y4aR%@tWC= ]KQG¡MB@ d@@ d@@ d@@ d@@ $i;/qaaYIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/config11.png0000664000175000017500000012442013203343735022340 0ustar jomajomaPNG  IHDR gsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Eǿ{%zKUzQQP+ *b(bAE^+"UEQjH_nw?.w\zg7>7;'QݺvRKJ@ 'vK*V(G)NR(^1ږST^ ۗZJͩRa ?:l]Jr+XW˨áܺW`g_JJ678&f_v}ۖ~,UJI#?h֏A- U}뫰}u]ZiUTd8TWŚ.=qjUjM(r3%`b۬ZE RN%gW|?V ((>tI+O@ @pݑv$K` |kV@ @P\Ύ?vI:kBUo @ RT__!@ 8T1},@ PUF#FYVPFVEťO*CV23s0H7W3oBQUԴ }J@ d2ðt@]?oBܹ˹+Ke xx_ֵU%,c0䑓$INRLf 2$˽ʊF灉i֤1999|)̲s/FѴ+YȲLPJUU3ʼKs/V@ nyy$!UAQPII%>+;JI͵gffU}GJjjAZ?\]]*]wAFjEF2;_Ys_|-^nU;33'MMfrrslgM,AVD8J`Oa1X#Fd2~hU+ uq1<FC3UZba0HLJwww..H@^^yyy$%kţe@f>? ??DEb6699r F\(321ˊ-xyh0d5`ϒv nz:@BQ 7@ф,+h4Z_OSlEdQPjzeӦirGb24mEUIJN'(NãEj/@p-*Fc/ul.;ܲ 3лyrZL ZmWd2'nn=.ڵj Xf ~%]`@[q!:v˂Epw' OW@%3߯ i6~^ndd0ccDFF텪9vEW&TUL~~}|Rrr6]:@fV6_͹c2  {qBlE~U^{YՍBqY~B>(@*_3@ 8?&9\ 1Hr@O[Si9xDx"fǀp/p,rX y(Ǎ%ichӌ0YN%c2i _(sFӒǀ[oCl6#&;;-?oh2ӺUBukӊ1ɢ i1p1x`?[~-c2˵7䙸wBi*>>޸ϰ7nܐ&coVHP{W:n@ L`(f 2DxpJ.s3man2 zrz&lTz,+uztz=[6'#=r>`M] -pEQ.cH;?Ztӻ;o̙sO?ͽ{O 5zDZ6gEhL&Pu(F]:w8r8_R3A||`z:Q9%׫,+ߛԴkmY "vPsP!~<5'smu\: N )%rG^Qd"=QdqOXh4 l* S EbDZ `F$EAӢ( A<|Ȳ̡#G_nP/RӲ *Xfy3l{IhdY)5?/ψ&EQhذ>M"zĝII>zE,QUՄјgKS$[lҒ%sFj$ᦘ{*B!2fCGӤa},]]8p&FNZ ]Gxj-ǡ4$'F164jY+ Nñ'i߮5o͞Y,_$e9VNT$ s||F&4-xѐkLV0 ww Kc-^wE6{֬Fգhpuul.nIY'ڵmE7ѭM;~WgE;s<4W/\l*t:͚6"33@[Ntܑ}mHX^@pB,57_`CجjE|,Z@4i FȖfyT&SnHsW#Mwf<؋>4YyHcK,*3?.%Y~=EQ #/@FFmes?!nFhH0iW9w>FEO6Aߛ{!I[mgOqsc08 |d%)4k‹OʕtY| Z֭ZHgdNlKl݅EW2nh0ţjpssaҕL~da]Iӝ6TbY V1Oz{043&bJJo ij|C~I6պT8uT'$ ww4hHnnfٌ2m4j.\x*b&!τh4:w݆<F%ukqKϰ̺Wiyyfǘn/_wh2-5l$j4*0e K$ 4 ^YV5ڟ.K]_ QU0i RC1Ѹ{nͱdJN \y3 WW h4YFBChذ!AAH /]ILL$''u; F޽{2tp|dCk@?,@pPd +&JBӓ!y7YZ4&ɔ *NId4*$ipu/@ ,TLɠk(e$Yb3y,![ңVfs_vؖFN jjQ$޹GG}6=si3QT46ٞn':FZb!@ AӰWawu$ Z^$U.έ[,@ D$tZ-P ғb@ @`Xb!@ ء3/%@  HK@cXM@ jMM@   @ vY @ C@ "@@ @ @`@ ;D,@ !d@  @ vjZ@ ͱ3GOd2ִޅZDogM˹1䐙hPy77|p{G@ 0i}t7MЭu/=}jZ5Jfv'㷿}Դkр@TUE UƟ&8Upw,Hv8@ief@ l $NPu=|}"ah[$W4EQPTP94_/?#!"@YcMZ-ԭU77 Fΐ,ˎ6qCLs&-Յ9gY⬺j/EvmN_CiR/cg>u3&Ax{2v%IBA:U7$@Y0HLٹY]iV?gEtrXԍ3ϙT'glzgig[|R][DE ֍kHLn]a4h$;#dE.>+bpc&;̜ $IEJè&s^$$Z5nO"g4Τp>9>g,8_UWMs=hڇdϵx{`29~u16XI.$ Y13K(%UwJ=ލ\c"c$||qsq#7_/_LbϙT'glzgig[XP8qc-Yr~׺>UFUTTE,P%$IBUUŖfΈ/#T.@6H!Xfc(eseaq&9lM~qV]5B)AxPu7`Vd$@e(e:+\U{Gkrrpw ېeeW;&Q<, ?gR]8{Mq/Ϊ*&\W|_j( bYʖ_IX["* ?ږHT* :22E *,?gR]8{Mq/Ϊ^źRs% .Ҽyju<(e-dEE#) [Q2 R(Ԃh uZ=b0S3"Neq&9PU$BB9gY⬺fQF>Fv˵( ))WK}=)-h<8pvn]s2d`VXooOڿޏ Cz`o5Z'mT{,kǵCzY9xyzV4[`龌*ۣ?iiW>͐k}nN.{wV_ujhm릟N_gײGܜ/W[dd2Ul<;K_eYlqpq&~Y t˗w9ڿKHtBC¨I6m2y O/Tn萡EA-3vm #iBCˆOH(qFk@hH֧K,223P]^xZسw7lBH3c/{PJY뽚Ǚm`+eeYUzdElYZYmUd{U+ViW9wJ0{l8eyaƋBZtՍ @Dd8#F ӣRҽWwwgлq0֯Sڬ?+[7̪e9uz= 5G&ҩK2myZTUe%:S [oS_X4VJE}odfdBxxʃ299 y{w3ݏXxEu>6zd۲q+psuiL3fΦM[{䑩1춡Uc<{xJ7s=>uQ_/'2ϐbo3g|D6}k0LxU#s~R]zֳku?{ڍY;vdz%4nڸLMe8q˿\^e!E/?X޺- rj6V[#w9 d2O"<<ϳb r++׬G\K3_Qškl߱ڵkpګW_e^} d ' ?s<ɓ'YryU#0y#EuϩۖXTusjVuuiն^^E[$$rsX:mFPp -P>'7eVnۇA#QlMr5bw#%#ka -Nff&ٜ;s yZDpH0L|~[}Յhbm{{^zY)+bOwxzI$ISU#-OʥyyKoPKɟX۫HojJ*? R% ^Fe<2!Cw8FuϜMHh<2o*`g+Xg;i<ӟ}^pqF:O:m,}4RShܴqdffd2ϩ;Ү0e_a4PeQ_yKV/"<"ܖÏ[g4\O/O4 J]y楧1~ޚ5.jGEr)t K{=y wj"<"ԺdEΟ=O?I]]PJCE b_NUr4YY2G|Qu4[~RGXX(aatVSO<_)^^̙/|rCH/_e߷=СeDFFX\j  ,43l_@Q})gsHHHm5w[ n֭˟vҡ]Gf ΏdUK./oO>a[o@hh(7o 0_kq_վ>V7͛ݼYa%UUI#99 l۲ ??5iX "@dس{[6oO> >b<ܼlU.%o I>~ބ sd|\]](̉'آ3&EyaƋ 3m{GQT<ܗnc~a2Yѧs d#OXF彷ѱEg:茢My|'ޟ{3IObtˮ?w2yy>xC̭=m9ʸҵ];MEȂ2mT&`>S=FhX(IIo|i;4mɓ'PU_m]vcOL{g{N˖-chlZWY gؾW6[ LzFbk/3\x {98²K  (Ev=ѻ-[w[xrS$'')0zл-5b(ZZyo#O0`A^XB}زi+#kx;iY9=PK uև,3*pr"O?o$," t:pAyD{NCPHal\8 kZdE)qՒ}FeuG~PɤG'oxe|IX 0 IDAT N/Ȋ&^2_9Ndѧ£?/ˮ iޜ7VʥD^yR۶Ssт%/|ϛuȊ{sާUVۺV-q&e"󏿐eAZƺ0ݖ$VEK9z9KRS0yc]Ÿcy~K;r\8v+>ЭW7"dEy=\>Y 4~$+ ;dÎHMI[<|?|<~@-=.EaA%7kޔ+\CVlF7s)8~M6FSƱ\x;CVS_;w'^<0y_['e|w:r[ʯa0 lcv8ܺJ:Ϋ6.Sa2{>=hiUt5km;eEM:r۷md6[DFVZn΢ n״n׊WP{V-][yw=/{O_xxy*ccWAei xeJJ_wʊBᄑ߶1=4j҈@UE3X wj'==e9Mbe-]4="<[/LhP!o&?OtL i2aDv''ObϿɈ#%99D /]aFԎWlY//oV._F2lpؼiMNN_hҺh:̞{x,Kmvl3Z7wwN(n#DFE%IQRSR .ok.sK>^_vX.ݎ/խ_O:(Wn|+]w?( G#eLQU7wS/<(lX;_?_OKRbm  ={V/Bj"0(PĿNK\ ?Ϋr9~Я&yHETy6n=fgusONSe]1-|2I\N?'){"2Ǐ E4OXD~~3I\,&:V[yYE??ԶIRsrYmZEQl_Ϊe?>n϶}:ҶC4d;onɦ+4Xj4v'}UUuVGzV}+DZjoEM>xZadgeӮc 1&# mHKUXr LF AUKiHNJFU갶Q~m!K,c\>>ƏGuT_|oahuB6%y&&?^^x{{ֈ]6Ǜs16uۓ>za||0hն%jb*lL&#^L{YM%Jo`\Y׼YZǵ?kn,K$ڇ ?l]Ƕsoϟc͟U#I/.iU:)3jEXdQQ-K(}}| e㏱e^}Uޝ.xxZf'NH}pquaPUw222JСhUL5⻂HΝ=kKe .Yj ٕ@Ѱ>|}}oݦ5_}%bG3vؒ}iPXiݬa-M6dee@Qb#k罀?QU8zQBU4k;2b0zfZWqssa:/\sQ{w7wbZFp?=,%K\8)n8 en)o$T`V͊hǵ?ѥ{g7k] BBh$>ڰ6nR(]'//V^ߗ.,)Y~>$,VTU /o/9=C@?Ͼ4L+Ͻo}K_(7_붭P?mA}r,'EQ"%)~k%Zgʓ0j]s_BBؾwdY{>Ji4ϗsgm=׶C61ޅNWٸedsl yLF/'T' ߴ~3ZbN]:WkQdnCdgk1hݮeKUU4 Zz*87vT$oXV/,nk q Zf˲㷝|Z>uEaF,EQBQUXg+ myTw77ۅ@:Ԟ{<0yo`_>8Q4ok8zK=|lcr_{اeefڦu |Ub_!A*x׻1sظn#4i767GPu*4UJ#dt.:.ٰ~W.B~Z[N91t$cǏudeeᎊJ:7~,aaxzyNZb:.Y_AVƌýckiۆpK+ZgcoobccIIMitSbә>I||K0޵-[B`Pii`kceE X⍖mZ2ȟU)Oe]K>Imf:0(.0f W&ۜ<~g=O[b{Nn }(ҳ̲ƊyRUU$TjOރl4 - d.\_w0yc%U޺ ҰqC6=Cbb"6ş,eϮ|9cG[>hdA,YCsYޛ>߄_}O?~r pp!RSл興 =#LTay}s_ /{VTc8y[6n%11GکH~_wp1"Ξ_BXD(=oNƕt>d qqn#oTJCFbɂs7IIl'EU723x{?c/r6ߌ*lZAٚ,ZEٚX+:#xbW={gϱuϜ?wEUإΜgO[?VUApK>,h1ڵήuݕ6Z3ݏQT7bl b <~PvbE?Ě_oPrmͲ l"אKT a&~+ ={B:s?_R][h:uȦHϠC(BΪkإji  \ۅIQ-Z#ضW.]=/CŸfTTOOOΜ>!π;pĩjK~\)Bhx{w僷?~r \t /0wpqqKP4k=Rђ6VGPP #knL}14ޣ[AY+mۆ[㝹-_'p ## -q+߭[~w.o1^{sa>b5vZKc/#˖/A6x8=g_KJr2x-ݳccK)7Sڥ܏m[~D. (B>HĊ%O`_fk=ql3?ȥKX<WW^4Z 0j׉՟0zzMc5Mp7,F#O>\mۧMx>Z-/?YYY̧)+оH4h܀ǞRo*?N"V?|OV%4,# 5&GKHIIˋѥZSXz.ƣjר>}to[rׄiԴa5Z}>vt:|HRb^^^nߪ\UԿ_>K>Y̧_%';:u@u8wՕ.=:3'm8̆6*QT@Rmo֑^zO'ڶsC21M m0\bPz9q^|?ȸ.7#77!#Y0V fOoOΘ17pssN(_ ]G&`neksy땷f 0s+Z[t+B/[w-Za?~\z[4cGoZ,𰧪紂|PkO`P+1?~+pB[ڶ_.oόgf?bFQ݄0qBaÇ1l=~X[;wÏ‚Ok;$č_Xz铍(WJ8oމ)aGKH7&!"2f*+&nLyҲΡ}U Qةkv*Yy_V<.Fmlddv_J*; A=_\|P|. 4d69\LZ gzf?Om6gOVUWMS]~F6|xx3eդuzv?D)\]Yv]tlҘum+9u$MGd$$TT:P%[,$ z\9>g,8_UWMs= NrߠU7T:=g)ujo=\8IKu}r6}ΦYpV8zOR/&T'RoN=[U{Gp8@6N/5ߑw Ls&-Յ9gY⬺j/O-dc(7"\Ս+xy8dQxy;q(˖@,?gR]8{Mq/Ϊ^R'j`~coG%Ra* rs|mw`ߑ݄U){Gp8@K@RZbI ǙLZ gs6=΂Yu4׽_ !^iAHH\ETTTI /^omb:^~"8 '%2nD@Pv?+o2d 3'+Y'{:}^V׼d*k*@p!bG!}t=ӱz#}@ UG$\nzQ;,cg8\@ .:W"Bjxa[ @ ;$I䰭@ ;D,@ !d@  @ vY @ C@ %=Gؙ#'a2V5^BDp-7w[@ 5U n֋[^x{ !]:**8w;RӲ@ ?srst#/ؒZo:DDl=3@ y|mN_uD_0MEst`4p. )IȲ\ Z@`֪ 燒| y8ꉊX24[אG Ifx{մBvnqc9poՏP5-I Ad UUd2r1Z5nO"g4\>$ + ́S{n(?ShݴIjo$È%t}PAVd̒/n.nX~(⃰pŝiV&Z (Aeli)5 i DbѿjZ@ 2:z?oW;&{Pъepջ& @p-sUd?6߿N:mY "0Ei @ -3{%Kr%>f%Kزu bİ']5=bFQ+04=|6Z_6ot?(ʍD k iF-_bR"b #26m۶cʔeXo߾}{,X 'O`谡nӊVlUe;x cZӆ 喵!+R#ۣۢ?7ksEL7i~(@ ƗXLfRRRqÏDEE{a#ؽw7nn#DGGөM͚ѴYBZ?dUdeeU EAQKRSR=nRҾc;4:8Glb>\> 7Օ c:rꗥ$Μ>˼gxzyo@_=5[דS-3ӕ~XY  XXѲe III_9|$1McY| T1ցDՊM]ظa IDAT>!}NxH8~ _~*Ԧ1/^y-Z"/2fNUQHOOg  (OTyF4^ĺ-kykdff2iCVj4jܐm[N~z>z$ ڹڰ<7{~jAiyYlXm3@ \\5Jʱ/%K 26.?mv}|HMKeԨ;?~<|1&>?вUKTTwh~^믾)靷e-|ȲػRA=Ǝo̙]WCVTӬy>ˤG&p9{,~|U{7㧘sC!#ұEg^",z~mڶhbEl\ YV?V&?0ZQwf\+*f1M9wl⇐ B‚ex *?@ [bQJiM-fL&1,Yooo]umW,[?3$IŶjjlkXK,孷ߢQql޴{Ǝ-f_=f˪\졬TdEJ[#!.` 5 '=ƈ;ꜙ{秿$ ҢUs>t:?nBdLE c=dYaDFE2NKMԉ2gug/p{shZiYv\!sfK_kI_r'00 >Rn,?RgIW,N*E&33ؔ,Jtt24W_5^WƏY?{E&NH!!@t(EPAl 6TEE *RDQ(Aic{ÆXltBHH۝w{% 5~.򝹻~gvVvLya0|F9 -O%+IIF4;OƊopǽc{Ok޵-X嘦p~>|G _H_}^O:tbԴvh$?7~} pȠr/ Bds=aX5jD a޴ 3ósYf aXr?uvJ)[.gN>焴-\ʫk]{d4>&ԴTbbcsy{omFFVّsL66[Wk\2}y)Q4oxw=[a4he||^R{>e󌏏Nrp'w?i[A4ƅ5hhhV~d, QB.>_] aii,X*?ngtəy湧ر3P(E2z(]ѫWOu=]O>k?b+Ny3 '0=Ϥ /ϙ˖-[Y:1<CdP92$`+2{;v/?J~~~ u eRJJK(--5>s=[n| 8R  BrvhmР!o+Dmۆ<߾CXY5#ᚑ8_9{~'fMo?缾}p|.|!Ɗ78ĮߎK_YRއP_3i&Z>NBݔq\|elk|q;伎Zim۶c}v}tB>}ꫯ 6бcGuFZZtЁѣGcӇCKA$X<:uHOOٱ3$/a\9txZ'fǟ<בs;ocUZRw~Ofmhլ oxK_߹C]VVcSSqZ3x=dFrlc7n KǓԮ3W]1[-\8bN=4:>K.ʳO?Gss;1tx2*M wUVn]233iժ&M"%%>:Lo8Sʕ+4 MӘ?>ͣ}{/rwҨQ#;v,'(R|>3222*U_AAA>@KXh){ h٪%{/ym|]6]q){vFWֽG_ǘѷV>:w߀~Ԭy7E:uױdБ5ǦO忿Ͽ2%au+)))ǦPP?ldŬ{w-{%&N~u&yɀw8[Ѵ(ּŽwn +߿={о}{v|?ͥW^Ջ3dsiFqq1\vY'j*~m~m,Y /nݺ<4o޼z P=r%x$oӉv9&MY?]T5v 9sA:,kF\\qqq~a0WihZlqcŃx¦S3fOgi㦠M5%A9s| ҨQC.|(ܥ39s2t?~]Vӏ?WpP?>=zN{Tؖ 馛HLL$))x3fЫW/|-hذ! 6dԫWzf͚qUW1p@{9+i_aϞ= &жm[:tUW]śoYa]AAyD.ƌ߀TnB&8ҴY~.BmxZ*7]vm}ˍq\yՕVRYӟdٳRRSB摒Bqqu\7.عi7 'tN&LK/^z$''ǟImܲeK  CRtXq]AAyD9"ɮTlZJ)kU:$Mǧгwϊظzy]>7 {,\[4gْ3χLEqF /S7KIӦM+G&MX|JLjj* .8  ,"qy Þ|fL?K_͐KW*}rrt]G\8Bxl:_~;w䧍S QQQ<$mn디KZ!ZM6w;MǴŐ!C{?`޼yXQFU*}JJ aFٺu+6l 77A!K,iii{e.7}lf>5Bȱ͏tͼmy.17dĬiV*ko+iy}K`up)'p5M0遇2h(J4iڔE_nqU[oō7c=FӦMYx1]tT֭[ss0ebbb?\YXWe  &8V}ɈV= 0 <'?W^(k =6EH9EE iy8+] LwX{ ( 0 ×[N` L5[d(gs2ck髝ᬋ+~f=ہ+;ߋO p ^PV B#z(zXPȂw5tZ~&MyY̜6[o>X?S:s}?;ZIڷe~ G\Ny9/G&Me7z>UMʾ#RD {unsK*=&Be߾}];w:'9sXfa7ӼEs~a#ڷ%&VFM>cN8xbcc0iry/adP]`#a 3QƏodvEܞ,]!]|M#"c"T?.0Mػw/.g_xǵ$))7@7?x/v:n3N<2*C}KW0wy}S5_{y!͚7q)xdң<6yZP:tX'Oy)&q"H\d,T {RNv,Y \}1MXi6m ?l`oqqqaLܹ?Xϲ%˭0]),,N:ai870t97K-~] |AN~߼giذ!{wgUX"ڵo)]Oah|LEt=+Lyh*7|_Ra]ǧLg'8iBn5Ms=cC{};fzv:O͜#xŧUQ7\Cs{X!;ƌ6{xNֵ^pSPBPXXDbb"W]3OIiӶ5G||<_ֺ?lԡ[(QP9 5]dݔ27kWzqnŲ7hݮ%N"c"T? #3-/7Ү}[ݍ/ Ott4=csJS*,<=xi|v:mڷ gݷKF {Q2ʬgfp{nhYRR+%-F9~߻J/<"PMBz(dS0H ˚UkfV 0K5}6999=&~&t93S^:{򉍍2vt::uDIq Ѥi`l嬹)_ϺQ`eXfbbO$zLG~^Û+ߤNu>ȶXl111؟'ɧL\\\eӧ`+iޢ%b\DEE1}LZmۯ겗)+-<:@ CDx놱~<,kt]Y:7/ϝC=pdD7E8/NLL 66=爓@A0z̍ ׎vb^qL}QF^5ԫΰѫOiNgmpӘѕ 8]oF/E.w?tL s(.흐ϣONfKDb Tbbbiuкu+~)ڶk@Æ 8q9v|Et?[*O˦_eӯ<5}>;7/nWl aoݝGx3XniPyGypE=)svtCYּ2n5:{*UgШ z]J'XBIQI/UMq~n'!jb/^ɏoAlߺ1hHh}-..A$$w) ˑEM.=¸`+Ń,PGۓ]OBRշgt#c"=ꮇ2@@WʐǙgλyEB\*pW#oJP CuC B?ZUʧgǟ%ߑ|pTg= L#>.[ﺙr"c"=꬇2@T GjzJHB(DC !MHOSJTܑ"~ h|FP8DYvTMU& 5Cn B#z(I"Y#A\$%&Ө~#QT\T& 5$gL+P GHC BE|\<$A)1E8|hFq BP8DY㊉ FPmb"AAA!dAAA!dAAA!dAAA!dAAA!XB7# s[#Wt4Xa(n7 -{ amC BC\l!==z(dAaxtO?fQ{Mmr)v1p8Wv,{A6߱2JhQ>Q`/L珙kfPHe!W;YWS{Wv˟o8h\뭡6HGP6 !jV8$xjlzD7<#_.)e[ ck#Y q KU(׆UӃ/j/@i"k6fk#{gZ #>ד 1;1͙$qcB^#aF= @ O'*c ˯f2+/e{ 0uT|߸+6eXk4%y8̸vφ]Wټ/G1洣(JS|æpm0U ?eYF7*S"Cڨ2@nx|Gɥ TQaqBe.?MCyo!@}L9u.-?ay#v/[aw(+نaBiѐ锹6/t^;v +++RI"Cڨ2@@&JYby`/v`\ ^r=Τּñn;8 jv*vŜ3^9nNqKfv(c&0=:|N$+8e  uX<4III?#߱_ZܥsUPp˖-dggV;= 0 v |'a^sX^߁)A:D1?93fYuq!l8{r­"U臲*68L{TP7-YB,^ʰ0 "Ca?mĕC >|Ðq~6_;uNxy+Aivl m;7+1ѝ/z1E |]<^нw꺎nzxto|KнݺNJk ÖִU+^=e߻=Teq{k:aYgO?qă,D_|WɀAxyŲ7~<첐DFSVVVi/bu<=[n_B=ػ_b\Pza qѕ; CËx`IۇS]v<%˵7b)XqWh0ח:{.\.[^·U+Ws'{ 11Wa+ǰkBW!֬^g}Y}c"ϵW_tq93xiˎU6|,_:݇NQٽ;۷sazithu<3p^t)'ĩ'=w݋f93y w!Z<=ܼR\rPɡm h2x>Զ }{O?~32fL'u㤎rٓ lGpԶ 3?ǷEЮEG_6BP!d~L4!ܐ36|N h9\zaV,_. wwii4&ne,ïF||äKgɂ>NbbygYj-ӟz)L8{nj /7W/Nro~>}eKת%ZvTtW z(dz06lt.Arg{.4; _]d'%.]O?l^_:{e+Qԭ[*< #kƴY\r`4jRSN/]GUPjEV,w;/iQQGTTg 8ϪϨG;;kҤ 3ɬTVE[iMzz:ǟБgwMJ:;;Ӯ};4hP){BQw89%WϣQN#F. >3wEG'͛7c(eqѱS۔~Ν;dNzF+E+Z" UNjj*;w$qܮ]PJ捳dRڶkCc~,xu!=H޽ԩ6\{(:=vi4;uPPB~L|gv CG)&yGEH\s'؛7;wYdcYXy &N?(?b\{(>W~V&w'+s_k牎4!1)='/o9,i*9Қ>!z(d91X-]Ή]Nt[uRR9ˉ7)).:-]wd߾BuNOsf?üW_ 11} +#w> ww.gv9~含0 ТiظX6jH0*?TlʚW;ЗG'?7_}ç=pHv\11*VO?g 7ʍҢ WL ih,?~,|7S* ::Ґ2 ՗HC }HJJ‹ֽӳȿEYRRRS̛gx H ih>^ ]NnXir8ÇrW0*M$zLiӦ4e~\.u2vt::uDIq Ѥiy$'Au~ڸڔ^׽Ov++-v;vKHOOͷqiҨQCǤ<=_pB{bcbwض6AXؼr4Cgxi(L<3NzTrw ruo^/<ڴk]OGt"Qe,Dޕ>Ó3f+ pt93O>3{opyЪu+G\Ks_bs/^`'$&PPPP=Q!v$qWyɩ֬H9=ϺIHg¤ ӧ7OiNgmpӘa6?s7ѫG0qcܞ.sì~kVeVXyGyz_k5m627 r9[W~@0z9|0t]gܘ)-+{nfnA*(-co)3Xx۵f3+pNMCmgTnTDz2HJ*@ B|:lnV.v.ѽ+.$$WiШ۷n}v Z_KhP D rpik?|z0XJ GjZ*Ͽ[*DXp*{= ge>AdDEkYB`cup+@~/F5xS"n]DL<.K^;w RZO}K-'cYu239u聱5GpAy?3Ԟ앝u'q~v[b8h/zk( !==z(dAỚU- Ze%э6ψ sFJ}V'+,ᘻ2 @y&vH70jyit{\pʵa`x=.˳ PZȚ `ˆ${CNLs& b{am㘐Ǧg DQe,!PB7ӉJX򫡡ٯKYk4s-C7'`7nJMuZ69yIl3ݳa@5U6v >9j3湰_)\9 *y6{C|uq; AP6 !aߑmr)7ep@GT8{peم :*:AšaPߟPz?CǁFBD{w.@^^111dffpJSkivls#l_=z=&MчQ׏![a?!7\7/M8&NuuA"mr+BL(0<%n?S胶 )*a|HK EEE[V[n:^xIIIF$ޔ" .|@ztwh7^GΝ*a3Qzu͘nr V.Í qǢ iÎmyzJY6ʲ00dDc;7CyƑqQZy#iӾ]h7)~OJ(0ZXM)f16q1`0@Yt9Y˹|e!Mm];0?y{Xx)#YEvNvP=|ۄK.8a<Vj=iiddԣ]vrޝ۹r0N=4::O`?1x%?#݇wzǑIShլ 9 ;LI\0P|zO?EWn9۩gsb\x|2+~}.9w>3<^ccBߣu_zߛ+[@!_e͟iYu h{¾-z諠pkVͿw֬^CߥH5:uW-kwboހRa#+̫2zx%1mt;7̴ʠ]ƌi8nTc<{7YS.tڃy/ЭeK_^8fv)z(zxD˯@NlK־ds#K4KƌEЮC;W W8h?oqaV˘C4m֔y/̏mu&^:K,1w{ʛ;/EϼW<껤"c"3ҲUK&=#&f*& .qݴnӚ{4iĺmc49|z-XvMz6nH<2Q<͑&0~thzlm#nV-G0ټy3ڴ:`ۅA$zLSxt'^:x6m[wS\\_ER^ɤf)SGU/[[:p㸸vIFf3ȨA>xWohݮ5 /8S>r]~C5H,e,DS1Gm`MtN*Jyu :2V /.O^sYӸ[Bz4K/؛ٵs7^*WP@Ro$QPBD0 4TlZ㦆?˺ %..o3TR( %-F9{ lǶmiۡ7wwG\eEYkI$zLCJJ Y Ѽ{L(S.I` Ϫs]iז-ͫ2zh(n$I➉p׃>gCjZ*?K/7r^4Kdq‰';o *[4fz(dr^>L6f2/y?opk4mڔ}g׮ݴm׆_~faHLL QPq2p+{/<3c4&1)6n{|xk*1jѮhx.2.b(7/s -[$**}Q)=ɧv3ugyxi(L<3NzT^y(= CؖǷMh|Lh"!D=PmIKKc+syྉ< dd3]m^}Uymv+ * =G=Kz(^Ǟd[pINNM}q=P=ؿ?w<+,!!GP39:'W0~=CZz\{5'xB+z5O,Quqc=1掛4]=>[Wn793e玝MIfĵޝU ZTJIegDQ4= ңQt}{dAmԱљ]{۵}fZfiTPfA@B 3UU >rx޷s ˉ~~U]|OZ=;p޽+m\}}cp6E1uƸOK_~^\G2Ǎ;g`_8?֭]+<^{EݻG_XCpޝqߎ^Cڎ>>"{0 Ʌ1_=vO䊋5]q^e{i}qæx7_;GL#~~(N߈yX^w+/=eo8W}'U`LēR#~~(ZFv/t A~q~:2tо!fIq)'p6!GLP CrY#ά3G#&ЉCP YEߔ{`otu9### H2&@!{zZ}rmtvGWu7H^ߊ93Dw`&6~8&6uF,XnwM2oZfDoOCD~?0DuŔS;M^~)!YEwOτ?!i" dFoO- ! ! ! ! ! ! qTymGc5{ Ɩ|-/سwQҚqc5^'kbq_׸+u[b=xD^wغ}K£G)##ɱ|Z% @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @B @ymGz;`Bs Ɩ(x"={wGoO;@^88֮_h`_]&,s˖=[oD^c^)c=uxlݣl1/gO7-]2ǁE1erߘW Gڞc5غG+cjߴ1/ć1x/Yg1pD_xXqqI+w02$2$2$2$2$*ˮ=bێ-wo=\'Mbꔩ#>nӖM7kcێmGiN.:#ftEUEYw9Ko/(","ksGDDm՟#:<>a(! o[ OC>Cmٶ9Y3{ uM7/Y4|YFѕp[_z?0jyQ-+"xկcD<"z"+WT^Î/РCW˲a(Weqx3cIcd j˶Mqӣzy^ޘoDyEyю5ώ"/?ɇ:̫mՏ<<@FyEYW.CBDD2JW#hjVVXdJF f6[(F*F2:p*#M 6 \D{4Ͳ[)y \Dޕx#QEy~ "4~#6-"d?aБ2_Y3Ҝd`TNztui9ڜUm:(\ɴraݜ,Lh1('nh}[lkenFjt֢[V7uo)E5^V#Y-|䬜RnMW4gU&""i=^lpfIȶۃi>py/9\']w0 -5JCoOSA8E{;;OhP֗_·lO +FԈS,~fҢ,@2Nd"Z\if.vdQ_لvqyuF;#Sd=\vȴhXɉmK},%Ǻ^_EhWs) `sgwz[\;77ujoC7O#/hGGX=:FHU`jgIDAT0B-O޴qc\so!Ν9>?_ek-jŎ;⚫g-?+ޫ(ӜP \_0 4'㢜bq1{r>pm\qgw~I8c=Ϗ~ߎAksγcy3~fE۶ny},Z0=՗8[6B :a qݝE1:yf9#Zr>mQA>":|B:)'͌'?ۺ gG(cKV9>7? 6onl%d`\eX=Fq׷Uk|K?#>ziE+jbm^8ʲV<طw_[n򔩓cq-7yd~(<9/:EhW#yqwipXv]yQnE\g/Q掣b86V-˯,n'c˖-[/ÿ3zfh"={)#.B+ϣUO+ޢXg/?+>~U?sFܱ+qz>fLKŦcނy1sfL6-XDlڴ9fΚ9.vXmOS20.s9"k,o~mzcUOyC|C+/yS fΚ_yiy٦o?O㪷\E^ozE\{{~ktwwM}(vls`XqvwK;?#7<<~FƢ֌O_?mcǎ`^\EĽ9/|nMmtgĬٳn8{8w|Xu98z3N?_`Ex׿XlYDC=C/wwAF7#O7#Nhbq΀|\@>c7wu[#WL˼a8}/g-{p~L>(n݉eǎ? d`T DĹG?رޜ֜sVdzSx_喝GUVe7S5dfeX**$;##G&OE&X,sr4G2䥦e2Ǩ qD"H$ol6guf̩EƍʴSS#g&   Knn./&o齬XV#"ԣqMX,VMl9<|wtӳXUmo4 Ga6[i԰>zT7Q"#BUyfVNA@bRRsfffUU^',4LM7AOP?JuPbbQ ://D"H$Dil:)>AV:FkQ?E/ )kјf3 ϏGFfM_,[!ii"#},';1a4,X"" &4{ 7nak#==G]^DɓxԬQ#xgؠ8Q!*N'I$D"HMf|JKS#g&S.Pc;iԠYY4iܐ;︃?\F9KB p'u*yٜ9';'~}gAZ!7 $++gмٵ.2[hF[R鐕m֛2o-,,4b6[JLo5ӳ{W0U@}^:L7/.^@$D"H$gf ݢCdZ7Yy<?z>jah[mär9dehn6ZhbيFt:X,%?k_#|Kܩ=;`0c.Fmƈۆct[t)?we{0 4lPL"KmyꉇKXUu:=qzukC"*Z~H$D"H<'Dcj=s8«2x\Gv; A:ȑ\lGʳJOXX8Νh4ɧo@@vN6>FTUGn2cǎw>FbcIIM'|} |vyiVv~~FL:4m!ǠgђILJq<RSl_$gWiެ :BZzO`cX2r-DGGguxxHIM#0П["TrF"H$Diz=?&h ¾0IcJ^8d]ާTsvǧ_\%T]99X|$VZm'Eͥuz~eazYt b)k6|:H+vD"H$;z=٪˩a5f?3: U9GQur&H$D"H$%(: !BulЀCa0P%~˙D"H$D"EQ0#eܛ,șD"H$D"lG$D"H$edʭl$D"H$\(K\ tH$D"H$2_l%$D"H$HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\HF"H$D"\*[D"H$AvNӘyeCBtպVA:4D"H$ILνҠfc:7VA J};Z_ۖV@:4D"H$bⷽ;F¢m6I4jÖ́ڬ][w;5)GIJjNzhjT mR~ޤ2y~ަvV*+.Wrټ6wt k\KTXtb<@TX4k6b=nܮչ)Cc{S5iLN?;iX1UoM&]<6}oU\vԬҡ0 4шO7lMИL?fZUg(}S>a>; UmM&]<6}oU\vl#80DC! /Vevh>J|tBB5_jŢ(GDhmM&]<6}oU\vy\T<ϟ]"_)$]MYXKeMY4DڤxIOe6Mo[zU6W]y+H.!wQfjklΓB5KTo7)Lަ-x]UJ˕\6oEf|"m1RoqFڤbxIOe6Mo[zU6W]y#zT7#CsϡQ-H6d?oҥ8\pؒmy>ނ[gϜbRzU>Zj^bKmUUIJL":&#>2HKKܙoXUhU[oq&>|Ue")r:4*zZKJ)_?K&6s_<|JBCC<<||}ʝ>הx慧Щ5qTYl{ʋfW%2y~ަOiKNz}e0cL~VߘKm³3hѲ;r<;Qb>.+>\ɦXlQ4\I}ڥ'xۻH\Cq}|3v+ m-_Cbb\ߧ'NTĦ(Jkߤ$ys![@Fzq1ߛ{[ҽ Ϝ ?p+gc-CȌ3iѪyuЧ[t7B8ҫoO}Fr\ Lz-?odyd /пǠB_<6MDd~XWb+0̈́Sz5n< )M@e2ڦ;:)c2tͬ^ժǪҩUW_z Sq|8G``Aŷs PQ㞸UT_[5kY Q:]qē}ZrR2t;))zhݮ#ﺃukk9v @xD8 7`̄4mvq 2eң|kbb]wbb:?}+Y/ÜWgb0@oN:B&ۗj⏜9¿^5ժU.i{-iѲtgШC?‘2߰Nfٹc'-$ BJ<*.jNIEzdeeqqndDDθ{hNkq9.^OWYt1ь7 `ԙ0qWK}·1z(<F]& zr?.2nz'=zu=%9$5Wa}2220s0sgLJJ*>5Xٗ<9ǵ%/8v=W 0(N$''ӹ['1L9&vŋ3b2}mLJjիr!:vs}yu۵C_,j;];QZ2 m 3sOQNxmYlQ8>-//[hN:矬ΛGʛ/Ӷ}/&2鑉ؗb }\A|B<ϝGUU^{y>o3%_#]w#,+Ǐg8r/1<;i4md >rf &V0@UU.z=ʏy׹x1;0D߿gʯ/UTaitԉٳp{=~GƏ38puaY4on;yLj; I?a뚯0k,N:M*Uf׬lk|Wk,Qg~_ٳƲnZ"#]GVѕ'*Elް~٧;UW}MΟ;?FVΜ>p}>tlх~x7c }չa +ΝwtjՕAV1mӻK_OAn UXBhۤmt`;Q߬㦾CԲ+FÑG-]ΐܺ%--2d*L|8:tiK[/@V?@&r>31N-rQ COУC/ʚ/0[xwӭ?[wc}FJ9^{^]ҭmw>KݣC/vٻg/#oMV]ݵ۷m/6߅ X0]&?:~zkX7^ú[/`ʤG4;~Aڶ"9|ZkNTO6ԭv}m,Zve|{Zq:>}wtlхaoiqM^1w|Cۤ}KS&UXY`1Natց5ҶckOcxnjo,UW峏W +~DD}|oڰ,6mfPQ=*ow~tjՕۆr1|$mtgQd2:wly Sce/Q}aeڳy'kNm?ʩԪ+w ={m_ȥCi&<7zªZle Fk}Be?QD4޿ݚ߮G8#"iնCn];m2~ w Iӭ]m,n^k{m ? UX`6mTJj|-7B]`JeOǑ!زu3ڴ'bڌim+\yY$FZ5شe#l '''Oċ~ Ͽn1nxf~'z´/ٽ{7O۷I QQ,=SSAԨy YʺœZ*ii6Y>:Dx{_fK3_3g,ByZ9WF͘232 ,v?jeXr\ڏ/mEqß IDATtХ+>X˳q[5-5d7œ}7OMywcZZ:dW+0 |<9V_o{?o%44䷟whҔ `/ȸlz}'#.^v*n6^kƩ[շ'?|#GQ5s + gϜcw?RvMJJr }Qd|bO<4|ݿ)iӾ5ϋ_BQ:Ĵ7 #c1[xi|P df ޠ'11XYŪ"mBR UUs_Onvcjxm#V~g-0d[lDӱ5iUUiZ~??.矚Wi.{:ukewc;nj`wSdpfmcuV<ǟ'7/?FuD^CO&6.՟}ɤo>&(8qRiE7Wk9Qjթi+jc3aFrfuJrR2ծFNxo}cB_!Əd_TH}OۍԪc#> JHhpwqRQ||9r(N ;;XR6nX"\qϟ;G?fԬ^;nDFF:'ONt|EUOΝ?ѣG5jCQ.?MJj 8ԨYmJ#`e-`άX,m&8ڡAuCxD_p{ :}"͓Y$'',f<3v uk6#=WS٧=;8{,]{t8{S*4oՌWM]:TS ׿E_%,ZmAWb;=0tG%JXx ?|MNڄ JDN8ItTHu5hȘ{F>y$KժU ;ʛJڵos/L-$+..͛6w! uUhذ!7+RG)˱Gݔ1_7oќO>Qw">!;GfnC%/h۱-3ͿO5%==-w VgϏ (u,/sg'  isRa4s96>S'NiarYbb tT&y\v4ztҡr9NO)8HF7FC9u 7WGյ]@""9~a;_yǧLPUac1󨪊/n˨Os9y;{ 0淓eFy8O~(nZ uw2ps&8_qp7hٺ%۴"''jPf͜믽!9v5m۵a/h߱=gϝrx@~W_y!CIIIIk]ioЦm:vHJJ*5j\q- MCdT))E۬}dRȟn=ЬUSl\#mO<8!""|Z\6m왳lXD=QJAyO.^HMMuI뜯cK95=U$TK0ǎ… ܟk7ifN:͛ .:bZ.lLbb"'N1q܃2Qne[v ԫÜi/qQ.\Ү~v ۳U؎Ξ9޿Xo=ƫs^CGY&]@B+l*q u0̞'?Ŀ'8yQBI6q.WʒOil?~S'Oqؿ|S|||K[.%>}o׬ǭ?~!X=v+/&J[2rнSc.N<a7Po60~,Z /`,Z~~ZޡtNY-yek\ ǎرlZ@*m;YF*T7ӬUS:wDV͙[B[Ϯ:y ?Ӝ=sc:y?wŊW{@ZViC*q -f=gΜرÓoߝ,8f))kujo6NQJzHϲVжcTbUdd卪M@TK`9w.;KowPoxΝĿ';e|||ֳK:w}l);{?vⅧݦyZ[P+:ɏOb3;+??_a@;_?_222{륙M Ν=OJJJl1]dffNxDiiŏӎm?kN{i3^`tl׉7 c?K|t|3qD!h֬)L}9бm'fNA֭@bbY 6oB=ӳ-ZRh]}f8W_G]3r Ntѿ8I<4iԔzPVMFH{)ҟۡqj܅P`KϳbJ,x/J:2Qof[Va G'ҴeT2޻<42330$_*-#o_b1XBBrMBcݏL~~ѳo>FM28(kQȥtz07NGDd8M[6孥oPNMUԭ#>M''DŽ_~yypm||8鶌ݴ歛;/qkO!/z_y'v+q9h٦(U[}xNס cǍe츱‡ ư Cl~~}^ڱ3q1n8ihW_{\>/ZC]oEQ7bG)%_.X?l1W(#垑neoՊ7ϛt^&o^xvSlix^쒙bW"8$! ˏ]?2{ȵգ7𛇕2˒ ګ_|.o~ДAwI+Ռ7ϛt^&oЧXހՓoի]71NŽYRv%=G9Ґ6d?oSx{M?o[Vx^͕l+lވJ/ EZcx{hVM*7ϛt^&o.ުWes%J.7}7;4DܡA mR1~ޤ2y~ަvV*+.Wrټ|[;R-=Erys1BepYM&]<6}oU\vb7媍++WJh0SF%?\2\LAJ(H$D"bոb4e\stR39s4[B)r92e7D"H$Drsϧu:ν;֪GwjtH?D"H$D")EQ5F;2C#H$D"H*/ 1U8sTJF"H$D"T*b.sZH$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$H$D"H$Ce+jVA"H$%0׭E^6eJn^ѕ/!AaT*FKqcA;4>bEQBhQArF"A("ӑ5 DB Pp\]q묃k\8*M@.Da$Y>Qt}2jVN6Ua!ᅮ _z,nEQDq/#:4huMT~3oonup-(Ltأ )=}/_+[D*[phP"6(:UUQ* p*-6 ":@CIsFs9OTǠG*&GupT|\r.p.< +Mv5; gs᪃4>4RӓPT7;9(`jp"@Qt.=U.yQ\9UOUwB:ژpma(vcwNqǞ|%qZvp) 7pM| N_-a_ omԑN#.N= w&Iq8.P]˃@;Aw~ !CD" F>A):XbQeª jEr,9Ot>uEfEQ45!VcTm`9`rzUGmmбڇ3>R;B-\.\ \'ז L" )LևYlx;5Iv֝N|OⰠ8w8}N{;#Nb\ؓi3S8u^at0p:;^h謝 (6SȏaqT¡G|D'H'!UXlzh6.suluȢ;=q;qȰUU잓K'GhڦSo\ڶp.ҡH$2jO0b;l_u/Щja[?@489"r cq)qZ[mUOK,[K?{Sڂq\ew|_i^i_/A>vdiy@/۴.Ww%|{)_Q}\ihиC8v/ L^{ (8DiDPpikZ f iiiDEE9=ԯjIRb! F-cgESǾ{#T|'p*o~98'rrrLɄyĈ\{L>Br:ĸq ÄTT]g ><#?~#ڷoϦMܹseX, xE.Ǝ%GB־AopkaTo8q%t;y)ecY5vI]Ҫ` -_᪟Xp{8T}h⮻P>^{ >soYK}̘6[gwmXjE|Uǝ$<<7~努 fmҘi3_pRC*jj->T\1jh1#h޲9AJCGwP":Bq+~aabK55%6-ݏZSFU!%I!^GԩÑ#G\FҥKMuVLrrtٳ' bd_ɓV~)&pfjժń  -S:ł/*&Mrviիǻˈ#8uժUN:Z^ze˖{n,'Ngؠ'sM6gGi>$I;sag$=гi\yNDƏyܾ _\+y7=:}M>m:Yz?vA}[>6kǏf$Gn_Үy{$Im;7iۺq^qtФXi| pdff$!whٸ5a\~Uŋ:F1ѩmg~2C#1HlXѴa35f,8^#55&w |-#//w~V[sL4ׯ?LhsÕ+N)Iz.sm:[>:ĪT}Ȳ ~[ԭVz#IzV.[ɠU==?ڟ:PLJٵclE=iި%4AùtB裴!3laCe B dwH搬ILL+DzN`fq%EG!;[*@^$0\<tN& 0Qre|}}gȑݸqCxWؿ?͛7ߟ￟_~E?`p(˄ 2M,_@2V%999tN"8'11޽{DժUYrZ``֬Y=QQQ 4HMtVZw̻X5jHϞ=INNܹs4nܘ0<<fψ&a:r9$HM]O>|.^HD/I(ڌ?E6A"_o`)2qD^}uN:^_4oٌ/~c}YIpZ#} ٰy>ZHZ5й#{~ث>}?ӪmKZkCFz&G8AyShֲYt..}q5:uD*Yz 12_oS'^X` [6oaނZ˼4U/㞙'۰7C2I*}ǽGFf9y:‘0H[wb0HܟW|Ȗ[նLJS0H˗SxzX:>؁u_esπ$!7;c`p0 cw_ykۜ={N<=?C/25i4k†aͶmغu+HNN999ˤеkW}QΜ9CΝݻ7z27s.]9seԩGe׮]l۶Mf7ߐ#2}ŅǏȑ#9q: ,`Ŝ9sHm}vƎ˻ˉ'U]طo'OgϞۗ\x V^ͧ~ʩS5k={$--pi.]D.] c޽̞=g2|&Mįj/%%2eGBB9sЯ_?7o~Kͣ>uɒ%3zh|Fرc9r^|">m4v-[ tڵk}=ɪQt+Rav<[ĉܹF}"]i9 =;3xv ֬i۴z^ME>ބQ,޾^|3ѕf-,}v||}2}2ѕ+,LF d ٴ^%dǎsa&8аZkIuղed)L1t~3=%mF`P c&HK_/CG֐ckhߡDիY60z(֥Rh^^u=2*=e+ʏ>  jrD`3OY>Bi2E|>BVyRFڽ3:yR'˸pp\Qg۶l'0(ƍ"2*nҶC6\EXx(ѕ+0pvXQp4CSQP'NjU<܅^u_AH%8@ڹ[gԉ|:? )cQۧ4Ќ7 0uʔ)Cdd$-Z`ٳ^///pssSg yʖ-+¥K8|?::eRJe(_<*TI&_(Y9x {wߥ\rуf͚_h"fΜ?L)_z{1x`tBrxؼyUʕ+SR%^}URSSU=|̘1S|y4h@@@]t>`Ν4mڴH _~4nNW^%88:PR%VXAjj*+Wdԩٹ5h???x饗4￙0aVZocFDEEQreF#G$ʕ+1c-Zf͚V3/ͩSvKrڵoRJ֭Khhz;_)ͮdclq #N.kYՕ$LJ_}I&$odpb"+UD-eHL);l+ySnNr ukUBW pZ:$%GY Pz5*Dg˦mԪS4j$ :w̼7~nZmewQZq8ȸZ4%00/}uy$7ڵ딳hJƋHӃ 5]ecfQ{ϟv=P| Gn}-\NLn]HLL"77|$I*- ~ϊPG{S{>?YYFq]lUg9b"Q WcǑ$a "+3 ހ˭[ߊfA>6׋:1{<Щ=N U:aubj,Kl޸ztctx=g (p X)5hׯz^PpW`9}dW7!<Щ3f1t\txz*moXh[G۝YE|0.͌IF [\t xt1Ý\ϡg9<2lp<Ϛ޸畤\oK_f C|7v{YH 8$Fcٸ+>Жˉvb0"r2uQL|qZV"u]\\"hׯϡCnKGe&ÝgKtt4...$%%l?CӦM\]]'))Xeiӆ"bzN9u]<ӦMc|,YOj_-7n^z3sLv /7nܰ{FKrf`̙z|Ml޼ w^j׮ \ c)eʔ?t[̠AXf C !66ޥtY\96nh77™q3=e%@XܾK9;feGk]{t/6c..'%s?ІKI,p%.&]ltaװ_o/(#BPje׬̸79u /pa^Gv([Nz r??.%! A.aPϮHOF (S#w/)ꑕOO |F2Aj///3cp2~?x32g\ZiAPH0*E >3^ɟ'NBZ Uo%w>23RCuٻxx*7nߴ-ulKfF&?t)"}>$̪y/e],撯ףQB{wĥKIqyyVvqF:,.y7G~[{ؖwF.g믾A$^{ lӕtGٿg/S62LHdhrk [i2z=r˗գ(ѫTB~~>ܹ֭s8q}r)f̘ٳg9ƣ(T^?4*ԝgKe=zK.Y2dqqqϜ:uj7@6mx9q/^$++KM6lK.eڵ\x'Orԩ"5bOΝ;x"N /qh۶-*Tg%##__ŋŅ8K֭Š)ӧO{g,ڭO1e4 VkSO=ٶmIII\ta/r[.] ! e~|2SLԩS:uϫ(֮]˅  8Pq!d%.Kˋܔq,~w )Wgب!+Ih`"!~>+>\ ]vu|ȵԫQ~Z7 .驄R -cݚ xx3湧ڣ :|;۾N혚V顎,>zv-vǝb@ W7zw6`ۓt2b$1u‹Ӧ}kM}}Ϋ,|&BFFABH#;; oo/U+mlAq"*ж ~"e^HO`פM;o6ӹZ&@x|H?fBhX( X}^[$9OV~JDp^}s:5jUCsor?BBWz'[n a4Jo6m#3lPZ~~>72p4k/dD{# A=,͛7GA駟fѩS'<==f}N&M*W @=X`ӦM… Go*׬YpssܸqZjqat:C aҤI > TcnȐ!41VիݻӾ}{ m۶E*?..y.^HPP۷wΕ+W c4oNWK/kVA IDATѩSBuΝ;yg?>~~~̝;aÆ1cXh??Cߎnٗ, v|ʐ#-Vkְm_l4SyGwP<=;##xek<1r0m; ;+N߰mv^tko MEN[QذSô~I1X"8)F |/'RUڻsp`ްi7x?q0">ߠk7+~?.A Ql3w, ;>>ſa3ybۍVHOOŅ%Kb :jv{߈[%;/-7Ry_IfhpD0%>K]ΐπhݾ*%شa3bjj+@A%4}hMLa5UW;mc&=u^ߋtOhվUҺFǫʢEhҤ _|fh85NaHwpN,^ijre}Q>0Nqv}q71( KzM޽Ky1o޼[CVq Fa4;_x\hи mqѝsg5444JNa_x\hи.g=sȚ˙ ߓ4BӇD)N;34xzz%Dff& Qt ~wxw1Jqhp.4}8y%-FLzF:~%-ʿ,B7[c0(]jժ~z:vtވn͛7gҤI :Eи Nato;[7&蔼WS kā>%>^`a-:nn:M%} (iJq/ yG۝ RE)V$Iח 8Ŀ1ĺ0heN d@gcЀb Y5r4ddt.ӽd Ix{y5} 4Y6h̙Nq⅒_K0bc۳ 2%-F)) YF dL0cZ(iLR5awo:]5ok9[g5SʱۜOd$;4]7em{sYo;[өƺ3۴IaȲޠ'+77zùQ,[ȲJZ '&66m0j( dԩիW#I ">>ʍNCCI@oLJѢ79'zYHx, ChĚFJ!+$a@5] jYCVAIB,Cl4e@VJW6vN r+|JEVSY,lGX/$ iYHl@ll5ݶ6U,$ŽLӇCC?LNN۷oWM4ӧO3i$~Woرcyw9qVƎ4~78_EDD ,^?U2~x5>}|g,Zw}$tB>}8vfͲ1c7ofΝܹuGݭиEbhONC)וeڙpJd|}>~jTYp[ ʖ.ٌcȹ8g5B/,Gmfԙ?B2M/da10aZfQ]s3 &$s{Y܏NV]\ ч?5k$**{ƍg7n{ҥ /={, *SO=iժ#G8qݻwsʗ/OZx饗xw0a֭bŊPJ""nB,X%KSCeӦM=xJCCp F%3!0u\eauq'JÙ0Ma,R]x,QtX|vz6wujbdIgQ$+jK%ʲh,/!$NQo|eùaMxx8׮] 11[|r5`0N@@@e(i/_^M^:ϟŋTXaYYY3dx @ׯ_6VCCq FedU]s1u>.&F7SҰp>wy[گE:[AN1]3V#j[Sd٦Nٺ a鼪 By6*Yꖣy[A\GD ,4}8>44+F^^^\\\ztt4mڴ!!!.p*}hhWtTVkR\9._zذa 8͛ӢE tT^S[fԨQ$$$ĬY0a}W^a?777rssdz Zj$''Mhh(˖-?eLCCpFE\t.&; j@qZ0m9eb݁6v6-:uf"TE+fiVunp.f1@v)[U4.QWp8CiQ&=3G5 Ó ||JZb'!!1cưh"~~Bу 0m4.\@HHqqqwd_1cjw1qD5j(={6Ӈ4O ѣ۷dи3 1u\pA2d:cc1(QF9ĴvPM#,n#v;FЩ##AvUrX>!f3ٰu8^ϑ&plwfZgbohp}&rIBj94fk:ʸ\eֻ2,YamqKž8үsiʄ׻t5]t̙3VҬ7nhuOU aÆV37:o֬yٲeYn]կ_;w:L$>>xy*)6 !!$I * e$I$ Iׄ!Ъ>lox񪏩Z!A r[Qn5<ܭ;ae[˗-/,B =  rH%$c$K9]2Z05V%!0 Ad:7{˜`_ߺ\2Hl&Y-WI+M6Zv=_жu@Ӈ4~J*`m -0ݲ@ _ o5,8v¸vj[e!eY=:jou%߲0BFU9Ȳ3(ƅ,$dYF!-ʻ'jg0@J_+Ejhhhq d JgAByWPO0  lҰa.$ǮowK};vz9>~Wf͜߸ S~z5[7O2/a.ύCߝbêSgq ;:RZ]גQO]ߪ]I2vԭQk$)P;{V:B2 ,:۶nzZ$&^R;z+$z%7wn-:L_,fL0߶9]"##[QVunFFF:àSάt5I0HzZw~oՁa J -v:ԩ^6¤\Ӈ$迬Dvn6wJ(.,)Ɗ4``"Yս,1K'!TGكK񽐔zLw>ټ7e¦~V{3.R}$ctAQd0$ soV8˙ B'8˹s牌`Yd3WWW^zώA˗Ӄ14&kBԨQ.v~~~>Ge%`X" oJ/ltӸrI/L[n$%%=ӰQ}S^At=}&dSd9dvRu lΪ(uS:s=dpDkld5ZNVX92v"XmQl]-и5Ġ[ņ?27c޼Fi5ccT y *ͳrs;=™ӧIDVf]~m[sXViB6c1màŬp%uO7bW֙m[Ź!dmQQl:#]v ECCpnDSS:Y(_2JB͌lڴ5kS`ZjqAС !l] ꓟϵ׸pΝNtڅN3h؅ vS {/$)2-Z` 4Ϗ͛"$q#J!#z/&p?@/72(4lsa"^ s}+Wy{\F=46}Mx.eH`?2nCj֮Y<(M,$&6E]b&a= c^cph6[e8v8Q# 5̼nLMonn6Ȧ `e#O,[<9 _{WUf'`Ŋ%#F9 /w5J=Qϴl h(A1ɡ4u0{lF 9|jrF:3^Aݺu OOO-\Ā8u4W%J"t Lb$zlb"$I)#}{13n7ݝ̌LD߁`<݉gB"33êRύÖ2A<7e=|S,08 CX?ÿzj8zn҄)\Q1m|8tў+i|}Z( ~F617iQ.zweܹ 0@=.Ai444JNټw1!J~cXF'N8Ux޽?~}'ӬIs׈_z$ 5Gxyz +úkYr*DE3<0]h'&7%D;eINNGY`)oJ`'4Aa\C# 1k ++ O/O$!(#}z1txz{! '/lƍ$%%Ǎ =ٳXS<<</IFjUN:$~LɷGI4qඇehveϠBgK;aFԨTz5ХcWޜի޸eI \a[ؤB{i?-V% jo%I2$|;nN"""#00^OÆ >}:ۨZ*˗/`Oǎ8w7&,, ooo7oٳӓsQ=z'+Vds^^SL\r3i$mĉ4mn6m34J&S&˧{~px}V烇 fv7_~;P`:vڗF)L-eʖaXQNM^{Zm$FCӹĊWѫwrrrTLxJ˓ Pq1oEQvnk7w}7/"ظ~quuj*ϟEPpׯϏի0kTQT{Aܩ>J(p!defrY/X7_oaڏ)^s InKn~>BD/Mf] b2L-ՠq;+Ve˖ݛKRvm Q0a 4_|իWoٳgquue$$$ĉ?~^\MFǮ$ˎh(^DfhlO8wus#Yc$!vcF<˓1Ϙ8ynnO$K=#SF5^}io͜ìg"2~~ؽX+Ibs/Mk9~Sƿ@\rV~JG~(AkѮ];ʕSl IDATe8VZEjj*>>>8,;$$l<88e!11zVV 2'xB~}544 '1hn m {t0^^^jׂ@對eQ܉>Jƚ ;f<<"i7$=_5eBa,_:1Q" dY՟P4o'bu{8v6ZRA]|JEڍ5CCCTu!#FgeÆ ,]#Fyf,X޽{]6˗/'>>aٶ!n9sPuXb={,ihh8NaД/2B B9[hߵ}vv" Qܮ>J0(6x"ː|_Elk5]+ԬUX@))WOlb`BGDzwe%S'ci5~ӹ|zBٲeYx1tڕ~kU 999w\֭[\2ǫ30HġCeذaSZ5&44e˖عihhJrvzbڶ@e#¨Z*.͸QB,Kup#_oUW0\\\ؼK.+&MbҤI깯/.\`|縻ӥK:uԩS裏xi߾=iiiҶmۮϞ=,[ !jyG￙={6Ӈ4O ѣ۷BCCq FU';7 W ^ }?d|͛;jܲ>JwlIʕT9V~<"0 -bjGj^:of'Rcݕ5=siZ_^{…,\ #*4nYfV3gΤcǎvet:V^{zzнmJwsׇܜ\zt|ww""iѺ9'(8!$Cx烹=V}1jے_{4nK͘8>xw1)Wg'(W>`F<$sg'ϧW~v$oxYGgъxzzޕg.)~aKwwwU뗹V"glxA~{>JG(mZ[Y|W,Y& W,pH^<ҷzCP'y?8xzPH0J'a񓖦}ihvàFJ:qsu%/ 4w77γá>Jws濈{q8As=m߻nB<‹Q;oJZ 4}hMxw 0h~T'S9>k2N{5={,FAMSx ڌDpt>J(m.g=sȚ˙׀NCt2- Y٤@M7(9rrsѹ!qpuqE/0H^uM%CA(Mh34ʼn6Cq;8A,.Y'cQ Ө1I9~@>|qvѥ^S6uVy:˿ZLFY@uS~Y6汼W9&1o#u:j=M, zr3pqqC4}m$(m_I'++ Icƌa}3gׯ_g„ lٲL*UK/DHH]vuX^~h޼9/_z]jx'սr~wbccr eʔQ1L>Bܼy3C !-- ooo*T@߾}յH8A#ɒL"cgF1sin3N`@%|<|psu5}RL3_̳rli65>*SqFP2[,Ʋ07.ڵ頛^*jsYȲ]gZ:j][p+CN~zYӇ3ꣴQB5 dfgLl%-Jw1m4N!l:.娽 >;֣#:Pg, Q˰z45yCm,(XQ!eсVfeq?2:ax G)#l$И3 %-ο2!a46gӌ=^pcǎ1g.]J=ѴiS6mӇ-[;w:ԨQCM[t);wo߾L>qor͆;FLL ={˴z͛PfM5|ر#|A'ТE *UtSnENWWW c/\3$KJgB65`$ N3aZ(lW]x,QtX|vz6wujHlW:: t?ѧɲ>P,;jEIV:Ԗ.J{lrGl9`!di1MoŚ>KȲ,[pRF (-,3|p͛GrE{dYfǎ3'NE}իWIII!""=̝;3yd*Tуx"##:t(E6lÇ';;]^{eUN[Μ9÷~{[3A͇&B,Q:!$Yt][<!IHH/$ keea IHB $Eʻ!o!!w+,tM NA2d*W2ˑ{Me)(+ ;Y &gPI`,%5Nmg՞6dgCӇsCCCCaʕлw"eqƑoٍCѡCrrreϼ+ +W6mڰgoWN^8}4/2 .?{Eq;!!$(ہNbĊzY= *y ;{%;3;>SFO=Zl#Gl{I')33S?$7뽞ڪ?X͚5^{@ /NMrȱ -m˱c~G#!i9e16#~#DžՏ|`}.; ~CꙈnvThvBq ٨Lt9V ﵺbe}NQ+ڨmNj`NCC}$O}j%\{O5jϲ,nZ?V\~[TXX%7J7oݻf̘K*55U~%IC ѧ~9s7Yg]Yg &Hr{N?t/pEJKslȖ-[o-[_|J}飃>X7oHVI1̱m)Œ)JjxH8`M 5ӎK:V^Od 'bR+<(v}s$zE4w裍,'eoŭ1S\{rJE%&޻PIS?\?z^,EHwܡw}W~J_,RJJ7?fӼy۬Y3պ%%%ԪU+͟?ߛ;#Ixz :/u%Ӝ9sK/>Hx\6mdYϟ54oޜ)shBCZl믿^O?.];sMRPC+E)-cIVfj489N CCS V+Uxݘ1/5URhv5,QLzWxRxׅmF/)<+z2ya9Âf>ǦMtȫ5Ln<@C}$O}z5/Pݽex }W7nJKKu-wQnn*++%eee>}wqƩ@}.m|jԩܹnV]x۵ $ JMMUNTUUG}TYYYj׮~uE{챇֬Y'|R:t{ﭣ>Z~vݻ'<.77W~qivӔ)S^f9,Y"qzjUUUiٲeU\\W1 5 ض;V?4=81U޸ضa WU{̰ˆ+';֭[a W*.*i ѰˆkmԴ&?=۶Wӂf:*?N 8#8?«k[vpm×G{xۈ:?Mh.FhHvy^hNE ܎F^/rR{ߓ'D.vxMզM4i5~>>lۂ J>3UVVW^K,ڵk[n۷~g͞=թS'M0A#GB7߼_u7sٳ>S+***҂ t9h}1|M:V/o#Gx܄ tGs{Oos٢E hƍj޼ZnA)==]ovԐ5'^zwh|weu:a+7m<#NrM||fMש]ȉ3#=CGwӍ7ޤ/VVO;3fVRyE{u%˶mwyڭ$o1wY$K'`M>?U:t}rW{Yoj맥?*7/O5^eff S_UkԬpF\9\t It5ԩsǨ uMv7L0[!IJkjJLum=tOzxƒIxt٦2i7 >:n:A/q~1zիVrQ溫fZ :d]Ffէu5k5|;{}=G$W'.ܴ7%(Ͽ9/|y)9E}{iMe4˯tPqq>~f7s?d]pPUUU鑇_랻Ƀңg{)5k,yK֬^#q{y&>1ISNq^W^qow߅V(Kyr]9j]~HmܰQ}tM%M|lnskOJUlެ41g$i?.צ+/7W))j^\S3f}:]JgQ*ێ^ 85_vn6mǼG~M *@5m:cȟ^TeڎQ bh 8fL^l[ZUJϽkKu1aS5#kP#4fk̽wJr{=ϧh7T^IYY۾9y'Iĸ}]tsb7|K>!z*jQw}wz֮YUԢv]B1K~1Fq233dZxbk;$iV- yQ3I5%IM:v=X=4^pλںuwl;:LDC 7(//믾ZIoN:N999q'^9q}۰84mՋs) Ww!瞡Y]n׫P$TXs?]WFF7 <5E/]+T7ǩc*((ЈKFjԱ~[v8Em:̄l&~z5խGWIkԑPVvVT6p,'#o)!nK(@V2Fo:nύSczrl}M.5ԟ}_CG^S_ԍܐk5e;gf<#ZޯRλfkޗ׼/5.t_ƹm]r)g?1E=V,_+]e?$cl!6#cyS>^>C*۸A3G' :.X??ܞ^<. PM}w-k}RC҇U?h"cʌ[h܃w~'GY:Am[YQ$d̝c595{ o>6mT͋v@E>Am;j^TQ7]~YW/_}-vԱsGM³/ѦM W#&b8q@1-mPW_ յ{׸v:MfcTmٲ5[*(--{^SHҸSҿMхՈ i)ԟ4QwvV5uσwiNm˖kwm][+'}TUnPnnIҪU}h=樲R2hƍ7|/W۽ֹ督ٳfkѢE;4t̂Rûz#=#M^t[?״@#UEvpMzz7i^y]3^N=QFjm>ZVŋGm[hZVwzqոI4+P붭t9Vnnb~|>W$E ;#cǽc QiKeTVʶ2N;|pB}ǒy橲R=LM?uVzOGI˗/׫y߱cG=x]}:g/uU7z-k MBwD=f^ze-YT?/[_|U+]=ڵowߞe˖~3UFFZ,8GhΆ0z&>~ZLǝxlvʇ ^ݢvqz4} -n?^N|lfHuz}x6c $a}yɲu]I&UVgu믿>^r:裕[=hڛ1cdYաC]{Zfwʕ+UTT$˲6mhСZ|w̡ǝquU\pA:Tgyf}/85jH%%%0`***$I~233͛ӧ~#ԒbQA*6WooqyǍ?m>suyVD݃f1ʭվ߯v$ 9k5deYmܰAAUmRn%~ե`ME8eXBsv*h 1hqG'RNnZMLF7o֨׫"=;;KwonWbű﹦*M~lVV58VZUm[^M5g\(˒rrs^4[~v;kGUx$' IDATZnҀ  .O?.]hРA[4zhI҆ t 7覛nQ'|:(=OtI'k׮ڵƍҥKqF}7[G~vm7UUUiժU裏ԦM>Z .$/;w>#;3<jժUʵd~=z kjΖ$-_\wu{3n{HNn^j(3+K?B /TZJuQYѫˉUW!':P'ه]Sksgch}Txϯ:]~:}tGN$tM1bn6hݺug}n߰uV}W8q4ic9Fmڴѷ~ÁFrSaa ծ];O￿nFM=DaaU\\ݻVX-[~ӑG5˽8Կ\Ve8}={:&//OM4Q&M4fM2E};47ǵ|Ǒqljp=WٍfZpD7*9>׎+z7_W_MoQ޽ݺuӚ5kTZZbj̙ڲe煕 _\s&NsjӦM0`>233ujر _^'OVQQ U^^͛7k߿͛ݻkڴi 9r.Z᠃RaaѣG{[UUI&qرcE͡k[ϤNQ,rxo-'rxoeeegd/ #Y;V_|qTMձp K]j$iȑ0`.\޽{{{'o߾2d.R5iw{/ZҚ5k8mSjڴ>3k۴kN_|ƎQFP~fgm۶ׯu7|3/\ 7ܠk1w6(تM߱p>S1p٦eVCC}ԿYj|M}S{{5woyp 'x9s96l$iРAzGugh֬Y:S~iРAѲeԬYy<3fP۶mug+%%Eݺu$oQ~~ o^SLѲetYg͛UUU.C֭#{رc5`}uo~ڼy͛K.Dyyy>|x=~@rH@S]C80ĩeedQÔ)Ǯlյ>]K/}W:uOj֬=uVYF˖-ҥKEtG[o-[ XT\\vM=:w'|Rg}6lؠ4effDz?|xTNN$wуo7߬ɓ'k^iܸ%C?̙CN))کXrs򴹲\)I1qҸIV2FɓC}j].裏>R߾}㶏1BݺugCԩSչsgz뭺 _~E_~w_mذA7|:w/,<2d-Z{Ozkݶmo*++_nMߦMx5j2/HҕW^e˖K.$o͛7G-+VzL͙3G˖-#SVVիWkƍzw5sLo8`g$IzZ k RiUXZi>]_SO=5nթS'M0A#GԺut'o$XB_[5iD}Ռ3$C^|E]uUꪫTRRCr7nX*))Qffc뼡p\~5~xm6*tEo^52$2}tM>{ޭ[7;V&MUW]-[m۶7ntW}uWjĈQ촒/,fw.*m6Wߴ,I5+PQb6Qzz$!%`WG%G=?st9ףG}՞?1N8Sw]D4ʊU -EHFFFC{jo:wjPb`;KYJKMUAn; RzZZLh0 ԧ46k?rf`G}O@}YRiIc#`#Icl\F:SޭjzH^@$hh ԯ4cdeY2,#$)gd$ Y)]ro) ضGè>@I@c /)$( ]sM2*GFPNVҳӷ>426`ȍ쭋ͳD>νJ($' moLy1uPz}mYsgRcU*,SJJJ>.Iԯ4&Bp6fܘ#Irq1l&iU2VFJKM ps(i"t" hVsۤ<n{-eEtR"1 tFᆳcL\cڽ颉jx{ w7^T5h2G2_IhBwض,)xcngM0ɑ!$3cjr2h"OQ;nF;͹%Iooczxzkq= 9B 3/Th@ކzY`U[PWIhlc 5R"cmQH&qd;_{Cx"yճd)"ĆpZI7oƦDa4E6R] coqԑCL #{?߰Y8vt9&ԇFv>>@I@#߮:j|8RG8kD$qd;^4~.d2v C+vâٺ 5 80ƫw~oxUbÍwLS#}lbyY+SrD}$W}8Ieɲ+OCL2s#DZA ͐rOJiVΑ9ع!0&oG|kGͽ{'n2c/lE6t݆u(Ļ *E7#>žU#>`D$CIU$Gm)Œ)Jj5IZ㸋=Ĵ݀66#^oТؽRL/B9"\;GFF߲VT/б+W(j5.)4ޕH')Mq얱pLh؊dTxAsل>%BCߜca߸ǽԸ߰KoayG3p{pDl+WK L{XxF*GslڴIWZ}@9՜8q>>@IiHZǶ嘀l' q'0۶m˶6' Tɶjضa WU{̰ˆ+';7ukeղu)io+u4ڣu5-h>{WMԺyO$tG }^]۲lc:v{xplu~  7;^?*`ml;k^-Z믿AOovyカm۴}V:~:NBiE@렅_-cD4Lg͜+~lJ+ ȶGh[hTB pYe @qr~[ee5Yg߽4Y*+(tE^ջ!^Hxud~:#TT}wPtiU4DFr}C΢ '9:3 ?QW_Yܮ͖,Y .*=qks8=C:y) ѣg{~)5k,yK֬^#q{yZjVZ)e?+%5Um۶fw&&4 =jdWUqӯ9WjECueJ֬YÎ8T7r]i:jQZ79wޭG&>]Ʊmrj5m^Ze+m _vn;C]#Q_Ӧ/(ParM6om>$1 D4m=oq4c M|lnskOJUlެ*VEeVs/GZR9z.hK6[/۱z=d;jwyOLgE^1wQI˖U>c|-/j3秪Ey}}|$#tHCZ; 4o^F*hMke [tqGUeQFfqAzޘ>C;H^U/yK^{uǨeVSȥxk7+`xCrk\K~$:㔓w|CraBkt] hj~Ovd_IZfHRn^#j53t7˶gW$IInPfMӏɱwQ0)y1FW^qnյ7ydhzm:KeggKg۰Vsչ瞧mK.; ='>֡=:xF㟚:Ӽ{ َW_. QCv^F۴Vᄑ5'tCdNiϽիVW;41@eeg)K 6#:!}Ή>$w~d}8m!&N?o;S-[x؎Me47]TzOr1FU#L>.:RM{9efe:@@zy~a#GkըQ}eUVzռY}] 8v?;;[G}.R=5]+И2q,y7n/@d{Es]&o郹bs,K:3tڟO16_\ߙ/|S9(z}ϵ312+ H(@!8Q&eucO=II RCzi5#Ԫ9,YaFwt}"uP#}nhQ7]#>Sҷwͷ~''j{VFV]9Vsޛw}[ U{^˲k,ԴogLp֞cU"_R4)m2U]}k.z؎6lب6MP^~NtLzF+П.RNN6n()vv,SڲekgrҼm;wUktw³//?jQ\eqz g}&m?h"L41, ,)][+_~9_M''= h]ctF>ZߘUVVJ233UVV/Peѿ_ W^Y3g)77W] ,C=#G־>$vfD|򋯨J)2(3+SETXLN;ImL{RTIYYr8Eyx`-n7WfjҬ@gL|Z_~1_{~ߜm>@I@2qyy{{:tOgsU:8vzCͅ >$͛7O:a|@iiizpRk(??_~ NК5kԺuk 6LQMfIՌ1F7nʕ*TX?yI0y6Yrޙ4aN:e***슋kKRfV~.g/6oެQ#WEE-;;KwonWbűy[qcUUUɏM֪jޢ_}Uԗb jϽFI֭]͚3.eI9sv}ϭjw󏵣OR8B3k%(.#O;D~i9Qq{}䞄6^NI(Iq#y5̬,-P-JZh+ձKGefeE?\t9ѐCNH}8cǮ^tĀWs_{hW')Mu ;aS=壆)+#SN1 9>[]ԟ4C3kbYrZ7#4n/{)7'/|sGwU*I =4;44$Ґ##;`yS (A}a0sIOOWAn٭J eHy*jQ&JOϐD}4DWrƗd,ege+-5U1,Kii1g$P"Ь۸ί9jѢK?m" vfIhzuC/*(<[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[E[i ]mܬk- ]T~ne5jhuV^YזUW ˲dddɊ8*1=&3xlq觌{Kѯwm:Ք+T:*[eUشH9ل  6SmXq鲂?=&5ƘCK(JqeBA)+F˸ ^'x蟊Q6G e}3{ێ핳!E#оڣeX j@j[ 5fD 5YD IDATowcINDם1^Q9}+yqOѻ#cN0D螕GOs+m-ڡ]Pgq x )*H7L)71a&bY' * %&Uc8̤pL(o_8tEBd%!k8o|cF,ۏ@3wxh@7DΚqBmxKJ1P%+%:4D͋YQx"ziB'=v(BIacN^N0׍J k{Kv;elPgq8N00h,yo(Hvy/X2rb"C>$.[Ot~/F  Όcd;bSM бbG{9&%,*l]2nfšK2u[*?'=x=:&ED= >ꃉ`bN(P1j@$7룟'RLPDɦJG*M!2az7ti)?7=zaogbY3'H==4P{@9ζM4+!7 QbBNЊd!+lx`Z{CKﺾ*O?\1G꣼ܴ+y{Wo%x6= Όqm ?@3=QL,iAi9.薦7F~a o=V&!դ*//Oa "a@Q\C Pg{USoNMFW=\ KS[!M6$>NZ0q\&?Byy)HKm8̡Z#̝CSz5ҕߵm#̖`2S3S8E Fg;S;Ryl` PgqѨJpuա(M??nh$I~:Zd5d&M>Ca Pg Cs˔5Z֚Wn~Hf"m*Kk*B[d{N_ =.r#qj{jοQ_,ʖݔe?2ҖҖ*y'mH߳A0j@}sʴm75 Ej*G"ZR%XRVjNRUg'Q7c@B Pg A &`YR|Zj^0̡#!IKcfkyLI-wm9A@hu8 Ascr-x{9U9Uv0m@q* '/-wո6hMC^@3cLD;}=~^4D;"2 =4P@9Ʃafsh4:3 8fg*gP{@9Qsh@hu֤qSmܸA ]+//WM;@}O}3Hy8UL+Kյc. Pg%E%Zl~Y[Mk*)*ih;JZ6t1.ohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohohoho5tr6nZ-[4tQ|+3#SjըCYyf^[vWA^,˒%+౑Gsl2e,ENRܹžTS.R*ocח˿Wa"dj64:PNmZU~Ncm c-+=VF pq.+x*rD)=x׳ n;WΚއQBskmb/% 6Wqnc؛-wdɒ wmnߍ%9=(^wNDP0xD7=MD9c,n{V":c;W| >ϭ _hvE@9 66"zd0v8 3D`OeEWcdPKpdX((|^/PWD3=3p:;c} Fn(Id")szSl? ΌcWRToͣqE9k -)X2B)F5/&gE92 ء` % 9҇z"8@^7:(Y&|/Q D m@9Ƒ8qLD6mF&D#ّ`Q AN\K4nLl"?f;T.n]Gucy6@3qd;.EmvBZ 7ȉ / !<̽v+=@xY84*I8?(L(D S M =12n8 Pg^sLd`c{{bW J:><'GRk&_VnSSoVy>VM~j:w);rYf'4߉1l ,&ܫnM0̄>  Όcd;bSM﨑bޑp>Z ,1DVN9+PozIgyXx=ى-_DOKԓ#^Psh4:졩Np?>ih|H+J+{߃5SNnT `+jRd\+{cn@ Pg@ wAqgEm 9եݚfj^҇m~YBRh~=b%[I-b^0j@3c!gOŊ'I&QߌÚ7?:WjmeZ6WЪG&ꂋ*QcPzh4:ssezs7ѣ:J:(=3>Z!-/XY!^ݚ[u 94Pk@shCSOn|^I=J]wˈ;&`4KT%}T*+ a=1{g̡#8N6eY_e7/Ђٯ?ѡvKdGvTTHW[0j@ot ׯN?Lo1"VVHk[+77߇D PgcdW۫Pt(;E߶.z~9m94)#j"ؙ ٓkf[SNn?|J1j@rLFs.Nc <^6ݢIܼT9uY>$.@hupMv24jvׅ|LҞl76WGƫ}A&h%}_CGY2̡ըQz`]4t>"yNTJ=t?&]%zh.4:sCΒ@NNzy$AE7Ȥ Ir@2#ѫ\srSȤC7؜I@3V0 =4P@9Ʃafsh4:3I:ƯX j@3'j v5 Κ4n7(77{jҸiC|@~")Q^CǷ6tevEI@3g:()*QWuגe ]*l\];vWIQICe< ]4'.`TIQˆ.4.ohohVr숪*qwmаRd)-5Miii, *ThZQyg1f2^hd/)%I*I]"%rH ¯%s|زtda1Ƙs]?>|3mx޻͍uz_zr!lJIWGDDDsC+UX|0PB#RNN)gNϽ4ӘKJ"""r;?~%80JXsJJ%4R*ZsI~%6DHd`FzfDDDR-*T͡H?Rt\-Q. 9RKXȵ81J5~3  a&K`7kէV̸ݻCx %%&]ECJکS ߿r>%4"""r)Nޟ Nz88FUL$3Fp{/k}K."ѥ'>س{wk#++\IMI9tвkQqbd*Gk[/ך&âP^xiytMDg>w۶;WiiguҜ;w pl7^4߄?Ĕ7&5%H?wK,*|2c^[z7uEZR=cQn],9r- .`kҤ}5kxuֹ_חm=AN}CBB8s6.u˖-d <50!!9|}}_,X9svWWpff&3f̠RJ;̜9ӭ111l߾m[dd$Æ ###]vrJvÇX"`ر[k?yfXr%ݻww3gK.eӦM>}N:Ѹqc>>SyƍǛoIll؋׎;4hK,QFt҅ &oqFF޽{^;:y$:ubΜ9$%%uVƎ_͚5kߗ-F$ך8#ad;{<B5CS{c2-Jtǎ董t}5Fгk/ΚGፍtg>m{o7/LJ+W=iĻSs֫psƴ>Z7&IZ WA;̚1 K/vm]6jMB2wi٬M1I;<~Ch.nטww`(4u˻Xڋ*n:Z55ϖ\p76[ZÏşrmmhߜk{< J*ΟP羈}}AAAn*Wu# B TP\&Mٳ sctR|}}yXhiiqy]J|}}INNfժULD^9ڹ?3jH6ݺ0u;ӃW8>ehUK F=5Gzc1n=ߚc_b/yEjoм4i҄ۻm={6 [n9۷0h֬s[ٽ{7wqǏwe,[O?c={p-xNiV^3DZcnhAvƾ:(4m̦Ч_oѵS<1p@o\3sh~v[0} 4`"O+$%%`.Ww~Qu^ٓPǏB {ޜvϏsΑآPIIϑɩS^scȑ#Gt+Hpp^]Zf?ÇR>FDTv&;Ǔhܤv)ǏgO+WqիWS>UtؑiӦ9?;E  IDATyڗwڵk {u۾`6mJzӧsa֭zDGGe1!! ##0V,X={:ӧӦMcʔ)]=wvv6UTqΛ5jfСCT  <9tQQQE:RSTcgѷc޵7gƼ9'ϊ:mva>bpxW57*&k&T5j&3`M|~ uag+?g? eggϹ][Ƽ8`Ãr `ajW<5l~~__PP*UПҤ-IpUZUXܖx\iigy3m:<ЁGro<8W3Z rU\m^UV/$$Z$)++%KADD[>z< 7܀?3͛7`/Zm۶c<▓CZZVwԯ_6m8ݠmNW5X~|_R4h?qn߾ʕ+YaC^wfÆ \iŝCM֙d#+<֣?oN}b/[Tֱ1$"ɧ:yύΜYsƺEvm[v6aj^kqs.$O;΢?YVO&?YzzwKVV6G+ =5a'iq<2}\A麞 `+wcxa} a'ΧvS}[%()cLjڂLG|q`e#,y#j#v=D`t<# l!6KztͻxMD0vd^[{FDDD1L|8{\+5MK'``Xl=>9y7Ip5Lwa㑧o=E-#:z5cq2>OͩZ-M'QMnjzhsҔS^_J*yw/t)+k0칧}ɜvZ }f}qo^!nbVg gLg4x㝉;yC 4L:tl13xؓ0qM'"*oBhն5k\û3vW~KCMh6g~s6-ت1{twѴc;n屁hߩTRIE%4cv7Ɨt5ʌ{w IDATxw3wGWA r&Xc)F/&{$IT,"vPN ґ^︶uw{}n~<<;w<GOIJ _mtc/V,.3-.JhPoZ`4|Mkhė7wV4H3[&/dbih p1:r БH`i]G54XlZN1t+7utW&lؚ0hC 7x7u_H|[-nݿY5|3[n_xiB!8 JKjHV !FY>>3ettCB4u#uvvVGC!WdB!D s B!  !Ӛ`(H( PtrvI%@B!+ 8{`OՅœL 2[myp:^:z:##c?4=,¶iMSV>lW:] Nqv_U@8L؊nGCl:Dٞ*B/]rܘ(- `tҽՄ^m8_!/թ˱F6ڶQ2LV}inw믬ܿr 2yzuMô۱/W#`8}"z-} ֭WSĩW̄# Uu+X. xu2 q 6?ˍG(MSu?v[_;e0>c?* ;˕` UVPWx3p*tOE6!ZyB!z *WU4lã ;lUfi+DH~vUKlZpf{#g_9!Z,N#OW}~1sCApϷZ7qĊx6t51ѣu°[VHH[%4 =?OٿlwnkL'%֚`08G^_qz(ۋ>ZiY;FY~˸t3J 6V3pFg86_{\N4&͎fҲ ڝFn]FvPXap{LsdZ[a, fi" ԴepLwab laaxy{Fw6~_f W 2o^G_AV]}T ]ʗȄ9g/̍ko?'{!˹վ.Lusu7e95ylMHjMUQ'R7yٵKZ]1a']`{hgmME!M_*K[1n-~VIkҝr[ٖE®FۑtkD~:sU9av #U9vEim;݋m 6L)7% 'KFq9y{x*s6[nS :vNtGwY7޸W>S?o(ҏx( wa>L㶇3겏!_D/F>>-.alpu‡b9?׋m|6K1`[+\4g] 2[7ߦͧ04t2ys^g{lǭ_.sO~yyeBCw.ލ5y>uB$Zkt`0P]!.8b$?\eGbpڂJCb~D,]¬}5u8NdEvvM.i*\2܊Pz>S01*뭷:\ ,G_o&Ϊѵ]u_%]7 r|!ˠ CG`:xy_d0~&耯p mjpXS 4/Y|f䑩@ޔքB淉QwØ.n#D^ |T>hwIBOJ)*|ܖv++qɄQr g34[X>?Jcotж:=TmP@)I{aTVV6h+٩咮TnXP b/U@ÆS]RUj# S巰˸V~+S%eMlȶP`[j)?;TVGEEeAڤ nK fe)~ nmkiB8:`7.4nb=>CGC)~46¶B*q2n>pWLe,/YFk5 յ2jMo27q8پ#'8-ʍ&3W5C.澿Udψ<+,lb^R.Z. 4JkZP=)xQ5h>YUh3q.sw恿Χ˷v%k<1k#vw(chv|F guij#R6mA;~=/jMaaω\ueVǫ+p8$V &8_=/p7hq(eQ}ЗcEox-}ލM.Bwd?@#i4~zwڵ9zp\WG .0ݭ;GQZb1ч{,R6XA^<&.c}w"Ι8B厵?}&3nOx /?=;|cv?;Spy^/=6[ֱߍ~Fr/{/:S7FPc#flr3Lgk9'ĪʲkѷMAT/|[3<1p@9[W|EiMY71>t$%u7Y ?A3HKyxKԿJPk mpç1j;NbJs?Sg}NG W>x-;0M斛2Azz-ZsN*@]pRAm$RGOHf@{v غEGWCvPs 9=l TmVOݒ` e4xƢHvauYذpCa rXZS8Eu;m۲kWt\yy>ۋJP5z|܎ٵ{^i4rrrٲy@={%e%xaLrZ3"h$ $Ѻ†K&qCHhōO PZ|! BWê؛ $'KnPvm'nO3u ]6=ӗm[zr@IQBOAuٶ͛0-?lȶ薗m[q7? B$ᠠ{mBVv!DǓoakyX{і,wY]N՗;zsqp\gSV^1!ڢSj]zW6[g?!֗^lJm}]]AlH"3ft@m6ł\6klC6Ä'3#;;0t𓑞Fp$l!Dt`]!D{'m{3ds 2z;?18#ZonӇ\g\Hż1s%Vr7HNb&Il+;1r5ywr-#6m#1RQ1߿`ޏyWɼw\;:Tʊ)J}ц@m+^˫GQe)_/w-I.eСsYKc9 ]gKkiԙ3fx tVV-ߎ?vyib[^/Z`Skۤ>~6/:U4\p+s;߾]Y{j&#_Ho5_?9;7a'(RCG}gad(`hF(w]a{#/-/ z?գǒ?M̚65Y뻯bTf?'F~Z;+/ɷvs9#*XgɛLHY GF&nTaՏnEw[q7^d l| yLH6+?A|<\\1&Sa'q=d'ǚW AB0abSvtJa_w'*<QT-aS9ĽfQr6V 4rg@8(2* =e]{ʷ.^?i>0哥Ec(ݲ9OP%WOssKQW_۶}qBaz]UچlNݍ7~If~r#OaX8~q匯s nA6 β8_rF?wBd%Y-lϑwJ ]]ŠK~af<2y]2O̅d~3-u 9 0tzBktVDFT1'g%.^ ۢ@e=__ÄܸR`3~ z7O䜾.*0fT;09CSNhoWqHF?a{xhZG&>Ѻ5*ZT} ,q6SFgb4͕'a9xzJOʗWpY(?!ue)  ӹ7iy{lyT}Q 9`￾V?|;{ rS>^ĝ?E /?䈁{i?k^+.´Y6 o~/2U[ѽc5I9k>zq^v;gz˨Mx{/eJ $$ޛ:SWҞX;1< <:NOgռ-y~YWS){*F_ݿ{bG{|maٛ3[.V;?,˲N͂͞uULt,ṇ~g]'PYff5ML;dVa/8bL ?ʝw1r~R!,D iGjUiѣOWNƀ"+Xbywyq%2sMZ"m \73#n9y˛l]<4qGYAt 2 Jm>xɑƑ/D_\VwYOT: IDATLq˳HpL$V0 luZc۫d=7%Z mDŽl 8N>@Zp82ܙ䌖@-D8NW"9$PRo[BlܞEo#Vadadse?]n DAF~VvMZ~/,zUP6t [5![79KF;-loz;-_/h$+;ˊP $Peqwɱf'*5hv]J)f& G_;1H&.#G(p\xȣsnBl(Z_ɫr>;~{.> !RGZzUU !N+Xs l.aن6P8LG1l± 9|"_ !Rt`k!Іso2ԫ糾rmEt^h~Ɗ7sGAܹ7f΢djvW.]v\Gƶ˜F9wrV_/]'r0$4_OͲO+GvD~s) @ΓLj[w-GNT@M?SkGp卓#;)3 9"?x ~,("Ooow }Gɒcη9"zH>( #;⻫ջ.In>qn2l/#q 7M^sGÿ>wr̭W0.&fMɚW1*iUʒW䙷{KѹDy\a gt'%E2Ff)=Oz]i۹|Lf;xПwyϪg=oQ·<ˌ{&0\rkG<\V>~~ %ۄ=>ּW^4pnt(,I;pjU0'nicj]9v,zjM)0V147xqMdI>(2* =e^:{c[?>k͘h5-Twdy\,`,^Z]l] z!! ~C3p`kÑ1d11PT5=~}tOr:{dPA ue)  ӹ7'Nay>(~v%=x{^w̎.^ӰFMW0=c~n;.e]"=RāY&7)g4qy}?Mp(hw[EG1ӻN5{k:T^wM=4yP/ơJ k r" &RUʷ`@}~9;Wҝadg]Sy5+Jm*)?I6$Ncjox%Pʯxy\ɵG2pbJ~}~EL ŷXk>\j;]mc]b/vtE9ރsk`.l^Ț&֙>n?Mlt`iU-KvΝˡ H m"߆l9 UYd.aka\cw d%%5YVK({h ob"-Ŷj]C^I~լx WM *m(XҾ>Cp9t_?KO7 K:]1_nAX.֙ě Yt?~/m/ F\|C_=yXtx<8gP\ca[~R6LBv8L8hHML>>Ό_ELu o/ُ tw86j|غ}ŽϐkoFM+? Mza#K~wʷWgoLϦɝEیX:z9o}%w~/gGd<>{:A_y3㕇z]9D.1 N)<=AL­Gf#k4|2aMK0MtZ+ɢ:5'OO+OiEeǒ%Kw)CN~+?3wavI 0x"efu2޳p34\a­bB3PqEK䌽 c/c/hj'pݔK?vwv|%݇mv>_J)vömBPNؑbJS::?:=UXx9U;,nLD8 Zݢm T4ԜTAdďfu?]_7է+g,-gJViإV^;r?#Q T\kR:vn6nHsd:E籺*^G^Tk99a2eL:JLQQtފIx"t]&n֐@-L9XmE3X/Fdžܢ]e6Ym6>vwW^]8C sA;E6hHU󪫚vD S m 2׷S\jGzncύfֶv贙ؖ]жcz1Kyns}>aX&gC2]ё:9ƶrPQ7~Nl I=A^'=ӜJs+I7qA>+ڣkgd6lmEI}c[Vmmc 45ODiVmGj Am5gW"R֖Y*z|f" cq#ݻf_ϵ}Fvut{Ddq6ɨmkFaEwe,DJt“AUzzqŖM&(LzP\Y튝ulxԞ" 'lLy9 BȄ'v $6ǎ7]i:jzx_ͥ<)=.pG,ଯ[x@fc`pcwm'&Ky}Qdds{CsSBݬjV%EZF2ٵ&ʈV C]xefN]ֱn*4 ڱ ]W%Ggy@fԑұ0zd(\˗}!o!sҵ]߱L6֪~MKA!nZ ^K&zCs2.Nh-DGEJ5kbqj?il5qiᾟZmҺMرB|D#]*"=.`#7\l-76P_cnhĈFrUsR@"#[pwquG jXVZ3 qE6QV; ?V~.#viVoASrTĦѹUsad7؊^wַXs'Oku~ii]g-Ǩu45ٱbٔx30 @ aR2=~G'D?/jm9sjwc|襁F⻴kXјQ0jm!WS5l,_e;hkDblFȩĸ_ni sv*I$*j.AGV @BbR)IYPK@,EJ!㗤v (c]>Oof{c!ِ}q|dXzEۓ1&ٌ|>tjnn]::kkQk&hQR<{b=1a6zA,n-`ҋw#EEl rקJN0="ܒNjusV޴?uvj-rǢ,3+W? R:G 0 =ݞN.zڼy'FC:._ʙf" ˔W"0M!~v&4nMUz>ty^=[*'R޿BlWy7-Q ֭2NWo\׷Wu:5P(u罩%UW=yoOJP[qvsoEcT7T7f]S`1Xb5#A j,FP`1X$I/?u95/͞hIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/statusbar.html0000664000175000017500000001013713203343735023120 0ustar jomajoma QSSTV: Statusbar

Statusbar
statusbar.png
  • Radio Frequency: the current frequency of the radio (only if CAT interface is enabled)
  • Drop down menu to set the radio on the selected frequency (only if CAT interface is enabled) (see also configFreq Config freq)
  • WF Text: gives you a selection of user defined text you can send to appear as waterfall text.

    wftextpopup.png

    Send the text by clicking the tx button next to it
    The %m will be substituted by your callsign and the %s by the average SNR of the last received DRM stream.

  • BSR: When a file is not completely received, you can ask for a retransmission.
    bsr_select.png
    By default the latest received file is selected (you can select another one through the drop-down box).
    There are two modes: EasyPal and Compatible. EasyPal mode is more advanced and is normally used as EasyPal is the de facto standard on Windows and QSSTV also uses this mode in BSR reception.
    Note: BSR is greyed out in SSTV.

  • WF ID: send callsign in waterfall - this is a short-cut to send your own callsign in the waterfall
  • CW ID: send callsign in CW

  • PTT indicator: turns red while the PTT is activated.
qsstv_9.2.6/qsstv/documentation/manual/manual/statusbar.png0000664000175000017500000001270513203343735022743 0ustar jomajomaPNG  IHDRd UesBITOtEXtSoftwaremate-screenshotȖJYIDATxwXYOjPTu(**bWD,kQW]; ]V]ŲVl$)*MA@BI}@y,\XTv7yyH oW#9)H~O+зk~.,SW[7z8@[һ[XE=}O+зi?Xa%LTTT~@EEOg?> tWKwCyKJ 9 !D$ ss:/m[‹g>~ 9C-(,QWS3wAa<}歼:&ƞKLcԴ?-jjNN>֫(+s{oT0ceeI}hO=koZp)$4,77WVVq-jj I%YJ> SG yu W.Ĺuj^~~^~1QOp;I/Ԛژظظsa!\@a[/(, }N{)""OE͚b Q4z\RSʰԌ~qꕘ'01kqϟ>z=w bJt:sߐ௎ 2ds_#8{0M>q$򾡡|*:y]LMNHMNX`>58Peri7_4p :#+ B7X,%%Ňwo߽}C^d6{lŠ *++#ǏN9b8 *))Bl J|s~(** A~}+++N:"xnfox}7x[#6K g̚9CUu}6o߾ÌU+ijhhjhxmɫW.7514p4;ËyVV6渻@vvN&b"nKK_fz[ Lf7octu016k#8^6o74"IJIĴKϒR휀f#YK[֎Nc΀=}m]csq~E \?}WP|_\R3gTaZǼAkj蚘qʶXSCs̞5]XVal2$1llD">||qo0fҒL.u$6sqrrl-jXG--C WP>tmt= ()Mtt,,-Xͻv6" H#7og65  aMll8˽_~]LvX,l$l!Ly:fOZzژDZ_b/szi.SFS)e^mjl a嬬 =n?mnnd<~ $#HKKR 132ڦpR7xFffUUuQQ@U]kw5eeK'@[ j055٨ /֭Y߽-?ooo11W66y:t|SRR*F>fXm[W\i3DDD޼Ly` uӧFq11~AԴrhԞG@=2XR+VD7TWU-Y$*fjbB98P9MtGlZZZgϜ74ow_+WVQQAIHH,!d$ {{wo޲e%݉GPRR47ͷ twz[֥5g~&WRRPyN8H^a23!q\NNVJJ xVű׷ '@c{wݻsݸh̟-+'WVZd2;*=a?y*))NǑsk!oovVfB|ܝ;wSSz/^UMGC B iiZÆqE22aމpP"#UVUi UR(mb#g-/7K\1c45yzzB ^YQ!,ͦ[m^~TS8uuuzgEy ) >ioOwv&TCCÙsgq!>ޘ422t<0kGeeh%$ l?OVZ)룪:ijz[oDQXСm9s=$$s99< : L&q;ڧN!**rQ]]]O0Av[M*u7xce)T}kUH@JbX,6e,ܺeAcrR(&_bIS$%> m[#?Ϙ: !={<㝝yr_EyOu붋>aL>~>}zVaouukVs*G||'dFgXje|@Gutb &h wOzwx:G:M =gl6Xr{x{3IރX6X z_RZԤla>rEX?W^WVUIHHhkOr2"ȩ*&6.0@rK`iayFk++NwvLws9#?]G}0=~2qҤG}{wstppp:W+',x!) Q𕥥cWs^;;MUu#ibƶ޾qTM ߺ`ǂIo\X|o\\\|M a?Oυȼ|`65b!/z_OCWWW{yf٫̹6E~~EEEl>BDDf+**vL\\\ |e}wW뾊$߯9f0;۰0)$м9$TkE51/#k*f>8 dFu&(Ppjzjlְ/Ɛӧ:}GvPAwIb%3:<7IwʜQ8Q// t/'t>&UG:B }=GD)La+5dG+]u g~,fʠXe)Oz>'BD!ɢʵ)8t.hVV2 X*^c<炂$&&Á@ۍhf5k$`?ͤάqx!|}"]v_h+^_,5ɎיOˋf'6Z}*@P#Ƅk\f* .>|өjcWjѱC7SoT+'"(&ÁZfBvhb9u#t U)t:,X$ĘQ4SmR^~QBj 3}/ow'Ǣɒnwo !Lna7\Nhp/qzKiXÁc?b[YD[[Gٌ̟x|WS^eQ:\l[:M6:O}]v`VlAe[W3anԤSqk_Ћ?+yNh FqzW.I1S'/yV]Mױu睴mقGUk͠I2/Ҹ_[_odLu?V?,G9χ%AL{狂 &ڎP+[{ $\w/Cx_R9a%xtAz8\z$0[Z,|ް`=[]B:&[nbqmZW I\ 9yNX+dY_h(& -Yլ5`<3̜ԙ$Y8_U:ݬZݘ1أL'-GN5tYr?IUQ*(J#J`:f??},ސpY8_ϿK+2 6J[e1י1 ZXeQLT_zR )@xqm!Ģ4bsرY@t݊IQH/jh ]R#):ϋˮh&{aެoqqPY蜘I{(,tiǏ<͝[`]îlCKNJWTsTExX,|>^[ydnm6;i[x} >0lKOPH|6{A7ҽGKb?aV}x#;6qdn;fE'gUE,慏6ś -LAܧ,ǩ:)AlOf&(1_w9',g(|^|/9~Ea;"Nj *fWQ?_QQ,3&yH۲hIKοy߻jᰅQL&87}Nz Q5i@s]K^(*;xqq]׉,L ^8۳et]cWEU+3|v8TV?⏖ɧNՊ$&&vpĉGE?ĺM385/WЪ/0tx}l7\f(\"&bTMv=^z61%o. kїq>rX.䣧籵Dϟ()7?N[C+Y,eM֜NRjm>!c]m:qv355㙠kNjPHC/,@52~|>(90 "11&MRf-TE?ٵw9әt\]5m-~XWЃЇ(EAXP]QPXb%Qrnn_ deŌ+M!&c˛^r8]^| g=.>kGgZe]@~!XD<^oe.q~|>jjbaO1((*IbUFx:l BO˿nBBB ܧ^J!.Sow!>HBQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $@BQ! $|+lIx6!EMWurqv$Y! $@BQ! $@BQ! .PW^9B\"^ٳg3h zm_|m8qy9ÇW^ <ŋGdBSX[oc^~eׯ#r[zɓ's嗓~UWDBѣ|,\$իs=ݻiܸ1?0?ছnbڵgy ԩS~|M>:v@BB __\:wĉ>`ɒ%Ę1cԩ b̙$''#DyΝ$&&SҳgO/__ϴiMoժƯ7_70m4Ȋ+5jTm:N8@KbL6-s`qXc2m4233֭?#iiitOPu2mժU<;v0p@ϡCdۗxׯ=dffҿEnݺe@UKBZZ)))4k UU2dH$۷oO˖-޽;k֬sg|^brr2"+++8rU橪;$&&^d2:ڵرc۷ 6H( qH(֭[={2}t> FԫW,_$j֬I.]Xb9998qO?]@ Nps[nE4N'{m۶l۶~ MXd ]v wt]gϞ=lٲmk3f̠uF!.0k}~ᇙ;w.#GAxyg;w. 4[nٳ{Э[:/ .u֥ٯ_?t]'$++hϨQ#ծ]K!* g!8W$@BQ! ".'2j(>?jΰaȈ.✈H(Yf͚1k,.]i,[ۇ !]DZ- . ׋i\./^̛oܔ)SرcnVZa6IKKj2m4ڶm!D"RS֭;ѣGxbRSSx<,[<5j9r$gώDQD$- SNetڕUVѧO}QƍGZZZNUvn߾9V!N%❷,X-ªUԩW^y%=s YbvZxHE ڱLrrrFfV=a+"x!6lرc7o6 Faaa$w#Donl[`wq.nw4l6"gl63`Mƒ%K!N-lv;M5GKQE N;D+;qA񱕜nghve2fڧߋm!ηSۯҪ 6{q %iUA NAPֹp}5O!*BwH B@-@ӴsSsDӴc:ٱP}~8p }e?p7\v۶my着3ݛ3h LŸY~vŨQ1b7n ##ÇBk:ԂB^^zZ|nno!Cr3y~'wn7:Ͻ#Fu۶RxsMxWB|9Lx奨fh<ZѹDQ<_>7_w}KLL ǎcԩ+zn7n̬Yz̛7z,^{w$^y:tY{*#=ÐE_K֠**`0iղ%_}pڵkYhwy':ueJJؿ냮{n7]'??_zR>#BQ5EC4 絡%//JTT\ܓe˖T^3bĈ b6ӧO.\|ᇤ3cƌ2Ӊjc>L=K/ڵkQUI&qWD08'BPx_M'ڙ(#F0qDٸq#/RL4LƎGVV4lԈVZq7k2)>==z|rNL~Y=#1.]VXXȪUHNNFQ:wLÆ C;xgx<?7|1cƄ,uXt)3₣[ʕNhhыW$qqz̚5 &pC<̟ܳ?dw1cN6ٵkWx"%;q(St8|8?S$Qs&C/Zkyx),dsDGEq]w`a II8"rOg^۷oL@tt4?^9r$~;[n%==t:wwa̙yL<̔)Sࡇ **|0(9.7u\ v /9A![`׶+WR')-|iӆڵkrg'޾}hؠ>{ܸT@6w`: yy<}2JةFsMxdfǶt.W/J( Q4JnukuZBڬWFS(yܡ+Ų[dBȹ IDATqѡc29 E!*5=_wkq9H GT4C.aoCBQJe)4,|# -Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (Ba (pVv헑.BT mu8BJA.@BQ! $@BQ! $[m<"8*)^խg!ECVnr,Ba (Ba (BaP,,,Gl޼9dzϞ=ɩv&LܹsCy^իرcFO> 4K>|8zb,^ Jq1 bY^/?8gϦf͚am#++>C ʕ+?8~8>,7t7tyyyn:z-&O_NNNNp!^>6'|MJ[~=Æ c̘1Yjcǎq5i .';;;wt:9p۷!.BohyYt){ NKKK#%%f͚*C Y/77ARRmڴ᫯⣏>[o%66\zŢEhҤ &M>@un$83Ox~^x@hL~~>QQQ|̞=.rG!@չۘ>}: , **D#}8BYZٓ(<m۶e۶mohƒ%Kڵk:N@-hРCnMp:΁BQ^{5n݊i8N{6OQExÇPV-&O̴iͥcǎ92dv{̙3jEiԯ_SЯ_?t]'$++hϨQ! ! e7 [6aBo~))VR?ThB# E!0PB E!0PBbĉ5>1l0222" !8'"k֬Yf̚5Ki˖-}ԫW/Bs""- . ׋i\./^̛oܔ)SرcnVZa6IKKj2m4ڶm!D"RS֭;ѣGxbRSSIHHYgٲeѨQ#/_ȑ#={v$"g$"hX:u*gϦk׮Z>}裏2n8Bwk@9x`$"g$>/X[nUVѩS'J{1̙bv`Zz.cY 3SzBC F4:Ć ;v,fa(,,nٍyl6W߷Ұqx#G4gϞwߍlfL6%Kp=Dr7BTiG`iڬ9_Mx(JpZE.P t(9B[%_!UlP2 ˚Vde wA۷nYNk2JPa;$ZS .dɎYdVx%ðedR ,(D%딾{@(08Ge<'JZY8ސVg= E!*@mdCjGe4{#9qp۶mxN`p)S&Xb#ל4Z׋(EI( Qk_*u)b>a6߷O_rI,вe+Zlð;߫W*zWE3c )!(7%G"BZ8ke>D]bQ8)(*UBhMQ؟dB>RֵeM+:NY!t ]W(DUo .󌁈a:Tb@4J.麿xH0.9BTVܢ{T_RXMQQ86UQQ(:nUų"ZZ6RS^=6o]k LFUTA5k}:QrN4g5ؖ%ꅵ_ E!*FMXn-?|TKHB֨r %;yXcc+μ<:t־$d, _w߭t"]0QQoА E!*日]4!BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BY۵_FBQ)v(ilC!*|B E!0PB E!0PBn}ޒlC⨼xU. [BH( !BH( !B\0yf>] !DV< BU[Z5 Fjjj$6={عsgĶ'eH(1LlٲqѱcGW]!9qV.}>?.]7h 222g 6K?)!Cп>+h(zx㍌?!Cŵ^ˏ?1ԫWs璜ҥKSO=#G0sLf̘e˸꫃NB+"-d2q!&L^J׮]ysOgv)((nmҬY3ɩкBb@ݺui۶-vꫯ檫⫯bݺu 8_bO}裏2n8Bwk@9x`$"g$❷,X-ªUԩW^y%=s YbvZ厈#XV&999gLf3T(+x!6lرc7o6 Faaa$w#Donl[`8v^Kam#8{lnf3 `ڴi,YDF4d=ni|)E N3ο t.}=~^aKFw$v헴iס )`3$o Yִ ~' (\ ؾu ͚_vZ\٧DMa;$ZS iڹ)9iZ1XKNa;QrG3^I0,벹*cY5E _Y8z118v~' WfVh@UTtU{BT1Bq0}_V(3(hyʕIJ"E |>mڴvZ\} o>6hc}$'7nc?t|ԭSL8:i<;}QU ЋP1uߵpYX>mo7ÓYeVl ]aw2g:u@H3RC@QoJ@/&) QE?l--z>L t=,E@xJHhakBT 5Etc J~Z׊/58Ǭ fh"5E!CDfXt9g D UǦQzpYMQ%x JQJ! N~nnѽDn@  )?U(c (BxXn) Q\R7LWz5@('PUTA5k}:QrN4g5ؖ%ꅵ_ E!*FMXn-?|TKHB֨r %;yXcc+μ<:t־$d, _w߭t"]0QQoА E!*日]4!BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !BH( !NIu4MC]NBQqJ>ǟx|4M;9/#]!D%xx饗zjjլSv(ilCQj} OZ*akrWp8xr((d֬YW_M#+U*%hѢ_~%^{-v#GSeQBQQa^D۶mYj6>E9Ef3;wO?_~mvBtt[6rqQP{qx^f3f?:j.]mM7uAcX5ūt9h\|}>_:zb…qج6sAcո3*8'^oڨ_~̙3z/ @ E!Dj-«ʸXv-n FihBTXxJ۶mٽ{wpŘaчءC2BqaVq^'feerw3rHzMFE\|&Մjaf.$Vi <Ǐ3p@FOmrOQQa 8))\ڬ6qƱ%Nll,qqq8 )#55={rגJjj*dff2m4C޽yGYʕ 6뮻!Cx2yfnN82}vm;v=C \G}4~ǎ?TO<_~ᇐurrr;1BT1z+;v/ > 999<o%mfn.H([^sײzjV^L0>C>c.RƍGnn.9s0i$>sx >cRt|>q ѣ<ٓO>>G4QuލѣFҶ][]s [_'66vq.8p/+L&Ǐ'..hFAݺuYb ,`رme]C=_jlZVX`դE, ,{tMvv;-[ Q}1CV^QQQLzAfΜI޽ٶmuֹ`;mՆ;wҺuR'm۶s!ڶm2M6y NɡaÆdzrJ ŋyGزe Ǐ?=_~[oSLd2qBT]V>L&SȽ.]0glkn8+(Tsnn.u֥w<$''M͉%772 #~>}:]t k"{B\TU c ̀믿͛|/̜9#F9Nl6(&&&XaXh߾=sv'|B׮]6l+WdժUzٹs< B Y|6L6IDAT 6d̙vߟ5kBs!"شiSQFpzzzz60x`ƌټysp8HMMe޼y(œ9sBgbs,+|/\p]!0hB0\!Nww$ݝStvqD)N(EF>1-#n,X:N ˅~gAvvv{- {1<2~3}vTUU1)\ϰIӴ{ծ(m UgfqH1Ε.]Ӣ_oc%gܹƤIuڲsa8fՄ k ԻAX jv{B̛7}]cr] d"[k'ئ58>6nwl?(7СfϞٳg74$`j2 lnK1\MQ}M)F)b5"H#I)NdRj2h26.řp0Fe&EƬGP;j?Es2kIB$3KuFt@q4߱&Ÿ 8N̟?<}]]sx>}: bH! ZP$e˗qɸd=IpXx1}5f͞j @eUϘ,CӧC((,\ ^kPya 8#5J4sy׮]߿?f͚{&M͛1l03 b 7k̶>&,/ -{=??M 6 '':y途())A޽޳zo$*++1c :~łC ƤHdz15C)>DrAt1a?{)7. Ng5ڷo!v؁#GSBBxGAdHK\J lt2n:s=O1c੧›o𾤤$\V  4%Xn "|]Z۶oǯw#+ ^C AZZWl߾ݭϝ8qz[L^Mynw9Z␡DD-DD &E"""IHHD`R$"R0))LDD &E"""IHHD`R$"R0))b,応Å x(FBb"RRRzUgX,ƒ%v\¶CԫХKcM:&v0 i5\j9qcq51)F)_{т޽p:9so'8-BMM ty!-- +VѣGt:G};w|Gرcn7LΝ;!m݆oY,j*ʣS4? IIIkbA H߿ WF׮]qwqcGɏ}QQa[󢝎?l)RR:WV7^ǰaði&H)PZ/^e=z?R ۷;w^coė_~Z/زe Ξ= Ee7Fu8VO?:t۶m֭[}JJ ub !!iiiشisuKuzkcRs0k/| Fizz:m;۷/rsso>%1ʇDˠH!8qe9r;y`BTKVcƱ.M88,['ڕ=z:uĨQqpƉ5%3z!I H1Grc[Py8QZ ˅76;u)r صsWT@ jg5s.\).?)P]] OMMշ/v0033?g@xt".^Vko3{q|qMkcM1JҨ)/Ipܰb`'[0gݺs;oM`Zquyz!^9#FXx1\.7&N.>uxi\.?: ++ yyobG,cMUc4wB(AZ>/Q"PZ>oncdNx#232ƾ}jg5*x^> IDATxwxo޻t@)P%K6-8,"AEQ@C=㮌-,) z>C{{rHƿo(5<|޸qcvLA`͖˶/cqQ(jr{vv& ^$ItuAHaa!=zpD9z6Ed*FIH/ږSif|=}Tn@4 EQ.ܕr$4 UUѴ+XJ-C+>jiKײ_.j=~XW}Y|MIM)'SP_x̵-l6&F\(;DӴRO/\k@2D@8ږxܗ^f+gQ MY!/Q p8((]$It:fLJVjh(lɣ ?jiFz=z3TUYQ$Ktγd;u:g`AJSXXNf-mCP5ЫhIߣ - 6{܎+i*K.vȨ(e gN:Jreh+VKA2٩ɐYIGnN!6C} 3HKs)8" 5eb~~3*eE.k8 h!Ev(L8e˖~zl6m۶?`ĉ9sMx4 ͎ݵTPQGp'=ڹSI=2ɝwӥz=*y9d  z"½EysG9aՒTI, R)p^':r-Hq2ٯl+vEv;K:Q)m6r3D*:gcTիdž 8pӧO̙3ݻʕ+ӸqdY.!jrяןd~Uo}XGW݌9ćf2= Ms>UŦ.DmrGJ<&Q{28]eC,+(v VK!:hĨ(X. YEU呟$tRm*J(F T YQUkQpȨUo@_tUM30gǾ}駟e˖,jhp(&΃}nBVhFOJfBq*G),UᐱXI.,_DP2Qp Ev88DrΧ gS2N:~ME5U'a@Sv15¼$ }IpJd MلBU"(v 4( ,ӢE ֮]KM6Ȳ,E+ѐ kSĪvged, ?ϴ޼ULFHtޜ̚gfRVdhՑ61wpbxP$t&wªb'QQhstX2:Pps3Ѥisi(\,@ML&c[8nTQ᯹T@t4ZjTb3%3ÅcΜ9S$6nHӦMKS4q!/Q`Dl"SIRmlZsW:&:.qam"e0]+3~W!6sK F7/|6\2)?7&ҶN8zƃ)t~/[cQ:TrOŖFVVn#%ps+̧PJ"##IIIL2CRjUKDXrџw6*>P| R8if;=oz /u<ϟ㩭7P7ZqxzV liX2 Gn z77"Q8W#K=[^:9998.SUU/ WwTZAq8 WKDUvdP uq9ӧ[f۶m̜9TV^MlllJUKf( ObEqXQ%=^zL5!;,(fuJxi):LE-]-8ׄiW_|wK)XF.!?@Pe;Ռޠ 7774l{ 8p撛,;0LhV88G?qp?u}|z 7^yϫ.8CTUgyӬY3EaÆ͹`||UV!곑neDZgKϔzk2nڰ:dv;kk8ڄ;& pCG NFX* jUݻwsi233ӯpołN̴JY|2B gLLr3e>N3ml%^!g^z;! - TVHmdXG|t3*Nq(™LY iqb98flFj1ԬSsHϓHO%N 0S/881 5e[`HWeL$ ̹Z%w_) z۟,Zɛ5(pc\hΏr#;lnEo'h*  7Fv⬦(,X IdZ.) ne%Pܶ88IvziL&@fVrTSU6m6IbC+̧4UEVTKXd ID߯Ԙ(2O\K< (᧮2v]k4rn OU+[ /7Y'=wknj dUE!??$KAn,_Rrɟ?*t+9e;*gAn_~jt&SA322Z (00S9AA@DAAD@A@DAAD@A@DAAD@A@DAAD@A@DAAD@A@DAAnـ(Xv{p,f>b;XtOASk 7[4 9v)_m<j,G>?sjI6Ă;|ٶy?rUFpnl=Uyޠ9u+r*8lI`?-f;VwFޡ̜5L c߾/6!/Adί|!wUX>D7}}IF(6>aڒ>_J z`ۅπTu7}Gxe%{yOWyh|-VHu ŵ = |c͢agE81osk݈߳tq$3WGÇR\1Rq#f-- mNeӇ8C {V2Y<;l䥟b1CLSF `uǐ>s!r<-,ŋ_h=T% Bseh^StPQpY="qw oqvv}s<-^̜UMW2mR~>bA'AN¼IsvW 6txu OQ|u_[۽TLfN[ڃ8LAn u"]%S''8m$cZWӛe{ 7^az?Y6c6_vՍ]x>0ά̄;9 զ}` 6D.Zźħ]\AuDc`eB5HoIўgs]WH _NQBtlmI{1r.Y#Y4=A:=Dwv͂CWYC[9v~D*ѻ/: ņ/4{Gx^ 8RD]z=].ΌW= -P!㟡H&?" 'gz{zh8^>l2Imxalj XC{btP Hxz\T-%'{1FgogndV 8 12jX5-gٴcSy4*i3Ml =8NtF}v >Pyxg|wOF9iHFi@_m4)҈d,U*_Xg)K㽗xАzU|| ~y=|3TiFDm %_q jF?ba,dD@b\8 LLo(~[ZOI4c$s$ev]jp/[Pr&YtOv1F0qjT Ny_`!6&#lZV㩅xu W{UI>Ծ%^|4@Ձ& 3ٶtdjx@2#&NJoxoJOM& Z=܉Oo{sC"//*Tye$|j4#?{-L 8t|SUZT@hKV]Il~ae+ ӃdBB Sa%Pv|K^bYr*]4@J`['CV9Њv8MdLqUjkt1FYÉS,XUݽX1z0?Op&Y>>:ROvYΈ%*;(繺3cW MWZrR  507̼:~,7oh+_}Kťx w?HEѴi `t7ު pNm&1kg9d $::Qa"1EPݲMFʣ9/`՚i$pAqW폏bpL7-9D/QIXKMPU pjєZqTQt_<#hplt54 &:*~ы_%Ž&0]|G:OBԢ<%3vŲoӖc0~L`\ayltv׈l E+"a +ܐ|oCxY,lՔ7g0o9xULUyo^[ ]ٲ=sX֙6A#~9C{ ΰ~Heح`c5h]v}HGF2sb& Dܿz9 Q e2%o 5̻g^gFx|M}\.LzR~ϛ=2HMpַ b- T ^4;gyrfa,݊kkϳxhoLrN״}|Uv9Ċ'p"11˗3f}MJB:OvoqbD0B1 J½Ì|RbQCk"\ n/**PD@h' 's q%tɒ;U:?AJ g.SAA@DAAD@A@DAAD@A@DAA* MHIK!)9BKaE) AxX8HRܗ\!1%-'c \yᚔo[QFEJ\|Ew=Qk{m/UH0ꌴkUlAn,NǺuHJNb@@dYA͛7Ӽy󿴬YaX]]P ­OӴ\a2UUUt WzFEǜ EQAj]w@2D Fox㥏}r> .Q&ebf.Y˖# AgmÍ.~\t585@ el`Gjo 6ɛ-ah\gQUdn4;gaǫ3CJ }^Y_#Oo4nS~?RL;r)Zz? IDATaOK}˩̋ߣK|՜,<śPh ~yV_?f8aGC W@.SUU*%{e*qQgòYt ԙ >=+KxklU'$Zf&>]>/=Nl/̞3'u6LYL{JF7}άEob wkEЗVXK9#BW.:pΡ# .)՟$"\b~-L9X*/u @PHeׄ1pd+=gWXȶO|ihh{xrқF03\s[ٚHQiUVNYra6]JCaےդUzqv#4>>E?{#_>c*u>,YWɤ4,?1{Oņ-a‹ 9ۧLYV~q ;o ]zg6돞#ӢTmߋAYVd1զxYЕpe&app>~ %˾$?Uj*'`>.=ζ#r4^jZG Mw+7px7uJodoiYJSq,\ `j"it$x/4/1f/0苾?8uwv?e; Vz;oAtO 4VB'.M!ʲuD_!Yv&F4M|s %ƨv*=D-ߢ @6 59eiɫywqZ!weKvt:h2zrSH͋ Pi=򼏑$˾ҧ vl>AA\5ܵlNw'|r~:KZ* |L.ke1 Sۣ`{k% ۑ̅+gEAx>%}=cMaoLwz6" c)d1!'K?޸= ˁ̜;GLU }y= Zf]G%gϲ|1a:5Wzӽ:cv5}Zs@y8ԃiw!**2g|P i)tb+"&X{*&&;4R[v~+)t8Fl6""$o=<4Ut!,dX!:U&᪹ %%5W[xxx`YdggrqMe$M%$dE.HEgEr>DN6$ M) =[ue4*!5S>%^Kj [ p>᯻u,جdxwPg mGB`dSS-Ӆ ×$hZ9۴{ 6VUQz4&^ +l1ݙ1 }p)iwGG~q%9{ڵm/';; _c*fܬE܎V'A}9KS\U% >a%B-M܄ZƐ;&mØP9o= ?ϛL Yx;neZ˒)Bv8:럿E}eJ!'BT,s=r]g!(^۪`X}jI;i&0 N/A+م2z>MRmtE/O+m[\r4ZӱiM܁gY|ծ],//%X5ܢQzVՅCxbg{znMbt=3SX?e$Π ROf!L&:u5F4ܱ+nfrcM9.RRtT#,tŻf| Bp}><"[8rs쳱T^|NcBǠ Y?[MgLtt/\+>V<D{-Afs1t r9IDԽ~ccҽ{ SPZ  P~J5Z6 (vOy0क ؔVDDCgԃ&(4}IBT+HW9Fu do4oGɵ$zcWUɋ0=jfꕾ:Y;ʫelن/`ݴ߿wʶL/귨uR N Rpr8I-6O E :MGi [Q^!uxE7&tjOMX3xʉepWeLB[Qy7;tMҼi <<,w#T}xW_cPjgzM%̳ŻC|xcr{<-į2Dz^k:)_Y]#.+/'H/0ڨxГkG ÿ~Κy)O`c耬o35YC ܲCӴ %@{\mE%Sߋs'RfpS'tL2O8XFm+rLw' ;5!3FJQ2HIIN?X3Q4g1w䅍Q8v 'q`"jC:CsgyziJu >ucHAiܰ㽚F]r-z@'ٲk&/M╶A*8S dm)0we| o\ o3HF"F6e|/~y{#QPQA nL@ 3o"%<WNm`NNhW\(j~᝱U1K8M1zVL鼿F2k8Ƣ)mug/0l[H,X8NT(( ܠQEݕEYo~?/ֿ?uJJ~U@wSR]V,9'I}2%y;2^bQA_De"Lpv,LiBqQ\ܩ`u\Y;`Oa*ˇݺ:C6 AT ?Ivb&9<_}ΊZ L`Q*_ucx䞖.W1_Y3GMy˛*sK,T:-G0?v+~ţƳь:M{J֕]6U;'d?Pd8[2AnL@h<&sȽiU=] h9ltP^@L1=y_ɒDydc0GP)9x' :b~[e  O$(i?byZݜ%  QwC?L%lnjzo ӣFr|Py_ˊ at9eXj!rzE5C)odkVO2Ÿ>Z- ܲ$@{n;iJ \ wh%3|/Ӱ&M%$^ʻkxK\}Zh9Gfy,X0Sҿ a;#îY~[2 `7䰮fʸҖdž6JC|q%-JVqӣY5#ZNj>bWU=Wꙶrϼ]ADmi<\aVtsGÒisX1<q`'Ϙ*)FŘEc6Ycp7 vܻ}yDfK@%e<<ן7?6NkٛfPN}3ctѫTr~Ň3SI,5k#c&o0{H]:ɛ>G!oa0ͫYY4Ύ孬=A7$ +FR|KMe|(>ue؁85!Ov X9˗^b{v$B dm˻pΦQK!.0ptbl_E/`똣g\ 7+ 8W/^@k"-?K֡ ʕ2;3W"эOUdzw|Շi e~A 9$>In#M"ݑ?`YbOOPJOoٝӞg'ƎO$yWS#5-h߉MШ2<C`6Ed$ ~bXhڨ"O:ȹ%l  U3kr4Q'd`kj:3Ŧdxꁼ Z !ZIa^%a;/DESXVs:MU@BR>9[cKKI\УbR՜-ufߩ**68nA3X:CUQx]u,fk/>η] y~3xפqbDb IDATžq޴TuBBݪ- ;֤dim= 08PtmW:m"Sًf s?3w9Թ})cB|<4W.GEk9Zk S\i|{/PESs>J%- 5?sܹz$Z 6H"9Cn;ӨGkoLg_ݨ#W.e®݇!M+a4k6my WM <);O\h5Zo`\}:}4(dTtE[0d4|5qQJ@!, 1%|>KRYZt֥/wcGaZ+*!y8դeEʶ`VM(esÄCI\.M\r$<CeҸYWDC(ȷŲ nX7sH>ZN㊢}zo^4z:K`D I犱$ ^xפ/ˋh8eBC}Q\g)ZD.MLˆ oՙ2n\T cyi^q۠Amc&R8RDPNC\r~4F㫭3Vw.~*OB8F ;pxQ5ä}h*FMӶY5tN]x @~Iԋ>/6Jnl*Pb , ev#ӨR&z{℣\M@ kwBZ-nͻ3G=|n[]xi3 2Qupk hW! OiwKNÚA>ɱƬuY7̕$"#w+ޝ:B/]7kpm ۬y0Igdq%7d,>]9XA {ƴnݒw֊}f()9m9SOf΂e9Fqڱ}+;?rBDy&~LDoרvƍX`p-EE֍SS{A7TyI̕APXgd]U#ТrϚ[ºOae[%]9>wɡZ{P[ 8wwl̛e͞Mdp٘C47\sR8$F ]h-l0ƍ]D:݌ZV%4Пq}rd/*V) 織loI|XG|}suR9W₡*|):'wV:j)|qu4nefҾ-w+ƞI!a,9a3MVà Ju֠w-Im~-/a{u ) 7xCܰL:G [7[7U]yr_7ETFC}]$}`+Zs4|:ۿ@qQ*5,EmܻPrܥhqo:]n=tlqѐ|h]2Ubl%KM<8wv&{YF!+fJFnD]%U :=eJFX ɓze6DMb߬~#;uiq wZs-Q5LJ oe(~, sF!Y;KKQh1YB#dWiڍ>F* ~:tY 1TvDG[o$09V~KONcWs硵e&B=rm.A>%r~Tښxm!O3fu Eq#]/,H;sqٛNE~+#كQ]+D5~5貓!)+F~8ԔGS:\% !sƼCch4օ0[ `Mް0%$sdzw!~;D8@\+j9as#2:.wkMc^cɀyUB,3o1SgLSӁtOgʞp.F"}65k@ňpJ׫ǥ_\:9cTb_IM%rXS{%8+Bӿ})Nݟ_ !xn7!Z{O`V+5k%BYTkQeKٴ1p^DEM#rh;@͏&ѿk>)4XT*DtXp`ϜI瓄B~B Na(;~4y_֥2*[qoU󼥡Y痴1}>͡?|1:ĊEdn%x'R)TBgBTB!D(B Q!$! !$D!xû}6);/BaƱN4h/╞|yUBSOpw(Я {`mi4yC[eu!x@pDĨe$s~Z:A0fTu(gW3t'G4wB  AWZP]ld7R<'aS\NRݦLӛ=c)F2 ^oZLMJn84a3[6wʍ#5OXQ4)oJȥͳr'GǑ3c" vb|:% k6DaJ~ TǧoZ!itJr$}v[ mw=5Kxw?s~%])/=l*wk%`Ўt eݘ,ڶ};70mWsuљu !(lO4ν#>S=s)SGhFh|f}է7{eݠwG̃}H/GG7k' gjWx >ڵpBXH`!O5),B IB!B@BHBB!IB!`愨cq.Pp6n]x[а'lĝh2cw'qa:CÈެE8vMAÈL7+`w{1f\?䣷Q&Ä?ݑϪ3zl3hnMk&c19k8}[RUD$>njGQ[e&q`p1n_LcdV4U_)S6-Sg#w/PemПO^NνS7oK?ͮ\TZ> /lIJ PI>4W[m1wYĵߧ2b'}?ndD!xn'!&qF@[{^oukK?fR3Fme!":U#KI{r%=ג_3v/^rm6&P{g*ۦ ɤܵh1zg֠hĭb'12KB4^?t&-}U:y̜ k,ւtnPI˞U=Γ:|e=K$Ι8،n5)b W16/KZΘwPe6M]@tQNK9g9~Fs4Ac[!mPTh '녌mbG]^aw6rklp/վ3lzdC!xeP䇗?xwӢq^P?#04m )B\*X[RCkz.g\{vk3:m *)JL71[|%7/=)B1KB؅Ҧm[O7WAe.UrtFeBೞes%O#׍aڟp]*)`ic{7seo!Հj7R!ZoRnMӕ_1|3F%gIB1ϕ${*GCco';VIWٹaYP~sb7kCA(t\_ZI4`cօ_'Dj7|!6:U3y0OG`]\2ꝱX鍧B.ԺTg -߯T^es|Z9?)ȿ;IDAT.︰ҿuֲv~B $"'Ya1xRL`e' sjA/^Bl/CB! SV @CY s̋ofԢܸs5!P<56A>DZnwBx˳ O=BB!(BB@BHBB!IB! Q!$! !$D!(BB@BHBB!vRB! #'&MDq'EQ8y$qnSGLP@Z嫗"9%1acmEz-Ys+KρԜu=s|3g /@ #~#$!FAQġzi7[viPP/YQ{~b[]b}1${X,9gHW~3xcXڸ]c+XvG~Ncg(~H<䜳k5]6J`?MBAcZ^/Zڠ1]eI,uqi{اJgDnfάez iXQ;LTn6sj:zR4ҏ^|Ҩd4d^Q `L`PZT%?d(RK)>=+<|gro' +{ f:~Q &Q70ehС=by܂{:=q̩)}׏yL1^69kwq6 |b^\=vr #H2>lۂ˿Dhq*ـ7Cb -ɐv-2_-tkPڎ`Ȓ ԷɌw?$cMXzzoި]Kn/SϜ˪?#I*ݯ#t}H<1aYN@g#UuE^ s??w4meik[C+SLtFb{PK>/g,}fгedyGf;*wm-%t ]7|N@Z:㫱9R >}4׸懍emX{hRKhO<4)xry>D\Â/r&K&,^uX :i6ᢖSQ<o0G}0o ;CR>BRV_=žH-AM7w,%_=w$kg.); ?RLɌ }ǾI5`D1B-|J;" g,f!:0[UAT5kH:ڦ~X|M,OP$)}ÓhFCL¿*0Zܣ's .Y?絿uKx̾o9V(_fW-JP-g/a7U> F1uKD5+`P^k[{Gzm2C\wɳx+XU)Q#[v|?SiQW1Jb R"n)'/(K;Q@*W*V,wjO/ {juٕ-!۫$]8C,Df*~߮ƻoP!('e~D3+rAZlŅ hX(zyv-MdjSmGif-~~X%{]ׯ/ts*1xL lo!&YHo^M뱇W>āz4pYa^ͤ@STy nC@I8Ώ|& #PdC+\K49} vmS.q0 Ύ[Adm6/畏Jf2(K] petǷy5 lHtŦ E}oZlND?l`]l>eQ/ACĹVE:.JfC`Kp@t B~{:h]:Lɉan?:w8xa.U;k?OZ{< hIH5X@L~[[-w=ul=r go((J:WODEӎD‹(>U' ь ,!pㅣDy 6Sۚ0-g&-$rNJΉ$煠d0#nhm`(g_PCGM (@[U_&2bi 52XgUAQm(e󤪨*9_t4G:){7q/X[Þ=!ϙ/E͝`w[BEPрBф)sӣ%-g3ֶE@JIXϘgM1}ouyRHB4o2̡qb`t7F|Xȝo\UIéF{V/%Q7r_=GU|J8o8~r ]ʫ^ שL Z0bhdzL'ymxi%%sW-vUy_W&ct "8.Em:gGnXͣJb-K)T :֖引xWs!~+μ=#o ]kh69V5DRjuݷvv]1~wլxp.z)NDKB~1IB4T[}_OCi\t.h\ivD1 =?iA9wkőw+uD^* %o4k^k]_#Uz/Uf"NKM$|*z;G8̶RaI\,^e<|5":[|JQ'?{$Cy'UEM?ϖ' EʹQ`Uf,*`/DECV[Nx-5H;+7ݮ,jŽcmY{5dϘ5 p6ͫa W9s<FhNf Z:/,^-YI۾G%JnOxfot3Q=BLm}Jҥ[0Tq$Uq#&??SI̾õbAvNkRݜA`H[ZydŤ vXa#$!!bx[~dTٗ25ISy{-+?"5~Uqy xvB%hZ/J::q0JЗIe|r-SLF[>Jʑ|h1dEQ޸G!,mάq4mԏ.fwֵؖ8(I9;6-L@ %i-k3ۤuKX2q7v-huA< `z䏅 8wsڡL?/l Yz 6zuì1 ޕQ:u1\?S f/`ېV>w[4-XTGFY_xR&} K_p:}2YseƋJҨqxh@p9Ϭvz?ʄq`0pa*x힆X/|{Cvp9qdFo>>ݚ[9=;~rbZ=suu%66H~F Hl5__ǩӱqHJw}rb/dz̞XxrbZd$!ޡg2{^INZ 0k(,k^|>屾ɉiAH<bE廭ĺp<{$$D3pd2vs::OOO<=ȸN(BTtiiiKKK QSSTV: Image Viewer
Image Viewer

All the images displayed in QSSTV have pop-up actions. This is an example for the Gallery.


Gallery_image_options.png



By right clicking on the images, a pop-up window appears that can have one or more of the following actions:

  • New: open the editor to create a new image.
  • Load: load new file into window
  • To TX: send image to TX window
  • Edit: edit the selected image
  • Print: print the selected image
  • Delete: delete the selected image, a pop-up will ask if you want to delete the file also from disk., if so the file will be moved to the trash folder.
  • View: Display the image in a new window actual size (the window is resizeable).
  • Properties: displays the image and file properties if available
qsstv_9.2.6/qsstv/documentation/manual/manual/Gallery_image_options.png0000664000175000017500000347176113203343735025265 0ustar jomajomaPNG  IHDR/sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|Uߔ[ TQ@4AE vAW׮ڰw{okݗ]]bJG 17s?̝yJ,CbQ7WEBjqyB!BQXlYCa\.C;&MR,˲nb:W3 ø]hq VJ1 Ҽy3l899τ)_au܍mmlMAt%AnA ǃnnڮXNLL 壔4 М Rx&rĨ39chO:5U̦%3ϘuPPc9'1KS@p K~>OW;]a>Ad1xOd SW"n`81w&qZyk^wWR/]ϼFA'̎y,yV?V\}%w?Q f!B!DDî]#N05¡0 wΫ. +XaLӅkB9iqn+q"ao[Y8pnt%NCjۯ5L[BEf%%m۶_A!!>$rMn܃ʢߌS+%gՊdSixgO? ы<5KX17CV 'mռ-IhټyL%Xv 7c-nNu|s@C)U>"FbmFEߜM6Ξίt:uMo瓧/B1ws)޺_W+͠qv1YVHu>$;.>, {ME;E"q\wj˗ӥKЉz]y!B!̲a+LV-z|~ʆS۶VE'4p8B\\<-[dGV6nÍ$1!!OI$'p$Poail$j|k]zri,\E1]I9(X¬,׍mY"տz|.D%RJ3u0W<ύ҃rt"|"+љ\`&lٖOp 反OɠU 9QneE0Z z%)!ĺ_R2?D6c3<.~|g`U~{x#Z,GR, !B!lb-[,+ݎ\bMs Q۶iٲ۶nå-[f8q=aL>p8]bʦulۺ <qM㈔aGd,{kxVyrV=-^gHiCu@݊V\u/,2qLzFQaQf` @GoӅ²":#hi9,ؾ? e?6cYO+e9(CGE"D004HQ.@|zʲѓsz$Y+k,ðB! ( 4!CS.SvVNopѢe3[ڣ\ƙ) qx,+6neB;]FN)tI9юTu~rƛoKO >>,0tn8O΁fY>їc3^&Jq6mri؁Ea[CfsuRz<V.T[]۠෯=Fg |: ngŢd5>q5/VqnR֖E 8 Q7i׿+ج]\յ[~?~@ {bYH˲)((D7 X('qC(laDl *0feg08%ŭ'˿V,G)5%h{j Î#55۷v2嫯@vcۊ3 a3S\ ̛gmA,#_ (Ot%/ޕUؒGKnC@> rI LrsaxtZ>FF8(a*];Hx'tlNl4Tp|,ثxǙ]!#g#Bt>_qw(*]a !B!C4MrrveYhԫеK?Ivv6.DGY{9U; c*4]hJrSn)ݚ &#I2u hð УG/~?+ts! ry&JKK9 4Ib;`nxf0הIL$ IaGwFߎa7gt}!5Qҝ K[|tl֍:C_ovUVXI(ؼY⫩vuͬͱe{PQ񉠁iVz0l ]FGnN.q(t^d0*9LkMǎhgoke nAwWYb"ozwQnw-ήB||<͛gҾC22k:YYYf5|FF!tQ{()Y:?{ʯ Ĺ4"MuM7p{]xM Y/q-mG() cIa/@iD:.6b3W+ $!ݮCB6 O ^eʦ$HDs`W/B!V²mڷoI޹TVaؖb͚A5l[9vءhѺ| :,4]vZ@vG¤y)*[B.4oO"I@j/ bUۅ1;!0x*N_ 74ejymNϲiV7x?@ m;Bs{=ה`R* !B!DC*A6]&H+qQ6te6]^`]r,Bp$:Ftt]4 \nW,i[8&csh.eaE"eHre82*z8ZB!B4~]0^I; ڲ[?l2]aL]85ܖOek9!B!0Vcb:I)B!B:B!B!DcuB!B!ځfB!BbY!B!؅B!B!.XB!B!v!ŲB!B )B!B]4h B!{^rkp8\a[aQ5.fd#Oϑ{q䩧c5;TضlFϑs>V-[H,B!8Q<+^;S4??77y39tmӚSN>g"OqǓc뜞γO?ͷœ=ijϿ[lތK/֭ZeVz}oϢ[.\zx^tCOkEL,b}S\\`N#{s3z,_'on[HMIƶm/\D l6Dضͦ[b2$6ǟLf̟m`|1e*]{k[>HVV6wOB!BGrY ÏW_>i׮-qGycONӶmkrrrcrdhɗ_}w?Lk\?*^rss}dڌYLCĵW{&<@jj 7m^yf|".O&iyM$'ռ{ ڎm0v4IK%2gb }E ej_7e~j)B!{E墢"rw+-['$$)KN5)˷ f3m{_7ޔR4kɢsuSB!T墢"nD6֩ ~ l<6n\i"i4)8dv  IDAT B!BHL0jc^ZiKj&D"gRuR4!+k͚g6jRB !B!_aԾX1H8|e"8rIYi;7J)B!US i:ڋMؖ4jb[~80*@oB!beYb@=&1SV~!B!~ˬkϲBC1TT eʔ/i޼9G}T{B!$< ACq~Ж=h,ioyZ 6zb}vxi~򉆝 yT_ov(V'`֬YL)$$$0h .j_~=qq^R=L!Bq0Ln=`W#9˯)n<}9gŬK1^t.bWxa6m$ˎ x7r $&&Pʫ瑜\#f9swutGVVqPoB!{IYkXr1|=v,>^zɟ~1c&]tmNrL>+VpUW^Wҭ[%K ZŮprqD7ILrBg¡}alݺ-2~8RSSywh۶-Ï?|]׹Wбcǚs({RM~m۶ѭk*IINiL.)|D6mXj5O? 26lSNfI'aYsa̙- y7R. !B!:/UC*GII sͣM(>mZqWfZ^zyI,X/g3a$'';o7G& 1~z.{A^Xl-[dɒ%ѝ>'u$&&/ 4pr:?Zjɸkܷrjj}=~A hӦ5㮽lpG՗ ĿnH$iSPP/Ȏa_bǎl۶p8Lvʵcńaf̜ @(" i*z^{ocRz!B!طf .-:JU?1~q~s gy:J),YB$gт)` ?vbɒ]{ edegӪeX'NC~̚5xms5WӥKssïܹs1ݶU!BPKh,β)aCsY|VZi([a6]z ~xCll*ĴmaCp)T7???zsN[+ Yp!ڵ[n+kȩ<gU?3;wp ;Q" ӲC w3f#5%B]I$A hWB4lv9(g;v >MѡClێGzq\.>_i=zt/vS\\\ddr2=<@=z&]!Bӳ,:ae(۶UՏZ[ٌ}̘9[tҕ|?Dz- M.]y/`+@0lrrsVNj+M8昣yѣ;.:n:-_lXjkG ǚr,Ep8̎]nCM8F:ݺr 9*zs;r:%9[``5:t(gu&?^xOcu֙L6 }=38cꫩlٲos?om۶I4:k.B!f(} y(۶* UK/sQ}9Sp]!C897[n塇! 1lPN=[O 9!p8缊4~;eۤpe0q(,*">.;︍zT1c|cXh17t f͚l~ʩx?? ]Hg̙g8lsd;=;(=ms)y,;#]cYzذa bC=~ݏW_UVƍW6OQQ^:bkȥB!, @+#>۝-YLNlڸTüO&ڿr{(**b1 u^ <0βm+ڬI|i9U`S!B7zM#cylgd\al',mZ-ti9UGYB! " ܳla ˭@Sj buYgY)/ch(MC0B!4Z9p;U7 {DH1=fg9 ioˍw}N|3ri{I⯢s0B!*-)fGV._AJLUAuðcίyJ]0ZT!!9p퍲] o>FY{9BԍB!ad4m lٴA]YMσ8hRwфd%.fg90z!l ҳL@QB!BFtIII _7eSgiS,\XN A1 N9mܳtԮrvdeFwojZZnKFf)B!B}|rRȎYRCna(el>ݙ+! [bk,9ì=˻ّ͟˗pD4;v~N ޾%GH,B!giC Y5b9.=YCN3YXmx)X^Tnk?)й6.-3KGeFM(hL+6lA7`ú5R, !Bq*Y$CWyF;(8= .u.iczCX0/)מ-e .uA}݊z1 |)~bk6&J)5d9#{;%7: I4mQW+`ʵ&e!%E&`B!nٰ93AZ͇極U4:aoNXt2S˪zv]ئBf.u9 .KGUEӜ²14Mq:ڴ9wFxA}D6yylXM]~e{=\kRv6nXGCY!yöD8c(H :zt]\}qpV8v4/S,[q3SQJsi.mAxR$r:\GcTW6mIm҄H$hzu]'IѬyf˯LcϳWkMʮB#;Ke!.u҈CYm=˵k5"~1]7Z_p@㭖RSӈÍr˲PJe~e{=\kRvRSظ~ݾnBq8Й.ۂL r9Z9Es]a6f@'ⵝb* JCUq@psN7,LJb܃@Ѹ*Ktl+}y?:t=uT-Z̝wQmn/=2=4^zcƐټyr};v Mu'B!ofȨ0V'7Ι Z-6m\~˥ N4 m .V]Q zr}{eM^ a\0le+JKKĉ\.͛c=+/L>}iO|\xMo߾tҵBW^y#F0bJKKꫯcѶm[vABB;uϖ-[{y7cqٿҡby_9bDtƶ5L+b nC>GrcuxAq|W,]o5v|$qףiJ)233~0̳b.nkϹCFFJ).rnfa۶y<ӤnܚÏ?">7,YJ~^>\s|/#\F>_%hެv qqqw wyw40hzr7lm3h׮]\Uꫮ{&p睷Ӧukz:vi|i(h߾=z2;vK;+^vs%&7ꤓ&#v|q\}Օt)cudeez=z4' ?SM6t^OSY~p=p"^zri#G1gի?k!//O>W\ހgfB!sl9ջX>1mgf}8$A, BSѿ;LX$%'P'Ovv6mB4UlWy7gݺu=o wػY1|=v,>^zɟ~1cKy9wo0_ NP!m+|>o:afZ|- =jPVZ1ax,>W^c=wSXTm+&O!>G)EQQ1YZfw}X>{,۶mG矋Nu=,\#yGBBb,yY}غu+qq̛7&MyWxWܹ3Æ:4رI?g(+Cx=~0͊8ۗhݪC >$1zhfdTWѱ}{.RzFpBpuCؿ?Sm hٲ%PU+WұcGvիҥ E -vxw0?; |>Lk[^];4#6m0| ϡ1GײͳC;?L´3k1t1z49_?rrrϹk|ҿ|WtJce'ЬiS.Z#=X)#)11>'2i$I'˯i :SN>,~=6oLRRshx'ѱ{+Tb͟'&ܹ3_v)a‹/v:B;t0 V'n+O:u:e˗;z ?xN:qdF)Ťɟ2_mcQ"7'o'xm۷CӦMޤ |̛?Mӹ٣G@!5K U\*.w!1]rйҜ>dYa̪{zsOSkjg\v(+KТ5,79"b *t|hP򜵩Ð~`,{@k‹x񥗹INId22227A0m#_/|`0M7’*ך3x`fΚf̘wH5ٿ(.)fyi: aĈĨxò,em/"ٴn4(.)!!!Fȷ}B3a$''Q\\>Vӵk:t/ ϯzߣ{ 5nmGcբյϳ}/dѣGw=]ܹo]'%%% ߟ6mLaQ!K.eĈ{%%'qp1x㼕;,|m^{ oX_!޹zO el^|>̛?W^o> hsq1tоr-~~SO=ٳQ(6nM7=esq|2i E~A>m۶oe鱼ʟ3N'o"=#zzMx81SW7o:{Jm~/~+|i$ɳ|i\ccc?} lݺd2Iee#:;$U+SL2eLb࡟M_~ʾnTxUgqK'evDd!#KB۫#H}ENm 3iָ/ Wˀ˻]x|OrP:V(ϯy(##R,1 G|. c8rHn7|'N:a022y1444?pWLm[ؖ=+r͌!K2ecwcyms]?2_?`'N"I5Վlii[|3J"ĥؖM.v! |Ī+pܸ\.r+<;_>N۲:|◿"OLs`|O$s󯸼k/,_Νϳشqy9q$կg>ì~}3ˎ;ƬWyܪukqAo-7*w!:ꗿLGi88{~?_{w~7b `YS=eZ2i??ذj oNl$ʸlLd֬Y|_:-r1#K2ab[6(a8IWŗY:Uc(|k_:7?YdIK_-_o<ӯX.UL2eʼYI VDeo瓪 %kp,]]L5'eɚH<Ϟl/2\r{5ٹ!pMOe8Vw?% /w~+MY.vZy衇yGgҥ\ښOɇ>a{1>O?}x<k _=\{5=n˲g]DF6emX;E ֳiƳe[v~t׏!JYW˲-深z*=XE^ˣ**mamlقe[Ne|~>M91ң=ǻ.ذa=?/l308 eJI3\=6ƱyFnN{{;k֬989{/6ov}v/S^˳cN}qnWhȊĦYd1`I, XWԋg?{={();z|2϶r {Ett&͎ϱxb UUU<3V,`Z&6N믿o)#-ۢ3gpQ,"Nc9kڌK}87@J/JS(d3|~a,f)E$ɩ4nx{a*XS]GLzlyn[nx9>,˔)SL)9"J=k0^F{~ ;~O |ɣOc7&28x.ӝ5<ݡiҰ'O`]"$=HBWM].~ɒX>Y&*%( ?OYOƹ曧0u`>73Ӯ˸f$J9_L'W xw_Yl)w?w~}{n~Y4w9"SoիVa;_K◾©(hU,|^o*$Ww6N˚?뮽׋mYt/~3g0~}$IeR?0w~淵!KWRk%sѣ7 ۲\{{ԝ<6ETEKs3?CKK3t9Yf5BEv78<;Y`wߓO>EmM Ƕ,.YSO=4^s5ܸz9сeTя|۲زroϱK]錄~)޵yFV,_mY?w}/9m;~w'Vh[ȇT ?c-}wq722% ukYz5eqz~?UVX>x<l)z-|K_F>c}=<ēḢ>~*Õ|}ww8bL2eʔ9-q0j23֙Q Zs?s P(lVrA?&ӈeI׮8հKβ1.V}Egj:fh]kIlβ.:B&CIbYKjN8֊5!&L-:+'PweHt< 7}}7;u7ފǹ( η&GdK).{;킍ądިX_xE?c΄rqW~RL2e.,/zLl|wP5{+|rꖉ?G`:7&UgYˇaWּ}iUa}x;_}`^F/dGn? _ Xp pZ R{`#b 71Q am^YdyRϳαlj{{ `O37tI>P3q>@f#z2ҏp[_X3r\'8.}k;mf%^u'}mucYv_ = =ɼ:y]q\ک-H"\{s888UyGq:71/z:g7}W_p(< =❾״$ף;*9^}4lGD 8!]x_.O&v=Nz{ү74:Ӱ//z|%.8/&Fĺz*V^9oq)SL2oLv cMNzrin,LaKT[ךGvDd,َ2Kݸ4)z_dYIgOwƬؓxEp4:^ĴiزQSӰ3)E5c(M㌽Kz GR3x*z t/`\mRq =zz|b=2eʔ)sb)3w2+`_Depo^qdTax4859ڧÎ,)S |%; ={\AWNSAX>EŞsSau'}2~sa#qnI&o~/\q^Mboʔ)S[0 M-Dӈ79 :)# in2_>G#ng?%1 |ϯlsgopbt$G~l՜T \9򖯵k혡$gb|Ow*ǝDrpڙ]*2V\>=_BG!A@@sAӸ[a)SL2eʔ)ͤa`[N0;Y8(Biqv|r8︦DߖsA4 |V[x<+dQGo,*RKL+E/݈(Փc )Y~|B2eʔ)SL2$:-'MB N{,ٚ8fiBhӹ%&;%R_7gyG_]yc>/_u(_58)_-b&cyW/*282 Y˝^__ A/θ`j)NaDugŲ5X^1HJbw~svϞsI)/u5!'aOWܫGwl[F,I2eʔ)SL2eʼNk$Ky_%EGTDVq [  |Ni_2u) [a|8|9\9^ӥaDi.sgrIeirY6ř |#`CG PRh;\DY: t< [/5 i 9YŹA1X. (Ӫ#r2eʔ)SL2e(%l9K*!8iI.FmSN֣09=t޳sE' t@_I,Oוy8QZt:9 3:Kqa9r2eʔ)SL2eʜ'Odus*48mӎqg |[#UNŽ_\_rfgY1,_Axh_pu:uTrXeF4x sLiؓ,GrNW#׶^}7r2eʔ)SL2eʼ ǽIβh pGDje3 NqIjy$O bYƝ0gy#JrAp97IbHĜf}<}}XǛnk˂ʮ\L2eʔ)SL7ŜOO'M)S$;>7yr)|Q, 3>6HքJβaOfrrQ!:2qϤ̲l|`QU9=_̛^,2c~S7spKOnCٓ"?@9a;qZfets%wSyM5n7HOPc83DEWLA~?npДh.'+.mz/6@`#sȵD8P768qMuG xARM+Waߴv2T3&u'+(/@CR[׼HWv9gvlÈT#mw^buW(O[I`{?3K'ۈ†#>Cu\!<;Fʔ){·rvM^zGɷ/p r5 R>vhas{ 9If& Rc9کiO㮺.=MMZİ'`KCS"Zm45v:r}cuM}::@d?sng0f;—̿dZGe"gYBP72(1GГnY6/Eq_ufӛs8۬0:(7R@MWQ?Ȉ,!NK 1x~E0c^Rx\ФSDRTW24N6 E_z C~I"ۜC?S>uQIЯ*TGhq+SfŚOӮhs | Nᬤ{b!TXY A)M/5!R'bNZrQrRӊe]sRJz]UոXWQ3<(}?hҰ7e茶^2Y* ڴD"laRBy&:jU()­Ͱ:gG#Kpͮ'TQ9H(gS4øeўQm ~2uYҌ. ~Xg7Y"ss4G;^Y wLԆW"?\@1rfgtFjb 6zQåx("6i^id t) x,ʇSh\Lg2pi$Nw-B.bj+`Bע11I\6Ĵ"q 9i o$OOKS A#5#È 1r2RvJ 4rLOutuMN!I/"wMa2 8#dm֯ R] ҕhS4s2$`41ڤ0Rl96 ԓ륺~w?){ m #Ly2 Ia*Qnɻ<,klK\'""6uHr'f2C;25q!{Z@%f: m,應(j: a1pͳJc󉹋o=Dht)jdNpx?~DyCIӦ yZNe)(^U{QxD~1\_P)bUĶdJ`u 'bD?r1h6"-9.OQO!6&UK"oZ/r4M]m?T]=[9DPI]<(qK.$G9<ZB < D; BF"!eF1vދK/Hx,f+w EO7VL QUiY.|ůV'S2hS)]XK3DO1Z2fUr7 " Uz6#) Pu^ˏWI2Ff\*~saB ԥ,p5` ** (J^ j*iOH,AQ %3 ⒊e?`LqC!Γ IDATTyD(Sĕ!S%D_/n?z5[+0GjBErӍ6؍fn4.0n* ^\f(HңgPU WdEHTQqBuMRU-M>"DEi*D~Wԅ$3CEUM1L+DߐƘfRUA{hĩtm*#]*xf$*dq8#34LOwQY HwKn^LjI'zyS}W *8sdKa+3gY.S}9wFc2LҼ~=|&+#D Q,#I&]t_oWU9I,gS:jmӰs[" u˶Ϣȥ1 gWq"(l8c!ʃDdu34X+E<S 4к3FpBX$IK#c:cT!Md +76P ѶJVؒט3{@>Qf}GNS鏐)fд>l3JF#[bu8tGg=TjQWp5H e㲼ƇGwDE@uCn[ W "UoXO~"nnM!4;+ ^De%&[rYF͑x;_E? EHїMtK(##M9R;'ֲQQ0:,Ϗqw}K D"&L`WQW*]Dg;DW& xHS4 aQ{k`"6Y<;B҇50}qδ>؏М&>>vz..-c(A>*7kA" P֯PEIVjTҞc90Z"c춫`ABHJrb K#ݸ1{tbT~Y :;ymMLx0 ?]K._K]:̞̉)tHY J]يaGt &‹[A!~O5-CTȸ)^f3Q`rGdJ,AAyT},dk{O]/"?ڎxH#"BLԐ"cNQ F;#9*阵 id^W:ea%U "`I1 M¥dmJ%%cs693C42yAj^qJ$ o` 0*M 7U) ͛(,5*K݌drd:F2p)#_pME7jQŕ+2Pt7' Xc ˥"$BB+aP| KF"jc T"Е4#$&nG"TA 5e3WqqF !PT Cc_bzP-2t S;/F8qq OTױtgڵ) w멭G˩_eo5sGxQ]ȩ/&PICt[:)NY|f@q2\YewQ4Tz 9ttMm'H"Q95Jg`c>I1u =~x =Q7ʊB|'Mmum ȮP|l"[l“:JjN؟;"Y{VlcnPh\HjS15R{:OR?t*C{V奣A%(&Jn4-˪AZr/Z,qX/K*xUNWS5ԁ>/)n `J%1;<ͥxcs})] d-ebG(D u ,#/AEGpgH *}*IЫүȄ&jL"e|?Ln* .M@IB#" JCc]+QkZ9B&g#Uu9ڳo0VDIT^CMۈ(RQ3ߊ+"Uf"K Haz;/pfnlB}]H#n/mUKI.JP^҃nP94eyb}' dAAWZ$c fRć$.<&c:vԋvh%,Ol  EslEړ$RU^0ߠ*ۘhGF,:-Y03ĉG%\U_Y.lE5bY'>3YEG^Y6by71 M7=LM-ǥ=9JöTYl*4L%!2H *\$d$28aW#c1l@|G=6HD@ mc>TC# Hf܅d=L #&n%Ra1p$3{qax-2y %B@Ay^/Ǽ9k8IT=t*Y]8~G,r=)1jCE:L@ZS{5UHR{eyv+{,9m/vYk#^<rd$$Aib|IbSj\%[OFst_91vC(]>DOt2 , ðtAR S=e/,P#t0<5̶, 5r^zG%s( Gm&L,{×ӷtP4.{Ldy8B:u O[E5BzxY{?Ri]jPRE{-N:6TI߉!FX<ʲ5{Q:Fͼw>c3H(KuoE*'%QgЪ4Wڸ;p,#syTDkϨ_#t^.kA[ypIW"üxu/uSKtUpڅ>&N&|5U,; 3̽#=䥌X.N*򨛖,d|]+T1&94ÍMnB$bKĽ1(3o[a8 N1C22^$4Ts;B3+Zc nJWըSآEv@BW#NU `jf挈dmy{*v|Fy6̷03DnV( $]p < 鬗adx->u=<#&0=!6B+l-]` 2)aSrStU7ut3+?BN>,tlC; {1,fB`ϬPhG§PFUV{Xc2"Er:cѕ8K\TC eޢn >t75W{o];H6s͟Vs࿔=Ku-m7Juq$յ,x(d~Bɚjfʢ78^KqxSrhB9k٘>I_UU 'ouؑC<3 eCX 56jB|[.c^d}~.'G/чbW.yb1/?y O S@ }f`yFw,YUX]ĔQp١9Ypw#pm SV(P;FF;[<ȲY$EO3f*#<a~rjN;/㹷 $wMMؿ[gQqo3/USm,SA]={R*Top..s{ژ3)]x#BZ'ƺID/ F!%𜷎ĉaքOHHD6}!m7@3+YwP_#uo*]qVo$>@P%]:zD wу@!0ͣTfM?$*dj\S80 ֭ܔ=dv/Dݲ Qt5p^a1]/ҝC>~hn3Ɏ{3Tا| S9 W΃&g~EqU5nn)JsB,!˭܏ A?b{qA+QRpìWW¦N;I,u l) jܦPxRxv ۨ5Nx;H%zI (mGLѹ7W`WB$ g zQuUT.8@}ű2PV$s 1EgQ"af1P|> inDQ$N(躎?`YMy)  ض$IXiJ6%:e!Iav\.",c6| 0 YuKPA@Q,nr˲JcRU00 ˅iضig_-,l|4'1f3Jc7W%jmdtΪUo"M=`ph]dFhP9vU;6 +ɨ"ZԨ0Trd{@2Pг )?g@<@_v3/rU6ϥ4Z-JoR2f5K8"Ey6B$AVr!;~>s;.p H`;Eޭr,84'oRd&L'+3ΌW;;#˲duX(oo m3Ηw-.X{y{N9D 1=Vj(}cٹI>re#Giss-P M4Ql]'VC;YF7[ɽf(x!"v~;sW2WhCeɨ*r ~T+~p>m\e+=r8Dps 2g+d¶6B Ց"EX%؏gG84{d 0C)Db.qA[`1yEeNVn0'&_IW\A9WEny/_Xp%+AS7 Dc J$ ! nR(D6@Yi$LR:sQ Qw0F8)DF| \!1 `>Tx!g3TtדHPI4K B+J+ZBꇹqC{ce?fS<'8/*vf޿@#4r~EIf{ֲ86#5Z4𧡭ӵ|7M2qC;@O9Rl_#gs\=휒R jpfO1گ]u|"n\®b8!g_766u_Y)]Elr>PW6bu]\Hs^ 8ٍs! v'byK˫f=x70r[/gz_}Ezs;bFspIX=Jsiz9Lɢy,q{;c7a>GiZoem 3}7w \9|8'y߉nY73{)7b>@JRDH^FS>*kfo:f2CAIfi}y?ܗHko]|Wiu'K߽/7鳾Ku6 6X]|*Qoε4[a`:sxxqğ!}Z&!;QnlqtspK`䏧>Do-9;$s IDAT6Gfrȥu,{>&|sm6w/c$N/g<J ;i!u׍t|4.{p򴣸r^R{֛9wENI=] YؤQ;;0bO߁Jq+X}b ] 'fK:Cvpgm#D) ή[UWXa>ibY (J8Wn 2-".RJ<[+!!\׮S]חƥRp8L\^e0ZG`=!RJ\]=H)qMӖm)\Ԯ~MӖ-}m֣6'믜+oD`0 eQTWbߓՄv`}Yb,zFϞxng2߰ɏhAܵ9C,q70T:y-b1")|]>w_}!s \{ϱ{iBsyoD2O#|q,~zL -}C{^+dXqa- {k /v1w_ߡ+ɑ l/3Y61|,>0BX؞t:('+$/z"6^5mȳXّcF*s4RuljMXi>qd-t=:I\s3n~j7Cr{Sг<_2}d%y|Q`HtoTCg?%iӱ=Ð.GN `%7>HzЦQh~vM,;>[%f;$S|6B=LL K<FƇ}k`Eꃸ.VqYJG$!DLJ-eVH-JDA++.4Etxx-7ql].gc"PG 8qP1mE-}!^0 raN^=V3Xnwlf=O=2˂\o2ԳX_…/P|pjf"ml|+7U^dý_T([+6sŝ6Ae31Pw*X|yĚ6,N,_6k\0gd/IeNYhz?m +&{r725QGG ک LI9~ .8h ub;7f{/3{t'> n{a;$U,q8GW_'PUwp9b/(m *lt/EU_wcZh%1GL Cl:cor&Nx?]DSyBL7F5|_qx-Ϗ@鞧9z,d! FXx(-'y@K<9W&xx{¤Rړ9cxc^£bmK>4y( {rؕIu+#n%Mk^cآh*y~MZVH>ܳ:{ ܳdžy__Uwez.3?q+D+[ɂ#x ѳ3e~ y.|kI}]#vL7ĥ%"^aNIS'4(& +lT4K ;;备7m2O# KC[  l;F~(FLGrZZC%|KI^.F(t:`h\cMW-+&*1+re[EUQ.?< \w WOi'zˆY2 k$vyBY6 h)cv_0~rK hpYz6BfYgNP){DR{!C,W @\ Cd:Ҋ  [OFB@HP|/uRGkV$Rb% R|R(J*_JWW(__mCպU()Ou=pJSR>R ZCXeqQX~䒵&'x.}A$W̛k(ȣE3n#1"+qNL=qB_Da:.=Wֳ;Kvкa㯵ǏQGi?oq5:jұY$ݼgv5]Del<75|۷] x߼8^6s'o-nNR?I]c"6f3Ƕ뼅ޞOx*OdAK2Vxz:˅<ۯe+C܏q< ͳ^cJ2Btw}-kغٗf8trUѺ<Rr %C9.i iȓ&@{/o4Mqn['8ɱݣl|?Hzظ>Cq~m?&.&c)$7سb.0cN'i0Ae2y@L8TՄL7O09\IFWzlHN ,qgbib+($L05gKGhdd"{ux2 ߿ $9x^L`p\gdt6 k QJ8rik=n8і ľko%vSR|lı%ZBmn mkeoP"Pp`B,ocS:,E:5-3${Gtn 6Mzs yKkiAH%%JN8Iq ucfAמT[isE̬"jkVTR`kQJFJ5hAk$R\.aW; qgJBX\H0( b1}X^MӖm5vO5ЭY}_M˲BX 5[e vT",+õ{rnM\W0rDQ<ϣ˲ql4MDQbزePhށks,X,^ӷ)ǹuMi?+.qA{x= ||+눝yOUc};Ν1Lq.lT_cϿk:Oo!~o] .`;ސf$r`] |Ktb}L0OxP{ݭPB$Vf,k`&r5r.yfY]%nd*G\xs>>hN; :2ЀXHG 4H^;`H0LBz ùYJy%ý}CO?Kx6I[!.?~C|"'x(GYrM4[x.Eh\jMi"=Y!@}+ޑ0Z\>f{FMN) M$lBSVt~֟a5bB:r|.OOld Z8ƃw~GKOرHi*'g?w, E*}EkVġFu$qy͎g"h4~Fcz~yI1)*Ga%]^ lJ["D][Nd*.bJ9*0u^"H Zl0$w:TRU2&@m!C'G=NC@+ԇp+t9{,P(R5: P' +t.Se9V1VAnp)Əݥ*$0$Rna_Em x??o'~kkMWh)xʲoHYruNH)Y1!Pj^HpW-b[ϵ5N]_)x(t.4J,7K_8ҕ: *eAԘX_j)EЕ@*U]bHSy oW.%_NXb%@K//Axft&WH$()yy"$Bh>xRGx.(/|Q}抱H ;=;$L1GӘɃ|ٹ>e1#$%㌜%ڏ?*幭|oD(׳LOiswf=N"L}&Fp J+CȡGFi.]@Lczs9UB8k"2!}aL{HʗxE ̻2~rxg8W~>z;[ mgUJ kۘkgBҨЅffs|8\G>+ɠY@ie%1( ƭxej.8ڦ|S<8jO/z LokC 3dj<:mwȇ׶b؄6Ží`긎O l@~qs:mN!8SQ H-`S45rBqm`h pC4Hnxv(B8}1xϊbmلm|0"hnBPK3S \rY{L6 2_M 啯CE/7;rn,,8<.H7ᥥ\HR,7\=" m ^{d!捧f~|6 #I jVt2U(vhFЃ&½k1~ȶFE yOYVXHl-E-{euɝ3Oa{=] SnDN8Y"5}&yx.ʪdKAFPrr)UW.(.j4Xٔ8=xBc#$6wt|=E4.zB0Iiz!B&S)F`#5EIwE70u!M14Ml* l@]̿D$*#&IAv/T[ b6O+`dUy'GmИt A! 8WD{'AȩIhzFAU6u?1X{B_Ud@H/pT.Jh8B./UZIJZGݔ|C"$J[z(UԼ JYHJTgt   @ QR[b\P[VXaPȫªJU僧Q^uN}Д/5} p|X% \P o ,mjR[RŵK9-l<^e0;XLk#-r4n F(J,-gtǹuXFC7MEI7EkΩW럢0i, :, JҜlys3]L н+p&=]a4N 0qƮÝ>_ތ[q~:DXk,!EJo#[o'YbS93@\bH~Š')Rd8fvmefA=x |%n8f##X6޲CO9xUqR=]J0IXeC>ob}| +nu~&cg<~#_eSدd?ua;9[~u*A$©n\xl,C6 {F~J¢)ӆ(Λ#4/ΣPpZ1DށOhA P 89+XBdzO\\v~ٖky%[6䚚[SGTh-ZΟufvM7DCCSSS@ ؈aLNNimmeϞ=ٳ]I͑mFtttp-/|lF){\S}BPWWaVtF|s e˦]+"46J%fG"d !2,KЏ C>%p%܎zpYF/3TzI2,7UUZ p f1͖x5eFMYR)~j5K|+9$8Жn5e}Yۗ^ |_||@ j=a*Vc_U>.U0b 㪐QUE|tM)t- @#@V!T}oiϬʭnF3T@|*iCS<|̥;YRW} t|iNeEˊ5&oŸi֧{s)2i f0{B&wtQDa&"E pQr ;`FV j8 /{.ʓzoSaD9pλAYh#P*02f]x21dArəaL* [-?ȵ+ s5ح)R<@ @kk+wqr >}E*Uy۶m# ʇ?avǩS-RJ6lwm8u(Ji˟cO8ٳ||>ρue D"eΞ=+B:^^]<~B@ @:&H011A>gڵ<XǗ|!sss\pT* ===[nyJEQШm|Y!Ճ\h uČvrz8z!\Gt$2PVBQ&ZQR W*gbi'b{Ad%`: Hbj2G&?cRdON.)NB9A4SL-" H[{GY1wy UV7Kd]'H[>Ր?-872M?o%\ ` :=;s m&J  v.e㜌'p)<6P(~4崏%i.1'; u@8B(zBj%i0hRd#-tih}`~-wd(aWhN([\VbHt0|7w4=9A` )ɒiSTgkm6ݷ^K^K}d%"@ f:7Zd,Wopc#ږ&@ds-6E8pf]s{mEӔQ%ʂΥ-% Xg-jU}ZJ7[e#vo- 򦌽Apq>!EŴH dKHW1TS HSNQE yM@UP%S!Y >FE r&e OS|\G@mwU+'l_~_އaT#BH}*8W "bQ*8]gEI"b4,3/O qMMx6Y-2z WaT|S@A4$\SwrC"͙˱D˃K4W;]߹ ?_˲L `8pd2ɫʵkזoH]]i^}衇hll\۶"[nll\aP*p]l6o͞={8pW^Ų,(/ +0V^^3::ʮ]hjjP(055$Itvv222}9JM> d>$u;ڈ7 ,KrLoI=OpWL|@RZI65 @p,bW tĚijnBVu%/yiX%H22o"6u x]2}\'"\K%̶Ou{7{?Uf+ӇF|3||wWxX/S¬lЂNw*oG,x%51,*lR4_Y\^@L b1Q,9_.SMʎ,)Xyn5p,gix,tj.LH=!rV,{9x9$dx7277ѣG)JȲL[[Xt:M:}! 1==Ç)@cc#=== W9v.]V1==M{{;---[3g000G?Q$Iѣ+5F2Ķm2 JD"ի`֭߿Μ9CXDEm{EԄ,D"8@\&R.ebЊsuoo/DJa```j,r]va&/O7LŖPհ,kOC V~(,胃L)0y,#qj*cDŽ6ӷg(.&ى_'+݂s:(jl' ﱑɆƚE eXjD9oHl#ߣMxrHoX RD4g>j9 O3pEMfF|^:u{=5Q#%l͑Xo &.woo%Җsyje;Χ~6A G4Fm9b!mtk sKk<{~x#;o;E,F<~r{<}-q=opMgìz;PUxYFRl95$ qxث?br3svnʫh篆HETz*jQ%X~c*W05Io auV 4(ݶ ]Rhh!Q.pϦ?lHP⭳H4"*ZPe]'Cg.^%l{OQ.4#P" *]Reʣ6whp(-d*북iHPlXLR:ʝ;q[@eKl^b7lsAY|;ňIAR,*%ڥ<]4E[sXj?jtQkPlN¹[GȿBp2d IGBHQ4/Ѽ3EIқ?JY 7#z(-9$FB}Q,).ZUe @= @o~ \֒׻YIwa89{`o,d?N8nذ,d]1= ?,[K;7.hA%7f*./ސ . 4ٿV>t#4L#~-t Nw#3DyvƎNw (Asg.~{0) IDATno?-Β}OXʛ>[,fj>c6B < s֌ܛVwloWhXNZR?kAzvMkwrtuv̫a#2\:죇R?:{ڡj{<&^z2M8yj/|2q3?}ݥrGMoa,9\I=|23ok̗,ú?3?kD0rQ5^}TSEvoՋ4u OCKX7gXݙ[VT ҁy>V!IHn* G!V#lh$eI$T:Η[8Ͱ5-FB%D +d{{'H<q]C, H4A˦3W[URDuV}/s_bX$'Ř?=?4l5h| Q֬YO1śͦ:ƫ<~WY 4|A )͌d ݨ6@YECF0AF4Nâ#XX)`Eɏ/PBsUWc(Ni ]a0HgMܜ`xD4L8'svBV1_'@u?`!g ,-K.Ck~\}n, |'TYv߃Y_a8|;{C]vw'G}Gn#xep%E}|IpAhc<ԃ0/} >,."}8vP~<3g<ц&k :2`2BՁLyO,>_ٗܲA{wO˿fM_B8:Bmb`~OP[,#7Lϟ<], TG 43BH2x!PGlEGtn?l 3풌,E$g(MyNV183EA<6iY_  zZ&tJuS%*͌OWqmf|[3?W sY*T< 89]g?X^$`w az-2AΟ3snd!6 t%"*&j: ؑ&ke0O<c*R0\RW$JSrL):]ZlD9 j}UmK9:=Uz_BThOGk&*T+PS/itwL7;[1Qސ'h*f*#n`^cuVhaYԗ<>,f_v5F qM4Z鐁,lvq|_\ŗ=!hDDtX=|W$p|^0],1 ıHHVs\F2 465Avbr `}97'qaoqcÌ5_#;ž{0/2|sD spkeQȆTn[@A jT/OKx j.v) Jx8Q a$΢pGG}ʖDݵTg)<{.#ؘsss+1RJ$ʕ+d2"{졣^xgϮHEQRpEH$|]ٹs'k֬_ԩSJ0D$2 ###yE!JL& 斖C4]>*LH98p6mQill[oZq6MeImG䈆ڙuFpF6^gɇ =;Ĺ7 qq^[}.}Kgl]^y?՜|nGS m;XJ%YdFO~[vE.] Ѣ~ I)pnGk;ȉMXZcNUP閛~ یԚwP(d%N+(4QXX`@@g'r~AS#Mٔi BggCRatWCT+6bCklضͳf X!-wDYȅmCi`TVZzF5TH'gGIg&˚"ݩ0w6qTC# :C C$gGh.xXwmh -7:F .^y:ŠyuF@c)IISWsa6tEi: ]d]GB.1_sďYh+cl-0w ZAF,٤M KP\<`8[.WUT s*sz@J:DaBC6ą+DSI.BS%B 6haJRi&z&cCsdkY eŬs-E Rv;yWPVS@ D͕_)#$,{Kr~eOxofd˕%@3r%.CԫwS 0,ޒs9&`;x(8X* !=|яSL-E {K_K-> qd(hBjLb:jF p|d4ﻇKwʱ_v<ɏv@: j"U*'#UQj5Tcæ5|>։ _<<5!um<=DCٟƻ}'9D9䃅y7G_3AuviBONdIGv,D<\,@@݌#> xbejuATzzUwni``>Lg}EF,W %B,J s>ck0$SfʚԞrh;!`߫Ͱs^k闉Xg5[iVohè.+uFUZD_E[u m>W5C ?8vlD1FKxP޻tT< x T>Vld;YfߎOPT ${]†Ք#<)XHA>z*=y[:Zp3[;JzBԾ_b~'(T=%a>48UQe!Ufv@׆wLA."J2ujaP3H$RQ<\GCSʜ׍KLx-Iɶy"5e~j9 q<#nݪ2zؽE=W4Eϭ%@c漅ؑCYU'|*rw>2OKk yH<* |O;G[cXJ ^ $5ʰOߜ㾶O{$|P\u1 ӨR\\(5DhV8+ Ngk$hș\ Z %8-FiF (9"~G?hB+)l 3TZ0ڎ('.`n:Nf:M@FL LC&ZϬQ#:2IԒ,k  X87Ju-wVYKd|f>ǝ?k’'Q\?.^4奝{|1˞CfYuor8e/%p۱#?XcH>##7}=Eloɉz#xP$'Ɔ z^Ɨ߲ BL g7w#~< ̏#Jng'zd[)p"://WsKU3'ع[:9PlJO=8?cQV z!b.^]@BF΃[g+'Bmy+b_?BX\>; (ݹ`$u}4^PDTP^?w8m߉y^,52:| w.wAC/!̖.>ufXūءtigw[͌E+$I=MOpfd2FI,Xfʌڕ[!\!(&zN`AW^}`BLLU> ѪH:;QW(E4x͸jDR 4x%"Gmt'aQDiktGrdP T-Hp !';g9˿qi'8[S%_dr40v<rY266/l&l|>O,CujRX,F"0 L0 FGGFgxs&7x 4NipN9}D @6Kf §JvOA ^c<05'w+` ,>OYo?Nβc|"&?@>/?l ȩ>+KKQ. -Z. KFxg?otuD_ouYUPrD~wFǥK_S(:=QO¢c׮m6o%dϞ]| ^+evk+i##G?1,xBF܁e O?4)>pۣI=w~\>QƢqN M_>279է_0p4 m`Ȋ9o9h?F ZML눝9Cy#~eou q 1ް 񅥜h?B ATEoF UL˜7C}~5vwCeD+7E è/ڤ_\)$< ;Xnط){Q,X!־x 'Fqr;:< z!S(dYVqS{dߜ;o>ْl68Y;k'~X%K.*U,(" AeLyޜU$='s 33w\>ok'JSzrT1Akyp3K2W!8PDiOP r۴Na+UY' !xj:X~0 ,, "*L uJK)z>~G*Հ(d~E/9,-.1XbձB#r;0yҢujp3ua\$ubB/6kvĤbx.FR;qWf^ arIf']ҝn&B< _>q X,JLaRW9|24]sx$Ԙ(DU1&cvO" *B+!D-&CR]põUE={U&yMlذ 6o裏R*֞Rd:tEQ@UU֭[i 233 MWZ V,CAJ%A46oތk?s]mX_tahnnfjj Mعs'J)\]V0 !*Z[[ٳgg̱clݺN"J.x5J%Nh5 3*,ΓʂZgWEL~G >y029h~uSV>jZuKnLBjy.iR(UFQ:Oy4N$zApnf}+\Y,O<\KfGhFӖ,rcDemtnf&WӲ5by2Z*[yϖ,JcqЊ=X*=NL_Oe/ĥ纹8I\ߋ9=B^oA[ ]KdʣnT7[x,ߦ_Joڹ.} :- hjl{Ӥ-sne| ڮ-c=ޏhs׫o qeD݇g Ip|N4 .1 O+vP 473ZzӇҚ@jA`ӽ9\$dU&N&ԌiટgY.+H'˫pUI$Sv* )Lu|$Q#PZ-*j*Ctnis|]'cÈXy͔fx)q́C(tg^DTxG?٫{~uDr,߉mΫ;,"elSN=E捣Q"#N0k&q3T*M22|q! PcDIa閛?8v4Qbnv@Qu UAVrwl3i,i"(IYGrV>tdoRkGsЛ\+WUP-W: PBAVkVIF;b0y'Q'I#a'6GƛXDZp1_Fip5P bzڧ^|׫ HB%mR6^N!1gv5LZg $D!s+~CLOKlCihԉ.#"]ReC 5E j"ŗ˨R!xjp]bI#4ۍ ACRz5 +" $> A{MScFKSD tХ-zUR2A%+[$8A4,.05gd1m-7BԔ(S,%; nCanƹd7,aUX+uqN(Ts!;]EQ%d0K>)Tm6Wr/}I/] m}/q,4{淭qL(yzijF?*_j_S22>=HʽOlf"$ܣϿPVf?^Iߵ6,ݽ|C6uֵ&.(DGLj>c~͓F+_g61w Tu0]E0_!|Zp\UQ" (aUCve߭&$- &3>2Xd C!4- % Du/\Y5TkԹ).֧yaE555qWDž XZZ"Neyrf!lܸl6zx|%$?1NB4kܷWYUqP " àR2޽۶diii8U9y\ԩSٳ۶%Jq7388|2y-x饗8p7p.]b||(0Mq455ǩjcZ걺K>300@`lla`zzz4TՍnUv~:C24z(B\G{t<rM,v ￝G^ϦmM OtMl\w]짡OS$m,f4Wbp"S#W dH4g[+NG j$WbN2I6+Lɐ 9Lq8J n:Xͥ!g70W(_Cا NiATŸTxDBhTDO>JEvJ~J̶mϓH$سg|@ ;mN )|fk}G]xQ5LШM9J[oe%[OQ;3]&!Rh(WvvS ZBs%*4}4dh~wg#J[XԸ@kWiLN.Zal~ SV L&عq;3 -q:1i cy*vmmDQ 5f[ E(afS!SaglneX'{⣴445JH-Fs%E) Imy%<0:S1<8:EPia<!Q(+#7KIqShzݪS 4ZQJ}:egk' VӬS >մB 't[jկ5"'IG>z6FwsgLK3S;12fMP,<2$D"\OL`uDdo0ti*+Va88.6I6ɠ/Q ad>'W_Mm9ݴ ?,*<w~;&RW+O,{B)k-T BB@B9{kʱ_ALAw7I; ;d@?|}-'8uQ2o?ax  [4D* B9Bm@V$G*ҕ̱lH Q^8|UzE umy^0&4(2% _Wt qdO?C}3xH$bŸEc]IrR=:x9R)'|..-Wd>x8W[p8%Q(ZřEz𢪡 V@F Ȁh5CtE؆08hj;)i1F$0=n#+S*v]7ܐFy>svR% B[X&F!TYpSc}jiXD3hFBkЋtR5×$,辆 (&'JzWp!MėeT+T# /RAQI2qj3;.i]8 D$9n:QZZ( V](E6?Q53IЗet e$"2a"4ÈPP=ŲY  m E4]$܂:K"? Q%U-Kk78i_ZTQkB}QC77u x2ya雄uZ#k,Ijt*iRԽ"{/qtבwq*T<ķGT@A)P/bn{w(u)꠫H(>H3b 4ZIf:::odff <ܹsH)<6(ٳaH[[mlB IDATmmH):DTѣ?B0AW+JeDکAj筑eQU}uV駟^ESKK bZȿ}"^p`&ZDJo+h.N%b44c@շb%z 裵[x5S7hœOy#0:v5Cؤ(o4xңt|Fh"L敐c*0HfUK^Z"h:ĪhGk,HE(ebDq~ ɤfHiU<_s;{e'x}nzVJyw|+:X{ikӸPc 8kt$qX"O86+AeZx-o;M[zݮ J{woۆr"*f/_9|eEܷ&ˮB:]N~߿ ?4d-F.Җ+Ql]V!JB0D0"\a""a# |j&C#ĈD" MhJtaT%DG|퓬K"A ⃢!5 \IꪶR7|J "\]v 'I.^HT¶m:::jk`300#Gعsꢽ~$S:t1zzzp]xE:;;[{hoogǎxؚT[raFGGzyh`x^6mĎ;rE4M4Mzx'ξJOO7x#\xq-nz뭵ڭE05r\&ŨT*hah48s dgqq)&&&֞Vūmo`Moh( qfal&L5C8Vl0VlCx4W]K9"՘ZŐqg^:6RU:VMWvQZsQERk]"fn4Aqb:fS\PYZ##hMj4!jf 4,:h7PߣcnVeCY*$A Xm3Č~2-XKEs h.Ukp)&ȖT4+Ǐzw`zf>r^ءi>r%y\cnosvThFw;'>sa}r dΫyd3}BY k<אmB2hqہ2*J͓gfs_2kpr oz0G6TlTţ>Bkj YC,RB- [R)%wD¦8%-eAqgЖ*v3\0Bg1J 9(+ZP<3jz79S(D5a`_g˰i؈B!>oONi؂dY,2D +B(b*P$h{+&.&y<f4\&ֳi & ;x%_7_%T*V.J %EK &fe a!;qI K/1~ >߰X2%$A~d{ͩ)N_66؅׈NGQB o=C㓣GblN , goo^WQ2ZG>ccr,]\Ϯ$ͿDWhۿcdr_UДH@h"@UoO+~$Putal}~ ;/'o(4nj+pvZR/a4R<=\W %"1LUt%*$)57de@1O؊aJ'7 ,:Nha!W544 UFp aM!g5H>J$E@ WPH8- Dk4lPϚ4%b(jHQq81bd[g6RMb^6#Z 6У*(Er0nYnxT*6::t㬻L0sQq(Ax6AS?АNT0:c >B6u) "$: "a CjDTq@ÊB50 sBߣ|QIṠ#H zW'R__&."z u (MG6#V@SCF*R q5 "4EH:V:+}슏 UhiJ]$6@>BФ@>QcE6+xz$HGh R!gbG~V C,"?0ԈHHUCSWC[J_Z !Jtr>iѰJWUU,;Nn:9{,B0118;wŋ9s Ea޽dY X VLLLp-pw"P(PTN<ɡCԧ>Ņ xH)aƍtww388ȓO>IZe߾}_9^ud2nJww7{T*Q*H$رcO:m۶m6Vdjf,Z{NUUT*e88|~ !L^`aaA:;;]pkv;ND"X,Zjtp(F3 l=r=Iv<:Z<uvY!3pݡ𨅽1d|7;27;QwGhi|ksxJ,Q$ՈPth;f{3W1 P Q:n'Cy Z|BjZ@(74GJ-њUP TV° QDc.JDkȸOBVT$kEʳ\cs ^0JŮ܋FwZX9:~ Qx'\UKWc=xCՒOer¿^'0`x]WnB5͙qV_SuvexDL_㙇[S4 Z rY]1OJZg먯jTq b.LP)댻HG; 2r^j .:)ԨScvs+nTƾ}ٳw7-\]_SDIќ#U;IBKRk< >/mF/WI=VsX)ahO=K8tR!+Gg/5{ 0J B0;Ksp$R!:;LWbuW|>c4|ͷEлQ"KuМR\# \ץ`r|tN<~'o43= 3 0 `Dr!Z+lkWyVuyZZkK6M2&&br잞|pFDAJ.U]uo:Ox_ʫ/"큾dD!"Q֛غf$QDI$ IcʍwT`>UлLiG9T<;xƛ/N3P;At.:',k ԛF(+jQHEsq cTC!Hd(D5$5qLca!bʄ8 I5 dؑDGG̤xNOQqZM 1HUQKhtHRE"U-40tLD ?b J׀xiBGErzBb>͒h!<4?!L*!&zl+5Naevu#mX_(DݘԞw{&~-؎c HQ@CzI4OGn(U()+'OxXVkH"5'R1 :"a( ;Fh 4Ch& 2 4M)ˌ344DZl"1??hqs=͛7}8E4* lv+*Ifgg9uq?Pq̥K˲h \.oqԩ-~门T*DQ8v9s ΝR$ \(bee8sp1{1rl6t:KM1٢_w!]' 44w/K6fk̰W{!J; obN2­x ?z`+Z)_;1Dlpv5*pk ^硡ϝK~wGՐ;i[/ЁO7XR!!s/O|Z!.O}ٙ$e,ضɥ54{_ 2Zt.rBֿEvO۟d>xk):tlnovN0`w3r>1{,)iF6jszvq^mԊNw<*eӎtDF1Ppj|w3xk|b05(غλ@ : AiAϮl"\f0TFy{/1qrR)6 .!,R Z{/~6b@1hcRdzݫшI 0QM}y7P\i׈O ."iȮE)NWrZHF(BGwcl.p"f*Q9#m;9yg|mV=I|'u"gU`C-')8 R]E(`he0:6NFGX/™KAbhpG{]1<2>EM4DƒaGp ٟs.#"?آ};ka[PG)w?CܼWh iD\bϡ{O2[_@by$fKLz=,~7Ķ,TE"%Ύkvy nJH)QzJԠ6:DiZaǮLMS] D LFQ.?$އd2kϢ:LHB,2&a&ц B݉ 8+"DE‚7Cюw2w3FNޢ]ikeT|T;E: owղtD]85"BTP,%JP5]F;Zn;-6XB*44_A7CR zS|(ǚ0JʚB-IiyVB+*ĦJĀ BU+ L6F%aDJ SG*iVb% ijбT A芍$ܸX@y.lϢ]ۤRL5~#Q.=UÔ.82`i؉H KՐ1&IiF-/`!O#WdwNָZ1* aIlu)5,+"Նi\P)Ge-굈a]`EC{Nn=D5LzW$DCOqx.uRM/S0Q{]nR\De$O%LX|nAiY3wڔv&"\HJĎAMSX|9%[Wæ IDATLuFlzP d:q ݄A-"lRNJ dm"e,'`mJ" ]F.Qdi%FcŪaG!ѰMܞOXtr^fEdS#>ny"0,LRn&K;ݦ\w3$O|_^Ff&attL&憽Zlɹ.CCCн͋nɻҶ7[`x3!|s ؒտW-|'&doa7#-\bz{`ӕE?vNW^{7f _|5׾ٛ`tu]٩PY 8g qĨq+3dҸĨa螎ړt ThUaŒc9^%6TJq j 鵺$i((A-)a@Xf\P+i4WP{L\s[ f/ɵY3>\+t2!p..+*k '%o*.^iK2zB7Q8ve)ǦY6nbYs9u pIי>7Zw *]:yˋ9oa;ɶ6$_rɄљ#1&\:3i*fKa NюMAy5σڋa8K4M_:,XK|ۜS6c&2Eg=fN+fXy En \L毨4)1Y~ ׹>fv$id z=,VU Չ{:a\"A]B/l:IlAX۰ E+U 4H ?:^?H=soʰ,( MAF]@Q01fe'!P$ݿ.X:9}Oi~ß`j(=Q_A_\&t" vɣO>ʹNg9R[C˪чyXW7o dl+rkB ҷ=YrAFtc^YQ opKaHBja犅L4t/@Ά''h F&A#MB  )QUPn!R -zGh$j U!%$E`)UpLIqu) "P#E&`(ĖfB  nJUX)# )!OQz6(;>h jR ".b|t bġm6ira:&6=U%W&u$c'dZ-SjQK.nܶ2YF-'ƄmMVСCH$i"ַ|2n&y9޽{9y$nÇfCK)ԩS[MqTNcgWlՄh/tSĺ(IV!i9 HjmfM" Bo`uXWk :Iy奈mUJMfsb)5ja&772$ͦˉ}{xþQv'\e~5fŰE_+dIџze٘T3e-Jz6hүlp% Ĉ&1_yN Tg="'QLM><|sZoL8v@vM~c~FfpQ-v!ß o~S_&9zQ@-νt7TGc}K 0r&;ָRh{"ugLsG3c|<;Μ r9jv(/ho2DKevJ1&fe&.(X%N;n1~L{'##]/]. ; NdepH喗P]msق= .` 7Zdj6-UƾIU-4Mg$S4h-,s|"S%\"ùE@NϗG CvLM351? Cٗs 4T'SKBFk9F!U}{vSo>&@./sͳ R{7~[q`j$Kbŷ*ِ}nK;2`5HYZ~-^I=#c ,JGoROh:GEX-T 4EL^( ̍QYqfP])R'&IE*n"df+q@UJQ Ȏ2ӁvP"LE1"$a\c/S$RDQU$tl޸qeṣy"ءHF0*yCGycAt\@ 򔢐bMp1b2GsP b!.R'ǴP\z3#,3$AvI A/Vxmt͈C5xA 0hY&}ϒ3ei,Z½@⧴: _&IF=7ӒM\3|gzzEZֻnG۶fϞ= /}ǏS(طo۷ogp-9'#9YQ,?ǎ;?<333ͱsNZ7o$-)oNA.c޽߿R+B?&"N>q[#޹ol{?ԝNallU6k.<Ѭ l,--iiOp!NIhRF(yRUEVG1!C lV;&}YGDi4uTuNvVM26Vv<;J#I #%TAI5/(!Eפ +t)&1i١7)8y^`0G)3peJZ J ]MgJRb MT- O5rNlS3  [oۿ[2|>O\rxxY__[wdt:.\`ddCm_7 SO=Ņ p[fLLL{nvٳg@.lbYfddsαެM(߿zoo/nms3 uVcϞ=H)cxxbH[ؚz)4;w̙34gΜْoӣjfsOVy4>ӿ]{! d($Oໝh{ض[{*=;<MǞ!ȸFJ)wJi*z8J+M(Fn٩r2D#Tif:]߼81MbvD_xm5Y F":]6eZCK}kG[%k.HN_Uƪ==s_C1(ͤTև=tfB:RdϲgB6ѽˎͦqQH']{zKܺ s;`\4z,33>8ebsm^v|q&'Zo2<3f-w1ϻxR:aLQ̚IP -t,0\d8dr{#l91$o?~ió~?WY?,`Y3UA5H fp,4RGRAW7ƿu6j*3pc9283B w8n8 4!Y]B[ZBd=ǟdc7UFmLIP&|Sg)NNR䑽EX_@T* brmhR0bI7&&P\Y? 6 E}` g/`uq$"?d5uE2Yb,̓` +9Wo|k/`se2rb%mD;&pLb:yYY^6vԣ锔-!WB&5Q&\0f]&t$z}ܔ2[(t.=?Gnyo޼ɉ'8y$w-:,..r8>)qm: `Y(ʻ|zSN3pQ?{n^8־mq]$IxKt: 099IZe޽8p;wRThZ[s àP(l1ʳ|+_wPUu/I&kkkٳR77 c+͛t]>>Of) <4M DoM{=3rY/2w^[fgR\Lc (rGMgincIϛOQ-CKO-*#wR!]jY ;2 {2Y(܃Ҩ+yeŭ0aE]jJU0V&/%,"͘>8?pȀ,LZauɅX0::~[Qm a{> K XXj$Wìk5 f4|ɜTvٕ 8:64&hh6F)VY'iTPf&{u+tQ 5v Eaײc b&X^pmŽCVѨѭ6Ȼ,impᏏSw.l;e\ ]'6)~&$":}.ުlۿJAG1[=WP4L,2 x1bu'S0T%7Oicy qVY;`2OTj,)u* "y~vt|?OO ]^|<;>}e QЋ1 'H =:+A^56_$~YCqkiiG$(>u 7 4: RVj}\.w;Wu7NC6evvvj.]&7Mn=*St:h MNgR@Ξ >D|m&>hؠJY`nsMPW=I@9'l3%z5b=PШ8"ZEɹZPgCU| l"XLQ}e:)&eaȊ!3HV+[ .bԆ:B'ZmL9Fu65A `k$AͲ^T1W,8D0d1\beZ^6lF7i54MrULӈGh k:0Riwh̔I: i_U$KMDE%#IQ"ۃT(Lh!D6;Z܅MQ-.8eO`T橙y}a}FGAhר$W>fOY{;[< 2{pu(pþ88"M+&Si%b~k:nq}G|73/oP}#GXHL.̤X"|89!G;}e(TH@gj^.?Q(̮FI&Npc.)B%DϺ]ege7uFww8F \#=yEr#|7h(O1c`KIX.PhE V<`iG{} S%7UkW**1o!_ԠI&?z*g9U%e)"vH~ҭKo QY@$-)l4hիCG,bftp]Ar Ļ8?AQ<_A6MG$f &>, ^Cq\pL 䍭a[yx(sbYo\da$>F8 "'"I n$| 铟"c7߻zf{ai0<qHC}Kw(g>$/*g. "8 9.vӪ$>B îp?o`x׵w0X_&@,IX_w @pc mFps=ޓu Y >6W)4 B#Si~DQEԚ/4ʂI#_z"!]B4L@[gb+*"RFD,NsD:2Q>Lܳ(cC8^;( 9ږ a5chCQf\| ," `p}٣)v磙|mNޜ5o MӊCuqc 3'ॢK9C.yı "ȘsIf`[[ aMz*w TYh3lSBE|X~>'l¥kH$s(-,rdYdG'E=+zhmO1a V΢У'Jqos/sya+0 z,p*6) l 쟇Eo {"ƐjzCm;񤻓 #4/Ns5Fu\/?55ˡ?9z',)ٷtb /Y(9k~uɽÈNC!HAiGyl? s;fPgLJ.qY8;8Ky+o]'Y}"цLͩ-=dgE-)&|,$S`[%=ʼnpXRXc<ʘnc%|Ԫ[ktH#5nTUboqjʥ?- ;tZ!v^i` JE \FaMcYU #:?I4n"HGj!hw4`YC/_C\۪I$O@<CVgqI|՗ofYO =sYC2ÓdT/}'a*7o_'K=ı?"mY @1?($s'_ae:[ PkX] CE/&9~'a%Wu]B_O;'ăX(l2t;Ƽ+dJfj$,Vp o$~x*uMk=.NIƲUr`*@ #bm#!ᗐ.a1KŌH->WBK_~-M?)HsDW}?Ǖ{7qc:Է m /b}߻_!:ꐊi[26VG'x1n3@ɣH:n P_cW)U’EvE$#ho|$#*צwdrϨSohm +Dlxn wA!%ZJ Xj -LJ;o{Z2d`G"(3#l"+9_Ie ˜>B~w2e^9c k#BL&6,>6pQE*їqcH)̲ 81Gxsa$Gaњ%y@He20} W~0@lUVC74d v?kZP]pF\V8݅T7}ٲۮb!A ] B$'Oرc,NC&!J*bz~;YLӼ.]1,//c2o7];mLyj5*np];IDSlj1e~"OH1d)b9LvC2be |주2bh&~fNS XdhŚ!: ~:2~U3OpՅ, 3B=c'O"5gxwF!՜N5dICx>6>bQmQ;)% 0ҊHK3l1r˰cEʨ_y3hOAύw% ;9XX9zࠎ%ZRy-bjutX\u9LI4ӣ,5ܦ@d=Gub.0+G ^?O8^PkLPܽ\<$Cj-]co9KcS&Q&g|7.|g9&G#ss:á!Fq;;D`PB8;d0گ@O?-W݈DVx-x'q~2r4 Dh a~(EsFnrJ^-k{Qw0}Y6RkA k%Mǹte㝷2c5:ȋ|Ui,x!BXD:d+ "(yPcYUn#Xi@QD [$+#Ljx#!VClZ0Re!Q1Zäm z^ "6ނ+IX^1 <Qp8r9n" DC%o}|uA > ?_`-rED9ȲGZ 9iJ"$k\1M&._ûoY2E'_`9"89,\NgOC/"ޚC\BKEFIUUp*E<1;HN#N~JQN}d s!-/""8==V6 |Wp56UA,sDW-Oո9^ʽ u8z2,Mfc5Eu<'~sgr<$#Nk_f~~'، ;x@cʭ6o ;Y{>rzI>JWdf4Ox"[\5&8Z.bE w2Ca@ue6wjW1ynܸq[$w. 166 $I:뺼mZ\\d~~vuktѺ ly;Xnoob}%|;np/v+~m۲}(gԽvP#rbK!P8 ǽe:AdEԼ1n&\Zp[zWA_a6d{xɜ"B]>0kVF,Z9L^cH*O|6˃cZC>5DR`Fd=mnfg/gLXYpB6ZDElz6C:$1|<}NY^30B0ɠ("[4|Dʜ͊`іD&v*7r)12QIV_,3zؤ6?WG(,\b)L">bRܸJ7LeXLpR Ru٠s0A\nq4o\0$lgV?FsʝX !z}L')\˿ĸuBr+<22GwX3Z ET# !yP&Ih'kg8PiХ%Q<ʍ,gB~omm+OHYGSn_c,"(J"a[[Gu.^ kt]]CtM 7f~ X{βa<,Ob5g8uZÇ/ӛx)d3!h!/E'A4GUdY¯L # )ߛx;z5fJ,# "K">]A(}xwΜmꂻ낈zCQڵ)$"]ooXރ-1]\|r] +[{սe O!s)Y2nSLZb+KXr0:U_ -SGx65%v6>]ƈjS QVL"~QnCX.6R$]P+dCpMQ=Fs@߷KY*qYs!3#:ӻORI%xyCb:1OҎ2>Zc 0Vfe(ĬAR)zO"H6eꖎa^I7X-x1khqb }{gQQҝcVe\oO{Mfy|'AK!@ m91`tZ>VViYFvqރE B SkJ?5I|!ײRRcc}Ot-߃yQt4~uWBd E h6ml`$rFx.Xa |ʟ}y ow;^'n5;s]9wC=0Ep-tգDץ-&\S}CJTPnBHpYT*;FTDK9T<*zqx)l (}<׫x)αQՇ5cEUDr"Ug:4QR6_] d:?*L̴Q[eal'Z3|=㾽SO~wQB׉MYJe{tlMH$>vCɧ/3͑|qr|WYzu`fޣ5m]nu> ߭nWM]/J0no]͵,t:M"@Q<#ٳ@ @"_*R6$;#!^]{ 5M#nۧ>?s{oӱǡhqbSD ĉhw,_!6-LZĵDm?s̟$ߓTh=6cN"'Wn"s 19l޺D;琗jcc FkU3\9ܻ$w|؟ҙgpv\ʲ}$^*_b(jja]c-R;N2џ 51F#KyB!OGpm vCm),.Ӳ|Ef-kD$$ 2d$(%rġvqx@90BU_sbx34tY_W\Z]P_AK#";%\i?/žkiB~v i1<ɔwgTrsY̰xNeMpZGG`MU R/}ĢWh '*iY&rXor3Hh %M&`:2Sglf͞$ɂʼA;b_R1迶.?au"suFT:G +H0V@]a ]ԋ6F@5"lƂT R2 JM~͜D\Ht3A="u@&NMdoz?p^E&'yjb H.jl~tr3LZ(-qX;Ь J%tބGcM IAtV.Ƚ'meKY {2d !%MQ5$F$v r̐<v򶌷dPdWP<]kz"l5 dcne܋C"bVIרˌ?2(N&x' N2" V7BۓmѠXbMv-P\A[p]Apnx؂@֤ܘABHŋQmV8w:}ԛS?s&3Yi;>s3@BrO).~cQ͎Q{`i̺k4NJgR1]\;R?ßfx ʾro ձ )G%ӨQjP8Mԛ1|}S~5..OS"#ll;Bb$y =Qr$^RžEq4#r{l)- tHL`s`` Ym֏HxU6/~wb c>Z;KhfqA`88C$͇_PBbKnc7=M@IIQZʖ֫])vײb7k׎=2Wɠ% q f03gz*n΀pZ1Otvgevf>yE BS"qLW"}mE5@bs|% 5ȋ;i6x& 54B JUJӡt2_>$.Fx,W$FL`iKNfOx4LltI݉Pu!`\2.R_nZo(SIbJl6Z$7hnչq x^GaRf<≛lW] *G\l EI u60F$cAJ̡rZFVE G7AH 1U Rot&#`J[zcQ1 օ*Q* -h<]*CPڸzxIĽŋ :cUY% a=j`۷ѕ&W0ja;oF)˺֎RA(6M+|$^$Z=Ue Xݾ49$ߧ9ϝ՛DKsj蔻,FQ MUWhU פC!,hL9Ti1:Uӟ?tGeo,b+gW?-`Yt|n>'.I*"K".>>>&> '*#.&z*2mQ(dZU/ -: <Ed*En/mb1$ Q#".8;ZѴhVJ >@wrg?/|IZv]ÅeӾ>Zb~}A[~\ld._؅l{psmx"n>~&#rdl\~Hcۂ@x}}2&Mqvg0}&E1YCd{WƘ^gI{w99Ub4N M o Jʘ鞣jG?kE:'K ʘ"rBfY^ܢ6c/r,Rp\~^3/g0؜rW9yv>wTP+9M?Po%h{x+lT=1Nlߡ`JއK8αwdk5ƙ'MNL#Oo}|]v2M9Vxo)"g$g`a=j]U!eN/Gx.L&^ǤS=й:s[:yyν:fc>SW Ѯ )=B}vI\Zxqa0ip^c7uӓa.)9v1sz-#:5ࠕ[C2O~{*N;SqarWɄ|i6u΅GYٴQ]XFhh.fM+}v{KkM9 IDATǖ)s85C_dKxYIӦܛ&~[Omf!A;sg-q@8α[&{{ElXj_{l.SޕLMghQۏf|r{+vg=N @UU* l6Q9qYS~|wAq>G_g}ztbwu]]ieY{  {_aeC{ΏVb ~f^O7._Wl̷v$E-ğH ;ku/_&}¿|Ch2XѱI7MQ+`S|!N}G0?!~p[e>Ibgo|Rctch>:vquf$GQu 3o|+ s+&8HU ۈ+#c,,+?^x%ᤇ8 "]N/I gRR/}DECQZ䂷.dD=u_{ڨ,#pzk_ADZ};v J/ z;a x)^rO;hooE);>A|<]rAmIVw}%|yV>؂ς "$ 5ABc>znS[lUcé/Vmtxr~1V%B#izfG^yUW95űz+^y*|[?75;A:/9w>}9漂]_}.~rw zjs2K-BKaԯwڶp @1Cy^lSb'i}C9dqIx%ÇKlR5"HWb!ByN;‚ʒ|#{ 5&=Fwn}AXTl;JO}Nnv#@F}/ܿA .ګtMrKx_ TL}#V Β/q&Mn9͑{]HCcnn$g=f M6'xC{gOpxJ?&еP.}d=ȫMQ2z鍰m4H41'bdAc &u0O1m0~"=9: Jf,T7<%mN5?EzmvAm;m^m_A~>6^Cd|(oZUrb WH>|Egoǹ9 Thˑ06KϞԠdq"W}9>s#wVYN_RMn{; NUYh;mV':u8,eqn'q.#[C3v_ 1j;CV]TkNyg pWj,IpRPMp]5,k ӳ'}B?m(qҮR*VXwezѯc8O죎?nqDZ?؏J tvv4`0 [(}Z kkk>Vj=`ka&\N+>39>ayt徆uo zˆWI7B.G= C'O0 ͡#I;9xOnԈGާh}!#rkcno+!pKY /#nq 4"5G3$єhjM6̾"Z٧ GȬT=愻Ke1+*cL(Qws`DKuB@Bt6xjEJ A &x"vg$UL:s+îfia5)':=J' JKz.BHo<[(n+X[}$x 8>мX ɬD8;vͫ =s?#zJ2»o+W ibW@V't?%}E||O{:K ׋:^k`[ *_BeiG#jHD="yx'?F@ƻ"S\$ǟz%M(PAzJDC>gLo?ֿQʅYbӘHԇ\VN =mdZ V !L%m,Ty_k&HQ::z3}zp5^8qUߺC۷%gOqDLv =N&F e7+|# IfNӌ',ioWzCMO}&ͣ\swBa/w >oq"yp+븽 oM ԕ1:h/,_緃U~ɍw=0cE0<Ś[,}=ϝ(*K?M)z?fh7w.p>;L| y4:8&Lj%VnOgP.Ƶ%ShS*vbAz{wczc}IwۄVLĽ4b(:I/Ekt?mw"2ɃQv lf!z'Q .A4fz0m&XO3 ǡ6z-\f1}lFg_duTH\a*A97+Gc&KSYj# D{'8\΄燸?1(KqOz o)}hfɕ YG5^.>I$Y}!IE }J!cs-u4Gsw v`wT*H(hٟfw_wp- .U=]&F_}D0UQl`e^HqD"4M|S0T]8 q*^h&ڛ%;DDO}A[҂/(x#D߷Q|WnoIRDp62c"e!A@TGm}'IQB3԰`_8}ALW4B}vCXgD:Q<4?ʗ/nQ3ȇ }kI{5 ->;@4yf!qm,?! mQd1`2z6cDmjqKqF8oiʹ96Mz'KML )re̙-\RQDma* 6.צ'!ŠDj$y-Ů[Q1]&>N¼?=v=c$1)$Mj$,'9̣ɋSQ L~PY2ST:$F?ZApZdc01MlL1ra ?Q>[Hhaj-qHr 髋NMt 3Eոy6K/cK'gEn*hH}װGY1D2m 'iz$1C$(>(v0u ) q5pu-k:Jm<{mOqx{92lْTzOܻA4D G,vC+ĠHsʤ'} &00ll#Y:3 z4r+.@}U. GzRr1y d 3 iO<1L$wƁ~Ndus^`nK 0`'}{y(`ݍl:}4躎,˔e}~D ܹCŋttt I#[od0w aw磠Ҷmd6BHie\%Nhq(HD2ܻ]pkY,сi?$Yގ rC0ض8{  !AO^sK::Ug@3 _  AףD'ti, ds]5ǡ@ AD )]\d=^͎8NS:A Ktljy̕g.Xv`9̆g]e+J6UɯJȑAB,A&**$hnL) vb!:y,!Lu#m7|\D4Iy$&uQ~YjEQ,D$* MRi414-ldrg!*"Z 2>~YA-,_WLG׋tt!)u"nˍw>':"z(!ɭdv Zrmɨ}; K-ٳn1$|8U}Z&\8zӮmZR}EQ[,@&tQ&lIsP%Xh tNOhh H~k|FJUn H"1BxEYcw3xb c:;|rRc rz1+4#eN%x!]{0ҕf;4Pzu/( aRF_ %>ע h4;wWn_%q/UciOPm4B9{Mn}fj#+"G sq UW^b{$kTSċ#3)ҫ"CdU>4c|PvXHT17RQGd(NҞ&Ft7ƒÁiz=GFo~&{KYs\R$ H; +vYDO_73[Eҷq"fԄmJs6Ƴql/!BsvlVL-erNk `ni4Lh8@{{FNHLgTD_"R8F2]WY2t֣%!(aڨ?nD<(cwګWQ.x^ZZ"Ϣ:ϩSt|~%}l?]4&''9} IDAT47n J122B\0 EAETU%ZӊDOxEO0??F?:S(PU^{5&KB!2lw}ydY&c399xD"\vwbC;?w{ 7n_& jQlpm1_#,z0|@U"- (R h HUa"P =2#[f{xt'p^$ _o"b5Tl_D tqhb}^mH, <\(m@Ncj@5 S:\i$NGG|6U_>OD,ٜdro.YxǛ` T!言0iZ0v$1]"XHr E#wAdɳX~&z;ܿF[.խ' # MlG$BX:!}& LF4lb1፪I6(1gzt75%@0r0DTU&ma(axET>NPq| Q:a{fP(y`O5$;Y-m ;n)6m5ZDe&nP5eAhy,FREOЭQaɃ&ɘKBm7 D$DOE4 ./:Q{%)=){Vp_џʳ\a#p8HWaBC<3FT^FDbaϼz}7WRSfտKo}i _P]bx*9T\bҳLte/QP2QB)גetg}w So!#48>0AW9J^ֶʤL&jVu4a 3`dp@MA;DV",4ubRS odOޥuAjb3Jz L[qіRxM*e16qG߆^hBB ۄ0e9BYS}z3>B9)šؒ1c"%Fz.I!$ Fi:eDLi+U J_ lc0OXcq3,RX_#p(b΍3 䃰9zoQJp=8S`r}R!%y(N20ǻHo'QVmա6s$=JXsUR."c&UHcu~60ett[\ir!(J{ ӱG{9O8_ѣGY[[4Mt]l<ϣ (, ܽ{r?/ wSSS;vlOj>00Çx,jLY94R!duubÑeRIApRlP)ՐTӪ +"AG l/?Zw@49u$dGRȲvx Gqh B0۷?A3E-R*gHi">@QP{(zDcqp(LGq,rIu$,VFHܥ< xej+} I&Msgo&v38&.Nzz@L|2֝H^K&_llvӗ8;"cKX&o~g|h@DrBϮs:VeYq a_~Į`bRM\#S|2f ϫot.~ƖĕiLlAZ~K:`-NJP%{$G"&YiQMPPn6ZM0Lo<=lBBN/\vAE"ۋ6Jb+Sri+[:k:HRy8!1-A-"e\2EdA؄0mW\l8=bKHKR&` +[HYWǪ?rVFa[!XOo}&?RV**#/>cpp=fk*mw>\e%zXnM :L O،|0XFQt[T4CsEh'`>$x;ZgH'ʸ^KNmvKX=;e_]pd@qvwܰqwTעN,뵾+ ;-j\QOhhM0o+:x&?cS II? dV"'rkNdm5K/sbQ3oESn{oc}_}}^]KwnMHJ.Y@f4# fA ylEHvͥ콻֮}{Uw2dƂXx­*;|9Xe5ve+4Gt fq%!bv `>/qFJDlT;P%F(R&L&ީ-">񐇥U=j g4w:yzy4`75FzM$$Y^MW4=7ILbl{8а,l \FX#dݤ7^fӟnvAnak`ܡCPlWT 1"4-0]lA&ZPiQ % R:mI;E:v< 7jV-Gw &jBӨ|tlF܄BR"k %bR5HEvqZnK'Jݬ*< Feȫc[IFD ACEg@~b6WѓqLcYg B "3^j1EOb&i"M:W|*6a%JaRUkھG6|ۛL&I$crbݻw0 LqX[[T*+#CCCO(tOEr. lv?Eܹs[W\!f; #F:Z8n`5#qiU !5k82 1D @ĐYrt&*>'0CXw_K Z4P[혎o/HHMuPD@B&d*DW)V,-,=ՖXol2'{jҕ pDUTڒж6= 46T^Ej& u+$$\25ο"caa[ETjSm_eqW]C].FT)JR-e%d)Z & X^hR BhM ;% ;}JE ''fU$@ip4wn8tOAGGL~M] ˊo! P'xJ( RC'pٿU>dZ\4Y̦e Hg{xv/ȂGG CdU_ H1$ "eNG"$ J&Np 4^D j[=?/IH$ RzelWÈ"P,)lCpXG1raбm X ~!{>b >ħ?c.Ʉ{\J(pH>`PB.D(ݤ9zUk3abu$Yе$wy|=A0jFX6'hgOs7[ajveSF}WcN7>X;k<8)R<;z6J̘Y} ?$ g81vxFq>ʿ^(?\!"*Խ:b:Up}bضEV'.#4w4%RVwˈn?ŠbGD xzR8 53U.e*`!^``! a%x#in;HIV](ő9j8e*ଢ଼DthG/x6aFD\MWJG_=S7971f{#Zbk,GvDQ8BlS-W2Ҳ$-y"t v !fzfMOs_@,pIyfs³$65b쎼a_ಶ)"-Ƶ8.o1UdH~eVZc J< ez472 9ksT[\xh [䳱{V/.Cx2!7Yl/BxxjJ摛3c/ yů|^fbʨ-Jcccܫ&IfggGwvv( >zzzӜ?8  w2??Oww7|SN133իWF|3رcD(ʾ:3<ٳgq]L&˲jX388ȹs瘜}yǼ|A.]"=== h4}i躾ᯃ"L40h4 bۋ,~Rw&֭[lll:333lllݍ8m$,//+qgcFȑ wQl]QvU$IETei7uBUH:A#L@:6~x;A<0B°5@(! 6 8bfkshjB$G zY"ߤ+я$J̬qi<7O(u2m1 xDɕ1_]mj/ݡr(X i.E f1KUN zP}dT+8-$ӄB ua={g_>JWWks=D*GHtQMΞwifbG|:wn\n=XTX*Ϳ1<:8†Dl@9,"[y*T$05vv%p<ǎP2 nP%b[cP['3r KT:}qv d.=u;-U| q :;xrvPAkZCnWi+ʖG -ZeM#k{8n)2TCt}Aⲱkxxlk)!"mo؊`^%SZh)x~ be۳O*gX9m+KțxH+ b@GQ |ZC7MƆƏ~ u8wʦÅ\USڈNUqd$ \YcS|᳿L{>=6w#ǾB~ .Ƨ{zEZe"16wFOXD&ӢZy7yC/TGy|mdC'&*,q,," .=?5&>p ?&wID@F ڈ*JsK(e!mM)P|WP]As|[p)$.31)DMheƺE>}Uu\e;{ơspWԑuu>Q~r`1y7T6Q͂ 1SI`+)Z-OaT&Ɲp׭Hzu,T8Rfh߶8%uvjnXj/bzz%rߤrѧ-[ajsMJһCaΚFQ*}4MJ]JkQF#`#¦*1rbf Y[3a#L17w܍ҮstVC}go7!r!|QbC4׹xp#X$3>ƺ[Cs>ӡ.rq|X2_oRX8v&W<&w~t&Kϛi8Sc'xF-5֬(ʾzIh4 E\|L&DQܤP(׷F'}/S9s qEj> 4M.\dr?{ttCc͵Z ۶1 AhZeYe\%L:P!|M]Fѣ>|Çs1<#c&< >,<*Nml6i#xd4VE$aoo BhrD"TUO__333rjAs( \nB e9 :vWbLEIaA3;M;2dGYDդ(JD}٨Szq̀!dJA Q¸** 'M!B?"JxW(m\YBn¾p˜8}=\k wgs,]aAx`D;`P Nzt1Ҡ J&6T+<EuOq|FFWU )F묯{5x&IIPը[Z@*+{Y^g]V:~ Vю@*#*•]̮* H O jlB6Cm_pmĤDZX.hHQٚ(]"pfRgG!j;nܫ),,YVa""YG;D.(_i2+ &x!Z<@bnM6a 3ǹunߑ$H'pRB}i~7~w \sF[Ϧߒh{+|\4'ߖ""x-d>/\@iNVFKI: XS䧞/~4Ŀ_ᑇ޾p !bc xⱀaP@\ ą7|ffKxr<@ 62[%pIuUŔIٛm^yUC8.ΜH}nIgt>͝xd;:9-tV~2ڡnF#EkG0Gl3أ<=ƻUw"S@'ٵoc{aӽ" p,%Y3@:T]0# 3=> *-1_揧{eOgqpEIU3)Jfn[a~6XZor(j⶗ $azkhj豃Eu ?{Õubпoc ~BTiwX k.j3mP/Q]vP6ZC*њ^%H$q<_% qGB.jm%; 9bCu<;FƒUZкwY{*;>IorivB4N'T#c9snH-QQh͵I]lzc[lGxA}p ;P;M2ȑ:Oe4CQBo`F(˩0זO1&#3stXSD[@n㎜ՙx [35i.7RTX#<]pl܍ ?M9R,Wʧ84uhw%%|uN3!+3L>3^u : -`(7Fgk)nsľt+Zg/R!ڽ{t=*r,CȲiJ%( Ph_-K"\.ljF(uwN*0 ~x<$LOO333C&app|>[oťKVj5޽$I/|'xq( 4 ܹ~uӡh?8d3gp-}.^=SSS<#<,//ꫯdX,@Zg_9v]CixUUQUuaEVhwY fFARa||z]}jUWQkp.p@良:;UvLϓ:6C#%cS?B(MAJQQ$RkP@KIx>{PGI(`u0a"&Vo_&ȡtC+53I:ת̬Lу]a6gKWc-HeSX"3L$bX& c㽸a|핀>= ƙ:}M160r"i@Ci$D޿O#6+ă&;]Ios4}yJJG'pi.K ”u~ç[ǙR1v4 G9"g\4nljdB'caC}( AM=뾋WmeCH M̤۠db[^SqbӰ:WЌv- 8F>mQB|3Y踴 "bA B;`#D*.A$D\*VvMc+ qMPy?ʽDAem\|CaL4f"*q5Fٔ5O:jshJD yUW]۴jK2:` .G\O:&⋠.*8@A<|A%r)~^k.<&pˡcu%HF}ri S8w:|K5|GPmx];CO4U^@oGyM "DO$,6la&e}: " : "2397 `b 03pxD-Nv5O(=ovr}͉(aUD?5w{AlmL-BnJ|tc3IN%d{7]]jSYD40 B}D/;mJ1.mfY̵+nx=A-}k=%QVKQ,I(h̵\ $e+۴>G[<hw|\q?/` P{[<,[M5nk$ml8't5jpxnT=䜁4v%u 0q0ڎUq Y]AT`$)y8nNn&jzirAnSBZ&4K- QQ4L|x3L=*Җ<ҚGT2I],?.#ߦ& p P1ZiTʤJ,˄B!0jt:Ċ}8 IYey||_@ӴbH>gccR~U4EU:r }2{ 'P({gu^{%d;u>yϓMwP aY>CL-!IoS:2|5(Qh0r=D\+,t1Tc/OW&D@//{n L푋:C &np}\SxotKV_&&狀ma5Ϭ Jg}w>\FPJqU"&Ă}Kd(W/kf Yo,OIͿ |1e0_}-m 3$´cҢ|PHNPzy$6VWd n!FLb ,!6vP 4*aK&@j;4U2-«̀fŕe*ri%EFO  C9̜ ōE}} Q1t]pMl jб҇CV7ؖ )埏al, ",K@4j>x>O.#Œ@@(& ѕD\jqEַ-d$"i)/JA?u YqΜ>vW΋cI ^?Bu'RW3rGV)#k2+!66ebKtIH l4lџxKP( &F&#*(? ؼ{/ԤWQpG(hIDh[6vU/S7&,JT;6e! v1tjJ O<+DMEzBRFtCXaןUP:N+F%c@j4w.JA)dKk5B l;.`"Qٝᥬ@#o-3W"~~EB-#4<2=0$4\{Q*s'>rMX.j _n` >-!ǰLduES,"LBx -PBO"ѰiøKYb/A <2;kH6BY"#ޤo7 bnCIQ>Cg*`aI"\0XB8kIez7[eSe{7>"s֠)nd:4Ww͹lj؛Gl3dP7ԄaD{tnoa7s|i3S=8tc*7-mTQb&<mQ>C!%{|{Xe!u"FX(kQϜuۤG<2trq֓r e6 %7mn'lP\Ip7c)h<0ٍуM^* | #GJ>rz[\p9," [4W;hb;y־3y 3̯&HվXL&qӧpcdؒuOv]w,88A&ٯn2 c y_U=I>a0>>Α#GݻA__L0x':47YYY,<'˱XxӧOݍ(j5{9nܸ/H*'cccO~r?ϵk(JL'Ns=˗O.JضM<GQ:ߥ|?muh6_e!"JP("~eYhV EQP}A. rnmb*2 B&vyÍsm! Q8n| w^`Hqd:-Jd4-6٨ r?VH>9_e@~ C&6ĮDAKPzLDWiYs23԰Qǘ__G]'H'82Ndi9YG3a8kw,dD_axɫ+ h&F8X+H&趋ä[.ɧ>ss&yؽ±C9LX dY{~X!a:d{4FqOde) RU#a Jtܶ?~biQ(ЪERb@ 躀 @_6 mSuq| Pq cL'?<7 >~g?}zwq7;@\EJ-QmJ)fI|H>M%f2Iy\5TL{>0UaVO/y9wYc!_Tl*~Sdu+$r[B>eшB´'g*d= ox  2_/ wF|$LKy=3d Y!R5Ao@cn"$B !J'>D@(z[Kf}_'>[U#!k2қ z- IDATA{$4#OxrcQt>l/L-j* 6"l,MIzD@m *먾BÑ4nTFUF,b-S !x Or7ALfH"inLg,!c& /Qd%p X֠~ AvT:6^!">F )8K,4jD~N umbBMGnR+D[2JDY1:{>)rFв| @`$F5W1RtuZԛưZ68NAEvÉIITE!K+U:G>2SNeWʼnLb# ܟHr)fx$y"#~Mit$ Y'ɐLsk NGX;o cNr\ܞz w@԰r*Vӛ&ys8֢QhSb=K%9wo.cëO${Tߗ6_}Hj|rzt=KD߽%;6OM_ˆ~DqRIFOF}rZd8b͡`v$Ia[* j3l^r1K_8ŏخ^"=>˭CYPi0zߑeɋC.SʵAؕXg2*2YQUMv#> w@#QԩSΥK(J8pC!I[[[R)^|E,a,˲L2DELӤ^c,vgtt#G??bkkWo>fgg9}4 ܸq7|dYq.?GI{kg?<ͅٿV LD44M#JlG"vXk~1;<ŵeQpc~cهZxXܮO}dr*ӳ\kWJ1cZNU!EܠK@JRIaRaG%UH=*?MpXBfHRA&iklzY27?c\[, F9ݸ@AD#Hl-zܫyL% 47 "tD6[Y1lNkm4Kg^ jfmbfSؓLv*IBlPՙsNFMtbe}Z!N<ml^>@W|fFV|_~+_fɨӫQ"k!ʓ} R8M{ClFh(Hv䐁|ϵqDc^b0b 0z@IvuϾCcop)" $?$gþ!X1PSXI^ j=@f[%.$0V mL^uĐۥ9n.3>m %iYkM"CoFTC"b"f:Xji%#J@kMv1="V5GT$ t\4%z/N /'*жX۶hJd JNh],-( IۗQ{Bm[MPrUwk)ώD N8/6mlU@2U QeS35h@<ëE^w\i*d]S8WYk?I~Hk2E~0N!نקx`89&WsX/ɱz3I_gVsً5F?[LyJf]\TU:Ջ4 ÄzN~9gM~~ym>?ݹ4}^?UN:c 觏\cՒ'C[FiHa K;ՏݥMV)Amx ٪J2$ϣi.Y*vn쓮aiM}rfw'yG}\,9}4sssܿ۷o( ccc s%otxWxt:?RDP؍rVI>G$vg,JeWsoW^Cub?8Νիu6VY^x2; acfE;9;܉Db7˲,\ŶmL$Nl>rɃ }a_zCT'W.7ݛd,_!|&H{eVbCKij!r$@(=b3`k% ULw~[gN=A_!$#H9=Dž?aU-!]L=.ׯ]'lpf. z_jK`2#2aGU8bqӢAU5Z *n?&Fbzշ84rv1,20B:H*ehPܻwo FB˅H\m?+>N?O* IlهXͱu3Ӽq5wqKbBl#jަL::)c%Te!=ZCs.DF ۭ!IOcj"͎puЩ1:2CL:9ح%"W܃aS};G >!k_*(ASimչz H K2 -KktːH0Y -]@Ij F>~(Xa"B>ҶJP~w@-c*1CFS $?#v2ͨM<.#J; q]HPDUQs@N2 q3 <~#?OJR>C#qF{"_8%^_d.ܔ8QD"WDE M Z: T QVi$)L--" G؎/GNxT1J LA2>zAH x*By! SINmRMI;C\Ȕ FN%Fܻ&p#!ޜ=M[}R6D]P0)9TDMx\ jթAsUqWkmH IlիP2G.L~: ȉhȐf@}@:R|cke_pDA;*6mRn{Co#tehUQDYϓm |JNJ -^f@~ABRfj˥,JLf{>3{Kx_FmXQxᆬ3ٳC NW@ϋ,^IPo7}o #EZ#}WypEDB~ټ]Xrn~n*A^;qGǙȑ#(466t۷oܸqX,Q133޽{Er>۶Y__hŨV,--L&)Ҏ㰺f۷Yu+++ xѣܾ}^{۷o|n!8wLvd;끁z).HlJ@ζLss/% 68{5c <ײ{8{ڞ}c,u2:q{wz1q"9"1 [pXvlIp)TTS*=fDdLM2 2R OqMݓIIl:]Lt@( (!DFO֋*.-Sty+W0+!,RF[)vs=~KE)("6Lx,m*bGaIe˿D QՐG#N_)qjwzKÐ. d328ϊ>#g$"j[bvb(e r!tY M"2!j IxNHL!TU DB9DT@b$TLDQJn`:=xL">\ (0e7i|[ lX̢Me\Ƹ5p7 (KÌ1RtdqmVb( i{hPm2"B$j6ѶmET-~葉6cM%/Pt)xALۃ$T*I SOO驕H%sg{I6ʀُ=?;k6# >{챈JPQL4J>ɝz(m7mcJc@g#%:d!r52rmU{ {&/Cn %,%3',τSw+`m<r_fZ5F{T7EE9X${zmF&m^?Zc)4pn,~,"~d&<|8̀ {D,:g@Ȯ2nQR [Ƶ&%Z5te>Aawظ1,MquB7|6+;>%ێX+:3CUb\hK9:Z{.j:e{{}[t(;!C<$1TJ/|?d}BUU.QQ, ÐNtekA@&Lbܮ t]e횂IDP߿w;*{affUUGu.gϞ孷u],ǎcttfI^'">|.Àdž߿bc=ƭ[8w.W^0 AjQTb$ 0ی/gϞݝkvvMvjN -b(0MQJ%00 :(m̟8u8d]w%Ib}}Vwdحr^gNuX,rcBL#F2Z [=3l3mO=u!:D12 WLRܽ@oCk_|\bD`z| 86~!h\]Zabt(-0}26_9ZE죇͝;9n?a,. _I躀19R&}*Q/Aj9"b˦Y&7#~FO $j7x9qm%澗㽛u~dEt0+Hg.O'g3+ m̦lj/ۼ{[~!MJn ~wotDayɼf\×I- 88v"݌"!"=dF\$$ dQA PmZ-z 4rP1FTR:ICGJ2fBȁM1c8JMns#q08]o֦aBDY\؉ n#6WHe Z^kRd4+j["Nf6K^hBKiGTj(ؾGpQ6(ܖ q\f:A6$\ Yvp5Jf#ƞFSU^MGUB ES^Qj#B%|Dz Zh\ا| &T?  r!a.]W" sEBU CT@8"JExA/HD"+"ȂR I!a(! G82kk H~\`x(bć#F{#2@Bpg|La]XZ%d k"!= W1?,3: kXo IDATW˜<13 O?!֟_Yy1=19,W"߄wU#ry.5P"|sE"1@TtBE$"@"DCAeBA`e#djFo#EdY%S)TQ",\AB[ӢN :lК8C80{kRra_?¾$ߠ8MRh :]6ƭcm>' ۠ P[;S[Mk2J ]NqǿmGFqrw =.r$,2߽ϩx?Q;ơ$[((=IaK' ke?|5=B>J ^3kxwl70 l43/޿fx[ᄜ<3?J(bD32i̓2xR˼IrFhB~>weJ=a7z!I*s~o; ,+=k-ivI V:σ皘-^͡u?-2v{- f4U{Ilbmq&&&t:t:677iZLNNo߾]s]l6KE(ضMT5qH4ׯSVd2̐f8y$\~MdYfddgyv.-(>t{s166( K/a&W\Z Eatt'|4y7ѣܹsgw};\Tw:#쯮D[E^G4I&eYaH.ߑqomm؟?llz75^_h3:PAlo3Xx@)cnE]&^Ts})N 1ƬEzO7.jfȬB5‡w;RC,ϲ51G̟[x4Q&7;IUC˦=9W#Š]cJ|YS/t !!uH Ј(4+.N(C]]q1nMgģDx~ocq|$zU$+Tr4 { /:duwa0F(m=7HhPcs8zmk2k2N ZIYȸ"J# "ۇQ^´C̭M5f*&l:)L<*{L&DȢA+H]X{&cvt)Zm+VPЋ:uD 'B#](Q[c`6+5b p.NtlRm(ŧG,n$[!J6Ll#|x:[5F|#/2A+68 d:rv$&E Zmufsh{}g {d?O1a "!!O#[4@!:bčb dW" xQP!"HD1&>䣊2MԔ/S?aXBu /Ґ-1w(1{ *uXYQI}"t.`O, ^DׅPpDzoY@y4<,6a|/ f/#o ǿ[o[@"sro؀rHℬl,l07;G@DŽj9$d"EC!_{%k21-!?r_WnGld,rJ \ZߌH!'RR#Gdd@B7BR,3ӵ]Cd]nmSLQ Ț8* )]]BuQ$H,.4'qz d\lǰoIʜdkp/z$ol `A0I{<=|-nُqFmŘ~&7s'%n4㉉,NWb4Ef _}Me~e\{S2#ykhq)bGP6 ԶbĔtpNs2y"hZ -r ^or=D5=$4F~CScȉ/c+]c]Ob$6CY i`b_({98̶[*\?8"1#_|t{)c [Wq5=NɫiR"COa]CFxYՆ \>Mvt͇i|7 {YaM^罾8:.̧WI 8Ety6V 6V(^(!9s+{p/һN`xA>#92kO^rL"2SĢ#wWߚXc"e23|x32w-J'l6< Zh4d2E6Ia{{JB^GUHy677㻇m377wֻmۏ<~o_ԸWRBƪYY]Ay9[/֧Cb0]oD8ȇT\*2}AReq!z`[2݆%<}_7#H5QHocX_hx}0pC"Z=Qi ~ H$S$;(] צYbkEg ]mҊ_p ^NS >MYKiUt/,3VIO%8>XS$Z;߄Ws|a4!׾o0M0\Sl6X;zl G-|e օ2$Jnw7)=,aj4=ôKk0:$ݫ=ݷ]\ '3r ;+&~C&I=.*Qf+$^0yKDb fQn(rĺm-IZ$ BX*8]+PZFF#C'vE(A4mX Q.t =lQ^c^ꛛ 1RIPTl +}=u]a] `2w"H7]g2NӨIh=UH 5OkT*U KCjv@KrIX).l7 jG芄K vS!BBI#Ð?z?LZ eQBd"$0;AL@a=,ou+{ & 1AѲdjY%Z˒òh[&EX H I1 &sUWηp-vki-/˔q=;g芆`Q.., ﰈZ#"CG'ᠢaJAH2 ncO2iW^}'Ceሡ1z|$ΘKK~c(-E21!iE T|W4_'^ٌJQTڲ RmiUD5tk<0tG9#J{yc >=,M^Sw{6IM$l륻DۘuQ cV ,ξzUxƆUc4s'=}nrGkt}Fi~AFd ɍi$M,X0';2CaDNɦS.Ġ(ٝu#Kd>"O'_bs(~:c^S{Li{g<A%v{T\.zL1 !&v:EI9:WѽT,xo_}Jc iM'8#=N9KڵSÜ,FcCtu]04͍.,,T*~Q:;;a˖-<j)%/27X__X,200@2d:t۶7T7j[B֘fj/LTڰӊ7onEݯ"R@,4MX^^8?қA u-26Ma )A2d~Ap-`vg߿ŊM{0n (a6^:͟\9A\D*)t15392!Sy8qܮ vsz(vlbXXqA*tT ܭV1"=!*)NYcJiSM!u[5SS< pJ8My$ %{uށ^*InwZJO[H }uR~$AӴHVʚX%H qE̊XWėtz>Xʏޑ\_=.rLSR4JEoR"bך  Mr,/۴+gk4U}3* 3CRzԪh9D.PuDA]1RRӥ-'Pmj|)(~H3=Kh1 %͡ =T)hb,NI/ӟRullp~v~cKg < u( ^6ɇ!jI[%v%i~\P1Q됁j*# u[oH^}@tOOU臽GsȠ>q8wVwBϓԫxZAQ#]>˵;|wO/[TV$ղP BSTMTE>%$TeU"QiYD1(uIS PE M! }x`iU!P\`m\FR&/oZәEv$_pv4mCKϰXn`䃔McoLX\pE%uAKd~c$pWGe0]4]G,^ڼ-~ggپ I1[wvJ5^$|L;i}\$Ҙq\<ώw.OJ:}FGDGyB*9WC/cN!+,M-:2\l#Ÿy H !p)6lZǷnbii 7j[`WU~эt0 brrx8ɖìdaFP͗ YQإ01ш}E.wc 0crFH# L'ͯWQR:ld@Wu&5-^p B"#Lk G41ZXET-XH_h HkCJӁI'ڒ, IDATT|ik +{R3:~5cmi\5nXohKs"? |d0lYWWWUf<'iS fFF7RVdӐE%HTk l#wTשԫTuS &(N@v_a11e?{(\n~N qbNnsFs[ꄏ3`¦xGϞB| gs5zw{dm";-D$dM3z'ݺ/w'ΐ\==Y^#3kI=Ѽ͈3u!L\~Yig{O?J@60:3ksKcMo-'0ٖ^$uQg5Qdx7ފѾ`X7찺]ʼn՛ c0n0=|ϩ/ded_hg$s axIu8m&j6 A>DI ]B#sp]awMU (˾q N3raVtb>zr ly-Il%URN_#yw]ԻB Eu6:)jO{xqC+m\>Ftx;t9 .@Mꛞ#(gT%^A\G1ET%z yDtz QKő a{U#*Ir1333O^駟Fu,Uk1334 t]y7ļZxbbbjiP(0>>NOOpO%;1662+++bd֜)eYڵ v_u}6Fcx囯u.}qTKloxft;ylzɅ!]o Y[Yw$7N['ڦН!8TFulO7v2-At ]Mc8y8fZ<HED!J۳ZU~[x=de Gw}EEUՆ$ |J&5 ZVӸ.~(=ZߊL"CJ8qDEBNP/%RTG FY:3ptql gqg"TTQps6v ?{dxcS'G VX"Þ}J1{5 0ѴA`{ߚ  F" i:`!bh TȤҗjfF4LkA"lQ*9BE(PQ<O ѸFA)F̀7$,ܸmC#ߦ̚SMPev1e%Xn9@.?O୻:b"0A8)DS2D+5#dà_Я1viJW(zHEAUljdDubFS8h(Q=iԠ H"旨+6FU$fa`8E' IRwD_U0~I+mHU@ CbCD9-)VtA&,8C xbiAL(*@Hx;'(FwFG'@*D<(LςiI]:7O~ўT> 5@,և躤=J,ŏl:H%->yMɹY Ut40WWXk.W&Vȗ4]10D긞F6d{/Xd9 s0?#Q 3f2D1kLwS.ѿm&MxqE; ?2ƶ硾W^nzu6^NؽQτfƟ ^97s>cʉwx9&6ma!|s3\V:I=c tq&'iqeT8?bt=ś10'Nӱi[hv{ ^nn9˙Sp0R'D _$ooPu; \hOruJ|mn1ł7:k£\22s.* ꙽t8yig -b_ߍ>)lk|F|Ѕ13;nM?|ݝfwSmIm,*GTTm&thq{)l ukh0S%A#ՠlPt4W_FݽL#9Op*jn,ΣxkW%ueV,&:Zzm[Ѭw ;~.l`AI˛;1U~dB|*FB !a#Gܰp񸆦B4¦B`(J+duR23!># džA]X]X~ 2D@th<AAE4JS]BetdwF,"j$-#Xvu f5&HִD4M#"j7o$L266@}!&Ν^o[˲6j{ v Ν;GVCJv] ޽ vܨqm}n]]]R8ԡ[@jk.]ի|_IJ,0`Ń <FEQ( KN]E ln%n47!̒GuVb¸QMDveBmx+*مP#ܨ  U4:/oy:#=yBG_?:DN\?N#{p)Qh`t'Y!HA85|Lt|6Tܜmy;"LWfV14D.&M6%;K'//sz$r2X˒}`+ǎgo&Rm?$fP^n 4P#Q-XdnWl;"6(!F/ K HQi& Ym1u&Qࠋ,!"+aH4-W;rQ=H².YLH]Pt%N'½21i>mfk~'в&~AAH4ݸATc:wU$TVc-%()(`4h t+&ǒ0 M"s{Z @Gq(C<3@q""OÌ P"!5A@(*Ptf4<)dciBĈT#nH/5=dd"u&Jxu?,2DFRS5nNZ3a* #ָI`7CDi!Qa9v%&{>ճ:J怢#ZD`WWeai)h\o( d$RG47=??ArdgOAAJ(JF(*5/>3=~| B)PD.7~w5G!d*Ry>EK]M"Pevʬ$Tk>vԪɫ(B $H"bv&fE-Id`z~IVNYQ&M0͐H'0N/r vitM;d;UɎ4=N{.-rc§^\g 3W2ĉm<0[ɢYHd,u:*gB]졸-gFu1k'j$ %g)VrS{ ŎNlYBAw`_!t&3JZ sbk8m\Z(O5,kW.j+85n⠯jl:0y:"շ8du0>ssMvt\/0o ^=̶4Ϣ~`"͞v>ټz^TqΣ5/It M#B<†Mr`O51td@MY#ViC+8{$-4#Jj$p:,QKFd ̼ͪ"^a=~;6Gc!^e$XD. ' ^bSEǗ/*NOxӠ؂& UT d 15iԆ@7 |I&PMnወ " Mb2t²Bu]#?M -Ti "$aZKUH$* 'e 5͈1VG#h"Pa7EЬ}zCX+H`60 Ν;G\ްcj)_:t]vmOuܹիW)Bum1-؄`A|?pnUbtU>kZ-ƺ[ml1-V1h߷Vvg>[n%NF7Ե[it{{n|}\eiiid@rk|~n݌Sߥs7Q%33/~#o]!T5Jq8$TFBFFШ $.ӷgH TW&:"I'M"E VP7"~ t c ,BP&BhjD* 04a)Oo@9^M4# k3uO|ߠKSXOZ[g}_ ڻ?ӛ"6dA$P$9K,-MJ`jAP%͢βme0Cߧ>Wku2)Nӌ ] (5'ww;2q6cȜSol/q}„J#byӘ4h!FfK&DR:5 h]|AZD**aCb[A + &pG qKc6_v$"CMߠBQ5KJ\/ˍzn>l16ڔLUfy<7dv{F.X%#O?6}wķ<5qB\3mRxHf"SL~b=kSdn- s%RPavan(?_D pkJX_!1i֦/ESI/6ȩ#4oS]lg= %fkgx8Шq+0<5?j5r<ɑ%mzqX-;eB6ϙB?΁l;]|E]ͨd }=3?י[pߠÊt"E'Ƽ74pvjױFD1,|HiаGj/Q 3W-xm.IΏPr!vQoͰd\h+-rELiV=t6Sa} {,ײmQk𛕀[E 4`.FuXaмnDTEe0 儎UpyͤO:똁¢Y[ T.yA}$!Iz4RqTz4&oVc@tf죘A>a⨇HI(Mmu.xiD(I|ah(~BxsIqj.jY ԘTu&x﯃m_)%R .0;;K*BQLD4z{{QRidYT*RJ"Ba !6rHNb[`xUn1-Ӱ[wg|$[ t>T[j"gkZ`u}K;-P l6r lj'I6mڄiP0Mvu+WlxU _8sh7PmDY~*avas80j2qǠn O- j![{ؑŀLx9诱pΜ@cO[)#&)lM~eoUTWDyMe x> IGGU~ċB*} DЈ;}]>޶H{Ygzk5 ԻO:!=wO6Rl{0rF0mz0E qΧ_?hp*30ɷKuHt`gHH-N?FN!RJرeXVgQ^v|\cveΜMm4رQZBϕ?aq=Ӯ l\ٌHMdTPqF[K5,chFJטB"+=TuI̻wXo9:f,FuvkTTWj>OV &!Q@L}%$dة4wJ*bonɠ[ ⹀7OÌR}|eltOD+Y IDATp&*ӮA.g!HE1+*&M.NGh my <%:7RjT!q(vSSP j!f M(q/R0W(JdBj!M'MZĚk̬4 ';Z/OOxHR &&IGuo .] HibM:󈍈 uP9 T|F>};mK[)Vx&8u qIJl"!uO#aŒ , ^{|_ssaߗ(HK|A\}uwW}NO'05Ĉ@MJkiejio^ڎle{)Ң(^  f0뮼@fEtDU˗Uv}Ͼn&QDL,5h6TuX"jk\}p:~C e"Ő=:|+Ҍ-"!b 8DC}*"hEbug_PiIX`,>Y!5r䥐=>")i゚{/07I]f <ޜ`fvy('ӻyضנTQjG/m~ebsM{\==/WjMgfK "6ZJ+ ;w2V=.փw2 \>Mjnla{~L3`*x+$cW?:*~їºtıuhF=du:J\ңST7 .ҵkɆDžr?0JcTw,u?I> g}Yyn-WngqZ c|(CcÛp3u6;M:O?= 5y]1% &H(ZI-|$QY< +$զjM%$1IcJT[-*NUJNLZaKZu:-V""2nd'ORrvPDdnT"MDތsOPT1ܠ22aU)T! `PWmUD%_,;򀟰mَ64z~U ۠}Y^^%/^ 62v]_kٵ浠Zf[綼|>kYvmnfq昙uzV2~?QD$EAķ|:{vqO0$tt;i:lc舎ܳ![3J;d7R4&\l١LXoԨ%ud3҆Q*( V'֜IScd@S6ɋ,QJZ 0.-]CgOYd*M?LvJ^t&xOxu1 QHlUa>4JXyRe4&^&ֆf5XKU$= n9KUeL}pUP6û?GyE}&𲢓wm~t ]6% ]OoH|Qy &uw$r<Ɔ=G`|E6Z$17$n2⌤ƗwUN+i4ofԫ:,’ʹ:5\~t] lhݡ msoEEnmgywXmf|-m۶\zl[qzv\ksZC 0$u 7fmm0^h|ﵹ-ގ ѵz(p 3[VZ5iFݤC \K*8Zag2)[˚j@Q[1XVHZЕ<$(kn ? i .y%iSG"1ZA dL," ql*PIH $!Q T#uU)HM @WU-F5H$21 Vj$uPHj>!W{ VDAA1Ј W>>Rƫm !1Hj*DR4r77HXO<ёy@ w濊6XT-z7ٞlYv~={C8O0M~]=';U &ӃTGrQg6 SgL (6* ùW ӣ:\OePCKԳ=%6ٷܙN! |~dB>kn7(|N,\.v-zrFoOvF]TwOp~nhgl{lvS8uJ:@k={}o}bmOꓒ{̧7=0<=6h=ћi>#/QMnb3F/˶uxvmK*뜞inq{kޫt$NQ*P<6 HhI\UKI!A4-H`, X+~Z̲aJZxRFL97#0;cS(*ln ;{rxO1ҹbHG'߉gU%KF[J@?JClLPCF*֠Gd$lj/WQ9l$P"vdGҬeo1;EÅ*JCt|xC:1DgR2a|j y87bvP!y720:]%v Oҫ '1[y(B =ӊ,ǕaT+ ^ÐziaXu]ڮuV^ ۹v9sFQy̵vWƶp0k-%^ H;;̻ FqZ6 .b=khK{Q`-n6xno9۷q" d31^yp$o&iֳҡQ要9Z$+^,֛3sH0~I2tqTW;#Zrsotn5V=r}yyo{KeZ RA*/l?JOW[|9ўPpW4.a@XUб(52U*t4jM'RiԼ &s<ߟ⏾n6KsYf1˦ĩh#-Gi.> U Em3t(bkM.l4hi-lz,oз9ԛclspRIBFIʊlVIu& 젲xg9]PZ\$?υibgŹ8GϮFFe+-ο}\ZaؾUй1飛 V3$-iTY/w&Y8=E IّdQDC565Js2kt=)SҺ܅3r6P;-٤kr6~n_fP`J$ ,wo{7ŵVV Gxvt3Ȳ< 'X/<Ja( 3~2{uRar0b YyA>e0,7Q+oMǷvsaI"ܪW򄱑NC_y-#9֕yp f}n+%x@m 6ɲű1jKF:$JKЛG]PAUt&D͐32x6PġfY(u߭0XZi% 31aAN"Ae|~ç~#"]U.em`&)KHT -{;R*:K &p<]N/9JLY$ibՕ@ X:'1€L.+ԩ1G_xƉg.>Z(rd,9_A?i]q =wcXWOGxh&4$il(|{COO d?Msa~xAMO\H $*+ldtޚF+Wn_Db%/UCk%@u-ȮKno_ ۲l36}q0j;%5Zksp+B"q[}et<ns{lֲkyB-+P.oE"J]q*իLM gpb,ބNDBTdD(5oYt{LJ?/R>Df(hJc(if#Gγ }o]v .cmv%g&7ݠ0l^eT+pXck< bucpړ8CUzl|7^ڋizy6N.3\tX 2#R~HZ/$)C0T]^c䲩`1Y% YmHu;>Qc-F-bդl8y̹E771iId u B85[f{+sg=96([dQ4x44#BUe! .]•:ir8GSЇ1K*50*A,R1tJQCRN GUVz$5D!A> (E dX#6 T+Jаp& YBu _?atG݄O[ITv,pUH8d`,Qdb@+(8l!!Ҙ[]\uS$ U"]ka "cHXK "@IA( IDAT#bP ,P@#L8F*9.1;iJXRı $*@"Ԑ8(p57[:Zl@TbjU8c "5E) R4"a+:uE6D #E <EDc.k\Ye+"VQUhJF3H|WfʟiRudmw{#CޯHn*}N9q,鐞* e*KqtB]}}ΟCѧpNuQ!+_>&?JFwh<벟qΏO=3q!7Os$3Jr3<9h֧7rweMC\ZGq?^e%\:KӶjzLDv =,c:VK " E٠O$H!Uѥ$0kkK-9c?ht-eQ I7L#YIrgG m@D 6D>aZ]]_²3q#ѿl%TX[OPp=G_)s3#_,W>FrWmPd줣L&sbJ%T*ʺ,6압[e֎e%fd2q5MJ-6}mu{a-6'{Xnǁ>s@6S6wJXnN*<ȃP3jL3[޷e6$͗Dbo<0U4ԥ3}$h=bp+)Kw&n$TȍdzAg yts}IE#eџ_%8?¥;Oc(c~Iz咛*#\DmB]>Czܽ3{rq&o']6m 3&f=r?Cͩ|$ u:Aۖ69]fQJ< d]b^ĕr?σ$ԛ-&uW6&ݏHe7`(7Pw%I:no|{lr}&$9!A'Ȗ4u85*Y YS bYM6}:J4݄Ii&vJ4뒖M6>o3%43@1'S:=^M4ɮ}Nt,;!ZTtw`0chI$~U[z@~IG0U5ݤ3rk(!C=}7\Vl*F,P:irE`&/_A(^Ep4Bt$qR3q#(QDnӴ*E+"&^3$2Z0 IdQE/cWË!r U7_L/:yI!BW e$-I(hQLJ3© $RU TT4U'R1 Q(ϕT\aI$PR\И/Z(CU!bA2&h@q,PH-@:XX":tBDl@:H* ncӐ>"%VXYiE%"D6KZI(Dq*PbX(Ą""M!0/F JEh(&D !TAL*H[Lc}0FQ}̆ j!o5US7P翃p->Uk+)B}m\ܶR4d3 /zQg&z~Ȑ׍Kt>p1si/@^sؾ">Y|̳ gpeyo\pT"Ul">gүl` KBL2:;*]w_AWcWx 6)<67P/`N {}\{x#؋9>Xd x}\GzA QمXП/g71Vwl">Pԋ6B:w87i1h7RZ?HdjB>e|f[9KEˏ~a3&>خ n:;^yWnչ17BoiguĞ:Dtk%$Z+D*0`Y' z$_ea}d7|TM` 7$n L мRpkibX81GOc S+9Е@.I%MJYe.Y ئ6bթ>)xAfLUeXm>^LprI^DNE 9~{g䐙YRc=s<o5ԉGp -oG:x¶Q!)qaLSd-JG6qƒbEj~ Έh ͍kSo _Wеb1 6VCCC<j#qL&<^x ޖ=H-W^!s `!*e( z#/1jsxsvy=,z]*\H84 J >WLT`-DttZYA$@e$vV Y]F=8 nF3,Qg?̃:0i:1fh#ǵ Z7 *șl1\a]:fnrlh; 8'GwJhjYoNR 꾎*I}gӟa'A%-ۡ0fpg~WɶnʘΏ4xe͸XuSءf&I;MtEv&\ѪEJrG,mQLԯQM²MMMa>;IbdBEan@#$eUvE+J_/U&op4ayX!HJ-3]f=,i:'f(7ɬ#E$tD:!ce &:sUY>#M;/\Jow7+:$ {vvc|~tY!(ңŹr- Iw:Dʐ1vL&CaEBВZuBˋMd+&HzD&@h%&ḸZ{đDDREb2[->Kg2_;GF_Xi'򿍦%%XѨB*ĊDtPST5qCt5$X\tR@L|c5ǷC*yjn`,!P_ѐQ)REUB"E'V!B0UfXPQR JS B{zl0d HDA#R $} ?( AHT4b5DMSEU&z#5"LP$BI@I"A**(e 'S} )xH I+➽5}7g)u 83*"'l*rrv*Ǯ!.4ԋ,}L?3 sqYG:s'ڄ;?[a'Nރ0qs:x2V~)z\>;s]cN/`V߽MqEE& V."ln=HTcS]bÃw d̜q?MA>OvlOXW@u 6\Ruè;, rqH2Fu֛]) :!ݼg|3/Vi [HT~i&/7*^ƛdSTrGS;ߋewvwfb%=t&[g QWPCz$W9u{&dC۰|6._ai=3OXm;dd ?_d⻩p ~T9{c8HHPQlu Z#yr4-,ek ֖sjmk ڟ'>AWW_phPٷoO=RJos[-Ufٻw/֭c߾}i/u]8q*{n?y\Wv{{Vf{vI,)5jԭղ$K-a3cO831=qČpV/jl(-M@ĎB =߾ЅB#{~eF{=/_9ߧrQ׿uQU#G/ʛo=*ne!moThT[W%&$-Sn(`9IQIZj@ DLxJsCLo2bN-eG~D>hKm ZkqOꬬB&Oz$D2Rh={wVEĆ/\-g8nc|q=٦1jxmN!$;"jFC I$Ո2I|'IJn#v2"!BvCz]2["5=Y!d*/Jtk_X,(Hw@"}՝( ՙ2/,n02ƢEb]|P2oE0mNT=E[a,q.Gŏ*9|Vz`{g%_m2U'5K\\-FʗQ6響JsB y%5z|oprђԦFRj0UZ^A2h5:iu?" 2ea'ȸ*jƤZcٮ@_/JZDDnqtzn! [ttfbs\txϐvG<2[$)2 IB[azy~3Y\Ǭk!Z-XENÛoLs/K{Y4A3]'7b:;:5\B6Hj)KNHۢl@5!mJDFֱ,2Q-Q0WxLݪn(,B5lW@m]w]\QaXQ :HI ǦVosBo r"ъ|JQ Ș9ԾӖ AXh>FEf%}I)wIBEA6"J0d]'l52@ ( & "m`*&7_s+>k%BZ#HȂEzDJDQDB{ O$8HUIuKB B!Fb41&Y%1I"'PiUY^]G&V(RHfPb WyxS IDAT &YI U;p=;KLrI;Έa$ iDAmDq"`1fb7}:y`B'^!qn]geL@H&QHi1RDQY[i7Q#G v=EuIng_ҝe2O"mΠ-9şBC}lv]`Ϗ1k ^F`#5s_;E䷓LMa(:ykD95vL>ؓ6c#j:V$7Ƣ?B5d cBghVؤvPtK i2HA\6I#Ȳ?U+tp#skĪHКYtEg]8T8]$T>bҢ}q7Ĵζes0 1Rmsuݵ %CmPO4,}t6]f^AZZBZu4FkiUf]*x6_)Vb̃Rj\ 4|ЀeQ@5N}i?H%'ddM9/*4A]eAoSfgH[ϢUlRFG,Ӓ/HsRXj<8/sZv-V+ V᫿lքnO]w``1* ׯ_^c&ʫþ}xOlEAUU\׽gUU.Du4McttOONNr-&:uc8 \vzuP`׮]ٳt: 4/^dnnRę3g( <Or5&''Y^^frr!n߾$$i=v>Lbۻt:}m==oE9GRѾ=iDngy}hǒ|jά0y ã=GEIΨ%%L%wi"Pe%TxFz1\m3 M(.*7U5l6@Ol[cn7t/^"<֎[ULĦcӿm+H$LMNT]@jyhAu 49oRe@2\Joe(@tF\ kn>N1H 81FBl #m^$CXFZ2ds3ZicxBhv*~Z EyGIo//H6e2y @g:S.Ps 9FcJ0oHh^Jh#׷ɪͬ`&fS2~=i fl.xiÂm˜ϲ܆ lR޻}Nf[}nKzdޝ=DFaH6hy! { +2YIҪYF. )󈭈梏h$* %4Ʀת$fuŐeR' H%Е' ,"^$,ӝ̳G<^gH"i *j1r+J"1T#$FpED1F4HjDR?Ftw\bED_Z,6U raMq"zzx8.vHΔp"7c]K .`}4˧?3 $g.4H;;t_F::t2rbLAÖkt$SL,"/=wyz-$iľ,DHihR(;!w_m_!DвQ$]ß%v8S9U;"џo]RkOmaDY9OGJ7^F EH*rRh`*!;l_Kd' +` 4B! uɆH qBAP?YVΜOV[˗`vjoK6M*Q-us]gK+3asthr-:eRL9;O$h >f-"&i7hbgc`r8NJ$Ac/E:b]A{{%B|\ӥ*$]T_@%6h/{y ,'qCO(Ԗ4zBzʭ9`l)o _MQi6-4-졈֔I}*M0Rat7H5ؽ[;LʭYS7r*:Jp5}S,G"I\=9Qrne+|{q6t|p)I Y#:ZF:X*H$ѨG}JJ,! *<ҪU厠I<ފL=ͩ޾i(P(TiRHgL[ܕc|}n.1ܮ1*,Yr`@lpVZ$$KEK6ݢd D>6!B#xT\pЎ0eˍ; |-RXCRd %"b6T@bC$#bG3c"-K%-Vi*DԐ4mY_A(\[hQo7Ҙ:0O2mk0[H45D5Wi0V ݾحewnUd2۷nN:ŕ+WeT*i,,,J8vfS8x 'Oݹ5Mŋ$ DQdmmr ;3Kl ړf*Hv'ܐXܸI b@0ս@e-ӧ+PQ%rXlDi‹2#I[5NeghefrW&;$NK_&U[!F-'1/'/?d9}pCE|!B4;?Sɾt}m +qq+UZN Lvq + 21NI*!!!,@J@r&h|,o3@ QB0/Rݞ&;ngs.t8D7cb9+Mz鴕>bw%k=4%u >F4~2tMcVyJYgs9I)zξJ ej[,Uxl-0Ef^`s[?$ԅW`p"{,:#0Of#QGZp vrYQdǩ_XZ˺M#ߌq+ {v UP%X6byDnĜjDʑ9;xks:@'^ktoܭT nnr`r/Iijikv.SJ-"] 3ŠMI-8%6+OW6!i x ?vJIJ,at*fuX%a.b 0E:I.IR|š.I)O,t̢ȃX2R5I2R*f݈RL4^" qIKeA> eeR,4Kn&Dj L!bѬʨWky&q'jTšh=A.+-]LI;T)|C$m2otW i>5At%2|+|V$[S[- @4oΑ#G,ӧOh4$a4 pQv%<^z)N8A&׃\h6[\v/| 8=V;Ja׮]# {bN:::صkgϞe}}zbjj EQ\.Sոr e144DX矧hp9ZT ˲hZZ-yxwj\t'OOcYֽj=>J}=eO.^wd+>m ;)#.l|cyqƙdo~9 T~qC8OΓ%24*nq2qݦexEP=}߽2kJSd1 w}7i?drDhS~[瑹q^2WНy%zc^c?+>;J$SϗKBj~{̇jjkk.*-oXɷXh|7^=N ]o_5c7eri~$)kxX1Y6mK ,l;@+Q!n+d:-'S=Q+bRxm} 2]n'TWIl; ֤ f}n}7hс3hJ{${&sT"7wPtB-T3:M[!e'>u_vj)ިTiCBBڎВBbONAVc{rVO zk3-4J !!&L K\e̺-?֤qQA\C&ͷFOSkӑ rh vrBg~k6f!iz@`clgU±@$fd ̘CoFaՒIVٱQ0qb)@َ"T):4Z2ȣytQ UJ{.i=MS@ӺaIJvt=2rLX$A.S=4*Vhi$|vWTvI,E%PUYlZ~ pVFz5Lݻw3<<;aF2dyyd2Y^^fzzTY,ˢEQ7v"N>z"t"'εid2xꩧ0 9A$d2DQE",y׮]#"8zS/+ 裏rq&&&`uu?2<<)JZ{*(yznTUJV%Cpc4@wqzLgdv^ff=x_pD}%6Ɏ β_bfo.OK]*c?d&DuOMxˬ1#p ׆-G+Y}7GX3lyȤ Xie.Nܕ/̳vꤎ6p=Elm~Csb㝬}P0.BPbf;Ђͷ|qWf;j75NćN[\?;^ZcM% عT7$kyz0HSM+1+)$'K, ܜ941o^a2!`.Ƭũv;j%@%g!6q@cx0`$¦YGc:G8==5m[l(2BcVs=ۏQNSɴa5D՘PuV4יk.{RtV$$@ <ʄLowpSdMRimeXZn+_^ų-EѓhMC*$%Lòi zW`3 cb[|zI H RK"||!V$]ZoO3 3xT'B( " 2aa7-̌di:~Pr@cXP% n2&vTGu\QD]H'T=b5O &ac2N";(E2LbP\ɱ# IDATGLLC;؁H JpǦ  %Ξn~0x"W%c$3 m~^i?qv*0Fb(CDB- K;r.E;svXD9q3o|3f\ &iǟ"ݷܚ€B=c 1/Ɵ(* 7.|k2\̣B>s?+?!f̩s#WҕV'cE4,dNHnuAN!B EB"#cXX!&Y ``Rj7cm7B &ZauaqX?}z nW/mtYf#hѠٹi8z`|Ѿ2Y4tXw>Τ&OϓSdKFʴ4qnaK{-Q#ƺUWVX:v6GP50?`T&m}1 X#8Ϯ$G#O*3m ENչOn4ȳ<Wq3+<1e7JM:^0{Oq5#3LHBAinIΞRF REN1G1E\3Ka>bQM 3~%+29ͳ3q=?D"nņ'Z E,+F TP vʒ@Zmq-`CW%C&ވ…uF)p}֕&`!l V[:=ȁI(T[B`6l4cn|I23nѥ- 6oe,c(YѫNQh$$5i 8LV!W3*FdݠQpd)#ȚЭ8D.:a2j2 YPa`18DA׉vb8]]q1U[%tp4DCBAE@v{fEMCI mPod35d~~Y\Uޚ$e*nM^iUUeppC8Ν\.!}}}X맞zL&op')bzz Ðt:́8|0?0V!,+++T*{߾Ν;DKa,..r)Μ9CBQ0 jJ\ftt۷cmܸqt:M?SSSl۶z{{1M8yy뭷8q{βJ`~~ +4k̪P4kt ۱ԒI%gVUh"F;1Y>lhC+ #f$[j6n (ByY3o^łlbzʛ7򚓑uIٷo|Q'{iljD"d2gI+>s3Gz_#I/\l F<=E̥-.h.rj`.+]#StHNS G#xqcm )!z,CܜSYѱ x i%JǚYzw߽s=uʾgݞyַfBri_H5u;UEK ܼ?'%hrH/ćI{j>ȧˬ}?:],LGVէxd[=bws $׉>OYjȜ\fgRqcn/kL_`(b.ǂ0w[O i9="GX,+8o,UiB9uw!`14,PG}T]lXykl,VUhJzRm0D} VmdQZ㽱˔u+KG,Mdf*n@StSS*PDSU"<3>P3 EJK{㊘e6ۉixD&qsboH_g˞9b2nyp4~MŴ,>8yJdDσ<}NYpIgD^z1R.3Ǧ@v{B>Ο(b8J4({tPTALt3 dL[@p,;s4XECҰd/"u,+dQ,EFİEKIiˊ2xDlaCe+!h,`^WGRCHƑè, n#Xaʞؾ(%h*K<[_%㍟k}K=$a x\GsWk>3g~Ap!#u{"I ] @1LDʓ8,M+hIuvѱ(J[KÔe>:>AQ]{mohmqJ&z}A(g`$q߃l^U5_mczI7h8 a`hk{E]\+^&i u6{~leK?9!GiOs l2l|Hd',>ϓ5z<"qRKI>M3;hѝlgaO}8u9gђ>ō;< 1tǟ٢Z8ΙBpHbZ+2u`Y i;"ҜL3s;Ҵm}ped˃d|E 2gh|˽_M҃' j}FOJSwwdM`<"ܿcOOrsQ&k.ww! mOȕ;\bW8 TYѮ=lPKUBO|(3+,<͕v0.U\p&c.M.R~:% &kBq=Xp%ZM+ KidDA(* Yy?[Q"x?>Iڂj'֡#5UTKGF#ZE\Pw3 x\BVZ Y 05A RE[R4OՊEJ #LM }l 2)ü(h#F\e=Y2llt`{UfF(p _y_$~ /hj`,8~9u333XE8&8]]]l۶ׯs{`l&+Ͳ'PUǃP(Pu/r!o |>~a9¥K^x 8y$BbHP`iis!=000@P\.oA$ѣLMMqE"cccNF{Y)qwG9z|Ǵ2!Ȟmŗ},F3_9$xXK_er=z'ڏ:4~V*zCD piKz;o]e3u`$Wؒt9)h}ame ty~xo~N[_X/% w/2aG÷9!kVShNb;k:wb<_I~08Vs۰"'y \&^&S$  s&M v/N]xwyn=An M’Ol:tt1㎽/AɍH B0xQa&b^V֘.9@=I0D}A\9W0t Uq, ESl|u ]QM OmTS zV԰JW\KA4.pHD%䪈 *h CsQPV_)߻8+AFv&Ҕz^^})L_G~ס\nd&ȴrr> uJFR 0:)E(1-DTdp@mI!"`VKSQ$bc[c'ڰHy 7-~}e؊Qڬ( .^ťjoË)W,&V`Y_CCƖMQ%Ρ˙P{\v6hi_d|iCw}w#O<"=Q`Hìz$?>M8 P]P#z8  ex][tRhq]!`"2sg% u!zE 2ٲU u;'\^s$Oz䓌lɭ[oU,T!^F@Z(e\ۃcp߸H rPDAQ,[mpzOpqk}UJ)B?+ĵz (q~Hp*ȳǙL6 ;lMЪ)XX.cX* %5J0Xqgwtˇ]#=d"kнBV7m&?I G0>ȶ+,=lp"a!$[zHrwjZRȹu"%]*95v5bETX 9)P0suʵ3N!$ HbjOtƄGLR-XT|Q"IiINXmV%X́X,YB$E/k9/q3>*R >"d=e-!7-R)'w/#63m* 6z8WMޜA<44Ğ={( \vl6$Iǩ޽'O1MmA~j۷os5I$~fffNݧz>rL&|f/ƫݻw.ݙLl6˥Kغu+G!L/+9x Ǐ׷\(lٲoV뺎iA cMfWyӸk{W7U\MIGs4ù-[ tHq˗f8%/o:fy%KOk,TL)$$qpmAyo5 ,PXfEiژjS,\c .b8Egc^.1Cy>]5¹;dzub7){|dӿ`>QC7 'a2wy 6$qzHb>Jga,n-gAy?S!/0}+Npgi*mLtXg ߻ tiNw+fypwAUxh}{^n&Q| wF næ+fS]8N#Db2j8DITJf2vEr-A$æۋs<5FCF nђ(S-( =Լ: Ϧ0ZBBR$q/͎V#Oy&qc҃#$NƜU\AM@+yqdݱP\Cu߇'{ģXUEo+#orZr:F=C&3Nn!s&WnO>?%ҷ'XAS$&*-f5 :[!"!" 6m  BGFATK]0Qlt,IٱJU`(Duװ߽o7__,ˎѐP:.jа-xM5qME1+ :,:". DY4@x59߷N^L^8C=sC=jf; ~Df{K_ g~ >mK7͙oOT`(Q3] 2 SXsq@=wSI$CêVuvpp Bdq!ȅv>gh.05,fÖqqe0-u._Wػc+Ŀw0 n89/A|`WI"5Dkn, `l `  AT$\APDK@~bbw'P~kK&:\&n{tK*%x 8rbN/4 #O_yzz-DJ0j^vm, @G3OzD7|lƞ k&}5e·V8+GXEAͯ}G;12Qo;(S_AJa(:܌01drL,e84ObѢE$`Fpo.?eD`ShrΤm|;}NF;Jt OuP0^[ǰc)EMGÌĻYbmk\mp54OEy"3ư%'#,&&vRZ#gX~C(g 7(O)緍#p)쬀ש9d5F̩Z$ [6_jΡмN\sl\!ż\F[E!X[mx5yX xFB@i%76Dlq5 2! ` טeu0j1t>sO"ti4O>$T*{[.ݓM@CPȏN0{5 /"GYBMx9jTQve 4 6_T4U $Z}ke$Fԃ`uj8şڄCI+T!b,++~ \/'vc=鍳"8C m IDATR e0~ =HhX] uvV]-Ӛ<ğ"e6ٍm ,)0-@UlA)UJedAmQE.+~dWe]UW.. uDkG7j>}ׅ _/ oE~>vt % B}:|G 0Om>l'? ~pL3Нۅm{=ʰVU(O)| 6x*Xt$ SDh޿yAH͓Ak|h ComC?y>tN+/> PH K__K~6Xv\Av14vn:gܹʾ8v6U[-.]W`}]|Cn6^Yt VY*B5xۯt Ax;U(=1پd ˼q)1)ں{箩#7{cO6gO Q %"1e[бhM *,# 8 H,Hخ$# Vi_s0 .A&3x/Xks|+QLHa~e)[dM|pz}gv05|6 ~W#L z31%ځFڄ;Kc% -(Nh]R )]gTW. "Q"xgUJc=}2n&ݬxpo4V,~yw_U޻&]?TAvm ffs`H#)m1tW͏a)2; x%kQ:!>hDꍝD*Muz*~/ƘR+H\00xa * l˻Xl4| $|3 ]"r>I͊*ȑJE5˸wx^l!A ȮBSdWi[T<~%'"vTFS;/ayT#tY8aRT 1Ӑm&@cN CR!,RS(5X0g1L"U)y *{"SiU 0H?s7MӼןmS~6MP(D4N:E6u]ZZZQo۶&vA `zz^rkk+~EQ8|0/RVuRtX[[öm!Nm6(Yd2^ʹsxꩧزe :ַj8pp8L__t}syΞ=˗emmRt5͛Ȳ́X^^ԩSJؽ{7G_^s:::رc$z=@(UU7Y֛ 3ds]}U]m(\?SG潬竄#CXhOd % zhf^1]H=L2B`vsQ\ΰf33!.:iSs?K[d˔<YtJ_D%/rxӏLRh=̤d%M-E^$d3l#te'$#&7d**nBXC7K]&V e҂w+Y_{Yr-RLqɮɲ)2syc#ybƁH~Wd}4a*%;<4k~e =6^}Ì汎ź;ai( @hhĎtcu].X6(ēyMnA,"9 Nh 3co nqpiчwawb]fͪ.5މLu qw++2nT4U;@'k*0d_+6=!z'ZvOGKb?`VeMHDDà!*?Z9G)BUx ̻R.~A@8[*%ax@m,$T r<ˡdN8ɾm2P]ڀc /0bw B: ;@Klo­i[TrWU݄44L_po{_AiWAa~U@* L;^s90?9IW!݀7>&7i?/!_DП&x <^?x* Ʊ  f@&珰*|ahK ot^> gG r ©Е Ge[?㟂KG\|x''3Mm}v0<ůED[q%*b.*a .""">ŴmlWvl$D$A²mP! cAvݙ6^yACKHG 9ӳRE)l_t 4عQ ŬB~NH+3{}Et`qp2NwWϟHW{n+Iew/{x晏ಎ4pǃn]W/ ؖײQpEy3?-H†ڸ8آ8,]J%cTF3x{Hop_.0lb7X.!~ZeILHϓo]f!sMJB)29am1iEgɿd G4ܢ7y+J3Xl'ӻHEօB,{,Ӷ^BuV3w+ܕ ]v<ءx2&FǛ-d ]u)a7ZDV92GJ(08&$ﮒ ;tDl "FHtTXjiXy6j3#j( c#Ѫj_a:3"rϣD/ҹPw&Ȏ)C.@x:kwyyԊMzpmsM/ο& \X/KǓ]h 61nQc%R4)#yAU]񒟫Iu%]G e -LӬFVY$[dyqU\c>wF-F‰!i(@?΄rL]I: by_M^eʎ  1@])Q[,.vI`TYC^AɣQ Ma*V8 !jp&Ĝ?HM&j;nz"KΓdc(/z{CTضr`©_w]M~~M$^&D' ܹs^skk+DT*uoԁؿ? |!ѿS9/mVTd2޽{9z(H{;W_}JroFikk#r9|K @8Їx駩댎r5Ξ= i211A__###ky};X|SxU[`ߐf$Q3ǁ`? L|os.G, |1*i?TDS7>^{52z103I1\fMP+/K(ROge)H;&00F~Y&R):w3נv424=ިOrX-!I!+px 85?JyPc8鿀W_㟇> ⻫/4 Cmpnz[߅}`%/vc{`6;­9PU9  ]0˅muxxm0Al#ů ƔU$EF!(@/#lK 9 6HHDqގb56,QTʃuJyշ@Se;sC6 5c `z3[{4c9%a*՘qETr+N Dk-pjl3Xg.s5c׸GKYZ_0wRmqktṮr)s!?锏L^&\`x$Py]U=8wNFS_e^'Jʑ B Y|i,VƭQVl3 5k8"y nFI"p^”!LǨr NM)i=`oͳ>f 5Z|:Oaߤ-h7r~h SЃAwίa#^l.Ҵ{ݵNRZ؝)P57ݏU2΅4 62ILݒ@uq/1lL&u; cyk.S[IDCS'^*|6FIx]TJJ5X>@"AM>'#FN@PeDbNBWK%.nŘrՍ'D{g~E¢߯9CʢbRZ;*hQ#U&-VzU`1a1z]ס$pxG/@!rRoF9z|9Dޖdp͢6_97ؘzfoo}XM|U\ν &PT#FIH疰d#%r3BHGWEjܕ退)]d,9 ِBZ!QP U kD4sU#""HX"_׎2E(M 6"tӋHu0,ȏj -&IZlあK08 /˕2O8Wq ?Fxj:ikoIĻwtξW4 xH:΃}s.AUG04$Om|3Mؼ2QtT]D*,H:JId-/X6CDY/T@/+! iaMDE 훸!;y/ŷIAl=LO&kûo® p3xZɢSo5=>G{f%9mѰ$N&H/+z2aI2|Pܼ~:rt_S=i"M?v'>k-K1g].ųN`H`&a K·k͟(,K{s<CiΞ VqzΏݠ|{!G;nJFl֩]8+< paPݝk۩ jLM^ ;fy,=T g8h]&Q.cR>5b͡#LM7R2m4ܞcaR>Otp.rVcg!0E3u;uZr0PsK.̕c֪R^~PLTwQbŞ * }}3rHZE'J*Ow!>Grlgm0yRSz}iqCkqZn^÷tQc83Px᧷YL?%ƚ4!6"#.G9~iZ6!Qq+/-vHߒޚj qbd;'44C5Y샽M9L&Ӗd2m1]]]:t^~m) NSSNEQZ$Hp}E2ӒH$[VV@ DH$A8{,ǎT*mAFGGy B[n .\۷I]]f.]D,X,f1TWW TTTp&&&8y$Li▫&l4inn!f27.6 1[ͱecv8wN_qxmݻ ~QGpZ`ǞUj|^ϽD2='CgѽT?B;@5.](5o>wq|Dm'Ꮹ\}Uy4}6&;kIC/1{.Ɩ{jZRD{'y?vV{#2=u5VP382_KĒT*aT$}2YyWMKzʖiL:6ަ8µRϱ3;Xc};?l.ܲ:ofP?MI?()c~{o~5(|VIp_a?@( -u'!dXsUTUU׮ߠ &oHsdY 9u %Xd5!hC2F#+F̶ v1%NV]vԜkw%ָeU+;Md*/>*'0T}Hq;/TSx h"]?mWsR L5Xuk%&5-8יu*uk+1;n?cip"*N;Xkç1<D%5Տ x]0 rbc|Hݝӵȋ2m.;-8I0{~m 4=H5Up+o֡)k;@B3ƭQ}8Y%g'B4PiO;a M/'2{h;Lu$ !o=_G> ppN߀2kR &kFztc*ChT?jx`Bxg HfY0%,y6(j$$E4  H"肀.ʸ 6nI))P*5:)WavZq $N{}?Dž0ƚ]2#D̢Fv5T]IhnשL2* *p}"_oxKAtnhw~R#mj;d (i W6['i+Pb7y%Y-PA _oB;SqGeg-INeD9ŶRx\.aM "ds77A$IȲLMM ;w$p5ǷrijjaXX^^&q!***d2ٳ/K/D@hKK 8N̵6r룧ŮEv;---,,,[o@P>Y$ b6$ї/_vsoΕ+W$I\x9mfJvh7nIkk+--->|y(BEQPeyL},YMy}L?G <>q /yE>奲ӊxeNy6k"i=~+sQ\rEiUZbOQ0_Y"ݼLU.GѮ&Gp4uu&?{ku Ho@89Իu(yq[r5b%7i>rc[;+8cgaI JrC&D&%A?@/|NWIt3H"HO[p~l>nYyDM!)muiwp6֏p\ԩOy) \a*Mw0F6@)[x2:ċ9K".zG"ҧWH,FYss8HzCuW6tHF7`.XԱnJ.S˒u4E#K3URdSQs&h@e^ rDԙ'eT2Ř0%+8rx JCAep E֤D3('SʒTt}a®@-٩j!QȰ1ύLRqSjhP TɊI{Tua1 'ڧtUS :d)VY3"#혊R M"S47kt QM^_g"b  E ɒ!Dr~ Mc  RFnva-$ كZJbTO H5鄥)ЕBb:lpa!Exh(dte2#py ۿ{1rO^:7om]_ L]鄛+(K{:.|ceoa:}™2UNw>5.~{FV}lm>]-O?vgYr}64TAΏ >i}?>GwONɛf9 m8 8>{{ʇ?|;)5SCG]"*l9^?9鲜PyOL  ?<:e@MBtPM/I".! *$M%.JlJ#}gehEEeG@*qA.5'GFlOWјHBC6Ity Xc5f\A4b'y-\&{un(T/rĹ jNXӏ?ȨS'I}ISGftxy]12qÈZG`䕷^Ǟ{ :*psBu*lFJCJA5ypȒ* hzy.@ (@.n`s*ImcVBIHAf1TӬnGx6-0זT6ӘA䦎bHURqۻtURO3$jAw['nlGHa_ؠpH?UQa\1mV'1,[o *R|ΫlD, $$"sd.o7\OPĪqc\}Ă zzʈ}5OnD#c8 5761_@m(wd2;;Ms9o#]K_;<-Xc@(`8C@qUQ%b˰ְ6}9vKݓBrm Vmm}׭mȶvImȮlikv>l.;c'kZb4`"tw?KZVfX=. IDATo/90DUS\wE[pҐs3;F}j#b(AmY!n$p*3<)ؚz;\v(#U5'+XF%JzM#'badэsDr(|Ea>߼4T8eqކ]ٻPb$^[ӵfNy\d0Rrcv^5 [ wv'-6.9 ߹F:Pjcvgyè+Um@̔PˎgAޡa:7Bbo=CגS2}B-  >.295Ϙfn~8jhTd2\zU$Id2а4* b1N<U(xW8{,px $vwwcL&4 Ų5bdښ 7ֺ|p5I .|3Tz8h=K푻91q> _O_öSy݌3NU`Ycg`H U3YO%"jԫ{Yp!fRpMVߦ-_A:{~~Q1Ǧfsx D0̱kst2Fٗ_!zOݔHi~W528ȁub<> 7u6Qy=Z(uɓĬv7 M!rz{QZ |}Mf%nmX6f ׳fcg0|<ѝORqވҼgfnXTt9<KrF`Fb!֏N}%cD"+P* o$ :Bֆ3%GF#T4$5X.L"M6ba*/rj5 SA-?{wJhaWӈ3ש9Y p{vƅXJ='8e Bօ^ʀ\tSa|^;=MA&s }7ׯq,FьL1[D0X>hk@) EHC[#̟21#/Q嗐FSild@/H&E(ZKH%E2Q|:D'$ x4n%T@ȐKptVl iB}#``ȗHjHF3E$Lo? 2lx` u 7 9uJX^28>tU6uHmY@zhBbioR٨W{.K/-6[:ʤ_ /A_OYn?#2lkB*a| j %a>Vf`'3O|~ixt׿J4/KpW' ]2/?&+fagl$ s+w0>\ާ~Ƚ&a#S6 =Axj@[/b޿]>,q.cPW[3Vo…4͐?+7 (C?Y_ (/4:J@r,K":,c( h*耆Zh3;k7E YUzN}&2M̬W1X_gX0#2GS3hҬN6k kD~]byD`iUG@$kX;=#7Ϡ%DQ&wO~=wjpa2 RIŢ xXV9\jdinԸ;`go)yUj:HNV(05 bKda8Bk>rvP`F"#::dJ9-4UCRUT]EglAACel4 dM_!B۸w1PTj( zdMWi떨W1Oqf{=Dƺh$F0p&|cK,Le|j̎9~'aun&^c=k Aia_do=t]6`YB:r-HPbe>+Mּܝ!9LW`i։m%nPye·(Qm$3}[{{vY$#yAP)MTkx;wS܌i^Ƶ#hѳ_B[A:|g6 8q ~ۻmѲlѤI1HÐ09c08hs~h|Ǖo_ xը_{]}S7)I+tHv/iP$6|e |,l/o80Xy—T}kp}0+R3c%" /-~8ji3qFғ4y/^Qa[| S~/g(h1dw5cS;.# WԽK46&Tn4*f$C"K [{4׀]kkZ5RQصk`'Or…u6: Q__E!ϯi&2==ʣ50V_wܱ.EH$B,[_K:… ĐɛðOB!EA4vdr3x"W^j-5M[6P ZOXlLOO300@ss39rH$:˭:|\.㡡a}5zyccmClIJGsLxJk y fJOWG(7'o=B%n⽷(kϣ[Y+-!ޏ]`t[6򨺀V~ŢU-pͷ~3QoAj 89J^gTⷫwk$j@Dua*źDQN[\&ՎpK58%n7Uf=B\fV&i޺ sک4˕V V$dNPy׃O7_قځgaX\XՉβ!rx猓h@\$ ]PBjQH*)UE,\HJ[9+I.-ʬ K1عz XL~eطRfscxr>XI/A}yk}?9^fl?o SV,z\E.BV GC }D pxKM`28k`:X\h)| AHAנTk DT+^CW|Q1٤ɔi I"%D4tSYCU," Yr§U{vyS I6Iw#>)W /$Pʃ ;5[qv'> +2ZQFd65JB\&%J J$kM5i ap  MW0 4%&ͻWy #+qzUfɫkpoowU fj9hH{..ן{ٻ=ȷdFD,yBAfh+D0t+:NIDٔ(:$ `" "f9rR(>myJo]&A82u%BXuk&|yW}1yR-?Z.?+'h,rNw\k!2bZri*[(K,/;dtg l۸s8!s q2laȻ(Im)mj2Οbg}zi &?s`?xFU~^kqr2W•ss&w܅esŝ̰=J3,'hzM*2_${j%fpn(yC꼝"yM7Ad W,|λo(/ۖ LQ—i+kvGMfsb7*pbWa6,4һu[销kVVndT5(㛕Tmv{= y4Ps7a WTpcɞm5W&s \vzPF:jRCu6+b2gݍ4$X;WȖG9f@Ī>',(wTxp :]izm3"\#. -IlBp3L?W"KRK5t̞Qst׀֧w [,P(pE"c۩%u\.G]]>BŊ: _{L$ZZZ8rVWR]]i5s餧&&&ZgxY*ksʲXmXhhhTn4r>}۶m#N%}XZ&kXԸYrv.aoD\ (8+V984#[bK6IH !uQτhC B㚂h@,]ɶ#l|->ʃrm=Ȃ?>=4+WQ*ki;qvw3>/ĝb=@a 7d;[~Ɏ%bTQr]ß7?9*x=@MZc}ɾDTj YD,.ԅ 4fƩ$wS%MT!FqDc> r9U0Bo, {RȎF9Sb$͕lY&?Ho+Q *Uƕ 2B KƜg@=e8(yr4kVf(H(Nn#D v|fUIC)Yɤ8rjҖLS!f[d+&}xS߄Vl" ܁ CӉDҔ+x܍zZ3T wf3O(duQ|%x ɯ!5d9,̓T؉"mĴH~#iL-dò:?E댝r|p#^It&N31?Nb,;:Ɍ (+i}Irrw UP<]pZ\LF BʢYnXq:'P,t ML 4))5xmu7AtF@"Yf&'!y}:af8{vn<\ xcx`K{ %x e}vAwC[ur̦ [_](@sL ܧa^83Ty:=m3Z= Ge m@G-8as,g_db0Ʀ??zlXr+U?ơ2wnzܾ,XB5eFr@* Z>8#f1EUQG4ˡZ *"bE@0 l f E4" ظg?z^qVرE^:0 fP(L.hY7oٻQSgdm\=c:`פS(,H$ I&U:t+_|A,# ry[px5P"N tCCtɰ«|W'_Nuv6peOMBY*:A+&?o}v|>?!PUC0L(*+X5 15 E,IiRy$KLg$4v;BS25:,C%(=%:{ mS_9J͗Z"X}%g5;!U ёf44uo( wSiiʕj?BTE*^oN!SViq XʤhP/ 1R:bUqwFCҜl f/F[ui/#&[y)[K ]~,B\8d]wd __ƴ}{$v=i%g^R r*l ]0~;,YU{e"Tc| ]{7hVijkXZLlй( {*>2$60&HU?ANb [{upW ">m}DDDs#ea`-6ȕG|QJ7F loh}@&"MARa.7w#6{;n.DY*^a}?ON0!th2L^p㯰M-%XTE?ef԰x=S5zrx"{%^愀d+XbOCɂQS08BceǖY`i( tqU;;[padBЬ䙬k L ,zi6ZB2 xn vj[3=Ƹ!c挝W7q5aHӴO< GG$t;?9Oz}v;444p1Iee%r;y,//3999[+"N>2 /"A2 ]0׵`}5fXnnC1???֭[y衇|;曼b H$ފ`ijjbBZR:\.m8躾qH$>iqseڵ9a]e~T,Pva# mT$V!YlclL/qm .ɤm.y*2/lOYR$tVRq=պȆCR9`rA6ϝ[ Q IDAT  "{lL8u ѼoR}opSytH Oٿ)ba˶MTd$>l5b.y{E*f:^;c E:nqVPd~y*E27p_]6rqSFhvu,#˄~j^%׺wI&_+e?/›`g`gl+";p837bf8;%s{KAmWaZӑ2P^ߡypsgʁbzΎ`sk*t_]D' ]vٿ}p NOB{=5ٲ+{eeF2&t*?dƿ`rS```( UADGuc ,8dml^x: G<`P;bK?dsVZFk^^BV&(V!VkטZ1}"tsn$t5l'-m!suh(W:R4{vrCj!OA*yWfee-DբRu{6cm,3z\&3A4 0NB p"PM#j%s7JM%n{-_cv^O7`ӵt: u鴪P__i8Nrwq6LMMNSOcc#A^x"]]]RdF{{x (޼ޛY5@hjj۷333Ûo iڊP__Ϸmz{{9~8ccc,//Jn4Al޽{'wM],bxxVB?bq={vt:k2Ooyk~#6*hzw=¯?!;$"{.R8XES栛C=#jP7ϲ]56wp9gCߧsDqCU+BܰwcqvͨwтG嘃f `ur^,{ DgPu;=~xt{{Z`A@܊<TSĮ<' rj GZ ӣXJVlA&/_<_b Xڨ9<ƾ 9Qy7G"wavt3/A̦PaE'ܜ $nCF>zǷ>JVvzW0063QSRZ%jєJ,fLpd"S:P:,D@ITjIBlyL*ٜlfbKF'(I] J$ZDwH/E5Dc$K94'iJ/bTȋhT$ ,"ʵ\;zO.j}2RURHٸcux-.@Wg Ns'Q~~ă_씴C/E0yRU+I3ӏPهWT;32.$jPl\_ ~àM3_HN̘a|`?T&~P+/娫XqxsHҰw u``o=09-p}o<˝ʪ Qe(R&Cm};;Ssph#/B9I{S7ln3%xPe8W`ZX4s~,k~}Rt7`;(f5cҌbu:tUXt|-I8Tuf)jtTFFKRĨTpq1ZX^*KTb%8-%ܮzIB)To8vJ S3ՈiZ!~/,NYr=-9;N7UB"f`A[*RqI]Ӏds]X5s=h!J'f/*|}8׋mK^lhd (iw)ۇr7vvl)X2:SS r߇m i$8!v" r|˞"` ||󴗅B/{,^c{IɅ0NqF!xea<)glTV0?}hMFH8óť+uVlyUG$ ^2h4RAs-/W,P4Ec{Z18.bJֺЇ7c6TDIUCR[db7  KAoЙq&+r%^:{#r58>?z1K'|0_E^xشixͶ`OUUD"uYWWGSS`GyS].wӻ5༶ֵ:&y'9<199Ʌ X΁غu+kxMM PA.\@*ZkiruvСC444cL&o P|y|>pf),˨,˷0k굱R'8QN=\V1;CMlo H\Jj0Zɴއ./bO#մ'UYHPs3o=eUNpW /cr/?`S*WpVt$TDM?jiIU7Ʊ: n< /p^{{ э ޸1@5fg'qWG8N8 *!uIlV)կ h8T^N\bS:byލ-Q vl[?uI(cAL.S/HE,8^0p%Ǚ3\GĴKx&UbnfhV9D"<.>۸(45UESbj6T՞8yэ.M/`AN!t"*VD%&mJFE\4&@S 6CI"CF1:݂"xR*XDCT1  D1rfQ*L\ sJ>O :ŸIߵItP[ XᢦƍiYK|}wh N^&#W)$sL7'+G6(\>Y`*[4zj(Y |1K:Cc=la**鏆 m]#̞Cvި@0hĭz|f>\5~4FдchY}VD7[-x3zW'^zVBd -v\B'kppâ0u5eA_[Yk“ϗAgѬ 7V`5/5exO4?__)w#o/Kk}0^=w ßtD˫e/`A'#$Oo< 5ePwkeűrbb2H#=ʩSo /tt$8`2^-1R= )RY 4ԟsd9 rsKSvE0ɍ,h2^R>yG*!v⪝hvGviB-01B_E_{\$ڭQ/D 5J,fK" M3]W-%|qƆ9/fQF\L/sP$SrJbƟ\5<(86JTW5H_'.*^@ө?!dBx!&I&iJj -YZ!( 9ViBC<!el쒈 .ϒ6 ZYH$WQ~nDX@=mo&\bv0a1v&Ewzݧ||(m%4V5*{瘮AlɌ01bEj \{O523RDϑ^/cC^AțڪeGrd૵㛙ϓӲR~WWW'Pg2L&\e]BNWWRyꩧxWjb8DQ fмvZC<\r])JR)=J2GeӦMN.Z[[o0yN[kv-n/B!zcL$Ygom0]k]O˰ ,kBC"EEM{}a*+fjUD`0^UwfVZY%`@UMQisRǪTog46Gc'jWW]+dw8E?â^PP)edaIT)x[QӹʙHD59JxddΏ`I-hyƘK`*VՂC4H %IN(Xd򪉽$K4`U$P:yY`U(3Q]U9ӓ5Aa$B"l`c? 6'SU bt`4] HD6[7~TA"eH7`6 `)w{]" IDATZoVam#ܶs`4 CIx|^CaTpu04[1ͅÇyA숧3*~(@3@~nؒ'b28ضhY" *3QA֨OXWCߐʮ,XwXAU/ sanɤ2CO.1` ^Oʬ:̓~3/~ Yp5qqq\ٻe+ : ]I\{G?.P[g2~BUu p%}ȡs7W]upŋ\ʊ5v;O3::s),{Xb)D- G <;FfbZD(8sF#k{QRw ŔOEUki8P/LK<$"[DFTPW^r`PӢȪY?%aW`,z%QsVch-K"2AYDiYʤ\&xJcP2L .D\C(N3kZdˤuet7HqPREجE@Pf +.Rv?ZM MR?ጟY"]=dD$!A Һ^&\y3 mu4jH.04@{wQ"Fyٗ6ttGi+ >)ӖAsPd,h>ҩ0qcEOIaDO$Mu-ト!q6ŮI&KofHWG`tBhQ|5ͻm"C !i!UB(\'g=7ΧDb>q܈?O(aMC|M6QDyzDC&xm55HVҞ9s1%b`&y&vj]~fz~YK#r8G 4wgЎɄ =&ce"mrf6%@nmϒu:ԝ3Aw'ޗM%IjėhhuX>8tN#K둝a) 1kfOgT*&~ʶL{HJW̓ +ߖb ϋT Ȑw#hQ&Ot̘J4-Ys2)0esg-/hbr6v{N7@y $IN>ͳ>%@:<{!ϳ}v֯_Ouu5X`0x)Vka|>۶mcffP>qĥ,{ [lZЮ,^h!9M:U1 B9q2VZa$sRN;RGUfn 9OҺLBY '"urTbT >WFkhYSYQOQjR34uQv9zWi3ĄQnXM }֥(ːTBSn8:Mq.(zʥ *ȤϢ\6Utdt3q$-ʆ$FS@qM@e:޷S٫o`Umy&‰W%ZKY])LSkR)ocWA$Pa6bEMFH,MҊPcVڄ&;yټ aM \QuұdIP\S);""88)#*`)O(J#%f":H! Ӽ6Ա9lYBAFmTd|Q\*Z"ASLT=JYqٌDd;1!j/p-zȦ%`!V-o1JaeNr,/<3,:l0&5HZD1O2." (\q>壾YaUN8^ QR2ic.JmyxjJ(UI)`y',8>uxkuΜҨ5n16fůq2*Q~N.&QH75R_L`ɚ"_WI8MxY(΁ԁB~"dǠp>{, qH'3뽵Ӈ`5ܠgFu Q/"vp kW|n V7igzi З5ܺ tuЕExoua>y-|p-SYx? !v謂o@cZe(u<7=gAOn-O +o\F/!San>eO<<b7=U1C[?yYBT>[˪#6`b "c 6-I- e!Ea| tm+ bo{2`7JS9wql lpaZ;n97/|᫜;5WѾ !亴’6BE$D܋d .c 2U m\\%ѹŰ|oFt K45~6T†eH6?\i/=l~˝w٬ rq#z*c" y݇ٴz#U Y ϢA6!ZQa "9ED&("E}-np)fœY#+BlTX]{ ֬eryXPU,0+ aQ?FXa6F;!ZO!DK&YD!U>&LEA~ӡ7#D 6Н,pzʇi)*1-)|ajZ?Z]5SUDUR.SL!MXk%&K`+J8=O'_ AޛằVMstm5qk#Gdz3$BPlK?4]FMJ/dRRXN7O_ƖZY8sVY6{tLcBca)L{h>ZKDlލHb33ȡQJȲBLb,Flq%N4U5LV:\vgk8F-}"nXUĞlќysӇ t!=dcyV8Jr h7OD]q~Yr~zJvTxENptNk#m _߇~egDuՠeFns6)ɫ1fY-tX*R/=D7P<3MDטs0!}`'q"ʭWt޴Z3$U.SY|m.jQ!cVci_Jq鉞|^ &X$e\>.vW^ nwAS+"T_~}]b:ggg@޽{̙3tww/ߑ#Gػw/EB-Q{Ksať˭.󗲓+M>}:ظq#MMMk-0'O_g``bx)|Ll^/NR ߿Rbsb%~qbC3߀+KZnWбfhR;ZĔym.?/?"jFv~㇬fa΁]M"46q79 @Y#l!  ?~﹛چ{'W˹:_ E-GH#7qm',S8e9EL"+::_fKitV) ~ɲCBƽԾGҵ/.G[k)1eoQ~+.Ww֏},GkyaMl[hNP 1% !$\D=ǥ#(^%(`2 H)lHT,Ĕh#D2蒃O(R;MO&86R gZ=U'=hcf.mʸ.H6%Nd"SuIQ'B>/L]˦哌H#*lJLl[.{13@Q\% 4) [-RȡU^BoYGn:/_ ,sp,ﬦ1cHY> L? [Dχ".0 kok4ȃYl?+=Vyby( @-8 ( KW’סS+<`zزkZNhປᥒ=~+Ŏ^x\ _}^@b]ޱV6Bu^<K *2011 ^~M0 0tl邯?c栢YNPbe |\7ٓww3˷xZ8?w,\R~%Վ z`6\Ύ_MkG38So ,(x+ " 8ge2AѸv;q]GuC'_ecG;IZn² H> 5plPТ]* 2 ,$˻ /s ?XuиFٻK خ$ \RT-" z%,H^ك" !`E}bjJ +ي<@8:(-g@>|$f|HY"T;šLL8Rw>viaUi24,!7?鴲 ~X eZ:6㻲;" ul&6!j'M#M2YraKhndR4wSD2?$ҲFQjUSgm"b[8Y H_l8SB$1j:h$>]UQ4;RG[Rh/.P$tSpkl)%Bo|^ zTcbɵH]*ωYCyRZWe<fYŮ8 Tlmk+y.hW)|aJkq*ZV@@p~zL}:G7dt۠6nz5%Jp;V 2~44"qF Mt4J8EZ>Ft_Y;}3 pdVQcGu@sUz6"[ÿd$vWk_r鑑/y KDTbxx~{UU/e6KPX,^ȋh6\ꯌZ؋ऽrE8p]VRD6E˲dgT/dL͑L&/+_Ŭs22ja~_9mK#6Z:FQN(QΫ9-`K6_?g?~K9qd?wn}F9N)j5P Qa8'x$.7{N(uM9n$9}яc*%z+)6brk*qw0wk>q=clK5\}k*N"͝5h+ʱH`~E0jm>u<͎ 1gɓOm{y^V]lr8uak> d÷X0֝ 451V^ 1y5ULM ) Y\͐1D62Į)2}N&$"ͤ$K;u\١R,R"N)ouFrt-k4`PFuqo`K+8J8.=8q>E4ul+pD.Ell{'^~X IƦ;\*}xb`$0Pj%r=lN`~YSt]J'Kr #~L ̛WbMhNYTSGEHvccR&.Rd;70EbeZ" C'}oJ`&(1] t WѴEb6xR:% %0xE|l%i#%ӱڇW•BZb1kYLä'7r}뤷*Liz70 E:Vfpd`N) ;묿~p ]hعMg:J>&6XؖcːIOZ P]aQ1EkN#))X$4\S0J䇂MTѴTX2X3F%·&᳴l$GuTmoNu&~NsGE6e$Lv4$.|nL䂛H-dzejIA>"d#$Ih۲Ú;hz?hE՞`L 3'azihLv  ږ Y>2 /UM {./vs}|p;G繐v@$MĮH4 ۶u2F5MH$!P*K݋i%±e,N/WP/ ^xm%/% [/c_ɦ/{0/sa+S-+\"pʇ`64qJ&׾UQ;v `CL h""`$9TL(P(kdBfc*"'<O})~H\ qNDŽCNL?zVtS/xu1kUcLaE!b١+e =mѶ5f~3F>7'esw~S#HɔJywkg)' rj^kWs&7ɁQZ %+M*%! "er2:3ܵN_"+кǿwﻉמeNC53O l\Bm0潜D ,\M)Ieے0ɀ{1^Sl_t( G4\C'KdPDېQ0t )k)Pl A!MfS@,ɠ%C ,EO%#Ab PldA rõ׳,vnZ/#љe7cH9283vpnlsZqto3Dc :::Z9q1hu.b(*2Of T C9S83yaY$h=:P{ovIsh:Q(ʄb}O "r3Z$,,5qRFwphxK3qr駥8d#AnPi(D8&n׀`` 7B6 {B{ء<v/}B OCk<'{lmۼiMzyay: G<㽞y׃?]OS,y9шD/i]$ 05_?zL=8<|2 'U8M/9N[9ZS#ᥳkɯy`u?=hGplnJ4V?=-Ma  wy=QfH"ߞa Or|8ز؊hh8:!ෘ0䐜 O⓿ʤK&n_?l ,"!m11>c'я݃(ʸ d)2*(\.~-qlpvaу=q9,3bf.Oxӽ56R@VU\W@r]p<jPftlG3QK8 x\d8&O쯞%RcADUqe6v?L69i[3!D/W@/^d\xuGʩu|).YNQ;)N-9-Nn`\/K5Kbian3t D#гǞC,YܗêqءMRa "w/#ZC%XV珫#oRGS-Pv˽*ZN |n@.Y^2zk]v{ vhoj]#LT. Q%_yD6V~cGřʚhLJk5a}uVd EhQ8zE'>1KʷT:s(e4]{W#zyyNY,T+L[{;\?f0\l1YчTՄ2%AkJGYد_bMN3VWU,_w~QbUa|]P0NEc֓smp-/TK/r۬>3cY+7?ŗ]ڏH,-!~ HByb)sȠ6-#elvth=P"i.m-:5csXaXp 7 ӡjf0-dqMi!k ;;#$pT֦.h}Sg9>ыo*J2m7qhlBhTT".J'61J22,(!t'e@R5T%De> kc6%A@DdץȨCXq] !6R\2JYd\%Xbˑ.!GI K>(q*TF\%zAeRqW0,T2d.Rr}2.y_N t#ޤŹ+R<::Es{%əNoꣾ<16܄/Vc˸jͩa&FZ uّL ז0"o=yJ})J>aѣLOS@yI$)ב1jnP9eo-] F@!4iw訳džpJU>7={(E8gj@s րRq,ǸڲGe0rh=Z}w۠/t] `z8w+Zر G"PD^֮z$ AXr5y+7SÇ;䙏5`Y5ZSsp&~ s04 Z=C= XR9kOBk- V\|^ <#kڼpd;o7,80/-#j}Wg߄u+ _7N0;+!!&KLm$J\`#;".mc.)b.` 2 i e_zW^};+؎ŊD2)> ^Ggg;d. O34~aWWz=ۯfq,gJkX*rtŵ[y-m )~O̞s+ضq= qKme]N䭚j@Zwٛ%WjcVF؁94m8Ԡ,Gp<ǞR7Rq$G̍0Ȟu.S,m"d Q9?J}s UwG:Ig]Xgzt5sOIE+ .!<|:B[0ʱϲ/rVey ˏ;P)}6nz$*&p7c*{[ep |嵼j=f1xz( (ű:Vq|.q ҆9.w֤ bEM s7 (Aag8j5g1'm*4 =kDF(]$1PoTq'8.a̖ۑ%hO3\$ϐ [[,=>Qʕp"ug_E {3ܱ˱F ulʈk:M+~c"u6}F~jjF :7>b4݌5'/,!\0@x|59V/pf1gq5KVٓxK:\زe'ϟ%\?&9Y.ZkBl|b^8O~ߋĦٸ+Ū/¾]Q-9{9Jo1,_~c C+8L3gM^ewr*"Ep-2DGv x<ǔk0O~q35wnL,c}e%'c3 n&/RKskfϡlja.F',:@t! o=#syߥt +l~$-v|>`?~4uQn @dLPN3ں4f4`f-k/o0RpƍBʢ P󓛲P1a*{Ө0ب⊍㉃H.-$=@:Ģ(pp)fx-=8-uK 2έƍҥ1y< |zgKaG_Usb_P {:@B}W6 G+u^+ڄHævsH.lZ[~K&(=3{M7ܷwz'T _OweZՍX`Y(n,EW`i󱖁mY"n6FBQl,p`-lCF7@-,+QAp̦7*VRPUP.(FlUDt,B+6BRUٶbIglܪBN&:jbڳ<[K2(jF-gcؚmZ6?BAlSRl4evΞ6ؚb/Nl bXX 0Qfl#̖aGi×M޻`:["Ly/sI͗pM!Jh}҅g tI?]K|b*F{M@qr,rC%?L8C Bw!&O2@qQ7bi 8梯mp%x*..$5 55Mى0M_~ =36.7/?n+ sy/jE, B=~4Ѹƛuf<;őr۶b+Ls7XC*S_T"CmMmAlp"+K+1,/)R$U <{w\n9vLpeFe, iJJr瑝<߾W>wdQrYP@؄yT#d_5L 'QEu%y4"uyf"1n3=Xv峈4LSRSJ.iEs8h/|OOӟ8!]H'49ưD+&OKQT%* s5<`ŝ?5,<5k}UȤ1zQ}.J'ubl2d&MkFͯJOKdS$'H9mxLR?'i-P=GCؘ )LԌ<^ƺ90 8v=ߋk.uS$Rٿs*kͅ3;SâvCI.?NhkUeYpltGe8pF # coM8}C0s?[p f\Aq' 4S[Y޾QQhx}tūg'},Y~N\L_&e>HR vM[oxu6?#:NM.v# $['+鸨É x rԓм051X|>NOAe4 }x >%X $R}XnULN*zFuB.@"xa*퍒2}RIU`GܹpV5@p7,jQ[ %9$K zmR!Ն Ka(Ǻw?"]_ܾJȼi^^킝_^3H7]PdM='#p*4-<8 #஥nNش IDAT@OB[28 k#o*2Λ/aS3"]w7~tlӞU(-,,ۀ鲱m,eˍdڸtl 5Z&9S +r*ϾնgXevTT[EQTKVl4 TF,FQUY볪hضm \J63qW E #s 9lFbl+=[**#!}WꝄk rbۂ4: - XiHgZ6(+?hajnb2Bs9r4[XO w*/e!fhE O7rB"?hEIJ4C:{ܸmPЌv.Nn#:?z8Au`mÔ(;\T+n`NE$xqM2N8\g~L-X+BJ5KMrz &zL5ol Gzx&漷KZ.hfxV*)K*'qty4Q{.C履ħpǼ @ge%̛_$]y{%SU5E/KINPQ:g}(:ho9¡{ZwXÛ1sYRYA\ "T2K2`o.G:ML+~xq4ːt@UsG9cdrY_b,a C͑{0iurn%utIZ¶=FG'gXv^fSd l.QLdl΍; Z fڍf69S%s2,rZ+MPvxn_+C)J,ZDd]iBoa%M.Yd~0ˌfD͑ǯ=g-a{uܹ^/_P;90m}v=OvREFnv|` p X)IV._L{Ӹ8餎ۭ"?B\n3P2Ke3d/a{=S(D%r?Ô%a]ôFa Id?euW53n;O!pSdq!=}S4OMP/~StKDưb&o } [6lB\d4 A86 L x.{ QY2yyA?ed De1LJk36nAղ|l3ߟa:&1I+EQraO-G'΄O3ǝgc lͅ! { 2vYtRGTQ(&jƏicXIl\x474.LzBZtvGpi%X 9Cj71Cmm\ڤǸa b'7NmnR-PۖImlgEaIK3`EΆ|9 b_ /`xF7·vC]OWŽp h/Špv KKuK|0T'rt/G$ldRfUKW .d?wn_-bw ,^\ۋP[ a,)CO C@JoYUDAɘXekXT} XnLP,L4 )`*Ji*bmPlQLR} D2` `+bC-u"h^27)VjP,yMLsVŜݎuB mDc^eV,9)[Bg{UC(W6*ZmmJb3f~N( )f'Uے*W QY["UهΖ 糖#.-Ѵ~Bjg626$Fa7RQ5Ĺ7w`+U-%K ߉]q]=z N&|~Nnu/3::OUŏstEWF?;s+s7YTG\>5| Vl[ '.5bmM &T"Ҝk頭,An[KCn§:QIRmN=i EWm^Z vq.I_!^|6JlmR~pq> DzOc_\S8) 3p4D3̷ٜ".rx*;ʭ\h[bmY>=ӏR,i#*I_wFRhY3gul w,V&SAӳv0JEJ%q`xLU#w,cDIs iQ&M^@hI0]2IqS5P,zA˩0Iasq0d&*T,.TtOLȹAмI\|=j2Qəz@2!d6;Ei1>fj6%!L%<o*N<+%cxxK-ԄH@͈c#`f) %ꄲy&iP;MP#4ɤK ȺtIy׼$|gpσ;vIB<,A $)6ѕB&"؅ LĒ=J[i]itWH. %hoH(#uoB8XYU6rRC (!tԏV\iXRo_At y) wax>Aӄ&[_E]Ludsd|~t WBsX_:lX&Vyb>~Q=nn_CfG 0|^9DV?Eb6lh,}py.%T(  ZBet0\r,GBC/ UDvAE>: ۖG'?48)ŰCJcd[%b9dJk۠Df<&=vSO8cq/}@$WXi0x=9/6y8ppCcBWe˅(_w_ *Aw]Kg%P&İaA)a9 N$ܹ^= 'a.^yh^KǏKGre 􇡵&H7\2Y88s6('mYBR׬9uM )r)_ϙPrKj𕿄C[=.H'ԔȟxK${{@H-GCOw'$IT$Iچ ays|\'c{wg)[Oo-e8pExK@AvcKBxwCjI>OĄt &a& e0`c3~)8 ?K3 `hD(O4xE!G$:6O> ]_ 05#éKpAx@¬r(5{"x~*|{*%lyry\^XiB*GrmiImx/t6XwQ5K .HAVKVS<xN??,ST6Q]|=BߡgX 96,Q`+ LVXg/TMQ]f ilfv^~o+|Q{ ̫;*CbN$Y9޽UR/OJ7$' w?_hZjBd%b3[!X!y<|AM#s8vFb`BwupȲ8p|papK:s| *X !iB0u :{2mf,wˌpCң߹TlŒE,1xGк5I.B:EAX/@Y+É ͵вI! ̤ݰe+ `*x!>;nIIHGo K+Iܶm!BI<03 ,U_餄-Z7DK8:8qzV‘!83"Vp92x圐H QwQB:~D8>/|T*9 %ŀ y@)ݯ 8p7  jrCM`D^X_\>!59+ ޳Y]PϾz>N۠k !̒yZ}2y͚3L0y<')\9SQ?v(-R?i %zY!]HAl. >(̓|I+|ܥ ɟN2\NXvRty ?}JfKD~u2]JZX* x6"R}PS [b5L]wOgv¢8)c'{k8| Z*`I$t{t(*] E0:!),;p8p͇~JyXMp||AmfÜNONK!/ DNRۆ_?&K mባKf˃cP Mǻ` _)<,j:'*%՟ΝBV_:'u%06 7-p\j.H@X:Ks 'hCw Odቃ02-3صW1M`*^\#3D} nQ .Cqئ#)X ew?v<?*%( v. cjחP]&{Y)Ws`B!;Nd7gy7cS&ugͯM8c*œh/> hLC4`PSW×<#wn3Fe>ݣEa< ;^O+5BTm$$0|(ˇ8hL3x9Ekwnխpn|0T.uoӣ߳?>ظBoI EE=pZ+%9…mrgbz>l_HPZ[(>_tIf~D**tx^+-+! 8p 0/^*hʥ빧% }dV> ;UgxSe56gͯ=8k~mYwE 2ga/{V4\" y09 .j8*X؄VIu ±ܳ joSm!L =x EX r(!xV{cIÊUоP$C0je4a!m{uh/gö%ҦSYxei-\V jsE=l74A<,8z6CPWeZUϪB9%S. ]^IΘpzx$>[6C]$8+/Ӓ$ ;;&akr  KWAE ixP~&~wxSofVN5gͯ=8k~mYkW-En*xKS`"Kw@ŵ0{Hvn[ ]òM߬T/|.?|~^u B[(!W0l(_w,H28tBkd'%%T!R! ?j7 }Ē<4:a1x rp OUpSpZ]̃g`A$OLS.JTu[>,sъ'X]᮵04#v\?GBB~> VyAy:yq5 llF ϕvAj o YX7kSƸڢgݯ=8k~Ykκ_{xKJi &@.0R,yn \ _@ڝ_/ DpzB4, 2g[e |y;|~]Mo8kKbM^̷x<vh+t}=l_)S$+^y2QokB{#wm/Iv"$ǩ\wB~4)]RDe 9AQ En,F!!ܻ^Yڧd6{BεuͰ~KjfýVJU4 _TB-Oމ 0j1Ul~~u[Ru:9 KET<)FN,KvD8p @ J ̼ a~;`CSPTDHZyiuōpvƢ𞛅EVI޼^>zTT1}dUUB΍WodR [[< yTI~XP-Ǥ(=~8`2?SBfL1{=bîȃQ8yj vV7{" 8sAo\(]>(׫{\pB^x0+ xunx 7K:uY@ےX7Ͼ v{ :.ɾ`V!UPS"5VCmԔKpXEm)<]6`xv?+`A3;?348pX#7l|l@ť`| yV7?< kA$L'eNײ`dJVKVyWH ]kŎ9_Cw?ܽ;#+¥!H'%`lM{@ `Cg:Čb+g\:ǥ٥Ï.5p%G7W7,3wDDT67 5?yKc>b(BT}`".$wyhA4 MM06cWA (]0 ErǓPC0dC&'!j8uQ³ŠPP;5eف8pf_`BJ-Js{w"X^O²y@}Tpwr¥ah- .H G95g-tc9tw-(͇R4HT}-<gĦmXp^: m{\%d2^tEw[A?Hb@tA+dZضcE蒆E 4Vq}h9(̓GR/ `#pr/UVζe*< epy@Y%4/ЯI6WT5}8p/@ P|_aHuAQB{6)Bbϰ`m|Bxǣb%#swo]+ErYCa^<{+ 4H7LTHd5Gn7O  u#\{g_[!lo DZF#ħp 0| :+σ% 3-sMul',#@}MJm0/C*9w0UHstЀ_C8p8pہ{TB[;D"p洉95 ;w@C#$RpSM$p5BG }JBw)bDmɜ E`&Q;Bk EJ\u~~"bXYóJkWJrEl}zܰm=D=AfUU~{3邟< kᕳ$1 ,~+\a:]O$Vυ2B=pX[g>̓} !(6rn8t FB{'~/$E7p?,Y&SFW^TV e$2+` fvA T#jLL;_qU :4sN7]Um}7%4#%rFI;Uh%xى'G*Di4剥E$hF{]V],6fF/~T[YyuUX J%H&1d jJӖAf"#/,*f;m12^Nf"La2ԏE ]@c,l(A+ۖQ9B0B (s)]$vJjrKkRH8 86n&:!(be CV=ʑR;'1ʠ0R% uAiXn,!щr *bFjq(W""ENEa3;NMNjoDq,T$ձKELZHۀ#i$Ȏ@KeiHp T(F 8vNlRCE zkw5Yb NoUs5H؊a &5$JPؚ"++8EAI|) I0HEI$щcC(]; rQc4Z ,Ks-PP!)uiq-hǐrp~*~"DAiinPжEM&4 G"\@W@EAQX܇!ȈN;7b00dw]Tk6`r N7c Hw]e9 y<|J~(4_zߵ|/M+Y+ +5xy$-SƓ7Jn W̍2 ݨG>Szt⽸ 'p?|Uz>_XaxWKvY詡R|TB>p$ +sKw f/ MpS=?c(O+-[׫ !ZB{ׁ^,PBn=w~C߽%=>EI,w¹FRԛPx{ǧLGht 7Ra[h<ǚFZ6f^yS S0b,VeBSAH[Cu + x ,؄SlH 8) 1@%QIHq`;U잢h(t$ݔ,$|!,ti}\K OS 8&1HR))ܘL)̥p5 Jt͚M3ъT! *95#ҧb]3C $:QDV9h[ 3bUHlHR*'mlcmqϝd{F\glW3YƠx{hE=C*YSFx[7vQH>HlڴJ酇ɏ]!>H%'[Ř9N Fɖ[ti*mbO6o_7Aog߾FxjΩ9v8Q!X`:/],,ӈ5 NiW8IRMf YNjTP(_(lKR4ȉ0M;TeےHxR*,2PnH8*  ZdYSrckr'GQAnK; 輠XvA:*#6)Dڦ! :7~Ӊc&%v#5&s")5A)Vn Z(@($Bp*6:gw/4|}% {s/É󥘞.kegݶ#&e-8qLB`a$pc & O]$= []xzīm.]|/\]}eF9 xý_> ?[x; < /}O?'PӁ ׯ}o/8puZh"| 쟆O~vOqS;fKٓ߀R?h 1;we['pd?l{ÅjI^^jOI?{-<0ք?(={vv`,YڀKgJ[P-iK7YPCW{|IJyU*t$K7_ϋXC:0Lnl75kc[C=#ez򑧎5Mz~'`ΈW*}Il"cgmt:zEvIxj0FԬ6԰*e2*d%,:}f'B0.%RkBͅܘIyy|6qRĊw0wネ1ֻզ?863<]e˛L|pS-j?#+v>\^bT=-]yO=m3ϑG Lq37Yz˝?p Os<Ԯ6..be DBXI5``$~ 1*CC'Xq),psIʆhf1c٤aJ$(,R XCQQd̉q)(R"DLh,,϶1HehYS$qc2kG^@(Nk2"e|,gj(-N n! dEcO$:!jcE .N M)X6 |b"+H.H\ h6ZXXZ;gP RZڠB-dBG'$ꕗ ̮c!w*,ѠKBqŴ~ sJy] \ML{dQdI c jP+0'=2t7 x)Gh^Q=PWZl}@mlR=p{1lE^Iɻ wV}fmM Éuբ>@ Y]c\6Н ȍ.9 79dwnusثcxs%p+bݛ2ؤh~F2YcxDLS Rnz^'߹"UgLW"ZQKrZ]$mD'vFIPyB BiEi1Ta,Љ ,'l1*C62haUpRT! tdȄFkC@"pɰm H2Ҡ 88~5qǣBiai-$&/bTe3 #)<Tp2G .H  R[h26#uF*8,Fvf0Ah JTQHBXh4_GY. v&( 2F: )g6nlMIlE$J%$H<'ADrIJ&ll&4xo{}'އ l ]w@eO-wpv҆i~~7)Bc»_?({?is}x}pp[7K6 3/>R 4JQxx҆j42{T3(E^B|)yZn/{z!v8kOq- ?_y2Ve7&K,E;#U4ol1qi/떱@nNj\ٌlvO I hbIc}jrd|eX  w6peBvc[LVW c'mGN9L;uJL4=Mŷx3L/F䀘י/gd-'zXUuq*PB!3H9XHƏ$UhSP=7Nx~!EPf$!nǸpL+yr X94TA!|"[2NhU&BE[`usF >[?*V Hemj=p[ZLUqBlUCAy!nIp+ !I&ö% Ԣ)}ka!0Ư[YmVqoBW]N)f@0٥yAeagc`~;|g)؃S;l9uQ8\A-lo5b@Aouz}Ve آ',|=Cqo4*j5΄َ&1 1ie0\LW.i:r)M-Fq/;:8ݜH o=!vFY2 \]dhn5`*GU=__cM )Q5)mw'޿=5ΚئUf h֝T7& (VFi_]cɈWdHjH")Nj@OC횢TɎnJvFHD$4,,+p hZ#d%„hl<bd`TuD%Q$r5z!nHxBd!%L@&w7XQT+9 Ӱo,»+O@魼1(Kw/.O.oCwOȿOKPd ~%1+;QfI] *,@(!a,W{J/x}s0Vw…Mxi }o] X!'| pdo{7.ՍRffz, nWxg-!go~gVOmgݯ)ߝpSϖxuIse__.vO7;JC??_?]ZD-eIhS.9}A IDATC00a{3l8S p,.z-r\w V2A{#A^K7,&6[>fş=Wf:Wz Nr?WFgyh`_wHnq^ءW.a; XXb>#[Cv!>5AҙLevG+n2d񯿇 =9E }U̍{gzYZ16tN,X[0_ݤ>D>޾}-WH*gۆ֓3zKs4=MjWa"ͩ'aCۮsw[dĵVusw2` dlP h 5ZnY LsH- o̍3˘\`uZt"#]q+ٵ" vjӺp } ;nwmg۳i [FXEJfx\0TB^hbflnF&pIE r'#^LG!\T5A'aI˯R([Q$9U#-hJjJog*:E;F}x!u$7|㺒0PWASV֊DԤM&[ Ylc\Jc.p8v"EAI,,dv4qMlN+?E MXyN  T!k+HK ?s¼{ȢHTtR*bVvYUhՆho$,el?/s8Rf)f]~*5l&i";07)jѭT@h[YLgz0 ]]1[u;;Mk$xĸjY̮Y3rCT,k Qc":Ae DJܤa=I74>}PӜ {4W"wm@U(ZMjW5_q}Yc||\PiJcvM&s&&&X]]ĉݻZy377GQ`6zq{ettnKQ}lq8}lFkMdYR )%yQ8fv1E8 QVt:ضMzݻu]׮]ٳ(T*t]:^Yn۶BP N:NZ\v ugddGjHVCkmی8lnn$ϟ'I&Bv"O,-C1 0n܌H"$@Lc5V"4bhd9 -34.$y@.S[H | 2 Deʌ< >c("` rrJQ*IW'Hm"!" s"4$/Ҳ [9ae0&XMRR $ qdd-b PhHU#F=k.~)($!QV D!(D@q%% ! 1Ft%}!B rA:PڠѤ+~V.<[4UcśkpZƩxu"`Opکsy~*Nа'MR96Wrtk\EaW 5Ij}xj:K&!sC!ʹ}#TWǩl c&@۬v& :GULP:\c%8uŽj3<4Y+A/yhyoOd+Ma˱7ɗ?6wN680r<['2K2NfxBgxzD:ϕ-Jj#§ Vzge~+j U9OWFٮvC;My[˼(6} "I^(T|-}?̎ŕރ} 'C)i؏(!VB©' ﺣa o9 zi|06t,=?ϕO`;+-x𑯕اO$o?/|>߯>^ QK#n4*bLDR^YZ6Z-׷E|{ٷ\.x<<Yz ,<|OFҧFI+jZI0ބn~óSanN_~*5-ڃ܀cB} &wZ_ڥ2lo0l_‹C|~6k_hҒM̻֮|wy}ʜA?<#)^|GVATsɞi~+ GLQ\[&m31칈\>:lr4.u72@9]ibKE|eIjs<9X!RƑml{KS\rIsj`L5zb[D/t:|*;k>Spwxr.woslaK D;1~[oDl^.%WFx D8L[Ꝧ&,?'yk9rυ}GVs mC4~*!S{y67o23[cpI }C.B._yx˿M743Kxw#s15-} e~La^z/IaFN`!Me>SkR'rqGi-`lWB+*3/Xɓ=>thM*'Qڐ!VO+>jpHii} >c<;9Etm ܎Ͳc MFBºk?K*3JpTe•}8v@I\6u#)rɳ <7%+&)*.Z.q2l`> ^*N*n?0J Jr^]vn'J/1՘d1l1e֋: jb567k4qBIZat-ՠf7ٺ`15h^c9D7D?T_"q9Oq%sݭd9fbn%H`'@O'Q6'G-1NzZ=g2FsƲ)'k DվPbFeaJSVE"5EQ2<9S-ؕmt#a% &7l4GQ-$vnFtn޾II*#l!0q,=r A66^gfp{Cп¶74oQ n_%;6KՀzŘ133C^ncYz8,,,PX_z&&&u]&!Ð54E)EV#"677)۶C$dYF$EA} LOOSV۶ zŋB0==MV#cz.]bhh[vxx5N[1(}n8m[Ǘe۶R2 aϞ=,,,044z!B$ QeEQ0;;KŋZ-ڵ8%~:VJ;;;lmm㰳&B\%MSla+W+XF`gilEl4E/&^1v OmA216~ 1 mEi)tbEFJQ8*$mEI c*F$ lQ! B] H |OKkEm7[} Զq2EV8H_`e;v' v2(pOJgPaJn4fFE- gJIXa hQ1:Jӵɭ@)7{P-$J˲)bID#,$7X^1dڢ0k(0n6E+X3 6 ׯDz;ؐ+wEg%&Fz.J8>`c;0#/qW֘hCt!`mqCt:hj,sɯ,рǯLf`~&s3W'ٳ.xb4ggXjXY*ڕ2nm޼qO- ==5i aMYKV) e&QA*ΎLȄqܜ4iKS|Ǵa#oW׌ .6ӯɅ6]o$|uq!dvC#.KK9PH<)nF~-ח3]Lܼ[?|De߻% Oe&ֹ.R5:='i?|k1`CTZH!|F)Wx?\=Kkuajve̔ѵK|s }W)_w_oUO@ܼkķM,oOplU}]g$z]zfјw$0?x9,Ûܶq{nx#&=2_`鬌2VY:2q7¿S+)W]} ݳɓp*yW}Tw&nYĘ' TIoG#þX09ὛX'P:M2].`%>|PU qd: 9p_Fk/8nHȫ6B#,y)3u`Cwb"xd{0g1W 1$9ub8I]t g$9՝7W{w y|죯ggQUZ[G_e{~vHdĠ6 9n ᜌ'g_s/,Iwk+Ƨ&G$^-߸I 䳯%Hvۿ[gn# ~g>Vl#9&~|v}ɜb FEP1T0&rjAK$Lc]D.+1U;&8xI_/0BW`g)"S &Hmi|aоO-4HKbBj׃TY4!$Q&͠CEK 6N+a~L2?Cm .%,sOn'/JX3 ֓c^̰a:D*78.'SUs4hkrChU]x͛d=F5#Cs4nh]2⚾-,gw;Ü摼FM;t DLg0_8fD/pp<ȶs3|Q0?r?9 gɋQ[$(*c,1#uhTƶb|j3  { {}Ue2]}3h$4#7V"i[8n.E!!dYif4L{_]U}Vz?)".Eʌ̗//3~י!horAMrv9\.88J 3<^JU%蔒u IeIȍ:e`&HDډEOIQGuS5ZAv 9n!zFo/g8=T[^V3|tgǶ{Xq#q@gQ_ ވh)b|^kpUJ<`FIDdJkcԃn8m2M[v lc@/M^=g2bUi˱5 >vkP؄k퐫+1gӣg pZ_jˈ O\8z[*>sσ.{zfm໳ 훰 mp %N^؀[K`|ww6?x4/`l{05xLJa‡TB]UXp.ހ,sK`Vah°x?~f`9ziab0"*  B1 -0dQW mHL.E[$ukzD,L'0v A# Bಱ]D6Nz)z&g(05EwzuEo .؈bSh6DQ+>B_[GlbIͬT9D_3р +G(6ƚ!S5%mF4tk166J;U\zkhBIy]g&qr!>5! Y&5Cl[h0+2Y9y͙(+VfWP2(Ce 8o!Q 6  x&KsIV]0J`P]\C';졤aapϧw|DlY~a78tG?~O%0~1~#l^|DG x%;:swd*?]$]<̷߰G6dxex/8v*ųAnS7͞ހnxBg& v}gJ-DcY hTHQl'0C4EQT4 I<Ui :OQ8vbXJX"uT1fG]S8aSCl<4i55;Ip򝬎=Ø+uqݙ\>ywO}i/c3|h[=6WsZOϢ4|0>b vлŦ tȣɯr, s&N3\D9HL&( [es"c" {uuNҿFl_bX<2 0uyeU`z1ofi >QY;''G+\z耞gL\!`&&֬ɐаFԏ0F/ގ"vNȔzvFnsQQI$a\ץX,.#$\e2 (j $D*"1??OD[Lv"@eI&jXF)A*jan޼yۜ7P%"au Gu, ]ebU]i #:RJӛe'vdb,A]~}^+ĩJrs;,c=~TYm)0\cImٵJrnK!:G$tb#96Hхm/l,t!=4W{I 0㚠I<׊{i:ȝ?K~:wl?Z|'ߞ`ۡH*!/T/+n3fbi>Mm.q~ .WP6E+X5QGd$'Lnj2t|Yį{_/Q$tɦ)B@ rqɘ@~Q6_^$×:҉ӿj^uH+ɞgl'}c:wfN%w4V‰s(5F7C:K-ۥ4z[0іبG4bH"⚬' &u"JTs1 9$|aydBh82nQ)l- buL%pO7IuC(AHj.G%:5,x9^>ī m#7zg98=(kkRL*}d35jY)DYt;:H sd7(:s"^"~ܔf!zĝ2!H:Iauatku#K!;m2Vm"\\?O[WV[ @r :a2샑pY)vv*v& ÍUwmڕ X ps޽>|4G`v~v0;iˋsmS˃ ' Oo͆;`j.znKЗǶ7ހC"~6 6mxw=Ԯv6KSpߞ.̳6گq\m lC.8<vw@<KovPKݾqW}}pc^1TM(ضa#P0bmmH$(B!jkkk$I<(Ы߾)h&@1倀"qV+2^KE-BF%eCS},1Nz&Wȥ(]z]?߲8tN" \2p+*u~:])qϳ;שÑ.6f_]fM_F]:>ۧt -B9:jP~!na*Tf6:C A3po|9`9ăњGpJ+-}I*_w%޶c|i# z/FX%_k@4R{^D۞J$Պ|Y NM<@t[@CU|ŠɸS0>rk! 70[-!!E%f^Hoͻ8%q]Mփv``DB P\#Ʌ9Z@\h4o} ?, ܟK85 F&\&z$L2 DOƑ\So2ĉ)lne :2+EJv7,+"4EzM9¬[NIKe4!m kɦJ!L A NY$qa+X[C,i T[c3a YIqf,*˸1.]x)jj(]`&hY]L/$qR:aSK`p -4ץ˓:ZF E. $y/??~X ^X[: k+ipv>103^!T-< MXCz''evzvÄK -_t;l{W!akXjJ};\<7f?x- OD``;~bDž_۩ %]msÄQ8{}]o F7v7 B,Ԯ:`7O(J̿x }q$ax6ĺY|M ,q2#O)#M<'{Vu*T_{s#6#~ leZEو22NfWĵN11$^Oiܬo'TwQ Ax5X>w>-Kq+^rLU4]H\ҁ@97l*Qa^$+sM^SSad uQ iêcb5C'PK"iV_,AE4)csVӬw(!Dy;ۤ89z;ovz\|aPg?z'Ldz= D5N"ia.eFw<0:;:YƑ$:AM!̱P.fjWhd2mDڣ!4uEqUq"Ge&HŦ*/ih-A6"4THDDr%"*B3$ ZغDV).i<]AHLteOo:Djq<,=j>P.m ^w,y:UZ|yIb)JLQnW<<2͓8оS`y~LvCd'ggt]<78U.:u/?tʾrB3~>;9qGsAef]e|<-9(in=2d(MA055ETboܸD"HիWѶms"( $aR.i6[j4ezN("L"IJe mQbo"!D@S"TtxˤRqlP׉,h-&j96?}drb bPjV$g_$)B2C;1@U^+t9k"1Iv Z.S^'7^&;H0RF9s/Ӻg7yBc_Q E>.y}Uhk \wfo^#^'eJW8FڦKh&py!\aM= *b REEr]4"r>V' &a$Dm~ LUZMB&=))Ej+TW8*`Fw8Fvo s=O͢+t%<^G J &em)I,IZH%ؕzyxz?\%+A M P$tfC^cx; ̦.F%&i4RUԅܤ-ouRY=B $:<} $|t[2[mMڲcvv6 LۓlYp]4 4߇#; j?7k3N'{7D p vAÁǡFaj ~!5Жw/A'hK<9T;\D0?×ρ$tq*tM蝰=P( , g)KǶ=ªeC)mjJkR2|z>5Bh|\̺uJHFeiHs_|{wa-b~|cU$ܥ8Cǡg3]DYN\)n!$sX|qnQeJC;w${ A97zH:\x9 ec*To#ü 8TJ B@EJ 'u)N*$ӡin;AԢrQnIK}R`j]hR;&JخKC`cN'YVwP-QU ۽Xr`E0l62hy4$PR9YuĤFYuS$jc>)z VR!N?_0WuRl /_}6ŧ>~Oz}%Ÿɼ7X}??ƱӿgB6DrdU@GrRxo|BOl?+´~(VKKze“>۰CŔL?4-+Q`P3`9 ă&uCî{tN)'1H6ɀP(KG534nl5lQ&HctdvZ!XFP3I/JDI8E|U$"}B]IfM}CL}.fZh$;dx#˄+wOQb7LCCWDŇN=Ʃ8GLeOїxn}<*jD,+7Xγ>Nh*;XyS2 1%B132[B^YHj|#y\]gf_wR7yŇxmhOQ ;v/z}#&7bl;'ڛ4u ¯0?OKTS\ne}XmL25Ή'C?vg3* |g2w{! Sv޷ķ^z/Oq/ 0asZZfqՍsw}tvvf $I4MJ2>>:`WrH\UU*m344eÇyWdرF"=333LLLg,b```+$k||X,FEq[\Z|>(#"J_YYAQm ,.d6 DQxB.sNZ7n dX^^u]xR)LӤj.݄B!񷂾ÍFl6KѠlL&1 խQD IDATQ} a2YͰT x$ 9eG̭Tui.u>.B>3$w<;6Yy31c6;ӏw3-]o+\…Ye(b/9  a2Me8]W|Aq[~Oaah"?Uo'O>p3irw TbDJR3}x-}s1Fkd~ƷWl&2 ,0ЬqfIa# 3HK斍TFIM;FH VU 5I#t UQ*v4LBeD4Y$.2ɘR I.^yיִCR`R90]`wg6vfrEN: cgu0|˨ v)qscW:C$GjLMz*{ôj"ʺA(#9^ktJ8J(Wf:Hk,_$Goy W>vGCػ7L"8ӄ.n-Oh`-S9ɶdFlSya\y|qh;&ux wX٣ /ɹ" ~] ';#|64#}5*=q>2"sk{&3K~sC?;AGkk"1~±, %օ'z>}e(*^ *m8pl$nhl a7a:_lK/\<]ILj˵s?0{ڵI&a$~P+ׅ_X ȴۙ(0 17_adx-ap7mXnB <;_nx:t`zF:TFN}t\f}?C (# ߞރ0QyЪ˗a} ;N­)ꅥkv :`e J/!tcKϴ߃‡@,w}2~f`YL٨XaAF [,*uN{aB"s˗{YYjAo&?Wtz^'1B׍2<N ]aj>L*㽿Ydz&k}y*V ;yQ 'y0"a {*߻<#]{p/H&eJLQǟQ- .nrTq8Rl'Q'Hp{6.fj`lYd0~])P{$M](H .Zr.`Z2ࡔl. B;ErleLM>%Y٠JQ}3+5X6jEZ :OinsFb>e7MR8Nߐp]EN)RxI\3U̲F磜zs N[7)o_;49݄OZIQ/Lu}i"Kh W3з wZdX)  tܛ%E(9(1N&YY$ȺIh1+Ttc&F3L\+Pq#&>%)R@ YH~o"Q;JDqM!ffDL:S#w{h ~*G02!j@ eL@Z7 0zZ +qܴktz;.80zrr&#Bw>L}LUq8ࣣ7 [ SaxxZ3t2OI2#^0}8C^&RznXs5Z[ #݇7*8dDGp}hCGXkEsFE2z1L+n ]f! ud @NIwv.)Ak(rc`ͳl) RLfYoMQ&PNQvq4Wgl.)Ӥgrc7riڧp]fñޒx)7}GTtikf@'q?z?;Ga.ԿN7iE4x3[lp:fuuzJmf-/[p8L,}* $IDQ>93}wxkTlNտ눢H^}tqvJ%R+++<ۭ!iL,]O$p$M&XnAPYONQ%/H{h]n#H5ə$x'ۯ]4BwKJDuaYu}* T# ]r_' ܙ:ĞDQڵUK.ߗ|s/DcLu%s?k.8 "S |$%x9:eSE:,t;[Udc+q/1M^^y.^:/R٨rÓ=?;?Ku!9*9l0qg Ol [p4`~P׍06 >aj & rpez>GgrzX[H%{}0W27NJ˰? ܻ,~x >c A82 N>8\p>nx+ٿWaݵA7< ~.~O?tRS0˸Ci6N@2O>L[K',Cjo,yfMO{XPxM( ׀#8 *5H?]=r~d`R +9!h4HmđR~^Iy"#!JS[5Nk\̒Yvm.1NKƳ[9҃"&7/& |r/.2 Xnp gkX"ڍ,v-F4hoZt H84S21^|R|zIp$:=?cfkڛ!cUz+$#) U9~6VAyvFX`IlB3d&nGŒ4:zlGUű\ [ldĚV,Pn#y&)*RrvS.UObtvHi e*c NA<%V%\($ >I9L;P(VY;3"B6BP*}ʼu1F7Ch3oP8Lr_yG\}5weua #iu<73!bɋHyhI MpJ´Pr}3&59jˀ* #܄I`{H BRķef$]GI@HȠCѐ2LH2Zԥ QL$EzN$%tHi|3.DR^!# ^Lh :J)$CC}'*msυ nK4$zNvz({hvHHY"A{vԑi=1_qʥ"g>wNQ :|ѣg ,R Af WV(f8ѽ Ez8D(Щ;AL Ik3zT҆x.G%[kW(860|f56Q`%BA1f"C/䦵ĝ4mՊjz;Vh}&iD^z M(+[_846578c(VP .]AVt$rz@KlefTFzddhsn(333ٳ` _x^ T wRaUUIR \vZF6u]]((BǴm8F40$"0ܭ@Vu[zp(vm0X,""[[[A@"Oխ\(vlnnA@Rq&i>rEQ}陸Z-:rm4frꖏƀfnuGg2|A`ƮP(2F0 psUU0dddR oe<ȑ#GjȺa@B2Hq 8B@j4< &ɲ1p5Hh< izwHUa||lLRkh(&ҽ23v_y2w%haҬwL^c6ƸC"/ "7 t.Ppy&xg_$; \٘e*䞑%T *L*_|{ĽT/`t߻g ({1jkuJu0 PHB*>I%AO$%}PD ɖI(KEAW5lE,I Bs6%7IHt% sG ,pBoǐ#AOQo3]99|1٦S4L*^`ؽՠ6l1Fd< )@vDjJ\"O&(t9vd>G%у8%i~?8Hg|U,FW?Ll"(D`_$NPO ;FM< հ;@/ CHH16Hsb)5A!󬬝Fv.KEpV`:.6}UV2δ _{k,4.dKSàhX}a7O;zo/~k$< H l6)#wqL^ Oÿg?3sSбV? o#s|w'~g~ԧ>t}/ZK|n_TOCu_H9_{9e8R&LI?~lwWgK&||i;`0eC; w. Y'g a+zCBQW_cVz]P )(_駠G; Z- >]G:qZ(-p ɡ{\ cF&"!C]'Sא 5Z3dNpO3aNtM˞$t~3^IȦ8:k Z%:[8 M tN&Q!!dgh:ovT^TpdiV/L#U\d:JLRVH2~d2J;׹;g|W(ӧ41hIU = -YGe 1vdٕ:I5> I(rI L׳t9hh2j ]$-ELRH̆Lg2?dƸE-}=cI4wfup6Ǟ[<1rl0f,7`J>שDUֻ\#΄צ3=u1N6nXʠUT2zc?`IrI&qiaW?`t6bLrW6~?zqWȚVY;|v7`-)8C efH"gLҾpz <5p^.0 u:cS^'"Ie"gPZm[N︌sf"qFU631E2g5+HvL/-2=F=7KLGH! jMA 5L/HajU4H3*aD]eg9ywqw[q~ U1E%^gg29vY&HI"T:02Jq !M/y^x΀iQ4fW LLu%j7I)걃I0U (ڤ3L5`^#-t1JŎrcъ*A)ԇ kcl%UhgVt(PMf#&d䖇]"6 H!_̍fc$j5[#-s AќVzjh;htdAH'0.;QlRJ t aalGWfiCcV޴XN;3z+GCiRfꤵ43$Cݺ.333R>KgGڤA{fJHI%"|2"\W ܜo.x#D#^ڠdARmrkyߧ\|qDj[D AҸMH Ha#M4H=L!dS.8BM Xx!o6wmq Eӛ,1T(QBFj-SOIFY{/Mt;CP+ Τ(U-`j%R,Mus6=K4%slJ*#9#v@\^*REĐHk18 >Ws pz_C X߀g,pK_31x{uϻW!Zq a8kO»&~WLm0a?ՃO< ) ^^ x>(YO;zv >.x~^?(__K? aN06 iH%ȗA81\\o<\[x \$|[p?q@r/Dn?Z?#AKª Ìl֏ ,畇YqICYbBآKb NCB#\NmwXlC %QZ൬Oyt 7"zM\u%OA2nC,D*wLLVktT#0ꛌ A*DXěK[|J5(YH xݱ))S2Ag6ӓ jźHSl231Z"`װz r*!D^-BHJAo!ʼnĪۘMKr !-{an E 즇wI7CYJBN$UFM `!iȬ(I H|?v'5!@˦j2T/PM٘ e /ޞ}or\3)=iqyGRF[wjk-)ޟ`^r>!w܁mTXUgۄK6wviY`I>L;R8Xas_uNf0QkSQπWl|Օ;݈~yävSc]65 ~rͯPv|ۺN3p2ɍ49Crm6;M!uvD*~VE ;W^7A2wLHYXfz"#DDh{,ٳ/ϨodiEGIr 4iy'?bDxfCO nibPϡD:g_~^%RQ)PR3jeQ`Ae[c8^"͇ XLNosu=16KmQxuk̾zɞYBjٞpLqnH=1hk(ʝxS 69OP/:{IdM&67] xS ) (-䄄D2p?N#,~C(*(A!S#W9([n8^ Ʌ" 6sFRdUz~" "ʨ'S1 MaStgXa3D+9N4Ƭ27K8dpc͌S攉ţu7{n1zf-Y###XiI yt:.m2z&۶h7[]ݰ طoSSS vYYY7qFFF8|0u].Dz,*ry}/7oW_e{{D"as= \ecc~Ac||Cir Q111w/_ҥKO<}pHӻʕ+\|yj< Ul6wlۦj`q>4M( T*8&NW$ĸN_I"%@FEҁBUp H!q!dQkyr _?__acl"0vaw( Ը=5vhtc:W\fJf\\N:7>Pjl>V[gh:ݭAdPXl @a}?ee/#JY1Q@ٽ~I!q\ɅFcvl^8Kkk uiH"My͝r0.n$oV䯥K$h'YD9^UeS`GЈq\t e%nOFc H/ȸNQB;R~*mcM$ oXMn=9@ss{e t!bC 2q̶8Q_Mylm$1T:Hh%G*Y"Mю[,{b[GGMc%ibr(=.Y4aI~-U_ð8,;O` Hv e5F&LJ<>BN61Tkr"4x/q ={Q^ؒ>)81K[Ϣ Dak^"!AahɴLZ %2h4GXTrvp4iIc/P@eNUzi3bHAʓBM= s?^Vbh-QV/OUZU'{3b %X} }s'c?}0S|$R?|^c갰,;I(l$A/e18sp'եǾ/W~oO rJ_}b ''LZ >рj ,Xxajt=7k~8,_k7?.~u'o|pp3S$@+u/Ix} < ov6UW?2鿆8xϜ_>;"Ci^ b-n`O~d`Yϔ.#| pg<("ti]E\4L26^LǴӡg="`m3U4Ťܭfb.'6o3.G>^67[ij8T?<}(qbR$Ӊ7qCH/c{-5#uo} GbҢ;.E$;ޠ۽A-# ,YY^ǍE+'^uHZDy[FYYi`%ezlaVGG :6=3Kя(˃帇%(ZLqI ؂_x_ 0$:fILot)9Wݼzy!Z[kiY+D$o,Tyž$3R>?}'^}T0|`RG~(A(48y<ǘ0"o?#4`O"hx/'4mS~*<."Fl.6][a9}5 Dv|};&7MrP+>B6H$ORKVVf=*eұo9b/l(V\쑩)d !ABv H!ͤix~!"IG1 o*t\Do/6-ه:a 3E y\bhzEX &)2*%rL]&IDFF1MIn/2 Q V !vHäщX̴N:{ ;Vqq2Cj:3%=v +/09S,/]&<FRĵ.K{!ă`[4C̤fg2_ǎ{h/DjxnC:0fWP,R+6ע;9$|Oqؗ"y0&|7xtQ*;6#ň)8?Ϟ"nȉ#ܳUCRGϻ,BrxCiV&8F?6q@Y}&N2=eAc8}<|W0ūpT?9zc8gd;.̎B&=|{p=+npK"0Wwa|nhQaxR?\^~V0eO1863d7F>BX }}@-pa~^8o_CwV`YjUGO^KA1 _z t8{(7q+LuyMk >\oZl Uxb]Fpl?~.%ϽONN@~`PHfJ*1kI:M"73/};IsQ4PbQƌ|!^2% =P 5'ޤ.I8AiU}GNk::^0!u$"q &u&aYj]O*yZ.u7L%_V4vBHm/d+V,K&CW<Ɨo"ZTu"7U$^2&erL9bJ=F-ZݨPĒJ ;&;mb`*.l□-ihc :Kv"\1Adz hMSc#(6QYz\Voy(0›CD5?;޻sTxA$$*3kŬqobmr g%-*( /l eVSvF@zU=Y`bDt8.$vEr+E/\qb:p|=h&xI1iJԌe - bjO(Q۠$2D"дZ٘ z.A*܉ #(UG#zb Q ]ks=3lŊ[H$AWD\ƍ5rBߪgxve^EQHE,BQ&&&hj5&&&0 c_9LʮnZɷo@AX\\7_޽{hƣ><Et]aȍ7XZZbff!&4݄mIncEQ4Mfffx4m7}TU("$q ؕ]oll099iaAΝ?!eJػw/ԧT*+++0ah4d28$IN[ӷRsjvdf9:N :bԄZ,TbC jǘLGr2qhVܒ*hLckz& J}]\I8psރaE&.жFϘ!;X [&eNQ@%:p0f~bkqsʀnهZ f-1O+3b O<ܝ|&NE&GWU? /CqX0 ._[!z{O F~ N_Ipbol,~x?{soŌ Pt\-NV7'?a85YWO~.><_'oA1 #`ON T=hA' |o~/$VcI@.WWGb)R^f|1X(_wo܂ 1xN= ݊ϼ ǡ`r$)`ؾ{R7 5 [O*:)S\DCww-~/>nS fyiFGK[U^w?4p$")fh!bFūKp1S RC(4P.""=B'z2/e [!RM"Ik|σ@U ,ͅhhz"ǣKDq{.Gaa?V}OYn# n?(Fz"2 IDATkμow53ƅAX!8cyDiZcp+K6 >l^=GJ_Dg`܁+ wvЃ<Γ_YE~ANBђ5Y2ݟ|hN׳Gcw;M70VȇN3jK 5/pm167YP#@+]1^['*q<>t}A%'Md.Ts[] næU !+#GvAJɷ_<kkx~ݍi5_w9"Np6~ ]: 4ٗʿ[Nq}nNI]Ft/8I)jB@DJwb!+9bw \~ *`Eۋ%9}&9&Y^#v-Da 3BdmH_G2Qu9Z|!k{) e] >e-DS@=4߄P !+kPih|ks(߽=.p?A?" K${< JCELq3ԙrxO 2îaC*FDik jp Ao@$:Cu7)o1Tpv$lThgH]'D,"k; ,kR)vm(Nֶ<A h8QTvwL&wZmGm6ѣGiZ4kJRtOV!Q.wSTiAZ"Ifs瀠;ߥRIz!Eq˭:a`V 4w<ۇ.\IN/aϬ:eaQy;>PUu߾;I5_ | ѵQ #HDE&·D<%$$CQ!"}1Hu]\5A+n* ""CTžPq6HJ *hH=; yId5"eH/(x>`:)Uc VOP)uBHZ^Nʴ!! \C5, c'iとF*jWv Hݐȅr")zD"IHaDuIBh؞A(HHVqdQv=|(TK d)^#kH> UI@"ED_#ǣ'@zg7-*XSD}TZtͻ$8×s\Dt7B\G/(fU=:ÖfaW,Rvu},du#3384*I]unURܣ"aN_b8#m`m@bN̜?MO#SEc)~q ?T"+ᖘ*dm. myx9/|Ka𾽆]$3Gb?Đdꡈ ߸d@.]9w֐Nr;;\n00RwXYȁg{yئzPo~ #amduCT(Y%M63Q v`i+ o݀x;SquK|Fby6k~t`yKGj)}_t):Ñ6~ɖS|9_qoClp dI[B뾋e$;7;s N)#74DrE!_>3cҨ4q&؏Ν*\BǗ.sDHMƎЙ QQKp~^0^I[ChZIqeJ"-\/EXZHV$M)B="@\O ɤKhx*XBDI UF5vDN7%vz4:9‘䎃(pyj(s%U##+C!G/lpk8/>3}zϻ<{y-ķ_R!c׸3ﺄKtT'2~T8' b^J\DyG:ot0Ex2՟};wg1xfs_=Qv˭^.9ˬy7~"}<#7 zncBe?1}:bCdK3뚌y?G_dqt !c,+OplMNsi?;Fjߕo-v kG2ړ<CcO_ K'{{LO/M:2Sy?’xt֯m?7ܨӸ"y#\1xX \76wݳBh!*"p2h.?DZ`,i2g$rPLPl&5"/2㨷8{.7޽'\6h_+ JxXL,wr&A="x2eQ:(*AE7)*f'ȯb5H #)ӖS Z~?'So%06Tթ֮tIR,A'XCmWXB"'Pej%~~,N<⣠rQE~Оg"΢,d_a56k9zm9n`(iL5T c^a}|EQ2ȦJL:!q^z$I3;;#GeQw<盛d2={b?QFױ=G$DI=+*x#H`J ?!ꃗl9EdE q-_a)2>:!R¡F iZ I9PHy:F$("H$p"0R#R *:I$S|R MDI d@ tt C@Q\57Qd nvJ"_PwbUA?8ˠ3HO&.Rfc|IGrͦrRۓet[7O]Cb\H'㠩{ȶh9 >'((n(p@vijR+.1ۑ :yy.¾a\dOݜ.J80"뻖prr:A9RXx6ΟфN-1ſbgR|Q*굫|CE(YnC= yaD[L&Jj?K{AHA(8-*!nl%kb'Þ(Ս347_[NEEam#,w?}` ]W!jƩϾq9fLauo~7+}<6 L;ߊ^8G`_C&58l䡘}ͥ`דON㗿8n d{6| b y{>+w_ШE . ~mx鵸xs ngƉЂix;`{7Mspy./?{ɩX}4FG|}1}>pNĕPb](ǀu8w]03 0 S9{E ixb|N,3w櫶VN#_ ee_N4.DMg֛<ꅘR1s>'"5RADOkqϰw䦑#SaV6/(s}Us  `|)LВT-9ۣh.4=aBL $g Us)6f/ KQ!JtWH!ReH@w\M1$̎IiAOM $̀-D>UD§&к{\<Mü'=­A&"as׿dN~%'årֹ~j8C9egsy/->~&_>M1a /3qcxkYV9WKeJd)Ql͡90^n]o2%ƒ i&}we"Ri8ρ΍1Ln?V3l 6;vbIxh1z0 2Ѳ"w닯ﵹ—zv`F':Ҡ9DAaX YEKhI:+nA>fN$YDJ%CFͰнW43in{0.c2ý4wZŁsjKۤT[i{|M+-6{_w )AϚ4O/,yL*!/SQ* G vңQf"F*F mby$vsHL$/ZU+0IKh G](#i$t' 4 DM1R6j`-BMe8Tw] vQ2Gg$fzYShD*ԌRly)Uzt-^gܤRHĴ®C/Y~(җ٪4vL`Bĺk>NILrxXM7zrUV,.X 7Hj-eZ6vm?l_Ļ0z(K JGj;bku<օȕur6Ԇo!J:uN/dqã% U<ĜuINSXKDI ,`[i^:f0ܻ4)D"Zv8~q6IdPܼ7~B ۆ[OC3-xS`:xK[c'bpW0F̤N㪤I NByo}tO=`i3z?r ~_'Pe: ݓPW_]p}7 N£C:p[0dnWՂ= /'GcJӱGz`vӅrAJB|~N]n541+*|~Y01Ý3쏯7=Gsc '31,px h~p7Fak\?'xsZ_ep6%x|79`/sZ@9sewrbo2P澽Xl +Tdo1K\ƹZ-OBri<- uDBb 4"dmA(XJIhg+i$J[rZGQQ]IH*ln؊~dy)Ė%C  {;jXDe !ZВN J*Ȟ+ 6R<x=4AH`QAJi 2zˁkF$ @Dh0=vQ\7]?~}#+éKq`V!d2~ ˋ܄>,[1c}`:\L,xݵ^,w~ڟ= + o&5Mס/{@|V0bp<>ZC5x8{cr3{6LCmAc- 0UF0krb\Zjvx0<քxAN2r6ЀgֲOy.,5s\[Ƌ4Tt`aRNpȘ2AqDE$k<3:BQL6J(ѱ6"oZWe6u&S:C;GtL DWB NU˨6B~@ݳ;9!MC)#%|#THwXr QhGR$:uL-AxdW36I1/CIF32t6}QȺH/̡">m!NJY~cN'm$O0-dD2p$P$V`(by.j4s8{Zz:{ ձ (y Y_`ISrLfsq&AJ΢,)lY zFƹFZUdW#edGGr+1渌]:MH-ߠ] >3|zZlxJD=FK`<#]YMtyۆ81J~YfzpjUAcևźHByګ |.Yy%xdB}= n=>¢zH_M1c1h'%\4%9$]յP(1be27H ,WH,]Lfxj@d%}}l!ZYhaJ05~}U2zֱ2Š@Q+w_{C,u@d4Y<*Vʡ#T6CeSSZ(Hf 1&]. ?1sT'81g{rs 4Y&WqtbN:hM~Cw̫./) .ppg*}),O`p0O~/+1^ IϢrChMh>@m8k&8, xAE#O k5a|}  Uֻ<]V3Ys?YqKXC3&87~Akq2>r>9zË?iȼ83c$[oz* }>.:e[A}+e @`ԬcT˳y={E|]w<$I"aYN|ߧV188; {;=:Ldd2TUjNH`Jm  t:tzAa:aJ0MsǛlYwfqqq'\l{y* C,kڶm;y|n3}ssb';l6 ÐjA[o vɓd25 (I`G6 ޷ǷضrqT*;`myc{ H:եP!IGVi qa,WTu We\|M#ԷIQ%#b&f[0fdL1D -\!.Q!*:6DqE 7s}FG-PU`H" "A >R4O8H 4V ~ۣjDd:]$k&=@wj< o% Zh;&{ɠE&bk>FZ;H`:H'CkEdp$5_'6Ign̷m%O˫= +hKacu^"sIfcst0@1SWu8HA*`shT@4A݌0[I" >y`@Hݙ"V+M`[G {1 ͷ@XeJdNr'ps47ihie,0VVm,Q/ svx=&T"Kjb)TgrhH(9J?X=j^ |Y/E.v;M{m6#CipCipgWB XMN o? nex|åhwecVUZwG"#|zYS/03}W}_|:gyk0A:뭘ce47'~8ޛIvםogVfU]]]7@ D\@HlÄLK٣ ;d[)#Y QDR}_F7z_%͇l#RDCiBo2w3߭sog_/V?;_߀!}nB$[ Gb;o cN0\ʩdVKH*uI'8= UP,38ul[̭79چ-sZ}=~E:i -c?~<][`{/_Gȱl;x2I|Q48"j螗J5 Ay3^f߁9PAP\^DQ[Z"(# 4ҵ.ngzRcK._. d{TdCy5Ƣ!#[~o ųGPfYBV(J$='`;s +:V&Y":5u5כܹ %@fXGb`V{\{wCi~~iCsx:[i*wl3 $ w/I$91Y+G0eQxN`Fbj#1.G6A]ۦy28f+;ªyt ipb[")WxQiVlyC8sQHU^$%&5U4۷94/",SBdf^"#G$"A'=8Nmww@];O龑O}J w\/H&6'`gUna"wӮ CG 홋}nWaaOa8< _?v gяM5?.}9g<ܼ/wޮv?~`}nm&FX/gSwl{`v4ނ^/]#yN_o{վD<U;>ϱCNGnj}vx7VN:;zgrFz.nf@Gs_RvVCnw_#BR< 85l7`!c:;\Mp΃d IOᖪ 3'fGS{?5%\#fXwsLxz ?p#/'RDuOqGg8+ ʧOH =')6lF.^gx_kOBS*(! | X&2*3~ 7 =j=ȲB|x>G>{DrF\B7i3yHXCD%EGz;_o/5e7b:X~Dؓ+!}wcUv N0M!lfk8G?뤵!^Zb+dw* Lh xOz{}\_`/| z~_~0=>4g/.B& ?$LdM(`|yOo?U5Þڍ~NT+3٧#p`lðO??=ϊ b_2]{ٍ~={b{>BJoV/= KPLG 9 ?w ,GFehV!`ƐM7 YLr Y;ɃM.*Ҍv6\nVsHw/mQ9i+ IDAT.yy묧Ktfln'ׇp.g"Wk%|HylxI倝J8a$=9r)ҔMN=CFIf-Yچp,QU:]FJ$hq,b аUN QQvIJtiXz>{ fH"^lHM>k,* >:2b$X Jm :4?|&DH|#/sn5::;]66\+&u ^$!;tM/-SE_Yan@`IT%6EE֖NЭԱ3*r.m+jю bX{lt֌#ӣfrJ j W2wVhNIkV s24\Xg͵+?]۫>0SB [wU8^Gfut#GablS~ri GW&sbnd5HheVCfY0tNE#dd R(E*Q'fxu,?M[S-jq42CYqesҭ5$sbgӭV_ٮ :zEӒdsܶi['IB\>@gNe,XbCӓ ;ēvG(9SefɞlwЭ "%|d"M`K$6;TeEcVvaR+Q&1]$ns A#6T"Uq -cWWW9vbZ2lG )R%H]Kľ#JGW$ S8~S')iIb>a~zsvL`V! DLG?,۹!uӴ&e}gI\̐UAUh 2?GW14;̵򲿟N4=lmbՋaC Tr/GDS82H&m0g^ܦż@(iKT>-M, &Q:6NlN!a@܋ l6:Z ݈-f騈Q/ պMP,3>F!ek fpXx#p*L{ 8}>^s}yv9\XWwB_|}l?hb*tZ}KpH|: ݷv}6]_K35(4ms+<3u .-jb~U~i/F+o©ƺ/^K۽fr?t^za dkWJW; L?7\; g{'}Ge] >k|8 p||CH)xwB! 6ai~ [Zv \]Gm DsM.=EG]"4&_4r>EG3,Ʋ̈3ZFQ-^v>1s?3{N732/O YJb/-p`OƮ!Jei 3\nbMO2hhBnr` G 5ipJsq^uEAqY Wm%vK։倶BePА@oHM!m;Fwi^?WQzMn}3סa!cMpC"Qǒ|aI,`~m6## 07.$eF`"`sd̔G'~%J[t̐W3~^a9C3wAOE/%?Lg;P5+׹ȱ}G\ m)AvIfǷ~[c*z[ǩqa|vEGj[gyxCi'k:x}h|-f9u{8BJ~f+KkYdNw197FhWcz3h(w8DW3,\[䡫Z,budLJ(mgNe;~V{l&qLxpD>w6s\8EVlYbeV stM´IgEðLr9;~'lV:dev<)%gyW"KQskqm0BKC2 )œ w:A~JI:H=E,xIZ=E}qqH=Ml^˔*yq`B8bż %뛛jIh*XT`} |q?Jݫ_?zA2,3b wߞZTg8`E0AH/&X=_wIhm8FFA+4MNSWP] 07& BbtЫjJ\=j h["W4U ًV%oH 6#JC(ƸAҶ =ej3_a9eEQhZ֒wlUa*2H/>*#6!z >z,R-#F\61&i^&/skn3)`I?8=,|rLj2"[m&-pqhr~_oGD.47cO;I\("T"o(B!*Fak#vE@GP"v0`VVF#ǟ=f:k6:x92G0 *m;daiiRK$2Xcw!1&U5Aj^aRTz'i;'$Y:bl |CE<ΖB1[T%Ĥ[$&ɄE%<62w}G%RS)0@J ȔxCtQtnhB3`0wVJ-#ddS%.#iƼ4jL 8G =ЌPBS$Btl[FD"D6rU#XP6 bKoPݍ뜽ƛ̀`HrBFRhe+-j"dL;&Wq|ʩqDvmdG[ ZKY/WXS 2ڎ6JҡC q D+hK;QN6],"mBAv,ɐ/e2,YYQ~*ܴt{i&0WUSB  p=i+k'{/3}޳?&u0SI8~1xoҏ`Lߙ? ec|xlWw/|Iq/KMA7͊wAz(;{˓}BjߣSބI؆C 7nW^S}'( 4|O\m0;éj5o?ozz ~x]ٟ!{پ!ߒzr9!u|$AǏd+V&?ai,Ǜw2Fq|i1JtQ^w(dsÌ9I=wcAn:(T.^6tEN9 B泱xJ4cj(rVi@zx"g,Xg {pJ6Ol\ǯDz<|IVvt;^UceYD`#Vl Y"Al58 71IIu1j0;L+'r6{)EC>|.9D{=Ksբn7~59N{|{BݿKk=zuv*eN,j9r}7ó\EZ{lS ^t%ϒȤk|_JPt(s7pP{KDxv7 wfuKȻ.L\_}ʗT& {n\N|u>va^^} by#Ihjܽt/48"0Nx*wVlbL4hENK62SvP*S9MF59¼=p^+gB(gi,̓Y ‘ex=׈zXV2 wF $:^LAFN V(1[$%Q{@dMٵOXQjs^%C|6N#!#*$mD-8%1SGGxEvw7qZil^bҍИ8vWI(PAg&c}uy-GIL06=TZlPm1ݴmEW,Ď*jlE!B2"Mr"%ƣ,"S!`+ydOb8mXWii2Bf &鬗%ZZnYV0['R]=tCB*6Dl"KiDH@JA-RYyM5~"3g1T|f?/>3uuv/$5@Ũ¾N1|cJHUHO.xy!ܪ}s/5em Tj :E)؆ĹR΢3 )97cȣc:ϱ{-~b=oNk7ɪ23-U.…8NڠRN^e]7Cύj cpK66ڐPwA|y>o#>v~Ĺ8\Ykz;i_KU L xYwj> .}}&0Qgg*|_ϿLh' W/]pd7~cbԗr}O$# 2~Y#rk X@RS4-^$1dz&j(n1,zEct$=$96qJE2bOAO",1$Vw:(3"Ǜ'i~d#v4JPXc_u~c1apMT.=&Em03Q6 -E2Xg109N]``kʳw"gvDA];S ׊$V*tWi?Kj^c+CE!>B3fc.E :+X3$nF[azy&ߣ[hOpfEH<͇(rp13lt&O*w1:Caly7U E%1Hrfu1v7XA=\7 4N$ʗYdYM21gr^^?MVǼ zI˸^rEnqĞwtn8ld\HդV܎ @+@B2#:[y.Sfm!zFK$!᚛h[]:hy3;$'dޟ%Q;s0Ī{{?N־ơgsSvmDb3k4HJI$I% D1١^#HżsĻws|CX{G0]P{O_Rk,2m q,7nhטJ]ea`pΦayt"gˈ:FH7LTo#b,Wu ŀFODMw(&;TZI4 \WW1aNx::C쁣*$_#q0$G@$b"# $r 2'/vo [S1#$%)&u 7$c{&N`J]소,H%6z_= #.M-RDz9Ij$}cbdƨňX|K/DaD=[Xrt8[1'|Jj=ȝ17E'd?ORRT ZNL[>Ť@"\S=w%E$tU^Y3BKO4D>mIV7AKt4"``.Fb=,2_qio򶫺}e%ha!$V0 CӒiUU]U].mx3B ӻ3;sh4sC7><${[)utMVP0L7[xa- ]r[߂nj5 ]$s&4*5: zaԠ4t!pp%?aj jó e+ i^Y6tɒ \M䇄Qz$T=*&Iob-SJ_J v[iFoqBC{?8p^u{ Wm`X\] {k IDAT߇>M2o 8w9Τfy<i BpN -͋/-RKr E7zG g_Ȱ84CϹsJ(C:Jz<ѷO5ƀSXզ J,_: V wޞEܝfSt&Le'a`ggr7f4k[ YHB&x^h4R* ƫTYIC5r˥5 KYnDymc`#iT"۬ӄ2^g eb"cЫZ!U!ʃ/YfyyReKO^-`TSCq}zjHD Hg'!" AK R݈ |`Դ7g(o|2#;4&z#8h W aNCAG$Rx$X%r4DHDrrUFW \4|s*QTP"+8 {U "`u]vGT*.! QfO򶢇ɦN)Ofy6-[ ~N"pmwU.3[̋wTXV GOr˞%0O}<a_3gP,^rNI6$U,W$ˣv+VM;cV@JQ+(f8 <-S)!-'x )t4[FVR4E G4D<ߦ$\P;%3dk$ 1ɖB6\Җy41CP\(Mc 5 %ڄzSLd@ fm^a{A]=HcZ"f^橄 N&}A@ڤTP h#2Ea7PUEHZɀYs^(4͈NkT|^,PExaÏ=tͭaD Ɩet@"2BJ4 7 =FmC'fS/y{Ml@%{\ҭ 0_Qz埖9{> }$Vagٝ0RtOp(49%Ο} nW$fsk L Čjn;#Jjpq5u4طΝj,~,052SKbq8C٘B=pkJU"Wўcbž}rD X 2-~aV_}-v|9 T:`8cjtB(u0)F;r%!Ȥ$r6 %=)Nt,vH!/϶@؉)HU}:#ǀ!1طpyyKL"!!+"! fqSFalT 0";<Q#Or, Sl"6JFQ.Ȟ2Za!.Z|GE1_~hQ6۩*>_tf[8hdhi_yhT39fG{\-n90̣ Dmo$Xʗ@wA &3*3v%xX\ѷɍ2Еh7Dq ty<v2+rØ:F8ڀpC AۗCI3;~+443rA ~7zQkkh1vOcmU;0v9Ue65y|/Y "6Sǀ|dYk$I5[(Rmi,u>Emg,{ ,復4 tQZs#˜Ƌ"_ RI5^ab%/G錮b._aj[ &80Mt͒v JO ;qh^v)D5w"Wy| l geqE`zK y >X涼3S֊L{#&lO2k~Y=fX﹅KE%<kju3SLn-¥#gH]E5K@AuYc|?S|>NgA;Œ= ꏳU}Pl,b]JdD})O9ksdG Wi^b'<*R1["06&4?$u1 Iđ:,qH.M&WC>Q~ *@$t.+,<3FI6.Rݻ)! 6w9qWս\k"۝&࠘aBUUԆK{]{?˿qȍ)o3R,_8J$QB,#Iִ$e}m+`Hy .NQC )#)N,6`Z]Ƃaeۣg7HhT:e7d *9#/JZ.:ha|%.%4.At3:ZE l=GZ$+؉!r O ).Aì0,R##0]{1W %G2#Ez:+41FQl@G1Ew|!'dѽi[} Lߤ-FDPj y I2šF++yn,r mlHH:"PV#߳όu^:܂vp>ع$9o~^؈тLفf+qΤS;GqޱPLtv űFXGP);… OYWbC+W3Yq ;aP,~ϫ? ^w숯F3rmZiZo9mig/8gp K|&(0>"ሔ݆KsW*a4 0(*QkYҝ7skmVwϰ"tWb_G:aQwfTc)v]% N`\юKV(N4A_2F+:m/uɤ(no ɀB C/-}"/h_0-=モDyo4?cs$Cr"q5"vYvQJMؔPgfYq'#2 Ssi=q[FFSHT U&qZU.sw"_k1f25=|sVunaaŊ>LbYiǜg~cFwuis$Iб}a斟8o$wId.a֌{}k]Yzxf(o92ۗr@|Z: .sی 5n}^zU;>jB<90K׮qQ2e rt`]z.TΥxGؘ7kwG(|a}>WvH l3fY'߄<Sߺg ?9n>.++8/ˠZ}%/raǩE5H^FSNLcV -h!55@od%NWCݰV..F;nSV񼗏b|?4lFUN('҇8p)Fzr /L?)}'>]&\Yc8%rEEpE@Sj JeB]90"{IEqu_ެ" tBV\#Y".Z-K3j Z]Ƞi:^4aZ/BK+I$@VCsXB/Ұ;#86Zo.2H@#9;M 4[4 mL/:y\[DA і%H)B$uI6jIE(4X;,K6k}-Տ,za(2^"29C7R?N!y*իxMkM TE|Ǖ441(zW,).d*^Q1i&H%C׬#  |OΝal hS8Vap/,!9 _p`o,Ѿr&gc8_M'6Z?1o|턾$T+y&rfm?^xo| O\k[p!&b\nƹš-3cq?@ 3zd>\> w2O{w>z=z6دN]@р-5qB5fujkfe2o= 73K cgÎXB]Č];?Gb6w3๘9| soM{+V>xg[wrO1?-A@G&D^*^gZ/6N#G'!\y{#3yCiu0WN"X-]Gnq,@a6WI- Q[E0]0mu8c@o{ARmR )\s۝~HB7T48e %C钕U]/k{`H$ϽK_Yڏ'&#xK"5 ?`wR H&!T@/h!682fpG6 +J{ 9=>:-.ˏ}p'=ӿlW/Ҽ~꫸O5b9B(aK2o3 y^OLlL{j3b{UNG _d{KO!SK}koT**]FZʲa2i铔R0PeA#^+6x>HOkZ &JI)fqRŢH96+[A][‰RՄtxAO#wO| $cGI/e=}[9_G8D%޵;d9/'hX)p?EQtT]4yAz5_qodhSqhdT>>ð! +4{O[ҟ\ v>t9AnHt~|;)xH%Iis IDATJ@=[/G e;V]E,|sE?1D}ᓟKb7i8RhࡇanHdEA xrw8 -P$3X= >uv@k? 0Tp}񾇆L 86y"̭ýĎՕ}g<' 1hsڂ3Õ:cGaSlu8q pl:6e~= ewٚ3pe3Cap[a؉+)a5wC{G@D4>_= ?Iϖ(5|n9}`r$pP"&Ka_Z5vj|#04)4N9HF­#5Y= K> @ Z6[%\+f"ӽ|]Ps1Xi,NqüFodq,}xf6/28.&flKoX'Z"ߓx-E;nB^6p;+<\# t<7'lCp>u)* [7QpKmd$dk(IWHX;^\~Yϳ,ml6Wj|ⓟYX\ǟ?~r,_8x[i~7E3wHi]ױm24.^~nr>C6iF b:k%Z]ܜW< r4M\W H˖ ݎHce6c`DkYGq:!aDMdVN'D8[')%TꂈךlU4,ILIL$cky?e^$DE@kw [lE*ȳ(;(U SI1CGYf(1zR)@U+v ^A1"]qCs\a##FVuA1Π0@׽fFU.-W 8BNL!enp[[R2"4,s/QSlS"|zYD2@rDZRϫЗ̲ݖ0C$t^KAnXzfƋriTO*J4HΓS4ta"\Zga1 +I<]%5B56дN'U!!1*a.D#Jdn'VAS:&Qqk T 4#cŠj԰a6")eRdsh=&)NϒL}WV!}`h(l|zֆUB,ڛ4c7CU%j+i-_ŷz;u,S "0EHNR35TU O: 0uz#\$$tXۆ5Hg^30~29TL&fH&d)hN˱̍aAhZ4x)yG x*~=3\/] _5Ex߫`]9ëK YG8رȁi3-A(qS`Jߕ?e: tӴ˷|>x }fŮD4ce0pwrFx0?~~ûƿs0 ]j xCb+? 8뉋Go@矟L-$yzq7݁ Z;ۼ2Z;½Hםoxvh71]^Q.oP^=&]]+sVq̠,57![Np@NQifRa/iݸû288OfAQ9O•dJEK i$@Hbsnd.⧁H88CSB[ z]ܐP!Lm|W"\l' DqdI[K&%I <:bHg;+Ureq|b6GAI2WdlM w^6&U O/kMh0+'YDA]@G't*̩] K,EWi yEO*k\yw21>͟{KStsz}; H3#͌4$Xe {kmX:zwkA$KAҌHo7v>9=`5_խ[u>9O99.]~LO159`0`iy#,&'<8rsswsRk@ae jAI5 ŊSr01B- )*lH. 15&x1CAnP=L&(MXdנVD@LP>=t8QAYm ]z:I$ f<];HGN<`$ءVqheꎆNLO Uœ[3U##Y%3Mabl'OrdfƟwwஉ={nN^f<hR8&!'Oɐh]|S՟?g0P"dkpPop*|뫠07WЇ{MNaqچKgjΓ|qOtc6p~~ slHMUex<uphǯ&L?S±°Kg`/F6+C/ Nn^ .݂P)hU7TMxа;$0W2p`>I …0@ \ so]7³¯!>}.o~Gz}v5.8sfa+w?|q8c!M8>Af뻩6݌"ӄ(eKe!4o{Mn|T9*[#~X|'7 )g{g/\[={'XL2~CT<jا_(w~!?qcϷr8}%*8gZ"K^#@0 D!;:X^ N=f< ;&v.QwkPDI};,M8%T ETzA|@d4b 3! A/m t&]#@U\D@MϬX&J$rHV+;p((}!HMĩľjDfݞf $q ]tiLT((٨BZ:>Q$ SPQ! TܖVAǒHQ@됓FCiTƬH⍢ .NB,b{V˜T1?" j;b#N*2#aNG| )$>`:v~lkdGk_3?2:Yq{Z{kE*q c[̖_<άy|գ4?Gy- y2 NJ-/ƧOV4c*\ F<,PTΑ׈g`iD24֯PF{Ujш#~:N*Nf ϳ;&?Cꈤ"X]π Jט.:D_5%2>IFAO\!;EL.QlgQţLlt̐@*S$;!/ϢY~&@!r$Z mEZ N?j뜽NGn' )~Z # f]R~m>v|hrJ{< f-][)0|[?7Cn G8l(g ܽoإmtp]vkEȏ sdž3_^ .\n>4,moM㇡~gVgW~ñ ?_ a`:8L౧!xwEҝ< _{}t==l5P/aȃxՁS7ma fhH-v { T ~ O5kDU%_Y|w6a!ťG[7\&ק Vxj*_ѵ?y)a qO1+!XwvI ɕx,~;h S#kfo~Q.!~[Q/ŸdJ,ϱ\aft} qqMQ:b)K7b=zv %}BPuQF"+S34Td+%hDI€BV``븒D&f/WCʦeI6D=f@W39DzH жR;k1z;zes!61%2pR)AtHWD %PЅ=EЮXaN&fP\0( Ŏ`fG4h}HtLtS$UHLTBGv̌Dhd4 0 KLhiF6WUD'xNdDf "ٰ1y7P't16lYJѧיdu=vDk;I3tThPC$weR [b~~=G"#Lˣi>ƃ.ﻓR޼G|MD\0#z=Vwĵ776Hif\=&]+0 /:l.&5.;lU9EM.nSodo]]FeE7#|#ErP- IDAT$"ݜ#-4PgkXF>t Vƿ}g %1̫L3865IgsvUU$dW-0ҍ;- N kI_Ε$80Ch쏙< N1 _z͹{ʈndAʎPc<ˤ)s~K4€9yfcqZVG:i}Zh:dC9ϝqe!&ܳ*1fpO}*u<!c̭ikRGA.?%2o?&Z{'kL͸H~w\4,ˢ~Q~2mOq]Z!us|ϲgn;NKlll|GyPb)~ ^D C-G,GȩDʠŀ: JIG ?`:WntxGl㜹g8%vրU88_9wHAҴW밺 h*4{C`߃;] cV֡߀gw~x r1a$S;ooؙ~|ñ;yaʐ6~}rI}K~ Gk/|#!Qp2XB$N1FƋ"ԙ `T{/{F'hl #pDN IƢfou!rl)%c3)2.B9oڮBQ"Ttr}8Bӊ\n2Өhh[J'(l"kɤ[7vC@ iZ{yh#=AD0lLn/!Uf84U;xA^ 6~*% vCj^?W&w'8;O$OI$Is߱sϽ"Y&~B ä[b"*i#I0\) IcdFJ,(HF 3ؤi|D(uhE"BI 2*FHҴ ;fH- Y*NR.Zt,"Gl$RA ;HF*LtF:= Tb 1\% O_ {)18"*>b wED=@LڀnbR{)F/Pb态' :QmҊ֠dyj.""-Ba[ڎDA-4KX#g_0g-UMUF~cN_/L6(;XA,*4n 24 &D xB[6r0同'k4>&8 qj)ndyxH9c / ( '*FRžsȠيɇUXl(m+QQ~r,Æ$l,x3R^dzw%x@ĨhesLC$L*Q'&?c= ,ˌ YŇ{Rxo:'jiJ ]ch UBj'hΜ+ *<0<-p!KH&'a[pp)<Èv: sա#o>W {C!:߂? 0<`^Xag`qy84h}paO0?z u=1tcnn)я9t~nv9 //ƒ'@OÓW`-IU+c ϳn}xaXA>S~xH?m Bvoy~8?P3O}›{4`A.|NGgdvNx- :~\`T(NyJ"ptz;[Ԫ3)MڋАxN1v% #367KA,WwEffݠ=qm++\.g8Q|AwUdoCJ]J*9`At++_Iiϟj4k &DHu \ &lBFFW%%<4TXu=s9"V; b-.kX~-9iEBc<{5O9R-W ԯgOr8?ĂpV(d\Vح6U ) ͹)qK2(Z˴7Y#1b"n9~$T\.{[L>7T- Klz%# _1i_Ӛc.ى . {QrO$DbIM+ D $2ni؍(DTQ|Zg^̱;[5uܰN}f*vivsIޔ؟>K/x3D.X@n$G[e .ͺZ='^z9¥?{x qH(̐j/QYtMALLʌ ϶Q<~+6fE]IٛU(s,hWfSvcl`CSZlw$$NH^}l'>``LQa+':I!B*x;Txm.SD2}tJ## kEyU哦ԧ!Ej oRjYo5od5'" QjVk!,.z{$plk/jBBوb"0а s$=img ';a1^r8_aݻD~r^DFIK !Z $ H:]IQz91@sC A e;⦶I;hnzf5]7g0񪷻^r9t]E֭%—>n-r~>DXdeme!"_˯=t]nZ<{9}{WW^Gc f&1dXFPtxa= 5^61AJٔ.Ǵ~Ȯ8YXMivd#A+I(itekP]YYN#VA3ĎorJE+I*CnGmHJSc +t]tKF.3R:AĈ(Č*noDzD)B^XCR+89!GbE<"đ#4]$.]B0]!#/ECl1FqHBϢI;HJ5Tg5 \e1Alw&>0UZNsz/g\8 r$e*hI50>u8"xa5Rߡ]=^K"BS-c-?%D})#ƓTv| %Ѩ*]ZA|Bhub"}ؕqEY`ep֨5;OPu=菍ҙ,pOH#*:r F/EM̳48xSD:erkuk S74>:ۗW9Q>z=ydwDʐa{4J8Ek4fkr<\J_% -FM=}m>i[}g'aa 5OٳģCۡ@% hC:= Ͻ ڰ#P< ;p!KXzm@~:_`4Pk =N׷ nCGނkWᩣpe2̕ACw.^ ?W2Cm[1ag#$|4, )..4CӀYςaG~ έCO p[Z0&|w&\yZa>7\T|\P^o;oX~S6زc >n1Z\gTpCԾZh[+\|d41d nf* wE^H}7X*s-J7:1F{!H\n|{ƈȭk=J{L*T㇑MD}} Hͅvro=`ƱY/HSc6#yhz'^c> v D }c-3}̓3͐V aJ%72N}z);UX.KBW;E,;QJ"7}L+pb}A^i!gw $e8Y aO3vu%F]`}9\u\H~HWTU4Y{PB8?0rB`"bڧV{lr9&YԠ.^[zʵ.^Hgj4DI&z":f<2*Gg8̟2$7)Lyqatu@l K .Fd4 {2A#y}J!14bKL)F|>4Wn,WJ+CjC@Pl"dtaXe4ػ>'7y1RMcvr$H1n{l_a Gik1n'rTdSc||?=678yo/ !iqG3/}ei1@Z$) xcAF/,*FDFH)U5wXk{foׯ^)oq+JSG-)4v(:+ Vʉm0%m옋L 8壴MT(-;Ljߝ'(}G~i /|y|G?09V9uUȶ:̍kf2ػG0wHw xX{iZARJ[%{Χѳ\jqs6uwLN\| b/_=qHϰX9#Tˏc=EUa0B >TƒW[XEU9*}G5EUu~ If:c7C|Z!rDDf|oƪݽD4foPAm,//?sםmo6?'M&cyo|e>ꫯŶ_y;No S MP5f!nP9?I?9!ijHZn} A%[c#n!WJT&(m="PY*$)y9Z`'lF(I1cҤC0hS':vSC@!l(OGt):re9EVƥhhYSE^T* &[^9- i9rUK#*s<ֈvUT]4ƌ6}ʌ#3$M#)[2Zfbj5fw"9ͤlSW=V6N&WA-6A=(sۼ:=|¸nBP=Q 'J1>bdgh*뺌/{-n6J1 8rH3# wMv%iyFrM-zI<5Jvz]"P>@JcT!RBL" dJZ; Ly(Z TFtkt;P\_E$Ep&f*?#9'enL"ӷ4cc{-J;{H v!6s0Z[`8޿ ÌaAi(//a| yz߁w}P 3Gst tʏC0yM@kG~ *{a0#`XP[VQWl;n_oأڗ P3{A Ñ x:\[T(pG/| jwRŝCag ކ왆.}ihv!XWt{p|{so&. c}pή\+[&̎Ľî|A_m6b~?VPPh%u;O=Ggd-C6LRՍQ{j9-d5`Pv_Ze.{n-jrƘI,SY!f yv?K6ƍI]']!BZAkF.צ\-[cl닠:7 5TDFRRK#c-΀3y5j]WOܞH؜ZÍ\.U\\]Xym* NBPݔHU1\v^~ uE.P-Ҩ`o7AR)Tns#*hY? ΆMcBu3,l6ʼgMs ګ5uwss1OxIP~˫Ȋ@'AM!~w2e Éhaf8HrVyg{9_q}B4MJ$2o6 N".z"k-"jvD¾lwo\u Nm>!Dָx4J Ip G_X,Yj|l+H6yd'NPHWHuM#*hz>fΚAz2s8zhoDB[_khhdb 1>tacYBO%O[9nSK8vo50s9 /4|@c}YmQ|5nƍ,۝ޒLNO2/۸kYgX9Vt 7 IZqM_5M32? Y柟xPD_at14yiGX&"wdJ12qn-:%< t)Km(`Bm> ,&hhNÂCbv̏dqw -2T:6o -eNR@t:(QڢgN1y)\:`DZm k XR Ӭ`wk <;??g0BYmఏeTV(:x^-rD3KdYhMPvC:4B94< >I4mx|d ygWao| NH?}Ɔ`t' L7k#^\`#C^&H,B=`!wj ᣟ;p==I}N%;VM(̓Qg;V Ӑ̀섛j ķuڑ\,<xtƻ}w_?| xa>a|c9cyCW nB;;ֿ (D|=_=/X KPv|@fA g \q'2'8S! _EApZ(RI@npn[!\=p4Jy^]0LlnjƤ~IV@ "7\NBP;8+S 26zz41]mܥ& zh|bMkP6{EAS QMP0H9Kk*KlOKj˹LxFwe7m[MѢXS9>N_^e %uKD:5S@Ul"Vn}ˤ]|*/`5JFhT9]e,E!&hpyn4J ukxBsM1 {wR?hGU%hexkvGGV`.jX+8la}SQdGtgGf,f.8~K_&3I9P*kuFuFqiަ靤KH%lTef+ئjSh~l50-tAO&/qEJia $[a<*"S݌$$Sy~_'"a{]* H`֋ot#56mÊ/_"k^i4%!s&BV}'sȋ/s&s^ywH#dz=m 895ܞ6~{ 2unӵIд7*& r.ܓgg9ε|zVES+ -_/%a##· ,2M }^o(opxy'xlބ aE$d+4<>"fu{F%qiUdɠ0"5cFw"3&:ˬ45 ELq9#\Ews=3Gh_ [ʎnkT k'bm!%P/rau'g.RPP5kwȲL(dh>c:vWÊUl5H7Qy2Ϲܮ,&uJ[X NC$mhHf6FQvk+94K(w1QI1-|!ⵙLB1m"TpĨXSZDe#.nG7ᣒՈ%2xPjjAQ=b Y@|ކǷs"w_OI4fZL].KAl!JMOt_WYh j6% _j{K vz3 օy<()-Iˢ+~>P1Tɸ]wWMYtc O\N A/b$l-RqXRP܉T`V (:ݮaJ-4HBU!lGz9C1.L̬*DJ\ds" EFGNY9'hM$ 2]oc숢R(a/vj(rvƖJvE$H>Zef*C.]N'va &B+oRj_lT|Tmr 8] Q,U`%4B",  F n\q͓$t!d=(1hWJ4q?v{3n$cٱI=(jC,7ΫWӅav_8 O wsq(˯x/,j#.:ꈧS^B6 Ǡ$.@#WP P¶{;5|F:{F::ٗx}^09Vu~aex%䆹X^ 갺NdОp'\L $^70o݂_F'4xswlu|ǗNՔ,uW <;I6-Cq _6\ F{`1-P~*e 0ҹjJU`dXL_'8?0D`H0uRB"`2GpU5H?)@hfD{s]s{a bbK =B^aEcHoO^vG'F"or5҅gW<Ń^ tmo?2ʲ~&L-v Hn;h- VZLy)nC7m|[̋>K`TsŚ{RG!74Kbb uɺ+l"ؒtXWBK/2]Xa >EbmR}=(w`i ~&B9+Q\~V:+3ی3SPYޮxL@2T;L6/ oߵKBWH@4Ȗ3XmWa6m,{O Ν!O.[͋ÿCn\s dZ*]}p`U1Rw`k֡fg5eU(Jq{tn+ފkEԍ {6jcnnX9vqDWpVZ6宣Ԫ[MepV6tN֔y x4mNuUUessnn]_ (i|%ϐxrƇM;aνu丆O]awU^57q߱i+".MXJˤu6PḘwoukSKHH8pYJ4QK,-"N? ̋/5зDiX鹌>nZ@9Re~k7G3R+,]຿@ʰ%3#ya-Vc9`JI@5|'nr+lt9P}~ËŦeQ;_R/=\ۻIEE*9?z6![]7iƥs)\.{--z7FmsBHTI,y<쌠7rXXvSG44lDpXm<~JJUAU8!ʭ6:f]HjqjuFsY i&b+B*P ia(ȚOYSԛ06D NG`كҖqв@+6 75OEV=™&# uɁd`VKo]-eczsB̸`,ĬȒ tOuo!?HNSs6L)8?.D=נ=qzٜl& Bn¦P\&PZ0d'e9v>u k ;FR)v v?kW@qv$o r; QAq t oNB g߼鄇xlF:l{A } YHE+!7<_4|'dvA_Wϯ[o@}"`K'0hIx雀 {ܛ{m>|o| ~\|$`6[' ?{ BC6 וe8h0;R-B'3O>s_>MΜ?/®}pǿ¡#0{@ˀmS.۲#dW,\r \b/4ؘgihptc=D. GEW ":,ϯR_e[ EBvP&YYoRNK^ba$˷Ywm$1vpE&t? ց1 B+CNUU0< K8]ԤN6.3e fH+ Y{qZE)yvߵsG ӇV ui0oaH*J>QZڛ<9B^!o-G2;i7StQìqWXw0QKѨ 5ʚ;y׈9GtVdn#86lhj&baDMfoMN>tcwD٘k\`ė"j#m80 wXޅ'o8JgOS*iHo"w&Dv8aBWWV1x%+$!UW=FS%\`7Vt"6xcT<VYZ#,=@8cl( ! +E3<wKʼL ѧz1|f #0K#{pl {Ps9zTR`,hw,<¯?I&Wk)W|''9ۧp;3ll\c,z>eTދ'|ޅ /?Rz5|1|7pqG{n#9u vn;jJ5̓GZe szqv>ɫ2yW3_I~4WrWYUSG)y`.XT֙v,x854Ogo蚌ebdÂo<;Vr5~us=Sr#[AUMV9!רAJzU#f2q[M0ȆhvMaYatyf{]0WA!ӎآ*Μ&t5׎УI*of"X!qB6 Z8,Dgqډ4Ҳ,튏9귇jԐeT8؍o[~S_`'WQs2vAn&AMʱÌ)vXE(΅($l(e{D,ՅiǸNjxy?M"{&կjnkc/>f˫~<8>|^m^eMF沄ͫ4) EL1eyȤ;,4.jyv{v~UILAr:ŮWoA8 {zК^\& {Cj#X4VfH6>UG_3n BjcRo|X[)ҕsEJ1T//0`1 IDAT lЭ6vI\ЅY8gϑ Gw;~$bIÎprC P]*iU 0EVE4kN?NWmӭ5I/!~aF;@Ft`NOˋ8بI0EjZgY ZY:rwDp ̵;)_uӹ@2zUlt/_&:v97σ' {<-`a vo>{Dtdzr߄_ ;UL+wwꚾvVV<juꦆ{!WK;l で!ݹ=׾ h*HtF+^鄗/wv$r聽;_? j>H&|NG2?߸ܑ'`8ٹgþ# pg >t~6xXwzt(FTlz0\w$3008tu@O"V+59k.)9a^*ۈI^1sBO,[lm\G"+S,7ٶbjk\˥[zD2Jju\ +5};׳% A MT81Gsxj՗6db`zF Dn6-L1#: ٲU\cb̗1QZ5qVhDtDJUCPQ6NarN(mlE/P@sM$)he|6提4y[?bjy$4t6]kԦ[Fj(obmp(SûPoU$7q*nnЌw fd_~EGMfϾB+U&Av s|[g>kbha;396T m;>Hpx\CRgY+S .fN9۪ mœx?Kvѵb+&rPgu6(9 rbl7./`4Tǎs9hnxQ hs 6vm$nl̋'9~?8&+"eӅr ++: g Ok w羌Yd3̵*~lbBuS 8r6izUýnEO]JɸRsSVKwd8m>5Ş%l מfy;QhyO擜?C|pϡۯo .rsM7w~g.ݜp-ȣ'^ٷɫ>Lۈ&Wq^8C|58v|Sww@)8`O /@ݩۏctm*[nOA|Nrɖnbk+&Oc { {/.M$}1r2$>UBQФ MaG4m>T +x}H`fqe[̮! ѢcEsUY3gP8\Ft ^,bm˃P$b5;\fۃebM QVInuvve(J.dQdXZ /3[ŦkSs@rj3U{V#s;iU P vLӲwvH-u'nI#LOW_VʜX1ZM.2w,L.p "슅òQj Z5Ƙ,G`Fjwgj/mQ=B?WKa;y|9r+K'8z?zoz#8)'0:3>} L7h}7=_㹟'6 ~2k|W3ONG?M10Hy^>ٷY[۳*]_`*'8:,wg{_|e0V;rC.WvYcqy?Mht+?k,{.A*_ jOGgͯ]&T|#l}EQa_cz0_=8ɏf n'G|& W6ދ8BG9Vl[k7d];oR;o܋dS+Wxz ziN3}00G-Y4uC&ͦIF] 5J+jiXYb gev)HӵJr)DR4$i\~KAV=TMT[ x )!I bb4t[-xı~lBEQ(Ͳl/`9n˕1TEotvqmxew,A=fUH~Lݠ8Bzdru -A˲20n.Z"hxPq6m*3+-|G4VZn]Hc8M&@?ᘃhL'p 8N^F|.*fklO Ę?77Ns4lRp8uZh /@((NeҮݠ7azf`R$0T&BNjN^0v[:Mmwd3Fl7|-xpuxstC'> ww|s&^ X.s'x?8I~~\O.t&:V'˝J,ec$93_mw= D+D\Q+VX-O:9DrqH,ɕD+A v3q=UWwy(7J8]YYe=<eMwQ"i6xCOgJ4$C.Bϭ[o GPY ZTⴴ,gp]wSVm$۩7Z&NPfz$cIM0`oX؂ R*G6#,$&bsg{>p-bJe@%>Jw=x;@˛Y6^W9?O".r+~x_`X`H##M"M3JVn_%q7} ^AdJت ?'ZRebzbKnđ|`'8̹9$BsNB5,Wo/amsew{xOyyW|`y$>%>jy8˼Ζ&v ĥ\^!^s)^`#_HD'[v5ry7/͒y'OQ^;_bw pϘ~j/!J[x,'Roc9*w⮵ /ڻX\ 9xpHE='SO3<0*{uU}/܀4烃D" xHXӍg*ю,ǂ*^jwF"_EHnp؇3KO:;|m {p*}q6kK ݤY]-P˲%&M eM=Jyt^Y YѽQuYc/;wZs7;tJd^piՅS]P[^c(k~6M#1F/]bs-B?Jth^v7wɇ~G9.=-pQ t?Gd>jePdrl'$&G^/D*Y/Yy,J)QRJA+qPZ=ڡ@4]dy,x90er /$٢bՎ$<Q4, G:~)Bǩ ^![^!"iȵ MI)P\Xaۇ(ceXU݇eyhV H*i#qYa][ 0:YG`*b|5PKE/YQU8n) ka4 N=O-/+/\̄Plům`v I/mO_fĬw01ujù|#*&۵ r8l4UP E#ǫ}G5zaNAjSXfhP !G?0wv ~Ģpns oVˆ]mЖ NOx绡fwhS߇t{,M Rfo?2|pu ˏ͓m֧$ pd=f˧_m axu8[P_g`W- yxǃ{voyx[ll fC!rY~8sP!X*vW eafˏqS^l%xf+REҘz:#![Äj~^ TIlo9x:lrs=v mt8QR lUehJMgW+JNd2QX{un}$D}/wpi'Fꏸ,1gT&V[XxHzn4lhQI\嵫й7͎p&2M7_)^ IDATŭ B—؎N|g1{)>}r!-AeՁ{NS]"v]0r9p5/ $Q#rWxȎ>綹4E^[o<菉LbiN>;M/3x˿S4Ł p+?dtc(0"~Gb|En_3tkd/o&W{^r[ 7bD.r9= ƤCln{"J%0?Gƿ+؏Ԛ4%QvMZHIQD{1..ee;dI0S7َ(d| \ƌJ0-E?D K1|cx@_Y,錤T(ͦt*3{Q<[ 2kݹ~~9A=k ?с滛\m] ]`s3NpŘf\,ecC>z֡G qp|Cebxi=֊ś g8ЃHeF^jZCCdAli,M%aCg{]:P$񆼆LOyNB$DE԰ U,oQHG (6R4ի,2J !'#7-ˤ)hd|6ej2 bsP䩷BSR[!(؆Eɑѕ$RD\ f!}xef!BjqEh6us>,ڏD ԏ%qE}D_2&O`PUm :u^EohF #Bh[t {.@tjLݧS9t r f~adƚXSµ04{tR>e3d 9AI1z'cG2|HVnaU`v AVa'(lCj_[*H Fc?"tcnVgj|Y?)|"*_uWS݋|ty joy{\^ۄ{vAń_û?G |~##mA]&~I0:3afݿ.U2Hv~pt{7r'O]jpnhw:0znf}<~RwMmf<;ԀO-y|ol_[g{Ϸ?sx ԏj۶']]Gw\]YbdlO-/@cXU.Noccq#WNhD4C v[v}]Edd2q_C;Mnˤ) !*7kUIM{f5Hki2 9}aF+S |&Wr jW\aS2 l"&j/J6W65zIA7I螅4S9*ky|B`zBG+:nTnb64Gʨ(FUi Y)keNmQE7uƥ0jwjw=$ nKJ:j(H]X4: V>F>FRI2#2"8Ӝ?8rNN rApuJ-kVO!&$=E[Nl#V%<%&` )2d\CTU#xHѝ Auqmoc5DBvtXIeSmdY~z]tq.NqW߇S-BڏVLU;'~!hH;]p29/OBpU$=|>>7>@rt?=0_Y!'hep6B-'\n X"6|5"Th~@lKK3A{G,->LAGJEc~qn0Gw~%ib{HQN/ ѷz_,́Q׉X@g獵Pm*| (s3W[ Գ+daEF(s:2G.?F.QF`dk|`,;D!Օ!N q<>u${cWSZk"#[AU錅(o"ϑ'H-\w%RuiZ#&61znfQ$9u3Bء,v7uzW+]ѹgg7WDzAr;Ķmlb}mans+c_;AkfCGȮCw/ @7D@Cm Б68FP;o- i7A4z4|v~xx'p6n{8 ί@HJ B>|tBЛiةk~dEm<79 DS0J&cw$W۾#7ணO#)3cYL/ }ڬ-|VuțUv("m+1;8 6p >whok&+K-(V ?/ttv-ܘ1:~[TzEM i!'T;iE"Y}lD jd np qIF8>@%/rb,ƲM$dn{4M bn'{7EF/J]a.s kUb/ og$M-ًn|;kq'Xk?_*2yʸ !|r$Db*H0wyЇ^֫|cGQvP⪋ߨ(-1o黏֛KPljeO4GOX\rkRonn( cc?+yRCIm6JGb|vn*,.sOf8<ֻyH>G%Wv׹SԈMnpuF'z'6WTuקY>_!\m]"hľL,I4ҸZ\bh'00{rtds~aSe^m?Na8Yq|ƮC>}ckKh=>}Lwo)Blℵ20ލM !6^؃~>Tlz;ˆpRO q:oӂX×ґ=I%%}m68hS7ר6hT^ UtLY)\Zn9RH=!BWL4ѝ5VZ-R44vH$Q.+L\]EҍkttJRl)qd(SaԖŞ&kQ63e1:5L`)JU RTM!WGWЛ"qvLDJ<ыItV8R/MHE–pXh}:ZҢ%48͕xy5-C(8X /tidzo*A`5ܜZ{/rl$ T"zy7ћJEg;>D̋7RU~ ΂ADPPw\[i4v-5=yW}8tV2m壓"Zoܶ3$G~C|hXOp?,t)oisK/xO %UX!xam/ ynQ?,nAG{MRoMi3hFmg >vQ?#_;K]ݳ<#"36O[carO;ףϷgDth{ Hw`:dw5h|1ck["OG)19֕n[xA8$(&r6.}iZ Ye+ NDOd!wOIZՅ*˰RA%4~9Q:Ev_>?ϻ&6i4Sl\IgPIy* 4a!RO/83XjM%h"qAb:YڲiCQTd) UMS%uDO6"ilAB4ܮhӴtF0Celt$]h!:6j8'>%,E;SiTqYj8:ಱ4C.! CoIezK.W0QO~ 졫ǎ'R"wdD]DK?f m6$ Iu bz2R JJw6>ޏ&j<RoYhZXFe*-=Ǧ(ֹ_ #6eGEP4]= cdo$&gw ^e{'Ʊ,L?azkeC]/sg`9J"byp}(stGE }ӵs`?qwwI4h5 !؊<$r7E*k$ZMj߆>bӕp i^A޳o3aC:;{4v^W__oS"Z@:t_l21;V{[r&b3=k.iˆЎ#D4rgG f pT²=d\^/1+gP9T7re^.le1ԍNǎᬲe.4#\]|!7F~r.HG~FF.^Aݣ留3^r9Pʲ3Nd'cy/!ݺSH"u:i,gK\^qɥmƟ^ ^'v4Mz.#rFEhPd>Z)!_}_KNPo%هvJPwf̭rdx"cr(skӼJ}NnʴMA,\?O.y2WUJQ4mqI??%>W'ejzˡj ^Z"BG3p7$H,7QUT*+9V-iɰV,rƮUIblByD%'}_ p1b[tI~A!r3WIi.(#FdkRMBbiLs/o_G |6gVr:H52u nb بS=-I-LIBM骸T >k?w_ ?8bf{{,v[C|;yW}tuWf0`xAHJI)hQ-iʒ%+%˴e]+x$@`.`0]UU]w! Hg'}$8:(ٹKiE(s2_D+!GRXd N_IDPu"0t(7C$X;,RTT .zÈ~"BTFHS} SLePzRۂhye8:njc/op-·(qrÓX̋)c5&er-[~ 6v0U%P,{:^#Lsk\NԼ%FzUisyJI%XY'K<˞d) ;WX6BMI*4ZۙflXTG+l 5,S9׆4MJRFv . j_a : %}mRR%Lu//PNm\,Zpﭲ:'fEӱЍ4pSoJH !N%!m vQ']).86qnr@x2˪&J'SDvy!<δ'f8~laGL;Fh4h.![TS&iYbbPb$(XN ŗ۵$F&DF;JLX]-P˴BH(@t1Ӊim2rvI!.XaҴ$ ,WU,A"6X! =4a)6_5{zj[\~IV yVrV/ʽ%O492c5TCh5dQ쀲89SBeht-w;6BaKn(1XSĔe*927}z 7s7m}o.o;= \*f'VD~>hO/ hjKGN~_lNpi{+_$|`(vtwaqH12!jZ*!Dޚx;cSM|Nq1t{nfyvc2fb#"cc}zGnK|oY|~n(߹OKdskykX[GRč8Qs>f%Bc…u$E3>LGxt"̭?"/Y_ax!#s[ƭ\ߠjܦsL?"s`gqF;TgoǮJ5CܫgR>BkHA}FƘ Itx _V<ނ|cY>Օ+Wehh'G[;oCG媘Jr-%cQocKn% [ H,Vģl$"WUvɥ \8VQ#q'lƊ(u Ou0lQ++Y=Mj^sنxƩUn`XAKA*FS%9Fd?< EQz^#wװ$ Չ*uM#kJwvLPx_ޱ¾xFo£/34>7%ȷlj]juQD\8 $f #*rϕ9xO)CDmm_o3tRc;#vMѭUiVdSdWuBźbҷ!9h:lsLMg^뢔_#cɵ-DO\PJ #P]z*ZF3U Z>@\JΠ1HlRlVd; 1C2lM3^AyyzUel~ۡ#$M2Hi=$m J['"k3(n։k4- AakDMrA!Sh@1pBjpu:"8ХѮ5f׹jDҌwrs_/aݠ6tҤ2d>Sl޴d;?G6lObQ _ W!jvCg' c5 j@<4g̡oy7|޸X<[T' w2?KFw : s*6ȸ?p+dcGn L; x?gYnKw^ ӁX w3QN^~ ::y2y02]xjKR r&LJv@ыAᇷ?tw"C Mw~/by8-]xH-py)Pl n̂Æ0ߙy垴nYaв N]W6k N}V3Q^Jf!lŷtUA$2=( iYcE&8ly&Mوz|ݵ=ujq\Ъa{!rTƕʒ%.N":pM)p$*t 6DIU ՕKD+̌z,I WZ("\7+B*jXA4 ;!V)LNPPjbՋj]&\XACh %;̫EzβLZgbH^8S'9&#U (WJq h(L(qkK6@(.5jjOlHb%+Xk ;="1V(ixUvFTh,"b!1FK#H6-j `^ HX U9AE蒊@CITQzAwOXuYi"y!"`)%M=ga z#2"-ISc=&zCRj-dͧmkV]@4\ξAayݏꉴB(;:(0zVF`CHqɒM&ylk"!s*,l¢Nim?ڟbNx`Dy擗v~?t^9Gx t7 ۽c:\*R;i9^z 2El3D|wte&bER#︪IbEv$?2XWVvPcsI'Gr_WCBNDن} # 3gY]QCuFv&4N},Iɛ`xa9nq_z\ܞbSkMvLc3S#,5:oR Y:@]&6J{(5۔6ʬF0K9m]o;5Y)=dn78;=B[mT[9vy[ص~'yBC,%r+۠~].Uf2( +i&Q yO6I=2~EwsǥI1K8H3ڵ|K Vq=sAØ6a'X$O$ĺ7qBmQr-!$uM9J 6BZ+f(ЬpCkD|-f o,'] G2tnTzWV6>Y㾭i4]$׌.n=;^z'c+]u(K8β#cjpzobГ}cO$ӰtGbaNߑorI:8fks6Eƀ`nG7t Y/tZ" wlL^bŮp /WkLYH6NCV8su|HpGRXV6-96mFaF\,01,˥{tXUvѲ"9#:es1*Y :0xư@ a5\d\YeՓ-/q̜ggC~};~L1wm M E ڱv83Xcez)E3 0{Fa:q6IH_3}e&H^:;]ev+9 u^Γ4Xy>HҖqE2koQP[Wq MCې!H #k"9I 9蚃! biײ%1GDB\p}a q[d%:>AC,d_؞CXP6%! 6IUBTe,InT}f`*sU$ADdG΍D""o!lCrbdcHrhrYN^~MB40X 7TlGIGᦁɐC[ywvOg;sl Z [}Hc׈Efo{^p?y^;ѯn֨St܁Ljv3ɍ\Sx"~Wz^26ildˆEkt(?ɍ=&~ݜ`raob> 0$[o_c::ʝaFpJp,5πa1g iu|&2D5S('ƹzg~XX7gC:> ~ܧKfK.C7쾙_"‚lq5Mò,wkyiKп:ub0m# BAz52~6jّC!FӱD$BI H45lTKBtʅuݥaMRyyB> $8䗦U\=5bi"(Ţ@mc biequC4*Zc^{0_KmsgPU[~.z8~'ܱ-4J ,4Nظ! s>_%{FlX[ea&4B:ԏol,(йYABXqSWڗD%RءaI:A9~" de6 z!Л.bHҥ]6iZ"28MpvrDhN{5f΢BC$(j %bTLT͌V]<7c G5:AK#b\&NLXApuԑ.z}pUb.^n2U><%UKz^MgtlZkXxߩdVD֖h uu$O +{g?<! .;@m0I5(oyvwÅ;TځJ& [FYav\^M0_LNCӀ=0uzO?'.kp>x\,֠ހ;hgp\\jޚ/>_~ "J=x _C|v_ ^hE| `s} 6p-q y'މ~r`9?ðT87Jϥl~s*c-څGVUF[lRtb();{W:rHQ.UDSLmy=%з>N;_d.cM*[l#^nl<;ZzQƤU,HyDe9,$댭_Y⫩ ÕaFSMd1Vj;o{XɰXNɋ,*4n Ϗj/w=&W(=g^z.:5!x )! Y2b6"~ d #"A%$($#L,S@eiͶElҒd$AFrL\Dd O[hM0dd̶GXh{!\$d|ÖݒPtQ\]QTmĒ(jC͒ ڬ̟'gc-ve!';&(5X(,$NM =t5FLC,Vl*ɸpW:&DlӲ] Z,x9t,q+$C!{>N쯿Ddmm}u|!Q=QT9I!>iwx7>_ڧ9pAx1]gL:M^|sڦ%gX4ijz|(׎osَ7%ʙ?d:ᅦT֫`;8(fk}_l0Jt|8 6woFvgg;>_C*&F4_~Rm=W{'<94?t;;K|{)Ԟ_j!ǀҢ}>ӼH//ء3k?0!7ny{s֖80%;vڂ*+<8s8Cܧg9s{`sA{G,\%4an  loEw.,.-cjdi#d0y5*Rk^!E[O!ULDt( mkti2mOi \¡6m k A*!BӠ(Y*vT%ױ2M!=kv]lUgv(19LDl!Gb֋@ R=M7T[S*+'ޅY2jrkТԐP{ԚaQq ZNMapѐS(IMjqٹ7\.Vp K2bX|) ?jNjxUvajG=C@o_I273k܍(29J۽µYڠ5^$'Y*w:ňiRo\a[Yml1t*ldk( v/ꆋ_c!Thcɢn(:{15D2( J!F5vѽ7f=QVP/H<-ru䑓qbIJ3.>,cvĂD2)Oae,e!D,^n ]aoтbq}H.VwUG,Isk^*ҦE&Gc7tm1 s꠵Vu9:Ma h֓ԭ8q^&-I.lbSi ɧLP.;J(σ'yef+^8L5d81gRNBU +Kzz"D;`ńΟ; G`#sW0ȶn XsY۶n ~[{hw6eYP[" iJ-'8w cW7R ~Cpn/~ U|~.8Ea#p G o5Z>8 y1?,?$uKojK;1AFy[:V[vl2aulIg{ʐn(ؖ..Pp=WIۍWE[2CnY>.rc`4d)5kM3vvV1!''ɉ3 [K#4dU 1ĺq=VE^=D}lC{2^.G9Įg"6};r,gOљ cJ/F=S>v%E{G%YwYYLiy,aٮ!d H);)v,b=۶+Z\ﺙB p A&&08!3i=voz]DLZ]r\pIXB鰊((gJUqP3E >aEÕ|dC$G4kAH1 `X M 2eϡY1hMWFtmD4|ErGX I3SZHK*(`H"S2?sfBZC EC#º9>_qg5.x96PLÛϒ2Y/noMqwyvF%Ct/>+~LX|U2vCϗJqǡ+It8q(3 ﬇ٗՍe>vE%ޕsuOsfﲸ/NIľ{O!MJXbA3%)pJ h5Hl[t%%*8JI)cuH'l#MӢaaz6b@ݴHZ[BT$ܪ#[. ZPDh븖$%U(8u\NZ&F !@MH;B6CLU3.WI[L"/1SLg8P|O%ct9`\'ۅ?#pz<<\?gia0胝K,gadvsp}Z|K_sSqZauOC}cX=@$gyK{=ݘ]yi~6R+J霅6ͭ3p)Fn+ F J`W;昔vuV"JcŨܾ 3on›}[e7+#}Kl]dAkyx3M&6BĮ5vgϥ`cƀ!D{CSI`3ng}GOT>oh_2s/~..CmuIG=6bYs?y~evSKl6dl\ㅡ6^oy߯=YC]K]mQ[q{Q/UaYxSEدۘ'a+'Z,tGC-_o>KsC$Sl_g,Wxx\#[cWzwi[yי%c,F|W=G$R4j/q}7466zdޞnO/qs{|'/Wvƻsyhnjdc3c< /L0?ٝo0,GC+)YlyѬ[F]j ؑIZʐq:%FlR J,J*Ӡ$g`'VW]5^k-nm!:H:g-@t{NQ0OO`ve7$kp|M(5sՄ}km9 noϞV-Ȗav >zN魚߿ +c{j@77nB[^+߫peN3wwwNzw{8=ڀž'k;jמm9?fm2᾽N%X@*a=Q&sڡ&_K \M#G ~8-Ɛq)/~;CXSg}fDQ!z8tY[*Vimd}7  ,hPʫHNQCBN:݆j+cT%jt !"VYEr^, !REhC]GTSPΣ JՁ%iTUa E Ӊ39 W.LŒheզ45Uŏ2 & G0kuTob:iVUͪm'+{}} ;IY0T$>@c#-lçǟ7O4h+_#y6p=|ګzK"ߊv+u.7- oa A9ÿHu'|U=wGJANm}EdY|KjԽk_ #||}W)iyrUFOrkW=ܶbKԿ#vaIX"p'w-.=Ýl.~gҼg},e,|BKrOp7wXϝ$?6,gqM[|}7Z<5~E IDAT[ʼn:v7.?ܬmD6K|˯37|v)vW?a/q_k=smopS~{sHodyPآ {|% V?G",vz4#4"}}=$FG 5X&VŋW~[8:$fr2Tf9Zw.(c3 >>T_biŀFu١ʹ*S83>Ƙ[Ah<icFqg:Wt{+2率yh|~eTA**{L^BpBzO4I^+EF۸{<.5sLU,s)l9VClF[0&j]㟆:@Gxk@V FN 3&ʕv P0?'k*з @. k`{u ܮPkq]*FC0SP& pwvRUEp (JJr?S,l T{j/? CG }8_ԹwN삿y(Uk]50uٱ(XVb5Ah/| =/]M6rs\Peq>t^?4\V[FS? ?F<#1Ƌ4X6Gh2-Zduis/gW cx6Qe[ W6>;mxYv66,rG_OP|)Egcz̷7e\ƃ{_={~2Uӗ ->7 ^u lgiͩ6{WEwѸ6mU g}@s=%ĕ[y#xTqny&"1{|KEW d#Zk_ ;|KGqX~N@Hms ls*Lf6v{ {atlē\ 3 ?܈x\@Z2Y \͇%EdC-v*eUA5p Q<^p.*NIUԩ6D=$VɖE$@ 6K,#eI͒p8,*X&PL]4LUZ5* *bh !*y,AS*fEFSMrٮLLB\ADs[^ƕyC0vPY@M[CM6W¤K%T)e &zD0N0fz+ VmMP+%ԘBAށ?$` 6i5(6<N= P%ߦ%Y-\,%9x葳<+i>zh+n=,މ9"*6}Z|5v_ǝw8wݤ“PwDU^U?I| mV,o~4߽ 8rY͎rV#e9??%y.]f: aR{O=˧?GxmM-?vn7|,fJlq~W~gyywJGq~EZ) f3(>O4E}c?34mQ寲Ekk o~"|%Lʩ9ĵ76:ey_ّF4%&(at֛)Zg% .z$^:5D4\Y*)vjM(!w{UYLZ&yq٥"7r QS-h 4fol_bE"46*{=Oq"G.#jQz2ug藺eg#iq7/)-h+?{G-`Jir` dkJ;[pi8}/@4OUT>x߁ZL&e~vP_ 5{ּ?q uB o_y0\UD=.x\]?&7O*;5'jo_7/@o|T.xy23pwF;#*e_)^g+}[K}pa;XSï=ޭ ?lR:րu~Os"/SGjtC53Q.NjLfЗ3OTDXK%.mɌEI0{s{Hb `Zd{_t(-dT4N0ZE7ȍI^$e}O"rV F.t]4y-u ۦRƥ͒vb{Iˆ0fNc$H~Ņm.qyˋUĭmv75,66q01W7񶻉ݻxc!Jsﴢ$r,M1N \$>G0/]ĵ9W7^'MyR+P~9LpWd"[xQnfnk J.zWf,\ !"xUfa ^_ۙ&R+ W6iII1K4G#Y/Eە Z1S(% 96kÇa9eܽŽ/MUqw΁/p<ƫW Bx^.^|gYEN8*[[5AEQbzzw&eaq=lrp$I7:eЃ%4ʹ!S`hDxFEDb4]2SxCPt"ܸ E [F:MVBxNQTRf{!dK("nPDi cb-fC_`DnEs(ΩFo& [ ^zX`e C&HNla裐Q;16Sn:bHMhkv䴀xV5 xc%"%؂뮏6Y&K$i;tCQZ]ۋlݼNmbl1jI[dYJ)RF͉|MT 6F {0BG׽X[6aeڴV\ ԋ\\:o%J28Vd/`/1ѽ;Q;Mr,hCF%@ojv2noQ8 ~|]܌J:i31~M@zDzvpD .`fdFvaPfx" L`L`XvrIBU&Sq 6:-$&5-]!;k5 {~eHOQݕ0x C@M˷ Κ-nA$ + {p 'hf|SPW' =v.t~|Fwvi@;ډjw+=$([po[M<`+5o `)b{c`M&گ`w3 0)k5h'ZM80\[p7a6/h?t Te.kfhg>yj֖}L7Ý0 KσZS.86( ?"pl`?¾eXLn1]EOpt:Pz6Jt NY#*eO2Xٚckͬ3s%L."H q?B/SVY o<" "ELrW0&MDP.lN^F-T jFAlvb^)1 R-YDXX2Tm :z&r$`(UěTcW85hRNk4Z:k-RՒHSF4| [k7)l8$@š#Z&즒AT*4z IتT H=PN|9PNX"*ld4q3=Xn̥+YZ]>Qx(1{7O⦀~t(ѦI񽻛Ƽ4ɧ"fixdf8P+e ,cڲz?*SG<_%'7ߍ #.Vr-23*t 4&4C.l?w+H53%f}9CY~?^6~?.]:Bw'IX_ߠ>@.>M(ٿT*}qdE|,o#<#Ph߿`0/`V%sOMy4tl88vKôQK ټuX ފlիت9ںt–PCZ],Ւ*"z$` q}NUÖp:4ׯPL;;uMhq쩪f{)["H=mn 23mZ]jX6D6H%WOL/EmT|^*4-:ZצHY*Qԍm+/JG^d_Í=),Xah5@9y#MwuA~~K͢GΒhF\Fc3~FF=XM96d$݅k'|Zw~fq)&qg։}U=2¿S3\hq.#}AQ9>ӟN9p@jb #O>EGBtXd2"[@LҒg`GR6Dt,M1vRv0G}U.Gv9}r{xh<|Hۈ@:Mz7>>Fȑ#Hx/xIMϳ'Ya]X߅#׏rdQ>j|qmԆ|$^;L޶w&aq$BW{Qv4$#E\Yl6#`zO, u@@ z_:> 4 gwY>=8Zk)~&GkRޚF8:Xog< 5@wl?X[5Ks@3j<ߑP Ak:;P0]+?Iht; ;kKњ0Y:7DLn ~E25u36Z;o^ )D#Ƨ~t ޸[k~|&.]:]YۂkBbI(U`n:ުw {&zMkhϾ c <ߙ`m_:jS*un7Լy |_y_84]lGql#1U0 S[9z2ffV3ڝ%#> IDATP )tmop.np7NIlRPgXE#w# !9.;Hd Ͽc PMfYYh ,B,7&)o8rdr˂īT[9rػ9ˌ?x?T [d4ZRZ/W?Jᯘ7ODfʵCh  }To񟡸smO#QfxcQzoq3cVXrf dc%H݊{Gni#apC ~שt?[l0-SV\ w&- }\b;ob>E8FlRyΦ:._JjlDK ԖV&]Kϵ1(/l^\rsǾ;ɵ" ۉ!Y3pܻ9Wchh^z' wsؑ,bLRWWCp2,W<7@sS;Cΰox(/]!ˑd3ya:{Gۙ歉>Ve{VSYd%vBcC=6L~b{Y gˎ*F'osb9(Xp;iYJ*6I8iHܱ7{nJdLnb nKDŲvr;@c&aGF3С0_dբrKn̰Fi10H:n_p5fPPHUl+[9N5R!h,CLf0ݤ~i.C bl:XUÿGdk.F~ҡs1ڝmn|u 6IQҡW驶HIr2$"8h?sq|ZFrh*Yo;2'vQ^Ygߑw_==IK{Yʔ6IJ F/䷱aK*Ovr/݆~!"W 5g|+N3#Jubw4AzV\+{}/]yRiZ|QFg0+vgsH"Z%', QYYF3AYi.]x*or>4(&7@=kWDq#gy/oQ\j h0v7(!`"J6F'YC^I[lŇe6X  =zgyNRct,#*A}*!3y =ф(19 lJʉODtR' z>~XY!PF0P d `wCx߇k 5ޑ%j m6yl 9c0/]{KP$ U^ QXܪ{j|P4kvRE[NXÍ xB T*4|`l| .m> ׎Y")Z7pm!Zp`> k5`zn | \#;pdN`ֶUoan0/?$Z 09 ]}5x\ZnA!fA6~*`_5졐ofMT_-v yN{.(hIҢ Yl>.jŭ(Q ܀Ou3Y8ew3H<-M{o{z` NeN]IR%VI3b`]]**}(.ݽuq|#*_fvc*XyfCkˍl!X1AK%c2UNqn%o#]!i9VrY2L1+UlGg AClUqWlA(L5 P3u%U\dXFJU*U+莡¬0͝` !BD=zVb*N8MGDDUȣEjuESJ<Ʃ'U*.OdT5HN TF"l L0؊/L' nQq(z wh j"De"fiHri"%*nDQvtn1lGE D *J_͍~Q$&)*5 UwU*:m,-9 <(nĒCQ2eRA-Fݍd:TkTs~-I1% 2b ]Dm"B4&QĶ@4"B(>=B$}Nŵ\9#L-^+'P6? 췎21:3MMHIvTSzH#,KTOf47DwdB /!#8l/+EH*{}AbFC\F*7_Ԃݸ'9]rZch;_ngLhJ)V~&~mQ{;<=Ba:侊{u:b1NDoE}k/>Lvμ(3kՈwH/R4's,nO5%n!E,܊zp{!]qA˅o3$i>BYn$[Qqj[(\g'YgT[ܻE^R2,7|P(DZҥl`suZ#'4-._ƱW_祣8?o/\+KGyk;JNGWx7'c|t};7ň%>iT2|LOj/Ҷŏg4E.X_4@FqTz2 k\UQ*(iUZ]gWkoٻʕ kH6K&u ܔ(TJ3̗s$tc̘eu/>5S\EHXl} G! pX8BE}Oԅok~DVjD4L Z $;5 E*52CY f.OlY*RK&=5+fZyXɱŐU,e`VE0mTȅeT6lW{++~AV$5RG Խ\WSP-@mq@p=n:NJ¿\)Zb@h)"3m~*mT,D\n/ BgD$"+TS4"oU$m^YINIKWb>\/e6m'[zΚD/扖>}Y.P vrWx[4b{ y8U,3,gs$ݻ)4)6+wOwOsYkv=\c|/0e&W\/HB0™<;|~y'Y魲x*R>E;8^K:i71|{Ͷ֍Nv:sUֿzynWOݗgk{ 1w>xX~-Mwsɯl 2qly5ӿS+ {/x[&Qy?8$֭CunܸV2K R]pc6ڬCB:K%^"pZV(o籗DTl'k5KrkoSO,(jN:H\!pAd9NF^-{](RUce=s =!l#؄}m#{ҬEyjLun]$#aJiV/5B؅)j8$jK!jcLlBKȺ3ɦLH[zy Wn>L\[[:.l:$زJ2"m)*YLH;Y>0acY{\ B2zkX@^o*Q5NO(BNXrW>4Ww 1.7RMJ%f::eFqk*AҫMH>"m|c e,8NcWcyuufշR( tHR)\PwPȵ _]&YE/,>[Ltqnax~uvw9`Bk+:;Pi=~δ%\xjc"#^jnP}`nӿ֛yt}*+/z﷕'"|g|$F9>fYn2XAx B׺V\XY=;!l rEnkLt4%{ / MxFGc C$¦hdA9N{FW?CsB ,ʧ@z-trS37aK?|9~T 6lid#';= %?'pqWuc1 Xj~M:C #UnI<7u7:mxb\WkscC>86>OC,\~}F+߅ahiK'OJ2FY' 6SFɈ :'0-`ksbl fQK,BTv!Y$ÛqT 'SEiꤐW\at7kDnf3v[LL"FOyjoiYqhq56D}X.]::d/hԄIJ)i`0--`)v'H\× vO25EǨX,|%E&G Ga|mQ3[+׶ěT|yu!q]&]G4xoAّR5ßyOxi_}(+\]'ctq?[=pS+g'IO'8yf\(ݿc1d\&5ay/7~BeE=2~V.IcHǹ.ʹ aްM֯E%zR969ʲCf֥S+qV.p==I}b}"o!8J# \ %BfDž:ʙD(ċ{DJ{x-ac!;wMV][ϊ\̩O]M?I*l?Ut[d(}\5ށwTpI* IDAT"ӌ;PϳvQ/CbcrgBn_ˬ}u⣯q&8D ov:)uj _+3ZِDxjb7CKk|{#Lh9Ʈ)9?`G]7FPrxΡi//ԟwmoM`b(ʷD206mhS'2ͪ{H[WYPKKkC/[O2<0|)EhsGmw)sb<%]ܠֆu[&#gT)h>}3m e_ƟHv,JMʾgh:>Fq^߸mm]V)δҥ*j*!79$Y-6οԫ3fP<򔗳$^󳨖h3C`u7[ ʔn-6쌏r~ /^uq9?_us %Bɲ' ߀PFQ{^7 |.xjcBͿLB>odcOn;4+Ȕa*F2]0qA5>CG]mD@<0F~F^cC: ;ojUnW '4gx} ]WBV҈k|Σ׎7\Z JX0J6-@^|mpulCgn/G)H*KR/QZ]rnAmcz= DdJ2JebpA bH^ O(zͦYFtjUڢ/䣬WQM/.K3nZ1c\%|8H-K͡7PNWBT}2Y,ddf%T/5tJdjU2MKxl `?soRgaDS@FXi (d[TYߝ!v,8< AYd![%P&ɚDyYUX *&pE2k5PaM u=O\Ew gA KU >Z.Os+WB()i88DywMhi MEQ)UD*sQ/M.ʞ*K.qD60Hr[JO%;4k8aw 4Kyw/szB_[?GE~9&L^OnT ϰ"O1XWYr>=/?y"+tG;ƒbC6[rdv;`ܟnFvr{v[>3È>Υ _C\*.+AC2fCM8+5 R{%O^?ͥߡ6DG>y|L{_k[0!HTCV$w\e_ x8<6_z۸\}11ġ_x}ػ`"Sȭkn"!+,06!f/~y:uoqӄPѿE1]K8x~Ri}Oَg/Y?T2L"x@&㊓2eLΏ,:&f; p{gj0ĒC:_ɣo|VK9b[#3:ƈTDi3l?o8W 9a8;O,GٿhW#֒x_{$+ͨj0Ma7cA1cTd]}zS! ߡvNs߯0`\b9'sd }eWO^aR_&_Jў3@8d \̐辻cN0^'_Bk{6偭-l>1?̙ ӿǞH ;F~p3LG~lbP V_oy.vgy7[u YuxֲW̾ $b-kMVBg` \>hC \}K{_Hc: !?|q8yӈn6n4)I x@X&4>| [ޘ6^||= 06=I6xj'6/xξͫٳ( ;#{XCuzW<; MDjвZmMpn9Y/po*\Bbh _r/I&^/L,pl̦ڟcQ Tcy)qWٵm3؎/Zxc&B یw8 +\#rBFʛx{$2r(;@""v'NZ zpsInQZwb#DRKt_rZmh8ӌtym翎hH_©RϏA\:xnӶFyp:MOMA`9=iV->"mmm? U/Ot`0iOLj]/3p]TCĖ<T|Z6:^Z ʸBu1wq&9Z'nXZiw-*3]sC[d F0x&Vp>*Z?,raB&TA9юmL]@tŕY߷]W|$fJ{~{=)w.\gHOؽ/w/2|M#4&KmQ*W(^@r=I:I"ec>.j#$hIJqbw|iyw̸0B~%}(e^`om[{Hme06.6Sf48w+3߈<-kWxL\ }21ob2ӫ%"[;K\~( S\Bl^}&Ů&ʮ [̜?G1-݋yEj];W̵ߢ./l cMycDh5j6 22ja`2:0 s m*hP눪dh X 71taQD%",P*HrA60*XUZRR2CPnj#d.O7QR)V; v c:~){ &>@5L #Pj-MLэ`-jJ˸m芏jayMg6QSq?#`[75 Imd!>\pWN*(CbRيbQ hԑ}Aw?8d0|Ya%Cw"Y <oR|,{3t{ jxE<%c!B].Qm%Uwm6+lؔuU i/éRyP4`--toaO5&f`3fq?}J!K; IeҬKuΎ쟼[F'}o#o`W"M65s=FoȢ\#αx%RD̮6;f cosIjŜy=e}ނ g>Cӝn չTs}]jdpC$o*+O?TzXPm.׹2?4`rKw3ilƁ|̴yJ(t^ai*~N)ct SB9b+cHQhjrtDkK Z{nm`J?i!zB+7>YdMgSawq𜛿۶HDzt}Ann(NqMMvh>{|>M?,t-(TءW]>ei`+`1ꄘv{Y J2b5Δv#MZ̮F(QaraֹRE5n/0QQjok,74JffԂ U my(]Z)dF~]L53IϩB L&@&?7S.j];e:{-t2g [ w1!I܃ʱr2 [r KcL?o 0~(զru7-yηh['2¤&s2v&WjLdOSi[ap]?4λ\T+P*&(&s3\N>OHǁ^: 7\ikԳJ;nN֬Ak!j`PYu+vo rCa@7eq.%Sҹw~0DX }-lΉ;~潻i䝔wDhmM]L\uKM1J/ѭsO]ekL_p+<1X]?e>f{ݕ?~N ]V 02nfAU!7j-߹FB]QvEp~,w/S]ׇw\_rHwf`wE8]mnu@Æ߂ݵb0-t1xrAgdkP*=vߢզ+ a}18V rs.x{kNޯͺ]mj!{?d=2\| 5>2k̩'gX4v݆$B+YF] \/4A?zԆ. o0="<"{X:aIdBM#HEF[ qJM(ܰwobA|cȪm 2m>jՐCHQo!7kl;~:JH(TEN"(l[2V5IŻAKj#eĮzqRMLĖIy QBJKk5Q*!"uJPv "rCF,)qh:6IVCqHꎟp8fM5!}$Fikr"# aj*z'=_z~`$aړCVK4: k8ҿ7*qnU yj}[D6UC@*蒊ꡦJbJJ4IȼREl=Q6H'*xe/[LRFMr O20"x,Dqus Ĭ&eG?^WZ!xt̲f[ 8;1 MC^dg.AyA$:e|i IDATA`8NhXDKMR7D0B&J @z#'$RF2bOPDD$!Q9*c[67n7)!X&Z=¡#?>$v Vcg:xbHfD@LJt=ϸx^8cExÕ%hI&.fc"xBW]!4;׷&K1H9)yMf"H+- gOAjdnG1Ey1q\{?R s&BDU/ʢ sC ^Ik;"'&EGLvCzY60-Y'a$r2CzJ+DJ4d*7-aȷZSblX1_oV/ѕW]FFgd!M9UoTV+DvugozAdz{%=z^e~#S;;ɳ'=,x^O?uPo@Qo+`HEm *NAGWuV5V{֦ad:1$y̤ŶlxkŕMYiJlVPg2aFo"R``ջVEzyP%DQ^f,a,62#fGlhG}{^nZHMGYۑܳJa"zfx$mq(evY%S]i+cMvƯy/QT !/^˿Rs|6GEmQ9ϕEjXnL'ySrw|Mq9N:},Q=㆟}t?$hg\ȣ?<<ȽwD7W=!:wh.wn 3#_fi>ե/ϑ߾KM}9~0B(< ZZ+Vpsgݠz`% 7=n,,o-wn!^y;@*'#L6<1 %;|{.LGw8݁$7|+rkgMx$ )zU?\2u :KaUXM솹M`N&|%.6V}A^rh.Boi߀0? 5:ُAH*=p.,.COK=C@o\аK mH[HkC]aRwl#d+)|:'_ h2 gDCQ} ދ:&1HZ(XkQ\"{u,CJ`#* JHEMQjYOH(<Ą2ۦj@I)4-|l!D삍H>֍5TD% ,IWpUtCB5JRǯPTd$PfæjȞ۵<*2%թ[4:H 3Zayc±rHVwKyˣ&Rj8# QF/fXX^?@iObI`F"|S?^#YP2);ުS莦&r d*R(eDr[ʍrXz E ԋ Qh,h4ZYưj(0qEDb^%C؎EL4Hz EOGt~#-#-LN[$ZUPв-E”B8ǝ4r4lͣ# NZ=zcOp$jЍ:!6B2=(NjB]/ST HJU48uX4aI"ۢ8xLTH2TpLlpL"/ ,1Zc:3Li.|A2]\x.e!|UbXTY'ك1IюU3bKs7;MJ?Z%u].waO3JHڤ)2ϳP[eׁ  5:U?Z P ᡳcL MCȤG2Mv(`.Qg8Fj:Ln7q542f9VǶKzp ͙qkxsTWNh-M%u8o-ںlLcO@ [#[8§ !ӈMW0&U>^VO'*ՠ eȅ>žwX mdM(UG3xB,#nT,#/]7Q ϑB5"Tjeq yYiz3܉ 9A:2Ȍx u} RQV8-̡)F%µ%D2f&XcxMq]QJR7 ,5SԵ>B{&ݠ ",>B46h^'}Mv-Mbԙh\p < FôX!ZcWabxERė/"w/5`xUyk ߬D߉ sVV}t#TZJ= ݴX]ݵ4dyIlGҋpwѴCzRs^N 8Re9Th{zGǿ&_$f3g.{=To',H9Ue<=Rar}99qu^9}*Exk\$w6q.>Ƭ>/pv2K'fpukzy2j`^Zw}V"s _ P>EDZL^;ȑ_r8WI .b/?GFL4_RP7_nUwIJ>P_*Zr ?قi~+l+ Fnh7 W.# .a{ߠ;MG #.+>X-N0zwށû\Su?_{nm·/r{:#SwЀ?{F׽O݈3e3|KѢ7vt'-7Ǹ}> C]u 7BUz]3Asmֶܩt.[++77܉@x";N% ݥaod;7K _S.ȬP7 r?P?z7@4JBOD/} =]Dۺ FiџEL3&B0 :HuIv?ѱQ(c chCeF3٫e66PE ;i4*F^f_ISpb:w-`+"5JCh&P3UƦǾTBY+0a.% txP)o<:zS6Zt߇7g -N)(l }>U?!уa$ IDqlˢhY"pL+fH*D/XڽFJR٤Z(>ĎQ^ƌ!pmMT ׏ppdU~v)־x1v&B[\LZ#McuA|6%-6B!V^;J{= ˾834}Avj^<9 ,fEj[d'ig\^fϱ4Fsw;8:O?DBz|imq.ʾ:m*yuAih=Iy>Cq#%nSpz17"rxзH4#G݃$ُ$!;Bq7GYx:AmG|:c:XII{ˬ8,`BOs|[ɽ׷yd1:^ywwG1enU9V&;C; ^`5JE=Ya㏿ʭ?9.02pc܋37da6V`3wc=q>}oZ[l.Ͱ%ryx{Z=GU Vԏ5d~ ᇿ[\xj(ޮdA;.=;p[WY˿N_o'x;gds|by|?kX_v#X>ʿz/}OE9:.Wk;N׉'ӟ^!t9F~ar$^Ap׼w_] 僰+܂~vˍṋ3_rt]@.{Gv[ls֚݉UwB(x|pu8 XQga<4KP߁3O{= .Wa~hnO^X[82s01[N. p'AC^bмp:< [('"_ <9kv^~ Yw1P {y%i7X5f'C\؞\5Ln,6(b;rJRNɕ4iNXen_4syZ33kPX r"J*(sbFm0+#x1s;~rRm"f!*)U5e"4T@CAyu$c "hKVZ>R!U`^ib^|`T$쀁-A[FdZ-@ dML,h(iHm5D9fPMzI#@7u<v6a<67Ӱ8؏']Ğx~VfX(xJs|bU<`VWij$4 1nnC#K'BGe "*"0P8f#`id]DDeL]ǧP6hFu@GGwJEai;GQqI`)M%VuEUjZ{$<"uDOZ܃7܍),#p$vӃ,KxjkD "E[Bn:PS4DDHtQHShmb2-H8>黯4\O>XjM'2}o5}"Mb@@O R C}V'10S*1PwAG>?咬7prnO큠8v![8i)7JDowk| $LfEgN>'aB$2:*̿E!ؚqWK5^M4ۆ~P.!w\m-pEy"FQmNo?;`.MB_]kÏLˆ IDAT•[{Ⱦ|.~}0@n ROX+3G $ZnDP7Mp?ez)ͱ*Zj%BڣĄ3%Q@6obL4&JPBe)""'KWk,;m8d;T[R| IBWV,<5J8Gju(G+PQt9?|g?Ktb=iZe ^VZ1ʤ'e"_Y Y"|>D69GdGm K,dy$[cEMYJd `B]GSйFu;'lOhdujEEس@|;.2U=m*wG]=suMžzIQ|B&n"dGg9!EC+8ߒAN>bl%J~[fŏ1m'̡O[&/˅Xn9 3"niFK!Lp "HNSL⧨luO09BNF{_$o/_#}yj矽ckP{9p Y߳@"'1X=m|B J $N3].ɽO;@9Gf:#ׂ4?GUSb8Slj L_+7wуo{JM~١HR.z~6|og/||&(~a.Ћ}ttA)X`ۜ;&/Z;m}߽wLn{|t wIM<_O8Cf}b|@X0Wa+TU]'AL.;y]r"(\?yre2 ˥MgҮ pK{놋W@\pW GG3FQ5,~o#|+T;RuӥL\r.Ha;yx~ҽB ">w%# 'z]Z,LB,>KGM=0wN}O7`inIe\qC1/^^BW d흲 6+ lkӆ]ðStש3m0NвacېlwkӋڰaxͺ)!Y`Up ;Y?C3fBNO0ibAUϷ%}?gŐT T$Lvk?$.*%R> V :iE#ID&غS%+pE;Ȓ(ZRãB3l@j,$Rb$d,R] ZxϠӐRZ@0$QxD) b^ʔmi> R41DMJ^ሄP@gFx&fDŴ@Q, bT4PDCDBjy5i:%_i\2 kB̐yY%TT~k^Z;Z ?~TL^C<`8ALôXo;Wq&FM!`g:WzPX+%0Б'X>Q {x &ߏfשJu(WZ@OL[E|6Ii1=4I V]A6tLI@WL<Ӓ0"&BPmĖI:YVV0<A:-DE6Q=A:$2Ǣ)Q<6ހ`BBue4i>4Mdcr"⓰ 9iz9* ZDJvG%hXEP+;hK :")PFQB:C8poBSph.-g哾7^.{썜 XH߾kb7:LGևWrH/ F/979ǾPLCA8T@#9IջHFc<jLBz+rIl4y6h81̞'N/S_`ߤ{$h'Ѵq}Cm\\ps?ufvuqV/kFjcg)U:I?WmvWDL}ĚDkW1OfzSe`ӌrdkͭxvkor-[a&y&kGDubw~/k_Z/ou›C^a^2gX]ۤE-N$~&5E*g?&w wOz~{b1*JbyAg Dü{5.et *1;d j(Pl۟Ǿ*2-)D2[Q"jeR<v9}&&DQC#L tO 0ftdz 8B6~Gi6{&I~y~§UYWuWuuW{;=Nc9d,,{˲rcB^#iH#ծ\7YU}fDFb=i|2#~_FF%=n\MDȈ5\5£N{YzFLdS]n0^ -l^a1o"tGιp:P=͗u EILI*.z۠;2Ab67|%=փ^t^qCg)'h~ ],ۼTf\nm$A%Xͳ*WpkDQzYRvk[!ƗTq{&~>eևiwgU^q<ǫ BkKsɮ6&.VE*5jR@rUyI-b ]S2P=ͳ5!9Fr2s л+@!~u*׻ۣ M^@gAO,7 W0< ?bs_g%Q懶fgZkFaDg2i|x~$.YsFu}Q.m3?};NI Q[ט ~;qbpuoL5%7f[,JuFlrgY >3_cckc?^䛗C?+?B,-ڄ=9Yɏ< }O~_cu8Aqg0MMNn,ȨMn/C4}Vwn.: 紐Õe{5|w{`#s*;?:ye@ 2z v%@;sG# 4yrE8]㰺 9ꌽ$8|>2v9TTzo7܂=G\C{z LNAgs߄ǜlS>~º Jþz|ju/,ÃO|6 ?\o|{en?5D[@kHBC3QU2ϋYeMUT B^  X [2 F 1EU)UDT_ Vt aPL(وGtdÏ_1t 9D!*q%$A$PtP!KXP w]S1ޕf=:/ LˋlD6,RE̺!l’h=w3k(fZZ4"~ WMb EDh/N. TdUR6h،&Kݪ4 ma *`:qTfnPZ1: ƶtZU[Ȭ$) ul]RVZDJL>_fbA_pPME?m,Lݶ8QE Fp)iZ+|MXMV QSXP1*K DjdJ=p DZ>k&bȎ KRq[P| QADĬ1ȯ 1P ]H{YKo?H37];ʴGؼt (|R`va+FDe̠qisMen:8J!WLi"fI-Eh0`(^UGqr~5.,7" x;(le|9Ǚ~P: 6^͛0u =!7t)!.Wi`xk >U$ӌH{Y?%g(GW2\F_ 7D`v>"1#."L^j7ؗm%?v*L~*\ˌUU2nFn镹_Òɔ:5ʽ3pu:@aDdm[ÚհU޲8ϼۧH$IJ,O^npTbe'=xU֚,$2O7u?+07{8#: [cTZ,h+VPOl-ERe3Nĉѝ䖓,//dJD6|`2J^FSYM*b;H$w$vsA[1-vA?\nq[Sad_8KSuk$/tWP/T9Y'_dp&z׊Υyc׉[EHQV#ːuJ"CY+1뫼CHKWͶw:Jf3&9o20pK^'M/EVվp_;%T/-=Z=Mwwgfoj=۫LNGpKR¯Uzkfss97[ϴ /̰<_4%…"3$%BT0ecqJjBD*PyQ*Iθʟ66+k% ]G<yrQzps}5q~`*>`A@^i9Ɍ`&V{sX\vct 2$ #uiנ? [E(֜eM;ffW' t"A,q@-_c;M<(LL2;⌽,Araq.~w:{3`]':oܸ 0ז mqXX;l<ܿaZ 1>l?3Àekj`k~G%gO17fU^wU]ԗ9p)uk$р:%ZbʛlWb:z!C,\"zGaUP#7ԼmT(Ut[h'~M u@ͭm A 4 " Q.Xe+(4T"REAirTh,DI$5:M.@E $-{ɩ5dQDȊMD" pqy,DLDX1P-TjU

VƊQ%ހFV$Ȟb i nMLq!UMp⺋nl@Sn7XQL @V7no#䇚EPm22*Ƭ2b^(TRz@T cX5%nhDԔ -7֠.TExP/daT%jnBQ78$M7-VmR9{D68rUDY$Kg({ҾA_$YdyJB(F-oS`39&M@V%E5`߳a,uB;ټ5+tC2۵_)X)MҰBd`6dz-'GHH^re|ǡ ]}'n+_+-OѻK&[>/nk$sW_/Wy6W\ Ǿ䎢H~.LPt9x?ū1įXsM0MY{dwb{_7<\.b6$ Jo;7g0:8z9ߢmuk7!Z[ܻcIk73q\ŬcgkS_{_Ԓi<"z;yO}4<—QdzVR{vyn >oXv^LӇwSJg V6C+OiԷI| F 'I/ƹvGS YDx9 ޛgv`75~m?ԏ7( IDAT^ͭ P*^m!|kH'_'B.x>?7No w"t1<4Od^{o2Hn8N `4F=Ÿ|:,r_0~NdQ*%#jlʝ?/ lX50f@P7л G> sXͬ7[(AW~Spc~vb*d 0WA!x*|y8qA_uvw`>]w{oG/ۜ}ȨFk ]:t0Q>ugg8㰱~ :#p򟟸5'[oOsk[}spe2uT `d;l@/;՛Bo#60?q  "pp7 LM9h lw$ɼ ~66KpZ8 o;szaޑ#VM{;Nh?{c~[8xm1\5tfds+$S2VƝIQe-oitZ5Z{t\D:</<7י^Y^ $U2X/pk 7g4,9ELb87}j].V(XU* tE9[,E.X$hnd n@4\Djb Vvه"Ⱥ IvQc4@]PU0s2s/gp =\'RH&ˢKR-zq` ]`)w Ɋc5|Q O$KZ-\ZCS+4L\FW""R 'WIըe:$[)4_UEm,xKƀ*qVQ.B꒑~M\!SWKXUxB P21  4ѸJvѰƚD)o0ԅT+Y``@ VhC.b wDzYab!h]Qi}D@P袁hթ"ANѬh@" "\Ug=SՓHu72Z Ӌ4 r(hFEqDӓHVrx4[ i\b-C0UŠL!$j{/0ݷ;G}]'H{KDrtѼ|Cx&;H*]1+;2;U^05:%z6Įw1|{c$-.hpѮ$7;Of_+ì%JFOq^x.L6zGW+n#8Q|_oe;D}ťmK~y[yqOu0l=s K.\!J%x|^eBqVH{?m/f[-U6gĿ eݐ؞2Bu}Y_.^UUs?fyyys/r4L.~#:βap}MSS3^|Ͻmcs9{#ؿ?ϒ!Ot 6FtD:Yf6reό02njl"ڤus2^v|'.'EBw3T})OhNXF &] R_c`x?=Oz'ikk<z6xüݨӽy'BCg(BjwyiA~t{cY *o:$ocL^>z0A8b u(vqF}VMrKIo0JGe~(}zݭ`؊3Fh${6Ĺ.yoMKFpa+[[(OR44F(mwn}\<ƏYsapӉVƇi[h!4H2N[y%q!>zc?:fY 8{zJ+p1y'Kye>0ܘR `|S_y~Qͭ-/ÉcktCtX#K)-93 @vs!cC0p@q9XΘGkKt$W#w8/tz}wz\ :skkk0氭ߘZ^; A4MAxkcdaWn۾cʵ7m fR'597T*pb߀1}4=Uȏ9p=^,^Q}]aGop}JYV$$- i5:#t6) 4Q*SqVZP @$jQ5G:h Rc̯&ۃWXTTeJuQN_LRħ)ضi1 B \Chԩ5TIQϣY \:>ͅ(۠( ۣ"a5LBUqa-vQS Ph2"` 4YE $E@ADX5M\LC0*_DYؒ-RDLAP.[T ]0TBPv`a76V3 `Tc.LhH^AD:Dͫc ACzg_xiʥ.E^•2"ъ%QMzԆL+L2FSc<5`;;օDJj n"!}^.753,hsyVT%MA"gO܍FJMJW̎¥E1|.lE%B*,M+c<7?,3& ϣ!UP*ڐLnjtI.̘] xRSL^'23hE|*lhQ _YiiYoT45_ i{Bl,TPB&FoT9sfzNB5#GF .M+Tm $m{]oe)-ǩ=n T;KX 3)sO]?+Qq.pĺi|,6xЃ5'{}i4ǖV+F]ZY{wٶgSV昫)w Ɩ']P$2>Zg%.3h8uyAz}1wr_Sh]\^ZU\/Б@Ke{|Ys5Ct˄{S.a`4]aL)+S֗ٗl__|{ݬ9L=ֳ$W7Hxn1Dn-ͣ^M'Y>M<Xjh1I"J姟~UUi4T X RiR4m os7l[cd?O|c}.} J ;B c0ӳ s~>~oౣ0ጯa?==&_98g.ȕ63: 7Ûo;}Ƌp` ?j:lo# Rptz"|#SD/- .< Q'CyZho#*S PTk$+!W +m-=Xb]GIxLb;fho #ʫ5?mM%hv7iF wdH파 o!@BHO1 .͍*hWPEAVQ:ǃ*Ssx%a6bDFb dS*nQE۰*6$>M7%5jHu$!["n0-tn!K*uWԅ:Fݶh$kl4"%b LUnȊhxD/@(:.Ruã 7~Ҧ eII >\>!ͱ&fO\-rd.Bmx-)4,*FVI$ފ˯iq}5{isI,}pIkܾ! UdVWmF^!Oji-c4'CV)-$AYbjH.SƤd2Td"uԪ"I{xnnNo籣Dμxnf6vr _^Ot Ά2Ek00y7X"o(lteU//456eong]37a]XeZB6רul4:]ڨ=%X4Vw4?M_"h:%`4^\Sk1IZ]«л=@!CZ Tgn)1>nQwScnhQ5{Yd$Cr˼ZU~*.l=apB[כ^vo?AMuq HZGw64ʼnt3d LeFdlW@b3ͤaNn+(ָ}[qKU"u>,1|绿~~qƮx(b3"*RHhѽ,l\&2Hџ|H۝ ƹv} w3f`[ Z9觙SӾy*̞jb%\'csn)I|/$5b6{Vܗ_ӹab{*qxC}M\tq}a8tƔo<5e)3Rߤe@}( +S,<zwl=mt;Zn]|^(`Gtr9 .18&PiJךދZs`87wwuYVj~BolRmJ@nn/2#! ] UJ0q7ث~F{v#,}G9Nǂ>Pb$~_8nGG5 }cucv;1 ]u:|C;>dǑf džWrk#~-tު9VN'cMxxng1=*S3pj7ahzᯟ%8J :mm??$\]/?p"ξvuI&/cqbvBG#? Fzӑ8c:JUk;}SW#@CS3T G9׃MD޹!gOe]WGYLThqŚ8[P0UQ ֊"hD Ymhؚ;͵%D^CH`\~k7' m-^z$774: Y5bf(xku2MFmOnFETEF èҨ[8R7JZ b0j uUA#*XU,Ń"XՖUZAUb~BM.A]nAUç"U`kBMkAPuJ FAr%tY'PpW1Z2MY੊$T^mP hnt  jBUٖ$)![n[x+ bX^Vƚe&.o X)P 4( `&7Pw{EفQfS'Zkol͞&9L1bs>pSS6 ^}e'?:__`\>+#u__~/-S?sj`GCn SYBͰWY:n[)\rXlcy^ -cdbdk$`4*X .88Za㤋6 BTF5ɦ$p)xe+Ɏoy2h歃*&W mؽgvBl0X si\';e8(wPwngARFUbO&Q5G8NHCGR@Ȑ*:9N˝>e:LNlauIn)I䝗Ld]= n@?Xl͇*m\JZHw|}&{Â+UL"[- y\@>1BK2QJel2mmjNc78OˁN߿7nt{;`.Z?%tn+_+M:)>rbpI&2rBQGY}ii*qّQ Jwt`;X;~ l8m6e!2_i5E̩w-.*ܬl}2^mJ"ome8|+:byC!b6?󤎖ںU %$FI?3耕dS6txkx\iZV&>)ဇ7+_sm/ nM@+ W-0&6gRQ.p ~qx&~i~~zɆG[?_mFl~lj7`uxbK~|5clXM~޺2&g^' 7Z m;!зV jc})۾{ ̧`#' <}@ ~<{+VfS, REIܸJE4լbF93Y/ x}V*"f[=9zمc4ykv?SW,df6!I3KX 5*9д2L(ʘ)yCErZtBB`ĪYdQZkױTk,yEFj4Xf1 uKJ.Hݗڨ2uYFJMA5T5\@Nа4$KIT@( H妙z VL HP$f͆a) k f\6&th4D "!  &Bͤ6\ iFpt}}˨'@aAY/BM/ )مmDE0k;iis?7^`= _UDRܲ%"yLs҉Yr4z{CcDoY@tV޾$sA5p۰ц=?I±/6{oS=ze[b]+|lqIsDX[;)8Y顥zAV*ܓXS:Q"O"zHü.lR/:C?l8h-ގ{qo1A^Cч&j=4j$#WesQ'uE˫ϖٸ*P+336\+T)G`s..Ҋ=̍}+n}ε׹rF1fhycC:"Ôw-l MhDWE-t.Ǒ _kaz0y‘eNnBwU /5}S5MZp8ޫz8|C"]d/2=4 ÇTsxaK2Uh*_AR($nOaTDW]j>\cnV3o>ʔ8WS_#8;ذ(R]WZ(+X[,ca]jLnM}})WMlY]g kj}m%zq /v{'(S;TbF܅9T9tH}DhKqUN 2j$т g0E5x'т&kl-x1`ʖ@:goӝ,8J}g _00 P?Eƽ"xNwŵvꑐuD߆9=3Wϓ aWH yE@!XeBaf#RN_ÉrNUDo"p"ۮl4_1{[;&N>FO灝t0/4R[M0߉zmYi HqOR똂6zl}`  GD<76Jm*}h\OS)%HL~W#M:TB,\6. YՐxask/N[Tɩ^]bU&Z|,TCE`'G@!XSpK5B>x'=H}f/v6Bo;FxO*_hݛEWk$,E*"[R`?+647.&{U pn(~Cx ӚI3$hnd`U)TV릔v[X#C'/H †mS:|oOy“ -8_]sQ 0j2ջS߇CCW8 ٦v V|3{;fa{>|\f`om2/ {!'pM'ܽ+uiyNQm ??s ֌n:nm2}A 8%4[\g;\#]bMSmMLK5#P\mJyx`\Y gjF`΂4Kai "P@&433c$r6,7Ai4銭e?Dw`٬#[ˤRSZ2Of;x\8qT"&z+ٸte1 r^nC| AtaFPũXqV{d fSs]2cij.bϸIYqJJFR(UʨqЩPhWFhTQ ^Q DM!JT Y)5,"lE0,* [@tLŜQ6cAf- lRA$SL BBM!j:"t Re@ͪ DrP5tÉ"H ZA%@SJRd,+膆ݰ$b s:}9eFm($X4Wdr ZZ <^ +U.Nak3cIT:"gNFCl%o-^u:b^$oj50&Z  Ity LE7.GdIOb:A(#]9N +tam}]A:*t;7&A;JN;±IQ9qd *#464@BwN,ڂxl;T+I>9f$3.Ea 5cGR싘9qCmEz)UƽQx&F "12&*6!2?ʺc`Aju'yhB+%;xi=1'$<-dYV&=MemHz.L.˵)QT(qwl\l*׸04ÉʹvPHcMOPH|-sNiR[㐄ktJqXm\rBC*bĵ%ZN% NƝCC}+9y&hIphC7,tS]ϲAEʓ~ -L,[h/ih~B q1D"93C>KtiQŵd%3]I*w 38PʤDDdL}X{C{3.B: $(8HT \Ӯa13OU,EGҘoBZ[ZaU.d&ߋ7Jb(D:8,^]fw!3U0#5JeՅ*HZRNlõ:t.&^ӌeD^pʬ8C9бs᪏x/C0POP  !';%}VD=̠h%a SQKk8!F o/3nU(n0$ԀD-yS09Evu~Y%NFѳXDDŽm"-=Hha52@W_ sYNW,tdnpWr_bKhS`sCG:Kv‡ok2Kfb\Oߟi=hNo5rUd[%t7Aa< K—~||pdtAp=^Hg۷ M|aׯ5GN{Snboiya#/ Odqu <Ho`w6Y\>0@:$Mڀ @ $NXo6 S.940[|9!hd}ν|S=4/^}X{sFT>K\[`j_ P{RnU(yq*P9B"wNmj71!X`hGvĵz7昿.S\&Nxf S6r^ ;vl&|~^ V͇bE4>RCBxVImɌɐ1aAȊIG $ADi,5Pkb47Dj2&"  j^TTSo(WBuj:BX(H jBj")ԋ Juz>GM59WE,Lh1CņKE cWu5&"-F{ WG"X<:Zs()5(3g NjI,heJl1}|NfW[c:S8) %b#2YaR{hrL_,O~~C2a`,SYq9%<]2=.7`V|\Li} 1f8==rk]wrE]0P[8ykt (ʪtwtН=X} k +6y;.;pRdVey\=&"e k%X-l%Q57;1r0:v8n_Е:R!A{w["|a{~@9WlMIT8ޢF2nW@nnbLj\6Kuד|P&K֢yRbR[a~?B%A֬8v|f|7ן{'Ѵ e沝Vԣ:=Y#bͶEn߇jW *)7BghOt']|}տ̓>sVN}OG[?? +ݽ#ffvM\[61b-">Q![yr u6"{8G7S@tg60rWi(c; IDATnj;u æඦ+=sw_n 5gtC x5g<LZ$ppH<3JA>+h:W7:|i<upamX#܋5``4 CQ0\DlbŦ#q7ms g/i87'OB{ lӈTBsݝ,͛:\b32+aXR S،rڡo*.YvDsG'׈D,88)aSudSgCX$C2x;yKܦ&_t>HA2Sa*v62nE)-PѺ/SPwkT Z.% S 6FYhV$ICCAK!u QtSQRv:+SH[`ٰW XՕ, o]D%,4lasPӊАu4@]h5"H6H:QBMj(>N1 DZ:% G{-TJ6,6%w'lhGr(6leUiq ͌{7J-5.Q&z wsLKF gشQf5&0b7g/G/!*Z+VZ1N(#+ԒbUHW],vE3f8~AL#tm;cn.ƄZava,ZާLm۔clhRA ar1ê[T\tP;Kt$(m6N"{FNPȍRk~"ZhUz$u+DĜDQ)*-N ֐cy-Qj~-rŵUU|f>@IlF;?S* . 8k-hK*7<6b^:mi&a ~qxpNy9C9rT"'!R6sާzȊug0!^Y'mxSBpuYKX:Six8Gz}b]Aѩ I,DpfiwKK ]mԅynuNW%[`i*J]`}j5RIJ_иҭ6[w$;L3M^QRTzZe'AI̺)/ oHyHYKljjmλ(Y#vi MѮRLw2( eJRA#kP F&u=G˓Kxs8<?~kņElFnw05sK i@PasQO*R5lDZ-+ez{!vv'UgW3L8n3t[@q$?z',䰵Ix9IcD1\1~Tzhξ&xFͭh_5Kiu^¯? +K7eGc _'o3Mhx ZI~gs Js xrg3?gkh,7f{{?n"wA|`2 L4oD[ Xo8Xxw>px.COf߄-@GW^7eL&;G!(W`04)Lþ=حre<4t"txWN;7::'~bh 8-oBu4"7zڿex/evhJ; j$*1BX(dju=J-ekr u5$a2u13OX]X|&%XiObdK.Ɗ$j($⊁BΧ!)Yń%҅ [ǩSD?yJ[4f*FIA#q^2a(]9jzD!"%ՓE.~`aƭ۱ L)AY 0qQ&`"h@I+*D7q̹Y@Χ;qlutbaY)-s8:j`9*ۨ^[cʘ[B YطVf/ -0\'θQ2L`,ɰ|ee| k~}tXJdek:, 85d0:WX J؂IncvO!/AŒER8\@PY_" *;$d7qS)QZj%~ΚhTY+X<R Ҋa'bPfsOHe. ogƅߛg#/ov<>; F yꦅ]iZ.&.WIW%:<~ 397QO\E¶qB eh74$Eg$UIEZؾcCSoaoibAftg7$tV-3|b`'R9a[|o L}< \{h/pIȏt$X=Eأ?GT╣x <Ѓ$D2/#?ȩwΰWmzGcoi14A&Aי(qNbgY7mLZɰ^eL9R,]FY'뼪81l tA;f&2}YpWI+X!,YWRЙubt: %> ۝8HL]qF61'YU.z5*S+05KHm]yW.^[vvXvY<3ϩSeVW/zYV|Ci8con9:`1d<3Wcf5C:08ybzۢb]VN!B%/`;Dіzc 4v+ 2,mqz囁*_P/%){ (XSK*)O;5€|n)tXanJr7Z[?=z|C [z-c-6Ȟ|J6 N,BzwY-+!Pm6Z7t67Ld ueG\lu Jb 5 [udM n^FeĨ,+AC)x 79-%i3NgQdIxG&q h߄00f(Jpb)sZGt> S;`"'+pd򰔁= xe >|:90gҤHQeY^eV{&kٖl["%")f1&SLC5}}\fzouל:= *Yus CI/\ݰfdGaU;D9bxU5˰}"KV^>MNv}w[|;{aC[36VemL5&ikU*XoT%j=e~H`&XZnn_bW`|i_p׼6/(O,y\IiBW0fDIsM~Ba=SDSMEڂqRHJ2ΒB!&1}:b##eZ͌H33:#Zo1_G zʹXƤ)6,E'rYa SRrRV dFzGa׾Bd-2PVdHɏ܏I;SwEq,=&1}{mvWUϡf X}"~/aPSuA,jٚG%Y'[pPȆAk{oj@8|kfcg{vӠ1i*8ӔVvi%/FGM9Yӆˌ:I㮕P%/&QC8s\l[>+%y6ƒ8=W$oY,UЯgb"n;[~:ʔv]oZ 'X70lΣѸ=zLޢ]%&Y-NURjM^V7ٚYd(>Go4 NVyDBM|&PZivwsm);m\}GoFni0+6.n8oNQRo]Or=>}@eF?ɽDJЎac=CFf^_bKYY ,CyTCv_)O@cY}ި1.+$? ^+?q_ҽtܱ!~_(dEQeru_W_?ȫ']6εk_Ƕh4'ǿkk?Խ֚~-XIzeVOC!+tk3A8ӷ蟻nǰ7;gOGGF;K<}ie:݌͞R8 "pf+NvboE 9;rih9&'(;[Zȹ<)3wr9k_ Nx7%iIW'[X9WPl8̴)vXyy[4eWx WY2Tt{S62v(ԠD9 ->S/HH*ԹQ?=\t1Wfoiu9 O0*cNvf|A2ۙOb W]Q9W-Y9kžD'QOsIt@ʼnO/TS5 m ?FFD3{!T. 2'_wZu!-cCȵu|! zBKSr)`ϯ>t3_:~#d`T6(Ґ+=Apkvޘg? @H +k 9ՌC,B548'1vΊߖ!&)t\fy~$pU4l&.PO5)V+Pꌲ"UջoN &p٫NN cd$Hpof&sΑOLn:':^5 oWom6U]e {pgR|nCQe+<7н:{k0Io@|ۣûg\gʿeyV;Js!@$_AbYKHNQ! rKylۆ֩ d%R)d+:MC9Agޘ)AK.:X[qa*x6,zrN kh+Xu g hE QE&( fEz'\TJ2A{JC,X脹)XT0&F~9fN/kwx+:A f.I6j k7RY=^6j+rq>D&']9xNC,3E<o뢹(bӼ&ਯ!3o_$tҹF^#ж}-/D#y}hWO1 #؜wWb\d=EwO7u^;[ީ X ޼YO~.Ű?2gVc]aJ#(q“6W^̟y[?\?[{~_Y抰:Ճ+tvmu"V_B[x7)e[h=&QZhHWI bʝ|c"[wpr y?5M ~O%VPoowrSfΐa4]34_G]~_sBRg(y:mba^Cz>G%'_[$x82%yWgX^9ՙsX@IQ[mt"ɜ~]GeL53G"Bu 1u(Df6hLo,#F])->¹v|E ;%|L&TFY6oFNĐLAF*sZo3ܒ#b@L9iIZ'fۦ>r ^ɰPɞY$m<+4Fo%y$M1VO aߠckhDc˙62+ : 9 SW1|]X} BTmIs`WSCYZf5NefOH;ψ;\Yl=WbbLhҍOBّ ؋cAdfcmpX`bO"Hvc:;ceӭA3͇UZgJ[)O<#ŝg,92t ZX+f`S)NoQWC.+\ =9&˳8v_ &J62uS`-rB+.Gj(]{+gC 8?FGmbg QU'/"o7Xs ü1"8eԀG&܄S~V{P[d̫>{ ^tY˶?iW3Sire[x}jþG+wВRu6_Wy{!clPE8wvUh'2讇硡{Vk zUv/Ût"jԖv L r뭛C՟YwvzPD_wTzPv3-Uv7ʶ*jsG:,VeRKe V-&@! ;`yVgf~d@Di|RU]=;ǿr^2Rwe{7pu*Oᾇ5P{? 2˟\,S U6T/յ8pyZW'~z̲PB(d|p|A/_)aSJ2WH$+Zm&Z0*G/0ˬ̇F2j1 Y旅Fe* I*Ns 12MvESđI%|Aj/#+5OIiTx S6E 0HTf, %`v(TDO33@+'[6GO=DeTa<LIW);tDYja pHՎɣ@a%Q3͘زC.pچUN(YSaJZ?}v/B!FL :g8Kx˛X;Z^5Z@ %)1pYKmڷYIEY/پ|l,JyVK"fWbyb6RA mKIܮ;&t% #2Fy*YuS.>ISGa~T 03f)Z񖟫'< и)x7Vo\@  Sr=)NI3E`f!®L | ,h)M{+.ehR:M"R_88yL"uPf'å@$塭M`/x2YyeՌDrB2-#e:-f /`5먂ANY50f&5Q6\h-|vyOPv{/9* 7Ũ=~Fq6 oΥ[:{ÎͰ#ed<=jZ¼:V\]8 4r R/W(Qv=IxFf 7A)L;/MY2?vk SFy\E|-26E>km]|$ۏGvx/-j_o7Yv:Xݥm iDcf m,C4Ƽ`eWTGBwz5^<̬thͤϞnBUl%Dę,Iv4ol&:C4h0s3HYifW/0gAӖLd[%nvy4,lb~{ϵQI$B%PYZ2nŜegf t1s [͍4Z,ݠ[wꜧ15J{/A]F oXFs9YҠւ)I~%`!m 61'Cإy;βtf#9+u,w|~#{afd+u9^!۶N)0yo%H; !R.T hf\vr ϭq_WO}o:SF]5;(wY_l;tvpaz9_1hd{/b b7:G7q#j%Uns=oO#hiqsNcm1NlGh̑.L&0[h7o1Ay{__`U(ҭ$[Pn}s;HwDwcѦ h/ҸF.0bJAnzk7EErTC^Twm;%Ϝ7\Vy K d ~*}Gﭏs?}L k7[ 9"ה9g:7V|u8;Q3wpW)Bx jufxr?_?8 CWeV}O LpF,mF .WC ݳ`S,%`, oMB[}9(abB+p~o3aqv K/BuCkMՠlj;yg?<*[fZ/F1N+K eȥ_sJs |*[4^5m޽Z=]0Tpu* Y7DRյjjp8[wU%4 6z5Hf쩟y?Xfh>A2!lEř'rIb+DLoM-<:܄j`]>n{ynp})6Z tsљs՗6gSc'.LRL5f_@m0'\r.UzkJ7hNcYcx>^}R3$fFx栙se Z'"ߡYO 6b~}eo{XKv|RԷ~cU*)#}ܾͥ|ׄ-\寧0WK,N~0 'ܼB7).,xyVDaw3a fK/?ᮐOQ|_}{a iK3Xά Gjs/?n &GZ+q< 7԰Wp N\~o~ic?ϻ$I3/}i%?6O)a9#Ʊ9I\˓f/xo6) 5d@Ma+uo,:/GblƇO2LmܹVIe> [n3hZU({XRHI˘ʭgD7y d~7?t'̄hrZJI#&pؓnؤ9ژjOÕ^}|pm ԮXI 16ћs12KnY,{q7S:pg.0f5Sm &qrrΖQ >xO/ x4E(fAA;GP):+4܂ou$L`DwՕհ\H[9hڠҽ߆YOZyG3ЗG I8JEJo̞8:sl &%G;^wN^Cemo3]9w50αA(%(a.mdr>ZEjɶ%\0RY[]HB 7!-IB .^1v 1ֈd4iNw mBjQX% bn%_ERdfn Z[ ` ~ 1g!IJ op^E01B6%KY$78anvN,T(_>eeB6W :EjCu !q .HPe3%H! غ,|1W}3^eغ±K^uxUC1=(lO]W?IJeJ%HGZ?5l64XTY!!@(a"f(&򂆑Qefiڶa%08bNJSZBJ2fKTٛA;5 0mSzR@V0ARYm"VJ:7^6cv:db1Q$(ƱFQ#ԷۃP(GrZ3 ]4l԰4PppEAݔɅlhDcG{gKlVQ(F+y*'nb±N,c/lk,pyY ,DH!9ywIAt-B^YuF&CބAvsgLI$?"v VP)+w$+8} 0Wҩ!\Gh5h1#kM9aDǒGK+_cCHŏqdӑ/qu{eX.M<+GDTc:YÖs|kk`oc 7 >HRKs4q/㇑h>0C yoײַu̿SNo" rI4NƺIj53ݬZGO cZwOb'-V'viWM~0L)ȰǴR†Kʽ̮6/%VJXfiTʐiYZqUf%(SZc* {U,&{X1 i.(+zJhمV$Iʒ⚕g̴X{lj䴪=:r3"]fMK]DjXBXd.W4z&k82)[X=F K)èY~ )Ԧ K$cT*XˬM!߁1[0o ?O^kADn7|UKN55I9WWXQy I iڵ xu.ɪQLGsVƜb.PO(Ok[dvP@]h-4ps<|I6Gq$PKk?o@ D&]BE@% M!B̟wpZ*wR ,%Ὁ|"WǪ&`w ~z>~S%n1XYɝ5pj#kUG˫⃗߮J69U}]iJWs%|\n~| | qEdb58۫lS_;!ыslD(AT`9hk%텎ڪ+_O?KܯŽOMVP}A/oÛըl8y{ãV5뗪ON[ IDATiصR?w6Y,,Ax-m)؉3;h6Ӽ{Fx 1$B:!- |`#-P gLbխ$e4+f!f; ,g Pd]V@6!"`NJa/f^$ h2"+&; % eZ,D r-kJEWtlt`.SJq<}mځ=vl&{m/Th"'\P-th@-Z1W<2iW)6vV_$.QZajnW^k-009- m~G\d '6 emW ֲ^ /aBLsއUߎRo"RJ!\tv؉uJ!,!R&괏lgOEz?D>JٱErA/eZL6 Q1?IVI/PMa2_ĒWo$nxj-$Uq)/8BI]4v2AfopV|Rk"NՠϚРO셞Fywy׆)|o:| ǸVaDh}+)ZlP70wQ(l5J D®9n0m4B l"װ9>% kuG{ 5elrf8Ro R.Av3pڊN|_ZCS^Cb^]#H|]ŔaʣHEFMN=5a96" ̶[O"b\"An=JJyQ`q•0eRIJ<Z3'2=sˠ^܂W&\ҲPJ :s߂pv/%᣿@ݿw>?y!B/pq>x?\Zs{@7 |{0 ;{ac'|7 Tn/E/^OV脕=k 9/G3߂y:8= 48?)gp`f`toK@KB9`\ywx)8N])Z ~xz/~2+7 mC_:[EpU.jS0[7xvi>V8{j︱~d#?+d?5HvA\ Њ KDh0fADF8;z)K|kvmȦNXA_ŏ2"Ißi(jQ*%s5$B:B0bd ְD%*D C!B. 6PQC(w.ɕtŰjq2[^#qq,{FFz+i8U ӎζuD.XX嚋D'JT%+t,Pfh;0zx݃o ZciuM%|* !=Y"s AvJDC6]ܵ:SGF]k;G0®ȵJ|i5ȆW 7RTKȨ9067_Is\xT%VM*V=3'm$oRa12[ck@uf{_CBRhVHsљJJ~ZXJ3u/?qE_N.ˏQ^Qs!|Ae9R`M)7W&ȏO.ou./DM_S??ͼr;9q.?m9v]CMT!o\c8<OG߂1 &x>tok'YK_<(!28}u~ji:Q]=@+j/CK϶g{XҾPgT R*v$}q%6n>Ù;kXu[K@$.b} QF0!0|A Wsf$ǎGi#uJ#xz 38;s14w'(K|{;Ѝ4#/Mh->oZ(P?. ?Wۗd_Hk] q,Xא?+&6jCAˊ:jJAM@ 3נPh*ՠDuZ-VB*HHL 6\TK\ #Ҵ rѭc Af\ǖ A !6(W[q$4e~7),VHI([_Ѥ$'W$؉HX+l1)N~cK B;ʹMɟƯNw#ihSl:KM:Z`w?;mX**k1k`Uhr 5!F(2RMrٮ zS"!uA7 veIAH_EF=z Þ'3Q` 4 JPM V|-Ba:hr*;G+袸5kk$bT/;Oא+VQf:BZmHaɜF hT,_L8V {J$RpNÏfF,f#d21c[Ig.ϓփFgъyZ7զk,)\azk,thLuж%}`.ހ ڢ'/|0s }Eo_>.=/@zO= =޵)8 ޸N/:tE?~~|Ep>1X\/r. +0Xf8WXvo33 YA41Exjǻ!nh뀎d`/hpu ~oྷzV I _<WĜHo] Bd~KW4Nˋ"wRH~+]tU}A&J F'ů7Hmtvrų{~͛` ןem`GaP\\aעH"r; Q] w.ob"Af74ґQv=l!}h<}O5*g;oR^_.b1vM 4t]ɧ?j(um"'Fl a"ӗd[n$I/\WvW7BsfbK!ރBZ`,5o&Б@u+y A QPp;lk1$!U< h 8?(xb7 :^=R - ĺw(&UҐm B vUH b)E%z>* TDuPZ Q5Z QɥZ(ɚ++22ZGt64  \䠷uݫ#D"a]%6.Bo@W7F]Ǚ9) qRQE zܢlg 9WƢH$D/f.^`+P_#t?DTQ:A{MƇ]AJdW,kX`9TXiAh-Al=Abu Qn đ u|eD #%ށ-JuLҤbit: :uY gI"&چۥN4E"bTNFBN& 7"ZtDd>;YՖ~ߤ8#؉t.8R:  6))v+%.!9jP\]Bz|OQf2%wtMu^eX6Q:'gIN"[H_wq`.z3i5 m?0lf2S| jgug„bvbE&: J\OK7{ozꓜZ["hZuy{ګ$2N<P`#TP.sO/ҽjTÎD=klWxLG]cnr玝jA&!vc3Dn$2~ ?at6^5o)?Yt JĔ0Ȗw"\$gF5TpneӫDŖt5Ϲ%ك;9ӬZUbuObI!ZF7:m" .=a xUe Iqy&QR7J|a`%l:dhf=$;_ 5?&(4Л oV*ɨ!&3d ȍr]Ԅ@jcqio]ƓEsO/ʘU^:RQLٖX:v^ށ :[K.-a2}))Q\ub)O06(p-#g)Y#)v>9WI=9ҩHNZƳW S[d)5cߞ?߅4djaC 5hq`%ep֜`(k͂pTzV?@L*fM9f&w{K*\}'+Y1cN|I2ű:bc2+RjARX 5RZT7;WX OO=;sq4 EQץިyu=%^Kq0? ->^ee_zyy?x!7?qs=iO? ?7_/%l3~lR?\عD[k)J8E"RZAWuFPb{KDԗ&Vh?#f 'V1xOwvzp]aG5 Lq\e`Ag'*YEa ̸1J.Cˮ1d?nz~.+hnBv ݬb"#jfQEL\p͠5D B~ OGb(a0dH=k**=EMDd&-j+y7<ܦ 9 ]F PN} IDATRrlBGTB JӤ)ḓ\bW3ChDV6vn$K.I_D79`%uD8[K'>/2LH@mPMC4 IᘷVybu(j]jw/wj4 {kp _%uomc/Fw*ܳrUa'B릧=>р'uj[|#7{h넁$,x!XUx'7hc? w{i8ZB[z˙ w{}7B_#HZ +xw&!]spFeK~O ,&F_w` Kܱ`/sSvÄNGaPSNBIOXGU-Ʈ`}bZ 3+MgzG~On҃ $F),S6!jR@\.e[u9L]#[nlFv An/Ѥ,l|jQo Uژïimam0̕&#~^ <+?Ǭ7 \B5RB?KYJh0<7o{yL`'e4T|4& /;3ptp nmrf`w*| MPuJzgf=r/P+nxa#ݐ+']Mn=E'RFJpbM{7pʒUrE{ap힘WO;wׅGSW 2:^/ 0 d{8~Lb$|Y1 ,C~ vCfdH˦~Szho"vb6bu\a"ׯNr1EP=L~FD wd\BO&"*V|R·f!I[~fB4Vh1]]XDa9e (f8)>rmlOq-1BKUPPpCuz;؅җtu3cO<҉־O^Yfђ1DJ~$ жsNn6qg|oϲT[q%Jx:h\T24V<'̜DaۑtKLU`2gߎIda߲BHw {F]ֈf& 1ZAC[lNd7Jhl\ΒF=YU>~-"5 'W),m6t͇u9RX}8z A 2-~?yͱ23i%۟AK h/}[9^cfv+ˋ\k.n uHq6Akc,FK |;8(:Ib4Gf\á+ k*Ѯ0J 6Y,0VdEW R*kDi2_$V>hܸFY8)v:YFŚPYX[fhni/¦8uip8Z=c !ޓEqq1) W:>L۟t,uc:1VEJyJfl[`hf1ϝ:x:ۖ08ۿ[&`sXuL}輅;N ՃG\p8/@x %%d,\7wIN*[4? 9ù%[׶[XYA 7QJ?Vc,o^I喒x1 ^L,k+Oe/۳pK/LG ^3O[nT!$hF\Lv`fKD?⿆I uxS yJț~KQ z̨i< {*ǰ7…3@V4xi{Z&\Νھg|Eh ~02IXXPjzlM 6uC_Km f{RoS_|N\pp+lԠ_u97T#>8z>_`)&TJPXWh y O_9c[z" dCqޖɮ=>+7ztBuaGj^Ⱥ=ʸ$y~*l$[~SPvaIy}ؿ>$> #Q"J afacL"TNsNL.. ,L\f<(Rӆ/ƨFhjQU0g cMPG)VP;):Ь,5bIWZtjj"j:|Rna6O lFR\{t! A=G=|UL4(ǣXB_WGOl֗$w{QM"hR'Um$~V/mLnbT'ujUo0sU16S$YF\HMJ LT̃O$(Sك[c$B4L &R9RjM%1~J(vb6rdZgprRxSn"4U5v-#`@&gp2v|]nkѲm,Ɖ3/‡%$FG d,,"['S*hmOѵPwd/۵u ЩLK@hթU6:?#ضϞebtI ,KCj*R5&$኱[M ")*?pZWLmx$T4Kub=>p^v ZvO@7e].s45Oy |' \b &~ ƟC \5JhU*(54f_ړ$WjWioC_x k̬7 r滈eD% }t18U`d*/eB,L^pu3oR"t;SOSO٘>Bz; ]Fu ǹꝔ k$ڞc*:<9?Ll=׻4I_YA* rlHlSO&_{}KDM @I/j1#*(u"Vz[+o7 BB5+Zȟ`k83M?bnE!8Zj͙\^˯+!x9ۆ!;;ay E8ֶsނ?G 3P f 17}.Plbn| bpW=^h*_m裓#Ý= . ^/{9}Zt݄}wz5~pzWw;|Gɳ^G0_= 'umadqx`a ׼v/mT]럄WOA8C=pa ݞR|>;'{ Ǡ}6z ߯r]7< |>rf_S&W;)$9'2e?)T[eٟiwZ*~uƗVNqh D,T<8l*zzp@]GɎo3! a^=]mk憫/ +75}]LČEE &yj5z#<4gAb3Ƙ:JڻB7rxW5n;'vp™Vy`YaJw2Hۜ&ʅ.}pWj>G̜\l$iP]2|>XoiN/2Jbµ\+g*LZa1Dn.'`W5d<֕} PBh1<@>}1Kp_/'$|)|^J=`|\a^u Ջ fTɋ$[; S M@O*|tbT`~3Dq_G0o* B)X.*}h6x\Bjt U+˛M:.8~vQ[nÖw_ /wypRebvXX4U쇛Wã{`!bu#vWn|yp;{0a<=p0lv<.̼D@yg?6/߹7sUגJJȖ9}C\=V o=֜a;mNWM2@A4ɓR0$2ϨaQ*_=9ܿf=~|`;6n~_0d۾ yſrEUE>oOg8 U0j..lTTrsxҹoը-ΰyd"ήX{zWo|ޡ{Ya: `hĺaBaXOA"3axв._#c04 =p bup7\== 84}SZ*;Pß|>{'n\fDD]Rb>&'k`]΁E-=PV$YCV9?'7,=h_*4? n7,i`A5z|b:1f{=.𓿅%jfaJjsvHyvi6m?{L@l 82P_*ǝJZ#OŠF;O v @OԶgTغe /=Ԇױ ۂ ,4Ӫg@ME$W'x?_h2wr=bO~7FGJdy<01*HcxyN\21-X{>Ce xVkv6{`rзT9aKX#~*954y `K@w@CcC0aU Q_nٳavDRp|Xzv9uJN(A.LJ Y&`wE b(<'sΔ~Y~ ?pZoPE<1 ̅TLFǡ\(.KKGEu;$>j!MeU ~<ZeaAr/ZlV" &QfP}m1WNM M7vSa)M2a2*VCa7L.xu'8ڬs=\ cʓڐEyZ[p0)5WK3cE-d&[U,X}wx*2i<PV=P^ NMM@2]f!{<$Mq7DpqL58,]ɴ8ba^Z!|OOF`l}u Ο /Pv!+5>9p ?x(DŽDGaxR 7C_ɠq[n6텊\@2c~xal{f/儒*< V&:?y4,Z4L {5a" {%TRvF ~Q3@p jļ `Ix; cn,Xdق ,b<6t)3}`⮭aL_&ClxoH:[}ڔ 9 @,5uflۺUVbӏqu8\oa6ϔase:<88b )խ[p8~/=ťc+,Z&jAf)58a1ؾƆ`j04W…w["TJ/IsıW-r!_֕W֬Eq޶n\ |r=o]bX>W=p,!4: gT£;oJCC(^>,dV~f,lA8~eCLط"? +V@$#p\}Gwk8* .s(̭%3 @(;WpDʼ-2;wBcPQ gPXJ]!Æ8׿=`e ,X1<{ LE94C_ 2+_o?v'fCl6̛u/ dT*$%x<*.տz t[M R='wA^K)pw-otŋH"Y > G/h m%6D=.+6ÿ),{ fRqP9+V+ W 7hLbfTB* rct"=0c\wqTCn?{ǚJ8q f5CiDF#GeAդL:g}P[!D:HXo*s<vH'> }ce^X4vDe+6E-X`+YP *iv?Yq@QNe/ӄP^&By`D:49&`ihUm٘>f>gܹl~~ =ͦo*a6 'څi,m&O>/}+W'GOq`[?TyQ|(̼(/)c2Ͷ`׌lS wD퇚V!<RUDt@<.LfJ@7g#'` ibJQDq)]p~Iq3 උXQQ{C3$wΛ'9ˇG`WaN T.]HnX(ŏA<:\DT=,y7 :v([O¿3NJYvI1d`h%Y~9YUo [ĘmxRJ#IpN3hGy >6Ndk惙aX \z?Xs΄5<9agxOhʳm&L3+W|ޯmm祎Y:k=]w/xr11&ƴ Uw(܆s:D&W7,efaO5kxGxuעT歨Ek(U@)cͳ>1:M by;6 o:w oT$P UW!4B. Rh]&ra22.yYD%LìzQ/A/K ƙ>p7^#ǩPfU~XX\]V͂eu/|d_2O??[LZ!OH V(EF r#KpР}Lh.΀eUy伌MPT$ĹzV^x%Yǡ~XaQ ۟FX ' ]GC] |n(C,#=݁"X> eÒ6YY(*2MVf_J&_kߙ_sc +֤ JDxC6cYPQ/ү=o&IKW|W݁nsHE>L*ls$M3xs<\MNu=ތiYRfk?NN/r(U3#w9J.vx 1ٓҫz$3AЃpAT JkJ#O¬b v(CB snTRL*@ѝ0I~_ ׯG9.y]"%pQ+ij= |x?M%~QP#)yYl4"./} >!W.^ީsQz5Kq nh?Cð|8u*pzV+WgCDtlpt7,8:@=+B߀̏Rrʀ(曏yKV%^|e,`UIka>޹qI&JG1W!M;'C<7~M{~Ȧ=?<}?|Oe_ut !YWY>СROo4B2]G9k%J o`] z[ ]{~>@M3,^xqh? .^"m<*; !g!s㔔o 9-@NKg>/pJ)ok#+ OF~J"tUʩU3Ş3jPJJlcXܤ:"ʩOᒥ0Þ=M A*!Br%)F(/&a|œsX"]&!v|~hm~pFC#5BUCQr< p-}/1q..bo@^yPqygLg6B fwLNI0: [r|#p13don; ̆"]HܙT=wCI=Ay{b[_,X`Uab R * 2]ݫ(*|'3_0?>n >QbܷpA} ((꙱<n+mJaR-X`s/H!?6/d$D̦렻Wq< uP_ [7BmY]g6Be d3P1_!1JǡT@['DMPS k;t&'?rqeP,$MptZq)1T eB&g)+fg-Σ8" yokkFpL̷m1Rʏq?G N?_qͪtCrC5&x]U޻a7/>&Fx__ ~)KWUq#dmt ]81o+gق ,bQP#Aر)DJ)Prk` U؍Wm_7ῥ&Ӫ۶mn#w~eQTͦbN+@Q ՎB2ӥӑR,X{'R(RSC>>&֦)}u_C(RKœV {h zk{NwD l Bp8aFâF}HNj ka_'OAYVw/eÜB8L`w.4Gkn=Wb5WU@\]$`#Q逿\_|7 ys%JQaAGEaqVe+Xzo{/\*WAl`b~{3!h[a )F~8^.R^}YnkGLǁ,kȲ ,Xx0 Ȫp=ݯu:QhZinwNo3 ]nB0^{-wy_cw.gͦTTzʙ)8}B%)`~5Bn2' f Zۄ,g_`KnW*kv|rd QlDžxg:P=*]7n)^证U𹿑ߚbYQtLr7j|P⁏ ORxᾭkɣbZQW dTjK{ E]'N݊X!yk;&}եP]&hæ,{OuaN8A#$X.x >wvrrx 88Oy89*$:,-PfXdق ,r w_s_ߡ!l偁nfEPso~{?ğsZDGY`[rA !w,PBz=~iIrYE{b)tl0߃*='GWo>Gz΅ @ka< pvC]=00n/"~QKm|({¿l= -`\̺|a(..9s**K{<z dl~>r99%ȝ5RTmplH*%вfk_| >V.Ax:'p]0U/=9uÌjhEF?ٮ y?5)D\ Z虀VI9> ,r9ȼY` 6 --y!7x# &Erܺ׿u>OO}{wC[G hV$C`{Eqe<뤸rߴ.+e!{!J*vRbы-P_!t^< \HK0AJ?p:Q^RQ蛀=r Y\h$xB|281,缪L̃^"aA&) f!ʱ$eoq@(=-X`?R*TVSqp8|[hB"(aXfZ,X#Wd4[ lġ\Mi1k!7 q]+n[yp*!fk0kX/ k N:)>vσ68wt\Q]b}n:lӄpLn{`~Kfy ?yAz廐BE58:(:g@<;:[۠DErS=VHv,z`W<Y9W=K@}T04KiB<EXB[*(#oDdalN/F(zq J1Ȑ@(@$I;rYJY^[|@Qq1i [ $">1Mc47SD:O`r N\ehL"$Ԍ{ꏚ $Ph8f?*G6mġC({5qo ~WEGD l9An3l6i C"GRU1nMC [6,ưpTv]Cr#dp5EN3/Me)EL:j{@/2d̴e)n##4WϑST4=`)nsh4$gdq,4h윜r*e(#dC96{#®9p ;AΛ(dm&˙f2acTlgI'tE3i͕'<)0=)J2ꗯXGW4fѢ"ǎ ãbKe!@RfRd4iSb:3K:o"C#hp[qN>=!Dj3[CQhX,.Zk 2w IDAT[wa#YX?TJs8,9Fa|ys`KۄPmM%xl۠ vmU9x]K-K /\,I6BsIgsӻ fq "P퇎!. QuUK`.* bKwGt >rpQɅ\6+x: ~$fjLDžϪrS`AFn!*Gaa=ijɟB"]0 ^[MȲ׌Zg; +6dy0r,xr7#8,uI;c8T m Wna&1:ތB̥I;z)E(a@bjDO5ȹ&(ivA-2)dFHA 8& 뵤BTH+C a/ i_H'CE2O>ӊ\FρJ(pv' &*JäO(Eb.vѨL2l '_9ʤcWHLGP|$YxKT<9O޼ƅœ(&pa& WYoI(c3'sLp7fs<I('RgF5P6rZwQ&"J`#ӕŭf˖Q10H#( GJ=DMM)4< Wgԥ2}.1SE'JY#S8kɌ:( OS=Kr"F2vj"YN*I8DxͽLWhVBj3&'au*$FFi&Hll]g$ d\"Vbt <Iq(O2ѨdG'H9㸳)f]'aw25EosX1zm é4TN]JZM"%5PvXJde +cH0i;Qv3*meB\F:y^67]V__3TPU*EAUd'|^9u |>˶K6m~R<7 &3IpTz^U̺HLʜ&95yi$18<ME.ڪ=3FSZgMagfL:&ccjB88S~j[ ։+ŵ%~]ࣤ҃o㇏& M#2:񥚉;r`hɢJi`b2ᡭF59"f JH\((i-?N\-7I*J(cqZ$͕6Y)6(>eމ+FM޾JhLs1$ܓ3 d0Yf~QBdl"( +[os gvSżFjIԴx3C7%T򆍜ǃp(zKOQcY69d1'by'(^H( U{"JYnQ6 -m*æɘLnMq(m\ȅ۫T+3&p!3=%8(VkJ$R Uh^0Se+TlQahnbhl0eMCc6dF&C`?Dz+b$b9C<Ԝ fW3aw3RjS4,0͓٘B1hh%ePɢa`(6ՅP QՍA0.ResI\FҋnOuqfLT1^ڧ FQ<$qC)qg|ĵ1\jl>ANuN\;1~^8ku]-]rR/Z=z{^PH낛:? sfBG2BnK†}sB"bns -MY !xyRJ|TZ~ Z#Dзaէ硬eFAC{I2|P}1,}UhC=pq+/}V, \^|&' E vٟ ,[xh(*e aQ%3P0MPeH9PAWg|2Mf6#8\5w|։]nye1`q?/5?㪶^>yqVWhƯ{?@ %#hOz2j;9$fMEY](yMh^Syjcx$IvׯXz_]G]>jq1a'}(%NlCo BĞRM"0e54;BnZno,4Ա~)i<$Bxk _Q0@~GLC0H",Sn;DK'9C9tt C`hEe(I0&SYJ( UZF0iND=jLQIU% MM v٥بN3ٔCMqԌRiK27&&4Yas'I'HE1]v&uPCpbOc?tAޞ%q{(ISsӓݕv%D/}_pxL@ I,9ƙSLtU߫{\93g=]5LXW;#h &jV-DJуXF,8fd&%tL\fY{YCI t[`A3V ys"Pi\@SF MJ{WJbJ.Qs:"r#W2R &ݏӯ23qh͝rmڮV^84 װZ'4afK[\LS[X#6aڵh▷|ɟ"a -K 2mR#/ULs9tENi WY7s#c|=vst FRQ/>vHdV|;ɉ04vNkm3:IJR5Q\e߇5i꤭ksDjY\VSArU6x [8M@h4JU ]~^%+Ȫ_`)KƢ먲tV??nu*{TƮ|}Q&TEDշaA}oLm23ps+2|cqnB׫L'zfLzP\r9ܹK{Cn3enohi}#娋s /$gOp2z@if}#+1Ü"/[ 9Z`aLN٠i5ñ xϻR׆H\]D4u:6u54Qk7ǯQj\7$G9ѾWm22[2 q6ъ0#(1xf:?֒;l;y`frΓS8-fۅDB?ŒxHLl;jXƺv-M &#A&}y:mxLxoieUk/%Z@M@j~b*XCp$mlǞat QUڏZ!vhm(!a#5}rm8uns@UA k;6~7ktdvt1`:Vv#|'pfxKpe꼿jc_ިg<<x x!S4m<5v2_e5;_l qE9[M[kZ{`q .v?w(@87 8< r{A" x`_-O=GµyxlăX} Ļ=XcP6 囯+ I-TBrU.u؉Kt oJ̤%K85өQ  Y,XÔEzl$Qqx$4\b :\-iH$~ (6Iڌ5Mcjmba@φ72P!ib`#oq5.*1LIFrہMJ3Xh2TS"ɍ v+5-;8, Jf;. eW ؠa7"&鹯:uďMT̓8oiEbkGY߄^tNSnjƔi#˧1QflJD"2* gIjՈ橰CQW,EDM*a%( R6An1YS[ƃ(-S5,348Jiq-}1PFG,FZN**L[U'4H&c8V:ffLXʨl}LcY+G*a;S»A/7!D${6Syޏa pUEE٬q{M:B׹ǼD(9/n ,IbI3V7pz0Ys[,1 B*V"e~EGiOqHήS"nm}8+L4`T'2. כHQ7B^M3rjY& |]ƗLFV04u$I* ۸ΫMTy ad|jO :dK>mcL^N.8K- d9)alsU1>y j$\,owH%~mB ~7_޻8a-9lء1K" ܿFg;.giYyp߻tLHi!(HܽC3y"<JodpD2J !͠19bk])#}]ew4Ō=Ț\7t>)u__\hbߚ9\`u~^k w%6 ;+e&44|F44IaʳD1havho U,]ZN"| "{Du#vwS8q́jc) &[bKZuXQ% ]ڵK|RJ%e }={/D0~;:[1z?r`4σ| >a<7|oǘ`(P5R7RTvbXλ?Nybϳ? Y3Lwu<6G33ud7L4V2U8 qh,l㏇% N]Jt=lH5t#yss57Z8xtż&Sxq $:Ko"7=IwR2IWNmB_?DprFr ̛Tq:ϭe3 VӜI (x +>;^+ % +_y-xvUrދ Z xanu0,lRN iM`4¾C|RF8 puT4 ߬E[25)_UH `+Cpfz:jǏը L þ߁ V6{K (?q>۽S𓿅LE;sX'/uxM=qN`M3{,ki(ܶ9 GjԲihlmz%<\[k{d ^5mZkIm ; [NOSݰ&:j:Rmt2 8kǿ2|i‘T&^~mv' \op@_Q'N IDATx.^GGشǼ/sN;S  1k[&MKz1r{̄lmc.&g d>:/2dͬiـXE9vףʳX:*.6+&ZFf2BkIܡB+A(%/=j|De [X#~~!'#9d'scz^*S΢'XUHM8AHeB%3A]c elwN(2J#j-4Ɋy1 0+wwR)"kia-Wˬ*K.2 $3Q2[z >zˆB)Ķj(b**9j-eZji'>32GE c^w.^w JMx'G`YWH}zKc,:1Y5r,rv|AWs+!-y 89Ё˭zh alK[0?Xa.6c3fp*#V^x Cpʼng5.`2Jznz2#í\) qj;h6K3Y1E$-঒R$xq%|S1[)*b#Ln-XQNŠc04a@w`l4&K3xF̡+o{cU(;iKyw| 62Pmer)GUfWx u~iEwիU"^+֖9(% c_/egCiaD݇f2^=hΌSKGqu]0yy P K(l6VqwǗSL -T6[h(G OChXi7IR[IoyabeM۱N܉XaOv˭OJ,+6.1:?U?v D~k|hczØSe椧[0LxӋU,%[ztto/Xρ{1 J*fdd玽ҿ]R!d޻A(\%,cSI([UذNn}y7MTik+^#{vhΛ!pI(Eq8!`r!*!`.kFLv]2.31Sq"c D6;çelhD,wFkֈ_!28hf*A{U^oPܩ2`stZ UtC*a83/5 xajHHj,лu|guX%P5/BnMs⒇ɈXq- fN_RY/ DOXlFx7p\~+N&DqVFtJp!_O^~X ~*%>Q\ϣF%E65 TKL]JGc INtOIkBTu)#輖AEci Ц(J4 6F~\+{F[4 gvKSLZ.WlUP^+&IS𝸴fGR,n>:LP%(kmoNFe/Udϐkɒ0c}|zRʄ+O\(b0 ΟՔ2^1T1DYA#vDvB$`98WsA O =:`gT `C6 &7hk&x:e0ᵟBسOעFavO |-vdMA: ~]M^ܬUoQ{ 8GR0:Q׬7/A 0:>/lj Nnx"j-5z(D޽wרߗjzZ3Ԍ@w6>>P[oQ,Ӌ01-5=|쩁iXoвntyOB, 'XhOZ\n^#jߣ1OԌ2eXLզlઽ֦{8S3@6?V< ,N`(u02 7oIwR->lʝyv5sEc+:#T0"L?sf mܑ *Uk?]7Ώ0~76g4afQ7*'6l۶PllqH:1IJ5mFoWYαBLvwIPZ'0j-| /?ϱ(G^$$3/~V6ߩ::R¦L,߆1tRE/HM_5| ٴSg.M r%KެWPp{vH$lUUV's(y_q ƛQbyZZ_fCI;?٘ڐdOr*jwQP4JUBV+q6h)An4 yO.W (sKp`kE6L¸?Y(9ȶ؉(UstHa&y9fF.Qy0$Z$xy ďMHݱ'sR}*I7nhS<6KoH#/IM:Uu C80|sQVC UUGde䪁\ŹRFf)H'ɕ%$V~˹^?؏h߁#ŦYe;Y~tC&i,XduU(ia~+kDꋤAZ_KpX𚬑8Ueyx=vΧǸ[f'Oaesc+9;FK'5.Qn/1R\=B _\ :/~fq.ç$4zzĊSHh{pμ:!vp~SjFU]GhA)c2 UɄhA$,T S4*)_ rWJGU+s*Ū̟BՒ*,?0U U|kHI%XyBz@ṛ`˙9k,YI 26SI S0WDRVBY*aPLf锕X(ip9TrLOKXK)wc}r-XVx<]O2ώ;Ѝnv e\&]\vl"|ǁxa5hC, yls*O=S\Bbbp&c5S$Ri3LQ(y[44 WKZ!Q6 8-aO-a_¬F ~lBͅ\6;6rm`x?m?eK}YTW xWHEK T1)2]EwP._|Ia5Xe>Jrj`L&oAR Ylxں5|&=5vZ"xGTaFJثER/4",4L'yi؊P'~8%_X;_- ϱڰlD48CUOj%JU7 r Ar`7.WDE3 +U\&uE5M]fU8IB1tdh^ {'!3]8zzL`r㚝ȯm kcT렮Pe%5b(,W-n2eŜ'5b,\C:jBWAuK,- ;2$wH(e0.kdS e?zFij؝s~TZl$P<Ʃ x9x` n5;ˆ}Zv_a;JnɈ͖`8:sj=n#QzI(W)V|4v[o¶d`k7 }}P01lmCPW^G>Z 6Tf:08o |߹Xo8ஃ{fi(Lj.·O |5s[AO#|ITmһk4hYg ]^zn ޱ .(2 -B8Tʽ 0Mc0Ý(>~BA?>{k)xfa׺Z&^oC" _ |!p<Z|T.غWoto'ˁݸ _J4Mnp߁}5H:.3hBןڄ]n ըٺ^{왳M@a1|R~e`ٸQ7,$nkjhqy/.c'QE{6p 8փYϾ5wqIcy zbDMV;E:'WVqq[*c1YU6sJfflS39#$.0`#ލfd9''W}R:N;$]*HTi*Kn j,&*wkV#oM`i\F,Y))e -,G'hMTfMOL*37/Zf67Xsx'vkWށ#U\[z\S k<WHi[(ʤ#2z6ꔘHi4 ҃N |*77HA"Jlùyf7yLz7Ǒ^Wc:gGNL7|4_S8brJ/Lkyg"Io E{nlP[;3Lof5aB6V}D9Hcj!l#A>݈yL!Rr)鬤 eҾL(a4ߢ/u ,%j W=L\yN6FhY#Y")J7el# mdxӺG0z5X@$ӑke܆bαg#d_@0yZ% "&ʌ5HqUչ߃l,;x3emG~=sF-qoGcw,Ӽp# Wls{妗Fgo=,$I4[뽋+QsdZv،9D1h{i8' ql'W]ͲkYn}[&KCHԌ%B3㹊ӄJ|;} }y~rM,Խ쌎` c׍Ҽ&ZLTQ":Xê`T)Fb7p4X*$v{ˌ1sĪBWG 5c'eêh Ly^X]$L27/w-%..1cX,13p-zv9K~gwU*4MhG7m@.QIm<]|?be%Fccz~'9P*ޞOZ{ Glb*B]ZBHXC,c5R`1ݯSU:$ޑQ0yj-\8.| IDATV/dJ6`g~/J.J[A#|IAldUQH g]]IJQ \Rxm%:FATr̫uZT\I|ߝCt5UAJMi\v-#[+肑kR`ğ=jbjDS疇5n=dc)$a2*#*TFUV/JdUZ B\n3`$-)6nH.s0< v1e]Gac|ػ" $kZEE3$7an S 7sczjTWOFkRQ22j0UXw֌~dI>k{jT$ly{WM/j7* ::L}7\$omlQF LF 1n;4?#Pcg`j5]q{`Mz`1]ԉ"LԴ˭anl.e==LS&dqK`|a/w. ݖ#SY NrQ& ӀƸՓl:b!X)1MlA2ܸsY.ô5}PWУIb/;H\}Wi7{irB݅]@bx @ H1̪uTE+$Uk7{Ι'RFiI}p')MG1Vpse gG단&>b~MlϐSVLv[SZ/k EL+@ u@wZ8|Ya%2M$VGGPw l{9;%.=T1]w(Ws[id)T،yAHC +L6Ԭ ~')Z4I[rQCNqY 0J ڂ#8Fi~oQEPx59p`JHZ+QoB8犸АZ4? + 9kS .2ýaдBldm*W?%p&Աvqಟ<^F4w|=li*nPZe!aW .MɬR.~qw9_܋8.^Y˥r53zF`n(+l 0|kLI3;PeQ[@6va\xwkN5-{d/`,I@ (5 ouO`31E݄Ð.zP־ǡ$ֿMd\TH>W`7ionN`K= NYzdiE3߯1/Ƿb +T64tFFjַ9Y`w:vWN>A9M yQ+:%G鉟$\:Dq2qz/I&/Le@x7AWh6'AlM/Ŷ)SzXvPt0ɮ"vdU&4L kEސ9VSو&p<:Ά1_ P2Kn QlPwR)'妥mn$եHt۟@D^,L& EgH$8z[n//*.l PhimF]6Q,FdIEA;=i/rw.6+i0$1 ̶DìaYܫ9(*JȒpLfOU6Z_Ir"΍LAsfq^esפ'QQ&굨JRb!Xu]g|cTU$GBtdax&XAy >mq@Du wq?a2j `uDn J#hS#D'cm~7~YA LJM#i?)uRYb{HdE}OաnQkuLUo&n]p5@M98jb UҖ3sleO}v+B[F -/Z[a#'iTWh4-ًjov*֘_hM&7祗~~*KKA?etCUo|cSSE|MyꛯRɬix-eɭR2T3KnRs,+w };z p`7s|>8|_茯.uj7[{:tww{׮COtu_IX@<& sx0맠/Oщw%;\pvjX5 V-;`C8X|$K7g:`':lK 5_My чǰ}@{##UT߁{PMvlEb_ <3}LuB] v65Э WL^@ )M^E#Psuɬ;xf3"{Իt[cͨ *]UV Q"9aȇllk&J?bb?z EyS=-2IW Z2V)'aQtZSeRʡ$X&{,#/ ] >dB]URd xg/O)b]eu7<;JX j %[`YȢ<0/*9)3zZbn vMMY3BM{R pH{7MxgZ}2>p}S\ ^G.a4#A{|?s L1Spt=N!/h&av#(RҮcO|QD86Ժ8#01j!%n z5$z)L,EL&50 p<6""{dKqV2MvH\qF&mÅ- /]F-2*Yc{\r[/ LX5[iɔdǛWnq=-o{ݵvv[vc]A Mu@[8\9px\-yzF2ESƱ{NA;yuPP"N1pDH(Z8=pXV<$ E3coa7RW,ۏZ%|[|+7hukb.s'w+9+Crj?^ mFR JjɉEM_fɏcĹLB[A&IJ9\1@R x|.q66h" 6eưOOXm2Es"ޤAO /c'!hdTG* 磜\T&)5K0QaT>U+ZQOun3( Lww~w}zy)^AE~\ !*)/ p7\fd/}?3f"\!kT)|z3 ˢ1>FjK;ZV58hPS߁ w:&^_}\kvF{'߄_Nː{NG[}.='a.׉:ށlG+mxac:6|0H'y y=- _4at΃y8q\۷Ndcwo ^꜏}>:ffObn8wcU7@; Utg{sc0_w8\da6 {砽vw×.u񏼯>wzǿ?] 0d6-P0J./ˁz亠rpUvj\|Qv&~y›~Tf]\ܣs<}zKϥq.}A"n] I8G~9"#q,]!Gޑ =KٽLveb+ m!_Kq؞fEjp*:56-KkytDChqt[7)2PU< us'ȗ$hQb]$*,^RvtЃ6@ve^Nq_c6@ъA#ӫ",QV ю1fCVOXs%?ᒌ8PAxH dj&k5EiǰwՑo'`Dh%m z·R 6昻mqwA3,ZuEfKFhiegg;4^qٹI`J{huznBM)<}6rEIUO{ěA(М#Wh3o"w#LO#TnFͯӵ"whoG=ɛ׶Ȅ l 7F>V/}_Kz_f?%*~y q3LCL4g|vZWי6҃]h eiT6!-)uxNK e0]!%n٠knHn[lGi-wMiʴj7Q]"%+qY~MGe|n SjYmPNcEy-ZGw':/:jZGn#"(`Y ,S6^ 1gp2lxuw@pk318WoXmhu; $}g@3l3{tMMt!TLtAt KBlqI*"R6$Լr`七 D]n4!4Ap9htZ(3Uk`[*%v Dvl q0iK{fפlʄBA/4j ؄%řL|L2,"v)gQȢIacGȶ">zOԉ6mC&a 4(hmꒇ+Nj`6M>r۽DہV~Yߦnxm`Q/8JRڵΗcn;7vc֖24N|kWR6#c;"wH)} Ű]DbGRQ=(N"|={ǩ_\#fh3d7 NrO )oa[&GU!)mDI%b"rXU,xk]4&|1>Aq5'I|KcJ6=P@}< f.hIfHdsϿߝT`u>aGqn {ߌS`3t8L]eg[e<4ss+h*RfU wq371 &h[;D6jJb &v,N_>kKY{B[ЛT fga#"L?'~yh4 !L^1J:zkC$0_R0q.;Z3Q(6k,W;.ٵD"PvOvb۰<l;  ;zm ɎY^vs0L@ !d+6L~?`@ۀ;kp ,QxnadwV` í-࣏u2U_{S3";q?l;# ᛢvЫ@O(Ï,qk ,Ñ,]BD|DY]Rַ0J09|8w7q<͊4ヸ#nhosgؚJ>Ou&;w 6"2}pP -W ŒPЙAnw2CagkNEUi1%H^V95-CIPVmW+z|ɷ,WWd6D^:Ṇ we޻/- x9n.SC]4:ՂIJƽxRL7x$N u@bγFAV ݬLχ.Ms($VNx4F; 0?&q'ު' eʻbtSG~[z ڧG)8_68WN[p!͠>$w?Ν$*TpJDmP\dX] Фh*#CZ -cILs[f>UaE6&ڦhEQuACBm/mYD,joqMs2}w C*%eUmh?VKgye};FϾkoOgUe@mꂂH[j4oq́A[FU5|lk-A ^GPY\i A`,`v@HV)E$=(MCUq"KmL3>H9Qh%T9x+_8xtJ!nа " U]&dQ$#0@RqT/v B_xBd``*Ad 40M/N@&[H.B(>Mh$MM~,L~ϡ_\@QA3xEE|d!`ŪFwFm "?)G9^V-*ԅF1Xd2ф4M=qJ Lø\q Ɏ#]:.|4Sr.vLχض E34?]'`$MFIմYU~6{ULfaGr! ^XQCF@hO z{+| R]0dGCID?JgRK~΍[Xu;9z1uէ.diUC47M[M,NcݨήNf[TR[<&WNyvs!qZ;4Gb<8g/kќ;_O 39~"=vnSIcޓ*᰼j 9, 55>|01_$2x:7WEq/{jD"]9˭ G`zC 䑗  *?zfH%`9nBt l%tgYhݛ`qk!Fg` RވF"R9n&|8&ZC$&}K'3C h qFFxdXtMxbQDsWY\l+I1vT*VinFٓs9y;8ok{g|CFĦ*$׮"+4B^+vȀr~o|T&9q& j=SH@f,f^urY!l?{e %;QFܘu_^G-D-7I,Q22> =kD"a^}n|3᯦/;4$LLbKt*էl2%^6IQ*x]*gtZ+.J'&S߶)%J8I#A*&lKT s\JݶQ7M7vO9}D ,evgY=k˼q$юҔ2>@ᣨ̬i&6jsGnwܿN߰VŐ~ڡe)P"V9\•,`3C'hJ"QMj p5[-8- T&ftAj=Dr$&~K_F30qL FGP 9uZ JAtC9h+\"^F,ި8U@P?J8bOR`[o9E,! XݺNЇ+Pb=ru [1 K7o썲3_χC.v|uZim5ۍ@zB] A C/boϽ6H}{y߃ٓc}{i>a+R .'@]KTYZ7_H8*r|AKdˠVyLŏf],8B+iPmA?o MvC/;|w'2Ҁz2fCpM84Ρ4` d:#nW~y0‰0Ӊ(Lur4 'Na=U 1XI@OOp>v).V`o/r[FG8ݰS]IKwFx7dWat]?*FG8퉁A*q6^ގnz# a_7Z ɰSh=a +kshdVMy,ã'_`_/6yAkaOcuaBnXGsppI87|3 ܭ`5k?P[+ ֏ِXkGUyp_!A+/qzӣ Ń̩X=V &ZD|4NrQmp6TОqRuxp}vN2ZTihWXVil6רģIN՝:ө ygR[fpkk=^\4Jt~5_ pf@й0-v.vïdg8 ~=AjI(gdaէrvw)yY"D5}1̖@K&T3{ɗƹsu]27|Bي#^2׆(Me8_Wa˜c4IߕUޤ7lø4>@6d>^qdBx%<[:]WqprCIrNA gwϿiJs _?A"Q+ɵ6!+Wbՠla#>Se&J7wuF8c:q=7"7}Xy}LҟZ8Ɍ;t:Zb= |6ScJ d|)"+AR88H`|{7h.Z /{ҊEh5$1*ujὌ Ҟ/Sp+C9rL.;6B&UE{KwuOM|bcXYhjטn.'_"UwscYvUbwmq/*$u cr!/$14vD3EK*mR|ȦrC]ԥo.5( 4Dfr v5>gw璗ڈiCؓ81- >>zH, =A'pn^gvo͒ʔF2vExUc+jOp`?b0Ɇ~v`R(#/)m7'#\ۈJk%3EjBIV<\޼?'4p$(D|)obA}BrvFtn1&25".o{XH37.(`qi  Fl\U@2Q{ߊ|D%h@!>]PpKe|Q%ЭIޗkY玒FlRF_!: 2r7 7 1ܡJTRB9zOJ O1lN-.\e7j%|. z-ZNٰ)-=!\{y39Q#SweXlDN7wtU a_,Kges$.:w,}ZQa.T}QKsc6Fٸs PQFQ=%V wlv1 B%|ҎM˱m*0 KL=P{5J.?~9o;Xüuӽss{7b#v,2A $D["-RdOr(YVɲ% $Eb ,Fl޻{7ܜ:?2$詞g99ktv0q8wdKWl8ώϲDAqEu2˱3!n5BfሐsځP>KGǙttd#O'F$ЎkiUvlbrnqJ7Ş}E, g(iv!NMMmkO' VN~dXm]a)'? ?x3o^5Znق5k%^Ijb,5 gA 밻.΂ggWںOZS75|di9fǼ4k@.ԭ05>Ȕ`lR+*a1o܀/  d6gO ,7*7kKOF!ԝLX(86D >w&bsAUb%Cw&>f9ϐ}le{[Pig{ۭ:w$l8N( ^@(Esc&X $\F5.3тb_y~Fm'AޮtupȍK10;(2j5ف}7egXM&%1j>2JnHFnRO^vvugznO婥Dn%AZޙ,Np0ir6"o#v% 4;TiיNsk`32u9s}7khlzM?YM!N)p7V(Sɮ88kF՛5'aΘ(.Zq$!sR舩LR >2 ;)f\}]*J=:D5r%tCf4 a:y:E:0Uj%B)'2 ߫"MJJ;TX9XF6!kq52I%rk$YO93e2cKM> =D)3Nkq5z_c)2 kE5RBv*L Jj"m>*rD#zS#T(R;FZfӆd+ˣydwO&lUO>q3[M\0lW4 RJ}oα}E/0c!p9[HC:r V2}buAQXT ZYo)DJ~2 topDNnCtf; wFv͍L";IUhu3I 1+@HpS%Y參ӆ^!$RIW ՙTz:cՆJDJ 3WA5AuDӏ4vОV*| q&F(1n[& x;dEj17<*D5wAM2O'Hz%kYl4~Xl@Lqsi*ix0sA !Q&G>~%K]McҾ2Nf{׿^'uOdN$M5ꂗ{?d$2s_qf/)Vܼ:E\nvum5Ć!~nnOx+\Q5ӠƎ^HEPay^'>/1ɓ_5 їN("*5-ES*QSYz}^dCv;;,]'שW|8 F]B4\}4q?5J",T:bldtB$Qջm;Ÿ>SQgmV*b1 %D7;8ŴRbByt *z[{yp6( v-[]8N8M?55EAh t1.  IDATErDᤫ,_%~W>/R7{8vs#w&h%uZj όsE%9 8HENyLO.)LgBēU5axc(#+Zg(Cc(2d*lMH Y{>8vl W5 ˰!&l ȶw~zS $$Km]0z5ص6,vsbvm=uz;&[|@b<{-F?LB#0< NӰo3,¢%߲|ç~Պz{h|b XLG,.bwof/ |a} AYJ~c{`断WoB& 0; ??tLzPlZsq ..VQ[q7IV (Jbg\aeJEmCrl6QS""[݄{.)oʂoBqUze**GژiwUMYfε6kSX 6) :ލ7`Oog[9Tnt/uмXOBNbۍ ]Cf7倲Bp3tU=tTI$ܾ>fM)&e}huL3'aTqm4r6Z7IՎd8 a ww`M?כrNFR+;) nR5&J5r?zC^ZѪLĹjŠ[#o/QRV[W16VPP L@tj-½kZW CYJrPaS#'΢#tx[)Vۼgxd'~J!$+Y\U'9Cgs kXf8%J)UN;nr #}KOkn)x 01A&KzJhGɸkxHMmpق#_Avx0M6P{O-'Z@Ji3}XdG=NV#)א+3O"8&m GΊ>%v$[y&s7߯"nPR #35@pg5УELC^V*BHYQ1EB3dyGAΙ!]=+4OWjhe|z# OTW1K}qVj>K}|3~%VE*i#}ƗIӋ)!EtZs0IC =[yv>(ngvmfH#.Y@G@qMhV<1=]r4}+RQb-NUrf+Ax'p*WwSlHJ OQawH7j6Rd SE$ GM-zqTN|fv%K+ zHJ9IYQ/۔5[@ AbjN005܁5SD5#GtiQW mm_1JMl5e[a"ţs00u'Z)@)GC5f不+A0*>[.gK{z#@zDVJϗX;1y&5<cEHd8.*Hf;!%ٸ!":ShDP4c5 MYaSȶ`R ARhLz#8GtJ!4'_{>Hc}ܪŚv=ZXD]]ܣ?!샳7!W_Fn;&a5~ {= =](G0vnf1-40,~|ʒo gA{ wGsf. !% / ܾ ,̭O}mp6[xb{MV]l27^=Uxleu|.xu3=akbsњOOzޒW Ye8/[R+7%lmo7[ǭ$nQ?'jBJD?4F)EK,Jωֹl,svw~XJ'[m;Vn2zabZI/sr$PǻVy *SΉdzUkFcOq)2_=s::rjLG\a? NwFKb] 7(}iC8MP >N-.'7c)[}lTnh_5G >*KE{:q]^a$FɖV[oK wAk{貇0Ek,HM.E!kڌXh-nۓc1~Xa%7Kw>Oo:[no.J\O/"w1{Y6Wy={03yv HT}:NH_( 5i"pg9qWhDCfLO;T )&{TsH#9^Q8WgqIFepߘ {p݇fnC*g˚ZA Wh+kF7TEwԡhe"{83AOpQ8dgBN.:w jcl[aposz?gV&mH!d'Ƹ$*wQuCE8{%E|I <=N7qiҩEN^2B+u^/[d|Gr*}|Ho<؏o[3}#z֛En~ZKCq2G=zW)Sߤ]2-8*+rm Oκ&V3mR;]WD) WԹ|'\]QHXx$_w'Z{+ * te2nnOMtqT6_ɇ;x޹&;+Bd5s5h)5luRNhwnpNW*-e(ld93WulRTN̓׍}N'\}v<}&N"]eC3ؒ'g7\tt{{FMc:4%@1@M* fA7 ך5-63g=\RcP=%Hc"L|82yKYoT1ŦQ75z]a΂No].CV"&G3wUqS3jݐP] 6ԉ*+(ȊReˬbKhġ1]~jGTvf ]Cᰫ4T Acl8u5PgArXZM, #jI\N߀6k߅[{-olKզײ//o䎾7p| .ga~^"|^+x)o;a%w 06 e˼5l bOX pxp,t{ VI,@拰yb'#f!; ->kz3OZl9ox}Y+j(e5ܝ?Q O@MXК_i8ߺ0b*[a62 k[io9;\߼2 Z yX:%Ǿ?n8O007drӌOCjri'q=h hϳ*psr>n 8.HV eH ~aDg)Q#nPmrkq' {3PK(d-<FN=:znShJ'أ< ha+/߇H9 p/o!AG@ގ>b_qA%?+ )t*$Y'tHANsӹv&s6JF@§o#]3S8!R~YK(h؃_F_!-N=˸wQ`8˺CNY8<_FX0J9JVv"ubmS5-%>_iϯ#vK+1βuz,c@uV /ϱ }: _6{Tf{48C%2JJno4peUN$-U7?ϖ~?J?q ޸Fvbv>0 %MӬs\G2T2lG,瘞)j)S/')2 MB6HW7^୳D0l ?N9~|Av|u*&q QU݆M150*>jT%{~{o^@&h]-Zlj '_SvxP[`f‰Sݖ)-y򃟂^!Uad+= P,YM!xtAX\+0e) ½Vdԉv,QZ⧼N+x%N'DCЬC[Ϝ}^9 {\kP,fD5!aXlrSҊ5h ZO~/瀢n,[Yk"?~yfmL%YP<rMj1k?q?{ak&<ߚu^ñ{!Ks5bUf+m?:?O~c[vSti6y"֢efkt:(Nt-ւZ]"i2?Y`]'OB˷JƟ7khmv2g|NT܂)qLj]g G:]@v :el4 lEseG,9|T̶RNk>i^GUtV|>V"\SWiYs)mbYݦ(W{d+ p抴{)%K]`).^ƫd](iA.jf^cVl!:2j׹s|mtl vب.#ҺRM! On:05dz<e2E=Ȭ3;b[9CjA W%2q#g6H4+n wr! Tj dl` IH[ 7e%I<^I\tkӬ6ɑ{^&/݊ȭ<_ DR p[ o1vi3o=*ÑG>oRdo@v"9" XjveDE:ʻԵ 5_KwF<: KrK J:Yrql&+991N lvǽOR?oo÷˞Bjei K$]d)ܱ[>zxMܶ J:[d8&"4louĆ7 Glpx_SW'iE Ÿ]ٽ-V#]oFjx/#},D<4*>eLSAP%5<G6Ǒ$ 'W %N5u-KCo5#*H87V{;{$- nXNVN2=QfT\'3u$0\Pe-lGZ: t IDAT¦:MӅf4 *]4J&R+vq^=E{paBXþzM>XTǧ( Z M̀Swci]F)ڊ JFGspNt3J!7}"͙ɨ ZTMrj{&`ՐWܨ1* 6X!𣖳] J3KU-6Yܥ0RrMWqjEBppĜG.OsN0IJͥpYְFSCLIuٙ3*547pHhz)at(6"5I\>TiL)S.EuveOҤʩ$KA 3p4MٔNsFŔMp[13WKYp*22͒LK@YuHxhxxjQJ|dP"l8 e=y|"ъLUcؼMڛő,opQ #4Vnʇ6: Ayߢ 4x/Ls.}d\1**( ~'D_Ѵi~ _e߿N /-ϝNj +TLSG氙n#(Mlp9Ld VVO7OrfbidCw>J2,R,EԸͮ(q7II֛mت (ev% p"|V6qSN !x2_߀B:,Wo-p%\wWy-ZKjwg]}{N·'Ơ-/XRi9ʀW[6kp&˖!HOo/:d}x%u_@'sOXU ʖg!BbEKp>l׿ kq%ik5Kޝ¡%OO_> TbnU؞;b[EbDV*jHLM\2rCul5(Gݼ(m 0Sts -U4n[j&] ^#PQlSp? Ԗ EHMQ*F%F89V ,+LMؘ[.^!z%A}b+e拙4[;@śئ"y 1%%Jh,to1o_YH!XbQlҔ`8xuzE V+TpqS-X;3}tIְ/~qo9ƃn68s!^e[BeJowEbWBs  c>KH#a8Q43M8lYE{ɛFD{q 5I]2_9E]$=Y^v@g ~}_!eP/L6QN4ѫ>ziv͓A/Thm"3V|@w\P65n݄>Y!pLn baMkخ}x/st6DGDu1BݮPɸf2q-vyJ6h;z=Hx4WD87n6dĂh&drEW/5|2͆dc-*O޼{Mvj#HvE,ˆFRwKMy_>sd#{z"6b#"xq݈2o~Ӽ;{W%|mM!ؕ.46A1<BJ̓nhIf0rau݃lL2>$E&xE]g-?JP[Aqt̤tQéfX9~SLᘝð8oa7h6 vpg?,昩a@~7oߠ!w}8OapnnhȄϑ -4#D_.Bv_ɤjАǰ C l4\8wK^Dl*GĨU7^+%F'N[)CZlU[|uRT6l(6$E%U.bz^4 cb#Q (>ϱGsC&.à,#-\nE!$ȉ~L⅗qK5J(z )m/{>8AE.Qh%Ī Uj"lTm%v.Pq(2ǽY)0zAY ]3j^9yzW,6,cS,0aw>,u`9WfhWW{w,'l]n,·k7-7 >,Xsn/߀~{S[,@s= Ekn1epGypdPu+JQaW'3५Vֆ Up ù09 唽yk1=`e@o' wAeXrs">6 9 =[n!?_;a:لK*j8c!_h fZ^<^>ebc`/ic_J4l:4 I\QZ8(!]Qd.[#0Sw 06Ѷ%.Eںz ! 5QέξpT=N Ԃt?툗onoMjMqɀ ]]'kQˊx+6NDJ:&xDeAcݛH7 qA4KQ 71 .Zu;]=R6 fkt\p{AS_3XǨVN|#Q&P=rAx'#Bg=U؂6DQûgteMÌ6s}}.OR/2^C|KqFF>"N7Lk6!rVY,FW,ip~v_تwM&s<ÝEviݒaLrtq1ʒϲPi8| &fja^ qwx;t5|2blsM7g؏E}®C҉v΃m:B O R.2:W9L {sajJ=q~1}ҷiZgA!P2nJikncț}s}|A2waGo{wA@Cj{%%4U\76HTMDEuѳA݉֕@e!n*[܁k*"I:ZH TEz9yD8_EULwQ],pj*mtT\P8ƶDXzgA%k6ȈNZƓҶ0\FE|U鬢 i"&n9ȄeOY[kU<I4(voy [JgXV ]<[XnrIi0Jy\cܩ*=:tә ~2W=W(A;hbjش(P.{B)ҍ0Q:Jaf|L=$HPu(8C6ufExImr=K~Hr417!^"n/q$fS YאlQ*5@[%?9.brQOW*lDj5mT lXj}+xbϼ K g+k/@osWw#o}v|C1g>9$xl-5܋p$YLtg}ZVل+Vq <$E,yv7X?kH-B4acpr5}6ig_'\Vt$[pt7 w+ٮ2,/[P5Kw-큘%~s:5=2g?f9k֢uxl/ܰfk3.&HD’aWqB>)PV@xdW?7\1vK""<0Z3M jHoPvk[35VNǩA2z'O<+*k>0^ g7ye]JR`ۖ>򳜙>A 3 &fl i 3N`KDKX(9ɇJ4iRأ1ZZ`Oi WCMSeɝ:,WT*3")w$C09KI {L,ymNWZIw$YՈ ٮg0MOXa&BF*2k\!G]OL`" 2Jd $ju&/p']|Gq0q/k gNטa:{;He^{Oϧs墛f؃dx }3P9ɭ(^,\(eǎ/Iw$BIRi x*\g~j]#^gǣy:jì=@I=Tfka C  mxN{?%đ~uOOR+9x_#5{e.cEE'M66 /g2B:Mr:|D s }7tѳ!Rėe}2}]aQч ;4`}{铼{ 'fgHPVT:3y e^&t%͗^cbL~I>yOy_#/ }DEk]h¡P^z?swued$ŬVPzv.e"=4"EP%.TpCXϒJK}kGORįߺAϛ⩜%k\`}q|38i`+-ix*yVy$!e7,BGPD[*nGs"$9$ы;*F:F;Cid?(:f_Eh/Wqh{'JX l ꧾA+U&w6EcnFM[tSs]2}!\%Dk"45#bcoQ=5k~<- f՞$LPmZ{e_IpzdWe≀]#\*rvGLAdiJLDd6d-T%\!a6"PS0Ul6g 9ze5IF[(yjGlzt6?k2n?jtS@ڌlڤU9t%@iCXA5@]`Fr\g}yxe3z7%t{pq+nIvH&y!oz ;ΞNjw&66MTs m7!gdmoB\6A15p;7qN?GJFYOS<g(]%Ju2u*eǩ6zDliLggWRB =A[6v%*,v[Jn<duC;(9YY^agO}C|?ž~+QGt TX-ꓼ׹rƄɞ{ ~^rC0}c6vB[ZŐzз$EM>Wfa5˄$KīqdD=-M^t̥o0[<|\}|NLRa5jb]x<3zEb0RUzMdiwbU+UU Ce%8˰ŒVpx\ Y3-3/1ՏA ~^ g5c^'𥿄}ܒb p[6B Yan!O`BS X`}f ~XC{z09l8L&,fc0a2Y m1c1{'WL$;ޱ܇Yoݲ'a+[pYqbVSU@Y eU"|K S"Lv;Kٻ:ܶJm:7_o`[~-F2X'h# ^,o~NuM\ &EVEm9_a Tsnf N}mv`Rjs v/{ky!ىe6P)нsx%,2," (q*AR#ӓ IDATc$iQܡD0̭Tg &bD;j.]*qtlO̳vEuawY{$;HuR-ZOsK_u}ҺJ,2ֽ,vQw,]XCS3:Yqd Ft~h"Opy~JSgl)LpqkؖXuxOeE!%n7Tpt[mb+ރJpdYww1Ve%vgfSsXs^%*ֺk~]yP=L=!o$ VN<;E޲$wm#B&2"pi 75m:qufpeZ29<@2~6 TZ˰Ohs^  Aj}5E/S_RqV rpnRD_qMP[#oPdr]v>|^~ WHwdD'[S,:~wʴ4*CzK!m>q*n/Ym!~1ctqK$X𩓌4zY>2FCn,E4Scmk=CtlETݏOYL4WY㕲;ON+Fփk8c{ShI(9?kif7zY)*FE,b=x֩zHӹdso'`m;z`k^&zmt%N1G'/#5ىSXŇ+Ҭ`ē >6 ?F[Kqo{zI4ubz?Y^WWK14:"ŁCDYeSw ,(wy4d:oA-n.t8 ] pt)AXk"W {6)4opm>x?LĩbJpNak!Z\ayZ+U44t]OU3,6]lTk}˨M1殼POOvLqzyNWI>zd+M2篺( 3L6/^J(-7^.=#ڿ&7:5# ոG62dzÛ%v˂\1*)'Ҥ/W醌h j}W=eE)*^!6lLZ7_eddX %y;rH=E$ +"ܛ*z_'!٪bumh8?Q}M^LZSS}N [*3MNzzPm(3_RQLv<&k3k>m Fh1Eb^n鷖hmd\KoU#^5/y]#pLoq{hĮII49 O͉P դ* 3ˢMk[OV6?Z ,sCf9N:Ȣw'MCK߄kkVfT8yJuU ޳|,|axCb1:S@? C>@a 9 @e̥-~2ּsi=//Xl$H6+:+[x>tAzgg,/Es S3pVns Bo6sIZ0`%wODP.YhX ~|2' e? ܄|v;o(l-~ex=><,MHWr y뢋fn7/i^%QuQQ.m';0n7KOPU=KfKlcj/d*G3GsP[ bc HȠ"3#1R^!TmMc/(D^=̰Ԥ?CC7хrmѷ$DS&鰎1^_ Ɵ\;NƠHEYZV7f=ُ`` +]YJu<?K-bG-#}( Eb 85$vrXиw N*쑻xQSB}v5 =ˌ%uj-,CE;GzYZbd"/6M`n?[CnhBLEx㔂FU[ajAAOl\| ._.c- ^ .3(8 $L3xc2kS誋.wǫT m̮*vwsō[m2=_H^zwDL[vںJP38:C"0{'q%mX CTq &pdžJ9 W;(n9ꂳ{zUqcDr]pi:f!j_AKՉdS*Z7bYE)Npؕc^5h;sT^R9wBvi {M`F׍cDQ9DNQyv AW Rđ&n[\{'.0O]-:[_#=-ZY|مw`)C6 |驫'}"G<Ŧm^J9/r<$đyΩYD} agI0n}:J̀݉B"5̺XEjؔH4^xQsZ/aU"tmC(Qm=u BSpN7&6=@h؈:(O?V}:OR>pji}T" ק1ձ:ˎGs`s)gk_Ƽcc#'Ek3T[5v9e;N`0iyFsPW9#m x.;K=>ϑc"-5gn&/~%뛌:ÌkYڲ!u67ZSYoam '5ɰGcT!SDhu^ 'd7 -:;ah*6Vo=G)SYp<)mUN -TL&ΦFQ#/WR~ D{~7tм~ I[8n×iKz,AK.=)i`t2X1HO~=-V/_w ;▴J``l\Z̰n@ a,,6ڲ2;bp8kp5\{ ~~c<"\%xa\;F\0uԪp EۡXW)N>違X25w^? ߀`7e:YoÑ OQ-&`?wnmX# 1AՋpb<k'Gfl QWgb.Hb~6.CmL UUfw.ӵ𸙎aEX ę7U:EĊzh8[~zi5U֤,[z$qҢ)דo Q$qInң-iƘ׶8n&=|`E#HTlQ*>DlwTjM6l2pEݤCS'@c %Itƣ)h "[yNȻ(%GKA!^ذcӗ{vq3'c3pBe'r1eVLd15n"};T$a/y|uqoxb[B}#=aO:{VQor<3OYOK=ԋ2JOz<6^^:޼'>_$q4Tugqa21Mk,z?{z\74S'/z;|0!ڞbǟw JNo#KQZXaUQ9j4[C5؇ *}W z]9 lg:։pS8bly'q%.anpG _yoM1 4D]vp3=XFī$95(Q[t]de"}s`)ӱԀ;W tuo)a7*C9\0)v`rf;Q2 {>ѣ^;-v} Gio,I|(<"${|<<2t 0,8s hUμh`sUz!}{e wjGzx&]/460#a&?Ճu2GD]9hWʴ~GOq&}sZ=>D*w}'nQxFc7v|Ot7v3ԧؾ}S\r 'w~0q'\B}nUzJ6J,TN+ߖ?F)S/@ϠAshHtq$8fe6-GK%Qӂ$"UYr1_#16n,1wGdAT,rtMfG;qTßE}mK +AK4$F8GKd"oW\ = tu0G&u:]ޑ ׍ i58%'ՒU%V.̓#}QҨIe `Q5mNȖyCH]v Î&؍6M-'q|P:z۴_AUJ_ v<ƛOkQ_(2֙$>tfCu4*54Wnlpo:C "9:$ܾݧ)s8*jG94GɒbMJ:t@‰SnyGzfo11Q~nCh;La=6dphԃ`똂6MUcuqPq\&OD$h-쨴 f[l+8 Ch#`7N?BC5pNm8-W/A ?iXN[.׆AH-|p*kZ 7g!sN*C5;-`M+cG`x3Xܚp,[jٚ-a:~zaz߄'~g^ۀ>Yچ[a1*ζ%L@eܜ·[d΅47h@-A͒jgf H2[&e  R0a-tm[g-CCkVtXq'iOMkF?|ן~ b>;u `.k57-SGv Cw>OTҘ(]#g=Û _=K!ƗR9޼e07Zql>r'03T:odL$n~n\+3$% 7VoLM|I'M?U 1jJ%ܑ 8㪀xq@BBBo89Nϫ1&xƙsy!7g:JĶ]&.Z?ιLߣ17&,_{pnp+1 ?EeF$(P9ӻ1 \&9>߃hE<[ɹNґXSֈ졘'k#ET[goJ.Fd3_AcD]Wa7HVwaj[@=Glě<~7WU]tOL0 0Zݕx+ZJHHB4 0{:ꮜn {tdw|{|>ϝ&xZ3! |/ou?-Uv~.0QN gxZ%`4z9;52 ~rh iFom9Dlҕ>) 6o0=}ɦ}/g}5#,.>b䬏 ܇ō#smPrB)#m/83م"*`o.!QW(R?`V 5=a hI>t`@15DkDq"$ۏpo}x(fAxs'[bodd#׏0^|3Cak6z)*¸nNчwN$oQ"!p$ h;"(~z1tEq-:u$-%>f~ muB9qmnuC+dRND0x4ZU,Y"It4aG`es{Qt߿ep^$QF(S3Kl QOo $1Lmި: Ĝ!]gW9l$.i&hjOz< PTimh;&R SP[k bb IDAT%: Shn{#_وOEdѨ!aH a6-\}ssgٖqQ2`ƍϳkV?JbBL\8M)+hl|b5 ŗ]~CNY(,LS\8${W(y:yV@c8qlPb꜀W4U Îae.ɕ-ߋw!#so"CLǸan1Ã~GMs:zꈭ0S>FyKS/O2UMQRMR!vX Fc>1BI>,`݀+  #;w_ h䮰<{ɗq nkǦ`!}V U7o'_aq;#wⅳ_1k[P]cToC0BAkڂj ܚd+ZUT'anCrBQ-}4l0vP^2> A4G=[kU y0ڥ c]ztq<+Yvkud$/ `8Ot_WP*|7S;AN6j?[?2,V(6GP#& M KQ.|(FqO;gmoƻ⁻VqM.RXȹCbqWsqWL" ϲz$!dK"R̬<$ڲ0.EAq*C^&*qkLEv`ͭp=hz@9֫L3XLY.0;UtsvqMOe&a2.5^2Nєݪ3﹀׳&eSt_fi;6 )ȝ.E먻]SWC%*Sdwy+4JZːk|'HHd4ѫii4?s7n+4HA-/b5{}'eWZdI!R8ɕ@H?6nob0zlNK_M2WZ$,QmgWCKqYiW'=}^R;bEEmRsmL,^"xef+YnkM*J"$̟s Z,Hۈ=rOkDvU R͐>H mc,WH0hP: _ddbH߮M+UL2BOmG4uO=(D Y0jf$$\G TGyFljwW߯|=ܵ'BGwpy| `IΝ ?|"Vs; RbC8PfR+Hmn7P2>6MXGOn0Yg(dCjzkpŒE.ڊiˏ05Ŗ=2A!k 8^`/:NMi_wE4QFxuڂWu$!(2*ˈ& ]SI*Xo4^%׫87<VA)X.EUQYF=`;刍(#;P(iâiPx=Od,5 fZƊͺ掸Q/paV Sq=r}yMXEWԤMB?Aŏi{tv~ _F*AUM )M@6Q]"*m/"$PAV|M{5\gEFg>Io)w(7s?^]r:! YjɿgS0&˫:C+y=S<9q/@ԑYُ>ƒOǯ0FA2vKdRGC| Q[5`Up L1c&^l`E进o(mz":vKŊe<ȁ98&wweH,PFYauda$<&:.PΕ&`3Ea!AU6!8]0{+umN/ tƓZνV *˾8Tތ6#m,PsgEwQȷ ۉTϱ}Uo`ko"iK6&jt[E>Eg}/S&0r*bjb9|Ućo} }kW\ֳIǣTjns1L&Q&몁/Q&ьwV8a.r ?p1o "k^C\gz,tCP\TVA&(N DT6svX>3k"%#' VUba+LN85<>(XW`>:³ E>2{efg3D˻' x*qƋX&BK~})v̟!W#, -kN[&=bWNE k3Iދ?YbE?O_m+ދ3~$֟&fIځV90v5]'-n\ҡsp{U#'x"mKOwbv;K8օ4Tb /2/u|i V-jG vbu@W)"~ mʊNrgm 6l/pdʹH714^ى?Hݜc[1`efD$ř'/XyZC^~{N܉(XE\,z_;g>?m$8ПC񖱷xg6 & 1+:xJ+WS*xuVi̭6}i(nAAi,W tLR tpM, ̈́N)EUi{hkzE+PKldDdt$5F8U$i б%&-Cp5bcѠB¶EODed͢`DYg;$z%mFßѦpUuERjBB0AE)dP٣x6bLX%5,3dik6O0vNdU`(ZBVTh%̅ub+_iW\|)?BUOmn! )Š@Au v\_#eRV (+ZMpT͒q-ˋئ_K D?I̩T+0sItt*qw;{wI,܆LRv5I[ WwL|_?^x&j^Vwˋܠ?%vq^PLzFcw4ۻ[5'Al5}1: $ّu .4f0Z:$Γ\;wv8gFPDl#*Glv{}?އ[RA@+^i8:=;`e[ `41w+!Os9Ҳ<#kv_^,'6X*uTK7/_Lsp*,]5wa8wR㰺]$auFwǻ}h*\y>psZEkhwuxQ1G0;ð=Nȕ>Gv ;fO}, d?/|9KE(V;/g>>CP?g`zWk6n8>_zz+,\_np}0 ?yoW0%: e-ޓ\5 Z,p՝moěQG3M.PPWYm0HCP=lQ<-ByT&v wq)Hi+v 0n:̴tP$̠Gڸ"Ez]_A*r~\c\ If_+N`KiP4U%4{ljVk7J`Sn̢&\?h:[lK$l-=|JX4s}a\9Ezzx/3s Mjm0pU:Sy x'X{l)EFG#٫T" uv?whQ[:aR$B+~b1N%̺akGE{NھU.MX|yׇJoXj cA>-bz@jq-tQr1<ۮhݖ-zN0_/-ϰ:?Gy] 5zD 4ק jOuB[Sp!V.{oZ&3ѝޯ….PNG]6<+eso,w=O_uX؀A=z|wnހ,lvmZN `z:'tȫntfE"D{ 9 +wb)Z"1x vU\xrF b> {Zګ79|[gvU'vtվlKq[DU?}!ʪ^T[nX c E}K6>M*[-iص=0!+C,dLj$\)BBb39C=Z7Pft^07 +;܇^u,ROiKÑ{TR:oGvZ?r&ÕW|?`YҴ)>ti3=U z~‚y¸} F&1Lnl^0rxT6>]|_]Wf~C͛֫Xn_8|3`V Nx.{Oz#tV%q-cӀbdT]F:>DRY_ѝ レ.ӃAgOeאM$ɦbK ^L1n ܛ;T{Axm+K5Gm:rz(Z1q $vy8'فVWXXl-#HmDbM^n:lg՘eak2^&73…;e2/~'F_D:¿돥)z~g+kވTc8oI$/*#&f) [0vNfߤ2'ܧ|uywth c*b!KT *O&"38y?W^ ULtc eUᆎ?3\VkhW}xL˝j'\oqOX>֟ IDATeVç{nb'0\+( _ b-uR\wm `&c# 7HqfFk8HAŒh6Ln'B@I|&EL!pE2BkU/L 2:D ?zM!ߤ\@Mp+pbbuDr1̟;˭5Ԗ gZO2을2ɰ^ΉBOQb8ĘYp{m#IVrȾQ"EpGF̈́*I̤+" EQ8rCGC٩vIL`%T*=ZX\aRq"ǹ2Hfz uahR lVrK[>|oYtn>}3|٧yez64G>5I|/0q^Ax쑇x o}˲xs? {xCOח!_(ʫ{X?HFOҖȄm6}-qCrրE_q/m`K; 0cx0˒%1PC,{6x7+#~z&*bf\§YG&d#7qz{]ۤ'Ԩ9U^YgeLDbsAԐs- j&[DaSM ODInEx ="7Ϲ,mؕέEdOօ[K$*x2&vAu{w1LQL2m3Poq1H^Ķ=5( p~˵&ʱtuDT8+v;(! Nogz94A(:nk7 PyN_k-1lx|nUBtMNWZ5LmcB6~_F˃KP˥dP\NTpQ(\T٥nP.Tad{P`zCN]-̶^#XH~q@Nj QM>nffwo?CcL8 [g/8yȽ|3QEsKhq\ `RO(z%bum X_$~rMܚ[%h P#iثC NCM?f[uΞB='믡;mP6["\*v&B +{,фXAi芃B aILht0:HW͹لaykta .^w&daP;K g^</-kjMxZW6Eȗ= !7խc|Jҥ.w~l{k >zw}s>ڽ߂>(|]@lZpe;aP-tF]KkS֭Vc.<{_ʛn#n6B3LӟBnmZUndmμR#C+lFʼ]q$ + b:qFN&}Zo JқD}6EgvA&럣bn2f[hVU0Shbv*P>pR WXw"袍'9pu%FxBb3my "ZT p5D{&u*K59BBDLupn+$S$}x (fYTEo0Pv(rPM2 YiR8vu2GgxԬ(Ρ,o<_380}ҽO7z[wgn6X'>R(]Q9]M%NN=ZKY!4v'wĨtȎUoSz9Te _SγSX?D16Xi.#܏~kӸB5W#Ƴ8#6D"hn1MД2wؕɳD*fxXdu7%O+YF7eD_s żv,?Dbyc/>a wϾN>\!N?7^O\iH37ޗw]"X_"$' F ! URV GhxU g^%0ucliw( '#DEюtS r4D`miaCD*ר%iQM|/vIȎcC"1{4[%j4-zQ3[>M6c#| WhKK ^ JB#K1r-ư`#ト~?rszybJ0|4J 4,m16(5O'Pzl/VHoxDN\O#00]D F('g)J\GS"m:LHIJ-HG=q7ӷ 3opO}c闿7ԓOկ} /W~r?:Nc 5ye?OPT9&`J#X[/=l#3e ˦Fmm+iL25\XHe 9(4O;>zu3i{Ix}G;4_2۔8!Uq5?ۯ!MDK f4FUVgҗfw*A֯gl3Pg_%~uEzb]^Ӄ*9kr6(4 >u:PK#K(Đxu"L X@PFie4 ?\O| 7סنu*<L4|QEZTc{ʏ7t{ Iw]wgvvch@;y<)tR/)#:aX,.gzgڛeU=.P7#*22;=,nš7"O@' d`W M<*Kߺ'^)1CGfSYE^x}mQVㄥ(u\20X[[~3/K}p˲+PZ 9*W~H Dd{ gG-#k5L__L/Tq?iуU߿!xdmy! _tˌQ*=wk؅s{?12?eU?1N(*Qіe_ti-1 ;=lT,S))=[24W*Iʦ)&^В(ʃlƍHzfnN[kP\%3c͉k'_&vMaBEC5Nzή6,>c9ξV„~=6LF/˚|ЬWj(&Xr N`- bl^CƾZHXQhPf<l"KAM3cW8QnX!)Q;4'aw'H)`g&"޶bA]pR1k~Ԭ% \hFHӟGp$k?GN;O?yǂeJœw^w`ye{87ߺƶcZ?Z(|';Ë~e9vv$Cӷv#hԎ 1%G0Qq=9$AgZ aۚ( !KH.3[}Oߧ+g$֔=l[(gܸN+hwgv+4;GXo[(GcMަU PM3w;Pp*kuz;7 KOL-Zk-?z[ MTq'T۝@T PzB2&*TexR@5Wءej&dSat1GQSUg 5#?T ZxX7ķ79N>!i z [dHr':3I"N#P 9)x"04|kT0ZL }+-/0(2P) 04х+d*,eNQЈЕR),4]\ZU^,k( Twth)ԚØ mYA)Ugz8]1dErfRI!&h1P\(R)|JnK`?"*u?*WMEPK} [%UZ"CvaT(x VLlC'x5Þ(6ޒݮJxl454[x 0,vA"-3nCR]fGn{l'C xFajɀy06tt!݄0#2W/=,ms6 &x; GTȱN!a9.ʠӨ;Ka8w^ rW$KTҿ%Hd὇r?Iޝ}F]Rv8Q3ȠFVW_{;(~LVZ7dP>9%~uGfzȬ'P Xv\lz# 7xnIrV̿L"zb ( Z:ޞ6U:j[f2maC6A#EkNc]=ƽ a<-^~@h@,3pQ;GΛ+uWc4 STp.ȊJ&A F>vdih,жhvJb- :38{ kkٱp7x>:-Jw *B-K|Ra~"B[Ǹ?o1C$ nN\ rEj/͎/K#g of+& _dԍH%c0AeqJF/+%v~ m32Ms깷HC)gYGӘϽFܩI`Mی\g#Q;E-j^a^m* Yňr$+H~E +? T4I|7(Ws<[!ʞg$@T]X<(hr "udq4r*E;x0"|MZe#Y wIԾ]>;obZ'#eFՉq]y6M Y &$/W ndLk_>A3 5 OCz 0wz\Q?ִl^:kR*\Y_ws+SRS#ոDeUSu=AnuQʅ9LihJx¦} UU/zj0e@mg v̤ܖxj M e&cx'-^+6R5av˔\- Qp6U8bLUmKK) lؠVc IMAjJ䙏}$)( xϬGDaf_~RAR~>/Z |ӟvR_Ut1 [yI_dr52W)O085_a"}N[Yk !͈kL%svҦR룳Q =S rM< $_ヱ[n;Q-1sY,' >/,P+ =p&ʳqKm(d3+W]UaT<`YȠs-ϠD}tl &!UumR2É,~mHcA FԪ8Mr=;So^D}$+Cl(9U-y :5Uy67/./C1e,F֚%%eʮ+FPd׺Ƒ^'8MNĊKNHMjm!tXi* U e.ƆѤC*n1I2ZrCA]iShĘ[cS.UrGCPDw᯷Op<Ц )T&NJ +IJurE]ʖDT72 SYHd @̤iv)CX%rRRPkXM"~G;=\.jd ]TU<i*(u5 L NJN%Tשd[(jJ;5>պ[u X4څ IDAT]:ARj1tԝƲ2]Z/HJ:J&ffC#VPYBުp V s B _yUvapweFYFQB> Da= Nˠ2h\N翀m[Q.G5zfˆ^27_f2];ΌC vO^A86 ː'}~?:v6'p n\>_K?ْlPGCΔ 'dF>?ZEF{~y42d %{Ԥ,I8t{Vs.yN?=W`h]% _~Bp"^e2<7ȌB%+ !~hO~b`yѳ1e Fkup!J[gtPӥH*3bIۃ3aO#f5J+LUAdF/V.lý"@[c^b-KGR3%-h[j;3\ujj3>aRӽFb:N2m䨳zS"1_eP8 au뛬/R(|?TݝIYf+R)D.Y`ҵPO3BUUvk _Z5SCi7& ${VaP4U(whQVt(Q4/FRB^]75ױtY]Qcw">Ŭ0rHq6# #*KNEzްta`!KI:g[HbTwR0i֗0p09,Lw֫ly) 2o#0ToQsQ$Y31\bɱ6Q;noܧnnheL9;tN +H\Kw[Y:.8,^i nತ)T se6*߳SBI0Qi?_`~?ZjvH.a ٹ*鳸ݽ.kr{؎t`fm3J|u~ U˦ab 1K(rXbdMW(d>{eL͹Ew0HlRti4G1*dO0sT},@,[hc}O8"؟&T8d-kefwh;P_ũpvA#L N&@ӯA0Iuv3oiQʱY)SYu"y͓?'ć=V579is]6׍|]\K\Y*m_C_Iyxaf8n_ ̣PXq<`Wϱ}ĸU#I|vA U5x;TdR~ TNy&ʻY<ϻ.s<'N7&Ub<$({*«"BK_i7k69uxc@o,DU(q[_Ɉ&U>_/}m)#l퀿BlJE$b Q$;(7_dn˕EQ||{S,r֧z-y37#Zԥ%%vR{{$obOcq)ZO8Lf5,a}ef㒪LPBi7w ious`rrϡE_?LwH…4+7wo!V=*=urY4l1d |N6үY`<i ݩpEHFuf+[4py!a2 <Ίդ_Im5@lJʂA"ĹRR;} b cv[Aw;uʦ܂mLwǦC3|jR-Qh:AIYA Rɴ8:j CE][jTolA¨.44iF@@)zVfg՘BBq )h8(y=]Ah@)`862EnMKtI2W$Rp[HlP3;Ɖ}g%K<wV76p8VKTTN&ZDoSc{&p(t* %mZ**QCR4(5(iВ zBfi;qeM]7u;{P5߻{[w(d 5j$v5 ԥ::I"Eo3C]' \k F,p3*{a+/ݏXM*U9y80gG)g;矐e˙"/tMN`3腙  N}J0#+Í{ / k[prv]=.hexrɯOLA"%XބNGl(\gs?!;!Wc5P r*p1z>yHΠ֪98%OB =0i`f]B>όTsLś{»pc.6vY:P 瑟>P X&Zwߎ*wGlf=Ǟv/q6:&k&ghҸu\&u *ebck #AB=m# ) }>Auo:ynՈM˅ˤFƖ\}b6A5$~RjMv{ i ī7(;JUV-(QYkH-sCq]PѯCW%KiI)ittLt]%Gvx Cy2Yޤ"ӬI&/2b-iN3(ٷ1僦IfcBRVbæIe 2jڛlo? i=yRص(g&uRy_ bA 턞-uPy̺*C$Ÿd<_#H-m0sq~HB;RV7@ȑOWlz>\vAU;kO4Y@cc+nn) 1$eb#P^ќ~F&~PAî>f'<%/jQh\/&8=˄X״ )]cĶN>¦VvGi6y 1|mҦﰢ7N8ɆAC(E`@OA\UFc"qdfɀYw8͚?w"Wќڤn܃[/"V9Fx$ v뿀uvsbfa1e~Dٴ\;z>ӷy!R6bJ8f7!2լq>,/ hVfPǭ޻[\5Ty >Fc\9~OcTlBɏ0E"`!o:N[$_,Mp+4AC<bD҅.>09wn+Yv91L;Nbݴi-׻>wgᐚpʞmF}LI;PD<}HӜ]z%A"-|U;n%Yę.'رA C6c?E ϴ?bZ`υTd6d4/(bk3FggnIc@Ӯ|T o=Lhv˼]ڴT>G*\q75\Uۦ//QH[ԔoxQ:| 4ͳpMr=YIq`PӚM$:u*^f7^A'qنQY'o *H9:lg-_v'KU@`I $. MzT+;I6Bgph6nv[/;Uay3ǍR?]&^6x#MD$ݦ,N_>RͮѶY"GB"7Y}DF~*Y/|H5XM$AX&Ae0Km0PohdMu+uEJ?f*iD4hU&BV]Rh#j_DiT4ҍ"QoKĸ~qw?z*, %3qbRF$o᫴)*B dm eֶĢ=* h:\FCE}L^UWGMeJG/)(h RRRѤLP\z6_ڦ/ajih@h[qS08$Fn&ZP506 T :J<W3cU:Y GIbՕޔ07T[`Z*6tjyݼ.L5H _Ln(K\>u6틠R4Ei썅? AyYvlg_ B<~M>֍8X|]p9Kt CoޕgvXHf~lLfMYzlA0ez hAe_d69gV?_ fƪhNYa>);rO|*yvUZEhvĢ^|N6*Y 2Z hp V2QW!g45T!_՟T,SG8 (LS ^_l]eڂ4Ae,hɉ9$wb4)#,%\;9&7Kt>C5 ¶J*ȱڂroAI;җjϠ+َ |ZC".RNV" gԆ ˎ2 &j8(27Ǯ2E[ FK9'Ȯ loe9RhAu}u JX_FrF9sC}vkU%BɅ-l?T&4QL 0 ?ާ]\.eeրqa2;\]\wK*~@`nl1֥%F\ - ^ekLf} M&~Lc\q&W9"!E405ypl*uӫ|];k/п!4i`>?oΡZH,[7OIH;3g!agJ\D/8I$S[n6y ~޶%)]ʡ0\zisJW)E\4\kiu窣@-ȧ/,\So#׫yLhEg ˶5JYY~gcl#xx0I@6Fm}/ŕ\n=İK!R5;?_ :qfS:t^A~/p!w|[mN:}j53ChZ 'D._@0({ayYΓo4yӴ~#chʄ^c"׷a,x_FMgX8PGVEm+٨.9qz_~$B\Mj=9,ċ]U4kTEknz1r͹$9/ Aš3p gaN9BݸQ⟥|_99 5*+u-؞DԷ$' Q7gd@7^+m7 ==2pCdF$jpzD 9 J|d {חdP@$~'퓥S97bSgvp7 z ՀmڅGnmo} h޺ wo?B%_~v^l%Z5-jZtk CZJtO ,_NQ0 ˪e*t 5rX+m6 e: LMUp^ˮ!0V(o`P-m҃6TREnb>v]tATO))3$ C^ zB};p+.q.Lp#1ԳUcSZJ8 6#( =nb k~ Qb_SOb%1Zs6m3^'hrLDt Qgk.FOZAH6;A=ZHHloU59~EۘW)c9A1v_[#ф;C~I"mQy?afe]rVC$hl3.GbvRʝ W&0=|ыva@RŃG5࢑rhR -dUk@v~KU!:іN0#P[G^4u5#BU"JJy6 8:ʼ юiLTTUSJԃ*ڣ#D7fBW3%2*Q@74WZdSEs}%H9"Ұ XJ(s: -R1ts>mE+M $ڴ \;j>qj[AS4C_q'U'Y㳟җKGZvG xwh,y-VJk IDATg 68S3{Td+=4Pi Yhb8fɳBUr%ǯy2-CN;8vc }B}C-ZM&lGqV.쨰qa j }EjOŧpeL8nq?wQK vVkL* й9ۋde6$n=iʾLoU}Ň/X}LuTnhbmrHx&TS>]j.&0\*Αo}oFCu4isKK$nܮ2b2EAy/gvg!f  q$# ]tw"S Ybi;mUuy3+>$p$?@ʊWY}ǴG=NՏ>E=9z&j b-w^-;<?_|*ZXarb{Ο—ʕw~:"I}̩twwE,2TCz=ܼu5&'O½9^)K{YΟ;C0,;;Q66>.#z3ED">bd#,. mX#bw B yg͊5㌔ .w(LtD#%'ߎrA]D4M`(2#bQʍ3]Y2H#wp}[uWBUle f F9j؂l"XX}mrr?~H 3aƫu6̃ P-'Y9u/Α.Z^* r>p vhN+kSd46MŀhwnaIl7ݚ0kr@^EQjb N # Hm4f`A\ln )e0ElVWs~U-lF#>s `wXC.]~WCng09 ( EE5V::- dFa.#ML#k`0],,x崢w zQ@0萌z ӡcf4 :NKA/BEBSa(|CqcnFχ?18 =HVe.AMA`U4MMe MM zPBQt:vhSǠ1,˨nҏ@%PA-Pu v(tzg/)( ߇ýf'"`4ȢR3MR@PeA\W= ^JpD5_\m /2Ͻ ;k*;= Ųz.ðW?0F +t\NH a na5y,#~xj&j׫>݄z wT(ѐUظWW~:zqdW{"8@:~@rlhnA= 7GPRVt5=cFbrfɋ .iSvx nCfWDکj -oxztducƸ~]q۳Gǭž&5GruiCoY!+6e:Ԧ0z NGb^$K+S76rAKDG䦻}$3d3Qm%98MnS,bo'8j WC!ܡL"vJ t7{t#]&Κ͐ה''e:J&ӣfIţrFmGg|]PqPjq͜,imrOU%cb)kT7ȠВk ~f2H&͜ MrJJaԫ TlE O5R7 xB} #71hN 8) Nu˘(U;)mñs2Z?we#Mͩ>%t++ )DHrDiM_Osk8cz$cw9Է0 s_*p~~/%{ML8eN )==G;^G|R'}-Gbs2MtɿlpApÖ`JZ|a׳-k'-M;4k ~5#i]}o$b`4wۓ[xD&W|,{ Rd!* $"~v3Ae _%}hKoLgvt Ɠ +&{)}*_ȯQ,Wq̫D*l[N,E6+=I̓F,"YrZZz bDohPΡaw'S5XZR:6 (+F dkInßE7od- PҏV!{&b}UXZ&je2='a 6p pnZW`iSeKUðo\?2[Y UX܅?Qe=C+ x2 >3 JDT w.!IB_>|0Co5UStóg^ *#Wuӂ:5T8Tu͉,X pf%-_}݂U8v ȧj_sF6|:>0Zj-0{0<BpmnoC8L*x w[]clOa@ `J73c_`CR0tknA3u ˶پ.zo xͼD[“k1b/3[u,ج} vmZz>j;0NNŐ%ū0D V+ELA QIeJx4)C݅ ($]>"dexWlSS81Gtz)4E5bv:z/S'i%_1+ ԃ+T a&1 (~D1UfqtSbf,K lAraU:$KH;c7T+5.u ]1#S^5HtDDG~#? mmFUchȕ5os>@]Pۭa&+),Ād"S5,Whk<.K;楮TP:LǜR2(MlE#A;E]9fÁ`Q䰚^AniKhq$gQQk+5~O6cjxk?~CZgVM~i78yh3y0{zd IL]u3.oD B>=')F ZZ+Zn߷·4a"h |es]wrs~':E͋,i.u0&$6ߦ/M5C['#;S'ы@ÈIDR-iy2YFZ"Hye2/aņ5EuG"ecR[m)`XL#XZ2R WmXVLY8R8`;)囤*I80g#QėCh>Y y}$[ s Ǻg˫P$rlpM;4m%\vd-3WhF)ynajݨ}{~ymM`v') dIǍˍ2rkXqFKD.\cC#yqיBL+`M|Ozg%K=mύYYĽb3N1v:qgPc^٢sI3O+QP hn,JYH]74 4v<Ɨ ro#LI9ʦB{UNT- W>Ыc4 wW1ۼfdsfB>`mйM A sV"a a}zS)Qki8b4e^#9S3CPwMy [:tM@c'}I2&>TmeTt<5VQ8ԯxf o܄|I5z~ ( [VxޜrQGFA̼a5fi4{%HWԈg߆s`fG tT~TTS`R;Zu[ЫM<K^@8,ѬgTv;co`<&r[rYlf䶪esCO?/^Q X؃;0g˪Kw]Rt4Ջ:wZLET UpF4 Z-h}ѩK ApS#2?uwD?otթ(3ٍ!x,۬wq$}D]ǨGaF#nJg+4ᝥqwkxp(05> w Qj*9C !\-]eu7GL ty%n8ȶ>p,WPj Qs jcOXƮ=Qh(76Y3hq+9* LVVng}UL[ <%ü:=&\0l[.,GS hQiYk4K{EmF=݊.Z!⇺UdK4C,gX{S6aq0[laboۈG~7tg瞇p b!*o% cSt@lvq;Bi|1"KMRw ~yLyhbi!GDz0ZWm>LNN yȹH}AH́X }L02d T翍hR"k ΫQ{?7:b?{ڍnb^T)LY>Luw,tD~pu>ɉǸ4;8j[%،oc\e{ ,=霝bDׂWk4>!R5r17;L}B!^[`fczS9AD"'s]`+YJ7lnj$7wXٮmP5""."\&Y1^U.f/ۥ^2!ie:{ Go%h)G!+TSp?UâXىWd0vEA) [r [Bk)2 *2_28a\w hrzapZBy/Vh[B0ghWVвjqeb$M){wLb l^&˖,r34Nhaj)oI\ĠICG~͈Ľ3uύs]pmA,, МP y5&lj<ߦUR008\5,#h&j~>5'lRŜ\!-R827j҃I!",ՔCk* m Z9vΏ p²n%R[_ !e Q a^fӋ 6qns¨mTXy'OGY=68kN*;EpZlŸK`v~T=[Xw=Z"rTFtGY\ muwcb07> c^cfhJ\Gj\e[AvPc»naZ`PSfiTV &sF$N]FTF$ T(jX/udڶu.}d#/ֱ91K` ,w'f7pٻ(lgXW=[MZږ"f[Mʄ &:&&c-Vn; ACH…lqsT(q*ZY,W:'qji PhuS2z (D=Q ŭ->XaHkxG!܇Og~]}~2(RENwni;C4"}yk.d'1~ņ#aO9a+z*= 95a'pwNdJ瓿:cg{ Hd0-=='Gu෦h S3:*ҥ(Gx)$yxMީYY_?Xp2D)1{{w- 睇`"h8;ZA#yN%_ YXCl~Y*]bJO8$+m"8]Jn[Ϗ,SkIK89>úIe0bqPC1ąEƾ8){Q?D&h=t`f?oЃ_*L\jFuQpaxXun^ 3 < ѿd>gWᓪv/GOA jR/ :Qx߇Cg3ΝUG'aq*TxNOQ5g勪^6lTRGKE]؄?*D? ofTv i>~N=~x.ЁspK乫3kZN*TmNf7ÿ}ƺLm130٣^x,4~Sc>tO KIӯo~Qi?e3 |RNߜ$,"=ZGj$}9!ZIŸDY2=._RrU#<oI'K0\h-Pٵ0 ,oBoȝ*]>MihkޡENqMqnMn3sLx[Ǚ9qX)n&fBzH-On/ ?Eo$!˴nqnb ;sn\ !.^=W+tW >̀Ewd|ƃd#. je@mWI`hzپLgZ$A06invɌc6YK:qrND]XAKKN(15#AEc`eٌKߥfOr%f&PHS9l.\DFXP%dm#-D98Ś?]s5FnKAu=UCJDmvۨjě߇)7$xfm-hev@GfUjtD).;zUvC#nEvYDpd8qrӯ7Fzܞ"W<),']_:|f: n-za+<"1I%.(\D~ă ß2[9zX׶i6`kz'D?rX_Dڢqj{Cp*.02KQyG\1k0, -<~*/!mt*y`1NR,Է5lXGLM-aBnlpF${C/[H&Ď[)7v& v.e QG Mը ~ވH>^zP~i8;?YIs|%1rjry]L v+r>zbq~zZ<&=A>>8Mػ%,Us>?1}ǮԴ@#eEilH~z#N1u_=OVxm?nk;V;*u z~y3uŃLl% [c~$̩2P7ᵽ2ob`EKv}Kni' Cy5=&ō bɔk: l խCX5y5 ֞]7&CYbZ$?H6ĒFfOP뗹UD :nm3TM2vHRE6˚JoC,F)H~.a!J}ȵ5t!|oO>u9I`msKp1GFܥ;ۋMf.Xz(xEҺdcQ5, [ ` ]4&30EMfڤha%kQeĎy~*j B[S vl9=Dr-6r6ޒ{oܰ ()y(F~ޣ[Yކ)K ~@ Q5wn?}xyNhPo{9Ϩ`PA?e٬s +*z䨪hTUGy0 Uaf𫏨x%fD!dWGj(x,*u˷wu^7<{ַm8sHZ%u'u^Wú#?m {}x݃0>ud; v n52JU;뎳 UQej_^b_c VEft͊@p[䳞I6{*/.qnqz'($r* mQԌb7)*t"Yvė`Ճ>%h(OSTqq}`9P1! .Npߨ4V'\!p`-NZBR@WӞlC`ܡǷ9/~C{#t`pDܷǸa5iRi":O-тK`7 \/AZ@n$O0ff^:ݓ63"6:9otŜC{ = XF6)eQ[kp{IoIpKVLiBfЌkd͋7Fo#wL$|%4R<&EXAaM#R95z!z'{'sO9q:O D L-Y4mVɻ\7wʡ V@$@D3L4sߜ޳/ D 7]]<:]}1{MOOv273/JgfSܺcg^#Ҹϩ/Ypl%Ogo yP.e's|lԢ|9cn ~wdl# ŠJ^A?dMv(Kf  +ix3A)<(jE88x8_T8-4tzHOCV%غfɭ"P}>eC,6yjF] 91L/C+eWv17XBi4xQAh0t(KLT+^W Z# :zg]{^V |\m]=vpЀq1Ocr _Xu .ov|=O2.d($3t+.vCktKM6.g(&vfN{sҘ:V%@hgܲ'XSLu[ْ{ҊĪzBɆFVm fVI۶Yȴ_p+7wp G՟{ƗwO~rHQt@ 3j6ھkgBvQk( Ub G/Io*oۨ7״8TH+GDnp1ȷ2|~H]=&Cxl{+;DÉhRh_fPxȎ]һُ=EpB9Jb`0S s|ANtU,w, }bgae-I{M*".úM%#ɷQ.7,kǨlCE6ą Ԛ\]drbC0x[*ytR mADhl [ѣٓ &0;&&|oӰ Xz.NCu Aah -mmye?qɒ?dѪC^[Jǎ8Vœ$B 9K>ϜR+ <=k%V?ikYٛٳۭw፷`f2*ZIۙ*H0@p ؤPpP[ͷanÐI!r\NKB%ڶkkʺ j OXRްN QX܄'Ä| ԏeՆŠ_ʁ|sY!e qźvi Xq^ }~&Fh|W."TNpoK 5Ti*dԇ|\7IJ:Waoq|Gbq&No܃8#Y' ԢqR:\QocٸK,;_XP@q_FTHiT1gW[(IP|2B=}ѭ[Lw"U Q*LmHa^~[o\w}V Ç~Z%?0@ ̰@h"DZ"ec\4UvZý9}n4@x|,7]ez6vIQXИf'K7xA-Po/]'2XѱO!~ՠ2n-kt Ypp4 xIqP`)SO;z]&>ķ x3OrB(a 'dF˄\^[by->!:N-'w!1>`J⣹~6f IDAT\[#o0d6ҟ V /;[u% k`FM@WP kwgηTy`q v=[ ԩ-4ub`;dޭI sIn7Qԍ  " d*lV)eWKp鴯KֈζBd翁cEo Q'byJGW^e!Elk,BkB~ Zbg1^Tnh(6(l\lhn8ۅT OMf{懼@!]fe{N*"y:kx'߼׀ @V]7=]I0c(ʲQiR/2_YӽOfԣ==Z^ f⫿OhMFݪ맭 z ۏ\94>8zi  6T !Q4DIVQ ZQ?VK}z>Ck ä7QL;-[Su3 STr)csɨ{S#Tc^>w2YNnb7h]*5jT]W0{C2` ħk.ncc!Nʘ=n7H["5”dIq*RgF>OH$j*n@,ܹ_)Jy&8-ol߰2]n-WEC$nUJe߽7+gOAnbA2,O(Xݶujwp'3Gm<6Db-&\'Q0MJQ[UvNr$@X88`ofwH?~L'#i9L3$0 脶XdlsClNRП[S4tq Qac,"BAO h"dGue"b,U6p2ap"Zb:fbl;n҉ 4 OefoKpKʲ-0pRI ˤ6zH'c^2wC<>j|*穕ASE6C[ Md 7nC`cdM!$SAwx'2xjujvK" ~_nJ4 unays4&:volNb@ߡ2_|a:.Fs#i֜^!"QPxHQQ}VEBmI7sc'+Q&@kte h=`1gL4^)G9n>7GU݄~6'"{giKi>pla;!4ROnPL&Nt]7G-aWUz_y.LyO f.sk7.}C_w$ADKt=̿ < Wl/\e ƕCIN0D5O`з|Y֟>K7a6vtu/ZjF/YWJZVЎU1HبpRi4\>2unA XFK `3*dLm'ǿ}<?F(??K;<}!ME099K~Ie>DvW/aWGpQI!zU1Cf0IWfm\(Gޠt [x"nFjYL$1{mCWA]? Yl>e`UPӬW&)aNsgyH -Gno9Ҡ7o%~Ĭ|Ƅ ~zy/ vixubҒϒuliq(O0X򟤻4B(b2DNn>OXp ^c py9PڦXaJr&g13ؓ]Jmr6;3yT%c ڰT,/-㝜&: <(4IA_8S_eԠ|3[qd[: I|S'( |"ܒ|fڕ>c*:FF92v|;[;fl"xy21+L31Ձm؞x|=,߫Kɚu9{C#>8A"\6ݸ6!vIie;{'I H]/tx+{Rg1i#-Qv|}.bP跐]x_e&~\8K0E&v%[Ly1x3?։Y:8n)'pe}-_?],)={aI8؅Q82l¦ ~Da  <)XZ R§޾ {'pka7X`oesU{_?#Spn1pjV==bOXn}~ hɵ?fZҾ]޼ }Km+ӵҽ O[{PmZ\.7k L?2 ?<~&gT :TPU+T:<NzNذe ~"܃o3G?;׬?Kx4FRͪ*=<رfՅ CmO X;åCHNb'}xgq&[]f^0z£0oRpH)}mU|&={oݠ=u~c^?F.֜Bα67qQ;FJqX>8}~pQPN/0js8,m~w2J 1ݢS;DG1n#Cr)Y;Z8M8m2t7dKO$.;EBZL}^ϲSEdTY7aՆ;`ڀJ_kt6kR5TtlEklv1 n+ۥ&9O>w*G_EM,/]sQV[M-2r8" {n2ǔopM9B<ϳE}<)v@4mΑUaf2 >[E:cʫ`8Dp<8l?G#08i1\5~YɺU%,&z$ ا0y julg$M TvŚ49BQar+ApCkj%G^y#q<^=JgÄD|dUd(gFI> zW2ç9<6"Ce@a}#42Xp -l1 QOz:#Gj8O,x$C fO E{ i#l,TiUhbn}"zȎ?%YMӮ]bUs}}f5M]ѴcvGK[e՛HP$>R)mR= ^{s5g<8@q$2ՃCe7Oo2 Sg .*o5N`M\ivy,/x8Ivx65"]t|n|q.m"Lt!I# KlCASh.FulFB*bW!iu%\v Qa2h-QTnWƐܝz-`\S0mtJKZ6bn A$.$lԺMDFm:^nCRZa$.^7$L$Е|Qj4iSe'LÝ$Y5) \L.}fsT Y5TZ kPAޤQ40 -ŏUG4]:6Ӂc@Dhm 84WwR3 0z\[AfOE֦UlөƭP C%O~ɵS<,Yr6#3[ΑI*::>FrSfiEPQ0]64;RM#KڻB,W#QzWeCeo|Ry}~ I]Öz7t7WYmrc_#{d/7`Q2[!9la JY['I##|d߀"!~ڱ!>a&'iUH4)=KLvcy+ŋi>ˑg>#Ӽh'&~3Ҹs}~0 #6sۣS14ugG(l>˃?9xx̭q''u^ga1>cB9GȞ$Gyh1f})26 2]'pƔQ/07b읛LLevӯ.saG 8q[oT8@{"jYICl4cɂMB >?E,&p,ZD ͽ I8ʛix6*;2'2x&~_S": N7[-3qa;l0Cw9u IDATT8j5sr"u}"v`ƕ^1Ntͧ$}4+lg/ '(G4%w_-E{d|_Jr&R|]7b!6&>"#Я3wiV~.|'/>vVf01{]:b80NQWwup{}]ݮh!ڑ."ȲM( :lU$!Lj.BÆa12]D{)"BWDF$nT=f=h6H yBOb4 has6)^ نcPIH!DZR.hUT:4N)2ΞFET$ߋqL: YhwHBPwp =]=/5qڝn [DPzD2h*tTEZ~@HhѰX4H!KXBPPԃ.=S&T%B]>x(JR,/] /pt/NvvR#&M"1*}/#O=e}l&Cg$r9̝D ;hIC.N!#$82Nb]$0uBrHf}^C:@x2OS7}(IĈցǥ192b gûJ|C֤U8F;s"HLj0J*跱Q xKgL* '-܅O59cH1s3(RN$>BhA?J#˳!)MkLaýlcNY?d,1 ⏘ڽkw}M %]쎏H?dOz*[pƥ?}.k`|'l6x~'pQfPHot6O:ybfNU.}fFjGG `r5;VybS|ub=_BXG!ePFe#(ܖynxt] I"LQ8U]. dxȦnceSQܞ}γ1X7.os'j?qw[ϥxa7` B>fu*;6߇Y86 +kӆZ|B3oIڏ9f`; _}ֲ˗EĬ[~+tQ˛YkV[.ZR˫ `$ʙ ц`tHo ykDHWTg~?{%Gvy"#"Ϭ, B mT7I5IIq$q#OʮfFhFҘCHQT6۠A7@P(o2Gr8ۻΙ={VY"x{߽5oݓ(<{. 7tӿ*M_͵M {' hoky,k|$oxZ;;[ߟ,@[hNX[j-} < l^'t=bk۝XGkJ HYScFSuM b?huPA#<~? "JĸFO$ۉ+e|mW1toKA_.Age@( HKq3;^Ź7]ݴ܄zy;ۃۉYac!";YOT=R$..l%64盔ރ,Z7Y$33ɾE`=Ǻ#,芐\0j>W2X/{Q|=Ev%vqxj}Zt}ܞҸN$q>7 gd#Ӡd^<0L/B2X} \J+Gx G؎a8}!ŴN&p,)"UuTYnFkTtTO=7%iz;6f;78RZ u\6+k iiw=kc :]*=Nf,DpW!$B_[›v2eThX<{.::K4:gm Rt~U㄂.F=Ž3KdԾaVW |qmo=23"U Kgm=L"~n ~pm?헂̯,36tˣvƿ"+UpSrE!, _2|PKێr梜L)"*B4#JTppC"quE~nt n"BEGAj&,?AIe3/ڞ"]xK嘖UmwR»2Xe6DAZ41*n]ĔdD=0 YBAY芄lb Cq`&ibm.M VxyL, LdžMuPl."hhXn>z6tݎM v S)n&Vjy.v'AbQS$W\8.ʠ-iIdt*HE7m6jrE$K4: գ&xeD15sT Z Wm͸(v 4;VXP tp5LrڠR5yjYw (ߩU_ˡ] h"d{MSqNOi=oG-µQۦ=TC8g>Qbj*!]n`28qrWz|MꋒmVC˸{ ˞W)xTԃ2Ld 䥷Y Ijsy1F<%;vΓhY֖ǪeQB ub:i#?|Azx=}~o/ wbbl7FiPĦI( Å 5xItΞyGa$d,Ȅًtad.ײ4u[a `Lan]f4ֆhBS떰* MϯB8Ҳ^Z'Z@3 ϼ{vBKVi{ K?7HÁᖍ]Mk+ =q/(|`? G}}GZ*څ$ܜk]jy|×_/ï \@u * VHOkS`󞖧&:Z)hPBG˗@[c2?z xpm0s >6/?_mL{} TM@ ?8|Um)p ~˭R{*<{em)j|KX"pc{X0Bmq`cمf7hjש NwPq$u:bPvӰirb*x=UJ=*n9 K=U*aHL]B:7@ t'(gȽ^4 5BLEpsI?lx g# U1JVq6RY*S/*^j߁&.2eyh1q9sx}{CcdICO0`1l XTĝ]%l6d)066mvdˈm!ETn*]v/zVF-hu >D5TM`IY*4Bxj櫧8u}h?cK{lO$:uzZfgڳC.,aэG%0[&c`1K}`C~bK&." M ,ͮ f X]$KT NⷦI5rB %$"&0;},| ǚµJq -묻lh U dKޢſ-թ/GnlV18!s2 B? nؼ̹,{-{-A}{#{ ӐȈ1LKm1>iU J8zʼnt"5D݅2AWNOn !6@)Ў)8*bā۴#X.a 6D{_`դM5d9O)Ѱ Dlx\UPA-t=HAtuP$=Kd),5Ф*۵\r@@ti+i]Blnӎd#4P@guΞ>=]l×b}oYѓ yIυ JXoYЯ[FY9R^۔>9OYS W=l{Ro֟# Ϥf5h^\90peMm/-nXbF kAw Ct,n" 8\aj'0G{obS :s Wэ ""a)d#fjsWg)f]: f&OR7jd)D+]@WC#lnxzSCНb2HeJE"8u P.2&5Ebc06a]p"p+V z[{vaa >c7ٟ.@ p~n$,mʜo e_{P58: S=0mYKy C e]>ۄS{Zb`f[`1ٿQOԵoݢfZct=wŠwuǏ=?'wk ;ZէZJy#Lv _?߱%t,<06:[_K0> _<1[?4 448s=h>sЏM۷ΩViR [A3#?C|O凣?˶de›qņ*0c1Kidš6B/C6Ojw{z#pe!˧$RwO^ekH}ul$M&tPn`."0}Kq4-Y|47>EL/^!J`D>d^&J2RѮ(ct:pe"7o [\Vl\:Op=+t~w;86tQ<3pqVF:O@,s[XuK}7?ΐcMy ׭0}N'rMj۔hU %6Ru vdy9tjXidRG?Nl'zʹ sQf&1R-(\'8V-?ڍM گٻUc9ԚF.laV+znnBM`CؠrsE'Te+ȳb âݶȂ, ~8"o8xq/kVGx3@('OR4<$0cW9pemǓGTm\,,U&@?`s{IY1yF޹JY6ScuY)[,|P}qvl!N~!^VT>{i RuE,b#"=Ub@ ` nTՓ' oZ}LD;oO;~M:: A3!<{GWx/[W)E<1,d+k|LS!hsX% 9̆HlAZhClZaŁl #bӝx+:JĢ\qF65pFr YBi(M$_YĬh Pt %@!'(P:UC+u6(!;<,'[wX7Yb>v I@dC`:4&aU H#-ihPI%XB]5j)"k6E`4vp"(`7Çmp΅ *'f 8J."n!EUt }N%W;M;@w@wuBmԲOƏ~ɏbƻ>x|g_zr2Vd8^!o^s jC:I;DŽ˸+nr3w-DuJ`hK/ۺZ m!} [[ejċ:\]c~uG IDATpb\v!wOn \il7Z͕l'9w7ށ3p|?ڂ<~kr3u{';&42$ 4+DZÌ|?u'obVKDb 2G;B#4V56kST0$;aWWg(lg$6P9Bd}ar}e˘GAy*"͟QfWQN9\d&<8ecɹp_'f9"WSElpz$r%*~:ƑwX>@q&ȧNd<0@4-|ֹ T@eNst l70Gyq-{)fמ^ʖArүefb*Z%5rG1d/F [+'}E@:);ũ |'?hcb=b*؇D:R!yy}߸̼x7P):ذ .NBVEb=QX.IV3 LDr-VCM)V4 B'ad):: QշQ6 DeM t60 a!-(]@p]cKƭ:dɎ[Hrl*nBJ@M얇`CnxQT좁:hv*>-,t :DJlgn)5b*)$MCZ7MȻtB M-Gw5u$ M,ن! ^E85B> G^El^|F MҔ< MQ F\TsWw }$I9 wgPߎ炨V%@gH+gz#A)*6912ЂHuLBEo2,yq&SiB;:ܟ x`i)I!<&b唈uA@ZdgO4((Q G)Gq,T7>gi05H&c2xFk^l Mzj_eGPcІ< $.n(Oع696t?x~W[5 ?FYbCp͘sF)ɑkktW:9;*+qt4eZS U䴟.J 2bQX(Wyql+e+|\ZoUE {)obnL0Oc5?ԋoH}z0/OQ\c6iZ̅fd4ukw5:v>Lוk[\5/1x%ˡp+erS$Su*# dCMFRw=+q|T)%ivwoHQ{:*xq&OrTP܇6˜.ryڰeDTijmMkSģg{ >,7i/_}U飒麟M|@3V(w''ٴ]"R6S(&8-LW8j`{!zS7!NtvJϾѻZ̦ kI+ `fG+Jʲ5JUhB|; ۠=gʕp1ޗ[hҾG kt?H[a' (k\i]py~H1LJ|o*SdZ((g@%5;2lSt )p |o6+&rLݏRX.| Sa Lc]|iF'9tC{΋Mj-ލ#IBbo_jR^877]o9h˔vFq܉%R=͵]U->yoWϳ[bN`g_`wF,)c7Mj|B;kDc!NӾ̉cQƟޏUb߲naW+t=Ob6N չ *ong=Mɞ/$".\j'mwrvev,Q+%y]οW9 a׮WՏDby݆k?Ŧwˌa8הǶ' MfO%j`T3cT7g)/H] f|~$ё"|A5|}4;#o{V7m~+HOO{7v%;yI_Ui kA6!fQ_wt C+|St?WSõ,K_} ϩ{,b} +nǸVd@Zʳ*]˵ts'BONgAaE +f'թ nrS#aBfըn,Y'tD G@l]~z &mx%vW w9JƐNtd< m;%hD^2[M٪:pVT4IS.abMR-w r@mx15(5,1CmUj6\*ׇ SLߠEp' nEGT U 'v,pssnS~!aG)t4<ZgT1b"U mwR>&.?unT%4 EUvŁG츅Cb3&B6ECUۘz]93Ybkߩe㟌3e;Ǐ24,?COϽ@Wg?21j+WS_EUUok8ǟv1\=w|OO(Ҥŕ2 P:JnRuB+=7q%yOMRPt~='EXME`Wrϣ/(d "mS _b@Z"Xc1ˇߏeӖEM/a5WыuvӵPo#ٙ֠-Q uh=L ֩>CO#GաwrWn]ߍ<5@5w;'F)f -I7>+"-'Xko_PVgyu"|>jKDXFMb88ċf;ܼqW6¨}V0;X X}ƍn;qߕWIz%^# $AB+7l(,1>W.R:>s;zѾ.ϲ ]t8fbORosdwBKj`T-*jl(x7_}O#XwJtRh댆ü߀, Z)MԾE.`|xg|N̓ge`XDGmXgH\@UDo%N]ONs,+ٸSwё[\gƱk.Zi6`D k RE- ӟnwʄIf˪(]LUE;#e]kp|+-#O[~SV/T'[m~x4leNCӿ? 6`LCi҅ l[߆'Nԩs8< 8s$ζ}(_jv|nxMZЖ <"$-+>g^^ч[L/kk;R3ѺK-er&@{:5倐c 6*>ϋyC i}#Ϟ?u:7+>CfWɩ4\#쮎`v8rnr^&rC{ |=~'(Q_}O_=:NvV)Y@/Ep\ᕑm?ͫG#:yL#>ݏ5d;u}(}YҏcV0ZÏR)0vrGIFqm/'Mrt}uM:vl>vQ͒ډa{2_ǎ7pN$y¨e_GUT?%yN08Byxjx5epA:8Χ *n;zǿwP[>Gċ~{'xj:S'jMoO]ئ9QRu~u4}ˏPBT3y #s1Ͷ^<Ld$[SQsQ++ y\zHnja-QU9RsLj;=U:,&OrK`7I.'y^ l))kHI/1},\7h Iڳ]djl1dNMC6o)kMJQ7 6C_7͹J(Ko}Z%" vGIvqQʿD31\5A)ІmRآ&T5vݟaWw?F[MI:U^d I*S,\A5;,4@mxf li/pLF F;NIlS¦4@͋Lb XMCӆEQb2JՋ%D^ j."Z*0 5d+PNB'$ 4}IHԉ :EPI R-F%m oQ!z=P%C}D@T.l..rph o3jqf%D`T!\}-hܤ& "͆Q5.ԦAHR2|hTYaHMfեa2V3y1=ߟX‘|a&o};^o-haspߜ? oK0O~/2sk~w"##Cc#,- P'BھMJl#nݦ{ؙ .lUBlwq27T7#lNcncK&33_"NpaICRjnNZz W I `n!8'quFΜAd9\ Q㕯& P;1]0;Ey$}ɳ$@"eR$%+^Y%Jnز E86we1!ɖlHQER" s}Tu]\l`W4%E7#3Yʪz6cy{yZv11@ra {'ܨsK+Y_o3s9D L} <߭q&}^P@e J; Bc@-?qi#T'y)rD'>SuX2hמ"!F0.W\qǡWk;IJl L+-]㏷.('(p7BcR?u΁Ij4k.s9F.4,08vr*%`չs7LuNvD )ʝGdF b'!Y@Mj1N7z±#ǘN@aw7'6AzFzC>4V Fkf}:R79zl¾-I+=GYfU.xATVk8.ݦ'u'pr/BeIက488NU)҈!bJE;S®h !Ⱦ#D^f:Iݡ#6(b`a4va"T06.E(4|П!`T.ٟ5-qCoVۏ{g᷿ǎ <@@S|ue{03607nfWeO՗#G01CZM8AecwGk0kkL?$dzsmx,d|-]#Tſ(pAP%e|Vzlng[ǂ+OӇMh_>p_: O F!L?r B9WΘVM']޾zfwxs|S^!>R}UdK^icDŽ8tVSbW čqGkH<1w7y;SdXMr ZaBcǐ$.at-݆2rU]W  ,5#H.FGҹ'ꏰ`FDj`y>,;&p07)ipw\!b}pMO3>Ƨ70o}(EX:oCxbK:?%[5Z6C,f-I];}Do5=^G*˳xa!إ' DedQn8mjTmjd[-a۸fK16B` 8fP6@$cn>L&3B#zYM f.afHmbʠg*A;hzѪ;Y"nXcB5CqNL8M19-q$#]^PG80^I"ɿHkN'uX[0\ Gw<<|{GjށRl|b {(^dA0ڧyw٨8Fْy޺'fLbA'M:t VG`Gu`53$nJU9j8L~9qjgdf ( fxyD)ǯuÜq91 $c?1O };MV'9G~ғ|kΪTAx#Ыͳ-Aa##3pXu<™$zqkbXgc:_e3˱Q"i.9\cF\%g\``e~ Je8| ,ڷzϾV|spbvmɈ>qdO¹ ~\T;VGB;}"_?(|_Rh\/]TEeU>r>wbsá/TQ?8^ }8?˰sI|$<滂/}GgH o9d %yս\<%b•F9O4\O?*@Yg*D vi s05=FٿaU/hru' ^+JF2f2Srb*Nқu`,ӔZ39#>T̑lQv{C0䭹R6_é ]\3QҠE9؄tc^fL8'VHfmV"Wv\x_߅mX5Od-D(*qK`8j` xT2ai f !^P&hG#MdR2-*4"*z5Qi i Bv HIjC#zNG`[@ q!t4"i5Ui^B z[]F= U'7E@P搲d2"3(t=6FѪNhh1M2Ӥ?>X{xlz{$Nlp:,QvbtN9l0Z}kΰE̕8.ӭ۸! fl<4]LyV^ =aZ[!~KC7HO{kXhF\[e2ւtBMtCh"ÌE=B$߁K9zoY3A5pّ($.#DZȏ|crril?KPP}WRpe{y×HrpIiT<}+aU_4W_P{$J yoԐ]?9+e98np|luzā ~X4?H$z%7oa5xlr0*rir,x 0Q_/'|㿆et$ﮒh/U/jdգܓ%Nne{$1oO‰46_BG+):8EbN#W#nV t g+~+~O Tv!åLmgQp.nN<.LFW'|Y]|`LgHL^?o⺿>=5$)EhUAQ ZXpiFfʄB6Rem56;"/2c8Q|ģ!9,#~&qmtٽO}5]hutmejEz 2,;ARfߦS>IQPr*I[^>m-@«-QyʡaВA60}7Z=$ma$A=rGiT23l;]ERx8vqE$ɒLA8z`IN| [ %g$7azV?KەTSk"]%j9 b8@l1q ϹrsGS} /)<0|a7Ylը;FR|a.I0c( LVton0i2=@\i8!Ne:,r";!1 ԂzlA,aE#*fkS7AZ}a#LS!ҭ1'Dhm n9*:l-`^ӛhTǪ%tatuj}u`Spu9Fp;7C-6Hc&3! $S{vd:*n )? V0.Jء+"k@]TlFzoo 8ғz H ;̗l IM8craPO# t>rlk,͍6ѷM1Mp[>3#cl!XZ`/oIi8 |jMS@C'c0#RKSpg4[vAea,^{UZ:`y+‘`om3Պ]B!}|o͢?p4P&lLf@~9;#()NpGDm)on\\T3D1MɨUaMz q}>[7`brhj: HӔZĵcACMc&j; Gx.9+: >Cs&@ΐFxnS:#*ObDd7(g߁Z\`vj@sp+C4Ю!p VqQ^Cu_d} Q>ʹ+_cdD'4viRGmn H Vyu^W#* [xj50JO)JCZS ’1 1`N>ʭDv|@gbwnp" )zzܧ{=oJCbD6diҪtJhKNΒգ(.dHgD,P1*C c3HCgh,v4NdQϿM-A-n X:mZ}dziQp( wzvKeO 6[AƏNfeSf5 +W4Z )=踒A8‚)'Ȕʑ#*|pN/nZ-Bh0 )mՐi2㖗a:OQɄ8Zs,$t!rKg{`?H b4(>՘MxD s 'R*op}?O7ުW :PUM1r6Fs@"#c3خLg^@x'i#1Zژq#3 9hHZNqO>RpֱBa:-kc_R:hTYhX!7ЦYD"ab *A"Dkcw ߁+1P k3ϲjVЦd:EVc^Ʀh1\ i=.R/$ZGlQd֣AMʵ }d#}ERRu Q =Bf=[6"&B'(eRvZЅ!#E=cRFXAl%9Yc"-70Cji55̮Дd_|}{vU~9r{h4Ct:|K~q~yFYΞ9SO?KO}|F#}9q.T癟w/q֏ߤ2M"f1]2͠6PsR#> [QPT"^F\23:n9$ ZiŨ:AmM{E"*axC/nQr،dl#}D wԦWXRJ6Nm;;'+d X =$ݒ1BnUCY2y 4Z4Z),UR D-LB׌$I,f zJH p(x.TqG ;, xH9]KaľȌbq0;'Q8,t4>yOC tcN[2aͳS_B4&u&$bc q@wy)@S;0:Zh5MyO'/%.][k7yUf&M!cXjNB4!Q&mDp;t5l"ȵDpy![iCkA) ͐ӌH&Y1E[$``3e0# ,^:NشPt+81Ƣ&=9=KIɄIbX!⪀HTC:ȐҶK\d*> pxN4d*ePS(nW)mZnPmtӠxNhRUghhhQ^IYlc-MR$+t>nPr lBz=xf*ƐM>: [~G+ AIǹIH@~N%Ѱf^OR.Y-%y^40 /=p4Dt.Ђ!Ak賽3͂ 6`BiVTj 9hQ. //||lN3J^-C ?u^^}FgG`У[w@< UnA,;y{0 ?s/84߅GN3/< *G|> 6 X㫔8~4🗳CzQ.Abtq Nff&pyYB,TH&I#-ҖLj'%T{-&WfO#_\#TQ42 ^h=;@?;Evn,'9CP^K1+[#ts6ǹ`LSs$ͼ@Eq#أ'AJU㵊M;%W%vQ@!՝#!-P  IDATs4a;P箇fl`jgB]DcEMf2^qm˰Q؄BaX?9h?]e2D&*J0t^TY)`b x;-w9%쳪HD$qSPLhV6ZUQ r Ӳ HN: gBSߠ I,XXudj QIRGبo^Rκ0{ bZ3,r$؝Tfצ.=:sgWCt!F+:l\N落x@BP G]^@d@8#g|gl:VCC\sI/.pY⻿/ˬ8ANAApUdY&\)]\%,)[3nb™c iGb.B6(Ȩ'Bܽ"Ҽ.Px8L".}IG{gh yBfΪ?| Nz280x 1TL8HJ4NOF2 JJA_d5CHl)FcEzB?$Lt6pSdR^,y2Zi.YvA05d% FtMś!M`DV{x`kt:[t(jA2PeGX\^CT>|wژ}HkS1viȞ1i;\ %B o3M@ oߖ27Ѓ+Eh֨'JXno`Hjbɒ3ģݥ﨔'. pA6K(@(4EA5G;٤5}'s)qS)X<ZZ^s4Oj|KtpSDjt/@e(}!q:'(ώH4O2rj' N;B{Tgfd WIҙ0hTfEyL TCC[|3AlsޞܨLe/{[MJQIJ x\kXIpR4 ޸מz?ʵU;}lӦfY\|5_wd+i}sS L_7j=jAFoDO0X8x?"{ !=F3-dBaA"8BX8EMs 7cQ)BWtq:&`r,8&p~#c7illָYyBoc&"*'Aq, NΡimQRll3@24TѦ'u!\x&>IqB>)p %;D2dt=m &h,[3 8dp(9y8yNH 8G=p}R1?K߄sǡPopAρBKpLNn`}w,2l4|{g9Xf mP?]ǗA!;< S >[;Co=;}Ko5_$8qswh.nLl 'f|SJs Ϝ|iR>xzY/V_,}* o.=:?gGy= ,Mû7w&o={e:}S7 q ۚMJk/sir7o]'lÔG"H2Ɏٍ%惼%K? _?׸7I{P" zf@8H&7mw*Ͱ CeT(z}O-6Z$q.m.stFx0E!H4E jGq.P˼I~rOEmw?@Q&p#2-PQl5*aйVFQnL2T%[gq"qAԦF Np$Y;:5댒'vQ:RTݼțg,H5kxˬqm$',X={?$vf^Q^h u񨽢C-H@LZ"] 2VXЂ>ӳhN ;!+s1Rs.kzM߉R?ڢhJdi7ivQ[kla_ gZ%m zI ∝&Nc25/1'o j0~ CmаddT\nGn59lAzc3Ub9h*5/:[aS$0'LZ. v9\aGAF08oHa ӷr\dNzYOr*˒sD3mp %? w‹稄]b&NqA2>b%hX\M +H=xDBPwab EAhQjkfnBO<^kTu*-.NI%nݢ;){%@o ufʫnDž ,aoa>Ge&_vx7yx睡[+Uz[dj>=^m 퉸 /ߴgy F\rtk 8wsVb.Jbg38GC~-]YkS?!e%ZO|=o0A+Y%(+#76>@šĽ&$^JH͜ئ3+sj9({cM);eҩ3NyS7:j=nH:k!&lVM.pk.;YJGa$ }9A$7Br72l "i[$d}+ XcnX/Mg٦CH5t>eÞe%Ancxm}:aQ6$jЅ KeSD@Aq1unkS"F#4|U| MDt3oY:A D6"w%-4pЉpR'K8[e臢mL S=<d.@tG=\߸ĥ/ST5&J#|*Z$jݪι+:DΠAʠZXզ{ }>EL-t<,59^pD&=MqGyؕ5\d};GuBx*&H41g{*a~|X7v@C:-Dݼj(+dLM ? =f0mqM}DJͲM{$O ;#u[#^ʩ"I16<;wo:;$*nI;Fܮ "(ӨD.NfKrELOp`Ad6'4+4+"w6Pc[}'Dt@b/ ͜fKa"nEWT,:.5w|&Džfz ,qk-./ũ${uMnHi&HncTcV uT1:8 CQqk2ZbZN G={QmO}8|~c[W^s>?gɯ#o};Ό0ȫWX{5!wc_e Pb*rttR/i~:ÅmV}P m9LHIFlSiSas2wF#|`cM-qõay,b *No1F},LkQqTѸ3%_q$9R+'p`ClW#usX~َ#%.pd`8)"bW$bo[/-Hj㧈"tUt[%&F 5; 4'"MD } i}(e$/X{"$[`{"#8;|NkBα̻;qA>ՎGZQi:?# ,]!/-Bg)lwPmEE"mSMM҃4=Ǎ %)כ6je1+vAPR2"A&O/l1QH^;DmHA# 4qT}pD־O-0| 0۷\ a,?_8,];n7G7# czeפ;CqN÷Y3tExmyH_قG@D\݆8'ΩĺgC>Ɔ*lͷar~@Lf'Xേ@pC[CP=9 &a$`>K@7G?2̓>y`h7 }x4ҏ= PÛg\__)xmg??k>ypMrC&|NaA4 eƆQQ;Wazx\1~/_ f:9Ǯr} ;ʁ1T4֍< t&"ws($3Kkd RJ>`ǝ)f1M6MX cp^sj!Nkz/1a[ }B! (W 4&Z٤ q=2:fA"8b壌(hB\&aC3  ΀ Wڛ(D)`Jޙ'I,7l:_$E)$ h'#Fh/&K2^FF Vv \M\3}S err % AIafPu&x]WaUnM $h)WwQFMŸSTB}\k Hy9BqMzYǘhp2d'#kq~#n@E`zF*%: }sF:c46C8 x#z s&\^~%gS".nB Ms43$mGuW-W}.\O1Mmta+8k15qQi(LŐk8&&$;6_/prZ$f44zO p~E;1H"xATĴ(%@ QAףՁt\dvf7!q0ӻ*qɁFEk*A Hf]]JkYݼWYdDAGE!S u ڇ{4.%kqS#Mrh $aQtt#V$6Ym\;6:xldO=;EaB 4=ذ)LzewtQI) yPҷD4"8M/"")-$moqb&6Zߖ "46JDLtAʧGQEޒKMc:quEf7 FD75F*&"!"0dj lݠZbb8!\O S.$ n00Ach! d#LV9`DEvAok4%w ooVٶÏwInd|B}X$ 6i&lYpe3,!n7\.$RAUT(j]*koN3ѹ@v /^[KphiFhxjo(K4>ӛ؎K$;e'Bϙė.M0d;4󻼴v~xm}w9:P|eB*k}}WQb*YTDeGMc+u2ZZ_atР2؋Y!7 b*ڤr1[4b-f6czӦewG"$ ~m?E=%j_(!s]̐SN "18 lc$|)A۪t5@å/޹/q5^?nѤjvEYML4)!c6 _y}~3?G6M@\+ X* z+,_]1:9M'cD:iή2h(K `] O~VA6ĝPf!Ḿ$pQÙLYmt-z>ѡ <!zx=<׃o[e/@\2Пg`*Cg~R)x??u~{!VUxihH D!r"Y(}WfxgCCp6#C u.9Ls| ʳ:r=p`hQ J Xfe0ky ^z~qõpܡ]W Ͻw-?0d<x+o`4@B2=ܴ(_9~=XvDY0I(zWw N^a#&pj8#y ]+,*qG6aD[Đbǩ!f*7uIv%#ezP[:lOΡIFϣrƘٛS=* 8Ϙ`` +S4}Ht8L&m-G4Kq/rc23+-+t/Mi**+V ^$n0^,I1-pvd378"`$K딕uBzeChŭwhLDc,`9^(Ue!lՠb)V_&0G1*}wyʽgyX48: #1a!l)뛘D ]ٚ@JhQ$B=2pFlP mWi!G8g`錥\$ '0Aˡ8UB|b ) xҫ$'sTR%QG4=)f9sȾ)h LrIG\ẋ!'/r|FַHEEjBd$i3O鼹bp$+z4:ScYJ~"hEz:-DIS41ۥF'}ܯc4z,V cEH)mv9m$(.xL0e<! J* 9CP_DD$Qm5WQE YduM#S@$"e3@tZH_&%J=3[!8%HL1&ڈ0 sj)C7,""b'ƐI 1]a2WFbT!tm{R%G`[3o{鈉ݲx03]R$ʡ!>z\%%bBpkH{3gG0T\e.hc5 ,"$U FWp'ZjҜn6A$f}BYgȗp jmHBZ/D u7d*Ufš+n Xmk1uЌ o%|^tj +4ַ,2S\S4WͤE*ɱx6N68WZIydxSʄm/ؠ`@`+E4I ڀ:~[_mG@HFILQ ^vl?O~ɟ|/~iN>eƙ}Y3 Rˤ mlS!;tZfrPs3GA=($*7+DUg!` 7Cm/iU, Y[dhB259ªu I~L>w._^cD:c)؂G;R;ha\?B 1"qLzBQLңHU$O=@FsC}jC $ (e`Lʫ@: u0m\cnB:FCq0 xbr89X .<2hax=~꧇qzv8 ;UW`2V>)sP)x8̝lyy99?b{8g\n%ػ;ck,mAfμϾ =04vf&`q^|V5 W˰'?-gߕ? L8sxl _׆g!aH$owkmE.p03^FCNNF7 sT$_ZU5hq4\|MnЉG٩2.Q)qqE2MdnF}oK!HrGzL%c-ש4,ZBS`Rjztz5$xnfq+^a+\Ċ{쉩ODX[O^_AfDa/cwڜ=2Xj٘ߠ,,͎Ce\hS/έT*щ}7\[IT#t:TP9AG7˴UËt*nQ;wsFQ|˜3N3k+M2ɒL:80uU寓D(je4֠=gyis+12HB4c -bqº6Sj6-G IG\.HTɭt1R Qi%j 8Z HBfgң 5ц 1u˨NPbaՈDXqbo"4ŨﲒS;{{ >e.~&)z')r`$@LGV |]vbtnSL2tYHQ+ȋ>w5&%a+a`kkqWa&RQpv6Ex,Jay㮔n=)N,31Rߢ,1mmFn0D.=cn4ǢcgE푊mD7ٸ&bEc9?rʙw/rhdѴFK16hm )$w@>գIO- K"yq =6(ϐxYajAFL%}4N<iuHOJޤ-@STE>c-ڃ8޺M3Q-)jH[]VBP"bPy$Mf7؏^eвزӋDHH1.Gԣ&*o=ȨSgfNv2ߢi&)-VRNg S3'ЧySa1'ъ#ѡa FCe$sGU{ssd#*׳|'LN{l.\f<Ń&LS4&{7x⇊Mt"_`2rF$)I5):a&w.m]lH~d|adu ^YGb! *ɋs,D`=O!?xZ͍#:mhGC.4Ki* 0e"_]G d88}GJZd %vj&j*IA!$wy%[k`6[cośbq37JrYU;UBq. P>I"mL!OX;msW:۾@´!Y&ũJY7hu{?K &=~OqvO8LΝC6R.)L8}F6!c4Z!thrZ%lt<ש4#gdj ?T|OsW_z9s/ )4jھ4GUt0I1DYBHfM|zTjO<E3&,q kQ%.j$BEb :\|S]fn8ۗvTOH"EbYnlOoqDBt(QEF \L?]N)'mlPshئ64#ћ+ԤVgTB%@=X+g qW=[=+g0ĥ<:Q!F<'F]ZJ[O1w>LJ9ʹQX\/R p&ذ!牗wԂc{a^3~Vo2D :bk8rdhY /܀䆏Щkwdrt.!#ֆRd p`qrC `P~SCfxak wirYQm`ygzŧx9Jݤdv=HBb ŃX{I<_`=Io}d4=Ûa x' Rsg{hoS Si̒EZl }ҝDvt_g&1f93x8oū|`&pKQ\=նL;i !?x/|^~&:ByZvāJq}*W^{>/X!}W#)qm'*aK\i_%vtЈȋ8ta̯8ڤԵ MDbEﶞ.3@]ҩ\I *l%7!գKGC6AS 4\z$n,M/AZþ2wG<S) f y2yP}fC(ęg~FdUg`UO*gT<}>Fғ@f[S

o.P}b??06ŵ5N}(&ZWxr͋nz~R|w}r5[ 7<Oj0ؒy߹01I*טgo7E=:S)7hܔ..:>b?͹͇4ϙ;l/_i|`~1̦)nT&fӝq0*Z]#d F| M_2ZAʵ:;FS%7{\5tW/pP`mvDvĀCtw/1C-kw ^% z$/mho!)\рHSƸ2Bl~3+?=.! $[O"%KR6prĝsxRuշ?PW@.~K:<8жP VVz%o?cٟer8V[m{lUR!=ŧĈ;05Wi:[=..?\=cs6fZq5Jz/vYr-9.J1hmcE3ѳD,3#L6/ZGjSt!|ck $WpT+D\kWgx|.a| /2 6GSm!v۸>{P<1WLvů)ov3W| zF T Uӱ貙vCh);p ۺQPC]%7*ujv2E3 R`/>!\" ]Ƀ-aĠ H!-s/^ eGu"n2 uh:!٨r QÉoИY)oঝxY7^ WU3ci&~B>:D4;9'ktH SYrtЛ*3SHt%'E9ߤjrQڻ£GX`(sлfPYh YQ\_!`첵r@g0_HD]]=(y{9:"m3L/wK$#\"0XcsM:$gu0i{}FWy"|^ae9F}o6){fxorPvczV$: SvtM:"{7ȴ IDAT7[{^ 6-EgnQW^2 WW#Y7Y̫e| ?ڹSxJO>:j )3ܳRք.S52hyta üKX ax&=w(5rxnGE|wX][lz^s;FVPIfl=.^dk44'fF}e'NJw>&&zMuN_~9B-AFz.J#!E`XLf_ zJd]9sl"y"g>A%@vt"߬-bpK8c!Q=ʽJ?7c.NIБUr֝gac#C:g-Iט5 g,#Tfaq=X0S$P\" RV0|#^DK?C3d=>i5jk?wg?+YNrƿ<;1DIu7Y\A+fe'iބ}b߷W"UV[[6׍Uy:~^%;DTMww7 x|E+=ʊ &z{ 2B0+&G&.n[7 #>>=DGlغ 7mvY.2ɡjC(bk:e+b}AJ}ŋT7i^@pl`cTS~Oh|-u e^\'_K`^D*0LyÃg AOAS8WmJKPxN6 =_߃t硭mdLpRo~U42J4A"lv_?Y/^]x8<3kq8;q[VȖ !G>/ApL+\k&&h=߅'O%]3S~ m1ܥܘE؈p(=z-9b7Z5Q{ @-|YQxo-ɼanuT89W#|:<~Ώny n;4Mxzpv 'o$ cOS92p>8Oswl #ǨE:;?Fu'#/n8 =3+V4 i"bnٝ;_Bܝ=|Hˠa3(}L.?<ȁcX5Gʌtq%mE 1,m {GJ̱Cfnx&ǩ*(cqNbv.lީTs%ԉ8eܾD_ 6o,Y +R?G~cv^igr1?SLM~K;# l*Rw |9z"(gz 7ݼ_8>U律hI?; <~K>57R%^{oh_7U 5Rr'_?z]c줖jrfj]jv0f X{;:ݸK4{CVv*}l׳V,S(!SԉUfW.cZf®_hrt>B9-Pi/9ߠ?K-`"%zOztgXXn2jb-sʪ#ohUy촋YwK_%_!?O^=6sPmc͒XG&"C`jNoWv[\Du*rW8x؏Sv8mx&ez\w:;sY^bHکv7QTfbfJJL}t7%^=rXMl5;MQ*zto6 [ry}] 6[aWGTĺϳ,C^?MΜpT_~ߩ}a|.˨L is<}:Zu /˯f8-)GZ,IxU8\hɅr-_y? S-r-8<]-& A*uxwu̹zqiɺF 05pzar}^+8u>sn?]xk-ٵdm-^oZ3Z?F7>[5c}yXCxw@m7/񿇶~89_beu^킀t3 _{7I`?xݜoso)Pniע&5 !Kzr~` )6ʩ^F*ՍZϓ9stÔUNAv({]mL2%l#I=Kռw}NFr>Z xdz-Mh9#0ᵒUoS17<`}di %Y}| +Wz9_.R,D]˅hq<<)6Ƴ4&(utz}TV,(eʇ5aLOٱTS=BwI=͓u{XXLs5vQ"{^:ߩr*풕m[!%L+[ĕ$& 5;{h)A}rkN/VDQg-uqД l2eɂSotjx n*Ӭ;0͘=\ݾMXCNI{M&3FS', xx\ˈ6^W`% -xSE |J(BMH-1-,.<Vن*Ϩ>:lM ۀFY1*\ .9 ɈޤF^Ac6eNFIW93U֖7n4 ǎ٥QnQZ t 6v"H9‡OZZ\j^~!*xT& [{ܠoKB1d(~biV2eL oݠr+H ͣʩ~\25,fP nq0DJM֖cA:uuo0u.PiL^bл[a;c)ylIJJm['HC>::y|[.- >< r<-u+ 7AcyZuRoЬNWcK悘$qѾKd#NqgظJߢF̘;H^jrlŏ%n5f%>vE/gY͍ߦjđkڬ(,X 'yjX"^N,I*La7x "z6wXƋw l%$ '|>|4==+JL q0Gvdܤ|ݔEse%spIBތ3lc`k.m&L8:$~I1]^.38$41*6!m6)Zx>E(BLɌ(qOx꨷_Cd Ó9 ⋌L8VgZ8îe>U%Fk0Zr`a>&pqMr9QBw}\~d>W ~7Fkz0wBi CEIus'_R{8C_Ñ8K#yojk kmbU[7Da<7z(ubn8)G3/^1,U r3Aw.o s \~ec>nT#V.+=7{S3,.Q<ᶱ8NP~tw/rt⺇$4a:Zv`J[ E9Sܲ +g>wxAهj3悍 9k *qZ~u8h?{o/ R_K+-iqy Rn%,}&R5 .%ZSî\og?kpd6 |gZR&wq3뛰vf ]cA׾gab%Az|ַk.gP/]LIh]W~0szk3bMމax}~ :VT;p{+ 8 ;iQ`3åJ!w8A2P(WJ3n2Ը+''j\»ik%;3$eþIa> &U+ۼo\eVmGHegPULY7g$h+5=L:ˀeQvu^=5$د5)7DfE췗bY3>ﲵX>DoccĄig-uSD^^ uR-U}D:9ž(fV M}  LˬlԖ"|clkЙ8#Q斮A[7 ̍W/s'k2>EWohH97[ޡ{,> NOq]D4ѓ ~ˇvE&$ [1Ů mCXm<9P5GKA4*Ly&Dɾifa F; 1&n-ͣ>\v/C"VʋϠ62liV&"m=:ɀo*/0U̅ݙ&zwat9A(TH;4%^Ɇ-b'bNⲸ1:V {FƲS)"ܗQ6|R1a潄97:iv;ٱ %9̞.&E,TN.9iAg7M~`2/q+)+793AUDS:&}jT=nòuRATnqXZJic#pljX# q( Q;H 6cHۂvu M'8mJODqv7v$<u"vH5 "˨d'B hk'L[z42} U"&kdpFiWQ,,*U DjGЌdح؂%7xL=EP*i*:yy!XS-4u&kN̖BxY&-A3uAޫ` ` Y ,5dN4B> }O]SHD*$'AZP#XM1󡝯־|Xq]4~2G@h:,2fFd̵.ZE8( 3͢+UzG}WBoN,J@'h s$z4kZ })39:NP*KKfz !Bnָ](zOOQ68p>]3INmA% \ A!,{a%URQXo^yĂ6( 4T,ܭI|,rBBq!m8~n;"!DIm+uaSLg8'71 Ҏ1L1jfAri!a6!-NxH]D}N$ jĽա 8m۝y,e7**GEhݥ]KP ci=۔b &f^8BE["S)ڐM}yLOO2縅oٸB}X"RM:QH|VDAj 6c_eeĨ7@ݦ hWWh .B^;m u#78~̓ "?@ pV䝋<2#s~1x)p-dhv +?Z:́k%N2~4͸U:!9*suVߧ{#G5(xLYd -]=YDu@ت r_ t'C^oI!T+:*; _kaYd dP/C:dP`o[![1X>tU6K/{Wk2Exl^>([ /_\Ӄ~%gm=jd : kyO?J~ٖ$]R {qW7{q nVe>G[-~vïC{Vr>:.X/݀ˣ-?"<< 0Ւ/峰 6:[j/\ Vt.,m[pZbt9lQΌ?I/00, &=}4fX?"tFm08JbȱIjcm,\|C)ηXb&m~>9x eYPR8#cb}3m9-rzaГu1)Dx2#aUmqGԳ+<e} ֨ (v@j ]x=Oɑ6'9r6z-!2 g0*5}_ IDATIR#nwVg?CgUJ fwxL )d\E0wv ?[]&+!(|dz`F,P/-IU6dgD0b0P>F2+8*L}l^ L5e ɜ#GpAQx%iE1\؝H]#'q4n6 ~5o¦UlI[|NU Rxd5Xa@b"ADAs;5>0yv% MϘ鞲#XU57_G}_Sdž0߉Bh6Zvwz gd\'iǧH!:HpҖKJARaG㲝C4;OXoGoh˚9Y"eȔ {= ǂv*I1-"!d#VXûV* ( Ƹ{s GdILtlhc{N|hgO} G@,ճ%E@qmkvR8':~QYjioKhmb>a1Gü@}y:Eʩ-cҔ+[¥#]teo;_"u=h1\Y6Mij΃=Sv:Uߌ'b6NeDd)`wC!b{Cx1]=98{CY8 *^`: 3@9v@$C-f:-*Bؒh|[`3>J{-ֶXݭ ?<:[ ^3C-]KO>bv͖wXO5x<ܓx%㆖T<Ǐ×ɟ:~UOt᭛ i |Zrk-Iڀlj}FQ i[k|$\!xk-tOz:Opn:|y&QkuN=cˮ5,.n_0_aH1Q5Q)a wiODyL4 9].B*iɠ_q~N;++(2JNbmm(W|Y./ \(u21:O{#"}3&s˔7GNz-C2r݁PuH9J79Zsoc w8b_7ؘ[b:ڏ#s%R6f__1ݸO oorw0V %Nuvw^mcq++T0W5AIF'H׶}\6J,w41!~V`ia9_bXf4ڵ79[:lކ< Wv܌P:݂*X UE\) ҝ{A2_w OEe.`tKT羽H|\CC6?}$98PMZ}X&Ws:MO{A FYD |"vń MrrM4"SCPtI Pz;MȢP*6,a{nG׉Eok#Zˆ[4TȗSUPr,q`ӤjpwHd`\DYp`w2d4%VsY`J$9fR pmԙ_ߟBڐLPm2౳YqUec6Lx*Q,:eX#cz[Φvi]/?YW6=H427 SE3{E$+1qA 2a.#tClylZNYk0TXyP]xelؽ$Rg|WQKit:[c<5È:(UW,BaB2*cJfD$m 3HQsQDب ä:aqI[Q-u 9h%<6uYM5ɥf-]`Ec\dِJ*AÒh)!TTy ?Q4T "̓4i#*'6:TJ;Faߞđ-S\yBF &SXL`s'&(EO~\@ `pa]E^*tvUV!]eA-ORh>7d4J8%҅m9^ڱ Xw^1xffXCsNH͒ݚh~^T:3bq Ǧ)-,6Q@?{0U`]fakĪՉ'BY(z(if8pG6$=G9O=)Q=bx`S"JStScyLp]'Evo 5$$޽ ͛M:ivcцFM)xêJ!FP9PDm smK7Dԝ쭽MmE0ҼNG MNEǒRRfc&m 6E֤~7ۨNvԎ3Prs6+'K . ד_,28@6/NʰTU(slf<%YJ^k[urصA%l˖5H49Otf35s&DP~>n7 _xzNk&1ѷM _5'M;fs E \IggmY#L:,^M!N\o YnvEc $gܷ_cκC59mYfvn-œ`[dMVaolh)Cְh>m_}E~Ev#qeR ~ڄJYB:~YEravaF0h) k9zPVXHυDwv7y`p?B냍ײ 8plȑSe ֡2! CFB6YaM0l+h &KC|x x/}+b`Y=Gaf{\NZ?4X!QlKm/p4C:ph<<<߾;?#x ɺ h$- @{O7_&<>ʴ7ԽI}7گRfx/}pec[sl}A &ӻK%z0k$!;3ea34#gu~eW?kt<4%%ȪWňlOyPqG繲6Nq6I lܾ.0SkgY?A$gɹupfIRbZgGF_UUvP_Ϳ<~6n& KwXWQF:N-E~aGI8]s|79GٜJKb'\3m8 lU&!gy>Co ZC;)9mvT>f-EB SWK{d£?~篾yphX"Sc5!j@f/ŅU|@%>()Sl ] .̗ WZBZPq}t+"a%$ikd|+ d4tvL2@3dpnש@1HEQlԗ*Gld:%DUQ@[Fb—0q8%2 EӣX7^XO[˵=U혤2m Ff&vM:hj[TJ+[u0|,@kC82qEe)Q=Pdsv@Tɒ5+txm⒎ɵ.{nZ,ń3o߻}__E oiCstDFEv^ v|6Hj|ȁVlXXo=p[Rp(,lWJ yIw-P3w3B it`i7nb\U AmփY  EH%:IHg0FQ6JDwZ=MG6frt06o:\;U&bbn QF6LT[FHG1ԝ&rw/i{kǫRQ)*e4Fm0eluWET9 6K"oDrbňjC/uTt5 Z.Z]ݐGsl<EHW32\]_^0h >: 3?݈²Wf!nbVN5u~ S>m7'A0`=.̇&0O<`ÑC8Ē5Ae󿼈~/be{KT]%{Z4Gn'Za̫q~7}7y.oey0!ˉN>=| q<c/<w0^y䌑玨|0{2&/U}Z _y̰ř6QOㄎ&Ȑs]n¼sg=|#xZe!'[KSeϞ b3znX70,37q۩4 "uYC̖(ƶ3 EM'2qnYn*uԛ$jr̀Q1Prj(Lv@11ZY$PQhsfxi=ӿl'fƯ)t:)L2\ huXڡנ(I&T25 $t*bA-ٹnIct.e#&׈T.$ջDDGE{-5>U7la:;$̘CTex_a+w6/-FVh(IdKCdF8 20Ӄvz + ZQ,kyLjYƖWJM̢댠L6OQq UJTHk,ӲAo+ 2iĮ4O*TJ;.%,d(VEuSYN(qFqoZKޕ!&)n0V/حv Pey.buɼe0\)R8>3ddcm7ue PH=R?$bQAbHXΧ);L2/V(pf=muG"T١FYmax? 櫭$RWba`?S᱃|#K +fa6#+U!-.i\N 4VZ"j7a}hE\R /Yu4 麟vqTqDlÑrTw^IOlN6|P=9Ɛ*DJ#EgN763lbLJ f4[Jv}}"´ۘ'1֋8 r7{1` Vs1D_qGY!ѪYUaaQC\'#[Rj8u\/brN/d%aۋ%?%TAMȸ8oW59şgTrְTFZNJ<łr ID1q(e Ŕ&𧫔{Eꪓ~sayNUٯfeN .֬,s~g'"ck:(YH \fjUvs/,-ewj7 StTEnUϢ$o#NO:ű,{l4,OYȵ/p3W΋CZ;X;S8ӱfvl˝n{\`?!o E分 Y:KnS IDAT~kXa6 QkFs ]*6JY"_ .'k9v:Mu'FIr(y̎:V,y N r:ðu GD H~{.?6A6tYӐ[obr= ل  utB" fē Ӫ\JlG2yX߀i=6AN0vD4vny؉{o0 5 leV%0&rcAȚ XOoޜ=?Z i; 7+K.?LAHAX@" ֔D7qCJ[pi./tE D73PP 0eDv,,z&A6׏us-2{:״$mVVN)[{ KiƬXUB,Cv#Y n +dXaڞ7w>qi1+E:0fqWgzB;|˃Zvh .:՞g=LGOc'Se,-3(֥26H)"D]ʭ;Lz;>UFǁ(f9˷J-gu?GPʊK6èaAHk(qtk2+es7 *JeR@fD;CϷvW5j94֩,۰1\n>\p+i*ylv$~)nCTHC+LlHVJb+/aTig 1/0-[ !>YnRCrLF~>xݞx;nZ02Sc?G/}|/{7O(\:ryXpbQ\XU* "Ց]EZ5E]1ZP{+e:U-rGŸ`4 pmXZ$QZ q;+ry";UOs\DM'SuK&Lv4!cFEc+t59"M.TLka_'u#LdrZ"e=AKrގQEZ32T,5/]n3*#5r6n͐mh׀;d*RpB&~`ZW)SжbTi"0kHL55ZjEk_FOqحQs(u %Fy:;>^EӢ-P]7 &UM^(9ErydM9+.C"X.򺆄NRX⭵anSQV5VF.0h,y<=%!MLhǡ]. ڋ!Sl翃xz3˹48 & uQɌ֧ÝQXtdISvh%~|t KeNZwfC3sgmM:ɕ$=DSKm#]rOSI Aw?Հ(30bh@F6 2;aDwHYCS0pKbK痢Xb`#^#TpIezMP[@:Q\EV#K#8;4Gp \#` a= 9p~ hC01CCP`ՆWa$+d2ha}Fn ._i߰D vt0*O~Ex%8;A?wB\CscVW/5fy F:![KQ85$mN 4Xj>XڂL7L]`ZTؓ~9їnU`|]:wc/l.LA3ntᷧx<;*|ФV3憹0r)Þ>U $/0>t&8[axq <{rk njh=9a׎V%5$<[)Zԭp% ~~ 5:/qs\M4UTIcasII)jz!*kNJ L@VrE3R]ĪW< PPJaŭ4xL&)h6,~FrԽm%r2Yl2?dRS6_`(rO׿֋]QqJHѝ.WES8ͤMKhv@)^b kdd]i ȋ,y!Vvb%l6On[jPkY hpciSa9?!saɮJ[ 6dgt} &9a& B!KԽ;/(+)OUF %b5 rR%̱g;exO )lo$byezHdε5jA/lfǏEtQ./?Ch;+ױ* ZZDB%";8j g P6kh:QlYE6fIs(=A=&qFKU;|?Ev`%y! ,`Ƽji+GaeH#({4] @)I v{;\84dv@C0L|aV6\;{a8lGb fxb F`iԯ>:Ǡ   hk z!> ߾>+`Sg0L-6γV1l1yhmd!-9[uhvÑai-pp|*}@3\ۀD`O,aXe@RDC~ V16tUC0p_67נANVDV ~PAY7Կ W݂ig.ѳna@K5~`a rFgS=,:w&|8pN\۸MD(3ٸ;̣0|ϗ*>a ?еp?G)Ν2/q+l[Q xesT_ 5;A0Q?ϴs7s<>{е cvD+/p3ܴzgFjZ^ty)}xήIpz6m[7ǚ؜gj<{\q7I͸JۤB]t70#+Oo+c#-2[Lz/bz$'ޤF=Lm:x-W"vKnS3ۛk+[AhLGsLDWd~M'jQ:.V1Z*fq0n^楕&I$#THsKX)]Wjѣ䛲5UdgZf3H RYdۅN/A?㔋 UĢIA:4*j QrݪHiV u "F5&s~S )m(k譨M9=)3Y:\4&6a{SOhSgpU  JQ@qIh52 F:[ZP3aB AX(T >#xR\D/(ZE<X〤s10G:w剛q3I[d;sHpNh a :eΩe҃mK GDE>7:m2d NZr$7i̼1'^^>4y;¬K-r3Bchv.uilQ\:X٦;lf hg{܁8g~=?JD!eU:v"ģ,ZQƘ(T#u¶.{ )½3\LC;Xc$$w0=Zb!ƅeCeѬ܌]r< 0ɽ͈$%kgx[zs%K'"کi,ϸHrKpƞyv#Bdfl~d UUe& LNM?Opq1\N'_ɧ~^} Ga4X\Zۏ?Fc*h>^,3b/=ETz-~ep|>ϕ@2|FwS'onJ&lĿ@#I˔sfU%Yo)uI&|N #'s(obW[HЬ3kQi@&Pt`kP2HvRIMf']FQYQn MNN]i_AK#/ c:A횃jQskX\S,)TW@aB$]Y))K[>O^(ze6҄)5mJS*3\ddGPiwVQ=64:Cqf vRƂ,1vXpEꨞ %);L.2!/ J֌Kn:BGXޅ=tOnbj5Qjъ7`]V!Ie0TPsa/X3/\"QW1M%TKoΆM[ЁAALZ7%] j,8 ql% 9CKKњe2Ix+zrN nຜMGj8Z_yz%@;U u%c$NQ 6dycFXVƐ.po_&DʘFF=Rξl1-;RDpj W$_ԉ [sNSz3o;qm+`kxfPd92^zn# =u&Qu+%ԣn$}c.N-c@5hd +Up 64wz> UkG|ڃkhC}m! 9߂O>8'|nlV}|`6onN6XހC^"`B,I@3 W\WB+}Ɗ].+>lmw c]z 83L:.a>'PCn|/x#ÁNp4/D-y#{\N,GD7ROؗ?LSqx?ƶV[bċ?v2q郏>z Ϩ<(",iq9~QJUn76CzCgZ:8RIM!N?Oo.}H0EI,M,jd= ] V\f|+hT a,f^Һ5g)V5|CW.q?ٓGT+<t7s +j )VWPIՑUuh-6 -ɕD$ -[*E^(4&Z&e#mx.zO=lVE-B^ĿKAg"dA5ТAQI . yZ ձ1`k+F`ɪR)P)j9{CjV!vt&(LŘ:hySfBٵL_)hK;%."9PUjF$SlR]^Q;PF3{dX=6HIo@L:+5n2؂^ʚ-H{,,.W?p=x}=-Sddm-aS/(߿owywY] r܌[QxH#Zwޒe*2)+u,m~ uHrhSF:F޵ZRfrY/f/΂eQSOǬBa%)x2$71(yLU IƴA޺ΤN!5GkBz :\ºEx+mm+e )} ɣx)x$նgr,\NX)Õ]!%GH؆(qZ. k5RB簙HL\mgOV-f\3Q̰+*tpѽIq1J5G>k EOYګ%t.U+YL8rҡK:jsi[MRtoʫ! -Y4f B9|A2XJ-iZNu}ԕy2-Œ"d%PJH*,) )iySIrfD^bv٨W0،wHtPTpe@'[z'.Q4p(MZTs MJR34q ǬkbugjE0 U&MRSĊ15HuER6:R .@oGN=9Z8Lv +cDF,;Xʳ2W[9v}?^a k&vKJAjZL5 bňS7ѕE+ 5 "Fx{p(:u@ 4TG!/67 w}yk[a5Ə,C\4 BkQN|. ӍX݃ W84m{`6S%80 =0 hrt 0{] /ý74~2֐: _y ~ d ,±]97}BhU5XT=0kitcge73j;can!Ϗ4d?x |nF-up!puܖF|N;s ,ʘ;ٶ#1>ͥ"V^Y lP Ggo7,DnRd.Uu-UjuMr]%AHHD$nQhڗC ֲ\>j4rցQǔUYLY :"T''f!Q,R oH^Z<9L! f c *T5U)1U؛X4l$u!-Icݢ[̆d! ^ fJE \&RY܂K nH2AWIh:i54PH.P,2*1Le"ֲDlƒY'm_2 Q:9m@P`Wf- TJȺoM9?.Qx,4 k&U$J8>&YFNb0<ݤYLYƱ]||^+gLm?' *=]ζb[ͳߐ8PfeُhDi+qmk-ttԵ.UZ 1)fxԌ9eq0uNvhf,zu#x!$ծp خuhkxPm20jJ: 6̊}NF^*ђ-֏TDЅρ3Mf4;FK,:9eo{ ]1q:Ps7E>Kq!ļF`Wכ:`hbiկe>eD 1eb]-FĶ ?.-ǺRG]fhn5`IPnBՊi0^S)NBqC&׸:ģBwnp_дuG9`n(d)cpw6 yi}^|&rw?:ATdŰa|Ui/ʽ=޶Bez9B!dŔ ^zz̶ &Kz^$R>[Ķ3E_>BNgG8֎Z",E5a.8z=NYmb2;qͽȵWC#r&ڇmAl _'eCoQ'Jq'-L)qKWtch˹h%?pNȦ 3m tBdn:^W.lj65\3k sK= _+B(`'> Q9Ֆx<5 V+\<o{`,!h) i&a_ l|5 x~{'>onhEAnܨv5 7a==-Z ϼo al l)v[p׮!^l0Ń8:ӍHs4]+˜0ynrS_bW?FXX߅v4Zvvsq i)I;8ֵZ;:ۍu֖E NJOh--삛"^mcWX*):ZȊU{JF)7i5p' Z#XX'թbdH(Ζ233gk Fu& <|Bg&4)Oe&\p:qj;TyJy -yvVtԯguGiQ. R/zHwTݎjsZ}+!q.J6rvpYsTl7N1nC٨u+WCO"2zZipIv3)uח\If)mAu[%.`ߋM#1l̥)-03 ɹlOu2LpxS3^vOQk-{̍Z=DClcT㟐&8w⪬<ׄ Ҝx)Ls;{xVD3w8.y |I]cnhcl4dG_㮶z^<bl)Ꮆص} %^fӳa<2_- @Pd8̱B@]Pt?oH(|!5s%X6Z9 "`7w^z6`u}-e+[s@˗Rl=[,hs@)9|vm'oakOB2 矃|_hȲ{Z"6k5hiCa[{Zlrn?1/ ,!]# cv87'ar<ms27ѹ |i8[_×?3>o{v AVѶ* 7Ï΀44)x` OAg~ώX^y!<B@qiˇ/!^ 9}7)Wq0koFΩ5L;ڲ̔ \!_ql\VXq^SuR( _F%e5 2~1W kIJ?l`p=-r6ډT3*MdlKM*^N(KWD Kـ50Ih55zħBC6IzVxJtV f3mu@9kYYAUP~ʄΎE3d7.)$-NK2)@YJW,nZ+MoZD(ߜI{K|ER!˓76Rx]e6#ƕ+ZZ?kbħ>۳n;ʱG7kFyDwYDHN :bOA`,\V/s1ŽϴnfYs:'ޭAXiXedțXt&p.`MLtLMYcBQ8hRIJ+ nԜ$Jbj+!Rev:uR9[#ɀܲbnl #UR)OFPyuhbgJt[^!jɊTȃW/[ZU{'a`UvM2bDwn>,+NJ P`]I"1̦Pz(h1`2IXpQmTXC0X_DWN *Q - ץ6r24},G\SH[Mw6 {0p S W IDATz֐m4IW1<(%^JyTi U|Q]uhv۴uZYOGK.ekEL,G2է9ps}z )+rc' 5.$׹r ّc_hF_ZŠ:[o@oC]=A[5VjA>0Se 9tQ59;J ,-p%5ELc,DKFRn!rQL/+7 &- Enx ;#eMA)'] 5c=3߀w} ν|ñZr nm7+i8'mg6L5F}-0`+2\w7{ } "(̄a5ِ+oș?xJO-6 :MdL6/[C@7y}~<}^n0{f"pEhAݞƱ׋6^  ak|ϔfgv6zC;rZj5;A0Bu58Qjr( .S9m=$Mʟk8S^, oA:luDw`]'f~'V܇ÿZ$waCfc/ r㓤 g/7Fqj$i_niRC5q1RJ~;6gek7+L*ɞ|n#kaӅY=r#vVrI 5CX )đUkm5|ew9t݄3$ ܠS 3MVwL`qWR޶`sb 715 =^b;Ҳ`h;5,'{p>zrdD%K8zɼdYuԋ9#0='r,jӋ|yuJޔ!gpQP3R2i]L.z-"E11-+ۂdBXBD֒mn`)jUTZ6VP5"j9CQk'Iq0'R+in &keFXp:S[6c1$ʪKf؆x͊ `T1@v$D-vRŭth0ʃ=aP$#Vr f'iER0k $ e;JڨnbԵ"e)L[&LNۉ^b[T%љGρz ,Zl,|*ZВמ+rnԯPkjO' k9ʛ/άaG'+5< /7zK>H-U+SQnY"hbnK.DFL NBr\v3Fk!~Y $n^#;ҒZvmBHaBo Li䤍q.ҭ^N'F,&!lNj,XBՀ 2gPe*g6ifәՊyiT.m{Lrq>(takaiߩ,5C\[FG'!-0%(/:]U[e:!05>^ (|nqWWʜhK˃>V}?2_Usܺ|HD(ڸ|r0Ue,0fcEjX[{Qz+u|_={ }nv\+W2ώnׅT=B}}*י5\ĈT?f%#Ĭy4l$E:q%}#5i 5l[JR`! Mhvv۶s9^dxRHm-k %~;B堋!s2)IcQPj>U!Q֚PbiCOsxU7txvI xU_ok\[qТO2{](Z6aU-T11!nUj52e_ SDxK%_)#c u?2rzF(8FSj@ĭGTL4&!"{hh34i^}HsPcɀhCZvoYfMX<5 )\-B) S(Jh鈭9t4!5 Xs݈yvI90+i2g=j'fk=SuBy?Mk:h5D/-r㐙9uhVl&>ZdNޚoA`E^껑nK2PJш]auuCy jE:z)dDPe]ҵ@5ʀi9?9݃ȥދl"pz7޷r{z77^-~xgIӸ_7_XY]EQx9{Ǚٸ5vh Ɉ&J|ֿ2i -urRV`gegзO)̘`3*ĹwU`e7 Su|*%7^ڏmDf\F1U߯wjwdAd*!Udt5^g:05y\6 ~ZSU2ֳ#^M˗J_^ 6;#L5aGi{wߣC _I#OUpdJ5>i,wA@%)i?@jh4qn<Vģע&ϵ3w 4diڒ MzA(%ݬr]&so ̸tfԭe~+RXIt[%Rw`1Lۖ , U;4;!jkylB:J-<"hL0OKSV7LNނ?ѱNMaj/稴E_[f^{nʪI&U"c|a o|CWlXڳ#Y[#(aױZc{ûѾdŐޏW dvvSn3/|y)fF8<Z.4UT<2JQ/ aIKd=#3_9`f89 sK+miWkz-{}%ٲ,YDK)Q3L9a0h4sP\[-/}iƿoUy}aөu{g1w|J9'l<C委6Ma_֩9֞RxpL%Ws-",.׏vY;h5PQ%}Y`5*'/Bť @-Z kǻ&Zf%sXzFCs0p^[* צ"$ 3y.ȘRǏc^o \$(8LS 8H*6SCvǍHO`ߡm8.{x9<\2[h #)9i^5t<Ռs'H;تY/lvO?tt;w5p_nU^F[7U7Q}}]6RWt o6F8޲%|ѵ\K7\- *yog/;}8Os/ܠ(sT2 ]\LEn® "' ԼX!1d]Yd8@)˲P"I퐐X1it Iiuk~%ڪM<#`jV J({UBt GΈ=@5PCZ#-.E1['XE 錟F]fDVEUH4gIQ5xٹI{:zT쬄 mrXP\YCZ#jaod*@ j 9њI%el@R]BYѡT s[XTki$<~Y>|H$Ck1LI)V`=5X]Qa2d#:*i|j XU{]bf~B%p(LA !MAUJͭ 3̘\Ȧ^U6 Mpu;&eY}HxoAU5W&X@'68(ceA`,btU}}@%#mDG`ea2S5!㜛>T; uTBl<4+y JGf*ɜ)NoAsX{d$Z"]ZM,UE͸juDcp'gsrha٣HG>1ʵ^d09j$<]Oe3n8;s1R}?Q⭗|lD\{G^ZtkB,{0df4XQ ] 8b)Gwbl6:6,NGs S*[&44b) ffɛ!QE (d?y YCNZ;AvB-RZh.&QS%K"%Jf,Tf-W21 ,[)<8b|z%^`5=w:5y*=UE5qC(VfQhz/ |r'-uBz4JFYNRyԽ!%9Ơ&߭# i::.T&`jM_4b|Mg/"Y]oWTcӟ⍣Ax 4A rCK셟T%Ȧıľ&}!ZH[>zZ }[ݢu &RmRkU],g%ihs 3S}n섇7^m9 Aї)< > 65D:wή$xmVvѝJ.TId$0*S\ehg/>OET?PwS iwo6K; I/3,aI4.!n╜NY3ǺnVdfJJK0Jr};-,$R@*cS7bRWsO~W.Jj?͑隇z=~t&:[iv_WȴP -0+SDf"%-2tc3 47r\hd"H}rRZ;PK}y'R/F0"pv=޼Ε[,&i)FfT1%@N %Sj9mu_L!i+{ ף\f|B`!qu>DoK /A-+ pʠAVm֘Hurbwp.:hIzz~9B ͠Em֛h/W)]`V64ɕf%,P+_b2yg⼐"97\L^S46gO|n|Eb W, ou`_PBJm\|M*NpG?'9*1-Lk<֣Zjmk;UsL'K2J]^emX*e:aq`Q]g^n4יA3F.;݁uM0Kp.'H@Swo #VNkR􄙽8s*&n%\"x 6vX6'i$kz霍P?$0Ku,m/ᅫ/R'~$Ow?1!o۪*mo>[c]$7Uuo97& }[Ω7P+8%_c0c-+]A$%F֤d*.w a" /ŝ^`*1M;/DQv7(,C4?I'n@g{oDhl8x=~M7?eנkWuq*~;"xHO=r M:FFU*yvPGtyՄ|e%&3w# 0Jlh:^3 W`"egH?ce@MGԧRf8JȖшKp$ ޹CƑ:|4+5wl;e$Ѹ!`zeTuR=SUN)M}b%k 9_'9q! }xM)QHxN+M^%8E/A'߂OU^'*|Ixc<%g(H4y)t'\!mddQ$:yyKD^EqKkv'e*$K 0 V8nkV_ϰaij24rCń"(1@&1dtkZL0i:O$}!5G U6YKeyޚflw9 ~&*4T-K=\Aa#av(Mh u8f99y*wm3O]ױ.xLlCAW" CɝJs␌Uy Fj 'hU : 2Wf5;1vgh0dA[A&FLQ gCl1RMʾ3]y:}jJm9*∅i0>N1peͰtEJLԈEӔ[MVD`a8Vk@{Z}\ ~*g9Rvd@Ybga-EZ˨^m$iv2*|r&62޶mLޑQ4!5.Ԛ<;W1J[b]3 aȏ%KH] wX7#[&%&!o4= 49w[\K;2*ﳐ!_o`پ ˇ6PoxQYVt{F/ßFիgJDXCYgb L ( 4.ܥ#hYhM%v;0D[J4N/s)a%lut2›\ iĨ6oFr$ EncV~Ȧ*6% GX[^p6.2=e:Dq9 vCwlomm3ꇑ.Q,mh^Y֓0玃Z ,68h#/;`H `}v=EP_2AB/B?=+*<â"'=b{ ]`6ȕaf ܺSR!>  6#_R_X"C @&DZswF83'Ҿ<pfvt1!߶MUg.CVbE_6ФOHޜ*=_$|.ė +:P+:27A#ex ܱNB6PBu5mZZ`Ă_X![ae~/s}pckM me*^K01R{sY\zI]RiSJ?kR3g 2kӭr |J*Q7qUjPN.K1߲'E%AkU6jZ"es?-%YyjcD,=IGҀum/I&N0;AMS]8,wL#.c:qXNT84VrJ@e]P0P+8嘒<9)oI{dHUGwDbT[mHe 9"OuL=I3lU'V)iQ D mGuJEΤvBI`=TGmթ14 L&Y"ɠMSIh Ϩ$RP6ZeĢzR ";0"O{ӄzk`l &n3ށ"/\ʑմ]BJVB.ܑușFTd^-nzW\Mo^[҂D[V\yVKOV8:2$zdm :I)cB.PgP4JjebVWM\Jv-1wSzh"G6芚.yRT)4+9r99n-%x;c; l c1h9ZqJ׉P5#ia}FƧ&P3؎\A<>:EjU v);*BpoU q)WU$o+p-4geÚPQWr9AyHh ʵl/f(H˨ :O{8\k1f(P!ssbkjr3X㕘7l2md/Jl3XY ̫}Dو˳t0!ZU q+[Qڜ*Bzu\ҰluWH%CȽIz{1Ҵix,DU`Ҷ/dh&>Ʋ]A}mi[c1=fLfxETcbZK\~“Z#$L$n"<_o؈2;]kj_QdSlҠ46ѐ)QE5S~R,u1x'<2l-' t5vy1ѷk*XACde;vN8>%,ϯ"~H7Cڝb{GD}pwVx4,Ή`7m+sKbo> $~w,VQ(,"=ݤFl7  ta.q]xe NAxnZm\۷LT׷o"샋vPHV)D7^_p-+px 1B7w]xm̅nvTt>GBc7H moLCXE=f.49q>.{px'z%v 5r iY}BK}{9LԄX\ ^v?:F:>-W8v߳9T95M>~&VrN ,S.oglRdc7%8α]^vX÷uUfW^E2ɤYζQy5MoևDƷ9~n*/n#1>r<&;=m~E%mj^)=gu KD42Ȓ(?avWp ~VVA]g92Q'ػCDtIm!^R)'4Q򇱵FxGΜkd& |\%VL0Vte{$8K9P\m"ZER_z e"Ic@Q G8hkVnaT% HOP0[0DrJ XU$Ea`K/H4EP E 13K)vh a\Fc[--'8Ti!,R4P `5}v155PC!OY 5J-ERY)sox; vK6S x3[_ɇDχ\kb8+9r9JԲW;1VGF4X”Hq E$!Im#T2Q\VN/ľ}Nnako#.6=n=2~qe/P?z{vFx=I$2B\rJbAA΢P.#PKi]ZNsˌh.T] R9^ɕ:}L˚%OKjQI~*K,!>"UFE,hs06gyr+ lIsw*٠%<:%"#)18h-]% );8$x$k\+,ҺloQr{Y/FYX},JBdD.q39ƴ*?3]6ޢ f->iUyV_0ʁA`l#+O1eyGBe9 Wô˵TEwZ6q0fb~w¹[x ϮQ FxPf::C&Ypw\c#U;iҸ:;9mG:B"E* U̫l,M4؜%vB EFHCefKsIm-Ԋr$FH IDATV$%WvsHJ:*e/B AfQ (v:1~8ߜ'lM /Hm !6MyJK5kMȎKXv$]g{؛%<⡭AiNa J;2#Fd W/D=A(\gƽoAj/lꀿ1\Z/ >/=sI{7՛YWDVMV?1h넶8x< ǎ]Ңhdu@'E !Ag/}v{UQdNR( ! ELkvAG[A$ +"X׾U)9EgIxtHKW)`1Sk"p~ebr8wSp6[r`WQXb:z6zn/p0ISrycÊ8>ȹ3:z4\[efF'&?5;i5=qkSJ%U(AQ&! j hβ#uQKVH,$@]Tc_ϑUI7hen*LRHQhJEɛHf|jBC# 8Xnt25aʪb!'KQDYI?`{?g_ڋ,Z"Q}*2F3ieUҺ"標DJZ%QϣS(Rf[9VկPC^BŌJSDVU*Tu+)}LɨB.m`icmTY;d剗s ̙"RAh.*uU &"GCFR-@\`#)ШhP()!4ޑRTȰbJ*eT~*. E^GY)G%`A)JIQW!-[2ԛl*+ϐ$-Y/mCMe#G٬1OSl=)J*N=(;I]w+XhS4Sj遟0j9תtnQޟ(!5%l*nmz*\#Ӽgʶ"ߺ kWCp4!OmWP긲K/>HΕAz/=yZ|3Gqz~CQc5jV0rx0hslY?xCd;ٷE'& }eA1[吙SL]I^ZH|5vz?/kɆXcQܝU3.A܎[PåbŜeJ2]/2?t6˽R 2{w־+vpI[ev;θnL'=/Yq3۝8ؒ%KKHR$vPWf93|sN{֭SyٕtJ壭uu4SUL4fZEBA^֡WHv $@TlNq;KOPNHu Bm]Izž2흜ZTqv=.h3΢ʊ{y]pY} Ao'gQ~{n. 9SE^̓9xSOrlW0(;gU|(0/I3-ZD4RڴBqaT- kvz zNǚ\ ~Sw)%W$^okFhpxGohej;.Zk9e f-pWKo>Պv搫Ufailm աs *%FKAvs+-s5m1t&8^/|iȗa-pkNbK7bc< ,íY89H^n\Cw p.-`W*ᣭң-\@뷎<|i`tJA9l1`2܊x,ꀭޖdAk:ᇅU[2K-g`nÐCqfoR?֯ ,߷3*/fbtt=+Cj |eփ!Hܙ"_$41R#gX]k 6xLlRPRFT 2>WLӭPNz@Cu?^Hc!7ӻLsf Y!>!: CpƒŜ8\zA˒fRU0U gKnW'd2 v;RfV7y>2:sN=72pd)bB<'OB|r"FvNn3=>*1Q:k-f!KO7}lkԃ׉ȳ٭o'f*xڤH_o=U 0Mj-*2tt" @^GSaUɘ0U!זE)9ViHJR1lHM eN'W" I UDdtkj4 5zHRr-I$+z:%*3("v2׬^.=r64L`[8JYmPÐ (T J" H4c5g>WQnѨR$%tU9,y0ֹX-#l56 jʄ5a ^R]SQKH4"fvΌTd1 lJ52ԍbI]aǝS0d1(QX0[PS|^*SQM*z"KY*"UmT@ClGUST (v(檀L]DYOAYb4|#}u @LQ[3"^཰;-/`[U"sNCPsW %ڝdity5D0;uRf_J=2b6x g[, >QPw&:(u5]@0Sd<%q`͖evM]΅3&=,4r&e=2| =͐:Ds<6\fKQi^.P dsF~cIbe,D,95vDuLUGY*JW( 2MI} ;Y(f.\$l^ RwH;0,O0f ͦQ# -Ur= /Y2s6 J(m(6خc7%hN$Q5,Z,%eG4'/QZxWCĮ͡>>lG)+M2qnuaQ6Щl^"C%S]rPr3nn~=\0?|;Z d;㵠'&NR_= ]%vzҫ=k1_iLd]>lDk" PiûVpX#hE!c@" YnEAMqE [7HUd'_7 dg:c;6X},w7]ƍ(PaǢJ vr!5?C-O&qxQ̅Mj~5~*9ْS0v  >u -uaX c(oɠ81XZ|\m}p#á+0w4>(ﴜ=8#A>|v[Ŏ˭~\\sc%]0:g*p-vS.Ef!| ^; B(#- }x>T`9brZLsO'[:3gAa`J@>O@oaI㲎NFYXp0c7- 1>ϒgF3tuOoG{뇙aK5~Ꝡ/[:"܍3 du2[%xӇ*ڣF&m0'e +o!_"vk :1)p}5Dr@ʾ[uv⹩kjâ2EO'"&='f\5 .6 %MYWޢ1~z0CܳBύq;)>kTϭ^#_zf-Z j#]FH l Lj!XYCCmDbhMu>̉7h1À2ѣHA]'#"D2:ETLQQ/%4 Jn4{iX60fǵwvoW^ɰIlp) _(t3kCr xjMU T9JNm7!QSDU2CyCB-sPH CPΤ0'TIbkKDE PK˒^ĜxDZ!S-Q,O"hV(z:zQbCSBZZ2rAODR,л4ERNM^QQZ% (Bz9͢@7RIĨHA`9gÔ`aS-_t1z DC w,/`L7E2{b4~{EtbmGC0(" Ot%kMyhuHH+|J~=TZ8=϶֭ۑ*4fi)'],#ֳbUR N 4eE~9ȮA>DZ9ؽS^!P$V9:$W|vO_0Mhb\|@WPD40yu=FəJMZ'QUSCJ Ǚm/н}/m2f;"M;Xb$ildX2B]fgȼz{\Hj <},DŽǯ. mw }/2CKDs*p)!tYcq>*s9 Sc(7SQ>U;wUB[h3z-h.$Qh.Xx`McH}E<>EC\Q_J5| /὿#<{{a#S光Kx>?X_MRcgy0.IzpuM=>)( YZ FmZ-Bً-V; R<'ԧB ]}4j MNOwmNϼ(b١.`ﰍY9JfPAAV#Wfy[q xg'3 P' Jk0C(M|Ȱ7Y&F_bLP(ui渽zC{*=E)3G  qLX, -p`02F7yI=*%/;OC+Nj߆[y?Gt 2`! "=jQkܠvC(95hC,d pެ? #WTQp:gv Χabey^]g=N9 1ة`[a/$Wy9<iƾ]s˛ Nd%(3Ly+',}1\Tf7a!D jN6 "R2xˑ $!B깇 A3Dnwl"3۰&0G}@D[ϓj"zfjg}]ΥRAr քO(Hq lc"*"qRo`J,+Ky&e)WC(7R,BQɋ%4Jjj :1A6#hS)h5#zoQAM/RTX"&H&R*T\uUJQCNUƨ#6P-h4Ir@^%bJ =Jid.S,>ܢՈQjx A.Wlr8UTD%0414hJvV(TJz5M\59R\KXa_fMZP4M*e}ʲD#AyA(#z XǠ7FTS2x=YD*"Tc*_NswO% tmsO[vkGa(!UJM$8k:0WP%A!Pf Cww ʆ]Xǽ3%linev?͝ď̽KE(nI7s-{&MWt-E '7qlboX9exhh6UěXxD2"jO(F+VK,P9p0Fߍ]Ek&]Di* ۈ `]䓙 [}6 5g燷0̤H$R@MABTh:LnBq2ȣ1n1(QMNJˊΰWL\rʂ.\0vMm{kWD|:L]7;XTGEvlvqfjACŨ-e~Q_uTy ؛rGf-^0$1 Bv [4 U{ҙAH,y.{9a[FcoO9MAȵrGM5W _@X )oى"LV)LmtX( \>Ҏ.QwnNmӓTyND#$jMA#^_^HzܬXqq"*C/%'=oPsJsrb,W!o$Vp~\9T:.js_OнL՝`EF [CiFsb/ǩs ԛF}G"X~qDp~SlN9_B(Yy?FBQX,#{h '/#DAɴ~g$[V|';I,g j\~;~}G}NBU)߁5zՀG-u&, 4rdYGDnY̟܄jӆ4w_4:cAw3p`W9i'w,x$'ݯr)+'|* E^vj.l$+ry]/y|tz~&W7J͐ @eD,D{3ʏuȄ?Z (#K3Qqn0#{x1!f(i{Q6z#OF_څ K3 BɂksS;7%ӟdM2|/[?40[3'Fj`7#2rQ~;KTFoUZt]Dă^eF75M"Z )JG$Mb N~MSF%ֱKN%: z$(&Y"!DBZ=V}Ȓ ̳b}ʂVK=+YDmbvWc.7Phz$RM,;GcHGr.gu)#C.S.Qk) j*5x\O V#X7YD[*d: u#l& JZYKNWkJU$A$W!IтNӨe5FɫǺg&ZRD.(+435+QB-+GjRTdč *ըfOqZD1!ɑד6"8k|\{`IRM[$ӘtNmaƢŌ͒fQuihN3*#'qN(-L5t$+h+F>*ŢC-x6CYt,:x5 )t*ĕy3ǽGb4&y$1LLgI^MיvX}nt0nbƯ~}-ryn/^@óNyXng1|\I;D:ifʞL &L%`{Z˒nV*vf>v~`e~UZ$K{Yvɔ@47J0' h{|w0Bq#'Y!2( 01GNs@j%n-6gco"mv}C;Oys^^F !Ǝ(Ps *dL2cIF#5SI֩hNy~]yd$K(xl BT]$V[u9Ye#ăRѼJc2F/aG6$ޘGS4rq.5G=,F1jt7HX44*[njYl]pwH (gC'k>I:l  qP:$5A;D r^#}묖 4pmJttil\X;~FZrJ|WXw>0}UK\UQESjv4\INC#${JBK 'Xncp|Ȗ"j~L+8+mY򥣸GQ2ǵ9,+>6e^:L⨁Au%9b\{FjKlad.m(-}OkU9]-pMMڤd컝ײ7h%w T-ҍnn)m)^(m#] r<҅.k>RJykE6|VcwE2S瑼ĆF>نƔ SFwE?ד&S5w e)Rzz)kn%b%&Gg@:]jf5"uH(.ʤ(cHDZ9=u9KfsFVa/P?BѴfD!Bwg3,\XkY'|/kmrg'}{~YޅQ9xJSNEl#ߴ᏿.< uJB.ɄLW|]b͸CD;DAE6$Р-ɫ7{PZ0d69Њsjer%QqkhXE"R =d.2*jATيW 0lmwÓ@wіSv?lu@QjZN + [3NGzuZW*L)AC4R+;Y.3WzmLcQ^X~C}G[f[=!\nlX[`vFZ7Q]/V *_jICi =3m. ܊ %ec0#¹exoxj=4a_|m![|e/x >{pn 6A8q ε^0@rk(B:J|Ǿ1߿z/GA焼P (?d6wҽH͜GId\?f1Q!l9وPSncq֎U6HWϤLadC=L%md[}?qzM ]NҬvNןۃ9{8n;@jeYRU^ԿȖ8kP&p?ٶYW (ZqY$fL (BMFv& }[T A S\cyI2JMu_)7=|FUDanSz-eCCgԎfZMQmHĭد("=MrɰYf+r,*2:jt*Mt*h'l%C6k54)_|h[*#/J8rtEmZGCWaŗ`Ltfֵthl*cfc@집-BҢ z!Z#3Pzv0(ۍOb+m1Emm+FbTA"gVx뗃+l,Y<'`BXgedc>r.2q!z^40:uSeBW+rbSE2SEUg$3JWRedgKT K3)JEhxAlVCj憚xrL!3wQQ )-6&S4F32KJTEb<Ȗ !$" 9x A4PczD%$]/(Hd5Ҥ*R50p~XMXrgccnzˋ^ǻ0{DMcwAS`d}9/Ց nH~ MX N˻P#83xqگ z5VEr-pÉ efb4f㜨j?n=f6A&~?O''6)ktY^ryJBK N4x(確i?4xtwKS۹bGpйI\2:Y#*}!ƎCo0Wҭ9|>zJ,qy&Y[Nmh*r]O OǗgNB\]Մbak [FFnйԉrGۙ@,8+|6忣1 67)ߪPr.c\3ފ$\zF4qIbFÓ2aiq2ҴmC&Ш?z#:bdFsל ?GU |n"v,ޣC :e!B3Ur]%l(Đ_c2${oHHJdx7wΐJGV<.)9f΄InqBBc^U/3Uu"hrzq efU)zgLèz֤UNKy9֞PfW"7Kd3vlgts g8)Uّ0KΡks1ٕp͉"2u"M<̑Ѿ_ /lhsSӮQzQ.0>nU:4Z|Z gru\\#e|[.ф NYs%zbE./7̤ WǪic%8صeC$+*99k4I ^`k5k#ÌF39tOաr~Uo qXlGu_zwz}zt dӝbPVCl*J?L}U*-fYSs 1޹vqc#ZUQ[Wņ qu_g)R$)bv%Vk822Q+R۰Ljqn_6?ia#I9NeOG<k%\2M:Y8Q=ÊbI#4걩)KQm k7m#8';@^O)æO7h}$^-65v B''ID{/1wg>3:b5@Ԏd4/ ŜL {Z!gaNy0xblGNoCKDblcBF%!%Е5dy,kw!=uQY&*HXxJn(JǨZv"Q K3)^:RE2paj Iwɵ 1[NIl,QY"(9)kTJKY+V̷ǥ74=LnQHiW xK3G9:1N{'ru]%*s ]:$z*#Rz?dyYѼډ&Yrb@G?R$v[)O1Ũk$?2ԋj ;wYE45l |Rf$WJ<1.ȕ90 "U*#ȟ8?~P) k@o*pu.0v"L^ǧpx`w Y!sPG&K04`)jq~E$jbYo^tW׻,x|^ų0>(x, M5"exh4{OCW-\0#ׅJuw_5pZ1Õ)9D[I77tt5BqVYn^W@Ɉ x 5P'QUW716SC%> y5y/qⷌcJ\%|r~{ y<}KZ6m*1LO\?H4'PmB-98 j\6G|zekWaiFa!pj?LB>PŏUkV3] w`Ǥe) !Y.dܧc6Po[?#y{]_~+/..k< Qy.u?9f [:ǢL0vm|/jR{{Q`;gQP. Mw|L1brQʠ?W8L&+Z^>w|u3ʟZf0K-۸cZgC7n$WѯNqe4;7޻o!g̡,-I Ey#l& IDAT값+̓36`TRrMU_, cifȕ]Hm( ZA/ eYX2قB)G6]&dwA@S(-j2yS=BoBƔ-! 9LII& J @Im%-'Ѩ -/10bPIC.!M*0HCel%:ŔXN`HO99&yr*']A%S"\5#HZjm 2RH>h# Z }NG]ĦX1eIf%PIe=(8BN:`+SVRujY3m79 9 |4^:dYIAak%2Su/^(ļC=3\ݘM1㖁aTgp\4BK&F9$ Iu|:~m +'yR;LqrPͪwlQB?Oeq / >S8EGLϡЄbcOcYtޱ $'Nc)ph~=9}SQV=U2MR@èʢTCJ?j;mHP%2ϱMS,dl 5.c|mo}U$[Rz0=Ac<%Lt~Z7#͜!G)=.މ&oDۃjZRS7@{VJHOoǏ^sd:95Uu G{QK_vx칧Qql$IQ߄jW[l$RGkqi 6m|VTk,q#|BzeU}Df}/ͯ"#M.-/w;iذYEh<#o[Dԑk1kk3vB!)~#}~3O`:8std:D-g}0$RµX 5M0r 0v*8vocht``Nnt f.XZQ5VU #ss+7=vstP#G5+q:Kb߆}Eߵ ib}~. ûv+ r,(,5;_ bD|2"tց$s}ǰK)]?\8(_}♓Ǹe?zg}}ټ/ +Eßʥ2zubQB.$*-jEF閲V-OY¨ȒCQd$I  :JeQF#* yʔ5e%%%tZB-籖KKNA.QUа.*kJDPC\B+Q*CZeZt u/IC)di-*<* 9EҖ(`.Qȫ1FdUi%F}5edEF]@P4 B֌J\Vׂ*V&u!)(z UAj QJe$EEQ)SQ3WjA\PUY)%RRIM 2*YOQق%7BI#"i ܸ?[˯PgR ҴWcU P\@`MV0qH"t}9Y%u9EM)L2nis1cG`RPV:}ȋgP͍rYQM,%WlZ&^Z-uVJv:?@ϱ=fWLZu.5058C3Sui$Tv |Pݺ5j^3ň=V9@UV0`I͙׸' -j;62vtێYchx޷лgDƞ3'{﹍ktIT2D>ǘCS!OsOQg ~f3wjrdW‹42%Z F*3!^^A'9?[aq.`2\&nJ;˨ =5X ]& [Ǵ$xzKZA&=Vc`dXt"@r=X9 F+}|+sK Dt4a.:^kB?%.~7HKu<Bl1xLH)FɅ%>IвMy7XujEĵ%~Bz [." hquxOc 7lfjJ@<@@c ,%Y2Xʡ x<TUnejoVw`g… `()N ƴ̓:9ʪa)ëϢKW+V5KKŻla*N),X1rabeI/3rKN:^MF'I1rd!$6GIc"W@uyksPEfw75ѻ`Q0zх=jElhKLM!N1ky/PcZ xd<:]BLMa<  4tQ0ћ8KW.,ֻV~ed3i.;}l{=g.s?'GP}r;o߆l' :*ZH^/? |j gU|EST;bѩ|0V9B ‹ఉ0E[s/jj Be#䅳C6[OPJ`sQN=C8Kaz5|tx&c_vz89DAs3lw޳jJסv!^67waZhB6DJy ,8NNgb3ȿ#^_}_)po_.oq%=~WOJy*Q3~{_|JoA0꽨]NYZJqf*urY"ˠ/Q58H3$!q 2&ClŽ֍*\d]O)FLrĆm-X,Md?̠X*T0?BGGz*4(ZݷrhI1*z#eB"5Wf#p='*aRl\l_CFˬY^d pAA_(fXM&Y Pl`S#Z1H毾 -uw <{;1 oa y"} !vo 1hPUдNl)0|WoׯݝBQ2W:yh5^訁 o7"ljZь B7K|0adVEٶEu_|SُCc ܘ0bޯ o~^bҠVq\4R\A\R˭$}T9، AR"jLU9BێV6Sʤ5IܲQ&QViMybŪ`HT`Ko[|5>* i䲁y%Ou-e<QMsm)Fjd1GkӵIRalYp[uM26{** i JѐA7Ik$dňTXقAΒlZ2ItE=;0I&>#\I/"a݄_p)OJѣrd0˴7ÿaV)!W)U7*bЧЛh2Ic*MbRS)sYY d .cksRnR1ԚG*Qg,VikVaik!ɇl浓ƂU ih\X&pn4ƸUQ. xQL%&'t(2*r5Zf2a-V)I| ~Vmm],G0zM=FtTk5~28_KI#|I,P2T5f9Gd{35sCNt&تЎg+H ǨoӪ̜Mo[oQӏnDª))q;PϸpuYrrM,8 | t:2(dvbWUeG=R\VOJASАpH)>cGy- ɵ3ghʮm ތd@F(CNid$ÔlZr֕(f-%jKPb [#y*e=i43N-Š UnIϢ 5y+4Ui3g t ZNuKhumۗ.Ĩ S4H+w!FZE`^Z{cBz]i0TsD2oH QoҘ-t7kbs\@hv(sG"k8)% [DU#vjh܃46?HS7хc+@/m1!MTFȗ,RH+Ya)r Gl 08%?ɩyz _ӌP?qFU\5fjS-xRutY.@‹>\@/zǖٸhbhmMeF3H`<5ut(ʁ [o |uBnvW)Ęqfv_ Q,MIl Mtf}o|pz;v`1ShR(byhK=m^=]G8:ڰS}̗-,>V&Lȹ̈́rgXi3c1Py 4PJBtZ߂a5x-9X ,,nQtAU&K=~r Z{y&X'`X"|͟|jkDPļ먆Mʤl޷,:1m5 :96(0[*t$ V=",<|6/Fbޱ 1B, ozkTZzQu IDAT u\n #f<=~87&vHU*dP(8YhxHzسV4"JG@tigO8#:FxU`j[xn_A $RFi~׊tN'Y/C@(?s.*n/_ LFصRˁQ^)B֦#)pEN-LB8=5ks¯lՋ4B~9yPî * * aO]7dFa.ګ#b|VE`6.<>qBB\Yxn큮p*lm-Ycðj;:Z/1=*,az;^A(;ۡ~kΤ@ypv ?EX[" s.BnL Q V#ΪLz;?xpX,இxhQY0Jr3੅O}.A.p:8tN>|K QNn½{a:tfљ\̈́550| &Nsy'RTXx&za0E!8vH} Mppu"a6ݫ0>#),7ak— z*,n$3puz:6BƠEt*r+d * * *C|6ѥrz +W nݯ 7y ]'>&xdL%`g;c#،pm="7i#Px7F`Mtx!įVHn+OA޾ 0:hTvƒp\  :#$,tnsƀ-m^y .`Ar6A]t.<ՙ44nZh^f ; ]{ ltpEh*6A",G`-굴_ 7;MDVu7@2@: fov+A,WPATPATPA~OS_HG`"k& T.x)*kEAvB~| 64~[T:9L"*V| <-,.BuHe|.apf%WwhIxPK DO^7oj<˂ND0~ep#L/౹`6 ʽBDp2dAYnPÓQX n7r lfBOW$nf`:M䛉G,WPATPATPAwpF2C-pOi\pg|pM,ZY'< @2{Aon/g't$U6u-,DtoP1bt 2c'{Ce;swc(&Fz޹N$Usb4{1w0XpOu'ciXU cˢY?zֶ@< wz> i;6EPIs1qq+YgOZ UT_CW3\k`P ػ^<WtNCfho1-BU3DBy#tLEe pi?=GBn$TUcPB* %X6+?s6km=נ]z`xBq> ԵBMX7UNBx :[u롲o=TʺWK }vB!%¢|>(EB?OCͣpyry-ҬEpamdoD{Z6iAjB`1\|=JpY +a4o9~qW.r Ƃ}+ !o^m5|_&=حV$|^讇8z2|cp^έ 腞-Bb{#08 f 8j'Řa(ʰ s !Z`(t"r* 3p [_4]]01sGadR( ,`ԿP /B"vSشy lo1TʚPY&*O?E NJI@2-~w H`&gN߯nQIޭB;7YpEҲ^Y}ɇGŸ8: WHuw skC~}.ƄwSWVT0(o$#}ӁM/ʋ2|'{Wӂ^2$\ SKa)S7/{e]>;N\9GZ9!$@@I6aqccmdH$Z-nu:WW:9<4k/֢zuWժ~{_e  o6Ekg^]ǯ ؽ-koCr@DY|'DpQ>Ax",xXJA < ].!k` L={ Zh_w-j5O|61EkmtX[=G5dm zWOV8t: 3#upNx%B{tIx`z{~ 8 %D~# ={,bNNh!D .: ~TWs~'C Xc5Xc5Xc RBe) 0s<({s1k9mkX? we] KB1x }y-)8 Wp_ݮ = ɸ0G˗;Ŝzf*s` W&Xc5Xc5Xc1т !N{6l=,?+̳0 +5!g P.ja6 霨 +BWEE%BOB< K/D;W+gKb_)1EԟB8Bp`L UPhۄψE80,n̈́GN];`hMDw>ucqTKh1[9W݄^pvBO][v!1ݙ@f5 C1XWAV.@|myIa~489Br#V]3Zc5Xc5Xc56>`o:cvTfZdm/<VcKkar$T3˧t[>~xqB$޳]DNBZu#k]iT/\O>y+,]`Ͽ{D Q} 5{,R &(,?ND*AkVO`~^-=ŇM"z;;ekkk|oŬ3 =B4'A&/Bg vAꞿ""p dKWDۑMeVļaK+y" x'|Q냱ؽ^\)DmkX? 4ܴ `g!XYQ^⚍] , fKoQQ1ƃJ נ"j 䯈s> ρ/C*kcai\/MD2(3ADNjTj[" 4/@QI։泥wj+8 [irj(R!" m=]^l*P')qJPRo&x`)l"g:(dzDV%QJLc,`>)ps\KxKRY0婏QyIb(%.^|7"ݧ&Q$S M,AN^C`nɳYuaf*^)\T3(ӉtXnf+U 1#a-S/j AW(LɛDblLȮ̓O'*gQ@[^Aw\8 }@g7T`9a[7bzSp$xAx߻S%Kh=a:b9{DuOC^,ga:XWDXiUl$bn*ܺ[6[bL> u l L.b޸MDHݱяÃ39qm'!GN͉; 1lY'ab{ #pVQe_~q..Z.q C8 7jz@v){/ ϊk&lwpe([`zx/4}!u|_|*ې3!V8B[n؀u{=F)^DZC>m0|dwXɮ)h8s$o˦(OQ16Xr- X99}bRTfl8IB\IMUpq%BbG2Cx.eD=N䦾k,Pb6G?I[2D/mrKg,,FJDZ:3q'H@z#mOgx~ 5^lŭَ,wSm;)\L:2.JHs2G:w2Hk7y+Z=AfcJ8۾mo0(,]ĹN",VVxhy'ZshYN{ݚKVygٗQ&5eZס/fOͳБ7ȥ0'/h.= *~̪TJ #NtG2lPKxX~y8J(S^qYUTqjt(VY]5cIn HORX]MjF/crj sf)qicǹ IDATώQ ()ҺMa6dx2 >k.냬 2( $aH )> 2ts}jnR.xݕ *A ՜P&bia³6vH EB!BtšEB(eLt#?)jmE9*Ul+ΣIeTPaБ atxDvj9jY @&+bJJG8QwuUPF4 4}-SWbD:r\ =$c4j ҁ:cUL%E,(-H¦B'N 4pT.rː&g%$$ 5(*@4ŐM8ƩhF_R826PE!h×K8ep吋n7 \v5PFbӋSS-H"Z+'rzf&/pzƣؽ ڼcaPΡU8*FvLYVn=C4I9` Ə[ .olAI=_ nQٻ%8y n!n "^i[smnxc5A7/fEӯfW 7- 1s񛷋s̈́ӗtϜd X9^G&ZAqMKW-;tSpFv`Gxa>| /2e>4û1Y2=/(*'ޝ\0/aizGDUЀx68HoJ;ax?dAѠv (uO!dP Hz) ^@wq͡- ht?DY2ZSM" xچ&K#&)CyuEUkty[˝Gn(#kȾ'KyxȸI. hhI y(xxHHy(ה4UId $y.~e%E1_ U|e\dÈi35Fgը/P3$*nP>_r$({ l k D")$ e$G%˗Bhq"i% yf {aKU:>2H͠Mo\/ ѠDYXw .5_]d9=>Ȥ^wgn&SG8@a~`y]VK<"͠w<ϴ\|c"7|}P˔ H:ޢi(v R C : \lǣ$kHz&\$#JΩE`mF!T*~3PBA5/F&J5.ᕃIٱhUH Ϯ\'иt9< zRQ~yC5:KDEqJKLn!t\gq %[ё}&lg9l>sA.=zA3\XXl7a|ns^RJő}YoIʐ?YPz\ӤdDK2HX:qK2H AZ!PN'5A1 x43>A36P5K#wLK#kUj$N]= iMQ0U*8qO(L<;Im&5,NJ2Y"c+88 2^!| Zn %Kl\!ђ2u3DWa.NUIQztU.XD`5f *F1LCI)V(VATM EE<*btweK(FՓxp^ta釡-Wkf]TQ՗T0}0&;?}0:9%\bf.fq_$JA{ CB:/g? WrV+.{0F~M]TEG s1{@Â!=3o">0;a0\\mԿVWrE["Z*tdKpby5Qiϔ u8 o4Ei, ,,B,"֤Zh ӪKlVv5+k7xYE@_gwM,_b@pxڦ;f /$C>ú3 e-Ut6Ieηpqb3m7nb`F/*eJO0G+ځ&n]a:16\bcV0Yٗ4(K8SDHfpLM0”`kGa_ I r<'VVXb5c+\vii?3.нxsKԣ wnc,]DФ6yΆ2?D,{&o5զX`aȴ;a?( % ;w%.>ouNn~tF/qlFʼnA;J|uYi6Gz3$vYܩ LR댣5ߠoXFk&)|gx︉{?LKě5$Kλ,!c R+~kka 8"fsKy,Gqy-wxcbW *Fp[et.8JnL'-ReQIqqb(jYRDK,x;x$xK(* Kߗ|Y_ّ_$ Qe%P AV|O/2*J\s"L4٢tV2{#􎪔O56}{to N˸+AJ lEkN ӌkD2FD'*"ԃ MJ5%]ѼR] _ "h\" B6 ^n &$?|C24,mO=#Fy?`d3إ2<-M"9[.jJ(1uBQLY D ԑ-"{4c{>#']=ѦMޢ0woݗObJ96Q*n`e^R Ad~ݚbmŻ,;;>ݪ'6ZH [aKL/n:xխ`J2vT&RUB*^;R?#Z O+bIf[*lB۴a ݉v38>X:ɍݻXOݳi9{qꜘ:?ՁlSQmo2OZ A7i$a\g^D=dRl\t0I /ոr"3⥽m-dlzں ؙ:W'.q%78w5a' 5Ӝ>+zߕ e7j/mq(l~`eu톗/@2*d%E|Q2 *4!FoFTébE# ܧ//Ÿ7p۝bF0z|wW,w*lͣB OZ -g`c7"_ mn-}׉98\\Z)9*41)xp~'N _XXeQeOGD|>Qx"\._†up4~+BȀXL^xkpOž F!!~[@N DDC;.A+֕]/19FB;n9y[9&k=-r5NPgE޶2a!Rlw@J~z$;0bҧ=[h&=w3><mD :Wrc1?@z<˜Mgt}7fqf.`}/91UR"~$eTSi#{as)M(mMr(ѭ6gYLҺ}ҞwdI&y4(Au}LIItJ9KZ u<5CW¼M42VBs8Ĝ&5\bũ" r7V;g QZL2b:ь9b0 y,!ɯ=Hs K2 #2HH>#x/{H. HȲk}ϷZZ'_N֌s(3'>.V^̟:oQC<` {ϑ.Tv4Ir]#hɍ(cO7~"q nN12Hkx(Ʊo1Ge꫃\?dww i&-WY,E X]zVGRz)$@a /YB ʬ&d 5XcoѤATB*s''<~KFb:׿;q YQj{1Cԍj /^"PhK-“MlV.cGOC@v!^w 4s/!ŝXn$7( _U,{pla3$0ɤLh஼bFl6C O[GL^/}8|'8n3p^Hn$㏳0OZdwvv8¤7B}2gO(}Q3Ox{<ʳa$ֻez^(D<Z$h x6$zG-f!I3e\[dlC> IV45 hDSB($Zm5.$hhH-ؼ@$J eJG$JhR>l[)K4@~˥)cFM2Cf#ќQ8Uщ,+uhN}q"I 3Bz0;.~&GS٨"X{~$ۅE7G/kFTޒM.IzZŬMC aWHv;''X;y:+G)~"C fmɞ?{ROoJChu 8+ΎgY_+e? yMZѤ5h-mUty`YWXF#:lGi2WxfL$զ(4IY1v5kЖӚEgؤG0Q(d$B(rמQfaA ]*9Pgo'HEƌl-Cl썰]'[NjEL8\`oeƗ=c[;B(nf?GIVZ?t 7w:IzuuW9!:>}Faa޲qҸi1 jBʹVcFM& _yL*,5"dS,扚aJ ŌH2^m ?`F6iWn`&y3I>DȵEOO! B1GXUclͶ@LF-N]bnPێ#j&CFڬa}5D˥<\m1(/Ąդ،U>1Hs|a>s%F ͊1Xs0+Y,z;ψ6Όb0ET:M֩kxk-201E )(MЪGRT줳AoR}Yqf&#m{59 LΟgn߸Sߘ[W`{uJiwSbOx~wQY+MN|}ͺȄCrHT(\lh#>c%^ݬP#}{R;xp{5gZuHUt4\>.?Azo?|6|P&e ;??RpP]?aXa۸>טKTCpf2st> g vy[=)nYMAmC1Nq' ;?> "8+y`V^ݰm r X-Xo Lnyp?`u }]J  Mm2`jc&M ,W߄y&l$0?*c6|T~A808v?y>z_|t6`to{ ޷3s~5-` 6=Cޏ~ ~?o|<no !`*XmNF76g~%9lao] bN@ $|xpz\%`-;m(S}p]V/`W3F88Co8dA=hۇx~]Kwnekf3BE_デ|m;#ŷr1>_|_m?umvRc*3zǺyNK"[229!+(>efEc"ec:⛼|u~ܵfNzoܿ{"JrJbJe2+},-mG0oN[=5JK84<eh&A7k}'I=XZrיsϻߵvN-ǯɍ]1wk!0z8c# |1[ X#[ɷtlgg q*[nw8ٍ_`wQKd#ԏxq+M[E_]è."Cë컟n@C+cP]eA4+ KDAzb.zep[S2!\`~sDF߁gST5Co2d]?Ne}; z7X;OkS`@0ڟAԾ۹y3o{ ~:LdgK*N 42k<6N|߱^w5mI<' .Mo 1ĴI"]s/,њ|]] @$@ـT]!vRA/0:0%:JL!qhJHؔVSȯ&BA?)tHeMeZ8 C7ePJ | :kOzBEC <fєg!!1DH] J(Bх"jTj$&]j>L4oDOޞhb4?rc{\||#竜Y:m]̑4K7";=8NXbWΏr]xUe>ߙ;z;92ܙ;LՀ^x"R4X6I+#gfWg\)aS[$ɇ%^s|>"KDwK'X=¶D5=;8_q.R:c8w 7j爖~BbYQ|MLᎋJx=XqGȋ +;vr];{y;yyƙ:P) +Cí7՚,mOz/M֌`t[Y{ޕ*kGI}'JM>k~>z~-$^e4 qcNB$VMQs DdH]"N+12H/A"0>ZZ#ښCqvH"k?L4KBMVU6*Qf^i $6v y4vΣ^DEuPZDµ Bph*?B+*襆Xmzd0etf'YZ7-X U@C# lh%zSڤ` =4"kZ1 hfӊ{X<Ȏ\BX!.G9u|hnӟ*g4.L[M~򧯸|mAlfA: ^sq[FC>{YJ@Ayn5@mfHG]#H8Ő@b &fO!>X4[@ȠVWsASf &9^Cϲhc ] p јZ?$ڒ,7~ Gٌ;tV,-8oi+ٟӂ+dWp uxVԻ_G}w֎@b nVl &FlÛ߅頗C4 3QP6Lo+7b>(sl~ ~Av?5{^h.sud5w{7&)f,מ ׭}Pn;#yJ0xk 3~ wga<^sG30s|XpvvB$8׾DПM ^#}`^ojgg+?P5_~28?ܵÁ*&)W )~4@ jt|`& J]zSop ^07bymcIfe:-ŭLU 8kpɀd^Tfis"Trj1yRsoڇo,;]cy ;=FB:E.O1ĉųj?to@Ѥ~ a&wt⥞ dڜ_L;CebMseŵzN_ EKpecWbߝ[&6y.ԆpϷ {<G ՘ s ڱ/bslEˬNAk_v~=&;[~@g_rx3Nw~6O< nbZ8q1{~nsgJZkԣ+ )-1ξ+\i8gxiotмuURnT$}tSTgt-M':ג3!T6yȐ:C{Jպci kRj*hZCgc9v$+sD Yzg!|s2L:X<ߠ͝W~ԛuP/c`X__51d7Tk*AT(G09q<)ZKCqǯ"(u7p .=^SY,ňG}& xk7qXGZwqQR"q$(MАX!4.'D)B(×@6BG7:BxJ W𔋦+<J!AKD(kWBIRSA@#D@)P$ <|?`KuMzHe 4O2. L*|% @xI&mEHD hGG* 1] h&B+T7 /xwI"Eטj초!&LJ÷T)ۘ A!%~vUܕmQ4m;R]vmӘe+'cfΐYj& in'ugIV)l%VHP*ٕ+e>Belf4~NlɝwaU!yȎMEhӝȝLǦ3`I2kxk3+{0F0/܄1daU'ٌPjFF5ٚ䭡(kwsm"V=C݌Ƙ;(M2kŅ:M?B6$ЉFx8]gK6͢4mr'Ҥ-c{z4OM #4vJN2ߏgQJPHY&,Ir$D'P&Nl>ɚ\GjQz f%1b9DݪMϓf=Ic`t5>.$PjȶMP5Vh29Ze kۭ'k)"!,v,E'}\=)acz%l\8CP5HlT[E-!*#dz`nҽRKQn(Io@4lR樂_.AuD!/cb"Y=4>%+)}ßs!8p`Orh}=^GU: C0"lmm Zc,jvf ?֠{E6ŭ(j?\k6uvw=+i|1֖X齫AhTL|TҜ9*M0< P L[g^vݡoRq|qF[#7ܽ@@'s#)mn/oJICrGQtcͦqnwԯu(zOFZwΖΕ|B0;>h.`q 6A?v.1 mP% <; L49NBM?! N]!`'$lXaA 3ۄ3۰u*[2ՠ@ b~9#pf^<x.o@O^xv|(jtU0l>6<~ bYו4g>Y3OӗY\= O/Y/;t_ mSv$! \r VKDGH,@Oܻo%WV'0 "^L`Y}$Phf9eN;ܥV/w?yh߯-TCnћڂV9,I9odI606$'ʼ_ͤV!Z!4ȸ\4T96,mK䄋)#W)&ϰA=)~nl_ d^eB([3iקH$k]BfF+옺J[1.2?^/v9q͈5%Z`J_HXPNә92HP.Yxi),̽kzY8QnxԴ2Bq-jpZkBX TenhD8MB6~$D+8N"!|JVWP_ NF‹Oay)*sD;Îw|M{i uR4"'71MAĞ$0 %~<wȯ%~t4A{:NDlo#0a~+#lGW B}?T ÍPL> IDATE">1çj0Bh'@vH߼^ !6lizE˟lЩb&MVMu>z&%;۬qrCb CыSud] V1w25Ц:HB!4&( P@SRu[MDE\ 4a hA MX@!KuAh@JyPA?3>P.R@]BhZP_g"<4^@jhhh G"2BD: |)P|]hR a p@.% 'nfBh>B J(B z8>>y,03W|VXbh =4ݏR5L'CSRi.4Yo jr_Wa(WYu"9;4;Ͷ7zu.zFi&ҐE5Ʌ{S2Ak\BڌT%J_c{p56[>|sl4x*kc9*,qc``Ysx)r XD!,4^♱*KcQ]`.iŋ{u\I6oi̷׎qa"׎9mPƞϞzl!w*Eϋ^t%fEb53M:&;Wٲv:}%6^\'Z8Jq}co#Y"͡]a"Y'1Ǝ/ 0ugҌ[tϓ^zךOw FpjOJY^3-2&FMD].qD#= 8gVq=^:|qE4\-Q C&l1!fD٩HLHV~IÐ5d婘]0/9@ؒ9٥E!)yKd3N-Xmw(ӄ7Y@.$Qm(S7*8M&鰑X8biUOUn, -!:0ԧp0~BG?Jg&| _zï_e1D&>Ӣv7϶pǞ/!C0[  HXFS%6FܰѲڐ}2e"?3U%][e-eqx 0Ɣ#un\:LE٨[dwFV95BQ`vv]);~/YDʂj2C'J܊xQ1T4kn: DȖ\^f_cL3P`s GQx,u{A5Ǩl+VP;VnQڱ0p`x)N2I. ଇ Gp=0-WRiOpm:kUf@'D -T#Jȍ5'ܺ̚tb$Y*gSlD]L !dR"ﱮ聴LH2E ) +vf$qQhxR \Jz4Dt,Bx` %50FD;h+ic1B^ؤNjO, ȼ?:& u/WѹڥKzJ'Zw=C&li D6=v~zu-3Q/spr +zޜr/Q5X>;W炈yLz&6~+WIsge}1O"=_\`uÑ>8pamwb0T;?ws}˳F2}VWxiHJz{[7 ZLVyrdgi +/W4MR&uoY[N&in'{u2ce{gfj;7?wnk.pzj7ε/dm00˃@xp?fw'n?K}5,Mc7uJ-f1A'oy<:.{cGg|'f2( =WSͼ@ o1VX篪7Q6ޥux19: ]M+͓6%'pht1LbfLPy00,['QQjCÍE'_ʽk͝[1₺%:^[ <֋<<3rvhųYe#-d[k6h:q7m24oI+c5+T(ޤ\0*6F*Nf3vDL /.HѵqLC%rp4q("RNYz~8 \ A %~̎j n,zӣ7dZ@:*=iܵe*L,oiu޺2Jt6ZfFuHcYIjkvEݤ-ۘ2\wR%Ӥe,3%\Nh$m)e QA/P=|Kdu(OsV:' SeP$!」;Ͻ/VF$ "%QlѶ1x1?zKͭ~ǻgO}n:m!K Qx4e\ۄAD"$;±o|j)t.0v sux0nܼv(=<nyn%8pGO,C~o7L{/֡4uZ$qSFٹ$M6nȺ!hk 4&P B IKʝfOb-FkX`0'#/$ٷ-68Ub_l:áp+H~%IzcMV-dxH\Y<'gH.rV۬q.v>b9xssruܸ*:JmY[Gш㙒h Hji t%A$it@1[XO2 *:V&fZ#c'qCrCY+h5|]IhLۦ-ElĖB‹S?Jh"U_Mn h2^0Y@䈾$Ftn"dXJ'$Z7ЍLIhuv5jHç5%iԝfgIDmVdzFX;yw@Oh$A-%Zv%֝/FHӨ lJP 5D`%iz4e*lcξ[%.}mNbl]1d*Iݦjh:17bLh fxuLuJa?mu{6xW*hE}>NUr6I>Ȋf'Y=?}Lmr(ۍڐ,qZ<EB]~=ϱ/Rq #K;=8O0["H\frlHqo2 :;{8yZe;|\{E0Jn,CJFt#C:VYjtFrDKvâ`D.;5VNrV7}5ʈr IDATff{ipv1F gwQuPkE(tkYnX+8{K)A 7hKEܐ"Dm%mljQ$ hh-D =i #qf{AD[rХA@Aј7*5eKiΥ#Am`Wn~:F`yXGChBDZHkp=n RMlWY-_`B5LQhUq#eVM[S44g[&Iu-cďHnRJ*Z.k(|!'*l}zK_BkP^xV No5eRl{vC4zs {;c.(\_  ~d$_M=I' ^T>?;df/OcB:/| # _Pte ӷ8:?ZjKT mN= 0_|n "V'v`}}wB {MOw([i8t=zu߻d?4 셯s H'þ|r?o; a0LvBi Z7d4Wf$V+$SUFǒб w\fqrNng|96Z/#p:cB᩾)zVS9ש=\&867-a>۳g˯qP&+l fJ6wB&d$cea63Xiexv2ɻ=]l2qku{>05nS8v!lcd7<:ȣlyj֬IJV&*`f9;I}oӟ}Ypz%Ǿm*>ijYЗ1y', h">MwDº,|u:3H!'^N<:ҳڢ&w?xۜN8GRZr㔑FM;Ԭ,)JET}D@dSP,`5PeT|4Mdh(#Cx@=0۠S$-|: BPD;mUхR>m6WB\IDBᅲdCvAxӾEAFhHE(W\I(:~eb=3Ѫ -AiVkR#o *gbiXQd4*1JQL]3h=}˜!I|"wݏ8 ۥ&W}̲oˆa{ȼv/[?{]G24[ ֶHiQ|Aر ;w/#xAɌ÷{hbEo~旿l2^ rq3mb. 4cHjqĿB&?Nbܣs4^\s"К-Mwƹ7]T6?*5%ID 3Q >FfGJd0Mr0j *2΅(fc`l{# 21N$SǖiK?KyvJ N5,@@:Ngcڶb.ڪnpmQ$ w:A &RxAko+ ]t:x>f\'G$p\OUCX D. #E*AL">#HaЅ&4t$ضNj%A(wڭ h"dh4Ǣ64@WJyhB!\i @3vƐ;a?0E BBǰ{{#Po>[ç@[^hCaB:Be~0ex}pez3M!zj,3,8oVCt>8?2&]Ӱw$t܀`f`f'hGMpNoa" zߺ+<͵ |B[`=^Z= ; |{nn=ϦT0O`dekǪ-qh5j&;I{s('*1&x=05zu3ʙjsCqR5漳jz0vg' yJfJ?25MCbiM*zTF0]S"}(]DψNwT@T[:)@u޽$+K(|78 FNō ӭV*(4lrk-]ze8 Է4$˙=dq`&;ص~CU~gMUz w#y M$Vwqw2Sqlw?8bbԧ0 NA[v[ϝ{*!6E6^wS pxynt,,լ?ត|#?9m]X6ɽq?rPam Po1![hWO:f % tNoKcDTԲ-#!K,j'*BMTREV x{ й[PA-H[E~7Y_)D@PR-AMyB~JJLZ`APJ.E;(Dɐu'N DԿ]T?B f[H4P)*ݺԕKt?3mU%^{I;m3H+NKbvb~wN.fQA 4ݿxn)fUE`뷈Y1:-o~BTx8:Y"ބ!Oq HகhMN<P2єN.m52N9 WVtZ$ЫowEplWlU5z3OoQ?JJ.m6p(23\{bY*LjقĨ w;[X<|պþ%*Qawlcr+g%=%ѱTg*Ry.guY` -r߉^˥ Mz.Yt^>sψug.EZ{Xÿgœ)H6HotHUS0[1L}uܽts+n#UTO,2d)O(Sk 5sS,d6A opg39/ Osݢi?ĝ+L٤[l?) fq9Q7<&gMAis1y(d(h܋8C9p \xjNNToRb33E`7v[s-eYF]`*L;qUi2Wg5ꞠN3̱,7(9HH D34WZ74݃:.j= tҡG,Nj-JX#bGr$&.r1`SF%jyۜ2J9еAd66:Wi03S8na 2NJ|3S<p{Pk_,|[g8W0;y:?G/}?u}/|xm_yOtzٹų5gf eŁR W)-_FMSw<)^a'+\('$bs<6xaf}_#{ 땏sysϠ.%Cwέ/|~g ϼd3ܓv]*>k Zuq*+PuXz_P(A2?^X܁ _|2 wކ pe !ٰo>F/}LK' P]s+óS𗟇_ofp]Q𱏆a琈PlXB` 3aXsSx.d"Ѕg-xρЍ n= ?mv{7|'d.J8w-af†\X? {r }f`z?dƯkӡ B6?q'd3pW\ ; a1H QRE0oL,,D\D3:Bb6hR`||Zk13GJFD\z5|$^%"c]$r @^&GXݷcxœ\I {!y^ejcQ: TucR"RcN۠O14A-_kJ"B4Ý}iMV:;\ً3^jOG$\R'q21S;\jxʥhnj~r#sWX+:Qv&Q;yN IDAT:{l8“,؂5#ϒ݇6r ߥTLU:ce&n/.; U:W-Qz^%j#&Mpϒr},ϟB;q췾m#1-8W]%gTDHĮklgxYoŋy𹓞WawM|?uu^NV 0GGU?EGۙ$x6uR \|C#jԴ:ҕ uiɀoz|cXq9AhI ܔD8Px :nPWEPDV SEڽv](téY؁1| :͠^X4Zh@5 z D#Z%"hN(?׺8P#&"T4[lOhzhyHݓX-6NDWhT"MtW$8Nal,̅YH7}4$I7N_EzQPQNjG$ѨgE4# o3!b#2Qq(漋Kcd@ix24 o|m?_MZqW_¶N::kayn(p ;;R뇾[s$Ԙ#4+v=d8J G9}3ʇUWctoc4Jg6yՁ?~Bc=@t_;Ikj^\.`ȝX27/ScvP:RP]Ļ<͕Ib]\#zG8_$;VCGc L{/"Ffpڈqo2sǎ2Ļpwy9ɥ$5&[ (5T M7±\zS†d7_,u q.@L_]ealH%f@G&@q''8'I&Kz,6T -FcU1H|>BÎdttDAt5]13\QFmPD'N9O's\9Tw~>/gUZ~l]ӈ) }î9,H:ꈃ=&,IIh9u[../{N\$I8mЖQ FU (%Su #SidH["UDJ(cvm I^L&ȄĢ y4U4ˠpEW?^j;H4p {&|,;o.*:XhM>J-pd~LT`cn=4w.-źܛ~^yVwé7$;[vBzyvMa(YٞU3eɸ߁m-CJe1~KLt9ΝU1Q* 矏>8|HG |:6iIl,c59 Ϝv9}/(= l[vW>v˯F \.X8KB'ҿ}=Akiֲ -dzlZћoH(n8%|o!EQW!zuvo#g'QCJY`%웡PxC;L{WpVd0͢mP+-31G xl TȔ-yh߱­-*rn7EЬ=,;KHUJ7-CK'1cll@f}J]w# / e:37:{nى)4SH$j7ǦsE/yb𚇴4kn! 1Aq2bu#D{W"gO/bh>^b{aF!d8vN] Ǒ3x)n9/CiGlp}rz7q f7z˘D 70ܿލTR +(D*\rk)$YzHH"Km:_E- @%\@4E!C _`{%NzܠMdD= 4Yd ߊӞ RbX!e$ acyI,BIF|(%|]CK/!}$%$p%ld!H)'D@ xB"GxhHtM]֩ a"TQDHƑ;!{ 2c"ayM]UjCV ظ ވХ?va02:Hc3EQ_z u-@mX~gQ?(Bzx_ P~Yci~ 0̀±#7?CͿťC[{ `@#8>Hw3>E3v . tu8jEJ̤fH`E}ǟ qo=q6{Vw̽`dm,;B2+ YKӐ;t3~@me~*@=|QQEYz'h 2#À @ 04RCǩFz8yfM/8SUP1[̟jצ0E.qJT;]4/Np Ba$VMy6l@WLez8i(cPx K}7ȁx?M>qȥ-33')Ϳُ"bLSڣ}Waj 9V 9'`a`7lÉiHеʚx; : Ā;=Ow=ұV"|1%{(un;z;̭ApQK=Oym&^Gb/ {u{ԊQbqJt3r6R;~*m[9s30Qau3Ev+D8Ujy0E95ʲKrj+^, Ktop_z+oʍ!Zu!v ;2Bͥ7y1WFٕgkS F\~o9O>Fٵѫ*搼r]jo[9D*iyvW- q~7 _i=215Ì\ZYGWG(QSI.QF_1 J+R%szJr3\Q'DERQRFu`|Du2a@x=СB5ɢ0v`1be3Ic4ױI1{"Qr{5"-#dlS|85L"VeD0n'@]uj=4I>by:Rs; nW/b=#:_%$: 7ASxE6PoC>n+reg?M?I:3%:ѿko0&B)]%;|;W0%% 65u;(8DЉId5 PZ =)D}TCvCy%E'A F59)n"-XO sـLR--~@E2B4 3HG(בD c T(MDBR4^29hIRFCBt怌RQ ' H(UI 1<BMBqע:X2x~ ?Z!D+kzMen3e/B@1d2[`4* n ӍwtAXUQ,eC{<3erH PH\D _132?Kz\ޘ%O$udSt#?$.Bj ˏaRk)yK=1?rFǚM_eɸB(`j\iiM+mWi4rp80.K\w1g<{.tGpJ\W8Z ]ù#9@^Ҵjx7TB:TGcu=87~0ţwVG\w(ž5&|EDN6-7uh/=>8Yv1 ld03l-xF]1ٲ6hk;ɨ.)cΎ zl9qg_S]砹u<9O".Olf`Y=VқS. &Kd[t.s.O5p-Q7"ؙ›7τojcazam_оbSO1)tILh}5^̰C6To0 ;m%`n(1)_IP9;n3xЗP^eT gA\$d#w='"0tf= 26g!MH7/"^]R ȗPJ[=:y,=h2rDŽ //z.PO$r:F1߲5"ŕWR/b \[wLG15Q|w͊^Tς08gwW|3 3304Їb-nغG{_8I8k0?RaM8 i ;!/,IX]Ǯݲ 5ܯGoAep(dgSI-p6S㘞mFM%873#$r%`:?x710v9Qjض jmzqօSK7g?D%IсtHqv~/<9p&v3Zo^5כ4L8؍s5}?ǿX 3C"dDI r!aQSQ "RFKB('~myvv7 * REvCEDXHT ]},+Ŝ]fcr@:һLJUe X爆dvWR}]jOHHe:Ve3F“9I4 hO&C1wk\z'T6b|dm[HcWL[o=ǟd[Xg-pg?%1ւ0zf;lϽfIܙĩH3]5E3ױ aSz2 Za`Z+㍴YdTgkPc-w,7^}h,+ |P%}MYobKEzrsє#RYFDt Z6@ qiNF&5U E;Kf(!QʏžOs֑RxnD>Y -EjG({hB$jۨ $m'5FPdHXou ]Ϯ%(Ade*m UEg?Cf⦷P4S1HyIwMؕv><Ȳx/=0+{q? "gY"@?!} U$4~߾Bw ,%3GwQ:/j9=x wjS'R4$7$(*xf#lECq"Oq#zt@;K[ | KW$v"|9D5J u`;*A؋,!8؎p$FROmxo!oE#TSK.W+,'fc=>3\@CjH4Dd$ V>ϱ@lP\z0'Ց]u#6|Ho0lмt[maQ,/3ﮡy)rNVВ-lZ 2yj$3^3w`uۧ$VL;bXQyQq+;BAN-_Bd,Qccːߡ0kgeMQ[4;]n /U:QWP4ۙH߄YqnNDoɤKəEqK쐙Ƞq@}Ff0xZ$~a~*̊<ۦz$BxÈ $Z9"\HF`IeMLNi#-nŖAPS?UnH] NP7cs7:m|mvC"906W>0߾#W(fB!<;N,Nڃiwt`\Fhz߱yL!ꮋ!B0$ γE'pEDHcnPVqޤ<=h&C~S-Z8A#U$S9} lq*5U;ڔeax8 H\@dh?\!T#4)HD"37$BA b# `9:0 V}Hew|.@}n)xt>k+? Q8X Znm>u Co? aXL~!ǚ`/5ML@ynL xf tV !*ŸOsuၯ@4< 2)~o|b;==?wNoÁ߂Xkawmi`~!?^ 3;ӾS}Z\^ 3? _}5v> ?x:x\$=L&Ӏ'`a,|񜿜:˹}\k2dOhWhEg(#V7pH> cWJTs7y?IYf*T_@IO0_$[ŸJ2AR wM-CnYA )4 ;OxQLDA]j/]J]APD%Oagw W&f% e|;EҘW$K}vIֽu2V)GiΊ:~"%`"X)Ե,G#<2Gu"mx}E}'aKgb;ԉ3KDfd,A*=%l1W| RuOͳuM91nMf[HMI  WwQq2kbkk]GM\% !Ja®I?!R mSLf&T?Q׋t{UCc0ӓs)#FB#M/GuUdjP ןGCqx?jkMV$ۣtZ>vq/]iN}2:JTjTw>.1FLlA BRa\?+wqfȍP#CDћB ID$Dr+=:PnQ ]:*B p)qpM+5>^}U"ԃxJYsqOUXS]@'$"9BlPTR>xSӤ#p.qp;nyxy$_O2Ǔl%BǠc(]h""q BEUB|'#˄DE%0Qb=DGH F,BBVYqB"5$/1k >}3J̣B'ܶetVQ Aa>Ɏp-, yNLen^h:?KPIEF[>-ha먝.il@fxmA:y V_Qr>پGFS03SQ3?I=Jx8]Ar(Ic3 w=2KP"2B2T0wO^YòWuC8Cd~ft=U}=irek"DϞ@E/} }O>z7P7mB M"> '_LƑ8BTՈ+34_ӫ #i*O!$+Nњ.{L'HkjxL쬢r$Iщs4 e@ f="*Sc(0Zhe@r;fcY6ZARqQz!v˸ gM\#'J5\@0V!Tw%JIx̼t{$E6ax*)r*y9KKGb2=DKA wB&!Sk}Tt`"JEI| >Q(Z@r[eڡJ0ͱkp Q'uJRes)h$!@\6XO 4zJ0^fPQk@;",g7 D$ahQ6T"l<-?C 96[u2BEX^xq'YȆNBhH8x$BH"F>"'Jl-@2X'!@^ ,+ lW iI4>KarhlSH@5#;*{צ)j\F d@ ug5hh{VO!"|) B"!< T#"A\D-Z`Eod@%-\iJeef_=TD7Dml7l!]:7d2:׳ c%̳.ٱ#"*= fzxiN/ٵJvz"R |/E2A'IDzDVR=#dA'PH<%GPV;~$PS $T#"(zUxHP(]dbY2WW $V-j8^ =T?>#*"%)'[w ֮cr.a@WFJq}q*\y:11|zgXE?u&{-}Cq2 vl)eH # T1H$og_LdeEr*g0z'B2QAx dѥ\*Гd d-Eq0@E%T%'HlXD^]GqC2QӓڱDG.K/a +UBU:d0(6--U?GtIҿ`o.>KʷKo(IhH+^ ;i+;MsH$m :D;y!{1LH^GR4:5"BBiReA*2Rɐ]OQgIXL'iri2w|dC V7OcI4ϑ8-<廄^hIi4ȫ2ަ_ e}Oktj^Ʌ|1#j_=AK8NYV\hrda`eiCjʐ(LRk6mK},K#aGa3[!=!f*YL3dE)Jd#}a{XqDemtÈB;A2- ā$OH7֘[s'}n/l=zIvu\*$p4ɨt ;qka`3x6# Oi- F3/ 0+Mص)IV. 5 s#|a_92i(?MLEuBgwp".z 2tH>KC>J_ {qҐ)dO>%Rt_A\42CAӛƪLcK(;@jſv 8PE0ڣv!A)8&)c-Bt"_-.A<"e@[ {y68Si2?':dO>j-'ʼn,=XBއ unlm27_oy/74[~KK8oGRy!J ɇaf:_e?P^ `KG`t6%pt|J_鍊6Lai,͋-8 pq|Lv<E*\ڳ A6 h+λoe/m@O{+zznI_}0O_M8:/~ ~mKco p`zWM?PoXpvH|:[+wvIm Oܰgv]ze]]oV!XNOZ !7@T,<*P`%U@*qj5q[9FBvbEUw Yma[=Q<1s/ЛY| W!gzv+ews# F#dk,/h d|;RH&Y;-[eXaav5bjiGu4[VQȱv4 <*$Ƶ;O]F1V2OazvcH](&*.?G-{nϑd۠G/qzuݳ|?;@H$;Dw;?Bݼxú>J'V.4ili0иivlL`GJo⦩,@%+0Ll1Ŵma5C;Ff(ʦIϐY~E~G_ ~XZei 27c]W')0чq/|!>I ~vǾƠL9W2GokH5xCQ8#7S"!ClvBˑXǖ"vw֪ Bgo-]^t@ElQÈul3o7H]R!~V:j~ս51`LDŽ72J{vtW(ܾĠqdZoA62ט̍39u3#JGt;ULWġIk}R٣,2-2VdbQdYX\ ȑB3k-M6;BJvLd=B{U'j07&hv 1mD"s&9s1*4Vh QnaN cTqan sF &x{gcOOݯ78uSlv׉ aeqa9"0ZVB3[Q%\*d%9S&1Vn7< ӗP8X IDAT,fnp{Ӑ`F1@t]b Fb"]zmG< ~ dEeEB9B}L_|̚R"ȯN"$_!,@fX`E*kY$oji"=Aeh%Ph=M;{d^_G?(a/ ;&\ mh^T(;@bX8? cFLV.ԝ`b.?NjOj[0:n*ֆxi9e04`aνo-x"ux9߸GarN_r'x!<B2BOAtF^&Ou5h_wj Mc" ?^XD 4P0.\Yc pZu||qfJiؾT,03FYko/py ~뽩PO_ u/]X9} t *)c|k Y8}iuOuq޷(<}-ݺ dnLBb 4|< zij8tf'8+bV ü, ZyؗnK lgŜXO\/1>Xnv"absCÀ1 ݱ#wy쥊9A0 (o`uݷ:Udʼn,|٫a[4ϴ|v!cAn<*Qg~=K2 M|ρ_?ŵvkO=cL:YDBd1l;.`mլD&=iXJIБC_Ɯn-uγY}d&bݧ)[h}"^Hgу&&sz!ּێ!tiΐ  A,`\ G!]2@;-{@nЧ*$ְO#X C1iEfk2Wн!iK}PװzbPZ7sc+}Jφ̐q5:1tpUvoHJ\$6ڰO64bZX߉pK&CQ}R.hYÊHcnMPk+SWDRcʐa4#fW dJ >fg`D!0$r-CUg/"~k߳*}o i.ZEd ? ]?K0C|!Ŝ2%^HU bC\KL5DHQ$1#,CaEd&qBB:A |;P:&\$! 8pm WYi* ibHvl(J{_??ML~ H0/v H}jW@Є gupG;ߥ]e.img`_xU?!]J!"u~~W*"05?|d~oOgAS ´1#(H0 ciI*=t042Ȩl;&6MDBt?,]! l#&4 D] [ ʦM&h%Ѿdj5 FLB㱗o#E%" W6xdqiiIC)J.H\^z4pm yCPcP,cbYrV e&f X"}9~\jU#̼eQ8/=}q)|YdH+i ú~N{3ul {L av0cѸ&}8Kyw..<}@tdPjz ) 9&&84EG D0B>AiHw8J .- |Nf V5iJEgapYmbo9vofF79%dq&;ugQ\pdN_2t6 eFW)gga1>$bqeojj{vunnYv ϜޢLT(Ck+n3VKu })C>rPً+hXU!u$!dygH&^F 9#O38L}%/%m[a;_MzY툲DrB_w h؝E}+:2(^wIJϒ[ϞK(Z- 4|!qp[O]b=s wA.1nE n* I4l%lIsA*]/,m>I@@$8FZ nk9{࡯Gd''؎@ ݀ i^y~+گ8rv=2 XIe@d<@ 'P%L7F &^+,Dl}@rr$P8CE$ P&R`i_9Zc SK5i*ča<Ü :< %Up`;0 Z|'` |>uoT'^K0Z)>˩ؽ tT([ϧ.n_piNN(C:s/" K? zEs0qgav gJW|woIAǞoW?~4%|a?5xk/=lz= X{Pۆ߼CS~GN  S3dx3'@Le=/>Zepܳ8 eFTr9d#C[4'Hx%>(/,1p1s_Lk0{ɾ4PrC˩-6-3~\n\flv](rn&dT9Xsi[r?4ow 1!=} ]LK k:Aacac>4IhHLˣ'xAg2(CIؖG"]t #2ƖDQ{h"l!!Ąv ax8l$[4Ec7\?@l :D$n#ޣn!@tk; 11`YyqҸ>lwi&|0tdMvn7I$q"MZh^#]3A,V2M7`XDr"A*m(!5e=Da)M ":>B>9 &6Q IҕKrHرhЇ"1Dt]FE6n7""k#J&C13A| V_ hme{-S\bz1௿"@  ZКd;wiUm!%_oujkKWD`o(~۽$vH(u G _hG>˓8LVA?}$20c@`(Z#&Z$ Z( RF""NP60,k !`(AoD8:0 %V'.nZ>icENB3BEYDK9:q7#[9_* 4~O2{*7ޏ̵P'$ӥ18n\&W/G."ܦnȷg}-d} "SI\\Svd^@gS+W6H~hx' ]N/segfoI9x!}X1Ge7d%ʁk$yг}dN$reFH*LtD}}O~FX-cF dbvL^b}5#J8vWxÚϖ,qwW#кHy4F&4>xӸ+ZGLUI8ʸ)]tՀKN0rcdskUmQFZC̳}J_)Sf ۸mpГc͹l팳lfLSv.vxIl9=_6Y\rAGL gyHc\u7xU0nxqqT@[7eY.pUYb"g8F/qT6Γ6YXwq j3EJݠqIRkP %$ԏl sobB ,!+p L- A?d;xFG-,Os*vhƊ0)cXi*`;m0GFa#XwBNo"(f*Df>k`8ԫm.|!*:Cmdؗ)02{e(7^6ؽe}EՉ& XCp}M$xd투ab LL$L+A!$>  aa_T}f-*qB4E5r" Tb+Ib(`4D6inQ&=ң,[g:{i{o-+ߔd׶/@T{~óSrW`xpziH|gR2,< -O{g9;O}Lذ í/Qث¡é?,5,9g@?siy|^~? \wl*WvMWKpl&͍nqEG ~k1-~] &O>.|Vq||_p#(N&ͿPoXMA 0 e~v&fnյs~2 enFL=vgZ<È xgQdΏsdCz%U cCQ&W^p24Xw}Ǐ%7ɖh'w|ޖ]cݎWVm1N=s R_"r8x2$.I&,SkDp X}lr∮0N7<6GvscĭmkJ/ܵ8g8pܔ{ɡL9ֻW^Ce(,̀jSc1)[M\򝼢aӢq%7xU˴\`?Dulgvc x?qp5׉Ib)LF "2ixEB 42;5ZXIY 0#20Xeh P! #hI3I2u8" ]EWl D(!AXq1v}(袄&' x`o9\fGqg )Z&n$Fʔ#O0lё f hp@vp!ĩ(6 )(#,$ !q,m#Bca4A e(D4\I4L,l1R٘FP ܗXz~p;(B $~%}VBY 2ihBU2*Gd024Dn0"Fa:$:A+'4Ab IXG>%W<>!OzZH>hpel怟@w3qQKGVKկp70P'} .,'|sqD#q68FDqLV0" Kc-'$$0 Ze<\):H+Dh@aٸ"i`8)T`@xvD( @C2bac*"(ba7ƅpo,f5 ;[d[<9=,7(/ȫ,}3ǡC'qAJ<tpۓ, ,`䦈1' I@tNNR7ÚyUp lzV$þbX2I/$5i8Lљl^Q1*hOhH\&I吐 m ScHʲdrWMgUvLl|Hd,"E!bZ |&`u@`uJHHВv`5 E(J(ya4 DBV؉gCZ&vKC DJ`!Ri(AᠣӱgbWc BiH 0D B$(C$R+6R'wQP )T)^|IR?Ӎ >g7ad@]0y(+ᛟ\{an1})+,w+OGRe+RQð݆-8vzP#:7? ;:-(^ܧTJ.z#d7H{ xϸHפBp#i98^z}yUc>98q$=m[砒2|~~ppj7?xv?\لo^WN4օto9u?0No·*|=݄R>=/Kt..6}0]o\FFpvD(,fƷM,G36^ Zߟ֤Na>gIj#e'ks(NaejLp\Yer&S //bNl5 tә8KO23v 8BeW2tgC<6qz"7l]x#es~84QE,hWdi5h2-Vl,߰29d<@( +IfL HVChHb%1q$1IE҉Bb(E2^Ve IDATXĮT&ehE~ D#rcutNn;c2@PB!,IXi%àpwBdM+ ¦04άT8;=zX ",-6cfsH u] Ŝ*\Cr}/?e1,) .ZP8)]SF4;%WqAw\cn sA0Hb[3g$XIwUEJXHiWڎ"҂+ϲ$x1kba" -X1=`E R&-2 r͕@Hh}D-M$ t4kbpFKMT",O%ܕ%{Z$9(4^^<^(So$J6O\#E {@gy#|1.TϠ>[xBoym<8wGv+xWHNoiy|a bIuwrSx{ $>gKW,32 s; , ʤ{jtᏝ#-<i^P`*]p*Sn_yW(Rѻv?ז8N{ X'Pc>ֵom©c.^/h5>+wsS;Mwߏ5P 6\0u*l80X.cmE{ '0Zy^dSjtB-V"Y';@ǮS Y\>YjWP dI3GAmNVG#\lt/KSW1!8ͱ!7Y=6(f.!rӡ"bF8B|VbIaF۠h(xrfس ZtO1'+5z(0Մ)w$ 0Z,ѐ S*Ӂl}IuÒƒ<iid$mH;{ӍVg1bE˛]z?NѲ;!\i`Z4[XbH|]`;8Z8:ZmS)0  L0F#Ne꠺BFVJ%! Ѩia_h2"gIIâlh2AQ+O=+u@9aHCUZQBnGtf`i0LKjX)Ҁ0 HSc0$$DB@J)IB2$"}bB@yۺ|8}ȷw>_r-i8ԯ˿VA}#̽ye]9n޷=2+*kߺzWuZK-H &ly3c Pxca 6"@! BtQK-5nVT^UY{o 4τ#Es~~zln҅[=>ap.x_Cwé={b~;3t]΢XQ.72 ʀ&kpF>~\(,nw_y f3Bp!&na(<&l{>4w.n3ؽ#9+k/aܵ7cЯof?_^v:{ϞxeUq,%\F?ql Ko!W#]+Y;?nxL~W3)+靣o3YrggM^hQj۴(Vm. q$QSNώQ'qbѴ8JDd%>ڇ1^A *^j=ٳ0f$$yq{!kr~u׊!XixqU㓜ܗ3hL?30OXx5?z ;i6{>ʕauslgwSϿ΄ ;XpL˛Q?n)GOMA3K^igǷiq]:X4Ǭy|jĨ޵a"[>Oϩ-n_e ^ aQڿvCo=yQLbƸQD*ʶv''`` X tc`ɀn ,44I-O(ڹ"amHqQbHLIV%%Ϧ$'NK h{)fNot&E^ [>nr+2 =ϓ2IxQ(dmAw(Oc*F0|z"<e _'v(C2# ^CKA C0B,}D6i&>SQf(X+Q=K.6jvÐj|Luy7T@K]F<S$P2 R D)TIs ,b2.BD:˅AYR), gÏ0>EF>`-w?'5IwH>E.)B;hSen'IzK n'M^wL COpmQhTp"En'IE*" 84b0+n zL4Rln ./DH Sf,!3/)A JP 2E@jHJ!RYޒ}$@ `F J HRq9[`4a#x?s ά1m"AaGtP!Gqfw'ƃog>8Bc Y;5QKs[9MT0x:!։LNwooB4H~ |<5rJO@5'hy}#5laj >G[9o<.. YI$-}dgwndwP 죹 \-C>?|c1;yGn/;| K{xSO"GH tFAY[tr~e ɄR̘'y̭<}7u+a_}fjgNВ=He`{gFvq#bbV`'l7z'kt]JbԀ\vs} ץ۩# ]q* GzkhOQCM۪pXLѕmf>a VL=qs)rT5\BVO)FJv5ru+tq*k&0~0FLĴTkKGte0)0wTxրϤ9k~A|>x/GqTZg#IMӓM2Y*t\j׉ifN mTTҷY.{=fr D6Iwct#װ3*1. *UZ膁aHMdL[d؆9'Ŕ)҈XG"maz+AC8\S0P I9!HZl0Fa )ȥ 6tH""[Bb"eEh"9 Ö-p0h|`ɀAi1BP6-3H-A*J B tB&DFR)T 8QJ4E6[ĘZ-!QDhbI"$&՚Dhr_d_?뿏re$ !dKW^g2$Ԧc/L`$8"VnxExzy G`173`ɏ߸* |zu '[/gω׾zvelCÓOgO+Ys<3kCU$ujH>SpfƄI<*'<63YK>p1XBm h 03:k`TxovcwN]GO_^޸'<|ym/0|:}wdק`8m\od=4I;# ,߆mu:#zڷ ,¿| z !k44}|VȻvX zt'׹waVTd>oi}eсk;0.:W[MQmT= fh %^t;ø il25<@j7_6Q6"gAN?̐1C2u@}a$xOpӿ)(&X 0Q'u'9Ǹ''nL#`b$01rDMDb'Tʯ/ze eئEwp5< 5,A ,%QѽEa.qZrKX&J NvcW}F "Z&MӏtLLvM 8$APֱ 18ή8!tZ`o8#37\x iEBɳqSh+;0)\ZϷ>t0SL(k<~3n]9D6$A ;'QbZ. :%N6%G@98.l Xqi ֑B*I6B%N|baM7!oKR"])tLh="8ZHR-0 M !?Hh%JD D2P4c{X RxNW).>m0R4XjC|TXI PEJ IF+A0( Z1:<=*bQdy%AuM2 p@]~d7.*\6u# 'a_dqqd@PhQ2D2;llc4* r k9df00tf7[MvdUȿ1J' RxInFҚ64$GZXW%!z?!Uo?K;84Mp~gս{pM=s=93 կ$̀T΍a!1QS>i[ЩSDqJ|ƣ-V8`]0Ý b )ݣx0 S2BTwxL髌L<]B&lXV*ӽk8 դހĆCcfԧt5Fwv M Cv”|sCDA݅gmY;wj:Ng/)n˳9ыPs|?I N ǥ_sΧCzzgDgqmVXC7Mۡ #,Ƒǩ2H[Q|^cnR&%r j-jI#A.mX*4LyQ iŴsĉ&J&DQ 8[`-7HpêE=vA}$$Xl>L U{ mo(y( mЎqȲ&rۅmXcDee0)m]{k-߾d@ҽ(igv6LwOқuR %a`h 9ĭ뾁%̚7L5ښ iaTe MI`A9:m|j~%PГKx:AW-@,5M3bynn?1]P*n`YF/鈿e^:N!gS<|rcW)m ۖ\0DG$*!J}eKϾF3"AhaNu o\7/`H CC뿒`,W]zl6رP?opYo@m7Lf`:@`ۅ}1!>FJYP3tz:~UlG¿#׆|0ϝ2Oe)}M V؂c{d&~4{nnC΁v7c}_խL9nCɶo<g> _?}ex[{ ?}𫟇S_OLj~~F˙WۅZf5Zzfe[Po}~"I> KP^k@;w <}Xn6a5xa81kݬo#MXɸVa d2}:g}Du@\f=fTl'&;aL/0GFqYp.s'Le&O2rk Oh .tQAgFNce7:S)f!]dԾ#= |)N~};ӫy^iر_0I߃2[kLm'&(:E62/8/{^1n:1w.GN@?3x=l⹋_Lf;h"&gZEƊZCl>'>ȳ1S*q13t_C\8zӯ % V,n4t04sg=>Wf<0nDٍ6Gy˜[-~YY԰G=\ñaYCXaTd׻¡lWG äY@st-S b'v([U r#L4$]2:VRD iӽr QHT(*ѮKEp tۧ`[EX&'DaOJ嗉 m$]hm`h_$]Z3 5ab&& fŋQ! g`Ey|Q%"`DFdHIj*drP+ >JiC5"04#mAW7"4:h9DVCUE *o~U(b-Xk GBP(PJb  0B3-msC)Ra2e aqd_G4N2y3DYJk@' ~3!ϑ0pITQuLR!&2 g\y{}?+Ce9h^`ѷxg'8?^c>ơ60?ȝ=:}G6:<|9E<}!n"lrub:6湱(P 6$ #@K. %iOUOnZ3 :zY[tF$PD9A1{ҡ@0aRj\$~ IDATG`@aq0cӠo4OPh u.,5v z9r\B{yxz {},c 7YIMn>Cr͹~ 9ouqBot~?iz٤`HcG ,>g7lM9|quR@MQI@,RV&YJ V * V|}j<OsTv:}üm¸c/cS[`jI& Eiɓ~s(c&M 3!w[b`e`&KP}407 _nW,R1xcZ nr 2ThnvM(|/{MM곰g.,1ziZ> U,ࡣ˴p,ld@nxc q2&eqO{|>Ga3mܳp3{0cw;i3s.XヷjLky(o_ ?t$39[܂csk~_!EXt6Ngc/Oc\n|3d{2R=Y/ C܅Ϳs}r|z;X*LGľIFs|E#z7ʥ wr܇Yi2RW½+Uw)MRpO=M٘w+8s7^ [ ;5 n͠\ye5M;co0;Tx1& fznEq\B R ͷ.S/ҫS(YN 8E&/>şWA_92C웶yPȖ=ε-]|4}}t+&VQP]y7nOAMȉcU.VexNM(G9fA?9OE't8@)ji^&vJC<#LSnbFP FPcI0P QL"l;{Tљ bZ, IoONaw'ɍO/G]HC!C͝lw.Q\m%͐Q%tn:R0lWn% ~bc6$1"#l*F^:DT 'MDN@WI6$7+f@h"Vx&K#ȜA0=#$8AbX.c'4@P%|q@j٪F-n8E4&ɊJd짆,[f.2oفh !B 0 y]AueJybR1~BQHLbg(Hn,A(Aha $c_Ѥh82Va 0UVE'5дB7XвLmF M`hkbGN1!Zp E2CD:EF)Rib!`T@b $6Th[NZfl -f61t87ےh2>M.Q|!3)uJu_KHt(С<5 u%Ќm]9S#C%9?&AtbR/Ǹыi+Ytc:=T|E2hGMZVVԢ@q/nUn5Y[0y$i`L0Gʼn~ۂ\H>&~7z`<ؤYXYzc>z( %5~>fmjr[l[l9ΆCY&=lJ_oVnRQ^Mn35w`IF;(]Ut'QUiSb%Ϙ &V.w9I"(+pmHilѨox,ITդX =:BrME'0선;D^Di}:$#cGNtx5`e`8 6 ȔLвh'M cgbJɮFeP'8[}P4fTdj+Bw@mqk/1Nb2h:*ac/|N?sx2%֙wRb6n3vdwp1&Zʐ!I 1#Ti(HJvq MFhb"4")|sYq"E߀\ P}KЈ@;Ʋι<50^H=p}GR˅v4.fYń&)8``+]03 ϽfK=fw+pc N[՟$ T[&]3 0Tfy{EKݶn6,֟= FLp&_ ~_[73*; Gf`  x*<'j/At;mXl3?|Ɔ26ʏdFcx e{w~ ^Wx&fzq@wW/d_kdcg O?`96-y܁v"Rãe0,i奊Ո*-&FإA! 27O9K]fHP[n782aeXdOhGJkU:`rPX%,k)Ɉb&Xǔfo[i ̈́N2h \Ӗ&jG!6p݄t4e AY&њ&/n 7`Oy63)D蔨1B:N9JYgӝ!q֨VνUQf֕$)23|(t]b"S"dO62AE9ۜm+ ĊZ5оkX7@IJ9 #$DHdK1ܪː"I̱]}rfR#fm`܃؝.Reg.R#$B!01YC@R$VI "AT٘K#NYHA z7468THnhmP@9VԙV)JhVA^dny|01];#v:l#DV#D6aFIҭG]0>q#&k~cqɵE>E.|tn ye6kNVm]E'v4`gS0,=7s9u둳6: BOc^'6)i'FoQ(7:tMMfݶ yvbf ̲m B -77KjsTN7$ h#z>I br!t'n"01N@R0@Qqn\iɾx (ߦ#1>²0#3y+)~HFό&9XLqԢq >kIBfq(C WRM i@ 2 hJ)BԂ͚`/OtE2"PZ#Mx`$бODdBk&$ɸqៜ/Pl)#AAt})"Wj,CƼ-[y~O5+yI1"PX,ɈQLH6 Ʊ$}C`bźh<;F6IE*Ce'Lۜ{5dZeFc[BVb"uHki˝P[O|517! B~ FOB}֯C҄*8ah/kPA9_LlfN{3O5 ^;o@0^g2sԪg.JP>{?KkgD%;܆ݓLl{27 ||k kp`ޱ/̏??_p߾^ƖLb[,2r!a r$y0T̘? &|6ϸZ ^ӗ2}:읃z3{=pq!e{O=͟>< T32V9bj6,T]wnh}yآ]% F5*bԿFr;90ɹ)X3#&۽q '-'EsocYw޳{~okUf]tuU7]@cf4y2#*:Hb|=}]'NC xY?6pu]amnۈ-Ca7dCswDtSxSݨ\,Q:MyDhɊnG5 7E1EpZ"C*WI:<-L}A{m>IB?D]"s}dfG8j]2KnERWPR=BCG0? 1iNdL`"B_0?,z}ooD>dGKX8ŕ'\=c gY`Dܧs'}eeTJwtax3a& 85BqKBk@4NE40S dQ"C& ~6(CXT'^(>FӊN/ҫz:PiaJ\z}~SDBF zۇPPot8E"hUL61>R}o 9)Wd:AAt`SdسTC$:5'a|lF# 0&&'8&2*b#P#%g)QbDX8U$Nc-&[ʈACZí)uB$.Gd"!֣ԽI<%f>wb6v V`{VJʪ+6+CS ^BC 24tTEbRT5}rH70bfRK* _YX,r_=V PRBij1+4.`24Qxr3 s8e>fHKSX 33{ϵy˒G$ubэ w??m Z"sw?es{"S2 cҜ[҇f8NJsF)޼hR(oT.٠- W A(7 o,x@ ا,ϿtfK/:݆ӋԹ~\6x } ?9ӹgx$}jco'sQOO]: ay;󗟅~ǡ;]=?jN^_G(qo}(Z.7欿2],6bqpR+:zw'QZ;>a|g3qO?GU;Fw@߼Er%W?>MSyYclj<Z4Wxr~]haUV´FEnsUc#lmu*Nm>lV.]ʱ: IDAT/M8|_V㰯shTi*k]ySF'Z}vfZ<$+p:gcP cM [bKZ /oP 5hj))N=,[tgܡ{<75Cr33tִS6p{Mf`n^.;:] ̸'9JT s;p{5 ФA rn`gJQ$;#J ++Û)cRF""a6a=L{CbӦD0:eCI(bdV%4äV^C3vRNc[E3g𤁑TQl BWx0*T<(#Fr[0T{t "7&´|dTf\O80=r\:SuB5M\RE(Ee):Re0sc`*Q1Qb$4ZOƌ*\V $FBK G!I(o0MTB=zih"A yPB #U0Qi-(,,!V.r7R G8v3}gF#2@#@MHPFfc#"#uk2&P @@+)`[n`Y i(-@0x_Y6*BsăM(5|e tPIah;/  JYD(:J)24 E =cZO)PB{`3@ɜ6.48*D5O yJеzP$:F%]>Rq5|4q\cX8JTGAS꥘ L堈*!K  9bN-j-i YB|6ao4 9'p֢YujfpRD+xkV6ՑH熶Ccx#BWo_+T*%l.̔TpH-y[g =0Ml1DA7Mܲ\HV/kt|6 S~>& OWϗ9}Lj;8D 5b%g32NoQ/05ŢP̔w0N^3zWZP A_Q}TiZ#fg̕abq!Bؽy*)ugN/qp6 b`ӈ@ct(E@,`=|C-K8P;+pWT;McT֥Mc}N;'?~ 6oE8كPYӆa1?;c? S5]CFX[Q ,^} 3Wrnoq8u>|f.?w~}l}~>j~={w],«oP<;ߑoóϿ>L,g|d%g~ .r/B-AͅAwx#yfY~5 ?WsgVgW߆r.?ryixyjpsy֏7k'"/n N-h?++OH0mӘΰ|^7d7'gT?ϑS:1h/*cak݇k=uO2sK\\|]-7.r˜=޽T~Y48<յ79*)YJ\dIq;7]V6[5& ?W߻kVvTF 0~p{oap̞C&+QUI) L$)DmT1F2H3 1u1B⃸[Dqn+A6KZ 0q'GEO<"9m. }4-U z M2qi@ =ۤGCOЕKDb p%%H^B5QL,vb;^1I2qw O4"} C``E4Lf'F_[z7TrnRm|f]ف2tcYlN]hOT?~5blxl2mO:hP8&*N 2Xd17]B`St _*#=ѫg&G~=I6\m/1 ' 5:E;N3gf^Vw n3]B.e 2/$x9F3r *P-wI&*BD$,V@i)t 2l!(O}_c&l|pQ(@ . 2 -lׄB M:CJKb4LaiH EU*$!`7# D12ȿ\|PL_/9?ri0tnUXɣ K0`4'*\^B]/VT M9IVp1 /B '[ ۀ'N8? =x |#pq>T>`t/N"! ? 4t=_ yk.s!S}yvyT8;O2*gڦ k-_X_BjNoT];DR߾OK{ E (8V1=JTGӬ,|xvi_اmN6un0y+(O)wSUjq̞y; z ;U463qIPo]Yk {qL3zt9?f%%7f6U\c=,5J;|jS5yVnoR>wGIRVfT8cVn+ nx-P56 60JTۢM0٤8a|j%f&J 7<&2ASn1:!joSd#EEc)i ˠ+a[ ۘ"qЙ:B+%l(e'& 4K:uqR/w[o`h)cxj96Q4l")d:ŪkܥZ]dGi5֗HCaetu냞ٲX/9c JKX2Rkĭx=crx|@1DryصָWݢ7*:6B+azCA]p&iIysiyΘg{;c6QYF _ .X'8;#HGCarq?Nj]&kct %Ʉ? CcCTտoli̖c.2:s?gp@~ʙxC<Ҕf\ NʒpXaeSkLmNطG4|$ИKDJ,&9>B2otX<)r/]mVo'!ժa7bM{>/au;Zݰϩvp G{MF̂ $ NAf2Iz@\d"uO06/RL$xGcv>.C#zN.b|"%diڤik)^ԡ>]))hIEW*7Xa0EJ[|s3bxw\i4iJEgC*lBslQ]4 $fbu%c' OraS$!AMI|5(.8FٰYz,R3I &#,BD3I 9K=]#q\zlnRr%I$ŴAL<2NRFzU0=LB25)EQbLtzm~e@4QRR/G8PKVAacXC:EAZ@g|kpkzEǃM) !PBSL Qt 3p0 ДFw: a"IEʲ:)&$0ʎQNwA᫧k0T@1 pڈ՗JN LDB5ZQ #Iſ ?57_<ō7$mDl:S&)Z<`!񣐾LNJ=][hZgFe PF?I%&LAʇ*d0uz?Zq-N!K\bozvs߳K= !rTy4T|d ~ .XX9 atߟۻp w򸦣}X9Ch5syשCq*A8T} NMoOsL~^˅4cҎgΏ)CxǠ5==[h^|~uX÷_^-Ǟy Nzyyu*s~fpv.FNނ3F~f˹Pk@k=O}WOCE3 &K—.D=*3%G~:_X> ._@;E/x»Y|}ԃxB/LCZ`- :}MAm/ LE<,czYH`>TZ)I3ŚOHeNHUGy=R6#ڌNW]C _Na/ꘅ:]=A6"+eM0Rwj\,;D-?c G F۶>A.,7 ug戥5Lco" =EG_C R45Mp@ $AM*};nR E,QJbr!i`Gdi%48'XEw2ƶ+Q(KqAV2|Cg!*"-ﱡ4B"Z#ɗxq4CGz)jH>^0Fq"  H')B[&1ru1: o.zSRSC6=bN Ϋ!Ȥb `>0s<`{K ',/1MjiO@U*$g'DU;W86WX.~g7^a*qmtQGL#/ػZOqC=]&4&)>'/~7yvc} N'6-^jR4mFBqnҦsʪզ_ \Be;R5™ㄴ: x+fv3[l1'd^x)s*_U64F&]ncamlRB8u[xnY^Bn }(Q[ëfL{F}JZ2D" IDATƨ?SZ`PC$"qY,@28FI%Ǥ2qL+29&Y DhČȜ-2R^nc (" Q`^|7D? j D3Gpb IS=XtJS~bb9ziKń'MV2Iv229&Sbۥ.v*==)TE$>n4A蟦i(XbQX" %!44Q#jRx' ;ɀiY4i2! (s Ea lZ[;Ipj- *u,CeGt'#7³:Xpo к:n=! rhz#HE e&#5LgrH-'M 4 \Tf>| K"Zwu6,B&M@4 %3dTT8Ȍ %YDBR4Nóp4 64^]9͙ j(.? =ТK'{^˨ 03§'\ddr[s}Kw|þ36CTmj"tHK$:6\Ȓ8 Y3! a " ViՋa ֦/ ?8B_|x?D*]H|"(5yhՅ~w圎LpWa{9\h:<>9k޻NNLvFGp|6R |C߅7ބw߃{pj{55>mC{t,(0 paYc~=sUM0^;ww;k.z?q~e?] Lsof^FهgCx4rׯ}O]݅yYxoo<7z| ?Cy~s'/\_=l״ЄI 7PDAߌW& ٝ&:آQ}9p9͔.MɪVx|DsL!xCgڊzsT!ZlMbn-,V'xw5I6׬&xd>ل~u 9b5hNz bs&7γ7GX "X=y:Յa GpP:E0S魱9V`PȘ~ ¶94iP;gLwa&w/u%bi-1ܝ񘚜BK$ |o1gh^~tAZ"a~8%ǽaS8YXlޡUB ݳer ]$)uH?#ypTB\vQOZM{rLdIDBTa(e`B&|z?q #7,>5ދ=#ʬګz_Jݨ@,2a0=>p`f<9 2XVU-VU]kWUV/~x%?2Od^D}F.vqMÎ%?tXq02Am"J;ݧPOXi`f81'ǹݻ\gy΢FC,W8.¡{N|_~ñ212JSj7Bn]( ᠲDf@9Ÿv q1Ę@8,R(HJ#T<%J21 H 8$q EChܶCAKDyB-[( #BV-2FH c.T"EFiHB RUdfh 6h[\uW'Щ"7)Ͼ)d!PM)wGP# C[ (ewEOO{kԏ]ۈ'n;]<7/wllDp?Ou'Syg<}U_/9u*kfLE_3[6)D:B!Hr+4Y?"C+йB ۂP*P Hs"i0ɵ@(e94 ÜPa02;} ~:h̏TMZ>A.c$ըN.03̀8HIw"`3hKDZƽ.qBVGi,ֺ: ?Id-bYޤ;L%ĺA5.uȑA'vF4N21պx_$T(FeN@u6IZ%;ؗNRa|~l sw=3%:$~*}52p?}*ǣ_9=u]7teGVЦ;d'7՘k#ЕP0a}yf cD4o>|D uN^#ѤnIh4& Wأ9yNd^Jn)pG3ZsT9kf;\cI2#&CL׀dI!\=bsa( κBkQ o-UZ% x6 23ƌ=H’9~(E!],\.(i:k'/tFe^ bP2C]4 ꬨ)B,@s 7& B M.I,_f9$G"N~oK. mWL^|ZcƸ(b$Xx,BqЂ_,; ?/d[*w{b~>X+p~8W62lOZ x'P~xMIg JW\_y~x"<=)x(|!Rk ɉ!o\`\sb⟳t>h+ݘZ}mxE!ts-yѼɽ6 w{]Yk\l>lyEAϿ^Nj$*d*m,*WO}#c{#Gy׏^Zo?^3 r59IJrz'_WWIs{Gq/a ^;0f!p0*-W799b L46x,o1g2ۨKS,!wr61]##ϳ{ E?~qd}7ΦlnW(Y NZ%epBi:&}zsl6knǫM4Jw>FߚH$ wg#qycg7QN ϺC?{ȽHck/1?I-ig[-ǧQRo;w.C^buD؆OU`Ҫ 8a8w H\` ۭrSU NORA98N4Tƞam%O淋fb|RyetG+~d("4Kń[Kt,E@"9'!D(T`*LtVʸWd&'bh"r:'#JRl |)^˄YOgq?W_Ҽ ŹWKyI[!*05|es?Ge;_ضư+;?uMjah׺ʦ6ݚ̼{c"Q B@v1FUCa]f5]OR`l!WeawQ>֌~l0]n\̕tW"3g,`z8V٥6VQM>$\}GP'3rћ 2ޢvF 2s3\gKCvƴ*dfiؿ`R+(ɉstm: y.>m vql|zp/'}8 l}epܼ}8n9S(4e԰8Mj՛:NvuzVUU 6[m]b_~$H%]4GThiW1b&fdpj$;b1vMؙ$3ldaIQN`Bt ex 8QN,R"ny8 ,1;`h%Xy[K 2֌p&ZdjoKRSd0-l# DjQY7/ LC%2X ]b5DKp!0R.$vrK4KS5Vj4,PGrs=ݴ:DR!J&i#!eDw/[vgT#IlEA sMl, c6.pLma%u%P%c[71V4\>;A;m犑4)Y#טS)by$dBvݬ9.Q&rnaҲ8$͆JJ&uNNY*l]{J7zLzv~y AQ G&ܸ /}~#,zy{ ZOo%XV}>ñ0ӂ?T4L _GayH^({NQtD/)ڥV`<181 }m Bi~G$x|4_Q>T2i#*V @z,|Ih;$#g]ʫ?o ,Oַ~2uՄi^k!_&XıI Q69EfO>BY5Y\ݢ}<яwq!y&ZBdݠ$*uz=^<V* ylETV^Grɔ%@Fۘ ФS}7Xo4iWߜ%2װk?d0l5oטu3ܻsˇpoy?k=Ü.wJL7n3@nqNΙ}ӬR#{e@s~XnS.lDR/N ^n:SC8[S`:cT8}s GHߥ)tolCS1n.AHllcH|Qjc`.͒2zQ}JJ!18Df Q,0$Vh2$Q))M\҂$!)#sCy"qx13&U!n@'TrӀ69I/!5)c˦l+ᐕvt`Mpĉ%7vl{ {h4HTU2 (` cX>衃v=L0,d33u/9\IɭiCKƤQ@Ir#r$GiI D eب a (70,# E4< w5 5/3X睟uAYie ^k9կWykIZ}j -萙&˖G$CLHPY ZRs Z#@eb=&=Ƹ RVfآ2lV3wψ,|Y)k LlV/1~1) Ad2\+O\psTO \d43$e">NA7ι*3x@’k ?RSsUJ%E)pY!2fVVRS!4cgl^~-Es)Z(௘俞mw}`[ՓQ ކ.HOAo1߂9>ZHo9CBAŸ\.þEJu>k7[pH!.aM?p`iڝh&|CY" ;;X:O{.f& Id ^O)׷!h wž s>}Zu#pt{sW &I̗]G`<~"}˟i"AܱGoVSa\A&m5eg1ly&/ IDAT}eo{n 9z=m:'nb,&z-k7q!c +MZ{;GF/[!9QbyI䑈m]zԧ:ڄ{,PAߠm&m#`hظorL܈ ƚgUDŽ%c:Y=9vޠOb.hczNEABm+Wrno,p [˱.y`E&F0.,39=+unnʭ=,"9?Ool>myߪ3]סkBVFCz%Ü~@ZwjYR{mZ~p8:!C?6yQo !17!&Q&]s'j,gL3xሡȉ*a9=TrgxsKIHc J) 2(/!JD6i)J:!NYҐ_&UX`Xlz2&YrIHM+p>]GBB7FTQxJκR) C^-\!tXV^,ZV #KPR}@ ZƐ) MaJabq! W 2lH/g! '`!Bű!DRA4RBaYE c/Pa#RaK1hCXURP\e **&G:m6<%U& `)982ز54lTmѨָ7ƺ8zM*S8s0zfq;,u{8P,8Z+ T N0?\Rb0X4Uag>\i׀lW3"Z"(kܾf"UDhƱW?J7:%eZD1rr(dD$r;s| e;7hQy'vp 9H$jNMN1m9h3dk[lBZF$Nu4-:NIDZ&9 1YǍS(,!R0 H钅!2DTKB#T1.SO]:2'|s4PY~I)CHP r !tFNDBĒ%Xƴ-ҸN˕w.N+J oA.f2X:ipaG&5N'5:gtOWÇKҽn+_y0okʮB]3MZfe0WHdšcg}\Gbܖzŭ6n6/&\~Bu(8sÑW ޴r)dbb+<{w&os.F0> 8(l߂kP$aS~`woA"̴gנ ?{ 7 ! 3uzwm(wV჏?.T 25%:>O'\| lZ߃zv:Tw[A&8/R/> k OY܄O,.{P;\?4<F@U WVgZn?q`k.p|`ﻧ_<|^|aJ{C ‹7;)뷗<"w{ܞ䡡sI{>c#HOXר f1J]gWy*O225D_sʄ#L"ҝiʕ.˥]]"{ S\CamrL6S; "&LfiOB#niDώi;J|&35Bk܈ѻ&ٻL;LѴk.+wn8iʽ  whM':0XbeHƔ6P`&̌؊jY'~9dVC & o}刽t1eTIw]Z*ٰGqIЭPw"B?a~Y>;zI4$w lq8BMd 2R(>ۣd qiVb12;8F}ј:"*/!a= 0QfLoIrT'DLC!Y0Q0iU`6';46AKX2K$"C\ÐT)0 =^w#Qib%u<kHYxL5Aqr)<0! -MPf4%%̺آLj 0rsIRa b*$(V"M (Uwwa$LDI 7'mbu6D4:Bk8h9DIi $Z",Ԩ1{AS( 3<矻EPfy֎'4s logI\🱹nяR_EOjEז(W4 Dr7y<s5o(uV9޲?e"Srg_ W$B%~E V[!5(Lr]Ȥ3P9`!D)2QJ#Tj%+E (tE""2e33Ȅ|h"5 ;UV@=oI[]dR]#X+%*|70=ɓ1* 1d D֦ Tͣ ]pBv42Bs3;I R7Ldu2BuS|;6M j Le|T7iAcc,&6ݤn86xZHA`ln&s ϪYS|'(]jRh(ko!-9v339^wY6{(6ƔȋD:+$JQ:A*XF(3FyN8H\WGQo }~z[XD6u4@O\ŚTؖ*B Uf"n;m<ç8Xor=) <ԋ7W4ْ\BP1-(A1I5C $Vr(Y`SC@3W9 {0_F-(aO-K<p/\.6?LK~O`_TGlÏ= a x: >2kᡃsP )k¿r<*^ _/ +Ax|8,׋a }n YÍBʽ4YKEN 3Kwqŷ\*#ߚ,w}u:6Ys[cz묯R>H"cv5v-zbiy<7`( d>۸u˺õMJ|L+lb,pxˋ_"NL3xͱ<{cY7dG t-" LؕC,6}Ir(Cx E[%C=y4SyLa|skVSSd9C$ ;"X=퐡1\,.gFNڌ cDEfw>}OEtG145㸃cHӢɘX4H8"u jXHRaJV N` L.LRB$k!&AGjhw] ѭ]=<3nB8 *mS2k SJJ?3dXD!At"bBiQ9 O4] /PNGfÜƾ [C"M+r:LQ 4xՙ dY4 ]{wϣU֯չب6Z lOP;8Y:>; y3=^7=U8|;]9S2_zU~.o*쟀 !l{~LA_M/kZoM?U&|WziQO+ԃ0OvIx{JOAeUnX~ŚG/[;{ "w1[ ǼcQw/I~~kBR'r_lpas/YL+|5𔲈ul2+kL=*\ QTDCXw47ktzĆR1C ^2&idv#nO:8bhb 9$Tg*Tި#Z{f9owVp*0)^ti<MhF6Aj9ڣ15LVF) 2cX1n0Q?րoIz[nkOVX|t]/8xb1Ef@2j$4F3l ~¶>Drf-s.-@'Kfx%s$vaIMYtܟN;H}/TkWɜ9d MEkZMZMSͤ) S 22EhSg.I*Dq}4 ]Gnш9CBQg;QCd2}, @V]b,CLxEm[=5,cHdou!ܑi2TEBX&.LdHm@ [hY`)R l#(l*N|qO۟ϙ/=|}'~瞫 {Nw|w>~w}xt/}< ] G9p`}_͵_wd&EK}zDS寇mO37SG6nkʿ .0d=H'( ]1#PXʸ4 vb  ;Re m\ SܦLF]X ]159QNmr ! YAm 1?d.ˡ:(`05YF2^ IDAT~;d/Ѱ=6#]`«+ˆa4dX gȇk,,NQu86nv?!x#˸1$"]R`rbeCrd yEar8Xi w_xJX1[< $ `fp L[+!NlHLfvix.nX}S`oD+;,of͝ x μn=`>y?cj?\V% HbNNk Ve2J- L [ t@dƠ""hU|w@]-#b{}ll/KFm -k'2x=T',$q% |Im0JS>%`Nww yFr|e--paPyW`> 8|kKگxvɠhx=V_ᕗ˚?#%`p]б 8_+/])xww 578Cф,4+p<<h@X _|V:%4^ga;S|"_y_{Vّ܏8 I2l}>6W%އcM!&Zw|O?  >x^p|^Y.N‰eʞh6SxpBOᅲ: nAŅ/|Aw$!_PA\Ĭ0vk1r%T '!ynB h-"+:wܥ=fqek.sM 86tXƑc1~s׎Ăќh5&ia{okVCR#,*6Z'㯞gv43±t Pj̸RXQ܁T.Nп}r!}.MD:2Y~j%68 ĖWs>#T@7- =R+b4%jmE㲼o{+/63k!G-,FΐQK')XYɘP8dvMʹz)f>]f-}Yd'ʘn#s'Cs:;mO>[p `u&Ё9I-\sX 68FSۙe~as[g7Y^#b_8%)͕ݘɹ96&F˷Y ]Zc>W< IWPƹ"$dv|0@D;"Jvta& le&\Ү&H˫NzKר5vEm3PD l .R" \N×AO-"BZ!S W՘:~JxO#-DEͦ~hшhkr}3сH`+B#E{䖦(<,eH`!`b!@‹ЖJų ` pջE_ibnť;^ ~D RS!X)b5r 6vEclAgVϲA`#$jҟ83{5t4,pm'9 ?z 9,7TyF[ymkd ;rn ڲ;aL^Ş{|) Jcux7 }쾇c dEF̼=o[̴4e#oYx ~]X @x6oZ+ 2ŭ)?f{, LRi goAc liTJw7˛h6JWèL$\,~ lvccxeX[y6o^8Y*ûοS[q\VNU%ۅhnlX؋C#*|L)o|~Q~ }O҆[ehڡ97Jh˃*]fƵ$5sPA`4\m *NU}|"x[_q?b*@Mho iQ_p.M$aL-LCa'wD l3#2.\MR{3.,әDίtS0%z԰r-lļ7Awf%تJ b1T3PT[ݤq|붠K~`oXrR.;cu'8uc{ ec?zx7b1 *煖$FL|}8Y[M2f恻YVVU1:NBZS*wH8ۇ8w$Y7eB&D{ڠXS)n"'"Ĉ3@zLn4SK},s8;@BQN4N!鵩G(*oR,GqZWHĚSu=jȞ7HP ѸN4  +$HbM-L F׿J9vULb 3UD{Kݓ-rPJĠz8L(y l9I-&'/ƨ'g\;{],.lΛQ6M9bO9PYT!_>Waa*3#GVkxA t>cyU C1DQXuIA*ˁ"@{dUE[)R8cF9FhCdV4LX5VH_c{,!tbr)hDŽ.zƣE |Ofsvy?Sk;ϓk'ݚ\GEIƗ`~']1WfcYy6)N8+g7x2[ø{[vw?|=E&Z#qDϘC^W/8#кs~tLgtG/2 E՛G/`gXqU~UoUx-z-sSh2a˂0M`yRk(GcNJ6J)b寁1YQQ%H*|EH#56uIkqҡ0 _L>: f4:*A0)} loڤ /lpI!19|w;}uL8.bYw/cQd=dԻ31.'<CT5-' OLɹM* UuW&ͮzCϢȸh1'>D[ :j9ž o '4Z.&hoO|wH{w+sTxdgIk1"fl#^\Y \qfOǁFJÛe I<~Aqqa_]oI HL_+d Uhl_Q@m'#%٤@4]*F3w kߝN]@PϜ `;Z;S8{}o4w?/߇}K}J?_zlUoy8q^م-Z IDAT[?x/1\+^x쪸0|> 8 [p2vA#,ˏUWw~ v~waf<~ yecQ z©Ը2\;AumCV*83f,u}#vobcvzAt sFԸ5dmf֦"?] fv,Q=DboИ38%[tm6yL71ym a$ J%X2pcLP`͙.Oy=puNwf*"`ĉ` |4}o14r}~-j#sÍ sVd C'jR#KX]$= XB^-j}3-v/㺳vB+P&n]jpnuQbVLwiƓk)v*J/`6A-tc 6a{a(eD&Ҫ*p=ĵ.^TkS v *n"K6#bn%d'Z]XQ)R0/0_z,<&7ynӧiT Bd~"v ľY{ }zt%pDl2"G{dV ˘u)h]YP.{"Ҧ]q`NyJfl-(ȏ2;KWj?șӏ#7ֹ#q3w Ϡ8o |KO/cOU0r [Sr)ei=(h"UJf,2 IЈ/tAI+$1 %C 5J٨X"UF*%ƹh> :y6.3rTa y8ˈX̠ wʡ :/ۙw?=WsLqDcCddä9Q"Fк@-v])=1 ts\N1d˾e mΰ@) 4:P*w:L:<c 3/Wy4 ^Gzao;ȲsuΓli R Biڤi˦iY-͢DĂ@ K\\.6Ά3={{7?@nqQ~կ9}M4vOe+}We0%{=Ӿku;E8YS.)/sd%L-3'l\&\ p_ӯ,A`K.!jHYI976 o= KT .\ŢOO{#%sIQ3MZqē):Q{0"#j+qٌA'p)I.ݐ:' NRr[Xq "=¬DJI A(eW#tb0f5݈gL6MV901rzc?λEIZ."j@8vG ¾r!46qzyTg0kq k0fVR!NO8!v@NױY"{@j6"t}E²Nʨ5%2s8I|+=Cke qZ鐨iHDq.%#$&F kyB}4NFPe@a+<a hH\ Lr "/$vcy:7#wb5&2}|1n6V$%f",~m]o-pzGaeL6$q"MX`Hm0dL0 &)d%vGֱ0C&^`jVЇ=nGȜ"3;=Snamt9{_1p͈*(em|g@T@7Ae HApu&HT .Hp=EWц7CTD-7IsO$jnlc~&\z_`}(d,xIs6B!sR˯'@y; 3>|@W{'T7Z~K$|?~6acT*arل1\3IVjH_}^~7_J* )x2,̣MpLx58:_%e.!2L3`So80Q~i;(|cxF_X.b /+DN ]Y`'*2l*o J稺lm2LHmH:60n 6_o_bܲ}~2 +'| F%Uzdi]Ru*VW+"!AWsTY$847) 1|\n.YK4aQ)p)}k&upEVs#KZèIF[mƲ'3jk6zY2ɹ}izFhmX~c'8[KMˊΐljRK/Jyמ]"a}Z:G'-EU) CKWm:1 + o",2c..X)1]#e[6]SXjb'&^Y},3釘BFlR1}cz}: ca|׮t2hG\ LV:@_{mҥpSg;5%mE97AccRE67#YdmZq~ }cPgHi4!M ?P}ypr)HfUs8!l뗸F[Db#lprv)C^<X{AфD 4t &(FKTMDI` H#M E1I*F'QjbӄX%Rb%($ua@ ѱ@`F!|HCHd I,2r&~2u->_\;+/OUzcs @K &VI6Bha>z <'Kyb6"hW4:*,tv PYhE D(&_BhdbB+ t$%|OkC൉4iѳe?b_a@c.8P9U&=a҆`?5(΄T UϟD8!)AwVZ{u  İ\,FKi FY¬=#hō S31=a$VDZGH=,~>0;5J,Sf3Hi` MPp[24/UR>*#PqS54 ? ;M}86Z | ,\|>i??O`v&Z6k0U'/&UL'_<| 2LX: SP- 0?v,aL/tb}݁7_>G_}&Ùכr`> Mx򅤫$x쏞O*g?~ tr$xko~%_-Xہ~Y|v_g' N'}fB{ExƷL*& p`B'AdAO7&a nG||^5}vn,Ӆs+ pV&>Ȳ85"2*%;Gir'8hl2R~T%_y"Gnb vdضLzeMZ W:dfx,ӳyxE7`YgXl~Ě 2 $!nQ2zi6E;ʳDB^ވi#&;nSX +dz(<j ;R3G}T+N>"= f/`cy3 6 nK,7X>BQV5٢2 qRq@ Ɛ,t;^t#-нEqh:_""fo k7QU2y;q%|m)HU{X[D~0o]}CC::&' M%3aD%XEҵ B!tp&Pw5Z`Rh 6Q@#q⏎npǮ]mB/&6]4 $4P&|kck?[H%eE^~‡x9 -BSL|g/|1)N'd @i0bI RM֘@&Bb @BchH %hI V Qw #*D.jeۧȰM`0 d& CImqE 4>'}ޛ8:[>vF A.Q(*LrrR@ XmxxQL*#>{}#9[/ȥ˯`-ZTH=i NJ!FF!><{!  8 d fcy0fHKA1(?D F6@T QDr12nHdKb44qǘtI>^0±L)a@;6waR{X44"#(@D[ kltbvw+{JȘ^EMoHs-®ATCvVuR pf=1g G8vxgi1|qg25ccNv MҢƂ٥]-Y#u1 ZjnyC%q7PjLcx vmE.̟/rN!K.=YC۷ 7Φ8:7YMm0Eq̳9p76;e8<87 )(#6i6J!c#utxb4nvjN&q3.nB_+`:q8zT͚7X+"#8$6|Ov wIER*\6B CbKp0QAÑb;_qTYEi!"W6qƿWs|_e=f'nrk2'jo)ffL ެL]f&T41:/:|B13C!OLdJ&#,S/~=bU`2YS9M8є3oݙY~|fcH 巸zW}W3qv?`qN|G+h(_6}{85rWtA U;;ۋ/mQzoY0s܌.uedMkcsl;^y!۳YěZ &׆drC?CdNѿb:yQR9A;k]{߾T-R& a:>[b}2A'qKNߏ/~EaXc k['`-t<؃Bnhl9oOv ݧOk1T2h 2.Z/_{wD+|ja;Eػ NL^'wA)ĩGV*\| ^۝ԋ 5sMQ*ub*j |qQR,Lƾ$n/s-+)u5W=;MRX_!?t[84;`O| h\.LGf8Jһ}ObӽsO|i)lV.v/r bw'a!Ht@  %+ 4!mB dJb"RITl c!@Yh05Z!DR Y>ZYH;B BX:`D(c`Fh)ߴ"@R)e96|4F Jj eb%u>_Lp}?@&0-OC IDATnrԋ??ϿK`*DVS@X81 8VH)@D (Vw#2R"6QBh-A+4?tCHD&:Π#ҡK*p/+<'LjA{TpϮ!D! |^ݶxܻ3{Tr%9bqJ!M3/kobjI*A+ ]!XVl'_1=e{⥛NNR*`ðmUri10FE1-I8} ?k3pbac2j9rQ͸JdZF"{ nC|#&LK8٣6N68˰;1Gc`_$䠋gD#t9 a'`aqZ葢I~z*i[}<=#UL*)nOem #YTۥ&>'Qf (1ޫ`tG%>ḇQ,Vlp=4v/k9=7Gc(`((1F׷[,}LU56ji̢nu'Ygn(޻jX ɼx:8FI5.񬩙玲u*[y=ɲ_eYe}t="I$cla$uLQahi"l JǀDm:b FotV%;#I7 Ànإݦ5((E4- wwy^NJAHjrǶe1mW8 F%B[7FH|EXAu!2h o35)af<&-EzJJr, PL[(D#⬑&4b\pARjMݘ-Sj0BH'ZĆCʌ` wF4nx& Q1P(eb!Jj˴P-{A00 21X티z># #91L~>6L}& /}~W d]'M~7 [: `'; _P@1sa6pyd ?1aIxc[0]]XҏN~BӏٟNF|]k?[G7$4OBԈwi`櫓L7y;Ɉ{6[\p#)ҧ՟fmiHyT"_ 86s]6;!>@:ЦC=f1=f謦b .e\mFgICuQr=f71'ɭ`.>t {,NL3EK*A%~*un~ĖhV9P|k!7kZ[L䟣muH>gq&M$Kg9+7=Ջ,/L[#x&ѡ,kvvIƒ=SS_l*W44~p|[3CW!, 798llNha9WMUTB$4ki pK~oV{Fp&'$QmL^HzhVN7Qۂe`P[ m;|螏s`eǪ=WlѸ"ZQs/4[E,Y ~ / tZ<ᨘXc L7V&gzlIqjJ*dkXՕ]f[;;ViR^n<9vَ\XTkMŻI]䖱iC$Yʄ\H|X:>I0lPɳ>_m.XͰi)mCfnlIvvbs DM>.r|ݥ/2zmoӵ(Z7 nSKeTG 7Hu^1VO3Qnl}&kǸ&vɎW)19sU^&ՙ 3P0;Gd3P]vP Z,hx.R yTf1if|q_0 Ue0Y<+u`nl הT€q#֖$MSK}^1;զxmV-3:jtq X9"-z/MNfc?G1{7.oQ.Ny1A/إ=79jq='LyIƪ('ūGjOců3H}} *(!*a:nDdRTr-(-ZcMlH4a[*!<+C-ٌZ_0! mSB&ke?hO+c̳2j4jhJ`K FmP t%vDJbH3i6 $XRQ0l,Yl)E#8FBiB HEd-AiKFL^ r"k2Mp&BBڒ ; I$5V(EEbF'RchP2_ B-0"FJJzK=aqفx-

*LMA/LA/PwY|#7s0?p~)18: 7O9QgЃqx}˫ՀGIK}? ;.%kBІ&'f>@b(gH:[D#lR+qDPypZ+G?l];j4&|ͥ+%qy#s6;zf)QvߦZtgL_ߞ {X'ct2˛*Ty`jJ4vGK[ԚiQӒUЀʭcS #RلzYSⶐvC* Z5mAz4%;  /a tc83'izoOx`p[ *=Y\1 7n;.Xd۸K%ݘؑT4=n7 b/0i<@q:,Zdӯ b^}OKSF)f$yIٙ]{u JkSnlpCQJ"hYmrvɹclt) lW h2lW'>i6@s|@ oLis2X*mҦMFȂ2 6v_Q5Κl6>{A`2 v!g LMM>Eg&nzxFF &WJaN.0 M;+ [i5 <;oKaY'Gwjz\ }*(\!ˮΨSČ"zc%^ews$n B/b13!A6KmG4_i_2>~k1L۹C0Ywε;N̲LtXB Z"F -$'P@E@14 F"P1A,i26:i bE$J.JjDP&Wq["w+ S HK)>O3j??ghg8:g:Q~07GwqbM+߹W< w6{SR#ٖ}g2xj v>JAc&[bmlcM:B';h*:X9_7z'wyMQzyOrn1Jc,ҏ\RrņwG4;SbHP&H-a!!fPDε7Eҟoh(J^ ±<-#Zk(a}ȝ9n5=B-PgȢGCQ$!Btvx6߸Nh%M#R!(DZTUVˈ=bTL70A)*`C>e6L ~7d',a 04m8P cIx 2Љ –G!%#H<n Ɍaq?8SB{n]yx{5<^n|m8Y/% |M#rqBrW^Gb+qriȧ෾ gNƌ_ ܍oCΊ}șD3?'q?w-k: y8.=Vk7={{A1?|mH_X~p}OIN!WH940&ZC _r}ݻDTr@t\07OLU;a)I}Dۡ3ڸƜV\9D1+*pBceS>aI};DA0Fy࢏1ݫ!z"H'Mr8?$\w|/6؋[;y SK@ܟgw9v13OpVx/s[|Ph_cBB?D ]in%_T[a푽Ni()֢hF$od$5M5Z/ر3hum%(l;QMhur:XIKnIUp#=FYu0=^vUJ<'۴2ž.ݣ7n7p@ 6:*otujG uZJZxBBґit\1]#T0j%s ޿ŷےZ8MZJEtb "^S=.EC=Ƞ|%}@ (g/כjX}m}ӫMrX:ܚͲ1HEKy4`!:H~4jԒ^?"Xn)[z# ^' (Q}Ն = ʑ-, (i8J=MTE 퐲2Cd3C2V.b&Q21t*9;Yό[N(^.DHC7$d}3\.H CR!0XLE!% ,M!GdUAZ/i;ďfͥn(B A\2-M` Oam:["&# GJN! Bk䂐F+5 IDATz7`)t O Ej!MyMքJ*ؖdH-9)q$)&HGB`1kFMgG&' P "B  U"VCfgeA$(>1pp?*|r\qtj ?W}sq~>_xZtpܸ~JӠ290]&&rę8yȣ10;bHJ( t<,o] x뫐O!],N7OW߄O 'F|N{8`0KB1h}=^^(&DJ//û{_7? X]L|>=pqX,^/^.­Q>=^ݳq vdM^Zſ$-`'`y~N"11ډ>~{ȬxI0Ո^` =:V>c.tsC>"w>]2gPxǬMy1A31= %OʌXzȲ=`o wxCe/)Rۏp ~ x;4s{6Op$ߦJ]t1k  qlwF.`7T Pk`$SԧhuhIZ&sL&菵x#Dd-t- McY_5#%# EAB@w `. zpRf"<$*A0DBB(aFG+.~5rБ2@HD.!TQeD(T-% qE>HPHGi$¿F(oڛ/v5#_vb8 ,Dt!~4*Y"UCFBG'C4th-@:ȐPČrB@ĬTD JP|@GD"X-Q2줖gIv,#&TTT3CJ_vh/s|#ߏd7wɓ$&Wڽdgeۭu]X1 {:m"AHd5c%$U nD5Wia3 i$d!&h2,dfXJjA3@-NryA0.WXM2Tif]8EC4 F*L`q&%@Ɏe.*6{ @*:YϱlQ,J[ےf#8b(MP>٤N7ѧOuQMIe8ppb{FM&uƨ̎gitnu)-p鋤3c8\=4 DAFp dS-_:(ސ]aݐk1x.)(+ U}, -Pq H8AɲP$;wh2dA( aD ⣢KIZJ8*M x bɂTVQm)F)y“$E0tq-(x0ݺ«QĄf`D)|FT"8.դ9 +)d:va )3MO&[_S0"EQJMUAb"BW H )(j13W9d>$F`o}^3~ h r{0+]жcie๸"i+;w_ЬB}(-730|sK?Oc+N^cѱ@͗suX?{qY z_xX~<c`n0r^+wqS/0OWs/t .^!|ext.8=1{pnlO(|\ـJjO?"n[1Z,4S߇W f ?1Pޫ* ;1^&(Z E =fNңSxk0wXBq Aӽ"@..r׮X?Kf"Z<6ty zGghJٿNvoi ZwhBZh_,j#Ю)cf&QzV-S#1ݣyXa,3+J 7IuL7 Arg -aev9Z!Xᰝ8:+O.ˡnM 6W=2hv@0E'^`'r=\bojvoIiS(yIaW2d GsmBx} v3$ F"!S"OH^&t"¨P3d|C( jHC#CbhI<fN+HAG6T:D3Ba'tL@3&R#hZ <[H1VtZhn;}t!N teo:0WX)z!a*d'xu:ZHɢ"48n+=;;~@)XAsMĐ(?ww]jEmvd<0$D *dUo"~F 2"í*v;5H)XEDU% ! I*2D"tD;bI#qE7W2@ ,@(GB'UQ}-fQ $fqDG# < R4"B%N!BLDCPh(%"`Ax?>&(7Ws͸Yi`HdhDBX^Mtԅ(!ȣQ_(1C D ցJQSz"@4"DPP 4@D@pU<~ajCϡ@s38͐y莇%sʂ-!7.E懻tBB &w6pzYk7I12m]7K?7` I"(Oqn9˦0"UQm31tkzq~ A1C=LL.X1VNN1ۤ\śߦa8gxE1fMӼyIdܠUMP0íQ&;0^duw;!s$gӤu4ʃr!JWTV#<d3n3ԝuYژaoeR&\rrS4wlZQ҅J Zs@JNz&_sYPi 5F4nbIZteJ#hfgtp""%+DE+3 v9A mz?G^iS.Ly <Br@-?-ҿp?~zf e/L@S=DVBg'xbpXs|eNL\%˓w].@ns5Nym虣HM|iHe-ڷGpS,CG dhc:&J:3d\lwPbObZnzR#yBX#H;UD!B,d)< O<r2@_z=7g{m!H2"\ᣝ=O4'O2q2/ QJ͡ǝGy'~~qfcFk^͍xC(<N,8KEMcsOȍwGoO,ј!`9O#ugRp/I;Gw>WuJpo͊Ӹk*W7~077`(V ܟW5>ZuoRv6iyvkRe^D YURYQCʋ>;}N˭`ۥ!6V-Ikʊ;A yJwPE+9^ Y35ɩxkOǾzs(on!OcaW8/,Φ5}x fSGOS,Mi0N6Heϒ#kd+=FYn3c5B;K y~tyE"FiGǘ_x}"s\L&Cw5ԡks,T^<žBɅ9xJ0[潭<+tB#/mZnrؽ>cXETK(E(jI.*(0 OH~ GYRM)de1Dsdydc$1G67L c4K:/WKJ(p Vk{Ivn,c$'Hϑ"6"LV(F.MLL᭬(e((a J" g3؜e4իf5s,|=w1 t.! l1$m CKg`d|D&-Mf_;%CL@න 霆pФt1zuS[ #f/L5OL7!P!a@U zPCEmYt9*hЛɰ`y=C'B1.Y hjP6J4nxx]'./: Wɯc{FF2N;rLz% *Z8cç1fUb:Ȱt);&&"+ɌȳuV7V/g i4#!]b)ÞgL*S$#6(84=S,SY>8I>j:j{49Hݢ3ѳ!NMxBBn[>oPmhMe u Y-c$xͫ3"[]]F{t=5Idfb&9WyXB;h+ &[cՍgQ`kR噍$K-Cӌ!QS<*$2QlRUfHv#2 Ogܛ«if3'h?օfkh9\va^G/:E~ڧ{*U*#fm{&S$z F5yOf8xks|<NAfE)@#̒PBSuR5Q{Ȳqi:b"An-Ng2W5R2zD[TlYh+c? Hh8ʐ(}J5VNPsC%WpL1Ɵq NyFcr+TI3G2{$P͠| DYn:f e*w$45@br$GB9H6|q\_a:sSR0k'#M|s@R^$n uP(2;`j:EaFaӣe2۠q8aZ&ejNwo_))琑0m&}1!aD L6QbP r=C$0=3dG?ݦ׋P*Jjl#h.aoHW(by1*k׈PeBaCߧ~"Jn>Ku0L'dq ]-J;yK$5!KaN IDATA@aD͇mոg߶VQ~JTO: 4Nw@QIe2X$kd'qEDM,5JbyzIQؚ|I B?(U'MCLA>="WRgYoY&onSv]U2(aEP" tQU!DF*Z4@?D @T0BTBPrx.bh >e"T 0CPH/qhHK5J tBiCmQ!tUF&Rh2NV(nbA(6qOSA E T]W17*,lU6meln:Ib̃uMv٧XVC,њ3p7qeNO`)UK>E;Nb὎H_]Z[rl`=a}g/wp (ExKt)uz{\.E8vyY8lKb+Lfسj[%3IuȠݒr&m\}@뱮2;qm`9!MelBۉ5sg>_;K6,l%4m֨?a-UN9&">>EO-E˻Y!u[gj{ GKso9}9]̍"w-rCȨN0_㞘c򼕛DIGm3L\`| &'4-^K5)IE[cgd%i5}Hkc._0k\b`tŞhF/AhE^(sO==bo1[![J"`~CnbL uhIGL^BYR`yqj.*å]jԽ]߰t-0D-\gN1gһa^]xI١ 6]'DT95}}d }p, (>a.xz/Ŀg.>!o 9NۥQeU#p _x|H0zۯvpl ,Wazw@Bo@(A?X^"F,r$B&l Y2/dYT9&M0V͌3'*8VP$a!q7B[D鏣{ޕ$;"3);$BCvoQvӈ #i-Z@i(Q>5а\ꐮ %uvQr鿤֙ 6no섁hi+(^\d:̠RGV([!AA"=4/++3^ߍ'$NZ!)J!gS6&Є?`89Wa $_#n2s o7؈G"nѣ O(j4ۈCrIˮIn0NM["*Ҭ=~HWt_ަ>'_@?7=&"VFX 3֐95{ص%5V_#{PerQ|~բSxMbdvC6YvCD Y+51vc~$1ʧX\j8䛇}(L.EJsxy/v v񿿌>*-1FbG]&!E2aǪUwuXi];R̹/H "riY^񕟧#wP=rnZLqSu Te;G]ʳ:DuR#24KX@B,Rst7*8sEwH=ġArf}嗥]{X0h%<^[VO1l$ˆ/8ʸY׈:t$!UUaYXNUbp(p`#9CdaO;c#)tPh1<G&!J:>A E^'F¥v!0)8NG #IKl\WB:O )"b1dIġ(_s-B6<ەi`Umzp&&Mt#Ʋޡ;(c]s[}zfk"ԆLDwiuަ 'k@S'9GUCAR GT2L"#BveC)BUbrpn8W]as]7==͍aF,1iSHwDf w)TE~CD w{+%tD8tCb^*dؙ#0lH=0p=P6oZVrIBQbMb^aHJR`nN6kD(ٌ-F~iJANVl;}sD}LSlʭS R{Hn;k@+CVT٫I_9J>#xbMii]CU}:/oS{do3eV!Ec`CSVpֹm[>m{<.찯A#)qԡ[dIb0GQK1R4$MdM2y{:~ SO2V*~DMavhM'h\WV,fʐʌQ<}>aֻT|k[:Bi&W U N>1 =9C~X'oPT .?r.&S/]_fwK pSPO} G@po3@C=s2طl?8 D ?8A'شzf3.iMBTcspwH&\>x*%SG9wpw7x >A 2ɖ?~`XWa~'a{ΞQ-Ӄ򏜁of Az:E(?Xމ{S,ڣy qpaJ]dNU*2Ud'H98yg}f$} c8ֶJ(p* Bxx.R ϰv$R1{ pUawa; ȡ(`UM8߬axkRFnT<g$l a?aJOZn1Iy`"+'8e. 3y"c*>wO |.%aׯP<֪`:da8ޘҩ*qrZ7dO @i~Lڢ{@戍R8ϪmM?N*$4NΠ,#Vޥ>"ˡ/u%-Pedl.٭3(A“|v8BT:w*~r K {2 eKokŽ6%`XLXn=2;_; 4"]@%;GyvU()"#b' 2k mDdB c  y0W=i,p¶"x"EL ܞO | Z=0nWy`5w]L!XNWADDlHX='0EO.C/ E% >D׷ q v*vL;m,u /;"-t4BBh"}jnꢈ21Mm8-*z?tϠNxZhP*809 QOB$$Zef++ē(cC<pM-'K6^wqCeQTDQ=tq.~dZU=^ؿs OG?yo-c|`oCy(g{À; YԀ̩Ǹ\9dt|^D&i'y' 뫯n.٩}:}F÷rTEXLkFrWd%أ+Lg=O-IǸuNpe]~|Y]2ޟǺjK5;:@r `С,h^8Mvǭ ].W.<>>Ov5e<}wG*~_z^sQ޳'ٍnpoq5J&ŏӧg5+0&d Zn&L˖e|bt7>⮽be"ȢLE?eQɆ\f*# NRhϡkaA$<3̠G3hmݯ[_m1G\ X`ٟ!!:1|ՋSl1SYt|AT0-jl/OO>I.FQ%pUj|Ww[n -$8rQƢqB(~_vCNcpHljCH.%()\ElE~ݢGc[ ~s|~YK\i1&?NMxEg4M2q.7adF'<$3c~0|AY q5''ݫa>!c91,__>M'ۮV$ 0?0jm_o_ŧ^|ce6|wîNkC9w6{xڟB3>f֦+W6HS&DSI*7M.r@OʚA## ,:#jGR3]iw, q{顛\ ?ܤsXRk=zfEAtF\ Q?yQ;RCCLᙋKki$^]xanO!&9QE9N*N:6* ^ƛENukVTgvvGYm]7~ s|ꮈMFNRlLm X8>yOhxa?T c>dzEI1i%bscYO`.,PI+opnm#̝#r׹Pc5z#1`uMd#Ȟzbe Ѱq<@1}#|%JOBvyB-dpdrH>>R uD_Q,HxO0e'|졄xJ0', 2ha*V]\KG@ A@\\_@Tm|KAB ]Iv0VjX芌"iHH+芇9Pdy& -H%FT1UT״ F%E%l]R&QEGp }ܐGl!N=ԢrFdd5L|}H"9Wpy"VmܷAɡ.#z%KJ (LIhkF( ~OmLנAFLtH7Oq"aUA(:2]J3EⰤ` eRΌfH'Yѷ㨒Ÿ %#q IDATN V^fD3,X&TA 1HP8,lj+lC8A`@mdL r(*i;{IEN7Ԓ6hczM,BXqAI_A<,Q찳{dAIxbT?[WJ\Dj<.6UCOӹs۪~bQ>}G8;o18rl~xp6wgy1~?ɍr/}.OT`B(vuw ?^`3"QvW5?86=v5ǥQYN{{t9K6iAY%cYߜSߣ+hƯG8=30wmǞiI|[94q+u<}۬]/[4fߦ^"ZHG( sMĬbе$Üɝc=u/1|8J: i l׹d`%73Av`_4=8Wr%Gx.|@_v k)~hb[*7pSs[0|nŻ7 % J>לݭ 6G~q%R&NF)ݢ~~ġWYF:lŴ́y -EF|,2qY"ѾO6˚4Ƭ,kXߡfΖ)Z'c0CxeA2[ߡX'u.FuaRЋ8#?F^I"g֩tBLfA1oKr)dڛZJvqVez! 5[ 5CoҮ8Dk}_bU+:QR[a`#al# f foPmADiPڄUBJ$75t;CCİPctDs4McXLK1n^heAv,DqhTZ$Jrg;"Ǜ2#o"IEA˴WENk*{o"d'&1H-#lg1mJf[';7MWTlԴNR~_faΉE'g8rev(4Bi#J0Eldp%l_xuA|S.rзD\!( @G`  /dZC Y^qM`s,;t ! ||1h88"?zez+ck8-Hxn fL;w<WpmD C|!_\3x $ykݎ$` В RmKOFkOd~E! >яfIK+ M<:IocA$-=ʵ/j7P(ehl;fpHe( i_!4EPbqR-ck`I!D;B;OF+6G7ﳨ#۫!4 fgnǸ)jxm7KF]G5=66F u1ECnfYUI(w yaLq$p&Gi!b5(k3r_rhu|ZOb@#p6^BGd@;ޤy5n,J~ GQb7Dk]\>vqc4sHFKGqI(2b6\df̌,(ŧe'-I(7;u17&)hYwKo ;bc!P}kW 7䣪\O⨽9 B|7,LIQ v=B"v?z*֠w/~&8˵ p]YXXrpS}?7`p _Cqk++p*;kr 08f+ώQZoU5LK ^TQ9 , q(VRP:/-ODثDwܻ!\WٔD&8bNǘMhn {@'BAAhp]`ìМ0vV2,-p4rڦNI'CJ@R"Mo4C)ⲊߡH &7we &?pnq ;Yf F8!Iq}gR.jyN٦OtJsuNe9yx*cjK1Rd ]')ǰAV%n['!TG*V'an"bھYGz,M,;cxO-:0Bl IIZA"C䆂kaAԢB:QLd,O&=»ueJKGc7>o"&A:@ղFFXۺGJ dB7e[I >40P3ER4V$j+oB *m1F1jj֭`i(uF;e] kMT1@*_w oNe# nRDدsWͅ8 491DcM"][@$ YlhuD f % $|A@}$d}PE\Hq1<IpE|('"#`K>2p bpl\EA=) >KG֠qLc;1b80;lS$ >!u<_n56 f8Y m =m$PlgvuԮGS4HyĔKL)GHt(*uֆCcZ6+%T!Dj ]i ?)`v-l30b%[tB!$K=dʄ)ЬD ¡N7jެ E1 #u\Kb+ë=uSE,T5P*Ț8T6Ct-B6FPdH'd3:̂kDsxW7IaN bw 'MR#rt:fmTjgWJ`FtTkh;J'F;a{X8r\h`elzkIy~k  Zܷ}YQ: ]De4˟@Uqg 6;0 Emt 1"n/1+B@Y$p6~@a7\DuMKD z1dIxZ~)ѸA `:;$[),gk",]!IijqG({M"B_)T $V3b1N^UDГ( ^$$}ƒ:f8Y y Tܽ6rI0TwI2p;쭛﫻! h=;0=AGEq!"^r6qǧQ gs#I԰ﳿPfrA]}s˯s `D4mqiZK,Uk\\V+Yi ("H @$;/?.ֵتr=U_W=tͪa!"QZB+pIјs\3*;Ha!tLT'PrKY^Ʒ~?N^e`W$CʣgU)O v gm{,.Tl/` Y X ÑG;aȍ–)RTe^~ W21:j6\pSs8#"Q@J23InCL" @F9Ҁ,4X'x)2Fk,м^hk3y'zk~J}ƙ|Z뾞 Z$9,-B ++PIϗჅϿAw7^^I-M8>_AxTwO;o):EgS$@{6x9 _~~ы|b`zEK?o:{{O.mK]w|b~q[׷a_ /t>^xƚE(;7GnѧCg?_*/-d)a/G_~?8o=ݰ(d{z?̼.D&Jn,=M6&) ߶Eupo/ѾFچ?Z\&_îL36؅IW763oRF)M*y/i: U! IS2v`EiER ,WNQ$UM v{6$ͩJۘP080;k'7ߎtS5#vE6͇i,5Opql?0 :I-yzVH[VRELb5]ow$5d%6$&7LuFl m,vW(i+# ͉3hd(KȕF kI2!DN"4n'QĩFI49V2Ԧ$bp>.&&|\[P4 s߾I{_}Tr`>dyT5jb9ȎKА0#AYPM&Z93]A]jR%Qb+ó81[$ q,uHbMtC),!MDO /d,XxDD[8Z!giYC +ӸoaoF=7'5\Gn&̓dMєк%\)._Ͼ'˻yy^WjMJ)R2{5$cMdiɘiTqu<ļ-X JV[r8 ,d!cd7풆1DFѫ#P&&:1rSz,.cUr# ,6{(ط ;0HDm9l,[lE]]Ƨ*aƖaLŜLi(f (a1hJZ j ZՌ\ϫX{m102FtI 5 r*Y 3*cdI1^4##e2H6!T+Gܤh!w-<'/jHӜT,aP@PM (8gP]E2PCN޵][Cʵt#J+ܱE5z !5@) ]E4(& 8qN'D`1%d@WxS.aHwE@;N@Fę?K)ƺ2?_w "xk|+{68}xۂu>܀S7 <~f޺X]*#* IDATm}?wc2LV`? (ex,8ofa\G/ḑH=,8+dBuI|9(qAd4V"=&d^f84HFCTW*/5h3H1kA"ROao|&Cg$/z3{IFYڄmCGh#-H\[h`Stu~tcD [ 21:ȉGh\$#T+C&3 C B0ϐQ$9>Nmkk-s':na/]7}c>vaE; /mÍT;?xD8wz&KGEzEst E֍ B} \نS dss|K߁{m; a׊<{5_(zjPu^ !|RRsM³K}oNiV-\B])z;p`_z yT|x4O} ooNG`Ó/{,~ fgC wi)_=x 8r&D+_Ϝo6**FAMo1T &\u/scz@og)ocjT"8U܅M¹'J8)U0MFf91Z1)I!.diE,%VC6r2C&"aLNQCdqPHpA2Xb20a qevՏFSL(-w8*&N7}C=dx^u1{Ӕ2A&6Ziڱprc'HKrUeH>tgJp,ȸzitr \)%M.I4#3!R*Qz( bIfTlVQl\j"(2t̀H څ4OZzKd2!=AwpcƘ ihvzfN~<j.eud0ObܷN <kM:{?l0.L4#gKVfrO`9;^cC|I6_OCQ4+ ˷p,r'ƪiaiCkP i2HC+dbȓZTFylA,,Inz;NZVtv Gsкw|.fL3W ,dt-Qړ*.Y+ҟOAͅ/+¥#=|xQx5)Sn0<q3?o=Vȣ}&Nj3ˏ)~gK)v:07Q0e,{ X 0.g>go*kn!oᮛ u |a? s&kP^x8{,`Ђ7ésppZ-nC]%Xkؓ;,ej3A% bxy!H̤}>/9|SE3‰mLm? w5[L߆h^Ĥpbz\ϸ⣂]#uzr?YӰQeqˢ)MWca%Yj9edDu#m&;$:^æ,sܫ3%lfÄV(MH-Gx˚8W-ۍ9/r!ʗ̜܏Ku^y{>YH1OQILOϰ}6(R>15DkwaC_wIWjKz8iS i?K7ީop?KKl1gL3LsN|{g+*'|c[Z^96#)zsG*IкOw8=_!v"-~fO+>ZH4Z4¤yAֶD%#$(6XV:G\x22 &Q$rdFcaah0F"1A"Bʌ8aB LaHE }Cw|oeVKO4U/\r$5X`P$9Ȁ$QZȐ* ׽6b -RvmdbH-ьy=,Ajb)@A.%hJj€q&H޶LN@m琛 li)d9oTTO3WtvW4&qw5ILMrԡԻL,Y#NPzm͜gWqxLpdM9sXhX L8pv8hfL*Is:R aD% 7QJ1QdR6(#.Mq[ý|I#,91E]-6q<< VTuǮfRͥ s+n{mXd1VɬhTrj} Ig4(',ܬM6 GǞg!Xc01KgWhT)4n]0%rF1lll{ 11**o,fko@ P bRi,H x(G(+XHafHk,|Dg )=~"U-34$mrF`maB8#, 2wD޷RNcDpp9 E]p5nPIB ߎp(Ѧt$v 0aBY14TPHiYjȆ=TP"a؉qM%L"vi7,SyZ $zH$v ;'gx{pvɡc{GȮ(>3]P?{z/g WAncc` pR0Z->u >@!> !ٟ\/ïmC-g,{:׀K7o.话f!m~ҟDQUv`gTH;߆8RT[i??BlL;Et7}^pzlnr[u>^x'Ϟ?2/|poTfgwrq5= .Tѯ)e5&`ԇEv[ ,=t=J&9 qcon,sAt ofOF9`-ߣ{O?W]rӼ%Gq."N?3[D>KqF9n~f0V2qA3o,0{iޫ*6 ;/|{-\ғP[}5>%o~Cqd.^c;<VjyΣJ(dY^55c`g_}?FP^U7!~3;M mb mIu8an;q/fYFOi/(rk̕CXo̱y V1GQ{7s_= {2KK>>^oyi^9&~"yρ >̙B~qk$f\jX E~<>bH³ pNջyKԯ_ˡW9:˝Q?s{z_gI]Ib_=n;s^y N|[0?y5#z+zGWp. Ä|р=yGLt?G-^ٟrcw9eM8K53os9^{/l:a~wbWy >oS^g-x-o=54-}4:‘u֓ pd~°ك{i\KPv^'_ĈW(pϩ'DpoYIיSCLU>Ώ pDFzd?MMH[* 1N +ω)N]yT B)DEw@d"cH.X"#7 B9 M%HJt&Cce,dX ,C)C\ *dRENj[b]xGIlQBt }- E3 ѶB8y[}i9n7&N5T06B&D5SXBe '1*8I 4d,e$YHz$.(+EIvcuJ M(>H, 5{MhF:+wThlX|^cYTc)䢇!H`3jlkڣ"zD$v\]wTblFFJņSf|{5T( en>~y?*Q1 4k Y23ĥgsv 2Ǹ>W ٺqP9>ؾzSSbO&l=j']xG֞& 5]aM0dwp{rPwG|{%# sodIvWy/^[fVUYIUM@- =Y Ct@w0 HDi)-ZT}̪=##"c)Df6c%"=_9s$H1.k'.Ϥ am(, p9Oz ZIF`~l}1Nk8#gyL2#:ΰ$qBx&}4e`F4MHҘز$V4[H sr~_r6F@Aېa%σ7Kg?"2/e.ҎyUkA Gc_>?,Zʳg\]'3JTЎ|/Я *L2y;drK߆_I;2g6|ꇠAs_ݙY/?K?9s37|Wc|8<2w LQf~[j 0gh/]WNnpWvF*Wɬ<OnV a(U '0wV`c)'鿷K?5~``4QIAwwxyu9pk Tr yXD{^ܿ,!\jypd[\fujs  I4F5o|m;(4cvGSʭ3-F~r3ϼNzi9;9Q.5ߤO‚}ߥٜ>_wVȡ;;ԟX5+7I&X(mߩTԫȱ鳻MWQfqg=SW =&1p &nF+'ƩFlj Gр|&[G0EQ[ gtB۵ ʛbk?tiڦGXQgMv5P7qO,Ai~>/p EHlW[ `迈k#%!R)⡀ 4BKbapJI2Y~&FvM@dKZ4G@9 -Hu(-t팍Le,l*t O o\_>Y;:(~G@\ J@A0%FHб{M!DIS,:ZiYhP 1c6Zd*fd BC(h(; V{+4A@d_cetst!aG sTн!2y1NJ寷~PKHë8mhJ2$q`;-DjᅚԕlxMMi-m>}{vEIbdg7)*K^G 'TŵMO1ɗ+[t|++F㜹~\}y157!.8VMz1f=t6 Q'U]i!{`ɩ u2;9˜m薈ymZ=Ӓ&R]QaL%$ Ŵ.X$)A``Rɀ|aamgThvBYBб4b!Z!~C hX$NLlG# AX=F(`VJ h.^0!)&D/Sߧsj9Dڣ- ]vQHf 3!]vء?X&ڶ *s;6r.>.;6<[\۬nƤ<GMƸX`-E NI bD >T][=Sh4 >~>/S:Cg~OKy*@b".p ~NЏ|W~MNY8{&Fn#cNWtwc׎KS(AU^V8lڷ+;a?r'n^E# as!J /֗y᥿Vy mElhZqhň|s9.6Ie`g(yB)8` Su"3޷?.[Xpr$nѥ~dcb 0-ң Ҙ4A* tlOgbafʇж6k20Ϥ퀕ϢJ`l2y 6_ݛkPeXbCzvF26F߅o ?nxXj_|J&3`3U}6cg0Q?~s$iO`q/fYQ:Q۵2 o/4\ق: ߸?AXmz~ɓk p:|pmz> |־0\xp: 0t'zG`c :/^J=8}+?̊kYY_MxLMkp2/|`g!΃/ TU82A?u3 XAnr?qA6h6-8zKw( &)/S]&OXB:.WQ ikX3TK'\*n#]eM1dBR 6bfcW;!k͒D@?1hr$G,7hzCc.a ˫p('선6I:^kc8FEVN#{qD3<@]=-sQ:jre% O0? u6 :g!d:#gwL |s5F7Ļ')͞׎iC7w֋w1fn:&{Ѓx~¥r)g1*Y<(D0Qg}/--S]-#NFeڡS9J6:O"vP:}XN{hbcB@eXk0*@K @Z75($ Cwx(S42#qڂ#Hc_zhs$wfTh&:c}eJBΎX B+0EV@ -). T&!S*m2Yh3E ,*H-B K7_BZ fT )vu3TV\xH= k@aPWˤz *#̀\EV c&V&+`ubZ !مG?&A4Mrya9Ei:ap"7:HET"&Sb-h!Σ9d2Z,b)h1\NcJ2F[czl&f$ Thwu͍Ȅ0%|=*϶賺B.Q! 6 (:"u z8f.%6رca̙v0{wۨYk! ǶH,۔(E똧^~r3G~Ԧ7Bax +`otKj@EJM)E ,IrR["DA4$T&Vu1)&I\QLmfHj(lW@MZAV{^@͘(j<).9,!iecs Cǐ$@fCl΀P^0ST軻$T-)@ssD$WqQ$pЭ62NjT5H*B>dό^=ЌR-MK[Uh߲IE4GQ @]RTyjrmk@F.ڀhD(AL P.Qwb[@gX`|#IH}vKS>x]?":Ʃ eV"4K<78VwQ,/}gG<Aև}{ .| OʋuKb:2 00 =4j\_}yS' GٽB>E1{$n*Bÿo`X\oyUXb.q dnTLCoXwJXCGsa%t' l3wd}l3Y&ol6ÉLV3O?Ozh inQ8: _#L?pd~8\Z6|$֓0=EJOç>ɩv-w,yef^2av.~eշV3;3`Ղ˫YUkb탳Z6GO5Js0\315q /<^%+b$/=w6CXNwxg:t&<mϵ96C$01 1U QP"Wc=FEw13s#Ǖ""ghΰ*LE5WejIõ8Mo#;׹Ča(I s8}Eukv3PMuT/aYK "N4LN)U!U٤$4~~fC24畑 C.C<5e%3kmߴvvmL:NX"FKccۣ66]9JMۨЋL*jO=Q ϡo2=%38?KxRvwr [Jw!q= m:צY^L-X^^fxu/ƋLĕ1lhZax_cYlq9kO;Z'^X4XwȻ:Kɺc59V1S66 9ɑ[^GgN7ؤty`}.$J)NZ&KfcVNEgpݠ*mݏ3L_IƘVL]_ӟkb֭_g<9^= /3]qoĒ$[c|E>ɧT,/asϖ|'Kqe[> m(lXf2A,XKP|WP8"tC(D RSh0Ld@ 56(Ca CkB!5oE B v afQ40}Dɓ@ 2<"ABj:HeH,in2IDYZ%QJJ DY6M HQLi-:cM4ZLHm,I.:LLS!4Hfy8>-b0wh=FHT;oQ,MۊО O* Kl6Fk,TV-YķsY|;d0#- M($1 l~L1LCdDH`sЦ#ϱۜ@no?^*-_G%}Ώ8q~f[к )|_>Dm {`鉫\kW+)0HoaV I_[H_<}A}o|-w墏lBBpGBjd IDATɡXXFAF)q?p;s}D}T!XiDl,VnY|Ӷq~=A5 }}9?{-$}p&N1Ôԓ8:G$%nh42uZLl 0TT#Tp5200SX#5zuR [nȃT 0,gIx,̿%y"e K0;Οӿ3`vqh43֋Uxht2p0|Q8q >tɕ?<{vu?''߁gG.dGnal;_m {~$ 09I!?nSOdm L }O}dzc_XPü{6|Wj07ɷ0,]nfVwZ]ÁxL==۲{p :\sGg>xL .^e}6{+PZK}|@rc621.2ニ3%z 2dFKs.])i)M<}`1^$OPtX&O2Ѯ!ҧvZ2 >וb+fǐ6g\)+lq&y$C:p%F$baun1g10mj: i:4 )a5΍9ߢblwi)Etܥjl=cECV-:--S4J%*2s65k -sP4J"gcGiHH2hJ7.5ݾF`WAZ n4@IjhŚcգXO~HHUӋ!rPQ:}Gsr0h/9 ai %>ňMRl tpXf@IlOP-%78]I&ڄʂNj0J6n'qQ{E+aFZf+Q-$I:e:iZId&l=tcӈ>̑ڌ8 *[M |fTk]?e$؄է6;},-B%-LFڟݐ,'o7tkv-H ALՁ/|ӯ&J #ȊZhlCLvI#͢Tm|1~{2μ=ppړOaver1e:BL f 1T J28Ff ʃ4.z(%qFP |ǥ DET(u\wӫ=p})mg@=(D@c.;Z{'n@s>Xht݀n@l??D30-Ge k6}6_JzG}! *á({r q/l\[-z#Q`pʍ Mvm+665= P#$nET-Cia':7wY<̭Sx3 DGj Ff؈9Y}8ۯE^ޚGZV-jB;S|̖ә-!:uM|E Z?s =vN^a4ѲM^ 8 4z"Lf|]d[#:^p XZCW rGql8b6,'d\ a080fzvp#0Cp ׸R04 adr`}7ۿ eڅS\%tDŽag NL 8\o3ĉa$3 ޕ]7@@! %R(hiDQnwGҎi5Y )C3DoF7ڡVuygd7DucwSNfd072"}5&cP^= 6]g0(R$ٱlp &F5LeZf^s( vqFE#TR n&z1Y qYT#TޗF]-cMS8*\݋1OQ.ٵ|~XO=r4Eq-`8;K";S=RgE)}d~n$P 82%yLem*Mس+B+Kϡ`6)~m,zyi, 6~nN@@Cc]gx/omw56L끃xdNџǪ[46<{R nS"_X=@.ty`ϫÉj1Ax0à mc%?nx[5b HakP6LR~rd-M;6 1~ l]D7Yh/WK 4@ |SnSRn}W>dc-O_'+98 `yILilO`)%N%ʝkEJiRR $ U_G++K$+vF/n|61=,4WQm.v׊dŭpW:SMdbpCGimzU!# A&R w1׹#e8rF*3\oy+)Ǯ ŭ5V44ew c'٢4>k)ܳi=ͰpMi9ƻF~g߃y6u$~gK(=$EJ7ѳ6:}"E|BأW/8fvr[++hz@2 j*E l hѫutL=J=+e"]Չ2Mx`7fiT]J`RFw#bHLP&&FX G4lDף)_$g[%K3SG R 2NӺtC-gcezNCJT,4E%Qr>nzQ2ʈAzM1%Pz" I]r_H<ęlHzA{ErtJ≅dMWr%"nʠŬ)Cm\V+yLrY^6YHL rJI(*fb5${ b zߵ}4Owx'uRAgfW.Q/2uNɲcxcmdDáBsZ D˒XE/ٿܟ~gPt<&t޺DIɶ$&$=h-υ/BcH:H$::*Q΀e'O[txKdka҈a uW[y[! U\PJvGRkI,"m8h8Br˧ՋYzDLUQm6 K'#M/;TGUi?|`S'_ۯ=y DO Ts o~v|?N6.C|0y7T͟- &Xq$1a聰ѳ_ ا`DPz/#Gʫ3pߝQ r O^,Cw<\[]pΐ]/XI&Q8= \݄=}f(Lt5u+;n[:e{YMoRY~G?uJgKH 1t㤇+$6u6]wI.7>*f}IB+@m1[, g2m#!|/IT<7?=|٥pY˪ss&2bLJ4w;XM(U>oΡok>.^]?S&l|ohGō4,N~#o @9q oEVdbKJoOlMS">mޤoɪț-\:"Z*4#AyC|s"@lܚg)ֲm焛a7kL;-yT_ uWe,–.HErnq+Zab@AĭF>EY6B ܖC,P+ȻUj bR.#7 ܜ/H+~?1mT#W.EƺRV5.ƈ Wԛ6JPo0ȍdv)/ؐl.Wyܙ;AJ[Xz\&\aBd.}8T$Z8ik-lNpJzt#pdШN) F|N,Y!q)uUzoЎ)4dy"=*ǽ#tcЈiH[TXYk'6*QZJT6&A,W'Fjmb]̞Bv|'{ ?p xLC|{@QQ]WIꂲd$lR`C& iIԥ.5 ]9R:*(,HtJ7Mǵ#FeyJz 0*z%A WH`O2`X;ͪ UM:Z٤=paV7d(iC]"frT]YqqI9Z'f 4)Ç3lP4e?KZu.e]R٬H[5u=]`(vRiae6\n2XJou[%JI`{8-n BES<ǡ@W%pT3(c~˵*uU3s浓D*D4&ЄeBT"P 0L]vPPK@@ I;-XcS)PAHO /xH$ *1%kDфNTdT^u,emL]g;u&iK$nKЬ /T)]9RxpUK%bHD^hD@ ھCPcas0MJcGQ|45>!i6-Ž $]('{xB"nݻe0A$Jp^{?ּz^X30rI߹퀄`8] ^3۠2F:4J砖!|,=W}6ʼ^y>pm_< Tkpv8gW f a[w +Ex"寄L 񯎇qĀ8)v?8/  Y?Mm)D ) *P,l; r„ paa0+밺n5LXOze/CN7R=#!JK0; P??X^f:>ݚm[$/[4*M#IwRż,׹5N}:"[ZP<;6JWQM`AXLCip#uZkc#*~Dbc 2W5AhqLBdf]*er>Fnqfu.~IަTfm #, ɓ{xY.3'4C T*fV$fvjĻ:kc1j;Rd cfU`< *ndNKJ^=LwsF3ƫ:]Z3uN&YmQW+y۟-YG8` `j f/@x]ATl |]sqk.^C]5zj'NGSc׹L#A摑 Hn7**1jPl5* '0d$;v˴qMAI)6Jdobt$^Jf_\N,{J+0o}̋χR)>6/9bjgϑ%~f7W.. ,5{Wgx4eg=Owϟ?E-Ӌ-9wGE5xq}U]DY`GMf1Pqe_HCv3*O,2̝8'T}*#:NFƁ +d"X\`~s'_P[Q^=oq:oӊDMоc/f͞/rU(pAB"e=hXxj;.rg4G]\`=x{7l%Hm?̶J o{*]G]o9;AJ| / Pd lʠ%źEع;sF4&R1:{\?0 A eWa/jn0sN< | N; vׁ3woa} "%pp “{'_G?S0e+ C  ~.C67G/t2`؊J_)KÖW7&C{`(=GI { ^|z M{FA aqAel}χ&k &W`Kp\6k"=(ŁbVTq:i?Wkjp>::mEڌlgeaTƵ,Z^}Qoh- |_bDՈPP]J!Kߗ;n91ߔ!*>bŖ(;dK}I܄E(R Uo{KȐunEL"uНZ(24 -u 4 tbc]ʰΚeN@bAXhR*X-.![2b׃P*"VB@"VRݪ2PB1qn)n$LNHTAQb BHVMSxW/DZĐEI 6K8b3$k=? [6xrK僘)(mVy/{|u0q@w'M1J5]30ɠi qRwx})Zy6{}kG,r ni%G=z\19q{fdt. ${MKO=+~.&ljyGVq.oC_D`bw>j1Wja䔍A5qu&;g,QI1xFDa;(ۇgpt$k«92;Mb&W<}}cc*՗rWCn6v1Zmkd]Ye o4ȷq|2C ]f'cQ8`m3tk7݌yo_IQ:doRMk |v+\)Qb .jvBꝛL_]b:D6r7[hg  fh%Jՠ;ð717J٢r0cj+ƩeZo!e"3}, c'IS훡%70jo `tVq*I*) 5LD/ї/Po>ooEХEL7$8iOg gk42|+~Rq&'A*.y\e6;6&1>ug+XyӛԜ70 anOD`*S>ݠEЈ~mSi:٦UH}~2 Vpe2͈4BG/#7|x\ Gqm |V蝏D"pZOAۅ0&X*t.C_/8M8 w/L] j͕͂, pkǡXom!Sk#'`&ҟ¡}0Ǐ'?4PjV?m8k7«W{Sp_=Wq8ꐎL|_U89uhwÖYoNÇ9n_ kj*4K]0=p0ThpfavBhhV{C[v* ?dϞT6C< _[G Ā?=i ,߰Ƙnq*:AET\8R#7ZafyX`[w[h-]%JDhŻx2թjd&Z:Jj$X;O3ѲDdHi63t{q*Yua2sD*ʆ=XD(:SMF7lZߏ318WSK{4X'Q6|6kؑq8QD6R6) EKGM24^5`xC16T%uU%P\d+nmoOFBF NR(hd3'$u{O\e)FT׹jԉt*$7 ЗV($whul9wPvz~BEh~Cx\,'0,vNtF:+dcEIkdp0pF$B 91!pE͊wX1A ãDFN\$e&,v̡A!8 J;\GIx~c<9<Od4u=Gn\׎ ^̢(ͣ )N!y*~ _'EKK;5\$It:FGa0a8 5B:e% qTIp(#eANJ CLwaa Nࠣ Wށ.O|~ƵsA}IE㎑U^0bk|..]汇#sAOnooR ]` 7sh9NyRZF ~`06P{`|dhA G^ S';tdkv P^ziƷx2:~鳶10 mG ݡqa^{~%},3(Si\|/p t*$RUDSU dX Et+MHSE^MA ʮPJd,`τI/z9ɡf=~  heKN0=Q&5umMkWGлM S|J@q' =eī/F&Hɼ .jzK_a$RtƒkM$vJi~u1^;f*I*ue0d i @Ï6H6gI5|IF_IHeZHz&k5٨yU!_Aܪ2_Rlm|7'm6`RAS32#AWRS 8" +M2Hs=UD.1*Zt9޻a>ӡV4FLQ1aU[ᎽVSmU6ܼ͌ݖ˸*h2=vŴ˺E+F½FgvL{]eR6N1TYթ>~E :.:qgCfqi7ZhB6P]OWݟ}~% IDAT{  9uk:JDj,Nr$kH?'?z6κ*j~abj&o ,ECHAv(%e5Ι\Y٥Fٽ;|j<=(Iw5S˰}K|={^՞ov]67\ ɔqři55$Lf:vBo [5}T \go{C?@/kt >r{yGFu:4Z={~!4"g?0>2?N=7 `Yg|IxA.h@:brp!py*tN DXw|+0x7T[Sa} D򿁩pj6|[ʎC㡡W #GC6٪ x~x*/%:`#-6vj1L>3|j(n/CGa_? >o=_; 5XPCbͶ ׮3𱟂a|P[^ԞWvb8+*܀݇Tb)x@~`9ث9S GаB٣ ɺKGDZYĶ4-#"?n:W8t0Fa l6͢I]rR2wnΞy7to tHTc#ʾýl#(nZ=I @_ֈm 1 QK/$&|jgJFaէuiu!F dGtJL';td/Dvضc.ڠywfb3l`0ZGq f&SXe:\Z SQ,[,0y! '7öFV#ۃ/)8n MA8Nfƌ$ȨRٿIUz| f81v@W"H: p}T fwE7\@e>m.Qe?Ό/03S`/͇?q x<(uUHĉǩ?yqh#?Whu!^93Ů~X{mwS+]c4ie^:CwEeMG\5N[;Dm\n}jO +?{:[f<_}{4?4k~IOG? as9AǯG9 \<#Ǿذe, ;O]򾫻?a @VhWBfur$`FeTW7736nnuxY~_FMG1Oav?x\;wwK3vow 矽'h.z..MlwX`;<7dQbTc!rz= XdIQR2A B$+-B Fl/Yp]",|Q'jtU^U/x.o*$!R#$crN,*̊Jks4*@Tk$N9zb\"klݳ6}b٠RG *\-2gs]'G;%&Ly\(Qˬt;a34 Zb=8BE.S<*9̮>3:Cjy]e5EJW/Lva:B@SmNch-I%Pq=%^%eLuDHN oRӫ46T7b& Xc!qW!mYԝn 2aHڊeC *QRnKt]d[ ++j1 WMr;kҗW?8BՒ]:#H]#5U.yL}C 9IAT|tOD2{zntd!2dSux?Y7oePO];zV !"k7WiMj$?'!AEvt \ڲB@Q|hX*5 [S4D!ӛM nSRq]7D}-Eu'[ d>09F0S$05ǷYa#}\sD:yx ZRAk q6F@-Q,R7 `KHMĶ# ?+I`;̞E=6n8;IB6B-#5Rnc6l?%X`pUc$E6pyv^ 3W _yYlz,m5nzk({#TZֽ>!2}w|=G.þqx\OUQY{-["c0<̭A y2"]`pp]*?nܲVCu=8 lG^uC0q,lsW tm[aǑLQTf`~ַCPIG̩87'*>_{[,o~>rwJ3>Z秿^f OLeV'K ۃ՞K{ ~i\wܾݤ7q(Js|߱|6B'>(1l_JJ[ yV4r6Ϝ8+Ci|פv9`KXj1ҽh}&Ԗ>gqt.@w520^dꦖ1PlBIѱ;R9.$T2^%q8Bɚe j.rަY^G̋s) jr--9_h]^gUHdZ4N$-klm$GW ׽H)S^UH9-w܁u4 ]F/<7ƭ߈{ayο2 nqRqa3i8xu o  Al). 4`aG>EY#/cB6'ywTW j|NMQ(oKu A 1:* jZBH xD]PFr)޲~Mش?$s{vZ$IFV+5Y^QXLF>렔̓{0>x{л6Rt]pǠ&>Tt)V$tN 84Q+#yuÌ(u>|-|QXi ᳏™ 3fˊ@^OE`ӆӑ6yȝ#Xj zwFj+Si7,'{.$DKCeFv¶pPԳgEL54A7SGܮ͐@^?A!(/q-b K|4rϒ ILf$Wrskv3FF fw1-Uy;$eqգ*eI6 5::v_=\ĭז}v ̔[bsԝ'(.ne{ni8[8itglK1LTal7+bi[_§#X XEI}~j:-,},[,j}Z>dS,^B C4ʴ[%q HjCIb*#!I:Jds)7杞1JğϲG?)v|Yhbe>H _0B$\f֔XYeapyTZ?@f`=Ϭ2ScȚ+BL5Sl@%Qw޳].hgzy1l\h0ltVluJȸ/"H;^FgmEw08>k_$hL<<Ǽz)ŁCd-yxg֖$t50CܴI VCr]W:³( TJH2(?Lk Rˢu]TpgxEںAbqĴb׸|P;6e cw˰r8r!8s GiW/iH?!U!f:jt_'^geK yϾ F*2'O%I=%}?=Slr̳>Wv0_"%g+Lu4"ݷ<ǹ$gi5c@qs+w1tǘc 8 y>Aތ!`ϷOy%C$AH>|q+_[}ŌN=ƌ;0Ow3síW6߁լb̾UI,&;'xj!·oy)[yut'StBYm/42~KBHh^[SlU 2A@E#'^]cȒhꄚ( x1bIXhK=A@ìTc6@Xrz~BUq&f WH(l%!gebRF2$*Lo$ȾMqR <ھc_vp:NBr񭋼96TPI>"2>'!ٮ*WJhwZA\JJ/|qJkHOxXue$\7MO;(qݷ|wALKd2f|k"|ç\Qq Qh# m;Gypg/vJ8 +Yfb$37uN: pmwb ̞_௦$+֦ҩlvXY@svZm}@_׎t80xam*mX !e|!ĉw˘~f2j!'pޢ vH+eb4Wqt])-5Z "~C5T ^h7$m|BM$:!fFFv 2IPH16 ӝ&hTF,\FV[U^$b,H*!L##[g`.丄jY1l&d<j:g[:C =࢏:o .ҳ\V-:7'S-Wh B>~Q&D`Y:ͺOT$4񖂡& n0! iohoNѹab#o;8CXViUX._؈BD;A6#=ZnPs$2AZlQW"pB_/Vta YxUgDvGlrWvouYHigu9Uv: wspf)HQ _زa<9H}N<nvz`r+$R}WPV"lE IDATt/KO|8~FoSۀ{2\hJGthV:|' \SܸVfm{.0ޜ-o{4ψ]/0K0B WA&>R$ʡҳ_쿉vx4++,0̐u~he{o 99^ $ETװzC|aL;ƸR2%r[m/Kk{z+P0T&OԔ*EejsD¯i)(iPMֈ/pyyJ3.guT)`cɰXNu3lEeѩ TLz/X5*%#YT~0ǑNQC dlMs.H  .,#~h^ ߍ:Mm"1[J?]Hؤn ef֜GY&kwxGzs̋q|Ycm$q>Ģv)Sp1vLlRf?e E ƻ2g03CrUK*};h$R2ķh0SE2 "&c \Qic6{}?;vK=K0Zg7B|RtP5/|IJ=L(jR+i鶡M --\5l9LO#+RQM+Ch y;Ѯ٤ !?v$ {ӔSli9lIX hur:>]rv]dmJ2&ӝ(j j:>DTQ1-&d C@MqK$J7kMCSL\|/$-:Y6$lVY]-Ap밚{8^ b"պMegd(}_ mnݏ-yO+zU4oű Z]4< j >NNIhm&,OEfJ%.|=lYjC!h"f;Xt\SM"ٸ(M5ІL̈́]Na d!w1>:Hf4]5VC|!3igPY^Y/OBY8]c D@BCglLCV5dfuXTV(抴۴2m'EiYܚK0rcH0`52,πϊ&FWAj)ƀ\'kT1~U }'hyUb)cP6vJbZ eSXz1҆!\J$Q*11SB/ !'Өu$7DsREFSO&t˭`,x7C$6*b YT_RhmtDŀl S8˨F #H7Att-BUADQ@OPsx듟l@PWQ>K naXG=:2sJ!FcK!^=`mx{0'YJ@񃨾P{#Q@ O(:"N֖Q /FcR|i@{*ޣo)M戁< Je7;޶&| *, X_F xI-R >x$ xrH"GN`;/7WAcEVAT67hEee#OB#Frf+R p"q fVșP*lI#{p~8u ~6×˃C1=@G.?2qxׁ(v_wFԩ+ܶ|R xu:>M-?O69m @W9m 81H_ "?Z/._1xǢKZ0kruYZ LwK$$84=>Fvױ&g47yX شܦvRi%XV2u8feY\ؗI1V&5YiXE5j lVk]XR 0!̰VA ba *N< ȑ;pGг/]$0LfBO j* GVI$yrj}=(t}@ u%ۦDHeqLGC C|?@dЎx-7k"|HnTDR'INh pY@% j6@P_n_a/[IǔZq!6ɘJ:a8!V2N])ZIn ?!`$CS-ʅS92ndpv-9fuE֔!(HeS e|FHqIFMZ4 ѓyǗO#Zm @h؈&~ ʳS_n1ɜN5s*B}H+% UcqG3g %5%UhTRA3 %I밡r6rmma\zV9Ws喨tnpd +dm4f?OsvDE=qu}\̆䮴hHPg@Bȯ71OY^/-L$l8#z+ Nv9v. =zGw䳰Z64Kap t_jXr"UgҎMhˈ3jS^வ&j;7`B^Y#!۾ŀS`d 8:~ ysۡ<[ZcY-S>ɇQ9_L7ڍ5|r$/q3N_!t\5RF9utS`c1Ţ\gmxftn$^9LdI)M2r^:fP ^ce *FzpΦqgRoW*oTک,*V'@i|BEDogh%l?N jTiƠhLdʴ4< 1 /hx'9) ZA[}B1\05 Ua[f<#HB?mQ:`q{6PVcյ'T\'BRO kL&RXQ{u31248 JcuGr>gal?"nƨ.CŐw.BN;}狴g[u+>ŧ*LpΉeB+Mmpd!茻 9jkL #SR -j5.4rl2n dgd6qQfp $ZZztXU6Zнp,~~?F\Ol+E?Ͽo!vl<q( pӖ|,40/bag?x%9j7 ?[w^5鎞Ǎo׃xP"mQX8q"| p'WPk~[iar"Z~>7?}?4a݆(;3QL-Z6.2|Gߒ 節Dl{\} &XcCwHb}^= zk3X;ݛjj5_?5[a,aƹ%\]_Dm6*I3T|݀Eͮ?Lxn~ k4 2%!Ƞl#aBޓCl4fa 8 ipsuوYF(2:KX]_DnEws"W5n$O[ `ǮxWl+\oЛ,IEnWH=ʩu-`~ԕ̽*KK.+. VT9Θfrg9ƺ+ػ0kSK2Ea|3)fחht#p.q7*[{(v9%R<2gayd/GI#r3ӻYIDU޷p( KBCaq{_U͒HpҖ1\ yWBhw6`17ڳFBT![I;,vŰqN`+ u0z\GȜi{eR#H8(Nɓ}s2Cϲ'LIf0'/M6y'QW$oH?k"?[~[K)H;ivI/DI_z-EHކ9<|?ROf2_fu4xucg\ YH &G`ec`E aa_wUɐMN_pqCI%ǟ;G"26ۿUa/i|r !9'x-Ps Ї©K&^[\nBz:^'8dy!$ZLXCRm1]7,|gsrjURjRKh1 kl^11c#0s- ! !$$[R]U]^Yٿq{?2++"wy}בS$Jk4a $h)2Ax(D7E"fGVd0~/)D>0@eW#!d'CB|_BNa4Z$8vNNi,`-θe85 7@&)2EU5B MP:0i!)B*0|!QFaVJ+ vT-,T^SK nk,ϜO*S"6ГɷT>6z0s*w`@R_qiPR_4K%BP_Eim|!^2\]M?XQiy}t\ m*cn,KW"u]p[ Z emPItnIiL]csSl UU\z5>_YNpl:ʪE"Fx96`m7c["T "YSpofz"'̑Z9_Neu>榇vgLi<:àGiuF 7b=eYo#3GE&WVlf%[bk8V ɋ - ^3VpR Z.obe]B_FpƂ@+U%|Z;9Z:(GC  .\)ah2 IBLq\9\6. l8"V%MƆ<~(snJ=!_+YIŰe.2xU[K+}4 x숀VL0~vѱ$*Æ#r7\ C`ðm\.r[6xDb}982w Ex(CL-bl; 0I#Y/TfX̕# k?r 8ux>7n:'##wC}<}4rN߆닰aHݖڙXo+|gpr ~v(7ةɲ7n|K7ᮿ?~o뀞|ĺR~6/25=cx>HYЕztB8'$H Urii.ObC&PurkJ߼d|\ cRz5jc\zͺ6|KywR]O^acvjY Hnx'SX9֠Eєs9[y҇RB\šaaCKX#e%%AyFr1B,HKyҮm5 KP'vīsL͜#Cdc_ꝛ۹kFGmR'ԯ?hsFfw򷟧!Y~={eX.ᐱkhmX`WpY.۽|,ShRI21qdIBP0$ٔxz~VyYVe 53w~BHEkFYuq} ф<\qhZJ#5ΝJ:*l\ffyY$:#H4BOlgxTF:tyu[8 < ! &{bv?s%g# E$ [!Gɵ͢.D :rStO09pg&v5 %dТi $)Wy20ʅ&N G(3Y(HQ>5DnL$D"$DPsC 8D (nE*4$qʮJU"9K"WZHNC5uDKopфF@u,g2>uEU`uA TB4EBT JRA+A @vsLM1E7NKj+߄o<8*{Tl_ N=$]ֈ$M2qV&p@V(8jfdtew&\FũC 㿯+&)tA!a(#*q4b nyEGT 2NL ɴAWuHj*j R(!*nmN ߗ x+nxlS!ZS$4j XX\8Z "=X <ђDFCQ9sL,wq˒W(L6i?D5PIZZ+t$*g4d:d򃛩)νCZ|] V_YWt r|reN";N\B C/t볠Q }ŘѮç&+ӷ~jNqғ*`X7jcZLهԻʺ#a[/xN `O+^qXlh⡺ jt6A-PɈ!&H^3j7T4J ;0c2* J5Dʀbp/F>PF fi؎* 3-ш+1L{V'N֕u4 $Hc 1 7ɛ:TM]FG٣ecZ1>`@uGl9"/t=у9a W)#"q9~AYHhX9dKG!Pd䄌plpu@{kvG1$fefxل,}*ꄄayXÌXL }c <4V"vb)g&y"te#PZ |W#P/di+W.ޱ.F @>ɑ×"z{?|P$޷L. ܼF#{wak 3p<Sk\>k Rhi5;=J=2!_̹[?߾+K^$|mpq1bm.,ÑLwH~}na Vj>:g3]s!z;j΁07pI5p!]{ng^Exb4? +k2hm] ,;[dFìR-B2KCđړ4mR dl.&rCXO1xS[Pd[i8Ħ!~EmW$+UE¡8\ Aj3]J3&Bh6o_xK#],u*J'4(mOsncOFEdl-ݢۓSJtg4N뒎,bͪeM;PgdYc#RJYTtE1N#dz:K&~:OCXHR-jdl15uL8ll£G`NffaZc(hbi;Fۜfko8$<5D\iG(T$]q&M!m),e*B) G{ _J'_ևX^t<⮥X$agQa!jɧ 5JW|>joo1 =|דX峵T:(x$ 1#CS{xZn\Jg>=.\<Ϟkp}@v#ZbjhNŞw@羋)ԙ6^v0*15QAE~pel]fo4.G;sI*3;qay)$2I ̋1HqiJuSPeREAfUf.DejGjBFU\ܖMXEU˂@ Ɩ-*?0y{Y2BU  MVKu6O28ʝwn@\A{y~[){oC\æeLʻچ Ү9+vlgټ5#.R2@(_hڛ>3b]Qٶ-߇c3mԺ%ZL ZҲD(KhKP +sf&eJ[ihp\]@A/ H{Ɂ.Onk<=u7\@~(yF; Fgׇ˻Gax^ о&JÓs J×zlo>ɗ"> Mpbĸ.΁?[o@g.NEsU,(dѯ_~ IXO8 Nr{>,xm^<]?9}.=0x%,U# QT g'G刺'F= {nNonb6 F{:Efl?" v4/.AoHU?l|ȝkG.o"%,R{ ݱU<)JnV$F.@8vY`qw9Ė1~jϼ4945v_GYK(bsYՓ$.֋Vz^I3ΐ7e0ƉwL\EuUGƹЬӽ22.Sloe͚9)dz5 T,i$@R 1+.: WH,ӐlƧ,zf A00@ۥyVk;HQY,5i, sH$1 nJRIq0j;CKZ=qKNX3uHORiN]tUFbU:9+sF牧}C;TCV?,Ɏ h Ixi 5vo'o}?t8~s${c_cxC45_L_pC4~tZŹ\}L-$hdO,,}ܡ5 o;_Dv;h7)7nf0CkZ;x*5em#yE6Ɔ sy>t%Er7.dWA2oSCF4B9Odk7qT@-0=6K_6[nrG b5H:0Z؁*w\DW=^6V2~W2TQM瞔Y u.Hhq 7qe_dvv4 )P=b mKG02οʹq*WE$ Tb &IUdXs6}߱HdzO'>,;̏ f{*IC/Hr E(@jdl)T)A(" PȄTk!Kȁ@ #dA K DyT|v:̹*. H%)T$ [Ț V'G̴dAhő}+UQ Hr MpZ2RLE۰2!n j2'ah19Dv4BTta^Ĩ;Аh=[24thT+oy >"T5e^ )&n©7VP*2gӰ&u Δmٯ"CV6r>S0>A-)FH"-S!f.Kv|caQeO:bd;Hx~ewM&X.JpVˮ!$~5 χÄ6,H)3&R# $-HP}+x;9[[ĝ-@֛=E!iugbdo l]U-ؼW pSTzIYk \K|${$.|TIsUBqo 1SÚ"ow^ աeU&ksLmr99ɺg |5 3 }3oQJz /O1:6צP+,\#izwTc Yݧ1xÚ Ct ИܘLKRE'iT&9f/A澈nׇ"& f`i)|2tp-\F&ື!p88 _A g'|X8P6CF"|o\u5< 毄J)j oOXeQS`rV! ?m._NA ,r3(훱Z;CQc\);HIzΖązRR))Er͔Ck{U C0Hg.HuZ6}l_h];2v=wߊqvR(WupM乭44cH Jwj}̞,jTa'6]݆I3[<ͩNq)}F\ad.UH1FXx ?뼂s#ϲ- 8X,vV:W^ZGmx=Ew0S#i0n8L,OD,1G[rʉ ;^*Koam ՕcUW!b"Zyp0N]ѸRfr7w+ a[Vn`bR0At_ >X9CKIYN cܷe~V*]*mAϳM}'{;8yKG[4W_!j4Je:pN+{7=#L̳~JV4f؏Y?E-bcfw݋q0za?Lq~k#Gm87 >˜bOP@idnڸ~[>g<$k&l(]$>ߢm '"q^u=W.\{ȳ?`` bӬg}ZgO-qȥ9qqώnHrKՔ7ʰ+FHYnnBPL5x[ Ǟ5xqF'yװm#cHIF`qc YZdb)¤jIU'!kz.~_Ϸbhm'""Nm𓄊͗/+4;BY'LX8@(\[{ "T)EBF0fU*~&PK HO3DڑCP($IT̜6H Ã4  V7"B6} [@p2!"[ŕز "% 9R"I*BRQ$ Wo_Yx7ZTq Q3u-TSNFyΆ[#a:^!زlg<"@c.}rkeC,-!FO8h UO#FBPJH^W 4puQe8-,)IEՑ̀o6]VtdBȦ*ve{zXDC4tvͯʼ9MlE92+gԭjϤRtcoc IDAT2gt֊h%,LO[5bO%Xjy x[ʷM[ulML vO%PQD O.eibE1"_Wk&S5+c>*b+WfV7BtC'譀ä3 KcaGn bM=.WqC٬P[w%#;l˝^Eglei<ήg4cVbyM>b giTSw/IY9hZK_E[ qVhZѽ%d!u;X(m ]Z  0,h>jO'g˝8?"xDŽ+oOBrЪ/pW7޵O9> yvv-zN,T:kĦ2c7\H4Pqa ]y #ƭ,Pn FiQy-}K74Z&'iqdZB ͦG#i!cd( *M!7@}:1u%@ؠ$!LB`Ot0Oz̏C{ av.Cf"v`䨬,WG3 M("ږ$;ቯ޼G3(8 ۇ̥}ӎrQu׎ GG9ꇞ.\q7|0|h/^xy$b*-Va>^> ;f/mì1H0`хGnC(*@d?Ǯ3-1}8ndֆox#m%5?RO*^)\Uvq澑?wmCRs|/# 3(I{mj"ʅ װ5+i]8L|)\H6blmx4$};f6dc>'OoXqNU OLPS0ӓ0 F4qjJ/t?g>! 1"aRS82aYm6aC3TwYxn|h%,Zi7]J/t7].| }-FZcWey-赒si:tz͗ob59ѐYA]NPV*?{r&4sş+tCb>2}c9|1*T 25% SpOuk?qұDw(h-jFt/'1!~ohlx :W_>MfB7o,IHģM!! laugg8&Dp !2-, =./=Y/Op~r72Gc Ds'D-T wߡ3*O x[:%tuR_aȟ7o>rD $ q*mQۚ /?c!^?M QeGt"dEBP ) U1c'5OMZc!w 1.$*׾@\x?{8IK%Qb[q;&;q'{M78vwYeu[DI$E$H2G=={_$?ogf33mZFA1:; l =NQq~?GH` !p結 \2"<$y(RS(Ȯ@ ShTp((HB ᠨ?Bv[:S6p< {"dTu(TV4bZhA=a29v\"Ahg""c НN2yJyd6q9#I!W+L@n` Xr VET 5].n:+|Uf߽͗s?>6r_T(8YI\p 1ǦjHFkKSă*H x^\&WiPm踞Vu%Ը#KL=` m2 YmyhJ ScK2H`ksU``f9sz:8MMr^#)R1S+k%mdSWr:"R'(0/d1 ZAowY'3tz[yS#5 ϖo7U:C<(55nys#HJ]k8;Jsq1]lSk?އXYWHϐMđ8z5Aj ҩ?p o‡8f}ҏػ4.=8ɺnܪp0cE^K`GuqGy;(.e2+'MeFs|ؼ4K0ܶLGkefR?|`WCVxd}:89L g10ˊq3|en 0PUzaG,XJC/{hZ᩸46Mp0\_ʄ?8ĶcMN ^uEў ?ZƊ }Fp4̎wscoOTB9A.!BE*$^B!T%QL1Xa==5J gRoh[,>NZ`ٮ' <&h\v  \q%墝7 _٤}p݇P'qGy+4HF]u:+WJST9j=AYjZn3*Z9,H3HMֲ(dIh`?W.K3E›PTW%vw|j,Eu!k}Wz9 / C:%+|ͫ0{{5t~k`, /%xV_=/i>T/|r59W)͗aߗ|]뇅 L,ϻ m^w!IW|!0~ 桴 n\5˧k 8{`,R||ՕWmpe޳M¶Qxm"S 8m#0WzN_^3=NNA˳g=v/ T[wVO ,{>y' }tK(6%tC3$Wp`&܉nŗ]jz/Qn# B|^=M"lCᅪܸXȦ.)1gX9O,+}vCzW/Fxh0f<3"9G3w(gh8:ѕWC[rU3ʁUdYD )cphC$"MX=О)tpi -Ɔ~'_lgP"Z UgW7 yM}nR&KFɍ EJpq!ο>yvmweg _Zu!6 NvaEn}_S~}s2MY99{o'P"˷؅8\<:!l¾v&NXgʉn7Qe6M$F&H[Od\G r&NCV)mȋ hbG]._^dd Ԕ촅1x4/wm]|81Ek/a~LIakvW/&If_LJxTGtԧsTchE/d)hC6{ RT*mf$f7ͼj#  YO0Bx,q%p +H9XpU'1å /W(jXdTPvv s #tfcUݴWEo}*<7Hx73|@%TX}Nc1~|$` f!vrWtM9 }"(wFrňAkƺ5 H`& ABGp9N]#*&U',[G?~v0opzv>o2db <E?+ |K>c50W: }Տ;Y0kp뭐[4mx^wrv6lŴ<&h)1{a1DajY'SS'Sba ˯: PA %o^׳涰om Aށy@uްY9D݄ǩy9 30d4:;"v_j9+J̗3Dway^U%aCeow^6"o10 6VDݿ5ؠ9vtfV8e4d4od>o|ñS+0wFSx_d^P-`H  ;6=}Ij8D Qw\ Mz1J{u¤4ѣC(pU%2b^y;ʌע#QbLe0Id x%9kU} ]X(4(*WkK؎# TrDdZF +xn &", lg2Q%:ZpUQ})d&(\˪'S kקy-ú:{շ5TrrH&:H">/̛ӏSgGu:#ŋE ̕ =۴6o '2m\p;X.!.h&4:o[EBWssP_r70ڸ[goLC|W~}-Åa:-YX(C;͕iR%~zV"oxֶ8y5ڸvioG߷זϑ=iی]=x!}dJUHbx[)ܲ7uQL2Jb#37]xE\ 8xj^½}c'8| t- K:up {> '7o컭/aZu+c]\|ZT `wqQ6/QR>VY.5*;=s nwy[\/隣!dC5By6BP[6^~gSZOp .M O2Dqv޻jW(p{ =3l/-s#zPSGߙF,Z E2U*\ǗqL Re GrlU4ii"tQh"1 Z8H#ۈVঙx`+ _}>8Nz]zj{H?z%:hVA.W,1xr0Awgww&ԙ3pz 6POjӪ_ ޵U2[F^wѣ6ѥma+ rhZixf`iNwd7Z8B) ZdjŠW"])ڤ20mJ e}rAkS\ rLa[ v<˥%FM1ʄTPx'̚dLtdLBksgC#;tBtJTj(Ҝ`a'H5)6ۨu"˔^Dg yjtIq!obSڥ#-ϡC3Y;nt IDAT~ YgHG_X7 R0F <1S[$i.y#]CvG7zA2S'<NqAҘ>L>,zB.9$Xs909B]k$$rd /[<9Y` y lyd<[EM!p$ Iu9AoPLÚW:i;7.`QtERLjԤ_ _˼neXi"Y CsNpo҄&%J~-3=ѩ[ÍCEplZpeA X4MyhCUޓ Cc},ST.pn_p>BwiRg2wK+ pkFòt {7=; 4bujr u&:f7c h-Y& (t/eIxy q^߯Zm T:߁vP_l~Qj/6}`V<|_TnA/PlZK秡.鵫d= M˯c:>?>PD Yaw?|G߃ݫXtYx~s %~1i|:q8rmy{;<,{8}< hfgO|>`__-~J@͂7.-0C݃~rkAA_O6`UJ}>:<3՗wC@(* B᧑K@'rUϮXBTF.8xܒGY^9ATynzJe] .t>Erl(q.Op_CDڮYOhfuz9Bl^We#RC*z>-wŋx0u!f\fҏ%ZQ(GϬi!j­:bܐJIzuRvi A#g}FLj\4ǚ`aċXZ5҃ |Ĥb&=W42nI02pM#X*na63 5:BBttG%t2zb"qzSƬh+|V-g3rK S)b[P7%y"۳;Ka<$s+͐lʋ/̅Y^Z"\oPlw%ļR\Z’t5tײ}iCj)D\\vp~uR WQ9vfy>cȎQqn,|MtdFW=Ɲw9_f"ݍ |'v;z|oo47̻?E!<}Jū3\pAOAp#XRRyW^Lʋ1:94BxxتJ,U?a)w–~ Eё(#v Do;.y6ۏamE^r~{?p]X!<4 Bp\ aI"Yx("Z.#).%! #LME( x߉LK6A 2)N)|sZjTI$[p RanΣ#*’ 7Ԭ#Q)4r )esmNs"ԁÝbqZ ?)^+/6}O0ZQb8rV2)7n=-@gi-N}7Cgu'Xzay~D\Eb'=;CP)в q8S+YV\KqփzrI\P*i,,w17ggC ^a޸Gj} -\ TŲZ͛w]*mMXI#a>낥&edi<ˡ4Krnj,A/l2y) Y`|G8J}T:9qjR[;?d Ilc?IR=#0p_+ezL]h[%UWDԺO|(;QwE}ɶihg!C-$> %< |}P{|eh=sWT%2/I=_0?9e?;}u'{7V7r!yo?~p؅p2\|#py\SML2zuV*^NM#?y =:ϭƎehmM!gh΍YV|݂V "ӁPb9=TC=t svZ5N^X"8WU[-H8uDi\A@ \{'S256(FF#T61n.2mVm?7FCxeUĘhw0ja|Yx$TCA(-®^ӹt71NGdFʍ"r'vi4Й\ yuqTaTkcg[XKPhbUטj s\0ϖ dn4J'"aN*#kIBP!@.Foe%P+#{: 1kQBN H^U^y1M)ݨa v ivVpT/FhO("sD-@yY奷dЉmfG6u]G]N1+s\O3IFܐ-ECPT]Ds,qtNHNpIB /0CՅ#m ekz'َnѹ/[鷰ZAiIUġosdC-RoI-s>?;Fup%<35?BQZ@U2eD}܅@xa\[.a{sm 5Ro_Ư9K(r ާ1dBµ%dY~GVi\ /ыlH(DWWD *0 6H8WE8: F++ gɻ`Y}'%'Gd <\OB2.ZQ^Bx@A’mhHGs'IHIB:n q=!E_xYb"x G~*yx,!W[8fV52 p"*2u%(NyхpAlIG\G BC6 B&SgDOHP7Q D)GfA2llvMe´ vR:ƏKP/ۇ,NLi(S,=gcyQ0%wG AG|I(ZU@ <~XA7e)EB3 J,)#E#D˸ @ bD[1 ls].'n'32xlO<;7?UH5PCM!cLNl⍷6"d"]_ߌ²zVq=p4O8HGAgW^ S(.!I+ ?"#0\ 88@x^}x7ueU{'|oIj$!4"c ~8,<{='c?1`0 QnuΩ:T'鱭fz9_ު9ֹIcbE!=OXRF:+R+ IٚM&co5*(JCC\Ű\5ug]AT=JPc]}vy4öNsNHQ,+Mkal&H~0|>87<`9eLʚo:v S;9/J,"ܸvl7å̗Ր\ll?6ֽEr~?//k=AޝM]b#{†c IDATV꽚 // aJ4τ4a99?~n@)-zUڗ|ƷUh\|P&Ċ[1ɮ:<2Ϧ%)G"><.qvoE"q&sw"de~.!&ԥ&Ȩ%UmIV>򅗱ԙ|73M^vl;g *Aԇ'9K4si7 þÚՈy_bx `kk^pgs@b's[.ҧi+H:OF-#v8"hI8 )FLZDf=yrnJj.q0GOCX2mNe ɥ\a]T ńn٢$ kMiD+XpZ A^r]9ItglA.VD ױH>V; ;qX+>0]GK""e7Xv]6ۏ#&EŏtdtMP5ԃ7ItWZ(&$pIPc=@]bFBfI$!0B"E.XX/eD(2 RZD!cV o$וh+:Olg?#.?v_jb.J" Ò@GdW+b$:y0(3˂mGd'M5.0"*:tIEB"xДalL];䌏5b tK,U\ .@(KB A-֮{F'S_ʧ?έ`e;ءJ&݀,#:J~Jabɦ _"&5NݣPer֭Zx'XZTxNyl#!yu:IV\s?9EvA!}f;_~uUVau/7 >^kuƼmZ,YE_$ΕQUd *Y4.LYٕ"d D(qFԙiNat}Y"m=C0=Rsޔ!kꫬĬ̆-;92@ l jt |?Hئ?chD{1kfǩEnƄق4-(YJE‘|sQ8g_ѡ4TZ+m,O ϴiq#xu;<;ڜ+*}d F*HSsXU 3H8Yqوs2Zc p=V8:gd;Bn h]DDer{nZz-Y/5 jcӌ:_> 2 aщeaISթƋГ+ɀdӧ;g?Ͷܸq3aة@҄MwɧL ;`q)yVݏw\I=gDv)KaE_J}Ȼ;/W_e=? t.`c?3eY_ O֕WJ%?ܗ=oӰyLk߇`y=2k[)W6!N󟆣i?{Zs:v@:xY)؀]9xu<5 /9;t?7m߃GMob>o^u1Xki/,5Rfƀ2rY+U ?3mam N. L2UxoD[nBý%ٰLVK̶q 𮏲'\|e~_yr9@2`[;aP[o r,uw~4D6*AT%ʯP8 rF31H(=y6l-K8~5QT=zm!qcTEz՘К NP+jX5I.{F.CILnq؝$FXCg(&[ECOnOg}\<͚*f[D<5Y7qut\<ϲ ^.2?k9ެe?/03jTY~c[>jw7nJ?p-uj7>?UNGǧo|Wya=zwؽ.=ol=L~CZӾSOouMMi\E^9~~/_w=R۲N?eRo=/V~w~5ҖA"jO5BOld6ɸ_,`KlS/l/21n' 2ٰ(_{z37l~5|3eVd 2={&O/Fe p;gZ`k[ sLWɨƃsLWɲtJ8iyfi]ࡽ-^ˆ+f$G#?ͬ.ߙM;O|[ydS,qJDJ|2Ne@8 !ݖ nB໠e ='r 85ׇ uqprէZLw^&}f Y  16$ 5kc\)PR" j468~抴!H,2J /1PN=K6!Ls%]A T(? Jg^$t888^Dl<BWR%¸6&Ba9h\'B Fe24hGE8(e Zh btC: 5!~4|fm)ҖZ%#aʄ,/Q, Ev\VV,,4XBvh]2t#9+$&6҅rY,IL,V'g08+ТΚM N637.QoirYx  O]$o\5AS5ى.}ٰ4#jW=ehmV^_r|&] c'94v'", g[8+x^" x߃ȽȲ\HL3ybhCܝd5s|= 5e eaʡg_݅Vb#+*[AJ"4jӥKedfLi:輥3 e#I]m2N}%O2[q`}DnFM!Cj $ˡ$ˆCNr!q6$"Gfk9#Rc̞P E"~vFQ E[X\5leT)1MEs‹ ϿByʁGx<텄CM֩ dBV'/v\尡sk',S| ͻ2!G[oGYօ!Nd&iqFM5ƂwCq8B56 buPu1 LX;t; M!1s [[]8U?!ox\ FX%t7UA3(!BK"5HQ( Q@6F[TS1 :eu;(4Ĩ+@KюZ\8c 1VC4`#"}⊆b-$XcHLhb GiALRYNR="iq AJ.ә6\c|C_oG 1h; =d|EŴt sBס =hЪ{ݭSPm0$imMAv,,tgaOÁ:=m{`l{\2Wz`b n0@x6X^If~t럂s7O^-Cӟp|^81c)H]Xۓ~}yغ :75=[R#pfp68tp:y5<*=g.B}W)=\#pnU}E{k_Ot3=G6_3iXO9e[^c7pեutŠ^?ķ=A\suj(һpvdoҍ`AnέLqz,УwX͵eY_u@YN VvϿ;F',z?t7mg?Ò `s6`rL,v纡]bSKD'KOK-f%{2]`_9_9nUo ήm{d^S Ia8~g3]Då;,`"^25oy-}0KE=C,{7 k~Wq1EÜ)?/=ߟe̟awO1>zʷa̷ڍ_OCDt/3A5M'}>F/|f4G<Ƨxߎ&^_0c_xT-Uvz7wK#8~_-YYyՓ| {nEc;<0(,1K1{_5H&dMm ,ut@,\IC?6i<\:Ikt\GVQI/3Z"M(U'd$$Q91&"t:I`G䶀 [c~U! \N<'W Y@k+9J@.&192 Yc1f,&Q5{N K]n('jД9Id,CG39vHkcyWq#/bb-5],E>&ظFcB"2,"c" n,Ft\;1}EIG:*[]Ug<8HBbIM Cu|ݥ4]v@,n.F0׮s%h(b,H69@5 ÉV<֠&O VVoNj5L-WiOvrtbI,~"x5&f]lCC5Cƃ:e5. >ܞ`c>YHX|5- ˉ uyJ{8U\Dm9sp]Ee}ÃNWAg kEy/(PޢG J-~]e9mҦW(f򖣲kY9vD]ԴyraENr r>g'a.'!̵m)eVJS)N4"ɰV9]i-/pB}K< n :< Kf[L/++VbK\\ EcʲCE\RGDŨF{˸kv`mBVLDXXHPi8M"qA&$q2G)1H%F "VRhqbqM Rk%QAHT FXb!1hcSk  &JRMH:c-&` ILx SNh H2Ea,BDFH'Bh1>$İp2˗[Ie@"{MTHPؚZJ0_%!]7^R?򝀁0 ~k)~`} n{6nxNx(Lk/_B.Φ7~&)x5N.,+߇,>\ vGco0]M )+\,:S}m*܃)>1ޕ>O>?v6x,}۫rǹGyvo<'dG)^)Z톅G8иrcරy|g=.(K P-

q =0] (c=AE:Mu]D[ PB[HT䑄 -0\C$NL\)-h#dpDi J'_^ȰDT5%X#ʼn38qgD :PIm*Ț@ IoH۸$1 nY6Sd>UZ5\`ܐvy~D{1b>I7$tڣ8#osb6ncfE$}KѴFm1!28FL)a{; am>)Wjg@y]heNM[YԢEVkgĢ]j4} HfIVhe,le9NPD4#Bz8O^$fy0>ɤmQ"h.XFy= (@%_zv3Lh V De9*Oc N/q\(ix2XgGr<ʑ!ަ#.NSr{[jrKUXپ _hQ_YZ]er`FR H46Mu܁rg+ctNmA~)1F81bZ֤ϱ-(!H@bV>2cR!D%V#,1E 6!\9X)6F%I4&]H-Q4Mk1B1$RMƽbX)pE "=&;Aa+@[dpO(tKO0l`&|Pз|8PX/A JQaXC:ԎC} _פ)GBoL¦Ϧѿ_I;< nÉ]ץ2"40ZMezjmSp?tiE^֦)ۅsXez[14S>xL8f 4Sy+?_IxX&w[Q^j0XL_314RuRvۏ ,4=4*Y)yg!W_iwiV$~(Зf=[Q~Ki=R!+'# -2'4OWGyC2z1/˖kZ@0VIB Dl"ryPk Ry˜F2%&1b2@eK ʐh\n==3؋5U ~KrƼU\_ ^&h!Vt;9ƻ9{1S 8F0,qf$ir0%g-qK<.UE4vk++F9*倕s{r}$[GӘLDnbrhb zk' M\$ 2Bw%{y7fu5Y3UCV}nGMV6+&)^ރXs>t2] XxUg^cǪLϰ-]*wDwpRBij$K7?HRҥ33mլ=Ooqɛ{v5b?Jonf횟afGoŪ&~joT^-y禋x?Sc|bjқ~'׽×o_޵ q_ mb'٥f~ڣ=Ħ}kPy">q_rg_!wFgO(WhX"a|p,֦+R 'b5(%6 5 ! "YT$bI'&Ipƃ8HB$$ V8XCK#`x`/`E( "j뤲>bP![2e v2FD2MLb,bELBĶg%8mP!Bfql%֠l+,ڦ R$ViH0i2wc2& 6Ǿ,kդd!RzM^tI%O ۍ\<˚U}Vԙ^(oL6}8D8l/QPj ^(.щC׵t=AQ(@f4i.-016ȆWqMD^ /m,R jIeALk1F;>$(N8 @B $A]`CYϟwNa;V;< R ll)^ݝag̓mfqcDAذ+Uhͦʋ)FA3;1*e&bKxM~,6[okA/7&-X=>cr [iMv v4UCVTzvKU D*:xT1UJ1Lhh*Qj9~["Q.*tDDԨ]\@ĖE)QDOLqGͥ҅T2*[!D b]8Py=]Hq$cf8_%jU3qM!%Gg77=ʜ:P*M䛋I1C?{ TK>K|5IFS0V/jT04̪SH@A%YQL>ńIViƌ> 1!fŌ8. &)0spIct#V0"lS(p0&\@hksMCM4],蚎_1/DԘtQǏ߂Y`d6aQM&f݄)( ECWu4j*: jجՓNI; D!*3~mq@fP=0f*, J,z 1Z ?ADĤPW}} W1lF_N6Ǫ:pλ&|#p3nϼWvÓ_AFЛ;`npJJ06K1P`nF+ndi>T1vxpL9}=`FO9[C$5 <V@r,3Z%ƸlEXy c'  4]]\ {Q#`.^6u`ݏp[b*ȘAҍMoݏ/}aN8Tbtߑ KB7:ogNL|*}e8aԒNtcG#u~lz?UO˿3z?nό;Дh`ᐙ EPrmPg,5,(-yЧ7.&<UnX񉱚{5z@NHgc6l`<2͘`d#]CbU zM}v%jDcUۍ0\ pHx=c^/o7;?!̾J~wFuYg;T1äQ}%UF7Eۿg5ր~j 4jgt[pay=  {AI b1N#_eF̅[a[>h|X* =?]נWwXV.4Kfvٿ:.B!B1uMCU {vAq.t 5ҍnv@,c)*bDnGWcSv~n,?e6Z|ukEFoaF 0f.*1Ábc]7–\cӇ@n9VoAj,<_x0uѥ Cz3F%b#XupcV;L?&»頱jIQ a6i6Dk~X &7AzbG^'bmLyGo+Þ<8u\䳡k(go˅K齌r8T)7R=B## &{֫ݮ̦25B!B4ѵ Df+@cDQN;H .5 "rdiC$N0P o/טljX vmn< ,6{FkvA_Xk,d]{5xlgK^^̘zh:$GMLQ1@x^pǻFy|͘Hm'1jtS`{-p1\8R4ȂA886>Y0heFp;XKg# ~/>_i _VAbp de =z@t,V+UFH,B!h}@p"r2"ҡ5e!x@J1yG`~4}o m6u8= *b!s\ x^`NwЧ7$'2Zu}ِsXeQ01֎X6ϛ!-o{wĂErXvWCƌץXxnty3+p;h:Ҙl]|<*UA(vA|11~Fm2à^0|ذXg{BJЧ3Qbb-OaXk!+-˂cza~c8 K~?]T?w#iP6Xw4r':{HǸ!z}W7Þ|C#ڿW?m1;6`s $XB!B4 įnMWa !B!JFZP!u~lz?H{ΏMRhzj 93;:)(*rpeq:?6I{Ώ=R&wњ|>W_s-=(={tpUWywPTTss.&QL?6=?'~aZq:{9|Im~jM<#q,Fi6-B!h5EEEDEErJ4Mc픖k˹鷿g%_ċ y].Ǐcgݝwo.O+::)-"| !B!ZMqI uπr=L&;N9c?)))[=nÞo_ᅬn=>.]I^'55=zo^wOe-|N;{5A|\f" ^zƜGQ bرу)S.婧K.fڵIMMW^ :eeevۭmݷ\ߟ|0z?~ʈቹs(++ÇWz:O>4v{[l/O+ذq>lV+>K|ylݻ5zml֮]Xl,xq{+:5Ze!Dڱ} ~Yv=fߞ޹GdDu:BV^QlfԨQ;deeQYY @YY|uvڅjSZZJbb"' y'yhl6aϳqF233ѣ ]Bcnz;.]vc%gORRR.߷Zf~]v`׮ݼ;(|6&&޽{GIaA&((ٵks/`ZmXn=C- budee1b/DZxh֮[ǜ3jRwv#)]u'mraX=zG{=}=N'_1L,KNNݻwg1LhzzMZZwn`yq\9}:O>%kSg ?n9{0w~jhb2=oXpքNՒ\)(,?/~:W_}6n 7iLr'Kj#j   0Y]ދCG\Du:BvXki~gfNꫯ_m۶< bml޲gnn.{!--yj+…p\JtT`INNt?PT\zoa|PYY۾C}?|s'`|n7ÇO3bP~2po7Ҳ,h5nn kǫyG1>Kj1~M-yO9[{vnWY#˞/*egI6N~Z>|-S[e_}>N\d;=8VӦ/.,&(#[1x|447}~Ɔ d>*vb~|2a}m94^] T>|ͭSMٝa V,Uf23 aHGaTG-Lr&">ƚMXqsR~AVc5'L.|jm/d,ɟ￯qqw\vQ5jT:t(C}sj.Ã:bpFz;=ݫc,\CM0&Z[8p`mwoyzz:oz$$C:o&Ñ`Yjt]p2T>t+Ok7g^r"sֱzS!cxeﯩŽ:ou1LI_UY(p2axF56{MЧeMhԩ>E->4fMX-PnXUΪaQj"V܊W\4n*kvf]͇(y!rl΅amikN!.giii\u6h"} WQaV IDATb"_\rqG'Ie!D7㵻 5^ygOqX`3+[v;颾 n`jhg OZ=ASӧ:r*x"ahc.q8y>)|1.j>G3'9ܮ|7OTagLpLeo>]:axd K~"b"- L[A\4y,+3tߧ @Ypٝs7%)ۑbn?}GQTЁ=6;ĖU,6G4+:Cl/p.\~nn3|p6 ެ4ǧ~sig4McK/ֳgw,X9gyפ5NzYː̊#f2{:ݦ*(˫=ƚ]s1M9_ v&:gSG\|h;(t ֗{6eQQ-KB4]EQq())n,fh馲XDGGM(qWQ\TD~~%ŝ/=VɟoBq5& oM ^l'iƯnR_cQvJ¾-J\.~3q"ӦMg㭷暫nq~CZAL&zjvn>?]??IK|4Nxp+D5 KIf¯:: fmn$#Q04#M9Or®wISs;(d`IpkK(8X}wלB(*.b-dqGvtضeGng-ݴvk]x7Ím,}E>j$¾R: 8ꔺ* j:.rkHƎ×KCfk?%KxaÆi.7lml{ 7L~=z4?,_޴`uz\Ť@[Ct&c|[aMLp[***˖ѷo_>Ea- <1w.V<qqq}=TTTPTTěo$::=8˾N=5t|EQfǎ wE49ǃgUGEE1޼:iEz&EST5\>3YqZfQ(q[36lA=~;0)F7fMkkS_nqݫ]Lk?C^%hͯ9!c8GIIqlul =zeRR%ŝE51T!M:| me_S:f"1qls9hU Ls: 9F&/Ň_HL_gcgɘKu̚SטO?_}ELL #G.ʫaJJJy*N=TЛ7o??޽{7;-V[ol6Nff&6lhɼ:0 4S,ᾚ :=sYAǢtל] MF ߄!2B#}[;=?sXxQ}lv;>/l#ñΫBVkjѢU_ppˌGQ "ZlG)*@4 lv@OBl=4VϬMM_D eق;?(M Vt& 3+jDQ-N_c&OĴijl[t)`v[5Wۧj TK$$$PPPz}FK4N,FsIC(Uâ(F8\L5Upa^Ux$eTT1*IK)CB#S^<-/=s;Km߼6l!hlEӌ_M4 MUtxhzwC$9u䄨t߾+HxIrB`qBԴП.MI_;Ճ.WlݣJf])4fatSF2G G[k ߏ4`[|# _(//oQZ:> UUa 8Ey8p l۶r~Nݴ [ut*W]=HvwRm~YtDq'9!%a oINCt[9MεW hkN!:|5#ͱΫ, !Zh9t=p -|:EY|iq$M_VL6udݤz --K_LYVv,Ck$PWlqmH:Ktp8lZ8矹q8t5}ǎv8N˱X,$$$pm/SRRBdd$<0:e]Ƌ ۛn"""gΤK.:tyZ̜1'z 9ӤɽujɃlW߯u(D-|[I>/ eو5gU"h^/ūWriJyN{}[/΅gUBdΜ9XΌ383ު~ᯊ~?w6mbpM7qgt:xҥK,m_e˖O:3g !-wcԩlڴ+OEE]w_~yԆyMe!D1ZѪǓhv:BTɓ/^wdlL/aH9B9ڵ:fÆ[Ob!+-cJ2r3%̈́ɤӖJ@jw3bIKpjw7W_u]{-鮻HMM`ȑ}剹s}trۭٞ/6Æ5ښsͥ%[(^|L`i:U^.tc,dEbX*Ivϡ_w8^O>){q}w_ӟ.bB4GA\sBkL&֭[5k~z{HZmbaƌi&?GmYgFgoX[O̙3;v,HW^AQjN9 ŋc~nԞ?J,h5ƘȚUԸԙ&.d?ʮ=/DEXX^/-CLp_< F`LѦn1O,fS9?lb_Ղb|m_UCb^khךvœO=ppŴiDGG9;Bsw7Wl} (4Cc}~?>x3mdGp1Ӷ4ۖo~;}Qf'5J^nڛK/ `0P6t5'9N>lzGӴ/cm?ɡeee4Vwddd򜕕ʕ+9餓ݿ0l6Q7xI&5y~:inúMe!DيnLlT㞞6zɥ<$7df&gcՃ9uK>UOzM&iX u|OI}!瀛^( iz؈aR@T l _M_k`3ϴ9:^sfEo7)1砛 t(L$.ډjt5ZZMM߃eswVBVxbc74?JR0 ]W]kZp^u&LP' nhy%kӧ#6 #XaHQ4]Ǥ(a_J hxOQ6]$w<-&~EDCQvƐu[ۃu봩5n)սY-fJyLtVHB~!4&uٜ|ɡ>c[}ihI MT:ׯ{a$$$?]Yb믿N|||\ln7+V8~>JN:$˹k4&on\)Ap, !Zᤢ 6]7FQ]3`и%@&RcXK`w8u'Odٲeu\7|y`>6sl2d}eǎ$$$ '@FF;vhobb"㣏>:l~G"##KC㺿?4;TAtHKg5X,@7Qc9#dEd2`6JsɄlo z^(laㆵHK?'igOB`x Ln{k7| ^>' y߾}ڵt4M m߿?wGe~?xoNNN{eӦM5s^GDDQXXXyݺu 4S>Ҳ,h5}e_2pp6qqFףiZ2ΤgkNaT㮪b㏸u'm\жYfU&j.]Q[؄% 뮻(..&66[nJJJOaa!QQQx㍡Z[nswrwiv[hi,0&96lC+DUUƎZrQYYIJJJk}$XBʩgL`_op*Àu'm)99oZ:)=z7ި=..œVZm_O><@m3gd̙uGDDt%km*XhՙG3``9봳O!&k/ܑXo{r\\<ILJ2&.B!Btz~ҒАZ̀/ٯ>Z [;ڱk=ٲP 66B!BvlB怣Njhj[]JkmKmV8XNLJ7-60B!BvOSL&b),8HLLmi͛nwPPpx4MCQLyV1TѬ`Ĥf#B!By,f ]SSٺitֽT/]׉inwtaX--MlXHIngۖͬX};R{db%6>>LuBRJWG+n~m&2FY!BOS0+b6BrJ* ,ޡTUmj=B(fIN) cnQB!>6ߺ5?cxM}>/qqIB!GCcJL!B!`Y!B!Ee!B! B!BZ$XB!B!j`Y!B!Ee!B! B!BZ,y!B!ӰB!B!:r"B͛7wtDF0ҎNK~}JY-)YHttB6QQˊ~Zn \m RmEʺt/G BѦQkƒC핬#b!66.LVבn?--kqx, !8ɿh Мݠ];q8h=n7{fon{ig[FʺE$XB!Dy¨&Xs'cv7g7{w&O7;헉?EQu=_(my==NYl۲‚$&%R)e-Fe!DŽN1%:&ƍn#^>iZJ44Fcw8z=C e~ڣ;گXI,B7:ƽa#hi%3$׾kU3v豵zmjFhp$ƒ,EQBx8R)e}$kϹH$XB!D wvxێW9@05iBtSnPS]U7~i9ZhZu_ߕo`+2KY7uiLfO,o%B!:TxpX}Ծ_~x`5]<|a֦4FS'm}o uym uOkh Bѡ4M]7ZCFʆ x/g%&&Fkkk^|kp8zevi$^{-M]=0 E1 t [us,\ bXPAq 7ypp0i$>>l6N8ӧר_(,|>SLwEQPwjj*'NSOmAY>bѢvv;?Sҥx}>l6}6 ^ ĉr饿*-Me!Bt3b#b4e]ŋ3s 3N SLt4g~:iix=v;-U.:I=*++׭r˳=GUU b„ 5Dk֬.hȰFY7mQQQQ x<PևrUqYg1)\.}9}]>S/#//~g } /`̛{Cgt, !CUzخk1ue8Ч0j DD3g.˗/gҤI$'''ƛӛFp6GjTzh6P{&lrV4klg𳍵)[-5)))bVUW3fvM޽k)%>?͛p dffo!COɓ1L̚5hm { VCGusaTVVDDFY~""#9ڴ5h):Dff&r ='OnVFFY7UDDOͿwH"B!:qcip8| L:cNJKK9Go ~q9gϮϝwAaa!>2N:i<&MSOex̘qS䯺KPi2u0Oĵdg'D7E޽{cv\qӏxhvIFFF:9y5XFz~mҘ5vmܹsy9s<3)S.СC7C_!!!!ߦo}m:bn`Y/[bu+ƼyX'&OL>}B ˗ެkk Wxi3^뗁'//@/ZeTEѧoV;De!Bt(]V=.9,PTMUYryyy~,TOa!p78?'|.];v 7mb<>j˯X&*p 65}lgBe嶚lݺdpIyplݺK/b1u&Nȴi>[ z{k׮KUU<ÓO>Q#O_AQꖼÄZM,.,Z{3Al2y/sٜ{Β%K)//gܸ\vٔ6)ڂ^n㯻F[ʺ1'::Çs%c$XB!D ͆Z5MCUU.. LG{3fi˖}ȑ#,xe?S&v߾\wOrzƎi߿$Ev7lIWL`RNӫoj ootv}=@aXV233ٷ/ehg0}TUeƌ0`@TUe׮]/? 4- _gx1[jiMhimn`ШiFp8v}TUEQ9ׯ=W&OL0/͛1[-:i$XkJJJmS֍8q"S/s`Y!ʘ h Q=4QMDX~EEEczf>_ny3~:xbccٻgqqx>v[cg#858M[MWaɒ%t_6lO>8vp8 ?_ɿߵJvėu-6:5 mx8]U:kZ/?/C%XB!DBݰY:_Z`l_$999 б٬<ԓc=Cg΍7\ύ7\_g{KTNȟ\pK]MFQӖ1hT#v+])0qbt*C2x0|Bӵ~\|Onuqƙgpg駟Cf [̘q^xϿ"rW1r?lDh ZEAGA7r<*릊`Ѣ|t)6~21&<|)[nE4u7j; Fm-p,um GEEۛf`XHIIK/a '4ڣEzgUz-B!:TvquL <N֊Re9??_ynsuҵ[PS%L7.EW S}]Vk o&yvi`bg\c?3n;qSO>oҤI#`aylE(u #e'Mfp^~[X(,+>l>ƺ_X6*\Cۏ2H,Bi*::5' cB LN Y)))\}UDEEQZZ5W_ERJr~UӰiRckW07њd K"P :&̦nGP֝Ŋ~'whrC- [!fR}hPEe0(WOڵW^1W_u]v V디c=G8t-*S:4Sy4ҵgpY.%t4t]iaku;jòh+~; [!Fj[Ǡcg!,(A7a tG 69mv?!k1-le==z4~ԄZ[PgՙB0oPQtOAg W*=A1`MLR_OHR/ aVvJyvf~NOz`v6q&g{}YڟyfRz #܋cư@?л:owpnݾsmt&.5܄zA֥ͭrqqIGj5'Ai!sl5{֛ ޿$yc9?)k/슬-G!3FDsu=R߻k`zI][^{lk\V }A4dY#&m|c GU.,:/5#$Ľߵ+Z|Y{6 *e5~Zzv wmz䤍w)gsrG?->Y#kuf 2m$0Hg?I[|Y3i1h1l@4wlms\beg*"->YY3]h=f PYncI{*YCĞukưFcYCj4/99IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/RXSSTV.html0000664000175000017500000001205213203343735022157 0ustar jomajoma QSSTV: Receive SSTV Window

Receive SSTV Window
rxwidget1.png

Menu toolbar:

  • start.png
    start receiving images
  • stop.png
    stop receiving images
  • replay.png
    force a restart (e.g. when you see a wrong synchronization then click the restart button).
  • filesave.png
    save the image at any time using the save button. You will probably want to use this if the Auto-save is not selected. Note only active in SSTV mode.
  • eraser.png
    erase the screen

Sync Indicator (vu-meter S):

  • sync quality ranging from 0-10

Volume (vu-meter V):

  • adjust your recording level to half scale.

SSTV tab:

  • Use VIS Code: the reception will only start if a correct VIS code is received. If left unchecked, QSSTV will auto-detect the modes (this is the most used method).
  • Auto-slant: A lot of times the receive clock of the local station is not equal to the transmit clock of the sending station. The result is a slanted image. If The auto-slant is activated, the program will automatically try to compensate for those clock differences. You may notice a momentary freeze of the image build-up while the program is recalculating the image.
  • Auto-save: When the program detect the end of the image, the image will be saved to disk.
  • Save if Complete %: Auto-save if the image is at least completed for the indicated percentage.
  • Mode: you can either select AUTO or one of the supported SSTV modes. When AUTO is selected, the program will try to determine the mode of the image it is receiving. If a specific mode is selected the program will reject all images except if they are transmitted in the selected mode.
  • Signals: Normal and DX. When the Sensitivity is set to DX the signal will run until the end of the image before resynchronization.

Spectrum and Waterfall:
There are three markers for SSTV (red lines):

  • 1200: Sync frequency
  • 1500: Lower video frequency
  • 2300: Upper video frequency In DRM, the markers indicate the 3 unmodulated carrier frequencies
qsstv_9.2.6/qsstv/documentation/manual/manual/rxwidget1.png0000664000175000017500000171624313203343735022662 0ustar jomajomaPNG  IHDR bKGD pHYs  tIME3W IDATxwŝouyA$198 N`g: 1`&'HBqWڤiROwWhJhM}gf{{fU*1x%x±UaT6`⠯OH5}?NCԨ>(>:Ax7GJk˶?8r5عGcFPI2&x}XL쫬8*8x{!F`x|meq $wf#]q@_qڧӇj?7q Ho/S N#jdwmd7LQ#Y|pH*[5EV#B~!t㳖.{k8yUp)X:24M4M4`H&Sn:m CTiiRJmBش:v i,7 a XR;kiip(RH)d28yE0@(?RJs]$`Xb@p\`I8ḫxB)E8V|(=o|_նDBm^=6Qm ?]PvBdLii\:.7***`˖6֯@( X__uIm&ODUu5y}}}l@kk+yC?bFQg2{x $Hn][B,ۧ r&ap0X,J8t]SA h~ =l! E8dNx٠cx6F(B4  X>/=)S$4w8zd iG0GMc_$lI42u iiv8'L͘*2u0 `¶\L&C0`ι8XYgM^,F& e45+,  pY}9=%][[aoldnB0yW`@b{(z{IҘ0 ).*4ͽ>xB(L92dE pY"{h!&SO3s l${ kW8˘_(`/cWpz‹x0`~{R}\yzA*.jd^Dϫ'f@(ң/Pϗ>s)ō_Ko[ v);ɟmg|~F6R-iI" K4M4MJ8TVS\RD|0R)e.C`6SM,SI& b;ۤ8'QVVLEy]XL|blF3.&?Z6a 3͵uEgaw5#{?<#ΐ<%Ņ^L<$LEқ+Exŕx^Rnd|sqD}řy?H^$aة8rüj `I kIG !3olCO✙灵0la 0VBUȤm*{i~5yR77WX̭w=ϾNEә{l%<5`X-o=OW$n\ԿM4M4mEv?ax<xH-D6=B øK(& bi$cRS3@ 3W@jl&AUU7P0D[[ -M5@fS³8qz9.a2eJ*J[/i#[PXRIue)jnu#dH &ͦZvasRl;dRVG[iQb0ISST%&RiSD먯*T/5ASMv<@L*qu#iN4M4MiZض͘1ŐJb ׯ4,@q'-)'Dl.͹~/y<'""j|37U>!Si,8XO;.rQG|I..]OQiiiZꜭ?dr ae0 a&,錝q\ƏeYLl N1A+ mI _4x򻮋q4!DS=cM4M4M &H%SD"byQ,B)E2">' cl}[s\;mSPX@8SG2$HF1 3ސAۡ܍sF8N頀 ^gyY1–AqvgXbљHlHdoQz(M4M4MZu (a, a- "TvE)ѮlB?ܲr,ۓ ۓxʟCJ6Cp]oߒ^7'!P6?ԳiiiڶUgnWVHWNcdxk祔8M+},+iiiDZ;:#h4M4M4AxkiiM4M4MtiiiM4M4MeO`q{iyގ. 0 };Vii~2ǍuoS9gɴiS0476l]u]v8,]+Xn~Ba0OhN$S)\By'8E,Y:uu 1 L!LJ$pe08DwOB2 TL&ݮ$JL&qqIR:P(@YY)f擩m 1 T,[˷?p<ְx2 aܡ7;^RJR;yL&C2M4M4MI.$)q] \rч}{nb>OSYYEO䢿cY>HJIeE';˲x'&}O8ArwxW1}]|SW3{L^ 3gL/|<PD"Igg-(83~ N99s iO~N<2wlnׯY3gPYY՟-[93 Bc3N{O;jWiiIJLyy~{eYTWиVYXOpFTTwy<>C3g~Gu$64 jj;+ ]<ô,b(k֬%/cZVx-[:ׯsI4M4MӴ'4s8 `" nƍmGam ;X,MkkD4),,d„ [˚kÔ9(¡G=ֶlE~L$y䯏NS3f!ib&wWbqxG"TO$sb5UWJ1~XJKKt̘>7ZN 3gLu=L&vz}}Η @&L93kikk cz/YFgg^!Vz^y*s43OcsS3VTTWVːƚii?/1P.PмiyB L\9)|ݴ=6}*|lܸﻟ/XE*B)E44M2 t4FضM&!  S=4Ɖb!Jp]7NˆB)ÝwV˯}x]~KbTJȍP;m-..⤓N X۹/:;dž )/+s,۔%Jnz;w}qQʵID"aW4MӴي LP@Fv 5s61#zOكh3M瞻ߞX`|}lڴg^{)%~/vGQ\R̚5khjn2-;nyyݻ IDATy,^^=Jb8Koo,{=ܹGRYYMEO)j٦JI?sio~Adl`(7.e!a,].3rVZf&y ,[:sv&yJ質iiڡ06CU 41 vsz!Xv_0|(=ikk㩧f՘7ȇ˖455[onzB0qUW+lR.R^yM6U455gr£l0s'dl'!LޚXn-SLSNn~{ūʘj'|+7dYDzzY2ONiI --<,^)="'O"n[.% e { HStww1glHH$i̞=,\2s!JaL}9Z>}>cTQT\+ަ}9k iiڡq7 IFsB0)%'O>ϝwޅi o|=7KD"(J'8G?:KSf\O?!an-Z\R veHd|D.EMO2Amm 555K8nwyTVVpYgQe,^]=kN,QPP@mM Y9stI5&4M4Mg @ySLc9 ;9~bt۶KxNࡇbѢXr%3gΠ K/sdztR{1-z <"^]]iaf̘K/̢ExvWU2Ó~JðeRs=OiI)"_UX4g446\euQR_KeZmyDB7l$`P  ?],ʭ"w +WNPh[CCNXϺuy饗9nޱ8R@4M4l,vhii)_~)aPRR'>q, .۶)--#rB(d̘j/N0O$+ȵL<+>.W=t`<2N q쌍d5s&/|_W-,.iƓ(p D)g:i$S)<>y.mSL[.\t!{ e[tvr7$ii*Bq:S Ӵ$=zDvC_fsK@4M4MC~Rbe֨F"B)a?M4MvS-ﱡڸw*I}0v̎z?|(ẻt*9j! aY>!-ii𣰰,suue\zPh?Do1ߪaxMs"0 C]9B4M4MӴcͬzg9f4M}`Kc ~nyf أ:5MkFQt*iڈTU؝ Ӯiz M|p¢b}PV\ ]=j,#̨e,aIZ)f;!6s]>V dm-KvVuuEb4MӴ7tvwvݚ?h68A-[0bLM-E[vX3LӲoB Pr!N>5jL> a@_R=*E%TTVm à6g0R5H8N(6oj$>8ʼi [0 u= F󨪩!}lnl"L,ѕ=i644)Y_J8hI,AoO7kVc'ݵfRIXPPXoFiyQP$T >Py%'y@KTUn⤽Z~KK3׭a#rtuHę6c^tKR4_˘߃b7ISث4ojdsM=f9r~`60a$Fs= P?-+65l`Kk3U5ǧi6BLnJ'41e )+L6_1ǝH4;s܉-=t*Q!o_;&D k7 `I?{suJd&P^Q"fZyEEQa(CNEEP7q iDKGC2-ɏT-R#Oa=&Oazjƍ4['4 UTVS;~͛觠NbBĭa 7͍ƙG ZdS>1^ryXئOϾ=||B m^Tu'(g*g2 r5t?sꉳ8q l8.T\{n9O,5cE}WCZ-R V(H()Σ8XlkO8mK7mmݻ @]aDUum2^@?-^:VQو4M$ 섪{^^zzR[o@*;~&8eLQ0MLd% 8ں}).u򰦍n 3U+eڷē,ߘ•Ղ s'xnDz Jc+ 4MR/AcKO nڛf([2G _ayL(u,j+G+;FͰxKdS>]7v`VW)WlHӗ0]'.yJ-tx]N<)q]Ey%Hϥ47&XjS/eabM_-o9Gݶ$/ֶ3'hn!rH4Iz{38ȝЇ@<p*k{6aKpM'ִ>LD4m RY7uKLY@v1sr bڴizJxWo%J@opq<ϣҲ\vd-_4MĬJRm{ }cS2auaD4MӴI?#(sN9=w"{vdqŅVQH$!)KvԬZZZB_?䙟xmKi䍔}Nj'Ou2iڈ!R=>a) $ d8昣yy +C|d˖lƖɓioo^8vHRzd .8WR)40iY\ɓ&?06n݆PFCM\g ;DEZk\ea)=IU&;2 L!>ɏ!P*j /W ד- RgKCW0{hPT4Ey~J6Ĵ & fÛ",h\^3JO)2vBڙ: "vH86$6M2&qRT ;& fppBL dqޜ:yտR҅D#V!}4MivvI&Nu]O~N?L‘g}6<~v!fT L9b*]t:0t,;p$ض07Oj6t L5pw5bCCPhA,1+ͳ9k1/ҟpLuq]wmyha2H @,l_5uZN>t\gri~D/s"bܑt\ JYQ \$SfEKl]u5y(XBb 鱱eJN^0d7e$7Oϝ%fMFe#8.4"qH$% kIinl8qH2Rqiokg/ץx$t+`Q__Ggg' yD@ryC4MӴFf9^֋{c[RuR45v @.'Gɾ} v2}O=sM w}wF6X!4M:&4 K"E%ܒ`8bt-BmuaS"{y"!j ĢԆ۲xC_R02?عK֋_K4g-8ttsW_浃|xeuNxkBaΜ:We|}q"==}<ນku) <3+oD~sMEL"E Nbq rLR7Fw8M~I=`]Հ\uB(nW *.DD?f&XBkDǟ'0R㛷0u;飵Nl[ RJ~+VuIv֞bǮ={m)7K.}?!m4HEK)RpUL\.wKLOKju!a OڵJz IDAT<7Wo6i44Kض)RH |u}+9s='%^ř3'y\"fQbfl)~jqU ]O@,KK"/)RHޑt9]!d]_xRn{LM[ٻ~LL;]] X {+ k.vUMFNwH"EG \ {Wm:ק;504Doj6(vNyW%1I@P/'I"E)R wxmS'"iȫɟS c)$Z2n z)I"Ew{㴯MDQȕS|/^NپsO=\a-nP&eNhWA 2ޠeb~u뷔H"E@z]j]Jyͱ0kYP6I›{5bR RkǢ !cǎ7,|C=};wXw-x/<ݶCT -8 k"׭_ƴH"EWoI0t&qQJoAoO7o[۶mc``mxdnnoIDkͣ<<[oŋ_:BO|7n[-m9$s}J@^h)#B(AѲ&/55'Ɍn١S"E)"!lB!n$W"jLNNbHgΞ! ø!iHøk= #!= S.CkͿ?_tӜsJ:/=Ja @cZdCh= >}РԷXܩY)I"Ew`e䲹 =fG oR(~IFԧ>uy{~|СC|DmJaYA h0::zˤuC, M{ چvy 7(+I8ފsrkUJg|)RXF_/wQ;ɱyg~w^ܹsFd>ib6''r|d7ЀHi H]m0k&^}1ӷ20̀h;?-trH&N0^3̍R'} qu,'ⷿ tͪ;rquFꄞ"E)~|eiO#g~5Ǿ{g>`B}C׮ٻgFv|#D+$}lNǗ&):yWas{n @.ӷ6_|_% yّN "— ~#pG@_y$݋3 y~ %e]s<+р1+7E݁ୄ|~+)I"Ew:IwDZ)Rw `7;;V^&}L$8ZXv?$w:}qM`V]ؾO\]$$6`7릂&,[G6tǂxэ3.wL - U?b(Pi*54,ȯ`uyPMtH"EF(ϲtD*z.c_5H)ɧKZw X%5 $ Rv?s 3)*{zBB)s D`>(D:i7$luZ$ Dm&dgubn2yi@HHlPI H)Rk5:]CӤh,Ac<ƚͪ^G@vuٹ%7Aٶ|-, LÇ&; 58$KU UܖD@ZNUjD5mZ_{>1+7:)?-Xɬ:A$))RHn!MLv2GJ"2Pz"L_̓:5l# *r >f6u9B?@os*% ׀/4tB< \E(\)0ՑB[mzpܥc Z5:^W5X~^-CIg+dwc Uk\V9/Z=^SXsk6īW:Zfzc֚{z]][k$[iWZK[?5x6[~ بj[՚WcΚ c3ֵjDk7׵Eyƚ>w/: |mD랑\3&wvXggn1#^xݘ_;q[?g&736W熹cmyb:Ev<=3Yusla'׍On]&su6 +oZsOnЮuu`:֡պ'o2Ժv|]ֺyȺ{&T4R ƹ>j@ uL[uʸgiH5uS5Ԇ3=Е(ChnY-7kdz5KpDw:U H ΅I&} ɧ'v׾'#y=K|1l ޭ; w0m㘞sgfb8 -2'MV]{Y2zbap>D/q7 o/0%Z+зY|A. ǫ%]4T &0ۦ8[5[=8͖}T&=)f>`mc?{{? w|:;}t!|Jr4԰Bw)ֆ)ݵ2Vڃ:woO0W(D#-/qEav<"@~;0G=%.ryH!qߝxj'aędЃK{Jxv07tT}NQXG)ۿ@a z̟~8dd,KW&_S~%.^>q69v=2irè W\8CՀcaxbofOc; 3I1xyfsbq?Co{УԿpq"itS >|yAqEÝGo՘;PC˻1#t.r!Q=Е F>D^aj^</mK2jSA@g{Xܞzl: }vt3ױRvS{r.@d7'U2@?qy>>鿌0Of F)V>@Pw)>\gą=&oH ^ފyh炤Yp^yjo|{ W ԇye/젿ȅ8z;F{v}sPѱlY`\89[lso}d ٓE9F]Ziݘ[d8ChE3$:C{Kvb@DF!֎vON=1Ud_d04B=sG}L`^/#4Qo<̐W2\Z`%ܹ؜acrsklz>f 7^ߎ{CO! ަkMFOIv(rD3\w6ɱ v,^9HnL>DQd3Ng爲s,G[ް8HEK,m1ɞfpvFEn16sfw/XBB:[o|Bb=r;.FQx-fdw_gQ%z༽̰v0 $2TGueJ6@wQ'(5 , ڄ9 (( w7ԅfDh_lAN5't*+fTbg'g ];4rg/rFz1r1q+0pc-Pzـ!T1Mc#;2;F y0#g\ EYjѩ|ܖjYDs%5?;y_E{Ά=>|@s%#wps!朠,l& ļGo ?aǨE) έ` 5{mfD3 =P59.MT\szH _,ڨЮթ7,.\" Qpل =W6 2-ݢ^ PYh^Y"lLsA1l,h&C!l=LQ VQЌ/5G#SC̵PO6ۈBi[W`sxʎvo@d׈EIԶj_z*D1FTf"p247,jKM.0rٕ:Q,Y YX͑7Q}eⱓ,QX"170qȩb l5Yq}ebix{{:ۘ"-b衐0yM\RD~E.2^1Bu{} ,Sb:,naɆ*| ^ hFpz"2Q0k!w,a0t);Fvp-#*truU ع]+F=ju)H3v/H7Y+ހUrL87 (IrU"rAT6˩Aqx"\&&n]Fk8i|wNirxHLmy$_7q\*SbH6`, ăbBɒdMǎ Z[;:԰ w⷗2X^y?b_ɥM9]3=~RgDgcGjTFџGݳ(FTʝȮN3ov {rdQf}Wqd; t! Žt]$_bee#-,>Y[)c?Clݍ{U &sfʦuh,(ގ 1 LkN'0c!ScakL9Ca#{YΆ='OU &I>FgA9IA˼ʈ:Ylr8e,$޻T W`qzVcxsPBf&h#z+e<*(2Q$2'4"gl`, |'/&JJ[]: I:م ŠV >5`sCt̆oPj1U2Oc&\ w,=gAC, \Fm;0m%͒yEߪ[nܶ$E, )%5aC&5?wί0 ҇s玪U ڑKEL⪩h#4I:Ӧ՜ *%ZM584 f?8gwz 9 ^Ig; NDiS:U `HL "fe '`9'/_ Muh:Yo5/$[ l(y 9Z@Mz')4*=l͒&[ªF}8t|ms,;u8?K,%hs%|Fg ç>zjyQ^&mCtzi DG ?U& }=L@fOc 4h-D8DbH ga*s@6rMd5f\dC/;_uodͽ>npy_aT)@g46Ȯ|[{w9! IS VC//-~9~~&!BL$ Û_MqEF0Xw:Jv#]'S(g$kFoztn IL:y8NŸ/W$ډ?R/H>+n"V HQRCɇK%!z)OMt9?|:1^Fė$ܸu$1GC<>[4g<& +++ AEG%ire/KpYmB6HЉ'>K|L;n?i%%b&?XL2EٍQ!6 tES r7O`9o3_:wwPi=6L|#vGBP\R:,#z9mSCooǏq肋,6|Yj;2eۨФVt ڼT\Z1ib^Xy6ҢUǎL.2{ك9SEvnE:e N! ЦF ɢ\gPq rMpsYӃbih( QZF2Y*, (F(ri(hВc)$F p iNN UЋn@\[ƨ69eFtɋ݌1JiNUh6-,Q*-N們U EnNA9j@g<a,2C{Fdctlz:O590\h@C nIhC4V_f!2h!B$2D1:>3RP$Dz<Ķ YBlk@yɧZMT0ҒDs%by{&$C-1ȼ|/tHaIs36"D3DH7X"4jPDAdbԌ}-fB@ŋ?C` 1cJsPS>zg@yPqqff; X p'!Аmmplj5(MI0lc6ѡL|mK|< ;%a(Ў&Vq]Sv;dl%1C)1MAnΠ&TH} ]F4$'ѵD02!h"m,T&L|TDbJ؏AhK0;T 1O)}C2|bJ-b2# Z=6T", 3$6BX= 1M&tU;g{5[9~̬lLsgQd(Jgx{G-VbN^D l%(|ܳ g\wotI"Z 'au )KYJ$binÇ9|d||.Μ9C\f׮]JJB^?9*2~7!'NR066|۶ٳgJ)<oIww7vX,3[VDqD1ۋPNQ-vٟ~|? `F Q,g#o~hjm>3=3y#x}(If}#5dVC6mR[6LLj_VS|u '.4̄XQMdWOh>JUh~AA93ӃS(Q1:EbPKM$ιpzvA59S8z"i &!Lˆ9̸M *QHpAO9c4Pn@@̃z )]"]r2dF0CeF}mMXB6E *DBA@ t"eIk&o 3\R躀Є6E4 J`A0oC3F &qGmE8J<aȰ9=B>1&#(jjlȻ ɢ>BچB.ֈa!Vl.X:'Bڈs"mtԂeݐGhm m+Z-P&X>"QPEIa!L(QNъ 67^BD1kSX1b> 3(zA&۸C]da!3k /1Mul$]-Br@rH&hݗ˜C1fL}^_܋γP7Yjdbzvq#s٥8`-/>pz٧3Ԟ5sHI&qDULn{܅`ދɘ &z&w`f5S^dӢݡ!Ȗv &\x:!]r^hC&,I2&,*d>_,sl%Wk Z}nB#)ie4q$4~D$g[%c̓5Kϳ{7iV,B! QC6R©r"T*El CQ`Phi$4=lL/޾Yy{GMECͩ~o?s}w D%2KP>2eU 3TUEc<͗S`+*뱥#3%>ّ(|Awg5GEIdp90,#(B'0fw9/6fK=!盬lCTm<^U5 l3=AVt o-Oq)VWW~ ,^=9??R޿$IHӔGyxaWKF_KOyGټr >ߎ??Y1~<ͿO|/g0qb?ϹW_{:f}o M]q2ZN` &~h/>Vw VᡝINʠWY~^xs`7GO b0Sqy}#j]WW_MÓ$e w]Q_s]-f?3jμ9c%?c{w^YyW>HsE-rS[O~Yzu{Els p/>w<9Ep?dk('[|rf}cO'};̫8}] г*)!V/8,_LὛ0ׇp{ -Xƍx# B`0 n p'27fx{ ,ǐ\0n$ dqw"oKU–sQ0@L3"D29^7xq\وb%'HOxh; JXn!3O41W*Qܕs|Wp:6 S<`ϥxLvGΥXz@Q(݆ ;$I>G{ӧ9s,7tӛ_gg}~-}<3\r=;3,ԧ>֚o/rbQ 0ҎG)>{oq~xs|G~T\D0Uu!~fp|v @g7+{f|l(iv㽺;QIǤ;p5TP\թn#;T]Z&ՄJ֚X XVYzW)Y _sѺ<}-<)X(p<}Vp14ǨA'geI}4?MxTpYgvpqfy7ݷ4yh95y9OX!G5gyMh%F$e`M7\ <u'mzǎ0J1nē7ə9P7#[ހ<GFy%c%e(OfT_iR?Ha]\`C?]R.ZPna yCS68&QOm d,^<u([(KD'D̀1$C- 1QU+BDPoCPm]sI,q5iԂVL,$ ȯz>JaZ"%@D *tnPϖس0;1gb2|W`m=H8,8XC.P@>UBgJ"YF6RLHr$]9Z2MYi;-cM ̚"Xpb~ (=㹌]iZם/dd'A -~ Yt9CsX>XĚiEemČ0f)q͐bNŠYB_\(镊xӱ}.SBwϐCAߓ^)B^a: W4wW gsz7[*5ٮG0RgŌ@tYDz wT+ zll(]H=*7vIbd$9oK9[Ud7 f,XqRt ;8c!e){jB_hZ9$]InQ\a_s4͘vR9ZzӎjQuDR قĖeMe-#S0,!S)] d+ܬLLV17(7[5`i [G3į" 2./t*ݚA#cHӔ'x( ɋ ܮB'DR(N IDAT",CA0 ԍDQO|grɓCk͹s8{k/ϿI!&{cs!;h@qIjbop詯 i[I c"pwYGl-$?x+#gcbxl-+Π)\𹀖e䌂Z=xp 7H8:?S\=lЯis`Peq@@f' ҃ &U]s7K|֊XP*¬Ct~YoLk}EGaQX5eMR93Hqs4ȼF[d2{|kN E:1 tK(x+jtUS8|rkmSOt&̬NXG+L0eW9T9V5~60^5 W:/)h:A "lTAfR!kOJ JjqX a\7KF"Z 2-  LSb^LnxP'Ŝ#;HUB.&H" &ܳ$< BcIɣ%-torw9"x^`R0hazPz<2LTқ ov+F`<_%ٿEPx!=zlг @$5]Qaፂr&Dy|WnzVHkQG7~whx DC4wKχEZڈbfp\5j]41I֊xI: s !::OhՈ񌦿RZ۟v 6Io;do^3_ӆ5'=,3{ |$gj9)tGĹ{BCB%#+Lh:ۂA %,"T38 Ɇ%)eJK Bd84({c#HF@Q[%? \aHҗFYibt;'(gajbLӯAR\:6/y©P{r;J-:*`6%9 KI|!9 Zvp@s|^TLM*$ Z}iԋ-/( %lPV{N5k۝ 28?L E#$2=/֚ɟOk-?3?sRJ~x;SyY^^'?z!*>)%J)~~V??R =G)qZ뷴 bM]]|#'n̋kRgwgk4䚽H1nߩE5u' 7sc[6u/iݩ~]8qǃ \}*F lM^?;^w fI1C;8WUUZ0%8`k.Xq"B/ݵBO: siME,&i7tHɹnʃ zRi]qS~<.ʥ%N\ +ϝa7ʥކŽKGپ=<|sF@BC"W[ND]IS%(7Q*טgz3)12\8zuL[M> Ci;(*$MGYF2.HCU7Fdx J@ᑈJTR FgQ$%A1p,Jcz$>juhÁl Gӧ QfMS>H@J8cYBznF tPB ZU$9E\PdwmcZURȐ4+\BT pghc,h!H#Lh*b 2)0M2z#:xQuN AcdWcNZ*H@TDXiŽG41І8PHMpD*!V{Ahb8Z`C󸎭LʑT4 3!+ Z+DǏD)iVqCextc5(CerlZavO:o8ǟ OKV/imW4 A)Q![̦P8\ƭ_ 9a8ˡŖctA6aKz ֓,=A5vD9;mhJRYGw c Zg Q#ѐp2#L3\ORm}t@<f%!EC;5iqZ $yӓI=í秹c?bAN%~%y(`x~+ ǯݑ{V@o߫ǫE ,:A"87z2sG}qbV?x;6ꮄr)ԉ}Щhf38=WL} ?5!lrg:q۰b&7βd83 2|/<[mX7m/px޻ȕ&z%,M)Jn C![̥'3GY̏xB}%lOP :6GoJ ya=L9c,%ܳ:Ͻk#O]LŦV\ -3 f)0^}"CT sZu=ZӜ飺 !֍;3l|vDB/6hnhd޻$բ&8bj! a& "`0ڬ+Nq#b ۣl<Ȭ1n;l7c2[5m0T#]GA)>aŠkc4p :Orkp0ODO*C rw% ̪s.F!f-{‡ g,#7&W+-p&?C`0U }bb Po4i㛆Tp"a^'[$Y0#D`{)%;4ygxrJI G ft _.:l!^\!7gݼLw |˔D=fxSݩ:wy[.nL4 G{?'C砟\ h:kpDRɚ,k*|zjqPT/߹ F32J5 iM*&r\aiP =POaXwcw{z,.L'?+]o$M|o Aׁ:!(J?倈2 .^`fu/3POr4ͯh\ʙG<|쯬*{,-OL .ߺFyr,k[3Q=c%FZL#>a<<쥚`a#熨Y{wF|z{ynn{fV{4]lh $@-EQ6pJ\.'}(V|Tzkp--<^alAdxI ;d> 뱑Ħ"k"a34N4腖WjA!6`\z"s"DST^?+  A ̸9DD?T8%jH 3TiOacM Q c "ҰAJm'k PuqE%m) q0!TAk"jMBdRJ!3-6p>b v4G*%=(p UWF5.x!qU1՜ l$qVHOs|CM=HD[ޡ8$=H$Ei .U[:lK(LsHK*˰1ڐ-a@| H.9P&BHFkG#=CPyXҦR٪[M{]ޭfS=,ě NʪCܩhM79n5KaKJV(o8Q4-Sƅh $~(s%>PZ![!G(;H!$ z!jD8 l(ux1=.TUw>¤ U^ xF %~RPUBz7ӛ͊ˉ*ojF+1iys1^pQJۖ 21m1'4V8"Gc( IUh!)CMf"ҡ[a Hlb4;MDDjZ”ECC+"*+"AafȐ zKji*RL Q3 M.ɳْiw;E_i7K,vN.D{V5e]jգ' xn~ɺrƶ9mV]}# `UqcFRG3NG1G]jZX\ /LʯOf+$$15ҮIXh7K ZeɯN@H(ܻUon Nb͢p9-}iJ$C-300/q]Typ}iË-r$*Z(S a jgdsU0}<$j16 UJTTc깰*: /7\}͔Y- x eW[ O6(JX㟕·w})U@Xqڷ4 A84 #˨si|} _`6uuE=Ci:x"ŲvdviZ{8#ʑ^ޢ*g&fV$j#f X ~R;v9aCy.zVvD%.ѭ7Oo_`}} Z[ N!W,o }~7S>ltOuG k{K.ڤU,꼌j IDAT׭7[oeD[xq5yeQńZyDϊ&t IO::٤M؉o'ݗ\F;È;oXo]:1Q,6[t' ο5: #2n_QVwUUs!_=mg\Be2'Wwor3aԘA/gu|Cx#?xQ'$:Oz Zcw|Z 02rYGP(3>2~ r#hwqS` ^!}L#f;eӇNN4k,*Y 0!Ni3+|8_;<ۃ86i`^A!yhf bXj kc ye y;уK~j+y A: H <~:]`zK@B`-a=W&. X)x]AMi[5*Xug:8VP*N>U0⢃ᝀG\ tmy,N:Y}eᨅoT.eu9@@M8ף:[@jaKxEv%w&tCt\m8v؏jzRA\ v|jT<9 KL(^|qUtaGΫ${ v׼^ݥjuFBm[%0~@& 0C D̘q!<&ckg Xւw޻\~6'KUjd hp?"#22o`C/z4ԿPoiK0Zf)J#e^;p3t /o}1hPgp6npǫ`e셇}ѿ>H^_%#<u >r<%XNt>n8TAwvv삓Ϝ\v Ba^1M djɐS?~̀8;ndzm@_vPx$4FuJwoǟ 8DG$c=O[?@$\٥rYmHxeغ^pzqc:>̟{z_txcS|$T}K^'Kdg&E̓ ?F*"XJ/(n-Wl5Ep]Sc,H>F0 biʚzB-˳79rqfUS?K]K҃ 9Ҕ='w/}b@6%EϣrCqJgıDlD?!`; VFa$A ǴG7Hf$g]0wp))IVcCH F}\Vae iג@ ĽW'aKt֕ G'0J GH'ZP ic .\ ,3b]B? 7Z\ZE&%~Ԃ g3YK0d;Cף]tL"@L#dQA-#n i_#*o<,5LT * 1w&b .{DimL$Rž~%>?`w&9QN9}t7s\ok\egz'OsxWO)ܽ۾KF&s UKBB)44.ܳ ģ&7UFV\ܳ#9Ր^#L,b"$>qjMLxw$4ERΙ?혽kŃ{ ݷψ4## W"oN<Y=6b=Wez~Io4 >ɧ`\`O$ $06 \FqrȠzӂZLoMQG9 E %7+Kxj>897'X?~`Dܯ8 0i?81*nl-?Ywy91g 8˜o+Q`0l@Ϲmko^ю!Kkipç9~5)N_@ ϧ{Ŏv}3 ULn#r Ht q[YAxM7z OBͲbX ]"xiTw}{̀W z >0wF-tR pM.pIܾbwU4"0i{~CL@pϰy,rog ys;d/(E=Pܣ=c् N=z^ {~MaX,7x)p%k!c-v;)T g8= O󬛖H&<13|y3AxA K&IDE-j#!u b%y6 j¡!]-m-su *u)l&;Be=Z\w|Qj% ֠DŚ|H3#=l6@4ɺG0 qBXw4mMEBJdCX1@`[-rV m`Ch&kTCJ=p"X$ZjZdvD/gˉAbke_ 4uJ2AQ΋V$G d힏JBG 5vnl@3Ii+A GH#q(p.$n4F/A 7PPEDX 0'Hu^>o}*g~%2 5mKYKX3 eeR - 9mbX?X]ʸrD4n]$Z&,7͓9`Ӗ ,F[iG=-~tl]+DbEH_Nސ8  Q;}4aDN Jw!v6NDu5 Q }Jì'XvDi6?)=V?Q-͉NV_eOUw]|g$N֌{}|Mʰ"]q5F};U`_S^ Zb RG\57U\0&=i"P+e^o9#.%6.yoqS<цnS.e;b>kN_[3^!eǂ5?ǎƷɝ]/ ;wAj;Ҥ۲!' 4}Nw`I^5^!j09jMwl&|fI+]+H]\<6?q>Zw2blj:hwl<;3xyԝ@:iP,-º'.!D 5!$Zgy쯿]Cd7h&>ǿ߉nmrj[b 19mP\K* "{;obq nxƏzBcVFl?ğl~;c2H_MJ᷎a9!5b6'bG Ai!5 O=E>K⧑Jo!mi͊-\B Q4$G6u~8 Z!0&'[!D;8N Pp`5aG-i|) vag0>u'dXND}%v}̦#۬)g3t ]8\hEL[M7+o,@@A߰]$O+af nU;uSumYFMs=pnd ""2<+ڠh;mkb8ڮ}5*yp:o2D `4}ٕ4 `SRrDGuSH2ޛhSB_! \Yg"1Pbm RjxgNaEni$h#Z$EH@7qa$PʳáD#V$HH,A:ry fMXV,QkMB# oFb5<,jXj[)OZ9H6Ahz{]^T Sv~$-D\OtXǫVgeB%!DFK']FsĆA.ʂXy05[uO8ܔxx! B@s& t qN!ccxL辂 mp4 HQ(IgTۂoK[ț5R'/W0qq{~d\}x,Z" џ=ϥ~~o#W_g@&ۃw~nAr\pqKHt7^w`~+c<ӣ Q%28X.aG p[&BX^$ E(JUG9BT7yِ8: )aEL6p}ģ bgJAD&pTƒ[q& {jxϐ3Mp%Ro''RJtM,;PP$`Z•#h%bÃix$1;y v" X1I^⾇``M~wNF,t&6#[{8A,Nh$G]ԁG-"*ι '=l-x7s%q1 byoI54fuR }M+7c/:D8a V"ai)_B,5=5dBkk>X`jN p/-iv$ITAlGD+(]J0)cK)+rW)Y,W:@xbEާ6=Bq[NƆeQI< 6Diľ PMY٭%GbO3B=X|tC\SdmCzVˌqg [ HqՈy=b2CCEJ=AoT-1M?zGOl;{BE 5gֻ z)̽ FٳI6EA[hr5.>"یT5DyÖ8<,㚀CF!6mn[cUԳaH|f|w"7صϧD{gs?X!sE Ś :m%U?b{-lf;BS(N1=Mq~<29 a|aPR^3źMHZ,^ 1.Ț)b P@hGsrߢ7a,}I\AvVS`\ tZ=;@B)?ȷ~뷢B6|5WUuyG}(^td_9鼺;4j0n||~vJ"/7_#t }]1K:80%l TIw@[bstNG5EڐN$I(X(j F$,Ma%l*ebPb60KVuiedSTB :aGDbpjErӓ=V^Ga;ND)^I@+8G%lОLFu̍0 Ft2$DTЛ*6HAYV sʠ1>EkL(rjr2A4ܡpdђhD dl[R!݀,n3lb_I*;BP3Psvb', p>!̐9K1h ̈d.IX!( YfuA"S6s, ]]pIƁ3C̸X$K&ܯtLQN4erLRk#ńGz=. fWLMHqѝTF lВׂ6e5ǥ!Wp*Ղ%}HhX˖#}͘n1S{dI"HX,Mફc 4 jHÈ$A~hܒ]+X%bUF% ZZ\tz596VS)8lkVUâ)ي, ce#NP)dM$ fEF6A nN;- Vr3BQˀD3NrN>[rX%Vx90G CBYQDdj-VԾCUN3aa'}/+żPl̚SGeNvrȺp Š 45:LFJ'h(FCJ%9 DYNXӮ*| _  YBRhU KNDgMC2 3f&1=SdiZOYyp?O~|=-O-oCm۾ [yOnopjy 6 V0AK:(:u|ɴi_~x~+?I6ԸM0ü$,"6ϸe8Ɍͣ!z!ִ 6LV\JPbΜfF$)|J"n6=zMo)RgٜC|qG̅M#0 #Vg 'O23ң֖4~ :5~Z][=*a#gKH4XϬ#aL ;KCyV%xD-^Y℣ʐԈKS\WYKF4˴OyY6K4 iIdCfx1Q/5_ ;jD)ٮAռ<ԅTC% YbN8"y)qЂ+ig=*XtEF=q䌤8b!=uKbIEDCd0ՔcxNc$URMqzs(49ģob;AW:.8LO4bzkDRA =>ΤU0%K\ ©|d^ gB֤Bˀ.uiw -g+rz)S~Ϊ!+[/*ƬV"yeBjВ=*,<&4oŞYC4!UӶy`PB%80-$)֖tk^ѐjZ2W!9B؜z!}DM8D#R9*ř(^NKMi݌'TfkN=& $=׻^f9!OeO7nM!8kP?#o6Zb^#doo,~x?؇>/گp8.#O锺hۖzt:~_~~moù4{0*g}e]Nʯ& ?ދ. u[?w*2wSdnKcv+ \l++_RkSoL=AnqG䕔  Wֺ3Aӝ/mw&͌.y,Z&p*(vg£yuU).i+MK*E֝/@ah#m4Ai]#'W()Q +$%h ƯX -*y^"x yD uL9@[eDWK@=MZž'"e%3l. #B^h eHc%--.ڐ3Tbg2("u$X\#WHY ws{x^qp߫5xǜ{?l̑}TwpLyPCD-/OCL;n-6qOܲ'2=;^(F[VV᜹DuYds^NSsE90{>a7;*)R IgGޘ20M7ӝVFnnR<8͖6k`E9yf~WrBkhV5 KҶ<4 ,CKD3&0dn/97TP†6Utthg'۫zkPqc(ƒFNj #F'6csY&:PP6*'w!O |Llh @>aR`#ŷ'ڲpK<;qbUbU(3W^7|3/QsD r;ySo|secƑ}c|g'?ɋ/_ rJ/S1|#ۿ۱w|#}_]t]//ހa駟QU|c~闸s6M|uC2;ھʻ;yO5dkoN2xvm+i s#*ﰬ:`ɣIyդg~4aï *tբˀ~}E- yVqj+ٯ&Wm5Z+7ָE|~#Q0pu6l#. R[OlҊVFkE+@38DAYGf&Ў2{ìmgY7.L"΂y5⬥tEgP+5Mc39LqnXQ(,$7[!:K GDqTHKpQ 22'CvT035(*B%5j #dbP߮ΓŰo̔\G]znFfj0{J1bPd'dk牰T H%ihBZ5oZMc&e Xii*<5)kW}ZpP=,iAkH2*fpPXZ؋y|J+SňG%a%)(js7WA b,~59 ^ϲq=ne~Z)i'I2pB==nM:bMOC%lZ$4uؑZ\ ɑfIq8`.,= fYcki:W>= kHC%=-&Bx؜R?\;l Xc3 FOxhG!ؗkWDX91|{.zӛxw7Їx;Gֿժ*!Ɨ9gַ;;|~/ۿ}rrr||~ o{4S?S|;_!s?O~?DN~_a:}]ͻ:eM++>L?ZkkQO@kL>R*Wm)h]'XzHOAr+ӕݚ-k}@ 2 DZZlx nVt6HYZE Bx0ծC:I֌Uak5d[Wn[Q*BU#m Y WGja %U!WKcDW7WE@ 4sPG/Og@D)#</^QĀbflpڡ Udhu`1_Gm#RLTaQf]5֪FOdYhATBJlRbC QEd$KpLfd%!Gì<_,b"ƲU Y-f1 jQH! $A c18XX*`!zGk%%b] xaA*uToq~(c!Kna|tEPa+I3DW-p0CM`c+qR)& fr`<ՊS' Vkd FTi##xz, "%5<,[ܶ¶їrfC*cx$smc=յ$ ""9u7+ eqJaʧpxjO,LMfΙA5pV M-o= 8z.R$eh|fi,rQwi6GTXk-GN[[o#?#?G؏o~1RKy{OC}{773~]qqoz)c=y{kaRp?2/|_}'vw**7/kCH[c_IoyW/_Oyv!/._5/|` ߀_ݥ_#kYqnθ5#+Iծ}|tY& b(Iqn47 $|&t?w,eaLx`R @{}ZyX t&R 9ҋ!m:MS8Ch_",354.ļ ڷL6Ss K/Ћ`r,Vwq c2 9)h2:4A"-ˢ*k G V k & 6 PElE*VZ4YlX7 4)7R7f pN]"AƎX\tz%Z,KYtƙ"V=Q G̔kŻ5Q!فj$ JM ׉W-.Di3ӒSfLrVk+x:EMI6-n2)f)3!\5Iז IDAT z Hcc¹e dϜ24mC:rIKxv1> RU]&Vd):fG52K&X,Y:5! ~CM24וzN14s8/*>XHL*9rm=찮%|Ŵ2i|9N!fb*-d*y㳁Q0g3%!3B2!VE7dc̐3r9 |uFrM=fdgp:f4/K]B> i6L4,td(M1` Ml'рO nbq;p{n!`MN ڞG>KJiH׎=J^Lu6 sYOTy1Wn~~)Z-*${>Ə?#6˗fyfM*|Gk*W}_1} [^͏Rг[iP֐WL{6[-ÝΈSvBt#HK7ЋpK%QY )d9+pz680n*hS >hfI nĂJ{prxbo UÙmhb9T!\nqcüSwzy0H n e7`챝`3b;9= 7 }S/,Zr ;gz1bF(K=j]^c3e ˭Js2iRȢ%%iuA0dưhk"IC蚐yfvʌC)pX/@SܝrM:ZLc} avs#OHg=Gƒ<J8^$‰;lsu0UK,y  sSR5,M`YfeaOXGW"Bv)bLDže0Y.l=Z-+s縹\- l^Rڥe=)]̎=丼0e0MА#)+/2 ۇ,S҈tLoHrt/2jJLgnrF1;b7o#efm  8Jb1x9NH;iXfgNQ[,yKОVvK=; N~f@`Gˁ[:"y(>FN.SŐCdnq0Jo NzɒN "bTwc&x2QÉ U[@Z5WYPwdJ]:V ~g8thn_a iLcB>gj6$ h)1qڸx`:Fp nXmz:7k loUe0_\ڝǼs^1>Ok9l5*/_H. quߘ)(ʷ|ϗM~}Y nל /_e MS'hp(P ȗңu`-ÈNh u4x[F^ф`P* 8_b 3F:!Z mpR慺|s7x9`؋a>P l,k'!e7Z*vŽ|cioUd)fY5+;+o!Ӗv"5HShGasTI[:vd2.;8Oq"[x9?K 6Jߞ|iÑx̲!&.ÃJ >++o0e$`}ma(tOz< #/2BGWʅ0`6(9'їBqxU\CezL'4"0xexrUa0|@L8ᨊ5#ۃPyvB:)aZ}@‰lq q©#6x9a-G<\a5DZbl&"6P .̘gq"OCCm^ĥl#7㉣ia,3p5-H2{JVAAǞ\;w Dy`Yǩw\l9@ :`a&6 4h`'fA#X8Fω-YP28 ` 7'2eXs͑lB|hL"w-nrb)0t\-d`T,yB9V5ER0$S5ȋ &vY~$7 sg# Y @m==KMTx;hf G">ptFbJ!(%D4wT$Ěkl:a8Jo*EdAv;,%f0BΫd v86MX*Z "Bp-Zb9CNnYXOHpeŚ R`ĆƎNQkhDd$ tDhtwlE5i ރӀ d jPC'EZ0A0bmɱ!R'9DNw|w|"%p~v:f4e* Uxcٽjz>ր&*';d3>ݺ7.}߼k~gzٓW+uto*Iv{*<"m#]ud1-nt)mŴ=SRrFpb%%cjF]!e'['W+4Ϟ{ =ҽ AewT#S]` yx6q3&clM Si=a 抦  3`z‰vт7Po>ptvfm:P{ n>s9uG6K&?|w{6z͌s }5zvˢ;w]If '9-)EtGkPnK\i&vSxu=h I2f>[CI\ !݃2$_w-–C_znC#"#l>Fn*ӝs]>vD}k_]>Ӗ<Jgl 8ePgEJ3lNz^Է1{Mo y~ }+\":2 )Ip pI> 区٧\ȳr {{wo`z^;xYs0tC {7fua ʧjqJE~;X,?Q/ 6NfGhMQ R m6,%3Lm mnf&J&>`HJ{jxHuuz-H>X%K6PؙTn(I0Xd9\"G ZB©A,v:dAC99;7x텦 /1^ 8c0nX\DցD!Wl0Ґ_sSPxZҥ%3VQ5[Y\aLY:z$G[0&_hzi8i` 3$Jy0&|2 ̮h лL Ki,6(Y"yhpXX f(H)H=?4<Ã>C-ZTa5svv__^__%'W|# ^YZ]2f" &WzR #Wf*^Vf\A\z5B͑lŢK%k%. V zThf5Pq e,0jq Q֌jQXp`̊B+,r\K+OxP2BFBհA6ƕOYAgl>񁬁Y F [Y M$8i[2X;S|%o&Q񕪊HɕŬ.bbfRqh"V @bEȀYjMiۊ #RE-/P,-6ZBp1l઒a@iL*#Ց ",HhdIޛXvw~w;]jު7DQ˘Cflc6L/{&v؎q2Q{G8؁<ıeKljDMlnR]յݺ9]|8-Q(T[Ngy181H~$z)SPk@E bM:#HGfQn6nF]jbTh(T u++F$rUB PMΝ6(աQ]BPz1Tp;.(NHGPI>c&JX+ kFfq,t33ܱ:dk2֎lnu2y6L񸤰ZD" 2" 3ZLbI`'it+ ƴ!jr[w6͌9Kvm@=xu*yzi s._+ XR F1 12 j^1l,Eny+}c W._BCG+$|Sve޲ȼ\4 7ooi?c%! yV@^Ҫ\qb$ӟ*Yb:["[71$2.4D]Fp;J9GRF'TTvraMRLVԓ1 )x$ APζNZ0`!P^1 gW 'KҖ"U%=e19YCߣ;7{S,ͮav=d6Gpdr?saӤ1|ϝg=`"i'e25PG,|&BI!Q73deZe95h z'rQv"h*T6mfdԎMyZEKs\dF*&1B'K-8m`:G14QaH*2>xљI)7f$ZvAD J'"  Y$\ٚh6< =MXE bB H(2H )G!QiKLH7Sj GfE=y9ΑG6jQt$4A2PQBB8VRjP&C:xCKBu4ZGTT6PRdcT:d)5cѩR e4|lXȅslFX2"- hE>ׂOA28"yfE7,3Gԉ}XK%f5 ˸q6ƚn:&^IԬwpL a4l}gyvfᑩ9do>ϵYu~v^y/n2[dcB4h%eiIα+ Zj0 ^ "PO%Rh$'z#MM/ ]h˕x̟{>3r+w.8s8Yp_G#F Kg&cWXl]pcƛ򱺲BLǎGzka7~k|m\ݚ<Ϲqc}K.| ?<ĵvvHT}sg^ VFQ8ȒBkRTNp`m Ty$ih=30$PiEĤ!  #شڠI&AK"% G&EהX ECwjsq9xon&'9Sٯ,<,`#FF8Gf-ӐN\CQx%8It!DaTig9tgcׇe3$byf4p=qjTkKj*7YL/5%;F\ʹp [(9Pa{~k7?w]fb@P7$:-h4&FT9(DjC'K:DG!۪{"ItUB2cN-1DאL$Rdq ro@yDGEr$jnp&`(0dbhpcmҩ!(P2"d(J5mURvHFEQ$5 4I4)G\Cl&:PGEe,&$bTC/V o UnHF[ڙ: -3n6dG2(*hEM+lfiM &){氩5AWx%QT5Yl* !#25C߂5^RU *'4Dj x, tLL1ONQe(+֢3b@7B9Uv)`Ub3A~^)d0I ʨ0Ck.io~SXij0F1>ǚIeXnG ,ChJm uOf^M)eFELT 9$c4>!o͆V>|\3z;r,h|ót&籾& l&O#=YRjcPyQ|{uyJwmm4)bjb[7b?ׂ7[sP|#vdG_BkC潡֊QTU0 l_o}V@}5`I'BQͲ.t"5Đic9(4mv;H<(އp$!PkJ!7ig&zYTwcKs>Yl9~;;9yk?\H3ǝ5kٚ"%0{k&0Fi߽ĉrwp٬ɓ-yHhPDPIcE1uZe91{>Nqca)6IkT/ 8hϲQb^ps]A6k*4̈&SppP8M1`3{Q{dq9J)h(;5^9Wr%.mqes1\ DSׂ1 "moZ"^ M!Q*OZǸ>Z|nIZ yTD%$ig4&Dr$Hh -劖ҥ-NB5DTHmM$jW:BZXqVkjim&JK3 QHxQ4ArŒ{f1q=f;lM"r@(UE^NF< M@wګ\rk 7ƤJcIdQ6l#4UqjRK9*h&BҮpb[jYJd^JD2Fi<Rff{q{X Ke0d:F) ]#Bk|mQJd(|DUALIL0yG9t7ٜ~pý+<2{}sk 2㘙:/rZ?Djƨf&;Cv4*^Teb`M1;8ĩ|&q&3Ddfp%eJoӭnD3oc`ҘagXyg\Kq2u/S~/'^] 9FgG=^テ*h2Y]fbR3,.LH2¨0̣@򉍨*m22YEc-VyKɢ7&]zW>K'q^mn`">0mLnDʩ{=q[5V6WRk!bJod9ʅΡ"DhįƿGx5_W_mAoD1- ccG>ӧAH 1^#'}ل̏Ƕԯ,Y87Z / ߃?x%%终|8hXvrzV ġERN FRRά@b\b'4 2)rC1Vʩ,/('P7Sw-Is]bdqlxqNw#5 K4|ILHx| k@sCɋa3y Q:qk~*YM &y|ɷXnPysUI;2\\+ֳXn0kFlt5ir_՟4/|s 44d;Iu =jԊ*)Utň5j0:c 5 5ea\2*[K2nE E}\}G? WYnu~9I3#ekyX2;r}c}䑿>n[7~gDNïگv@KJkԧ>Oۦx\r u!FZPX͖1e3l `  8j2ES:?NNL4Bm2BniRGP1~VSYWuc8~A!2X߭8Íjj%r mF=2G.s,No,nЇXmrm{e6 6O[giofy떽Gl>ϯ K>珐r~{}wgZ;F^?Kssg^ۤx6$֎m@'nk5M(MC'H+aXAXͅ] SA)F"Vٸˮ{; zn],Au;1\xӄ6+d}0rW;K4?zu˗O Wjr33Ss>g,#ט_|yΜ³[7 TL&H`&YNauBYQ&㌱8PBҌǚL@ՌpS4ub ZEv@%ȕ6}R.}@H9x K:WT03ԔyM ^,Q%\OP](MYzE0a0 +z-|댇i/2]$,cŰћ(#nF}0pB13}"DHJ|YbjzdJ{4wyCK/>O1 IDAT^yUn_ۢ'gĬJ;w΅-@4$:4B`A~.0LI]T+Ub]Hws3d_ԽW9 Mvqdݐq汒/O[KWWQNzbk 44 r .HL" YtIF hih:32anQUd%jH(--+O#:1mVPAP[ ir8OrcjDLIe=G9v$]}<:̿ gs^MlΤK5 4kS'I8By`?RIy6=ڝϮyסR՗q \-@N@!f$4AD38TLg̰ A,SG2sa?>NEuP!w0/g>I*ߠ?HݡљSPC5t):wyKͶ8p0l߸ƍKU =s3YAu.}ϓ:% ~( h戯%r C" ̴Km\ @(4s ڝYN JC |e\Jʔ#r˧ŝG2Mj(jcFn 0+7aѠk jT#dh2TH\a>;Jkٽ@Hϡ^%f RQyNGTstR(SAWc/bwr;.C^N"Ya;S*E(IgF'+HK%+c԰-̈́&HR g,FIm[6γ[155]|@яIߠX"رcs+<rYSN5ԗqqK0Ai=58TD " L!*ZHIX9}K9XeRAZJд>0GiQPȎDmZƠ1!4#*#آ pBk$cC{۸wsvY0i汫̳_}E^d%";A,9 eq=  ,Fyml+ǘ?XO9Z&ƯoگQk+c gϞgzfk339| B+lmmIFT!֚3w}u1.#8q{眻w @HDYmx1.yTbg<5֤*e{&U=gˣc[%ʶDq  `h4_.gƚ5QToի׷}{νq&i?eukcgg˴uF% fb(4pVU8vY#}Rt% a2)r#p':H3wh 0sj㫊f gH& dl@@B@^f$Ѵ tN PqA9Ah)z=·.õkGq3|̓}t^ɬKRű0$ ED4@bH1Z H%F@N-_}~ݛӈ9Z!SqB2,4ҀbVI6-vIqHHtAXsyN!DyF/!m$~vHӜo~֫& 5 q12",co^e<.sSNV,FYt!,PS7|AU׹xOoiR. ~~-&'=(i4lmmш**`ee` w0 Ȳbcc_g_U·=ACN=?g͉c{k {E%/}n2Zsϡhyyo_=.$~0pX[ڐg*"CKC)6p@dc,R(rhɈ( F] Kih ==`'(+02mҋ˄C9}dOINpϱyp8M:JnobQ}!HUD{jL" 53xix}X 9k62{<S:0:yCOHʐ%TĄ̃Tf?Η OK蜚T lT*9%횤ja q]㽺Z1sotrMXB. icLڇ<&==c3\;@8ȹgեiHk\Y**QNn G,b=K࢜LDhUE .i$Ja3!%儴$'"i1"%<” vh*T"m2 />G899}$IR>'_uɟ ʥ!făa\{5 XxY_[,}D8RgVH\UiheН 7R&eZJ՘Xqc1SB)2Nim,IЅ! i: c& crOm(HLA !v8E 5Hy.%bv7*T#q'vǨ>Kda;PsSazevt-p2 l;@bH+@c!eH-qIu8:mkrT*i rՇ!2B /VTp<dAH*uɢ#QjBku,Ç9Gx{޸s_¬.m􀺅 c/4@fW#1P B֒jKI{6I_ z+%Ȫ -Vcî1J3@K;"RR`B`%Q88‘<:K7ߢ3%}ҁhlN9WhysRGX{h+(]nhϢ1ig so/w%:朻{)Xz].^b5p (nqi$p$ ϡBOeJ8i0$e)arG9, !R D' gP*MrxGϠ0x/Kt_z2sE\L%ł,e,{%&,, >X)5{+;]榩R)r.N3M$Fѣ8Tgqu 矣זH ia(`hcE,;獢z ra$pBAXPqnἱ{eh/v)4Glnۄ,Skc:);G9 h_Iq5Ae}ϩuEYS+P8D!(~Ф4֋ F,-$BI_lY5(i@Jއ,JX N!s0%*>'XDTJL48x3NsXB,Yzw:+v1aI?f#XO)({-06Bp>q }rpAk\Nrb/(U@ ehphQH*<frq{ylIc/549!+eTCh=eKx¡ԊplK~M}`GA r(=HvA :툸"n:KH')a Ds ػRѶn0Xc#*#Nǭ p# / UDG*q~^u U!{&C]2;D6Rf-vPeɢd +3). U4K*s ^4"RYrA;@[ h4<<ͳ5V m d]@:r t+ij ?Z5zv㓕Y*+Y]ʶߐ6^0f01!! ,xk74L䯸<՞Nuȳ˜vb ўP87^Di7a9oE577,-]%2>|'9<@IIV.$0 7ڌ0wUϕ;Ə?RlK?VQ:Yűo 2!9'h=.9])1S-yP`w-:z%k)Wͤ5/.s()qyE >%(w =b܄|zEW0{8ŊWѤi P.'0 W~!oH:OԾce;Z VxaCE!`5*+NtpZ\edh9rQ{c³gr7߾`0 oD4^+<{H) >1žEPŹRv)̫Aq/\ߢ ##U\؉c9ʭ*WM~W3{c-<[Da w4r`R.؏a)9 1TfGv}kK[ njiv:Y"< as"Tn:G2J ԴUt O0x%N9FyȊa)D)P8/+sHag1^80T( >Q('(ECiGjUMMpx'3'\c\v-n-eXj7 ;Yx Cttan4;?s*bD[ .}eؽѦN{FGA(G1k72&Tg66Ə3wŷ7qtMnK޸v:R^lR_??y9|}ji-徜tZpnT'!㰷×Uo1o<9AbXeXxW`2 z06@ax{:0tzpWO">'~{~=\{ &*P@\}Mĭ:џR 6w~ I,^ /~\G/9OG_/+lz ":2Mmy]@8i lހp{ v_`FO d޺hLCw @ƾΟ Aw:lJ|g!~A``AeP4"ɂ$$EF0ep0"pR;tYFjQdSr)YѣS9Ps`l#]?#<"\eƗW%cͱ4gH T4B?oːh h:_([ ],RU[U":+Ce>tpֱ#\+l]E+<<Χ>i?ȃ7跸9)s4RiPCQ#ime ks3l,~݇mqH3~tq g^ ̈e0TWIxG*t0xMER#DL}dv臘jkF$W5[s䝂yBv/(EV!YքZV WErEɀ~{$J$DBl9NTi4nSH2'9Xh?xN?ȇ>I=|?m_L+P}i]?O#T Y#%-r]VJDWw+$ 9 cLGα7cCh% N"@HCPЃOѬH7ga{23um D\FUR.w&F5 Ќĵ}=qra*?3.MB8"gGx|/>^vxTD($ 6HȌ?yd17럣Cu.%4;oiS4.H)#}-c^"× 6hh,ڣ"c1ZC,=J}~c[*|c{c^B Hus RZ2*!+LΟ#}t:,%6laq Y`2O}+?L?ayXET AJ'PjqU$ZK6uHFBz=?U1ZCygy0ZߥL:q'^Aoeʕ2?7V_[]ello\]>Is}ltlXsPހڄ!v='6Kkӳ 序d\ۄ {݀ڑej댺02kp{֎o`NUغ[03 Wa&leކ͛tat7|t%`UU *& Gsd\*Us78(B  (}q99LWc* M CD:C@ j2IdBl)@[be D#Ǡ2&q+|.>{=/ܤrn dQ'`#~00,0W\r(h%#CQ1Þdx~w .L>E&g"R>~+ў]\-kߺBf®rRѮy>0Zkt՘x*<)*FYeG1wn!:M4:E0?BkF/MQaXCG..Ou#QNq훸{$8v ՍWhRYI"B6` eȉBM, 8G(KTCI!%Ւ$B)4pAJR#4:tD E)^y !! csdf/X80Hn܃_$[~ ,N1xMx~xx l߆tAv!o0J Be*:UF8Y ԡ{.-^A'mw(o)BDՁ0F|9.Mpyq3!ijj;f` .a90}l< 7'!"${č yfD|Yx^ËۢDs-!! EȊDOՉH'hJX۝"dT :t\FaRM9p DiL4~yÌv=fg9hOpuJô7/m[C98lVTHW9b'>Hq.!MN$?Fs2>Dۥ٦uWxU6vF4g}{Wb#G->J7maǞv neJkӨa˘l+;˂tu Qҏo=OsR{8u&$LX\[$bc)\X[q;_Ub Ѳ _W82kwLLg;84:)C"a-Nˆ7K @j *J@"fv+sѡ8L%нum*o]"K 8MaKDNPêaJuly\* aQ3*n \J@;216_[ptx%~Gztdi:wPoZ  Õ?hr{`h Kc?WZ(?yְs y? 8 y1 ֯g@ k¹ah6}$CU+Waqhw`ІCws\ 4'`bmga0=Q4 My 𩟇+/xCs o|Eྒྷ3p2L/֦`=H2ǛM-gT *%OkTGKg _Z"ݠ#n9X{h /t`,0R0*rcXAo93 Ǹ9^'|634f(bm}_Yf d&$&e 4iYʄǏ2ďSa{{<.[kmN{sms ^yi^mQ8|'s_e:O1W9癟!jOc>Cur@#L@p8һ/sO7hΕWyvr#ۇnQG$^JjzmB(z@l T9GKsLMwEl@w[/Y c4U4$vZM8Rp)c9FRz3D!sGKB-#)g³}wHP~P[C\8رX vmHyr qi XJa-D(# \ᔡZ{)Va^`ZK0L<מ@ m.lܐn':k= O`˗/H۰ p0scGޓo~Ojzr0y74 O5>۳GpcI )R{SVW=~֯yr/!<@ IQ_ӆdF7h/w<}擰~/~ڼ0A?y06 {`g'T+P9f#+ 6*tW ^+>#瀤I>pU"=/NA}# ($NCy%PV,hŗwe!F8B#` :i.!фVTGhjL38Nz~-Kn6E H`=YKfYN;HStyy& ,9/5Rj?|ps0IvH^3:?G2zv =2JAUleE29^..Ua34ء4[ ͳ9SG/lxsuq`N>8wP縚~몋:7u:y;L2ӓG /ߴ[{{od댺 rt&)C$2P[UVqG\ coZZgSD Z_*r%Sj%,9ah(iK-3aN=ٺƐ7{,>sܷګz_gY0؈4Pit8$O,O~-òdPM @ 33=M]K^U]9~MiAԜȪyޛ]4LѐiBBB _%K 2Q@PJb4n= Crd@GǨތɚL-AiM,ޘIxmۡesbjJA"(@|a ;9~Ž6WOl^n/:ciVb*% ݘ^0מZJ][msOWą6,d;=v PP> pcÜN!ˋ[`P?;`e>,|&wR|>ȯ /C2 x5O.rMFk6~Qm&GO އ_$&O79k`)?0γpx?Q&`?jX~.} G=څ\U|2{w4:ԪfNE*0:(Or {W| ށ拐@ I A 7cOՙB@ ~ IsMOllZS̗N IDATq)>"?PA>2 uD, FF>.M<4c%0Kx98(< --O1*Νf~.^gO2Z$*+6 #LF)[F7Y9 b21O'=tHu3Ù4?wj9#^k&'IrT ȳmlԆG.NDN>} ?J9>:ILR>:;w/C8ݽxx6mWCz$nE sc( 3C9r("S}F+,/ĵc<~ %C{KP0E|$ 8אZ"b͔c&PNp $s_ܧ-'0n٫{[BD:0xD*֑LdsOqcHqQѡ{nH0b')ϷQiF6T$ ;%U8!UR>,j'ya 3K\d'H>x)oQ^8ed2WRjhk(|nDŽxY3l(RYrH/L.VvRsE*ǏjĎ2J5A90f:A^OmB\!q@f'F>i˧Sj kyj m W .Whwy&ULqʡ\vpCFJb2T."=tRԩ{ gJ,,NO=Gz\v4[o7#1mCECHG5{)K;m#T ._#ϒ'(^EH\O!))QT T>LBgH|WWh`[覢 k4~[aV6cU%5!N54{F,MbG GVTBQ@Tj Sss-cn|c(Ň#)dXg[$:_Dc[!b6`τѶC7*F8u_3| 4'QW_ws}8ra.>Esҿ!9=ڋPP!.`\k:|9?Km)F gp!y?Gp&!sAZqSÎM6~?YlxOdjLhH%AhMIC h#`!A8JK0Ƙm"eT6scoAU>[`QK;;ɒu 7=#\[V41R@R18Aq5xUg)63?vkәQ/qi1?]%;}YKy@ަsئ&W(M_jbtt !g+-33Q5&jMs%CU7$0[uQ`SWp 'zO0ܿ W|eF{Oh!wNf/8XYW@d+1{$6{Ez 4q>IDzj8QJW1o2 T7ByL8ƭTߑR;ɴF` caDHa1!$N2Bz 8Cj-$&ı1$I7dqad}FbuLTDd-b DL |2,w"v;kL[|gFΌ{kBL4s9"FP@NbG]f9 q?&=آFhANTQ:5'@TcN*ICzehY@r:mvVK^cuрZJql K7Ӝba (EBi}&fPR!E U(Q]l.1] N1&w{> 8d?`􈻫[rwKtv,4 w )NM|bbD 8NLIpbƑ'HcLwIFDkZn,p$VKd')_*xuWٹ}(&w69loLZ>YL(nYD +h-qLBя1c*0zز{$c;GiXCR&0 " ,`XKigH?Dt;&.cqT,_h5%)"SظGpȥ(%3a\Fܔ&\NY\'V{}]#GR ÖͰF8oȄef& #|TJݘ|HvJr +ާ\~vjO՟=^T\ݝ-^;jf^<ï&d_'NN*LNWn9ȷn0<+w+Uf~v=$p 9Ky\+# )h.nʹ%7`P_LJI8\]kCh2|B;%C?_] ?ӌl֖&Tg .L\ȁT:mS~{;LIK҅_?9:^̏{/wx^89]+~\aGOu0\c;Xjh-qSjDXGJ!^ #V{d#砄/Rd%Dzc(}iʵjP):rJ\QCyDQ']C,]^wom\.A; Jfd&Ĝ?I<ODuңwOyMF~9'.R} ы)F.~{>EkўK2u%'^WB<Q?z87#M=qRdllSU*rD\v$rʅ>v]}7~-dkuڧ?"c)(R9C:D>;^US|fn+/Mqs]#UFvLC@ߑGhdLHp>7FLņޭwq;hmQN#ػf!iQH!KyW{dEEڐ$57d1\12ܵ*$cljp&iTDcޭ62Z6F5-?ޭƛ=\#q!^G唡bp,b. 0Cy.$M \ŠCЊ/F Oxt#o GӰBdBހ!6 G< bNrߠWrւ"K'pCp,)K`+BݧytZj+1=Q G4c1 v&!mH AHU 7ت`lY&8n3Ɵ Ѕ[ޣfBSENLςV#k1e)nݣ6aE- 2CqHhp<We8v)n )|GKJϽp/h~e?GYsVԻS?@a.!\́Ap йj ;0| 05 w*!sS]390P= W{(AWcSHEHy`k\ل |"O5\r6,?$?&rKz5sà TOmc}_‹y^8T.t'ga sul^ 1 k9.[OAF /fу4,rΟO@DS` FNY#` Nhqܦ*f%R[v)PU/ǖ0oDhD'7xOp`$5Yl0ݜ _dZѻ>͇/`HӰMʞf3ͯ(*QH|ڧ j3X7^fgy.ѿ߹|ٟ/* x9ҥt[UC\ D=]!7ڧ9[ē-qdV㌱TJʙq$VY?(U= lFv&V}}ڿ v<\#JMdhD)DN+ < }CQFH|O2Pݘ8>`o6 ùiJ$)v) Gw0QD!8%$fny ;']s/:;*jJqC3¤X2,HeP),*dbm@E8@10p Lɒ(5KW( W TGc30+ RJ©]XǩJdpĂs2@[J@ =g+Lzn̽77xqC Kd5$ {wйSD Ŧ7ɳ3!4#2\WF)Nɬ Z@+ָ{)[LCRR`.sxfNZ-O1\q2n0EBjGdChNCf[32HQJx7?fWϝ `8x*8ʍ 7)5,bd3 D O4I b (I ?LNF)vu\f4ʆ'$L,%)ـ0LR9qK}Cԉ%4l0D{Yg)g8zǩvP`cG0i0[&R!!>Q4 - aG&•\AIR!1Ja]( m7$Uk5_r}yr-? >*1ǚ10LGCvyPu'^YeI՝k?D"HQ2/-r|K rnpwpY{>~E*klírX']xVcwDGm3E*N<_"hG4U?'ZQV8gx&y`1?B?F~}2 b}f@{PRީv :߃?ʵxy/ jC=@WAf*dü+N!QpL±gap6 Gh7N8xf7( Snu(GOƒwss3/AҰ~%H3+;0C^_8;x1X/U~=Pu_3߀rr+4yX.:cHk;em\I $1Sբk,>՛<*y \OY R4AH #Q 7"(2Ħ XF6fDJQ<I:(s2ͅ|ϑ<NT>`ݏ(g5 चMkQq?ʧiMnKܗo^>ޣd]H >{6AaQ~旿D+iVKxw[ߺk 61"D6BڒMRh@_BdGHz%d#[6T1!Qih &3SgX}cS tZ_S]6XȰaHT3_yꅓ)q;λ(޹CѨKR /ǎEY)IWN&!ril(d** nj-jhIlpdip ҀԱd} %QfCKqT@ P["4M;=:XJL[HcRt[p"e[. LؔX E|PJȤb!1XJOU 'w1w"A"堀_@:۔ G63dh)qqHĔF l#SV5Nh*£hML5'(>j k RaǂIJxلIBLJo~,cml6Ip`"!,{H/@ *pqIPQ"4nO"PvңGiǓ?7 B~~Dl x 0x][0kP W UC ^~syzX /x cp}jܩ2GRk03 n^&sWix=?/t0l&43F~ .@Wu|p?wKϼ<d3[VeMvн0yZwkY,')c(Χ.s>?N>iB0 2T_ˍ.d[yW_xya' } Ŝm@J^fC䲈NEk dUq-R 1*K%nEwsSb0G4Jd*7X?+ gth1ݥ]%Bѷ@Xf` $b' ę:Q\quuKۧ B0C/uR]W: csT) jnpsxlBC]nocHEkif/݂YA#*_[U^]g1݄$]БMB5w< _2`QhGđ21JH%(錖[^ൊ O J \!i[eHeF4RS4Ա’KTf@iZP>5G} h@ߢpİݥa4m3).p^|ǯP{(`Nh IDATF?j < c2G@Kwa8 FHnlPsძк"n?p88<~?svgd8nZy P`8ƁepUDLC-K9Rxhd*#RO CDtcPPP>d)߹cSy8HJ/XD6u}߼?bpb"UF834hW (R7ňOQ%rCT[A%u 6H% 62"he1ڢc ȔhAi ⸂3:d:Sșr@.~kP7iGQENߢ:hL!%G;ƠLD]lg! R(:(Gah0nѡb<*#qDV$%7۴6A#v4}Y 4iZcm2tĬ]V 4md},cO9b| NJ&k΁A{`A(VK$GX:,b}he0~B-Mk6XF%cSjc3L3*\gT2M+еɘẖ(c .]ķ-H)sU/s~~hQJq o̥K/Ya pceow_zWW_~mv_o$ W}_};?_^g Bt]~~u޿vM_5~ic2qg!%evUh~=߇ӹQkИg0{<F9X<  ?or ʭf3_sIVoó[p|xP*t{p|/߂,u*<ó |?v$pA L4sJk0ق].?<|=ם"9;ptv4UPл<}'܋O]b8%65SI Rh~:oW6$f9uVbAV #dH@&)I䠣M3KB))I16#M5RQẻ#4gi^}֍Lw"gC12xtDqYnk<0M3>W߽Ͽr,q[__g}in$V86C IL!ędS_/S 2?LQHjDӧ?"rq^ĉu C&MIlԳr3_exN 36&aRɄ$P Mu~yϜenX'ُm0UTtH:nT=z yTSv;F=<0dF[ ȩ (Y‚;wE!zaf54XY y}{mˏp8w6 6.c:.'MբD>o⹛Ӽcu0bѠh`'|溜:fEf4ɘҪ侏3wʠ0hqKcg6ٜ9-skm2Jшw30IAS\6"K˻a14yNvC9(̙3:_U~W~g?w'?I/|Ǐ|[ t`.M>я;;+ȏ|~ǽ5Ξ}O|㬭C B~<^>RX/k4z__>{)ߋ t`ۃˍ+ /鲥[%ȸ{o^bU&i9xN=k%@\Y+Ksp.~& 3% X#?[#?LB`ҹRp*-_*ן? J@la:x݂_wO߅_,CPQ~"M؍=2zD  :*h(M|SC:edRݭ8yCcY}=`<U<0%EdYc޹•*w._GTGק%2Q+FE},d@(ȑG=" $cN9uhM`.}=,et 6 lU g8;!cr#&'e>p {,a!/q_0)sj,Dqabx3w_:oo>LGj}zB"O I&tDb0Tq8OɳN2}'$"l!c lQ]iB! Cf,G&+[C&78'b?8M_չM=%+mYicInz 16y>i7`={8mn#p3 ZNXpLL3.ӭJXxMLi;}M{o9*Mu W4?c<@(7RB#(RHN HL f: ѳq!-&U_4a~ӌg?H.Xoϳ"آ7(:95 $\ xn<=N.E_vcEU&$K#iro|:Owco2ě6& c+ !9!<ps9ODT)sB^'?ưQ!;lAo"->zFwՠnq%_Zؽ띂$9!!Xa&=.:ϡE%w9o2NLmQ+h6!tjVgϯs۠yYrz)W6n'& -K6d`\Bj+T~iR9O?4(H_'xz;N{yhM; >֚Q}Kk~:Jȵk׈Q_0c X5H)Rd08yh8V`))Z(3{ a*%QërSpW`|$o)/[oJŸwNu#2/RנV +eNK_y8vg\r8*%tlJܟR* /,,yxp<0ylC @2RFW&Tm*_1)"ySF yT<& J˭0_T)aO@YJ _wC iXbhP6˒!=@|,y$>AAaZ}3 CU2Fh9ܒ5 fQhHnQPm $%FAKȱLpG3[!J1uǐ/h q{ȬO>jx7:l^auv0Iȓi6TS'ϐz{ ZِXIɋR"IHV`%&$ giC 2גf9yB`eW+o{Xz{u?Xgyd*U[k= v*6䝦qՙk& 2=| iyIdH"gOR|Р_dJ(( 7$sTld0"wsiR hO>as%QtdWٸ:7hMW1jhD%`GAS!Z q&1R.\OT9=B^g0u=F2m.lnSz=bȃ3yz7:aO)r_';L!69I 0fbc1!Eu謰߸rse|cd5P(t=D͢EAP$PeD#`E#ycGĄz17P>Dc(up1I"*6eӽ:.n!E&4MEIA@)8 xdqS964C w;9|dgg/~9sW^}K.O~/_1afii >ϔϓeh]`. /ׯ]GŋQD_K5I<!(""q7x?e2-IUʄѭu-B 2W&_զJFcw 7a{J@6T' I&k0, ,;"ſY{@UHT }|\)tn.e8@:ៀW.g*> m'aan>R2r VvDׅR:rx_@Tto*'! 7K 3COA&va}`u U' I:V@tc_+i0^;hK0gf P,Ao7ӱ_D[ap]!RՀX#qbu0aD*(@ꌠ%fj?HS42*'|pӧhN^?oo4!bK!g,CQm"j\sSX鏱ru.KF+7Ɇ#\2LbㄐuS*uCNʮHr<y8("ף߬8;Ȟ:>W"C*2 M璽Bx5*IGO3D٣eF%:B)D%>^ Q*";Dq(lE'k (o.{F>D*E66H`! heN5b#X}B3)Yl<'ΓƈvNGZ] ԒG* 94`qtgX_Rm^gR*m]: 0IG px5Pu+}2ʾ# L#p*ԁ"ZP/B`O>(BJ|ٳORJov9o/ann0 x>Ư,?NQh}?k3{?}$7>ӽWrS\EJ ڰgz x`|?/ [7~IL*EGFGՑXg9#D.pH4-LL--S\9.beE61bq Fc3 ʕp[IcS̿ݗ.ryν2F6*7$Ǧ$crGT R E$I$iv"|MX: 2BPAZMSLMTN%|gH~xȭ¿Zk7- r[P؂hλ]#0Y.}T%lc! tAں\rGtStMQL"S8RL#@GA2"V|&9nF!f:qk>8[LٌC9'A!QڐN%8zZ\hpSIv|O,xg?[2EAď8?? @8hS&Zh4~H4MyYcyZ4( ccR `'}K&= )x?-dyABʒR2==k10 yМǡs@7q D νp/m̗ݍiX<KR.QR,/Jvn2Hp2^WFv6JыMx*Ofm ԛ%a|Vo҃`: $Ь _c->=sMz. S>;/gKӽKy֝2^~}X}geUzX 肇k̀.K$ÇR> A/,.==~ 8m;6:X 4Xk+BM^)< G& qep!bM%pmM&ouYˈm`X̫ *Cx?ǙvT[نV#B֔W \PL1)H)pa&rX5Z( I`V9m׫8۳;oh\ffE\ i [Xaٔ?Pʔ2e[/Wrnpm:MzՂ$#P` bJ Pd9b @DFcMv4^K(܂a%*Q#cҖ(q鏆lݹ9qh>bEfk̟?M-uILKGsoڿڥl޼J.| K-QR9-$G!pg TiB6=,$& !UTԅ) 0֖ɡc]!Rp}JOrVX2P{I04M]bY- `.}/ O `eN&lJ0^HN$k$I\^t?X\:F'Lݘ`N_oQ~)7;G7PF;dHx)H#,p_}K_{3TTbg;{D2Oa7fͻo]A|dNaACf z*q-dE)rBNV'I&q~]K3>j9#CjE5?፝U($.(BWxĎU[FB+ȴGX'HI_(x`GG~Ym\f~Ia+`Zr5\}#\_ Z#4'(Fip0da0*ǺINznR,I1[`]$پ3 rNtJu4Kt饬ǥH pĽt=n-Lի[;fd&l,8[b{,s7|g5n5ma!`M_Hkjj韢c|En)pr4 CC'@xB.VAd'ØaRϹ*%.9fwmО;h94M5a!Cwm.J\*FZrc0ya}mw6yƗ^B|Cok-FDP=tЪ 4B"p*c S|fR= -7B;Qo@~h}̣q3@ڃbPŕrG%@.cbC`zM΋]8=Xx߃K@_O‹~ `قkpf?ބ\|x?};\[LcU܁ni^蓐Ky)n\!8 -p ]t)} \J3UK/G]ʝZ)9k-='fTzC:0E)^5V n)Vɤ8G/*Ap|O1"cU RXFHZ!mFM P)r/)g*9QR *q<ŽN9!٫m]3L2V M60R[X0i9'YzٹΛ/n~#M6'J0ɬ<<7C1H-*,˝o=YIG{BE[c{̞`\.lht"KH=XJ# ( ۄ(/H(pRH4FZF8E!@i*A4"4xgTi XD3/E ۢL+CX'(;1*x]ׇldΆaSz֠-{0t ?(FYP!#Eٌ Z\)dt%ROlk5gDA2`<=5.sSmƻ{R=fx!M3s\u_54L[A22!g[ FƐ6F0UFR$m\zJs3v6{ׯSѬbGzMfVI s3zȸqHO\c&kr4WTI4}ܗ+6O3"QV30f4P%9R Gܿe*3d,1V`hѬVɫ7pp3Km iߡqyop~G]FV0rݛ%G8+ffmc6f2=z,I ƌ`LJChېj$쩌='Ȟ^ fŷ+t!9`ܓ0bO^cx9{~kBO\JfsDR7JQDLU ҥ zqO t8تmx.,XӕtU.o[}kS䣓8Ύyk,qvrl13;x7@a8X.&7Tzӌ6]*k7~NJ2"𩰨 َ _[]ˡ>'} HÀb ,F9Nt"rS!S팰0P)Iߓd?Cqmoq]8~ןo ۥB]-8̙3g R,$ir݃їKyPo26|Wi_9aqX8 6FZl՞>}-9? ~||/ G0v?xPƎł'\c[- ܼ mP2kUG8//f+ E$t@f-06= ^hK(々(A yfˢOq9]n[~  TjJuA$~Ljңl C{4',Ɍ<[FՔ.'$KD9c#E.ES@Nj-"d%i%"<$s8Y&;܂Aj#*v.*+ ےbb{CvxВ*A''qPn;g}ױjѐK$uK|q xc3M{>/ySm/szkfSbO),VX‚{d4Z3(4hJ'9O#Qm""N`zsBqc'x2"obkڻ W bXdGMIj)5o PǓ SM$VJB0n$󺠯Gܰ1f̃i cIUeeExqDC/;KXHƦXBBHܔ]HJ'M BG]*ȪBP3ۤ$eX !eSyhb %*A[SH baNČ(}R@dtc 'N_O)fz.gc5Z(pouٿzOӄ2icGarVN)98rhtIMɷ2 ˯CRVu? y',,/õjÉ寔Z7{$Yv9ץ-ﻺڛc`kBD-A I!>J!nH"w LϴU]eV=:K"@܈ʊ̼|NFp4p ?@&{>Pư3>Q3s٧~8zUg፯yV}(׼`>LT `UX$^ _at N{$BZ{p@݅uM;;UNס4ާRY!e퀚13kP{im6'@LU3p AAߍR)CZNTH@hGsD-p "_kWdZI1a)7ilq|1NRʧr~͕ *e|M.H!,}83-Ҙ֠Djh00! )qGqXf -{:&X<Қ9}h{N;ƗW`t&ue$°#г뭀.Pen-.QZ(4#qE@[X6GPH(BO֩^HFeL]ָ;#^aXɅO^,ث-M'Q~ԦirKHVdNLȜON"W>_ce]ebSJ&X꫖<|Z`G2v ḽbHҀRjhHF2QMX0`!cHEǒ4%%8 Շr;FM5~g>խܺWS:NC8nH&`j+݊~%a@P. i!ՖbF9K/"`vحG!׈yԿW(9nﳵrX{!"cnFa 7h<&2:iXžc:Ai-tMAP Őb 7Z]nDR{q_8ljfч_A-s[ VlXQuNm0Lc?u>;d[$L5)g IDAT /Y _mߌxҭTZc8`DK4^%[xNsЂ<-Cwu-@ͩ ڔ#H-%* PF֦ R ; SgX:d@/\hH! G;$Io |t_jkQBrቧ{Ob{\F'wsM:q~g 0Y\%[;0ᱳW6S`o c*L9p Sƃ4DSR.[8K/ ^ֆL=m/ޕ_oAېB qoz0Slxvpqٛ͌/)DƠX9<D S١DLH5'A%3 9A) "gY(dP0frf{kL^~3oǭ/St s8sגVύLP&8, /Q?Q页!J#%jq2t J]@b&ӈ UDN]@CI0t%$Ab[7p A uUrEZFҩsq5KgFJ JV 55DQ( +I]rDlmHaq0 Fnc AX(0M_*C*Yx/Q~&OM7yЈC9yc$8HQ.u}L̐Ď T>p hmh.3UIDNfXgpn#g,AH$sg0Fd}Kb BkI:k;̎|O.ܤkGMFw `N;0d) 2m z1lZSm`&c ,gl4X (~ lXЊ}RjCOj0&}yԱi쥧Νa:O=ưEkưWe}\)Rk=kDMqQp>C{j]BBTڎ@C59-árlUPP.\ _8-D%$ ߟ=Yˢ VAiB !n9@Ϡ8*;;4:J TPdBB(A3iAFhDƨT}13c$-MA`ץ4m<[0$`81SĒiM\$(RaJcLc!Yd9A 9ߟ(2 2G;A9ȉT; Fqi=J/+Eh,uW8CIFe''n%HK&`~RX{`wI5Z:Y *\#~U k4Hs"4 y]7{<.ٙӬkI:yD{eRpΧae>Aw1d8p8B`(l`}'ÐYG 8 kP(RLѠ2)5z#uđ<=3Nu,mAI{2ȔPaA;Qi,.2!Vپ.^,$.w : Z GEz"s-zr4wpop&^A D ɥ#-4y) K92' ^B0e v}LUE9$Gƈ4ڜ`Y,s&,7q4}Nm.Ct*29t f <}KUdB{k",kLpG :& %VX`e`M'QQ))o _=pUG څExyx-X<|T.~ åPOބyNLwo LTR>8oÏ~߃V`Ko ?=htU۰ Ǘ<~ŧrmS|G}Voyg]^=smXx6|Xgu<.܅ѣ~a`>ytB{ڗ@2#A>Ξ2OcP쀫x&(k= @4<$d! vAz!Q&,fhJZ/$,A>f=EU 0D P0%:Fb1t|!vGu"nM9$<`ZHfbJt1hmSH$QDH)M$LQb-#f|>f(Ys,9A!31W'}w 2c)]oӿw|Ξ&hs*7Xt[(]Bn@hօc֛ % $h1e)Mӛv B&ˆ \Dە)ұ/}|YÖ{֠}2'f/dw>f)_й>$/!pH"$ 2,8X"ݰ/hInmINXK'EĈpLEY%FDZOQYR"balUJب. PF!K"!`+2$Ep %)AwXSظͨTpvA): G͐Jo@6`}6Ndelrdz*An ժQ54GZ*@;yj\iol62èO%lZRҒZ֒Ze%"`%2z@XȜ7m*: K^A@}d {M[{V` A,z'Wgpg` ;g~6]g_wp8zGj?_t6 |PJ:\/E84eT}ۏ C-+WÛYdƼ;/qpUǧC?6y˳:&&ʟ4CH7C* #c,LӰ&?홦1>.9g`P&c Wɴ>yN^焬RqYJE@2d)\<2[3@:RC4 \Hdͻy{}1IFup F*A#6Hlj0$+{L >4\HDC-kbM7wG4J;V8RrpCdStCuR,"FXmR´AQ #.YW`T2}'s'$IYpdF^f a+(!> ܇?=Plo;v#8)PTHH$V9. a,AF2ٞ ;:;gטkE0bLqet)_= zZuHl \ E*$jyf&R""덣i {e(ʑ`L7,ko2؇Lxf荌$]+8i zN޹q?fY\̃&(:!sh;l 8:턵<9~W::J ሶS* Nب82)epl`qF!n`iuRLP-'!*b+Nt?~7<{JGj  C=%0.??CȮr _xZ2G_R"{n>qwZ-4u We8g<޻eHkPA]6`9A a 'f{qga~jX<~>?_w{s'&`:$~k[_1h ݂h/E27a>E F%ha!K]|*P_G˞yh^gC*bw[(2ր;~Ik/_zX݁|%XPYK :Tb0U&B %U\cŀ,(BIZxk=O[<`.91XLAD]Tŗ5OiNYl?` {SXvI2`";2$SI,3g4Qe$CL X bY-Sa@C ^C8KuX1CBPr&GA[*HF!GhZ&b@ d)DHU"F& e p=mـDC$22 lс~N4.qyRR:HyBhLbkW8 8x(S QyZ9L`<~Ge˜}AiW(4G jgI;PSi!m-v.bT vS`HBtD @ C +E 6irݣ7:FJd*QRzw?Oo,; wטobL1 95Uw易L0JC¯(9eGgOX<03)v|ߑi,#HrǶo=`k{1^|Ovo&!1{IfgRsYڸOC* dn='#/ ='LSÔug5e!:2` + %mSȉe[! d_goqn1^A18@'BZȠ#yAf+1 6 N>b(p&*xb`k\Ϣ!q~wvxWG"ע; "Ma44) -A*5$&T ehG02K-ET HUG1v<2soW8фLy%pl;x<Ҳ⶘o/\Irݗ?Gmc2V3fL^]kg42V2$عEǾ~35;›"g_F:XyF*4J+ Sľ#͙ S\03ʼnj#m½ܐ 6R o 󱽹A\J8W"xr//|/WIRMrC!: c {h2,Ag>>);s>uKр??/[zUx괿H J/z/u29ԓh j瓱&gu#Mqԋ0V55 MxἏgEH?sxoqz=x|/ʠS!@4Ǿ/};{w@x^&HQ{ rҧH.q3`rP#mmK\!/*RSSX`p4Zk:F uМA^d!*q±gNLj2\lSyH6l1XzL#8cIќxǟ=;;[=]҃8qI8MVhTXIߑ)n "Zf y ;6Nrl#_)FS3daW&Hi-:hfATeDQ`e•pf!Èib_ɐBK*z([x6,P(A Kh XGa)Dt@[о,d|&{ZO_ gƛﲸˎ4]| ܨ% WuD\j(&?H#%t!,"43# R9bJ>(*m 嘑\Q-eSp0wha[d_Wyñ?´1a?WqXU³88Z \2IFNFӅ5W IDATmM#0,{Qķ_#km35rĠ*UaQ9t^6'*t$ k&z&vc}n(']|AeB- 8B, MžԌcph N,>8]$w E,P8r3GjZ,89cF&'K,)|bW)VL`DqtJ,h!{0# l /p@@N2ѐBHi DFg &5qhc8pǨ?86)߾M:7R`r$s$ O`O$Q헨t2qnFj1LKm8/t= j3K9Oy}2b#o7~f>?oB}2"MNn *-Xzɛė߂vٗ'f)w q⡿𯞀`g&LO<6~/íUX_A˿0Vb̛ߧ|m4Gޗ]K\=5>Ԗ@ehE_&82?w|IsQR`y?#u|(yiAx>2@taA%E c[:B3T B|3bTRiFZGsL~/~L}n P3x!s_OhO]୭m^ӫ>82PiLN7/) !3AJ\aBK $\Jj8aSJT@:?l'yAY#(_ߵ#Liy$Oֵ9.7*Ȕ^)Z0--BX Pb.  );UB;'hsII,%:P *#c48g_e5ol3wc]rbhsVG9qt}Ӝ8sWi l2@`ňGD!rHkpƗm_ԡ")D[ tXN`-XHDX  %-Qwh{xrV"a)ICYD8ħY|clNI:pi+]J!pf1ЂئျĴ"":}zkf}bxsP3/X%ez 7iD04~0" NA6 c~m{{\ԋ N.2SS=*ϞpTF D:S!!D@dc4} Kɢlp8WyDJI{te78?^0 QAΑ@CbCf;G#DBZU,2}&l~a˱-%G>?1 Ga"^~d~>dP(c|[a˨0{7Q[hx6}qxxHG~:] A6@TOamǗwӛkޘ.rU}z!< |D-ŗ4ͼ yՋ &?̌oDFVed{SLc}8en$UsXir[*x}:dC%-J!p$E(AHҢM֥W%qjhwhT%/.[㦣Mv^Xg` nL, H"cKP/XV `Mfz2Z Cwp\댚="Gq05d6p)9aIMە؀1(֔ƢP(:^ɹ=?~ag᪼CUy#F;VVytz~bpşڔz[bxZg=34K_s!>KD?8}ܭ__s}~g!2P/|o}'MUA_ XDIA0m΁-+n,%H-iP0x't&#Ў,Sx.< ޑ _]2g`l=y3|8y$;^\?n};̣P(Q:0/Ct\z M?<f&C,?/C҄0Ml7ɨ^,vמ@ ]I62`A{CfQ4tm^rY4_Aeg7iW/C V@)BAXR#Z2Y,e MDGOcdD}C3KݜfI0\_cD5«T63Vx!CYzgzpѳ|ԡ]DiN\4& )4%0t\mzc_*")&ńHEƢPXӴs~@oiw al+!:_%Kد:Vpg(7_`wjK Xm0rʡ/81B;g<_)2AZ.-\F#kYΞ;F`;&o{ ?:Vz=7p"E[*MlXm"ylp%u=mf"wu)W}3EF·SL-Qmqxs2h<c jK&5ƒ 15%!n,*:Uɍf7]LV vزˢ( Rz(h%J<G1rNJ? pjp,;dFGtR(!:EE)l/[)ߦE8Mzf*]b)a,JC\-Sܹ{\o.YչطZbdH.)o+Vˬqb X+&'+?GT NJ~aoͣha|p'S >fV4M?SZ6s]wqW#u]1i|泟>Qnuq\iOkkZJO<(#Iwٳۻ}CW@˅R R^9*.d?su~y%P|og>CizJ)W2`WAu׳s?Ϗ؏oNVniܕRWYnwZkQJK8?z[ԧMozS?^m#&ALi1rSA_δ FȝŶʯάg)d8#hL6qq|*xbs,n#`e2ҫCx Ǡ_qSOTG2u?k}PAnJ6냠 k6 g!Ja  `Up_ @p2'nd2 An&%P&Jg3Ԇ&=c@R"=&`rlC[P>J`b gFH.m%w9HOB)&YΥZ y6QyR[t"hYDY nБK""+!I$!|B~:&}l_D": Mk8 ,Uv wxז8|HUX4OaM^A1}҄ĬSvN{2dn[G3{ΩfδA^Et# ބGi= 0jnZf(w#]%I=DסzE^;, ϰVX$؛l elMrWtKJ(L-Cu:$d%oma0*FZޞw NP9EnL`bFpԌ(Wݲ]ӻqMG`0BQ-Ba>+ש\5hh6I nJj ^R2;9T@wEv=rJcWr B@#c\ H7()w 葅!#j<.VaBρ.qj !,(t`yփvUQruH+0 %"L*zN_D C'09z Lkϸ`#tY$qBLPe9F{&n}7]G:y<"`/^$MBNY˅^Y}W^bYM=Mt}@Az hR/E'rq~>EV ς3 :J^:ZKT'csc̜<>y{#[c}駟f=4 nv>;?YW_ϩVT*w&8oO_u\c]?i;-›FZM7}g?m !v|hZ|_%G]|'_>Ho{  t8K|K_5!O=ڈ98r*{]{-_pva8?)u5RRO~=<_+\Cl6{g%J\&ZςngeqE,ԫG-,(&6E t W|3L(X?eqX0]Rc$  )RVbKf$+ٍsJ %۔+ |Z)T$nv1bm(:0Kx1=l{Z? zȗ8W\r J Rp+:DAID8hz yp5 y)4om ݋siE$f=6b#z?V=Hٔc::N%ӬZRhB;75W{z+~m6`P䱪Ě1+kjzEίH(6,p*d._XQt>c!dx!F:Ng?ChBH1I`RX:صo7K7蜂\aq$]-I9`XaH]#'}Xk|AxpDv@78X RHຂXd!V[ײ TdP)|2FH"2G'!Hd3[g{ " Ae1+9X#[ [rzK<=Ag9B@epu :tocݍ|t5TtbܮC (@yip|9djҸFYQhq;&auoJ IDAT0h+PK<?y18@%ihE/зs݈z s}S_%\ۀXLjpUR$&Rk\a^ʥ?I*x33|o}+#G] H媫W~y\.I8LMM1Gx###m4ZpE w{2Q}bL@oOEس#s=+9^L<с[Οg5ɷ_}lά<} $C7#0񦬶 <-X߀',4q8|7nu +h-{ؓ=6-p I8'YQ4.6R8aҕ71^" q%\h qR)w>bbCPC2< )a/"QNH1>ʥ6hMX2ȣ?Ҹ $"7!AT`)I װuF&'f(hH ]2=^rָ {*Sab-;/ Mv֙n- 8OImS̬Or1g-f!RJONÅ 8|-ln 4O<묭!ۦ18N&MS~$|#+8'OWS(9|0ggBб^yKŅyy$a$dsM !4ZR:vۭPV+axe^jwZ}9 WmYL`}p}A/.@QyN? _u;U蟂KG3u%&X>4™W%*Zj?XM6TʋuzmBEAДlT&Ղb-)*06gWv^79Yژd著! _ ,_9*98.O<ď^V`6ݳL[%4i{T/fیOdWvWYuYb(. (@ܐ3w5N3.:%*T/Tu[-QO rnk49b%~v=d'w[%'i(Q5Un10B^jҍ?#7}g;$;.tLZꐮ$!pJ $8CDaB,-%ǒjN  h [O~\č:1}Ӽk}~Xxg1꬟ X<&g׎%r[ty[LG}g8 1ŐBaر.Mz4 GPt*4tLWAM6hϷh戏sL^Uyín tWp,"hfvNX^Z%}b8^Ow|}=14vs̟b. ^x~o==SGz9(=%^I!ZxTC"@-O^w :9Cғ1A\"ǺlF;=w>HY;vNr5!l$84{6=soRk:iKC%|+R"s{:Zt+a\YJ.˥uc'!7\H":}:k9e7}/P^؀P}aL" 8ltBBJM7pI>4)MW o# 9nj1-(ԩ\(qKC8ɫ (UIZ }^u{lWqOqP(yb0 Zs1G;_,P\y$^*91r`#}_u}@<2^g9fych %&Vr*PLIcy &EFi1sL_-Xem!鴉ċ PA VhkHfPX_g9 {g\ ƅXrGd!]"I֕ŘNwK{ n@cjp#UcUEhBʘ\#I:ӫXW {PL#"aQl#\I0ƹt6cȹ.SJO䢿Ac5HI2reo10SĐ7.Щ"̫7 dOqx2ńDV hڥT+ Ô45O{ttn^SKI bP룣8P}/ņŨy  f8ݶ{&ײ1Ή%8f.r~ECL0q[r$I??;yYrOw=aMZ djp]wsJ)^#`yίگqUWb1JEY|x'x;֭[xBٚ6pogϞDQoq%@;+ Qx ^<}oM.<~WfY; `pkɱP̑>}?\kv&B ѬSP*C<*8y.@yVab hl@ .\ȊaX ,gSapv:\:8HBr#d7̓!5 -Yj5Ll-/v@cwCg9 /eb0ٚC˜S7gn`OBq.>%0J[M6eq{sf:%A+(IBQG:A*d([Yo{E)?X 8Y.5&^x2 %I$%) /XKI( eʼnXbBI\HB \PJvuw]`$e7Oĭs)$Xi:0kɉ[PcYಶ6ʄb9)V/ \Ҥ!š`4*zw&} qw&8|KK: JiO14Hߧ-Kl"Z遻,n_Cxb?^x"W]5ExgIN܁9g/Z:',KJ"qDfd87l3N9}" k UD%L+qa6 ,FHeJ B{ ˘J`GxB`=BkHM"2xޛH9w-#ʬ}zcI6I5wAI(e4a`׌@c%qk6ު%rܗq[DKlc<$^PU7"nD}{)pjeF3?G_zSOPAu_XA DGjGf 0+dK)EO0HmY% j7P+#s4鮏5V~~q0DC JJ'f(IP[t:7=$Q%BiB)_tTdPYm,\$[߰ZQ${FpQex&k$wל#if;N&.C+D!œPk' <@BCP8ø9%G'88©}D3axLWԖ7(2Fz{$C@n25.P8$"@#NB> t-p,vB|FTP ׆яK/YYSӯ Il I?OU7dZk~~=G;x']TQ9SSS <(_sėDc~J ~gNR?ȋ/}h$~7~G/"* ~ٟ(?/&ISyҸ{]"2*2˿1RJ~fttk04( ŏ~GrOď'?'Ht y7tHE#mDtؿoґmCȧ-`MA%'j0_Wi= 0l?vVmhZ3¾#0?k%]GBmq?}]ذӔ =p5#v-<o~ ~G?  ƎCc!,7ᵻVFuogs %x3p5 a1ܚRy7e,CabY"g`"tp0ӫXِX>9 ^~oCr&oXck @4MZ IDAT膕b֤6Dfh7($L@q Px!uBR4p7Yqr" b'Ǔ'2y =C7ڸc,^T$mD3v whg"$h=y$^PB54L9G/qO=LNB{C[.s%;q?A.`qj/~S|ZCeN`0 2J jrTT,Ll&U3@w9>Pz׿Nr*z9/ 5.ޥt &1a_%61C6Cu`/#ǟ8?S/ |{ ;$ɄzFN6zS==޺5.\}W҉JAyR{}2eʞ8 W[n.!- (I\'+:^@ qڡ_Yob+ PvmaP mmፎp( SR#tNj|"zc[׷y{օEA0b2xEF)͉Q$ sD#Q!FEnj4_!w`"kׯs%~癙n~= @xZ]F}q uRg>  6{62c C3֣S'ց% oe?uٱ OixlTpW/o} &G)Lё;`J{o#u`"՜"kL_~= GްO|#P `Ef߂}9j A!apcptz  S@%7vgĂUKPב,dd:M؈A+|Z>`Vl 냚мgEdͯ9@x9Kbx`|C5c5"Wtt@+;T MTn)ຂB:, t g#DC SP[~=ʤ^@R{%z# M~1B/}w!Y]%$±@J*.E`O=ʧ>"O?Q&J0!}| sn@#]7%{ҥ$\1oMttN\`Sf!`8#I۬]JpfP1Z[ɯhyUփ!f' ho % ZFlO??"gYlu s*ߡ&4ar|R: 4VPruM0D/pWT扲9*f{~{Fi?kaLRZ[8 =eHә] b/Ce%  ;i2FI|&jgO~9t̽uWnqw,4'\54a!PjCߥ^⨞ix>0s˔#+H 8\Ϡ|c/Yab ,C}fa ie ("424W+Yy JOqی&2KWlap>7ֶ}҃+;ƟX`bցס4t-jբTv#vUwet߂ _.1o:灄%>< " )'0(Eg_M n/FRR;:" 3':!)ώ~(ekTwp|CFb8[hzǀTtp6;7\Ԭկr˞/7p:8ԩ1Z񑔵KdiLy}+8^j^.% 'x*ӭ=|xSLY5w]nT8"!](KAJY K qRNC?I[ {&"b5o^,a]󂲙BHI^Lp9t#6cjDsVrJY@Wa[ NN\$ː{d l=*IAU|1`VɕK.^ E4tQi:b7oP|b{ /O0g*.f=qi#> RQQKT0-~ w&a>Oh6*J#;عs<){a1Aܕ!*p)(X $T[!H="9򯽍NL*y}sl1x _=r-έe0-2rbghY!P#VGzb9N'(ǩ>%}pb4Y5pAߤH +fʩ #{88l쌒Oq# M%!1 RCJDkHЪ82G P}ntn\q5J :fSB%u3IlRR@m-ܱ;HgnxNX$ R#ѹ8\C"<],GCNj'.SH-I i+mtQAC:|Σz { L{^qDWpvʡl\cHM$U]Hg# )QhÄGϐ0V4Gaib.}mDHwIDa<(A ]g(/& <ʨfUdn@> wZa# {ls65G׾ÓO?֘[] e~vgX~'JYjXQ,ߔ '`zlؕ_<^ZKpy0nm UHsx18Ga1x2>,-%0< v>q^j> /}y 95zEsrk_ =7// wavҹGmVfqJLּ^3{:{-Qo@޲.WLAuR06h5Bd$p}#sI vRQ!]T5VʕUd6ϳ~ tpOo=aa;-;7i 8O?}a#C%wjRwߣz0y™}]! fyb&_CJoLֹOPw@ 6PG!$0EeTe={rmrc?*S]!*  UMѨ)d>]"KZFӈ9ÎP9` M\6e@黒Z=Usʛԇ:>ȡ"DI5y_N$Qs H}ǐswdlܣ٤G\Y8FԶ+W!KFn Wi`!̮:]ap!P6ȱ\SH:q|%HԖW5[1.u|" ܾft+ş[cש0zi_zwɺT Rx@ 0(S9.ҮJ|d}nSGKb8=^Ļut2ōpm ]u*T0 :_i4+}Z6%4wzdFA`UI_0rfPe)z6 ܞ`H !)RIڠ]F 8( 7%SDf܀GN ?QP70>HE(9'dӸm٢R#ǡβL6}65k/Y)~gD0 Yc=?۳1Yz8]c|kњ,YUpʰE(l/ZzzXrzrNC +#dn[2aJfx%#Ȝ. 2SG2'6)yQHKdI[; ^km=!0~3g`4TD*#W;$_@<~ &zymïyÏ>uɰz)E;8[(޾Hs,-&!-ZR1@ZQ6$&f0Ͻ-Yǹm"+o:ӜOr^A+Ytj#eVĻECBJ??Oom+<{kg>NV9z4 6nq1QAfJˡQ Lqh T-Z:85H~@Ej .2x}2X$+r \ 2T BF44l_Sר5ޠkJDL teMZ "-^=`d훈oY0cqm{cLvʊ 's݀tfH{DCS'kx^Ht̩\>}:S .%86kiN8TQ2IV'lj֗NP Ԟ=l/s{ YRo#%8 9Uh+L[wYHG-IU24O"F J S\zpF:Ώp{ Zm.ÿgÿ*ޱ1[[xF`vd\;)OXF۞ް|< ^A(K616V,Ѝl@0~ u ("Ԟx +P;e4[ JnP4}5 K)<zC+1D\Y~BѧJBU '*RJ%KFcxyJ]):<$r Ԍ#db6!]8 ř/~BdϘ4EM84B ofl|08 ZFPG RP"|x묺+qqs=Q7swo0Mخ6=⸅0J6EA$@Ry 6K$G"Ϡ>{d Mj!D;;^@3٦b: 1>d1㑉_K2jݜo߁Wr8"AIryeF&ЏDNH2As At#3Wk^ |0fhL0M!WzC]FMN79&E¸!Eb3 +]bD|ӗ%cNM IDATRgz8ţ؂ bE}48tHDΆ" UtqʼnJw0Y2EfoeH@Zcxhs$r~(M!Y0tPDUnI"4zvw#%w a'O,DhC]!4̌2\QZ9Ұk%1" %9= G8{>/Dʬ9K\nܤy Ks?V4w382S? 3znC8z~r*z:VXB*NYXXCh0HJA1OftmUù̗N-TB.1udQE`5a&ɋ|`M:DVcFJhR$O?8H;~n9Rh2O;(H: ^DNU?p~ )#"G*I/Qdn0,`62 &R }zA4hŗٿsdoHf5NQP͛xbIGDRTC l|s, ywPخ~f8OGN@XF&As?B8K"R\z0W+r%*$(!& Ƅga??vȆ{>@la}SV4\k@8kۆʧ@5`璥o]a-i-d*MY `a`ksIaO Vpy fanNF=#0w ނ6Uɳ`OnXկ?a t}ow88˟:>< ?|v(,ܳdg>aISX,LMznWēyQ Ÿ /ATZ,OtJBv5h{@ba/GlhM P/ : Wm ""ܕZ%pn }//Ȏ>#I&)|G &ɬO$s$P409u2O0LSk(=yrX:pTA@hAIVНMyHy7s>s)njP!M&;0w2hK39LQ PVvKHOt4\3\vl \6-6#Q=@ddcI"+%TH$# 1liCo7k]4¡!@{((U@% = u4% za@4c:?2KO+`QcʐuS} fO&ӌah̥{F?ιI>f3ν>DXLBy8~hdje)߰!\f}.^`}J;$ad  J[i(5["@3&RrL}7)lG)Y^¹͛l2v0Z(MY/˹&4:Ne^ ?p#,V?Lag9<0LK&4VkufD`Jp$ѻA z"ZCk9!AiK\@>tOre"w,+v־ o&H~F]Bk.I:{/rnlfq(o.o^'Wiѧn2jb*A6O1_dsc|u I #m8I^ LFiMҍ)919Z8LPN7 %-# *4];kao(M0|hйEzcsML 53\I\ /<ŕ*wHz w Au{jF?Yz !').D\5~`e~ t28Exmxwɧx9HcްpOcY+qN_dY@;!Ia{Fo ^|Go$o݃{ܺ˫mG/;ACNh'CkAeV:b'>V2-Zs zT #fw`1߀lAn3 bT&Y'!w-{)~f ł'ST!mrHe SYd@Eʎt Kc:Ǘ\oxwRϨX_}+*wI&խyj\c~ߡ$,a_^"XZVާeSP`NwO~ArDZs(`S]Զs?1-&۳tlQ^G7X CEB%e4mwE][*c#kn8~GgN3NLe.jMa hT,e=x뫔ڶI#H~IU=p*D..<͵ost>]ch1!}-5 ie@Z:ІCl‰? bcpǥ0~Z=e̓,:9w}kRjUUIb*&F6>0c~Nw^ ^dm"U|E4ʶQG &s8րH0tA*J$&#~zl-jp\'!Un?`i8`Qq8+&h HjK^+{u3 7^ێudb?ݦ8p2 :GQrA܌} w6U7h&p*x~x .Mnܻ u]9X?K1:묁 oZ#pis럹s'_U$%h]wa0l;8+ga;,~e jA/C.0Ts Գ;>?&!wS/2$zrݣw"5mJNYiH FkŽŷX@֏БZK7="Gtb٬/pd9ZZ-<3RъuᄒiGѬm5(l?yXko, >ml}CϻzPWfk1ǺosrӋ244iC+H)뭈# P1MkȻ[aa(6{=!v$2];FrMF$$~bW˩`ZFPRRj)eזY/{m@xCX H}ѿ`T 瘫T?UyJTh*Dv5BJ h 8xe=؞ʳ!H: L "?rtj}] =w2wW[B!ZɄ5u=P:fQc\wc{ m96_{]~6 LPLo]e?>X&kYt7ӡ+#`mih+I  PaVa#;5Y9c~.,V]Y\pk5Of,uh=VZ./b$7r(~@k W'wkRIZSD/?Ci6kZ=hyt Ve.$*ʓdplHY1k˒&5I2Ge3Xe!T& "䂐(`Ğ)άS]e`טl3P Ӵ<W -M'dƊKB a1vPB./%>d iDd 'S-RxHBPw* J| Ty3gFNlجҭX f<]WB?"86Jz`<,}ܨd)' 6!%C+g@]ڵ)=1):3EAg̷̊ Ѕ?O5yɩ/H)AmGm;v|엇%:QYWvga#tM;؁=.blB.>` N4$ $]9عl@ʜme5tZ>= |&@:\{woq09Q*fga*WwSaya~}=M̖ӲNq\q_: Y[k!K5FkPYβkWNԛa^'F/O!8 3p}9n(}н᪞FOul7 +Mbt`{ ę*bC j$E>A$dJ%QAZQK}OѷYl@vV"|?vIQ=K KT[VB&$Fd½a5m /|V_jԬs(CԷ4^|81}V&I}Oݏwৱpxb/!<]D>!KǚWAi`'r.E1k"Gi('ISA%F vjEODŽ5`,]+ LJh2HJ0HX E)MEx;Y9$0wO~ӏ/: r%ԁes2N 2ӎ(l 9)YZA BR'HC;dh# K^tte09<470vA`]623^9<-لm|˃X4X)$u6:W!S⫄Y |OaG)EJvZMV@ ؞x.Y頥 1eBd2# ( cC#wR(5OqryQʋJ_,_Xp.YC lޤ۶.$X]{E#,T[ϘRR=AZD"u$d C4 gM,L1EH^AbIS{ ?d`&L? OsQT$]"$$$3Z:Gi{I6Hmh ݻFLRguFOSdh?s Z)R$u<6<}3mo$ތ #u5R\\iFC桔GBh_`DKdEdIu{Lr$B@FXI B!-2IQIL+C!`qՕ0p%\DJU?=Z/=.bL0;8 aɒE>06 %AUw}Ϸnf}[0{ 0J!'2.ég%W8y]9qض6o j9NC0= J%9k|©tU8wFB(2,l9@C(Y\`&4}I02 /9J ׺B\sÚ8nJ+B~ܗa0Té-N(%v qv8`1h^tBEP< L:,#A0 *Ī^Z {iEVRo b%1B sT)yiQHH]-(4;qeՏgvjcx9u D tB`pwN8h ="4 K ݋=aBRS`sotg7{û}7f'8}"^g]B[,VVӤm{јαJ0+33uc & -7*[ qlw[aꎷ!_uJK,TJ@' XW8sה&IԳ Vp$20n=ds6`tT,F( h|R: K5* h ;6HhE0D%AN9Jk~je 7GVyɀ[Rc(Kκc p]m)QҨ7b4р}]( m`;ϱuԲaI+~>'8S)S3Ct`rNʓi9_3yD3AR@ 5K 9aPQFk HR;iOh) o4w;mdMtغ \AmJ k(]R}vOJҎ%0>y/ Rk)A+T"A,QG(V^cIB I(%Zf R)hRcѱDXת_d* 5d9~(TS:S h$>2XviG73ЖTF<,řcJ: _h!F`m2` )#RH- EPX[r2sLiЎbfo.JAzXE_qZFa}sDQB;J*t$a$I_%P Ҁȿ}!?͐u51~O «<ݭ+IX axDM]{;SaQ|8spp[;`4̎6n68d |YU>VJpXYrSÍ5u>_POD-^8UX^{/͟P,=o= {'"ۡO?QQp(+6aD 3K`]h`Kи n4o޲q IDATsz(}xC< S}^°s[2/CmP<@:6p2=  6]; Iz#^Ć6 PJק)Z1"p lbaNr#YG$ڏHɊeJq?0'%7oRRP%A'#E-VF DxwW(-q/qU yޝv`o0"V[dVzu5dzM2֥*`r}<v?/BH3J$D&xܼ'JKh((=0akeX nLڼ3֝%J n}ޠ"}y#{#_vu׸q2Bmݐal/\C-VVѲN:P;&OP\ʹˈF |DFt~4Rg2qjdջU{ \U$<<tO\M (aꞅt3<Kb`=׈ҙ@ ckU9Ycgt};(UǠzAKBrgɯ3s`>n B[&Dj 7(g_㫀Qk DԠ @ 9 ~έ[gx1\&`*޷hEx*k8Wk>Y@ݠe5(BA— <CXk{!cf-i%p|Mi4 -%Hi V*9(;"4l6Z{nݿ#" J׿w xͦ~JB< 𱴴C7~|>mnS("U9Glya$ BO| quRe0$MSB{vNJkZO~C/#bq}ՅEH6 趠 ZX8-v|f>p"\:wuȾi;<; c4;ӏcQ샡AhXa'4L:'ր/Zu$mO%s˷}pd>pO? w+]%{nyC= wܸG:.X[vSmwUsNCV 7o(4JXrڍc vAk ð{ [#TɁSU^61YR!ZZ$fd‡,}mI-mPs " "0>&6$m*UVy)=F8m >gyM0亊1PDX.!@IAId^*z<`M/ $DJ*%mġ[ē9r{d0[/xq.t Ewn}#G`<'N| A-IOi+{ Zm!| Rt4ӗ6[(_yd@S %DyHtNrd~Fg.Pp(\XXCV葯@ 61 cRF %if5ZNkq:MJIANJJ-9Gg`96OyFSiJ"ehOёL |'(W֢>R@b}IYH)EJ1"@ L 5Q@bGf $c~Z7匰y%#[_z ӊw>xX]H`|n!wkZGRK -V@J2c>W 2:p !g@z!x H 2 1!'OSs}>0Z)a3xk!Ab!IuVI__˿*ġC6z?Wc=ƓO>g?Y^::}m Bw 6sںްg|q.L4| t` $~(LaC\p!{A~Q೫N_;AtsXs(k02Epשd&_˷`.0 TנZs3O8Lk /Cϟv׮8c?-s7>Mr6 - :}PksCav\LqkXX}68 7sZσ9TOݽo}pĹUNA4 s!SAOb+`Z߀- w]Q:(X$E0aNILu@'/iT orC% YҦt:-sKW?r=z!S~>p2*-|(X(30L 0Fbɸm{$CbHpmDh#Y4ߜNʼ4XZVc{E{ Uk/Zn"T tS1ϱ6ȽG%] od>?_cx^_fø\GȬ"84$Dh"0\NYK'c:o-+$XX&; iaStؾF[|b<;gX/ӤAh 4HF;kC^% !OfTQK.]D/"R )ȔGW Jh6a:WY] f ~{dt,Z kʁ Wq kHJeg(Wq?ƥZb°͝X~-J}ԿE;G2osQgeqա Q+ԒPݸ:(g=R8)HBAb-^^#CI,Tz{ :;(.^o}+{>?GNs>(яr}159?q>U>0;;)EekCm~`/J%>}q*@xer177ǯZ2R ?󬬬' SVy{A.ٟYfffv:4H?Gtxs5~~wrwٟq 7wn!g^z<0W]cfvNSOq=yB;ӧO7 -fr__%"?c=FZǹ뮻0+g8K˜仸yn942"tWA{.@mU;F5n΁^]t@^"47` Ta!hހeqۻo!ؚiGoھ.=;SO^K#?,q>XۂF g\]sOC~grd %x0_pn7ѹQ?CӰ0\< spc0p/,P޺.,>r10|M&F9z) %}Y'wρ7zG.gkjͭ(& ^{Rk=JVxq@2Fxn?xk4aIl|($0*GS됕%qG Mk>V}{7̬0ֈPa\+ 6e(ayNZ`5d+X1pRX~+%1,ɒ 8;(<=(o{kV_E'ZX3gX[z1JVZ(ѬYR%<6[x? CF&tgR(,ȌDHJ@ 1lsla%%BsZ@BC` Xr eX30d& -SFme+l,\e\kTmj@TRU 1ӡ siFVCfڳXA ,tȑ "%ȹ_'!JI"EzaDT G7M( Y #wN}k5T)tk-`rMp3w[#X /cIC ߻TXII"WB0Iօ ' ! n%P(@9H*[gA]%5bO^泝+ĭGE\5ʟNiyըAJm53sTB '"` QUaR7mH ) r(佌.<Jy 31QgKwrc_sq6o$LXłvFQ jK.4- 9< q 툜J+E@FK{<ɸiyz+6[- Gƨv(Y c0r[1Aӧ9,[$uϒy<%(s (CdZ6b' 4uwy7dQLۥi(1OR 5[C+ymnq/!?4ˣhnRJ}, isRc*2ba)엸%>=͓Wn\`NGtU/1 lF&ڣAL4JI&^QP% E4EO$h٥"l,F쿚(Z?~y׿,x=?(&}}}ܼqIΞ=?co6<3<ߤu7~{1,޽{yGäiM<.\m{ {3c ~132:ʛf:rO3 |~U +ĉ?o_q~7*8}4Y{W?;6Lvytpe/pg _< Cn_v},|+.Mo@wˁ% oS0C o? ^. w g!7[+C4^TOtkIW;(fP<@I%;$@EPN_Rt:3.д6޻^ftZ]wD끋߂ wcI&qګ1RRдS q"нk$x=/"E(`[ 0NM lFZ6a"i^1R/2zy,۲eWOPK..LXl&y*$-d(LtqHt U$_(OȴO \#OKHgS[OBTGɒ9.OyaJIQ"dRU ҅WvCH}Ir }!耴 q}ɰ)li'-Y&QЧ4^ڍv9> LtYeSx76Xȩ[kXb Ҥkl1+f:g##wAr;?眛^:0LI(H s%$˦ H]c[-JRy -2%SD $@&`bOt~tq{HlުzN{}Cwzm5G_HھQx|A$du9sl"VPudN,$k ASx^J`NxG& |O<;JwHIw)+5‚ M;09.QTr 6!J ?(>+*۽^!r-6xpG,4(g v[OsCS~?om68<ϳ>FT<6BW 5ZkZvRLqBk8\.l6q'IB\ETU-." 2&{n3=5BpE.ׯ_'^z}E^`ii'?Ҕ Ð#LNNǼ1._*gΜ~xy>ǧ?i>~GZFks# MPy.(<7ZσYM? $XO pY jawlQAA;P=Qʝ x4g`Ev IDAT$o(2G*мl?ˏB]~MOҋ] p7riAO3qH-spO?ÇY_+? \CR8p?[ZEFe/ RlQ7.EܿPa1һx>p$'3qӽVpـ}gfm:>(/|HRT B"mLs4Gٹ)쥶NFhU!ܖ2B !I8"+M9ʢT)e8Hk؃ GQ ĂЎ(RCXSgsAvc_-vEds7VC^< 8McL5t<$5ȅOɓG#"4M (SX1 5{8OT|RjUȄĨH( HG+NmFE{l%M[jS4zACΐKԐע^ʺ]Sܣ  1o3^@ZrPZ&g`,0\p*Rae{X-GnB+Xq|i(;aBaayFVTX,M"o~"EhL]:yReljޔ2+ d(40DNPWPL1Ԏl8fTsJ:2"2ꮠnx@5IUHuƽtqcw2 :?0|k|n<'{x%HK2PJ0ZE *("+=bucDcz@bfԗoNbʤحZZm@A}xޑ;){MNebG6neɟdI\_C5M1$A@/S6)J%OspPk GkEB UJPbKud2D 22D4#i9'K6UdXag2}_fk,cBPĮLYwhM&߼#0~7 gY}7Bc+`K/8(9ÔR #GT|d.QIH%qPҫ yL/|RvX "b t'G &V1|׻m666x>яocaaO3|__YdKmm?LR!Ku 4xv>E^Z`0`LLN>o~^pp@2#s_ nFkfgI at䟼4WUz('>|3aaa,ˈ˗/sȑםp!UT`/8|%O!9h]+Z2߇c0W/Dnl럁¦؆E~mA(_PҜ!jg?gzHG =SsY-Rݮ(DXz.(F@sAt|7Fh|w+ng{ ~7feLUL ^r](~8}?~﹍J<ݦ%g~m)cz=ސRp,{:w' 4;BK0k`3r[૳x IƥAE1V nJ]5V AA0-qxI?ut&יl$4Q- Xfq5' fC5aаI@+(U]FjXBpTrHY3y}Pj5IŞRFEB Rpp2zE|i4Yx(8NPG8saA Ut&Ix7 eC:tV{Jb uahZΩU `/چ*Y7 _6|m)ώc#Q113q6& 6f;mĥb Y-I{hvIN&?3ņ8Bueޣ,c` SGB{ cǘ80$M&yr+}7yڛu0V=L6n@厥0!2L|ҋ>GG43(*[ Ki'EfAc̒A]vwu4vԟK_$",{yi\.195֚}C_8F],Gz_?C>:t$Q}_k-_k|~g}jB)oo"~Cu1:yy;;<?~__v~?}Ǚgyᇙ75E̙3,,,}سw/0 < .Y[[G!_uGyC?~0%CkXJ.xFB _"t!hB6^QXOzw^'|ga}PGDX殺 &s * 8u{o0C{ ?XP A_9W/N ~_1EyuFjg ~" KmG ^/r7"4&a,Zh^6 p"lot Ajak(,/NSֆyiVfPé|(]8jx|Fץ콢 JELYzg,_J,KyCq橧32|є-dFGP{*V .%ԧKd1~Y%m; Ffc k 3I$aDLmCyC`k8injA65k!<5W!mZ*C&d9\3`2v:E/O3Z"T$ANBIN{1Yҥ.43BY˗3|J|s緵6} Gݛx软xUS:(^ Y~%$xWNiJn8J-*\v(2=v(,, 2Bun#uл^869wXQ?l^k@{)h_B越})k TADž=ā 39 /$tRdzWa(o.,+YOB0/<#1;=ރ5gRX%4@T('ʣ}uM@C}Z2TE@)t7yx "AGtQФ_Z9JԲ21r$ޠ46NBvla/πq5}05Qy(]Luk8/3>5B-kie m]YA-b1;P͐|T\`уMޜcXMp^A= ̄ 30RtYй$ϷVc&RwC-y32rnk(o033xbžj#MYKu镰#tjaa*5z"C>^7Zi#!4a6 '(TfZ5[6i6]ag̓.Iɕd[ĮB' j9$CϐRANjq{<7\5lOofh6p}*. [Z3Dd5TU U=Aۣڈ$T'7'81ߝßQׯ_eu9.xfBW/e~I82 Sz8;$\fĹC"IpHHM,G1mZMۂlwS-[Oϱ֙ëQBe(" nvJiEq m2ʵ`;rJ2cqN D# RIl2BS H2I\I[1Tgt9b[ QbƸjߍ$Ip~̤\3kMl0:~uH"Sqg/`lq)ǿcx}[X5}EZ+747ZH^U1oLP 3w}oZ.z8A_PT)8~Ito?okF#`n~?ywq13`Z{R]HV!ov>jK BۄB?"K]kh\PcEVrW չ?9Y8u z0=2|{`l ֫v(pO`&> o/2LTNy71LNask_3xӛa/?Uh6F,PfQ;z,*mYdڕoAgA'Pqݧ iCOV9n7#_)愰Ӥn0 z&`blB: 4r5Cg7=0$b|ՆlXıd!F`C%TA_R%˽.f W^bahԙ5FJTnC>=NڻN@e ,QآB^-1.KkZ &].\+ȕ~*ux~3pݔ.@E$~g& !)G/5<19~pIJLB Z>exZEȮyӌ.U[b~Q/yF5XJGe/pf<4_dxrKD]ԣFLrhHTht|ڙU2rK e3A IDAT(2H5b\FM ȬdXu A }KAkvՍ%;SZ%ؿ-Rl2hx"g7ϰtiW.y[$V!#Fxr*/iN6L19؊Gϖ 4@H]68DK紅e% i:OEFǷ 9|wm||shHNV} q>՝/5 cc?j^.AԜ:^A1+E^P~($ZKpv6XlA!^]&x9 Bϰp;t *P: Qx z?|> ﺿo@y8: x >S8.%L l?w@k ,!ppa{` %8<^{-u~c?.$v'Pܨn@v1x@^$™sny+k>*`wCdM nXШDKߗ{ B(LC\a9Ĺ%$K hn !VEmR8 #BqڑN@A7#R8?=u3  xHC,CrA`=Z#D4L|]!/IxJs2\Pޗ62  -d @dW2ȎGfl,n\s<;3{OMel~3,?W7r&{NS9U+W`[2^1)ێկ)>l%(:a($oL]Mћ;􄣞:c67(Y!z cG33s"W1zޝpemLl"1Yy^/(Ksad\uܐ[ (5,%gc|p b-tc@E(&=˖ 9wzG)+ERe,w'90=Ce~Xcsq [hi,CvP un;S8TB{}1c")CobPN2£|q\̠L =cȑ$+i SDʞG`w|2.̐Vqg(;SSc-rx'CxINX \%GY9k}^|2_3F"&F"@j5[pHY*rc%*-9'á+bT}M.$yj5+Őp{* A[ DV,xn@ g!"x1~a]DŇ( :( rHRLS)$VdPLd-er0VѲt q) :#PPA A5|D xi07:jרo\ /Wt+^ t(]9e$+ : 3QT-E`wWĥt Z:PHY A1g@z *8c@- vy nSX+A` @iD`̋gVr!GrYǜ{D9&eD#Vڀ dF"- <V$Fhj hF`ޒ SAxH] ൠ!JKȽ#e &Cx2t!8HmLBcZٸ8{R D7xJzRakŠ qp(Ioւ8-S l1R$%. R@A LԨ!`M A,PFHB4^K@!]@HP) R=  {njfvGdI*> }1ρeI(xYeH:0@ JT`pr?|57>UP <kQRq#! R;ǯ+fя`!?G~.'7~"~>y'/½#88Wpt^񦆫?9,oAD J[DEuubXy1mЀP}ɳf4D@CXU RHLJؙGPKxM/C"l,,X!'$\> XhTP' Ayo{k9|0:15y#Ś f dQ%Uë_{/E{G|=~)6zz|]Ў&o> X&_oD@Z7߼ʗY~.)v`20M8pdjLQ1P-5 S8M#s0w%Ñ WAe& *Hx)+ɕ'+N 82+>Ħzo A@HND 2"@1 ۍ!t dTmA 4hEDaX8WI@ ~W1`4 *}2vE !%!!O8v9<3Orx(b*Ef14/oZC  * YF! | Ca -QAK|duzC!' ZtA{\A M ld`, DJ [ =h<;ơLw JhWژ$`L<~uƈ?T\I'qGhVa.x4x/}5BN@$%>Q%!I@ ID*Xi1)('PVQ`ȂGʄ,Ӊ# IB پ3@$FԨ$!l#}Bg_ ^c(@tK?+{Hh% RY23a,_XGt ֯Q_9FD9wQKpI8q銍8"qp}~p2 ~,.ěݣ%|bܝێ {%xoCg6|&cxz= ?gw.2"­xf8]עRJݍGCx@0͸=/E^*̾vּ~_'Sn}83@co3Y٬׀o}ޒDDu̓ThS- IՐǛ,(+|J5.@92dr[L>s8|C*$( ` ˤZҰN霡O T$ }RJR JcTxpQ͖(2Ǚ%]sAba\dF; ,*Bb-6Z*RQ2B-6Y[3G8*8Xͯ|:i[(ԈTj_x42$14] #噈X`C˹"㯞u)P?O3zqz瘣>p8q `#=y\3#by/<3"X%Cː*FbAzhE*Y2`\XDP ba:,G!pJx)R!,R )"A8ON .s*xܠ B,&ǓG,ˠQs&K3 VkTuxSǙ]UldsLSFq:#wҕHȬ:'ABa1!\y|@ZA08G R8 AŹ1Gs$S2!\ϒZ( Ff<@aA',@#t^t-*g@ R!)T#9 :(A .\ yBS]X8NCBs 5JZ|Š\aD[hʒE%i0*0DjjXxTNWXIRF 4]@'qp$8-r&!ׂ4ޫ1OE(\A:+#Fa$R3w +PrSOrB!ωq 1EjKBZ Ku;𞑇mBC L*YZ?cX$?KoQMYL$wvЬMA/[pg[ԉD@{B]w `8~F9H2X}= |&O(%(g"t6v9@;?kw@? $Q >af(ّnr B3=)7Qz=' $=tQf&^ЧL"CWI60 Z̃שH9Y]3qiRLdl2vE7o*",ryZECB<`X<*HD |FNG&zt >S"=Ii"AXG.jlVԷ?t&,~S0v0"c噄1;3Z'90uKċhX!':V PcO>MJ}0JGk=ZaBQC5;,\ {o:k'+s#{S\d9Sr+=]d:3|<b1TTʨeZ{FRcoE] $\3il!u1E,iitHwG KU(&(YkU@e.;!]f)\@cHeV3գP߂[qADKhދRp;@Rg;[qX滝=gl:ҒcrsnL/lQ]Gߵ${۬籶"4]# IDATA9LGQ#Jx1p]C\|c^bc 4V@ 2 KkЉJ kI0X"Ppc']R ~zMqCi\XmWWs/75y+d1rA,\c2-cz6 oFU~ʦPӎjyJa(Nãts'eK)3$ð]Lܜa;;O:*cWύ9'_!(NVpsqxaeBQw>IxQãe8w6} ݟ|!W~{i7^$C e1?ºݥ!ydp1X'Gk|8>bo?@pDdE`m/Pi5|ClQ]՜ 5k]>Iٜs1tSB[tl/0οZ8vlZ&]zK:"J0I7`cҚټo mQ#z{1n -ёodk ՜Xa1@1[ܣ%%qy1:5V_a1MF#Ce&dܥX*)+-9䰤3WcV?Me-tEmG}Eަ^f2XgOH@o ]$ LNa.Ÿ><-zj'e+Ÿ8EC CbYN \1j-8C#:`8AZ(+b0{EMƸYU˰sKɂ .nAwfX2C>p]ɼg8clB?{ݔ,*GvHo4$t,B1=|" ,{ʚp%A_ɓHn'Yʠ,Hپb+=xg~pq{7y?4aAO2f+_"Irx}/Cʘx ?{ ڵǸ{6W><ہɟ*ekXEsw`#q#{?^Y矁{XXT",(ia .\x<>|L'=H3!/1]vY(sX?-ExCyX O? b=[1m<1$Zo?Y}  ~3_Shpr0<(;wln$_*.|N/ǠlۄK0 h#jؼf z }YK3-$\ Q>41";{y6DF?b[a@ ]-bݬ1h=`S i3sD.7*=΃O44!!-Lװ!IL-F YG#SjOZdy2rpڤtbNo! E BC]On@TO )PR) ^ %TIА:Z^dUnwG䄴KE7R£A5ԎDP&288H d.cug$!&NEB'KZ!' AjlO,JmAr(h&I0QjJ)ARg z*&ٸɮ,`GpI*ͨ甠ВE[#T9MriSNJfOLzIh̙CJ=iCvwWa0MpH`^='Ͻ`}d??ÿg?4XNOyɧBᏁw~޷wBh{( W|cSRI.7fDYQ7=[&"f^VLTϧU#1 (J'OoFr߇mQtz+8?w QzKpp2|x2g~.?}R-w`kqW~ ~w!. ." N߀g0XL/Eh7#((JEUZГh{&wA"TAi9$GZ)>}B[uR @pPT=ry5.t+KV4 6+z.mb2(;TYǴYVfF-anZ~lo~q8| WS'=陆a;ЦsL2a1U僆tX&M0?9U*K3Nv ꥣ +FYm~`Y:Q=} $ ul& O S7^![Z'53j{EþI> +Qѝ[P5Ö2!֌ C8Pj9vz!?w'ٚfv8$d *dC4 ~Ͽbr%[?yiVkOmoo>~ Գ}(JY 6X@ny A,Y/U1@W8wIE΢9a~,9 ~.E3PkI+MwU陬a5XF+t*8+9;yAGx&3 E2\}ۄ$`PBb#W3+cYsf6(@RŪ్k-XރQ6ng<paE4\?ssUSxUn Y >H?ug~ ,_ ^ߌc? _<|)G4\ۆoރ5/Cx~ vZ] eyPgbnB4c [K|=n"E$p9H΁П"XWaM YXp=wwXwe>; j]7z6<308Ԣomqs(iP,:lݰbl9+#rdh&0ℙBd^q7RMގKla|ڌP .Xm)*,XYVÜi4D˅†6C= jme]fyWX猒%hбY;\C,'ń:!I4^0*ĐEB#<{s &Bf #, #$$"6 cd%D9bwGBkVj/:Hr!WsnxupT1ٗ/^c|MZ23dD*J'_~?fuv+U9/dW C[ FhjdLƑkYeGhԑ@u7y7kqn)c[Nmesx#ݥ 3/hְǀNiǘ)gIr]d͒:B ;`QN3855BPyp4=HaZiltHaG9ܗ9fTR5;%!:FHdc d2=j#5X 9eojuI2-ЌٱkK|:ϩ ]ל[? %a:n(R tJqmqBnV-m kwܜ=(j0sւvL lqiCó Bv/NQ: <2fՖs)KWy?@okĪ|;r)ړj?ȍ2 e5!&W_,l[y,֧zN@&%|MH5|2X ygd,Ю 9pc|7> +q.Ѿ8EVB E@Ꭲ\s~6]Ŗq}@,m%7{wΤY#ކ$ ` 6gn4ʮ֑ a~"T5: <.$G6yC"MN(qQ McÁeĥ+'NfpA#]|Kwe!"+5FL M ִUCS$ 9̺耺Pӟ$yDPmb:L$E̥Q%PS UX͊@&[xgӎÊvlar>i|"wdH-H}w } fWYt:`eAڄE_-;t$.X h_|K<^bckMW^G'P/v%+ >^~䓼ꕯ;|;.^(?gUbXo_ O+a|?<ݐ%fGZ˩n"֚xy+_F1|+_^?#"ޞ֚?'L&/++={Dy>̧>i677y_R2 Q z9ymfVX]0k`*X< ˯+_WjVTP}}).lZ*8>YS{P EqA8x-էa8?O~l\*S[^ WCP3.BZ=rъL3pB > KWÉw-pO> C%ߺ<7p;w`"Xi-S%#>zP9[RpS0? |%l@:@1{OVum9棓Ѕa?P+O 0 ÒIv D(NAuAl'N#b =^i 5:PMLIjE݂$\eKBu{E6 =J1Zl ekME1$٣E͠ 1a-34#9> mδփu^6+-KsWU3:k %wt3.F-p^-PfH@"Q&bu0*f߂" Fe,^PIJ^g+e^)qte8RȽ5YYz%|3Xh!Uq1j^f?`ɋoz\uVsp  'HLJHwfV{H#$iq F>:z[A3.#=a؃j-DT-;FzTN.t@HI V-)iX"FP=28I"9Dl+xA^j%#bLi<]9G݄!&S%F}4R$@&e{6 }<-bZPM^w{ꤰ&\Db&t9SwWC{=NPRE`2\tC@xxn-5|N\ `0x BZC.@;_.zVqup"lmÉp0pXqP "(Wx]Et̥R%\{^},3 >3\ϔĶ+nMxȍ \&/Y=nXL`v3߃cp0>_/.YH@_㫠}6d),σ9TWoˏ@~ k `\l|QN)z\cO@iH['ְCpÖc,3Mve@^iPح*EzaoNgʂ K6[쵱F{hݑCq$.ɞP:-.A B1]ʂ139=>g= Xrhr93J@, zW#%ld` ˨p.1X[BavZ|b]p(B{ˁ 2ҝ6PP9WBڔaVmJnw#Tx+-eB{,ɳ1[n]3DZ%1}o0l{V9rx7 A zR;l΂I'h LbO%BTavzNk[\e0WdV`e6C]/MBshX*p`S*c2kQMn kH*MK %g aI%$AӨC{.bh J)۟3`!&g@Іi/}G-Җ`!ĕV%`ub0c.LQs,|.B RI<N.3X1ivG5V1liV'=b2P= n0{Y!'XRz(L&Q`Z|ۑAĐT#*EO);WѨ a'z&UK=pmXEO$Ho2ق%:xΠ _k5Ie"^E1Pl I\MAW䡋3**THyFooP5Z~뮻;#,?%tmӪ'fSgQ^ܳX<ϔ3gY]Y׽K/~\_wi,{5G!GW?Wb61XZZU\6Is4)w=#7k- `wt1\s{)'aY&(X.=.s5\׽ I)E2y_j pvh7B/t趲}^xϯãN;XDw l=U{w Jp2_m= 'ӰrmtؓEܾ} ZJZg'x,Uv! DQ[T td3t\ "4W N rC[bbD8g&֊E1)Q s$ 1FôqF#=Д4\(Q489K(l]D%B`H$B剽!]B K-M(L22̔ yfꌒi VB %͡#Sݓd"BJ,b!i{gFE-m5ڑs`Rf3Y8#GrI3 Ɥt_}+:|723z,NK>v-kncW}G^EuE[fa[ ^G ^ ɕ)DQp0pR6}.4(KxCOkfZM̭K([ɻ>i|2h.y MUMh\H8R[֖R^PΐM ' -DPsqS\1@= e4>ddR *5IiR[-hj#"YkFhPEJ BT0,B"NEk[P"6h!;a4]IJ ]S+hI1%- L tZAC#I}&T$Tġ&&B4JPL;v͠ꔨnvHDJMK|^>bjAL *g41uyH qj`pXoFlEud ZIĺ k:e΅F |)ƐUEQ>Q"Hd,fIз4 цdz5B셖r(=cIU,L=M$7aA,D*@U/Pa%dD 0!"Ak|2=fBp)[!BiOm+5MGdy(ey=U]˝so{W_u?bcc'NDs[oeuuŴn? 9 yP{L԰#>{"n±N[^Vްfw-hGXbbӂ,Gba3.W b253yԢ UdbbU OlI>^4)2nPV"1dk"P@'\:2 4(C"AgªH aD Y_%Q.{*sĚ3)Bt‰aJ*KDe#kNh"UجJ(GhI gI;4-{V IXD$JwB+hX9y`\3{8ګxNoapN]7%[ .%53qW<Ɓof=yrP֣tAX =[H!bɌeo %d2U%Lv Q6h] PRP8'IblpCJ#rY$"' T&erGhD i-,"ĦDt9`j(Yb6LU"D=1e*Y2DB2f@2r Ƴ%_ :%hV*f,@"dըT#'RkH M5{,X Zi>!ga5V[S"Fg*!e]^8b-L{au }\oKә, f=;92`Ao6LC*":PE4z!b:R-~~xв6? p^8p 7pSf~(X"<=-xbLΉUUX4h… xM|'UU4N%\ꫯsKDkkkk_;407rlx*KQʰ&PVW. :*  ʹL'KU-X]yhНR͇a鿅߁CPOagK+q8SY_&%7t9]&|yњ9X W_yo[Yו?(|x0Kᨂ8)ؼ _WJ%;_ aLXf]˯T4ٷK)h@R(qe^q-Sh$Ay/ `cOR,ެd! h4jn0૆ L]PK+\#cKϩG#ԑR"G7V[=^<fh\C;"IakH XYtj@hwLH4hTCTߒ"b斪Wh11 !Α it0=lIT!a>3zBЭ'2CADccƻl /C^ IU4 Fi* R"w*ɚiI,ƙASD7.TyZb4r#0Mu )cF7<fv|V 'nſW3qSYG}z)3lMOsqgE 읆BޟMpzwj%]wΟ) (Xpp37 Wg/p:l`w)U], տ׾z `WAڢYڽ 8Rܡc6:_?[ٝg`ifu0W\T˷O H7C vT7B=" [lUcX#N$?JBl/UC۞:B+t+K5D*zqyP@%ZbGХcB&$Fβc88A[n e3i0e7%q4bNQջ_5W2V=b2!XGBtj7B2ؼ%o{TJ V/ )STxMC;Z|?If~Yc\.M2,ӢbdT5CJSA[ F$C1Vcᑩ'ENe`~ Ԍ)2֮ɫ$I[xt?}ٟ7toy[_>q͵r~g?S/w c x;w*W_}u4ӊ'NoÛ33y^#k"_|SBkͯگɧ?in\s$f)?G>,/7ïsOm?xgk_/} yK@ ˙Ľ>oy8pc= uXwRn:Wܭl>Pgqz;E4M])\ÅKX|+,9xSv/xWD}: ]`4

n#+`bȼ t}i}_.g/1l[biaOJ7KmHP[5 3R̼v ,`# VfRPM0ۂȫPX"WsE'9 4VV۸=p&|qDh1-u=v\4=RKe12Z `{ˁH{ Z ɚȄHH̊q ݌$:T"H߅}+ӣABJPxL/FtjAd4jIiwQ* Jvi@G=i8Ҡ3f`0VH!0 db&ذEDIO@e\]X6ΡPhrttb~Pۄ9bPAd6tAͷ*Tj{=HXIPX.#  -)COyGtRi9V8@z$ !Mq`ܜ#F J%mLt "Lb>_*y@&3OHd4#[DiҸL$avAܐ$HbPÈQ*ehLe$^c]Buh!.d:SѠOc//?̻h!C}Eӎ0;l\G茓ɉXABcA&LiH7$S0b|C;&D'5k81^ǘHKz,,4@(P[3e/8v$ĥG˸QɭAEY)jiL&dDRID#lh$eeL /hE1M,)cJ/ xH1*dнZAfF(XO, ,i'XzL$fHɴDDthj(QQQuѣ&6SyK)cE"FQS(&!RC[ d@)(% P) ؒz;}oXeov|ゕ?ys|@Zt\z.1WIAߕowz Y?f7tNS7H | V/_$o C#B6 ܖ ~K𫟃%+kzt5cuPY n]xjwp-ҩ^/~e/Wȗ^? 7>\ =k;u~݅?x{1#O 6-x_} ~?g/݇߀y ̗k7}XkDU*G;{F6 ,>Tbz]9{X[Ie=aZH w*^_ Ӷ?ǿ."bWjaRR-> jyñ hlZMztWSOHB* ^,YZgb϶(Z`|D5P$mƢK)Cb"e3F| .qZ5Xc0mF1$LL(4j(ZN8nkȳuI\}=U!HFKo V#fAUCiF#MڹCʞ*DO•\*[ &S ev%EuUYo"'k /&R*5IWgFELFB{qd >@!miE[ kU2(E)Lc6{ΐ 1d1$tSm\BmfSjV*b2*Vr jP/HR r0[ZNİ*61#ސբ@!8tB(. Kɐڈ5Ќ@vXk)"b8ŕ̐ 8-!%&SZl.5xZ qb*!d)һZv$: }}=_PZal;F+F*i#g(̹0GɅd6ql=Hfu+h10ɮ0&)ZHYÁkc;r&LH6VB_P, dxUw"yGt7wPi. IҺ٩k7~o)1E[ߖWR׋#TԷ_<O>S!U%?0خBz'| ^G FתԪ(W? Q _PW瑧jw_ XڑJ>A:vŚЧٳ 7,6B4#Ak t tAi3:εa4Sx8h xF[ =Mh*X' 0J3ZE] `}řCLS/n+$M#Y3Y >{4.mPCA$ְ* B{-Mh"3hvP2Vf X mg"wB'Lf`;@_"һg cKk(0ZQ,g0)+\0BVEc/ xj26 fBB0Z9X^UYƙzD +F !Z jk^/<ѷ-b3 .79Rw]̱ŲUV$Q:WGY2D)4 N`+%4saʴQ0\l|-0qb`IpO̹<D_ȒiG!Bbf*Z ʶ0ł4u<(Wsd=Zz& AuFFԂhҀ/`'ERbpZ0i)2Mɰ30Bˌ׌Z[%iI"3+-)^HA1p8υ$5Kha 1;31(entm䄙lO, ٘,EduЛ&v;Ì6۴#N4bL!MuE3#8egZlVLb= K oc_sTq-4ų7vB&+~ޡ+Ri^sI K73cdN!ʷY3sh&Ӣ&b͌ +Ţm CNXAlb,\])3Jd8TK_<3\Sl"ډ]' v`\39Rtp8n宁*oq1c6`9RG zb93/=wւb||UwOx}!j_zO||'t,_X|EDS%UOp LcM`񷭅g`AQdᱷ<1x5x3d=݅jM؏^ӓV3R"1pJ-Vv? +/Tï0 ܹ]9W§n>zz<|6  vwT;ç j]Ԇ}]l_Q 5 5} n?~{q Gas>kx+dH5\;wՎCoA\'<(wjbUsP%\J-waZԂbw!>S! J՚BV?GXJ݄ZvѿBh,| 氀Dk4#'Κ<RS Ǯ Hˈi^0gJvmE$`4 zvII`82зĮd7bZ9eqѱ  f&3a  aua!4:T8WGJn`=}6XZE58nNl,tm!Jʒi҂c]LSt~#bc%A_ F6\r C ΋|0 ȝAGn& 7YٳDX ı, 6Lbv 4}DeA a&2Tĉ9(cܐmf3$vAt6 Lh&:[pdB]L'6I;6ٲ$`*)7} .aZEfXG3w$33<i<))YB$1@;úR3tv)mdJ7d2#LN-{50\ jYfll$ѣ$(G0Y0걕. =0ef`>7HRZ_z|33g BlN&6RSD6]{Eس #3}xMM\{!СJ$`$lf09sh h)$,8] (ٰ5DEI?jY H, 2+B’\5;xPg1S,1jP mÜ:bpNi#H"5Kb[/sL,J6b}ka#I!kj͞Ҹr4Y [\Ᲊ4c 0yGXN؄blX {f;s,;!0Κ;ҹ#-,}.t2szawKgm物u5 uSe)!busUx߰3ķ]HJvUY`%u4eϥpT}[ B5My/y-Q;)}Dsw<}gaspu{/GS`lx? iN8J#e2?g n]7;s=V]=#/UYԪ短KfC/N z  wg n??r/o{/[5§36rRaTI IDATʯ,~k+o4{׿T2ǟrTo8 ƮvxC5 E8LD _s~DlDMK5acWa"tonV1G/ka.dSk5}CX 0ݫ{A"BӂTѥ5wThr/8ٴ\*S!;j::26tcv}Yeˡm 'B4DG84bLq mLSL~D7,<&Kf=254tm39csØ,,ZeA TYc\`&$M`%&X&NrD' =/m@nI]D3n_pH!I3񸤌5/f(LXFv^qZznCcz,VEeaF̮Af_L (2)D(e4j1 U J(]cd /XXTHY!Syr!5rP-Cbʁ gk9p%4i8We !EpdlgNDm`Ace6)C.+dq Ɓ:e56%&X,flq@pFf& V*][@Vd@R#2!yY7Jv\ 1Nbji8LY(3SH. D q|Ap@#m[/zö-m(si30)&%W1<˼F=LMu" c-֯Y@[2y"i %   t,L }Y!*2[Ob3# $г L,n ܵ $y(SN0*LٳˇehJ,bK6q/`,mjybpIPc{V l<96[$Ӭi8E(5, X;L S͑2b,EP9b!kO͙&Dlji3Fnnf 7wX:C9Ȥ|hQ v]Pdʕ9os[88>̌!0Z|*a5*~cq~1%o OBcC㻵.Oӓ0+Zy/@9Y@` IpR=3le},RA~/~>݂4p8:;`0~^ SxAx.W='vVBx!u!ܑ_eX/? /} ;Ϳ qzx0jxu~GOp:U | fam.ÝOէkl| p X< UǗ?Yc~ctoR1X=Ze_J~1}}Uzx {Jڶ/TΈ?S :*wkTԢE77_, 3>  ap; /][KU{+wmpp E3>iOkm`uwB8?wdy܄)/+Ãp϶? +[䩏]h0{8]v ^p+ՠ>~^g`Q_*:7.=΀<;cU/^0;a~s5jb=*"7. r}. / l|GtKhz?Q9L=arojD<x?7hwGn-9k:ܿ;3ؕ9!.qGlGN ˷Ҟ'4oBapu3ao=z݃I䛰?뙧F^ǐ RcG,n>8)CWr-8S;¥2fd6ϤHw[ }.,3Ux}ZjI =F#Ě`tAT; eKK#":O#1P6`Ҭf94p9^ 6stRfe* 2m#r'PĨKi%cBk=J6pDvss,4.oMN:(=k 1jH\NXDK>[hhy*,UQ8,CtιL6}.nfLY~FSS4P ƞ]rT 0̀`99b8a՞[a[/^퀼ݐOTO ͟>4C;#pu}x5ps];BV0_K?>?9T8+uywQq~KOIM_ps? s1g_gU޴_V_$V}_j9z vg0G.rʣ` wåw=xDkB a _YVSTt+zW z}})XBZb PUnfO J5/F'z9X+, Mf\oiTL2An 8 eC{#bMߡ wjkt^+W רܢ 92S!fQl9Vq)!gH4Jn$!$UJNP9]?$$&$T9B9]/Ƃh DkB.2'EE)”UD &UЏT`*fNm-[\ޣsA'gRsc+PR b5\2x)UdV4(Fs\edj"~U)i=b/"IsCi*j !S08+XS(sD.Li*kP @(o706Thb!H#т P=M+hQ Jf1j۬ % 6!2fxɅT]TCb$fY/"f%]&X VVQSI񠊗jd0Reg3:؊z;x#Ju?La&l}@*`/ "ZaR7\(LɅ#=R\ S@Xc'"O) I` jJ%{!6VbkD%HEmWjfA$!M%HI+dd(Qbktwx3Z4g2sS'qk+s&$PHDAbTbQc$lfTf$$ X."V0 dL_%GJR!SPAԂfhL`:83'r#R!dVD(BL+w;NŽ5oD կkx1͘7ǿ~k׾.`y`LbY_=G*_UjZ^| }n'<6<4~_| $|j](g ?|toSlgx|1l`* W7x5~߃F࣏ee|N?@..: X>P2\0Z>j&iF=?{osy3Nw"彜%"edZ,YȒ%kƵDii(Ikh;vMhZdY2qA1)Qx{?uH[ID] q5jlr2kxa?c`O_ A8ih5j?rZkAȟDnVqH+8PAcAk`Dtd :pQ@2K#= R'b6Q.էhgԨ82"5!B$ $ЪHoyDCEg@2ί#DQq#*կ3TpDR+p"xXy8T+՛ᴚ*EF*8.(zF4\⬰v=X`,V +A#li戤X^Ɏ o W{QZv;5` \F( YQ)ѯbV99y1fì3kp!&-[Kiu}lś9eV+x*f%j6(b4O2: -L h~v7K[-j}Z%EA5~5 xqG: > Zju\łPGš"U(վj6'kZƆΡqSEh1D6\<ԣ\9pUPG+: x~,;ǎ;}Qm8846*9n$Lu n#]* 8T,#GI '7̉ւAS|kzCuZCkR-BLZLQ**4Mx4sOk2Z]_x&9&%T5h, CPkƧ5r*ja1,U|2M%ep[zwv7<[06Mpள= F 7_>nE3C{-{-9؅7^ 68z}3<0l/+w=`sOoafiozlßt&4x|ny~ ls/>i-Gÿh"F}g`+xn-.?eS8io^;V*`z)ye&,y޼ D{f:m^_E' V 3x{:E)RJ${H,T R#ETF EuXSP(Rጊ'URWpZZ :L Z@U[]E @.P.)R+DZ1~](Ub&E{UMl,J Ī1(u4uҫV\$jO't"FW`4<-d X& v9'Sh<6f셊T3*Bv-Ujk?UT۾uc}ͪYK:<9@GRˇ(_T{i"5}BмtVCXW%iE#vd Pe'.eiI.YwBR%Z#"z]?pͪxW9K-G;F_ﷲ.шE:@;][ngB_N^V#r'N`5ĉZjE/q]ygZM T޿)+5.Z7\u}=9;\] *BU\9]ǺNRVNs-fRT BBF_mCo*H)xVTl2Հ N(8$;D)!)X(k(:R姠FZm eq`׮<EsEb%EF)lW).9UoYڽ ZXcuQZŚL;׽[m2Z<QI H@#UuֈIT*8k;tGA 28*ӏ=eЯW]?/O=4>sRh=Ιk֮u61x-.`@Vr)oToo&.y GS_v!Afé[}wY~e __8f:x)|P|r0^} ~N9Od/}n|<~ӊ?*l&|g3sq9 ?xߛWUEDI#h$yJPp:$Q|ƓC!TeFRIՒ#dI%P!LKɀk> 7d.0:XH-B&(^3 A(5y&wETF-ķl$++H*!Oj *ڂ4ú{ QmЈ nRQJQ)53OQ&xZ :)" do*MڜU0kWVjP@;c4Y! L[@I:qPR)8-Mji*Ʃ"%cEA([HŏqA8 -Z H .eR*8giAsaJ+ĢFuq8Klϵ@dʤEV\Aը3IjiYɓ#l[aZ hm IDATWg_T 1d̉"ަGi U 67r@&r(t(*8FVIUeJ:Aȝ]QJM[pRtB $%Һh66Z lNIvjC+MMZ)њ BƉؔL5v%2#怫$Q U*J GЍhM\iִH)Hhp֔'oR $8tW2h^g!"J PV|,8#jhhM#?b 'Sm'f*֖ zvϜz4HuԢqpY{G?J#ʯ~<|c㮻2W گ=ǎ_3,x9/}w]O}kW￟4|3'nc]o$qoisVJ朄X<:CS?+UYZ \x6o'? wK`8s nXF 4ֈ۰k_ ^zܩ9H_*Ŧ9ۧu7oWַw ~x'\^?®=xqxIx%,q 8{ /= Ysʻ03avMB</ѝ f?`6ȗarM`j2m K -=ke-]_Gڏr~b@ U\1:W3qZuJ5\6w:5ޙz%+uDM7JV"(VIzVK dhHZF(RXqWIu<b)Dq֞R20qBGu#JPwU4@U cTMJ6=}vlYxrp N-&7вq/ M\ J3ʂbNX:'z+kPY.1um]痄Ԗ0fFBTzjKHaԆ-*BLqm%fz %ӌңJM q8d8D]lr(>42KSF.1)UxU6!FVd4`R@]'犖3DV Mk"P#c%DŽ܊xuIna^:(AW4yB[ 4T%pH 2q6c8uy#D[RJ|ٟ}/_W{~7>rS^_~|S?vv{mN?`3gK/qpxȇ>ABkPXoo5ـasiz}ۍ>t' O:߁Op{Lk<[2;v>0.X9t4 'kfx쬉g'`0)xs#<8M#f/4x7 5cn82>>>=|QGGnvǽƁ~!~Ӈglzs^8" &6[l}.pW)RpƜG}Wyy'Sfq[ Lˇ XųNqKsʪ ҮQjF료~w8MbE$dUIĹn]5jVOe)Rf(T3m@O\\ !m)HJ#΂bTaw9&dV$2@)-5yFMO+)qp]KUZ3(WZp٩۵\b!B7(F l 1TP9b5Phڊ>|rA뒐ӮEAL!rF.gȓ|fò iô6eVO B%jQ7k]_h Nlo*I+ a)4|f5"% g@TM""ܪAS& u]YrT+Sc@EJخc3eeTiVCD <+0`#f##2d`+5u,'e"S7atQzr! EZ> hrb 0DHW&2ͺ2aBY8$r9̨ߠi}~7( U@ܔ%5=戗DIyڹ\K;B_!.X@&D"ж]Ǩ+.\ l):W$D&{jF!")1DoR#4P*CΤBz292Yӟy^~I9vSⴽE׶ri{9ytUG~?iG?5sם5t 7'??é{ ̜ܨ #llW[ig0޽%l 6w,1p}pۭi|I3pY. usf>/>W1Iؿ>l4ܦ"u9C ξ\҄zz,@P.ta{8^ pWX#~*%eYt /=mϤvco#^u,.7,< \TSx1{GhJ^&6 84Inҳ'4< όJPϬG >'cM/#.3SKLex˻9>g%,([W(Ǯz^9Am[JbLU!,=4a"N9{ /=G9L^- ơmvUmgKO '\ãfHǸZY|3aSwH pGO}Gsp=ۙxXq~RVK O?XU؞^ɓ' Gĉ9kzkyuַZ<7Lk Tu|#|[oˌED?BVKxY'79Xe}xN$߂{|~ &÷r.]6N> 7}}֥]8/`zt(?ixכ-כ ݧ3Spg}Μoh'pM cؾ>d]375Ӯ+em>\MsG݆>eӇ;e_}pU-w 8e81 ͰE8^%WZ lPc=ak/+߰j')+tyu*]SuWQp.3L8ʁ%'[k SBHLH9X`mڥqc%D脍~}!Bseɑ8Q%rbвQ=Vi$=M4]dOXDk&dxhĬ)Ӡ˕B%hfIFp0}RYO,#ӹ0i+IBS49rrl+\-:M22{,r lFCghBM9|Eh)^RBQ@f ъyS[ 8XqA*Ґ_/1[d&6=yEӏ~.oUHʉaRk8Nʴ!eB2gJSuŤ Z+ꒅ ^ &JUzEVD7+Cia22FVđL D!st!RG7'VzJ,tYRX USR*0ig06Ϥ+=RȎͲ$XrBfa▞M:8)R\Y"jJfGr@*ӆ) [mi;;Q ˰r 3 -cPVtE*L12=ye8^YLF)&T| poȫa7"eDJx7A^M qBupРCC4f4­_J:. + hp$rbZfímj+#FZp 825wH.&-M B $ǹs1a{xƔɟI9rJ_>^{Kd۵\.gI?s?jfGTDaް}c}};n ^I o/? !g; Sǿ|yx_WolůZo`𳖷q-6Mbi? 77gl -go{'6hm~a{pix`aw,pP2lNෟst\\Zz><9㻍fpix}߃&ЬSr<=6p'L[x W Lay1EylSp]z†=d'7Bs K&R/5N@~0E5B[ fb#qgv%%i:e4Ty4h'U#kl3!juU&JMRHFvW+ՍVGl~T͸Gvk /WʼkIճ}m`6*C.u!RhB,H^Uql9\)+ˈ*Q<:@g-2!*)Xv@ D]D;/HpEh;QbH2*7%rЉkhob`=98FEJWȴ(e;$ ]XI-F4+L<Z }[ QC)ZíC̲xQ4@+P 8_Ƞ_ՠ IDATFi_A Զ#q FH2F ˙F0Qp5PFSTȪиnYiBMiSq$f!u+JȠӺ6C^18揉_+yeA' UvNTS+[A:sˊ,SeL0L fgJeG \%<:1GhY^qBR&J  (W f%ܤ@,#OsqYJ =!Ֆք;PRUFtxqLB/38TP٪mHLH5!ғJp$Cp%*. 9}`$4J˜ $zªd4qnEi,1DFWBBM&F 3Ys9 fPeD9ra|Q@Lm&q]Y6VihQ@|ix) qv}RCBceB3 Ĝ)@%.= h0eWp|Tk5.UsQ\k;^Vn?׷s|ᇹ;x;{7 Xoo 'p]&vj/ϰdq 7_~.7ŧ݂!|埂; 8v=gl*rw{Ξ~߅cxu紵 b.ce+afszWGjze6¯>\~soӿ}[*-0QdW_ahTL|phZr//@W2kmsaA3k=l\ع s}\og]]غo,<{O{̧OO$&jhDYXaq`'J@F$#PȲ-S&%Jd7jv̧]{5b`" pUjoT},_[_MCx@lj?uY(ue4EӢjD$P`3G0B2Rz:ihDI- :4H.DL<]փT b(#}M@G$.S=h EaƎFVBSX60oW:CIMe@V"r)y s,CĎ;ƅDP d/m$[ vǚDڰb^Gz[ :ug}2GH]EusXD*#E(+C%$$'HDVg),$>)JK;KYHrٌ2GZzdD7)H(9F#RjcOWzVR2 x.JϨp`Z2`0:@{U5yG =iOQg1.Z0HvR*EzlQVM{ 2ҏ=6V*SO%#kRd8OINybA Yd-ײI9:cAޥyE.l`x$N'šqB2 A$$_;ڡ%"V :M g PG`TZY22rHjZΡD@F=UDFt _30]򂈈Gc#JE "#kz[ӷUՄ낲ω3! &ڡ\6eP=BG EItEeC=ycTB!L7`N%z֍o-~>~}OT*,<Ʉ],d5g؟1qب.n~;'qx󛉀%4˔x7`4#݂^,e5Pndχp-^pp#`5̮C{ V7j賰v~dH\3TC$ c|-az3 B*#ad*Ud*mְ#}IiNEdž^A`,68ǎ~)Pk diЦCzDCVRʂnuݔ(VT"F)cL(d4,3\H6=rZe.U$bpZhXQVc~8'[eĶhZYsiX ;jI2 O͵ؒ rv<˼s6h4J\j^ آMf-L0L4";ɴYɪ5Y NǺ [U VVdE"rykV2*-yV2Ade֑4Y0 \h"2p],f&ҵ<"론ՂS0"'n7a%r^K.+.l`'( 5/-2>0jiϓwlVRa'@N#N\p~2ӕ$49RY-zii5]X!kY)E-4JrfMAQXbb"AvmNsǩD6JC QA1W3bpF!` tɪ8Gps669AɢXb@'xB %<*Z𦕼ù"Ror>g(26%Cp5gG2aK2rjjZG6e/h]rH1f835Y`c)$[f(X~y0&F g " 4r e2c9PH] G`MXË)Fta@l,ՒY*c 'ąAEp / zbDkuЭ YXSZe,hJ=>e0wyfRVYˑ͌^*?G7Ɓc[=B^2[3oاҔ0a\nVSu mJBе2q HXs95 qE#н@n[jhZGGJϨ Zk0zG>M]yq?{Tvd#X%dg 4INRb˰߀8:pJBG':7H Sj^0/߃ HXso~'ѥ*ar'~o&qSitj~:<Jt|#)Sm&`4~<<(\y:yJ~Km?\N`:LI;K0Xބ]ظBU7!}sfxơR~ct5^mmp2c;Pil i< hXTH1n^k$ً\@Ge,yF!f`J#hbT64kK ." XR ra}[3< {fgvl ņC)/T Q e3}ղ,$Rͨ WF%pk a D'rA2̧YOJpjzac-ז"Ƭ y1N11%V BS38Yq4EÆxAݜEB;Ai1Yh%؈52*>CњU͆3)Y,*ɎLF(!TqVay/ oXi$pSD)SQ7M!: 8IϨ&/C$זY\8NQ7zt4s%CM9ˎ::1<,ux9gYKeAXm`tɵȠ2ZGͦ&jzQ+bJC%b}*Hjh3j Jj&>Z MB5LEX %Titm-G=[K0-5HSv恚ҚD;$J d>DN]=SW,=@/ x+2!8C!V>Fg;,&EEdlJX3_(,Ҷ 1PH,- ,d}dkeH\*22K桥 ,g7#2eX/ @ R!0 9#(r p+rZd~'胣_z|0Ef12ҜzShE(AՉ Jf1rh<8LRa*OfؙG,$NfCXǺ&dƨޱT`MzJC\360 aCPdH'Ч}`EC4 ramp= &buf=@G'"2zrJQ1HK4A K-%},=$BcgiD.޺ l {w(I_1)SxDKR;I'Ч"4q1\g?Peo!O}$y!҅_n[?:_| zoB$~2 璔%xc]xt>~|gw^{//2wLλ)<~=7pmsdB^|? $e6꫰$ݗ +~ .L7}T@& MO `EQV #s'/`8#X8&9k >G{JTÉ"$QxDAYw ([kѓ3h@)dt8?w%q>e#A;zq!$sB RDD K "2zFh $DL{ĠNpMPL@ң4 uG.Yc A0 AvLa;H#vŰ1?ro[֟ dHXoS^~|=8y\ Z:߸: (K7AsT2 oͷabѾ ^9h<\ʑ|W k۶HRw՗a||9+e_és1M4s/;o~ ~icxe.gF7oÓ/|&yJ.~/'|0`y=]FaN+ `螹KNݎw௥(m`*<㏁j2$[Pn&Ա6P5ŅߗPv gͩ^2@逈j-Q[n9wdy@Cu"7WMAE ]UCZb#P.#_EPHo Ki 2#V/#* Q" 2z, sfܜC"Q#$\ !PQzd)F0V?Pxc1jsT,;TkAX"-gddd=2BpD\FR(a+2f.#;v)=dk#v@F3p-"/N4B-C4/R$۽5mDnWxMt vH  NK(lD h,g]Z A{&`JA҅0-ƪ?E}G0GZ:(J򜀊ץJ*FDm< 8>"]k*Chh2B JKx_BDF`xsb A8\l){IliJ>ҏ h*0VM!A ta 㣦vcTd=X!mqd>^:1b dLF>thw \Ab.Xz DA#+2`r҃"mV  qx#}FBc/9Q hS9dmöv ɖZu>,G>, # x)N3oJ|T+6Ub扝0sּK湠9)ZQHjr(a-$eeGz( dKh57 "ĻjF3o50` `Yt= #EPh&Be T"Lj9%Rh:gc .c=p笊KQJX  pl瞬X8>G9ƣCK6" IDATijr XJI0q( ql1΁VhPbaE [ 61 & ; i":@f3D'xPt2qh3d>P$킺((W\Ce* '-cPʀ׌GB EtR d5J W+VDo_ϻ OYI zASAdS]=C/C%F.H+: c8ꎝQep-A&-[쿃ZƸPs Y{{Si0bx?ҧи?yM(lhJ)3"bOЇo,l]}o"P흃WpxNN8> } 7၇ᑇRge{8 BWĥ[[7x[/O ?8ޅpa ^p4OG_ K"ط{6| A Cf}0_o\],XW˨i8<g_w-Bvΐ>'A0툪,mpߡ^fk\RubƁ 0{7(<0[Ҿ[h~stϡ,*vNx6Y73^x^T|1K櫄ghOlLx x0o lƹ;zeMt`+|q6/2w0yެnhĹYǬup Of&R7Ǽ=5eyfg4;b~? ܰ|QklTϥC7u7sIvp[sݝVkG9OT+^r=(g?S_E>w93繶-.5q?2UptpƯcAǵSx}JP+'. άDwņoRT/Y+TۨT<_a"瑯<`/6+uC\SO]2++p߻ fY16^sW9/{hO.r>G^xӣ 3 p4| =g9xӹg戍3Rb)ȯ^|pɒ˗bWgX=XrikCϡ7y}^}=+;yn3|׉}eڿ-}rxg7y-0v |d}GFg ]o<-O.rfRƠc~V7|*}O-ݲӳ/Uw o=IL|O-E+˂ɨΚPos0[7G b?0~a߭([Hn\O9<qa5>9FƄw>{\6͞7yDlpVL{9%۴ۧl gK܃GR_ə?pָNomrr"9;n38ۭ9,yǪ۷S7ҕ;j҄ki^a1OE˿7+G43x?xԡ_9<%8>Jr)Wa/#B^l? onT> yP> 7RŚgֽk} C az$l_s! [9 ^w:H䩈cG ]\95 ͺ?U;yw|#[Ӗm,٧bW7?R#]dv9J8l `)*o׎Kakbl}xIaNmv;@U o<{y=hb' _⎋ !q^9Dl3avUt51ZT/v !j]s,V<)\s 7(VEyov?pɱˬ~ѱ3E$.(v ryY  N8Z]dr}0? *ylq\/1}X8v2lP|>eovG\Fޜ{?(YYut*ĨGǜxwGr3x(oѬ+q%!a&*ƋkOA 1DbGDŽ)*"n!vrnYmQ h N"9=̎w8DBtwȵm"YӅud$wLEm{Cf !SͶ&urc|˨v U,.]7Nɉ=7oq|3PU湽 o5ƚב=5SuI@՘ P#5*o}dNqs6/ v 3-RGL8qie#ǵ%.1&y>4ec*]O6l(6Ä~_Mܘ@7 3!`uqF1'S\p7,툙úmcpYL̻ GUAg;! rP@X;stH #ksn ).=8%w$%ϯ*~-xXR,-¢GdT"|gS21$#%Amc<[04ocKzd`Lq9N?OӸ3Î>:EN衵+%]Ԅu"ܐ3 *^BIUe>Xx|~}Ic9h&PN%v%-P\~cT@_X#/:L[3[:vKs㉠gȳ=z1gpRfԓstćnv-F\0xz5kYLJOXw ^sLH~UQR\L#k##=4:(P?S! /ѳ3zV9Euz*QWTh|goR3j.oë>z O,{9W)?H/4E W~[;W[Ň_,ۜs8Dm*Iw"e3sAUq4TKG}<4XUf©\^F{uz e9T8pyCj1I߹ '7Zpi1t='oL#c <U8x~aUe<P>p~o7"uzpa`Z.? <%ބ݇%M+>)^}4cMpB5}q-ӷdVGV>ҼLo>ݠ)]SOZ}[FtB/Yׄ!SzF-L29=CL\_@`1Kd ErBIdHQ#LIy@,d'd*FP %I-"FjX'\As'wYnP&eƫLe,cGF& .mOn5*7>+B=%2(pHDBFDFUB I*㐑̔H@V%II1#GȡƫD@L8IR Gt)Rѹ}Wd !JhI"(yJ`*Qc@#xP֞Ib6t1 F%ѫI٘$)qSV`&'E$D"0(S!dg1G0J RIt&K0)aR)@'mI'@#)@bEΈ 1JftHLbϨY,רH(p";ET@*HT- cBǧOYh.DhDϔ#=3RTjar8!Ș0FV rH@RN!$*[+Q cM΂) jQ:V)=y 1(ȝ Y"s. zG Qb)3Z$ 2!DN%RI2!*HSTeX12"ƀ4uȾPГ@EM%*L29R*kԄZ!EKb(ź%AaiR؄Q#4t D'!K(?nP0ԒzTђbI3YQ'Ee" /]?C(i,"wc(Xi2g&O#A'Thb a4 TbBdO %"J-$n8}៥@V$l/_kePճNl@B9GoB*X黼ǟa4"T[ Ay8Mo^(|w/a~w Cw b ~N|.;ŋrIz mxGuϖ0diD79<|~f)ܓ_-g oeKV#opxo _- LoӷqE>EiSH}V|Lj"eԟDK6d2)drhԀM2kf<5- \"3=&NP3z{m+\ӚQYyN++c` D.ey,FzEzD&?I?D猐Be]s{'i2F!]B4TB0g'bdŒB#)wjq _  +lj'FJFjӐMC/%̎,"s9ԂO C^U+DC#rL5-SEGT;iA,R#-=3Lʐ=JTZ`Z$ҵCX+Ä ~E+NlPU`1Ȍ3=#6 IDATUgHWC!U!EXOaFثrpmfo`?! q>+5Fb.L~@$-~N"cĘl,F.Jˆi"#4tqdBդh]@LQ:b-ڊF7A%[8D; HS7h*b砋ThCej`>D $R(L]Ac0xr5,¥N| jto%+k`Bd ү:Y%%PrbJ1P;59,mZaϐc ׸Le#2$DA2hGtG~0LvX 8YLأ+ ψ| atE]kRL8S([W'"MUcC`Ld$!&K&F"=qr'! Jsg4 9@3(vPx"oYn=ۣ5b`Ĺ MԘ"Pm܆(v4&ГvH2-lۚ0qϑd Y&-FYȱgHa5P!#=!B6&ԱEԤ`I}S80iF4mG6㈚\ e#rHdKhZdȘ 2Di ???Z3dzzV~j0 bm? CX%wb r0^< L;>ǞCs ]8XTW^_{.ȹ,n. *;*:fi"$s*͏j /8 ? >#rV5+oȬan@}kw`u>58Qxfr䡀X>{ŗFV?wV{F!\RS㾃Ƚ{ `#>, .Q~qhu [6.|{o˄nR:%8EC- <"+%fv0:MBUM$Q 2G+05M)«1 &3Q(S1+%+i*F!q9!A'QKTUaCBˌ3C"Yf!و:Xȃ 1dƒBT i$&i@!]DnrBD҃M(![>Xkܼ%7{L_bhH]+dT.$"9#d@k͌HTD]Qɮ8UB(V"FFAT;T1T$*IdCawd!RSKM2H4$$%u[C8SM,SEapfD LH"ŘFBDdTNp"@4Tᒦ3R$e$p1L,V"v`Gf֠XXA+Ґ#T´SK8U1dVHyɉRH Z#t"ljdC63DhReJB-Htcb UẗѲ-T# r垛He6LFj .s @m$F ( LE,#B 4  CI"!1TA£QpWD 3K88aɽL[gUx #ʕ{5Vd1T11,M*J|x#YR&iM& j`6*KD"i3(RTIr]sy֐ hK+sV.JvNrf{3d$*M F0I5.9mHFBc`Jj$՚ML%UD6;r=sB6l@=>k5d;BqT1c'h$F"r&>{IvLyOe2 бC{)%,O5 9CU[7kb1PY=or*MX2AwoZXSOeeK0~PUYdBN_exٻ~_]? cD\wބtrwWcί+|7чy*v~UsAeA߇Y o?~N[b_| v'A-=%NGFmк p!bo  M>'.Ҍ,nzQ}f OJQxV?ڧ ?7+` UƐHo B l@6eMPR"Ԝ\glq`nk0q@l'*/fld](58:9|q7z1hzL#Iy L"%^ ۑ% O]9sl=1̐U`["9"9g" *kP̶ 6|boAuEE z¶ZhvBёpifcBcv^g A2M &cy lQ_{D25R ;aKK X-ho [õj˺|KvG(V`L2+8s:*#p4ɗ[A\f{γ b=5+Ǯ5c=*V:b<8`X젭3YDX$~; 1uq=^8jG*Ɗz`%Zi쁦 šA厰,aR#"qiB YD %:2NfT ~nZiF >G5G aqq`T2P.c褣R#E^N$'P&u=$}#%, NH]bF AqcV\#Gzl ݎ@lZT8Ԑ)ipԇ+Deq,t{C\4eb#zVW!jh=Da]\~yA#.:66ĂQ2.ip.aoDW/9cs9l8ILpl?y5,ć<1rW?nheguNa;86d?:}%U#%*(&;qOJJN01"r@'tMj9x?zBN ‴!n2j㨆mirԒXqB4@,&^f5r8bIGun|E,\,3W$R]}KvٺyoGgg' ЗUOð-󓏔 E]ht_|ס}4\| m <,u +?Y꯽^o&\^8Vh/ 7߁'/ \ KӰhAɲ)ܗKV?.{o 7mP+s~830ٺH?q8_I` ܯ2 h=7p ȵk`lوm>k衽 n ͧaFi*(mY(Y HOxS#+*;Հ225@"\B;E8xHeuS*T"?ӊwfxcrY8%l ^RA<@x!'w}Eb%i>0{Ety@k״5~|c׏7o65P'?> f(328}dbё^$~NB!tOS?9-U޹0Mԡws*7GDH7`4@A\x\$wZ:Qz$ j l If $W}tX aM7:T Z$HA-#.qE#Dp^Ή0,JB?I` cB^A$Zѐ H r{ AA8a?Zc3qgaTk2-v9 l>&qoH_*(2[;ďK% OMOW+c(/}OCsU/oɷ/jt+1QtZQi ǁx-0$a&AZFfK 2qx%pg5ẒVT #H*D5rw^!=^\`&]JG?G>g o֤{2,EF]fֈg\GmLW./ef5V ǠWxW}Tr$<'N4agI,G^44.sanDh A[Z>jDǙVӾ2$l@^Qz"tLc4!y@&b_ILVR+din{ +ҕ |Fb_QWT='H3y+F=5kV/(ՌӜꃞi3Eo>kꅌ qF@jkT=2q-^/vL xd_jڻ&Dlvjϸlz%!6`܀ɰ ɘjDɈ1}U\G QjO:x3˶ $+9^ w$BVEbziDtIN 2+DwoO KsKeq_+7U܁-YdOa7^,^~<)rgJb; DٮrȿrgӒ,u5xO![(,ܺ < |E?? /><_˷%Onq v%jgq}%w~r=bDĿG%&mX(5Y63êD}N~6ra\lDz/[`ER>zhh^/SA$j/'QU5-1OȔCr_d:: $IfZYlڣI*c뀖K"U{$7^"m"v dD1Hq)4.%Voٱ=)+L1ae{[#uj$4cճ; u$v=JtFu$kdhh4 ǘ (QD&:IFq"}uJVѡRjȄ7f6$4aJ*`R Y/:0œ@ h6GD"*P5b҈0ufx)Vmaħ+PC%1ސv{tPBN`ZEB`FAFv!sMqB")g{HVa",@{*񣦛at`DܩHDmhG'gz,wfPab!#ԁw%y)i0ўG(ْ1v>b6POYAԒieQ* 9I$J tb,ޒE9,彼K5"#Jvmڰ;N:GNu8rML x_nQ̆+D_R ~w,>"fm-|!ѵ)\@(O"y'qr$NFI.NGzgݜzph1Q4G`X;26Xf)1^*^e#mN>K x!n" %0@v[ 3!0TПof&qLv{ tαI GI Syv;n#2xgj3uؘ_j DŽJ`+H8`-9=&<\HR+tH%%U|{ ' 0964/Mˮ/f-iXO_w@S./pwL_8\ ^\c/ ouǟo@Y?.F,S]OO way [x*S/_+2BslxП>~[6zboeSt|^(2f7`q { ꅲ17ː&'ѫ}\g^`2n 0EO'_IՆVΝ|݂㩥?Wkv!WCnFfy#7>C+kA zyɰABKvkŃ-.9su1Rs @Kn[S 'AD8ڮ@˚mZr,fd3DÑcjhlA=ȡd>gũJDo#q0,<'fpP J23#;_rK+ܲ>8lS2 3i%٫"v\ Ŗj,+BR<ǀ3p|(!߭:}3 HZO5eV'V3]8!H6N0[lwLyd+|N=ݣ;g{bRLL\5-//9;[3фRKTgnَ5C%sFsfÜ$+1햴G3W4e47#ēO̲u6 G|]^2M=y;-ɎN:^it? Iа b>}gŇVLJ,ոgNI.cb[v#jIcz;" 7l2̲b[s6pX+V4cN\2r[1p?tQd'Fqq_u^T&*Vk.x`+.0R3NM0 ьqW8AFaoxB/b;$iCuC|hkHvBnj䊘=POXYO]%%m# G9י v:%Z\ݱ]`Ơ[th(*h6bɘDWO=.;Jq-lάfiJRx̌,REJ|)-cm#[OI=G0o7?2g A` }>`;p*ƌ~߄LW xFB;8]=?~ߐ~r.Co5x  = /^1Xu%Ƿ`ͧ@KcmK_?=R-}Ypz 9֠ڥp58 l}? 8~CAv`!?U(?\G">|nU cXI{;fs"7L)rZ!dqH0 $&u2ɮ}hӌZF'x<>Q1TcN3.Vֆ#݃b* !NKi %-,l<&\+NId{wqDULr-\/<ۖʼnƝ<ܐVf_Ɔ놬"[*G~S[27:zx>ʈyn˃q`yn)[rEKzj,W(0DsW5 8߰x%~"{;>$G>p5fr^򹔈27暷K^0r83:jX<#Sqón\u&JnDɧFk}d3:rgl)~d&5_a\(*x<3>l'%v׏<9+I=͸-xZyjQtÃ9WڢT%x&x&Jrs$)^ ?1oƟ#j֌me;= \=zYLg=|ؿL֣-l~TA\)Э ט-s`K\f%Wz'vleVqHP'ˇՈröKV傧9 |x˵ wS/ͱfi [?THG/Q/1S-4<(,H !]f}g= K.]@9x$;,D$ y.a%g\xjYtqˬm򗮌U7gS],{WwU+fP=$JhR1eo=f+@6="inc@Zp~!ÏSU5un6µ)95nSK_ٟ|?dːuG{j1b=.{x9G`NLo0YxK;oO~sJ{t1I=''{ e,b]8ćX,+oS 7_?ܿ ^ .N^g ckw L/_ =x? o} _+@߂מ4*۷`=uxA2C18}<e`99C8l|k_a͝Bo 2!(>^44E/ dρ3X"3;R>_pGCBz:wJw&O:x=F1M_2FnM|Ά Plc*@ GKzMWOa00y&]FvKsClgl}|J/6ɫ/tE i!N6^uQ u)l4_>@&K GSh(TJњn>hg+cZƊ5y2$=e{g,+85A5;tKⶤK1urk;39#{u(GzƸ[sc5/ټpvٹ~O{cYjYjQ]Pͫt][Ƙ~kIkl-Z[r,WyABenݷӇ~\<էVCъo4&.pDO 2![zh6ooxJ8 !mI1zS #÷]]2VQ#15~|v\[p.37ND:;WwC>yZD/ay6rtIn礝 -9}]ɾ(N6A9I Il@j&k{rN;TgL M90s~:60RI`GsQ7&]=~bvp-H/B+(s7Ih6QYbfGKgIjhPF KxD(84s333''~b%-%4\!d[\+oGGB8c:٥?Y3l@͎ՌX֛oq?B1|ӿΏ_m'}~6[;ܻZvv< w{~šu~/Eػ,{7~:E_^ OÝuø?1B=u ^z_?|]}_!oAyL^Xopp /÷ g{V!tpƹԵat(;?>Mɯ~W`x߁`ut4- g/ %wxn`J9%lwޠrܨ&ξb{p+[UvaІ $&|emȨU,BAKɻF;0jR;81ܗc>̧(̇1|3'3D{#f&;fcG$_3Yn=Yi Q!;>c3Ehgd4eD)*bX(y r"34c"w=u@W eyЇN$f񈱐d@f"FQC':޳{'G{QILԬAGȊeV0L6/=07c.+5F7) OʮɓGy%*bM;ˡhX?a(-ݦcQuz_/}LՔҢZ)f+!-Hz~Hx&SK'Z]+S\"D#b!3C|Aԉ,B6kp}Fȱgd,eJ>˻3Nږ*9iN$,# b+{t4䇒2@2|1hȆIZDH5bcD%݅ ǁ|~uD{~gfFJd ~'Iv3SϩqS7\I䫑CϭE $It,V:A&"Ix V*DVv5F.譡u!s!B7 fˆn8 ,,R'kr>l {zByV|̖{gFL$LM w:K fvS;ӆSYWlUsqyg9юq^S͚ߚ j9+HSte>6\8+h֊;~^( QlLY# M\{xFEP[V#V_1nt5Y@kCG\ng|_ y1+f5W&yX%F֬).QYb@ d'hCOu0\ǁl٤&&:/MDDGF7Pu=sxfbHy]PƝ-=/?臨ce+e=YQ-xz#cko OFԓg@`f/ _RCycXA Y (&èC"+` xnv {܁_ c}/#o<lc߇$9|yhУh |+)FNlљ# qiS)S[&J( D\G1yeW`RHt?^ H"53dq080uv Cb1gΖ 4_Tb'?'Ó>I=?M /<x+5s

Transmit SSTV Window
txwidget1.png

The TX progress-bar indicates the progress of the transmission.

Menu toolbar:

  • start.png
    start transmitting images
  • stop.png
    stop transmitting images
  • tone.png
    sends a repeater tone of 1750 Hz
  • fileopen.png
    loads a file in the transmit window
  • edit.png
    opens the image editor
  • camera.png
    takes a snapshot if there is a camera installed that is supported by v4l2
  • binary.png
    only used in DRM mode
  • doubletone.png
    let you select frequency and duration of a tone to send
  • sweep.png
    let you select the sweep frequencies and duration to send
  • hybrid_dis_checkbox.png
    This check-box is disabled in SSTV mode
  • refreshbutton.png
    You can refresh the content of the replay image by clicking the Refresh button (e.g. when you have loaded a new image in the preview image window).
  • Select the transmission mode (Martin 1, Scottie etc.).

  • Select CW if you want to append a morse message after the image (the message is set in Options->Configuration->CW) .
  • If the VOX check-box is set a tone will be sent before the actual image is sent so that you can use the VOX on your transceiver (if you do not have PTT control).
  • Select the template (or none) you want as an overlay (see Gallery). Only the templates that are in the Gallery will be available.

The text inputs correspond to the following macros:

  • TO: %c - call of the contacted station
  • RSV %r - RSV (radio-strength-video best is 595)
  • Op: %o - name of the operator of the contacted station
  • x %x - comment1
  • y %y - comment2
  • z %z - comment3
    see also Editor
  • The last received image is displayed at the bottom right. It will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also Editor
    Right clicking on this image also allows you to load other images for insertion. Use the refresh button to update the main window if necessary.
qsstv_9.2.6/qsstv/documentation/manual/manual/txwidget1.png0000664000175000017500000121045713203343735022660 0ustar jomajomaPNG  IHDR[sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw|TU߽2HcAD,]Zk_u]]]; vEj vy3&32s;73\L?Fմ]!B!h%KWho!fuh_óukpQ6"~k޳Qջvܿ9uҴwZw^_MTXChBZJ7,Ysx[ix:NZU5-Fȟ&5RxC3A~Yx&PMnM1AyPk:NW8ob=<(B5r@}5m/:Ba~II u&eA"x<.U^!B!DVZ#ɓ&ѪU:ecY6mn\.Ka^':CsR˥3~ڵĶk'?Hz*'a֫s1Jl leh]ߓ|.A^ZZ$IM~C0 QJ9ɐ$.EFF:>uD .VV0<0?~e`GB_&<\wZTJVVVsNyT9 â>鯷;''裸$PiIK1cr2qXqŎƸGcY6/Y뉿H pU +8nD>pIc(fI<)eli{)'774MNlD `9Ss[WX "+ه,}r:'vHfHGo6yP(l߷7e Џ.^x! !dA辂*cKJ|ͷ6Ç70zrRS+- > ~dfŲU4mv uR: Ӵw]lݺ?iXkzݲB! l,ӦCV eŷ|z!m&+9s(gpVV{B!خSW>[aKtEiŤ~l`o5;oƢ |?LY^~iXNw-x:x %%ɬPa2bVbAZٻd?JAΞ$'cۊ?=8BFΘQ#ؼ%>8e%$%|mY|>2b;v"+We ,\[n~Cr?ooPJ&@0>;!fdn ô!z۶_!B!8LhhضErRLKTl4 2IJLĶmP`IIID"*u*X"1^mYaP tr$y{!gvMb1AZ vi!Ƕ6y˥ѥ+ס.Ǫ]уnZEŴi݊v3((,rC8?}4N=e:3O叿 7}fN^k~Eyy9Æ G ؟|ER1&%zyݬKݳGcon^4zFIi $&:s^KJk, F2d0W^>M& !Bq8PZ4 Ո4eVԺϸqc⽨W|XiFV:}X=Nʈ'vQ}R =g|Ņ3.,)h`:SqcYiӳ;p8z0 |wMNrl޲6[q/GB.|_[0LzAQQ ;w>gt>#Vt%}U+>8+gg*4M#,zs:d |2ۊd' ݹ+tFٵ;]׫7L>}zsUgD"d7}5e!B!OK Pi:'GE !$PMs c#0!q_k9|C G?WZZ7&!p3۷W7or u>_kPy3}ql gzjk ǷPZ Pr?<,XAqe`B|^w su}{1KIOT!BÅR6ѩyʫjNii)JGuKLghL ޓiVtMGCC]Xbƶ^M&XǏf/BGs˸w2}SYu0z9SIO`Ϟ<o.(x=^l[Ѯ]{%%%ΰ];wrϡQXK:%:.][hݦ2 Ͻ0HĨFlF]ص;MDV? Dg՚/7=4tTon+Wao3}q᧬\DQeթc,t$B!ArGR˲4]qjIeU$n\ܺ Z=εKaU56MVx<47hƏQ^^8 ?=z 0-oz#Kwxٹs;$E [><-^RF:20L v.|Lq3L6-yea,F5RlwIIMx\*]ep$_|[(l8]^Jٿ|B!BG)p\zqz/u W kvzAKٶ5$teQ ?&8ض{5 4ٸa#D?.32PZ=Btfݟv9zJXv ˰INIŒkK$b8I4&11vӳgOڴiݳ͛7K PB= 6"nN},B!-raE53Zq R'/ұ-͛px׈dޮTe/ ScJ4I!KBלѝ1hRv+PJSֿB!BT  C0LZ^4KUi+E$ƲYY9%e,v܅m$h^p81+0EbXXDI*a_>iƒRׁB!B!(xz^ $ LrJ hR6Pry}xxYy[[)  JRr>ϹD"S\\vE{H_0 0=eL6HmJmͦEA?+d .#tMrRKR!B!hNq0 LĎNj*D{5}l/(\өǹ9.WIlkkauzt]C]x<0ˍCw(Hc/S^˹e2NAb2:zx'PƲlPdRIJB!%lvjўnB!B#+B!ٸVsC!B!̙'܍B!B%IB!Bf#IB!Bf#IB!Bf#IB!BfsP75W\ ey2ӧ` ݌+pus7C!B!iRRӭ#}L4Y`n>ma3q$ƙ͒KoϞ=\l[ֽۡj9s|U֏Z |WiqJ)y݌5QCps()) !B!y|UiT7p v9/!| WZx1V~%]emcs{D[',^9}.)l޴ԔnB!:w5+pU=xC7x< ]yg{ܥ33s%OOqѓ5t t:K>_];a NeYL|?nm۸K;|b_,]'0nF Ͻ@qQ1\p)N S(((8Z}Œ'3c5af 8eL1'r jJJJz=$%'rݧw}cxmmqW1n ?__2m۶ǟ;?OB!B%MQ?jBau߭Og{oSϱa:vHl9f$}=[leeaW+װw^:vgK>%rqa'|2N=T5ҷ_^ko}y|n݊ϗ/OߧUV8cUUNݳ}/Ͽ.Y@iI ޘWeP8Dnn._YʂھO?1‹ϿD02y֫|f)<9w`{oOXnϾ4V-aQ\{ C$B!PROXj KW-Kε[RN>se} $0vX +,֭s8ܳعc{sץKgzIv6ΚUk(,}xX-fs/iav]k=D?];}/11ٯwϗq3ǢsYӦm4M#!!!-##4< }(^i\.f]egw$B!8p4,+pHۿwfUzKWXAkra+(j,S$$D"ݓy+pgӏ2hPYy~Uڹ}bicǍe츱\zᯘ|lۮVC$B!z^JKJ?qs_{ݻsطoAՁ=?_vl߁a|܋\ur9sPJMYFкM+).*& aYV|̶t҅Wf91vԴT.w85c#oXl9, K0/5"yX^fA^){k6۲a6EEx7w0b⤉R\Tڵ}7iӶ ۷;?OB!B!){x}\< 6og_@ dࠁ<5 7]ξz|xMة#]r!ӧU񺛹ޣ;y:۱O_]t:#8ҡC{NIMMe/ӦmF7U0_#GpwvlXܽ{ILLbډ83pl޴N=`(E\3Na ?]G:C4N8C$B!ihƏQsyqxMߏ /ҬbݔzM|<zj!B!3O> B!B!)B!BѲHOB!Bf%IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bf#IB!Bfn`9|]FsPx<^v$9B!s?~ As_4$@~a._In0t2)IhhݬP!{WȁiB!h#UfFr sZd}-pLg~3ϤMz[gr]Jb*[V_2cF+=B!BIi("{aY֡h!rh֖M`ݖu mhMڤO#9lN!BqkTRZ\Z)3}#ɟ|uȔصw__M؝C&P(ud&hзk^[0>nB!]-XuCz #5˶ GNyg޴NobRRQn2J)RR1a{k:wCS!B!c.[wT8{:"5)P$t*ZJصwa-na};wٻз[nB!t հt_q#ŰM,X#h2;ºئ,AkmsXܭ~ysF!Bq\F$ea#"SM} 0vEB!9IiXy@cW^=W_y5C 嗗ĎH9s'BqinBh(n;H%8WT mBGmc7SB-{;#?| ]oxbQzYnz' IDATib6^}GbbAiGco@)e;M6 PMN<,v&%%O?lD??T*ΝB!p\kV-R>,>\/<c?^ktΈZ}m{ )[li/3~i3OG)9g#wx~G3 ǓO[c={v^禿7߅m[,t1O~6'Na2E4/ ;mL4Vb˗.c'_Wk{(*[y(.Ho71'kBΞx9MP tJ޽زy+#G9=/pR##}0L@cdgoxC۶(+-e 13Ҙ3%u8y)~cuW_۹q㏜wѹ|]~}/</]m[ضEV;!B!~Id@)9o[RR\ӧ0_c6+$bBa}'2V(xx#l]~m^E_X[ ^Md8~iU0vdT{xu-EE\ ЩCmB!B ď%zɖ#ZtzؿҾx B!Bq\Б92zϠ#^!B!DD:Zf/[SUIJIp%)B!r]$ TIΎ4H9GBb-B!ϝїi*~M긔"vtG9<A!B-tkm`n'H;s?~ BQ'CVf'wH?#DҨ s&5²n!U*=bϟB!DKU(ݹXSFCیn-F:(CMΝB!OKu2RZO&U;VI#S!1TÅihZt9Ԕ  ,gݖ؝ È4k[</Ym;@!Z(MyHKIY;FEp6beń"ڨo)i$&$JDb*YrR|u7Zr&%ѹϠs| x˭7_wp˭7ooIFBG=Te&FTگWPJaDXuCz #5˶ G5Mr^{:-_o\о#T!p ƴ,7Ѷ ^]\G_2[[)\Lvxoe;s tKDtR7--: ]s>`Wx%PMyOΊž?ü9'yaMo|~)݇KvncPG!l1r#Ǔxe7nc\"F tԡx((+`+ߏ m Mrض"9%Jlݶ;o+MH.cĴjCly+BD-=?֙m٪QbZq쭯C,RR EBc9Io݁][ۭI!D䅎lF)IM[`q}ahtfJaQt.R-{2ymϿ-9tFsV.4߂7w<ʎ^f)kCb'Qu~Q\o}|M ӏǣ輮/rJXEټȮU(3DަͻK0S-ĉX}'zu͏ק"B,]{sٝ[,mҫwO\zϠB!| D,Žj JhծJ%WXgi:q3(9 xx~!I>5PЬ <4 b5M XɱR<$p*s}mIIiYl-%uKMJoAƢ-=4uXZ|!I|Y5(-4ڮÈY6 _.$eiBGC+╅Ŭqi4̃ǭQtpN&x5ӏNzT/?يx=xī p9`XIРՈV O`u!G9_Mj7}69ۆ0LiѢ6<ݑ+ ٓ8~xD -=w޷n]O4 7^#JaOP{({"3~Cm w2]k"ƏiD" 0 "ia . O+iii(D"eY(N6n+!Att+:=4V|mm۶`۶mt%e]ƣfj?7B LI]5^|9nF<ӛnطm_>UsSZ,]-Ύm iMϞ=-KAA}ܹ͛3My$wUjD+ǶTC8o q$ό@s:GUT]q5~ŗ;)((]v/6r.074Ci.f!G<!ϛπ%?~?g(b^d?Q1#{.R\9D?6ɶ{ss鐙\o׿OgfΪEh,:Mv0{")fnK`+iUϲ)))! {JMӌcǎqxH$itڕT B]%^lb $zQ*^^9^=x8ՆGs.gɲ8p ۷o'--_(:s/"t ~; lnv p,^tVkvKY5.⋕̺wΗ8J1d.>c<#$$&:}*x^VXͬK~埒^1$՗_㱇R-/QBѼ6mSTf9$9%?3`YI$HJ&{f "$'/߄x{v3ij*_ut7GE?[iҾf(xaGѫ%(5spmkM6'ߕuWao0$ybFsezolߑ x;c2{hxT9cWfj1*C|7`&eAl3  {nxfo_^ן@ @>}@(zXWj鵌FնnUyc&O\-1_p51e#=-\]eZ .:ݑvc۱{Nqsv`l$-VXʈʮ7^k=.-+Ų,ZjR: B>/I΀ԡK. WV6[u.r٫=p8̇}ĬyGPR\̅?OreWs˟=9{(+-=5 ˴xG(-.3 !h^M$PyŊ6)0ڢ22ʿ{ /o|<Óy /]G}H PN~ӣ_vOE}򊻕fL4"]qL>YzkIsJvOi}V\I B\p~NK/_1Mw{ݬZ˗m6rssٰa ]~=˗/gڵxJ Q{, ĴMLۊ{4mK!Mz'^L,fq3M!b´sZҵ ~;GrM7;g7 gNRR#GuzwO{ͬO2r(^~e&3?ŋC擅Ykg}7p{e5tҙ^z;T}sJcU.3ry9gXrk[?{&Gu&zWչ''I1Aa:G6]^{λI؀mA( Pi$hr:3=ݓ%fB!:Tw1ܥPݾcٿ[Tu?*o =Uy;}Mkb?,fn`aCs n G[>!JjRYH5I[NN ظ?&5h{L"Ƨn(yBUL)M1زu+ fԑ4TN\ƌ Lח8ėȤK_)_ 'q*@pJI')Ͳk.I̜7pU軃 ::ӨPu.]گO)@uu5 Iee.[eF>p8qb>ڳo.͛a|~c;Rhk0s!1svoy9Fiں ͬs F9 ּs|jnm,[~!+V.g\yUyٛw\~6n߿}ÖKA09Tس=_{׷N.㦛oud\q|eYDJœp~g'5U+-B;>r<.~Ms"H 3e}C{7zݝ,#iAf Uމiyipᕗq?_g}lD*s+tu 7s"ڎ۔UYĠ5 h=.-mq|M0@ֈ/\='^^G9-zc'~_B׾wT6nw9JZ8NP8Wi:.x|w$bC;'ZBt0dYR]]]̚5_y}k)r: ~` CGR`Ac۹GP ݧ4e]~iACCH=`3fΠ6‘Az[&:;:~8>C=?ϱ`)3}'&~X> XP(S<r?~ph4:)Bǫh( BUfo\}5_vul2Ԅ%!H)PԋsU5|_rk[;7s C]{'>1ŲSK [e(5SK{šեա!ٙ"ՙh:^i* &֚C'eSW~g: ,Kf!7ͅ%5T]I~ 48֘ raO7K<@{{;MMML&Ys٥~(]]]+q4,f4o;BÍ;-o<RwR04i %%%XU*hllgPRYYIcc#194l. #=VzSֺ(3:ztLjʃ~9r|v܉cҳnW=J8k=。~w|>Z"%҂fJuo*??/knEgćqwﺖxi^J'ؽWNnO!_ƍYtio6KII)^D"x<(¶ o?S|ᕻx,h.,ewx2Ts܁>0l/0zlpِT]]ʏJj&>{0`ڴigԩ߿M6Ip: חqv:^GUܼZ\0`v;eOk˳mі+KY:+ݶ7 y{Pz)V[pC_Oўlijijj^`ܹx<lDFs%l{ p$}W>|t3 ɔNα#D! #Lvir++++Gi&糡^w{Ι3ymmm~`o{CC ziE7 [^KCm\zz\5Ko_}?yvY>8mC>&L<}i?xS_?hY[ۃ.멗BQ$3͞Y23͖-Lo}.BrALxp9 x,wR\y}2Ҽs/=@ }&e4!bD\(h՞ű *C.ˬr*A%38T!q-93͂L|h\d~~u1U28gVSR?ow9p0?XyEA1|>~eYhz>mmmڵ)S`&8tVLӤwDx<)*Os t4.f=)KYL_|˲3g L&5V\rΓ| p]4DH~W0'gۊ1Hy@Nh"nc(wBu=Egj;:Έkw hASlA0a@Y,H=:|]U4`Hp\ڧ۸mu/^X ƶM2\Й͚d鴃m[AY/lw 1DyM*cfBu9/;]Xڠ]~_.,e?+//&G-ضR ǃixmcz&۶immd{ғF9Ǻ56VоmypSn=pO"$zS7uc0q(y S:VcBW4^ ŖL+cbU L_Kkͱ,;y\}f'Skӎ -y9.A*@D`Cϙ^ie`?&{<e8^N뼹 Q w 5%Tf4׍'3v$Yt*N^Fdj:o~c`eլZx شucxML12sAq2Of$gLz20{!hs@M  rΓ,ƦEH\3B!65Y٬xqˑ3,+Bx\@Wv$ڙbju ǩ Р\4 ?İt8PymG|x7NS*o  2U3.MgLSd\hJBP҄7eyYpKQ>-7ľc.@DvDnoeȏoN=Tnc8$qhlZ3GG9>ݝ''n8_?ũoVcu9=tL)'>륧VҧT!IeD]D"%`@ `2!jn'TUDs_O^עT#w_oXO/PlBs ƒ}cx ;7qEv#wuxMy-/j'`"BXWGqҙSf奍PdOD"g.Z*Iy'UΤZhIg,XWC̛,;濯x:XWCidx;Ga9k9TԎuN*(P33;=n<4ጅg3f'Ty` 6TllXҪ79 uf&%Uj+sXZ2B ⤂RX;i4"Iy"QAa=}*J^A/! 0{3eTv~[,!tP*x I'B1L@R!duB!x2 ?c]!ƭʔkhC!Mc] !M餛.?WB!^>JB!8)|W!B!ĘT!B!ĘT!B!Ę[!BCc8Z뱮(`eaY`uuxST!bIg2Xp0>&cgHgo  !B#cx-@ >ou}V~3^S ]g' T,0S΢Fql,;oB!8|0B)Utj3cF}|p=_\ZhvU.07AyܳEm֧M Hxyhy,BZ)ٴB JB!5RX/JcȢ I3Y.iFJ=h>Dc̦aJJ~J޲T~`=oi=YV]T_s `Y>\DR!BqFiܓSܬ'Z_nNk m D ˭@+a 6{|Y8}m{[vIvW'(嗢V5\.]k&  !B3J)ƠYR f fo zW6Tos_gMlAq8Lѧ.b(j[nAgQ)=cAFW?¦GHA MይYmq !B JB!bruw٧goަtgR G4e]78{Kd3sUOi>`jERzAtbL#Vo=4ro575Q7Yk J= !B3Jڅob :`f?n@EUi[-쨧0*SV3*ϣx~s?$of,ib$$B1Z[ZʗIoB){rpܤ\-WU-Wn)l.nčvAmz֪lݗeV;`8s=cq'dJE !B~?kn~#}뢔UnMqIdh?*prnvrя~ڵp՚ /#pn_7bNܾS 7~&WT~ru㞺^Giѿ|'(qSFAzq=)ݻ+̼sx?Ŋ^wUB JB!cMeNYgO0:2}55ՔSSS}wW}Y!萠T!hii;~pw\GkKoP~3-EKwKW_>^o;uR<,~[=V\N+XU;qv~ʫZkdV^x r_by8YI|߾E+.?7}8eSOsɪ5\t9y>ůe++֭m]G]Gg~:}Y~}=_ӧO3˟J)>_-^ [~9.u/7\xrIul;o޷8|0z \t*U,'׭ύد};%rs J= !BWTO~gL4{=&LGyw]N**x G%tw@Qlݲq\h:(jР+E0vBy}~|(Vlڸ|bq:;:9oyݷcf {X[u'MgƬ8@yUE:wo7{aA+|T:i+葠T!FD"a{u|0MÄabPpk><urY||G\2FB(xo_ H33O=K<C.ůot[QB.fq+uϵR5u>2tyQݔݿseoL M@dJ=ҧT!HCA7.x5~\%Nyhok;~{'"jjk=g?ׂu;9x.f8aX(q:m z;p/#*l6K [0@w3`OeU%U.xse`>=s GxL/}J,cO2B!@2" /& F5V/\~~??拟~`9K+ٳ{Wd2gƝ1d]rd T o>zr7x 7}4:w^×o?7Qo$`B8 JB!0d Gn)?*K͒hW1 Ie 1$(B!G,ˢ$RJQ<^!xµ]˫,b4'I!b,p 5 uDH(BMy`) AB!ĸbթ 7CV#nu̺`kT#ׅZT , WύL!:t8-6m pJ9e53)TVdtʁ |~^{[ m _Bs6>*pt 7'^&m`gLޝVԧ~vtҎ( [_sN9!kGjaG|׮dc:r^S]7F:::NZ幗#Dfk4.|FRᷙUY>!Ce@ִvuxhJ) `WQ02ك|>3.4M>gK4ka'({y) e8ff2 zhіԽTOp3ro9gCW&G3w,pzgX-~6d\*ge2A(;zز}خ4%~Nh);%vXlX͆0 $3gjet5-?#G=bڪfX!<M00cy̘x!B;*B9̣Σ2 =/e`DP88yd&`m ge_y&%U"͎ͻuZؔA6 ]Q8 xh,5h5y \Ac M{hj)JIx2>z:YA$j=Q(wsMuVJBǘ1%w1ix48s af X7F[8QqvOH &Z,>|*/wik" M攊8Y]L+uOCbsKGjq|21/1'EE~AM`V:f&yx'w/bwkhڃѴg( ) wvs9o=M5$s{+R~H;P6#TlSǬHX0-Iô G[MazҪ̛n3nì {Yujb%l4vZ;-}mL%zmZ}Ş=؎i:A,Xݲxvda]-OMj7{iS 1-A ZqN]lvgۅB1nzPjdp= Cw:>9Z*M ML`AcdjF\T4T{)~Zn@[L&&^LJK)d*.E7oh=Տ5̖2f(Jq|`fMv&'|d|$\ᡃan9X*'bEiCdyS\5W􆈭Iw24z>8$9@%I)hn=MwЖzu,8خhh}˛0a%¦2h˳ r,FWs/~;w{KSRk؎7JgW tE=䷕l߸Աԧ"i4~uy%:6Hmmokaڴ猞N.=Md6*c7Pт%'\; /t?~+5.(߇sH\G:T38*exA~oJ2B!SML h LLkJ*b;qpopYH|vǏpڂ4ybQA6 -ikC,־vi .!l/Ac1l=em캊Pj%ͱc/C}LYtJ;?f`v UԻL@IgDB'tB Ixס0iXL(1ޭ-TtlpS*}fF_w+9x>F|5z.G̻PT8-Z)C5I\0 ,|c=wsugߍ/pYU.)2NT6@W"aҮBj#JJ;~YaJ<~Aɸ:.LoSҪjPc&NP>-]/c%vKvp<(k(a%o1qr@DҤp;?>$fϖw.};)OǟgLی_.}yǷ7r̙z?-n%ivXo vDO^)O"nԿoa޼7/JB!ę̌&#M_Pӱct.xm#4غG_,!qp2afcOa;f̈́jg: {4Z~DXta6rD ::5{^.gяmZʋ%8q"BWgTTZZ RN(#A{~.pTPNI`r+k_#$j.yYo_PM6ZxJƎq1‘YF"{w5_߭[xDAiG5[ģe;QEE[w,[|kB0xGڟgYݩӉ7gp.sPqBoT6g߁֕ |i .{^1޽AǛUCWNE3`d?1*Ҝ01&!nr Rcnab}|&ٿ~:jb6o wBwz1zusWLڻ,mN }P!ȑ w:&AXG1/C ң C رWJ}m/~>=hP,[$RmJ:&Sgb L/=`ZO`Is;eX;9m1naIf<\5˂ >ݦ=&6uT?z}A= e*{b>X8~ ?prbv2aљG2S\BgX"dQΞeѩKgZ; T8%z:8e6tS!\L<Sѩ t9ޚMhٽ⥍Te%U`NB .b PYSؾ}t;q q _4xy0SkLJ'DB5HAˑrQB:CMO`7qL'hT3tvx0JLp g 4=,+pY M(l|1 ; bɒ5ZYq>U_)SI\hn$*c'el_r~g7} FD %i&* 4 = rQunZשD@YH>'?i@$&YOI:D4jFV(.', J#vf .p壼Hő9 +WNRݟҁϏ 4<(#mtv4^S[g*ڊ\ώ>s##|ҙҁiBCs}Af]ޢ!R!a=C[d~-alǦ _z1vWrD6`49+;7"o䊋4CoHĢ\V+U`o*!ȐACP k/[4tt^TލIF2N~kiSojkVsL|`RI-8:`f4YPtdM*wf"IЂ0域)}A=f3H8rh*& _?z&?~z2>}^v4{h$\P=~FK$`p4/~#Az{Ģh=~{!I&O>;P8?Fm$@---!N\+ u4Ks$j"v*L4;TJLX('cX *#m7⚹=Ts Z7-!?'q24[1|G)k96pXD%AŹSy;ń>N`܉cM0C柘0ySF(+qltQk8t4NDs-.6@6YFE3t*Ȥ"f.锁 V:K[Gw*ȣy+gQdRF4%x}g/lxjv_0f,JSWVE!ՠ4\l <:H6Hۀ.4ʱ]IR7iH.űfTZӽusV͎0s x< ӲqHq1GW$[0 n*loF i;׫ 5ݵKp\G(s.f=yOsÜ1_7c4AF#{ ;Uq)hmIs5c7|ǞlL#6fb7bbwcb6fazw}Lx-#:HIHI$[ q7~#h ʲ Uee2 ؄!Rh6WH JEO 0!F*{6i'.Vl<+GB׬Z4ϳ&;4RUaLjO3V<z d{f~AD1W?A:F{,r`N }=:;̒Dwf܊`Ue3p6[wA[%jfw` |[o06Yi ޸6x8Vwm"CU6C:Q7Ĝ|E3/HbI%B@~,e9x IDAT(x~ OҴ/cO.sWL(QD%wf-nRRktIshB*9b~} KˆNOc$1߾@Xhlu!ZFmf&R ,YS7ً?>ʍFpv)ojp EҒ$nN`ty8oK_[#HLB֢'.`l()V^aoit*hZMS]<}^ c|9?Ehϲ4E= u}ݎ:Q21ˬ H_M[{.swt5zvnJ_ʻWB.~?V1~_}_D%J6\HR!F&Uv5Im0ݶ:UAU {LҨu/D)v&E^y2 k6܊EU4h8 **v$*cCJ'Ԭ^`t4bx8!!FT2’s!HUD,lWrSpeWЛ {s|mȿE\o!-.*a0DIՂ!m*1J5:Qwu*b5^ySL?bnugVF ᔡP"nMx`53ramaZ|Ks7N׏ŨOǜTejLtOs.Bz[ٿʖwk_ |Ó|FZt&F=}aC˳TV1 wr%T&dpH~~ g[` I"ƕZxX?N{3T)Ԯ??:xg[D%J~vRi1Hh]lbdv$*f& {FyL,w 4$ٮ߿³:j2Qj7]$Ƞj89A%R@ Lh]M 6+ ЦNqYk^d١VsV""ajc1k8?+/\|>p@Էm ?]XB€2*!TY%JdުrG FM4жMbuߋ!ЊLbd YiCZv$ Oa;Dmn'ElM+ 1ex!j3D1ҍrIǍ^vu9y}N${KTyCl{w,IRЀveꓯqAFX i ODl'1alBJS JG,*DIGƸ#} Jfd$ftc#<2 /tK(Qzb?z\o9c~/ϫNN&ž'a[jv= ߞpfOںiit(u6]^> wբ8ʀ 6!ڏSu &Vi_3PmT'1\X}ɳLO9* siv9 LY7r4>5IA*EgqozMlk'Cm~M"1˹osˍ%OzKjCIKQШH u%PPTvrn3RH`" Dyn4 nZ\d7;Md&~[wonğgZϐۯnܰev"ݟe g/yٌdDͰ{ku~xԄ33o Kk'"̦sQZ̾.|)#K4~O7lۦ|Am*]y/3\74F,j=딱9i3}t@Ty9ŏ~j;nLۆ<͕ L7'4}vQ?8#A bz<C'Vŝ<Ë ƙIQ*H_曖!lVڧi6ɫ+l3RɯQ| qo?YyCMFn-j=&J$fh tmDWVF$(ih']z6-]9uLHXf旆oz -2B5|bН<8'%x-˙s!ۘg]dN1=Q7$KPY>} ez{/| M0wrGz{c[/>WT6Vk1-v|N㊯>,~;6]9,9o ۘ''/r1o/QD%J|໨1FG-o# MܺPo%(ݥM F!CLz]䖛/ - sac4Py2xWB/r9lwӂ?v =Dat{Jv iOh?vT> ?J{0 ]Tn|o_fNK olPջQ I6?B z*aY+?`eL4-q}  {&{|3Uxv<11lN4k\\Ą@Z{"&v::Y!;{sH$Fpz ^ Xn0dvQ&z-SkFkC6%֡Vq|CP aq~vԣk`'=y}_B]$>@ Ͻ"ljZտpهiǒzγooFZ,SwǠv jr䶍eof ;?uŋ}g#c)7i@lacl7/O.:)O2F}/=dԦ3o}DKiG8pYF&,.Z녀qc%J(QD=ݍ!x7X}ofvc w&$"&n%~S H 1t8Oپ'6p߽1> _6k"t!a답TByLŐX  ,]p.3c1m4|Cm^}(tzb7D%C->$+OT,MxO˜~kYjub\E!K``gV1@^:SMj֪[؍`mFqa\| CZ6Z4@qyeKo n݁c b`!@/Jf/dVcb@բEg&yl5"k ;w`L {#^\z C =uycD] bg ifhM"Yk T/~WX]GKZAӪ~gЭkm{oG֘siMWɯ?bk$/Xe]NXa ;fz}pAأb0'_[ _~6/8Q8ou|uT=47Hؾ4(QD/fR*|oOl_>Fѭ 4S=Şۏ򁏝W!k,qe>2mE'Wp O,$F;(t!ޯ;fgI gЦf)Q_5~oszZ^ C )XBwz %W^fGYUh&9w%J\'4;GGykiHyﰩ:[iDg{K͡tɪuazZBt>s{ͅŒ~Zf6\CXQv~?i6ȶ!C=XV{̧i/n9c,$oTĦ0i>pSL5l+k{cӨt)3_9őΛna%ya6$kc֠&h$\DG<{W8|}6073Ɲ cW,U}_!}|Slǘ;nI &*A$N$ %/O'>v_|˓ZkLo7vRCr4?m w^YMn&5FS`VhŁ'KPln+-ν;b4U䦭yh c"] 0iPĶf9<|m-WBd4[#Dfs5V+mOBWgIq4/S_d|2Ҹ|1Q})T.:$ $0:̶Tu7m~"?gٻw>O@m=!`r*>7r4,u+b=$kUP$q1z#<]21yel Dǚ}2Β{t{ڛe^?ED$PMg퐨.Օה(QD%~p]!-[ h7\TЉ``аiS̎]=v WmlCó۳0M[[& Cp3t% FtE reͦۧOs Vȷ>SkPC+LL}; CmvpSo2>X6BHq "g9[i;iG:VҤm/2XYa@)>`&Ǘ^aBuͨAkHzTQ latiۮyv&3yiVhҋ1 S 18MpBg[FmMo`6[.r㖫/V)Y[+$ؽ4T.NkUؾme͕!BQ5Lly7{fU;2zg ~Q{l{zðsw?z`cOa4q{6ز9n}Y}"{TkWns၇xmtRh3͗91܆6Xa;vJ(QD'\{+zRxoG8|\ Z^=;aώp0{ q{x]_>sEx7NN!:l{?_L]U+<:DU\]+]Nk,~ϻq_دk^+ƉQ*QD%J\#*3O>i9ySnb'!uX >}Bf-TB$h,ֺXKs?miq@au8#5J)Xkm:]QGd}I^ҝɘ :=;'})p~)%a' ֤%ߞ-4T R ?.$v주 h/탟'u7u=Vk)_6Dt{rQ RBLL~cOKq_y[6-.,ifa1c-RJV]"֗+E3=N=ע)I=]k]Ob9ؖ^62v/ zT!͵1Z S,-9֭:6nۯ{++0;w}*QD%Jlk&Jy /:. zj&6!A:x)>j3%0ӬgZO@  ̙sEیhM XhJRJA5ZB$hm\XcLf?)D b+ NpU6D@H削 S/Dh,֑b)2K@ oKNڋ_dٜd{ IDATq=K(Eޠ$:7LySST O"ϏKf @HulI?^P Q[6f-_"vF4㉝FGFa 7u,tlj(Mh-7Ԙ`X-Oyi=4ָyN:NȉFoP֑R -Bq&n07cEI\:NNRfkZKRabbeݮV QJXRcWquJǦ5Je׮1,gZ| $gï=n[uIcƸ9B#~ll_]BcbC!&YX]$lgϸ $hJ|a(;v0oXYPA@ya~,B5oߗKD%J(qqͤtzY]kbAJ{2Ud69{~&.`-'S@HJ"Z&F3AH+/ [LcȔ$뙛*`6H B8 ixh(G촣DRHY1K+rB''A(VʠMHP*a *&RXe B"$J# bkx g'pXdV!#땽D6*! PQdHrQ@)$*-!e!['m뉘++֭K8μA!K<֜J1Hh` IיZ QhB  eM=J#&,BTV",Ԫr׹c{&]y#Zx"lҵ)VRBӞZ7 =)PJOa765xRwXHwc &I{jpH_( %ڵ__x2֥Iֽ UGV%/k/u?2L!( 8 A*'Ys:ҍ"X%.R"#!Y#PJ=Vػ{7 K9?߂nAHߚ"z^L^`0푊?% `|bnE# Ξ&g(#6x) "@JJk1kD%J(I^ϑpyr))8ev~q8N/#R:ὈH-R*ՊyN )+e5<<7m($Zὀd#$6QB"B#ACK#rc*@pT\eik_e|Nb-hmz@lתX њ$I1'{kcO~VC'J)EA1|S $&= Ѥl}J54TyWC)u* qeGYw.K(Huēgߍ1XƑyu:XW}mCP(>-<<>l}AB:/IÞ=]X?TVnuL[k9x1 MN"9pD JĭHK̇,RYn|P5H'q!8tK)6e !b ^`cXQmRPש.UYk`-U*Hܿ EHo!$UJQ~ b}vK(QD׊k&N0LJ))hqb@*gΣKhOř˻RG ںZ()a(hR$񡍖n:͛/|v#$&QAIXkH:z=% Z A%ZMkxnn>5!D!71: R,>rF!0$gl̬ƸhM퉜Y7lB{q*8cal߿FΣ_}F!aCMc-:N t: %FkObscenHPn^o033믿s8ۋ tv>; fyOnXD%Jxpͤ)Z2 r],#CE'N`k\[h$% ڜ!I"ZCz5m\`/1ĉ$a‡{zmL@FhB dS |^,Fok1ZS -5d}M ZqYo,OQT*n/ mEK% zq#N0ָg~&1I^#jHdQg$8OYz@="kSs~ܮ)9us֝.[9: SlnugSМ RYl/Ns-F@$XޅQcI'{U0|]]$z=S$ kkBqu20A?ίs?VWW{ O5a[f!"":7ZOT`)sJK(QDw)8y:h{IYբE$:q!FfV|Bp[#_fqyőH$GM+(z]fHg22Z{uyޠWRW_WN 2ϫ^=AM 1k1+@2<8RZ&bΜ1i^gv:XmH48%G'(ͥa|6 Khg|oZJvEZs-!|(u^g3JV JŅP}i zA}KkOֺ8000'OXZ^a"}xμYDjJb6q>h{e kۦӑGEF'igĆ,4>_Յ*Zіښ^?{"W⋞ N1L~H4֢&FGc@yi_n۴@ oVҠ*Q008(g*IV1/no8b'N~ ,GUOHhs]ݚ߯c!,ʼo8ʷήW>9ļ@_]#?"-TeeeՕU _<|{ב̙  XZn xPx/ȯOɞ.EkS P ?C{kX[k:ofn({Ímm=qO0s]qD%J(qͤ4wDjqe._ŝ-^ؑLc !+2<8%ݑCیʦkAd.W 4_Wsssat^j,۸(D(G ]%sv+=Qng~XOtFE#)FFi]@5 ]/eya%kI(ݫPzP_>P'I"8[ J?̻lH%yCWM8tnrp+tVQUXZ\͈ d5>B`Ϋφ_&2ou* pɺI3)U;ǷRZka R!癗XP"oV`c8Z_`jj ?8gΜɦ-Xzk\Y4]nqrk.GJ(QDLJ3W zȳPN-i~䊸yLnE+PJؠGےҝWέAyR2jw,pE hk$Z't:-Muʛc0Po0Xk `ayV@T(ukB_݅)EE/)Wf^߽ƅޖz^VI4@Ra'n4d)Ȍ&TX!%y1yq coKU b9XU@NQ.-/[a3ןv8"]ǑSQ B rWʢw-'y!Ǵ@\]^r%dQi;RX)3XHU4K Y﨤Phb1I]ݢ$72y:$I5/tyl a1Wg3&L1 _w?SZp9a(ڧxRX?䵢WN,2J2SeU iSi<|MjxTJw7::;y뭷X]kaIn'3.ӳ3O?rwRaYxk{#$-iEKOi%J(n os嵣~ym(X]F'S_B AZ{8?!Rt\諐?&-%1|"h* h.J)rreL sHXJyT wIgVuDC'E,Wܼ |_jHgJpxDI[XS jrT/nC(d<<G|_ 4'("-ĥM joiBuGGL8R'Vj/-'XMJgP*t* Lގi#Q/zR~H"-{2\.uZAم8&6;.ܗ6psӰؓ37n/!a1*GFX^Y"I4^DjK |iu֫R23H;Nk!}\t@0̜ZK"M_x#aa?:*PYH/'Muy3ۥ%Q,6_+%J(QDwNJ_RP'u:_6kA *Zw Y%z!i=wK9I ˱a4'\tGP`iO`Xi[$! QӌONr0V  4DrWxOHCZO|RMh#H>8'J!Z77jz)(sm*`*9{" k<H"izZ(ͫ+繼7-rCe- 9RIwդ%@' =|/4I2U1⸦N>81\ڒ)v+˅ wGVEXMץH׋#[., ;Ņ D-Mט1&?T̛hLrZ $!1ي$y;aHYXˏ@ %R  qxYY^"#Qy1a֐$;8wF*ZѣN7ΨMO\n֚Z 9Gv籒-ŬwEbF5{wX (3vÀ+](=qXu^,?jjb%J(Q]5@*eٙ{lPȤȕ wRX5;WlŸUZ:^;Bh [cswH*${xU8?BBN_evq #J)un̕P+^L_+pQ aҸcz $2 IV,/033Cz aJX"xBa0LJE:y}L5 8ɋ@_5+{uīVs?w% z;GdH=~B",߰Ⱦa<ֲ:};W檮lvMEʡ"Kk$DAd $FAɉ`%RbQ!l=fuU5 w:;p}Un Mw5^aOgr+պ*v@HfNbgEkSE0$8&RWI nfM9q,%z<*٧ʗTQ#)It+jgGv@i yk,qwi2rF %b8:I_aM,tkZ:zT$ƥAQ䒨 3\|g,wVXW<,KA.fA+)Rʺի<ܳGFk(ƍ\*c_sU̷J9I٘`f+ IDATgQ4eYć,2{;LF*R+0E#5_-1R2Y0+2,þ$[#tuC7PP8c -la w J}&)8eˢȇeT݌2Oݨie4JQagkpV/mc}8go߳>H Usp9:![`'5 h4l ,SNjZC#ώQ;[# %dm3C03sM=lRSrollR䒝U)MYd9‹;W0d\ `Ք7W5 ;[MfNX3uK\p5qKFȪ?vǰ[kCKfV'B:;Ī:ƶZ(E.I|9 +&τc.la [kv2v!N ӆ#I`bm/ 8!^}_NTfGECU,Y@PKL -ml{$H[x A–֠BɘEQrF6+07 Nh1IpDv`zsoC%sD>u0Lj*`Xa\Nc\7:ٷ30ܳ ud=8~ JZ:_ҹ?VEm@Z: X7'ٴ^eYzS?~d9e饩[]|7g_gTɹl)' Odž6WgxΆQs@[I9r0WnxPZݔ$YsP j^{Y 7t(NP*Ex"yk"y "Z(Մ2i<7c<1 j[z 1o6XpT0-la {AF,Mӹn/]sR+qKccISFٙjw:QBiJv lr`zuNw8[q#fV$HԐ&Ei[2Tuą QRk/D7Bx ME,- 0!S&{$ē:aJ8MSȫ64j YF53o" +Dh`d :}|IP:.rsPc)0yC47ht!aYSd4M5V` Zȯ=ay*XQtΊl^֔*8rgÖVkg( UFTȖdTg[hkXSց"KoJ^Qk_Oz3QpW6Tm0L{Hs}5c̛syw!Q=9Xʺy c{{!*2i'68#ԅS+KQf&Hm]U[7 PN2mk_TCE-la [")5FHD>yŽ8F`%2URa`R2gBWҮ5XCJNPK2CĝY Ȳ!m&VP!4$ 5a LLi\X?sήP>46;&2k-W|&ppk;0;#<>y֯nTRgmHbc:T]K>yV0A^4SDeNB8WJk\mIq Qc;-la [vA ڹZ( .U̐bf$w&m88Ma\ǫ A6ε'\\]g<ɋuv7~YcD☣عNJib%C6 &A)z^rEi$Hp,)M$P䓬H2Us8)si؂Ѕ"/J&qIJXiR:HZ*=RRDQX+=;KVoU]z:li ;V1y^TNnd`Ie [-aZk_*4b`$a,+W?-5ɲZY`(U~ ֕(͓  ``Zck8{!oMx~Q=ܨc (U3ɇf10Ke<`nny^odYS;ڪtjcnZ;X{5uS/]x<ƖU"akW0Ljiޝ2>';)D%iiUvԝ*%;,m8JŸSg58̊ lD^L+xKwt3t:Ы`<' [&]uw@ '+H3,b.Ǜl2lb=0 Lݬs>-v[X4,YĐ,Cu$4 aLxp4ۦ(3vmSf5W4IܥYK'Y"9 /06\v{$}hTM@YC #kfAVY28S#/cmUR?꠴[$$r'i&v*!L_TM9ߨ5Jstv_a+SGV6:]EK)Rފ{nEw9=78n1"/<そX[=#͍EcYav[CY<]3&/$cWdj̏ $uw̬`Ɣ0vml5]ㄅ-la [nRgkCV_Ij$dHАZHAyk-܈:YڳrQPyIaMC5bͤ&O-Ɋ)Y>r ஓtq~gɔq>d V⟧S(] G F$ߋ)ȋ Y1fm1Jaɮ *Q)K#/cJW{Y0n2_e< Ge&RZtwS% .˜Șf#Kng@:Pc^wbljw"QOD3`I!csi+3shUk' E.= d7b5CL ;UMs{yCf;QX]l%hsPSC` 2G)"$EJ|oFO`P/|hˁ> n֌ p  )2ɲoJkc&Mb&s.[I ,JPJ&Pr*v:$3E7z4JR&xt"5t{q<7H6XxJQBh*naFhocWk[\2^(Dƭ P}FcI"&o[Ң7-6[>p9ui6!) [{RtT~0%w{[,såT9gg>Θ慇C^,!Uκt~ЇP?䓸%,8<:EU uē~OXS/-8Z”T@?[yzx%R)tw8N;yNx l,uyl[+} V3ܮƎiѮ[:NTJ8 k*aL*x2O/eSRإ%/]Bz"vQ|w#/!3y7#kI~g SQ P>{8spŘ80\U#MS\Y6;XjE"Q7]z<o]ϜYT~ε1iUkrQ?clb@)tz)Z)cZ~ ¸YSj7ׯ֒,-dP<@־WhJ'&-la߷.Rى3v΅nCA'߽{E< sYʲ b$i0=hxZT",,43 dSN] *z,azC ܅ O5}ҡ]^zQ!ǣH>iC}`MN>wNGc@Ȗ?UiM19N-Cqu!0<(i;wmIF`W߀ R=pnx\|6#*dKNc|y'5SSJFZ̯i;9Z`y9duLJ)+D$@3ՐioK<^ղ7lFUi~W8…91wǣ#w6 Hd嚖Ҕ~QQeWF!0)%˲.e x4QҲ(#M'b}gϟ~x?k~o<ހ>O7c [4x>'-la?@lsNX 0m8!e)K׿ ? ?ӵlo|N;Fie?S"]^Ε|somͿs4S//;sFGA;w pe)_{ F#F$x歙} ̃v7au尖, IҒSUN6R0/:mS[qf+jqI{qjǡ,yk{<_ éCD~qW[]7Ğ:>v pM{/P'nƽ:ΔL1[k zё}lL>Աc`U3O~ﳸӧdY@c觀*x,_Y!{UgHg09gނo24Q$ko>SirbB$?9*dSE9mǓwv{Hcd$WFy舴z=>dLjIMA`4Q{<?AmId+Br)U1i\y,mWzʗi53_YQsx:?6EΤRM3"|>9ܭ8jfg`kk;O9$f!y;C#Ib} Nn_Gs\BzQT#C>oW0 [ְ$N8v @]uLRb5#`ư3.U8u RөgI;jX<~~} Y#Lg>aڮqo?Out' Nn > 0e)xHN$ Xz4QuT(ȭypcTj$ (-5a_ە=e!%p j.gAo>^~[!myJ$ɘcńe+qLpOa_헤UJb 0qJB 5#洢/wԑf{{-F6:R궆xؼl%[S֙oْ(6-dV%tAMjZJ1u8/̷gwZ]Y(k-u~Oi6Z1Aˑ#xͳ?bHe|R")Q%njZ`Ly/la [wJ!·sh*R-"'5¤"i[NE]EY2YdHj)Jā><q֯?g"nDZ'(%2)AT1" ?ue'eczKcy1liD)Y)cfn&! Z:EQD&EH3; g(Yf]1.ˤ~fK{t}_c8ӾXJqDQȑ3kkٟIA^+#qI8)5A6OC,8{O,)rF.'q݋.M%nq=Xg:ItT^6fGrJ`hea0Aq$VK: jPYW4oE#3&8i0mazg\+4!@$1ֳ1ohEy#kmY8PsM$i;VQW u)͵v#X 82 vH&dSԀpq֚xA!eli5RirUjxo5V^C?r[B]Ԍ1dck?}x}a|sPj1J6+{ph>_(ISEI;y0 dxF#/sJ\TkS<u7OTD$FCsws ̃N9"uz$|A2.qC@i;D|FY+qʂ Z% UI,AR=3J6kr_kZ)Ő9wEbqJ[J8v9$Yš(tUE+Z+q❟CsIkB@Ihbo}ِd:gIu֧snW L(J (xr⭓$|W^g, Dl|z(W)+߻akHlB5%y!,e#?O~X8g(3lcPrb\AQN?!YAKW=Sԩ(n[Ővtkk|˟#7n}o:QӦ)[[iJd ͥ~Mv tj{0 SX_aPqNɼϜVgu՗NGdplsFөHDN𱊁q !lRЏ?uy14#_-lNY66(nGQt{98tSNVҤi)ar2k13?KvT6HQ$CQxq/i0YHkX%7$央zlmhɲbOgqsSouQ4d2~W6ːn,sZe)sRngc <ǽ*C?xQOW{ ڤ(tCYC4ǝ XHaZuvI.IٳWWjZnѣSoh%eaLI35bǎGsȒHX6KSRYJ”[$%TUnY}i]Yvw8ٸY 5N]>Ρ8TjhoLgDR9^hS*oN V}8 eyڳUJʆCz<-"(N|Pflo`F"w(+Gݜ*.0 *2y7MQ{={P(_ ՒSVUv>K/b`>_d&Iox^7#-Ln,[|Bd޴~u˭Y]w㌁-.*,:)΀Aoo&Sl. ̷=avEZnEøx9a%͋ y1asxH, <8R?iǸ!V;R:R" r:3gp/zø88]{lo09QׯWSe9,e+gn=SZ(xA+)Ք0$:rX$!R c,Δ&I6bs vJVz, !(kM*stPJ11굼HI6~Cj+6Zll6õl^ɖlHJRɤ|ͷp]wGGǓ<1CZ k:&_. 'qƭh%('ę4nɔ<_f{K?rvCb9+'_}ڻ, Scɋmii,'$IYZru|DElllE(PJS6&Lt:dQ"׳֊t'*tB*J< jM|uDKgPG;[gݵTgLrclڟ@% %ko,$6]Ic`}A_'EkP<{e׿{;r t[23Ͷ:O# z+Q1e%:04,1 t7B=Q ƽJ J Eܧr//mAi]"V}Iפ+*|PZgEFrXH fؿ{_{hR-0#I]g T9N[&lN~E'R'5[2c-jYafjj61{5ItL&e-D P7Or6^ xp. '%Y.;WnIg^;k.l7m1,laFx)G[,Y¾/-4J5'屶"T5de%z7OfsuJ)W$dV{I@z[d΃]>#֢&:8p"a<)☢˫8ku{g,e^,UIF-i hN&dB8I"2l[`1u3W 8FiEɀo eh{CR{k^75`w8f +?EAMq("&n\aK}ג8O<yI;?S?ǿsϽGG/Bu7_vR.A~z}؋k8~1r}kO+'2~~o Ox8|2Z+G|COǭ^}XX[҅-l{ǠT{&,fFENS1C֌]S'+y$JvHRoeHwEQҿyė2-1Ve` X^Z볽D.Qh~Kk^:fѨ}~i]ZEt6ըGcukYӟ C fWpƠ%Iָ(*y76po*/~wɄI>4L^w8PVahE[Ks6~\x[8` 1Ѻ¡ \n$QD:&bacHE(3\b39{7`';G$t0qvygS^ĝ='Lh2bL^LȖƬ,%M>S#$M<|:۷_bFza*YV415FX/_%MEz~f90q>{W-flRhșKD5 @v>뭀!&E^JC365$]2ֲ~jE1iBJVuN}V+3h%4V3/Z09 W59 5ln ,|-Z\šdʌnljX%h_kXֶ _14o~U7~O?#.]u~6r=w[/)˒_?//>k;܅s{?ӿrI?pV_9~~ҀW^|_/_eii7zVٞlmmX¾o3ڔEYJƆ{} QH\%r9#;&\Z^^Ip gOVI쟡Ntڐ2>>|I/֙looi.m9)-;*$AN}iQ}6ąRAʀXX'"%uCn&@jp*krig>[ Ǐɘك[+tJ{w%GypMA+ d `c_g_b 0 659 BV M4N[J&cW9OwuuuO=<./gb~񋘯~<ƙ4AiPek 2n2ҾXh!jzM1ϷWK >⊔L< Iϋ=6uf|Xۡi֥ՙau cR^=PW\~MYuXlr5+~뛘ؑvwdj7ݤܢ_h "jT+CtsҞY-GXQpcc/8~ ;nOQd0ct VbM-q|+5<(0F $A~{g ʱYA)(MF$ݮ{R`1nʑǜQڌ(PsyYЁȊ#Ii"̥;nt湧}Cʂ Z$ I*Uޞ=4$;]Y@S) PW}@)9؝煋-N 3^}_DJBӕɟAڃ|wb1eBRjuhԱ!Ԋ[Kcc*3ᛰo+wckO!Q3XJ|ZѨ1L1ic-ݨ3΀sCc tՠZ3P?y3K^rC%̵JkcarO]4ZαIu}y.XGaoM@Itgh4b1-R# QiD~]blkQ*20AɌ椕{4`D yz@yl%~(ZIA6K9ٸp)lyʝCũAyZA& {Zz,}(1^w| ^?Ӻs_j333?v, Rrq)8 e9PJgt3K.>Q.qo^W𒗽Nm$9~09~b@88r(+W~ikzV&&&W*?bݔv͕W]sn | p-{wq'ϹYʃf%wݼ/abW^u%{_c2õ/x^>4m? g6lqW8 ד˧%Cfb*QZFO^ejv0Y*i쭛ͲqEK~06T(Ɨs)<⑘O_?w!Mtg 7cNfXDRTYNOanAmߎ]"}- +4Zd& (O@]r r1vmkޭaX!q%]y!@PܜhW_8惸.L<#٘dJ%ƺ? t*,̐~貹QRV1;;w{4@2L9|>鼞[o$I:8\,x+^Ư}/䧸/~{/G^̇?>_4Ie+L>V^߿VXA&Lw0><24RȤZbfIVG#_z%U6 Q ?LOaaz(2Ts*jZI*Q%#F=$TQRm؃߽QdO| O˴JԧC;[x̺L$ +Ao)8Ya)I{;+FFPT$ϻva 8%ʩ/}7F3:Q+xzǻxVOߙ`|8_xÑ#G㯸^ի8z(K.eff~_m;[9Yw:pƮr BIw^7qϏakuZdYd}j50cIP 1a?R( V)0= XbG~Sh9˲̱iW- FړOy]q-] yQ4*JmK ]zM1r> 9Kz>I4Md~+MҊ.bvz#RBn@^b2r/R,EԫT642l1)iI4KΖ-n:{#\y%u҈UPڵq~mu+ W§/r$ lbT+MU s AtvɲlB%Ejl9īǏ h 34c4*2yb2c\@h]# cPI$iG\Mðgfj kKhrJZݻ1:F3a9X(zL)E5@@);wb55* `.MƐ9\;߁Cݽ ۦI+%~ ZRۗs Й_8/JXkeNfkj~ R.ʳ(3Ir}geVfeYYTgY)ȂϹUY1;;hd;==IT,RՓE"=`\dVk-gKcnƍ_`k__|#?ŽS~5[nϼyӯ}_;h4Zr}<OgE/jqEEN[\o_q9{v4IPG)V6~vͫ^J;cӣ7azJ-[~ӏvMZy7czF#Ɋ6`@G!Z$`X9ԪN^Kl_*Eg"$fS(zs'&`2غTð8,J):ݎO-2?HR Γﮜ#t SB+'h@k5֬Yñ=|l!gc .6]o{PDaL* "tk3CtiwhgiuH.Ղ];1]^uҠJ&VoH2Q hݒhIda1XJUei,Vi&m+?>bC_D-`nZC3C'i3$ڍAXU@:J:5 3c̶̐f Y%͜max{}CCG?&u]}Փ_atfI]mQvtКH+#sc;jF:QĵRqJ}RիPg ,>ηQwM4QXG ) Iz58T:YeECuPIֹf+?jLx/5ɳn{_+Q,[e϶׬ĔG)%j9 +薧\n"|ߊ\6.c?t̷q* ɟ%`+.zwP"z{>>B"P,$-^lU/ /}K/"l7nx\ą hy7~7Ư{ƍ|a]x7mJ)~70O{ 7/oo{ o}[lc}9A)ˮ w.qO꫟g/ o?Uq Qw1EaE@&8dZu(R!YɞR$*5` Cc|"Re|AlwX&ǎ}лNj5VjI`q$Z'-٬=s`"/ (eԱi/2)DJ@V!iƂlae*Ch-쯥*C:im,YF-u8ZrimCq:2<\HԤ&tLT6oR98|l[&CpY$4;>ȟ IDAT؏ݾq&QK󑚤RD)e=W@F}Zm&%gq| 3NMaoG[<3jU xpJ-٬MѺBRk2CbJZeJA b~39Dm徳VbMRʹݻɪUR`r)qY$Z~)Vl8k=Gd:+dE[+9,y{3E^XY`IkrNYS,[:,V݉z?'hd0gѮ<(%6 DaVܜ<( 4Qi.L*0q[/aY&_))wE°X]0+}(Pk A2J%nm8|v݋rSEš9ê̽4EUjQg #<;+fI;wH>s_htԺu+,M۶AwBՑHw2ȥMZ6 r/]8^Kfff(J=?N.d~KXz6/-ֵW2ZcmJSb=e)j&񹻊Xd0h0::JR5}'SRl6_<~9ckkj6?ԶW Ҍ0`:A,ddiF'0A Dn6YA.i,߬U}3*dvJE;5n&!I"lc׬)@iúu"=r&'V jVcӦMyL"bMxnR꫋Ba!-Yc$Ť"ʗq_֓Ř(ryhhϦL;ՃJ{n{K/xk} ~z8#jqVN?5VToϩz=Bk:/-/v`A\K[׻Iʙ_%˼c ',$X4AG7ޖ-Jbs)܍T~%^k*(Er0=5ZfГUsS^c9Z0M|mzXF΂g= 6oC$')/n#;)487bWF=ј.+Iw.h S$o3@Yl6֕>X -4o7Ihw*U@C& CRNh Ip,s91z%7bT>,{* LY+fG)hw2F{"-:Cƅ0dA;G') ח0\_J:LrUj߽1 YL< m7zYY*@0s3tE%  F} iJ9"{.GɎu٨ n&V“ kג)Yvɽuat^/nY@\S\.?g^启t.RP+,I@TJ䓈>*>qNº,>5F?ωybH;zny8&2;Fsnw3ֱ0G-5ì\ݻwi (Zvt:dYSkaHA|tq}Wv‘vҦVξ\ _5,-vo=A bw_rL$T,xR+\mfI0X$"H3<#] $f{ࢋ$SkTݰ|ŸŹcv:t7)V%\8kzg w#2҉QkNgjzfIZ!:d-&{̦K255CiބT]`H-IڴMҴCjdADF@FH~m%ta>lڵz8bKhMƔ-N)i#S5Ʌ"|ÄNڕ6v抲'k (na&aP=eynN9NҢvmMGC'*Ĩ(mN@ĄHvq103 ¹9Bs58lFcfgJ@1;`btGi CCugJ$kM߅(E5Rd~ =kϭJ,zP[>nٯ TՆQDnB(Z)V\]HO[fH%ۍ377GZp򶽊:IBj2KV f,־-r@gߩ)(y^iJݞWe43t%_W?*qKJצ/z,aRN>w1l>I$b})ZRpAQ-.Y{`,@=aU^;<[x&Vf c aLZDc!6XVZ {gm¬BF)T?B7m<{elrp;H BV\eS|,4sxlYSLi4k_MA4Mڴ`!,YI !eIbm+Ҁ){R8:@U\iJ%tӒkⲻ5!w-owq]XcL839 CtR&ruS7`LҬK'i{+PkOc1D XƢ#DUTT`Jj?[b55>.qdAðGwoYuli T@Hqr+VV FFwnSE!amw3wMZZ VZ-e {ɇ_b玮mzzpczvOPQL;hRy5Jv*,I2ۜ#R7R9,PګL_O|Yxuny5d_{p[^ ÐJ34M͏ГA hoБ7=Rƃ8QYlk>>A bĩaP%Mzr QGI8ö A2<\gv (+KQf˔I3@Sc,$EkjԪ5gIro΅ [Z hZ^By3z%b2rxsz͍g`ǎ_HXcغmK~33MGM|b nٲek!웪Y Iti]@g$m:I{-jF"?xv.: f#ÄrȀg:IN < gzRg33}7g ƩuٔVw\(tN@8W\!CƋS 9HEU dNJ՛@[M"!afmP\z ({7v*x(BW^)Ek:iF栫E/Z5t:XF('M#EI@krh)l :9pי& p²UZ+4!(a(%t r&3 +سv|f4MٷVbF҄.XKV5s.I4<I+X{um•1Y`E)"^f M-gLLLeXI@=raJ46A b n\MWy>Y3̐:穴&1XC'EW'{'; 1A b?xؠ43 (A9Setj@&Ia)CR,_c[J[T e(@TsHCEHN=Nk4!͒"R).3΀VSXYl IҬp"T.%K%Gs&GKOǏcn|'y~OKjJIG`N\+.Qq,Zc8uYl8[n\wt:bTa6JU&m玐n"Q\IsÞsك=x{b]*CA*mZ ~=‹,{h:u3k_#a1WޘFf$H$q\Va5Iu%Gt쭛%tE;7< 5NAuD6NJ Uec\BqHL}MWASەa%s*ew.g zdl)PM)#H}0>β4BSyM҂1ǽDO#2fzNNkUQ]s˃}Gn+}5=Sd>1Tv7E>ёΙ4 R 1A b?x%at*0H}L~Z@)rh4P6k$eD!jhX(j2aXLDZm@`y}j\g*a $$LMTJ gƳI8 I&rN11X7zS+}y3߿ A)M^IVܽk]^!#ԩQQf[dw`n-ASr X#yVWSSS=::]m2Ta+#貚 JE1#ǎv:$Y,deI%}Y?ce<\ Ae&nw8*lYCÜqˀΥBL /\+c8;;g4 -U;̙cZ)Km̖Қ$M9zh~` 2)`f ak@n$Iz4M{fMFUjJc|~)MSR+ZN']W8#oItϢVSE0VLNXG766ujpH8\|FyccH ?KS, |Ţ!I,%ڹ̉|7MmEXd= 0:q ?] 1A<>S,P(R1|b)@YЖT) t>Sk`Y4$h5:Q, 93ȄqzZXno6Uj5XCC0{V%?p@̞=pw3J <2,K<ԩblt5evZώ؛/FL8&m6]wu&eGLsj!"Mu%0:*+t"3=to/܉ٺ{=?% j2 k @fʼnkVRŵ{|Y( ;. ~ IDATtz $2'IWqp(vnbwltQ(0fPJclcWٶL/[˗,h%'8`eH&{vcwn݂`ڕ+Old Q9cs2G!cެAQGuR9~ w}d|:v.N2Lo9ng|Z$9Js@H^k5f{ȽRW:_PeE &F^Fl%?: zQYj A/a2\J\=>,۾ Y⸎zYMӴ績M/v RcEι~G\5wۋgY庖354RgsffVn,MO_?Mf=/zN{n{ĥ=A b8y<|P&T F(E`8"VZd4ӌ(e18:Xgςf5~2c?pr|rYftY%!Vk0F/IGHu g5"V!$6₺{)`LJf0o¥lз;ϙT,ҳԪuq:-p-X"[8;qu#˓,DZ6vԚ5QKbG?wMTI)cw/m+v˜0c%GeW+qClT0gݘoD-LPcE[ Z&4vG;''|`,0? bl #98VAL=bγ?|9jXjj ZU8#2FY&pr{vv-2| ! ,^H} a׏eUFsARZݨm[{N7RQTRry&ʃ~  Aʧʹ8/: 6&G.¬E'9ȇ +3Λyגg9>ft:[qѤ: R+(OVz!åSjnW8 ABIh+lpȑ#4uU2B21ϝ/;[w|髹vK'OB$*_%ܗU''cǸI/>i?\re>p/cd N*Fj Pbu; "mi׬8>lA2ͣ@k `Sk7,&K?m^C73d8d^1nڮLte2b0xw!R0ժN09AWb2V([ҲsLOwF)EC_: kY;uͿ^@NU{=$v6 "3mFQdma{v x#-ؼrN<Ƭo`\m-\s)ұq;7{/d$5dӦM/0=5͆-p8x >l^ױGkAd'=F@{>>oezj5oy'7Wb gLNNo}C?A b)gwvT!h%rZe!3("`缍gS+D: I-R^īa֚\nǠ̑tE 7ĠUUj:ZFZ-R C0@{2M; ͙ZqnÇEbA^Ϙ,b1^LԹ|7@dٷJT#" ^rX+lcpBuXc -=%ChT50*Z-H9cĕwFux}"!0+Va<u>VQ5Kd㚋8s< OPqYNϦgEB+M5nr:\y!&ΧV#/ICk[JA"T PK.s6htt*00aPYڣKVQH˜Ur)JYtnEn-h4H҄dareRl cRs$Za $P“2֍)i_.cWK/E/E0' *p_N}36gɐ/я~Ķm L^oܢڼHRj yv],uQ:QMmP1%g&i;hYasҟR*̝NGFi(P7ѓqə!ˌ{ʵ?iSc|NqɌ%,QcDw*^̧/]u_*O{S Ð7;ħ>Ə_wmmLxf1|_^{mO>~cr>mw{lmݞo+Z{޹A bgJ$Ngth={M0bѠ97KfSmw+Md(+̉H+0kg_ *qKvWiE&Mfgf0A,ayÇٷw_)L!A.h&hQI\1ˀ4gH:L_W\)kH R\x?km9ַ(.E!q * M;̐%;AaSaKR4DQL7q7A5_[ZiejNRZA^ON ECK fgֵEڔH /q rb:maRjTոA*?>P/7Z`>F3Gۤ,!ɺY_3> tF%QѨG5 S*lVDe9rfq(0/khe_+qTQ_Jz~wTRq+s0Ad8{ Is@,R7֊A"'^r$/MMOs!"_+JN(lR.N:y |wE9ק#aKyLPʥ0,Vo_6JIηgn=yw߳~c7gbhhJcʼn;E 6lxnq>SSOٽ֞W|o?f}|_o\k-??7e/拟"ϟ{S7|ȁp׬gpr=0u|ﻟɣG?>^=S 1z<|PZ}V\Ɂ~@RٚZ9?gȀTiog BEVd3Y2MJB|h{oU~cεԩs RBxEBH  "4}[~-WHhz (B@bCHB <*W*U9֚s?s͵>:{5\s57@ys j$'Nl`}c>)zdnj~Gmpp~XкҒ&& 憭uX"Ґ5,s,wiYFG0G|asCr3E,|,(uS 8kƴz~o]MƠ7@#Pn\P"bZ͸FmQvb_FI'u{Ykz ;8njP uS5blD,.4@_/C82 2e++XqhtJ@#rhA=LvDY/0(w`yQ)1L3Au|bШ +w,p#N)}3bfep^i8Q9X=Pa%CRJ<0Z@z>Ќce+|6`"=+q7ވ%)y"@$i?ISy6S {[6g6&lyVMou]W=GA2kȊ!RdQzR h|DISob9KVWW~b=%Ja̴YE;%:_;cWVWpٳ/U^S?[nOz8y9 <'@+~^?>ܿ|c^#7~&<&@E|o/pwg݇LBoI9mPB踧13ڿ@(0I?@b1,< CUGD݇Y\ZJ/%R@@Yxa\BL&H) %c* d:>a4 RU3iGwspuYI;ƄZqC#ڪZ,講^Ą,syk#|cç9Шb KCQ,@ Xp8`?9%VH\Z,z3gKKCݻWba/ŝJ8O. :R'WBO&f4,($Ŋk\#cey JbȸD#)N}KB$Z g;CKg$b nԒ;8Hh71ogn.j\@0LASЇ>c|;$S<2D رtx'5[9݋6rI9[M# DpR47vtq.zU=K;i`0@a2#6 \Y&@>E1WLWQD׺{tgYsd$>w9ʁSSnde_[@^ζckA?O_iL& S>w!kcv=#{KЇ>$ >g~ ~wu]#ou/yv/[o;>.侗zs|o]w8t<x3._<^KN&,, J͍M8. )ٛ@^&!͑*ʱ#,4MR2WL pw3!D}u, ILu5ì/Cĭފn[V%\|bYrca4W3+,zL\l_9c̄eٺ.> " }Q0Ib{9F#% nHP=X__G];Qx4?61+R_k/QkIܗ>͙6?YМ婪1n ` \}i-jfͲ JPd'Ni oYY2{ZH$n.|},PxKP̂|ޜ/Ę*@t:v 9kÉ1s$eI&Zվ,qF{ HG\U] q3mBɅ5BYhB[i46uD(>B?th{A'1~y7){dK;{u.ghˬі!H}xx]d]ފq (W nv_=/+Noop/܀O}oV9s~?_/o=.侗oy[~~ '/}nO8x ^_|ŋ1m1nb! YBB}z6'/YO};IsgރI]crBp5jh*g he<`A' <e(034q޷{9;ܗ\WVvb=}D+L@D/)Ayx2#ڻ)=BΡN\WCRZt,zOυw4hZqb$!SHQ1" .i `\^Ν+87~c{Ї>z5FyIM49LʴHLXH$f @tcUp)3 ֻ.H1 Sֵs2OY^fq'rRn(CmWO>Y@ٳykVVVltqvoMV IDAT( Um82KXYYq񃘕#;щ-岼=; k ]ȿYh}?O^-d!柼}uˇ矟~Libji:saeeǎ%DqmӘK4n&*SDպPh<%"3UGWf,Gz d&x y( h42`2@).j Ur89b 9E&l[: 5Se\x#܁{u6C 8bHk ck(PY@^ϒu,/c -:ͳ;Xee'Y~ERfrѲaSf3p,402:s6 m`N2Y%2ΘFâfX3[-C41۴&w:ֻ+7Ʉ,1 $/4D9hƎY]uk>%n&-71L Qյ$ A\P <ۂ-+hsA:@Ά-3=`8(PuZc&Xvu*f0pp]äbs;8p(9zU@0*T RMκnpW݉rPF 3d.\*[E~2:u=MNޣ 㡬iPz' uLj5 kMMh㒢,nɀiR#NweckR)#5lP $:B>O՞Cqgs`PXƘ@p7g#pK-Sh+AB9WOɼH"-FԜ5ny,I@jހ,zivy,eCYzF)N1ƈd$If v%CҎ%IL5o9O;ene-ʀG!NiMo߇x8'u8s=ɐf#?ߞӍSE'h{KǨ UMl,d! YB[򂋒aVkL'8p0ԖThyfNS8 [V!̎ a?%2T-BIj)1pp#f%0o:Ah4]wjU&t}sIS666pcc4B%k*֨|[h\Di,i$zp|jYlRMO=/5{)bDșbEk#<&BZ *1.\Mq;M${2ʬRWƍRZ_oΎkU:1j"VN`n)w 2P5`(A`0hSe,MKKރI4{+vhcJ%n HiRbU&>6&{ `JK9'{D0( I{ qMn%a MŅRhPKҾ]2^8C _n8eO@4b1#\1ՠu$ŷ#,Nn2N.^&KC<.JoFNEFJf:smLqΏ-k;LfD( J"3B`Et䌳Ԗum99@Uw'Hv!/=@ 3H5FXE'`b4Yd\.jQOϏ Igo,ݟ#PK;QUYdFfwPݔ%k6anB%@8Ke2V{M x8mdY܇\IsZֲ'sGnօ&Ǵi" 6'3M\guu>˲ܒaDyû"b4dbXaJ[C:a;W%5aTa@Rk)y0w9)egB+KI~!uNs9of2݌#ݻc%rL!FK)1D&@Z) n(hT#eV`"{Ч[-0)~{c4A0@-gK>@0 Q0bu.lll nl?6Gcn @.FF t1!CWxeePV@vqy#|)y/vlN3Yho=81Z󕭗dATOmȀwN\;a {sɏuD(A0K.s'hǝgDhKH't_Ρ',k@ dm£%uTrrVk ࠭9{}w$;4㱬х"ӑt(I +̌:TV?wwoY9DGۑfmz!8ss'.ɸ ÁC9"4&D~0LqP1a= xps{C6F#e qMlDawKu#ҴM @䀺1a)K290;QT8Gd0hB,B1 12 AfJMĉ&~uS r^}(Y_36Œ䁲(ԣU1ا>F`ݸpu޽w< kWl%ʓO~a7#"&F8x0lj*YǷ"Vv}&#瑲 ,Io{kRj~6 GEquEQL1eIC =6cȨB}E/x~ڳ}B4?<!5ۇ—1bZMt! F[,|nPMޣ(K*^%Ǹ1-ạk`7d&v1$2F3;܃“PzG"jP[h0H_=DAuz:,8p DbcFhjehy\F2H Ef|R&L3;?p`Q hAУƼ% >dӹj@hfT;W[>1q[___@ w2(';Fe/`Zl[})YZWB[y*˂U&cUSK<ڜ`<"8WBM(|]߅t(<Զ蝣0֎p.skI;G7jKx gl͍# FISGh8ӟaixd vYzWVpωFDS6xcϼ#TUHĨ51j"vA z}{hkZ2NqںFt9N+rRoj"6IRU,*w^s琭-'6pbÓJT;1>|>*T: {gH$VӉ,23ccV`)spEJ'yvD&amanII8{Z ;^A5ZfUt4 NՀK]ε~jbzͳ,cddnЦ:'[RJCs YBDN}7/>fb$bx#ccsS@Z\Uܚ11Ϯ'ʵs4#•MS#"$7ȒB2c@V1/a#) x"nET&{pWwJ؆IL`:DΧlNˊ0G ymud@,l,Ce':¡`N s^2k 0I.uVG`y# !Y]]s

tzhSWxZΝػw)ꟹǙv,2e,t%rDP$x+GrZ h9;Ϯw3o܀-ȯ&K,%-j Wzv,a Kfˍcr#}l! YHWN}$V"SZLrZ4(L4srA̴ Dٹ#&U@GLph";,'6P5 :4h`EFɪ:oOb: yk!.YBݙ%S*)NҌԹl 6[/2]\ Ed V5US!{BxeG(Cì™!j%"9~cj"HJ#Y"$ΒQ1\Bl[,l N'y6:=&Z hx$eW[73*(x\f=73(%e-"u]w*labS:3J.d\jjPleyY8uk6N8'%oN~Br*"{yLlաZX4Oⴏ@hB;.{s2u3bJh# K(X>~h{t-6IOdE:1H+x枲::3/d! ir=,PcVW,S`b='Z׉6\#-uSd6L,v XYމC' k]PA0UpM$JޱB3/60PHpJ۬*v8‘kKƂin)8y(c9~8LIԸivn'1'n.׌})ZOuI~K(2F$fAԂy Kɖ̔3|{MȒd1^l:t\H\Sּi\#evivAjC8zuI7lܷn. ˦3d5``R.D@ l(j9692oI1`<3K5bLr֐㼇/ CMw<2GV$REе@eқ$3cyq#!ʭ34q6G6ހĊƠ.6݇7<Ϭ͵S(vbFzZUv>,45Fqf M_G)vgu IDATYݹ{<67FCWe{m{!%ƈ&v/ˀwgd|1“80ϞgflS'3cfa/s@mƧddg;̮3O1Ό1gƭqHޡp^~! Yȶrڠ4mXui1$9T`Ǩ;h7q*b Jݜs@cclGMItmnl".esqh u a7`^iqÒA3(]̪HY_z9p|꫱9T1qLYd'i 1"0b8*4ʚ;lFu=ӭܩR1/ fɘ ֹd@{f,CgI۱${ FE,QUu8͢)ט1ʽYj$M$J11|wby h.* {셙^$FZU$hrԂlԕͬI3[(-Tr81v|W 5v-Y~Tf2xs0B`ZM1XPQWaHTfR)&Ђ 7~-QTOkDmɳ 5f Rj*Tb6f>%G| q6 t[O'pH%QޣaIF*!ܗ&h U%q˵SJ+۱)i+pNB.7AhdPdAoԼ^"$3 ]W9B ʢ@3jmG88P%v?c<c2(#/MUnM>Nw#ls7KWO}SOBuHݟBjuЦ+vՓ65m95~f MOnw tҲ_2ѧҏvo|8/׼;,󿐅,#_SZ`GKFL6&e| 4ZRre}rzn 33< 8 4Nr1V3r8|| k1ɴMXn`9眃44Z 8cO,,jv,yQIdi"g")$e7 \"etp 1p@2i_5đ@GUC#N5#hQdf&8AnvI$sR7(]D`B`Fp1JaL +{)F+!:bā%G=6^׉@!S)},L,C"1(ZNp20XD D `Hc WN1tN:VL_ Cc ,t"ϫ.MN!F#Q٘ hYЗu9g}@f n 2F8ڠ,ش.'#ǎa&I ㌕3>%/^,}:OswUž\YKAs~~5GS:J1f@s\n :íQ={8s빳u@VUv%ɭ ev='gA*!Ar].wu)27+{}yu3P#_҅,d;9R(I!O[\+(6F'mO\iVUs~4k" Ʈ]s':xud7 `v*\;#k l3iAjt3 !Folh OL |'R%cm)+8cZvl|9:Jnr*'+̍"1 s>+s:1*v\YCu:I 󘽨Rw6"mGD9){fsIu9r/@rX\V (rˢ#B]թN=˜bQ̴ܲ?|Xqs 5&-{J]4XdX:1,1Y2h{ĜJ]lgJ/8+Y:RVcl;t޸M Q|ޕTMR~̺R{*/:p7>buue>˞lpg?1)Vy/7߂K|åiy2ٿnݸGiO}~ow&#xUW}/rرc5bآ-d! Irڠܳ#ɚʴgEALVQ΀iR  '.$*= C) $f̀i d<yʹe*5sN:UN8Txdp)MF-#};wR61SBD*-&YJsʜ@оX23,+7".'۬vB]5 KXjZlg]CAmP[6ld6"%R)]˒3 }fFv?ZGBZIyqm3c 18'.Jqpĉ9r&`ޑð?@S՘ye " J<V%)9"k '"&dc'iħF$LC-$6%,@~ e=VVVR)H,I9&UHXXIcty41"2}~3[f3 uˮ))HdKN# dH˪h3:y>|'e̅d6 Lo`!o@y0|C\w%Y*@X^ޑy?6r}@Kh< C)@Z"kfiދgXCKp1MATP{'}sf"BY([a]5a9FST:\ ?~lq=΃AA/H2ol]WHa 4(Q7 js9>K\у%&`mmw}ir  -i5hK"sݶdab4iK&:k# \K WU(ٱgta{' 6DXv qCNF/G  F( b *9kXN_ CرcK6Y-zN!!vl1 5|o'M`_W\p#!F+. n+g{<?\+?}xK^g<2}Ou53z9ߋkp5y.\gO y=~׾!w~_>i۟W;nƑ#Gg~+^}wKi{~³.}.Yg%w?%y)G|S⻟x%Ƴ.}._~ ÓuiR/i8??s<<;.v%+³\ݿ&68rQ{^>R\gpbs GWWT {Ā&{#Yϛ3}Ώ=޾Kfjl9ov~9}ø [}'OlwY҅,drLR3w "-{oY؍I5ő5@anF˲zR#A ai0 @Fp P:=%y+%C+"Fgcuu_>dv<5Ҏa2$Ϣyl'm7y2H97gNUФ=/݄~#K_2cQ<~ꯡ]??0&׼ǛO'w~w_v%vm7މy>v_oqݸQy%>u͵|⺿CYx]3x%OM7ތo;?o_?u{~Dzoݿ%_ _B_jѿ /xxs?_swG>~[k*e]J|'?in;t ͏ /7/Cѿƍ_x/3y)^w}7>~0׿ W7.{_>B|ӟz1j/'W2Vn޼/@Brr9mPBd &q׬:S|6hk(\]e"aW]ɔRVhQ*cp0p8PK绹䮛!T16z}E#Yl#uAdJ]f.'iB1zھI#\xcp$DB2ΉJJTAdTSuV7j*mɥAd+}KV>Le'$4юY.GVS?sQi ^(@5eL)35z`VGz(^hƄyJ;arUlfM16rm*֩_pf8}w]l9jcE#U=ƴnAo3 a_˲A `LQm]g` FFPcC$`&cQ !J"8A'h[{Rbgj$B@7kb&5ڈ7-gaG,вrt:m3۸~ @n^-#[E-Z:2^*W*a VwM7_'Tpdb5 Y kkk3 q /Ͽ\#4ػ٠4<;[O'`< yE;?qn;BM9§>y-n_h;މtޠ/?dk#gG3?JYe7:̩ʵE YAh2$w= 'GYpΡ*$*2Ő%]Ș$?PAB! a3\ppHvXnTahWI }SBh%E9cAGx 2K^b"3:$w1F7+쉼XH?YAiUt[Jnprb2DԈFl1!,<' \O> DzXYYAUF-`%OXVu=UX(>vvW@G3wCrNLQ766N`R&' J_bC%E8f["Bt"E)KS@8MTT(HRڵ JF8^_`%> , XZ^‰)?{oqw~߼3dAH$A)&%-MJWm[ײ?$1(\FAD"p_rEpfn议;vI ~4ل̦cLLdj6Ǚ>&Zh,?y\*eĕY2I bpϗs}wb͂cvH\76C;baƇ:V B8*)'I}1\ɿ)7kY~72#ϲ(P(Op<|p欣 x"R,0^1PS0ڹs'-\|+Wx_dr4+rX\WxժQ$)V/|)P'],lXZ]`z~y^T?j=?o)1V eO!"$D//[kw7?msfA5,v;kyƏ;`0^Z a Ai7MG)lT{H `=VP3Z}&HU!^)$WW[`d;Zy?Y扏6FSRPM`3c##4G,,.$y#|&2(b.*񕤵BRcWZ#[rx 2:-I̖Ιl^˹ϰMREanaxFc(UX<~&.\Kq@ e?ހ*JF༣ŅsW\qrۍއ>'YX9SUbTq+i]fa40F1&wQh)(a s{P.##2Ok9YOtTqU{ IDATtW6lB+b^<aYl\&0F!Pw.,W,3,@lvs>j{Y-SNlC͋4FE%=68]N2Omcrhwmy_TK =W]/8f{=Ν=[6-ˊua\ o/>SxCJ6dʦ> +P6x+R ߚͲ~_gr{ꟳ]؜^q[nW~s9>{''XY^?wٹk'^tGd<>/5\M`iim۶qi:G>l߱ݻwQh+w#رgyNmwʿ_Ỿػw ̼e՗U+W\[[W|#o~xٵgKKLo:횝cjzyM7`%#VVWβgn]q_g-;f?/jv J FaBOZ'59 9R%JkC Ld-UFp oGލ7hT8RJEG8/>3Eg`k꽧^q1?Ҋf~26BR%`.D-Z4/ ǡ5>6K.+ذj~$BVd9aZZI6Qh`JxZw^}AiRk5kƦE˜`\Ǣ+e.Y ?G2Y=OVg|d cH]C-V1eUtv9xGh[/Ș㩑m mӓ5={.HQL3_|/pf2yG7QI3fll;#) 6_">"~+ȗ_^|]?.b4F)]èD@6pR?KR&VhS$3r9mr_e)UXmq),}E(Ps*|F!2a!3"_FiJp߃ǦGNd!,k~ZְYA[|І$5W]^NSb@rsW}*/lo 8g>'9h>ۦf8s ۷mg~ymXn-Z`~q=;_/s26>λ}}~/+++DQ.[~,~8Ϲuw~?{Oy9=5<~/Ͽwf>?~?ߠިΏ8]ß?y~N5^o|Ic;hW' Q9  ѯ{uo|-Gov+׿+Əu_OOλ_;n‹ۻ+CҌ\c} ~ß][駞ox$:*O2]SV<$ uZ Jт%Hr8?(|O3a{/urkB "$D)O{HΕW\ӧ9;;:BF$^AIF/66OToA.Xqt,kr."lj'mҴ?hEl x^4D Iۃ*ښV+M>B>F>F{O322BΥ2nSlIZ%_ٔ`V zƶo>1(.d{F hrrb现Y 9^XmȄ9_rフ("DE5r`^0 y!J>'sbWLc`r fX>Z.}%;`gffN8Ad"հ6*pv$N2r njbǡ@ű{e.lOSua_]Eheh6&qLTwd_cy WYұ19[KbB^WR5G2NZ'o#F[8>硐[C^A'e1g8/f@tD9O-A)mQG`n{QZ{d{F]wO>sk׸Jrj5,w-B!FZڔoyw(4beɫ򷧘#<( &ڹaTnO]>XIgOx콐7fy?R{5:_v;.m߈s>zg?O凿OOt:ď$n%Gi6_%FFFnmh6G|wMO.޿17[^ukQ(|D!o',|)ϥW]8m!Sq,9\r1?8RaZ^Mڣ;tރuDFjMq-@jH YppG\F ǖ;ZҬG/ *$\p\{-ꪫK`TnEZ-XXSO<QxXX 5T=8{̉$5H9N1gz N =ݤ98fȐf-+ /()ԵעMHX]Yθ}>&#uP"[/7u(g)s+89_9G_ Dq18\yK LuIڣv8|)}*ƠC_y%ʫ{v$ǩ?Gg@{Mj3][[a]VUJ$0p/A߂A${Yɓp$,-N LQ7&"uZ} *:*(TLp1fJ{+ k)&/#7X 2Jdʉ$gѨؓi% s1:iNO?cBQΐG0bELic\ϲw^'wmέ٪1r2M 5}LOOl69V|^׿cEMk/)~<Գ]+7/q~kɟ~>> /ϜÀFΝwc_{{wq9j܅ǰt8lP*=}l6kt;qtUUm\yR&E֑9' yM)clnCB2O?T*[HbPw"G14EiMkX[:桤32̖v'6s9=8Ņْ@*Efi0_##pv;LU X3F&0_ϡx{0.mamNɓ'Ipc֟"EN@)tk 裸|Sj؄K5)V#(:z&Z* }uri_Ys0VUCE蜣Y,Xj-ۼ"߈9Sj-opؒ'xP[Ŧ)4&}VNGYi/Tm/WbxKQ;v,@8BE먑p5O0yp޲6d];.+$(Z[ w6UWsW,T*}~~s`K:LLj"HT,rׯbjj 5`JeHҼ[=ykX+Q2p ^g*%ʾ|%'EZ4L_^XY^!u *`a(NzszjqΞ=;XK? E_,u϶BST7fb5zC6 e\/="0eV[b!g+y0ӟ7{#wʑ??Em|kp;}/yq[{HEz˝-Ws eRO`[aBdQSzW yJVHv6 t(Z)j1؁"4Yj(9ƫt^yzyp(pTsd1Q &7,3T0wFFLAsf4Hǘ>OvI^).^JxՍkHT.Y qk"ދ  e3l[6=.Flz@]u!ȿ=G>'ꬴ,15jQML Y,<ᐧW]ja*$@mZ .x uUO,r|K/ bs=跾skZ}׍AE#iu! s+9~Y01F^ע@Zo.X$ZzFd_^:x9 s~Mhwxj&㻈6ț?={QD]uuq5|< bD E*qm|``eo\ upwXޙޣVjt:Q*U|"O3x0nʺ'WDuX*;z݄{.jzX,y_(, ZkHlŬrmeZ maƩE u">i.W|Ar 4;oh4[Oǝoz]юj23uYȒ(kM-޺DƖPINY26fP GpG<LEz8ZoaR&B0X]ʘ*֜EqUtiAyyA i1" nڑO`Z+-/lHҮRܻ|ooDEQ)Iӑz]HR2T4067P\Zط?Xd++8gZ( ﳸn,1;^Wy %rnHKҔVg4#Q&G gn/R_/c.uVw3 '9>{X~¼;ѯp̟7ٽ;M%TZ(0JS,aN/$A_u5ދ{}w{QIO,6P式FGDr.[oC]t!n|w2:ef'G5Qf,.Ϝm 30a|f49z5A^Y0Rդ]CcQt:]^oPuh1{nٹQB|xS8*h~UH +{|ömpᅨ^zkJf{u> pk3z5Z`&DzHA>Mf?Zg v~Μ[Zű\]A=c3"%ׂx_+vTlSr) Z+lp%-VV;wdtl#yƇ&AO&7onT\,fx@+n6ES.Cmi0AAD۽9“ӑ_8WNٲ)J(wԫҐ* jxY;+܎/r&VNAvuBWLLLrŗϳZ0Pft UyRT؍3o=?_\d"C mZQo(ưFw8|LHͼX +rE>'{D)˅OL"#Q<({7)=B3^a#2LͿ[ˁMk ˁҺ0;~_0!>U$:GuBdblZ@)8x-}z]t<_#y1XZYZf7Ȉp \?4%)^1(V%I Ǭ絯GwmX^ڌNoK(fƷoҖPr="W"ߒ"oepn3Q^ωc̯K@Z ;w.jX'9+\n3XlOz8|0o{`) $U{ASOgļ(-EYԙSĢз!Kd?##pA[ފ_}~8z˫#L/+cۅ';x 9" QG׵A ׋QZ Źٿ8LdAmqbm4[/忱8%⥤}QJS0O@C#`f%z>94QLE߸pv8^o̔R4M&KK%8 %G60g+6x`nxh0::"Z:ǎ#IR#UT%uPҸ kJ2B)Eޤoqߺ1mbK[O֨c牗kK!ųn"'iJaEZް|:\W:Kq6=51ŠzO<т[eɔ]!mUQ4V5(hCmjCd mUD.ԥd.+}P܂zhJh+3p$e .SOgQi ]w;נ}p$!tmjQL)+ ԡChg?!ٳ6e5G=S56~߆|1LZw~t񹣴bjPs]n\M[ئr&:gY.sb0NLs=Wc^?~죸GGqi*F++p¹sJ_:xe5_ymoN k LۉcqjQ4햍ė*/#VV0 ‹z=OCXL F^bq*0tz=CF+b ya )Z([,* Z\9ʳC"b]uFU 7.cyyYj]Ap廪[]9ARxgsbIoGl;ʟ~lK\ |odB yU Q=lsx0QӘlT &wԲ}r;&z\0_()W# R%dYZymHWCYفH "chja# *g9,3Ԙ9/=J߮ 7aΈJc]OE똨 =77ݥL07Jm*,-tС$"{ Vyc034= ssGowG4 QsO}yGB-Q3u^B# cur/&(Ck^e5G4kMf##KRx4+CW߼v9pKB IDATYZ4ѻޅ6nGr &=?(ia.ӬgN U ?u̍7: o6-ʱ6xgýBcwOş=^X(B5;s'_|[ea$#EuFGw022Ojvv6I$ <$\pa J/;% tTC#@ {p蔟s"7C61ኣfviR(/%TXЃ۔a-++cחrPg=^؞QHp[`(Z.Wh.aͯW~yvyzL$ioYj1Y9[̃ХtֵeI/3gcfl6]=|ѲjLMj5\}P&l#7!U=~yraPJӨ700{AV *t8|}JLMrƪ*rq+Z_xs Z)qҜ)qE/a>qݷO-"7rE&?뒔eS2k4Hݰ}3LKK"\X'C\.O9prEJ2AںQ& 7I%o/I0~2,A7&G5 "助M:$Y̦r^ عU 8xG{O/Q rS:V8[nŷZp:iZ^1)}AN~SO~B A_y5U^zhJ6|WoCjoH,C+vm;7iPNN:2ژ`1fO,a]ø?# QwD.C╸C÷$Iv{8nhcLD9jN3HDHz;˃s4\voJ+Y:~Pqt<"ϊ`0^6;-KʖZ-9O$HQXrQюd,|m:@*ώi%aʣ, ,JrUW>`_>e6WZo靴R\B e_P,( 3Wjuk^aC_HE(ۈbF-,6,+YMW18`d0^D>ʋwe濾"=yO8y\tITM_]@u>"*wک(2@V4'YppNFfdT$8ʄ!Qld|.ϫ%=C,.-iԛ, [z}ZTN9̞Whe0&1&W^K@SRk/ﶺ1z#GH^eY$9[ejY͠E. O}p I0r1G+ P|Og6e‰#,ZkW_Za-k?(ak{s=/qjw~LW^W\GRҤ΢|*ܗ7yUSnDo9[]*Y-!҆hhe˰[U+UP(ױMz->jgEd|w`-}V1ilrkn)kWgfP_'},O(ֻ^N];=[j^vw̦"u/.}P9Я{=K_c%gtq.%2fs(e0(qJ4מ',a^91w782rNʗadVUmm{9pŜ:uvEɉq%PҖ ﱙ+ R%dzζ W{4GWr8.&fQ2/OСԣ:fjRc<2Y@ɽ-u뮨Wjװ֒8v+rY3M&DQ! Hh?W-lN;p {F#-"zy2_:Nhkxv`oYڽccc(haSqG"P~_PiJfMІNhܐy01 R'1b/=!yxzp[\Z 7]wIOɩt-@I[qh4ƈTKbefttn-&aݾ)/%^7hr:|e^x!92XZ .E!2ֱ1wމ?Salm68fC ^eB̨bLٴK 2_zȟs)sO#j-hF63RL'd#ARUD= aKKGA9#v)عŏ ceMerNȁȕtY>4 )h?P3w.YhqfƷ-v*f͕N-FnNwUo sa?Aܣ/)T \ҤJ{4 -ч.G+-zC:{ŇːeD&f9rz`r/$\H.KݓOz O~F\kwno~R( m嬿B@(Zz tWΕ,\}5ꮻd+,31 hCT#eVU_<~1O+eˤt=yVȒ T x첃l/}gc7/GwsB1g}ee-_yv-kPRDoQ_.l|p3UUs^Wn)3`@LT+P%%n]Du(R"? (e+lD]n 398qeJi6av^,K8MU@}#ӧǶmhnx4Gзފ?uJsa]jw˧i֚X5 ́f) b>klamsgXqˉԁ qgNc?qCKks$YQJ̞DQT;բƹ79ޚe]<('P`g. 5:bzb7 +g_9-~n,PӨZ v{r|V6%M{d6ץWw8EKiw ;N+ hEWfmKß|Fʠ&1dֳZF<48I p揘~Ȭ%Iżr^TeLu|g =wZs6+r*ʒ3y([(%' ٬,4J+]:)˟ S* P/vS9d`VWpbbZ4ZVoQ+Y@Ń&4MYZYcpͥ]c7.fGhGٵm0m/^G{"ES0FQ9n %qNܑ#$(^ ë_6-V9Gkm >6ȄrM^w݅z{4MYx!߁'(RnwwJ)ըI1eL aRqe͔ IjQwgpݱuen-‘"w]; ctF@Q3 h2YD8v 5?{ij].'R8[Hq3Qlf Pr(e mHm3֜Qa*fiIĤA]pjN|f.% ט /sR:Y3'vW <ۅG?PAԘDqZ)s*l d ~@LuZ`@ jg]p5 T]_(8vy^l˞ S#^dS*mc8Zb +B¹DZ0RyzVUpg.̞D= 60 b>̟{sy(TִhCCiTיv**lم\{+k0ohl$={wa cX/HS#+FaLuu xpɥ뫫"{Eҕ"$)1ZO<=_t0j#pΑe= O;w4yI? 0ձ|2?.?zu"t襙'[;f"ZhEº6 c0-08NZSTstxW\cFD'25RP):yYھ$β֡{4 Ja~C]~M=#x\ʉhmBۋaTZ$w#m̮e5G/܂y!,{!YԀ)L~nw~勲Oe~ Fkd:.-E~?~IGuf&wѨ8L0(]}RJ4(Iڽj\q'DfYK8+MUx&uۢ6KXY>E˓Z ukQ>nu~ $fd0BRtj,?c9NQkX.u)ٹ{6X\\"˂P8ZKoB+7(&&&' N(v)&2(']1h/n&z U;.Z e(>[ct:Jm\Ԙ*ѤiV=bd# co*+fPXXX`}x9=lwZH+sYbhtG1ҧYmcȐ~֔c& e,yBK@ ljw}N`0yO~ }fgEz8'pqQ%掿Z Wlz|\j[wldm CZ tD.G%)ͣד+_{/#MV9;[m@=8# "oM Z:$EqZZb'SF)dL\ty/Ye0g"ɦLHm)-C^y}E#?#9T:x}F<q =^vo$dA܋e6mq|,"jnFt3j.c?Wz϶vOhl{ *I=B-TZ^/Yg/-(xs2U/w!c  j6#v@5:Zu^LT~)B}Y,^=KtdRj5vib?,EeD)6TFky;*iӤ v~_f%ȀT.P_^ KMzҾ8z7FW7QJiAXF;s0E X2V\%pɅ\[I'<r.}W(6q\osͧ.}rrbdt4M{0x:<2>RJᝣQ.Ne~Qd~Uسu"SJ2rh 7ɼLH)ӁǯtPҎLJ`zih䈰/O6 zikr.W KE̛A_wwK_X9@d^bŏ*hޓشd]F@^J/DZ}Gk '{oeqw""mj몮 ;AAQHS (C>G-l ĎF޵/o%b{Uh6)AҼSeFFd/~hR΃]uV3ϫt; TZqF=@!?~.$>dӂ`L~?4Kz5aUнw$J ~ qx^XLu SiWi O|`|+/%V_/30Z mln破 r@.Q7c0 IDAT%iBjV,hmPJh05elllehjJ==4_Jxu_sv0S###޳jJ/jo 4IIR ژ_˟K1ǫJݬ=\)ҋFLұU0|pL1a cc :KlS$t$`AYPN 2;3z(̳"q=[ BҒf 9 &'xKxAg-MV&jnlc}E: /Y >'yf㑑JFH=RLiK8D&qDh/BCJb-R*'L;B_]0&8\noѴAc{9Rr@{/g8 +!DrkSKI2qbje7$w1@UF37%4ED2^JLFnWZ0: VZAQP x|m1Y/y EֺZVjf}WaIv[󬯜e{ދzd(o~b=ԩO!4:@kC(s7 Bj*+Th3 sbQMISiK:TQu"qX`PBVo035CTQ?%cd.Ou!AX^.-ルFJ X* *h4ϽϽbhC^.䌱4v!{mJKVe%J~ $0IB#umC4GGA# .*]jPVW 0hI~B} k t0K)ͦBO =G`4(Eyĩ)ف7<HK=˿n[A2S4k6ŠgnOLr_y (NfE];Mqy9%u%}UVűch>++*? Xnؖa}mzIV%/JG}!"jnnAv\35_G܅޽u>y^no>MG-ΐz,/A$j,գد?;-NZi;:[jWg=1נry.㗭YgF<8i foWVZ(kV$(Y^x<6cP|u\-n_r_Pنnv?A8JsflmuWuRvETW*uJ[-Ep{Q;fEJ<-Y-Z-,gY\_KY @z8??Zu*A(]K}?l,Ћ: +ݟk\4m7AQrd/E(a5q33 z6IyTY.3PZ46Y_]`m Z(uÍ%e ϜO9ԄqƄOkX@g.ƛ#(Js_ ʠ^@vi)qKc"U^U ղmɫ.]1%FՃGk6 積❃\GR8%*t ?s:c}/mts=,-/cm*c4e&gm(QaCV$Uξ?ee[j{0ZQف~xM\\s:n&n&:g:v}7w榛n "fffennn~rv?βm6nVVV{_c=3LMMyCa|bS:a c[%33(ڴR 렰 `VTjj[z=x͜rtYCs 4&7v:a(a\ M0>.@(^7 ˟QPҗxH'ݔCiaLH,DIMN0F*RVT(q 8b3Y?Nq,K%i0=6%=V,y4P.ߏl#>Z/w&ʼ RQqV6]\w=' o[.I'VϲZfr2*_,m,iL6JaLJ<2IRA&gR,"0sT)yGk ȤfS$uZ_H(Sr=Q[ˤi$(>OeJ(a}$0hVw=¢ y| djvL6X]^aurfaS**.[';ywҙ?S>s[ ئ8$iR1./De4+(ߦŖ-n\[_n73Ea0}JQJT:YI8J]trl۪2g]щzβn"?y웏m:G /dGy8&y.> /0>> /w_+~~.>9>, {!S:a c[%?IњzNVcffCxAZ^Zq,Dd9L,Ty*P&1yF5CN/ᮻ`a".g\KMT*2 j@"5s;iO^\gR~_\ (Rr둤^(,(E_k81}ƉiQ =9r;^?vbu X|{o=BĄ%cgsQ恩͞"Xb$_pE}&צ!1[}ڨr]rZMF)4X_ܹW;{?ffc|RB}|'ac協E(y'?G%зaa\Je[-︎;gϯyŮ]ٿr(MRb3={E,=+ݞbLM!Z)4Ls(o>BYpA:Fj Fi=ep-BUUR4u:%cwEzIZJfsUVVVrP+%tyb\kb-ҡv~^8tHi=jq~-3A FD=&()ܰRc8X[[#ta}Ȥ~l,F[+\ٗ,\r11$ꯓcj|g\^Vw u^cL$fYX?GD}5נQ{q#~ǠZCC]E=+Iiu68r^ܑiu*` z(lK"u +Qccd)JԞ9g8҈3'ImJT0ki-ninb_Q c$bvLe'ba|3F QܡYM5s0@#MkgYZ:Nu##W_B8 }w7ns& am e*8iHSZKr훨3)FjdeN'X MZiwLNk\VC8S R /SgkZ)==h0O&dbvn?k2n,D슜sq8K\lA6z&"cgCDb~n#^ّ **d?;[bwժH$.q@Q/x892{/IҔGo??$A5[ąiRT8x _=Kĵ^A6/w}o]w]~'~F$G]>O3ϰ]w]woC01al J i:hMdQJ'&+%c`S]u^dl·4W΂f lvzO;6"8ɥ,ɹG6QJ/5ٳ1FكMw)Eˈ%Iz8[Rvr9ZmܩSyn0A><SU~epX3]€FmY:QuF7?ڎi{ދڿ }My[E&tmVyY5Dvz:]F/c_{ k0>T}˭ӧ`q K$bBRQ]4s=Z)@G:^e~#q*a5’Mhe Jw]bWOn(+R13f *|W5I$ΞJ) -OX{$؜=uWˬ|M9IW (HkY.vW?CWwķG?vE jN8Aaw=J;v~c_y_5ſ>|;vp?|ӟ77!'>01AirtIҔ $#ԕ4ťi8F9~ ݤ$n9`l`9I"ΏAl*>[o14*&˱WXE^iJk&գRoaM0\O]܆?n#wNʺIk 텩e8r˪& Z^:rIƶڔupz;1ؾu A|Ce LZ 2D|R`l\̎ʆSer`|swr _.?@?|?~+ miZ&^-.NN\AoCE7pb5ldfU@kݸ͚YMݷ?gJ+L0Ơ&fb@cɾ{ViPI2S|յsV[n5:Z39>3OP&IMkSc5,O;Ŧ+FѸ4%I6[QHĥw11:.NQ 1=gtL若CRي]~t:w59È7I!zHǜ=s+/9x8JXelluYp$J 7kF̜B0Z= su}>yPu^e;"Mm :kѽ^ϷYJ8JI]b=/tS>V?/"ǏgGY߿<|cC)ww͇>!>?|o7M>|_eÒ00u\2(5ӐK+K>7P!vV㍺ݒ鎟F^1>ᰩevf,..m-1n"Jt[EN;DocE?o" DgЕQ@g GdNx& ۬FM1(p6!#ķY1f*%p~D~O4!I"1|sE1(sK^H5GGAسFNJ㮯s&amXE]*b&ml($8ƽ~Off.HB2ВMFUkE55ŵXbJ5>!-Bmߎ6̡лv| _O> B&Y>!/% գsQ_oezQK'X\;H}z$8&zª`xnx_ysE;^:t5,igAPRiPdΑ*g ޏܜ,G9;zۿ ^S1qU))oGwNX%&>X4+|(kQqshG\Nb)z0əz-N [3o)%JO56+c u Z%W kA[)1rыDO GԓO.=ʋ;Iu̒ҢMY,9{5+! (_(7K+IJ+RDܕaKtċ_e=ʓOOO}+j0..L01alCReo-NnjL,w(ѿjUr`URl$QVP ~wҊ|)Z-X]`Gˮlq$*W &~[8dRi9FΝZ1Q$lSG/_xjeaq!oQ-EB >.+cWyC,E/N}*#X[aLZLgߗY)$W/{{? /(ׯ;fwO/ٿ?zwWzG}bccT*(bzzi0dvv>?'Ol6Q|??//[[a|w1)01{( u^6 7rsKKT))rL>+V`Tфa@vqAMdrt IDATY&Op\f8YKkmȶ˙d;OIO|',{ddʦn&8-qdjZ?3Jw}ws[w5K'Ct0K7:`L{e|EK}:'O H­ozn{'/+$n^D2FR#5MEFuuk-xB ׇ62&,I Àn+J%#5&PkaH9oI,\ZvP ~֦tkaJ kdbU$M^o^"-ܷw;o*8'r'}Ƅa-#xPܥŅ'}WQ:0l39:Ƣ.i?v+w}7YpH~ y)Aa @_{0YD|3#GpkFiaY9ºHjK/~QԁY(أ@G/YX=ױkr&S hPd5 s>2Wh+e] x=~<<,VtHs6$*\+c*4IqޥZ'j_ w ֮\ |i܋/+j<31֦$qk(bmBF 05 yGuxi+`^)M%Q  BU"O#qY_$ 3;]$¥) ㏡.ߏ~IߦdsFXō:I `[sZ[Ҥ_"{_ Ï~+~Z1<:q07~0?Cjw!!.MFmWN'ѨR &u)qң[gmc QV?tjsӻ~|mM< c hN@@RمXZ9eѷ܊zN­b~OaӘnkS8)2t;|IÓ$ 8T@F%g8"˯]m]ZKJQVlѮ\כ]) :+רm*cs[X[HVVg\2grVTdE?VA g}S)3> W{Y)u7\LJz7-zc埳JO{M͡fvbgwsפz9kdZKi=U5^> Gp|'i.y: ~֒@JwDzK_l0(/mVa]f=2yg=8Ȝn Q*ڕeTXR$Vz R/%u@+:wرWbdLRymT/r+mVVrZfnB 39qҹBN[,|ho*s7g[> KJQTHSK}Fe;Ak1w,--"i'Z0TWOZm_01?=/i+RQ9%"\ DxԐdzZË/i[Ǝp$W9RA@ k!]+Nؐ/>*=W^);G1=ztb:KRg%%b@dY HO$ڊ4=uYt95Ò'/sNԍ7 p^:KK|;-Ʉ6 T#9KEJV;9$EZsiμIJ`1jkn-yp'N J_y}ܶKMQ(uSZ 8ȍR9ʣDiTռ+ؿ ^SQ(#}t;7/}El;y>t?P #kO~žF_޴z}nDסp]žo[O/N}j&TBD'OLM`>W^ןW 2wbWWqE-&}n.+D L=(sX.QzUȈ^H"Pإ3Q>%Fuw;b@ S\6MX[[#t{B쁙S-SsNӄ v8b~VW9s,9~ O"JZJIŹa 畤/1GeYS9G$ٳAljVϗW ks௜0;?L@`8ɷ2o}>f0QK/ #3ȴc%sB0ؾ$/ X`N݋5G tL*U \ƃCU3Z[HӜ-ՓVW^Y\"~{afVXe0kXO.璦$Z玻jPͩʲԲ0=JRF]PhbbuH`*"M{rӧq=ꮻ$gwrR77 56W] ' 6"lAmwa.;Í [?9>EVi'&sq9uAp69=Hz"KZ+)4K(c;8t( GQSS].phٜtL1o:ufCaWU A6N>_l2ݹFuS{ٷ s,m,$'H}E}i)4:Զm.z]Yu2vA (jnR,.I|_>8,.BDPaf.QE=ZFGu>Y cP##=3;sṱ Wo/Y'j-9#ujIbAY){9 -r={]a !P$)rs~Vi qXTB׽;lWjðșR()(|>fI-@"(Ʋ^Os@_j57w}w]Y&}1җu?De,uh6Q##H@,~;$9N("LÌ&LŃ!F7ٹ[ɴΛ] P֌6aQ *då&˕ Y#2X~^?Фu'9ZZ>Y:,,̋îgU?w5M&gIL=\j6AiŅ,x,khԷb?Ȟun77w<8ϖ&')msT-"C&N^t/|ogÝ?{01@qTE aפ5L5 TA&Q$ _#H>UWTzCXժ0kceE@"޽53Q2fleEqq}aaO*PAZIĘ}$ϳxAܫ '7ă%gRi5b9MצkKIU엿D=[X;NT*!YTᜰiX $nEvloj~kأG|K~{|]~UԬE9BsnAkg^|*ѻvv̢MF} yÝ9};/{(ثcpK풙Y=eba(`v_, }J߼pm ϋsZgC)8KNcqÎ4|_< ՚qJ空\t8Ⱥla_%q9V\RiZsó,iK4x&IAy3M@.[aE QJrlm/:H:cc,-.ZV;x) 0ڼdT[}&ϲ]01a cߏrJRWj" ^#OVӵ<̒w'O`dCkE  3YCDc s3q gOUV@uR*qކY.ǠE.) Mq C$^hRA`V5^*rQZGT U^"I=8Y d2i(j37g4,MBu ٔts}4MAI^eC9k d$1k[9mHT8RR؜4=WP.t(MZg۶m,..E6?SW\ Sl?g^sDq$NI{Eҗ^̏%9z=Q~Ӧ ɱPFcLH$7υh- &yctxQEyo36rŁ$a9eRxߣ8_T*IpTNJHTq#ŔYA3cI$'6ap3;'ƠÝwIȱW}2 ]R*;λ{Y3^biq)sΉY2S=HvRm4H^띋a0۲|@tzV8uoaIvfnzK)=Ɵ}RaE^<3s̷XQK&EM(04nD$" \_/SI*1[sD{=;ˋ`;4Fe(xu]62iW*1"* * *Slu :Fe(QP*I=Mi*RoyNƄ4LO`}uD~ySY4kL&Hӈ$/A]0Ҙ 4qe?R^<5LNZ&J '{^Fj#6lqE˒K|"bBjV\/~oa>#(K ^B*Rw~a 4\zf8>gNd< zNދK~; JSԹcͣ,39^9STJD"% 1m 0h .-MY.re6ئ˦j(P`0B`e0rr̘p=s{ F 7繜wnӞ Z+nwXn36ωS(_ڔia34J8iQq7t;gM,US0heP sR I8LKdTTlެFY5NDMd#VރQXiy[u'^g.)\ǫ@͵z6IG$)5㪀_KYa`zeČFF;L@G 4`,u6L&5g9-˒ 'x ҝL{aGOT{m}_'kٜMɞ(-WML/`4&h: @.}iiXn!d}*M`uzMRkU@[QDd= Aju d1n%UZWV0՞\U_zmqL:$Qf4$1ShT{s6b=MúZIk+Rmfٵ|F̕~|n vnE/'ORV刳Îرq-ӒD{RQ+ttټ~K9x"2x4uMg?G֭C͍=H\b)" (mOS(2 i;q êdX v0181Cc8'TݜSa=ַR<ϱں}̈p1~m5i+Om(< FU* ,KƔnHͷ G~Y\Yd˄zέ;A)ogk'6${B4:86OZtghϋ!ё1v$MX'hۉRwvz>mgX^l¿pJLH9,Ne0ZQ%3Ss PU֌[ǶuwL&Vѿ{¾is3qYhAR›"0A͕taVb'Zj`oSjhcMѢeng,&*}FFSi\iAyNC0DsT-붱e9Fj19VxdM(iajIf?|89U FX^bvfOlX]֙p}M"ģƺ -Z+.䩜qV+^JgHSe)Sp)?Ibr.da쌑},Zx'hk˲ 5udD>GO~(5&3VW UviR5󎙵jd_jc;$7|U:mp~XSxbO;[s:YKg&s0ٞ(u1ux/w0 p# H_<|$YSI &kǎAZ'@֨ 8Gkh~:ɮK] Tpp$=ELy8JvWMN;˨j6ϕщHN ch:/e&)!^E (sLdvT<ЁQ(SId/|}km15[..zәVDR#xS2脆TxoCWSb/Fa)ym ujeGgk-d08?giR+ d9B0`i1<BC'=Y ,Gd3h@{n)(r8WʺƠP恇GJ{9,Ά=0°bN 0EkCϜsͭJWzdzR:i\>fz!}5>kfS)YVQUH:3:l[ǡac tHv^S>rBlPobIN̗ظ.4Zײ6Pfm,PAzK)n\ܐg(w K{ "i#ѵt0; }!2NrM HUefb0+fR 矙 Ksc6)%,`,I ok՚ؓ֜NٷLlbg J[It.jq,cjJ`nECCCBjY? & atBD(NPpY;='6Z,fEiMբJ dNOuīUV5Kd? I ⣳t$R8[K4XۄF <=)񬙝 UTm INJ5TT/+"T,đ>'%$=[벴)9eO+u&\kw}OTv e 8Iќs  gm̀ A֜m 3PJ7\Lc?>On2쾐M6g-7ldυ2ko86a~|@9JLWh- 'm<۲,y|/E\~3yZn[VlR9-˒\\ssyU/}#_pI_ϼjkwϿoyc..6nΝ;ٹs'<袋?t'?Iϊ`|ӟMozSuVvM7սo .m۶{{lݺ۷0MR7l 2:DUYj&I*Wtޣ_ K ^Z40<\Dgʢ" KQGԶXa1 hjY Q)/i;lF<ʪJ\L zxF= k(šEjS03⌉pûZuRBg0lY;"\MUw[1U5`& Ga`,[A!6ɫHHe[ #}h+l l},3dZ59yIֱ^Z30{1G7d!0oqk  |\OK{AQU^!$[Q Mg{)m}AVp$nq?AWe_[33G'm N͆5\{ NrAL6(vU  8 SU/,qgg9rxi$NXn/ cn .:E~Z)Val/LZ ( rt"% K+(`WHjjz1qG^ WgC)!YpXP7iu6N?NNT5Fb=E9Zߩ`Jo}VPE>`̖଀;R)@71_`aakI}}{wq_~9/| KYXXo}ロ=iDA*;f)U(\SE$)YǛ MIp@ehm0բVZ]k׷ rhmJNO7Bd>oI:ͨ ۇ?r$u3X7zc((ڂT2a!$md%ZVV;eIQV4a KQhoP/X618@ 9uNyLcCd333AjmI@VX;Jk"DUP*QzRg8&Yg9r<++Wz#4.ִ J 5PxU}Q>Oq?Ķf=? ?_Wk>;v˻~]<Wsmwp;o37-Vkս5m>;_#t,..2n< \O'~wxGrw{wuy6n8WUi&~~}s\zkpWw ݻm6g}뮻7rWen`ykG?e]޽{X\\`۶'G+~lx8r08PV <';*l>Š@{0  }m(}7VZ̍&*`0d0r<ƝQq&[?*TH:rM:G, 13;K!(6rQv\'G{UU~ы^țF@Iit6QڐZ+O359HV!sTiљV vUe)_zVZsIJ 25SS]VkdX}8_e+VNWjP-0>&EY3EIQXyZQbRk4KmIٛy}派«)M񒗾n]]W)Fj>Op饗|=qB: E>.2x_>^vWU^җrAvڕy~}-^x!^{-wNa<ٞQVHN@YU5k]g Nt`b; $^Yl/GR8TR=C:5:*3r^qK}MY|fưa:N-.`yy9Gt $EM5^luR*]D*|_o|`(Nܐ6Rgc]w@l3RPq;2c]7`0(+V*\4gkΏ*{JWyX'A?%}T^# 9LOOK%ܑ&a 7FL⍀4No]*?;8k89Je&)70 5\0 kPl%<[wsԑ!N,fqafgymwqn5QV+(UY 2-)!F;'Ɩzal%"@Yn;,/PVe`ZH XﱮJvnY^ZQTsVԮ 68ob|F.9VVVBG96Mҫ4l!TY%{[k7'}d9xp3>dqHkY? =Ẅ́p%Nuv:?(ZVߛ)ɳ(G.R},]ϼWxO>O'nN_iw?6mĦM~GckgcW* ;ע*T8F!&Cϫ֮8!edgU?5Hgӥu!uVmX$3q:^#0eY%4P)&:dzg1N-g@o̰0,TUu lp;_\}"vg|\*VG];ZKޥBk/̹0,!RG óLцN-P_"K繤۲yU}wm49nbw5- ~wR`ZYFimj*i_J䪲~[UrXDt߉] V6{PQ {9u]!7_WC{~nY\\nW>jfgg͛7xϻO}{cl޼RU%3Ӏԗ^tSxΫ_{wdǯ9vv;H(y;^%\}S馛x^>1^sw}ロ[k__رc<9?̗eG>>"t%p)>Osu}&yb;=~P~[xDhM;MЧ(*`?tYo9P. b4#Ry8~n֋kED1%8YawBMX]9CQ1ceXz*CX\QurR\VzK|響L *lRet]xPK1U҅{V>"΀tT)ɂgu2ݨërx{G%rC9S ;,[^pPF*8ޥ-Cۇڡ*v.4jV^֍祵u,`iyJ`󔕴J h`jFt񎣫 m۲d.1|!#䜤gD.ȑi4Jgx#鬾V1pTsݢX?)Ay"Q#rNxbnwR{=c9<{O;7yR&(YHV92d /jޱTiP(pزD{2i'{"O$+R}Rke:8J2%5eYTk9S%8ՉcЏh9m}=*[77'F 9u`B]7`\=`\i(=.jPZatFۥ,˔?އ ʄ+6\>7 X?O׾ŅE."~{/ٛ>>Nw[عo,t4A{wӗ?˿bee}Ħ͛y{/HǾgr׽᧿>裼UGaӦMx<9`Ϟ=3?3LymFkQ+׿"{vЇ>/׽uz=z.2zo~u{o{۾ d?Olbg J/lk 9!yX@{8WK fZ&{}O7<-R%t>Sȡr8ȑ#R/ J\!D5yzz*Lf0 EOb|#N^1ͲJIԪC+-~$v`T8bdqaETd7'JՓQB5##j~5#5%kNGhDvԇrU:''r_k7Nm (-V:+g:'AZk se9 0Zʕ܄(I՝N۷qr~{iVd&G+rG9wT9gu čIv(a%vÐ}Bs+g195J>͍Fhg-6lcGYZ^7/|1:0 }dqa0Wm ^u'1}j0};{s81->3)z^bPc/y6DkUE(4m¬?KNߧx9/uw߽汱_}kۗe5?U?W}WW#u]n5n<ٞS*$=eUWLcU\<:9LM# 8fSFx&Sg b1riʩ!EaAqTg&"Bs D)25FM55'r!U^X0=,Q^a(NeqFc͢HM5u]̆?Mw9O"39F)e@Wʘ lk 4'\Օ SÑB6:w=5>3qCT*2 &/h(!}^;g =^S 2i&>Hھ0ۈietdP0?Mwb!8O>;[s:YKg&s07(΀:)L&)a t4J=Va }~q13NJrTH0[3lݲ<`xz5X˧Up7#Cet&3NRL6%`2/ xz=ΕhKUZwh!rW P6ICgZEŮ](G5~=<|'M@22BӍεi9>t++`1 4WnZ|$:ۜ4k+qVQUѨm@ƼtV- -[m!oyp~_baŃ>RRUu7'L_W~s}TJE$eLi kEBnu(KOqs#R Um̑#Gط{*c1(h9v+(yz> tWw RD* m;:t֊AW>76TY6Dœeɩp;J^jr-Fbѣ8Vn]z)gJVSJjӘ8׫)Vź9Z`ĠD߰ƞ]g&~O>;[s:YKg&s0پ'LitBsQE.%6fT)/9Y %,Mh:|dյgU|(@ 7 ++=16ZK Vp!h.;pJz[&NjIɒ#bq^ &*`*V#SOڱr@頬lW'tN"6=HE(Q*GPExAT2e*#an˳Άy(2NCYyNfyyYjwRX!OڱD409Ѵ:mʢL7YTQŠ3UzX3wdzZ%@=-bؿ<ս5}\c TA'0sTbstn,X^a[yƱ'p)W#Zf27A|6c 8tl[ k=KeR=&rx+ 'y}P笤 ¡("o#U7N`֚T~?pEYR8xk!Th-5)`cbnfá_jU!P"i6U)w`YRF%O^`cye^~̚,޻1NTmh-hZv%*; Vw[QY br3RN>i(ԩźvi^l0+O:;[s:YKg&s0ٞ0(c{Tl֔_uN(ZTUj׾85}Hk'@@gFk-eov9b~J' [tXb-VJ4r6*|i89W^IY8ds+ɲK)}ݦ-R5k^V]3jbKf~LbNFz+X"!fR`r4Z;Xo ?"A1sIݛ6 +qq7d;9cǏ[5ƺ"ƍ IDATAbEy*tx}56H)^5C3OV)hYS jػOVryT:YgP 9x EQ$3+)"aNt@^ify0: X}h1mPTU CzHY([5x'} V*3xA/Ge=ʀo~0U/mS"Xmooj@Ap~h+*Mj;^q-5SEֻN6:HGL\rc*O055T~C:gxxDy{9o)ZRXk4k7!N;)\''Ycܡ[Y DV҇\H}^;Ïbt.k裏Eq6U_:jw)٦nw"0%a5k`"^g(("l: gU [֦FJ?ppb~+;Y!ϖv+-17lĞ-,d4kt'btvl&d4Z\ѠC5R>mUB<}xEi1:,ɱ\LzpjpJzoj%* HD_kMnL;o~JDseg߁#z'V[m>>t/ VRE;.հ£\8X ӴZ9a s+CL dFAv] x>!?SQgT^ 5wAG)I=8Tj]qh\u*|&Xִ6ReaCV< JCQV[BB 5G9ŰUe0X=ΗX&%,C_*u$eիЗ!3^JhUYK C.-,OZvSyIo[-Ő`%Q WE{0:V&5xzFnC3FDr>pz$XY+OYĺJQ-#V5Ziu}¢PQ-:!}W Huҷce 8'nCYYl„5!-TmsU gUVISF}½pX5l=dA^zb+Va9X^^&FbC(q8o#Q~zI*9JT"?c0c\q>d M`)@8*XZ\j½g3NɘΞU<'nRRP2YKgOlb?H=C5@䙈evR$R_ OCH7Lzss<12hޟR"ceieRLJUtI$(jzӳW:3$(XĐFj L:c"` rP 1a:,Ʌg1*u>$*7TlcuDt( Ne FMXެJ8S1}4t ~@`D_@3^@I!v$]T89C"\ % uz sx>a| J^Zɲ k">셸&C:ַ]P9LS 23AJ%]nywXpNZdTUJ闼_RNTqG*`0HCg *]CUŠQ7ypNr pLsEnp13M/xݬɳLz|u@ǺVYLQTy?@LJ Ǐ<ۿZ/%-l&6k9(m:PܝPH=\U.R5333 Cvt2?p72$Ib:1@i#fg!ґe-(+rxN5E=z_AM(8̋Ua#E߶HB:(ˉcfߋǪ$v5 DHeK\Q‡@=3ibՆ A!T'](::QXX=zjy=1Y1D;jw꘲,1퐠iwAє;e@FAlFxPF]zw[rL'EZ= @HN Sf >9}34\ATV}3PbT[)@?`b}*/H a\: zpҾFJ4bz'8b6meF?~ 'I1hP CJ7eQQ}1!$u萍Ml`N}H>]_7m3!F)"n&F{rΗ;iZs޲?EcMwug,'Di|i`?džoy{zfK<SgkZu;M`~LÚjrFBjsHd:}C-؁@4EطG!;i 4&Ɂ[@{^?tpK"}fX,e~{3=xHGNU0'f iۆE{ %LicP DO^ޠ[44΢,FP$bʅ$MS˴9^[U;D,ΕXtQr~ `-$!ZkO$g9&6զUmIP_uѿy?tgY1f0U'Lj(SuiCbFz}E2fcbaBǔ )ͷ-=tTCZ9UB8+4fz^fktH:\pVk*9~ ٌPho5g1&mfbfU:b;%RhnN5M%* #(cȣd)enć]hVSÊ:eXfRrsh3 MvWe[!O6QI\w%Z0Q6u6BzCIM\|{,&S|?;v״̔&,gFQ)IHm;::R9c4^ݶ=V۔CO>#O>C󷇙{K_s$k/Rݮz=kGQğSG(~f&,wnԬ9Gf2+RF'SP3#30^)>;S G`$ƒ]# טm~4j͠6m͸w>MYX"Jk8t?a<\SbLi)i72rӈK,~Nb9]G3<0PKBMAgHg{kɈ>r3jM0jxKLګ!fFqXtq)ydKǟR}E ^Q_3 P,ZՆ.g۶ *"(!4>k G|5&vV 3|0$̓>MӅHڷ1P_#"sO5V}ZۏGm9?襗V09ߊ? TxW]5tJUWi!~?n/qz c>cD._ڈM {s;vrMKzAu MAQՈIL/π֗1vT9kx^;⌮ K$t"{coFYԨF+c6Y1Y؁eyDӳcDe͔ȉKnHFcpoMPZgcӲ!˼ /@S7m&mo|[bNu>%)Sޓe I Ymv4^B۝x߲GK"4 vH`1(;tMs;J֎4`}5]n8tn qT3k=1X56Fٍ#Qe&6&Ƹx96詪:7PH KG/d +4mza> H6-W{;mqs-ꐦC}wit0\?e7gӋƺLkZl(hBQ|V+]Gw`;o Jo7Ա^:ƹGu]'U4 55X#887=h#u5&N m!;O>̷]b+T27}͙ |: s6iB*KYU'4tN&b}f$yFN9R$b;$Nz=?IAYHl\p_V,byjcBmF&u_1j*wO;ɱ}}~ w 1j jzg h`1ְ8Z6uULίheF(Y@hTrfu 1~1 ( OI6'MС6Y1 &n83>ZG.: !HQբ{687SG&rHbboh^T!BHGڙVSG1" uKݤY%u-m髣%A%Bj^4'4y ݻ!hB$sߩ4s@iT:6MC!ໆwRU;_cұh:l~qV]z[cxnf !4^DItYEXMÁ?~ݮ}ʲ\]Z{[9h雟gPZk.`;v7@i$%V6`+ T1j Ac;;pg/_|YlJah?+$M\,uU+KZHy!} PBTh:"!8痭wЍ1ba1_cPMIqalSkhۚ9R=Lt^*h . )Ѡ]ueIu ':FOy31v2O=9]]ߒ{ҳ~uS@I9|#qxNw"Js3T2yefg8@53M9`[m 0?ށ*EUGN0?hk0PeM&D]&N{&Bae{{$u_ u^gwv۳Dsw Ix}ϡjC+4?#ќznRvB/y{~l`0ڦgLn@&5sk鄦𤮼82~fqzIuS i)pfq18!l>ސrqzzzrMR'Y~wpft,ѽz_>`D++}ߖ{H=vߜ)9(j>0l6׫$}d?YKOQH5>nBc>ES'؅[! /]xvlVД Gu00?Q(\aq]Q}a>M3Ad/RzjbE0jޫk<86M!QUyYVk?el$+tkcr2P39!ae4$ǁˠm%*[fi;|aDM{`4:nضQe!=WgFs3O7hw*{hs0^UN>]s:z,I[yO@y/ɨUKLBꊐ% Y{a Cuۮb mEm`2u;D$I(k4ʢO9ph- sF0.8|XҶmkv;=1vxwl@g=E1:1yuRU?@~]6[s`;/{'H $s9~#~Nk Sc"2" ZߖC.d5Xu11y uՒHIA%$Ee>Ksha!p_~A]׷֙m[SSBVC5k9$ b,nR"*K:o''*@sL(sqjcZG}T(() !9IԳ5voYO_>BJUfv`>;5: jlN肺^z&J cmD%'YCck~R*(n}G6th!ղ 0d|N=R$ djtĠQZ( a e9u/ f˶=0nQ]ܝҦZL =,(JnWPTEs jł%ƵmDZ\[NۺQW086y}sv,ρ.w&+kLK\]]ӵ-Zo7=Pv(7*˲ׂ!⸼`lHm8x{sX_as<{{yJuidW@HS-haHǖD RN!U_+R#tzՓD3`N/FR"bKC#>t]ǶrD ́ JG,W:I牐IuVv?ΝNS2Q9unO 846_DIPF3cDv3{p ;&\0 cO9_ |yIZHN0BO7].{=fk lHU8Ak _A^-u߶M "L&vݰNOqzlOc30ͨ4o/arf އ(=v{ߊN)6i٨::s)V GmXwuNT't>;2zc>[RNg<_Eu|$]̐ҌOKIA}"a!OB>5#EДLn *2 %G$p#161#2e$сS4|1''lo ?WwTɁ-tJUUt'DsoH⃌HJLf@`-6'#7WlhF`Pq/ϤZ, {G'=8e{c\J;W1SڞA 2f1)aѴF^O4\^G1H0NG$ٕϕvK;4EUM)9WB[p }o.ՏziT4jRAg>9>4M߫~(;=<ϗ3C.:|]$@զJ])e9J,8R/YBǏyS}fzֽ+꺮|>{O@U{Ο8TNJ|ټuv`;o˾3(31pXkS:ov.,oivqnS7fTLrv?Np|||W~`/ft.jGUW=+F;f- #Ѓ+ܽ{FSV+en} e.3~}C,$$i,:˅+֥nw~UyɡT?/1dJH\]_aRJnM" ︸8'DKZD4],'5Ξ->I%ɔjŻkLV , k<~gϞoxrNŒ._syy]=Ї~ٌ'B}jOǶ"W7_(wݖ ܃R2#RE^({K:u)k4(mNdJbξR?y65Q flnҜ1&FZ4U5~azB!sv?l,Zï:? ̮ s0_F^;a;-.rw Ҳ wk8Pen(h?y-źa}gF+PM(,8bA(,DhWkp,m܂mV#:#5qG ua:2_F3P:H]7e;窪7^;szft8q0<[ntc L CaK| mHa+]GaK &D(#U۲n} pVƚ%pjS*bqty~ q8(v!ݻwW^iPVwwEInl"` e9aXpuq =H"@4@ (n֨ܬ*D,hNS}SJ]1tN{HeKKic$FjQ/~^Z|&\ݞ'/wITE75'hmi.Na:w Ĥ{sڻN >D Һqgkw&a8YNu-Ogl`tovlF:˙ 4b݂eqghCE]STA 8ѽł:Z?}uKz&ӆf,'K3>~pGg{t03..WqK.sv-]7T+Y+k,8&v %%?w ;{ݓ KEb: ņP m[ tDl8 d~/xq~ͽx';]>A'Œ{p _t/Gݗhn#L:G;kL4XN),c[lGۂ?Mǂc+LCU4jC`sY l;nF8%?6V?_KJv`;b1(+mJalYibTܲ(ֲnɝ1ƫʐ.$׶EO? ~sj CĀu㣒g_Vmyֻ-L]U-!spچM`DŐd8ghCWW7?Ջpu[|$-+nn40(~Td)<&9ӣC /R 3KKe:|6f T t1ׂbhI#lyca ^*C܄ڷ D+5"#LdEsznLǿsă@Et/m531tjŤΥүQnH XWEY0rYp w^D3]F:RlZ)Y'H k/z:SS{at?\k6 ˆ9~N9/pٝ=#lɋ/׬7|r%Ol5Ie1k}Ƣ+dٶce#; )զ-94EkgB3Djp`;v˾SM[fv)'G|՗cqx߸'<>1]0!ԏ |v$b%@ ~,eh(D֛O_цZ(IF]r%|Rv5VJKrl6CDkXk麆vJMdb |B'FOK !Plw;$BQf-"kQBuXc6[okZdԔ]k `̄tI9* HX5I*%I6MY9::f}zsŮZv5M7+dƬq8C޻dB%TZ#UdShmO2¥\u~*8X44BM`Ux.S&~FIlg*]z ݃ tw(c1 8S0p$͡Tsb ri):$i -u._㯞Ӵ[9'G'?L [mC[pt %Δsvfղ\DJ1H4N#=<'= /WlX̄73tÏ>dwrFiUK&䈣{gj IDATS)SǖX0t80KO>~,;Jg9'lLC#o2E O#o*6[::'GDtC"xhyNx7hfPZCK{yk(-םg0i}zʕDSc3qŲټۀ'Mͪvη5I܋@T_l%N,Lڎr&gࢡ0 ;vo1( E( I!u0"\__+ߒR:EYdx'=tiy97uCY&eR@*} h>_u{6lCgЊ0N, i-$đI>WP=\Eɢ30mt۳Qy\IŠ Mn1Cʳ020FxMS+ WLp#.1ivx5502KqwSzsGjFik+WpS\cNvL& &9rFaJ \<'nYT9} ^ް]^P[:v !5*\ɤ0.9=ó_s!wOr,6%Hн l.ɟ ".p"WAb6%YQ[tp$Tܱ7՝%5w/7Գ;ďN؉!@L&qDlNoQe1B* 5m uGι`m &bjZ^+vW?|wϸ2T7[b ³,0tDH.^5nMK[7lv-j SlήmkjuVq Ca/B1R:ڳmiwk&nKDÉbc \,8idjK:jTNheEÖ8kE8 ̴)#ԍ: 86s/-5P 8͎vVllVGh;͸(iKk먻H M%T岫y֔r+^m# !LViD 98hSMDZA X ֤g }`;wU'P^UK>?cFǦeHGǨێO} >kCtvQ$~ɘcJE 3 H}b"tN[j bx;u+kTƺc,m#K4[ι i,0mT~g΢bMIQk96g MڭX߼k+b|Ũl-44l.ń8YNRj".)E/xy5/oF恶kVk.W|Xcy#~pvtd2gtSU; a+ϐ5@ >DjS6'c4jsnIYֱam[+6a}^}Sol{_4[k]uq"om>i.(4L b %%n@o2翠Vsr~ݐ$W覴 az~zsIl He>x^\(ǎ0q\'Vp66rX `5%b(bN&t.'\.Y9pۊ O\͗ۖWU5ѝSE,w_₣O} n5/rn9ĝb6Yp8E&%{n3 Wp.Lӊjcvzj/5̫ɒb%G*pz}i(mdRr4{ƣq| )s0k NjulwSwoN8-y]kהQu2dgPA7ŇՂG/7]8/LKwǶ>`N^zcw$ĵx>eނh6 "Nezw=2lDn@:I/EEtW'k8z;viߡ6UY #}HT %#>a>Ũ(=ᵜ2qTcynH>> >tWQ96=ӧWװ^;v1fP#!9\{5?|gg|g{ }Wb!$2{;mDG4>H_M3.ƼE~DٴNب^{>|b/?g>7x^{A~3{Y.a:u7~-޷l.5pt|O]v1pq /_Zxgȧ?@{/T%k'ݎkӟo31FPzW R3<GNa1TW5<}?xqo[>DsDqRb65|}tXz6k=1 J=HiͪpI)Җ8q0'v]XmoHhuͦE ErZFx+,,1Dp8IEBaVs,XL Lv3f%Ggf L Olr :PL^<cM,̼y[][t`  ݔH`1#L v!/GGPeY-AAl@2KVU]]s9?̼y{@p "޼'{ncV@V72xf if7P)3Rrw,8R\(Gk\OS k)scz()YS8AL Zimo*KҲ]BCۈS$t#Zq1nK{%6`{n9ELcPQ0V@q2n DBdq"C$Zc :V(66āy/:udp"Yb'Fa(EɞŴ w"˖1즹#01a ?(M5`,ŲR8I*NDvd>pj Bzm`Z >\jn%ER,e0z= ǏVE|Onm z\k=h$R焁U:&;O8Oσ ੧~`]a?݁OHO6:O/cl"}MgQNa]xxe"ǥX,:NavBĽد|E,w_fNOZXG= z=iȵs(ix:t}y9Ǟ'v !2ekb޹}pnÛXZc# ,nNJ%Y 8zP0>*KmB  wp:ܾ ЎcYX5T!jKԎ"HS (^ĿۢP|8R5PhJd؎ҮV\9(V43`! k@yWq=b,j\]/I  ϝ8g˪Qyi-i !TuoI ,ʯLfIYFicSSWCW󟇋PqjՊ%~r$곟}׾8g=yOMJ6yNrʆS3(=3p._W_(X,266N/Ԅa8h4>z9u`^{ {6\ ۤ"jGfX\cy:&V*)_`e/<VGbO{s0&q< O6 tJ)0B ͽW[M~}8|VzV31Lo  –{LۢVS+8͝Glm 4| _,ʹ'}RL 4& ?/64xk+J@2I.Ũ*uRJ98htRbSk5i/* 1S m 6_P$igzd|lڥi25ydHO&1Uʎ ${:+HsO:S/z\]TP;Fc{' DvdڽX Dr~{O)lpe8IPxy"aWa*ܸ..RI!Գ'П4&a6Ehw~@1_(e =cZ66K/󱏣~# ^+GCyjb}$Σu3{.wwnƽkL1=~PjVi:J+ӑӑ[>z$}B}V5>-2B a}_rD]/]G@mDgk&cc$'`MHo84O^yEr8Izb{ڄƨ?%Kk&Pb ȵg|\̄Ema2F95Wy X*x^✃EhZKU&-7l gVQ$YT=ن۷?tAJM{Afkf"<"o302*,2񗿄/a\~lS8VT>q vcxm xqwX:x,%,Ӈq-:?sY,yPf6KK˿,ۡCšJpM0ucW"MuQ v`&]{rϿ~ C[~|n2אܢ^cUg`-X"W!eq}/vXʪ%9F2V&uȶr@Ó1yē01a c@)0:$o${;#lW ‚@r2_O Sk>m'r\@{ r'~{ > ~AtZӻôZ+_*52(+v*s/\;Xkxy{WO:.cIywu8\'w=! M~sԏu51VZı8&G I&AS)v(f֊N^`66)VHR!+5/mMHc*NNکg`XLl_A"{&RNbNkB}2ɾPV}f s OJg9$`*QSȁu E~*dD7?^MRF@F M<雜DljTtRs8VNm`5N}lM߷;W??SI01a ?|It{Qv~&X IDAT9b^BIښ0?gHI>%i7Dg?RIlRaq(&kow/hMA\. KbJ#nR8.yEC0q,ca''q֨1Ө Oc_{ 6aLLCXu nosZ3|D&yǘ1H=D|>AMN8w-`{o뷉ER]r`j+'$cN8'W*"<( 5U e %ixTɤ?aR0g_0:tZ &X'$ REhE_RYٔ9M2m oZ)8TiM&aMc[*QHˬ9*oOgh%R_ԔrLl-|hZsdT&vj>I'!~$-xyN0m~Xc% پ 1& W)pUbd /^Jo7_|__?001aǨHSR -`⠴ϔƱ'0٪:'*edt} 5RnGgfg%Zz"C.*a8Ғ69kI^e(ȧ@)$RHW eh{[d 68 JC!>(|Ff Q# ;q㔏IIVW 51az]ժ4( =:*GA#s`i U p'R% |kMv ~Z#[YK#t;ˣuK" R N@]x:[X+1qKXavr b&twnOMOFhwYV~+N˳J]7^HAi*%{e%SR]?EX/)%<âfC$y$L&a(JTej*ŢGsq]IN[[kw(TIg5ܧZAJ?3lJģ)ﳡM)-&Di?恬M?j-?GJ(6yhIv6avHFctzAT<"khv;z$2ǁ)¢Ib|BBXfQfOQF](duv` W0g<|z>\%huX~@Tr`R0cE5Xf4FYǚjU(5(B*Tc-\:qk0=9 ###xluyo`cc qIze 8ZL3VP ⚌Cd-mceeW+ygyﲻMhbb"LI hR/vV8qUs]9GG'eV0!ЉY$TeBZf/őBr*J.NRV+b|,-aR)6YR-%)+[tJm.a1 ^G!C5j8zsO=͉'Q2>/\qu0B]=qN>3[\W%a;뼽|^̥Koqu  jYl6cEtR6ZTd1XtXK7]gjj7xNKT|la c0{q\cQu10)"W98g*I@sϾNå˗F ӂc 5X}`##LSzln;Isщ<̚AI&;& `lTشt:PFKk\{ajĢ0L52$Y (+LRgg3㌏2|CnO*`~^G;GR#sDz0X%GILLkP.ܸjel(+:wzszl ]*bNiwA@u ^M0iϟGgc) hjj[7n8ρ47Z{6o'ַ#C6LsTJ sD-*̘M> "X[hDd6TC{3 =rK9|pr[C`k vm̫o[XmJ1N:8LyFEugw_mmmloJbIf8=3'bEyۼ~uv>$mq(d @8rxcEgq -y8(Bz>Yoq}.ܿ{u#y^Z#%]lP8 .c#!Xfnl5XGq "so֭;e?ygdbc@9DI%SVnƬk+*Ze%ob *\կlQR ܽOϿ~xQf|vO_\^&M#:Z-18DZS51s/wt;Jh|5jvv!GWAgo1E%9-.ʢn?!s7Gj01a,Aa/ J$<>b_iB@XվB*\Wd|69AԢoYkZ~q8h]zJ]<%TkQx%Nӑ-;}LV(8>. Z< hjUR Dq,`9OJ"'iwEJF:|09%ڥad$"AחA`|"yTSP طbx[c0&"6Q_[.&'d_Im%cq %L@Pٓkmam4(<|(P=\ՙG967kl-SQڭcErVTh؝vwjug8Nc^~aL/M-R瘬̼g߰+%྘c|Z-nAMe61%)mScnSf8e HQ"XX,mZ-/;wrZjDAYc1Bi]}= wя7^vwP]uX4FG.da:FcaQߥRqxK_%h6rQԘ;"G.pt|9㘱kTmLu{hb L)UhΞ<̽uV;Mla:Tk:92?Z21~^tQFaHXdjMptSLpH+N]BAk"NZYXN|)JxAYv f|Aݹ|sɡÇ/Om=1a cO J4 kgGDWusą*i80)0F9Ӗkׯ's~&I^Fn%iR\vW\M8pkWebZi8>]@رV3 dʽBSUqf\PoEq{@)rcS,vxk{x7qV߆{1bzB][y4gLQ)=G+.ǰֽ1!H ׁZgrrCxI.Xu7q݄{8.v :ĺ>Ej49rxhiGQYhgZ37s3G Os %)]s2A{bBy^DmAmrË0 K ”J8o]1A G'z,uA&'֖8q|XI&#Xb59w'fwvP]MN{$;= 9”j AoFݻz>ߡ~a΍sczV^gO M") I2lFyF&/x?R헾n01a cxϠ4αJi("N_LMLy8*1؈Ɍ>-y4J,*gVNcRPINr`TÛ㢔0<A&CO`D\`1Q:uQ_jD#OkQ%eQtvp]/Bٴϰq"9Y/010JE6c1;2 }麃% }4Icr]ov# kJQ*V8G;jvBaFQ hw\!J廎:p@jݦx,+u,.ƨt _TMM[(r57q${br@s bvZlR aPW"\h%CiQEcdx^?*̯<Ϳy5Շ6De(#Sl *{zops2^J!Na2hhcgm K<³/p2.i51a@3Qr,u;[w:4(N n!VD4 n oL9׵&M)[˦I11i#){@l&Waj *{[Miȉ:f&eAql a.]贈8alT9=;-QsG# x V˸g|iFo'.bc01ޙRɃq BVaUh+bU̱=# XÎcL/q(6'4FP9٫pJvBDNr<:v"ŶP*gPUDv^I/a]zbu: <*U~(Gcì8WKY'0R7re p| 01a cw23NJ3+@K\aRcb^|QdA Pz=*d^%+QmqjAéuժR&91$rRS(Sshohk %Li~IBEvTgOMFkyJY$HqU2AKNӁ48Fֱ|Ҿ(W .>ywbZZ;_װȞR>DǡLӨסg'3ڐ. (X-H9_G|6 ekV" :}.ϓbޓt@uX\HĤ cZ{NnV)v=T* ` SDfeWAR:;+`SEY|exlQH|FơyN-.pAYm3~{ҕK5T+}=րqqmTXYđȺ"Zv+ ;h\z;o>XA5w+UNahЫu V(hpHr;*!yzuP*zL9|8O-,rR^[^E=c+TnԱlB`BZ z](;4AthN^ٳgG)7(8EX-^E=\E?| i=O''0_|(iwQ=y%Iѣ8a2wasZ'yqju&ݶGFYX==+e|\̃\ƆZa(@"<~w F$cm n5Tp ,,{)S@*o8n=֒Q-VRbT(H重 X_0̝ 1wnߢ)ʄa8d:XMhsRxTb:OGױ_smHC>_~ HRqXF$2|*%,l KIG5Q$y\yVzɻ7J%jvؤ8b IDATHڝ$DEi(œ'$QFyiޤRoR~;wN;} K/0K8Tbdl#K3O<+D/_TŽ`":qI¥C8sΏ^A6wPAp(3\<^۸?!W1qq.8 # O"8y<Zp5v7@YN<ơSO3ST8&zeM$Bjm "㌏$;{qa;jCl'^X9Fqvڵ2A*Ԩ<*&C>D=JfgX߸v7B3Ztp 'xyQ{57PM@YG^c9Boj^F7R肇k V#){;W'1ZzF7KrI@eq,;~ {p37ޢ~6؝m硦`.a}un~-S1j ŃLL(wx",̡Ke/,j~{ݣY?&_xhfs8p\j{.VEXmPEolA;+GkX+;jg:Q4Qr5]m4P{ ,+wp{{[Q-+|@4w[loﰽIդjnu(}\ס:;MEE 4PsssZZs}\{J9JBXq=Aj5ڤ%Ľ<q@(GE& N^¯5,j evjwMVks?khוZq'sM\&{Ľ8G!6rIs9Z@kQ44$UZe9瑗 &;\Tb^(P;(;Ģ2Ha(9Vr-WrIv7(޼Pr3kz:}Zo\_;7D=J5X1ְ]SV,S77"#{V N?du;\9>Ss<Û7y6H0,:5rjT\1GX _(R^UQXd g+mQi|jP (Q -d}Ny0qk\׸@B*5eE'DQRyr}Ǭ sgᕗ؉iᮮ|/BXϝZ-1`n(9]VS`_yEn_P-K;;ĕUrZbv06|j ||>2&q˰ o}ſIo‚lX%5 Y*s21,dZK`0ڳ(m/6*qJq>;MM㢝sʩ14FZ"(e)SkExLV1X|ꋙѲ'DWkl6~g):!Usjԉ/1`hE[Ip ?,rNj=3r|Kǯ=*lbagg+#nW$E—_d:xMl>MbW('qyRca.{[8IjS $Q 3W^ JsS;gwcS4¸ &ը\xEPaXWhjD$Nm4QQ* ,qR`Y.NpH]Yc(7he`P9b畋Wx7^o kMnݺ[u.aMMDu,)A͡Gb~Cs,\W_Nߡ(`\0ZXhw|ˍO?ß[=`{qIbR;T6ˆۦhsPheBuqNf|.fz}Br488adҨ5=IV#bF)* QkOȥ)kU‰ 1&}U&p&Ѕg$ dqqQGzW5l69w7Q׮͇bP k/3cw4q"C>_DMf~aA2&MqTۇ 6<}Nu]8>ctGGp--ozK纨B?ma͌4$mHn:U+UT}tK49 yl<f3{_l8Ȋzy;A\b;=f-oe;-h-cj&IiٯoD(92܁[d)6 &^y(c M&cG[Iӓ'4"7q]vHRa bztF{Xϕm-Er~D]aGa{v,+<ťvgoϞ>d{nV)u뢴q]f\YX期caN G/-ѿt,?y>{xA!Q-G2biG4z}Qnإjo7.6AcE%fpI=OެQb}UhǓ❦9RDy/]޵uGwpm>>Hs^Qb%^Lקe:9nBZ@}V\$ *G$QHdSF*IJ1kk$._YЏ;!;Ez{&Ͻs Ssl-! s89:]L)efej Q#kh# ;VKjhz$)V2t;4k\׸5_aRMǿ(i)VP|Ёsq3ͮ==#l-ŗDº#NdjRb56q,~77}Ș 3` P^'ctsP=!ِ0\2`帞p ў^O:<|(ݭ->|g-\?|$u+K֐)qf9̙AV株UAHl;40ѴcaY''O3cDV:,C̎8Ϸ1, j |^&#LJtD'Zmht;i4jXFim 'LRgR.@ni{,%Zlt2 IkwkD!e8͖ h>Wd=xo /ZZY^-1GGQikW9rO?~Onh P:M(e(,3S=Åj(֟[sx CBD}vx?yLD$|b8XeʒSBi74 ~4_fLJ 6$6J '.먭m$ uP6jk r’* pEIgb\y./̱ ,NThbQ 70C:;KN }p{(FBH߼Z~J~qs+=Ss\=bgGi7(e0+Ijiup8hv4UFQ%}LMsuv LNh_|ĴL ۻ(堬\ 3x/{88|׸5qk\_jRtGxm:Rd ieL}x,K A`Z ?iu?^,@sEҺ ? $CP\H|<|_nϜwb:v$dv7KtLbahvc20Ͳ&.(}:hCcQWbGN_|x f4:C(ꓚd`y"@!xë̓HI`qзx7M/UiG'Z+/=OؿȎ55>41<:|(Zr_ ~;=?' l#`4 oORˡZ @# ȹ hDkIpnux(On~]sxAuq ~p\t}29=|$,k#SE93;=x+;>C=T9;Ú[{|p>[;Q(nBQ4"l7qXZ] Nv Ś0 iBBiW)[(`VJiJLR!,*6 9d 4C& Liet*H/h׸5qk\_JAh迳g+9p+_3,q .QboH*I",`ϝ;j+ IDATkɱ&2333.zd??Iy"O45f5Q5`5JۑgU>1$z)mM#M˨(-WV0&'q$63nz|垟o{v%t^S T ,OP=a<^`_z6F1y@fj-`P JMXcZc\.ߖ9 eणo)2WGMaJR/VJC$&%(5& (Q6*P$NSca=8fۤ/hYHluH5:U(1XOm)sA*q\YZ""th)?&l[Pۡ풤)Apeqj<\R@) ^/qԠib>&uH1q}::(ťv{sq, xJDBӕءQ0b"o̲8ݬstF7񸃒c bJcR+}YZ!~ _;!=7ߐ}Uh53=rݖel"jhJCS*4xEؑ p+W ׮,؟-aHa0;t:r$ΪA|H`2ᡀ8>G;>䴝D2հ}IG¸ K}<0Fso^%o-q)+h،8IXDX<ĺF$! k771|?@9uе<\f(eyd ǃ85ĩ7`RhGq] Ee6$^iؓb jR {>Z9Rɉ3MN1S)R< Gz4SxǏcrT ݐBjOcEzGq̓ufjͻD699E}rK)_@ᨁPqk NS?CmmawQ.Nb;]i&早rqL&Ŧ)GaL}rEjPR ;ۨ=tRָqл[5) 5mӘX]i}F}$JV^jy9Z 2Im ggm{8$h7(8tYd4(^(fw{RrDqa&Ӆ'O7o%X=1I3"S'(ƍ^jHTd_kuDSE?>ݞ=qk\׸{A ^yJCaffjGFeW; mCbL cbVAz F nh8q\4PJXTfρUq흜pdR/liVZ+q䴧P/r3)2e͘,ҧT6e ^hfT7kOR_}ixP' g_3ز.٘QJXإ%y zGNx j(=8Y4s{uX`Ǻ(4F#RG-Qϣ lgyxcP8._rФFdܻ;f[, !:$GLv-& 4Q%췏VCDvcCzJ1J874n2sФ9'`Mʦ8V(v\8堟9U7ح-T uF&Pp>qhCKn?Pv稖[^denBND:}ldA[iƪEyxxKVx׸0=Ll\"Z^Ѯo2?=>Z'_oAcT.$SF|@+&y^܍>j33L./?VZiQ* REO+{v=lַ&Mϒ44wv+T1>\.G69)B!Z*2( 8?!w O76Zdbir/O%KhK7vhzRCsE)?ҚTYɇ}fjm)hwZ2&cJog/F9MV 7Y&/PLR ;X6*_mw0&ʼneevKOIϵII86,w t\׸5q}3R,~#E$DQI l4 #`/MRjntEVZk #Hp(Sf0F$PFnB&GE\cXN1hsk ^}e?@IZOnbu<0ok5t ,jcdaOج?;OVYvOcvQQ(]P2ș|gӜ)Y43bW/+5\'IPI #!Mՠ)^Auql$ F1 ŻݹIbT.uf S^YLr0s{pv0IQU,"U[^epphWE?ੱ?yU Ky&,r yfelr`Z&&TU,6`{l 353Љap ;kktZ~AS52, z}2 gPt#kљ!Z?h!895N!@{nEf\4,Ԋ<#cYl:rq fF>ypf2Iޞo}rP۰:j5lJ5}'JF+GP- @" C] fOuq^PјO4ZC|E};bޔmIvю;[{6vsCV߃iԹsػw# <(((p1u,j~J.ǙYQbѴ:M]0&@9^':~ UA$LvYi=9e64S3T'+,M3rin~u> TKUK``RI3JQtsҵ_]Z|>Gݤ$,1՝r[{6Q'sOQ= 5PboڒjMXZI‘I8"|nM 6nD1{L yILbOe4%^4yPU6DIJ]3bT?^0 ǿk<<␪x灄0Y+=hGe~ T޾%gPkk_QܠZ8n$8u{W_CMM [z0R:`J$Qx,aiY E]+L@sW@;YKGŒZ%u$}ڇ|$9Gghz5ԥK:v}]~C(ng|whqt,' 2-# !{ds|uǑ6"'O0#}'[LOO2穆1m[{?C?}t0wvZD# )>)N>~<;JᰅzubR~ezowO>onle`2'}?ƹu>P9x21BA}!>|j`Zyt gϜaanB!ݻx#OQ[X%=J:e~vu.MHTazҹˬ^;۷X_@IXXcyyΟ; ӓT<wI`Z-\ v܂9|eq/i[=yJ\!-U fQ{uSt>FKMNSՈ;m-Zl\Av(5QDϓG|@yx3/XBn'8~ԯ:TE^66xg{8_XMF86I܃(޹OP_꫿ ?1׃N4hlq2ҞBWЯ gCI˕)gЮOߥѬh_A=#?dՆJP?Ht(wΟg!Ts9^Қȯon;mtUU<2~~jLnz]"ORlچ;qJ2˫$ 4AlvCUheЉÇ~u6vذu8sN^~t.^H?~By1 T"HAnhż57ϥF/IJO E5 )v(< jký:b]etQTGw TCpY&.NcܜP(Q reӥE]'pC#lSgfy*SݍSY=e yD[*㠍0A7[M&gY`~j6*Sʤf]uԘvv^j+L'}J7\GQÌ#̀cjq* #6QaBt+ Vzp'DY6׸5q)䤣 t Mhi-ou/zRB}~g&4cnc:q0<&'E/]^0/R{$Rea&s3w5f5voEZz6}Pa(9|pڪujv;LzJd VozU)P o8j k39&VT'271u/cBOVRݑtq=4藵5x= k2w/,uX,IIgox#cnmasw/^+q~+R~zq_SȂɳoHT~ ayr QoD$ 4|K5&j4^N$ , |QHPkU*ookIwvy{pƐךKZsӻ^ma;]{"tZu"5."ki51*pR`/]FW8Kp <}} *{}qC$?4[ѐ`a{*9:{z>Ot#w vQ<Ģ~be,,IO!(G؝-B߿=:vOz(GA!EfC9Uh+kn>savU|f8D?ZCmm1k{eP)PSJ'E" Sn؏":8j"I~Z}&*rU'Ȧ M%t 5E(V[;LT' S+ѽ.I0f ׶a7Ux0H7uT`O~\׸5qjB IDAT J+Q{F{A0r{|#<|g.7Ԓ"%7cZ+7&6'|{͙ɍ|tw rC].Ko pu}V<)' (C1:dLI$ɱ@|4G?]V‡|dZg43vRZLlh߃~,*Y1R@yPr%75 @:kUZ >d(_)#yP zUxm_xx]ffQOPpAz4z(4=HZ̬\"3nnvpzDf7EV")DVč{}17|dJx( )"# 䳟o\qls/z:ܼ0xv?8qEnJua+7(NNp PARXelI࿉hv/دGЗ_ۄ/^IS7,mֿ6ݟm@ $h$p7/c|r<~TJЀUz&c7qPn%}˓E X&W7f$(iL Ӫ=zJ-k|~QRV w5nW,8*: ,W/ol3=1LqJj<_,i,E,bX"3(7YdRh` 7ѷ߆]x6ƚV1UE~ (lM|6|Y{voq1_jؑsFptdS޹lyl|64j_7<v>y<7Vlu ~]3䌳Sm<Hqޛ8=Gjx"1~ZZ7a8krrb&G@J!O*2.]e޿b\qh~NVd>vdrH 51Tvm~cc}K on<{f,mr%D ~g~ﻭc/,lu'ɉ)+,]!MeC]Cf3]^F. /UJprY[>u?0c*֥WX^x|Ĥ˔͛/}ɮSXr e*~m5 >4!}_~к|Mϩ]3ue t|09wÝ==kHlػz zo;އzZ7*uNMx xG̩Q'hY:ګo8x_}*8,u/|Tpz*m' 6?{XRRb[>K[^#繿M^v׾J9K<Đ"Ķs;m_ z×_[}?'Ibz:e:0fL!am`IX566yiik7}q`q!0)vހ*W_DKo20p{OA]']8T>zd}R,E,EN ./ JYzvOMIg3؎}]O\,@(J5IoyG& ܵ2: ;V3$n ŋG'Dt4&yÞۉw q }cw1[i57o«[lٸ}![7k V6 *iIDŀefcb Ħcl斁@H Uzx'ψ&~|75RJ*8q'6)ck{yˑ[ҢkY& h7g?C}c-l P9rڴ&$.w =yburbuz!<@ΑGйѓ DT >^ׯYMkޑmSvy<{Ϥ˟|2|>ft$/q::)z خa6.O]3qHwE, A ֞#G>7'?vg仸 uȎjG@>4G(Þ,C}o:`@W;ؘfX[볻:I\KLϿ?Cvti34umCmvMcDgm *+[ea--%c}E>o=eoބkW^ܤ4gݻ4.?%ܽNڠa_]៮oPlnWo\G_y7ip̝C?|]>gLlJp-_W*}!Eo*k7Ysޡp?% h"hQXK+뷈,onγ?|یOy 6/]0AoK[g壯·kOX&E[7og?[|ehBJJ͑[l ''ݼ+7~~5mrhL]7B'z#<R#0*Z z[poR\?@q^} ܠiVG'YN}{gjZ-|Swޜ1?}/bX"=>UMeYh2n֨ڞ$)&Y$+oU[ GӮ@xK5IUY@Eɉ^eti8^t:Sq<1v.?8ijTo<{oO3hI۴:s~&c_s7W~yy[3Ԅ`mdจ&q}5hl߷1E3 l ͐3 kיv`2EU^̣Lgf^cmv +sLwml?#>xc|" lets4 5{WSC~ N'KbRBlٌRlnqN(.3t#~񄝽fuƒ :تZ/j:X'BP*Fnpz׮_mJkkk8=쳻GUW7 m+-^i N{|nHǨ ʲkBvE}-xNy} _%!rE {Dm'^8æ:4sYQ2h I5W@EI2z^:mk_t1/7p@zjb=o^svn>wΗ+,^b-V6iQk̦#SMG$ŋdMc z%6.nraU(*xm$@jƧcV78:=ttx̅ pʍ 5 LJ1 (8Y-aPzGh5Y"ãc^u )z^{uӧܿG\zK.FrŘ!2)JihP Ӳ`VhNf3vGy1Or|tR)阕Ueܸ~W^7^f}m*)xNTc=c6P--1+L'5]Ov8Oy{;xtU]@Tݹ%12Nd2ewO^&# ѽG<|?9>`4>%D3joz5s5M`g ''<{7rk>N0Q#NF|x?awolf8 /ĔTϿ7"8PN,b/7(ui=Q5G$=,˂X$/6^NG\skLrr+n/U'.4MG(󹘤s^/h=I]#BK_0`|ildGvB,JKCqh2fVUmKq_W^Ve=$Lσ? |9*{O=TblH|UrH=3[.jHTc)<-zM*`F|dXv ?fzK5=DD$B{n0k[/sӄ/)>eYrmr=v~D]M~tW3$,XY_eEk7/j*N{Y,c/ &YK cNO~W._`){%A%6/nr3+kzHb#^G' pac=;d[ _=FB惏;.+׸ƛ\yMlt>|Gҕ )}3!:O0MM4} ۃBgTUx4b`j҇>\ʕ\prih}DZ??m:qppG1/>;P;ei#A#'#Fc?;wX_guut;{Vֱ3Qg5x>7 !M*'O& VL0sxthbT'_'u^%/xJk!?X"XԖ/bf 8߂\_I2I}pcyÕK4՘jrH5=P7%_eo&Õ 7We&F$ MPu+7 V2>ҼyQ<}~N,QRZi3b[Q8!P7s>i4$:&R8s̢rxrL g-k&4<|'O t#kppUF1{U\XYⳟyY٢XZ[B "u0CG-/_cuǻ 4B}i2&%T(HS7Ե!n['9;vI5zƓvw);8'9/{ AnMCS=.ZڿJ3$v)ZG'&!hd+9{ywA^*YElCKl7N9e1Ьx"E,bǧp d\X@DLԡiʫF>Q]̒uYh.%EYRM IDAT55!9fpjoٮ+ 嵢 gQ9cт &hEmeuniƸ3>OB&T6͹-HT];lmtM5v3$GW Jt(:;{Bu~Η 6i*[Q ė U Иr~ zEI j[@U=D^kT&&gP)zXX _)􇫔%|QTЈƇ9"){"J)53T1Ayv~* hfPU=r$)|[Ў1oӦa٥899Cám T"d>+KTkk r})Bۏh'x;8cR 8=:z(DuCp4?;=Mɥt~1|Ir9ڛÜsso!)SΡ0tgW۽5oo7YA~}['}N{&$吧|,rڲmX;s?H{mVn-bX"_k|*PJ9t֛毢,RldqwþRsN#`8p2ւ#FLsien2ie}Oz!/D£!4Rsc>\  E:p8us8?F P:`p:㼣(J _&gsi~.bEeɼ^R(,eYRUUڦIE2U0O-T/$TÚ; N{K,Fд6u )00_|LSP'|&'^]ŠvyR^&69+8oI(pK]_;m>霽3PZFG5ty+EJRhS/bב=m1O`c܊K;}'%^hAMrZ7c=%P|\ٶ5xHH',X_]ʕ\rB'+ \ak$?6|sXf#varr4[JĒI9O]Xϣ!}9 .?43.?W*o7if\m" ͡l 5<icmHM0i{g$9 s?X"E,?_w5-&Tu'aV"ձQjZ9 Ke*1CE~A 3P3UD"sl߯ryھwl2Oir0d6%"N, ^9c%yB_ eval\稰Ϟ=KNȂț sB'ŋ~tJYMp83bwo;>1UmXIyh) P5b&Dz!XH?^Bm5ckxGAXtMxͦƌKiu)aC, gؚJؼt$bL(S QLNP ͷ,pFZ 5.KptEksġn0(;/,b=SI{a Q^/8D9}tδIhJv g62cr/bX"_G|:ouLIDZFtˋpa"_??1;u@+ mނ⽧pV9t,s۷nsxxe1h42I1dhbRAƘیuLڲq&02$2lф٬"4s]itKt~wQdjA41Lh\9ˡ9{י!Q<|}>9:OLl!*j篂Մ(MhPA~O5&ŖZǟ~%ު*]jn.ю12M ):Yk(P5䨂i6 qԭZహ">$ %MBwT? DJ1wgw~og|N%|^|J$pkC'xZ)U;x}}LlLPFcFW( K^~rC~S8:ܗFi6>|d8xfKԷiqV羊g~.m6gy3$we>Vy<_k o^Ft? 5f\!YNRn5刴xΦ_n 9٢iZv*6uJl :{e^3`JE,bMǧM2p$uiQR{p3+bo~31Gg?`i[{t]7Zc$1ᐍ fz62G}j3( XLzKnU~3 ̵Cϵ|64d41m5n<%w!D D]&= ,K56wWDp1Ա1qqh>ŸKuPe+Ue̥%:ԁ}EOQh` B $=v^$$#$0 m{QlJ/]"E,b̶%R dۓ/p6\5'#Bmꜧﳳ{@d6? ;;D%bN>z??9>|Fei8~LLd׫fJjaՕez>j;e;Fw1c_uM{qqh05s$b5\%\{ ''#=F@@-3SJIIZQj{= 8 /KMMv)* +̓37C3"ƶmcHծZ΋;5W_睷:1֒j.[7.inN}4fc*k%NR+$uV'jPp/!TayYjZ>D)P+&hL_s&Gfv&$HMG}.AE,bX"~mҾԛSQ$Q1Ij/ .RA @90@h)ƮRN΀a/2  ŵ^m3G5b0IBY  H0~6utM'a,PzN1LMM[jliY\ 萀QDsW6'tQM = L[滐,O6^L1ҳlO2(|_K`te1SK=f$Ξ^"BP*|pI!]93d9<-pY[,-5q:I"T-)VWl Fϴ#U" hbc5%;tX"l|:# e݌]LgSqpʟ[&&aiG8jGKӂݵtլjyXن—$Ir 4T|:7cfrKc:<Bs8飯 $&﬙]s=U(i,Q<T@<^=UpNT fd253%T|kMΕ/QLjMLsր9{euI\TqaaeU R})JG£';HMiZb+\kkJDZI+O ;{'O$EkMĚmGpр&jj=!dJ/] "4Pte6E5!"uVK"(|f-Y.N' ,wّ$FҥbyF| K$/!%H.1 ,&!vxPu~>ʎ%aA֣$AfVJM!N:׻=?٭Il}e˃!!ުTUec#/ZS ;>y4?x5uCƫ2VfǙt1͠9&6'浽2$sf4ܠ#)==$3D޳u"{H\;s6w35Xݱ¬jLj\CBLDv+"^KWnRŭ商PP:/y訠 M<'ʃ:pr>Sn߄˂/MSRՁSw?yQ`rÉo8(.dPcDI]1c$Zd* \8*R1#,]fM3CKRN絝1sƕT8>y! JbՎŪ!5FS)R̴ز9ԶIs2W0,uU2"k * ޔ3i\ t=ڭ aJ0{ls>Sxoq:6^И c\+Ow^&\RSM"u.kWJ>{#4 miRr{"E,bŧ>@\Vw8}!y||YPƞfq&D^ռ4Iށ'fCNd &MP \q({/=YYI4Vf%bRe#"H`nqP΋JR[@auu}~q= ֧ZБT/$Iv5& ۿdm:\$˳3 ~ '''4nkT4%AՆj}k%3,emҦDX5qKziߚ>#v ׮D>sWj^ ,/ʾRJᅓ1w;ɳiH a,&N Gmp ,C&…*rbEegy߁4~::g=YEZ!BV<9VQq@a iOԘXsC\l:I{s/%=߷y0hiQeg I96>'󭞍tǪv_j䧠Sx$Mzxo/ռz+5.6,-70o(Ov#~nڙ)U Sa6* IDATqL'floFn܄Mp/HacͳpNƊos˙䜐'X"E,.!Pe`:%0WGE ^:ع0Ł2L浢P]l>Ò!dMTcyg9g g@zR?q팃sN[f lvPN,aH2d+ļE^f_3+>裶>6KkC j]D+R@6.,(:h:lr9:cn߾s23͙ )k(ǚ2HɝK6֙'mBlQUqE\GP%^i҂ m<ù9{fm[dVKt>/iAzӘLmfP HRK3zYZr\*| 7_\XY3pmB(?}_я<%ט̽D[R8 ca:S Š&rVasS{F7h>.;Fsu 1:ߤXV-~ @T1R* {8?@@&Y'4uMSU&u0%{uD7|ّdM5 lJS'W zKo:&p|5!ƀ엩Oef_^^٧W=*u0N)unϦ|Lyoǩ֊煭Lk ACQV1pfGMG?|I=ژUX+#1z0vw#%4 VהS,F6`m- :&'-LjbsnX"ESvå%V9<8d:ZF`F#Fu]'( h}IXH2͈//)M u DLyi;e0]6W&7sF ل&drH;cۇyOc6QEA뮛XʓmO.3xШ0yW\Fp$B%s1g­VV q }L&&9,/ p&9[hvjgsɓ'69v{^q%&sh~-J?tdy^k@n`$<Εh6^@<\|v_\԰( MtL])ɓ+#Dĵ5^p(ۏ=;Ge\{I4bK{l[F. {aAsm 0xs<   Qtwu-YYK,{ǃGFusd_#3TEE5{{šF1X]Wn*8cP7hABE }x)d?Q#؞hhyor.Kkd6p#V>.n/v8ncaQ=<|phu$e F|oV HPN(FrF=b哄fb|=Ki.t7SG3SfJi*)^liok^׼5_ΘRa<sz)r"<"xpzyi6T(K|屉XfG&3"rUUOU5ue*~c;3=ϖ3Hb#&!+6INY$ I2s5# 4>+!AALgOIAn,oz슉,DG|nݨ3clץ>Xʲ Ir=g>fע5"l&qEd:+S4Oi\41M Yޠ,= `|-f ~܈NǡZ&dUǕk[%-BzU= Md2QA&dJ 3Z+:+2n\pZ4(zK`\ އ$.lMv4J΍%By#guy7 kosxtO?]`}%a}9fcI8ڭn:ZUYkcm!v#a<%xo) >hUzGm)%֐o}̭y._>㗬vrv/]"g'AJ,EZy +6 rg/;||/cK!7wߢ,9>Gl\6ҡ*3Xnrq&׿mSH$0K+{Kzٱi5tk |> }2'xgH陸 Q<!B5W+:튝+\LjPk-֎r{0$ {‹uNLpiez׼5yk^]N"ab\0#GoM sess.~? 1̄(17 !XC,,27A¨~OKstidy*6֗h4r^0e:e'Zb6窊}(BJcs]lQZ(AB\ITn(#Frcn!/qw׌5f}\ k&FLH3 &>П p-8,,PD ͝XUX鴔=W=; yndZ<|<*{]!m.*b@aTj7Մ鞡гٚ7IbrzjxpvBȣdX#qdzLץ%nܸ?oS~~>k 7n}\olr6p6ǿXß7~/ 9F^3|wo]v-?YƇ%ܽu1 rcc|Ai+p"lmfcm.5+g_ls"_ݷ$`RV<1. vw߇mer҃ S6V llpygDףww{J׿~=5.;onWb4~ *DDFSPn\sܸlnz:A͒$nƒpsCKL9x1CS1(ƄH̨bV b V=Y۰ݴYX՘h(.CCd^׼5y7d0#s'Y9qma@!Jx9Q,k5ck$>f8B d7Dm-;s+b xh!~kiY @.k>sL٬cdiM&[M^i1 ^ &n.@1ѽ~c| sf(r") &cp☺T0`XԆJU%xβ4&U>+#34xE+Rkh6rJ2ļU&]h甚۬w`0 W'SI6Z{tA{X ]EQPTTgj݋UKۉR@ U;#E%KؔN˰yp㊰nh5Sl+(K?<_|nq.H'K=ya*838pz|ckų"6u,d 뗅pob`l$\/t,*j۔nu[|_ypzWve nI?{ {/v.([[6rֆp岰{V`-ܸ 7w=7BzldDž=ןB(ZJHх=ˣ/ڒuwo+(%8=|#_x=/%!(+[{ ' icVZG}d0`1+Ylz}T%-.\/:xWJ=`LbK(k-ecj8&!()˂$ ςU:2 6Q;eT) -坄۰b0F F-ݑOyz8L {{KQl#P*Wֲv)5i2ļ5yk^$fٷf/ W`LNyq+5͚1+λa~NʩqS3y"coo, ҰH>Heq C&pV M?G>dj4;D[ G| Q{8պsmWY&`9Y%.HeD0`]\ $ 9`[NSTr-/ϒsAbhkt1"q [?^*hTFW~ ܰsqF486,|5 ^\!?hQT]`ˤߩv*>7RC^ŦJ'o`h hj8EݥG@5UI}cLθ#iNWy|wpsS s4DپhIsᤫ78:B3!o=nA216\'Eh/BXHOB\J y@ rO1, =V:`HUXX[ ?o(6GyܰEŶlGl`CY Z3Y虴ԗM)+˞Rl5~Hcו'e?U~sloΎ%EX`ع l*IEބS8;W  ¥M٭?dJYH ~p Z kt)|*kq䍔 <+ŦWTBTg18cibÚf^ r>=ϝ{8[rv %aP O<)Z:S-V҅ŭ<˫BkQp ՛V5yk^~g0U(KWD UUs*wGť:݆SwNҾ΃YV313ʒ0KF{3ى`]i>ȋ쏺/V"#Dd`M2a K;]  5 iTH%m$: .^.?@Qh臜Ʉ"3 =}CμZ!O ^+* >S IDATxlSF)hUַv>ϚA ΐ IhP}pWG^#g{W-%-+ctƐsI^OA{WPAw4r勻G?o}n;JPκ=wQ(^ iȚQY^܂[ RUW{P{tj aiVWUڵﺵK7 OW]x_3.jRC+bROFwh/,b4B)8,:f$IzWnr|b8968$ FZ$ &ƞ FOPo~S * Fq%80["lƚЁ4 ݝ xp<ǰ U043TY\P.p][lYYn1<}w)O _= :-eX֪|i14Ȳ6y&6\(Ii5* !IA9 yѨ4Bk V`f**CQy`Y_1kܛfp@n6ٶ8`8T=s3vj+['5yk^~ׁ4#RU udBVPȵ~iB'lfdm:tFemFJhX^"$,6Ȉeț9VS͠x\)< i0@xSRؐ7:8=/AEyjHFsc41 lowS&~Cg-'aoE"ogT,˩,J0Bf2aƩr{s IR0j)Q9O8I-ԚZ:YT(Ć\E4Pn~sp?kenZ5n"u^<˽ cL!SC(I($!3%o[]h]pA2C%caiX;nR$ -g% yěI$7 KPM ըh0FI%R1WQ T%RH)wr7b%jϟ4a .]e{ Cx]x lÅMwee0T>|j8:2 +?ݡ0V@롲"& Ѹ10Q1SH⑰}ɰ}IV!̈́ŎίW?1ܿ|n`熟~hӚժun`c}/|27o^ݲ?\p5#>҅Tidʾ  j,sTcHFUuѓc}B$TU(NW̤ɹ:Usf7F?_p]~ FCbNC j:#e5)-L{@ (\dN"Q(]X IKJ-C`%R²vJg_t~S AD{5ANk3L:+lVp"b) M$H`4$ RoIJ'HB1Ǻ(}r*pol&(iBfzr+m͚Th heW(NVHK GK!tgp4͌5\.[ E<|~Gsϵ-e}۰y};WDac9gw. YK9> -hCBSyrq~`_ !Qc\oo ̚Mc}+1(roc  Y32fQ9 H0"a 1,K)*HVf`0%1'tLdإر:9rt>H z!s|ufMxLnʲJs{Ee&hyְS6sn *XPƒt0x 7yNA383lXܚ: hUְIDnLd4XS}V-!|y8Mqr] cd9Q VP 8B Wa4P2<ē$J"I=/%Hh`~'2cp=Hvec%"/][7r:m?ml}Wt7FU,/HYX ِ0 $->ɱ^4Ҷ8KWb 8 Gpmؾ(տ}<}iz@WV LI0/ ׮ !trO{V|%<|y_>ڰ ­]pv}&`a!)Iü0$4M|ӹ\ߛNT 4Hl12eY: nR/X$ j x!1EX]VpaJ"fB+7 XV*4,rpaADFv% U$5H" ~=ſ3)s5yk^׿VMkBfnf6g4rTFKY_7E$8,|2Jsr`AŹ1 ^VÓУun?kyp7a֝PǍ ̘ ŵƐe)YLj9x2ιjlp&Hx(zYnrDM9G1kB_WZ6 F7fTX@tRc~ s0f 1v,@ 3tSpQԼ1aV@Z)4r9έfuxQoPq| &`\g)>RUL L*6ԓ6&VUp8`Y_83&ID50Qx%o1I)8(X! x#bA4󜵵5]έos5|qSRkځ,SKL*X^*J G'ދ(\RK, KYg8:NOndQ.l;VVJ< ``jY K>ʫWpt(8y A.m[[qhW? >TuX\1l■F%}1eեP`I\#Xg4r1Py%"T$ESX!q+B%^=z9J`0(gnB*Z/NN3Xߢ%Ypf.Ӳ8 '*~w> O)o"`&&p J5:0£28Rc%ϕkXy>43O 9JHs%Z%Ҵ$wkz8QU)z*  iH 9@RK$KÄA߄>TXnV<]ȖF'{=cTVk9Q23 sU#ڼiyynߪu&}:+^!lVw^GUil`d}4 45{L Wc /0 9::> ,K}̂~͛Ԡ+*~ūCrӸP4^L7Oް?!}UjA\H1A2iOXH|(N*Fn$^X)EO-&Cߠ/ 301*Kg@1,#/两(Q)cHJ+\ˠj`Lȅ,RaH)[Mn^wweeOxWN ˰} m<^ALy"pQ5C, k K~dBJBO1 grh5+kG1bac4~1'b *XZvX4JI F1!-88 ,$Qvn0*`$1 l5џ??Q׼5yߊ) }U25h 5^TGF }g~Hw97 dg3f S,>̖1Ć»sI/i(SaЏ'3U59`#ۚWipBz\s!CsBARyGY8_ Fø/T}xF]=:wr=nora,gXY* H^6N Hz="q $(yu3 &}Xe6RBD}WyO!RkN%'XL{Pk*7{畢ƥȕ({u&je궣xz]uFnٌC`з`vh/ ͦpdV!ARE&V:mC(gUe8@ă!F͌K;[u-n]d4 Ϡ a}V7Ia<= `[<<.|2pW|w簾\$pxYh×= }XI ^>83C$MM E '/>RȗU܂eX\)psA27'/ Oy']# m僙h\9=)k+9?'3 xuqIp.=P$o2V~bc+si* a4+qCG#1/W\ZYT ¼LӠ,3a8Oi½0IH`TBZljij׊(ʱ2q3k)׼5y뷬7(}C%Ԫ6Ny- T`I#.]W&ېsLx?Nj1S=S(oE:zJUSH}hᐢ(m}= {eKL[{8CPYsĖFYt'tM3Ed&]ɬe2 դA&@jPYU9<w_X9@AW{Ue>{3fSc`M+,`.gs5wyyݼ[ڶ}Wp 5 gg5V5+ŗR%BU\~&5+@d:go %Q8==kiKe.[)x }ixLll}dET#eHC`U 2;!>g'9fG[as$ ܠ:sL5KȸFz6^ZvNQH ;NggvngRNL'afVMnu0F^.ly3*²9ddSG!!z ;c%zmy}xM]5n|vQ^Sn\U^a dzԊ$Rp*O gp+˗n+ !8\FkրvsNѸJ`{2p}rv|&&-i&O7Xgy4x2I"9y0?#%NKĘO55py#ޘ[X瘞 ~0ZڜDjfi0?U#!O IDATNRW1ꐑ@#ff$D- 3;8q-`DZ;͛7[oX*VUⷋo:zq'QDerδUXnVvA{64t}[~b}+ -F+Vxx1&t&%\J:27)i꥚u6Pesmt6c:kAœrͯж]qh=9b770.DRa.!0躎*6?oB eP51^T3f*/0mؕY^a߸4vdf94zuE@2]" b\"Js:x:GsndbwCjUꞵϬ[.kX Gǧlnlc + Vۮ8>9WA5L ֚x ̏T֘(fBCPMq0H4C 8Ǵm8k`,\_ mUaf=Y0M=mDQ|Pdua0CB5b5]N#8=rM0i$G@4\z?;_ !э#𭷄w*3l*ө23jٟۗ*xMcyzp2s8]蠝*#Kյ]ɔSf0P^W_μ:zE_2 9X?r'LM}rGk鏝c| /ͱrknH8ΣyXH;{|wihc:3jA<(\Gt.#L2'̴U::pC xԱye&%3n8`ƙeF!!NY4F?dA;3/  Kzޞ+5YUwl'QF.$JKOlX*VUĔ>/1g2S3rp}~ s"4)yO%|^[{P L3Xb{9*=by[Se>uVc(Z(W^I":gC82*lnny/̥K\ڼ'Ĥ-Ehmh/{=7/P>sPI1hSk!M;L&ޫRƋ\bdσ䒛hVZPj. cfRX۞a^"B(-;v^v3)uhlK?.vRBqdedxl*'pcް aT]PCap.͕L9> \^W^~=QsnbwO9>fne%%֢i5X_\,ll3x/WUj$pܰ}:&6/ OGyNN-x5x5%xsƽBWNOkkϕ=3XR'p| /umJD׈ݘm8 qAu"nRukWW^wއW߀KK?!ܸ~_9؇GL5@׃x&||䐇_~2HpK w;z͚Ҍa4vhɥˬa^'|v8>>iÌ}jfD,Zim:c6NKz>Q?v/-"o^ntZ0i Y`Ky ]mTYzrw]^g@LYMZ?VgM ##ēc>S񱲷xW@cfkS%\0\ LftO{W?lp.gL@=áꭎvfcMX:8;uc:pVWE1ٺͭ^֋/}0d~pvWwW_{Ԁh~]yM[\=f.ggG_fqf,? Λz@1Yn3@Y/,hE)s)'cU=pm_A0_c)Ӕ'{`C ˚x?h܅_ڙyec,l]Qnx%e |G#+aۗxk`k?ά-ONR,J@W/q3sbBL eOy(szOQ *Gx񓖍?vy&SAg8PR|Ĝ*.ܼCh@G4DG'fvsBDA#zɌ'{=< * }fld9|hy$H;Z_=*^UR[cJJyəW_}tΓ'=@ry.&&?tEֆ =[~];pԪ5&p%H )cέȨbZMHM(,K1Z }[|Dȇ~Lkl!)f)Id"s`~Iwe:D87D3hq8އǙʵ04z2z s <|"ܽ+ΡQޑ:`'3x4x<¼R{'rEόdCփ7))] pr~tJ{?SVUbX7S m2f&/koÉ>O4tk}bv4^H]G*.diBak|ut[=VX#c<żV6r_RGp-}9EJm3'l&6'xgj]ilQ 9Gc#kPkt.g)]gq/k=3WJY-֟-{Pj@N4#\AYe^/\{(+H(jedx|/oyZQ[84|1ytO>~Snqx[o\/Rׁ0s*/&GNgaU0Y2cHmG;;<%T0DQhXỌ́ʽm5b6*`Z o]kغ vzrtv|J?Q)ew(zw8|Qz]es;/ף:sclΑ]*VUbAE@9-=={X__/Zs=Hua".F[,VeR269s f*Hb"V‡m?z)3M✭oP|$SfnS\RQO&4OWam^/`08=9uG y` {8pֺ{c]fs+X[3<77hiul.ϟ.=A/U0iSq!ͭ9._z~澱k VBy\5k\N5 PqrܻXC]4I39W7~bФT. NLjEʒڃ!;ͬ#uz+y/3DNֿwΓ/thG;ē'ddҼֆ qC>c~;\߾?1ŵFfƨI9}!w|Scɼ Pom]( ,c3!&e;? ?& guCntrd:+qeu 'QR4s?壏?g{ӣb*S'Ӗ;ۄш|Rkl"x/>_st6ZCе>Z"gVg)69$xc$I筷2ʣC503Vs-OWaͷux!3GK)fb1p^_~89D 3cfVUbX7XM9 b_m dRCK] FhKseU jʜL%]죟7oؼ`8ȷTf=<`6kY:F>g䧬^9y/%lAezK-EO ?8`.3f)g-g<{|{|[/bm}#qeN_G?;~/nMgĜ캥ΦG4z.M.yHlll>#v麎d r1ϸq.]`hR^,8NOgཧmsp |rLCn \4 8Fc=P]̲,w98:jT!&ju]_#ɹ㞟Q@y{jPھ!MR6EWoc I.29r 眀Y,X6ϛOKX}dskRWi￐hXS7VeSh&g$]ܕ$;dW鰵#8T``4YvfmA o O)ue^s&J]x\KܺxKdFD͉1ӵʼ{u3ϧb }/hJP[%e3ѥrzv S;&G0kI#bI Rd t RעӹA PUpZΐXmU}GH{&=53&q!sՖ҆E~mvҴDE,Wέr.et2f S^(⩲[R1V81gsOh+yy3r2ehYzxbΜsb]+kЮ057|Me{;52]i\DB IDATlxOo$ڽXbX*V>{fu^>6jx|hP4EcL.{vg@_%__qppp8bkkGE;G3Pcc&j1ƈoRZGjVȋǑpRq^ZuaEMgmmtJuI#Sk9r[vƪ\ؗf}/LgZ8GC Ԋިs93ٮ8s\ic׋W~5r¢/oS+l]t\rM='LZ\t"HS[4w #:Qi2sNO7ބ75eXvl&pF뉟$rvȁd\N9ٺxowo{mEig>\/NNdg5>"rB%3-\6g[<#5q4*)d(Q sҪFG]B8uhSP"-1bL^?pKaۻZJNK鏻ָ {)q9/ g D4buރopޛEk۹ppz9yy݆^RnETMv&W6<̜NHZUz=UbX*~Ք2adrʗwf6c/f-Λ-3w ?ɧb)l_ x+__rppDSsSc㺗gK/H4s=]cMʕ˜us7 ggJCX*$구u裏 &+Wic|>|Bmc F\@YlTbfE\%Tl1ZkZ+&Wuu)%R6yq5ֹ֢{FKv: 5!GGdP]w0Y9&f]* l Vǘ޻2'{ O-H7b]2[WhR=W3귰,L앾PIvBi0y:{ Մ U嘅EEc' YqVR˪4>xk7%g5q0k!Δ#UJת;DD=رCɑTT&4a(c.CcʚjeTXͥևb- HVW,' 9]q_ARQirV+xYe#ڀtwhL.[V9sJ^ҏ~iү+?R_ cJeQj~3Api[o`e `#^U8p/;n2a $Y*Ц,3ٍ{ę;!z j)ybmQU\0WtX*Vrι'xOٶМrܽ{2{FpHh'&,q`ȉ J}W^_Q14VGٵ1.Ijxq8ASQW鷕ϛMJɔσPqBZ}Tr;Ah OghXk7o\'g*!H2=LיZڹi΂ 3|k^,wjV]bfuVFu.IZP;%VHq7I^/!!9G,̵SEg#/Dl5d?4@"v4t?[ECrT{U^~VOKn$gX*VU㷯)uvJ7bB3OS!s& -m>']ƐyMCc_WØ,㭷䄝gNC`'h04c2sԷQEm;`@d+dpō)k;b9 v1ˬ/z`=Ty4'r.tlf]ܘRFٜ2K@g1ۋ9~ƕX{fCB.G gȬ\*`,Iן&g"?{pY*KZgxV3Աq4sefׯqf] T1 ՀJ|RWQy'+-R1BȩC/ eC/Kbv66k$&܈yEUy72Cp0/.Ɂ6f饥,uM8 {uD9%qG# %KUbX*V>X7Ӷ7)d2e>RT]s{eGDTK!~JDfgO/@0(,a|y_*֋v߿MQ_rt)s|rJ63'A;UЛ+;p.3m.TBV/>XM3 (!]ʜZc!^=7NRK π_r'F l-]V 㜔Rrh$Q˜Tsa:+iC3S*Ikǐܘ F\Ytwũ4Z 91Dj*J ^ %rPeu65E^nYq]"H}mRWy\v9"0pGi1bu]LF ڕ+v^)ୂl^ 'do}\V@K0(Q!U1.,RRI8; /'~Q Sy ~ېZꃅ.|r{X_j<{ROj$81Œj F>I VF֒ u暨W#ϫ_*VUb\FGuC_9c$4̽G.?Txo(+躘93N.¼ZK r|6f9pd41h&ggXXҕK<}eTISUmu5CҶ?O,nJ=\7)'3V)penx;MJM s(KdtlohtDu̦ߟڢ=ŢńS 7Zl&*#~ntQC x1c yzy> WsfHg]ױl=΅UX(&o?'wߕ #ƎJ˚ZkǬMhVUsr,J 2*xA$j.'62]+) x\rqx@mg7=6%Kd3o{Fqwz%$ZܦQ\6^<&5(  3f)%FRh!% I^rM.,IB>ZSogzC.)Z\@@$VoxH"ÕgNJ@#XafEMsxUFG>{Jm,>GZUbX*VFiB8GuI–M35unņ\$Wy3EQJ;*yt xN NfltμۣRq-v#UV= Ġ*)'&ӳsD gT\꫼F#f,!ej(tx2rc6@Zۚԗ ^vgaz)*ǮpvvV$ϜbrXf@̀ɿWӦUTA#' C!m۞뇻8wF{qk{&4<~SK8`=]́ؼ<{:227Ͽwt)QimB5`B< jr]΃6hkb 1bT k%)eE4)J@]D9&FOG&7Fd4 /}'aC|ӷЂ[\tDŗ߁l1ic9FSN3NNNZSOd͌E t}Agx\$auDm&&ڐQ7I^i )Xnxt%|\dilg 1ϭv֌j2PK1p1qi}u_u.oPogy p OxMDhFk 5͈& _$`tJ`2S)lB[jBsGFp$jg8hm0`-Ĥ^ytH;11: %VjrN-:'VT GzCAcfA ?W_*VUbAI hɩ{h x4k¨TgQ\`̖⢓nu[=em+{߾|g^[^l{ɥ?04yotީ 0SZqhi!d/}c-Ju%f>ͨfrNfTZQ6T@Yey{sLj9U<I[jkP!0,CaBa= "@ [ ?`[mKEC*+3+12"3;sFfbD/dVdčsg{< `sx,=JKٯzK5 JM9P.!N~\/vRJ+ h-W4$@'1-9{ F-i9fFfpmJ`=-lToͰ‰ 5 YNHCG2 ?en޺>IhT X;Fs24(ELB5 8ppam8%8!pỵ[ܺv,,,v[ۙsTȕ$ᚍSC0:W6I*81Vb'{x7d{N<1H4"T ֖O~,+iM3 vC&BXj֐ڂfƙCy>w7T.p3'gtR}p >)(\WyC߁\aDI0T|`#ez2Ν䉳TeNy ZB8ؿǃ{&Yw ԣ[n+ ΀ε!7W3lE BRfjNE[.bTNjRԤ&0Fw` w 4 >|x5Ku |op7#nyKJ#d@8.aiHvJC,vcڀbL`J &0bMp-r.Ġx('b4 c`#6CekC[bVYN"jBYjs*T?! 0\/_=NC֤@`p5x05US;c JJ~E~Kp-cmyMbIX\R8cxld,jgJG2f'(gEz%H z/x`SO&oGa/!ǐd0A"\XZL] W!(6jiX5 JE.\˯ùoexU\`DT˞zu>3^6 ĝ"Z  TyZRc(lXOfwZ98{<|lfʠcH-$ 9xC&A*. }I2 Մ5oXZTz8yă'y_=A7Mi-69uf_~ Ͻ+x]csӰs?;p |X$4SJ=5*kۜ|x[I"a+8y.]ak2p~CbRIqNC?(3dC_'-Y9_'jyr4 &BxHLE0HV5ckνs|5%|59!BkFxV{z}$p:&?Wi.xwgw`IȻ\-_MPH5\xNyx^gq\_rիAm B|pFp@ 17$<8g[䆴T=a|΁[' };|QfgFf4!+eq+S}t4xX3yM{@^) ˝;wWIQ 1&Z pfy)GLp-ӽKx!AOD0bP,"_dQbJL|̣zx~th 4^Q:6u ¾2*FXz7!.XBBOfh8>fE|#`O׋bxfZEYJqYՉ (0 0Fި02 xY?{[?)^\XWfa~J}ٽEvəU^}Ezu7^b^_sWiBV}ΚU) Cb!YOfe:aeiZmiv+AXcȲx^QI0j`TD4A<$Q“~[`yIx:཯rIkO/Ӌq{,W.7xnxe%)Hl6V#_ k\xn qrJkJZrN*ag6{ԫgy9w"YqwZ\rC!/µ (lY%"fc; ZONCC΋Bb=IEH+[JE+0p^_PHC8 2'8qr|.͔[,|LJzeܻ߳gsP'$U2%+:Tq}(`\÷n qU[ ,prYyueg6X:mevJVX[z#Pdmy0QTPh6$$k 5Z-70ؼJ:OޢZ=oKE}6r3  h06Z:TKYNǯʅ/| $Ioo2;;;Ԥ~dxk-J^Bs*w1SS/#4 =J<K>@6oŬOaؿR~oo5:݌@9%Ip| >wK k0J\C>$Lj;H{ xJ~ WDCBcG4\~oV$IV Uem`]/<Z xWPxG׮j(Ω-Ic L`;_¢!3r#va=|j Z1$R %9g [l#èE ZCGYc\.!qa%K=ZΞ`i$qFʥp뇱Z,,t?8 FESJy~oޖxSrC9w*&fpf-6.Gѱ9<7FA2pa&4J#UT>GJ\mҨ7Ig),Zu$~DBLo2쓉ل'AR".Dy! )[0IE>OR?O՚IMjR?EYSD/CX[[ít&ajۨ*ͳdv,~E?yI!i0VJXiGd <^견5ny~A[B焟 9%J%=?l$dVzx#_{Lgn/d;qK+34*3zvnO$ݢg0@cP&(6 " =*`PȲYL&(㿧>"År_o:ZPؔ\=6čzKpG%W|YN`PAIp᥈F/ .|]!.GA$Pi~DPQq-K>tb3gOs 4]Σ6\,wZX3Nޣxf/n?ͥ;•iH t˳y卄f# Y8cvX)S2{M3X) =ɾ{$‹W^~5aazJ(Tl=|\|k_" ?jsgiMY_OSlߞֽ7Z M!‹/ë+gO%ZM[.)zU׾bxO{7 KOT|NRr_W ;;s@Y?yDb:7Q#dI IEH[5:ē>HOCQ6$q5Dυ&Dya$hH W(%Y|TaFlD7IMꯩA?̏Ν;ǟ~G?M'tRԏXP]k09ʐ-X1$g?`/0iv(Fr(>c/4' HˏIh/mxaK~ٷgrGE?pES{Ɂf+Y$E@QOo8.U{)BJmWL؎s!+s\Ĝ0EKQ: O 1I 1oT*Ν;˹ ]9^W>xOR 33yh4.;On`Y__W_ez49{Ʒ yϹs[y F4W*ʼn's}ڝ=n]I?ۢZU8:HV{Ҧ0=mX]ga2RrX$6\<օ~O\¬:ero{BUC?44&ӳkh~FJA&t;d ƴ!)+.pn@VQS8C|pCw w)3ӎzF(ӉcfFxyήeOSfY9g ހ_M\IT8D47:7b7] jH٣1o~?1ITp/gϟ?ӼgDs9Ԥ~2:bqsXeo/\Y6PG弡X4kAXJFQl`YadP0@4MQ.Ph gYϟWJ渺#]QaNƕ2ĎC#BV'2<$FȐ5TRK ef#a9Աݲw~%iJ$ @jNO5IeBُ+q!,ɲN7 $g5fIJYù2L\?IMG~`P a7tH,'#%Z2w2,ÙرKp?DV9LOOE h>gjqkD?4=2L,z"k΍gJg7zǀ&&R`Oɺ=[ۏ"Ad*]Qbȣtԗ2gCe\0 Us10 G5JŒ.t3$IPUVWW'>Wwb]4R!Әh%vс4HN1{M`<Ō,lI0 +" }'VNG vR\n@e[xŪsÇ^Qt (娵H4swJE-ylՁP[Lp^ƁՔS'9qShnpFʭVrM,4xs[XYn߮p}0CZZ9̊vR4dU[wܺKjy8T:v~{"6LJ}+7ܿm61RhThfX_͗^W^‹XZ^'$& ,U*T TO[PyjZLd+8._vLXuVσi=njMcm k4NyE;Z @m,/s)66sTq£Py:wnX/ʅS{GGtztw:GB;h@!9A ",98A;bcVlf I-g9|$~"!`5ڥ @)eQԿk]9$8G?n;T 0[rbRzJHaD㽍C -埐)YR2+4M8y$OvF;JunNvȊ|l/JP3 AB=<ӣj&JI:tb!{z|\Qh!n/$С4SUaLI=DRSy`D"e*02=$*+p݄M3]VI1Zhٿ/ݨJ<]@gy\̂T mxpM`_}1I}t($IH0?Ϳ?K᳟,FcLj[>I}w1,þ-%(P)r&}HghK\6ĜA[NGVWWs.^caw/@N)j22HL翯V=!ZҌXq.8G>=n}T)~c¹m+݉9fܣ#A>'$c/gGvڽ+loZY!{?pG(qΝn_H1F  IDATRdȬKt|WE7@" Fi4j=xXKRP{D\L`vO VyRVPJV_]n2 2Bs`% Qjz1, 33ZY8KW?4ܼ%aMav1w ̵^\da~kJY[^fia$ZAA2Etڞ{4TI5,d$v+w h,(/=ϝϙ[]]]ely66 o\p2 J޾n>+hԅigis ?:_5=\ƥ~׮<׮bșZٔ^Me?vwo)Ξ}/X\CIS9X " i3>ۢ57lk']|gB1|idIo^j5_f UIB^ Ԥ~ԫdJK oYg=~~Z//P&tRYZp!`zhbĄHFْe_&{ڝ.%fPM,<jyQy5@y"$&9ulqؐXah$!6Z 1˲ah,ulHl `LSFB6_1x_ucy>Hӭ:NF6amJR 8FhQo6':.M0&w9G DGpla!cZ|=00p⪰<C免sͮhoxlބ EdI4\be\O¹S+,,54[RW CCyvvMKj`Z6󠅡縜bg(z'Z㐇[xsIΜ>a U>U 3sWMۍqzBk0CO3,@ַp9 /ZX^ȅlnm98̥Tiecmz¥KBx/l$w 4ΝO2۬4LMU$J%"?3?CZIMjR'<χal qbFJ8v3l1V p @!/c֣Þ KG?y:4~3dHzG a33 gcټ*_[V.h4Y"AGo`!#04bM`bqLejjNCg1$<@)Tc1b`c]Yɦ>HEFNy^ x#3(U326I,?Cn>(24Xs"Đ}TEgyE1 (5Rh<2s"C` v7(FP Q%M+Y~,ިqkp:b_' RıXh֤ۑ|;\!UV4ƁP jUJd`'I ӍiWxvO1Zf+7-OC#J-QZ0;ߧ5s倩 Oq Hʃ&W>0ܽtA\`CjQGN<<n2Li:: dyT5`HکE04]*@Bf&yԕ2oSVJ]hԄa+T+9dkӲyw3]o0;/&L5 'W ~Wz Wz Jp /V}9n5\& 5/pa#ޘwyW_֚&#S+l[zQwoB{?\?2ԫ)=QYfj&\8U$Hӭd(̓ SizzI̘øV\9\g,ڒUޖCHP,$NjR?U1ܼys^ǯʯ/|ǀ&5ImJǝwZE'ĉ;F5J&2), IeϝԙY(R<˞I,6 - [͌ïeoTV,//w*'/?VPǏ1 P%=^WnC6Y&%UV pV*lD n0Gx`XGj n厇ITaԸؐ|фz6FR9Vaaavn.\opxxkG Ckf yI,B}#wLK#&h/qݡ)b僧,) k<7 ?W ɐdtoB?”1(Szl87P),0B /2ᔠbFg &*VՅŘ:(`H.Mq~$Ϭ2˝ >7`$J/B>ges,W>LCCHNك5дZC5Yj]I9T7 f@;rzX4 jTG}88T #37@k 2+RQ e~p7n{f-Nױvs<~#] i5aaN97W/+A#;iC#q\u..l(7[ o+// h+뗿ƥKP5צצY\M9WXz=CxxWe*K'X\jSoNCnISZ ` eW !5)jj1E#H1?|7NGY } ^$Fx*>?ISIMǨJtgg|+*]~T*P;IMjRC=yf<z'!$״UiM,@a"cK_!wn$b*vbaGeF φ)>_idž`.nvΰxVu:ҙ  )an9OvNWd6D,xsXdr[3bFB/KIJejA3a\МjP6;_|_{CcR˿6i4'Np]z1Eyi`{>p=HQ8:n7qclPƀI Z@ZD,yGp-J`4dOKuAњ$Uvjrz}G79<8@aF fdyoqsyo7笹llQH!4DP, eEA@  `zMM/f7kw>cDw9f%5I>;NİcG[:A*Nﰿœ7y:kK,H) KW5;JWyr{`(n[ ίs0Q%sS(ՠ&ceovZCpxCh}Ajk ~WU0ZDu~ez* ins _*{{{/"]?$In~iR1y?0(aD.cÇdb4%M(m$4IӤ]~ϲ0D'ЁEemq+}Vj,<Ǚ+4ꋘ$R5/)[['Bf9/]1h8#,C5=?ׅo9`Pk,6 5];FCvOPǞBbnOY^a$xL_ͱ6YX[O U!BY?-hכeN"=>G![x5^zu6No@-M'Po +/(>l`NcLƎO0v/}KW ;\X m7SZ:lنDo&` ܹ+tAj!ϠnjQo05mNbg^5M a9WT=eFO@\ +^{ XPA=q}4c?"q=~W~7|'Oۿ_5ſ/nRc+~`P\`4W`Vk/gvL&(I2eŽ]Z򟳵3O8!"&T{G2 }{|X繇%wσp\PH}V[i44uq`Zr􍎱S ~`ƣՂ k-rjw~NXSc~< Rأt j[+s.xN0 &!9ίDBUk)LX%<[vZVQdKU4I5tQ/8S?6ր*!,8(Tʖ0bA|5dF먢ӫ-ƶ2S+fν>^@kg ]Μ9ť+9{n[[aAk 7?0*I]YXVl*k#rVZ_ayi֦VOՅa@IRERn7ӁNIQǦ Xé hu Nf#0Π C=IqF`m`V@ 7_+/i] b%x)áTyWuGy n~<p]Je9qbF<˛\q`.osyI:i I z]X?.y<ނ-ag[yг yva2 |"<6NYhu|fqq!wޡhQ58]k+ܺ݅n@K=i;i5`ˬ>( p30$!YKxꦏU̫VTEUA0 3^|T)V#{9~|+F_5l6؇:y0TY1ɳjAG 5^9OJ-,:qUaU52;{<9})vJՠQht 'W `8ǭwxxcT,Obu"7)| %z  (8)>-j!9T\I t.\T:5"(U0NRW<UOYn߃ᆪ|ʽ{A"]xVkY6]d|G8Ǵo|Vc. iHLJԭpb֖ zHyGW{+߬`amuS/ݽܽ6o}{]Z&vSgk;uÓh;$0׬a +$҂0#(㑡pDC.AWݘt Ld4us.EAMJ:RTqć 1)4y(s?swxשjo6o7 cǟxo\:wNMȲlzJ vΟHֻ*>}LAك({\$Ih2N"> |.[{qDM@QۛJ_g1MݷVDk {02ll q7Cu}83el˂vcpjaBMMRfmw&P)\ OсPdT,p--Qj6c#dqW'5PԛMZ I"qP3˯ X=Pvw-Cg/s/W?,.,흠Za/pVoeIjS'Sʉf##AFiT .*@F [5 fQμcJV:=Xc}qk, ϓQu(pL-Jyh5Eȱ`vXSr<~?'ҥK,..oK׾5>կ<1,bMϐL1ENݴNQbb+=ڼL3):0{9΅K@pO8#*h4PUƓuuD6=2O6 eA-V I",--Qx1/VWf;%6D>4ț)h",ec\ef)ώ]Z69&4N΍jSePtV&Msjs*'GĦa"ZW%8qvg7IpkEGF I3(M-x{49&mA\.ڭzTZTrGlQ:朒~5Ь78kW^_ꥫ,/f~<}$H(gya{C>$4HӋk 06Yg8P|ݦܿ[ ,-ySjVF f-,(+"xi2/ P8 iY={l=}p PN'8<.] %5C)X6o(++Bh @\qG-^k&'}ށh(K/(/e7z >sS9F"h aPB66 A'7u KX^Yaeef[WSv?rH(r8`85awOB\1I,Hp7VF(\[_Ja<e."*BⳠ?$^d]A}kQۚ=C`QZƯclVK?S?{{Ϳ7iZ|c J\!M!2R!ϳ `,ՉGAtF%if8*#/h%|`&OϜ @}G_|2̕kU釋T$Ik*'Q[ktL&cx̙L(0Oǻ)Ax|tI$BxY\Z(ḒUS5 ̬9#h` 8*83E ֢0/l7k M  qz@* Z,sXpu&FWQ|4{ '' ؾ$(6s$ޟބ6)Vnqn$"/^<=J %lV)lj 6@|$MYwk<ݱ ad07LF9Qx+2sid[z=EDxQ̴ !q҄Z=e86ܾ{'{`xd 4^x| AdFyTzFUШ-FhLQ L(VcI4 V X'HQd+g6Orˬ?m/`O wH9p+ W^Zdu5V^A{7KZp8Fpzc_R.b@H'MZ$iB!H <opk m4(NCeo۳m\B!nJdDF܉UB}qF /,;wL!c@)2١om[\pBouݭd~MWb"J Y3J1sSfEE#9TyG)u1yO{wiJl42R%S(TNt0UѼ"J^+IbwPD+j|ѧ.JZi$6(l\c8P-j,B`RpX̢(*`Jg6H 4OIЅq(=4Aȥɴf /rJV՗TKo_' &5YNMXp$xݭdѴY%ТHh$e9;FgEח=7a>C(^_=MpytM:4^ A7&wV$}zPnWDWD:ZGfX"pJ, 6.^Wy*->NJȵӪ++ ʙK9S 'YX MB>4Rv,6WNYzܻuVjt'qƝ|yr h]i`KWVWዯ.]v&N8+O`0V /:GxClpzyFIp#6Դ6lNգ-JxC}$JLy5%A&cEģ*$5 @(9 }axnBc qի//,~~]/`j=Kx»;;רF\i0^Ȱd0fwwOn\ܣ8P+eaw#x0W@$tj5M3 0AZ$fszY GKgskv:Klq<1y J:*!"#aN`r}3<4 ^sc2c fS3=zԬNivG#iͥ xyi`i#2&H084UI‚d*Pj:,0|S Vk:KKKVTU9wk8 mt<lX1X 8 6-lk#S\v(}9:qic[ 6sAjL`枷OCOc IbypU^pc07`RJP؈cpJ,,/3C$7\kG M/sy%{}`0rl'}Po$F 8C0%>v˱.CdTCc]ɭƄAd}abV/ĤXCbLX#$ F=68},.\칳,./sO0ũz]X9`dNQ 3e؇~&ӝxmϵ۰ZM^x<_xkN>U޲s1B"f)YrZ- ꚌuN2 j *`rFȲN"kiTLX^G`ja8XyG+w(ynN| z7 &SXY/<?4dy~1 E  _|s_Q%ќVIZd{w~O7plsuwTҀFF+Z\>Je8ɸqNFf'<7}Cgmx=3i8<%miZ9 !&#&yVlR ϔO$-oRɡD<1yc?Qf^gA]p#^y1# ?wd۷p@s@f ǏŽF&*iB&xWXn8ݻw9#x #ל~Kq}6y~){hV6@6"glYk95]5]hi9r+'P 0T);塱LٗVDf{Zs9)Jఁ԰m1 Fjd n߼EVpGƸdcmy2ƘT4Qqj/8wx2ff R*9V,+P;\o(R59o[RH-֡ `Ü!DE`NƢ`j*t]Nonr /‹/pfci{>B#UVʙ RVW-ˆv'EL :;oȴ=R2Q."b ([gY1UbEM|o<1yΔZx@w.u= gtu}yAi5H:=zL4-a0g+wTIAE:L&l?>S JV , 1^OUv;y^ה4ukZdHO:gUFD첚J9jd*]tLo}mr{n=8R.c52JV<):VsU5& J:u BDs) &[&g79W$A}xs,/7=z/Rg#cX6I"ơ %-MbG:HTiiULD DF ϞKl\pAO }Z i}QJkҡZnuV$+BRyanR:-#d9 {۞ɤ_O!NBWLc IDAT3Lڄ"!H͎XEF\` snQ_cI I&>(%v.2e[)t@jdĄE$B]4ɎYn5JT&Wֶt9q0jJ3$%R⃼XM Cy"ct08} /\dIw˻x<R ʘZ}~TǪۆӂZ{w[r1aaԲW/Ϗ9gwtw?b{FfgoRv}W9:[_#UCv ;G JV:/\v| ‹W3}ʧ}+YXsY8EHN{|up^.2 6*͸9Y=`!i%,#nܺ$ˈjVN`B CuҠ*Z%Ácl\.ť lMWG 1_fowow" 3eZeGZVNO(K+Ov;ϓ7S?I'Ly q*Zx|4*+$8_f Kϔ, ±ٜŞape'~LxiBZ{|:yϕ˧)!IʹN%gu.l)|HɳMetŘ"(Cf-(ׅ// 8#D 0(s0Ϲq&vzi" +mbxz~ y^q2vcLoHNyTT*vK<.4kObUfF1yc$~0;PM8tuS2g?/Rm TcF Z|[P njw6"UԒ^KV4 v4jXRa!ui:?%,kh?X*Uz;Zcx4?@,È α|X073.<Ϧ6LE^l9<Q ݲIAܟW&I)9.Eyn՗ Q̋ bR2aCO!amGH4QB4VU1k0({ZTλS=,14M0䑕LF#>~=Ha6,|99" *Ff-?9 ҘPEJ"b'HKRLR>2|v>GBbpk֡6Oe}v&*~!N(ݶEe4ҚӏвL4H ay66˗sj\.׸X-X<bVؔ})C! :^P'$+0zO o5r XRz prͰn8w.tL\>}[|hC٢QoR79aSLYV݋M]~,L&YSeB&>}$:)8^y5O?}wngH P{}rSgXhwi7,,ި7q_=Pn|" m'˅Y6mzuAR)M }w3=W2s9yc<w߅ fc+ gfs@~΢9a /(T+J KIQ81H ,'ǎD^O)}"X2T9h k51A.+ѱ@q@QL[̾N6M@KipXʾ z^o`R Bs܃>>%X52:;v}VWY^Y̥4qyF$AzdEk['ޅ8KeS)ߌd/%] *Su.gϜj#){{{QǓ8.5)kk۷Tt=tQ ϲ2MY*V@M(& ?ALUC,žw$BdL+[ծ0qB.uǩӻy)K>R%d1I;vxN_VG-֖ ~ !hY* i +-/\U.^Oxo[6VϜ* +4]Zk g6 B&GB 1u<8T,4jNDX^ 8{F8p48Y\9n~6; n,t..lij$W< oZ|p뺰ьGx}454haNR\_V^xA9sZq2;wxxع&SEcww7q:=:f^+ˡ+|;`EBRy8q"ؤhHN(מy|2e_o÷L/=Sm<1yY^SY\ )(r*zt_Fi'OaXrl-NY)b)ꕭOc`ZF%>#PhS9RX#X68t{e΅nP-~玟14LƓ"S5O $t9d2EB)O.ۼ$6~j$emdo̱jgg$!'<#L"fC`|jg$GJY6$P؊ ,\jmSI͍N{LU*G1?;I +rRk9"tDxB>- F&QyuX&Ì_o_!A4B4*jRZjPzZN5y ^ j4bMjmk)iZ$5LjYN)|uAI?q>wϤ͹3gp8/aJiT&,-Z%pSs#q.(2Nynz.\1t8>%_ޝdلNF]HѢaRMy 忢LƊK$6Th Lʹhix5VZSO=I0)2v7ο Gߢ?d4F;9s68A c-@B% xee8R?n߄:YXJڊYÅB-y]y!.P>Ay }PGO߸Io RSk-ޤ۳|5W*yr.8v 4 HZȌ{)箞y6UTv-;rCgƄ<1ycsTbɒA|VYnv;3mOW4,/vqYdbeaqVGqE&YQkKxYx;ح}jPT`٨z,#WAQGޙ:{{ 6%5D:Z=Y[k8,(t)qU[Y1QHbO͋Rz dyΰ4G u%LAֲE 7c!+dGdUS)1S;KUUse」-:R%J-[rlKrcpnIza"4@wÚ^k`0`z&pmh %U)T/眽B¶Viy^p>/r7ShϫڲRMl=Ϋo]hv\zE<Ѓ{}rOc%> ,K (=z]wˡCEfBx/8#+ϗJ_x+ީ_Ȅ/(/T-!XC%eYRzc-lߪfOfǸ;y9u8-[rq?]yrv۷5RnC+E-kK kFANW3:DΝνw͑Çz-lƖm;LEiC86M*'0EYB0FFxzƕJoG1&FLBcݑQlLLDaʏCÁci@|iQ<<JMXK] ئ֙[ި%ZH/D"HHsXsp!</`sɵNqҖ!1hdt:Ε\Jhuk|nghS?mvYvbTl︥n,ɋ>wa$ q d ҏ_|Fch< !H_kY 2n?z(xQ% ht*=ǟ$khw2’:S$EU\P-{>0Bj/{rւ1j A'B8y$~AnrQ Kt橃Lwtq ћ06aS {+%B鄕a">ÏX?G;:N49;Oi_ G-: Qs a=,rN8x>=8 e-bu[(JXD"H$u>@̉.ؾeG2a4Ea7j3 ^`痰bW3Q{B8m]{梞\gAq~]JaV嬂2Zk2cH@Y7+`8P,+jdYM a^$ZZKf|@;,B@K^U92066=etQ{3?ʃ/399J@P0c/$YʋXmT)WnZˆ)KK%yÁc|+!mpe ffVc->/2z }ŕ( FkB^l)¡;hߚIB`\0jy[Qs)kyꔉ~l$xQ TW{ol1d8 (GPP gg;gxŅ [WyZVLfLQR ^u_g)pȩY~I|޻xb~+K`tɇ<ћb * BUAAcш@pwamA)J3}Wg#Ӕeu8obZXdȉS4evw>&1YFf/hQÅthEQ:E)9sj9go,_~>҂7[ͦꮋo7rcdr5F{GsampSHhkXxDwg{2p/[G ,7z H$DY-̘:6Ź9 B?bHUҤ^lL2Pd':/E􌅥 /z(KlsAT돤Zۈc} Т7=VŪFv(:\VQsc!; -f݃|ZlA9\豨"9ǖI'Onx^Vo;z>׉ _ABow7C33h_(DЕB+h[@6ۋhmL|̠Дl1Lpoۡ0>?d %u .A,*T7T|X`ؾ2ɍF'Z;h ew誗2a'gb8@9:z2,c'ϰ판 FSs>y'xiKy^y\E /,ǎbt/'>Uϵ_/.-[7MBEp)|i'Oqq{}n !GcO0:>Fica 莗nO)hNW^e6WU\q` a4ǎfnvY_`'w ^'`W,--#8zwqˮ=pp^t;莍Q?j(ffyCwɧrQN0`ǺWy&z!+|04ot0lHü̉)?@ojwd|d*tyBjF3smQ:‚EǗQu҇RnU4spW/-F\Keyj[kv@YQϪ:(km(04CU!Ƭ&xs/cA-D.KC01X.AWiT叮ފS]:9$hgg ;uRg3 ˽sK,/!5jz+} ˜yxٽtF><˲~\~eO$D"sJgʄp(je ĵ!U!UIϦJ+lݼ|X 'cmq9AXqhú'Y3Tlu>ʲ VZa>*Ti谭[{~u'ҳlyL Wbuxo;Nv*\($p!U&,؝(x/Sȏc(ť%;^?\ĻLl IDATW/cN_"rH gMR(_`|^QA^ڡ =ᕧ_,ͥk(U?wyJ4wo{U^ s )3A3, +}3:2BQi,b-X\X?\ڐOlo`(0Q|TsySWχߛR Op* 0 \5(ݕ83Zc2FngjQ{m0R}X\^dai2/BDkgQ6q/TCWY7=) ^+ ƕi6c_j[̚ׯ׿[__iY+7]w;D"H$ώo+4VQ ~\U^J`ai*Z؆JS8׼'pw/*/ґ|z!%წLs!., E&')ucQJU^z,nl_l%*Op8;~3ִt2+ձtxFÁ1l\{8V!|RkH@7*qA)<[9!'NAZ0CskcE,־uNr8-JT '? I8B%uEZWe78tD"H$}-QlZkh|/̼Mn12RJ^P{)~0F20AqϽ3ٺm }M<>: mf02\{T9t، -ѫ!"^^oU (&6Xw bA l\rAVraN>tRgȲ g-NBdA_+~*/6 Csqgaǫ U x4-arlEr|zuφ`VQ Sh `7H/9"A ^a8߰F; 6G2puD"H$5eQ.RᥱU_ |G!h՚;z:b}qnMݢL!%‘PJy$eۄ#6,%タip"W Ry-7Dn|O(,/-y m*!n;nMj]9JX) cخeaq/Ҽx3A=Djqg#P?p^q|i,sj^5(jaY3( KՖQ)^͖֡B qX;bՓ>5B۳B A]5aEnhks!C !ѓQ5HU{ϔ/T &芰)[fd U]g𚡫^kbmkQG:퐪sm㰭F ?k#[6ohY5zq_ͩjG}W_j;sl@j8Fh.*_nM!Gـ՟}{}o,H$Dm:o, rB>ƠƊ ;(JMgp!3m366J"ށ1_m|oA瘞\PHJcs%VŠ#º5Ł+JKt,m,.@ 9ԫ=b" `Ŗ'sPѠ\ePRà䨞a!4hv*EU-nSXDT=`kfDѩ=l+LG/HBwu{EhC|S ݻ GC! q |ZC+TA`(ȴ+;t^]c:F!kfRdJ3`Ti&bGq^y#c,+81š+b BC)0d:4#)᧗ \#F(LW8.ڽw?|G1p 7pq8IIٔhe4#FƘ,7Q䪧^`0GH$DkN8I=u5\Aʋ XG%xQpKٲ)q-C'Y`W=yWE]>cm j9njR/r0bHUޠwy_LU[u\W{:T@bp|ZH,֤nzquZ(F.ηhqUp+n͂SO߬jOƺӌP90"4Q{^y[A 9u`9atC21wj>Gs2%/dܪs=ޕW)(gKμ([GJ"Z=4犮c*| &*V&Y60VO8zn5nҴ{iFo|mXl ՜ͭiR_(dϠeL:T!,\@7RtF3'"~,,-"'YXZ‰/NTu"(-aqCS'q?OD"HxGbSR WʽBYP&\hT2eV׵"Mgmʐa0vF sϘ?Ξ!!\͗HQ9PtZmVz}xaoXZ[y7|m8jm6Μ V֪B,l]YL+Z~Nu~~~ն7:04Ք7j (zUVW jB?-_"WJ|ޞCz",;aA_dU7k={*\WH*Lgsp☙wIAbXX>tQ4SS{YS:G QU Uq6zxeOe"H$g P1a_UW)l$_<  *9+'+o7C(#K !oT+/E0ɋZug/,MXXjBCf`8%(Yj莌t]AA%}SR+q\ `G/ŇZGcRĦMLLLT sZEB~:p :s;?<69ṋc\͈", Dbn x?>",=z KV>R*TʇRÞ晚bia`gsB`dВ.x p#XIQ!G\j)B~½T<VT)½ĬјLD,Ε8)1- v܆ɢjiT}2gFYIw]?} cct:1lڴVa|hm߾/#F?gbl L44!0Go0~i8~\vU+,sαR,%=4s83c)hPTp;U^h ;F =ӺuɩۈUUCSB$E4:և8`0RH'%D"16CuY7֋ņiT\︈nn}WQ`muU%ڭ]J%~Ywgx)Vs_gD~kͬ*~\MEN.;oejfa9*GΚc0Y10ȇXg(FGwnКtև*_\hqq6lކZm\ϖT=Lȇ[O>Sɇ )W|hp,Śѵ^:dzޣkaX;~O}͆F/?֎> c3%( +-cnn -!Ml}-NXXX^]MOwhQ󅳸 l+F'e^Y2JM#_9*'W_#/F7>A[T]SuPs{}o>#ERWU_o,a>ž^[7%V"VWʟ+*dN:t#!:zWBDEV6'4,$*3zQj:.z6A g# r=MFo4^g:U k+.LOM;:9_ܺM9[ͨzA񸃗U4֭c%JF4E#4V•qWk"^0st+O{" ʺs, E{=vA"|7/ n2KKhr\6 y J*aFK+sI>`Ho4>6 V4<(Y~Ӡy. ;4 Ҿ s.^?ӭs%ymEi+k!~Տ*8[/ÜYX"VmQ ĦϻU2_ Fjрݮx/?}uu:%D"xړ JoIZ%!<>l4D([{VEu[mf7FUZA2MY N4KJ4<4Ϝdx*UP;Qnb+!SSSXPыDOֱ̍Y0Ys?kp(6]Z[Xh7Fh|0>~lMʧ?2yn,!T\g96qEQWeF m t:ָ 3VFaz<D"Hgϒ L+r8z~~! 抈{,<Ț},?w6P׿.g5?ˎ~LO_{Qy^}gv]$-7z<Ӽvz&/kG%73|eeCӠy Fvgɰ1?{dJ81uc|dqx$D"xn:J$D"H$DْDi"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑Di"H$D"H$I&D"H$D✑H$D⻝?=ׇH$$JD"xy~\B"H$kRn"H$D"H$SH$D"f!$g7sfԹ>DyID"H$7KߑO0|n3>%퍐o|֝\ux%F=L<8EVWud ݖa<E^zF\jҊSQ IDATOkY x WR[hy%7qH> ,R؂V,[=dr`2Rr#&X>w򋳿ħO|K+s]bY0.ߚ8&.^ѽv^:g2f3!#<4/"ek9`f̒}We >H$I4H$DyLEpF+vȠ K$/C,چVCOtU eq_}-mkp\}urde4獌s. 3KӸ^?M{qƶG:fCGʽ98=M;=Դ]ŵatq閗q\W\Ǔi.̗fXl8}`1gbJsz vYncJGy^LWo^o9ewlz/~7>S<ȋKt(ZC:(Q[z $BGD"H$cZCr!>_P\~x6NL;>F~ye䯽M4iq<t;Lg<~OCc_cVZ#\{7oiz+:}Ǹ`6VO<8[nUz#%#-ˈrhf,Q|V}{ڰ؃n!W/btFl*8m^Ķ(6[L*6= ud`[ 3촢ӱ F>]c(˂2 # C/)i SYz $$Oi"H$a(Qa7XʘbbIg &Lz;xN='G;d3̩CC .Kz`哜pΗGロ nu+_u^q+G8 bih9u ^_jpeW1gy0kw?sstŌaZF;˸.jZ{e+=dϸXc'OOw&[YY飋#'Ʌia.Kʲ`DJlا;E="̺\OD⻞$JD"H$Ǹ IJ(?AxO_@D 8/D`Q!q@KN|xCR(N4DA D (PJ!O)?nGQ8Pއ)-҈8]a#D;DSqCa- K)M$kRn"H$eQ(KJU('8^j,B%W}4J+)E" >oW'΋bA!QAsH>a^zY+T ZX*QZ V1/;Ca0j"xNID"H$1(/R8J9XPNY T^U .x+ h8D)1 qXHP- )(J]5t`E/#AE!>7Ի0` K^LZbExQ+ b u~D!m @ESsMD"H$cj\Ѫ=K+B\S+(iR`]e֭lݼV '(|qtt"!7ӊaQ*T&("o Mj/Xt>$Tվ''ضc'9}$+D=J1ayPFs)!:V8'xP8%&)I&D"H<>+> 1V+Z(h)AF /Z.*6rI&l_?0X11>[F~-KFyfnms|>?~Y^XDYAZm2^ier]r]w2-`Rn.r^җpٕW16e{y;vmMs+;v\HKk4uª,-mN\^rf]~gn-?~K9v&&?ʗn#/^@+rv(M$S(M$D"x#xB}.FBBY[cCL My`݅!\7q ^ʮ-'f.{S;' N^t_~-#|>0_pq_}g>e+o|#ؿgk\sS?xW>3dOײۿr>?#^χ ; PA v]zϻ߆<(7O56[d:_2/B~%7I(DUaL)L"ܒDi"H$F~JCFkp) enQرy;{;a1cg5JJNafY;eӌϢgg'Xٶ4nv!}}O<ݷF ƷKy~/K\|^rݮK'{v_=&~g(ghW𝙦~|o_~;:I9`1>d%MG:jki=8weWo#d!y_VY΀9֪*LYsND"H$c BW|28 /_yϻ3XFUø#nݗ^͎??2ͯ!ϻ8v7s]sm}yNjc=wq/W-\.<0FӿbͨSpN>D;x}OPKK U. 00woM2w dNh}]_Fډ})?1Ko@m+%-s?[SbNPnNWAa2e_` EaciV%YH<$QH$D"{-71?<ģlmWp|}=\py %Կz>NdϞ R;% ڱns֭|ߍraZ-N_}mu1_ɘѕ{?I.d^r; R,0*RZ-xRD9%D"H$1.#5tr邶3/_^Av0ꦗpo{?'\2goW1WS%y;Yw⃿Y\NObvz͛2.ر/xG'N)&/+~K޲G~3 ZヒﺗY2 \3g"3mde׊#Ǐ2;}sw1?=eo~7ȦE3 \hnf~oQ7q+_xG,296K_O{;c[zXm-,.'xe׳ҌYA\sE<6+ 粽oAwZ/{???avރيio_=|\hpCGypSQ'K3^|NnܵL9R >z}߻z?r?/< !:3EN7`r.߳UpX&yJ} H$D"qvT8E! :="\|ťč!^q#'a.?vr㆗q_,ϐp;p 1 , (L T3sf^I~M[V]X0߉Obۏ(J_j35?#MRAz'|63_D?= /М>}#KLz$~|?j.2 pwC7 /@=[NͯzfXZʜ=[W5,8eBqD"\Di"H$q%kieK|/>'^2~>Oj_?ՂͼE/r =⅗'cׇ3*:CO3sDB< ^/rA@QPW,(*J0  $d:S;=9jNOI@>[µ::VwO:$Z r$T\ڲZܙݡc5,ޱށyȤ)b\* Dǹ:` cXj+8o!ZܠiHeuǟp9RVBֲ~6ɕvFvUs:u8D7W"eh:rfaL6zD"] L!A{4 PJU9111Js#N! FrIu(*-#0-)~%\Ȏɓg֬]KBQT)+B]9p7 N\Ggjz殟g~A#r|ދ=N]58)љ~"GkM Mߦ&?w7Eo,oSΒwxf?i2}>qRFka^ُIK}E~׽/U{Q]_u7j4a~$vpg9;9o,XXv /géNܙ裨 Ӑ @,^2j La]߀)Ҙ Pp@¥a䐡L8O=Nd[>lEΝs{Qo%#r8e)Izl(Ҟ ݘOr%gSe92MHQ!޸\Or]{Ȟw/X/~3. atY s+MkM| U v~vO8Wt++cs'\cw+^r¾={S[E]ޤm;?.455!"˯ҳ '+Wl/5@ӀsB7s 11111111G1*A sP,ᤱ٥ UWt'Fxw~ 5f|{X&~ _݃ eǏ[`hcm\Գܼv'.[K(Fv*з܂_Xvo-~\S 'YA-[pQQ Zf-cL3e+׳%njS&ѵmd,J`p,VZDL#cȀ  DYUgѢ7Y;*.۵ !FK=(T~UK7111B͈*(m|B^ZYGBxiŅI=i"j>쯯Gm }h8x6VU3t@?T!"OTa))Wٻ TUbȈ[>;lo݆,ǟf>+(l܎ cWDۭ jT-Ukoݵ \nC/~r3?0d4kG *:{0i^[9PXRu[7BV]F㿇+'S[S+(Ҙ%11111111G3hP k,hcCw{VgÆݓ/ `2r (30_Wz v`4Le>:\9sQ?PHuA-3b?/OsǕBJx *8Q {ɓ~=bjV)$ٵm;{ipnjС(-Mđ\畊}G/Sd=֭'V$IQi#&&CҘA$|˖c]~~urܔNz+*wӷGWzr]z1_A]hu8 J4FQg~+nLFx+Ӧ=۶iH_^cNB=;dv ҥ {DeKwtwc܄)|2ԯ{nT!x=p]"]o}VڅE {et.J(%UAplE׳W{ɥ=(2ʨ؇RaR\bQs4f&~]I&R*vCʠpXB9x$sfaa+/)ҥX8c˿Mjj*PhR ]l,,f悗5)>zu1mt.EMpSrH:b,o-]}L2Q_F:1s_eֽ|bـt !u}z0kz46!͔va,|e!|S \.ke4M,vlg;k~y5OqZB .u* 39^_JPu҉ sTU׳/3Xf , hQ)"xbQs445j 3"7=?_DPQO|&h<_Cz2u=A⎼lxl.H.)Lw03 6\kldȀAv%od|kցXB  JU]u˨cG1䖛)6$ph-T5eH2SIE;zCePa1z;3gҧ.ּ6^S>KcS vqF q^|[sQ,[!mbo^6m歛6G"ZF󡬣ϿD kؿ@!(lSYysټs+dպw_ Q"60 Ә%111111G@um{f'QN ֨I^F݌\g[o:X$6BЉk-_ ɋsMB$:B]`*416!jJm笹{7:me^VwxHlw=]H`пWvUPQ{=XpZع]Zim0E gYH*KS.`媕ZB!֒:t",&]T%=?)09]}a>=/-C S@"e!B IDATB`΅ aVr81ўBklRE*BcoU{_Y(ZSh-8Q:Eo% _g׍5nbbb:XFJ:kᒡm/\rg9N–tiG慨PV GEI;2^׵/Ht .uG]^pW2cmQ͹C=߹FppJ ;q. -N (y qeJkYN8/Bɰl雼MP.Z03t҅Ɗye9 Yb {qD_dm8ĂA-w] WNp4?б8!@"ιD緈V}o@DO"}D%U-付3"1ֵ111B,Jcbbbbb\t," cmF#hmRgеuQ;3_wsi^ۖr"7"WE*KhچvQ[m;ޖyfGBd㭽h6jG^ڼo;Vu߹f!{+턫F]]i9?b < H FjET$2,pl9*pXidݺw0Fs`:-YAh H@\hεf4/ ?DU(6?@kF$NA۷U8%+墐];Ei (ΐ[ء8&_XѾ%8-#:9-76/f K8x}[ﺖ1i`n!yp*w҈Qkhpc| 'J\$ PI+ /V1"X hhcʥaK.Dre[+yߒs!.pF/%q,64җpx~B$.5у$ʧ+)Pzb4sX4|^NGɒu脇8V@ųt~ Ҙ$111111G_K*hZyA 6vZV"rr[iv{hڭ5=iv4ۻm\6nkZEPC氍ڲ-cim$M3/u.hsomvZ J(kJ Ij$BL9.L!eBiD<e 0@*9֠f5ąs549vŌO%49u ТH%,W' =P@* J.Dw3)N &9hs @{z}cbbbQsD8G!Qq͋V״ע$[F*}a>(!P<$,bZ"y_Vi-ۅǶwhۮl'N^)֮ۘۜXk§9=No*зpd+C&%|VHZ% ,Oቢ@ ,|"Ԃ x C \G@Ct"4?QT9N9yqTS)(@ ,ʼn'f9vT#%EP\w*/i 6r҄G&)exEmSx~!΅֘!111111Gs6o! EŵuWm~۴}V4bu]j!m\Ҷa‡sKn..k:[B}EhDv/j[||,G(oC i<"ei'g9FJ2$^3̘>[ -!5i>Sdȹ,c$δ9|X498 6k AWͭM=_Ѽk C:]Ĥ tJ$y"E&‰f0cNr\uU@acH #b: vEiLLLLLᤍSz$TGmNQ=ȶ0[ݲ)/t'>g:vi=򪶶o okڮmJ=HM76;tۮ }/l* Y=ѫ_,_I)/ |UQYx쯊n,&B*AÇE3՗)^5k6lf-L?TA Nl{Y_幗^fWqӦNqR4=zr`Ɯ4tefߞ%XIO̩)ڍYO4e#6aQ`BZsΙ9M)(LPT0 !sB$y}ds%BSi5j*$\ zcbEiLLLLL.|7 l}edGh)< b"3&NW|/.YEW >}7Y=p կbCuQ#% (|ʛ8pj9^/Ζu9Rt)NqE/EXX/Ϯe[ 7O| 賞[WB}gIhrLҹha^'fS28 1`ő!.x$Ǎlsf4r926q30(9ߢt9PڹGFAUr姮 _q̭wܚ/re6N{"^"p6JXےK=i;?NhZWJ)!Va< w8E q ABYLHS>ٜc*ݓ/LTdo~e{#N{kDG*!>'l É$BZ!.Ԭ⳯\XcnM&;`X&ޤ4&EiLLLLLߛpz?H>ـ$g}f?Gh7eIuW8i6 ~#>ӧ}Ouu5C׿Ͽihhd܄|@w.󟛏֚{y7F N=zu_1wW 'ѹ,DgRa@aHMQ:G~Ү ,!%Kt°~cBv 8f"5 ų 4چXq9yd^\\-8/RĂ5W^*\_!@;.*/%U5Pd9dH SL=M85z }^&ؾ~$']ľ:R9|/֒ t- ɔ FQTUS'*z$Tt!h|/Ee CzH9lVG€F*֮EiLLGҘ#ཛྷ҃9$ik^55C:ˏ 6w?^ŝ_ ?pMY3g3h@GZˮ{C%~yzLƜ4_xYAkMTUF.qͧsGrGywSN tI }zʡFͦ4d}{X:N#Y,,x5>II'Ǡޚ@h+J ~xB!A>#ѦePF!Ч%16}B!a:Cnw6<{CΖ[n&/'h ӁCRIu'111111G8Ë~#>MMu-g{zD,_]D.3dY%EkXt*i0|ܳ(T7vW~ 5Q&-$>&g˦͈LȻp A:X*ÅŊT@%)V+\,)h( ,xu )MAzk6GbM{wpUēѳ֯S\aӰv_OE~ªU=9xOÖ͎E0oaJ&)()p|틐ֲrU>4A/ NW\zW8} |,A%AYɔ`F)}.Im= x(m2TB. )cCD³]@2}4>^E,Jcbbbbb'%̇UD_aZyXqws1qNs/0Q#C?><0ϝWn*JN=}*@KD"A6kys'SI6(ŒCr& *Fu$=K*z|OXop*jgC/9H(S'K `LMIJ;Yѵ+L"),{*Bl W^~x>RG[g˧J([[OR*I|ky)4{*BݍN%l؅"O@Qơ¤RTBd@‡\Q1d0$0ier|M`!phe(L$!FSbbbbbbbi=G>?v:\٫'‰e¤q7؀u!UUQD\:pb9Yr o'm@6!83^op-uCp29ܵDGࡕ88NSx," >?`'A:L; !PFNa40!$vO4Na#9崓yμH>Jsa[_4 $-6n+jw* ')&M|p\%ds%o:мG?d(λD/4 6 r4 MWzeb͚MC-@'R\`qX<hDix~ю{5=t)RMIi |`ABFNL?,&&&&&:'͚R;;ogO_!w9 ^q )i)Cݻro*(*.);(((_-*ӦHʇ{N;H@ёh'a yNI2TPvl1ѽG{]Nײ7=i߱rnoH.Ǟ^LԌ?QcBSTҝ >ڦCI:Jڋ=ot08P4 Weg(29n,n_h,9Яk3tO+*j3TTH0pa'!ǦwՔ:B5&111111G$::kZ0r_[>ڝ{hWss9ÔS'1Iv*-gtHfΟR^ծ#%E37C صQ|<,uP\dmW$|\%9jڡĢ}3N;)Ӧbu191nPX0 G4+=i̧59ZaoֻCccH}C' #+νkQ_"[w^]`)HcʷpG4|[PY8"s{zK))vḿN;Bҥ%g<LKrYT aCXĢ4&&&&&8-ab5N F'olKhV屫²mW.nH4+V:|iljMn9,dIkc> G}ig*ӳFØhuO_ ;6jmV\ts YlّMML‰Q1?> g Bs B" zcͺ<[Vʚsfɧ'R)W ^̙c%@Sǰaa&R>)YBX|!D!u NX0MzL>.)c Fœc:A)hbQsxY t(U*2ΰb-M +Ԥ\~ ٶDzs{e Ca&V k4Z ьȀAifȪ _pl8(NXdrIn8PMQjkkUqOүAE @ _},_モϿLqұ!'P8(gٽش39 8г)o❝*2 Vr>LK$o9P\9P(O!Go)Ѕ\:UkRt0(YΧ+1GEiLLLLLk@yP߰voѯKy:EYc4!,u ϽaŠB 5{W؟W{s>L$䘿rq((m[9̞́У+z ,X(p@% 1ǜy/ױop5a1%R8q^\S&@]GGbА(Cٴy+s\V,Y1|0y%gxABs*20 24e455gfhMddYFs"3<Ͱ{C]f-{wkn`۫0Gii)} ~i>ÿ5?/H&q _ O/g}ݝ#&111111G@ƴR(<ѯؓs2g6ǜYX*4OB[Θؓ:e+ =IL$"'l޺mA,R4b4spV+scr6a9DkТ8P p6Dl=3B X@uR;7}S(@9(^a Sd̛'t+K3tp墏&ؽ^A%*tҀ -%Y*4O3X@\!heϞl.BΙҘt)Lm]-EtWbRҹcQ>Y͟f"dq si.D|G,ZIvi>d5"s(0F,ap<N(b< C[ Q\<8 IDATYVX@ $:HH*P"&TݏKL-y(Da5; S_ȩ–iyB 9PIx+& i0vlKwuwަ]`x饢 *UpXƎ; dzq&2 { A`?eW| 7𙫮o' og[7~iʐJz)ԔgϞ1d > 70d\|.lRڹuƜ8K/E]mhrnf6oマ7b⤉G7=cA0|"]'3s168qL;/Φ&N4o W\y97t (9KޣEtwb>@طw/'ߡЂ  N1b/L,Z 9 |Kq$K/.mvMhj"}M<$s$!F,7EId$L ТYBg`(bu#W*HRyaJ)v .>aÇqnoofK x'߳m[{'!o܋GJ'?o`ㆍs1wϿ<=Gk^Cee%uϚ1ǎo+/w|7,垻`y,^g L;ⷿ7|8ߍ50ptXl9'cSX+\|Ek?t:=wñ)sfaޜ>!Ģ4&&&&&Hս0M7s;1 ]tQ߉#r/`=DP*92QQ@y [h4q !@օX1(Dk*| PN!Ƃ0.8XPa7KF,yADB4ȭUD(H+Р#4N EZ8bB&I!JQ!f_hr@o)@)C`@ഐthbwf߭=9l7a5TUUͪIR9*WһOo.żu><1q{x?aÇгwϖ5٬ZKΏ֫fYDHX:IS&ʂW?ag}ŗ^ggs綜?gc=:߱(9BzuM?nPRTǰQXbG{i:F dHhuv$A,94J|Z(Ey>V/!hR4J@& %/PNV T8xp(#HhP ADPN4(TRU *GQCjA9^u.f NxF״jTH~mkXG`4X%:2&YAP9 CZcH {SWWs9s9d2M?"f{'ܲ>6ɰv: K_{v6kQǏb]"JהtTh9~w[?E\Ⱥ|2$shm+ϿSG3z0;yOOڵ۾N;c߼~*Ux<8k%Ĵ&S%Y| I )2f-IсpdwƷABs^b0ӆj4iZDa% ĠhWH`EH*!' ` MRS/B TBz@Ϫŋ1+p sq)1x(tA`CDظe1+W~ƼOHԱpb&{:_/<2=p\ y2)(/1{ڵ\A7H DG\Р@Q.heܜeR^^ηnC&tANNHeŲK8|cx5\~iPPXW<ٹc'pos? ;;p8}zrk3NGǃ=/K~0? =Srrra׮|ۃ59s6-fɇRJ7 2 \{\r%OxAC#sċX/rߠZC4 n(%HHU!0R>B>FJt@DWqca.~ ᰡ=lGcylvt0f Le"钮K mC1|HRV"s'94CzD8vSy=,mbyp;q3G2 P $yn-s溌VLWଳrQo=O}&ξ7_ F;i"1DY*WߑPhYELBU8N ||-:kJ#8!.QDŽQ'$'m稲*l۵}%{۠MPU5~8!K0Gpl{6+J-bX( s ѨJr8e:AE"\TU/r4:0aYg㕷4U$/Oy5U?jޚ{K|<28Nϣ_*>[ݻtdoUw bu\v> % a0ưv`Gq܈*JinLeg__KgʠraD4i!}H!WowXq^!&~ob_tEX_!=ԉyں Ő%R*MXx(%0{++9p|Tʠ^C\SQUq ǖkksr󪨌VE<7piCVbX,F= uq`O?A*ZɮL/HI1r2rNau-MN,bX5`{˓c8H0cBIFU NEi|@г`؀vZ(;ŋKW,ZԓϷ1;ңa;0BTY!ǜ.~̚ _:ㅗ_w(>HK+ O?.Ơ* xP@j'E `R~G/<\^|Փ;qйKg9-}RMK\qF:xƝ<y?svhD@ "Xk+ R d ѻ[^t.9}xW0xE?Ο䐑ďŐ"ʦ +΁!f*س[,ؿo;}رaJ(:3qx9v<#֐v|^i!f%S1w{};w悋..[&O1o&he.ɀAC(:?#NQ'ƛ]`_W u!tLyA4X#?"h+Вh3>B BhppF8g%= 9oYu(`P$O 葝Aqh ez㎛m.owМ3EӾa 1(#(,_֕P9=;!4aqC$;tph ֬5<0]} tɇ}7_"Adyq2/ͷYÆu*R<%ؽHfv{ve FI "͉6I)馛ׯ'V8={6#FOdƌ\r%Ϛۆģ[ŵ)u_~8<65ơ%vݻ 7ְHB!relټ-泅թn:mW6mBV|8CRzͦѷ{Kh9FyYuz{#*vwzvQYQI^=(_|p9S=X 4yy@q3DȎ;xͷ7sNo5]]w8|Sz-ZmH4 o"Ў!1JAiMX8A#GQX$9sZ28YdgjxFa%Z)T%~m47lc)d a$ZSd(_'bYS\θ^6l<+ ZGt ]#Q*Pd0r(cF׾*~4Hdbo B._P D)a)z4}t'MĖ-[jmݺ=z~z֭[heH!5կEm}ה?wy'ᰩ1--BAA?O83-o.akS9컅 )^MeddV'9\pI'hÙgIAAF oO1_>.Zr2BvZ qEl|RHKө}ZQ/JeUE֯}3ϣMgࠁ&땔Kѳ=z`o&iiiP]0**}>[NWRJ ?9x-}P.Jq\ȈD{i g]tdeKAK C )(F'cHEk-%FR>׹8sf}"^t!e 6W_"D2D|nHS!  M0eU xrӥ{OE}yO971GV .]N?P^=A0s1Mu:j;D&BVZ2PJJZC˖Z]L[emw x饗K)//gGHMH%OB0vX͛W1 cc=1ӧsUW_`ysi [JD}A@nn.UUUD++ 5|8wW#oY`!yB!*++IOȑ99ɖ5W)EMW1J(EbW>f쉌{"L>k2J)JJJرc'Y.0y^,c'R^VqУgwV\Eؾ}$,qIС Xx i  cZr@Il0QEDB糥̜)tҜ8>BE 8ݦ($jhCfD2rᆯ9t)H:u͂ < VhԠ] W_֧;5{ѡk.\| FDxY3[J)(B8C1'oSh !{+o0lXN?Lt~Y8\8xRNr#(pdXТYZs=ƺ(((`ƍH?YC8RD0`!Y=S>[M… 4h޽￟O>ޖ~VBLYdIʛCkTZ$Jw>OYYp~2xq^h4e+d`)gr`}91 >1OġYRP(DFZ[vl 鴮0Jh iD,q8sL{g3rdBMΎ;ջ']~ir&Cg=<3D:QH$M{iii|',Yuڭ+SΞ&Z,_vtAÑB('Rk@0F"R0t4FH"!g+COѫU>ԎN~󿒋6̚) r5O3>QplmھY(y9!)*ejB('/˂|xY:dDa'Ozf'0Eyh?>̨њϾ<9fb&cYz<=~P^y١hA(}b: "hH- qB`Nod8̋/ FJ9:9՘?$ l7o> =ܦ8T賺[(..^۶m׳l2`y[TZ?kA8h zϝr\biza:nYK~dfd(W*J++)ڻzvJXMQ Ыw/ڻWz 8gLT<{!/?:aTrS8Bǧ"n' .EXPUӡs 7ϯaۖ;}' g8N,ߞ緿%6o}F="#=LÈaN #:6j}n(b¥G?f3U0ip1ln.B˯PV\1>FϬ<͜QoIAO.vbe\:[1A#¤7u}]w3f`׮]/2~x?1ydMbi~&4a˭%L*ܦ8TȮbߟ|g9mFvxիvlm*bЫ%W֢-5-m >= JX,xr +vю:}CL-Ϝ͞JGpjSs3UQ~F7oӦСC.a`̜5'{EƋ0h eo!##l@(0Z+Z;lݱ,PTcUst^ͥ^IQ'бs@" ` e%?{o:eHPZ E\KP={yg)Uѿ@dHE0^oaT>R tba\|r-$p(!+Qs[~eqeuR8hk l{¡1ٕ&cҥu5TZ֦bE!;3 Hb}n‘T:+ Ҡ lٹ6VhV$Ti|eddk,fMl޺yc0"eoq9O<O<"z.XiA "Eųw c#4YI{qzAN1" !`/GF (5V~ L|$`"^۾@'7J iBNCBK, ]&_#pD9RlcְXQjX,%F9W#A -6%q2!#1'1I)w"v#N bcBQT ij jct\8 <0*j B PJQWչSdx)ЏqCUKBD$+EB@?ݨDa$F&-.Dn26 aHI)U#K ԫ0SCNqp,6Zͩ\Zqle}Ǐ6mMkHkHb9Z2ߠ*qhh4Q=yhPBb|RHc Mb" VU d`#@%T)hP:!pu"W'Z 0A ZU-0A D83H1}DDN1qA F .FZ-1" a A]6w |nژfEb+[MɑҐb^gwQO?7zS[wbX):a¸3Z{ڱ5hUƷ̐BI;zZ1c Bc\kZn0&W}9O HSiuTbt#pG^IJbX,-H~"{,# a2Ҳ :uR3roLk;b5EK.^[iq=C!{ 6d/&'+u3h_ǝVjSjmBpt&q+Q!ےhQp5h_`tP+QDqG\k?#$^j&Pmʡg^lݵя1=+Cě j=:'Dn39'2DZ$זaEbX,GMuR&MM3MJhM4mzE\VA"T! T;ή_ԋ2q5uLB!NzJ!~Pc,} I8 ']] "׎TվՎ՛^gguݠYaK@u+f[,84vn !LT7Xׇᄊ4+J-rP 4pL߮KcPZr4*Y'pDM>5fu3AЪ 4B Q_Ԍ&ctN:&5k Sl2N8ѵZ96&݉MvMrGɞceduxx2>zuR[Ӊ:7 I2%ʫ#>z0EI!藩9N ATN;։5thiF-uï- 6F.jRV{!}}kKӱbX,m4Q Q]sLϔC\@FNjuߺNff@CSR3mGBj۝8AI8:yZTccX]5kſR*2Qk$4 OM~l$W 5Ω1&cSKI5ۖg bv_5PgbX,5Z&%2\KhpDܑKD6:: Q{hg O5Hj#:jAMkhFk`'7wL$T;Y?>h]x*I{kMqN7)uϣf{qC~zSkZ㒈$AF3ΉgWududIRSPCx5j4v*Hkk쁋}e`VZ,rF),t8vLU|fHŅAmG3~4dN)I&JSIdOjbtܱ]:XrPjNwPDT;VUGk/1YkժG&pG$"P5H\YMSFiݰ󞌔_8:0%Xqql3ڨmbqX}8|~(#ÙЊRbXRQ(LL/KSRŤSV惨lFFLMNҺ꤆h~v#dff։%EQHڻqkׂT0^f(фN uYLQéN:©H#D|:4qg<Ƥw4KCDij m!RƧ UҀ}ЁJhçMIԤ5 \׭w_hNFi9|pzR+J-b9J OB%7Sk0 kLV^ B=Nf#kQ]z¦Ix/QVZxz]DgiN#hV MLSQhҫ:NSsK㦑c$`G@Z\_ib]c]_DSZy6&GAkUiI`s&YVBw_[bw>g?rnƍquɧzW^zN{a43ߟͽwߗ<^^Vn;,w>RE}s. g= PV^λLc4."233mQkMc,xgyտ'VEHKO:jȉ̙?'g|H$<ּdggSZZʄN VqaȐ<MG11e֍FJN9ԐKՆaz6l܀!} 8P(DII1W.qի7 {~:oXt˧Hٌ75tv(d}黭_C{Y%"wUU1츑,Y)%'8!%Fkz^%]LhQr2IDAT+w_'H9{!ģ~GIHIq׽w{!c Z%--BpÍnoY'$XQjX,QJ}u`={ҫKJ%+rs&O恀={__W. P*yN}4SipdYDt㵗^%/rk/5_]3y컩溗ko?O[/> >^_&s?Cff&W}vd䠴溯^^6e_|Q* }}cZ땕ƢHOOψù21|6b\5_aFDk>ocm=WIWqQ [+>nE`w '$Α$?/EE|qitM![Fpëkו >AosյW CZn99ٜ{9ޑb48}+eeֻ5cƝϗaI ~ ~0|_͆8XQ l H?dm(Tf\_е+sg;w|gbҔIX!A@ڛ~i4iA<8?ӷ_~ˇ|s3-U;ҰbX,`?4iL1ijV&O{_0f4k0hty=6N;Phjd؈,]nqg'ZYϖ߷݌1 c4_n~'yUUUTT1lcشi#K.'יvٹc.{aww1uVmߎtϧw>Cɦ7Cy_}z<'n=ڢ4 3O>?۷g;sPXQjX,QJCDNJ/>vL ]N@| C4 8ƌ;q@pƔIƿ` > R6zJi~Џ9zDzb* O)^WNGhn+W.1g !7DaawsrXt 1@n݇7P\ۻ6:_su;mV*ҹM]6^ 44$T^NEMPUmM]%&BM4(jQK֤Iyswajv=W|w=m[![%f4f"dq;w} }wز bMNy,Ï^~}uqvꕫh (J~0UԜ)-3,iuV4M$!,gƍ8>FkkkZWwK%onh0xy'^2/f֘]ZA)QJ*h$20nqw\W~kxQX#:?# .`ɀ2YIxNV vhGD(Ǝycfja=8{| t_>y3xWlrO?8q:NԋE ;>ygJ Y}77,$Ip8=胮q À|.)@xky,׷ٯsKעK88)XnX#Gk7t%B. @H!{(R""* 2[Tۅ?)!upHۯ%zOL0;;cm'?E}},t'牜C,x篿OvTqrAeCͯ`y\1>wƙrzz)'m3``6_юmfJeYs?C1|Lio?a9xW2M_D00 tqmU3|LJIQm?࿆=xZ!IyR""*e>klƅO1f[cׯ(,wϒe.u2r۵M@swDZuXv=dY$cPJDDTtC *wTJ >vJ 2kfZZ3JL))- 3S3rp(b6 c :;CBlYRA)ŹM, T,B*H;K f@Iks9`/Fk \ sP\0ZU~]8u4)mA$|A= "I~ʠrV A,h;0=: aXj/0M0tha n;dMšeZK2=@`"ڈ8ty#8=Jy uadӯkbS03ZI 6 X: BI7Q]@ғe `\,oJI:}h?BQlXe͝ןːsK9{{Bj'h5mٔ0ct]hd^c ZXـ(3a^$vZn5\LRh192"TO~{ogIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/fileopen.png0000664000175000017500000000251413203343735022531 0ustar jomajomaPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@1`b$UCyIgec2.IdA焋oJǥ @A @m)Sx_ϻ?9P6sQ>1~e`ï? k?}`CzW'y~^V?3Lsp03ԴOťQ mWh0 bre01/`><҆W .9< @,PSOx`g=Ϡ&`k(ۅ{/1  x >. rx#? 7d:n[34)P X]'+SI~,,u _ab^IZjs  0l@[Ocg``8l0;y hB {^3(2I0p1|} ~gÏ j ?YYN݃wWeE @+[Kt޾/g7@9×@O ݇ o^d ><c޿ L˟?C` +[Dn=a`^ w |+o X-|d-@Wbcq`1?k1L@@?`|pp`a`xdx/@~  h·^𗅝50g˰ ps3?Ë/ <@H*$Y>A?x1( 03߷ 7`'W W=HBS /DZ% Fs1N*VLdA3g{Va˝Ojv 8iQ]IZp_w 8$^mcHmCdt_Z{ϐ{:t`gxTJx<%_Fqwؽ9}㤪<̐E2{IAww8c9t~#qlK1([0uhmU_xJ;S빯ZM$2a g*x^W OT-[{!~AѨ(ȋcp.kVk6˔Zђ\Z Ŝ6@q,ˀQ*Lױ^}ۨУ, 5qaOe_(W 6QQg:ư Y5<9YYb7r /k:-)䤑ޗS:S5'I"̲۷VZұdԦneW]#,+>9GBFsL=~Ym/ESnaINL˾i,5>͒GBC"=oj1(*cL|PdfLf 6tmdg(vXa[/u-(8ϟa< @Idr7ԭ\HyyV(*J.v_S=%f"o!=5x``@B!N:F۽Ϛʧ]@ ]IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/camera.png0000664000175000017500000000313313203343735022156 0ustar jomajomaPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@pЀ; X9Bݻ ?K3Pq,(a30T0ʕ+>}z Al444 P=3Pݿ>\*A@˝SszL3211v3#?ҥ˞Qu+((d0P- #Ly lll`ˁ!O ^~ffgx @Ϫ +r|a0V/!! // ׯ_3񃁅aߥo ay9C#7h P #Bdixf KAs80M01<ŋ`4 Z" zRL  @(d,18swǏ|~`B"(T@@~,_s i3 /8 `=zVr<,9T]]^z?*H=@[nR7p#`X Cp|իW@C^<ưs6p-[z #@QRɀ Ɓ Gf&"" ## Ag0d3gceXx9Crr Aπ Pn  &p=Ld8X(@qPWS(P=4Cc m [le8y8Ǡ+@+K@4w K8kx/^e?c_|` \^;Ae-oƁ[AhǏ i[aEc rH[/aQ밸Ç U9r ,[*"gȉ@E0 ce v]p(,7(T#g?d aB^ .@aL (Aj@aA Ŭ` ..>rEn; U%Xʙ2S'{mYLY:L/kuP!{߬*ZIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/doubletone.png0000664000175000017500000000035113203343735023065 0ustar jomajomaPNG  IHDRͭ'bKGD pHYs  tIME !&wvIDAT8˵ Ыq9j%q@$u<7v!hz8-B6Sl]@qr.gbT]$ R6,jwoXn5XAs尞 +ENQD0IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/sweep.png0000664000175000017500000000042613203343735022053 0ustar jomajomaPNG  IHDRͭ'sBIT|dIDAT8S M@gu֫,,׹*] @z}S#"jt!e1y3ϸj O`ڝ^g}HXcƔ!e ݼsoWeUY԰s޶>mTjqtM 1_/LcYxF*Z?["vR8)rez<DYFŵR 'Q7 8aO`kr xDY\!"kIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/hybrid_dis_checkbox.png0000664000175000017500000000223513203343735024716 0ustar jomajomaPNG  IHDR?”sBITOtEXtSoftwaregnome-screenshot>0IDATXSVϹ+%@`Y`mgltN;uʴ8P\)EZ>I6$*:ܻ9s&hb' JzOr8w+xv1;Bsx;pl y0B"Fcr_ܴh$9̱Lc,EDasn(Iu܅ݯvz9= !Ôڹ\_:NvpR uSsbƥN%;;> A$H p dM<]rof ΡS/r]VfFv=_Н~n!D@^0d–iuu{TW$=;=qvA}P$\4e/#ї[[Wdg'ljg\Izn:;IdOc 5Y|<]/z@F^vKM `KE49==OVa%{OKXO!qRԘ:Hk=îIzCd;dK^%#{훑(p(2JRUD,Je"cjZ9{Oq smv@Jf܅`h0=u{ '.*AD"@$DLMðm۲j evr.B!K<9]%Fr b&qP%~yLAƋ"UB'%B0`/;F24]UZȇrjKKq/\Y.Dxy @TtRm"h~O\`Ѩq.SGL 32?*Xd 2pX`5PJ[q=T#}{ι\`D 1[I"`H1,Ƌn{CxI31aXr<109%ś]k9%wfn޼-SBD1u:-ROv(@Wbld]lZssg;Y)eF* wFbnQ}`p@o58o C`J yl?v-N. R(%R$'1({ۨD"5b\a`$msYn OїM""sRu>ʢHuLKKmJKK|`gggvvEyzDR~&f ^L:F¹iBjZk׮-//톈MMMvLgNvuf,3A%!ޅ[@U,qG&Dekb9w\}}̨n=d5 d,NÇ%*Ũ#KDA 3C5,Xfy8{lKK+++۸q@z޽{?rFGGnZRRrȑ~պavFFF5##cӦM E`~qHU5FV-c$D̈9sƭ[ǎ۳gOvvuu}WQQyrԕ+;w~PPP hn>j۷lv8ѱr+`hת{x r*D%1f_4"$" 10kSSSҶoߞ3<<{n2`WW>o޼'B!l &8爸`C !&*zqr{8Ճ2#tseIJC'###;v h׮Ym5CZtiqqq{{{GGǾ}rl6#b(2L(7FE oTd) \+ B(!ƃPbbvVVu~ܹW^rwP rNvχBxo_/ )TJ"FSD!@D${y1I'bByϟLoN|uժwkk?mOFƴwnB^G7oJ+f9yyyR956<cjA0(Dַ:VZ Jcvd`~< s93[NҊ*.c42F>dbiH͈{pZB7,jI59gN$bDAi+Bߠߦ!B8/kECqjMEI=3ƈӎ)dT3΀ hg gjMD|_]$ 198ps.ȈnF{!l2_ʷc',zznwW=?9<͢GĀQSy t.~niX4ʗ/ <ɐ1mZAA%ǽwGQ|,RM#YL)Edb0YLEUPx ŸIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/RXDRM.html0000664000175000017500000001161613203343735022007 0ustar jomajoma QSSTV: Receive DRM Window

Receive DRM Window
receivedrm.png

SNR (vu-meter S):

  • SNR in dB

Volume (vu-meter V):

  • adjust your recording level to half scale (better too low than too high).

Received segments:

rxdrm_segments.png
  • green: correctly received segments
  • red: missing segments

Constellation:

rxdrm_constellation.png
  • FAC constellation (always QAM 4)
  • MSC constellation.

Receive status

rxdrm_status.png
  • Mode (A,B or E)
  • Bandwidth (2.2 kHz or 2.5 kHz)
  • Interleave (Short or Long)
  • Protection (Normal or High)
  • QAM (4,16 or 64)
  • SNR (should be above 6 dBm)
  • Offset (0 Hz if no frequency offset)
  • Total Segm.: total number of segments in the file
  • RX Sgmnts.: number of correctly received segment
  • Cur. Sgmnt.: segment currently transmitted
  • Transp. ID; unique identifier for the current stream.
  • Callsign from the transmitting station
statusleds.png
  • TIME: green if time sync else red
  • FRAME: green if frame sync else red
  • FAC: green if FAC correctly received else red
  • MSC:
    • red: incorrectly received
    • green: correctly received
    • yellow: already received

When an data stream is received , the program will try to decode it and save it in the receive image directory. If the data stream is a text file it will be displayed in a separate window. Just click OK to close it.

waterfall.png

Spectrum:
You can select the spectrum or the waterfall by clicking in this window. In DRM the waterfall gives you better view. The three markers above the waterfall indicate the position of the pilot frequencies. This helps tuning the radio to the correct frequency.

(8) see Receive SSTV Window

qsstv_9.2.6/qsstv/documentation/manual/manual/receivedrm.png0000664000175000017500000105134713203343735023066 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|VϽٙ@) CRdZmkumZVk[GVZ-"8!" LIγxy }]3{s4cucB!9}fl/cGqQԥ6Gӌ'Ԣ&ٹt<ع4vpђvpJW-˝KvN4Now1fi-eצ7ho4[ϵemRM&s鶬(-|'wD ~ Ab:|J=:?2_J:~ʲi6Nw&\Kln nVH&ٹ4w=5bvG$R%wm;^:-LiqixRg6ld66/?VkB!"*0 kR !B!iUU3l!B!/a꼼ܶ.B!%5aBir5 Ѐa# nUlRNI֮]$z"HH$$8C,C~vdgSWWGUU5VtrX4I1k{z);kjWVn z1͝khsrwK4#``ߏcV&PDϋ /jcSW#f( &^l?^gyWR6] ++PZ[%?`fTl ^g6E9E\4C(;DĬn n4ohpq{'$mTXsnj-0o#,X9ox>u?sz:K]odS>R4b$NKm@tc'r`xV5K/H>a|l1X۾!:pq+O`H.`z9_!B*5Qb1&Mkq]7cSJ7DZ1MN:rjELx8XI΅tLL Ÿs\OrzjkrsxȎǓHgq{mۦ,g}#`xJSUUMwq t8.G{,7P7L/7TCG9Z(|d Mɲ01(ЎE+s/xM|_29sĔ@sY9c=⨮7޽Uryzo#v[o(&8yL_g7z ;\yr'W,ރ9 uTofB!he]]RÞRTٟdжaضC0keKY>\ۥsdge%Ӂ3g8NyO6۶锖by,Y0vU8lZ^&kQǍ9;cdx@7.&r1pw<'6H]]ºg(:vu31NWt/ܳxf9]G3<^{\q0CA]kgި`lobL]?g䄞5=[gټ^{iGP'w^2Pد[MuCd:t(ð!FF~`|/>uv)Ckm<[>E (=Q`x7}/ < :p>|W G%wXlzt4"`[sdy]㔓9zPY9?7h>^ HAS/.is|\o6raUlVx l&l&l;h咝E<uNmjأvYP"D:YYYqI>[C$!f|y9qBt r@@hF;6 sf. .}H\߲å,l 0Rk<k[;I+%#DTrnt>*RCgjLb+dܤLr']7|H|I6x,}*ͩc9 9! R85[ f]LsvyM\}&%+`WӴx< WHlNVNGLK@Ol=s_{/=ǐ S'?ɥ. ݃xjAdyˋ9Wtt_^d2AG3_Z7uON3\}Ttb @ rB;6w>5[Pפ -RB!{\};ubaL<1ψD"(轈H0 院Rm+Ubt婍 Ue7Ҳj>d|ub(4KZj3. x,>E_ e e%<cY&>`пKy`X+Y^qXĤۡ#~rmFE멩w+lLe=h1< ZD!{\|cMF0-#ZEYm i]KVk;XF] WLhǖrӣ35v4FN5]Yl&l&l{j3M*\W9a"HH$B8\qp]EUU5ehTTWפqİ[A8n2?EuuM2LbEmB6ʵY^ᮥU\6u4'teU, Z.,OKå شi#>_|:hG|>tԙX,JMMN>ko ^ԟi_Ț5a:żGBݪՔl C]0+K?-p5ylMfnOvVË@-7hTǞiu[A Ukw=μ'{$éz̨ÏNA ݃8j[p3yދLyRp)!B=0P^^FVVu1 i*,L2o]oRstkgm4oDZQJx2{K=:N Cꈃ/.B|9j5h'H1 R5C #>o[%nDZL Kqp)zw}-LO4ɲxgXѥYЙ12vRys:̮Z~!E/ Oaz9>`݈#8zEu|:|m"&Y^LH +4Ej#`;5 GA`o,Đ1lH6VFB!QQQI>/J) rd##l*iP( x2q\ͰaC,39t*1Rތp$iԇl)B0B5t3L(BxC:í*OǼ:ͬ:/m7W4c¹ ԩ3}<͛Xj%VxX3hNdj6~OJ5AulwkгaZx}^TksQXOPkpm)Ro'Vd<~<7xD^0-M]:ՓTr, 0X,ƴ*ٲ-[Fa$ֆ0 #x]QQ4Q VDcQ*شisbČχ|O OXl:/oh ߄Ze\m/!<Ob?(=t81΢S]o6&2H!B|Wz,<^cN"#9t2-,ǛuH\4q)acy1 3DlƶmrQJcf2\qؙM42,k_kdhq!B!bϩIJ=[3Z"?6HLk\Kt-kٮ\٥Yh])l3L B!wU9i&z3IυB!cB!BåB!)鯽B!BN9B!uI#C!BѪ!B!hUB!BVmd<*>So^scYtY[TTT_\B!Ȉb5QCƤ;o &p/`ÆY5,۶e¸I 0SN<9u6mګw^{O>ٳfgkM^ GX`.Z֚?/}ԓNv/B!ږgw.hl~ƾU]uu7SR\S.E]xWÛd{=]ڻoLJf;ͪib !BUKʫ7z{`ʄ#8|㭙-J6ګ{{x^>hλ\y1Ɍ6w2sfMu]M>Wn:;ƍ8<ޙO>iQ1f8ēTWUs9?f¸I~T***Z;qtkq'xUe'}1麛 íZ|>/YYXEy>~ F Ͻ7Ù|<s;~rŬ[>}lO< !Bݳ[)Me?mֻ,Yx9g-[ݺҩsƎbXz ".p-WJ6o @n]9=fy˲2ҸWr9WPVVʀsx)/+7ޢCto۷oz\3l޴N?]jkjK͸6RZZ'>ަ| wV-1M0#O?E$w/^yO} '/ft2Q>;1cGK =$B!vn52ޟ͝GsУG&hG,r'}Laow']bϛ=5krgpRm K3ѣ;=k1b͝=wKeEq>Oo)OR=<;-]FIɆ& ҟ1Z|P>1's[5CN>d :`@ ]vqi?dY ,.E[͛6g~B!Dv+&\_bl(M3z3 ' !rUh!ӏg/).i}hma0q;t?>B^}UR۝{l&(yB!g`CKlذ-[j^EE]8S_om7gx˯,} ZbJ}1QGҡ=TWUFq]7}~Žуg~{Ev*l,K 7w~ֵ9ƌbїOD|>"p:>Î۔:.O? Z9}횵[UUTVV /S^x#(&M_j'OLURyŗ)X@ΝϓB!={'c!cyyrYr5vH_OUrqiPS]C~};9hAsy]^zeBY!nMt.8Og{wqõ7qϝһOofqwaoUٜ.]:s=w[@YY9<3t,`̸1t\~m [9j$[˖.;tfB,I[eM>=}m!B:RB!BMOB!bϓ !B!DFB!UI#C!BѪ!B!hUۭԳdb6`(.z}uރ ں8B!;4gۺBS l(,eן1`:\ h,55,[ɨc(hB!Tخ ۸$gOcO{Bs38v5Z]]Aյ7oyHB!{YdbLA~>հȔ(wA~!̒Ջ5h,x%R]m\eY:ҳko>["B!=FƆNs]@um%K|M9`v[UG(- ~ރn[vm]$!B ҍ ێE)ՖiZkrBvk0s*E4fنa$tK.Owۺ||)=B!٥ 'H["ޥ< i1 rַa]:wڒk`[K!BF޷G.8ngM5ptXļ%uAB!.hdhhhUVqg0_#0U/m8J*w_` ZB![m_S={}`P(1 7ހoN hW)o=r :xuN_O퀮L:9bAB!DKujp[[@YvǞr=~M#龌.Ʌx TWӋ~7*wE0l윳;|r7ruWѾ}]ֻoo:tl\>SbXkI}]3<ғL9rJhQZozmғ!Bڮ' FswpЀx??Ob\~m^|E^5:vH,cƌ,Z9&\fS9'{0ȣү?>LBYYyoߞ /_x3>%J*w:w/-Q]]C=yqŗnz~?\cϾϿ a\_>֮Yg4 .Ř>rvRrޘUU՜~?2rxmt~zEd#yNkuQ}a֯[ϰC=/]Ͻ4a?{ɞn믖p57[Y :LN;T\g37'Sm En],% !B}6K5ڷozsfihww7ƍ͸"_frʫ8wƍ2?l< ֭_}woÐCxa۔TLۢL0bQ]a'VuB=YvG?N;fӻoolFkQC㹨CN:;:qaX_^txM7sןx}1v6(NܶD1[{o졣/>CF7[=!B!,Ӳeh _AkĉxG)Eyy9Zk&L>OiiZk0&Ng5eee >[./zBcƎfႅ̙=58ly!XhɦU>V׿ J7ݛ>w|~X3qY䫥hyŶ(x<ضHe1L3ݘ֒BA:u.dтE}PWWR;ēӟ+/iPT"z-ON'?{ߗQ}9t!L|0iQ}B!ľŲLLcw4DSQh1M?]7aǞ@kq 'qGЃqqrÓNC+kdh9srᗜ ZӥK>n&89N42tGc8`;/}mM-,Y;/,JJdv!}v^q #PJq]˯q]qcq@:T^5۽5fOYɘ-!~Ω<\cFH#C!b?dz,pO.r.*sjmi4t˯ջJf5iL;jZl'5T2@yGRC m;|GF(k"V۝zs4M:u槗]!d I78₋߉8\qeL2zGp$J+~ӟ1`A(8³nǞsȄq(tD|?6x~pZ+N:D.:Ӄѫ;i4[NB!, 㨣?yX[U~{aƏۺ8{ŚU9;[p8U?x=]^k2q䔽T:!mLY~qzU[[Xdm]ݲ뱿ܧ=osʴ39sX K@-׶W[4?򋯦.:.];ﰌJ B!vJ j a_pv _|W{#w_|ņB!12 b2RG]bP!B#Ӳ.:٥/uB!>]Ji~ґ1[wqОwB!Xb?ie$`ɼ-^VVQEhUy B KQa7L(bk1 #cj_cTVWzJ:+$ ռ HȋT5P޶IMC!ObJAeI$ w&(,eן1`:܌EkMm} ./f2j dL2 ?m]!G^of& V:)NK^uVӽsO6 j^A/c^Щzm펆<A {(RpBߎOn<3~C#gןq)O==6`NV.W޼1U&1Bi6;'/;SMN~oU:EyM4xJ{ :zic:_" v9v^KiSO\t`ʥZa^srx<4l4zh!%2 0lI ak%Ŭ.up!n]}h<ڒl.u*N,yٵ7_%3` < 9`^(."˲4TrQ䳷dWDxoa-ˋcl؉tMa;]>4!0L P]o]yo極J>D7€uֱ|7TWWFZa&Z'/7>}һw/L#1,cؔNa09\ 5rM;sRg=l.h,Fer:Ͽü,ⱝ6u|Iuյ,]5 ӿ٭U̝Rd,\zbCY NBpas]WB%PZ.Fpe`@IVCGz пeUE6kK,.ce ^ΏlǠ^!LDٺKkPEE_R>Yv$''Cmm-ugpN=0MRn[լv Lj"6X8K<8.`.~]q9N({ F70(L#@%]~4 dP6p?D<^A}]6Yيh<5Kop"W:0Du}_`qrB{C59=d.mXj'Ckx 4\r-|˰;:[Xf; ]YzS!ȍ2J\)Ϙk#q^OV^f*fH,Jaǎكdggc[20լ[>c‘'XK=7VЧ_7{Q{nk"?hz/˕{7 00yN Ţ,zqzA'`*o3 s `z `׃# |`"եN#|11 fTr^In~xts*xJ0gvu>-+K ռV!S)l+*0{ҫwOBDps4Ep)4xv!(/D ǩbJç–2Fq(c{/\wE !y~+p|pvyj>[C8nǠ6xBn{G#=oi*I-=xy;M8[ʓ=K{=)R|2?{wB!Dkk6[+.hXfb WD*urqKu2n`>/-gzF ay,twayZrJbY[-[PP@a8Nbf&4i_χw((//ȯ]vt)5Yb}?lX/0mⶓtISTG@TR]U({KFQ^ZƬ=? .a+ݴo~=kK EV^Va#)Un7 5*XB8Z\@|XloIW)]H0n'`~x1MV\gܸqqA ͵{eٲe¶!CJ)۵իҵ[WrsrJ擠6qEkʚ0'1,聲t(סub*ZJ7WDq\ݺx϶0aX,68)xWϦ7 ,ZA0[SJgC{7kMgc2$zI mC7Nzӧ;uM^Q&cRFFUe7&VXaտiGGLᄣ1\7lKQ~[ockϧӽ܋٥31Tj2KyqO.'?TVT۷/_v9\~唕zj@GL[2bn&&C)EUbFB5͏QN54~8W|)Hͫ(gN ym9~fR D (x͛6c&jkjxz;9Ыy !v^7P5~V~7?׆i0t\K^J M۰??W:%8X<{Ahjjjv41fҖVB,\R.ѸKT+jŠX\}FyiQR f%ynsox[VԦ!QF`B\2o|FdnwHn֯#8H$O33uT-[ԩSͧ%b]SJ}ڕKPZcL,Vd\cV&GEkfryʊ祷~pD"3GqQJѹKg&{[d[ϋ%~/>HH$F,fcNrH;ޣ,q4KKӍk֠& afzJz=j*'{t퐇wCW.Ég/r% 3bmܥox+.ˮÏmMsHnv.|첋̳;Z;uoG-4qƛ<&M4%'/,\f90]!c1['Cx,e>HH?k jfyFLjbѡ>3+XPX,O]]^X,uZ2@FQlTikMH7b+Ŷ1ĈDضH##ljmr2n렵fU ]TJF<mg?{E>|5ɦ@Bz&(zBH$4&MT  X+Eוd3s?KgBp`|&$4F#K B U֯IVqᄄ;ZnۚWƅsG,XY lȔS~D^ݷ?BY,FMn_ߊCaRV6Ob Jʵ`VxFBiwy @n~A: e8>VUUX$CPX(d2HINLJ@͕+W )s[9 IDATXIQ)輽+]Q|A춭̀v kƄ'j5z̺$[[G9F],Z^w$z~ 4HEͥ.eKU0z_XLIIH#E :Ě%W3 6DgWPzdʎU5jcY}!O/wT*\Lf4 "E`0:Bd2W捠 2&B[Ma!VKՠRILTJ ~(a.Wfk(!YIKd2|9iD/# J4B $?tNA> !h5ڢ+T8 3KX,!{,jg7@!a65W3f ʙ T!f(S9>$I 0 Ls鼑 ZKo`~ȻiyCgÇEc ֭ZG*u^H F<\d252a6AGaQߋs( s2iӸkw4d4hP(Ujya@:O`ڊ  y~owHr}_]l P9-u@ DjУZMQoU2~n &N^ȥw6B.=2DztTXRK)PУGw,R&++S$++DNv6|۷[nL<+HL&~r_f]fKqd,,Xh,2Z-nĕ+'5]h=mѶ]\CCǮ)0ET{Q3  ke[[M8Z}P{A BC0aL(M*%][Kmn 3G"3BQIBՁNBFѡVlcYו?4 ;'8$+\IJ)σFAFRo$Jp::QkrJUmM%$aw>M#nj[\@ܒn8W 4dv@񵽁<=xBH~V=s tj xi=mR~~TЀVyՐSװ%sү1}=]f5"5MfU.]bA }zg޺Մ>/dzucJGi@& s3i/7hPt nџ+2Ba7 p:$.Ճ6 cyyxԯ!jSISfxy͒5 *Mv]];~owW^i*5]Ap A@hpa.+0^CAhLݍ2 ,{d ?'\YAzaP(2S] ^ϫL1wWEp )Lm2+>Vkk֍FqUAjgbii ODVѷgް`ywf۪Qg]<9oިj{snyV^#fH U*G<{x^g5-999,|f{܇'Gy񇟠-~͂IA>A PRSSy>` {'x?'h4RPPȁtoKD']y/4iΕ+|gyyxtCl\ wNY.GYNٸuQٹw{.^"(8ʨc9f$>>;\{豣Pχ%I?!#s1V!BA ɹ4:wfgeRN~^>j,?@l\Lq߷JMܐX6m <}IJ:τ0sꜢ[ 7^&%%;ݺZy\5DPMzZ:MJҷhقZp%~B-HoFnN.Ӫu+uW#* JEX0ZlKԹSM.IkVe^y߿_@$ϣsc"B! A[htn0^  nWe{rPJ\11[$ ŋ[}B}9vX 2JVW/ `mlj1LvspA]$IWF)YQGٱ}'iie Hٺe@9M7or_ٵkCt|RJdBT9n&d^v=":.54S'OcX˷['$qe&3yyyzI§[Tagy?[,RR>$/\ӴiӺN(BL   Ԛ_j<}7tcHH~7<6SfK@&uE,i6 dÖj:5uٵaT*ΘBzZyaht ԪÖ:uy/4ob!qt"ov7e(o|ȨHX=8ƍRCvm+))?Sم04a qS.33{fKZZ~~~<2aZlQgD!B.zϷ&L<'Tg܄q0#3|𺩨 Fo]:5?g]ڒW(ӂ    Jd2Aܮ qA *nXu[WW 40"AphO#`7ևj{=x 2AiLݍ2q- ) ù]y-4)A ĉN}e_?$'ss_zԗ֡{5 +Wj\NmumWd'bN`VںG̐j|Xѧ|m ˗t]z=z <\J.4Uf:!H _|0M&?d2`3e4z܃A(v{t:s5.6ԧ<Ap@ҠVR4N'##Ą `PZ #aDrss#&2:6;1hqqY, 5>u &&"Ѽt˗g_(זKSkV->Uvxk g@x#III늗΋^=sY: п@̱-gDqS|lQSbNIN!_Qk. Td |8K/1ֱ$N{lܻܺx3ǟ5xyyrϝ}DOxGv0, q'x?'cH|5xwS'OwYP0aDz??_(=-%VˆDyN222ؿo?F$읿ݻ9,~y1c(((@RRlÝSgY5Yj-ggc.gNY{xx][HMIe13"BA B=Ӣe Zjҵm;HRy&!? /@tvT+YK YY٤sch48~VK~~>7vg~>8q14 j@x|xB6/;4A';x]wܽPXXȍ=ndpLժ{֞ Srf̑U**ahق˗.өs'"BA B=j1L(J$fa񼰸f#+| Z%LmR G cӆ͠1Fj}aF~9kҼB֠:o<[X)s=[[ץZKeȻ]A@A缼<$˗.c6#"r 6n^9& VN@Rsq||w6TGٱ}'iie hwoɮBףM;s/~ q= I&|rri, yN|]g]cFx] A~AhFK$ mdˎM7j>>$_NvI]ڣP(&44?|#"E5JlX]| !WZ)ܜ =`i A//\@Vnݦ5Iؽc7ѱDEGkD&Z&:wܙs8=nի 'ϋ/'Qke;3u;_Zh,^Ct`6|G:!?WU^=w˜r#fW۹m'qQCxw=Cl|Z/a{v'fl@ \?J?Pk5F#GW[WOFV'Ν;֨qWk_B7*unw8 S&L-hLs?{#.j(w*{ֱ;:v[ˬ>_gpť A/j(@y0c<1tw C5kFƕ _'7' #IL/~AףVyt#WF)_Q7 9sv6oWB^=ؿ]ZoD^'''/]NL?WxױX,.k}a0HM'IJ:'iߡ-8tIy5~:P7v5o#5o'ئlL_ntn^$ A7ڴfi1a*͚5e`tnQM7ġa04R5FX`5CF=}lӷ2­:wLHh( i9.ҟ{gǓsCCHLɑLAhPDoٱ d?T2|&Cmz֩Ap@ԎTsߑfmmZ-_6 {L,z%nUGcF#vz[rǏ #*t&crDzO C|}}+ߨ8~owWApzۺ J*q̓呕y]4xL۳[GJ AioC=X/Pɾл_r>К𽬅PmI)皔+\hzn"A\1=t74{>4ɝ}awN&Cke29 OG>s-H Oz+\*Ga B=c⢆5 J Žm;M7ۜkCh7M}pg>!9>\uk"vdڤnd2q='1vVF|{|{\ N5` I, 00նQ7\1k*S>O;ov&#ŧ c+K ?'`wk$c&ҷNAA999t f͚],Oϛn£S1JG_IeߠT*5| Æ'вUK7ֶ5fd)((`ÕuYx߯~ӷ7|yJsT_0v1k潌hw{Q0o+s :A ,i< r`\&O!m>0OM"!>ձu6nMN@@m4~Α0,v8yyyDǹ.xD2x@ &(>Ɔ6;1h1G:ˆOj䜤T*t2˳&?ۻoG'GDH^_?XYX<MLD,Qygi,,(l2Pfq[W_~͐ `D|")))K"E1fX&L|0Μ>t}whB ';P3RU3zPYdx@S~^&kFli)8If[۬K/hb*[ߔ3n$2 .B7ܪu+KٸuQٹw{}l-7,{{ۛ\ݙgOY<{>"E-ߝOJJyHwhM7;fBĠemYj-@Nv? ?l=7t!N<Ͳe_ByKO‚gKbHn0N׿?3θQs}wsch4vPZEhh#瑒ƒzLY|-k1">ӧK+]ni'#OAyu_wf2L`sOܬVyy)Eg t *[g =d4˃$M m05%2 !FCL\ oƫ}IJ:τ9l4Igq79Fܜ{q_gp+>L°x^X I_u?ˌf׎݌tY))),y->_ [S|Kx$RN~oK_gʄǟV\ )rkW^tډOTF'#_ Mo3r*}{/q /9M7opJɐ^^HK1ooo._LAAPog&ZZ\ٱ}'iie L&ZN\ج)gϞl6g3?'ٽwn'v&+3 ^^_fm+g3xl<`0 @RyN?I.J>,_@AFCro G~L~8kl7*x*mxa`6?UAFQ&Z?,?g2;uHd2A@3eS5klܥ33gd ILs{tw^YYY}2d%fH :e_X"=-lZ>QQkG`\zѼ5 GILl&6.ȁNM?p_OX3ZlQgQ=7tcHH~>vRg;$ (PR)W7_!2*qX0i.^ƌwp=obԘ 2O2ey)%''lRSӘ}ddd]U2ޅjP5jѥ^'yy̌vAz9h08h.U^L5Κ(y, .Urdrddz@Lb]%Aܮ 8yHsZk{X;~: 2E =”I)g'rWN/~90\(=m%߲XK ,B 痶֌ɣT&?}09Bkb@&*v.T˙ Muy2AA'>7ksly&2+9O &R`}'#W (ʮ;~kr&#K]q}m\O  n ' C~#}nKFknvlSظjcگ4#6i:5PXXȃ=T0LD$z` pպ_14:w˗.s״}S_b\r~/srrxl<@6|W2ʐG'e5>R,822 6H3,u|0hk)] g2ZV%(Z<&{sds ~}vWE Bmsc@zg '`9!]~9tZMZj&ڞ‘|/oO:RYL&?8j5̣]v_̚y/#G']nXx_8}4&u;ar\C^ZR`^~%>73ɈrY>pm\=NdY]1͕ѐ3 BmLe_ey A?IQ\ {6wIG`_+|gh@䖔:-"!@nIҧRٝ:wLJ}t=G=BQY.‚&3^rmZ˯28O$%%_|Id(ƌˤqƙg 1a$#0V_G14\b"㈉;ˉeMQ RMhhJIwLཏuo#7'܉JyHs5k'}Fr>X!Ck #8}jTiatx;*;b2-qz___BCCڭ ǼL<}))<ʔGY㛯e r>.][ǒ8:=qGsF}MnnǍSgxݥ.??))y+W]Ǐۍu=!{: R]Buػ{=FJ]v=rt:j*XȰOF'\W6y4+ӚVc7Ar&#_](P\qLX$0)pݰhp.7p66VQwBty35'Ns)i mΞs}WF!A." A`Џ?p˗ϸ1e,[Z&AoK_GppA,f3juHhZ^P(6X:6oeʄTW^tډOTi]} 5Sרq/TGz|b䳏$7_Wɰ55Z3(|΃,]KQ<22P1Q3ͥ]sxT\W{,hy,{],Oya`WU$qd ˯cXu0}t67lڵ**'?4^ONN.^:7ғ];w^G/3&611<$˗.c6l6s+LFU.@jJ*II9y$;zէoMf~2\!\S-|f͝Wvaﳖ$O/^%(8~O{0ΩVXdؚT jdx&ZD_\7x<Eyf)7Ƶٹ}2J-h%[nԧғYY=*wPsb? X]HAp:/iO. e[tCH=ԡX0i.^ƌwpF!# Z&!0nx*%/ؕ>Bƕ << CGǁAjj゚ x' %)ys5D^pZG~O=ϲ/-z(|INhwosrrή|aw "{ 99/}s}v3 M17g L~G}]+'#[%ҙ *bk7tLFQUȇkEM7me2.:4XY6e(?]鑯vc`'lUW4A  % O ax|v-zZiӚu߭\$f;9?Drr L 4,9`H|CغkK5_Qfgݳ*lom7^rE6YVa{o.ڒWtLw Ue 3G}`gՠ8ɀl+cGyye2ҙ sI&ó\2d ־ ꒉKvP+l 2p4H1JR#F%W^2A40P&Y.AĽ8'dEQyVC]i_5(8*0F/ ?} A piҜ{tnPBs ZP>aL2|hQq]X2L ?C]`dm4dX'5oi־ m:ܘGw77WuF K? Ycm]]2ɔmL-Az8fg> ClC]T 3MzWKg2lfQ}A*t#Lo= IDATUTt-fx 3F &'lo& sM*=E\ /LFVnIvdS=_3{ =|M]%ɿd\{' Cw Ml,>zcb%99H2qf?Xoj۸x"Có "Yhߡ= y.]8,d21g?h4YYqXXA.93AT/7+{7L͠$elO %z7_9FQoه]m֓e˷(I`3E.CRy7sN@ dX{}2@*4WNNf! TE%8pR[Ү5ME"Ap@/_fd5k&w͚eSPPPanP\+ྻgMxyٟmVV3<ڵoǟŬ2rtVoΞۧ B}LS[ w6 ʮ%xf W/&f]ձf%DZK[U" w/ߞ-,5uk~Q2A!';B/>C¿ٶe+fIwL9 3+WQk&L_P(H_~î;>bwg&44_o3GY_ &u#P͵pv%.vHvN6v;湗ת3:(UjStNGRA B=qC<# uBgKbHn0HAA!Ku,dwh/ʳ _AvctNԥgNWm4>u]Z yXAjqAwT*A+ILۧMzZz}ZlAV-tfyߌWɤUB6bP(HRkVʜ[ {TWAj2AӧN+-:߀DŇwVdaVLJAAe %}Iڶk[{E箝8~?#w+_gkonAZ! AGꨏ\UL&Z-:Y3{̙gӷ72Wp"yyydge[һO0 YcsJw#Gp;@jJ*II9y$;9sv6oWB^=ؿj΂ B}2A]:;$󎓬*yzfz" 9Add*.iuEe1k]ÚUDHQQ 09t\7<֭~>MUݺsmz}X3w3:2J2`kXqal߶rZW՜|ɍ ݚӥϿ۶!7fnhoosE}iy9Zػx… شi5FsEFo_Z>^N~띷4_58No_cu63]͝޳K.gݼۛ9Su Fyå4Fh4>E{24fzjT;s3h`V/ƁdS2W9)$0gދ`l)ۧV`r;?Nα4X]3ϡA;{a ; !uTב8ܧ,lEρwC0(J>22ցH >8r`q(=8*`wa_׾M3AM~x`aB2'V'u>PVMB d(A _3Zdh46Qضmi3Hʬ=cpKH 2T63!{*Aqse#!^2+J; 4 ~If-Nvaȶ c*!F c`g[!* ̫cimu ~}dBȮZ$rP c%O2 H$8.b2 "7_FpO>kghh4s>h%wo 宕p`k1''~C[5 ( a.PO'aw@i7K)N6m3 PBMh|f̈n怤<;NC ;ĨN0! 2T`;] $.@Ov09g>G:?{!8]"SKrO*c^`62#K^6@uP9z6YaCP7L0Zdh4FsgMXZdTHM*+Fuj%TGJCA%pJiܝ@ (q0b(O]rGpa%P~0M:@~ pPޖaw!viC 9p ,!S[ +!NBf8,J,xuHZ 1R^^Rm P"p >D zm?}!Z!c2+sGO_I``Ptk BPym0WsT EFh4͡ƶ¶,dd|H&_ |yZs2cPy_0H@S%nSw·d:DFs 9\a2x)\Pny)i$40P4#KOeCmԳPe>Ay>Է Ty8mB/m9`r9'sQڣ|7E yZdh4Fr@QS.Af m;}#!-0(iy[TʐLIGºǡɀTǖVV/:[`ϓ0O|Y0gH/wIh)k13vL?3 }AuaL.vZ2A8Y+yhIGO691%YFZ?X`䔈L(G9lohx߰$@G^^НOF 旷g+Ow.Ŏ<5lܰq?Vȍ?zD8,waJ|߇89!?! ##\~4򵍱^ױr GOj py/N#翐/ǗW"D'd@(> NHNPG0 $l(" ͲdK$Ke{ 4Rblc`w֪<$z&OAuBrvUa@_)ʶ63P (C^^^D_2=`P"7HBHGQ=*E#I@*oy8vk w[|undN#a^a]W#-/++suh4mykN8{>wy}ߝ>9\׾uy{y?3hvnTU·azRmm8rtDb366q K oXVlj56nHK&ҪPUO$H~A80eyNefÑR'#!ǁ*skY').[q|X ǁ*#6sրy-[YxC;?ge0-\Rn6oب\.ǝ u`||1nQ+G'{ re< pÍOr_M8|Łt CJRC Nw>A=*JV })!;aU;+H\(m@Q($\X[(^;aW^ GCRks]vJF6x՘@\wjJ !0Bay|'UZSEJ禎ڄ$؇xi$~6T}r1e#b\ KQ}k>*uzWCړh4xb,ۢ~?=9'uҴ~C.xEu\rыdtt]|)gz6<5$wq7Z.XKCz0 y%/>%^=B M|Ι~_p9 o1w#<_psZ_0"0`/& y<`8`A R+x:'¶$JI0L{|^;~WCoT( խ@\fzz2i< mYo:oKBy]tdOLIig@i̳z{dJDs>Q`Z%½ 0G2w8-߅`DuPۂB`F2ڵOp̱3z}F._/r/n_O; wvN9)_}|p+T+Uj:=p/;|ig[6m}y رm;۶ncB@ >yYsׯ}s`bbE^ءd~ u`R:p"T!(3Th>H%% *(9Tj06*^Bۘa, 3R4 )?vIad%dWô%²є vKρ%$RL{O>Mk UFs ȷm^te&dxhx}gq֜oON:s_{] `ӛd ,`m}:e5 j_*/eۧl>7ab<|nYTA 4͗})#1 ƶ@aat'u=L'a|rpi t`)SQ2|ݑ{Ӕ01"ya^ Ȉek͎˗oM=Z:orÍ?+x#4L?=w}o~I&3> ^S?_4ܴqӌHm$Dfv -p86C@0s= Ø̓O<D/6{sP[X,X G/WC~L<~Wâá0)c(pV2 Yɥp0VZr^ ȣꑎ'7vF)4D  m@ɕx&{/YGF3ؼy:ުWQT}O22N8S2j~|3'x<ϋ_q9 B"u?{b< L睳V"I5E,j!bO6k*ti/8RX|UI9wY})'qǽl|Ðͼ/gضͭw~oy}Yn=TN<+D~ⓟ p!\B>R&ziA Tj5~ͫɏodr_]ۮ$/bp 7mᨣWr嫮@^g7 +!C74AI} 13,l9C݅a*2~r9~ 0UWQX(}0 "T*໒LQ-Ҩp-h4g1C;x_CZU^yvbYW\}.Χ>/3~(Nٶl2ns{>p 53wߺw7:lנVv ##8 #P m=-@};܃pX /JG.U5ѷZNJ1 ,StXwu'@:{c@ WY4u(M=AKh4bkCNP*hOB!q䪲ړbxU⣰ÿZ8%9 qQIHsb սPF~Xa&enIЇ   v8zP1$ uTTo+n2ftFh4FzZGbUTxP 'N*-@C[aVym-';a:KؠL@GFC˜;%#at{7SP P|Xy",_&#m"Df/L$ԪVkvh4r5͔&lsb2%IDTlP}Gab0R۴:. a .} G\9v1W.ma h_(B:]?OJK_F8&C)o ޻C VdȚʓR*^ V~IQguhEFm?4=4tfED4kh.ԇP(]'՟hw<TnDdb;vv7m2{1TDԟ4t-y l -}<uе\+Ε(?6H$`(I/%01.ey6(= ^ Է =5 "t}v?f?f{-24'4ͳ&Umm8l@G@5ww6bx 2mIoSmPm"V䔔 RCUH59"yaj`fEH.C(L%{w̅v;(0{EFh4~3WȖ?zN@,Ii\/X^ix7%P)Wl['FG"kN@at.j;`J·!lӴ67y-O,x?`"Ch4f?pΙ IDATqu <=IH730GXw$>*qI?@@/o,~cE\7a>KqhEFAe| {hۍh4%L(jjL|\>ϖlOkS:nEF́H$$L;<ܭ"hhh4sl#u19`s7.e9w2m_s}(PP~{(qg{~s7g 3T0K%/[uRH+i4́eEb&;M}{4F4x.#Xk}qOix>ƚ;sb4?5S5{2՗o%r|{NnChNBG*0%IfwxHr/96! +.Mò3d3 HfeK.H`p,>lz?6+ vܶ#@XdۤBW Bu1ze(xB(nv-MRPe<]7 /|'Ch4PB1*+K%o"o:E@tŮ`b(WX0LyPh(o*HAMCoTUfe^ Ô)?~FrvBCW#y5 +#E|6M'e,;D7;{a,90 Pj0ٶHnXt"$ԽS+b4p"`L )SH@R]vVa`Z0"VS}[&W F ݌O<160StdsBBPƸi4n6Ò#O- Œ21Ca[W˔} 1H*w!H0 %LS߾+ 'ռԊ2NhرL'z1-R".׫ zM0Twpi 5 w?jegs6,͔khr/lGKt (hT41lGƍDFmB@DH B0TsDnu,X-24Fh9֪bR 0( T ӨФ(t^yC&%P !?m@e(#;Jv´ )6Uɀt"D|>!'v>9gf$:DPU*t ECWam9C%76)㻥>DIy[xʋ2!~@u W+(T%v}U rzA^kz/ޛ"2cu"Uߕ(dEFl>QJ7^{~1s/h:8؇ձ9Xx%^A#$:*WIaT"OŃ-܊B$2"*j16U 'q\WOK"8Vs<7UbE$0j8ZQ!G*´T[p!4I@r(Trw*'aanY6߅„oe`vC;I^e'% h +Ԛ(T+U7*x2U)x[sŸԯ[*k*R׫8|A%<\AUtdh0 Ck+݌Ohhm/y;lov041?P43z ~=+ <ٯO[;(Z"-:1Qqv@=u?P&} 1' )WUair r&5>=PCMlAÂ_ (śb0-?;0ԷCr1T{ ΍09?6<KNkzWiV|!h"2 O8Jx[p[5F_c]J;yGp#,~>lV]bq+sL<vxq*Cmn<pb~Z4f71M޳?FTPh;QoaX) Gb|-HeaB%2>iz$0Hb<'#r()\%J@TA0-Óh'Wk2}m[s*<"ͽrOam@<)7lF  ǡg XG)d^9yV!)^0ZUF]XDR1-eJ`߆)@G'alLPQ]3lIoVb$~(QI$h49Hzrk;DX7%slcIBUuNeak$w{*^ʰ_<^]3,B-Ynjk*ja^d^%- Qc=+Q Ch< Kul!i1m%Piťa3mFEua,PV$P }K9^(<~EIEPMf:իrtoo-vDEm*=G֞>YM`;aĉ<& 3$h4gaFDO4,\w6Taْlt *<[-Uilgu%qXDJE0pDWJ2C:+lUq)EPP],r_* >%kquDE~<ɻ.LCUO C,TnwEPBޭrOooT kDҽcJC`-bOEaT iHk+8}HVZuFT1Oy#i^fIMBuߢEFd{ Fv^ j1U Â'h_CPQjb'ޅ^$;UMTU*cP_ rL.N.Be-PyT9$=D;T*Hu'Qܨ;wԠo֊JT߾'cR9w -"jUzdT;z_@ivJ`1Zx5${+{̤*c.iw# $ʛ~. j4fC<-`Kl{[u;!Dؽ"(8`Š?,&$$Y<풯Pw rb4nOx1qoPbF--mdxmڡ 4}NuԵ۲iXT Wyn̸Lg/UQYա*5E$ⲶfY`tIb5wU[4ѡBvGcJLp)˒-Ry Yɴ:GJ}SRJJ]ړh4 4FX-FoئD% Ǧ Iի"խv ڏgU-`6^AB PY ވTϔFu0pRu [%N&Tb̿ ;t?Pc`_!PRvR H !Cњ*Mv:rU+DzFD]UnHU%5zNHi;T*wMX] >.ҹb&ءY7FSu(SD`Toq3@BJ\_#Zdh4A@ FPaAfJ;%^=a*@fG Hf)aʓw mjc ˉp2pL@9U< H9}.JO߾` 0F¼߶z '!]ըgB$ o<&TE׮8_bL؆pTJ2_M,< =^\/%r'SOυJj\O}TGe\JOU1Sċ@R%'1` xĕ~)|76oX[P&MSήs!$@;UA-:"W$w$)+ݲx5xMh4pƞh4Oʛr*;Pˎ-;$WY)+ C `RB`zOÈC"lK^fJ"!S{%" :V9ҧ"QY)]k+K VGEJ"XsHF7b|OzxnkZCn(uLw Ǖ@%q·WC2;(բLSuS] K]TI[=N-24f;fӶ{tL@iFFL!h aR Uߕ|P"dBiHeenv_()2aar jUX`4)׫䝱hn yCX. f4tڦtJg38$-E aPAAIG" S^g@t-y[h49Xx+Wܣ=#\~7|{?N`/Zƪ|'6ul߶:Wy\߿ ?!g~_77ө|_^:e[~vAY05xŗ<1w]oU'u~`M{uVV.?!V.? 7'x/焣Nb{?rⲗRTwqg"Q_)z/ y5IlbtzuUִ&ƵGaJJTesL"z<ϷM{7,KrA:N^+KD3JжL)j$UDFgٶTyb -0 &4PW.F aH#Pr %wzI)%ɉ(= J2 ;*~N#,ǶEl[ʋR M1lu7uߠ=F3'Lbwq́cG{߹}_aYesɥ/7׿uLLHw#Wn.|gsm;j|_^t7f{߹7 I-;y7x3r@=)|k_{ 3kŋ_5ò,}lf1o|r9FFF' Cn猍hW|>qN;c;m'N$8 uP 68u>! #D@ Tn $H*}8f>,(< ?!ODebCռ7l'o$9Xm*f)q`J8)dJ@{4,lZ'E@XmRן2~َ8Fj vL:ܦ(y3%G8 Uv6*Id'hpiU3qYaT^hI[^ ړh40idp" 2 d˶d2dC:\.>ܿ;9QO=I8,JIVvp_]o~["2.{\zM0䖟¤Pdw桷٘O!]lڸ&ⰢF&b"1ʇf?t(!L, eʓxwRi e8$(/jؘ6 H8б d,<q,SzZ6,y!wTDxhδP^sUˈ%%eT㮀M] ΄vU6|ǁ_[uDҁ|FLXzTeX*Uu̸_$-KDeBhW0իd*ZQ AdLKi4_ ?Ǭ:tFGGܧ?Ϛϧ\.a#})kOYu\y+ԟ6==|{?qI'0hN9{ B# ^﵍k}]w%Yt 8Eu?\y+ykį`OiQ.gT*n헼UuV\r yWO=r? rkyC߃<3%) +(/TOۤ@rp:1 ]+׫qqR^ߋUW}=Pw pU\~Mmh4^W׽eW]i]7h<>TiK.?A^_1O> ?ck򎫯W_|ݷ6< :mo-o{s׿(Jή*sCɷh4bͨD|Tޑ0s}^iaf!Iz(/Ehn]OCJtͦ|{5hTe -tᔯ֯/]دe\}wS;S~g]BSdԺ^i{ܦ^t"gy 3<6~2VceS~N20~\Mݗi;v ln}Ѿm4c\65;22ݽy3~A@6mShq EH.ρfTuɉsE-aJV$T['$*j;;-mz䵣W8ީwpr%,¤ ݡ4rV*F aW%)'NBr:)11UaXAP%o-'ޜlqaJhUUBDi a`J)V")Zx0 jy)/wX<$D(FLV(ʘa(bŴh1d{bMl D ?'#hݦ}wDL9 A]3uG50 Jhy\"Z?ua̴Wq=_iEF0fݷ?zI93qVyy/=[e̸s>9|#g߬,\y _FVOɍJd؉XX28Ra*=)]mRz6¥!AGp五HB6'04*a98 9& $Ag!$}jS[ kc9|͓p'e:2Y(( [5- TlۉŘa)qbTM%m7fxa֥ԯeA}ܝLŠ׋'DBw( E83rJjm9OÛ18\p?=\j ]/A ُy9ϰu̖Șiְ2f8m}0+W'9:f*Nf#ߋ~v;3wӯ1jqW{|`Ol^y Si|q!Oun~b7Cw&bxS{j5B5 5")zԫ"TR ])a( ?1c%% !UBʒ'坱$::յ0s#(Ӓ6{[Ua/8\Ć{S8< JH#P*Wyy0gsae{t_*|ټv87 ,_U|nWy0Š>2RTQ:U3;d+=W8Q|#BDBJ!SzٶJxVku1_-~ydi}yR뭻ea,Q KfddJW;RqH ȱHV:+q7, 3JOOw[Ys:uܥob׺]UyγSu緅-Zdݢjt%!|PCZ֢֗"w9 Jrl}&2YUB 3h+m2wpT]^F&#߼7%,ڟNR*IF>Y G#*q5 ey_҅9nQT$dIت&:!i3`U|+4ڌ5;*_lϼ2:pp[9&C$O fzǩK ֬82^x_z[e#r˭u|߻?p˯޵?1R YC f;0)8%3I"cǟw%^Cն!T. S&ѐŒx! w9qʶ]wг/IS[o@-2ǐ[&QiK!)3*ut,04KY )i[ \1Ι i[L1MJh5PV!ڐ|-x{g.]!̇րV(?`;!,0tT tv_fzz.`Gc9ǽg)MFuZ:S(e?RNR-'}U8᜹e.syY$6!P!}XXr=]/hPdt)8;Ktɡ8B@ 7$e4Kah@i6"mqm< !hA0 ԕO:06&Dʂȴ>GMG il)!N L|-XΏC &4?5c! P>;5Y-Q_ s }Y2,!, MBBjguVEl|,0Zdѱ&H"Kߺ>9dZCpzw%}bphS#`uCQ M(GgLpƩՒ^gHU U=Y&䥌e.s$EId<%S@@i ޶ jOb_;g.o=ޖLډ`9SQkduMe~,ᜥf/$Ńb"LߗHLX4Q1m2ދ2h3F ԩ {\T:tɯ<y U<~RRA8zVq>e|ZTU UrlR<\ub\e.s%ژLv8%;@#3I#G#~Ni-;HLl["\l)3ȴ1MXpvj:`3i|47D#p串]t$~)fl=.`( : IBbF%YU 2G4$ s:`gf)9XhX&g ,]_9+˘N2'?bېDӥ,򄜠̥[(RSeUš4]3"#y7^ѵHGڋ?is$!N+Κ,+qVZrOpIkg^fWs\gE1}jAҞhdn@t Μ }o$o_gYz0ޟ$ uDž#!|BxnzgLʒԑ|NH\gTqnD,%N 8Y F"˫ v 3l#Tlp@D#_ߧch? .l VGhE)6'dN_j}[bƇە6?dZ܈6|ɡ[w~ #k>u>.|ڟؤ٢7Z\rE{Qk![X@ykÜ]$Pe)eHsҾ{j\kJ}3$]>rJ4 '>(3m̯7vGF 86,WZB,!Mbe˷g/k#O˱՗#ʈXXK $)! QbdI9Ig$1Ȉ̽a#~85#NZddi\cuT*G#eEf|Һ̌"Wx$8Fq\${֓#dT 36h6&s#Oa&6cGȏE玗Х Wy =dqc'>gOUj2&M#h4Ӕ oagQV83μ|!l*sA pLΑ؄HLDBBд1"cr4M, uiu8՚rcI;+% E.4V'J4.%zO^iBSn贌y͎a oJ{jpD]= xwya %_ߘ^hd{rh=RnKe.!q{mEZjHeCl&%kR%@1CBPmE̲/g6R )(?/:I0g_OVMᡦʽ±Dڃ34G1ʗUgW٬kE;H{*E1Qv@);鵤[!')X 9~E!)W ؿ*> ὠwvpcY=}t> O:z(6 bտ&?E‹_Ʒ&8{< \K/&Z Ӡ†l#1Z[튙\sEV!Gy9"ht(m])wdO4fם?f{r@hP"6UFZ$;&g%St,Q:Rv0҉i܎;QPU:nYZkSVA I+G`<'}''#^1/}q>/΋ 4IôĿBeڋ(oJۂpS N6xzz< Aw B4-1~VOٹq%<ʄ50G 4,QEh0$tgَwdDh`x9ڧ%bU$~ħC){,=?9ġ[G)!.ym!]4L_hdBa-k4Cؐ p>6nrm$/ƀDŎ)PUzvYU*#‰ !SfE#+jBWhǴPĺ'R&9XX\'% gr ֘efdiX:=_2 S;!Ɍ2 ]H_,^΄ JM^Ǣs-F;;eDMZ%ǟxߏe.~d LVCEJevyeFKY[+:PK1I0pe 6k4dkl15ѢL e 159UH%,1 Ӂtɕ˰ ex7Aoy2v!4${ʌ)ZS9np-aΤ-'ڐMIZIY8n&A+A/d L 6fr" |gZ1 *BYxF[8dQxX[wRTP &H 0Q[J -~bzF>[A^(N9tS5.Uծ+:Ͽ3 + 5b  Hf*Q7۷,o܆}[>`:Nal+$SiӱDp.>e"8Yh pw70䧰@uBxjLW5ѻ!Ӻ$k\C^3d66l Z_KQa {s6h& i6!l ,?{EcY8͈6_l,/'h.UY I-!E /I6'6+)@XCEAP_ڱ/-b2[,H6 IDAT+1uL-G'%P9c6dYhSW~'ͥ:Wtΰuv> j.skI>~5ldrvDlG\kC#J~/0UyQx!;{:u2od;H'GbГCjCmϊqDlog&>a.ZR{hkɩJ}8}QȒ$Z Z i֠%}m$qwJ1$ק*#'?$KYzK|YlӇfg2Z!\4)R#1dT?gk T&M51ר n8T dQzB\~RqrG&k$!x%R=]Z^e7GV镲?l|cdurwi|ǾNz'f.s\^]8~7 luT}q]fOiEthlFCT uެM9+Huv/fA5s"7|)&TJ=d K᮴έGvpݗGkq@ īLp;JS5x@re.s+.qco]kDYL$q Єyx&CXV!I|%"ZI!r֬|tYnZnY &rhDQ '֡dȉ&# 5ztemej3Qw<^dSL],QW02|UVyHٖqV<6qĄ#1a"2aGkyR`nޖe+GF]ph2R{H{/t; 0$ EYd`/‹Оj2:Y΋Wd5CAe,Eg h li2tO:2e)5,zL埔*soXvd+3RQzB%7w2UҦFdٟ./_N]PıN'Pjg :ɬӿNKXEqQyU~Li'ז\[Կxf(پUfM*TJ068I4r,;߄o<tǘ.?֗8S24kXWJ>7\ps9QE13KEã#!Q('D& %\;_M46Y_ FR4;!9T1<`fe|Wʑ%h# ۖ8ebc XV'UC^fYZV:،wSߜ)UEf,V: 2;DM%dk)T[Ei;o1M{7gj?OIߚw Gdz,w8q|Ip}~Nh4~n3mۼ~?Sc?chg|8xռfos7oA_#2kps9$ "йhD%4 -:ɹ0ޓ^1_VAƛtN~lG;ϛPZ^Z-7.ZTLRȼ7-h6a4# UGt=! A!meht`?]oZ! qP[Oe>ކ:1/5(a. v'C& <b H{B!x} p潖ɚZƬ-ҷ<)N4ENNCɿJS 2qJQS48i"LO`Z &޲;6γH4q}lAnCȰp2uv?&b,R?k,#BG8q'ߑY>W5[,ooN=Ǿ𖷼z׿<|_ά O$m7 r<;;;Q<!?C|+|o?y{lll7^z /| <\xk_ZSO=ǫ}ǩS'p?C?0s2I@{12î?'U\&%ɦmSժw^4ӷm̢ٙ7:RGilv͎:0LRgl!:l? 4㮃nB~j-h$yM!%;IxV~l,ZA~ES&Ӄ#au߄BL"){2G$D닉?ž!!mђ:{!7GFB4p(A~V!lLVȄfvYaw?y=ڏd$&&E*ahR1cvB1: */afdTECk[l<9?3PNUX`Lubq:ty-)9ǻ5A27V=9 Ir,! {&ZO\YlW}V\0QfqStCǖH^TO|8֚}c;wOMf?J;_<c_5{;ɕ+Wb}}~ O='}.\F>O=Kjxsq YXXU/"??n?'7ntߟ:sˑD{9-`^X$s8\T}Kډ^2i`HrN4,:h8aJ6 `3T*!nK2n'97g ݮԪޒ0oN:8 z2!,#| N"XXg 0gr 9/83xNj&EQ27(񩶧̷߃茄&8&#yE&e锲侈Lި8CULE-TVR\U=ۨjS!`Ƕ" kI?bxDvꙶ.mC`'3"u(Ycs&!*@)Ǒ6(ѩuFhRjƢht \^e2ko] =*6sc6vOF;iOi[$"GC0ÓgV?`eW3Q<dcx{eCZ(xGW:Uc1 җtf_U/ށmZ/}[37n裏[[ C~aO?~۶>xǽg?Y~ .5裏0ytW\Cs?HdV|w.sK$dmku`2ڑhU cri! d,|H"5Yƹ8 ZHN0$mzWEӰeAֳ}к y*%ڐu/oCk ;{suK3P벼h^LYr*Jl02DNG%y?x, :߃?/|Sn-ADɊcCBa0:XmrXV|>D_:@Aդ R86q]g׹p4:V\~%^8B6P$~grrGf~q_H 5 XLvDq,P F F)fa-E5am;ĆW04R(˚ HPM C0ʾ%#QP8CeJRo>?|AF[[[|x/_N:^sͬ/$J)_+oF֬mgyy5㰸vz)~a>Ϳ7_ 2@E<ʯBkͷ-nE_|_ooh4sCpAtV\8.;njDo|WRUCY%jSU v`xךL8  bd7>:hD4ku^EtmXXu13[akVWrڌD:2½nLBj{T{ `T7,9up^GڪԌ 2qXIiՖ5Pu>!΂sH3M7*&Q ]x4Z%,/-eams*7g7XYjG8Ru7o8#C%'vU+hP c̓,بؠh^.Q~ R_Lk$ ULTeDž)Upgbwѥ" pa&AJyT &hLA$GW%ђyIJ NMpG$4jN {o~6ҵW$Lp:i-_dV#U"(X;|_W'?ɧ>)FGy'm}k|_λΞ={x8ڵk?^xow}3U˗/?ӻ.{/gxG_e~~uT}{?s?G?Q}Qn޼ӧyӛ[m?7>F۝U(xgAwCi2ÉqW n$TOhh?`0FYsR8& |V#ZI6,њlGr~TI)1ydo-Bc gV>4xX2arP}~SvA{b>лE!2߁3g|JL8z֠^ZG|cн2)X4Z2ZSr{#2t q#vđќ,xb~f9rm]j–|b|vőΪ6]Lwdh$c j^~^u%=y?'alx˛➻ObqY16wmthv," *2Ha e[DqCX?Ιgt: F#,e-cƞOYmRjb$JevСO Yz@]83 տr =?#?˿ȏHi;<v/.]bssj${^08ozӛ\STj#??t]aFÇ>!n޼I硇⥗^s˱E- u Pd&؃ĞmC&X@ۄ'>`,ҵB}1ޖn <[@pq%7dNඉzߖ:^[<ʹ~f'Jc2cŰoHqXJئSЁwK{a/[ @ujB>m%}&]~/ev>%\>]Çu:BRMr?egCfmS A9z˒Nw7H$cz8y mک*=Y9HA"N@ԋ8c| .xnCmh7&5w0-"W"Nvɑ PDڱMIlFPXζpTLn[&.\7㱏c5A^ߡ?L8mJ2=;"$'[-jipax`(라7Z::r~#MDGqU=NrH&!yUR'ڋ8XcYvXbG8gШҹNHQ,]zE)#9IGqc2d܁ݝگZec=ƗO<O SO=OO 'r pZ4T88&6'VdiDͽW%mwvPE CI*x@:G0}߆\^~>ǧ?iO}*=~5w2XZZⳟ,뾂#\^.1;PǖХԀK~h q NpQ&%fG=6-ǽa`lB&;$ci3IqN$3~B\@̎܆95r4=qh/@ {fE hM]=UdBƁ12{WdLNMi9B8±U&)ݮ L)o@o wzh,%NI/!~~O6C$ۺhh̴Bm :݇dI%Ɉy> Q*՜5Y0W9$*Y!21?w'5w{#uao8$8VDr!rOC!Aqױq "G0bVX66gOsB۷g4}φ9e6aus^ПΪhOϼշʴ&#QD)ާi҄T#H5F*G\T Qʱ۶q]˶R gB̵OIZ'-maZ!#"i,VzJI `ߵ qxua e[j6}PʹU}͔9xM?q>O?w?+0啔5䏈MnЄL%$jR0RwtT F7lmf#I>gS@+v]"C9 ӄLdg}4DX/%WC}t[{OH{ 3t C#co_8.fWEؼݯ ,%0 h{Apԙ2S!iF@Th o NF:$@tR ~ $ oO̩6'}uomtD׉A_T{朔h"|I *JYXV5[8FE>MT܁+WpVVOٰbcXXvV(&" ׭!z VMѠBz8K=,z3X_nrq:.7\# 8tKHM,X ^:w@Eh] iAczz5z|:Udoڕ˲Phb**[Qb(bac }j45(#х-,&5XFe8Q8QcVpDULH56 Mb)Ԃ#ԝ}&'7n'Q6.*~.s\^kb][`%y리%q %Og4~b5&GF|C+%{E2C@Oh3:#ڀs^{ׅ3wA);A _C)p B$flLcqGFoT-HXg@H5cu")[ÚSޙDz'!''.hYso:vJ&F3m`w7GY, b0⇊1;i֩xmmok7 "%Z6ᘭ:8[X__& C0VstiO-G. X[ZaK^W9,.4nmb=BMpkLD)a\*Q.%Z pX\_UI2jp' 3}>$* і0YZc!mQQ,q5qbcϝfgKqi@b #Z-t<(ȏXX:b>vMṟ153(Y{5Y8̬OAYM\CQ{jt3HFiwF3e.w@OB/|#!3ٲbv2ͻhɱ;4`hK)e]F0>X6ԋC!+d9 $*C&y1"dGBfeP:ȴ;"jp@&oH$E9hdbeUe`zIАf7BY_Z N R)"c;ı^]Crkx>cB,bbpXXc1(Zsx5ׯR4MЦlV} aiغ}nKwR.^Gk[x͚CͲik:&B?+^d$r"*^ Uir21Pu\OȆIX B3$ e&(8K@ KlӨ;άa4l kt{CNel)\b< Ðe1Q^Kw[ A2bt15[4>Ǡ;^\$2vc[k5::jmh4e6p },E5H!2B0s-.ʰdOӫ"?HMB<MR9:Kn٭&&QQD1zu(D!(Vk㰴!=Fn±-_SOjrKcl5糴;ۄA6V|^VilPir$ 8 k4쬢<u)똊%mhc.UEbb2ϗ8d&Rf9"E>$٧T{oRo|/8WaaY*u@h8|F?vn i/U}n|F_ +fS-PbBj t:-`VC 0pͯJQY@]` ^k>AS|͵dva1"F6c,Y\^آ*vpuv(EQDz\^rC-,D FQzcG*Ѩh6\l"Vǰ?deyo~I|/^kpuj:kBbc[hVPBMQ-<]:Lr 횀kS;0ǐ$*0_*|/d<FШՈFfFY' v:y>+<XXhǬ}?5Xu,Ki7Z]w =t1z7n̳/|ǵp]k"-]_kie/jt?;(i0e&kW㨸_OY$#CNs\rgW NѷThRq (;fk;`$; # Ms؈6OWz[k~VȆ7\ D[1t=3rZ@g 5ԗđ=A_:.Uq~ٲ*d WfM2}[!ޕu ޷ RI2,+ok_$EhYRFGqVf$#0&u~~dHTQ}}2n-BF]6Μba >^m3}8BY.nR6= F{/5:aCcm[v#ḏ׃(Ss4Yl׹޿Nnh5C{I00J8z+3wE5-Z95+*QV2#.^U.Sv145&"F![zZʲtEW:Dހka(ի^X/\{k\t׆pSgΰ3Wyѷ1k+w=c%zj}"~leu}ǂI|OtAT k\$!ԕ>1ݤ.}1C$Ze-36ڭFڑN\2c%V`,Vt`I2Đp 2`Aܟ]|gHIm63 !>j͟@ H] "~M! K+[iC&Z-!+B z޺- #wJiiHsYYDRM`ODWe* -c3>et C0IYS7 u l|gDkRmc6e1jov- 3\}ZڎE'u3SY%`$y//3;}߃+_3dO4jG|4@Bz]pKHW Gʁ`p 1KLb2*M1QT4 w40 !jўVdL;VbVe3;'+w<(u֊ވ^dԭ?p-bm1i%)"z ||?dA?A+iikKDQi{,#?C#wv:Y^Z(ĺþksI8u$UB3I~jO2wsA™Tq<ʫmKY50`94[ >`[x[\cB=jkØzK׮y>f7o2=Muv=PV=X Tx!\qA>CeѶEDZ?rLHv>%鐄X sǦDΛ1 l; z%rBe.s@r.<wCeqNI8<([vә9u:GQ{zA"%s&B0w{u %$#2sQMuV]}R4ʆHן|7 fbIn o/Ap Mrዒj@hlVa Fy em%g#H/d~ 1m4Z2Z!}6LY\߲ 2)۝CdMU4*,BU1HtNWH!˶|d iu q Mb4lvm+Ei7a01 CЃHiz:SެX1FwvvYZ^c0eȅ /l阑VQ{}bN')kS@jU1arl;gBUM2,qiR8Ҧ3NFc/1 ml|_Ź5!Sc4硔`X?{odIvsΉʪB @$Au-붖Z4ڤB{kɴ6-.mlM6VPY1Ǜ^-""+ $@'-2=|99lAQVC8k%yQ1M*iWֆtNgġ~C K>+N\$3:{, ]pczm dl65F&q]*ִp8jI]ߑcٝ DK>@{W.q5 kM|G a)K0gHt~&d3g')O·=_S{"> dM^}_d`6GA OնڦuӦ,Hq=Ů'xk望qjnMO 4cbd{זU,+zF@7 {0Nʻڪ;1sX<$Q-F@]!Aؖi5Nk@k&|Q4J+d:MiBĔYN]הyvt65pWN CIHeΖQ ڢ=&9qg8 &آbQJc:}fyYX, ,(_.lm56S׿OVs6;2qgܵ_ie.ڶ(u]3Θ fU Ca="stt1 }O~wQBn# 9G? 5ռbNQĞ/ ,g6ͧ #4>3EG{ŜьGԵ ]a}EښmyL8ws:i}~3r۹m'7K;m3b,cٝ%xΕҐJBe6,Ȅ !X9W`{,U)yT/MľKhb6o/@5N'b$lU߅x&/es QߒEe`YJɢ{U|B%qnub͙ZDZSo9cfM]`g4 $I޹OƯ֧p8ױ p8R SlWt; 4NuEeuU(b8R5Qܡ,+L(+KD:xA+PW5UEIY9f( P㏿}Ƚ|PԖjtekGQQzs<5窍׫smM6 Ւ6uWFZ5@wqpsjΡ=Ҋ}NO>R6>d:<}C'MR@cKppy9?_';eh,#S9_<&c|SRQs~9rL<Q֚(,tpAc boCm^ 0n\Z=ڄ/[ff c܁;;Z8ޚSZ!lF&[9f1hײXXoIlX:׬ &B=D` `{"8AwOP$Lt!/*$b w߇G?x!n_6cҺǍC}w:s24ۥ|כz"\Lk4qc:RlMDo`׀$Mp=ujbPٕ\;nR)&P>Tӏk:rlNS xa@^:jkcx5" vvy{|s( /M]r=yHQ,E&;;rS;,N!)K=QY%@TrK0SѝIB1lF?Xewg[Z$uqn 6uÏ$7ByRaA}a~O?<t g? '/.:=_'f?>9br-wmq,Z<]ũX9z.-e.JGȓ^Db 7[̆ꬱM޾ɸޖ[|sqݷ[FmGחuXkWՋhF{EI'WSIMX `>S:iBdyQ9iGD\'KZڪ(30$|Nt{=jcqDYF!ZX㈣l^?c>`ꌫɜ(qatϹޚѾ.F}!QL ,"-l=lb5鳡ؤI~JCU? TɛOE ;NgG(by8XLTEt4壜\]I$ql,kʪCg|tx~SNyXhה$^˴]|߷s-Xx+Se_d_nq]:ȸ;AkG,\uvKR<6"%Q3!y!@H؏; a'ʲ{`;a!.Z]B6'_ ~_ZXSx#s _'>y/!݅,t)O[,ts9:fK`\ zͲVYThnߢD_e{߈xSqom7@:VKt-v}:V_CSщ<>zL9frul1bKt:؈<u o~x^%}$`or'N{x <_dYc"b3]I ڧv>~.dy6c^w+ZK>$BoF~F[sx̿[ϓs4ɿJ-- z-;՜3jvMoQ@'Ϟ-2<%*1H8ܡI9;;' <>لŴSpG-% # &c|PSlӥ,K=&9U`4[1͙t4mRCfn5M\MVߤbz(WmRZʮ.c 8uM677&#Mº:o׏&=@V朕FER5#u}y?ud B! y<| U)L`E!c4 mw>:cUP0>6gY[ EV̺f #a3z  ~ k_dȸ=vZ.';+kÕR(O76QKWO+@KBń|˜hl:E9b6CkI2OQ_pZLϿ?фɔ^7hv)VYˋSvze9V\MK~F9WWFqbÏS2 Qa1<%1nTXj<UBztֽ5l .VvAZ)'c0" }gGhJgơ1N1[hߓ~1 Nf /$id9SxA@?Al`3( *PK_*}1nB`kl]ܿb6[ 8j_Cgٵ ` \YB&anڧz ٝٝ7ei. 2{ɪƕTR RD{~nvF$rK$;څτHR8~%@ EZeO Bڳc qe5#>ŅܻJyMZ#/5U@< +.f +>{9j2e(Krc׍p1U\~TpY_ڔmDžUޛdx*$E]oemH֤mnKY?j[Ӳy5(r)T5$1Nb8cb}͢ȩ k-.c,<9Ub4|F=8I$r$iD<}k*c9>=# }ہ| ÛcmNaڔ{Ry `r B($&b$W$Crm-w(a:o7#궛+FGXz~oGWֹ΢O9B|Ô9lʫsO)qy(ݡ* ϣ;@c?Qp!%uU`lE|4e4sv5&- XT0+f4YP[vxcLm]KHA2L1AeUw([HQT%ш*ue5EIxZ<ia2m%[2-ڏJB+Zj!]izlܭuE6-oTjn[o |}?'gϯo h;;;ו$ 3xc"@]@OIFH闒_Cx,._C]69)As ;k흘 56k.rw2?V^r]ʅۈT Umҡ\  |:"Ty6I;Xk}QN-2޲dm^,#~p8֎G!E(.gT(9d:ѐC KwggjZ86Xg0Xӂ8~(K'_5 Fo弭?{bCR^kX>[ė_Zr;,tU߻J{mV@;;o`۽'@wHk:G`kPX, ?>yg!/mEܜkq bu}}*Ynu0ҽukkTMs7_9< ΉAH՘l) N1QhNOOwtJ|x4" 5{{;S㑣=Pv^_ FGEq,8UBo\~>2_8H| gSN`dHcOQ౷c2`onOmNDŽ"s: Sy8E|ז X,IYscjII Za۹X~Tu\6y.AP p!=$ .V\5z={6m6 F-ou46 X,vϬC$o=m[ȸ;_ui^dg{8ȧx c&u>~ W,@rR|p=} >T(^`i9 Lʙ>< c``OCB>޷v s@o.~^#Hp60Ë >HI"yu /? UI. mb.epQƯ8|/?k;_XEv}R9C)}ݧu9lJj)F*[Z*]]izRWy"󪿔Gr΂ $g}9o@ qqi-nIlxahV#ތVZhт6BFGt>2)||E=gY,`2G 6YFۥ,3l&%C.QqN]fY>yw SJf.??/ln bL*"%1<`>SG̦S}^uX%QIק7Ȇs8cEٔKVSj* n*{o5L|Jr}7?^ &bk(9|%ix>Z);MpuyE%|4" ꪔ1%<0UNax tiʪf/ֱHg%cpJQ9Gm,4fc=~J]e^k.F3 ˆ=|ȷ^L.cg Gc]1J\)^ki8N*bP]C 'RU|̹FHCٜ J%Ș~}ȾV.rЦػ޶fH4aMﯡ.k*@{ZCZ$Ҥ& 5 .J35nJRZkn>>EV3ω4TC[ j<^>e!^c21[G Ar1x}:fVh^pZ$TUMSsTeqK}2cI^c}n'% }F+9Myhk|k9+{ãCg0.p886FZkʲdIۖPC/LR+6 )6[kֶ[;*rN=X(;oKnr}M{gwvgw[lvE POX&up>>`=ŇpzwOLa4 }aG&/zFTzU'Z{!/՚sDω7Hl&@ Pebo)̮}38z_Ga=~/MxG {0WD1x^BU.eg@C8 ˠdLB=s=T ~ ]N=zP1T,K.ex !ҩ6t% c=DňU)ݿ3Y.Eͭe*hL7tp©] 0mQ8&wNs󺤗D 0u(k"Ʉ~t2È0>lE>ω?Q^)~%KH ] W#N@Vk'l̫ 8#{=jS32 >.ՔY Pd2AyA! #|ktHjjnK-Aߚm{U[yH8|zKZBݜkgI5¥u%C@I PyhS|`pě1GAhZa#O1uMtZcA ʊ"g$"0Gh!8<dejg1>GNBi*LSBy(t#Mk@-4n͝IK'CoJ oD48Yr[ |S[ߤ !2=˛G\%^Jɐe͞6(+Xap%/λ@~,,߇8C~f|gjw9N%T\tnY00WuTOJqo0dS*`t|_P\E%2(I%/pen[WmEY //=b6GQ1eQ`*E>]N+B?HCi疫łŋo>X1F)0阋G}.U]RE%b i&k*'qLFxZ&)x>ڏ lEi 5(I/quJG$qpAg%_5WD" plzV%{>sG,D+<)z]Ӡ|qk tm3'g[IDb/r(gFͻhÒ?i*_)kWٕRb Fk<Zh޲ukcRs[!%o7wٝS5'G"9 xvKN}aD/2cPPx88\| # !y W_ƒ˱ރə&৐ -@T?~)=MIّ0u|v!3mJD*tu*(#R2<0O!rKI1yHh+_u10>f~* gw|_P}Y"@^z}jeODr$#Mt+ynjP.~?u)=} ٲ *DNTYw͖)u}ҁu-qsxf/%9$N@I˔HZ+N14na?"@ l>l*_e:{8c ^^[Jg9$e@4~3TϽGss~/aL^v֡hBՄ/f47^- }SP3a4 C=&)Y1M2B<-c5=rK]1߫nÚ|a# 5uUo^ZSm^-PgRη^X@cDq@,ᐣAWQg7)+E^t1غd2ip e@[kT<u]S3zu0g_{<ǏD1cO`Wp  #/<7ݕd+?qt{r =U>/t/ˏ!܅xI´ٗ(/,?%Fc3aw:g<$AB x>LOȄ(YUjeLLpKIV$r/J:Wc>\ T|Hy/`i*_-dN/lS]t7 } dd=wҍ7/X5r[_Mbm?ε8iBM1;]]ɦSc>}]$bex"}./ ˫!ԔUNmj2G;rfb~(=~դD1OH<{3͹ŋW3OJ_;4 =(0yBv98SU5Dڢض\g+:4WԵWtTU&aW.slBIֹ%Y6S5ZB8Bf&'#C8D7ҟ82pUE5tzFWf^G>Nء_Lf9֊~7A) sJ{MIIVq5䥣v0)g  c~g` 8FK^TkM%2.9Ўvګ(nSbdmX vo nNa|+ο1F@GS鬽ƤI֡=myuio 9'c>0[,O%G`\ ;R y.D4,^|i1o>Dٵj="ƧPd} @I#fa\~.%{L`zho1ٹ$z{T~ּHϖr0Byq鼑R+` =$OAC=٘m:W 0= y*S9͠!̞ ]0 6_)KYY|{[@=* Y1t`r {@# L'"J/9QouD/զ< 6zst}o%:~ش*Q*b@ׄ$ԆShU9|CmITd@& Cߧ(rJbhm񴢗DhkĞC+v}ϗS94Ta(`pzvN'DO%ho"2$@M2HE8G8gVc,T i$DcJ&,k^;C>-2:9Ck8~@'ƙzd}`f2nZYl0lB|OOL]Qe{yhkcրs hHiݰr)m@ȵZ_O(jKUrhe"9'C1wvgwdJ$7I:MBg} 8Vy:XI885,ރoA~!N~$?H%Br0 PN`cK}HzߑtpS~W\O| a7C̀y8?gb܁O!=f=Y\;2?v!$Wk@sg]);8璿Sa.˗s1Z0*|V1,8OuH҄ z."40UjHԵ󂦨bգm\ 6b;T{.NPڽ:Tpn-t^𕡘 qu^/ӈbģ. *KOX k UU{a¢x*ۧk'Bo,eY㔏i* yŢp~Y\Mi0a8$(+A yK |m̒\K`7Ve-MY2ܚ]oL+ђ͒肥 Kfl HZB/Nu1a60:Mxh;;oj1x{ N).G8)$}%`ʅO`6<{ IU N$^[qeL/dD a0Oѿ#x-*?[Ca3)/(=^y\D:@F/9!_ CbHz=o24T{}UWZ"7˧Œ8+9(T+[ ?]u{%_%[14 i@ uQ%'e1R@VeIE(d4%n0йcTuCt,}ɲ( hͭ- $IخnZmx0k˾b!{MGfòŰ|rDM б X,s^GΦ$Ku6 Xrxz?p65X_xuoUk tu+S 4AO\?}!0?8]SKy蜗C1L%M:E?&=.(&Pw FBE;I(Һc(kqΞDa1FMζ6%7y+{)D:~55NB90y 3"EN{[_D9؅vW(@q Xy<܂܂N2x57\ tcB22~@m10)ެ}ͳp~6ޣwOIenC揄WCj;P}lWRŮ7,-)O{5|f_aEooX|];|/ jiV`/Z_|8^Z|bZj^,%7Wϧ,gZ}91{CA]96:4tMkdi*eƍ$bzzJUuNa I M$$f c3v61KGbBH#KܺOR&jޒe Œ(i=6dZ5plPԧ<::w5G''81o`5JktF $j[g=(Kj&ڟy@5:/漞XMG,V՛4fk9jFa 0zb6!DFQWu:k4|4ld1XQVYQ6 M򼠬ZhX,K6đa43Cd&֞l[0pG?QNK|eE=UQcX9N1c{{CʪvD!VF,#ОG__^z'p8(Zs׊G|e~Uܛ 6;'Gk^}VYBCs켃7JLPXYR`X.OS[/;8|jEބ\2Z 5x ;N2AD 4OJ<;/KaO{cH^`^D$A!l6Paٟ|"+}R_O#bpx|IswE=j ^[1qҥ#ٖ6PW2) =FRޥ;N Fy `˹]̥='{[B{ gk{2z.^RŗȹKw{@?ͻ9 Τj 9+<&Tn;k[%~/&0ZkIY-]#rGh֭ TP=\b%GxY'+=yDܧ$6CMAHS.lGLNILT,b14y1a`ăOH҄mi6 (q 4{׶˚y im`*y}@ۀ- HDԮsGӴTyNc[Mؠh 0eUtrmM^TI./޾$싳KҦ.ycriʃ_QX/' u=u-qhڀ0 0жZy=1/ȗhM367|`2Ȯѵ#NO͍M,EGdJ]לN&N8G<><:Ee8םe6=#SV%qqFq|| e19\./ԹB1)?*xQ`.uX*rjk23Ý#н>aN+jꯐs~/mg1QLgAQ"Y08~WⳚ@.>=o^U\U\ w f7ɿ7kPރ.0&N ۂSܦGm8Z# VKP1eV>"xp$/\1`,@!RpRC#>{uPܯw;߄H*-, as[)dCAMᘼǥ $A't p4o´͏\/EmഀEvw#oBjUkԎ 2=s^`S =m@yu"Ӿ#}ϻwau[IFhLd}$u-IR@<'T|_h#twnJ\fk Z96e#" l=u]SKXTaqmwD^ԴmM۶t]r2$M"u]g ABjQPS%hH8HJp4RwZzǏD)>m=a$)6dV&Җ,rQ{;{x4IE6`LWD;.scWE)W9{Sub*)u+)8Mozݖ͒(t$[)1q㬧kmq K[J{OփcBP)}(˩%)@-oA!mq Z<;Iw;;+:!_6^WCo@Iݕe,+&P߇Y(ɼ0!1ınߐ-N {}c`c1KҮg%og{Jw#]mD68T aWBrO?6>wXFHt,H:A^VKᨌo&@ToB2 ~P\:V'@ A'ף' IGh^[}=HbY5;DQb`Yr*i]5J1HC6 ۣݍh%mY]cd)^QZ0"#4#SV,%ј|I۵T͛Ϻʋ4 ƘlDK֝gQ-IymY. x@E+r.G ̦sFYBtUG]\K/(0M8-h' ,"N0Zɕv3ڪ8?=ޗG!ZY-B5*w"⼥iN]Β!@9( n}E6lomJ XrFtΒ {;LiI#a8`-d`m}Qj5 a@M$TUIQhƣ=WlnnP5m'|9ĘCI-^wL ZkALQ '); E gZM44 ''6Cל0fXq6~S ~*.~YUrq6g~<}![#VH]4qknɐWԺ >ܳ k-WqWqtK~(~ 8H_]"7%a6¡$7a0އxM  ĉ:|jV維CQ! =h0=%M5Ho;M {p M)߅O <(;+2| #$ )<Bf_RT=l XJ~u ~>"ЪތW^ SqvAܯLN^PtVBx.e{;#H_oΫ=Y;J)" ޭ+n+yX: {\; 0Y]14#h6NS2lYb*٩t7 .ģQwQ=yw롔&xGqXv-]u+!Vo}qu|8bI)· R @9o-MURmq]њa6@iEY( cg{e^8p]t:ek<eX"GQD%mHLSN&Ks:+y罯иR,sF[.lg}G4,;2'Tbℓٌ0K:j}0J9L[i?j528>> uTU~ZU%ʇX~E;+'|ӯ=>6B/+xZ4g[9/*1g WqWqG'/ '~Wħay4oBv9YvF=1A7[z4gQYIʙt  GNxp`{߅kS>d{BSqPCPZ8Y0!H3lސutfIw? brӯKgX++cPtH)'b`xE> U!?` ю(v-Tkl 'I.B7V bYbɵo"@iD*c =wɸ6Ӈ:w^fj@Ӷ z8-NCČFCʪkj(u&trD+EeCnz_1i( HCmN@1D|N/) kevkhꚍ Zㄺ I  UY脭ֈȇ!* &l,G_y_}.qJc4ښ,uIs:smo}c0j;$qF9\穊0 QFGI`{O(%;NN/ SKq5}" _*jU(4{G۶`;눣PAR,g$IJƽoOdccHE $Nc8 ,sypu ceMzl\SG)* qKz` Xg?FU8Bmsڼ$CwM|>coW ,Q߭_:Ÿ_nƺuê˰. X\gUqZCϮso\9Kvaj<WEUďE!x?{c3;~[evvw '?˾_ ?`i(.& =I&7nJ$\RTJ^7pҡ<݆Pf±͡uXs.m,a.Ow^Á$A2խ")Dw5daBBXB&Ra]O^La#߀ac[' wctY x)Mo@5p ^PK'ߑH2]ӕ8/ ,܅2vA&P=)0T(N um<ۯA}6nH^tS/A)ݐB_v2V8ٮO EF`DuvvwyMӒ9EYD2 2ܵAN|;;{oJ[i6761'MC','GkARV5[V4-w8멢,x9IඳXI!AtXt+6 Z6x =ae*ـ82ܺu$6ƻ8Ztr=h GTuG &LxDQDDQBEs^;aJ^֡-Is8sXzWԎr^#LSںr `e:sp0uQ6bֳ!ΝKA0Km;T]V/{ժRunCߦib"âj}&RWWO-vv/,;:<Tܽ>=w3e1U}Hd`* E) T'@2N瀃(rx`8p[<$fUqVʇ2n|H:&ՕoHw`vØ ~WxNH^ͤ\!zB^ št o6_w_tǰr*MxtT"r  @"9J/~U##&םI 4z\wcͤcS:H!>-I7}3F5ݑ.V:{v!Y^R_a~ p㝸 >P"Is F+0ijk>@(etm4F)ΐOkE].M+8] meuQl0@iC$yц(n0ALݴTĄ%R|(( H׮r EՁtγ+y`8"#t`뚦툣;BbL~5ýMpCZ2lo_9^J_*^a/fz5[%eu1ZS9u bCIC ((ˊl6cZ „ J||9AmkIswnhq(i:T0A6bo / O4rIA5N:˜|)fmtI-T咢*,X4^)ڦ% iV]pmg]@QXr$2p@&Bx ;#I?$_.Y㝺P@YօWӯ %YlW{r 8Kۼn/?OO_O[?×%%?oIw*~ƹ+/] R'I7#a{RR~٦tIgC g|G#U3[R ;lx-m Y-<'3@}Gxhc)FZhMhdr]' _J&6`[)0E/kITbs0U0?tOQ/{RЅ/ )pWt*dK(߂u)F}'h=XȾ*pkH:7.Rp؅Fq~'@! J@ H_3b_s!MFJuv?{_=2Z<3ͨZ2E~5I0pbg a4r(%r1SY" hmH8I P0k[1q,\+L>8E+A!i2qS8PTk5=Z{6g{+?>QRN&OX.gp44+ Ei4,a1M` {(˒({O]?'#|, Z~ƥ_~.^^+EGsW:?z/_GG~2ƛ||*+ fBԠjIT?~&GpXQ͸35@n>jT_"`'d:#f;CqRH,kOϤ6Ay^a? /CH\.-oDl*^G(:5͏6Fi]+ZV.߄tN«ɹĈGG[ U45ŸM9:e. BoY0sQjQܓ k8w圚XԳ>pp~Г{(\:\ꬨP|?5J~M]`bװX,~st]GFgpUc asdZ=,<'/JeI$d`Dјl8d8F+pш(,9M''G\g0Pme e9_r1MYLOE+I>o|,/}W;3xCf7Ơ#]%Wl,m!Rm c!9O`Ui{T~90 skCVԔ0f+*W].,OXÍikضHOIaOU&6X>`$\b.ШnP{?+DL/`[a$~L(4tG@uJ_M߉0hJx4mm @*6mתz Zw). f&jsYFEeI۶chۖO:(1ưt:k_{Y+Pb׶);)[M2B LsD!F,#s& F#L)$X,sl`K*b/|x|/Y~ᗿdV`ц( B16ZhfE)YVtY*=Yq1;yRx9gkglK+n B|JS׼'XĨdȝev yQ3R^k__|jcW˂"ǹdN6,%]0 Gx] c6a@YhH)˂xRW9z d) 8>'y#x{OMbk{ MVy Ջ)\+؜wvRtx*loxQ8ZkwYq@|̹cys%ESҜ+ U| %0m_u^xy?~_*~Ng@?O~ d/ J\ރh7 $ _ulB?#Ȍ὾a̞}s:|O佛aJC0/ '"e? T˰}ax(NS9- |DL~7BwR[pt867A!JS[/>c"q%a0*ğ2xHYPh>)_I/?tG!v88y6oB_N9㰜CJΟ-~H=>wx[Kw$z)IIY^(-5<o jS"cX/*S2UF JiLpyEQ0hێ ,%M3e.;xA]7k džbҥYвtmHn-*(ˆ9:lKS7|Gu]xmuTutJń&`$ yp4m8=>esstJ/ ߵ>~LĨ1Q2 ʎ@kΑb4PK67ȋ۵xh$&B/0B1.1@ﴎ­%+_AU\ '+_տV | TYָR_{P΂x˒f6(kH7vkxՏR/P,Kt{mw޽K$ GL(ep҈mHYh۷R6L&x4,#!M"$ɣ#ms:ٌiCRs IDAT,}Yq{F)$т-d1E3JYGSոn՝STuw^h9ӹi$ e]:Gu0.;ԏj^D֟fhq:P;g[qtVgų v"VO>NuS˚czrA+~*6F\?_<3?W#~;eWO}W2i*[I$|ZފSIg_dG9(=$7X!'p`DmHmG*i`X\m)"nBv/FuD}!ÓuT&sҫWpDT$3Il{?Y9^}=Dz4Ey$Y7%^2mIwobOm)Y*v]4 _Io,8%gP]}$HRSA a Y 6B:xWo䷚<Uw=͏/xPBnOelC9Ϗr|pq J!A .`քq:ڮ#c!L4 dA7(s2!csخC7os^ǣP\,3n<012 #5{6no# nш|)ZFstt&c ׯd:]4JOk; *$&*990 ONnK]pj0(:lS7uݐh4.slא8Ɠ8kqy[u@[kS(vdYF]xְ).kE1g[+){evthppm|p ;6F0"ވ >Ö/?ys'LڄzTSO>s痹Xoܾqq4%?&kO*//gݟ]?/ _y~Kh4?Y[Bd0 >%3JIaT wC%\zߊzAp/ȏWyO$zBH{򭍜/FsCr_ C9c,q7@'") }_!l 1@h!zQdWd褸0($ VFyXB] o'N*9h{lÃb\3ⷦj Qv/#c2VIʨm/I34կ~,Һ%ZnI:KYv,(* ]YbzseQvH 8`6R'8'eYQ%A/EMuxJDh(d4HOPylZqx`k&LmQl='Y[;"Z"_64uцq#CAH4hB.tuM(9 h4anZ)voleTҪ8+8.S+0X;SmUq!K0Kaӡ(ǨCm?3|H\7o\C)1 4KIb!h2?|nEEѢpN9?'K_U._zj7ƅǟg Ǯ]?"=iX̨3XA&a-$ϣPOK0}(v'2_=[R|v1HѾ#3^HT/400)l(~KR<9Q"*J;+v2Ui{ "|$~ 9'^4JGhWSh"n.N꾑n}tߒG3.HNGpv>G\Q)'dG,3[U2׏A L}D@>FP@Ť/N{xo^A3cE ^'Ja4MɋBjL*,ETرC s:kɋwtY,"kDIH >XkEQatROGjS( >vs]gvtD7$arA >eh( m:шuLS)M㨫wyh@i#MZ *IqCqTgV4NqB^4|(6Fkq aPR% % а%JC(f6\g{o |h[IfbA=X*Vub%qlY/] 4`}s80xڂ jFᵢ,JT/s-~z>ʯ_csyl)uW_#z PM)S9sMK] .I3ƃ ۶ŒXΎ`<ސ.eYR5Ŝ&O1a U(S;LR]sgJ<8e5`{2f=zL5q Me]%TڜsS%2MPuЏKn)BNŚV`m/'? ?skWEU\U|"$u]/U%!Z 9sNNw2;u NȬzz]ֳ!8EI&nD|]k],IDY$fGgɌ6Osهa5e"`Wx*%e3Dy/Х4u9l or.vn 9k/ ^cwS#ކCp ] 3LYT[Bb/e]1>pKϛ%4o{N:9fWb#;.=A'`r~Ő/yO uTZ2{O d5T+!MEh𑏾[oŻp8ar6g8"cv6oi; @Yc׆<$2d\)fեDOYk.eM!_.>vk19dQ/ >\h1TEA]Wl5iҖ, 66]KU(R^v:M˓ Y2f}׵4=_\䋜dJSUN|?-&1& c6N|OѴhI␽锗glp)dʋsMp^1gTUͲ,i;fĖJ;q5᠀@+ca_G5Ut4"Ll LhoCs( ޛS [|[ޒ8˔21 Tzq~E-a*D&O%!u9,6Lw(l_@@q!ӃpՑuЬE2(=[XíA6BSzώ<߷uX^C̐r..OO=baX'"˄%DX p DQ}ۼ/@@-4ysC 8%LH3LOOw=,kyڝA7)o;$m3 DkE]$IB\^vxLsʢ0OaE+j'2U:Y% Q7ȈC?d9`=qr|A!/[ qJU9囲j [x +1xeo4do[.{jv}H9tz4vxwhl㮂 viW*%mHӟ6OTw߭[;pn op?n! }+m/xlήEUe21'm>kXIa2Xlt8 8/CzKC)EzEqw p}?7EbBOl;ACEG0](?u}X 8sB %} | )F%<)QH{2غ|}yϫ^+lk9fuO%b h%̰+@2ɟ|&L2G2Grl 5ËNΏ7f2P*ק ^m^`-;Me(-j9?k;fSU5u]:hmi5MSoUNja%g''yNHFM#z0`o%Ut4`ʲse2bCUK/8o98l6%IҬ7բ' a8ڏ+$fޠ%5D؀(pud2Z75j)V NuG _x˴lZ [{[*уϸWDz qǃViަEKP{cÐ0KAru`0d2$=ZEUQ +u%ށk-egzw1Om2eO)DtZ&❄UE笚Z)Pڃ#n,k|j1gdy96Iˊ`ӧO[L$C|]R75ӽ}MO8f0{+;גQP,8Lе5f|FՊ. (šJ);L;ծ yT_ou xߊ?YϷ8Ki@X0l+&J3^3W6a~'ܟzt?p>(לuno|ٰϥ\j*sOԱ I ,ޕ Ç0ރťÑh#%T̤s?tד֕t _\)j1@a򦈺D&]Tue){S`$ bv;^_9 z: mx z Sf.LJ7!eks LUOD,>a _cd2ڗtq*S619_,̦=U* xuI),ޢEhO`uW$=}G^4Tn M Ӣ#E*1%lO"N_[0x'R>\l(KgUC{2hw0Y.$i. mlxmO(61^ve=?e#Iϟa('sa m,U݈)$ͨ4h "icʲ"V^$ILXʺZl@Et2庥kp3,W5*^椙AhXS.L Kj[PwnD_oHϽ;l36T]vrzkUA逢Ixg<4d<ݶYzշJmi0N۴wt5 A`fޝCIB` ,y'nSL uV"V_W£iUHfh }GTmt-.^;h֛l8s01M(MQW5eж'Mrcqdh?yL$iB4DAl  x~|xO۹p&oQM5AWV>;)pAqkp4y)Sʀڧy}&5{|3׀ח¡%ј~W~~W~ ~7>^(ѯnͺY1g0HR<14F@[ :IŶ*de;:ЬD4F@2`c)fm_^^;YE^U@(bᨿO$S !~d_X~,j/:{4C;_? T?ǰ=ށ-/ko}*}+ipt~gz=߶x`ސ$(IX,DQDe, qS%oߦ( <'/ NOϨfGRZ]R+Ն T!:ut]h0%y\\O!RUyYaL c./4 \KAjPf)sLYWN٧l I6|ۢ! fMYPtd'Ծ!2ހ:FIh 㔽)Ahw_.rQIoMWZ]u6[]jJ[m}m@Wb 9OGե.Z|1_/8==^y&{S8sK*L:K[:֋u;[e6J-/ONi;ߧ{l`Ȳe,u@ J 0]}uYtMGZk뒊ie,y|κy^Q*dQ%EuA5p:i:i_j]5y{Ih\'֛oaZQ `:ω8NPƀD!4V=IVJ(uu:fZ\kC+Vck6c{m UJ1]p6,E;v 4\zi;|Xᯁ4s4?"W>d(/g/~m7/޺5 ɟpϛi?GwS^^$ |!64a݋m8#Xokx>DJ w.墚E˱H&6 Od`D/BМA3p1}E~)r!7 8X:|&׊$-e{ IDAT: k@G4d?IFBʟ_# ۶.*)TS6JtR?_JW0#9  @A| }\/VD< GCqrK߄0 ֧^s!gJӴj Yk[wmS)P:9X8󹀎'?%Q)ISΡE9 '{۵܊6uhm1&;O^\fd\aZҔU 61tohڎI: b/xM^cm5I2Lxavsܻjk ,tu-)՜@;s˳s 5IL`RW$R7}m{y|ZwqAӺ+ JRbZ,m bks^]q16;ТAR%ƀՠ|G^c:hۖl讣k[zAvENU7[mN^qrvN8҄IH:jC%Jl3DJGwA5&5MY,uK2=8`vqNUp ; QPT5xek#Q-V4_o'߻UJQ5&1'Ϟ:0˂{8*J0&Nř,CXWZbɅ|θ"+ \<jֆPƵ(J&X@M@Ik5u Y=d}_ǏS;/X;ͷnxT7fݬh)D0݃1 ^r` S';\ܧf⢴Wa>Ճ9ݯHm8?,/8FSz{ ~@M^Gyݖ0x FD]wz8h#t@E+H$<@T"r{0*FWg߾wHR6I| ;B)WקNT[l$q9AsvZWiÐ0 i`qqqAYUhm2MUU5o`y[j/vU0_,i( w r5q<x"/K1fM'$Y&ݵZFիi]ukOQ.0dYj 5c>[X('\^ּqݒ$O=FEQQ5 e0HbF&/_>'b|!زZR+HÐA y*C @k(QG[ m5J ='0VPx%'WxM|iHHzB)]V<YڽR$WAvIn6WgV7fݬg]7!nD׽A־n_ h"3(Bc86OE*tt čj;Kht߇_/ظ.YɠXD`r^~$9Ž|O.6R~اDzG?/IK[8PCHD'e=lOATW ٭V,gAeZbzVSd[)})`5y{}I7^Bω~fhV")%k$/?拮'h l6s uPLu8N? #m;1_,7rv|yJtH$Nc;ٜ9'4hzKj4Z4r5%']''s qj_)`Q~Σ%"p^1;yY-W|| $}^S%o{o|Gt'$NƴNqrrƓ'O8?K*4 ޕw9hHӈZʲ\y^{{Mbd\oI6!u07N/Q[a} Sy_3Һ";,

{dIͺY73Zfّ8s:ނ;_a-ĉ*f.:&r}f~V ɕx'W" |ORT"|ćW/7=H/MB TC:.^h+"ՕBBjϤȶ㩼G{-O=Dwo~fBqIT-aemxWr(Ȑ}6`_S#v5 ޒm{XpÇ?-ڻZ,~ %͎@ܤvk;X+řlG=c>u :( h-vP֊uiYJ4FeW+$䄦iE UU$ 8LGhmrҫ.%"4cq~B5UU}RQDJ3c1,f3 @!eQPV:fGcWDQ(eez{5ł( ɲ!ul$"]GݔR(C]'b#"1K0b0 ā&!IlP(jÝCkЪ#KBgjN)82[m% ii=~^coPF{Y6@i9?fk pm+Ͷ#hȦY]'!~WL6Bc mt\% UpWaLy iIҌbŌdj6a?ߣlXOi|£wP%e8}dx< dh|I:jFalHXp ĸ4<;c:36DA^)Ϟ>E!i)C4E+HB7>ܧ SơeqK;6۠S9-Pa R%A%ՊlG+z9'J2\ 5lC-cl'[[mj;0#_Qm#7[sG'[{Nf1&[p]G\o.ɓVC+wի3}o65fgY7f,3XgpC] ψjJi=mO @AT|b+k00!tBJSKiIA#.Br^;ʴa ߄,j-i6"$nKHMO(L>|' {weRV2)PHG}0_'3ٗ/kG.f&CHɝP>#PA C ?4ى&H'܂UcLL-ChZ^PmW}&[EOM 8Fl>SOK}p0 OԍXQnE!0ZHu=g:pzzJ]7`*I o[ݻb@kM H㘼(vr5MN$ci?=o{Z% ž_E|<iv\^s9" d_< &g2$ eYS54MMGryy I2e\\Bױ60A`₶1(4-I/{u]szz.IcXuAj^1H*gӵ(spvQR}1}EЂ5bpd8Ø X]rM"Қ04qz$K3FiBl猇\2_ܺwdbI$" x>k9y<gmE?'9oQ>}MK$e:`XgOKԝ,7=dž`zvlCn_[aJrf'l*_-?_yn2 i[֌F#{ @ܞ? J~+<叾>WmpnͺY`yՠ/X6h) oOһ79'ֶ:ym$6F_'ߕp&Sc(%6p>.Sh.Enư]xË'Rdr>WbKZFo 3cٔNzEo~>}$h}> {8;eڰ$GLR"T݆:Wwǀ5);{P^X@0PJ&G\ {rx1; [ia\| ?MFg`Awէd8'[J]ױ^I5A!_]ס84MY,cIӌv_]ס J98穪8In'̶V}^1 Ͽ ;y@c&7Eu)(MS\_$P+CfqO$Aɭ6`)&υfLYVq2HӘjR8 Q`wtMAEhm'(5uID$`@xΕAK8X'yG|Fϟ= BOfwBھxO!:#a`;xw=@-{' F+9l Wqe(l1A½;v,"ƣ1 Pw!I2Q-]DDɀf=$R9/U5\]M`` /+T3 !4N8r]ӑD{wr9Q`HBý`HU.F7}b:+ m[:ʢ$ +mlGszP#\_u0'c ӧ(7fݬgZћݖf$C؜jP9B:I凒iB[BIHHMN} :1RgsL _dQݑBx]`+ൟBdw,KQ ܓBռ{s9T2ɱQP]&Hp,AC6];}LՋh;;XTPA< ~rq&21ϠH[\kOmF"mѥ -r@ddOP%9躎mYo6Ah4\XfX0N>g+CIjvKv;7(ܽs''ޅ 8's}1֚7EUj$!/__[LUՄa5uݐߞ$p~~XJSV5U4Z5AJ`\ B8̈`0@1N0V3y0 $ ^lbZ: G u ф˩Z?rN>ZS GpC׳l톷A׻:p}F?sMMX4fXpr|ff2`|b6C*+\QW mEe0 #u0˚[$CN^|IdA@S5%h5`tຆ*/1L&|:IKQ7bo lZlpt:oȋX3Lyyz /9'3h|$*O2_.X]^G6$HR䞟sCNiZWal̓m=~ዠ g  V6mQ/}_{z3NJBW%;@mV v׍{vJu "ق]^O?vqpliS?hC[1(nݺ9yiZ.'bR Qkhb.|//V,Dn0H4| P,k!0: m,t_,!EњҶӽTo[U%"M3gb8X4MKt-75ݲp]Di:X&ٜ * 4da{xQeQaF+jNPǣ!\#L\VKTs)߄OV/PhX\/M)NK hq:)Ӊ|!NY^}RBKG.$6>ͻRcP\wKo_@h XSZ4.EP&O%WCrl$zBܷz 'Wh}*Ȉk- z>uMӰlwXtmGf;<{ɲR㝿8l %ARU;^6pX(VuӢ  C E"Lpݫ8n[n1PgYI IDATM:'ⶥnb7$źn''3 3&CГsf(7=;rα70L-qސ45 3`PaH:&GꊢV5Z\FZu!;1??gjQ:cO2 _?M./e2e㣵ƆᐢHe6Lcб{VXۇ-:/c4FInO?X猳!WJ)y\ج6tL֖>Ęq^3_-s0-( c^0oIb/tp$@ #zH5T{0ȟ p'(\1 c0Eb0w*Kҽ VSyq|u]xBU! ߼4~QUQh6Q.Vuƴ8\mGմS&M)G1 @DYwtʖe-"+֙R.8"ABU^s^c@JŊwi bdNԭCi#tL8@x<0)HUIÌw% ;~EAL&{mG^wjd\Щe#gwR{12^3 i;(MmW$z w(oZt28O%5d{{4EMEJ?MHs$͆,p1:lAhcAHY5hm{E)gg3'DQLHX`(߻b9i:@#k(6 Պ|UD@S&SlrY̭*p+FYB۔,sb=h?b6iK4p`]'6& #Tu_F+ÿg9~ƊQޡ1gxJߦdo]qFWbiu r2:hE FpUmGz:O,NxQQs- 1, L|9u6Q//I ƢX|7Yf4Us ј(#5c,]Wv( PZ\Ð}8ZlRihke쒢>CkRMj8HҔjgOڮ# I( zur ڊzZm>+Xsps3I m٦` ~у?Ћa8@6`ڀ(J48$'qn<wk-?vucxgh,]]kWw}Zhrҁ@Lg'dyN>lF㜺m9<:n;&)UU1Uݢruh(?[c4zi~^+\*IRd OH\؂Je ^%J5L;/>;f ëogcy)dG|7 ЯAPq2'+°\} w ,I^DJ/:%JR`,IkW7}8?;P_ɾ. |$r0cIO r.e*'C?^1\,HSʹ@0!3^Ln#+K["G+?%s2rBQ^s*OwGc꺦i4_'8/E}m۲sn̹.{ŵ!m̵3IcB<rD6 Nu HSa>ӱEUJlSBY1ZaPl6s&.pX65Y>L-q m$Pcb:9Z{<#:j( FtdzOjinVeUZ-1;)G4%#"ɳ4F88اU/ 0hI0vEחЊC+; C в=laxyce1ȩc˔0/jm0ZӴ gO.؛N?{GY;r`^q]aZ^DQh4bZ;+(ꊝ=`$ 5x5G˫+t$QL)% I㆔` 8'O#VK&,4 H8xWZXo (H MK[v>FG :JAs1ِ)qlQ (cop85nP;jS8 !zۍykipA:t#y'GޓK@_I!7Q7iP[smHxBz F67re=v#le^&L\ ?#[W`lGX(R$J ̂M#|t(R*Vx"Bvw߄ ֧p,. ?o1<\kzS rV}C}߁`$6s`y%R'qD;_#cB2|RF{K-{o"Ca$D}!k\ QOn #8p0ec5&vv_(Q0 /+r)do`ѹl0/\O+\?d|'\\\0%mX꺖(AB4\Y9BDD655[91F`\Jµ#&yWiG8PiF,u1jMZFSEՒ,͈ T1fUU2=<@c4gWDq1ΨW5{8?0h\NۆZ4=WWWClFH/440'IF(,m{IRH!b]X״R)cLru,h:]@M߁YІ4˨iDN4Q^_?GA2Bn&M/l~~hBb~K9:vwwcI 뽧( ޱO\GUD4eI@vO>tdެ黎r%Hk\#6mYU5}ס\ޱ3ʢ$Mbx9~k^.X\ZRQ=GTu ll1>!zP}ȲU!wc6 5=*(Nw}9<ɀm{ѣ24އ_ݾ7o| =?n[C:r}?0%6R?RF"j+ufUz;AoƗAƿW)? յ=?w_}zr`l%YHz.$ ?`4iT \$;씯_@T <xn݃ 0we]} (xo䟊Yܵ2t V*C09Koyy=HaW!9Ooɳ9=e3PALOBcX HΑ;0;<,c.k(Cv"&s,ew] fCy! baRaa1%*(Jg;&6۰xپ{',=P=VDi~!Łg;~k}SW(B៾...pN> `6N(1FYC4*wwh,hچeQ14fjM{EIۉ) vc A4۱GkMdوiAi$%m n4Em ׵ؤ h~//mX( !xPH&,D<\Սta ]%,omxmkqB0BҲ@Ç8xKYt1(gooVAc .+8kш$I2) m zMzL1L$@h4K%3ܬ21 6i5M]3A] IR6!6QD_/W\1i5+ݚ]%Mh}Kt}C߷8yGcgfW0{-jNy @ZsJapF@b+YE>Kn׮1(xMʞ6J6#5@R]mùpsDѵ[/͗ھ<+~^oj]\z);ޗϥ(=NK1^<͏ŐcDϾ+; (?fJ@Gмu#]/DkXmk1րQ c".y]X0*Yx%Ir).?>o~UY# x/A{YbQZs9hPZ|Xk5TU{DqDOhfcgKG!ϙyD4q|N$N5Y]_Gs5ybpKbIz#=; OM D~]nCQ!6P/| #h=a+a|$,A_7M2 W0{N>u 2# zu#@i/;] 8 ;)\<$={\Sٱ4{H@߆\;|$yL@A}PgpmaN>{S/s7P]ܷoRi'0A|,,%9jDv@sHShd_"u9Ϯ@z;~NIp+hQZSKEiIњ~/^pyyy]7cdȲmool u 09Ȳ˫AGT`#k0FwpMCUdiƳͪDz3aS֬Vf)(]tDU֬+:.`EɃ=2k-)4DFIݵv-*ld A1p$2s]G\ 'z`uԌ7|9jq&=nB#n۶64/5 qaWxܒYkxˆʇ@럵mKS9}S^\?pp5WS7 'Gx,R)64cg:Ib,ŋSp^X85iRX.xq~NQVeO[w"ӚrI|=>xgwsşP_\`9e1ݟLrEh Ib V%<"^w(:sU4&(t8pB*ּ; Ѵ ?  >6P0\nz,wDAH9^ur9,56I҄K!V֠H茦it m,b< CNu|Cdwsć!MSR"i`^Ot<%F9EEb-IEQW5s8=<ˢ,YWqd]xgHy "QEQG1uױ\ox(Xl&0*c,czڞ(ģE|k;|𤣌8q^4uc3جbeV+o0QG*i՘;w#@ IDAT8^pU=x0DE~.HVDswVBIbO:LYNkى `b-Fi2JI\;EGw^-XVlLTC%Y#32]\Nd`>8E1yfy/PZ%=>vH]ʳ4q>;NOW4mt~po+Gh *dF?}GGJt`2͉c1)Y"&*I#E^9Bqhk"FGho8_N$C@p=[9L6VʧnDخ-#"JK"rx#hzqthtݨ8hۖQのssCl8w<˅y:­s{͞eV/#?xrP!}V+߅ F߷⯰24wkpCl2WnwaaaldwUCC&ebξ!&m hB_|+.Dڄ&?;#yRg#a?6p]K>1?r,JA} |({;'Jl)>6M \>F_|)Ex =H%Bi(\yW HRo$P<\Ng!+!#W$7>L!U SF+^?d{lrn9}G׶DQ4d[9Q1QJI<%P,kVw=v`F'2V_vmìAkZ$SLd!|؈/I*z稚bUPReGYBݴLuYSv#lB^`1xQ;G?yQ=!hw9j2M9{qb&(Ix'8q8ڶ:XK;8"@մ$QLXI򂎒E0b<\]\phZbJ#c4C92WUy8u֒9M+~aGz;pcHI[ܹ{IZ\$Oi꒪*i[ɿi$qQZS7b76F+LQR#?~p.*YP!uqD-]] \hXuO;9t3N^2N"&)RgQq0Nڎ<'Қ014bZ{G t+E {|ےM]-iJkQ}EbSly?'|qq~&$[n[`!(PЃq\ݦ6PZz^/P3eGZ./^nu]/wjKiPyH$r {#Mm/RxO4܆DK'F!1Vgݜ Q|} Nо G'Za^f{{@]a\_f!} .}㧑 Jx[ 77f,l(\3ȗZp]~7 ;[U7,z .h_ZD@TSZ@[|Vavfsu"n  >on,_1WN.H{_3<xhFn {Y4\X,U[)ίkBS1="#bUZ8 mtke蓡e04$+ֆsMOmMi\!8oҔ+Mձ,ZV4N8(ǪlE㮠ZXFs+Wg2Q#Mc,%ƖIiCm-T~FXa>_r.T̺q@ц QuFS5-Zvf8Xm+ tJTUE(l놀%(lzzN4: #Ȣw=9iӘ9ڶ#"֛ Qru6|<ƣ]srt|"l*t8ݻ|1yMU!cPxD_q$IϽ;CAܐ[U8/; J[Ӗ{iB2~#b]-kO$$Ꙏj )'-P]=s-Sz8qy8˿5=>`Asz0L M۔&Iu i]b2 r+izIflI|CR@ .x۶rKE4R75;mʺ򾛨]yέCx[Y}/MҏrY/ik0`]Xe?ia4^O3pҟ }Eؑl" _≔#HɷLH$)9,.aD"fW eD%)ʄ%Px+|'hsoJLd,C/kگ ۧrL6&Q#dh/ 幜TcHYo} Fz)#9Ͼ6cHdc ^ ់)35DB6` `sIQh?ddwZI|z0lGȚ᏾ao(wooCk:F9uݵTJ%,JDJ$FUSkLb+<+.[0D.i(ʺ1uՊt& >!rrc (LzP9z'ȝ ji6Ƃwt:+lm$Mxٌ*l6X%i9{?,ߙ{zS08͡T`2>~ΘF ]g9(Ŧ(ȢhOl);('g(K+ưE-ޗXcLBFz% ,VvCf-ɆP麒 'G{>A!;:A_[p C-B(u\Jb7Եjpk㖋uM1 -={f@!o\6p>`t4]m7\!sc)쳿ϋoʟXdzC~ٮ;/ߘOdH5} k%u* IE䎘JdD}a*T?H}vsZṭ!{_~~`wbW"38~U!$ȇ^}SX O޷ۅ jUOhd~&lěa"IZ]ޡ(H@ 6<*Pr KllBy&`'Cn/;#/~ 3KzcR=ǫ4 Ƈ¢O_;q 0> h?]u- 璦_sXtg } 2ڮ{VX -c]kw}U3pvvDDZkyxxRjM۶x4ͮ 2DQLY`U40xIA2Ԗ$I!PV5uQ΃M2ra,DQ҆ mpCQ\ >U^Q$KN 5 D](,E<1t uSefnf"M@9=}1x)gWԭx*`S@1 =˲|gӣ?:j_7^/A3_ٷDwH3wD4fTng0z&{⻨Wb$8)ve( ϡО`ͥau|(_C;籺o38l/Й=8i'bT96VҶ+x{b4_T/&kŇ<#C^c <.`HϣY Y*EB 1~WҺ1lԍޕ@,FV_Hm;hxX^>B40%(?c0b7bdo^;a<`<: x{|ĝwv8>>&Gl$IDdRl#q]r ܭxSK,8\;TcL& `D8cD1ImZ6EIvlh@YwstCv&;SN'(iTũe\-k2 A)4`.#(軖}RW, ;,ik"VDbE5JnwlJ8'UlA"Z zF1ek!rF1JkڮgS]^!J2|D'5n`;7 !;ƒb u]I$nOsavwqBYoJ$%="kA{IvZڍVR\+l [vc.ZĴ!~!bvWǵ9]i6CǶPc2xuO\+MӟTzH \tu{erLM[0Aֳ5wKHL"c Fv.q w$I)Wrxڅ7X=!V%PXX]!=Wτ!nv"r!` ~6Gcr~P: PYaPR. ޖu|=?G\+FxM 嘺ՐPGAR@ +(>f=V8u/~|7]r a1 .FEK8i+^?(P(ɋR>9ꦖr$͔?YM 6R6&0e)RhD4MrRW( e)hFz6c㜓ݶ[e+<TDy>4-C{O?8#uq(&xbuPw=QQJںFOܻsBYM%7δnwyMQ-9M XIXMl]lg "qb`1AE[˺0_\De,W+Vn08e<gc)*a@(BA65x\c c Ql^Wr?ɝ^yl6kc$k/Ve9MABix<Mܿwz(!^S T7h,Jwzk͚鄦ibz<81Q>!hzr5II#Պi>x>syYҵyjڶZڶijʪJ?k*^<{E-fً4ł4 ;cJdh_ڇV+}ص]zىx8Ba~: V"%}3Z em/#xچ*iꊾvpgOy-uu#SE X(Fk R_7mrMWo|~Kr\k$;2:Os; [+ɿc鏸x B{/ҦH{p2 A:1?(;nw<`b؜ +rP(⊤_d^|* g`_ 1c0yOnw1KKW1Z<"0%x4[% Ѳ&yHOvއh0!ez">DECaO&OC7_Hn/+Qk1oWD"`rp!E,`v,OFL$xa1\+h "ъCW~\j'yU;O`6mPT14"AjPawV7.0vl띝XkLmCCľXc5eĄ*fai[ 5URM"( ʣZH yXY}ס4=ԝg)!H >bh3}jC4fEtՆ8@,m#Q~0V軞qcZSn*c8v..邥m;l"_ZyVHbh6v8cl#|H@YV+V+&tuUPnV$q$t{TŚj*KȠ,KhcfS4{{MK9=y|2rERl6|ylS)q|ĉmh(C5mIӄ.hڞx1{{xK$X.(MSjǯ|]|sE<S-i1ydلXFItNKG]RFcsƠK!Y+ ^mz./mrd2cwӷ%MRTw%?o ?U~75;Qx/̂G6L0i' 7da1$ޘAwtm{[ݠCR^Sۆy -06n%mړ$)axkES: K^u[xe\2KtshvdW3Nxz$ͥ4ZL ѕY oDcIj7=ʿ| ]# a Xjpu7ίZ]%)YAv/0+~i\D[hb1NW 9>#@ҝ̹F؂d$ Lv,+I&AL_31C9tDX"=K`)](f|MeX9:qp,aHR uG4o%y>i;tX-xFGt]=y>%KGAS,z:WщH]w/p";7 <(EQ8mc:GPlsbZߓD]EzҔ$IFDCD 4w(28195YJյv.?S"NRh< N&dic ܽŜ|D+VAvѕX)Xqvq4g4';,O놪q^X4]h__wpg#daXHj2(%Mh۞9ܙѷW9w_㏿=l$i[Qa#IW%~ 7d6J_GU_7l&`אVű<N(4JyDTe͚3ǚRUezl348t#BWӯB$GFɸ49jG ~]|f894Y̌Gw8Xk7bDq2أ(=v_\|/`otYJnFd>A:*\+4L |2~㿂N6߇WKR{%obl&ᤀ߆&`BBp.sOCG<ϤHQpkp-(v*v̾ 0~tW+sѮEd&PF>"0LD4yf%NkkJc?3.nH\4I\/`9T$q:F($V:$'͸:Lc79?_C=x`g*A+Ʊ^\}`X ίi:˂Cta6#&ĉ&"`ӻk8NN|+iT\buuˋO \\mijDT>鉓D$OF0<:R&eG}D6wu#IPT5M?_(xNPۿqxd}sUN$qb> jĻH$I&b簝kF|K1+ߜ?~%qÉxAӲ$**츇'g@}$Iq*Ҫt.ķ,)IKRVFg?ݹb ;0'S0 ϼG<1|.`^CD?B=߃z+@guO '؜l_ IAJ#*9?K9xY</`/:ïoyP4uCQ]ǟ|"[pNڂ~ȌE#bȼ8a/& #q}s4̶IVaS6H[5],1"NW3 :%9ȡjhڞs7ﹾfVJS{8nZt h҆8͸cg7krI/$a 4lv7d*y(40I} Ȭu$NKTv?/Ohi5w0lJR0?9օx)'K9n6=PLL`jRES<N&SX'@q)6.Eg})Ȉ8I|ze')XjX.Xk/WנDg9iM&r.`ıNdK)1dT Nz%R(V?E&b,LO 0Te<#fuϚ2lׇ=c0t }[Q9$a׏8cZaԤID 33I_S,g׏X xb9umh(gQʡt A)|N"Fz9tӱ ?B'J\K`cuQq% Kn& wssP>? EB%Z78CKzE93ڀ:ht"Ҵ,3J@̾R`+cGѐ`4} >㷄 \&J&FLOShha8&2aQ8~RJx,ㄢT*28+/T2 C(Ʒg=R&@-mQ?f}ެߐe;F٥#A<}],T ab'ƃʶ$#&ߜĦQ W釸SX|M~v5y8H/`@5`eO9шQy?C#فKW\_Aw u߅_FC^`ߵ"Z"u7'0U` ThWBw;[~}i[i 9ppHNK7H{e~*D~KxO}ϸk*%*?pGh ?2n35B+\c.yOfw8^:8NM,/h Qboxqy0JvUFSM70=|Mw-ލxo)65@ȫkSՖ@%w-Je,qqu#s3b8KR6@"XQcG Ԡu1MQͶƎQ )Si0:aW5랛$[2L`p~V"G#H隟p~JJqb##Vt@Q5YQW{>|Hglois X4;d@^y"08Eٌ`{9wJ\33Y9c,zRJBE9ꆪ (%YDYlY/ }'3ϨZCGHChdS;8S8|&;6?]v=Ez7ɀ0E9TZ> `0ma ׵x R:9sH*T<8XKa ͞V $?%Fo[ͽV䜮56D1HoMFLܶ ;L[p'$T"c;ߝ+9MKAFewC?Lf28h MRwy{QUއIE xojBPmHӄTHq]d=MדIbA@ewؾ{vMi2hFC3lqn /Jf}G[q\henS:ONN8jJ"q}3_/2 C8oq \YTp@*UK$q8X2 γR͡ lN59F :Btj\ AdZubr6( nn6TeQ1}ױΑł8t.,C31}k4Mi-Ŭ@fM9~]vi{ыq}}6?z_ۑ4)" }a)θ|EuYV2t1?nڞJ1uo"* Isvr;\Q-כ֍RW6XNOV7$цͮeMi@ ^S9C=')VkҠ?wn:?C'Oާr$c뙌Ⳑ&=Am{5`<`QH$m0j(=_Dmz-^GbJ%3jj=kwJK/Cw𷣓.ǹހ7}K ՅGOޅh6b>~"; v"/Jr{aX vFSfO60 Zn+/d؟My'o@[mlĶEއ x G ;gS<{O=d>E /&2ߗﷇe9GoE"r.w௧7w0f&iɠ~){o2l?Yq[zXIJu^P}&!V-߇$bKP9؃_b _j~藂jɫ/E$qt}Ϟ=8턧!p*L<MJ<0EC%%uIc4TQuew<5HAּ/ARLIK9(YV(4#(Mx0PyN}!GGc}mZGl>{:¶=Ion@SG1SX1 "OnpS١ap.EF$vlvW`N;TŘ eYI;]'mI"6T>r;ÁD>/`q"g:C8=~"Ǧ#9^&A@Zgo+x k;y9pN*KaBt.e꿁)'S T/94p۰1 GqxJ-F/ 1%wtGAq/A]KAiG⩘ 38e} $Idmv;l 6F979v#Pv4mWQKyl`/_ް8 s,$9cL9I)}ۂ:Oxg/SIN~<_wkhIl2qOND74ԭ< t]G%inGdL5]Sc(eҊ$In&Ӱsegja$/ UM1 /^^0_g (+V%vU`I>:S9lV=ٜk tkhv å Y:wEtȏ.>"hz(lGٕij^ Hk+Fߋ}((bNoAOr c%`@~&f@ cv>(^;ίx})@ē\;;EjڶE)EIo|Do8&czsLPg%u=#h֑MdKQ3q@#v#~CF'6Q(%zQZ"9~G@y!Ѳ::{FӎO~c65\n*>=łk1O釁 +\,TMpI)m?9݁9Rizi3tΙ$ m׋Zm9::yuy-y⨔'C?)ȍfMOctد75>}ku0tY*jGӸZЊ`*s#yPS9aOs(ka>eP"Þ,32>!KsVp 3t/i]L)M{)>FRA$㦆[6t@$aLͪ((XV4M#.؇)=j`]h=):v*o< qk38k_2.|o֛f#] ҥGpzpo{jz7ES.gM; eN:-_0kAcCD؊YO-勇pLFlN%*'L[V!$@ a3]A=MU"Mj7 Lߗx^|J"HG0FX@Deg߃MҡF9v.0CO`]X>f .OsMbJ޿?_I }P=Wd4mb1ux/;]85ÿ!8>:bӶE^NY'>wQ(m#\d4s.KG<.yS-lNtk"'2Ɍok@MQ$ε+7[$,g?0'w~>o{_ew8ЏfYL'dyx5,aAOMdif#F"6"P5I* b`ytP3_,'Ini2Ǒ/_( eY h#I3F=gXrjcw@afh>f{sÎW<~L;4,Vki۞j,Moz@g쎘aݠu`nG&mruj}0:%MEhӑ3”a! ("N0%/Y'SjT8aCX@t, 8&2ie4hk>}*׎ 4ۀ#lwڨ&{q->Lz47|QXx.>LMSgpgRĶfw?+ӯA L ۟?3;paȐ=HRߖazC2 X}UdNC#a^8$I'(Wkx;éc.]3!BLJ{NCL>_$o ؟Sᅀ2o:a2]wc{."T_+* (aO $1̾mOa>Xf%%}Ks#$K~&㧐_rT۰\ " QαaX%lnn|N(d"I$_sdYs<:H2oַ쉿3iw֎` MͫsR ]SqPM[#ZKfdZ^~IW.wR_rquJ|->xHy29ܼU- ojnzzkiIۚ/W$qjpyBlJ%*z7&($,MHdQfR(bGԤ_xul"%g{aqV2H )eA \pCG'֚~ 3[HbD)'B>3_,}ŧ}F<~ϟ?5qsH$dyAK//vnZCEl v{P[6Ŝ$ˈMnV!e8F ׷cNvd3q"航~ۼ[fc^mvڎ9ac8qNᜥnD[ˣOU]Z-c/AqD,eVdSWHw828;(aH"!4v1 hb*iDWA33YNL(xX`'c(/O Vl8Cȸ, dެ7W$YȀFHk"K߂l- G6,Đ ?Fo c'׾/gBZO<4'ES}Z-&= %?wDm6}D vZgx5\$BRKH'v$үJ'Ew%r _~h&#ZK_ԟK|nCD#]ì/5%\C+bx7C[(>@BQNQFM-&ѱH@MD*rr ?p{:v~)ZnZ"JƑ$ac{=#{V5jOQdY&]uz":& Ove #MA)\n 9܁? Qs30vKt`$:b^xSp8ж-!YE<~^bW2_,ڎŋs9|.gDw7#ўۤD֣Ec)YY:|i(ɲ%k\%@O;^/h5+iYFZ5ރV"- ^ 8 E7ء'$ Iz}8Z"yYl&=/x-"펣(QݞByh=Mg)f+P1ͨꖬAsh{aĆ0I;wd&e6[65a`%( FPkGcPEv' Aa꒣8t;q 6: ǘ($ Y9n{&-SR)I4GIBd$ʇ;"6r)Rk9'}?er7ěfY WP\h-*) g"bNF'6 \n721O1b^0?;BPOҝ=k0߅Fc?Wd+X?so*d0Kx8nőc<_)`t˩!L ;% !x=?W6ܕ՟aRvEH$),KaL ώrzcG"̩$U~J Kb7nn2[yյ(s:X}p~T:./aY0 sv2j-޳l$3$$SMé#ϋObjV,Ka  ֆ4I'C4fm&ōZN/ܦhzKƎd4/9݁fC Lc' IҔ?l.Ѹ%f+a4ˉg FH;v(MQlˣ?vHpn ѱ;4tQ"R k=?Ջ %(28~Q"u[&6j o{==:5o؏7׼$YDTJZ$4/hjo/a {R+IAdQkv#1TKq vQ)LRl C*wy&4ޛg/#;9Cߑ})q~?O$I*+a iQ8tBIJS?LcͿ ُ `[_ >'߷TC+?z1qB@^b:`yAt"1 d|qxZqDE1NdUJvc$Y,2ں&NbڶK$ynDzC8W?ϟ?-O=`Z)M] Zcxq~άZyv~1՚>8,kxB,-]߳l6bpwRJh-y("M"b3 a{U÷X矣u ^ze8ft 'MsU%h=itk(Hӌ|~s)EF+؉8ObVDFwO`"8{K@!>p}})e1 =v$P0H0 q)<~~wmΡVUNNOe99/0 @(xQQ$0pkT0 a'ùu@%qL<+L)h?/e'f=77|N[$- -~LD>E*;Ϡ[ˎwmq4O@iwJvR<"u,q*Ҡb!D2Ɋ0B`O>b`f"2o_JӣoIez,;1GNL2IURklXC~7J[@RI,9;NDRFK(ntl 鞸w!#_Q-+#ZG0#8U)}-4kJR&,l^_iHXPjza z#߃z:-VZkتI"x4t]|1nvDQt:((o L$xMo=^i4yN;Mo팹MБt +5y3Lv# @Fc$!tV6UU LK4c<4퀄8h9}J@D=+ZA"ӏd)lsG9qrxx@TDɈ^IryUXfY On꺡;,6-noag#r( R=3TW l$A>CsSrS`&ǘT%4Erh+:Q-,&*Nށ6V0A<N=!L6Xq u1_=xތQn:L'ISW5m/$E !bƳ9uUіV-{\舗/qppHU+$Řɲ+WdiJ4Mz"dCO?GkI8(v;Z{O$dyN4[fS-M[4O EL(?Ket^x4;T[cH i;:`m~#ޓDjОt=Mے#,Z(ZhE k]J/Eapp7:&Dme\b[ @f@n9뺎{ah+k97\(w.c><_ IDAT>xn]E,@+^ҷБP4 #_ft=x=Nh=AVX}1Vcxu8p ʰ=8읊<`qLߑ`%TPy>^#Q*~  N=g;qis?BSN ?YB|JRwPx$ # ٫'r# ͥT(Q%B JۿTW;^ JJ=FndF״ l6Gif8DPz,K0_ -@UnVe7X~ؗE;=x4 6E!-(MJbtYUDQ0IxXFdns,ω,y9GG $<:Zp Lߛ5'wT%/|N&4} :֮'IS6GG4}GQ6Д;..Pα-*8Ö-g &I2:x=mιQPk:Ҙ]ZR DE5=8q|<8Iq6/pE`B>5jJ]^S= mU0v Y$)n{r%6tJ$,TUCF(zuF Rg]IQՄqٹ4'cZxM+T$;#M%i&Z1dXpdxӌIkvEE@?C6,˘)ImYgQމ=mYlJe(M-A״ZA4RZ'譣< 4W&V}סe[\( {F?qCE{4(⺹PZKqMɼ~SmϤeT޷]_}- NX݅h-D2)Op})лVOxBZ.94=b֒} O`z*z[03L-JJwWWKj 9+xϤI)WR\FhF]ZW3y9e)ZҐsHgAYbhX b{ߑVvPr,DQ BW:}dskĥl_c^ӫe* cBxm;~,yx|+ @P`@ 3#]/e?f8L&({GtXk9>=e67;nm2Q3MŭvR^e)E?Z{s=*5PR{)Nul9b2e^)Oz֛-I3LH҄}iψW8>sC?k*LF#ʺm[4%Ͳ~(Z,&:EIviFTpzd cf֢1fhNY=h=ZA$fY+Qa} Š5J"v+ A ၺv3z{k]ݯS.8lWloG[]]]})0± LVp0P;i`  l`R8ٱY&$ҤZt =AQ5l=)n"&cw}><ʝdTęi7(;Jd} ܌o \敜mϿ 9iдDե4]]낇⩤j+-M/ G[Jӱ@sPP<➑# ]!zKЏ){"._@P33ˏ[P+ށ O@֏AO!: \!Lէ@ݢɐb@PNPi8 !\kP[+ Fk_sX@0X^""k[U;`.]J"0RQBY?YL{,vWVR͆ibo#3ߛqh%Li{KjbKeX)Q󞳳3e9 c).צZîmj hZ)zD衸qRodýn<: ϿO_иy]{j@TAkfzX 3vݮ;[+،``(82-!잋P:ó@#RLW?e::A'RfaL4XIoV i{ y]IB\ LOD'dg[x])˕Љυ3y['4.)?bpڼh;xcІԦ0;r$䳓ݕWE5`A0h.`$ԣ8c[Sl燒=TtL~ qNε(AUvU}yKrL8AF@3TUO_Aj?R(BϦSbGߵT`k%< !O ,'v7o)}nljQ8JIװ}0)g{ʲXOgucRݮclߐ>6O>ݻ7ko?wy|%G\\\ͷWXјz 0lf A3ߛsQmn ZnےQC|B t&MO82Mxu ψ1MonIMhAA_}on0m&R,j:P4FkFۭrau6M{dA0k^O5(V44 CfEՂICBb ٜ)jޑKh;(9hryweV0ٟ%1Qӧ4y&舔8MyjWlFgF1Պ(!Ibz'i+$oA61M  NE&C|)mo]Oᇜ1ZGmOߋ[(vb;K'$Xl6[h;]?^r|Q 4u҃(qPXiۯ4)N_C5Zb W)8%3&'4 ZP &4O;[oWs!vݮ%x" aGuq1z/ac@4?D|)1<3]kzރw KBJIl^DмWɞa" GW^B*NE0=-v)S7L(^F"uB8 %S,T\?V%ǽDO#CW< +N%'|#їބL%P0gOL" ]Sz& E7eJV<WBx(M]'m9f)ײHxq!|ȎD(Rfp GC`&>j074]`+FD=ФzDQ*EB0/h(U 4}uq|,-S7)Ή#9G`m[SW}M6%/<=`oj" #~l 0|'t% JmY|jEu m1N  5Qbtz{x# YEAP;g`a9u"cʺfYTXmm7ӌcL Nfb  !Ib0N)v[XadA t1pGmf[`{9. }\֫5)vE! [?B_IHe[h0 X<`<+f=679h4M躖ix 6<uޜvG`L8g\Qy]GQkS|3?8 ^(ʒlz&(&`e87L#q4#VKF/ bxBl:j[:簀S~h=kq!.d [KQ`8mOUU4Mv')f7"Ai*uHuik{аە3\F'<)5* P hEGQHhJ_V C%N&H`ۃu{GhmpBYaaE!ab<nYoRvݮoz4Ѿ8B-?N ׁ JC$lDbV+O)!_?ͅlgvOhYطP|;@˭4JV9=A7^ m 3|"S|x l>/OM41۵h,Z {!zұlAmJu!fPW1ZqP|$ sIt7nYɐ?8x 7&AKL._AoMF8g2{hִMOY$~M3СP!{zьzzqk&nx/ZgeYvB6MY0IF8 Q8 'Ole,~sMQuqȳ#!}q56o?{GG\n7i0iږKLpzzJ,%#> z\ٔX @AP/{ضeq~Nl9GG슒iHҔvdowc<1J,  Kv4mъkIzMlkݻG$v;v-H@~q([A: [Pwdܮun?rX)RFDv /P&/>i}dLއ"2X~}qjڭneYs'/EkA1:NB&E0e[] `=9wkۈ/`~+I}ᬸ79+NZsqn By\4a13q2ZSЋ\=4*p*A_KSP9[z&ZrjYRs~~NdiBQTUC:@&sʦgX2TmOkeg em[me>DUYPgD!A5w4u|6e+)?O>#B,% ئ͎C,ǩ+0R;%͜F&(=V2Ym60"NS.KܽǷ]qNf7NP(9v# X(Dh0V:17z$(s4[Vbqܵ=YbIr=\ 8U!C 0 qIKZ奙֡# * &DݯCۮkF$hͺ]v, 0>7ݞ={ w\B ZRB8q+`Oasu˧#i&-M-TC !Y IDATk h%LhU'R&'Oa} J1ڇ2 h%vHRK5*ؿ ?TP4Z-!}I6.BK] Ò\r&ATG%TwE'wv7rM6?MiAi'Iwwރ~_ W# 8@Xls*oʶ!$MZ)$+GCoa'o2꺢(#HdHD5"("s `:E~4RNCZ)0*d(hwmCDkE,PhX Q}eӶRmk1ȁތX6qHQV$qG0޹#j'Os>Ϟ?ꚣcA#9;?zV)ɲC.Y-̘uI]7eeZW?gflzFT]OG)Wyj:d yh'O`mG`(`[hI8NpΑ&4( ҄qbLNSDQњ$ni,6uMh4{A(-JEoX-fDaH׶-)|uν<{4R%I,"^ ZB] /?o<v)$srax<, lքQ'Pvހ\8IǢRg_}w=m׋r0? aҴ-E&SZh;"c&bf:nv=Fj~Ɛr?7Z 0:mA FGQ=i3e8'ׯeш((}c`Q`F6 nUJi^hfhNk +šSơBБ/]C[t7gwn]ӥO@?}W4Ү;|3H<ɏE})ETJ6 ]P=CA;WR_|ޅQ;+8x(+p`r$s\ y!(mڈiH5du8=4"|.E6]$Y Wd>x/%Pn;5 e_t}+%C+Mޅ͹|MFP~Kg+h.9 6B2Ͻ*}) ZM k~ %Lѽ>M 4ds2`h׵x mU]SV뮆k{ȶm6$i|F4t}/ҽpLk  ? Cں0sAj%MIl_ku]?0HӔ(v靓!%N3<|nGfa@,WkhϿxL(+]ha1Ϟ?gŘ dۖ WHҔL&".ޕ'LGa2&",=DŽ ʦdFUog޸4k[`趩bRG48фAwW/[㈮'%kY%ڈ#U${Oۊ]eh,t;K^ & (HOJam{X,d;٠xΞgRf_}2XʈFB-ǝwϠ=+q gqþ&9J0鑸Fn@nޔm$(F i78:D }tW?nsOŗp4!\o#p4Iߑh8J"|ɶ==ߓ/:V0v!} ~ &Rmr<RJ1LhV\kꊪ888jj$:a$qL[4U%E2v!{u'Bsd% z%i 'EbqF~b bE{&<ϨnJQ%w='u'~.lXO%4% CP8 }=1q)xD]߳4 OLZo WUG÷`~S.:O'}745L0Zucr oG1i*]+wfTa:4ECcgɳ-HU$I*[/xĺzxM5sԥqں&2b{zzJהuA5Su!Q\ج׼(RZ_c ͆)z8 //]9Fy}s~v6Li*1MF=`ܶ J grtxb I" Xg)hFaӚv˽{ǔUMtJeXkю /sQaHZvuu,͉jM۵t'Rn*%ڈVm}M}rR5qquy%(*ˬ햪,QJQw%r X mSSV%Jɰ#d6ĥ|!I,lr @3Z%~\98m[Pm]cN 5ކhMvݮ_Ϻn0ۙo.%j!ABЄFw-R@ڀ :; 74 XbEk%?c qв> IkiF]||_YM(E{_ɱ\ڥo\ &OV1oZK3 o><>&лw3^C6f3H1\ܢ9w;vh':؝vOd[b@=^_F0?cЁώEۡCAfXБxOq2fs W"_M7FP!4jkѠ0~6ځ Jf 㘪*o2.8&#Fq<(`Xmּ|dd:EC4P\.ȲLxCE!mPM΋¢$V=nC]Lc6-Q0y|4÷Oǟa4JRܽwi8MFced6,l̦hLѶg:/8{8Kۖ0)bǶ~~ɔgg(0Θ'U=Гzڮ#2!04' Z9.zǷAe)q1ϙL&uMUU#imru`8o缧m[8npҜ(mŎd( .^<:/.)f֚!I˫+t];HNN3..YmK:/wy<{I(P=>WjNLFOOIl6C9g\x0ak6ֲX,Ơ7>9ۖUYQ5* ɡc%QHw Q0%R?|,8ŮX,dy>XAoNeY ^xd2:GQ$ H}#OӔiج4Uzym$xO4ԍ8y/hF)}k8iV7. Ri<eBф4 P/:ރ6h &}n@JT\;sn]Z3)O߄נ3iELgsHODrh0},4%Q2]]uFЮ<0{ W$<C{)S}Bؕ;D$:٧au4Fd_ccHrѣLP:~4n NuH.G&o?imkz[=Ԯԩ3ܹvv7v,'qP(_ C$$>W@D)|!!8j"LHd뜚׼óNM8>ttԩZ{vzNM!>㉎f 0bv%7Bx, M!fZ>Ͽ OnU]AmKExx<&"5FBۚwjn^zo>1bg(:|ߗrFq5 q8&Mj[qA97dMNB4z"bgsʪAylw?y%q q?!p=\G뒶8s(W_єu`8X-qCn?ỳ1(jMHZ\]=|vw(BN4]dA@5#Fw7lV+ƃ!U#:G!(\BVkn!l0jB\rC0!;,"ggk,tJAԌC `8̨c4UQPly۞PU5LtB/Thk05(i;Ml+0a\r\IA"Xl?շQLk&=<X.,Vk[[ܽs,AU ۖm o '`A1 !UU[Hh( È$N GH]Eh늦/P&8 3A 8Jtx7Fa~?Ry}P^ -8 yW>'8|Y폿|"/Ots%\ofb4![!MU\6Q,nM\]O UgLR)d?*=yf-=Cim\l+{u'u_1]% zg 0׫p>>{o~Oek mJ @_J򯃷S8y]'ʟɯ=ku*`bv-׭\A+0=H;\l m`5t}3o$\BVh% |.Գl,A@-XF{ =NM%bp 5dvs}h?swnnWBeкx<#};ӮC)pH׶)˒hjmKۖ7tJrM€7#-I"{NuLhiV(q]Ei.K EUәt0l5mQ5,Y}=F- @.a{̗+ G#8s=x~|s q d#rLwi;qs=fX')>3n߹:Vk4E.Z }/0.Az>5/h1-a%!ѾK76ڛKOB<@&Ͻ]MtFkCEt]G۴l$ׁ|Wn3J"K9eq c>x@FlO&M1CܻwOK:\>|}ʦ# ʲd MU)751ڡs$" 2TkG|@ImCY@&sVJW&':k)z`@^cb6_bTsQ2L@2C\84ٜzz$qrauY_5IArk6DQr䞪@ s=M㺲Ԛ,(rʏմU %ZƘq_Yκ1|blGYdI)r-@!΂ \hVuj"JV*l 0otV>xٓ`ko_Wc^km(:꓿U璉_JÎL^ Az wĂ5`|E+<4I?޲mWmOw]_oB@B62Bi+1A@70|YOGKd"lJI98eW%b-!h0<`W{~\uE_A#Bl\bl 9N D?#tV (sEߒgPݒ#t1ge;Qr.NZ^v;O Hy9}^d)n<9pHl6("MS' 2^~tynlԈ 5pxY!l>ր :(W E-bbն%,nj>nWTu|fO>b9`#~ nZ֛+Fbݽ]ʢ /K1͆|Aj\u\__^t~yhkB XGQ5ࠔC'XcXX0duB0dZe孵!}ð%;==Ny>y^POhݦIJUtdr$qƒH0Ry%Q@,a@Y-NDB;~۷7N7epzzADE>WWb,`ѭ[U1MɳKGk‡OY44M֖:&1kH1uۑbP5-;;]KY&>#d(z& h-& [!]MY~kqzߪOQC<bt'O98<ӆj;v$+& u=)m <c-A`l7tot4/hlrOvq1^ =*wl:wb[n^2ω a%,f״uٯJX:.A7Hpp( UYTo^l^E^rAO&Z 2d=]ֿK^}-ByP8*w"i94 HBZ_Ȕ|Kue"?ճ>k" ~}8 &HW8:V>?y/{օ4˺)~(a pyVmw}9ߝ`o mٸ8r=L͍`s)vKJv #5kX[H&RPSyl[E MD%[!|i sB-[rX}yYhOo;JZ|,h4#qzq͔V¶OD?Ո߅\'\+?P}WQp=^DmےeJ8sr%]ׁLg3!4˰F\-Y.u$q,nOq*u!X.c8,Q,Z $b\עbyJp8eQ%-p\|d3z ../iچm:cCq[ G#(k[yỴ3.?]C[ oMĂЍL䏎XmrC0%q>ˆ C65Iz./B\r{φ΂%x~S%Q{>ժGDQDeLSV׉ֆx|֡($[)w]͚0p@X:a6x H!ME Urㄋ+EQ6$q:l;~O?~mۡj6M]y.(?c\Gv&[,s1p8 G}9Ѥـijvhͻ|Q\ IDAT4 Պgg= xYN@;吗%q6Xm}>Osmqdkkb8A!3%j;9I54aDQ`յEo8a֚Nw(80dm کh 0[0!b0ٲi 1QaA$ϏUvl%-ϥ./aōx G#xBFPcl#s>/H<gBb۬DcX }+au-azKuI*hچp+0hg.vk96%@Z 쑀t"n\ɁX*! jBӂ? -dG04?w{.O$T 1=b :f&dR-E$XWIZ˛Bbc۬?WoC` ZxG442 <ϣ, FP5,cwwS=aoo} FZbZ}S~ AyP.H{aDY68 Н,s,4 ;MiRB2u8xJY\Uf6_`7@ICߴroW5咦n Nt2L4.|yGhXM6 шqK4XXjmwp$irbkk&(C9=b:1$AwsZ')S5Bi9aoC +ضXed(:\?*O4uI1i۶wR@a^]K۴Nݾ`C)ܰQ.F8m]Q>-Ai-- R 06XĎuFt`mKxe4~tb') [m$^Nq""oyY/eﭼz?B p-щ4kmipkꟄFkaQ<&@yc3h7-8! Me 'u;أvOpMa67\hCگ?Os߃ɱg5%dw@|[aĹ |,zO꾖siր;{pU.嚵iD(PT"Z۟O+,A6m{0힀A(g_nG@ `TJ1,N9@>^ =lakZGBjA>Z@X5$YJYWk0UxVexݙ9Y' ,'O:cฌ&>f<*ENE8Jyk\A#X@]W}mmsD6l+~bn("usEGuN5E^:h( ($e^Q9A~!r]\h̦YqRڂQڰ\,qQ1Q$2afxAn+wo XNXk:g3 |7?Yt"/e5;U1')|N^VQ,ᑾí[4mGUU1??&Y Hӌδ(} DhyY NYM1{{ciۆmƐ˼ B\cJoh XMqxan=HxvA@ cp(W !Aʣ;O9ݚnuGhZkXv\qBZ]^/ږެN\uEv+y" `_#yC<{,b/488~^zY( dnC πPXMhB<r n)P /$pymΏb!ig@ ' Mdci\Dte:?'D  3IΆpmcu ?a#ָ''&A'[ F_\K幬O&uDouP{~,zE _R q=b@p.${Krm$V2.ʹٶL^`Yj\ע'93PlnYVe)PGdrض8eIJegg( !a'y {$Q)J)֫˒(hm-֌c|CK%GI3NZ#WJOfXbAETUJg, )1d Cjj;=j73b61FxZbCEek$:(<'B4%VRCQ7B2lh4Ji K$il6%d<;9A@4 +>g4ˈ?NpFtU+o1(R]Gd"s/dzzbtvjh4n*)7+,WWYnI""i (kN]K|_*OP?sB׿ֵ1߹y믂> -T'"V4ۯ狙Шp n 01|M:0Ur~ʅp bwr!L`("uWŊ6{?!a`\ǮE4H@I| `}_ Vq*ۆׂ 5x;haѷX Ft6-+{B3Zm5sCur#KYou 2VI.QIp\o]k b]7]m6 eY2%6U0 yb>{븺leAu*|{J9O$G l6U(lc`S]CuDa_ռUtfmK@&Gnq|6:}ʣG)o}y^WǷoÇY0\ŏB8m4rHk;\||_12Økf-Ja% ִcy7\%mbze]3ѝ}Ik{Xs8`k=iZ,B6yDXzeqk(Waa]1>Ҋs=Wu-L%ߖ{>WI?Bat:e?O<~'O_W9׸w^o-GI<OeJg g(ײE71 [0a>~`:B1?Jlo5yB(iٝ2!:rѩTc|@㻾I ^pd#'. |~3l$kphrNKImv=c q%q0mt:%R>`U2w]l&/&"&;43bZÐxGDilNۊ^o!X,˒(iz yW8~( C39QGq~qR.uN Y6}8!"#,A)EkE%KSiރ^l\n GuK:b>jzM1mk.xbLZ+E~Ws( i]ױs$\\^uyP׿ !l0iwʓ'OhVF(E/֯ufTUE-Imbg ȏj Z85.o(bq}FP~blp@^zZda(VJ]t-[8%4mCX`^㹮vhjP.aC(i[DE0&$G« U(M'iVI;i1PW5E8`hD n5VTS[]_O?$)?cѝܹ{}klſ/u/k5++a ci7iv"F(Jܭ> p$~,%P;4gd3仮4ʕ?mjSh [lLo:SAOj@G5f^wCQo֛(B{Z-5^7=řWIk\Z텱"~{Rp 9?$."x3>9b)"MW=LyCC [*rBX?оLܿ5DX ':mO 2n,۶ŕ&y]lpu6 eYq]Z.Y KQJr.Fx?~gD}Ӻ٬1Fxغ+mqb5tG]Mf;\\^q}}<{άߤ8JsR!#9~Y5録(q] I"qêVxJq8_\]^`e:o)J"q9>CvӄI"IMNQ\mje 0qh8`ހ5N\ܫAf\i1B{QJJ71!KDQ%5ufÀ`6'_f$Y&%VJazWE~@YVBn>MVӱ;D W3h:t6'dܽwg8y#0ڠf27m DVi,ԮB>{zSp}:m888@zA>V^{5<ren)ՠF0zKx_K.zkՕ85Sk` @Eo"-4F(FC踞uovd~"){]H0D?̻k7C/,mWKiX<֭k0:%VD'}NEĪv~!WP"ݒmEW l/^ͥǰ+/J/eCd:۔d$U͇\ESy]}ʇ}[Nխ^$~,.;ފwͧ$ 2VI0 n6/B V5u]Pn|C1 \c>X#kdkP%Q$F#ԏl6 y)֌cSߺG}̃G'ܺǻ˷>,y7c޻ı8L5MC\cuK^p|k7^7y!m,Q$v`"q}r鴥sp,FVe#rf5Ƒ$v'EGao;Y.\lF5aTUκ4M$-B"BYJl^8?aX//"iaZu) ~*} k4qC60 Ð"/Ȳk-ySU6iJ^edwЪc{8yQǣǏnRO>qD-ɖֽT4lo) {{{I K0Fs1e`q Gtw8<:Sba4# <4qB(wj(4^&qg4ijME CpE(- $;b0h cAHɋ4M{!.[P Q шd^Qжٔn從VX\& múl(ZɳSf rvvNJ罛y(RUzYVKʢ MbY&u\:r(Ƹ@6ՊZ[l1Xw /wS s@Yxr!-ڿSO|gzY$R*ۄpy89x+# >l쟣we¿9`$`A%ִDz-'0{ V{]6wقl"^}N6/ G9J^CDn- ywaE]Pra,.dSpz׵< ږfʶtrl-^ nW Ǜ>5|K)WagdSVrC~9 ^ca^+yz)w,Y IDAT'|Eܮky](_XF7~ۅk{h4bgg}( 0bڋ=7dݻ(uN[5̦30mjMOO}ߧkNrY̮_ /Жk$a!Ah{Qjn;(Iv}''Y*8be DcUC;o8d2gױZn}CQq2]G[ =rq۝` iqVaM:E.QLU8@{Dxs/8AkMYӧjwlooOpQ Urt m-,W >qvqzd\yeY08<<Ⓖ(ݵ+B_>ۻ8c\!܀$I1ơ )ʜ0 À4MylA]t% % "Bf#*:HvFoyǧ~kzG0muVWaX2_.ZM5̗sNcq\ m[~xuqx88(J}/ c.[\ ahR5% ipڦz8uKٴxqqVSt F1eY 咶m{xY/Eydo|olo-1ܟ ?%߿?}Y_-Fh>-MI\[&P\˄ Hwh*9V L `􎀐v.6$x?'CwW`*st"nTQ,Is_BݓGw).M`Ȇf=/+H0|VO{ Y%ePJj!ۍB5qCUsUN_^-UhTߴFrT7".0s*9t5l[[z O ;JuP '0 jNʆDo8KUUETU ў5MiF1]q~~pi0 %U4MKQmZcXؐDQ2]u1GՍx6}|5556yOpɟ~Yu]ӵŒ6e9^2XGܞ1OcIӌǏw>fqͳgxC@154MY ?Ly9M.Tl8! C"kG@ԌIő\Ϯ. 6}J\հB& )'G,#߬Y(Y1e5Y%1"_Gq/6wph=Wr%MBnwwv 5MNe CMU!|K "!pxAh8$tO|LY7\ϦloiO-h:dkmy!if!KSSQW9su}-V0d{!eY18:EY8ʣ\B^mVlum ^6,KL %E{ڠgKkrHCƓm(+4O`{j|*Fkbr0""1>F Acz&dYƦȋrI$84ZKhʫ~͆k&$$c8Q%XpYEmHyưG[mCt和$@ hB aZf9;_Λ_MͿ}ߣ( ʲSx 4E׵C—KQh-cTe! [ܞ=;nl6[ƣuH,b y!M2M%24 +; `pxx@ۑ$1łxq&mi*d$JACB=GQ.sw[(d6 'O %{ax4F'ܺscȄ5ILVbf,Cg[\ m+n"8Ѫ#s4a6g4sqqeYȋml}Hyc;vJ8x>暪B]w]^}ƶhHL|NMGTضj;vtmC۶8Պ.ƍ8^r:O@?clGLij3ш,(kaub̢jڶz`!M۲\.Is13}\8u]_㧾Fogn92A(DdC O$!;9 祰"H#H>H(,Ia_\w l(ȍH}1[OgwEwC'e| ;U,TpxGrp<kRW4\wHX2IPJxG ǰ8/ҨN˴ed0z[x V&? ߒBD݅O?KR fU0y[a3.IYLPR{iIt߆Vb}Ȅ܀n xN>g>Ȳ% nG.$g-K! Cy 1Mӈt(25ј°{bZ )8R32 0y^>%TMK^u(c}ʢ<ϙl;S?ηPFdejC8o!뱋9Ucg]ZI \8>9Z$Yw$ixeܽ /hIq>F׋TJkI ZoV(mk|סd\"MTܺy |z,ˡi*\e98\?`:Q?ZEEcښc(˖)m '~ZTT/!XGeY,خ'$g!J$f6J)|q]%xG8$ 0r\a_J圔 <<7}/绝Au +Hg|?Bu*yC/AϠ['?ڢ 44e,єe(["Rhh-fMu,<6 c1EՐ%X]cA4Gx~>Y.2Oې u].u]ĩ4:@t];DiV؛SUW$ fzX@ng;HP*r8$3짍y RX+e/B2'TY nRdr=Y2ҌfֆzCY5шvi.$=f2wE| E.T ܲl9EYoIǼwW5Ϟ=s`:/XwA[79==Qd$ rmڬdK^7\mvtB;z(/xOGԴMCtE=PJa@viێˊPQje,b۲| WW̦S8OfI~ۖ0&dqlo1BhIjjFCYdY&{ a(Ea2 YgmSCoiJ%^ lci) ei>Z)fHmovaXsGʫz^/n) oB&] y"EHNyn+/RM (-j&r#r"YJZiP>FV{xFd]ߑ^c1WO?{ j u1eWd_ »W`U*H0@3!^Y8}Wp l/)b' eIwS5qߒF`rEOnH.d̠UF2-&p 9,daJ>˾{E4=O {a6=/x}n|Oo,0UeQP:rV@B=tewU-zvtX!hu͚(r1]m~@׉ X?%K,#|nܼŝwxzr£G˫yo!t;_ ?ʒ,Zbu2-CQĻNRUٌd|9~zb>eyuvpq"F؎ ʰu+f8h2(+-.( iEJWYdK([ȳxq"* Rt6bW" |XIӌL/dMejxR^"mOme[Yh<*VUIJmОK1 "#]T/F]וAF8~l)0릢jZBvaqpnuFE,/.X\'>)iJzSUS1ҜHc=;k89yFl(놽9,ը"mqMbp5ήiLm;~JVJnpmivdbkRf[9mדeЄ{äe+e|hBYWDa5izm@$'슶軎 l6 'SIJ){ߵ-m XY84(J؛MUj`tؒLes\B"z{`iq|SA@qkHRl[4'%z^/{1-a~GR8V r{Ȑj-PթxW])n%Xsi@Zf jVPBÁ Hu?LU.`~֏Ev53I>:HlNErTL>ʝ4%ʓ D}H TSRdMq-dҤ˰<ƪ-rĨ\O`}8 PЧ"^"pn3g|fJ]@ISޑf'[rߗs:zG2؞F)^#<m@F^O L>M eYc ui^DaSeY(BQZ4`w w8Q帮K$jˎcr\CeA neQydm,JGIm+P|mfG9yzr(m|C}gU+S4m/6J eqTʢm{-0ӌ'iiێ0陀r9vS^m!eQP9I4-I)4%mv1W5Af 1eQؗ\6u|"Dz4m0`˒vO|L #+}KSw4D8k%D*i4o꾣k%U"* e2TCɗg׾\/s}/\Ȍ Ccv_A~>x+ߺYɎ=43O ҏ0U_B7`4"xt_<7ۀ d9^1W 襱(x 2r cxչȄ \<Ub ,m5ıbЦbe^;bt_٫a6d5ilr V2=!弢W! S9_!7$K;Q*.ەɓ=-̯ó@ ޕ*߮L@C@|um$&öVt]ETUCQF+QC!fKmcw䅔C5m'0ٍ8XF:6h|'Mz'1<ĀN"i*Ų]-+ vv`>ڲq=mTlV]9uUz>ј'p0Z&iӵܕ(Kz<}zh4+nvw~jn;Zb3 q! |lJ&\,bteƈ:bZo6-žRhcSÄ*sڦBwmcټhF,Jiui;j]NEhc>z`R4Ud4B=I~;M6bo6c4 vmCoH{(P!]:(AkEiJ]4uM=δ]C5a[c65K|% |<}Tz^o~;x{%;D U.GKZ_}]VcDaFp_dWu)#}=G#BuM Dv&tӾ@oAhͩ49O-, ۆ÷E>;Cx[;Sck g9+44"=S$ʠ8恼@%= =׆_1pg$yL. @/V C!O~J$p0 *VBnj9G/)wC~4 b9Y P\ 5v_K9tԞcf 0U$HAW=nQ4ij<<ϗ$%&}K% Ѱ JM1inh0Zm9ע q H;*me_/Ȋm[ QF ƣG҄kZ4B*Q1R7 |1e1YmvDRo,˙L)KYHdGuC6d$"W+FPR mYb 0ڰneE$)Gנﰌ!Ib a8YP%] ?8]͆29;;7o˱F#` M[X7s.oq 1S?FEc$Bs,LBڮ쒦-ԴⒶzgk p_ږ]+.ijꪢ.K,gS1EAQCeшhBYu|oh<,|DOaٵ a' %U]qtxl:e\ umUlh1c eSU] oñ-;b:`[IQZâ-'wPx2}er\Km0`Ki dW@ U tR|xR+*xA.ˎHaJ+Q}]O-Xwߑև])nT&,R51JHўM.&rw,EzwH DUmB[)o <4>/qB$k$J)lx$ȥL2J+ZDӱ=\d{"yJ`zv(M~ s6"o>:$Wr~]/18"ki=lO<sa7H;-}'7] J̔HOuR")*Z\yѡ(RvBD;$ձDnTE iĬj\Ws6aY wЉL[Zy[( Ow⪒,x}~) g<۬VkN>!/Jnߺzf:LZ#MR8G&"U3뒾0GUWe ,B ,eYԦa67 cm,$wy`WlJl6C! HY"S;9yJ3 ||? Ia:t]ó5Pn6V\~$I(0_{9EUq&MSD#+V֞-39gIL&T-]}?~̽W#<֭Te $!sT@yQưll(Y@Wͦ)}1\շ^;޻B_[o}H ts\zmЖa4 m'&l:B܎w[f=x'1oIJS C1=PFsuSS%J kS׍Lӆx`5]L&ciGe-F}'_C߀`ezERTeA*d?51GW+ V8|a}OV%CF-Xiږkl<4bI2Ux;suu87 4%yQ5{{ 2*w˺i0F\#eA@v;'3 ri u[<ϓKz`)'''U XBywOOgc6+f=6$d11nV(BV%Ifyگl;_}oo7~k_y7+ed>qq2K;hPEuryuo4%qQvC"}QɄzz3gEÛoN50f!씫+ܹ4yE#BcSnˁ{6з MQ؎M$F" CcYlFye Xurb@{ɩ<k O 3]!b =$KE"wE] VMGPr Աsy=SI+\/a}nQW9y7"S<űyݐ6 nK]7t0'DO:6]۠_ NdFkB+\;.єuMtCِ~1p]Vݎhe,V劦8ֺ k 7w-v$.s4|6`1'=<0ˆ9{qy]ofe4Ngll]eS<~iz8.M%^QVW}G]Gۊ8;{"Zqʲ`^1ml,x(E# S:W#iS[pznܸAvD;M(:*2t1<4Mq\(wؙVJ1LіM\m8?9^s.뒶hDZjyTM:d2?do`e'|LQܹ},ٽH^^b@,eEݴhcQV5MuۑU-%-E|cbk;Y~eyuoGm_m];w,Tӷ5UU,PuYk׮JB[Z$6$ c3NHEh@SUMM4Bv\GCZ}m]:7=rz ֻa0L8vi&>ST ( 벋xPʦBSפi?FLgteJuqq쒘m,~)+l ے(z#q͛ }~+eIgz^Oߪ W<X=_$n5n0M7Bn)MGCGRn%%&^bxy_\~_zhcuMC:ؖk[n#86gp]q]zE۲Yhj1aCKdmԵ4}M]& Q;4dYiZ%=t@)EU7D|y)defb1 fqpboOlzi3hc2c6=:P4=m#x Qc^u%m+dHzz$I)GxzrBہm8"+V33W ]˓G̦vkq~vۯ?`|8k?.OOle-bmi57d8657_ǶM!~d2!3mk욊J şQ="RU`ЃQaY6MӢ˒ $vXUM|:zFkݎxL$uCݴ(`2 C)^`}zKY,Wki2/xg?Ҩ㿆0&Ed=O`/|'] #fϋ귡 |zNv'C>z"M(L=s!HlX6S1A߁RD΃F0}49b$tK.}(?ʓ=Gr ˓#N2( 70]@"WǰNeߋ G;"Av /R}OHE,Pߒ4 KAx]JMe>ᚄw(cٕ\+r &_!! } t7LCr:"P/q10>h 5aY<^kQϱ䲋{T Dz)"Mwwhz,^DS{Ե$٨)*a>uML&*IS0DQHtE<7ʊ1UO>FTyQ`i\{DTwXZaTl2(qmʌ.)ׯK"|d"Ō|Dx2%I3$Ʋ4nbɲ pa@v'ނYeGn$M Z˵5KV mW>9lX.(PHmKx+`ŋ I* Bjh2eZ- -!9Y7Ht];D ("2,l6udQr8~D|1mɴ+"_YFQe) %Φ6j݉?mYPdve4 X$i(6 Aկ} WK{v]M4ysoݏkY/Y%_/?sKt_ xM~=0/p)+ށ3+=PzqoT lFX$[DTNҩ+k5oIR)KH@05_.z > ?'=)PHwE*@w(2m%y>G)U]\ISgF |` 6IBI3G$uܙ-[V :!L& ]HY~_gٙbsC}5}(E놨/q~؍Wk_B FѾDB#N\~#zCt յ5][aY-C[:|Ɠ#IgquGcL%͖hqٵ;t":^ˆy ?s7\a`,P"XMCҶ-` YF$IGEU㠇kOaiM]FmQB- @x_!^"۶u`L3!nsוXUݎ;w q>4ˈ!ISV1=H|>Gkޔ$IÏ0:6gWWpv7F |?[~,~AuƗog$ neK: W)+njo\l?5W(;$&CR0 fFiB\+9?`7!Sibʇbx,#?|NKeu;d"1J& 9}#t׶蕆2 IDAT,tzHt1ΤHVb]guR@K'rӊW(>6ڦzi-yZ5W3r6)R[vA'$ uA M#F<[d(%y3=<OCYIQ"eKT3]j}O˂fmLeyAK::txm]z.XPlt-,CY7j$F mu-z;Iũhۖd0($w0e+J(ij=Jq$ dW˕D+}XZR"7k1ozqQU5,U:mbV{ZIz0XDV~y.n/]3V, Dφd0$r@Qcڎ̉P)t2K!| + ij޽C^<~X^Z6ڭyd:% |3L;4mMS!/=3 , VE1)6u@Ӷ8wjIjҕ4YQ1(c[xh՜Fm|@)t Z<9dY0I@ҡA>vCU!'ORŵ#=Nzٽ,k\eʲ$n22x?n_4z?-{ß"ދOP>X?otWꃻQd")W0ޓl!~N_f`)x`_f &DtlZnWrdpπ*Ȃ\vHOMb\G#Fn[]a\@R7yM_J404z$z:YWJ [NVޓ]X>0<Sy`;p~g>#Q?3Z@qc.䗠 |(@?SlE Vo-% ?DBmmHgRglyz?Pb4Z` K4͝hqjRD^ mm;,[CXc"QoE!J٬ mۢ,My[۳8JVG5{.uc"' |躖v1CVL͊Δ"i;;r0f+M8.Ʋ(E4؎+i;^:b;7oRUE߃!E6M^ġ0D߫~{[6[xyw$<yF$Rd8q_[Ct-, 6hcprlNq$m ,8=;zM6M1FmeEN1aBUw-EKBx47[%|hq=.f\\\'1n"M3i% pMQ>z—JP٬1beAL΀m\/b2uXtj1gg6Uu}QP.qȲhꚪ,ɋ%jU%hrRU%4e8_c[)nYsƀӳs%/>s2ʦٙ8~78<{QWǧ<L48/BaYx V) t$5>!0 ]Pzװ{0{]2$cʇ'a;fka7 .N6ME.QS!Օ &Yϲ_Iw OZ rNZL$K%\ /Y6} SZ6ScY7ӳ'P !|Ny8;Zuqq%Dv"" >:d_Yb 3I Gl_ou}} Ú~hl FLo6r\,NwxvJpc]I{>18m+c JmӶkn.mSUoXhӢbꪦi ʡ(>oߑN:ӲmEV8.gҀGJ +8`4$S4x>¸[1Msc, 뚦Z-ӸFW5eQ bWeYye4xUd Ð<cbg6mZ\G>ި-IQ^oޮ%37d0PVUo.$"E!&\_1qLӊhH:XFQUqt\^^:miK)6-6R%iVUUvDP ^U㇞0_Eid@<=9%b% łG'F)MQU%i^7{ꫯrtp5v/=k{uh4&ijm ].R$h# 9qSUA#Ӕ{(J6Ei򲒒mg 9i2"\1a\iEWKT)WD a%BC]xlwi{~[ßyO3, 8Ӽ>>-(:o;ȇ t8w]{k0TBx[ (&si.PEn?@tGؾg'z7?ز`y" O[p|  ƽ"II9Ԉwci0_jmyˇrY皮Dj4<{ؿ+?L\WKʕ/M„<+ wDu{=Z ʕv\ʺwuAXR|:@# ]z6"r~zua 2| qÀ"IjV3EkP qq]GX>6;DQD{4,+Dn ./yܲ,BՊ|r)Nupz$ 8iJfM9:<B5#Eze%14j_ˢi5UtdKYwض׶8Ѹ.s./z3J8NJvZd"M#8StI|,P5HZ,Y$IkmJ,f4d8[L&RbX@xLg,%շ,4tqde]3>i1_.rBe4QUbήk1aH'F[q0- ,r׿mۊouM,WhP{1iۯ_xHjTF_b`XHjޤʰęf0{fj2{|yU(L?>oo} E*U=D]"[*@$޴`+y 1dDl)ʊ6O0ZSy_{$1J*1L'XM^fa2aP]exlCUl5eۡ;MZ8"saꚪnqq/2Xɶ,mAk \#3! H39DҌ˿f<rxp.'G yQ@n Gޔe͆)C4+4ω%I1A(r>'2ǬkE },%(J 0P+,,wpHմqBYU e.&k?h4,r$"疁pix.H#C!GG,K$Fxy{eYsuyɛo im޽׷ 8U]Q ߆RtFЇYN׵$IT遍MGI} d|GO'G w޿L<~u4ӬGOz}/$pny8?S0\C1^|m.@y,f-ކ]5O2AŒ\.d bP3~Wav%SźMVFJ1?2EG"er\| ?CAڳ#. B@L!|Mo8t)QE&R ݩ6hp{xO%᫾42vJQ.+{7ئ㺘Q_ȵ}NI 3}+Xbȩkò}ޖY6 a)ip^Ҵ$.k;E8`Ӷҗ1R5RN$ MReaTmڧybwM+#%^m)eMulEYJoDYXseٵ\)E۶W+^|%>}*~www À 7JsjqGߓfC}=f\^z۶㺬k{uVd@݈~M0[  #uh0h?Jza^u-mY^]2lV s'ٿq'8ݑ.];5c(c8URl8cK cjl[Ck[E:j%ƀ{㹒Y^5' \#r>'"'%-;$dRJ m.qCC4MK$l[i:V),f8ae{m#ofUUaOoI^a?x??^٦)b.3㘝FdLg-wywD0ٗ4=4 M.6q5O#}eٰy2Y^Y/,TXW ^#" @ f;>-Ez%G}y*u&nPg 8O`_@Gb0!C)P]?b!/C%X'@>yn7zɤg.d|M a `0t+@'$ֶ10oa{{,2h;zSSvw?e7 Y˰kd>kd} sK{rҞEf.E%rٛŸ8>F~7{)H솟?cA۶Q)EƷ( eY,%1lWHvH(XJ@4x :C]WE#2&Mʲo[XV8}iYo]-Z-fTm O&JY71fZa6񘦪Xqu֋m/=^€6-cڛ,ZMڀHxYT]RWUQmXMeX`4X.WxC'nӚzsmKCK a:vx,9$!nٮeIضzb<m!IC[˺[ƀ-f1rm~lGzbAx+-X}׍D6mSxLY ݼuˋKMi+wF\<~wXcN38_--HKN?aLfSE`-uR&˶TlR ubk0/(BZ] 7n$JhQJvL]@l[!ӝ)l6K)rl e[n(B>ш}0uMgmC!"!sxYsqy)׾QU07}l6.K6 UYg,|UJ[K{{L�ڰ٬$u]0J⾈҃>%#}m(b8H};8Nkiꊺ. v|V^O?,?Č|s~axu4^,?kG=lGxW0NįvH{ >-KTS%wB=[ނ}) _r?V8}Wv}a=vLfPp=#;.sj%ҟ~_LH*7!d4~S"g-? _ Sb_-Pna"k69 (X<ܝCCb8ÿ)^ە܏ VCr&ұr+@ks W ԯ ^C.9xY5xOF\ 'mHnC=" 1/F~1m 5 a&El79 ЦCkr}!M+kuóAJ9-%S]kCG m#E{{&ϥJ,f\a[;)Jf7k4#"NNh[QVX6痔em[y.%]{Q"?ʪbް!~ \\IZJ瀥5hcOjʺa:PфAHج3lcĶh뚴TMtgF Q\6MC]Ҳ/n0O54b` y]GJܯE], 8&%6v\JqE}n;izo]mߗ$h$5{{4Mjl[1= kk>”>k6-i^ F8" -ׂ}n3IW<:xC{~D^)rlmmnݻp<=-~E!i.-68C5yUیM.]!6xAyxfowx0H?9?!NI޽x<&#_]]8<`ow6Puܽ{O++FkP|eizvoc/+G.``熰'߆Ov_CnlX]JwC]Ktr?4VgWC=AUPA,X'f7ewy[b.wcًE"CX_pMX1ٰ,9P5=hoB+Lӗ-OĸaZl #7w/Ip֔JdMWeOX{pY!X`4FC<ĭJ41&$ QW݇^½ LȤ>cA ݮ2>m1eSDd:008;9E)@1|u{_v#eާy>d2s\Gvy/s|ƍ#)2e]11X<~0jXd=(˚˫Kۜ7b0H</v,K8#g7nd^3a4M3e0ReAi@Arݐᵜ++ޤ80F4QaӌCk:miےM%C[AR]׊ Qur0FD*%M]˰ AB؎z,V+e%ﺮ-"i;0$ksS([ Tж4m1t#,EExo]FØas.ѐ)K{߽6lǣlq܀Xm2,z({٭0B&0  (!<~jl־lF F;3(b2az#޽K;&1q͆w>I3$p~_ha(cOOi-f/򊬯`hݝ|f:۵=sm:łsc^r||Goqtg{%jyG)1<} x^a2PUo">8b |{]rdXo0Nxx8&NG~_(\?q 5Ojx, y_+G߲ē1C8}[i+}7$>Dċ0@>?D$$x{=ñS+XdW n9Uma\CKmCzbL]@`ݵ`]<}iy(knS]Ht%oE.eOJ'ratK_U&f!Q^$z#A#rl%>4 $ʶ;ŽSUIυʹsa2t۳MXcaj3%?|?||,ȸ{O "<~KR2LƴMvaZjo)42 ʧ6W-((n8b XVU[9<:Kݽ{"R6uۈG N$IL]qX;.eM36-0tW FC1Ș!㾼k>msqyE׊hww|vŲ,@ҙ4=DԠRu{VkLn₺x8@,&/+ YgR.~dl7k*\[:lP62)PumK2 H-vMv%X˦%"G eY$ugIdYfe:^iu GhEi%liG9xIBY\\\<}zڰ3ٮW.+OoL?[v _+o7u/g|~=ű\iU&[3e\M&$3pESeiF {gLǰ/{&u q%qQ^\B=8U6$+/S+~ɧ~ZϲcIV)y˙8qgģW× 2(yM]!3<1w| [@' kyr%22/'bBI=ݐy.fq! Yݑa{ E1uݱ--Υ~EǛ+aU: w(١xmUx G~}7Eu>`>J%/gMDԥ=s9]>i Gia{._>s#: Tm&R?d&]=%pzH X?Z1_,LA@gQ/@QTU%?{ѵ mkQ-{Rbv}jEEr~`8HgnʫѶ ?[(&r֛-=}0d8P5ggL&Svwq&C]suF)2C],bzXb| gg52r]w?ubʭY#eж2D/cۑepojWh ɮȅ1Ma{-thFK_Bh` 7,~ρَx"{/"ׅ\7ePW.xrFL#,YB{_~nrAE;.`0bb?|M◅Y_NKb{5zZ#,K(-k"ZlmV$`u5WRnija9@m)4_U|53`JH۷,8bV þs}~,l8Cgt/i$a0H).ʶljx4" Um0Xtl?ښ$ ,f)OON<}~!!}ڶ(KNι{𽀋3m$c$!KeTEZ?>^Rd1C꺦(>V$ aQ/³)Yʵ- !0O׶tM7K<0MCeg[lWs//;_v<5` |lJYTMC;!o!<ںfqyE[(S3_A9A{pp5X~Vg5 _^ӯ~GX_`G4ڈ4(Q_$B xGvo~|_A2 okQ,ID ;؃_4M|6g"iV0{MJ&/aTXtr#lA up0,r{RWo'2=S`\?3ٕǼԳXR@Ab/U0;< ߎx;}CpߔP*8 izv 0}wE:!lԭz_PX@+.݉o+qAƯouUŜSܺ\y#eH@:A۴UXaIȇJ|1NCTUIuܸUbm4k^LSWWe9cY6t&޽oUfm*ѸѐjrK ѶlEkiFĔeG6t+#wmj%Rl,Ȳ,/ &IјqbY Hl4ڀeѶ-fC{ăol,`44mGڄaps+e`x?ꚪ*"? *EDŽaD4` qpԙ1ȶ[lKxG gu5ON b"#@qr@ Ub>G"z7Q=xl$ABXZ,X/$Kg,@qq{4uM%o{sK %e$8"t#mJfd瓧ڬ]f)ӝJ|o`]t*A)ż/{ l6(urr|BXp8$m"Zzb8benmbk[?~Luܿ|.=B:r$|dFM%EYk zcuFT? }|TqO)` s=[2BޗHLbO ݃ %d+ӵw>+'Up$N鱰"jk(72:Ca -\w"]yz ʑA5n$.$7!s|e8{!G")݀L7(7;A{xOVD4 #R(4,?&^ (u>XF? ~%I,@MuXL!>zӚ,O x 6[v V /k KUlij9{X48.!D֌1Pl[v~{PቿRPl}tۿ+h*W񘾴U\=2͸&ԥ zW0? vn1w>nUY;F7arSo}@KPM,1J}"^>LB]VDr]G8m`R@w}xRҷWJ;He텶~&dnsFhNdufn)'On S[>v^{#%,߂*@ ۇo>C pDH>3>٬䘓!_>lJ&ԕp; ettJl{ʅX*:pܒVBԌ1h^\ݸA$hk (n !"Jbc YV0(ĉsn(`Ƚ{3&j?~pzGSDdH|Phusx2M*Ɂh8"SeH?u |)$2^;TÆFzw IDATL>{xѨ=-sC;rڂdnuR}m޷)_z+zs>J3G2}6b[-od8vg2`qՑЬ임sH#װY=Dt@/\q-qҚxBSWu|wΰ(Zt^tY.ŇxKRҦA54uzk|e,Hݶ5x"[*hzg%Fhc#anth8dZZ # t e+.3F"0Jyb4Oϲ `|@iI^Ⱦ-4|q5|KҤyч1]L'c06j+E<:ZKOOOAi[)c8a4&L l2 Mtjh>$4?؝'G.Udy@l2dg:qXP+8?g#/2LE;Ç$(m˻sy5"隖F>͆'GGܾs/DLo}+f\n֜o5gsʪj79GD"{4l8R9ٌ͜{/ISmyI"NlEݖDDÄRDiSI(8;;m+oWcy~M!$RʟřPr ܸ >LwήI<w#+vXV_TyvR@IA 쉕>#HL4&pX,atHP}'>w? 2$Ts p5]]X[[TKٷ =8ű{[o/$#Lh(6P c=x_e1> d Mr6{qN_}]tݭ |~ Xl y+ ADUe)އ>m+Tuٔk>.bb$c%^YaE)}ձW\D)e|h"+8{ں5t2"<]fTp&ծ7K9dY)0ڐf"ڍHnJ,KB-F+RkHя1CkMy{G(Јh{FRG!N`&6kzDJ)$XUMP E<.D 靭L0;dX1;9Ʉ(mq12Ev,K&9'g2#IJd k,MSdy4JkzS9 {H*Ch4 `]aGlk%QvMnM?U $S)nC|4އ3Or|r^;;m|Õ9KsnIbY⼧".M#Ⲻ*̔UEf&NO+,jkؔ[,iZFi1 е e$Mh׸ueYǟPVE&YyWRfSV5U2)Qڠ$Y;wh;LJ};v[e;5ױ8?{s-y~i ل㣧|D$L&SB$|{߾?~į5WU:o7kt!:$~5\ %AhW ^OeI8}G6P d}tt]+Zzdܑcݻ#ZHs> 2و4!Fpg7D_ ȿ#v6kܖid 9lV0OΎx|gdl$#&v*a!iTrgOD|ƷZ9KNf~ ^QMJh郶`L&frу'_FɔasAaOderC93 2 eu4mCٻY#Ey+BRF wc1ŠM6*G{#6&'K ;|WS##VbI+6 ѽK*D)1xcN8FD ;N:Cb4;N?ȳy営mPDyx8m%.IIBm]BY \bdsγX!/Fd(:'t)e 6 VkיwZ%`H>2iMp"|?'| 3$ӫK,X, x:(O>+,$c%Itvh F5XkP['׬=@x1֖xD t-*zk4E[Cb MÃ}LZ0a8a]uLfsV|CCi[&H1,>;szzN6bUQ9y6{Iu6+pD=cF"n@|Tjml>rm RHX;-i"2ҀP6 Y^uU"Ms,@ 5J)%EI:H|$x[" m~{m*hi%P#ۥcZpvz ޡ\K9|a1d:%nIE*}HRFlo æ iDKa-ZAGq]ZÕkV5YFh;6 V$Ze%m Lb0֢U&9IQ;Ou$` mRTz ˋ!(M$iJ}'FI?8RQiچdFɇey|oĽk;.jE1b yWV g2s2mFE4mj,S7إ*&$1NhZR1 ,w"8g4amc֔ uY2@YD|T,gk inSY¡06>jƓ k {{F#>z5 1J1 c-ѐkob:Zסڵs~:#,cq~Φl8\X74]'ؿf9\qw}=O<(؞:;oKb0F3M rCeY2ϹvxM<9ٳg?=MkX#ӭpRxp< ږvKUV8;=Xl6ﶮjY(;GI]IVΎag8LlNmXZMvO/gyIYJoړoCOK>pH1l*EfYw6;> !f%{' b/?Ojio'k ୿١л0>Zt`罃M(B{*[PP=<.~ZhRm ~-l y+=.} 3~6.䁀f ?E~j7.. =I`-}]GYtmà(\us=Ʉ4nhDRZBPSӊuKbJZG(!pzz)m](]MxT("FcVcc6eIUUTM&k\Dáz)CO@&4XBF[Ѹ ׊4LGtRP#\ lN1((cAB2 Q$\G.%Zex/sD:49|MCY׌F#b4=EFL0V5ks k?œ'jI>w'cm h\SSd MUQ[rKS5h Kua"ҝ-%H)FGBDh$4Q+h"{tJ)U`0dqqj(DX$Yκٶhg!n NΩd1LM$3}H9*M8~4ؔ%ٜmɋJi$,b>E!9"2X& u䙕ȋms&kk^Ã]6eP ؖ[LeV\gܔb܋ǫ f"ͨ7Kj ?=W@UZ_7\ʵ8L ץs{@ BajZX>^"Ƴa0D<_HQ?s5x>}C>+_j%Ok"V?E8}.x?çh=} Тe(?t+ mX䆔V $?ŭ#9`玸pPW0{U"bֳ -$> =sŪ0T2E` =dfB  ӉCpC"ءЂVdshv%2_y}.Ȱi9J"*{kTzV=;M!zKH*&Eh4Ip="{QnXh- &Ƶ wwΗ/m49yDc,JRQ݉ڣŹL2lJ ^*5Flm'2.ݳWpINqӅ)&m.`3M5x#*2<9ۺ!rL|&ǐؔ[wWv1ph&І&3JPU$ix6yYQ0L 2kH VOk;$ɀfLG{45ް֑OɧnO^;?Oe4mbA]S%zZE؝Xr.l6)1fڔܸy|;!JiڶԱ 0]@i6t|gNQ 1RnKꦡsXPvjI^lX\,ȋ|>v8>)ǧ/3cwwo(S0):FBxf16V4G3Ys#IzdL&t]l:x[Zl&799>KϟQ ?0Ԍ#\[r!-mYu,p)8'FU8V'̈́gvb$wiɿ+w/&Wa>$ ݌4/hN(nڲT(-%nTJ)BTx hVЋu^߷oLkB871uISn ɘr ajW2kDu5)Y.|ԦAєmjy|˾( |8c0NM۠tmMהd&CCfT0Ak-B^cڬ(چdG?߇k/Gfw`8G(&ٳ>[ }i#Sz&YJ>Fi)k2yI_K Y"7~ LjOYt2u*?f<KLq#'#a+k'n^?>duQm^?u>rRX?]$@#|m;To½: ömK$Bq*+s;LPD'/$k"]ېh`<<[V!躎mp]"E5 4EuU1, Z\pc Yj!xڦhzV k &'&]m.S31X*Q:p R4G' hҖfc- Nj k,O~d~ߗŹ[Z6_ MH_E<#5 =YmA A;apL,m ރRؒxt IDAT?Pn"4L/>ӝӏE{3@Arv_$C(2i}S[w v|*D]Y-v38H&("nw=i j; v4S RV8@T}[̆BrL@(c~I/D.aj -ڎeϨg_0<, eᡕ'lq>\SE2dkŪyr ٟ*fR+1|VsI!skr# 5ea0clJtŕ`ѱ`IaP$yiOVW]am[.{MpIx hHM1F4#z8G[G)9P*pvrBpMr2=TEJyU7(cȋۿaYsvM}*)iYHB?ץMtg㽄MvCU8OIz$芬ik9CYa!M+CmUfx`8b[U<;>ǩi/SmbٮFZkQ`CV\ٗ%اŋb<MzP*Vےv/ ZL!Z{hXD;hZ>;]6.d2* uUYs6ڗYUH"I,$d(kt)וu+|BU$#^7^,ۯz.Hb`vg:S-nw\$(Z{lO9=xdA('v?@,çJI 8&im81W^Asܑs[n-_2xQ(Zމ}Im8~G%f;R((D(n&f!hEރM4)B!/ڔvnD > +x~W8{?ޙ + l.`zCE0B#~V X^/%@+@)YWD+ԫ/I—{{p M@yݾQJҶk..mӉr4iڦ*V.Զm} !i\*R۶JqQҚn:k%i{woZ5m1$ E`@i G 6+.;m[!jgI"]w}aΩ4}0{WEl|6La- 'sijI[IQچeϺ C uNivn<&IQƐX2 v$*'i j c )U8@UWľt]ZbTLA!b=I`m"䫾ﻎiVHqX"Mײެ) uD%. \$F(#/ *[纫k+I&'-M'%X}Mo<bs8S0ȲUњn(Ͱ6a e3lV9I `'FI <E(1!h"ORS&IHi^0NATheӜ4LOK`mJ Unnk/fs&V<"%ISQ:Vw(~AnX{Ob !+)Hx!gҸ#Me HD@!\9dieBO2I(wE#Wfޢ9w:/E7 .O_q| -iVg;ZD6~ n#s/&T@S{T&`.$p#ӿ?YUx.t_&g2PJn3/%й3-LXso>t 2|.k,zgH 8o0_$.M&=?Ff!V|@&>ց Gf(p!#lW(h'w܎vcG2AR Ȯ[Tr]I)0=˦pr??lj9eyC}K=8KP'~G?^]KpDg}1i:; j ESQ(hM!J B\x]ꤢNdC 1"@Q:5މ`U: nZ,J@&S9FhLVmkw/ִ!kDɶ,Lg\Ҝ{ZJLAy0!"C[ւU; *u&x2A["J/ů9"0oZB%Ir"wx/avމKT_/\,c Q 5] αޔtM 嘬.AB ƚ~S䶨X_֬Vaz'u9{{du[V>4X`h]SYM(eiN$4mw]J) 2Ēd&uHŒ庤%  `mh5um{SB&Izʲ,a-cIT譽3B}-gV]}&EY霣k[ڮ%xO t<">6n\1x5ij$j˒$Ip/3q.UCP @h#`%f0_Q.~ \`4Mw~2~/=ۃ_&`+\hPXَW5߉f"Cq 9Y'rz8H!ޒVR8oLRIGя|W p_z% ";@XIR 2}zv:I=sq_(VHw~s9EP݀obMd-:43ބ$ބ=ѷ[y9v_`uiq,ǛM\ڞ9߅?\{MoaK=`艅 tBl. Zɴ/?L3~_ 2KF'ҥv {:-hm{6SeNz(|ֽeus'I/߅AGI1`D45vK]uE[Wtm#O*b5MM]hFAeb(E׵B_TOHuSVtVh!Z "NjEiߔ=$ h"BOM]Sz 3 #ꪦ: (Ԗ-Y1d011Mi:/SڈBIť\0.A] >g" "QcܸZi2qBj;@ vak5Vk)Zܸ-mY(ijIb Y6Lbe`L1 !$aOQ4nj,CZp _xH $gܬ{LmiȄ*PQ65jh\jX.,/!Vu`Kuv#ɄpD6*$a۬aiN:20Ƣ&3\MDjM-=mJYcmVdihX`m[Zꦑ|H҄,, àcl M,E!^f6MBViSSx pY)]iJɝ (+/b}]োϛ>|/ƿh~S㟻_+owjY,arCRcg( S߆tc'ԫ$;"gg|8Gyb;zT"rLLAc*\+WBnPN6Rw4P~J7.䖒>rdwS;6} tJdΞd$' H- 40WIR>-Y;ID;[ ׾7?hswރt/ P -Ae:M륜߆V 0S.%/}~(pDhf(NBDr~.n+!wG<'M,εtd_X#+ $IOe^%]J"1ƞ HtgCzdDHӔT}1&tљ cPW[6%y0$JDBB©WZc4\dGz""#ZQ(޻I6TsșF2L&E~tn`FI&4$I{oUj%ֳ~~NDӍr2"N-2e!xC,6z޶d.eh^YV.E.) 2}ĖrrzƩ XG!GV J+ Mf["%nHcva0Is`{BF‾x{WKNO)ʊuX=eUa.g~|AfG)0uˢ,Q}tr&PF}4͖ 3k8ON*../0>m11#=D5wlkN&6kzȊm]S8b 6ӱ u"&#ö ybΙPLgT)Ʉj2*MRHfYYֆnrCK)k-""'IHc#x:u.뚺齧ȏM/a  &MHhQEQ0F,O.FChMgSѾBT0#i2WOSpm^{>n0|?n=9 O_>t=@^ HʭC:9J4i8WwC }{U8_߯FϡF)VxGyȪu } ^w^߆Gp_Dٱ@F7~ܷV>×`EKxo+*ʏ,TM[M2 7 ߀ى~>tmҐ,uV}_ VS(K^ ̏C߫ȟ@Xr0RO?*ho{.@%Q79C}_5}shYFyu`ސNg}1 Ce!YڂCRs31&ܨT'g %i889`:#K45`jlέ۷⽧!a22;RV2YƂ3)\ EAg"mî08%0]'q{B5F( 3#K#粑RuCrJH +B$F.Fr̹}콧*I,$34ؙJ<__@³u؟,볂OF}mg . }.p[g48}>RB+ nvhrlϡppiITכ~[#}$߆CE5'ךԗT6Eu@ҁo -KWRt/Go.uQ6 9H x7e'+ӻP R?+mN%r߃͉c}Z5$jeQ[ 阌%CWa;f&p*~W5J?az?2{AS[p㿓f9G #Qr;?u=;/t!jucSH LȑΜ tQ#b'M+QS8M@l4?홤BZGQMpYF]o^cߑg}E(&eZ[Sf=4mİ}przH$ʎk]OLfҩ8]'0M'M,OU uLi&˒3فmq6ljIy. `ŘNopO@8<>\Gq`RF Pc(g f#5,hKD뎾k]f.$z~5?dlZb;bXVM󋝐<њZCVN6=]/ m43fBz>PJozljw&ggO8vlNVM0yI#ۦaX} syVPS5m'',W^eI5(˒SK2Zzٹ4t] :01.Ѭ>VZAlD:GQѫB{Oiv9-I7okB Du0NBJX5eY!ewt2y ] ,{> *_z4wl:n'0pe8Fo7j|󿆋9t*`:O֪Cu#u֏^PћOo=_/AYp\{ABpxc l:Pޅ;/'wJ޾@Y\] E2V DR}-KB6UҶ,X_OvNڗ@s,ˇDǚhK/?Ф"Yr-:V?P}_vSͥo;QnH8UpwJ@&T{7NӢ9__g k }?8(W`·֌; P-2Bm8R $DCo3Yf1hW%g^EkY,.mKf;YdS&v%1x̉c97Df g-!XrC( r8_g<"( Hm}dR1Jf^AsNQ/jůޫ7alq> ɱtfȢ:1bV8H L|7(cY=9>>@I^}HY]OlȬaY\ۚm ʢh=auy0+oW\QJvtmGut]EDl\bIwrXm[ڦSMa3M墳nu+'ZK^Z& өHUY͆(p Gorv6yQBκm׳tuC,ut-fOZ9.Tc6@2&#ZC}O q̢p3(=֠"jjΉ!0Rc ۮ`NcT{h.|r: c)ˎ+~晾suwQғ(@5J&`HRK}͗?\Up|YgË>ve=̾&}\A ,<ѓ:(ꈻ2i'٨@7&+5To ~=tA-p7{o(8n꾞)ϥ D*Uiq WYſh:k `RZm.@:PʗUPN]b1m_`J3WjX7˔܋ڿ^G5]ʩ*]h4I[g!7\NaB4+o){nɷa}RϱBK.YrK}П 7wN4 Iz ; E 2}]sm7ky1TL'i1DCm{O4#i[Yz2f3su/M&Ĩ=](HѶusN] ä(uλV.D/}}(7%%M'@4,* kȬskkkezl$4?:H~c(r( ~'(#)#-˴ IDATiʔaph}E!Ci'UfXTB&q`P>QRzv>N4!xi\VL4YUrܸukIATmجMrbA>3;>]ӥ,s4͖v@Cc!23S+֫% ,spΤc-]'oMٜ+o<˩ Y^^ۚbjv!t=g W 65][㜎-ZKLg.FEQdB$[|vR 8+Ka:l!g@Hu.# ږ$=:eu,%Xm#I,(r .h\&MՆgq8L뿸1Oq'?e^",듀ೞy{f<b'D"d3ucg_R p*KK/0e NE )Jt/Cou%V$@Ԭ$jQNU?2_Fq@YIn2psٻ+9fN@W6n 4RG#'Z8NErה`.!G7Ⴧ ;_ʟ^Ӵ'a}bč@9{:דt6uM%ə&r-w(fm;֏L@!M~ %=7} cpQ-,bZ' P~Bڋ-hiPz:%4jr$D0$MXRYK(&DLt16%dɅԐ hQ5ڶ% uG/y-RhB[cHӥl'S7DD(c&FN92!ʡ@yLm #++fg2 MF4 ^#ޥ=+] I ,0@R7 &.'Gz,QFd'{| tI` ,'K[|L2'D|v|!QgYi-v!`rZcYojL&3dY0 M]S%Ep6Y/5[|qyyI׵t}ϦlLf3M2~m./.>PVSQNuv[,KKih\pFUdmMtmMH5RMуoj2&chi9$)X1sdsQyκ6$wxzbcd Vl\n/52닼vՙ}\Ҟо'?͹/>\5VS~DY V&skFy߾  S~GClXѸ:w˙8 ~"RewW d5|RӘߩe_(@X9n-?Pa,PfgB7Y>ޯ4]wuJE1p-xWKPM`>7, !q{԰uؾ/'UYǰ|$M!\ D4ҎIWTS߂FZЃq)LKx?L.Y \EQĐorRN l6Jeg{QvNNs#jXeб@|Hqp. FnQy.5ɹj֧!(-FZl6Y7@֘IGe,!CsV ;"=>tiB5]#_[)L,xLTlV%G) yYHܚO}=K! d;8NeA^@ee1[ i"[`-VV6ǀT^6 GtuiU兜&3>3>J&:zzGrr<)'{egdysu&3uz幼E!t:e2 T5*sd:tc !|>T36:Q QG%{Adֳ@]+Y=D=XѼdmp9(hFI@eИ,.%Q|`4OCO_Ha=KElqХ~O&EiS5 ߃;чAVK}+}@u,5S((mz Pkr8噴ۿkrڼiUѦwGW*cЄ$i,7G称 +߬ԬNoK$qoVciD^/wWuހ+`Rip\pc>  `@fpٷ4Z]kar(A~u,49_ Ȧts_L1Lq];GܛXtF1tO ("c~ `^;}ܩ lzq>uJإ| kLkMD3_+Ƚ{8cFbb\3eLj6O@UM@(2ʪ-|C,*,Ǻx 7ܖ,M' ]F>edErٲ<ͶiZZ5b@n"eQ,3/[Պ(,umeDG";|knǏ6'.#!F :M{-W%1!FȋɠŮjISoB(rf܀4Eb!e ]ʛ0rrXq !rH)ZʽȊw>hR 7\džɒ>MwX&c`vŤ^_$JW3Č1\2(ht~U~dj>:sƹN;1>Ky52>`NF !1\``a~C& )o忀~g8Q!n 79B XQ+:fq ԅEB>?~M@yթlx6|+8P C&Z|n\}װrz|OV'ߓ;T^q›?jTh,Lnj[1*d^JSEr*kXhU9dJgN}x`SOzh;ͱO{%TqS:]A 2.<*{NIBڂ-c(2M Db+P&,OS ѹItwv'zK>bZaz6ү0G`U;wTeUb3 DݧUy^(:D{}!|HC!aP%0}7DUd̦8iyfpx%][oلjVx B&Q3{͊M-2;հhZz˘L)%pu&c|6e`2prrLg rҴ=owS!NO]+p\^rն>pvzʭ[89=a2)>p.`M dGiNƤ}F@WZI >OY̦3BtO+QY&~U~dL/OYhmJ'm&$w "S˿R`h}h\A &y)z#Tv Ƿ75zT* ߁F r(oBӿ+`!Vmo؏i2}CQ 3 BQ/D**Ѭlg$p{;No%{.p.l.+U!ۼt(s"[`@A 􇢄 ,Qb L&#X iIүiY˴dy+@}OZNP/:{XUU=11V硐NEa )JA dQjk.f,_DlhRT ɽ*FȲg>者vwW\gZVqOSpì Me":1CמSOSSg<Ħ0²PםT5 /7y{Eb#+8QGCi\Pe=gSB04]r'Hcre'튺Vݶpq񘢚P>FiS0dz G'lNsE!MSYҶuێ&QC1$n;1ʖ9٧+1(1s`>>,+5%=Q/G %䘶scwFqwOSɶٰlS@X|hJ8)iN L2Ƒ#?k'"u cFmrϾ>M>yܿ;v˨;f k/!6(̾!>PYhŨovB\z ips;tS ۭKΩx=w^~h(~G-Djއ7`n:}/?{z-%LCQ_%{[f#pO6Rv+0b J+<`D {|Ou3Bhc8}I`ux3iXI`}564&I؉75k1Pe7:Gp=]%k7Pj@$?n!Em,fak,1$ZS>Cߋg= k{% kɫ|BvtB<5>TeN[qrt ݶWzŶێfn Ʊhzl{A4>Rrr&l"xumsNaZZNcCT]upR1>?S}4އd\bL6`R/-ˊ{n 5LYF@hZ:Mtf>}PwYPxD*RymGg)BᆀF:$;v 2XUU*@wG,F01ZmmKvirRpzzFÓ[Ƕ?M7I\.td2Ci|܈QYz]5_EynS8O.EO4g2 ӗT^cB},PPۦ&Jޜ 5c^=%JVYr^vBcڝ15y8~EE6I`ruoByG9KW؞'רx0Wf'||KAQ),/LvH>)pK:=6I/ҷjmrKc~ "C:+?+H hھ^_Zt-} a.~| PԐMu>].aZnL_-Lw & m1Y*=>$|{k},˨*Yz :T)˧m}!DgyNɶ:eDV :nKo]8?k)ˊo~"h\ԝ,O sfSYZKQL'SuKTIn̎k G>M$4(" 5a*@֩?$.P2;Kh 5I0o Y̘Nn]E,V7CJʞbmֲ?%&D|av݁4*,s<98397mۀY,(ri{N%JAi WffTWV t*Fp.QM&EZrk1bi 4S\`-Rnm2)j2(:5 <:ƉFYT,eRcv: kHۻcMcqNk: +I/e0Ң$p1n#]81 7=1F U ql ď_d:E?(|e ߳y]2Qu\\r/n|YB5 z즊͕^"X@CkϠ>M%T5]/$ROE `4*xMAV`OӾ 'aoLg3SͶ9??g9\tkGzBӴ,KHM4:<4cak!KAb83xC߷lk.s|^չ c,U%ף!8l6$>>sttk\{$NZTܐ3\o<rD0}TF1heLHXDӉQD胧KҖRX>ҵ)׍#F3N'U*|*z=p IDATQ@æ|!pp00C LqE1:Τcqv]GL3 S2 9GWXmc'vy^=__]O y~-sXܷ&xC֬~&ap1K7o 7'*-50F氆 v SGMMiVÍon(-?ߕ; (MDY+m8WE7e!{]QBP.z翄\EwWKW^nC&7QiF%n~C>,2eәY~]^!,d-{ ])ֶ_Q+M 'sx/=LzIOMh5~DӍ4(,[ IY QVf(Ԕ!hceYP2d#>dEe4v{RNUTe=wxߏԖ{1Θf (8J Ĕ1PlXsV96M?v]q1p:BDѠHF] I[2~0>eS>DM85Vvc$ I CQ(;8 CcC!w@Зq!zLpi>L>XZ2+'0 Ud; C6Wܾ Ӕkp:qAVʢ}q<1ekrb`^'v)9U5ҶI4|?W{+CͅW_hN ~M]z >|S닇pli` -m!pRU@Y ͩ # p_i7M<^V~cea,%DrsS ld+;+D9yAJ>WPӜl~ waVal4C-M~ڥh$f.u~[ ~e7滑% Fҫt5i! 7N4\ NәޮxgpI2?F@¼, 'Z?3RF+/g=dдXpn[Vu!1izI!VXktJUO<-e^$I$] 봍RʕCHh񈣛Ǝ}~f{śI- OHz*т׍EUܣ$v5`L&7r3z>1=Zې߁ߨz΢zuuFL)!eOohM9`HoPV,Os Mы#@=M9 upsMux n1$ջp(Xi"oJ,mZkj]u-_L da{"5l[Ar)< 0Cv_>'_nw+ɑhk4- ^]*0y\!qF!g`||I ӔPU p$|]ruy⭧Yym5CՕCJmQSw4AIαG󉑽I~2@BDCm}Ҳv{ڽQأXt  و @~a&q캛2Sz "ME&=9O]~ YQB4*cN!&INz^|k0\XC2d2'MRqOQk=} p=ig8199`pclT_:qZ(SyK'4nhr?D cwQ0]CыpߐvcWpOU{}H~d髅B/X5e(_w G`*ѫB8J2FJ5 ձ/i?ND:y]}?{N,A7ABpr[>T1o28&._hp,~x*bV-t +ޏs.NDWx` q-Jx_y'C$v']uspՏ2yE~'gzN go|U *ecFP?ܹmOrJ8:@0q-wi6 mR i˜m> gnsF ɲld2MGV+1L&8cjrz~=s܁۷aAuW9 R,PW?xWG3*OTVd[) t:OPha45H>?W&.$ZDZհ|$nb8&F|͕hQF@&M4Vʵx!NNM{ 4n|_kMMn|M<1m>tb}FG$ܧvcσ F{{Hu߃]ێƴ_tO !$ a|OL?>Jo[u<ýQM&뚫K.//x9::{o,M">Cܹs8N?歷ݻ,KVo{L&x4)p&sEgwE_U.7?氺{vM ӗѯ7 >P!<{ ~)gwUgLt.{#qpT@%2% 7W=8\4%| ^ S=Ա.Ѷ5! h S[OOa^X,xvvFQܻw۷o9>֭[P%|t:{l6#2& Պrɻヒtjsex|?FZ>5wy{zSf|=_ź]%P?fnRp\!}Voc`lK˱ݨʚ怅~:NUL,&!F^K8$`v&3OE z.UGkߒ`iz_]W.hRLý@߈u0zmܸp $D\|;]?l ^G4kOt>&'?/lܴx|+XeOၮG,@u{Lok5!K$K~|Uj3 !/./DDAң'Oћ^tCrf躧m OUuL=& <;"oU*$ xQNv??},PL <o:OV͒=0y ||ܾ7+Qrd,cPp;OO/l;ŰZ}ħ69ES;e8YAe<=bBt:S*&#eoo[nqM9::bkkZp8DX_oE1jr/+z7۲q2\ZE"J;^Iz,zH;ci #k&3c Ƨg |Ѩ֒Σ =K0c(\!|MIؙܒ؀xOֻ-9di,l|Pۆꖜ\C e@Q "5&Xo8/E}XRYif固Cut  |tںOҌ0-0kk!u/h$l)4$&o*I]ucKlֶ A܇nFb "2xksx>dXq^,kF>Cav çw睎.Bd8fuN*;Pc/sBw>&YcFȲelbzdoܠ~=H(T*r9vwwYmh4"2NdBE,s677y& .]bm}^G.𐝝^~[n)gggZ-6V{Q.)\l6s~>OtZ bEx:~gP=?i{x!_=]FPh+02uQ/LVREiL.G+@ 3, Xc;d,08֤/+ 37CEHjw ̏fcE5lHwCu~|SҼZ"'mŖgغ HLJE*ϓåHw9kӐLQ1R7 89tT˅DpTݒ\ML$Si6^rDԄҤDsCfv1c *Rv#so،z}׌6Kcw~Ws>/2bRLa7"ߖZMr]c7]W-IV%J7|BK/Z899^Q}PkR>v4 ,1^޽{L&g\[oe7o} ҥKjqv}j|>dt"F{sXXX;`ȕ]hBL\~ REwcXĶ`۰zU;D"6ԭ&aÈ#(@#Q|χRzv*<%ߖ{p-݁/'8q=F]T lbq?LفbCk^M]g>0DR~Ix 9GEHOj20 qrr_ҎF:5BtP46 U/?*2Y'.>t7HG5s-Azq53I/ݯtϯ% iO#<'}^j #.|7 ۸ՆvC#bKÑ`q0zQ+A ezPlA: }h]0}(xcC`b3K4ҋBIrMv(Sߑ oJkHi+W,kJT{];IazXJScX@#ظ.OC94UGWLf)Ed -B4iI +RGk8t]9䡸Ȫ Ԁ)P6]"l'Ym5^Z``4.ts2\dV|8@bɁWE 4@]L\R@W2TbrG(5365ݓT-44/ [Z =RAUT7va@v]3rQZyd(J1= 5iꆏ hi}7^I^B'piD[PۅT 0f<=Yꚜ˚9TemxSXv}IHWu9*o@%c߁,HWK2,,,,3~Pbaa{?џ=#*gUdc)83O5 ]B)Z34[Z.%b45TA骴ˢ@i͗м "\ ;FvJku' (`|,t枊k&zKbzr:W`~t,d n$3h ÿUw߄YKBxl}Jj*"u{N?;֪u EJKF3+@893,ɰxM$\yGM%^VH3YotvVf' j*X`>TwV3I]QH IDAT~C\r .|Cr*r"m^'4?dK95U:" Ն0h\VXW+oATEw-7󿲍u "tm?B YF=k:~8i56dNDBܶ*[PtkaVc&S 3M5LfŹ60CR֜&AY<٩HIσ[z~>,%G=~ ^gSX YXXX|]ǥ,,,,v@G*Hg 3b|yJHb8D QI+hwrhѫ2,NTϖ^UƂ*mpԵlh}5ɉ"@tUHкhb5w?֎䡾B{.4k4#@]WFvƗ߁u#Ic{[فlu>щơVt$ύ%!*I]ijtlх]hIJ_gX(0 eF$C܁˺JLOPu'Sl"(lD3`B?dXXXX<_b wp"T ﯩ߼bMY <\sk8шCع S%1u:d*{ׅfG݌%3.4:\HI"P6nCcMi@F˅:  fLg]:oMk e`m]Ti]gS!N;դ/xc*mrG=XENIge+"`L~Pڀқ+1"IJFw]h  .Ϥp\ V}W1XtLm*1{gT[~"sJ۝HB&[ڰ/Q'!|4S,1ɰx~N%&/YBf+"}>\3"S6EBk*Hڍ$ԮX6g*GyAq0RL%Η4TےUKNttj'=YD++,ґyFF+ MnKLQ񿄠3i$:ﲯѠ4S>:P *Wՙ@yX˖7Ƭ3u}"ip֠ rPsP]ڞچB 7NUC4mpsNAoDCԝZ;HQq!8ׁ Xaaaa ,}rr_.D4Q+ ںƺF|.,Yнހʯj*!d5Sh\TRǁ#O}CVUL_lrOi\*IZpmYF:-nŌFIԜN`t_6WR>=9סl_? %YMIQ4Ύ-n101@2@Ul|Dڐx򮈙g:V3ǰ}v8$ojĪh4/~Mݑoe[/u1(B6xꃓu1Ò g+Uɕ_5N@W  a9ps &CiJUǭVdeA㢺{c=oI8<=VW `*:29|nj uD>Pa2Lz˝J6!Q)(0u ˁ{|&76_=*axI!hl^c3Vn%=ؖFP2籸:=rk"seXA6wL&G(ǨىCCPW"} ?Pxeāx zNj2,,,, ֡l~~^ſy,w/?!D>XŴӮJe9H-zp)\xGŦ;!ᱧΈoD煭eԱPh)){p_ٱ1," D$*mvK0Vyc:^Ҙ)#[h|u[˩<>MM8F"qN䗦b&;_S`q_u RXܖNL뉱!{ܹgrDp%G@eJmi3rUe dXXXX8ht0 Aa:r"ua+ܶ-Ke(]ksVj`$w$amw4RF+[WnNwy(}7u#_ŷ`6}jA3eԔ6Bd[|%NK2,,,,3WT X݀QW !gSX7Tg``p(!,/Bq:{9ԶhT}GK~iA~z;#j`Ių,(EVgzPaՎ P{@7ak^!>qrjP@kK]*uT%NbQ zpP"1QvÉtnNIWYkoOaqQNKˉQdCL Pd B9%#>Ax_TK5?EWHF4@߃M^x=\@؃h:Em&Fȵ =%>SG(0DR}鼬ԉZ=t(\z iy`X᷅ iBށzSAs~Y;髡: QI&Qއ#9@sZu@rhP`r C9u\<_K Uˑ&͉mXI6@4x9y3%z rG_q$ Wc!0F%M$1&''+\ I5g`ND*fgLe}0㊔_DKz]Be[+8=%GʺBpۼG`";&wt.ǁ:A4Q$+}S\ ZWO>dXXXX<v2,,,^4v5(c}G)ϠݨC@Y#88ujfUSU7ʛ*(bflUf$J\\+3ڳ8U jy(BV*n1~Gᕠ{U؅BG8MuD3,ɰxj6xB{I~b*KLnC%}֎zac ' W4Q U"3^d~QM]%&G8R_PJwtWF$/tSo+ܫ3lB4d;}ûZ𑾆 Y:⾜^mocu'"+CupdPFV#i!P>&ZA֕W"X}YNE@ ;Wc|lH@߁PR]]wg 2?km5ORVaaa XsWs G0 ӡ(UFK&T^U8ie:ߔ ):p_LDfzp+ KMh,ל Wqa*Ki.P{rR 2U% U-i1QW$W8Q290Z}i~˞quu`0ډH?{:!]Rt+0R75~Ծg?]6r E븪1. G8q X-==;Ϋ"; ݃|E.UIlr>zWCrȅ'`D噄C='r),ɰ:D. {0H\j);jXqYc;m@yOځ?@-yd4d<" Y1'.}ooRt ׮ Naxs3薂Hk GRWdH kaP'W:H`x ')ƿrJ>5Ϊ( ] ͖G][0=Rw& ф&zD:Lz_˗'qr tYc:9VuDʢ@be;rN$D,sUD2(#c|2 gH`Aa|#b`TCpچGar#"_i**/r'- |׃釐\DvyYƦ?ސUgZ%G`qّi Dڃ,Zv [O,ppvK}*LK:~s]p"ucc0˂69/ΥXd;k*:_*< } Up_&b4Ƞ: ,/k}NQ4UG*5f&<,:VݚxGڑD$)ݒ4cXXq  (_37#&t #6`z"Mj`tlKXNJ@˩m]@ETdނrFjt o_#RM m_%wz]ud]50dzȬ+q7zɓ82:0۰ehkbX3ihkz MsC0}* =he}ƱrlˉFjP&l {=Ŧ[V)-f|=5M>Da|)vG8Fw=FJwrU~]uGl'963,,,^4Py]Mrsb DUxCh\fUW+W>?5BF•fCWKP_.~BuM]F9$%uX9eW.ԡHWoBP"ׁp'"# uTvsL*=⚬vTԯ~N5%i2@.MFf\Q[.p'JTۗ5DW3Vxe|U!PVޅnL/V؃C`b'"A_c^3ŕl@ LJe;_7o@yMek UNW.(󡺮jj]j9Xd*RK#4#UQHU),oij9xv.+hn-[9vȷ \\#@FiD3edGX2(}nB JE;߄rFKrPyWlR?ۺ^gIJ#p@bvX`65TmLdڄoM{C]TUMRuϲTVN 2ChGqHOQR{:=)o{YUf16d 3B%+aIsuxp=uXkcnHk^ij-KоIkq! aVz'qiH=/ץ:S_S?)c"_R`lhMߨIK ^ IDATH ~]x&׌6˪w>VbڃgJ\w%_5ZEŷѳ64wvtBva_o 2ڂc n6X":'Dړh]Ӑ[9G"ܓ#)oI|Ubt$sU69MN$ŗP} W4^O!8P\ԕsS]9Uw-x΃ޡFf|d[IJ GF:v>]nnt r0;TW+CL`P#[Ƽ<_$R^ӡYsMXIWb 6^@h@ mmw=#+ox&R4Xej8сN} S\+#㔿rB:9 +FNǰGkw dXXXXXXXX|G8V1;m*/_иBB_P J_lp|4; Ӽv'韞5i$Ǫ` C8:h8'jj 2;P"Q&ҒHo eٚ/OMd8AW]buV3R:(JSxI"“FuM:ƏgQGXyIr?PvLU>36C#s̒WMn4qkн(`D@ֶ55~LMEm=[}f 3}D='?Ri/4?A+ޞEϡPrKBR]iiLNo`vspG/^TFDT?­lp^{xMнv'r6 kP7c4vֆ3%ᛵn#b!tmV=][Es|K= i1AXahмѲۗ`¿#[ Z }E״`>qW+E4:2;x |;r ^^;@MnYu ;dXXXX<ݛ_Ci)"/M@ݡ$Tjd%**mCӺt / Ɗ M(݀#6X콮EPa, fCcj]D"yWtsFAڛzm?k4NU[#[ho1H{1ik ŝ }.g"?Wjuu_4=k&?ǃCmo/-R_B56{}fށG~440 f$ D(ryD23 U6*ϳsEXaaaaaaaaC|M}0c>3XFhk"ɑhև iӿmuKʭHBgik*dϵ^Mlr}GOF5Po *9|_wAwG: M-+u `|oO *1"Z d83eM;I2# =z1k0(c5T8`)Ju.T֠uS!W=Y$Dw%>jQ5,37\q A"9}YkF@x~B3R+ARrsd:0914I(5exRwE<]DJKKӘSζ~믌~"5+H(L>\b'|Xt1>3*ij1p2}_݁Ɗj (vU؇v&SC}Wڈ\Fnrb Sϱ (\E&gT74ָ"W)Rci><_ԺG3BGuڲ ʕ߆5&cEXBS|X:J_ <WdL6~[:xH`;π% w5ս\{%jG9G Pˉ7P;ˑy_MD:.lC[s+P :;PlCaC+Jg%(,깓%hD3^˞4&M+蛬Eh4PI:xWR`'W7;On^nבmo8qפIIn'E:jmw8 h#,} ؗ 4>PSPat,!|W:Z'(aH`$6"VH*7g]WL*$q~RqK-l뽍)#6"NQG?nX!]X#ҹF\| <,ɰxΰ T#R/-F@v %: =45ws 8UtJGJo'_#tlQ_2(! %D_ !Pau4^{*msy<氺 ck-䰴G":܆@E_ɹ' xmtGkV:.`z۬;2NylwSu}hKH_\5[z=6qm!*S33GncqhG*2S)<%_7d T/p2!yC_kLt8l $qt֗R<QH)KX.5FU_qPoi*8!I uu>j/F M59Dy@ XkN`:# Q",OtҜ,ZH %mE@%5&\J0G:>5`udJCǫG"HCuT -se huG7v-⊗x >a $m6bq /Y0 >`ւ ѨT5ظ+bK4L`]lB\u LHW:uuΏ?a_"Xȉi~J?Q(A۸Z0"BuDBy uו{!@Z{"Gp.A0ƆL{骶eٻm]_N/ktnד~e~Dr2 ӕe]ONZ= 3u;r֟+zn u p! Yo=d+H>LZaaaa,6-ɰxi'@*CQ$=@.|IWgB`m[o8FpJk"$]So@LNKʹ*d;<Pн8P@Z Nc Pm֙/w5IW庐dˮ5x8-щO1E:Fgм,k(0j$'PنFK~j"%3Wb>к-M?X4xϴq*qT'YJR4)i,rnH0BkSA#u&iLǚк չjc!< ߑU<\G$P"-jufcI_Utg܀a[N+hހ֫rXWU2})kH?Rx=L!_V)^L!}Gk L_e[D(Ce]W<+-Gaɰxj 8RZ',,,,~kUԶsJsNA~]-{m/+@. !WGj xg ,QA>C%_ュqzK] P%7ig!שvWӿ|"~;fiW^똱G͟mHuX:E^־1$ΟPX^S.N9_;~&.T4ft ]緥o:喵BGA0FҀCR[4om+'ק)y 9 Xh}S Zفy?ʻ"(CBn%3DnN ^GEd,{*OOf݂ϙĐXrMna=|nE@$XO1E+JP+G#߂'kxF:^2Dc4wKcY/dXXXX Ќ8 U_݃8/"S;ڱդ"`cSuҹFW$M%.,ڽ%ŊHDt2.x4桳Cw 9@"4}_ӁI`y?eG;*n11ih,_ޱ7:UMڊj]r.B|]ב0pQhM3C @# ȝ3] {:ֲ+VT3iP:95+0+R4G6~ZG:g C2B$yPH(zWGq>g 4eǥ,,,,,,,,nF "Rχ穵a{_Zp koY(mWA;ƕvݚFUX܇Cu1)/C[`0•tRzmN/® /9(,dJy<>p`6ԹI,Ei]պgУ%ȇ5o)l_h.PJZxK>[`=ieUu;O`tAuw\N);u\Yc[RCv7=IOcV]icBN)',2"w1x/EIU9x)bP#PNN gy<JN7d:Ox ٪ޟp(wv2,,,,,,,,mpM`t5i"F*O:}}Fcxܖn {&CmL;hH4?=dtb .XڄU6UPCXR)K8TNIl + u3TW0_Q1nAjp, LgMD6/ZS(r"BYX)N2 5?,p; ֛')PUºe5~U_cekҲ \y)q \8?63UoPϼ0Y@I//nػ}= ¸[XXXv!0 ܒ 7i nҩ;P,TB|I+"/Ar-v9k +T׮)}|ց X+@E|K<:<8,`}&ש斴$Q_GB| i?5(q< Q۲)0C9y5 iбdq-pXU鯌m('(_ic2F3iY542U}99żq虌zM_lp|.I~[XXXXXXX|P^Bԇˍ)WсFG"0JMN`pfʺH"Xǁ-zl'l_D3@;>XS if/54=ҋ%qdgrL*-+wZ56d*U,MϠ2F*D! 4/_oܮZ7ߧ l]5:@QmuX&{ҶTq r s-tЇt)D^E,1ZD6BUκHPqG\>.<ѹ7/\CN[,obarA0p*M(l(%:wKy˱4݇PlSUA &̟A OҽܙNþzK|D:l賳)B~M OA)P#Q0<7^Rgat& IDAT _*%mms)GLI4')URgy1smB8qoj_ s(n\er-u9ޅ+غg=֚HW& B{S'ꬬUd9&@NXNVz[4C/:(> gG>aI[zFofOcaaa |UDLlS]Bڡ74 *m3Zjii*M3Dh(WTg#WP$MT8;Fkj)8lQ矿ɷy9 nJhqaTXŰ+ϩs+}E/AcR ސޒ@ "Ŋϕ i$4z;܁RI϶ TMh\ϡ~I9j=o nYBsuWyb s\?Tc=UM7`1uu`HNUH]񅾢dXXXX͕ܳoq77C4 *ۃ%Q*?"AnCsJNzOU={T<$ čɸ}Ck^H}XLTh' 5 <~EWn:&I BQ`U8{ߓ6+p3dtstuu)HGuw5 囔ѵSˡ4'W%dohl9Q 0?i]aw-uQ""a"jq]ei%_>&0yT;rX"ZީIh.k.FcN~&xkz 6x1 w maaqʴnK*c_#P UܒiC}1>=u47Ip k"vFsȨn3'(H݂Yi=j*JCxcm@]"4q.HaoĉNRhqc` qvUO@({>S1HlgjA vkk)[QG鼁"Ҁ(yHXqp Glgs*s5ޞ\e\e=O4?HBy >nI8]:Cwf>}'eFgPݔ&"Wӳ琜*A;AAGR[4FDsVe2"\Ip,r~_mӔk<폠4~WVPk2xhO$b?MJy|(Pa_+_3H#9Q1%+w( oܖD.]B֕ڒl岱Yt $XqbdJ`奡(T/*F:;rjWei4:LFFD]ƒ.}]R3Ch4_2wJO誳,LDZ | $5wK_xI׭_=8YkY* ƛ!">"#d[G*Cd D8"hC]Dq9kpwk߅XA3}.<52t4ڄDeLAqt TS9$rv*֔a1|.kl %7k,_)CbpWB2 O$XuS/mi<+_~c>T{Tuxwp{w| ?]`̟_Odlމ&/e۹s8Yp)#T%ww'0'ɰVӏ+5iF*Dehiv Um@ g?T0" il%Be%s )yi*6U /f09T5*Ev3e;T;f""B9`9|ޏqI]lZbԤp:Q[ݐp"<Ū)tn[q 2:ƗH7W0ae P"18 E39=KJ8" GWkNPuSpn V+7cwgjZ^3r+ߥ };-ɰx FOY"j{McaaaOr*jOYj LtTl( 4@ d@kPOLr5{|^fZfq2C f,ʟJ$^ЃښXPA s%]De]RnDkϠЁz)UpHˑto*t5v4܇yUYkה1x /aF\qnIOBuMϥgO'X]\iydݒ4QO6QP0Mڑ@.O;ln\,ɰx JZֿ|hvA >L\tņ*|H^O}U)Wdk3#Bقܨ벳;ZMdS PڑLapƢܪrMӛй$|E9ICXEsg#X)g& _J\ô^?pU]=.7tӆNN㾮 [m u1 xPuһ8.t6tiwIׁ"1w!}h?|qui69@tkwED0Jk&W#&^^jI[P,6pj_CXgfIŅt*@}N +)_h܂rePǠ;;8vΗ]',_0ɱÊB"0yؼ֡)?%hmd꿕05%z;%_KLNFD [/r/GPc(C!?h j+ΡvøeEP7Jc2z U_JJ!$3{zFpܣW0-2HEdqo$BPH=ڃE]='o_NL 7{W_AZqd+%KXlPD2 簡Aadpduq%Fd뀣~Oh pSh\^@[* Qf4!>^܆f=`"e}.[sXf[P_ykPp\o& E_IGlM~C iX@B0R'a=hlU5HpX˗!?1^_yU B9̏$^*`.`rW"{i/ZɖvcuPAS8P]KXJNW%uh,p,zJ,?Whf[8 |(xqzǰ$]úKYXX[ P*Ir*#y]Xu3i>g+ee&vL0y@ayB u#1% T!l^Nue{dNxd๱!>wU+@Ff 5B6=ճcMT{KiS2Y 6RPB:_j,|`K̈SZ/LNE: m~ ÒFT8XH$^Ѿ!ANFޗ \&Kĕ </K @d||oog,,,. ±RyHH#<3^=l ? [P鋦pgʟMCSr8+@ͩTUB o[SٱVjvKG/i\( `S_p}I]ݓ LJ4`5ΦP,KcGPmfE&rM4ղ+e*,@ɩ:Lh~G|-Лuaa#$9đij rM5p)WD82MsGy.D]E@_˰$[DnC]+3BȞ6MU4/19i-u %jܑ+Tv֍xIx B;2 uޓ30~ g䂔$fRR"w>HsJX*W>Ar_* L_)ȭ(obH?`:dX|Q$#\h-i,]ߕ#7$ֳw"dZgI|}AWd# tnbY sݷwH:0ٗ6PWV u]rMh}_VNA@J1Ti0]?K2,,,,ە'{X ˩]ʹ~c?PO @"WN(|3U%4?r"W#$PBY>Ύ@sWvߑl!q. w V&Tъ@Q#4^5< jX= 64Zt=S,"cBgkʭ+QP_9fJMw ظYC2?l.0(#O 1VK$d%.C=iVr/Kf|*NfF&Xaaaa6(%"kj;LٞvgfhQ ߇fbc;A Uu=PWPl݇,P[4k(W1>3^B3S(S=D*mYV7NEp2d ܪHLgq&=EYfr̊TZږ:7\ZGzfUcq ٯ$v2,,,.]Vؼ u'L.&2dK?hfb\'u1 W$2Ϻؔ;[{P kޑ.! :\_`LU8jhUH?Fc];E8F mGw Һ=7L7#'B*[rjlii\'I̎: Άӿe2ȀPSLX+dkԷIH7$*2fn:ٜT2t$hd7EG\]]pO7̋TWԒ oܚ uRؾA2w]āvģK= OiCu9Juu"ČT$hՕiX* &c]AuUxsYٿXXXX89waڄ5iɨtZ/C*iF0;mIM&]~.C<QAB.P(BmMת5b VCXu9(%KX3s/Y$"8P}_K+r KR/}354(bQD'*U_1GF lFg|]S=U`` ͸ЌO5 i3~݀"Eټ\2?E=ܫP2Ʋ\cZX 3O_SZX2MM-^\@%oA.W\.g-4oK0ԘPa!:@59ZM"L0F@ pL$ɭ@eM|Me\[CCuKF.%pprn[<arŠ28U{fmq!%oAI3r%x0:[NYcE: R3hox` uŊ,Sf)*/'[jH j4`<}8{֥K"R }XۀF ";mW$#ijLp IDAT t5EPݐ|qZrc;b*r˫+΄<3ZD_4`UGGd"YTa|)T>oR֕<{ѩ՛r"m˹HUu[%Eu26$ޘ)*QYTYw&A|/VaaaaXo'{~=^B?3S+[p=T7-@Q8P:r;PAa<S'3cP 3w8`6u z6IaFzkrwc_%n8C{?Tp3 O`: gR( F:Ly!ն:<Wοg\88pG#uOvE0>Jds-ơ)}]NO㺮ci|UrKT"񅽝`IŷI_BtqM(Td!3J08EfuF;~"+M۟(ϡ-Z|N 8X>W?;3žzcP]L2кEhH2:Tq?9X|lfpay(nCr:ޔs=X،{&SƒTg҆FÛ .4JQnd,)׿twa ${bK04$Sd |aZk:3\ޑ/2m#DݓLqK");ꮐ츔;~XXX\< PA4h"ḑPotBP@nF6B_Z*3cW*41T9`6^ʭɁ)C%`w`S;wapV.i YۮB/})֤(_p/ TUgO&sZ¬^&ѻnliG':6iן36oKXZ@ Amk0l-@s}U` _B|`J Fđdzd4,(Qg+nՌo63hܕ})Ykr@NŷEҞ஀ׇ޾0 N%/ե8;S bEV(O?rGHGb9WcȻePII-=/7=ڪFf}ҪP"_nRҬ-&D0I xz[EFECﯥYN`_(|7RD؎ S 3T#u*UIgB8rʗE^:m,@{ʳ^s^I[+ըjH#Xɉ E3X &/kK2,,,,1l'‘ ?ҟ7Jai5XEor~kqU>U+kbuWk3dکOc#5R, k"u(^.!c UPN` 6H@Pq#e^t4d̵ve#[U!{@B} T'u]p|*wExz'&u:g3%u؁cF4u)= /T>Rn$ZgunϗX{yj,AB]uDJ3(DȲzt)ij4?d:PWԒ ,,,,9j&qCع6Cyډo^o&;Uv /reD(&}]c>DEP#S9挍mQݐʖƂܒv [ʋ(odi gOaT|c3bZy?hXUDHh4>,gP0ݜHݏL+P^S"Zx*?z%y؃ҖI^$|TǥP 沢v`/e1r"EYHjwο~F!8PCk-^s(_{ ss0.T.I 5i)3hc 9Ʀmɒ 9@b\Cu2:YY;"@C(sj߁*tV`: K"E] q!.i ']wB= Ľ:;mUVIsCb͗ulI"„J$Q=>=hHvޱ_k3޵#b>*!4dI[qZI]j,,,, {rʙ3h+J.` MDvՎ ̆" 2$W4DAcAk%8P,DVܜ)^SoK ^n(uξTu%< ϾP\ui7иe}A0Vr cVErEْsu<wqJKĪB)C&qh(RY[:Nu&qpS스ȸZb1o:yMݑuxuAk+S$JiC2C׭B^QK2,,,,ނ?FڬP(^Ђ,,,,pCuGESbdQa:ɮho`9sr[I *\Cc:?896eXp9hgԥ(׀&#sMGc=k0\럪~ ]#m8y(I|fs/[)Zr\{k/T: s(UERTk@xMzN :˞Ѥ Zÿ IUL;Xe[+uL|:PW%WQA_Us }- ʊI?UgT#E$cv?!?4HVӞ:E#mi+ӹR/zP-A@%IGd#Y U^لy]<=W5^^c'PsX,݅CXHt%ZO~EH&k@ X\iݥ,,,,ނDau6p60cKnY$V9ףо8ԱYW݃@{SkQ])+؆J];Q߇߅s_JjUE?a|N.TS*TkN OIn] sfdgPn)w Ls-I_TÃs"Roc1W3ש554:@*A} S]3d]Vй]F @p}cug[޽FhيF2yR3Y~R#Sd#!o%6dڐZaBh,w!>P#UeEp?hd)Me[.%Ztݫb{t7?.pZ]aO^.DJ8];6e[[;wt_ VDrP,iG} î t[VX`<߁s#MX} tGKuy3-~)p}X<ilă=+v+_2QC(lvg=XzOtO]-CfPZxB1-CPX02Y C`4'ɥ+APƑvev*1ݡ DOrʐ.ـkϠCy5|r]8zv,!ہTzLV9-g|}P9Jc;WR[jI[?Te;Tѫ/PK2,,,,,,,,mH0Էi)qM#:ق ^O\GpcJyaB:)u&*G0{fƨ3iGxFI54JT)099dp=o''o V@@ҁmHǜoF,wJfaZ^Ps$9F,?UNH< ^} \Q(`:237lܛrZ!Rɉ5DHcksaHĐWuAe/@XM[`EpwpC]vcOf -бƗƀo21qQ_2D)យwrsNA粫MʮHC K9Ph9r:ZP 5NT!)x.Mu4kC{F3w!Ȇ{(Í +o@Zei.uu5a%l_(r{l_\^,9lB]s(Uu?@mE uvI"!NG"[wWn ]-yJ" wHIkÄ+N6nE03C4K2,,,,;daaۈXcbA~Mvtv4* [LUt^3u1ۓW`Xݺe!O#fx_C~E2e! u29i'?@/q*;$-i*u Kc(¥GHk+о о-:cOILEz*}z;k#T1[Vk)qуƺFfC+NrW2ۄD'ʸflTX!X=}m襎|-E8u%c/gu3,ɰxOay$c1Y_cNc˯$D^%&L쩲14b` Mba'@$3ٷ6+"Rل{"ٚDې?ݍ|Q2U}- F/ȸr~*ps0=Ɗ24P9+L `FEUwfeu()["<3ay^x&|L QP$dtb. ?,DN2둫YUz=C̾2-<4#Y$ѱ]KqyԯAi՜bVaaaa&"n+7A8Q7r 3/mYF YΦ&t I(tJǑw;:>ˁ7 ݒsRRiilڥ/  x$,@85Y:F87éHKXYkeC  pwR>) (U·rSYNVdhZ^ I24  o(׮ k qWkƇn*[\.~0^ C=6]Cp6aLLܶYkUDH .LC~;E dXXXXXXXX|KkDj9d(~KCd t%S HπugGͮx u:u {иjpFrU+P>*MF번|]c>:ehhYup.8'At|ߌ\V&ȨR6)+U=e[k\Xk2k赬}cv#(5lOvåz$"%͙,P̬@2]X t%j/]h[qҞ3˼C.& ,ɰx >7z\//hEDsOڄ4\^Ba+w`QƖ:L@cBfdU&4ϟ> ".eG@*G#ؽs<["v#(oC/ )Xln:KOvT*4er)2A"}wf'REe2f$:= (kqL QsV;8){&vYrHXd9^0{ zx΀L?DQ%x JywTOڙ},]]]٩zUC&kkTðFW,T:-|,&Īq2A]%16@ ^e]+vv%}G $;T#w\+ފO SՄdgj; _)9|(́D@Sq kˀ4Ե8ڬڷ2jGL6 ifgT#BSif6TX􆡖-bz#ʡ(QrVX;CO޸,Hɀ"9E7]q]E'KHnPsILSM/R(RHR\T@w@Eۡj-jFZw8Il-qTdT8[|K圔9b}>J;*¿^P 8iI AŮ9uѤFF8 Q{ 샲L?rIU؍M~*0rӭС2hijBBj'lH-OU񤞀DLW(ycSש[5M{BQٮEĺTUi)2FmTхj,M5cSdeK-AՊL*<4 FnDá= JYhPm)g mG4ks=*愶@@5h65TGUQZAiU߭uR+g"J Q ˉjQlh¬4kg6Qmhc٪'! p\z><[~TZdQT8(/U#F 7Vݦ'{ݣgZjMͯU5)MkaV^5y;g/j<倣YOeV9Il ч!? ZSyZYզT͓{R6h16Ο(VKsxr64Y-[|fy+g<_BH^1m#`+2[8r\i ګyjU*[dmOP+PvP9,6ZMZS& PF%P򽆮¡l.5jV2jV2 #)MmPI.& pai#PvaM\ֲyR-M IDATj Ԟ9*A6ƫ вkG hvmQ $X!SL -UφR9Ո^ |R;0*OAjG97vjBB@Dfx ] J_lVZ^6#Ǩ (ڵ۰{ZSB*k2G5܍rk/ SDxvC 5Tح9\5‘S(D!5-;*,RXjq@9lze}wGkwT#,vkCnFN04e4 BLk [2HW+Y]ݠQq2AXv]Ahpp@D(V* ڬlZ~x+P] l4?Wj.e5A:3ܻBk{_߫߻6g.'Q}RW[ǺK, 'mRkwqGEq2ACkؕ~1XM߱AA!!e$\JW|.lj1q2AX @TTTѵ7;{ ܭ[r搑1_M=W|xq2`#fʄYλ7_C_b'˛Z! ppp)))|x<6nGk3;z1cW_0}ƍ=FynQa\֬]3?ż睍G~豣dM-JXASRb prQƎê/VWk>bٖQ^^Y2~DƏ;oՎ~a^{ﺯg}53?o-vEG:ԮtѝvѕeɌ;st?[?tfpJ(eepퟯcĠ39l4O>T(N B5TK(--OAܜ\hߡ=_s&;[9qqq,#V^Ϋ^>DEE{tgmpuY|XŬgU{9܋ϲzJF:3ݳ0jnqpMv?L޽4x W~_k#{\Zշ_7ؼi apu71i~ ?8[6o?믾Up8ҫculٴNt}vtэ 6t:5f$W5c\qmyd˃?Ħ7GeE%99tHyگr57{orUZ!ޣ:#Pʨ1ftŕ)tn8-{=V,_ALxqNr 7mG4{sZvERR"+.E4l6}1~y 4nua5; dͪ5 :IgM%so~K>sxKc AjAhNt::m*+V/nS^Byc$&&ѧ.&1)T+Qu6N֕/V9v0j>[X-97٪e0Gg8?/çwUbccqfv8KYG,#>_̛`: _^{)Eo՗_0v֭]#GL<CqwlA AAㄒbb{u@x<;TY$F>|x9#o7~uU~i'۶ngFzUW3g|B!%%^:u"!1?X@#k&Wu黰0HSQ^^ήl2~W~{())!>> sә4yoĪx85$d Tñdh  DyY9Gpᠤo7~c3bƲzjmʌ[o!55sx<1>>WNLemw2e̸i&{;|&^ྐྵȼG3b*XaT;<< 88NӦruW1o(v3\ٳωld` \z|;.R=w͙_ K/ӵ!9 QFBAh(n󶐴hCrd^뵐ƌbԘQ)gOaSj|֘q3ntHs/>[30Eu LIB\<J+J+}WW'˻ D A8q"Ahx<r2{zw{c1;aF;Ct2B7/mZ; sIp%=䴮յoC\/In'CJ*((=y $ '*&%ImԢDfiR 1ha:5}Ow8 p9us2HmAaffC7N{R̽L-H? {[/d TC/ӺAiW] |QXi7}~l.æ®NI;̧ab`ӵq2M]}e6 '0cB\t74 (k5'l6;i`f la蘦Bre5s]7ll%AwmMljiA8QKof 3q0ߵ#Μs3}.IQ0M1st4j.cĉŋөS'YhQThUzVZѥKtÇMo ]H BTF۶Az#:,?fs)\}lش8[MT{{졧N89< ;v )) 2n>s#Gs]o(ow{,zs饗*DSW/2!PG23#CWA8&$; W|_z+hgvj6=vb…̛7ϗ_0`zE2d˗7X%--MA#Эr2>DX&qݴmݎ^i_ҕKرk[tlA˘kֳ#M0Ga̙<裸n_ܹ3wt҅U}üc4M:ӹ}!ekK4u"N B0"K gRvbcepAjOw}kx?/|ԕ?Caqo fpoȼDG>+&`F40dn Yn1l0֬Yr}ȑlٲ~LDS&~E4Yl]t7oM6kK4u"N B :҂Ɉy4-V*B4'cO9ƈ޿̬oہLLth6n#Q@ P_Zpis5.]ʆ Ƞl8 _`A{ꏅݦ^1yd?'RzcEj@A0j0QZ DH{ȽB UˆmNI)jٚm:p$; MHIVi)ikݎܣQOv:f5"+o=Þ={ضm .dĈ̝;c߳uVv7|(NF4 nk/ؽ{7[l[nӛJW/2!Nt+"/PV~+!*|EOhU^GbB"%%b rIOoER XDM>RSՇV栉u7rO3i$ '11#Q7̻Isrr:u*ҥK=6t"N BN‡/Ce5MlI|B'Ź $ e8!%=ߞkHzqi1:Wl4Ш|3Mn^ב#Gts$FzUuߌ֭[?䋔^q2A"0W%_EވO~Cdnd&A:Xmp f4L 8Ơo6456uosn!cx6n cs8VE}Y x> _mpfmvEk$l6˯۽qFjWh\cY9􍦮^foAfP(ȷQVVPM3&!%J`pa߼N:ӡM:q_&#x #ޕPm쨭`3M}OwdxcS4QGGVA ;ttNmØAٲkk]a}\AN'td̠Aa!s4lh)(Z75clP ZȦiźE}Ow 'uq$?ŒFAhgXS"BTp8ē[Mrq RSPkذ-񱉴NiKyeawM 8 Q$z opmis\LAA80L9DW" qd]M(ixwD:pc:n5>.C9sxgH[tU}OwɐaAA9l8$NB긔h#_^i_#T4lf+DWߓ4[bAAHs4/{!d [AAh<ΟtaS QdM-   'iMM-   1YyX}TVޡG|l߶E"0jh a!n<֍غh.x"dN 4d3W'Ɍi8NN'Ukü\rQTZR8$'6=I- غ[7ucNq2AF3h~K5&%xt؈Ѽ#tЍC)71Ѽv5-hfnbZML߽_ǺG+ L!L~ 4"<4\Wt&GySۈbkuxQh*=dz2m81%t8C~^gTuSI P] ë iVڤ0ML*T$x~a]d {+F3"5Lei&f 540 izm44nUa*7 M5DXaz/_vogzMoHNLv]F'G|l4 =׍G}kRpb|Vn 2[O4G4U*#U`A=_Fa SiY8c).+ IaiʉU)``ZU&$Q2m^{9w6|NU aPaXJN|ޞSo:^BՖ|*@hfFg*cj<\Zl-[GB'CzcSX`2C6_+Qe9oo3YC`z <Ϭ{VUo Fs`]Wz|#o x%؆vhdjhVz&^ aU+<+ 'ȬO`Ti$ pz?bkZl][75\媡W'Czc0r44WZh8ꡩDWJ# UչA1Tw5aA. Uj!_ b#40L7`SU?H* T#3/ewrf\ħo2>̨>;+'3@7D-Hj4PžU}T70L{;{e[b@́rXs]jt9Լ q4V>7rPVfSaO>L# =7L:V4WVWN*ƬYm6Le0 tbW&JW WeUJjz3K!{V|X5Ξp .#xCݼZ@vè1&[Nc.#N 0u<S7y7X%UT**ʫN%eu2rT-3}<`> ~m|>:6-лa~G z/:1FoF@aɓ!.tiṾiVVos?%!$4-:Zl-Xl\X=wBY$q2A7}UǸib _V"&ó̠Lަwz+pLb> f0 t~M(ATMO % 6T!{%Y5|41ь\ЌLZZZz*G/4*jo/z?ZJό|RͯIHHhٯm>^*o/~×8Whj}/x߯ikDQQFݎaO,|4}Ӂf|w3Դ԰:z6{G?LZun([{eodj,x^xEN'1tw7))&~G||g*\wqq:$ݽĤDf> u]׉4M֭]>O>5,#hEɄRB=bᄑ֭["[w/_aհTHPu5TfxkS.ܖp ׭"!!v$55dt?\-T[׉gpͷ1t.rW= dݨgѬ95GIDAT5NMU[F^~>tˍsy'sΝ9n.\pQ\\[)((K/n7ǞW5v}O|[wѝ;~bzn9m[3r_}T~MS}xtyFxuә3U:mǼ#2d tz<-yr>_o#C4디rjSYTT\{< h4kK/[Iaaw̜ţ<]sfs۬[ٵs]x9_[7p搑t==!N &\blAӳ|W哐iӮ !{M *,2vC8sHHkPNZmbk?йsG7{ct>[UL2-7ӳwOt40v&$1Mu+_qQ17lr1;pz.8"wF 7\~&&\p)6A _;e|%-Ꜻu]Уqx<RRZn InO#>!]w]n٣q%1|ѧzec_%p/}z;83Y3gӮ};t=v~=ӯӦzPpԲl,jT~};A^=ټi3۳r**>[9'g00M0qr}Ce0Mt9tO> v?˦6qͳhŇ={\:| .ҢӶ]Z6T5Om[4ys[|rsh֒Ysce_s}|\|EdPr[0)/`+էWW7[+?_Yb޽=ͩ=NEzѧ?w@Ν2Zull"O/6>Oh֥%ݳC|#dggSQQAiI S>˿ߝ˶ۙiABUO膎aֱ܁C YB,[?-*o!B1L#◲7hGXk+~xT&N7իq2A7F2W~_;׋Hӥٽk,^Cda|n0gݜ>h@P>ö-;ر#~Kz4 G9'USXICٺb֘4u?ihтKr30M]t>7|=/ukZX+ɛ]ۋU_a>t3~n7CA׍n$Ϲammv+>v۲7ql#qw[o6]v>NgL Ѝc/kZGFfcpş.;f֫g uCg}Z/yAA}CtCḡ1|ѧۍw@_JJX¢Wǫ.o6B1 GU 2!B tXeHQLӤUVx{~y'?O^8llv2qM8z$dp;ŝ30;dzS延6KW1`s?vj3Fṏ0ds15d`YJ8vaߟo.87^}=OJj \[|wkiόM%IIvHaő,\.֞v'8q,}i.WkU2ڴl˾_w> E<-7!غ[7bƣ7U[T^;>e|v#GLtd2!B0o"{eܤqla3:pf}! n%l.W>[7bƣ6%ccݎV!Bƴ6&gq\W|9ٹL:.dRf]b [S 柰 u[7bƣnNzXYs(ST\ᬃ2] W Aax ȱg+7y qqq!726d^ao!uuT[7bƣ&[7Ø#Gw0y+mZf)%N ƷIV:qSdž_Z:VCzBn u[7bƣ&[751޾vvmq8|dPoe!.&5܍I/d4Wl-֍غh#=܋X-tvvfb8qw#yiX 4ɷNG1L SJ-),, 11!D<(.)eغ[75dMRXT@S3llݾVik_facp:{ ARb2G2;hhD4 tNV!nNa7= (EIi1YYw(9Ea󈭣غ[7J\l%%E81l6;. aL'C8.hINBd dڵZfNuc77OFT%Ǟ5bClxMb۱eN!4;4 "4u!n<֍yu2V#Gl( ԅpsM-   '4%9IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/rxdrm_segments.png0000664000175000017500000000075413203343735023775 0ustar jomajomaPNG  IHDR >}sBITOtEXtSoftwaregnome-screenshot>IDATh훱N0Dgh(鄨驸 t5%5B'@ ?ĦcL! 45vvQYB8 vBdEᅖ?gס`hu@q$C#&kb@ Yu\5{C%$˚?v"BDeo3fM3' ks&, nԓmu-2of>{=c͈ IDATxklUnTQb<1Xv>`L4D !Q`jAD+)Z"tm & ւ 5@_v{[evf:;s3{>f(1hjjB q(@ͮ˖G_WE"{xc?|>:‚lJ%03M M ͦswʊ+J+*+žvMXm,[T\pco;"R1N"g>}|˚úE+>sO_bGCs6oAqQ5yG~ om޸_ms֊uw^} &n zĉJ|X9Y^I%<+.|gUۿ]2. 0@۹lEl3eS#[ݰGn:mK`@;֮ZxO3ot8`m-"!-3'1iڔq*[vԩn\:jUΛ5c"ЦC{7,.()_odލ% A?%iQ|[ON*د\Eo>nÝa `r)mS2DBzW@-NQalÑ܌; 4 h@&/3f:/} CLX܇UK'4nz$#B^PO۞^#kv>tzݜçюBJU^Yr5J/`NN{M Or;WZ88dFD tCg3s׿zB╯hAߕ| )!dSBc4G 'pT92lJٔ)!dSWE6 \)ej4X܄ĹWUT*!O3DRc#~ER g %+pibvkaD.|}SrM ewuDmk;"F&<8pc$ xP~w} %|6;gF{soOub lP"s ~Ă(l*|Q U`SveE`dgiHﯬpnO_HDHXTӭzbVŰ,OtNE~8S(Rh(1/zTfp8E9HO``fQc y&h=rD[OÜN1/ =%?p){'[HspDNM\fvX,L$ؑ눌xFfU5b <ͦǃܩ ^N)TYN^8{rE.snKt}M;hrBm%H$:I ^Gm<\ Jݜ-ك}ږi˖]TT[EYпlPl˴#9=g$@x|р1] 1?ѥ}`uvS,9n 4/b1/*t lU*_1 ޷Z_k} u-,Ls^UPWZ[tÞw !ȧtY@=Z/(X#al3"}][tW"㓓,J_-1[B!Մ"P``Tht I zY(APR"s6UU}BWMO*3B®}E\zw+7Gi)$+BB#BRaZcL v,_HLjGZ1͗n$AqXu>y]E:;^92.q.,i8 陟m*& (B~ER'AJW!;(?$"@ߘ;ۨ<={I AB*Mj![/vuS""Bu_),n+T G^ [8+L?:*ED"n+B1%#ًϽ#ĔtF^M_m+j&#)CHO|H$u6@u6}6P2:Je"FgDB0 y9ebq~a>f ].FTnlXj /OV2!e3b46GK9{@`]>t=Īv:,rfQ$}g-5GUeD:STܿEaA#9DWTT5ڌ>wH#^LJo_ki!aM$x֢bU~ފI?C9Rm[_[:eA hnj)}JuF%ʯ(Q~D!&ɻ=(&UٗVjDZs\{HP_%YFύ+Aݨ7}&>5ZКckh縅'^ <%t0;[3[O2iwrf`d[y7&m]~E|/@KX=cnh3: مHFy/it戰/1RO,B>nBL ;4m%xɹ6 Oތyf垗B|vacS"l\~>yUѤ-8=*/[,:3.ppjpȣfҾrԌ}oFi^sA`ɽcgs$x/OvqX;^Q}+ 0 ֬&mp ]hֵwgA>?]wurqX@`3rl:!&)L 1R>:Z !)rkDoOIU@S?¹_+Momh|c@#-- L_.W~q0ģhzf/yϏ-> bnlGgW,?4]>q@ಋ==@ݱl{h~ʏp**IX(,*MI]Lݺ{6i򣿏/7[`KNhQ$G]ߡ/X˓3{ yߟ2H\V~\9ojXYXW*6z =՗n{ٿL02 ^}{4 0ФEmZ?޽&$`L4/]rY;h6úgf#LfdD,x]y?1G_S7[Se⬳wUxQ_\!Q_D"Hq Z,<ڛQlOjifh8?T\YL[N=| p;&&0 5瞙aۡv#&s՛{Km?Eo {;B UQ"~ ,9d ϕSyl |Bо-֟iv\g#!VSx?fR&y].Kfa7zMZVÖ32}ٔ^r E 7,J?֭+0Mpeeid;qk VuƎcv|ร ZqfEdt)RTXJ?(RJWJ(RY_% EG;]$^xͭ.: 66&N+REJ2L-LzkпW-peIz'eįwdaoeh5lnT^ͽ7ޑcff`fke2n_܏_'15κ˱BTvahhc#^? 耳oR6XZZZZy{/i:ϥ`D4c-6 5_u0ɓ,N]ʼ|ߐGvkMIlAp`k-Y{LgV"ڦ)Gcہb6];9/d(eOǕ9smϻ?횭M7RIcls .^yLogjB:yiSf—g8v~wzVt`aKDAdT~O^a=tu1ݪ< ni{wVSd~48"/9υ?=|M *aShhUH0ibIH CfJE{1@[kc(&%g2iqy[ S+QwM\\NLs2adiydJ^uV`}QB7Qc?)(.p/ 70fJ+KW@IKD_;NuR _hMks< E)ewAcӗNl؃Y3[Ơ!0d*O-=h۳5TjaZ$Lpf Iu1o4vGSQ:h5kޠxkFV;f2.>H.z5zv@ Vѩqzm{)aj1;IZJQlоXӕY< C"`4yh5CmS+?[l9ʢ8⪨W'6`o%LD'%H7XuQlt[,B ?ܽѫM k현Dŋ)Rd-qAY#yqq ??GWb"=ABԃb򊊿$]N홲GK?@wٚ1@61i*xIJ<qu2w_V6!}ߎJ]]t:ıN?m&`:wx[ L9r 2ni@Zxm\-,L>4~wF|]`PL /jc'r79GҚ;mimmD QyECެp4q_WhjfTd^ΦV3iM]:R K3߁N=#$) p>DΚy;tOcڼ(5$9I+uL ݥ}.(ޅWJ(RDRK+?NR(ztS?]6T^cv N![wYYqll-Mjk }O|眚>|BXzyB"IF6__vЄ=&6 G5wA> \}-6zѓM7JV܄'CU?=Z2RK3+w1|K`]MRqML9s-|l:0~_ "҃$PfCOBx8s,M|ȒւįG ]#m兩GI}S"#!kqwmД{(.V7slߧ{ VP2Pj"f!ʼm4M&Yp87l$d _jEY W/_ ʬcdH f °T63=xMum,hleE:#l/(~pp K? QJUW[ֺAν$t60V^DVwl”e]k,c!=#mU'BJ"LB1_&bb#Ez|EفNO(% ǬnX3ƨ%S#FB9^]XﴹZAlahWun,`Yہ89wWZe[EX ]ִТᛂE,,i`V'>=+d2 ]M#RF ."J CϚa3Ϫ OHjH)UaNYߖHN BY/)>$v)ae&! uT$d!|' IYZZ<6>Ն'8;A#E 1;y?ھPǹ !jJ^Nn)cw"+X+YM,DYyBRVaxBb칻 (=k] }HZ#߷(QJWJ_O23 퀿^b $T+]f?ꇮa(HۭXdz}忩L9f?hUr0$-{5ZH//Sw 9/I9y?כEb{ɓamhCP/C}[niL#H [ @?{eegB"(O ݯEDb@WZA#"^ډK4yTh4vt ߊ5noX.̒xGʴ !w;5jB!= ?^4J#} B\"!/%eylPs%}} B(;7eyREq=zP,y?`ǡDX^!Ľ P%&o+2Oy-lڙ8ND8 ?u!<  3{؜oM?I'&/I*!=DŽd)$EpNveiۼ'Fe7vԁ3SoNIRœfDemfPWS'l% ũWMhSIQsUOGm0u<^ $}9d}(@.za)N#̑7{PVA!b>!Iba﷘:#y5I9u Y}櫬/.J2 TZUջt#S%T1F1f:0 xB%[|<{DSmw qWia C9:l`z|ő}f)hգuQlQR$!ƿ7a( 䉅?|{?FGKL^;Lښ\A B@`]~qqzlsKK'ʀ֐95ZM9)ͦɚ!&֘dl4P8 aaWq_?Yf-5C'l!lޯC~mlޯCR %ʯ(Q~D+W{0{qf^x$Hq%򦙡G#ߋMG'zMQ{{=~SF уՍayr|NV3>.6g^9{϶:"xkʸ|0.;^ !1v!t˂\enKVf$aƑ|8WC|!aucV7][q0odtt"~HcT&WCMgݍn=7>@EF/?=U _y)G"z+f`݋GKh^vߕu nf~Eu/ HS <<{[g`;& %~IDATB-qnA>2c0IګlE6O )1q^NCnڍ,~]%~@}LHf$X|kǐK6HWRP&k'̿U.vh^w֬G˜l[l&2/q^9r7۩KG0OqlK0:=Y"Doo9s@e~[%ʽG.O2 aSf? ܞNyKypBު#3{~8!<M +5{k!eJ?PrR/,Ud?\n#"(Q-u,~(ޅWJ(RDז!IޕA1y 66&NUs-jXܖWB(7~kǗNoN"&OY<Кckh縅u9TW+Yw9|}E[=(ξ%f&ffnS>* V>39*%\n`bf^I^1013AƘL 7~lJ9\ygʕp:j.fdLv4$ fI\v?xM\䐵|7({#Ni fѺ M|EX]-Z^Z܃b^n nCJ^z =n엻}ѾDz['ڇpz3!T. io1v{6@_ife_hZ<;x#1/rM+_Yf8aP}Zm jdq Mb[U(m(y,^GG7u;P_ }qIz;.KZO%_EoݝPiY,+h>5c˲|ānwTa,(єj my6 o8D \ץ2 7720]jⷡGg~Q:kZ% _Y}vQڲhLJnV9kG`EI9*~0 |YrlKäC6с*뀮WɞAjޫ"jCN>~@~j{J(RJR#RIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/statusleds.png0000664000175000017500000000310413203343735023117 0ustar jomajomaPNG  IHDRnsBITOtEXtSoftwaregnome-screenshot>IDATx}Lw[@uRT&bpډ{ L4' n2V3"  (*̉(/ B?dnq\'CCz|s,UadL'ryy8 h҈ص/Ϸ#IG^85gVoڔ"r=ʪȨ 2w&({:QuqwZ.Ox}C>|]8hG!eAU*.Z GTn|Rk;Q)v `ɋW1%Zȍ`jEnX:)1W1hRGVj<֐qr<eE﷭nݚ1$ʨ3iH2Z1>;؞1='oB 2wD';,ٕ#K9WLl)b Kg(=9V㩬g/W6ܽyhzHM:ǁ wfV]|/ﻟo67\k豺z_MoH Yo(PIof_翯R銹y|~Kk^nrO&X?1kōĔu3dvF?Wmq9smoߜ*z`&BBNE̲3FnMԧ~&DnU8[щ0BBY# !d +((v6!99 [/ bA?gal%''sۀV,=!0VpWc CXzroP(#mW|6]clbod[pJ;&0 a8B6 GBȆCٰGHU޹0wd%F{؊% (fM+VC]*a+0{ 0b C~B 8B6o2rIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/waterfall.png0000664000175000017500000050360613203343735022721 0ustar jomajomaPNG  IHDR&hsBITOtEXtSoftwaregnome-screenshot> IDATxwtTڰMOm{o$$@  "*6P ( ]Tzキ@H#I2I&23~~z^{?uw7f{a9Q_%_[o_Bſ V%_[o-Ya@h3'  TZ ,@Bz bxRیRIeє=0z'} #6`8F~U8;܋P~@~ 2kqaRih-DFck5b!e.0va)Orve;q⍽41?|O`ٛoz tj(#‹Y ļ~$ׯQJm+:Ųb/&>F `>" 5`@ `ЧG^w(LE892cO18>N`.\אېY-1 u$WW$}xob1Q8Z M?ߞQtuq{-R!},fvޢG.-LF\FO*l$›w+݁rypC83 ^ xy@`XXgїYL-Z|9lsVkB[`bioBX"Q BJX;r;G<gy 1яh,"Ɵ-HkյCW2LF3HG@M(`ȃ)k%#xu]z ֳ{*>9EC1K!)#>ړy:#vFe-腅5JjN]")ud#VRD ,rhfMW|j;hh ,,pˋZ= K֐6 )t(yy&\+AT+prUMQ1'/`2qdBe#%x"p.5Ոyk &Iz7O_M )`` ( Df1ptEOe Ne ߋٓy7yXDR4{F@tq;:SΠO1ٜPbcX2R*jjD"aT4QSOp|\XBJ4qXxKs,AB`0?{{SS 4]`ا΍;@yD'#`k D oQh]: :DfEJEԏL: Mr"+/EĎ XԱ6s'LR:yk5:nK{+D1O#/O}%3ȄBcm2=9baFYAtt35Hӹڅ7^lCYyRhSm7於`hkٞ$Fc.Tz2WٵZ<:KʋNVD<y?/Ka|؟@PtW&#ɁDyw꯰(qqZRNq&GGq6\7GY1VFf3_n^bޙa}va`+m )_0w"Hg\i1흴EKz`&Ee:Ck5TאU=.#qu';qPLG~~XQjщ6 1YB1؟8QC`Js?bi190-[=qttɲ8Zl{+ 9 t2b*~q+ͩ,1 `w|@~3!x{芇-C6P@c+!FϕGts 6FĦKq%_`AJ(gW4&B]ޏWE7 ctB'qp6GXm2RVcGĠ8Щ}+y3(![w0eT  v) `3 0t|4{ kqq.8Aj$j=RALLO{<9|I|3g`>ymcYqNgZ /c=ט#$8>tY2{K"@c'JQ%988D'],_%fx#r|)ߠ U#kx'cn&tb7=oK)st95٨[1#paiP"Uy7xa,%$Fq"F䥑 7)exmԴg4kCČfH g~::ۖ=D()lQjp@#?Lܡi`P¶L^ȶ7u{pb%|x#%+ 3XL ؓbD"nt7Ѥޞ3[wRHYςHl:3qg= p+(Ms:F=⇫˖݋rX5VoPΘ$">uy=4Lf 7Zf B"QgCV 3"sװk tucmIkVLDng/3e 7+&:bTa`n3CIFi9)WbL!L]4'RBS}$ja@eEGPʐYP} @_c,)}(߇Q!~ xNFۛxv Kl`+NV>O9| ;.^~3q !x#E&%(68/TZʎȼ ϧ֎c VڻyXE՛ +p.V2DSZĶ@E+|.c>l{X{qe8^vІ@r&]te9S]he.v? dmQy>2w`4lMu3Q Qkqa*Bx|iD<,2^d li$nQ 0ey{̞+8"PܺoW8=h8cM;.֘;,C +oXhtۍpG ؛ qI\ZK'n5r! e7S`eLlc C?{b0:o{w++0j<̦yEv/Ό븸`B}ȐW0'Pq;0..Geqn]%CV`L $ʇ1?hшXh2&"i=4OGƄaeHETrd l6ىsao^˳Gυͣ3l7[SDy- %F#CSƍ{ͫ3* v&>Y ЬOαL\L1:՜x,;š+x=f" |#СRdt=,I;g(^s_-ZƏgY.=uL /f'HfHS13ְ"ULս kAPDbN.'h&/Vp?;zԄ]U1޶L@ z@ԟD_|<`ᛔס3]ȬhS Bjq3k0`cIkKb̘O^+~FMD4Xg{N%ҏaOgF]hxe͈Lf:ġ|.Od\vFNgt$_w碯c IzLx#$@m#j-޸'aɄG7ҿ6#OYac0`0zgI9S>}p \$~{\D$2=O$V7˷ 8rmVm_JC{B.ϪD~&76t_ 0gJ^lAI=$s (qq5+X{ 3V牅Z1MDx'l9Mc#!tkX2(7vfp~M?Je4zںh`h05́|ū~*Mz ϛzϠS]˪b&`_ kIBc>|*Bhٻ0c2[FH eQʪ݅X!8;34Z:xăoY;~`oY8{U+,0W{q"[Wk9'7n/XRQو}΃u Ω(c;1<ɡjE,3ervb~(z:s0W#2vvh`T! xɱ`ʞ_cvF'Pd1lϜzgp08 AdV9H/KρwNsfc){ ,+1n&Ds}$>9 4KcI@ QɊYQ2._Xu{6[?pOy\G&ca=5m<~JJN6c,JcPn?QuQXN~%$1%D͓z=P=@(͊AQdߤItk3[k2sE,LLftid)}>:ޜF/ߥB\HGLP4&]jd,ObP(! ga@RI R~(>POcʱu7+єې#$Eu$RkxMؽJsX -̓Ǝf1}@fMXEU,zG `bRoul8Jʯ,=yɜcjJNgAe|IA,"$+DB~/d5|~ ~ф^׹[N :58ڳ o[BkyXLC'*%prD(Ǝ%4D8;2>?@ͬI694*YH?ND{"vNӨE`ǜ͠H|0#s#߷bŒ 'kxѭAfr-dDEE!j^쾁ٹPBa.~$P\l8:{Jj kG1cr(|HM)g/=yth@(E=n/S~$ $t>,e;}'@.HG c==(tm,LK++!=G Yc 0@IHId{jnzqiSxc 21f2>J߸O28m @͝x 6nv|DY;}Y&^LOb)%DND & coX PێrNa'lLg` յDx} f"zb1W䌯3؆9vhu\zJG'0B$^OAAjޘNe=kjYC79HXIN.9a}lm!(+bg"y,!bP 5n0͵8Z1)k3Z[ŕaXcoG59QC1h `;<;AD>9H("u .! ,m~ tHK4"tD`,u+Ʀ??li>O"B;B u",ы6%oSRþ50^ME'}GX53y쿎f&R@] r6*zɡo&<s).Q^—o P2JWo"L}_0* hr/cP4ɣ?tF@vd b Idly fsκI巻tuG+խr2B<9K E'nvLD-ō26}@iƥQDv27,i[^IF2:y<) xڲ,j%"G*dWXX2ގ|w,1`;jVbJKh@$9"a,b ZL:zOŠ۴Gh0!(JL@`E t*^w58PN1w;LO/@Om LL=9oo4ja%ֱ_N$~ nnbPoR MlOZ.L{Nm{n307a(gy_"/8X`2ao̘ƨ09`ck%:ѳ n,P!0? s)ON |> XfC,i~LԶ$9\mu7nT7a!v 7^aZm: nEͤ ^A#{Bq%ro*Juw34 ڇV;h''̛ؠVc2b.Mŋom)o'?A;H c ҏ2tbqv @Ƚ\ފU s ԥ!E} C">8_zx0kvߢR w|F#2 `vm )Wqw ޜvRGˏW+E7dXhl3 u7斜z֣Y9j^c׈䗯˓r}FFK/b|~Ea=_l$ԃ6r xRä?O IDAT'XHC$>LA CQN~1-xP^8Gv +_)L;חDݍ{3a2{9:9y0lgP\JH z T`4`Ƴ Dф59X# #  .!1eHy_Z (o{f` sDC ~P|g#? s' ׳-X@u.pj5ݸq/ +w*ZQjxXȯ9V 0$NY#A O*~@F%#5}wɨ0&DSDmEa,eZıƜ@giY{('+ Zuy|X 21RB8p>i܃7nn *HQY4+IT0& at8QF`ahz!sv5O*Jډl^ sq5`43p6 K7=:#ޮ,oy5ZPkpeFR_%yi ˢY!>>)닿k *9ro>9 3,pu1}'4>QFOioAC9gD}tEX#a :tGkkB$ BB7:ө?Ubl騧C(8|\ELe3y'8D𩴷u;j)D8[:ȓ_}zz~LD f2O'̍-7|#Ƌq&f%j~ZIfOSʙ{%cG=U<ļCp'%RƓX];&b$$K06py-ݵ8dȗo2 Hɠ(ڻpZAyY79}6ĩ,L&mCi56xؐ'ߓOn2(0#ܓ>YJM+tvΗGX379Fu5ad^E*%܋HL'n9`F*q y P\ElX4{y[񞊍;ޑF5~ ^&oD;v`bh18G DG(è5gg5sgZ@޵$Ok^L}\cK n?/Өd"$"r,M]8PWknI(ћv[Х}aFpT:~'x |#I 5&'b  `j_}8-:6fϥ]G؃#yx9:4i[rF3<y%Hj$8Ԭd# $Šc%´q6̢NɕBZ2mUh7U\Ke:yy(z=&t&I:;{p#I)IfYEM0& ҉ڙӉeg"EʆD݅v<)A70b 2w؍RRJ5W^=Pf+`Ќhh5XX-iJ`ªj6j1i:!sz>bf\H@^:^L$26/@ǜY6`* & P]#̘L`~z$GkВh !+LYs(syy"?!aFك5 | ?.1wRKew9 Ɉ$bf"\ʥIYIa#xP/! bRt D"3g0NaJ ?Ƚ(4i9ΌLdP B9RH/!;;*_Wف+j;xR^OEvnlގdўKs;PX[l ,@ҡMc* WON-vMKY"{ 00! !@BKH{16`{ݖ-I;uɝ^һg=kye'$wŒJwyЍ-Y3; ] wÒÏH)Cс'[!a[T‡[H baZh೙5e>%lN#]|:[LI=cpeMwb*߿R(&*cFg[h4̚@v9bEGُQhߏ8:2=5C,8GJWGGA@)o 7 +8{ +[_DFyH[. @h{8 IQ)bPw M }Hۿ]0BqD~ȼpЙRi}D^8 @XBt(rSRrӉ<΁Mol,<•x9diBcgMUX21mpV2t"~e$<

^FfNwm8LF]K4BE ϐ]`,E]/_v{ 11.PA8;[NHNC]IH=BӇ>, !NNVȢLv}40 cv, _RXĀ " Sr\cHZwՊN LLv?/B ewI D&%pw(,Na!5C'0$Y[$0u n8Ipz-^}Hv9FD]1.56C) Ǯ"c.anM*yBSĔ `#†*NEJCЦ+Fܬ"s6_Ldx>A {dq.5XJ:6?&%bip:Oz)"@@|:rqȐAmJ\'*bih32,̉G_{U1:VDyTR\C'ZXuq$K|σ\?s1% jq^]jO3JY= B01RQAؙ10v9%~$1 JsRTGZ%xY;/}ZPJL\=9.5"cJ\f†Ҍ(g^&Z: ;'dPU͓[L o eDc)XZ%1#C ȫC?38:8 Uy01==6_!) ~V#Z'+K adpt©k CQvRs?CDF(̢:ȉYP@)P/zt#Ic/pЄp Su!"h>Q$tvѥg.1Y05)I71vN[˸ӡz<- ϦM& JY?GʛزvbIO#v=,ĸ ^V{sǾ q,>Ab$p1a^hqD|ȥO PXKKPtKu q!yӥY9&wˬى`7etYC͉,R m=d"\F o4pY$3Xs ;bm Gcz57K"5#kw'xfWяhO,OVN\<qtezō4)G>eZVTSYJv§S9(сe&DDӇ:}AP  _GRO} t BM9E)X1A%`ㅺ'Iz̐aDOn|3q'_"j ~r̥;ͺ^/{Ȍ:nQ03elF$AL>$y3ͣQ|y2J gpB+F}Uz.1Hϗx-Y133! ?kFNl%-%^?LBIVS_INvfly2*8Ƒ+Ԁ8[E|8bhxFQ׋<9E_@٩:%hk3 NOCu+hSC{+^ޒIg7n"]$FeHlW30b8{|PՍ1c)+ĒDZKѰb&F$SN!zzl>V9Y 7136'@칚 VD_kBG7Jn^I]+NL|+x΅ \XϝBBO-biE_$KpL'Y)q!-̊N?#1Cjq7klE F IDAT=+: wTӧ# J2rS.xڐWKc; 9՘:5(ŜECmI+%y8ʘhNAnLbEK+ >8;^fH*ΣTYojKAE%rsFlJ}ϐs8 Gu7tb=[w.R~&:HP$Q10SPHKZvb{(gE ͞zcl'(m#ҕ87ܭi @[쥦&୕HMiPhOc`)oFKz4vpv5 *2a%Q{ 3B^^2\}/+HaH^sս 1)*֍(qckEa>dUfcEt(oձ6Jl3s>A͍*XKG%QZG;M*TPr oPuPY uE$X8LG* }-!Վ)NPFG>RZF[*4ՠ)n4DfE%z d\񣼷z8Խdp(-mRF0wcW ϛyp4U3XK6If-f<wk CԄ%1X[xlhaV<=WA @fh& N `b0aoɱD;c"Ȁja%gEl-^{nl `%=8g {uCzFWgl:K7ʖ15A_ZQk!D83}704 OK/ISM#Z5 ^MNa-|6Mm9՟uJ9 ;pco3)WȪÞԧ|6O'މSc;b)G(dB)HBZ=::1X>]LIHlbPr1V9 ;a)]q" ʗW*9>mOgB -**[KMM77Tʛq3ڟ[iv|?*12@do$%4ccG[ںm$Fzđ V^>/ wŜ23\̤KV^YtND($i LHC+18X'AQ+RJ9v !IL}ZJɬf8QBT,W2âx3luMH I>o8w{I˥A__Eƍg[T*b-X7E[zwAR7Q#K )~}Ut6ۏ )BN 𧸖]Z3 ZUcHmX_On]]ZɦϨic*їbg|FPG]# Fg1;B]1(X=n.d2&ٛG7?%%|xYOӠf^$5?1r|ũ"}E=x]״A$/$afH_])ht7Ihd ]>,])i`B4%P| R>GZ6ߝE*gH4[or,_(BPY?"܄3g ~ǝ}W0?gҵ1-oqٕ,EM#I臓% !lEi~9#1g~ ;)bD$e0q#U#KnBnȀ6q"ЉoMI嵘I jF;pL?7ͦ =!z0ߛ-4"+SD3 y~@]FE"q oIl=?G ԚXEq=N#%' jf{X$.,:ʹ8 \ܘ7MR6h1.2s K3dRӣCR.}͡[ b|QD8dۇH ׆]ILێ4r֣y+P/U+5sSsni,ɜm(TU"q>V\ảp)C L~Cw)|C3&c%]ßlr> Q=KMG `nf%bf q;#<嵤=c I瓓20hiF 2q F!.S76:ĹC8~̉}yPppšj:{q㧕T$tVc ad@7~8LiB]hC&p.qzXis.[KfR*Zxo4C7*% AчHL^=1o59@ϻC0 ݤME9bbH{ֱQtZDC|@31u sL*lʸP;KMj;hUqM&ttlTcn9Q1uJd2F3ܟ6n4V%29rQ\Ba=bcz!_a,C֦Om=.|>z5wB~4w 1E):XJxQ3iޜ0DfMm1.>xbhʜ>4Aq T=x FL}ݰm-z-k_0?uE CNKut&Еւ4Z⇐@ktvb\I~F0e"Ƅ 1y9U44|8 o 7E'V\1?ajPȏxX3cRI+g/qs7@6Na%g7OK)mAcfBp'#4”A{eCa#MfxZRҝdL l8D>1}hlyP̥$3n!<m™?7#33qD@LEm5ZCkyUnmɨo{˹#5#T2"c#DA8O\cJ9cQSBnd/M>ń`Fr=?@+TQ^>=F/rpZ5b FF̞B~ wI@ D; 'sv4Rq&==MJI+cRwPw_SDV-EII^KJg2=>\NHI.a:@HJk"GSF 9hr;-\wqX7ѧCCHj(;Pr)T`aNF _o@Ă ػpnVa$_PkcyRSeH=O{ #PRoX]+?ơ !EjAFtgЏxQcgAu/Jc5*npdTT˨Sc&17ߞ8k7 K `L #L FBe rNۊF?$ڛXOuؘ2{Ȥjdq8٧Y1YuDDM ^Gl6+g_ G%sdr>I-7)mdW?GiĹ#ޜ|xs|&嵜L'%ҕ00`lbL>1bic&N=brlZIE_t?q~xYP1cgɹ;oR#t}t(.2>Oi#e;x./IU#N2d$בFK3 zvV$6 \! ;/i `_d뢷=@7UDN(!QT")Ј8yD-$?+3&ȟo6eP?On8[Sۂ%&Ag@c6c*''3gJoѡǓ蠷j8 !jftI1d:S"  OݨLtCuZ7'zJ[;ccNf.54*8 9a1(ZIehb0sOt.81ee=SCzxnW+Xb<^ѩaJSA›' [q }dWpV8La3c~>u]ĸ#ɥLLdؘlƚ#L`QBhY\h%؈%SǾ Kdm":+r)Ͼ`W,ooB6/ sDlȵ\,f'^ νOg/ Wҧؔ|wT5nê}-#l,>?fJ4j]˶YCA"6[=G:b}71tJ+G?!2d U-D G'1nbcڙzfW~efPDiHE=8LBQLʡ!Ҫ\D) 9TE!mJj+hm y/jnKym/?v-GSsݫ@ I zZh،ߐ ܌N./$s/a@K'psY>_ໄ6dtc覢^ҳꂧ+qUE+&"lX8<-X: 'ғ);C Dцk*[PD$G9\&O凙1|uor<:<I6r77ɞO0IX3 K£8ggdx&aJ 5 GU FhQP`n*Խϧo0'9qvV :܌s),HPHxv&2e,:q ͸ZIg;\NM+DIm@G$Q_Km*r[l刍1@y>u54 @lNYѕNo~ţjSL?EވFq"+zZ0'%.Z%90g* %mm4ײn e TTq%dG'p9i3\1467fF<]mbP]8H rb 卧Z-֦L|j&(.4up c9==VGA3pOq`)3r6'yNJ`6N 0 «>^W=Kؾal<38o0U~ZsOWõ Y56zXYpʅ|j}j> HU AFӡTЙ4$oW/Ġ5=Jz#SD6Pg)LAUC74uEӈ NVold(K5lz5&-&̉6/ Љ|ω xF&BqD{~;`jZKU#] ce\-'յt?-'o_os)Vs9=Z!5J&hhE x9RPEC3~,ZJB(Iz3ccm[aeb,͠+;SŒw8|v9cCx;%}BUΐ0q4u`h"!COFwF:\D:Z;@}Dz1%i1@4Z{9{@hD)Y8pGr9xTBe j 18X"^ke`v\,A/K4r'caNe,%T)ilexm8Z0{ӭA uK,0\"kBkNs>C IDAT1ѦTLm-Եa!Eb2a<}D"1[MO{mXf6TeU0%~_F #RZF[7-MX:f|zGPR EG[=")zIOUcWZkMDTGitG/ttq>E@J+Y< S$2,fH fP͇sr+X8$cp ZT;nHܺKG 6VO8]GKN<>dl3q;u5:EB|)q|>(Z(BdȒ ΂^v$[Wy^ɊɫF30BqaLCѨ_g\Ta{(v[$1Dj%${oX "<(5ٕ%zzX /%؞t:5<gkdn~KI9C|+)3gv%1V:Gc7%ș}[uB*%!G+T\xFe9/5|ϼxZ>GӸ=:ʌV,LY34jkTOsSO8sWFŠIޛE;:~$bHLBKIXˈ(EN=,ʡpZcq@ XK86Eߋf=8Sv=h;@  ?O?苹o`$Q 0s3 F#4G"a]Č,w6#A{ܾ3"9@| .8V_ a 9xb5!#ʋ <+# #1w+1V"ؐ2p6^8 ƸY3o!N_I]z8g'$/n>XǔT ` M0 U\B{o^5ߒ<*a\').XJY T7rx5w+(S X@ąCdN= L$$2+f<,"@\qf1=3q<Չ`eg1c |yS'{v% O?sg2 '>ƕN9ZAS _0К{<:C_jea^"zzi87 EUt:d> u6l xBOČɄp>R04ͩ6q+!ltLbm3)F9\ːbmN!_ˊwi 2y+j%X1 @nWȯd,#ʅ>,PyZO ahǯyXD8r X> DY"IB{șEE,؅}+6J1ߝF_Ģ4vǙ1ᔴr9sl9hʺ \-aէ̙ϕ^Eށ?&ڕ5͛(o7^j<ܨYϑLc8{RL'X9DDcA$Iعq#zFʊ1/'g ؜HJށ 1XbTJN q6j)5? ="13Z/~ E9(>+;';KLMŞ;O;uy7V,LϗFO@J8p7gƾOTLWR?Ɍ Qxu6B5emv 9~{H5˚|{ycfVKq+z7o#]mO**ʪ y#ɁD;캇 C;X{|6;4xzAlj-uˉQΡ:˥BCS3V`z0L c&#P)};Q"x.i1FSRFlLZ6UtQ>8C8݌ ңF]=O)tw9Wi)c@BPw?:5 @'&QuQY:H]&& 흘anAgEO/KW3Ubr'T@HN@8"8 C)%(d>a`Nv1c,cyHOC:v@an¼WMx,V )'iEe;g!i.AZdGl< jX8ϹS뇰6F#&}>nŚ9HG75Bvajɳ5RVΣ vsCP+g:Njlʫ񣴆M_n q2]W6&%(7AoHPq#*r9KSA#*}쿄-ad#C̎]UbcHT4V繜^+^&>020H́0d2:3F4 o4߈F1 hy! B䊶@^{4{ZFGm`^">`^)2AUJ?KFO"Hui8'"ߠW_ 79ҫ9t0+(&wkl%Rׁ@K @_?N\N>t0 $z5(W_XsǓS^FCf,Hn9e4tQ/'50̊Cts)tU: D(P)cU8zFbgΚߙ>pEK<~!睝[W `l[3l-]|;@X9axH,n+򤚕3)7A;5Wn#>D&ӡ`SJ06&q_B$~.5Oo0PMn0 v&hG4z8l/ؿ Z% d8F>5@ـ{<KtGIstuEPdKB҈JH蹰r:~ >lWQq,S ,qco|"+rYƴ5,]3,5o}£,Q(顴tTLX6V8%Ÿ%3ʛwXV[S0'~ĀQ03X+ҟ!䃭%|'|ux ~NC QU!589~n><G MK7{Cqw Cr,%=WnDKz)v&DR@s7B̝|D| n*p^! 2N5YGS\JES~H߰E4TP(tbv] 죿 Bhn0pB@]["B='GBGXRg7ܡ{'07[[*r)8ͪ82e>o?D*} 9 ܔgeȔ<,N}W*Yxc=l, f%bH/&S #/+by9x/ދPԀԀk fH:TaO<,)Bw&)XE;}anȸw) ]="& ǝ 9SRw 1SF}#k7`IVFkͼMo ݽ25o5.|ciw_KN jز'c#"]`+ְd %/co/ciAi%;_ˆ7v tTcc$!!5a PVDIp[H<РV"@U10zN; Ѐ  bw815:ѪaDC<̘Pq r5?L)1͍s712%u"QiXBe⧑¡,0&HX u`*8#Z1 WLnΘXbhF, &PP_@aG>^R=mehTb`NFckZᷔ~5bGLJ9b 55̘Į,Bs+cfŦD[CO[<(kWCB]L5\G {_*ЊAY##Y?G3k> Sz̘A15cx5|mq2gM/D/,LyZJFpOxq:i|.bd+>i(JoB U03~yu$=6m&U vt6}jn<֊Tv0q u *+1F:QLv%KX-ikK~Z^d| zzlڄS"wnӖ)3”;y\Ĝa[ủE5P(/D37-g~ |OSFQ:lM'ns7_b|J)3To ?eD"l- yI>yr =MM:d(4FTO{swBИvCIB;tuCQ ?]w!v1c9"CG/KL>A\td;9_bG DEAԥx92s8eDݿQzzb<}ZM\ׅNPJG$/*g(j!5S;u9}E/m6Fx2S[26۫|3^ fr2*rĆl$n`[Z ^_K'p{>V&2c8|%#xPX=aA| g8`퍉7?o(o/!̍! [’* δr$-$+V3>4hxCi Ssn>qOfE?ǟwD I|+=2P(8 B]/„֯^4oE%jq񥪒NcM7!͔=nstd)}?BTTC' R{ 4|ˤ-a+ }{0<#2/ىfDY8=}@;%2̕8yIr0rHtfIYA؛~"Fwyu G BxeL&ț<:yƎ;Ic">Kc 楉l|qԓccbĵ4tYAVdrUco[Hd/y'IHDl)$wƐUˋ;X3_ (ג0 憜IY! _mOœ#5H?q1x$iS NЈqQxCq v0C`__SC#ڣgI4e@At#7uΥ36 )#2.y8XlMhU̗?OG r}420H2]*0;>Gq0GBw1,2npK,@]L AsB"n`k3ԝCGSIҿF+<'9*D_HyM4tk+`ӧą y;L=d\7㹙Op-mo1T#bd Y 5cR PIYI2#5pW.y*ٺ5 IDATZ&}NNn9Rt4捤HESa5-:͜d3CB<ϛ0 ; }&OɎ 9ރoE"vi:9}Wfc*C5 k@}O鼅-F[\HAL8_}56>FS02.֯F>'ְa>U`EY #±F_V/k&$1ӌcZ~ZvtI'ZvS.#gQ+k=0#W3>pv/ah$\*df+U^NGc7#!Z͠C?`kNipa|qC Lnc2"©ϝ{GitPx^,[)HtrY5Xx..5r%]K%m#b_o#&OxTIau,Ow/"yXpg?%S_bYt:g;^ϤwKf5zU %N4g@BmW8Mr ߼#mr] 6~Mv-j8:KUOdF{@@I33fǂ]tMZ̅|a,LX8Fd9}׳we2qn<[Y;k}L3^mxg=㨖1܇S@;d,x@#f!/[clϫH,==4UĆgCFV5"t5v΄$?qqЫ|5Nl= ]vi5VLugԠFQ` jȝs9BtF`jKZ`bFz{3n!T~,F.EG3'/"?﹗K2^2.B5/K_JB($y?XҡɌkkNdEf scT hӪNjKk9 x8sINLRxpvrY6A~˰Sx\O1&}}Z v=Xr05E_Da%.Yv jCPY{/Xd8: Z-;m A' Wyy!=*>j-ZX̉c(1}+_r:{O a hG5Etʩo͝~ ZE&f," 9 "vD݀VhrQ< a_B= Tx0PnÑ96b=Hq/%9r)a.E*LykK/7=PQQEG{,M >S$v 3COY=bmߝ4T3lN)8T@I5 qՉ0w>LQ5R* fqױנ'BjHa#5]JPһ̊eoX; '80}"-& :}+ZwS=.#ѳ_o(%2k)bdCg=:")Q# ڏH?T̩81( 4Q**0_'>DxZ)ʤWjSqJan$SaaIK#VFtRDy=3h2 jr5F(d4ZddjOwܝYOUX9Х"ʅ(|^]67ӑ13Bum8Q:ȡ\$]CVdؕ(zXOֲo)=?E['2ktr1v||ãk-A\+%%7]L^`cB9L[<*m/kS9/\A)k`Ɍp,'>|eQΧT P7#r:<3i/d9olAh\ПxFNS9A"at =J2ӫwZ1w#0Eތ E*.k[0_w=[4))fF#hM4SJg/D̕ TjJO@*Wdb-K[bp4cA;G7;刻5|v|fG'] ߎm7P,Vb$e ~8S䀧bk؉oԀ7,==LMT17dE**]g7j 3x1wν"|+x\DţpJ e"j12`a,#a. 7knqA8ػ[hTWO"/8FډQ TD!ADЮ@jMt .v4kϧ)L@1B=v2MX[QMWX۷c?k^$='dN'DpɌ)|ZN iCelLɌV;LsfLch()#- cdDz%9-q4ƍӎ#8U" &6~ĨT|4hɝ{uƑ<-aHwA!5w! y01Ki* TU212;))Եq.n Ɏ@lx=cpx9a$IqE `&~ymyy8՝ɣg[Mq+>:x}#KDR`m'h$ܓ$^LE{ù\b(}8r pC M &LuibT8'RYCJf쿍uC P.QJ} QĔ>?ˇ;xm/OȐhtDz.O0u,~tp"ři,GrJhG2rJ_Iy#Ύ*r@l02ebBB4ݡ˺ &v0'bk6.^E$Rb*B} e 'ȯ"?AGsIȱ1A,"ЃJjd+ZF$GK*[~ "c9D:3 ;/8\%&ddb16(mLX ~ʭ,;tQAI y\)fEV&҅W3ɟO~Yʴ ؙ1Cu&NCܬe8t/Z.f39r_1'==d lkPrSX™"PsEք=.q/Z&QWqsa n1\{vD$ym'bFV5#=+D0)FTTSA'/g[4w`,F::lCL089563Pc툋 B=L0p 5q{ڿ9{hz*wBBJ n:}0 *yAO|è()H }L?|s:F~%aE?!ڝYpOz m CKr4Nl> 맪H05`U#5NNssctHM09cq'̝sGmIt$ )y}Oq+n#n4^MቖW$R&1ʛuɜ_'qե=ƖD$FHj6͡G'?]Ig3zCp<?Gąq$5a((>/yrP:F6N_#y|u y,w2KA1 ؀ciKyQˍMpvYĶxEaHGRUƂlD(8]. G,‰Ag'Q=FwF`ͥdL%4MEaHCcH!)ִmA׵XD!6f3/z[@0F jx `7bfBn.K2"~oﰷ`\= VܡK_Q©Crg YF#&J_?Gcoˢ$,$s.OQ`V+07fAO.f^Hs7͠ )dV"SqV֥P<؛D 9v=h烯ikc \A2wj6h(@.ih)$xp Ud>ǓF"6xVAy-̏e\0d"><-eV;q.ۗlƶK_`>I7;=S=,;Yl8FyKRwHL io+, ަ" K m+gh*8Dҫj4bc\}hAǀoAٿQ`5FT <֢x)=tBMe"rwkF1 \ݸyl\O')NLJI~ͻ0PVωǨ8++fE>5D ʛD??cD`njAc0o&w\bE_>9gSGX|%rſdO=2j; *3ڋ0c$"e4YOf5 mغbj0˒1ͬCz'^X 8mGye&xޛM':Ef7O!o$3qww!$X RJԀZ-ԡP]$@ !!xF=guNo3?Y{my~$F8xY-e$8#Cg1܋ /1F #YṬ2V$`;̎6YIV Ã;XFc:x3Ӓ/R/ Ҋ)]舱E6q Ae nt,BF})]U(㑀;eO2۠lD)^\'bLg7- $c' B!E`=a,L˄j:htV"}4cƌcеDǒp` MDD$nOZ-c!LbXl\Hbco\A kc*LPfIU;ޮDG 0 [6a<6LF.rvM֘BڻdxEdzL"&SSˠ`ںY&VzSP˰PvngO4 xP338G^gԶ`wރȔ`ƒt?n0fEU'rQ̀(a(:cg6c72? ybeBi##FRRΡ(\JOQx:iGyw~Eӊ E߄! "KK1=S|5#04Ε+wn(z1A@ہ52DѕEOhJl 9գ(;w:)onn;Nw/Nr.7A_9Q}ngG])]ݜS<"*]:PiI óƐDBrkWLm:"C]`ˑ;!&mt?GMdPRAY#} ue?^urcD ||JJG~Kb\ܘ==>.#)aZ]~ 롡Y3rR |+y<=AY1/-+Ek0a=][:6kC]k OtP4,J懅/N-d0=5 p5  yT{ JJIL B㘵  5y H7Uu\ycw3%uS=>C kP)m?g~Ȏ(TD]-Qވ]LK;%f! { BtlFc'COqȺG5RׂBLNMYafB!{drڰ6C%Oڻ%*2tw扭?,%`=Vт6d$|xT=Fbk/N9爑- `E` 3tb?czDR0G(-1eK)L15az,uVr:0}<9{s?S"F`iAsBc:즹GW0?rTLW?ajN<6%rr$?-%(GNib^Ȍf23n2>/kJtt8B[q4Eŧ&eH/DO?@sKww/t= g)Y0-GPdF@fǮdWHQI~Ƅ9cGQ?!5?scb|ɩ]&CY, O6;}I+C)eI6ԴtRY“G|Z-gMBOɘPwĔ3xR歴%ԁ˹H:Oz!LդH+YuԶ!rjdGQ3]#t觱??8.]xHe9R!cp͝e $h#118w.d}VAn!߼>󾠪N˳*8;U{$d -^^"ݹMz!dapEdͼ! Nec񵧮j %n6@_$clF|vFr@KC $dQAW>>3/w ,U>%Z٫f dmʁtҝ@!1v<X Ȃ,3a4<.dt<-[9u ??Cmb!]48.SGe.l: իT'f7C13QNB8"܍B :eiMglέB>>`_E5 i:/+X 2~gJe}^ y-'3%3=g \LW`wZF !֕nۼ; VzQ)ф3Ev%/ q2CWLVH~J^*C i%_l:Dy>83r?  )T1o"5dC'CxXH| }p2Itvp7OXlueR lL u.51w;gA!r eRh<챚HfCPO1wCC*M{y50 SG4 _C+1C?%Mj@/S{th@l.ZUƵs HA1C'Gt!39ݦ)ON/$̏:L /Wר殺[N?AG/7(h֘/ү"ڇVLg/YKt$J^=$ܝ6Wɬa|AQhBKײPk/Ȭ%v '``z9vXdƩ$¼ГboE'%2?ەԇĎsJ[aaad9?-=5`bFs KYˁ0G@c[\zUQ)x:ccʁ?Kb"[xVEK&FIv2:)Î%+~-fT9"rns0)(17{/QVx`PH{ߏ 6ߪy߽ ȁ>A}v |=F$ 'grSΜ^zSB} LG,nQ?݂X]Ddf9keg_DoՔl;9MHU1tvjϿ"p5N&;1q&<\!FYd!(Gs<ۈތ(y!K~G;n⇾œh$ȟK\؅@lmq).hG}# Mۉ2dΈu${$( LG >%h2WׯS6V1 FctĆFob[$G^%![Dj[xŅB%t22/ad42y9cj|#u3lQ\ΣJӢQhiciBxy؍1H<:EG?%3s5I Â}swbv 7X yow?ȁxXlg,=R:pn|4D{/R.B_[)mC嫵|@;̍ Bl@0cbFbaaEc;ϲ8k'[JP:s)vNuї06Ki`\'};2ԋ4ih@e;G"Ok@C'4~!PD{R)CmY(UPSC[:~#uG# E)9/(} aX.?>b{ sh™<#^:\:Q֡J:U0ӒPR9 ! sC:TD MX[3uSSЩѩ``!Nn EChXͥlǧq&aHT;'g%|сp4h+SN<ۑY#Szq-_XO.!`cD'#ʉq~t#1ŸH#|v603g^Ai'yws>"ҏB-G9Go8 GF:Hep&j;&ՏX̢!*&~us)Je;T!0) &bHhl,ٚns3vnF_t>Em~/9vP۹3gJ>'։;9Ht$(U5 2VpF $h]@Q TC$J61h&>B쌪]74j4=HWHp"@ GG}&T0i-^H&2gRUC_,!F~ȓ{43w !bqG,&ڏhWBԴqw:>vt`)an Ꮈft\}).#>f M xb$a3oclb>3#"H/r<Ć͞7czx33`w!;"/~%L sDE O1̓^ c} UI;ƺ of oM"+#Lph201b]"{PD+ 3J[A}*q1GE^ ) %TanLM3GdVNf&Uudɟ ELO}3==USKOpvj.a7NPUH7/ж"]п\M9(Q5-R?Df 9J!R]ڄ^ †RC@0O3NS?36[5 s3X2*HġcD,0tW56^eyq- 2`1ƺԵ>6!^E]W@7Q/G$Bfb0X~}č>< ܽ3QhH*KZzihY Y0c$U%8q!^e0t$\IIJ t!Y#y0ܓɤ(TTb*@_beEVpy73`.>iGyˡ8ϯױglLx;tufH0U-xp.?w=ՙkُ7줫=k(m dfSBT7ՋZ-ۇKIyʓFƳk2@JSwaz|z!Xcu 0M}IJn`h(o Z^%2F6TGAtwSH@Oɫ ʗ.P|1 aTm=I#!{AXPԜaלZ ;G(/Ofq7Kc $,~)GtB+smx^̃;8y!VF4wSz;I*d;>HuYSЕdCVb1 љ`eVeQ^F=>a uIįEzdSX *mX0Du5t\({I-U88R^τܼBS:>-,Îv`0:(g:Wq߮~ 'blx"]x13.V} ."~{JW?XH.lD,f>ξ^ν ؉h8cPlg~FPZ70m }8s)(gDlw0 ʤ@"|y _WE٬YZŮ 9ӣ z9:"| \fRzFp\GUNz 1 @2=8wZY=ݸ:s&|~ | m)ur09H'Sr15`:΢ SuSPl=4F|LL#'XO.p]`,< "*[<]X3/w*CB(B, ~/t?ڢCOCAՈJFO=J%>tPA9;[{2n"#406o̹D}3ϑ8J̠LzՈD:bPVJv*6̍^1/ FÂ0u2_,g|ˣ"ΨxƓ^46RňpI,Xĉ?!Ѫ?g`V ϫ*em\{ɼh7F9 }SdJf-_ xJ%L\~ɦ1ӟpeyQ_1֜Y6VB/!'ȯ$0gս#l0#u(R=QRbZ10D0m bRcp6MR.$SW͟329>)_Sb6 Ǔ8?4Kŝ(4ȺxO҆O%b$Z5-jm-_Ps0)Ey{ JFq=3#o+,aecfc$`9Սl\V7[q *ك!Ȱ؀~HO832!^˂}ᄹX B%&q" J5s=>9}x$Զ30ܛX7Lռ6 /KBRJXO7I/Y8C]~OKV*GPQA1ПZ9K`oQ֔"G cjndndq: ]RJ%1%j5Q05[/qI`/y~`>Zh_uyg [6SΎ7g|G3;0XN]cL^anE }_ʒIС݊RqV͜13fT㇝zj.4cFA&  Մ|c)yHq5Q{Re$XalLCDKZ!FzRt7`C]BCQ+\F@0k&ɏIH[΂QZI_?}Y;Gx)KY;'^oqx1Z-سk Anqlռ{,Fu:Btv .<Ҝ0$B>IURpZˊAS<~NK7q'#KcihX{lf`^uj3i|UTlMC*>y-}.4hX[0a-{Pq!a^V#>o@$l\ʁy5Dl֖OS[\N<c]II3X\oci:嬜} ^zlgRԴbnq罥Z@5Cq@ɵ=̘$v]=e [ U<Π/ɾ(,t&(EabK1dl'`hAmR&j6NXQR3>ԵGLń,y;7kvԜ9#P8p ME5']19zT^GxPOo(>Jh#ĺUσ"~ sf X9{JxRT 9fFr)9Mw?R%SƒtRv&/Q|}>GH"b6aǑ|w ''4r;R,1#, o5R/)~NbЧDC *0gIIg0fD0d5GRP֢VwOM̎T3v@ > Uy\A*L s#yZέTj>^5o7 IDATJ(J6"((UuEH 04%, wbjjƎvʳn$n6uDSt<1:ߤٓ\or4U%({sC/.SV C|ioi29!Fw[}-М #ȽVM==}ðrS\ #oo<o׹Yȝ|4 H;BILf 3]%LGme-ryfE}+Wv8y Xwg7ήɤb 2k'81iEԴӣ ΋wf{DMVzwhū>q5vlXͮyy̡d5Y:yT̬0J:0Gquf\Fǰ{ QՆ%f(aqWcσ .&f9B}#iD0ܛYxQVF!KƲgSH&axdKQ)i TᑃϡAkFAw)*9.!u}K21q6N#n<Ɣ,.O_Mv>JᬟDzL̐DE%88RՄYɧS@7O𬒷?bHB)q1"`ڧh c\fia*u*T4#Ư9ZPhfT&$"%Jx{R1WsrӧFN#mxXiɅd<)nĺ˶f0|4:jH@z[VRPOM3ɷmbPRRQkHJ5rK}/7˘ G8\߈p`6 \m+3kۓC-FZF;7 X .s_-$bDJ/Զ]`h \=w1eV2Ћ)݄œ_FE3V KLq045ci3j ]m4W 5=_>җ+Y|_嘺Ӕ>d'tdP̈fƏ_^~h58N #|Nq٫ ge =̵̘lN!a'L]='tb1w2.ܢ }S -YH>YVX"R]DeLS_, Bo}~7 %FPVJ2Q8,\.s()"aaVQD8g{01\I-'ڍqCo৯q/Iɡ>f1xm{qq ^ #0[1c)%5OY >= -?HCllDsr\2?!R62ng:nGZc qb6 `CBpBe6†FfXfF3e xpxƌę<ܐ^l؍5CuZNiBCDb̨o͕qt)8xKC};碲 9 k 4_cM =l(˃]ԅztpgJ |4. .4vpnP3abץRCz/BAK&baJ[Wh:taS$ 1B?MeAB z3 3{fҝHHDi4\¾OE>/eL N2(v"s.?c=Vj5lFS&1\Cp -_ssmյm믻խV+3 s46`L2cs Psnux:{={wZk׬W{CÃΊal8ǍtSX ͝ vE  vN&Pي1]fFP܀~ GWLx8Dq}qtUxZnSH8_p ؑ|b.KHcr4TdqBO0_Qul:OMY-Z _wzb_u\&D02nd ZB=B<<'Iٜ>5|8t% @?3sL'wS+@jMwrc*jQS,&Fgyqm>!ϯ($6o#ױ-(Wx[p>0Ƅ13 f Ռ$悥1)̛8o#ołik5 k)Vr^kM#"&`GF2lLRZ; rD# W{NŲjFj63˂RBY:cPFtjB#;>UPk8(IJz$PSeLxBS 1#u^VP̵8u<;W3ԓƅFN O[,L@gѫׅ2=肺DbFf< yʴqLDH0IJH;ו_31=yS^r<"UROg(liCՇ;i(o+P~6ŠE] ݈1 93:i/Ȟ2@vxQͶU$a"%s17^5S:<<ovf>{95]X[3@`ΔHb<M]/v̤'9[a[sXN=s>;1?6go E>]S_y:*vZhK%eXGG];D_΄0ZFHU <̚i&PXLWe܊)v&CAWGI*U'.Զj^V7 .A^` ޙ{N>'6/gx `t 78Wj`g{ P6'r)#==J#%+ dg=i l >wt O"; =C,msd{Fًo("= ?1=N懇 9[(#zI-SIQՐ 3IYȢ@cEu|/4vijᆵ >|3+ tD*3#ZQI\Qc3#nlxVdFXDw/1HDDdC| V#D&gp pKo,D,">ogЁM *`R|f2? )R) c}eHmȮOc(dz|.ǬǎCX8|qN2^XͬY>G &o/)-Q͍pOK5AwVQq(Ć(ͤKʪ'4c%M 3tdݢ2daHdIs#1(eTO.%r#-X37WbD ;J)mLNYVk)Sт#z p@,TK9}dUlz򲘣O02-!50{nS|PX ;̛ y`ξ|}iwRIv ^Y~h/dhBTJٱ =.=X8Z?,QrϢ2@bN|_҄&&ulXEy+N<؈@wϓ,gLCjȩGM1  c{LOM;k,G"& =Nq3Ӣe  9F^ IH&d`mȮ$#})e5!! <CcTДOOv)-1C w1tDM[Gъ14F`D_9h/Cӈ@Ɛa硰1ILJa5J,{K));3:LƝx4( $dUfM3ɥOs+ $ t`@Or2ij%4,mpCA8RwgN0GWD:3ڛf.=],eOúIxXbeu͆9 ʪM@Cy_[dhL%ۘ4G<8rEo"JAC']Y8};揩Um8b„a)ߎ{fF8&2"vLd&dQRLR6F7s ymEX(xt$~䳔1z }2s7 0i eV-Uf~ KӧAOc {|ZP%lߕ=Yeqh:{t{l 0B,kHF3-60._ϓ#2)q}#w_3s>֔7TXΒIC!o/8G($ճvf̓lFG OZ< n]CV` G~9v['3{p?1`<{̎xən p.k1tu\Ibj5HSbmIH41k6#Fbs)YؔXv܍cP0 D&Pp[-qLAq%CX2<@q",70E,—߶4/$ӯji``O/XL!uHVSzh-$Ϛ$K[dhVہq(<+*Sc&xb[HŌi,EF)L-je}2fɥ Y&*!4uѷ@G׼?s)L! uAP $1s9S0$ʓ"7)v'3|t7;9 G"">Ϭ %8Z03GCpLX4( 9`|Ɔ8y[[恡7b`Z!؂Ԋţmf<|\@ ֍'Ďv~h]A`F{"5c6X59 2~2q yXA[+T2C4CY |0:ҳ` &SFU J 8p!Ff G/3maeFy6b !1R:3}q*L|) 0gz8{,'Sh4{P3?FFͿ:#x.D]bq >YP ^d^:ѕ0-vC"@aI[v\^ıWpZO_u1l~ -bd;YEaR|43:aN(E :@xo^V'_hDG3713b;2:0E(&Q;Ev%3܍c qgLȮʘ8o&5Of )OrbH O#:μ(=Φ`nܷ)e\=";΃OQՒ7dz{1#i?j5Ieae@O9jp0gTp=z^$ F\h/oDYl]=H)b$%*Y;TE]^Ό@BJŅH `j@k'y\8ƸY*f¼dQD2ғUxd.9WdM];{ө)΋f~v^ʎlRs͍~1GYw+>Ns32JQv!E8Ӄg(hmFȖ1EADhͱ)cPUm3ONGL=ACctaCՇ@k;$~Gy)Nx{L#n|LFByȘvWPH`-%)}JJX46:y]|qSjyMUUïЗRTͰ5/13)o%} ؿ1رf(sʛGȯ#w3lM(gnkn wI)3}'TH$<&Ė1݀ˆG)os1_p/6%GVc!Z ;Ë+`O#5Uu*[) qa&?Ͳ-ѣ&$&Wb&Nnvg^!oK~8O 哷rWS,Ja{SZH{7O#tb_ewl[ܹ!aU?EY6UQ$nPLG<8(`YmJΞ wqp(o>ϥ:ٳ%XOL@Zɾ1XPė˜kq5E]AC肮7sF%Mt0eK1/iS`a|> gMR<-Զ$c mJ[p&6qv5kG+6,!/62hѼü8ϗ5$c2yk4`t'P~^<Nlʌ8[SxUTm8Y? v]+w2k/r\qH[8XC^ )}̍כgSȩY!M<+bȫӌe{ ѡ[p3k)@; ՔczH Ju"|E#H9rU5s2"4);;pKbRL]ȩan>wp7h|͢ aGV5v>`UȌh-EV8BAS'ѭg[r`>c(A@kDta놁YAqL|1GDۄȆf]p0o+Bb?ҝF{7VӔd[YTQDA(Aa#nAX!lG E!=Է`ɭ$7(YfT#1WM .flقDsǙq^Z- qP`Ț}X|"7-k^d`kȫe.i{ejW0k3̍S{|[>e3sBq5gN2sJ~zT)*'kxrh)"G^Ϡ08{p.rO(,@fv4}LUډ5Ѫ15'zJQYU?/na2*5g35Y!3u"ğGO-XEȼEe* |""O%v蛀.R/@ldDg_PNpcGcSv馯(p@ߕBD)-մ>siDWǁ 9x8[)V@Y GaLW*Z9y_>Lk/*-Q\J^=X(QQČQ2f V6Էc˂ilr2y vvT^L/ʨlC7< 69 ǖ603;˒p&(/KqwL~_:^By5XDV:zOμ`8M97{LHȭIQ݃::덱>Nb뀾b*œ2vϓ,:\Ɣhgj&O ^&9s'e.f61j"C${3a ZȸwATw$E~g_lrHE40n8xo"|woБp0kѕ!R`Pl0D9w;4aI cP(|jG"AκS#su)Էx[g pQ[5't$TOo-J;ihp1g >cPT5 E8*X:AØ0dރ̀ā\&Vv6bĜZ.3@c'լơ4w1sůQ!eR=8ZnlRqNF ϙԴSY;.u@g~Y@;Eqj'/錳)Y/>ƒϊ"'W9z+9USPCM+h)AƬ0>3C|m6!̄9%!!8)X?O̍) k Liʼ$tM#Ν.fQ Cc@3y`jEU>Xb=НtRw֧hQ vl,1HπPԽ ̓fho"NA-Ղ@!wԜ,ҝ?Lh}6*{i2s# KSbD4m. <"c* )RK3ޛٟGhD$ڂ'=Sxr p /JxN}b]@G[X; }qlkS ~ !o rqn=nԴp;vܢ[Ŧcգcz fMaIu4&2]leb;B_"q^BaVGS'gٺKZ6Fz̏T^6&&c(K̴݌=8YU4s/r?dl qt7_FkCK'l>"<:"=č[1/{+{l љDzhc$|5 ;׉"P`56jJA򗳙ف%:(ޑ+$zXc7 ` " 063~  |y bb&Ȍy*;=@l=:Lʰ5eX"!swt,]r3 >ɭ#s=8H.5|0 y?&m.MJxIe92%C Uҫ05S(m!_} aD0͌tE%ceBI=ؙBs7A%4Q^15 OL<OAn]b=s3^$ZX/qЕC*|j$ԿЌ^%Aw/[Bu Z:S܏<ڕXX#:ZhlBj̀@|pVp=#a +9vX)pq->a6]q3#ŀ}[HDC " hF_GԵ`;J*n% 7ewtv0(m|?r4]xk'9=W5抛9>6jmI% aw x[PlRI+ wh:fZj]P®5}#ȒpVett9:5'gQVϡ}ϚļbEv'rnQmT_0c* Cr ?{|gE cGR?\b=vHuQ>zg0;[&\|Q9ҭGd3b(fR2)*@tE01s&QjK]M f=t+ օi#"68#Û*[R!0G7{P Uҙгƞf,,Е_w0}C`nʕXY:ZRͭ+#ST! lR;Е1 Gf+EMWòm,JC;5d239Z(eJc v ~x/Oq2 }+s'xZhˬŴJhV(H,d2};fdlXs7+Qmzfj4n,PȑtRHdEe3'2~ wGb*j=,ȫ`&As'f zcC{ߟAm̛ӱ7x>4Z\I@vOdqGz4TZ>2f  ‡/fɭB_0:hPw*q/Ti1O+D_sՙfCj3:a늉 bRP6yn'I م }"{ $tQX+[kJj=Ĩ_WV5g*-F)lSXO;](kȗSX~t(9z orpÊsn돔p/Ss.ng3i !vxdP/tZZ6wWo a^bpbh( $|u%]yo:v&N&εsHaG_H/9TZyRNO\0< F#܄Q錙 jW(8ON,H)];ΒȨFeo|=frjPX<1^\L˒`H,,KHOQMLf 5*fCGp0:",EħūXؼGkN:CʞG1ͥht$""d0BGτv--hQUwhhI < ـ;3'b)C 5YDMDOX?ё`$ىwP ˧^H t_jRsX1SCCcğ5MɁ56m"qEtWv"E[3؝73#uN>)XK/^,16bN(saR4ld$+E>g¤@xxZ4we R⋨N$ЖH7RʹCG ~Ù@)JQ:!kVHS'U-v2Ǖ'yHX12v/ x& 8^}<=gՇLMi+x_{,uJ vHx']`iBK,C(Ve9R@f0G;^vl8y#oa`B}y3F|V.@GQ=z''s7]8y3Ǽoyg_1tns88@F;Ocb;(AhCZ,΅$ܜ)m!>luޚ`*ZX'h4,ڑQkɧI/︵w6p&_N-=18a]!p?W^E`A d!zu 'gjv#忿 U%4iO}@3}Gct9Q#("ÐX Fy\8I#}ㇲ7brٷ:\D{8]j6N6 Fjl q)2sg, C+D r!9UWhsa- dZM5aZsCEy Fc7Ӄ{.ō{@2D/% 1wEXBQ$66AM-D:P|HF!-L՝b͊;w~ eccai3xJ_-ݼKa:9%lϭl|}9}߯ca Y)as_\%%t`C J׸`&Gl8!>fPHN9J < ٸF.b52wڈv%1#cǛ{d``@~5qYlhn{H\qq;N l-9} < R,0 tuD[Oᆥ\MPJZsW; zjoJI6Wg?.Ӓı#C׳p2Y?(;B]%cI> Q੘s7x,՝; <6B+jx +(1[ә<Ū|(3q"0ՍNC-V@K;ٳvތ_0v880g*b!1 X"r=^ɈBEh(ΘSxZse3qq4vō|;˭lv&e#xT考5bv& Q1X1d$cLơt|PxP,Y8{ ' #ZP:GZPkPJe77qvfLD"e54Vh '%lasu/M҈e3ƺT_H/j<DZ =Cl!hx ,0<+X;bb5D`; 2~}0lΒ ǃ\r*Q w!b8/H|20%G =]O7F`mLanމ.3؇Mq-MEWÛ-h3s]_^lIB?UYW,ϖs͉Xz5|0%DCJ[39[8|.5'兙y܄\xs19/U?냻 i܋ BZ0 H;16&H} ͞rېZcl%j_sCAEo=@[6MiHӧFǕ4 1A% A b2}^w`f E>\! t@D0ןekB=8ra26^P |rO?emŸ1oK%zЪDWStkx^BCp0B!9!f!`$a.[&bcFCJ-XI0*%Dw3.= 04f^ZX=`mؚ ?f:eSـSy225Hr8!aL hb"[ͱLMvwxV'99R݆V- wE_NM r{iꤤۯ8ءD jv#::X<_I֢\ǑWBq9:r>XNc+nAO"6 GQ1IБSm맵 1F2WOCV<\\Zd"hFH'y#G4nq7 T*1O;D̡Pt{f̈́tB"<= ǃwOC6Y9>9ġ qטYtZ:h1pd.g]:>b,v?ڐ#͓+X1~ JʘPSj6Ck'5]=\$.YQ9bfL-|2 }O֜<*`ar,ME DЩrƣ;TFߐu.|21$nƒ_Ҋ)+eBlςykc Tdcq? {h3TVَ_NsIa#Rh1b4(2o6uΔqhPa#p]O1\3=ÅӴ1qG%VrCJ%&c@ҪxQȗ hK("'|`7?1MV፡ ^{ LkfMČ2ڲ9(*~xZȪDnHuXY0: F "&:6|3~J],ߋx#ËWM/w?C"15BU/I)N%'%$t4Qyf$&3EGJS%I!ؓ> >}9L_ 8L5VdxrA|&d0wC1C*k=Г!42e4C8z3pr$2g22D]|6Nȥ pag̼`$1Ԏ G=w&"YFI3v_+d#cp4ވѦ{8n.ڀ_st%FXЅ1{`>>827W,4cVrnBc5n;01ɓ5 v'&㷙2NƔH+(e(VOdb0F"D׈NSgyiH > +~Bi1k7Ӥ@{o炩҉I~KHH(70&\(*b?%8xLx$&ɸw8V)i!,#p 4sѷQňE%d_ @S1F#Gk?`B揲M%rEǂ2T9aGKB; u/e6Fc=e\ wq:.bmTvBfĈx:P^KG+!R92g.GǵtAIȴ:uTs>CXxxp` _ 3+Q{vlk Xx`#:ޙȪ-LRɭs\>Bb1' ƒ r?o-3?TS$B3|DT]tTj& 6ՙk6؎Gyഈ7x@;m#ZpfDt#7 zU8NI%W7"2gI^5G~!C3Va0EVk3~&$wP ,IlK3۟/)m k H0]-jx[d7%h+=jք4v27obaX2ȏ;'hJBGǴue"ss2d_uf30T\1_M/c3`N Uqy^sJ[8Z͘;q؀ŌC*a Vt23(0d&2IpDL DnbKI Hօ+?tdTPFbn h5~aӘFL"ihcx^ zzAP C(Cs $;'@¦^'Կ\4>El?eغ*Iy7U܈Ijcf#n#} 1hKP3Y(8Xӭs-ך EL ;7_oL᥸:6 i<XZ c=4|=_SӎPRQ @; dBLWΡy(hҀN]fy7pߝ&g` +dfXP"do vDV6=W`Ud, 8CK &zc{.L10ϻr9i%x۳2V%5] ;2qUC" TzjXy0dU!QYͧ9B:0YJm+isG>$#j%gBS;;nJ<,/@1ʥ9at&E=l}hϮ#ЋRkDỸ>5uBMc>CQA`8Yóܼo&jZ {:\? #RFۏ !NHDSDk!cR03ֆ>+{/oRׁ ЗRxmc_XiNsJ\LYrnX, ߖ><}jJp3 f"3^U}2–i Qg/ -}zp%z:[By3z2E+"1$ x*Q݌H{#_KT]gJX5T(8HVO3)J 8 _B+RxEj ]#cN0>K{32C<ƣyRVC }2؃ !3:AL{7+7`Bn }t0ā&jʑ[ӜOm1"(HA]@̨g/ݤч@Cg V` Bq%EA_$@n@;~+yHOb/ᄉGW-=]T*[a"O   3cDϩdf~͚i71."b(>&lQ!z6G^Nge-V6^g/ȴ)hd©Htn @Z^.,?ĵLҪH.'#86$s!añȬAQCp1B $%@+XwJkdf( )?AW'Pr U3RnA_SEK5Fp/*Lzү}'_bЦ3җ%И !r>&8qg\>7:$œF[h̡݌CG0'̌0`hdžW9Ե2y4_޻dqlbk4-6w%;І>: q~f Eϔ6DoVq$_]g'G~HD 8 l腷M\1Hlp!1 cYQEe)M3Tz`BXvKGr=mkwr]_QF}#1hUAz2g,R}bwaRBGSZ+0@$@ȧ2+gav񪈊*83Εp #:mmBt"G*ʠg{nf/=b{\QqF|O ,` T"7o%UП^%NdA?>oF94,C(%`zUgpY{Ql]C?ԊPܭJCEɉZܑHH.ԕShf?(nQETp;3 t9>U5PGj R-ix RLd<*̀ZlxgS8[a ~h/5yrL;̭lAI3fyD+,u PDΥbcȈPaߪVNSٽ}ħ}z59J$cfiGk' 9( :|f-NTb뉲!|zJt֣/_QSB]^CT ꦿ*Ƣ/H{bm 0@s[JS ( hOk!'t/:F)>I[:g:iy\BT^Njj![^_+α, P,GВɕO[7Iy)6QXaNuc+;/xTjHÙNs)h"#yMtvw= Vk!r>H 2>M#W-jFsy.( Y )GBYK\MXMu,Hg+/T"&=)b0fL| R-b_6sn5ێ5RGm7{RNۑ+n[ٔWdڼ5I).M)}}z^Fh}_̝(܋C$*D"NؐDK`(hxxg]BK Ы!rRq;:Fiy49ŠzG% Gd@?ƨ4uV==Z]F8(LcT6ĸgad hԌ[Pr*} ?C ?tp0$f.#z|[C5~rC}u,EG0eߞ $== X#qN {mG -B${ ]\Ąo `4Al<ƃY/ q%u^JV-q\Ɋ\I@se PT"l0!rT΃ރo<e 2Fz'gm :r+Ewԟy^FZ9Al7g!žJr)^]4A6||dbl8m9)V0>#C了M2k"<ߦ~&g1L[l-@*x ]ZDo߂&\AD'nC>tt98Fs6,<T ц oE|w>h 9wچ܂_Fz5B!Z\>C_ɳJLrV欟Nj%"A;cgjq}' lY ?&mNVcHm=~KzkXĝn =qXʹ̯;ٻQ^ȩ+LȬa| ވMk0fDeDLvƐ.~Ɂ/lDE /@C sZT zbXLR>S".vv<򏈜Obaφv%M;Mxȃ$.l@6emh*DD}#iT'¬jx~l`>}91:&ՠ@SA8&TGӘIVWcFw#=oH\-b7#3JҘ\j:)M@Kx;@>o~NkYT3)u/ 7BwR`rB #o 2ě&~XɑSyc־OӘOKCکlք&$"lgyGm1o`8օg3Fn++P[D'dca+TE7({HZ !UeUvr4zzX6pw*ZY5+HgbN%ZK(jلƭf> t(q M5̙C72xx\̹gPX%nVǙF'JI9/;5sH*$.BƸ連Oq=c&GmZp 8i&(0QY:A@'4SpdMD[U6*[,~TjfS|bSuArc2| Z IDATFrDbl] .&>"6`XِYEA6!#Go:PRъDJf2^v-gl*˖2աv萕'ГPq_d$1ß=w2&>_WZy!ZBFGTDl]OFU"ik$6 j,hKx&tQ-PIw}h * "u7c<}K4T*L-қ$!3!3"Wo36a%a>D8Z`F 4jt匃;v~[JN7HeU8e-tYl&>;p!ǟ-Ȼ, b8fs"܅[VGa|gvSXxZڑL64ɒeiH̃11΅pj?Jm54w !Bߊ;h& 0* hAG5*siLGr69/)?ЊEQ˙EZq$w8n2%-nDBlpT΋lR(<ό2h:Z6fĞ҇xNʹ%B#Z D;@)?A=wz oG]Z5= EF}z@b7<>܎EXކ9z>#kAO iX ٙir6 j1v%CHNʼn!| Z14ˑb*xgr Z[1b>3c??`M.%RNJonY,Ŕp. G&A$Ps[D"r G,Er#[ ;aKN-O2;~ėbK^-z=m,?bذ>} lGQԴL+Եbꎹ>Ohh%؟RD1̞/leX[!sʈ4v#E!H'5S5%Ȏo%3gH["5}0ޗ/νxqr5}BKFAj}B=/5NE[=g@2(A45[ḋUh@o9s?Ћp踡9JQ"0rtk'/C.D'ԛrN"gX4]řSTaL`2lM}n#ӭF*ѐE6~oOӢV>dEU+^,En$fTbfB`2JH{Eg){ѓr*u{W۸@U;T(X_\\P{:4tF0%A?fTacD}'R.~ct-Mw`-h17;tZFB.xـW{.\~*&V|4 ?G"؀z!uN*!!D[BR!RMGV#!kΫLq2e8⫨廉7ƐW= t1}0g$cV`$.%ԀGhy\X=.*<'~ALG;ixFE3<1DOY}Щ@UA[-.ͣQMw}j^/ҍt0R5#G teb큙 e6 6PXO2/Z% 9;GèiAwh;@g'w߶WE$-%#*}#{K\.=&o{zFjR0P9EȭzIv>vs=ű2rl$/9|]@rzԶ#/(Uda-9qXXP_q,l2w,3s~ Op-i<|'WYI ~bD c8tԁw/ZLofzy~@kgH ^vf svEKµx6CQ Van8`emJj)䛏;1\LSy&}̟319lw5 D46I#;߄5x (#-cTUEl0񡫙t5baK^"5hKե0cBػ ȽEբꡣIӹ'gD"nmnz`-]$a瀲V|HLU-IX7p 4tf؊ ="yZHRcf=-4PXM`^V򼄒jn$_HjuaC+dɽq3Me+F\dBێХ|9`d7 )dPx#"j8V(!pg20k̈CN'IBB0QNR}l!M,fLN"N+CBKH.f)y%#^22i$GVt*ŕ31܇:Ey9--d"Aq>VSىk?FRRJc)Z=Û:ӵSŲlYrmzCHBi$!@zIC̀)6cpݒlYǐ=ߞg{[ֱtjY}e@,_ς?Ho{X @Dm:U6:0t/0 ̙,dTc9y77cz,-8#:@Nl'i Xɘ3W x^Ou5R?c&(-Eߋ BC&ktL$tUc+?R؊~%V[JHtբ!$r2vuJEfE %n{m-L? wYc&: FN^7 bBL=O&+97n߃ΚS1^Ah35>B/ccEQ#\8ЛGuԴacgKv"28 j&Fe~;F)Ѫ&w܂,F&rۗwMMf6uLG `|ȁLSH ggzNJYFaq |X1)&n\8~ۊ' 2y=xy!bgt j2+SSbv[{G}7p65|z s^jnD_=:,A1ܸ4::zK^5#2 3Z ӣeԠEO/<>M43yQ\|b)܉Fy;A^t\@KS2wИ2 yfrrq~ ˙{$|&3ikbp]9%sk^HL77M Yo3i*ą!1;{>VǯbfdU<GLWӦf~>%6:&!<dR)&(9P=ooN".iprvdU(H ݋//bo.WDzp%JG$_g:NA΍#wܧ2t# Wabi=ČW~;K(C R: C[t%"af*^lM.D10/:Tthig` `r %DLWcie=ƍ艅9F\\Bb2dR OzTן8z'Xޘ@]7o82+Z2=n >*  ˎv`Op .|r<1$xȳGbǏ pGqMu#9V+XRJq?{q;g{ v)bmI7?B~>YJG31^:-[c_1(Y RUL/C~>w n:aͽTxk,ʼn%>X.߯ؒ((Xm?C@i!\b0@a!ccOB){L>:;p-) LIS+Gh{M%xoL`fC)bW\XNMw%';Wʸq˅sĄ𤐿|ĄH!ѧEĒ-8s?n+Q}n,hdanq]R`&l%ɯsk9Hȷ\b`μ^Ϛc1l"Ɲ/S_AoMǎo~oWFa#HD#! @GS'MIizj-wq&h e-<؊؋]ѧCۏT„d~LE+kױa*x̳&^IA ]Ȣ 4-3&,v,?llhˍs;KbV0+1tߏS z5OO2{0cYFy{0(X|'__0279#s`yGOϦȈr-s13u s7Gꀉ A1HZ4U}xَFp_'os ҉JtJdGQDLP wq ]?cp)v `v '.>YK>Jݤ `Rl\Ę.3 -&ċc0tXp,`'V@`w_3y#Й2>fƽOB$fRb#t"΃Ƚɇg𤞮> Rގ'2-&>|{W&rDVRm:cy٘Y!d, $)I߿-*Wf\,NbT #;GMgih}^3Q?4_@,J#>XZ>͈_Y9ۈ $Z-s>Wd,MN Q^H dDoc,)oe',T=e-(ظ b[Ge7lE/<.gFЫㇳ4#WТ՞!8L 3H 7lM?"li$1 ԴqAԴs"I}0 Qp41qsòdj C\­g,5> R>)o`(yAym=L֙^!F֐臃% Zxu*޸Zq:3\]F*ӭ }FC'')II|Hm/8^_ Ap(D/Gϧ Ka%Ou,+: )O_O:=r^c\F,bL$b :hNr1oٿ ;F}HvB#CA6>e=,ɓb>0trATtѫBy6q>p."_ϡV{ BUɣ p`x 8[ȑL2s7ʑK!il BmCY>ǎh4T3UOd`0׳*2@[3=ZBlz&LgD1p%{s^H3_#Kd좽m?. ң ;;_g6f2"]7 5Vp<65 6=K)inNB Æ_ө\%Q14{KM&/@{+acӓq< o1uDr J<,nblqhb7Š4 GbE<5ӛO}%VL^l}qu$#6 .ǜfBtsҰL 꺈Y41y$ɾk"d$G3 n2/yq8n|vWk]t&OFD=MyKޝsv\/Sxmr9ΡW+f$=7Ni †TvS#ƱWg29Ҙ#3 G+,o&R‚j%,[Ny-L~5!㢰c*zZҟ"7Q)>Hg>Ui%&mټ񥦕ÑK70qҫ%53n1-t'ȉǝ|5PUB@(ћС&ʗ_-1l\k D((5t:rqsb:lBlejݨ)B7qu:j Ai>>hT<-=l~m/75=#,=؁'NwCqwChN75̧[-lR~=“JLDlU;A,x~ ç`w2+C 1v`hKx_Պ-n wf[\!BY4L{/'R"ys LZUl<͋ܩ ~"u8d"_ʋk_0%.οǣ:.^IMS HĕChgÍv@'go2k:b $yl:B7R:vDF#/gYt}J|co1itWA;3gr$KY3;8\,iR~|B~#6t "Ƌ}|0nSXoW TAyzz`a IDAT_g#Sz#ݙfjrѩ Fw־ NDž鸎p9c m2 U} 7"$bb<<,E, -~9 ܜx.Zkxu92 K{6.gv,0vX'@t>$`Ǻyr JضͿ"0.[eTG X#4cB,Ζ*(af k,zISX&oɁqԴE=>f86i`*jK4*=fP;$!q%> . ̘r.c0:1  <$8'{tzM$~W3#| T_bUIqlOOK['Ϟ٫YU NN^p?͐`ϓg 9}凔̥qҊw =,:\QcaCL g"wFfM⮠)eBDߢ>CƟ>zc;& MK1jqHc}9,њeHJC~|i$C(r*b8HKK7 F׏ƕCvpGO LMqrpxc$Xv ECQ5d ՝Ig'Cq 6N sro;B"xZKi% I~RPM}?R AN,I6q AF6*˴ܭyE^$,> |W=c9ux%zxy1I4V%! JqrC(k9UPΤ YɌ4 ƟRr {2Dx53LG]ɩ)#6e/ʚ)(#!G`"Pӆ31<=|̈́(UttL li,1V`cIA6z3bPQV%GU.iR/ǿ )è0t rCꇉne] p/F7u aiӋ2/.:,{L2N;6O˚@'*;/%9`g} ~^D]خr1x_<ꑌ eU 4T(Mx 7ra;]:4)(䷥[s~#'5D3}2 -Xˆ`yXK8 쌫UrP-8 &DƎQ3! wi꠩y1Cr @tFLY#wna<$&ܧUPMh, RhSt81elfq*~^ۀZf%i]GI9ST{E\Us;  GPx amAi: K5t>L#rڻx O->DMF-}ӿMo @CFMX/BhP%. lGM M0<-Ut)Y2.ZڵFjBmdL.\gwLͷW lDJJK #B;HELf J}y'38hc;x50>OWzl01 87J-13a/sa""e? r&0n͂iW<\9}-X;1g\7xU"c;DNn.U5$M?m$~OKC7E}͏cf8PL`΂uk:z9,73ʘȭ=d0|عV5BShPqx%Kq*FwpڊϦOf9L'̇[mcC}+"졩ۉFILLC9q{$DՂGܿO~"G &>e(GdAW-=*;@.!5Lb1@h2k̹EfJs~JKB#w+_Je 2:7MGx\Ȕ+xE09VZ%T5q& &Er'Z{u%gbnJQ2m^DWgŨVL`'3N̓j,q/_ ߜt/e =R13c1X6y }ma(:>9;adR;vմuQ`FVS_7s% 5鷸;Je-fcfJrSI 9> : #x1")"@e\LD4v΄1x3%>8wGy5#hZGi ſpI"ݏiVr.3_Dɻ$1. /2eBSmb*{ 3G%$(2B d0OҌ㷐{R]Dk1>7#"<$\=EQ عp"k<Egu$Ù3bOa8s=,C}%?ļ\Ak@Tu?3/>tU e%')Z"MTyq`Z% ":beAHmY#IBG771f,ɾ<&س3s\)a SǼ-9?_9R֊XaɮFo`A7 fe wɮ! wwplĢgQhHĴPЪdGY%wn90 ^=f.gƮӸ"!ҳ1g|f! ݧXFoMyFLU'^"vܼ()%:8{ :լ^ŏ9z5\C2s(ZAK>p5ïyF GÆԴ`鏲@>oQuAq6r ESZ3%a *S*=VmZSq7o2boZbtK91Pvχ(uf N0r:bolYX?0^ď90ߋ\EfFH/^Nb6~5v2&_l^E;f&y8wT4u1%ef#QC9.攷h6iO3-3#&o vR1E pBB _ۖFz~ +x"5\.%ˬ'Aҙ= g+\Xq4X&f# zX^Ha)՚q'-3S|ĎMdRQǀ`|>/SBK5$Ds;wG(;n%vdf`aM?SƱk;%1 w_E_tD$6E4>d[goWZdж+G>cbu"-迫n4#Dl?:$bsc?qYHs# 5xs1cytgz!ttPU2 |ٙFZ\9>;7:3S/XK_6%d]bY;6YAi3՝< ʓ ,8]sΔpb-Mݔ@}Enk],nQp o&w7RDPVΫC)ɈpS1u9Jl*wnɏYk /?sI3͍k{x,LY6s@XbKtRTOBsD-7K)kӇm;cʼn OD"LMp^'0L aꈺ 9&yS[=ѣ&g:T@䈅+'oFy>ebdSh+RC#Xܦ"[/LC"V\N/DLc!: ͭh\9OԅG;cIx/gm>\ty{?-\a$װ4#ه=wd|ĺۖ7Ӹ+ =qdIk78[s:S_`x,RJ1,b\tΎhXVPD*K"!EP Hx92.E$!ќ~vt(Q13Æa]0>ZaO'$%" g' \ h5t!tBL/S;_#&>=Il:u6uWahFAs 1#8ysNЈ܁^ʫI/+Nٸb,ꚨzLĬOQ~. [ Ыcqa=ΞQ.8 _1av2{N1_QXSGl8fŮtR $_n?g>' ( 0{XAa hux+hcX:{ɾ |O;F#ؙɡl.>%9u)ykɼsV06 ˎ8ap`47'3<_1ubY;(?_>6]ؑԜnb*&DNOp"{scXȸM-,ڂ=O (|B#1=*.';Fފ@ X"d6k AG#lBׅy?!˟PWWX4l݉G_taBo! edfX<(_ O.$2!B1J_$g[Uj˱G|pc8QO>좩~Ez FCb9Sm$ ['<ˉI8?}8r{'*[s\+{)CG<IH%8YSPDDE VfL$e/em~bZTo2 ncbFtу(,A'鸅c)xKcz,3ʛX1Tuqʧƒq&[s)-J,L)cT.킧-n+%͗.RYb( S[#тZ>E3N8z,X4灌V]xىؘ16&+ظa-13!|q7Q*9fjiDM29=Ebk JoQ_4z#7ndùU'HJftAׇlAnW3qصLƣJ@Du5Yt2Z 0R '/]!UϨ#qw17A(,he4NFg\Dy+n8s7Dգ 3yXGYBC/anL)oE^N<$;pgOUq*o/'ԇ;Y4Y2n~:;Cb#dx1(`L_T|='s:?w<Ax9ΑU%ӪՇwDn7o#9S\GuLN6Y`ҁQL9#hȍV]hhCK+Hz;?  'X. K!⩹\B)*)s7'Olm 5: s(IԖ;7jvL85ב@wFlJK*f VOdT87KOJM*V #p4\VG qFNu_ܬ哳\&ޟ kx²4yB97+Y@Y+^)b bcK },K}{ k$dw;qNr4`n| ̬B'rSԔ=iΎ+k燯yקn1N"30!/ד2 ӧЪbLuh4"2'g2xZI[ eI=}"I#HSȆbuz0v }"dc؍c2b\&cPGKm{ 3>2I0`ESDdb>=x+#Pkpb'`JZ Fz$œH ]˷ M!A^=E7:b+% 7`k>17Iu+iUg`ΦW%,x7W$`8܋;Qδv]\Hn9J3/ a)x{GJ8//)~ki\AKFfBK'a|w d"#JʚfN ^cp`u, 5DVdGW«q_Ti 5t*PUOO/4 -ߧ#K)1h(>SRb BMPd-)Fc*-9dHw#רxSMSBUuh TxS.J 3gRraL4.D": Β"c)Aw!jgqSȉ JʞlnSh>˾ ^|;qWgm F:cdBǣFx󴌵'?l9㐈i >D_ɩg$p*VbJ#/дD!8SOVV3Qި컆Ԃ = 9 E`N#e4** ۂk,@H%`=}:rZN Q=Gr-x[p7'LLq4bLyhKB>wrГz'V$a< (HCۈ3䋕ԴyC)c0>:%]{ AG^~}BsUlʭHXHDe+k>Nc~5\H);i%N&Kc79uقfX|U2P1aϔcb5'c`p۞~Mlds*[V \cx<~; - %SY1ctD"R!1ESȂ$~2'⻍tgˣ4j޸ #ffL6oFiOm# #ȖmWطJ2+>wm<'b0UXX23#;Ms 9#f@mmT}hiXHq#m5+zڱgkSǠ6בVŭ֡V1.ux\TZiysqkcM~8?+l ґ'& œhTawE]RYu9sǠɏ|<~GqqG &-@Q%t6#"r9'q%tшɒV<"H)= ~8ȁL 4*9l RdY( GbCWQP}tuxBUM\UAS7R 2)EET5z$źХD5y|P͋}Y0Zqn5Rp#>@m+1TTIĄGp1SѧjJ}ʌ)7a QDh? rVN}fF^昚EiuOOʤ *ZX>V)绱u4s&shѠ ʍF )^f$dI BSI* 1Ăv"<,0F"ÝNSq4 aZ(Z†H"`ϣ> ę פf`l@}Z/VΤhQp14Q@v 1I<-G a.p, ~S#4RP̾3 z1 -1??"ĉ { e*p#g؏Ȟ'7s:}̚d3ȭgH8r *e|_|@C+c3 #s,,I4b惞" 2_qhy8b7z9a1'(~Aⱋ}?@yZtta,1SX[rQAp-Mꍖ(@ͮ]+B@MM v=DucHIB1_B;dhZҒzmDCZdG3 Oaʈ<:Jo+MnDL̎kY#J$d؉%EO>ơXOWh3% &}Jn.M̍LIh Gp GO,aS5gQ]AdW<-(%ՒB^~=ƲOX=9?v`!$G 'WOJ82`6ȇ󸄜"&Ow/@7aiT Ne ~#&|C-^[N+-R؆-n8Sه8{N D VP_ \Kq((sihC4_(+BJ)u˒l4HthoFXQWuabChcA-0v܋Rps֔f^dR_E):r8sB[_ ;,:|~IQ1u<80rkhS"g?v8p'Vug Вk0v.ar<)嫳 $& cR+Р bh餥Z]ĥp<.ah+gP{:n8qxxXsJhIgS5Aʤ\(^dϩU_q M1o/M_0i.@JZ4w`t"'S2#ny OgMZ Tp xe+9Jx }zxs,} tu 5ՃA \9y&PUܻ36jA'oB,T=(0 s 8Oy(o_r AZM]P{<ڃ"~CO1LbŹo-=7$$lBSL]+6(aV0W.oa?8\^۟լ=9ϯR[o6֘)dl e7zژ飯ܟc'E}AY3p|1-0y8:Dęd yQTڻiC(d7Az%#W`%dI8EK^>3s1QFN)Ȓhk#hp*?.CKM(ko^9^m]>{;.Wp7&(u, bCw7ٔ3BIi| >vpMZmo,׊|D^+hiPHQJF!+&;"m?Aق hqpB7tdߣgN9E^B%B)TN]Xҥ}{_[{H)_6hu;ɧ DSL' ɫ&-mng#1Dˀ/2 qdwPK+>SDJ>)\|hy\Br6wTA~DsOS}͖l=Zq.ƑWϙDDyp'eC sPh֖jhP?|rQ%+݃lX54\5Kh 8؎ Γ k1^ ptm^ Ά9NV5['8#sڜZIQ3Wt8z`X_4E\CĈ $#$Ij&,_ON>(lf%,!p$Ant(K s-xZKnR j o ܝq8@i,g7qhnҗz$ 2bv򺚎Cɫ8܄s4QHPyq3{Ć4o?a^~ZUG@< ,N\Iy-t {l'U71 w0M\ih!&M\JH(:Zz?ҹ08R 0+w^ӯ9@[ 0 t)"iױ /."Њ81ؕ^5nHF*(NV儋uOah m@*sŃt^@+.@%}Cs jDz\@w60"\9ɉT43K*k]Nd(fxZKjJpO>~C׸{+L߉'覣 cupM+"Hz=. ";cj&y@]&p; \M|dIb"q9mM&^xN*6PQD 3ϧVYEp:xXHAl) Z:|{@ChϚ3$5/@}& v3>d&|7Kf.yDTDJEm;6Me$8z#QT8{[y՘`cc37y9X%ߙN`v^rSFb ~hc?/7;Fec^%C*k(kщ:fW IDATz{MMlCL XIc]q(adՠ}-_"jHG˽Rx y9]D"4Ifc⃝'qms%!&r97ǻX:\f<Z!7-‘9?f&ffdV١$lrm] cs$J=0t30ȋIqĆ1lĒuZ@C 7H[_++zc)-7=I B_,a\,3:ɱlOU ?|t12Bom rjC(#E#=ɭ"1fl=Om# :L.#iQ v(0" !ͭ%h(ܘߥ E^DD\#Ӄ 9G_ї׃_70B\0ō#e "1] TOYDoߒ/xS7l/j`8+/j0AK=ˢQ|2 Un휼At8f6p9XüY}oۂ+Ρu ~[fH+nqL1nz}T5j(?%bU2}8m1/2 {cƓ]HSvJZ>3t ؽNݤD};*;ّXH;n`!G3žz{C̹̎U6|8"?D?1bIьgӇؙiͧ0ܣoQ~mhP *^BA)s#^ҫ"6&^܁7VL/EQ9.hnDGf558@L J'ѬC,ōZ<+;A|Ü$Bf 2  kϠchR\A F󺚄cbrL r9 0s;06 ԋ3 #ă y&avFLs,)'q5Q^&,6<,&q+/~dL"|O3z uDZ47j }jVL@Z@nmˋb.nCWbǓl L 8RѫAv½)&s31E7m5N8uup)38\ !o:ٞZR=A.EOS]D.5YzaHmR?>.nRprή S;ԴagD^m#S@;@(Aǎ "\t &C'Sԇ"}2f6¨h]*1z6QxIU3N;q k>db$4S M(Nu+c'8勆6ΫHGUG jn3dIaAU3KǠiĝ3*աC"UĿYg5J8[t0c7~\Fulk]8><˫Rαisp6QhLZX:;c|ёcVlC|(B֌"5@3wɮd"? 4= rN& sC,M o TάLRɊZh{b`GYUHY=< Qʄ8Xȝ衧Gc#x}e.2FRk0^)ɤ%ҧ!Q#@BR=B(`x_ov~:N,Fzck̭] #jh΁OcVa/G!7<%kb&Dr#t(qS,d{43ȗ x[0҃i8[D./JXNZ"q10~yA ~˚,`o8f7*r; 1T-{Ȣu䖐Uέrʎ+PDz&Vt(ZXS%#%fAd^fcmȤ`sɯqBhRS󯣉Six~{tӜzƔ -a`_@S{Ga(|oc{+yGbn<> .뷢)f$d0K"X89hk1SiǤ),cKk'st }m CS37.!>%iRΞĖa'%+sZCqq3$ORq;7gk v-"칌 -T`!%UX2e70"k)n\.:FdHO1VՊ m+B`FK56X#Kzv_k h9U~&t5z(Qm(8f$Jf&t)iQBYD"8/;ޡ 2G]pVR7} դ3iΜO[Mb]h{6t'YmɖnK'Nt^C`& Be d@HiNޜ➸^Ԭ.?l߳>:lYѽZ|l c)JrORCI1|5cb r9n{ B08p 𔲫{sxttE>OPI̝~:*,nfj.:REQr45zAJ&&Fc3 Ev6^aDC2 k} fዴ`3!D+ 4 6`E hge\_!r"VRq͸IR%;hˈ}+[91}aʛ2^"lbu)Č0"5+VRU&Gk,IJ'Y,xO&K$pmYΆh-m  N>>Ő~QLIDo&.>g-ɴ !O >(Ae=~ȡ(!x 9<6٤&Ĩq8Nٷ4gNb&я /rPFRR(/Cae޼A|{6ٶuyZ~!5%/&$ʫ1ػGd!2H :xȓ1Ho" G+"'Cj *|6~j;q?fctBܝG`R"wuL7$`ލ{ @ NqXqq 1 U8C#m.Eɍr#Lh0egh'q(rąpn&%܋O0Mff`uq ƀXlZM_%c29;LIB(⓯Q,\bn$@KC/cV_/j0 PS[+HAKe>[4 c`@50p:)Me3f'ܨa d*j/b7c'z>'hDW#J-F7" A܁J Ï_1CqHD /M!y1V! x(a%(hy;B/xF?^F .Ao&NKr8 b< fnvK )C퓱;taᬜxLHfʆh7sK6\bB~2.B}o|Y5WɊ@#gIVq^isa]9xLOWJ/'~r7x9&QI.=|6qGsPT!;5TN?Z +X4/ %$(RiA"fv M4p ?%M$~Ss*no SQȸa$5i/ng4FL&&~b?:7p;|tNn{ Q*J"X6|4gor}'ZT97MDDK6֢J/vN޸_IQxcچ0`|;L˅2j"QZ$ <9:@Ǧ``c$&SJIH'B qpʫtƽ?ފFCbui83aĝ(a$TL&<UW̟!_ΑZ榑ŧ?㥠"k'ҩO|; hy)&+6xoa% H%L䮏=E?!\`q:Dr5ayxFfeP}~\"R"x] 8v~r2bh{wO/l19KH {Kx+nT|[ǻ- {N6 f/;(IcTM4 f\nb4!%po>4q}i,6#$%HN5zP*8b aZm=c1Yy6v=:BDxQgȰ!Ҡ;4{fT <442n<4d.nS^Z wэb;Y{j% f=OE/X4TρGH K]-H ]s_l᱕*p%8Â?S31 ys$^2ҹϣY wwVd½q=@F. 53DF0-aVT|(9-D3sLP{S>`TPxi.afq2.o)TT̂l$&ovSuE)?,#Y=uGНՋuX ~ێS~t\т,+1]D*Cr.FҐbڎ_r5Q=ɈO2(ZJԓdN<W&- 8^~ji"H8ğ據CH򓘒@(/ފ-*&/~={ d9}es(b5xX nRBFB'6X$"|,]|&k~i ճSғpHR[Li"k`ur_)oz&-cB"[Nct W14ƒ4U2 v\ @-B% bЁ,YrWl2e:2e !&X?aJć0RљP|6z.E&gs{ YyC dhQEp~s;KAG0UY\=( fLBT!#=XݴD@> >HÐboHoFVhC?.P "(*%N4:r\*8t4 Ƙ22a %8^]LF6Gsm(k>nI\~c7@ǗdO1Zr39z`rOE%gʋ˓֗Эcyl.JG(Xīy0r.jذZn/qN" 7'v-nŽSs;a&Bs'&++ߣ)E|nyÁ Nwa!'!IeXΙT>TR@d8]}e2/ο !5j{)incL cyZVvU|N<0jD"K=SIw(M#-f~)/r3V11덜+w/qw⣵ IDATʻhf fAÊ6v:Jr2r e]XGI)Vlŭ^=Gߎ`G.x'#f,.,Uh 1z&=/Ś3m&ވDD֌@+d/, '>,]O_祷BJLycX4 <0KxI_"?=LM9(rhžXI eNyZl#@-/ʺԳmȽHѲm»p$δS#'- NDķ'Y;XQ=ЙXEe Ḧ́kt>2_AㇷQv7'R PᠡS (h*{x'E4t| QSH "B@H[%Hl'z ?~P(Up dpg/3"c߈O>z1}B0CM4W0k59461XMlzp-Ёۈ<i$?K?bt 0XGX}(9RCܬ$40F?Am=gH]FwW7 'R/Ѩ9u \4 &17h䁹|xf1/,qp(2CmĨy0*HU7Ɂ<aM9O_49LFGWP׋É+yi\lO1i콎O8|0fm$'?He+n_ȁ| w _ò|@(%ρ+HDsh#&?7C,yKēyN fpV֐Nz-L<rO:Ҡ7i&pMܒI7k ,,'[\Ćq(TSQK$Cf*=ͼD$Ҩg R5LIBE ch~Fz^Exɩ(pq?\ >#qp 㲡H%zu匜@U w2څЏP (ԅ#Vf E#3#9ROxYZ$bq%Kc5Sz-" ؝Ep*r92)eF/~SLJ0 ql_bTxJ0ȋ%7H`i>C~¹2>br#b*nR,xk]̜Χ2$SFP( F hT㍯u_M´t:u,j;=8JCFs71vN~37 VHiavw*x癬߾Fނ܋!=Þl\ t&F|nkuDC(' #PMɅӄh'=$?R)`F_BM>T{3J-iBAJFH_f+3>)wehqp6]5ﶓpٰ`oHk(anB2X>7INd *f"3˼QC0~ӹiʘq463aTܤ)eV|G?4MP̰cϱ&XbƮ*R)䉧gjox~/V'<_m%P 28Fkw (=ӅY᫻in䧝pNTIUȌ_Ee:4tGٹ6k?SUu] a4 ғ`?;9#Sj; &]^ӧP~-[Y: 7-zRF""2Sۅڋ{By% FAu,"%jbeyM-kj1vP?ʲ<. `r*r&%h36 쿂˓~˸F|yn9:8Ě D8@q*xۈ/=JD8?ڛ[֓[HqSIʷs n6I8LH˶M.: O %?#gX3㓂ۍX񛆾)%f h`6pVߣ9~?QP4 [=$,,&*q ) ̃e£0A)SIPiBz2@F?,}=L/QP"1hd[rDGx)y!n`fUjYGn(TS9r"$1j䎩,Ŧض' !?鵘idrNcn dGRf|A^Lf%"_OA iAٷY$;#o|Ej*x*8Įo:H$Ą}X{sϽ9±ZP'*b6b@jf7^,zӸioOH|)7rz ~Dh@ӂCUJFb^6jo~]+HXQb3չ)M/ٸ4J݇0[iՇXIj+F_IxJ)$:m0(000Hf qIxy↚V0Z;b|DF"Nf؊ tN^ ʟ(uΈ&HB]NYٸ@1CE̹oHäl"8aIw=)hSQF0څtUg4)N,#U%{PL)RUjX 89APW42 !iMש1 P@BnM(eB"9Ep8ALJYX04uRUŨUEHD|R0Q/F<dU(d5T23)N"+HJ6})cV @xh2]'G8SÀGK Kb=K'^Np\k XEm7&tjͿ[4׾E߀Tq~F1tΆ/тWCz6aix0Co dKDj:y!׳hK0^++||if ~zO@Aw%aڛ&8_%mX'Ǜ T4bE=mBOzpke3UĔ"B'ᛊDFnz uG2-Hf6J9©t4sr4t9N<-o"5 L|q7hP8A,A(u\mf!2C4:g~AˠN bƵְ@_y×n2~g:,.rS(j/. //IP$e&xE7P[;l}&/GqDδ9lfVj:D,)$s͜؇wRHC3!LLf p/HQ47:yh&>T4"Xf8Lsy$D`0d%EԵ=RR"eN)aRa/Avb#9?im$vbrFKqxKnS~1LTp_1 (]@\R'9uHBS3d&ttQH[-6; DPʷI!%wckvwGRM]%/C;P*gRX3<.F'܏63-Y(ͥ no/i!|PVd27:ܿh_*TٿQSŞJd b9ihAR8'Ūi8l ԗ'r>DŽxrgv::j{1`8O\&5g&-o/T^jig~臘 'O`Lj(w7/poQ^sKyy'P>ovs(>Fc21L_`t (ȣNN@">F@X  ' - %n"~S@ f#&5B+}HGp#FqXA~1~l DM;٥*f}+UfKȃxKyYhTX˩22r1 H$="XE9g!\n\``})J=O.!7[TKN[M(FܺaE"ng51=>W{$O1r@;C!Dj/ϛ,ho553&$2f.Vcd3K~$G!p,R9\im0N$,VI(Y͠S(3LY0"\Me'vaaw_䫴X ~dhG{;K7@h(&`0; '2! HnFQ[~`F)}v"㆐62 Lf3;'b.OD$ÈXV2SSGe2n#QDQChE~xSMi#`M9[LLKeh5\",^V g## KiGKzqT6ˤX|=9ZʗH:ұqD<8؝+]9PHV$CO.ۋ /%s=!8A\<P1>w?s}xd)}LLc^:kHDiDx: > Bp27Y(P7H"QZR"Pɋh2^o@'uS0 / /~N@  C'0{L=t%)X5 \B&62OzA4 9_݁šHawpIv| u!$08@O<ÐHE_Y0X:z?1xb\M>jGû[/a|f`}6#7}CL%>9h|Km6?-b:GBv"z>:H8tBz L}w5DŽ ܬ߇LyVmƥ|skexATD"+X54ӿjSRJ m,/"=YHZ q 6nSuǒA\7h ^K([^VL .bU!򭝒tyh1]$&` 9U2҅~XQM$%P {ZQP4bFPQ`È9h)Ce[+Bo }p :JP! 5Ds*. Px7u,ePDr4IdA~GM &;<($g!Z$$&VۻQz37&M4Srjc-j@*fHP%BXǓyyx[8sIF("%"8e,Yh|[[ V1 0%\`勌w٘ͤs?ȓa$tNw3m'Qh @ XpGC4|4bdJ\.Pk荧;*HJU BfBW ڏ24ֽ );KQb7HA*Fm@o}'[K+LϢNVM.b8|I\Yέ3HP'l+g^z,}y`4`1OlJ'vB/c7i`wrt2fF"孇xo_McXq8\^.^3⏏7ܶw7q=cl$6#y 6z+E"vxaSxn$J^&bgGm-g~ 4 GI!Hl~uNǓ~5 5SӊDDSotӈc7p-]o@?PD"hf͓npq b~S+jJal#%4PD".n@:%ɫ龉Rza(@( k (9DF<D"8NfFs͇qvlDaF*V,Fz!KG 8"C% NT1ځ<0]Bw(*B?j<8@7OBa(΁S( GA3K50F/)MS L7 ! *"Jh; d48.2]aSxs[鸄& o# Fw{h6V΂y.I8ĥDQHk#AV1FPIWN; 6+=8ư ``1Qܸ@ױ x"+nfTAԜDAߊMd!z[ 0rE>h&F# cCDৢ8E<p[ɻ+㓈Ǩ92 VJ |iRHK$:NL"w2ܼHFb.@Bԫ-$0WГ4 V4 VЏl{09WU9wO`0 0H4LQٲdZl:ږ%ie͕LJI1bB&sS@Y0OU=~ cH!1ȃ1(P^@P6..TV5j]-Wh+ҿ("5r;KԽ@Qd5m5 F 90&(nqUm`h~'j.7Am@ٯR[<A/zx(tW)<^m"|{ϲԽZҋM hi0~g2=n+Զ33 ùEmdHe{ U~y1Z }RDu+Ǒ<(,y*RXj 3)\ K~A KG_.Ǝ_Eӹ:H̥ǰumwgN3{Q&"[|]`a< SJMŽSk V󖟧"Kd&=ɶ#B(i =K9K aBs?H0sS=H"$ꩨBiq%o/F2uw X6t߇:CfcLIHA%7EbǘvH]AĿ`ᪿy3Bk L9ӱ-E;m?R+zBv6۰!s Y_<=uYjĘ !+t&o/fm'?A_! nCpQΡ!Q"d~ YT`QȰ6i~9sX-Q: r+VflAK> &B1g|d|zO -C-h `Oધr73O`iH>wuWL s#7B{H-s[YXfq1BM2j>4+ ]mЫ 1%mtނYQBb_ V18F(?Ӽwe|lnGT/di(AbUGҴBS׌aEXHKf # -hc(.9^q^s-~·Gx^ƿ  P:o`rC,ao+ c1}1r?٫1TJQjU  v2TD $ZAv㴼_3-V.aremxP| tmTo/7X>@21r of~7alIZ&E :CM/[efPIaf4og>\U>Ol sݨ _t=C~,> f<@~ c|?x qW`>D$( ǻ01"jv_+6($* 61Ц6D ȵqǶ $ŬZn܍nH1pSy/DO,ށE'ߏۑLx?͝_aloRȵ̾`#7b.ad e,`5:^jjі9>#Y`$ߦͨy~;DzD'+̌Rʒy0c4,O nų1L0&Q7 ~H-aeg> ,%LLn/bGUb4!5^$ {KMDav.b^R9<*^jrz!VX~[@qI^4S\¨ɗQPu+.+ SL!y !HX3J>fc;M.?q2<1-(0':z4ȔӘ31ѷ^]H"ߧ'9f vhYo:Ԍ;'BDV!GFB-/X7YJ;p?Z[p{Ȧ}Cyl|.ߧIlzR4CSIS=O}ݙXMCDbE=%V0?Do>?\AԳ՜?ܳ~W}-XUΑ>:p3BMQ8=ӿTnSAl D0; U{ײE*Ѷ|Iۋ'F[[h!#|Q!?Fz'Y%U&e*՘*Xh>*e<@ۘy̹rFxzTܷVD$IB?K3?_ }]^H~CXz]EJ h ! 0Z5R CKۏbj~! XKH5D1Fy00m0>t !}(~wo@)澍ҁ6Mp5[D`>**zg0Ƒi2s%|@4Z!\r+La@ R"' {~"#Oa-Ѿzg#s 7PX T:~6(+T"wkaiȱ<>F/R6" ^,ߏb5*:(Ћㄣ$"&qT"[0TMPH;Pf0 6qkTd^BHE",MenH DY|j( VN 4JZ?P8@b67Gn"r~`F+қZ& 1'@ 9˵ (`-) ;w<0:'y1ƈIy>QfqlY xq+2(b5vR:l'݇KkW28 FΒ{$k9Oo& cNۅ:Ma3cBYAo <.?O;7~п3x^KcL6W=xm[=Bt]\/R[nȪxX2bյ_YnO"#w-qź֦7%[\wn!O۶m^,ԌA P.!* >?m!ˈ&AO}! ɕ:VĿ=$*عZ[89s'f컛:@n`(<ŝ4HMFS>)?Q5|QSQ\%a~R #1c.7[d8qaPeڛXJσo}lh7b%nң$#&dtLâ:HTE0,3Hk9nʗnoo+*2^?Jjk.n܇M^{_}/vW8DKͤF[ tPTqV$Sb0}?Ny;{+>DYCijInDKltKi.ϣ) ?GM?y;|_q7pSL,]?<s#(~A\A j 'UF6x o^G_S䫧ʩ Do'7m|`lfWɊ,\_ 5c`cNQXk!hH2"gEŲȔIΠ۔Md|vrU \X|% Df~T Y&8rл*(^'!$kչB1`J'+nvQ:i ޅ:V\O%CC,k&'APHNӃz}Cv ) " 袽dy}S& u xkg?,BO s# $l7 JIYۢmIxߧ8wGeQx}%t`xW>ůXo~AjJh{;F $"x}} -=Is`:~1f˛̪ERW&j8W/gZ^Iz* AS r JzpP=09I$V kK^GYQԈ)% 2XJ<$ç0 Ƚ /w_(N 1Y2,eml"bʴf("n[FDE #|γr8_Pj*([S^YD[|IJeNʻDFhM$SO?W)Β.8xh7Gn1Tғhˠ!&6!)"zЦo)CM.&D3` ufmƺ#$7{>HAeĈycTIVa[&.A9qXtrcWZ\ aVfhaz,Hgۂ t?HM;(b chNB@Ɣu_!cwELRShWD[P | eYfbovYvo(r;O1 :%0透jQ 4<CW=5>j5SQ>6D%2*  $+EC7p'%JcniCOG_g܌5ڋV~rݦPwY>/mcW`=n/?e-] L(ux.Ҙ&L2fb[H0 IDATn""e( pǐV#U9<̵%5wet  ]B P9<K6-o ^8 ۹DB%<7 s*2[9!1SjQ| #Z ۢ *s+Q*n]8'>mIEtRacԳ/i$|wԇuJ41!)tjpHsa t "_%TGn0Iz*0VR:𧾌OK-EjcTHpKTD0U)g fvӺD q懱,e"^e@Y%uX* ,h;n Vfn\T]^դ&IoC7cOt}r9ix ri믪iq)#u *f87λwwFTsQ1H~xƗPIZ@`LuJҫ$!m͍҄VZwEGQa.07΀fߠ a~llwH-0?=OwBĉխn =PT7UzItj2ɋcs4ƨf$@شҩ֝;E- (̭PFHґEKld@wNK& X%,R3$z(!TF1 $\K|9ƙAK(gd YrE<( 'x-S:uAW=Q "2nheE^+8"H'*0F.67GQcpbx oQbjQzMiS e^Pf!1ˇ>D@FE׹20/"@^0MYƶ;"| 0lq\uHXsBcE07Q܇܁kƂrt/NۿS,/ae 97anl\E"#Rw7$;M|Npk\`7)ԇEipb]ϮOOH^U#?ꢄ=T_O\E$!ExH4T#$a5RK$Ays  *29 @3qD=w`Nw>FɅI޺m㖐P/h%ƚC(ηsiKrn-Le)).S@]Atalmk[m[uEӜs[MNr9/7zNxcb,(o/7(,HUnrrMT&gnâg G@6f/&=V2NO% /AZH.!ʃjI&h a7Hg+CoeybhU$@,bN"ı+o2yHýd>J-6۩{7ݻ|n92Zlطf3*"齝2倀t0 UoE!̭tE MUA2 -0᥯u+@. `4~nphWpފŸcXrVCka]sfnÿbN9B)\34Û=zCxEnPհ*B3k'W A, ~n 2iC h9j(,|t'3 w@ HD[`Mǻod[# hs2HIԯ9g BLwCMU*IɤR\K*?J*UfX9>J7O`ێ6L:L 1U Ej A"K_]͖ۑ%x$ z}wrqlD%hgډ1p'N={ƶ3-LM*&aC!!FC6]#uAUFF a]m7Q sNc㖨(O#DT)x @|hxe$i=( 7kS\eT4 VҸ[ÜB 45T,vNM2 CuPTM( ؈Ibď࿅h&YȒUQ(&[C;DBXEF/W#S7u1z[Q\ P[˕29a/F(qMjg0&#m7ٴi5ƱSk[\X7kxn6s3h<# \dG3>7H1@zQ^fb*a Ne*cUsԆnR"3cq~a*g5^< w K,L .1-yk.rQ4(U}X E^Q-`,"Lgm0"?A.Ee!EpXgwמ⧾ğ}\=dTiT`hyLW@2fcw7v o rJip-zi=t1L`k76&moIW )>ӠDՐiu$QH%ISEǁc=2^>uG[1\1NP.S.P}GhM^7W~FFxFCE ѺWeBiC/݉BšU`[ aȭS 24 r6 k`e0,2=h&@ҏ[Bq/xUDzPu dA`K @g5v}_Ogj'Ћ,#@Rn=^ %Q^dev̬uzEMH^E/0ƭLv),O`*h:2YyZnm( dxpЮ"x0V+ˢ!E^A2ޠWf{-:2, EDvQw@ؽ}P5D;)\,B m.R6"ȖqKM^ eJy4nUƗYZfiQ\1IY&J9`9^p'fѮ{\.2Nkafo.?EnAC~Hx(7 8 dvS*;]6V+ D }}5BVUErQd=#w'9lg -qK=i`WxH q6]bfr'^4ɒo "oEqS2"xqWTrɡou&;b3$r~W2D9)mXG:]#a*[nIlXd!w_R?J'PұmXE*X&Y,""fY3-dJh*nx(oN0g .$Պz7x8Lh2-ۣ7(/, eTB-aD ELR-R%nyj  fSgY䏯~ڻ#e,CFHcYh&.v1x 5͏x{_;hKb8^f mTtRbfGxwhHǞ1  q%0a"f1 Dl >?};rn>E#0;I;IDiR-Ύj|er3Ծg~͠)nal²݈yiUbNb҄6<K6y'."( u人I 'AJY;M`A:?IW/ͿE"b)"v*) >Ax,#I&_ljT9Q?\|^Oe-< 19y4n,N |>k:Ouxcüg>2"m 0sʫct& ^ԇxD32կ(D|$;>y:3ߍsFh ")"%lyZg8؞GZxdKEY%*Q(&"ndtՕs{現F48hUNxI >O?d  ˼av"m-iB8Vca3ȃxv&޸6by], Gxh<OSˑ*r#B+uObb0ug:F_wZ"~@r $J3L_c\8CKT;HVp=I-I vbT#8RzVFtW`fD`_3嵆!uvS3nC)%e#vTLX,Tk"$S*5$T>`%gpAP6ĕxsyp9Cvw{T\Tc.,P_=KX-<͋_6 i ^+n^~ϢՍgbdtr, it&'<^+ی*Uj8aNN I #|f,A 6eхۆ͆ peQ 0~y66\ Rb &ICC83\}arqp4S_ciثo\CcfIc!{%'Iu.,_$u[0$wnRXTr(dIVV GȗPeRy!UT&;} &u\}V(A}=I,QOqrAm\#gzY%N<&`k/@;@o`k3.n剭XU\E.רx??8H,(2>o6 D#|U>)>E8tE?x,Y]煓|m7kF/1 ǎ.FB8'TS1)Y@G3ɟEb)&b3sDH_!v*+-Wf.dP.kw\1 &(#m=vΑH&UXPT%16O(X-hyD)**eE<.5)R@Fbۊ}#4}$(fL2LilnFohtt( {ۍgxаj5efi!;üqbZla歜 K*߽LN2 pk( n^:F=ISȔ)Tei&pcR"C2V3c:SKk(z? 27N'x?V._D Ւ 71:L Y!܋O!65OIK{ Z@+0 PO?# A ]@1‡p*484 `P|$ l+Z+MWO27XNpLJt`ष4G׹|92 ̟%#ec.>?{`&REɽ|{,3ɾ)D>?O`8q PQC2vP/cKh"?ϕ#wP!l Ѳ²jaj9ş*uS7RϢx) ~v Bx.x-4چYemHnj{*; 1;,m̛/!p߃rٗq @5R-s6 \_s\`md@qj!!{я^G`J,.w.G_xbr!̛qI͒My}bn׍xQn tt 4kel<~F.r}4DPApc{EeW xr65.BRy8|Q7=MMz?=Buo={e&.Dqh&Q =L1A%AcLi">Cn<4u4O@G^c&ʓE$z 6dFW ,˙e 5x3P)wg$ڤZڴ޺X=PLؼpq8@׻%7i }38(刾i>3o-sԫ2c8#T2 <$NS*/0&zp,׻@@bq fi[!fE>ϵD..;MtGשzp$( 6B5$ T'v-__ic"KghG*5Z9K*g0oEQZg_W^Ed"zŋd8Ep"6. #9J/< E& 2@V>ZiSbb`Z"zmcZḦ́v9 |7ast=J=A IDAT3:km Ne;@m5P7EC(^d;܇Ԋo zϐq;86m梐!>Mg Aߣ$GВ`uv7>lMtmW>'H̓F~ ehY[dL}xfEJI vSrOAkt*+(m j񳤏{dh~,f!+JmASF)ipR2q \1}|QT+" l$#爏a < :'A` (hG.J.C rTTi h 0*6J#vѴ`#WNR+PN`\M"F<:s X(ͣŐM؂ʆ'O׻DI^[eϹ9sSذ};g.c[ ߺg S1lM'>hBV8ƕjsnAvFim _>Q Sdobq8@Gt~#f8;wp(N}s}L>ǦO F5:Cc78i74m$%9{8Cwĩ >)p:ɇ(`i#1sqL=|Nzr3Nö  3IuLiT&jS(sh)̾)1EQ{vM ڏd4d6թ Ii D,fk;j PƶQB+Mcm `öI1_ˍI}({pOCR"r~2*&6Qzd+ Hrui}o]5.l0$<^$vam@CX}$Xl}\Wl2QpS=G&X4t2vL,y?4|ev2HV,~LvRS {H.Ż I!F2Jw=Mc'c/Nr[y JzڈB~Ճbo S/W09@0q6Di.@k{wn]媁Vk3 ,*&Q7EH$ AT /QѸl{{clUsJJAMarqx7ybK<7G\>Nbk`=܎]DLDI6*e>g"Kb_2q~+X$zJ~cZ¶Mshy~׽LQ$i>9y۩khEP,p(t0TJ\>gp3^%f²H{^CSM4#TyDf牽g t7ɟfh~o0E(LwVrSװTZOIVd^EO@2Hha,0)%zȝ4޾%Gn eJ7]bͷzkBpbWj+;bt=Fd|HQól`E{(%ZC?=#\gqn" Ο!b!R$X)͡c L6m[ = ?j4(rD?Z jkZ˚ ؄\7#ٝg7=Vxn|+ 4Jm6oZ4% Տ ?1y:IZ ;Am0[ U֡OQט8MD.dKB `qߦ1$߲7ɥ1;\MLNselV}^|;A mG9uaGװ% xL_Zgy "|j5<&h`vlNj Qap75 }70؎;ɤI^e v7i 硏RySDFd~r{+Cg ͏"̿A"۟Ve(:{06D4Fz]д :Z_b'2n/(| NBz IAڈC R#SQ%zON}(^:~<6 5H>jE#8RHW'1PĴ с.@OQcNΓL}VR?F-B uX,kLw_ޡ -ڐ`Kv sɷ9!xoA1j71 *|$OboC+3WNzn0]>/p5T7zzΆ\>Շ#_BpD9Y>q^o`m۩齟roäĦOpn1'(g)Ũ&1lV]d{N2~P7`k!="xp=J>$Q*pĵ;K8S.Adaɯa63rC(>I:JRjdlELA$=i*yD>c?h6$+^ V$Z,ȆVXD~n[꞊܈)Dyzv + p0OujHVj1EJ5G5^AL2L0ԦW9xn:qъ JzɄuC <̵h$&%j5Hc nx[F&}K Md1ס vCT/C0~uZ0[G&I>xla*W0K O8:][Lx{bv{ H-Eý8|,\$<܋l .?LQ|-k2Iy4K{Tdq@;sMdgQT3TƐ =wQ9ndM䮠'<(R\ katƴw\-HDR#[)'p6E-;Or3 1SM@={#^lST#ԗ0wRFi8Uѳ$GЭTfm!S<[x@POFnM| }4naU*G{2s-ǁ!Db [Y^g!߲}\鶴T̿Lb޽lWRLAmˍa\ TDf^%3p/.?9bWɞ`i8$ƉIWaXqꠘ ;I}\=G:>f_'}p~(+\;OSH'Haӻ2?JuRǸuWNi}08< ZS7ch1G _[4Gs7 Hj8[KTmk3%PmD[GmGm:(dOI2D/`0!zQpZyrgPLZ5sI% w9-EWnE͊Jױlxjn*zM((][Ъ:>A6ױ R6dL~ogfJ bۨ8.3gQdOy4C]b(K*ɝdo!I\@>B)1=iǢ2>E&6s/!—)ortLl.ɟP{5>ŗ.zlF~ s?sS̴uDo7SszjSK z$3m(WAYp9)pع1>f/c+,~hBf(d>I/R+0-T{ke#KEm;f/6/ü[b'&SHSJS[8)F(Mx:z|MCی}'yթ[1EbjeD mBO,ȟarnXdbeƾBvKcz(dRºm,KZI9Y+lmD80&"f N֋ʹX=GL:(S, Sp D>2(6LvD -{X4o/7y9 X Z8cr/q7P8_ uɯ\f rm6jdRL'<VL69cWEH!ZR^XY`k&s{Jw+^Oзf$BA:[طaHޅPR &ۨd(_'I,D[1l;&ѢAD j`4*˛E^rqgi~o|@7OPd"׻Pl~6<)F)]Ķ _'3/|k@aJ/>Fu (>W0 :(&@ QJT$߆H h%{^ \w1ۺe9q=cbAF * w5`+ν\Mn㈡F=^Dc列@-wMP( N8umWh 6K ުt m #ƋP? u?bG:?+m[囖m=-ղpN)㿮27{3o;e]L k&,+[@l\>ZkGrO|Lu]ח=:8ѣ86S+˿:D ]b G ԡcd6*+| 䍋<5!F 8ivS?df?&;$Zl;!?}[^WO3fc3x[qDt+d'bo'}o#(4 :"?ʷ_#L(.PN!N~DNgC P"2ksgZY4|IW"O-Fͭr!T/mI'7K6AJ4At y*XBxx43nv3́Es:zktP Il2UbEDe,vJT˴oY3c">  Vv^قŋ{ Ӵ'8V 6&wxLMgnshO2'P4&U!] _UA96؈(aR1Vp8F4::n}2V$aQԪ, v:?L6]>΍7~@*!ITƮ̃=N-#L^w|zͻ096n&g'*Z[b_9|Vme{+v3M>X (nùf{+Tx2/ 9e+ȫ^Pu?kZo.uZ٘(߶xV5*Ж@B<yZ26[_nWmˌ/Rg&ʗ@j>iAE#29wث<}!i$ ?_']>.- <(߳p/q~}㰏{G J!LgnOO2F6?H6J2C`r+7xc hfsK930.`>MpQ -@:ǹqa ضPr9fy3rqͼzؚa"K2F&Ŕ5EBnۡalB908lq6$cW)i 1q'T}mnnV}P/ cۈVF>o!ˑlbEPˢ6c݂rib@$`1cQ~I^=?VbE'<"_Uo@l3rؖ IDATbع @<=V;fz&rzW=N 5v%;8t.4>g2K4E*cRpid#`q~ ERQՙdJV̰4Fu *TSٵ4< _"yAJ4|Dssܤ [P:JxYFSZ$>JLQC la A,]H=OٷNP2aODwgGOGBlpjXa.űiRq sf'|ڇ׭1]($D[ȬV<< .Wܭ0[%4y316ȞrGl\wbIxN[r;qzj E `4n*jeC/Y)V QE)ڟ5^'iI%Ip݇m7-t_>ht lJvt k+ Tdpw IP ڀ6ҫe("\h%[<)bt7o7fC(oq qcY@nC l4ץ\#{\փb|)gM)3;|z u=ucG =*Ll*Pޡkӆ`F MM#\%""Ƀkhu D PPU\>CBːMR;ˋ#( {ݳ*i&ՆvS1P4V&r ] l~ F*e .5vMME-Ʌh'p;;;$J00s/SQOm z-jMZ&rD_Ya!w\eĕҁDOL= u5+DB .ݑCv[7}{sY;E4G~flRi#[$@fI1MH$G@HJ %@CHd !zӖzia}+ Qa_B@ZMhJ/Ku ^j)2,A)Bp8F)J(~mlYO I0CHdg@Z( }xF쀑85t 2J QԂҍ,y4"(ko0tR듳 UЫq!5"rJ}Zs9ٶwhJ/S(HE.I2Y| DIT8>^22& *)C, BB<ՆjۺPKicqra,D9 VcHx[$6rq$("yfoD x6ۑ۩?3b`%R%z(W giv:ˢo˹oUk3Xt "NshyJPZ}yiAu#xQT Zբb(;3ܮڿX56 tBx}X[ Pfl꠿cW0L5ƧA>ًl^'Wmf>()pI"bIm*.R4P4OFqCS+P+5 n]8;r# MwmTCTbm~qU6܆&\l^E3Z=BO =T&,T,G+'D#q ıL*r%ٷj&U`Y %yTn%7a$ a5;0p;iⱐ˒)q N; 4aQ@׹pmL'q)=~Ƨ?,67TGp#>;D4fБd(S͑CS#xvbv0ՙ\AF[?8>|?L;.V,[$ƻq'77ylM6K\"Ȓ-ELP;z`z?3HIu?w~-ajݨ/A0OR,7I@-SIanBQnB ]FR)EѝNZn=LX?qoaʶ7.ӷHYme+`MMd1Idv6fDp54K|w?)LbyTTD$"ifXda¡M J|`9 )Q0 B@S$D.}e3g걙)@ w/*Zl=tu"OW1i-Yeʤ_˒sݭjS6:VN}'B,׽៩)MoL&ai 9d Ռ !.ySUC"8"&BJŰNd $ VÆdD%1`rO 6p8SGI#0wP42FȔ*뜗B~q/ Df\`w'4As' CneW[2k7^>ub0>F`|3坢ZؔV^,v"R (P5bI5ȠTT^ՌKksY]3A!@)Nu ^j H7}6b/"NV}k ū(CaŵzŒL39ٌMeA2NrV2˅9\hwKS&wa5_DJT#k3ƂqMFִ5Cص deSBՊhTPQ_n#nCXV"FDH+*+CNIb{d"b ig`3Y[Q.39㷑-w5{:18X8YUf`^4BF_+Yجf`Fq|!K>4@C#HT H"(Fͧ#V-#PyGD]G0-3jM PB4k G |[h56;T3P 1!DŽ sDl[ ~ nbfn&'zCWrl&yf84 ͼ;M~XM8@)0;gj݈ t vql`!D6#C@;mpXE_I:'HLFyl{v7]>$pjp?@[k%dbqXAFWn9cgj!psܺ@aຯᴲYm>up~&&&Zd,#ɥRƱ Ӏe٘jtΧ=uGif&FsY `1񉏃H"@~\~w >Tt.4`CUbƾ2 tD\^A+bEYR(Ӵ-5_wI}yZy0[v4\9Y}U9ƯiG2e{=(-rf8GىVT5r?_(h kO?.B3&l!4(q>UK8|k)$y"pXFB+b1 eFlvvU\V A'D]ض9@-GoqɌ2S54PbhPW$.U!t~J(\4Z"wJ=;9F2'm,V+[tJM%t R t1r1$ GbG-+ȡuRPT4&2ylDRay VI!]$})I EK Xy2WQ*.?O5Tl`$H#HHVdgu[ 1 %.6ܱ%l&JTP I$8Q|nj,f{.eayaamH~[UYp3!bfOQZ ]0HiOToS1^>Yԩ?@t6nqGP`V=F7 X>(z2ɉux[ uD<~4 gm`ݴn N75nJPR.p8-[D'PhDǶr G#0sToe~ji,!h*31+><]Vz 'hxsc76L60~,606а(&T53-T>79{w(>N]ux( kRw`u`6qo ܉OGb=^?,92l 9G 2'q#s;)& 63ݴNF&LYQ(sl$Mq|L]]ւ]]3#pEQI#fc*J6zXC(籸LSZNPӊ1,^З G)r# Ȥa<;hJ*NlW^?cHFgx.&8:˃aBd3#p0I̓{xұd;L.#& !v1UFhUĕk\54柡Wp5dcHǘ~WE~jGHGI\CwmwߣE ?X"7j#eDv^^*7}DsTE5<=LMJ)2c;sT @EO"7jc^elfO-Qw0 o#nD(M@V h$0I-Cɐ;k9R=@^AñrlH4<,hw; +Q]$!)^E'1HPñ%EyAaG#9#kpGOY_Cv$)]{p% 6;v=itEÄi`dwL0z>_AYZdRp a$<{H.#Ʉ㮡\"csr!};Lu+ڄR.P#H r'M8d S`0~>4S?"4oj9)q<fG Րי_J.;<6ѷz?c)\7UHapÿYD طQöLNs%Ú?23 7 i%WThk˘B8ּXm%yT<;-PsXQ+kw3uB_@ ^2 b Z,`08zAKs!C69H*^ T%ln{=,gI?F< :ރרDi}h$HZ@pqrם92zLJJ׃(6kpv!T#ʤq7]`xBNi]x6O)Y9LRDtbo5sh> ~bl ɤ8wdeb1r14 Um0!;y"/ (GRՂ*G0ބ.нk5_ESR0=~K~ͭN\ 9LK7K ӪyTt2䣜6rëƘU(NHlm%rgAAp#QFD_oZ! rڍl.X'W%)V*"8ZTW{[|b7Ɯzn|^Dai>^FpogIL5#EGUkX\KmXTLEqd`nSk l|ۼB IDAT;@Ή"2 };FEEOckQ6&ϑ@A߄O`ǩ 0=BqkދE"tKتP+c%w'igx?-NTsf戎@18Kw0M`B-ch`ie}(9f} *U>.${-H&O؊3V!Ȏ{(DJ.:ZI{? m@@n`a~1HihۉTbъE-A$;]rG7>v#5^ Kc\gę;ʫPlA95)s#7G!)\ʉvS!װPCv g/ 8Z)Tm'o'"ȵh(%j ;K#Tr)ێez0YzJf8z̟ӟoloAA>V'wp 3'[]͝DJX'y:>!PqlN?V ZNُ2كEʣd!Ņ&Ʉۋ$1p `M1]>DkbK*jx'dm`)jT lMv&ł[/< LvN9ؽddђ|(v#̾2@,Nfbçh , N6c2 #PA!K(CaBsc jF+!G,PBEf<52K:X RbS.%7PG;H^AYF[MQD Z!wE ֋d2 ]X\(̡quӻ19E5_5숶p5/| ABShIb;%ApSddԵ1tL}x%P#j|r42Շ8˧dj cqC9a dSy-f+s4t8R"z 59ŃV!B6Af8״3)^5{CLMa0ˈ"Ħ(w%g>G/05?'aC&\O!QJN|%M,ȝ">&~W3(1 Fq9C cd+1p#Hkd=/>00>ªSx>ea|ׄ6wPb6TeB[$wm?NM`7v:.atVI ÄqW!Ny )PՀLF~@!u!P Mદe }I 24mX]"eYԤm3Q}xi$wOEep@j#Ofg|0`",E/s7 ̜C4QZ!slflf{dIN#N:E.CjEo\S?%}vHt(er9ϒ8A6;?@cc*ػ8ma=tw?j*%Nli604R>|!2nny5h`bWP3#&[q89]e()HQLC " K!^҄2K$gH^C_y[~cuذ.|wcuPA3r| Z~`ȞZiӵ8cfdF`-0jɍ-Rpط\tA*Njt|VYZ"!"5K5(z{YfznjyZ[9 q.мsUqK[La}{/ Q XfHyY>)}Y[\b<+MT@GW_cM]h*3Oo-"E릦+gkw?<@>Y9EA$v ь8w=K̓6S.t1xO ~B^ )|#kSg^KxZqHBYH%ҍx rUE0^yh'l@G :H6DuV CO9@` ~<JqD ÔRHfHN,^A60?h x\fg@6(=TyIf?QG~WŘ8C,#$Ǩ!HF9M]X/7Pi8)\=<|۠(\sGnQC&I"5 \ K[Pa;<Gj8ZSVcS11m̖ۈ9$uNNNnCUB!J ?ML&IMPW8Oqkwqe^,;p:(xK$ӃTJxL}dbxB&$'LRBy̘[e $麛LɄR̒]"ۏhCS܉PCkh87mf-srB0I!֠F8rs }=8nXR5j$zun6w,ABzˑ?$_@60ogq08o'%ɜ2Cyқ8߹P 3yC IӇ=Cs'(F K46fmLr~g_FR$V?لZ)E4y+e.\v~u({'&; ?܉ *k#HuLX9il"9J,g G WUY{Sk7̡anK?\^y/oиB̞Ev`tUvyK3>[k$rH6I.3~b,e_҅IVr6iڄl!i_OoaeLaJxlbE$E8^w;v7x8hXۙA ZvߋgO&qd\q#@)By>Y=HUPV$"B-{MoԊ|6;ϡw? NAi8f,uB{ Őt1w!M0 &СcaԏeсL-G0chb4LuP1wNsE&_gt=fsdޢ,AGI-*M޻㧶 F}쿛 g <B!I%:zOl|"Q"sG,@`/n1 Os' .K}uarwC4inBSyA6N~@;$Ж@  /zN=Gn9.G~׾لIl KB6fQ1#JXh 1d?[QNL^JKBTdN a a~gX`FBy `/1$mJXzPn| Hwo o(Є^-TA-S) xOFө(3;n` LjKɥ:dxe 9(#d_ɯzMÌV@[~^x~@"{(\ǘIrРQkfw%G,krK7 =A^^|U\xzP=CXD`yB;̓;{̗Eb1>@U4?܉J w5LX?K}N*Y0ɜı@]8X-y Wp#^0 =e/㫦Ӻ|o"7qPJ>S̿Y|w lc1yO=ױ H4`'I<,ĽMRSljƮ+ZQ xä?C'Q _`xai2X`Y?BmȅxR #ą#p7YG-Jm o'0KGQzBYD7po{ 1Ck;Y89<P2p[#J@ih¿k31JJG 8zх7 40} S-2&6l[jF*45O'B&At (lyΒXb%›z 4l$pϾ/OV^~ (`=aFG!?cmsSo&xx}lzk C(:*lB9CaQi."~}L _T&cߧ(va>=Hs'2($hf/V /#xH"tO9eT5bme ~B)}c0 kTd(컋"L]}4#}'-wREE!1hfyx <–xeې-,ĽUf)'^|S=q;pV3 ЗVRJ4@iJk3٫X"T%el0WSD6SjwKW,v*9r}P1VX=w"HWvqWCY |b%gMMTf<; -Ƀ:kjB x4daW(aefٰ_"|' M;( Vc215̓tj zr-{pTv_pɗ߉2uwWϠ յ _b,zyq6S#ِ-f|s$^Fn #4`$@AMi[-| ]&=\$wS;[bZ飐a@.b'|.'uO c2Y .KL=#A21"mMcpB{$³xH.<XZ1)%"xݺ]\1[sץkX7a"3Bɵ~Qݱq /ym"P{> @>LF9OU ֒;k::6q-9Zkx5.J8xPhjhQJf^Cn=4Ux"yQ=3۫Vޫ%ٖ{`b05`B/IH!Brr.KBI)Bo1`-ɶzZٙMrKٙ@e|70 ]U_B #p0MCo#-:$a u6 TQO`|H:F^""\YFk!фi: 28E {!_3d+ddhzIw'a?zEel%,[^c\6'ni^6Kt} Ws`+LF" ~ʒÝ6E1)?bf.&fUrhkF((L$@V!eelEj.7P'nLc؀NJ9W.F#2bm$Ԍ{&ul'#=ԃJUBo$KJ&C u܋ O=lyyn1IYl 4=?>/&0ݍTClOZEoA4F4߈_:Cᴁ>):й)QyC>0"HNr瀅7A 52\rCA)S22MP@CqU01K0š!t= IDAT,Bm=v9D}ؖb"132щ 5%y5܄GQسh k s(Y"S&!+/(<`-?b嗹G h Ycb`"EH$[]v?o#PXMBY *V¸prZh5=tI"(;p /{pV2:J̾eW[ڛȝKad` *fӸF"4Bן{3!!c:gLFn&.7*&"d3og\`9]['ErϿ`YE, z`q F n|_'L|6mo R7V*֢p#@1BJLŞA4] Dn{4?1e@k7g]^ώ-t=i3C`'Š*DWDy¿s:}T?W zdl`maQވo/jTomZ`b)];'C-DS#x$7G 0`p0Hɓch=̠!Y0lR: py ՌG! 2I`+&8<͸N}<bl?> Qٌo3']`$(*#a$Lе_ctsMpv!38u_b$Ag+jʖQRF{ {R̨)\,cp`-X̌shuނ VS]C^ozy~tjy3=D?$V&ɭ`ҳx3l!&ĆA`- 6X2)"; Y'fi:^F +{z @%:FJƛ0.v#4%:BR1IY) 7$E8jǷy7s"{gZ2|ki} k9s0)c)1rv70ϖ@S)߰7M4 L;0C,َ6vK*1i@3eÝd#e ǑAG'3EslfxR) fL%70\R)`(;-%.$?$Ҁw65ab"Ms߄k*cĔgg1Jp9d:H*KSn܀ DCtp#n W06'MO%2lY$D$7J$mh j{J(cF@ZO 4':1$Ih IHfLTbA5g:f]xJ$ȜAb|QA a o*z3 `A!mfzPCU"}6tNLzyO1tJ_flrJUhy1*3g)MGL~ rW2R*0qY墦<2*6I?G$VJc2ԍg.v7^ AY-#(3 c}Dw`dCg#֍*2ޅ"0g1CEs8  A$[~4F:}"q  113D5E%r dTM`*${:d#Y}5Lb#FfIE4A z63T-m,ux c=-\KH%QzPF!G!{@NG !\!9QU^#I 뀌.5 2Vcj #m\hɖY2?dS LXȞJ?%DHh %K~am:q.ÙG&^# ao& X/C,_DRHFDnEb%GԱv~9= XS9h ݛ+)w?' @L}O=xZ4Ta- >Ό)їGp/v懨D_1^JpP3Ykݎ9`Co\ϼ rRX4 e$㌾|6v{<"rl`CVNCml 0Z 5E)]6㝤Xrɝ¡ߑsfr0}StAəL;H%W"܌d#üoi|+:柁ʖM12@nfá,^kQ2i47QQ:6(zj~VɈQZvEٷ?BJ"mED5+FzH:wa>7ԊNblF|`ߊ Py&{^D@S+.@S$ux du%E=gΣ`*J]dѿF q|$èI*fdw0{QU4S=v&CGHD=^,e!c23 % B(̐%|a&1rt{35ht0a٨#zDa~\ADobʹ{6)tˑtt:L$„HubÖuDZP"؊VΈ(FnecRw~-bG $@"!gѭH"cI"A%dzp7 ^uWG^IpG6#cLtQ[ˁmBرW|i+ҹw #'Q5<4Jǟ $r3c׽_ P\E{U3˯~4)s}+RvZۂ>Zf_sD GgDoBI)d= g9t(9jHZ#]RFBUȚ$"\u4L]x%N!5i3Ȉҫێ܊keZ)Pt9l^'9G0"Yb@tM1NZ=:>T zP` LS))( Rjޙ@#"ޅ>eUd=`%4 %řGN$g3EE݄3L @p2Z-GIi=f tCJu=A£d2s ĔIKg5~b>| Ũ]Fi5/S~o;  ]>f:P1|BjwAl_ȶ#;jRUkߡllFo'Ij.J!$)8P9T,!.#'Bsi}Q%q;%+)bxK|.EE B=8ɬ]5[Fv9[̔&5SQՄQ` BDڵL "Eo[5= AP1܄eNVPz! R&dGE@A6ɛ кb2y <w}O ^I%83$X=H>ێB12% t~7]4ɐNiQl &"a#Ĺ?"/C4C~-xK$ЅJέ.c4|>v3{ %vhta5;c.rbt"xٻkI< s##[2YUH,@p޳O{60Gg`ƝOI9u 0>D~{IS46H!x( >Ed'e6u.}8*QνF: (? ȭis9.R `:1nmrocE|Y=d5c;x=|b}9!z;! zIx "QЕ :$"MjT"B4grAJGf՘fSU wL̾$QO;| L; UcxwL.Ys޹m 픮x)>{6UPE;\NBʋfG}5!w*b~io7Aa)ZFp_#AG~Cjiдu ){eg mǵ3QDi>\0Tal@JCۏ"f^B$dFW~ly[Z>W؁5W.xCbpFh{G6 Py>I 9%yz]!(} `'cXR6 TO'ϤI a(ĖI?{9wj/I5o]ueW_?w'^쌳׬Yo4鎧HS9`Dlܛ,67$ RqPA3w~+?d7<60[)/~z_ kYY~үҟmɮɡX湷;G|ԯ@=^KkM̷oJ<$?޵8ʜ"N+CFԊe͛;Ccca-oro(Reg}+g:cM|㛫]O͋\'Y+ XdJNr `jǕFld Xg]U7|WuWc?~|Ys}ky䱇:)i%IYqѬNxwiyE@ԣé޸Zwۦ̺2xZǺ'nYb^s]xr]Ӈl-E?x77-~כ|' =yGYzhr\Ml _m)IDAT[2sN1ea}*7~S74PQCṷ\kwm9?n?Rbo<:e!iJ2~V>=2TL9ᔿ ދ䑗~𥷒yїR=( kMzYcۜ+?=ӭYd]ý]_ @h v_-o\8+j|`˺oܪ_7hاNSdx0!Y$Z r$=>_.-?RjChîxu,-{F{ϜkQ㈼})S/z7GNޭCS%I5ٕwAE"֝V$iDxwFi'Չf);&}aPtgk&80>;9 ۺq8 ӧ2UX'YIB2,[꯻fq4]9&QYGC~*ⳟ_?/NOj>"`p~,"GEM-WVxO 7IgZ]&oAdS'jʤG\u:W_UR\|xS}e@Yy~_u٥k * 'X]NoQA\f| n8XiSk.X@/XN> -z0chڑpPoAAM_Q^#C.UUORooP (&?NdZ0o$ x2|,Zٗ;D^Xy8ywa_NVUU6:G[4<2< xي(Tt:]Nn^kAx?9)eoQRc(CrRU]׾$Ð$)#f+UUp8~y~Q/Ch^=w UQwSU%uڍS(=^oVǕ2GzQ8'e"['>8F8OX 1IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/TXDRM.html0000664000175000017500000001153213203343735022006 0ustar jomajoma QSSTV: Transmit DRM Window

Transmit DRM Window
transmitdrm.png

see also sstvMenu under SSTV TX

  • binary.png
    Click here to send a binary file (basically any file will do)
  • hybrid_checkbox.png
    When this check-box is checked, the image is transmitted in hybrid mode.

For the other icons and actions see also Transmit SSTV Window

Mode Selection

txdrm_options.png


  • Mode (A,B or E)
  • Bandwidth (2.2 kHz or 2.5 kHz)
  • Interleave (Short or Long)
  • Protection (Normal or High)
  • QAM (4,16 or 64)
  • Reed Solomon: (rs1, rs2, rs3 or rs4).File encoder for forward error correction. On HF it is recommended to always use Reed Solomon. The most often used is rs2. The higher the number, the more protection but also the more overhead.
  • Profile: quick selection of a profile (i.e. settings of mode,QAM ...) as defined in the Options->Configuration->DRM Profiles)
txdrm_status.png

The TX progress-bar indicates the progress of the transmission.

see also Control under SSTV TX

  • Last received image will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also Editor
  • Compression

txdrm_compression.png


Avoid to send huge images (especially if you're not in hybrid mode).
You can drag the slider to compress the image before it is sent (the original image is not modified). The file size is shown on the right. You can see the result in the image frame when you release the handle.
Note: This does not include the overhead of the RS-encoding.

qsstv_9.2.6/qsstv/documentation/manual/manual/transmitdrm.png0000664000175000017500000110052713203343735023300 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|V߽yB!l(a "*⪳öZ.kaą ٢0 ;yƽ{F&-Z(((k鲕.urЖr7**?/fw/C쬵fCw@IkAu%Z'6)fZkjݽ?iƄيkB;޷)f8p[V#hX+Bmhc8N _%lchF-saʶIG)ƁvzXN퓃V EQiRJB lӴ.pHtMCut6@ӝ aCJ݊pӲlۖah 5ttM?Z\JQE9nDAmϧo^.UP-`X  !;:eJyyRPPH~~>^W{Mp$XE0[nۇԴ4۷w&ÉeY@Y}1*;$}ɯfUAon+$.΋FM?Z&%%m@ H]Mz\ۀ~j&n7q>^=fELjjM!]ŭ7jja$$ڔI(Bܤ' @X H4tx|fCjkC->M|c3% DoB =KLfT Ⱘر7zu=4Mx*߻:Ο}_YይƟ5>}|j%\_ޛd5Y[8yl.;P[(rm\/^ĉ5=3H[bBL:mRZh Gd2heƍ',¥;}+AN2]Xn&L G c-#|UlYa`kߦiRYY0w.eSXz}yTTTҩSzNI:Ng_U]?ZϹ?Z.^w;/ ns)ՆB"  gۓ _{ue0!9Jg &n [/tF,g&NC1'Pҏw }s ZY 7#6~< ^+#.!Ġ{H^؃ R++ `X&|S*~q,*n`O!*(r܈^Ya :3e4]{vWUP`6F\\uu~"͞3ii-%Ex iӥK…,ɸMip1\eqv2efEu!J&:շlR^G۠[_MT!tuM…ÿp@!%qq>  Gmm '/{ihS,iS'{r@1oDڻKxl+m TUD%'==Ѯׅa f #3k7ުZFL1,_cbe挞@>-עVFPZXL@ZTnD }ߍ8[:Ÿ Hd];iq.*߬*c[I~!0WE9Dlƶm\.F>`N׮Y(Jtڭ+~۶E! !֭+ Nnݺ8D6mJp.4C gwc_>jͤ>*u6íú2(=-~[W{%Ǫbrgq[w<6 ŰS(pCxnljSڇ~I@׬-Ĺ(= ool;<~;':?~s墮K|V7qfƶ>E-jQ185l &ok^HZԢE@ ĄB maY&vx n Iw:bㄓ@( 95~@ _ E(">mN:e"-!)IE!vr Gߺ?RNALZ$xז8hx'/cG*xlenj7:Z3|0M34Ǿvj;H8N$ F% H2;dZ; >aF0ͥnwKfכз7`0|2q|LFם6i rRg5A9IIN8#-|Y,y%N]>uߟ}H"rY^W@ȥNmh PLj'qS_>H_R\JQY;ϲ,\.WT9SO=W_itꔮ t-<.NͫL|ZFDGH_"o D$EGt>n 8"\ؼ7W򝱧暍 H!7~XMש Zjmͥ}. C?O<&>>j#O? m]Ǩ@N&l uN'MJ )$"PKUm z $f& HVinwXT 5G)ӫ5yNlYP.ulȀLAdL&q`zjt06<-ZԢK}MFduc}.T)E-:ض6s7hu4[-D7 BNeeU4r-w P˲ *+[@ Vm"l-~T SGr^7?>6W.5pzZsG\󑚚ݼ+{ _AIVVUUUhxB>xf`~=v)ChqL ˻Dv_BCw%wH6V^ߚݾK.M6hGyLv=> ބ&G"B:<.؅3$b/>kCn|F{\Nb7Ot*p̞hTKDëf!nJmxZ7^IsTR"WߑEuN9o7 qN2$Z9 (J4p\öm4MУ}'墸BGo3wXɸ-D rI ͒ 2&ύg $7TYr>I1xw"wo.UYYgq)XTnvٻwmk.hnUCϦ?D JV<(x #0*w# 7’JW6):4Nb sײUTz |Ma[g0}A]]fN[G _I7{{NH3{8ɘ $(+B(ǭRap-[W_5\~;:gM4tMGuhI("PVVN 7B4]ðp!#7ΠJR8eT\ ñlɰaC1 =tU6G4j8Pz_|<p,2l]Vn> }0R6xBw{X[#Y\c2͖N;J0~xZ9UB}茮gmSWWIBu1y#G Ku}K|^ն -Lӳ=.:Yuj-p̴RUO|95`ԚΌ5pŶ6!E|75&vai/Iqs=&6 R  !hS(۶YrmFyy9>On]ՙQ+|tll!''Zs;q^ taKo߆rq{u !I M1*& |g"5vhx<f$լwY$K3:mwro =ztK2Q4Mٱ};Zώ;?r[,˗9ON'WIm@H88MvzË}1t ׅ*vw8~0ptt:Fqy4=ޘ..c^)_ڽ9s0{l1\,SN% dRRqw^0EvIL6%z=\萵"Mjkjٽ{7z t۶(- 7o:t˴صk7B^ZAˠFj,4bts A3?H&a\VSB85#s$ 5ȭ<:hkEQDb6K ##CD] GuwϦWNOR(!Rxx, )d5' "si4Niʶ6BkBSEQݨ3J+*H'%%8/MQ' C j($i_yLrr"ݎٮ(|u7md2nN((?M`0Ȁ^2*8i" sg~{Eirߟ1{*̼.=q痷s'z:ZI=";%4X7W.ź/vҢ2~FYQUUů((t,בl^ou(Amum`oϽt֕O>?/NqjUWUu ֍;h'6Ot}Il߶䤎N((-iRo67^&=УLx“y=w~>t=zv3}tr崱9l43KE/[rضʹguVvKbq\qɕkg/[g1.oN=,\uw8fOJYYYfL;IcO7˲l(;b\>v7\M"{fTWUo586 P\\˘#JK_n}t|sy`<|z)Fk~?)((G  ~²KYz)={hveK7}͹˶ؽ{ϑD&0f:U+ViI);wsw.‹wOE ٳ}%?G gy)/kđxfvsWpΙyf ?,j{dْϘy,JKx̞;hF\\\t]ZZ))\p/\ K4 ]/:fO((JӎOFkٶw?ARAmƚkr&qBJ4MGJ>ͭoJ\P(D}ykK>?9ȶm2gM4ƌØqc7Fh^c]u'G((6O㡺 +SXk\ݺue~Ξ{0M}=,?~ !dm]#蔑Nii)lێ93={_^[v722MKuu5)'?b]ykKFlmǃ.? b[6?cڹ{|vBAEy$$&0~8x JK8i"oTVT+sӢaujb^ 2:gХKQ?)((Gd;\4vpمQ3!k|W<|߸˨_~< +oowݳ˙>u^{A=az̓b: > IDAT ݠI⶟yk.}}=K@F Fz#ireWSZzy#ýwk:6o=DqQ y\p\.۷`̹rOغu+fK/bYgD[I#ig}Q?)((mM?Z_A\~e~f͘ϗwtRiүN((J{k.((( EQEQEQ>U(((JS EQEQEQڕ*d(((ҮT!CQEQEQv},ײq K 0PG']ufP!::9(kIPvsKBFiy1^In& LRB2ut*6o5 2g"WEQɘu̴}'u:b '|!_W2cL2R#pC9x {ҷ9-oPEQEQ:\BF  `*Km#tD àSJgr{c !#5(X4OFj&{ a }Ã((r|jPȨ.gίك9$;*]mV믡h_lZCn0~$dՀ\_w\Ã]JRZG'IQEQEih!# iFNjrBuO5 ݧG?:fufdFJIR|2:naSnFCQEQ8-dkF7Rm"aiI )tԕ=q>~=<``A,EQEQ0E *K1h4:7Oҥsw痕ν[qeG'DQEQEih!öm108wƹlܸ˲Bxذq풎u͏!-- )%Zn222ZuѺ>Of ^- ܇FQEQXG';c -Ghljr}ݠ!h&O=A//S'sz%Q]fqodi8\BXWe;~>[z< 1F_pf(Ԋ8[>O<$$%%167vGKSEQEQ7 l!R]]EߙGϳ>磏5.3bv YR:5--ᝢX&0h`Ο5)%ͽF0nx-\O?]˜Qc2d?/RJ˙;B2#)--'Ma 8[o}.fo~r-?ODk_f8#YrU p{Y_V\ ?˔3x!eGoQ5((ǫ 6B&HfVHABbS<7lDHAUu=cw1+Wi6q:o&B 3ٜ7m>B 6g~۶nGHAYYSǟi,dμs䷿j6B:ml={п6l_} gͺ<ۻH3x`%>x?O;)9K/!S:~fj>]w~_ 6mH}ybf{jJF"-[~ˆQtdr DHAii)g圩3e?Hd{³/q޴YL71~/Gpԙ޵NQEQE94(d, $uYY >^Ac{ fڌ3X0!7nŷ闟g^d'B &L+e+;a %%%za颥Lz_ҒR8bf4u}4y /k./ZƌdC\\PgigO ǃiH$P4=h9>-g-iZt}7/_!ދ2;/"\R4zܽ4F`{}TWWfZF٪{((\Q_!h~fl)kxYs4MG- ~JC~mۜ, i85o(G v:~[Yg za-ݏl4?T"d}D/@($>>p2Dl_$*ٺe+V΍9Hpٙo6CVV`LϹk#K&׭),;x ~|` BE{xM˂t2f͝٪{((_ CG]FtE$!W|2oBF g^۶);PpB5yo}!8PZ!E4 s)u݌0o!CͬY!ag[ZНG;{P]]ͩ 3"'' ػw/3gl-nsBRr˭7[~Yɂ;FG'۶,+zl(kppjnS,]6m[w0bV;EQEQ \Q_Ȱe}f`LOqzg=]{5Q.= ̚;ӦN$.~tuAf_4+p9;wq57۟{GDlys^_ވN_}RvĤDä68͍.2.~/ fGNJNmxM{^tAxϿ|4fyC"FO137IѥZ;!wGx<v:~_g|o `c ^7wc ӓNޫN(( @;k ŴBvvyXb{ NQq{y?|1{q~MI-vyؒFLR((㵏_事*::bg9&wtR>: x9 ]•^ˈm.%OQ}t%܃#ri{kn+~p]2{((_ TloMm'ѥb,bGs:჏}ݚ%EQEQ Cǥ;~(gt]kG:^((H7K Ԉȹh'pt݉p((Gx7:,+vt((pj2}2$۸cStTD}bG'AQEQڅ[fwB/(Gk2JʋtpVG'㨪 TOQEQwuUTԔQX\ .(Te `3[l|Di^w)Iԥwl oN;߱V&LOuӻ[_Rp:8}h~Zd:ƃ>(wdX6Fye9; 9-x*h4D~/JˋYJrs0adc)%յUlȧk7d?-3k*d('c4ĥGG:OG3]LV،W5ʄT|_eu99zmQ !Ð4,RHhX[d} 'w=g %1]s_R 8ߟǃ:-^Ɍ3Hd;fҤdFC޼mNSGiy}IQAXڋH6ID~s‡Dp$ңKJ3a*>W%9! cj1"I$Rj̡&i0ohJ :7̔ $iil߽i'  _%v^oR:ݛ8Owl 7g{N 5D5QE94\))Id8!AiI {ݤ% _F&sHKJe-t|t2RgסpÙwhG̞G+; ah>0a$wG )@:EBnASc'4:CY|'R@8ͤ"lXhQ|4x6;*ٴkg`@N. ģw1[_CAشރ),)`IiJ;Qo@N.d((GَB'tΜٚڰ'_Teo 3L2 eqDN靀H4OH'#(|4g0!`'(Ň?h=JYU DWĒ5ZԱ۰kЫ TcI! i6Jf֬?ǖfXْ^H_p y]IҴ9pߟPM;72pRӰ ;ۥiN>=)5/4C$'7@RJ;(~R`6Zig JL^qdvL^q Ȩ^H~`ц*aPR{f{ţk7,I5t$=Dgg}'Q WF~g|Ax{/%AnA>[z@'Eۻm+fїPQB'—KÚ=8_OWw?Q[L7.ݻ2>$T"|>wW^^vx>HFPF3 1)Q|f-R-<栚vk׮%///m͚51yyy,^(rt8"Qߴ$\ph~ ݥ%7i[VǗ_HJH! M4Rҩ+E{zEQg:. nhFQ`7z2cd'$L504yJX^mc&`WR1מʨd444'ɘj9ڲaS)DA}[_bpu^|}W\s=̳Wv.mӳwmL`5 wxoVRٞJΞ5_w_Ni4<F˱EVٿo?۷m222׿/nd!E_$#&>uv P]]CnYO1]$4"v(9FIL^^^`hɂheu8&7RFj7Oc 9l"\8t|*K1h4:b4&ҹ[etnѱEQM憰B85)߾bGު`>s'ppI:y\555zۥ3.2v9 ^It~h?fCdGMӣOq}guU$ @D*?tHI|%!`'W Ѵ8!+koG uا^9nO!RPvx* ػ9s S\@NvK n"l|[J׬.EfFNII> "Z0t$躎in<~ڐρ{ؽk7̟Sa;m#q HE ,tzFC8/~XL[BqYQgg1ԉx\#>cɱK>5%z\U: ([϶mL+ Z^MNW;G[kpO8;D[¢lMh>"))s2y8y:T|y7ə![bZe}l~"+ٿO2wf.)InB!~=WN/|z4q7#O╒pC]xɞay7m/\}CѶitMl)qaYP41MP(eYض$ 1 OB!*++ٷom2ز O#@.$ ?%Aqn 4Zv-#FƁ[.]~N h˪K}pwZNƕ|i N{grl_Rʙ=i-o,eK1M-8k1zlf K>]œsp{ a䨑Wb8{½_fΚM\\˖.c9lfC?Saㆣ{(J3 R~oǘ~֢2Sݛu6uvxMf`w7cj+| !]񽲴eY,敥5mOH[RR̦tҒ:܉N&#`M⯫mJW;cztrt.sҹhNrƕ%#ݨՀoq}y* *ȶܡ~ɹ}V,H'f]:ٕPSQ嵞+)h1Z'NP(DJJ DuO~~>EEENf3^dAOO&+ENp*ۊmc )m5HGHDlk6N?˶mˉCaFjNyU9#zF߶j7^{omn+>Baa6(G#m&>K\_?ڴh|BXjU|BXE˫/i'qrL?+Wawyy'bS9|àރ{0} = g]?}fXŗ-/Ds!]:p_;sɥ0gl>[挼VUUɵ{Xz7n䞻$ o? ϲL?QZZb.CQBo'eٰt}C?qD }aj[s1S^E+ ^;T|GeE|BPف2n+ ؟$$hb>XIlۺY|naQ\z%ݽ}rRR&d-[NrrCr?>'Ϳ#kx^.bv?w{;DJIJJ gW^EJIQQ駞֟Jbb"/"y#xB!.('w3}2THL$5΢q$V1gh-[fTTDSR"1x6w:Wϊndit~^NwF]%W.) `u3EQcTS6s!*x"Lgˆ`$-W6~.tW{/oGCE;FfFqľ_h"G9sRQQsnr#7wbpS IDAT 84:?'H)Kb:F2͍(ul?4/RFxsy"BMh}hDFFv _[D/tM֘, ? 9)aPFem:4ܩE;T|ɪujBSR󎓪MٝNYXP(]Ba$XM5Xb쉊-QcE%Db!DAeμ{Wisf=ÞsϹ!dvU7PP&Z6rW_VHV*,kCHyz'|8z)?6w6\׍;L6n_3axfFA8馿q[xWT!CmWh4=`0H RB jlW ,–L4t2lR ;7J)LƧ+>`/tcu13~2Spb3{ܾp<>q47sc9УijuO&$)ML) |jhi>f&$ݞȸ\C)̑5W^kCCfD4YGq?#Y[fO! HSrıl;W?DmE.y.m[ocv;2lnP.åv wOsrƏOE jtFrr.xB7$ Bm/<ljNm Q@KlJ1;dQxdv8D~x%2Ǥa'o`A%b4R(Lk9qTVxBR߭'s& W_0~ u=?:-S&0v !dO@PTOkx ˿lb򄈯_J)XssGѣ)__{”)Shnn&H2S}kk1i mVVfH7oa|A,Y2؍^XXw}kˮ?>Y 8` zʛK\95~ Ik=v*LM`;vSwq? d}u 0 Sv+|&}"Ư.%:D9xnZ<{7_{/{nwrױ}톰6Ho'{^dn|6W / Y!ns+P(JKkk]FllOFfH8xԷk ,YAW1sP˜03w{ڲ|-s=+pn1vm\KM ߭1ۅ>&T0ql?ܫ?ϰygeUle`ؼofF: Ү  `؀wߥ"^,er ҏ(TA bTo1t6Z8w,8SJ)E XB8NJcT˗/7ߤC>’#atdVWZeor]sC;g_l#*B>4^{uL `=y:pU),E['Bat~[%^2ka+J0hp?VMwB^nV\8;q{Oč]vyOBp)OeL9=Goۮc%Mzmjq}s7qɯ.Y_]L,̝iol$ɹ?#<Q_WKFh#PP 9R IcQb" I7hL]wȕX22g8C:B{ˆb@ ȁGƼ~/I?<=%[Y,]I%jazh5Pj5Zi7"bl_&cBz0+>0LauT._[ǔx!~4L@ZZs{1d3 ^`˖-$ RsY7)keQgeqђ.Ֆ'# Ιvjrg͟m1iIlaUk\ߠAJC`0if0ȹSYH):kO{L&v&V}QGa_">_۞Fn(a{qﯠ?]yiԭژN4ٮj{;n,O.|笛oNz kd:h-**>s[hz|dH))€RgMa(Y̼P@SK+E"#%&_{#yqK^H_^{me^ SޞiZ o0e2 *b-|6l2T#1Tc\BK]u[P 4uAA&4!c9ϽɻDxwBJqLS~mqay*|>YpjJJJb>0ƭ_G}}=rtLSBTWWǁ"GQ91tϭȤBd]c{w5x':7`~ .0q##sw0mƴ66c*zW"H Eg?rިY{d0,v'x6l?_OW.ؽef{pzEEQf:N8ҭ'`䉄!9 vyGOYWUFOyYR6{^~>i4cƗcᷔҨbAp4BjH4f^ ) [- dRQ$Yfn}DBeC* c7W])k.b [Q>BYf7'5+Z??1 խ1PRi+ '$ EURdsAJМ[ |n-0樋2uRB~ŕ{s v Xac`Sg\d[o>gfX\  _~I2.7'#Mj9`)kvʇ̲Ua ذU;m _9:x t8ܳ(,,dL?PiӧrEY?;? fM=40`mn{_.=?=~>wޑޕ>:tFFS]ю'y/)HnOFW4ww᷐kF(^[^OXDWZjM֖tk#ۗa1AHla̎I"+OLc[hLҧ+a{| Il& ~Fѧ3(,3ʚIW6ۓB}Tÿَj`}#āF$DlЌ Hgvh'_ۏ\'7a7on/c]aERr}|fвf e;56mwW̶ݕ]`k&4F=Y#kbq|0d)˻(UqVj*!1Fl$*=jZ/i/c{iCq`dkOHxF)gC`HJ Q_ &e8RD"[1[4 !n;xm_[[&d*dݙtxZ gFǖf I"Ԟyb`9ͱt^HN0$ZTDUs4|Ew_%_|;IrlDUu-7TmȻ:h4&$B( -,_{b|:DZ 8VSP\ /64A(JaHE+̅ݠ|iޘ=-eOQRYIe+AOaL )W)5+b=6Av29gc4fΜ9{}&3g{}_PQ93-duI&qYgmU۷~;@srН̮~Km k@ݏ]7;-zkt"Pg(cӓ!2@0ǩkT5JZ "TAy("." fY`2fK{>05#c{uZ;R֩҇?Sk/{\r1?8A$kbݧǮԴ>%%7~{NZ=g"R}%ο2ަ-9v|נPivu7|4{ѴjY+/}IߠFWޟzJJJ"UR /M&-yĿPVtP_}ME{-k8~>/UW.-:a]z{xS*饘f4;1iI;cPP(ބ֌o0 Jec1`ęڣd52vaME%ٲl5&3aav=^GWޟJ;"ҩIScom% P-w+ߊd+Lٛ;|(Ѫ4:&Mo!QU9fOYNmp`JƏޛ=^GQWQJץ ZCoO5  PXW .l4#ZnF^ګSc{[ ;uzjMZI`IBp}=EJ)q +%tdlKVmuJ^ T8{;D2J1tvt1h#Cjd 4!~cV&Jڵk6~L7Cҙ,0MHAb¡0>ħJTrPARƈYYv}vj9D T*U-/Sӛp(LQAJJ≸62(JQBnpx~R^#O:a )C!1RLd B_Sn(`'(I3hz 9 ;FBHI(1KapN4tLi+~'] wLKe'c~LQz˭Sʔ|3B  s~4BeǰN>Hw~ϔ;<8c2r䘦ϑdoFc2y*6tu7RIL%2/lEѳcҝ6T*5&yowƴ0'%ҝrSR(w۫^CmӐJ"]3oxJ zY0t9Ӵg:WBkyRtc3f[ӓ1t~h4a|n.pC\0[OS&-0!(>c»shf'w:sZz򻊪޶ڇ)L r iRwQr⡜g}7D( )e\5حWj%ҏsȬwS!OiF4624FH%0 žY5~d8Pڎ>t#]/ɗ)\mw̡tF Vhk!c(# gLG˿;`.Ӕ 2eYyrlqd19g}Cӗh4vQkK D$RHi"dJ&LY 4SHbIi D)|Ү?VI_~e#M#GKScs OV0g3~1sKILJ_6ELir`}V6t&Q^L^)vrdִ嗫[s4Ch4z=~lFg_\xQRWǢgmW^)%B )1x<g~Q!BXI%tVI!0D(eaJB o_ªAI]c >G§ihhmHzqF~s1|$;o+9 >_/OZU gC;"K_/NH*fN=ȗfZy@ZiIq$@(JҝHk=O]cO-|lhlʇFәh#Chz1o_r>3k6ov-^.gV4ϲ_\¦MLؗ}.a&haw.)ja:3VrS ni#)̛;ʁSY9yifȁu LiFp=LR(CtǣfKy IDAT=r!L]q=,B0oc|T81GˇFh#Chz16m⤓Oo7|ٔ͜R oos"ȍG:0F 9?8W_Ica^sm{p7lFXJ.fhQgZ&(+Ǔ|x!=3vIi5 j*,^ªX`! SaxI.WAii) q!{7jj6{%|aFyOoܜLH4m*NVNE~W}S ,Ut6zFbn?w,x9 ` }?OGz/"p3bHfqg}~|ٜvi<9wM'b㵷^!̌fp2|@*\&%~#lE$Rf-\> ;H!w?O{TE `ó=WOP"K _oxxlPv'->Ǝh,9+ϡиg#v27ʇFh#Chz1[Qѯ,NiFUUuuu<9N9d>g=ذ~>/;2W %s*VN# ՚u0bݘ6sZ [a?(H;OOɶ3AAA=0ǟt<ǟx<|8_g %K㏖ys-/k׬I6h:mdh4M/bN k0SxNPN#"Ȫ )KhP74\?ňxM|JN),|)2~KeoG>O.~1p 2]>}]>4F{24B4Z/f?r6,Sfps˟_}9OW|QqУu;úx!PWs B ؟3.{w +I <\tŌm/̘54h#Ch4ӵ+o2ctʾn@+o -=df=h#Ch4T U .)B02W-Z>z(bEGFT Z5ي1/9K "Z~v[tD>T^҃IFFh:P(DiIM 1ޫh*%IBO*otHDWwI`(jo[Eh4M (QU u[hjn.m3JJGqPH_@HmdtҺ4mdh41 VP-A;chPH>nJHY24mdh4f rՇ鶄62h4mi&1MWdfCZ;H_M)1mdh4Ӊ (ӻ+EkxkHaaWwwƿ-|tK M&mdh4S1$`pha ~ʰNW#Pv>R֌{/թ ?孆:=vҶ mM"B4:<EJ)q qvXQYY^)rnO^r?s[bIOɄO>4݄hEGFTL$Rp(R Ke+( aRƈI%1(Վ}Ⲓ)%UJsT  STPx"  Pi_(MWOkY'Fj<>#!eH2$=ƀRʖvdaTvDTZ(Gvl 6¤:V( fZBFTR) þt g)pUpO*̴Tə dJҫS* 2&W3j[N[J)%B?fdHcl75gUV's|^]^1JluㆍP~YYWY[6cMTqbQm624FH%0 žY5~d8Pڎ>t#]/ɗ)\mw̡tF Vhk!c(# gLG˿;`.Ӕ 2eYyrlqd19g}hF+(͖' @i7>xFt:V@JIH"&B&4iZiD:ѹӟ)MHbIi@Jw.喛oA$J9vI҅ҜKH%z;Hi܇"dU)LLl/IwL)e)R֘kߦH"c>+OR:e( x]ITUv;\92k܇-xnP7X^PX m624qIfweϑc8pߩq۝^nɛGJ¾$BJL)09nGlIkGSg.'DiªcU2R$pv{$@()NY4BXy~\.|੅Odې%`λȱ9r y<[;{͛hM`˵q?ga?B&݇M㑹Z +)%_Ɖ}q{NC}BHj/$M/?$_WPSN:'|ʖE’)]oM|rk yxjӌeGcUW/nKC!elcB-OFcdlch4}-uuy|2{^s'O-xCuZ>[7 ߕյSkD P"q!M+gԨ0]M)0L0fҽfX [My+R}ĔI͝Ge@˩ȼG)g5773bnywq ~zy1zwV,_=S?#F9oRwd^~c17:~?z 4inq/w^c?7>w.B*kr_)Q6VӮϭ#´;">fG#F>޾88Kп62'c[ F i8SȲQWWaΞ#0rQ444j*;vu4y<+?[ϼ0qe.ӚѶ.f?^HR467\9`pRW^Ә<_n}By<n8{T֕f*;Y`Vb%Z ؘ\5F0z|?˫Qy!{o*8c!`]PJo}c&eJ2r4bx"i;n7^H $)Lm||d fN=YSf9`ҁ$E2C.|)S X`aB:xVDo12j֢| nmeh7JUFQJ˵W>gʏB 88{s/= 17]~'$a0r)7 2 7>4d xj's2@[)h6ىD ۠*]z{3qmƍч`3r܉ʒWXr*P=p7>q0[d3(-+A3#;Ii&Ӫ,z9)xdC_9<> ~xׯ? ;n pj|ܢ])% 8N9!#D1lal=s<$q nY=}H$p571r>zvۢ[GeNp}ȨB"ey,c>QSK}h#Chw{'3gțGQ VݳHJ!PRRH!H& )Ry hϝDag{2m4+|;yƍdz<S_s1Mi3Xg蘆oZN>T7Ϛ/פɌPJ2p@p겫ʈR_zkKNNgnimdL;Ӻɨj %4mhlSg:b1N2լc rP%gHC"Bf<}HlXW͞cF+(Kk25ݕn#,/UpuF8mӏB-q/ ]CfޞazIVh4N]HtpL::_f̚=/!ZasM-fhpü4):k3B>22f;n{b; CXbfKԟwzs; wχ3d Ft:RJL){,v$3q4"Hƌ[d ].孖Ge[1 xq8,}($Ҿ?,zC!2"& {mdh4qN|Zy71{:"G622-]*^/X'YlΝ14tbasUZ!xj7ž} _ĄuLyh#Ch4T=\r%?%RPX'ғ-]*Je<Zr_:&=Fg7AK=+y~qv陞 'kѾK ![5 {\f.DFT Z5ي;/9K "Z0z};mՙTҍuu.֕Z{V[b\, % 2ՌexP 5^]rߏqYصW;FFh:P(DiIM 1ޫh*%IBO*otHNTh`pxR:׷)MPh}d+ɨl \8FFK=Eh4M (QU u[hj熔PYяhPeїƿ-Sh C4at$ya0abe72A1ؒc Ft2BB J%({725 P( }gbGq?ݗ<Q> -/-!7\i+LV#KU૲ "h4mB(wF68a-tvhK\_{-J†k[Z/2!6FgMF)C#}FwRa;fh#Ch4LbfNTv0mM#܇<KYK;]E4i5XH>OB1(5:\Jh4}xk+`h1[V&[&vug }gbGzT[fo:(i [ԅW%b`J*D2hֻ[Ki4cIP ʕa+J)F*M| a^ګSv {[ ;uz{Iۂ5ъT EL _) !v))amDedgo{i9s=ymJf'>H$>T:.@i=oSؿ.#bB< icd`IիR2/o?0$k#!sڵGtӼwyOHH I1e"]a>+ Q* |ѩNY[s<M=MA%cF`=k"X=F[(R }'+i+Rg'(p= 1mRफUiL+3i-WAJɔWyiv?)S̈́ OSb(TO=0B(3eDd|=֘^gx=)rǕgSҩ˪qaR3r L,g SQ#{Pgfdc6{6?xm&#GTA,HXӓMF#(=ۓ-\12"I0ړh4)Mڥnbiʤ?gLx^Tko Yj*R^Ha£C)ϓR(or~,#D4!MFJy<4 ۥ S"aޚm8l͚%0d+G,kuEEw6ΚcA^OFq.U[E8;d-l5FWR"L |ڡPKw3lǻ]x('i xG7Jg}JaYDjW vki+#DBҌ ix͔Ay.+k{\ z26vC`plOF2dQFOΘ\wb])kdʘxۿ'*ٔpcs().$}=|#ޱ0zSn 59p-9 662ZC1 Ri% P KR_DF\{uX{V@JIH"&B&4iZiD$,]ʭ܊fIL3T!MB$Q*/dҮ?VI_~e#M#GKScs OV0gԞ ?_Ԙ9%Q$H[cf}"T&J49>+OR:e( x]ITUv;\92k܇-xnL(mB~Irh˛F~R[>x>Jp~Y"Ԫy6å܅ߎ7 ߚw/% "PHf ԟ~AF x}y[~|VտvWlV)K"ĔSLSreW1yL7}[Գj*']N*4BSHR{; /.[oǔ0;!zt&B8 f#xj444Yg^##H2bHF scxW,m=--랼[Vgfj%Q|46Zuu|[kMCy2}3mx36TF̆FNu=56'FIg~M4BJ,Z[=V2/ %%lE%W33 q(_+YJ0~xßkd ]C̴CCQ~9DFoXr2s¥@W"Ch4Ywى3>Ohnn` XŹg>o}C;^3}.<Ko_7SO<;o+s/[nKR[W+}a#>˿_~#^#g# ?D}|s8YDcQ;sǽfԞ<߸/wrndmSMk˿5i<_݀㤙?oE^s<~O=8?8tw'pG{H4|^[}Yz{{vi<o/S]}3>wyN<[oU'uXw.r}~u ͭ7/0e~I;)ߙ\}ax^],Yd}L \82بG 2Z1[.dL OK$W %2>]JI¥@CCQU^DRփlW2GlM.Zdh4fL:mߖŋ ZsɅ`;imfim;?2^7b8#qKrJN?Kj{Xf L<^}.¶mLRph,o߯p1ڊq}qL:%Kke]wfM8Sל.>xٷV{s r7y'vۛ GUu޼WɏJ[{{Z6~P^r}f| -=^׿y8ؓ93qe˗z>3QPR6'c(Oƪ2h_V-EtOLR""w 4eBG P"#.5eIWisN^Q^y0Wdx3ޱDd|<:'Ch>ĢQR$iřiB9\3[-?^{pwORaGc>wcoZ^{{r.Ǟ |OyM"0DB-,\\ߗ.:~ rLWo}2xu9C#f㹗ɝ!3b=pS=ϣ/:犯rߠy% J>.'rF"C{24BMM --tvtH$eʔ)to:ЙĊbRi\v=7y{O#Ozj\ϥuL&y>OƊP(\*7'c(>{!螠DF'#7jS =*4 a%M芌ޏ6ȽߨG 2r фK+d]-Qؾu8mCJ9#KY=#OF 2rI[DE@ڔFm11y6!:\Jh>t,:x N:>'|ޕ{W~7oG|dxpmﺺ:^|˾uP]wۅ9~~mƐcՅ `y5qЁ9d2Lu}}w]o}w˶ ?f}犋M<,Ţ솟RT$fKnRhk{2O>![ŋosAR.I*y;EƦ|44'p Hqx2 +4>j8؋>]>*c BW/bC Fln1{e\C=Mײ;ETU|1#7W|Hlc(OFMd2{5*BsD| #t)\D̝}ZXԬG;"|`Uե<דWDdh4fsTr᳘KĊs7F[JhHl# .ד NCo+2f.GZ(DF2pwnjĹT֛)`Uu) hZGf(x֔f'#mBȕ0~?7h41hgǒ~DA8_-2r*dj(rs2NqI].3 ۵_k̫}V\yl&dQ0pE^kkM\?; ou.ga֗Fl 'Ch4cNIuLk:|&?trGbL+L W ^K†#>qPH`x'ܱL&PA:8i.m}#<[;9%w0R)똗LW/LOsXҙ0s\53VR4+_~erԕ3[qR8f%:&9"#ţd͆ɃI-24F3x #p G'00T6?c|L.oM\lCDйk8'?+?|ݹo7?7!&)g鬋;yNaCӡ凉#w3ǜ17 ~n6$CC Fь)aH'?*[jEbf~ln$RY{^a ]:[`sZ9 >u!.;3x;r}v\]6\ ݋HJdFSlۦX! | Mp.55ض'?*3i4_DFь)mS+c\-ttۿ wm`JJ8Vmm dK#1"C%EFhh$mUP+7Ba`۶yl9$ْ"Ch4ij FfF FlNq7ٚ-0lڲsS4[&Zdh4fI$ؖE,Z.iX|'$IRD#M=fEFhƔƶ,BVX)PxǨEHP>e<(FgF_ Fwr.ٱ04G4Bh{?5(4F~ԼqFH )z} EInPf3A Fь) G)c[v 6Q݁AYn C=]h68/6Au;J1`A"cDՐ/2F+|o͛mĢ1G2W0ʡdp_t笫m!ZCO_X!Y5(RZ`M R5N wu{k"QHՇ@2h_ u ;r A2ߞ쇩A2A|H-rs3)Ur<ַjX >*Տ0Lbj@a2?χ= |ܵ2w#~zoݹ2ߵh4͘>a6Ӥ]60m엵dX"HDWA}qˁ3`1:ΜAq3n1<[ͺOAn>w y=2u=U@Efb` tC(*,D'$րۦ6Wco6p ;rJ!Nx#vT<,N-/ 8{l$>' vYeZZ5D1D!y2Q% Oؕr}<3Z,Q} z9+Ϗa "Ch4c{ rUvhB->k"3Ȁ V2?xd{\ 1m=Pcg+]`g5*4:*NĘuUip^) SVwc-! {w^[ ar9R ~4t<:"zo5&n@jEvd~t/@sx.,Y ^_v pox2EPV#^ZZ*0lgn׾DE/)L6J0!T$sݠ=pՍາ4C2m+!-R&“-24F3渞zF1H%4\o0t ;r38+3: ŵ^B#?%zW'8G9 !m^@hUɠy>֏0 0XFӳ_oq7RSE -n2B`UXP2Fz9VF$cǁb``5AV)Y~)%R Cn/{".лC|UNH2 Nx= .8rqp|(] `L,"{B6ж E@o~ue&!BG>µ_7h4͘{V 0PP-p ́ ~{C.2C/8ߏ1 c4Ұ˳k MA4fr$FkRW_7%. IDAT~1`(Q!4M!FF`[nx rU ?'$/O!Iw!⮒oX"12$H @1S`CJ0!Z]< -`m)#$;$nPÜHBxn0J;ouF {ٷ-DY96xqHwr-24F3xzkO!P(f o8™Gʌ[H #.l9n^#\= ~9${z{[n8au)g+E*&Z,Fut;HJ@R}g%顭!E<J4~clk5@dk:^0HY ⲋ@bS ^bP7n}(oK  }k%$jSƪ=P”<:߂I-1( R N b@uBliDK$wS")H6j$m~9B N nVdg/\n89$+k6!6v9{"Ch4y|cOP?﹝;W5.֥#y^NwLf6ケ|+ho{|-sKߺ 㡀8/0;jx6 /aob{ ?_3gy1xiYg^zVCѶ)]fC$"o_MI5=A-2~+h%F|*[RV/q E"p]EBDVʠb\ein M bkI}ɻ(";QBzޕ^sR'!R|MP=R+ Hv[ԱM(iI ! > 1[`P'8>C FL‰W^ 39go{STTG¬\E js ơib \x~4kq'z2_8 Ln[b1K%HhОe̮7z(5 U$ՖjwD7CgD1xm0ĻLr8| +$V1T r=(S"&0O0%rGEd%aex=rD`a"-24f3[WH|Q~2!VB^2 (oCjp*jcAKoR~5ĉi p2܁D8]€|?'] d()$KWLwT*S[bpUrfؐZn0~IG e9{䜍H]OKR]kUjp ?!>862wÒr{$$ͮhh4!L}9SYb%T~֖V.>o/z|vݛ,Y5؃{8ܯqdK*=\c S?I__?'$ ?pҩ'pֹq]zeW\ʛoqu/>x..?WqB#Иm|V#i3|"Y.4bhCtzxɧYHz$Y?wތ!@/P )1U5B j5Q|Or" S@tWHhTBJJ]E׉ Ge]07ϑqx+8fJTR*!9Ac@A#t_SaHGRo' {DPdh3 ]! TUAj1#"N*Ci{Y @>հ#n;C^\}# (&ubЇW׫A={c]mT}E؀'I}@XU*%@ F}<Ϯ),Y.m3OK_~{r6|Y> nVG'杷_Yg12yd@( 2<.T9V&O=g~SO?uyOpCwc&_;l&O̬gs74)a<\ב~U:\q}ؕ?z7^w#?爃"H9M4uG/26!l0vT! ܯQ`Rʕ$Cv1r/J }?!oCuฐNPpz l8 yHAK "hZW+P^i:Rdz9 R]e?V}`GoagJ諆t:T< N3;ʹ!Q\*cZ(dœNIpVIt:$s J܋Bè{Z≐("udC6Zdh4fW8H4„ \K9la^00 ۶innfřD8~CF_;^7bpKeD>0"[o3n 1> 0 ^/:HJ+8xiο8xyJZZ[YBj mXŪ8+Әqк mOkF``pGaFn>2U<nJ TɛP1IDJ&Ô+"9 ePZ$TCP\)aUvP* {(^ ߃%#kխ  Y 5PT ()AAjwGmJd_hdDx8r)>0iTo51ږQPlwsz^nCwH>N*k%.R{}C-24f3;o堃g XWp=/̂$#﹮x|=ϗm\y^v[\t*eZضw=7c=wrh4ylg(7%!GotHȄo,ш7& >GM "0<MviԏC)\[3p2]"s KXaY$0mը0$ե\_0~? 3, 1u[vv{b䜛Ux 5FQ__ϔS{0qƍvH$L 1ss?VJּ֖m܏~@(ix G3m!o\|i ꢪ ;I;i]];ysW^er?}>X"c]1śเ}t>t jv=(PR bQ0fB J+7ݚ=yl E,"òD`XZ稷9UBQIxUTrC C˯+i4x ^t)?O6m~ߍs/޻/ʇ|чK?̶bV9IA|{b}`ЮY猑Gy9|;+s5?v?5`B|odiW3#l*!RVOJ@,(Y$C!o܁dkv\Ô1GwmtzU2JTlGYVZ%B<@E x̵岝9JƁeBhHwAr JtF51!?L3,Zdh4fT+cl aFGPŃHHyZ :PR(VHzDK%9=*c+,s^w@K͋T_h"Ch4c{x/Us"Vg4xcC:zi+=#*YII㻮fjb֐Y4 #|LJCG O @$ ʠe!`^ףA`[zqz!W%iWUH9E5Y7h4͘dh4)X3C$XcW”e$$ UdHmVY %5/m8"Iƃ+y(E!G_7J)˔>X C Wb吊fu cXh4͘T&k6gf͞ū/άٳpV/R'('rzVR),uwݥz4΅R!aa{(D`t1̈!' -P\,}=zi tvB ҝmKCP5zE HKg ̮&-24F3H O[f=F"\tŅD#<Րk^ hY -t4A[:w,~As6AJɗ-еZ*>dZŵн *Ddx>AU ,|AB@]5LJbb%Lښ{ 9b@JBlWsͨ"Ch4caEc$]͛򪲂^ )0 c#(5akV jwY- E`BH7AGj6$:$!2F>v8#ըzAPDˡ be0u{8X8dWx̂?$tǁ펔~r%@b(SCeP[==^5$Uj(JΩ[JړYIH]חE1(F3wc[/˶)+)gu*̐jP@D4˼7Տ2^ Pݒ ٿ zTnD`bzk;|y(!, bP9ePFh}Arl=S<)%.4J)k@߇ Fo 2H uzF -24f!:{۩,07eQ+a|]]64MBqʺJb%XEOHGeXAզBoù\zirד, %>씊W m-RV0 ūTi^}D8I).x'![%"0$"4?`a%؆*;3.ؕrl-24fhUJ#ﰙb&H˲(lk40l"Ny u6l<$1ҸNFu[%ލVS_BG;Z$"x2$JM}88k(Ι!5Xoh41bǩ;3稫ޢCBvh#h>xG2M˙AzJ R )] f$E?X-͕܏T$iwA@_*=5@h4k"k"%F}Kwh41{ļ7vt]ufK&dhCEEFь1GSh4-!*li6Zdh4ff,Y֎VRM׬l|¡55LiܚɍS)-.۰4[ BhT` @( ˡnyGroX.l},{&"ˡQ*/%z R$%_-[4VB$ M`4mXl3,[VOỬR:p!iluD:i&/.ZBMl*a;c:l RY*V =PV]_yt6L0aI@+$ cvCỊR*Y/פ_U1 \8 eйVΫz2F{3T{յWU 9Hcš9a[row7@J.'!=*eRjTeÌe"F3Rs܅PH]M= f3u]$-ͼ[.6 -ň}pNT]rTJ:zSjTNl2W."P߰|8kW`l7y1UQ0V!9vTlY[u\TK&bBP1A'2UƷd\;iy )W7b1lj01L CY1;eJ]vY&$*ۇTgvt2б ]^)㩰*E*[$x9I0&99e* xr c2dBO!?IpB]j֙d FP\&ʣ!ANi˶xD0+X?Dtxa^ F|L'hZ֓2uF3&hB7Xt,@Zyip#RFy&Ɛ#7-b#/L XO'[&4A [ IDAT)9~ BELA(&l:r MUцmBA&k[Q60M3{,K| rҲ,!c&׀'c$!m8ɸ,ky'!Z*$l"wO3x;]DJj@6[ >9J7 pk丮j0'%o^"L="b<Zwf+Nv R*#,'9:fH F ѹ\ F#N9T_븸K8"o{N:n[:lky_{uʹ#a(;4iMr>;GcC# :\jcJɕ?ޤqb#Wԏgŏ~{ss=Xb?*nw:_f`Ykhla¸+?QwDtfN9)Ty@^vTJ j'.zrˬ EjHB_JjH )/+oC*T'ʄПhQ6bц eR%uE3aJ98i1#eJ:X0]e$A$MCbB2KU+#٣œxs:&Td?x qS6Ԇ%W/ƉNYy"MJ*Er-}O(晐[*˓P\u1DDxP3U0ʻᧀ~ hh4c}kynUf%]>yomZ}-od"mGq[輋yG6y+V. | wj¤M=-a\>ʽw?U<||37~7&>ʹg E6XJJ#4T@t#F*DyOB2НT?|^:2OJ T|j UEJU2$;`fg7\Wi"Rb%“RE-7D8OQ\ͷ1P2׃pDBN% 5_D ]*&{L_7!-!MB 8]l(b$֐ɞ}pS%U]W5}4+#ztn*yTTR d"Ch6|dx ~w- mO<7\w#r?޾>N; \r޻O;s/8Wpy1-fʕ??AcxG=3|_>L:KXh1m_+7KOO/Sw)3t!|Mgs/sL8?ϑ!LH%S#>\f}ȦMQEGw;xI~P).oŽ$-qɅHJ@j8XJzSflw*"d6*W!G*´Tm:)By=w"rP*B%wG$,,Z%eN 0^ H*;"_VyNX9BURzҹ#ʃ#aJ1ӽRT^SDߓN\t'NGK"2r@ F~C8(N<vma;fDz-_e8t\gG'4Lxl3m9`.Rv筼4%[=˼&rʿCuuw'Rpk~I&94k3mSӲhYBcCiSYQI43:k tK믽}o65&Xc}8# n=pz%>?#67 p*%&&{Z*tW)opb #%'͓\Ռ/Qc#=0)#Ϫ7n'QtTpV%Z*}_+Š7*!2+纪~Gd9>JD!1]%4R}r< {'2]M•s zdϓcx'4Tn|Pl Io؆AFh6_ƏǫJ" wnދ{Cf-b/r QYY '~9avg…~1 C;/;oѳq/_{7__{=v 9pto\\ޘi'Ǔ8zh4caeknm[o-_7H.8Dc1ww݄3rp1~VT/yI| Щ} K† -w<;V,IE$!T$^ASPw%)H2Z*THbt(d"ڶN𤸌r醝 $l 9iLʈp]/.A{;xno9cm]mS\\ .]-x?5l;m$ ՏG?_ fK7<<#R99"ðx4C&Ĩ72c*/+grRq;nGJŘ E :TGk$w;*?xz_E&?Ro-HyB-YEURY)ZSüS9:9ࣚPyn_BFcbJDb(ɖ-*Q6r{p7z6-%2j n\'@"!\--X|Z*ސt;$B,x.Qc{s4.Q9<A6ߐxdEc@h6?/9zÑ=N>)Sx8__k?C~u멬GMkk[1?/9hhO[[PV^ƹây7jm Rű15s{"2T{ ˖Dg\LP/-;ӥJQHB հβ .'*#z?UpdlׅmUqk(r4.Swʹ[u@\O0$';%$Ʉtg(R=- )?kAui׶d{Wxqx Vܓ3Յ= Db5cK;`MbOEO\bTWtUq*T"Վ!X1QU晤yeDcFyw^9~+욟~^cC98ԓ8{ݍ+~/~v-Ō?n1>{gYp1x8;3?2-&Ll[߹_:sXc͌ӄVOiX~y2}4y7יN;nŶl.\|%ض/Od*IqQj#e˳^ `A~6AWDԋ:.x$!U!ziOUE!:+0R g,cHbt@y/Q wOw7s}P*74ss U(Qa:d:~$~ːJġvɞ_@Z}2^, Zy JP _UUeWSXJYoQelՅ3MnR9ե4ϩ©ˮ3 95?e_x_xޠӦMg}~}$!0 .:PqnP\\5{:󎳫wrdRH$$(CAiQ)>QD"SA@P"J@H#ɤM휳{sν3I&qx{g=ouW1^l1䄒׸wkyjn!ply0B2`$5N68j>D^jUuJ+Uo"8 ѢrkHA z7T;K lZ y`ip}(WA .ʒy@`V=96N,ET:VιQԖ:Б(W&5.(2H2 0A4]EMc39:vRskqGc|/1TU'o,ZB㵌NBEZ@@I>2RHE*o&߼~̚=ˮmo= 2VW"2 L ưbRzer8,H5jGj}܆in}Eg^UHIWQz!;йu0vVl|ù#]" @ZAupS~"1D .1e{ö7I&V(:- A#) Msu ^U!k 9S\,z/AS%Kז`g!LdvD2'X zKFq t(\^QR p p)q2*RTL6-ߩHE%_6:jZtd RNi7%HVKEP f q36%0dA'CddΪBЮFdRMn__ ElșN{"Q*r]_G4:Qձ2&uZIێۤo 9,Jл*2imƯ_Q> O`"h? SFga&БFX* "HE*2"" |Ry+RDrB#&4IV,mjW:iS@/s-t=Ui @I-/й o\;R 0^Z6dop?"d%R:qo9|)-#VJ`K `Rr)~3a[6rj]s~_)Ѐ[HIk+*`un ݷqV x=˕IO=J"8A(,x+K 57f Iר{ ha%5:PN◈^^! yl/E*RTdD%WQ$$mkvT""e6"b3r-_Xy:rڲaKg6$>N*Ⱦj;iLO|y-b lT(ےiGr+@N3bQ9{$&rs\yT$?9 e%LmPW<]Okqb a Խ)u~3Cn#ȉ[c-)_Ԫ'R:{BlM#/SGOsW_-2 KNOnYtD~4>Y'.wq$Q40_ VR$.)Zu=7|?l;n9E׀WDcuN, 4콋Z\BOyW$hmG]0bM?e1Nl,&VlxoBݲX(ϔ1c64!cEl "Pu UVC+믙ǒvGMcMܪ`y_ jP5]1@Jk%-ڬdy/dhHzOi: _AcmNA'MRe|&LmϦ H㹢xNM|((h2Bv ?Ǐh<‚~A}diPm BYqW5aJB}LM.sBl6*v/.y.뿺@~ W"DPw臉D|ۉ2lҞ+f΀YÒ2 DD%2W)qD5z;(eX@A'_0iºJTZ 6j{|;_,aZٳTncjZHX~|x(`qVNy*W(@*ʍO.eN=EDZ WstJ˟$=!8ut[pQ>[o,g)7+Ǵ84<<¡,_(3_>wDfnaOB`s}|v&>IHxM(,?ݸ!f' >̛grء+BFE+|s~J@0 ޢo\K?'NwZ[;ހ_Ic A"%4ֽ‰;}cB}[kFƒUt'RS"G,}?EO}ͥwln~xE~(|Fp-8Srs +߷x9TO0|C|^$ik%؎ڵK[GݩfGlH}y~|-mwhÍ7XDdVpV +RT]*Y0ݝ{ʪ_T|t uҼkOCURvm!42f: V%xe?^~O]x!WV/y<ҐR}KrR0afeCO@.SjF,'C|:4jQP~ >$gB$mRU"ˑD=@VBStLz/`{d-ò_oI'wy͓y>N9qkI?% ?Cadw~'m!޼#H]uT|5:.Ѽc<~H#{W.b,^5Ղv OQ.%F=/$xzɥz|~6_uS5&ؕ^ w>AR6R ny@ DNCp``)*)==@kp3(AlHÒiޥa9}4d+mOF/=,и:r= tgLzų!;`>z[cl1<$\~ V{ ~Nqn`WT">*pP{JW-n07F#'9R֋Yk"ER M:bH%XN2ЫPbCn`uö/H][K uTWKԡz=qT''}gkt =waԬ1* (RFۤтLTOCq) @qrJ8S,Dj!9 K{e;Q8bVq5py[[ tD-Qnati;udd>/j.\,B̏_Y:KhX}}?{ >xh$Er\U˧OB"J1MIXvdds+MY97.h,'Ӽvw@҅CN2ookn8N}*,~@pu;F/piQ IDAT+˻XZ-mg t/&Ky|/;OX6l2[-pO[cV9t%\1u`Ѱ^/d=g),摯{$tQ ?8D>__IїQJ s ɽ9߼7u]+h9 =>L_B.^0PXu> A,dLw݂[oޅ'őx( t)nŵ$6>FO'il8DdoG1/:2~| xEǣ8?|Y.x2gΓ 尀]-HcڪqN*T8'K~t>^/~M\0Z'h :ys$,xOdVՀUn dɲ-+ĮѺ-5vn;ZFC辫S΃I)m-մ1Vе%s┃5JTLݦƦbK"g${xJ|ϔhKzm \5ɾwWqe*r!K/5c·%9w3oҰ-9nMoFc"O8;m{ "RY9щ'G~@5>Ўހv* t){U#xаt]UheZnYբI+I2Cjw蟧_Ze^s71D u 0Z)Uo" Oj*OBzR2d_B)J0(_az-^݌j?o@V S>*uQ19Z?{mpc+[BӧtV05kO1y>rI[,7gyy 9{l"V]g{ ek~d V9lK} lCn9!,wŮ0+hzwe2=uBN;{;" Fw2`O!:'SIj`]a(^ə*9jUM9򧈋XDZY]E<W&÷M>15mB2˂DiK`jX*ge HP>EvO7$E d?Tou x:zz1$;HQ 8_mZZvNs^=$Ʊ#_r 4"=@^mKU\jMpSoQj~Mnk3?[k%Φr؁paMv\?\d{m3vE}.*2rhYD)6jw_2Z uLpθSN܈VFiqbJIn: ƝI0qg_lTZQS$f@,vK- &3 1jNVcJU uP3G)ߵ 5pZ+%QbAm])kn@RPV fT[c`챰0Teq0JœBۇaQzf'mX0xHV*z2~ hZV 7e+l5fwb;l〯E -q-y׵XL"n-nPNjS๗Op-|,Ӿ6D#X8c3X$@Rw)/'8UgyO/?PJtK2IlD]jQF@6itЅj>cS/N'MS Ұn>K_}Koig DH{d]ƋؤZ/'Kqx|$M>[p h!eP_93r1Ǟ`]:m,^^{gr4>Vdddy\}bיs9xgG ~u7o^:W]&f'CS:X y$wlS9$m:w0jRěߣ"6UMddcdǮ7 Wѐ`|'a½5L~w)uӠjȌUT\ʑQ,B_z]"d{tފN6(G&* (|N,r:@ZGn x:vI@1Y SrQq8XZ*$͕4U<^,@e| EMDupo#kkkC=9j$*eմ~+(YpM龐܁d\?¼S|Oi 睪 &ʹLst .َͬ5xRa4$iZQ0dFo|As%|3T?Td%NJq<-!e x8wv'uZxu3kl~upc+ ~)Y2qypvmW|\EE&d HpE &լ{E̮Z"!St5vhʓ]™괒mR蝘?eE~> *(_oaggy}ʚJc;*,jJgj!ySYDErbՉ 4EYq'V5(z[S,UITHWa8<[z|RPdl_ K@Sz+t( jw߱n {JSCf7iJ\B &ydPڙ/<r7bUAR'CO@Ìc)h+Zb D DxGd #~ #YίLy _b|TAqh`.E:hwPT3yg$jn#E;sixZB:)9G )d>8{qx)YNoyr@2 axSތD2A~i&_Jp6)`9#U{?Ww{%6q*-k^ɧ/O]"7Sx;y'i\GD3֩g6 nlih2;A%IV9p!#XJCDUJ:x4m>ʮ4lFʭI>_*4_N<0 a}E+t;91o{xn%o_̂z9搀\T@ض'/VW}.N^&8]-K2_%\[%i2Eԇr;oGq~8ekjy㾿]聁{O-\qciim)fWcK/6_C<2ga"#'#.^m!mch6ܬ]fQ:H "+ 70}AU_LɁPYRmMw2y,m}/ @m+d! uMHLiNVwnRuPӤ|jqL:>Q wNevu6۲9܄0o[jLEz4LXq\Q{vbJR.Lv\;y_g.h1*AmE缂j ݐݠRCR@eF˨m9{Y5N/;vD8DC[dBH02_; \~G/g7Z8 m%$ <)9w'B(BDS߿y*c%JnBP{lяq')GXw!/}s艒NL%Sݔ[Ӭ&3 VpDlNk= OB+-^ffky?9<u)+f+yf,_S VY!3S(Ͽ"ԗ\p K8LC6W`Ʈ1O2cX3\VpvuvsŚ/-z\$@:A[B)ȡT։ۜai=:gm |{Ddը,u 6(EMBURRIHG@$T] 6H&(jSuW5}qv;4Vu5)LGTP cvUF|B1p!N~XP~m =P\5u@L9E5/v̓Ԋ " A**/>%ym觛@1eGt)# ~]R3c:nNA,[IZT3OfY"am|%\5M5 d ?(S5Q!J~t/X; <4JV.Cx\l M͒\-L*aQM &Nk*i +J>G\K撊R_5 WNfO?\7ޢcYao|fcVʝ/y}*}>3+۬L:b%NTz:V]n/]*&{L}D)`x䎣ٗ{XqѱqyI<ŋ6r9t. DFeu`񽀍6sؕl䶫q5P]y{߶Y0w?._z?v/>skVa]k Ͼ,Sx \wv/7p_نUd$dŎ;WaFUrsf{Q__~}y7R G_JDr@zL(T^JBCiGPcvhw6-Ckyؙ\RSl[M]h NR%H"OJ"J)[=j댭MԩU5OV5}5HFOLUur+3$F($vFSY/C[gƁXVxFտjT?d@#4֗83{%R O=}36@:3 >x84pNm d͚o!Rln7/ [%\u]ߏ @ 7H upu>Vs-Vt6s;./~? GRPF0}>dO]Ө;"[:K8o'I}b,ٗS؏N|+w>cʺ$wپ5=4;0IQUpN~譋c6˸oZ6Õ2a_K6.u>'f'9󴵜u(OX )UqmKzY3|$)+:_C Te5M5"F|)-j&FI[r1mwv[ֶmN\8q&OQ1p|Kݫ.uL+?0vn/я)Sp7.ÏgI>l?a<8rWK7~!{>pcX=wn?2kD?# 1X+ݾ~Rh{W Ld$OC1胜ݤR*նIW M} د}ӗ%"zS 58mۊe񥫣[z IDATWck4Q& + Ԙ2uzh. n2GYuQC,€ y@[6Xbo.w (a͕I([W ZDi& `ْ #?TRi0c^g qPkk'Nw-.U4UexɔD@X qd45PelNXR,{\c-+4da49nP!^7w|&KNa=w ,53o[%nZg*1:zb VI挆5}Op ,ڴЩCujod7TMo,\;}uD#v[/b0-=ݜ!n 7H(% S&nsZ̲R\xUw77np;|>z Rę!9 l?Qw@mn-SpOOoK|ZZs*5,oXny[45 ޏt"7{%/\w|#EOwvƵ?3`zIzAFig|+/Sމuq溫#>lvf~8z;ذ =ٻlG̊D+i.~oB(>T$jC- #%>w~VC]pj[}, P LZDC"/h7qʶ(e@9F&ReҟE*a)(422PSvhQ_GA)ɨ1fƃנ#{U6LQƔfPV t.p 7:UQAL)?Bɰ@F BZ%+Vr< xH;;M: ?Vc$1XȨu2:uct~~oi=.Y ѦSK;V6s/_vʉ37 >1YrG&^X>*O0vkǵt(Ds- ZBH>/dT JM Hbͺ2)SՔАk|% yMS&hSKl װoɠctqظM+]lbrq)DP^C Z[%CJ?)m&sO-xt36fG|uD"|eH ]fO;sg͊"L ?ܬٳXlaɱSO;SO;eȻ[5~v8r*h[+1 QJ+gg*sh8 Ք#OlRz"u^BO V=M `+ XG|^(BR/l);ODRy2}֎"::Ni|-@]x*d.Bej2/,_¢CQjL/W̌<@Id>JD6am ?6v"peP @!%4@Z+ #k"F2dM<џI :XdSMq cF3x=X3O0eoJl)oE|lC-\ZRdĠӔභQ"C_a[Mci̐+)uQC/һ&l>WJiq9w&V?i=o)~bNW%U&mC9VHB~e~oYB[6Kk:Ioga )| |)KC0WQ٬>_!xρ,Z]xWI=LԨ(|!9`_i]1ldWaO͝ߜ;\nw8lRʑV./O0bB:\ Nb;),;$pld:E",l!&HI)lvPW&F*лRY`cIȰRL1 +$RPK>eF  ?,a `l6K+""APXydҌĻQk0'|_cJVOCm> ;?Ա-5"Y\TFy$ӟvJv!m&=Rgjg]fUT!VV]_vpB/z}$QJq1cwAvPOMheh z`OEK: s> j5?kl`X`ׂ$Az X /2\@mcaQ\z+ 7'A reWoyd(.¢wqM$p~E.,M`.Ж&[$a2BlBGҥ°qwkKI ]ºL[A匂xxsun-5ߚ?ܺ`ɕCl 8)l'A""S]E2"mTd"XJAx0JA-2Y-dA@ %Rg Ix# yaY8nBѣ/K6'Jfߦx~l[XCyzzp"WX|?a=j-c\ĭ\V.6N7bq?ou:x dkna~9T"L@BmGhpa?fp]' ")pYMTρ&R YHT~܃xe.!۫V~)CƷ!V 7EB~_E}JUhTcmRU*YSOq\jsE)֫"M^#\O)QW;\HU7.~'xcfEF23W Np $ba ̩܀`*jàKm.a>7G'R{UR6mHV"ëƨv3n׭vR$td*e;E*t*e[R Vijb@Q)у! ЗƜȸU#~@>_q+-yqX$vH$O*P(xr^@"᪱Yz立7Q(,6na3a*Cq[g$N|@Se)zE|ϋQ+"Blm،b Bg_ *U "HdP[@)Ѧwd(W8 Ȳ!.wA^9&'Ҫ(IndA^X xG zgFd׀ ܱԀ?Zo5XM  K Ў6?~QWu-ocĆdHIdj `ړc{Z ݆Dhzd麱FfiT=UW;I8Un5!JNH&N,qUU5ضeYXRLLc0 ՚e M} (:7@#PNl3 eIx^qq]˶}NRɤ2 l6Rӧ|ımRJMxOTWWS__G]]vQR,;ȿh*R%6TUe"" LFmA[5>rz;"|0/Zj|_SJ&P fUWM9%ZGgM;+R-+JgiA=#.5.cA\7mQ\v`7ArQ)!ۢta SzQu4\R]M/d;[6'-"z6jg(t:u+. TR0:zWN|OqC}|g~dTA,+VHV&q)25$ZNghiC&Sva, KXX86BȐΤ@GyX4M+/c|3 |״H b Ca )="~0]ץ, vD}EHl"LhV@K{d2I beA:.Rftuwa;)\/OO٬nHEFD^Ƕq&p͓zZ}ʏ]W/ :v۩p3] BV\-VP,7 EMI*YБtD'jIڅ7ߋ6BGY2JIA gimGEn۴;[ϑsP]ʼn> zUF@v-U)llnR`` XQ_XDeG`]QgØɰ„|qq&=E+YP(l*&r4BS oNhpd1 bYSuˑ#V])Q6׭qkH$HVa96 R;" uTUФF%,e[XBH`v HXڲ!:nK RGd#, HreQ[[eI&Տ.A>H IJl}R[8t>)f8nvH&]|y855P tun`U~?2ys Ѩ"UUgTͷoAD DE":8"e1$'I Ms* [yꩪs{}NZZ] /a$)۩zkR -72m4?y&&47_&XF|^Offj!O"J@j*7¯P5ElJe4lgwˢ>du=ʋ`3h([cxdU Q&u jޘxZ%SPX'j:m;pzat Kⁱ*9G{d #Sį"O8z\H! z>S[}aq9(v; q=OR/-4 I 57ŌxQ\ HG([i A ZJʭ/@ 2[Uʫ`өI*EKiX%J<Bb$1PZbؖMTfll$R/"So$Q6~DWQ+.@@Ũe\4Xy&}+ !m@Ai\F$eW{~\@F̓bsGD2'%Kp&𥌢$,iF ICWpϑ0@j巁(&d2/%k#|,-m:oe.NCc}R81-kS*a t&!l*`2Vʷ)viիs Ż8x` 5m28Y@HT !pL} kvp_NUp.2x$P%{&W º.ۂkiq^ ςA=TAm6:hk"c.\'sh4_ii0c?2d{rźhR d*zT!IvbؤcOnl_0e4)¦oɵT}EـQf+k5 yrjq W#d \=7 8+B(e S#xx.fwڅTwQε> Q)*7Uʭx+ <wEP-)@{xk!av6ZdԲ WIs9W<'½JWS>1PS=FR~}e-bIf ǭU\\,` ѐMJGTD8q[Q^;xJKV`ܴXX /N,J,#sdPcy\VDiMKiB6;NTZH%~8CC$qZ[Sn,tq=5b cI%C0h'F7R /lb1Ig9"!aa)KHRj4x C)?PD(nFp1/l'F3amzZ~F۵}[e9f8-Kё&RJ'(Sp$*5{m%g*^Ԯ'lA$2UۉX2 h8JTj!hfIUHY3'GE@@`qI`1p*m0{. sT IDATZ CXBeAɇ|VxmNT!>qXQwJZhDxlۑH`!6K2?bQεFE Bb3o% 7j!i-UG)y@Go3.n%KkpP.!N4H ȈPerl |e ckml7y5Re]OuLv (ŋz^0:<aBj"=3cnoT K9AD._$+-E2Fc#w~,X{;U"R¥-bʾp vPh^xa w~ CCE;Gցe~@X$" τm dQx )PP(x{*/DEg,K4DaW,ʹR)FaM"ux$g^3xRǧm>^X}SD:"-Eժ*EM,jܽo"?ѫxl3dPQ{O}d{#l|3|ߧ!bD:ZU,ڵ.lRe Q8 ̛4( ca[kX qI![D%Ie06Vhia8뀀L_T 3@A -Z.r +e(\:QK@NέsAU)JU,]I1Cx"[2=TVs_,YKm7֝UK vҷOURƓb#Gy}q2J@2)\* #;/6-Id2P9Mx$nDȎ\I ) C>ˬ[uk|szI8E,BO*aarW]ŋbp~˸HZqRx6+ kT$>ǿtH%,\8P*(˴ Lux鹻ɌMJiy ;쾀 FEJa6]38ǐ%>wS|sSKd~4ZWq6<tݴ}S D(?ǑGQgxz˿Ș]}7LB&7Ŗ)1Hol&ˍ7g2js ]D_o=DG2_2LV#h {axY񂙐F5]5_kc|S4O4_*akxU, ^/.庍V)S]E BT r^V%cL:f}1FnhrGCƻ ۭB9ƳH(y+thb ߭JFm@F€K ۊpyFI7F|0oG-\i+!DQU+Q˗/F=z57t릈';=6]~X,qN: AYXhL ~k E^^ukWpaf]v%r(5c59΀n9 kq{OEGx:BrdbGo[+^h-څw>S(2Y|kԊnB&7JLа%ē 0W79~^=R |Sld]v/Teb m(fWzbDː!Nn3(˖+)Zu+LƢ6ɹj!c,Lq/54H&S964йmG /0}WžWjFTĞ s!Tоh2z˿^  fPMz00J:f13y1>zwRQ+ٸ߂X nl_dX GDs 𯞓p!|nUo*$hS[zi>&G}#Bϛ) $T vNB>{᪫<3q%g": 8L9S%tOt^{?V u7l8ndjd.\/>PU]vP{-!K 0D (/Fމ:0CCw>'>A9gϤsћTd #6_S1V9]Qi}g9sm0 "b1t{̛znX - ށN< K=L7A@"Nb޼\˯L61͉ K{o_-zMA;Ekx=eKs/f횵̝7̞3{}e2.OD2E\ǣ<\LXRG{va\c6s>zτQoޝ.kcppS?p*Rٳo1gv7[W3>G?vWߠ:>5Zå>?8_+ Rlcbh`C'_+Xϯ:r<:$>s?[~qFGGAl杇9RZkBt2N?Lx>[x?˿1/k`L \6;| 9ռuMfD*RU K<Ukm`'LMSZ ʐi9(C!/ r?1(_* B)1Xf^__lܘp, cr~h4@]+AHG!Ȓc*TW咤'MQU[oeyC6ټjO쳧oY}}5TV.Å/~Lr}/+j#B= ߀gm8hm: sυTJn'{8cjRuHvW`Pg1,YP,sNn/I[G;]yB֜GO/Gutt[)Q}Jcw/= |$,'}x++?QǜquZxiP26}}\Kp~ϱ>?(CmݬZ=JWGX'7.O{アO?Chdš?Yqs N;_ qf.aL6mR~Gap/9::{V8n,"cIP8+,:u̱pYo [Y= 7݌j7/ܫ1-o L=%=I?_sNz<|cgqqGrwJ;@$VϞ9m{\~%eo_λW~g,s>>YE\+#r?{uy{NǞd%/pʂ Oϭ1;PJ!\tɅ|/p{%;f%y(rsy5׻Dx2*Զaзvىo]M >nu]N>41oIyș攏Lu],Y~3BN8wrCP?wW}j?G`sdżi]y'}EK7GjnU #q:ɮ6Q-F ['ET\(Rs1J_MR6QŸuIBy!ʶeLIZW8r^3H?$Sī)b5Ȍ XdC< p$dG`iI_ꂖ `pHj^x7d˜PQ5͡81ȍ4حH]9<S@D)G0`1#RVyseM-hrL۪ŶazDu6 0&HWv|;&,_x!SgV]}5ꨣ{\h:WZ\"眳eZQ$(ҒK*Kό9̛]3Xi@t.A͜IZ'?^]}'3y?/(~/77Y}x?=߰3'3, 3-ǒJqG/|z w+XEz}.^Hhia|lV6/Gy,¶,(,XPs%!JɪkY|5#cƍ%Q2ϙR@k:YbM*׎J"Jib[GDTʲp$^,x zh#:Կ}],vOc}k?a %a07t:=)')'=Ͼ/,}뫕7*S\C; Bc?~uyGxg98'VMu.ao$/x:"2jr#| lyYr5&}ij ÏgN"BVZ0q?C?L/'B;P(>C (J/-oֽܼ:>YjUmWriP.k Jk&e^V 0p?4$b}3m¢ 90 te_ n\s?j!VU2d!r̼c`Eyl?^H^~@@R XzW(!W50rSKte0R`h1q\ƌc @r^<%%B C%)f4lڌob`|.NaUHۦfזiԯ1mm}ɫ4tQ_q6gzJ)o 戋^/@_}r/KEY"ԧjfNpsPwKOΠ{֛ifY[YWJEQ^"_D&sӂsҩB/$_̳bP,_}w߅hW\̳jr޾;ˆ^| eUkB˘v'>B>=z0ݭ 'Xu?XI3s/,KQ)gm {udh3kV DeV~8BkG@׎H$lf!FVkI 2/F#EJ%\j mhGT"Ea CukgX/>ϒm䞘׫a3[qO%bXE\Xӿ $& ښoC|cOpwos\Xmwg 'ao}mlƶm <<,0`Yv@Euo|?qV@M0ԏH5'"0( &edזeQ.ql)@Z.$W`aO]_u<K)QPs ~<> {h,bL-ۄKu^ Hx)kHd+mE*njT=_=b |(d݄JU'7)+57ȉ>6bZ"MZU,)GT:qqe9 `)@4xt*뀖Z*g̢V\ϨHRAy=vF4s+_xPqkʣΒnTv, RIf$@g+kdLeYloT$ӟNgYpݍc E >1確^L'?--Uf6MPz-vL笷1kۙ`ϛMkK mV,_\mmDBF w}d%w_.oWvh~{+&9.^|tIR&,l\QMx~AT,C\ߠxOa޼Lfp?ĺub U].E ёI Qέ?6: ~GT2M"AYb/Wk׏+#DZql ۶ -30ToFwr%Kx3jp:ĥH$mϋ%H$蝽,Qw{5:@@˅I2PL^ $u7\K:&N˿ha\1O9(l'u]_UEV91ozWx1sߎDQD\&|7:k~x |5Û>I֮k-7nf͚yd(ˤR^ϋfKKx|-[!ވRdԿº:^DJK7{_ƺ>엹W7}"B\al|0 3e_yS;| @F4zHuKk! 2k!; \pcƒ5% AZYc0F`x U0jy0˰f1 O?ARX$//~#_*"%$ .k; xμC$uR01o *쒩9CoHTa O~x[+$,-2m0kgE]d>GI5((.լoVP]%\Q_>q-K? 4׮YE[K P<o&^V`vQGba{ࡻI2^w߭qb|=0H~]">z0~RL㺐JJb,#Cr]g1%|:x1:2g"q葇r_!q2K_\G6ӯ_yMm)VBw /!Pa(kg*=!c*QX% '#&j˖M:Ҿ[}$;!= @v7eNf=tۋB9z V`"A ]{A{x4B<8ـfI`;X4x3 6ƀ" .h킖Hυ Zfzzk8e㰤+Nu4sK)d0=p zRś1Qފgj?G?jj*@Rp! <+lOb-$H${1$ZRaHp&YצnR-Il[Q*itsb} /~I@1:2DX0),( xV˰?tK+Υ_&^}-{ŋb<&kEXgDq W%8/};AلKmmm RHFؑbά+ke a ~٧56E)HV%v\!Rf|nBjhJGRė<:(ik/Q.eйy;r( :0ҿb)0ȳo+tw{aFm7{>{f;\I['l[dv2vr{kko] UB6es_jh{՗;5l;W~۝0;XaW{+ar1s1Wc9> Lds~G8inYÐ=~+7~C+9H!+\;  ЗD"eW~dJzT!s[O (N8)E)/) jB< 7ANOȯC22W,j܅%T+ap HK&ۑP,+dj`Kl/^}mC$I>vU2&ctH'ۅDɍJخs1"pJL:XZ 3٬2uPXo=е=sOʼ YP1pDcZ8 M8UY\[ǰ&%빥kZ=RŁH (.n4a@m/Hs[5jUSOMh3ձ kے_C2#2KQ+XF8 ծ:)C°|beQ_SmAw墤园 Pf ; \yE-GSw;>],{V_z)#|%k~ҰDz(V dm 4f[gtLkX %e`֤&QIZRw|%!V:j-([)< KS*WE?8as jXk}HvP,j ?xKx!oȄ1m GB^zaiö=~+\y^X#={]~vq.hO8CXf͞Ɇu}7O<] [#ENRLD^K6 {{ GL?SEK*A~c))rzPE Tv\ 5m^eX f ;-:XnL-5٩r#sn6Rocmn큖4̜/z@n\ Q(s(衖t'# zwH&ɸۿSΣc o k_c_1580^eY1629483dnLL :Beɹ4ۆjƌ"{j͚֮m+[n16S*nE@8J/<ƱJ715 HW CXqleh`X<֨ 'eZZf=rϜ!|2=܏} zg oYD>X!_r1\G Bw vZ[GŲ-<,R%t`5Ub'm-+UJ~Ϯ%Eq}_d̚UzHGx^ jڣ1-K$?*d)V_tz::nh{V>ŘZ?0aÃ~a֫RpFA JfF z /C4:)h0fVȎՔX(VR"( lrA#ʰX)@W.Eh>um[<++B-  ȏp\A :rxw 0 AI: Od!}P@I* }A$sgÕ%<fmOu/de-b3xCrrt(]!Jzw+Չk26u-u:%﵎yʏEk niT}hHfX8Nah<mBJWFl/16sjDhl(B=R8i\;p]uUe[kBijQ,f|FfDkR]B/Pݸ~ 4%Ftmuyl۪h@\X 8-T*I2Ղch]dFO Wυ˲lq;Mu2s tmBa[IO*%bY*:a 0]_QlZK?>6²㸞T /B X[iiy]JՓ1-pO99ȃ'Sz,'X=(cKR< oj4R#Ai\H0]SpQ&%VrL8"вeX)(;,7 }YnPR6XR./aGn\9x9 8Z(l9us0R&$*4)k#߄N6<9O%2t < LSQhA_ndJ6Z +Ax\m懖˅Hn,MV`^Vؠ}Y]q<\͓V i.A؛Ci2umN6 MjGP\~%_TCs/,&_4[2m˙STUȖHCevRK$-f)\i_~Q26gL,Қ`L&뉝In?|k%ܰe+c'H| }W utt0R!C U3n4c#0>z|iMoOZytw;=< >Z+tiPY+dQCׅYD:Z:ѕʹL˴.-j:o?z̡<ȓz̡S)-9q 0 d%lBVPh{dMs[$m +%\'`N7#(H9xy@آlm$36}e0R>[DX/ VCtJNHb- HQaҽ3N\nfvK$X+ ' H%v3!_ n.B&MPS1U 7^ &e16 <8躈$@TJ8@v&֭AF+fM.zC,\XSϔjW%׮mw\G>q68vxdcu󨔶W k \ED^ݗˍ%7GfxPZ&*r5…;ɎS*֊sY3f`)%/FEvO8 x^Ŷma(|#c# Кnö#EzaEGف) rukUN,̞vrm.xmbF;Wt1dSfA4OFnfArx2!X # 3fC2!z?8Hdk )bQcP(#;j܌Z.ͺd X]GlN:p{lBz[C^ D~\﷟[X*U9`өXOo=O7=8ޢĔzhiGk,Neud] Ȏg?{7N!֬^XsfWێ3xu^,EP$HGܼkJQJL˴l=QJ'(jQiǓ):$㉆/OUq2 V4j Sn ٲb,D4VN\a㐷%˔2 A `a`X C6+*FGL̚#񌀑|FB2wI^ɷI]lΊfΓ~͋ SH5uCR@nS.29ziXVunڲ7$|@>W&sx5y¤f:P7NX*FzZ^_iv5ݪ} Y[]g}W @Q_Ut`[ 2IRnZ[ }cNp/E A|7@JldGjte <3 \^M%s>Cv/lM≉@\=u nJqе د_OŦ2*W"ߵFyeWu;wosdDf$4K)!@HB`T 1VvaW5nW۴ ,h76Ml6!, h$3I)Șo~w87L,/WȸwgTov2|4ӫ98ۇfAH*%i)eDQvs QozY|ȻyȹLbq Z<G`\<&6搋VOҵ j=^q~L%RUj67kƇ yZ>X.x e^WmS jQViQJ0,6Z$`<\ϟ$Du+TA#A>ʃxkoyۉ󔘞6/xCc GuW~eӰRtD7NO259 ʪ}J^@ \"OHV)fo+׿퇰kRr2&t]WeFJƞqq*> qGT e&.'$~H^zerɇoXS*v;^eБ*ul)bF@r8˩&10>qXZm18`Xof& 98R* PCihILLLf mm(B fcЄdmyuVےJ{797Gw8L2-mٌq!onկQL諔t$#ӥjosvG#ۜdz;C eĖ_ͺk"&kl&ZNU7xmOt1;-q8?θڐJ|D)03rjx.-HZ=z94W>ŭ`-m6J!z`M6YT5zTcbVJPUۘ"̫q "yx+5V+. IDATY>*IX'-] _I,' >ypÇO11||Llc>?x=qu7xӛG_'Sw#O>^@_PI&2 iP)h;;^@G1^~;ƏNXo"׉C`8H _&G6_b;&ET i(6%*4oy;ȇ?@_ |#*Ǐ#~אE.i9݇vx{?j;G/_\ã..m#KeCב$)I|/Vk04k22FݟBV`{A!1ny"3k7lJE?F>-rhueZ_n1I{q̜F$L3齜=}J//,a6Rb1L\{$R%l$$-u2e#~C}."ϜFH45נ& #(Ei› ʝ=/ALu]<ϣ-B6R" @ކ MT/ 00@-OT”ǎ>|-eh e'R-Cit] L-SHƠ29֣MՌ6Վ oQ\퐍-,(xf[ifMm$QTvQe7LU6=ՂjvmmxS`Azswm9ej9lTl:B؞`Q1YO ˪7| QVΪH=6sՆ"f=qa"ra3g&ɐK˺~?}x7WÁBA6";)_%_9O]ʑȥ%x]?O&0m}ldd%1;$IE\7owfS -z݊|٭H]#~>tDBneeé49Zv)@=ݭRkzg ]7x1ffgw~&G1 33 x?ͮ),@ӵMFq RisLcdt܅X_872k9*} 4#DiL$1 (M  -c1~#SD(7k8w˧↾v`3y-@6e@͚kUw8~4n&{ WY@S K=eUtdF|9|mCP~ŋ:uJ`eڈjK}d÷ն6Lڙ,O\n%<ڰV 9o@ܺ>Q3Dm/7q^ISݳf+{܌gOM2.>D6m|p]a8tH # 5SzΝC;<|Xz?'G?]}5=~D@@&1#mdfgΒ'/dm:o_Lc@`lE|kʮhw:[-l5ʥ g(Uqh4^3|w*`װwy wq/ IdFRq!rggNq1 :K5"B43>6R t@ap7APdllw/sWrw@٠V[! Bu321A:7|#=ܹst:.N8_ n+nU2W]ُߛ4lduahɋn%Z^G!IbL Ð4IIMISAЇ[DhG3o*S4&)hc:Jťe' (3CCCLd`:e"pIq z ;&n?|ع;xZ *[R6pj;QYRr@ϩGFEOΟAϐ1bB ;΅nf7o<^jׁQZ7BJaJ/v'\z;?cn7^O.|~5|F`a tΨk.QR Cɻ̈́cmE&*^TB\Pmզ }eo$~;J4$Nj*6-U@Q-JZ],ӢVS(:hJ;d fE%166ęst;=4ŴZt D54FKsf0Qz~Cv6<-ؘ'TcL𱳸:w]i5v$Ij+,.p%rMݣG@KX\\*B*e|t2c8<2̮]㬭0skhuv횢\X,i㧾KfM#$yLivF_%)LUupL>L!gcС %I fx?kK20MZm^G& w^2nfA' nf+D*rD4HB R8M e/)VHe4!ju(BJ}t$I@{|7ړU;tOɮn΂o>Lx|F-Ox<.`8!/loVJw l(e,CI^)ZS'CסT*yiBa GcfؤRla56{ñ$>0 Am.TS* 0T׆b1r3v ܍d0yk&uocq>ڹ4ݡX) R\)F n@Z-# "\vaѬwAJ,RBP(S,B;=6{&Gpv! ÔFKaBf|r{!~SȻ7XY17/)!RQRo4TOףP,r5Wsl[n|c#8RlfxxTc U0?pNg>i;kMm qb[N$51 bJRJJugii[`5Ԛ=}< 'T%J4tKVK+Cm&%Ɛs,,-HY+\U S ˺xJxrvn$ u\|q'Nt*}ezm^/)p]R%Ct`rrj]I },-:.in|/Y^3==p9 ^H1MR)G IۦR.$)Q)B/sՕ(]ju2-/}v'M"C^:^u=R:9]{޳qCJ%,²,4M#MS@UC àZ214͔0G-~45J>IJSu?{W!IUuq;aXhB҃uضcy$F? r]uB4H۶4|Yשz4)+Da!tx~rʕN.t|RW6Q+`:R$ĶmV#$ B44M8&w3BUh膍i0<ֿu?՗]}sereՋGQoo011A.c}:u믿~7lr^* OO8! Їx P,`||->n<9p2voOFl D/BTT-) D ePg堾͓0"(3 D8 4a`]س[U_eX]TMog2 ίf "}<0Yn cn9ED H2::L-40T-Zp*VkӉ5IJ'.z~)?W/C__0 '>.fO ;_Å-R~6t HNsxTk,U G_#,rRqR6x&LOi$~?Ѝ8Ӈ9 =@6Ra&&0t|s k]} IDAT8*:@h./wm4M0 x ݢmp٥C%jf >ah2fkGead m SScx~DJ.RQ. ^ rqz^z@u9FGGؖfaHX4]WOtuN?#Ggem=#kAD$oK"m,`sg)m˄( pMh%CCΜUU#]0<2ٓ욘ՙkPoK$IG)B4;]0@mAD2㦌 J y3: CO﹜>EaVB0BbRotɍb]nH Bٍ)0$I$iV &U R|G]O$|pI74{wzr%]?$C199]\\\.S(ؽ{7)Z%\'x;?A묮266[ox` `{ԗ^zXU2՚ľj*_i RmkQX>W6 3`ު<3+?d`)Ֆ%dĞ"G58wL)TEp z`=dp W)CE0h)( Gյ9yG=9uCBa;gRĕ LeKSJWFA'RϪӆT&lUJ3߆d<(.F0eѲ^x11t|>O`tK:|yNX"MvMJ.N4 !S9KhzAt @g vU)r !eZQ+1]¥z yΜ]f}cM&żM_E'6(iC|9*}}$&LHj+ $E]Ξ=C\,]Z4 &hחY8Q!J^`h:H]"}+(Z,/Ͳn0IJ|O5 |m;T%4c&a(r=wɉؖ,6jVAXY[tR!) -0 Hw<9I!HH@ :ްskx^J&MA;#t]#)HIG Ø\N"=?T_ $A8EaۦJGSLR,DA߳+P+̙3,..*n1&NBٳgTfbȁسgoy[>@P<}yWm\vԥv5K; T8V VCq J@DY%zqȍ { d8/ӂpJU^VƠ{U8e%0t9C˄0PnQ{c /$@ž Y]P}`Ek,JrXy/CireO^tǝy{8vo۟` iUh-YzV[}O/O͚T.a6ԓ=*NmLBߠ |J:6ꏫʩcZS*t(&olW'Yu@l!y!2']U®Z7׃b?8ĘF-1j:J[W\?A>OQV)˛@L2^Wnr6O۷7%l+ njqSV1QN~ ː n`pI, <4_0B*m_T3qHh Yh +'UҐ:2E9mw*WfhP̂xM}g2"T Js$<-@P_ 504RjCI-= הGVRqO{hAoF< ˋ,6nKTTmkgJN@6< hj(l}UBa1 F9Ca4[IbWsM. A.Rض k fϭp7cF N.gyR D:XTʣi2Mq",,x/DZ DfVkϻx&Fʒ8J 1II(e^/ClbaG7m6S0ᑓun+8yQH5,ǦըV'3>1=zMSǹFBF3tWխ{{[]'k#C -L6J|e9-sGE0)`v$;6C7qkМ[8y@*3,JqS; fB!hvfZESTJCU)) 8sJ5v6A mڗ8'[ǧXZBU0Q>.CyB)t;Y07mfr t10Imw1m(VeN[YFG6K%pES6Vkՙ#q (azz/A{!vgqY2;7K^ÝwQSXy^@6# C*a ;-C39:::T+LMO|F``Pn&QרkLc442A8M.Ydrb?YA`lOWWE|4I&u0 PZkP(?S-#!E0 @k0MJ{㺀Ztlg=8 F )\_\(B077M"",qENpad}]|_bm|k2WiI68 w>*ʳӴ_H&h4X$@k$[6c *jIE*LLcXVD&T6ct8tt{ۘ6$9p_ "*ՐFwi|Gk$QZW0 0ҘAevia04C8 .*,?E]9T)JaYI|!{6k"{D4$ےVp<4a`X >* `uIQAyOPp+05-J:/so!h-j3P[&149_ ;+bh0/y2VP A*"nT*zE z1YCjD$Uqb:߄ FnE Q/#r\ӁP?,hLk0Q՞qhXگG.u{Zr]A#%׳: ^)L[Σ]UjhwF{wx8B);߉޴ =< ?< Ddէ%:\DTVC~FuVUAxd0:ҹu؎E0 ʒ :ɮsCRT0Ll.͏a2?qοeaD&H_b.aM033ORv13;EE8Ep+96lĕ|D(H9GYZ/S,8IQLInu׽M$C5i묭tw>ۦ^k`Az &g&H%SvuL;ÈܦG?4jm&+c.}qmlg9eitvuS(X?`zn)J]LL6|fV8N(s[d2%j-jsτmCЀe5 Н0 _Ա*@RhZP(%ň J CNp,n w1$@4 '#'({6kB ƈfF(3B ?I=(ZC$2@&^*7C:hI+#m`ے@jɂW`V  G!KtVB(KAyae -ɲs圃ڊ) Jnlj>Hw zSZ/zMAGb5]RX{e 8 ɊunfH BK(gDB_jMy'~|N +b )"ηr%. ʔǑ `@1R|X`$ܗ!NڞWGLxP }U[ny\tBk: ;ڭ坬& \ c-$ywq΋;VFtb^lI6oV)i?}a!|s_-r$T0H4Ay{rݗO[nܳik;}ذn=a}gm')簕ϡ#.)+A!Wd!gCx=Mrɋϣԑ |?@kEҩ4|f|>Som]%^]A(mۜK,p Pщx_{_ݍq:'\ Vae+3`x#ˋc/~Atnᶫ 7w.;OCofE&#ral?/| ߧ٬|?4ZG$ZussplR tF[@U6+tv6O}imFAVajjNШ7m011);O&?9Y ›oAFmj c(^nO~{ocuzzPO0lAuwafH i'D}n 7짜q\͍7hnh{. 'A:Y)0l s%>^^յBܠPOtӍAۊ|ZmaBRBO*:zGa$ȉe0 1 a&0a%;OLT"B}|@1[z!EFU! rZE@ HCX+K7sR%IrgƤۂl$nW^D49AcHRm$d5<$ɷ70n@cgzqjqRT ?sDŽVe٢\A2 G hO^R$Ζl4B&vZ$gh TbC xp-_ὼO^;_|!M_m$,@mu$דMh6G($6<"/i6qI'(DDz90?m|_ccMQHP.޳a2Lغ-а0 g?Ɵ}(/.$y M 㾽3ds: !aAS"3nzq|@:%MSܾN|j#G1-mדs2QtRn2j5AaXERh0Fnk iat8Z֚0 x %!W/=*++ i΂;-Œ$Ǡsz1]OAr#4IdQJ"-@vIf"tm4'͸\ςqSЂDFY$=j9Vk9ct/9Ai4lGeAP ({hq2.N k[J['siڝh&?7s= EHKyvNCpT7Y9|4%ȑ"E?+QfdRTIA@Χ=# 2O#$'u.Ri  ?znCN4+_{#P@Y\j /"#֦i:jf\6IDǝa$ mG:H%Mcl0/?L;BR!Wi#fߋni6jEF7|Sfܱ/tR d(E:|ЊHGF%_%2uN8+Z;DÄ?!p_*xKADiO#^o}0BgsgM#ڭc+;);Q;i꥗ 4- 8UW.oLi| }],4kh]J 2<J)t +.A9E& GykDF>~xrb- E0 j` EH@k Q 4lE zi鳱>`B8XnJ'$4I3#l$Q nI@R\  Xݢi@KQce!h#wnN@vTGH BK,k!M:%6" A-Byd0S ГDJʼnD"AfM(n$&{؄bk<|Ug<]\ڋv`LA*X*JAaP?"c^JXI9 @ qҫ8q(d Z?j\v J]B}2O0m +a.Y>67Es Plۆy7Q}}k25~rٙEV(Eضh7Bi sz0=5·]z)f`ǎh3ZZ6GV&FkQ( À聻?t7/S5As_EtFX#˔Uvbn11?*Bw1*nK^J$q G#ŗe[X1[7_<|CDa:ʦ1? ?+{aNߑ劗v=eW<.LU7FKR(\X^b=B3lr>ёq älc4o\ri`aF!APX%+l&t׀2-L+)b-b- צ%Em>%A7z gI !IzS%I,@eu;Dl'DLKPdvVRQ8v:$M@W/ nƨzm)(@ב 6e?∴a R4ʘ7re Ri) A:\IZays.E]PEV`SŠОrLSf8H464M(d{wTȇTE A)-<{'V8S%`gԁis 2'1N*KP@[sv%c)Dă_~Hc<}tN<`R,1hPYρ?Q%<6/sKi~ԇ}C?z+ή"Ȗ-d2IڭЍP*NH 8qpvnچlMX7<]\_j84_ꢋ{ZKq*f1pO'qzKe^Q_hF43GVYφ;Wm}Ka~wl.fg) UIgRXJzc`uF4xuL2P0aDO}_!NaL ˲WəoSƌ[ fhDQf c+{"U1Huߴ9(P4w 8!oBfAs s?cAj@S\(vxF~{-)X:6ďl%cd.[-w!bzS;-f}I9߱н]UѸadv(ߖ5L] Z{yAV\Z XT9X߆RtezeܝbmhIzםT.HWrJHIƝ`vI3A3 B:q⊌eyshgљ Djvn<JEh 4Q^bԙg#aq@o|:l<صJkAXSMH{ش^PD@.A2T:z=t+.~y'Q(虨\7AGL݂a\@.$XjJ)l!Dxwo|ebb~|'-0;ZEҠ,6^} Sǎph}f;q$_΍""76l qݗox||ho9x#o}SOmUbnLXdvTdR _>AXwZ|g sc'lahki+}PkӞ}.V5Dj|{\vZSVeK45fH6=ְ7 YXgq[dH x9ZVBY ;PaRÇm1Lͅ$Kt0]߲<0 Lp#db28'7J=Cw b(㸿'+'.N|7ۀ&$&}cO! Hr[/ Pb, (6Xe"X*^ ڂHa~( IĻ$AAnBW KEƒH[WHJ VbJAuAlnJ1{+Xyp:űoB5$P߬${gPYHf#1ڐkDY8HF^Ri>4޲.{~d/F= xѐ$l7|x;P?ZkL!Ԥ}O6e&z+رcm{lV'M˙՘$}GIG7;Dݎ$4uZ(ͯ߱V/#ƹhb#7\k_n|?7QVZGR[Xl8\6G_?[++_>/~ yX){!RD!\Yքb]P^(s@5ٿ_H5fna C,C1??COW?Xfۀ2x`o{{@\;+.#̰8u6ej՘a`f< ks6 e8|`wcq _Dže(磌d"v}ݝFD׆~MޞSsEE{R ̘ʦPj ӲC]ct0,l+ANTk Y̳>vlnJd$#L%ב$^U׭0۲]\2zz2YYm~AvM&_-À!.Ԥ6>]S`&#I/)i=[9Sp2vU&-(]upAbbQv N=J!b#\ŭAC}r5!lRS`PV)zШ#$qt%kf'o̝wGPdref}!# RNQА!/uQ?I؊S_Do*Oh:x>yVoG?goX'P~7Hi6QFGb~K^o|#?3Yg^'H SK.B@pA3EwSIqޞeI;3eӘIѤzlv1i/}F u}0=Eՠ՜eIرÃ[;^:1߀ӨcQ6^W߻c <o@;ﺃCrtwM>wݷg?Z_ӟ@t|+Mx5MCzf~vj嵗DU)_"R}=s.nGؖ&B!jd*C:LR "RI+lsҋ"|`/cKKf^O˼yǝ |i^Tꝇ9n ccGp=?BGK q&P? UVKH6 02@zh4 5@,K0H'aHRJ:GzI;=Z,,,+gZkSx7x1J9^d?OlIY}+=Ԯ@8HfӪC:1JP d3Xd;Ӛ̀qtVEEehMJ]1Y"@SIn[W+|'TcSS" $YoWyI@ælF74g12t'o, И1%d't‘QPvSq"v !: bM2l7?+2;*Z1S"Ew{'?)I XQMo:E"Hs W ?aA*b@}/FB;>z}mO^*ԛ-oAri%~"cя|)x砮7/0aBE7-mLsZA*ir[i6OɡC(2-91-iP&g.zzj0q ^uΒql!GP>e;/]&dXaaD|hCS0B!ϡ)n#Zi8(]ހ? >&gibX[v̄E&!$TV=QছH8DDZ޵|ÇcT\&z9<^se\u$,~:g=SHHap^q;B6\c[uqy(u@0LFF4j- fz.FzC>(Z],qሢ@J`nʶ>"4Fߙ(?.牏?߫gz$A7D۪vc J"H_]syċB) H7+;,$X# \\Hlp[;QP !0j[s}Ah {Ī/F?iˢkկ>A &+!թZDOo߃6:C'&Wh"z~HT/KD4/czJOGQ 2TǦ@04QCC&tU'mW-1iM~@ksB3E9w'KRพ' WS0G'??ú}{q_*롁6o]VSx&<]cp`;v<(2i4ݕ ÐP($:xhTFMQLWVA"sR/hJeZDb=92,iH$H2$iL!ɐg@'Ւ{ۺB`e@[ 虿UW?c&i8 .[y}_^X{Et#oԞ=p]qy;~0R0Q!j4m;DQi)fDPQȑ˧q[ai^0  JrD& N 4Bp)߶sNO}5sKѷb{hRo+g |6h4^j~dg>}+Qz_0 E ÇcZJ:@'XhM\*%␕Je tttCu]R 0 ( +h`nZP{ؖ 9%ʀ`鑑')e//F"̤h{*a!PqߙztG/QOm4suwu~t;X"D߶zzaAhmYZm'꺒l*CtKuD im2;w#Sɤ,jA6CWL&n_K$RIv],/iZǕW^:. P_*N"AW~R.u^r(Z 0mEG7fv^, ɏ| !ڻ-wWaiw WE)~yOn(/]{/Nt= ,ƉݛJ۶`Xj(CH&2yghWT&#}AbzQ\iٶ;ie{.Mnyx ]kӖf۶tw. Q2=5BAWW +=2VB)H5Rl.Z/!p-ѕ21 uyki<ߺsN'>NIكϖUAz! řȫw? {`@aDhJݒt&ӢWh?,Vo7't]D%pz'tfIe,+E֥8 yؐ&99'ŢLc߾\?a8@SNm`m8 &NjoviZu4غub1G~]ܳRG 0"4(28шXʞ.;q@e%4 !`XGG?=\:(pVy7mư퇮IJR2ر2= q>D/.|Ko|>w;jgH?Lw?CJ,W SSR`_\"N37iLOn3@2"#r1@%qΖ}cd Yoׅ,{{M0k1mtI9&:T|@zvt :QoiR^@cr~A؃Cs&F5BAH"O(I2Bu qcx{IA*'ZP}y% k9 bF1%(aU'UH_NcۗVc!nz m6+ik/xk_KyA*ZM\N1(6 ΋=(äKQȱ~ MtI-0ĴnU6>ʪ*um(#»w/aݺT S-10 |_2l \~8|s_qo# #=DF;^S^JRU\d$_?|5/Bavu൏p+(u#$}p@a_wVJLXgݢR S\{n7a,^ާH轪2XXWdFQf^TbhAB $jǽ M /7dֳz羞Q091i[H""L.{v=2ݻ/^eXk\yŷeͲo(L?\4U.S;4 ҩV|p(ƚ=iLӢR05UdAt81CPs,0;3Ticxs4Mp.B>2p}pIb-ݹyǝz_z1wNCC䄣OM羙{|>?h98>~'f9!y?>X Q_|1]]]dY޸죔To f]3!c!dR )I[ I/f9|NDŽ,AqDL (Wρå0 y'l Ҡ)܏pFɵku!%xEǠCΩYjnɳ xzsI(%8sl$yأVۇ ]~9+i'p^MA -(fP0=q+>hd.V\m$1Ij:2T 2_¢|GE i EYd%I\YX _),8{ϩ Gjuk6x(No|$Q, zzzF^`hvb,Yy18iihsMxЊꋏ4sKwЏ?^мB1JR-iqvl#RtuuR*Rc`qwӴ,DiYmCG|LӔiji(hc"d`&D1lO~att|q}}N>Sҋs>RD8[nzzϿ}D2ـR!,O_ĚC_/x3p͛7Nټy3---qy~zzUVq]w88뮻kK.}/'x"_1gNE|grrRM;3O>O?g30$wˊz(I9zt`${e;ˆ۟XT~2}\ ƶ9Dx8;dE=TDr6Ҿ̈.A<+ۮ#R(SH[LH˪RO&^nd)'hz$"o LT yvA$t- 8{ APiݲs ~G0=p^AJTTlzf*)s`J#rZ!ՍP\>f:Pb|-'CI|J"~ ;?ϫb9`ddDJ[3G]qjzWs CsY΂~kTy+@op90 MFu sW1<ܒAEH<1׭;40L Ӵϒxc9&R\ʫ^.:D9z`U[de ])>- 0&؜7l74G_cJ+ї/XmrD"Km5%vR,Y%<6?$ޚjkgGZG|̂ h6Ɔwlt?mFހ7*_TC׭]\k_?O`@k 8C&x<Qo4]ٵkd24xYoxgd10=߇@W!2{;0eC*?.FGk̛?˲8g𖷽,|?cNCW;7pN/^<ӜrqoAT"J`YPEW}&'ؼy3?9VP L&1 իWϾw1g<˲xƍV#k֬K/\x|>^:Z[[Yz5R)t]D"Ato(g،I[9xD>Ȱ$u)Ҹ$q.I;7E HR(Y=) W mZ@RE$*Sź#$sRi8 Ds@sHh7D{q` Owj(tue0˓"S/#vM8iXBy7 8 9na'Vx[`dWsbhW@@%,  ؈ʜqzMo!TV^> Մn Ў=ۆ?Q~W uqjKx?5smDSc\q%K\0׾v>wɧپc'eocx8Ïn8M +Qm\|GJ 8G5(Ͷl $+sFGX .nH nG`6&1|j*4> J];{(uORO/} /G߽& ;쟏;JeY!Z[,^./>Υy\A^XƱ=b,V{`?0nמѠKg׽|glt|uX ߙݷs9KcgdxJi7qٲu C Z)091HKZTyEjW! bF0/ڬ iq\@Hnqup؜JCC8_ ?8}tvEpQ#0sϻwӧ?GYxy? d*| T)mNReE~B~ 'mo[\y\s5qoSD?!֭{šJg}9~_suױb :,v >)4xO,,YN9>L&^_?NCPV' vBK`^(nnhLJTTě"֠*YQjz$/_D}$'ECuM)\3c[4, 7 $º %#mN-֋Nx(I*xMi2r-Δ19 n7FΣ1Yqj IB,+Ѵ,w'ovʀ"~-3 gCeD@`iRHǂ*TU9?-!(pBh,E5=E.s!w02B28y?sB*Nm_|_'k~񳄎8aaFw*w+Eà̀?svOԩcV8Ï8+":85% + j::hkK _<ܟ{p g˽ |#d/ncऴxsw> kn؀ɵ rVcs0 lYsp+wOjmw71.0!k~}?F0=RczƣdsUjI ͐?n s+s>c&>}a|@ KJߵ=Q-Ғ90} U W# K\(G JRX!z@hx+9f=C=wYgydOZϫG&!pm7oqO~ƿ[ٯ} z9t _w=CjD" [77 ~?G>NsUWqrWOgg'BkY]mLOOi&W~~_~zZBD"}ݾ};isNN;4֮]k^g5%g+*?QH2?`لBL$ ۄDȍLqMAvʓBk1 IDAT{CQh/ ni:eݙ'Հ7 u/f]$\W1BX26SAr,5 GiJK]Vf6C)20& p pҌ#z=Ѿ-f\Ycٲ=E@ϋ?6Ѿ=y󞴒򔱟65M'm%u7{E1~{+_X8OcװyJ@C!rFSOE4?.Iw*ʫzw`63j³y^@ll6NGgd*NRg=,Xs}v{-r9$cؘNW4ʑ9ՇsɇsO3gy:Bߗk5L.g:F̓La~jPv04 3e{'e9}:MKՌT1t, vy7YV4M'hʔR*ڥXr##+}q꧖6 #~t t<՜rz~whFuNu!sgquýwc߄s{ůyG{ciƩ 7… я~'tv]v>[qnFvWCDbM3G'g6Xh'p?3j|F2s23~? +q%b{7'd:"1@GKC:̰~13 N ڳ"?'{jIaw+4xSBW:h Ac*01D>u`3 $ (Q |b6c0P{Yߢ_ߡ\ԝtR)A]zLGԧ=o_28T}m6$ֆ7O~ypNu3F׼};nTnWc^ ?B -8ދj=>r(E=r3ދ?, XWr}}rma vu|05ozBwO;Q5xB3_wfp]kmم#=s@CH&uGѕMSFӮRȕF M:2:1͍w D+.]͢p@77X8>xpx`_B&8dSNſ>B41:;1/<l(߇j?k{CAVa>_μ(4<ǁ_KM|%@@s{aYcۮgMk`@;.f wa¬mކnn ̦Ͷh43XiY;.zzy_etuw?G^=(J)o6r?CTfy9g?_ztsx)|wb[륭!\!H/ZK?9i'uV4Mcy/g崶>SN97|?x^5\_ 7G |%_Wkoqs7s<^L)1C|{#@m r lmȫV8-@) QJYMJt3$M'ٔvfQrz}$ȍȘFCA)^Uqσ.(KkaJLӵwCe3XIiK[$7LQe E5M܀T&b0,ՆtgОD@2W^RaT*ߓvzZ{\8{0 ZWɱG@LfOah Ce\U9GA}is uo!#M *4#r3g//C)W"/Fu&@ljL.ꓟD&"ڵ`qTmw`fĬTa1(}'{M(ƽh#xC[;aa(iHB7Ȥ4MV;gUyk>D[{7J -- t's iR\ϭa("ͦDV:qwmǟw4ӒU9I74&wN>UN'(ULL Xs{5-:3q4MBE[FNîJ>P ·zzO7j@aYa|EDp|wG?BǑHWu*ULv彤Do}ʼฺu4R$:Hv] 9ffWi<1\E)!Fp34l\w<Wxn1 4「_?7x%.[ʿ~_Xb67;~/ﻟWʧehz3^q:??y5jTeZ'?΂ f}.}7^pӟ4$ 9~}K|_/~_dٲeg76opAq?}E8D"t]6,ˢK.W+Fb~A}HV\>Ecmm50T2fB F!!S`Ek;QYtVaZ!nHtKk@IpZ]}S¯(QCHդRQKwu2):(\j'6*:޶?A4=&LLξ5LfR~ T]E0 Ko6djTp`,[vqkF-]FKGq/]as٧So3H$N,cxt>@2l-%|_ ]b)V+-*ϩ&%OBƌF4 |ߧMSy@ $%u r4i~@ύP(>Q>ɏ>6o}[x[]]w:n-xl]œ7s4e`_.ڕ/G8gL|ՙz,>tgpg\0[9xT1.~_~nz"ફzcLNN>k_?nUQdBX-l0PR"â>D-tz;-DJBI S0r m%٥1` mҾj! R]PUu*D'< tUYϏ$t]Z*S&dD16B|N'g|!%IC\Gژr --VfHƍuCq>G A#hR\C(NO@: nT>RfRkzEBbGx`π{B~8C YF40Tt4O3oR)Ԟ=PtϤ+3L)Rm<1{(7f|:dQK)O9m?| |44D  qQ淽LMhm == e:L #BaR4e0=]X,ʸM2 N֚]a/ [g{:;!|M EuO5Ҩ‘ÓAGp^`K{&I Qo4 ]\  k;['&&Jޖe,A#q}Y75;މs{BYÎZɼ=|DԽlktzA$n(@36s4=ڝ݈3O *i3`4euLJ feTJm=q],z\YrxqPz_sNEIԌGca4-BGGt*SY݂=ߓ^'2H7o9=+Y}A|6iP ӀrJ,Rii6l>ϑy{q\+&bX.Wv3=U$1=|(F^5u/:WV CHyx.W1 h[o+Y$_UX ݚiWCCxc,[k|=F0 1PXNVJD BL zx w=X'9mRHAWCTDH^ܰUvBU-n)@8*Rn&Z70aAh[#JQ.I%Q[jTXEa&!2t&&W#LB"#R vo.iҶ$I 0`@m@O+%wf{ҬJ0Ql .UTVm JGG@6Nۈ$luLbِX"FMP0 WĬP3s:_1S!&-r # dZ]g׎.1ByŌxJ!2,v=g bIV>c=}{6o Oqk:n'%#㌎Ψ}ҙ'v:Qjn5k1|50L6gǎ!b$jRm{ O0>ght޾GESLL.͆#\ y8] >yY)W*xxfR}ljhxE|(o/KO@M@<Ur#)/ dVeTР8-FLbT]Z牛y~L@[a9hB@^ʁ bRq٧j&IQrX V{ā*j/YJɘ 4+ӃiƲL"I=_qXeXu<443 :p-J ᨎm+<&Il4(LMhktJEd[SLOM\ehpZNo_B ߇JDG{tP( fq& jg:Doq~s=܉+ACYJ"иFVö Us7qIGRȗgʥ MummLLLyjӹ)l tK{JRk,v)Q,H G8iVA6+*y.njH8JY_9! HҒxycϷjH_}e*j$ohJ7|';aRHA4Po}C8'j3ݛWWwLEe) 89!i(Μ4:FwKn֬I5YD 9Z1t]Apl]Y9! avM@iBA0Qe'T9.dIu# *)BTOuA3Նs/ov׍n#zʛ sM,p1R2)5gc]x!ڱ`|2 ':68LM孨={Ph$!*ZZ@D~vml~t;-rPdϞ1FGPeaT*ۣYojoƽGIlqb IDAT@a&p\eT%MK"BҁxQ=6@[K^x~^x^;]j_M :=SP.@,)J~C B,%Nqt!aǻm M|RSEPFL`bz Ew!/IpSM$./J(2V8CѱP"vnX;JÒ 0Bls`R1J@]Znc8}'r3t"@;0lmYOY9X qn !2$XPD %!T1 UiTmR".QP5 !G*8?{jB`L"Abkhah4mFA7Dr4kJEPT6#fbtue("Uk09Y$+bY&-T*56nƪ L8TŋTjdimMGGj G(]]hmxv+ Q.WYt{tcZ&P7Xp iR,3H=Zנ9z[Qjvp\q}vi&Luh׵Fɤ3Dۗ&Xۍ;0-@GG3dy n[Tj *:aEiNfXVh(oƽ](Mmd(@/u]LDסt, vh87kT,EӶ=t W2FZu ^a&1=A,ctz]c;NEa+L{Kh/g2n"0UIuCx ~^YGY7%Ꮇ@"x = 1iq]&Q&2e[뾕09$ )J_(H奊Hr۔:( X`t,>biChTВNJ6JE&&Lh W[J[YW|WVBws*M,UKBy0GDьJA# tk^{i6McP*-g~]+ @Nɜ:ҨajX)8n K~DH@UmOd/st@_=$Yiu#ڶ|_r%RXt84|iI*d./01=yqZi.a˖=,[…LN1uLJ+d5SGOW'IJ,ZqۓbllbLk[ua͚̟(uloҒN& ,9O5h<(,1 )f=;Y 8ӓ-4cMwW;qa AG.tL<j7:4rC^sj4eLM|!L#LT#A4_cW_g`ېHxކ3;{#tD4BVL&} Cp]WXTQ*W4(x;Kv@VoIތB)t=ybu)nhoDZgI߆E5nR}B'a/Ja&aPJy_`煎eTBqI8@P!jF%o5OZӲRkK`c*GaL*.0c쇢":#V`$mc䜕1j =rnv EPvŀd@AEʇ[9͠թ)Dq傕߯@ A|£` T wv9Ouy%OLíJ EC 4'D铠6,ß"p:BV](}9J.WV4)PR7H21^ q&K+NA2;KwDNZ!i尵˨V*~x<ΌC4jy.hpE`Y&6mA|3D"!mj lFrrhQ]]Yvd׮{|'bΎV,[t2N:A388Dl&c=$I;CGF]]jz{z0a@b p%/@y/}SڹpD@FO,sEqR&??gpo0:"x/Ri̓Ⱄ0IS?>iB )衬QDԓJZyp ٮ<}e[(Te!d$@dV@$ F ;Ͷʮ.WD1emNq}E>n\)<.ʄ>$H/PDFl{%P0ske=775Bw.ɚAt f0/VĢQ+ײ2}ATHӏ5XE$\ Ne{$$;K1ܗ_ Xr -8}_XLPgr+9 J8p8qk"u Jxce30cZ˴Of]}{ڋZa&i2Q6G}Z''cW/(C}.aS[[]q6ׯojynBh4&o<:&81.l׿=.qd2FMFgGl.%k \ix=`<lv{4 ]V]=<c5(d4$%TdYFj8jZa$ a6 Z&i OU~>MWvCe Xij>A9PҼ&20.4ie? RsԼ5y}ZU!C;B0 e'N}h;T1EqԺN K64IȆWٿ2eȂS%VNK(LgEߠ+ϲ]ʥ^ 1#QQxF_aJH{YS:t%O:Cy ."2+vFy¾ 2]JB#\ׄ!nVNS@Y7_6=Iׅ\3oY4$KmT0%^gr9zS&@JdDeg;K-NO$IKKd03UV ^I]ce!q)E9:'NܼywHsX][a8g9>}<%KLfLc&Y2w[6ofg<ڹM"O xZ˝i;85M8%%igjjnd6#"鐕"Z*8 u\בa(ŹBkW}p$9-T%(Ä"/0M9;;4Tir`Q Ӳ\f׼5 !>c 5 `_YOa7E >Ʉ~9WrkP"4@#0_FmVaBʀmI.yAvϓit.р՛"]d)V`.a?eѓ,*,cLG֤qzCCX@Ha h.s.ӡG0ؑ<# jAP ɵw|X|K&''WD+~Fޓ< &;[{&By2LA&L?gETsTXf\5ħиreu.$K6>#-( tRI(Ľ>,,a:,x+X N(& #^u4- %1iיMgdG!#$C<|thS(r3q8*8N1M *vvlKh6}_…]@8::nr:.pE޽K$>w{w9L,lbWcX6q[gitti]jC Yasu +L<Ǥzzt<,  |!:-H Ej RXZ˞TENVd%驘12YJ7p4)(*~3vݫb3yE lۖD!6IgY4M\`Y&eV1fFe<+IY)`6b&eBNR¶ <4K@?s/yk^UHv%t)]}5nTjT$м ;O/ kC@}]Ԣ S;-hVvu*9C+qB(\0i!Kw74I˯T"ou IDAT)MsU&eQy7E^ L 0D>:*Dn' $I$U*"+ǯN]ΕgյPF|St4 }KўLs >ꖲ"fX5hW^wY-LJ:x}*VsMƧeEE;BpF22t^P(h2ū<1 Ƽ%>30tyZG ~ͥD'9i:cv˨e".J{{Gܺk؎{Ztrrm<~|@ۤ(JK?$M2,aiy(Y[c֭ٗ~?|se/ۿ?7EdD]E뱼ՠQNa o4g;:$˧ؖKݣm3{6ubrajq0 "5avڌ!%mQq.(d*"׸ؤIBYY&.T#Y86Q$00Z$a`YR^| C1`@Es$׼5O[#|Vgp ӟzh*`wIt3[]h_vg+jBPDUփ/"_.-7ǁPP`g0݁%0ϲe1 r;>1<cYR%{UJ<է갽Ui %4`p :PT>k3ỳ*X E,Ѿ]PG^Tyeʹ>O2U:9i^L8.HS\yց$}[Us'FtoT2,\Gьz#M38'3Ҵ NRa 錢(feI)>88ha,--P-0:(`4sxxJ 8:zZ˷.s_~_ ͦ;PJFD瓘NG48҃H>-K^z2Ǘe5ͨl5yk^*eޗFdT 3GZY5kD0lz҄ft>4^zyUV Wa)נ% !͠ ɋB28,WD,uu&e.,ިhHu Pr'zmUrN˔ Jx%;y"k`%`^K(K:P0 lOa`xԮS ` .r|* 쨚L909ٹP(N+yba?ד=*9^ʿhfo z$@]#Hb{^ω k2~*˂OZ// i&mԺuk-8x*s4ò,Z&z 2m/l4~~7߼ŋdyN<Dne_ѳ 8ׂJh8CQ( J]9k^׼>}3jb P{8#2ՉDiu;LJٓ&4޲8%_F{M< Kk2(* qEKeJlV0;PS~堵yK2BQ\KR%nDi ]+M}G Hv0ܕpj({L~[r7*St-i(:ӖS2X.³X6nC~`pl?s**r LtjbQl"Jbn"ӧO&/cN ,5H:4a[' [h\'IqEXQj%14$Sq (*M&b];tiRDQ.!S QIk8u:\Z_"N˱AQJqtxʍ_b242ô^h4ܽNƋW~'v_ XXR,,.?*X!3=ŵ]/d2 ec L]#L`gwY\j?;! ӄQ4c\iŽgd4L]jj5(pJ,j Ԥ lfAi tJp\`<ݦ%n"Iΰ>جay.tiY8JL1tbm\ < * _M6*W>kaw<ѨA`\w%cՔKWvOӿ,J,ı{ ^̪I7J=7,9snk^׼S,keqF j-5e6eRaXB+OԍH}0B;_N%/D8O:%KBںi.)5[(ve.Th_h^"2_"NNv.L$ tklK392+xbk{Vne4YCkhP&CIVOۃ*>F{Mt4=vfr"%ԱV;/Ʉ܄&G SP苐J螱z ŐsDU.c2~*5ڠ 0twJFry.'qxxh&N}7җ^_}AaXyNe|qB]aE1WT[q]2i4|?>d2-|y<+0MVVDaDa X趹6zǏwW/c%k-eIg˫l6g6 ^g;+ރhf 77q0r#(fGD!21NWI >z0ap<e2^!a8ö-L,f: f,e r/ua&/RWbͦKN,]}{O`fp4),h8BZ\ '?L5DAɐ8͉Ӕ,i6,.tZL'}2@t!juE Zj5N, DZ.E),(uQZ(%@D y7?yk^_}E%֖$7xReCTSSܓ&2X!x"!׹,CCǐJc %`erlBЗ&}}WO}Uaм@Bgxpi]>a<#ј 29ّ\zSt(vO(L%:dfUaC|P}Qd5ҸŒLLʹ(!Kۀw6``$cy;ܓcߦClݫփc[jsQD ʚ>r< 'cBwajL&)aNK$ac˵k؎a G!YɳMhmۡ ugliJt^ &qX5ip륋,vvN:xD`HdL7yݏyw ]280N[7E1گ.^_/cyp+W6dY݅.Id8gg4Be$IH%|۶AyA922x*)c9(׼,W~*6Mig'YӇwR.FE" cHM ςT?y,&;Նɮ4ʅ$zg@O&7vE~QjP g//"48*B8xHE kB€k3щLzNw`|_X/2XRxBl\ےޝg2Cp6DomKl銀< #>"W:8rNER\  <օ`_g 8!sx~Gyh4B4IpZz&NrƣZ&N HRvkwHFݧ,KWy{lu}GҊ0H {,vєfgiCLg!FʒUƣ {1pDԕ$, i>d)Fes(Q׼5O4n[4ʔiӁu4ŧ!2`L+]> EQrBm!t`nzǠ j/C.&]JZXNp&SPB+@=[[~ !yߖ`0>K2`u$"ɵ}Greb"2_3J ) 4:]A-:]p>yY$T(׃LOtQY>WAYz?UZS2WtN n;ƒ+#4.ӓu8M}Uq SZ,<∍TXﲲ\r|>1簱G,t$ZDZ9:3LO"rqIۮx<%KL¶ ]b1 8:RDa {'(Ͽk (Ux`s0MW689fk8?x66(ϯa[&{w?6k—q]Ӑtlsa`;Yb(0 E.]E%ʐdxט$Cp%1G3n\Ƿ)džGs|LW? /:t g~Ӵ7`0F)8.(~xT$q?oS Ӫ6Eelng%[W10޶ M+_(;ưQbШE,bM6hz ( ~Nx߷QFpHL6S4<ט*TORcEQ2yU?z|1yo["rDĝ !iKl(&ֲ3fHҷiUf5p"e[B1-^@8Tg@QV2rʿܔDTi؃!q2lX~>F1 9XddU~$@G~F}zjİ qD8*qK!"i[ r Q:ë$'.BD˯$%:UŞLCt<"r}0x k p58]G4g)ywOzݥzi:yHDIٌz)_M<²-\3 m:ux$yx,f04A͆O%L&[[kZ-tLhN#Of|wPtpacǶ~rŋk/4Os>Ztu!qbY&Iܹ F YH I vvk>yVpr2G's!+iJiR]V 4Fl]1LC"LR}a1䛕}Pܦd,#$p5KYhKNtL6_]-yeH?# c ҇/mYх: קqSPܩ&!"j IDAThg I.FgE&D}h_*UV8`xڗ !`QPV.P.DDz(LN%e:r߁ϋDVt SދVL?я'2zF_x^t1IG=(rdFE(4V[ge泯npkk[ vv(˒,-^e:0eR% Mr(KeгT^b6iL&M F(_;Efe{,K0 X4xKL3 =I,$K3VVp\~w}&a-щt:$',--8''M%VxDI3n(2K,S^Faufq w{XlO#jWs=,Ӧͩr)udw(0sQs6K]522P9*ӏߡ, JR^wYeaP ӀRWz2l/5+0 BqwX@劒4PAV56б>-Z!\>ߔ(sKeٍ2*PRT.좬Ρs;(+9xW]ۧ%J~-u d{SPQ g?GGO4L$l#޿ooO2׼>e;?<Ƿ/>r. ΄T'Õ\\wU}LJBOj-; ._>`Dq +a^)>RIcm\Ѫ*Atqkx<S-Zů}sU%[/{ogY~5v5WwW!ݙCBBB`@ S=(8>z5ǛLGQeF` (N:ꚇ=kxdzPA}{']^{wk~ϳFƠZ׺zaHbkeN| &S crq]4臙zvlK*b) eB[T' T;% 3F`*b+ 0bmLy)ǫ@nE?]X{̝[€dy(\h,°^J8x@ N5ٴ:, dM8[^Spd /q%,D,8OX4 m;& @cCC4,Uqx^Dܢ j5̬ҌXq7[y׭jjs;%~$QvSx.4H;xX†u]$@c,t@uP{P;IXCk0K%IeK%,ab I5r/wr/1F؍<~Z> )j#)WCRaˉ*1+'#=7 j%@޳E|nͭ@zȧP?IM)[η\탵,RA91Z0wZz (5$4cdAX G3h_aAm\Q_ ]S߂+,S^3 ȥ:%YR>ShΜ#k,Ш-: `g;(n56g&K;v {cA5*@Îe7йE/݃j40_3P7c BOՅŽDZ\WFU.LϠ:Hx&V<}|[{uR.ʲlg"!_(366@Ta2~,CkP*u-,05]PlpUx{9zt/30:u PFV>J9(e({7عsN)qݘH&b\`R) 6lBJj ׶ 48cTlJLMb\+%WsBΤԘmӅֶP7zz+-tgz09I(0 -2E{$'} >_D*-=9.=+cTr3era&`GkZYjHu GbUijt%7F47n&l@rTn/]9-H_,3#o/]0WI4xDVQń 2Ԗ-GA^b5D_vTmĪ K m-yZLMxJD60g'_d1?WBJ$oc]w֭ b 6ȨUz72GhT*ıcl$RRXT0(Tf{bWk%KnM) kXڠ#W>):_~t?/b+(1BtiΒh>sђ,WM4v,+cbb 5Vu|2+mT4F8`˫bIXjɷ?Wؙ&jpkj*7/6n[^+_}'l>gXX]]w'%P M鼂$֙(@ X!wI;ASv"VOBzX~[^#&$DE ;0jyO m* +-rxC #άDi/GƋW-L'c7d{;xTթ Z)bYrNJLƈjh NpL+bL]R+2 8OCb Sr!=*E=*bTR &-OOY] =Hc&6a bYPF_nwu8OqA@ٟż Dw0ǎ* 1FG1vW>9Y~x6Rg{W~X'NZ( il#P +޴ y VˑN_To=BֿK|Jy7aY 4sEbLM/b;.k3v9ꘜOPOPQ;,O:ozoCw71"Cڊ ,8sz-НMvsI <<}!5~mدy-:CGz@ѣ “'[  Cqgz$1>qJLLSߔӹީɏ;h%L,Z׷\&x{0s(ϓfu 'lF]s fގo"w|hmxhz/f0D 2=7ƹ!ֹҪΤ K?D ku:iʳk)v2sCtl}ΗV@DM|мƴ޿\2¹ooNy߾v9H_MPa`$kWJ[/D$ͬb$霬eX<HWfsE)?%Qs0 'ґR:`ɱ]2̰H$_%\݊J7OFIR_.A*Mk%ݽ]: =P>WArda(`Dn[e%6^XFI@].? fa>PzU fEkOH3N; Uj>*_ N<9aZ<%Xҕ> haXHI3A ܢd[1{_KEo;|1 Y\48&_׾yٷ\\nxspYH!K)¿S_3mo#}ŕ8Z/N׽:ГC/ÛތKa[R8JᇚLO/8KRv9zZk O?uO1\~;ɔ4;u DW P1LB>Eì&V/vӘ (Ab[ɸU%h mZABd_zz+ٱ-oޏD^"j& (,0Vk\ĶD qk5D{D4ٗοL[;jf:/9tUJO,Xi>iaՋqc̒$M90tkhn:VtֶPӱӉ[4@IDAP+cpGԃs]6s0y\V]<'Ґ!|*#垭.JǡoVPY:!46l4(%0s<*A[v ~(m^/)\lPL$ʅ-0]?A؜ՋHu" l$wI0Or4ϣ gwR†m,_eR>%+Fm^@Z,^6 .ȸE^B-q²szuNX cd~b}!9(fX:Eۊ }1aN8Lƛz0ݷt ݀/Ӆ8Ġg_|h<ĹY!yNa e *QWmð?9E2;_E# "PP*ZƏaY6gh4cnaDZP"L1=֠Cm柠^m͑*]/Hp\ lAHc3w 2==O |"EÀǟ|~kp?}uzr9 RXl/A`SP6_GkԦTˉ% 8 'qFAZ6DyRf9F`jZ mٔtjCS1?~kqkX<"t(MUKNK.X YjwhH\+G" 2.t0 8x"PzZd qP8 g6@5&!(/apDŽ?&B1R޽f(dLj6!vT6#^ 4+CmQX"5`)yLtyRN@&t^<.,H^'>Г]+%k12e0$*[x}X ?a|>(%/zA~z r-p,4Qu2 =Aύ*R,(>H "y2e-a V4O,^jQ+1==O^?=O\Am?q%;V[?C~y?_u^Ήcp0! 7W0FS( i5X(!rټyO XZ3m۶_H)̱/pʭ6"SH]RI<ϧ4><ںUJ>0_y#z~. inf~/Zp}1ʕ::#(i}сq Ʋ q;֮0FwNG*L.[=31E@dZ Ś~ị^BI޷n" B t2!K/˲ZGkFdH-tkhK;2%{i֊و0ʢc5+iv|uy68X:/fIy˟Yz~K?~K)#?Vc5Vc5.h_X7#>| $Iĸkx某Fl=7J2[8 /EP-@iFH6CwۅQLC0 _G_ UlT=J].ɴWcp0lW)v̐4LBa]BzLǢI{6^3a EMw*BtoaRwx$-tt pJ8xtm^Q~D2~K P^4\-91T &]h({I_KuA<J Qi)럂fu{&#[lk1ݏS6{w7|Gܡo:6(|N!Zw-LOOs`J%>`;brnkVf_e3y<̗|OF}Xw!":ORh,[:Ab;6v9TM'?ٺ 5GN'7oOW]~#k)}7ض}#ǎ$OR(TuH(:BGH uef * LN`؇wnylˋVc]|jCw%1mEwTܥXsVȴ|t lK1aGmYQgL$U4JNa IDATtM6Sbq3s a}"ڡj=P-vnhH&3:ٍ%g:-ti#eGT{Sf٢AGLSε2Vc5VP/Їxd6>z$rR(HB|jEd)`0 a<7FV+pѥ0oxf="MՔrES0B UI,Tž_'2IiKaÉI_G^TK2ܠ/r 2UxTB܎ŷIO%_{ts$%HaCK\' 1G<''x$Qw- oJߐc[dn:W@(P_eTwIWgX\ 09+sz%%/8q0lN,m|<#4Q~5wY'>zի0=糷FZM}89ϾƱ` ,e9$I2c@\'Ú{eZ<.~Pw}1Q5 ^cm6`MҖ򬴚o$Env^9gX)wTXan'ʋV%XϿNYjl:AuZI20AYضC<DzlAYŨҡY2ȗrZF*PI|s^_҅a z:wAuq^x<>N?6."dsXhDrPi9 TJT*%#Nsm? 266;HZ:y[LL<vc} \/D[~S{<5k.ك}mX/gEwEdܮֱEsjϋ6}䒳[B9=\=?jC 1XX" w36:B"R+s,kL,YMVN};tC-tj,)|q&TPIlժ Z@R`) [ p3Fa,W<3[mqEQfp% _&%sfhUhnq+Qjj#2ԀTK <)_u͂w!Pq)뗥졈GdQy:tNE JCc@D;i뒪PA 3@ (GIJ9OQLu;917H[s ~h< ?I,.sRuNK$JS*3 4-cM^Q/CP“0|#L} Ar4bjR%*7W  1|X6vA2x@3,=IٮpGH*yFw52 Ȱz;1炂-K}#ӧp<fv/̤(}a`^ d=fBB5ٌv|*EjCnqT R6R~jbCXP,"ixOSWyˮ0o<o>|z+%|w@c;8ЮֆO]MVe|?Ǐ[k;[0#k-I5>jpc'*U1SgAJJtGn$CY!QR]XQL˄N,*z~O~ 7~,&[ނcR$;mh[ d_KC܅V"KpСB@w`\X:]bAůh1,Kh+2+@AJjا:dDʠ,9Z|3UϐLp\X?F:*9l[mZ@a4 mT6ih|MYߒM@f3@ۏd?PUY@@A1*ZXf \.̂Z!bFPSe?Pz[@@F@ JRKZȔ܌,%2XܸHRL"YQy)(v_ 4Ίy=*6(UD05{U|zqˆYW*UIM]d^MIRP!'v"U屛)7 pJBN<鶞Y!?/Z#^:IZ =#~I`}Tnۛr\H17!Kn|e g'WflLOoBzaQE:_L>qI`t> iϯ8t(vA3G1 Pkbo5@ÐVo`rcweFy)/e׮l\?eb1kr͗41fYXϦT+ $ahҟ ;Sx XBMb25ͣy]s)W]{rM'L{[ojXz}2bfe1I[*/S'T }lz3t?3ZF蘬0cO8R1M#}.6,V83+8½8ᄏCy͛ ږ#I k_C۠RRຶY,՝Aʻ6ON_R\e\˲1:@)C Ef CEql4QrʊreKFٔ'LɭAF*6M'zEIsf=mcՈ9!1± ɸkCѠ$uKTZ׉96qz( c"T4:LSkDBֹ8K؞G>"}~ڷU+Rfk5Vc5V1VГ%ev0P$/8]{Jz59G \ FvtJg!iaŨ_V0J]{CĊ,;,+1qR)`Vʸ5 uKVԞ"*0IѲ6Ju[4%dLI=)c>8c__Km\X5Q9A=[avia#WL* ![>mA9fzjAY:~J:b^o~ZC΂7$+<#=:>5RF7Sw^yE/Xo׿aqvf_6LzG? ?s;r1} Lb1]u۝-Fsj|\$#У{.4"ݷ>=,egz: Μg1.޹D,{cǶey[Oa#}ø%_M:6!ggDw^705k/&34<|ڽG|Xwc"~üU8/y 7_ǎ?ʶ/O7ǩկ_Dp;oEw:嘊2g)\n~hjg,:'-V;5:R(vD T,Az@~SjG3s]kib4 *GaDr+P6`cZS+F-tV`dF˱r4} #_?P\\$izR.:JѡR-Ol%MP) \V,*D5!^s\mQ n|hڲ-G )y,]Xոat][9R,k/OCr_Df4&WjO/B B1'2[Jix5X< ƫDlGqa9!b0xK Z'oG i6T+uyOӷe lTg!_TݝkעP,q5}OV۶ aۆfn>mK"aTBVB)HeR,}e-<SAZɚ9t 9YE`ƤGf§k,,u1[fHn~(K;m7-Dwj:.RVw)h2@G>BD~喳{ܛ^@⍿sV+U=F<=peWP<MؔK>źCղU Awy0Qszw96%jFQ ]C\mYBbbJ̦ gxJXg \ؔ +̗a`c|P1(v "Cw+積YliSnP7nɅ YLjO)tC@!9?+ޅTTɫ!Jy2H7 ZG$C.Pѕ3`C1Iút}ÐDݫAI.3ҥIFH˯Kz9l]H"+&J`%>%ɵnw۾D TO( |/EPļދky3QB}5'fGTgeSt4~Q.՞>*ݖWU*SnVۅvY\sw O \P@%jeǎ GBG\lUff0<|Jn ~W1{4We emIӏ+殻0/})Yk6lݺ:TB/Nٵn H%ЃiZahKų+V&\'f&Xat:b.O"Hyjzr,,>st2>.>Ü=N,KHYm2c:5qǍ?~:%0{0b4#;Qu\'y7;Co:8`o@_\0;ST(200@P@)`H$Kl2Ƒ'IҜò>}jOA cANVCYYa:\d7~QpЕIȢkIDVϴ/F}+=@ uFHJs?*Lt.H= {aj.`nIyΊܧ{Ȅȍ_z*Q5$ naղm[dCM@HG[[X4G1(dEԕ%ңDNevz@:vg+:/Sh-5 JXrT*{\8ZԎ(BlD38?N ەNb׍} f -oi?2k/ oy _ W]%u 1zƒ!k_7*?|P?[1'8Žol7lBlۦXcY V8E,6B{S.{voaǎQ>#RIN# %d} IDATSYf MX&#RoW%.΋Ĭ{X:\,틧yȭW<)}2s#Y%]G$_.@J"*vea~\E46WM4*jRI,EX u2+Y "e_@R0`J <˅p!=dLԧ F{xGCMR._ y?)y u>Z/O֢K<xX$#v# 6$ C]σ"SdIƮ ^ YO:eUI}/T?Z;QKXF/vc~RdS02n NKZ삅qD7A0 (cc)cr I=gd掋z^.һ-h{ dR(_^k#}y':5M͊,@J/{o,uy~==߾^dVK^$f1A7 0@4xf:1A4D7134Ӹi%Ƌl6$վ}=~ϙ?~*ɲ$~/+_{oޗw@D< &>=;.N(Cczu6KhoKyS_>qz˛QOc/\ S>+Sh/]w0_. ~@=\J$Q븬nyvu'޿+y''asm;mBĐh̐ZKg 3z.(hXLDn}bnnXXu (?9pZcm%' Zg83g|ҬɌ=d!Ek4I-ij2O? YYd5NZ's#@26̭ޟ44A;r܎c 13=[\W@Lp…وVv|8:UIzs-IAK2eWe>[ PGarr 6t֤t=lAiۥ z&b,\oκP*KF[" -* e?z\ .WAL,jКץt$}ZcJ@HsRTdq4&eJMϊM'U.%Gn(VXQwEK@(y 3Gaqh=,n$ҜJGO^ ؋471%Z SC)gb"q|ڢ![`Ch+kH>cJM ^%ꂌGzǽnz/dSO?'3?W'n{{x/n\O{`{@ŇAG'?0θ>5VV6yU0z$ih2O`x2.o7q4;T9jz5Jk_k5VWw\<Ρ|=#37Z|'s Gmj9:5Ŵ䱷ãInkf;}~  ll;:&IY&&5p;%.(K z"vQVg&cL"2nI}i%NMÞЭUDDZiZ*B dh!V2+ǐ"<"}K|ǢB*쒸bul67\Uqnr=y\iLMqKrЋLTw(k 0"eGya!L+w> E_bCږҒ\~P)CG!a6/[ꧡ|pjH*x܆;{IG{l +~f|)e~Ujʯ|Cr þ/^ؿ 6ڠUƒ8&v{(8?C po1Iz֐$ Q)i,˰:^7?zؗrm0i)Ib_dGsϙ9e_EӴf>. G0"{nk_esY7ߢ+/~ĹsWHY[?)j #GqN݈Snpow/ezۧ)`nY9w;57z?ֈ++P 0O$_E47g0+T<0qcX1Q)y8 I2+ҸZ>$g۳(G[,U|?Jc\>qlFsPiLIe, QDgDIu<v1֒fInQʡ^+Y<",#(&\5eee}7LgȦ47g< cEC[1F,3dYNYFQDA ?GQ1q' Q$q1 ``8?QD/?:zK2a<EZ|GЇ*J:w>_a M̏ Djpٿ>eu@ 1F=,u5SSc$IFr"ᐭSS iwv8EZ;N|CK_>(YR{%׿LDĥI#A Yo@Sota$lwc;^gq! x! #MUštD[(}m \K[{iݎhl1ȊkZZ)A{eeN5hT );l_v\8ę+UsJŒK!I33`0R* `{4byuŹJ.X9k{oV56Fh} E;ı% iaJAe ==hHE.(AAZμ`ϟðW84fҸ!Yr`]yo]%: \Qvvڳ>PB\hoQyܨ;y 3>IE}IGPJUF")ETdl:hcrQquɢ`B!NOnxM[B 0 tT lO΃r%.mږI=dhR#1-t)o(#p;:e7T!pN Iby}|)2QJʤ9 3haYԝYh!Nra)m)}b՗+- ZS|MnHCe?GйRLf`PV }8.Q<Z3 3l ';l TMF$ԦDޜh-@z d7%"mC 0rL |F/J(ll_#;E^_}SH_8JE[">˲mR6n]n]ۣkljn CyB) { Ӿ1r$ywG"jl [2ۨx9EW>^?Qoa>Ey[{KK zv/Q;16VM>J{> @#ݢlaQ ,pRAZ}g9QP.y4>Wb$INܸffv^D^gz h_?aܮ11Qk; _Xc4R{q??f_<*w&'qjULnPEOc!uZS'YPN(<9?K,-v{Ϡc(ff4N%+W;~D'8{4,ԪP)cK%ўZܞ ;a:Uga0=x:V/({ bKeQ-hkK 5Ge@a)lm|[!o/ 9^DXc >FhC9O?ѪW U&%Nbcݜ!S|* 0qhUp" 0 S$1 HX֧S0<9)N&}k%}sKhk } 5وE/U17QcLau?^󲉸EDewt \4j}QGdAꃪt@ii ǗiHホ!Au\3z+0hؽ g\&آ>9 aXjO,}S L ;V>, žehƛa䀕cl r ۗ(T{ESryD;PLpޔmb*U;MC}ƧeWRfEx2q}r͆d}v@?\<dqQ&_{ Ȍ-Nc5އ \J_A;>S'q}IyN>7GQ@Zsq>NZgee~< 3G9s瞻O^"~_:qws{α챗ǡVca$ozӻʋ|Z-sy&JAբm|nvǷ}{&/9ހ8oJ\2zFV)4`_}jhz(m q*nѰ`*Zba(Z"Í><_j,PD/Ṛ8J%t1g IDATne05f*u:*G W)`kRJe֊(1 G1eL*TJ$Kh5nh8bę\i5`{(BFĪLh4[((j\F Yf!hl_$@P@Q+: d"HS9p@N[V7 ػ (γz?2K^&ҸnEJVpiC&劈Gq:VtGNoE-Qyd 2Oʬ 볩4NԽ%=hJP'6yp̜tnԢ()ٛѳBxmF[?q hy Pq]CH(RHlg |]RaCV4f[̝yH@_V­B=%H)H^x&+0FHţBCsTSpdv 1H ֆ}f~ S^N O1)*i&:<psu:U猂X(eshC͍.ԩClhw#๚+7tt:#|_Z+WV8rdgL&cԪrw}&FÈ p=Su?:TeLx;g01>6~+y/Dk1==wocY3 ϝƠ7Gϰ0ɑ#o;'?/ㄛ7WV|@IEeDIBlTklmmi3>" i]N,Ns4w.yD+8q$*&8XVP ^@A aܧ#QuPJr.WҚ3HRSnV6Ui:*|n)n5J82d$,'q&j?ɍYNX-(H:#*8R)M('eZ5La,,m"N2TQwsJr$=!8+T+0[@҅ژPJ>XP 4$#YoNJ5QpY &fa%QWSXBй ilu+r^0{J(\n1HSi';u@'e&|}pKlJJvE%XNHCCI$ }[u'TM?.S"orh@?{ V2}ٛ,{aBI6h$C-q;g#-mH~"Wr?D̮rАFۿ_[M:.E,S۽B2z ϛcbRs$7VeD,ccu`1;;.;!kO~+uzgrNn0̄;DgO#Nz>ij_r7ַMĴ}j f$Iވ4Mp\]P`du>rR g(G"Ir*I+̀5uю.laeG)G G#=M^'ɒ4q<'Jj٧?VRZ;"2*4ydyF&}X Kv4F9w5SKcv=HS2GhN{=E AvzO,~B$^Оg@Ğc\[٧}-@>oRh2+hJk0`QqKmH#nA~* oǡ8JM/gSnA8,o#OY0I> ʋ1Q>1M@: }+ #cPk ]_jMQ98vOBa|w!mA^2 aۅcVa А! hMWuNw U( jPB3ޘBͻap /\\ђ>t]) Yd!$mEP@Me\*QOD~KE  WHbytJll>xB Wqu0x+KnޘǯMqsg|ʛt+<7E8dx8 )K$I(*@no槙Y^[#OSM9|aldzn4 f(q걽'_ S8V\\>#ۘ!B^[gnnZm00??`9/-cq2At W1LycxcR\m^(TX_pHS0Ѯ.Z,^!q ( ┦_M herh>\6<*>XƙGl bpS;9$QMbLI<74nU5(BX%Nqe Kh6j(ff^%Ӛ C:d&gjca~9_! "Fa+&9\qcϟ nQ3d.V{Og(e({.^'sU |qiaWdf5ξ)2C8ΞȈm12 #CA)6nU>.F||A7#z4 @b|,u$cD zNK?i+tʘ4M=Cv:GEv4`^Ii]$u ؞P)7.tua3;p3mYA[vA98$YI#LG]OAeIZɰD/wd_1{hPB {rP%,R{+ZS-ԧEZdј ͣj{t薋Z0L-jBJ5!oZx n@6CTq&wYWs&(cA;abe8 Aae`Qh\YbLtjD&8@f!~ʉFސ0̙4G#:!7hiVVvray2Ap\]߯pWi4k(SW&8qb+WVrC3]bffk7>':mc%Š,iz;\ٴcZ&e9Yf2\Ei47$yvkڽ:aJ Yn(We40qH)ע! uW;LO6gPATE\&rs\etc4ZH9#Hs Vp])eiEf `إx cKw H8Nvv$6>V֨S)vj|_ȧTAf{D/)a@q}8U_3چn.b\!I3^[a>E(c_b Z2bm9dXj-`E21K=(g(}yPuPr·Yi/d(MAav&yX8 vKj V= [˷J[oWC+i{DtBIw PIdci:lNZ;8,a󚈠uMƣO@gPoŽ\alJyP=&NL Ҍ!߅C{H'Wr^O`ޫɱ &5VW&<8PZ N~L'ڂ]c9%8Y\GI7d\x;bg0qcgdy\;'{X/r2tnj]뗵<۾LD\^i7y;as{s񯢴`l4cMڻ=U !ymC5F WBwx*c&K3Ҥ̱c.ͯdK0,njߔUB>C/Cp k Jt;Pf}tA.58!Blą ^ SE\OШPE~G LL*d쟣oȶ,\4UBH}EhGa}["6yXl ( Y;/cz.}\Uj2m -HsN;m[#Son{yO0i PCȏ ]FqpƖ=w<ȪrtYR6ŎS^ 2I8:G6nImcey; x#<7qe ZKXkHbp]MQc8DI&Qx 10m15=k ,--ɛ>s0lIfy8ON1a,bZ9 s8dOx%Ee|w!j v?y}wuzwA\㳟*;e jph_/댏X^Bqn+. (fcpuh]% f3# QҲIBma%09T^ &vC&'DQHr _qD8[4e|Dw+S@oฆsj,,a/#otR&*1u}K^ShPV \("Uk6W R* .@-3u&ƚev4jFفMPP4ccTƦhUh4}G4kD^d< iV [l$=_< נ< .Pq4F+Ag B0XѺ%0ܲhCPtC0ɾ[߇"ܦ4ģ - C"6&a"T<֬ж:p =F@=2}poaqmcL^TNn> ˱ͬ\ vAw%䩈uw3\ )3g`Kr.Xt\ۤW͋)ɠ1nq0(K0vR^c)2*0yGS)l5u׳n2ݤuru~W$g{{@ 8Pyb ]4flAe{C*CբTJ׸<9,g}cn/f|\RSeڍuZJF)ACwSIL2"KV/gks.G}ǨWLiwGQSĉ90]z.+8ȑ9JK?;l6X&r pEj7Emz8ea~6I⺚<7aTD[+a.TdKQ9DQBC/$Q%MRT.8 \/\.|e˜(Ck뺔|HSC ߳F *um UT+.ZEt Gx>-82QbLB0兮D4'&qP:UhVHˆ&dqLgơ^k(0<2,Y,4$AN{grj٣Qj84bhTj ߯QkfQ*fylf!Y7,=~\fSm˒L Ā g$F*|qrc' Q"$"M]]psųZ j ޵ksiƹ&_lnl0`QQ _wOE| 8;.M+ AqXW徃A1pg#?/y^Op/'ɜN== CiOYUv$DTY횠*-3Ȃ?'Kv~('Ү,~S;uo ct $NJU_?qUؿ!RSev vV >kZRW>z~yc'>6&@}9 ۮ71ݝҴeNNƤuM9GSL6b:[hVdg;hݽӜNFQVf3VVr5/z uɏ|O嗮ˋ_i=&F拂0 7oާO>d:]rUY+R<NmN-c].k\O^=VyB IDAT/?A$2WbkcZ9J)_BdƠuSұ\R g5UYc$EqC4 ( &2N@88Zp+1MAcd9VG)k$e80<֤(I&I2vh1CWT'Gk35qN,Ƙ.U>N rN](YY0;D)J'Y/cEP~`PD2 QM=o95acm̕)m+?b3C6n{vHc4~Q=z:>Аu$ҳu1G}:&#G Ayth#2yBƨK2Z?Jw׿k{sq2's2_4`.n^9 )}'0yVi,~sE$ɨ> P(r[$1g\&KqA(E~+rŽݕ):_H2F?̛Dڵw,˙DyW`r◰=(1++1{0ڣyZw䬰m!2ҫa3wͯ5i_3yPؗ[lC}.O$ܑ׋-ׅ%9 ^HٵCq싐tv\L `y]9)d&R?|^o7`{Ý)_{w٭#34LJ@j,NmWVEI.1R.<_ě;S3>5f4/85"ubHsws&/p[9>^zO]7oŗ_yVbxw_9y>?_˜h/ EÃc:ꗞa{OӶ|m.^d<^/QQJN[gOq)0F Z,l6C)Yքm+:C:+VI2hx)8ê@5{2Rʶ&%Ӥ =(4MQFᒄ:Q6ۊZeb oH]wR$?-M-Jkb 'L91$um*T1Z3 FFL o) uC+yc u1$@?.Z&*^FFNЩ"9Ŭ¤cZ-p$x23ੋI/mjٔw`=&}h逄4k!}{܃'C(آyTϥ1>VZ~n4_߲X,׿%'s2'3:_HCi\HaU-9AXlS{EN!XJ4aKzk0ہfF8S`aAS1b߅gpN fnCss@R$!+bZ&7sb. X.F8p#Lqp<usy_{ [e=#rb%^ iW wpSY f?o( syDi/aAyT~| 2TA%0 WuيF]^+~Bu"{!xmƌczW_oWw- їF$.-n4bN-m~gNs^9o8}zp{o~R'.7ȁC.]v9=nٓc3&\>ɍ!ǢJ\Sݥ5mnn$"à"3D31=K0 UpeOf¤7/PZsnG/Z4RK:*uQc_"**Y놘745hZI>6 Ħ%2y?1bYGbèHY.ۊR@rꥢiZ/U]RW%U%A9F#2ʧf9\xGY-٘ Z`XRqp̊pCEUk" Ybr`SJںRa07K,ODtN΋cڢm+%'K*CKTcş%(`!o^__w~_{=o/ɜ ?vF QD>39 瞗¯;pe)k*8I5,ݤj[eԥ=Y\XEYK߃A) 7~[UT V`tRira0ƛ0>;v.](uL**/J%p]kD*G@<*b|:Ů`ta-R^W/l ץ|gDdp6`;)6`zv +tHn[IpRZ_r1.[AۄƃK,^o}G4`Kjg7vh}K/sF}󒶭%J.gƼSܹrYqt44ae[ጺQp?|Cs|(D_2b QZ1XgױΊ&_|4%uEp(-"F64m#r+4E+iG+Ì'3,+δfg^0,Zp`U q0E(ᣤ]UAU4m2:ʨ@T'GA/(%,ɧ7,%Ųdee@YdMI p4eUKC(֢CC#Yj;-,>qf8=N;T:)beS-y\W9 =cÀx95+c6cIЙIbq6S- Ԣ c,m}$|L&LJgE'Lɜ| 9 է*#@(%c%A)Y1oSaph'ދ\϶ϢkYP}YNYUa B+k^mY V7p)aұegKTb`=!1T@Mۈפؐzɢ<~sbc+jVސVv ;}@5TY|n$Ez!_ }X?',J6N x &* h@z B@,Rx4Ϡ j. 򝀌<> 41$I;x7K÷oq%д-U$,=`#~}Ĥ=guuZ~߲gTeo8˹ ,);w!~+\$7?`{lSOe*O򌴈Yx)})Y`mv )`Sx"KZ?'r?>%'\ZݓpEkM(fnr ik{ M|&A)8JB?ܔ[wE1݅\'4*ha[tFo Oá½0#Yc-R9vlM_'ԦxI#!vU\s69l ~ 4HxO+[CUn"GbA>gQ_ܜtgij\l\2? ΟYgpt``-mk!u M,+ܺMiz=K2]G%hS{}ъs7y+x3||&[[S|ןdXXԼuƭmV|׿N`p o/QJJ!2Z/r(яmw⭺S-'׏z1&5Y D=\p0)[1+ˀp0RMRAeD" 99M !mvTTI.g $IDniH:K)-jGĶXms:aV7m A=e(RLMC"đ-MY1\l<(G*l6둦ܳݰzF4uij2O\✣y&au`hՕ5nP u#KR6H+G )ܫK THF1m:?FWcJy!Y?INdNgrRY`W&FLݑȇ,m% Lm-+ţ8% 7pk]Gđo|U$B`=.T 1?bWtN_z1&fW6컰nݖP.`!ֶDfvp[Q J o~+ S>;㽯A#kyd\2 <u<^\t=H#24Ja5\#@S^p]_| IΟ\)f{ RTMEj.{|kRMo=E0D]w1]Kǎ]K/}?=NdNg}"Ve (\4;)y|ևT"SHuV UiEnYR $}Oa~_*#r+x<FO ܗ߼$5c$ȟfyY ڽQf۶IpgŔ]apJ` Oh[| m mi~ݷU= 3H(+g3hV`mSI OO蒬]aUv~UCaDoVkx֝,Lg\kPW]tM_<#@-Qjc<' dbK?%u8ǿE^~"NYY5]ۥm=6qԵEJ9ց(ze~H]N%ebQsIJ>Ob Fix&5<`{7:Mi%HxB }{{s̑UE"r6ݏs|\Ԓ~G]U}t[$t*;;u{߿h7src :Å [k;|mLƔeʐX_qY1뢨ʒCv{h m9~ޛMӊs[̒Xr >Fx7ll8m=I\σ=S5&hI^I |Yq4&~QEC +CZ,L쀉*" Z5.!r$h$I X)˒,MMMpD(qV"sU,s^qXF>xOUf~PI*C ć,uL&izyOkzkMVѴ9I0&'`\ǶE$fӶ(! 4B[d)QNuZoĀj}]I Qɜɜ_"2#1;Ptޅ[ķʉBPB~]S,~F+CͶ`р  Z^XTSxR%TP߆ wD&T^J^++ 8V/m"4俷,M!F+'9xX[~B؁-jYy9X ~HO#i35 bԱk/1]nQKmXwyJd].u&| kg5X\7ĻR܏d5)kZ]ޓ/&L )nCCvߑ/&c;W0G`:/52W^81Yʟu)lA?#g:BY60ǧ+9eKR ,hzuI</HSCߣi tV1~ g/sO>y9;o0t㘌&DQ60pAƊ٢&HUb,,K^4l:C2oi%($Cr.s%HYsuY6̈(M n(LJD!>FB$Jὧ!*uǣxjU}d89N< A%D!P4,>%Te돹1 E8pbM"mKha+ \ޣ$XIk.և@TRhHCwxepi HjɜɜOdYTepg$GF:/fw9^Ɇ0O쪩Dz^%?6)zCyZdA^ٍCx с%Z|{\. pO]eY*kp;ї== Lg~_\VhavSL/mhx(%m8RJ1p I=/+>JAɡ)M퓟 ؠPھF1 KZ̺+p| Eh'ry2H1}a_' h=Eʢ?zS: ^{ J'[5 vvkb(W'Y.k"+>m8[s)y*7VHz {.__{;' [ J)c/TP5ZYeRK{[X*GC*Mp^ P7%^iyNCP0& Q}t$o b)0-$#Dr(YÑw$  QIF[;#CI\NW"ƪ1H&gh}KY7!2ehi}(6FR#E-'OڦAeUIq]T XIvڟ(KRiF k͵ۖFA^YI|~Q$qDJF Rl6@%ccsmjb0iFTDkbxmbEY0IⲌ.]a'(azi_WdNdNh{`0hn wxL& P J'ˉx"WKnyn6n^k Gz鮳}Yn}. K؆8bW}@CI{.K{[<˒I4UH)p^ZE;ـp}y޶dGoiQ&또Z@I]Ȟ0e-ޕHD1} e-aH>'"r0)> ־"ךtll>}ؗ QcTQpr2 3^3OE[ᅤ6+P^-\,t} %ēn iQ<_$#˼h7 z= B}/*CFW<{1EcX֌'}._:ǿ_ 3F!I2 р|A(w_Wr>M%kM`L:+tQ'r6p#Ivh-m9 5>âQ&%)a&C@0[*Rh- [$UU{k,mPi',쐤?&X|V=Bhf%UXB$IX3D M{RH#@T,ԐXl=j6Zm=UY@@Q AEƃFPH(^ȋ!H5i"𑆈j[uX+S^,ɒO@OV[b67 m<8CZ=@l8V+t$M%VIOFshcĀ e99 `,?2_z{URڛPe,?bxxԝF??}(O a]M&,w`gG7`a,5POޏ!YzوGc%q !<#gvG-yq"sva Hx^n &0\D?X@NXvqI!`}(iQd>?wځܧb+X5}]RN=I"j.׹rI[2ޚ{1[ʝ^S߱/C<&"ޔ!혧z)J*X:F>ރuH !_4LREm[ 6F/GΝoXT4MٳܸhqJiU4MiU8 (Y]]e7$#RJgRu#t(ibAhӆYYV,yے Ӫr 6aI{=h %.X%9^.CThmC cZ#pLO)$UEPQ佴/ib)5i]7ҩQic-@D4sG/ T4 x٨%ˇ@btZǷ UQH{$b,Kʒ4D  QIkwh[TKX,w5A @ S]w`c,~R?!NdNddB+r>8%i#BVN+&OmAYg]3ȇ`Emμ$46,TlV?ZLkW46`wi / 0!jw ~ qe='A)d ̋` \9`㼘}۱+{ U 6,Gua/SJR@pUY]<Ƭu v.w!/ )TK:T?9rS)PlkhC=PKہG%$UZ0' l*IɧپP~qg΁z*;Kfc6Vugo/'HQԸ1VMCY.^a:++=~O9:Z[gϮʗ.=4QLV&瞽L,w30TUlݛ3Y+_~#6-b-J'l'!p1_W^uwqvQ=L&޷b笤 5m$I} cN+Lt4aMnMΎISGI^٭-vɗ%:lo@Ж$Q4匬&T9NQ,.5hۣnڪ&/[ưV\& 8Ӛ/rSUs꺡i:TtH{Pj\2`%}bi2Q6-yPTƥ,%`tY|+EgB n#qeIRY@&L[CCfXJ@WPQKP]Ib 4$ AB,,^KKXʪ-JZC lNQ!@ <;$ 0zV:,Xb3's2's2ISCx$Ƨ2|(q4JK4Q{eE~#ЀB/~N@O?~Deq|41xYOa~cŲ`W\8e/=);;GLVWt# KS>R6OMmC/˘Nmp>G{}ÃcˊOkHFfΥ4/CA؁@06eYTܼ}/GDg\֙UNS .qܺ8< Jֲxm&Җ-+Bɺ=MSSW%m۠,Zc >=JD҉j2.ՒPZ XYCmPjc8_(J^ǾQZt)JwdA|",C'N7{$[v96Meko[؆3f8bd"gM_A&dB!3ьDjI}rYiF4G MT}ofsvZج Va\=ТF+(pc8h \K2l?'{_7G #@5 dsld.E\& .ߗc\@f+!kY =+sXVOɏNdGᶇNԗ"| ~,IFpWܬ PBM]3&^}Fָ=cl?s1lF}@an+{|Gj9 ^ hC\p q3?CοɒuObɎ4uMt|Yym$Tۆw_Eጏ>|тgyܹsȟCҶU{}Byk8I^Pw=Dm-rJӶdL&s|-yE)3>xQR7Zf8z- NG}EocMM_JH 9ץ{|.\r) ( ufwd_1zl^T=\4 7BwJծŝjIP?E-貄F8+Яg0#_Eqb <[PO ?=J)5g2K6c x߁OUgcPI\cP,`U$H#w1J?y=vEm^Rt/C#cX 2Ix[ |[gsqʦAɱg|0Z~u2~i*BG~Y&t|_oC~8/;;9kNNq|8ܽw{<=>YOI[TUŻ<&jߛ1眞qxCSww黖[':[bl-wOګ'>%CtK`/SW^=QzM9٬x9NLr7L'T$3VhIMF^|4N&M 1|jgQeE'^|I9abEbT]G?4eI+-nIbᢣw2'ܺ}>Kvo36-ZI\?x?3+1)eM%Xg9`wgiBԲ爾'IQYB9=YbQtM LfSLT)t&z(ʒݲཫF'z޾C t88QE& ZS~pƐ(P~;y?E<Ɏ8ߣ: RvLGۖDrQR)j蟀)d;I-lWp7{CeBRyId] u3qpP{B%>p_@cix5NC]|=CmoVBsB6Yl[CBD:A-8 B.0 J]^ˤÖQm`s#=lVeͲ t[ԡo`p12;Ǽ1c+S Ċ6T`P2Ў"t?ϋ$"@6TbD>~C$-Sû>O'O|o|u&\^57<|645\o*6p|W+0f?#ruY43XIҜOV_sy!F}?~9i>PW"8α;g6ɳGsܒ kL֛+|͖]Bl8:\c8e߷E,KY,87H8&<[lJQt}MדBER&XISc>9༸R tK4>Trewb>QJ(NݺbR䓔I, Oh-&ĩ!)&il4xxRE u >bmJGxRXu=Q 'sBi@[WLku#ʹxͦl>x$В'݂v0tӝLAh"%A -y^/v}i{4C'YM3fM:g2 u%,Im\wEjH>J{b5яVcQ:E(_W5qIN,Kdes?qS7uS-`o4'/TDS ődHTWAxa[;+0;xXB,L6 (PZ4s% 5}p^hAI %}|9&ه"\r!6P& C- +h`=DMC/#t2Qu:U2NC 1, 8N޻DKX1c>vGYn%PXՆ A}tҹC;F`Z]~M#1Ohޖ݃큄27 0hxD۞krt˟!|bV=ֈkLJ<}zE4Z>`5(pN!z^~ J=KwyI[<9W|rCDT5Ip}+y F,VU1o~Uѷ8;`AYhvv&TUja6ae)n؆@{5 yᆎ0t":FБU`bh-恵 $ήTB*sI΂ӻ/LQ ]KNc舲 F[o+O(K`2pމpAm#fX%l* < u-@& ]OYX>HM6'Jkޣm[R%N{-:F IDAT0VoR ޢ$I(cyFdܿ>xB2=b;I8==!1V|r45V'D1 A iF;t/ٝO VkD]Kh,Qeج R}Y5$%+rfIVb)@NEPLeشT(蟿?Zz@~brvB?_Ɵ H%OB[3L7ΞlZtWτw0x) *ࣇϸu=izO/ym\mHӌ)冦$#gqxKY^{X\$%M.Q 1'L b?_E+sXe4cB P$IRDkQ\/_,Yur[" &Lc=}'G p΍;)} ]6wCZM z%Zi70 =Fk,- xO]Uh>w-Of-M϶ihA Xٮ7diAMX]]$(@Z%ƀV4ɔ4^=$".'x yc 6y>Cm2bJ&@YDGIQ mQhBlK0%>/9zrNib2 =, 0}:!0LȲ0 K_|M/cn2Lhͷld8,NK7aWϤ^]I?5T ѵ($ɮz`>G!c`lSy|&͘=͠XH2dSѐ QE~Wkc\-Yh+'P\B5߂gˢ+п& h&\JKRyLB> +uy&NI$(6nKr{_z~)N}p\'@/_Pl9L=P|1:d}u2~+u\ }tCp/{w}w-KnSm?Gl֖ɴ`6,5ZsrσOx-jWч 3O1p}GgU+/b.u[}Ϗ~#?e·{G<{']W Y JEk%(01jL yJXkp4$:g6AdiBtMֆÃVkvw詪 ZűIpfO5XfKNЩ"ism}`dyJ1)Hj{Qd]Y6Ҹ$sbMK7ȴ ]ߓ9E^g )yQ752b2av?ą@9bK]7WL}U' >MΔmiێ4ϙfn0Vspt .BI)y9?}7x"Ze4u]"-n\(*B-.PYA4Y"67jM ލCRٙZilcG(d"Zg/˿|sn~ꯔ&~A\M ~*9Oށrwĵ(JؙVp^ͫyM!lGW+ߖ[i^Ti#FՕLC&BwF RKs++`qKK,|Mb<7d=[Ҹ/SZ lߗܵHhQBkH[yޮ;[&~C0?(ed]+/a s1$^ͧY~+?*@ä2F X_o"GcW7 㗺'9-Op ׯ;".8u~/ɱ7Kyb͋Ks>>f`Ai /;S pzzdZfVlDjqmDf%ՆΜd(}Q i*|=]גm7w1*.M(G@HlBghQ#lQf9;{ Y1zeRN 7p~vQ ܒ!J0(m1FVXTiw4cNc6C@b@Hh"EУ%j!z )ʒjS99~ y{'$~˼]\-/w.כk)j0ְtHg4UdB7(6y)ϗ␥1qPZSL)&qCb٫o бnzЫSٴ=UՀ2dYƺo5]ߣoaph) d</HgSYJYL$EE1d W# G_7B-~ Wfdrǰ$'ds9[ ɷ| v &{pC[{[@} '߅J,em&M8Ak>p>!&?8 8&zr*7E^X2v`Sb_\t1{y bZ)4.?RF}LTQ^u\_z sy򃬏I`KKGzm)Rz 2зPIi(ZTֳxKǭWOGb)b7\7 㗤_1z?~n׊>~_liͫ AquAۄ#sCw4M:7G'mB 7 JEϮQJي$pr":9a>OYL' -C|7_GhꁨhJҚɬ MbLS+f{!nɲL.'њW\V_jy`qtd:^bݒ mCgp$Gr !/YIRb075W%R,)I] Iе=I^2tБ)lxh-}/_"El;X])} >\Tde,:-Xl'餤Aw=i7m ?tt%q:IvT"I8Ap1P%;=IZNG+Z5#mm6Mi{On2`C,--I>|E&ޓL=vmpawS9WÝH'"RvD{a ٩}?T {b9, x0SLӈz)&u+fBJ W Ҹ)Fp"8.$##^ky= Bk7c拣\KH,naO';mC- 0rԈ K>]/:9 O@@/\*(dϬm_@`V\]M]ݣ7OWr>DeAQܻ:Y<~reݳ:Bpͩ-y(qu.;l eiQzB ((˔-Ur&1uΜh xlfsM?8֛4 営{Kq@)EYNZFc z UkOiAbCB3r=Ba Bp+ On ]Ncw@YB6uEj4%vMh2ZKg˚4/&b2YQ{<Ē[z͠:iRI ;0 I'IS 05ڊIJ UQw[IAb-w죍d]IS|N;i"{wĠGw. y-=YobKC֒Zwل2-%f0B;L%دi#Jt3DMeY70}.?+[^tYW :s 9L2MjX% J( 5z3N,Zaٺ+FO__niK{oRW+V[$k\-rrpFY ' n$ FcIJ?c68:hjMS@H=&1N>3bgk%#9bmZ)RMgĐoPC"$Eླྀ6$8%BOvpd:-YVX-&1di[ 23H40FQlB먛r:%b䋔ybuf0>c 횀HQ@4ւ2 #MӰ^<! ZY]w@XTfI(*ԒS/zBTXkVK&`P)vb̧ͤ%m714 ,{;.IKXD]?$iN? m II <t&-KTgMݰ( c uShC4c*kK&@7@a8ڕi6K28}4z.Eqk d~ 9|Gо .` 1a|%^ hUiOd21qvZm Ử\}6 (2Yٹ/sыebR}'2mw{! <p}Z'?߀O pߒǟ}(о?1̾5:]ѳ仐]!89ϴ /taXi60UE^<}>g?0dJ*qZsIywvp\ sžn@/mem~K~ћt햫 xezxbA hLb9Xm{ma(˜ap0xAD.%]c;ԵϴMwcZk5ekQ.%sFͦ`mZ|E91 =֘QxJж$iJ=!x qea'10  e!|hԂNȀ'ibYW @8 1)*Qڊ8FS mq} X1Z9 ލ_`lsV55Z){; c4m`cZ7jMc1:4}GtMM[&3I-;#Žӌټ؈ Z6tRO'tj{L]m6d/N`@Pg4ۊvu-ڈDt2aTd~ f{O,7e:]I8e(ůL]~Y([W+Pqtk88` qrkl( tPܓp ]J'?FsX,a;:Jڷف}zъL!$?\ߡ7 os) *5eM[1~|U;wRh .]g k mMsfoo(*֫t( 2GݛԭPg;<U IDATǹdZrqqɏ~1j^y)D ( ! c461"6`M鈵tF$IR4H1:\װݬSaz"&c &9DnmFksXwIPd1hV_K%Dh=A.wдP `%r0}`S5E4MAZ9IblF mB{ (8~M˔emrk9meZLZ_GOo}e 7iqR蒣d:S]},="\@A 1Bt˳ 3WwXv}'x8:G(U\.7\^. 2m>d8_+BP۞xdqΞ$ߥBP)Ϟ^v_yl24ŋ)b1gI1e+G0]iYeؓ&e!Bk-X!K3hmFi~@D T:'hͦ =pc'b*Z5&)0`l"`) {z K VHSqʍ{QA,[D#aLѮsV&?.Y| &+)ܮ%kGK H L@HћgӕJmX~r-?xh_G""_ P*$_ (ZW?2P3?~K-DMBb#:F2O!?i.db7eha#tq;A-Sf#>G4s;M > 9}wAy|>.xm&mpz5.v|\]UD<%O_\ɏ+Go~ M'>fy]qO^'!YG;8/_%M̐:uG&l O:L iR4+.:q=ʲ!F\ߋ iM$YJvTuM@DkP*1JdžtEXA]#Q,Ja!@PVB@W @%-&xׁRO(Q*o޳G4I:gr]n y d6md  }Adن €a`$dAräxœӹ+?~qlAOu'UU_Og(и:yE,@DhgskxqAQԫ( !$̦g CbpLep}wLn"ӏZ&pDt^Ҵ˶ .@`h:F1O@ ]b[Ղ^QhE?qxnlp~q!.cʒ:=x@X-~Fs2K^XM[vI3\GWz}2ouk]UH^V)Bi5eYPYLhKFRMh<@Ht,\m[c!D&Ud~A,1VcHb1kLb15JD LF;9dyA8煖1Ҋ~^'arDlFM`jKvQZ3= W=ZӫDb] Z"Fٔf=(7gs||l2`gB[˖ r-02 L2!EQ;Gc?mBQeN `2:}Qۖ"G笖Kvw(^O~_m[b2Ņ@+f GG(p0%2.wYYZ׺>RI܃|f3ڒ퍔pψ6a.< x&Q} N ]Ȗp7 %QZ%>z8&UE+AY_{o4[IDC( Xll} AoOJr9|-Ӝ5ؿl =_DwDq;Q-Jֹm9VmTwVf%\; AfSLˤ#/)-h/ĺ>[\>C(؝49few$0 @y k+f$1k 2~*d#|_>8{-&T՘]vw"ѴmudołA)i[,/xW _wYm;a4GhZBV-QFȋ%^O bk[V9eQ`a꣔!h#FG6Fی^Dr6bwDLdNS<V FΕ|JQTXk \>7z!:Z)OcF! :.BGbTX[`IT% f{L4-*3b"QT[qz6e }VMےe9yVR%*'T~ YQqei5씹WL/ιX4ɫ>y)t˄>l[]d>aXqﳳt2/x7$A(KĢ@۴=:?%-, b̦Src 45G'x穊Ry6c4{k]ZL•JK_ST#~3-tq +8啸m͆"Tz0Uɡ8I-=`Bڦ,T؁40юXJeORDc $g;ѽ#wT ߅z$sm1"X悄5tNpn*v kk+[#mbIDNhqpE-5V۳ {п)ӣ/Cŷfw/@ǔ!r!l?+vx*ԪKZ&4jm8/d?7^?}Mt|fiB? k Ѯq)){ Ƿ^\h^oc,W .GedIUz! 32 9wrxxxx[8:b!xQ8-{SC{üج)S1eE iDbFK`Yi#S/*(At̏L غ%Ӓll| xpz({`r Y\?U`9璦J'oPT&Ƕ8fzAt Y^Dsv_K@M2}̮l$ sCn{q$Pڨ ҀбяzVk^*6b|ʍ*bGhqyA5ا?.eox.er`:_2TMZ[%1V^ ?367򯼈O{G|pAׯo3>еuQIzqN36PX+Z#s1 R]r1(_B~N,h'MhZBhqJWz=)#xk0zƯC(UOB3"cLV7d0KDs8= +Ôqryф&.dQ`~!ۉr^ǐ,'P?gK2ȞLHS ~V c]?l BΙrqڧ,7)M';&6ڤ?YwGh,]xQbAzRzՒUbog^ AdFeid,dy. }D@ksrU+E㱀5+`%94S%y.<1EEeeQ@f1`\dh$JK A)9u(PUbW"*1EV&YM؎;rmP eCQKŀr-66TÊY8zhQEΠ_2ؠs-gae fh 1(C Nm$ೊ&v GC̘T:Ś8j-glqmnj0f9JI^_mݵ(^@\g=vymB'񼼎Fvՠb;Tb9c|N۶EIU& m{_ћu]Z]9d8-g"\n[@IsL 6/B%˅Դ0y(>&DU۔ԎE<_'(NG/ *<.8)E|~8*σ -ءbm Lk 2gJX# 9R144uC\ж$ˇ&eoM#򼏵Yp$T,Y.crVuGu9[j1GU6-gg3l*Ju-1HY|+4I3$W[$O]*MP9jrz7ij\SeZ"T(Pŧp Iآb 2ҘP>b40EE^YѠ-;TȍAk id} X,W:cGb|jY\.Mg4+|eX &(zJ+i&yȈẖUY"GX` NAg ]1R%&**FZ.S`Xƛ[@Gň6c5*w߮x?k` d\QdrBS MXXo2c 6X1=@W7׵u|WJm&9d ޗ{Єn݅oC /~%kPa3(`u pE/I3i͖'Z϶P[0% /du38yn ZA08ossY/LO%VI kVwj+EX$.vtGgŖ%pz PF{ǰvV q dZaYJB&PG`EdP9pyMaBL8;蟂ߖ8t5zp'OdGl<*cS/19ڔجOqZȊVkQb૪b6 !ba(1Ѥ 3\MY4Jҵ@!&eHӉcX,uh^:BS8x*}\GD]J+xc/b} IDAT&t,”A,B3$&# @)%֮AR(JEbj9eoL[M0Mu u6 &m ijT =:FL!*-(JwbKu4Msrw󘳹FY+^^^m֢(3C!D\XMM٫Fc%` h bDkCL~%Ш>o Lʪ#ܽ~\ouk]RD ZJ,eK)n )=#ǒR=+N4RV_H 9"$! U5О'$e2!y4v\IP8z-&,'NHBROބ3r`S'+!x_6pz_-8}З[2cd%}Ȕgc`xMHiD&0ˉu'Yt2uZ xV,C#ǣ2ũE X\^;q%c6q+p5m3aBicJȋ>Ɩe lVM6RI+siu^4Ik"L+&BBl1FZB0ֲM۫r+1y %i;* z$o'nEѶ-Jk"L:$qcQYJx[ y t ed=|bDgՕЗ:%Mu{h)l++GW}f  ȣc^/i"xWJS/k:(y6(Gc2g+꺥*6[@iV= FSze!Z"!1pkf!2m֒ke4cy<1DBSкZY`dkrt}'_䭶uk]?AE5, _0്g4?ar" +pAV-,lN!~Pp3ipH,mL߆k?~Wn"4'"INE{ @Av_,/P=74~o :w\|~!V߅ȴpZl<ߓ ]0 A `ay(` (ǰBGkx# RV8@T wKlfC%9&'1?BUp-~w4jmG",_k.*^!<.tx"6 QڠEi2fm x`!`w_$1`\6`M)q^Y&@$M0.E]A4ڤ4CBK}s~dA)- 8OvdYDp ͈^΃Rd)UΗ"W=T!FEE e n*٬JwsOJQۜ| A5fE/SxY-PJmReſ1Z,9EDE`>^d&HXոn%ӊdC߃ 7RT:Z#ty))JE2P>袼ƌMbH׊w9=/y,s?^ֵu o>JcʿMفgB9a ,N9 B N$(÷$toIu8{$i[pm8[{MwrGz-Q\tkfSw r_)u[iҗudB2$۰&9jȞmJ;Id8D +xX)\􍴿cVfimA&l\iLb?/e{@+@IKiFeyp_I0rm~w2|Z5X\U?8IC)7y򇐶m}(%B֢sP>*mGC e?m QWOx٨w]RW`״U ͗YfB; !'@ۤBDJSj6V-*L*T!ye:G>BMP7-uSJ68~V]^@hZ:b#*.3t-Q1p~vr1R  4Ղ6抢 U(XL.XgV3wx&˙=ZhZO00#M6XK룬IDѶ EsyYMb 5j:\. >xs Ql JbR*G+ym/ХlAnBk(z]Koɺֵue+<ZxF9LO;LD1\Vg7`ڣ iF?zoA [28kb3= ƮL*&d"B_ sNe?hwwdҝ!\n_cSc |X' N5~W_[࿍h$g(8U.r< ߂}9/p!-b[(h]l2Չ.eOQ\.tɱےέs` ؀o~bW`^>/s,߅+rރzu>>-uyǴB,h.Yf#ԡw{,d#TAwΥP$^-]] pKXkɼGkNhE r#tK-Hظfi?C(VDחCcRAʻ@>1%rCuEe5|MV>D?dc|vz?Iumy^`LB)E׉-i#!8UA$t:PSѵ;sш꡴%/KrM*2,Rd *CB,#Vm P,ȬQQaI4y[|YDPRhMq5(m-[Up2^4 M:*Pr1pqqNSp+s.ZS9hNS%<Ɍ!kȋQׇ "vWƠj0*9yQP%UUa;:Ib (z"|mP]F:wȤ:NӍfIԸk]ZϼWD8IL`t]Rcg(]y f*d["gǢǘ'y͹8GybzTIC{oB9^o3 e&ϥAVwDWR~FBn" ٽ龻<csz6(j4ڂ20k;w4s׾$40P<<܇Ed]V|'oes>o;ߖk4?;ah:(Տ&2*ΦڂD}Amǒ3xWL_^;?dWҩ2o]i}pؗL, 5V3' Q+x6c,('QRUͲ+CLnRB[ 1 yj*]Ѻ4(6Z)LQѣ#zET.$d]k2Y͂&nb˪sRf-{s!R%p]ucqS 6Yf4MCU%ǧ4*iD>^NXkY59tVFc1Z@[YbP֊]lD%NKN1+ !(3Rd[&#fDZ%gg眞P%;;;lmnR'4)k06jЬƺֵOCXq:|4Ikpz,koIpN_|$4l5VB7$0XNoY-io +x,x"{Ft+@J+o`t)l, od5LO`4BMj^dIF}.My|>My5ڤ!IaZ߄o -[q$"fO]pN5 nJFVI`%Xe4DKhhyUxksuLrSeK(ƂVX1HS i3q/h]e\ދ ɬ%xOf%s hu0f8'%.@rd,`]Z׺>S{_ h񊌥pda,Υ5dC+y\X܌ yHȔcu!`RLKz[~ʇV0V'tU8 ځ[_we R_@/ 4 &:Jo&OD10zN(T˩8Hy \|l nAQHf/JY9(-`)MxH\ybQ[nRB:;`yN߅P43mR(-Y}yL2Zz WZU+u,?&Z}X' #BwFr2ؿlAƺ>}&Us _HN>ѧ/ BjcHM1byH*ڨ'BV&Bte4>P`HRS(N!qe%i\8؍)S< 6X*<#<DYAbK:TatcԐ6t9I!FkӤF.~)L<Շ@p*% 8 E9dului!9ێSZ\(L(\YF\vMд "CkBYkF@ {!ȍ7˱uk]?2{`Ay)`g8;JnۥL5^X~4y%kXVÉo\7DeEHSKr `v ں%!xlߐ7}3 +#(nshIA~G'дб6BnBm]-˩IRS3X/&Y#W @35,cDSh3_ ?dه>/IpP#)WE#Ag=(%J g9?t쳢@%Tm&t+Fs(HC;Yp|t_hSG_O~ǒf^ϓU/qo ˔luk4;wHBFv]#纹/TLVNh4I[r򦀐_v*4+\_I׀=|>辋OVȿu|&FuD\8Jӏ%T֚.knҪeS}I_qO?&~WݽOeZ׺>銝&ʛ`jldI? F\]vBY`vK6a ԰8?Oşȇ/ 5ZT#+]H"盰ZJsIM+ f(n.YN`BkW h ,z")l Hy;p6mG[;Ej)%<. $cPuu[!l<'S١ږ _F6,o"bm4Ɋ']Dc]׺^ @rX@ |ˤT@:S?K'_?ٮGu( ~u%Y׺ֵO4z}XX\ٙ4 VVRKXUv{G@C5DDSZŤhNKPDV; @[z?'"k-qS ^,[U!ꖀ@~ W"͛B}C7_W|챸j;t_@ 1{R5}2sۢhb[`HQ |2mpd96^94PMf_}J8m<&2aֵ霥ѫV$}H6 ^?0O c]ں`\>/݈5X׺ֵu^Ԧ10ߒ)a'+c )-NQ4Do˔ %r-HvZ(Os0+Bo,bISJ5?&}h7eA):6F@3/p7y/9%)| oA,l_;]Vb[+,8yr,ӇL|'[IjyeTd Rib Sy)ᯋT~CUe\LC[)s3?#qs5Irֺ!絿')_X> Z~S>F>/S}I?RѽF׵uk]Z׺1A>GPDgLeU~)m0t5,п&6Rlf}ɚ?x-5NVykp,%: a ${(΁We6f?iKYs Vsxh.oʼnОK *? ˉ8*ud L=S}zw3Q(T/mVt"N#\DPw25Xd9ݖS`0O`2UPܐ,L3V\6z ïe8A- IDATweZ׺ ?Ozֵu}jKI.K^{!K_3GvKV]D(ݜ Mg'&PtoCwfe޳sęǜU((Z-w-틆݆_K lAZR,9O9Ṉ|LWV]g}~6"cPk{O~#~G>%y >TwaVv\mU0HvղULu/'p+,T uY JuHBeMϫvM?U (AFeQ(/G J۾{jK96Ωf6"};@s?O#K]'I(e\DA3UVn)X)03PӿNRv"Ceݛys?k="8=Um߆{؇T`e ^fƚ~20pCX{>J cOt_Z3{e#9> kZ9Q[! UF)Q=~m% _Ez1"+!NT2=&T"5_ pGnۣGuKjYCᅉXTW6$Q[] T6!@S U7lqL|%(k#c֮`vb $=@`jEoy:T"mQÓx]fa'7X x2QUc0@XW%(2((~WϭsN!zfU2nt7Iǟ,}AtljHy>jKotWEݜv03M]{U||svp}MW\q]%ӟ߫=ÐxQB%:/` %[pq*( CqK^hֻچ?g:3%ᶈHؽSo*R[?֎(ܒc ԶTmʐ^ڊVޅ?[S|jk0ct0wZ{A0C9t7րR}2mU{sub l>t ;w:?<_" LK=l\|)xUA,%C6a>'SﵑT$KUT'}85 `L,  QKQFeQwy`sJ'DE13bf w:vwbis8p*q^=iqΏK v|ߗ~wKKXqY0N3~+>w:V5֖4ɧ8Xߔ2Q\;u?E[Ky+t.bB@@ށZt6g )= |.祉8Mh%:Ntq[ !Jسzƺ/@R6ѵzۺDmL7t{BDUs:cM{V^Y`=V9Y,<ܙw>WbW{U%X{M a2{>?}h\Dft+JKGE6%ZΟ ~Hv:SX}FzJ=DסwF۫L6ܵ5x&;X@&=$=Bbr&ū9C} ;纎񅎝=]k;Ccp<4n9?o҂3a :'ظ heOM9mUT. CPR3+kAsMՔ 1*ϑ⑞sX~~4Kp []2(24=)*U3Ԗ4kOf59;{΀fڌ&yiF'-Z̕-Gcʕ}/hsoڟ~A,-R<"3[7wPy[pYTa U8z]U#0*OZ@}ZjkJ4ZʚLsh͔G{>㉪I G2}c_Y*o+)nmC%m7 T6`>йv);BLb`6t?^Q2(2cB-b 7_f a}JyK6&ϫa/˳nVX`̎7:̏\Mqn-H]@,W)߳*B#>o~1eN@bbaZ[̌|՞5T2j:?k랞z{_+7$c[m|9կ_I.6} RjXW6BmuPk+M\S?Vdz ʤϾ N\F^!)֌}gˏcUhNt"dGjʧj*UW lj١ܖ`LΞ8~-^9t 1d'נ u @@#JT jG*eC* iWڻgV\3?z~DU;0r dQFeQvY͂ml[-W;OB-JK E p湂enȢ:`f݌<}N\?D}quͫfQG{yl"ۻK۾HSh+%σQ!E^up*G kJ>onK9-2kMRI)4 lґA\RPmWTVW <1:D/ShߖS'G/ O>57"~ީ*!e'P݇H L3dOZE&&0ӵOzj3L/po@tGSeh5U*&;7R{Z6&Ѻ]>d%C)Gou=-)'Pl^a2(2Gtx6CnM} Ŝ0=gEVVg %cpPX-_fpE69. /]hq$%phDZ̘+3DΑ[KnsKa-'tlUQ5gqnk-}[uk|H滺Oȥ%0>PX7 G84g"t:È1܆H0Jr2+ cp$-*ƞW>n8>{-E ԚXUdvaڗ,kx#8D8up=%޵Tv@.AS#~]RXXLw ]/ y ?@뎯pL`tP,zM Êԡ~$spST>HUI厏ĽIGY1L>l߅zXmZ7l* Sj+}=KQFeQFs,RhO-? ]KmE y~Ɣk)r>5kmZ %p6)D6^j䜗] -Z.E3^$\y5J`ipwiOř8hM2%sừ^,{R5غ!S7PNv'Q[Zv[ iE(E s c?J`gdλ#UX 4֥tړjU5| $꜃s @mHaEJ`ť}[KD`^ӻ/C.B뺯 h@HI6!Y980 Vî$fēzDLnF5)4_.K`} Y_ < og`]@G_i&Ost,_*[:f/{T^Y2(2cA^ P(M6B)|B!W‚ИyJf@֑`wb+3-W [Zmڰ, -3T&ZPJ]^^e^4~ c+Yi"kK*NUz)]l"cjcE>Z3?:UJT<؀CyISUpacWnԣ ONmgJ dW_r¶S}!j[o@|+ccc?۴-'} 6nI3 ERVt:dyŀ9B6 e `Ɯ&5\% Z#z}" YlB15:|oA7\Gk2~KM\2w݀`C`:@-;cXc|%bWվcB LL{( Xc:~F|p6fdx@u%Q"~c`(YxM 5`H* 8!$m @mUG3m)tRB>u6s9S}]ҨE;߮&u(&,yFxdބ/{%tƬm}U$KwҔLC܊G@5U&U}ƸUt]&x-v{Rۿ(AFeQFe|16ٌj2+qf=η;( 8>L>[wY֛34`I[YkUhn{sppP'9ggJ"-ݢj,'JB%(h7d 'TmQI8 =ec{ň(]ڝK#r_ `Yv^YWCoX}™0}jeHfK\d^Ukx,scE-Mb\3hH+oa=x| H ~" hux)|MRHX~5z=-mWɧ0ބ;0\ՍdW,"c:_Aq.$;p:Ǩ+tD^;瞧G\Vqg#I`WRu%ن| [CFjJ\jϳzLNΙT5= "b]MI=hԾ4<GJ}|*00ݼ񯠷#i 3˛8 _ѹ-w>C%5)[*cM?4 5?-;IR߼0ht"O7VgKiO $XSXc ={~ CZBO.@ɛ6w_"&2Qx1Ҙm!C 4>Db,2xׅg0xeoh 2(2({(Z$y3c$&dԲZe0ʰloo1M(”I"&Cqޛ'l4:G\JK@ά2 ~\f1N)Li@@,آˆR>z''8kvs)tӓׯi}{OiLܪ-p32{TrSxP-KO`"K' I4Xgi+8 2qpJ^i~r4HT%ūy6G'nf64X"g;lQP"Ȧ޿F; c+u&׹4jzI_?# blCRLfP%$e/ϗ_:'0oSw0Uh]ךO6ķXۓl秐n.ݙCfރþT? E}WOjө%chbRidMSyZdc9_?a:tdlӰS>\}UOqKW=4|;U1xܬI-XvgsnܐFƗ4 ZQtjkP@vXXtOj{6k4 094m'"Q[\b l@kPTפDGȈ/eh 2(2({ܲ$j/v1k=23j .^' G%{g)wX[m3y'rc{F15dx5)кxcAvzO DݣS1Z75*5Bcǜ1avghJ3IdIBal31m([JL] T̸5߁9lS}>/t mڗf{ ˣ3)( 1m:]ݴJUfuv~nD1vT]A0WIG<ym_#΃U10 IBtʳgp}YA)FH[lcS㓧'|y̻oܡZI6[` D9݌Eag9pg$4A,;~ϞZ]K9o/dx2w2r>?Ά<wH5}~ ذÁXxڕ2ԴJA\'#%+ƛja:{sCq2Q]fuvvޒTq'`jUme2e87UOTZ>VH!;&G"k*0>,oyB}yЖ7(|TI8ToTs D-OTVwe׾".i^I6xeU=!&pjDB1!L܍E 2(2({,1 #0_0 "44*FHvzJF~o@%NloЮ?{4jrzgwTTm$CU$kyyeE)_507yIZo1$8D`,O{Sv+ЬT"K^Ӫ|$H5wϩ7[t \BLRe`5c,)%2j{k#aD!a(9ߢj%sߍM> 46$:ƪ~߹ΦZ|n%ా OWpO{J|sp-%CܕQ)==:WGJăN>7$eK i0V2J&E6| POR3XJKz c}%B(`{н/ڕwR SURV N4 !>ٗ$IAjT TE)297G(0O6F>]3Q?A}W8Wd >{_óUhA=XU75Τ%ó_J6>9r񮫭Ν-8֏)߷%(2(96,3͜pj" 9TU#VNVCl6e:C!OiUlڔnA7mgG'9{k)q`L,9Ulaa! 3.ۖ0pU /+ ewqBZ7ƥO8|vGwh'1FL-6Za@Vr3 9;+-FSW'XWG̪IL-)041q 254gd .ڥAhm\cz '1s9cך2LTɸ8*fl^S`zU*Ta;ǐ?DBP4U w9ޖ>Yj>>Ra6N|RBGHi&%r$7p-+%&5tGOL`}ݣJο^$ө/BVߎVn-mW]7ubȜ\m=pC`.-p6Qbc {ޓ#baZ'+ 7"OzP& )2jʷ(AFeQFe|1`}m~}:WfmsDe7~} 4R螌^~'8nj]sQ AnxY{kblQgG`\Isi]$Ad4bC8Nt/Xjl)̭  iAY=11˸8Ѫ^]ѣ'4۫~}UOPvP`#sX9()k $B0cf:}ja.ƪ8 \~G+6f!hp߈VTM0"Z9ME4?{ qz";+r Kc Ύ\oxZv?cGrO!rE625Nǩ~ tt)dz]mS3wt.t3(T"M7K Mzus=y .2Hކw3} +q@glM-73R h\46v6 aSV.:+]dQFeQZͺA#0pN>fql77V┳lD\9WLG)v=減rwB0;bYs/Icz N`D\-,FU C`?oXi FQG^!&4WXU*ClWu{j!j,S0cw:ńBZ(aF3jJ gg{ZX,LӉ&8 v1 0@AV Iq7/dgrɽ@6\C:U_%w~(DU %;?,E l7)*nI܄_k,E& xXxb:8H"a=ZR!?>8{ "y)NߋZlVTy<!~&~Iz6 U1CUwª/;?T%ැlqURJ^d{r4zoD Ns^SӁZ̢;qշum `ݼ 2(20Eʛy3u"\6pm{k+09{xeTi50i>ni$M klnv88{ʤԲ@-0!&,(8BcpڷUxs1B):Y q`J4gc DŐl 4tVVfZW4+,YrΗHm@7s}{4L#L+!\P:G^7:sk "0@`1qLdD!ac#iT(iCXT=;d%_C!t4>d(~Dh>  g"`{Ծ6W"[o˩j*isI]%4kvՏϪ2m{\0?1_JT~UعumM_S{l~c|= tM!؄ x *3X\uMƊkuBUŠC-xЕ:T 0;r^ORhKx*+gzVA;~"}{5MOa}\= ]VM1@dkY2(2cم/  Ya$ 3sRzױ_ڜUNN.N,^FFOX *yHقhH8JǸJCMfQR nGagXTg( ɋK!Irz ZvBrҟnյ z.ᘽf JW"N&p8`NAGh0Sg%@l9mcp&9PKw.5-?M!QWF)L@0zӿ=_ pD(0}^WR޹ sh@kMQ= `+Jhki\ϵdGoIT1jt48署jG`TC7~jV6g}dKGTQT9`|сTTjCUZUU|1@V%HT=~mxE"/XWhP,Wc8'Fsc4#}$Pn)ȓ̼:_Q2(o1Fә6{JJѡ^K-|휗uDQo7+]Jt<"U,` :hHHA8"L#:0Ihu}Z*fi!Ggv7M&qH-D88 CE&^[ Kr7OЍ1 iZ@%j! JH%1$hC2 QR$خo$NΎ:9S\PKjc&)i3!a{%3=Tpf35)T!r&[xe/ `|[~7 PQ{DqFR`21?Co}~ 1 P &`)D KDUJEھҀAXSql㧋gyUT$u[q]mTzf4l6njyk0V_@eOY& @7=ob#:a뇞σI"NEkGgaL.$k;{jsJ|)TgxUyS>!r9P݂.NnUtY&JQFe-p<;^gmf3֗d?-UWgv?gW ?7+Y_K\97ݗwW_Kg}?_ExI_hڍa~L cF)Cx UcjiEVt!aDmp|: 1ӻlnoW8R3Ma@Z'Ԩ!kHy0]<\}>L KY_Ъ%<=TL&)vSXN.A6A,8?=4<8:**qx<%/ Ip4b4fueEXNng (((|  =3qKoK0یdWƊfg%08֌{)LFs9hwTB%*Ij:cXQ`tHw64"q9:"Odnw~}RnbTԌړ\;FXQuc8+y 7DXCлL]HK*}뚇ARjl.2!I"oL #t 6. ;l@ PeHxA Bc@MJi^8 gQbWeQFRt{gڻCі%hP,R'%ߔIUs7$/Ii*%_߰v }xyd|h7͓ܽG ah>V;#(!cx/pBV#r3TV02(: ǎ^ $4 y?|W׸{"26"iW+5j€qSIj&3a>Ү A`Io*O3 9iA5 (:Ҍ1Eݛ(\1I3,ј>q! BBc8<= g~=Ӭ ϥ*e"pVbI_Ż}aS%uȏ:+y >؂5P<^/{ Ү* Hmz_hzHǵQoU58Q+1 UהO%SGG^UωڿX`w_ZGUXPܒB6| )ٰ PĪM~c 䴝Nċ{[DwVړZw'Ou5hjl#k⟑Y({WS`MpS畵|etleQFR&cZ61\q}2pϿ#|YR_aB9A'EӃCI>a0`DILR3'`LgC_S_^0u{lu FFB2fm|zDQDR_rڣ<';XW2/:4Ka8`Q sJ j~gޏ#Wj`|񄃣zgTk!*`tII^U^!h4bCaU( *Q-=ſ ܼ]0nQջBѷQSy+3yMw_9XKR'&# h^x0 OyW#amSEԟXjML(о!}@*/ #ۛfVXIN(Q{Rd>@LAuU讨m@RߗRm#h ]`GMXWB_<.t^ YꎀG.L  _"`g2~$[]sk=P`eDi,Hwx$y&Q)?&;?1i,IM%U `%508W4b0 RB&lAT0~(%0 ѳssܤ]\o[yeQFRXg]q)/{>^vmN͘xYnMɾ .seWS櫕%W8r6fw;^J7W="rc? dVIi8#o 0D$S'Ӝ,DE9M>1Ah6t㘠R!/r&YNb0 0zNQ'`(y%]9z{R^]{F! ؞a1!ebxLwxc0B`#@ HDk[]]յ[99zx{3ofެ~.d$6֙gg=[ùd8?(m|<|Jaʦˈ`*"It󴠿֣ D-˒;! ȭ% Z|VfdKѣ<_t+q ثMrsI PyPRÕou[t2VU.sb4y^ &{>YU4N:^v|z˲ne$߼W=/41mǷ_%an/G;{ʋceNC'4 l5B[XP `<BjxF{OӍ5}ͅEUjUӬ[GeF+VL2%ˤEVQ{Szэ';lل0&:QH?t޸L jlmi;8׵Zm.6itmr;kU#dwԈHb Zc 7~uU+J@Lumͫ^s8O䲈"W(%T n_Ui]v`ڢpe}3@`K[װ2#cy8zt BqF(RP\਀[+ 9byMWE:ݗmߡ+UjUwjWEuiE KlWԲ۽^|ˈ[^/SaQ4Mt{eB;`:X.ee) ,ZΡ-KRɒiD+VEY;%v,Em-=#N>$Yđƣ>Fځ"EϓkT$Ƙ"Cl%98"N%C,+Ş~2 Ǚ=NpH܌\cL=6S3!彧Op7'LsӠZ&9UeZaރ7qFhE\qEܾ_P@>@ƪVU}Ζ`i>U7/Z6;PXܚNg|}'O=ã3/rfS~}?ΏďنM[nBN5n|IB+N'X[\.Ee2IJ>FTeF3[$+b<1(y>)\dSrș{),aAL@U;FC'W5:l3_, <,>ZkeZ&5YQ5,mP& I(QVb~J*3dyXP2YABmя;dY}ֈ*0A+c|_FT:Gg.,XF)iA dۀP@Y(j|CB5ȫ^!J$z-ť$_ǐɞL%pM1B Nm,g7IWq@,7 j =w5O‘{eŢf\q1LwZL;&'W9`z^TtNdL7ZwrL+Vʡ5&0l)^6 z%X? 8g򾽇`A0qݏ04r?##4.B.y$@Tl~dַݗj'WE+^G:<z~݅`j%y]vY+UjUw{1ȸ{/WY 2^ ~9O~{QL܊y{w$ ×=N?`- ~xI /mh[^fO^jwHY9FM(qhmd1QJъ[Z 4ڋ8\l5X&%ee @z0RE߿,g7؟/H[Bt1ҐNCvйB)yhVX[Ѹ": mBjW EQS;1HVP^3a@ZB (F;PVuiB4발7lGhGeihC{lл- pM;q! K<S/!h B5Az[ۙPZbZJ~72M}ZZDz)eCc_,hС}]B|@{Cޯ*$@pBju]%5 HHm9H fоz =JIjMr Jv$ HrGal^@І'ip}hw)U !߸ZժVu7[fS䜥i|'qַk+~]?g/#?>& g=??kS, oza1w~?|5?W|{+_~5оzs-lk*W}bV?n[qSU%ցԵ=p!D|;^7؛8jq0KS8׎S F=gf]HҔ}zV%iYoB–u Qƣ,+J[x[Ucpi2M(c钤x>IV9ֆ`BJW7S*dz9k6XLk_siGbBfNq itBZq̰UA]vQQǹ339Om1{Ե,4Ɋ 6S Iz%2 B~h8'e3B-L>)ɽNI)_[dH3:<4s'`?#12G?߂, $WPBy(tk]\ pxN䊙Ş=voo#׼*MR&0GDpqZ { JK1cO>Y\`|Nt,^,@Ji}8(oeB :P Kw,4%SHv<)v.E㱸r,)Z h_/iЁpB\JjV cUZժRY)C[6Ȱ1Ly|y,?{u]-|g_iOZ]?`0 y썏~ ݤ[i_ʲ/|7wQ^՝w1P;<<ȳ 3bm6U~rAa#|CrIZ;i WL\\nitijUUSyR7#M!Oƶ#h91~"m+RlU6L=j(%[䴃=qwRJ jрA5%3eQQS@q)YhGUDjQGsٓ\ \Y:hnhRFMrTE! CVkV& vE~TAd84dB ]&A4|_VŃ/wDZTdҔ&ُ$;Kf.uu:ׄ:U.2a`6Į%2pA¬';\Dd2Ck$!yڄaz>AV.V΂z J6@X&U%ND2$ͼ%ߢ{dC6PVMx$q=BWrЯ]eQ.丽0{MׁM(C5i;! ,<%`$τ&\821n5tePV cUZժR9WKVKkvܿɌ?~ _fm$ɢ:9Irm>cowoo K3|~W^/?{x ! }7s\rK)c[[7\G^V(t#6TUEتjRܸ$?&5R i5G:pbH$Äk,ʘTBQZ5aԙ{YHg(gY.ɧ{hnFt&s|r8?iB7$ dY|Vq^dUrHV@b.^0\O d턢011ZsϜ@VX\IUWh% k+k()0^ mrx Gc8r4 Y&ZB+5 Fr*C5$9hLCp_t bn1o{ Yc/VZJ^e?4$}kCzQ.S [H?ߕ钫+J2(ru-;!}8:qf Bo陁W'~$B)rbqȘ V푀dW~ےAF6v9p+ Cم4,DOу"3? 9W3E)gq3ޥrOmr5ZժVuJ4/A\u?_G?;dX_c/ƹk圝.͟G^~Ÿ/[A@~'TQ+QIh! 7@;ѮVnE89ՊZzAvrpuIQi)G70icKvl?#<95lSXekxʒ]z<<hHr:QLb>1-Y[_}6,1Ԅa1އ"C".*K1't<"MI VL:'D}:8,`HNJÃz>tFզ*ϒ% :!3Gn8'x!dxغxIn1AсPRƺZ|cP[jiO3_*?7`$\|B 4њ,L&];RoI_7ve&ڊ𸈌RIZ2Br}'m;$p~,;t2=zX:HDssdn41Fb-Zbdmч6:ӎ4ER2&RB@rG/,~J4 \>$BzPҪTE5X|_ܲGK[a,S(g;"l&9~ /7ua-spP&&eM-ET_mmZժV9V7}?Ֆoo?oky?( N Fp7'4lϯG4c IDATq>򦷼dJZKUYkEQdƯ&_eo ײ?%@j2I5aKh(J2|SFVmPagdnwHsF6˴`[aMyI U,ŋڜ>GiMAɜj{ FՍ=-DJ v"Y`˂,+iwLy  ![f"UU0/2fXC/}$Y)G?aR m-IJ{df b€O_.ot;k^' m%cڿ;b8UKQZGJXy Tmyu'/QNu H`sR=s%~ :"e:{)u亸Roʽ\-fK8 \4؃ӢظƟkf:5Ӗ}]?GE7_\֖кLI*TX@`n959c=%ڌqه1-r% iOՁ (*Ly].P~(qrV>͓B`䛴"o#'^dE@-"N/@CWIF (v nglk2VU.X~Dh2=_n/~k w_oFdms}oC??79<8O3Oo^ZWSyξn:)}^;<0Eتd}4b6LS,5NR~n^'MDr`}=f̉yBЎH+qscBӥY5Ehp1y)ʜ3dYaDYUQ9Wd"LuÈnNi<' |73)R˒Vd>!JfyI aW%qg?X,je< ɭF8QdKzkg9>FʢvP5^ak8h5xAir45sưڗ)X+5ukCڔIn {a)@v~XCuVVkhq>Z.tP3>c, R *Pi*v~6 4ൄTN'y>.p9%z|,I7@6s+a<=_ԁLGBt)Σ݃1m+E=݅;Gd 7!3{L?2WWuw΅"pUE3HCj pJ൳@IPENQw(m)NTE5x~D$V:Nw`)ש9öH-F*x>KL&Q☪*0OQ\ ʕarFyE VG.&,4YUb˒!V(S՚J{̲9k[ee2RӒ(҄(죌a<[,- (H%EV%A0kuC _gz>9G29@FC^Yx(0ȸ)Ɋ񥉾8DJPODZ١nEo U|.;ЊPpMy̽?*ӋkZq=4i<0~@VXS4PEIFKZQ 󨋒nKք?3KP4@vLZ<1 ( |%5lJ{?,rITyFeL'yƕ%(dz4=tƣB>WS5w)eu=r_uPhP( ,2XN/M[!&/Q2rXr L`z$\-蜖*Gaqp-dU %g) CFpQXE^݃;xINV59ooЗB_C ƶՈ;5Sl7NZ 8p+Ӕr=X`pn| 2Q `r af*l@P]z?88|'{!+PsD 5Zؔ\B[B'Cq7'/XժVT? kWV}ǚ ߄(S(u@{Y7E%'w[氰WUA4Mj[S` ub2[h/"+*,'/9-<Ե,ٌ,MQD#/Ρ-QFq]Z3о#iԋ%d8DM/KwJx9.)Ɨq*Ƣ+-CXJr Ch=,'\W>)7B^ZUjUKn&~0U߹&#I!/[2€,@:|_gB3R̮r؈H[-f8LAb:fNwNZud9>yV7>5x$v>}&Dp΃ rUeqkZ֒рv]i*SY5R̗WWāG{UE;m$3 4kk#*4jAՎn< %~(BƆxqa@84, eMFt-Fݽ^ 'e{.4;E]HNB<W5oqsЖ}8+NPL<@xSږ<D. oLVܗX;JI&dOn^L>1>|P{?!sgShE>1]̐fsmiA}7~dJ (Lf2Ql -xDž?#88dѸuɶj$X(R&/cy}9F;.A#(Hw+oDU`#^$g7oeܽZUjUKU&IKʲBkHh(^EQTϐg QRU* mM1% g)&~2+XV5)\x̓&ө(fsk׌'[\giu&S45q: [$)B㲶j<ߧKFǠ!]V`+%)4&I0vOR8?nE( 88@UЊB0*Eá8݊ٙ-yS$YYQi8$+Dq8]H+*m deɃ?qpX_S{v4M֒gEԧZ%K~V cUZժZmmn̥s\r峾~Uh/x^xemxOU$If)q!Y&Y.h:A-],Y.p<à6|9xp1 *df̋12'l3K25F8| ;"4G3I_Wɦ97עTG|-Hw~ [R5?~3;r;iT)C1,҇ѵ@-z+y/'$EPށ3阨*kX&%iDTm͗;O|Hm~)% h/p~%h,fɑDF9^ "5z*)a}Y|$Cm!6! 8=bIBTSnBᙎr^<h`jEϰ0 wׄ_47[QNnohP-{e9]b?~Bʢ$3%XW$Q BP `hgIڱ]LӘ4I*DIF`bkL`{.?gz`42,ْ%''G<=kNNOh{{\\/;Kh]Qz8u*hp#Bstms@xQ:Gc6nG+)ZSPcrK8"ƣ)]Q5zh4~5 x[p0Hw:eH0y`w }(gCIMA2+9ےhY/=4 k[hqV0=-BNو$}y h\F7ۊr\Ҙ%`Wʹs?%,{A([j!d*,RFF yW6jH-F_"ڼ%D ! u1H:7W~A6R2M9aS~߂Tπ@BCls4-_6݇c*{{8NNO"C6u-M5L`-ۢ `6s}}9D;͊0Έ FQznG#bc):|”xN+i:Gg-I*k'-(Dff p#kR{*MZ G`9 EZW_OtO2c=b點^Q5}g-A](v 32M q`<Src4R}y(RĚdQBC&eLF)qdX,TmM)Ҵ]=m##1,msଥ :48O,+L#|G|ӿ{l.2,Vkul2 0l7;Q¦Bсzl5dp͆+..0q4eӢbIFvi6O?=ga{x#8(Z0:0!ϙ,_MJnxnwV0 şˠn1-f'b/: y;e`R!&^4+p!Na{!M~,&|6R[#F> /K%ߖ~4g }~K]ןɆ ? Tp7ws5잋q<;CTX1lWȮHp*ۆ~'%ď+`N)e*>$l]|"0H!~ V ߃ thiu|E rw>ܚZ ?{{0quur`<ʉoDŽA@]W@Sbp`t]O84 h:Qx0Xܽ{mu&*V'ώZ׆4Ø5IQ6$!Fܾ4M kڦ! Gd k{"Pb 7dI(iڞuQ2;x2%B>OMl:)$"bL%әA*O2Ƴx5.sW m)pҶ khi8P5UWTldBR(&Њ<cqwdyƝ;늪.Ikᬀ VĻLFs8 :\\nBU i!Ɉ`J/ʰ]2\~ӛ!υ.|ݑagRK 'OWp{A[YȆe 2=8??w{8@6 F7^̡xC"J$Qvhn6"eYEM ΋v{)'*&jvi9HVȪAԼ&@w"qbN|_=\?Υaщ;Cʵ7彶B£'z^- yG@WG$c=c=aap} CZLak[i]YFyx4-uk9y@| ]Gm[|3Ic-Sz (b<oBUa2S8dqu %0  2lw;l H Vu ׺i)bu>U{w@ 5Y,r4ᚊ?o'/KHktP:OYT3Xٕ%I6a:OZfn;ưX.N+8&JSgGG9ah"=m .hqMIuKoZ1rR_By yK kJ8sꝘ㩘w`Pɐ$7a K>gr{P}&O h[셤O`5`ET{!񼶁 ߷/%{@_OtO2c=d2ٖ8GpmjLaC]RĄV-}דf9%{0ɦ4#ή9Pe'$qj!Lr:(i߷+ILЄX38} 5h=jmۆ]Y< 4uSS-m',󞓛8oȲ)o+z[Tp&)}׬%Dg)@lCKV6` &r_)J0̯4z]:tWX _3!mMQt(M!$CK6c6!XHHJ ^/diWtK!}f$[0S3eG; 5إ 6K9>]j=c= GW7hi:6F)b2ɧخe[,ۆ{N4I\Ofu!tAg]bpu3Mr@# MY)G:ΨۖxDhЪ f7OcrjE&S\]]e+B?H a4l8|K6 O"O'g}-6vHRt(x3BVS~SQ{#Cq~*1!IW_ 1jQ^7$0CHn=tkfi dsy]79ԿuNMFGm涇fK&RN>5:׭Πb4a*P̾+zIrRlZbܤ//_\ܽ-.`zG>򖟊=R]Wl GTHݖDTM~ }?aK~6 @+&Zz=S?uן4'{{ #N<6(Pw=Ub"Ed Q,ЫOOr,!^[<QL>}~d"zm0tn{EI[x=ζtm865͂mQZ3v4mOh ۗYo EhĮm1 EThpmuV+4JSJ< Dp_0 6tR6!9l) ]z,~ݑX"k/~)mTƃ!B~29<a~ 7?3Iھ]1+հA@:%O͍[Y,QD(h|4b2P%/6 =LI 25mX_JQ;?/Y2T yg_Js@z.\< ss1x܇W ZLbjDd&TJT<_Dސm*l~ xvF2nޗcIcx.Ǐxw0~(RZ}DANR_l3C!h#`kŧB/E~59$u o'%=K)a#?@+1-r)ayžd{7'B@cvuOQđ!RV]‘1Ů_޳\ɳ{K\3Nnh1aH$I"IF$'Bb*<&*$Au툌x(6*(+P|G](88::9W%)(蛊 nƘ('|F n8W S4>d!Q&ƶ-EՒOQTUSs0㚚!: 5m+xL m͊rAA@heUޥڦѴWCܵ4YןJdh(8z")Lc<"x-F(·!/l Fע[ȓ_B=HB|`0=GW;"x14[FpVo^@2{Bs3 w`3K)%iDfs(yg">tm1`B8_NYad^"# /ȹ۝v+Izsl^H1K|͕׭򼪔A9}<ɟA(ø p^CwG"qcG \ ff Fj~C63 ~;=8-m+Y\i_b{!d&cs.~Zn!)Qa&9KF?H2{+^ B*\5W]_ #9|Nn 𷤳$9פS(>O{$C&׭<߁ b7 ؓ=c=qx|L);IBwk{"07c2α}k)v[l*ƣ *L;X 8"3ڦv}_Bi(g,MRC4 AP$i-:,:i郈AEEkE+bņ%[a­w JaInXmJyAͶą MgG*.V=>ݾC\o\9}(12CxC8e|p[Oޡs>SɄpr㔢(`3^&֑͆)A+گS'$WexжPȠ+Зb+Xt.Os'&`RWWi]>ZɕDp+m^?=d1y ۗԫl30sAS(z~^;!j8޷Od)(/ BRf9x,%}nA=UEcBf]'IPLJX^H HJ$S?i6B!j.5Fdne=c=cffbÄ@غDŽCVZń0o}(cq񚋋j;O#l .d@-۠S hB!x\5D'B0_˵;>"39ח= }Fgr !/ ro+񥔯DrOw$5 HO͹xN?A![__9׈=c=cohxAOY|OJE4䓔PkҬVK1)Xj1S7500IB:jYvxcpByk=āojLa $M|&CIk4TyL]lJ%đ7+kk"ElWcn*fw謣m,Mk&8QT,^]e)EQa4]|N$d1&J9=9!]Ay|B]UMbyEZٞÛܿ{ JQw4atcBÑEW =AZ߄D'CZ< CsO WpT=!U`յ}Igz\?Bv#PB~C޻P d~dex)(6,ϠBZFdz ۟IC|(M.~ E4m1MIґ,'i.D& 7g+!={?!%^{\PFI׭r'PJHH'Nxs٬'f%w$ K8009 г㛉x8/pVeo9U ؓ=c=Q-a`CC5; PJXqJ19<]iȎ^[/2p},@,BDhzG 6Jcw)1Q4$9Є#J6& 1&:"ed}OCLj\N IDAT_]TR+>@T6ͦ;x#**r &0D?ęl2G8NAHF(p"4yB4 Y/ ׵uu53,%5+=EUlL&QD,N$:U)y¯hfS?x ŘF3P<w X|&qv04]7"m* Sy/DDzd5lY3S{A"_> }[*a0\R"?j ݕeO'0ۿ+!2rm2H^W] Hr1k_&H$[19݁4{;= țsR6N& 3v} א=C(B45=!u:yG( ȭH4Z7DUD$c=c=aasny{#/6&28E=(&C&yJ31*}OQ:G*ĵAZtq}GוdiV;-HMhla@ӊmM@8(?ÚS: ɔ0Pf%X$Oc<»vw=`txI!Ct y弣%Weҵt:ev]@yB6Kt$Lwv8(,/:i{8c2VD1"Surx4nBs)is4$ "j뚦*PxV(+ڮm{RM!ڡ'k0)OXJ蒩 t! ?X< -} '~!C+1h9,_/eSP/l*e!>~VC]8ȱؼw\4$`$K%31;ߓ8ٮ<독P5"Zz)3![1Fw+$wtq1"%\JML eZ6p$k5p}%`9τt Z\f1Dz`,[+/K1rwe|\ds T&߃>/ҷ2ȷ'{{ ƄhI(l/cPUɔ, jd(k TNsF:"H/VXSAYG\K[eI E@mWI J ^45w9Oɘ]ںeҶ5]MY:6vcV#yJY3먛mbk=_r^2Ŋ$8q( CNP#pi(^СC?i}oi[~1$5/d99>J EQ@dOe{/S23譐葐$Rb%fBݐ܄ȼU\+Ƿؽ 弳2o_Hrz D6oar|1V\bH$M]6WrL_ʹĵ_ VIzF0 N$JK`}?75kȾw5L6HIH;@dL׀=c=co @,qhM'VãM(Ҿi Bm$N@0::LsF֢uhLBģ+Ey x+)ʒmYCCz>&*BaiҮփrL:'b={vMGD\ $ssܺuLe("I8{KXkͦgEK#:!}qti>mKtx4Y~=p.1Nŗ2bV"wR2;'fD IT*%|Wx( Z~ŕHH۲Eix`ȒKxr|<>^S)4-w KTd*I c ]\K'{ +p?my"x*ǝcΗfwG-s/خ%B=ɄnMMu=mS.jֻ-V߸+"aH5?9C'dHXg4JCa6ˈ^fQ,ۆ8'DY O&Ru!9pK&l? Ib|CR$$$)C RR`|%B8QIf\T 0boİl~&+Iυ(ՅȳLBұGu5| > x_1|W } 0CX> o`@ ! RIʏ-^mh6M[~Goj(b,; ϐ7Χ_^_ݰFȋN>ݓ=c=o#C5Ae)mS0V+#kKPW5JI;u/{oeYp橪Nn%f0667kEĹx66Ɔ$vl  #yk>9=?*g^U]g}}Xblj7*8i" Ү9^Hʎa[8X'MzQJh|X1~ @*"Jɺֵ}>ri hԼ>#zv!Ø^o@JضY[_ge"^0QSTÐ0\L&M:ae+vR Er"\t&C>A Q'h6bY6e- C<'#z#(h8C>c]tMX:r}rR*0 *NQnw /!rЅt,gKnwRG!s~Lq}Eb(TJ7DZk =Lx55-@'cOV{ @.I:8ͤЯCqMu5B Qsl#㰱D24-=HqV=i^O>: =ef!a;zvNV\"̾BIC3rHkVǔXЕ ̷ @3$.vxĉ 000000xxץͨIJb0`hef8㘔"B(±ҙ f" 9qmt6K&Kqy?HLprcp݌z}@#NKm1<11v .^\dxxtr9<'Rq ’ƙ:_ϫ`{N~z]d%jj`lyvX#YNhBdf[ ]0 Vcfd Ja9k`D n>iuxIv Թ/u[knLoq4qsxޟ$q4a" aWLBwFp򼺉Dq Ȃ;%ѸT笊|{Fr#rq,VMZ0$42f9p -q /YS2xvaHϋ- AEQHFɘr0Ķ,Rn8kE;;49۶e< &D:!eaB $.N,u8!m۲ eF$d&Ll*Mq*|R(*AmKo!E!|˶8"$uY!l7rGdRYE[A{"2{V&v:.nʥZ2 (t:$GZ}5(uV*P3cPߧ $t37'ډ*[HIzHo&6̩ݮ#o mUZ-IJ+QRjvue&-X-J.%mtTk#,28C${b_`ȃc*k JN))W`|mohk WڦDrpҖ˗>0ue>f$RBu$6KIWɇP)i,A0 %(Co99dUwXۑrqJ¦D;=0$yF6b6~.a>m% @qhB4cED[G;`[D-YJAz蒘NJl( DǠ$n aJƸb8&c<6ڶ~,%[6a0HtmuS]! | S:ME nDŽQDEa`[XS aF1B|^~O: HRxՑ4 7Xye'5O K`mAܽ# C3ָuw$nRC2 oڮk9\?8g$-u*Ơ V$j*8n$8.Dҙ"0$Iޢk_)\sPks d,kIE` J: Uu $b. C:ק#R yubOA i=%+XE6qJx;j߆8 #0z]>}hw -BtExPs)ͤr ~_\3 H tP/Ax= mkE>d8,|I!iRҳ08 `J& +{ `Pj%>a}^VVF! OrKD)@1(\܋z &iQ9?v'nY'u;1X^JjH#gڲy.VNk׊TJE;nQaVϩ3ߣ~>tAEs"NOX7[ԇyʝ"/=t9I6N? сßa```, 䧞%|xw2 *pרa4TZ@* Q A  rjMٮ}NڧabƟs<(NC^YO;2 MN I= p.oBk-e"8TVr` Gʴ\g295Ű&X:Ö{tLg]nI_9 tsw 6wAs"{TZfw&uP!݋m"q`x+,?!q}~NNx zpGԕA$-h + ;]rzaHՈtEp'.(Y02!uWCګ;yW$0dgڞϨ :.(,"nR] yu< e*CCcOخ$Cd{J&NiBp d`hFډנֲ?8VsQE{/md4`bQI+\mһq>y3`=uN2*|:'e@-'0eJ$ϗ٭c׫t!JA0NF # {o@J _Nk\nd,-J寧.owl:> T;i( KKޢFx ȄaSEv4N^Ck>a[~)9vT#PkO)WU:L [cٱJ0WA:ORުqh@z;;seMD_RV`AD^sZcټ4aa#2qK4ġRbyaRLْ@v(\vNAЖ&"肷E 9(uGë`DކCHL IDATIrzF],(d.5&[(q aJ^GU @;}{a```````p!PiV\2Bd˞6U4Bү q au K̝0EPHD٭(-{`Uu5rf5h''*IZghzF)|/UјS4rAj'DARgD R (lbw;j@W@:+8XP= GKnZQgB.uMm3Rzi=oN`Ud#܄{{uߝE +!W朴!o-OJΨChP){bkg4^3 z JZ[k*wvIadK(LHjUa[U{-nXUtQ:.42{oʕi~b)0WFED`hVvSJ6ؐ[" 3(\'6GxUH DEhvA[ᄎ SJQ|^Md ]scYn]z̄:C u% ==Gt$#Lܬtl{j*òD@-i>+ᾈur3PVԔF2>e=!W#u{5w5{rAݕdQ σ*UlC#0<.wA)ԅ<vA ByFBz7`C栊E-+!?+'e[ޢ5Y^^"1G~w @Fir8!KrLAtDɚ7]X,S"7c"IqlE5蝄4 PY}AuJ[xHAzNZC@qD޺]#P NK2HD k7:zWKQ 7]"1fqԅda```````p5WvUNLv:T~A&tj, i(a)ubu@٦N_84~Gz7u ijDT`^Q9i-4[HăG$"? :*a0Bz/MCe\ź(Yz:KJeh-AalKM["ǑI0MNs +·8,%c:βJCjL$4KZOoEzӳr vYZҴ:ݦ>Σ+lZzf"q2kpmsl````````9pfOHOh<@Q90a%.}wCc7թӐ!RR L.ɥ ;.Tf w-dw .!@~ urCrF8 Ǡ"V~_hѦ~C׎BL"Nع 9UM@yX02t3RrXʔ0-ʴƟv7$#=5RGv߃BUmq9\pv]cM)OC$!=!QArmꖴϨ3"akFFqm Seu ? Bv2"e7+jHBfnH j;cvAv7BI-BmYW#WV'@P*3Rg#4Z*0ufGEvyLCVPE]c׽PS>FKoW]ɠh42E$g&/@yTW1&-{rY(_(\~d;XD*@i4D%- wlu|Ω`Қ,=-݌\Mk`rCЁBnw0{oh$-8{zrtK@PģJcz:]Q_y` NSd\mSdn'L= IiƶTxڎQN\*uY֒Hs՘NQWg!W֎z& q]TTFNIc*v4aq7!5ut(d*r8qԡkaf":a W8lA/+ ̸BED<';)SKhޛ zDU(UsnוYr)V2IBpw@i/PbY >LC|w"-c:!\?_Qg```````p!Jp={vˣzU;Tw704) ބƁ[Ng;}Nv“" TFkhHRG δ 0,/2i'WwH^ $<(j_44jG-)-pPfMֽa㼊ICy:.lu.(_<kI䣵!”>h4 QH_3~O(랗A8 +Vܡ%}N DIB߼b囿 _ya+5}e%[ަ|E 00000000rڡw3I?h(WGTn˂nC~Bu T,?Y9>qٮttAiƂ64Z>+u ʉkޗ> VQ1n"@kHk0@AVcavJZI/un&\=נwQkITg[Mܬ*vz^V` @gFkĎ#(oU*(dЁ^_UNVò /$-9E*-9HŞ߸.!/+M20000000i&3'#r9uY]BnS':cdƠ|M"OAwY;Q[DcblnvWͰl`56ݐun'u߃4Tj>{ܭ̈85w ޲~W#aS -A&AxfL$Ahԁi,AD(V^HqD˅+=vEЛ"h=qQ6ѮAGuMn7%ގUBo:=][VzE} 7Yׁ+`pӾ`HՇh:CpQ&l-˒3J۴iKi :o4Y)NYyYA"*+IXDgA]V .$֕Ȩ4 uul K(VR)럆:>=Z)с#*ڊ!J[Y}cN/CҽOdAb了'aMaWVЃ~uWpd{K\uM@NFhUgrP[8*ĽUG& EŽe%vcd*%R3h rrKr`R8,p-ܢbЁ-`v{Mݪ5 vbҰvfj,1v:xvZp'aSN:'5ik?I.'%{ʴX+}DJ"Va *vBiơ6JD;"v,I0"4'E%>dh,]ކ3i>ѭRb[ ST>ɌYxpX0 Y59 k\baJ`cYb\YZyplu=:kJ_<}PQ-Ig`JpHWU, /BtQ;n^WEjm7AKgauJcjC,+:E(e]o,ک(Ba "Sq^ܧ" "J/ڃҎx@lYNW#tx'&z|[6#rʖ3!l9g"/,@nQ^b[ۻ<99 S=t5!V@#Xђ3mIt76d\mH}5﯂$F]ּjsڱ] 4Bxʚbr 81l7Y)Qh2 SU{ j`4 XpkШ8NUEt&nU)ʸR]0 YfUH Pg<kTG^%Ѷ_Kl| P8 ]3S[ ʩ:*8KDNב|=PQ-kQڧsTnr)brgNgԕ^3)!7,B0IljC7XP5$jC$n[vCvJ!?rr̉йSYVvЇVmP4un ZML5k"$ȉJll5˞V^D~Z$ŲUt!I5/&#F畋.k-E;u@]qdCtXʐ,5u2I7'XTò`h\XFe9x skNR"cX"ͳd"AhU>Y ۮ(7Zw@zڙ<"Fa yBn(7CQwW:1$7  nVDb?H1s*U甥`Yl@gw 'Uϣ̆֏+;kki(Uvd_'UŸ.Tgq(lN{BVݣ· `)#2U+*WrHׂ%s'qd(;aDfw/z Z[x` A-IlE=7ۅ*Q6%"/x s%Ij* I3*ܓJA+8뉌IlҤ{D :4@-(0"/|E77dY8yꞅLdi7U`:*rĖv]d i8I1t^r ڧ!CĦQ𝛂FZg%BbRGohTv565uljZ1h>sDSԃ'fv4f"a gUƠ: s@mQ*R=D88']I^+xgUʌ~qU24QAbNN"z2EvQ"yk!uCò3\*VLƻ`Pq"!4dHՆ9Jk>Qmgr0߀lYvŪ 8k" 螑sUyJϏ;Rڮ.T@/li+ :_2רⷤCF ʡ82 6+j4Wa1%~>h'zEeQ4alh]j(]S*\Ƅ *UXeʈ BSDAa(|/zQ{V%Z/E:8{@mt2 Jr%cKn^(TxX1١ױȘȔWV]+";vBⶽ&nڹ/9 PE8MXvГ㨛R,I;fW[:6">? FrTiR _BaJZQuW. E_!"!u,Zs?$) i|޼Ԡn,tHg`= ^# `6 ޚej*ww:~p oKdg{Bkd |; 00000000`@zG]ZwF!w!"X}R]l:0Z*;afvwf|Xܭ :6[(9e[%Z. ;^b{n.aְr^]ښ$,ӘPPUi}ud,%ǨAOڑ{[ R^[0 F+,0BC&q^? BDA_]~;AA}N ʶ:PFK#N\b?U7lvp)[D../mBr\l&ÌK\u =$vx@nDQ\a r4hǿ]4TwjZ8fҮX>/bDjQGTw.ȁdi zmxR#CPq޻ 2QѮ8ʔE @27iB4rb&űdTlrۤCQ12ۅ:-5uU5H)Adž Į"I,1XOyesX#' ҵ49 kD_n TGݙ8ʝ:k@(ò n}1+93"340$[Yu2E>lNI04q_XMKcAİpD!A%*{Tt׎BVVwJ`Q}[$>v Y_T!ܚ8DN 3)3h Sa6 seqayȍk<;h!<,{ )X%tkP'"dҮEତ;dJn7wY!t^w\D!],׹܅gG*Xr6rJOޓ)\ϊC(3I ?@C7 ŜlwT;Tڧѫ@Wٴo!Wt: ^W٩'#BgM5)0r]X7Q#0 g1)%Q朊O%bcԙ*FID<7 ;`p,qD*Hǖf5FGrcy6G=a4W# h׿Ȓ6JH.!%}8UTcA]]\gZIQF %N5e[Lߤ8.}~{bFhy*,Y ]&HY蝇R¤vDȦ A|bE$ WP9gَPƽ@<pf!\"ht\Z*a6U0TngSr+"=שC9JHk`OA:0V5!D59w#ZNOaC܏t5"W 00000000JjDQWQtS )T+Ru A?Lp%{!2]w.HMF&`FREy!,(M6|z)HU_%7q~ Я3X;in%@۔ R_s'^Rzf_niH5S,^&j4'S7BQ4ˁ WƟgG$RoCly\TVu,U; Evi-;3clN%a```````p5JKDH`W؝JK(l`t?t5SV hKИPaD32݊#&d5w;".y'XTۮ'aα~Q?GPAH'0{构 TpP͓vNEx 1S&}Y xTiך}hխ V'QvG[T,(40RXI "}c>4hR[d$:yhnȌkH_e f;$pp(jDIw%!LvJ%1Z)o"&jDzX@؂\1INCy  O^NnDFu a*$WuK@R $}]XҸU+׃|;VG܎ q91 Kg%NoM2/:v& d)f" "; s*WШH$yX;.xPڦ > K PyB;ueH轱eWtp*Áܡf^\)I %=xTv+,nHj-?r\O&ri  @~= 000000002.@o`}^"Ɯnl xOs6v vݘ`l3* a9.n]*K$c"ǡvAĦ K_>#;}P[EdrvaJ.E`*3C@YŽ]k'G&Ƴuh.)$LC+xmxNϡ0*,,af*98,g++ %PV &fu=woRAŲE64_Q_fDĭ |ge=Uz.RկCt-"=CPD=brŒƬ$ٻ8S['*faƥ VkHD~=嘳_~Ƣyx7~MKٯSg~O^/<O瑯>ڼ'ɢ9@i1p߸nǾ}_:S=vgȣɥ%Hsz1M.>c:,yzpg>)_戽 C2 g,6w>?˿q)gd|K|S?0`HU~p ϼ;6ǎ_wz'w|+^ç?M>^/J>|N݊/}Kq'<# 00000000J{Gyյt wC'F~Ϳ\l| =wqߍǞ<# 00000000Jʋ_r7|A/`-!=/y/9|/9|x䉓n._o{_[xL199;wd=<_ 2%|+^c>_yr^xqa9Μ>?Dz'oy9y/?7>8?˯گ?O-ܾz^:?/ o;_pym 00000000JATbjz?U~%kk"lGԃOoٻ7O7$ħx3_|sշY<|^7÷Ͻc?Mo'Nr)\soO|c|>ŏ 7Vy+_!O#O%"/?9Y }uS'=~+}(۶255yGIRN}[n\.;.9t s?ϙgs [z7W}nh_㉯!2X_[gzfxkC__F>eu֛ٳw7ӓ,_\;0Gv#?{ٶmx'>"fmy~,oxoZ9s R^#ò,lۺ|G?|?O|??Hɤ7>xq׋p;nR?r?|+/'>sc0 VT*+^ >'p(oP,>)ı='ٵ{'gu!o{ko>9m}6| |s=^3k?~zd2|'"lyƂ;NOu'?||sz s/x}~xK_|ՕUe! 00000000JiwHaRUlYWvwOx_}䱯?;nѯ<_Nf1Ξ=G!s^Oҗwcu7+O!gg4o9x=rK_ Ͻ^b,,2L? O=q֟~|#>̖~wX^Z&N?`xd7/P*H/;wl?oٟmoe~][ᗉٵk|:{~xA\&UAW5~Jr?oos ?8L"mf<#0W/oyB-޼_Uw}?W(5000~} b/!?yK~}?|/z|?x{9s,;qnz~M?4$2LC -ODLqu]\}N|0 &"Ư7v-:^;>﷼}_tͼW0$~:W57|n9p}~_:!Pq=6k,~+<}* 00000000x> N?Ρk&%}./ڽ6KytnK ߽ cl C2 m6j4 08r⳴BAw`E?nzHH5tCH,(((v‹8Tp(BP̼>fwSȒ2 y<;Mlؖ _+ N'DH{gԪ^{]z\ .^ nԹjІf Z^$[d(Ѥ#dffҰ~#Z7kKpPpm:sCG 22Wr B(;4c:)~X %MHΦE4eR-0{+P޺ "8|]б}?=)%f1,Ǩ( _HRkR5.vC4[RIP(e ł.{ֺ<]H $57+kko[bY1ɱyDHKK%%5-"nfaBǮ۰m؝|?v nC:6\u†:[%%5Բ6?+s=sBQ1E I:~GcR沯 @j'CJɋ^Ͼ f㪫ߦ[n6^:6 ]PW: ]9{%}BJ4|=&Rp#qH44m_'⪐ EŊj%Z̗f̺Y+>xC>z#4?x?q-}{;<}nk7+Wcp/7_ONN.ڴDGӣJ\,SO3{|oͷF4:tLdO$B(e|U)pQy_9qs[bH[ |0֯z**EUjոL]gaZN?Uqfmі\[yd\>Xu,c1F|uvSg܆F0aDڹO>^Cd<;vz8Hȍ,< {ɓ_+V0zh˦@/ok-iVNFZZ!!DVjҤi>s֯J޷n3|ԨYiOg׎]GD0ed:_#nƁC{[>[u( Ey,V6a4GItMXHVν)qt/{&왳f~_Ю};gkkhԸ!4OƙjPSv-IOϠfackeV=o6W=oHuU)NB(j Gpp0/M6e׬3w\YFU=4}FAs2ϟr4egg㏳aڵ+7_*imI<t2_{P900_Y /7M1s,4m?_}_~ͨF BK OBQ_!'7d]6CBu̢(h; ⬗3n浆1BRSR FJr ͚'-'/g꯸m<0r;ʋE㉯ϖ[}Ʒb l{K5[R>z +?]ٳZ5/L-4] BQw~B;7%%u/\@\\F>ZQQZ>̒%K={63g`ƍmۖf͚/ޘ"pmI<t2"""X#}+_sNr9[|K^^]99dgeJ !4$@iddad=lQ""v, )$Gm۷w?ϝ[n$%3m׆C枻E4Ν=/GΈ9|0O<1c]o0Li/0s OٵGV}aaq:o.\ģ>jR(LnѢO?5I)yG]6ӧOGIfAx,cyl  1q1gl6WYyqիǴiHII~?g;^y{1vےy m5;S4:uD.>tsVsyH̘]h3#!!h8BS(+ukDDqAϞ=vグhV͡JmӚL(0o6rQz'yvx^">>999tԽHs%Ӡa];wN@J\=fǎhFǎٺջk׮dffnݺ&M.]yH[ |:GE4֫KZjDV̗8զօ|-[Frr2UxZX-VrMU(.jתw۶ҬUAAf= ɌA&>~"0O=O=@R1o$/yѼI=?^{ҰQylٴujӠa9Jꑕw[K.{vX4 kV!YCUaƬpmhب!o~vV6}V[*CP{k֭[gjtg4^zѦMv łMkIꪀ9}8~,u<5)wDn~lr$pÍd bJkh}9(P{.g/"`۰Z-EpPW/sHGat.ߩ]uҸ)ıIIOIK~Ϳ])!Yt+HtBH4Qkh F.ΰŰB U;uuį!#q QqBqԐ$*U 0imj4j'@thQg+Jk%ZQtP(ҭu:yv0"B#Z+{ܽ/ ݝ W`ƹŻKJ-߹…p{F8 )ϚN(aJXp8Rr𚙓ITdet;wKgoA"HW%U]atYz# M83BsVՒ߱¨48/QI0*B O{hJEH+N+JkuIVd(.&4)$T(cj)]!Hٌ񥮹Kpww/.x= &(}gѽ.YIa`-_ѐf> -'!dd{C)É2Z+V oܹ飹MCqg#F˩qQp# )h2_ ?NtxS驓<:Zr-JkZipEG9 )KݏcIxvY[Z[C!aN44Wktw]y<6(nymnd~[g6;Rj5}#Rً⩡+th܇+`djhi 1pqM˟.VgMY~OmU\8tq;դ@w䏟 ZiVZD&\]UP(Jۑܑn=F9[Xм '^qQ Wrǘbcp']8KBͫ04KX\9Fڟ~R tf|zZHGό{nwr&cڛoH^)3>ctK4O|B >t6ҮVZ+G@IW*P(%F GWYYv7ivq40 ͸tPfηÞtIviNf)FAgahӌ#`<}4kTQx9Od.8 vE%Fjfhz? ,q !g׻^iz;{h=_nu-TƔJkҺZ_b:P(%FH#ubvf{d~*[tRd4O2235j4 / 22e#9cw !\1rox9ht%<[( 4|V,ɓU0^qpMta49 gsW;%^y!yANZi6"VZ{FB7tRr2 Eqp::yXD]qy 1|^hzF5BDy<)1yHivKZQP(J^yos 232p>3ڣ?otИ=EV,_AXx8K}Ho~&OBJJ H\\\rʫEb~}/\.@Ff&[ M5vǭDFFէw_|s7j W|l%,< 4>WHdygmazHOO[jb ҢEs|59v=0iDbb}h ?ۯ>Hw snX-Z6hFL<11ٽis,|A7,boNxD8=zg8˷֦͎O^YZ?Oעks|V{ /$3~3n֎(Ÿgǚw~7OznݻЈqOX,Uз~t$aa6W>_o.X?}Gґ$*EUbܳc]uضS_`Wl޸_'.cǶ\ Rc|#zŋ ';P4>1ODP(J{+n|1 c0ݎu3=X߬Z9azZHKM3&3V]L|v"όkua֌,ϏGs2+^΄FاWPZU*TZ|OgV!K^WHA)};x 79޹}'0[vl&22"66JBpC8lNXD;~ӣCD dϟG|;srE-VZ;xF]C1Oócչ3i$&MxŠHOK'##Ɛ8^*@'}kݨIcN];}#iӮ Ǎk7x8e)3v]'%9_}u_1s,xt ޚ/Ư+_ 72$vL$%9 eVN-翾o|˒o4Mh⡵]H v]'3+?KaWyx}\}QZFzz:CǑqxnD4޻펭3zkhаŽ BQb|pJiErk?j֮WkDFWMVetHJJ +a7wDBdt$v_#S'O1ւpaXff&V&;+ÇpIޟI+wԫWFRQԭF4lL=ؿoM7ER ؙ_DJG^p0m?L<0L:;0~DZm=#3h({e&mnS4cڒVqMANݥҺ8u6=NLLetFzjѕuaDD60z|#_^>Ms`tFjj{w<1Q@]~E8 vt=5Lt ?E붭KT8ό"c{@ELl),^nCY G̙Sq`~6kb~#u; л_/O[(Yuq-}XdY@PNB(1~KIlHdd6 yS'OѺm+z58_mH&H5pOzQOlٴonQ36aa]DzH,l0CQVr|,^O YSG5fzl$_nѢe t!Rɒ1ᆛgҴi] ӡ{4lܐ^{yvV%S_Iy8} iV]kbaR>Ah] ,[ _\sW Sc:O}) 6 t;?`IMIeoh֢Y+͚'j*t!شa37vrHqqU8{ 4Dw;Kޢn4IWXZEТ{E%KI,&qu^FMs9Ν;Gnn.Y{3߬wƯ~߭<tg9 !Չ%Tpi>[ڴ H|P(%FHKvf:Оh|DR:v68w6B~nύ{w?~ tW_ӎ*ժ]?ҫOKky-_t_Ŭnۊ=vZVwm}NNv#O>:R  ;O}*C(ytɳbEV۵KNL8| Mn~.i$٭ ¥ԺZ?#{?`ccYnۃNU<(?a#"`ӕqmxɑcrѺy%IFz׬{]9u[KVi<UC; q%#:܏ZI6z!<4 {v?qM ޷$HZ4ҡq캯#.j]>x9y=U.WP(J M_oWƉ'4OPz5Snך=?J\,u[DzuxEu0Hw6s2Hty7 <"V[vz>J6uaeB" BH3 xvz uaǶ]Ԯ[a녾xע Vr.*b 5zɢoahFʕ!lݒяeȰH)s@o-xvZu,R˵4oٌ끃QQL8FN9ο ~#}_~Fnq;Οٹ}MH:q:oyfx&'C۾ABruQo0?Dq\ = e׏[:?3[53SSS/хNvZqO$_Heۖdegq ts؟v7jPՂƑ#Gх_"JwYcS~3s<%isuk>ʺӳύg@o-lAH1w?"3+]عpg:'z=8{/gfeU,})G+7Z+PP(%ka.3"j|U?8Ģ7⦛oI 8nBXXc"'NS8{1?rM7` L9ٹTτ dﻶ(K+"YisukV+QHu3/xN{]c 9n2g\oBHvt o/]DLl ;ϙϔ3̚6]gܤ1\S6ƺإҺTJ6-2yrrsY2v!ueBxϸcxvDzI.)X]:ݿ~E;90YZ⚇]9'$$qܯ'пPN3L{nϞ'Ro?HV{2w@ ;^㥛YrpQzvCxxM5Ei^"j$//_buvY]ʅua O~ :]goiӄ&e I|L ?@Nq&ʧ9s4h8bS1k0*|URcI}D-Jی+ yGzJKҺPZE8/-7;~<=9Y|m3];Dpp06T= s2Md8C ݽsiZnAXx9J#K* X80K}* Bi]z(Khp`, FBXV< d(ci-ŹeM}n`7[ IsE0+E1\vJCi]zAĖ6M 0i:}ؘ8VE׍&P(%F] ыaF뻰a&n՝0]}2t]/v,|: (KuQaeH(Ν}jb֔RNB(1FP|vns5)൞Ci8֥Һ(L}>FY[ ].VkdjzSNB(12bַa!a!p~IS_uPZJң|ds[^6{DGWuvXAXV4Ld(.#Վ M 'זfx[T@pqR iiTu)X̠J*~+ҺPZi]Qy.Si0R5-m,tNpPr2{Pᛠ *Eq`+V H)m:Ucz6ǽ۩NM"#*b ,228}$W@taցAi]z(Kh]Q #33, AAVBCAPAV4d(. z?AAADGS'QI*7TDX"ã rkql{4xEZZ~+J.=֥GaZWd'FHanWX-V, ؈(la3:]r{]XtE$ۖK^Y[}W=tҺPZJҥ"IV+V\=EY}P;ܿ4hEM) |u顴.=֥*O 4T( Eqˍ w?ӡP( BP(lXIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/hybrid_checkbox.png0000664000175000017500000000255113203343735024060 0ustar jomajomaPNG  IHDR<=sBITOtEXtSoftwaregnome-screenshot>IDATHՖkLTGϹ(BWPHXh`_FiM1mmUV#mR#hZh"fA`ty#Kػޙ/;sf;3gPu:i}pΙ0EA%I?N c;{?wUFAGWlCB5ƈ'Fu:]Ngo̘8 Eѫ1X^FRCXCO$;Jc/*8 a8?80e/~Y;(=|:onk/xN浥-M @݌#΀s⌈1b 8G@ڑzkYUQt *pw9_}(ӟfYDמ+ oG0)Pr!$kiac޾pUԇNM0 JAAz?gC@>vĸ2[MmYhgV3`YpioG4޽3톈?к}"1sbь\2wVxXX'n'IA|UJ4E @s?_32[]GM2՝8Yʺ{JλXl?ϝu ︭qqIG.Ɓ3,^$͎ۭd#0Ti"E3P{m[Bt:ZEQ@P@D0pP}KJ^Q=IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/txdrm_options.png0000664000175000017500000003143013203343735023640 0ustar jomajomaPNG  IHDRNHsBITOtEXtSoftwaremate-screenshotȖJ IDATxw\Gǟ;;@@i h@)*( *vl5b|5&kD%j5أذ0v%5jP~vf?voYND~3L}~WPNs㮞2եd$ǞצqՉTJyٱj%'/SX"8Ԗߪko@u`o^N>AFNr#Ufc-oz /;'^m/Z snwjD*; j]aS0ẸÍ4*ք2R!FoD*7ֹ֖F(Һ]qe(%RVwp`2_@( a2눈RL7K01c̺D*5R1cG %@;~#RZcQy|#;c_͡FuN""ϟϝK5[;gW/ #Ξ9h >|RFa?wi,w@XW.0& SO5?SݣVX5| F捛G''G]^ݗ^?y/gϝ *r /_rΝ;3g /_TTK,aeYSR ,:"c{ -5m"᥵Mb:q:*VYYY!kkq ꖖ BAQ\أ쟇vntg*w?[i}ktBݻ׷/%͛ KMrJJy s]jD Ѿ _%b:S(]úm}:;I8ܟ1=|Kd9ĠVrGvv=!nck/uglmlڦetJRf/b}&Ofӎ ꜜȎ=/,W7n_?}g.Dv앜̍@` W^'ŝ>>lsڅ c3XXX(J:":  =736k0)7Zפ{=̤:SX*K6@ܢU_Sʏ?lݿOپ+F?NDT'!n?ڰc0%cHXa ׬?yvئ97"Tpبp~E{KR:pRQ/f5RB 6ڻeB I|SsDJ # `JE)-{C$)u~"?FSLjZ~>*+'\';7˘Y<2H SJ{y>AUA'R:YU,V՜})80T8򈏣dfr*5׺KI`.9;LJ&#"(F#L=GD$#"RD) 爈sDDJ` 09hRT*oU˗&9yyR mY!yܼ|LVGR%i{h$Ljn!b&- 6'%|XML@BRb.u0L|H~+B˛eh=Gq  :m8 l&Ί655%{#7[,$_ @VgS4ERNhaE0毆*DNrхHhLA0ϭ2KDJ" 's|B((W  ( !o'.`׀k"K%R sX۴=06 DQy@8nPlFJA0UE  EZp\< PzdY9yZ^BKa8)tx+7rhϔ;$ wkJQ6' !(Rxg"!ڦ9 fs Es0#yB(`{. (֝ۊ^ `A{ps۶xxylڸqà—:.Om51#Lz{i /\jB̞mlm܃H[ѻZt5ޥRbFoT~u blyfW\%s%aA=[ 1A k=}'1P 4]BeamcxNrrr-YbɊJIaeK.aSܾ1B͙دiWX%,3vQٹ}_f-B~@.j]#D0S4AXw_ab԰O|ri7o{ʹl:eHP}ϞwT룚]#ھkjo阋_w (6l`@hEz7邎y7S'\\=>}k7oܸqaBKJLhܥ;4h`B^t9Kxff#W.^^dsr:|$"kM&uٓa:wawx"MY,B.?}L.C憆lݞmKLX0G:+JrnmmyRSLX٥c'XvO/%+9&d{ }l#[mqH\H`\.GDMYiS|YX2xƨ !mѽc*cB/ukĿhZec'})7o z \0-˗Ms(Ry`ARimJc[MqJ 6_trj!Y6m2Tbk1 m֊6Pi,_bkHf:|Ȗ7H9RƜJQ_e`LD-S/D20&e`DD-SQˠ| LsePNQrW@D-B20mD-B20mD-B20mD-B20mI`Ϯ?N^l7.]4lP^"j!jOݰUP5gOX뛶2V=9/tj!ܲu!C2qF%20 kkݰGמ޼ڜ8~͐0\sL ȰA-䔔1 kڦyZ7oc]~?MY̙528a##f_yTO gdݸֽc׬\{[wћ)>Yw=OZc9 DZoBV{yy{ƍ; rhSl2k;>>E[Ҽe/_823E;~̥k#" & Z0oA9ff-чe`7wn޸ԮwCo**Q|^<|zta<=6l2d)>!?5Qfv)ߵi޶ePz3aϟ*M6ʥePϭo@FzƝwbqۭo6-ֶ{wUOa#FM!yeeg 0!5^xy%TA &ۜ~6ڴo֨Eƭ*>۷8zb9jq㻏 Riψ^ [ | g䢥 e0>bc]j!!fŒ_ULd BL㦁/xǑQaB{:o[&ePׯl$#=#//os&۵}7=rw^gN:o}[]?Pmmh*V:r5+0~A;Ƙ0[n߶ͣV~#Z4~R2a!2e7:t+GV=8h?%&&]{$.V&7|uy` Ϝ:$f|`7 "ɹ[mOٖeP~q |333?rk}{4ohfV|ʛT$έ=nj-I%܄Vo1f65zܗC?3K{w /Vj.zmhXMigb0>~p(qh44E\M bd32(!665kȱ;5kjkkg  9B}SgNmƕ:6\`yZ=wltg?Lh1M«W=}n΍%j 2(>NNNݣ7l-[\kV^lٺ]R[!6_#;`7!> ٫Pz{{@h9"+Mד̷Doi9,yδf˞Rܿ'a@`}%+DA ˝㜉&W3n9ׯv6o\ӷvڻ;O/Ɓl~}$ 71v،fGfg'J}pƩ;wܼ=Mr/f~7MsyI'?kZy29EQW.ru[W! J Qˠ9J"wh~m䀚ePZM"Gѳ '2̀Qˠ L/D20&L+QZVD}!1 aZD2(D"jQ#  e`ZD2YC PEDʑ0TBD-c"jzD}!1 D-#"jZ僨e`ڞCD-rZ"ji#ji#ji#j8{쥋OWS/^6 vH2,: j#jObp˗FS̚^Ut:6'MU#ccvWhM,#ԙ3Ax5]oulbM6Aݿw[xdO'Uk5h^w9¢͙دiWXI[4!e 8eRpΆ"+U*ss3hU܅ڶh*zfVeԩ.j<)L ѡ5jhbDСmڏՇeC---ݻ+_MRSR EH 5a@VVwIDAT];vkݼ SY*#7iܰxkiҺݺVZ*4 ^N>zamw5]/]f>d4ml93._F|9aCٵc7Ё؛7p\Z2Snn>GQK~]WΝ BH",--{WT`:iZúvxeO.ea{W AHC0˜AXF4⤲0 ! L͛7:ul?~7ĘjW/q91*>\]Dyˉ0f WF e@h5 bu9{ӴLڱ޾D!%Xo)1>/^daiakk6䭻sxBhE2 hZ6mM _jѪv%`E_oKaa`|un."W*U_u=++tUbcB,O=t{H¢.y ͫUÍ ^5`3fd`֜1СC#G?~ĉߩ4Lō0>o%i#uXWbs32n\{FwT.OBC?֦Cg4ku F*Ԁs[wdNHimڰmWbnh̹l.6lrXxyo{&A_d/]Q<|Do7 SN{׮]ſThn!q7f nT1r֝GO]0GV?|T*k~{K=~]q-(uUˀq'RRjA7 !t}{o۽/uQHX[duڕ1 !`Fד~7/-\6cO|N]RS-[K&&&}t';;[xd]̘gn:yotv E"fϛxԘC޽sϤO_8W_;cv>~!//Og2пj"񻹹ݸq㭦((1LM@/g-;s"\]]}3C/_(} 8))@SbbbѥeNuZwduSZ!~7G`Ź s/'xz{ty}3eж?ڍ3n;dKx દ(y1G'}@.MZeqo։zw`]аJPɻj<::준 ҹAj FXВm{6ooPϧ޿7\ށFחyyy`gϛ3=k~_-:"9i4A-+f͚O>e?y5) sYrkGo[t^V[#NAP˦HMKKOO߿@A#B0&adffT*Wuam*UJ،Dwp7rtZ,ZSx=qNNH>mcnONJ}SI@'O\t)%%eΝ{.)7h6pB!|)W3n9ׯ|S[.d릭j?/f6>Q*HmD}>'SCZ=z? :0>Lp]c̟[fi7o}f-b>yjF}=­G%L0BH=3ӥffMo&O7zaΟGdR\ޱS%trrr <~8S<}>w P$)rs.߽jo`miE4MWuQbYe,pj߬ y+8(ĂXIOz~9G&ͫ.Ѵ&rSZ.iGҿsr9zp-Jӆ^&R ilE]QkHyb7Bb*7m\Vu+S9kH Iʜ'//oMzb:6&v1#G`Ӈ>x ٠a=͘emsgm .ydtT~t ze;;~STRtߏ="4lHAAZ@5*Qpi.qqs}ɩGƏԬE3Q*]Ɓ;?]^KWJL&}*}Zm~:~"3d  :{l-<~X`(Dơ)"񸉟)̯XdØGARg9SSR׮\c k\zWsg>oZRbZh=veFM6YwcwG?q[4筿mv333`j{+G\\\^J7ΫĤZ.. u)G'G^u/8¼J[Ldzf(%+ ߠ7s*n w K_ҋt@b+HOOK+IS&vx̬ͬ~y_J0bZqR]v/EdDFջ?"5cX\.Kb1HW:?Pr}'}{w]<Hppt;eشucCԳGCV_9˗433U˹"={|鰐a [N}jhVuY>u4-;whو_QD,0j5~|LrϜR3nt{[iՠAz޵'d΁UZNY4@O+rS9!dʵJr{_:w_οS;F%i]]>?we}/[$HjZLKtzwT"E:D;T?ZfbR)pE cT߭?b1˰bXBq,˰&Pv 5'T8BQps BbTpr5)TrRrGD"߶Ba)(JpYsbZ, ( ?!!rLZɰLi1,ȮZ !a !qBŨ/::mZK'UwQ(#T]pV7~pCe]cedgnM nMgJdhkB*st 0~_~ު56&ַe{aj+wnޤepv>g7zO+Zw50khڲo._'sgϪT*a7 PIr:zfէ_#3H,ϟ~IcgL֍[NNh;rhw5ÒW._m[o߸GF=~vkWkl)H?@eT9=30aB|c2XܽD"է׈Q7oaC$ɦ~^xe=e$%%c+7OQG}'g&M=D?ؘ̬SD4j"`?(eTzf 7V1}cĸ:9;igkӮMT}(mݪi4.&WW݉ͼGΜ?EQ榦bKn 8dС`~?*wS!ʫ]v Ysgsss#F3gб#ܾ텽& 1;;;>rƭ_yWzgiWnR!f|"^VGر}/?w.{}{b6ś/YѫOOHԨq#ToPY[X%=}qIOm6ӸᣆiϜf͛ ڧM[W_ēmg@g}!w5|4!- <ޝ(⟔<42(c9.5#97G27tq!jC"]-^**wQBP!$0 B7Q S {CQ-iZ]*,PJbfU*Q1TF@ͨ4-%frsD;B6lPM+]@B!@QEh*Yt)_/!LS,[|~eu&xռnt&M}9:M.UBԌZ*#2Tf*3퀩|IEEf ā(l4mW5+^XX=Gf4^OWp)JYP" Ce8±)*cR@{ ))H~" _I6*êצP4MY:Knb՜Y_I5qoN6+N84"}:jN"M2FH-ީLԯV-gsEwËu_JrͪrE+ZQm}+$ˇ›g:Ej*Yڷg_nN=F8ѕ ˰*F-%ǁiJ 5'ɯRnEݴ,lZjZ`nbߧ~\? 2,˲R)\vAn*eJL|Y\OygNޥ8mKRkSEoZC?[l  !DGGY7J/Rte(|h[o^@Q+^VtRyyyǏG4lxxJqܲ(g kf)U?GGEۺD=`=W/_]~!V^ 8R,TE"mRa{Xc~2Yψ6Cѿ)+skѹ{Cw9⥔Vy62+cFnb<`pGqEX:x@HtT+jv*~w/puѓ 2Qς9993!w.\K.ӿ}~/Z#W+6͟GMޡMvƎ ݢ{t/04x˄[ةۯ[~k6tرol 44}rlWxR}t?he>m7{5ð>2ݾmG=ڷzZcׯ{~ݺᘴ ey9 a p<_2 /f3VX50U3N53OԔPX`a8ѝB?ɖ~hHXIGvnѣǞ>yz칧O=z,;'[wsw4Bw>cz :sde+ؽG9}-Zвu-~Yriu7jhwnߝ>y?Ϥx6\ڋ.M0dGW/_At̶]oPNlcE۝8AQ nus"O>q"_ѯ׀nA]WeN?e 2I 7\+~1egK$aW._m[b#F:"eQч+B;wH)))\:P(Κv庯#V&&^M]־C;Qi %%W%d2m~-1ĖP ]a048 DǴjĴyڲ]}=1]wMKKaڮzwJu0(|v| Tڢe/^ulGizq7l)ew =/(((=Rs޹ۯ`Xŋ*•ޗ|?%kٶBbTڔX XxҽQ!Ba/=˔LL=/|ApڣɿO7jڕf}vUUU ͛ dd8YcR3 K,αdX仫_[0W$9񿊌,DzK<24M3 #JRZ}V$D4ӕ_le6mwDDY VmoRWSDzH$R4-U*ǖ\OgYq>>— "8cYb{kiv66֥ R}MUҲ,sŒ3*FżH$ڭ[NT>{o.wc7m8NR_G[ުWB^~]2!?h`$Js@RwrcJ:8?z;ww 1WdESn=[c9BS8BDZ:33m6<2ش4~ZNIIUUmrD"f9s#φG=K\S9*[kWɯjuZf+DۚfdWuؾ_}B|?2tpP#Y`k/צcWoS09CN]+m~V_EQT{v/^ߡM}_3 ڷ~͆{ 2]+_ΩȊ'RqBD D~fpMmhf̓L=GOy2jȜ4mG;|4#Qbuٵt5)1DYJubċe.R{^&RPi󆆍VuEP䧼N`k1C9}M3D9qokTQ(4#e떚{ I.7e&Ri. Wo4T'͗<ڲMyk9`#epDݴn{ W 5LnuSRbw3/ܤ- U7 E~bKLV/;7w-_7S""kkt:+7{w߾s{qomJ)ѣGJJJxx rssIII֭ӧfeem޼ƍ7v،{LUV:T1l3}&??άv?w监rcǎ>>>RY"##'NH`mm^lfI&|>4L߾Yjò^:zʯgIIN1iDi+dɒ9u:;;;;;߼yիWVVV/^ҥK?ӑ#G޼y̵tƍV_uoߜ=1#h1سq֭\jem584B:OmX⒒ZjUf!C}O>}/_^zxw9^K믿V^imm]...YYYV\\W_/Zt}N>ݺu뷮[ՙPtaccbo\ۮmvv6嗫s*USL9p=zشi˲7o 3gB>|haaٳgL0"aw6y;9;=~hݪuQ鏍}e޽vOwvvo{yyիcoooee5aJrJwww++q׮]`mma[[vegg_~]{Ak >)_eocߨktyVM>'*n ?npVg74J 7ouwFIDATf}#Jn"/a "3|($TbZ,71{,+7Er3GU cTb\nb*e\SCe"1r4+e|U EQZ,8!,`3CGY5>@x !F= ;M*qg#caqQ>;N n|tgqUpp>+WE6>~(n+W(n+W}6JۼU&Q-ԩSҪoTJV/_¿}MZ9_1v Iw}6o9,dW ##q}[kq_ܽsWvL !3gtvv̌SNJJ ?˗ٳkOJ~ǏڿRTTεjj֬VJx?wwwqΘrWn^㲳s_=w񟍛4nrVfO6[X\z3LH$]w8zBT}_C?uV~x,BJKK{iƍtݵkWNrrrS={УG8~8KMMMHHxO?4rHmV%ZėGwtŚu%I>Fye.m[.@Pԛ6o`.f?ζ4H$RԣcpHIN֣333MLL,,,h'9::~weV@"5ڵkCuҥf͚i,\pɣG5fdd 4';;D Øo?*1nNEQi&*><{lqn_3/~\327/!gss֫;nؓ6ߧS@GJu]8~k@SSS%y{{oذ!?h-[ڵҥKW*;v}'ENN:vXxxx&Mso^z{\5h100pƌB$-u~оyW+03TUzvԭw9ne]F #928x'L88t ?4`rK677?wƍ###5kOںuѣ/[y󦓓T^R_<:u*:ujڴiRU&ig~qJJʓ'Oo~m&èDKٴIdW{ wf =}ɳ5Ĥvڃ x~ZZz)]>|^zQPsݺu[xvJV#""/xTjnnwz}}iZ~<<<ݻ]\j}2$x֌_īc;_B=||6m[;3TU海[);殮@BBèGÆ f:8dM}dGqVd>CBBo#((rþЧOK6}n޼ٶm[ž>?s5o64dXk[6m]~gO';4ig ZxMePoڼA={"O}w`-'<{3 5ӸJZfw۷EӦMƌ;Պ+JhѢ3g\xQO׮]{ڵk?VoV&D"{{{{{{QF͟?gϞz|o=+49iҴ*V 43n|FٟD{K[cϐSU>6/rpgcaqǕ"}62w~8쳑1ϸaA}_7>VB\K@@ȸ Vx d6[Y!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 B+ Ç 3/NQOd;5w]hffVBx.]Ի{A;u !d]S=y AAQ]:] 널Q+ զݷW=z3fM?~$'UX-W5՗_}`ffvҙ*BFߧBH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*BH`*&.6[cz TcT.TAB5vXZ=BEOTx dYBP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$P}9mw?w |EU !V{?{^<!qZ!dĊB9[W._߱ 널Q+ T޵[`#Ow޵ 널Q+U:YyyyR!֊QFNN b*+vK=//GUUmZ!B_>cjuBP=狐 C0T C0T C0T C0T C0T C0T C0T C0T C0T C0T CR}k Qjʅ*8(@@B\K"VkBf[e2z,`!a !a !a !a !a !a !a !a !a !a !a !a !aXQ -SM[Nc;#B<8Svfai9ϫNb?a|Wsf6hX*+M?\{WUmJ'Y]{_(T~#/7wPOWPuBȈjo- P̀S!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 BP!$0 B?Kq1D=1*P ?T%bcVuP)IozCe4TpNUWIlmm((eB^^MNNaYv737{L.(J@ --IRS(H)JT曘YFVXUy"w¹ggg 5|X,T Tyy [[;yy66ֶ66Qlmm_~mmm@瑖VbD%%q,cb"UU *Ȥb+Cl$JGV6DDsd,*ʜWz8^DѮ.V]uqweiiRv6Vn\stKe9V_֭+p9Y=H$V99nueg%ʖHԔ˗M{VUM>>'#cT^M&пc~~^⋄Q \\"[D,dgݾ}y Z$`^gg*9J`HAjIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/txdrm_compression.png0000664000175000017500000000435513203343735024514 0ustar jomajomaPNG  IHDRT$G3 pHYs  tIME eY@IDATxkTgfvvUXA] r$Fxk̭Qkjc մFU%5`NMZMlz^UcA. xADw݅ݝ~XO]csg}\$PTT|<,/e팛c?zX~?PE1{]l:1bĈcnjڶm,&+v(Uh4n0}cDڕ7L[DO[+hQoU-~:,5j.UE [![[ŧcj*t~HgN 691e{۵nZmҲsϜ{j0 =n?G8A:ŪJWGG?8.&*V/VUV^=Ok-o+)dkeICS' )sK# fp !̷Dźg1Qe̷ͨ;?ǵ@LoWJjZj‹ԋDzH)i )Cbw#]]?&<-gyF9!b:օQ,nq50 TLyb^DD\@\ҭf;+\4|r KYۏ)<{q%+{b[ER|XF >2g_sCLq!;,VۀW}ïKYA-]>DŲ2łyىdj=XcA)H&gU5RGHϜRIONj##8kU~AONZՙ a}fm]5O6d8zkdJjtsz__@LPҲEQl>OeyƦan;?\9_;qC@[^7JẙK>Jܲ8qm߂&n0D֚f]5xDzD?O nu"X0/#sqX쬪>Ze&ˬ~ڿqs 26Ӛ |g#E_.$t:J!چ끁zIݾ7날oLL.EͫZ..z؄7>!"F;q0a˶xtCC//y} cfot$^~ >jPƥZWs_t"'bԊ""u8ycF44x׳޹ CMMl 8)繙v;-{ʋ*!UzQl'/W f{I%=N.`vyr`6Ģq,gz4oM?<<'O&b|/?l F%\?4W"ww㻽?C|B_Iy""2ܲJ9fC2e%+zv󋝱!Ώe~w*KD2,˲ 9/2"ZͫZYZ-G 1GE&ʝ ,P|z GY29L=:uI:MEnzJC|<{qHdn'"yQE~xQ|,q܎_?1091 R<ؚ:lvgYVũԼZͫU2J*R.j8^=Ւ(IrRB*j啝yyB{Rc 7m Q]ګ%'RS%%`+atV%'E)9sի($Oy>PCCww~(B營$I=e.*s:33ijf:.~z]nW옕#fDz/%J47\( ~^_I!IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/fixdrm.html0000664000175000017500000000611413203343735022401 0ustar jomajoma QSSTV: Sending FIX in DRM
Sending FIX in DRM
fix.png

When the image you transmitted is not correctly received, the other station can send a BSR. When you receive a BSR and it is destined for you, then the above popup will show. You can either send the fix or cancel.
If the BSR is not for you then the following window will pop-up for a few seconds.

bsr_nfy.png
qsstv_9.2.6/qsstv/documentation/manual/manual/fix.png0000664000175000017500000016307313203343735021526 0ustar jomajomaPNG  IHDRLxsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxUlM'$!@WDPVxADQQD4Qi/(|PĆ 靐HOv3$$D%39;gN3 hۦYv!B\Yr36 *D'w(n:oz/O[#(W=-,<[ds-J1>pO2ź79̳S'yl=)2 h/ùI Wxn4 uN=sXt');oC1"6 .YQ` I_[|9D m۴2˔ +B!b {XX孕B!t^!Rڶie\z!"HO@ZB!D)c0/dZB!hyrWC!1M<^^g`YTV 6d/O!B3^m5*[1a rbZ&뎤lQX ._iۦt nA  eph&dx53%02NTY,rtlB!J\Z޺옆i( j$d2dV{Mv{ʺT-w 311f9Q0SB~ hha}!*l71W5i1% !x^T&M,4m9i74ߪ-z.&ԙ |%ɴuX͑Sb\_Zzn_ fNx5_0Or) B!i2<&rs]ϐf^4MC)"Է'el'XNUJ`CS3*V=0mr#Ok{#䙞PN|v-%` B\.^2sp,qeOۙCUBݕItP]}[1[~vǩPnud3Q-}]wG#BSY 0" !x>EyHr뼻~x;\1gW&OΠ}I9X-k_[NI3ow8{o7Y&``sl_>+KHt^B+Tr(9y0*ڎUX?ng:1tM;1w 4-)6E7e"Ť-B!4ML/OmFZ2umćky40ReΨ(8 o^uC?qj]xξMԣT0قdn| {_/-n*B\eE!ӕ]70&toݘeQN(Bm*Y.7\I-wÎSSΓ 7'O1`GTanbЃ[yaNL!t@30txLwflX=Қs<*Vd-ou'L^͡㙬l2/3q4߅B\=,O'4 @Nu975tӵ؏3j6Var-Y219%VikHZp``ޔh6=>8Mdmw!W UXqsEy!'v6#LJj!,]-vVڶielS^0o=ȁC-ě"GWq9%;ˋh8o!+LJ3.]!UGu" &% JbeHb0Y;6?%Y^!Χ4 ɠ= "7MP*tƆ\;33BVmXv/q+OB!Y4 0.-Xk6.jX]NyZ,XO;u !Ej#341M%j*V,FK]! 4EES DV,-w!D !rʄBRFZB!D)#-w!ݹEB!UCYhyc[.w=Bq|kB!J B!D)#]!(e$ !w!.B2܅BRFBQHpB!J B!D)c)iF׃]̺!Df)Of+QwO-#Gvc%:B!ΤXX+$7CU .ゃ%g˯/K ғ(څX!2uC9-lvAMuʸc?}مBq ܢ3 ?|FHv/xBix&R *Bba S+]BK"..rWA+˅wb-I6!B?(Yp1\F!BBx(w\VNē++Aec?wqR3BEX1\%k_dxǂ5o*)Gͽ1Ax~MmBs"nOQz9X&]y[q4"ox79w3k#q2bF~qw{9)X7e{y59Eԟrb^"0$r2'9JVUȊf7QֽSr_#4 ݃nV HĢXziF}?wRo?L,1=4y^;>1_1uE[fhϮiz[XI~ti63=2n} x0 !. r:@utTb4// ^zv"I|w^y| ;$W,_,4aUbDzlpl<ޞ=|ʛdGRPܻb¤َ}G'4aޫ7>$e}3E0+֛pTs TL݇O1 P-$m 0H߾DjЧ~H^q X bk٨| _EYK5%;JXwݥbKPUC?)XuwAt:x9l~L3{ed:JD}:<&PuP7M>hbbq &BٚA\u| SK)ʣYĿ?%}hC__Q6ߵJ$~b2kqoln揘EVω`4~;Gndݩ&1BExg{k((\yi1X 7 C5l؉v=/ծ9/l(K*b%#|Y0?ӏ_K0fMb8HPoϬc %MOĺ*q&)[`꜑ ^Uox+/[C_g!淟v!KwJd1AusN_r F̅ /K>fcHOf zva5mU!;囷5@sgGvW"Uj^Guu eb<°߬5i5Wdr=ojCMvm`.;>X^~A 49=?˓ S\~[2ߢtl p&q:bZ*/$f(j㝾C }4y[OT(uU^AX5]֗ɄnO(W#mkC.t+ y&c'BFyHNBh4!>(B+B1<&zF"rc# G3{,|͓sn#!:dy /ɀ͟νO>B^>PxELRT67'Re$4v4qQb{A4{7qĆ)в;j#U!ȼVbʇ8MvW6OtC BLwRY_}7婱AAբhcdk2$/og K YMªDc e@ëg3| - 鄽dnK"e@CAt]y֑ >륥CYՇ)Cx/K-AcĊ93{@ 8({ohȠiP1P$Խn7 ԫ1c?l[D̺`ɻ_k&7?pƌ O`CAM-w͟ u 6zkAt)oq?н]KCQ~liöwҳtW<_2;ojGĒ5 k%ÄŽH'uYq{B+۔k+?{*_dj嫆')Fp1tڇʏζdK.i6Gg(kwP~s[tcǘ03b !(h4 {2x"[5+#c*X0Ow+ iSoV3h 5p6#W"F>7IqR& Vl %VC׵ީ|7;o7~2ttT,5pe9B`?NDBR":Z|ɀ*rIb+S3R>rusxƃtLo"∪Fjkڔrz0p)9Tg>KX ȚNƒ0nZSd 2sjp+͟k}?fӘԻ^_4{Tn ǃY~ Y-~.4MCUCAǣϐN_9 ,ߐBێr|J:s&iDzRyۢn9!*\=j 4l;JsmϘ],#|+|8ᅰ?mA4KY= A;hH %{v/t nv˜k3h\q-ԪĈ9hxv؇fB4'[W9>*EKߓPkh!ދ;!L.# ±`ܼxN [&Ly+uNR8FATE݋ny ݧ={;p;{YeXpSt my=ˣTn}7: |F 7鮳>Ͷjt t @͌]Ȅ3k@dZz6vVx~K=+a/_`FCG[O\7Sg,z'³cc)X q>'D ]?-4ސZ={ 6'zFAh E/uXh9_Qs-ʨ8hG;r"Fxs}ʪ7S~ׇM#cɎj`Ejav,fܛo0;=S>IиN3i {Q-Žn~\0X^jZqL#ޟV>vURRj4" ѽPOysB^$;^nD ̗0j^>¹6wW55ީ #U>GZv UBYj(H*ńcW\0Q"!jG6~ɬ(wgAGS%(!r݄Z1Tr{.lkDաJFƎ-$b~pzY'"QZ4k.=ljc[v!6JM=[*\9C3=h<ªYڅʝ;'lذ.9ZMSßK= S`rM",u(O`$lޗoEES;'Zjч(MLd+n<%_*cmӦGtS-LWw5~&w R!q>5fgupr4%!-*ͻ3dX_n*^KȓH?p{F"2 &o}٘F牆V 3x?sQxyP^ς1Lz\ b~2 o vZʂY)xGd=ӽ\Md/ 4{8Cر-bq/`Lv5m9 85Dl-zsV׻m8NFK hLjAϙX*rk4f c@ zl"4[Y}X>xnXd|.;ەC־UBO?]jq,gԝ[u ]!jaJvv !W(O`.H~X9,% ݉73DB!D2S }~<[^h ߢ\VOexr1 yc'*ą3}>[y39)ث%;킃b%؝>Oc.jY +j7/b(=⊦9dRv1(JGGԸ ؒ=NQjԆ&q&+CI`B+a% uOB!ĥ#}B!D)#]!(e$ !w!.B2<[~sKQ!ĿD-.w(Jt+\;\z!~^rWAB!J B!D)#]!(e$ !w!.B2܅BRď|=}R޿% 0=3`l58&w=|Mf`Y%V#ag G0i[K^ރV@ ZPK`:t3JxeBva! !hԴ)ʙͬ|4f"_l3c U5SޝÊ-xmQ4(B$V3Ykwq8-(VoocWT\k/?ԌP$;]y~55#ϼͼQs^'f=KSܵ%#1_zJ*ٜxqV ?ِ^i:+0 uJc^PhF,בU)ږӈr Ut['bV}; G6F`!|Ӑ*gsxTYj,D6G?= 1'km37SN:crVV=oM'irϛ6~#/Oe˩q'Fc/@!( 0npSc=BYٔ{T+Z%A[0JXPpkB2T\O19~% Oif:{[1tT#JPx\_}2=GC-Dx!wq{P u?g̽Ƞ[,6 ntP,-`faYT'oߓUʜzq|v2nf٪r{ Opmt^,zkT?@*ӱa"??7c]/%4|Ӭ 7.~b[ou-iKQ6F{c<:C?YAPi񖊷 94o*wt̝;χoKB8r&#o([Z/pl!7 B5|kk^(&k_j4-#d}LW|k,vXFm>pmA]gVyoz$+ƺ| >L*1M>pO Bq5P,obg6wUBV?YE-.w5(վ[4 BFBQHpB!J B!D)sw/ 0i_d!_* ,?"WBQܳ}-5=qqWzkF*?IǸ8~wæ򀻈lB+EZF'#:|7q1C|˪+4IR~HOHS7c6'|)HOH{4?ajn͟ɟzOw?#}O`]*^s}C=/A6ۗǻ}): A|&f;L[;sTBkCҳA0KfRL$uT=:7&u\[m&"VB!@[^'+9 o3?c_Fjf|IS6CjZ^w? gHzfDk{~H|Xw̪Mv%f#_s O#@,jgۼ|;7|͆ ]PVp95R/O:Ys ܞC؊==Wat˿![it !:]n䐒 N7 2;4znj )9xI޺,[]p*F+۔k+?#Ps} _ѷnl.  S^jIŕzo0>_zN B\GE ك=LoN! MM&aNsao iޥnrsƀ#Ls@yרs.T"us_-Ƴ׶&XuB!'n\`xǼm UE@L;A6pc%~-=YEֻ~"rJ+/kדܫ  x,|*صOMU)h܅2}9dz@[y!l߾rWA+5H<& ? \t$W XpjPC3=h<ªYڅʡYs7=77$BK%>a6c6HOɯgEz$輻BK'ՊKZa 'UuI7V"Ms9rpԾ!'RX.V׻m8NFKP)a f(&UhѺvPiTe0tZ(;]uk߿EqFPa'=ZI]!UIYhyc[as\VIQZf(pۥ.J>₺[LB!J B!D)#]!(e$ !w!.B2iT~هQ86-(;qO߇PAnh|gZOZ+M/.iϙ|SxW f.G~ٟ4tk8uz0\F|1c:y^!!r#sOS7c6'|wՂ]Y&AWZ*B!J4jqM.nc>bcj ?H=y=g+o;]xvl|$oMM0R~`##v|8l%8 Z5jrqMD_,5gY;kl\5];S'C!<.Mg%\ #9--`E +7wr{to$0sؿT@FA*h';MRkj3JeˬE( B!J5.hnӇ @VUxve*Ö/~{ Wy߬=P8Ÿ{}Dk@jx|Sns9M[g#˖xN 8htn/\qk?Y&*yS0 y(((rj#yE*&'rPk̼Sάf8]ɄYH|e=c++ }Nwu_*WyzKc` ~PMWuGAf_^ԒË+ aK}9 6͉K~뢋5\3C~͊'h mUp5xFMずQi_>a >d\B ڪc02i*8 M(4141 T8MSUY@n5>|f.(*6XAUjSP l>|dXiT40/ Vӂb|oBUP LᏅOjh&.n8>KPS=Ӭ( {C9|'EQPīd+i` ybڳAu( xAA.6(TQ?N]5D,[gmM`64 Z̦?)mxIv[gn˲/wrG8;fߒ<=)FMc`H#∪Fjkڔrz0p컵/Ŀr SbT5 \\*9pR*!01 U)b(Yng1-`MLӁbX@Q0ѭ誎Ca`bⱪpb7 RLţbCUUMCS3UsqM&::Abo{M_(E A35ˊaT(Di(xTk'[V5X ^ {ڰ`5U0P1UL\nՍfqPN6l; 6 tno5hw?/gɟ 8Z̙3Ϗm[Q$kMGWg2~.UQ@Ս$( k+yAXSģ]$)8"HPNhz;n4U-fĎ (XL Ba;tm.7zdzOz׋ kьbSRhKy"eqvlut jxrH1K`g7\A1I @6UJdXeעRez4O0M!Ly(Qk|?Gа6*,*HP0-n [!L sn0(:).ħ+ @]f7ga`^I;HE aXF.e1<2v^WFי3Tۊ(}Gv)ޑ߮)[ ZKfRL$LjԩHő_2,ݙjWUʪb`QU]L&\8t|)'H0M0Lf0 ;;R"êL f0 Ew`djuKrqr=s݀%TQخFY\5עnp]S*I87N@~RsRph6 **jQN\Xsj]&I1_1=O9n&i(౺0>l׆[0LʧG&U+<p(64݂ @!ǖaV3a+YB͂'#Ӧ4t+ +92fڥ]2)k߿EqFPa'=Zx5~]*R˶6AǶ6MK9!gL>wDr<[o vZʂY)xGd=ӽ_u)Bxd*<٤G]s -w=Fy385cypwVr5[~R)IȖ\z1XRl(.6 I]'IIacΟ85'<ɔ9J9K88Lkv9d%/e[S;Eu[m`?NB2kY~<,u (bh.LDW|*x\S'x:izXL4 oI3o5iG5el(\஘$xr2c&Z*db˶ f5hͮL!N0Z86-%W@'L}pdpၔ5xuM`Odg5+7DKGYhyc[as\_Bq׬q۾};V\BfS[򚎺E'TRcGx hTN,'vrdaYidd$(X,V"\(f;ˡ̣Bt(מZUفhFNVY[LMxs8G%D&9tk ($ƑXIN", KmÉB".i9HvJQT7$eg:v'xO UEYv#R~=lDFGХF0\|g9.$AnB Gu{4சrj2ij%""{Po0tGv&-3,Å[3P*x+8y :s}ٛУزI[˼]zJ+{,IdvDE-6 %JXp+I1\gQ+QQ%<i 3#[-p3nIsKOiY{"k$"`6/ݤey6Y140Q7dΣT!Y4u:4]փ;xtr=j9HQ!{CnQ|f9IIHDڂaǝ7ҜKv@ /A[nZc *KY^ƌ rl ǂ/aϫ&a"z 6UGX}>ܞ,5R Fj.6~Oajbwj* ׃aq<몊q9g1~""#(D&jwg6,To6P=;gj]CiGI/S5 GW?@A&7}Yh7F݆j}*-15 W" B`IZ=Rh:ۑt0s#XN_ ΀`ԍbHBAQ>sIHrvv iҸ6l#<" ZlL}8NIX~ u7^ ԨIzM Ҝ(n,^ծXb"IIIos[V5vAmIM秄XN@X}b:ܓGK B&p8|bqam`0Ȁ0B2B(MΡ+ǓG #>zp:k־?#{r,tEw#!vpT \bye.b+'x#f9|X1C"D)wٙ@Y'Ͷ;0|&{caiM8JMaFLߚ^WO1~'odGd]Ni'^Z. c/"UUm@.LLu+M hl^f)s`ѴZ-m]:͇LJ'\5Klbs' %DL fJ*kF{ַCylnB*py`7FX#:t."6O[,n7ŀ1C;F($ aXP̕tكز$i#G{6t1!-}Gtp >O:]z/8qKg9Hj +4}E3]$IRݣgX<4CU9G|.yba6aaee 9fOo,-?G0<:s 9VO[7I7}^Y&=p[v]Ʃ WfQ<YuIt IDATLhHgAlFJ8,L!;,uAp~&I wSiRrJlX7B?ıeΜg #s-SɕHWrԆzYiQ̯&28'KXk#J`Md#?%|9.{o9㼔:tp>!<V915Ũ嶛o\+Oit#_N3>=Ax0L.zvt0S=Se|gzu l\Dw~wCGyރ˘_(Zm֌"2h0͚MV!ؖ^5Y3fј"7cjd2 h ,Ɂaδf ;2Y)תez{{Y}/"dgSc?a͟aunV@tF(MOѰiymGYW^)ȆD4`i:G2+t-֖\.\aN#8) ӔnL'RfCkŹ~M"306]U&43 4 kts. ZLrl 0ո,x)Y5Eۡ|_ܽ:1#gWx_>}- Ξu65&cС/H¸=ANQ)[ 7 sKsȴdu.p2ylI^FF.n9ȾHIY LR=\&|yG0)hAPŭ;:LWJBTrԅ²]$3Xq-SsI|3aP6S/}ZIH2jTʥ}&F @cqxvjPɇ c]˫vFy8O*^[R3#W}9;uOF{A':o:txxGS#4&k^[TTAowl7Vj~Q9];[If*6CCi 3 .w3t ˜oq"Aw܉'Dv"uQԉ,Uu@aVWX*34D F *FY_Њ4h&y49Ck1E KecH)H)q]UJU% /X=3U3 |a?!3Ҩ%#4%|m^|1dY j*nS;+ obx۶vPp]MFzQìK&'B`k~2Ιڣ{z{sӌfw jѥzFxg}'iNӸe(ΗP} tSQh. "9BjPp查ݥ?]guq..A|}:tT.A/8}4eX*IQWp񍩜I`60OQ rLBqv hNhj*-E:+<2lڽg(-Pͯ%LJ+Dv&_~J2O",,[tuIf43=Nhi^EDF\=|w9l#5o~ |?oo{m|xmK_9jWѧn7}nƋ!FsݻkFy#o?_aۋƻvۤL x¡,:CX1W@iRHR4MZZ@_)mDu}8J G˳h`lYlXS,ȭ0 .YX-9Y$J] 8vi&Wca֮ |`_HÌHY?֍IM1pe2 uċ9sQlJ0&nzOؔ'fM]a7dG&2Ң2Tu8J'pISԩKK4yJ<E*)V) H(JUQI-QZI sdim[83 %HSʓ*vvi_O(`E*Ho233KVgwzZh h?/%?9wrj_n4JݡK]?}8??׼-ſ}uxߵh]Ahys, )o9?f{?6]ikoNwp`y'UU>o#|7<7:t8 x OƩI'R vIS *j CmfpIz#djUo 7+Y-P TR9%͑;r?F3!HShNYTJE˜,,L%7J-[w'{%"wQsW\~k#q'"gK93]̩icn(,X.t4sŒID4Κ!v^x1;y\=n_e$Z~%ddXIAA0© {QTI5gp4T%T@Fة 2S;@q4q09BA0`UԖ-Fuhj'` Zd"jXډ 4{Oᕃdη+C@˻k\ERH!vQ!qGuP#\TN;Ō5N!TkqVߓxxT$*5Bȳ&Z gfF%Z+M,i9<+UVJyrV1u|͛|~Ŷlp/5Wp>ƺb7o?5⃫ezʒHgSgZ`j~*s9?#]eyˏ2HL b,B(RA AsM {~OV?񌼑c\M}>̛[\zO޺WcT]:ޡyݫL-c.)*pp[kak-TUBvpi.⧁K3!yJ $<ʾ>k"se^{,Gv3IV0<2:*q_H8LO_,&j Fa˵%aF:,HE %2lʎ^2i,X`fe޾T\LM&ߗG@p)fs4J<Pi3* Y_<>F>"nz'Sru`ӫasPЕD U=Ow:tlg80~l"\U*1SQTT bEi:6p C-0\EQt]ZZQl j&8}`ͣT4H4Mwel=͖k~2*@yO??A\-\•8{a?|7&]s=С/ ZO%Yv%J2S\%L MhWbR8R%ڟ"`a)>tb&ғJLZ-,hqXYY,B2! l^%ٜzڊz501@loaq8xaN9IAG%-:RƔ`d6h |ƲKfS2GP%f[ L)ɈQ>fNΰv]~AsBDKA7HRQUk˶^ჇX_P*՝ܙ9E$ ӗE5HNvdv")4o<箤Sqݏ$>sKΏ];kr^ȍO{t}xW|;wǶo㾧4xɟۧ?k_w+H[ރ{>ĽO}&~ G| 8(I#YO1LH)&n&j4B08P`֛;9MI__XHAVZ(EEQQD#-j(;֢mp7OVf説G /tk,ڳTrr-y8fpAR55\3۪E|_!x*ݒ4KcZ7C,Sa* 97GG&BSPʫ,a+Z.CH hi.0"AxHWAAB4WAquDH!iv1 @AE#k y[Ҝ<=4 qdHQWT6tI'p Ԣz?jpjю%O/~/Sw|}JJe?%f3q}p:t9"U7)6Ǹ-&d ѺgfCtD!W)<dqOYcaز_ZFd8E8堘UVuF)Ȳ/G5r}OM"F4 D\n2l%ֈpjFۅSѤСtJZ^ADLbgNsI 3"UP9hd, ׳/!*Jq- $h6,Z~I=B6m⚂/@il!ϊU.RqH)TlBAAxmKRE83@ϐ(N.6w\oޭifN™YkvX4+4U}HU`[ϐ s+.?/:T* w$WsA0xKyϟY/:tJAn] pֽ& I4e92&hMDmPMf/͸qi=^I,^n_|JV c;w5Hk$ȣDWN&)Nֳ<8ȼ6?¸8YYa׆1BDi]N}erj cdqvJP%dC>G%S~5 Hi~ď|Tko i|JMh?h+WH 讠_"X'$iNf  X> ~CR5[DX%e• (O(lGܟ?/@:t? <`OtsiVE^>%HfRlKL>͌2@ BDAF O<~PP$V@GI2bA}gf$O$aczNbyiH5#s8(Q'†u$$sǑ-sb6}7K&'1q_SG&H^"_'8qb*Wxb An&D,Tz*7&cEEhqW=tGq]<0Yxˈ *XJN 4)Hi6F]D/M~}/yD]  ,f?+%.H$A1Pd[er,=/^-h4Ph,?Dzm*2>j3BKxh| bϡg*āC/oX P5]erH/ LΞfzjSO6fx$ɖM[HG2̌ҬJrFF>oк"KeټS噟BkhA55TBrЖ 8~p}?y.!8 j@tECx(8˧X} x8xUETB(v]FaNpzDINY)1.E5Ѐ$KmqM:(h R1Eyԅ}m㡻P!&fIdb)B XTA\8G^sl* /L*;֑FqOO ݭ!6my:Ǚ ^Ǵ,.X#&Օ &u JSi0C-bGa;!!g ЋXKW$I]P 6dj㇏3j ,,\2Ծ%GrhR45 P9h `U\s9CHA HL~n{?o:ޡC&Uz?D#R[PllS,e,zԧZx/hjQ$Πơy\]Ŋ1C(#r7il&Iq6Ĕ3RTm\סih.2衤U1>Bgc{X+Q OA*NJ Qؔ̑1ʁ"+Yal-'OD75Ht:[P6>[O!S1YDwfj4LV}p Z>*uƋGWxxH<.vM5qJo:Ǟx 7nLN}ϻ9OOʄNP<}-S]󫸔·oUڧKr4Y?[O͟gD6?̖Ow'ѡH!QBB G'"Xձr$p;O`2=Pvq6c@lP\ lpR|NCKlZdY.瓔K)x=*%6giZEz(DU bWҧlEWI_Gp0$6b#:]"oGT Or"z]\F lEm{8N DE-< G ~i>ikx P- KSϚܤ~IQ]ѤV&nbOu 4'wOBA.@HD#Ay.Ta_a2pxKNP)Dz_>8ϖ>^:7}꣼vwv\~?&=~:7Bi"1(.0Me5_g1Y4;HWCC(!<$HА5N#o"sIn;Lf$ fKi>6;NPKe5|cHаJPue'u| Bi*RH تj wunTiXQTh l)PFR} EBEH(ZH=P@@a7+zNDu\jjRŔ'u%!'vSO7i:LO`s0ƌ4Ѥ+Z<4q`ZQT?ܴ<{ ;BW)/{Rb ·/Wu&5xoVRm34E:|Vd㫿w-g%v/c?ffo@vjWT Xx 4(~|(UC#%<UJ\KH@  $A@ Er@"s mSvxA0J/Y5ζ=+XB WHiÏ)(H%^Bf6ظ-Tlĉ*!J> [:§!=T@{n[ k*ԞVM^&Ϯ WD۟] Ux)LGAw;nMDShEz*<E yvYE6O@@utQDxxp:4T+4D<+nb L^/ Rԉe'1iqꖯ29p]kU7t}=* -J&j]~I/1q8zwd|Cw~-ʵ1]box.%~>&xӇxIW-١CPxV-a4)̑ P)llEYŶW/"=Jzxm%'(Y_1 E,, C MT8~\Aj A{Q!] WYE(T-Nn?)⸞alU #ٴ>WS{낢9sӑ UpIL Dyb~kDNn?f֯|w~;̯o1.bj֫Xi]QF{kHA)<}V]rsw>7_Ɛ'ĭ,xC7?wd6_|k}٩6)6 (>p-ϼĆt:y%8!Bc k#'rQU{.s$0P]$F,݇ ᩻~os(wcA],t \H!c LxQFQU44[% djd:Z 1D-8%;2ѼxEe1B &SHIxI o]I* ;t;HǞYɺDO8]볺HZ.6;/o$Q҅ R'ǣ5!B6.;l8GȮwGawɓ]k ;7_&`ms2 AsTh o9$ZԜ{#7&~- r7]%K}bئ z DV`F`3,|k La9xDʂtE&sVV/^MAtL9PDdV@$sq.SnfNVEHf==Kn >f{͵YR&c*Xp$XM$N4n[i^gT70i+1}t t ǟkajGn!c`U-0p3W$$=(, J1fZo 8t)c fΉ̋H.[$8 F1?wf IEmm7S'+֬R)=zb!G]]XZُv#57~ dGF8>|_}.&ghsg{)Www2`_S772}هOLF]"d D AY 4#|Zt`*n"Du.uk8||]AMsh\Q::S^^W7/"a*\E>m=XG17X:IRC(C Ɩ1"0HDWETUӸg- YG&\Z/*Fc 31%j$j5!glu S׃V `tс *m J@w}\q@ ѭ+4,\,_}v-C$U(8!Rh7\pٹl^ó͇rϯk,Fb ꒓(* @OKi+f;~-C1 .dq7'PI4IҌϵܙ)M듴ċN5O?.SF)l9GM@8vX1s RԷpjᡇ1ztC˘'[53/fvX[%&Z+yqil$|kG~FoG93\vd,Iаr:QHa6aUٰnxAF<Ȝ g8}<[QL!tNq"C YIR(e-(L68& `*[_pRq@s] RT,D/:K›Xr-$UOJ2KYM8o6rpJhi{a&5;16w=RB0+سd1EAڢ<7wQ7 ` iG1g^JlofKC'̳po{@{m6c5{$|&D >Eq w':znmp*cIBhb,au# Cjn"{KSܘKCs#Pv2MRtΖ%B8m->dAH,uYdIBϼh3֚!E :wI'Pc !䁎]𺑌+a.@ i+떶vD%pQ4&K[HA9c[ jr8-%Jb]L2trA`GqF:ҋZq rfxm.rM X\CH' A"34a&PJ RqϖȄѝ @8f$EB@Zhme)A ZcBɱRD7a36&J]D?~ Xv=NMzec%3fl|P^QIPӓ%iv2z>Y|ҋ؂ d y9/F@HKAGGoEqN.XƅW8(w'g27cF p 8(f;-5IRĻHÕ 0[pq et(($Nl21\-cWȫ@3/mc[s}r?ߊ݀S{Y,FH]q]bl[m L7g=)6Otr9c7$ݶ+b 6SLT3/ҦOK~p#P Bqv`[;iʇM!%ư"`hB-S& -FJBAL$$'I9 &OJRs.eԠ /XĖbC\xx-G!lMu8KM8v \,z q>b$pp B ]EPP-OXJ; r(HsIT ^rS 21b||_ea´r syu2bTE9b^D%ěa3GOchNo3I"ֶ3[͠2:{Xw)KqGjcgs2`\ވ/>{)k}ߜDS<)DG\:g1߿k{_F]?6:/~(L  ң9\q) #GS.\}[ fάE' IDAT0v=[z5SzZR?>N1MWh!0xq1EBk hk2Y>4 Ci &&@2Mh %@# hE}j]"i)$qHm]pkHρ"W\m$&z?Ei *8xuB"Q)VXBh) L[/ ];Gje葂`Qh ‡K!kڋdPHW9./EkȟS+wh[7 0p:F<{M\piOnZf0F+i4 hq`HP}~gu3v|0Us__gqdz=/5*}?7v=ʅ>['lzv~x1Y8/\_6w]3Ͼ[OI3K?Qd;UUm.w`IѱAnã9 "DpՇ/m[@!^uS <^ɳï/9 "XLg`BaeCCi03ϙLl֋㽭t0?LNٿWﲡ+(  &{'g^gVȵ{7+?crUSI2U,Ó+- 0jbV+IBU#SaoqœDkQ'4HLRmh!‡4R؀Bh/D o\bHTh)2IOv~a(wnei'f( WM/ rRg|=jBk0 %MHhؿ J&g PK贋4M@`;0\ 40=-J\JHiRWGgLjZhB3q#"yHғT,~j_q3t2ﯿ+~O2-G9FqX~+>bwo%K27m~ͷ~>c:)BÌ۹7WyL΍14Ѥweg]uD, }v+_";mOߵbM/ò%7ĶH˿ǃ|WR^c7^c<w3[ܾe ^~=Sϻ_> ̈́KꅬINߜF#\ˆ}+ϩBn}[nVO䁯 o2e&&_Jź]Ix\:[`\Ƙ;JccWdbQ}]pDp~\°9t6tAhU?қ/8/3&tRϐR(h)Q()lay+I%wCNW r lSg1ob RTQgL[ ^w&q0nȕk.+-Q2)GRf@] d{mξ=W3)Ac{t'M=W7IkcdTt<S+M`$W\:3~"u[UaN|sJDOb<޵k9IT02W.~'ʑ#|po/毤㫃(OfhnOJ Sfx|s@|` {낣w菐񇤉|_?Τ.b?gS¬kH'l{'h©`QE|^MәEȨ5}~:_JLz5iCkWոgկ=Y{ =^'wL+!1j?+ܗ^˩_Qu8HZ͎Cugpu^f7Q, _7EY 2wtuy<879̳9ԩT.JRiwr˶C#(#<3s™g",Ӵ^O~QܾEw%i^.k$G YWI4ugE%AX%oP{vz9==3U\cwOcPֈ.˿9̓_dҞ%HvĮ3[Rg*ۓ}A.H AM=. x No{uլ{Nc? \oz?^; X d?ۯޯ@Ϯ~l M?:Pl]M-B~͟hx|H2#R} Đݽ4ZCsÙXP$COO?ʃ_O#{s{m 3wo#/Iߞ6_Pa_n(ff!L WsM Zy/B L J}TR.wr{nƞr(w?<䀛ugx᭤=Ӹ>wٻw3P4ߛح-Cu~}\3HSv}>+&I{jc64&A)ߵrߴ?PC nWg\FR=`U2jj;R27}J:rem==݇rV@z먡Y`'\t=vYM"DgݕLoK^9K?Gur㼴IS4ʪx5\ˢ`hvr 7'>jEe/+hCX_lj}|gM{f+QeBW B!3 #! b)eWkSgfko#Wov2 6Ybg֋C)?޶>{(Wd:}7@| $ w'WN)'6avMQD ArH9jw?~F+ul\pWw]ϝ7P6l2#U?NnGՌ(Of{/ʙrH G~ VfXL;f?M;]<ɯ 2iZ9ֳ?­(.WMø?LU2)6#4o6nQȐA=Eӿc2\_?rW> ACҶ1>>nֽWzn]N 1 L@ŶJg0fɒS&BOSEs*_̒ʁ.ˁIo _[?!!VZEiM|<m53"n\,YoZFJ8OBJVH[Xc4*gWr7٨,K,Y>Ek"J ,sbog2݌ \|\nG,*]aD_v>wj_BK1.cZPmm/,pu@濿Ku{t&x{Ϗ-^'L3e4| 6(Snt {c.ܳdɒ?N{ɅҸ>e`/7ҵ'S ^PgHuE)lP~OZ RM TT0hP-).8mkg Dt} w/ֺ[&^',)4NG<9ZXF'CoV8\PʓFV&PQ6I}!p%^yWc}(Djnf_hD pϒ%˧F&8N¡$r$~[![mK >[):RH#LGhb_َJ{IXDPqX L:cw#e- ^w:&Z[Ih7ћemmhۗVJ͐_ (O> o5 298GrX2UM679U&5,BA2@m`>ʫ92sXqX2 ^phd{,Y>=7ҽp9N{3)"NBkS,'} ywHKI2-<ǏrH*%hiHM B|~~b (ek^v;D4]^T[_ K]4*@M"BYt6v3WXr[P3)SK`v3z4tGtvwvpPV`Q\-1MA*Xn; XGg//G(%BB -vݯdYdPRd=;zĆX _BK-^(-]-h2L2̍`\FFF,O < twӯ3/ؼ9v*WlkKߧBmPZ[:\\ \G#M4tul0L˺'KqMץE vz,dd:dRYW` 1iJ1TZƎ-[qje(q߽mP.,]G| Eȑ\/p\\Lr*֯_nj9 U)bx{n}pǝt /B)ZОמ]{Zg{,Y>5$,]U5HI5f"Lwh%PJ:ǁ"r0 򩨩`@܀婡%D/ {oOiYmIWwM2d~6O*@.],^}1#sDyWxYwSW7CθG<'C:<~߼JpO[&%%%^~ss/Klۺ(-77^vul./_ʕ+I$1ÇS^^aMѸ?u33ge [l^CE(Ŕ1# F2Y4H¼MuH CX!̀$G̯\`0 B3k,&L7Y; ,Y|j9B(F0>!BQ%& "SF+77^%hokcPmN:ߏaN;454a+>PP;ާyQ]9t=5e[9$pHiд=,z1[) m 2A]q g5d2Ŗ-l4zp[vMHeYP It*J(R`y0fC xk*f,)S*.t1F9>h`9u`Xt~6Qߊen%cR2QWnTRrx5Fv݊Hvi=2O"E@*?[[ 6,gÂ-Yu/q nM9lf]Qe) 18IcB0X15 LkK;I۰\~<BDYdԐhlaB4'u %M 'hЮm B 2$ X~qOX:;I뙉b[ 1$I?Xl mK |>RZb6ۋ}w9SP{l[%ȱ<ݔUGmu-nj n|%UQhuU#|`ɊFc厣 " |et󖮦# ɱ>Nn|Ar#9|RcбavtGMt+t6Ƙx؅#UsLѐo,IaŠS3XHc:JH!ukrod|㳧qХ‡g䔓0y%R62I MͨO(w f AÏƑHȔ-\LWo!ҒV82]ŲU 0Z{^Ǎpϒ%˧C+t1i(.nJ+˗/cܹLu49".aPdžKy9dV T.ե|ϱm{.{Q0G}]‘;` rRvйNp8M>& "u!:M[p.dt;x ,Y|j=F 6Ҙ@H- !Lw غ&TBgV d=O=4&J٘J7-|Щ>t@Wg8R@1JhOlbboSTd7=1t}PG򷱢;{H9;} Ӛpy7ܳNa@p\kc-[O| 6̖NEnHRemiD*S A5ww!Aʅۉjgӊ4X[S6)GICЉIZ5S׊?'h!Y iiONt6cwb{e)>NTmh'~ۢo/q&i 7N#"p$S,/L週v6e\Mـ d+LIrxJ^F`ap?~d{,Y>5FZ`~X>rF\\HТ?ۋʦ͛  nEsiH)`y 5b, 1N'1B%脢ihh݌aIjOuB413a|;6.ak:yXߞ FBFA\Nk6"mm 0aR BH I ޽fV 6z KWa)J7b&R)†F8ZP*5fGQ^C4h_8[dARJ)rA"Q$v4"]De[q?XNLɑP "CX*!I*"іШtt\ec] 4, bjIV$zt99Ի6ӊū_Ü~ F!Y%K,c4xtF-v!)mFKPn\a(V.^{UƏm8>Aqxq#9楼/? rJ1utk18~2EEz%*WR;t(7p&6݂%S]1Sj(8\C&q"pȋ&Ie`ͱNbM:c~rr Ap )n +lѴk Ll_!f!)'ht-XnФGz[Ӷ}.`ď#$?tM5VjE$ %EHvakkiP=$ HĢbL!V."h&S).As[('QZ{(ɮsË:鞌f4(F1XhQJmёwWZ+yeɇHH R 0H`09uOt_5)K.sN;w~C鐬Y$5gW2T<0ȸM)6i% 9 aoKs4#ܤQ`B"Z0^J& Ae;VWv eZ=ɠ\ UJ!3I12A9. ;vNk0y jl^T 6#}P!k.=:x).(SCFaaםQqEC{C- %TxytŽK. gq$ց\5T"dXi?Y$Mx?~/7z"4X#\z$}_~l/SmE,]­o ݬ&]W*>I6XY|G>žK)7Ƚq}la$\ǽVcX5`|R h/VX_PC$Dr[&ARus7ҎXLfQ'`EH}FNf8W%<$2տopf$mup+2Kʹ|"OY[e͖gÄۉ)qaF'-HD\xί00o@l]aPJukwО*PiM57M2z>\2./ u5+]t% 'rcm V+jAL[D^D8ɚ2K)Gξ? Ս7  +!Z_w̽K?/sjcaY#|BрjC\64yO1c`zvkf_"&90^U&#TXWEЎ "cM SNr쩣  zGKNV7+gYc@ AH$醣D/0XL MzU;?-I/kys<_ BHZbA(Yp$B02PrB@<VnN;i0؛sTE9Pa"hQ/Γ$851yL^s99>g.M͆ST*}Da!x.]\3ث9՘pD Ta(љ{iHsfO?3lR1/.v068" 5{eԪ[=u|cQ}(W:Ip@ 2gY:sF; vP( )k7B`QCֿY+#[:&׽AZk+8:Oo΃hI b2dY oO<|tuï;Y˱aխ6 R0ƁqnTcب*&ri )d"pґ<hNAYuJ@R:ldXZ[a·8NXrʼn0vvg#Ҁ;6m=? {O7IX;T/6aʃ@p=fi)"{uXp6gi~PKah ;pTwuҥ!p.9hKn MIEp2]'*ֺ*39C9y$ ]i֢ݪqܱ? J ,U+C .]:ev{.& `IBI7ʻ[8cGjl56OMocijIg`=-Kr#+Ad+$*R`%fD 5%b!P8_k,"C彼2۶9k;u| :EأQW2K]`^,xT`On y XQ)<ط?Kx'#L leMyvlpzs[nvCiBPx$5ۇPة\5yFWܻtr _. G!)~)5#79qWIjS$2EBE,W|3_w?;vF),o} fkF"sv1}+|G[\C!Y4NIws-7o}R?_" xu!sj䐧XvOvyjrt4 5y@JEX@80rW/;uo_ĈWd)-2g/Kǿ ~IN^H .XbXa1b-.mعBXƸ}Z1X2(Ҷ=d',MH em.*aHMgf k\jgsT89.]\Stf0tPy pڐsrJT+gh2VXJdXO05m{֛Qhl"p'߉#t:`Ge1cG9~K8a|QY?xXh$XIȅG0̱_!%q4!D )5BKgj$.W @JB* ,MqK}@)rs""J>hsrs8mҬ7PN11R\Bљ"Q߬Ѽ8'P)]ԸXB?c¨Ih"4R5<<ًS9;f.>zFH@u2-wŽK.FHj@tEL"-5pqvXB!m-l5hy@#b5Y:N'y-T&eZNc/<XElJnڿc߿qG3xz<%i5<rsdİ+~($iNOɒ}!fpjriIfC/,IP>}HNr/q"8 KI R-1^\% оDJ1( M8hZcR$q Bx. yq"m$h!)=N^EK\=F%8.Q˪9dnym2\~?.GZE&zb6Gn&m&a)cwщEHt,ht|Wܻtr &!o=D%}$ASbg|)I[==+MzѢKWGmƆw0X~%.ZBZl.#`y]#֛(j y!`moxN.z\4iCZe󏰱 Lo!7(鮐9^%G  6a#G l\8# +l\y)mVȼtIY - R.v|Mc+$E2#>{ 2c&yD \k8$409AQh3(T lPF!F8Mɳ:yVҮ@E| iY3Kk7"}#7rxB#K.d>Z@Oa}{):a[CT=1;(z}tJฺV.]tb]\&if6e#x:ZGx)BXKL:;S^Mf8Eʈ֥˴ڋdlٕ[)RY \a`D/ Lo}#)Ce]h7`~nA+R'x Gh2bmPC DMIish ZNoQB#D&[ c&0=!.08Z ) "NP(!yGlt O:V䈬3-@9/rȶ(M"9j 3dujڇL3 4NzgNrF3`zI\c] X\$qr4Ih瘟TVm34܃b¸%C-B&1.Jl6fCfmjR-sX lY&0My3~Z y(]qR9NiïY `'@X\Fpv 85)(ѐu_q͜7-A{1UeLWܻtrpGoqeF.D 11c,ƶ ch'D  %.n8tqa =%IC 4e.XR !&8~v޺xn1"Ok`r!7dZ"B)}hً:[~#fH-VGujOr`J8A>u\-8RZ͌`FGZ/WޥKkx[k[4[ d8!h,QU.ϒ# Qͮ=-;VR'mA\>I O!6k:?{ C B-+<.\8p ]cZd/+ \|S#1/7yՆt>FOe[\P(d(aP>;O79~\ IRK|2 ZEtd!S!H(l!y+%f.#Rub{H!394)͖#,C;C 3݄zBhc"dS1 Ȕϋ;"z`%G+zI!O'ϱ0Zk$m[i,Omgw#\P B|')UNcWJtŽK. [piL4Iu,!o{dbUږasާ;]Ln?é?~7-R=(2n{#[|rx/&'yD@1Y©jTL l?͞CJF)ҿ́;\M\,gi'-Z6rHSR)ȴD')(FL_`p092: 'ZVd&dv"ZDD~DJ*c(c:/g{.]W \pMf ^xӘh㯧v}cT# Ӎ?ިyS)3'mp>ʼn#rmIk뇞G.+zQ>YFhX\lq 6Ϟay= 'uXjβ4C4M(gQX6| NamD11v{^s/F8cGYY}ҴV75)zzna\OZZBl/voᨇMX(H~?,ƛ$E6/ hC{`h+>sLAIQΒ[Z d!J)&Bʠ e q~VV9qf/^%IH)ɲ2-묵-RHUL[bhraRtl;:/GޥKk guס8XO/!չ|sc$ 3˼1jqoOS n%<㳾;z _WOep(Ӏ%t8ζ;Hg5?|yj6WxIe`C{3?`n |a>X 3uRI$k!V2|i% i.iB6/XJν{(I?E&fR BՉaE`s׳6RPdYXR(bu7v^޸-, |/T9tȯS7+Elȕ 0EJc2V C@ 2DHKamg.{a& wXLfji;nx6ŋ.h.BhL@ږosbHP\,GWܻtr pa8&iqb|,MYq{rkl!>Mr}'?86Rn?,pya,orBV'e~qQVsFF{`_~Vھ‰KLk $m/ʇӏ}%=#G, g?̙|H/'^ɷ)2˩7㋟_[ĉAx]÷mT{7RO<2K/|?ӼD?i~헿Ƣd|h'|x,|)# q:O9Ǖ+ =8|ӫ8{nOrÃ۸taģgh-ϭÏ^'?ʟ~lv <OywЃ_%g$kX<;_.9.<9}}=ٳg=On.K\rZožCw;O.ZF@M`Rё&}9l5hhe63VI~_7;~䵬n,OɟW -{oa&F={/#~/ڽ{~'w|OK.e4#ccbs}O?ϟ~9s︉}٧yo!uy?|ǛnseµhZ*; 3sq"ɽ?g.vU7O< Vf0$3ެrzsg l !~1kk)+!|lm7@HEn$E .?ˉOQm{,\du.Μfha&v18ރspϕ*3sX۠ؼʥ9BʁS$i™H}r7S;[dia4 Ã%{H|/]9qlM7DQqv^G}kgȶH[47 j5<2gd0FٽB78gπtӧQv^V7g9u)Gl4.|=F 0Llgb|/0=;OO۷bu%|80} !°ǟ`rre57E_W&!>c=+}tro~Co[;}4yLZ, `,bN_dң'ݔ )Ү-T&5ʸ,e)0RM#JCu :"9I}ռY]!6>2nEܑպGsA 6%,,00=p3lJNdpl ) Ұ12AJ9 2^JڪH˫0 ~1S3'_uF'~ᇾȃm~wmkӄVJ,dpGiKPZ#\ln!M=o uV;nyCdYF%lmm19uܿUW~[ҥ˵ Qe䢆LImF'w=}rc2v9^\P* F^$ 2}SfnP %OwKs|OO x#[xr !Rpz {KD(evMH!hӪ[v ԁÐF#!+`J`=Ha(5Ÿfdf8-Qq :{)lv ,v Q2V`?b'F$00,* aOp$VR!k=zFIMʝwEt)؜BNq2 78G-R 311N_o?HRX"S"7%YEQDž%ߤ+]tfR="aBhs )e1 -i~ q"=C/jv: C4 RA Ct8x`/Z5^3ZcAkTpdHh454M `NJ,q^9 ,R@9LYrqCp;E *!]t-$!f`(R0PG:E:kH$D\ʑq$FP>B:D^yz=y1֢%k`:dZ*8ĺ OE%fP2?APD)Y;w^.p.G PJ a;mh.(=@WLȳ6iH!@H"X m Z]˕wAXp︊ (H+ѓBbE# ~G&%kۥ^^Ut1)_{oiZm|'c! C:$U!N;^ o^#xI_ڤ(P2$w'3P9P :>8= %Vi8e ya]=A wuygeAmmNn9RzY ' 8(2VKT+W}߿tŽK.P+ ;FXgHк[_|mP(A^'c6J)<ϻZZ-|g``8'"#( A*K -SCNY:U $B P& t9J8(+ Nb«N8/S \ cΨ=Hp&a.G K($_@yA;7;l6q6C{Z*9!:U)EǓ{5ﻨHWܻtr bxu.@IE\wݘD" TO"_- i~ Z'9$ߏ+\ٗ_y^xyI~ժ,?jA G3G w#cj69):oؐAڝ|DF5g{ɮ6\XjҮ {{@ݦ7j| ? h>zޖl&cy^4R\'_=s k)/@UM:G?C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C25'+~2wϚ}`(H!H!H~ϖ4صc{@ @ @ @ @ @ @ @ @vleB!H!H!H~_ TsN߮];w[ι{1F5556lF癒>Go*pGq-Uhr47Ș\|gbk::?7x]--\U@%:ʯ5mZ5県1reC%~lT8 ;C}}&O64jԁ]'`$ι괿׮-e~I na/)A[&P[&h}ZZDUk_kHs߭¡4 Zk%GƏ1Fuu}nZ*QkwT2ڸ5 kǸ14-hbkdFA6u*pGɅCR 9ъbYu|nXS .-~ Ժ?<l]3N֍Ը9M`$U'n(Nyɠ]nT׬ޡc?/,nӁx Zt=l{Z2my%wWt'k_ՉKSmؾ*pGqE=p8K8rIE׮gR )g#ͺ135Ay&M=yZyֵ߽Q[?/]zֻ&}2]8ںf}ՍNL$wNY$WRo ɌK KNS.8Uܦˎ٢ۗmu2@%:ֆŗ=\\T6?0ϰ7R=iSٿc?ؠ?>]C-t6e4K3lKGSiw%Hz:ٹSfkfL8WTYΞږ8&s%ƽx=zIe@Dڲ"rݱ'R-Sfb]p:]׏׿'.UNVݠZ)OJ"QuuF3YT*1t֪XڤWBqmԪu[u&ikjꤋԭIʌh!s&3Zx.IrZװ'뢣?)G+λ[+}H?^GNj7:w<2mu;Ԇ#j}?hv8pAceUZ uEu,xwV޳Y?5=ȹawgЋom\<~ Zj Tg/ ?V?k}rm=mܳob3q1/>7'#}f}OZuS|YkR~ȃQ}aO(<+ZfλZQ ͚^lE֗S3}̮;S'x؅۶I^Ժ`݃XkwTpvqa.v$K -9lAxvUa=u5T Kzjs5PI;NMM٫!C91& !I.wiTxJWx)sy^^{{6oTr5Nsڹ}y,Ժr*pG7n6{q*FHæX qz_©?) IDATxw5rrk(+vH-11I4`@E0(M:"Ҏuvgy~q{ws/}v2~2Z`ıpaM¢B|kI4 ?1M?4-I aY>QNC4-lyf -n aمMo1LB)PgjR_6- T¬4r^͢X!nQ5Űm# Jw_T$ o&MuKLEEe@XHNN:$TVV|ŧB;鬈IǪ#]NEUU5就ZǑ.MQ0ATMh Ӂjy8B9o0 ٌIgrMe Źq:4qWWS@xbcS7 J4]EIt\1n-6wxQA~L='OOyd6Vo&62s0i779qOՁݬ[O/@3v?떿3}IۅCm;`=5O!s\q@L?U1SyYl% 0 \LH20*kr݇(5dAbW$da܄~Eox ر\y,Fy@#InV14p5'ٿ3{u3{ҿ a'^m\f)HYCw@^+pVԣ^ׄtɁ[QWk=B]5Nw_z˅ZqUo>< %5q  WT&ӧ3ep3j$$xw pze|i_K|z2%VO& &aR$>( EeY]U-,DiN|z%Z8P:*'$Jz{ALz< 2=d(/Fe%>Vxwd`j̴x/7pz|oIB{8F%ɒOJ.F}ރU{8bbq-*8|^.J4xAd/~}JXûϼnݤH'S39]Jh0cs+($o_M{xLJ߹+(!VxOӝM_]'蟟&vAaA&'F ԛ{+ZSs2Q`᪡m^gr.ԭXzhmg*V=fJGMNùw=u(S!LVP`p֘!<| M YN1.aPUTārbvmHQC8/# 8Ds+bskx.r:;~3iO`5oA%qxf$Ͻx҈CZr= JytM/R~2{H^W,1=0ڌԐ t~AбLҊ S{ف)\m'nC3Hmsz@AO)QJ6ovonbFz&1 OӨ#LH#4PLTRgRSYT<=ӻYϐK0鬾5vk.\Z|O`'iJ &y *&Jw /$IÁm2m ˇwyh-S˩F'T⚟{SjKi';1 OϜ+_<η&[s Gr4/&۫IJ{|2Pm we0jjѺeNet:99.|W\t;DKh-6XR:iYsť9TD@ZR]KXR2SǦXo\V.Kf"3co_\^@['pڰZ;wHȥ(v¡|\VϠtPAk '.6ˏπ@1FI \{8bw^+bIiަa>i@M^Nw2L*voaՂύcMG!CBb +سK?/# شC64ܺk|P !yR>+1ѴZe|YZƚeM̤{noK$f_XKi˷PI'_! P]JV%5#cNAJj/ۇrhhbiHe;/?88DGKoZJ6,߂791~RH.(E8;$c=ADni҇YY J꽤 Q3Qz4/|:/V8= h|r}!0>&gi8#Ja )Vt]rК'wiPWkDsv4I?H (Z"t8NJDb[FZ0. P8: 1" ߞ Fcy4)I#iIg֑!ݖNuĠk3@GGeIf40Q1~5BSՉi.!aʵau|Bd8aIjƎXVBh8.V+jQd"d94]cuܶ6?h]hZ;;^macr(ػD66Q-M"xEu܉'rt*vlla& 8ll`& 8ll`& 8ll`& 8ll`& 8ll`& ?`q}/c ml87 ?C}j.̾E̖\WyhYE(c_VFyw7sy1cy\TwOv oӻa[ػ;/y BO3/䂟.o~ 3f>/X&^­"ϙLw a'/ _ {H+޳팩ѓ‘eC= 982ܞ4-^w3F{ g OmT<7\ME&?m3S3Ɠ>Ԭ`{_ Q8-JU_|NNLangVPYp,]or g*ά@?Sf* yܵ#ABQR¦=ّɘɹ7~6.V)_ÔGZJpDϽ{9ǥ7q}a_'37.Δ%c]otGqүG~xyTwd-wrsv?'r52w;Fx4w\~#ϬiWEHyw@nwt2Lo~*=?g4f9hߵ&:9;{hW ho;NeP5Aw8Ԫ''9,Cu=zY=zѫPNRɕ|e8 |U|79h|2E6 ~O閥'$ ͒ӒG3ң8YZ>'2aRCVvgUӃD:.^{']<Ů/FQ&\:"q^>m>+ נSވ3d<}~uP2/`ڹ/Hbĩc"y(`{POIx,Cq6G#+aW$L˔ gsLF JJ'Inő_ȱMKL%^'2Kyb r0a2{jkG^Ȅh5]R? < 3#*MgyGXᅸy,Z̼xJyGHé׎o8@O̕J^x-3~~m( n׋qȔ<q_{Y' }{dofyP5~t]CzDgc9l:+ WT{'p=;Ų[6G?! g`NJN9e(͏7/y.98PMac[66Qac[66Qac[66Qac[66Qac[66Qac{a'GII񖵔}[RGN'>d=8:1JJ}89=DDqJ)jvVOOCh$mG}52Q;PH$!'E_$,(@,i HMg}qCGgdFu]?~ N$V9  @)"j+蕑W7jkGI!4MCJ*ʡ ݯ0ak(zL1 !,%S $n#HS" Uiw%A4V)mt8{hA9omg"ҵ.BHi롔D JʐmBX*>dA+IӦqPMCaJZ%[$4[*mlqtbT4f S_aYPˠ߄)˥T %T)q( RG'F) 2T^BPY exxYvI~f*' 4gî%;hqSOάK,{>&Ž<$yyB-BS!W2גJ :H[%%"׀ZA_ż[YXfL\.Oq|~@;dY:PέS)t>lj?D7)e*kC[]G) PZ| ]U&q83i8G7 ?ļU0>܍;+)^Zt85!6xqBg:ȎxP ?{mUgFTT(SLL22D(kt )-㻼,6H|^6'%,W8fH*)*ܖI<62lw/KD)iZߙk$RY )::rg[Ό7;JҠ)B]H;τt'n<#ry%)'g= _ug2;[*¯ #B. 7dQrrHe9RVS~~4[XP8R LpXhͪ=2Wż/Ba-CE4 Zۭ()Q 3M> )-"nY.Fy/Exo@u-{%j8n : O:Byc0MTul^ #t;-N AJB=OC0JZ} R!MDv/=uj^e]%+(=LK"F,?>%['ӻ?}ZƮlRrl!˩γo5 7D2 yCJAfȭ!7T4#2+Cdpl~^x; @Ym%K4 Og|LSv]Lwb׏ 9CZ~RV#C\iuȄ@ AÞ!rHMaLUxԚ=ByIn`Rޮ@3k\ ǧh2G'$w\S&KB e5e 4a-ҔIiړ]˫2 WRUC?qIIC+{}у\/pltM-z#:8vO5ÚO|H H"Pؓ]IhL_5U*V7WuBLNDJDNu(vdͱqn%ZFR)eR;< hcx;%B $Gu|aUnfoGQuhZDL7oh"t͎Pщq}VZhUWY#yogꉽBDkR6j7gxU -Z^Y'6!-NL| %9`e"κ;ֶ8DCES +'hm..uj)\qjBXVr+3e>Nhy4G'ϸ)|6>.`xjI.=>E2djPcsXͰ;a F]^ S(}TщN&θgCrIDATlͧx;<{(8cb7b=>>c&wh[FqS;n.ʏ{MlqDMlqDMlqDMlqDMlqDM[pacn9JIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/gallery.html0000664000175000017500000000742213203343735022552 0ustar jomajoma QSSTV: Gallery
Gallery

The Gallery contains six tabs. The directories where the different images are stored are configured in the Directories tab of the Configuration.

Gallery_rx.png


  • RX SSTV: SSTV images are stored on disk and shown here if the Auto-save is enabled in the receive window and the minimum percentage is reached
  • RX DRM: All images received in DRM mode are stored on disk and shown here.
  • TX SSTV: When sending an image in SSTV mode then the resulting images is stored on disk and shown here (this includes the template overlay).
  • TX DRM: When sending an image in SSTV mode then the resulting images is stored on disk and shown here (this includes the template overlay).
  • TX Stock: Contains your selection of "Stock" images you want to use for transmission.
  • Templates: template images to be used as overlay on tx images

    Some examles
    Gallery_txdrm.png

    Gallery_templates.png
qsstv_9.2.6/qsstv/documentation/manual/manual/Gallery_rx.png0000664000175000017500000215770213203343735023054 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|lK@hUPzB R콗.\+" JE PRH֙ydIH!psϗf3.q}(!S{3B!BݚXUV-nʅ *ԩ|rQ2.R.KG^IŕAu% ('E,/L0Gl~|}Y+He[ŕ[P N^/B+DA~*3r*J9X̂b2 ,"4IG܅r^yC9/+d?,E(I,R6_ދ|/BV irT^N݄N9+ѝڛ [B!B$&&* +˗+٨B!ZRR2knTԒD!BQ(ѝڛʅtB!BIi( a`nbbd0E`yZof0Mʋ( " LNNP!BQL4Mtu^gV8LTEAUUTMj@QLr41MW/D9(&^f2i Mjh*^teRK&B!O3z==j׮MQTIDDyHH'&$GnaZ-dH$Lv{~z ,449x 'Nȳ|>nhWˇQ%43iN$),9ajWP;7B/꺎&#É(9X,%iq9IwzjD]61L@Ulڱ*=Ċ')t=00=izMaw9g~4>?X'[9+^J6W4%*Ԏi`(47M[njΝd\n&b&M_T"`褥[i{8#zIT\ʟYQ11=n3tnZ3߱o] ofO=r7Yh*7V}]'%&X*B! QV>}zY/&&qn*((XmVtɒ%ӽX,VTUɬ`P>}zc[`_`zGMez+ 2W6N=wSt5k,loj#$u _/s('66͢_5fޤ$b3<;\Y\ϦZ5BTP&x U*\.ip1\ٸi\մ o/ ׋H]L Wb0C|n~lnǻWy{3$s}ͭvԃ-ȎnAuzs^ V8o^~ٔNεۡ˗cyUnOZ?혉#X \[0Q"OR}$K0 nd瑣3u2,1r:,$|'6埸N3lL2͋xLB!(բt:u=s%k̄;0ƩnWQQUqdڻw\Xכ9խAQ:y ^NJAS0|{3.7ոB0$Zդÿ/=nX|If ʼ5/z ՂjMq9] vhyU3l+6]:fz4wrnjS9s;VC"UAWqw0C-Nذ~\z_ב\^.];YӚM9WixcT1~M# LXXjq+y7EYfîqa59l`5,",",( NhH]y]hp}x}ۙ4]E[.qYg8N z"s_ˍ)*y*r:u4;vyeIsC)JZfTppVMSOٱs7!=|i*6 {΁% ]Zqy븝*5:"^M01\餤{蠐ʱ @hPTC,pA޷9sBV&ChVϲU*iTق۫t"MfjVLOwx]n\^91rŚ",",\EUUu#)##ә$##Eχ$%%jJJrrJms3g9TU@ Cb^'9ysolVw oKbObF`48Ό0_Bw ʗSجVa Lpf`0 *UvHIIsM;ɯ?̀{-~sPzcX :cWv1 hҬ: >nAm2w~EY!:q(ZF~=<@ո*54Y 0N󛟳c%H +/ X\B!czck(/,ٕ|c[sE!ݥB!.;EB||!!A躎wn ZBll,V͂3`ÆybfŊb*جVHHi%03p3Wcxb%P/<=0/_fcE5wJNN!(Wt}جf׃jXVN8NzzzѺKBʪx<У wԆ[3pC ~Wi*k/kW]+i] ^~u.Vٵ|bS[;FM k:kl"٦ $U/H=u kT 8('Uz(@8-{e;;e̬HQWJB!ef&Vgf0 UAӵJF潙T4gHJL$88XrMZh]35#DU32HO (8XHbtEnװdg=x !VHKQb)1C0 inn:(*dvgb*:tP٬[x=^{SyJ:70m[(V>+Nx[L* zj;oa?H B?ǶB!. `XV<|S4ÑɆZDEU%(((}TΉ1aG|_ۅZFdrUiQ5L m b)|+EY3}r_SU,Vد]AӶpM4}'?8 ;!DG CB!D0MCױl@Dn(&0t222HH8KBB6(^=WUU1 0LERbOP2lh4+=`WLB ٩!QbO[a[2,efs{q!TS+BS)|*7HBf#5jDQfu,h! byѽ>̮SY-,VOs]2H(X,VUQsVTz1 0QU5sljut:Ӌ>d)h6xH97;?J_5 Q$Y<GVRB!>hxd=?#_dа4VyOk,L͆vgE.a ȓ(֭m۶?~+B4h! >W@$s$=;nݺ]:}^{Wg_x:u\d1;uvkT #"""cNvl 4yWY8!Zj闳DeHHH`ڵtM~{|Mi6G#нJ!"K;Xv{u/)zѧ9׳ZT5cgѲu|KMIe9ֵL[2VEBhX(9(RBubbb9r$ :ng}͢ѹK4il-V 6CB!b.`&OwߞAνީ}yq1'y/kԬUJ?>`&|<.tm 85 s"=]ݭ/董7:2~lYvchڵ_|@rR2='gϞ-\/do{]΃կ>)1rMNtjי'}b!%%JHhѰQ?IN=Ъ#sfX׭cwu·}w)tlMVp9zX`<8qC4hԀ3f`ۙ,\ߖw>>Sm^Cm|{?OfcǎUVrLz/L2];wϿp%B!]R%ceݼPV|[Zv2ڱtǎSIt:vylڰ9|c1#9q<39U&ȑj݊IOeQ|M\*;wW{F˖-ٸa#.KfB!D+#6u]q䉗W6dIΜ>5c-4YX4 4Q5r8x<4O~of3|>Kt]7Xs"&cCqS;Сcn0rWk*rTUGgԮSra&N[ի믿ݯ<C!t:Tl6RSRԹ#sS$$$빢1r Ǐ_򋯘r߽NPyZk< yY)vO1x^&\ nAm IDATӚ_yXطwo6gB}1Z, 9!#q\pÁ:`8cƍw^^ aj\Q}EQۿe<ۨJHh@vvBmP`Vk F*B@ޜ{'hrenD>}qzwϠA%ʿ^V6iB!ą43&CQIB!_Ӓ!B!F v~ !B!!B!(VRB!B+d!B!.UFe8sh'bz=%NX6*Uʺ )pBW!QlF H%LOe4݌ 4MRSwdMvDFdu!,ɺ1+I#x#4;r.fd1t6ȀNC,un,,$M;Pz]Y@6=EC!Upy\9DBrDLD4*Duq@ϩ .nFdʥb?i\{M%B!X9*ɩ=kҨvBBK*"Kws8;nIݦ>ɸ:5jT ;n/0B!D*.мa+ʇG.OpEWGc6RSAz=cFIWdi^j !B#1EXH9w)j|BXH96+ =ߪs8(PkRԅB!D8Z_W&-d8iRYʩ &U+Ee, TB! T2t]aszJu_,^@7VNF` ŞG~DZ׿_חK~B!ʶug7GemXOj=$s*{W5eQumƅZ2~ޙǎ\r1y*wEHHix-BK7'bPQ<+Ò ]:G%0|ܐSAtٍ&aۊ%ժsf1EA9t-t]Gul6>K,!((׍K1 | *\8e*-_^`{p]h/9\B!ĿCW0(^Z2|nSSS}H&MTq>!S,Jv=Qf0ylݴ^!۱%RAׯ݀.T,zfKiܒܳSO)DDD`&qqq <M(} +7uJJ <7n"8$^~Νd,>CӸ馛8zm۵[oU̝7:uj4!B^9%醎ay.f`b4 G޵4HIMdP<6/{(;c7!}3Pk n>0 Ξ=KN}XQC2zi<^OqmvFMc]=ˠ^C1p4n0 6n#ӥ?=;ữgcIII}=1}p,~=zNjϼJi-Ğ0 Ef} }}ێs8W1ʡ5ynɚkغ} ?bW_qlپybbgNr LL9bvZ)-B!yݥ|172otC'9)忯 O=C*WѲo4M s1F 歛8q?8дYS+r-V9\.23ckLhzC.L aQPNgfb?^Qvk3ضy;Y;F5ԭͱ#Giּ)}91F RHٙRA]^/iвMs6یaZ_)iaT^M63``?XJj &&/-Z/?g/ay_{:o:}MD>Yp!Kƍ8WY L!,hڹSahdĘy|lݴ EQ3q7x왇iV> 5n1Ǿqg03ch٦9/<1cغy;>q?kWQL͜ ){z#V421'Nwt:3: ȵnvSNM>v&?]-n㕷_bdZV^a`Xz29*3dL=,UTet_f&nPQ@f,6\t}UW5#((gRbrq]wpIӹKc*B!Di*j+nZ}n0q9]' àMV|H@u&$b۵b_IO0 22n׊E?ʩ1 sd?0 UUկ<_1_(eH0 n `F%_ϩ)pMhӾ nߙ#Tdd8/(+eL:IK6x8-[4M&O̷|GZ̓OSZi2h >'y0:vDZg_d*(YKƍR }AӴ )B!JբaѴs =ۀeS^{r7k37l.=;sQq".ᣇrm7pQ}*.FM;/ad/|@~vSaDV=fp6,atG3#?yГuk3(^#*su^^OޛTv}sf/' 1{ңsf&sFcƍa̸1ArݑM6P~k3εox%-- w:B!DiJ~=|5.a&x}>qTmy]x'ark/j2BtB!DəwLTaq<#zqcѲw2 74)90y*ZStؔB!4wBu-*MbN .U4B!4MŢj~%e1vvҠtG/Bjyݥ yY)?Yy*<'PJyB!VK4)9'X!#0ۖB!(]4KF Z]qgcK:>wjȘw%BQL+Qkpeft8B\6E=גˍo+Dq01 _IqI\yBQffv1ں6MS)rI%eo] ݕVB|BVP*W–ںh2I4Tբ]xO!BqIEnuP.;T2iT ;n'95wSrMnBHPhIvIҝiĜ9Ύ[hR)@/KYϳݿ)ׂʅEtHB!Dd{L!,8({O6Mp^{yV@7 \RlEnWGc62_gY/S9:;- !XU=sz(BD0]SB9^L嗥YߔkA_q$\Ya !Mf]̼DVç{~&tmVFR,eoʵ &U+EuƒD!(~tbrx27k^fR,eoʵ ^ask !({ o35а~CoH3d֮Yi,u m[%##4IJJfWnel߶>а~CZ4oOfa&gϦ]v4׀tdƍCG72 Loɳw9|H#&=׍7N!ĿGo0Ld?n~g ٲm3}fܹʫ #o ?sf}) AAiX,Lw3C̨#ll\?}?pWt_TU0Ljծɨq# \rht/\㊚5x BCCsm+4ǃihF+ӥ[4[6mݏ]7ݵ3>NMgZj} /"ccRa}&1-o u6NjӤ͸[hѪ9f1Oذn8G\O<'}.% 絗_g΂8RSS1h4/"۶ {^~8~At\?/> sM51/{wr\X^. ݎ(\7~,LX/dۖ|c:s:s/?Sl4 _%B~]$1YZzEhh(‹ӽkj֪/eJNNBDiFxxǎ0 ʗ^ze`!<<>}E~} oRSS}H&MTq>!?ݷCnz=|||>RSSYu5];wύtR~>f>GϾل~Hvn?~&a@ ^&MȤi9r(wt7KV- lkj+C4BCe\ |\+U+x'hݮ#F_ ɘ·$&%捛 apyƌiѪy3qضk7e,YE_0KW;2{ytޙ('gk1ZRSSIOKG7t/*FV(Ty31 /(׎]:ru} ?GvUS0{wC7tS6.v`Ǐ;iӮ5 ^3kmk(g:y}10|d`!~㝜9n«>=f|s|&!,jKSy-@iP!Mo ׭]OY<6l6qpx0㧅qf8޵֮s+[91r~=L~Fy؁-&&sYW6 lpۍ۳'O2yʫz9zft:eb5ia$&&7/C7tj6#]KD{a GӺ]+jތf~ݗk{^]q8v=g-Y7܏]nxV.[E.y frM4n(qߧe?'IIIԗ8?@\\ob H}Ʀ?bq\W2VVϾٱOXzUUFb뼆}v*W̶Mp:3?y}>.9IIN!4,7 6WۺyUVauy׳owf/p=g_mo?ᡄ0`H8=C1M8GKht.\!ٱuqLe T̩9IVWz1 m[pxLfy>UVb]6y͞c]83v9t/>c^ rHyɗطg^Z!fQQ MaLFDFFC/059jͺO::λ_?JD2igʏ~c^R<~_Xʍ^ G'6t_:)Dλc|;wrUDʥo͟ B׉>zZO?k#Νs} Xb)_|/;o?ymj=eZxR 4<ж ;=iȣbJ180_ ~ǹ[_mfaHnm_ۿ'>qL_,O9[kP( ~I zѓ_}dȢE8Zsι˗no|qXt%7t3̧CYx ?o/\?u/N@mR޷oG)ŝ߅4$\rG{'uyzVM׽4k BPwo͑aEvlZl~/#?xQ~_9jY2閛~_z/d˶Ϳ2K/K/_K=o\p1'n8|醛>|gwuޙGz $WuضEgwoul:M`GbOʛgmZDV$R [D_4aϟH{7j$J+kyӕoa,[}{obzzh4ʙ?}W>~dr?ړ`&gh,bݳsO=}(45p^Yvl r9WDX|1vG{2zyKZv,Vo:y>|[Y˶~#vmvnZVq=vp7z|o {A7Ҋ_ws?K]No.b6n: _f_ Grغe7~&gxYr=mͭM|gfI$/ ;2&kF׾9s9PZq|Kq\sٵGzWm"NrWe?ɇ|_>ŷ~ehmkooby/1P( ~W]nVo\+p=rrpn` |7b`t?KVvy|V>#|?X]y9v(P7R/U_mʻν!Bma5o`on}:;XX^\o B"Ô/:ys5?;<{W#׳__9m)vBP(CƯo^ݥUz~y=S/=P( n3 {~jo^10p7:\͛R[>l0g^;>rZ7nR(ۘt , q*%cD ŧ'USQfږ%lHkXϸ%bkYX1d,ۙgiJ|'NZ3* rJT9LvS{CF*OHǘmLL܄ nfdH&(YUvt%BS4MLFetYiv)icel99z1O-%޹ʕ~N11+3cd'oz-gtϏ+mƘ;7a`Qh7A^ v|Q LRH JXFRQ&(Zh BX/`+<_` ' "kZ ‰1(r]9.>Ca;s<\oʰe<ǂYHi" Ic.B&M*c.c{["4cE%.~"Š $|6IrD~޶ayfC٦2f6N0פT$3#9|SfbY 2&if[b-li1]q{={[GAQv\#;Fn"ԘqhDN]| 'رse\~Օاv9.nkt:KCeUhv:C? u)1zȹHW+Ƿ{4g3(*RĥHCL5s 7p׿Οǿ&{HQ1S?M]Jk.j%0b[fkH8YSJ<9_w+xe0>G3I渨v?_>6LY4Ȧх8ccHDzvM5㔻W"SS#raULh4JYN4&#F W |4߳>|A{sؘRclbU>!MіA LeL'R/+(y/QuA|A[s$Ikq?#vJFskXDj-N"n7ZtA٬h9١cf\Yo1c>lڐ0jSql" fSQV:TV ^R4-k`|L!Ԅ] T5$c.:R7h4ٽqهvvۤO8w 6$ \@cw<a.-9 F۬~/B@P,R'^ 6?&M88r~$^ҕvIL+MG[x&xTKFzf!i Z| h$c K~zEwm+wcItI|xNK-&&MMGUQkb;2bm%k 3YjoEMpEÕaZĤLa#aefБX]V["v aheA)u!u0͗(_ ,@k4xuLvkTsY҈D(5)t%ns lm(e؆!,4Am\ h颵[,(9tN1u-o#E[=M˂`n-BV)r?Q=MxIfxcMd|G_Cu64$M*x}Kos\KL'Xӯ3X~dg9:#M/QI%!%5 OKYZ;с/$rl& iɨt<2S,LWlmMFncI~ g9֨6lJN(vMP4.$қ\Jj)c-iDI'fF4$P'LLG!%s|@dƔI9)tk#r`4rQ@Z,N)E*@#LI1! AU1v ;m(NrTeն{>81F5hT$+lw)Z1 sj Z!]D);Uʦ+V4v%^+0 ĴpruʽBe^rlB6]}"bOI$뢍8-dte JJI\CQ5rT=$t@l%{Vx4X5tipzNFRJ0Q*xO;ٵmJ~fMѲMíu%O'zz-R|mO%pd#<~2;ydラͬ&OZIe![ʙbu'eH?jNvEB\vQoA:N>ƌGktelv&R83)-\:K 2R'^r84́}Obfzػ3Q.Z.q}~:tә(ylB:T.~=o`r::*2֔e44'F<ֳ/ų[sv7#'snķ, _ò|t4aҔ1wo`\ gxlS<ƪIZOj#5\n%1#Fbn~OH~gYos;_˗&Ջ8"D"h e?A*糴qOgKu'/7H]Ϟ g)9})v䏗{E&g47>~|"D~X~%od5Gד\{69!3u.ier"MXyFFw*hd̋L%##g^6 {oAmvx}Hݬ7=*wNbY=Z}27\"6GG^ǔhdycIYkI''zvlIЉ\w">~wTzk$Z0!dC`}CO=DɜXNqOwu^E~2m2ivHGQkvl2p2#S@tBdtia|I4Zh-0a Z+6XG5,p|0$Bh"I ñA(D0]V¢Djh ۛ1Y`HJ Rah%Їr1 9UbW(x :@އBRqm:"ch_ILOCPbaHC+ Phu@:ZW*Ru`F6p |o^ߗTr6HEPlG0bJ%1c.p*X;͚jk= # i+Jea[Hnr8UP[9##KF1Ǩ5S0 DR "Q T{$=ml IDATKj5TBih1 @!" 0"H`R' d Ra`H >T%HS"AmX :`H,F ƚ/hP 4JTz舉PS{~I((?pMn[SZ6@Z 4Ж4B͟KG~R %L,-H) <Ll "‹%xxCjD\I`I|*/hE-Rk4D"P~0?.@) Fò!`id < %1ա!1#,|DWYg_m$;3 M7֖fVᶣw'2tS/s)<`LR];̞],q}o;hy, ^Hs:Vpvx[9oqƣb-h?is-Üw ׾O{W5sq[Z4c`b?cˉZ5q2DV9{NBz,'XkP"SOS p#t+YJ/}{zeߣ0'qAu^TkHUyvSDKCdAH9`E}xo7.c!J7O{z!lˆV&l2LS)hȊ'xk ى6_5+CD{[jdIT({$ Qo *jd|Z;N'TL2D`u)T t z@,ARlܥ꓍EF XMP6I5) >4()PB#|iueUD1.102lX Ab@;X2#{Œ5fTTl Ey`jBPmЮ0A!4T71A .!}Z*-7hd1@G's{N smxc#0i1PAIy8V@!ѻe0=B\ACqgLVZ0XӔO1գHM4h`I{Y3Y#Rdzv$!eܸ?RabBC#:3QUPtd鶋Ԛ&j)aҀAP5yȎRS||G}˚JeWedx'1t*\'R8^pgߨ[,Dαn A#WN28E`6AHq('F=ʸ5M4hzpIfpl~<Ճ]`&1a>ګ)r'9lΩ1f dб%2(ckBH(Fk SmWQYXY,%6kfֳo$8eMlhxY1˖&NZ(S8--cX+buASBCܤRLLO'~?9Kgk ЎP.,9aVTL>Ac&bR> ^X"\p5 ~.72:!,bRzmbjDH9L00U[QtKh"ficP-m'@bbahjkH0 |b~Mx7@X R$i3A+,Cԏ>,ҷl"4wtcd~B3eţ%‰H9w{y@mm^EK"vc4,,r*}Nr%YнfIF^j Cw)O{tKi6BxBb2zMEXF%?)7+/Dcٲev=Za>6lAV <3cy}Si=Mm?&=}!VTwneֽn~uGY-ǒ'8Lgʂ~RRI2eE))-6ڭ-Heli+ZDjc)c_l6d&1gi#`=XS zEl4{Xsoz++$YF6Q>ܪX|78~^\ɵvrv,)غ {crySs(SS@mlk⒡'xQ;KiǴ AlTD"ՊV_i+6-qW4AHܲ4SAOILj+lO+6|(QKYuZ&UhT+hp*1Ŷ⏱>8jYey[k3{Ν{G t7@ (B8(YbKJN$ǥT)CRT;I\VlEQ\*$j0%"@Ls;3VNSD?:Wk~&(!oK\.$+))>q=46Щ@/ʨ{U2b#_%<0Κ,-U8H^OcهP?:cv8yyG|q*)]^!57BlT~UWW/Ҙ{?Avȧ|nغ[3|k#>w#wP 3_7[4^x3'/28 OԧiWѵ=]L2}3cv~BqnvtPoe`W0¼צU Y}m>[یÌi?"'Řa0#[94ۍBŹZ|t δx&:?M22sIBc`|68רs|KWbam}]jm,f8w9<}|Ai=#n"uʃoץl_`8osYVY`me?hy}ʥ tUst{>^Q;b"ĸʑ˟o#<՜᧧|UAq=[ .~o]$ؿ‰-X.^L)6;ԆwG;1^IGf_ȿ'yԿ:ǟ,柟g}^_.j.o.r}1>*8ӿr[b15\gqb;[gq-g4ٲԦXw{;Sf^.Or$}>8<Nb8.(GglPׄ`{3 䍌[,a= O'ѧe}kY{E 671 N>^f/Q6;>z#b±27>{ÐASwrUr9Ķ%8vf7|{!8jEQK2"QN(B Ujc"M8nv8= $8 J-XR "AHUDcb.N^G;QBE'lУ!v4K܇Q )!Nn"hLi8yV*6Q)=>PftuW Rcz̠J4QDV!rdR6n3!DMeX%3Mwop2w $NRރv&v|J1e8W}F ~A"vj5dv8ȵG>0(⭈n9GĀ$HԌs qxTtH^ͱ%9.q;Xh IH*J}ae#g9(8cZI.ͤ)GGo7$;RcFyG}"쀾Ji.k5ʵa2I r]ӭKD# Œi@K4JȜ=Fc&y?xeC(N2^:g3VQh>˓|յ{^Nxek"P(\y77?ARq3W++Deڥ7]aSg8z YstuRfeM}_xse"LUޗ1۬,NHqxǨn`jw J hMXJ"7 :)VX!dX@*lrb%|(T @jgRph)1R &^r&V x!Hk шSV %1RkMctKGZ^%>ΛD*{CU^x9g 2)fFaGvH+T܀t6cWfL-{1rEߍkQ.3{f9“Nk̳4*Xޢ>87Mm D(8vJ"5%[nHe/6ihfdE1Nw7|qϡ2d9n>&l. ׻'/0[h[12mfٚ[}(z]HQebxb!N ;|f4͡-6J"ϮBf{ͯӛR[ޛ5*r;_aizF}L +r$&in=hv;n~'4wdR< l13ze}V)ZrvRVԕ1껸ﰳz vDQzdv`[<(LEWMݙ04 ypgXl2p W9#z!w*̖B[\-(3=C\Oorn#=Z1s%uVzǓwcKȠN^|ĉ8yٳT' VI蜦}۾Fd9 FK&ؿF?W#_v].FN C)wIPЅ^) :'L0WQ"u "l/ˌΣm0/{Gr9"Msm,'6gHp.͐\N0(35:ω#|>1^e@s4;t@uA25EVp!"jz | M,ċFCAVuqK=2i4D>I&j$,}'01H# gl\엹|fDo?X\G_Ɵ}ąfa̽C-. ugl6xaLK, d Gii ?de֘q55[`#D2E?g^x8"-Rjȓ܀y#i<=x\)d(Q>9Xc]C& =rݤ`\, -,uE $raPLƥ|ZC_vbl51t1I[]C*'1%T'SR@lPeE}n ^tj{TԆ˧"U3Ś,LW%]`rXi2HrMԉ9;7^'=L-2j8ʘ}td\KT47=:S#q"=SB,<͹"ĆFA貲us?Q1)Ht|gDc(OOq5{[ u{WqMfI7s ):zw"Ed,VdÄ̭QsAv ʉe,g0%EV GF5~Ns!l^pZq^g\++vXcX-2棍yVJ?!Bl$5*MuE>ߓV0\>O۰L]^'6T?M͓l0DZX]qWTeΞH9:1\Tr~SxܹYwxșԃ9sPx|\;#*|nz@P=e',bz;}f{xC(׹>G{4zg@|xJ<7%m8(t,\bo[5jO>fsF5J'ǝYRux9Z%{<&8ys^R95:+JNb"΍W̜pK^^$$,opx'&&8KzZh7(ϗxs)xna)\dNI˰o`\u!Va@TS "yR~dGGe.||lLBd?)U91 QU2Ʋ3Ҝ.c\ɭh0$ Ek9bect;|?H;rGleΫ2F:): #$*` 9U9BjhbxhǤFjK攐zD1E$3!0&-KAdJ1!k\djHx2!u23I4GTY9qz# qRbTf駚R:$V˹O'MǸ〒ZA+L8gomVQxFVGerbɏʨUW|-t!bYIn! raKA84rz#q2h033?QC})IFمП`sqzgKA )ށ.v{ߕ€ֹ=/~&Ka{NV2k.,9%q~bD>#2{V1ZjD!mK-d |F3WkDq^OpņWzA+R$#3rH3 'R#$BN ,'7HJOpIWFG r@z8"Va%JZT' )FzɘCrb8\va;yN&)`TϺr: J7qb'4 S\Ȟ:cj*ⓜKVb7`C9](f4+Nx|{@tQjcB]} %΄~NG6piẺ}.5pA&s}Kk9RRwxc\dd)H9nϡwyCzgh;u6<"74<1{k4v\6"eFS4}B?oesסOI 109 ;C:bs&Hhle;- 2^h~ [ %j.{YzCU1l~Z|RUspB"n ~w3LUʦqq^ |y <Z(lᮝ; /ShҒ`qv:Y(K>;kkT&ATqx8' \!5K}9X1?3MkvX_g9Ք4Kg:jgza1msP۸r5ez0Ջ.s}^"bi,p 'f_K6\^f{'Or7Xh_x$;Xw $ܹ򔓓=n55IX+Ì5GdY5Ϲun9-U`y"xO7G؜4"E{fJ+Pճe h, ! ^P³ܱ92HA¯?U'86lf]]Ze)d[br M n]ei-ZjDʐgܤ$ciIf豏,D!WdpQVc2<26XZ@` E MhT f`2R TF0J=EK"/%G[+ L7'ÒKFH L*NRX%\Smbt)ņSޅ"ލx@YRZCM}eFGZ#ŚX!%+%,WJ)A, Q.% 8>FjZ\O>ԇ!"ROpblR(1E"vOpvo7z32VYWӼse X_x㯟?us)dXI? Ʌ<ņ% Ha0`<.a-Jש"H9mCfB& -&@ɐ֒ CAJ9VN DX)0B z]IyW0"XRMa%FezW?GMf1ĭ\?H/cHx1ojG+dCtʜVpR^vVqom˰[%#9wyt="jNpثn=bi黴l 1G Μ[橋'۔zVSvR"Luq+D%c/maN_!r2@T)H -0?OT3OO9R#F(R1Ag.cUvP]aOZChN2:Js8Tra$4AXH8!ӊ\K:˼"t™#-Lk|!*xc$>om68 %CJ;ww T×1VGăQ]XG,6[xNT] sa\GX2A oj~[s{S<rsyZ#iȥ@0Ai8Xa'#Ѐa' DN!jZD*đIr QVah.6%i)R(P!o;LZrjL>k@Y:Abk"k8lcaq SR]`WYR2.,ۈb\)Ac#㸸i6:J@aOXnjF>U`:pHl,FLbCVH*6{w[GXR=iu1mQc3&M1 53vF:"l@h S  rCMK4;3= F"dqNAfݜ[brRQ$.N w#r_~P#:)d(q)%fBB:9rXI^˘ltY: 4GHT0B. >$B* *l16~>+Ko^z?H8vi̱O%YgqFޛ8&]عQa{x)CifO /sRVYl0lX 6n1q6/:G3>xcka|#2OeTF='~sgr ߟx Z6}\f2rwN! ;HFj^ξ 䁥dր)[EMYFD!KR 2Q6f-=$NfxI!hy ϙx`H GM2ܜWhbQ)"RnHq|jB6{!۶4CI% 6 7#cXHO%J'$R98Ri(2@LR$(r3LJ[ 0 ۍ:nX!KR$@ӎH}8MrKSZ}v%D<rĽQ.)]T*=δ.R.t97SO1#s.F]+eCeT TCڍIe" |2 G Q-ƈC02>Th-#XFQvREg-öfEƔ,̦:9a.IA0+!R82G6Et׵d)C`**dR1ZIre3wk J ]50ӒvBJ,0+8tAij!JCj\r @ vؐhdŢ\M|e<ˌau /3^g 6t)) EH ]i =V{$Q` @nF88VanC; Hb!%?'P?'Iw_PzҌaWxkkϜZ\c .5gZ2[JQ9c9W?gNWi5cܘ wKM68nJ1`$\h{V܅ ܺ:.=}cTLⷿ ČSHOwD{lO@QP;uҽ (]Voqj46 *YI)&\17K] JGydqzHN^1|$h8č"+\2r#:VP9ʩ7>-^Xaށ@יq 8C2ͧҽ5=~oj{v;̙> 9CMI$8V$!رtp#1 )a]"q؁r,Q%vi3eo:t|5<f~۟d 7qQ@l 3EpǗow. @T &K‹/}f<80?E%V'UsZ]'n N4uӒ4)=@(a_x.5)"c;;FMg40eob %e1FU.6q#pɄɘ*ľɰ!<)9!݀ $Dː2e) D%dcq% a\KcjyB0_6H-)} AEh-p^- yV Ӊf3Du`%7 ;Z9D G!-̼&t k"ZA6 U`ZR 3*0U oaZ<`k<՟>yMbcQw%׾U]qٸ$_m0ZI1c~fkBk .`߼{?$dUk4t$(6vãutOj_)†s=q~ VdQC6"]8nEl=2J k!,^xcݒFeB2Dr NpT, *=ZL}rهG7o3YᕠKE{8, }RRHF?WPWƣ|TKd()mRz$)+%X\;H(j C$"$>x b^" G)"UD JbkA$1؀K$QlеGkh1#REX+45, F#6,[S~{$6,'CP0z\l nm15egM(( ѱ͗ä@cRh2)bB,e-$QCq5}Cu9)sO6_q>w-/3$iV?,p[XWi_|VX 6^yCMS=?X[*.3*)Å'ޡs)} ?8&[;bk)}~|:au%~vq/ty0˧y\F+ܚ?|G-pҳ(BB5V+Qӥ2G:t@pҢٺ9J٦ԅIOWlo ' 098E.C*@)(f :ݤ3ѐk3]NrՆqfr"(%4IJBT681-1OTEQHa&AXY5yrPvЊ81d_Iƅ# MM9BTAvzR-bظVQl'[vBƜގӠĐ,~_f\5k[\{+嵟?qS_m[YP#̢sO`Ғm8_uv#TٕLQhG,ј0k\?%[ckGԼOu- u5\F=C"uDqUDi(QQP R ZKt X˳W=:A Zxl;`2atūo5|fj88Y"13=2h krhF5(C, thɕ!$:NѶ!4$*ݕ9)XȌ>§+k`Lv7b'8D`MSjiϞ4*R1'my3OЋÆeNm-CBj3G:cdDVf-%G1,Nj )1._AYG쉄N&o6w;nܣ-UHJAh2%& prIA,VBYAHzb/k\~Y}W{_3T_X]/bOR /,7G`(Lq\=Nnνc0-?g3+8x~Mm3MH#oCh"O/=qy{vƌ}7[/kIŰ>k,bvb КKnsR@I7rAt5-qTHYm5gW!;u1UI"+!J"2 C#Ha~!a9-2rT{|g8M'[N1kf(*4=KׅyxļަnVWC4aOzpkm\yǐSރz@=ЦG_HHnѤD l#9'fN.y0fҚbnfnhmy,$_hTbHzCF4kcv{Os2ӓ_Dl+û|.1߼ϵ}|ϷVUD3[[~(q)Bq=p>s7/ixmp6EQ,^ij[[=:+836Y>M>8Zيڤm\KtVNKF1Z\Us n~ IO~53_2tP>8h }0xx%- Z&FR{AZvT3 RpB"u0éM. 0K|$1_8!r2@hR?2#ZNcuY;}3j#q#'XlЫ@6:"Cں(wb#NFYͨ97'߭UFSȍXӹj8~;?Qur{8 [iA~?Yэt]d<ﳱ"ۖhk$hzsp7«fO7Ҭcbdcse!:w0S!gVXt%tb1v@[9.^ S X@/&g%a7 N2ܱ'7Xm9j1)С{$=b3d7ܤJGH+X 6]S*\Q[R`2`TFxA\ jS}z|vqPآ*a.S0eA {`T.9l( ,CbOݯǎ *9V1pAʖJ!m "mdI M@N. 9uuN-T,glJ=hj9ň5TX0I9Q6@ ]+:SP!zRFhӊVT2:Hwuk!wR?@+?p *N=K Nmzvd!{PP?׆G o,M`~sګ%x`0Zu=>gOq1?Zp1}o 8⒊:ҁƃĢ޺?~j&5{h ^eF,N+pGR/@-pIŢqNKx rZ#a1,u Z_/íTXCڥW3'(/ >P-DF3l3a7hڡ4jH'88膒^s%c_%z\I1=hN4ʜJO6fnvllclƈ.[ NO#v݌A&ɲ'/mS8-&Ր &dGY%tcLEHcjE;J8o"h6*K0#YBSi@FL ` e~^`f&2QSQZltp> _r;j)v!KD K);)8\-hR-ݨDJߒqlJ-o9lnvjaPLQkkuo=i!ؚz%L+O-&47hES1Yp= O(rvxԋ&քvB}ө6?ļ A0ՄPmUt,*,qƥ:a& ]YN[̬A*Ȳ>QƂ2Rm$?hTF"<!і`f585G8C( p>`XU K1v6g T3jN_SZQD fQr2@ĄMD&,CduhavrP LJצ 5;żNiGuP6&g5LsL4$ I1!IX;W>DJ悶Sf`ズЮ uN0j1B9:^Y-q'3܆$Ռj"񋨋רB5#ߗ<K\dng2rWvgg魿-r I|K y)W^G;@#DAb>8'\jϳrG>dt]bp 9ڣr)b"PZ{9#*$7󥈺-R8+Z.|(O[B/3,ш!:/R+PI4'=shg/W(bEx?(N䩺G2HK`z24ۧfDlamx2Җ"2T^#lKpAJ?nXB`+˷$5XbyJ;C-, CUWVdv0{᜹p +sT\ĹezCF ɜ|R2wuBeJD70wf׎x}HOc/oĄ3#9F^y8|@'7Y<}跸~t'#gUJ[0J#DY "jveLF<$BQ 7ON;XQ&^[tHim#=(\;f]/yhӔBkx[: ^7 `#{IIڣ +Z겇S泣%2tzמ|!4fȧC2Giʁ5bĩ0NA UHF!X{ IDATMEy Ϣ[!khQ5 =AڅDƸ4G Sh|^J|1[d#p6wnLe}ZyBp&1 A·.B&mr ڽRe?qK0ШYjy2)%OЫi-n`1RP\_!B$pE5%XYYz8W=J(Z\|; V-~l ^}B:G >}؆o=Is5Uˬ2-EN=|a;=?xO2+_j|ys7:f/YWSmFxz_$=4~W,}/,`\){nG_9(' 65prpAPךk- U.8T*h "vEƓ6?!s3G==!= m&&RƜrMu4A19 ѭ*J Lt!DEw eLRKAHWY]`7Y%ٛV{]z6i)n,kXHm;tzmxۆ k6q*mЕ]G|$#˞`[_kDsVlt-#*9姙48>ۡ{ȓ_c\9H\cz<Y>jkToQ3f`QcBr KG4D6"0X@|O:Eu24ۥr }ltNp||‰`}+bg?L9D5jĺSUvʻrcD}_}bȍ_Q_$ 號f"6w}\Eml{cv@6$ltj zq_h_ܵk^pk1\^lm:.a,dъ񲃪 UD98K1PuqoAJxUhBRէ(!X4"C*aXt4"g5z"*Be!Z8@Y($TD7,o n/7qB>{){O .*3{ǤdVPIEY0PP;IPYNޑF-jļ)ښcRG0gtcRQݥݚrPpD-OHUa } C?rdc(!EH4 BYŨD4ҡB@Xԅ +Rxt\~ܖRዜyſzkFO*=i1 x 6X.+4./=x (PqOcSVixiNx5#\9|ȧֿ8|aGd"P.DBwGL1{][C2bg=zE;s6s4ٰ r#B+.&5=af2A@6 f4ۘBp~c )&uW*&oj"Y* S(+SI6ZcJ2Tu+a);legS۴݀w``>$<.1/0.9dǶRZg<+ 2^pgz+V(.P`1HWI'ɘh)OC'oDMB#RdSNc!4~QKbȄIZOf ƣć(6;_25sV&| TN(q]bAbzp p((@BZxG !Oa F"KbO,8xA,X'bi !<tlrvIY2MIZ'ڃܯakノI;7Qo|s?6*/[ozw_bxi ; y~_S:+%?_7US?c7_{eÊ'6Pk/3[Tz5m0lY hr8%8y~2z{⍘噀δ1glG-uBYDZ풙8c6@aWk2;C2cBFku.`1q'#+ZR(+GKb)hOHLb1gSQuDedxOpe׹jqq ӐqhP/0(4VARuђzͫ%(BɌJS!wSCۼU!}rz ߁W| ._~8ɠ0_w^/v>wλ?.qzVq2Miၔ` Q(aB(]v4ID@%ªxMu37HKw{ycQT(i|"4Zij?Ϥq1R\n1M͙ij q4#dw׏du*~rT  ]Gdjy͏9{nob-jVHVgaFKw8<[bq+X8xpnCsZmn!*[4dq=Όá4q*j4(0.+'$"EYst9r S5˘KXBS`֙ܡU69ulZ9HN25$ӯ^"m.05? q} t 4zS'#:{0eda12s&;od,B)[bY2Mű 1hPLX`4d]IcFqR.ѲKTQBA\dܪWBr̰JC,)R#w*i d}U)#da~f)]M#dF62r0A[PU)Ro8G[Ee !X"DZK8ŌcRLye#Z^`Xʱ9cv"G:T\jRLK"1SG\ ood hllqpl ־K lmaYD!}[B`cP/`6WؖAJMo6V`IE!?پAX LkP59)1ZO8cS-Ǐu}_O;ܳn6~/_~\m -Iw0E;f1oG/}__qDфۣC2&~|di^<{/U8rKyjfmbM*B8$b!pd `HO$BFDZ6("ݴnhme Lƥf]`Yų-rNh4FP vejZ(w4 92+Xas5 /1dڟff[:\GZd"ǦKf]( z;TSWtLҘ4U O:pYф,m pHJ-4~W&uP&%n3)n)0WئNbtoY:9Rk(JTnO?Fu4\gQ5rYvlbz&.a"ᤆLp[P FNغDVz/m*q'1 W)-e [r_1pU⽈(6QssӜ1~c@M M!(!!" F V@ubja2g8s8Ű_eyF Q6 KnG`8פo3J乡V.13W]Cv_~yHu)9{/}[{{ネ :&1ye!'3~ԭ/3"gjhِlN7YBN.Uk]wNO`ysto1=情k\1լ>}5P&͕n]sJe:ϿƍNQpxLv7T2֗yIŭ3 ,X<9+\L.1Yc ~H}I{xK,&MMsI[kD7* dvM쮣 N~嘬jB3,] -XT C %C7#tzcJ!)DQ#ZlKPJ5TǐqF1/ =4 j d$H a t]g.G`X&ȺX 7ŠCۋPqꒄkvxB\f)I𹧹G;˜~XyEOTB-Fgie37Kp >z?Tep;$;3H/o~_/!!4*X`X\(!ȠR2\F]ᛴ=5|L7:x5㑫Ys՟F3kfByj +[Cfde ۨ ']X 1#f&h0U0 8:Cla1bi!*`%6ұ'Q̣QnD!g*]eI C$.2cƽ#*t'ӏn@䒙jJXc)d,KSBmZ('@(M\K 5EΉ-^l!6G a2$85 uh$g iP~DI)CCPc Ɣܗ$<~o%{Xc!FV"ftv TI"&.7 rL$|EUF QH7?FvHrKnEQx̎ wJ{7r^ln (Zc4f}T'kG8r.A!z턽Gg;m SO? F)U^[?v0UY@o,Ap%.?7^a3ޣ+=N0HQUf ~3Ow5 ֛<8p :{W}*Uވ˅U\ߢ^߻΍P '{tz'@kelR]㼺͟gW_{Osŗqoc *&2Ó./0j[I!T{L㐃W8tͱ'-r+WBn^ )9]RP_u,/#BP%Cⷈ-*c #.P"t/v&(ykN}e*5I,S'PUERLc\2X1X+ClQ]B)Z1̦"ʏ3SF 8q`WEX|IEYDJE^A<\/A ƩF4+1l.\gOr0\gL=iQHrCJ}n`"EWJs=&UCwhmLm`#ݜ?|F{;ՀSٰ%^#c.$n~RY0ۇt+(!Y IDATEHM6Ol!B+ 2$2Wߢ!8F+C?ϩ=J`!ӵymIeTG&Q'#$  Ϸy)E _IbHz8 PJ DGe:8Y˻Fhhc۵2#6JBL4̑&ô tF +<;Pm.=O5Fכ8fn}bLt/ج8|P1L'Y5ca,a斀YZ=9͡gk{ԏ$3|)-I!厨Oro?Me^quǡ|p27Y0vy.ǹ)BzkS/RXJcYEIEHcC $sP D -u<^حSybjӺU ;PZV€0˰mSIQW^m"2]DY I1Z)m22KX¢8U(y11a]1V.}2e9ʖ_i2 {&\uAǨ1Qb'-& ^GRjj >2/?M&q~ cGέf 3b,/}: Piv45R&軂+s ^^]Ze+)a6ͽ/1%C fa>tNےvtmzIBNbg5F̔iS>m_A_K;x܊g}ٽgR։{xk*E"F+JP(n]J=]8"9oY27<* 3ZCq .a$Ȳ]!$ t:MrިK͒5*Vi֜ `UN6J MDg99BdTU!wŽ}~7TW=~&! tӔ[=$Q {#dhGBaאy8A.压<JAdG;lP ClϞQrbʡC2bire_=;9R5Ч٘RqR*aԑ|SLb\`{:feNsMV Ugj9 P}2µ v~D2%ʉ26VA^1%(0%2BFR'#ORaQ ML% R"h8GA~N i&dR(/|O2+">9ϹC~g'G}J je:_9 n]{jl:=U/p%-o ~h&jgIOB\! ,c"g~t/é ]D/#¡fFj1 d ߎ0$3"@4:w@MO^\tM$4X(KRh^ O^/p{e0\# S~oXDRկ?oE1Kk&" 2۟W}\[I>o UрoQJ+h[ JgQFR2E QHGNQ jYD4C^k_w;1]7x%W=Rb)pLHiNs&Ce &D~-FxEIb0 s`K6oyXp 3h%p?U#$K^P9tXav9$(,/^Wl ֺa8̌"M>kS,ӣI2{?HnspLae|%} Ub?.ʥ"]9JiC!0hrG0^0q8KkX֢ebȐ2"J] &Oh_/sŨd0X%shtHܔ9?qqc{tǑ$),-r!{S2NNnsr5=hZP!6f fR]ĎG@s'xpU|ō./PIVص(07 }Av<>Ey]q^*hmIr#`:rǮ^I.ތ01֡lO1vL"/ 7J `:S"}T˦NPΕCs3mf ˌDž+$ßme5WeȐ {IH`,\&/G Ef>*XÍ"\YS)p)E&Uq̠df)F1(oϐ9ʆh6YAS.$tE +b.y!GIEQ=*$ZRqdq4Љ4תX0>Nyq4ߣTх6&3kH0 tC M~~ |+8Vʕ./CXrD[Z(V!Q&S0"1s.Bn 3X{govIkY&FT$^Th)) QMBbb#ѹlNRd2C&d C#)97ƶaf㦆Gu!䵳X>z'g v+p#M+;[\^؊6xȫ50 q8H3E!Ȅ8ɐ%L!qa*rcQ-ryD(DQL7GB/;(f+Q̖Xu嘂V 2 LNsdn@g9Rg,KClb픢#3I:h+Ǒ,㑖%7~۬yu|CƯMfg=.fodl@r5V.9f4pSn*Z]hIc=$:>N%46PkM2gaoѱ䶭 9\yŹ\X DzmJcQr@،œ!3Y}`qZ굩6?|&m44Mر{j"[*II-oKlG,MgNY5t1!^Qb5(XePrkNC :̀1>2/`6z~3 $X-J#f&jUe^kcL7OlP%G#Mh"2fCwb@S[<`wrLLP|ryZih&aiIGdU(3NG(WRT!!7EJ. RkTbWxVtll4olT(qmEbMOrw6eo6ܸʂE.vlaRV 5p3yxN9ص9{ -(סdets 6XGV*PwsxY^-旖o5j׸2>GC,.~@l<" qctP+T({8W路6"+(`e9._/s\됎4yr(,5, vPZa-% /NiA˔$$!#V?"*X-,)bC%EC41Je : m,qQ2Gi opb]~!V)3e6XWYS>Lݞ>w^"x'qwN~v3D"톙.kA_).:q xpq/|f}i8{et: F 5.ť.8-/lr>cWE)$*$|pHNnR,7Y**7{|mVC0{9:ʕ/rr0p_'iunsX*͝Loxj\Y<̀1=$P|c8/sd\,K-U.WQsws7Lie\cMd\$=&W]拣|Ruږ5V8%~⭃jL&]OG'rzc/m:yG a_%0‚iRdt<8]go0fl9jAKWZ!0&ΐ]_R60=bdi?#6c &yyۤ$Kr2( v؛cP QӊELSe@~u ;Xv '1t[Y¸(S$GbMJLJFG4 DH{9hECQUP=d&v+8&g>y7}hSlt(=%(8N'(\3cX<~'|OE[P(88VH!bӉ}*!4""#SYb!sEH GNss/0w*[gu&~}ހZ17_X nGC1z;fgYwlP&>R01R^H4RH0`o)Rbn;KBl2\*b,e<;V!!W#s Qp]p,|moS }=%J?xN'nLg1k\qP-H9ޛ=]z};L<[/W?oSc:۟qmu;;ˌE$$E8 +La{חj,E[aa\LwJ$ ` i{O!I(uJ&ƘJ4$ (*v(˂2[`,;f .u-l)A:a< )v(+Mar i@+^FR,2B|z|.?M3Uܝ:yq]s kgȧl.^f=6 g29ݦ֫P=3aavi/#Xڨﲏ0}tY2ϼI G5-.o|}#JP;TD\qeyoɔ_?dt?RlS:&em~fT+%%f͛pp%ssu JjG0]̿OQyL6ߙ9 >80e>f(新!J?ǚ ,cmcƀ0_"uopgQ۳7|N-%Z3[,8?OUbUd-vЩ&)vST1ž6UT@jt@3TRmJr;Oh$*hf;aXYC*Q|ٱinbZL&,#rt¥QJl`*Ve`iDdmg:V[Щi*fHQBяY1|GkB#IˈauFޡYʘb{ Gv}nu$nBMF]Ɠ*T"3]vT&dj>lewا" IDATmtgh%a/LQY 1;Tfl]RTL"jǼ~U&wx!N{`nB"R*zfzg T{+|?vm %HoN9yaزJa$!W9e).Dfw$־c ةK^+dYAaz%T)J@['LO)'_XĽ'O<-ZZ:q$?Ԁ{ye0+ks#Z]H]EoP{o)$ڍwx"_9oģ]zOog}@y[d29(͚iɔg:eh$uSfT!D[>˄ՠ\gEfմ F/δP`/t ;uM7QXnz|sglaخ3L3u :L)ЖͅaMG- bB£)]kaB 6̙ܼJ{x:4i4 V&N*o `J,G-:%NŠ&SOj|<[%iS$ R8 dIE)MJѹAmR]YEFK,23 FY FcI񑖤T'2S!+2bR}'o#ڝo[eʲ%e77>uI<$dIjYZ4N`'+Y4q|[_28ӡ~7%YsdĚEuU/ovRN|Mc4rp4RYe!D}"] YEf\gYm͍1}4,3V|clSdس3SL=|s/]l]f˛,޻X0zu,Z&RnoTR&Uȴn24JPf EbSk<žC1cCmʝYLoU  쬤Ht~TqY &9VLS[HPCAE` ^75Q|_!M߮`~:'<PqSt ϴHeԙŒ[8s%N6~nBk{N4B_&j3' #omӲ IFI3t7YOT6`@qns o{nz{ RPը+!MKAF`쒁K|P(`c%RQ yu, 'ɂ ),F81a E |ڡ0GPjPBcM H |SK\ZDטI==FN IfaO_x9OCU~?"f;!oVci%XoW+gyh1d5zO^B&_|O2jbam6yldrlw+kGLq(ijW*MZ;r-T$*)Kd 1@Ƽ^<py5Xɯ<i[k:+2!\ I;5hj=;\>b1buYp¯ Gx1t17)e2Pf[2?B/|aV]~jj iѻȢA-tؚE$f>k:-]j4< iwXp֛HC*,0"R %rJ)hE74iFABb$~, K 2GOBJO8P 6ĹyNBcB~EFϚw#PYܽ"?yq1EF)Rшg;۞l0 ehs&/J_-2_ ڳ>6ߟy6N:!-w&VHl a۸^@4}l(mHS H$N%!m /^'GK(vch/b6o|[Vl*;9I VaEI?ωK3F~2%$J0~N-/Z[x$԰!A`j}c,/pΏyR@ߴh~/B ?v؝9sT][㘅:{-ɵslO6qDDcx_d0ٽO V?vq g]wӧ2O-\䥗$sl>r TnA$3S8qR ]R<\Jrh񳊵pIǎSܣos|/֧sp" ^7i{ߠ7m!G95wx]F0FC>u ݦhVx.wwLV9/{ʗWb'~ȑ) ^aa-VNKJHvpJN {f’dӷ1G={W_I~ۯ=mV8lFLmDVkr8pBRx.m$*%:CfC*6`3էWV2 1hkIvItaj7j%e_X&+s5vnS8 rnk2f$$v?ŮW`T3"YY Q}'cR^̰Gݿ=,Zk2Ies.Yɽ"M c.V8506*!}sV F%k=F} }`df(HčK?{ړsQn I ơ8k2W䖅-ѶGQm!4JkQ$.mL Q-qr63A3zB8hE / # m I"W`K5Rp-ȔR$|* Éܺu7_q鿤{Ewy&}MI|kZpgh[.[ֹ>zedʩTtk': rusk\ =_ po~#Lz&ӄ>}i~7xf돀ȦYpbe9a(qʜ\869XfX&K- H=mx2$ZVαEn{aFYKBn皻| fNY1Tp5f3lcT.6GXCSňķٮKi{D+;zo>emPN&$b?!˵J\;2#FِɜU1JH<'&*s\[  CKQ(zX~- *+ȠԊ/Hؓ R`N‹wD>޷8x<<)ta^}$cXFNk (\V6CHG{TN4Nqk'~?v:ܒ3B@5nƌ]]R"08vX_qDQ#q  LRbQ#?0 $ewbuqqS(Xd5Ä kqY`u̘=#ҡ#RĂf4TA!EH0H͇Xa ?)Rq?#9&g,O:;t9`ᢜjG S=#H|!~'Y|;tèA_޽+Og7 `rtie+R>`Wo5M"7k.?Y'.Msu&83Gndk46߽3羉m雿"O:W7WWyyYv:O.`ؼ-|veKS#baA ox[ܝosG#Zoҫ_NS(2#ƽ3!vWXp v1L2WpFSse9r}Wl&}J΁ڈMI|fܿA yà@bqLF6A!-+I !rI'.U pGEXy"*$esd$i*y f]K)K -RKbpDԘ3J ,AHF`mWqrq{h;;XWH&IA y6,g&O3|"(æ`qmW í$2@ =Ũz|e"-3޸̨,P:$< [!c(RښlnZf.nlYM4;?< y}e/1i dFl  \[ ,,7ضA(r7CsPa)MNx $ fbRJ |$R+$Xa{Ȅ 8t` +UO0X"lε}l*s'X v?u~Kq}TB6<Ԗ$U㴎;fhQx9료 MM>J -;v}U>;O?[,r{;GTr;2sBV}g%7Qcy!l({ z'Ln287|2Yd ɰ`/`e8u{>lSXJxtx9ŨܰG(baPg13tݺ;w:/|JE0{~j#'(Mn e.BDW $ߨsѹ­ }<+YD{=QmpBlJuQmCѴ8ȼ r'CvWi^KH2f(8sǧqClQ΀.N`\`>'O vꚖ8a1Ќ};%v1G%5* e^K OKQ JT%BxDfdUF^*6 Z`H,,-"%JVkHFPF"HY`}sx7R ;̎ducvyvޭdsi5o svN>~i&yl> '&|h@񱛛LnUjw$_}&2r3ҧP/=,ӷ穎21E*\Rƈ(acY6ABP`8f@ 6^vR%G!Gw.OoILIR٣;0Wqjvپy:DW{Yc>euD`}B64bqd= s ?nKh噣AMubxӽQ&fɶ~rDXoIr&BcǦFrSŐ[.Z{<%ykj"/%9зFlz&|tkVHyFD2pGZfvpFqó6+MяL;t-Dc$ABS r0j^JiH3%*#MSLW$͎G)^W0i( [d$>"jir@Vi6',y65Ql3\Td"Ia"/ɵ8}`@"o#ݽ!ݶaGGU\] Y@AL|5h$JKQt6Y#\`Ug#mل v|oCah6LX0 rİRFxFF90Ԏ5 -86FiFc#a@l#@:.Ѫz^K34=G,^r/Q9p3'=/x; KW $ӌ+wy|1xҺGvZ"[4 xHr+4ɍ/P _7!K쎺lS0i2juJ4)wr~-F?s~ \؆bġs\N;!YaH^ij͌{@eskugW\QŤ%zKsʦLRN; c{ϡNҧ1>#n#)9"&a!iri$w꟒7R*:f\[xzAOF2hBsrc3I1:C.5Q" #dC,E"ӂ"aD1+Ȣ:p!JZ 2R3GOp5Tec J ^Z BKE: FL;Mt~-*?~\7jI~$Fð)AJ.Gڧ,S8bܧR=q!Nn ހFH#nQΜfԏi>2Ŧp2@YE#LI,휮R}ܒB1{ڕX8~t,%KcSm%r?.@hiH4 uA6Tl%$ɐʢR@GD;SZ7Hm\Ք> IDATe)8(BctI EVL nc/E>q4n巩Cc[Y}.c:y1b~fos"sfUsL9޷Ȩ* IOsm3f“yn") h" F( 95¶ oIc(9c]LED6@E6ŗǟ9~mt Y1uHLmṋ[1$`-0iJFD9m&,vUV6pmS!Yܰv6Ȁ k~Fmҧp&2KtH+Bโ0QH쐇?s9_̝=޻22(F@}Z-$TrS,AKIYh#RtA8&xD)E4ߢú36r\`:SpW=vmS)C,hzW)T ȇco_d3䣲SͰ[b~N2f$c+{WByV>|ɛ[\1DH;ﳵ)m\7 0Ҏ~!vί8'I6^llq#&[bWtA_y\K VmgHnH(H+ߪٜ t>3Mxc'y[&]F*%8~]ǫCbduBQ"uBU69f,ŪjL"5k@/P…F%N!p]d?0!B(cl;my8mX11sCMZgA쮯`#Tfc*i0/i'ѡ-edlQx~XVTQ7FB`/D 2U QUcclK DS jԦ;YFd'rdQ$A(rHPZ8QL,JA:ےĦ@m$R`[!Q0Sh#ik*3B)plpJԆҒx€O3l b$X@-U Hl- ( `#5;bl=yuؙ:<%aÆ+nTh^!k6xq$^cyn;*[1oq/u#.s_rbk>+,GK9UVM pf&ҥ,"r\,i:-D(RS,1FX*?1#ná [CKY?6[Tr6~a3s<~uYo3Gh6OG-<5ӓ8}ܒL$% D6dnQRNS}jEɒX樦aPSUd&Y\?7|Mv;{rPh\2`*%U"j"M$ANd*34ie3kIH(aAGGZ#3pq+Bz' r%\<ֽ;K<9uo*_|=7i:MO `l$-Lɲ˖E.W*\vYi&EJ Hdp zRO|xrz.'+5<~zQCR='D,VmFim3?ahGs\=sɛ)< 23);MEp˳6'>;(03+d661> y<;TpW8='A?UWl-'cMMZ㜜x=ߓR6bi+{T8_#\0{zY& $s4ӍOÕT!(?cΠa8z.3K~5_lH5r'1CnBՊӡOqJ(i:Έ87afBz!JFQde|!yY,rSfdQ#ЦDnMVJP(Hrk "r{1SqE$Wruz_[$q> Wxu)YHDt)qpuP&'ƳUV,8R}QG Phc!$F!(yqqw% +4 RbERb:: Xa$19_r~/L '7y~WnN~p fG3E̠eW\hgk[xbЁ ?8Kf,ȝ 0 EqAKf&F!kJb$¡/ᱴV53p)/ugƺc3N*,xȷT'Jg4=PT$s&Gx6,A&46~ %,W~ s-I|YoRÈ㏝%Ae{μ0Uz JBтR iwXd}d;Gp_F-7|@i뀯~^~GDQ ~̰3@Y'8X1$tVc^߬*G*cIS1 "\ji5Չ_c3f5fYyG[ 2sv:^f&8^P\.60.#ţG]axj}N`Ǜ*%9BX6|bQs*E O}n& ΍r.1_=I_B+bH/,QNGv|Zdc\7!sg]t6.MZ-cihK!(OM*8n4XGFe(±YVn,P5R@ F Uʡ0SKw.} nIͻwu=NXs9^{'\ͫws/0nc@dVIUfJ7H!O:/ &i>J;K>N_vy!>_Z.۴a"*-SpfqG<8Xbh1?D#hK2鸔^p;wG~dw{/YVл\nH*r+2@:F ̵"qsteR đ/JC :%EONcƷgi}%~qݭQsW[<̰˘ ?(ͤEqRqMߥ{Cay'+]A B!\Z rmf""C %}0a1(_㸐}zex}ԣ,N>W7?# D˒SMth2-0$36@%%~ugx^ҡ<(_:qJJLG8+\~w+knʏOizK=υQk_կ iZG;o9w~oO mr=ǵ,g}2iң "鸌B:;谻qnR:FQUC5?' Z8T௮29(N.~`IX \4.q#>Ÿp _Z,RYqA )`:|?$>iZIK?(2Mvo~#;lj ט_~ۑޅӧg>5Xo'R> [`izK\};>7:xBӷؚn6z8p,*j`v Ypv0{ˍl[*`U'kYxϯ/2JBaQ54GЬ\$]D>V(q\^8>m+fzaw<1M>Mw;H6J\=Xd2wHQ&iz YYcC jA%gcjL%|qO;[HݢT:b?d˱)UУnl' c&hSNT:YlZE4GOiyB&+.̸t' 2&\|I2]Xݻw =>Nd22V3?Ae}//"j8O]8K{ݵ]nݺ1}Pkg 2dS.JeA+2eqtF..}tp%:/TLńdZ(lL* i= 6wS HhGLyqq 5uxmcb6OxqsO}㫠 , yŏ1~3^&:(V ZׂH4E <=K[aWXr/~c9snDtiK&dίq$s'~!kw/L'B/]TF&[:AXV}R[&fx @XG*#k8l"1q5)JI,'Ht8pT!Ը~Kx (Q0D'9ooc~G̡uW#3%q-~W0(fy|/oX:F7lu:!]F93ghEqlqn#s刺b|_5VF?NX&glTc;{ 9{wnHO A7ƮW$ԒPDfb{#=yMGY?;>^D2 ,)mABesX s%9lrs[~x|3HFnes2m4x`b>AP*0{lbd!wϒN%'Hd.D9ꭐe1o2CZ ygmFO8_a?v8cBqyG:fz^Pb4#x ه6i|SSo&k$on/`R2WmlaKȽ{\xĻGǑeH0;M#@GHXK1PT?Ffxװ^JLG0\k1zDS4%3*9ݲV}1şa\}tVNTZ0f8|'{dYJtCf l jM\>I(kF$[^{XPpe|D +3dn!`n.Z%-rQKӔ_9)WKh `p8UB$;쭧l&U|Pdwc93lQ[.+ȇ?Ǟ}\;9o\ɨ7f5VwrPp"AdczFӛlv`w}t GI3+U3C_'XG0Y"E=wwJ$Ȅ<# BGs.:NA9,l?1gbg#E[(-z IDATBNaYei $%1r(mP"pMrCk "TΡ h0d@k\2} f y3nO=wgr>1#{oֽ 팍T v6vX؞xuI+ Q鐹ڿȯ@?x?q߿[]7Rs]Ax]Q4e0!NjwP\) 2t``47ߓxq[($!i_kڭ1*>΢pGOw .a#O21tZ]BȂJ!MQ-FY#o3tF{NC3m#<{'m[HcmJn(9cL0ZzS#p,<)8]W219dOɓIEMdf L%"0RHЊ0@i0G%1~`'(ucHk\ j>C&1F"d AX2@*3hla%w3a\,"K915EZf7?p36f[L˜y [E_k)>^ƫYRac mnXa?E(/YKwx⯾4*q>~n[6M-y& o\}q4]bO""~/ΐ痙M6<8s|ďO9!v. ): N! IpŻ죜=9@CK96Ig>uIE-)5 M21ViiG8 ?\g*_ kx"m݇"/Yi5R8Hu($)&9C=XBpl71 1ƸY<9Aw̴&kڍ9ŝiA M"&Kσ UVVLsuMՌT}>cA۔[`)G>QdϨbwp V;7\kFt79p^cb8k"#_I< liMZd-AÄ)!ߖ YZQNd!chq#N:OROOq{pK'3.gt*{ a(KUX= #C=?'9FbÎ_cMzač!niP\q֣3L qjM wc /X>Eק`5OXTsY~4O>8'P]ƕ;8 ymߒ eV;(rbHi,A`1Buq|8*'W p)$dFDJ{Igc f m$ k}v,S~"U\et8yn5vst>Ot?HOSX+WOqvW,K|jV#NI$48Eu $7hv |)`P!R MUq!Ɏ1PuW׶EOgx|z:/ ppBd 2<a=4aC< A֢l11 bИ@ hcwさhk`4( 0(! t5 ?p4[Qss{ԑ03GL~̽8vF8.c7:m2/>1NU֑܍*%>u&z7Ҍy'rFuC ԋ=Cf# KlY\_56RY 4v!z .v]"C7F KYqk/cF~+zE$i"xINCb(҇+5H@`>}۞RqHʩiw`0JF,Bo Lѱ%Š"M!M OPhP.XF=NwME\,]?+sDM`1x >Χ۫|U^GfFqFG = mSK$PR Q5XerR\Oz 2'h5]ukvǙ-7HWwCbٰǬPp&4x9vni 06T-:.3 (&0cw^bH$`kê-r5lͱ޽>Co,/,Ԣ 欢HTz;j0V(4uCWF*AjaPr!ӥc#w8!4wPU&Ƙ/rs#boFi*G#+N5֓[ Z_D%z?#|e*][-r8hk|abH x @k0JƜcRZJ\En-6A0'HG\DfC 6Kb>KbY|;vx2 QN&9hG/+|cxgxg,^b.g^au#( Yyi |Gٺ/܈Oq-: PW qSOJh=6XSVa58.*8H 5N}@*r*$>SdZ9Cp!zeG/2j,U5ʼn"Rkr߲Bڵqp RM܇@b=zh1r`l^$ cZ C:ߟōs$V1@#dE\pJc3h"SeO#K~mccBK"llhrُ88 |xyߠ'iqM.*chm(pqh@T%5`C<(l3ÔI-Ajg2F .cp2}*¢C H0BaI@bSRwCBᰔ_Aˬ>n2cNLXw$Hl`7rG%%Ϻ7˹>Έ9Z3Rv7vs3+1&'(o$2N Uqi25N6)T=1" ;hlEmPyFS--w}tH%!(En L|}p [eݜ#$ koK?").7Esb MvJ+cFW#1묯8-w9ţ4_W8'yeh}ZYTҜwu;lwMPF݀EG >Mp_ w?`il-b})diy [47}vp^yHn)TQ"V+0,wHK1t;I&&r0y!nUArQFܻc_a c sZ! {5V= 2b -_t;OX;qK-׷̞>OW7. ziެiSβ7{QJJFW5ܭ3C|& j|rsyNFҊpJJ_<0Oe;9eD<Nj $- v:94)&e"37?H5c{wp0Lmd5vA;&S~BFiҠ4c8eЊLtqMn &#rJ[JiMwBtZd$q-ZAB9SMkc'f>ʍ{ˁ44O)LP5P4n:Mpʀ0)(a Pߗhq( A:BK+0$\<M*]b% DLkP0${ *%xRНg%<,Mb93Ur7@}bt 9jr/ J %:YU86Obb :o-V#H4AE+J#%@mr;B`CK.FxVa2~Ďo ~dFGmZf7?pS%#_<ιS?G͝ѻ`Wi׈: |dTEUUP- Wm<${~y;3/q{yy }e6;[-:2lݗ/"F(g8܀nSd32՗9v2q;X5ׯ^Ï<{YJE[F ^>+d8!V3V*`AkKNFK^ggb'Q|B[i3I`$NyXvq$^|Yu7 2I"-22'8:A;`[eV7o'~~|k *-c3]ʼnyg+G;o3sFT%o L~+8Zt3_eDE^d/݋\i<3Ů{>y>A@8sS~=MiI곙տ_=`+b߭ r*4q=aTCq%jna8^{qY M6)=ta?KO\A ncjQ.K6`4wYn?2H lN *7p3B9vyS~n2FvYxe\͉n B&8rIT>EoL%znZSo8-U9ޛ[~W=3Owy̼9+ FX@l.w.G9쪎Qn۴0cHHBSJ))3q~ꖟ+|9}k-'-;ur[80sy{s[\"ui Up'5 S\; Ӌ5pp_=\xLDr"&Rܢ7'ols*7&s<ߺ~ )fRG( QSԳoen21x?ϝr8Y$xXW٫gienCLUXˑrJgz2m$+|O#Z9 K9ΰ Lcz#'*o ugރ2҃'c>K|N/~}"6i^?K}]Eq 9A `bD]0cZ Pi0+PJJ4IqRXrDY?!LM8eHfS#m#BW#D@0!ʆľ=EI~M/M_y Wϗ!x?؇)F_K|i*ws)sEcq'jz8W~ȋu?}w}o7WtqrW"Cϣ_bbo/B|*ƭMFs}Jh_ !DELZc G`28YL̰1gh{øpv!At޸RBxNܡ(T\0ʹ%l}ARJNXb`L:«(a WC9wQߝhcdϱ׶]&|°[mlVWXIBG8'p[0;F6KG$Ş;ul^IyjvP =S>NP?Ccp$V9%(M\ pV0D"3, Βwr(e6+\-" )lZZNopk>MkIRiYex}kG86r]C<Kl^7qmƞhww.$\p}D3mv w\>ƬoXː/Rͽ_)vqQn[!Ĩ!2e X\NVHZe^ RsBf/ǘZI^dϡ >(ļtҿ٠"YhiݻQl 9wb/ͽo嶌6Wbԡkt'0wd\x8ɷN3 ӽ!lm,ѐc mWZB{?bab;To[7[tm BJ,I7&N,h2;%& IDAT#t@6f Sv6Jo[I7Z$`8yNA/7zWo3ַ %lym>Hd >3 b11"B"-,5ԂM%Qi4٬x pǴ5;"C1PNdڇORDa}q# :AD6#D$>u {e CojO6ك:E$ 8!k4,o$?yo.vvF9r/Y5ϋ`'eq,AFeʦl[loQ }C+.ALv^ ]h[R8Fn['S ">J}MSg;MM;u*2DFihjt 7I7 5T$TgORDqwf84r*?-tʁ!ωG:uoBYolJf0BɹY5Suۄ=cux_X摣 f5SL^`o/K6ͣx[ÛPSr=Hone>n0ƤR&fT( ^;>7Id=E,q+t`u/͞FdPxLN쥞7$qp(YtYKv82s'\\r8wN82;͚16}lfWJߢZ|LkLmDhnM%pAwuro=>q? ekWi̝ *S'Ib 1jաQfZv]l.v80Xag/[PfOœg6Hmb4&KI@~y?Ž#\",SD2ڌc=WXB;S-e󾟻u^yrd`#3鍬st%I3\ݹEw㙯>Ϋ{ćr߃TtƖC^κ$[65uYd)j%bIk#bB7䀌)\L'aV!ȱMcP!mC \m0굀v ԾD˷\CWK8?vQm^GPXiDM4qS>Ks;>)`tc:u+$XVKI ʓ 4y2!RkBMl(8Z9`F;Bh C/0ڢQB#whD"%v ʄD!(8Jt,V ,x&R :;. ݈$b$vQ6F%NENNk%B'ė#:l^I,胱ȫ|>#c{fH[OňSn՚[(JqRt 6H(QEHh*IR%#bL# L4Gb 0 @*+Hp̦غMMիdrn)Ɗrk:^>h%%M`d;- (e";8)G:L!IH Fx6y>7Ki^]t~L~dv6</oLw84z5%.]m'8º*Erk?yύgug~E"2 K@yhjNHZ+]XZXgͣ=(ԟ& a?(yK,̰XgU s2>~JiGPiLkߦ4=aVX>4XsABKO d8: }]~cfWɮOM4&SZN@R0BLXe.*uȋ808խY&hi9ߧEzXu!b5 SZDMTnc{OEw [\L^@ 4O6Co?_[fҝPO֘!=\_q ݢKL&'،K6lHNҖ5"suۊٻ2Eu9Ѥ%vp !E¸HP7(6 &xFbIl-\W!҂,BK"Q*"ލ.IȦ 81)%jFH 3 a~Vo4[B\*~G\L9&>JyL)02bSL*BD,ҏ Qq^ EajGX0"P8J3 ]J\ZTEٛx?N Pɇˀv A-i@I#Щ%M-" Ȉc}ԡ{c.ozWLh I!r2IHH%W?o|21!XYuZ_㭟=|->\(P4S[<4*נ:M=9K_R48"d/ȴ=t="1:*)Ls&A2!!"[\j=d's'N./$IsY^yTՓobXS<E֦'I˚VoT ?8̀&X$D}Ǩ#I~}Vi1fc nc&].ҔhF.W\4Bb*fg pۇ>ªj,(Nv.ef{\i\EurLr{3 _r#d)ClZZfrBU 2s1Ƶ+alܔs\i\m\6X6,қ_Jĩ /{FrgۤKCd+wW+[kj)8\wdt~NM["#c|9! We1Pn嫌}H&ܺ0# 8|5ń%\?Cޛ`l ֏hwQdUk%.b.~FuNvguڥ{i?cݝMJߢ9Öhpg%: р+ɞҕ&^F)ùď\n_z33훡`XPPw/!窒%ņΎd{K#Rq+kCSEᱛ_?][DtsG`kʴ/>p|Q `nJ%rzmN{:d]%8〓C'NMnW7 m:enG3]1'.#73b n֙$\FT F$ d|M%I%$Ŧ I)x=LG;y\ Ƴ9Nw4%o4^AH 'H#ld3(_S|G)I-q BC p}ЃL6+ V16t(dqE1 (w6bWd"=+}iC.㒦nV0xД*Ђ6W"b@-640_]`#/<;qcfKgwvr^"E"4X!iAL`D2mè Yi> K)uMV:x6A"!Ktdb';CǨ l;3T"cA@4< E^8B#bN5K$Dw AbD bL F: e2#Lz]b` }C iRG,e֛x?vVU~;̖og+Y3LS#!0D"AH +)M8q]$X wdJ7XQ/BX , SM֭uܑ yoXza䆪LV|Dۡv_noml30q2Vǝom}Ma>,-.-0vIBbb\ҋ !#i \Iܩ;mG t-۝2lR.2y(C:Ȓ} C{MG5g=F15.}%ԞURs zuV>EG&i)B!fFfj1CH"DTaTXfp{}+P86.iVz[p hZx$dF $80t/XYa$|+.fGawHəMsDqC جZk+'’H9 m2nkX/s tŮÚ208N@һ@r'igU1 s@Yv +\m=dlէ`&De6WjHJK+B3>k1!dJ4`2yO.7G_  <޺̷X};fdr {&|S]F5ܼ˨ l-dO+y5Ҡʣ?x\V6x(p4]udz14dfaFcei_gVW: ?E6:.?3>}CwrIFIhOgkxw-7Ð ~KURP!KSm)>̔GF |mgS+_/{~w_xʻ~FgH ;=Z{K&"k=cJiػwjׇX^\~^_o6(2`P!s#nSe :$aL HBX"Œ$IprEThV-FG>V(F#FۈBe\HpPŗ1!ѤQJ'h)D[)8ؠ] Rp,SRb)5l雘n#V$LXgPZBϖeL4Ht|tDKllyٿc# NY|k;|CSD^L0."Մu(}S9rbO0(dB 6x$-ZJ'A`W M&(aP `1n$jA/@UlB/B(guo`-.3ddjЊ*o7q\J&Y'&`@+$$HnV LDy%#WxåQ $ D]Ad$T0賺y4 vrO 3vG)^'u4IS]4. HA)[**6E V6I D֢e) Y\7c&.'}ĵfaC1D.UZ}KqbZ%T ő)M=r*q$XrP"H`D6b~u׮q`Az$,z|ϿBᡟ8W蓜yiR{pQqbePke:3Z}Qt6 CLUFpmr (ƙ%8sߣ{"G&>JzQ('ݟ-e.`% ["G [[,*Ɠ OjdpwLvXL*G>Ii/;G30k]PH|#wJW⍞$LdRE`PuaNڌzE,=2S:ŨsgkY%x;]zJ=\} 7HSwEpn1n57:P&S)ѡIߦG_g\~?T6d|>qƥ{{4쫋:٣}7^{ug$X@UXIh'81""6opz +lFjSLn{t=CWAvVh<rP2NRN(H $~dqDA'1W1"~E!2]#$ЭX< (ZAJB8dL$ R X"L# 2cp}ALlji+$Cbd* 9>BZo'Y.>;_ϠC\j޵ /:4#I%A7$C8 3phe .Jأ}ܣ=gs̴ &=+b56IiP F8iLPaARi#6pEq(r>QNGӈ%2LFy=Ztz:i'pgX;@ܣBx,Y7D`ЏQv7E`$?]&A< wh}Z^vC*8.YVr7W6yl':r'Y3)5@&IJbJbR SM&l/n@¥\]&ď ~Is>$N# ɎljV)DÚ-R Ґz"ib\8nJQՉD+cH!SK85\i?,lޅ\9Ev 4Kk>}8K7(ϧVB9h/]rt!Z7bflA]GA I{XE*g9u`["B+~M\\ϐ%6Яpū,^]௪cߕ#\M1EnPUH I5vz$7B?C':k-MDD`{qt+n#%VK8OqƝ6e^b1W5D /d[L46pBzF˩gCi}ZV )h4jkl3?nsWxw?G/ٻ"V1.H!;cAā wp3cylX2ōp;@O4l=/yWxƣ\oO8qұ*_ ^@04\Gel1bΝD!&3&y0>ǹi~LwW_=ۼ C]0X~>Bqs>c[<N=nqlΣEQovBͽ${ wL_es~2%uuU>f*єC]`+00Ja"UUrQauUt%,b 3U0#@UCt%E9: ]§(hI@QQ#aNXj@Q͵*$"QLza]O(d' +ɐX2!).e!dFDF+讆i2D0H2(j ݔI+Why{ǪaW~K b9BV0cX#J3& 1f Qb!A-l ItOvJ#B߇DerZv~Q r\F)O5BT$AL\$Pò4$*JCa6f!F[KxmGA;YgM%N/;E Y+@U\GDÇF{I-jOQ4?FAd`ck'9Bˑ䪏>ޣ2lϘ4)%eGHY.o+1êTj8+R+sIKDw4n )ɓTI=ydN)@L4n |C>'~!cldfsUϘ]VS6T#/>mAt]&ν:;?Gܖ(L+h&߰L1 s: &r||s}O#( 9ۨB|||)w__5RuQ#6w-ځĔ}Aͫ ([GQNLSTVLezic:zbS?vd+ xAB']'є41 Ijŀy"e)1c"ڛělplKヅYaarREgx*$M$&qF7b'T&TF]V#5'&8=Gz+'NC.ZYkXJmn%;jm'O.m~,yESr&j4]05^|eCYL6ϸ,auJ?Xŋ;%]>?I^ 2+'4\3水Y/ ߚF}皬u.2128E0yr7LLeeXI1.lv0`ƞ~P$=9ϞMKR-!W2O"}ø&}n2RO퐗9UV1Iv ;h;PljEo0FtSɌ`{#2CQQ*Ŕ,jDG =(Xy89MdJRbbY .S֐G* fb*9z)#XfJD(fBRCPL?#r-Pg"Ra 5Qq)U3B%#k]LQ)SD#]J0Sx>_b+Ӽ1:s{oHhΩ5y檇ėF'! l_Dh4okrb ?,+m7 }N\Ð[ ,^'9ku8Ox<[ganĹϰ>yH=[:V@ai#|bEe{Α3,Yvcr]h  m'|6_˜Q 5kcл*ƶ)J4W183z&u9pQ&_{GS1ph~1 3Ԃꨖu(Cv /7-Yi.%pZ,p>Nc_ҚNp] wPHՆ2Zʀú$љHC$TcL5lV>5֕;=KBܿ1g򍏐|\ҼQ D"x^afE,. 4"8(v(f-|els,FglN#{d6Խ>[5seN4.)] c]gطWx&t"F]fo}q[ۨ}p~5xPW3E<>*I3=Nk3"5[|v,(lň&$FܳqcUdE(B ]`*&qwLRS(@Qթ"H@/3hQL# '9cIdc:*RPLB-)ѩ Ai+q1E"*f(".1biEZ.Z #PQ! #$(1p@( `+:qeI M.rf;[gF;f" FmR*{ AԴJBniFHJVQgR#>mVA\%b5ъ:{]Ѩ{9xh܃O0hz&l,SkZ`vGlwe(]rA|kH'贶?4% ]h #. g{zdaxCV.z,ףbW3ҁD/F#U@I+f6К%=<d;FiHth$"О8UG7&8 )cߡA8JSg:Y#"Azf(%!Aa8W`*2d\AE[!ׇyR5>[|KS&:1ू´C͝,vG!ۄr:po7peJV6& O%BBka#EP8jI:dpl eJO?0[-W]^iݮ#6VD#;3bqF-'015x5fX]g"d1{x.y~Q wn.7^64>^HըX bC]`#s*Pf*2J8&U24K!%0<4')GG9{ c,Et7(nSsaԿz^=.ĺzmċGjh*۷n={naȓdq^^O%O\mw+l|69vT (|lǑ"UL.R =5J 3UJƹZVk`ZL+1%]j 앮:˕/M2(B>k`z&aAV&;S)GBƛ<٧xۿ ]v˴K>RƝo#lv^;/"SV~>G Y_gqlN#& ;8P $DoNAyoڌVɭO\IҰ $&Í l&\ 2>` >Ak9Iea3XM0nP.󅩈`WX+4>~LTHbڠl̦.΀vޥ`ԑyj^#~Ld8Ft JxhʨO 5$>Y-)J v!۸'ȏֹ}un04Fi 2dܪ!['jZ̔1gV6ÝNʱU' ((*e<@擴 47'? T* y&(Z1*^NRmOvԲ fR'mƤ*7n[)uBm[e8 J/͂p( }{,TfwDI5. /4:d{9jӦɩ553N$ DcX\!%H(AۥU &Pى5eDab -+ 9N%#%=%tRzy?U@XEdN"KoULѿ&#~?Nob6rJB\6k~ͥF1@u4+1O_d,]zfC@1ou;xDەl\4B=®@S|aACr/64]BD)R[" "Yc+6C['}$ӳ>8-Ǧ` ;599_BݘKchٴz=\I>^rp vc=}&' bZQ"N=,nJb\ J(1Ia,U1H42||ȏ4(y '.y<5N~I4ZmU|CvLjH2 a 1OcBqU\GJzF#o=3VRudWe!m jq51*,h1E-D7C}jMI))$=>g%py]#"S䲅Z5G88{2nmp$Co x##SS=p{t/T{ /gG x힠?b.14ĩA+@e aSLrBM=Ok3Ws+>՝YHKTȝ+/C 1 皌'26%aQXrh`WiP8v?d9o8NMƛS˰{MBm_J/0F"I1sgۍobZ3$[-i ,N4%X@qMTM=`HꇘwL/۴_t8NH=N?3rk+@ 8ex&:^W5vQ4pMnH|oHQe[5mnAଳ8m=1rrrQ 6 :9N)Z9"L`8s ǾrCCD-}?EJRթR4>jBнeO0u (BQJH!LNM11Sd01~Aه|_~!4Fn${|*tfQx a{w74vB)HJm]OW[nKQZ f%iusZOp,EQ SZ|>\|VSzM"LU!o:ۂ~_\X:1j%=nfex%ƌmrE&HQL Sn -(4#IN0N]WqMӓ%f;Wzt;:aQ/`TREbq\jUuB/ 2#4ID*b-!I%SBHXN}Xq +fr>C sǞL6kmnN7uwzn[_a7GNvyv}VBa?86~qQvXu{/¥>'=gR#*:O۳?Cc+;e^w]5;/ss=8|m{jNgcIM3nM5)O)Wϴ蕟f\Ͱ WkN1*>֤޹˕%5xZ*8g7RQh-l2yPfDnM`ƽ/uϠ}ȁ?2œ9֣O9* V.-szV0EDEP RȢ. ŴLH"/\@zflvr QU)4Ύ C\ S6jM+)n[st=6>x^{Vy 7)J[ \#q 1Q5jC_:] C;\]t\ 3GfxᙏrcO#m}6<2͸\4 ,C7Xn#Y`!ɸƌ_4ёX$N(yL4l5d'Bx~FU404 }Q}r`fXqFy9S9$ڨjF$ B*mI[)5B+QS5\DB*+iDLI-Dj X*a% f*q"D)QWS1yUhhU*GPT&tB e/$&`L*ŇdULJ)ZvO!5Iܳ:'xp)M1P.josξtޞ挶B\~0bq3%\5'Sⱈ(@x|w|/0׻?v3(1I&6",]Enäz"jBt5+_^^':jd T*K ~f"6\ C`Ҕc+ZCy< gᅝ%7:#Ht# "?<a h_{u7 | qc92rQ}}>"Z6Gb |(>j2qOr4F6*C()P}P=PQԸ`1P/Y1<&ZO$RHggB D8AlѴ\&!Hղ8O~0`?ʙ,e*㮁RR[PWm4MCH]E/= R(J{IrI*2D,$(B9PaS RQ=zos1'8scw7fB)qt,Ǐe%j̑O#glN-; $iT5~o% c'kS|Q\:ӷD`'Yc"x׏|8[~Bfα(X67m fi*0z7?wݯ g?p[v,yL79?K`SV}*[4)+c~¾y/fx3]]I~פG֜I6R\O8{&(^K'Wh;J)nSE4+^rgq"FaՍÀZHޤ{M[IKCFqhcQ)gVг429Bz.6B&$yJوT*(V#hUC3P,hV<V@ԑ(aDj2B+ d$):CB%3(l !S"e8Ihr FRIh4& +D53F1P 0AIT%T4,$ D"TKIF(""\J!K SE(IU)*00 Ʉ@(sr@rTUA3 =D 4z\W/2l+gLp}_п-n ߝ=8vc v3}VxkϒOs2w# (aSAs;_h{p>y~c7 5]M ta=Ў[6j6MbO8"-F>S-oߜi~F4Pf+>`!"Ti".*o(~"ܸ7%R'iHj(H2RSHlD&P,Fv/yCH*ȐYR'Cuto|;i~_^*3Rj-TRQwy%;/2igADyBX@F*|(~*I.E#6ƒCmĩI;lO[l8 k"{pVʮzc0Axs;{*E|'2#R5g=/Kz=p{-:548qb;?f}oJEo\?^F,Y9HQMuqJ! EKﰺv(f̔]DG 9g Y0o9:]8 ahE5H%(JX:VA54@S4"EC9"diN(3RE( 䚂dB(LP45N>ק85mn,6io)$yx,}9A@9oU?U\#N^'ޛTUN6ݱW3gsQVG^e..2.R:c`=S~uX'yx=[J( c~,ۦʞ'zGIJ 徶|usUk ez |Ϝ!k)Es4&!ƍ)>u-)<>9/O}VסzHrlu3*O0v?=>c|\GZvm/;uf۴[-.oos29X>FyZ9sGeZ7ЭR7#YHUtDšR$3~L7 Zd}y.A4Cx<痎]*SH$Z o=@h|/hcErΖG.pxmK4)WǑJ{$QkTPrIQӰ:C;pSEo<@+M԰Hhfi(B8:ƙs,/YjOL2I^sǸwQ KW>E1y$I!fSA**% $#,dQsT~LTtE$jbX#SAr`u7 :sο垕WWUW;+ $HhjKք3ȣьa1!XŒhIIWH @&n}s/ZvLQ4یȈ7Οߛh#?Eq(G1d 9u;RVXIxGaTA6k6^/rM7i$?+z:agWWp7$M<&0Yw8t',M7$qX-02h-Qb@YASm>}V k;m$Xgӗ9ޗ72+Xn!ΖE(Ĭ_˚{I=^NY={|@ߛ2%".6XP67yIe1\+Cxң9rpiB $8ҨS%O#k mrCe}wvB;!NXXZa1w"Ԛ<@ U0l1LO01[_UL.! ,vv?~#M'GJ?  "+ç<6l`q,ل h7{,Tgרl&g㨃[.dA@'quNy-]~M*Zӂ),7o`d`yIp~u%VZUU00ːY'.)3s*|7%Y\Lߜ""mj~BZ>˹D B|SsR[;\YҜ0]c sR1 >BAC pQ"Eh$}=Uz{01ZrEb.BSMngs@(!z@xpO`:ꡅpH6$IBHG@O[JZRhȴ<^+mҿWrmyL35Ycy=f]f-.n~j$Aߑ.4i_r+NBuNocw! dop2$~ne͉g!w&{wMXe,zr,r=q~c$ky`w?ez8{% <@Tg8IS#ӷ0N/A:w(uqKd}E6xmtBR:[{O2j_su(+Ki`(&|/[3[ᥧiK|_XlPrv 7(y)lafμ?u9̑$fv$sL}վ`OS;{don;;έn"[.DuJHq* yٶ ]^adlrlBe>iԄb~ߥMDh31)6Bd5+0O@[xi>w@+Q4C{4V+ø(XdSDV2`:$!W14HG[邔ԦbPT9kI"vڔ28} >hz%2?]{{Xr%*=mnkfK$`, gpDTv=E]5$2 Ul0ntڈ$%Ygg=2; (׀X!s@)58&EG"Xs0RR<d3EHY + &aWi4+(qHRR6+ 6$I/H.qpkat׹Y[6m\k&HȷC%tqXmv._wObKLUP-+&\*#}ll f 2^ݲ9Fz YqLz/^3ĖmaLFJf)/RUgyigp 98!^x("1k{pMlJQB q0LvM1xku²|mvi%nGt3eUg4ÕmxcM" n!:Ζcܼ?;Iu*` nΜB b1$hU`w)ٷ[ӈsnGKXցwY㩟 K% !];j %yq=n^a;8aŵdz'zTF{!&=UǛ]˻cTkbXA&$ڇ\8I7g:ŅAN]˃+߾Қy6|{?b IDATϛ4.V;N^b2 lnɥ36 3jcTH>2IuRxU=zo͠!lTqB) L'(H"Oy QK} 6}0d\2<^-aH(< K+x،:Wx;/R#Ғl6_̂%Tlѽ=m,N&ŕr? (ҶF6-|a đ)ua$FF{ q}y6n&H*CCL/,A9=Kخ eqGiL%LGe)ピ En.,Qz8jAy9T;A8Hz4 ipԝ6ˈdRIQDF%RXŊO84H{;1:Xn^:A$>B40Tx8ڂ pQVR:a"NJʵ+g72!5 /%>q4E=ftSt3q.|1D= , '|}s wָtCZ’]-HA4LVoBI7?l S|vHARxB~{KI(S}vOoc2;bv/>yXg?D'&!2E4*v6捓FjXSSwaL W|e=q:s3[@u(au Rh\: iN]Ѿ5H+8s6M# oJ^-b_c-6le{Onbh +3 #OtHLWQ0>u.O#.`І,7GVix{.kWY ~ң'ݍiFGq"kAD (2#mZVH@`EI+Rk *p\X:ƘDZ5Ą(?FЉ&ISФZc8HT"hz6 LF/ƙL$ ynFS'b`p ϲrv.ZLn47\[>6q{1, !ufB6hj伀T@/l&J1h!iZr):]ʣ42%6+qRt$p<KLIBbf~f/x~ؼ!-R ?tkM] v[$Ғ N# HP)Tp#$:]H5JIh58?I0B+ t/`l  AP )֦H}{&!NSB+="LO휂 &jjxRaaP HwmB IjA @upA!(㒤 I͛g|RkD" ۈ~4\!25TFxkڟ˃P=ЮIb(O;cp9&uB6;">`g/Q.MU)Id1V Yq~~۷y-*uCLo=eV6ʣܳP:u {j-GpGv]'d:cc͂GR!MбP)5x c S\y8\Jw^^wZ4^<m /3;PŸ*íDU UXapR! )O2&7 M"4*IݨhRd\Lh daan][R''Tf6I mR' 4:!QS_kf5`F8H} k%=w& BЧZKkKR|Mi4cAiqaĩu (5CA&d{yr`,y!~c!g)ip|8BWw*m#nYko뇸9r5=o]K2^ިձ6(*nr6~WWoPҾ9͑=3ÕUƣM,/5oggiS(v'<[u|vzlK[\ KK>B}8)?E7=*K,7|{pxc4~:U(Uدo.v8-0,$oqȔi 8:Dr,JeWpk{8P{ċ;-K^ch~3̏Êc y!C[#@2Yz \ +#|L^ȂfuibgmSTW{jd.ΐs"yMZfUx_! T00dUt-Н ۛa˽1<F;ᾉ[gA!&uyw3ͧG<{m rS%eRm <Iwi~ b n+-CA3G[g>)^F}|I)K"ts:9io'"ej :jӪ00c\E£^77K'-bd$fiuiv}b_"};SdO.c#MkѬ 71DФE7cyѻMͫ0Pbb2- 8JKWLo@5$ < Ӌ!PD|P_%#3‘!GYNlo/h]'G93*3]HgsOmԬS<ʩt'Vq&p]TA5у|,Ne|gv135};$ף%S)Oߢ8hf?ka?/=J-~z 2S#\\ 8r$R$O$Z~u\xuFǶ#s>&LmPШUT !K:(GkHUՇjA vԀPм] dT}K/ l st\cn/S0Tta7BG'up ,VHpd%v^TG'\^Q)IIt!2ĮX06dqѿ"sker!BtHAe2[ W:6x| v'~^:M8*@ LBd H2v1C; IV 1(Cj Ǣm Òb]cЉ`Cە{!پ_dq%Y{re'{jk!D@A1pF[ig~X*EM6T7I<\ks8x%28VE*s_'j\wƐ1=]$,Ud!^3|NmoIOTarU>M7Èzm8y˳ |(6'3~t /rzg~MaZFH|vlrXrKl>.*?H^nzyFl'_:R,Ζ?sx32@uWxj<V3_̲~L5G5\>8wSfsċN_^kyzvx$;".thtɡȓe"*3Bf![!]kHӔD$ِlơݎUB5D`SC !ĩE JuJkFCdK"@X+VvB3[C :믳=IK'yHep%w+Xm3ܻ8H=HuأY6f8ą+?[(Lv5'_?j|9G\NzKw=D--qs)7Yȿ`SyŘJz\rSE$i槉Z8x3|gtO~Ő<WX~ uny ϓdVN)AvxÃOݔr9V/\Z>c/gPYq_>7wssn㝿&:>hM];/y24ʜU6ǃJwX'PHRӣi-N$ ݘ(X {,ݚaϰAF]XZ##"?;k }6mx7f/1&?o9hzt'GVdU10Kzŕ=p= &]/)xmC7I"]JmSJ,Yi5?Q2.BnBf*ׇzsUg]edDc(& }h7 *e(%S!èo8CmzGyזfu-moMY]G/a. K2p6eVanA!h::^*箳z (K| c8DEHizBmt!,F`1$k- iѩB"G/6FΝھ[`M2;Ԯ .l/b@?WEdmVDMYZpqsgFhָ;HpQP(Xm1.|P5f $)F (!: Ŝ0 s˔ F ILVG2sҋIn!T *b"b.DWWSJ3x 6>H TX]j%br^Mb̢Յ].Zq|kZY2"+~1) v`$NXڢ=HBH+6o *hnM\y |?wy$~lѪ} /g6!oUr%[00ܡepKdgQKW$?``[m*ݦg:dv;?KT:g7ǸTu{F!a_7K!6aU8\;u>Gsj-j [OqtWK[83W&;$  IDAT07țhѝtxanR0u8<{`J&ȑ+q3c;^WIXn[NXN-Aj *~DAaׯ7Y.Yҝl>Nc,14)ڄs+WϰRuzA1I&ppk\O8:E IbYX!UBx¡ިas!X+UrNNɫoeի -0P+n,~+7{F/MJr+ۗLV}zAI,Rhi¤vǧ 8 )kuġr~vB]zn(xRHBu8Xc"L46t=0<`B't(zDEki[$rpF`=@!h%\)l ŌE(цMs]Z5zK6SI'4$0RmX9+R!@[rP"%Y&}k0ƥ[|*\S>_?f VɇmBbe(g>jYJ"Yf``hx'xE+83!$O$>~{WyTvH.8+HQ]Y"qq"yf8} o%_<]XÏUVlt#A(M@LB{Kq"SHoV#.c$ Dnt_=&wuU]e1“X'^.`wJȖ!$IHY2u֣;ؙn.P|kR>W]Xoa]K\c~*?Ye][kg>S{sN堔Rd mi Tદ4風` ̌ <"kB֔JI9ϙw{3=!awo=Ho\~ɚ܁R?N[{@k3d#tX=bsZ8U=L|*O *goeF_zrMـ;Ȇ lf.]Ra#d15rdg'fvӛ-ڃǟNGXihjIJNlEt(qrpxߞdP Gzj`EG M}52o;.{hbᅒPx h]:l27<,2-ސ_*.d&Axa ,4Ӳ[>Ҫ2uK; ??%9s>C-JqSWLylk9Ɯ"Ó77fyO'2 o] xy?>ܴ^,0b}+ Ӄ8<SLmOU~'cV'%I4E0 PBBQ\RǶ}BچCXx- @4LC ZK\-3uPġJcI<@䋈HM܀HFm盜`m\:D9=QzNy+\t7;0X/c9K+ nJ[8N!Fua}ic,#ۜ*~嘈> r댝mf~[ŽQ9.B]ޚ1˗oᄿf|wirI9y7[ =JK+х#<[1eGrIۛSyfJh"b ^;:ǚٕX?=x$ ^cV|WYSsS81qE2%T >i4յ„m;d*"!Hh\0ڐe,Vmz")| =삡 CIfwXJ h;"E’@+u!"\. < Dvmo'n)pBh>AqqW꽙Rav΂^)q3=)'i}Ԫ's1Q+g8*-R1Rdw=ofMabijOO^Iz/4K+khD 8H"px'z9X  6:v;vZTný.117GR,o?aD8q oq/NPh!nCZHS'ada~ck-^uM ?_/fw(a7zUtd1ҥ k6py_ "Nc,S|҇#fώOD𕕌{ V4~Ha>ϩSk?<; ~W!c]V97/r2/X+on}*q<':sM_gS"PlVFSNa!Y{ Er"ЊЃ"Z$fsZTp=7㕋zB>BEƵ06: tmu{7Έ.(ezئ9+8޺L$ج]66 Q8G{Sb^c~FyV6 10d5{ >=nq4ƨKMOި0/.\d0ޠDoyDnkqnbo,݆/q3ͣgAx#e┦u[wѻtb?Lir0[=HĢu4<^bHd 7i'4& h$OM3=L(Xw~,Ŝ ~}˥sUfGk4z`%~] f?*ιr-Fb>C\X.SY`WuaWq߾4mX^ rA,fd1K[1W8ָn0& Z-$Ҍ42 x"r$kV7{Ñ{tHzv+dc2QUnj'x-thfcY%$aLxHRt7@8D%xv_R0œ$r1iBm 8zFߡNI/#Z4K5щ/ VLj) h-EE!_ c&dTd}La HB' C&RD610yl=&J4XW .Ʃb$Z l m[HHWo Pb^^"N ?'aQ>4M#=ٔOt`)/#Eľ7drm;+nk <^HD >>oGتYPr33s'Y \v+M֎_yW)ma7?]^x^獌lۋ+bRUC@~/ y;Ӈ:)~}ؾGY=q >K={6$t`T{?qűz f 2xXv,,RXip({k6|;T>/X0 Qo`̸ Z)z7_tGK5 1#Zut{%{0ɓ/*HP}3lQç~6->l.D]Oxen [E? 礄Ø$ !'FM+anR6{Gfp ~ؐW% <w~[ORgkg@0hfSl\7Ӄэ&㹹P&oRNUCPmX]VUL I~e wyu2$59"Jieyk1AoA,\ l!8l*a -$#l,kI]%jL~0hgPXqs4ž Fz8a'Et{׹wZ䱁A˓׸=F|4JiB(x?OiO/CX*LL(]Hɵv1ᚳzʝyTMohg3:sQLf]7 4<݉ads&̲;BIb~fY1=z$1:{mi+= fHh $VaR^Sg`h4z: m<myrj&IbzA6s1ݻ⏉Xya3-2#;RRE7QX T- [$WwH`llhFpxħreh:*h5*zKn45a!L5|{yȭ;[ܧrQ͑KgٳJƲ$&y)6h_4R 1Ø e T`5 ܍ ng[ejzU奸 &O:WZK샒ވ&heW=~wÜ8oEgT:#+9N?1+}JM'wZ3|| \>·52NnT}_s;xˇ"(K+1Ċq 6{bslN¯'/*h4t:>;N u\*$6I#hW]V8?h=2ɣ/!_S9o<4>!!>٣17 z78䩳(rꕔox=M ]a|- )z _&b+/pu01XAZD,0QcoA1]͙*=970: NO_9AwGU2eqzF/򋃀4ٻF)foȖ%&79]t 5F*F9{yע)6:y/c("9S6N+Ȫ4֘{;CSQ8wyHԞ#]e1;BVbi͍\+@V>V|AqcAٰRz,$LҸÖkYkl4kne :qV $yƆ/32[xAj`Mi£pj3 ۊ3-]?O6(D3N$WB+O;W@@GP^;#)Nb$ҊV]S5^ĕ1ҝf-#=(x_wI'+l=^˷H L"C* r>󛼲jJg;1ÔQA qmg*Ck]O04?Nr/.3Ӕ7|fSp {BJk&J%VB.oT?•^Ҵ'TAp5Mgح k2>c'ڑR0\7_}[5>I_b\P6W/M_dJXcg`qȩ3פ|Hp}/?#\=Or/Oo܏N8+Fޝcar1|me~\F&oޢsx Z;w)~{G,9{5]6.WBvzl3NOfoogMݼFh Ѻt֡=WX$tZ[Jl>;~Ba0dm75N}e6 IP}_ܽ 9`ہ dw{፹_8_WSl}M47 *NZf9Ѯ_wPY:N,G3xJY`\IGx C--$|ʞYλ 8..]"ɏ03=lZPu !G|OgLPhFa_\͒/0ngb țҤ.1"'\SskWV8q\DXINTr_uI\ ?6BY7ihsj~goaf&b>H'q'+ ugd0\P5![?t' SL :٧X R9kz P$$1;S ;nk38`c "88ڕU9ҵ:Eb (&Ha"‚8pAL.r0Tceee@)DFVtq|iiH0"I&qm2 6ifQ*|E'_Z8Ko$!2I ~JOL A$Lmh钪OV AiC29eRj`AEne, )n`!`E62jd2b@MQ2H 7ky$ ܨmRr] "eX!Qt]16H)02CJl,eY,]82OgM$6Dm-- ) 1ZQXeJ\O 7l( BMfk,@(饤Z#2dh,ia9dn+z uȟ_mFfP*W\6&¦M(bt^Q#{JL_vX/m[F]BԄE|pz; m$ ~C`믱*v8 74, ."ya(S{gNc)C ;nah^D0r4;FI6 \PᘌhأvX|Hz7ˆ79_θI [x39o|vB{}.n4U%*}*LDTkZia4|`XpkH[<%7DG(|?e0O#:cْ,m}?P mZ kp?g86ʮP<!}??%X~_Lx |J;騢9Ҍ{g<8)}tEQ]f^*&F a z):p 7&+ې4~Ƞ9JuQ[,Afݢf)̲后g 8>)\y +)=qwފ.m{vNvV@lP.ZA{'&f1q/aZ"dfSrXW {|ͼGۤAnd@YCY kVȯ3=[[g5ӃX5)]垍~:k)2:3+}6&K:DBFz,\`sr/rs1>vQ;df*Y:LL436)ߪqfsAD"ȖܳpKi.|9޺LqAk;0TJ6(Y$€ % B8C4i.I%o N6aslI [~0q'+hO43.^ls|¾F6 uZ4e.D}@n.UE95,}k1JKj6Wh+e⮹ JiتKVX}|cMʰ?0dm+䰈;,ѤLzQVvS̖k&0]mĐ pRi@ih[ȥy6׷sKxˮZcR0^` %\"㐤OJ@u||'Z-N8$Ok6 f#;Fg9o7>H?Svs)3Pn|Q*Rtk$iS ^G% C,wLmc!q.zGW$y"7)nȲ@"2e ce~]g4#cT]I一E)) !% v)I̛=m Bv1X+9U!;cp@[ID25Q J"26|G\k/lB K# ~RpEo@hU}cr}`OD߶)ȸI™VƊW],%C{ 1t5> 64 F'[2Wy7c*I/0a 1>=ΰS2S/sm+CyTexAqm@ij팩"i]T`aSbd g$')x@mtŪ56Z,pߥ#6:8d|vs/'/xۃ^an1v}uP2.:&cv/Td!J_j0l}@z"Dr)G  x0h,̣mK-!xE/rEX2nTaȞGh J˴bC&p UNKؑf pRNn&9:Ub`Q2?!P% CSԶ1YgO^!s =/ ))&5h7ű:H\1"v0c b! }*qLX'HE@FJXEtڑU̶ a҄~]PF7Y=,pK$!fb63 6JguV~!񐎍9!73PR"E ʖ$BD&Ŏ"$8k`IlF 0`F`0Faa$3l i%^CeްǙK|}nfsLN!dLfI篰wb;UrW 4}E~ߤ(ƫ.̦T 'G!Q:f 0*$6HGZFR#ARHKbIJ!RE[X ,ؘtmO 5BG޹wjg46B 6/YΘqka<mlfE$f~^qHU/^ؽgood4KJ{Ȃ&4)&3Oy +O03>H?bej1]3ě ,.\Y1a8vADz8)*4af3^7ayp{k~/BiH$vސinlQ*Պw7)Orh(աFR&b9ؖ43s Ⱥ[|lc'RpLme#ɤBjEĠ=A9'j^XGsfO&{{K]g~{Ufz޿~k3=`fC 9RrbVL6V" b$BZ0` ۪W* wzLފ̺;缇Ux$1|it~Nne,4q y0)z&fp/oxg<̱Y~XFdnܡ06(N0#"$ep=w^㩟!V`aOǟStpl S!>YkD zriWW_&k7mnM_SSlx32R?Z>2q&˲wW^x8{g9&K1vf[&2 H\/Bl%L^$SdJcȊݦ(tL1Vޢmr!s' Az121љ(50d/ِ*!"!2!h6L0Lv$VRB^mACHr.lgjT&v!fT:HacJXI$J , ())Ek`z̴~ IBfP&B4pS9PN׈$6 {c MjQʄnT L>&+"^@15%J|6#_i/($1}laK) u0r. 'qE@ӡ8X-9ALjYVZFjZXKH0@ %JI0Re!  m"tȫJS)CB` @ÚIZ 0R)"5SRSM)m`;jqo/>@ɘ@+M S'n5PqGhH06!g4L%vݓ,BUy?wñ#GqC?⿤KW86=D+l##=hz &B )BiTQ  T*D/T%OkvghˆWcqR xs3W &Og:Np[#J+ɫ:3hBaGR ݚF_ ? F"xk}{`#) P}d0B۴q1f!,XjtxqZ{' y)g+ (GM7Jk`M BˑFK5M"0k0 "ގ>Ќ/50%`&h2]<'-h̆:\I}Шbd#t@O!tC馚>؝[ga[k6zo5h281A3EunRO$Civ/A-O٦^Es@M]9K+zLBY*|F==rQHF4)9me(M@957  jAlC,Lf]jgEdY]-1g_|[R%@I& ^nK'BJ# ,KkO5XFGm]|Bd&'8is,TypއSS ^." 4Bb+؊I>~"il/;-V85W(#lgid%ooxo~P>8eQ8>WER|3^Uɣr)j ˰1φ*1s9FU/*fp,$7X.7jڄisZS7n7hl cšfrˣEǎ[ᚲ*͞MkN$N$[;g(Hx 37ϿDlV71Uty*;84x|?CQ b׽qJqǎI,NV}4J*QGg}¬7>.:5ab:IcI0%ZDP7I)]suq]đAHkg3e9G˷eop[/!Yx>鸬.6s7:.HnV(<:;;} 9ԴC8Dyl+N㓧6"0t,-\+!̈́tE|ۢ XU)g4ga"oX]NU<Ŗk6Lvlp vЃqm(4|Ve?Q53˵Ѧw{]%4nQP8=d *KR؍Y&&6w1܄#2bI[:vAIPm.N9G*<>>x]r: ,v! a 6'\*!Mfzo]!+#!]cJ9,ysbϕ8pJr&^Lhq?|74-"xX]۟g9R̲fnḞ b3,IGߦ؆T6'IFXqɌ0Bv}62{;1hTҷ%]CHHbn'J;TJYf LOPv=pϔ`OiA}cd6یXb\TV2% IDAT>J\PhEtH22I V'ZΜ.$#7i֝ K%Q#p$IנkJ(%0 L H 1A)GGC{Ħ$j:.TݟZw>WyNj#'3O~l Ph BE~*/#|C4]D@޴2I5cZ\.:H s?hag#`fa'Hd /9x?ˏq&mX3QDjXA Z$RPC}U\Gh~tَDŽigB>z G+IĉdFb-ktjANY" AJd\$m1Dl `iWNJT*%R3ǀDphc@' W)Rh-ԃIB$r! ZX!n+'ZVS@уua0FI1T#peMNν(V_8S G | ky?`umHQ\wOS캅cei|pqf?ʉS쌹wMo?OrnrR鯮Rm>IqKt;LV(IuLeK Z 4)1X3L/YHRrduj;=lۡB2";eJ||&Žht80=uxs RfV^^cN3M8]&I꤬J瘷[ڂ߻D`s_ܣOhv=xՄ|Qށ#Wrd|v S"TS4i*C So!E7HٸYreI/110+/u'zċ 믰vFOVD$sCTNXΠVE`9h}LH&Wiνm`- %8M7}wx'_3I0BͿBj"9[I-DbDJ lgZL+͌[044&MbҠWXØŸeX0qe)HuXYS"3h'LQnmi0{Mvn۠~0G&a/Q1ƙ[:h+#]VKq0O.Nɹ)7ǹU jqeL'F/H|eRLvi[ߠk|B%cn M;KmT-J-Ts4ms=W]" ,,V22R {] o<;ĭ%nO};V ;;F }tC&sv7>GIU@ 򩃙:In"$iG  ]/ JߦhM"$(+wX,Ḧ>:s֛KT3\,0V4]f3Yaam6C7qVsŴCKUs~1e4s=rY[4.K+f$bID8ZcIȧVĚv-jߩ@A$1I" BT4H$& 6ZHPa*`XMZH" 4 [)CHI 0DUDŽ-JF!R?[/qrg'i1#wǰ-:#ݯS{TdSƷ<lwI~O{)'g1LP|?w?o1_?9Uڵ*Ox2FDug|iMʷ}'BiriFE(by}RW&hEA4*QF`td|Ehfyz~PIFi!AvL&|9 佔ټ́PDE@jI|̉ ^X扙-^V`XJ;+7<&Su(#08txݜCxSwu 7xke$}׏lHC-`X.EӚ$I昞֌86A4UHG|sk8`R.gHK x;v6C}=Y&u0l$+Yjӷmr|Zb? . 0+Vp<Ĉ\P4+t|I'^XhOQZL_e&` *M&XcR79/sצfCSevoS—oP(PYt.-EUhmw9GE}ܛeM-S4UM *Xnfk;o`ݷhg.3na%YeqưEk"KاY؟%;d*24vxUNAc;lO\B8H28~Xf6ʼnsK&9|n\B"oM&{09o|~ڟ=~%%4^qe>Xg|$YlԘ{GlM^6 ?peznJR;6 ]B&޽H&R\F Er+z hiSzP"Ĕ&AQFlA#hdF"]IreI!P~! 4JDɔ*%p5 y:H6B&X 630\HJa?At5 BֈF5Z$UNw`.kHW"cTiIm*MP(LI(Jұ\j#9`JYikvSMQ } (S8ᝮ-u>]YcϿ%} b]vmmkJԬM=Bj }8{m)" !MC\1.y0 49}-f>e! cQf&B~/l[L5υ+,&g:%]o6EfJFv $ Aq#e+iimu 3CY⤈RXcGf|T?A% kod q>}ϵNt #9cJ`$ws n7(^~GU*:*$!J]2${uIZ07ڹ!G2Wlġ<_]#[MrLvKwlLc=Tb >|7Rtmw!0-,bərкQJ+CMw.lpUy&<ϲ~h'ME3Oo.lL+HVO 6C;e ls:/ ,9 bx{iDVFS b0b"QreFyWМags4cg7C߃iNN2AZ\Cm6 Ygq89mFƏ=x}IP:c4&c>n:萱W'Bi+'86 280aZE38䰷 {$;g3ֹa;}C]<{io8&C\&7rj?B6iiؐ\S]_2cldO}eFKdeߧ1F/\PORqA˖& )`3b4 cxfӄ}פֿ|ܢ_J:0<{枠P4I5oӋ\[3I0TY'9 1 %eo55IRh\_HcP>JmJi"nWFnX(J/n+ F !́J$ lRB-Հ0(@(1z@HDjb%0z TBDR 5ye>ٙ ^`nq/ѮEhZ姟0Iգj0urܢKZW5c$ WbOIFD^I4*W&z0CdI>{-b+Z@Yqk)SY+L]-k\0-v[ms3|d;*]t֨KCԒÆAø7 7I-6KB.rnkq.:2/)fpNeu4}qsdOQ9l,{|l&ϿU 2ng(_mLM;GCGk) gxyKr 39JbQab<5+'X<ɥWv [;G3EXX?Esv85͑dHC_ayB6Mڤ' G]Ⱔ<:FvXb&dӲk&|8cnn /_OlJ7823bSLhau sM]d[R[Lt0S,r )0G.c7A:HM:=kA3ç/oOwD3.((vcGè8*bH`2f4VK>(TzD6q>~3'"owqG$?ؘ;d]b(\Xq[tg6 /O2u u^ƷNgkkϓ6ypJ3ge'>Ag2ϛ1vj5VMY86,nqcQua͌&wg'/-pf8pq)vҙ$p ح*vbe k=F:V!(ѯ*(f)SK4^-JVA$(ca$Xfdj|/QuZp>M<6f*eVctB~`Ԯ}~*ݳ,d̓쾮;]~[޻h/(ZbƲ5[53]SNlOrƩYd+dۊƊh%)RI bk4@[7<6RS^޻usw|Cwrq\&}CSس}Em torҝ| ;>,xsT mx |;rW*1x:?mRI1CʡVH 9odm#`gῦV5Wg1&7M㷰s-xnƞ#jX闂958_R0$%H˛ /bɕ"b,D?o\쐏Mz5ޚ8)x{;ػgճv%hdqu-ZQN"!S򆇐P(jrI'h]㐹GlKXCN_XAjJz4$Z@؁3Dɭ iȵ@"*~%']K\N#J!ˈvؑ.ykX.:1oBngJAPZ,s3å'3KY0dd[W(K -&NFfg% 6٪%_R[ jMJ9f eZZt hW̿Icl'>uC sE&.3.w9?qEkԡZ<Ӌ$a+cLf\4]UVY-Μ`q"-2eW~y 3-y(80v/_|a^OJ}EԨ--G[_dKyh>^_':vy|x$1}ƱZvu2s* wmev?toyĮrA2C1~!<]dq~j-K !^\#;_Bb2ޣ_Dv9Or_me//-Jml&Eøؐ ;yu >;癉rqn*+mKC$bjemw~hz.=wf-Mgo%BZ!(0Wrn.k'g9;w~[8O W&?=_҃_c|Õ<^Y0[4x=9}cU3~YF"xm.<{o*t{bV_.<2{rE՗_}-SX5ygy;":pwr߃p H*;^)3lo<õؒKXIUd?+-yß[&7kȏdt^gf~3#["q3Zd"Tc g6Ymtf)iو-)JFRwPU\(0*Ҧaw=Ŝ9gSKs̗XxK:K"XMie62N^oSC3\ॊ C]CChznboXg9ԢTS,r# H֦t Jk@ .j햱n]aǶ[ygJR:LiUkˎc[?4L(RI#hrTƍ.'X .Ia囬2N1'x.m(5靖~Tx*k%۸4HcncT1e_S===+  _,/_f|?,*x`FWx':ps!V.,wݒJ9l)AWq#,rϏr׻l*Rg/}lor+?H2âtW"ο:X"r'񋆼C*#5`^aBaDt&hzNJdycekXP V`"ٚ$9ٕ(ئ:ĕ9.g1H3MW$FbVP=%(E'{$?"@"LNIɔ0wH]#rR qȭzh"Ehl&.Ų$8?p̼9㊕E(QwY >?c5ڛbcÛ'g  =HN&&nv*RHӔT}1ycFHA{1]=U(Ny3waps{:Ҥ}Z_An?|=)lBRMRmٷ|&Nm,$> lsn;+*"KW3ГS~Ṵ̑Y3e{ק::sknysjT'6I8 Ә [i_kcOjpLySY~Nrg[عm+Nָvg3ceڛsxc9O|}91 fѱK_!8)`KڵwܾS\KmmjCΒw%ƪuv{x`O'/|{a٪D;2Ŧ1҈rR$<@9.;49$#=ldZˌVcwGO%1f1d&q|HG+ryqg))yr<]*t4M}pU¢emXت"E2 )xw݀T1:"v?u8#t \+0(de0qRFwDRh s pbLvtJq TH6@v[(-i<Rf$l55/JjvüMC cb[#|.]zy+,׿{?vVH/2Ap>W׶sPƜ<䥵*WK*g>LaĐ6yBrXpB"y闘k]Sc1|ϝ}K?hҪwz2brw&Z/8>r/xdj {A onrBss~vnkgstt}C%kUGv32{FJ&F2DwClLB(gyEOADKsV>cS!$Y9?&7ɏd4)2\[lE'K s)HS8NܒKI1'OrDy+%)fl~jHM@($D'#Z;VD<|#@ouXUz4@)m2!1Z`·

YkWNr';Ya9H!*ulxk^uѕ1^2Q1z5 w7ՃcF=GZF[9lnqU{gr|fE,.Q|0ȸx~U\ğ_SfBSL{s (NpeNJP:#~.(&J"Ng嵸L"\`mHfnq׽'YLKsǍ52)H)Ib#0g Ed;X ҅VعoЭ7@-OidPaz̭nfvwG _hH%s\ L>@ĸ$L|^ZAi8•S; rG L.2M ;µ!eN4qŌ.-4وċBܭɻm FЉiDڶC-8(e4XH&x&Ę EW\"DFEkɥ!Oz"uoq+GԏCveEVr{ |(cN%oNwlg^U6_svt97| CROe"ϯ+y `1J! IH3r4||wo[8!/=1+U^mL&k+pf̡wUxa7o|j;?>EP )yt]j5YDP(V+~oO.wm-V7pb{$ct.ͽ? v+0 &R ]CJc#g_Eb5Q  o[Ji8%7#a>˫տf{E*h9 P4D䪿EbQ b-^Yw )B!,p~|Klg$s%>W?ز W;ش+}'8_M~pO/:o{+G8*QU9BxlUO͐YS{:n*^ۢ7<.S1q:[T lo10.2?2\}|WWYL.37Ar;u3G`h gP2*r̍NF71A?F2)HBS =T EgmXa-XCRqԺfBlS&y .bEԂKWM7i%OcsWez ٨H^t AZAX("|&!5 )bHYZJE%E n[[77{bvB aKC"^N&o]0+Fu? рTیNv_ƸO!A*HDvsHƀ8,Hsvn|an~'B*Ï?WPD'+>[Ò[#|="yC|ui bj}ʻ KJHf,jݸdbI}Tc6ԑC$-C*|熏H@gB| }u4-sbl,ݬ'|O_nsR {8pq%2R!bC'6XeJbqCyE^9 bor-?Me Zp_-1}UYBTReJ%ߞd/5hRZ E'% #MGِ>ROc]#^Q4{3zv{wg|t5Vl|'yՍhnU7f10•S`ZjQXa\kgw<,-fd/\;P Y4Et,Y uqWpi7'X-M)ۿ9VL,23Wo]"Wf7x<3%^F^ #ZQccMZS ćȓ]y& &H6sk3Nqh?n²aq|H~F%T`ƝG+`:5}JzKkv=7pm/^inՓ|:,Q}?=K< *7[.:TXH3tҦ9bKnT&^Q*}~mfg&Xܣh^|lI׌Y  HL}g8YUWM@:p&FީKo]xBDQN"&'5zD!ax%In%Nh|YaYc).".y&iv`L/Z%+Q)ER^Ð)A;q?_ IDAT):Ԉ3m}ry9r[@  B~P:K񳜴%%"i5X<5wh JP+y{6#K%Ta%c 69eyg{?H$ٹCpl9z +v(큑(pe}3ws|xcIFP** Jhب#C<{)Y8.TBl~}eT68lfJ\pyOkСE  $`w+X-{.#se^v2{ٹ73KYPeMa]aj*E/؆hHMx-7nr?~l'? .'OȾ&qxUViP" )V:mI4dZe(B<45 @×\p FXPY nfKP! )NF R|>:ՔT9T$%RNsj!ɄBz98H!pCD9I)Ƃq_9~p2cBIB_IΌS4O*•[G8m V\?c?Oo+s\-,%\>_%ulgعaDt̬NٓI_ ˖b{{_]c| سſuĞ5-/vKigٝf㲾]^cH,M\YO!ƘxvXK&HM)X *K!rai8H_(4N "k12A6\X%#s&3 w2׮ԀLb P^C5ʹJtllDl45xEMJ)ULG"/ gw!,J^@#yuV7bU@geV ~"rfDٌ8;Y 1~lD&͉m_&^WHvFsЁOguMP&sZ"$6ɱ9St64^;דusj d';u  ̮{,=YO)dB cZs]҂y5OL {ƹ^ kǦ$I$n $m0("A"8!:#0{v#$ځr4 AE8ACZg &Aیرc0/^8}Ü^}Ǫ ?Kr@FI;t CǶw,3xcŕ.GF"`Tsg.K(D)j<^eNۣ2n{/XKeB}fhMm£غD(O_e46嫣Dm;'ڴ'xN1tN$qgqe_طda.70[K]NJYId^3ھܽ\{׋l[" t//Sg` 8 &k6A@V'<|)6N"aInS?ɉ5Da(ѲԒ PB`3"M!#ițu %r4Mн[JP :u=eh#A8X 993$ )w+g{!ȅAS aeo:HJJ8)?aq) 8a@d Tn{' ki~}3ؿdeu d\N8pJXT8'JLOur5<'{}v.\8MRb*M"Q8!pk8'1\wldΠ67Mn78GhB?uouH  fp0?u+d 7m~3qwn%cˆ5?O]~{Lm`Fkp IgͱoZ_eaLoޤ^Kn]b8Ɏ1: 6Η O`&H騍V< >Ƕ=tD䒮R~J .4 & bBRgS&o NUO&pY;Z3s|cߪM/[ QG&X+ri|J]d*ݟShĈ%( ;3ǙCS4NEB#| >*s<\1NDBYc ("ʄɔ!W_\ 0bSK.CԻT7 -0\a oQ0դ]3A}Kw+GqH }E*FTxl62"FY ){0qF D9MV{9JaURhu}Rڔd§%)EVlYqhϣRV$VDw44J>AR4GU4a.3)^BFO`MD$.W$U,dH3K /ɲ0t.^. UHuPRG7N\e (8 *+ziZ8=G^3$X)rLo3 ҩ^MYsu^8y}EwgjF^^YTwb5F:p,(wd29JH8'{Bu8LFG,/\A S$ȗ_aC8뤿ZBoN76gq}[x3<#?{_,wvW{=_㫬'ˋ|Iܿ?/'-WTo]s->9W~c;M*+Wftska6ſKN,GwO3~G!WghS뻙~_=h+zΞ?|ʯOϞ\~/ܷZ?2≯grd=m^<;q8ëk+>~gj|'U||14i m%9D.ud@J\YL鸈Maɻ Y'%IK V؂PDh2@ uu(f''r-8#װ}NfL6aHR4lD&Hqtɥ7f$ipr PA%JN&ٻ(߮}½X =`IV-a1d``c衻=kC$Clْ,+>)\r =ܒH^ZZzU{~Us>{;3,ZgpC~tlk` NIk5937DL|IzXtImQ#X#xl,0&jEN0+m;˔PLM aUi}dg"Zy%oi[/I-4[\vwdX֋T!`ߒ^Ǖ/X?QwwK{w^xjّ?ko=_fiK?~j٤q8|NYtCOovJ_rDiD֙0a zLI%O-+dYJXCsf-3i*٩l:x>k[+cZ,,t63@@U!1%&$$ެ$6  8tH`d*rs8̮ )uBc$@@#t@$)!@)t3%8ȂzbO&jps\Գ0J3R[R]{h2 ˘PO R;(b͚IucIaJds|STl1cr˓cʷO;?m_wjw-|=w?Vz/Wq53_Xvkꏮpo?_ǹFK(%fK<|ppcOx1?~nn^|3W5Mݐ»q޹rޕMnk?~գWʫÿG$srݯ߽u\xr=KV_Aģ9+rw]M?oT󁏼Wr~G軿WOUg.J>lO^&풟٣<_oz+7޺7oطo8µ_R.ǧGQ湊_y3%.}+o|͜8aNJŞ>ZVzƞq%]>|jwKWWדm+VjZViVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVjVjZVrE/}L؞؞؞ضZ3J27UY:sC.{  'na>kx֨~Õ_p=pWec#=[s<25q/^>wr׉\},kMZgZ 昝aIA]GDc(kB]RĨ!@C"P jXg]Z7_åWS&`,.`N͵5N:Ё#LZ10Ȥ  F#îg~n}ww^:ֳ򹳌G{۳`7vloxS. =&{.B9Eu(hʴ2Ɗ͵uy}<5ܐ9C|è'eG*$׿Iw] >zY I-!&2K"AEޓbĆhBL"&!a06a$Qk¨5M$ 5d4ewX];r:5@A="rRQ Є&,1%*  lW`gPϰs9!HEV{* 4(RFHƐE+HdRtd.2P[KQ@(BPK5Sp!i"0bZ Q,# Ũ,P;ňDPEƄQ!B^Ej(/JGєPUT*f$ qlO lգzS/-!c )y1Z xgXP1͸*!Z`&D8Src(b`NktRMBAP0B 8!%U"MAly b@M{ (ƘxX 5{7Rhֈ1XgpV 6'kTxHjϻEE1$@DA<`HۊW<OwSw.[yMa˹fLXgfѭ>^ϋgw //p۾+gE3yWb*5;줃Ԟ(%[ҏLJQT<&%4H IZ 6M36Ƙb%uF*U t!%-Q-.Y]F5-FR)L>| ^G߷N&2؀.|)QϞ\ œ}(SƑ*K 7 ݗ( \1[5MW`Y U}cO;y09֣!,QS(B )CjN4o14%(DMH:EHk 470g-Y?g~|pp^Vcc'`4cO,s' vp8$ȤdvO2UD:+m0hL#)j$r`nO7YfA m{լ^G9Y6z :kۨ߻Yc*sgqkd@gc8=LM0b[*:(e4K F풐}u{9'Glΐ.馰Qz|7#I$&L,,\.߄K _5K|Y?gIOvo >+{\wk/L~sc6~!;#!k.rBl LXoS_cB߬YcF%Xǔ졛#\p3fZgd|WmnC~Opv3D%e^bއ [= 3ͮbwDyyϙϧ( :bgr&6H!bB0ԙCH(pIdX x! Py֑`,#$y"{LVcpTJ,lj(0K!e/\D&GB&ꆈp¾!ưn8&ZU*I/cPT%1HB"g b-Z˩ No>Jsge~ m4+rWރ{[rmoqQ,N'TSp CIxU̘5;Gp7d7P͘&9Cr߽Zxkls§7?‰ţ8^QL Bd?-{9?/>?c'~1x.."8k 7o[ ~3O[nsݛ8[A߃? |7dg|c@؝!zZwЉzA]5Hs̊Y (L:YNQI*DB,Q9fLrPտ ST)礮"$`(!b'YbMrɠV0⚊*QT”)zN8C2`cg'ED@,t BU k:HLPc3ZJL<Fqq'o -")) P$,cdGIp[ b<(FBdZB% ͛YL+Ԫ@0J/: :5aR_8ϼ?ʵ7|⃆JV[λYW8~r/K\ؿ=p_8^8_ mT Cp%; !PYIQSI1XT:*4YsQK)S "jHF ,xK,3nTzEY1Ӱ~Pzr9.p97~cϮWE762T- esS&5pbyliőۏ'ϑ[zL%?0T|"+C=Vzag Y_l?CBO3N2+lZخՋ|kx]Ib㝌a|hYOrruX(Ȯڵx>=^,XP/XscRibX5=:ήY+'D,[nг0kr-N>~q̮dP$U>cӵ9 0NOe\|0кTtk'xg8!5Naa+j2eZ l鳸U~noq5yyç&\j6ƖUn;cOn{'XwK=PGrn5{ jjak]®<:ʰT ]/ 1&yOri94;Wm}BE2i.Mkqg03:wȮEҗŤO|r:ǘ~(r`0?D .`6#\#'@TBs= NO?jA&UkHDf%GB$1$#T  8PMfdĤLL=T iwʰkZzA $$a$X#g !D 3i{^0dM{^>ӣBc)SuMA@)f*l Ġ"D".`M۫5M+ M۔šFA`G4+ަrhTuFr%.ETKh `g58ale9z1ug]/|տ?p3㋎]G@Pb\SiIC9A M +5f69- ;&п-Dvrhj*Tƚws`bPNr"|$ą vn3ΌO+\sMNw޳zGd&7x.߫Y$w%#fP~ }22;60 [yft7zg&ҿ2"Id5!?qWdj}76-z2Qz`($ |mpg.Y´F;dt$$A2D )'Ċ*| ^qMI2Vk0ЉJ3A7S+ɾɛ")%8 Z[BrD s\MiQND& jEjHЩ 7)6 M2Mo( FɂBWle(R2`K xDC=HDL&YZ &LplBգ9bo'c%Nu4!uŮkY mJ7s8,.+qjq6 &6Ĩgy恌"VXkNC.cD5UΎ{DŽ20^kBQ"Ԕ;=κf2% sע7b5q{Bn^n u !Pkl"ۄD ZR<t ;S$5JyO=-X_d{{AGXlj wLG\?|{LQcxl?]ۖ+1UZZ~z*70#owC~gZ몒w,]Ysx|U_9z`ւG/o}6s,ug9s!N^x/7:[=5>:O~3F|Sc I 6'I $IQ4̀32 fa+6 1Dg>7_1ӽq7>]AF]IA vdrd!S}b*GBP RRPV*. A1N2$Ma ٚ*ۭ\M'v@CJP:GC(DzSb\T!1C2& DQS{*KqRY!G Q*{jS794$E]FSή2Y>Eos}q9xzy.2)gzt֤ON"&}2S$@Ym.VmIY^eTUMHyxqCg֒bsaރ]:΍/Ì`d 3.î.'HAjXkLyD#єt]|w@/ GY>bRp?K'X&ӌ0RL&;v/b3w$iဃ3)Prc?\|l_p1OG9 cŶNK> GYa6d.+mKVq,K|{?^VzO]xᵫu34 ܹ+ퟯY$MbngUw*!)Qb`f;A)FtH2EV .6IĜ$,u}/ń7SnґCEw7~/zNe%c^7{J?ޮISFcG*:'uȜc1(b"8"C D^9ДyC%>zCd:Xnh yPgdA)wIz1$K#$mRly z`ө>WC$ E&Cc1n'PjhW$fYUObw%;8,)&f&iS6$UHt* #`A%kH&exE`C/gn\IY02W+^fD{y(SQخj`F ùH 5͵IONAiN<tuN#fN<Ŵzkɨ3C.51T|cP+LYr7$Ā'ZIPGŚSUB3ST6v&%5EJ䶠})H>w("775\󤤪LA*8L n#&C07OeD'H K=~RLcΞC4nEn` s{gs?ؿpH1yI6fEI`@PBMr8ɰb{`2cEDU6: v),bL$Y;qta?(egWqnRU iۑ0{Ba(Ґt{2Ǯ%nʶwsDzSa:uK4)9稊[X 砣ȑ|qx٠:$̎ˣ-uǺj N܏} tO/{ϰO b>aYMșՊ]T j{. }ϡaTԗR]ee8w=\a ?5.9:z,Eij.]B_[¤b! J$F]3O[7T |լ@ٛMA[Loz(Dv?Dw#}U_Kw*=$rȄn~Nwa|/u~ѽ&}Po192=:'%UHR<ço TbLD;C`R4)BdDÖP13$-{H>K6\rBy'Ea:TszEsCd2 ݝCpF0.a|PbE56۝0aYfz5>8~s ؎[إ 5ɀI3m*Z1(e M6q$3)9O7te-Y<9lrFScۢMF+]\$05:GLF*:N#UuM(v2e{ .g{m E47Ybӑl)%)8NTWbU8.'UEvRS";EgzY͇sIU5^ܺ}ιo~ӵ8={߸7HkM0EQ X IDAT{m#vq' t|hO9a8ac Mà(ЙA1M3q )x 9`ƦbTHr _PeL7}1il.ږf Ħ`sN;{Ubx ¸w P"^oqnW_cbʖSiONxB)Y'LFC&7d'W/sX>~1S"q2{|JrY@*AaJQs!nq}Ɩe,h(A '+5y8# "H_:H&⡢EA.1AYe5osk<͒}!}&)/1ϒ&[י:y=MmK /N6Ǖ}ޙ}Ws(iBPȲWJREzV4觐UIvٚ} QbVݢ!pXgƺf[ۓR(ٖincF Ǝ%RnS.l l(ArP*^lIBEZVbR% inI(IM)R{r][?0ȸ>}/wquܗVx4k 8L~Oj4눲4 򮒆KysVJD-Cy^>O@!6: vwbS\ʉm>c!C ^kUJ" hJ@iTQΛw{]\9Ϣ;thf(cҌcyhD}aըZ*!%&%RAzBXaaCfd.Px+5굈( w /q6js{ ^}J\- zhbcF r qaD( p$Yc{Ë/񣓜l:.d!#>кBns<OJ8II & &*> @!fr6O(ȇ]8r[wp<~Iz;xuncrg rΛL5":>p77~`UuK]~"G.|} djI0|*iP+E(iBҥ}fIr "eP\i!./Ċa#O)bL[6baW䙏RB(,@WS 2#'vDU)>Xл,4Oad0 |ᜏlD=;{ێ?nd|h>q m3?{F_壏MM9>󾘵\W<1?gIdv/iϡyh) ~)oRd#k$AB) "'Y۟JU6j{A@eͱ0ca"ϧ-o7}M+qr_ˣ?5Z Y^E5j1vܨʬܕ&ee+s:ǚ9kd yEM 'O$ qUwKf?$8C.+&cP*/pW-k瘻۵sK= IS%~*%%J:B'84>Z ct*]_]Cd=l!r,:Pcj[R]v+`mG:pc㔒n 2 p+Ҍ!B>ږa()R'KBh"5AJDRGEN%OSR89cҎ5yC:&][o  ^|܏*׮ ӻppiyh9*IȾSlLuZG 9+X(V&2P,Kg#ɼk<?rGY)$n!#߮O04b3U6:.6B2NQOH;q^ơ< y'EE}mBWTT9>2"rDoLG7 UFfF{Uyb8bs8E^߼N~lb/՚zAЌ9AMfXOra4̨:i6##V&GF\؅ vgv9^9+^IY .e8kk5\W%Ɉ7'-&3T+uҺ));DA$ 찃$.^X}qxqFD9éNx7R::IR8j-"N`"wFT1;{ٽ91}nKkv?_C>ɒKE p-"p䐌ÞZ[^b7@U((|GcG* VVCYLJ!&L<&ցX)Kww(h6I)?|1>eU8TTT༅>&yܔ1]ѥ82R}z?gDO/\O`aǖbGZȡ k\=~)ƫM(28{P }B9T!HEIɓgK\)Ke)$NQ XaQBo)Xct(uXm@I *c>0$"kj~f*j2S i!~ѐIP ,*đGg6/ˬ@z߅o ৑P=s3< o@%;Ɯ9)DOptEU 9 ?q iI~6[܌xp:' |QNh\H3c&LvGܬUz{<ٮ*Kba*Vq9v*,phrG6k E~aiPc^\do;rC\,Z-I r$LO5hYc^ zĴml^2~a=NRYaq\U3ӛHMӚ.Hg 4N0h .OUscun_#Z)N.qbz i㊂Q R34o+U@dZVR;A-1c2? G8cU"|ѡGsb 7AЍ3̐9Z1٨s`fBxfM K3t<3Woxh0 >a=dv͍&wwۂac:L{ZXG:̮7$L z $3vbL5yï\t?SB m:ֈAL,D,iLfwV'W.}s+,3-Z _V#hX]_gߠH<*=="`z"#)\ܦ`󺏋OS{x3;0\ƅWH`@`SeJYciM `7tlFS!@R&t{ҹ0*iCT.oS6 er gAмE{s(A2ҾcRxi ! ۰Q"\0PPҊڃ?[ZxVx3> ߚvt Ή>ĻjЫ1\GD/ƒ_<&wSqɅw )[DŽEҵO*3,F|O2j'xi:<?F;Ũs!2\;PJ qwNA2uLac;7iix 8, X[9xR 8T! j Gp\%Y  RJzyOkҨ#m'/*6J#K -.j]'B[D݈| Ρ}0Zt8ДcJRߢ%y)H+a+A$H݈֐[9hfB"QUZ$`p}5)ʨ˔ rA 2MabqLȎu!bw뇸~`th@P7.sBn?^桡\:KQ]$Z%_\ZfQX='s}xa䩃-=xn8GN54O&#vHpMVW\#S9>;hDL!wNIV+S,(>W ے$(8څ~ΦcOJN߶\na8q\vˋ3d*q#8+ְsUжoլMH7wsF2X0,Q'* wvnaAnjTS ,83}ǥqγR$G(F#ܒvaC،IBmh6*dDHIe6[WW0*'@iaAȐZ#hVIz}Fi` BikL'1atiԛUFqL.kT'k-J\ H  '&h[cΰO։ pF"!3 s*gzy0`|%mW۝^TzH?TE 5ԙ Nv{<ก (C$+9Vd.}hATK M .]p2XEiJYh<X'TѲnji2#S)^{Vy6Gj3tqYf=7Ιg(u֔כ@`9Φ38eCMzd +"d#0|%[ks\M͹dKPFe "L"Z!}G~F "&5ͧ1KNuazZ0@`B?"8L.>+(@_AbR;Hڣt@KZZiKܒcug5Y8**o+HӦQO:D'ho ECݔ<- وt8Q>n[?To-t&ؼrT́~|:`й!?Yv,e&ekEE in_V"F YqǓ;|Ԇʐdևg:uF ܀W~,Ō|9 k0^4"n{yfsɵQ0Yu\=Npf۱2գJzǙ]\Rg5<%lV|2i_)E訥gxY0uh)0*ikaݫr.[N P69;qW#ƪXZIs{(ra'> "’x E=lE'|8aILrVPMSD:)ap{42K4#X_ᴠ铧RHX\cENHMn,&M10[HB ӳ ZD`~zb2HjI[mq}oj>LDE!*uQ߁f1DWspVnhk[v]nH j@gg@Li3TBM b#6D!$$eUceSNi͑°`-esl A_+fgߧǶm}~;y<sƕ^(cs^{%TU+K Y>'n֖ڊPH=Tg;LrK$4<F9~9\FB^Eǝ+]n}v(SM׼u?Prm䴷L=9$fmN3oąsjAϫqS5F9F@ڀq L_~/@)} <|ga6N8CPyl:`&Nz?eU8ل~؀߀; -ؙQ<'|F#MՍY}ΙI. 6;#Ր!GqX"Z*P;PCÕ^8H-F+ @VVN|K c$'C-=5(; F 2/okblߗIE\}rW u9 1HWP\T]CQJ$.#r_yLKBk]AJU'hLЮW A,5 ,-F8)ϣhP"R[ƨ#K3w (H Uk,TClZN^:]:;CZ69Ek0ܫWgN8z-H IDAT Ӈpר)P!úvR<16' :9h`ZKnY}* Ü 8ǣ p4zϱ$(vn!3ʼǁo(gMFQƈF坚[㶦[mi-j[ƙv[1ndl++, cҪ+`jLf_fQFut0eaFp0I`8?X\:Hƀš1 K1`ȱ0r{qz}7Y15z9!ZUg~) 9]Da%WR -GJ7Ћ86;k>7Os_g7k]玅Gx plN<)މ| ؆.{^Ac\-?@ *Lܠݡ3꠬0H떛Z+yxQ<psk~&[/Ply"J`K E $Xл|WrV-Ve+y΍U H:|\٤&҂H&G ԤGaO2d-6|q+<|Do _wr-lJ?^kprǂⱁeА`u1(Fqs4rKfؽŠsOI\"y(mkstK6%7RAas[+b]ig!$"=@(D0a AmHb*&-BT ?#-=üjʔD9 'AX3DNJJM),I 56qޭAyaz;+wՉLHqKpLx;1q ,6tz9:.f Bl?[:7149H @?w3[3ސ Q̊pb{TdCKL Cz_ D,qRia-pNXJg#J*X :qi, *97sÅ*I-c>@ oqwt D'wAhA2p݊|dfFfb YBMpl  c) ?g,DRc0W N )\0E.1EҬVlDTDm KD3RR~, )hJ;^佂`$N lg,yH &7د 3{{,$]w{滓Mc6;oh??&[[>{ |;7yW?9&¹~dq*~170g.|eҽk6q*Y1$@"9(E%aY;=jesk7%ųk ySB-2M[Wǐ[#FH*)tH[z~BO(#TI2Mj)C [&pkQɝYuP-#[N Tߢq%@ 1`(Ç138W"7E ][ JovDpBu9{չ09 h`O,[O[iìTzjXQknOn6 9)mf+5A5IiԚT ސF0TZJXE4J)1O!T45&3 `a]" OLOM13S>{?ݧ1q?!%h6+Q AtF0KyukomS߫!7.nXAU50)оv7&)E`{ !bX V 5)Y7/&*v;N[ͮ7\ v} v<m漐en򱅬x`rޔBuPTB ӡHCs2~,+α `]p,Qə?ֹuƹ/>kc%uD$/W~MжH-Ǡ۽-1۩fۏpB!uiS%DHDy܅+Ԥ@j &{r_G ~/羼Y0яqs;'>1{`c?8=.{X|1|NZC3ȝmo~~4?|C.''h  Dbc &4vŸsa2%(sg2w!@: !|85~+veS,fk9h Z\si ?"k!2r2bKi>!'ćҧ&8h27qf1Y qc_8^M˙01"6\)-z,lJlNGOQ9=LZ,Jq3g3p=:i$#[ WB;^)З)-8e34 U%TD>jD^,VUH E^j! ;\)uT ZxGEϻtw뇷~`x,p^P<7H>?HM0]N^9s<4,^.`ϳݫbF go uQgzٞGCGڊ6?/Y7bK}n~uBB!+j|`= ޒ H(S(a lqxҕUs΁E` N8*jiK >0p=ЌhѰ] gpVn%2΁uFCY| 7MΊgq@ 6p|jw3'X 4[ߚll76Cj*j-#xbt:Ć%G;T+ iAo@`'Uh7*fM.:Zkg~)IT&HHEp@@iEAmZmjW嵑7툢( <$$D2'TR3=O?Uz^2J'&hZB:IQWWA8 :>|D,N) |+#R6Eb#/ETFk#UWfl3d& ΢0d.X9FyI)g~4w.!#TLSe*` M BYj$-t Tqr^ĆbcE]+Vhː;TE[HbDNJt(!t#kDB#cRp(%fm$̐6RTT$I_r}/v2Ƥ2OFFmhqԩ)R|V默 q)B WVZY~tv.Izg}O,rtRIÕ:䙤FVXV^i#.t18r, 0'Y CgmawO"" AhF S,ӍAp"es:AK@c]θ3"' 2K?qx˥ )8:p^A:YrE'W'dnT7|ܴ}{VXR5Xӛ*a;~NqcoHFd9ED0hj3ǶMwS˯!${:ulAYE6gf5M7+yIFyXWtQ<N)3T)3',z[ (A ^v`=r>N9\fq!=)8-d垯d* 9BnkEH%NhE Uv0]39>BVfQd5$Ec)hڹ' *#Q*a0%)QkH 72W'bf5ʘnNlK,x 8ig3}j˴w'%FL}4"m紽uLL<# *d[[l7!,h >k[,jK)l+I8*۳M*yNT HrM^^m#鉋1uCQݞ3|{C9C0?=F B :Yא#_HB %OP/ f5$qRI%]zs/OD$ػgV |~~LX:XfطsY3'@!r ǩXl_ 8S !]/`~)@QEF_7߆,$xC*(x)+xvpHHQ׬Bgz֧^EЙX:$ݧLq/|rHlv)Uaq~DFu&=}Q^\荧y?USX!l~v{dyj}#$;6:&=KoI oaeņ:ReYvMcS98G@!պ`EH'H=^d9|>X!VbC F$XgȳwPŋ;gG>Zk1o6Uh49Z$5W.QNjڒʀshgy ͹y3I5>D+9_ȗA0T 8f03!GuKdC|z:һA{?'sr2Rt5DjIJzbY X0BN l( 0+iRQP{)') TTc_tI~f |h:+d‘JKG9ķ> BK8T9DPX!}^-|dh˒m{jƭ?Kc&"g?ײ$G9XNa\!1RΦx@vj l>=f6% |– 5Y;vweb.0n"_9;>[_]"LO":wOHFdr~g>Z,H(@Fc)CQ裥0!)(agJXYܤXEKKU`v][eYd Up"]'8'2ցL\ӔKcl 41* }#x攼f0YJG3#߹rEr,!mj*aBl@cdqѽM&ne=dڦBU+T&FGou9)>%tDyJ?FT50d'du1㘷H4U6h P)$2e"蠥t BEi|T8y i#K)L9AHeb17 \"Xf\p: w>7Dr߱V]ah dv{L.;\lȇO9KЅtfx݈.H-A.A]d({L^D09ns5@!;FkU6hl]*o8R@<k&Yv]Xϱ-":-= oop+C>| Jkw>_;58#[?p; ',hr:V~/|/%n%$^΁>@_ 9e{r'5e5zD( 9$ !(gljB#<2/QL.HghL99VvFa=Z#IbEiL`BE#<>z 'tUYK{]Śiӊz _WȍG L%㎷Rq)9+:mob)w˜x=}_rͭtqʥNwqZ2RK8ďԦ|2 K6C;h-oS) «F+$1A&*oYd__1Rd'Y]FHXpgFk.._Y@QN2[΍v xȩSJ$µ+l!$LZH%P>Eh@(Y--JIpl3%ěЅ_ 4*Ԧ!;E? IİymvL ʴ.J;g vGDZsRJ?u 7%BKCj “ſ܃ St^s+G|oc&Ǘ1"/.DuĶi*3 F@brH4rg Ek/Q*,CYG/dFB .EWX I4՚PpծmAtxC:3 lj㐅q_Ⱦ*SU5jL Sh# ~lW{h+mQN kT'QF`E!F|K(s!$8!2(PahJI(+vT`6H:vG FjC eLI@5|O` 9ф.XW\1Șg$]QRTm/5Xi|SR1~1`e8SxD&!jc\=C_(Z" O)vpXL1N(4vޠ&PtCV8Gd"2n_zCs,#8o szzzbos78?ƙOʽ*kaOrw95xt]jy;+y@oÏJK؃om}Ȓ_oϼvS>dOg(xs2E($vg(ڑ0~qE8p xvs?@Ek+J@itH%Z#%sT^hB206G EBy& 9VV90Cb2*)jdi|knMDU`ZAףX)Q* Y:IKd~|FEt2^T%K~ royN9N\[6M Gǩ7FzmrD5Ў7u?95#OrB'/Z[9[x84~JB߃U]} $"yH@A/zt <BgTZ:Ϻ{ g0G}臿q`}fmޛ^;%GIom!ǷhȣbvgeT梵$j$+IDn|RrVdKC(:%^22iEnQJ.]gcv;#-ѹĞ1\B{ %ϐBn[wG:L4& pNJ{?swr Zo>^ O5~|⋎r{kDPjhWWx;|9XyO6; sqm)PRt62"5ԣ$Y*ADpt琁%Oxa=~ڞ]l y!سե|ZsSlzI=bաZhMclœ o>0ɐocad&[C)S&d@- &n`@`5@2'S`'h{$+=$xkYt(_|U*Uݽ=wf:TX SX/\>3O;L-,Bԁ{ˎn'[9ŻoA]TzU'b)e|p]ΥfR2`xCΪ\f3L CAwM1"rrGhaLN_$G8$Gb#WV>y#O|=_;]>G 9@`ro=<ϑ)SApPZ)QX=HOX%xRP8ՅAxES` B 5&At8-Ü85Ŧ˚\ ourg#6zI2{чf;ce:|3 d\#:g96!O7L= ?4UOiN[#Ah 0TdR!&}pDh2!CKVoqX}itVH?~X_j'xUCx(U^:GO0]sUdbM)[jJdpA (4C}LoJ 20JI6 RX×k"'1{kF$rM5w1;=z7APH- ##JeGCh%zj$ s#< ٍ| `&yRcr@qj nAbBG(~f`UNL~ $/K社k1:!G&8iYiv ?~) >ZRǣ˰ˈ'q}yL.S?aM%lBASO0' 'CbomG2nǯ2\ ~mr| ữф#)햏{d Ip! XR"w ߃/E/S'`z ;%P;c}DWcxi 贆=D3hWD]M"Yg12dyaDj.3] ^{Vj3rְv8Q牸^pyW9w0df{?x9Į mw6΀\ZdkZ os[0ck_xCt l@jOb1x[IH1xV#m-V{3-5bʻ(ZxCXFs;rt,sVyLy|d4gj]mX*SL`1DD=F3Sg~yAk;Q1N+'SlN]M1wv o%쟥 zSgr6fi$ J;0n5Y|aa5FEr~qJ"6iD &T Mpz el?ƾbQMK.AwPls`'.}r&XB{|B :We?{scPǎtX fɂm=p1B;2>oi0YvR>)zWA: ֒=tj"u 6T$ @ yN#R0|aH @&!\`5.([Udw/~޽_cQ_~)O ڻBɑA۳ 31痹o..DoM ;.%)pdnqåz8z[`7n&Rd[^8|OO4p߭\u(oč,UZK>k:盂=G/S6a ,w)1vKV}*re$ y"5 7pX)U )LCHhADR5W1G'<,k2: h&>AM#ebN1A_,\eoE5GmR{<ΐ@nN5_%9 Y8sE$D{ *ʒ ȧ>8w ,ʋCj; 2*Moۚ_7|IN}4ˑ3%tOJ4 eoih92pRe7o;[@KKKAemgdL9`E✆nNj ?_|=_r;%m8[IIK32TCAAڴ%(@Xs9+$S k@FQ0-UbhO#2E'I'm #ƣ%s"[JB`$8)F9D`5B5\>f6]G #6^9CxeodOm<ˁ/w/kݒ"=Tox\v/kgZ̶fPh [Wqo~蒗:N3{x, Xz@Z\ rbNA[ˈ2m>^K aZHBqࢵ m~|ki^)g㈑ѐC#qhtn{'JNAEmbZ}qN%kAH T# \NUԞ [Xl1H  .GHsd7)?ImT)bKc=1Gz -p~d&ǿ6_ALT­' IDAT-b*=Go̻ ;7<͝{fz`  L")bh%* ksڒjm%튲h.KHQ)!@$$ &o~w?<{-sdou=9rdME*#r\.ʑ_Ir'>{N ?rb|?2[FFЖ}.at UH'~ C `Ȉ*hqa!-jLcχ7ř=xZ4T7=pWb8|3ks /DuC< d278~4bz҅9On- P#881`+[Hnטđ XBU!. C&t 2Tdypy(ЎBF':/a/Nr`ʎq|ej(n7si^sOM۴ hWVVB؜<-›.y'FH'ћ׌mn`A:E[ 󱜰V]<ُ+yΗ^<:>gS;7q9zO~v*U34_?jqɄ+wPШ+ Z!5tOiSくW#} 4&k{4s1ɰ6«/_1>`߾k3w`G +"r[4+Vc0ۍ0{{[ł'8! (6fƷ^IgjF{~e2iΥ@x6WڞSsp⭏.^w\18ADPsdA7( kkuW?: 2؍^|%1{Vȳ9S+~' s>yNטx&Jp;<6SR\$ˑDaQ( cʽL*!A )ѪnD_ɨ?;w(?"Adb1,:6g`%d9EPC:>qiNRQ[uk06#@*K]VKD41 (!:Ay SU:P$&dyʊԆ"җp(!FՖ62tc DR cZуx+-cMzl>~/goWoʹ7;__ٓ$}*Z#'/E1d~˝U1#ϱc|/Vx~ncs q!uRm,r'[ٗykXr&E_#^9)!$'5*MȔ+.N(dJA^\DKBxrvt8g[`Z$.Z&IJ9:5f;M⇴CyO=c2u,4tY̾Q|K$Ixng<ھW&#FNa ܻ`5!d{ecwCMpU0ŝs.e9"^}5'Ƚlq Z| OC,s;r;۹S@wOhrp5gJd=RN{zŖ Uqwnxǹiu_!&I]:@%}wo8?Oyhs3 _%zy~wK,?w_ O%؈vwo ZNq#4-![sl8z ?ey>5+昌/_@]x.AXK 1RC( x`˴>'%}Tlڹ_cb̸}tZk>r!I)1#jMmFy:-M,L1k:I(j+켹XE< Y^GN]0cEdc\8+_o_7BR3ʟ BcE E^v(b1buT䏭 YݕZb={xބwfػ̔1UZ hU\#\,j&~^%壵J}J*}x^\cR-ow=UpװiQPؘa + /YYA WHddiN!$6udno.2ҳ)&W`5A>$9"Bi]4=!RCUtǎt$H> OXdM "*0Z!uT#sbj*9+!H^,aH+8uX) 0"@/dNJMv{9~Pqm yWl8%uqSK|jiT5wDV&f '^cK46NpWW:,P@lX0orqn#psHKA*'M +Kl#QFt6%^gp钢-1m'# zm YEP %i o<ŷ*O&1'>pUG<}gN33C U,g|(HIgן:|^{Y:yS=WaIhi&\kBe}cS`3 ,d939tUņ'p4F,H,q'նT?DWL$4!]斸3$W9b09bk|"D\s.~ʝ柧(n\cj1эG#/"f 7G]y#HXL1O(U%Y!=R:,ܹwUJxe ,npy#62o3Qv;nrOpb9jg+tF,Px|qmx~h]Vy8´~ P30}ؼTڿ`\.)`-?z w[oOrgG|PJ2=2j '9b~@HJyy)XgG0|jxF-W #^BXu00EN{ʛĢH .PG$|cuF #*R ̱24,>TqA+җ1tcqHT 3ِ\*BY8~FX1DV crQ`"ٟ1u] +%1HcpaqXzr 9TUL¡b%=yQ];fN=27<  q.%!y6gʇ&̯%WUJI,8lLءO_/0^.26r`}Ő4 {)๠ aZ3'8l AL} ].<٢/q[p(<АH@cAKBŦlkaӥ̏8 oX/+zQ8̮7y3UAz"l+=mzWvWS"?Gr9~\Խ{}>DGm'iCf&`\TLaS x32XQ$dЋ$оȘ8qO90 Xl& `{dmM4ڠuͩ ͐V>VZz\G(D((H,.URM.ګ4>B|ip$"uJ(,'Qᑣ^ hT"<DQ12f\LsV}1[G'Zl >Ji_qG\J2ɱ3{hTxZF@81f$Gb* HY ݆ǂ)4EYAv# &˯ pYBJ_Е@hW-ۦ2DGRѝ; A+9$pO@M0< H++>g_b~^fb 6_"6brI%d 1+4Ox7K gS{nžKNvq%x IA2_Am܃FstoނQ{ > ¯: E:OQDwb2FC!0[)@H!_aBU"ߣU ,撝g0V AKH&ZMNVQȝ@VH 2N dkdDMM"I 2K-ISm2)R`q);,R&Ys(X.kҔ3r=ʂmG]>'Mc#2b[p;xI>0s+w>őaNSl=S<@h Ouወ }/gZ$_=$/''\+fs ~fZ`_MO!/%Gϳ” IDATY]=7rLL7h0.XY! 9O{\~V"Cpg`/lx)ɶ*g4'Ws6F-l[ KoMh^%iR&؄1HVCـocXmcWZ*#t)øRV |^WHA}E.HY\{D3# ,B4WO_C5^97‹٭nK/W8paxTlz/~n^Gp3y$GFyl01:UtLz>qM2bCaILGZQa+U%F!ST d i3tno;-weg͛oTXYLvS =DĆfBQ>Dus5D" ̒d=(5is2Vh :IEldw }]$͇H d#s9N)4DRRD6<$2PtI:hIA͆T:AcJ%#3\Ki\Z&3 n)JhV!BAËpRxcFAG嵺K$ AbPYNQY[Ns9? #d18H!2)ux=1 $*MmQe"d%n)sQPʰHw0|D&tW)2RAc A,}N3.z.!^#v&'F,# ơ*eYpwe_EFe\c`| r"RZBKdhQb9Hb*@y?X6T4`Y0b$]JECH<-XKO:,T$hdJP-ޜ8q9%W2z3///@2S5Z2ro;džs6h1QT2{b ?kR۶W‘Q6ss[g:t]2o`Cعe.a'~gy`C>ǮM1X^rp9B(aMN.|*Ih7 QP(A$JǀKHZ`g8R3.tȞk|F {찷A<!mngVW)SQޅBc(`s0^#IKBv`ႀ+ ԕR^J#쵎*m-{xYu#@q9XaIXԚULS H 캎mc+x,YʩUF# ߇Q>xjZ61&L5`',y68g‘ ^(qTS&ηS66Y,QqLT?*o.9T,[&A(f+ HN67&Rh% 3NA=7]m,~yVȨA=# K% C}ptlşF c%?J#QH4 Rq4Ԇ1ܱo1p.zrА*~@Т| ;>(OZWhJĺ_wX_gqAfphm3[IC?f/3c]y[I}̗!~ϗRSǟbbbcI|q*!ݳZ-aW2h]%qӖ2zPkBM)V2.+BEj ݼǙjU#E@4iICCP^ec#H5< y膚m7tf0d^0"GtkNXXR(tN!)2΁Wd+o7&YuW[=@ eܐ{=~&ā$#8Og[nb 5\ /?ǘŬ<CVFy U]Ae-NSF&~7{)yK}PK8z&BLq]C;OC 6.[;LjA[1E$ӏy5j6EJG\9GNUeDkvMjWGr_okP GW{I\"p!=ub]}+lVx=)SiBwB)|EC9 qȢ 'Gabb2#|L꓋ rd$4d d7; hM=2OhWA6";Fv!n˵L׈;\w=䘏{9Ժ0m5wm\r4o s._&)|KIeHVxZȤFWb[-Γi, =ה"%k|+> ~ dh Rwy8ݪA3/NMZ *R[ƣABm|]xY,lPj NF -r/KT[Ɖ^9:yg>Zmm--=nKSVF*4RSMbO_eX .%rTmz` 8^C| h̹QkzDߕ]!kO{XOsww{>eiYklvvE]A7i Hhकԉ-KdID"i(Cξݹ[, I%@G|{gs|D: *.@c/"/" o#{+92"By(3!;2 yWK1?*G I"ſ#xo [!l9.Pˊ3|O>GwgNYn!xud%qX'R୫ᩕ w[YN Ƞ@MGq>+d?쿌 -x +*my;^ p8p~a*oȍ"( ->}P &Y |Zr쨷o0uv"qէ{mv?/‡Qvr(S Z'm51{8Y1ØN2[8TO1n[ gЭمF`Ĉ"%&h1&Yj 9W/S6Vo-'Qɘ `,DjO$i:` R#EHC%"j|ITIi$/ Cɵ@Z͒W% u!8pH<ătK$) Zp K-VIWX -'<ȵ .$Y?d.י_{YbtƗK{{N) ,4F\l_[9C1A?CeY`h 7Vg3 NKYE)Jb73a }Z EP(%*a?ܕm9Ѥ:I !T[m($N$ O#De(0N#| ڨP#U BLF{L( A+-y`Xflh"?@1: +I PQHāC=& CcM,5Z(B AtAids kƇPt-l&ـr~B҈6ƫ&"ٙ!^D'ѥa )cJq9 ZđJ  1!uUǁBgp{wiUJ78_ O՟M疾>+5RX kQ0)qYv:YOuɳ$C+es2ķom#(ofȽ}&TF98B,Nhl;nTa'l{8ft YHSus$t= j)p .U6O?ձgnބR̦ΤoyN_M )@z?0CA3ib〲Pjd l˒p&d6vƧ|.|>X,Ë߅+3yii)!/s>emKll17O| Vy\8 !G/X{5q 1=kdfbL= 4By-wK +-J,3ٰ8`s7SBZK<$Odb͗ؕ#.!=h+-U>fVx"uRRRqT.qp_\1Jo7hfŒNՀQ*9l#$<'* A97w2QLCD~CZ]~i5?:OeۊD)2Xgv,aw vɜ$ԕ괥ѮCTOTL)$f:N)Em )!PӮBE> % >i^u,vxU"%DP!aI ZB'=34O3h!|T&0o}eJEC5GH]  1,O(Mi=T8ZhsGx\oл*KyB#߼[]AY.ޟq |s5?Ċvō{ NɄY;AoylxSuca-?:_s+#w#͋? _>+Ty4e"ŒC{mB#4 Ue qxY׍NtKZ/K>{{fj.+?/Eo*R0SkY^:D BvH:Ii *J`*rdGYOlUж(̄ W5H; $H"NeQE_P1(/f\$Iz>uqq6VɍCՃ1#+r, ~}=EF,t MʿnR/>sص"|' t| +;\f̵7brU*UÜXg'/nʥ-FUc<_7!Vz&a=^*-A9!%ז^9|7]_xsqXwXg)˼Sqya&A]G 6zkCZ B5RBYa ex^T O|-U^-^̾L38Ry\2H%M!9agۖ[m2;rȕ@k6.V0%;,gfU{++Vey>ux]2s +k[ca/c_6(n P})?}I0D/a "qqZRhG- I &嘱ó X &R*F(EZ0I+(UH4-0py][d5ES0iK{@ t l2#E0? kB,2X)QryU0NA, 0e,‡b2& ^"]!(N!wAᰡb"bcUI4ɪ!ᤠ7.`}8* Y#KmM(L5M޴pwn=AXIT߈|ՍUԔ4UNjS7,bjLKB3o IDATLNB4 uKȏ86 hgNPEIPsC/&}af(8¨dĞqN+w\HL]STGAͱu#8Qغ@pyNiUw!Al|Ozŀ:/]c#Bq PK 1ot:`v_A;Wbs 3ܕا@ΐ}-",IwFœЙ=ʺЧ%Pt akSOiG C؀γ`r47{`frx,̾ <sHwS 㝛GDg{΢nl^rN|/XyjsMDPT\[CRzm=ryNE -ԋI({wvyiCW)%.QT`PTl@\o<=tIf-YRU =xPԂh4*+ 3W(H-)=2P:OKJ8E E]X*T ǃF KICJ(|"R|09I߸ӟ?Z_|/ӝ6?x=ٽ_Ob[ǩv[*nkۗp=.=-wɿ-9{npb0oOK\|r\5跏r3u; + u$ 1*_M0xo HjCzXh)wh"9e=B 7?{o7Xn̮1>!-r'\-t-az"-b9Ѭ\,Qiw )VJI7֡º` M\4-Idx"ַmK:VJATBOUI:?@4C!'F{83"V.A|2nc>t {-3?a6ptqA D"p!(B[@J$ma3Hdq68Ho9FkTqCBNNrQMCP7f7`Z Y{SNg"}}c_{d*A!NhAz,$Fms1]!;d,];,z6no{Z?K_c!e:%N@(ǔ`%[T^ lu<%5?!?*&ғ|-Tg' ;)Z;{H; +aZWH9w.'?'n6I|hKxd18\|FFddiYؿNvٷtgN,?mS!5U&(X<+߆m8qJ.¡_Ƌ008 <8<<݃hΗexAx٘׳20<L0k 6-4>ހG;f T⭣!$cʐr{U0k Tnj sy=E™.ҧX:B5^ } ʍ;qޓDXN}O<׻DҜyVo>cp6cC/ Z_aW#ͣcbBm% `==|X*vֆN2#"V#Fwx멌ŊIpo(X|@Si\ZC% 6K^|ۤsvMbZMq2I1Ty**[vV1xsEކ٩5"o3 F@a#?, g||[H ?|/άr_~Soۏs笠0EFe 4(M&5' j!0|NB{쥫]xDNX3aW'\x}ṽW_/s>aFczm̍ zb1.8$Jc@zNtquQwo&.!|E[䧺#O< ^e>{_pKZ PER BΡEkGH*4TⳌ0DJҕRD, 7gY>}Sr&sYtSMg0A`EEFa5qC]@{|УZG5ۢ=V)DƸ( 8kQYX0@;A D `d'EўXA;,,JXoBx\2 #54'Xo$M6&%c:^|ܡ%fg idw=hPj"DLc|QD RH;-Pd]lb23 qeMUH QVK~!P(s'r'6^cPBh>CݡZK D&N\KW'nV$ Y|ɩ" & 3ccҪè4-m4A$n1%efnoEM9%ͱѐl='>u-) .J K&-4F)LNkce}<.SvY &: Ft\7oqQ~Z7.T i.)Y֞yW E|6w(bH+T3%By)&%aI0Jo=C9*p.AI\pU2}{x]r-أك8"1m!|yh݀~cXB_l[0[¹^#xv#u8]0f(옫7rL`/$I:MWy2\|i|.B^4 .& 0Zs\mk+, 5ޣd=BXXfH1 }nOmi7W%j1N8WD1: 2x2ϑ;qD M ;0zzr/ XQ)bpb=VT!G@S˵4 F(j3W/V8ˬL{nʗB/Z#haBwgfWyB&1FjugYSny3 qѩÕ 츤ʆ#yvoK#pbdR%jRW%-;v52H/jZ)Nk SڔzJ9bm%UHFP@x ]*gHŊ)xM>տWo;O}79s`Ah VG!!QXZԧ$mkTR";Y A+h 2 eR)T=YK2|ۚ׿ {{`f|/vcOϾ@'zqqɵ7/q+x9`Ơ߆\gV!fYAcYe̙7>ǭ>I;ʓn:ΐ؛TcJߡV!lR ׯڕh=q$+oFQ6Gs\Vd9E/ݵnM#ES.pLmekZ;;ŭ[O d %Q$81ʡ`Ǭq`BQ6&+:G"GۄY {:jNFե-ȵMVs|D!ј0;T[)@H+T!G,[9/{`=4zFZ DYӟdHZy?Nu)ڌp_AY_~μ;d p*BY PAOZ( KDXKZ@.,jdkY @Xh$he4+M͐Y [\CRd`o49ulw oknm_h1E`bm6nSy?u#p8lKL$ϝwށ$и~SґA.Z%p0odLN,qf;X᥷swP]6 $VE- rc-I|Tk*Bz}{W#"SS5\;z6]Ѝk TyEaK27uҊPkPAjI?#[%Ꝅ@X'rs~x_1eG+zcr@=QaW %1Ŕ͌gt7ga7andRS.}W`^ކId&̀^Od-?AÔ6 ɨD!up@SUH,!\odmơ4FJکXU" ) 1n$_QzA+MWi)y2%P/8k saB/fs(jÑS*7د*n61cɷ%-ggS˰ܛg?Yrkk6(6+$\-bff3^N}XhE++]LhQݗhɄ4ڎ;E $ugFz| 5X+qzwYxM4h!ɐ GwYa?9O'5h.N1A1ycLVP8KD"q4qqhI0cpdgahgPRČk L ld1FV!E '(JS7N"VJcA.Za& Bft$H͘QyqV*zbfb!*DSEn(ul(htV6C =y1l֠vUlYs"r`-8FbK5U! tmAPУC<Ϊ(KT ya˪>~&c6n`1 3hK4&ݒ}ǯsK ~KF)x$׎PB (}wH:!ߤ*V۝)[\U!h[bmNb$^ h ]bPhߕn/~,9O~3/o04q+'kp<YaJ;Fa5J{"/)1R0g嘖6"B,wKl3B؜J'H52+O^hA!н<Z8H- Q\ +So'CrDZ;STh5VILY)+<}|De KMxk灔ԎH\BɳFmy) D1z 4)'aB("iX: !^| Η0Oe@USo]%#'k;[߂ [/[jq4t&UZ ;ZTH}[[9M!Ѩ Z* /4p^"@r<(T >4D\+o!p)b}B/BS ܺ]PTc=pd@rneK@Œ=!ئd&%>H#-V5Mey3A9pՅgYM'sn*I.`ɲ%a1 L/Xfzbhv44mqDqdRruoi>סhzƟSyamI64*G*[`E#k'&6%ӂX[(@Ą xKd^zʪqRSb}U9.W(C1ѹbg۷{'Nx͒\$՗hv FD% \.121ȠZar5լ*FRFfvGyKHk;t g{\j=umxh,OLӴ;j[VY$9G7α{>&W/0:y*~}(.GOIc[?OebENI8(.yq=?OtΧPOzuG(y kqs;.l9ٲ[uS:IUu%PIxЅ݄DP R $A NݢyzE]|_;9(lKh\8z#;T$a.#u YI')>Wk ED ic(oЉ@)|˔)(gP9 д5qɺwN ,H Ɔx,~U;ڏ>&(fw -vgu7EcEaq4HjSF#5q`(+ *㤤Y13KRŤdT$JETb7͆Bo虤utCPq芭5~3xS#DͲЮ=N tQa >x4!VQx?x$f}GZ8RaZG>HRfKCQngYYm;,<עs; 2802G0#R? \u]o-+8kWw\r2{_-i==Ͻ+9\v?3ph+(xp~XO- oǞ˗ASOҳ/} aY8W%(&PN`P뉅I+̦|JEד֤͉$?/ x("9fa)/2"&1 M4ҙڌ7>j^UpR<{صu m YْDU Q稢 mr\/Ռ|:iw/sl?4D(J֔gE̤ z]f~1Vc ȐhJ'$A5,)Cĕ„+5蜐k|lDд\B!@J )Б>DJuB )$Aj-)cKJ$3hOn gF,QJtQsaKӞ0;DiҊ}]lgVd+ 1\^<:v k6\xLֆTJV,8GxIUTS3%H5P*E%p5)WKS_aKI)EdOOء$Gp];A?0ɀU[zGԸ@zL 8HҸG) ,[z(v%ICDf#/0'Cĝh$nelX$Cs48N7ˈY<ҷβ^:"H[G4ru"Wq_,{_(CMN@+-5R( ztDI#J:nh1Zn:(K^SV .1Yt;MnpJ'Qt-gY:B_]Ÿ uF&SEl3m)̌Õ(x}NKiF^BEDfe HCC>HXL^UY:DӈsG= _9& MIU yx3I҄2l(d`I)0& &bljt%ޔ8W! RM@QY,&*($ITԾ%F(3 ћJZN7* e\V&&4DL+MT#s-T )Q$"&XrmEiUD\:_K+OksC\j4WCE4;KՙAMQ1Q4]?4皤\Yeؓ+vFD1X]teHCjG9E9h%Iʚ" bSh!cRe 2\q?[i.2| -]xɔ';W>>2g *7as3`ק ,_'X_z9ϧ"pF*AIt!Z tP!$Q_&4IR3-WUgZ<{(qDBnQW:dsYQ?YŌIJ;"MV H%D,Ł/ъH9“'ϰP Pd #]iscOHۈV acO*4ĥcS.bP=.hg1MLD2g 7+N|Ky)Ʊ%&q8N)|8%12R( 1(\\?pp8,cz$PknzKx:@Wݟ'㟅Fp 'c4hCX g $i^x*x@PBw YWˆ.ᶏ\8{m'#V3>Y[\bG"i$YXk7XNβkg]W7øUji#}+]<el-Iglj DjF($!P%yU;"Y?nv-Å ز>`|hO ^U%*ZKLUBZ:V&"zܓx.%#4ƂXM,Z86d5 Ld B A5{DJӔ_5bO: <lRsxfpB Bq2[.2N,Oi[Pbiu~,M KW܆ObYk"r3Hy8:ȴ9OQep)l1{8Y6q*5$3D7 v9. 3ŽxiA!#˚h¬Pf Lg0A! :3K2r258wA^~=QDcV%8Q4Rjw͓4T P|Bm*Ki% 7n/|Li,s&~üo?> _ի"8Wl0; NԇfҀv&\ Ze~ ejhjJ6I)S654CJF? 5@h(>BjFRl^DˀC:>Ey T5O4ڈuKoHz}ɇ?7m |>7}>oAo~>Hû@܃ n ppsn~s^0[zCڗxXys`v@ wʣ? O=%=^bf.@#KD)PʡrH*̨5 lR{w¡k^ DU7޸BVugѐ8|f އ{WlF: j0>u]F1ń,QQhcb(:$dP Xiwh:n+/Bifk#6P4Ku>)ieh N5ZiNe^F%JIhea)p(WLRz_KO4N|j9sdDzn}'oxMjqԔ4rC%ߒ/*K:b=OXYM1w'toa_Ӹ\ca :I4cSq# btBK) u7o7QAʈŦRiJ$.8aEbRVx(bDA&&(_RNhGKɡ*2 "tnn޿wFpOsϿ>%ivtDJ. NC18Q=2c!H'5I~? –vYEjaKl_Qނ:9ޙeR<]N6DLcΈ _Zei `Z-vM~hg2w آbū(0&UI4gI(iUOic5U:lҭeZLŮcTk}&+ .F ]SL8#(dt<4Ҹ4M,dJ4J*&<—T(&)T3wmlG:D ,Bʚ,ZKX#ǘM [oڗހ;y^:Yx^L]h 65d5@kCSu*?DGcu %1‡1׉}S)qFB)GʺxZ"k Ҽ}i_h^sӣhkFNg?łKg g6-,K6y೏<8œk's| L >3xSO? W3~]gSMwpBgl&fa.)0& ur]gj/pxjR5x$6Z3(Q㉿sӜ4qM$73ݿY >u?; >21݃=@>NnDG]7,#g7L? 7+{I>L\I]m|_wqLPiŸs & !$V " 25; ^"|BU' lդh#Jp0D 9Wb,Mk&t"Ŵ!y3+.8E#ɈAi&)IaO1/2jLpvy`O>圀0Buo (D3 biҡCRX 5 c1RjtJp eL{'7`=6/sQU4ބz^:QY(dR]hr|O5["A,QWcGVtMemƁ++ѻwޡ|Ezn=S׷]d\eA{N fqnԐ=3 &PO1 `2Vdr*WXt;4M)+&B=iT:TE/<pW4 Q!/B+%A7N!4x6¸@ ; xSK 1P2% qD64|ZsI# :F<Vb呯 KCAcrTSWwuw֐*[3D"A",Q*zI[U\V(bo= 'Q+4 !s- GYI7U ᔵqY1\6nX|oh]{)jI+\]mM2.^&h%OɺLSnj+LB撈-,!m :RIg^2w UD=cBJΖhP*CiВieTO(t:v7#Q S ^Zf'jVr&*xlgwpն-O~=e;wdޝQ3e;u[d-R $fgH%j&ɨrT]wcX]# 3g] d[vpU^|kKb}csLW8LػtlӟJ`ky۶棞u^mۂ{=dZ}G\o~ \kI<%f[ X+ku0}zl./JX@'7˦S!m(_D&Mju? "p,1L#9ϵ{nA8 nw /_} Er*Gt#ZĿ&f< [- IDAT{n_xODtx/9x*qߣ:~^8s w_}eؾw,ÿy |0`򅈯sxϩX(Ov pQ0/IO4O0\>`R 5Dmk(q4!:1Kᐉ› .D 4J֓ jQDbLӻ,1y8džqboo|M<Œ+BFӕ13Opm8Ɔ СAlhvѭ:vsL2hⶨ=n@7ȵϤ I"m|j ZU_ +kQ>H( ip6%J4Ԑ+LJ%^Xҕ=v]_gxᏠ2ݿJgjKGkhoYv%sdVdţ)I5UɄhU< !  QpHQ2B9[~sXO*Bƀ##Jh# uj"p)y u |=EE6)ࡖXU9M Y$mkKy^Ä^k,mݝ??ԞfV6ccIv"FOE)E8xr͹rw}nZ3^ZoAa3=޴eJ7W& M|*;sq7"hؚt>u!UUU fTLӢ&@<ۨC SK،Uaij M1 7%oy;g1{"Q!\ ݲ@޽> N?K3rh@(~^ q{}?ۥe*U1,nce.r=cd 8|~ex=Xm6'-۠}+i8~w?H,_ &> w$\?W|=/zI ;bXy&'$DxYQ W(QGF@6 !_| 8"P0b W:p.fke@{Oh,s klp%dHK$Z$B - QFZ"O){ĥ1[B $(S!I+4"GO%XDYU:# k"4rƢ U?ƣcE(Ӎm05aƱ`dr:LC\=Bf7BZ!ś $HBT1 } ZE銁,X^>,ољ?|vtS`PE "|L4mh44ekUFOi0a]4i5T]g xgED/E,hADnGzg&v0B"<9°0aM7_xP0FUYs+d33hd0Q% z]Z϶>fQh^_4{L6F\V08G^Cs~OkNpư;vmť3L IE Rc=>85"pJR'I"%) e8?4{TH㕬o+wDRѵc3hNGm,xS}p;V_p-D0Y篼H A#A Im.M%Zgn4]J%,lUv_ ){mkɺXZ-nڳ 3sssrnƱK2ܺ';'ϠIsg ?<_6/St%;,}Ri.;(5`ד rB@pU]L) %A' ʚn+œ#p TQ AMV2dƔ[o/` i\{RrӊgROǑ߁/w< +bLvLJ=Cd93{͘G\w }cc1_2߁~|So#k0QXkn;8W킿GoS',K>U(¡;`a|pHnbƄ yv*ܷ1|T0*8CPXȊ2Zpj>1H ֡:! KI) |I4~ϪB{q̖YI2aͣ,oy׻^Zjccp1C ddL`L؜xlcElɖ}kjuwuWwuw}29s:U[y~d"wXq6a.z"kj@oo|-2{7?0#jlxd7uC[OQ@g!֍Tʥ<{UB_YNn歾`0I(Y9h󘘰,ɚ%2P[Cr\HC\L&;Gml2> P $R昼$=KܶHf۬^Yed.S9h2ówk6MH/))-tgi'%98cX*&d5 O@BMo%Fk5;aϰ8'L"v]K(>$17HK ^ {P?9;.klB͆ZLCܧvr79.qQ:vesq%6\ƈ٫SXc:5 ,[e`a2`>\0^ǕVnZ&xeU3`vR,.[DžL)nBBYCd'`QJ>jl~FI춢1ulLlu&HJHZ߁nndRV4͵Cп}#Bx0Y͎ӬG11ݐ9rˎ &JGS;tZmk^'n?_̇Ok|sáW_%,_K?Mm'+;8^O{6 %?OO[ 7\+a|=O Ñ!xy[z+~S2~&$ &QNdBrtXׂD &V5J ɦZ |jo-OU_fᝠCIEgZ/Υ=l()MkgRIVLbfv޹MF;LfC-FXuC$w'#PxHp;@}C᳂:}փ>Aⓔc "9RTarɰlIK$N ѻ5$kOPETF`./efZ[t&^u=oq<^[A^ iW!+$a Z8R/ M)' ĵ+"9VxzQ GL hy]% Z(XSV,(C' i +CKhWyK#9#w!f·b;ȓ [iJcQ(1HJSS1ލ&Ȇc &צuq'UH[߆iiЬ $D ø2lž&z3p"ӃҲ8FWᐄ|&6uHE)j:W L Ԙ01l9?0F ?s½`ct+S)[ׇs|f x̼MȚ[_ ?\7_/|Lp=\~Ix.}FwCs4{G_ /@c-6~ >u<OsAW>7.OIC:܆)ɓ|gmx~xzŃ.Zzm˙G0=]?񍏳|sbH/xX ,0أ(˄\P`&+YoxI C9Ow( 5:Iuؽ9͒!/TkJ-Nj4owPhN_K$MQHQKhK3d͡;)Q 3 7+'!+h7]0)s<6#^E:[7_`w1 :::d”bJn~elROr51V߁YGq(Gl5%ƣ _il /a+8\]^2*E[mP%6mOfmr۬W=d eL5/JgoXLD=F!cv+q@4Z|.['T$Nf4TEĴgTItH:.S>`kIKN"8yCTRb"`M`e*)coB0*Rb!ex;Ch EHpVaU.Cb RŸ~9?@qܗ}9D!Y'#SPZDŽ  $TEb-GJ_+m# ߉FA#%+[A+aZu5kEM5"QWIA1p\AUg#6+\106LqIy#&5A` KvbIY;D#^j5@H3J-j@ab&P֞Ie(wxKlYTRUDv'w hHhvDa'CS](R|sӋT9enrG.p} /ʿof da&͵uMrtG46|^Ɵ;π< w7r)XJ`ig`7_@]S}SgcWxgxV9+" |$O$/}F0w?s 0|>5C~7yNܺ?3gkKWmL Cy>g:lv!4][X݅7Н|i-GampMNݟp,oQxd>9sn}ٞVIh a</ 6%5Fm%ٔbŽaG%"_{Jƻndu]RQDA| ѝySv?{h/+/gjN0=xE`b.a ^M)vtz/='>Hofmгhnsu|_ڻfI$):49tjc׻nwThXaW3}aR.^'n(}3~`y  B VDc8q HScÈx @_xH}k Iiz/aq(w%;g}#GB?rClI.ByDqnoi~rWN8`ds0Azs NFt a*Dqb'EЬP접8,,P$sEKVL2wsg/YwUY WQsR鏌yg [YhusވnCgg l4(w'ÐDQ3:z aec2\叱k}̈́Řrs=?ce<QשʊJ ȽA hm zm+J}2- PaN"BjjBJQ1(A$#"nM:@GLQ@Э7m fK2!&m(`F( !GtW2)b& CoRu ,cِ-jMV 6Ff6`BmP!IjjL'1W[^  Cے\h{s IDATӂA|#4nRmǗ<]5ҏXSKMѾԦ8'K93F#EX\*%3aj<q:\۾SJO"{Zw֠;Opf9 INOSOƈa' ͊ -MDԆ P5[EjQQ^$/AP:QR5,0s)9* CDcKK'$aM]+ڢ*20k%y^LxC4e= <<1ӘO8}7,d_>>$г[lwTK њ!fG|?Xd\R oQ.sWs! ٓ,7qӻs>xp}VOoes+#׼o {J;[{d]0u$K!Zo柼=da9*LQӗ-_~|3+=)쫈 =3J$q&4JBKMLmms;G_K Pa5;k5 ^"DF%;P7-E Fa$b'cܞXQkjvb=HvzrŋXeOf9_CFq柼pb p _e'Lį{ d_g/0ZΛlIÒy~ۙۿJ:ͱAG![r qbkqWi^nJRR(n/h82D& $[وNH:u(YKpq{L753<"iI$"]®:Ԯc f(,iKftDhjY6d\*efZ5E+BOr5Jm2Gl#G:e-JiרW;l(Lyu- E#2E0|=>ۘ{ z ם"ZptꅰGfy6VkWxSNG=Z@hBof0f%Kt͵5U!4|W ٩aHkh4r"#Þsf$uȕ ݘnItmCj)51a8*ɜd1RSAI RHKUi#xYuWo,%gu4lneD')RG(an6nӞ`+Vʥ5LQ!d^7jH \&A hkEAE-gAj1^Q1ʡ^d)$9FN|/jSDUub!nL2$\ur ` ,zĐt%{\~ a9[,50A~N9>,،́$栶vppnhO|w;ewto 6_p %0 Vkkڒڄ,*hirO ;+)8cBpFCZ4`d%̱iIcv~2(bGU=ћӈԳ{0̬MYV_㹗r>X W[<#/yI ʟwB,Zp*(fR#Ty - L&IA[lOKK\ IRQOn`XZMyD=Ŝ/}he)VQrE }6(3Sz:f+[<'ώZsn%+n/g8b8&ѕ!$,xGMH#8\mǎrJqCw"E QG D `;ɒ|3TdLk2bOq5N9[zbZ QQYOOzDV}5m 5$ %"C$(h!8GQx,UUPV!J wA4u*ldZ5-B ±=BYҘhԦ+'#3ԄiH9"cTZ5(_dv]c߱n:[\],NxoTHt8=I3arz,jۘL^?Yy" ;Ϯ܊qPiH w9O].tbXқ`l$]c ] ͥIZ#WaT6MT `-MȊ+}r#._=t3>L%k=!u򣎋,طQݯ)B#+)# eG7ƧQ 3<"> Nb܆0h^m1wWE㝸|`$#8u||Y:/ nhޯ qf7z*Iu ӛ\ڌ~p[NQ;_:|3b|^׳x慊1N]^gK5{  <"~=WLK'<s+'Bnd ~:X2Y?j7&\ ?BS0ڄI C+`xIBz-8QEQZpepfPGpz?ztOrXp-3`4$aԶ@ATͰp?q}tRH6>j"jK s1T5r8k*FXWI&ћң5: @uv,+ XMׇ8mj'n[L$Y )!c罬<3iJ%LүXQ'S"R X Ba=!J#zJ&M3%~J GYظ0r^4~`p/a4^sh<СFz,%&|:lm,$\R49!m@]> \>2.txqjDoYknL9"P{8\#'40}AJ;2R^8`)5dV _l>ARl}`u88d0J[ hŧh)TRO`vT֐\N0WT,ɟUqr!ᅳg,cEL3s& 0\})%>Z22wuflnMp:6ͺn6gTF ػ 4[}K~L:`ObOu*W;n~ظ􋧹N.ݣ@ \-5UQ9x"iJR2nJa[Y8J *__z&`j:6# I TFґߓBf:kB^"MYJ-qiY32-h> ;Ϭ3DA9AIj{v76m^KX}SZ:w)I UT#E(ɄIW7KvL'TLKp4x ={Řt;-t>[CRV,Eq А!)*ĶbD1nt#Cl")lR!i@M`Wc h ԹmN<*GZChiAT8Wb$ Bd`kYT`cOB')*MhO]n)p(LcAQQ̃2=GBS&^Fޥ ὕ8iN5 FH@bw xK}AJ#UmcO_{$ڮu9/M*'<-$ٱgr}p%GV< 0|㹁/]iP¼c^|9bv>E-VcF!R\P=!y>/ZFШ 4KYI&匘Dw^dǍ qaOae5t[9 C₣-0 H-)=ʣuL=Ta]B對ƻԐǒ A2 >¤OHZk>R{EL[ BI]Y*C [JLB b[轲oTѾHy?Х.AB FpzHXZR3У:ѢE#&0$QQWY\pqW9>;|+G5"Ͷf͖x(f]]+*A#`4*dT”D,_r/wN\Y>V.0$giR'j>Pj/k }W|4]ֲޓ_ݒ]bxYx휫β?n>}nGiE覨<ŻdiIx{P+5z=^tڋ y;-KO(>)%l9^`ODG&k̗ЁvMy22f6DS%VB1v(PQjO]aAg!swG"tevz[kW-b#!MRI6 {4 DCM{dt莣_t]ٚ;2Eё()hOQϱѡ$rLG"8S#"S:JqT)iǤ0z$4A4vNk2WS7RezC(J,-ߠ.;WO_coINhȥ$F qNh=(b$F%-[d {jw8]ZL_3<fRΞ 50V^Kx`$x9ϯ/v8\ 6NQO8,X2i)դڀ g05k$vw'<&Ts ֆsSɗg,|>au9rA0 euÕDr˵,lJ:,As IDATt>mxZ W[+y7r?XʟIF$frHC׫̮SRf!8lnSH.}HuI)k=^"/ŷSŋV|f#Ŝ;\b/I;|.f."0j=JGؒQ2\0˔9KXZjmFi|,1#K0-Ԫ%gx}4:^bZ1d7x1%/_|ı-r*(I 7JyUz,_oMԈ m?J !!g;4f]Ҏ B9&S:6(P36RDԠeЊƒw4BC G`F~'SNّ_Vp$4DfE ~ӿNǸoT1sž`o@ۄ~L5 ;1RDb' \)ُ;iNN$MG=h TVJEb5anCJq^k}wӻ.t1!!\3[M.S':':U]CG%$}Cק̌ nϡ;L0/KQTn@"8<oA4M;휣h[ّ akj+(|m(%Q|U&$I(d~eI$Yaj/QG [BdhE8`VX9}_wݵM,?WWYA ƣc Ƶ`ێ Z7p.kNUz/!_|f:V,Soz#v&D 504 gX)/4\oהV̕euB5$;1Ɉߥsn#/8rg Q|eC1y$QMY,yIyl Ǻ)DOI ˜yu)DD!H(iǥc D ]K }~ mp.jd],t7a@A1:!};}My8iJ5Ic(: y,h fjXDK !BtV0$V$+.mXGO@dN%sISb]ILjJ[f)uX:+@y%BJ$BB)Ef T4lEy,Q!V (0X9[(y@kITZ*ySeG:fM_sJ<}qhKYBۚ!{׆ٳ} :(e&'5#_rW~53p-sI0قf̞S3lM3|%Ov8"} QQ@\LZ O\qp>rC 6!dq =uF$hHaԛ)A[fg/gkvpTŷr 85`Asao=a!@>EY߰~e/нqYa=u u9r&6g__D,$,A!I3tjToF<4Om4x=k.2;Ñ4N2+ioGD:EM" :3 Z! i.Bu{&lep)Dc@ɀrɤjZ4.hD:HK^:?ewiFO].r;xc#ۡ\8Nŧi̖s?׾O!\jN{'x{X=¼:&[<ɯ+V;\Xb@wԞ+6K@>90: ضopK\0 BQd "HORu`|?Tz@PC"2Et+=D'%ƄtЬf)kL҄BĄviHEeMzLF5;IQٛY+Ha*U@4AC4t"Ɍ!&@c#:j)]LĀTѸD5+I$ iIDXR)t12 q^#UT33$9}J))d2Vru=or|~{| kh)$1cPQPO&i#,>q!{,s/_w7?Ā)؄yz|oRv@'A@lZ\˚=Q5zJn  V;%g:7X3`ɮ+1Qr˹[l."H6KG럦=Dlt!ht#Ip8+!b#=FTA H"2`4ÜF0ࡗ@_EdPcaL{@{\ rM~PPVD"N@Pԃ+@z(T{?`ئ'Ĝ( jIm2"@v9JH eDƧMJ39+w$eV:ȹܼAݤl+y{'PM%lZQ(2?(Tl7m%I -IAUO}.e>21aʢaW,5Q]2ۮiyJNY|,F6h1oHyΓ8TI1)F D VQA"i`'VA`˃o"r=ljmQאETgKZyp<0ú!B[1XZ>rUzTFsWT4>Δ{5&9,=iدWw(/!2I͠\1KDؾr&:J աU5w`s I&Q Y\ !pG]8n4!v0*J l*AHE[߻LAU%? WP2 kZM*J8)ךc$HzJ\`{O'O0IJ5I b`}wzm_)^s񶥻8$:!9!6[ݹ!Tm2/#Fci#H&$Jx D,.}{ QHE88)%վmDwhE`ӏMR^z"K4o+JNS?,pV:NM _Wy_g;:ϱD#86`N>{v] $F, fƩ%5&$coZ= 41rͷr`)Ce NhhŌo}k_aws8<ڝ<6ٽrUJ]n:fЌ:dMU; 4DL2E(G4$WE #kUBlBhTDxjJ @ >0wk"&z ڤ4eh\KFR[Z\I~mR $Ǘ讂^1#OIR'yC='O|MګVb<:BĀPa=1in\#b{ ,첲37)6% )y04ڷhD""[Zp/ZKڜv ߺc8j+vP&w$K40ך' A6w  aa--0\sFsڀg],4唲?&=,Y$55b`ZN5SD\% 2 &PBL`hK= Hb'AБP1$cC;WZ!H+=ĵ1 ~m-x"[l{ RP:x|ʂ<УuJea H:K C9s[W]ءw(L~taOrenRw/P d:fF= ݆сC)<;+XK /6h܄R c7cǠ-[1ŏTLIR 9䌭@ޯH\&O={.:Ȟ*<ḁfGf_R p ԑ&#BȶKGs!E4Z#%iPJI; %C!s"i4XsD'p}ByJUx/ Ѣ%-l J hi"BJChtH!L*1&HAiD0sc+6zk.2}eFPSA8tDgiHnX\KZ}Yz4[v'ͭ oۜ}(0H:e::iWF"2]fPr~H.ZF`h+N>*[~ìm?Bs\WsdWz,c6!pM'ݻ{rĝLnp}g{l.|ȹ%孼o'dm1Rf`Mڑ!' C-*hَID֡ե!| *k"K WCkްK۟N{Uq? 8rKLVD|'R+%U-8u͌yPN$YBkh[NhIk4xhz4h,ؠU)c;Πq-&oI&FlЉn58, *zllxQP:A '!tFLj~Ռth_=;h>~!?$h@>vwp+ :9پFò3)4x۹h@4a({6~=$mnq|TkHBk !x~%:=ňJ-J fY%tJU2ݟ8ׁ9ySE$|vY9ytfQ.fހIZ,YMڤE8Ւ'"UT QPy(e[p.(&VR2 :u[4Ƞ{`mk'tۮEPH sEk;9VgGOT\+%DT--g/urLW2s;93.ڬ"afY>TWVނǗ{̥qRk%tc/2+~\`j5"r&{ᛐ]p'%,‡b ,amoMmMtx/% 'Q9}M{, Y\W>eņfaD\4Φ7HZĢzbNgeXt7E"dh4F( -(APSD0sh"eyLl}0i1E/YdL Y!Ĝ`=AVM<ѷ./f3,sq|_ғq]ub2)" -B- " % !8"F&*ֽg%Xv h v0.h%HC"S+O<âbו,ܧT  Ȥ=.FFPLi%BofsMbkSۡX'xup@'"i]%.$FjP RщlQǒV-*Ph\d\~UΒev(/5/U "vs*D%Ɛ-C.HL) x2:ːi7Nvyn^YLe-ϐ٘)K ־miJB䆈 # Bդ'˯Z~/n& O-;}6G&זo2iD<֛.+"2ϱ 20iFД&ĦbK$ Ek+Pe2 x-vX DkXZ]P3& (NDoAFJE8h\$BXR[Om&gϐ,-292۳Xa?m$zG ,gΝ?zۇ|;|X96}@uY 83|\n_mX=qG~jFx(8'@Uk5,x'=t"T7鎶{md-F5vV ,hɪJ7ẔEDfmmO#U ]IT bzĩcu5NLݜD_R/[ʼO9K$ EDQu4̐-n_`禋tFˌ&7XcM Є[oĴosgTo%fc0w"+NB&TcvCç-?'lłIտ5'>fvΤԹaiNy`ÿ[]8f<=G%=M!!? MKwpKJwO+  /q1" q@R"C6uetQ"}wY{% 9'T*#1]CzNtD H`qoin7݅wY;.e&C"4 >TV'!% J Ud^GvIJPRKIJ$ET %:ՄRخ  iȌ@sA):`p aCC1"^m r)8 %Iv9@GOmWDĠcE=zk.2[iD/1!"|W헱u6mZYEH4DJDt@h.!KƘ*PˀP )OGZO$iɄn Q :P:P5%ފR4vFF M&2DK!Նij/kYNPB)EO:73t%<G>p!=LP9,t9v)Μ`,s6b5v&د~? >ə ;;Uк_ GvA\\{p7ؽ>ܼ/#6eíwYM |SCޟ_*mhk1`qADj<,0š9[3 @[ڬ!^Oi5gL2(1g%)0QSZ5'!:PdNSع47h_'rTMC"~SMeCЃe Tdֆc'Wwa48 h~~~7ӏmV FrW(ZdV5"t5ʹE dZdhGMܥDe"Y2BG[(S tq,&ȼOp;Hb6ϑ/-/0|~ E5QIPX!Q8)QE ݈݁` !@mE;o^xoAan!.bzk.2$&`Ô ҃/$Qi-BNJTD]u w%5' d0S6Xr)[2'6BR|+e>v{"%OD6CVVDR^Eg_byEQ:C`䃠4I!9-S[JdSb0oxy>OyxÛy{3vf:.o!W}ɼfok<פCsv0/\^>4?ۈgɦ=r9CYK=H:98 I&HKĂ40ȸD B$8 ^M8tU}/om7I󋋒  ǿ>oG~yPT!Bƶc$D) Aaj2#̽oC(CQ7Hgl`R BD! dTԌˊ}ゟ{7?1:r&bHkL* iRZINPZP)0R lKnz}3|b6cO"_9m/{eiU~m&a! ,t-{pan0` G3\ r;½5'\cZZᄍ,4‰{4JИ'B:uoa>Ӌn˞]յlSfGI%Eo'Nš];K(|.-Z[1S]F; 6K5lٽpZExa d4 Z%q}| Ba1' )lu}?yR`ax{ɚJ򓟹W4[ M\Jhq6`]v%,N+$v؜T4ސ3M2.HEJ4]??Unk.pGylƱݿ⛠t c=[Ǵ&`nn gDbpA\݆ 9o$v_U-pZ o;x(Ѹ>b*DNrH֮Uu@("b|?WVHC֘u5C*KBB!TMhu,Pm$SUj/pް{ d[7/EW*]C1Ol|!;ZDHD%V8Q Mw.|wY#XWL5h>,?3nwru({fR(c9Ƿ#_pp@Î+G\<(-o?-S8L Sf|48ۜ҉]GmLFnG::W7ؼɏ k_o>G+FavUĢĸ6t#2 w2ɽⱟ ǻx?FYHIREYZ (k |($HW,NcO:.`DMlĵYja[pk^:fOzc9m>Y 1>Ezv0gle [8ַ fTeKւ9|@C40Z0t|<&FxdN(TFEeMEQFJՀ@Jxq[ʢDip"#){1j23|eF`iyve- RmV(6BpTyE)Jv4Ztդ>d-2G TL>@KL^Thk~1 ?g-GtV5k_ٗHIwլof)8t/{ac_OkO0\ o| }|q7T9{.\+_1YG$lj=|~lySFSO9ڲ? X؆3bY 352aOܾ(| x x-aA C')f{h',=KS{XW\"k&lA6²wGs<^>}> n)+kss\114L]TYHٍI %NDIEYED֢ZV/K 8% i+*c+c> zҢAGFA L^7;O3 ^Y_M{"*9pw]g C,9bY XܟG~R7(1tF,^0b wڟc]/"!m @ {<ٝ %xꩂ6u?v^dOYB3 "q# M喻p՝|[<¿`y 9 ze*F1U(D.B㪀+<*v)0B"| P&`qZLdK6k☙}u3ms2 oۊmGt!1pnmG7Fd b si,3(FF53thF)Q^ ts#9" oe( 3keNUkxбyA$(P9l)vwca]z|[ḱw[2ԡMvRVkP)%Yb@N)(c% >Rb]ǝ=O%bf4FVMToLXcfiN?M޿칗nZWPta s7/”6RCK:pGaHdZpix,?pKa,lP'S `}@xGc!֩'*SO .v֚:%& \py/})&"ؖ5rOjjjM.W?aj0ϩO7MOS$&먁>5aZ0mt58PtD @ !S(O%#.b0lKA {H^bKc욶_D=\ƣ,o^뉞fQ$Da< 1rU};z[Qgr}7 2DUTB /bbP'*H]wWQ"\B W}mHW7ܼG?z+ mس!BߢIC⧹*ϑ+. UqY  dPƛڑ`bA"6hDxxG8<7׆IFb툵G Gvl"*F>'SE]ou{4|/hʹCxM5{\B0ySsxo rH(ҵJJZDazT!jI]sAOpo%y(tfŔ4O X 8>4σ:_ EQPOYtg-DP>t`(l`kާ[x3K|P{zsL_6arZҦlmf[ cOl;dH S䥢u0fQ"*Ĭn_ sŘ< +Gcu \ٿxzzO13^o8baQ2۬w~oc;)7Scx*Sy(e!_|Pۛ a][;}=~:e9d-*oʈaɧ?97%Ap r\F(LuDpu0`F2Ӭڜ]->Պ f) IDAT=ǎ7%Amayh=E/?@L>jb2KBt5lG{`'VF~2stN w<ŵ]IS7#TC~QXE%Bz$*+MLyvGm6(8q.ioDj&"¡E:]j.^:Wh4"HaZ%a t}ᾌ1^oAFsV+")2"!h|!REJrT $HPNAp$*O "Zh'pĕ$耯$^xN@DuC B\;Q'A(DXkVx >xTH%/r^8;&]:ȿ{}ΟzN݅sg8}$oO=ȻUl<ŏYZE.>wEå4k}ixJ}{S`+ج`K¯*yP.x5lRSâjr 8y R)j߯5 K@` &k*Zօ鑊i2 Ѩ Ɉ|;Azh4:qڍ6J{M(gS `f0&K^1пj%;kg6winzٽ/, Vp:.XsM+$)6tBQ9?eU|{ہ+]lP gmy*KvIUdg[\߿^[9mV<6$˂-q/1[ FF`4I%[fdJq8#XcI|NC|%3kQN("),:q2A {#. \Jᚓ6Q30FD;ӜĬV':k.𜸝Gf9up,{ᑠY-5;I*"E qImbFO]q77˩W >f5ǘ=ɜri2'Vβ~]*b1CH=c4!Bm Qgf\qDy`mDhlF$G&7Qa+B8p : ,5PU`kD-$Im^뛢qIR4QF! "'Q-942:)khG"kH΢øOȢ&@%$X)BN'UItA״#A Ue*PU|K]9zraM-pv]qp WꊇN|p圴B3yQfسܱ/ 8 by`'2LHD$% 0mj"CBp0DFbS5[ew8N8vs@;c-˫+왝HpXY0Ma8Se[iO-_Rӆx.q ^ ȈLlŠX1.AYTӍf{ϠW\:ϱA q =mSw'}:1f2EsHj>.Vj񭩾2"DLC&:Fd]2 ENsmC(e[K0jH4;pgDp*.Ҿg3(qpũIe(zeIeEk`G:O(Y*F1j%c|Ǒn7[<'57Lmy.(A!=tPF_g_)z>⡠$sh "MTXƮx,P)#j)$\o"P>VMhk T0l.E-)@>!IEOoT.oϴ茆3➤/qJtYt$46Onx!2qR]@)"E@*Iux42Pzc[W[R{R1ZK("UW ]}Di4Ȩ)cZBjH)-!' Hb]3?*^/ WZ@$EMQuZ""^lzSЮ,&mCHikJ[Y0+̀ ПХ)HG݈IH7$G~&?NEXl3l GlsoiHx0ځ"*A+Zx „# ' R ӂf6bp G 1^$:҃O1 \@F$T^ᾒ ^/cOjxGu<3'F Mh$t}Sqc&^'MڮmZJy ݝaH}~;yd_/^w#=Zmsq3c_83?65یhoe;5? ;Zw]ApB;3-ŹjYiʌI=50I7#kb1#?"3N22vd{eyy~M7ʡ[R+GV,0,y`f9zvv`8001aI-$+X:sӛgxnKpaקު7<{I4Q\%!fކVlXf#~utrF&[s)?,^vLb_>cQդ^Jj:h^>cq*2=dcηzU}Cz VO4u}p5*8v ^c6m72zvtCd$6=,&{DA`RNRD}=Et.zZũXI[)":*aqZA[uZ$2UnJWɤ\k]B c٦)gǃXthoCz@XR+(ۆXD]dJ~< v#:rlhe&zM撀[ZOF @X mkPY4Y"l6N?acIf,#1YPh-lg4vtQl!L*6&- 7己Ev^;JeF[8̰mUX4&Ry;r(e UYW/,\>L881~;ǘk9& vH0԰x l3 PlbBk6㥨w-,8iK!:hAFާHO9WF/Eʋ q(Rb.~1DZk*Zk'f36wL1R(,ۧ'Hf JslX&*lUcjdo.3D_(e(*H XI7( bZ)C taq{o[[ `u#/P8ƀ!tCؾ)aBi >MBh!+MCptB Mk(Y ;!Mk*$µ#7RH0o EAƚLqLz#+ d#B(ȩ* *졻-B*Aݼ% thSVk'-QA&Fډ=:Ѡf\F{jTNc#ݨQO(MALBL&7Z(J,FBZDQJ}beI:qlNqY~GrsKĚb"'&lVm5(w v^# k6ޢhL! XS>bg-8~PeDPb.& 1XZ=@qO%{[d'7b`̹w)؏B%79PA*ݞrTM])c3ڬbIP)mTInrM[U{ysD-`g|2]~A6 )pڊM!vH(,I*A)9Eb$ ]bmk{!g|&zI.fmGdO =#A73H"fFlc6 Aly$5Tc~蓿 \؈qECGFڒ(Pך(@*ү 'tIT%=,c}/T+Hb"B0bv+~* hU^;JZd )2IJ2=Z+C2ut-#{PsM'AFjX(5!cTJXH)JciIIkmc10T*7/+u;G2lPNےHll $@X!4]˴R \cTUfOGmm~<ȅBl6]!ȉLޔF3W&Sh#'2O/_ü||y25~/g9.mprs[x^9nju?|V<'MңJg6Vǒȣu9)[o7/]Y\*݃8*Idi+,diJ4fĎ@T{FʵPa%A Љ(D_x +H;CF%PNU_$SyԸ;$Y؞q r>tzH[cxm3,cR|A`G>Ssr0xKXh[bHh%QFa b Ρ4"ШCLGXh$Hk@C$I-pl=}P=PRPe) IDATZ(x(-MW8ko[HvF LC/+El4V RFJ7bbж. !*o~i"p=4N7Q, A2(a)cNĉkIbjIs\LA4RӅ~DM kU'7(5Q/6lm"J#7vmj&#LFplh\{`C;X_ *iFD譛]oU" 21$b*E+ jICMd IB+Fg:Nѳ#vv H5OKMZ{1 b5Lq=a5z#i1M !&Ae ;olt~wp :Y߶ݵG2lOΑ.7n|)Anb#*l?R$ ^b*JVfʺ '$奘H:l&}⾢"va7('JrqB穯Нz{Xnpam*l8*1J a(jIBѧj8a"ݠDH?ıH[ tԡ뷍.V($t-$\pЎHM>ƨ`3Az |J" #@ߞ\+}Tq=" iɪ%A B`doj[ 0b8W bkn I,.F譔XXbgB``Kfz4~i|y8!/?{aWFxSu,_+qƳYi7 /pr4S^3h4=B,6|~_+?uΧK4+eOpkIs_>,#-oCq(#\<-$!8 JhGώ5 n!hzDw V$h@pۧaZ8Zck3WpΗ/G'_A :K4;p0Z7Q]x"RHR(aOF诅D)xz% `!fA(Q5@v.;x>hlMG!'Y!0m#d.&-@@TƐ* :cG 0 }a[0.sq/i7Me B!O 3|o|,]bkZ ҦHL{`c5EXPex[VӭJ"'3E 8|L 5ll"Lccf1dr0BEF86h ͹5_W[f}Z$9Mc-b2Il̀($Ew;I8I[Ջĵ U:oVays\s91K1Znʉ yRb51kdh qgfDMС\لEp!4qP݁\d[Dlp\7D㚫g4u2KooȎ䅶E* h4<^3"6.ь HuO-Z_p/YLhBJvřl(H%bVl=!Dy4Uw\`'avp˦@WN3?ʮ-oe1w9;: ˍŅ1FZ[Љ;0%'EvCN]!*ލ4 cpoQD,Km"j C-Dl%˝\ EՄVtrf2&U~*Ib(av˦mS/Nq&ct7 #z}ѥ~[(Н+0MaYVJ 26RK^&)c撂xͦT/by=M['niڧ{\۰ -B>?*U^~(2do3q6R"ZHC`)IV+:*d\hwJcez:EE*_\jIw۸vOPBۂH#,{Fݻ,%-TDLѥY+"KyC؉ N4B]larb !. aKALBZ %ЩZ[x !lK2u-ܥe9QHIg" |s+; rM^@̙>XJ{'QNcAƕRߏ#qJ4%,2v&?Gkw^~:l0ȅL-1˹rpp?lp0[Џw탙QKᅯA269 7p^ VJ?  j,%  `, pߺ~7%KHoCa ~a L94Erval+pEw2؄H8w`W`)|&.6$QM:u$m s-IbGﺱGduyze SFl~Va4Hw[ٕjc 'ĉj7,o [en6ž51 nxV!i9\ڡzObKhȯcx|#-R8ыz8G,qYr~ >aF>IG&鸈7I'"T$87mwmkH[u/G˼V[ǥ- MYؾd< y$]MGkj: W&sbdf ݻBxm%DkG:X0+XhH!hǜ?Ji2N #]iJYR[yRO}lGkd-MIcvPz;ݢ XcAzNbmMz(8=yG2T<qpr;dIȎ.;wC{O TTʡ3<3Ľ.NZoyiˡltJ]o,B-p\Rd-Iw0X_'j=='I<IifCApb;M\uCCPX.8&X6JD. XJiYŒ6)WZibe""!,6SOZae^􎽤S 66=ͩgl0³z78zYʲ D??}O|{1 g: l3.d'YZ(c=)_ } ?cvҤl{.a?? "u5<XL,lÍZ ^j `@o MtKp!?jǿ_}<6^Ze_G? Am1WQGml:V~>9n0rm|ecg4ٻزi^bA¥ G\kRuý=}s KH2+yrݛ딋]2Ķe^* r{RQPJ0^HPȁmHFgb`NCp3}˰",;Ǯ-|&˯<~QN3x8lXX5o$z$fzci', o!S)X9 i2k>WK.S?-pd:`2H zg,:r^35@$:9ı2tL>/i&iMB%mTPBQWApWzNPNSv;_R(֨]I#]^xF#edJ]ow.aXbb)dx Ej ?@B7(L+,7M4n^1Crz|ȝ_{[%1ZXe"jRi4b$bZhKXc/mDL%[ @cCCh,2U*2mf -AZrv+tghፓ]Lm݂$bh6o44;W6bisB(2/>\al`qW?;͵l`\ܱK fS# _sM230#&W $BL*&j=;Ͷ俤y,r+ WuBǃ/۲&G(AgaN@7Kͤ暹bF*ptې5#6>t pHaa?3Ck27*~7%vx0 \ڄeDhs?҅ճpU~x,{) Ѩ>1طcB‚Ngm[atnb||*;W>d=UZ]j|WV%C˒؜H֢RVrq{ _djCdOVZ9:Ǚu:̴C{6Ws'H\!\+=Xq14QB&="%QsZ1;gؿl.rpl-~j7^S{CN(O}I|uLk|@O?W=Qުس'&R(am;"4*2"NƢ5?ũ%{pJzH/vr9_z w}3EgCZpxeøݢY[s՞ '-ْ;@T4*_->׾gOg(:L{9~QVS)~H#1/1Un .lWK3[_)gT_} Y5wwxu&#\_g[ԕ*_6/L`X4@ @H4Va,`i) !IC|?Cr]0Y(vl7A{ O5ÏZ`O|^2CTk*<8\}To/@:d RkppAw|4vτJp<@ Yp 0а^ {OX8 Uؿ f puX-C}󻿶OӠU;xR+$]_a%{vJQ}@4=0''|nIrUn@v*^\$Fo <ï in$xV j78tiE~&C]pNG츱Ofm},KP^BBJq}7z` Msn[z2LEX{7}F۰wҥ19Xltl/ д!#IA} ȖBp; IDATE1x D@d9&w]`.CڡR\}CX^N+?+d3=?Mq=" Aa_/3?ԉ3[%_ #V?L_LWH8,;0zͼBoPgrnq_O0aErisZĖiR=*zcf,cQ ԕp?pMLZb[eF9{g^G8x"l291g7;hϓ"Hp0~QSrlfC>{n4B_HxJ#-FE  ,B7?+;B ?=kলcmG|W/ ៝̑:jzHƱhd6"^+&"0Kkiɸ69QvPْ_]IrV>'ŗ^8k *p%ʼn%r.7Њ$NEqえ-fB}24^~OM:74=2΍R\>9u겨reD2rv#y3:h*=9pAˇ1X߀oAۆ 6SH F rA"z+h~ 큓V 'ÃYڗ> w)M~VY*QpaVؘBЃg̸&vmTI*8фy,U8:\w?/,pOR]?HPitdI˔xL^.%f]]Ƅb|%L2!kG:^=RADug2|é$z >(0tҡjDf${|ZW=:Tߨe9bD@͉?qM-7mײ<@]cnrgG=NfDvas࣒;FdD_NƳc;j(Ecf{#n ي|)y$ jZ1ٵ4XxC7!8'憡['K-v2M<H%STKXgIFa^6mT*D-ic}Z&Lֶ5~㕳-9N2æQy /d2sʞ],v9),^fh_Cd'+I*ɦjx"Rȁp#\iXݘ-)QRvZ ЇXW`EhShJ}QL` B(kއ(bɧN\ k8%D}dM{}.$ш"K1Υ.5Em.ؑMb*dvW\/IvGS[rsxy)&tj®$y3Gl:(Yom0:G(pm#mތz!`Ɨdxq {E}M 9D6..<͙%y.l!s|JAޙ䖫۷UdGbDTUϑkmM^X/ɞxNS!:A$E*8PF;c1rO<MZLw2b>uyyO]F66QhrkJXtQG㦴EqXSYxugV#o-;t]S a Vr#?<#<<wg~~!}L6#U̿Q K?B*zO?8J OaD$7~=c&'u;yN]RܨB4 !ЛB8rUX5{ƍJ{4A|cCry+\ЏP; !JsZAuEcÖ`}8XXM0ֈ F<(M}XrޢLp8pOfb7A:ZuIcL N(pk?dkūԣai$d&ҥQ&e-=8\P;&yȎ: b{K?y\Wy9ګz_VkmKml1K 6:!@$N$IN d!؎ eɶeɖ,k_z߫s~TyyF$駫oݺUoխ:}'gq6zx,оX{Ŗ] UN$:[*bRr88ͦx(9YZ^ᏧTHVRs]5ڏK G)7^IԥZ)fl"[vv^L}xK[S01ޡyP?l1|4EE eMJ /H$)JJ}! eטt=6MtT(`E XipMXu$wsymg%2GkYdͰFкUY'7#Μw=_ƍdL,])Z# V͓8XAHr>GQ%KU,MlTm"S1&f1AoG7L%!kBbYTyqQ` '`poOj-X\eN{Ē R?n07!hZ:3{edpF+<<%nf}tk'5Ǟ0szcOq|Eo ަl;F2HcͧP6CھaabqRགwx(t~zIVQN kpi|ùIF.le%4]ȚŪeL|_coA})y]O Uლ~E=pg! 0 he!H|̌<]OZ$oaknzI'~k;%9Csf})_fCr!{%S~׼cގ q[hnèsum#,K-tD)͆צx>{ w5\vK#ћ||.cRx'aqk.BM&]"Ra1`źXa e%^)L&&X7@Ʋ)%}{ϧ#:nI𣚘[YpGQJx`ud L*g0v$V X-7qM]+.1 OD}C&0LŠOApͰlkBD.:ECɁ&)Q oQGP"D$ R@8_-8:gs&U.Hp|EJ#*Ñ.A0:|XCfH&FKA4a[^aBm T3M< $=@Epi@kӑd%'4eNLupA{4;XG{WZ<^𩵥8=j'ݭv3Qoadv&{_k}ZN?Ȣ4£O56ra}m4q,ڂ-{z+ZkmyMSMx}:RP0cz8O 26H w}Y:gelx$K;cZAd$+jpbEms,p2SRYz%ƞs N_\@ Ǟ_ʦ)zn^\to$V\>|Mi.T~ʶ2n^;CP8$n~v#tEmN#li:?-~e l8*iL5+sulWtUOeE"5[xʍQVHڰ;̞/"%Hw43a,OyV?{-t<ϱ^G蘩p8F6M<'5q!h6A~ { i'$ i42h؍R #}sIE`j9F,tu|Vn$w#"G $oGKrKUJq57_BjEHEWLSa;D")Xme֦%PDC(޶CoV tllli"W M]e]y(M2O6X>ZD,nQnfQً*nUcXKQ)&~t7y=UbM#7Gmlc::s919A%ߙ`g{tUiu~~B][e󆓜x0˩PslunZYds"ʙ>| 2eDU9Xte9^+OZXw.:Yue\vщ:6mfvqvV&[4[.ގu2; o#'KM~";R`?X #5N'|6Xi73\E,|-F9QFAKo?wpq/n$ީMj361Հ)smDٔE&-ƨ.Th RR꟣il3^2e+XVxNj-{6&"(c<}AejJOZވOZ/wuQ1Th&XꩃDpXcet VbD:޶CZ9D}c[C=(JVxWnK+A*`D!Vt٬OS .2ZeS]E==\CvIFhlu]nS r%*M\@SE[1]p81CGOO]pT$ 0.v}TĬ߁t=ϗWdD-A.Vxbs6qKI);+X+YT߳hK Z#dCŪWY$+I$%RJ$FW+1[/5le;$lTҺQ'S F>̎Εl(A2a:. ]ǖtKq1\RPb1IǐkV '1tE5M=xV@^*5KU &h21-BX%Q ʶ{ GF8a||4m2 w:+9|(D45w9|TS1` 9<= Ύ9Vd@.fR¨ Rs (V)EQ G *Ha:"zyl8:`'w'l~UW7EX2zz&,8™ 3T{L':9? ,ۙ3uxYxg5Xf>?~M PsxldƚaxGȣ?Y:M|!ͬ3|buTzL=ˉ/<EʅlQ:fP|"D$7\]wʥxnqi(ȶm6&ӪjMZD0T%H:ÁZf ?nC^q!"* Z $jJm$4 $( `@ P01Qn`B @؍ݖY:!PX4 arZH )0R,ݽAcD i#4:_hB! y&ݜf05{ Xy=xI7SXEe‚{V!Gaf mveCl^K6wޮ6Udk֡Xb|r7?Htf/ŦeERvfc gҵ,)2:&S9T;_ۋ(]2O9B:3ytR !:C$8Cw֥uBe&[>=ar!=Eb1Lz)y|aWYA">8Bu `OƁڌMKaLKu, ^u8~qv{o&hU8UkI~x]oі,18тYrV43VBp ۾@gcT3ooyk̦Z 1IFzoDLq$]BO1NqpYG+Oc[$fy@28"̪4Ϩ9DǸddj F5;gHDITss;<\$㽤z_XVe 0K9x4g<,g,*5g$V4U`#>ڒ'JMk1}E[8O>FSi\Y+AZy3HEO] y0(pui\ 32T+jQt&č!be$iAےD4~y|C_@f`[~?| |(հO2#a.$,NgPDQⷊ?c!$DQ<~#<."h_S1^gf[\mcC4jEwb 8{;m~gⴁۇB?^qqw/ps\翨K. +^RjXyٯ e޿XR,Ø_Vx]!~z&YSBċ/. ^zg~,o>fieZ^v##-:Oߞl羽 Ycߐ_;G"d1ŏi]Giiy=^ů~'-ȻHw/kְאy;lcvsS_7%|vNnc|]]yȎ y|!"9;}35ic]izn|ޅ!J}ծ؟g|;`w/O}p$Sn[Mʴ@iLIU6MQ@ĩh+jkMǸhRQT]OP47,G$$o|PZ!s FU8D[i#5% ܺI21]8Hb?QBģS<ϲ2ݺg֗bj&}ȓٱU lewwpŽrU,o8D43כ`6|HxGs 65̸/ZNjԼ}ΒQ*Y U A62b#qbdڻi/r8()c!NPLNGJ4BqNk$u#>b!H=zYMov,rOd-jr?kHufG*"(<m8`|X4Fr $r8_:޷FuԐ:vQ .bCDӘ%0ˢS7)s|ŏO+v}X EG"?9rUD+ݝS,QR @x1$[ìN7nB^q19YYny"rfr-mv9l cxlP]2)G`7vGR|Mn|l*zFԏJnsy E~E_`t\ N-Z0sLчwCAÐthm]CV=]$|[E~/ZPm%|㫤3O~WFpUaN[8\sn6ԛӬomd'O=JN}c'7>ɧO;p걯pVR^W%#iʿc6G@e;_> wQ#_A 2Z {5z.3ګ8j@=-F{wc[ϐlR~Xw8j8?AR| L7' pzбR‰ #!٦[8ԁgi{b9 ދx,c]G+? n9 ?8)]¤ S*O/pf1M=Z*3С2Lc!Qژ"wdX5vNWWչ1౒ox˛=YK3Zq)2=lsY;Wzd >2wDҜҽ82E{ rY֤[ߴJqCrt5i8t)Xn'(Yq2iV9yw.M4cg" &,ku5N.wvO /{G~tEVv1 F@!DzhHl4FЃ[^L ),|݇#chsR[81H-81J&̭F6* aPVX8[,lw];xjC`X˯1(F`bH[J~\* ?.>K 5>  _|؎}㱍|Gx?o`l Q&> \3,+x‡y ̧_|i,ІG|I}a09/ =qw+o#2R^æ5u~;8O\xlk>(['m Ӕ~^F%З`.e_81ŖQݚ'>#!4Lݥ9-wwa *;nQwAy#g5R%; i&T,H%~||(ꓤ՘4}q8@v,ή>,ܱWt+leo .'~Er,;NO-DJ]_d;/ =5OvzY<͆c|"MǷ~Z_rNf]dmqc$5<$z$2s 15*2QݴxZKqz#s<ے)\"ϛ}7 6U:e.>p,զ(ԺSb"Li(+{(=MI:%fNTko'97ʛVq˞ ~e<<| W"(E{j։4s<4 D$0㉘ Any霌G'"A|%AX!H(aO6/L64`l%BH$~cXJ\Q6u 5 (/mE`h Dh`UWFPŭW)-RR&&R<て+!AJHu FhPw 1(bsAD, FTj 6(PjtGU%D<)d\!mtHHݖŽG)1 RU41.P/+ _uWwA*2ˮ?vM K˘τ====۪[G- >Bw2[w]/w BP( Bs"L2BP( B9&P( BP P( BP(tNIF( BP(:$# BP( Sa BP( Ω0BP( BTdBP( Bs*L2BP( B9eʟv=== BWdg~6 /^Qq؉v]qɕg؞؞؞؞^m(%C? c{ c{ c{ c P( BP(tNIF( BP(:$# BP( Sa BP( Ω0BP( BTdBP( Bs*L2BP( B9&P( BP P( BP(tNIF( BP(:W`nt )m,ۦ9*Iߣ;,=B=J&NcO4x-k6+Q XPҾ@  Հz5B,Rp-RMT++ B߃ZܨDxؘ(p$ZH#Q`ML{DM2Œ>cKZ"-{ѱ*,֚J jv,|FJ16)KJaF\4$c-,8w}؏ n;-q$c$ $VS5hZs5DZPAz6aPE\&6hېH"(C67Ǻ72տg{|c?Ek%XKHA-XB1%$B)i эc[ߠQ( FADRh82@FE4"^@'ba|EPӚc)A X8`k$I$  SH&b K"i4-,, ~{Θ}qfKx56tѐS SI+JZ!j6E+y1Cs;{΢~#}S(`:b, QZb,6c '7&D?,Ȳ:s9kzn@EJh"A):,l:h/v0l:ZE )aC ZA "`@4詺>7 /yuVNd$:|aK )#*agX73m29UpV͔lo3r7 ?;`F'(e  'eFfIq/QPg~n:P5(k Lr=or k@G1GBQaWO0?6+|LD:'yOe4 gĕ> YA MV2h@fFYF !H5^;,;D:|˜2 S!4Γ0rLH  T,tAi qbs{fM$ԡb8Sr%fR MI#)SLQ<(7DSLM* ф\1Q a5\zhl' a2… cb3񆉔$ bH)3cgY'1\nA"H`e+lZ40f ΃5]9Df#"Zhɮ¢"2n+8Ĵc-`/JVWµ*8СIKVjod8Z4*!l6ǩ0`Vw{ܜ]hsN2݂kqZcmPm>9ՈNaX@ZYKD f7x2$fJ.L'lW6 A%4aAi:)P_A n6D &nY3n!c-h޳> k8*|MT]̹z}µ_ob^$1UhjpH`|Mnsm?=bqk;Jlh H$mNuVkc*t,Rbo_4%@<[uMFqs!UR6v\JX&2h~#6$%O聥.DzXTx+xs0DJ< h@{R2us3a !O3%5T;G x_^L!0 쀈9qFԑɨw 1 y2bl-WgW- ΓŰΡd jZx IDAT"Fc:fiarB3×mC*+='0Cy Es5rB(jB%dò`1G` )\3̬L\ 1gL #%ljZB%=h.ʲc zsGHB, aPHOLpK6qZuP[XDgsÃ9Uu=qG^51kmѺ$ّ|y'w;H ^98$EpthICȝ:]$Du+$# 8sl S O {yr Qy#p Â3PgWPW s%pD AL}a;큹 %"gxSHON3 u5!$ Fֲ  ].#7 iOxCB0pzAZlVÙaK<.=w%i݇P#a<:+CfΗ3J8Qu\gHD* g % be ,V8wZOe'FB0=MX|&gw+j)&EXmHVڴ Mq8j8 vA{fQѤ!1v@2L*8'mT,zϞw4!y(UhuAWThAj.t jH^#Ĕɬ< lIJ=jA3d> hM0X!eAN3N,rq&lme;3ñsCgup8Vrqo*N.lgn^8^/ChNaupu~o 35WpCC.{.V6D(Q,q.'% SHԵG Y)v8/Q[UXo<ތq \g̎ɡSx B#I, STQË%^9+$Q+u]7tٕ]R)9e*UょԹW-æa8Xfk W/UvJn 2SXP3s8װެb-v2'y8}|*Vqn# "x# }ؾ(k 6ZQtd+U4"}WJZ̳:XC(dp*eU))s8 akJHn QSX!K` *hHKF_X* E|Bz@u-YLG즿_gAa~n3 b[.h jDw\("^=,xM1%,)sP9,([8߃A +$sfx#Xu$  =Lh *2\@sFpWTBȊ%$X({uZS2whQS9pÇKs Tj*xV-QQȭ^RM.P]6caOH6G]k} ΄"*@_^9w 1c9 ;R$$pD|Ŭi?3"wR֝YQ8'K5e)q"Ur oAhѲv{ȍЋJUJ4oJ!H!^$2GES @C,nDV Brվs۷M2LG=*%|+q:Ն[CS^|׍|LvoIҚ[↗?8Bq%0s?C5xko[ڝ䍏rOѱg8oQػw~?!-X56@~o}һhCX g>yÆUƥsg&L^tUǠs̽>SRE*b 󨤘9\!xߜpj8bLv7/ 4\ ϴsW&0olBu6:[[_Ϯ\֍9.?ӌIV='?7ѯ| K)ڽc}dU2=($jуrC#HEW<7M A+ H<]̺xExE gHGFAmQV'=VK 0Cौe#?IM4.ҵp8uģTFv[U ꚦnO5:έ/niVgM모>H0^{tﺽ٨Gwct$̹͖Q\}D]nj6c˸z-QR)2oL4kVYUDqB%iV2#L qN}6%9U*I }0ܰQzEO&z+GWGpK gd,Up; DlQ%h,KőWKk;KbGL{Pgl UDȖr!Ljrɨe.%b+%1A4>P!]&k&YqQ2S;}`I wM$㻢 ȁaV9HJQ(Bi1zGU+-Z*f+v/Ff'׍/1V4:*ut+}‰{n`ޜ3KľWk%G!a~bwR U@9v>t~BW0;B!=p? &9"P]J%.ei3 ,bwAה߻1:""VβB\ߧ*KF{aZZگqoٔjomQjCUpQpb<+ΘMxE#v{ʍqulV$;&o|y.Ynz<Cnܤ ss8:o\$'j>VbY9vH+;I%HZo%.M3+Q|Ϫ$~ FUH<"ʢSmG^=hwT }9Oģ9KxȅLXRG-RUTXLGArHpp,,X,Ҕ" ATTuyfVLqHY+*mYVA5vy9::R9(<[~,͆ ~-ULq3n MlT2A7 Y( ;1 fE2d-|HZ"ٔX#5Y!E1vS#tawC\AwR, -C\Y򜻴҄H΢ET)n)|,|I4PIVy9_z7|Tςh&$'h3H_"˕3OSiYQ3󽽧ErD,`430C`$+V%ם-d>[r9ZuGZxHF-hz8VDQ2ؕp.(U\ՕCc}p2=}ҁ((hjeGhl,T1 E/߳n抅͊Ӓ$Pxe˹$GΕ~VoGyg屏 ˙s=/&;{;ryzm}_H< -.E3oL&U[9zl9~=F{[.el@p"匴ϖ [[;}$j uXF׎W.>g/1y  } 9NCI->1vck֔=%lܘf~r{}?V_%'opq<7ب 6*,NHX-63Af /q/#?0}=jO0<>ϟbыLdjCRT$H1o' k`} 'ی^gާ9vv͑-2'6i_:v-؜(Wf yܼdn1ef̽prc;gܚy_ئ\!^zrpQ|=q}hi% GqJl%Zs HJOijLȩR;Pq%9=AK(3%2+a CcGW=ŢGAGDžVa.Ƅb)pRI39)%lf+nC}]<MĨ>"R1#Yo6=UFm:Xy†e\Bz_߮ﺬtg"2<+cl?YIwsqʸ( $V#oۈϘzء'+jd|F-) :u+%B-K!{Gv*;)= Y*ZE?qPܱyPnv v|DdDD[Σ"tbT˸2b#e!NzT^i. r Q|EȖI8Rx$JJ #dR5P2VlB}CbnPy.5A J":#vJ#3\u̬!QВb{G g/jJߪ >9ŇHK7-m>Bh}+5`uK_lOH'^ ~ s,?<'k|ّ8zӷ$,҉Zw:$RYS]OFq9"`zKw-w31Xҏ,T[:`B)"%y;,%0Ϸ-ߏ8uxվsڷM2)م^d`2+NP ZUNt-r7O;N~co:O̹%~ku^ܠM>!p7lkǼ1^{k43oƌ޾P1V>~TV!@#|p{[{鏰t ~xST3sIvVe;ȯ 8)vfuP6g5ڧko`.}cʭi$4[ZqDCK3Fd4p53c˴Y45tX X}Mx6cN88e1Mjo^6a<[zؖTSmFKb%>@pTb:"}ѫ[;}եjGJK (nk[iNxu^m}nu 564ujh7GOќW' 퇹tӛ~dmB<]|o\/~_@GF\j5?b8Wi*ϵou\nsr<LeBx^qδ팸蘷$\[T*iA]Bty:՗9Nƌql Gh8{|_<eNy~C=p߻yI5XZjynWիV9C?ʇ~1+_`cv1'H Rƀ"{7:sfhkFS>_q*&n$?N[d~ԇ٧ߎWazYƧghßBg9{ }Awf^xW8VnnsFa.ck{l*+z'_=G۾D78?8lRgn|܈g&V}}=Ց:^P;R$H/NQY[A <@ϒ:n)8ڱ W?MC} {-GYlugy.k̸G]c:J|i{7`J h0$.s~bWCRUkR2W6 uLJ8Xs :2l`':,&yQဃSjʬE[1LطH&qYȀ_g-;VqLܔJ@/vSpDr q^asQ#nNkPH u; 48@\)ԑ.ӶX)5*R9ώ#bCR-"19 AY[]+Rc9u<(;Ge!PY"&# ga R,S>. [wG%<&eRu(epB e4Wr%I`T8ź_Ag-,™ػ78X **< x_XfowKQ7׫J,%r哔1ʾ %HVjȉ>WerNzOG5زm-ΔKႷ[;}v)(rW3.lm^ | F`o>=TO~~I=%o|Wt&7!|:Cn285+@3uμ*l~Ý1[[zFo.EFÆzc6:Lu .ٺ n2>dojFh>aM fmT]]v_ro)}`m}Γ`ª]&`ԃj**D IDATaұ3?$vS.p `9aA7 +Dj:fj"ϴ?֪Q3'~zCyV3Cw=nsCϳk NڂYhs} ~@?yWHc f\X;gW~_}?{ >?;/Wx0_T~J:/tlL=?>nۿ5ΝeC7?CM"C<XtP].nWdꡒ@cB%f|qe7[<~7n!=xZ_nN aws o;m! ՗[g=zv )x˄ ^lrl>s8_K{0%OZ;7q"yWpdLWvqNUŌ&<>ػu.]w|.'t{u8sb/Ie/z%៯Y9V*7}gtin9yNf# `͎1cic8o *d E'\{3ֹ7I_ ƀUn4S_]#L}CCm>{1s쾼@$%OoRQ6~[BjEQMd!ȉܰmsڭ"4Ά gp,L3!8b V \lI.bHf]3 9k0!^#U)?0|סBGȊC`T*M8ps&3{svۻ{.떼QqxyvVaJ=va?jK5Z) <5m)QyC/X1*F.MÚjAX0BF0ϐFH*Mdtg( *wo`:k:PeK3CEZy7c՝9PWfC >9r>j.d+9bŢj.—Hɯ0uxPSRJ*90)=*ede}u~skw۰IǢ3y[7g՗J} O).IW/aAKH(B2T++F5` qz{c4ek8neiTς+7e#"zR}B,+g 䭄h`}ӈ #b5jom 攠R\}e-^Fҗ`3S\?b6YvjH\~@Ƕ_曋aFuk/~k_>asc'CVDva7$v૫یdƄJcH\9H9Twn>^xJ.3V!Cd%K2f ]rpk_Wq!k澷=M_gXll2dŜ)oXٝv̆hL5'qleq2ed]l,҄Hq=c[۲b3Ct5VcAwo-.XnQI˦q3U8c/_d`f_g o/W3\=E y/$AM|=V=6\+;J ?tʿ{ݗo"ܤ:yy'<3A~|80QS.9ad {*3I)d--bU&'VrXP7| N]ڂ>xVǓWy|@tX_[c{۸٫$;M =cp&F~y^Ip2>u<ٕHzhJviWc 7IXZ0~5…qn_bfԃ-έ +7+ ?<4̏f9~/*O3+eHyAl<.vuNp/G)ֽsZ}Q_cqy s/Dۼt8\SQ9S vp_zkVq̙rbxP]lǗɳήq|ùw+@>2[mAr6ωŐ.`.P.f1{D=(SHBdT"%G@XlujaҬhF!j\"ZAő!lQߠʉ^q5)Q!-[UBE d\T)_8/է4g$JZ])bB&PuTIZӟ}1#QB Q%9Opg]`Ɋ"n*)/\t*'$^XpdxVpu³Vlf=臨#͙\&&2h_cD~Wʍ]V SZ$*bAjӌhIeT|0!K(UEGaU3?{Nޯ}z3`lHI"HL1%xGmq!^b%MAUwOʠsⰆUFy8g<=c')FlU""6"u)SC$Ԫ58 *(-y ]'<{k, Ec@<}V}Dq >Y3zV63{˳\zhzG.ŔQߘm.^eEo_S'9m|esH]06'ф"D S<1j2;dY/b\f㉢.+t2d=sOxFYl_ѝ6`ʹjP'LA!QoGwY߼BDM8{ai>j>ȾZi.vqgM}lVbz^f>v^QD=Tie? ,eˌ.eR~|/|=Բ>o;G@Qeӭm-3[18@y; ^޽S ɏ{f=7'h5S>ÏR7I^-nбKQwr8N=o.IImmׇEe&x$L(ES%A<ռ]L~R`B}OE$eB<5ac0DYlnt یFa 3f BC&+iT+RX$MS``dFB`\/Sd: Q1" :*aʴ&hԑIT5F|Ezu֕,U]|"^B@ -HԨPN"lnKP K[OG@3lx;HIOf3NcM'N򓤧 cr/&g*XW2җ@Jɋ`W9&a%C.b߾=?ΙmCZl=h Hx.\;Lu7z +GV"]`kF D01258 G1(w;b2-oR>Sq vwpFsx4:QvkEX( ΅( CD\BGBa  AI Bc=6 A!07UoPwò0$k;M.DHXT'\x1#GC]ꙷWNxbڷ ֦!X{`z]ReΜ+c7**/k.ww-9էe?vp3"к+G/indklΰ:g`ZDչ2YH2TI r=\<~k]v' )Os!n0~bll R;'z3ǟ"ˉWM'+Qs s6#6*0 Zp@1hVxH|t!{MSeopN!\7X°&<{|({8ċ~tzlŋ|}oָo4dm bly(<Ò^%44F{ҿ XZ))ڗzԮ ɛJB8E`y6RA|K3fO!:Jrc<%"`x"p._`䲐(E?٩tmMd oz]tGv3@jHM2;Dsvyew$b$|ZgH,}.>8Cx}h~ZXZFzӾ7eDrL`O,BrVӊ3d5@׷ C0[uƕ>nn9عquozIzh2Wa[˥$g%5,^x]GgVvf ߝZ|l_b" M[1d?f5ĉ_w)F4x ʀeN (p(ˑP?l(/ueALpcJٞw8UZ.䕄-4jl1XeXKtV2|h,%;ZSB ertcHV(hU`@8m5i5$?fv R;>ݏb~c^i.^8$ICz#XbQvs/,8^dJHCQD.T 2]N ̭L W6RHВ=3-SXӾ yᩗq>c7ZKar5h ˠ"'cC*;1rO "w)fLCS 1']oR}oJi+OKw3ehRiQTQ3uEyA|S\ Ď%C%T/Ѭ.2ӂ+#vND29ͱCO)^.=/lG9;M!z+ZߠsaX ^bA.]_]M? ͅ$Fi3q E( j[pSe@ohP3' ")p\ro  PaUC5 Ba G^䘢ZqPo1cNǾCD+&ĘWewK|fXfup?*,r?y [}S}Ⴧ:,3UϨWeHK%l cqv:8Cf i5 wQl/[-y6ybפ5JtB⣀M:+TiWы~Njn\3+Tc'csjk[\Qxʭxbo˺U7fo}yQF,#|??63fW:_{aO:2~tDixpّ#I bPpvp1_.1?',&IE#n ;x^I=i(iɌ:Ip8Q5;/P X_nМ(9$ʩ Qo'gD c, /PY1ӹ͍W̸. $AABT*-"A#Df[mҡM^B4'p(cY>%!ZeShYbb7,oJ`%{/} _Ex)/? ݄+O3e}"}"# qJ(Rr|y$=N@üga^ٗr=x[΁e)@FJs{пP5DK^Wyl¾Yv]?8}7aB[L@BrD+g٦7Z%,+# !l"gGO]d<8We@̕53yN0VTrj/)a0XDNSi=ҝZ z( "[qCКBàC.WDMΰGen~&CgKbu cw68{k`cs'[|ÿȑM2EdTi UQaq"R{Ba9b0 ;p<̷#M-J9_gD(ĒHKܓ2aQ})pǥd a*<`*d%WT#y.>κ3=bG {pl}|O{6$M7ٲ{O?5!P%IU^N7f&[=ץ3pJbHpoz.Q׎d k"0z!8?BQQ^̸W![FZϸFe*Ln. *l"ğ"O08=J]aPk~O {0`tTզ'8י'vm;n iH{w qۿ v.~ye5ʨ$WnpY,Xϰ跟'{eDon"0a9DlщpM%l68]cUiʃs W 9 &PLz 5%jٿR@N|sr"/oыK H7q}++zؔi IDATQY A4TZKB*IJ*U "1RbrqVP`Eyp.Ǚ K6k,.7bm 8E2E\" #UC0W; bLR|\y-)'|;-bNb:d)܉^gZY((w3N#0A7jɖ04009R +z~0n2(Gy,Ni:b~Cկɋlw*EZ?#yha7w< gZ*SB ofZUmy\tO@ePBIW!2BΟ!adi6Qx'r, hL@և!]̹˯-n37?Kf3`Ҕ5V.^ŵvwXXgxȾ^6/_ M \SGR%GZ#@ٿgw{?m Q0(!e@T "+EppVmbr:rJ'(Cq-LO \}N0fÜ'y7+=6~;c^ְ;yS <[*㨂XI/x XC!U@'PcAQlxTfvŃCA|`v?}| u o|wH1M]p6clUMIvNl>uںhszVpx^ػN0w&1ء +IƉp,p}# {Zi n#Hs mafR`aKIR/Y6/<;E%X7h$MӍܠjvD8f1J'|sgd | 9C_R>pٸʃlvՃL7( #C\e.R;)~E)9Cl3vאI8˳ O9KT.RG?Z9<91|OQ죔,>—we-([GM_-KUPb"`)7rWdXP'4AK[79FzɀhT#fv**+3q@i0D^ R:#4ZH\)%yAdg ;/6ǘ!pI'v9E>"/RQg,֌q&UIXOMhcl^ .㝅[@)sBN%9Γ9.=ޕ7Q6ZQ֒> %41󎺒p$`E1 q(_*£91iBy|~[@sC*ZSMˉxCCX8̥!囜x| m91`#wGu^Ѹéӧy굯RhwDЍ.A(Ir:;!ɛUҗdxA##5EPKH%-+$yxIrZ'<' e3(ˉdxBˉeTcȷ()PBߤ,OUxAl3:f a]Lgt;6 _&XGV0)QR{ 1GHap"2(ʹy*#x ¡"J|(` ˆaOnhRf# Qkع).8^~Dc&BeZ&GEf7e3ʇx܀ w9MjewkΡ(avjw,|(Bp%Q[9$-[rU(c`2t9!(bSr̂[4<-Gv,C~fK- ^LV@Qv7M99b5\ER1Y{d gwms#M[lz01ȷ60 #tgDk K33TvO#;=\H5ST6̳,UJ%9\P|"I*_[fɢ.qx,Zi=$=$!D>{j)Yprqw\bIwOկG:>~W-XF xiY:OWq}+6! ?vٰZ80xdkYYn=sV=`` OD|;~-V* SSEUJ"e]<8)lLpA)1H^5N6BQ{;ޢR_NfnnҿKqZG xNBFFPd836HLFJ@Rњ/Pa5TPC:AXNCdRF{ai^7o"CjC ÂVe~~_::wDETላOm/hd oRy\r v:,7V@ 6%[L% /Kvhz^Fb 4WI*vTsd BEYctM4>'M Q6I ak =cxÏQ,ay,ȧ-6C+;]^%uD3esp19pm}80ڂ3Ndc݋0o_o?n_E")\dbGPAkYr i,dyFrPi *mIjɃw,|)]#!b TBsi3Mk {1cT>ѣ=}Ati/[)"$0Y 9p= ;G6Xg՝erC|T'GZY6ͣ^]o#ÂRGHdT%D]X1]'SOg{g6ټM@\g.k1Buw}jyxYd<$ j;3qt&`gJN%(h5C0!c̰E2Ae8|wA/L)*ܴk 8m6*Ѕ@BڷӥޮӥEnV?`qP ׷ .-0%L`Q\dcrtBtI %:M$R Gx.}sx+9%JZ4 )L&>xKe a?e~/cvp=17+#$rgY50Pm`mHL1hN&a1C<'1^0LTUr侔/9JJ W mHX.V$UIe#O<"oЋGl+W/g =o(ÿ'=w6m97>pNG `CM9vd;i/opVȾS*.s]7 ۞8LEhX],k7S\ 0nӽA F8Glw0mEJmA0۠>5'L/VxdWp3bMB,:7 ÂgM$:3$qړ+AEFuγ/\^*BWh7=z5ֶS&!!v1%,e ߻?d7<}/ ߤϳ,$Wf$UgnPHG9MPBR-$r4>@ a0C3x?aH#l;H "GY4{ -9k%…@4X%Hg+-mZäZ\qB"@EN lDS!1_~+z_7nD T-u=AѺAX/WSoxP|r!yCIvᱻ?l@VW{>W}qlC|#b~i0j2>;=[/,4̅K_\co])>r <$ꂵ gh_^:jnVb#D g =̓_| 53Yny3{ۉ5sa'km=Z7)W>c) e+iB+(y֮픂tX1\D@G%U@y- +U,l8~vg驽G+a#C 1Md#"F QDU_J8@&*cb \~OpW3}V*%`"&XCjITD\4Ph-YQ#?VxEHJuk^GwD!dA@neUI, Eś(W C*3]X<|WIG2:7^gPgϝciSQ ts:F$MxϿZ{J6W|U3Ϯ6;_Ȯ٧c#})rOȫfFcyo'S o؉{WrzEv6عNՅJ(l8s"6dRXfQv /ZLj&BETx֐:>X"iVHꡈSR:6.yW$EyM=c=/X֙Lt9f1ad¥-UIIMK>2aX5ɣrT$INKTǧIE^9oԒu>by`$~/_~ b{Kvs걻y}cτj\/he\|jm}  IDATS(?+>*oƌ;A7.;^r1@O<.Lf=竔dllGЙ,EHḯD$3%4]Eeb!1Ua۞'u0݊XH 3uhylՆ FmmO}sXщ&::%k;Gػm{OKM5R]h0̳2h%4/0~!f.96=7{3oZUήQmE읞Lz'S̢et]"0'cLsU.G?e?N6+wn3kLF^īϤ<(J:I4J#FxBtعOPfYt2# %?QN1-99LJ7?Awf2 貇(ip7dD)8Y\?ľ83s&\Fx>s({520-mltx #bχ&U [ѕ΀Tʼn1!<1։5_x5h=1nų W=[oV8;A1`['(R[5Ƽg]Td2 %%l- iMW휽J <Aԏ-Q PR"$UTB"mE$F'ҡ@D4,]fg119K-]o)FL# 'Dgc%B{>Fh1 _)ҦYb]rKkɿasUZPu;i,[|% Q EcՈ*Ak2uxɢojSdX/B9EP&F%z 1I "FhS!"4FŁIMFrvo\[tIQA#-T?*ȡlc'v!r9 %o J*DǑ$ddQNZhbJZBVC8E*-3S?g:ʾ('WY},Xh[^Ü=.w?,'O/~7xOY=v#Y pKm?# o⎛g(!Y/(lۻۮ~3j[o>Sc {dj\7((Yy{/|j|xϞ])?K9Ĭ jt羺AɿJeF􊦭R.=I;UE4^T 6BƲ\9M"#ƚmPNBDḱS3%HX'( XYTYE ]/)"Gѽrn_$Ru){QoXZ^Pe FC`]PX+h"Ml0-MGS5ЖcgM4V 6SVOS67WmM@P+nsNCCM놈!?7Y$¦d)fU^^aj} rt{a޾3rGq"d @S"Lq n2rfc7Cw9i;:mWo3I;|*}sp5L^_y$ѫznµ1i+ 璜_;ף/?:]7l$s+]+@J"]h<=+9Czsm 8[:AEYx05HKAPnH'8WaSj2(bP _?×"tHAJgiFc:E %ωA$5AoM*M+68U{b/?}tt7^Gg8~)n>l\~TMllmс8(dW R"Vs_%e )K-CRQO-S l_aD  3"&0PX*$:r[֘P,י ySD W1Z) B854([ҋ!H u[FzRoBG1RD Pg"$Fxo fZ$#|ZkF#_O#o|q<vvqڱxZd&6v: 8Ώ:]㘞#o%3(cQ"‹nu%[KfF4 ٱq:12t] H [-e.F #Ě<"D =6^a>F x#IdS DSb;W8_S}"c;=K hbjԧoG{g13@PXb.Kk)WW9?>FUj4j bո4mҠ)ӌ;]HPҨѵa#uAPvHrC>!G\+F#D8P8`|A˝.e$8ܖ/296 g*,qI*$b.TFY&^0k (W?rr3$Z"AOvEZZJ= X}&9s~]3hM0XwDb+gYc܂>_ǡ\ sҰi ϺCfOJ9LJkpzg~\n^p݅!k0LBA`:G!%Ʀ{jUT(Ր0[qC';[Qgy(z#tp&E%[Ϳbۃ_b:wdo_3/ Q[a(m[oW}X/\II}N,H&*P 1 *!MS(ĸDiȨr)]:E5SQq&5cPdCA\<\\yn溃  u%c^Jb@cu){K9qKkBcwGTdr51W}A2"bq&,p$(&E0AEd#PQ&A@UTn8B:C`0X(]E0}MY:/"ʸC*IQk[aQ(a"C$"3 5^|Q:eB > TDILZjB4ݔ4=f ^*+nf% W j"L)g{YlVL혡Z,ov5bm,.jBFYdGr۹t8l!ߴb]C9}ݕ.fAMҷrxC-K^W"Ǐ| 扅2ьb}`hS~N ":AFa4 dMcE@x//I\} ʩR׿E |&^::=u=-Ѐ*7Lgv1A_OYIF 0h96xp;sm7㉎௎v4|2ҼqTAT89DM1Ex)(Iqz 9ꎳ,ׄY/9D6)F) 01ʦҳ^QMO!WVx u Q >_0-cp͂qU*a A9vJf(ru2rJ"eo=4S5QX%iHQhaO[nУXI4NÎCہo!h z/ȋ_e/7cO. Ba!&R .عQ֎h_x8'ڸgN8\8!hsx8yV3TQPua`< (P\hɕ`$M2-lފKէ,EN#ڞ\>PF9Egz y6Yw TS31`. DsAGeL?_/b߻ܕp~KyRđ\, EEW8e4)`.M6ΟœQZ9u"\#^}bgItN[D4=&5H #s gExv|pS0`- gHk hj1D $Acxcʁʈ6;ų+VG+W1'#ҼdMUReB;iB k#haK T A,)>֏!/?áIRN&&(SgQ7xlO>ùEG)rt 2b2!BU$I EK7-phŊ9Ⱥu7}O"Gg\}-{=Uy~NWĭI.~c78p,\{&4D~~i^aq~_,\gXjx{0d%X%!jQ hj,t=_]Y[;j+ u0>2KLjS%f[?k+7ή4L5kZz8żrGsnZzࡓRRўၧ׈f ibe1Ǫ@/h*h,`T$Zt*h4:4|'d,t<][KIG45ڍ&Ip%zrǞ(6"Bz PzEWp9 L4\۩XG;o՗"G=zA'$QOA*pdPH|I\BJ`zϰexj.f_fkVKXvyɅ~Eid. c08 D.Ep=AcY&4KEӧ@L۴43CGN0~׿987wVq!暷nO׋o-gzXhB Ld[#$YzϾ |~s ݊,NI%7UmQ&&l|!47U?{lts f= 8K.Jrk1>;Ll]5Kw]0 H7$0%xB|pϝnxmɽXH43K<1tˠÓ1BOa[[pEyM$^ $s!i>`ڒb+ےpKQdƷ8 d t+EFHkSM.@H+H(qɀ!: ^Ȉ`4EMw<;vSAOa( ur͜>r׌%v%/cǁq2D $,-s#x4Nbbb}h45ȍ 1m.B+.6mO6 vHi%B;M'ԑiMFt^@EBVF0݀}LA*Hpc1 5:4)Q!1ĦNiW@d tqRFÀ RW+DrإvËX qILСISQBX2!Y5ć-22y={I;SK F;9LjFg=K>ѣ01"|'k8^Syڻ?;=w}2,,,qC{xn#Wɬa[!~Jr^@9AЮYXѯ>O6Wc൯#*vʩG 5AO"B^DEPW(HzN:'s*ڤe=_׿EBeǯw9j0QOv:pXL] ?T#-^0&rNg X[#emWN^quyGiuLlXf5;dZ ]ϙ:^=1=fj"e_IK X^4U?4Œ]y&<8ifkL+FR1UF@DRqM*Ăh%EddRKbפj80(9#NnIi E6ASJ(fQ% Y?KW6%if*,D$~1ơF+H3˯Xn!Ѝ@AèT''3m S .?NFC2}{WLnm@c^ϝ%"461*x| 5 ϟ.|n܀4y2? AUjFڌKl' XDZg Y3X?ʿjj.YEC8ЬKCޏs IDAT#RoeB>0܁a8. , .%.tU>'H 3ޣüdp|jkm:(a{`?ѳ%rCœz( [[{B w RG|>vt G> 3ezj=OP-*u;q<::JBn|<Գ"<˨5?75&Anc *u+虒UbE *5L3d ⁡߮!lt{ˠ"x&L8%sЏ'R!?6!bOiqs(KA!w VQ3X5&3.|EuO||*71Z '()s 1JOB'xdIz/PP,E#xKW#1 rA.K\" Ӂ6~X%EK&FMjUAPgPZ0R1X0#0 D}DنՀqm\_݇)s֎o_MVA}2ƹ;oNMoS]p`nAoqLN,?w1Ecms/~jhDt%_^m(G;19׎lt)٧/N8h$#W>z;f5)O? ê=y+&3G["gbPr&8DPQ`W)LĎ 7'5Ut::~&d mW/ z63Z@ɈDeC0DojNfeCx&ܕLz1K)j#ИLje&Pܧ3߽+oc/!ס-SN(}(WEGxEZ Z#,X¥oo8߼*o/니6){DOw1Ndu{$VXr)BD$ÝEE@8W%!w& $>I5:EWO1yk=+W~C;|$;ܻAz{D;ktTvH3mn%T&IH" lߵ];|l?0 &ZmG(s:YqȬĢceR J)1q4=L!YAG][(1^+--ޔi4Ahqʀ24&$a}L-J-J36L*$fPZ㷂%'"^(Q@ji2LlIh.S}I+?o;iFE;th[w .Ho,!+g3I0\{T>bt&ccqo|.zS.sfSo}=SήZ7Jgԩ)Jr]W0]4QjƱmAץ%>EU@l' NkN#oD"dX`EN*5DD W_S}"u+9ZxᩉP4*==ο-/7ܳ"TEGDNЏNw5c?1*-JS׍p֊MHb6 l;^>CvG8xGKtxex(i>ƴ-ã kzw CKzLWTP0;f0ϕg>9O߆?!/YBl8Ksc Z9i(7@\$y;Oq7 X/La=Tu1g@3,xxQ6Q(jog6 $R{ qW*G7/otIWW<eO>fsߜ=͗,ʳ NPsUn8Ck>YT\5\/F9M=׭OpTvF 1$H!кD9XLdI-aOb1FLWOp̬s3/[5mqGȬcMcbc"zMܖ\ָ[e<335^$AtbXis%uMe\)JGb;dTG6Gg8 }u1'7.'>i"1ؘZbUbтy.Rd ײaG ʼvݶY@ 4AbInI1?q$[!v# M;%&T2^1rcR+ޭ>,$6am$Gq48Io~(!kmRb1݅v|>%HtB "dY?z_מatI>y?Esx`Ұ $$6QI["s b:*(}xd-Z uTfI?'=44MJҁ)`B[P@c"6Vذ@ゝ#0{O.--YgmH)Ӓ0 Fg)̀^U(%_Z'&F^/"UYx4'_E_FkZJ $@H8qׯdz<,j^{my9KW/{9۔-769r<|aw}RAj74I`+<53^o iCibǜ}[]>suII'5PL3Xh*hPG-)qhg\ @_߿{v+]x@m؍^|-qxvJAɸs`dg ț1t$ʺuG)a{=B 3 \+i_T cY*80:`at8١3jB\'R2݂.-{>jy,Z6 s\>y(go>H?qzߐn^C?,.ffAK??GF()P< "?w?f-|CqDQqG^Ж=}Om+fL39(9W-1wKD7).jN|z?m37|<ׯ) ׯ:+5/R ~0O_3_y?A_By5f5r)e9GbuJ=p ~ʀ#\5/+ 5C\-11QLfIN)ba.;L%RG WOkgrl:ڱ1Ś`amPR 5R$ab ]joD  2؆DH,߅HD) 4Hp$MM5R;nq1 GtW,ҝ,{%EO1iA GYԗ(L;8h词:xڰ2vxu=x;; yw(UQvm )EX@fm ֡ٞ6ǦcL1$ )&bmMas qjaL$h6GɩO L\Y?7R@%a$&ۙ|g>Rx1j0CD4O/(KpPd2\ѧlFvo;5J!-hMD$Ho*g9.2RC%pO@zȤIU$@HHg D$iI.'TW2\@{-7/_'>qY_$;ڒ F8}$֔\fggi`c}n])c|cGуՂhf3"Sj,b rVqX+hx 4RKc?./}#7~e]Ck4HQ1-.-FQ1jQu"DŘ%cAfV$J_ߧ{KÊYL1̸SDw Gy_}C〪gf % GЊޮiE1ݹeZ}(vJ]x[5u~'e,=_P%x({+ I*=kc}^b5g oLhct⅗pcϷ_ڙARԄ#1CŷӫCMvޢ[7^l[eug.䉉gH؎%RP tRb [1)#NvSR 66(1|QHe$IKmIPpnN VNSO9mxd汇™C"0{Wor[`<Ϸp?}Mwd1<qR-} 2c`6]б"PUTRI1$Jq=l9Cxҥ+Ql>VC&K2IL~NWmp18kvl0e|z!ZE"&%@R\')XʡC VAKECHĤmm16Uhp8gFQDBk(Nsh`OUy6N1l GFc  1=WƲM&F!)!"[ q|J%|@IyLKNTp&& #6C` $1 Vᡵ#EC/[{)Rw|r Kɓ:v(V,PŠtmd1ae`xPaߢ ʂ F"<Հ('_&n$eim6X>ߋ:HU@-\f_[fys&uiqVPI`{Bh31t;,j vxGA!B0 hPa c\?& ZIQ e7%y8hl"%j5]tw%Ur65ևkaC(u7ZO҄zPI1vtv߻' $$(bޞ`\bK R>Q79K=v G_v zYv^S" Fh!& `j@c$I `цx?+?X0͵>gO̹Y]SWX]_4}\ϵ7y2eq0fsVsG}z½͝:N #_r1>C"S_٣|-/%;7 V|GWTVxfIq}f{&ƭ! \vwt1)hR0ٲ6͚Ҳ #˘&8PpaɠV4$^<<,HIoSa!BTbĔV0&)`0J&s#IM aQ ]s5D35)Hg;?M:ygHSAqԿC쿊}.}[/?6G/r>Wx… غvvi +4g< Gxxe3:;x>n σ8y=|e7.]9&E.hl)+|Uhg3EC`r{3~:>rD"Z``Ҋ:!OB J9% DD+:)PNui IDAT8_G{nblv]mEcge K0f1uEs@=^qzQa0\@*гRچ `JGJ oNy@g-YP_::! A e3]m$ZJEHB1t B0mEOd$uMe+d *"޵)l KvQXӑb)a ?]1c \JŃ{ZP Bc LgCE$;r!t)1W;1/p Ġ()fH"iBJ}VO}GNԂXCm,Lr0J0TxV).B$@]wf]d1 L |@tdxλ/\q͘Dg- AS$ "B(9qt0+Y[_5 }7ls핫0~b&t$WV 2,o@tDK=i} [w(#6HGt~ 4@n쳽HfP0$dZ|KNCb6`0{9Vq֒XfA>ׯOig <=<)u@]4UX⌧bBら|eb]&sn4l?MM9 LahjeXL2^zCbHe !mK [ ΤO'NH-n'5mZZCC$'PwFHq܀+׹ZWrE~Jaav\jvg2Qƥc?ej g0b%wJ8PGCeH$Xtְ1ȣy" $%Eul\{F Hϖ"JLZ';!.Y13ҦD,Cz\8bH/sG8ߘŐzkaQu3=zU"wkh8pz2l˰;{՟KGHx#)! &]Mg Rӽm.V?doƍ+ױڱ:f`gV9wn<bI=)d݉8ͧ>Q׎qw>?`5=CS C[%\0*bOp L5@Ay:XJUAHb(NNuy}ќAz}d{yՖ߸ްҳ]qnV|.-x)׊)_i%#B Z5Pi¶{U2wwn2'v:O.DxJz)qVX ,\ N:Zud/:z}b>3<;6|iSW]Mq+zz.ـ`FPEb%9)zɰwPc{XW:zClDCMd;\U2W3ZRyÅ#k1n(nU9,8Dߵ(}lpe>PPlRҨn+Q `1{88e][8H$ՖE6s2YKŠQP:&!$M0,!p@P)[>wf1(6\F +6+HpeblQz2r,^)*è*8dul9'|]Jopߧ珀pS9JG硨W.c}zΒc a£q7_\g~R ܦiBodE 6SC:|{/|CtW9Z & gJ*,0T)ko ppy1g.b5貃.Ah;"kZK uvt[j,cNF %$B̢ר!EbDҚnx#)=:%jĈή*I $ 3E3AQr7Xդ9W4n:Vb _ƒ)67x;ܽ ~r>?NAPK g0@ vNvkswy;_v5|`J$FȀAE\/-'f #(`=9Mdio%"a%c/8pJoc%0dr8MVS\Nv仆;Kp$1O1|^7Z3@?Xx^Vfʹ?ɧ2ڴ!]/όD bm~5Œ8D uP/&4/ *ŦմHS"u, ) s\>t[ 5l*MUvKKf$(Vp,e3 ܜLm;7Dž[ \$F͛_EnȈ-^|YWFYX6ǫtr&HU׶w^5Aء?Xa?L, K?$ʥxmKoV3P4圙dQbqa4%WwoiyJ.Y`Rv ,3ӻ4_=;Np&uaD7&4|yOh뚃ʹAS`PJ;@]D8 m8L+(_?s͎zop xu~5n5}Xobmюق;bTndhcbE12m,m O34-޸G d^b`zVVWH.Nmhh0e42 -A-jIXֲB-[~ {; M٢ nTҶzXnw@Wߵ)B"GrWHn9LThA31bb~!e);Qna Ce(UKEHbs)FiiI Ӡ}B &Rw(m'Iq6dP`XQQƣYb9Vu{*̻_[-Xu.Ў%RRJCl]skZY>>-0E`ut&wvgs̼,$)MT"xWKp?Cyk!PI)S\bMī{Ӝ Tֳ[GA.\Kt@)ij«dgmУ%]eIF:եF'ۂ #sc$1̌rN$L L$$$:1V!FT Vr@ Hơ!!N5(,ξhPv;Mk]ء_7^\/r2<:OCWRi%js7#}}JW! F,kg.Ju/]w_JGwmHydĐE4bd) El%Y%J)x#р1dASq`i,. sOG#8@48J`,y'Q2""Nh}t}?qbsG魏֢`$!KfJZ\URlښmY,BSctX1ܬAsu Kݐeh@ius[3' 01L.Qɚ$PэUxAz"iv+u9>> Їyk) Ǭi^~2Nft 6F78iܙՠdQUBQ.H) "~ &]ƃ 6Af)GR1䌚It}}wHQ5 <$D,9 w'?y&Zj nĹ{'M[g ~t%rk.|iA3uT2O>ɍVyUj5Biww.q ьH3ٹݮQZww-v tXV gWچK-:5ZvDQ/R 9n`a͹}Pruт/H weL4jŰW`:K cs^ਠyN REIyvzɡF7. R3JY#6hCcACd2OEd:zAYOV&L&:P |RGָnB3iZ-2O\ Nbkt cIĉaushx㏬Q$W*/XoruvCm25bQ&fCPAiIe thR`F'р͢QIOwQQ9^VTљ9)ZڊFj u5&hRBu$!O;$MW\cR".k@B0 bZrf4ڜjH2}A" %$B44\>IJ='\iy\߳ūL4OG8ꂢ7##U=c~Z=mIzL-2h0KԒ*+HFd\Йp$Pե˒n1>W$qyp_N -句YߒA" urcq/O7̚U??C;$^NbˉAG.dJ,iRDb'_DӋ|ƙ <?cyY^z iǿq=F@fu*MΗ$Ŵ*I;oasr]Ʌ vI䔉1J&3y,rrTs}ӂ4`tUFꪢ]Ql)OiOF,[Ib KӜjLh%axbj( )Z -8P1Aw.T:qԙ@W_n Z+LUw(#P|FI4S;RS82ԮƅD0 5H(.C(K/,uZa#gJ\wL I'R 87ӏmJrgl%)JƢY2yhu  Lͽj pE .rBr^Z:f2,S)>˩!l 8q1J?Ed)mvi֠,49Yg8y+=!5BPLKJ0ZR+*xd"wm֤-4NyXN gQ:'M+ YJ@C`l-sh!IDлK 8RH%Zzw6Q -K8 Ӏ"ȅ@9ҡ\,νJb qfk)kmiU5)Ö9'سN}˽E5B'ot+GÍg\̴+f-ɝo1; (wO#[sg,.E/RBPf4Ĭp %޹yVy6{7w/~ֽGva::d͊;͌5RF l=lB A2+ jR![^ >q>YJYْ|-nOJݔ8`ԯjc" HMۡ[l C=n UTL8X$58!Ԑ>uBsGfL(kZr ÷/7߸O(RfZ sl 8rYrgD#ǘv)]ވWo$ТG-͹?$y*gȵ' i6KJ -F Bl J A;,` -pPA?Jtx3ϱ8b<9Os*O|>ڱ}〷_S;,g(f\t/ v q==ds{}Ob 3`ב IDATN~@˙J(GMFR Ɔ1[vɍ 2О6kI94d7;DHù{t7nyfK')I' j/Y >/rHɒ \L!ryףk~].eҖ͚|b}} sLEҷ5F[eMYv&p^r6hStXdPO$-ov\݊^.%6rU ÔzW% fh5}`h@ih5ri@GspG\tP%@K }rv@GH":ii<$Z*J:Z Hx𙆦Pʓkң?  5yZSpdvmd&9TX(ʀ Ly֝zZPǙIb|Yk]4%Rt*ܤ ')JA*M(c#RcjXy9x{,.bw0,]$Ϥ,TCڧ]^kVk¤ $Za]J(QNw`xQWgABK0Q(}JQQ3yJ5BJ+1 Q ,xlUx |5ARyC&%6 õG;ngHptaai|WPc.o%|7,,._ s6&z oùK_9Cױ+zT]EH.ԣ*D<݅:\eP Y睋prmO~=ěxg>ɵxY?rYV<A?Mq:O̹GYzŅ.>cKd,͍Gv]-JF .DI&HgNl@]Y.OKYja㉟G0܈0a|OFQj6nΜT睭LE{n߷|6~;a<@ ظY`[eN=]m3uCOzaB!NITPr_1/߂'NX*7ҼqhL99q}Vgpm fr !DL! w4U&1;@&t=?ŝ,2!Ӹ-"BtTRL.\g] A+VCS | ^ٗYf_/D >DUH!#3nUD0L>&x^}z}yQ#fd1^"pq {1L .;BH4ZiT":[DwaPY1yF #8ܿgG $ bCP(ӲmV|>wx^w/=qO鏝kxooy|y[7xO"_&I@4視߹@sWV3m{P❧YP@ƞss o/EM3_ [ ڽ.'Y\YX[Y\g4:.;B\qaDKIm tB;oR--{O~i(Ξ\L'_˿k\|<&W~P{7 b!ߑRIpGa>?qs`p+1 ?3ܬ96'\<@OtUf<~Ovkm4V K.>\fAk/e yhܓ J:.ٚ8 9Xc5GSK W=[yc~rݘol f%ٱ]xl=z铁)Wk^so dhs>-MZlfǍ$I&, ;p_IlY)_ӯDGNeqiD䮁nj壄CJ^AB vr')gR %ďcmTuTvqP ,\\k d!%ıe<)'HGq,۵gT΢2mk+ȒיWﰪ5s6Gg`40fni MpADqQqFB6;%61n}?!IDu\{OڸN1v2} _6"W9RE 5JVt wסWxP$zŒbĞAX% J)@$JLBcH >ҥ0>P EJ ){L[ncw%ƒH3LDR)ʐyCz$ueh*E)M:~?"%x e=v4bm3?9t;#MMgY`5snM-6{ !}N 9f&_B0SC}AR!eb& C2BTP9Afx!"A '9{$H&3,m֊1Uy &CRxCs

fHihfFY!@yDQ)1STC ୿\y|~˜Us$2}=1W% B*)DlxZӜ'md`L$q*E`dQbY#DDsE p&իwm$RBᩑ?L$umxebFn}r!/~ܼxhaz[{c}%onN8PL2)۷\C=:DRX^'=q|\A4kŒ'7xg[>ݺn[SSέF#-"O#yH~OGJH0TNqXȱ& EkF_SƍzBEԡtL@lS;RC3EDqn3C6 .J{V=fs,ҽxuJIɯpN,VBX Hd9`jPV#O#?[q^Wx=ROpLB9I1̣,9߻5{߉O!6 >`F86תa'ܼzO<+|W~f-d,df<_ ϼdg, urvHEtD&E8P)lIT:9@do2f)"@[i=!ב&Fiqa|\:u;Iu|po\|6yˋ9sKo}s$yLj.\|ohϟC:6Ħ)=?qCTuӕ" ]¸̹>ULe4$FpHhV:{*6#w18:(aPڱ+z!Xdiƨ0CL4W}~w$v058o߽`mk1Xƀ,Lw8੹6o8i+CMnw=Bi =XU$e4i-B3;Jjя1"WRv$"a!Uo7>NQ8Dy%Z*/McHF/EӲ4pPK&Д!X5C;6kˆrF AԶB@o%ӚAh<1#]I4{L Yj 0_ۦ[1qAҪR]) = ||Sw7n;E@WZ*LGh!.$+RawCLRC-NGѤt- rvSm)ffPF"U@8M5Ewn2=,VR{s#KIPdQNј#=?0qtvCCusgq')D:عn&F^#!XNJt*D@ qE8JE̬HFdE VF绷˟]q^z_e=b\`TuTr+!6RRHP:f# "ncaZDo;<~hgig%!A[GyQ8jk0eA9<Ģhs4MV1ilw|A!9E ;#%I>$ҡ0Yu^GT3"àb:aua=Kl x?cG 'ܻbcH{9 jKYYY=B$|/g3l_nutylmܤ;@&cz_ƻ#9ol{}zA8ZUŕTs;`oK c&1@QXҒ%\[ZenbiK'-sE*kQ %k/qgYuLk^eh}"bb{Bs[PͰx!*~t>:?'n2_?Z0E)AH2oxE55YYQ6dž0qb5Ȃ75~FuWJA%zWg&R}!BEPR!/5&hYi%z9YF"3B3P|QvrA:KR|.a48_#mK8WƴjΜ:EXLRX5XC\#)3VޕKj+: UHY^^̃޵.0( Ƨ4z?8oaMhI $Dth o/Nq!B: B#C 7V3Ģ8_ C rK5OJ>eRh.W>XH$>N 3myK|# [5#g)sj E3LUqЯ1,.-:t7O]T ӨNfl](jjﰵg.oRUfɄh6nΕ ߺEg@g7i3Ԛ@'V:/q)!TD|  cA%%Hl$^q RQZC,Z(CF*oq~4u }E c"-H|OIA&4V&)>{"!IN!$`!.q7%Lv}l݀4Ci"s|DQCxd gSr)<(sǨ3j^;9$ n}ZnS=1tCon{"HJ\'lKkBf{1Kx1B૓<4Fϝ@X%ǡ@wme2)!ŇFr=<,$q͝XY.ĬABc^ uR9Y;{h^[-7_?`?x\chqx=ZHp@(LJ ٟW0 g?<)8 | IDATI! VY`qK5t@YT"$fSҵJoQ)ɿH%:%IVFó` IFxb)lÓ"Ӏ<)@z-=Iϲc-س_Ȳ?|'}sNp~?7+_y>˭Gٽ~a鐢Mo~͍8X=Go=7ާ%f3n?Q7*ame1Y7걡׋8W{LQ\b5#BC*Gc\m)i{Bk:Edsg>cO, VlTXgcLxH| 3"A U7NBBb-wPOgd*tHQI jKp{, q֡+ &40)TE%)N OVi/~ULRKgѤSJIDJ GR9D*<](YA X,"E3$2W8@!u-)C2/!(HrEZ7p&-aj31kYQ6mrYǜY|'LhP9B=r{qA䝃 ޼ȹo-TRYAbBFJTTZ "T@Z9Nx|9 B#'7gp$1VT h6$sL*JIØ8, OL1(z tQ <x/ea0J7e/AګXAvC Δ =-4ssI^c(i;/sܳ},̝ ZXvMK RPV#) ὦ43\+!miҦ1La! -s' ČHISBHO")ic$$([Yq~pbՔJf:Dsj,u; U?ٔ',[]G"RUѐCZ2A!EQ3ZUK=#Y9fΩ;錤e#X_jp e DT)Sxޜq枇ʯ~^_[B.X\Y2UB&ZHXgfm}5ѻ_ǸE;fq8_eL>3 4{)*MA΂^Y *"$$c*GL=2Ju:DWxas. 6a&^3s#p[ivш}B A8CFږNuEk0.i$F])3WG!J,,.[X3tMZJט^O/2ߩorrnc&k/3uS>yv/[͸eS yTiR%PŐO>qZKsܾug{hɲє?ϝ7ҨMfH$&8BaC9tV(6DW2IG'n2dkAN=qB2QMW!*OhB#> W'"S eZ+TQ(\S6+aF& B 1g6R(.y_~icȱ6-SʄQz,Oi)i+c5Π ,22)|hh%5F;r:X}-@Jfcnf0!&KdJQ9s,Kj fm{xo(el*Ff,ާxq#Dž@5<:͑bJeFT;Izf2" [Oq :;/PkO˗?4h^]VdKƛ,/16' [9a dfT&S)JeHe CbHVR>۽m>i}:U]~>ul zB }@ǽC:O _Z`Vu)mrG!~{R5^g[W9m1PKV"EH+@hO~/1D3t__|mnmM`;PٌE]'C (n4~6Mg"[Ay0KNLVL>0ڧ BiKᶼKUdX ͙pk|eO75SF!GD)3C:YRqOe4'YrX}-%q~ 'sP. 1[hSimCUmqY=H/M@H2@[!Iƅ`̦LҳaPO@ 87 $J5P |'ǹ|>\cobC;X٦pQѧ%z?+$EL 0TC{ɕ\9sұy˧XZCꂧ^y|RO$'\Nkk;lSѿ0G#a3\bi~2yc{1Fr:O+ocߎA Kn4d//2]8E!C@\c:9ݲO&4ujTkr*^HNU285zyf/9+NY.2* 2#bq3o.0/c(b o &?mށRlhc"_-^uѳL;B^ښ:Dj(ȴZjQP%LGZ bU3-ӸCbcSyFI`ҀMR HAsI |Dـ*`]Vb0dŻHY I66eR:RlP@34yi)pՂb2Дy$"DPC4(>>DvdP;D}&Pm) Ba|N-"  \dgRKbкbOBbMҗj l>B)#*z|$PAe;:*"Ӷ&@ާ!gX*"qԞ#,ӊLaȄ0+(K˸;41gssqVr׾}4Gv (Fdmkw|KW>J̧u(]MxvKL]B&PA$xM^=FstZ2}gCD!GD2=e_+7ˉ=֍ y 7y&*gkk{K/\wGtTQS".LRvpyR²umLSxx\iը39o?G=x:a{fadn1By]˹gx7=%oMLfy'8~dW_/ ~MpIν W 1e#B%F邈$LP~m֫.2,Vc*9jcU-!̴6,(ZQN<.-ߔSc}A7FUw Kf<*jC8LOJ@,E"UאR7 |I2̡jЍI"af5QȈrԦdn J-eyd{ºicoP10BP". ĩa1&SDdUR#eD[xL!ZJ[Qc]2 Ң h#TQ[#T-٭5RP4K1p}@SUm`KyQ%nϖT,gTmgן>s#aLA&,A \;acg\x>ʕԖt웿QM@(K{hΥ/oWx^oha\yB Dԑ4a53mkƾ doZ"MSX?f+0AW遼&8"l ~r8h*@ =aF TH˭gƣŸ<9e9$#]ȑ7ț߆jQ=:}I) Q 2!3ڝ"ɥH?TjV4x績y!t9eRhB:g dާb4zB=a~Τ)op. JIՊ/:;p:࣢۔deI>#L{Q`m-9qڵ-X\*Dg wHl?#H]rwvaȋۛ\?ĉG Wo^?~y3ܽo;g^{Wn0IN,Or?O./!7pjw<%.]ι#GzuEvon3ͤ=P>f<Pb%nEK}Y?.ҩ%?Yz ~Ͽ"{c|}S_`c4Oj=!$C#c\k3!I_d׫OuöjkOecƼ'o(c !M/"syKOh*ÔKtLf(Z4>b '213fK$I*Q; f .VH$i\L$rb&)H+([ ,RҠEA5;;ɗ|w1I2ٍv0mNH]vR6)L6UF/-̕OI!xmc͚3` U#2JSbsͮ6pR̷ g }yOS\5qz| oEY#Q!ʈBG[[/n3։98wK]#<X$x4{-vF_GpAFF>P@%JoVz4cz3_E9C<0?ڷ[ 9SI H$9hmDi,C*Jh1t1CRcI)d8敗8Oї{UxvљC)I\b FMN0]<^zwM.umYKʢC  F 2aotL53t,*iz]dYn e\Af%2mC9;H(]<5m"B/% DBԈ,G27A wq5䮋-$~̄"xS$yFTL-#|O<=%->x3e]s+u\Zw|׷#O6˃N8OQN>"Ks Ql>ӊk.yR_硷-Gpʘ``yEn6\GnN3>/'e!V 5T]v3ֆttjoY_E'9((n/UEPD_C0J,&I[/ALkQZ$wbqyJ2I,s+=i{Wv PWF9|gҖj\f}h#PZCē#uҭmo´`QXɄ7"2z<3U% a Ha0*&rī@aR:ҥa39{Ak y Gh&젊vܱ߀ 3 Cʋ 2dHfvGfw^Q GM ""2:bHS}0gI xId@}%OmW'b2Ic tB:L!v((%jrnXiTѦ.xל_B9qh7($K <-PЈ\:q =s8zaxwJp+xF1-ιE.Xɏ3Oߥd IDATg6;WOcw0 Q|*IqKR7"&;& fC=X6h|CN5~B[0 Q$)^@H RIZ ڀ_4zvNW S|5Ƙ=>$JBԠ<@d&dKV3 L 4D\,WG9;0bo)E 'T{@evjN`en6F\L^ >ZR } P*,i$bgMH:G& 6; )8N0KddBQ&$Q̂x&/ۼ~τObC~cF‹ B $BB%@Y%Ję/ c{gGl8:A9B(d&U% *(P>좖qB)$1y@BIRQ4x?m(&yE |Ẍ.vYTd`ZtpNUC#"yzvc k/f_}_d򋈢FHu V :#3_[o'm4Y lh8D+y!C$*ׂ. (i}J1ILzxI;2ɀZy3t|C,ag"uDgAL=ÉXs³Ѵƹ!sjOWR`T֡ Oc .ZKzoU29O6XZW9OLn: MY%)L,L| [Dk"ZKC| :*Izj$1S.кzZ+R6E2V6.֔QFrJ'B (RJ}MN!dBG &rKEf؈ !W4IJB 2 d>q]brS{j%&ԇDЄ? @ed#'RS cȥnt3qFO#!k7ǜkӼ1bU#QZ)]w!t{Ž]WY{gKڅ7{vq~ڍl/ ;z&5ͬ]_ӣz:=1u5ƾ{dKLxXD'x1 @'tr`CKMkښL}E]ZK5V  *t Ka"aIea[5[]W@g?VL{V61D>V 7]$"!*A }Z-&{aDĴYû`úݘ`6!. Lꂱ n\9 ̉]dآ氫 ;GXꎦ-3zƶ̙|%rvަ ^w|=&#vNݹLhiRD`V =zHRV9j"Ý;Lx%SSÄe), h@%Y2qH yOJh2bąt()0ѡMI )hc:5LL)y%"KfW6PD62r֭gYHT ӥA;J& VUġ"I/"v/)\Hnow|cK\;CvLTÙ''8woxQ!i!CY` Djր]΄F IJ7H :y M`BFӏ]DHp؄婡n+FmvuzjY0%^E2taH'lAa#h $-"FHyɽQ$@$YiklQ&8¢Mv=ȓxjeY-p%P2H2T"*$ --B;;C#X\ZGcSh…W.+kQvrz6:v&;|ي?{`%Z lRslLX#f8^~Fnjw׽ 'ZqMvN%(qJ&:Of(_zsDI VE{97y/s3ޠ̻+ JN$&E0ihcR4’ER k ^}AM(6xT!M  .Q@鿘g)) O8R V-s1+R`-GxGOpWZn^s՚T2d*Ys=),\D0={j8k9<},׮G>y}P}KLV jj"/Y^wr8KN]ٳkq^h vN":Ra@$ T⬻Yh`lCU0`L76V\@y*ei#5;LP ̂[BdV!M2bf*B#&j=:y;<$ ą1ux>`]fR T0j`s,ؚNr,T6{4 /։9 veqE1av-%wwNհ2c%Wn`:ڶbw:\]@AMRwhsM:9!ϜƹM}vQ8αc%qb_eƧ>ǜ_(r%jƄh#E$d_DF&PMKj6$s,07%nn6H\hņTlԾakZPD IZu03ҎzJ.S>>88A5V ˶2d"B+0Y]o͸0Ҥ2-AtԠ,YJ@LƚFyLiW+as rӟE+fZiTmPK^lYpZ%6IjAbJ`u!l"5I-<3IF ǵ;V01K4kq Q*M bJo 2bds4sO_!!{fdʡw|/KΥϢ܇r }KU]tVP}* LS2&Q)X- (O\¡@@=!x4TՄ&[kwC3$J!T (TBBN, ISC Q&;1yAaED.n~T1$Vktq chE2m]*im m'[RI@C YZx$ȤUuR I> G- BEvwFƟ~⧿ݏ~G&P8moy~I?G MX&B#2"u:%kj#"wp¦u2K4M_| (##Cn&d:$HDӄ &z7rI.]>Ew.q?BWck5Tm E 1o6>ɩgd9&/mB2" $^|Y~D}FZޓ!`I4hQ& Cd][G2OD~]5wS*VwNj?ۭi^rnYo}By#;],rͲ2qHnv GEŒsbLҗ0 ]CWh| :@b|H\x9>X3C?x((B\e<3];ݱt:^RK x^J563&4Ãs֧Dn%7$CO)t ڀ 1ɒ(Fbd &6>6H, (>F Em4 q[\cH6ǸȵbON%D;%jdq.g;G/m6ɋ-3ڷʞCGX^:B7<݅>ds7x&o6Ȣca],,p_.)6GZIK+bn2_1. 5ҫ2wSp}?}izb\1q-M DMVh2ki"4Kz" 5"HDψjFAr'p?M/8vw}H +:RO'\9".8 t7o2;_.>O'll cI-By7m\"WAg6Sfȑt4ωG xQ3Oyꓬ <3=N2#R&m@ ^"b5;Ek16,*r,*yk! s~2;CØ١g@A[ tQy$~]NgmqDFAP t Y^ɠJƜ5+gS|F> s>bTJj:|]JXl b >d1c sNPrUErU1`EQd x'Ahs k%?*Qꐫd95jA$; kp9aHK8dٷ*3hZXR=4^G t]ĄHlv(wPVUURJ|H̦-V K$cv &h@SoӖ)'X_[du}º.R[Lf=׿6K?o\S&)^˟}5 g{\r AaJQA 0W_x:Opq01!sP4eڰFe2T f)RV=|t]%5A1ȄZX o*Z+8ݜ`2r:w$)TarqZ%Y?:P4D]pvȰ1J˴T>k( kY-YEr09Zcʱֶ;;?pzH% , sck"Wn* X\b?2xEK2Rh%.! v#uQiFE~)112 ;d8VF(!)CxT#!껼caC94k$u{9 G7?p#~!3_ay(+J ]Q㣒&Lb#O-J(0$Z DTSMZ4XGąd"aJ\%@B0b7- 8A(Z36::,xY%vCj:(s#j]VK4G ;n;4]D_9|ÚNdQHBDL`.']H̊}by(trÛƓ;,"q׀$)F[ʂhk'6;z.1Y8Z"&O-w#!d(8Ly{_}k<7!+# Iyxt2|ڙlnƯ9qZ> ,ko^YYSʜ51fX_.PU cb.?NxspGQ>~s5R}`_퍜$3 hhx'mE` #gNX e^jJINfb4&ژI|ȫ+ʋj#ةzeV.9,L APIr(. 竂rh5o,Zh"11J]+`^vs9g(WV)J9`1wh>`л٪BĎ+ IDAT$վP3^#1))W۳+p*(RoEJRABߥ(s,zrx8%# >;mO5=1;+G F%d u*CT6&Nd%NĠU(":J ,m2wab׼k+/A~`KăWylrcJ5-uӒbTc*(+U0}nn{3V( R@RJꕧ y qB0F!kGŖy -69c$v\6n/¤kGTKҚ01T,% ̮ Ý(0&P3O&kd UPXÐNQp(At1FEBaSVC ,Cj$CHc$D g5wĚgvK8U"e`c`|?P)1Ȅj)HA!hgI0#X]2,!!sx$1 '8 GSlre_w˃)|:Om\Х!V(ŻH @MEbci#^dj).8RAHCPq \^*UR"EOSvZ:P-m?P  Y&gcJh$)Hσ! v;OFX)gi""˨7.Ŝ}ܖdu=j@f@}&WQL&LY]^'_έ]^u/b~ڀNrY.\کEA;\̦GXg0YXZѓ]Ʉ s/~Y,,rH IäJЯ~S&pZKD=;Y[Yَz$+=0< fy{9u> } >d"IV$0)/786>d|<~ǏddZ%.4Crϔ^FM6;H"hG K2"p%Y54)l/ *Ef] $~- '*Y$90VqH"F8"gX ,Iah$ $5a*(mN $5wER ',Ո6FB2LE%ƦLE8bdnRt /?7z0%IʴN BKVggL@9':CaR)sz wW$͒W6", ee6x} *+ fh4 NdMIdGh}‰!8@-6WX_X47w0t~ӛ #b2lB$Q/-ry"g/՟ά!ٌ̝/ٿ`4O֍5G\~%x6G-K⨝52rzq\MJq<8zGSင C .0<Ĭi-eyf&̺.+.EOkrW ;X,(e 2q° yeʰ)Y9Xv q eM!f]h8 W9L+M5J@{Y< `ivE{~tQ;{7 |_}k1Q בnRiiŹ"nСRbD"a ÊuPe\q)Y,1%1NGEՒ4aBHYaH0%&f\фtLB,Jt$_2U7v^,n2_Gx@8QMKl;$ Z4-ysnF=*K aݳFrs`)#jMʪch{Ew/xy$k[,vw%QV q_!aJ?80f.^_iFP,V6JLS|D̩cߍID#Y^=UUC1{oRz,.T0(d4phؿ|AB'Xc2EraTLR1a#><bCʏť>?LJKq>c%f>RT8]Z+60彴7JQՉS'4y5u׆BvSč!vvmY+ƒ`H^ԉ԰r|mMX!SMKŕSPrxRa/APN;PQ:۝ʊc/-*N,U1eY XŦBL*/DTQ!F=NhnFͯe?ڜ0h2Pv,[eXUphGCJL:gzyNhDm [(LBȕ$`blI)g]:'vēGwURb >t b4$WLJhLԁ#e ;@h ,/.PNCSWƧkm6>}kyOsofyn*]H8y*nybXsi, I̓n|Xkv^Xv{>5u5G?b}QL(Eح 2.KzfA,8C">EOm gHh e¨?1p:[?~+^Ϻ@YG ãGq̭9LU%0X↎qmeXb KmdRGޟnUM0, v:F,KoVsb$ƃX$)0 ND_S>ؼ wWfvwxB rif!HʊA&<).>༧=G0h]aq)2lI (PRJ`&H5$uS_`i>L%\GZp2#]_grVHu-m޾?KK/a`a+S+ɎqFi 2lLGeJ;US]) !\H $ӂJ-QL` IU @!B%5QTBv!i(h u-/l[=Y RweD6śnC\ܠ-:wV\y^.EKQf@|jN$s\X/O憙lJ8ޓCn2O= ~{̉UB \<r<63;><{ywyC0Y JĀF WȊfxMH|=-lzce^ElֻOrD!wÑe<4$&Bkjx%al ]RI]2 (Ϋe=Gc&b)w䬥[-#˹Wr't-ha?u"Gw&)wn[><9leWÀ.'F-,Q,^FBV."S߱0s*nBT-KR޸/W޸oJC|%`4ږip"gE\2-b%ԐRĸ~H+}Rħazb9DgG+!Us:HH}4C+2b0#Ab1߃x]C@d?>'#@ß\~Ӝ+WjyA ʩ:En,^P,}8}7_F4 ]ՂAkhv#^@G#{" LFʭ 3c YH"WU X<WKN-=eQ4+W tԹ21ɉ*N ۝!.dҼOy#uWf145$.?7V0*XRD!J=B\ip!k` є1 $ZUB$` %c6 ng&E\)T#4;I^^ [aj bD&Kpo&BBbP0( JD-xtPC;8"g-_{U^ ̸hs lK-,=~[>=y@{ˆ+薄a 3` vO^!NYX⤗ԂBV4ϴ</ tih(8/Dfo|(G$14".54-o 15AlJKK|/kX̝oVRF"æ}bxkyɤ|ŔfiBߗY}+tu3h1I8PRV_ʙ iwͿ '3>()6 -tJ1bIH0+q*7XXv;dsTG")@{h=)v歖epC^|re ]aU~1u0ӈxo鬡kj#X"1,VD(,b:оK@EpdBP@Ց5IJD%İ5DMR%FԓRM1~Fmeڔ Z8ш_ 71BN~/Wt_sHRל⪽J j "0qg?Ea 5YpC7+1Gt %Xx?Lv}Kѣ nohqAyx-@ iIqAo~=/>k3+/x?PE2t}yU<Ş0'8#CÆf>0&WN9{yp 2[hAD4$L%/$pt$$$; Q#*ɤII;~Kî(VaR o/j, R !v+7w)$'`0 h݀80z.lqDw}}z-{o`!EJgش[N(<ǤA!d$%`&s4Jߪ7&WP3- e2=`s((60ІHSgG&+/ Qa0˙RxoO٫* ]B̛PԈ,H A@*JsC5&l9`ʚ0p+qsWY\䌶1_{\2j',%GVyr&~C}B8`ФB{~>x,[n|?x2\2ʡnHY3% aH0 vEe5jqX!20_C0dL$}_\ q̲QPG@dG/xbL l7czp 6hx JGg,݉l/.3qy9\GYi_3}䬚z=$Oh慤y4<{ :^8Hg$@<_730cLg\04==>s-B\ SoKI'}5_6͉]?O$; x R^Q Esk ʢMbp #g2Jv~Fi6( #?x?T唅;hۙ<[bkH]'Lbjr{ʄa$/@,i 릛IqU(2 ,g~5Tch狧1:'$-6_j7"okzȉ1@7PFȀ3Zd>O!!%2!UuBC[+XUBHbbPٞMAH0,I"l+5NΰLꯇAD&Mq8G!q8&Fzj:!Ĭ 0!+˧i 8s4ta)$z q+!w? Hh0GUZ˕'1$4MDB(h%DX 5 rTd7O;cV*D #&x[<w.beMޞA˙"qab|f݇FXg"uv>9*'Wak) xhi&~;1OVGf:¨S+55]c=L]3"2eVA-kyMOJx%HE}`GS% Ϧ&Yz %Hs}ow}/FlTN]fÎCM@}K 3  IDATĶF e3h "p6Q!#N2  h L<,5n/ADl@D-a0x g2R bWcA $4 duyG[=h>-埏yP(<9GUmY8Fvi?Y<?F=!X>CkǗ>y+?Kߓ&;ž Jyii﫹jj%A2 n8!_+'c'&L ĞԫFIb%T̂e42L굮k ʩЃj` h&N#C0a(R [C25*\)=mY_%8+e^#b{b"W아I9Wddarлj,`aW,/>j=R4tHOˊ!3abhM .RФ@FOԿ㹽caQ NMd}$}+ 1bτE=w:q=<$JMdaɰbX=0Fc4 )׷f՚)*:BrBa^M>V+TJ1K#NX19M;V!?}"g_g+bwF =˓ɍ͋m5lS\r[E,/SNׁ_;[-,..H"ynno1fլD*}U9EvoZߞ'az%QM4-pvtZ2!!ig$WRA7̑'xÑP 5<;_KOqW2' ƊuchB  eØ6 XCr;BEzhiD!dE {8XTHAhR!_?ET!\t  ڀG oǜ>_ GBM1G:pA84WW3qn!O?S;ĩ 1wsoi?ʓzn4a.q'MuEJϏ:k:}rxjsӃl?'z|`JFx dge /rTf^A:V9x}cc0rrҸ!B7n\wX&c^Yq;ß?7}9i}{ޘHriY{-, FBMWKG&+:s5-dIDi B6WAm.IY\~z-ͩp7fg܊,jMbxf]f*^m_U" ?ynno0L|.D4*U!gV^(^j2W=v*mqijjs  ?|x]rF!KM^ca+S(Gפhʄ"Wp_$2AK$6Ȝ|N$ ֣#]P/,01B%Md .t=;q:Ö֒2cʝɠc\ΒF/,D Lе5m8!{qٺLB0-@`С 6∩! I]@dHK[0R@Ѐ%fHN#!T/)tk1:!?=w&mΓnv jO\" esrwp, #$VC#[KVx9~~*I=%!3V,~\w3aޝsiW96ӝ*}!=Q9 #NLC tz.|g5OP/ e.Sk '@ n"}gW?s |I_HLGRg"O;~BeC>x /\\7N^`s!s |w'G%o`J|ϗjV8 ՓˋđC̨eeKY*g4v|3=G<\Kwͻ . +g~ꄣZW f kcx^Ǿ']Op7DxR򤋬G謙@'r! S\w2O49QMC+cn%Ν*9Y lQ9><_0aR+-WR)FH-~bՂ#ŸH& $,dz9[& ވ}$>% #rWN91f:dlZ!?UV BlId9{ Kww{X32#ʵ6UT JHBhiZ3`M tۀf鱙n f0fh4AhCJRm}̪̬\*#w?H?_u2,2ss|D(*B9TH0cc脸PFqiF$4V[ۻ9zv= f%M})8M0wAsQ$|')_`o_d<=i+ZD \kרG$-qiT C# (d2LSӆ[V޷d {AE~jK_~צM:+2dbRN 3y%bbQ>F{`~'>P0*S? ϱwn =/,g+3MOd5˰&H(Xm@c[U9bT8Cf 5brwodaxUtFn!t[0 fڈLѿgOXOa+ːU\"-t#&-=%p!ha? ߼ G[zH1ċvZ"V#ΐe~ܢRm*mbm^ LX0wvKl>"#X3ɪ;PKR/rA S#K c=Jhi0>A&B(Hbjrե%}}[Yfvv1C:*¤b 'w 3ʰ^pV`>#c#+ 6VVXGgv1hr{SX"ITB݀$F}FV$o#(ؓHhorn3 ]v WHRIR$Id*6Dd \ )G$q̗)6>8kF3hYjJqwz~hX!#\Ks5iE`lhL!dTv6"\^KIVw+;Rqgг1,>(#| , RJC"|JJPa'Eq^Fz_A\jhI mw)QzPt*6Zݠ]9EcZ*RȰɦe[ezig,l!_LJOYieJTHBZst&j"]"AXhdqڐ O,bW\.k&Hwmp8B3Æ3-rI7qC␋gNq #uN>HH737Σs|lt3N$J2*}9q&Ik)&VxZ`d,]|ӋO1dJf&5UCG]3qQ$X#da*HiP!ooRzGpn,.\L V~&> _;I/:v*Ua(ОJERmVz8Heh:cr,lZhp+0/o|}R,RҮ´܅c$dWjB3HUDi9}5#eC[ &oðx)K(t8ўhgxrFI]y"O=FX1!V Dn19.mBTZS9&_~? jք$DI.*: 3@gc-Q^PQLM)oQ*XsP*khD&A%Mck= EPx8*ϭo|TʏX> GDd=:RPMcN)h#tN֞Ǐ={dF<d.g2z'^|}kr iG(5ntڈk߷#80qm Q5\0h2\`[*1D)#AiU~Z|ƋW{g]Vk E61Ldk6"ǰa;?^ǭ7Nno}ޑ F8a9٦1.a1ɰO5n+-e Y!o"i4912}G3玛Ztu&$+."PNZQIǐi`EkgqN" oiMɰoH.2-"p55RxUcdi4t䱦JL14EY"_=E*̬2lD8iD8FGat1UP†5LtWO܆S (@,QRnz2 scÏ#B8Ī"J%p-$rK'=T!|$`<>5N*SCDS,3t%vrƥ4#fx@+cy^6| 7{+ܹ}8{H_A9FH:E<fb"1,XeArŠ Z”x6oFzK2H93\5Ɔ,O,4:rXFhDZd %w= uLY^}L؉șg`\vOG*7KoOK=BF8B[lUΈe6XCk`萩`%nqr"< ڎF7_8~_c$湩f_Xx[x4ecC~IC֑$oKjVzU=s*! w&Hp-AXƭ?@&Rnlymڃ(!j2n+~o8{_篫 ;#LC5j7IrM_wd6%M[2E$`!>?}{ZT_0इ_%84wM"k g|Ys]'O/Ż{TNTBu$btxcG402#1s5ԓn=GpR9XNͰQ?ب|31͝t.nZ6"ش(SMRYOp5he\˼){ct$˹c2*iA`(;@)$……nU)P]qaXDE/Bͪpx\A.[Y\ZŎoK\?/~y*,p_z1YFKf&Ļ=eŨ-v49b636IC.ee [ώ3r.{d/CziҌŜIlyF“ %5.Hʈq`IW1{<9"scy).XHZԢ:&WזЪI]6t#SȹAd|1Ͼ}3㱯}ɩEjx;!TzAARTQ`giac%BæƂHI&aZ<1$xX_4̽׉*N7FU=ri&w"kE }*;yrU,o^Bvh@b:#0>r[lɪ֫ sCS}v3Gg TeMP)6XRC\xjI cp1?v#CfgP=<ӯj.r`2\SwQ){6F.c~j{: //8۪*Oy鐍fXVry]S,N&DRdNuPpsc)T2l;HPE\Z2ɢjc^~nSnB/$5H)R!T֢Nsv/츰;7_'5i"wKH% O"F)R"GTpN@^`1eB: .g : ?DQL8[EAΗQ, ,8r KwX?h^Y~71ü 9|wmk$_~.V\m+FXrAG5i-z&EH'&]V$+T-igh_!nEhטݝspl*9 \RsX!b lgLSNFsJ~c>~7z+8]88=d ש:i۫mƜr< /\Xǿͷ܉[LM%3ZG 1dn3JXoELF ,Ji(sGNF_ITԒIU`Y zW^}YgFM<\f3^Ν:rg^WVx}A>Z@Ոz&FEhbMIŭ\d˒rjBY&kL_B4o1n ([EChH0K>~.(̛'kKUKދ9u1 6^gSį,̰7Z#f1lBLM'(!L$' u =ULVb˜l7)@PXEY^[Xb,4Y(;Q-/^Ea"$Ry %Q7<~\ďgw e֯xJSr4+TN~5E,吸_xNl/L븅W?zk}?0>#6;ERzr RÄc]ѝ+K Yv=Vn-x'|܄0-&!lzYV3%I>@^lI >A$RDNbGsz#Ac0dw}3ww$}3ȝ BEXkIGCF}CDL{2bKg[w*cdeǬUtFCI|pW^Qp8W a:((ZJzq0r* CFShV^+ j M6kZ 9d~ z U2(%wŔE}a| Ml'@c9qGR k?sӜ{Nb bSS]N*F_cpYQ$ 5);ՙSz0 + 9dD"ţ[u RxJ+IFI_HYo2Z| salQjIT'=t2é>|^=vX=ǒi#"R)ؔ$rDަ]L^8Z'6h@P6V*ԻZȈf?sVuv2́ΕK޶ ^4^ \Ҏ|d %@nςvCK2e3zz30`Es< +m>>YqaVs;n0TlJS,ٰGSN2jˈn;OgGn|pu08Ba[<"҇tzW&E^!RRHIɢp.?Rgo)+H/P9ۭI⧒cDCQ(N|0)%-hn 9-Ci}P8"Hbc{? cnG_)ْ- N[w}EFԈeD-MPHGDC}qY08"0l9[06bB&8#@E|ZJm >HaUa@K ]](!B:7ӠAXo$J9lJP^eAA!QB^7{$^BBpHrAp'/P¸4_g*d|Y^hXDa.JM(Kn;kGiV?.DE[Srh*΁:oGc4?lڳ vr 'e6D\#n4ݗ!WI)\=~zzU*'=ZO ah:RHa6s:tT RU\E{7Oc '_a񳷿Ӄ.o 6]3LMo&X\aFrAy$Zb ÉoFƓe#Y p2'qJIa%CXo 9,9R$l0 sLEkKlcc۞][Y7 wKm۟asͨR=縙=!lJmB'T:矹ȫg6=b:nb%: 'g260{ӈƽͷ ]xj}A1eJuQs TǁZkAFڦ߻O$*kx,Eaf8:{yJwxŦ0<@=YbAڇ|W щȢ$"v9"N$VNKvb3E6y}O}WMWi4h,Q?Y#f95: }<>QA|vQvp>d"j7D$kUvU6R۸FOv1")]<0W\OT^{yC;'k|Wv?G s+mAx#ǚ٤]+#HSVUE>gO'o>ownr,c$YMR? U6yj 2BLhByDsua5Nz0S*MCi`C:nԻ@ (K1} u|eASAD`[%T7Cі l|_RbW8Qy[ _-SeR[n;=̽PNcXQlѣ:'}"={],D H1B ~Tpo¾7 0tp sg@j36`9A#?o/ ^}K#/f?)ؽ?tgYf&̒t= *CMC_IboIAU)1^h"r!DRtIDoW_殣g89oņR+' P8r'ߠ/AgW=Ҟy̒['6̈c"U#$f^E+\p-*+q( a42iAs 5 YD)P7Tg/3q;ڻ47w2?JsK-GT]b+)?ҹDcklRt#Ŧ~04;a\x\1fEec52팪I łplIXX'vrϭVo]TH6pZR`߽y4L:Y0qD_Oz0y#T eL[-dyC2sAOyeNxDjD!S1Pi`^4g9U ^\Tk$;z\RWi-R݄aLւ݅c&/As!>+qxhw3ՉtT |l+ yNiT-у&9fН|=E3&&mI..OrڗIqȱEw7I~?a~ttf#:3&r|;D\O`'7dXg$Me(cV>z8:Uy 7n].'O.~\㱧5x `F%k!h4OS&[u*r&Mq=InL(6ɩܲs\a->O!g8)ӛJ@CjH1{S[;ޏ 1.M?<hwE%ߢHM}QbJ/dy b0cEʈq!CmQxlaBcࣜ/rm]8@A{?R틭Zo=~MJ8SAv3.A7Q $pc:Wh:(d`}~~ī*cd8 H_ey$i`ȣ-u=1TsX9ϲpQNPBDBпTA:GbQ BP;ze%ts'ЌYǡpeb[-B(HMepvQq`SPVChK2&ȥi*{ԽBIT>F+zXvJ%P)9դXd)jP.gUD})_c~CSØ~`|lNrP52a#xҋ3tCMfD]?{~=թؤ1 fy`mu=m T _ffa#i3q6o[ӛ/[v;ش5F :9bۦ}qsޑ8 5R:oOn'3 Y1H[|3lgSus=.W<6dyNM |?KN5; \wO3[_?\O{8}H؀c"lT#bPE., BYAы 3d' bpdRr{b;O+% ka܄86oF_ !w,HR&\TF ai3ٲƘWk@rfgIc{~`ů7ð\#uOYqL}T㣾×;q +*\Q"sHnMaۿIYͮˑzr_d\61( F!88`X$~帘B`Zd曨Aڤӯk=h{ 5 `ژH ԣ +x]lZo ooDޑp۳.2u\f#t-6O"b@4L\F?YG7_ݻwL`mZ;b0f1Wml I6}ħqnڠI'@6m+XaM[+H`jD,OF4+ /Kpmŧ@̹pć&v|3fZ/sRW^qf-ے4%Gu/$zFaF2"M0{'FhSyb U^^tt3O!3MIr.Lr|՜awح=ԛx{o])7<#zR4)L(^{ү)~zO5=+P(pu=ϷylHbeJCdbeyA<=|R]Aer,y6;e,è3eg9ޛL4_ෟ}7zST݂:"u<ǭ7Vg4pq 4n,I&Qf 3 u RfL"tc&w߱pCW(t&h;մȭi~XwcJ!h9T7:.^& =5"ƚU@q~wщ +J>2 =|$wT'kx~fDT"RBo.t5y[9tBPg^(JȤ[`cT쒨N-f{;}q~&M4풕1=ccde[ʻdD4=W/,{'fXs8u\ZF 2Y"Q6 m,N0&%| 8N!Z. $ %RĈ>0Ndh[Xb>&4t"J'$%N/&qh4wz lq!IYnuX]Y_={sGegIJ5Džz+G|*c}hU'dWRB;1־.3 mtu2 W!u ܈j)eAd\e,Vk7oP[J#j~r 9{L[e$lnA@?xߡ05b3}[ⱛ C? bK9nsb/dz$}[5=&.cM͎V:!r$gʵwcQlMX;kPZdY  Qٺnn$~reL?I6[dli4 ,+ra%Ksti@ y"bIEj Z![]켧Cyٗɮt9aT=H$9eXwC7~q,D B&@FT]BZ~#zܸ)J[*^J0Ne Uһ':^}x?G ="s淹㟥q3 _L#dC ;|1?bpTWfC(%yqxqž4U )b2AL nWӛk'밒ǎHa5}i GeoD>%dHt>G^Yڪ?N=J5GU@w:YȻ7=rC0ljՕ2VDb r՗SqNVv8ӧV wh+hgBhb*R7aæ1&@/1.F,>v7>H^} Ffbv>8OΓ<"1_/>ǾBPBtpzvi/f"r Tl728L< 7<aH c.S_AhG+K G1Ix5e,K;Cޥd%]$[`jΎ ~A!{;/OUuJRX!ȴII )73A>feA`l.]8K8|7;?l2v{/12mHa,laN#qAZzG#TmR,L*iߙO[Y浓#Gbbo>8yDS/+ZS9u]<.l8ݴKtU{s2);(hF8O/5Gvx{&㐿}ņfd?-΋g)vY(Ob G-yn6Se8:ֶK(`[$jַ:463;Z\dQO;GRniכJfM>wZn঩ަKlyu i7ߚgߤ,ۿQ5h-Ħ`%(eM-gu ٤ SZְw1mPv_rH̱*r8Ŋ7.2!k]1c5M>=n' ZV:C8]d 8L!LRH&0~D |:o % ~HkAe[6sp#vnnyR ɛ:bwV Vw ߊh zXpeS ř 9&wGw_=+J$آ_0Ug7:/s-.>;-iP^I[j.FdT:yRM$qiX%J4fazv?q<-dQhm݃55{vQt0% b@}fӯ q'ۜ1n"NFoQFJX-IR9;..MHKJ()X:%t,,`cX 0Ԥ-dNEz+K <6?wZ3-Hi<%PvA~R9h!̳9pA69_9p~AKIFJ0R9 ml!I#Z1x 4 v }tVrnv ޱjnK0D1۩3NЋzf;O4RBh5Nb5&}AZ52叞|32n%w0INȖ+ S7Eh.D2.3SF*7vle vI(xgэ6bm[#S7u `tz#?3\lR] ؗ^=ǵ[׊Laß3aŋӯs3CJvJH}Xб"RK!06TZ6c#3 q,R")  oV(9O{mpYf0I$^|=NBRG,c(xCmM4{5NeRt@ګ\8C ^an׾%ȉ c$,'>Uǽ'45&N; ͐Bv20"/KEqq=9X)!=Ҭ@d!e# ߄vC+1# j:KLWHhw;G(o8l(fBJ^AY_?#D-}ȣq 9pW{Hċ6X>O'WhVNfU߉QIqt *~aԲiaiخAY6^i|'zѼl#* ̯c*&GxpBX~[F %1m"I|qaS&¶lh!#Ӵf og(:>kQ6Hkyk1Cs<HG?#a.:58S=weu^{9v\gt! 8 Y!_/.`5AO&FuBJ=( #0yhЉ Pzg%a^sfd2(W  lx %1FaI>hicD #H"ELoe4H$p!%M]՟B hT4.BhXH*K[(K!# !4Ӷ %#HC Q~k`XA!3 ytA&-Dυ ZJ4ƶ0 Rp lY_6Rƿzl-ơo}'MlLVe)q|zJC<02F h䇇I9ά.p-S|cd^bǮC8:uV.a01&`YH)ELH 6GЖ!RPPġŐ7W),ezTICkaf'>tj)\72$s/t0}>ˣ ]>JhVn N> aCe>41d5~rhQq3UdzPf5D*>6z6zWX1&P)G%2hdþ 'ʢ!]M fRcK&4&tBX9X 6LNPv^r=ۓo^8J. ZCDhWPeNCD`2I,,M'X1_i68bc0wET* 2)фn|*]4FEv/Elp_<;tk=8ͲCS,czp#$g\Ĉ@|<`L"0X#T̘M7r):>5  ">J#=Ln|8u^ `Ѝwb݉lMP,#V!(Z nLJAb.auA'9 W]r]QOT%V`eQ+׈{6J +A8b#ߦ /"UyV[T񵢧mb\[Hm [ TERV mFO9yܗcip z~Nwd7E/1bO~(n&ICLYL1|2UVCc1Xp[{g|uGfTz7G-Ɲ.-iZ.vq5y=H#~'1ǦAƢ%;~ӬVi־woO\•BW+A9[Kӧh͖gtq IFY IDAT! TdMŵ~~?8#nNlҔ@ o1|Y7!,4#p701#u0>I %$[Bi`k,*%SX3X;|z=H9JӈFKLN``_u6$c:]&O"I@n%&Veql sPY ASucќ>u7qe&7~/"/_gYŵ R*!Morx1QLԍI@KA-Di,&|G*k^]`ԟ C&T!$#-5NP[;pQ%V")׸'Jq4Rsk"tb1)_ў'GsQ+IwA[#2EpFQ!{Ð-@4Y"` u 71|*TJm~MY)M1J[Xy?I4iC@g9E(K4"֤x(a0*ETZp,0X&f2hE?($Im}V"%,Q#U@:O'w/}krw_Ly[H ]nԒߥg0v Jc wC6Y &@274F0ryisPJ{ Lӓ2"Y[blwyEB7Rp(O*uJbX/D8 op6'H4Phv1KH'K./ Db}'#]pYL[{1*fё!xkw T qqz&+ ^0(p]a:iH6ҳ!4m- a!K3qH*NL8ټzAru)?AgGXpQ3=&PLڌz]>sW%tqh?=ŷ;qۯx\~﷦EωckAymGmI66ڐX\RIJ'MH1P?uElY^jΣ館,b ș;n`7Xn?r?KvulY晈ss Q Ha Щ&M R$OQ"@laủetF6-d\&Gp K6nLFd6j)L#y&ޛvD)=6Q#It$`jFb'麗K 3vVcܔ=p򛊋qӐG+BOp Lɧ-m^ZgA]dT s0<#<\/Mֈb @'ӕcAˣ!&,uU $\RoRu;5LRu"8A&*05I\ %`ehҬru#;1IELb'x&ӯvvǴor.avݳMWc\nGfSNma*q.B(12)Ctz s`yGx~*v\Y*'|mT/5V}7ιkIx4GBatSP/fnÆ S&sWI"}yE0TCTVNrs˺Cܠ~G}=$gԾ 췛<2}5fЃLf/?ͫ ʣn1n$.s_~c=fJ,_( Le>>M>4x+/1rc?(LJD!e d ne:_,6m׀$cXI:Q,vxj>jAL]z?M1JĐJozAȄ9x,GL\t4\+JLL%}e0ܻd a@/X>aB@"ؕt8SeЉ!UTխ8j5\@hxNg"k8!06ZD9]%R>'\UG{l k^2vHa8A=mh/xO)^YLhyɔa cYP+a Wֳ12TvDm>7fw| ucP{7#" R{ː# Vj5>J7C+ |&,A<Şv!ڼnGr"8Mg0Mr /Rj$HܒGj> 3e2`  S4yt( v=VҊA%!io )h|+zJ햠 #DJbdilw}kЉ0kbz `٘%iFݏ9oxn{CdY$v\xg1Ur,MR7p~)F կa+%OZl_.{4=_Svv#mjjvU%1$hQ0 I LH HR H,H-'"MZO|] JX[[ě4' O>rO[.p)LgT'xϪ11iS0;_c9(`.25<8˭Zn1wk{\>6L|$~pỏsMIC:wm4ĢvhI ׀֨rwY6p:{SPh|+2X#v'Kc+݀1G- άjCM-D mtU-mҡ +Eu Q:ѽ *CC%7^Ewȑ\|ة']%xUc w4xZ6vnZNzGwm2)Qc[]Qq #F9S˓s(g񐳎5¿i[Do:(?|pp%i{B#jhgIAA܍g8vO,Rzkoz-VL }zz]]]lqաwQ]wwyKgee־IU%KK,lyY f 3=t{M7m C`nll]^%$k߷3#3c}Gd!!P9ˋw&]-j]}x cā^քʆX\cRyZ[YVʔ3|/v@ISR4Y&1"gŕ ) ʊAAXKskJBaK`3| R( +bHjNTZ@@8*p\UJb5y #P -,2ʈ&8Ӗ!Ut3Rz)ǟQx>Ǵec򟿆r)2lM3߹*'wvlQ֯e>BD"ո1%̒f3^ތSAV.A5b|œ&xzxR1ݳko8 ݌ͥW7rM_A,)}!~~됟r/$#G|IednG$0JCbu MTt)PFcC]fyJ&se?Ǹ~FI-cmS\Q%0\gdnkm:3V6S,1 ]Laou~!&;v+ok[Fݤ%%K %cU`6Mo]߷Ne%L](5lnnJMO*nJM 9T%hΣD³ d`~ZG`&|r J:xGcVco abBӻrK'ݳz[pVL>ymTP6-Æ=΍x E+#n~oFJv7r{q 't b[4$+SŒl8A q`5y3 BjBJɠqxV mCLS$"I)Ijb場a]/0ޔJD:]uJ>4՟7O?EkwId#|hK mQLu1\.gͣ<퇸.Y"{א':)frfNMW~fGv x-S{2Rc8:fq.bW| ω]^6\ĺinu3}f3F }T rH)#|_; - i'Xj/~vq 9{ ^Tr`qC&vPa3΢^ jP{,!rn31k*cE($CRɐmnS|__F ˣD :_fNX X,Ċ~1G_/W1̆gHYaUXJ.LDK0qFjӘ s 5F\1c뤌 faQB6D c$GV/)phe@f$2Ew '2b㐶RN hűHᤄgYCZbR" _' EU" -֏ ـ;e0͈f^NmJڪN1 M&NS0.:ˈoYYnz3%_d#+&)~TbQbSZHKzߊ0#Nvz9r'߸cu`J D IœԈA!P f(k0;*Kb;h&dv+Y<[0d F!)}hkwt$Ppv0Sf (4Lz<(%X?}16^odɷN@0Z(kPYlmG*[N7~!! mJCyu֙ З\>坦)WFaL7gqG/n %&>MԮy?ϭ`7ޜǽt=sZLxdȡKf{)iç5f͍P80?Ķmҝ,/gRl[iz)1=cx@ӮT4&n, +-BRe"E9EHVI*K.}Al{Ǿ7J,Z/<b ͋_ip42H+`Hqw^[e-{\`;|-X]i=w^ş?/w0xN||i85S ^".FJbM04EX h!"&4DJă~4LcQE| +A5PiHg=/,+X`q=' ¾d:r5C2nRd3EJѢf IS'yCH %dZQESS 5 +juMt&vAd LCpbEx5MRp3 Ma-d:c_04՚(ؐ=[ܬqO8Gno\.G)O2r\d4e H#W]JsnRTF'N'J)=R9h/8$Vv"H(xX!R`lFE QKdT i D;vu&# !C4D \E87q IDATάbin(5_<#+8 /8 ]L?vnFE^Mɺ1 L햃,U$7>|քCz͌#Fw7ݚ U6}F\\/^iU2s'8u?Q6|c .3fq+.}Ԑa"QFb B C @5H1XA X X0B b {122Z-".~:EVR+ɊD`M Rcuݑ=]AZlI,"T?r4IآRC]ZLèSK`BbpF:>BJXƪ /k3:lvc4EɬBP8A W"az=Z -1aSƍ-R*D)^Qf<~хͯ[)^yS_B`;g2q2H \,nqk;mL_ Z*/v MH PxD3KI1CRUi(\Jgϴ-aY#/عW $ !eF*VtѴ` #,c.&v]HPb% ,LhM(c<-1yqII )5ȋ#.XdZx0ĤD Mb &xBHu@Y,. RH-BɋB;`tVT%AHE@&")HmPhL+0 V8*h-jc`_AZI@_Lmuy¾Jr\e'9zfߙw}s罠xEmҳ=l RX}~Lxwl kom䥣랿Cvq߽S0+3sz/ys uY! L*' N$)2$ 21AcLY {,@XaPL&1V"T68E 2E#XSƂ02 !ڋ'V9>6N~.2H%r0)dV`7M2)#Q1֤!uA  ;Z Zhbw`j%`a@Z$%-H@8H`Ց끕H+1hȰ O D O`-kAfH#!5X,Z)P Bc4QAћ-_7R.˽L$#n+HS" Rf,d)B@ZcA ^3XaS!$3.*1V#RIx?|&~:{[_LNQ'ե 4wlFF08 St+>)DSb S (=wIʚJ4JdRtW|V2=׺ vVoV| UHl8%eFGfp^,I$HǢcC)2bC]Wk[t/>'}{Z?1ogt^dYnq(—(B\!P{ls߉EjAf~Ҥ7QIJl^qmA6Iyg"~|lq&{L#,i@&zc!P d@Q.HDIO0eUBTm <,b:B$:kSzu F'KPĔE>ؘT@)SB@/Ɔ&1nq':]枅#̶/G,7 ~Fgڇ):nY?gq!O]v؇pyD"~Mù ~hnq_|7 ÎϳSoc~~Vekca$}Ï>u9m\ϱk] 8玭4N][5S͛לf{;,ܩ_cCwoeluO?q-[rDh,GlS|cxΟR)!яj6>B4FwǞb4-3 6g,aOklzMrmڃxy.5o}w!eg=*BWP"&X=f}!$:>Ase?Hb?XXꦷu~Pa6-=@r%_V=jJbN;=䘡c(Ε9YaɈj1}YH#-jǶ󡷰kcfއ-h]n⬾ K>\ɛ ټSnݤu޻Xfۚ|J2~ˏmv#6kC3sw!pO7hW4DZFB02"RhEײU,(50*~17g-NVMbSY5ݔߖy"gczw-q`B9鐙?U}޷Ρ =זyOPvCqhϭt9fOF캹F gR+4f4Y.R$3E;[_&+ >ϧ>+w^A/:p&I,q:L:$m,1t>r4I'+0duY A|7roX`hhcC,Zb[y;vÜјDN5S<6̚ůN4gn'YkJ1k5z1L+g|bѥKAYS?اIqE140rk %퓮-Sʤ7:#m|䝏 kǿ%*}qS+W2>`ץQ6t2ZBa?bc}_*2vSBuCo'< ȢEOj+)5L^v=@9 MoGVT]14Yܠrx4Q=XPh&p ڂYHbIBmJ...ʩ)EX3;cTZx"bR4#:+n3T-EnII23 HLȰ0} –-Bnk >YĴ$p`vgAO aݼ]ZqCǣLv],z |CsK?MT;>nEf=?_j33Vj=F~珟sMNSZ{'%*9>$Swԯsһk|8Ƚ'/in~zW? f|dt_j~8jw{ ]p3y}C?aQ[}Ka;_ϓlpЇyvIIcˈ?L3'S%o2󭬜)1c? g=W-\ټI<;Nps U8ֺf] ƨεQ@:KnڝNȎor:B}v὜_<MP.6̪c;g>f2],mK{ה7f(Hiף8LQKhOQks47 )lԒ=o0}j}te]Oh<&i-.9R7y,dk\aBG\8=ͦ`gt^ɜ=B\`TQ9cU➥h"2Rs/Ij'(2&Dp#nCS3z 'xk^bg2eepaVwBs3/]Fv}%d/dv+:#\ߧ ֶ -ι-Ǝ×c!{Lma~#ŵ0FBNR=]iYwp3s/0G'^{ď3#/aem1f #>, :h!1.}u{ )-GLO|E3SlRoQgNp bk*dbWN"joCOӘ>HD &+*>k6DBXА@B4Xb‰U ذes.֨پƾǖUg~$1sOX^s22Jʱ;hOE X(ZHO:1gK8;XM'WV N}}71u wdC,̮3-88&s m1t-[ȯ[IN]\ z?\TF2l#aۥ۹y~M\}+i4+X <5yic_CO:2yV=ww9ߤ.ݥY={rXأKؒ F`Jxn:92$EV45WyF.- HaxQIŁ^MXeK@lYQeg  ki/14wq]TWezq[kg?2ăQ-lIFapӷK8"avfl|uoόr[~6 k쳜`/p |1C\Íl렳w>uGhWx7^rʼn48®'2uyHRYZ'Զ"evuIN8P5('`1DxiJKxtMQ C\@e۷f3N T26eGbM8s8KZBTecBSI W⑊QP䱾d»b\sb`(f_hn͗]p\ 9G,+xSȍ 8YOZJLd\YFIR;4!S;ΘM%ۧuo3U+W˽^t!: od'A'lC\.bVvDwvXmnX e$n3h9m"Bj2`ǭ}?^G.SmMq,Zbkܦ*ҏ6O}:bC?30:m̱VCGݐœnMS1+N#Y`_%j{,WR"i65SRĴ.Q7ƖH/ E)L`JBOg2CIl_z|4U˧qGh/2U'+R8fqǍb"=D\gM0jtN=ŒZbVv=ڲ׬-D?~=:5lk+.L2S΅7_㬞NR5&P hRC]J2Y&P"+!̎#ePZfϭQhh*B*M28d.a%Yb}C(IzbY zeRB_rJjx)& .7 t"@r7ƴO Ș;pm'XCz ,Q,pzD,:Q(Tf(_S&)}YΜkS' X`gvoanWIfY2UQ]T=c9֐81j:g揀|>4!J/* G QĒy6F&tQhʅ'EFW˴;M n ϫbE ҐڐzdF!t!Z8%Nlz2@YP@!HLRЏ"u Iԥw(ec&R2QdrzCF6j<դRwVZ\ hd2uD`%P|Q8P#,uG[>!eH vSrqHy 4VĽE c!ؔjyEE./8& ;8ej]r/KЂGo<*6١ o_M+tB&2$2Ba1Hq-Yغ42eDHPZ&(%Ur뤯&+8jp*$!Nז|2$%a!3q~AD(J׼Ͳoa{NP G Wxo,b"GzK`|zf11 #Dŵ! DKbE?-s7G &s̮I'fSNѳ7: *eB`F]. IDAT$i[jxׅ}l0?JIߖ̿9Ktz㴳"~bRB\U:g\C5̈tRRj*<) O&WulR!WbfrUҒ>JnXM14%]$.,'*b]& F7w<O`~p {ƙ^exHn^*DUŀ#٥h6A ^Eoh)qV+z*1'{;q=~ga>>w+_f:F8e`mEI| ڕ:#H48P0 ]"-ubz:FxA|"*3p%ccKdUDG/ ݇T #$H(IKd G5·wO~5='qvDV؞!u5b̕\X5IcL܏IFJD\"%+ Xvexo~~=K$[pu)N>8> ^6δ)ʧf_=ϝgCgxYԺυE:Y5T5ri99--' <ͥQmW nK}oY"F`:=p*XG5HRU ŸH) ]7!` 4-SpJY!#~xnFECKDvPE!RE'rC %CePP AgH eM-ߚts|o4p@%Jb"EC(Tʤr\]KSQ%)d)%Y( F=L{k|h| 6J8,ωF)ƏME "8ܠ}D$g*8?&}"B8 Qr[4ʓ+#%\6Zܽ+i|s16:Ƈ3qGMmn-~j |h01^W]c[, E\[~ !Iv%{{@}z0s3OsT9>A|a֜yiåT%*pㄖ4&:*8!޾E LO7^SI$5^9Kv4`0 r!,9D賬rgLRjt=V|yWE9+09 OhzVc6 4 AspY3]!7%9+m!Xd7~vE}twn*Xg'YoyoS 똿zLU֬gcjpl,($*m)uY]jzт/PQ[W= ІH9{sQXl [)~/鈨 n ,p460$ލmrt{̩=Y!OYM'#Er8Etq\r.b0LF$O/eDA%` ɚ0T`"XLbjɢ!@2wtg"%LsEb&8R6D69I!k.iZEHiCSYb(mEa:i')g_=_4{w25+S$xmrQy+O';g"<[>GwAr>`iwǸy)V_F<wK/,O/+%.'e/s7WՀg0!IRczF1^8W¹g/?Q%RWaKQJuPx:At;.X=wh ?S_)޼i/yddCUxhF{(hQDhQ4ELSC>;;풶zdy@zR{zfZcӴ7uFwR7R/z utJ Mqܴ[1gW{Զϧ661FYJk|-/xYwYzJB>'iN/uF`VP);L/{|Ⓩphwp+SFq GP NA:eJJ-e vBHSgQP-2ͮ)E2Wx~8s\a#[ܮ>07f|+ K,}[aqnoϙZ@gԯ []c,ma뿋F7'yAekKy!rj8*ٸK3j9TGxP((ˌI N<=N ‸0V/f#N#ʁ1$u@#bla kj,1Y@WW)/|:P[( $'g癤6)~I'@xQlI=`&y5;TE[تŁ4r?짜x7(2˽scL{l+"ne!B ƦF,#.jڡ%KbTh.R5xѢJD`Z *O(R;h .gP@|"/)CV eAD^g5&&PbG$6UDeb$D<(DԞ5/EΊ_\9rFwtX1a)LR{Mu^я}w0?ε3k-Nyճ#١蝥p'_:wǪɄ3㨋-=ޚ{qbD - G&5oj,<`n5|mԟZ>*LHb9TJб r*;ޜrfN%{]ۦ>}u5FHh/Y f{rj/m|o}6_}⾳1:xچ ;)ϯq}N&_˯Ń;<|xLhkNVlAR[G-w# 5˛}6Sꄶ2i;|kn/QNv,jKy:d܌I=sP7>'9E}ɲC*I&փL+W~)-㆝of_ vl.tQR_ " MM8< A$'#H:0x-$!=ٴQ]t[ !hwҒ"܀?cg&*SDTĊmSYٚ~CtN4& Iicg:ƩltO{TzfIlr_!o񭄢Q$vh;XINV$aS$ iГ.,Mk'9w$G:gx̠9C#lgQI0$h$L(>>z%ZHBЈ'$q4kq$J|1&p 6)1 _P-Ȟ(ݥpP%Av+M)'o;?Ae&v5JClDkBB w)YthDI*3B Eqda 6oOorm"^-Ig MĹ%XU%-Q)EUs|_3>X v*[Ud3T)S]7q|A_y vğkO_#HcFZn+7)ҚJ}<>ze^9.iQoNЏ0e\p-[g~ְԶ 9;Gg9J?SUw^O=76oT1Q^PTNKΈupCg;ƅBAu#Kc<-",WKJҸ`T+ؠ <XQ6E5 cHkQH|pjsxA FJHcu@$kb*OAXkSp#6 &{Ap8,s5 IDAT^ch<$l \A&,Ƭ7 ?ws1Q7a4c1#*%\M($B** &'N0>TH&C" <mh-fN`E,A$-tA8[&LQ`zC2f,9֬! K7.d.1p]aӹWom70eVN.zky5~رy2_fs+f(zQ1ȘRo{qS(Ec@%IfL d/i),%su$o#.x}ר-e'\cFrV:UXQVi. %0\`M۲cR57̢ A_mжRXK ОЪJ't.Q.#CƘt& #$G1]̗oS\kxyO$\$h r K(GZxp tJl=OzhGJO*}~,qMN8%5܉‘<&0+8-N[\|fkqV>xaжYr-,P lژu-7aG~ {t b37^4B m8Ka=O~S5>А~O}yCnWBv"Kކ#|`h1a<^ZR8 u EKe+& t&[[(L$2h%砘hauA/VԞ*󔅡Uڅ(_$յ>fOOEεٺwĝ[xw』wxs]о9,1p=mf|qz=:J=>-jwîm;/1ޱ3q\Y.6gys;4cܔRKQI͒ ZpB;k+X~a<0D*Cڽ}2]Q eEweI*N)KeeMPyJ%6x-01 HhB|ŐVAVAQɐ)bq?'E*"I&Ԥ*hIǜӊp#[tT*fMI$}y]uBis8-Mr4ܠYf{n_GB̮m=lg|?G>4y+"}dm,wZt:FVi1MQw#VH5Iտr .0 ~3{,&Qx1O\8`FWϞ6q!V]M,_| T5.t9[pƗ9?r?}eƖMx32 1ϖ)g_:Iyo ;w8ŋ1'낷Ww0("ԹAb]d9٭%sNTw(1?0d6(àA>@"C6:)YGY-b[#_QxDsq0-Nn.*v﮵LN:VG5ۯ9p~'bG]3%^Vv3o~y,a6ge5Ҙtby]Q1E.8}Ȳc,}~m -x*ǦL OQA{(Ĉ\y P9Lt"rsUvv n1q vwZt]*asB8nv婦II l8v:(fcnXi`c~.xϣC*7x0nE|<(:'1sD}nOs:,K(-^*B)1PA qCh"YawU!V^8 xW z;9z@" <]mSDWy*+).9=) U"ĉh#ԇσ}\SkE-6wY{;<%9l(.I($'b:G[ߤ،>0\·=q(;pTx v%YNI[5ߩjUWP-VqD]g*0MehI 79}8U|p/47z,ghO)n5hB1hyC9KI؄IM1?ھr~Om+M -zvq`}8FQE롵wH9y([[}z̅1wrLR,<1.a")LsZ9hsci5TjK5al3YtN3pG톓eJȫ0dՌ*irv&Ta 2ASM.[#Qx1bOpFq#ɈkQ4k< ?$r>G#cfߑ r1`}}B?ϥt.F(递V@8@Xk <ÔZ@'\#0׸red'lg&vʍ7'u|0*,^k#9Ax ^L\@}ź_& %SsYC'63&!Zt8U=I8!Y*o+n`ͪ]R-*&¹UO(eDDQ#MMQ614ǒZ 2z…=G4&]|ޢ"GK#(sG.#.nݝ #Dwǔلu躘Nq( l<(׮1 +[Oܞse :9y;;  [2H5dr^ݥؼ`qkSO1}݉{ˮg|Η A4 @D Ġ4$R8cxƲ=.U)), 3,Q$E$rr:9EᎺ/<~wyшFDy>$#.m> *ywR8%J|eai>i8Y{ K켂R\=Ie Lr! :'ɲx{ #GL)j3=)ŷ3,>se2?ʙu"ƞKj"1I-`ESBbOCܠ_N~2v_ z3RN'm+4vv .. <)F)ZtR0i ǂI/TuNxFCY!%W19yqcϭk_[:뿗7Ȟ, ydt$AFF]^|`}&*BFAreAxti%1d}hE5HzT,UkM}Fzbi,Iv4jFjt8w#JxdR3IaA1鴋e$R QDKۗi n0gy\#Rl-e~~ic))n)_8Ńg/6bz FeGxa}nɍ$e,,N컫ppq\וː*DB*I!AXȱMNcQ’r R\aB`TJfr.5֔co.?pMB;AA%KL,ƺp,v%&U=:c_fys_86,Oi$왓 _GϬ\r$Ⱥ oa?"L.Ѹy gKY'No i…}8Jź˨PjH bV>nݔDFdVf,.}ޣ|{V>=_"?aZ&}7UL &wۂ36RcP.An#"E Ƒl \)wl@d3ڶAv}%JaȰ`El]'^a4ܥ CuHB fpuoM8~0x%gwjйB؆v`p'#R]tՈZEUFO t̄nc-Dkbf`;.+hZk% QLdQF=0EDO *Y,84yl3# Det^A吹 7rX0%lW`PWTx3G#,j“1J(tBR֫k鎦fcy-?w+>ȋ1,|s{pbg='q xv0St)뒨)]zӥ2^Hv8Vt0sz53C}}7IOqx?ݘ/>O3|!c&2}Hw)h]Bms*a̖6׼:"~Cu1 Ay|Hd[׎xPyҸYS0sbq6Wkgz@Mĺ'`&I^z&V&[eX >^ANmFo;&?ZB5m2$!Qz=¹YBK,-0pu܅٧ҙ2518gQk/v8~ZFP>YBL νpayÈiH w rJ2[VƍƷh-+T7Xk,zn0ze6q lB8SAA W0X^]YC!ac&*#%ȨJ#Rl1(3a#^–5Z8׵QGG$,y>Ұo1W_GwfNmqf%aTĤѪ57wٝ[V-}5c^ T 'ͰJ+5I -db!Ҳ)K*BnkR"0tz\S8(-l`DWCKw޽x[dl77X NƐaKnцC`kT#rå4u +2(J,(@smc<{Ɵ3,4<*7nR6}#%PSi4LK6)f)^8KoWetPy>\6ڔIEŵWlgbF9},!!fZ>֖LQw텍AeL -z4PwSҮ,G=ze W7ϳoO 7)t".?U_>K ^ڦ'B|Wpvp<3NtCz":d I 8jJM&M!Y*P,:e3"4ɨΠ WB ą@bqaT1 <%.,Q*]HI Gy(K Z @)S78M# oA1BZ)L̒IIӐ'[cb2.:sUpU s<]diK0 jZCreRFs.afoO\\>`W8b}q)<>].,Fy ߵ0N@X(Dc ܸBos ]ge~yd:d4 }CTTCH*|R/ò3x$"<_;[&5ˉIA.c 9MIC/7ݡ_B-=$] >zgo̾*yڣ)v3IH pr(z yL9fycØQ"=*唆-U}mR*Z$F):c=b{.CI !Z Dp 1y1=f+VAiXcMULSc"l#Οt Mu}I}סw"ޱOryw{:Z#D٘* TGdCI;gW(wRbϨT6+_"n)D~]_Cm/pB0a:62Bq2RPH <JKS@ IDATȒi( ߭P|="#[ AHT73 Ŭ}t^}e"R(C>G&YxWvQ[2hZO3,͝V Zcnc,tՇhT8!a;!-MMI \QZI#BQ,6h; d9ZǾ:`/څ cGgi!Iv/~C~/\b I9JC 4=L4"/CMruӀ-bk+sa5\Zc&jE%kW_gᲹc1!:q]2:WJaQf<Ӽv*1VVV]^++EX~e.SѾbXxalЮ1Y2\JOa ;>IQ𽗮)\Emth,)͆(^!mҞt4#hJf@ZƉ;لC]a#0RYcxDz,$M6A3(9G;8Xr7oR1y0:=__6pq炈O{~rK9]c2zw^XC⤋R^v8^.\ܦ^M}I֘k:8 3Lz]2'eX)>߻V&K ?hN`( R6QbQwBapt¼)qtPeУtPfI #}`c!Yavq݄QJ-,3؎M}Dn%N\HȚ1Cask-Vw3` |{7G@. E$?| eV{;k*t|4BskI[X"2DUJ$( m&w=,$Jj6X:ÂAY9B B%s,m,$1CvN3wyo2ƩO ̇ aE q- ,s,QÓr-`4{{ۛl|b1?K>.K$vU[6v>oFM.[va7S:}3d댍E,әriIPJ9%b^,DA~r nx4ܓ/03ygMiXg^NV9[>5 ?5~bδN~S/u\y@;|k Iӊa s |*4$Sle8eT;UZƄ;{ U"%8qDf!}%kw!5wD3N~w e[';Tµ)+I Ĕ-L1!NQ0B9(˜Xx4uwE{v<;qf#041h#gV9^"E؂^A'Clwļ6:; p t~ʧ?MvyDme>g A8WCJ/q 3lǥz9V2*`Ox)R@;~qDyepL9OA1"p QW=%:fAPhOH''hEx'!5%. )];0w(5BcM~wlYW=tn4hz+#cm6&5 Q0NqқG__Fyp>s}gy&smfQ-6R Hw&'MAmC )0~(ƽ"ʂANiyBté%/'jfaa(YEr/3cz;,ԬK7^&q&CtbI ؍lAu(}b\fk+D&DTh*g,y Ar)}8FVO1J,7;;|flI,qD,`y zY iwc / t&ngsaM`(%1(;Y`i p9E ]rd)Td`kIk 2f KOiB=Q(l[#+(ޙ %\=zrC?}3LOt3 -8\jq~QO*W.i#1`TCMN1^qiSw)m.'Smnshf g.sq)FNJb0IОFƂ. ѡxb#7;W|p?yRCmtw^wNq ߗ>7/&<O2ԟz'*+/_C6eEXqCi1N#2K^yXnfQ@%vB)+CtK !2bC5Ř(E6kH{T(3M\q5u$Di0iFahp0-d!SW=A]#& &ـ8t[wH}@y dn>d1YꠦLaCyD N%U:_!JiC` tcA9]10(0 ŽJ ,Z`?p.wX[b{(cäDPK|8IB66&T$}_pu/$O.x\c$I&?Sre&+<ɜǝ}k[+Uyoms{Yvx*uSW{p3MTOZ<<ا9>jӚkqK[5Blʛl!9%9z= 8Ǿ:ϕ~!=i.s'5E?H(.sKks>f/%J\tҒcH0 P @ZP% B@! () 1+j+GϽDu6]dGOp,FhFC.>ŬȵL.a zMy6ī3 <"{D&% dŏF3z2M{1 Em…ٜ}d`2#fNx4N>TU<ˆRWȓX;0&ԷIA?JmƩxvd˽qmif.@WpsYr4r>DLEkѧY0$'E6W%6ڎ'[̋%2}ܜ&P\QA]qȼ8tU-5[,e4e<)&!IrHI4U1d+ e(n+wc֚8͔i8 oBΘb?&h -E\*Q3Cvt[[cG!<Y<%q+@Ǽ:ǞZtS^Ez^^ y?"W6ԛD[YVH#jFь' j;J}Z!FRg%E\#>r4E+R.q@c)% r!ژQ3eYάO?m31=m3`{-Nw& %/!֗KwgxMap N]nee%{U #qB4H:(X#d2Jw.1Mu\JyVdx M^9(&z^eQFāR {#cMsŠQhSޡgQLj;*CIfW0S6j[OZij]C+i4Id`1NPP/XW, 5oa{#mK7~d k1 Z sX[yQ,׿}6ZMȦe"WۥG61Pn#[3C9j" zN)O2[TnMV}[ptNzcZ xHz R8d, n$>G%4쎏0VNsnErMgKQSOr:HS[Zc ՙ/"`K/4JD\ɉU^a(;$")24aev=AXޠs2ೆR.M)6P.Y!ZZkPT'v J6ɝmf -M,7PR\ Gݙ|̔h dՔYt{L\R%$Q@hٚ<:QV9[S6m#KrF Cg*ɾ7ᙫ-co =ݢ3X?y8n{-'>_oRoxY4L.o|4k~:7fqrjn*LPQ K+ϻ?u$I3  K-q!ˉx8!{x`0hH#~{{^V#yi_ֵZ{dSʋHĘ ):}%Aظ}EGZd˔<52Y$R䨇:M zsNq}y=bW&zs9+w yS6Ayc{XosS٢)?c.Dz+8O>Qu[l^ tu3O~̤TqerxH*8F^̗h(,V,!.MovT֟ XJ3= *k5~Diڀn[^CM("^COdLޘpdVP-9uI3M'm5m-z621F!dGʨe-vV."d_%qt]) !LlN*vh 8|+m!aVY8[""g@hH u8d a ˋsE8ѥb"y9D"Xbid@N)9M $HNPM'YZrA+{QDcgMj_?V?Ȩ8a& "9'XsteDbm儜w} ,w6d݃(JR21LPw}e)1%YD^P9Jcx;QV!t$\Fn>A!༁s IDAT EoeYt T:3>,Rœ&׶3nD@i%(Zم64(["%,Qz8*m'^:d""RE2b5ETJ<o,?'G7#ko"y`B"RLV /aUпt/TTLC]`Co&*LcMWӇ" v_笜q1 r'_9;򄝫4?g w2)?}#ůx`Tټ~~y sfja:>qGy6JL%P~RGU IAiœڈHfpyԓ9#&@HJ.U' 0u!u Ld (y(qi?Kh}+;M\վQfi4,7=@f&՘CST\Mؽż cYrFmhu{+eg4eT%K.#]B sx왪ܼAOba0wM3.Fk[$`ԦKX g*ˢ|ŭ'-YGltS&g^^Jې!/h7EڞW)53lz-agdcaLI1Uk$UBNI" B!$YP لHH\,sh0BYeZo_R/{0s 3"H>èPS-,wᄳya &կc*WR6JJ,u R%Mu |f W]]v_05Mr5JnD',ym- Z(&MwLy. ݋+bGQJIUQ$34 !*QlOЉDk:+z5U1#P2hBG#(ċ3Dߥ֤iD{{lk~g>{ vA%- ' W"(r7g=L-b³|fCi׍' P9|6wJ_jE[`*&,`hD%3Ā֊BsTzfDyӪ° _ :1uo2" EBdxfŕh](.ߺ 80w84(;G)0&w,Zܭlu`P6&Viw   HYp?hf|ܣ># 22I2V=C/n`@p1 5*5 y^!B9BҚ6)v{i$d ErҘ8X\nDq:Ĕ2zE x#`5^uȰmԠAAS%Ӎ h OyClt|DF4BdC"daL&*/Γӱ3N\fsLW(3S,5en?07ֱD18Oq !guʀq)ȤN@kQD)6wl=Z; y:9R6IeHEȡ+$5##@Y6@R$L1w̋gr-$Ei%T©<:im!-9&i8Bsؾ'; e]C)kZ&zY'O(+OBA"ӹWi)8@Yz}lM(-51ÄZ0$Uf4 ]yeD agfBO<(gē; Z^ӏi-"И+&hP#+F ;&NڔJs՘vQb83B+`߮rB)`SN"]g7@OO+8vTJ}/y=Vj1.zŁ=e] vrGpg$ܩCߡtw^qiRq/O(u*s3mg3LKtoaAͱ8p=IoGK;yPI7⁋ z+>+sq|J͢yG!o$ژ"Y DA HTЍQPIdLPQ07f40dʫ|[Rk/?nk׮RWJȬ8̔$|V&XRv$o4h\J^FER8ܬiTl* b}w^\T}5(΅D@}E#M1L ݴNJO'y|[k6B'P#xXg{^gG8$3fF>\q28_xm<$L4VHuP :JXn##,e-}8z .w|6Jo+Jǿ?S!.+;.KBuBPXz;IbЎ(WМd(A~lS om+|feg|?-fa%ݔmHn\?:a>^_5 k#.K9nJT+Cm$+_,%3}&o?_fiW> I HI+_pwyw}_F\gm[CzI9vkYx5ˇC^)_Py􅌋F?z6 )NRءh0Sb(w!NXRv(]Zwn"RJ"q.#(daF ZG@ RIH"LABYM22H_5)]Cws44DEN2 S<%F"2D BBG7w\qm.6ϜS夻CpG:˞BǓٜvO2IL*Y1ZH)"3o}7a#z"BUfXI/FUF$P-1t Hc MAb!RĔDP E{8`-usWx͛{YL502}$ eb6qn ._cuySXpĠkSI2$ש}"8A]e7# x-miaUU~ʳ~s0}O'x\9ȕ1.{;s C$fC(vS>Ju,Me{8Fw*m6Mj3ҬKmUmb ("gX[0QdF@1є-9 K/| o?UAt)6$)_X}7"vLm6st%T ҉ qi'#Es*scf]# :v ,., +gpn(QE-N覛 7,ju[(b#SS3Q3&G񥐍R´Hk<`20BuivfH24:ۄYM@$ffMU;}Dߥ`C/ )M HdkSnӗMhy Ai^RTBIBBCt ȶH&H(OD#D2db<ᚆ)<fU~M̺!DɘRϞŷ@\YgS;RiR?$ o~<* 3f&xaJ%-)l}s-N02t]zJװ}HI@(')D\tt-~<{X9RadV#\:La*BZQYڊ5r0Tig=>k1\ls84~)Ț-ƾƛ|cZ?B_h}?q;w?uß鳒\9z\DNՓIER( `LjS'#{ʠ=|# LH=orW[$'_ao(7osp@mx}c,| @{]%+[77{O~GrYG\'! #p}:Z*  j}kL6yw_+mG: ++2wl";L 7D5{Vglwt<)mghe_yq@XoX> ٗ- ^j"c4c~hD\2LR1O7̑46uv̖Mv"~> t8h3I E DiJ>0Ŕ,#EPGEE@cR!DR<2!\1#!^=~O:dᷧ xf?ϸ#m"*h|Aјf?F,LH/rm)wҽl#< :? bF, Sg"J!5 |I cSyb%Y6Ce'UcX0m|eBD%8.* e$qF`D$! ,Cs幌+km1\zK'߳y ˾60\$VZ[MȢP N:$ Þ0vb#Wkb/_gx˿ z]'C՟'O1+ikOrT=Iog/Yk&!:}:HwgwW t)xѠ'EA[ e{H-~ +к4ͧ,$U?FRԻ pyF,z=qF2/8h~ sԣ9$pK O}|?xylc4O:Sc|v;Kdq>O%aHz12Lm#4L[;ɗ*w{"{G }?n?<׳<δ1%-`4PAN*IEtc2rH2l:&rZmdRP@a*ǐRf6364(QO d9<@P,y4[팞q|d#PFiA`Vn H,ŀq2 m61]9ƶCg.SG3ׯ@:&u{#$ d#Cbh/tF =6t|Q`RRCN(0tdIo}5S5n3N +W!rTLd E( S]# E(CLŜLh ҘDE&ʔ*:)SCrV{x y$ft"2ʗPi0\i\vFddSSw/r롃Ʌ-3\وM~6;S$K#D O#DB0[÷S B,dI{ $N Z/p=b#K/s{hHY@h*(tSS޿0ڡe~tDQ)QȌ5[&W%v7fPO}~;Nza_O/xT\gcyWѷz.JGLm"'*.Te.Gk'w[%4oD1oM ˑ޽y# i18P)&rI$j-R$+u ᘎR;b8Y+A:*.0̨Tzj?{ڴ!gʯoWל*53DE$Тn_̤L<#U1$FdP)f>qPdOmFBטMc'%DîN嗹x* >dM5UZ )MHRK_MiHY)'5 c^y c&Qk`:cgBpd,hӐ%Rc_ ("Wi0 ;/R(3'PU|=%ykJs~kw`OzdvZȉAdD0 RHfыXimoQV9r /`$iC!Ct|ԯ D]}Ya{:/'eTT'TkD;U4'Smby$a{14p&7n/fV:/~A\q*[V1+CqA>f?؟iQ }+ZXR`2is=~㹟s E.Jy dE27dM9E5G%D 8C'_!Q.zdBC(~YJN(DxPbҬLDjBɤ"!j Pe&{O#a "Z(U|o%2͈s1xծ 1E5"Mu䬡HJMs(Έ(s%9c(LDK*hD!ޢ[Oox|!s#!Rh^5sWƔ"He1 IDAT:2"'X~=5dYUHcu?xq#ɐ٧h--i~e:ƭG.{`u/J&t'`9I#r &Hn"<9@B|gx xĦx +qkI$j$U(0 @t $B!H}~Ƿ#k5!Ʊ%S|o@3SG2B6oV> і@~ZYr0װ+* :2K)E7n%Ddc,C[%8{:w~Qǘ>b*m ._}~]k +|Ca9I? lv}2J#S?`Xԧ+ o:[0r7cLMw3s矤:3Ek[),X^yf/ӹ9bM/Ui.G7KwC|cTz/0'msR-K\iޒc=:쭟xu ?̱;_OO(D=lJ>ؠB JYl@R2&CDIJYj2[(R*W*6wM!bYb_Y Qd!N&U4)j!'d4JF.In$XX*bdqTrUƓ!U$QLL|2EFZpigȯ2\t*^SsQ3 HA0P蝿FUVs.^>m9ĦKDI)R5J9LbL`*!T\ vΣf-ImUzOTF Pg'8b]f j11}#hH̄AKb8B/,G}@dF9s JvZvu)F{Ӹս.q!SṛǬ*Ά_WqSxL#L[%j!*¹fF0M| "719Wh^1>bk򊇠+2Q%DqmcvfJSG^z'nzm—nVAMr8jC2$u~{Hf$Y"#j^ƅ "UL4>+U3kۈҶ> >~S*Q_(2ZKI}:q8z75AjO<¯[ԖRy "P!r .i%۸Gh$kL-ȑeh:AR5@T:Vb D$"Ed >\#C ȁFFBaĘo2F|# m -VYl'}'BVg+;R٩Ym%dufvAf'C=ӘFhPQ"$"=?'﮳x|c|>&IS$NT1N5P"EO5Je(x:i3S&[Z6 G12O_{ţtʂOtD!>dHD0ggh4elܬ p<";Y<0STEhLrX,v!3AH$ 8I m7[ȕY(^ 7Ijp˜(\JYۍ\B7yǹuwO3J#AN-tTd}O1aeZ\DJIXb)\(*u;kn^آp wl>Wr,w=m\HY{M&9Z7Sc|mpar);kvfU\d<Ԡ4;ɔgYot*uFkyb?_0,.r.J9zH& #SaJIv[ a(/|$6{*v"uCAP R2qPDS XIXQMQU0D҈(!U}HgX* q #{1 Fh乏l$$@ꤩ@B*w(  Q #<ȣEaj hK9r *7w āZDn$.abRb,fc[[1Vcpd6E7 " %͆'1kK4{gw'eox>Gfq5=KDo-sH&yX+cfd6f#)4'f P%4(OqjȥRF)D  q0uO.c|/L G@,tSo %',gP/˔GylUjcbw{ӄ&vEMUa]6#lietRvO.^?(P=m zyVW."R( qs2=XI̝-6_[4+ Ho}I>U*QJ;Z!K{S3DֱE/-n'$HgCe,B`$ B?9@z<1,k.c6ͭC!Om2AI, 6㕜3jۙa:yǷY>ůȯ~;\});å.rp { qO'ps{G8vݕ(M])]~DL9673M2[/2_|![wap%q+Vhm!V*xK. FN)NkurJʝGMI*Z/YHw:H {/#i~k kFgYF}ϛ6$W/xWԅ1*#~O+Wy:/|A`{(Lt&QׯQ)AD{ \S_`s[ѻr/~e6O-1j1k!)z 4G) *J& =G xL*ȩ @L H,x r %!9idad[FЉG $Ae:CIH{YD&XRhܦ tІ1hdoEyמ[/.q~ oSwWkoX8$CvEi ō:G͐%:u6&9}]y^ޡ΋4=z1uu[[RZ7#\5PQ{UIEe&ݐSY=S^$U6ZW-9HUʤN)(!)QW8K'oTV7@H6Y#Mc'/]"k4[%xhvʌZo"˛sxΓMgFhlUKI+:-0ztI5I%G*t?A=oZe6$~)?g41ƞu0,Mûۦ|Wiևu!2wg qjQt7sƔ"#um,]vȷf8{}0(Q"z,};poZ3*BGb 7%w lHf?Ík?9>Q̝,Kg &]CA5: 4K}Ə=svBIy q:\Os^Cql0MpA~ʁ1"/#J #;{WcF4)>[^"K2bOF0P<AQĜHRYNՌH4HSY<1"!rY"J豏hm*zF#D$|)'P D'DdyHHr@,d {yBڄr$ڨAd) tHK}FTx_pSt4"z!K.@tPEZHv(D.b5b~Abm_`aon2fTy|@X:s+s<9ʄQ {uUǡ Ҝ!-ȃnP!EhvP)*nS3:yxοq?C;Sрcy@=Q֦žhGK53>8J3|g+ȇFţ3&S_=s[< c)޶Qe^Pcr[D?}wFf9w 8]97szRq%[g\~0^e;DEcE sux >GQ']\d$wk8}o#ґir.g"ȐusZd+P?MtCLOd 7=u}/g[7%E9;![eo hSLM,82xmqn‰#?Axiz/ӹ|qN 3H**?`FmCF|k|HNR J+=V/bu4Jg+=2է|$M>1ן:˷yU#T aJm:ާ{3'h}!n5\Ep0bNTgX7b.$wpF!2BB(DHY)Il=@ȢII2Mȴ!)~9ǖT#DhY6j&qAд~p|^%'VI6^dv8h#tBQK$vpowb%M}Je<@!Ydgq:ؖ*,./_`KqHÔcǘ5aeւ)Ew- 1B4D\<'bEi|Yȑ#GhqŰ bTգ*YHU"QZ; Z9r~1TEcLc]P;݀~5Sdgk1gRc=8:‹eT HvV\y$gLE +t/"UI]`eWp%D@,Zt[mIԉ ;?ߴnooɌ-jQp iE'%b8qv7RÌU30r^!UYg>Cxa. {bOҏ(CvEQDHng̨'] m/3YҹX/sUZMΞ8Grt wmHa+^!i]bF%ȤU IDATiIc(g>{n=rErcȶXaѪ&✚aPLlmr& :`rIl8@:R$0:2lRL(xJN/%V0.Q5D' Sxԓe )" 34f{'aH ~]2pA%ɔ ALz  Kc> Z+$dm+1QQ($,5%*)DUEa# ")!z`"q,&9N2HJ0I IQI;Vt)QŔf")`$"y!3EX@U"EBBt,$IdBydMQ) @6Uu*TV,"}ܕ Q Z ]b$d2x+縻>.)T'kة8H?|P[d|Ϋ?_8e'qq~<<ڌjqQ;@BrLqGG:ҹ3*6#c1& VϿFi~ƝBd4!$Abtẍ́; Ecw>oQ`Ă1osǎΙ+CRHw8.ϡtg c \`xE)\FX0^pwNz<=t:?KMa> Wӄg֢}L W8?s~!aDCS4#.vFf&.ҍK[1u>vȹ!e8.A ?ƍYQ478Xbos\;7ao0wYiWH֧ /0Oqj~ZzW Y)Kv( ɢ!<$AJr]L$1Dj侉D =$F"f8{{ cw{gn:Y'k>k[ABѴ*n2Ǹ]D]F eV;}AV"ҔԒCJFlTk#Hi̡ B4nӿ](NTa*.#6ݸN>Gi ǧi~ɊAm1R[cMe&Sun0v$R,bL5ɆdGBqEeLV>@SG9?﹝ohIF?))Yr%4CgURܡŔ V($#hb12F+t=vçjICIIGXI1.GQn!loPv̠dj!l 4AZ!D QgKLO2t .|1 Q9I~mJ0pq>'9~$[D5mγmTH*k=cjnO5W!{Q+AE$]C8ױ_HSE()q,j2zN_E2oړ2CJ>{J"E c$F 7N'Ȧ1Ԅ"QLȽJ8N"Q`j֎4`1dO$L2=%!e"I$$rE"Mr1#r@ۗ;pYIv}:qA%a蝔Aw?"{X;D Hd bkWsB%Gj d$tu BR )>(BuF&>R~ _̼x3Ø,wpIV.m@d`LGL*p$cXN6 NPVʨE_]B{Y<*-173K-.'F?d{ScI~ks7Qg>R9CÌf N%8=ıŘiaVmNJ}[7_ۿgDoϲ(Tl;(U'O2kdeNVUO2b!wjaJ~A _Gf'+6'8hǮ͏<;>̗eg],C KkX~%H֠~'*ƾՠ|t/2QF[ /[8JDH+>A@3>VO:3X#Mbp~ro."O~ҫ?&Vh#tD/AKJ8!::ЕljGOHR)sBf AG5I[;XĂЎh u[)%Ȋŀh_cRάWEUشr ֐kME*'ǡdY&n`$~@_}ІTE4}ː(LJ@8ln~_+ʀ'E: a? }#MQGa`WlM{rRf"M?D2$I$gED S`d+@: 0 @HǵU\F HEak"c# 2帙Ӆv:ـpyA3?]v^+)uzB'uF riʯ3F(j(|՝UVZ}ćLBtHOw !{y03j 4Ad 4e'P]YEhhA"TG`NnwԄd! Ja3 &jȆQF:LJ!*Kn dN1Cr؛ܞo25jONM$q^i!bg:IK[Z!m !ʍm A`cT9 q\-*|.kr<ehg Dfn|E:68DEPlqqƉ✦VK_殜s ]Y |G"B%BM#Ab.s~:OXݠQcZ_;IǨ&b1vH-R52a@(HJDh3 oÊ 3W/Q s$:{!aWy-N>C>doYZ n;`YEjHRbb (BT T24'3X)y[vqN֛~/O`w2__ܥ0I#N(D>9hl7 u>풎^j3eC-q\+abj  vtGn"  zBj'I]hGjƨ5NԐp?` =obkb⎆PI"Rd.qf+}X O Ld͈aG e 4MWCJz#)øOn?EI|vF[c ^1y5~U3ڰ7NawBs;DHJgEpf_ZmRnuՀ[We}++IE[?&~&C˾!(#l܍4Cɍ-RF uZB+^}BjHDUQY<]C84bΓ$Is#/8|i0;+s;LK*=n} y4G&,Oam˔n^*fҳ%qQb&"Ybw26zz8at-C*>F6 |;BR2/<,E/Q38t eiY9~cd_Ct 'S3LO &ڤɝ!IsdcHD3u>y>8P2`O$^oJuՒ.h 6e&E E,sydmFgͽ%|4v  r~chwmH-ԈbvYeƒAAM#3sh? s]9@-{e!H" DJ"!X6 O>h")^B_8A%˯31rGap;(>*#*I&"Cbcg"~,2"%"#g6#)'b)>.%Q7Y<`lrf1Y,k9T}4y KtBQPA2nqDV00 4EGIR0:MjE6=gCwFRiU}1CSou)v_ËCO!hEH^c0OPz})NK$o-V1h8K1y\i9Lwvd8(Jz8 en7,}JHnA- cslCZl_n=?_}:S/lݡhNt9QPhK"0n1V\Z,(}0X0PENΝE}*a\:IIKʞDhlӴ= &},J)K!ɉ|1hnGʚǽG#ߋflӚƍB̃0˟O]&̗ ]G VjM{)a^ Lj4X,rfgfɧd!Chl-/cuGDڷHPqї 2eƈ;iSOma~-Z뛿o{yScWwuUlMJh#+!;rbօGIVnb q # R Ȓ-2$!2(D꡺k8Ugg{rQ}I_x^偧0V,'=ZP <"UMW|Q, ,-qSfphPDf6O).M;ʄʥyi7Eq19zTbT$ k`Cd)4Ic!wfSZ=BgXeTwYRf)=?ꗑrP#EQ~3@*16[ͳ.ɂo^]3:Nf&X鈡=#MY'lW9uI7P@=pIKx:FIAظG< LΚOfmb+ќH]‹jhD+9Ԡ{S8˸-36S2ϱM6)h{ Ƿi-eN[u]ϰ->~Y3J /Ê6Ҕa>$Y:'`' fZgt*pV6n~Ѯ-{F_p8ί"b3\k84+QάVRbG ryG9ع$'mmo$`FzbY2gUfGm\;xCWCc[ fw5X% NN&=q嗈\)q3z-xFKR6ZLI!x$UsVh#>`~,Ԍ fC\ir}FLkwk[qǯm>`ǿJ{ۨd~G ̥TVNterOЛ0 !gې (ȑʡ@)2B"Mj4DW*0  Ajʼ5LMU8hTQA)۟v`k4HR7j24"%N}J w',5jyFDMhrcBzZYmSb⻻|XSa>Zdت3y68%k¼2&>qҧyeؐ&h¬$fQa<,䜎uvzWo~vJql1J&ܙ*{{v.?8:!nd</|QU޾ϗo1g Sux$ RYTdg8HR=dh~>(Sգ8% IDATmio:>!N%3c!3> =w>zDg IB+fTd&,#KXJj:n%Nhq+IUmNOil,/fMZ1ArI|f3k#DήG}t2(i|v5LK2f"ꨚO^`a0,9:٣0;5:GÂMj6ՏzMZeɨ:drZ]_cKM  &]j-Bwz(RFÜbJ5oѥ4*ᅣ &O㬽;֛le4vsܧwDh";ď| sadL(tNe!B|8 6&E۝Y( :ME#]gr_f {c ?DyMӊ|9g0x 4hiL`rj=%guYIc.SޙYt9^9x={wyEqE=':gSezDOffmeH00{C6 W2&Keϙt=Ju\Z0R˧tMd#p  jX#1 UPbc*M>rI?a{5AJ$qEh"9Oln47V|r<30l6ia5$=W?I[yry3&mS*M a*@*dUA%@ <@V+@ 0QZ~4{}2,>ŶF=[y5fZjka͖lM]Ŕ Э6GNYqp5C0C5Iɻ]L6{G!<3+;6kv`91xG^Ů1炧yA ;O}N&g'vӀmQ ĉI{1E1O.»:9U%t[cu1% 8JuٺdU SˆfQ6NjV nQ>ѯ'C[kg19F#v%Ə-+d6~(0\}?|S&Řjx #TLt mLmwYfڽE'O>٘ǯ0,>j8ED진 74H i]A9y%t2DV9SqY$ [Qw,& ٢$F,H=TtEl'Ѷ"4tXd[,0 *} Iw#m l!(l(ض dc [(JCR'S,G ,'X##Ů$KNQh!ю3 vƪ4]ЂDHצ^1ͥ%%V=&Vn`Hr DIPKQ)ܚBbV0 4 S3mP(_RjEP>=44*P kDw"%0 Đ!%((mAiI)tJMʠLR0e J^_<)ΕZſu݌| sE]-+&ʇR:-XmREzԨ4ltc+%\Z p6 7~^g~YW$ _V+ܪ9>3*ll!&3j͂^ШaǪܡpK,.R췈>{sn'Lo:P,ݻܽԎ-倱&`fXBD%85lr[ bN=epX N NYL>!} +w5ܨaGe2btQPu ,*cNș%%J͙E ‥U CŸ;K׹_c}{^HضsFUcy:kI4[5hBYIFĕ+Tu:NUE3 :iwXif66#zΤ|< LN!ro/m2:N5`v6IڰXu¤.5oB+}s8Hwh-t6-lWQթoct1UXPPa ^3c_\g&Њ6wfT3\.hy頳YaPbZ3AđFS0K-)#0TTq*L")QF@q]7׏R%έؾ,`-lVu-ڏ='(sKOYjdgW()vOﳘevJqG$>fRPDP)Ҳyrʪ`LP݂4ϩڤtt+fIFXl˄+xTEN5Hoy2@ AYM!$YP '!e`c|SP)Hqb@ے*&>ue8PhJUAW"@4 Zanm"{(ƶh!>f{{J1+!<}wf1|Mܩѭ2&4M:qh5\AHe0H-9J 2aZӃHS(ek!F} D/!oTxd/nmt&?i2mT1(jW2{ĭg8;<4Ƿ))sm gHM<͎~rGxiUn]s+#ί`6 +d/]UQ`YmF%]qNow5T=W*;̕k aSc|UɔaHaw֥`I3}gor"BƼ{4S6t%+&bp8cN 5~͠y0L~= Ɯ)Ea;)FwiWԳ9=wvEe)V딓ќ hw+dק^kstoM\> Q)JY_k~rM(4PTYIRB!f!" =GdMK UYj"60n+S Nmj&K lZ rk>gE'=hQ_L_2.m8an&S"OSƓF+g/ZxBBh]fmw28%p6& TYJSi)+BiR'P.UIAEAYeD)4Ai]HCa^`mE lacxDX&iM1G3v~񃗉JMm"bӼyb|He>(~˅4 =|*Q$*K~iL%,)R kVeJ间Lo*L@"RY&IK)M UQH|1'1a", ,K8Fkm,e ,EcVZ"LBCa(* \!eiCJrQWT`(*@2e(@\ @)ۢT6!:7&{K{;ٔ}|?=7|:җvYR9#Tl<*Ȏwzv'i_ak9UË'ûj?ͭ6?hY=l|VKgMeL6iu/W4D:e ZbcFlcX‘Svʵ%ʓucjȓ -C6HX~& VS6)v#eƤy1bA|sij${vs&+?%+͸]ߛهOџfNlz~繛|rm+evc{*{ nݥBFi)CiPcD->!&KiA$}jJc"d,(4-1=TB**gnTEg\XhI4&LQhMӌIʘqBOI)spj&^ 0UNKXC.) D sp)0mQ!T"&3sꆉLD62L*C[6, v(AT9Tf!4NFS(ӧ.2A8Ӝy\΀cwK>c>ɸE{v{3,|@g)6 W%8ɷI.!%)'~2jx:8/k=jeKQ9Mw7}]feզkmcv\l@r)W i9r87yAs>W?WoPM,1`=9џٸUUť_X GF=޽#n"1^f\ $G9otgl4jz(ѣl4[~M_6|O?NXsF*%ىgM$cS&dX@81ݩ4v!XoQ?`;0 IF @5FmsN`G' 1ciX46Xdi3YؓnРy{'.^X-59q$ ZpQj0_~M/Gς(#uKDR Z ()qB(vyTQLH1NѶ]mkc1yqr,&M~A<bXaS5,srٱ-iBԝp+@+'dwp߽[tx,g͕ʥ'h5$:bf((BJ]Ed͛x?LRDllcYK4Yƾr|fsO?j&IS``3 !aYo0:j:2e-I@7rN9gDʤKD5>vݥVarq(01j3FuNP؈nquZG{FiQqh%HF**P'EͥS_2XB5B ˜^ZtiQ3YPHr K}JaXJDL1$]0P[IbO JtT7H1I(Z!&pȯ-2d\Jd>uVA-d]7ɷꬮ9/|_eϡ >[cAb0)nG>iBf8G9s KbYN?vnqEA2MOK21>"֘췸pA{?箳Gp41/8sJQK*R {;=W' M H͓{e? D>;7ƥ~nی6gJB0!k,ިf!84eP Ę qTfT ztNcݺ͍>Ui:51́qV^O|gNvLV' AJ%$M"@B(D\TE'EpCDSF0 $QuTŗi[(AQꢸJ^co ; <5@nd64ؕ T2CU:XھD~#dw0fsXzZ~v4[FtQw#~&l6tu2^l:3TZUUFK3{5u^"5weaԾę>VAe6$"%""৐.2"vIR CK4@.#!#t0B@\4S2%01HPPL1UQ22Z X<\<Ե-+/*JEnZ |Ɔ01,ml n>v[Y9=l%(AP5KuTvޒƿb${W6X%plCW#B٠yn>\ly2Mh躇hGvJ6Fk囈rc) 㭐 c\gmc \ٿfzJ^ "\4,rIE!U"Blԉ'O k6W+0saͳgi~Nj2N#_G0GH}#s ݫԿ}&CiE7=N {^g&r$A Ey @0d6<Ӈ#lGI6S]Q"˗Ib祢&!Apc._>:́fǏp'b)Ȣ߰w[= %A`e1~ zM03C?Q}lǟh>E^H-o%M8S$qrSVkz/Agk8J6.-PmEġQ@ t&˃z =_y7v75@&E[%77-Q/p5I-D ,hDqc G$Eq%D3w1I:fI/P E:A KDaK{rI K[/Se() {5&?|.>0&/E띓l-ne_Ya cIXm!GMAY[tvU._Q2=Hc]Rmw/xs&ג:o(HR\S84 : %Mec{ٰ[yI IpP uHy@MDZ>X5FFș&:hb+> nIAQ*)'uȷ .#d:./ )c; JToO_bjmYعĆAKK"EO1ܔk+JmRbP#/%aΡ*D=IaT@# 4r/ӌ]qWob ۛ8=̌HqW 3m"8uYj1mD_ p" !89d"ev%F=3ž>ōO}2~(=K'ytŭiHIPQ *yKG0\p"Pc'@c.S:|Rc~3hN3<%ÔAM"V+VDS ǐ p6DKV@W]ChX9~a]JQFuwor&jW\ƴE%1m,q\VgR`-*F#;9ݍ٫<`E Qu~b$ M$[ se5ƴ ,#((}DQ' E4FO$BGKxzWMSIz!Z`*-%ByQP](i&^" ) " R}F޴y-ElH$ !ä:""jGˑK~4y LhIܶA[>-T_{Dh m2CGҳA:]L q;ŗ@0m"_ERO(+dzx/ y8~kH 9ɔAC' 7 ۪d2MA4ʬV5"VGgbbĽh; M {r~Oܵ/ ?⣖68r*#`EbOV!ɉiNtaWOѩ vm+J"1h5gNaU]e릨Ku.RUa(Q& RM+5&| It,ˠ-6"D@~f|K\?vJGA%U@"`Lκg6c_'=*n~[ó ϟt9 y;nºJ9BpbKc0:G Kg_BuHf&d,v-8Ξd\V)Ͳ6Xg( f|r($agrrQm^5 Bg9 'A׻؋ZOS͔J2΅SG,(`"9vf>ϾtwpaYHdvs x/6E^ 8TxaD3phr* v9ck&cY8g#;J?ZD2jt딫C8*GF9<˲hKtF*Q\Xc=}hNcpO024GM$Cv"`hHLO4#M6;0^'F4;li+^rhxJ0ol6p5&{/ ˈĮB `K&-?l3BEH\e[TY/9t!P\~oyҨJ~`Ti]zkTUfeB;S*uM$B1EF)ePMZ%U՘Tq9.6zAWaͳJY|e%Q66n8k[-= 34is5DiIaȏQ N(@룠"}Dy"1@XI `b+5C$cRYڸa6P %^h4<  \572WOs@sB>X4i9];:=BQ)b屋(-tܔMe @$+TRPH4g 䠇Ǩ^$*j3i$@NMڞ`)i rHB=ktbMVФRD%TB<9BMbEE#GpbJ$i(4⾝`;J1)?λb^?$a[;DNcR{ؽ?)`iaG6g;W 6Ӻ!#oKH| [o(EB̭'Wx~hF#'~/!NHR WʝJ.id4d7Glll? W #7βgqp#yQ|N-o;ȁK ,k7s# #XB籽 I$qZN0B奨<6yA\B.E98ɷݯ[[?@,!-*t#9JbnB]8O3H^aE!i.VU0/w8<2fbz_XKTȭXu=`'1" RH#uِm*n%۠~JB=F}Lp~S1ʗӚ[֭Ŭm2fg}u<|0X)C[;hҽ1E4`uܛ^VCL[׮Ip?/\Y&?l59+sT֮!l4%0AL-jE69~q!C2h/|h:.[GhfsSOcL(T s[qt>  J?:/"yQ䥫\AV} ?q[q/fʑ裯'P 3?YYc|DߛE.9H~ܠxמ`IyHcǞ~]y݋+>uI1,wv9E]*RؽgDy ]PYm^21PկH--hqd+UكXOwC~7~rvc:ϽxMTUȚF("ٹ2GGL:N&tt,~rQfgcaK[Y./_'^gs<ԓLTF9p`/*a9vZJG @ҐTTh9]\K@B IDATH^V{Ƣo4z;K#@ۤ,'6 M; ^$ 2%$$I!1 5;j!%75]SrvX"hb4ƸxCt'_nܝL|\`_CBWV;hCH"U;L.=TAI@{+y Lg55Y=9;:4 Bv\DFTc|:5Ϗ11 Kunl Ϟe3|%e4۠#FO˵Q;K3l][5RFݕLlooYu"&Ip<6 ^OE^&K;&Z~R&FnW &+ sLJf|fRtBg|$S@;xF~{1j.EĚK1V+?6b6_2m.:*nǸ2 F=7 gi.ims<op:IC|pmG-W۷+z8toQ)+?yW!qXAV "R6jI" II%8R1UJ}Z$M[b$҅؈Q'q]Q{xG(5 /`^QGhv|!\?u"#&9dz.vKp`K|C8|/d1(Y^p#CzJdM6 a2+MG gI7O238[7v|h^84 ]aG 6=}2Ȟ( F5 m>3nm:sy̏IGy0k=HIa7P\xNvBdbs& 䥐ܹ1ƭswf7pUZ%C60bsd`X=He02h*D⥸^1 5+~lRZj $j]\J|>i/ 7o.&wi2t9^;:h׹25N@mn)ԎKr|>T8B|&o?%I1ǴD["o+s9~jmxBQNiri,mR6 [EIύ`W{/ֈKs"SWO~wgvy sVy| [P5fzQzE,k6O| }f}4 oMgq/~3 z{[2K$m`iAX7==v|d|dr=ې!\w!ڙy󻙨وq!m{g1ɤvScm*&x4?6ˡ3^"xf:E8⫌<.VX\|J:vmYTZhr& Oecm\, 0;7){w R*Q$8c0S %=TAˎ0O/-q~BTCdńwD^\;s/>1SGFczlmMC)bZ-ʹ;24a'r /!"Z0MIɚ٬b Y,%ث__ ĵ۵yҶG 4 ?$ې"YR!-Բ,kDiȪU5ۏ_ƹ.{/{BV>`yP~"ɓ(ǘ:~|—p,\_C,+<7،AeM>ּwޅ?sD<>Zޢ|~m<]ԙ9]bޞ?(=$ooLĉַ9&XO5Ďp d,hc@g?Eךnuy",erq7;Ln/)F"GJ$vnqu,o:HNֲKj^'A6|ʎ(ATc2'`'1$xhV-!"-rB آ$QTQ#D U$5TH -Z-NR@QdP؛j@'͉ivBbGQ rFÌM9ۜ ~'Zϼ/c{1F峸+ˤo{@?m[dޏ=rnA`h,il@:=1=٠V!|k$s+?h PJڣ)% 1Gj"@O#`5έPVye-RQw=vG)1'x?,ɿw6į{{g U;U^l,UJԢ'9gf { [Xȿ ח"Go8_;6{W_;WI_Sࡱ/Qz@棨o_'.V ë/vV789G+*vu dє(Q0bV̰IȒ "}Ds 0]9C,(`j/d*FKl- =jo2sQǘ>F/6u+&}~Yj)hiO; n~Ý#lkJs.U ָv3#A^`9s ,>uo c9wKHs}XasKkR0b*3m4IT~fk#Yti"oނ|ce{|mt3WϑQvn f=V\/pJU] Fp6-Z9*%FcOLnnE Auj`H$*Ĉ(6"_TK%wރPձGM=Z7Лj*f# rii~"]4\_a4%d=EB݅^SUP$I11& 2&wXҗ)OHϞLLѱsFȶWma&E>ͼ8.cUxN-8 >p.1ė|;xxD.^/<.{"K>aߤ_ҹ'#l/[狴wQ"Jwskw#O92{846Ae[ qKX֑21G*)ձ-Wo'dl%Pڌgp+80h: bL,XX MQ$E"6(FabE*mS$hjH>B5RzU9:چ+C5AB11kƈ2m1r-#rBRYov 䘞^iPݔ^ͤrJ&D ! C>%Vjl\s#Ts dĂi 0eJ}L`"L\|)F#|%FODB8iI"jNH؞f8ZC$Cʈ$r QDTՀ!_$I!|zQ/<UΗ XIlEN#*zADoO m(y+ބ瘴grl:BHfD@^~tM* ׉SҰU ꃖ >Zd`2UZrh9D(w slⳔw~`3+y'zY)696'4's~r Hy"m];ZTޖZŢ35'2=Vů]d[,W/ǹk9Cm&ZkM-ňo(ѻ,2Ɍ,ec `6*m sz[e`uҠu%uÇYjpZ|],*VbumVI=zh3 8;ί"D)N*c\:p0>Iq#*8/]~>Ƴ 0֋-B2[[Nٙ<}PfS#x痈hH2 75orh)l?-s"{gQ^x~n'wOca{g, 6#$89sμF3( ڗSP)=C4U4<1nqSh)nQgp/ 6X);;bR1'-2Il"뉌cH%>y4`4:l/;gy_pg$ʘ114[ ZEw,RRh(:&te2*B_+Wa?k+"[dE:,K̸ɕ%|$+[0V%12E& S$j M36]-lb IYDAED.QH)Xg9Bd,{Z-L$:ɓl\ov(a f2scѐEk b ,44ϢZ:|)@Kcwi40u#xKA$8fH$6Bj6=wnoDRDq&&bL3Y(/{|orGWxQ~#sC k>_wf zwbh=]#|tω 8gL'>ˑpw+͏]|aJ ~'xv˟K>?f3L+{PzU o7a (#},ۏs?uuÄLT4vգL#\aH7Ȉ<ILH@EDK#AuXNGʲG5;j\*$c(eXס5` nrr٪:m85&OR#oy\70"LȲ݄(+ 5$qrul 3ZΑzMˠI22{\V{"/ȊCgP E @TdBU ^hQ@8!):lS@T]Jr%Ep%QBDC-x":BIJLIq 젹:Z,S"Pd4!m<Qד1ѥ(2Iņf3Y GE$I#Q0B]dNJ\9"BLBSBLnsS.B?`5=Gx6|f7}:<{vݘ %Teq$brLe+v9J*9%*-ɡE (Ly<Ϟ7%<~j~WNj!7H-XBCb1nLoș,]8I$wxrK9F勜Cs:)UN=Oh+KD7=zV-6* fD9ٚso{F\#D:4\x(O2E|-.cZOc_6NRntltA@xe$lQjx EIETB15:5q\3ay#D2MVߠ}[(mPzdQH!pi`8@0UPEypJg:Ki=jMFp?ROV\lh+]b;7Y>FL2i]k_OXZ"I2"'P3F@M^a!ldv??欠3b\*;P+|; qZ#r $(9a: r%f .# Q g8mh)'Af"E`` J2!c;]v&\~w+`hUC'JC Sso! s1KTk-.͖G%(RqT~/ʹcO!w7pr+.(5Gz)UjE$Z? I0M"x%"L="'LP!U 9 O># ,R;-vX\c8"\Ѝ2 an*O,/|tKGOq#f9i♻\<8?*mb?.z5B&g/_g?|:x ePTkgSFFCno,|gH㛿sdy3˴0/0R z̾:E=` oߗ+T懄L\9[gP$Dz,oZ/=t'7 v4O%ws>}lA1vUhSRv`1T)E`;Uj6iK{ls۸̠ug{r0DBXW@Ns^^ijN a`d .)M (Q$R ԔlReAjc SBa:BPpP,IBK W)5/(CDAxQV˂BEBڤRQ LMFD& j@QLW#Q')f =S(`.LqKYɓYtf͗M~≏2ں??90M2W.ÇBXz,\/вTqc#KcD{g!CxU#*X@R$e YC9yds>ETɎ@KY(PV9ts\~}}e?賥睠6Oa<4b &4z Ǭ#VBh0̋`)}[gɉϣ祌5~"_ϱyqkfo dJ*aA،L 3((nQ3oQhS~)~eh>o 1g) .rG.[-$!2HUnBT$Ո&)B~2MԦ JW_tb#,mi IDAT2Xz(~P%6%zUڲE۰QUl2%kac jgXȺRmNkG Ju* "T ˌ]Me(R>BQ;89XZ\d*fB? w3aC  sc4fO}z9nmofP\߶q݂^ vWY_fE_`V31MȍH%ăz;3<o -ķVYI*w1;O:\sҭYf1X&6[n/,d)>NV6x}4VOc1^\m~QeE7\Cf6ŏ/6ɻ]"3ÑS]̨k:AIXh5̟= Ǎ K yAvƸܖ;-k|A(AhFpߧP?1*m䲌"Qd l@r[ggF%&H9zx)LE#n_xmuL_ɬ Z,ϝyeJKe##R"GAjB1 z8qH@K "B4U=S㵛HSQ i%g/Aqs"IITU6u(B: P (pad@wgɌBQG)(<4 $OUdﶰI$# R")R‿R->\-0\y;V㡵;9>{Wy>1ӤΝ;2~f>?[8~釹;ـCM<iI]IXelXDyU6O/X=L6O>+.6Muq&? '8z,ٟ){KmJӀ<ˣLV )FRφAݟ`G::ͧɼA=\hZsxW;o!?<8$+[C޿;y$h 2o`X&kxxgc8),X|9(OK,u'C?.jkW"69Niv]moSnB`|dpowYn|g-ֶ?WnAϛ֕籬 $}/%\eߣ4{em3TᅦTAP7lN蒈+N,ؤ?~9`Y(D)ʭ |d"7h/7hs 寰wt{|z{1toTyGNfXesש<YN_0z6(]#8cǤb%'O G\ۿBgߏ8TjrD F0C]"CI,=\ɕ"`()\ gJKIЫ&$h d"dE)h2%P:ARFvvY^)[dV0Y R#h 2fqO=Sh5G }V dUZ(*,f3ųQU͗^e`:G':UpR ÃMD$@-{`7fu[9e/&6{or?s!;3FJz„Ȫe{Evmc 0/pE~h6[!u%->35_pB *j}6fPY?\ΨެeNE"鴉#sCmqevŹ/vNpxpp4%d<15dũFTXtdy[1]~4assǘ..L٨q"6|6wv&>n5\6InYp>Ab8q?:dG؄qCŢ) ;vp۔0?}_\e|X`~7 ,N8$ڑNq/}G:=^6Sz7s zν۷q:>^٥|%|t}5ٍ~No8>a d}\vzg4T<}9iM51WyCw CJC3;#Qh^H7\VO^]Wx5BۇʰָPnWMx-yc+xiR9&52ipj]ڢ7ٲf,,c̱M~ CFL|73 ,邭Ɲ_acz8/wp2\A8w$P<Ym3u|6.Vs%(vf` k0J6,D:A$>fMSt %az%4]!O"HE-JeLc*H"e>?grtow3vXR1r\0_9>SggpHQ0U' F,&k [w2ZY:݀k7bD_cRaڿ?2;V\`;7(WFc^ҜmPQ(f QT2S.'.dJj;35Z_$0~'2_8>Fx^_^q*-JOhFnլp0}vPYL zmqcq*;qL`HN&# ?k/)m zFKZS0$DFM"Ʃ;Ff>X՜@aXSj@񨌾ЛR6+ CTSyq+8^̙$RG:VL7MmE{c9? 63tOQrR[Gư{ĥs>Z9Ϡ\&|*L5Ta E\F3$1jR*je)bG-pS^B603ѱA&dJJ0hJ+42gAE"rp"DRrqB.T ہ8& B ]F+32#G!SMEZ$Xi$TJ`$ C4]e" FSg2HLBB8űj0PH.(rIFJ$B Oњ@2]C=#A7С"N5fS4Nw.ah9^ U3qvO9aRx޺W6v/,S%ƀg=ۂ?a;tc2YYH*@:r>H0 zW{xӟx8W&y)רq)G$fͥ[;A ǪB`&IP;! :&Zco9zYtt}2$n)c8;dm?>Xhl13 0|áڀc(lQ iHA4<&O/дiY9W~[?fA(RUgM:s1s x:KDzĹuPrc)ubU^5Ni| ?(Y7g}}~C]|W2 r M|> .I<é\^%T.QLXxq 䐞Pk-r{>sm8kO\I]5"*Gxms來UR ]>BpHQ8/#U4vp<4ۿ뗨=Ʊ^O[PØwڽI+MA.Ep՛Wp dJX\@+ jYBbcZP C L+eLFTUz -0hR0w$a4)Ib Q9P(kp\ dJGP"7LIB+lpuސREŲNG`|pe^#/@08}lsj4f`R*Wl$S%V]Rcyayk.|:vӫ3}bu^-puXqQd>y6e)Pv=A l Knj _ɑz2u@,?KtoH+PcY&tlZYAyu LEBΣ7f :>EWP>$d{q4b1IoN^[!Iq^*eGT\ L MFt;uL囄qiSLRA'CpQ69@I]"#sPK&Δu3 4XdLY$` c (Hs吶lbMɅv#Wk$INv*4Q< fDY R"9bP#a-=G`tmRt̼F5 },=l|D)]Ԛbx Q#e!T.Y6aoHԩTJZ\#oxz!trW!h)d$ƐM!(|ahLIhZN&c(@*hXiNQ S/BXZAb$iNz٢eqaa:RN #M4d)G'䅅V s01ny b ad(dmǥ$膎iTKx45e M8svUX6qFj#zJCI%֤Ě1P M9$Il.͑;T: ;,tulя w#T}j"v}3I}exrnSc7瞹͛G1!㦅ݞR9ILcL EU<*E-S{@0u=}ŭQ:4p 9TcNq'BF5 GtdHiuܬO$J DCGA!jnWB+m/62p`"Y\_Xcc.V\/N<>[o~}Dms~N?LcͶVp?M/R"b޺)+%t!&_[RZ =yO?xŹꓘ~[C}՗c$|RBTЊO:JD@=7:y#@q NQ-iHl2)l2"U2L4WI4j^֛tzR 3JR3ehuH!ZX`$ӔR@8yXp lFp5%hWm%6uku_?x=?B$o v>;<ϲMU\HM`m(2u>>=.r$96<~JTdvZWPȴ`d!5]SS!q3IbN}ߢtȜѕ[l~@6Y*3 PD4HAf\P< Cg%S0=$ %HQctS(Y2¦bJFbUrD-tABIJCߴ"ѰF5Tr+B&P5hGHp0(NHف\1g&I/ M8 4fB$X4AQ ,A2 ."'34!Lɘ^`G6iI4ÈS4e3vP(ES{f3K( 'y*y8oF~@IPd)-1Yb ‰3ce)v T(H%9 q80<*NĄDWT2;ǚL a;NSRA)Q(r&a* 2KN@u0Ւ=r9i_ O &;o5^U8rsBFvZ>vӣhJ(`;K9J*&,㝅w 3r9GyLR)=NC>sȰ! "JiĨfA:UP|"Q۔BӃ'`V0g >r" qhb*>s IDAT Cj)RqBuA:趉Qgp*eF6%ECfFlJpt@j.pZcI 9h:ZeZeTcwXZ|Mѧ>k~QH `[ĽfO=ך!I|:< N9:;nBWJY8`tJn%\j`-MRFXb]CIb'B1tf͙YLMC&#f5(NTi$?!Sc qVҨ8 []jҚi)%F}olhݒI(>LԮ8|S<[%;Й XxL2Φ#Jũ slF4A0";aai[Vq).]briVku,:p)(j Х FHwb(R4GHt%F&r] "NM.^aVNc*qtFCl,O% MGMGNAd) <:ӘxkOX>feĭ:IMeE$©6ӑOѮe6mGĝ̢UZfA2  +u*AQqI>Y}:T}R7\,G+">Tm|(GS(jN(? Y ̌>M/΀"Y|A˲"YwCsf405f+&2+)2 ȋEDą䪍4%NȳI R ,0uL)Zg:SrM?ȒrMW LHg0J ,ȔB1ɧ)%# (b,˨D%iMdBa*THQHL rgFeYH |ĩ 2L@:`E6y!juN=TͦlDRhHd(V 9@B.%3\8 rR,APX%Ҥ(nNU:u;߼Zh A劺/<]ϳub-%vF'ZSjȩ;m5۝u!!IN^d`d2X[ֶ VSqik^PI񱅢m eT Ulӫt/?,T:[+*`:Wp(U>_ , ZԒ p\ǤuX.mnj%w[qHsx ':ɽ[ݯ8.m*frr?ó'Nء*b!sBX%ѽΉ}.XV('u0|&Y`*PhäL2اwR˱q,QLh &]2wܿ*)BKF [40!J)Y*Cbmm3Ӓ2# QϠ]}TӲ^~9vɈiߥIubkAhO`,>e1׾࿥U&sFK??Mb^'=^ҬH_X֒T̩VUk\#sTxR. x?gvgVym;_=cFԋ8ʩ dBfKii{IU`G~ߣt Uvv#Y0]MLOc 8xcQFMUR# T G Jh ìqa+ cS6J*PĵcsqH˄%1@8ԥ&+X-*6Le`/nc*hj2t&9RZKFTB5 Y5@ iEn laYq|CkrAjדGM ƛ8ZSpqMyأ:pz6ѕdfHZi jܢʖX1-f-ŚJ*B! jU,l<xhnU j1uK%إ(LG`+ʘ5 3QfRbωNZ}Ieh2q " Lj=إ֣Q9SY(Kl}N V1ƭ__];&kS]1hÍ6՞JFܝ=mvKrAN&gM;}?)uv⚴ҴiVNJ/dM.h+ܩY |el5%/ <ߎ`M;!׸1J/d+'.(X-aT =-sfJd6jDz?ڴj )1sEV&H3!3Q%7"أ~=:Bk&qbߥekiȬa &0Z!`,=֙oPXw5wYW`~f/!$ K޽u3 pPGtvl8Ƭ>v-ItL3cѶRKL'h°عt^!1 Nvyj;;O>Oy.Vܐfa^a:2fEvW7:,Z!4m 025eqD0*s%wyHL m .; =~H:9nXNJ欭G\tf@-eM>b U,KE˫ `yFT 3  0LdxoFt}l"-jt>Qlgz)MӚwp4yvpA͍-o\t\aȆ F(ncr\Z+mL.EQ0_QUN;Nrj0dTHma,yczDqOuid:X!$G 1LD1]hmʘt&RN&'7|<=w24i`5MUi Z.m Cy?|Czn# ka\fQNKV cQ]K$I%l%ms.MƆӔ{ݿGэ9 yr,|J7hqO2)ٗ>1qUJrꁲRٶom!TLPR<{[ ʨda6d͂Oќ-jRYgzKg4^KٽpAo0wScn*<&Rm2acYm:6SvlXCҠH t^0P%e]8ǚF,8:W_3uqʋWgYշ3tpI`kMm{΅] x<*@ԵQWH!')3LS'--*%kh~b?6mPsD(a)SXʂXa.i-Jg)zl!o.j> uuMXr G)e X 0mDPf%eQOXT &HD%Z *F1"OFƬft ,ivMaWUƽvLy^.7.'+ O#ID8pVm8g83|Z4)S*aL0 {s5 ^[ĦŠp5kx@fl4g'Y:c?=bhfheCG9B|(~\>\Q@.F[v;G ";UExXD)MYQ."#4lt"Zz{ies{c]Đg=ܴ֝%Q#r)N"0&, &#PČ+EKG$+9.M$~Wqvz4fNPVBl_Ŏkei%i5iS|g;tWQłͩ3XwG/m8.wS3uf(,J9{"N XV"|V%SzP&)^2Crsv ?&F~ՌyiZZo'?[Mnmc.m<6j&uZKƣF}&I'txB5=?"9O๛drJZB!,PkrqK\|~I"ļq0v0lhC Y*1D>kSLR IvY,MZi\pױ^$[kI͍w%;[q(f #}0L|;.x1e_.{͈}oSlE3E͠AŒCb s[}13!][@JGO-&޻_}MS !']-q:E/S,v\L>Y.l:J:q6%F1*(uOYedb\шXqcRނߺɇ?9mfyB1W /=|??~9Ef%J j%\U kh):ьv.]@7}8̍AN~X3tGxK'j$ !L FY%kS9 5G9.2VZm,7nc.N~]i, ZDA4MC1' *)1YrJo߳蘰 t@-Q4=K.o[-63Y]"LA<5T I,= ;*M5*FR- 'VIX4\6MF8QWKgSq9yvv4WkPIHc"RX5NЖWv(#̰\MSђskmW)JXܼsaUzŭ#dgV&ZR%o=A~1i2 W|ϸH8YXNm Z{Q&^3`sC_ C[ODl0VD+[Lgf$!lFl*"oev4lϡ}s&8XΩKo` IDATr绯1zXVCȨӽ!I1 %QZZB4uMR,9It~EԸ,_ct6w8I࿀Ls@TdB-h elG0{Do$4rVo=q(ؿ[cWXm&Wt{pw(KޛKBauJ=qdatZ`&Gu67סnO< oY5}] !k8̉jJ]Lz*f*Pe84KHG; w`hIk穋@]n|_8WF6Q"NiAlAUT] %r4A%8 \4HPGl6fphNi6CMBDe{ ]wy;Qq%V̦'x= T(%~#./( /poq #|cD[![BbߟxDk!WbpF8r;q 1^&MnTL҄)faH% !R?(2)uD}3 WpZxM!kҦ;aS,P/T WU]o $?fsK7Z[/v!,ӕM QQoZ8HXOT2\1xYc~ap?$#z.Q3g-cbKsߟȘ龇\V&FP'EYXeNmjf\6<6t3KoP+-V=7.&;R%y!ql1>*ЁGm-2 !` G V{~.YX` j-5]:p4v%t_z'K0rgٸ^;mZ2,Wߺu*7{˜Ӻ/gpǭO Mڬw >`눢q1f>ӐKEPc[.}rk@g&$Z+OڦvjkI鹔,LM&E@t-"U8`,YKdVhLMxT"5VHtvQ_ݾ͛KSGdt\)̫),+rt'Py%Ҏ\DFXff15EQFCAaF@4/(wJ*5c1 Gg(h@44cJG*8*q;,s#F/qd5x~˜n^=.Q\Dwo2"UơRc;hZMU#l%_WȇS6wHS(&p-S *wP e0ES% j02k)›S_!m֏R!5+6Md8%߰r{hل]y$+~.pMN4 ![wI7BN%淮1=MhY{'⽷,TArCآi!U0,d2( tQvb18HY颠 |xĮO+: UR(ŹMқ3?.O=?d5ڜu=NgoɏnƳ屵 biiJ(k\%'cbR6q̬֚̚ yji\~ewn~_{~yp}|HÌ^eØLIm?U؎Z*YWj`<{olQ`R4nCh(AY6"4.#$ o.m3[/} G*Hn[CJdAtQlub>{QsxHs;i#М 7zLuR&{h.Gc8=wфFᾈܷp< Y`4_'[]ڧǬI '12E6'7IFeJ3ɜm4O2\>d?g')5_Әʨv="r kP͈YޝM4ӫ<?>$κIL 9vH.7(Mo0M4v K2%̤dJI:J|p g*¢8Tkl' au =;VC3F͹WBj¢;L-X=N$IZGܔ_oȑ8eMhxt>k)نrn=\{u#rc3g\^;©Z0WKEriPvst:NR.O[ ݟIǜRJ y7xexsl_y!М(y =.>8VK_]^m^ɏ7}zd13:*J~+׎tϛ 4Q͈ɒΩK^a`Y~ߥq5WqmEE T̈́:s_UY2!`9cSS&Il$a!MZ R;4 hy˽%˓1ZQͿPdVqZc--F(LCPKn,\36x`t ޚC%iB[] Q3I6j.9rf`QDƜ<(]LJkTu&2=AM1Z4%;SLm@9>:37_쇏Ug}r Z!1mD⇚ՐMlפҚ)U:EجJɽokkKpE̦6jɊPJ% F9v1W SD5VWӷ'h a, CZ}J.NJS9uhcy/~#x`o["p[ tE[fE%J6! M`8 =9`>=cS #6NNLIucc'xMYvIu0:R,K:Uvȵeex]p᭻l+.L/94udg;8[{o$,]uY_6N}'6nOtyKl4{\ʝjcf́w߻§^Fox/eQoN%tF&;G/8U~pw56$; h\KT}3o)zY1W#s?]9K+dKZdM3wiqjkss㛇,~ myJaPiIvJLC^Z+%o?!9k6:aLMO˜ysN_ʚCiW%ۤoڜu}ENߦ^n`o#|qȫ/V`&= 3<|eXԮEÞwmC'] XM !gD^ъLY6fHi>&L҂ڥ,jiFFnG!Ŕqѯ*| 1 ]I<ǧ;xfȜS9F[9zx?'L]VF \TL/ 䔬P]HZX ðX;۫lGLCn dM`rʎOSW2\Rl=^{rY2,~R4cmi$MfK %ɢx_!:kᶲXdL' AӘ>4hTE*[TjP~{kXK l :0*C~c8xOI$K 蘬"Dg \S&uѵ+̢_QBQa5fqp0J4BS0MIeWH:A{O|/E\n2qϳV!9飳\q(壂ޭ OF0ۛNge{myi_v}9N:Jj%Keဣ<00ac]aIaHC2baUbaMp.-.l.25Td$q` hZh5a-{  $LQT2A#t$O=8 HLD:>úv;vd+Z8cZ_&&υ{*G< p&hN<(]#F};/M&1Ss(1E^n AS 9H#% t=8QE\5稾qzLU@i˔jge<ӽgR<*CtDI&%PXpP&2(Zwh<D!$Pz#p:H]6Y("G4}]TIo5hK|*bVc\/lPrB|f9P5SdoNemeA`^$tZzKg.8^aZ6Q{3MXdtG%T8qgXDF H/Bܣqjb1$I. ! ~"H@,la}MƒEr$ "%7dU#&0DiHbGkoZ+V2T$R9[r#D"Mtw,VfeASIib C]DefsB |CGHAߋE@iyuWjW(-˕4j[e%!&4َ, (ix,,HT fBhxJj 5Bӯďd^@I/FnEQ Í"ŐEC"ൠEJCyT*з4B+WL-S{+k%&T t$2"I't|MT҃ZĚ _D "%ٗIM] Y(Ca65^Amztח9aR#f/ZG!Ӎ5+.6 ACLh jPq2aAB! #DQ@DLD@ABR $EC'!o$U33@P:DgDW~N-qQ҄X#ԋ]VBϡ뒕rTm6V]'q5ܶiLMޜEHI:1q{tt}oeaArTvdh.BRmv- ],ȐZ (yAJ :Ƙ#giO/SNyh I@C%8^~ǿBy|' 5Dl8"P' +ZRDG3BvBDD Çh6t-R;\);5rj}#T,~?A6Gl{Fjt>qD7Qg/#܊,>Ǯ{f4[r;>!^$lcXMEf0Wؗؾe\ѡ+ICJP!4em:.Y?CG5Y#&|ih K. "WR cԱMsz^ ~nc 2M{tŽd4M/Dوحm%h4 M>y b3d6}>2 d2r/)Ʉ"&dC3Mn!v^?q74o X 0evѳlBPisvT%V}GȻ3dU'd.J[m4Pʼ:eM$Iy*s-gힻg^l*+9&عkZ$ll=,qcF`aPM5dFes#Qko^չufVڼu&'O_i{mVa+qiUŠ$&1jA,YIoIdwIkr,Mru jt)=;y9bkr{?ƶ H_V^wbv0<ޯP^h:O4l޴Ԡ]la.luls$ٯ>bO=Ӽs kOzY>M3Gۏ>gO"+ ŐWgC:Ul;̩_]"n[>5Gvqӿ9? ,s0az^}um, T]_Xbk=N>B38oNX>C)ƭog7e-x w򣌏<;~kOP\A.u%I)P>Wd*Q4q᭴< J%}ЊU05MzmbLm5'i(2}섀J`KmrrI>eCFY٫Hn[y4~#QM9f.|Ӽavr/ ٿW >{ſ-T^}ϊTK}'~3l\e/5| %&5nX쌊H#; hG 0.?K:$?^uc7^nk#W= ,hR*F?qnN#bTE.Fi|YZ֢v:&|VJC(*<'}OqJ{vJv@ǫ(A0efДqeip["BM^P ʊAO!Վ;+yiĞwW{6b!á]':̟xՑA*I!AgpK:^Kň? Bupp::F X{AO2l =ۣd|E t:B0]g@,Pt;,]~_G|W ,91V?pYѯ]'.^b\ʡ9Ѳ8w^g~() N]K$iy)d;I4] \"n 4/%xjpcsOq3. >vJ yaF\nH41n9>6`2@-G'hmxN#NI`gw~?o~>(aO{LXRaAFT;,L KNx,;wR^ajpiL\Q".=š݌:LJHoF н#^9O*PȦS[$ 8-6k]l![",'Vkރ8KW_nk{F9x˯s{O#{wPDh9V,P=wCl} 2K.Icz(7Dq;t11gsIq5E%IX]"eϟ~N2}/ˍKKT)^Bmc2,IPjH'XBF>"o-Z}GPiG xm*)Z'!dNuV,UŤ$s0A :"87D&cR*o\$U%& 4W })Q\G 9+ ~ͥˬ6I5dc2Q“/pas9̟/;Mj 0~`Ed'xE~gNR3Y/4. N5z$y[81;Уvyl^)B}X*w7.=q??͉Mn~s]+DH ygDdG m/~w,vL``9gX'h2pSɭ#7pOӷHoMN6F#Sܫn!a$)!'  nH"1晟9;w㡗tnO ԡ#NfNl\ZœāݔfEZی5[T_52Q[FjyM5b+XQq%@%!T,B|hl0o DW,rޘ;ݞf`GTQ`:"*K/$(s;;&Ƽ#_Pn(<o? bqa< ߸޷66*"oO8N_<ՎEJ prK4 F!#V VM:kM{[]cIe^t]p⯪|5=w1ڏ8^g(;vD4MǗX~nC;mh&>\վO비rhe7-Pl20ows?coG^,;M8gbk<6,dQ%60 F9?M1Hyˋ:0)pҊklGГ`)0\^yRl|{^v$ȶԄ>[T{/N8KnG8ɩg(#re:>{n14W6pIҔ%hH U^GC]j2z-H$B{v~FV_5P55ﻓPǁ/*7vժѺFޓa(#[#Q \`ʲ7RJe{ϡ xJ I jgnU}P2ЍO"?w[ddvl3NCe6./!6@I/d 3 hzܨSȗ$\?n1,V+ъCNvÆz{ ϯ!'-JQDc^ߣc8vDOlL3Cҕ.)]r"==[XzHҹ\e9ƛFd`"qK譶c"4 ws 렎<0s'~_Z]!>Nӄ&˄KQ&˹e`sT1|=]eW&;e\ %/ӚH]֯?Ij8R?|}ü,XYH\a3l|kz(k9>;!;3礐g. çewͼr86Q%h|2b oɸC&ݚLk1f똫`KhBjt 6Qs)m(}"+  #T.6Mk &rroN&g׎eu"Ca;M.<~Hȧj LAPM!ٔ@rl;5 _=plnR=J1b2Ɗi G{+Y Ox˜17c{|Hv䑥[a@hoW"i㻹5w~4; {oĚ(딝-FI)Senl''t )H^< &K* 7hl__ěy C&o_pmӇ`sgXC0rzR%UB^c)IةL۩{45Kh)aU:8LA$#e'w~>WO5N RiZI! "]DIH I$) t S71P@USitRxWM'̮3}r2y_ ']nϮ-ؠAq%tB<8up#ѴD+bF0(-8ّ-!iUDIGH}YI" V Kt9zj@\|ҏ\q>‰>wݻ8Nop;ȱM^ϐ*u↛%.:80"&8vE]$ Dv;hZQG瑗34e&^-fC .ET (mc`n4ǾäW8¥pM=7?HƙS 3vie/út2HbP65r3T>N1Oӌ73/HFԩ)u^_ۈ+( ,B Lr̐.ZVf3r W(+~ Oddp ;żi֦8Ǎ%|eX6 oq&U>_P>};,NCP6dZ;MO=ڥos-F;iM-1;@=GWOΟ|vQm?^jA\GwQm/=]FC=Ȟi4WIg,F &ҶA:Y` *zNdl-3tY$v\1S?svǾ3RD|fkGH?ꎰ0amAAbP3H; v$c( :-3r]ȴcH*2y3|jfo+'YΟq O4{WlU[&#M|Mt;ezoUys)Eg/qe0pC|qot\ ?37~f=凱jY!.qkkc骀 0)8e{mӧ>sGK7a`E6>'yu+\X==(<'s\~wYuc?R 9oen~_k?Ǽ{ou?sEJ%Z3R18nm+2St)ҫ]Z:FY܍)|80X|_='{xIäֳ3Ʈ::..2.2:Y`(_"I!\D˦fRuRCY>?˧HdϜ|0X.V訂F`Ga,H@P~@.!\fnV3qBtA!] 5LbHE BO6 y"BbN"Rx)Ң H "},GƯXo>#P6I) f Iqtb6%E^N~exonY|Ux4Xmnȷ-u^=7hx/"Mt%iy4DV@t/IoHcjKnqC-S% ''* m/6zS6aaPsq+<*6CJĭ:k;`P^YU^"T( ;Y_'v,37ҵ6!=MNm%A/Ùg2 =u /*|%#EYe̴ŝ/!~0k^tظku|ms&(0OEG_9%jXַ:OʴХ.X\aڿ9_g[=q>zaHhwP^Cn?ݨ IDAT}D]%%)Jh RG0h=ª.}mQQXQA`0;L/o5WѵyIv bZH"RTLC)Yt:V0%i*c<_(߻58z>ΗV߂X}deqQ7l"-U?2tĂ;S'荒y/%2Vl!D>B c{nh_=*@˺!6CWH[w>ȓ7Cv@,T[f?__/11:^B=IwpW-cIwQAڌ\ v#ۏ@3-11<|kE+wgA;döMo8 L2txvY(Kx8Z1K+EO$P#R. ȾC..+~F\Q*)f4Z;4(cQiH Nt"1I!G:G;kn!:hEؒGUCa "Dox@ۈR*(n8Q(*X~' EuV(q6J\".p&1E"hG0ZEXbLnir3Ü5-'$L. H*7Ekܤ`R#o-8Ɇ?mc_)Űz:.J4ErZ ]Otჰ}  RsGH핰| -'ՙo*?Ln'NprK?#>fZewbHu JWDXu-qHvrR$zƛ%[myzy9[,tg2JnP_U} *f^0Y|.OEpѯi6RE#;՗>6VY'"`K&eto9!pU'M DK|W[D8 GEO82f(kh- #v%1 Q3Q%_QQnҒRU&%FzX4Z"jQ$ݙ('Я ~uViIa#cxi.!noWi#o"}gc;H)#fb";:͆2-L?'QHҖ}+/Hm'm<~S'Va=(N% ȒN䳯p F}oN0K7; 9sqZYDY+3SN/WV>IGؿN@jIZQR覾zq3?r0ab`X$qX0˘7lڣ.pKY)~2f6no'H%o4y. ^oyt۶oaz;Yj5rBԉNbmjCm"QWJsFlrb6I"SK)~M}>Gx5nQI:,J+܁g(̓}pLyj/}7rˮ]_|VAQ.6QYzzU.^;zw_l܎:Fwc';+عS;Eϟ oIxƻ{'7ʚ٦;^gō7"r7؊ţ#-¦[ifF.Y%67/;YQ6{C֊.n^8M-Nr 1k>rˆmz+DF/qgYh[; Nr)Ł Is,՟bg(M=RY]X뻙5+X<-3k^AGY16O}c$s$Js?tbEV>~ - [tVK@W#&<ُpBIH2.jF(4Ao#ؑ@iVBi3_E,JK.H14"q\YД J\Q&"HYB@`5nf@^q QՈ >XA$dtl҈ 46F$ Y*~Pq:" a"(` aJ"$b(BM u \Gq nDm䀑q|4AE$Y5@Q3CR7$oFhZfyŤhhx@+3CsV4o[6s,lDկ}-Ό^ h(J~1nўq617I>[w!"ͻJYmYeQhPĪg 3D%*st\be%V Lj09|`C`$lח1jc'tS!c"i; *59&W T!GIllVLec>]F`=Y`bV!TX-fsFqrbQf0_]{͕)>j|1Nԗ>-/x?yzO?Q˝q t7v2n}wM7칯 79xqgꏳx_h$ . .٫^y11fo6%CF6 kvwXHWQ6+$C54:2^"̪LyY!JwH+F6l\Fgɝ7&7RN@Y.y̵5~LJbE`ti[bl<ϰt/,W=E<f HL"G_~Q;Fr5,ӤLHƉ)F@aΕH1Ӹ u4@N$[&SuB"Ox^^>p#mֶ\*ԕ5։=I)"] & 1-@Ն@[6] 3_guD?c'~/`,C@i3{(޾f\?̼A&SId е6݂=ҳ".Dm6&\vR;CwT#M ZviIwJ'w{h>DuVJAz=">3Z-i`u:t4!V}+w5g~ /kűmlxHwMdc9lR~LtP n?'/Ӿ'7;wp7M9ο .쇑%t8΍1ykȷO'{Ͷ?HOfjF}Jg0HR1|~_?xu+:v$V8ɘhY467Xw` t"Xbq)OSK,P'Y3X4ޡ :x.֪ ;oUt1C۸[wɪqR!(ˉaƒ8Gy=N2F*.ԺBq^zs:N''^o%Vn+gZ{\e:;+:۾s Xs6N9pޮ|kNbUN} cyb¹4?՜WkV 2q9J\IQ&E7UfM*0ҵY;y]'x4OϢ{wo;"4`yy/q{זi"W>a&J: aԡH(5<=\V}a-.!#N=WX^;@!J_&0-Cd0 .vٔ)T):!RdP2ibzp=Op]@]NM.6:Ԯ̱d2)rbJ,P1B uOoumhF"npemo{ ;gp ~N"y6e)EůY-$!O#c2!G6UB@@F*UBr@t [&GF#-Pĕ f1& %D \4a/14BA,U,4MDpMID2Cfҭ8A[mR=µe FN! dD Lz =dINH6 T \$ DZDȽ;֦{:bU[[LYc!="V=|y>5G\b*([Be)Yed;"Dfp#nEje>PDFٙ4P(qs]rs:11 *-u:H QQ:VWx6p=qo^UdO!з.e6p_qvt8\.u\g8]d8 Yo*Kp"Aۢ$qf`lG)4Z"ڂv@^"\-蔛(u-_$yFM\`Wu21PPi[,)uq.BYmOff8J9|-nozd+ LEϪ IDATjf$'[ +R-qs)99ToE\@Dn,32gfjg\wp81BLwd[T٠htB"]W jHd1=XF) Dڏu0UbHd]0֏$h +2ȈM[tY ,<!#űe]4VFD$]GQkT.:M9 ̳Rk2ήM!տr;? 0Хz4"QVN\鯛r< Qؑt|`_bw#c|U_`>mlKٺFO|Q> roF@݊?Bɥo/_|އ~b\ Ԏb~V)G̭I- sY.]X;35޳8 ')$(v8#nEEP"@p:JRÆ|&./ogyF@Bee-bik"!G-Y7҆ZW!xY $jl϶P_ 7yCd("U䈆aRG|UӮ{϶r֙b fbG1xy%ެwFEf{cq`Mgz$wS+pB 0a[CN$cJLn\u Uo?"7U~eebQ+8JJ) {G~6}CF<ҪRRtVx vO;ʰX)J.ү8V5?}>Fe4Z'qN b)?8wm'I$.5DKLI>j?|¡%4AGV)X84X.ӱZ̴[ +l'_= g.~ݮ(xUTܱא/2#,BzINVODŽIXc-nsB/qj[5}LoZ7Cz!ױ%DSerdwuVm i"ͭhcl*`己0y^ף4[5Eu%OhHJߏwX0GDdס/RZ[T]vyͱe 5TA!g(t!`eT!Zt< audI^')!$KۯP{_b\Yxo\U88{~uH|XK|9^'U41nR6%+/RX#b ǹJ'\FNDe#/_JɬMѻOc6_QV<%\5=Ml+$1Ƥz{z_L祫X_a8cFK\5C'5R; >OMF)N"}iujl|3SFF\d |8M>ņK1Ns#ܰu^ obW}]6C+.sY-QV00`R?0>rC[$t;EOs|0sï#fHjXMޝ0{8p'GsZ͐|TZT.ftS9ZY Q.SXY XA=FԈ0]_VZۊG,kj#$b,|ԸO-8qhQYVhf@ n }HW0Wǘ^8ωs.Vu7RpVBD.1fGi >zrYUkD(8aD ې%h1:OAhCcսI_8=]Ծ3ګS;\0DNjIN;2L`Cxv-51UXlc璚*)ޱ-;nCyAacڋ\I^VF9,4xA{;?pȰ$2r0<|$kXjBQR kXY +" %7RFcLZH(gONn0_֊,T ]wbLgcwMP<Ī-cҒ\[cI3uGR}M9ƵoqscMUS(v;oOf~uuCl~Z~Duv3ey)VOGt,A.p-4obb؁Gu6fuyn~^ګ.F2X31мDqe$4Ji7<< Q'?HOUt#z!f%Xȶe"s3.pFבfx#tA!JAeQ%c<AjZDBtX ԄG'Y19 V0K Yt$ڒU8Srsbun$ Gigu? {yF3/32P/s[OC4kQ/˔B3xRc $Fb}7 lәY앣 L _^Eh"-&&z0s(+Rc$3a! !~Cň% +(Q`(Ȇ`(BDEaK!-"L,! -H#DVhL,b MکevDHR@ ŋy ~K"P@TDkqbb?E )YLu22`qLߦ;T[M4j^Iqb$B\N,7qB#A$VQ*]L;/ coq_^r&[7i$].o~ޠDZr|ZIHKH15dt%EU0r3WͲҘZݎיEk\54=mE.~?MpmzSyj}i:aҩU^Ipy|YShd'q~'$/1UMivc(y5KH+ޚAUaI^eN7[ yGce`FTq Oo[fg8Ek+]0.wȋsWꤍ(7|{FoĘǹv;dǺɷ55?ܕ4ixb s?=|?{'OXC}V^Zg&8so '_yP60Ic%QA9@c"a-7$ MP0Odw'ix^GB6: #N, RCvWG%a2^G )gX\YTW9xl!'^(R 52$&Pb4jlϫJ ;L Ym5Z&^z:*E:g4Wo1UC]4-siyw3&/nƟi[9K[lqOz1J2ĦmogT$wn' qԳ\l:Elh bbkJsWz5rr3'ކ4b4.⌚:{73ܐE~l"p/nrҹьHTHzkD&ɤR!Ecn 4EOog_f]yr5(nvGC"Q5Q)Y%BVd XLh2vHk;4ƨsOY:9r{7r" q| _,p}s,dr15NAQI yAHǎƑv_>q*{ʳSMH0M3vq"@G |ס($dYֈ|-d}}'M( |l)gljqy(ۄae"ijQ\HH:bdѓ\61]Q1KId| uH)خBL,"iXESbϠIs8b L+4;AbN( tI)YccT6v9 g|5@Hv)x<@{dk(ܞ1\C'oR$67 [ xkG낈Ue1At1Xbm>'x}5'|nSܹK<0c7F:n,"w30fGO~9iSdW-OϼNJh8=ҹxyw!4Vl>?L89Ʈ2·KSpRnaѥqMa瑏7xfa~Hr1ƫwc?ά&z^Ap㼖|jAަ7ܿ $ŷ67fȏ>G믒|☽A ]_JƷ3Z}bRGrH(Iȣk@P! :DvE|!DB<&O " UD4dAE$2I>)R-b H8&b׋CA.B $ M{lv]Љ !B Dђ螊J`.ЊpWGA*aiai#˧g{hxqq{h•r@_K|juXMveoSzvc^;.~<3R›*_zVg-68HpoR)ı|=>;,qQr^! -vǏ6]q~ qYpc$Ĝu2<=={6Nd.C\c-QָV3ci:cJO>ggiR)t`s;_8_v9˳-m%3w Xڣ-D!ͨR!(Rs1+0~JüH\hR|!1aiGxÒaR831e X/R7{yjU>q>Pv@a1̂V:9`>Wa9#U*I߻Fb S3(=+_`*tɽORkw5n?5C3',!SϓIdFi_$fHmX: @@WW 1ҐW.,a  BFhD(j@M4 Skd#qDE&p%@A\K$'}d H`dE6IFOa>#rՇMZvZ %Cc,%a:7~_/ע2vyrb\D){#H +K,;>]F7diYA~ĽDĹ$V)Ych&br-}H=ԇ!euD$ɦxTB@wOG E˕;,>Tyչ/'HOyfjc9  ɢ=N-2=D}{*b; wP2fGU4O봆L.=\7N6sm y`gm2%0'AxDE"uSH"0P|Gd\.\9G3[/r#Od$%%m"J ̰GM u}7 7L> IDATDM35?̧z쿳9Ng]^)r?=%U?N7t*0`&f &Z&ͣma}jog!.jp4F2<M۽ÑW!8Ks-Ãk0y% .箪禸z>F@%=ODeQn'$!'\~ѫS|)LAJu1z'O4ȳSf1+lƑ>xJ_cqI*W\?'y3!)XMbr/orCA(o&X8q#z4A.كU8:l)ԛPy>wpƃ]5PqT~`qOtE*C,NfBN4$Ri(O{]մYIGd2퓢wjqle6{>yHs; @2N_)B63ǝz [`{8|LL-0._d=nϰG=Y=T.qPzcٮJcM{0T?ói>"X_aj-{ya΁ʱwoߧ<}_5 cLX0b Q@q MāA=vF].Njt% S( zФ )WƵװ6z<$*J>Ǐ9(وd?$"lEDUSȞL<$_]=a( ψiYZ8FșA "r@BwDa 7Ie躈IQ_dW:G8Ncж G d$@Lp# 4P,Ln+d̀R,MOhrCo|o7=?.31l^"fpa4tAȌ{2bЎt8h+X Y7'ХĠzmDH"h.%i# Y|ˤe͟ĭy\Buz*%,da!۟|I.䫄#7G0>~!IqHy Ny0A]u!̻e1!XXS\7Yb<qM{Tf:KTgo1^*\ȣ LO<2҈{^!frBLASn]G  {iNМ'13crlPrNȑk@L"Y$YPq% 52>ͱ)X.@RZ ea!vqy*RBXx@#fccOY;mZ\I,<ˋG2yA£x2c%팈pN |1K*3 !^!2N-/IMbXc%^ a٭V=uvɜ!woN%hJCIf-e'wHO ]N&I:ijK"mlbM vk̨^ HMܕ͊2NHg1~IZٕ] "OYo3r駱d3f;9 dC6E^c5Y\ꎓ<hvݡu79m2?g-گ;-+_ҒY~έkor8N:;#2qYАD/<@ f8y*?K|H4NO0|Nc\|_k0g8v\Ήk *<$> YY?^pV>F ;S55ҷE>7z-瘻q&S&@=!ɜ+<`j?5r,U$;ɹK\c&K#R.ѐ_||Kdsdv8q,}4Ke?܈YUۇ}I_fK{;^$z#>Wv&6B T(x~@$@ z& KcE1fn!3V D(~"2-4B@S$ 2b[ &A`j2QP5GU}%Ǒ$D^X @Q%>Xf/a"&Y Y] SP\CQGtLЧ[D~Ip-!г#v I gdzHK.4C|/D ?LX"#3 t5*Xt[-|'eJI:@(F&]n}hn|;qo0}g&Xxm6iAOFcS+g891U~FWhKJ a[aMe3RX ADL`zqmٱqfK}#hԎX[5<"MFŧli6hM%SKuNMBKd4Q7`2y:ɮgv9$|KMn1[6Tk{ :R_@NbC7ஒ@qZN$Ŵ&0}M47y1^TB>~"F&I{Tۜ3?VQC$JHIP@F }$G5BAPm"'uP C HahGY704_)R"rc.bvWIMtEGJr*Li H!b\6."ôL*n@TLqGB DJrHO܉Y&a:C˼9 )Qcb2G\hVMiHs$ q. "b8K) Q>wcFUo ڬ e.C5'E~@˒D 9g"*tD "yB)lw؞FZdKq0567XS;K z{I,#_/,#7I4<9揗Uc=l !7[u?(?Fpo w8n!j!1ƻn;`Pؼv[.اb;4ng Z[XK4^/2LorD~vk_EJw]Rx#\dOz ;"ebFN@SmgȺy#$0 yF{<+/;;Hg\A$Kxڀ*yKb2':>".YTQi8QzĜ6l}%5& 8޾$xs0.t78i~K}F#i:&IhvIbܳt~dk/s)qӼTc5?'2;s%ɸ4= OtCvǤR];`0^GNqm>OyLL΍I5qOHӽϩd4֦I-V1^m oð'<n"͝$Yla*|=sLֲ|!_}: (Σ_d?#L;cRqT w4 AJt 6X~Lwb2gt7^p@# c|tGX8J`JDrDh{0U5`aЯ!HiJ`QG:0) {KUX50/d("2H>!a萐_B@#>bH*|"'6g Pp%QQ ibE+ !IuG F^@$B{KuL@ U]5=MxHGm_R-Bvf EH hI‰<Z\$P4ۑ:~gQ@K;;α/}mb5[_q ߥ+pRc)k15r"EVW>T!υwVkGcb˹;Y*[|O<("JGZC 46ŗ{@T%Rt^"ANak0%\JjFYԵ/S/Fie%~U%^fYWD ~鯸H}8}CJ,S~a6&yĝ(K!"> Lα4uO.T.Ji5qjH\YfbA8onk܃*-.͜@>MfMy$[b<ᣟ8Xfr Z'٩hz ɲ A[G>Xf |Fd b[=Z' 851b3vZ尕 ´4F(Tt92aAt9Noq*t> `m ;cPo(TBdlS AD#EB>Nߎh 6Yt>׈g{C{@35)(!2P JrA[evT`onSHKlȱ5Fzf%b롟rrofs` 6I*$+ ȶBVljf#['I#FÀǥw,ϬL/NМGtQ b( Cs4T&nnO\vwHj5F";<˧4O,u|G4G/ +~c,*,՜I?kLzD-hCFR%{R:QZ!T?fZk.ꈸ2b0dۧ?_݊3w%f>\>Opbxˆ]1J,O(᜝c]!{Iڹ+,hfci髄amؓΣ֏9es}6"<wOQXᰶG되QSDbT29fG{ȣ(Muq³'f<$ * FYw8  w`=bՠOP'˟&n\0 8#:j6Nat 6eR[hc*=B~kd'qsDT N@V:RVg0L$ [)z.yEdǬF}7qOl5hoOӘO~hn] ߉z&㊌B7I`x!iC%LV d{m 5b*A" m1$GYˀ1&ȶD ETc CN:% `I\=袋. F/N&\ "yzaWlb5\+@Vmq!bc9jx8]\Gd *uAlhTcC/(]dQ$o8= 5Hij< 0RȞ˨Y';Fw A]ȻqLs2#Io:YgdAtʉ OO8!a7+2K}R({*=Ǥ Z:Eg\N=uq7Mf2zGĝ(ϝgN|h|O,YCRM?A̵ 2Pv$kPHǛ.=7KqPw\5+=Wet)l)ft'h)^͵9R5>Bf܏sy8YDi4jqJWHqWx')91x84\pmGbT)'r7Xj5H{kffRYZMw()sċ]nVw{N_d7зaEza0#39qdjUΜKx@0p\KNֹl/EcL)Hqne \"?uS8ͼG8W<}2QLeoD&Y9~e12ťM7yFUNyrki/X\ZfIL 6JcF!phCGdYr7l#\ WY4^kê%Y{50P:duLGpIoe9Zd\7do~˫mRM#L$Ak2V.P?i޻%6ʾG45+nJ!QX.Fl2QnT4[L6CL@F%xl;ťO:\kf8ma,JJB[#+E<Ue\4^$ u|ɡ]F"'PN#ZDCN ѵA:g}!WQs۷8x2>mSBGvG,JyZIlVڀZ5Rʆ zLgeV]m+^+rC;2)ps+#gK ]G>F&2o`8u4{cgcxay| xb\) KBǺPHH>-0A =bia:0uo넖PP<2ۍ1^z Q-"˗YV)>i1IZtZej8 3G8J5OIX鐉ᘏ5A͏o1RޞqzHeObvp +>o$jENeƴ!Qߡ',93q X,$ҸnZ Mo Y "m>n(2l$qF1B%:$mP(  t n 1Ra F]rG=ߧS6}ˣDg(F=UD<E 1IIF,C6 -y.ڨICBTbÞQ G*8f(D1Bͤ;j>1D1QhYV䐌xF$"hVNmO8M8i*#' e`GJ!XGp ]QL0C\&^" q"G!r{Ȩ&2XFЯBBcpkn Sx? X|Bw$!>seqRv uݶpjQ"Jc)pW(f'Ǟ$f9Wdnx-7{u-c'\Nxx>@y~b}s,=0^ǿpvA˟'=]&uآinli?ήxd\ s'}<89k&d݀cf*6<>I6/>w0 IDAT)ߤjzUj3iq&.#.)I# *#CjEkF /7dt[%b~LXN4c# g_BԪ1FֈG+(u_XS`esQ'ؚ@ X BR":A'Jm1{2#vvC&*,T Q!*.h!;5 ZRŽ\7e+;RK+HJR ApZ*zO' !) i&O0c׸cf(pKQvQ _3?ؚ-E-B.EAHt(3 * ] v0prlʳdE;4|on|l<&w+\Ȭ8>oMu]p4Gv]fʴ#vEܘ˜⤳Y|A$b~O̞+IisNW2w-M ƚCr1/_dtS\HC޵㤊 y#dw}ݷoUjU޴ZX41 {C3va`yf B-!Zt}ګޫ/=,`L}"NsEG6==FLG鹈Ҁ=Ck=ʇ|*OpF@vVa7E)HAX2]A r&R zǮTǟcV\zgnr3sF2z_>ўS.QE1ʩ9*.=S3wZM{V|c-}Ic*{p_[VY{y";5.,W :j5 ;]=lp`|/ˏ [G +ADsʊ$˔n"6EӸFog (ha@AH yУo(GLܼC=tV#|jeA&BHu1jHM2#Tu&D'%/1I0 q5 %SHAb9GKmA[DZEq0.619R-&ʣ6" 82D^ngҔR?m\\u~/v &?{*$['/r+(w?wǞ/q11k!mEufOP`c{9xYofܿs3ŹYߋaHXuvZfpSBz>c:V;0 lF|̋m(uTw[X/,Inwt'!~?tYfDUh~5{cY!Uext #KزxuS\ɔ僟WVU߷Yoᔑ/32[cZN+ i C 箝-oVeB ,\x#FN!5x8Ϡ=T^K%9?0"NaP*[IYH86RΓ}]giQP48He@9lRTC,mo3ct ګTƒ$A ߷ײ7Rѿm]`%wrvqo5~j%ta6u8\ R0>0BB^1dM]xxfH\`Yo@, 1Fq._Y. ZYz:J oqO]3ĞMF T6f*ym.]Y`xjN':axer[F@ .2Ц2nH*f*Qg|)s+5&{UκڠTxz]T@=/7'п3c{7ٳU6Y٤'9Yl[̆޼Fvt}ω 2cìxf3K9r+?gN %Q;ma(Aa`t=ZVVpV($!i"j.s:R6ۤHx+kQO nN PT+2EةB,7Z$FqDZć0UmVXK5h\,"YI3Hz~e }0FO"E J`*&0 C#`KcأlH?!DǕ9ZA13)1Y*goo2fԊyB&l촶(o9W!y14r BaAAZC?/ۿrɗ=qWϰ]40f14PYڻ#\rEZ`c 1KE*n//k3f?Ybg~[2m/-n-oLQ&힥}#mio{`>` {T!Z3L|3r%UBRnSS3dRUec87ٍ_`{0+?5Ϟ9Ҁ3'6.m杜]c1&~gxl}@իl`i89Na~ǙC#>/4V ѝce޹'±&)/}fNn ?<:uc*ĥ2 r}e7XI[As6J A!p]>ʅP0ګDIJ0mR "ͤ0\k\A7dEz(aNo`hInrðL곇ETWxA\l;䊅t *EU cJU.qD ib*s͌ha!e(9nw/3o3KbfP xF$G)֔E롙^Z  h#T׊ % 5"-G6HMiR@%@B|&( .".S`@sor#G7/ "?5ඖo %3n@TQj4Q$>t.I_fu.PԶ4=X&,ZƵ%oޟ,JzoQ3HGVƱgb%0#"]-b95$$˧0pD|?_ZE9Nά\b:wͪ˾K3LUõr}]Rxk6JC[s!DtZ&z8%3|%o؀7e^ow/-봘,yk3 siå+<3V@*e&[phmsg^Xz:3ژg28,sngK/}t:p16{\=wKn`QLbeRS1M0ℂncf6IxzBQ]_9FǪ*D$Z1@GK{*:̉EBD;^S4}IB.6P*t6-6m8ITO,<1M1&1,ː` ^`Ja$ 2K ]WIR:zWb)?8ِV(8l="MP'^^TO(IJo!5>&|7Jy=k?͌u}/Ԗ1[EDQFQ v$Vvx2oD;x).~T{FA&a^Ơo~a'zy~':{~-c:s.\WRa:8{Ƀ`z ;A\P̣L)r*7]Gqb4*`A-TC }n٫ ϡ?yz(kG^F]v >ӗLw\붨[L߁1Q//X[Ykm ]DdKr/7蛂+G xGq/15++mW/mm468=W&mBU#%Sz1UP1jzEx cx)F-:]aH2W6'q':(^Lֈ&ز-/r߾4)Zr5xIdb!Yɦ 6c" &`6Fy (uGT^ˡ3AFT,cti6Z.8EF.bC.)~#U|֖Ϡ{T;,%2/–1t J#unlL{UJ9Ső`"3dR&Vh ]Ƅ>C{jb(nk݁N3gPuI eb*70y|AsO_VF̛]b9G4.A 1F][k-OֹÄ*A0sM^ipwɃdP<ݍ)m:S.q|ܹЍEp$1Ng4CGnEga]Xm e~/c/]#Kƨ8OeI~M:83oPfod(\dvis>ܼȨK:S>| C~j*=NaajΐNJv>:wMb/s@ϝI8v`EO{ԎP=WY8?td۩6ںG2\@w>9ê-m̙wr ~Oolm=_@kw2`43qQʐ8 4̱O+،yCb 2I]2G%^ZE#L"1$F/wHpcI+k:e8tCRAC b]W-LG#(iڐLJ2 M^ehN$4U-¶B G$i,9JFP5_GlC ( (]Lۋ,A>djLs2Q:A,IX?yaAGqF+Gހ2Iw-dD\GVE Bfngb1<е[Ȭ%>3D|]tM62BpEAM(S6'Óĉ(g2~oNl~&_|5Nښ#OV>śSfJhyc\T L.G=nր/>A"ZtFG)ԫ)Xz'GI]:ebs1+'?ɏc OdtV{T6YB]G.!MbAh) RRHY]b @I+l&l]qza&Lj}^YC3P,P<@4TˈZ2vgm*. }t^o@SbHZarHV=B N04wHӘ5CwnnAqr쐯ۯ1匌t;彔WS+%,hk#'^Go/7k'llT(85X8 `f}U?-T#Rb$h<L nWOg⏪-~|Nj;g.7?=N1LY{*85BzXz 7oU9Jj@ ^.U4栩kl\Ȼ8(O_%v 2&`h;g82}f^d­32qQ6ŀ~b{>'WI*T.()"Rŏ[9R 7Y%t!֊86񂆫H<mF$"eŰzDt3u ʦǭX :xj)%$AD!6)h{PJĞ-)* _xƘCЏɔ>⬂-y*.Q6$2WpP<@FPw"r@69$b^&C ~ _1w0'?X% 6:ap -q+QH92QEd: Y! [rK'+iwC^D>co:»"Z%B|5ظK1;ѽ,SH# UANg(:QW &%dr)ZיQ,)[6h %@ 8&^0F)hdպZFދ KG,y*CG][cҹpR }Cw3EFAo ,0/w \v'V?Gz?c(v ڤR *+إ'-DB\^j%24cdETi^&S ^NK,ƚhHtk;< 7c+u>Fku@6&7; &#1fobC,c օǁ&;lj[gQ[mktj ㇱ]5S?;xF89q?5S2o/9o,^qwv7bMD4O<@sl7CtF^BNY},8.ևY+|4X~ -Wm^w1{9CN.NUoîﲵ2OEwSag96)&r,3>:}jLS-WO;R_,kUu)\^l(1>NɀM:Vƾـ,.)X0C7w-ƣ7h‹WPLJF1J AHh24rtE"躆P3difSi]tA䤴)H"XS IDATɕ %28R*)Rr]Z4%L4DftEL?Edܘvltg98` ZCGR͜V3F]=q*lȥ7\1`sJ 6;o0v4i,џZcR (Fng9dcjNw BEFZ@]e+L&*xݜNaܡra5;FDQA[ -:b y-x~J8*m3^WEUXBSl \}Ȱ8ε` ^2@:B sQ%BKnL%E-L% ȥBlFQ G&&-3\"ד&7[ &d9A位>fr; dmPtK+ y2#SoJ&yyK|)`߃OsNi oϱ]_'p7;?Ul73|;Ak~ガ ǭǿ^UC8M|8z{΅?m?9-4'ߡo\PkƏLr#o)_ }1 [,_?Ȟę'xoXf >>_{?W&g~o~Cv9L޾) uf'jV94[Zb"w"l:ſ\43m}yA"D!3&RN )Cl!T5R3E\ht#H?@$4EBH=g(dR:j$A4"/B !,2E'R@A`)!R %c1"C Xi@8K\! =(PIt=#UbTzTa#p1s b<1+R kX@ Ȕܨ@czLG(j=DuKQ!@ WW֊'15U$Y 3F~bR0RY(O:/ps]UМ( - 0J, Te%gF0Вwgt0ӣ5U'YlPO5ș`cё!LO$Z<qN8X-U'p{\""ر(_XIy1 @rxO Y15i65VkS$ A%&qJ?64X93KaVI͈k7ARnb"Yu;CJBMd]HbE,"u/"f- 1{͊Ɇd9BHҌT$ d%% -MR>7:~&d܄ K_R?~^lf߅6{:.#6CʬS5Mzyr&HȠDc5c#6OԐ>G;^d?#E.)1C' |:!ۈ 7I3]Kk}3GFƺ~~'..+_G y{3,>EZ&yjc ;d!y"NrRiY&ꞿhEH)ȐKCy&vк{=&ZJ;\Y#WhQ&/:LF-BĤUR)5#{R҉pז]7ރ<Ōe4LINomws $"PB"JBHDr='$SHRNU*$ 4c ,r .9PHdx;7[k > q=AE#Q50D(@FX@A#E*!XM!EzDM96P!U%Hhhĺ$tO޾DH* P)` )3rE!A^O׫ Od"U`"@@D"zJO2r)5KyoTK|"725bGqsmHdLA1ĖZ a8 zHRP}z_9& j"c71:Cb0j9L [ ]-%<+,]&9t#M9NI`|I nCU)rvr'aT#iO N>ҮOwfӟr2]H#U@9F설ae:jCd2rf"\;(*Nڻ¤vA8F)t0Kq&U2'HHs"S1,liZc:w^g"$AĶAa=PehǠR154eH/uڝMrAƋCg5Tx9,2~αzSt痛ߣD(,Qm{cA \DrT-wOe+HYl]W{ʈU L ÜRʱ" ڽ 9PH*dMvQ*C>Aup{$r:j)8ۄq 9` Sװ*B*I$(946\5orr3ȸ 'ސgmWywp]G9rIl^6Nj`eҹI(чG׆C^ږdpt㴎S@egWmSVIY>tZjƽEfFg8E}31Te)R3NF_&9} sr+Gf_>ʟ0spEWW=V0*_?=/G06SXWmH}+*QDŻ59lW2'.ʐ M4 %]solq#lTut%\Ζђ:Rozb@{> .mqM:* \(Qk,gKq..zw)Go6n>G̍ɜ\Du3OvMmThQ%egvQ`{k2("-eiQjlȈ5A2DRajRJhP'?-S#BpZ>_^屔1fwfxPaGt<… #M0^1} 1d$yl"9݄BJ PMGMI b!P"a-fC p\I;a7YNr3q, X*(va!l\AztUUȀ=@pugHU54Uҋ"BɒW9(b]#]}緟BWk-Ĝv. QUFd_rb3i\3vQ{ A \)$KLKC9@N3"P^.-I K "ՠf}K$r1$ 5$ \T)!%+(RP# rYr+&Qf T<SJbM%LL \E)(^D:@ϩ~*QШh̉r P)ZJRq82ORirE!8*8O0y "IOQ(S0aJTAaɆ)Kf0JE)~=Mn򷗛AM-8:#S^ȳ2$h9⅌ĵevA@3g6S^Ɂ X|Du\8I.*$4qcyI"FŌZ0ڐ &:#ܡd*JyGU 9[MBhRCT`{z﵋ W(XQj*]zH!l3q$@<Ι3;}~$KЙzY tKZ3gy6%MA|gZ}OC̐ _i/Sȶ6⯂D)hO8>k# C3$:[~sӳڝ/=7bj Eqޏ#˹=]@\M}$5Oy?pY֣3u2,8QK,Qk+ٓDx^y2ƦY_نSѤ7LW)i#'N9D4AbHq2)qXDeljn2ic%ɶ=f31DûqQ̶|g8Iùv ~=®=]l sv$R;?uvz{Rc}w{r2S:a7ӯDjͬ1ܰ{=a5a8H$W4nIϡU )NeDj._e;vv@ kՕCyzvz-̧o=BȘ=CôB 8āq8?AnI惼tn}jSwg-8r0pQگ"&%_"2hwiqmmn]K~)҉8Ox_oajIGדUCLtKiN2Z5aV+턜W@j_X;@ ==1%} oJZz. l: &ⲅk4Ep02[F8BHE8BX7@v6qN rm& :p#cD4%RAz!XWDSy)Xc8tf1@(!2pBIm$q=FI !oVXgK'CDN v$enz]`w)D6įh!m1X\6C&43D̠)M%X32:gc;BAQCoQHIj?c řF{W%`򅌻cܽ&;â* l[Q(]m.^횯f?>/^=s Eՙ(kk@-T( BP(Պr2 BP( E BP( BQ('CP( BPT+P( BP(Պr2 BP( E BP( BQ('CP( BPT+P( BP(Պr2 BP( EbH}ִ3mEٶl[wQU(u 95- l[wQ(]m E]BNBP( HJLPT+'CQ#;'3-JQ8l&|jMk B8;QNΒ#%=VMHgH)4  O?DMӊ}y@#=30&Q+UOmimWP>Vccϴ(Z:]JQgNeVDG!@)% !/)A Х皔B|R HIP{t)/_!@Q4kIfvzWQ>ͦM^\V<'{ݵs{ ~3\>JVxխ d1,dilei^LR"PYrDEF"Rx @"nt#Ú_V1ax:䛝͕W_ɺ0ﵗlZ>o8x -LR"PY XbJOGHH.Γ@J:sM] =q1:R#P7͉a˾\e\2 )p*|æ.BvtN_>(")) 25/>82!1d0>Sˀ8r>{dfy} 0zӏ̧qSJЪu+ڴk= 6h壯-eF\< {_ s}iٸ֫?0Q\(3yz XRJV\O?u\.=&55g^]{t據ʝ {}QPYJ\Zo-8 @M3&R&¬7=,fG&ڳ]CJgkJ"Cxz_|c;%&Zuy# HNqCtE[int>HАRCUOU{6{YhnqcmPwK+&VeVTލ{0Y.B4G+MMع/g‘cYHοicz3*FZj5scl6 ѿt\~emזISg]0i-3Ç'YGj}?tѩ3Rz2^y[{e}t=b1_3HMM~|r\22J >Z6ni3_ x;N{9Kc4kќƴi׆͛ЫwO +iiع#ߘDzo5.r2u9Lͤat4['?E"E}~j3G 0%+;vMl|vFGMȃ(resxgy;HP7KGtdI,=o70[(I'#Q)ysuxEk3Y{Flw [us(YjG lHcs[GpL&)۴NCt$k:W_ĸOf=FtjN~Azzsf\TT(*LFFїӳwO2HKKYO}l6LI|J~7c<|1v|~7zAvmhܤ1I'|ן8 `Ƕ.-Z4{|G;KH-ر}}y4'կ_NwDDoiLovpեW>А/[eXf~[^{2|p]-W^}.1vROYOB&d(,BБ#APK@ic>Y^( ;چ_ZMj,(^Ka|zsI{1 gt3B,8eyl؝ɼ39ec1nUc+14Dm7Y)'ohmA"}ԕWQ>R2ܼ$_X*1"8$6ڌvIvs 1o7v[:$/-WBI;%VTެB:mgF݋:5BwsH$nIe5_n8 IDAT^xr/OC&Uje%}hsMf |:߉ ٵciq2J1o_g=\q޵nCCCq\!0%v!VnyY5sQ̱Nj),,AD3 %9_'g]b>~'CQgvׂuU]]O.=# >H͛D:BH> I~Aq]M8.­I 8(rul;_f۹sL}nNX-&rlk7-mkbem@;OXi*GR |'UV^ETI)`Χ˖M[ظaPJ}{{n'R*#31o<pDGG`6˽YfKHJL]:b>xCv @VfV3#g|?koX{@LYΜgUwfXw0hhDFFkٽs|#31} >_`|x|t&IIpmS/S&""?:^T^{ISgcH$[*~ s0љ<1I"##ٌKFr L4DF滯Ӫ4OlHDB6òA;n,W]z5O>GfLぉѳWS9:"xiϺr xME?e-<64 .ncz!:Nt n=ye0㑾Wwlړзc4 Md;uO`ӋCY0>\wm5z[CGK|ٗ u_~~|+SwqzӷP_(]s 8s M]'ٴ'F&tDpcb%F_.(ԃ<64F.C6|uP(>tdc%.9qM15`&#h <"}'^RGvv6cM&++&Oes/ȌiNdee3$HtK&-5 LvmmK-OiZ`  -{Ѹk.+Mg[b4YNY2IIJH^~MthPz=l}ǿY8U~O>j Emvv-;1aX-AD\nnݍ(ePK)WBQfyϐmw^ed(0Bq}ؑjyCYJ&SʌSɳ\"_dih`#%LJ.ҝlM*`d Bbd(RV\:.ֱlL(>ę$2*"ڳ һooyu[d%;1yyy<> ֮^KTt4N!ЅNNv7|aЃs?rWԦ'3ܤdJ76I9=ˤ+шK 8_YY 4ol:(LFbNvėyCI{㵷XT(j'H3-N1zvMXCZC scAC"q䓖ygiY{n6d(,TRULylvvB0VܵBBt)8􇊯/_^gB=,h %֤ `A !auﶒ_#V)y+CRb/adb˦-Lx_~\͢hB4l߯̌L=Kki_mK9[YjǸnoeUQ\C{t]bekߎIS_*jB|EFA6xhRk4MP! d$2KQ\v6;{*u EZfIV]ӱљ'RвSq搘r0KHyyg[V+ D9:\,; 1~)X2pFҿgf/Ⱦ Gh&"ԍ$)dT&+ݷcbb6|(&߇ǟ_~dHN2 \r5j44e۴q3IɌ؀tұsJz{Ycmӳ{f3k~YEAA~X2MuVLv FvĬaN^O 'DeSӍmҭ:Pn7Iܺ[Uw:HJ?QIx'+9hT1YiqnOV]ЪuImQNRZ_w͎[pX 2B*Ép ($j,~g^+5lX|C |_vaȁBhj.b"DWixAa ?G巟ЁƦ_iju]sμ;ʻ(m$Kx"&M*t_Emj1넚]$m4 C(KĢc6\ 'q ׃VSߝ "fWK$YYĞiQJd2JT1a0R2R4 !%Y49FC J:T(&xY zJE /?q1j8#F /7ҨMMl,fS4#toM4dB,z:]ZBjJ]ZrEr_%ܙaq'C:d7+;x?~EBQ(v6a2=Hޘ4UJgI7pn:K:T(&˅0NzR.}";o#R: J.ml3 ?}̤bqblHo䪬f.咝BTH N9 sGtHSL($*$zʧm,G/%[ܱCFӿ@nfL}tP:6NңU~16t8i9$C #6M>ޅl:(z>,3 fH]'*ʼnNrߘeyپ~'OgT(4v\\~4nܘ͛G=4hЀ-[Ҳe2gl++)R^+!\ )ʧS֛naÆ>/^f͚T֚:[m+[l[UWgY Er00kvCh{87X%n-<&lg4x0>++lf1c.M9Nxb _GݟOޣ94exwD,y.]Ú5upxwIrFnMxb "lڴAX;b1M5V]I$-xG&1M?w!/q0KF1kv קU3MIaZCY~=cƌn⋌;Z3{F-FE4}eɘ7o{!"˜w:s=\B|k,oI=rf۪ڼ:Ed(,RJ739n̾aI9NbY %uFcy}I81v^RzGEcEZ66qe dyO9.!a&lW9Kpjdؼ'l"6FUOe`l.C6 yXĶMdre Z66a )ݶU-5=#|[3ztw&ǒr}/э9W**n?!!MȠYf𴴴J[hd_2{l_تU֭:tm۶Ջ+VT{NwyO\ٶ6βzQ3:q:VY@f< )׳l<θMz.oQM{}x9qcf9GdRc5͒uiӓN7c`Z+hSavԟ~ Iܶ~Ń[1zT_z"q̞葍tSc;ȨcPd]vBm! ս@++[3_ǷfFANҙ§0Ǹ?Kd+O^QZo/`ѢE\}վk;vয়~⪫O>k!d\رت?9dY=d"mذMӧ֭+v|YZ[-kweUmj,d(,RSHeƒ`Iو#i{ O[>y!4έܴ%3W#;O 0aLiʢNU&%-哑-IϖJ@`6I"Qa݂b1]Ovg?ch}o.%ߍ(3Ωꠢ.Sڞ1cvKЯ_?t¶mۈ@4FA׮]ٺukfM&\&=P{d5/ӽl26oLBBN'O2}t.">+믿^m3eQ-Tl[WgY('CQg85JS5LYUl1aj!^qk,OVN v v;ĕ3 uv:xPuPQۜN'iiidzo>oNBBB?NӦM9x ;wM6"dF mǷ3]RӧOg[3gOt:[ٵkf׳pj)SYTgyK,]wEffԩl[6βz):PFLT= ?ӢHNn1Q~ɫ(f&BQרLرc\ve$''ӠA̙CIIIa?~hz)ZlYm,VߗxZ+ >!/"5;U-+33 m[6βz)ɰZdQM;{G8Yk6o_OF w]޹/ɫ(f&BQ[R_j)$8mڴa׮]6lȶm*-cE0if?PEJmZڿ[Eٶr}nFiWgYd4mc JP5{^?:z ALCwE\8_XmWQ>ͦM^rr<Mbلdl7Il&T)%&Mj? Xsȶ`xg4V( BPx)ib -$9QDǜA K\JNF:u7{hi9gmY{6`( BPeѰ- 9HL=gPҒڦm*}:.+D1%iN6=m9jBP( EQ MӰh&,PFIl^ )%uB5Mä= [sŶmV{0 BP(jh,^^OV(N'ŎU{0 BP(N ǙAv,K|qPte IDAT( BP(u %QzBP( B8uOtRI'Τ< ?w9"(Ja@߁$g$NCt}P>}-6QlOBq603-k]S,,N.W!.xe4MjbZLgz켬,e!IqDSaOJקtRd(r)G.9#,fP;!- l:t)ɴj҆͋S.h^J|J)%_"}t:{a0g(!!eF⾸2yU2wt cbkD׵qFL YOmnf %-Z,Ny+Hm 0)7HyjyI4eы)R")]ƑY鴌;H} 7}o(R!M35HUҫ+-(,RHu^50byЌޗBc!H; շ^{Ko EO9tttt]#VTd(Rw`Nbl2D0":8x?pIhF"9!{}NI@ [&&36)F%", ]F{ nMH$&TzƑ^Mx y:?Vc oho'RT,DޣVVVVG9ZCvgZs'D9@ c1~Եv)q? Ѕ/ (xݓ N Ok5`A#_"ѐtKh h[@F|L`ѻLEy9e=w69%jArHO"-裡{s zʮttttl\P(UF cvX[ܨyq7& hm|4oA)ژyr.{%E@xqo3#HmhnQ90&%&Ѩq/NJ8B ۨ"B4lxB=q5%%+)"+ŝ=;jF]KݼZ@t!)]+]+]+]WA׵yr2 ER-H]bN1{ ߴz`/8hFCQdtlʼHI^'+GTCNn&L/G89RǤ>.;"~ǗV]Ph\ /-pH * NKJCq2k)h#WC(K /QdOkJŠgtt ҵ ('CPTc^/V4ʤ)y/w>3Oп짟ev>\>[4gLxjuym,1wK ˷,}B;fW^}aaaꧬWhM|t/-/ff<ǣ{^uo6 \ndgg3b61[tԑ?~mJ'NӈSb6.%ҵWS=7|{믾jE4zŌͶۙ9}Gpp۝fטvʤ){U}e6jt -]_22>CCeU!/BzZ:=<.. ""w7^'>p{0?6o܂ɤSc.w݆-V爮+7u=FLL47f6[(h7:xjB%('CPTQ4/ޟA д4z*"m߶E ?a_A&kbœ`؈Tu3iLy ͫ/ʴG GQfB9%-Y EÆ XnwC V9K+%;xڶ<޸~#rk7!,,{Mxd$tXrP.]p<0q ]/*wwgDEYu|Մ;5c$432;yp҃\0O}p^-Yu23a?~td^za^eW뾮۴k˞={Bumt+'O`??ήeeSX4~gܺNFz&Ͻ_Ԭ c^y꾮WXg?S=E>H$=-p{t9o|~Z.}B ]urhݦ5~!nwn:=3fydeey1)Sqa{&@^y{j2?PNB2%5pZ%SP׸K :e3QE.ԋaۋ #q7LO ,2 ЉmKĀ8^FO.eop99'Nಫ.#,Q~p*͛7vq!6?ikWaaܱۣH)[7L^ZDJֺ'^NvO|-`ۙ:!]ЕkJ {Фitօ]Drc1L<ߧֽk -i)˩)]Wݺ ^&:: ]wEdTffC]x[v.a6w|VTڲk.tEff۷n'55{'h޵~ @z)G"]v:u`tҹjB{MtսXkӮ-)'9y$2jH~\~%w%W\4 { ])=vՃzUu]|jI BQe({-f9={ 2:(F] }q6B~7(o/xZrz 둝M1zx4MR^z߷"ϙ[ e%e%5늾Idt$6klSe9i9]uݕ6] )ÄAFBUo(c@ĘA b..n[okv;i[߭<}y`;[a[z^Nw)O~c0w~1cHN"UQY{EIYq=sCd`dj6l\Cǚz׮q8z0̩fԯ[}]v_=04afT,cbl19Ǐ@E̙[]v'O|˗~ȝ߆~Oöxk6,YV Cf*.(őbǮ[iű'{Z2bi'<0L)&lk ^4<_Wu/_8ں EUg^:mH2| ذq= k˯uӲV|} JJMuST:QoDB+dYBެ<|p=ʟ̚oW. E 0Oi}~Sg]!y*7 ?/ȋ!%Ls6Ox^[nA;dY=8ݎ-on,K8 >OW+ÁLKn'`~S:?]AN zPڡn֮2qG_#{Fx>>;~9@k:K#ȹd8o";Hj^,mGQlH螊C4[ؒG' eZ;dMZ‹z y3A-+ D5Uõ1WcF͐ lZ72"No'γ`7:J(kP #x҄&4cut_`IM:9}6"1UU1 1"IVUQd1$I;1fFO(&pNYGeZ;Әc xz^9u1 <)EE!$bVmB˹ VQ0~ɸ6Q Z;vBek1b%-50}Z.cΚA``܏ BH\mbշI/bӖ7 EcpW G42BKYG eZ;=s  @eL)(.0Ɛ7|F1*2$vD qEXmb1,>TGXFcDbB%v:z(kP u+əyW"=-E¹?yT.Nй 2) L$M c+4q:U( ~]7=;[/ Ӑd0jxSK0hۺއZ;v:QIntz<A`EN߇iTdI!֋Hp I6!;x=XR00"I6AtǛo;Ӝ[ wokySA4"Ӝ′Z;vBe :Uf{x籠Yو"ĩ&,*"y>2EU/cݝo:PڡCYk+Ic`,TdIo^j_"CYkOhA-!$|~9ʐBxLǾ,A!B">`IIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/Gallery_txdrm.png0000664000175000017500000054753113203343735023562 0ustar jomajomaPNG  IHDRsBITOtEXtSoftwaregnome-screenshot> IDATxw|g\K'! %DZ轅{GD;(bEAQ "Q){hB@ B%M#$|?ٝgg'HJ)TU)Rs!B  "!$$Ql*TUUڬ!Bz$I%IEJd݊b7@׻\o^SB=5N^lU5ʨlG^~@TN!]Y)mwl[^۔Jh%lsu:Yd_ƛ$B!.U9]^'^YB!P ׎]u*:B*nWHn]*: Bw|!B qUKj`B!O3X%sc@  B (d0t:N'+]Q՚_MEQTyJ1N85Eu /FTQJzNbmvbgsDAdYq4gTQJBDQ$.fS*^6Q788Ϸ3&M9'gbWT@ :Y]\Ψ(2 :IKSŮh4eoB cs.IN+^@Q4UUEh4e].U䔪HlJVV\E Q*8nl]^իh~fڵ1 >A`_L3S8/6?i:5tsQM^j-{AA.ũw؛Y.̥81ϺQ%tS.TxlPfQfN|x+ϥ8SUU7m߼e̥B8c3IjBĤ"Y( AA5Ja%$$QJ'.AI$bH%.fgFwO7ID0ͲbMWMֵL25gfۯF$JM[ui.SsFjz/w%>6".6Z\oͷ݌"(Y)ə\sVZr|G@Iw5>HTI%: tjנlIILȠA5}Wx#a"_R2R2̪?АlD-꫅kZ]rRXC!/je 9yb``@9.*{]@J✕u\77`x|cZȓV~=,ǜSM.9>iW9^NWYC|h0?y{YQ{%8D4HsJ|ZuH2/;D@!>V KJLj%\&rA#pjuAM=z6Gd]a#:{ɣfi!r.<}yS0;Cge|=tek%BOJ/\ӹiSL&זX!>!ŗrfSEpfIh0n^:fS8 O6m0//Z4kn6[6TuqpϦ!gbdy'/l^jOsE0L3SI$I ,#,EAɈ{0_U%ڞW @k΁2%/_%NbJVL>n"2Ե' l:: $^uKvI_I!B8cHenݑY*44c\U<\.e.G֯к!3ސR&˲,˭[6ZBjmӢ^eYci8z/o7N --5@6A̋>JMûԴ^D\N/u#Eg%ZA5kժQY@zI']HKTR(Ǚkyv;ѠxFuMDz?>VoܮzLQTP-u:/ʲ3!Icbp6N$%uGPPk5YTJ\sȲDUU٨FlN>cW(HXUTux8': vE NgsJ\T勾M;vUI]tK:rs 7K-rzVBbj@IK ]=#ec42p+v߬}`}n2@/ `UNŊ#B!t#(1"Bݔy) 77/)zppPdww7K]$K /&v̹+W ˒ DeZd`/^  +DU 8(,+Йt %L/mC@hjlrPf%d197N!4?3-=ׯmz9*S >^zbٙNVzKg"mSB!t"@@Qle9EQnWʼѹ.Ǹ^㸾H]%)=TORR,֬]yu@Ֆ]Y̋YOVG]Q9j5n[zSs-vݪ`IħQOWәf:)$;&6NC7wYqq 8WA@5Uѹ9x5zb>4іU2]T7FE!Bg4[ |#\ԖsY(B'U^mZlmWUU(( Nj^-DԄ'ڴ<xO!_^/PQ1u!BwR)ְnXyGtxg 11)66d caF}h%~/t||g[uC`niذnXfffb|˩l՜(]v-;6:'|g׏BIe/z>^{ڛ VFPwN+lզUȓ:uK!UN;ܹw߶oupQ!BrۼqԉӊLlђ{\r.X4vڲ,ǾZ5|򮝺ka'\KѥW.(}t\2[wqqp>unۥ}߯Ǐ}2c]zedd;s>uꘞ5NmG~rWnn(6h@ү{غ~>vܣ{>R+0umth\rUxGB!tDg^uQgصmoW._uUpBpǔڞ={bcbyc̜3'@pkNQLb3G6%7 /$$$_h2>?=v^O?30,--}_{GWݏb0>>>^^#zp_{ !(>W⒯'ߛ}BQJnj3iF';:9޴Y"$Qd"p΋*>A(J6׍sa̢t:K~6XʮRӨJ\ w% c,+3+33-<5[į ]wL~կ_``w!Hua~Y~/nj}hlҴY嫾.:_{c⅟>؜ FaYر_Mn7ߙ\3ƍ:nkXY^pq|e-;ܹpǢ ֬k/;Zj\h禦yzz۰Ư_g洗cHKKoӶ{)w-_xdɭ#zP1X?6yڤK. 8~tt~|^Y'}L7ߝw!}$g&Ut e5ka{|lE\~}GNtWK7_Q B #G BSUB!.B$]SR*uw*ʹu#Dnɷ;wd`P?o-q|ٮIǺoڶ'K!BwčDʪXbҳSX(zU 5 Ps9樘a!M+0rۿQݦQ1g6)B!PHe3Ǟ_aHѽbcYrO?*[x.9ǜޢΡ2$Rq@!#$*Q-Y C!dY@~. @*Ux.9|I]0y2*:8&ϊBHS/˦*y(J7/Pӷ#@ @*[3!o =;M*U8[BV\Ճ,l BUR`+j4e7{'<գc'8{~I 1O;S.C*̱8/2cc:uTd_uG<޻o_,]Pͼy5:~آOM:z^8xcdI[x#BAS{x ]jԸ!etg_֫o;ꍗg}oۼ(ʮ]vj:n.eg]u9rHڇԥcjjOϼ}_Ϳ >e.û13ιV 1!1$4OޣRF?^@Oy7|Zaνv't}>ޛZdWNNINMKM۶GzkӾ{o~Nzs ƾ~@u(LtL,0@EmիWGu,kf6+&&VQ&MO7GQ V5?/A(㕗_1?Э{WLBF"U|| ֜C?“ѣ*voj;Ѐ}yqdY:rH٨q!!9c4G+w֫Sii'LVՠQQ 9N^81F0F %'$eiլQ74jܕ-j嗟}5aZOOvs֪m#1F ˔6m=<݃=6ps8߲U˕߯m_~/Ln~';G-FO>[l??EUGBJp$R=9s6lό+".sOZm#F{bLyfbmOg yp/k6Lu*wֻ3_}]2q r up25gs7{w >;邼QR7oBUU:kDVBÏ>;oBfMyJxGOjo`Ee-N楧yOaB!(̤J,kѕ9<bm\!P JNmӸJЦ>ԪVƗW{ FiUjAIx`Ȩ#BU.HQJ :ݮT1;cUPJ;cY:V-ҪPhG&Bw1UʪjU¡QEzrrrZ6o  IR͖}g6n 1iۮ/-rqeoݺ۷o.t'Fd0p7f~gϞM79j]=1fGw{p~~c4;;wDcG9cFh׭_k_A}tiu'dN;*MVZٵ']38VSV<hI2FYS{ 5hjغi'+u:thmڰI~ȱέtأ_/M}Z5ƨ4iwa11M~v,_ME+pĩ^332 >\+wǎz,;;ȔĄm=mk߼cVO}j+&=3Qjg] ̋<==bc 491qћ6oQ#p3_ctƍIIISNv,bZ4hpgN9rc9srr&<5;v?ׯ=rt=ڲ/]ڸqczZZHe.[5';x ⛕/}\Ο;oZK/SR{vn֦cΝZge׉'m6KIIo:_r=!*@nVUl6ܫ?}n y_|lS>]kmZ8}9#ypfs^n^Zzܷ_vE$%^toֲb< M[k?mkH#G?X4z/OIMٳg=2-+U[TGՌ߬{þjȕ+=9w~ yX*0z; v~h#z }s[]a2}zw_>w~z <~qvݥо#s8[ٲ}G =lg xR!};\jnP<\bB"e4{|x K8GPFU۳?//VH-ʨ糓7w Ӟ3 _7{wΝ1z>/XᚵWNmrߔ YgЕOI2 8e4##c5nM.$&&;iv8pNX,[7okրq9G|2u}'==vt6[7kt׫^zE{w3 nOyy.h/-p|0wPF{>{ @)ԊN9|pPPЁk)V{bf7k<00W_YY^>~c<]b j"-PU[vl#F޵gm+-_ӷn׎ݔ_~{o0''gė_\w8 \~}'_,f1oe?~>o_fs:3Zxe4%%~ߒ埮_Ax5'o~\&--1á[=#:-˸+{7uV!Jr=6Sxp^1]yD@`,ҫ_uW֫ҤX1:Xbylȣkfڙ¡$ߠmݺy[A}Jtz5v2P?^xR~UՖ[|iR?/1Oxpc4++ý{})z݃G tpξ8]cbɏ;C~3:6nԴS Z87٫_SRS=X#fR'WAϔ<мyw-kԓ8s 丹9bΝ?ǙL9R(Um9cL{pߡC{z{ :ྃiWď=sZw^{k.]{t)8gSR&N8iEb4Fٜ{q˗hڢɼ)ɩ7Uۖ7`p%nWc$vN@3DQg,.ʯmP QUU~M?|t$I_}]6JB~ f̜:oBb)}:nS_hg6(yDnn.jU1ל6fSMF/HJk֮@{?0-q`c&Zۺ7A 7h@c)r2{1$jٌcѼcyyyz16phQCcz>Tm?pt̺wxUYYYYJ7r}{ EiY#:u޽{'M9_G9p t uu?mߡ ܏|l6-s>@[d)!E:ms_XX^n^Nmm=3#3++wnW' 0`O)Rȸѯ͘eZKj[6;c1ִE.?RU1-U1-u^'<3#jdu{˶-c,mV$,1!s/oό̬l\3x5JmV9l)vEݿ'=t8BiJTWg΃aûu֟\/Ib:5[k8k.hm6; TϞ9(YLIIlq1WdI kko .7!#䖡B=^2]lŜh'xvU[O}GtrP'>٭W!\ƏߧZ-zqﴊF}jjjIіg>~hÏ`{zc#?uaX|/VƮ=# s`"S Y煑kZm!IR݌&C)Pm%l~t)}Qݴ_Y3[nys%yYHxAls _*lبoM gc 10[g[O]h4|z0Άzox~3%mdzvzwK23=?vcn)˛Ƨk=8nW ճOwـaw|ѣ#CǺquzcᏏzBϾYևo|?Y/f?s`4:xB~#J"ILZ}Cγ] BRѱZ*jUS#K'<9ynXJ+6. oݭ*`9o5'Kq绶yBb2#뷯8:A?y׹\ʡZUm=!PZUs`_sqBH#JnYxYPUB*q@U{7tWFcLjR=vѷ۽i"&#UVPJګXJ|^r;\UBr=ؼ }WPJPKIn22"p㪽6T#r--p¹DdbD DE"+LA (a 8T~˙XZͬ`Ȳ۽VEz `u1H&깪B>p_A V[́Ӗ?H8oY A0*L=^!q<E%v*H(0* g@8}yοPٕH7}r`_ߵ_!F[h2|7OР!uJzO,sk\(? l _a^qvC3xbUnk'M{]?~ha־}F]_-| FBDG4מfv-b4>]}}-[HjЩ4OP A\yX1"R "$Rw^NUVA‰d26{/'_1\8<0wn3߷/ع DSf8yJ̛2ɰ~EKn(KMQN!~5֍EƀB)Pz!TܳS{O1fQw!%_5C|.?X(G6ReY<\^;/(vB8!q~ќQ@B{~yb˖J8vRx$ A=nrD#lǙʀQLk^pF8ΠoJ;ۭ2U)C|^6o%D]Nbz8Ul\wmo(@([Nw5`GARف#\SP3m׮"Onٗ_&&xX55|U?B Jj2IZ(=50ia]=k-O݋)BؿW󉌩Tyd8A1Ab͚BB2ͼ8#&rں5eXΫ?б ~ H`Z=yZbc;f5w&:X,P64n;m y`63>: <zhSs92V_yfST_fm򸇑 |5Ro[6DAއ Zڵujdj`W_&GiV`F#e"9(BkٲYh(: CBT_<^s-#9nm!P>Qrk>>MqL'L=  Z?HEqJYP v-eJ Vk /$*-Ȁ HZ@•U,2Qɹk{Gt. S Pwf;/cQp~7$@9qBRZ"E'8Å'&IDwq??{j+ݷo׫1k| }_~_vnWOXhݮ=;w@N۷%%;lxҫWQ p2w.< pSd1ƍs.y }Ζ,!o3*঄~+v 7sLr'4 k>@9ZدNA< @'@d}S -yg3;`Bv\Wyf>\nn^͍ ^E/,Pٳй30&$p%Mpoo[ݺAgy` KMUҨӦ֮KJ r!Ch߾EI[αr]EGز%YVc.4\$@.K <7 m*EfӧI.*&34s.kufw﻾cҭ[qͥ.PNMK/[ԋwd_4/snīg_pBPO?(tzNТߠri)Ul9O8/} v[?ca!_)>\_k~[595/<7>/?VY{ =OnU/c:fC{Go6 ) 5&fg|?t(z b | oAӟ( >PފWHr9΅p+HTǼ矯eO>E+8Ei4sl97Q߯R:N,'$evpcǦhY?+pi 5GoUB0NNojD?B+҃ iMٍ:}nHfh&mg;>-S݄/ <:O":׿͢灔5XJ@W2?P_}{(g?.ޛy!܇zq.~w!r?o aXL_}xG>\~y}nZSq\eo'ox| o.WgSƨc̪otKOG~T7C'0ۓTӚͦ|I&LL$c|VQяؘJDoCB4C)%DQ}O=(TX1u}z103#!pqyMΝdj {R!;v$J#~3n@OE]/2sx~{91~syՆS3:t8"{wwԃ])%he[q{E=@V@`ov}{'@ygnWm{oxpt޳U7ў=|;w޽޽ JR{" !^T_l.7`5Ә_ɯ9]#a&<_G߯_aLz*#;^=}:t8my^ Ƚp6--.E{@)%XQG%=ʔG~H!~Kc,|V#JSyB'ptYZQJW!jt| c 9< Wtps _47qё -8:"L(0o}[mQ(j՚eeqBBRXJ0!4M,m\LLLd2$a%J)Ji*($4'|s}==#n\#}ʒi~1. @QLcljR@q!h\ƚ !t8O4M Iꚶ0?_U % qd8AI2-f?߷h_cB_5+us|?S"}!Ef 0tnsN0NZy^+Nxc9giBR!Bz>99ɹ0 })%uS(1\._T>4425u(| u11yO(a}:RN!u,bzBmݺV1ƥkaLK/\MƹT2FNlA((R)%9J)BsιaQeNZj15T*n!@$DI$y^RȺu(f (!SJ0R\zeqƅaGv۶,PJHy~$0!p. ]hL0j2;`9ƸyFc\,0Œ1Q*d|٨bL(Re 0ݷoc Kc1BJE&`*%䋥EK(\$,qܜ>iK.^~VNgz{{iRQ$[-zzFUAtgg熆,4L"b8[Ͽ伋.Wn#kN3@T ~h3ɖ/˕E.46]}#CIaD l bND 0nY_ycZ-ɬ9LMGE $FGr!`_ڢv˝eHO273=3R~NfWl<tRO`˖-v]sFsv4 (lZlaXJe!a ʥRJL48KbP*Lyffl*[Ǝ !$%p$QR03tZ&ip.f0fI [n}'DZBT#]w^rٕw}=?T,,2hbf^7tX*uSI$R߬0|0IpēX)9;;'PJ-^<288J9QM)Vb5M%I$\Jvәᩩ!e$=}}BdŊԭz3jML3mҩqP/RprWZC'SjH!h7B\M劽s uۚF A!IpOVf3R>SəA,}9g'B ϣJJƘRQM4 K5Q,f%IjyIi1M!l6'8NsQVK]\5^&FХ9Ylek6^ NZsWq! +)WqƺsWŞ|àجjLG ^tY1;A :R s)\ &T{ 0M0 2˦l1Eacc4 ,e3q:tDu/ͻD7r[VN`r /[{9M=('4Fp{aJf/O("󕺐h4Q7`FXzmY'IYD!X( JI!mIaB}[{sRPbY f B/ô;6Mˠdes8RQc#%cCz:d2MlӤHiz K$nK K\*$(IkKZ-լ%(R(%H!Zk4]ӓϾpN1 ?G_M'% iT\a+Lҥi"b$Ř%c%m4R뺦i)!BHuBƈ&1.xL)D(rR b%`B(ѐT2NI0)ɀuZ~MO!wjL|0T1f<1F˯|MB0&\>aMBq H(!4͌V R488%9]Rjiv!0(m~YPJ)@B0ĄI83-˶M{\.N!8 R3LDT7Ga&yRuSRwի$yɝtŋ4"CeY7 .u$ 8 F3ܲ ˶ 1tdRD0,uAiZ8\.!!Tש۶ CǘHSJ@lgq AJ!`8Waq-e1<525Ms]#\FQ&\NiDƐ&1Ga\+FK$HV!P O|fS07NCËxr'QtKH5N)1M3mc)e:!n]J~vSAH!> 04MJ%GGl-8"q0ι A5ݴ0=/`q"$1(6 ݱ-E0R2J.MH8$$N rl# KZ˯ͺfştEO1{r#mظX, oٲI }Ƹ#HvID`2iW5ΥimQQ8I aYaj`#vrTB@BRR1K(kzaR) X!%08T¸ϐR$9q 'nRT,:Wڻgϝh6:!vuO;t { ~tb7OBkW+vRBròf+jHMRɒHaB_hjt0 @ C'7߱cg;ɤ)yB)):Z&0(B2ƤM"i! n](-YWJ$x~8D詴-C,[/-sОCݔK_}1%k_(H.?( IDATc'jVY{j{}XRCSS#L),HD $QDCav|y~^a6$Lxն?t:I P cB)-v\R #ܞ# J*iXlFSqgy!X22<<mO.[y>KL A(!\o:ks勇,B_wXZ~OB2)O5纡p##KoRI+vjR DrC#f>GdPba4::LH׵׮]I)IdK")#$cD%@ G #5!2DsAtɏavuZEm;RbD _wJ#ʙ.כ$E[7*聩i:*cFW,V+HBDRwq|oKow鲕fB("LuJPK'#L\!ccIGs2IY|X(5\J,\ rA0bq=M Z6 e9$1,(Uf!ēͫ{`tltbXW8thbLc`+xW*/wS#eNX6 ӱô>'OJ)xղiqCql뛟L QbGCQ`I/Uu8b+8 pƹ ;w=>??W*$2 TG )hMz++ ZR?sQ֡sw5acfb4-^#.EwK3gp"^p#wˋ1BH(ӳ@H"Ԯ,( lx" Da|Yg?>gs50PTR,P>kKl12!v!k!Is.]7dJR1,,4MϗDJ%IqkZT~vaӦ7o>sy7_| FSH DѬi^, W+ עA==Vvwܱ;8@ް/k[F xtzCXK#zK^}碁/}I}7RJA4B.s|yg~'7nIFmٍf3B!&Zہˤ~覥$`sA5-vN͙|.[֚K)9c1 R) pr =! P1Ѩ2bW #\V`dd14NEMD4ݴjH7g.-0XBl]]>…^Z$6{?xlWww;w"LTZ` _0MKu%ZXX! 0rQ a5JuC,spo~~~|||EVػom;1Q˜m ;^ 0΄H8G0 @Fq@;ԡ`,/%-WieٶBUh$*u N=VCQ兲mahGFNݡCW/ƐRguo|CU*q#޶ V7rY}6RT^ \7l\qժ3t%~]a9JK_}m:|׮H)Fn:S7pR$I  J4 H)U&^{/j,^V˻馟(p.VZa?7&wN8 }\.|l/4:/c0}6MNKjn8 dwz}̼ ׏tg=x쨳>W\qgǞx;)xOSuH1}_{-n;?"> T6{5XyU],l2B8 C!$B#'4J :0PHq(Q&AHARQkhA.'ėT$1aBBi7SWkf`cl&NHO:Bhf T*YY'g*d?H@ 741Un}#s lXljjq8Սx[=0&$߰0KD`,$9=;R"Pa % r)M$J%(5:1?gj& \7LJ(dLDQ>qkXc bl$U^liWWǑ# 5-Y)cF= [LZY:0Lkj8HS#}37l~Go P|Yj:t_cHɮ."mp-\_GZM8 -眃mٵy+aOJ7a ]tk6s'R:1z`fZ'G׮9kkp,kyU)R$ T$Bp.Ifsq$l~B^۹su׽y w=7Y$E[rAVK񐦣3׺ ~zg拚-:jlpds*Ij_b{wHhբ~}~Xӳx3V؝SW.zbLԊ$oScx+[<B7mٵg_әl.Wll5[QJbN )3J4 Ϛ 0F!h 3"l&SB@0 C!$:B$aL! H0&!@ 4j#B<Y2DZg=L/\h]Y  ӺJ2r{ʳWZ~Ȟxb'c?&NM]K_uERw DFIPT77˲2L' q J,̗FEu0F+I9=07_.gØ3!JE(!Haa )q8)"Rjq* 0B"{|>e CCC 3-g`1D zVPaTk[h_Ls1PoU$B.Y\8?gQO\ˊu:f†Bp޽;A.6n,|s  K_9x#~pWWW}S͛Ńl;o3Մ[ZO_~yߧ?; Պ…e>ɞo0J6'RH8 wzsjD'pΥ>}o۴Glʕ[Z)]G_~9W_5?ߊcpsι R]^o{R( lݪJWn:Ii||rd۩^r}߹axRP.m^K鉻]5 ڊewW񨿧w ۿcmMWQ&C=Bi; K.[`L5!ZZtPz|g$iP(͔q7KLowؘB) Lz߲e+ƺ)V2i6[\h'!@B~h`P#! $ړF008RIԐ-OVfiǘ+t_C}%IMOd\,]o4,>$=]iY!rwמ0j%a& EqTYdJϾ0˿ԡ$/Dܑ޾mw.dd2!T'NʕJ~ BDq mRne\d>RőR 0-R ΋łF i#07ϗ+F#cY:2 Cv !~BH))Ys!j0l-TI)snP.MRB0|^Dk"`,aAakH2Mq8vlWښD|!ۥYV/_QpݷLO#DXr c:^GСo/lH=*| m0 Z6/| jrr,u*)(o~3Lg3Wl=r 5 E)z/a^ &};O|adKЊbje8msW^O Qu}Ŋ!Gfg Es) 8qux?C 峫 #0Ⱥs*}]rgv~e3Dq&t#T])KޓϧS)ȥ Ar__}~?F멅0-?x yՅgo:!%7G?_&?~.ذ {;{{}ǣn&c<804~>W TQ-7)4:5(R;JPyZy6m\rl)(E mɩt.Wo4fg'\xi2Iv !GDQf@qp'Ӷ) |[{ƙ+t:׭P޳tbToN8-_{kgzRwn#kWg,K]v#x5pm !Rt][u ]T0\4lBIؖTR`9Fg;efDe $HŮbaɒօ@Zk>56^עmZO޻j B1ܑJ %A3&G<^;8fY:֨urҍ7ߓNaBp.ݶeRh'[24$!iژ|x?e~2SBl' k )qocHupΕ!ߎMHa<; _0V7+eqggc{c͵׮-_w- ?mcԨEX)3:?p-u3iuWy/FQ}ȈiZ*߿d+#yƬw+}&'|Og ÷}޽o^}uC M~9F{o}rZboK(jFSMKHik>o6;[?_ʗ֬^7MR"[q[455WLwukWv˵qffʣc=?_qPKi$C a@<{ɩl.hb`Nc RRNKPaƦ+~|N8?pha8ʹl()IQx5Az ?4>!0^1Ws% =~hfB=wj茩enQKse! "@t4BPʮ;PZ!kʒE\^Xѭ }!ns+Oul''br ^c~_<)uXs_A2\qŕZRؖLlàA3`Peun0]4-}rڛHk:kT.h5, \*&J)8_SRes̕F\)a}sH7zp\ITiIA7eQJP;-Rg l}xg6#4W/*YDљʁ*3Oͤewg3\}=-$/v4J h/2:t HHG@)۵K0&1q ccsRMUj&ˇٷݱR]i^?8 pFudMWw~fi޼z0wtkdfPF˗Z;dwOJ]cM{ ~rG錦YlÆ Ih7Je|[n׽+ t鍒D3ddś$dxq׬\idϠCi+WRkѢ[oh;;6۷nRk6n]F\:K&[>\t.ZYZmyn\Dn:Pq˪5gơo ~򅗴+6,k ]|q/=}BZ<߶,4IsYR qxJJLcQY ≩j+l54J׮9gᾢebChQϦ Q$& \$IǑa(!B1p!RšÎY $NbZ2|)\RJbʹtkٴ+~t^H1ꎎ2)tK+ !gTk$tL-r2񦭯:{Y,Ip\϶엶#Lqv֞uBԵy|ya\沀qc.q,d3Lj v?th -^6ۍ1HAav-)(%C]q' DcI[&J\HD)PB(  Vg}e48Գ^mQmm_eBQ%g~87eݹ4RGld8<НMn6Åk%KOOOŬI:{%Wڗ7^ξ:t  )u_G)w /}%LmwL63?thʆǭV9tUcp"h%j ddvn9?Yg;wHDk׌,[2@ォAtK#^wc\1ld#Maf mۦ7mD֒fozhRȯ1FzFy_s瞻:%aA $GF/F..؊zu Y&dwt1mKSJs8AK]X^[̹^ҬV2o;T+Tjg .ZTk4B'@Ǥ̤R\ t irn3hQS Q"f擐^8e k\:jTѾ. p9_.ۮ 85=NZp-6$r??Q }UK}jN\60VO*@2);J u=SkVIvv)rLf^kW\J HLNfrV~m59䥤+2B:148yD4-Cer9.\6S]̕ ðX좺|99h&7ԓ rN_oIĀ R\fú|roHn$V+`P @#$`GՄ)sSׯykR:L55ŀR"iO.$Xut+PJ*(G!_4P@)x+ֵΡˀIZ<4ZNvzXBI.P$2/h8dIS?~+|k_1C= IDATL! .!PH%ˆB~~^Yf$9T02/Gad :ST\A=HG:eg^,3?3UpqiB8/K5'J t]+sv$d<,%@`<W7Ӝg%o[N.}H !DTAZW:QaKZ}}JDR}u: Jp0 k5BqgbsS'e||blVg8FEB1 SnV8]8+,Jϵ*~UEb|+$vp7!Oﻲ?8w _|x4]5;[as  ۛou;[T*ESH`)Q ps뫖cP:|Nk?Dxz 0)U2 R1ҽJwfvB%RB( !n*Bm(.0KIg<1>|RB0MPɡR'0C֣;[[(%L/^)8/b0-RC]eDrE`Sk#% p/[}}J@xw}>x6 ƾWi^Z ۞\s]Q)^bC͌E~6 [ƏND@2xXJaྼdњ^]Y'/.Eq?B R@!A(kiN"foqa;H',&Bg(_d;7?;ۦT]˲ 9DDž4lG)0ĸ5)Eo0๶|XJǏWp0)w`d_~!IPo$qR䅮Rhq8/̄h4_ky$9 3DhRy4p<̽eksSͩ(:k[[(-n7Cf"/^^a{q~^VqR DP~'GH(zVQVix! 0N8\L&ɠvw5ܓa"E ?olm<̩fxTc``(tfS]'}VBq\Z,,S 0 Ej863׬׊4oaG1+X(ͳR R΄lӱS N#8leiQzɓaR`rA%9KRVfڇ[xMםv}y8 TQSulXtM8ՍA%qQRW8Q6)t<ԜjΜ:?s>Wo\tٴ}y(ɒ$uǏ9~cs!p)?HFӟe ۤayDBB(PJ`<l&kk+M{..XA9n\N;rti`'(w6AA%04]x4{j/=p߄<!n(ӳ~o8 5PjpLO'c\ F^wrL@ ( )A 1Hаȇ%V|϶M3{ao0+ahfq3]H%KPB*{iRQgo8clz=IkYRB 4?Ea:c9/J[-*qFzՕMMw2 B//]}:yNI咥0lUhacKgcB׌b4733$Fs24UJ׺B T%"#i.Q>EL"1Sm;P)U7p4J!l hVkQe[p%K&B ٶkFH[q\o:EokZM˳ !gyceYV2Qg Ku{<&A}Mî$R#F="^QR*ǭV3soܸLC/}*vJ:ylq~}cSHa[e 4\@[50TYV|scgo C` T)5hDZͯ^/ 33NzKA *ݬ V~5ރ TeA楴ƈPl;D`gggW2Ƥ﫨+7x4qONI&nbVRnZGWrgwG8Y ]uz;_}_?MۿB»˶40K ϟ?~ȱ$-aeYGagg8I45S5=TB |T\hNZ-M=BAvx\V5t1*LVW4T3 ,zۻa8Z@l3gnC! ]p=ժ7jN?NJ9^w3j<~l}m}ccsjj"T8`yje^L8\ӯgFa |bFp3RO*>?uï,`aLB$zjf`EgFCJ9 8-2M4.LsBbjY6LgUk`n>To9R,K4v3&~Ԭv'%Ǟ {A"˯dY{JdI<=3ͭ-`-Tx]οjU+7o~0__>pBR?L\5&#I&/N;YؔI8 .)QIʹBQJՊF,-ȢRuJ$[iɳLTpQC'`g%̓T(H  }zyR kWa,ԛ8槧b8T1e +U߷'A%tw6cTngt]ئvckVs*ݸ5o1G㭵{AFSRi{?ǎeyA=J/^fe_xĉ38>48sС٪e]~XQ.EYYy@HJ&̋|{{{wK42+lg{ Yd)XjճMV*fJ)T N+W.E.%Oӌ F wn"BT*VEiqN9Zl3J#+Ál5jFPA鶦\0-Rz-X^Ň6??>pߜ@P8vri0KP2Y0eedaM36Wp~Q)J ذjݟ]Vrr.(TӤT$mr1˴(Tk7k7>{v2{htm=vڱSg| ;ԖZ-WJy3`' (͸d/~љխN84]M bu}k˚%T_~/ s(%y)YQ9+9gLGaQ0)f˲RRmw\~sT,ϴ[i9ifI۽z-iO7BĈPJtv?%HH.L4MݰLMZ+ D^[Y}~?D pYROWj4A7_K AB_pv,ˢ)mQ$5x2 wPY5pRqD10(7ֻ{eI8_i!FAPYPˣʕ ]/hǓQQͲǶ6 @"* qܪ P}'WBpbgk-g4"TH%FH]ӱ ^o~ӛ^ى³~/YBa&~(˖o.#˲m˄2.R* 1V6q^4`1W|Ga,$yYa;J ^ձaSU$zK[- &(0 5jV1f~KqߛdמwojivRϵyorM%|ڗyzG]M4q&cYmW+w EIh1i\ՕE1,44ΕBJ$CXݽ~},(RZePRmonG"5 յsgӧO~G f=Ѓ#Gi:"`25 [n=}횦)ɒ(\<3=]5ljւ/q BVʗOZpI3Rc!@Hr˿9uVnnwzы^BчQ7Yt֙}ۙ L8N&Dae)93S)4 BԉP2Ytzx%[[AZ~X"XGQYC}`VAHӨ,pQ){,,1-9~[^v-مG.KΚz%iU+~^oiyg뚶i\y]wm;,?!ϡ@)'&>B`jn?-J4O -hr&&e^e'a NRM2ui!!E0 B)PJ .XJmקpē֡d4, 'a^SoRCsS3uR1V+%J9}*=ӴҼBVNH޼>QgZ;^J!JAcH6 AeiLu%r&<˶L,4OwYrBIxT*( ~ \ H!d\AtVQh0r4,x< O٠rL qPZ{fa=C!!dNUmLjP!!pouJV8JzTկl0|BrG?@scOaJ̓_B`[~ٚ=/Ml0R754--gfӬc m+INgs}ygnzsZlmmUd4 RPM p2dyVo@jT,˲<+XYpZͪə qƹL&a, .:91yQ\HM7n#˗0([!$TFըi4J77<׬V+P{Ѱ7#!WWY s(c}/xKmӮ;quayi):c YQ0QHIҞ2Mk=Ϗ---X.B2eyN&qp!FQZsPiYE)=l!vq*+ Ƅ2M$YQE>jaa~H}!T cb;N\[0vu2;7L,wݩvP  G8zee{"D)ɟ}? ƓQrҊgO5l[;XqZ_2&DfzV/:;iOOMY~laaF,4}ޭJd0eaVCMӭVrV%#dδS(yPIgDdC mmj^GW{[Ô\T Hj|V*Πӯyf^qw/9RQєb}])%\z͛a?˓]!nZi!5ϞMc )tvm'cǶ8h+K.8Ƅ,8!e4eQr.Bs4]SJjA1KEQ2I%GnCJaJuB5JjgZ~6F 3(kU!1͖iyHӌTG>ڕ".Aol )Qꜳ||=]^YRyzXjjDCi/Jw]saaf˶pw"kk4M߯W<7K$ [BSBPB\Z2f " Q;iYVnnli J)Bk۾ԛ纣LFzhvrb8v^N&k׮Z\ b@ ֯M?P7ٜ}[ }sac?zY_j4I> L,6™3Y]Q'sq[[#+WrR0jZ4 œRƖs1%MGgoo^qHs. &B`MU,K{{{! Af%N~އv#;o\m7뇏i6jQ]|y¤RH|[~,9r*i 'DvK4v]?NN>cZZ^r`?6OTűNoT*j3V+ŌA[ @ "۩Hus&dfEF`1&c(e !"B(!DӍ/0E! 1rW4I)۶b%S48a<Sӧ[5%T2_1t36T'Gp< tF?\sijuTk~gȇ?ϭz2Pɽ]_9uNwpn\]\]MWŷ~O~I܏QusP'gGQ1h@{ieQ}>.Y`Hdp@1D3lDdqE t65,m%nihyfi L*oj y)UӳugQ7nܐ}#PRlmm׾ƲWGϼ`cs˱/]ܹ]Ez;vvZaEvtif=30ϳ(N)O9"d{+K)Rr)RAQi*AZ]4(D . u6Aay< 5ZJo^j(@$h~i|Cr\w>ZG=Vn.p/>zڭSڰy'N,h^u:'|;"9E~K8# 4Q.x6 Z I2G"A)R $iy)D@D1B%R*E1PnX h͝MU{V8`2,\&qo>I8'+^2uӗ{^iOtM ͮB)5JxًaT`iD PH, !!Mu]-#Uc%PB`$Q(( +˭mM764Б$$0R,M?^tm] ؕˏ!zYV݋' ZYolsqEש$fa)jIFa\A)6 #cpb=!PQb0%" H)* !Xa>aJ]L]sm KD !TPB1!$ Gq:A } CY8kdy12 ٻ?Õ^}tۿ+w|^ f!Ux^ʄq Ei\B5C':T4c4 '\4PJdER7mDk떩P)AQ2.!u쒉`ɳ6J, j--*qf9 T*Rj4ٻšv|uRY?PBhO6gh۝R\U(ˢ*,RH׉cKGN(!bL0]ׇcT%W%9iƋ̲,O3T^0i0TØ 1"@^(Ʉ3@'סR RȊ*!Tq뺩??XjxBwS-a|bqiz ʒRrQGy^9FD)(6 7( F15J$TJ.\ĹEQ2%mTk1PB`(taq¹w<ʲܡu56VR׵x!jnw%W~s_A ;;ʯڜVĺʕkq׆B pʼ$})b% r%W,e@V%X#\2&ydqRFiiYA[xCB؟cmB*Y2vWVҼ4Cӌa\\[lh) %Tf@1ж-<>GQbpRૉ}K-ɟw'.5FPtf %,KTsec8+tڶYAaZ 'xI 49,T V,/D^pƄ"L0BQB M3 CAHR %PJ)%iyQL0J<7umYA(PӨJK.vm~I5|@K]|{ݏrB?́TQBIDY2xV er2F5<7 6u]A9 0YnB/J` 5L`B$JA!TsJEivYkz8It< (AbB 4BHCe#(ozA|yBHA ( AEQGq7-A}͵A(z2 l0 (hsm+חe6fC*"Gخn2 4\Jtg{!!Q P ' ӒrEhj2@(eQ<~|uu# cӴͺoxϮ$IL)ww|uRO \h;[W5.~Ǖk{(y$98a{Ӂ;?ݬ.DaXb{kwkk~_|*!L]3mJT C_[&q0躮kPQJ(% )!T<e@亶Hɢ ݬV+i;OĿMDJAToSAJJ&O+4^qkxc3LRH!%H7tMö5Lw{cP>۬14' @כL2r\TwqTeNxs= aIIaMY_]_.lf%Q@IC&StηoӓiSUN:ϭSzN2)r](%Ln%SiFd\RJl6 QM4 )JkR\hqc2)V*e ۍlֺN ?أȇ+ ֖9M=+y@>XRyW#ZJrߜ̗4 *Pr-+ 3ܾ)r%* $˾"_Ձ 7JIf7:DoR2J9gQV !M/ PKv J*l@$BF nb /Ys$p]ǣH!g|SR!|kWV7ܵ(30429U,˞UJ2Rt:&b=}۳qNl w\FUؖm)@+ LzISvd042( "0   ,\jjjU+ qVJsAP(Ѩi/JSZ׻xAo?mMtiK]Tyb , :$2[zK붍4g""aШk(.MTGG\uKJ! (AݔIv 5 A H3F!ck75:BCRB)/UX&Τ{-|sTzf6AJofKZۛZ.~H&厌NN  &WU1ށ3 47d,bqb:n0U Tx3?B 5]殻WdzvmR -*fƣ>o/mB108嫁lȦNXOjq-Ã+W,'h]>N&n$BPR)IFDD#ΥK *(T2~)'"!!BH!)%HP#ul֫VPJױ#(Ѻa||2q3:DZ=:>>W' yhH}ٿȿ<zZ1V |Ri%7Tebwsģn,iP*VsF |>6jyUZBp2hT)I'l6[{-G?V9P*74^veuuE&D}}J UAIUǒʮ6] 92:\])JZc \sSET2p399FH,7^%D4m[+J~*q"ZkZ5gbR:J(tm7\jڵ^_Rb6XGvwls˦/}鋗3UE?i4&Sh4BByU*}Opi+,&,H(Tnc7&ڛ4BXz'cHu˗/QJM)ZoW|~׮]]r!!!/\q_SO*Vvz2 ֱR$W\Y,":|%_ ޷oҍF-ÐJ3fHP71ۯ他yډ WJ2*X 6]f,Ԑ)۷4 ଵ%20ؖ-[}ѯ}+[h g19?̳x\پX(2+W yq#;5}ǩR&v$ )?P*ܼe~WG)'vD1Z@iX,j1X"Sn [D"n"-sɒD"Z W IDAT8[l]nW@k=22rp_r+l6Hfܼso|d޾UOZ<ΌMYLG'87jZRAP,+ JuY4c==Fvt,ikiJQj7n~g-v:t$GHHHsBRZo~:Kl۾넕dj``ZuOmֱ޾[ӆlf."LbSV=a7X4&~@T*$d2Y&JTXnGKmۈ/w9<q劺l(Zjdd4+_W]\ Z  k23 0 h"xFj>Θ](I:yT11>(7iL4QJٹKj".JΎt&R!il6}kuraGe! Jm[6?{O~nYjohh,'NU  )/;Kb PH%D"S?11Y}_KئiD"yy'cAž}=ibѺ)0dtww+ٙL& @),=y#<4@A%wlϟxrRNѐLVڽsgD"gMӸ嗮[ ~Եd*%eRCT^۶\IS]]iJ{nTjVKTTjmiBh4X򶷽塇w9-P|ߺe35a˺dRIYME;tmޘBrӊˎDDTh MT)`4M-}/;\gOVSW%#4 aj(kmm1MV[8qLZ#e<[__z==}46d2h,9 Rɡa!-[67%G}T*w!-Lj}ƴ#g}TT2ɱɋ>p˴j k.+C }i1pδSHgg3Ni& PBI}}}{{-nminjjF\D%1::19SJ?ƛne,}C[6_hniOvtvj)eԍ6x榕+W&RR,,jitO>%M  1L'lˬà4V}Q=UIYTe%RƦf2b R y\+ܹg?ZUCBBB-@qZ.s{h42\Ӯo,ik f⩥-Tb3 jZH`d*'&ipΒ$ʗ"JHcHWƦ\084"1TZB(%d*ɤLG"N~*bP, bԮuu2-u2#_|c3 ]E0Y|B ]w'Xa:cYQR)}y>*xliGݻkb9e3DM 1-um v7ްc6ZI1c2DАDJNRjhe`"0MC`jjbkLӸk͝|p3 jD^75Xb\0ΪUܶ,!ƨڦ `dt$qumnXr۲u]]R*@;n~͋!zrb;nX,3uHRn2*2d, *hNe"jTJYmz{5Aآ!!!) ,L~"nKsk]]}{ҒX4BIQ)DZ8aZS|&bК EƘTʱmk?A\-?ih\~u%KڳֶCB!qDDl4ZRFvOMD"@Qmٔ#>|?BxgZ`ƍ~;9_Wx2E]fJצiҙD2U*  y@JUTP+˲P ݸiC{Q m鐐ȢRsJJ~N)K?ˤBi7UJU*d4;n j2 !cB& Tc(>x߷M!@)Epdг V+o~+zGH̴nB 1HX5(r4wz8v.7^T~xWe%!$-lrR2 [~C^tIR!D8BIlMNAqܨiJ2>6ܜHĄsW__[:ZT/?=ٝwG)_\~X*~BqƫU1&-3qS)rptt2?uF*%EC}O Jݻwx/z|;?0@M$g̰,dA~cc}*xMkY*7lx\`6yy#@ky'0J}_~Š񾾾斶rRx,N)RX`r@_uտ Uh*DSO|'N8aD@[{GPVx"H&ŠEcCskcccc###_;zaSDa[be*_}+@iYBVKJ"e;% 8wlSKiӦo{ !,R?B \.mڴ1{z駟%vJUZK5bqhJ}_~|ء9rqFu-o=ӥҶm 4ZHEcJxsyտ?bDȡ'/Dh,ԒJ&(eZ+)e\28Kģ=w _s͏{PE,^WBjr|wˉMo"@~P8m۶lٺe];;!?sx"ַ"D _*LeSQuOn޹sM70Y$y>юO} ))#įD3F򏏏V*ڐESHj֬OV`%krݯA DTJO.[~X2h`lݺ̆L3 ߻/|>&hjjmj?}( Z+THHb)jPJV^mqƆl}&\y߽<B)޳sիo-X\,d3m+)v"DRs{AL%9cC\|g3$$$/,f;^J?#c̍D |Y4|#kmMwBs%a5wc0$$$,fAs1u8zZZh||z[:d(y?`#\ 2>z!!!/WH?L"R)A<ߑ8Js P^Վ;lMgdio#⡇ yhqAqck#fَimȁiMSB(%ؚi0BW!gh3$fy֛MvT䌦3.!u}E2-[ "(Ν̩Jf;sP=}L;1Baz49C4YO'Aqw9c jԳnM󲥃{g5[PB dn:=zs 1ٮtDJx%39̨o@j0JAG̜ӿ)C`Q3ฆ(!TSS#RtgL)H * !<2m,F LۓPfiS@I5a1„ 9()ϘAkVpR!H2@Ӎsj1F@84DF&r•8ZWAAIj y!q4!ELd"g*6J DMPS 5 j!h-%"B"hR (hBf!"p{FD@5@M@ B9hBjjWlkɁ9P0e=nx .A"0 Z 6!@ )4!К(B 8Q҄єZ )*H)rFiP#HSJN6֌T#%"ʦ%" BDR (s堼"3i֧ ǧڈ+ %fb1⪀3+@ Pu@ H E|TD3JF3hJfPϗo&#@$PA aV%J !q(QCi P`J0 11/br`R 3  "Qt_~f|;/!O<8ؠM.f9^/j#APjǁ :)4]MMi>8 (@Ƙ(#\b `4$((4'QY@!))1)rB*%}ДX\2"%(L irS# @LOwJ! $֚ؼf+XxYh@%6&%@jqB%!$ @Pay"`)Q!t6R!!,a$ d ZIL`JJ[UmRR@#SJEHdR&(*(0ҚibXՀ3~ZFQ u}efcJie5zIZ5tZ;b{מ+{2+Xtd8=mX7+uSIpL*-`D"ϋ);!V5'ᦫ4n>PיY۾Pgx4FNJi<CxCom>ڒͶFw  ^)K~b~ _ւg7of/ziK4ewyό& N, j妭E^H)TJ)T|O򒮤N_1E a瓃fDy/7)oh]^Ƈi?: Jrifꛝs.P5Uڸk[2뜱9)M]w =\ℓW Z#6.z.a3>!ݕhձ4 S%g-93Ҟ6ѵ?Ch<}K.voy?KsJP+ HFAYNPH->5 j0 󰪈UlQGIoSaڝnk$mMdnTSдU8wϭ#[f薳{ ߷erV6/ғj7mwu Kbu+پ-οlY)_|omǪ%&d9XzɊs_r Fu'GOET\yvSOo'5Dmsyz뮛t?9  6<镍\q]~)|j&eך JIKʕů?Qɴ\և뚸'*ž{c"_w(U9q;N_/T90"2'\T .UcՒv^*uE˸Kj;#:QU;GcY'`G͟2)ԧ|)}uܸ,F9o;u?xߞv=˲gyGl>ecC+.* !Z,Ϩ1QCkȍpHx$pӁi󺓣q4!]4z[R@!%&#Ju4˚\])]̲D#/zE@f1mjRD)JIW@0F%PA,bPDQ̌_)Ae ( c]+J^~#<]QU~G.cxE ㄰!A8c& ]ZtYpӞ sP!̭PgGK  |/̆wl߹|߻HHm #P 1&MRQ*ȨdDIir14f"-PI:L(UX6)F6,"@0.}}B(ՄjEe\ˆ GA24%&yQ4\M 4JA"}azbNX˯;Kp*D37y߉ K|k*0,n[EK #1FF%@Zj_IH֌DF $*MFTp8a2``h>f p!"*4B>dP3RS& 5A) 4@(ԈRBqC 'Fc]qcSu3qAXq9xԼ,0'^Gss888v\^ Spsa T~O-t~QW|өTUo2^Rt^գXEA(tf.?\z@Z(䧓D)$$$$d.d xwqvUU>uZ*$: RD^.R++^E_+`A܂(بFB TL2}Nec9s%3$|skY=z#"zРOlR[xj I[1]?p ܛySokO=30&5>Ϸlľ4Xy_(񌤹郇#@MB!5l:[j}N/&! o5;ʫ(㙴i*f18gAg*J Ea:uQ#-/&!|tb ԋKfsމ޾ )W(hiͅlfz<ϻJU57kCk۹8][X}5\Vr|-9dR4TKmHoѨ`B c8V#Df3a 1٨TR$M-dFl{?8<x-x<$M6sж7t\<(38Q8lZ IH2h^yCLPHqCDs@{cxkkKn%q׮_YL'^~Y㧿!Yf}ML LȽToi35^LS)7KQ)5RA̡N B Khq[Y(٬ H$IήS20 U^{_') #g%/'z;m((DJ[B3l>(O1\,JݕTښ%ЕRODAS91vJJl%@ii Ŗx<@Di\zlQNh*2{dbCey9RôԘ]آRr uaJRf2vA>¯~k7eJxc|RD/|AG2l}Nm']O,k|1q4/`u~ٗ]wOrki'}'6=/}+1b0uOgt蜝8P?\Jk)dzE*ǔt^XWM;#הtQO Dc)ӭ RQ0)ep<[*aji꡽q=8DL3=+rRw=8L6CQ)&D`現-JO;}+,o5U~y,ݎ>+%]b!S 50}99`;WnW#vQbeO.^^f<J#eujeZ?u}VW;ԊqJӲJF527 $DlIRQcHo55xZ3RH)o~$q+{1_‹W[ sf?p~ ~k;^.ɏӡ_Nҿ gCm[gzE;w>p-.?/RXkg1=2; 6dJm֔RQ*s¸C{1֭E܀ !8"N +I?;~w߸j;|*Wx;I-f^{- HoCaNVw{xsn7MG_fKdlFx&D#Imoǜ:}s`m1cU?c5d IF~SGO6t\MI)1Z^~e]$0зG=Y3yT(% K-Z }Ιw>L&'|⑕ti'aw-yZ:>}&X{#k) x<ï{x<3R7(X\W-*]x!霿 hPQN\vz6*/&!q;3lfMgel6޾&wwը4c$';إ{GNv`7!/?}]?.]_}o]O߿3wj5=ѩ:|N>xxY0C\ dz 8+{>{TG׬b˗?pRUߩ6*c˯-UB9D@ǰo¸C{}}٬o(F2Tq)oT*#os<'a¼˯)9pl`Jo> 1;g}ɵΧ3[2c>yKLhR#:6kEY@`mU3<], z3"25RTJi~¸)GR]dɒ%K&z csl7YPoTEX,|㎵MFߝl8|ca켦Bָ'#bcG2[z\#zl?b+9Kq930DԳ砩Zhv`M&_|I 1sf5sŋJ|1MR* B!WNŹP*ii)0lZіi.imIɉ\.qԔdBcL47 ٮ(*#X®X}se !{80qØ1G\"ZګG5;*s!y{Z53flϹhmiUӦN*DѪ MӈsRtvvqOj!$)3WY9"lɲ7|0> Oڱc}>nu#X0e~no @BƦ ,·i%M+iO퇙b@$  T) r Жmiqx!;|߽ 'cݓ"óO h:x2m$B1:Q@+%2B)kz5i<gk1R>MMO Dșq&6VԶvyy7.>"k1FB|J+*UJ+*Lj2&Fɴ'OB:hΆ7X|hx<:^HMBrVR $+n>RBjN 8N6x<[ ^HMBz{W-χS IDAT{qD5sŻW۳Ԕ]x<g I37u<*Bj"-ܾx<[ ^HMBDox<~ĝfMx j]x<g IH5E3=y7Bj暎Mx $Ix<VRx<[~IȎM+TGEy8}mԽBjѾ&nl;kMy̞; 0WmLd{ƉR#[`K(y#$yxGj 6uXƀA-Hy9q>x6#٪hPcQAlp6aL6}:ƱyR 8!rfUƀU6[0mc&63/<[â`cXSEcMd1i6OÐ>˜Vќ9?qTR5貦upKDO"@SFKlzh4(۱ϣn<< z<8#%Ԩ=DTlhF) 5 " x[[|%fウopQ% uĜk15Cld8 8OaqQiw!d8k̲ܷ\{97yƃnMOgk`X1jWܒ]K(rx?]p;wwNCDW.qZQRJkMҰ63fT~v-pcāSi}9i57p-5+62K&ƺX#k!LȈ@񍾣<x!J6@R-qk-%2֢LȎ6Bs*pƐ101ud"n0ԣrƍn^C[GA $C1g{٬ֲ-ygsOD$!@kz௡ek4F6NX4*!w;a8"B c󨲕1_3e 1h #{<pl qd-YbjA"*bJ[)c d 3Q, 3b f Ѹ\xBvrZU.8ԧYJ6cל}!B)BƌEߴ@r8WIN:9. :"cZFd SN0BBX7vMn~gAq RZ1Szx6R7 &ccXĘ@n `IBI $0,X6[I"mP_a R K4GQ+j` 9Z b"c_vMs.ʿkS4ED1&I(MuikG9 5aȔd-H B ,MM0D9#R0Tb c9GkskL-azdsu1֢1<$'10d,M"BQEnөAK 3qZsy椧Gh&/<ϸBʳ`m=1E5F2fVgڵWdۣ/ξV~[p4Uƅ ~⤓ynט5 eHlCinXn%gJgҚ]y}6kVP 3KB'OK/mnDy?XqMbɒT)6~K_]?FI97zk1^pAnk4w.uV> /}I-Z${ЌiN=4U$GD宻TbW&tirrݍX.#LwwhH D"\R8xd޼𪫠Ev]'DQ\="c3;3Ocv5H[04}j |VO9GC yNVCW^v\sMߟԧv\N;=$!\ҕp9ܒpnDϪ.SR_bui'ɘΧN3Z}Nt睕!X0˩\uX. u7퀨E`RrKtk<ȓD' r._tUf21S+K'\y%]կ+hZbk[{\pAZ({BkRhO4~HQ3_|6gu?WIB|ƘZ9o^k1d"9 'd>!x& /dk`[[cko:Bl|МqFrK/u[Sgbx! zj.ixcO_y唿m7QxYhEwܑ{Eڳ.5kwcOG 'ȏ~yzf^|?Y}_{G)@t |3;`վo~._N˖W7ݔ*r2R}|YNO=ݼ<!!3͕Wil#klvᅰn>o50|ON+>~x&˼OR_w]ͿU )6k+*od3&z I8kLJG~mI:S̙,ΟOk6~dsdns>uS5\c?1{y/ }x< rzf8N69첵x6VG񞧟^~I ~J>>_[TuV_Lo5yk N,1g<{߃l6"\JJL[0~` k-1(XD`@%{o5/]Q?uVӦŠWqѢ?N Q_/rJe?\^q/Nz!1;;j. `&íBNՕ+3z~ɼS%:_~W Y<T 8[Lfc"A`l6 JArX rsNôfs…2M%;@+ck,H>Qq˖3VXi6K(uT[WP1% VZHSBD!\&GO7!"Oܔ:B"{oV5kDvڴxΜ7xWWe޼x=(&)N23\Q̞Mk1LkIiڵ =2 DpQXKJaoL `*9Sn 5kloo4khe-0TG$+Z<*bk @0Om )VEٰ.""[r!cuewډz{c@nakScm붭J Bڒ" D[("*XիaaJYԙXXg'Z]xIk 1@@ňڴ?gLVVr5QjmMJ,j˂HYa#c@c\-#jY ~&ct"|ގ[ۀ/)1 ?(tk ;HBX)92 s`oHSgBʳ50ZmFƜׇtB*`wqr/R}m DY/@T ah1Xm-i;@$ZJz !BT *fZu+D1@*#bH906bm-KSQrڴ 4"H-_("""kcPȹ,3ueD9s % Āsj!"" "F1V6j ֲ7hbEr)D%sV߳i8Gx^Hy&?wCl}A *-6pNA?nfΌ9]ZZ9st2D2"BxqerZd \]up Z8 NZc# B) @D!W-ƀR5!B覦.5!|vЭ%!7yo/@cGY#zz4Q0sfZ!sCy`k5 mXylF9jݺ$sd <Ν4}: TtNJ 3N;MzV1[(U9A 9­HU65 p5# c1`#"cs@BuD`-?T{{ (+W Pn@W]ɨ%X}ܗ !zq+. ZD@ PKo΁s7ջ/ KQ¯u^X JXK"D\kT*H!~#hXJyC1im~c6>XKDz{@;JEEVo]T5;쐳V˪}^jn+Ŀ5ߏ_yp)ﴓ}Ypi[*̙gJ"Bc1$ j-P|ϰ$j/o~b|+sw0sݪܩ}vᅝJb-X( :5c&IsH SuS Eƨa?X$;aIΥ`55ka(,cHjnF!`mj-s4Eͪ"=fm[G-XRSfۏ_z)#JLOOu@ 1*ƕN$٬Mq A_c| 0F|Qd1եx!TV2%5kkl\,yhja|l4,d B_sFs5/?D3u*}xy|‰'V.M,`,DmmT45&2N ֦ӟ 7$_h"#%;~coUWd̘l&lZY{^(b1v0DXTx<$g? f1h q^܂?"н&I5Z9X8`3$R0L0Z5`AJR5k|oJyٛn+VN`=ئ_cLIB*+R 8g DT'|[(0Rj"7y-X4)>9Ĵ Xk.v:<'r%t)G'?9_,ZUc{-[o &~2"qDڅN<1=˖EѪ\UG9&ϵgX…:(fK>: MR D-]lˬCgg%57+ֺ .{g#Bj /.DإK_miA!"/ˎc)S$$Q/V:::T6+׭D,ۺ2ʞ{c1fo%ioZT*I")\o͛O' uv&Zrժ]uvv|Fc4A@6 Ԛ3f,ADR 8^ Q"v[n㜔G- HDϛE"ænM+soQV5@ҥ1&/,{ VH[6HxqΉk_[sul=[/ZįhQvŊncLHD˘1-b"D֚K%K1D70b(_zIo=[ IfJ GXAx饸P($"x챞\@}ZoRJEdZՅ%KwsCҔqZ`{R@ PAda3=tR&e2* EWS"7-+_Պcf2BA"ƴ1U' IDAT3"P9I06rYy8>wZ`,NTIeXZxUZW)" 4-HDڨm! 3Dh-he=)uRi8=IR0QLܢ:˖U-QNo7"xa Ui W6IN֝x$Z'nkZ];4(Hv%y9g(e\>V8IRϩUc4ΊsJZwC50Ex< IȮ{0xrSwbRab UCN;!VdV}O\u(URDiK.%Gf2Dsڈ럨ZhoڹPMdem9Jxkmgf/2jl#ظ @=ύֈ8j R-ZFjѰF> ") c1p)LIdL!(M*,"#º5.kV,GdJs>L1[6,!(n\ DZC=@#"—`D4d#$bC>Cp˱#VRgXUԀjLg4"TSL@\xEh:B@5?aaasA1h(`vk=4V8N(Qe)Yk}{v8ֆah-)XkW1>uԶ T֒ ,cRDW-\1imd; \R2Ɯ usʌsQJi1lG@kc]ykH1&, Z@D`"6 ֝C5)IDeR XM~5[rط}x& ^Hy< SSOc[\Dƥ(!a.7đD d mfLA(_#W.D{6T$MRib)e'R)˺*Zq)E[[\@ED ` 5C,dIT1:Nqk-\iu_P`֚JRVApε֜syP8∣J1X,uttQ&d2Bc1xnNۺf3 ̪Uo2ƒ$IT)$" '|jժ--mSL!ҋ-yR!5*>@j@dZ\hV!cCƘ1M,/<:^Hy<[#5")UJą4Z!dmd9mt.W8CX{{*jSN򽽽i(y6Kt+c1! R I2YRJ .D3kloo &W@ĹPJ#bɝN$IGɈ斖BƘ1ځXXld|>+r4M8NT1Vh(MicAr*2BZJTkJS;knfL~a2^{wiƌz)^ΥsaOO r΍0o<_1wl3YygBNCf ꄈs㲤\Z@sKa0a !(RJ"i&I%u&+B(LwQ` @^tW8|s\|k*oJ|2k]2/&!IBD3e‰>8a妦~" ( SL 0>D&4Ƅ! !a""ċR$D)2ɴZk{׮m*wuv6MRpΕRqiZ15(v"Db֬;d1~hY;!jR!cTEQl. Cc ɹ2pڴ3g2E^[vk4uJ)U*UZ+ιARJFD6%[k 岌1MM(RrΪըus9Ec)SN=jhkK.yꩧ֮m/KkHQ3g{Nm]l^֧XѿZqmpΜ9gy*1YjUoo\0 C!d}}<L&d3d٬uiҩRZ}D֒>XkZ) arU. QRAH)yCDhR:ɥ79cswޒuB6$IpYZc-*ҥKj(rTP\ WSa;ZFQ sTI0 Ƙ]Jk \ZsAHba̙\m^|ٓO=WJ[qPbh_-r_@J3)Bjګ6u<O5UDcd+^{iZln$.K22Mfcm6  Zi8Xkm# 0I$QhZL/JqY(+QiZ5Cd2---Rg-#$I1Bgna,"7O fl\.ec4IPVUc( C[c`J)DRY-+RJ,%(tc0d1D)S$֒ kr9ƘR 0,MME)yM1DPırW===.+c(t-M$afa$"Ʉ|> î8I@@L@)S3ӧAΘR\)\!wAr! ;;;˥r'Ƙ(J|V%$UZ q!Xk@|nbQGQ?˅ai_ooZ5Zu$iDQU)euRX(4MӔ1Դ6̘1= %ֺkݺe˖K)"lƥ:`ݽqU ?{ogkZXssL=w3xiq@$AzU~+&$&F$&Q/ piZF@EmgS=~k?޽Vϯ~g{]USz1&:Y]]=2??BGFh4"Ru]eZgY`IhTNJ/h4@U,s.(sZx<"a|N9LJeիW6˲BшTc,˲,G#kMUU_PkkS E$I4M$9r.MlcCR 41Z>#n||S,h k8AجxfDjf;^Ξ{͖6v8o+Eri}#yUm!\wlYcvɓ(j"!i"4feyeXu-p/A޳0;T]Xc, ށx@9Hбa%d+_! !Qd,4k4ߓ$i6s Ƙ&yЮ*=Z" vx8izUw.Ԛ#[o{oj͠zOZD3 _fxaj"f~\N?/'kk{[)7Zx4i^U` eU֯tCjFY*=kB@Ę4haa~\;!qYT5"P J"D&$Iaј.\1p@\Edż[PP>AH@}?߄F#o;h"ChQ1z*RPQ(kC|<F#SŲ"loEOݹneIQ,,cLXXXMEQe9(I2$;y/9DYDsF~ TݹfŌH0S HsB|H Wu~gy$IӼ,jgwIFU.o+SY:W Vwckgck701sݹZ$F _׍,kddiBH)DYaԌbp+K4vC$R`̓O1IE1f!fBx49T*JYy)R%kMeYE8bfIFU!5sYFV)xʲ4}3!Ct8ŕhtusskki-/jXP̢}Ѩ{^D,Q+9|Ĺ,k\/^ΒhT_oyū^ַ~d"M?xg3|aFf5 I7OlCKG_[ovV:e<7?pZyJcZa!R,(Fe,*\uV)`SkV VZQJ!xT\Cx4uU_; {{^D8D:(Cib׉AGӶI&(EN;6gYe I$VLERяNktqUVuYѨu;vo\9\1.֤Ť:4~#1G&bt/Fu;PVDJ"\vssO8t(5"ƨ):ܯ X[sO,iV1fl3?]S^u}(aZ>#D$6R3ǨϢ(=[Q$Z)eY^r%Mtf ޻յȑ##>P`wHtjգ7pcSGq$<frÌH0o"!B^W╯j|n0q<.HZ+l$7tCۿ&JkUk*\cڗ|{B !Ilmt<,!α]EDu^sI 1NA")X$I,!G+}Ѧ41|9+4M#cHGD@f Z@ҽ~/˳`f9׎Eb6fnn~~a~~kHkPD"}=k_uQVP)T B0D5R>Ntaofi@5oxw} $3("'+Ba/̈ 3<9EsYsHSdrB$FiOoKVĉSI^Gʪ2.--omnnt:  pYbt볞Q^UJi ),KZH`fD+4 @kmBaa~~?( 8`ZV*x!Z:uh4z1 Hӎ,)iAFD qDSՄcq QY$;WUMæHg,j/Q̈ 3|␥W`FDJ [[7ޟ;hU$͢<0s,Uݹ9Ͻ~3/fDU`.^8O>y̙$MBDZiCdX8:&`S P T#[XwvE RfqޗeJ)M J4U#1/]}8vs,iA$Cb/*ڱ(H #s4LTL`:!pQDPkx銟eIJ9BXXbff]׫ιXWUE!JMgfkm%YhMD/Y(&r"!JaݪI%,e1A@@A8cH5f6qN6Yȳd\dm:znm!ܪsWp8C7򴓧N~#3ka/̈ O!Nm>>P>Z^Z~juNWSUv$( w&)sĩ /VJkkMSUx4(,K&)DH()eYj kBmL8f3Ly&b@T)>hE'ʲTJ닋+W^=EʢZFHٟ[SE+N눈Y惇"=݈QIhR@ٟ(RD$$EbG:%L  MK׵IbC"RUO*ZQQijmBQ;ȥNiu㧆}Q#bQ,!@x/@4O5m42ApMbIıKX\^uϜ}h\W}?h8>OP_M&a9pbnjH0~.z21P0I~'/^^?)&Yw~NŸ, R*{o\Z^>s($A8% պ*>: 0jFe IS9gnZ;JkDDZ$<@E)}@Cb DG)6F`q*U@D'֪AO :<0OhD=E)9pM5!f8$^E3x/JE]DA 6!HdPWU 5Riibq1f,McRsaDQ@ SV{~]8؝k4r&$Fi ٤ ՕDݭpl#rfrzK^>wՍk'?Ѱ4|E(\S w 3cFfx "J5x9Y7xRWL@8,ѩ'ƞNPßH@Z??Co~獄Hej=z}5 ٳ!pTdYhAo6B!< ~#Ϫ Eh"BR$fnFZ$i9(EYhj8k"z!`%jzy RX.fcF!*'cdOE"ySV|0ŹgOS@:Ы O|7R|v́!0"a\QIi1& )TEYJʲ]$IeHHDn7M'üȱr"|{VDHX?kn#׍\7pxc4MN<$6%0aq"B(A+/R>BDct%VףAReeU83Uf1$RZQ ~Gnogao\/lb֎^yqk,+kՑՕӧNr{?~W㿿7x^mߎZیcP:O0fDj(t=!wyA/Mypǀ'Z& \]` AXW; ;{Y+syFnUU+E DAqHJ)"F<y:m{+i7ݹnh[U$u~LDN潽=D!xEHtn}K.ei!Y0L[_WQ5@2>H<y,;*3!"X8 , Sf`sP)e1lUU#<^ZZXXҴyf51#faFfQ }E9 (kT&53@u>H` NHLBCcȻ~,QecOuY~h/^e2Op׎-]tuZGWW4! BIS:zn.]~_]1@ &T"^b "Q:  &?a &M-Jkea{w_}ٽݝg?<Ϧ""Ȃ)Xv(ByCss^{mUU5^\I2C= CuePy%aǹJ@DA92 6drmSqd:Rquu>ׄ r0#7[[H,&R{'y߭D:ٶYm\yBvq2HLYVP!"Vw:'VV{^{mDJe DČ'gϼ,ވ"(U y̡,z&q8I@A1EP!M(@x0?G9; N\[[;nuHk3ɢiNV܀}@ i\#!I|-ޏѨIΞ u2x}XK*ѤjO?0Kss$znpWwGnBv*[W77ʒ(uuKKZ$AA)zuGε]f&gOw}S ni\(J}|0I|ҫ 00O!cǏ/ _x•kJv/DPʢ!]Օ=3"ֆP1EI49dqnJT)$I6hGjkV)f zۘ3'OŇ{}Ẅ OYDA^4>w_ED!ĐÆRт#En4u51Eؔ!(ıgq)P " b}4Ƭ,-Wݕ+yjRvu-wpdm,IXŒ]qkfvD(!ݑs1&k4ZmEcuQx1?zx\w$)E0Eq砰Ei3ʍEZ]=&ru41׍Fѵӧ֐`8,z˗w7}Upe|'꘴DR1+5MUL afKnNWœ:Ŕ%c080nյt?W^ћ|VR`ct` AXGd@_{  ckSXclJt $Fe HFDc~;?)kWbOu 3(wNz}3Q__aB0 hiyT6 8i0؝9.Ǐ[\}37]wlyj:e5&mkTY"ѕĚk9~7wt+'Pq:< 4$iƢfČH}课S8P-(ƀ=%) cf"P=(QRFG">I֠uTGpj:=;2` C c Uwnk*̸pV]hvLǣG/_#uEq= h])d(Q=i҈$kAJ]9 vwՒV>pG!|.tA-BJfu]1&Ҧ&"NOJ+"ʡ H|06mu]>6}u<o|U3Ji]$ٺF8z4uK""*2B`v>J>hoխ}k76^>.3D !!4HX:(w,`8݉WW\G+Ӥx-"ag97I$M[re޷5-.K!ϡgg=sXg_[9[›o#SΨ.} +G\ 0u+nx'ih43Z$&y+(6bR#?Z/-}oYU'Jp6ݛ 2B—&8"h8Z=|Lb-rY e@@$:i`ʢ0Xh"0DpHTpP2ƞ88NkX=D: IDATA2 BP)V΅lhD Z@HUsI&Ea$.4.dknJ:5->5ۭ# KY@FW!1{/€@HHq4J2S 13 P- \]pv],k) ]{W}tgk,]_69bfpNB7ѣRH]{ZGC(Z%P*swD0"*;29؇C 8@ n..޻u=zyϿP)#@PVxTzdL QXh/L6IlYga!?y5`i`ޞi1ssp'UX;BTε݆Ra}?,(krs3/lRoB'Y]kH}=^]Q_h$;ZSr1o7vpֶ:}:pR@H D(c:v>_pʕ3g9zwXkn]x;ꉪ? _ẍԗ!~W| !yç_@ke)D?{cZ?yoփA*[x‡NQ][fY@hj&C]RYŕ+7cub}yZ5_%u @LIkcŅ7H)\;~Ri=^u2Lnלw5Zez rg~tޥEѻtޚFb>bv?|.,nݫ+6,'ɑs+EMϭyc4u>?{y~"[W(I3,{w~*UV]umC,U1TTU_|Ocsۉd. aPzWnu4gz.V- nSvZt_^zMzuQdqÍ9`u׍f>7=r$?~XUa7b)hK-,@*SkIa.r5/{k!,Mf!{~g>Snm1Q7ݔ~񋯽tm'(;;λSc^OFD_e k^{Ѯ!E4j˿ΞMug^m\~O?|g^x3G2[#y~ ݿZ=~\$tm}w߭uKVѨ,˝F^]W>U+=)EU&XPg|G7-a=T}|A#?Ѓn~~?W>tvKv͟|@+Zy;Ymw}ӷw> 450 fDd@DIS=_^Jnw}BH!cw9~;mupzk3Z+@ܸՒ;~hD;|ʳm> I=Z}o~@Vr'U`51Tdy~闓4|rYնΜ=SɱcD +7M ńƻc뿞ٟ &~ߗ(ӧ~O~g. ;]}ԉI6£l;If $oU厈DD'QE(Z`R,P"{!p"DaUfݿwmm7޸p;܄ٹַγEzss!n׶_sZZr]gao?!G߾߽4﹧G(4sE zQ:sf sCQ}9 ȹ{/?x緶5' cB&D_Y}OOP9Klyr_~>k_'W6(Ng [QvVe}⦅̧J*< CQA"N 8"-8""-4( aL2'<p~]v76oժuVSzN}}{_v; 6cO'n)`eS=ϚU-sbTY+[ɪUx5QoM@p@@Sf!v>~dl1D*Q*{?[eSaT,S:p \jD  Vz LB 0AF5e2Ig׋*L3yr̚*Q**u!vv?ԓ=وEJ+QSx3RoAbۛ= "ڸ1b$t~u=ӜI~k%??edٲq##Rγ!jDsGw)3.[0?:+u1llah-g(NۓG!^t&r_)t& À4ٙLfl,hO#:1|ӹ礔6lg Ԁr@-  XNL|#Vw/)gP&8kys{Z[mgpA|N6eRjSj"v T9.J$0 CιԚR2f"!r̹Mڵwn8<\nyiR)L>3I 76X:r%-mmK]k?yq/|W}smD\vUW^~ hRKB() :P)iOGorRADHI$9ޟ~SGbŒ0|jý{7}}.D($Ru xnzx/T*ׇY>:~4!(d6"RH> EB%%! BFv[[֖;߯,,^Bo1cfKo}\PMfpH)}_"9Hg,REIX*d6Ï_=Ψ|ϗsIqmF1RR{}z:)o/TKm/ɷxhX뵉 :zu>/>F!wx1I"FGNC?yz׮Eɖܿ_)^Mw/;bѫBz{yOxi bαR ʫΟ%UT.K$NR\uRJo#%55[&^tMgfs/diB)K 2?2i>/?p^'TzdZisޱsgîUSAJ˜C(߈ JBPBˡ$8pbwoo&k֬A(D~R:K!iLj՚ۯ_~gׯLܱ#^b+3nt]_ʉ_p&&0o|{gă}lk*yllف.[NaZk$Q&J) @4CA? <}׏e />6v)ǑZSBf*R{;t3f~/5ɕC|銛}]F|S}°fΈ >qi}߮Nضbz8F8Y!pMzٲote>IT2H&4vDJӏ?0yB ՛K_iblIV~n18]m&F֖+m~߽?BH;ﶷ^`Ri[Lx0Hۦjn/ƕ^}9Q;o[R3Ci d L9g®ٿ=CN-B/צ⿑soABϜI,Zѳ³2֭k׊wC'sc1ahHs.O=n]RcHJuk4c\ 6mJ.$Yn\i{ns۷J5kpFʘ}qe y$Gnu?8,],_LJɯ~>_J++*w+!ɱ֕~P~~Z}dhH^|qp,ȦMMʕ"uKz{3\S>TWTKԻݑl3g |=[lv&D$]{џQE~;qϤ־4ٶsʌFrfth@J8O, Ra ֎b.]zLSS)mP Шr)r(64l6[Z҄a(〪q\Be9 Q\w]ӈL)jǂRx,w>!*4aIB@È(UJٌ<DDIq0ld{ӿx;޾|Ji!! # ËJKzkaO$>'%M%729` /VciI!"!S"ֵr)<~)~v`9ZM$@ÓO_|1^s\roR㹱Rhl(YKx˜NZ%Z5Jdb8T*A3 :<ڭJl[s6 '2HT.eڵڦL>Q8Tj?2]Ⱦ#h=s涻Z)/]Y|e'Ո'\(-JeR'_zUL!P_ӧ]L )Q 97S6$0IE_18'N8!Jc9\[Tf Hݻpa="7 IDATƬrBTO<2f _G-1c[Ǐ?^.`ڵ:ЛRzhH^ʼnu‰>{bGg;W|vOO݌YbtFv$*uRo_H5ttZohEj={tOde3cq(FJ"H,.yppsFV*F\ʫo~{ۚcɼtJy3aE`b炕+8领]h6H$F>W`ttdht20 ^>J&BdMd.v. 041xX)],f(U̲Gީ D aQ*7}z<<\<8.ZNTjZ.s]# KEJe^K kOTZFKs0"J)DӔa*R!׾r>piV{RYèk @)P a*| Rӽ% );vr@ibZ^Y !.hiR4!-U!mj$R(fV$%kX5ynӑGNgvM_Z)mz}=#ÙL+%lڎ<zdB"^}σ!cרoĎx5"-'HhH{d._†-K?d3Oi^" BT ftvvv:Q[[S.U*R [Zs%l{=992 8)a[7.c|$dpcz9㬳p۶_ #;7~≈R,b)ɼyMlZ~m{Iϰr v2\=R N޳ [[];'FꗟL;`35krΤ]`1im=0(yd|g Z^gHB$yB(BSz?qr==oW.Y2 I=8 ΏE4"y`,s5;tL0:Fw iY~aXy˶vGo3_|ܗM=Zk%"\hF~MBնӇ3ִZ097.Di_mcUmii?cE5ƪDZ' űJ1 +zN~HryrٲC˥))GГ3 M?>*՗ "1xuڻңzZ/˥-̵,[8v]ްQ#fL%]wJ_1}}Go==^KR߃{ ;) pѫׯ'˥G&A~?CE@BmӺ?jqgg=}_GuwwX,\[)_5ϛ1gDDd"u$zeoƴn.zյ_+W(ioȤ2R];w  RNEvl!E^/+y֝?qsKҚ':d"djppK֒(W^G7nL+}e~Er$k{bGS(.%`Fbް!u\~ՃEE}}uVk/Lȟ. ^3pq۾| ;bKʃ3zHq쵷7'A-hҐ$f  iYN:Di "L56JoOp|ov|~;yy}t*UT}}VD (!hI!D<#^cǁ~sK&:_wi)5r'0>ܻ̱104R*+ ,\. _;/>Z/êF^+B[n7ȟ}oƇRsƏvTJ.ٸ}\}uL)g|],&/͓͛N;L=|]pQs71ǘyzSBgS~n~i.u%6kEuN t+5l;uZa͢r=B~׽}{+===o9p-|򪬝)A\)Ϝ9wF$SR) !JIǬ^gP]l,:9 !RRV??O3/dGLF!J+]sgR)-&\LL:GKϟ>Yg1AGɧ?ݦ5H I|y#eKq~$@sO@iAQ K[λ*? \Q -Q&W\9}h2fdPmv﷦O˖%NO<4cbsMvH )Zc;t,شē _^z|3ӂG3GG#J67::fNBS{{iBpJM-jL(fswVڛ?]_{uO1R*G-}1C'T4̠I< qe ]ѿ>$O}@jZcG~ZWo% --7J{V&\'j8m᢫~s??r2G$0%ST@I #cYdx ,vvrF Z(Qm@s1w̶i&ЌS.@jlڴ~Xl.)0t?qJe'&DZpR mPټY36~_*5,aYaf(D:"y7z= *F tF'⃃v^x/y(SCIm \[70ЧxU -?tqZxIho?%\0W̘qo  0#0H@Z&ETvVfH/-L|;},@)sL) ĄhhBT t:Ӿo`xRRiQ g5kfXLyT*[*UdV*XD% 3MmޖNڜIB&2YU6c5Ǖ֦ hDhR2)ĜryyR&!׫&բm:sY̵MV=|?4z FDz!\IrN\t-n#MbJ4$AB;1(j infRE)`R}RTb*kj-JyxRql$/tDY <3YҲRqrRy'F$eQϛ@Ūi>=FF3 (f0%1{{+I%Ҡ:_gGYFU<Д鄎YO .]pl᧞ܽiSO{xE'rFaJi;iZ÷pmnjJI[2 )74.%RNgMe-m{Tjq>6>L#?}mGvMW+J11<ϤT&1L?z`R˗6!˩#, YC(&Q"J0|^ב錕hPc yKjUf|q0@'&ӧu~7o޷nfOkON7S0%ނPjC?JPoI㹔@) ZR!@ AP!!eԸ1huDM9cJ59]wܚKRImlP'ZD)d |KV2HW*l8RJM2sMK/?Eӥ8Ҡ&MsFTvBPMJJhBjŔD0@!! &HiǶz A79mT ֢J9 Ē Jz(%<<ӴP0m!6aBI9J)\@R9U)L(reضmuNݵz=2NY.MTJs?8XR|5>x}s@RSW3%ނ\e٣AP.4 ƎZJkT ?^HyhۘP1 {W0 Z=*F h$,sTz%uz&41#!a26-Rw\gu{wOK4rܗfYZ{'7MdҦc\.&F0QDnX,tKjDb8њDm*.QkT{9kgR25bBpl "(@P$0q$ f JiCB<}^Qz?D%L ݴ2IR5R@9Z ֍1lք(B93WCG1IJ'R%JrD$Rq)cq%Ԛ0 Xje!aHRJMJO0MZ5E'&' 1ZڲCCI_QLӵɉM.0Y IDATKM"J JJ(y2<:%X xP\. @*ci{>"2AfM@XQ2BR!OQ( Q2 BkAkD0o 7g4 B4 RBI΃-۷ܪ95×3 зm' ի=Tt.Z{NG{!`@M6j(RgzԟWi2@JTZR4 HHCyJ;qbV,z#Wt6e;-f.,JE4,NB>(33s"J3?imu7ηVի=nH d ?$0%6;iG%`dY(Xd a-іH5I75y878U Fc-wqpP{Ϫ^%0!HG: gpV)a'ԩ.e޺'OO! \h]]w{ BRJ)K/޸Ԧ( }T^nsp8I ىP'@Ɯc!s>nZGi" + hӦ2Uyx4r$%I'Z zs?yΝ[w_U.S:۱pH~)1 8嬵TTݜ"Dd؏Ct;LP19@0XfQQdEX͋غcOlm "MA6_&ι%JЏg,c+-拼(ZFpt 6Ns6/K1vZk BDǸDƦyrAS^_rƍ"ϭC_={s9z|Woҩ9B04|QƹJrX X-Q""$~'7e\,tqe c85nHww6F;,@˯?_^%@)sN#Y!-:ӝ| s##""vH~\e-Dly7nMY/ Esq+ n 9b~k!x٘O5Zj7:Fw}c [v4K<˲l6}?(Pݾsm$gE GGyJƍ/Ko8_D!Ľ}k:~w`4B6˓U:L6[-%IJeuIB /])j4 Be-tVWevppnW}p$,,ҕY-s+̐{2jF+?\%**+X8y`@9\EVWO?1S(ÿjtoќaG'QjZj #`wEDpB`j7C$! .O˲ B"dz `<"t@Dxʤs"K} \,YzJ[mXxW/}棏>(JG<&R/t#[H D-(}OM>s89D>D2ةo'a](90d@lq4<^}WN&tHVrmm_;!jayeaQ={Z,V#èFqL,/_5P(J%<Ϫ|/^[Vy'>ϿΜgȜ/D!ăVN=k8$ hdj4d&AH)8gH[g,W~ Ƥ%/hlEd(+ Ή1`\";<8س=686qOxoʄp2 g.T u.V׺v:\GGGGidYVFJf nu}%!˺Rʍ,J;B[9CdD9(pJ6Zc㞧TN@R k#tg:mG@0J$&8"Q\}2s[J +/ ӛ Bݭ F7_N ޻5]yBst 9dC@"8k醁9֖u9GDF,8Dr3ڤYq/.3 _qƥ|5ypofFnA5B9[eBLd9Wu/lmpoH Vlε4{WqZ%BR,DJ[]\X&Jf3N\e%D8<1M$I#c-hD,yh^ڹ|֘S۲s u ΉC;s DOo7 D.b[KEYZkIDTZg6V[gڀshleUߓJnqv;ܿwN׫ʲnAPVu{=?GGI]j5+\?{Dbcs ,gU8 G@Ves"kBeQ`BQKrPRTHUQ~,$M1iw;;J7%IDhtFfoJ!ImHvI^DUs$"c\UTe^觞zC)w#01F~&8o9G't J'sG!CG ˽0h=ܓגdom_X2z^Xo?VCi 灳@ڪh4( |!3ʢ0$Jp\[[ӄ(!؏G8HӀ ~} ]zL)O GTx/9Cku1DFGaJ !@ clʦZJ;eQ9yRՈqjSe%u2NGUjG=ȣWٜd*ڪHW{f+n4qj/󽃃ãnlyYɤ j9՗ə0Ry.'fh }om4dt2:glGj5j9L[͸Ghۂ?|NuoD!Dߚ ω7sH ?ۭVx6e9dyf %(3r)$y $'pRFAeFEAcߓYl6h@(J{v<"_7oF7[~*,7H)Cr!"$G!H!Apc 1huRJxD.9lkk$k5CR+$bwo@5 ǞR~׈qy^ȾZ*X{gy1Ȑ  "gˢ0ƜcR)fsO<ؠ$sc6iCDBPuy*)iRrX8%sw'vv:!Jxss%IO8 8Bl2|{{;b!$BaHƘ$"/nܼk?#V951/nar4 >CRЖx![k^m2MݔBeՈc"`]f#͍V5w>8Ϧl><ՈܸyO?͍ur̒Vp„ q,;bJXJP,0@!gu:a %-O^ZS慵q䈜4PrH^~ _`+/s1&`#kooDp 1!A%yU̳t1f&5*<~u[H~xth5d9c``,HpGqzcnOS3,bUV k Ϲ`!PUUYEEaV[rh6+}Ͼg0sd3jkk}و g\=vʥc5]8qp$x!#v9ĐHp%s =BO3ʳl/3΅"0<O䈈1"s(rg:Ͳ^ۓt04M)%V~7Pj2FAƱDf3]e΁66M;wkͭqN{s­[wf:c[[<=`hyfi5O<4YDq#R &9 .4].ʂ![-%ŋx}Z={.lI?O; 9z\o K|Ţ}s2d{ލ7^ȣ>rppXJ,3Z`, !3'WKJ Z\9~G1g*+SYkueQ|wfKޣ|?+ʣѴJ59kA"v}ssFkk-V7n̟Lusa0@!9u=+VVƓ2n4p6 0z3_}?͟(0ƣ8/ .xA~`C@-]hv6ծӺҌ!kZNl.Vx:gkǓ$f]#|M5aFYcYk#g9g\I9ʲFWjSVPN78b6_t?ZeYdY >L&qUU )RL)q}8UYq/l{ɜ1v(@5cyMet=eMgΚ'x|wwƍ[y޽s',6ѥ b{~ۊ<|Ediu/px 6"z v\85\-x7~g\13uz'UYH)l(z' (86З"Fͥ~;.t4][k }'h# H&Vпψs| H=pof㛍#GBY!oſwUhZi'b9T*#ιTJrN|>˲|o16XyD*3[$x/~L^m00&r~j3&dR먪 clv=tvCy[󽛷KV5 ݖxc` VqΉ3!Y 9piUfȹDs$q! D <.Se:y:IZXZ3F#|9'p4˳,(/}pZu%ԎcO l;;t:qܺu7ϓ|F:\.8 < Z- ,Mᰲ\iknL0ʗY6/G=bN4o{htxpttNdt1sZߘOzY&+|&+ za~iUytth/nݺ_+9k?x ibͩQ)1څ*vYYy^~W-)Xlď!cʀ(s}q^N+F Jy~YF&BH֗qU7o޼tY7776{54].泋uYqJVq̒sV4qn6cΙ֥$+!g3lġ("AN#_j"#wd9H=?7_wzߪ8qaRE`dq>|??wߓRNY+)l6'yZ!RR*fg{ /hCөq4h6Lo_]9`x:/.|qGDacprJRJ!fL)׮]z,Jp\YLdo|G~p4i*+d),Yy^w}C*Y1rppp.6[(#m\Mf햵`0l^$5*+vz_EU\Z[9h7e}Ͳȭ5x>HI8'R!^%x#soy+K{{Ǻ)geen2M4⸑d8-lX|>u+OILLXKΚG(j6#_I%/gXi2 p.cN$߻9BICЉb;ZC_"Kd}zʠ 1 |?/rcc"sR|7:sJ(8a"TUUYUUXg p1` 8csVZk:M VXgZs'0[nܺy5gsK`05}+xqj~ 8RyҒ *+cqdq"yx<4p$+Z/]DuSaYs_!&4gvpα(W61{ڣ֌1a`T m%ViYYhgITm,k#ځ;;IO>T۳~6 'E^,)?hUREYwؼw_4زx7/3++k,h&#h$4A;lcF hK p;lp[0 ,DmܶAD3[XPJR YU9gg>?J%%"#W{ν﬷k>muia׵i`J)EgoYʲ``<;;o~%@l'#!'+" <>yJ l{~臿}4uAW#:nܺ=gQIG(5ϳ{Q[gN>%(t:pw0Qvr!Qx3{vE۶UYgyuzJ[,M(Lf9\[9}KO}{$::El[Tͥgو-DQ4B >ӳ4m]/zыwwwR:"",#:rrݏR`#"!}ДVz02c} H `1YZZvd}}(QUNΰN!$ґ樾u0ƺ,r2u9iREqiv%rGш -j'i˿>cۺ._y(0Ϡ'o1g&`C%PѶMkMS.IS{޿׾ʪII:~YUYqV{laRB)ZZcfMd:e$I꫾C>дx_m,ݸq駝AkvN0319>] t;6⶗趘 :2nmn0ŋg\'iMk/y*(mYeT^74M1,z)RCQ ;纽"[TUid<[,ׇm㸓is~4PyB <((t:Qme b^/x䥧ϞsJIbQ7λCL8EIR)kmIƣ$t;;_SG=VTaEVXᓊOxqǥAp4=~׿_߅ai^Vޠ_~|lmTV`#B uh-8TJ{@E*DonnYGض8ϋleE]7eY/"G`v'z)3%eQTN]7ɬm:%/8>eͫz\5,G8B8GDNl[,(DdB*zVgav|% "! Jýs~y@ ` B*pv2\rXJecFc󢨫zm؏ aM36e-ȶ5hC]pe^,i탭͍sgl\[|SO]jv6[EW|K_?AfVZfvIUWީ@k_?&30<&u2? Sv0Z+Xk._~fwˤTitIAx8% IDAT|OK(Jm ﵖB)9b& 7$Bbj0J闿̰wZ,44u4!jpP̖3jtҤm ܴ̋/}[28|ց5ZVbEVX3g#nox+_o_u0RI:^<˗yV,Z^M!0+,s1ϝ֚8zNY,B$I0 1i09iM]e7u LAvw8YQJġ^UYmkkJʃڲ0,:wⅳ7nܨ,IqRV|މµ!JZgaEQX"&̽N)+gQ 28Duc75dgXkm7ͯ)le(ڦq1UYrm{ Q&vEYUUw gS te>❒;ӛÀ(:(HH GGEY9R!$&r{/>8 X $04%"dGgMuMXJ!%*@AAe_,꺩,KDFsQGA]__#g\}e?|_! +|"R+Y>D{~~ߺu0 (J:($"2M=͊\dѨ}) b$jU\UyYhl:#UUgu}In{tt!qJk96،`6^|yӕ*X,UEqdqĸ:V)ZDlΝ:(cj10Eq4eDD$[[_O]D$d@dd&^ZfD(o^GfbDSO?}Uo 5!.71e_/]Zh35L6aYֈ~ @aGZ29k <|n:=Wrsk'+._fmt| `+ʲm[ip8TR13> 'V筧 zDi@A4,.^L$yNRsuI{NR%E$ٶɲEgDԩӽ~/ϳ(tBII2u2Dk/rVRh8J@IQOFGyL[ow +|"R+֍1yϟ~۷=}-[KĉaaN<Ӯpn Ȃ@m˲`GYlolQ1c댳f:耜#nv(҈ [B?s` @ d@n]EYEq g,YM8N/~q5:I.Zm uK=Nn2l7:I$|=cӘxX˲GuqW޸zsW}m~?,nPR*!A'x⬫Jk&E <9]0u۶ B^s 9r֧H؋/ DcM4(p210U5OGdtӧO:ȳ|:z^&4DdYV,1ؑRHk]IJ??o_΋Ds VXӇZa:8fi?3[߯OL쬵-8Bv!nUUG"/{neYS7@̎RRYffgۍ0[kL&[[ۻ;[kÞij_ju4_,T*HJbEAd<8SB{ Xj-S J ԋjXL&"F0Mq|v_/7)!|dryHtf&h/Oi[~Ï?xQR騎TB&im~wk(@.}3Q N'/1}N5sLV+ ]2MYJ鉔(sh|Jgx꒔" B-9$ )q#"sڪ.=y @I>z ]TgAnoo8PHQȺBD9&9\LdeUU)%IJ18&rGh>Zk/\Jã*;p8B*q4+o:PJ9gQZN8 59C[Gz衇l̼߭ŊHg>&>r#dMWJ䨬7Zq$7wݸ&͍ͭS{e&k۪jqd [`ے5:ۉD+d'ٙg-Tiڼ%$ ðnjk9nZ1Im=0ݩSi2;cYgj[ #`<1>l1KdKWun{ݣx<糲(},B]J)).rwon݀ޡ}{,B #C%I?y _3gf>q4a_=)PJɌx<˲bss8M<{x.3gk4mN=O1U "1s? з<?w"64/۪ڪ:}ׯ^~pީΟ<<Z@)|ʼ8vʲ|GΝ={~vưġ?ƴUua`$Z,^"jmf`k DR k 9 `gg'/ eO"D-h-;GQI{Ƒ#T<+,'([dkK^^') #M| 7Mmm˲2Y5M[V`1vxvxf'V]>vOsRsΝI4"__=Ntv^Cic LgY]]il`wG`D#ڦuEQ5İ;Zib=էtt|vpakk3˲$mAYgN<>>Msᮻõ$MTR"`-Mk,9㈵^ƣh8zN"r냲,яoAB |L"~+>|xŷ+ϞU]5#'{v^^z}8ܸqI@xGϷKg0ǟu|+p>8f"m8uja[g@|*(8uׯ]mw-Nj<ӒCL6Uw}x]vu1gyyãQgϞݬRi0dh6+N(pgkk<e=\mm:!;0Q,+(J@PʲE^Z>5XHb"8$ s5UUM$ 00`5RH{M0 534imk|35^7MpggYk De;+ ej,tzx4:<}pp$yv֭ã#kӧO?.M7o }MUCqvSMwDn':>|>G?w;L]=V/=;?mЅ>?XdPC8o3r _ }Yv(epMfXkM-_nqۗ;NZDL=K^?@䄫2t$I[[[;<<ʲ*r齽S}]dguöbBIg8wX @ ǟ=5.F[[JI!ZcRc\$gP,G"MnJ)!P5 ۦiZ"%DL30zf1anxe/{mZ ZZk*ֆC縪*wU (19GDK犂@"ZšGXZy6uw+3JIm<ϥL֐c !${~]71 @dC-MDtp.U}k? '}KEy3px'j/xt>zBJyBB֛nڶm]WUU$8@ΪH:WϽǣckؐ}d_qޅXᓎ13-3 '#>c~5XcZcjIRwR lQRw?7/l8Te]7b>KٳPlQU5v֭[~|n 1񄭕B(8è3mSs~}}c1_fsٽ0X#֐#BTBu$]d,ʪXh{Q|ܴA2 bU"/8 @)`6MYi&*I_Zy^L|#J!&#ƥK0 ȩkWU4MJI)0)%99ncZӶmkZl '|qX^KB( sJp2J . B6M]:&giG;+cYwE9}0 hAu8@'My{2{Jʓ_x+PIDD!}e&ϲ[JamQ]VUGQ4uud4M&glnnF^@Jڈ2Teg T i+g8M8ڪI%Oz;2%|>"{ΜaEVL`e6_aFOwmxCyRxS+n"ʣ㣢,O>}ׅygs7v{ΩS{Rt]ﮱl-;Ҋ*SA6nll(%n?إn{?uIf"Ɠ (jB()@/իY?of(A6:k",A 08%bSb1FBuiI6 Ƙ_F@$I8Ʋ}( tֆC)_VUU RJJ ܉.HdLˢ7w?R:%!A ABc|L|h{;=Hi1֑b :b$vƶT(R*%yVq'mFaF$}39QsBNkWyU[n2Wn  NL&LJϜ>}…g)(N"%3[ʲ$N+'4(3""&I$an}m&oM>F|} VbEVXs  /C= o}ۅ{t:|*9_deߨ2_e/<"knțڭ;[ۛnH` #Y||QQAXUU''|r0mn ׆8[d%Rމa !0j&@\X[[X|eYZcmf(޼k3,Gǣx4=mfjkef%%t`EQ^i,6ƐsA+ID1 om|2R @|vZ)ݶ2cel BKfRJsΙȱe!% (q1JpZK裸R)M[MPu||\~\Q/ f^[7 -r6)@{NJAVJJdzk~7QRxhZSZaaݬ |׽;gD_<(ulV;f韾gNolX:68J298<ll Μ9szg%2kAroЭ%Dhc !xtpxp0 A?rꂨ¸+fvu]eU,;ĵRAtnXlvxtl[[[;]w=ڶͲ(NE*k[~7@tQatc;,-=ic$f_$UB²юDQ$iB Y#PJ)`XeI Iza(D]iTau{ -LZ2I1[dm8"&&X6Q Fpmmm0A =>KǓ%c%J(Q8@!l7׆E8ƣ|1[w6@A"릮,"X[V:}8/|.QOW( xCWoهy9 nYWNJH*| 1t2zc=Ɵ'ϜzuGlUeuݽn:ue֑a}M|ŋ.%B PټikgA9o;yvgc:iz̩{wc$Q(^%i8,-8RR: ( {nae)rK"R+v IDAT9 J)fhs>Oٿ]eU7&t4 ^QTWe[D* qY:x#O_z;OoQA.thǔȀ2mZ@ec?ӏ~ݽ͵͍a'R "*L:aobˢafT#iXvqAoܼvZ~w|<ʲ%Wqh0TR:gԖND\'71#,*H @K;} 8&C$Ƙ,\AӶQI)sXbBJ,1|vyGDS(PJj|@E`6 H)4 C"~ڂБ `!X"L": idOٹN 82y喔)*ϋQJDeƺ(NU}||=ufͿկzoR!zmбsw^+Rg-VDj>''Y~yMm׮5}{ʵ:,cn~ٗ}yۇMKEm tcir\fe~{_=-)?,'QJT(%@ D(P j̓t_Gq'6׶=hƁa$"Gy9[RN'tR%Eݘ,kkQ-&ičiLgK8ibnE`D;m<لt@~L 3zoY*025|8M}"ú,C!BJύB)ecZk|Yb&&` "_뫵VJH!֘mM:g˲y^,dsMԲFA/TȳhTZFZ8 |J^Ѩi"VJ@pDaIeUUeZ+G4M^~ô'ur XKe]+|N23E1ӿ<~|i-t2͚FHK|_?yMd0lT˫7n _{ϩgΜ˟z@4AD)RB,Q XA(g\$i Ic[*[s>A fsm LMkVx<ƬLZ 眴Q E]7霙 )y;;"ƍwfe"%دQ:g,*t"֗&a,누h }I"F-Nj(Yo_$cirngg' @Ƙ,ˢm$777v6M@P6ܒ@"P&amHTNU@kmOƋŢ, ݕ:"ru$I}JVJID4??~?M:7,y+iƊH}Wk*5E)R~H{Owunidr؇?{j^gܸtt]j@"yz{.˿8 t,X׶'3&B Rj@ !#Zg 3CQ2mӉC1 uZIkδB!d w0Mb4ð*1wB\Y")RB}O'ul!"VJ;L4+Z+f"ޞXeAH!0__xDRk!ig_џ Z1>XCjWsL0D~W mۇG}эS[N癫7Yۊ>Rkr֒+hӗ=w/zzׄɫk(NB[b2Դ$55{|Y !7 !N\X6i(%Yoyc?96PBHJ tYdrr'ĝ6@ @H=kgP_e5!1dmXk,#VJaq/{ʹA~'[k;ל5@VXs+"yhDo( ~7O=o/ʒ8vミ㙎(Itãu:bJ#jgђ,f7gPu)3\YGKJaQ0gӉswH^BD)EqƐ@k\YqEa$Їus綷68QJI)DRZWU۶Bʓ<"JJ?s cK:Dֱu7iƴ'v$95C:* dE( P . V(F|oAD/͋2ϋ,ϋ(Y#tFyYUukFY ):BHanDɒc& A)鯧oz񌊈"cRUU !> Q, HkE{~?cL쳫y+<Ŀo3}+|qgw3|_x;~ws?_,τRNDQ&xG>xaYQ P(&4dHD2 u4ZF!vA3gE]5Ǔ9 j7@ DKDbn7NQqWUs(p'L,t{ܶ-9R@BZVpkڪnʺ)%:&r}-.8㠐6Nk J4I%@JtL?)FVRi^s4dsM۶MEyeUUuU7RJA BsVUc|z^6Gi D FA)%,!2f"g,J!PJDmHI%rn^@uv@sN'~O[~>Pg{D +|bE>/{k>G'JR`6#ٷoy~5y/hB!@Z//tQAWy9].WfVVuWwխ[6z<?0fm} bk a :"Dg ~? >'V(aD#,vni|LtA ޷yE1Lg(뺩lRZGJDⅪ({iiBV($,0Fn)EDBym@>^Il6$ZkD#14W~o~ .OOvtp71v<3vB!@T PC<*&ip69磵…-c͛oZ4][[SJi6d6[zW˱b,u7 ][ƧIvziv:Ţe:CXB!BPZ_"Qkm1VG;@m[J.-hZg|,IBOEQTe]MUM8Ϟ[~K{ AA##`` @QԜ0l{=k-%s;zFɱ1hA\tRd-Lc!2KCl(΅ټcS} e(˲*RQ*T9`b|QTHD( H+HZ^7f8<CoO=\D8ZZCg3x> !_\Vt|.c=ZyEr$e0mo{wԋ^bPʻVBgɅa/ON+|6/"ztʲh>8(L v@  8#;' Bh5̞Ai<<1Y6IRm") @PZ2AT@*7 xiiz~z·ж9: }>"sfV~󌐢2gCFi%"|D!TL:P&2gmP7X \jD}d2aEcهG"@f!@Y8szqmݹtzy,ϳ4MZӶM&u]?w$fÙ(/߅x#Ǐ"/q*P>Ѓmm׏nTݴբY(^2ؙWNǓx6[,s[nڦm[CÅE|ïc.ݶETJ&E$I&[yѭ͓ΥA34\p·<{PZWR􎽗|1Oʲa!xΊtgp21;NDD+"L\QG󡒈U}t2֦Yfe)^\!*BEX L{6.i<\7Kuoat666Ϫ8δ)Y GaUZYwMU qӊF᰾~…d͛mmmu iz~kkk~{_W>*C @133tt 1ωo|7o[K.:8Lg>0)LbӬ!غmjLP,"̚T&JkfI^gy̼ʗ=O_O:׊_nHD$Fk*mWzꉲ,XiӛO}w6V.l4ʣEQ.x27&\][L'mc3Ӧ؟h8#%"[[)E@9VD~R|8AYe/ϪqP bPphk<ךbp"ju]E,Y QYk4?{=.Mj:J97 vww/_(fm<ϲ97FY} }O'::^(QX_'~ʿ}Vm6M[J[aVڬVWGGǣطBئ!"E(o=>8QHdVַFO]-Z cۖI_;Mťj;SJյΦλEDG U<1sExM+%9DTJ%jMF+p`QHiy ,O068}%7ѴcvuI,5VL-eT{DfaD X[VBZ+1*^/i^Wn-6~/yKIYMB`"dY5LNG#BH(Vɍ/^GR+w^$M e VW̒e9"mlnݼ?H IDAT_[*Ri$I"e:(@ܔ)' P+¬uLJ?;XmgEhsV˰(avm~Ř fTxv]1Yr:gD@*~Vei˳~/7Zx/9\\{y^,EY6M3Lڶ'4Z~m"`4GDfEQU^+e6I,6I$ZEX,~ ʰgIݴ IDQ;Z[ʺ@bMI^{q*EQE9NOO|2OFfխ]k;xz| 4-]̿ϾzW?Om])ʚ16VWuZ]ԛLʢPJ~vaĚxg>CCD^m2ŋڧ~Zk2rpX Afi%P88B؟ZTMSM:8#bK_ry֣"!3.!!G@D8x`1fnjmY5{mۖEzѨֺii1' ~?LiuuwUYMe02e]G몊{/xHuTG =sqpozE[[$LιX2[42Lk˪(@ZAX+ ܣ>Vw޶~yw@lix:Hz?fw\i7̶+ 7~j2K_vO_4]RZ+Pu`~kX C^#sܻ u3ʠS(iMFVD(MH@DZϹ 1=z0eZ!L|xV1sQE!%,mTe"JjIe0F}Of=|>g$Ii֦I2{ "~oZǵc4Z5}^/XL#'xmc+K'TG ?txLt޽%_%E1B̢Bp8HD))iZM`n[WӦ=xZnh<({;ο;vkv1/vϿEQ|e㤬 8ؿUU&1ZIb]Of4I4m}:ضDz6[h]{N'']ڻm<%),1(xHi,=\" aƯ)3c{oWd>g3~VW%I/4' #Bp>aÙ=ΊZp׏`uu5 )"JeyX"bfжd2ym[p/"x)XTѶ} ??U_UkkkIbONNgyUפZe6Yiȣ;;;>EQMB˗v^/Imf F=@H`]TE=ͦE p|:+[Wb^~/]|G@ "Z]YQWLӺsy|DuAEbQ@\ih|xpxxxx]w\)[v!0Xvh41J'XmpŒ* ag΅A`Q*Ƞ֤EO}}|be%O<%"XWB,(X&CJ1KӴ+<[׶9x!<[yG|;nOW|;Zcsk9RCk@ںbE$DLt:lo_Z^f4!L B<|桫O]K'ӲYF}fp4R״1=H\3mb |~zߣ~zVV~gxa ๪ EH}k|W|ŝwyڵlv^`{}ćpǕ+h4*"Mx\ΚT@x4Y[[X[Ttk}ZkRv9xK.էFD4&MS0w,c{> "BgO=EzkkEt)j\#"罈zAOm`ZA1Z+w&(b`ŵk7nܸ1͢6U7ZkImmm x0P) $FEļa뚙d淾 JksbRGR$b//3@F|__TM}X43{W]_=Wx葇ǸW\ZI6&o=QȻJ$V}X"g1 q5/t?x4R+JӌZJ$Ib2TU4m",0CLQN$7$BYXXm[nAĪڶ|!)Y8@{i25@tVb ?G`m]Y׮]sic<!H4-c`Z˓L˃DbQ9bC۶UUȏ>"쌨s,8>K':::Hgk:׊{}C_;zѵkOe}Gw/gYz]~{{{^W}W}cOs]M{}5E9LTgE|dtzr̅;BQ<آ(@$L EBR(6IlDm/Ń$8mX+Q(|Bgł7,XV*x'uUr67k.gj,!1 MEaɲl>epVkM8"e8q7UՌdbYYYfI~G s'TGǒNHuttx7N !_}}o#RٽxmE6~__pW|k_{N&mۃ sJeBa4:Y̛puD&sfKM1K -e=ͧd29==6V7745Xs8#E$ΜF>Ţp(󃃃[[Es?%RLD6mk-o?7oꩫD&RG+k~k.Fkt\W/{n:|^VkO4bّRV+@v%Z҉RY[lQVŽ?"ҶΌg;5eYmKdcciׯ?~y43TTGGGRCںS_[@{7x>OW_88<OEQl17=/y+^:8&ࡧ]۽}awbYt>/ln t:gSO>46qk6ڦEmnM&mmlbZ-0v B¾mjpwwݼy+^ZBΦ٬*T]u]gy !m,[_[MY[[e,fpnu|"E7nܸysi[k{օ!),BUy\۶٬,t:%Ucd2I<ϦbH!t)tBy }:^prGw/s˗OOǀxr2O_?>=nn.s>S"ࠪj@T;[k"@m1ׯO{Dolyni`ݽ˃㣣_w4#)QRmӴMR'NJhu Hney^rK?7,U鸘ϵMSefEQXA$xoβlue ޲->VZ!aYV":X,sn`0̆;sUYEwJh$"~{_5"흜uIQKD/䋩+:!<䑇B߄,޹}_/*}.G IE$0nۦnA"BZ][罦A6ֳՕEqp4k_(Ţ.IdYV岪" <8*"Et/I+tRM b>$AĶi)|mm9bfFg3V*NƳ7o^vm2iz޽ H9?NYijqιmTU6YbJ3u@kRJsqR7ݸq#jة*:!<]wt/ xo~7ſ?;1.,e7nO5u]~b&EQy}WnOc׶~}}gl^NgdVTU;_d4MJ$IRD(r{{$Ju]:FĚ4IP8pZn߯qz:T"b(fbH*]׻rY,IeA,HPQq8X7x29:>VZ#.;4ebe4@QeY":&H!cѲiv<p8\YYAĢ()ED~0]z(RO;xG5̾-/ o3ßuҶ٢X̋T[[ű,|>:===9._N(0OǓd2b2R{'gu Dcbm&Ƙ4&ZkhgY~K|0lnd$HeYfmqqo4=>> ++( 憟"Teysh1H拀smB"hJi ཯)tmm-2$S"kMe֚M sfgO>}??ϙGR;"A}ۿ[~GoՕA&ZE.R4͚~s};P$uONNڪy駟f/S+WVkCk,UdA$dzmҩŶmE4mYŢholollyh,RZi766,Ur0lm)E/K_FD(M %qŚb$ͮ~KڶFh4{A@Xm4^˅E)I$P`bTMh4*r(bg ^o'Ec !W{d$ DĵNÏ~w?(! M`$O-)]U(({S6fkkriu=XEk[ Odz7n>~c?Iӭ˻[TDh"t@2,x 1%0+%N$Iz6J)ղ*V>p`!$ (ơV90siZTa6c㉵vt:>9>V#u]wR-c~?Þ%Bc4wOx(@HkC`"ey/ϥ3VeX8|"H$OI*ns@ll1PVb90 !ZcHZ 5vcm)[&EDHzFòll6gZ,"'>7鍧s6A|gˬNrutAtB m@bٷ/W~W޸qÚ5ME(,ʦiVW6,[_]5FWuVT$f'x!={ҥ7n"Z][{Ib!?/#t"|:9A0P"je$Xx:m+BpދʲfJ)TX@4z' !nacRiփ6Yse ! R4̍6+k+ J^X94!@]7EQe4^)^/ɟo~m[",SR"1bX_~[:!ycYv-|_^Ea>Uei4sc 37M㽷I2NOOO}ݝ/z+7/ly\qu+[̾bJJvb "*mTYEQ9+alIi@lCDD1z0*|~UI|,rttr捋^|yܸqVV7״^FYf1 ,uf[ɴuNzkPQ4Mنʲ(2z0' 98{sw}w~#y1ϳ,OJy/ͳ9 :CTGGDS%_̧?Co߿MYkovO&Ӳ**g IDATxO}Zk4il# ib׮ 1b/1 `q||INQk-\xc$ kmNNnZ#x<ˉp2~1J/]Pz(VZ,)qyιֵ2ƒ"DA<:9-&O]Nn& $I4M$M":9=E1H׮];8FaX,3lhgn Բ1F$|7w|r-/N,6MUV,ˈT$PiSUwnQ1>]E4I{zƎ03 8B cY50#R`I)#އ0Lnyם[[[k3ǽ`?88L&4r2Z+kMgDgfEd$*"}Uւm>/zSMݺmƇZ$޻m1suUI2 fY/=qR>Iz v|:!yC##BчN<7 __7d:!i&"ɤ^oemU|o6P7Nm[fag  u|@$xFJlfg*>3f3|qfÛHQH`g͛M IUtV5" RRg{<nIJәs>47m6m&&UJq0c=S?|?ĘrC:!F,p@@aXLϼ^DVVVVWךʹ;NgUUE\`h ! BZY$E I K "ˈ'U )!vrr/_^[[9<<<ϓ$MF$qm[=xI9Єc )D\JNPΒ\LF,776Ek[X[__Ȓ>#?CO=ufQ'QQq^ͥ:: tB?DD$.YW2eC|_;ʲbXhIa(bʭ[qC(RFkm&Hss/c"iA>Z@gDm4DpO'|5_ܗ"sijHӔHUUu~cp'm>JQ@"fQ)c R*tig BO37}׋{qS'>'?yI'::: < 'G};89yVU8 w4{~]קxꜷV6Q!)R XDhjۖCXY]E!8xm{fs"aںnP)=h?E3E0!XFX¨(MFyw=\H &@D2>g~\M)("0 l흺ngh<*  BqU9Ís'l,yـdIKA0 I#>ǟ(AJ *d Vv'0f{hel*9NH9-nn3Tyoy˱qٳK--L2WPjm8irVlj }X$jeڵjU }j&xc 1b1 Z[.˕$}ϟ8Pj$I86A`AӦYk֯[f@Oc5̶&1|.1]H RRaX,syD{=$QZ+_pQ_.ᄔR`>Fب^7zB>Cc!QJ)(=?Zerj^'IZV,cEZOTsH)j5DGexbID &F^תQ%IkJbX(j5:Z-NUZR$DjzY}$0sB~ԩ֚~"dkZ?JcfFiSjrZ8!p8BD 0 g>/n*I2腉ҽ}>cb%Huwu=F%hm 4Di$Ip-3AyZjYreS&OFl]zU\F$)ef&L|?j螞nDBhZI݅*'Hii=!Aٲe`DBW\ID~wO򓾾>&^x,PǫRc 2c*0, [`sG>xo{qo=}DērڔIƂFkc, )&J$I&io- AZcI8ף(5¦Ug& ReKjֵkפj3<$J$/.YٜJœ $&BPZi""!74 r4i1& K%e߿/ƒ zñ℔R``B B@&M}n]w}֔Ӎ1z•|~{|8.rq[ȱf=K^'qyRQ)J֘46 ٌB|>~ZFJQ,1Igժ|aԩ"A J%)ETD4s.?!{fiBI_,t-W? 0l숲?Rcˁ |k5ƘUVysY{Z~63*-ϫ֪zNh٦%H^'Onߘiz88xJi=k|.l1(a8VPR,'H2o^HBF2cܞ;)Zk`"BBZmUViu\o~VheR[QkRcZ5 *T4WWʾuS⨖sLEqGZ-2z̔Z5*Q ND'M!VZ+cL>OeRZ!e=~5Q*=ߓLЌe"~!okkjc,)2=Ky '|rGI~+W}ࡇ;Cñ%؂`kЬϒ$0?'>yYXuNBk I*YkR{S3J)n>*Q*1Ƅaf'tL3LZf6hNG ̈l0 2\!닢$M!jZ&) B|>/**IJ8Nhn__'O!倲t8[NH9-arh5l u >3O=yg" 1*AXOf`ӄ R*1FQI0 }SXq/RZfk:HH #2j"J@ "߭X,Yf$$+ծ0 Zї^gg ,^0L39APպ;׬ERrUk5VkRoŊ|z=?'R}?j*4r>l u8NH9-#KK^wwyWzG-(j5c,6hZ)RzbQUT0 EBrYJ!0JEFDZ=:,T*4­0Tx yD\UW]iUfNoeMxqBp>ZCGF;=Bj rL&8j /!=tZ8Iz5uZ@$!IsM )ekԍG =T*QG?tZ[]:'kMTH/?M7W)W0li)MZTja&f˗kcI} H+i lPU !-dJ]U `֗]v饗^+jvpwᄔx@hs==#sݮo͚AAGG{KKi}gW$ZkZk-1v nIB=OfZ*M7dZ+ NH9#w!bR0^{}{O 6ygp?jŗ\rAƛz{S'O6ˆa{B2!"4F5TK9i~v(du^xwqR1 c\gr8[#"B|w|q}=$-^fZ!@d dQ-żRIZ?v7Xjaӥ8|cEG RKpl8*a֦!JF%Z%ګu?z+Yj59O AL{ޖe k]sa72[k40f0ޠrs8p)ñZaʕ:LT*R^W*QJ1y|nΜوT.Պ2ԧnF4AkHjr(cYVJzвFW3gLkkkb*CGꃑݎқl a:f`chI#ˍ2C/F>NSX6r0.6rXU}5?#&qxċ荡/Ja#yd r*xpBʱR)qFΡF^F<0Ʃ`%N69򱚍M5 Sf{@casalQ8ְG=6h&p8^ NH967~QorA*;b)3.qyKF&:fgs6#؈"da:⡏i*jk'(p86RR ?mt l\p[xpDv#iy 8bCx)wyTPԌg+ )bp(>ǿhU]=RƊNîSݵi(Wkc2Lqs$ij$= em#7^^=eP R8p8!M ͵ugiczzFڕ4op(PxOyMcdkClpHݦإW`  IDAT.1T;͆RېG,T=Mx/SQǫR?ˆze  BrS)`7U! d$ J%T*, ;sSJa6atSK ]@ `w:6c qKOpC7![q8 L"@"dkqRӇ8xƧH '7' xC5 X (?ӗ4JaS7,:W'(nPiBD"`k'#1HH,#rc'A'`!`c$@Tcqj6u k(@fc8RvC"@/D fn2kg@l 6!?d8`< mHyq=9Q"R]sl6bD"$18!Wņ46<s B㹎<#nc~-У9xqBGr a]& Ϳ@DVbbF`>PvfV`QDXwLl""ZO N`1I k̔ &xB`6RSSX4qSPgMA5^̉Yi&4 P߲EsAYf#-~DŽfP ) Ȗ j֓D bUGZ)d}m@ ȀI2O H" CFTF!щ឴)(e ѪZ̞œ+$'| 3(<CRԉA4! * D HhI'AIhX".(hP1(jB!)&!c% 0 'HLG )}Fl%h-XÖ"€0XǖE411< !5@Y3n+1X}ϯ+zW<Z H7NH9^ l V)ȐXq :HT LH:_B0ej[UUzU5.0^ڢb/;B`$ YI8>5,vDׅ8[c$1&cۋ Zj č`"`m9Sic9> KQ>qƆ c^KTjfF{?>=]œhatڭ/1+cL%c3=VzD+))MEL{ˢAV6o5Սthyi*_"+b 5 Z@ ILGbJ@5 sT4Ҡ5DԈ]J_ZO}K9HW˯qm”l!L UjydL\Z_KKb U%gBg+Qқ0IU>r1zFUmX_Pk{;bKUkKRF@ W231_S6`ME35 b , k,FlZQl_ᄔcMHz+U??W ;uo~h9;TS9]Ij 2Kn\__G;/c{WԻbC5wС;#qJOe!Y2pȹ9?!H( Ƃ%d`i}7OR "Ou]?#~te+̙?MDHy)EE_ո jukeI+ |eE { Z |s'Θ-~UrRl_0u)gqځ8ww?xAyς_=+'^?tC\L+mmz[w7>в\a9'pi&elD" P+'5;?N۾UϬ/nwOtB#x38gq}+e]Ktsv6ow~׾|e"l3iډ:舏3y%nCK/7ʂ\~7vO/9w'"X/>kV"@`Ɓ]h,#75cɚ ls'!S@l-k94*@a?nY[{U]_vWyswpU' lӿ->vZvhP,d &E ?eUϗΒ=V'oZt vk)axϞ]|'@|G_O'q}I96u`-XF HȀxte7sE3L葏 v3}ǟ';Y$%) 6gւ,'}8Z B7~{ߊ` \ko'!ϔ&zaK_CSfew:pGJY8ef)o=w\t=3l W|vt ŊuiU- 2$bnl4`-"LToV2U`K?r͓E'5kzUO ~ W?*^=O_Y/oߟ;/N[3;/zoݘ>)O>ۿOmL_>7O^'*-gPp֮j/ "* 4֎ #|]2$H}H.8ʲZM#GR9͂R?HR'_/=>y WOfʶ}7o^|!/{qh EPkޕ_ 5>o'\UVW\Og[oK?9( Bī^+$;勜H.(Al-ku쾇e(L?t[1;T_n8]%3ɡgC2) uBXz%v\~/Y'\zG~^>MKiY"n` [K1@Tj ;.;Yy?~w>y̞zW"ji֯0EIh@>D Gk;+A@ z b`:^ٿ-ە08IG_sL ͝?i, }Y?ɓSBIm eOr'!A#(A!-r$ `ш gT`nA3o3ھ46e*bl#'xg/x߾e=W:CU/S;Cu᥮ZJFJ*JsX;m"i*{[.U֚_|Go|Szd|Wq/-4=% ˟.Oj 1e(S">g1& -};s:DKrU˫wX4ŵ/*U3Ndz;{͚Ɖ*~/c&̀*Xet(|HkxB0*0]娰 WL%> -^k*kDbK9Gz_rߋۂ='{ﳕy03xJ_Sgx}\=-E'>IHD@1k6 Da <@fPHsKo_4mT̀ $5CT )D=< ZYk++ʹ9:&z^zRUU4wǽo?ˍT?q⒵ԵSKSN>p*NT[Vwd X8c0AB}uk䂲2__>I X(e[ Dg>C>= "H D]pއm/22;uR,Ĵ9}k}hWoԝTn$X fFJgڎu YϚ;{@^x0yvkJvժ_|矮}=]5@GwD5ckzf *IΘ߲J%nA?[n l s5mT3kvN1l,0  X4ΟjOef$y)M.2%+ş.9}uJE+4Еں 3~8L1>zמݧUFaUUD9a`"L.AVBYD L(Wl g!L0X -HԴS!؅{f )hDGNƹ-ٕOKM7>$Ɛiۿp֥}hfqc/=`Bs^?gnϏi5ޙ%W_my`:]zF3s~Gkv =m$Ք(B J:q[R)zȎtر; 0e嚥e,*A0ZHqW_'a56b_ϼ+Z,\}) F&AZT^:p,1S&X2ܞ=c?n{ms^/|mMTq_9rXF/LE!3K\Z5YԞȌ {oy_e]?k y^~ӫ}+[uI .ϩu6䂅uMrޡ]~"Q/ޡo:b]?~⮫+myi;ڪ3,07omL3/.yp.oqr5,o56͌棍@dlTdln(*p\8! @Dd΄bwѡW\z%b\ovGH$.j,Gt=vϿ"VNq@"cỸ+s &ۿu|]2Hʚڌ/6w~.g?ӊ2/"203JjȀh]j  j4Oß?@ ?vϣ'u"mj9LcB(.9}烦A;UVQ+wŏP5Ϯ;j E%ɠfR̿=^SE#0cǎ~Lb }խ䋙>xo_⬽O>2kһ~oɡdN>{:"f4RHւf$M '}@ mG/=g_>xSD+Z'cϊvգ=[OUwq򹇴> #M&M?2,O[<Ǯݿ;d TKLu^Q{//K|+!DX/wz/{@0M E_RCܔJܴE (tKpjᄔ"25|n;3;V/bVj¶ 4i]Jڋ#svo'&)lLշQk3 LEIȃNk]w k5j1ы{ӣwZ҇^rŜ&y8k{zz) kQbxk6DU=FB2Kx , 2& uf!C\EJix{[>@@hmy?V IDAT'b1lUB/ŅχOiC=_(JqVG.>W*!͚~eE$CDŽfFŐ}ô} -Kgce6{-޾8q#8{i:*e3O1o8MO>ٿ~UWԩ,8oMH $`A#c>kJ}%M.E]+_xn6ՙΜ F9C8\(P8f4fq!-p/LY(AИ '#EJҺ %yLjA3`X\9 Әv#V:Υ!W̴$8"A$/%ܑDj!Ps#GOVu9M  9@tHtbӀ&(R HN4@t  T"BhXN 9PQMF(ẖJȽxR?Sa(OM (F2MFtnB*R(2>tb^P N5ʁB .. .T|! B!):P,@q%ZDd<$ܰ€!H D"8p(':77\p )B *8@ *4@\0 \0Jp\ҍ#r $ "r.H $i08$ p.e $D5:! @Awq g… A@!8@ ^Fh@(P "N8  R$~@Au.Kn.F> n'(@" D.$ECp݅@4`NA @ aJ8a@N  R'pp".VD)o3;fH  @ 2'p.yeK)eH)}#ӵsQVX0GZF\N 8iB Eb`q!)" @ԈNR Baz\DV;G;"5q\ \QjS\:5hORA rBpDAQQMCV!AaDŽeCp:ccp"AFSjBX@'G'BK  . N0j 5B8!))p3q0h сht$P .Ƒ B@CNS  ܅"!C4n8nÉNt@.UP+2J0R G"]G!@00LfaQD`>J F8#\ J+ Cb@(!i%@@]!QhZOe%OНJ排c8P^sӝD„jO4(CJQtj߹E]U-Bq%P(!ddT BP\&hU P( Bq )BP( DR BP(2 BP(.eH) BP\ j֞r nFP(r(i򻖀2O#|3'ӳӫZBP\5k׈E UaGRJrgq Z&T8 B(Τ;n ^-]U-2璛7HhZYUˢP(%2<*$(t5j+C8*\Q켬U-BP(*ur3UT(CJQBQҡ:PT} Bu쥡|e~.]w޹l”ӧoݺP(+2w}wpرw}rU/¡CZ BQǥ )ECT[l[bbblڰaCͭVk-6nsM׮]S6mڴ֭[|077wȐ!aaaaaaÆ 9Ӎ5}_yBHNNx9R'Ǐō;ֻ D9sԪUfk믿6wiŋ7oo)jS*ڵn^3kܸq=N8῁2d6=ƍiʕ+۴f&v=''3u߿T ťC 핆2X1k֬Zjuȑ#ȏ:tVjmӦYlYBBBHHi_hѣ>cٺtra*7oNJJluԙ1c\?QFvb!YYY {7J{Ν;gϞO<СCkΜ95jXxqnݖ.][2eɓ'׭[s{wɟ}?ܱcǠ 8v؊+^}~ 0`̙|ɓ'MM0CC5O9 yyy 6|ꩧ >>޼S-JLL4iPJ,X裏vu֬Y駟ʼ# %B 핆2%EW?Ӈ|Ϯ^zݺu<={^zÆ ?\`ҥKQFcwݽ{իW5^3ǰo^v?|u}衇RRR^zmذ^[dI lb1Mkc]vu]ֹLkɒ%k׮m77ҥKSRRVXQZ9sH@hz聈;v_{Ti0<8$;wg.!=##.mtJ̙3#--T/B͚5 'NDW_}ջŽ;֬Ygz\|'2Bq&*alƜ9sƌ3}t޽K<QQQ  ֭$$$|ݻwݻ79rdڴiI&/_ҳgOBȄ F]fM_~׮]}111k׮2d?} 6yгgϹs疳ׯ裏HӧO.#P͛7׫Wo̘1Q(Fgp߾}g9Wdggˁ`*<.]| hڴirrrnn4p̘1}bbb߾}>#|w@^xᅩSV^J;w\jղe}l{Ν !/ԩS)ǎLʪS ֨QYf`Z,YSO-\p֭z{c>N4W^AquݿT ťûcWxS!թ})iUATGD0 r\a8Nt:N|K|QMSY&55Ug7AAAgΜ֭t:333CCC֭ۘ1cv) )H$w^(SY桇z뭷\SE߾S9rĈ7K.5#.6_G5kF) r87Ӧ9r_~uݺuG*w}w}0]wU̥Qbۛ5khѢg}v֬Y Ҟ Gy饗7|кucΞ=%&شiS׌ѣG{[n},K/G*ҡfQ!u&#rʡB!%BRp.ô5Uz{T&cG7ߌ;pC=Tb5jܖ.W~RS0V?/\pРAfa5Q$HIIQccc+y*HMMU<,䓏>HMm۶}7eŊիW%۷w8f͚1cipGD 핆ST>ܸq_z!G*N6mdn*͛cZ_48{0`(رM 4rmٲЇ&MyyygϞ S_|1dذa!o9xy[o/?رclc\@%>`hh? 7vmNZ7tSmkڴ:rX, mu=66v۶m-2eJWvιv]~5kw}?S~Ysս{3z:" !ʔJr>juŢjQu]4MtMg4QFe]E~W eH)&+7+33rҠr^jΜ9sȑVUSiݺ5k> p 1s̤4СCSN}k׮琛n6lةSZjUZ7ӦMk޼ybbo&KnѣG/_^+((x'CBB5kf·*֭2eJ^"##G5cƌ2Zl̙3ΝֶmFߧz;.]:pO?t+WlԨњ5kO~k֬4iRbbb-ZԧO{gæo߾/{Z,i\0/_w1rHo꫔I&լY',&m۶͙3b >_/ !d<̈#EPY?m0`@ZZZ6m,Yb>8so}ڪU'%%Qt"]:u߿Qw'Dvv_|1k,QNÇ+.(Zk4HjW 5$  cr3+ڲi=Veq`߁:7ԭQ#F7kvm:m;ow|צmܤ6k`ћojC- )ED_ ) f9r5kƸP(*vsJ ðYZ0o|k'wmצ۝ݾX}ź/uŦu6QT8"?!ivkа ̼S( HFN񔣑aќ !dY2v'Rc NA9s/j )?!D"XanNn@`豣̉,-@.sa7n$L)k]n4pwҬe)&5~ ۴M+CJ|.D!@,G ].^U Bq(2潜天Y,m?9B"7BP(aΜM9~عsg[u㯃UÜ 4\H  I& IDATA(@h u 4ah\csf+P9%Þ6a܂24Mc )E!xǔBP(s"£ΧժQ1S1\t皦k knc1mXmr#ߑ>'ӳ_irE50 HeH)b` ! S(2V=$$EViF hsxCzEV׳Xt]cisg@k:sf[&5~9u:T\I9h ,PR Ѐ2)@@BP(=~۷3+;a8JEFD5k[ 7%ݢkie0 N?|ȿ[`܂Դf /MS.1t굒SOyGĤg.E!=R(@ZS B^YmR]EӘjjڼL(!PBh@#"@{!8!DffEG_vQ 0x)yH)|1'Y|26Jř+ uNӸLYm2Ji7wp!@R @ۻ!}랝@(@ \PdU=MX rVp"x>$>r*CJQL=E~sR BQ0Ƙ'f@^EWC{!25u|?}4 "Ad@,\KJ(;~P0 eH)Jǜg 6W( EhF)!ԝ>?]tr"C2DQbD?/ts艎R B(MFP a;C$^իWשSVZ˖-+r3gΌW^zRRRJ,T GOUD@HО8ɝH~w)U B5R%"BE A@QOO~~SO=_kֱc^z\vvܹs?2wl9HBЬ] )E *JfVGr.0ܐs!8;w}Z(=r|g&"ol.7B䅎4%S6lW#&Cp82v'֌<뮅c$ZDh;^YDk 9C4a)Shʬ6k-~?Gu.:w=j"^xnW;n imi<c+ʉp$l֨'׸1([j //nժU-.Xz2v 5.ð[9>{… k׎7nϞ=7n3f ̝;SN5HG/1_MfF(e琍 AI=O֭[4im۶ݴiS޽v%z?."ޣ|#EN# A&ES?Ȍs%EHR3p&woc|Qa) eьo͉ujfu]/M01"74]4Mm4)d3CYpED\LQ czyMaʣ^cx꼫4f:#y\-#*jY)-6{'N'랻j&$]f9Q~soKhY큇T-VmM׬jX-V ƍ cT-rC+2h:i5"ÜiDO> R:nj">LHMaʣ^hq*u4E>Oxצ ޤfXl\.-GZ?:OUups.}X7RWeP(1}0t[tbgk׮ٳg1cd믿~СW_}I&O>$"ٳgܹs H HES5]Xt-)_kڴC!E4Ji||ؽ{7c̻u>V!DZNiSJI{ L@O")F" !lޱc܍7&… qƍۿttt:2hqCJ )`ZTr*#YИ'JPcgB@mȶm## cbYycEo`ynw@Fh'V]\aʯ^` ck@Hoa Vb2F˩rL+qW'Ц\%BDh&\DvmjoO?-~-Z&''W^m۶ONNH6 Iq?rt]]\x޽G9r裏~6m͛[nߐSqsg1fw>NJ#R RJ9q=JVl^@UǥKw["q-[ܳgVRpd,Y:-c(CJQ!=94nB!@)p.a2TZO0>!*דz^ i1#!B+Kk WY@ v++ʉ8N3;;;"""99u=---222%%ĉusxiX ҏEht?? _tN󟔔؟9e?IQ9m)]S\'KH D[o!Drrrڵ=zoxIJ!wz,|0\G*;/b)q4`# !n$P@) ƈFK%/?b`4vizd{%ȠP 掑25Mo_Թs&OSOթS'##;w\PPА!C֭{" ڳYl2j,2Fj5jɈOcK/E)-:wryrC !ތc|l>nݺ !Ν^.333##Cn#999,,_Wٳg}JTZayYO2uM9Q5!D^,+7ԪwQQlȒ#"pND "PDBlei3ef]nvڧNXd=R5,a^ 2(s"j\Әn5Ytߐ._ܻ$::>HBgb:j#,Nj-YDsv^׮] ^4R2jJ7,^ SOW$APRjfx))w^Kʄ&P_ɦ_Cft3AVV!9W;s!% 7A.O (*0Dc\6(,*2H&݇vۈQ**RM7۶sKtaf|*ݓN)p;ei4AnQHJnИB}eL]5nPr{%Ƞ>w9\i4m',]ӘR<;z )3.*&>?։[3zCUE:*7i07 & R (r:0]SUHB(Yp6-- r 6`u]&9XtM佻D AUN6M((*ќB@ӊ"! H)㜛$J >N EEGߒxہ#v2\Iqma8 ݟQ(ȞBG"Q A)oOrBH>tLa8텡 )Ņs o|&H)p84FX f9 .lVk&;}l5oltC"c^ur Hl.W_EH([ DOI (<}+t e0)z^(SSRT/ʗ )!}p߼Z^4q_{I /6!+4^4 W"#@k7㤲xQcR)D)D)" ҨVʐR(*@n)6p L_RCoL%n`,q^?99#Gz i D mc"/+wӈR]I#gJ!>J!ʐR(*^қ7o<~ ܜC?;n9o?_bǎ왯^f+ֽ}<-##~WQB3Dg}_Nn74k o```vAINy$ź ￷d岂aۀpo-Z;6gggwp+8NX||W.-rD,20fԸM hR^\'y!ZAꎄC[-|WuBHfL ۻgߌ?1do/X`v`zώmZ+-6Uw8eB[n&@:|ϧO\  d/](/٬@#;׸,(CJDv0t|{ooܷoU+>Z՚Ç>ۿ4-+3/vvy.M{sf8yoM: ub?Y:**24,4**>0oXʬ=g߯+ } 눋s O }t7?o aA!!\8zh綀wcGkԶo|-o. RߞrRl=&/R!@R gF?]_0}cɓ'N}?뛝<33~Ǎ~1FldWBnl?l߱[j9jH8to_m陯ZO<3G `ћ^2|_{mRی麮m9ƂoU7kd* sÏ?t8 6}!OxlK8h c'8O6iıGyACV{jSpsێKW,ߠ~y~QBQ1|zI@R֛ ᄋgZ5 _nCZj^-i׾mFFFPH>@C)FKx||i6Diannu>OջW``OJn/(uvM>8 IDATǏծSk̈́onֽ7m̹Q ]PңQ9w@NvK3fW> Z: - ꇀ [|3AKh{2M6ŝar h q/ ںyۗyQb(9weff۳/--mĨ }s878/z.!3F|wsgQ2gԸmDXxpXxpvv;ocpزi#GϜI8x@&.. Shw1yfJWjJ%8"p֥KQm #1m7o?_\8p <3#sW[7)O{JPHq>[Dž;{ˏ=z<"ٳ4j9%+:u/n1"D[=.ɾ[4p($/7۶76jx̹s9wݹew=iqK' &.} TT!eOl~^ (CJEBz6ئ]bHXz-CD90An2w~2f[~ݺMjQղٹ*WlFDGg' [vja}}_>y{~C9ۿ>>H Y÷;]?[ #//Ef7uj?m׬ =b')wmIXSRRH(3Opgɨ']zɝwum>q6r=6QZg|u}=xաҴYOdgmڰoM4cpڍZ p6dX!\!ҽXq]=u/~wG7opˈgS([rn9 J@R E(2m}_O΋썮|*YpɧW ;kѪV_to6hVnX.] %Zrm/JdmߚzgW{@@;ڰc[\h0K@s1ũ̽.qkǝJaVEx \BT֣7'xF=lA~<5E _ȅڟ,U{@@fMoqڴ  6yծ}[΅e(^Dw7srrrC*C?U{@@Lݥ:~iկ7}_oִy]-B ܐ?~s\Ӹˣ?<ؠ\ Uu&Bq_.~kڼӵ\[n_kf O%s~](r1.ɿOU s^?!Q: +ײucGmrS =?o5mDө@XڱnSJ oס~˅q|@r٪uk9,x̙TZd6+/?⢊:)u"=cn^嫚!9'' ۣC^IKR Isuz 0FJgiۡ %%Qǧ{IӸf-^ mpWNNÇnXeoKo̙׮C"%轑nͺe ~|Q5#PT"^3g12:R~m4{qo6Iɧ?3s!a!>>q0L)wT8}…lVϬ=O{)[0ƂCC7uʋmVSGJ ?5d}zG޷|w- ;sޜdž 9ca1Gz-"'+?A￳xY-M{yjñl=Bԩ[g0x6f#'qWs*PHMI{=߅7m̅弤nwhTHhȤ1S-KDdĝ=` qO.Č)/M ǟҴyӼܼ]xIm[*\j9zX=v[&^_MWN*Zt޿Q֢Y+-(~jR\6~? ̑8QJt%^kZJ?}TN#//o3 Gf'{>`~~~t?_|дq|^q~_3RRJ!>WH, ml6q}vBcu]u?S)b)yW66K.쏩Y=%9Yx*G|]xko&_(\3V-Q(RU|J_GOz*<,Zx$rcJ;ʐR(**rGIl6[[om]fyw2O)U倫/B|P 3gS8vܙV DGՠ=]OR E <3;]e!TBD| .&, x7$x 1^5+m1P)5v,?ei{)$WV67VVCn\HEa >cvhHHH^ufj&'f8zc wi?y3Ux1a1׬|i@4z={ 5"ADc(B*j ðA<:cQY:N98ط|7NlG A ۃ⥫o^߹@  tB ۅ/$0RYKu0X> sﶷ&T~ߒ8W*;5.!I/g&rFMJs.)e1RNRyI eW?'ݝaH*K2^V?]2=^% h$鎜 Kao:'򍻌i Tּ\w>Ji (ˎ^mJ{Z;,5D@4So7DDhQH/py`E+3^o@vz<#"SSH?29ijO@*yyzf3Azs뎐gn3*?9'!RHӔR4R?IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/Gallery_templates.png0000664000175000017500000030020713203343735024405 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxnzH t)kEzA,ݫ^QTT@zi޷Ι&KI!3nfΜىϜsf4=Uz!B!((aJuV7.bk:fKNXL;qE:V'WO:A<JVǓNLPOXS)dZi*wLu[[PJM JRz/D9rCOeXUR,'QgDVY2)b2s|%V9ih=e-PO뵊,{=w+ \2%yr_IwjRU)XRN݂:[QN!B! *B!⌖Aҕ^с!B!*{\gJȊC!BJɲ,4MC)ʴPy",@CGjXV$[y),:$)ihh. 6322B!B+˲, S)iP5 ] Mg(toYe)^P,>>4@c04lnG3ttM?ƆL!BQ@çz==4h@:TCttii餤$sAvMÁnD#, χ!66&MMDx8٤gc_d=|>.7#ҩNUDEP3<#Nvg@*} v;~r {\g+""Ni\nrshFHH0AAAl)[eq9qzn'8$ -,7n]p]avvBCJdRb/T !B"nӫgOV4Pʇ0 IMMgEx^v{M(eYx^ C'.;5k@INNaɒ<)@zTw<ף%AXBuu4`{o&mnn:wVVVrIIMò,laQ9\w2αsvӎq}# OgaGqWŗ &eMtPGؾa_})z_A`LC96oe<$2U̙ 2>b::ˋ򸊍_wLD eg`ԫWQl Ebb2a!DFFAhh(vOp8l0*2qV]skFsggPIZu=μ?2&F;&={-nᏝdML@RPތ;2-0&'2 ھugj:kP!~[ 4@݄vqm^9&82v0"uXvl/fώ`t҃al]}(5nLU CVzt] ryK"}93P^wflzN}%##0BKi<ϿKYgPZ20sTtW Bǟ-9:C4y/Лu  e8whfpp+|nk#tW6y`8l<~wCXe9 >;J$+ៜX^7Z o+q?ם𾵘?=_ ,+מڇ'ɖ*yEoЌ65d똞 LY6Q+jP!BQLkzS'`rs{RJ ?I˛i^PbĒt$ԪU𰰼z`E|"ݯ_^oD cP0jXxHrN#n7 tfQ+]x]uz %ÆC;ZfxlP lCXD 7N=Vy&ƣobLm8<e;ҋG3de(l * ,","I-2  qc>|>o`hS n3oMXh"6zx<|{kp:\Bˇ!4P2M P\,U*5'/m8Ȭɼ M@ΥnOهK^eC˯f3>z$YB ߄;3pg88t ݡs\? ]z]q}GF\+|%o75g*pt;׏Aߺ@}s+3Y7n{pEͬt\Lܬ Z{!}<1u`GQcz9 !Bbʲ@#0I4-[Y>ݺur6  _PˋUI42ӹ|˻GK/3h`FS2y-.ҬI#nw^2lc^l2MC妓 QpMnqt8R I'Wd ꟦d7w<Ч^ Q*Ö6q-9l~^ދU {,ر^`ٯyiܸ&x;İw<6o} PriÃLмyxB8z Uh?2\J!޾uaYRӫW<|3N'^8s+r4 Oyޱ n;q8l:FlLZѣ'۩S[;Yn%Ұr吙cF{Jk+ 튢o wivYqq!y?nB7t4W"7nb֚ŀk=3VpalN6^e3n&ekXCYdEYdEӵNZZ:Ürssq:89Nrssh0MEzzaoTdddÖN ?:,|>3x̼IeP(Ӌ2lOwtnӑa5+nKgKZne)vd)M0\*$$h>niS\g.,j֬"33 s5߭װ+ӠU5~څ)̆瑽c'RrBkӢU4|l]qŕ^xld!ǭq]4 .m,?3g??QqQZ=%ꄀO/ZÃ3?=9'=ɬ\5>53f\/Egn qQp)!BNfDXXii ]W|}GAkHLLnя Xbu(ehngIJ-7+4$[6'oR #s@war$pCOpLBB|w^N'>ӇVx=ng}mmd.zWÝwOwl\AxM~Jq:k+ kѩ9o :L% JڞEHQ쐢cs:I~`hc!a*2!Ea,e`'C{X1k9s~J`S'̮c)y,b͝wR:;ސ~>!cV^C42B!N3,viT!aG)kȻ7U#5-4BCAp=>ӢM7tTN'KJr !XngAH/u5bB 3=Ʀ ͶXmav=pYTE fZ4n҄Α#ٱo)sGYxr-{2W{:vnFMв|>ck-B4\Mۇ<:Y vT k=4b'hY&Y|#4T"#a3 2L\9<0;v|dgy1KsS} `)n<;xڔB!8tJѸq@Gj;i2-vfaB5zhԨ!QO34v h8-/Q,C <ʶmv25;2Uy<^#^V0CKۓW'CzJn!B!N+ x<L]ž'#77Cc:A&u+[i*bckWG1*zLd(B{_>Er_Fn!lz}opͮ}ۍhٱ=]vg&=/B!X2M -5 nfInn.)) 4 4nMSS@ue)\ni>|?b@˻6l;<YiA:d)-^d1- Fp(6RPJ{2l6ifs{q[al؀3!|B!=6 ϋ` 2tna:=1x}!R MukzJ1y^^/J(ezjݎ2MLytgq52YX YB!ǰ pj6hC Ž",Vy(c-+)ițB!ĿU}֕I3\!BQ> !B!(ʙ?\J!BbB!5yB!|I#C!BQ!B!(WB!Brmd|7{&|;+'g}m붊ܤr*: !BQFYt8S`y7^صkwyZ" ϾH|nіQ/"aq ;|0qou= 5<]1#/fɢ%5k؂bq:ٰ~-,}9:vcΌ1̬B!bNe祫Th]LLS a?|FmMKm/+3ukZ׹kn6y,^YLxD8;AddDE%B!!:\j3eEn{79?/ga9x ?_}za8x 㮼~]{ѱMg.2%Kл{LӤ_/øKKn v,_~ЭCw:g|@FzW.=ݽu g5|>_i 8C=LnnnƐa',< 0hڬi`{oOҮSX׫[ozu;o({[֡;u+gϞmzB!wC\u^X2-0{>Pdmۺ:uPVB;tMصsx7aI9|:u a aF:n8Cb2m'HslMSdjժd"~?U[nkj>‹Ͻħ_}defÌ rHLLdڥ]+)kߠ! eHa|8.ϝeڥ 14gìYu[l/>b:u-7zB!tuKW'P~b-]od|{ʡD4tBmXbU哓ٵk7\v1]<x$P&޽v۱v:^}5R'q*ޘk6 ,֮YGD.xCcm8pzBBCq ,\ o?'ae 4-X#iEGGS% .E 4 0س{7G\OB!h4'Lq19|Poƚkhun"ʲ4˲,Sx8i~_ #ݏ=4MZ׊OOy(oѥ[t՗_f:\iϱ?}= !BSsޓp8 .ӧCbck3Qy]ۻ˜YsϹKR= IDAT1DUqCmLӃOӈB#JR0Zjs>oI !B)I?3>ӃR[uТQJSI,jUxfL.љB!Xa&`^=?W)LUr*WDw =wy3pBOm !BTn&~JS=0z"s*Gd̥~zy'ɘ6m:{J*5}6m",, ˲ }B!ĩ= (_;);yTT&\U G}̇~DpH0!!Ӌ[&M(jծC?XP%peןc&ip !!!ɸl%TB)z;ﻝUp?|yJ˘3gO>$o]v!33=c%B7T|Cu\OY yVV&c.I7a nԮUI9|LvkW,o4:Q˗v*3'òJx'x@tt4XERR#vS'6L欳z?gffrr*BBy;oCvN6W]u{vcN\sk۞3Ӱa"cN!B3WqI2Q*r&+K{y䁻bh\4bVXo0iߣ,Żo#oR>|`*A_;P"55>q,_>yGx=ƫ,uœnzFCQbu73F +PbU4='?_ RsӵtPTҸdX}/]rեאx$e)x)@W_v_uJhC*_Vv;wkEnC֮_C}y{yY@?? 4oќ5Wr-aaen;Cp,,vލfA)=B!gcK\$#=-90;oG& y!e:K&0{l=V0m3t1nt=o{vgoTKWе{xL y,^0KʩPF~كҠQy)P*e/:lij?3>%)1&͚KO~zEޫx=^;GHNJfHO`̐yhߩO= S&\oywQz({te7(w^F굫ؿ?;wвUK +[-Xorϭf8}def,a)={vB!D%u\# e1dfd2h@j2YlY3graْ >U,ncҕlٴq3ٷw 5?#wwKF_z! ٧n 9)L iO8*0D)4p]›[MINJΫ[⎭[wZnɔ>7るFPF4:^RКVyר@_}GDSNVZ!22xɧiӶ 1~ʹӊ8T& ]t>#$4~?/rŕJ|WeB!Def3#Rſ)ڲuHnz kWC+Z;.4g&\4P٤#IXy1К'zvzz.^FMyݗ o.1)P,?G_a:#ȁ~z|0G:{T-TnzPJaz:9G3'dLc?5k֠mL_^np4]X}#zsmEHHTV-oqp0~"99/1Fib!B CGmF`E yQѿ+]3~@)ENӯ4MRSPJѾS;fϜCJr J)rsԎY?(HIN#oR ];| vLPpZbmYi|c>QN8>_n` J.\YY1KйX(@YeWez2UE]|&*n1r-Lp3͚4a#i۶-eqm՗_6<#ԮeY >{u͹md'yǁJҬy3j֬ɀ1 q !B3n3FY` NF[ルxpMW or,ňùq]{\nF]]{p9]4kє^U~`؅C nQ^xԔT#y׈*2T(1܇e 9"BCCS76our/L>Duj7_wSl1 Sp׏'^q=7sKÍ.b.As[_[׽֭qFq|9ӏx81B!Ha xW_x|6hͮ;*]N%,]/]r0۸p',1w :!LkƏI08ebTKұ،åM0>TƜ,o ~:ql E!BFTfI*cN <]i8B!2 n?29O: !BwqpJxC^s*N~Z 8ShgxB!UƱOR|ә2TO:;2OB!gߓ7'Â[VlDARjbEϳRbB!ʉf'F]iԊАGưG{2bu(Ut$ە%ףBJ#+7T&`thٙ5*:,!N OFR9 GZBQYNtD5B©Q&k6gGCTJa6%B!)4 {0U"8V=T! qZNB\g[vn`^OEsbבB8lA֨CEвsE#D+<[!%Yy%-{^DEi=eɶ[XfZu"Fj QiiFpP^C(4[! r9޼qÉʿ>b"atlمu1;a&=:Xm!g"'~qNR20M 1 jUӠN#@ʱ痯Y+\DQsAزsdB3aJ][ ,$ qfs>6l]CF-*U=|=ʞ_Az0q{潷8YlB!$ows2\[wmuvDEFc*˓{FIZ+;jQ1lؾ XWtlo_!"4TEW!,""4?1]!Dd:6vR;&*=J3l4=4*;YRXWT0Zjs>РRʪqB`۔$ڟWe̡EV4ʞ_ʞgeϯ Zc>V%/.Wo4 vz*hRXWU*0݂MON:1- !eq‰ߦRTeiϱ痯ywmp ԫ_T0߸7t: F4w}1V,_]0C !gf7@)JE.n=ؓ~=peװj*2Y8o!C%77L22ߟ+W㏍pwɀ곯Pdw3o;A#Yf*]ѥM7ڶhO׶qtmǢؓo,T~7Zl*260\N'>// U7yzvE|Ǟ\~8~C`ꕫ֮;=f@ρq˝߷L|>/[vdŲܹc'Zvç_q5aq/>wvwuח:/'/=:bH/roّNuk8{-Sޟ„'һ[6(glg&[cĵO=;bYf L}]{qq<%v>fXܲuV\.IUү_v;᷹sb9x"#3UV !gޓa (#++krdQ_'g7~&y3&=zӦ}B=BF,rsHNIG擯:xpmӊƳ{n&~Y4+PO:7ZlXۜsa&GL\6&}?oIx _Wymlڸ|dfNFM2|{}LCRSRQJоS@M~KYP5)7qbkvqcYp ]:#Oq ԹpB.^ʷ3&<";v[_fu^w>HN5B8!-=V\MxD8M[4=1$,t <|u>Gqs:4lU%B+^ӥLe,U>FhX(;vDY;3g1i$,^I?++*U,EXx5j ''e*"##Pf{\e)_~N<ȟ[߻ ?Q711߿77mAYFMr xyqԮSZwrۮ:G dm$99rYnR۷oCr~%WG{g|'@ZاP,;A& K\_XUYZ8Y[X/?o.mWY Ff{qcB9lҏˮIJJ ? ɇ2h@C4WE/?*_gS>}G0>zoJ=p} PX9r \ĆƈuK:t'|iMe՚dfd0m4,,l_}ͿEӦgy&.yY,,>LV-ټmӾ'ٳ ́λ`_4wy$,,֭ê+Yv%sӍyX~ }ggΝ/^3ܤ!eK dq o~|%ga*ȨH7:EnC[o䉇c歘ʤf회s^x9o2#GG8nұkSuq=v0娰PX$55-9ۯ m3vt)9x^1;N~9f-,EZZRkLe0 MJJ)Wy5IN8u+ wq{Ipp0^0oܜ/7 6T&op~2yu\e)y.{}wyfW{_vh˶-:IOOg$%&HJJbU"RN{~e]ֻ̯nf\2n /bLC>#~ .T& `˙L'7z-;T!PDZ#pQ[ؿNnХKg|>,ǞݻiU,^>;n'J^}>d8999$N|:unH)!R^OFIs2J;mo.4>] Yz5kdeEg@o4 w/Pֻ&2yN.u%kW-p\Ec- ϬQ癳0_)Ǻ\Ʋ,}51pbjpMWݳMZJv*<)ce)ܺ!/n ⩗@) ""էnΎvpBLxD8_IU)3-l!F =([ObՌu%IŮWa$'%l2jծIzu{,J_5kn:"_>NtdfdƘ//zDWE, Tܲ%4| G1x -YFrR{cXq~wz^4{2|ycE,^Vq]wp8x}^,,, @)Uh;W^_`|7{_8KlR5 E=2e B!DMGKP%._M l[dnz7l"UKƍ>4MRԫ791cGէ[JaY6x@͙HKIce,Qd\y8ه(L}y7:-><>yl\6gA)Egoy8/EHh/ݷG|LVV)wShպ%Ͽ4>Gײhۡ O旟)q}6KY [Wf8!#*ʳ&%&ygiڢ)Lkq֬ZKg:!$$gy ~3G %(8Ӟߩ.jVub>e_6?qy?!d\.L6ݰ,$##ˍf²,t]¢Zj$%%ZL56loin232xzo"'' JQ`pR]{5s6o0p~Be=LIOK'8$Go-,8^05ݿwoJKgQǝ `g? nggמ㯃2_ow^'v;CF sDEGa9O[~hYբz99tځ3琖FzzfΦSTMZ5?'4qɸ17遼'MqF?!vڼb8eqe3q4oќAҵSWvFff&DGGs5Wѳ{/СC;,^֭ХSW֬Y;ߛN;޻q?A#J!83_WIuDḞ񻟙tl6w\ess{OQB !t"(뮺U)vY@wEDt˽ܩܖJ$7w^S=O[p| ms]j&~p]ض۲1g@=y+T|i IDATwK#pqS|ʙKo}n-| _gyKj Q}|6յ5|֛8%:4o֓Jx#RU_ZA?oϷ_]׻7nh, C7ȴS~v/hnn! dY\xK]9i<,byg knzc+_YoO{r p/F~>vp+ L>;|MFO7srNm;!۷窸p٧i۾e{I0'/W^{9kWO6=y&C_[՗g/1ϰ#1$+Ǩ_I!NhR!FR; JǠ3!҆pAiC|)!H?dr~*Kwsn?ͻmx<|! Cw~ؙfappL?4PD~=߶oLg}n۹=?_os`:(s}c:(5[1l~yⲭ Oȿ߿{}ﲁTmidB 1 2ĈIR fiQ =VCbRSҹ4o2 4? Vx׽n?ud'UPA5{'m/ GZ]:3?5-/?ܶ;۽?#p_ mwsڏމN0_Hdր~ۛ;ؾCP#suϕ0qI=azX?\6mx{&qہ\!F~S6u4 G:] ~W:7w55G:Yca.cepI,v)*:5ZGpX30Xl۱#K2\]%EaM߽RHIh*T ?39B#&ͥ?|Mw(۫F-~0<Tzqpq>vq3mf m| [{M{E zJ5OuıpᏞ.|&pL |Vq C1|[e'cnZfΞyyOʷ7?o\z,i@ڿxBл4(Qt vD1[b1R,'3bLeSY]tټe.^֚1%UইvQT,B$BJY)osfLuJgXQ3.Kqߎi'3.`0 +ZqK ~¢GB!9 212t$vQOGg6 <&1Zđ G„#a\ץhAH' /H$SaYH' :c2Ue(()+4Mj.D6 HB$nj~e|<-T2Q'=/Vh(Ciw['\0$  !dcFggr]de+Yf-W~i3u<`ߛּr,B!B_g_|4 !Bd *l0 D%xN =irqJF8D&c~rT$[Tf16d Nvv`%WL4t`ݼ7P^^tuU2~D bI#xUNy$?1ׁ~0q~D[ԴD1vYm8MaQ;8XHgAqغ٦nwT2h?յ.b=;e=`ޢ#VczKA\.B$t[*VjkIuT`9hA3_K*H?f͆s> CM]?(*w60լy=l|!*JJ_땏UygYŇ?´+ZêW+F>7DXlGS< 2b[66ehlQ]sVQE0d{g֭<@5"76#EL?󘪑C|<$B_$[PVVOpVep-%`ǘvB _vhwov^G{ṷ?߅A7۾O!ν(:J#u0 t벪.M2NkR=\!Cu;}cLZCye|8v=WxeV\fup?[PXsDRI Nod3>e$#Lie|\St:ʞ%_3ߟ-QB 8\H͜ uDйj/?#?+;/aX 嫤M?h0 ΰg0)Pfu7PY&Cm¸yK8}i17`HtyA!ŮouN>G/CMmڱ8O~ nvc~Xj #fy5k/p0^!C` l RJѻC;PڣޓQ1}xAg͍d#3ІLx+_\qS?']|-aM:W6L_IsStJl !`3 o{[#;p$][|Ĕ)[ lU9L Ʋ ii-P{p]?otuz)K~oӏY|ʪ$~h'y~?A.$5A!ޖl63f51r(;aILg[mMk Fd*M=+v}/,~ӔWB1ISRN2thʒ&e}k,c ??@3i3>ȴ5XTW߼1Þ]YK+?]]iRr!ıGY]*{~|4ػb &}13ۗ)834}=ݱZҧtbLLt4\72DYHs' b!\ful_>_v/F1MDZika/tBq0_Zs_?Kwc[M3[BXy!f~}9_~>pTX}'Y XQ_c{!7͝46s$XvQ[<'POs'#p%Bq]>C{AI P>PJ&0a&xS)#K:~ ѽ~>kE`C*!㛝?֭zO`Ǧ#B!86HMN{I|l_ŷg#F]bv'y)?s2 $=v 7Nl =i5|[`/l^O@M$C*wHyQN!:&iҮK]Qtf BKIq;#=X翆dyly+JS_䵕{BN[fܑNB, 2Aܬ ì42g8Hly tMs#ΦH"an~ld%v!ЙdI0J5Y*L4R 8+wf̮{Y4s krR0XúG9SqhʤaV]B։Ҝawɽwj6s94?ۯ [|&6l΋/}UӗRY\t1#G!,d =-M“d. +kpfoΝcsSYLsz tV\Rظt'9 8yhЙ9 hx*L{,&WvYtJwmL\Υ$Tmgij|SiO,1brlr-aC7nᔍEW/IMm$H&Y@K<&ho3(*w+^5S/(I'=F%ѠbG[Yw)&A k7Za8 `rUm cAYl'ᵵ̜'v8̜0ę!%u,+ز{egOL'v̴̫\uݧI5$G9eӕ5qVS$-2&ϥ"`$-M[I ֬a9 ㆿ&b.j`-D7Τ^ٞ"ZQYm2ufla us߯q㶰d^\>|#?5#A'A [tjߏ]2<5/+fS\`-}Ь:WyL·=dzέg㉤@xȠt3NH:Yƴn _mW|+cGRPѯ;|Mۊas3`/qG#@}Fk(:&YO+l#b{Dl7_a|aIE*mgZyΌI2gb(M( *?2cVijt 64Iiހ:MFC |tZ܋i~yo;p7~Mr(~`k$99>,eh_;x2Nmw|_mB${/b=N߽\9ߨ%+h 'hҊ˙0Ho r} ]hZSƖ !^SL~ 2=;~w|?Ú>\3!y5<aPQekGx['f PKgkJe^qx`y]mr)xYتа_RidQퟡyoM]?ä ݢq3Wr fA=Fo!s|X˜op9W}(p!#A~@A "㘥m LN2H0}2^0ߙ !,b7axEw{1KT)s 92bQfe.et[0t.Ċ8+478(^#ahߤiXMl( P1d#NueL>t`6D#8i#VcеC>ZSoI;4n7H0!T 49DPwwT?S NSL:cVi&urmj|fS[gw Z@VT/v30Cڷ):RIsmojqhZXcZgy}Mu:h:6k5.+kBU\iMYi(-$oײkE* EWGM~fV XtNp] ?Qs#NcbǾW 9}AL 2ߊnqյI.<9‰B#Aby9N=XMQLe|Ja?o7Eߘ3/Q, 0,CS 0+4sϚlh oh6:.;2횆s4bh`MC'H4h^vekfǻwSYC>vtR:;wv< 3e,Nn"kJI:i=0hm1I$BBX$d;X4362\0\0<.3(4S}߹1E[SKl9+ϼ1WD'v!AY.t{=\QL"ϿWDC3KSX -oquc;;1ͅli дJ؋ JV8YHl~#uds3A0r @llߣUwRe IDic֐ΘXI2DKdkf2ټ4,{Vj|8*ɦ6*Stt6xoŞwu[Ҭ{9~l%/]1⸖nw (;9!ib~S QGBl'g :oa;5%7 V|ܠbbҘ3kҔ&**OS~gwFY3DfM3ڃi7(SYL3 BдJa'?f,i+Ym3xe kaM~6!QBHM :;9|5)|IVNee⻺)ѶT!&$iTiI&Hd"DZ' yvpnTҡ5Qe0BA(ptu(:)aYq>fr$%x^b0-/7#K{Wf<aP3ҿ.*Ү>4ݍMKƙ\gjvty<_0|zZԿ*8u^3cbڊбEtI;F@@3kn_草Ϟ5'/.:2L.QAbSC#=`76uUOir|UI[s؞_~SrQhL3B㏯?=5tu;m{?vM>LYVn47! q|3L0z5SMՈf!?RqvJ) VfBaIG6Fwtn?M6gP~߾kH;J!w+GN7Ɖ)P,^R:/Գ| !NLR1J .=eY2`)%q76~s5zއY\wzaWs~9 J8gf- s`9+#<1;:CoZ\~H @͸xZQ?B_ th&!tF#(mj#CfNr ټ:? JEoak4z (:1+ Jf)[:-Y2XKhKZd;sX 05aߡ StfM?PFawBh`Ӑș<%AF'*B$ ʲ(P%gt2bH1d4Ө1̆H& Tv(0C4^4`~x?HW_C68LQҶpOf c\n9x\7?D3kl[IF+=Ţ9[IΓTFs-͑(o1`FّQbcUtml0eu6WhsD-hLCSrꝔk`»k,Wk B?2AQtY`MIG!3ؽ;D:mrn, ν M`H'Y!CDWY8'W]^EY  %L"ԆE\94\i儋C6itΦt70nC͸B.S$MPq砱fO< (#N*Z6[,Z]+v?R{ŹxA\֣F6d=Dk^K&4w[lۄ+Mm逽]6+‡ 2vw@aE"?T3tn֤6xb{%c] ;;,T[O\# lCܬvW4E"gw2kE QK,(T9`= h] >Гf'˲l|',4M|f0H1G5eeIz-ڐE,ż )dy"M 5څ{m~DT޺ALJ* m3?l`k,#ih.{w\}ׂء7!$njX\~ɏN}Â*SY\/o𳿟L̽gz o95W ҠԚ4[k5];5(v ( M N7Z ) \NIȚاI*ۡY7,K{ל4$vjIB͙`bzE1(R5#ݪhYtg dJE~Dݾsy 4 ˤ6N"۩5.EҠt CAK" (E`GaA} 1o$P^T@SNɻ3-i(<}%˂a ٜ?yci0A)r)E4MrҫF:X2&ZEcdк^ӵv.G sw=X|ӵUӾI x+MTLaaW'(2D.=}HB!AaPQyfÀX8U,zS4]fK/Uf_ |Cu$wAF/9:0(&$B!`w?!Լ6dz_4~"59b[ؔb%12Iimc 6F=hXqS+ųޣ0|j{: !M͡;.T #ԉ*]L~ wJl,˘]fhvDSز4cZN (ceNkɘ8Al1Dkػ\ӼJ3y(%B죢ޑNp[H˻1-in%Ec=bcq6;xNM@ :7!`5 2y}>it /k`M1v- qS3 lxz~p$Bq cYtQ8g\0'b%g2uJ'}7?+q͔FbuA:J"B:OquB 1 :U~&AsҦ#m2$؂#[!8^I1?z,(aZ1 0,?\qIׯ|˺`ޙ$]E+A΢!u-])[b;~8s&4bvJ;Dd\A +b3F:'E{:̯ztJsW2a3o|Uߎ,$!qIF~ӷΓ1C+`yTsNH!D 5J30З^HϬfoK5]ܸ+MhAKs#nPK0@@2qr@+L6s=B!&A0]QN-fL*2Z9Oh.#Hd Dؿ[/%?Af "Uu#%|V"""Б Az CfM2n3xIjVbu u& hZMffMС*Y5]Qr{r&0<ˌd!6:jyB.""Sy<`/5g4s oO&#0V,;ρH%nHS}0Xg]W~N=` kc ȦقYLF/ cr4%r~"""BțfqpQ79`St ۡb,L>QX ( ID" "" `Ps̢E 8Zda'υ# TLqMVNلm Y%ӯ[`E99y=lBǘ~.LCRG doP@'(dH Q+LR`GG*{QZ쮔]rNq?S09Ml 2XAۛCpZafM#s B8h""rP9De IDATJ! 8<3A$g`;Ny7tbXmqtCލŰ2*Å=-mzGfpgCP3"""~Ry,mܖߵ#lwwǜW!V~հPzY_ >z 0D cD_1""H*o22qr# |{b r8a<˹-CX!WBUȖ9 ]Wc0ȶNJ D!^㫳ă#0 x$̱L +nV,PxqL2}\CZ""><b OLwAH7wd@.θmAq6EDDN "">JLtEɹ&m*.k\Վ0:C"Hrz/>$7ɧ#0e[J""ro&r}%; F:uP+p^*Bu-,:V^<$kI vgՂzFpRPZF.mؿ'u#L=ӅG[}U᡿e[`ᇊGADDDN6 "">ILz?VǞ[bREN߷<`yئGZ¶੯eh lkTF<!"30T5x`aXy`1<ƨ, `Ynay Pn۴Ŷf*`X=)N={u}rpP봧cs1XFwOvj.g-۷؞'hG{i v ƫl΃9jAmft*ޗ-m;z#˽m6dT}l]Fw!2kN!_|y:>cq|?~rq~iuCÑT_2 =YںQ&I1<`1#6y~`;Ԩ{-T *Qjp` P_<@7c]K. 96zbqȖENP R2韹d2!\'a]rјG:m0=\ +3劏g y Žf "Q̐(H AK晴J1W׽夳s9iÂ%.Zvi8V@DԢ]")L/ yXǖ͇66.>yk5^yKk|˰uq~?q5u3F(q n<"̥̿WQ͍ႋӸ. !"""r:RȐf.σ|M,~^;'2op| jwcvN@ɺlbn8̲cM*lDQӄL""""' )kn2c ,0>ey 2H%3<QLgYY1a`ȣᢷ63G(1wAD T׸#T/:#G6cpqv_7Da2|0eIv88q!7pjN ;kIU_g y`NddGhxB\DyUC]saˮ}!H֡^iL>wy̿)Z3u6SG.DDDvu? 29Co}^CUgfm# (Kѝ*#tN-4\+ I1V_s+=fûWQ><\!#v(/$ƴB|YTS+A3~nV+6{{L{&Ö+xCoHů}wcu]nʜ8'w ]N*ׅY 1nϣ9ؚ῿ɚ=qБ"3 3'_h9eL6x49>媳TYN,&S[l|r(""""' .œ:}+0IbI0@GG`UBdP+V'iZNegL99eIs&Sy-opy~EW^,nA αhS,lDeҜ ;#N֘Eg[b"ٵ+ɝ?h }~"""""CG2|1(g[ZF| 7dY;b,ƪ:4Ň!5<L7gɖa86vcd!p8`rM&""""' 9uAnrNaһfFo#6sLwgȉPumf9HRҺQ9sYRw'>+'RӺ >: ?Qe6Jz ;8X|v30DDDDġ1"rxoًW?}w k%'m˿_~zek2[i k%"rbӑrLi1cUꪜ2;vƥNu>[^.Y``")-)֓0A5xFlO 6Ɂ~  *z ~vϧebqTσt|ԞDtlaQn:{#«,kb8#ԕc]Tz39]3G`݄iU OIw^I" Ԙ{POn|V6W gxnRLc+<6nsl5(/@A^ȧxin@Lb9{SIrv0WMP u6N“caY/lUo*q],ZtL|qvdCb\?cj/"R2 >l\@0vM ̐0Dım~ #QFLR]L^MG#VxqNkpAw\"ة0@),c'`=kwNaw 7_Ϊ~A*; YYe2\WB,(qD279@l6G}Vei!H嶺Ǫoe+Wޛ料&`]8nm^#7)0KnD l] *iXxGGXgp?p7C!C{[xd2iX7`e꫘n9;|Xm{$ĥgJ]u9lh9{k&l r8Cy5RW]Dd2#wm-vJ2#kys,{)zۜey#3c%6W`Bb <_>v3ݟ3~Tc.vʆwsO"\}0FJDg?z.YĔ):;F8wi۾C$FEvn/p壕kjp Î-pg:wt2efq,@ h}c3r.Ws AlT hq6{G'kxL!4h^t&W#O,^ڋ IոiuxMHۊ:fus`vS 4L.> ` uW2i2UבaȋI|>ilϩg7L߮z74|l&Ŧu9oY ሎdMdH2e34hS P8pPEIhq.K.*cߦҦ"`j,"RZ >[p 28yDVd0!\gG{6@:K̪KaO+ 30,W%0N ^E0ܚPpGLŴb ӱ# 3k~UX]I]:nRH=yìus9>jLj f-ӗB6ڌP߸gn;vcg!=2ѳpJrd #eB<1cTTqLPcҔݻƎO0v|2+wDDDD8y@Oo Lw^뤪^e 8T%c}9x45'7o{O@DDDDMRvd)g^xj3LooP<Ƀ \n}ɑ[@VSf=3h\ڶtړ<ٔa98T&BkQorHWGlszb>gӝ, -niSqWq YR Oz^ƛ ]NvXd_d.0zwe{bM4~N&[I9:Odvb<~y7 1q'9(d+ 3B==kvś Sqe#tcY/)6k seO;YIjil u&/ϒ0L v 0wI$r2x0ݱ4s!ce1cCi1[щQb962#$]S55,d(P(2q8y N|_u5\ί?a[[AԎs .8Ii4,w$Gޫfz rj Spo u蓮p?/tao&@)uEDJBvz|!G>Qq6k*}|:y3@eK|lbml`nzw~'ϋs`cBor5ԳfU\f_ts>w5ۧAìO3mFz1ki:g;G2xbgp'@-CfyW+nfj?푒w[;]Wf^CKo0El4n^O%\s=#uԃ^ Sr-v1!^H㬝'*'2p,ﻊ!}Tc"" 8NnD~^3͛s#_#g%K>6ehd|Aݿ]۷j3&x0\q}'TV?#=2~Dacf6l<^R,g8d-6X]ƻbLOV|bܛ@bey핔p,XECs|5DOmA V^||g׵JjҩA:ˈ;Ah؍aTr͍)2sbߓ.\E\ymŸIT!td} 'ge> -ԴTb;6̎1T% Ƙ[t춘ڼɴma$SF$Ѥa;-'?E( cLe~5N(o3f ohoP;)*H\ u.3.TZ<'</O6n6zKih #ð) HA - d{xv-Jzz zN|Ǯl`e4Md0c*c@rZ=%1%-K>L}@>APj}v2=1rnz,k8Q&] $b&pnų)AɉZ6:Wy4ԘD2D4`Қ eq~Ѷ?|拉5/% :%y:̭CGq;hq]ug l_q@1[YӸ Cm-=91?;5p .}&OcV~.{YXL꾟>Tyv rs -IzW+?3)(7lu1xCź]n'#v.,r r|''۩ Tp%0x9gϟ \rλK]u99HO@QSd$ Ź'<׿|v ].a HI)dIJ^ Eu1+~|L ncɥny}|p,̄I#zh#!^d(=i̝|$;y[k:/Q!{" 7#ǟFs2DCMv1ў)45O޻2ćiG)N'b į .V +\7Ɗeh+li/ [x0OrTcz3 }]xUQNrcZ<=DNM-ԞDDq\BJ!CDDDDD|!"""""R_)d2DDDDDW """""+ BJ!CDDDDD|!"""""R_)dI_,O=P!""""C!CNhkv uuˬ\^܆S(m/|6uRWSDDDDFK]eO׉mlz'KWm""""2d /"k즼2N&cvo=dUQ2 D[GبH&|k3 %Q]JNhrg`߂A@0e|W !'4WcDJS/yu.%"""""R_)d2DDDDDW """""+ B6VX΃Wj4Ogdl:,uDDDNy "rJsgVB睹XCN3jS7)ړțsD!XCN3jS7)ړțsD!cu=4qޙKoWߨMԞo{۔B@qDzrRMԞDD~2DDDDDW """""+ BJ!CDDDDD|!"""""R_)d2DDDDDW """""+ BJ!CDDDDD|!"""""R_)dRW@N_?ry(W[S8}WvmiYgeFea]0 (^}r}߫_=*۱cwmB͘õW[Zp捖?vp{:H/ۃ/ko.^ݼcnL=ECS=G׆N(t$6W P I)tN,GbvF3i]?c.ZNMM2(/# c,#G6u v-%p+ Ʌ$o$s؛t躍hqXmVDZDe3b\xV|r\iA8 v6:aPHJ !PBHJiYRױk] aЮ=ˆWUaw>a$%Wyٕd!{+]uݕF:zy$+& -w݁>X>8<6$jn*ե UG++s}xdfV^Dvf2d`LJ5K7N&:udl1WJ;> qOt#EsK,K%ŴmbŴld몤`KWI97~"8t5[l?MGFg %/ yQ 뻐WKv/uD;E1u} u)'86GEq$RҥF"C)cϮeXuE!+*Og&B ̚-VePY؅Ke~/ѵ ~as Dq:;$;.$IYAci(<'289H$m蛾Sd `::iPMy,?y[^K#_KZ*kw}}>þTzsLTio+ :}qnC0D@8iGR'czpZ$&ú\zJTfӳ{WQA8 pcz:E > )1 LlxTeljI|8pFI̓ ҹk{r8D)nO ^MDyk_y ۓ%͡n6y--Kx{AI:$4ajQ?/s~+Oڱu<حb 5FϬb6Ud3ˬe65^'o<4F`݉ ;P76+.Qt#I4k$b@1JH$+ @1")*na*c!AQ߇_/{7@VJ4k,W^I=yd Ѽ/ľ7MKnLL<}mi{wY3 Czm^:;Y| \0BqtyzXv9{l91KYY/fٻ$o#6 Sǥku<`yTwFڇ]9l {i=ǰZ _9A#2|yU27͔omwqH lz$X4!`'mrk}i6="*p١(c(FȎ+mB!p_754#h`޴I4mh9Cvqy$ -dDZK{`%>IFS!)˙ddAی%$g ;XAƧr9ORUrm&LbBDWQN[G\*Oɓlxyz8pDh\sn: ̩Vzr[0܁ /weht~ߧ6ʧ4־mo|tn~jrvO8w߫{ۻm}w?~vq\l^]S<"2i`+V'"8\Fι=FA^ '}O 6F|s ?TԂѸ\烺sQp{yѻ}BP`u;`%#2t 5'ȣGP[-S[s82#2ӝ71ry2 DW밉s oGmY(Ko&Miy܅XA8~ݑX]Ͽ8zk8cēa45Lj[sJbZ p<y2AN ga̒SO`MNo {&4e2EhAũSAASx!p۶}[IkFΝ (ܾfE!MfeV[7maMv'i%%lۚOCLl,gt(KAAӒ2nL -Է+.8G7S)S1u"6,j"I\4lbL&IrK)|$xh$e9]~)Xǀn]qEv9*AAB WSSgļ!z~/C0$ q%WQfw`=\qEtػbY琙{}6OqtJ䤯 LN;y(ؚ]krywܹȫWb4:0AA8݈ C8t]'0e ~9|ӨQ--*F}yk}˟n&nmSZb}ARZ޽pD8q{h:ޏ>B rC~Y >MUٺy+<(!CQz&gIz~fy&Bv 6(5AA2nȳX,:sf"j0oʙ#G( de~aD6]scĉф= 9NCMeNqQ~ =-'M֠$&I(%^| /-=Cl1cT6@"IôS?#:&8aA~)+9=zm׶i?d\B3ewAgбK}i̩ә>yjӲ$I9oj5ʞ IDAT[lXy_hApuэ*QUr6*qW^8A50e:Jf[|oAנ .<3G 2*HyM~]sgn- J8 0aMZuk b6 LFڵmCrj~ym\S1E*]u/]p y̙1y>DZM 6([Ǻ5k/Z](mۂGxzrleMׇ޽Hox3`s ]{<׮]vB!r_~9[7mC"ApYVRZ UUԵ e.'L&tf65w`$A{rɕ59|宥&o=JZf5v$dH.'Vil q#zq1kVaJk]1\f3HLL`4br>6r jI)2u%%fB:@sAN.O%xAp%IzHzъ4ng<Κfe,(gۍQ}u.. .?v vcz7%PڡdfWUUV_P &K2)%#Iu_S0~MӉpFC)iH)Ir+htTΘ÷'c/h2tF1AV5t bcohDty br2۷˳"/\&pCu*ONPdh,˱9 D! NfX0CٝɅ?\c"cRwe RЀ,:.,W`AX,B`cn7 {2.ݻroR"冦u~6ouuh;wMh_KK |=rZ+"fѧ✜n t]GqFDp\ANn$vPVRƄwc횵aڴn%W]N9(Lqa13~ƌmqW^%l_~1_rxc;ϪX.ߣo#6{k}TUp0iv; LNK/&:&zϵrr~ TU Qhuuo t"N9&Su 7ث'sg&19/)ݺ5kfa6oM[@!deo`4 IZQj^!lfz0 #Ō C.Ǎ}h[Lzi!N~1o\$ 7:pOUe%;u`3Hmz̏ \"N9ue0 Dil9z=9cd$ӑc`DFF2ښ !iq55dM}m[gfRi@DRdbbchUUn7qd*6z&SVTLђ%)cH5xx)Ho,5 K:Fg4DP</JK+iJHOcкf7۸q,ķh6uDop H3P |6x)PRv-1hQ> ?@0ưW_6Լ 赵7C{6=%(ȑ_|V]^Qn7mA3fS_WGey.Bc>4<%{hf#V1GpzAprkj~y-f3]{t=?k\y%GGHhBwIjl O}%HA CT&' 73c6yIKcDlpEE݄zmXnΚ;PXz}Sm'(7\]QfSGx3(+F~ѤSP^!o1r Fq!yk!Nԅn'XCpNh:QCMHPVVs[CdJW\,QvIc4* E>]Yz7ߣ|#K2ۖD :'yxc{N֯]%~Ȩ(nM7i8C(>r9FW@EY9YӼLh2쓾&)9uw܉iptUCo}&[ƶ4x *;w'uV̬L.b"Q;w]l9lHHN;zL$B0`#EaFHT͉`* Jv4o׼y7dNt&7%[14<7^(lVrA엵E*Z-N!!X3[6mfٴ-}5~-6ˮ'~__^YO>4iHqN֔Nu.ܹ#^v w|J;^ӨMyj>A#% ᤓޚCmM `wQ -n4й dd!Ca -5F}[˙#"mt]U4w5ee֌ c]Ȩ(DMu5qT#2 tH4h3n2!mPخ" ȚJ/ 61Z XF` # !%A'n[<ٱԎF7VT7?(uyOƧNlÏx:S}$1ظCQ[S/JqYƾ}>8ޛ$QS]˦ kpFERlwߍ͌?}[A #3+Ҷ]csAApRjNNKLl]ev45@rQ>'ɠTLJCk"WcʊC@_A:̖y>߄ ))zY+IhfA 2A8h.'r82Jxq@EKJab>  (HLs& bF_%Ƃڥe+[[\S_ <(68QbM;vπ~8#]TUTG_?,_!aj5 OϙCTtW>8"-[eyKYX %8ui zl6+]wO? d2ᮨz^/q~еG7Ϟ5`y6rZhRKp,6mH΢xA8݈ C?, >`gkUFzc:k5ED\|-O((;1-#5K~$_G䙔$KIQ%6JlݒB_^E tAr^y{IbsȀK' e9.;vï>Qb ꮾ2R9v g11CUUttdIb48# "+Qu7Ъғ Nz[|hjW'n'5ZՏ; jfԕi *u*%>E8N._ j #bSIRR"<8]oc4pF(Lb"RQ^κul@dT$uuF:. vuӝ7&' 5;m~v-p0)Põnh[1(R=pǣ]GA#كWtܳh@OM@ ?^Sd:Z̃ҙhۢlFԩ3W'ɪuHGw8@Nt! !R`hpH"&.TlraP G3l2O?hX:: #::YY&]}lvvF v⏸^ :@ȷp;rDV}QF%dI ,`4"TYǿO ]{F:DWK8ɩqҩٲ'x]zǢ @jJScbP78=Vl&.>Cu4DFEpGVpqĤTS>?(S Ɯ}?RDǛ%8lXźuo3iw$$awWn{Br> y))*!n#%5;6 瘿e+4CI)>8iQ GlmfUuWBק U< e6?/щ* i}>alݼ7^yUx h$.9Am%&&)x"GDUUާDq*SU]An6/4U-H>Tp*=Wd,3C{t$H93Ldl4mķ:+VHJa0k`&δ)jzTPd'^BOʼx'NÜ;$]&]r!+-g\ 1O࣏Ĭ2]GGQ$AC;t$@]MC:Kr4` /^n1-GK Bs6Nt3f3d~`KX|+J M/{9ݻ|EC`,~h±nZ^3pw+WɄiHl3?h KºTW^ow&5~6)בodLq8dG2O&&S41}=g'§Ao~VmYD']gIDXSEYDE7+)q diO?oJK}~?k[%o'|DeglƋ/HTVUfBzc*/Ǯigp(LEy9eeGY^p.Ǝ9}G#KU]B z|ZrvN c/ڇ/L7b^uRAo2$rfn;4`lVT+FO'|̴Z7uHNgcSI ^#!&~S!vtvtJw$etUrRWW Ʀ. c;%1إK4lp1=?͙Um\.PU@Ud ]:'cE*8i6!bP6Z.BZ2AdБ%d`Dn`]`0]b=#@`3]H35W0CGX—l9wʲ\M1H} 90tmͧb0k(mvdAיTr}w0+hbdYkZ-nlۚ|O2?x=& & \+/{bNHDz!ŀPbƿ6K6~dص YKD-miۮmV+Q&+0hz<&pZ4 ]:cJԂ-‡鱗Uհ;(eea=A«VH @#\95T=/ckal7!v`޼ں:~Z3[v9+DbawhO>El\,E; qΚExɯxxci)Im2pgo1#fM|cg1my୓aVY7Hzg~AVJ\*WXIeJ!FI2ha+v1^yCy{+nl. MBҙ&J+D *Tt66۟}w_A1,¡0Eh$&VL(M>tA86W_F eO3yo;ȿ^E{A~O<<|1E L,;6__y=zpWGꮿЯKヌ9(];&zs/s ygZ,}ï?h "tnw/>r.:GOؗifB̓ IDATmI[ۣ$1OH4ik|L/5r*W:$i꟰z#H~X[)i_f({vַ}#Y 滈NnJii<4 Tɩ\ok_XJ#]<ˋ\&;=>C )dRZZEe<^zDWIO2ip`>,d]בe`@1JuTU۽rӍ{{$|?kJ?/X̳?x `C _IoO`kRfYVmHu5&Ú}z*I|elf^E̥/cP :f_"_.Z6z8,{ݰGձ=?'n8Y׿˚0 %݊Wq& gGLУ@@ Jb林5!kz># {A|@jңWORnҋZ=A2#"a#n߱yhq?JΝ׬\-[d9`>k7nϾb[J*~9 2( 8NdOgW'IhtŀbQ=:ID~dglБt}k{E! `/MV9N=nlvA~o/dQX:@%R+EOBbJintp4t 10AץT`(f3JHGeP"z ̝+{p9 HJIs6l|gϦAApR0Le XgV/_ɤϿr4BQd,f3zI OxjIHL &.ZJdyc֬Gk+uGF"b45v fe{z:rL4ipb2 v0"!,*w7OD!ׇpI'l0ƍ1B?M;]џHm'WܼkR; {LClI5i-IPPAvPDUMu }!EE{0?/jRYQy'Jl իX,' D!SSӃ3f.؎C6((Ç!СX2c9`3D\l i1єջ9>rɕF屪`;1_x!cp1;`z(H`{j8 QWWz?IʟZ._P6T,RအYoP׎Dװֱ<@מb[D91Y b߰c'-+WN5kOQo2Jվ$i+qe>:#bbc:bx, ~]z {20]YR @csm;oչTUV`4*i * 1܍zkK&= .]y8ǿC#ҿm:muy|>$ለG$V#"BNYy?ڰ9y=fT m23fԷN|gƼmXҹ+uJ8p>yMfUL^TUELl _o EFg^BNNB[Sy91nwc]M`v=ơxѡEh&̅_(ܷ/0"WV5 v= "{{'wl`KfFWu?d3>iL.ds%2-ʉS45%nta^:ɮ&_8EUbPb8lu(8#v+( ̈́Sd/$Y?vfuօ|⶚jFAeLag|2^<`;k0PҐLfu]x+W#ED45˹;H^t>;fsϣtHY}=3~Ehtӧs匡Wdٍ{ͪxjh@r:ڮǓts nlQ^cFBd Q<EcaI`sMRd)֫8lPl!믨Al[RJ2U݇.Xӥˆ3Q7lJo+mVAЦNihw4gZC'P -h'jŇG33ѢPúw_p.!g[Mwu 2 \rg D7R`@St]O™ђbgX@vԾ1Prcq5\^x9T 7/awމof*۶#=0Ƥ$^yвv|޹aWlpߢ74XWԻ7nDۼM 7vKoBBBuuZKEъhx9RtM׿bf 4?B?a;DŽ Tp#j荚%wR_[: *Jbb̘L{$ɇk]E0h) $qVhdcN8#]tHP(D3XdiJeڵ )9)Ɍٱ]׉p:lߎViaC֣;,c6qEq栁U` @I.}"]~lv1MFKTL4)ι_@0+2*Ca/ Ij68mvT6IBXP~V+>w5T/訪bS^ص |9gD:7U|D}GQ m/M!BB B һEEEQX( "Mz;K=l}?» ť33 ̳ss't ۶EV6}PCdONljc lZEcm% 5+  ĞuH|)=mwd6J__^2~RYXvF@mqפR"HbȰ( _9A@^vA@˚DgIFXelBu ёdcKJ%x;Zq7pBeέ[4!U3EH`Я??_||w{A!=y%z/=:uxҏ'H({e~MH$z{z:ժF-8{"+?{A#6#=5kBB}} KI2<<=֫b#sf-?u˘CRHu:h𼚈zG ` {ҤESq!!HvZo;SsbjEgX$v͠Av"H]ե%Ϊ4|W+~qXS P>[Wu"Q1W,G]$Hq.sh,ǥ՛(]ϑzg#;'l *733ĸ>p1cH 0v'ymN7B}&7Qw?@dtC5Z e˖@J0t0c+pTjQ1}уyt{v?pMN,ʔ$;+ 5/<1D"wHLשȆծINGgMAXIJavBE":ʫא\PPLE. եZ8SӰI=mdm0U|ngb: AиK#%ƱȞ 9IqfkRn X\Ͼmfgec?}񼧱߻O̟.y&N8n,;@Ogqcef08?, 4wW~㇏f*r n([Nf{P$|9H\]E" -Ss 悅V<©%ن^D"3y{aUE9d9euHSҐ.KuJ@ #W^Ιe[Ra8WJqk-Q/Tr%(1E֩M Q# yYG>K٨:uң'xq\N$ڕCӽAH,wװs7{[o=%ܰRRS!DџtޅuVD"qܢ([ H?wL6o7fC%Gv\O4nkpFOY2aؚU@}nrq*O2ׇ<]@FMqHn@Q*L;m:Bb%\GйnmsrFe4Q֦-LW+Dg%/(SA8[$.B@ jO,)f^$ ^UQhrӰKkƢԺ`yD3j X'{KqdK3~_;wu+ 8Eh4jJRH?۸wvBSʇkjiTI\J$vZa׎DωV Uj_K=)uKV?d|L2wT ?~XJ5dq[O,H$ܑ;% jCx?uQ~v|]d:rO%CSj[so1ݷ쫃^A=~^ҫ3Q$C; Dst@+y(JJ<>GNF-zAEɻN*d}CE‘cܿ{]K},_墨\-Yt}_ ;+üTZ*s2WϣbiFfci,>h˸e`vu,N"z]x<{v~bXF4l3Rrŧn{۬Ww)DNL2D/Aػs?P( tdi4Z-)z*yyr)YytOgɼ ꢻ%dȒ+84+0{""JN /!Fp 3y9 %br(RpLiek*5 S y %ο֦%/&b"eװ_]K^3`pmub6(j8=!bgܿGp{~>edW1]< E%\ w3 ~t?mDqnjVCK}<{| _hIHU%@"ɺ_'D"H,~W"!)Q+TUEF7bb<=?3Υ©LY,gOӹgcKAo=dܸHڵ0eW2e ~`uԬSaghAC3NI9uk\M .0wl<==6{ϜM޷'oz~̝[;c6L=#ڕkؖ_f7q`l^3f IhߐdHXBPQa)SJ/j޽n 'F>=X<.`HaE"H$]IBl $75R|Z$zIk-[P~ [Qլ֪nt՝,uθ/_Fv|0#⛽ D"qh߈2Ҩi<6{Dv;?q6-ƏA"8b7H*l6OM{:bkԩI [A[ꈝ>'l6b1` K<ҿ_}-΍\5T*}m r|L*`TD"Hg}fZ#bǎLZt3(?NDFJ"ѩ~C;-gx{JEP:ba-̚6O B+TZ%;+#X|7#+1Y|$F{`~w#xK/KMfL@qQ};߽A}.U\um2Ϝ`ǖm 8cYdUJ5iŵ+Wظf={Y|%nҢ~ܺ +(Ga \tM[ b7_{[γ(D"O2 $ U/Y@P+NY"nPhj't_#ՊZl(""Kl|䧥qQT-[lӐ! ye"̩IJA! \])*vP0z IDAT8Moܐ}z>|v''"4Y!Jiڪ`ҶS>z}, +U@`hA(J:tĎ-a"hҼ)^ TRPׇu+0w,CWK0VFnN.CB1p`_LNNaTZ[V ghA2w5m&D)MDdiGl:$^72 "舍kX'ϰid~4|.H$D陓 B@!9V:W].-'7`EErd,~ %pԯW$rJ\:4 El,{l6( 9v-\cؿ{/WTPT1NA^^^~WW*TOTJ899+N IOMl6S;. `2QT4iL훷(IZ5HI~@qZ899RfXV߽GtW@zZq ꑕ ѬUs RJ%""ː @ {.RZ +3,bkT# 0DA\z BZ 3#}VCWzyJןmVͧEks RH$9{BUl\ĥv*UQ/s9![?Bϗ X=8qҴ TmZc)vu !,_NPp0_;H$XY(1o@ё#HF6!<߃}ʒ{ ưQZ,۴$#=sڐd2\d٬V8D:؎)\tqvyt:dC4lw'sF#3x 1"CV-pus;<=p@֏훷ҮSt:n%$;+{qJA|#rsrٿ{/]zuCpZ"C##DD<'fx6bSoKn}ӓ;>uO-"ԽdD"џ(׍EX\hbd+Z' }H","RTʷ஋i\]]iѺ%ۿGO 0XШDW,sb0 kw;qFdf#m7{6PXPH8sn3gLZwlGl?s?,GZf폫A"FSѽo/Wc l^ ??$ v"/7_M*ˑؿg>~%O/Z`;%#-_~GX0铧{X`1eҴe3'sv??m%Z"%_?,UiФndįqqsEgMZ(gӠIcj!}HD"Hoɰ Lmu.$C.PL*PlCG!⍀y·`LP2OfCQ>۰޼Iazn-! ^͠>9*V/ݭ$aW#ٱa˼Jz( w_˨w?a|c&|3M[SXX?.i^/ggaoӲmkFV b|1eY4koA8~vCi^YIz aݎ۹'Ϟ+JoGH8r)[.-w$^Fhٮ#veli+SJe_Iw.Cyz ;bW勗GiLݑ۞ED"H?$f :(TFPc %#Cѿ\!Ci$Ddnʶ} iG ToQ0` ̌g&fO߻G-!֟lߐp > ŔP__n/AR R ___>|o8.nnVR?0Bzu+{3n κ &z55ATjWBTt9ZoJF&3ut&#^^hZGlhx!tVΉ `AT:b"J17ݯ)=;?_"H$׹ ORe"Օ+RN== lܜ8Gz:m6kH.;(Oʮ;b*7"+#hٗG"*&wo^b c¸(,,$*&4MJTL4Q1lݸc>j#*&w1gu+Ws)bqp÷G.MD]]x)/^"*&FÈ!霈\p|n$T* *&S 'ذz#vַ3HLTL4ay5"H$k摔D{xd{ybͮ׺P*%dd*E"ܸ` ՐʜJdǰ-(JΞD"$Jf=wقD"qPDzZs]Yǎ[+MfV#Ph 7';nc xxy&dr& -,($^fǛu"I1oqq1gNج6\Yl%RiɱvGj%1Ξ:M^ ѿd$N'񾋋 vvs%?^V "ʔ>"Ho &fK$\ODq|$R>dggs ,G!FV6wzoɄwlJy$#=65*e92~9q1*V(F#A_Faa"N%ztܓ.oj鏸1vxfNWkXZ3~XJlXo_M ~έ7iܴ 52q ]\̶M[ fG$OEV,7rX{T=FfN'e]E7aƯJ%T]BBB? Z'n |g_6kխC'p_|]H$z$CBL`׶lO6oN)ǩhSS)xs&ܼYS ʙ3X2*!* F=Zuk@3s- =-a11mL$ y%7B20l0*b d9%ln'#-amRfNv6#кC[lV+7j$ "bGlvV᡼ܭ3V|X 9BL+3v/{X23՗d2 ٬̌L+%l#Tʧ?b*wMx2,]H&^y9ۯsNc/({^5(`9w&>~dYU AAxxz>s5BjJ ?[m;HMMCLr >h]DfʸGs5tNЖG@DNv6}-*7FXYY,=kcJ݂Y4mH$d^HK,fm'E "ԏ#84j5ӷo/l7oa\˹s>19Q0C x$3f1I@7{$9ƫ]{c|8e0c4 tǁ5WO`sʦK뎜?s[ր!>HyB&-v*V7u~2#V/_7iQ wn` t76-~:4kCjJ*K/O>u{m0;Q$rs}{m#G^jpҲsX̛1NCݯ͆m^r-۳rrs󐅅b&q^Տ{w]&}IIL&rs8~8V`܇9z_d׶?VѼHd^H]{ͰZUT]zvn8V&LFBD"a)ŘiB&Eup~VEHd >{0g.;^d4ѼuKAsj>[6nIS(W>okvZwhPDqvq)eL9c+ӽOO:l@.HOs{z0m̛9{V:ڷqv՝;nӹe{}}b1SDzZPQGlWp:lO`pSؑCF \58p% 㒈v;>}0Ûo#fZ E&__Tnn;w뱣\cv*+,OlQ& 6>,.|JtH… 'D?…|7KZ-5qivmAF H~K.}TR (Y/в]kBÐH$68 bJc0t-$}N'Z6MvvrsrDGc\\Nێ09H ) 0'nS*x X-V2)2%˖ B9 RJԨ] bHjdgeaXZ:N:'J%k@*rECCCNV6 PN-F#n5֨h"=5R*AA~7u#/'ootTK^n.Y$ (cqд:Q4ySj,ڧKTL4^^m6j!08^^VJzZ:BW RiɍIͺ{Q4PlsrfCV?2G`"(2ST9nnj#_G޷ݻyJݺgcܺ$cP4{kM._ʍ[(^dc7ox:Gn~Ly-%}r+WAq0ݷx"MxJΜǟER9ڴX0Xu&?HFz[%?/)_N&90U۶H<HV-ݏ7 }:$fvm݁b!4Tƍ(ȞX/^B^"ݻjEU{znTY3/(8; yT\B:'J.A@GޓIeH$t΄ YDǎRz~~ MKym,k`/-Mn6U*=VՕ wYY(U*v;idli ;l#t)w~Zuks G ۲uk/9_" wq^ ى ?B 5m&LBF5~4vPȱ ?W3a|$j[C6/c 0,6b[#8ym_nGѧSO&|7o0`BXq5{ tՍ.1WЏo|'0e"Yvv" *-ڶfhsg ? +2clzT(arV.YΌ)Gab[aZPk4h4'X-V <7/7Ww7vM _^6 qus}d~[????:KHKb"ݨQmǸr%7vF|)`0祆pǎ22ݹ;/oE"|.&шbȈDCG#Ѳ{R)HKé[Dh8#CJ`Ƃ9ز9QXPȪe?>gI~E| _ŇO2J5+#~71^p\L.uk1x(*tNݾA7D"/>b1Rh5l_24CnYHR\\]b$VKIFփ;pvqfLRdJn^jTc]\\P"@&+kf9lV4 FDҼ2rFlhZdr#͍`18_w6zL1<1ımnX07w'n;b/mN7B>1iBCYa 8cד=_b׳ufOhΞ:^o>E5'232)2=5l6?9Y9:1?/bYُ,[r<<=F +})ZˁHCBWF\.ü{k`6[X,_T׵ΝI:|?c66?_4=z  Kl߼ l6xXJɄ=.s."<圫T*Ο=ǵW(..FVSRG@D3/(7U$z]8w/kAGA"Q4`hZG3 v;P+RREvmɦ:9Q:> xdg0~dr9UkVg󺍬Y3A5c1 6ǚ+1L8;b||q=ƠThԴ K-b1ꊓN =tJEzq̛1Ղ ̉c ۵G9_AD"J;} `|X,(W#+,SԨZD0TKb~އ2l܀į!0s;- \oӦUkT|ʥOD;OF5<Rew{a!_>xrEJyDWO>ޝF#ljծH>|lD/47T$z٬6T嫐Iy=¹󄆇Ѫ}4D k֣Vе׬嫔)I&vԊMaA![7mYG IDATŅln&$Byժ̩ר)޾O^͜f{R|4sgK$ݸ=qswk)SvMBX4d-s9>=S(((N xxlZiűG9p̦r=N kRV,*;iQxrbz֪mNNN8)%BϾmR ڶQnqb*{SrR=84"`G>>ȴڇ w׮I)ܻ{wGsJwK27a1 '}zJ8? aƔ,C6-嫤Hh4^rUFygX gWhA?5jԂ_jjzcr0ixDenf>wk[V6moȖ;iӸF@qR.`eZ0k6oG7y2ym24ԫTؤ+#\ιϹ"ߌntlҕ6O2DfcpgcZm|滼@7|$VJ>4N߽lJ$ 3NӃ!IfF&C^gS&[-][wnX 7&<1ZWp6ٲ'̅%O2&~9UkT+IHN=Y~%['Oo?j 5nt"Cb麕ܹuϾOF|ݻЪ]kLUqϻ 8GB-zo,wFDdi|ODEtuAYܹfΒ}r$f BQ1n=~JʔX'MDe!;E"$C$z޾qYiL.o&fJ&՘dzW @xNNL>21ԪW~LMv5<%vF> 4f4ޝ4ϗ2~Xn\N-joG?҅4'$,-vw.;U6O>GhOeX~#z4:J\_O`m|7K˟5\{sZEMIe$̥Q]4Mal$?@j,FU_Tm_@*v#!]D/ 1^pT$,_?$Vi.[}j#2* A.Y, O!4@rfJGFR(]ׇ$';?xb*PXHL h4jCC [JED%z5t:xsp 戭\ AԎ+᡼=rF#:99TRM-_9D" L/Ѩ -+ww3>>xTY4 _t:ge"BDf^p>> oEZnh|jׯK&HJLy Z?J;nG"%f3 fͣIP"W/_%+xe@?n܌IK&02k tlG*\8{klX 4"7'o'MkVʙ8p.zJBBChؤLl 臧^O‘c;}]JnV,^F4l҈LW7W?Hvfm:y \5Mq#WɳႈD@tM&wiOZV*+D_ w= nVtJn+dgesm~ZTʍ lc*[+%$ޛt&HyևYرPP^PDbA JRHfݽw~lnz @dsg̙ݙ3`?-r蟃|Sv܅5(,ǕCJr2GdwnAXxR(9r8YIDd$Gk.R&s$6#Go CdggdYܜN⛯oGy{v޳젆5[CA N pØ/’SϼbfْOѳʤ&o玻& ż9/Ko9sYMwo P423Y85j׮_aOe 1]9{ Wx`4_SgMpk4mޔ[0xಫ/{ϋxx,m۷fҍqH2Z5d'K|,zd8 P-lSla[yV?FQ<躎dB4R=Tz)gxw@yq-O?V8oP¹ ,|Uf=nhv퍬k‹̛={~>_o~]p;}zYxe\9_l'.[&d(h vO>EoO K-k;?d}7n\9>cQM7GNV.8sQASLί6ТI#N&4KFOY'sexp:|I7M$((qW\ƷVoSA"eͷc ),,dM şpޫ4jiMܭ+YYLi"6v233iҬ)tv;I3馉DEG3{xu|rsrhѪ%-Z^Ի'{ͤ&RV-n6f|FmߠOw>f\9愎|EAr'Cj8Q\ءz}mL&Dxx84mތ޽PJQXP@Pp0l6ϾjۚnuhzM-Exx8CFrq!ڟׁ:OjJ !1RD0H>:Ңu+ӎw`8dN\]AcKs$6H$+=5V dҎM{[992- $4¨D2N=AAq2Ӻ]~',Tg(Xz vf葤0ܶӦ\]zd1$9;ϸ㑧P "22OW~w1QWygxAiזeV2f(7~+#njɾj9 c Ō:C2;ӿOvWyGa Xqz" B!5~ӶzA iסh6ϭ&Ex#aXtd6C?̔{Cud{7 r9٧ZAbd [ADEGoeОm3/vړsOΤYОӤYSyIhۡ=i))}~m;m,k֯YGOHiۡ=bKd?]ͿN퉩Ãw݇bmٽw]ضʴN%""ڳ}6'ko޿iۡ=&VZО7Kd_y$Nm4jtFA2 AݽF-/lfٸn=N zu4MÞ>/c˯"8$VVt84N-Ԕ ۯcZp:p\>Y[,PԪן}bc[nt ^~D \_gm.h>`1&;-ad].YoBA!#PIKMKnt;֮ d6az [od˦?ٰv=t^nx3N kcZ n֮E=hݮ ֮gϮxaz""#wſذv=֮π~4mތ ks`?LlXup>!#X kדr4i$6]Ob 6';jܥԪS kדɔ柿azhN}}]}alXvn PFOV~ȵnV]߼iVU8h^!YR*ibxZ. "  5%(BBB((( '+4,BhRCpp0v<ƹwed2a[AAA};Fefd`XDwHKMv:XlvjqfLxD.TaZQXXHڵH?vPq:;Fzqfrsru1#<<а0uY|RjC~[ m,_%_ rYYSA8q-a+z2!g 짟@unF~qY{K^dޜl\wٿuV}#]{/z7^Y@FzWϖy}ON|G2fHڹ ϗ|S>r,qxwspQ';?ױkN.92畹j P q2b1pޱӭ@ӭ  ŐݥAAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZ'CAAjE AAAq2AAAVAAZTFw>'[CʔPH)O 'FԬ䓭p!eJnL Չ'ARN  pHɼt ''+?'C8/'7/GV%"# ~+T̙f3M_Af"Np֒o'-3f[ ({(4  ܟJ~rcٙ;q sLWSǏ?D$&\ӭp K g-ٹ4ߌt00 @)膁QR S 0^@auRx t :"F M7ڱ;a|SoMenږ|wU)q2FTx4:.^P \JC xO+ LP*0n؈XlvP1gM4}\$99Y-.͛ -)!3#?u?1I$ܜ\ƌÚ K|b&]Yr7+=ݪ8Y PXwݛ< !C膻c0tnXO5#k:|:Su[pq4my{ml?`#%ASV}:uRl?`t?y(qeT~g\$-5~Yn=.1QPP{z㏖gzxgyg_0 .ҋ%}R^@|||$ 4kތZg{t_gP!9?fE{ҳ[oo\_5W]׵wMwͅo10IwaϷVRU?Ⱨ嗟Aw8Nߍtv^ tnq"uI};祓Zp,q skRh 4R7 ?ٍbab v-b<5R|,GCĜm23 (|yxjW[ӟ9RHje 4H^ I!BJEJ sep#=Id9;ZŚiY?~Dr~0L&mZY}۝Ô;uqߕ'coXKxdJgwFʠ DFFP?/I#ehCdhFEV-kT&M”&,|I=|@Mytcw X:/<礥,={iۮ-tU/>~GzzW8x m۵a\q[LaY-׭e}w?omwzY;aF$$ӢU 6mLn]ݷ?ZØqv/tڅ?0v1֯ IDATf*HJjaȡ<7tBNvcǏaú q$>#BCCʍg tڙZ_?)O|}{}vsMjӊƍ{lgI:‹/ϡql߶yT4Mykצy>"## ٯiLE+˾Zζ{8&88褧*z }WYݺ0x`1.e1jO~w_{zj&2!2t_a^ G+aCxaNRt\ 4C<]h΋F3RVܽxzg==ĆaP+y_es4'2SFZpW H b롺,5I;բ^uRWE_b d4tlÈPclvu/9 yk&~8&ͤM+oN=xؚZ}1_7 ͩu!ڌf{;\~/NNRbZ>r8G=gֳ`ٷ_4zts.hO?yʍl2WnӚw'c̸1<~IKM]k1.;];w1;J}>88ӉaLR +\7F\g_H:Ē>pPNms'屇'-56Lc1fZ|s]Es]Ub]OnL>j? e@z>YJ1 羹;(ܗWDS?-4psҽ޵d/ru\lݟK_dQrۈ<$ ZL r=2У;GE8je֒tv BT L+d֒tv9*-MDZ,g LJ_c?eC2(Ug#((W] t""2xz{ zɻGysQl}3B3];wѺMJWUy7w998].bbb0>߰aC#ꋯHIN8?>;w ';ԑEAAWe|[FXX `S]DZ됻jy]_2*)ccz+P1U-WeaG3B+VFݨ~8^؋"l -Cqjw_˥yѴR ]/a1^\ݙ(å|2naaL[ɬg)PY,l6Oȃ>DEpp0?];v1[<La>z)KM RS ↛o V,O{HC4m~g kTf<||yf>o=w37gz}{ӻo4a#1lİ ۿ})q_ƝwO ̢FtY2AC>{hW7_ϝϾ}}jӽ:~Qw_=ڻoۮ '_|RI:uNdg-üP4S wΝSW9$~/#0̂HpbF`ZY!X#ʡԱfZ'u~ A7 cѤlp_<Xg]ט+J{*\lx";,Y _Σ㣥h٪e@c iԯ3y+vem|;QQ߼9nӚYƖg[n<ܓ###뉎{JwbyyDp7/G^EK,Idd$aEbb*6="-[&eL*n/܎FϤpxF-,2Q|I)H+;d !?}<^{sI+p&`/ѴddnuJХm7 U~.LxX4 {a8RC ՝sö!SVf>#ꅃ]s{v=Tr>| \80`8q0*[RS8xL&6>W|O?bxԩ[\AvV6))< ѻp-35Mgٶu[:8p:׭b޽\{|=**:|_s7-7܂lfU)ݕiCe%$f` R~cF iEs4MáQPh;iePyF2 Nv!0y*+gN .{z[MOMOg#9!aX/'3'=knZz{q2eUn؜b?G"*kSY'$M)1@#DyyPX̦WnpQ (VSߝB_"T`dUW& 9bN*eb2JT6eiRزC :atr_/z=|_5Qp:Br̄L<ȳ_y~%Á0o{ҥF3p8 i۝0Bif 8v_!dԎTDRe}Axx&̈́7"Хk+l6tօ-na/B+nO޼.vN]}Hl6+hjծU8+kP7v(xheapff:ieP:{~DYߝB|1lvX8nMSUb(l2y |%&4 1}q0g6Uܱu;"#YK=fp39uR;_cU.7}loLAZ. |ƀ'MP"L AdG%=^ƌOzN&thmƐ'++ JBB|9-3FLIQJ`b\P@f L*}+4)/QQ%g#5%qEfM8x ,Lq:wRqy~v ٰi]\+WVoYT֦& uKm~oKH4`\=; :iePHMwQ6,uK:n'y,(pQZC&a2=H]65U)4ϔoX51AL{=vpOn|rܬ |)]f 0^pU1{=i R[&(:7+(aӺav}aN{=| /i 6Z':1M' *^jNɻ(]'ªJD);uq(=ӣ,pJodӨQ#>߽z:uФI4iRmU3B)r@a(>^s5 4O>aÆ$&&dR-˶UMWY=QWgZHpRtzqCxtfw}'i9vgUtn% <»4BG42Rxpk|:VU_DHh}p^U㋎2Bq8]9GX;)\[ݜ|zI tP28"5hS?_t(6Cv6BBC1M' *]'),zn ?w+A'{fcٽTAA8ݔ\Vg}֭[qFFW_ C3g&LV̞noQ44HFyk2͛ݻtv~G, zbԨQ'Loi=teyuՋdg-J) ex\Tk̮9!6bC!23J w5[bLĆɔRKl =VV_5Bxcda%Msl"< 61ki !&‚5lڝEDP.WskTe+TLU`\UD4X#+6`޶.PEbmAhPaZ00J#z~:TqL$:sTױθ9[Ϟ ָ{Rsiw:\k[2[E FY e˖1zh/^̸q|oڵk;v,ݻw'!!^{ +W䪫bŝ EKGy)kw8)C믿iݻwg͚5% ʕfjmuUIWY=QWgZ!(8tqہ)HZ7uz Z|K8m8YLathYlFnB74DPFlFLFhd {V٧jH4MmhR\EfP٤ ӈWZXðXe)GGg/-ZE!Rd1U=={ruV4!Cpe˖j0L8  4m5@}&}i+Vi&ڴinرcL>/Ұ`j)jMo)MLLӧff̘?nn`Νf6nȇ~X-i*Loiׯ_8q"پ]ʲmuؼ:\'#7?"e]"#N*g#6#8*L陦 mT͕ĨQHMMN:̚5F9r111<4iҤMYZ _f9s8S՚Rl[QJvIDAT}NOO/նaL2 JV^Ѵ۫%eѴas6mHzDլFS^~))twLW3ͦgp`(B;VK)%ThѢ;w,qnݺlݺ:VfPF7TQ}`&+`3~{Tgz˲my*~nFYWgZdԏk$C#%&5 tjߕC[֥S$M];*L陦 )8]&Q?Ar5jfsRڨ t.!>+a6뾨'`Cuܱ2v:U3@? qI_` LW3ͦgP1 ;7Cy@5}dr\{JȖ\?>ڻDMO+[δz p2`ӥ}w~۾HHp(  B9ġtiߝrk~CԌ(ۀd2%k ՙsɶ^|NFik0ѷvƚWt9AA*jR?};p0J[aB#4$BP4h[1&TY a(0i!5:P=l(k wDݏSmAAKik4, !Aad؎MLDi԰tVaԍGÎ-^c ՘sȶ Y! p(ol!"40ӏp yiԴt.hљmYa8u/a!aMOO'N]5m9CAQ MӰh&,`"F21B)|PM0i&kpZz{߲֟CAP OVTRb [Y! p?ӭ T;W~AA,0ϥԋSTAAA8~R2ϋKd=v>*eлGR"yxꐼ>uH^:$O5%8(&Cj{9*yt:p%94 Ŋjr037b-"âW;Z'Sy}*)M3q2A~R)(,b6l j|En\?GJ-h٨> WoCTu+Ҟ+_mRkPeġT}4ye_~C'y-y-y-y}RLQ8]!xd/\rb6Z j1/?x}宛LW%+$8㉼ M܇Jp*gKL$4%*" 0*|oފQU*, CiJ_CeՕ M7Њ*uOP[{ Tac0P^ԀȫF7No~{굷N(7HZIk!BѧB'rBXpfʯo+naCUϦ=\Ji>{{pWT1ܕ2 }Qyk??rE=he;vym4x.H6 eiT,BÞCeϝ>*8C6N q1SJVs ׍(Q X1A@eĨG4놧UFU`=_F|Riyg I)a(e v}U޹(O 4&R"yo~8w~s<) axz5z5z%t%wQ@* 4UӧiQ '5I^K^K^K^W{^ G ANC^c6Z~U Ʃ"y%+oX/~_o*OYt{0)etݭWy(yX$ z254(zkZqS^]=-gƯbqGMin@>>T.W'{*q2A8a ]b?( oyz 0G=4EeUJ#nzS썠>xF:<{&0P+QjX*AO @+R_wrW>yO%Ko)e^}}NQy;L?=)jz(Ob[,_70|.y-y-y-y/Uruֺ! cnGKw8|CɁG^8(+3O,iO>w$ʷhܽrbLIN^|R*/8n=)VJتHxzd5%ES(+-brxU^ÒΞ .ީn뚟a>>9鈓! c(rt;/|U`+beSnWEdx(}ȳ1eʝ`>EH'G阴 (rD|_Xvfr#;1e4z0OQj·xR57]%+zU=e43 OyQ?%%l(9/:kkkoׁB^IV$iRq2A8aD])?R S^7J3JʑHDgGs׸+Ӣ~1چa`2d(ݓ%]S4Q"O+?R*fWWSЌ\)*z'ywQUiNI2^R IH(+E@).~eAzQVxDDi(^)̜{?dB&`!!gȝg}޹<<眂ZKLZKJt2$It v|&Yh 3#|cG+[O>mdfЦMk@>dFVYI?;q )))ԫg>!!!!SZ ~x/l\j|e+ BfV}||| էwgZY bm^xl'?c/is`0@cYǣyhv%+tgx9,NEӡh(UkWjvL?r,M ($96.|VeA% t2<<^z dH$㬀*iL /3Yf)oݺ=I(AbZE/f{ SըklphA&pqXff&7o!;+sgp5z)||S'͕`׻֭l"1GѰgn‰i!rQU0 UITr5]FzMÿh424mքg2qZaF@_TTǽVo͛v2ڒơ䜢~ih&L"L``BHOM?!Lx1 tfacKN|eB䖾Tа-@é'y}Ыa@3B2%,0(fȥFjܛÇ4dFWPlFAt ?HOOa% 8<7o^'$$'N0<PY٢EңW7._y X]JZ~˚UkJ%t2$I)4\JU I*l 6^۸~:QM?YW._lnʄjԬ^] 1CG۫{vȂ0M:`+,j ftpevN 7ԬU]?fЁ|}u4lPTUeul` cع%AUbwΙOyo 9Ƹ&.S'NgAܸ~~/+A+V/zj.VR?@ TUeͪlڸI3ax̊`L8߀EY`B}7 ouxD7nF( v{ ֭嫖Rn<ԼZ˶jm$Q8ǎQTdɌR"B"ͣ m}6999defңgw~ؾ^|S'O^@QUv^ͣg'J^/Í7jW4nҸThH'C"EU }(Žn1菸HU-+~>‡(~&Ofxޣ$^HLzz:Bخe{hΓhwe1>,\Au2p>+QMsԪAs<w8=UB\x{C9 PΣe߾?k2񟍛, EDVLIʗ_AQ]<̈́"FETRkWi=!!dg:?{.DzM_m#x~ xeTUa/ٸa#)i~CutNE0.&^"#=[O8m4jAxD:aش黯3!:-9n*>+ Ik[/DߴO/= B9z/\K4mބ?]M]I]kXGPP]vfD;%ʯ" DRb p|~eoEtZ\r2Nz*իWh:fQ(!A|r ي^N,.:鹀bvi1>4֊A1.*tۛQlۺ.иIB(,B(= SfLM3̜:qڵks`!jթ Vlu ֢ +)+]Ų^Mk ]cxRfF! #2*CGo@_TUžaȡ,]R%˵Foo""ٽGNW N8,C˯FoojԬCѱKcZp%hG0w8|)'C(maaFkWx_<B(K8/8>55| wn϶-HNNCILdHz*B\x'Ozuhp"|2KQf':^EOoWԒ4¹ |vvBQO`C TSUn}Ӻ+W|NfV&B1sN*Xz>¿fɂeܼyEW g1 Yٙp+) ]}YFQYbPQ822 x{{>@vv6mpAO0w<:viF CղqDnaOq[(f4]#ˆlQi~ck|4k 0ٳg d2S4tљ:{qvfV&OWFkIA%ٓ!HJLAtA߼q UUR ?⏗ҹ{'B_30 L:-׮^c;u6:p #0q&OnvkTc`sϳ֕٥+h< N_e'ڵnm?n^1=XC۬{3 P5>6Y?q:/u.2VVZ,k///7dOpף(BuE)p}F1nDzvdeJ9ֺ-Y2z<~^IJbI),7?xzzR%b+B9:X0m n%Sf7hAVf/ݦOn٢nj%'/OΟ@6BC#7,{]Z\~; :fuyfƅjv<@$>ugaX2RR-?@VrȻNq F#k=dee1 dgߵf4_3UfΦZpu.&^vo>'a#wC8HP]u!vRkֶ[GodhMxxxyFٓ!HJmL|هы];rqj\Zb6%Fhu:nt2$IŴqslGvw۱v k؅ Sت@> - u)!vRk=v]',e3Ҹ~ A!UA `jEp!HJ(Rb0 ;c -2ڕu2-)Z|ԺTZ(Nc$^7yYk~jUk)% DRb AUclQN5ԡ|ƶZaHKZ~8xPUNrjAQz-z:._:dH$cRvň1xz1Rboud+diP|ԺZ(=xnÔɜ"t׋ɐT lIS][z' ؿ^ UT%8 T|}JEFfZRk!vi]Y!SiP? VǨRݿV-G: Ay8GOͫNgnڶj'rŒP:ye2m!7IdeZZ\'t؝/,JܝNД6%A ૌH݇}H݇,=uH %Dr?TrCED"H$Dz1-X|IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/editor.html0000664000175000017500000002003013203343735022367 0ustar jomajoma QSSTV: Editor

Editor

The editor can be used for regular image editing and for the creation and editing of template images. Template images are used as overlays. They will be dynamically adapted when you select the template in the TX-window. While in edit mode, you can change all the attributes (such as size, position, colours etc ...). If you save the canvas as an image, the scene will be rendered (i.e. flattened) and become a single image object. If you save the canvas as a template, all objects will be accessible again when loaded.


To create an object, click on the left menu to select the type of object (e.g circle) and then click on the canvas where you want the object positioned. Just click on an item to select it. A outline of the item will be shown by a dashed line. If you hoover over the object you will see the cursor change to a hand-icon (in the middle of the object) to move it, or to a resize-icon if you are on a border.

The attributes (line colour, fill colour, gradients etc ..) that are active in the top menu will be used to create the item. Object have also a z-component, i.e they can be in front our behind another object. This can be changed by right clicking on the item and use the Arrange selection.

editor_1.png
  • Top menu 1
    • Image Size: Select the size of the image: the outline of the image will be shown on the canvas.
      editor_image_size.png
    • Font: drop down box where you can select the text font
    • Font size: text size
    • Bold : bold text
    • Italic: italic text
    • Underline: underlined text
    • Pen width: width of lines in number of pixels
  • Top menu 2
    • Fill: Fill colour drop down menu
    • Line: Line colour drop down menu
    • Gradient: Gradient selection menu
  • Left menu
    • arrow.png
      select/deselect objects
    • fcircle.png
      create filled circle/ellipse
    • frect.png
      create filled rectangle -
      line.png
      create line -
      camera.png
      insert image -
      replay.png
      insert replay image place-holder. When the template will be loaded in the TX-window, this place-holder will replaced by the last received image -
      text.png
      create text. When you select this option a window will pop-up to enter text.
      -
      entertext.png

      You can enter multiple lines of text. Click OK, the window will be hidden and you can click on the canvas to position the text. The text will appear on the canvas. -
      multiline.png

  • Bottom menu
    • Horizontal Shear: shear selected object horizontally
    • Rotate: rotate selected object
  • Right menu
    • Vertical Shear: shear selected object vertically

If you right click on an object then the following pop-up menu will be shown:

  • Arrange
    • Forward - one level forward
    • Backward - one level backward
    • Bring to Front - all the way to the front
    • Sent to Back - all the way to the back
  • Change text - change the text of a text object
  • Expand - object will expand horizontally and vertically to fill the complete canvas
  • Delete - remove selected object from the canvas
  • Lock - lock items so that they can not be moved or resized
  • Unlock - unlock selected items

We need some sort of macro's to enable variable text when transmitting images. The editor uses predefined strings that will be replaced by the "actual content" when the template is processed just before transmission.

Here's an example of the editor using macros and the result in the transmitter.


editor_2.png



transmitdrm.png

Following macro's are supported:
Macro's where the value is defined in the configuration

  • %m - my callsign
  • %q - my QTH
  • %l - my locator
  • %n - my last name
  • %f - my first name

Macro's where the value is entered in the TX-window prior to transmission

  • %c - call of the contacted station
  • %r - RSV (radio-strength-video best is 595) You can also input free text as is sometimes required for contest (e.g. 595#007 or Good Copy)
  • %o - name of the operator of the contacted station
  • %x - comment1
  • %y - comment2
  • %z - comment3

Note: comment 1,2 and 3 can be multi-line.

Macro's where the value is defined by the system

  • %t - time in hours:minutes format
  • %d - date in year/month/day format
  • %v - qsstv_version
  • %s - SNR - only to be used for DRM in the WF Text see also Statusbar
qsstv_9.2.6/qsstv/documentation/manual/manual/editor_1.png0000664000175000017500000013252113203343735022440 0ustar jomajomaPNG  IHDREIsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxwEڀa.a$+IQL'f=00\;O,9cDODF$/a3=3wY[f+U]=5VPQ#%D"H$& >JT+#닪hJȫMJԈ*&l5ډ}euVw`zdW5MRk&\uIMͼ[(aGM~lԙ2DSO8mA izHkj2.W[>_&K?i5W3A֓q]z+/q6o d*Q#H$D"ʠok%H$D"+g2yD"H$Ɂ2jp!H$DOB( ib ̄L  DÓ"aeB >EAEAQ-YJ3W+(H$DJB 0ML@tLH(UQPUrZJš&Bh9V:9!t00 a+r8TTEmBPl0(,E 󲛥K$D"i[ 4L4-N<stPLAA!yys6m̺up840YuC'S\\L#+$ QVVΚ5kظqcr1th, O,}l EXWVכvx=.4eP5r VA4#( >ǃ-e":n@Ћӑ*4UUbq4q8T<et:u4ҲN<s{:[Ν:r;(ݵӁkמ}6oƛ /R(SΡ0S4^={`ߏ{qoo'PpU1x;MQa::ǟ,`3;f$>"h41#x/D3SePME(nQa Dq|^7~׎ "h5>ܜݳK$DK@ x#njBHX-#iS]p܌1?Ʃ84b;j, p9:.Q(r-kqn=;Ϊ]b/;pkqye4]4J|^/<<3!(/+Yl7q8ܙ Xt91Pf]rSN=ڻ'^+l}|^~:ss:̤%/=,7'_y:Gz޺(8baق/]e‚l0Du.<&G BiYyF*jGdSr8vQ»K^'+%p̳8G7plذٷMnND"HZ3)Mz.^4 5WILPMw(fN7nЮ];@B|'zM1njG4[NII ŁLjYJqvD4-H=W =Js>;8nk8a 3~͡*@>Yg=E\D2yM!vX?3Q@ē}wҿ4MTYӛ_67|W&wv/ȷܕizMWTaAXx1Æ Gږ.Sp8iđGжMQ'1iќrd;'PUi7&#O,gK$#/nO$0 ;l0k=FOZ(qm9f1ֻ<"|rD"HZ= i c@MCIҥ 7P +i2"H$'m9 aѫ`V @6fǜ9yʹS*0+K>LzW]Z[+\.Qr:[$-vzbEEQ*APPU?UF01 ˺R珫*ay\yH^.:kB1z4"c-\.^xE^MqܘmvbQ***\XM72?s_qp,{k NӚ擟K8ayuk7" oӥs'6m5kֆnyUU9jh būzt=[oG cQ>7zE4Z]D"H$I';vl'abAkahp:T(5䨪[ȗ_.l]0MrPp9]|>E 4GwmNer-7q9kZ9\ݮf4[D"atC̓q-Curٸgv[up8ȡ{򟧞O?G6FZb<tx.4P| kPgNvCU1 DUZӤ˩NXL'vSk= $0LߓFqR]+I~?m۶{*۶ne͚ՔW5[vu(駟 UZMm+ND"H$MEu80nn:ş3VULCfjN'.e1Mkaj!]vAQK$'EU@(]]Z\#O䎶Ud ^F;]T(.nؚE@Ue@M4-:ΖiɽX\G-߷[I$D"i\.qMЭ~alيCUx=AL!Gc>BI,?cq&Lq$NhQ.Ȯ`'fbrkbkEQ@um?+|8N{rC躞TD"H$ɁNRshN,#  zQ!L(*Bx\Ԟ3uM!4X4FNN6`cU8U*+p{ܸN%bMӈDb s8S#K54U.>Z yQZ3CuݰG'H$DK$Ĺ\Nh +ӉJXלּ՗uk)Ef;.f(uM54MC\UUPT. e-gMZ0H$D"amp8x<$\_֘AnZf.=Zu3.vv ڜ0Lbhuf,"H$DKHGA>`hD"H$H$D"i8^z}]D"H$^6L"H$DKD*D"H$J$D"R"(H$DJD"H$I+e+eXrOܹћ4K$D"#%/z}9'i1J1d%JD}U5D"H$=of>RFX޽xyw+nە;v)SH+m^o,[G}F>D"H$f+'M;nI sZ&O{j!n&O9>x=ʗ^x<.H$Dd\n¢B /O3UӳKozv_~G*H$D-`sx䡿чScstfZ?~?wO>㛅֙#rjJ$D"Qv"o30xMo&O=4]9=qHC8ԓhGS:{2f SO¤'qPǃ8c땣*ǃw$D"2-أd-MDB\ p!٫TN.rǝ0>oۮ-[lcaHD"H$ ~:ԡY{)QZŬ]Q27x&H$DclڸR8$;'Nfǎ'$;U3Μ3/`;^?6:w̓?I0-D"H$2{|ۄI;5+/F\jg#c<Ärތۯ/>'GpƩg2㌳Y=RWD"H$2jpzH$D"H"0u[%D"H$'RH$D"i4kH.k +v2-E]D"H$f)2O"H$d@%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)RH$D"iHEP"H$"AD"H$VT%D"HZ)d GTʈc-]V!;UH$DJq:M3 VEUBΫ/(BEk EQH~%_*D/TXjIPg=-vZQ5Ug=SVQM)oC'_:f wt:q:Y"hnKMA;ɾPqNG2Usq٘i)v`)fBi )RJi EP&IMҧd*WO0P - ´R%P,PLLS2ڣP+I=(&ҋ,ȸ֤*Z(̦SlھAEPO((/(JZt";weFJ+v 6!ow<\ N0rni:K/ObEUY_j {I$-tt8a9a):cRjʝ@R("g MX2HI0P&iֽmMrHYS]R3y=XX ;OVX C% А2"ii1-F4ԙJ5vbumX?[vnW>Nغ}3ۍfh G^ZBnfmůӐzJXUb5 $QZHnW_j {I$- E4MKE,n]~%1P%ܦBMO*fi/Cl%(&=f&]f²ohۂb&S;KgL/ LQڗ 32]ζ2yueu{6钶ZPڪߣ;QGu+6Tyuɭ#72[V-,nשdM0L k8Zk:vno8kJ$@{-hGi.`ҊR:Jv0#aMOYwR:‘li!<:¦T~I,tCg6]4=$R!tKJ~SOTRjBCYQI/ROs+"^"i`|觻P3j(751z=DB9 mb&5H˪Z[0P] +qvJXEWdچL =T$Ƕ"WHKP6˳HJ˫ymݺvfՁn u 5ⰾ«Kx#HRY* FwFFLDBb䟼5Qw_'IDXE6L T?9䏣bIE+ՕDZh&8:n/=rE҂fc LraMaDfxs !'2()gdZt*i;[2fͫ./9'FN5=FSԬC3NgZsf yUl kmY!{>,˄Y_ϙa'\ ]a܉(j۴ٲěvD-ìIR})~'4js\HZ|jc@cEQ̴%E޲?) "ePS=̚ ]y*wsN\|ŶP$"#㆒No"V_PM0˺NVTWkNb{4'z2n$j=*xtka.y )fU1%T p IDAT3QYYs<9ά! yOMh]盼CUk,QUU;oC^=yw8崓 $Ԁ4MtCCQTbA#-Vܧf[_zy#'E?0A ӯ__>wFD8&O&iy覎n1H׭8SO7 [E*^O1LrE SX钇n[ahn}6MtD7 tLhYr^2ˡaؠ7|lقn0e2GaIXD31eFhh@ahnhfЙ4xtF׃ѷwx翈c0 L%ݧ_>V}oeemkUOX맮7y]׹֭~3o޼Z^q(‚ DU,˄&ɉNs_Kaa!2ŹVL20tϙfiF~KǮtؕuwC|܉|0>}4#neY}iF#/.1lF"9|$]:v^L{7ΦKǮ̺dVrIқ]zs\}599̾Ji&beg{4h.?AYwumڴ!;;/MKMBL>@ @qq1EEEdRTTċϿYgipB'~5M4M{9:ukƴiXx1={}w|-֜:R !P5LΚqF!1~MWif @:wG g劕"f]8.  F=4!9)(K,W^ -Z^[e:z⻚BkgK9w3lڴ. swZgNBcy饗#q=o~6mĺuXj&MO>;va;q8fXM3v a>;rA}rṗPQQfZgİ<64@3 VӦΐø y{;W'28n,k_kbQOǟG>CtCdW_~5#`ܨףD7,+qތ X<ʬfq#}>ׯG74rs1^aY uCc˯pIM>y/n8?xN:>O?,]Ln]=v$N8L2| ֮Yg5kx7,0u4]GSߓ,9P#0tPڴiOno3ԥ^C=3ci&$>"|ea֯KΛ# aÆĽlIoa j*϶:˗-Wi-/!LJoj˧)DK*; g kΝ;k8bHƍKu +5kI3.8"*+Y]F<gܨ5?`ǎ8Ёqڙlٲ-'|2'x"yy5wΓO>Ʌ^H9蠃={6O<`}駹(**bȑL>ݎ]THZٮڏtG"۳}_Ƌ\}\w5|TUx0L C׸xgYt9O=rեWr1cyL^ bs]|nj;/]cd(qO?ğ3-pهՁM S㲫/e=x15_CAQ|&?WSh]{:&u˵`nݺwSo0tg]CAA̷y|蚆[3buMC;n o|mqwi:z'L9_yxmJX~=z<ݻg\5Z>oH4oo[iYWϺs=ŪUYl%W^wNEL;W{kFsh ˦eA{^QXTHYY9Vb\qe8 px N<׍Koe;r.\fjk>r89yhfI$]eՏ:eݺ\5>;op إ#*2_d] Tʴ_nУgwVXYsڸf[ !3'3}tfΜi+%%%<̙3 Ta[!R6H2TH-~z>-]ĴזAWm%_~3=鞰-^^rȁ!L{j"h6$;FŰk:x?ZͲe˹zi߾>L~];ac>r7ml2FAu`OYBLu+^RE_`#9zd2e)̲-|L(";;>ɱC!{R=f5=$Y[Y J`\RDZڂ\_g{<0Bڹ?Xh8:v@m)m۵a"[X"^ؾ:רs0k Ώ+V+o$wHc&焩`˦Mi'n4ݻb]{mYfX%Qs@$f8fޓ qft]W'hN]nOl~B**"(. y7??o6\q]aX?v~};Xr7\[ 8sصs=,Zq:TdQTՖv ,)(&~7ƥЛL6l~a;7 ^{-ͭn23krYZLP%f'd&>qz͔l+3d`|bmC}5yX`0Hmly -nvyvX<"M,/ɕ\q'''Zk:Ol4CaڟNpe >\-[:|(E|B/_ΰCk/))]06mS >py,` D"TTTogel氧D4ocj?ʦ؈HBےaxxj,E B/(2I-dY ж][nMхZi攗$^e+>u[%˘| ڡcf]_`Vax7ZDI:|(.%J8/brN;f6mصsgF;mEOiawfK)C}aŜ|,ZN: |deexb{rȢEӧeSN"iiZl LEeqMc5,^^²TVTPPGVN/d,ӻo/r95aSҍ/ UUWmՏ~/cӦD"/Z'?w^V]*CtIUWf2 k6h^q>Nkz3i|ʫk}TUUa&kVa%o,z!t8 _ׯEVv6o6~|d:[6n2HCԧn0F7ru3f+V`̙֭33gdu]ڵ } {I$-el" KSi:OH1irrmzݷN{wq~2~8.'i2d.f>6oL gA9jt 7ln^./01*+Cr ՙڼ7 1syvN fpσwi qp9sNYP4v- ;gΝع#SN;NxqmϏ2} b;udE31ro9|?G&/要pOpqGeL9D^~}9de0?->#Ml BL8hN>$tf0xӓE-J 7zֲ}D#Q;?ݝ|b nܬ:5m޼gy cu]GQQQFzEQϯTTaJ#aKmܬrA,Yo` xtI°#hO&9%tѵ{s8=6ro)nV>dqG]k\$f x.ɇqS^˖m6lRB~9j3x$Am;վ_U4̦ձyEWT+( Ǭ\~)??෿g|P }\ ޥW=ObVp<ܗžwIKsϜ;q6uLBr}EKбyy|7|7̺}^ИEtͨs+eı8E&YH=v,}9>];w1@и7yUQ5Lt _Dql޴y-WUz;H R(?^$ڗžwIKpkx~pFAa>z z5Ex1uiqѸݮł|o{ [Cv&9~$>#A?;w)2+Jbg'SԳu9ʛ4jrx{M.ObKMaO;q4g" ̈́2ݩf#zI0Eh{%ˁ̂#'b j}0 r 2fY#mz|?wzMV>.KYEY U[gR־Ot:F-3*ObKMaO;idkX$5t: h[؞RB^\k@"iGAr etꔢ Ǫk\Sr2m*L '@s.҅vUP8Ķ[Էv<({ Rێh<ZMg`!Y6[u,+b`!+jj˓X8N|UTHZ"M3gQQYA {o"?:ՠ2"w8N ~-;7n}]%ӽCFt4 4C7m6ŴoSs=/$EQP~ؗwsMS۷i a?q=SV@a.Sr#hKObKMA;@f tH$D"8T/H$D"i6"(H$D"9Q渆%D"H$6 װT%D"HZJ$D"J_E0r[~$^`~6ZLg_~J^D/y/%D8*iH8Rw'7;@W;ݥ穖6=OY.n^MQ^ȅm9{)H$@u4s=EYE)w%'komH<@P@uZ۶nz*++ӧ;wf d! 'Kv]ؼ}#5kۏ?0guN3K B`l}CSD"pl8ޣ*ZEv0C*iH<EbHh4F4իWcڜB ia=dӆE#kG}X<5k/5f%;u~wg/[Q/=#Kl۽OCdIk bqa`MӴe)T9qh%nDjدA4nB IDATMMJjI`)xx4CARtr*pܨjǤD| ̴/3`ҥ_Q-;E?E9zXC}d%,6`vCZhmi[kUm!!$d [VLT0ksBy/%)LE*( @DYhp8p\փQ)..o߾(FpE N[{eSdldZp#Ge>`>nsgoy Nǧ 8FY: Ϸ6VomiTE5B'eaAeI ^ek)EPM 1Fy/%հ)t Bʲ?P(a䐝ԩS8q"y8 VODq:9 (qUQ_ۺn&O9OVHŗQN1s09^<*k+ t4O#"L/P@E& )EPe{PذDzؿAa4%J>Sn7999oߞI&_#on1ΒϨ,߄/Cbv%/lPz&O?'nŽa#+~Ǫޡw)n:P0B1nS1 շަ{ibQзm v:q:8kP%b*֗佔H$VH*[n#'E3v">8^yWcOib `&ݺY0q|L:1c0`Pox  )Y@;˙Ep'g;/ƴP_n6ysulϝ^ɛ{ϋ/?cZ )({aț_mK0_-~?;h`QJֳp׸..7.ۃpv۵/ n:D"H$-K)ǝ+3ž9z<ٷٕ1M#1 Uzg;:K/y֮_iVwb0v^&;@Qb=.{ pϷǶ>F܋{=xՍ7rj!{ytc{b|u-Z$q~o=ӰaAHy]H9#g\'I1浯>7ST2,D,Y _B7yȻw/wϨ't4 |_^>FsK3m}|<籼s]\/G?hąEV-w3q lg\LS  pbx]ȉq́`<'JMwx\Yg+҅_h.ǒM+ؿ?˗/k8o5>Dzb * ~QbjG9:jy!VY]߻s7m׿-wY# ++_}l<{#?7ӽ]X[$/x N~tߏپ}w~]ocY[9sm>1ϫU_p>_p~~6I2CCY99?o'{xtˮ]W} 77rםw?xg~֣X!Ř(L0Qf_ &D,g h-EH98E9'""2BåLGfO/>-R(}D}166Y H$kȏlghF?s 7^Ͼ'366ξ#=0wk_:?O#Q'\y/֛LPAvήg( 55I^Yf%~?Y~B@Cço[w/{%\}cs=|>=}3<3^[^ǃ5|~7/|;{|{d2|/dO:^|m73cG=< f. 9{pEwxK9q9?0>b}ż\-?,CskxbΧw2::?xHԶ90;Bx2>ugR__ǕW]I޽ryʫ&EO,[Y];ػg' ;xhAA$M}oy[d\R_k1u\<_rxjկ-+WwvZW55).}ں9O{[}:^IƦI70Z [wSW_ r44000@3}H9~BosνλO'ؿo? 7d Cf^۩#jjfY{bs9< gwMf wl۾bHcc~o3+H)W ,떟_SO#HNn$d2>G>_|xm 0uxԤ}>v=KO/;n̴ahZk׮3:|+sXuL]Y'""Vg:g8{1I44)LsqAz4TLH8/ 1?.?yK{ czwnH싞U/jsfcC31g|<ĘGv4NqOPoǩ#O\+H9Ʃ3ļϓwo_Ekk+r7cnW`sN?tnn,[ʆ7s&ZڱW\J4/:plK+_ s/y?M{L%K65MMGmpx6H_]sۜa F5ȢƼX J5TcXp܁kh ؓ[yK^Ǿy O<$a^5f/yuf* `2c 1>7ʘxoO3ḮK%}ee]P G9jk=k0/5Tg}{׵=f.׵],- +r]TdTҽ]<]|YxL=ݑq.to}""2_^ O=q_۟/RDD˂ [ZȌS_kOeZto}""2_T ~ug,_E}:meGyg]8]f>tq],R'L}]RDdIYP`g{6nfǮmy%Φl?/ҶCߥ̗5_+~SYT,Q EDDD(""""KA%J@PDDDdR ("""29o# EDDd[o7##}ίrUr9\[V t j-o:oADDD00w^on[vڵkog~9j+\?#_ mSAY4;ڹ乗p+_ 7|%u>SzSSSC^Y>uͳk^Z/vArp%W/^~׽z6mkw~t/~{}z>9S[R>7ɐڷc|ކYQ (""" a/ xe6N}_yz.wM'R:,$7<l{r;>|ZoK.S{buY\uU<_kᦷD[RcW?9 zR/jlz]S~@<璋t&6 >;N:w:wϯ%LBk^T6 6l8-lI##~ubzjj AY^v [oahp\yE~=sWcOԧƷF,vdGw#o6n:휺T{#ell k-;ql8m׷}ϼ},J7x=ON[-\ |bd$Cn7 c '/>UDy{}X/h>>ڼ1we3ߠy5FPDD8Kt}_QװR@PDDDdR ("""D)Y"NdɌ3 j54&@0;e>֯补\Pp gp _XT>ξtPW`PDDDd" t3:sXkq>ֺ` pq\`s16~؆9ͬ\Pf0""""hE1݈u0Wsp811q`s 9pd+;s474HE$lЍL+`ͅA846 IafK]ͥ6JA8'{}DIbM ,T Ās$`xl, &,`\-/Zu. ۔O!H#,EtA*5i&FasA!LolE&  rϘx$;\Mupu+g++"S>yĽf;a"09L LP*^ F߰bz :08Au H~Lvvt+ݫIb1S$c\U61%`P@y +!SVCkA""""}wݬYU+VHhm\x.˄#Y7^yt`u7JP?UM]N;ظ0>*Z~.8{3dDҼSakxr`6iqJ'zN~!S2 ?'?8 VD}1'&8seEDDD(c\-#8wNA9$lijeddt!atlҖb<ݫ{Kf4N%ݖG(>ȢIFM7c6z쎢v6mLg{W툈,6]+XEDDD8E5,"""" _dD0&YCCHYl" Ycׁ1 A`?T&v+kp.X[np;vA]Aيkx(3Ⱥn8p.YX6XSGϕ 9V>kt3k;3⣈,ZehL7Jc*bJØXyRhc `&v% Vv:hnhb{Q|E+•ElЍL+`ͅA846 IafK]ͥ6DְT Ās$`xl,Y(/Igтօa܅VbI ً.#hY%4Tz"3!36NP9{tm -M4R[‹`!T>2""""sY > h(0>{≧80882 g6 ][C]Meٳ]yr07|U]~ӿ8D!Ïd㽘XZZuAbgغsgU/oe`!8Au M$낮aむ-#OfG9oo1&F, D&ZɌgodegd"H0Z ً(#c7pQN!H;0L* Xڌ[+lȢQFptc04}1\%aL<)1&XETMH9Kt'(""""V+ؠיrW18K% Dgq&\bΆs0)l`ԆVQ^,UR5fr40HW :lئ^tA |{ >&̤r1iiNL$1XlE& g\a 1Ap3{y˞ÅNd* = EDDD&®a?5Bt=W_~)-u!b&VϋURP>|FGGPap`Ц^DA_#(iAg>7BP(R,(t3JDDDDdv",dJT?c ~qrIt"֯z>u X &wOW ,~8qr EDDD"b{ z\`%3UٿEΟ܆EDDDD$bAZ,78`P!T W_W"""""ssBib&LU F*σk9hC\D5} 8 EְT Āsni,P^b]6R t\CYw ኖJrf*v'MΓ26Vos[7ةQ~]A'#tv(u:i=!mE o1A>`( W]RzT)S. ~V^W ("""}b)!y Y]~ӿ8)%!*KUen t;K勱AEEDDd>9LoWNj-BZp_)h@ΘxR@uTpJ`hM8B0hSDDDd6"QFҍsW>Lz+_x2ҼXd S@i_z& 9'ExҼ8]ÎcKVf^]""""sa̔88zzo:y破\d *#(""")8H=kxEl6I8Ǡ)"""2̴S-e]fk$"""'AsŢ]հ* N͠agڄp-\#EfNe aWn MX b|2Ƅ3QcNLp0ȼD27規qE;Q9eEDDd^456ѿ]@X0C(V>An~E4222L:0:6JKS iKDDD֖Vv,1tz 3ECxEYޱ$IFM7c6z쎢v6mLg{W툈ұnzڹ/VwٱdxD_=C,k]/֯ y]iRFtP3 ]tǚ!vZ""""I 8d]W7Mf JKXg1ƔιrXZpٽ4Y۹{Iw7wrtehL7Jc}z^xӛ p8hnhb{z}cЃj,bn\g\ҷ/XFAoY_8%W|&r>yD1x<8V󲆻֖3he9nak0:5 (qex'x`}\<acO!Y ;6lSDDDDf/g@SLPr9)|Ptg-: ,#4kV*AA9,}L,<@ S::Y QU]~/Aey:,֮][|ߧ\. 87>uiN9T8Au M$낮aL9{nv9lj>p&(zXWkA""""2{e~yͻn:֭[y:D*bڵ$I"l}?29.hLaU*EDDD",!ˑr9FGGiiiSN駟fO͎JWWW&WtX,l?ME ^ Bk-xǫ_j?ƲEc Yf aZ*pï@PDDDdn"+9~s%oFs<3LLLL&c5,"""r|">20OXX,cClV onn_m4SװE7}Xu=L`5$U,""""27c?8Lשtv-r!(#("""2GM79#X:hh;J)#("""2G-M N7ӎzSRRmtlcRݫ{Kf4N%ݖG(>ȢIFM7c6z쎢v6mLg{W툈,6]+XEDDD8E5,"""" _dD0&YCCHYl" Ycׁ1 A`?T&v+kp.X[np;vA]Aيkx(3Ⱥn8p.YX s\`s1achJ7s=C(>ȢQFptc04}9 Fib;xl6FIB{G;d28Ёs +X Ml}"""""hE q)wc??ζ~?"G (u[+/^˳/<0Kmhenak =|^VN9 mE:/ko]睃a1)""""]F,\%4/o__ƙ=u\}A#筳tƉ92]7l'j>o˞M<),qkxI|'GY > h(>%9/A[S CLk#y$16I=k=xIC?lAYzW-®a? __S~9~9_ʵ'H ('H 53I /(j|j-.Km覮3`qHAg-]GyZ.e"NX$D\HhytĤSW$&~3Oy}6D2!)""""<9|[-0$VOIapD,d"IS8u5 9Xe}N_oࡃm܎u(JDDDDEX,R߷H/[F[}Kguq1612Eu1=ԥZ5kV𺗴RCzr)TqiKbdƊ^׼7M~XZb1Jsʲcoh-KpFM-3ρC"""""s"0f଻g57ࡇևw :x5yKW856܄Ŏ0QtǸ",IFG__x1^ZږSS[K1MMM c4?E4222L:0qxe,koYaѱQZZ孊,Yt`/L8Lt[f4Cݫ{(""""V$.6m̎]ݳ;&Zٴq3]#"""DtucETIװ,|eY2L'jd &j"mGDDDd$̎g?+zj^,U?PڅLw`mCA{Ku EDDDf+ 뺺iJ7ù`?gc [sc}΅D޾m) e(""""VD1Ӎ90&V:8S5!,AV9GsC{⣈,ZdE,֖?|}.<>W9ᵬ ]݆^tk [K@ 0 +<_pذM./W G׵BJ#(#("""2G &*9׽:|R(ݷS$I/?@iR Akp0zjjꂬ^yLamm-9hm[/ o5#apia9$tb]5l\%hXe&-@t +[+YkA""""2{e]؅ H>`ӏ `}[.')Zt: @/b\$ӏ S +]Ҧ^""P!÷J`f 3<_9s-NۦBp7t̢+)gh\.O2t۝ EDDdX`Id"v@0E|0܂ƀ aXĆ Ջ@|XDDDDdn",>0,a}PE+ ]1,:uU,""""27'k8?krFpʬ_ Nݦ^]Ó8xO}L&36^_DDDDf,17G7%J IDATf_>Շ)"""""a`V=/4UϷU"3uׂ9KYFeEDDD&sFp=@pӻYfϭoVJHLQ.Pڷ>6}G322}SsĹRհD!f ͮ'PS[Cr x'ww0q;_]"""T">!::~~k-c|+:XcOY;>rzذ|weGXArYxb |`u]0frpݺ<|@P/)>9sc0{qxD";U Q,$yd(#("""2GMg&>S[( y<|D\.G!_ZG_ky|Q ("""KΏ~tQګ:#wϟ/ EDDD(""""KA%J@PDDDdR ("""2׼տφAYr^]sL\)ks=xۏAYr.ܼoi-f9---~_]s6P,oܕBn9&CY߿g|`p/O<$Ͻ.sUz/s=}7Y-~&o6mt3Z Rlq N@@+ ODd PѫW ( (*(P` HyƎ$Mڤ|?=9o/缎{[R!s'DDDDnX_>gpjꌺ<Gpfj#DDDDAC1y(A"""" HDDD< b$"""P DDDDAC1y(A"""" HDDD< b$"""P DDDDACjTI$U U("""N y(A"""" HDDD< b$"""P DDDDAC1y(A"""" HDDD5 R|V|Z.f]>&2F?s5D5dx H$Hl,E@EK $jkׯ_k""+j=>uyu4l6-&-S_| d4aO'FRlfZW=J%LF~=|:op@R>=v} EEl߽`2`0`2|"ڟ*:rLW+ X^au?r|"`uU,vamΦ"I] RerR%;&b%iоC;4o\8س11xD4qQ/Raֿ^Ƣw˯΂ J_}k>Ze9_o\^MfrrsE8SD*@o4ج#)t_@k>X}&4==B饬w[ x!}롦HYw?ܙsky]/E/'JoC68YD4nĊx湩xlxYdx-32=qP(պ^рE.X:U\DTdNVqF[d=^2/L& 3>QndoSѱMX:b[xvj3 q0[j}ۻ˃Va]by/o<=m2P*1y$L: " VX)aJzP(QTt999 HafQa`6!",z;~؉ۅ!JPTT^o aվ^ٌ/NiL5Q :i`4,t]G 9$/[Xk:VZH^ڻ˃`hh~?8tS3 ǂEmU(aҕz(l)P%h٪e}  887@n5;˝ HмE3dB&a>w g~G&0߇;pM J\25D [t:4kҼXZ1xu]O6ـu@jJ~9`=۲ zVX4lk׮m;jHys..x5č7p3H꓄‚"8׻ 3fepq|'v^2%C OѨEzz:A"71(],7NRu@ V]փz /]\@8h*msӰr*1oAxdH꓄ * uK@ue$"9~;ѐ ]qh4q>!aS@Q1-vvS2^ljoU\p6 _ϫvMLeMq/e}kLiNŴg+~X2Ǟu=v z=%"'q)4 B5dB\̺a >ΌTՔZ$"rDqu\ȸ'7u>\&ֹ;5Aa C[oxSb$"""P DDDDV3^w yGF,EnIEX{yR| HDDDK7om<6w( 0y88i[?o?jOO}_wcݧ>ugzu W( s*鋳ʷ;F5nII15NDDwww͝!:wU}}0u)$yN y-)$"""T DDDDAC1y(A"""" HDa6 4qɄv[DD [[.8&\~ HD0Qf66ˣ93ӳcٝ/w|DD YRHcQrYYwZ~W DTwZ `fF&ڹ sDD պaet￟AaAa(d:95 r~!:nq3&n\AбS":u&M@4H%*xڤxq 6ضahhB"jKJ2Gt˗^}CPcq}ʔ~ǏGǎ޽@*ZFJ􉢈@4nܸhZddd`ղ5(((@bDt ۴.~;ZKތb=2A"QS?Y/&MmB|ӧ`G-ݏm@=гGO  (G̕+-ѪU+h4c [7 Q+?0uq g5*~DDSDT+c^ ujd:4o}Tڶ@W>?kK׵(޸Z*"''}D6 B^xaڋ󏜹d":eKJ2 ϱ_ܗ Ͽ%+{aP*0FJX }akA q%|//2Atᆵ Q}%%dggcVൗm9x2=1[7^?c1V;onƄ `2,#`goHוBR7xj@ȇFcѶ][}#"k&c꥘de^z~&ڶi={BՖ.l>[#"z= OcG}+2q~m잛.a$P>6ZLtU  O?WeGy<[,apۖنP*A"rUZw.ĀNg793hsV6\d2#GDS8|4 .w޲"A\d2a؟rnnAvG˿wd Q2m\XX & +`ܣcٷg͕DDA\g]Xr BfFf:>N")) Zҩ_{Ӽpdpe HJ6LjxkF[&̖H~:Ǟz$a!F~[鍞I=Ѱq#,Y.\@. HpϛXz?tpeE;q=M;d2A&]v"S"Atrl=$xh8O'!"miYg9"HD߶ ZX˳/Y{キ&рGms~k4jc﮽u8y$F>8qqdbĵitj;@Dwr(**PJY{G Ū.EբwRo̟?zD~~>+ADTZfsu0aB* %Î.h4 -ǰd2A}q"TgϜ.[%F5U˪e1:GL(J*O;miaW.QTTΝ;c-0VykW}yѫ[RqUK箝`2c\ n@FPp[Q.q3ݣ*2 _\Tiꋯ`ER^xu-Dwٵ݅zt-t]ZYN Q%IBR$b]XRh:,]>nݺeHIu F ТE |7x6^ 苵BuDT,{F-'/yhYi݋٤l/ ,eT~* {`=0 /]Dѣ[2"eΪΨs#XTtH&M#W"/"}fGF,Wz+1[D4)AǏǰ!,+K8B*Õpf{Nv p$v œ/'Oc̙5v:gOa/Wuۻ MT$&&BEˈ`UWWu$V-h|Z500P@Q>Qݵ`P$O9}-O{!@ũw&"9h߾e p~puY;OUC)%#[4VWGg;wnwGJoݎ(DFE"*:QQP-uz I={Cєikoؑ@[Ďl+c뽣 GZ;Tkmy]^n232,dfdb҅vJDTJ=1(7|H$x ҵ3r9$ia:3VKvz=7e/L&oݎOBtLp?;1QHRh-Z(s<7'n 4$LYe~:`đվ Hj5a2*^Zf.q={-[etktMgnymr>G@`5nlؼG*b{V^uB`ɂ\f5c$:E?v &ϙ$:V-TfaUk_#mf3$ d2tZf3Q (J!Gcv.RVTTWg:DR>X"ј:iz=쏾=|a'3tDߞsY%oAC) &y .^r%Z9V+FGke!y6Lhаrs 6]+ּynk*5}kױcN$K\|[w~/و?',[ DŢxb}~>vųSfp+;*ꨘ3t&ڛ  F^nˮ³SlK$[-ôЫ[_`]BKܾXdֿ^Ƭ ة#f:Rݷ _?&O+zwuoA‘_~-.KӍ7a,&<>WŋUH䑆 flMJbX~)5j2no3iPXXA~s}nde23Wґ5nǏg\kjdD m1)xӷ7>JT*\r!!W6hؠSB:뵿b~ 1쁡87^Y|4hРhg-`"V6"X c ?Z.";҂cܩvw@*.(룅%:$R{dø} ?2l0/|~:V-_a h4ڵkm ApعGK#F>DTB˔O`P -!:Ves?f4X("A-8b9p`{u yU:M@7 cf //۸߽d?P*1y$߃0{/>/BYm~^wa+/ᕙKPе[W gPM^6G _OTu@gCTUF+ .ڑh4 THDu"Cdg߂N(Xx%&Lldd+ ;vZ|m \ g8{嵭i&3&۝+SF5ْGQ՘L&KCfz2 xyyaе{WHRˆ%Z Hs#ϑD"A^^"F@*̙juBTOL$ZjY#"r-A"];vᇭ;ȨH1P|$A^\nY9\z$(+>!PE"557T"ŀA1t"##8woہw㚋#"A" {,H$)ϟGll,z}M*BjeUXK{GJ%:S GTh U$""UDY:w넟6͖ջL&S%>L&m*[%lXΆ@B"HRA*d?ȓc{#D6M6Aaa! d2 , elF֎9ʗ ==m dF8ydR#lTm¿RD";%ҥKrxϿ-hcG Ç#}[fW\1Dw.`޼y sD>FDvW L^nv܍];wCEl!u?Bdd$ 8J* G\="huiaF EȦdXb(r}l0MDl6;mcSd;5͸x9 Xw U`]H~⅗CtL4U\+|Ά**Qs4$:;w S2(}Xv.Owcih<C~3'խnX DT-/VŃ?W(d;a ,\ӧۖ2Wr9J%ȲmUwDiiixC.C.5A1xr8zv܅Ť."Oq'AeS*QM0H`Vhpύ7rrr,ږ@|2l0 9 9^ }M:8t]D̙'cP1r{t fsf<.q?z=-[(A`0@RaԨQG^^^̈J͛7qmSԋDa"rߎ?AAA7 uz5("88yyyXr%J%6mF!<<QQQPTXjn߾]晿V ZET*|zP(Ǩ`ǶNODDATiL4ΝAcصkt:T*v) A~z@T?C,O*ALL 6lBaƦY{ouxx8߇mZ!Y4^~ ?,~;^""zld!rsr޻ˡ_0gp,S Wxyl4N믿 P*WSr>T L $&&p_!==/ᑑC oe ֽ+Zn+)rܩk#"r$"ٟr&OGϤۈ*S.JW^˗/ZLΌ\k׮K D///\~r~؆ O,+,Cњ]%  :Lfcc_ 88J BL&rH$2az=4 d2C ar,Y/'ٺmqr”O;umDD5A\]*3{ƫF~IvWW|9c4 Q-rgU[Б{uak3bWA"(Lxl$ J%zc EZ`6¨ VkUát3g=6aPz{ އȇF#/4DDu ݉c'´ᆵm CwBF@բCuXFK+y-$$$ȩ)pdff> A|`&>k?^)!DE""c$".y3>#)+ ]{t/wEaa!,Bs $$$ &&W\//]-Z >>g:۔Cƍ7e/N<^~JeXB§_g6ıUj ͎m;pU5Muo݁ |&xoBKAʾjCYYY6lbccqܼy(,,Dvv6._֭[Cfff0  $x P(qFSX%7]$")/mHM[0c J)999`All,r9t:i_Q: <<EEEJhڴ)wm"##L ~-Nv .ݻ@]<hhaa6+Y_QK: ɇ+Ik/Dar0e4|2 ztz:=6'oLj# DF2QBjj-.___ܾ})Rpy 6mA᥀ s,Fhx5T~֟BDTlIIf$a/L<~h.~9t HHH@xx8DQDQQZ-L&L&e QG___KKOOǑ#G Jбs":wBS'OCU~E[!>a$Z1ㅙxP1`2pD*9өѬy3$vHDHHT*eSPh0P(,h4B!///^C!J&> ۢidS2err( zx 63 WRO ;oWFDr DToہFmV/|qq0𞁖c& oh4A"F#Χljc'@&!ABCbY>h4(d2ahתxg}o(=wu9s  HRĶB!Džh M evF}H$dtJTSa#c_߁jP*Px?X,b+|v\ =sDDAԓ0iVv}pپ5p(J-O)࿦CBBPXPX\}XOCSU2"A)ӟĎÿAP|+efd"*:ʩωBFFf55#*)JLSCDT0QfmZDFz&c:_Tt2A7v\1A"f3ѫO/YYt`~d//A"R)&>L GD"3=f:Q} <Жdy*A"""" HDDD< b$"""P DDDDAC1y(A""""%1BDDDDEA` Հ9`KJrq,9@DDDDy(A"""" HDDD< b$"""ÙfXJ]""""Cz8}T@B|Ȅ d6 ? E@A$"$ hRALV6A""";LAa>ΧX>AA""";̍?!R&шsǙsa20&80rި A@P `K 5;@dZҲ DDDDw~E~AZ4kTϞBHp([ǁ@"Gސ6G A*\\L&K H ^ސH$epD*fl0:{?RR]:e6 @([t)< v?MjDDDDTlIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/editor_image_size.png0000664000175000017500000002267613203343735024425 0ustar jomajomaPNG  IHDRM`sBIT|dtEXtSoftwaremate-screenshotȖJ IDATxyTŹsz}ew$l*("ʦD"j-@KpMD(͇ܨ-!F61^Y{Ω>LL3ïS[VUy0~X-\"L|?ȰD$R|]#L 2%"MEDk$RhJX>JH@ Bh+!Gԛ ߢEXF""MedX&"ȬE -_Q|V s8Ə+2H$ᔗWJOY233ڶVI;O>bDY%IqcEFFz[C"iTVVa<"nNj躎L*Vp &ՕDAAYyYQO$-PWWˌ#i9Z]*8\[!9َb;e"--E4 Emm`'a0M-7 S<]r{uIf˭ޥLRi"۬YCjC:BQTTE5QT#%ٚQrtQZV 8+TYYlf Pr=\E^n<Ӆ/gĈB23)+wOoai'CWg]xT8bͷ&nnq4-2ɜN'Jnb. EII)9$ٚō!T9jz}(XfTEl&-ՎTVVtTO9q=h*L&2S2\9!Y-$[Zܺ?nЧoo^dʍ7 @Nv:Pr^rsBSʕ&Ų11הr5|AMdуk?dCUII\>o.#W{x@AeE%섙gUn&zIVf&^vSYF·{솗z8u,_zl6sпyvTVcRUj\<Ɲ1ܜl5 )Yxp]F^Q 4 Ovs V/TthL}Jf4 ˞e\ lI<^/b6UFS4Ժzw.FNv+xɂ^7Bho* =Ɔ߿l`I8VO>;.97^ 7^ EGu}ٍuN^2O +d2+Mm.`lzOY\Eyn:w CmnM=G}-'28ݷW ](dh c̢76m/[ںZ+.太*2Asoy"L&!V /lxiC ۩DQl6 ol6N;,N'G᳒IU8x{rrʤo祍cO?BY]ʕdR'C@'d{27;1<% H)a;o{1M2~Xa6EnOfռX77&ՄbE\Ylf}x5N.Pb2md͝Vއ}sϿk+L*)oF3T,`=C SngG8]/I(*f.=Tz`EŤ-*Ҽq/@&I;t1Loi*$HAdINW$ [5!{nB~!HH$ F"0IHH@*DRa$8 #āT$H$q~jzj_XPQ0͘xO$~:ԹUGC_U0Z-6,)ɩx$atx=Wr3tpƞUj#wHWUS\RDJR2f%iƫy).-b؀iGEw2"9)nWbO JtM.UՕe%=اؓj^iE:HSU |ͽj^.D6JCnGL[atyMT9xMq:;T;"m.]!G6ASUڼMFUL4Q`۶wF*Lt N)aNV,[ Ko~ =_,nݺ6P0*++?~|n0dۨ1|%9l4 ֯PοA ?J#l=(|*F^4”KRR ~z,Yˆ#4iW\q֭`Æ L2ٳg3x`.]CUW!t| Ӻ->}|$?d3zh}} \|glxq=m~SKٳo7/l|zUѻ,[xo&ު78;ƁXb۶m c#Gw{WZZʱc_X]q6[qt qJ&7J ( &ݷe)L>W0`v{R[˛1r 륱Xl6BЏL6ÆsǮxޠ2uTn&***X`\r B.T#mzz:%%%?~^`7 rc`T Ӻ4ј3Ɲm7^!7/Vp_ǝ^ﺺ:'UU٣E͡2LG6V%Kзo_o΄ lTWWi%^`7UUq6S(69q5Mx7ޤWtIdeeq3?d ۓ2?*cR1LWTYO6uٳ'9990x`viPPPP/.''.]]n@0Ѭ_~݋<(6#|楗p_#ڹ'eAa7-EO>lۺ.]8^R°aͩbTL:L&^~ejjj7n-bL4r6n[o… 1b7ofذaZE42M2h P}$MVO+=qθx$%9z$&s[nbpҕ)&==1]z7+WȰ¡V uֱsNL&lݺ޽{ps&Ljg :{[orfΜɲePWs4<%ͣӼYKѱkY EikUkkj[ z^<$$a٩9EPmjٺ}K= tGcT !''1yy|WtэG>b8$c% \ -vƒqFPH抪 (--2Ϙ~om:tc fAK=ng⤳9t{&N:>LkiL2UQԺj#9nC9"fιazRg$C&3v[25eTVuug5vk x5md4+d&Ş=)#OqG2Gbzpy&_ъtQUQl極RQ]C !t< *iY;:F"IRa$8 #āT$H$qЩN@N0?ta$(#If/HAQxaJi0I0v/DFrdpit;{ ^0_UUF~TN;Oc-79}SSMM #Gs5¤I69V BX4& 8rYYYFX2.Bɓ 0*\|Ŭ\5k4IW  _ IّΎHIc[U8s'Loebb_+'NeI8cx늫j7_+0_;:56>󔔔dɒpFU+ŷ(*owPvŷq ׏e KӐos&MdϾٷQcF5XSqq1K.套^`F&ex`ez,ob|crr9'N1>[=__|Lcճ^Y|5)fkR2Wn/^L߾}[&9/#W|K|bL]'i=0oO5[ Q:q$#^u O-?iS\ns}@~}]~zqiii?Ġ M>@޽鎏IHo0̌ 9rC}XmF}ɄKalBqq1)))aFbΝ |>oNO X,rߪt D>8ų.7/9?>G۷/_sCaf$;Þzǘ4i-bڵ޽?7r 7>07of c|0֥UE Xujf_<!tz-;13.pKYNuu5"5-5F;y>sgnObLz^?$@q8EMM >GYZNCa#?L]o{)9Vbx#[RVG:Aa'm0cOˇՑ̕Pki|?& zt)7tFI0' F:t$HAYaI"4 #HAQa$-a$D F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8HZg-UܮDd)Ymf`:)TYG SSWc1z#0E..r]0pkїU0WYO!DD/s#ѦzIEU9.أwu,Z0Ueޏtt4Sב"6H߯c t.MJP t_@o;Dy- ="8peam :A@zj:}pɏ1;Q:-VZg-i)hd@BQT`U_N02>ae.!t+׃3'Jglx t. P9F!frHYYǢ OHBY%r9%)J`/B 5ċ3P(c^˿=ϢzbR:|Z/ &QDČ"pØ퐲nsYǢ #tMx}oׁ#̖MX1#ЙN (.`I$tF "”z'uk:VM@ 'ЯoOcFPA($PӠ(!3G :zXQ|3aCC1vc& E0H!G{}6vH=oN#!Kp@| Doё>qEBL2M#B PF!?E;\~A颕"0K;"_~G ̒yIOHxQdR)X$n A,aavi>B76"Y=sI~g` !ƌ(3b`WDH3Pl5eÚEBL2Mך>t'2<cszi.AY0\W_}>^M1:-dd2OXjpiTm}_x}{cK1t#r0{<%7!*} ھH7ZWg(a.9V“=Ň|DeE%}ferłyW,rF(-+cvXZfMFm"X$$>Eojd3³n'q {Xv؅=9<j9"Bх.7>[ze4j`b(-9ΜsÏ>D|v'k~{UO<2l0Yv|5]?'^ֱHIԂ\o{uq̞;xR4Õs$ٓ8l]~VE,PG,]q/ǎW?G UU,n7{b[mt]Ood2,tO\G7ZGSb1X-zAXt\|E ?!tTV׿/^.t2N#X I]ǟ:3f<@grrm -E.o?ofMm[{EIDATb[ڬ;Z ؓo׳ÏYJ>9c4}gk I l.5դ ȱ#ѳ;}7AAEE^uf+@[vu,t2z'L*-=NNn6&QI'V̬tƝu#Ģ6Cؒlڱ? ]4x~{pE\ryLM4 XC#x(++#/?/S^V9f"nKdݸ}t(+-`2;߁FUTΛv.i h JrJ2x6+99x5Tװ _3 <e7~udY9UGRxjo'gM<1f5=Z•W_qb+ NYℚdQ:oeϘV/g_H+B 7u TEA5rp0I6RRY>Κ8>BCJ,T(A&Ykrm̿r/8cgyO^wdڅS7݅lb'q: ӟxƬ3yxo8yIx5 p:]ؒlDEuNt=] O^_ziT`?Ο1uO>KJZ ={ndd‘G(++'#3Uܴ;mU-}kok擛˿g|LSt =U_=r/iwʉۮGi <B_sx`ك̽h^ fͽ]׌:fBgͣx᧸`q}dэ`2,cՎjr|ͯHZYy'YVioGXa22xu)uhLֱh5/O瓚:-յ=ʈ!cN Mu,Z0ݺtFq臃4NKnv#3:R։)EB^ۭKwu鞈$ eݶȗK$q F"0IHH@*DRa$8 #āT$H$q F"3~z)HWHzIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/arrow.png0000664000175000017500000000045213203343735022061 0ustar jomajomaPNG  IHDRnbKGD]^IDATx Ph=B$q_t1c#ϡBǡ{hn+><|s3ܯӯvE3}j zI#CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignature1b33aaff61d83f1bfdabf2d1ccd5cef4eIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/fcircle.png0000664000175000017500000000167713203343735022350 0ustar jomajomaPNG  IHDRw=bKGDtIDATxkeMvdݘ֠-x*hThQ(B"zQBPz?? ^lBi za-MY9l&3;3^d6z ;= 筧5 7V )%*Qǔ]I z#+Hm~:??ryP$Ŷ-c?NNqcdo~(7Hmp M?u3z4mئQX3kS<0 fo Ё=@4]@l ;gɯwmk[7{_eAaT_IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/frect.png0000664000175000017500000000061213203343735022030 0ustar jomajomaPNG  IHDR}\bKGDC?IDATxڵ1NPDl6g"#@+pԔ"D4wbbV3^?XMU^42kG (ʀbH[Owg|Vti!23\<L /qlڹ{@a^o*8f?ƩFNk Z8)㶤i(H'&vNSR/V ʫ 2>eώ p~U:ݛ<3#g;%0q]_8*,&Ub_92{IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/line.png0000664000175000017500000000116013203343735021653 0ustar jomajomaPNG  IHDRabKGD pHYs  #utIME%(IDATxmoA3F PDpJAEIEA(  %(MH|vng(8OZjۙ"GhH44U5EBށC[ 8LWpvop@mu'"Pr| x1r/(RQ 3mdy0IǜAo/ ȑIldу_ua;c3߽ f +m?ki|Yw7snܾ(Ӣ&#$:OX]`e>t Ǘˎo]tNm{D .2:yMvj>|)ߌ y;CZlZ%j4_U`j4Ϝ[$*x !i<{쮊Lϟ h n-U"sXNy3ِtEld{YUȺDUǎ |CxG(Rҝo(U NIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/text.png0000664000175000017500000000100513203343735021706 0ustar jomajomaPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8=K+A$`ER tr[VnBl%+?+f9Cr3ÙQ"2˛w j\#B0wDc"=EQE$@.[86h:p&";0FIPIn3Q'ZZq8sn$Z-5U*( n6}4N }9`kNcJŃzrB_nwZj0vrƘ?Ǿ׵q_MU_O~w6'R*^ / Jj)@ /CP,"(A)S@>x5u>~o{A`1IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/entertext.png0000664000175000017500000001620713203343735022756 0ustar jomajomaPNG  IHDR'GnOlsBITOtEXtSoftwaremate-screenshotȖJIDATxy|U8szIw5!Ye%,F}<|,* #2( sͺ$^aZƪ-S{4k^a`(?tx/WzZq:N$\UedtaZVM[IbB]QK $7 OܖHe1TÁR#%6,M줨)(2api2KQ%d0jZ[>[V3r|Bm(XƩ)'?ۨQ'A6r[b jMV jCPY!I_ nY,aL7oEt:FflyQ|\6+D(+I\bDNUjۦpěJGl4YQQw+*V9@Qc#ʾ7R^Qe6[#"taZl)0j'DX{d*fJe0_4(N~0VkYYydD.,ltnei"JUj|(g=פIjTd"<њ\:GȜEW|j4?>ϴZ41[h4.]7QLtJnjN<׃+Vݷ_ƴI{{ٻ<w{IdY&'b`U[FkFas*B-Fh%cyrDow~0M&3G6۶Nڍ3fǟX^o;n̜bun]3齕y.h49l|yl}_g5.ͨmȦWmVL|f[E~8]gX Q2nu4uNi?c0qpFfaVU=uJf:=Ô$VUju̎ee(dҩ&ZlRu?NŹ3;uloJri(|lpMY]mY3w׹Vo#jj-?3ז =gpIjxerc^=" ݉\j{) 0~(`jr(0b#\$x p;Ƅ <..`s6ȏY:>rsQzX`!Yn~߱1dvŶb{U¸~0j$I6Sm2f3ha~*l T`f\%15&ĝ٢jZhVTT@֭?X!Q"ue宧XވbkӺU!b.hy%E>x`Z#G 8]:g'[nmJhbS;.>tzJ-5k?ׇ~:~FAjuXXMFuΟCemኂpK撅>zWj`ԉ6x݊Y3gTT]r[ύ؟LW,ZN\\\J?cr璕K3S??}HG{spJ~ 03A5_':.99j[,Zşm٢Qk ))YT;0͚u_|E[E:Fw7oIz ԸRAI&7Z֮ߔ7a 08r&LŽEV@@ m6Nl-7ϵ4S쟷l(ZmøO@c:e &dX- ՚˗c}JDG垏%VsA`z`&j8GƘ( zRn|lhZ%NVd4ZjQx]j2Ԅ"As9!2$+ԚfaZu뻟ίz>))9###>> kΝƍUUN +pIG¤(*uSϾY!j[Vk}Y!$I-/ \B9c 1߬,Ewlz>CW X[ʾ:cK5R\8gSoԢ( }҇/T*!G*DAPƂT+!bDm&l  ٳd2]rس?Og {=_y-4:BFYG(Qe!J#Diu(Q4:BB!w lAjôB1+4$Diu(Q4:Bh]xܹs`6ۧ i8ͺ)Sl޼=C)jB.##c_>3 AGEȽQZ0'''&&e˖6lMӵZm>}N<i Bu8bAN\~\PPO@aa!hB.ѣ.\ /(]p!ȨiȂͺ efAzjlll-4o_~KtygrO y]fff.]&NXPPp 肂-IѣG`ʔ)~͛Yf!CB! DH1cAzٺu3fF>}7lжm'|~5k̛7]v|MDDD("jʲ_m6}9O>q=zDB]4:BFYG(Qe!J#Di:BF:B5kVLLLddd7pBVVVBBNٳ:ĥAHdEB:D\`ƍoݺܖƖ!w`udM4 {vx&4:BFYG(QZ:ڹZׯ_W>BBAd{̜9sCHHus޽{mώ5jر7.; xuܹ@~ L>Gq>?v5u]v5LWdl?|׮]3gt 9rk֭[WoVVt:]BBBIIk.]zGu:]ZZڷ~PuZ`ݱ}/رc1bD~~>ݻ_~.\سg7 at:ݑ#Gnumrrre8x`ff^߲eKF-Z3 6?OLLLJJj׮k?ӑ#G>veeeeeei4PA]߿fmrsssrr8p.\вeKgyZjUw]|9,,,)))iʺA]6--cǎ>A@ϝ;yٺy&ŋDEHTֵi&==}Μ9&LKƏtR#^zϯ_~yyy8׮}{7nܱc )ػX,zt:݀T*7~m6m/^ejc}-Z8p`zz;ud44~uٲe˖-nNo8uMj~]||냌A#:BFYG(Qe!J#Diu(Q4:BFYG(Qe!J#Diu(Q4:BFYG(QhwB!~dSF.B~?hI(Qe!J#Diu(Ϳ;U bQ4 Vч>KBGUnHoZ D?`DfMG9_B1@: <׎. mq:CYɯW~K ׹3qGʊ[EEDq2`x 9_-Α1*2`\,bկ1"G gc+0Dιc2y#p{0chdo]j˞:$G2UEGK\b}D!' i;]cyMO!0D cs cmyBg#2quG^ C]M!`TDKgC#?s9D&0:y #ȣiD@< _  }< 3`"9v@NXC>ri}! gܱS2D:!>#s m nc˹DdsV'&9CMX}~ܫ4C^WF9Yz9'J΍r&sGmQsCι @dIV=a\^I8Tϣ90~^,w~:d3g r;uYyqs~ZБ[$8 rv!o)q]wL'2fZ E&)) 0o''ggAn F.Oe=g1o;uHB|yYN_Oix^qZbh?ŷOπ65:o)q:.sd(#S$Jv>BH:de]:'Lumywu^:f :rBDŵ@kYvS?kô;v_h۶ `"{kq9Dds qO{8]>ü=R<쐛7n.PڼE>f\ fͷ_Gc{޿u{n}:l8Zzy&yyZ?뭒7t3`Qx{nR^}ѵZgC$mݼ5QII/}-1)z}S_Y pDDJRyY:iVIo[, Q;ì뙖7W,_¼Y#F%@O0]X`F.R_ϾPXxq//`(1,Ywa|޸IS'Z,9gEQĭ>l\=^ 3׊wWU7~QiS&auDXj(Ͻ+׮6oԈ'Y_bpX6=3Tc]ָIw C)͚7뒅Pauw¢[DGSZ@Llԃ}8DI6NEq~s0mwHLJ$盶i`Ȱ{C7c|0WqqqBRV$%'#Jx4hUqd&/:߻^."%2*bZ^^Vb0``I⒄ I}`X5ZMFdr܅!uKI#":f~<W\\쵫ݶ뙝3%#b~}zho>=a@C/fuc]׬Z{DEE` "r$(78%Z̖k׮9uazmDd˯ا_hQB=ݮ4ü-zkǮFT+#W.>;8pgyJ%;"$q!G7%(ɍSrF=7 Cvl_Zme$``2aZ@@sEޮCEӢ#++3r&M$$EGGï^Z\\du7%O}3{z?`Gc|4G8ҽ+o,7ɽU :S7Mݾ֨3Ҧ=;%_2jXj$璼:%{s /^;;mtf8s(Ą_خO^_;/yѼ cǺUW~E/Z^V8eGW(?~ӓmv5 iTu? jpuW_9u)c7@;wj#u_;vܱNc]PȺزE0UVV{2?Eӌ'~HLJG.]:t|:ƏKIL:˗/.&>.KϧCH`))! nDB@.B(Qe!J#Diu(Q4:BFYG(QZ;vACoڞ:4$Diu(QIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/multiline.png0000664000175000017500000002465113203343735022740 0ustar jomajomaPNG  IHDR9sBITOtEXtSoftwaremate-screenshotȖJ IDATx]iX~}PYeeQpEݸ]5.1QH71&!77&jr#5{DQ@QATTdWEv@`a~twM33 fg~TWWW>uꜷ8bjAht$ԒPKB- *ߟ9=C%䂣Z(z쫐Ϫћs J%w\/оG(.) =zt̙G=u> X|ȑ̼>T!'WlJTCPI=tz^dj?=NT6ՋjJ gGuHOUz:i/nAm|1m(999QQQ/))r vqqio$a50CM9cmz(--]j矵ΒkQi87Fm |v??3Ϡ`ѢE355VuXrEEEEEET>%%&o m-b t"1;zC,Y;WX>t1v%Zj1ٗ 5 ;z-B`&,~86SIگJ ܊9gmLEXW@-L|C}t.\HLL`ShaIEm3q އq})~{%_B2 c8()sAEq鏵tq6N[XX8::feexo``Q0._Ȯ$|R544eVk0qEhnn޵k_|э 댿1()(*49P'nGқ7ox @(R}Y:..o3k :=w܂@U,vzl>p5*8\}B>CBBO>k֬1( |T޸<ƕ+W` +~*Op1;;;MMM3gP,< OU]uKឲ6xcx'Ejj*mPѺtb 3s Tk{Az;IfB1 &NNNf͊p^5(K\+wΘ1amOZ hW|\l_}gIMuDUUu $utBv6rHL~d;Qy^XqIrLm EB;Z&I1sdyJeff%nd>H\=hr*FEEEII kL4:4BWVyhh7"""֯_@$mڴz5龊 fjaa֡GvÙ0aޟFghatiӦyyyYXX8;;}lMCCCj"*y,GGEQ"z8#Sf- , b=44ƍNNNԷN 1Hbްa߂ :DeyKn3"NL4{4zrMz[KXF `ŋSSS+++ٳ/ñzRG'O?pB@ [0ϛ7_~(*?#Uw9u"úrÆ {:Гq'OP'?. 99kie#fdd 6JgMV{ jd،yܒ#">|x3yTJp}1|ڬdYcgOV1__ǏW񱨈sg׮]TXvA2 r0wP:_-1Q:2^eddT⻻mfT!QV͍m\$-SIIcc/d|~^i2 \_C-"zm:1TjqƑЩ1z"9{ RL9,@CZl/lhh ^&c3` #Goԓm̰b ꚯҥKce4J&:b%.k#q?ƌ8NOǎۥ$*閟܄%3U5@$i2o-Ƽ!PS1 |"qEc$DS1 m1b308k0&b-FrT~*6681ִ H T7BчW^yT}dm* *Rs+ ŋ\.WYek#kc"/--j۶m 1H+DbPr8_|!{ѫjtj^u>W-*}B[PKB[xq؀vPow֘1c宲777+`_n]>7eYYY{2k/ K6$4l}*IN#襱0ŋs`ACm4i3F1b D__;w 4?fz2)M0F0F͸Ws0*Vh 0Am3^? @}_~y2jtBW -7BMŖhnEYY/_L' 2B+Œ/Wt0X?lEaCoM08z <hh U0с$@ o`L:^9o< ]{OGMo4P N0i0Ŏ{.]Tyúe>;e 8*s-±6wP{nYɱ*K|`oCfn } / QX[cb˱8TTTDFF.[L={tx>׍lL"tڈ @`7nʕ+̙cbbbmmA'& TT ###]]Ps} ͯ)Jx( OgebbuVRɓ'O*dpp0 b=@gffkhh陘9::z{{>^j{JUi&6w{8W P 5ы z/zR.B*Ժe_^uj^(rpxP(trrR~ 噙*7sbbb233333ZZZp?[{4Yp3 #[#'9sp.RD &ܹsG/ݝʃ,(`:M#l8q=HJJ@^^^{bpՇv/<ѣG48%%EׯS^\fff3f%ji wwwoo 9EEE&T<mw %%e…R'nٲ믿ŋ9"5ɅHg҉ѣGB200 % eeerѣ/"BgƌB_|tnI yKI|2ISlhOn%ȟܹ@< :"//TQGh*?O!Xx.\駟YYY8άmFj%hjjRD2IHH(...--ѱ}ǏOTA]]]FFƃrsskkk>}dhhhee8l0//U***bbbrssKKK|A9~@Rh;m xnܻwoҤITXL$7N&bܹsPQ%3Л4eGGGS__)|FFF+V ,D"QRR҅ o޼)*##k~w (˗nX8䏖 (D2S"p]IRRT@,ƒd g8]'**J߽{!Cv)3h __xb*ܱc͛*?)S]Xl]+k7'00˼r%C%A‸"8<>fI'(..3gq16 G|+GdV@}}MRSSGnݺu`\t:Uc i(++6mkk c1z(#grk;#_Gݵ1cPx4Hnt%!A<P57sBn2OOQ_D/ gc"b_lCR9߿fϧlpL耻ȩX*B Sb뼰5?ecdKDC'ɻ_,!4;xvvvMM ƫWRG+񲀍x~i(sF^JIv~ʜm $:C'f;҉'O&%%Qi" @KK ,-Nz 1IDAT :gffNQ58e6˵kkk aÆ͘1#<a--o:DzNgV)əfBDrR佼&1 rsGKɔ51dfff~E%}n̘1rk)@kJYFHAAAu `A[ 1ydBȔنf(~O2I1Ym 0E3RәZJ"^&Cٳ`ҿ-e9R'd\Ţ-"5Rht5?72.^fvwX.(w;`g)P'(4hlڽhYΥVŜ5uT*A4}ˁb~f#77!8,^ (DC$w1eqX{xyyQ_cKչ\{ 7F1}hСӶ++~(#iSzeIVՍ0fr7,wy\r $ 1 gz,rss|h&:yfN:MM͠ *r-~7nH$$$ɽ-i3HUQe>]t.))!ĉMn ən:* Aut5NkԌB4'lTRƲ76Jq'Ob k)Cd(;TRpuu쐍6h Ds>}oA]6 DžypeM8l'$-dͥlٲE^: Dwh+ZaSTT￿z1c598<a>$K֝J}NOOotz3mC%¬wLfw>Rll޼.UM9-٥q2Vr Źx*̖a `NAF_3leԗ%6<777{{{Buc48Xぜ5H}8=7"v3gܹ\ڨ*5TR ;'1p(V455QNCT=qXISxZX59tP``@ x_17BzĚjkk?~<449Ùxi(c &-QXU"v7eCɮGZW.ݞ_ٳ;FY.**Rz]o+80`?(Vr!ِ"*Cn͛e_~}ʔKjP,9%lRHNN>}Tʕ+DTWWGDDP[mذ2sEEEݾ}@յ VLy=L___j?\ɓ[nWUUxKn߾]j --ŋ.]JMM"VVVGv؀ێJ]Akkkeen~^ >b``>)95 P[P 5e_^-_Lkd9=#}y*ԣe_Zr}jU%W\_Zr}jU? wj\IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/editor_2.png0000664000175000017500000020064413203343735022443 0ustar jomajomaPNG  IHDRAҌsBIT|dtEXtSoftwaremate-screenshotȖJ IDATxw3}(  61^{ QhDĮ&vŮQ4H?mS;{W9~ }}gy(da1"[D"H$dOPe$΍ '%=ƢD* G5[t*E6;o5Jք:G'qϬB٪6r׈PZN PfiY7-NS o[ymd~jn_kBN!CD D+M|-P6[Fehy5Z _V]l~ ZCۨ?&mذ TƎ+H$D")/pAl%0??oJ"H$DKOP\ɀ֚%D"H${'ʸcD^^D"H$nE(X%,,S 2((Jr\LJ'E&H@Nc(ڲV TTP"H$"@iYXXP *vk:A&' n6CAeNt0MLS8 )4 ۍb0$mIyE5iR\UJӗH$D4hZzxl۶7zj<.+͢$ k_4└ЧOo +Wnݺr1 h,ƴ>%ZHi~B~6DX]Q͗ ^\n72eP7v PI4#( ~׋˥2,jj#`ȇKKaYeYh&7_]. 0),8/]7((,Ӑ̎.kI>2B9A&%᷷jTT&E9G"H$ :n Baa>iae.4METo?DuIӡ&Fu0kiL?g}`O4gNnv["ʙۥrePTKU(nZa Dq>ωhF~ގY%D"9 2z/U4,̤%/=,?/_~*=>}AQ8јǟ|ږrr"58Y8f$imZ+.ʥ& ӎɇ osg:MaAkqMwD"H$e Kk|>pײgU=EA %]Kز ˃itܙP0!Q0iDt]w䔕)a0s"^a3+ ٿ(^^&( y1#t3Kwњnk8a Ǚ3A3=I\D2y-! :{i( xg1xtRY ПSN>W_{ 񸛌/*m۞izMWUn6Ç`BFA oԒږ.ⓦp8'!@Z>H)GΉㄝ0hjkü3=1ȓt=D"iaa]JD0M OZ񒤬yeY%%]ظa#niRRҙhԖ:iaG躞XfƢ[6n^09 5kzh/ "=ng1j#{Ʒ5lnr'ƢQ .7n0[Uؚz^mڼ!`BX 7σ>/:ѣ3fVZ=JMu@ iz{=n>SF a̗a„q|ѧx=cqFbGoV ʪZ;`G@puW2[N?|rssrD"H= e c@}CIҥ 7Q4+e 2"H$i$9 iݧ`ՆC?pbi>sWWrԃTaUv݂~,zW]Údnp$K]Z[uByE%EtؑʪrйsGWG!?/c9GN ᷷Enx4;jkk6d{2xֆ< ck mrHpbt=ٸ! m..*`AEE1)b8!xUm5H$H.pEϾh0Aq^O*z;r SLl[ ^oR-7 tG1*7Gуx8 cTmOULQYzBf,-Wnib /o^bE膁\V!5MeQ\TYf_u /Y˥{u73Iӽ+fba_)> |W^~C= 9 uvtĸOh>E9Ci>l۶UQٺu;%%2h~miZu$%D"i(]>"(BnaEQ0a3.0Ir`$  G4F16F$eaYr2#16ҲJf8ZBi!p⪫ky݄#qN>87#U4HTo46H]G90gL~lȜ4,>3fh;hʚֲ߾wpWr'~I+~iBY7x>D"H@UU+ "aʛ}(Juu5PQUʪ$wgH( 55U (ƏQhi[WTqy5>8}<{ /mfeM .~ شi#n_xGx,KЩSgb(UUU-.lu}1_k#X]˥ ?\EQq!,'~x\o49AUUXf-[=Xa#+VJ[lYz<.^TUCCq1ixu:>?kنcY"%vx[-:Hޏ2-蝓5G#l <>y5;FxD"a ͓q=j֭V@ $s׳OBw̭ѨX/64fORYe>n6iZBNȗ5Mˍ IozE$cZv7un1xV=n /uM:D"H+Biao_mS4UK(MDX5[M Ds:M}~g^Er˲HUQ ˖4{8]{Eİ8?n/Vژ@5L+\mrq"v\Lԩ3}y&V\AYYpmeEq 6;I"H$p]XXZULʕ+\.n0cYBzꉢbo&HOPXjN^ͭjLT)n۔CDU2G>P].W۴.@A,n`U,-$D"SncZ@u07nBSU>oDK%()wPϘ[˲y=(Ūb1zssፁܚXZQP5y[U.1Zn 0`vH$D"I*{0EcB!B9A|>"E4/nOjON,#//`(תQxښZ*+x=x\.%b]׉Dbvp?BoNjQm4|"jq=왡aڊ`sH$D"9Tn cV go/rp 띝3_^Ζc/(bͥqQ5Cln:²:jn.ihy4[?kX"H$熽zZrGJYK/m}d=fPe I5:2=Oj8)L"Zk"D"H$?W}n但V/(-H$D"ٻaD"H$v `Ϋ/zH$D"Hv!'= dD"H$#RH$D"iHEP"H$"AD"H$vT%D"H);]de;f۶mޤY"H$NQ/GI.;\a҄#iOaǟ8{w{a<ȃI$D"ʹZ8bdn)a.[1ӎٱZ:9hmVqD"H$%;xw(v|.:tYq^ƍA#;gcTAB98qO> %_n3=ӷg˝RWD"H$]Y[C<}O>ew,eSwY3 sf˰?`gl" 9ED"H$>msm}W_{]aΥ^ƚ:s6cGO> Grs8h 'O䴓Ngig໅;D"H$e1bΫ/zH$D"Hv!'=m[%D"H${&RH$D"ijHߞ;TSGD"H$M=]'H$D' ]D"H$J$D"S"(H$DND"H$I;E*D"H$J$D"S"(H$DND"H$I;E*D"H$J$D"S"(H$DND"H$I;E*D"H$Wk2aj*cm]v%7OUH$DNqiZˌ0[ѫks JEQlp( YI`J%C SQ' Sz&ۣ.UZŽR9:a`%p{!* . r~ɮF7t {o_j IvR]Z2UTm'\,˲;A+4)Ȳf(M &DRS2!yR -_AXvdp<JeYiJfB{s&ɺDzR~eT\ER rCR-T!MqOAQ7g (DbUncuWm5l#&7rq{q!\$Cak*ƣ;TGGN(IϽXX 7Ϗk7X iJ5#zL:+b 51wڅulӯt@DjشeA_ǃnYӅ#l)/WIos Sݱg4^R/VYa% :ey)Ək~``=/$FZZe+ZBŭ ֯6&PּTI,eHСŤܬJXMXzXVdxbg"R="X bCٱT&ϣ CͶ/Nk.iG}͢:V%ߙ׍•6oX)M kHnIQ,r[dS,aP!cZAqYklm``߫7]><:S^?]z*LXӓ/E4ԵNp$[BAn{~˺{y4شmz:fg;ea VPVT%#mK1g<\ƊHWH2.ԌzM} &y2C?m(.4iVAѨ"hx Ti1 ]GJoRMpCc3M¥8G+53M([œ-]JA#Ewo+ٕƤ?#,"%^Œ:%]uT~5c *J:t;QUC [*T!') &Sm+iOW҆G$d[!7򟖵$6Rdg;lp&X² @8}*ͪGo٬9 mSSq :VTZKUKi =>1n=DB9t mb%5H۪[4QCj(qvJXE׵d:L =Ա$DZ"׭HKڜ,{M6ҹsLS5 l6*ݨfryȣ!LR* Zf>`_S3&v{D"D!1?eO^l/˓SRKYN"ik"p  L":N@%ysT4ɷhHM8ޤӑ(W$-xi6&$ַ,Od'O10iLz 2α~Mf2SI{9V4k^]y=)7r)1~(;}iqey?IO_S[%_`(k a_P=e[&z=UU< yL'`0HN &Hea::n>5C߾K4~ilڴI?,0Mn6k5W^ˠA937ƞڗZwI[4Oe6xa[?hLoqJocTcZ&%4vӴ lYanf"gyŗ8bFٳaƍÁ$Vk2-D f9PlZcXOE:3I8 t+UK/q-ݎ G)lbFMSNy Kt*+un+#>Fĵ,.^_xשh[#^x7&o^z){&0x`Ν5e](|'Mwf*eBD_xb)..^cդ{βRH7v[[:0ꊫٽ=[O?L=wC7XtnƝl5b1k<݌c&?|8ns9IY~;;v$77 .]OM¨aƌAJJJx衇ڤD$&pesqdc&ae6%h t@)e'dn`Acӏ?C7t,d=-9"nPIQҤk8(ۦ05cRðybh tx*lU 904LTMm[w߰ʃ:.:3GgСCrС/<73<Ĕlk2q5 \u,gGf,\}:>s]kNUeBg<3fQH_S25iY.sS1QvҞp-]w.. \tٚT E/_~ [mZ^WeaߒXalayI}Nҫwq;~N;}./#XRR-œ9ssCRXXԩS;[կ~Yz5˗/gʔ) 0 &9~'5KmEвo#e N'aꤣ>pwv77ldY 8~y!UU+q/5}07p3i&~XNeќ{yxM}l'W^#e1<,zg _D޽{8\n7E}1u,FLnG1M~Gƍ99;LlU]8~2cmP붛}4NZ7up,eo@_pBL`9z} 0L/]ЩX<\́#bQ}٬i c:8<0MƔIS1-\q0@&==7 Ӷ+IG1rH<}&׬°<AgLw>'tS09|f~UꫬZ?U+WګRU]i膁n~'MYra+硇bԨQtؑs9޽{_g.xg &*%?aOI|Db tD3\Eۂl[/C ~xk&meKz LhUPy2Xx MqyILaVzKw^>-!ZU^EU\؇9eK۶mKc9taoy9{9\ͯ9rQ|/e9gy)_|?Y"6mڔa[r*ܳΧʉK:n"ȊWuV~0N;t6nCN8c=Z'ct֍n>S|tЁc2c '~GYN"ik4ծG#,{y2w=w^z^}?\yɕ\sU;cZ:sgϰd|_rEsؤ |:gyUm|ɧs=?`J #0??#w?~5p-;݁-LK+/b'o3=?爩,.Ek9/;o|s׽?a]gވl>Lhyop7gsoeeeZA9a< hjbxE0~N?VRxfV. L]/Ӯچ38an-}k 6/QLӰW~,CQZZ^]"}={pمӡctO4sys9Sϛp ru7f;j(Ld۶mDa|!6l\p&N`w_p9xWyOg̝2W]{%_~]usνŋ3tPСCYf 555OTWW׋_xqDh-Yk89X0ѩKgΈQ#w_<^/'K1-}z`(JAQ!b:_-et2+8cE0tƎ? a< L?T/"Sټk`dϳէt/<7^7tPc TUUד_R҅|/^W_~A[qψQ#kXd[8\=m\v, pI'xђ&@-SSSCnn=// 'u㫫YkYN"ikZŜtc&';}>/EwK8F۶{`wߣz}:/|>o6=iQXX-[uùalܰ]0MN;rQGp'׫Ă}Ʊ|ُfJ?=L$_]u؁@0swW^C3\FڄN;?/haaܥ3sCAa]u ^|<)(,`떭;LSG>LǕߡc^gs,:pIx-EB/(2I-$0IQ":uĦٰ~0S+-Ցٚ}꿬ay%JX5,~1ǜx4e$v޵U$CqqQFXCA^6QFśE2:g:ssXx 'ZٱcGoۖm6GS؝VЀXp!'p ,GB!~?999,\Й` h-"wVHښ6,b3#@HKO&5t M$_qM^^.zI S盯῟|0w1<,^2ݷaz:~KlܰX, yNv}]|-6TMqdA}0uV\ W^\VesES?9 :g rª(*. '/4xe^@dGٝ}JrJ.48愣ygXp1SYUŻo#Y]{aq oЖe1sL6oSO=eYDQGoYp!}}~{s=}z%v8[,EbBiprP#~"fvW_+|Zb)R[_mU1 /O;`ՊU|>&MتcW^̾bY+Wdw [%oQr>t֕#Kٖ- T#'77^{?ww 0 M7)Sv piDQguk3gGeҥlڴٳg3k,̘1o۷3|y'~a';-Yt p*Rߓc%߭Ę Ӳ8_rw[y?~I{ǽs-AC2Cq]1#䪋߳aG gas3P]]Cqb<N91v=Uk5l'sgr}cN#O>}/NYP2t-^ ?Fa3p@^xz r&3/?Y! p2Q-na9nG1m&X=3ɰø}=l\@0C{X,mg%ph$>˷(`4Gl`\ӆ x2f:s=\s5t!#(~dy3R%6opb:kֲvZ|>/={r)1SlMyI~a5E~Z͈9³бU_`gG٫']yIә}1bxz-_hIlvVHښ;g߆cN-XD])(,ϿϿ.j YR GN>}v&9$y o:km^$ŞڗZwI[ijk޽7֬n%)*.׷\KqǢ^ИHQ^1#JM-xx|8cx0;c$^{P9$G7}`(m9)%3B)  MwL iZ\$ŞڗZwI[f"SgLwy߈r PխJ`rqW2y\֗K,ݤ((co6¶s 1u2>?t|* XƚZsS{Dcf1Ty{j_j ;I$mM&$]R'qDaEПC.TTSمk(sYB$mHP D~qG\.wRTX-gkJnuUO2zrN ѳ{oY4ѹ3@hXaM X RFU^ٗZwI[i,"5q (^\Z>!H v=Rը(F^MyAU$w8h.oD㑴uӹC 5?vO;T 0^^ƥ{nRKYN"ik; _[@Uu%Kܦot.IeDpi._6zӪ]%!}FЧkf ŲLtSo4m%tXϽ|Iv **=/${ -Zvʟ~dݺ;fB]ddoG M}ϼKOd/bK-A;^@f tH$D"hD"H$TTAD"H$ލiq K$D"HnaJ$D"74J$D"KYE05DjK|9<;܏?k3yml۟ZJ$dG\*=iH8R˖2z!?@W;ݥ穓6=OEvVmXAev9*d|R"H$mrEEU9]zw6춬M$R @(`q=Ζ[Xf 0Lx,ѹ'vscm䨣rgrGB N˶=k)H$L4Mt]GmP.0TҐx)b1(hh4FuU5+V`֭tx"@ߖeLZSkص'hmyb+V>cqm3qm>^X}MXlmw=M$ 8Lu,G"L.cGuePAk)H$=J, 2I>ljG~Tj\.nP0DMu-nUMPB XcG0-#웇8nH[mw5MLr\^ =VbK`k"! bFW2ZJ$I;cS%X((JUP- hb @4n`4 JJJ8p YC*F 3ɶr%262o/v!qF}w6mwg3`{.ׯ jԔGYFB^z)7VomiFujL_*5&յZxAðЫJZ嵔H$vjҁ );oGjjj0M\UGYze֌+[8~*U<4Oi "U- ' P@EZ  IDAT)EPqK\;y-%g)vy1h J%l|G|Wx<ҥ SLSN!'njŗ_c+뚘i˱ <~4նޠcf6Yawoҿ8TΥ~̚BvvWԵb1.X\4KUR/VxMX^KD"i"i&&rI?Æ+s?[-²L, TEJuUEa_2m4Əϐ!CA1Qv.c j# #R qqhnWjeYX:>;Bcm^Oܽ ]}9*o/<)Gi+oZ"oݶmI,cp|k@o|WT?(0]n7nt,]>$=N;e gGs%n;4)?ibEs5ç;)/)s$::+׮ysA׮uíj%M7fтХ<9 ""̏lgx/}(w ƪ޶p4e|Db K2޳.;v{~Gd@ElSe_aX˻Nݭ;XoY&́]YDҁ՜&{"n5+2~t]G7^t]pn%%%hipĶt-A~Pb;eD7<񛼆ùz)))#p.G^cul>_4}{1o|wS>=X9_-YVqO܏χEL W\mV,9n'>/v1>0*N="0#IgXBiyn͵2@HHao{nѢ;1Gd 6 mE8q'::Cs(+ ˡ,|Z7cV|FDЧ_6nØ7ѱyvz3هٷo:]+O:^W:MҒHLtIVn:`vhxop:YnGߞj2k"==0]9l()vF^-qڱssͣ9YDFE2JF0؉>θߎ 9%s=-O~Ǝ}Oy4J"ORA94ݛAbʋq(߽=BqNix}ppT溪|v?WNdcUVأ~qˈJ4r0EF 1.4a4xծװpB?mY&;;vZ>Ӑsexmlyglz4# kTnD֐kMx[s MHHRXPh̘GxmSRSB\|mfq80yyyd4oQsa>p8*+.Ғ}O ;9"{5. IӍÅ"IsaaOBS㬬J]Q}R(f h3@Yy9Jؾc;~Xto)(347Nvs BɐsHttC.¼9=ˑ4G qcj[pA`綣(?{`ĭ眎IN270zo;v:8K~3'`R jYd9~? Vѵ[:߉|㽷}E;( R>ʠUZwVCDvp[ӟ|0Հ_˶),(q]Veٻg~UWko2nxxˉ$5Ib޽'YOugk #ϐRC+ {""\ "7'$6.OJ).C)/pMLL NJ&$0/OO,?=?=l6|\گ/>4|E.bCjxm(eDPV格Niq2 h(h:W\:r w^57~MRRO?4h{v{^ X>v8#3ki$7L ꚫصs7]s=111 8pjKs~=/K_=g 0kvl9pcCx̬uޞn,2ֱBƥaUC᱃UY6=sg)4@PT?ϣcp6pޞ9BQW^ W?>^N3|B!J )*. ::Ώ]]:?WC$C>K!uAe͆UeCnۡMuzb:=nCuK~ֱf{{\3?KBFA)tؓ{?31\ɉ)tؓ nyX{{R!D]iP !BcϨB!"B!D#%B!D#%B!D#%B!D#%B!D#%B!D#%B!qd|@P!gW_yF:fyaA!wf-79\9*:ۅ>=qw˭w jpKK̨KB!D58W_3g޽hٲ|iӶ ;}6nSsx}zQXPȊoc 'ݯcsJFP!g^ܗO?4dgkRwM9- MjZ*^7tk\n[וQ׏&+됵ȑ#{}ޗ}+Y-X̰˯k7xZw>ztW]6?` 'B!(#FgΧsQJfǟzjKgmߞ5x_@9][l6Đ+jmwn`U)! grz|s>}k> ^Otޕݻif&nRRwjIii)seFGXzf>wv@aa7,f&2*2oC4@P!g#s-wp+gֺ.;uAزy ϓ4h>_4؆։w=ÇaۙCQ &MB!8tޕ&I1+p\5n|r{{Q]yߠ3EqBQ?68/LB!+ B!) B!) B!U RT\@<\tO;*B!8ӄ%,-+p^%1> YPhh?̊_ NRS`t0L@0(VmI@ c(MӬb"PJY# Pa" >&9)iVZyaVh˃8qyONOut,0;؂kʺ궩}k:Ɖ6ۜNyOv_0X)U,-+!.&CC(a`c~@a: laoX 񔖕VIZ5{qv&Lsl}_<ƉB3YX2a`(BSՔih2*3@Up#0B20 } /kWd{CKPn}_/=;]<&HՌL6l.E}Yg ! t@:@pGEOW:P(C+3 W #p]Eux`b ] 7}4Mto#0 7=ad}~zӴ C;G:~jRߗ&"<` #a?W(W4ngT` Nc(U1?wH0дӷ|>nGIg6o9vW"mwA"/O1aq]Sq~ߧSt\L ~<ヒILyv;#Y2!D@Puto Vd̾fA;끇$*#dc} uCGu Y˖p0'i dOI6 Q0u84 +g:ebh{hrv]00/HֱXW#k*Eͧ3'+2 zF; xAcB D tw[L!iSmf)g^Pr:hPE7ϟV=@hۤ,7!~OQi1?lZž`5;6/g K C* T~ ,5M#!&_EVQW~B zJGIFbzt1;Z%:\AjKBR{\v}߇2_ P뵖J_sW,o ]) ==i0'Sc Q".k0oT76N3u{;$ęHuZIq8\$5iTjX)@ӯn~?M3+@@S*;2g0 7Z҅1ζo/#:j;ZVs-~':KHVQ@^f8^EsxcA!))}՛Vq{O=wv"1YTBQĪhF e,fX3!g6hǟWB~y4[ 8'<ފEYK.\ˊg"}= ·X}*2{kFZBz G7|Ožf@y7?/t'gKʼ%+.|>^GnH0t_MiБRt<x>RFIO;Zύ3䎹̺xZN|62iʄ 92*XȡY[*3oMr/2[auB-|"ACT<_*5M##,o2!" #]TͰ'lcҴqNå{9?ʗ|Im(<ɡ6g>i} ZҥQggwr R$2΄%7cxkZ6?͸ա1nTaj Ѭh&shg)I~^qe (7p {bsӶu]~{0@{k"y۸} k3ti*OѾ Plu.<^nv%pj!|oȠB_*0H4*'n=V`pwvb/R2O{'nU68;6ojޗ??{3U}=Ay}Dkq`Ѿ!o2_z;I[@&q/$w_q6Ŝ^SFPxnTk?s/M SRNs-7o_Ѫ=ex_~'[ezHɻyB4ͷ;J.+0)nZ4[ [e f;;B'lV-PT؀5*T3O]`gIٌɴ?͑wr$sM?wD9v@YeS)E maГHw;HU!/W2#X,.d%#phh݌T5(G]cn1=Yc5m 4'MG7PxbIkopXh9>ęKbF/OZl=Gj+lc NO)س^O~*jZ#{~Ə”T*Xs wA)U q*dQl6i}׀KGŲ+ףBuM*f-,ڂf˚A0[ ~oO IDAT^◣W5lY@jsk>R]ond>4jXq`;crVqE=Z!N#^bfJRٺv;hJB!NRuN3-~cs b)BK'h$W,+4g M2B!')|(?:]R+֣ .B),`b|PvWNJKIO:-gBB߀",5omPvEEd(*.Сi6"Bq KF0=%{svg ),ɉ)tؓG!L@ #)Mux!B3pB!T2P-)p; yB!4a KJ9Cmj^eVX)9!i.\U`MMjfyG}p')DEJ0(BQ[ai/ʣUFcPB)s?e(t]0 ?0meJ Txn)chޚp܊B!+LbA (g;gCU&@)4f iT@)3+XP)EBl<;o ǭ!B8a6*j4 4 MTFs Q(\`O) @62B! \ÆAp@4PJCS$``[[ g5%a43W'!dxn)B!j/|AC 5*z>?G+ ϏRa׈tMrb.ICHEB!8Ia u]jfh:Y9Gٺ y_DAQRDDrG$ڞEDGFb۬,@!aժUa=GZZ={նo%KrJ:Dvv64i҄4222۷/{^?@~~>g/`ƍviڴ)c 2sܹ͛7<** !8iX_eݬ߲$I*x}fqͦ En^>v+mw4!ae5D 4 7 YYYߟ[[cx7馛{-< /2%%%ns8HJJfĉ$&&+xyG v/--ѣlذ_| /_~ .ǜ9s&?~K.uvB! a>Fѕ1r붳pFh$md?;rK9RPJqظxZjEl|*k6e5;pO]49`0eʔ`fǎKii1<?[瞫1ѣGyGiٲ%ӦM3uDunf&NxLXUVѧO͛W6vb5sq !h”TVA9}H6m9\.xh 0P> #FBb"N6ڊB;IM#(6B^Qܙ}QCؿ?#Gd!#ڷue$m[l))hyy߲ϒ%x.D߷"~ay?S̚5zу٧׋gsP2cFA55kЮ]cz׮+@٬ 664w !e cHh?n#%98;_7@[C 66֭ڲc22qG ;%}ķ&8M*+&UM履~bZ˜_Lԩ 2ptB 7aP'=8uXhݻwoE|G^Gy'?q(%/obN%ꦛ82d;)..fҤIVu+VXWٷ/eB3fԺB#,MÆaxmٌ VCX@ .1"2QXX 9Ç6ljN' /L>61ol6#G>߾}1bDMѵjfv @۴=zPYYȻzo{V$} R bw:q AaQFѫWSn!gT̬x|:YG &Pf\'Q O ." O xv;S`KK ]%'-[jNv;g5E+} Ç"G;w.:twߵ56}m|kv_z*qK 3T0R뀆ij +4(++f9X1 (?k\Ye˰ZˊN'N< |f#C@#;?>f_߲-[(~Y﹇'D=l;- ANرcyII8{ƿcŋ̝;y1sLJ5J+믙H'삳_E`Xmf1ͰSԿ?,^n߼ҥf߼z'4{Z ^pd۶All,àoÿa$@xWࡇb'8\4AͼCeРAt 6۟w_ff&b_3ϘṈSb q.]zL1PU 2w\~?B!+MÕn6d>LjjyE(8 20ԂF1q8""PJC:|r.\X6w}w5m4]״iSZz)+贷hAZ(W]e .M|X3fXCx/&;H|mXqӦQ6{6+W2|ZCT@FF\.<zV뵶8r i}1l虙On-lj5V̈́ kOYY}˖-c޽]B4L16:K㣅?CBl S5lvmLCJr3"#݀ 9dӾ}ׯX{Ǚ0aB`GAs%3fXNO>Cp8߿?g̙L4 Y3.Ӊ.A_@HW\s8"" h`ԩ؈;=~<E3 Ν;s-ڼy3CeϞ= 5 g޸ެ9MI C+|kPPPOB_g f9\JJ<:yZhCl|<o(4M6T 7(۷nҢi ))"4sqٳgUEEE9jNy=9[c.Z0ZhҤ8r{ֲAonUۚ7&}""}=oe-1c)}v[9൦5n=Yw9pX/{qJBqi3[g:AIMi"cv ai~rssټy7s-i,$pD <P/箁nu9dZn̈́ ju̧z ̏?Xkm׮u\ (Gn5/[)Sp[8*O+p]v(EAp1Æ c`eee\VhɢE$ZHoۆo:0 oo֬Y_ !hXW5l(Tm6-blEWCWvA~ _)[Hj|͚6f̌ ʜrXozR]z>vZg222,_NT6JM5d w}G׮]kuXzʕ+QL 7y͔2`b]n'>,c鈈yZ]Suq+"#il.]+(~)<f3TP!!+A*]ӈvHM!+ٹRZEh"1!D#2*~*bin|+#dS^zI/Aøq 6ƌʕ+(|A\!Chn7 K{OPP[!ۉ8RRBܱbZ >@ |7nӦM#;;}^ Dҧx_cKK317wȿc裀9NEuLL ͛7}֘U5k֌￟;wPS:K/Dqq1.] *6)ycf͚ġCɱwܙ!A}+XǏW,+4nv2*>iT8bf0B)46B-9rRB8aqUCAþ؂Ftt4o_~9J)|֑s9D78!sQegS>gN>Ç)6Z^\\`u2334is̡e˖ֺsb֡JJ( p ~Qϟ뮫uBz,|(?:q!s;Ѕ+s|͔d!Wп}FO6( O >m 2Yfq뭷xPYT{kkݚ{G1 .#gfadek4|ׯ_~YXj͆+c}F~>`8o<"3THJJb̘1'^!a=1>tC?-Bq+ Ha q +[R߫TioUVp¸8F 7}:˅&J^|؝vf u^z_ߤI«ZʙAi&+utQpL(+,6۲f*Ҁ記pRRZLvv:]󈆧@edX˶o΅+.<'s̝;]v_qFrrrpdddp%0`9r$}~=79.0tKɫ߸Ѻ`^@)_0^x1˗/'..ʕGq\6l & 6BԳeKK)*.[Sv'usΤÇᮅBԇeˡuӶf52Q(4sB8\P~e$)`cbٸky(z,Yb}Q>}~ׯ?0z+Mܹs'>,/b<_om( mĈaӧs!,z) gu&LHдl^t #Z56bPײeK(--Eߵ #'[{WfϞرc0`@~aB!PXhцkh0PBu C s@2UL6Ls#N@t0'+-6sA+\NOOϦk׮hт>^x ]ەd%zV-Z`رa}9bx-&}JM0%NNN.UR=h`͚KII ))#빳gO+Ӫ: O3gc„ tޝT:wg} !` q1qh3P?P MYBkf"ܹ_RfVrRxvmC-? @M7j . 3_`sjyuĿ2Dk(2z=u԰5 O2ڕ@YVG==z4Nf`oB),Asf]a=tQP*OX*SzXa;q:u*#'W_m9;j 2ӈEM I PߵkEy3lUV1{lu܌`({=k3Rk-.YFT }SN#Ѣ,[fѣ7-q9|-h(Bp' g t~ݏx}^~{}~yv>Wc(eF,--O?֯pnx+L jx,]JFi)iwf iQXH{<8丞/pVpZZ1A)ŽkvWà0hu]ŁfZ.z^s(?j"uݚ1ĖD)`3UԠbW֭Ic#׈}!'L vT&_|{Pkf! W6*f=y}ݼ C7}O嶚Ѧy 18N4-P>d /_ngfr_?Ə'fdZYj.VBoH_JV,22>fuu>z5@VX駟n`߲;$WH{ <^\s[Y-\1IXp! , x|O죏Z#͉jw`z !hY_Pڵq?s_X1= b>\p"$*z[Xy~O֨QHIIaԨQ|>J^x_}5p V15 (,D߾ϒ%x. [?>:w|v<<kQ6{6,$s7qDڴiodd$O>$~;{7ӦU(oZ &N|\k)SLg٘5kÆ )}m"oW,-)A?t}vkjB'T"%.&+c_ս`Ϧaٰ4l- ŒHn2.Biʿu+E>Zg4h?ƍ㫊Y@t)?NsbcVMչy饗H 7Xv;}S1V}OTl^ݳA IDATWAg2<_ciÇ,]qfW+aKLDy! !a# Cʏa0-(cd)Б"}brJ+6%x|:Ŕ{09/ƤINXM:qDO-Z`ҥ| ﯂*/7 Jj:֭[Cqid$aSFP[}>^㶚Fef33x>ߨlf6 [^XdIȜӹ;j57\r%,\ݻwd,YONNvӫW/ hΓSOpذatkɓ=z4ߘ?>7o٦M6 :I&ѶmZ]8p W/dܹ\;FLL dddлwo*z%J !/@E*3t:^ XB?M6w0?Eѣ=z8-jݺ5Ǐ)(++İTy䑟}:gygybs=]'--36../};z(n;db!,+1/5h(k|B9$Iddd}_FXĄ-Hl!E&B!~V,b Hl_E[c S!B^XA B f^m?ABج>!B4lZRSWY0R<2+9B!'#MdA?*++ A41B!rBGhHpc 4 '(A!BSƙE*J)=۸VV +G4M [Ü)`B!89ala),8[/3+id#%)M7 *d2B!_հa0'w#\l=nEL\,f(EB!NNE!5Hdt )DfB;. t=LiX!$o]ՙv03@,4 XD!dXDWhZ5f R!M M2B!')|(?:( !BIr.qzy<o͛ٴi6mb̘1~ !ha 4o˚ Hbq KIi1YttaX#NÇsWf͚@P `޼y 2N!ٿxz>~mx%'@0=%{svg ),ɉ)tؓG^Yzu}>k֬@P!DЃ`a 2R4\gkZm8ѡo[Wvn;âEسgyyy$&&ҪU+ ĨQСCoѣǬkժ:uBq [ (D]Iݳ[BjI&oS̔EVV~-O<cƌa̙x<]1bsέv}ZZ۶m#..NC!2f>6@׷i͛ଦ͈?=@ʽ:nؘxQa='#33!Cynko&}-ynꫯޝFQ pC '"VkU*[녵XZWgv7.x6m?B&k׭}8|h.7`#F?[K`<zԁ;N!.϶rt+F$(kRhDm4à ڱ2U5۲NJ2(/ q$_LW=P,Tm-?c JO?qy1w\^o5kkkc~:fu5}9ʩB~: 1P#A=DcC,^CG&+UQԵ/9(S5ϟ2a`oSXTXkRcLkaf3EvFW"D͘1 XCo+rr= pZ8[h/bkN2rݻӵ#id<={䦛nB#"L<}<ދK"o'+# Sᗁ "65)i)e˺~Nf6x|!D)c=fYSrg`ȑ?sIN?Iرd=}c^~=?g>Zz:5?ԩ !UVUR\nl} M=Xn{}(.L Ӵ6L+6Ka9L3O5sLӺv=HUVO?҅ǬfT(s :̪*Үw7k?ӬaÆ Gٓ}v0Xx1~)6mb֭RXXHqq1'|2 ;w>WBKN(C3p׳tRT] 7H'1?C9 ~qp~ oa>}?i]իW~z6mڄ磾ުӹsg9ڬbuu5cٲe (((aÆ1rf!D{f^MYAM0?oa3DS"EJj(Ң6p}l'>D <_|!'lq޽hL4. g,6nl@0Uݻk6l_=]v?9M6r$w&57l?9c .fX:/''?tMX~Yfzdee1~x&OqQJAj g.+P%DeWk\o=t/]vws5k{z@L©׵NnM6,^غVRY^}вe$''3u6=w}/KtX?nS[[Ou{wcVW|duI$vJLQRB]]_|1+W$%%.WxVcĩ"0> pGm&'a%>5yt:`MCsO>=c,Z <rOR/  an.cݵ|r;N>$ro\yy= ~ڵh))x?!h^/W_MQTr TVVr饗'i!QB˗t4/>(aLIBQ>wދ+'c˖^N.eIcl݊Õg%_OeaݸO3kj0oݣZ iy&A>blذz*&aBKIF1LڪP} a*C(ӚO4Fx@ m:ך>>RlkvTx"fi)A}M7~gMCѣG~Y^Nq{n=EE};9s]3p =;G<ǷvG̙lIIW/9.](0}b>4'~(ˣ+1gzɊc?BkZ/32?T,bֹRjʮU-*#V O3f̰y;QƆ l=#j-X녖.zR~H̙Ϝ9s/RR{ pcOPʊ>cQGQ0o>}H>>'xM ~po$Wɟ=ʳBgXO~͚n757݄jaF֣ChrQSd?m6RSS֭w=(-u먾첦aUT_qƍd|VyZ"ߏΛGErskn@?zjBDKi hh!t$*^%D:z(C!t=19ƊMC4Z!EکӤꢋbBwjkwyg}~v5vظ1fpE޽K9묳H7_[POh'|cvA F5ӇN_}EެYdsyoMqK̈́ z;H>dRƌ"7|p># 5jW]uwq7t>ݺucȑV2چ.FYю:蠘>uS^7$iiiVj))1KXbM!D|%T@ZyJޫq2b^J(OZ io!!nvݻ7| eee4LzW@O>Ď3}ݣM>}yyxW^}c5+woCX?xnF;?<<aa>>*\d?hf3ŋ#tE1fJ-O?Dyy9#F> QSh;殬dݺu1ɿ?WOk!8PHpiXѴp;!-S/K,{;,fpCTp]w1$xdff۫,X^s1l_nk"J+{J ŋ:tn=KĴi<7S_uQ Sy ;bhlD_'|>|>fΜG+\..B{Oh"Oݽ=^z1n8*ePZxeW.wwG!HkeE v-a"ϵYS8\4DW|GYhR'4jTgݝcc)]L^{3gr؃>QQϭefy1 ֍?7ߐ=}:'Dڵגt޸o/bCDߨض-3-3~dIOOKT§qulL"s\P`SUUew|7`*:QsG% NũYkd?8IQ#~=w<]k4Mseܸq,[>SUUEnn.EEE|׏:>/;quYQA}5+/qM f<d?,Zj*uijz!=Z>/'*A6wLÓaCS"9gCxic68&B'Sfs8,Nv\Bx 1)ڗ@L ]G\.R=pj̟kj{_uOn[oMwQ7`{퉛eMoW@;N5d>0 oq#ׯO>٣kͦ󉚤;fqd\B Zx L0NAߊ`#)My9OEXxВQiRQQWUAo.aPsֵ隍oOZ"n_[z5<g=0ZJ ʕ/͎גI̚g{/K{JKKϞ}̻"+?ӽnBDu"S3* q(!K̵G:uG/V<}*֯_W`͸5Cˣr kŭjOO4r$ `  xFb  9r$}gN oQUNBM©3"(DF|_gi0`^YRxJkpo\Yյ8?5Zg׎4G{; CӨ>Æ yk*vHƅBvsȪ0 $oR,7}a_Vg`':1 ̝3He^|E.b9=Ot߻_X?Jtʙg4N:AxVO<M=z^48aXG]z 0#8Q#Q-^n.']vV6[\hҤ`ѣGtV M?əB`;ԳgOYf r$r ޣ"AN֚}F '1i oYVX~3!CХK)--e˖~z;k\@_~ )S+nE]Q3GDnvs<@nԈ]!c)/ 7  %:cڳMt4F*SsG=)fU\.rg`cVVx饗Z.j_•Dݣs}h{ٳg3{^s…o'h-qvq-{B|u[oG1MipI#q7 Oe{ָ~8/&?m1m4n X}2n ԩv[n)ȠAʤr%$sƍˋY.-G jc=6.G!wNiY)ɞdҲN!5)ukw+aZ 8U,fwK eQﯣl+G=ӹsgnFN @7^w3`~Jh [Rhx!mݺOqq1W]u_\s lRƎ3p 9;YS\c:pwKܽz-]tRRR#bw}̛7y恮Su' 5 a=]_l'uq.\Ȋ+PTGHƤI.]H9/ Snٲꘕ5-j IDATwa=0.IBQdee;˽ȓs3Ow [\AZm z̜9N:nn)]D~Eȑ:uB OެA1JJ06l@{B+Vۭ'55vi\G?<_L1$sIdE 0+*WF{$?##Ge?iZf&'h?{fѣGsg;Pu'Sk9H`ljoݞ&O .ZK|'Ļ<ٞ.?c.B-"Z׮]Yh^z=w _x>NKM O3Gyd}}a…\tEi˪&fm=q󎲳cn[yL7y1~p| }&5Mcƌ5J駩i\Q7s~i{6+쮶It^.*OkqK~|u54w}^HIJ!3#GLz-{=>-[HSq 7\ZNN>wyg~lٓ|pNrucEvʹiZ=?77 pWor̨# x9묳bO8wyy^&MdC aر1_hر 4i{jJKeĉ^O!d=49uv}dl*Obk4,ӢCDm4 ڱ5U5۲N<ۏpgC]4m R,Y>?m۶ك\.999ٓ^zq3x`8ܬ5apB>C>C֮]˶mbJOO_~ߟÇsq1tݾG[̟??ʘevf/>`۶m~Űao~õ^Kff˝VQFqI' <-NJ 7@RR}/cǎw=ۛ?Eaj7f};tΊO"|3;$'3oR MӚb>2B^Um%[ЭNK}k_AxHJJj{Iee%,9(4:wlO#I$Yi7ԓeM*hޭ'aNf6?oi^_,/.g4|(B!@q\YĴqUS3!C}jV/?C/X[@H7 :Ac!hҨ[u~qX'~.i]?rYYD!mְi+R xPIM`4qciP&%Q=]:wT:ZuO!BTTvAE"# RYYIrr2{&)) ]mBCPp l8:Ӵ+aT,9 !BIDWtjkk  @:rssׯׯg ѵkWZ w*jMQ)B!v_쐨|B!Bi؈ .`˖-,^>?z#rʴ**\ta!B6` Y$|Mq(#ڨi(iB!hMcXȿ/{fST\dU)0(EB!&~E }r[oѵ'tbC&A!B61JGSȈ߶~P!) !BQ\=^KD#7;o/B%۳-3[umz!DsBq`K"إSW45Vdc_#xE8f}RJ1a !Cț3wg p}>'HuבzT_~9 -yGnn}MnYӦ)? -[4i{ޏV$J+EwX*iWkJ54n-eʋa41,,2TBڍX]S_k8ap<^ZǠTۯە;-+wŕMgTse3W"|9Iq6mw @ݣI`aaa9])mJEP8+5M00L1M4Xa#>uøQrVqd[uJ_ZbPd9%kN/ye˿! caH"؎͚5~~ո{7kп=%'y=wy~_ZZʔ)S8pegclLݴix@F w0r$3c!&MÆU ԬJ7m 523(G6h${ ԡS1|^PS>/ih. L4 _sεߧq>k4hg}6J)Bc_ҥKq]wQ__CHN깫(--:^/ݛ2x`RSS^bh#:{+A4qIib*iXSh7߳hKMeA4 2!!-5$@P'|1f|pnI<$_dޢepI=EqczӞ0Fy'''s뭷ĨQ/@a틾jSZZ㥗^cK6=g(b̞=ٳg8MKRSS;v, .W\b7$R$qLjp4 +e5ٚ1pu~ɘO7~J#kIR&5 H.eۨ@7C}L%Jk*++Zv6Fy9:Aݺ5Mml`QQQ7l|)$z*(E7ǝ~tImz>|N8MI @CCZ)_[X} $q,TV^rT՚t693J) \OO'#ͅRP-HZ:_dSUOK*MKϋh<=b@KN? !3ij|Μ9|'VrY@%n~v4K|15x9w޸QfYڵ4}%KtooʑΌ"(&nam۩hHgFCDyMywa%y}N#?+Dfa2IMrp{ճشu;fSO}̊ ݻ~oNEEyyy9/fE/zHg T @dk0`@4MJJJ}$z*ɿ.M^tFV `3*lhh$Hi5~:[nRSo^tw };grP,rR][вחC_r=Khr=zt>0?~iR=~<:5;=ٚ֬,J0eddp{6e C&c!d4 {.F-ei ELEie^Ply ݮf?l: MsYۭCۯ . 0h9+$S~ijnǴo()EH8߽bP\\̄ `ܹP[[KAAc%9o+/jL;uQ2bhO#KEP8M,714K~n[nn& 0}RYC\04no %/'-4~q+RT}6o~!H:<,ۛ]+k4+c"7ngqv4~rwӣG~7]vnkVJA4q[Y$if=-Pǭ05|[u\ASx 2( i6pO 'Rlߞ|IzXմ_Op..&lU^HZIK9P?Ty>@&~8p`*%mϳe멩/'য়~sItH $q\Y$irqX.|M^V21\ >]HKRTJAA$JIOiTn TMW^^|gq?3O?%駻}A|aӁ5L0\UE/ :cر{vim_(++QF1jԨ6]CO+E[ SA3!3pgNQA^ S>sH$xq1(bwҳzt|t3xPiiVMS~8ۻ>%K0ey晘hq90{lHb à[ZWv6/귿E_\r +WSNqbKtHbGP8MF P&J~ٗ솹lںTO$[mcul c4V@Ii%;/O7u/5|`eڴilݺ7xn /s9 &ϳi&ƌc'ZJ Y9/DU?R? }ʊ8$Jz<Jykg gH,q(Ǐ歷]']y%a0K-_ā=U$vf,A4qPT:j_OIIu f-lٲx\x.rR)(LJj*Y$iZ+?%A;A$'4 ]v!ݰa1bƆ TDe,|ѕ6[5,&.`nv5ddd8E~<;qQC%0=yTю,]Ԛt:,&p! n>}:E:XUUZ-YYs<@}}>"Q])cRN>}{SZ_/DPڛo7ѣGtnxt[7{_e8lo>8E!ٱN`N]9bPlXͦ>a/vACҩk\#7dV#4-2m4D5kXKpn#eX~/j'/)DWd1RNDg[U9}[yU_(44@AOx ڱiPUSɺ-k[HZ$ɓ'S[[kFy9ɓ{o\}ν{5k>}*JCq-ds:x<[nTT(9s?a<۾"]) IDATNDWEQ׾dg̦ &4N"ZxÇ?_\+MdgлKl/DO?WUxGfh_# alLeQ}啸wGKKCUWcls^=9s&^NBŁ=TdTĥ,L_2PZo:0M#j4煏Sʴ7ul 2܁FӴUDZrYg,cӳgϦa?6KO8.]J^}n;s1dƎcDb%R$qljp8,bZ͸Jr5MͅsL>?OFaeA…@EԁG5PTk+O穧jq: .M]wWo7o@vv6կ+9S]O4~ƍͧ;4 &PPPRɶcl"(&~k fT>@^rG׽k +If?au]u]G0Z (((y[4Ə!+ѕ"KA45%~ɵ#}#HEPؒ^EDt,b$[go"(&naY@!*yH.B0 O&ɓR&̜K/" Gȿ$KtHKEPg.*Osql6 UC)p\zz:cCjZUsi\nRsWY9Q&K'(MBtlɶcl"(vW{O#2jX&20nV:&]KOO'/?1Nzz5CNNn$i]KF@IEP=U$vf,%40 @7CTV݃0Lt]G t ## BFxc&.nXɡnX׎ǔP!:ʍ#if˚0|߇01STfҧ[ǘ!s 9hƼW+EwX'["EHb4U>V7 HJJB7mF8)Bt\Iqb!$nEّeB -i`次 ?wV+EIXF `_R("XNMM 555e0cm2XDJΏp#jELCo4`Up k~–)])cRKC/QfJ5 0LK7 |>>ύ2__])ĢqieêRRS(ݸ"TG 1H_sWi#6~BӞ*G;3S7nDav! ?XF.эPmqepba7F-$m5Xd'I]g ϥTѕ6[YYcr\dee2;b܁"NAT3Z*XBmm-l\qAVp ё%R$qljp%̘lL_l'}2ckdPF E!ٱNy1LMԅKuk4sOsp0cZ=MDIӰ""˨a4>0qUe/_Vcq꼱i `!DtFV `CiY߼5,s PCu]7PJ?lx<=^/U(zdJnjVhRKtHKEP8M*є :'    A`Txnk$HJNF400;N*"(DJl;V*ifQ[[CFFf~E'Rl=d켽@מ*G;3p۳Ҳ|d(-Bߞ*BHtFb 4qvԕ# e͆l*ٸBAn'4.>B-ѕ";F,iD?).Qt-FnBĈZV輸4 !D"ʑΌh4 8Vbk#:{+k=Opvzc7lw}(RB8B+EwXrrZrss[}Wiw=KRB8B+E[:NJoj۹zOimxW$B8F+E;?Q裿f/g,a6$͛f}"MBLjH,qwH"(pDW$8N"])B8$BHtHbB8$BHtHbB8$BGHtH $ !!ѕ";N,a<n+ !#ѕ" 8aV?4PZѕ6[YY}/p.[ewFߗ"(pDW$88|~s;?ݝ/I"(p_֐>d;;sԹ~+ϱ_t˿ Y$yIl湉~oc7?3wfI&bI" v%vںj+~UKQEuEk YEVGiY"I~|2s2<ιޚxwqm  HD5gd*w_"R&"*;9(RpQ HeDDD5 b$"""rP DDDDAA19(A"""" HDDDC?YG#"""GA"""" HDDDC]#x+QA"""" HDDD b$"""rP DDDDAA19(A""""PO!""KU=sθiWpǔ Q Vpie8gf ++K{55AEUuDn 9OwO9Ϙa)cUuA"""r8gdaԩ:b:BRMWA"""r8 GLXϢv`RR̗f}Ea$#''!3+\} wx{yCRUdܹ%ƶ/ A"Sp}i&- ՟N7p%2\]]ZA#%"9fhնADU,1 tZ=ڵZu4uttE~ :h_ZuNGbҕ>M"‚`VV66E1-Mk^Gh_aQ D5mh^'a0^^؏^OY~04 E@Ff:2t*_9m[~) z@?J歛 $ H$HlE@ES $ [7QDDT]Tyܟxw,Ԯ],E5+Ro7a%0 3E<3^O>^?nZA0P(a0y+It:4o͞@L6b(vyصog`4@`4"杛hڸ)4:DW!1šk0j("`X ݅-;"&HxN<FƒK-n@"Dž.`]Ha=e䉓~wpU0cGci!GpR)7k6f|}c'ݏB./EX"\k*ڋcD*@Y#ɟ4Q4% h5Z]]1ھHP:)z(ȦJ3{޼j۾Tx|J0/7g_|ի>ǥ ߝ77M#4_D`P 6߈OW//W&ّcidxL3 ӣoH(rNâ!O[/"2g0Ѫ䕺M:k[dN0 ۵c$N.ǣUd:xlLPjDDꋏZƒg_B:LWO[~8>J3Nx c'[T:XFG;nߺ jkWA*AHAJϼ Xuzޠ7{mT"ߩ_ DBѠ~PU* ǬY28`^׮%VOjվ"U5|^BxiuXgD ܼyfۡÇ`s1wS6nߺ / k r?|RƯ+0eT,_  rd7oI7d#KW#11=: Q%)PӔrʶ`p?wG>TAW*Jg̜6R]\@d|J899W&bŲ1x$Cڵ0hS'~}JB*eT'ޙ9ȵDTq~ .#A(dB8 H?_y!;/B'|FѮK<*ûLY_>غ#ު}E I͎L&2&Ųz8qXcL&0qꊕ(r셗7;a0`0﹧Dd]th~Ν>zpuWA(g 4 )_ -LуR3DDѮMܺ} W hur+m:1QQ˿V~h+[DDT A19(A"""" Rۗ 9As",@Gƙ/}y?0iۦ͛///?gd^`+s~~e|B3R?j-^uXU=RIIc8V4V捷]p й'nT0WZc]Ҹqu1[* 鿢Ug. QQB#0A""""G HDDD b$"""rP DTcڱ FbY,7 ؽswe`$kϿJ$\J/;A"ƌF#>d$%%grb B¬?svGDT1Q%JLINAp Pvb$j[ϮطgŲ`$'bl޳}$"9|[,kӶ5Ο$۹4аPHZXlw(0>jgUw DT:<+DFz=cf=<= H+.-Rݳ{v.#=+Dڗsj A"Nx +Xֽg7ݳb3ϏF^^mӨh + /Y:Q%@-v"5hXjRXm6w/8{鸗v!R } oo/]vEGrR2DQd|.OdgSCsDDUHE o9SFZZza<9) .ҕKz= 2 gqqir^^^J\.G^^iwqmVVѺ]+ h!J xK׬n0ٽs7"DDXуӲU ,_)Z-Ǭ<$4㗟wG{); vNB}BTh4+,‚ׂ @.ڵkz-= ''"AtCźpu5 QM=.!ʓK>X{ oOt'ex#xꩧP(`0Lu/ZZ VnkVߐڵkcśLENN-`Ɣxwm];wQu HDg 7[,oy͈ݼ#F'Zi8Ka^X#"t:РAF `;[E .iv *J{X3rss-̌L yrF=7 ͚786"A*]Xj)<7:_WYd3t j2pq%Tf-YQj0i$:qf7*~&Z^3X\KX3nՆQ\ ,c'9xATBחyXZrssѦMlۺ:ZbN`ޜzꗈǔ7QiwƊe+q^:<<=m3{ : Z{٣(,NL&C`` ~ M# Jp1݌s ^bt/׹ץM!8C}uN%\0_LtANvً/ZҕKph߾=6;kںϞPhV1^?V,avv66lO>x)P{nXf5T*Rt(,WeK@VV&Xjj +oʰ΄A*M Z* :;y6oY6/WyfUp`[lg2%f3A4V"<=q0* 7Z7hRxSH DT)C铧1N.pI3۳4\0Y^ѠyTs8qѭZV-KD53Y2u*j?'WyWA"4g QM3e!\֙@kroA[jԩS ^A3U_ GLXעv`RR̗v۾p0U-ZPw~-- .!lа.'\;ܹs}ipFd׎]/ ApH0BBOSBL.+2pif-2ޗv㈥X[VUt+=&MLDrR2d,ZXA"*DhX(ͱߏ#9)86A&h/Qh֨y?DT9<~?u{t f^Z:T*Y1{[Y3#hO4 _'̌ ;"~K$Z,Iй}?`4#^Tfi7o:UV6s-?u;%3<P͚w8q"Ჰ 7bl(t^zuD_V˶ T AL;E7.\f]ƶ{kXdZ coۮ7U?/ZX`v+ V:CG *XKRA'ùsxp䷣ֽ+r󐓓~AuվΞ9-AD@VV6hoSq"޹ HTN%AB:@vwgpi8b_q hؤ> غs A(xfl Ç1k X׵}lóF#+:>^:CG)WrHڲrDfQ0ax|tJ%T*n\__;kծFjj=y«X/ ԭǨgFV%>BZfm?K"aI3h+ Z:&ܹ!"OZ`8ޟ;#GJ Ap~<[XetNZ^Q# ~ {⅟ ++n0///zܼy>''!n{vj*T|?Q_vbZ!텬,S+ue bz}EQ u1 DT>:AfVF!x7vvvƈيгw90H>d<P*1vKx'fWFڛTS07Էq5Th׾z?A6C?Θ-s]!,%-~] THD՞bߘU="HKZ Q| =iiiɬ2ph-__իWcS //V9.^[[vjuGͥTx θib1b9"*K HNLAJr '''~~4uhTjtA;hc.M+kKQ" 33!JpElڸ!) FƍpvDDAden#8$;wDhX(T*WIBB.v6KX+>!PE">>uֆT"E=`?d ))Iɸtv܍|X1'GDT DT&^Z.HЪu4._phZM*BjaYX컗`]*V*8rƌ @_rSYTS4jZS""t096[cFѴ{`0_pg`MI-+P( T oH$rdC[G`uA"4ANLfs B=}*퍤-+m+^DD6  6IDϠKM#1 "J ("u4]''RVֱⳀ@pqqբDo1Dam¼ye, A"0ػgQhߡ-`.lAk / A*HQ/d2} ztC]M7&)i*<F KF\MM(V0 HDػg/${nxW h݌4 77׬VҌZiCbE⯽{nDn \^+}?f"7Cѵ{Rȑun_=X DT./ZO=Zd2=K.ŤIp}SYEr9J% 77tkwFyyyHHHO?LL ᅗw^\</Mcy9RȪ \&L_b` $#;;@g nի ggg--ޞ $^^^o@_rr(fcnѭ[꼈=OƠc$J'W14̘>999%n;Z--[l(ALARaСpwwGfffeόJݻwq?7"p9tM"DTcp0U_~ޅ>-puu{%(XbJ%ի:u !!!PTXr%߿_䙿v ZET*l޼nnp޹*0Q8'&4 .]¨gGBcػw/4 T*vn S `ڵ R T₰0[ tg齭8x D6FhP8)26 &<_Y_/Q7+X0TȦX*3g+[$"x DT~݆6nk0خc[L&>#tSh[n߾(CkаaC4mw)Rxnnn[.7tQ*7߬ۈ3Δ""z޹7Ro`ٵc7} 񲅈;qA9+ <<ׯ_ݻw!55M4> C*H tQb㺍8|7XݻiU>G*MvV6 kz$@re9uIFvV6d2k#n݂3Q7."E||!F2 J%29N H$޹u_{XϜ:wУWJ*XJFDTqz x%^I•fKxgjޠGdH4h?h_֨5DfF&j5E6<<= 1=zN d27ˊ|nGzmHdqH+K!"" DTmXc'5;p1J ((0 صcG4οѳ <6PB}.\{@ dR)CDoVNKW`y{DDU$jEDd{{nEI$d2_>>>PTpss nn* 4nM7CTB`}3&+ĉ U gaҫ-ufvپáT*5)vzB( z.'\UUKZ9SgO@o)ƽ0)KKKËϼ^ž]ܥ& ^oϡ;cرg; 7QÞA6cv|KDFF~[p_ܬC]?᧝P5X"R_xBlXkZ8Q̘^}س"琛k""""v F=2()=aKMnƕWp5Gܸ~ O>HNN%q5ܸ~  FOzo܄w͛HNJFJr~z_ܽs~))HIN7 HwomD1CXAhݦfN{II8vV,[! löq5̛3нg7ӹ%\LF)DDDD<=\>A@Z Aԓ|B3b'~K/A"0(GQgNfƅz`kZaQA}y -Yo OOL<CG =s3\\]0u<9 ܾfQM۵ ?k6vl߁lThۮ <,wg1^4}A?nâh" ~ ?vS^1^4G"""jk䤄D"N IDAT d2*W(LDDDDT3?yYٙhX1R)_<_?4mD*Ev] o[y#"""T \\L n(]"DDDDT}E4Q4B&;!HHRm 0n)X`. 9({.˭+zDDDD?Q(۫ fIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/credits.html0000664000175000017500000000757013203343735022554 0ustar jomajoma QSSTV: Credits
Credits

This document contains references to Easypal (by VK4AES). Erik Sundstrup was kind enough to give me permission to use the extended BSR functionality and the DRM Hybrid mode. Easypal was used extensively to test my program.

vk4aes.jpg



Erik is now silent key as of 14th march 2015. We will miss him.
I hope there will be other OM's that take up the maintenance,enhancements and development of EasyPal so that people running Windows will continue to enjoy his software.

qsstv_9.2.6/qsstv/documentation/manual/manual/vk4aes.jpg0000664000175000017500000002634113203343735022125 0ustar jomajomaJFIF ( &!1"%)+...383,7(-.+  4$ $,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"L !1A"Qaq2Bbr#R$T3CSs4c5d,!1AQ2aq"BR ?᫢ .62`ȑGR=aWToHœ'b: ˷($ۘA\`ݜM+YP*mK|^> VѬ%˸{mJ'R;#} /Zͥkn[l25 r;AGU'efThTSpԳe9A 骏es/՛͐JkqOVD fQ;0]vU۸hA#USF/ Y[U "vnܽ*Į`H"4'OG8$4:Amw՗bI.<1)tg-tom?`WxM@ڶu5gI/=ͯFlvaLk.[%S IlF%r_k@ΒtZ{'O*|1Xͫx2?wtێ90"`lJg?D4..V#^rIW\D:zȞSR=yё 6^mFJVIګw `qMI7@,RQ* ]Ӌ>?D|tx2d5A$:#\1&^Fm69j}u%ayBPhg?h3r?ZƒrM ie*:+8QZͥ0K$hI'RIM r {1Sqy(9+lBiÄXk4U{㇣GCiQ\Yٺn W)C:AlpDM/ae?^GnZXA-C$:W`dTқ'׃#<@L}j!Io4gNrܻ`?^b.4e1@xE u3AMq>P+|i\zͰeqr*@!'ii=݅fueˀp78bZ뺜C3\|Xʢ8[RX(RRŬg7-Lnr DX)6zsRëR#I#NUh7+MVf׳F2ǮscD6qBIc3i?GzF%)D$,nٰYHsG#z#6lHHX~v^ ŕչ0"|Lp߄˖aQ֑靅~1VY mL$o"iV=ȝ;I>ͽ敽ymal euҤ,d`T?EL "3Q:wjJѕ{_"-ܱ? HȐ̚scfecM4qiuLzV )]pq"E>=کJ@qV4&(y =ymIY8}sT~9u2 rGFWfrټAHUS)kMxQ1hBHbXD֣;qS[=[ŕؠR`IZP-u C  0]rS #Frzʢ `AypT=832) g7i%=r2]{NLwiNL^ŁWOz=&/p-n(#0`+ NԸ7NH6e=9Кv!ɴ;֝d~7ZBdncv7BEN5Bq̭vn'*zjƱ1&-Ay2NƃJ=:t𵁶M ʽs+DiHT~K$ aO9+5%微9LE f'N.JY[PL()bgmD}7m8of^\#>N>=v~%[%8-lVt_?]ψCw>#KjOeKY E'"?'jcűMp$ݸ*qt@q:O쨼o a]7unT!< >&<`9=U"3d19F]/j6HPs  jٖ $j df]H6>t{xtC4I.B#OVpw6: zOTa]`k(@ȍ}+~[O}D pW | & 1ꪐW۴n7Ro>K͔di<֪?{ -;Êj6c i= TH0g3杴תP1x s ł_⸃?i0 0-2YpM BĒ~U!".o)] PIm8! GVouq,dݸAGV /lIz|Q/_lB3S4ji2Ț+KPjOp\aB3It,NM*ݵO8@" >jgDl%/[Ke\H#AwZ> ӈiueèb)޴ g}7]o}7BN[h ugbWdx|җQ}dʳ' ᜺D|uD!#s lYkbqjF.(0ܻ(O*XQ_7|H,rڛ 6$yiEp($ڛ۾lWTcۼhKب, Ğǩ%iw ɾ 'Pqć:w<ƴz4ۡ{7In`uţuҠ`=Wet;9O.1 [APDd@24e?U5˶fAaTeю~_xWiξEnX;sklR16d}cKvvŅEw Ӱc/5ВH 4e9L/z-[ܠ0-=NsZzOFDWSuҮT64P6C4YǸo*1{M(!nyWBaxMu@[iz<)֐X-lj}6ԡ*f岭 .NTIlRٍNn) ъnyjUN%5/WNȅM湦}#RQXW  4&'R$kDZInоM4ś#J;x3OYg]hMyߣyn:9_.ӎ c+K]hLf0{b@!nV)|y3>OUuJn39spDnW<  Eܤo_I γn%!(K`$'R@: "Ic}fgj MDq˛t{}ST;n*`FR'_,Zqu ]32였9lg#Tn_IMNVRݠ:.zQxV5*QW CJ.8;1HGV{oR5i8캕>DRd8Wnr `4׺n:jLZmUA؈>GJᜭG0˧C3/'f]ĕ&䬔+xvwbTKM1M?ڰvv:)%Nu˷֙٣C e"I1O-C|t7xwƾ<%S ^2ڏ?UKF\mu$vcTٻ3(h]"}?)Wx'dwCpU+MYg)'+2uqVoˇ80MMՁ]>Ug|cizyvvۿ)GնlMROVOѝHuvf1>S[V3$@n \{vxۭH`p b}w7._-Ms'ZnOEYZRC0u5XռC[,+%Lk}R +pr@ȄNh|އaҏZ=9-:X\ &"u:+ v3ϸ@W?=G)*7.(i,KL r+;>g h؟Ri-3Zx(.U oof,-\Hoݬ}Ozs3aޒLIK ge?v \QEzUǮXs"cX6:qx]i/ې̪nN_E|k^ 1[]MH"ȝ7}Ŭd[$M%^Caǃ I*Yӟ*_K+[9eévy尨$'S4ۋ7cx)^_r _L7s Zx/6i=xEӡq'q\6SqW񊍿2dE2 b{v呑Y f3UoN40; ҞZ`]QݻIuV#%\ĶP6Q$˺nO3H}0p溧57XF[fZr#zuf;Q bPt#Έo7 |[SIm zվaH='V9'´͖~bMr:lJ趡Ԭ .r  k^6ώ^ٝ{Y:\f$`gw]E>իdM!tܪA;CI[=}k:6~ڬJ{jJcM;:9-..{.-}srҝtuIt" ~5Ÿv/+7C PTldgQN[TCp3L GV)i .Ȟq&͋gAb6Q7|ky*H \g:sʢ>t/ {ȁ"4ww^p-lDit'Ќ:!)R#&LC-:X0 Npk'^.wIj/FbJܸ6gyR*).o~L055&y:Cf+غ"FAщҫtƁdB`׭~~{VnY6)?Y:DFX}f+1ݙg:"*#pkvɵaٳe3d 4vΌN,g@_ఫjTےI2I'V$$Iֺ-.-Ad}&$w$i|xF/sΫl0.Ng_K&|rc*CK;bvjֳ+t&4.W|}P]j:ф|l[nċjz3u*;}"P`yS\Bo:]NÔԁ&]Z @ԟЦr†<܉ D"k<8ed'B2iVyC,@$ʍH~P6NN[k6vRM w9Οp ~PGIROJ@_>~z!ZV)]5U~ U`ɸ9x6tevd}%j7qE0H277n2mo}! V ҽ@;|遌/'̓$"ѽCb0xFÕ-N4-=UќE&aޝpeB5T^dbt=glT2NTUaD`3ǴAm*7%F"($s̝z|8m 9I=䬮t٭OJ'HbGwN0a. jup}lq ioxaLi&Kbf3Op^^Yˀ*lApR| 0) z:{L>h*?N"u3~ 8(6^Qr(B}?TU[{׉!ʐ۸yNF3 M!vpY9,0نmHHV]:3ѻXTD;G%Ve[E :L;~0oH=( 9fFR֭:3jnP:f!tD H=.y+ʒƣqh4P}K}>^i܅"╤/5! uo}W-}:s;jH "6:m{\xw* M'I>Bw6¶Ʉc<n [JYý h _9pT,djNQ#7wXvWVR$W>#\ÅSH$FP vԝj nAޏpj۫!6;1` ?7 `襃4j D16Ahebei'-ʂ?bǰ(Y*jkv,\s(3( |5bH>ZHcc78WGTKDG~Nƥ/a.KO&;x؎DmT2n GOE8`˸#Om.vɼr5&N_Wh75wipr2M;㘪n-bsuǎC5Y!2-ە_{ϐ +tũ 73Ɩqʂ@;M8Iwq%}:5fm٨6 #*o_7 X{-koR=!&tHٺCRaW/ƦRjou͉NT}"?Ƭe>?ޔp;V5[" 0@Tn;1}o*:_>L-Xk-U;I5ח}wҫnܘb$j4MiG;y&"eiY/О %0ru 1߹ղئRNҕ͝5RmIO}*XIxf++{g~4tbSk朵3ik}7Bc}7BgZz#ƚ9\'ljE_cí]¹ʗ- f`9}< {B[Wmy04毉cr-*KCp i[\pty34rE^2Ib+L#x;kKRҫ#蓝JInαvۉmF25ǜqYb|Ƣbz'`[wuBΠq XUg y,-qb=ܸcim&$4 Ӹ^-Xhw{*=S9'\g] W\+=)w2I>gƌ4PD;Rӥ(4ÁJr5: oϐN:wR7T.ᦾoh@$pRXL1BLy@^~XxGv O1RSfe@с'έ#(G9@y|#,Opvt7_CH!cϘ+6957JMBc߶+j .6ÚD1}{,m%Fd@kk<Pe4ՙكP!R1{@1ɩ\QN#BŗqMQu[]~hm?msP 0msdKϏhҸ{FT/h aVhKזU 4W"TѲaݩ!{*;szCaNje?}W+FF)2.!Oy$i֑HeiV  <ҕݪjs@[b"cL5Z$eu^#Ք5 #O@ Crh+>u0KpNУ1>J9E-OgI5QaB)h ({Μ`˾@-K(3JDZ} Įf2P1lp 0'c 9VYAb}+\ ͒0V@!eަi-e*D{9P1EP'Q+E*bųtMXsZWώmh'm|4KNs4 ¯ %$}*s KrNc{\{yT~U.C 0WqxS­eTM{%QqXo߯MahA+ {ӡYG')wqP^nGx;?1ԟxU3i'jꞯk8c5wVS mw6|UaZ谾ֿFɫ&K%?IZ{*@tއTr*~ Z Kg@{g Gx${j*ZEwfI k#OL Ex8Ň}w?+O[Qa 0V/I#uߏ)^F9;,}OThӬ`Qnc)/@ n?LX@'X;U?ⲂO=ꩉ5E4p<7m}?,y'@?~蟾+S>d6y`So>2_WhP?]f_kj(Ьu?殷CpF&>ҡB:6?BtKzٞ>z!YPltc NoĹPz;K?Bn~%? |PF70|A>w}w(QHVp}~j?BﳿOW?gBm^\?gPm^~ηj-7\EڽUl ?5 [ ,{wf5B W(Ql) xQ[XWhRoXE[`(v (qsstv_9.2.6/qsstv/documentation/manual/manual/externalprog.html0000664000175000017500000000762513203343735023632 0ustar jomajoma QSSTV: External Programs
External Programs

QSSTV can interface with other programs.

Flrig see flrigconfig



Cqrlog: QSSTV (when in DRM mode) sends the following information to Cqrlog:

  • program: identifies QSSTV
  • version: protocol version
  • date: based on UTC
  • time: based on UTC (time when the images is correctly received)
  • endtime: based on UTC (always = time)
  • call: call sign of the received station
  • mhz: frequency in MHz
  • mode: SSTV (ADIF restriction: there is no DSSTV nor DRM specified in ADIF, SSTV is the closest match)
  • notes: contains file name, DRM mode information (i.e mode, QAM, protection.. hybrid)



  • Setup:

    cqrlog1.png


  • Do not enable Run Fldigi ...
  • Start Cqrlog and select Remote mode for Fldigi
  • If you want to see the QSO's: Select "Show QSO list" from the file menu.

    cqrlog2.png

    Note: Unless you configured the Automatic refresh, you will only see the QSO's if you hit the Refresh button.
qsstv_9.2.6/qsstv/documentation/manual/manual/cqrlog1.png0000664000175000017500000007454013203343735022310 0ustar jomajomaPNG  IHDRUEatsBITOtEXtSoftwaregnome-screenshot> IDATxw|26iNBJ!2U%XD@d_P KT(mR6Nq:4-x瞻OrDnn. Bfl BB!s6m.i[i-n2BS >X@MSGxׇQݸlp+;zÆڰ+//P5`2ImԱh}1!Z6 2疿2/WLJ/LJ uvq nXHWWww6iP\laHRU,3ӥ!|?iJJ峺 eOmzW`?e̲ cLV\c\'xLo^sT~l܊ti+v2z^|}}D@@Pc?&®͑bSأ$AQq*4`{s[7m;zxEOۡI6}wjnZRbja9!r yk1HrB(o=Ϛ|MQӇD/m(R!"پ!\BbW 4ED\V.=FM9 g70P@ y7wlB5_W<*_O@:"|` H ,'ƺq9bR'|6ך)eݬ)Vq3j#0`3Q[8#bY6֛_t]o; |0P]avRw׹#P+׀jU%9p*?͓d~N/!f;u=YX 8gI6 c|Rg*2<[gwwg=b`ghS{wt խr^[soAڷ;vP늭s B'i}^$ƞ~-KBN]%*{C!#W [py7׼1tMRzMrR}c&A_?_U2g}*I!R32~vw[()ժ3`'}:t5IK~3I#( cy7 uu$-vCy~Xn 3K ѱF׌BF M?V8a&J*O\QWήq]vVM|v^%bm_!цM9j3 eE(`,e(7/__w^`Ia 8< XAui]:{Bzj`g? GW|6TU6AI@4(.Y}8We+dn>2zݥuvBBZM ;k7{|398l˾ ÆKAC: p?{H씧WS_N|=@FzRIB}{^XHg2_I@K}\8spO6;ϦKW7O&p犯ڙ&;/HlF(?Yb\u!d>z'#,3W ?l?Kk{VZ6#k+8 ) ]'kDjZ,*4AzRѪ9Q++R9$ET )'553~ ]D,Y^LYRӪӥ`yI.t3ky[xq]Zg! jFS':dз?i:YZ/^9G8:[%`nx7vBUj)MseZ -YֹH:z?B!c!P!9BaC!dgݔXV/a2,w=?YYmެQktQ_, >Qea[ u" WUKk9XCVzf5N1P1;};}իn;// S㗬㟡_F!$)`!9BaC!d0!2GB#!?BkQBLY?BLYpBi? !L!Z!2K43 !LaZR.BLYwB!PKOB4vgi劄;q1,\| xS7DyWry6Ts!< Qh1/^lCܾ0LN={k ܾMbJ^=a^~m̃)ʌ'RǢ>X@MSGx@,%FX(n\~TڤE*MٛZDUyhA㿬tlIfTf޸weWFTŵv/r[~wqnN !9RROjV3 ):H:טet?-7P"nnu~O~ 1>k͔nσU ^Ғ{^Xǿ P܌Z wxgԖE7N׻߫{ ecEoڵӠ?w^ڵa]~ïMu`uWd`c_Fʹ/2k-+q<}?.g\c~8i< t͋ sNT[mZݽbu9[>y8k}Tڭ)k| \9K搖{@3_PyZR:TΓ]~;St ͫF1V3/PlT_Uk@e8m  ȯ]YvǎYj^` 6΁^\$M?ykׯe}\"Wo*Spku'/PHwGW!sӒ8z*Tٵ""Ρk" Ъ57( Xcb2@RQ&U_!цM9jƷe,B筚Om$*zʾ"')0"@0,QKr֐ zj T|y<>9,Ց GW|6n2+:#6vվRul` ^(58 Mj3ZPFb(uh4Yi6{J"&=Үw7?0iM}XIu_dEw,w2\>gRv2]v6=DžnTU#'˲ S?9s,pt$K4B鴠?&4%firdAX1SWFU=_DZZ2*`_!Bu'B!xjD7!2GB#!?BB!sVc^?uٌZhmBڼ+W0!"oZbb;ǝba*FVUzo kfLQf\<齍tWçK(ioxQ ү Spn+K*ξ=a]m)W`FF X&-`CrԬbIkJ uvq cA!_k?jJJ峺 eOOݺrҗs{}v5-ENݹ=g '7ڑN\elQ_c7O0YMgk,CJ|sB6no*#69U?{6;$WI ipjcll4ГII@im6y7 u5ר&32~vw:#>Q- v2TBjm—\V&+2:B> rtڿ+ ) F X#"k=2I$N:y{{9> ~HIHwëmAXQkB}8WeV>2Ɉ/|dxe>Tei{/HZBFhOG'<{PpN9x8uGjɞ\^;/HlpFEPt?a%ݧ _c\QvҦPaRԪ]C&Zɿ|㾻~B5.tfoZd>NB HIY3cq@MСjgꕂȟV.K,`7p 4ڽ+7u efgffeʄn BREYFV&ȥnK_ZZk;'ܑC=j$j5INM1XLH/SzqZ+d!R{)Q6?J°,"?2t&HnËefg6M[n^{w@ kJ[}#B`aQZZ Ae[1XXٶt_HRUM,{wOW?AC&؋cfFbS^^i Hl8G[KhVwJIK>B~81 nzhi50Z#9ì2fǶX_CG!d> X5d ^ᪿ+n,^]<%'~=W,0mM:0-[_KsSN=YУe&NW[R/2+uu*fYtt*I,M7~'$*,}A&7zD%`cfÁՓ9ٓ("li3\JqKv.vBxҐ\:XM][Ǧ*Hqq3?mi'pWo?dF;d>j * 082.vͿu!&q9>b \E4!j_A_\v็xRܸioGӮQB~ܣVPt%u}-g$ [&?H."aKtY>Xj_|fOzX.V?jˆPUƎzsIOVòzzr@[xiL <ҙ|=?e1=lt 'jA1/?Vu&R/V+V,`?Nx˲LA̮?gOBxwʂf?BmLOeYgʂw]*#C(OKx*>ݱ7{vqQ_RY7ǛǼ;zrʓo3AXm#%z䯟-s4 @ a!0!u?\ݽ; o-:~޻,[%1,) IDAT OTNc-Dr= b{մCCEdӿ>nã\=Γd9yp6Z~ďa~g\Kcc' ϒX MVnyYN.ԩ*/g4W8e)ǐގI>|ϕfY :3K[?ZtؽQwp$Hz ~Nj2 ? E4uX8)ᆀ)/NbA=L6BT,l0~Ÿl' p3Fb2 ׀vvj?-' {F~aU߯O}Q)-D]`"Ud=)r0 87!}B#@Qv+|K^?=Wag۶|^B ВOuA嵙HDL 4e>F-Z#|q;Z<~s4ʂ‚v횲V,,, !5 umIAA aiUcxr\b-i,hǿddz{`Dvdjvr$ S`FѨj#7Idi?uRl rƦaZ6>Z ZOd2L!Z;ejFit8hpA!T/m$wBK?LK"2-D!2G?(C!dR&,?BȴLYpBB!:$@BdȂOBLbC!dZ#!B-?BB!s!9BaC!d}cX9a0WQ Y׮QFjtQͬ*5zɋY{EXs5dgV#%xY~1fo@>/zխ7bVx_F4Mw nZBz'B!s!9BaC!d0!2GB#!?BB!s!9BaC!d0!2GB#!?BB!s!94w/ߤ"{-qI5mB!TK3?&ITqٴi+7ǹMZ8-A$/Ĥ:Nl5SʺYSlEU}Q K7:e9o%j{Ϡ+JPtv[XEmݲ,}`a bu^ʵu1&>gB{L\z~g#Ojmf%G`Og?/*_qZG>%Io繿l7M6v4yK6^֏}S!-el;tT&|۬bV9f2f֍mGl: `ԫ ;OwkvSw~Oh|/'y\?=kc ,gKאn^\ e^s1;~Msۼ-Y!;N_!#˒.'~NڻW426ӅoW~־ݱcZ908 g9x_{:,Ơ&-J/8hԥHHr:/D[!>[rzm[OʇP_f2FjjU\s[9ڸZg~6\ef:b/ƱqҜR*Cu@ixCJ!u-Rbnv뤡NyV,G_3:!Cj] Z( h  lҢcSyHӍw--%&yczwf[F}UP΂00gb6-\}F?|!ԗB/VWAءcG0X"tު)ܧH|se$@zj+SYi4 ˹}:_+nX}Hq)4 @px,(}k^%JgU唕,p{mc_~av+=g '7ڑN\nUL?GKɄ| ty">>Gѱ6p,VL%BuUqUu'gիj'ҺۨK9s-,Ky >nW=-V_Ht Qsѝ`eҗ&ٞ^{OLyBǃҼ2_y'qѤ??aa| 树f?R6ve_aC\Efr!&n+a:vwyIDlBE!vv-]߫RЗglLHoR}0ه;W|͝<ȝ}G4yAb%ѝ`JYIBeU4>vcgJU"aj& 'fZMr?l?Kk{V(h֚EX=Ǹۺ{#5V- xo [n _w_w\ac}oJh?v@B3eJADONKw0ޛ*4hg]Y+$ ,RhxǕs<6:Uթ=zzL9SRsC;!\9?'Ϳ| ]|EUK!|VjJnͧG׽Ev={n^=Vy,wԴrZ mzO/}_uS\bRw2\>gRv2֓ʲ'3BkUfO.қ|R8|co[]ܼ0%* 'Q< .d(!>!Ms@(+.mo+kf"y bT9i4b%ֶϦx ZZX4Bs8z_(}t\@!qaG0}tݜrݺ9~ܫ0疿2WLJ/9>wzk9){t罇ӡ᳅揬U@2yОO)3 JURJo>_hoA ѱ1}z&:S`:w748c-;o -kG\)XiZ'R; )UP}:ϩ+ylghU%9p*?͓PG)*h¯Q`W9 'Юm1y -jњ_l%vj$)GZ);"EUnyc#MEAӾ7F_uIVmozWUǪuyPx\XdP긐x3oqleɵ6#1F-[*0 y dn9-KJD*-uhHH+=MNCZ|JYOp𰭼nwnkfXǡk"}=B[!eӮ?f@i'vҐ^1L+-48o7ok:8Rڽs^s>y}lK>~5wv?[H+Icgm`o9@aոgQ>]}4[ν>ȂKP}mHqMO`|Tj.C-@EBj''IQ!:wҔm-j̲vp'>E*y }⺏ wv3"oqړV[ܫ[ eY8?DVb>_Jэ$(d]?v<>-mk mz[w~M;3v/X~Nvo7П?~_ ٯ5YWGN91G7.PBv!>z/Qdo+{|LQbe)yVIiQӵF="o~nljѫFVˑV-Wry:ibj5 yy '/ڼƸ~B3ҹ_Xv{^e[ՕyO/tAfͭ1bŐSU`LiEq\RR) VR~FS?>#l6TGr`y/oܕROUiϮ?ek-ȼ-Ȑ5cwf:d15qNNZoռymG_q[-o d}@6}೼Mal=TfdSYujJZ"(bJD~WF|Nכ0B.-2oqvJy@1k*[WJ3ޟ@Yӌ*`5tRmeZPVN~hE2-jf21eUF|J|*v| ~?Z8[ (z!9BaC!d0!2GB#!?BB!s!9j)V>G4s[1/ pt&-`CrԬbI/Rg 2c9l$RGBVV-zv+mޕ#q9 eB>KNM%^S͊$IEZrqV{}Mεy~716~oYxCkMIY^De"-ð,kX [IŢU2sJT 578SXDDhly魛JRsl=<颧I6}w6?P#2@ n~C.Zmz4AޢhPln'䘜)Q eLnGbQG)zwdX7.<9\(fg/O^0ξqjC]*oX"d܉>6Mgs]+cC5T[>ЉG$@W+Iny ׎:Kv=Oo><P?6b˘eƼ2f4ͥiU+ډI *Fb*fXiOAh9wwXB]%11{O^7o#|^ (vǯi'xp,ɦUPaDսp oWBm@3?[Zs{f?6AjE9 Į32~v7R;aCFzѼ4~!dX3?uIICɯYɜ- )KX{w.))[Z7t`/UXFIQDC@fE4r!dX3io++U[n1Minvdv,wccx[*me+e>TOc^2ȿif 3S=o ʊ_dVs76@UPñ,R5ێҔ[{dAXg~B%o IDAT-z1[Ba&3;3--M6;::J$h͌e2"SXeryƿ'3;33+T&X4w[K,#+RE5Tfvfn^ms,޹wdGTOZ4vN2#6}Dp8ɩ)]zFX$n;}̌X$ak}* ò 4w[^trvۃj+SHl˛!a fƿև Eiii5M{@F ,,b/49<ƿV hpc U[9e15%!A-miEd{+²,M_+D 6#aMa7j՝ Yy9yY`g`#i|uMF^6Q^U3r>kEtIs]{:!lUYS7?Uӽ>x{K/u\6zwMhFx/j\-"e_["H\Z_w쑞]Jh=lj,Ƅ4Y~ry'C5Fs roƧ` ĹaQ?; wǤ \B~IQufqF$Z>P[$>|[@̙?܉ BTUk:efm-vAT/0o%UƒAؖ!B aB_'2M},_hqڅ^~"5ϧih4R^TRxڅm{FGǔwTĀu%?. סݺpzEoC'Ɂ2^1q:?Y*l,O[2Y܎&B`ϧ *8쒏lgV?mxGt-jf>u[5ǧҭ[k YѿKjb,^=范uUvk_ozr^Tqa(/WX~~MF~+;PbmkaLx< --,\{VK!9SX9mi6Zazcc##0UʐC8bFPͥ (WmE{~sRl_~۾ Xaީ߭Ӓ16 Zm%|P(4OaX`k}is:YZc! \O|'-Xis /L~~H$=j[f4sKNM s---I/ONMph*59׮I-ӧ'T$A;Y֘z,u:o֞opB&zB1߷aչo[y NFb/M,2Ui[Mm{LkgY×_,DBx^;yxAa_,kee5dk@gO񯤬Xf/R2{YfN[7m;zxEU6Iyac R{Fy[R!"eb~T\ ' 6}卯>?62r#@~=XT+?>$ ɾoC-_S+o0>fW*ԑ]- ~ZpLT8YBlF(dbrɳ[BLFplty`VmdY[_y?)ǞSU-Itvy;Ot-ц5x2ԩEEBW^l|BS(V6<.OΦHJ,y{}(fg/O^0ξqjçĖ^\iY_Ets{ D>Y5֍ Fo𱶖lVv;jE|tDiS u'!xGDFՔ/Ui=._ @Of]w/{<"7jsnp Vonߥ/Qԑ3^. #p>?WpWPB>h)94iXiZtLA̞_{bW*d~N/!f;u=" l:yN<~-C*6*gc=FY9vu/J|̗v|$)>4_!ppKYDWgW^iRkk!}ᑲ;cridF꺭C~uo(fvgمeO`CAEL+++-ʫ 3MM-$1#^3B35X]y9e]~gf}f~<3mb?e0U:W#|~X=E2w |yRa;M_4]+QŇ>cI-=l$:P޽*?_^ܻ>n~7wc/otvno[~ڋ$Kqyxpie:;!'6_R{Y56tL~뺍?(o9gpKLWT eU㟑1\{|3WaQ~ V>_nTJ{'S U&U[2FΌNLѧ>/s?2U7Uh4A9R*P![˺杩 GM!hҁ9MG.[Qtc QPOWO,f 7߮sB4fכPf. nLwJ[4ݷMXrgkdt&bרظ|R&7p A~uYi_b{vr߱o݊{ 3(C3ztxy h@#J A}BJ:|Çӥݖ8[77QUGɻMZmF4kvKL/Ǯpg?KqaI pr<PyE$2z5DZ]L!Hl> %tfҲ~n^~]ߍm QM͛ώ#x9(sgܸcY-/o$b[k?W[S]L /1*_鍁v ﺭw (G%=t 7&Dvv^K;Fv ._ltpr*ZBZ6`&^YmKjJNM6Z9"aX40x&s0u܄797Yq>xIB]7WvݶnLʦ lbgc=]>g0? )ykʍSzj7!s/nYKv[&i-_o)E@DJ珇a}bXI)I NT%CzҕKm#kFDu, t:Nh4xY]Bb_n{ SO;cf}^}H(r84*@Q.Q)̀[CЃaZmR4*G6dt:J%Bi6J՘BGzFH(:pm]*Q)24c͆ b[B<[h 8  E5-ꛙ˱6HLǏJJJl].wƺj)o/eir7yRJ P(Rn}?2K7t:WWwї=e4j5X9-?:H$pMJeX uK$ExDј:RţR\.o h4/ϙfƻoы+XL@!6K7i!VߑCAaQ= iBB!{!=BaC!d_-/]d~i>̳dNb)7-T>#Y >Pi3ЖeD}Z W/[$?AԊ]]le#*N}a8XjVESz 񛂱]jGLWcL`>j`p3jT=x6PczYpgRY=Qe T"a'B!{!=BaC!d0!GB#!?BB!{!=g.sx͚Ri49EdB(ъ?եҿ8"ﰗ^7L n~3T'#}ؒ~Y[K@!jir ɰS8s^i\n 埋gw6zZG?FȣQ--XN3xQ,YqφD;hB(l)m2D@Ow>2" !/C]T3* nպGoqjrOw+:vP~UෝfQ/W6ظ.wOV]K7_HS$!}L]=y< =rYo n)B5 qrA])O_7#G9tdP_w6_#?RD1"w9ǸO'Ao7.Yz|”[9~Ϳupuz7U;jǥ!!Ћѩ >~llN.[!dyYO2=er'VQTXXc$##nr+eGmUF jd222|<l3#i5v:́5.*ʫ704m0eo WxH|("ehd_2 jd9:꥘K,..>rPaaAy rtr›Y?1x^C5zs93zJQq#?:r <$5Yi  j\pz J#y =TTTT)xbD k;|\EH$>lK^^ޡ#?O `=AL&UcaNnH$~c`ޔHyyJBYKY+)I?k(IPaFK6?*NlAsMh/aYg x_1ZKE{>]}o]t?$nJnY;{? +7+Tl{o)oGĢc?~U}}'$W%=w6ey6܏O% _ VWOx\ҩmи8x%H+ٷ+=-зUԠ_m.d]p>=GM'".z߮W}[^AuW}GZg+dX?ӟkYs;wVN\uc]{3Q jb":c `#:/!vF̡ 5+PJ'_#ِ`|Z̴j<0oFy<["XԳ+]aBCyJԩWsaPlV50@9VqtǍl5z9/5'e`\;MM[2-[' 6gN|f_ӅBpn#JL'FkҎ,jAֺYڗ $ƵNxaKj!St}72ǬZ2¿\^#)kVƶZ)#B>+q#cW-7ךﻄ**>P+5{|z^ѱ㷬\Y6Muz2,IH:SWOr?Ou8n^1nár6sOz<K_$GLz0ըϒ:G#7E''2I]*d3bjN5)dYlr]$$j0LyRT3KrwG#g'@S h0͹ 7=4tY.r!9=v6!-I5.{Tn!Q~~e)ZG7i$7nwT!ݛN_W[V$IDAT&EOݢ u7Y١U}bFuSU k_^nVz>֡Z:Ь4^UHFu MJݦc@g^z5AWU<jHq~!]ysZ-u&njGc{0K7k:8ͯs=\"(5pT@y;w u1u &gn7v؞95PE0iU %BIBJ 7Ŭy|=Y#ew6^T*h ߜ4ڹF2WVթja b?\e..o3YAyzϿ -0s z_fBu.*PlLn7^+5RѯkZ\޽] YѤl!ĘA&EKϖN MםJz+7ՏyH @rea={7̜}|=)yr:# km9"@K ہL1cCh Y,N iJ$IDiZK|n[ w!!Hf_lӳtYw${s >Ry-=mnF۫_ecXdMp+XxCR.w~ܹ'n<+_# MY6yos4Ø̯LoEn?*!>lŕKj&-uJKj`x h׮+\Rq fAmE:k+0o(n<՚`JE'>e9HQv[;s8^Z4:թM4F{)gwƍg}+mC队*rW.xSщyђE莢d͛ aC&T-OǀhԷxipI-)ʜ"Bq}4lxT% f=@Ѐ&+GFm71{nޖ>tzt!=:zͯ~uYi^&p7f.3ronL\OZTKp|[K>h-yԿ"y;n3~78m7G -I]$%f슺bqzRnP 9;tiq ~K5Vxqdt/$8TO>A$aovqxzt_. XfCK6ULpju4PG*fd;|4;H\.ӷ]@j V"N|k]L{M6f;ظjoƇMM0Q=4\H*GB['ތֱ7mUBbTBѿ4`u1tx6Q# [|4?vh' @k}1ղ:=O }r3yNjBzaSӓ]"ky:4 r IM@3R"}E.RyjzOr\%d.mo>ٝF=D`,p xs^i7/'|wcnGrVH&̌cE], o a46rWnR1ulaDAIś/+|l1zQP⎍u),vuQPD֕)NNN+ƋO*:KnފH1b:H3P~Z~`q0!jK&OJI^4')$e6>6š((=$MJ5T.H0%EQF߂ЦURcDՒD"oT>sX_x\L&:ΆhlbN+).pfTB2gV";ԋѪbL,R*aCՖNJrzY2MZV+l|Qaa?7sL_>|Z'ty{ :u Xc\%2Vjن$sʋD/rL[֓lIjm964ʿsYm\%B:+ a]B=W w[=[s{^F{)z W !Pc0 MG,4 J_職/I̿skqB5  X,Vj 8. j[Jv̺!PCNSTH,XҔD[UB!TDajϩXUB!TJ%BH!?BB!{!=BaC!d ?}!?BB!{!=BaC!d Z MәY*e.!s$^Z!?YO2=er'b-EO2]n )OFF݃MQ.56!a?*ʫ704Mۺ,ϋaIz5/^=!j _!XTTTc)c52QH#BF5|A *6Թ0&g@2_!A1m)BW;i&"^tꏙzga!5Ѩo߻$Ӝ'"qsȃZRExC?9:n;\ظcrr.nŤ0[88L@MG!T "e>}tY@"yyj*7/Ct&.÷ ^²^qOaÅ&?Y%%qc8ٟn,|eƷio_NNIV[/+k 8\bVU ._}xgWܬei3x0q+otѝk8O9?(οĮoʌ ZF8+ 6!)V$Ú +V~Cw_7">~gpho ֍Yg 0!dVI.I+Fsp''$ތֱ7m1SJպgo-_pwh\9jH[UlՓ|S67UWT>-=?4p:xS C5|Ny2MMOvʥWgggV5|>E"'[lڧs]G k bO)VI-ywXWzIL p<#;<=trʧYJЖhc# N Ѡƿ.,.X,%̧-)I;q7hR*&i3ھ.ؕt%)q G|5K k¬Q]Gzwh\6 Xuv~lg3@؜=;I&Yө;ώy}%#.(>YFfiBlbā`"YB~v׿;3-I6)J));_ڵ*v:ύ3:]?Y4ԗĝ (䘡R>; ޼g+ecvcɓa-CgOO87ԙw(Yi[~OYKt4!T6š(b;3 CQ hEy~cM;'K']Knitd;(WS?FvS_{$t0{+MAMd~.rAEI^9o4kFIXmn1!<?!_TXX sq7@ 6Ecʛy$W*$!O/&eg}&L 0i?-ZzItbai{vnzRDMX;exP][>KW.7!d^T½wIL3{s)~͗9ßI*ƛ^4a)P(k#n60)jFҟKB/fN Hy;/ЛZP0+@;}ޘ̨Z˩›MGF?K2_LU\m!<`ڿWQw1l cߺG 0Ie-GQʇg.?) f=@Ѐ&+GF%+ md?Pg0 M$8 \T¢|o_`@Z]L!Hl> %tfҲ~n^~]ߍm QM͛ώ#x9(sgܸcY-/o$b[k?W[S]L /1*gՠP0VWCB#._ܮM;K#;b8Nn^RTUpy\X(UFߋ&!1/7.G N>*VsSOByE7ۏ :NR "PbJSJ}>;H!To<2 V]rttT("gYmOPTՆ%A! woC&OJIR(.)$y@zTu}9D7oTT.p\wD"]['z N'Jry#>3 h B hOζj16 mTn䠮kmdAXOB XOBu=2E7 B~a'j ꙡgјH!du9 !B B.!PÃ!=OBvԲEKW.S4CLy:LY"D Fm(bhJ&ِ%DDiziEs*m6϶HI', PQ'V-ImUILo 7!,񏢨ȶ^ B!T+x!=BaC!d0!GB#!?BB!{!=BaC!d0!GB#!?BB!{!=BaC!d0!GB#";;[/I$\OIiach6:mt.e2ƗWZ,0QFVQi al>h6BF'ы?ZNN2Nz '=VɯV#n ۯVC,-<,UW!P iQIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/cqrlog2.png0000664000175000017500000046733213203343735022316 0ustar jomajomaPNG  IHDR |)bKGD pHYs  tIME&: IDATxw_gfnX XATbMb,hhbK5nT4 vT*,w23QY&_h>Fa(IƱ $|v.aLa (c_B00M3DRJR8 QSX‘5#|IPЬ5Jfeч$s`E/F Rfx :JP[ccYKċ 3m6>XF6U8*~..J>X\KE9Dshռm,LO6ՑJ&QA+! 7W0pȰ-?B`6TD"Ohq5Ch П\pwNiY$IVZEMu~qS) iY8.{Hj#} 2)!Cy !H$[ښZR:zvUc0 boA}QRcK3=( i0hŻR=l3eI},C`iDLZ1-,ݹU!wz%5Ѧ h;u WaPQMٲua? *woÞXKyKs.Q@qư-0XCm~BR3m4ZJI; ( aLqI A6~†&(94ɴ"PAƷqEaX`I,s;e,TH-@+A{%Zstl[K3zX+`ڛIІɱÊrPTL`nr$m"stHr7Og2^U$}h iHg<7hPZ`gMB)lG m>^_C ve~@"p¢> ʄDHIME9"' a'$!|>A&0L h6z<_|q4m,@i4@Tqzܸq[_UVQ__?~FҼys #rRF 58"F Rux6ڛ6Ѐ+3z8~9AZKM,I*Mc6N45P[b޻xcD}qnsې} ZE~~ZK+kVAMKTUvF5 m*fC&׆3?d 2{Nt(yn7*Db )l'PNgT"S űӸٓ:Ķ%vҎA&"%oى2`K)6&FUc)R |\)eDq ?-B(Biee};Ƿϗy@TMv6Y Z:H-0 {eTbm# ivY !h޼9hZiD;zqJ8;v,Zkjkk1ctQ(%q T: D !{0l V 'ɦ=q iXbvZ[X! 85 E\!s!?m1۟ qĵ\C#5e)%6vlgm;Dir;X vt"-ayB:sFkjx S\~7TVOu1^9&`ݔJ V6N4 WH=MM\ Hٌ.ѩKgDz3-b] m%R̚Mk6HxZ[[JɎjlm"p)eO|xxxxxxxxgE^:tQJD`AmOL&ҥ |g{L:!F٩~lZc,"@4N@斍ǯ i@eNgrj,ne[c #GuiIW{@Nn N$ "xA[΂SE %D &Y-N"02jhMCC*;v`ܸqL2͛7s}`uƀtRf&4.Bn,j6ZgW϶N,@Jhݺ5gʕYcXVJ"D' # ԇKV2cs0IIi=;Xt`ln}n5 S :0d2bV.pYY)vhC8_! lb}2P7>&+%]bޜS;t^QB'swRc)U29G{xpA9u" R"6p 2YE qw"Z9(n z#QvxbCgHv%z$iǨz@7C2fkpqR);RiS -m CgHuQ K|x.^wutALh\Px zxxxxxxxa^R6e< Y0uT}N9:t(\s /fɬ^*3JVTA1tCD"12FJ\efmhh3dɇ7J5ҵ$kq#r 㸢qz|x!lV0{E9qOv:?#— %X2g _+Ʒi2XusŸ5n On2n]vlΌ<'K(mS#\Ze Ÿwa|~<1:l%Өl^f栁ol-錈6ro: Ik{V{wMOW0a\xJv/͜9mPO 2ڧ$ 0 TCk"k>\O(raSQQeYL0u)++m۶tؑm۶L%3tSK]]44dCz&#uMa ***mk[ B~8AbTmp=9W!-6۶8R9l[0ZЩgzckfnyzC*lt}馨Kc|>[x}u%8{|~Iu[=~R&՜!hXhO. A& śgǶ\0= |n嫶!)Pي\2<"Kr(D7r?RDHav)նo%k1Q5Rd$A!Xxbw*AeCeKNڨTt`a[֔'ғ91,|*cFK4{#3m 'jҺ]k?BM07ı P`ӐrhSpпF/|`XO{y' -#Ua^cܰܵX,Zs{A&!tk bD/#֭$CgW7`aP7n]:}ǎl͔֡VJdcvS}H2SZq%t2q/ڌOF&X^ۡlO1%Kґ@9KQ>N:k4ᐅOmt!LqPYJҎqAwe7 mVwkK 2MB~3;U&4 g=$a(-laZ&>CJKiHHC )EQ!-QC"|WIb?HSfvuRFٵn>_ʯNbsٚ.mVMMܡ| MBxxxxxxxx_;3}vFIP=dR*\Be@~?,3r4`Ƣ]H)21 Pc29'lXVT>Ʀij7e'AXAo*?21cgDagZow[Sτi ϐ _ddΥg됐 :6( fBswVW>ٖA4[L;(ƃeÁ̱Su$k2M#WDM\f[;ټ~0hڊ߭!#@$dOmkvuFЊDN"b9D-a!<_֚P(DN4{-]0IE;bF;c 2R{aվ{*Zh,dhݾ-ďճxIKipY K@ױD:ƴ|$&A&\6v&LēISb{N%IR)L<2ߥEwh"A'%Mâ3V}KKqX"SDk瑪.Iljb3HlOYNn7ZtR dRSW%D?`SrXJQEƏٳ]<kc{۬r*6 LںMԸGS)))aʔ)y,D&\&JyNg>8d V&@˓7_NE aVƅfek0L~ɷSZǷSC`y ?@w #rD Y&Uw_JA0Y⿬F 4k56Ue7L+XǑy&)`f}>2}60\$wPYI]Zc_jJ>[H# Wa_PԔ,aƛ]/x*0D_co0MMs^GuDGDٿ`H $63wX_%ְ/ ⵏw@j>|E> H64g9Y3gIyĨ3J(?lͅ/o92 E%TOcK/$>G(t,0!BWeY1U^[VuYšOj08~,njɸi"1%Qw0A<Ǽ-o2NpӟWHPȗ]Ubog䘱ipN l7C> Q*No/?h@ ˾Ǩ1c1~2WK%)9{!Ǐ1'2ۙ +p&#~>3Pi+M2 3B[fvG76;?Of8v4P=,YAm֯nPmÙ>kh}>k+^dm !z_[ ?B~рdB Mnt(xึ9ۣܰ? >o iq(;EC"4 i4V8B2@h>Q@)b4ܜ& 2lCaZcҗK_X#rhh Nj GYD9LJOZ`CDA,C㦓$Ri$%l5H0TOg>O.)qEo_kWNÍ(~gӖ~L4Z+w[ƒwz~DCyEH8hTDƕa)l;zkh>\ 7߿^]ɕZ޹Չ M-4u5TW#/`&Oha`D#F.Z|yBθ.&AGrI& o%755TF$p.w 8Yu7!ʦ! *H.@7qL1t3j\warem" mb ]L"DC{rM}]-FR`X0+\} D$Kq 42^Ca"Aqf,'i%^YO"Ye?&ħ$D= i Lhj IDAToݕ퉜5g;/),1n9 *&0L?h:_᪢Ե%MLev?+@$onk8 L_H$O/}ބȈD"-3s81KJ''S*`/"cz\5 !aPYa!ȃ߱!fOt&2)4>AմP՛-J*Li{޺q/}aXȊex{]t?.!m$FAޒ{f/N4Bֳn*ӧm1Ak7<NxW']y<_IMځp;Nl WOQ]nof E/~^v#4t-oL; WK_u;`R|6 㲟Nc=3?+%%5?Y+I`d5wpqo+c+]ƌW?pCh-qyǟz5U.J;I V_~n~x#ӛ.>΋&]k/pً{HF.]u<6(4˙'t~j PMx򱿲p{;R8nlz~V{vLj.[3+h\"㼶|6i7\ȸ^EXB޵gλO'r2z%;e.BfM!vݡ;Î˨.ȌaO2ޚ~'ORX/ah@471I2b̾Ϭl}.?:~$)e0j G\}|4^my;~aŜxms=<O_q+ֽ9ۥQLz j/e΋㥏Rg98ҟs-<Ĕ@䵿񷷖R6>w*SNA쓼4s@];i?}G«? 0M,"dbf0u3kN "mpqQ~GV*!SC&]3PM wo1|j³(Bt>hF G _x!Zf=x3YD;xx.t2BCpt3?'~<:HWf Of~6Ds f/$\{Xm{Bvqw%ig' bRg6c]lϳݍ)9:!L(рqHᥕKso/gaKH4Ƽٝ}7qT7E>gSqu]#81L&r)߾FԓLaK b6Y3Pb)yr4wքhΘ!]yOPxQۓcs'[ݞkn9 __0C5G'.vH5 焟%V@lJaRuWxP=v]3n_s;Xh+MG, Wmo7g^N 6rJ"`Xt wz&-һFKӱl9 2P43-kogxvZҌ<2R\cƌ>qʥl*VӇCzn/25!]6CL_t>5 ^ѯdSѢ`' }w79=ߦJ/g`fVfاsݓhlpcNȆk,h~9t|S )%qpb~zO<fEc|e[CSKD&~V(zijBq`yi7!j* o#Y3Nn{1}6yz=y'\Л<.U|33!PNVѯs1s J"Cߺ-*̀Ar=eeR N)׋3I\_r殯Dm~AКv[V-L`nkb1$J+҉jt^PZa;L4h ?{s^' {ү Z-y yt˱ykiϿAi8i,En1BI-m[a5~*"gBAMY cڴ(]/>̌9ᅠur(B$bJ̞;UV Giٶ"D",f5XQڵk=o31 h!HӀFpHD*P2=8L{",y-,Nh1 Lbsf{-(o{C{w0hP4|V-kVt㍥ "N9Wᴉɝoa{-Od=s|Wђ N]ȏ[B#ɏv=f>BunL9*ߏg(GIy=ڄ%:%TIm(MnML2QILzA.:ږB!WV8RtGŕ2s2;',eV Dԗ&8ȆjF~ar; {<vؽe'5 V#7FҔM^\>;>0ǎgh{I&x+ДmcN*v{[< AkH+JIZ)%NpS) :E b#O+Ks+xõ&i )Z(,pI48t%l8Zb:3+76yjFip4ŀLALhљ.Q"JR8hUF"9MO χZ!^WA5f4}03IZMޱV>ß'^[DϏ>a, e} $+8z8:hB(@tOw^b9t`sgWy_~gƷ)ʹ χO_Ndf8-,iJWLzمO34 X 1|dtDM0pjw0KiR:0 R)(cMز䨌:00 j CyEt9*uc{eMdJEXZQ]Wx Bia0N4LMiD)jۜS&קpP%5i"0֦s.fh8'[Qn>C41rYiӂ~cΤSY3gL"gK4-jߤVV k>^Saj YOY;|ƝϼđWЊ)MsdtN2L ֬B1Sc5ʨҁ{C[QM9ƟEo>ValMuɮ\==|L.b?x%oobig1~n3|ro9:VPL ~98S}H %h|}a7,"Qխ8Dck=sq_ 0B5gwI9 [A3ZrSSxMKhYGpۣsE0UN@Q;̭|H'!ue~u- #Ɔc;U޹ E$]a}>xNn_[|ǏC4ǭ;'3qDwMʋ,Cv$мs:o_kBOyXQ9 1VВV5,̚Ob]2b=^XNq)nރ {-תw^xQcH"*"]"nF-h<\<4;C-K2fOFmEyc!byۦ泹"3hEo|Y+' WiB81-YĶD!+VyvП#T6,Xr7ĤbGc&0SMs KgX9vp Lf…9S7#%Zϻ``8k7籾Oϣ3`(;|,fe%qZ@.Qv.]֜25ĐA6|^7b̥WW?;ncb]γz*NabÊoHn}c>/2W7]̾:za}}r/xi%8܀7Gh^ĸiLhILY̞U{4FLògxYyu ߹WRXȤQI,{9Rofĩ|t0 x;) U6u*Qֳo?3dHo[9 }$6,yƲ ď ߹r&ә\y< Ke3 9l zI13R`Yi\5J~ѧ3"~J@hKY}.xVnE;/x_:P {>Yv/'v,*,Q󨛒*Θy25+yy-^s Wp WXd|jŸI]holϴ8{hrr^RƴIX1Ij6emC'MM,]ƍAlxf]{)| Xsgx8K(ښAztq]%QpuTaNJQxQ5*u7n+1 1ᓾM {'$Q;dXA ϒvx:Mզ'vsd=Hf _E"jl3%F<k!e8xJDz,bȇI|7- S9da&H5|'e =ii7{t2i囡(H!I4"0 rY*0$xw69G^i4X;Ϧ폨Hiu!v&GI7,) [U@R6﮷ d(vvC7tC7 ã B6 `"JJJZUBdY\2"5MCv? R"4Mk3t˼VBr.[34I&)~kAA~bcccz}! .˦vAAAAlsPJJ0Mϥ4y]Z)%tK@es4vu]?{,"t:}xEpR\\.-]XD"-UvC7t!ơu]̙sDAhΝ;իW7cܸ;X,.x߿0'!Ǐo;va:MؕR2x6i&ez!#GguR2a„v׫˗ӳg.adR#GlS2 z0 =Gskjj(**:}2dm ٳgӷo.Y3!]/ CN8v\.믿N>}A@]]]/1v6ϑ\v Guuu.ۗ64M^|E***TWWӻw.!ƍks2iǏos5Mc˖-lݺNߗ&%KxUyy9 RE7t*2"'tR % t,c֬Y:A@m>",,,dԩ<<>5tȐ!TUUu/ C\=;'MԮhqv˲8Ӻ"hw]>ӯ_?&Oܦh޷o>nʔ)Sħ:BOJ8Gܧ714MmTSA_ѣG' DA%o2abvZ󚘦to LiO?}>={8st8Z !۔ \Ρef,__Bo"mUUUѻwv&k!^ho˗/JYG !< ڝr)]xb1}f||P! AcC*~ޢi%%%-#Ç3|N aÆf]%?]#^0D=#N9ZDptR (D&I^3mL&93[;2v)%A!V]\~HxH)eaXf$2ТNkQ.Ԃv'T`{!rֵ Hbjal޼{2q#*JS;F[ne9RD:(Aܰ+gTq)pw' ln~5Á)" KB} \|pƟ\cw ÐdWwzd DPͰe<~ǕJ?"ep&f$bh-@!ٽe;\& PTdq=V`>0mC_~Urӹpwnn}#~eߦBA*{}N/`8RѬ)Rv{QBjF^K!-zDMx &/w(4]gǘ$)}c)؛2#c -Gc9&ؑ56MMӚ–iQ|pH%7Y;'p4R$M L(dEs&*P!4Dx~ \m$X^A*{̸"iA<P$S98G.b EBLV5/ޓˊV %x F~\[`Ĭh^Z#T埅]x.!CxW/ KJxGa O`B㷮A e1gKEϞ̚5ߎ 9P`Vҡ\)RIT"DrY޿ B0.tU!YW28F[*!>w>Ȳ`]DyJFsTaH(%Jל7t V'ѴW4 Y۳gf޼yuY̼I` n7~iz2BțȐE*ybezs\_f.?l43q6%<"C]zJ]^M'GRvKMy{Ln[4t'G4i-yOrc{ޤIgLi8g"SqPs&'.ϽOo&k}q=>W㛓So1:~^FscoyfۂS~Y#Mvy1k\d#w_X#\^$! 7Z_1(*)BBx I+¯[/% I. B+S5%teC"YlyJ5nC15-X]vQWW̙3,LmunI0Ol."1ddzBn~;s|~ qInͤ4tVs%sx8$$ڬ+s ?N(䂯*b_(WCIn/:w0 "{VsFX#k} ,!u[fA mcljPp/+=D2 䇷%yjVpѷmԧAqKgֈ :o] j̾/ckV2wed d?9_Kee;46444[ q}=v-3fP|>x7}QyGZ$ (&6l/K8usҿ,"~! Cf͚Ecc#FP0Eٻ{$Yd%}eJ>:a c)XJ*zTvoPD=ɓ;# D n%7ЯL-~<;ÿ?T| $5xvw-pa8k|ItiIqVU/RyIROdbKW3RQu+Sb:5$A!NÖۙsXʿO}S|7[8^z|v;~%A~u%W9x", -n,I|tc𛛓)tpG_nOqt?a$F>wPdo yK7[G7 sDôC;59,Jus_lxCn1ŕ)MOCU)ߺ4~+GqɏoLrߋ: hj& C:ޚ7ORYи!ǹ{)FPpu VҐW,~$VqΐQVי,ܘb'YOXyw8T>g-צK4tX<޽{ǒ(y t I%b?;|I7?>̑:u<l;GEQ Kx+>q֮ZǑ,(T!w^֭[Dž^wgnr`V@##&$넑SM!ؾ C5y˻BC c{t@ ?: 1ў r_IYp`Fe/I)]vm6JKKrb1^~e?iKX"t!M(8E1.#rȶB eڑ񕕘|gxϴ wes@ Mr61w˵3vLY7)6KtIJ nˬK:39  h VabI>)Ax (4RtPE/U' %җYomv"ؕXb]5Bsك *y}㭃>;,߅s~4&04OLQ)N+:MXb0ma&o&m  E9T˴>Q "T^Q?}կBhK[_SU6b&̟?s=΂ Xd+ .]w]w1jގUu@jłwgK`zNL; f*V}"ş5<`I|{!X?`I*fkvJ㱿ӳ:ͣY̹:õ6p!Ru"$hzc]f)^2pLv=:8!_Ɋi>bvY#Z V<`QǷ/yuKgЕ@|Rb|zNFx-Ν`oe=Mz4vﴐ]q1%qPo_32lxc4e.Kxd02[}`X\I.: $m CE(! /P$q _(&ĭݎ Kd~(3 )-)a˶jna[ټa-Es<-4@@ף#D$O<vǜd- gu(:N_[67k.5Tp|@uB_U,%+cJU) v$LTXA^x7˝/ DG: PH6<=@Ghьr;g`;h%m*!MIׯgذhC:f <HӬ^rFRRE.tt PRP7DJ(d}~lMIuT=zkAJȯ] z0- JD!P!яGx \>W\.b g(\ (~^ƀ2%Hk{$n)K 1O.M@y ntit$C+ V [gdЃt Q/6[vC)= pÈ?[o3D'B/K>d_E[]mtڤ0Gz~>jM0$XC707u{9h!臨9@JI~(**u(U)t]o̘1Md…\ݻMӚ0,n壳<__0Dn󎣸p$TEq}_a_~*KR=?6lmDAc.K$1 Уʧ&ƭ { jb<-9>At> :;ݣaEeO91q}k?il!kرYg߿*Ե>e:8ghdj7t%' I*A@Dkoz!1#N:\{]y"ҨzE1,IQ) ARbAԂ]J(⺁ݐ> |h2w'V#aT<er6Rѳo`ԏ+oqܤ3EaU< W_ueb\`,4McԨQH)q]:~**ʽPDJIH@%ɼUR$t? aN#gP19W"Pd׺*< 6@څۦ?$e˝N N_y:z-A\ <6#"K$mVy]]AP[[۶Yn]sŤK2rdUWWh"Ǝ۩MУxMR46)rǙÓ:/:6zT=)OD`(-# (D*WJP*EcRDI]`n>zSeP4jlIic肰ZRL:;:Q0ŷ2_e1c `Wc2Iu}}qGGZOj|n%Jt5fV K arBN.T04JjP%u!!IA?o@b9>S*NΎhHP:s_KErF EYY`s cC=eY%p R) 4 -۬4M2 k֬!HP__ƍpM \G,~w1iB.PT$"PFp2=FI|ܡi5|njEf_T<$Fy .dAbS@gZ}:4ƦƐg͈T}46a` d_=M%JTC~Z(.)fofcǬhƞ={8Xne5bgqiڡ*MӨhn*iZ3?ohhh|t _L՛c&uQhRf6K:'0Tʳ0U$cո';%1[؋C_ISZ\էcA`gVgn'RlKn8 hqŗ/OP7=n+"WK-|U9Σ7)5!@)=ڜQBTuKerƂ ek2׿ Cű}I # .w|;> ,q2P|R): b 2;V5> mH7wLuF~Ed,(7ݮfxq֓$rFw]*z$|r,ftQg(J];qLP؛U{ X1+LӤW^s!9ϯBnJ 3KPF V'B.6oP0R@0t^m"n8l>Z-ScBFIp%+J-)" ֢EaQ!.++:R 0>}}4ixjJ +x\y7߭Qn+iQJv)0 #dÐӣGʏ?8]tƍ>"0 پ};a4}uپ};CJIEEEwzgAW\8oMs%) Z$O;  $VP` w|r|f;`8IGl$ F?q L MK$+{b\{?}&tw 4=]߹'gǫRV |Ipx"\ђr , ҀsfbU|"0'8_4Awk0R%闰ʆm_ˆ hs|Bǩ@2zmf>%ȶ]5 z3fL$`.^~;13I>ow]%E1~HȾ 7tAIa&銁(2 |g뻷\S %^㑳s\xg0At! ]`i`ےʂ+/vB叡k13¸naЄg+~6r:fbETP. V#]h8(A* %BΝ;yש X7zcdyyS|QTK/ ?z:7:CSXxGP? lOt WuP A# #E}}B ESQB FܔG:} ¼.Z{^c7G }T9O;洟=~y̼I"[΅U,̀>nXWG`ҠU}L0zgŒeT/+B/bXwI|큯`wYV{<4IeTuw\g#y>*ﭴgb ! aR/.,y i6 sCiZ~.([}3aro ^UL48 ZMYRXL&Cqq1 ͍I-'0}tNzl|٣ҔKu]t]PJ w㎓aZPBa^e>])؏ yů&ǶN km\8[qg>yfH$OT\W[ ~.كo%qNx"8 v<{d_~mP>@R?ZkПcT~R 渊k'NB ~SBJ'oYsnYmqoI/H\`Nm1`KnM0噙M{$$$K4~pZ!sfy7>+ }RcUX6Rz41X0bD11gUE~:$ilMmX/VϘI \;?M: V?ϧeIbշQ#dt9Ĵ8{7>n93u\zIOČx9qOg9iؓЕRٓjbmf={vg֭[ Xp!}Ji˲2DR4]V@& Mk 3~ȟ/ 8FpÅE}}3*4a"hN[&2;,O'B%_w?(uLy\??䘘?;G#' r)V7`Jj*VbISزo-zeL\ٓ?ʼvNM8)E(Aṳɞn %h7"Ou3|o2Ux{E}<`qyz';tE-z/L2ŜG㵢p)5#3*,qTL!YPًaߩSxM<=uvHQB6|C=7`z;URP)Z;w&N@η dWm5 *;dl2Y\T&v9 sBBrd bgcTd//(+Y3|e 4´*5l*`|0d@'[hz!~v1 5yFIii){wx.Z2>3^?pD9S]Ɠ_\FǮ?av|&VPڮg`_v@^X7X(Oy륒 (K5:qEo{(iu>[UsR4{}F_G4<7Qu{ œǤdȾ.}Oɐ)7wa0xdtس =oI*nM :%c;~+VUF~z~U}fO޴ jߘ%:/YTpf_M56gޖ;'J0bR$<38~8P<@JYua#QZ'Cm]vQYYݻ9s&ek:-**osJ)Hcc#tñl d xb-]S~N`{4Wk`T|yw NpuEBq/{.L2ˊgv vTf``b97dgY,z>5s^84i&]FJ p(ߢt-o[_v㐱{?lE]\VoBAچag۬ 8i?af;z?˿]1u5n20Fq0GMz/=Є٣kmh λKgA?"UO|[OVf[鳮۩q/)N mt1w DoØq uuڜq_;oΝ;rض /͂y/S\.*}Ib,`p?hgJRuـ6s9.0Xhtݾ1)<_fg`&//{5˟劙げc~IG e%`j(; ]L#axmL VJ̌ Y8hL^a&DgQ,޷ /cဠH>=IC)+;Y q[^>|AEw_l뙴97_'qݫ[h1p;ScFH,Jя;s|mo{q!y[ӣ)X17E?LCm:E(ya2޸@6Bw`E,2322p2IɩeҬ>N $UNFZ4rc+~Ajq':Ve|n)9#hСU\l@Ip~8ޝ3ͦIuWI)Ǣ_^@FkMAv)@1c'g"DG7Slj2,*=N&,umkZe)^cbEae|vhݦ>Ge-L$ϜQ]Y~O9q ĎhL: Gq(1@fTK"?wABJ(/fy@"%]QA)B (0'hkKS[Mue B( [}X *)MRUU C˒Uyy!Ub*vJ]@%8FcP|9%5d$N`­ rcJ0BrbLfn%,4C%}; j.[Ts0j`"ݖ0j`"-9;39R !WT׵kWnV縙>;"r$+ Kzd8ȍHhGipD%-E沶.*+D _%|[Â6YW>7]y/O?φIvCEX!LI91B]@&MoQ$D"2>5pPn]ӧOfϞ]`@ @uΆecs )%>#]cX%>mtY_\K(dݒ-=(m^G:-ݞ Q5Sq ~:;,^b^NZ7!]G/wD YY-Bzǁ@}LR+XקF>z0 :ԏcɺ|(6oshVpDK%GoQ5jed<4 *a`IW&!S` /VG@#_KJjfS}{q'Kr~ PPӟ_10 >o v槭,QWLߗ4܂,m*G٢d&PAքoqis9.Q;DBZUNU`BQCؒ^-x֟[*:ShxX"xTeVxof~a^,Z,]s+s5&\Wp+pߛWta ':!MJ"-$nY-s))ev fA4eͼiS BHYkYyYĹDl:+BK|.\vɟyR;7^"-$ACSgWv A[ &(6,)LYf TOM1Bl^:|"ʗEo:0 Z?z[\PqU~x 2{-roW9V=Ji*AҼn%TkmCBidIIf!=jS7S徣`РF2 OKJR\\ګ*~쓍_BHTK$j SV"1 3a cdd80PNM:5Nw6Iapa1Wg0y=wTBiE4/ONJIMeCSZUq5$K4%Dei"EMwh &uk !y9j,X(n`qUk E))Z_P 0?yNgi,4K^ɮ2Nt]#11N;muk׮Fhcs" R[X$xI&$;44IϬfD25OJeHPjZ8=)uS{23 `.llLRRR,3 *ԯq8 z̩) v!OLK$-c|i:X5} ygSF L*IڙviШR:)2KGBia,5wuyu-U@ݮH4@EK)IKK8;llN p*E9!ai H0 LK*B4 t*\QU4ME2 Ӥ $;M* 8teh&>5Oc- %1zIn}9L\ B t:uNAW2;4!P~:/:N{ҥ1z GfV%=0;["1Mbl̛í-+%HB@47^/S[EĒ - 7c܃Wr:g\rݾPf.ťC^t;~/_Fn=8G/Nы;7Y"~{]̒=5d7Ѿ|]yڷE﹫Wm<2[_Ƥ5' P>up}WS;.}Wq:?ˣU5'M+46>3Wtu\$ c m}C￉nd%!9WG˲ )BQ$E - Q'*dRq$fw8n TI\J*N;0d$99RFE,?? R%2ʟKg1wSu|[D~kG2Vl܏퟿}#I+FgJΚ8 j' eE5o]ςi{̽CdSU+j_ڍf||,xU ~X!ᵌ~>;~ɭ+ٶUAT2S]XY.GȔ|nEl#I؁accsܷv$t/A _Ʒ'p{Ө?޶G>_&?|?;ϣ?NwZVqz1ĻBח yCN pBE[dɜ66nlUEn,`"k^+NeXX$-~)Dh8%"17?ڈb, (&2ow]Tq }s:+k=N+D$3@4ic_bU?!"B]h| ڎ@+܂YN YKIi4&d'C64j+NiZQ=ɔYi8#I$g3Iw ם*WHB n7\NډkQ}{iZ.~+9;9J "41벓.m&ѝ#pW÷US0N0 -Ƈ/0`J eooDAz{LzIԼLF~> -f8.xRRN]uhӵčcዶr~\xI~clE"^Ϋg췘43|;WCX&Ђ c "jXв% GSqHl]`i-Ro"/"{7c>4tDXd֤NMб 'OA:6[r##FD2c_tx8kf?<3վ?ΉQBDlG?qs^Z9a oM3}D/>cJKZmV^x )uLUԜ=L헅&~jMWLcsyṛh:h7M%\91;= QgSyyW!Gv$TD2^!i 5?GZ3Zf,iԦ+g3hR6L>֮[CANt3 (:m_տ΀o\NU Z]˘783Sh(SpExրG<اLz{2+sMJ _;pϨy[C"t ;##$5!xa%^oQ #~dڭrj^L|O.oI>9H4 =^$onwʵDלJ1zpDGq?n@8nH~u\sZ T y$ܴm&8 ^;cB-xof666jYSG#ɢm!ʹsxũD]y]%~B š(YoV*4;nD¡Ue Ъ?ݪ8!ÑX5w:/8ǎ1oҿ15Iq~T͵7dIxQ6?y Z b uڟwr! iUW'χQ--SL/؊y&Z:BD 'ɕ{^@U!UE&Z\)ih:ۉZ#~^4F.5'^w*1ʈ!p%fU)sJ9j_vY kN&iUruzO ְfKf/|RХNiHaa:s >% y4$ R\^Ϲ⡬?)^VjP/Sgʅ^7H[i9MD@ t&&i a]2#>i^}- DW߽JZye\ڭ*U @7bvB rFF &x3Тm܎p8p4p!>S~;+B`vWTfO!qq(sP Cá9p:h"#8yڈ|̛9ܺ[2nIqSt.؞8`RJpU BGfH 514$`w@hȂ5lEPTk҉s/=e3OZbͅB:{((yٕ੪UHOPj&keJ4 %4'nbYׅ#МX}ms02<>%cf?#b ncsIR ײATKAU4+O]qs6?.4[  $=Yy z儍IWpr<8'ɦO5a~^LBC%w:PI&쭻-^/ĐeYԁ..+.:v3Ь ;$7tU=K?޳5^<@AKЉD P/ TH,0}l+6H"IJ{׌s;X\ĭ)E1[rFDL!96]w³svxhڸ 5gҍ((B2~KdlwѲi鍲tiRSPy;FFR_l,I( J2_)XK䪂(rW3_߬ `4מz؇x8Fr ?H4DžZ{X޺wRvRƅlve?ٴj6ADz,}~~IhK0-lli_̬Yn`ϙW>~]6/%rٰ.TJx9m gmϠkӪ8#~9cexor#A:i;7&X}1y̬ jS?X\JYCmllNt%mX =f&QWȒixJuֳ;vs<|C>tV$l=gTCSW|/Z˛wϠcN:p3{i%EVK(!W!IU1hКZi$*b$~L?WfWӤc\V'x[ʗǑvh"j' @ {9&OwG3aj]E_LJr:Џnx0^r!!Nx7hHb:'+C0S;HיpDu)_r73<3vĜ^\T9J(b)Hָ.yUśJf#g&EXzH(@JC/vd֝ʤ/2iC&Z\3O3wuU Pf*IkPYJv+E>zEZof W_&2CJuhwcuz;*$Eg2l ЉJN9s-Cx|T,X*dL~oٺBBFMWw$,s'L~3\ j`dդ e kS'VБ)}.0R%vCj$QS%1: k= ՓُHc1$r=s#BbKwMdބ0&i0T5qq̨WY_#Kfv=Iũ:qbEwWa THe"q`D +.6rVL6@syhp(n 4KCAbQ%۷JH'=Et\F=?g=AуQUKMJSAk"XTHRq=xΒJ``wu%6qzq$D- BQBhilP47Vq:T>j\ߢ:Nav}Ua*."L=DPRګ#-[` \ZAnIeDpmS):93c,#J-sC3_΅{JH(H d8shGar@5wh< ?RD_2Zy0MH} Cj4wA!%0O"be(:j'jJrTNr#liLHL N к(5JA7mllllllllll[?yvఱ9()qraѲcOs뻶P+&UQ- y+ՁT|JrIHv.tm\ ;WVѨTҔT,6i HI8]6wp7c'DV툔n9k 1DŀvPs5S^BO~sax0X:kچLE}h:ZV~cV*8s:2Vx=^meY,ݴ`TT5]9U`Z5}&3nje/~FqUhӣ7j%˜){|Qogޟ) 긒ӡO_ZeZ<̜uD8iǜOji.j. Rr4B1[/ـtS jS!y8OsZĦIntjYs| v;ӣ}=[Y7:[AX9s*@n3U9Xn;j!2!%WlLA}hSSrA~?،?Q{ѱukX~VΞ/l0hɨϩ2R~ǑV.={8ӹ{m&_]AV.jC|܎E IDAT/oHu;11Oh_)d|BaA/fPc/~7R`8nӇAkDť:ѿXx[NI*/bwZmޛ&v1gL/3qtRqlg9 nD^ݩNH&FQ39h|ksd/bNrF=炵/p2&2v `mGavQ ~%#XZ`G 睥XW_!f)+ åG kO~a=®Rpy'B̟0 x7X>vC,>>8bcݖ¼y)6P|;I*s77`wKպɏ0ن yrXm;_fo>yi SB<9ط/d0o_fk$iNLxv/-,c>f]ȉ,d{ !Fo`|&u"7)IJB1o /8-Β^OV4 7/On{r.G{" $E0_g@gٻ, U';}dzgaɻssl{in_`ܜ˷[%|ҋ|hgo}~~%mL^߼qߋF/\Gϗ/u e(-\²d}2'zb^{m˷Q?Ŧ '<,/pyC&C|Bc&...AYmiWWSNJ(6[~Pp|pGA!L@?e[a-4Wƾ s_٫4{lx\wkS7yws=%)'%>D Dʅg3M\۠6X&jF=N?RzVװB$w:oN@'&qK3͹fHrkwRzVxQۅ\'K Q.܎Xz:{-oe y7ߺj_8J^V$8< f_0.N>t|" †32WԵW2(C?g >͕RAE3n hʌ?}AZ7ٱ~> h *!.MvL|t2Q}gbti..  ӯk]j8mosryԊ4u*m8ΪrCy0'f^}F~½i-V\9KoԿ%=6m cfz(G,pTiWs9Yl? Fsz RY"j/Nb[Gtg[ ?c~6i+c&1:8e\;X r=$JhE\Gך,Ŏ?"X'n ]J;4u1WubY,g:Z1j _dotIs҉J Z✇0h6-Nr\}E-,K"77#BpU0M˂uyV[pT!^53| -v?8VG&Նu7-`W(H NSJV}e(gFnAEXXio]ו6OM'Y:OBQQ.8N@v,D]dgDM6zz:_˔evoȌp&vS;/8b@,QZ3qi\/.c1Ous7RT.QAh)]qo } E#ז*n4Cc*P4.Ձ3UU'+$`iڔSQ/WPPUUU%@QTNĥ@d/,ٚě};/l3jt^.@s#<';P:Y0Յ!%J߄K$d4mDVO 7/`E0=TUs9QqG PT Ӊ¥@je%77k u/9*Ԓu`tY}8>a07=?Avml>:BQ.@)ɛWb_c.E)yC"ӉϽG}_]'bµ-ppfύ_PɞMR,b ",YNz:n)Y{z\6z,geDL RJN?&aX "֡ˁ°bCUbՙʅcZ!#ˑF1߁&dQp wYa)n^r:m%94eėxA_'<@=,K*Hצ|\nӕ\Ƽʐ*F,}WJoGŸPA EH~JLI!|C^(1yzq=: twF[FN3&g/o惑SypX×'&y W\W͝ms|daɝ .~[ϟؗ炯>Ǟ%PqY2[:_-(ŌSa)C>70{i}>Kojh_.LqJp ;RWnbU&0Q*Q o%)toCff-%(%)`D~Ov!+pQ)5dR<'y' n%c-y\1oFKN#=-dRvRc[ӣ|*Z5Q-I_/ 7D}'29}z6&+:U\{K QB P>A fOF+{9Br4C bB>_C6˶LI#=5Rڎ~abvP[^P-ˀty#,YmquډvLdadn( bEEp9"܋(P$;ؼ E(8HR36-n_Y?Sllh1l{.FEX`9TW(Z % ]Ʋ(_ Ȟ /<-[N!'1_~פB'!3Ȗ[R?3*|@8wmiIFd˷T֎SюOJnHCxYԘ4f?YuN@dL& iwe •w\r^r7+k r]pQw+T|;Ξn$pI F`e-aG2$ WM⩉HɌhRwVpUGlF(CW v|*Yq0 ]qh|~/F~ qysxi|HGJ崆QK߸WB7g_EW{Qa?[PU5LjŦyl]6vѭ[4ඉiJ_=eDT* |huе1 I8AnR7cygӶV h04nY^B߆b;B#qZJC ZK")jWBTGu:F.ͩYɅNN:$4\߰!9Ti֑5Rq* 6jDZ1߾ġuzK.c T8l]ȉoGA8&LZz<*D1̈b.xYIy?3@?\t+EֶX)_l'%'h:ɽ|+&[0$fI yFARY@QQyV'fɛk%l\z=^ U ¼l̪JK[lRF␝c>Ϥ+ '}B-C|\ܹۇrJv>|8ϸ$:J(,6 {G8ΙL6 tX&/EcEȽS[t)ڬ+{7u3ZQ\X@ٞ$d|1>G/{X3,tthDEuY.'_B M"6!u4s,},h%}~qHEuXw?FXd!Ǭ{cI9%K . xsh2> L\X%^a!izoV zF( d2&#^dd!`߳ Lh2b01)\\\pdc0\Qh4`0\@쎈Q(Q*O' FD@)P(dω&sL.G.=&ф 9 YDFy[Lf1AG)Qʟ^\./Ӿ"&mBd2W*Ndrrz슲'MȔJʿzy O+tF=mф`da23(Jd҆P9fY{Y(lJu_PʅG쥬^ GkeC{c*m4cB.+)sM.tZ92;7%`eo  :2vudeperGy[yÕ[Xh9N&Z;`&h䈆<.߮ȭ |toE^?wQjhTBfZ ['l5f.>0'1O H<~}+/`˹d Jdxxe蘹 ́ԻT=|9xo?CRKUz }P?;q/׀ֽF(0,DNUUuX ~\ QmG2r>BфʕN#մ9{L2 88۠@%z #T6,җqHnG| vZdXۥ=p,L`,|l ;J_2ϓgP^-#E!uC^&\D.0K(P7fŏQȍ?eڜi@;#zMw".5,#V^Ѽ;zVsF{@R8q:3>Ȃۖ2m7T c%g c8f=?2nBx;Ɠ?3_9{#Q>:%X|52p S=1{m &izz$&rc\{|9&S.O\Y;Sp[y^;m 68uTHq4};1)di$". 4 9~BOn,C Ez M&dJKl(oXw>^8ټ n]c*>z|0FMt]q:KJ;3bhB" 25 JR0k*,ޚ˖N^Y1²3u8ü[<cn,$>S,oz/ Yg u&(տQ4.{'n%["K6Rna)߾^W1K1<2s2{^D۰o7 R>ooK@wb7,k2p|ҿTËwfP$։-Z^hFWҘ!ϫ嵈lN `a0 ϸ1n \3egOw@0 IDAT_vP'BQWDO0P r0C0g4ē:fkA?{i` r•R\! Ș?` ]sMB} "_EѴgCsߧ -f>{[N#ݕW/1arh# ?}{N>'d`U5wVIW sBBZvS  UқP2 m}"n~8IDMF 3SO'??W jDž|ZU{W;nnrɚ/s5%^68MDTdbv] 87J/8 jLT {5ߕ|#VE%ɕ ]ЮR=R/`#r9 NdgP3::[+b|YR0hRy#eq&rGf2;*0 K.*ьؐOO7YGX7:o6oq(ыA4S‚2Zjtn#FX0c ^ ڃ)"pH ,2|H7H\SSFHyl֤L,M~ }O~XE&6L/B~:= >Np(͆Ȧx4ֶι79vB=ݺJzHe88!$K%I=ܩCy OmeqyDuOyO|J3L[L=aC-pׂ."i*'+q/$\I@9Kt&p}>dw_zMiG὇1燽.zұ@PLM¬|2FDc!w*1*p8"ȄHv6DBviZZlwO] 5GZ$^]nOw1xO-)5>hs9sTeh$fQ;TB _VQ@bt|3V}C܃0 2N R3?|Pp9.r(\Li)2@rђ"(VQebAPLkG=n o-+yU3ɀs;[5eVvZlL6ԧ:],wF Yuc=:>2#=ǒEZ1\45,}1Fi{SUC͠+Q<>ն(u eF UiJ,ITY.4>$ (4v*a:ˣD.TPۣ5or9GODF6 f\|2gߦ9ǹXJxXӨqk<]laFXS>frjo'(p kA^W~Zaog t)dϦ_Y^uF_IP`E' J}4r+7e!;sR ń޸f͟pcZx<5iYͅɛټ2vy'O#7ű"M?^k$_NJϧmk4A.;9wR1Jk]ix.:lFa0`N#u?AO[H~%6.[ưX:v }e52tde4ʰ lg<9-g@DQ|d9R}o`yqÖ\=tT3 Q:ZzJI߰%7PmԹ#e(6҃ͱ_<Ǚ8lQEf}47> oF!E;'1:˦LcgflWYeQZ^ )ElU/bV݃L=̆#N 6ղ(gWe5#>@s?僶&<0#*$=5i2f&51ͣ=cq(]WL:{ETJ.v􎦅wbRLcLi2&+[7{45T&5M8rn( XS2+v}ptFL&-+8ėˏb뎺6Ź{4sy;V؟G=vh5U6%*#ACRĩU>LEP \̺3G?}ԣK+,ecfDy@īsiWq:5$r|>}^alVXGqM jQQ w"~x"">Υ,yjL%9ϐ̊C'rILz0qL&䒬6OV4j 9=aP-k@iR>L 7O`ﷰtĘy k34^1u+Yh铘l\fB,9o?.MiPt3E^ k1ۚ>ZFNϴ*o#qE:"rLN܂r+Z{sl|~8$ >;bҎf>eͫd+{满XЌ/zVp}1ta?;kEZ5nq!^9]P·}͚|GqY쾈e|%^xLw_tܱS17nfϕۜaҖfuȬeWopH/pw;PåKgsEonܖ[`ooJzvBhq3!b--{2d@WؚI_*^R i餥n;8_3+T+nݘ0)HHJʗz-ZP7 JK/귨E|Rs*Ža_fՊb ғ&{s$A%,)..&//gg!}~*\FBi:[e[5`Dӣ!:2r@֝A s}poq7KS|8 a*r:Wnm>Um :i9.uXK~_ˇcN~~>{(](z)wDJZyo;T5b,ёuIfݙ>AI,| ~i~eOV╃JLL,\Z|"iDқa.gi ƾ}1ƟaמdhiCFE" mKS )WzF<1lHg,E\غDƘA 21>s[h=z2v`{|4Ērss̋Sy뭷t;v젰Aъɋv$tc„ɨOǮIIKëtHBnZQYx"exYC_Evv6IIIO׽{(..Oj#G\.%?$]ܹc^- )Aڝ;w$(rJv>|8϶&I>$CI1$$$$$$$$*u""b4% JHHHHHHHHHH\WB" 预c;r9n\۵] `?(A0dff"¿/3ge!}gt_>`0paI:ݿo{$jY> F(JI˗/Y ٿsTNE^^w%$$RSS)**Gj#G+ B_GRR0nݺE*8a2z(b00L2(B߈h|<&$_HH^XlU) hD DrHHHHHHHHHHHH$]+rwrڌjqĶ};.Qp?FcwS3oo(0=$ߌMIoRNiFČ' .ڴ.Q1'n]_VDo/SIW}ӺDԬKޟnsoÔ~4iXZ h7h3u/r4C7#"^' ǔ~iui<2q'ZVjlQ1T=m2y᫩V3vD׮Md\ 9o>x#S"V QqDY&zMc&@tiށg> kOFqDԬMLN b7iťu$_RN,Uk5]I|6{ڱ5Ӷ]MznCo)[2V G7MԭM6'n?ɜocT/#Q1۳荹_6-]Ʊ|*S]Gץ[j-Kqy}ؙh: c4,%$ch4Gdt _cch٠.buFc[n My( ?Hu#wxw2B9gR4D߸Lx!2I5V)$`똪4)׆\ԞL_9ڪ"t{{w1?G ܋Y`Yt]/~BމF&0ۙͱ<'ꢀ̳^U^&ʉe90w>Z^d:BTH: @֠'͎C+nM Ur^&P+^F~5f1+wDMd$Z*y9}M3Щ&[>/A,Y_Q@&똺\PȕXYT`YLog.ޓޡe2>9:+<~1Ui r<g3e||LM R}Q,eLZu6&‘3\2ÿ|i:3ؒ8__o}uɑ#@)C#dyTDF!x+ʸļR ?:T_(ikU AD =|ni״cFo-~сk/lMX6#|l7J, pj9#aiqQ:an5-}9#FYϏ#9ʌы1u¶Nn3WJEf-_.~WeY @f~ TbGk D͙#|m{8>5&ﶦQ.n%0ե_O6f9Oc六Wb`İSt ӚzxZh7onλICU.~_x;&v4x[5/Z/D~z@7gLޱ* oKCҸqWGa#=C5mɀeLSZU$1R0V}w\6ӔJڅ /[}ي3ag[QmA͸Xd?8rLTy,*q˲X>^ |3o:[MXdbWIOú_Qh4+wıG7Όbm|D3ۮPP"bH?];qpSPWd$caAk64riqҖvl?pۦ=R z7QmRc3A曽 @0"7D!zQyi;kM* ;}·'ĥbȨ#;=UwO5V8]XVOuWa-o֮V*;*/xS'&kpB>ȱb_z cb. -Um̗.:z#G0΄ف}%d =EVd@ˇ$fd~8gř$-)ّܳNUEɠJxܗRQ2.a!,ΰc^ dFb;54;Atzw]jcY.TUن!u",E&ØkTuJ!%)ej忸W̻'9#S'Z69JCo]==\*W>9Kt%et/N=Oe1^`,;0x4Y~6lAqt{ ,# ӵd,nOF=7Q^K<&Qaɾϫ2q~elOwZDc{ IDAT $]ɤOF1lZvo]i3pL?OԳ {gtr`MA+v1fTjA@Af~<vDeKxxd/X,'H$"TU9v\N(h,ʞ( RT\]c'g2>l+$@Dђs;eW-Y$)Zy#bI9Rxy$s̜:mjS-QdrVJ GULסtDNBB8cF^}3lޓȫ2H'F>:A!P0ed_O8+W SixS CK(o2d*,r&5XLQSzղ&u]+ t8!2~aL~C'Vkk, 8x?f`Yܮ39?|o%n!x3q'Eςio?xLG5W KDWRzJQPcec$b5h-IoǻEM8V*+E[Sin7| 3(T(u<FY&Bǵ\=lV;xg%X<|GF:HJ#WcE5MAJOUEYڳuxWb,@ KcgBVܵrTklrUr) Ӡ}0 >^PY'{o!Uyw }8[5Ng߾z߭D~y'}UTz܆X\`n{Em GtR)׎q]EbӬ{-c'pQPB%ZKGj)0-%S/ HHTpϺ25+޴YxW,֝CNJ2e"F-`؎rHw~ @]N|DD|d;[3hq'ΤGMgs KH+|O]X쯇_ Fw7 u{h-AM%׎pHI \rEZ;=9L=¨\F wIX_ǣ$̮ND6J]g<&gweك37S=l`+`决JKa|;nR[*ӑ|#Bo0'Y%5P|l7p8)?֏U*k/LiP]2X/wI7h~ o.\H_u' D|PrM[ @;{6]oug N gG+ڱ.]P/`3r!,*Hq?@Z׃jlN~=S&Zj Ѵh|CnnEZ,;=iXuEiOpM|FMD٫w,š1W:`;![}p+6L[P$ }sK`A=w4 lݑt5ZwVB{s5.рև7>G݄-^YJ2|ԒHKyKswk9?[ "8?wm&e)elްgh oZ3-|jstЊZp'mKg],[/** s]}TBܱ#X_*>Qc LB..\JYb>;0僎ڼe* Ez Z%+FWعk/ieTԐwM;UL& O{Z}g2me-mv\ؾE[hvcXUͺ X᫐ ċXer9JW-ba'zn#C.cd e-1BjZ =eн˖SKŔB :66'@l=hJC,3/p:gQ-]罬-&Jr鍃%sS+v"<f}"^&Rٛ1z&|[ BʩHX٠t jTrߤPY9Vp~[4q$!LM$u&{/qI_e\ק3wpU|P#͚'dt:Z.v'y9Gцè|Tw*-LXiu\as ǎ"{W+aU\cw'po< e)6`BWDUrdOq ESpM+vBxo/q$"Wj4!ȴT̠("/3'4ۊe~Y`i߰ Gjѻq#GsR3l A6V,>Pcx^99O^ɉUɊի ܞƱDNSx޸>;CBs6I=?`sMݢ۸% 62R!<f) ?.=KGԷqEy@SZvWw a?sAG ,[|@M_#73G`;83t,[m_aZDdoKYwޞU}4r5;أ,fu'"xcOf0:7^QaƇwެ)XdZ /.aס[z!e5"#/]¹C]Y5(d._ȅ3wɯ9oI]PJXd0dxۆLׂIO?9qoՙ9rX½ 9y;m!?k,U{HIuU3}V@D_$o4C[Vë<bלv`蔾/[U֕*UOκXxSY㪊*.5T{{"9d} ќc0 \5e^01X{srSΒNsu;GvJTn:n~%ۗqf d. :>Xk=( S2}VrʙJةdYYF~Lߝ^`^/wױSd4n 1kw(. NbYxE BqזS6>^ _d9YjG֕3g'kW_VSmAL.Qsw%ZҤv3.TY2W{DP sz;v`8s2"\^EZ]NզzEU6}A[psQ*<!M\GXc<.KJ/R$(`;bK5c{7lҤwXvٽ`KWM {;gΜ9g#0 yl\mJwteGF-Ǟf?Quȯ}zS8f6ϱ= Fݙٻo]Ŝ*e{ y8D -]\L"& G+ *:΁Gۺ8uxMN 7gKUa_؈ Zm]}a(. 1 nWɓqIT*㰳o"J)S SS/..@\\\044_N /111( Ѯ]r!4W^L D."""ppp҈@*{k)_:59y${aԨQ$$$|IòV7Jt>]v$jHQ7~-̀W{yo ߙVJ|D D򷧿DY7JH*J˯DV*2O @dZ2FP)U? 8Q$%%BmgϞ/q9Q"_->.&&&sՔv/\.UZ cc^}}}Q1D*҈t*++ '''^JժUEA|uDEE`gg' dddɳx!jXo!j'Q""]4g /l{6mO>ʧ϶ ȗ @1wOB)BW)"""(F»Kn`TfTQ#t%嫫i}kķ _y5%Ϡ9\}߆.Y6% EroV0c_y~GwïVm7Ą HyTc֥R[yR=ѤA-*6ӄ-<*kd5^= ۈΓMzOSt?ѯо5РDݏ%Y.Qw2e@;|kע NaTEUZT^}gq!zmya,֍Qͺ0fr^k,k׈#r"US?j:eVgQԮKZTIH _@FT٘^3)oITmFyG;H7ԧzY Ҟ`BxWMӁx]0c:7ƻJYL@Jh}Rh2l^rc@}a/Y0zn%N2s$~0dg/7fZwȤd=<Ƭ%hJ`qq V7Q|opQEe\-z,Ƕ8/-GY+Q$\MZ4!r3(Oxd.YadFJh]ר˭PSmCp?NTKV]=G9x@ƅ#h>jCxqX5:x$]c_!kSX.G?'(aY* U 'sW҈J䳓Kٺg֧zӯgg8vOQe.I =Xx9k`Q"9vo^sj닍[<*Fi|i≗0E>%JUe֯HyY3[{AI{j<;(ySrEs8ZAÓ-M5O«+lDc#ND\2)Vj按&$]9 I<9a'\<7VLAtC:ZJ=V:iP"AMK]7qJ;JQ;I >: dL9*To;l[ ^khj\c ,`C%Rt)j@Zhrkb>R5L%sdɪ?~,>㗉VH@(A;QB8d65ӧ #77x3tQ'A2e}ޚuƩrkW~gEPˣ+Yu9ZV M XrM020M :&%0ȸIV3 Y._V"@ѧ5ּ2WS0͌'QƦT*"WSҴѤs0xIL])R넥9,9kr~<55n?@)/:)\T?TC{4E 22Qi4y-AMҳۜċl VY(f`:07՗Żk%$ڸVĔ&"kF˶,MOSOc2yu) =DSȬ@2gbC s@1zZ~U{"C#C o0|*uG2om̀L-] 0R}$2{ IDAT˧*ؚQ GYv#<''}"WQׂP:#5c7<2q](Mce/їH5B+%D%XkNrR4EHZҲ&X > a*vOγvu~~bT !9Cs#tJ ^qaNmY̩sGɷ3L;q[Oepw0XAzeqZ^=(R9N~SEA UKų.u1f61Wr,CS}Sǯ2 9K~ᪧQ}KPmƌ y31}z2&iq+|[q=vpYY ˺ՊLnLUkh|.U}1g'n?#] iyR,m[3mw='C M9PR~"E&TC/]\@ 8ֶ6]]1q^'X3n=R`m 7߳ lc|~j+?֦ܾ?D$&oHލ~ӵk{zaTV]pi=cP4.f< QHBfU -q) W7~5?``m>?g`ߦjrxp|1+nwR]}<+:E\r9iGr0~tO*Y}kmjK|C콩̩s(<Nl9ErxYfdȵ֖%.!yeSbH^KL"A̼ Kgp}n" Jwe^ 2 s+wP[# 1b(a{UUBL%Q?!:>%";{۾:z8zBODZ[׌p*늹SU)7,>ZARGwom|㚞NУϷs1ꯟgל:&OX{:6ĿEBˀ2^Ȳ$ؕBVȂDem@jW5nOfHʯb)6 sTbwAշ*EF-Ъ2ʈʶ`hA&-ز"Ob;RZ@eJ>lZI&fZbdi'8z(VX ;㰒$eEH$HAr8'dTB@R*iR~٢O/X=*fSoėiy H64ں?@¾5WY !!jb%KR+z!aҝ:PǦ(7@[>K1HNHd:X::bA&Lܑc)TZGhK#4$ 52Ll2"O}2tۜ1S3 3E?#cp6ӓ:` tl2UnX9SvYKuek20?;JYR :5j{$r }Wg޾l})ۗOaKZp0|nv[NǹRCfnHSucwKYzQ˫s~G)´Ղ]ȋ3Z۲nJI^ǡi:8Thϫx"1X{l]nJp,%^xXT┯; #`$;i 6,G~/W%;[|Ejakk]aa`` ...~Qrj?EJJ xxxc /111( h]r!4W^'0>@ZZHo9KYf='OdϞ=5>i1ڛK %w.;U]SQg?Gזf@DD+@> ȇx[T JߊRqz<D"BD&ipDm ""d$k?k/B Y"xQe!! |EYj5.\mWOm7W,Bw'Ћ Sŋdgg""X."5"׀jZl )|.XX.""""""""""O .X"""""""""""D"n+R|).J)\vT SDDCS|GX|'30@=hTƚ26=QXˠ4+cɛ%nή Cbogl}Z3?zǣ4]*4Èn1qlY7#PRMO6/ۯVrf"4EF f7hNo_ӁPSʷc~hh"(qh=]%:[Z51oΆff7>ҾP6ϜώT~BϱeN=C%5;wk! v*<$1+7oUroOCQ6O3ՑǙ2OJC'7T.m]?oMw`^$$Yg]~ؑ 6H4iس/*þlCjgq=$FesX n ӛ*KL ̊myܼdP+/tԩ>Uv1Ari*EOK@D]# Ѡ ZVqx=Ӹw>==-QgsJAD8gvCm,\{麔i܃1}jc7pt|o:EddT[%{xcl&V *}Yz8^FZ(blrN+&aƌQչ!ndNI4m3OHVx[n%0ҒҸ 11hu3ٟhߛ%Nߎп:vaum3rø$E^6_ׯ||Fti{ʊ=*2ph~3q?ȨJ,J!="o{2wLfļDgh@jқ=! NЀr2\) _Gxva$Gg60j$ۯmX&C%b̜3WlJ~icAf61=n5<49t0CY&YJYciPHFIdskbL08 bhSF4"IOa$l7N%]ʴ9-ZXF/n5յq5-Ac(n?% wfRR;tbNz]J,尊}m0j֓Fyg.c6gܩuyu3lMmhr9MI@2@Υm5#Qj8n^FS-=[N'ޥ P؛L|).YC94zbO)-\Z 7KrfԴ8yCfb.T7S9i+{5| "\b#I3q΢NΨ6 &3G/CGm̊<ϊՁ2?+\o/QE"NJbEsUV O4L֞{W#, D bhwu%ʚ ܺ3X9z^M srGq2%">{—tzT@+\ OKMrqӴ?em>B{1WG7'3ǣpo1wB+Rs*UDܵ묞l[Z ?+T%YAJE{= CK ٶk̕|,mRxS8 e[a\j4-AS$gpQT6- sBQ9jEC`ɴeHyK[t PT"AP^#q5=߲8ouWH#=m)* /ϯҨd RuSб3i[1}\{쁴ݼND6ޭTs}|IcikLsi9&2jRvMRQJVpxLV0|p >Ծz23 <{e1)2[|?s@[ iz,Yij.J2cFW_:N,^#A@@\폾 R)a1ūκ)1v|| %5No9$Q$_luq#> [okqYzz[BKT"˚MzRgfx۶ }&"9.ծoNI)gJɕ]_ifDˀ -~2,boXzu (zQIBPp%stSh5NemWYh0-"}7cw@Sl\|P&dѨd ǿrr2AbɀPӍ?"[ˍ$8go?n1õD)6{22@Ϡ/Ok :G 0`^(hf+GZ̛ᓇx=B?)8eqj2K1q&dmf0c˓PR4p68&`]]g%51\ԐTmJ#Ql# @'/r=84 UD&AP=`͂!@c{@zv~- '|D:U,s+b\̑ʣ,R(&˻1ĊAQx%R[W}JG{;Ubes;|M&K{bw9  L]I4 2~{lʵd$$b_b.>Jo˼lٕMH5񠆧 <)g˟"=WQ'c{ x'\}E;~Ìad>%26q~1ZZQ^U6. 8>nt04ƻa6,'(!oa:ɣP5AVɹ|iY($5b6Td=~>O|s`bOFRGϳߌj+~b49y[r]K6,'A93S]w`X%U̩Р, ͊~N+Eo*bORTਇ[-z83K5 xiz962xXoԼ\/֙ud!EgR 3JniEEi?؂}K_e IDATS6&Rp'ڛV.XӰn96N[΂f)yg0LbxF%Wdw^ȓc@K3S#t^Ti_'Fcu"&D ősl4%zʾGHEҞf0ʶE)tbbRA*Ģ8 X܃=oߜ< =E!h􅲝ӡ[M- h_0NlY'Ձ@,RYb  31ui2rMfP,kO #>'-+ hfdo cbiWX͆y$5 lٛ[ 6,] #z%^:#Q!wDSIkly[| ;g:u@t Y9ؿp~Uo(FWvnZM(ط!6\;dRtaƢYT3=&cmB9kn&AWvs6–*0P'pqq$xf|v'r@/7sN%s0ܑ+0ۦ {GIظ: MǖQ;u&1.ٶj#5X6."!.slYk:X>Oi):^]ErvVeC& ф? Ďlǐqԑ&#!{ݺ1vQ 3 wzƟ73H[BKeq ٮ .gzO eq/K2e]/Q! }Yԁ \\, b:Dd2C0=`_f'\4*4y~pn]ȥg(ƔõH+gݻA1?/(HmQzQQj$3RUf~}LnVQAy[$cYbe62bw^ ,yGgMyK̃1N{u0එ6Xǒ5 v($hP-6zZn,YoϪEyF2Tz8͈Ki[գzcQP,QӥYLR"yDU7s?! N1*d."uQW B-ޜuv"A2s~$R,| R h ޜ_;R;nh)R 7ۇ4Tׂ5[PHHu|+0]u&Os*8l EPPG:₡أE*RRR?^111( Fz*>>>dbV"""Q --s3γ~zN<ɞ={5j vaBa""""""""""RhZˀPXESUTlRƍ0D:W4mχ-->Y> j{{{tzoMMTDLDEA uBLyƱ +9DhXY-VX=8r-ՙ::zoE1緳]UF6Ө1=IB.bm@4YٹK%lD9+= ck CZK+}8CƵZI"Ә#9w?LLkI&}`FZAųT nUؾ!ߘ낐I8t6jҹC=:˻ֱsNUң&l͵#:@tzZ&vmN;WLB.ffSw4tE+\G},%jg`Ni:-t[FIڡ=?s !Ol2nTL%16@dG  0q#3| 'V#m3s!sͺC3~҂cã*nM6@zE "/*AEEAł  6@H/;$HHl#' LJ;3眙3s ;HyĊ/ڼşL]6S/ڒȤ ɱ֣E]۾~G&o n;YHnA5eԬWyS-Ӑ\+<6C#꧳YuQ㓪S.0жK'tDn蜬'uv +5 [,L9.4yTr̟Ϸs帄EKi+c% 7{iܮZ6Z|OWĚ,g]δoR=#X*8z)k罱F-߃MG*΂\2s7nEM|^A} !~wѐv#9z$B|dNӘv C8h%ʲ3/wr ίxxu/77Fo("h:|Z9g}MEf+QFk[wCtU-[ӾmڷL"c 3Iwa(V0PHݺlCNrm?0E4gvMè/-q:-\UeKj!]Чgє:Ō1O3p]zķ3yy!E2ʏ1m , [8VO`,ǎ¯.~`0 7ᙗr06L`-ȯO3o4՘ƺ8qxP}E&s>_ }%l:X99oQgRh8Q dۀ?r= :u-wq~\];gmИ $6{oZlKݠzD I&)FFNx5G" &~:AVRhX0ב?>y{5uMd>'ϸN-T0rtIȭ M5(E"L mޡZϪ Qt]47pc3{fF&;Xpޣx~סψɋܵ~ anԚ 3ne@De1:;pK:gѩVFB_ԠHWK׎o IH@{֪#?$zmD/IԠC(p$ȵ#_kUY+1K(t%ȷsh Z ̴yYD>k)o؛g/a-CyAĘ[pǴlcmԕ`|ԛDEADAvh> Ox~9faf?/dqN$7 u=| {sg?+8+*!,4W}O=r"a 0cJŽN5 HO^)G`VHg:+fe@@x&'A,Ws&-+ضn!it4㤟#Z$ID)pj (@L$pSPDDT9hk40} _WVa2J"$؃)!`"hp{ ӫ " P%J?Z BxLdn/Pz-wꏲf*KNt&S"V= (""FAGxMADrG0Z0.j8+%4$s\ jK鯤!)Nbt"4"2@HZ-4s+ 6'S#ŒS[HӼCJ۞.6ʿftEHOeO)~2L#d 4<}{w$WUjeAʍ/Xuf.")Ոv̓\V:)/( Ď\({q\FUEH/ۉd2 @H:s _A:)wy)/< K|v#l8KIfUדi e~[OAjNffx~r+s.# \lpFBLxx8>lu|- ZHl߹q8R7XUd>^v6Kqq @i6{w}Nk?e]lټS:ҥe<!N Ka@8MhS'}+38\yvkܹ{/|;}*_.+CD" "8I8]0{,sCh$UQ^Θqۓkz74rJMwg#1ʌXO:CEA5 ]vq`*© 1 .k} cҲ8e0%^K#~Go~ dL@n$ݬw{6㟔I$; gB$I"7/~wSٍ8)'=^ AZCQ^Q{E9O]Yt_ g0tV.]w⛦b.U )Aͬ'S^< h|eK$1d ؎}#-|&h|7*R* Ѡ{y1>d`D(܃Ђ`UT=0'ïOQw݁3?apepfSMd!Z Gɨ'RiAV^~*N|_?Tl+{)0aToNF4XJ!'$A)&a45ox/_؀L^n)r?S<+ a10{.=V,x(k$sݘ0AUmiŧ( OyLk?("ZcMcX7>i[ GQ?* }K1ynj&BYVFrs>~gvtk6WDKk[~MM{XwZy9; %Ld>zØI7iy/8_d!2O9Ǐtzt0$w[0}r$rB]RE਺c,S6z*3LcٚCT u=  x]?l&mh2|Me7o3neT2}54OY!xu4_n:Nu 6b" mavVtIPȷogy/@.G)CZZTS ͐ԝ!{=6fƵgHvDjxpW4w?uWu@,X~|& <1ގK)Кzo2~BR(;`Sn2 ܬ&eۛ`J\=;0/.c s$d0jIJ))Igl6`=k2ۄc/-AFؼzq]y-<=n'uz?A:JKKP t5JcZ7C&Q_E0m#4M 'WL:9$cϜ &~Ee'K~P?V'/Fz@A Z0U> hcNňؔ)|r4 Mk67D]/GC:Vp(9ȷnGJ# ]%3jլlV8F5 6v_ȮxD xOzU  RJbu'L&Mⓩ([-xdLNY(6$cn\ktc;chR/?'z9L'#b->SGH?a'v4B! 4 dEdɏ_N#yMyY`,jø#@UBWĶ0$#T(f܅]9pۊ>/brnyVDPd\ff݂/d}B]ڦrH/͠1ETt=qCZ<+xmȁpŜw@yp~ "!J2jCnI(nNnOk8EpgtVU_0Mvhbd=.A:q$ljSy\2>W%ľwqۊL|}>F|y=M }cmU#*%629lXHlv#Xrl76{@_J+Na$~>T[`j/=I@f[p8s?b"+Yi/$4$׫axx:e:eW[PEEEEEEEEEEq@Y]RQQQQQQQQQQ)U7 kqЍ1$v]: RuBeؑ' ݻ0|Ve6B.e}Z3б'wڝ临$4Jֵ8rFve#낹UG:5[Y9 :սC7-=2zmӵMyRݵ矦(eŸ8t7ygeÖ-AH 6e6slEѡ}Cª:>{VW9~vL7/?⥩DvLsKulw"Ltl7ŕ_6'#_ODB :&["!ˊ \ZHoz^Ace϶=^ M;ҫum.ʩHc UkJξls ؆t֒'lbޣ8EBӣ[s"U'Wp`26壉l@Ͼ3]i-)"Y¨ۨ=]ŠMvm?Bˇd ^u~bxthz ˃AGo Q4tvOqg5 #ٹ+Qf*H߲3pVC[qЖ):״}[X1bͺлm:U U"*0"~<$n1 #uVƚД޽ZxmY:<iA^-?T@4W:$9YNۆqt)MEӝ6%CO9`L 0K:\C5iրm?NcwRM.ğ;V_!Ͻ.+}) ܀@SSky}DV g(oK?if};$|3,ʤeۄ0mFm\g/ςos0= `0KIoqلRoAS;zX]yho> y2/MYFWD2R`q@>Ge`BcQ?I͛s ['7S/.!G7|N{vvQƊcG8Ӣ;=tmY+)^UGpitlYl]:٪ut;,-NoE&f/$/ !.Ix ?*r(//'<<7},c?-YCWqb_=sal>?~Yy3boڏט1SV)lXu1tnIe+홬^MD5E/)^0g?ZۢY|µ1U8l|]+3d^̫Leg~ N砽}ZG;ƎNM y(H㈫>]8}'(/:NxH$m+Ml@̉\w_g[2\ ò=Kc'谇@DEF2עy>/P)e_~>]KSG^sPLCtU2B~׼ , O qӺXB߳|ITȾ%߲d8=:$qf3rp ,'^/Opl6$Iԩl|cȲLtTԙdV'2O{nn8?LEE; H(u!Z$7es"d-%mǴ:Xs/~WۺQr{4Ѧ}J2¬{EY4 QfbY~3gW_ҳhZzfBMYj/77pJ.(_12 moG $117`1Y1VFWs.L%v`+bprPf%7GX~fMy$GHs\5a-oGf2ΦM>vf_:gτxM8:I7j@q.Oo jSQǏ=hN7BU f=؏ޟB-Gg G!`Mh]#11hK{| ;9|> Zƪ^cu{yc"ia Ш:k<#n'ghk ${]Z;n xFw~OxhϸY]S طu)ى=xh^W.,XZ:fbyN$w=2Z2 Y~?a yl8L!Rn^mk^D I.fE īAL7sn?+r27DkF/E+*W B#$!"I"?&'&°FھÍN;ѧG!^JZ}ʲ38BMo]9(y $!6ĂAgDoЁ>%X%nP{ES洈`L!o38nm?~u 3۟apC+,_|/=GOݩu0iй'=!G\dfKd5m`IH|RI#% $@%o+hܭWwTB|b-zG & !Ɣgn"٪?(LlJп(NVL9pqgI(s 3Za61Yݨ;wՐ=WǢբt43K';]٤2OU?Y=c!ujK3}) ;PyE?D6^.v;"KYh//dz=<ڤr!tOQ:z^ޏ$?32H"D]95c8d'Ȏ,cye ony>[] ŏ_@0"ZybK2@/_̰z }KgY<oG̗}!CF!ߋ(e4ՊωWAҠ.ewY/taؠ$GUw_*%8J=z'UKۇ7O yGl5|ke۪4극PHZ65 >d6g;V,tgʨx)*D ?gBW5"WRN).w?'xAJJ)45捧 oݓ~g7dPzd.^CKO6\I{q&֯eˢ(c#r #m#]f>7tGbz?ZSr{xlRܖHbUSJ$Nd՚UظW[l.`+/^!-1R'TV/^~'se CIwXSn,y9O_& לɅ%#r=2J ADOwz /f}$?)?̙7_On%IN*Hc!")Mتu1a}%zB񁥼5eC?(PSs0Ϛ]`o0Zʗe>cZ]9M$>C$%cP*8t#FGQ7.lb$׌=t-gp)/&Epd(#s iEP86 O7f"dN_S73l򍄪Jrm}}89a:@SRM <8NqA~ j H_EOiߔ_&udo L0Eyi׍<#jή >Fs0D>1@Fۙ'J]lfݼ7~4 vs8^fdldY `S7?PEehdccꞈǚ5{gDEA#{6$kr>Nt п{ƿ˳C+i|7vJD'[z L*߻ ]pxNT`(~\R2ßŐ6HqM?L|sx~tDIⶡD$X'Z/%L汯}(~К#h;-Ҷ*yHL鵟p]Un FUMjT`䥯S` os$Yp~b>@rv[(⳴;?tq~d[EP40}c3?zNd]}L518 c:&}^1WP!/m-NjwSD'_⦨ M }(|A稫qPf@L-]ﻑ~/=e4oC,eJNlcڤYr(|2EADr#GrDDt}>g>Ƨ',D&3x =59s5<)6Lçyg8y{fP++嗑O RFEVLq Ec Ƣ?w4K~_c(K)Vfh:*,hDD^RBӍ|:*ћ  Bsd¼TUH@d2^? 3d&ї#--~^mȆ: h$@: qB 7WT(q(X4\+J]E-A!Awݻ:u`f+DtF V]pRR/1YXxP IDATL7WdE6t6͇r (3 VeݔawyDz*2dS8U^J]!$"$JZJKK&%%巬UR;"h0Pp;( =gI>v 6[CYq)ވ5(FMiq)n љ DQ_")_Á/Q^] %I(onԲș> Aщ4EN?HvKdԢ}S8Aݏ> ID~}62Rr܏"+Hz3S'!8r"I@LBuP98X%)9ǣ|J;Yzil>!E3.lENviԲ>s_žѼNjTT|R2%` <.=l6m3Oy0%O=HTXɔi4wՋMU nYԘ^J˒z9}4Ci>DhŢ=,|y6벴*-gȎ A, Li~j]np+-tLeJD||l><2n:E'7欅9s9Ylm\_*,p.Ggyse+IQ Ø@Gо.μCQ;H}v#ٯOo-S^^[I!0Yzdo7}G+~w_˼|g]J~0%LqXH4o•;3|2 gÈV& ^vޒ,2\;y:j_u>s +2ظa/5dqhvnT s]Ծk 6¢`XyƋ]Ff3g*F5dnX׿?waQaW 7xt|e:tx]., F#?g-@U!8WmsjNi"QE+s>BMgztU<Ǘsd~O13'}oQ- aH8[y{v;:#S2?X.ad7 RM3_~F .$*3xMem4S5D.`,b'$TOAfwc=( rf}7&A27,7`[$6P+o+b4˦up 7d&~XLh@N-W&V,9ynR!f5"{عzNPɷowVp&z "!*p/oyOlOG.QHzX3Hs%?>O/ZFm A6 ϞKwpw nF0Փ ![kY6=Ð`,̙KֳH0 jUKc䶶ͨn/hAkD/#Ոay^FJV/8&G1CƉ<=F>}I*7{K(>5_Bf4b$2< V漵~l,Zֈ-$x֜~%gTq`ԉ #j#4&~K~>K3I &zx2SzBϿ>vGy?[pRb/CKX|Otn=yܤW:oX"9tF)(_;Az42* .Q\^ 0:5&Zub1}3jAޚؕԦYm+Ckoұo0TIyI+.}kViLH<\~UƯU{[_8k\.(9QbN?\liA&so6..0k9|ѹS*6ʾ|/<xTl8)wuC8A~hF~=Qf'/9 co:"eew4Os{Y3 apSΆR^7^=̘o)D^xI6-a_~4h?qxWgN}MǬFnݺp%㹖ra*HXZ:yޖGS/wڎF7p_i 49=ƾ;'"<}QL]~f97xpcWl0Gtw97XuG6 ןhiIiST=,ydzUo)#;(T79ax}\$Ks#w4O<;놟ۇug:ѰEқuⱙ(rñ }fLk+!][ФU+|Sq|=YI<~$yޞ%?nPc &ӳy*5&\t.=YOcw!T_H~$. 0ڰ qeرyo,?JjcT(Z)\ϢFzupVT,oߏSJ"nٗˏR} gz.ΥU:*kbXM~ĵD=zLIrBȹ~S4rȘm}D#ƽv׌ٖuա{}l+wkk(5_\έit}^B!~u/dZiԴ)`#ݑЧ DŽOqCSMzؾv}eY,`ȳO4c4hҜ;PMU. /A4+ D[ S`gk3` ]Hh#D(Tb@9J0[^aف_) X9;d8T732O'.<Ȃ_)4[L&'1ri%Ul/WSA4%Ff8{1to# K<>|GJ!{(OKBe ("xlЊۍW=|B\a( hINDR/8AY©^?:֝ƈx;,93%nl7@P|%֏,%"0̶ r4w<,+~ʀ*lM̪Ŭ:z7OnL'zվyB[3jz6 :C_PɋW90nFlG@T}<9w:TMẺx_>2:hXǟZUHJYܞAE{fH}6se*GHu99%OQitht%2gtMzX_r[LfU*oMߖ`߂E$%kckdVuxbQ8ǓK l'p<*5Hoƴ%o77% Zdw19,4r%G9A!Xާ-bLjx.dDZ=16zC1:UKeR^mBTt/lIESFFbdH^\ *&%Ed9I}2m0vhK70ѽc)eKQ^q-]gN QgG5 0#⠨ f-`y&a'IaTp] >$qr$*_?`kLSP)N{i!2 ]-i^vdHW d#ȵ$R%TS%0rv$eQrN>L0y  } ]s~G2a TEsO]i&<%g(H89c7dF-ɓdTG4\8y'~CGYefW 7M?K8}X˴AH>neEڰ6"ApLdGQ y@"+J>仞!| 2yG;p MJ)0,{Gt~]>;*z|斛};o?Pib='MmJ wc<ŶKN{Nə,}'-||q?x$Cq!G ADt/p nK"ד<:? ?dUx+pgHY.J>JI~1~*lRQ_!N n+ UjfjbAFZ­}MaNK#ż6C7h^7֢kx]scéu ޙBX#; !R+fGJpST"`:'!طtNIT(,{(cL~;Q#Ic 7Ԗxm)TF=IQ~ ͝[78{2y#ݕW8]r]u>M|Fx#f潳\AYFAG 'M #yo vypzmt}YPv,[.)ޓeXse[WAvejLv85dy.5doNb1/>NР^Š^- GpZ*Z؏ؼ ;gTߦL:;y<󉈸˰sdA =n<^}I)Ԋd"|z Փ]efr,Mlr"6^vYzMﴫ(C2(F@Ը>v rWSV"եkN>vt ĩ 9rv?8I3$""<[9Jd6dAO|4sq1Εy1SFz|XD zbbK>u10KN'Bݻ\=r dQkA|\%S~4'2QPLD'\#DyYN@BR{i9GSBcSV=\ƁP%Q&^C{=Bj8%Q=%eI\d=LA`4PRRBvv6j,LJ$*w IDAT84E%aы#cHM mlxK9y9v%jIqU)+'1ZHJzI"œ9SFZ%"tY>* 39u%,bHKy^&V՟J|/Y\9ؕ#AU PCSnIqW[l!-- ʓ,SVzD=Cl9AJhTa *wY=Ck%<:MFF珣>|b;^TKæ%7Ype"8,P 8=[9#8<tEeeeddd qaoO?qQPPHn^.QQJiȿ+"@nnqrsQP_&@(X "BdE(((((\NAAAA߅ZҎ{p^Mii"Dn(n˯JwRz(n-***u ve}TI())X(([|B͒[޾=N$Zeee?) RU q:QQQqׅ墰Z pkvq:KÁוf@E|>ڮpvb=ׯ?]H>ȈH4R70"22%}HLLh4*Cᖢ,jԨ*Wnn.8u T*w8H5W-oYzJKC\3R V/}|J%(ܒsbO:3v@X,Yi$K(*QAAAAAAAAAAk{R5z6̺ _!(-ԁc Y{1` h존 kxD fAVc:)))AԘ,6z~^BaIn`&(ȂVYb/-+ LV;n*d*J":@C8(.,Po_g\vG*$bҪ"(ϧ]]5YM jLa^Lc\>K8!+u|\@" >*K)p@bذ8 s)"2" kZ!y]Sp#>?_H**b|9A@@Fc %̬UVBqz?," (+O@#0ЂN%\w*)~0n1 (OBPi1pPTj#Ɉj-F ^87$ "$#*QD04?euXސ|TS\VɅU_XBm/$7P_\UkG1_.+($e+9?H@uPTPDKBm0dE'^g+)/Q QM&@jb 6/z?BݍۧnxbP" ̞gxUR:!aArr.,|̘9V/>ggTc"_͸(8g⽍g kʈ.^VpЉ\OLx);Y/;N}"wă"a`J;s*?=k̙eʳv7XW.?4S[5x ix՛׾ެO,)nb*O(-b-&Ge^vk}Ո TtrnrFMGah"C4WfÝ +1u>g6aπ˿ s C;NdѬ!.ϗĦOxw*v:QVw"/'z Rx=^|F=x&7X6i#F`'h}{y,Q@DgGU˦ә%J'.1.51 l?۲tRG<&(So /=EH1Gm pQEn_GЊ*m0Ƹl坹o`V2;ONg Oq@CBr$zAM(?/t\ 8ǚboNJF2|DKh }7CxMV$0x;o/_!C '5٤ Cfw\n2Jm3^yk .vyWmL` #'Y Sq<6%^ @.SFqCHs⛅ߋ#҉Rg|hf {93Jݓ62ij217~4'nXd{sIWqF"Eee>C2}Cpfˊ<󄬙Gc UL8@AP7vdb~ɑpjXx(o;>ݟ2o2|"&>}ǘ:1V5eY'2A値ϰ89UF~mV0 Zqf {U%x]8F:#$Dv~j9+Z4Zn#4})iˇqrVeG1a Ѽ ;(e *$x.bnɤ&RJA#sɤp26 Loy}/c8)xm@l? ]JaCިQԭSH,B6>hD6]hW]bSTސz\v˛7PTw:(*6ǰMqDץ~fsząР%ܮ#x53n'GB@Tۉz S#"[?!,M wćݐf1|.7̱d4kF93~| *^}}PɠCWǗ5VMBcjsh{\ّ*$aX-V+V.sPר};[ {lu `OȹxqB_Ԍ#"<Zq{ QQc" $@#j=F AQ6ClH4GU4X*3fAjuCj4Ħ~|( *5ftjޜzq!؂ѩѪUxr7")(}pU n(ĭ'6)Pk5y@xxVc #!1RPg j#O *=@65bؿCyUs,{[IKKq&+py0 & :K9AҒ0Zb~og,?L!97a-:?-TY2ފ|<+AFфɠE8IvItӃھݬ=•lS ڴǨvwOj:IRTu.{ 58RZҨ#H՝@eE8~՚&Zά<~o3x?xu_""|dj*ϭ_beq jpggw%tz#a(_L6Y+#qvt/msɕ rᬀ5DxOLUn$pR-:tI|':JU*<s>PFZxb.^ǘ{{ЩGO:uEr-14jܐH{?^t3ԥ?gbqͧ$unK%7>=zѩ[LL5LQ 30qT?1 2|šmkIc. =ԞP=xR $6;T$ش(qFG6jŘ>0O[tJiFȄ`5k٥~ƤelHr~[J[nsh׹'ß^@k"(0_wr伨pT TR5M8^3YR~ 7e;VЯCW2gT%+ԅR|MΏe^ 1m'gJx G.o?G3q@ϋxɅm(O,!]o.wL j &mqTmHC\z~X.Q4MeCzm1"7y%,AnMoPo{ 0)Z,c>Ě;/kr"Fʸt xK$ŋWe"2hpAAmfywi^0Wx ۼ)k 7;K&s#6dtl.B3ZcWL:WŇ~mXE %=/uύ[_LȂFd\E}{/cRM>wى|853v|Q?eCԒtfdK=k5g?@Mjw+j"^15'D" *ToZ% yVp_lSz{wG1[4}MOR .h߳r"u~6+w%\tń5[Z_YWC[sC2U\;Mϝ9}xDD'b3io[?σ?E:B3VfAPQηKeA>xƏxxR2_? u:DQS!,bH΄[XVh?keV)uGȵ9(Zyh} l$@(%X_V.Ă:OJf=]}\J=kig^g5WZ'"xyP5e}{fKUo}2v * I"xs/qp^} K/x"8"hr]7w'媈@264 'OOG;l>52Wms_o,S-0  uMKcIZ>3 ϣj`E~65.18ƭh\]ձ>h M&=4$Ö~oϷse R(+7hQOb<ٸ+?AO?D䦽xi/}p?=>'mΠQK j5_[q&-6FZ#`_i9s6I<'(Re$o` Byr//Re k FTS4J6!Ƿf҇O:)s x̤׃JMˇ^J=*<E)GHw^.2vLڇxeDU`:}|f3MQ3u_$@qi'./kODt(1՛qk =T&G3tyy2 "K,!}#NƋ+ TsPZAgԣd2jTve,̺![uT'2~+79jjk0 UTBp~}DcTK!TPKSK^h $bg}\N\nQA-Mp=’ӿ0ٶ#&ܧ&ߜɼ.sbC:1jAFFt-;ıBD">&dJ*]2zd73^O9ΖGcԈ @_ ^_P*W>vNѴ 'v,̷fł|JiX}~bż8-gtپb/`[/)9훖N壹s/Z0\>xtK rȒӉsY=|M-1u:qOȸ*u:v`C/ Oz{|y w&aӌ>3όf{j V-΢*k P|xsU^BdY0zP2)M8+ދ:<8t~^~gμ)52wߗ6 Y N8ړIAxŏ(w k}uߒ gdFu*P%@Yn>-#$܆[=o1[NH {Ӫ?]b.g.+`!mXp+|ٗnܡ ,_<= ivS433c_|5{29r{UZ*Odq03GIo2* 7pY8e$rdQMXh'2&őa@r}|`I~f0YC!j4-ZڄYHSHGѠ@앂BlOŢWVV%{$PIn܎!P# fCNDخH@p ?F#&ɏxcmw"D !ԪWj65n u@uZ&x IRtFڭ[P?1F`&469(03j5i0d-"mY;NroFJ_p5ķh%>9z51ĪyB2_ 1o "!"Zs0vA3@*tm2ԍ2vkҕ&oTEE^%ըZ R[bH0 hujT-FP~'v"a,j%PVo/, Dиӝ3p*33HDl(H^J_P52r G7!׾<ۈro$S)++b䨹CB@kn tzd/'SbJy<пmߩ{w$ZuiI~rQVV?F3=qݻv3x`:멬D؏ؼ ;gTߦL: "Cn~.QJ4jb޽$$$t [Uֿ\9998N:[l!-- J0pk@ttRi 6E||駌7?')-?((((l IDAT((((((((\/z^Qu}mzI>|>7R$ ׃fʊ[.*dYQBC׃$IH>>߿# Η*(ШeǍS`):pqy=S(yQ"ٙD%v WoBV2d)@uB!,q c.t[h"F_ [oF=2d4"l؟)2Jgp6$Wl+Jt|;C{YG2zG*HO@*#"f%;q$=ĩ2-=H>5.˟J9n2E`;ˏS;u>۱|˰/߉+Tl>8[R ^ Z!nj[,AHh?9}XO2>/^l(hEQ UuC[IPEAƠK uI(d * "@va+WɈ2*BƵ(\8;vЛҋbE1Fcğtc5&&K,أX(t)sz}2?p@yxx`^3}3_oDJFiE$BP( Bb )۷u@BP( BY8fUUUƍc۶m&o@ ޓ Bk_]yw4M!q NO"m4ym>iFG !w3; I&^kb.Rr˵JPh7H2|t P$qϭaIt&/>~Xsg>GBFߞXĤn$+syiG 83c. SvXEL]E}x)Ukjf\ґkhx8@-1tXa?&g։Ba~9W07&p]_?)u\=GAAr ̣jY b CTmYu' xGA sլOB|Zz9jee|oB=hSf0A} d?o&W^y%O=aX# i,NꤳrI%?G粩:;{=FV1{>:c j])B%9|oL6 LDm*YkH pɨ\<꫏tmC-ޝ:N,l~8#LYI}y=@y\ HSxyZ'LΛT-Xl#-]ܷ2F5>qnG~>>´ףډY W" Yz1y]7-||3fLCbS5nv1#Og5f-U6!}}qC]cggֱ51rd׏Z6FՆ ,y<&紑Eb{)@DyV-+X1\ڷ#2"Һ;skzZU66=r tMxxRC ~0;/d2hp!?<ʊ]"դJp7?I<iEltM׉BZQLֳ%=r>kzP婷j)OSĵXj=;㒪oa{Jg;.e6PL<;BB~:T0r|X Rh5}4^y.l]u3z@Wv:PN"E}wwOR0#wrZvFs^g/oSD Lu,YawB"O ]=~X?6I.VӢ ս5^ys ΝR/v&nX5vV)?kQ(gtCPQ#VS.5t)$% nb/׮?S@Sl dpÙhZk68 [Sdm{qx,|%0I2}Jfr[gջռAmdNY):[0{ֳp+nL:SiA.~II8LH>C n} 4p fT2 :蒊5-lm6sz>(c5}qʣ[lkdB'1E}WMu ID,ξ>QyhGe} `i؛͜N:23VoU߅[N]4"p1Q6DMZ,S8ċyHץ)>|oDŽE"Ϥ?Iޝ tW]#hZb)|ftѲ{SԻI^ye327E͖:Uhqa S.Fތ(hvf*aK q*ޘ`ϒF.P<=VnP] 'X]2/RWWٳӧzmӏ!!g4$.ZMpUbRu`7nWO?*o$ e #Au }U{}v8N0Kh0t(lfok.n WwOSۼ0W'ua/bGB}qqyg:hC kaS ,emyLnha6%MKAZ&%!)cEQd={W7^iǣ@hoîM<,#t䧣=6ޤGQ>Pe4'7R䎫TEymI#k#N&үݍ)'{AHFlRLzb#$iDٲ֜9sܹ3{9r:yAKNw49*! I0ǐHg~>|c t/ %X3Aw%k{d,➳2Y?{7ϏDwk\02|" +P-{X!\}Jճ${,yDg[l4MGfäLa!hiN$ވ-c/@S]w6: ,h<%!R4,.ԍ3ON)f[{-PQ`6ҒVDXtHþ8Lg=DU 3+s7ەaZt X;U*$D&~\-S2B_y?4DьKg@ ճEq037،9'eI RR]杍d2mhK΂vT}&Lүksy_PkV /AHO{H>1&{Amr벻"-̪0-ӖEy+ :2BWsײ(-^[LN`b0(4%ayi~Cw<&ٹ=uи'LsY1}aۓ8* fK܃Ul@Bgj&ivfIܦڑ *0ƐZk2oS#$#qVFf53>ƒ/FGIu̽lK( K.OMa.SI}IY`STg9UÊe:9..)>ֻ̞%uu]Z#M{*jD",9 mRB]{wj5tŕT8Q~q+[|}QfkD+ $8\a5zNπӱ~rI4P$ɶz M`{x`ٚooGmEevuSN*d?f4=FI/jtZZZ ybY?:u ~i&7:JImS`?su6Vdwʢgxaj H917 <)@hi<8+wGC/(p%f0Gz~,L Y dzc6ڌRԕy),hPMndsՄ_RUzI3oMl/9Ag;Ō}MP[ִCukGkTc-nYX)+Hqx5-\ RxiLg~1Zg-(ǰtAto,س 2c{Z(8jjIM/`-Mң9EC?fuqma*9T e$?i]!Vx!f ZFZ7KI,[YS{> X~=P@"LFvfjaz![]eum ">i`=w)ź?_vxCuj-)uѴᣵei.׶03uf8=q/}?g=2fGxR&ЅHucLl[$u1Lh|~w4Y 5I Vw`x hf*^-ȵЍF=24q$, `tʺerŏ8TANYLiL|Sb:#ǔAx3~Fo)RLasV+OkL`P ZA*K+nGEWӞL]g@|.")uHj:dֵAQ!e MGBމCX2kˣ\pnS1\xdI)(.`r_?f>& {K5"̱5DcT% 1K^AX-K*Na1\4 !}2 543Ak.=YcPYnv?ѽG } 4DH {=vzDv$t F|o3sMqӮ À-4jWkDžƢeQ7--Imm#v=g1FRG!4A{ IίI21[׻v xdglaR1lXY͌aĉ\JP .w) 0:{3DvNJCs8Dg*^X65뢼APhQC<6{R }M~M [/M ["4{G&[,π-/ɒMxBvS:U hͬLXDn4V"Σ/a,t7 M [7nxov3jMS RѤKB3]j;.ίdƺ)à&$5Ƀ%-Qf7haZ }͒aE"io4%<*Ò!E|Hv&%ش\&wam˛viQKCHj&V'57ٕkqZŦZ]:'] ^e&jq[CI]#x<I"::6JTdMtRJ:/OVȢ_/UI\SS%H'VR(+ %IzzE!ЏEkF!Q^ޞ$62iU_nzmsmGJvxXmyȱ\5!ۨ;ځq=o_8x xU;?:7j eyVzZumIҦ)_\)]`quHxz۶GJ.քM_6K$p>=ǟd֬Y?\,Yrߺ:Y^Evj8t]# -q$Imk}~CS&ekGjY`_mu!>}%'lO{8AH:DA itOҧV*3yt]#,,bȑG| } )WsU++ BP( ha RJ,²>b|zǧ( ſ!@41 B/n^Dq]*+ػoTJB8,Nc*TP(c RJ*++VӲ0 CB8q=m値Si( BqqrWRYUi)\Pқ*q]MP(B`j%Bqa~( Bq өcGlV-P(NlۦSǎjBP(_([ϧ7u1xvERmBW(9>ˢo^P( 4<,"7ϯG G.| U+tpU7\P(v"?O Bq( BŢig6bxңh,J<4L$_sO<^~تqu{e5L'H˧< Ux/FK/]I8& uI)1 u0 Ғv #XCE]gsj?{}̘2jB S:)Ciм%"D#=%p5ͤ\C0'>A~9M`)ֿ$y~plG9wxNH4ƻPe]1>-| +ꉦ fRܵ'= 3P;zg?+t5M?LgCLǗәs>)@~Dhh2-[YD ҽw/:f4lngˤs:I0 fێ=El43HAu.$)'aY,]&ٺq={#.xa(ؕ=J]4XI0t;h&]ÚśpzIF@5 ~C5bvT6V0n=QhQ#6q|%RvEpj̣\C٩\}WwE&xFsw/B݊d@^P)B)€"˙=e}C:tE,ne$L̒x[e! QÂW^`s3pR.a6.x\2i(>wAaͼ#O'^_ITnkR :tPFQۯC8vY8  CÚo;Ʉt:aVq?υ/\G/I,Lа|F0ih3 'pYBʨ a%!tO[ߢܛӝWI$]$ؼq=>ӿs4uU8]&sMqRqmA&(N>Xacz0 ['{LJ~p~W}B`w1`S¡X /Zv%ߺa9׾7Cz.^g_~3K*̖Y9 GrMap?V @l<[D 7hѰ:^rKψկo 颙:U3'Vs-iějibq-z_h܋'N#Q3MOnW 0u,'Np ;> D3ޟf?\'=MDm$2rڅ3&ٷYz#*&%'5珢8Ӡ~+<υ?+/<9:iND =pt4Sj֮ڄWҏ.y6g[Kױ>eS6'b[O>r 2jڥ=Va~ ]pO2g_Tf{\M iS!#̒g[1:`{oz!w_3`_OJO b;yYD\//Ex:&d3 }FR3JOUog#g}y\;u: F nG3E#Ͱ}~O5@+zs_ۓiSGJn>ehz@Hv.5 ; zA'1s9w+xqJoS>co5+~3.+ر=DzѷsKd) ՞Ry.vp璝CQ^)D7$rfs_] dޛskhIdswדG34 KOt4{01{-,2Fgz1Y0Kw'6E0"լ\]M.5=iǹGF:U(=)gs|#Q5Wup(CV6%d]1% V,-7^Ǝ͠$?[4c®a৏G5IRm\D*D0-|> χgajIV͛D^|1 >CGpy߹o/%jbY1Voc쩧2fprCM+pm%nC+2| TeErR5[oSKV,XDɱv߻b3b'u/JmQ NB L $';Xț]nGQl.iOvaZAҼw#V=;D:^3uD-[ش-V I]UPa!EvB<+vKꪣ (*(c#ͪG]1 -hG9E=ud&ECB0c /̲< h LUX=k*G2B ,l7ܰt׾Ý7_9Sq` ~#kk:0`)|opY!ڝH^;G5VWj;֑]6ξi֚):n[`3͝}w N?Ά͞us[# ?F9盗0"b@w]5 zgId&q2bs%cdڄX[whMMI HۮG%\fEͩzӘzΙd%ln&|2vP,^; =qlOWR7;߼2 ) H:(Aj/}lr/ōBh,e) dm>#w 7;*ܖ{{OI(}Xv-]E(bC EzI ! !=7M9?nt·W̙3>꯰W|v}KZu;Ss0E\{\1eA.x) ݭКݯ1^ȨT'6}Z; cna]AzAlѾ u\Ơ`iv1''-VpSԉ6iD&Vk twD3_36ޣi\سW _ 2\1 v]sehVvc92BSJQcsb8Ђx~Ln8:Kx4I IrKC1 z01L> FDt)E&5 =Kxs5|(b(M/cQ;$?^׸{3XF;Dav,rsX#[&, Fr\ThӶ33'pӭ1(LEyrV$pB &G^ۈ RM .G.Ĥkfz9fhq8S "mrjUp88Zv+dZ:HYֱK?m4 1+ ((W {@Y4#QҝLbWC )~o?TZޡ+@Y%iMNSvE Pׄ6<CEĶ[j]d^mX;kqf^a|0M ~5{Chfҭ(E(mQkvPb5EB_萨z?1㞋x]`S]p_-FQ|zRcI[E'Q5sM6&?ӉAͬ^u!iov܉RPtmH1siˇǤ0{:ijto<"з}wZ'|6Q"PIٱD6pƑtI;7RÊ&qmo\|\?\z=?q~ԇa_"ZX:T6GЛVL!P.A7n8~9h,$߅t2$k?]ʞPc5.qŊUQ $d)O=Dد~eUugгk"BNBu@\fmK2i QD ?nƐ83P77d#RWokK}Euk\pI%Ln^\aFR7Ѱ 7r X rV !,"",xz86.;_ʹorry(dZL'#ٲd~kΛ1W '&RQ+~IE ,+\wa`ֲ4 w4EPv!jղ(+̣M ϧ0_uo ڋǔCMe`x^\k6|wgՕuk6PqH5lh~+gu)J 2MZ&!wٱ#9S5 OL ]?+=3OOcl Gh=3m!'cJ>I3wan#l% #EldLtfugxBGHхsXF' ?17ntºei":-R7~q)>aa4RB,-8x)-&@GEѠv*dN8 N{''F{7e_;S' %zNՆ ({"B0h4EOe#0雙_l K`6UQRN8Q5!}MAV/ښ4H/ĒQBƐg^x=OJZ="KrĒGae(X3 :L}ĭ,Va*6Ufdz',Zī&`EM82Hͥw\ʿŒye\w˼Y#J\r .ihuҏoƔQVQ&t:gOG侾귪`85Ds9f 6TT ͘k3ە}Ǖ Ig1r<^} nu1S|'%PuQwȭZQ#xWA60G}bޛ=gno/xi8 4PD45jG[ڲkjKmS53aب9EAQ+xK}} X TXu|m*7;IGQH:{6,1.8e[1ty:w>}ogHNjP 7]tv:_΍_foKV*Xәn9g4{k|9&Z ?Qbֲ*MD۞ș/6?5RU[OfQ^LJ"*/D7 ]uZ@epn85'nud^B#4tEu6If@g_Vه3kԟxIhWR|9Lo}>ト]<4RG\X4[^J~>Ln`Oג]%B`ՖR9o6Ѥ*B!~(1lYr4(L:}(wzvڒ=ʨ9 Vn >Xāv3 F͢OL*.a]y#RQF`Ppi&v6Pjա%DJ [)lb!+Jije_)qImh88s筢Ɔ O=vl`ݶrkjYBeĉIt} 7gR*gMq?0\r>_ 7wݔ> 5464i-d[?$"C4%N8DI">9Tb&A"ܫ]fS DL]BA dĎ',/,OvXqj9y,z*wlf,a? Ś>gYN^tRrԩ\QKM!/Nd%# !pXcpi)q9Ǔj8Ԭ Kmb%bl*2Xɶ :Mn#۪Ul-&1\ye ;\R>&?JBAh hdGq侜y\6-YN]l:'Y&jc RJ_pRbHlXκFjPrsڱ4VɦsQ!Ey%zYS6F~fn?^YK]Vn%M]ȉw* %~jwWR u`XftcY{hihOu~]^xFioP_-`M,\܃;pzʘ?KV7%hMx q+?\tLG9j)*@ v704UbXաPi<+﹑1BD Y_A*RsuM~*6"19dJj7Ð8HmYn*J>աޜ:6o ~=f]G6m]UTSQZӍCZVVa4Pu[K|M7NJ5s8#3OYW@ccPd/՛jYt+ >6xw^X;CEz@d7K,`Yھ&Fơ(*nМN !,rSt,Hpa|GRۃ,rG&4 =)غp1ˣ{B7Ӑ웟;gxՁTQi<3n|:HUtv95T< ~KqEGEZfMQ­* ۋ#l|E^{i:_>N Ӎi[_Xd*3?x;s9"a|/q5Q«~u?\yBIpKt!h9FXD~#QB I(jIY f?Az&^gNGS 1}qҌ4::?w޽oaqDhȊ2H kp9?l?v"N1ɗplsεks8%0撫8>1;X=FKAǁxrxܱ2X-DiNs$y8~b,5@s3iYi:-?wt^#'sľ8 - Ɯڍxh[wΛ_{U*o$SŊD;rCuѳZ hj;,Ͽ. ffQHZoL¡&j¡b-_]Bt2@S!XCS(ʹמM͌׹y;%f0tr੧aĸ1zO^:b<\.4]A$qKKcTLOwν,F}s'jBBm‡aCfhh.Ƀ1|.۞{,N2́^͘tt+|˃opKl fhCYA0 bZf<&GOͷAr|ǝ{G1KiIv>&MB7yo/&w/7 F&wyi?V}q* }4NhU,]9_z?oI'aKE#miDhnINѲB:Эd;X^C6;эT㞻D3u/cϾ᝼H%>uG|/ο$Ke9”UKjP3yƴdH%IGBu߳>\ut@,ۗ:i RKz&L>0 f) sS]SGP(- *trb#XBHѓc{o ,fy66Nn`sٞzfI{^/O%;F.\җoO4*vRYD&!-X4Ţl;%1T/i%E--e8DJYONϮ$9 X͎ ?)${M*6l& =H% 1$ kfBJJJ+iCJV>wlH[~"Ul T-jƐQЙDSq#{|En=H PTPm9wVIA~a{FQ,"l_#ݒT^ 0f0)/aW(.5j:?4<]o>⎥œGzՁ2Zlݴ oAwr|D( 5"DfaNBASa"hd[yh݅0++fF¦NNYx"lRߐ(|rPClRNcB.2sM!$ %T4@I DE 'tg;:7x'UMa$ 1gS,Dx..)l-* T\ Ue{-)]S̎P\t,(`z)ꚃWٺrG|zvTӉX a5Q;܂Ndt*w SHJa3zPcS15 p\:ıg=Ǟo8{/+]yS6>B\JɸT!.JYmVɫy4?*k%Z֕a2 roA]6d:.;OJID"J*2@hĦdF*AŢ~6 ujJ(nBNr-nk,ak]،B]۷S-"}Ly!G޾j] Tx6jCa6mU@L+g_GiI)uAKqIA~:n)3֋/²4Z\Da{AFRܫz'%  ;zןދNjUOqǜqv0 IDATmWgȶsi2 7,'.QQχV  fjCh=J˾% 64l8HHv#N ԯϴ#۹iB4piM+Wppk'ˉflygb|><*גpq*`ihz!P^nT%mjl"dH87z{OS aI$p' ڿZ?s_*8i2 P 8=BsXD n%)I&3RZv_,TkNϽ_MAu?o6m!oGKKO!VWkڛV_ZSDuS>\;)Dc DKZh+`a-Kآ"_F/&t=GO;#9eyݾOkW- 6= ZS~_ՁhwAC{mF%7#9$p=hV`d=Oz$nsXupi*Xp_3z5.Mwߨh FfvXȯl' Me\2" 7)_67: Řd&N{ s Bo?nVXL@n_Ө$8C?F{ ʛG7YF߫L &F$o f$ ty*C0wTp|syKZ 7 '?M@lذaÆ 6~S<#0Md6lذaÆ 6lذ 6lذaÆ 6lbÆ 6lذaÆ 6aÆ 6lذaÆM@lذaÆ 6lذa& 6lذaÆ 6lذ ?pP$q6lذaĩ 6l Y^AU߆ 6l݇ŠE,؄}H(]]C' Bur78@|s|=fklذa!.O ^KۉwNguov}Jqi?OW=+jQ~f+4k^ڠew߶`XT_̇_oI?OUۙ&  9uz" - ӍǥE5}RbaM46 +C<$h<@Z:@˶:l,ZpߟUܾٞaݧ(5H=Dp5L#sO8 be# Mhz5ǃ?0w}h# VSH͉\# ji ߞKdOHGd! /Yʧ1x5&^C'/فeɃK?IJkmSK藭Hٶ} )k_>"Ty.l*{,4UGΊ)%ۘ~T>t#oOSo'm\MvSvO]W({>\q0k#bwDtsMOr]|*3| 6=Pa)j<]6WBW{ֆ 6~CЛJQ]C: ”*C7yPv5s L>/n!a(!Ib(ܙ8}zv#Nδի(na`J@Tdzf_z Ǝf-’ոy/<juov˹u3z׽C)_/Ï~t%争dW\:},>13bڃWh\v]"0(McM$3;E9Lt yhz`BnA&"fs%qT|M%9'1CT n{Oۮ(6oiWxdJ'5Vqe46#P$!t3aP.)Q|Y}==5G^\xNNAZ\w TNK SYW ;'tSO$+7iB3A60`U%C!/ӇHN\2K9މp%WXHn [_9" %߲̎'?=w0{?|ԲvCC$Mcߞc]9xjA–`a􉿖K^|yc!cɀd0zpK'tHb+ĔLR=nXww0$BUic6D|$9hڵߑQ (_<T"Ց$NZ p33$>'1O}.u\rp%[Oxo= B=5}ϛ txZF OSk6F?8P3>{\t0 (*'>`SiENJt}W pc<~49P%QpϏcЪ'y(U N#NÜ/~$ϰ=-12f<</F|ji_<^'sјe Q*Dz=t9+40l-nMg0 Ӌۙ_/%:HbuoK*>4ol0dib"QLp(ơXbyݟ6lذ#6wwbZ|=./Ϣjv?^}rP.@nA V1>i# qF"-#QCW`&UeEرMM_A1͆:.A"²OantD0d'.p{y K@kXy;Nbta'slOjOGM;)%W,w<’oXZsiMK(9 2@3vLZHO* B 8n=˖?c;8?qt;73T!kftAT vRcap%NCUi ma1h. gv^u#NMYU ?i2mb;! Bi710,)KJF}D_>|{g0放,`ZBֈo噟*8 ^ʞOQuIHɠnm%u~T _t&a[@lذa7'GdȲE5dZS*(r̜#8tS*x'q{%: &+;\A7w-?/N Cnb6? Һv_F$w _z bM+TEEX%qv!1L:C0"QjE4Hي.Xv(H,BJ W  H?L:h@_MǏo}̂,^K8'JȾq否B*zuPhꍔIIa~"}9&;cOY'S!ܮ,o;tߧ=7p8u+Jz^4-,8J濼︋8$}Y wGn&l90B&eAĊJ+ !1lb/y̯Lc#:h0C fQL%/gk]T-,j6/e?~VJVKLRV?Ѫj\Y9OObp5&4'O᱅{P+m< d%S.Vm1I+" DTk] ?Ng>bgUdF0$M O/8"yJTȡŌ9v ԁq%n9b1WbiquàasoVoVV1)?B3HLWrS4g8[Ήf0rŗ{`!T<WlҽHKy7ൗ^G?G.2eX wT_;ugRޫ`AED@k=FbQX Dzg)KY^fs~HW/侟gٹs|9Sta60_st7%Om\;%.pm#CWG Cd7SRWw,5>Xk|Bn) N9[/R&S y\LONخWU[ҏB(ph[}]ʢpc :|zR9%^wDzr]i]ܙ8Z*螵?>۷u/o%0n{w+_ܱ16 \AC)5&{np$nRc%a")*AMɈJ0W2rq 6q{ǟIOwErPlQZ3kGt#ŧ>/MbNI~Q\qgHV|<1H\r(z7돼Bqϫmd+]k3f0i$nvJJJx!D9z2|v:GrGTO؝Τ\I]oN69<> z#W)%1(`&=Uz nS_ iRk;@(L@w$؟e&Xj?b.8O'ZAn5V7OJ4l B _0L$5pJ !8=K7PG J$ " v^ H$nH%0A>=y= М81ӳS/obJE 7KrphMfEEܱx ׬fפƬ_ݿ +^u!h6u͜ɢe(Țc3vG1աEz(So gl\55ޓV}$_kMcqIx<o#BQ}0 ݏmO/ ו^DIBJN ՆjjHo^ h>ݽ7]Ȥ$:)!CfebY9p bvFM}isGR~ _RRH`;^YOq_0m-j؀{6 ZRRZ4 bI(pKnv.ԃJvBt2 J*~?MYI>lE{@#ejiղ<|rBJI愂BUU*Ftt!]IJJ ٹ?S IDAT|]RX<=4)H' h3ii*#&QLd m+]vX !$Hо]{R{d dێmIԳR[4iopk][[*E~^QBۋh߶}R_{hyͷx'Id lں;ڧؾc;͛7'i# ʪJ6ň=B***l:F=[ouٶ}EۊؾOZÎҧg!{82V|;[ڷm_HMM%%B"ˠY^3֬]sHipe4}n,Y~3oANAq/GP;.Ϝ9>}:wy'hx}L$|R8ä /Ra\>"!?qKJylxr}B~N -k]kR(? WQQA<G+Xq۶(ٶro̩h>>!mR M9ؿ&nL%]\ew}@ut]K.RJhkQ )]\W|a]![l! ]qҥ m1OcQ:'v!%[6:DM D nhZrHǡ5@״-*#YhIYi?@E:=?B.tM$`[6Eٹm8SB{.gMQ5˿bN;{$.^NeFGzZ& [#'^k:8{|a^K%]Z ]BIy8ϻLFeͱ)a=Tx'  2OcB)4pb&-|p^F"fϞ͐!CRrwvukx`ǗحuuV@ .P[ԏ?sNts}>t[Y#0|&K&>Uso!r0QhXNuC$VфvOs 7n%plk+67HJڵ׶p;Iz޾(Zȋ/M7qF0ETJv' Qm&Yi(W!=icWS >>QEçXlnGp,^0J>2OJLW`6.+%h6O,4)%kpU֛> c `DPJIVl,UIo+Nls#5|7{S>y~ q.{ ZT?|R}G..jX=g.?NӚ^1Krٱnsm<᠅3hݱ/tkAŖ,\e /J=۽-0eq d{ Y~} ʵPAf(;Iԑp%њgJ !\*gZJộ{L [L5~F HZ+l[1ֳiB}&C(ᖭYTCdƀHk!,Ee$\Y-:Ч_ . {?DËxA$/B@Rtp }O7S?_l-}8ywa>2Zd)'1/8x=<6hbʔ)\ve ٿSG`Se3f yjO'+Q+BTnY΂ߣ%pœY X Gۖ}@ch5?kRi4iɈA} c (-[dL{_gll0HVb%EX5:rr'OKG'ݜ.kVP|G{?1NRBRiuQiU#뼶R*\)1CaG0$Y.+bqy k̞:vap&hBfH3rpJPQhSR05 B c(x¦Lxqwiڶ5Zy_Lb'q孿8?L_yZdԮYV5}:gb,u7xִ ceGv\=iCH&MӰ, :()/BJ:s얁(Y>7lEw%CP89ڂ AWMz 0ߧ#H`=!Z(P25&;b&ӮG0,C&MʅΙm`y񉔦m~j)+stt ם C.>i?~4 qpV#{Q* ךMlrFZ;bybf*Jz`UHF HgkPG(i{gXecf|߄SN4'=jos}lޖ;e9vռ|ZJ%JX9HD Y>mZ5|>=+oAM#Zx1SJ/7xJ~$K)JH|̘;mE?W3fZ) Ǩe;nׇN"(Grlz*zk|>'5pLLwыzݗmF$90uceH'4㈺uJ05\¶=D.>ze,k[D̙.[̕_Y UA]KF +uy%%h:`@ e%☮ª-/gooDX5Z ->$ a;al!Ͽ8m=']u w.6ԭTmюsKlߎKᴉ 4AvMԖD@?p4Y5=}Uv2e&eHB:6c'm9 UPҴ]k2}.UR-4tCOjF HCC& ˮ$ r, .sALc%?'Ց<~5 c>J:UEYCȕ)QLQ%/@(McyS~B:J4AċLYۋs _yyFr.%owVf1sR0.59g.?E&t|!q,-pK>慗9v~?3!ʮdgo1욋΁ú$-lSJa&+PF+qq-3c$SQ-Э_%Ӷ|-˲X9coo LNXw>Yޞ]9G5acWJW}!f49;Յ&K?zzpMg-mQvQ vlw7> _!tOSf;.֋q8x~pjټhO=2S;T{cN^C}>۪CT] 2œi$H~TlWi5aGJ5aDTaL~xY^2-T9!Mag]ؖIiPXFQ#;,kκ@SrWũ.Yɛh4ϗRn)s) H&mZ[/ۥq4C{[s]żm!=|;!MܔRR 0<3QiPk%iiJ*B>\SMTB9QP:׵-\±l\u,za/;oa !I#X;dJak>~&}6'''/Px'^ù3i`,|q^= u)܍ПDk@{}mQt̪{v9rS1%dZu|_u[S]͸d58 k,_b ׮⛯֓*a[&D"v9oMA~ïg  hv0Sx EBXienkOK qa]PSkx\RN= .rY'MKW&zߟAXpRCĪ)L/]5%YQ@Oc35θ&cdV6fR7k|2jՎtjYR|H%Riռ9q )o~yDBA ќ\306̄E&ѴTSZDfCq._z"rS Yt>ds~`kW$^))q@q,G.~ӧIG'S" ҵd7!ˡZ"))DR„>|v6YEj'Ys66p (c:K;.ht%J |r?[֣rP'S6>i0k+*%` kvKM%MIFMdR&|QAaWpZ&ɽ բ?^{2?&^," >ƾ6)9@l!R]=z /[o1iҤ=u{]G$%~uid,zf+9eWB l4ꈌf`|rZkPsfOP15~t*.ফ"c{N;>! ǵ!կ`;cVFҜy<{s7`*?u5?}_Ue3(– ]H؊4k1m߇ :%(huܸV^}uz? N2J)dʊ(gk/ۙ8дXӢpY-Ǒ[ 4N tq0Vѯg+|Cค &ߚͦ"5KgasL0+^'4v{,\_j͛4;I8A (𡵖K5ΗYhB*$>4Ir"QMML o -B-k_r7sFwtp|{D~b6%md{U ֦=TE[tڎ@ȵ1acCuƲp@Lb??o5=s=e AiT2SP.M)D ܼ8+J1)= )CCiljkJ>[eMN׊N!BO1bn]W4e܇Ⱦa H#Af`jK:ӅV&n-cp@ieuZ$σzHA86feJ(myө IҭQsՄ)Ɏn}hWDc.y=ÛrH $R*bWeFs9D `4Bz$Ԫ;]_~zJɝ4j9h1m2kH!PRX( i_ny[1?n~6g.C4܄]wݟwjh()iltauMv؟D}.mpTi(^LV TI/zޞɴMu9lPЯEh~]2@fcY>w5k39k~٬m5c%(ttJX,ĵb8Т`3VO?ȋG(u !GW982a\#ʹg=̡a\ApuWR4iS+>Eyu"В NE<$ F3Ogk"@Nq/뻌$oMh W ұp\=#]gÄ![=}z. Rj:T F{MÙ:g(JT]SFf-ֽHPP\V#'?UgNv&Ƣۘ<ݜ yn)XD&#!槠]l,m].RIQ;e㒔6JҥKmƧ~_O0T+ IDAT0 233mTkRJXΌ1$?QúɿQ|i9S]פ/HSbɓ\5=iiAZ۞A2ؾ;x|$ ?DXG/uq}%[\^ŨbsM'bՐ y]D"MW1vh|1Nz~2o3[h7*O96tPTIρu),!NM4] V0 TM8vJPGhlŭ%Di:(m9H%~ےvUJ`\Ka"L#trr?c4WZʋefГ׾9ZZ*A37p3IfE0=i∜+_" <q\́u5#LLff&qjzՁA~G?eʯx~j)wq+nJJ9xldʋm?B4 g4NI t8t· >bjj<ZkHk=C6);5`T?p@)`/!mq0]EVޓ8um\|9th kbWHn^yX'6Mz#r0b'n T9M_BɆE̚5 8r7)"'FehO. /k4V >)$,'u].|\]4q-1o 4iu_I(,djzd ='#S8J`5vN]P-}w gY!TEtjLJn.֮\MjHKE }zp߇ſgg9sTt:sW&rSrp@#(9DBG)îm5n7t8dRY pٴ t^oFШٴU;i3( qsmgl8ՅX=g ޽w -sbg ڤ"mg] $_ R UXBFM 0N?.]b:N#BJ3ap]QEDɤCCdOi̙3;UVqy1zh&NC]s|C\</ņJy s,JM * E +h H'$lJ-$f"N v~] 'Mɿŷřy)A[d! r"BR5 Hl)gI"nH$BϞ=i:tr#n1`XWD$ yN/J>{&~˪-;رu3o.81Oa?c=xu]gΜ9{ 8no6m0tP>,0 t]#>6?;b&:KС{&{\ yݠir an#HUSRKyjj =ӭm>%>c" wR\@:> ;Q 4}"ۙ1K֔HԖ*9H%SQl9E;ذ I?Nj`{SXDmʱsAˮز_}eۮ.a|6櫙߳z6oڵkQ! h`q٩d,yG^Qc3?yxM^Wo'r,n}8T_m!Ujq"`6q8k"o+@Fٙ?ϿU[Y5g1{}mYUx'hwNcdQٴmr,^-#G[̖m;rr[żg w3=?0=`,M,bcl=A;h` l/-6VpbeokY  u&f-cI<&7g1w;@(r4}t"oR֢QPPVmZru-Jin0OEH i۹cHM`ywzJY &i}Ο3rH?|2226lsN藺.]Rx siS:묕,T Riٴ@.hTġvNœWtk/qq'a֧sIi]xb򎿂{.Ϩ~Kz|9tՉAc O䝧Ha"v͍蝏^%>m8BCڒ'rD;~ƻ?fTctCu[R~p#LDsKv! aJ%]BvXMҵ1>:Dyf Hm2qG2_;:7 9]8(n+~.e v9sJF8ƛ(i2SꦲJUTd N BVF..VH`ItD cCl՗BT8y.=4NAg.fx2eHvКԉF^x)3ΤЃh7#wcUK06+봴!ID/'o0 G׏AS Ɯte_qX~! p/;0q(/d&2qڤtZ]R[yM|k5m0±̜=G>1uben#MRyy y筷SCo9O3X{4P|ٶMiwv(p}C:lbf,>1ľeH$ibf~?\r T 0]Ir| ؅;dFeȞMyW7ؔ e"I2"=>d]rz$f&?Vϖ޼u-!+{AqSb*aeJ4u2V=Q(Sϱ i,Z@l_9YGظx(| 4rm c"a'={ Lz/ցC ;iX-DFNCobw[öYX?[^~<1?Bتĕ.y9yHWneCu/I㡰x[I)g),(d4467K<‚BNjՈ>H>b^"QQX4۶E;Ann.yy @T1|#GURJ_PN4x6~t8RZRi†X];h A&Oި ۶ItmNEy~ᕁc˲\nZQqFC]_k=c#,kBL>Ycr#ȃj+ I`Y~o:lz9Xyһ2ZQg~_j)Ru=H$T[u`E5T9(*EODV PEQEQ_bo6ǧ&*((򡂐z 뒛˘1cT(((?yD"DQEQEQC 5djEQEQEQ` ]G#4M+ܖٮ pwFB8dBC{h ܕ.`44ѳdҳMdƧeuA|5mѐ;!kϵ:8rO.u>p}\o(( @ݺwmc\eaH\6ͪM\O@q؛TKZײdrb=UnQ*vy0slhFwn+mT8Fo`[S!Fؒ8oK֚ٴN`S&iZ)hS*)bF|@;'Ң~;l0yh"Фtma^<žA _A}ɶ:lnhx*GW)(11.oϷd94?s|Jz;~,]%MkϢ$h"ӭs<WSdb2w?Γo[}߇\Mw*|:{w>z=ƝW~埏,dZB?7/oA.j}O<8{|uo%x|q4фĵ-R45MtMtI'I2HIG.~{%E=C a7o #:jxTt?3Fh7y4mlwU IDATrM\P~EQEQ qb_`Rhۗ>_šOϢ,jKMŷXxl{5O{ĥ 4j]v~?,xdCiz˞~ڧr-"%O,fƤ(~_È Vj~}4v*c6EvWl9Y FR:Jx&\>=F{eBH)!PZ:~a2v1sH(Mw%R3qiIHdxU&#pDhKJD)+@_͕h7k\ӉI[z,_hw l{4[䄠z?FiL(~g8;/!̈W+_p7|) ܾ5ZxFgt%R=Xgf)~c# n,?ws! ~umiF||q WQEQH @j./'3;dIf G4њhOY8n:)6.7fsΚJ$K!d'=:[Ҹ枛8)O_[X9F$h|o?YFν'q$8v`ҽv/= NbQ }AF+1e jϝD~rfn^AfoGDoIxXIdq XZFNLwP!blz~y7d_T/(( R58ϰ>1ҋjNбi g~t-OII.k7Z<K/~ 'aiog>~J?6^)o. ΪatqVKK&Ye4MGvc x>#l\͊N;I;icc23$L[os#Y;w=EQEQD.^+W3Ak0}33NϲniO|htEx8L;MxaـF.'7f19²_(;%>;;\y۷9 ISD?FQ0]n?>N1R]$ऱA?@bW'Rx0JøW9zi\< ~زi.Иzl%9~i 1qLIª㵿U6iYK!`wzDV:SEQE9bcjb4^v-_ι}>-ð,rO&uH+EWwo^ 0<̀4;Mz4`|q=L;R>[ ʽ<7Ws]9?.xyṵԏ `RuB[8rN_#^$ZO/N `٪iڟKڎrsUWIqtG+߲' @2ܹ\USsv"%r+Eܻ`41w%:NI6'~W3do\ƈ )zrlw̧벇9mrW,W2tҩ1/^}>ecUEQE97iZˊn;9g78ҁrbtͥv+uH_dd$]-uh>V[CaTAHjeA$%Q<2I;z3pKFrYZD@=7NyvЗ[+)Β$^OgAQJQHWLdmtK02DDM$km3- ?yE#(в}vi+qhkҒ|8H}f˩6At4ղUP\R@У.m5i.. `5є直7bf Xn!Q Q=]((l˖-|+_ᥗ^'d޼y466"3y@*+؍DJR#RXݟ{ B݇^'Zȸh&ed/Ƹ)qʧ2U1Cʉ=eD-zcQp^) C }hsF0>ghDJE"]AWfB0q_|((V/û.7Z v+ˁ~r8~=c)((+n[lquvE"Ӌ*%!mKKm(W]]OX)WJgb,\( iEQ#Dܖ@몥 F$ĊB#Qψpm%6b4 himǓn(/z(̙m}G_i#+ q?PoE9*Revk/:ӏ7FMS_'p8k wHYm8o6c*ƑKVVV_(Nm۴iW2\)iqH6nb[VUg*rԐt׿O*/ٵk5kٰM$QrZZwVQNq35xUشy+P(( hF"# c';EQuqm Ӥ _'Չ:dY>6džt'>ofUuREQe ۶ߊ((3^!IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/todo1.html0000664000175000017500000000535513203343735022144 0ustar jomajoma QSSTV: To Do
To Do
  • fax implementation and testing
  • expand function in editor
  • improve documentation
qsstv_9.2.6/qsstv/documentation/manual/manual/Copying.html0000664000175000017500000000541013203343735022516 0ustar jomajoma QSSTV: Copying
Copying

This software uses Qt for Linux: see http://qt.digia.com/ The application is released under GPLv3

qsstv_9.2.6/qsstv/documentation/manual/manual/index.html0000664000175000017500000001012213203343735022211 0ustar jomajoma QSSTV: QSSTV 9.2
QSSTV 9.2
Author
Johan Maes ON4QZ

Introduction

QSSTV 9 is a program for receiving and transmitting SSTV and HAMDRM (sometimes called DSSTV). It is compatible with most of MMSSTV and EasyPal

!!! ALSO READ THE FAQ AT http://users.telenet.be/on4qz/qsstv_9/faq.html !!!

This manual is divided in the following sections:

73's Johan ON4QZ

qsstv_9.2.6/qsstv/documentation/manual/manual/pages.html0000664000175000017500000000527713203343735022220 0ustar jomajoma QSSTV: Related Pages
Related Pages
Here is a list of all related documentation pages:
qsstv_9.2.6/qsstv/documentation/manual/manual/doc.png0000664000175000017500000000135213203343735021474 0ustar jomajomaPNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/folderopen.png0000664000175000017500000000112513203343735023062 0ustar jomajomaPNG  IHDR}\IDATx]?oP9i4i;iiZ7`b٬,HU'$*T]TDP6w};C; aӝߟjAInS}9Hӎ|? =_Ɗue*;YEsYBėsٌ ɫYq !Gǿv̇خ F}qb]70)d-}PfY{4@}2ԗNIǃc%UImcƝ>xt9$ OVE*Û#׈r@l$PrHaa dZrqIoT\,tj2FAxv-Lp׌p TI/ \sf; jViTo^cpb]€<a՜y9:+,E f6NEKU}^;nZuUS4 ѬbN.kjT% iV )GJ@TxIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/folderclosed.png0000664000175000017500000000115013203343735023370 0ustar jomajomaPNG  IHDR}\/IDATx]MO@~uؐlp]#]PYEC\9y`xC &=qvZv3m؃vLN}}ޝZA@n ONp xKxj8s _[D'yye+ 7#rNlk* 0Ь_d_(Öz=xvhzP-䍒̪u$\DJcB4.:Ϗ-}LE #gN;B6䬜@p&h>p9EEάʑ"un$R"?{<%PNt$߶+^<"2Dqq\ҙaA"ԵP}#Ez{.8i p(ADwDE߂z;Kק8t q:uvvݛvEn{MFXgfZ֝*ߩ:jYq#3SWr'  IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/arrowdown.png0000664000175000017500000000036613203343735022755 0ustar jomajomaPNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/arrowright.png0000664000175000017500000000034513203343735023120 0ustar jomajomaPNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/splitbar.png0000664000175000017500000000047213203343735022551 0ustar jomajomaPNG  IHDRMIDATxݡJCa( %4 bȘͶ3v^EL ,b;{Ï/aYկq:\IIIIIIIIIIIIIIIIII-l揊_t/ϻYQVYivk_ۣI@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$C[V=[fIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/navtreedata.js0000664000175000017500000000037513203343735023061 0ustar jomajomavar NAVTREE = [ [ "QSSTV", "index.html", [ [ "QSSTV 9.2", "index.html", "index" ] ] ] ]; var NAVTREEINDEX = [ "Copying.html" ]; var SYNCONMSG = 'click to disable panel synchronisation'; var SYNCOFFMSG = 'click to enable panel synchronisation';qsstv_9.2.6/qsstv/documentation/manual/manual/index.js0000664000175000017500000000241613203343735021670 0ustar jomajomavar index = [ [ "Introduction", "index.html#intro_sec", null ], [ "What's New", "whatsnew.html", null ], [ "Change log", "changelog.html", null ], [ "Installation", "installation.html", [ [ "Step 1: Prerequisites", "installation.html#step1", null ], [ "Step 2: Getting the software", "installation.html#step2", null ], [ "Step 3: Compile and Install the software", "installation.html#step3", null ], [ "Step 4: Run QSSTV", "installation.html#step4", null ] ] ], [ "Getting Started", "gettingstarted.html", [ [ "Configuration", "gettingstarted.html#config", null ], [ "Calibration", "gettingstarted.html#calib", null ] ] ], [ "Statusbar", "statusbar.html", null ], [ "Image Viewer", "imagepopup.html", null ], [ "Receive SSTV Window", "RXSSTV.html", null ], [ "Transmit SSTV Window", "TXSSTV.html", null ], [ "Receive DRM Window", "RXDRM.html", null ], [ "Transmit DRM Window", "TXDRM.html", null ], [ "Sending FIX in DRM", "fixdrm.html", null ], [ "Gallery", "gallery.html", null ], [ "Editor", "editor.html", null ], [ "External Programs", "externalprog.html", null ], [ "To Do", "todo1.html", null ], [ "Credits", "credits.html", null ], [ "Copying", "Copying.html", null ] ];qsstv_9.2.6/qsstv/documentation/manual/manual/navtreeindex0.js0000664000175000017500000000131613203343735023333 0ustar jomajomavar NAVTREEINDEX0 = { "Copying.html":[0,17], "RXDRM.html":[0,9], "RXSSTV.html":[0,7], "TXDRM.html":[0,10], "TXSSTV.html":[0,8], "changelog.html":[0,2], "credits.html":[0,16], "editor.html":[0,13], "externalprog.html":[0,14], "fixdrm.html":[0,11], "gallery.html":[0,12], "gettingstarted.html":[0,4], "gettingstarted.html#calib":[0,4,1], "gettingstarted.html#config":[0,4,0], "imagepopup.html":[0,6], "index.html":[0], "index.html":[], "index.html#intro_sec":[0,0], "installation.html":[0,3], "installation.html#step1":[0,3,0], "installation.html#step2":[0,3,1], "installation.html#step3":[0,3,2], "installation.html#step4":[0,3,3], "pages.html":[], "statusbar.html":[0,5], "todo1.html":[0,15], "whatsnew.html":[0,1] }; qsstv_9.2.6/qsstv/documentation/manual/manual/navtree.js0000664000175000017500000003432113203343735022225 0ustar jomajomavar navTreeSubIndices = new Array(); function getData(varName) { var i = varName.lastIndexOf('/'); var n = i>=0 ? varName.substring(i+1) : varName; return eval(n.replace(/\-/g,'_')); } function stripPath(uri) { return uri.substring(uri.lastIndexOf('/')+1); } function stripPath2(uri) { var i = uri.lastIndexOf('/'); var s = uri.substring(i+1); var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); return m ? uri.substring(i-6) : s; } function hashValue() { return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); } function hashUrl() { return '#'+hashValue(); } function pathName() { return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); } function localStorageSupported() { try { return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; } catch(e) { return false; } } function storeLink(link) { if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { window.localStorage.setItem('navpath',link); } } function deleteLink() { if (localStorageSupported()) { window.localStorage.setItem('navpath',''); } } function cachedLink() { if (localStorageSupported()) { return window.localStorage.getItem('navpath'); } else { return ''; } } function getScript(scriptName,func,show) { var head = document.getElementsByTagName("head")[0]; var script = document.createElement('script'); script.id = scriptName; script.type = 'text/javascript'; script.onload = func; script.src = scriptName+'.js'; if ($.browser.msie && $.browser.version<=8) { // script.onload does not work with older versions of IE script.onreadystatechange = function() { if (script.readyState=='complete' || script.readyState=='loaded') { func(); if (show) showRoot(); } } } head.appendChild(script); } function createIndent(o,domNode,node,level) { var level=-1; var n = node; while (n.parentNode) { level++; n=n.parentNode; } if (node.childrenData) { var imgNode = document.createElement("img"); imgNode.style.paddingLeft=(16*level).toString()+'px'; imgNode.width = 16; imgNode.height = 22; imgNode.border = 0; node.plus_img = imgNode; node.expandToggle = document.createElement("a"); node.expandToggle.href = "javascript:void(0)"; node.expandToggle.onclick = function() { if (node.expanded) { $(node.getChildrenUL()).slideUp("fast"); node.plus_img.src = node.relpath+"arrowright.png"; node.expanded = false; } else { expandNode(o, node, false, false); } } node.expandToggle.appendChild(imgNode); domNode.appendChild(node.expandToggle); imgNode.src = node.relpath+"arrowright.png"; } else { var span = document.createElement("span"); span.style.display = 'inline-block'; span.style.width = 16*(level+1)+'px'; span.style.height = '22px'; span.innerHTML = ' '; domNode.appendChild(span); } } var animationInProgress = false; function gotoAnchor(anchor,aname,updateLocation) { var pos, docContent = $('#doc-content'); var ancParent = $(anchor.parent()); if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || ancParent.is(':header')) { pos = ancParent.position().top; } else if (anchor.position()) { pos = anchor.position().top; } if (pos) { var dist = Math.abs(Math.min( pos-docContent.offset().top, docContent[0].scrollHeight- docContent.height()-docContent.scrollTop())); animationInProgress=true; docContent.animate({ scrollTop: pos + docContent.scrollTop() - docContent.offset().top },Math.max(50,Math.min(500,dist)),function(){ if (updateLocation) window.location.href=aname; animationInProgress=false; }); } } function newNode(o, po, text, link, childrenData, lastNode) { var node = new Object(); node.children = Array(); node.childrenData = childrenData; node.depth = po.depth + 1; node.relpath = po.relpath; node.isLast = lastNode; node.li = document.createElement("li"); po.getChildrenUL().appendChild(node.li); node.parentNode = po; node.itemDiv = document.createElement("div"); node.itemDiv.className = "item"; node.labelSpan = document.createElement("span"); node.labelSpan.className = "label"; createIndent(o,node.itemDiv,node,0); node.itemDiv.appendChild(node.labelSpan); node.li.appendChild(node.itemDiv); var a = document.createElement("a"); node.labelSpan.appendChild(a); node.label = document.createTextNode(text); node.expanded = false; a.appendChild(node.label); if (link) { var url; if (link.substring(0,1)=='^') { url = link.substring(1); link = url; } else { url = node.relpath+link; } a.className = stripPath(link.replace('#',':')); if (link.indexOf('#')!=-1) { var aname = '#'+link.split('#')[1]; var srcPage = stripPath(pathName()); var targetPage = stripPath(link.split('#')[0]); a.href = srcPage!=targetPage ? url : "javascript:void(0)"; a.onclick = function(){ storeLink(link); if (!$(a).parent().parent().hasClass('selected')) { $('.item').removeClass('selected'); $('.item').removeAttr('id'); $(a).parent().parent().addClass('selected'); $(a).parent().parent().attr('id','selected'); } var anchor = $(aname); gotoAnchor(anchor,aname,true); }; } else { a.href = url; a.onclick = function() { storeLink(link); } } } else { if (childrenData != null) { a.className = "nolink"; a.href = "javascript:void(0)"; a.onclick = node.expandToggle.onclick; } } node.childrenUL = null; node.getChildrenUL = function() { if (!node.childrenUL) { node.childrenUL = document.createElement("ul"); node.childrenUL.className = "children_ul"; node.childrenUL.style.display = "none"; node.li.appendChild(node.childrenUL); } return node.childrenUL; }; return node; } function showRoot() { var headerHeight = $("#top").height(); var footerHeight = $("#nav-path").height(); var windowHeight = $(window).height() - headerHeight - footerHeight; (function (){ // retry until we can scroll to the selected item try { var navtree=$('#nav-tree'); navtree.scrollTo('#selected',0,{offset:-windowHeight/2}); } catch (err) { setTimeout(arguments.callee, 0); } })(); } function expandNode(o, node, imm, showRoot) { if (node.childrenData && !node.expanded) { if (typeof(node.childrenData)==='string') { var varName = node.childrenData; getScript(node.relpath+varName,function(){ node.childrenData = getData(varName); expandNode(o, node, imm, showRoot); }, showRoot); } else { if (!node.childrenVisited) { getNode(o, node); } if (imm || ($.browser.msie && $.browser.version>8)) { // somehow slideDown jumps to the start of tree for IE9 :-( $(node.getChildrenUL()).show(); } else { $(node.getChildrenUL()).slideDown("fast"); } if (node.isLast) { node.plus_img.src = node.relpath+"arrowdown.png"; } else { node.plus_img.src = node.relpath+"arrowdown.png"; } node.expanded = true; } } } function glowEffect(n,duration) { n.addClass('glow').delay(duration).queue(function(next){ $(this).removeClass('glow');next(); }); } function highlightAnchor() { var aname = hashUrl(); var anchor = $(aname); if (anchor.parent().attr('class')=='memItemLeft'){ var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); glowEffect(rows.children(),300); // member without details } else if (anchor.parent().attr('class')=='fieldname'){ glowEffect(anchor.parent().parent(),1000); // enum value } else if (anchor.parent().attr('class')=='fieldtype'){ glowEffect(anchor.parent().parent(),1000); // struct field } else if (anchor.parent().is(":header")) { glowEffect(anchor.parent(),1000); // section header } else { glowEffect(anchor.next(),1000); // normal member } gotoAnchor(anchor,aname,false); } function selectAndHighlight(hash,n) { var a; if (hash) { var link=stripPath(pathName())+':'+hash.substring(1); a=$('.item a[class$="'+link+'"]'); } if (a && a.length) { a.parent().parent().addClass('selected'); a.parent().parent().attr('id','selected'); highlightAnchor(); } else if (n) { $(n.itemDiv).addClass('selected'); $(n.itemDiv).attr('id','selected'); } if ($('#nav-tree-contents .item:first').hasClass('selected')) { $('#nav-sync').css('top','30px'); } else { $('#nav-sync').css('top','5px'); } showRoot(); } function showNode(o, node, index, hash) { if (node && node.childrenData) { if (typeof(node.childrenData)==='string') { var varName = node.childrenData; getScript(node.relpath+varName,function(){ node.childrenData = getData(varName); showNode(o,node,index,hash); },true); } else { if (!node.childrenVisited) { getNode(o, node); } $(node.getChildrenUL()).css({'display':'block'}); node.plus_img.src = node.relpath+"arrowdown.png"; node.expanded = true; var n = node.children[o.breadcrumbs[index]]; if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); else hash=''; } if (hash.match(/^#l\d+$/)) { var anchor=$('a[name='+hash.substring(1)+']'); glowEffect(anchor.parent(),1000); // line number hash=''; // strip line number anchors } var url=root+hash; var i=-1; while (NAVTREEINDEX[i+1]<=url) i++; if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index if (navTreeSubIndices[i]) { gotoNode(o,i,root,hash,relpath) } else { getScript(relpath+'navtreeindex'+i,function(){ navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); if (navTreeSubIndices[i]) { gotoNode(o,i,root,hash,relpath); } },true); } } function showSyncOff(n,relpath) { n.html(''); } function showSyncOn(n,relpath) { n.html(''); } function toggleSyncButton(relpath) { var navSync = $('#nav-sync'); if (navSync.hasClass('sync')) { navSync.removeClass('sync'); showSyncOff(navSync,relpath); storeLink(stripPath2(pathName())+hashUrl()); } else { navSync.addClass('sync'); showSyncOn(navSync,relpath); deleteLink(); } } function initNavTree(toroot,relpath) { var o = new Object(); o.toroot = toroot; o.node = new Object(); o.node.li = document.getElementById("nav-tree-contents"); o.node.childrenData = NAVTREE; o.node.children = new Array(); o.node.childrenUL = document.createElement("ul"); o.node.getChildrenUL = function() { return o.node.childrenUL; }; o.node.li.appendChild(o.node.childrenUL); o.node.depth = 0; o.node.relpath = relpath; o.node.expanded = false; o.node.isLast = true; o.node.plus_img = document.createElement("img"); o.node.plus_img.src = relpath+"arrowright.png"; o.node.plus_img.width = 16; o.node.plus_img.height = 22; if (localStorageSupported()) { var navSync = $('#nav-sync'); if (cachedLink()) { showSyncOff(navSync,relpath); navSync.removeClass('sync'); } else { showSyncOn(navSync,relpath); } navSync.click(function(){ toggleSyncButton(relpath); }); } $(window).load(function(){ navTo(o,toroot,hashUrl(),relpath); showRoot(); }); $(window).bind('hashchange', function(){ if (window.location.hash && window.location.hash.length>1){ var a; if ($(location).attr('hash')){ var clslink=stripPath(pathName())+':'+hashValue(); a=$('.item a[class$="'+clslink.replace(/=0) window.location.hash=url.substr(i); var _preventDefault = function(evt) { evt.preventDefault(); }; $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); $(document).bind('touchmove',function(e){ var device = navigator.userAgent.toLowerCase(); var ios = device.match(/(iphone|ipod|ipad)/); if (ios) { try { var target = e.target; while (target) { if ($(target).css('-webkit-overflow-scrolling')=='touch') return; target = target.parentNode; } e.preventDefault(); } catch(err) { e.preventDefault(); } } }); } qsstv_9.2.6/qsstv/documentation/manual/manual/navtree.css0000664000175000017500000000376013203343735022404 0ustar jomajoma#nav-tree .children_ul { margin:0; padding:4px; } #nav-tree ul { list-style:none outside none; margin:0px; padding:0px; } #nav-tree li { white-space:nowrap; margin:0px; padding:0px; } #nav-tree .plus { margin:0px; } #nav-tree .selected { background-image: url('tab_a.png'); background-repeat:repeat-x; color: #fff; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } #nav-tree img { margin:0px; padding:0px; border:0px; vertical-align: middle; } #nav-tree a { text-decoration:none; padding:0px; margin:0px; outline:none; } #nav-tree .label { margin:0px; padding:0px; font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } #nav-tree .label a { padding:2px; } #nav-tree .selected a { text-decoration:none; color:#fff; } #nav-tree .children_ul { margin:0px; padding:0px; } #nav-tree .item { margin:0px; padding:0px; } #nav-tree { padding: 0px 0px; background-color: #FAFAFF; font-size:14px; overflow:auto; } #doc-content { overflow:auto; display:block; padding:0px; margin:0px; -webkit-overflow-scrolling : touch; /* iOS 5+ */ } #side-nav { padding:0 6px 0 0; margin: 0px; display:block; position: absolute; left: 0px; width: 250px; } .ui-resizable .ui-resizable-handle { display:block; } .ui-resizable-e { background:url("splitbar.png") repeat scroll right center transparent; cursor:e-resize; height:100%; right:0; top:0; width:6px; } .ui-resizable-handle { display:none; font-size:0.1px; position:absolute; z-index:1; } #nav-tree-contents { margin: 6px 0px 0px 0px; } #nav-tree { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; -webkit-overflow-scrolling : touch; /* iOS 5+ */ } #nav-sync { position:absolute; top:5px; right:24px; z-index:0; } #nav-sync img { opacity:0.3; } #nav-sync img:hover { opacity:0.9; } @media print { #nav-tree { display: none; } div.ui-resizable-handle { display: none; position: relative; } } qsstv_9.2.6/qsstv/drmtx/common/FAC/FAC.cpp0000664000175000017500000003245313203343610016730 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos PA0MBO * * Description: * FAC * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "FAC.h" /* Implementation *************************************************************/ /******************************************************************************\ * CFACTransmit * \******************************************************************************/ void CFACTransmit::FACParam(CVector<_BINARY>* pbiFACData, CParameter& Parameter) { /* Reset enqueue function */ (*pbiFACData).ResetBitAccess(); /* Put FAC parameters on stream */ /* Channel parameters --------------------------------------------------- */ /* Identity m 2 bits */ /* Manage index of FAC block in super-frame */ switch (Parameter.iFrameIDTransm) { case 0: /* Assuming AFS is valid (AFS not used here), if AFS is not valid, the parameter must be 3 (11) */ (*pbiFACData).Enqueue(3 /* 11 */, 2); break; case 1: (*pbiFACData).Enqueue(1 /* 01 */, 2); break; case 2: (*pbiFACData).Enqueue(2 /* 10 */, 2); break; } /* Spectrum occupancy for ham use only 1 bit */ switch (Parameter.GetSpectrumOccup()) { case SO_0: (*pbiFACData).Enqueue(0 /* 0 */, 1); break; case SO_1: (*pbiFACData).Enqueue(1 /* 1 */, 1); break; default: (*pbiFACData).Enqueue(0 /* 0 */, 1); break; } /* Interleaver depth flag ham situation 1 bit */ switch (Parameter.eSymbolInterlMode) { case CParameter::SI_LONG: (*pbiFACData).Enqueue(0 /* 0 */, 1); break; case CParameter::SI_SHORT: (*pbiFACData).Enqueue(1 /* 1 */, 1); break; } /* MSC mode */ switch (Parameter.eMSCCodingScheme) { case CS_3_SM: (*pbiFACData).Enqueue(0 /* 0 */, 1); break; case CS_1_SM: (*pbiFACData).Enqueue(1 /* 1 */, 1); break; case CS_2_SM: (*pbiFACData).Enqueue(1 /* 1 */, 1); break; default: break; } /* Prot Level 1 bit */ switch (Parameter.MSCPrLe.iPartB) { case 0: (*pbiFACData).Enqueue(0 /* 0 */, 1); break; case 1: (*pbiFACData).Enqueue(1 /* 1 */, 1); break; } /* Audio/Data flag */ switch (Parameter.Service[0].eAudDataFlag) { case CService::SF_AUDIO: (*pbiFACData).Enqueue(0 /* 0 */, 1); (*pbiFACData).Enqueue(3 /* 11 */, 2); // pa0mbo dummy bits SSTV (*pbiFACData).Enqueue(0 /* 0 */, 1); // pa0mbo no text break; case CService::SF_DATA: (*pbiFACData).Enqueue(1 /* 1 */, 1); /* Packet Id */ (*pbiFACData).Enqueue( (uint32_t) Parameter.Service[0].DataParam.iPacketID, 2); /* Extended MSC mode 1 bit */ if (Parameter.eMSCCodingScheme == CS_1_SM) (*pbiFACData).Enqueue(1 /* 1 */, 1); // QAM 4 else (*pbiFACData).Enqueue(0 /* 0 */, 1); // others break; } { int iLenLabel; int iframet = Parameter.iFrameIDTransm; const int iLenLabelTmp = Parameter.Service[0].strLabel.length(); if (iLenLabelTmp > 9) iLenLabel = 9; else iLenLabel = iLenLabelTmp; /* Set all characters of label string */ for (int i = 3*iframet; i < 3*iframet+3; i++) { char cNewChar; if (i >= iLenLabel) cNewChar = 0; else cNewChar = Parameter.Service[0].strLabel[i]; cNewChar &= 127; /* Set character */ (*pbiFACData).Enqueue((uint32_t) cNewChar, 7); } } /* CRC ------------------------------------------------------------------ */ /* Calculate the CRC and put at the end of the stream */ CRCObject.Reset(8); (*pbiFACData).ResetBitAccess(); for (int i = 0; i < NUM_FAC_BITS_PER_BLOCK / SIZEOF__BYTE - 1; i++) CRCObject.AddByte((_BYTE) (*pbiFACData).Separate(SIZEOF__BYTE)); /* Now, pointer in "enqueue"-function is back at the same place, add CRC */ (*pbiFACData).Enqueue(CRCObject.GetCRC(), 8); } void CFACTransmit::Init(CParameter& Parameter) { set actServ; /* Get active services */ Parameter.GetActiveServices(actServ); const size_t iTotNumServices = actServ.size(); /* Check how many audio and data services present */ vector veciAudioServ; vector veciDataServ; size_t iNumAudio = 0; size_t iNumData = 0; for (set::iterator i = actServ.begin(); i!=actServ.end(); i++) { if (Parameter.Service[*i].eAudDataFlag == CService::SF_AUDIO) { veciAudioServ.push_back(*i); iNumAudio++; } else { veciDataServ.push_back(*i); iNumData++; } } /* Now check special cases which are defined in 6.3.6-------------------- */ /* If we have only data or only audio services. When all services are of the same type (e.g. all audio or all data) then the services shall be signalled sequentially */ if ((iNumAudio == iTotNumServices) || (iNumData == iTotNumServices)) { /* Init repetition vector */ FACNumRep = iTotNumServices; FACRepetition.resize(0); for (set::iterator i = actServ.begin(); i!=actServ.end(); i++) FACRepetition.push_back(*i); } else { /* Special cases according to Table 60 (Service parameter repetition patterns for mixtures of audio and data services) */ if (iNumAudio == 1) { if (iNumData == 1) { /* Init repetion vector */ FACNumRep = 5; FACRepetition.resize(FACNumRep); /* A1A1A1A1D1 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[0]; FACRepetition[2] = veciAudioServ[0]; FACRepetition[3] = veciAudioServ[0]; FACRepetition[4] = veciDataServ[0]; } else if (iNumData == 2) { /* Init repetion vector */ FACNumRep = 10; FACRepetition.resize(FACNumRep); /* A1A1A1A1D1A1A1A1A1D2 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[0]; FACRepetition[2] = veciAudioServ[0]; FACRepetition[3] = veciAudioServ[0]; FACRepetition[4] = veciDataServ[0]; FACRepetition[5] = veciAudioServ[0]; FACRepetition[6] = veciAudioServ[0]; FACRepetition[7] = veciAudioServ[0]; FACRepetition[8] = veciAudioServ[0]; FACRepetition[9] = veciDataServ[1]; } else /* iNumData == 3 */ { /* Init repetion vector */ FACNumRep = 15; FACRepetition.resize(FACNumRep); /* A1A1A1A1D1A1A1A1A1D2A1A1A1A1D3 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[0]; FACRepetition[2] = veciAudioServ[0]; FACRepetition[3] = veciAudioServ[0]; FACRepetition[4] = veciDataServ[0]; FACRepetition[5] = veciAudioServ[0]; FACRepetition[6] = veciAudioServ[0]; FACRepetition[7] = veciAudioServ[0]; FACRepetition[8] = veciAudioServ[0]; FACRepetition[9] = veciDataServ[1]; FACRepetition[10] = veciAudioServ[0]; FACRepetition[11] = veciAudioServ[0]; FACRepetition[12] = veciAudioServ[0]; FACRepetition[13] = veciAudioServ[0]; FACRepetition[14] = veciDataServ[2]; } } else if (iNumAudio == 2) { if (iNumData == 1) { /* Init repetion vector */ FACNumRep = 5; FACRepetition.resize(FACNumRep); /* A1A2A1A2D1 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[1]; FACRepetition[2] = veciAudioServ[0]; FACRepetition[3] = veciAudioServ[1]; FACRepetition[4] = veciDataServ[0]; } else /* iNumData == 2 */ { /* Init repetion vector */ FACNumRep = 10; FACRepetition.resize(FACNumRep); /* A1A2A1A2D1A1A2A1A2D2 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[1]; FACRepetition[2] = veciAudioServ[0]; FACRepetition[3] = veciAudioServ[1]; FACRepetition[4] = veciDataServ[0]; FACRepetition[5] = veciAudioServ[0]; FACRepetition[6] = veciAudioServ[1]; FACRepetition[7] = veciAudioServ[0]; FACRepetition[8] = veciAudioServ[1]; FACRepetition[9] = veciDataServ[1]; } } else /* iNumAudio == 3 */ { /* Init repetion vector */ FACNumRep = 7; FACRepetition.resize(FACNumRep); /* A1A2A3A1A2A3D1 */ FACRepetition[0] = veciAudioServ[0]; FACRepetition[1] = veciAudioServ[1]; FACRepetition[2] = veciAudioServ[2]; FACRepetition[3] = veciAudioServ[0]; FACRepetition[4] = veciAudioServ[1]; FACRepetition[5] = veciAudioServ[2]; FACRepetition[6] = veciDataServ[0]; } } } /******************************************************************************\ * CFACReceive * \******************************************************************************/ _BOOLEAN CFACReceive::FACParam(CVector<_BINARY>* pbiFACData, CParameter& Parameter) { /* First get new data from incoming data stream, then check if the new parameter differs from the old data stored in the receiver. If yes, init the modules to the new parameter */ uint32_t iTempServiceID; int iTempShortID; /* CRC ------------------------------------------------------------------ */ /* Check the CRC of this data block */ CRCObject.Reset(8); (*pbiFACData).ResetBitAccess(); for (int i = 0; i < NUM_FAC_BITS_PER_BLOCK / SIZEOF__BYTE - 1; i++) CRCObject.AddByte((_BYTE) (*pbiFACData).Separate(SIZEOF__BYTE)); if (CRCObject.CheckCRC((*pbiFACData).Separate(8)) == true) { /* CRC-check successful, extract data from FAC-stream */ /* Reset separation function */ (*pbiFACData).ResetBitAccess(); Parameter.Lock(); /* Channel parameters ----------------------------------------------- */ /* Base/Enhancement flag (not used) */ (*pbiFACData).Separate(1); /* Identity */ switch ((*pbiFACData).Separate(2)) { case 0: /* 00 */ Parameter.iFrameIDReceiv = 0; break; case 1: /* 01 */ Parameter.iFrameIDReceiv = 1; break; case 2: /* 10 */ Parameter.iFrameIDReceiv = 2; break; case 3: /* 11 */ Parameter.iFrameIDReceiv = 0; break; } /* Spectrum occupancy */ switch ((*pbiFACData).Separate(4)) { case 0: /* 0000 */ Parameter.SetSpectrumOccup(SO_0); break; case 1: /* 0001 */ Parameter.SetSpectrumOccup(SO_1); break; case 2: /* 0010 */ Parameter.SetSpectrumOccup(SO_2); break; case 3: /* 0011 */ Parameter.SetSpectrumOccup(SO_3); break; case 4: /* 0100 */ Parameter.SetSpectrumOccup(SO_4); break; case 5: /* 0101 */ Parameter.SetSpectrumOccup(SO_5); break; } /* Interleaver depth flag */ switch ((*pbiFACData).Separate(1)) { case 0: /* 0 */ Parameter.SetInterleaverDepth(CParameter::SI_LONG); break; case 1: /* 1 */ Parameter.SetInterleaverDepth(CParameter::SI_SHORT); break; } /* MSC mode */ switch ((*pbiFACData).Separate(2)) { case 0: /* 00 */ Parameter.SetMSCCodingScheme(CS_3_SM); break; case 1: /* 01 */ Parameter.SetMSCCodingScheme(CS_3_HMMIX); break; case 2: /* 10 */ Parameter.SetMSCCodingScheme(CS_3_HMSYM); break; case 3: /* 11 */ Parameter.SetMSCCodingScheme(CS_2_SM); break; } /* SDC mode */ switch ((*pbiFACData).Separate(1)) { case 0: /* 0 */ Parameter.SetSDCCodingScheme(CS_2_SM); break; case 1: /* 1 */ Parameter.SetSDCCodingScheme(CS_1_SM); break; } /* Number of services */ /* Search table for entry */ int iNumServTabEntry = (*pbiFACData).Separate(4); for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (iNumServTabEntry == iTableNumOfServices[i][j]) Parameter.SetNumOfServices(i, j); /* Reconfiguration index (not used, yet) */ (*pbiFACData).Separate(3); /* rfu */ /* Do not use rfu */ (*pbiFACData).Separate(2); /* Service parameters ----------------------------------------------- */ /* Service identifier */ iTempServiceID = (*pbiFACData).Separate(24); /* Short ID (the short ID is the index of the service-array) */ iTempShortID = (*pbiFACData).Separate(2); /* Set service identifier */ Parameter.SetServiceID(iTempShortID, iTempServiceID); /* CA indication */ switch ((*pbiFACData).Separate(1)) { case 0: /* 0 */ Parameter.Service[iTempShortID].eCAIndication = CService::CA_NOT_USED; break; case 1: /* 1 */ Parameter.Service[iTempShortID].eCAIndication = CService::CA_USED; break; } /* Language */ Parameter.Service[iTempShortID].iLanguage = (*pbiFACData).Separate(4); /* Audio/Data flag */ switch ((*pbiFACData).Separate(1)) { case 0: /* 0 */ Parameter.SetAudDataFlag(iTempShortID, CService::SF_AUDIO); break; case 1: /* 1 */ Parameter.SetAudDataFlag(iTempShortID, CService::SF_DATA); break; } /* Service descriptor */ Parameter.Service[iTempShortID].iServiceDescr = (*pbiFACData).Separate(5); Parameter.Unlock(); /* Rfa */ /* Do not use Rfa */ (*pbiFACData).Separate(7); /* CRC is ok, return true */ return true; } else { /* Data is corrupted, do not use it. Return failure as false */ return false; } } qsstv_9.2.6/qsstv/drmtx/common/FAC/FAC.h0000664000175000017500000000415313203343610016371 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See FAC.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(FAC_H__3B0BA660_CA63VEUASDVN89LKVNE877A0D31912__INCLUDED_) #define FAC_H__3B0BA660_CA63VEUASDVN89LKVNE877A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../tables/TableFAC.h" #include "../Parameter.h" #include "../util/CRC.h" #include "utils/vector.h" /* Classes ********************************************************************/ class CFACTransmit { public: CFACTransmit():FACRepetitionCounter(0) {} virtual ~CFACTransmit() {} /* "pbiFACData" contains 72 bits */ void FACParam(CVector<_BINARY>* pbiFACData, CParameter& Parameter); void Init(CParameter& Parameter); protected: CCRC CRCObject; vector FACRepetition; /* See 6.3.6 */ size_t FACNumRep; size_t FACRepetitionCounter; }; class CFACReceive { public: CFACReceive() {} virtual ~CFACReceive() {} /* "pbiFACData" contains 72 bits */ _BOOLEAN FACParam(CVector<_BINARY>* pbiFACData, CParameter& Parameter); protected: CCRC CRCObject; }; #endif // !defined(FAC_H__3B0BA660_CA63VEUASDVN89LKVNE877A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/SDC/SDC.h0000664000175000017500000000462113203343610016431 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001-2005 * * Author(s): * Volker Fischer, Andrew Murphy * * Description: * See SDC.cpp * * 11/21/2005 Andrew Murphy, BBC Research & Development, 2005 * - AMSS data entity groups (no AFS index), added eSDCType, data type 11 * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(SDC_H__3B0BA660_CA63SDBOJKEWROBNER89NE877A0D312__INCLUDED_) #define SDC_H__3B0BA660_CA63SDBOJKEWROBNER89NE877A0D312__INCLUDED_ #include "../GlobalDefinitions.h" #include "../Parameter.h" #include "../util/CRC.h" #include "utils/vector.h" #include "../util/Utilities.h" /* Definitions ****************************************************************/ /* Number of bits of header of SDC block */ #define NUM_BITS_HEADER_SDC 12 /* Classes ********************************************************************/ class CSDCTransmit { public: CSDCTransmit() {} virtual ~CSDCTransmit() {} void SDCParam(CVector<_BINARY>* pbiData, CParameter& Parameter); protected: void DataEntityType0(CVector<_BINARY>& vecbiData, CParameter& Parameter); void DataEntityType1(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter); // ... void DataEntityType5(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter); // ... void DataEntityType9(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter); CCRC CRCObject; }; #endif // !defined(SDC_H__3B0BA660_CA63SDBOJKEWROBNER89NE877A0D312__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/SDC/SDCTransmit.cpp0000664000175000017500000003455013203343610020512 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * SDC * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "SDC.h" /* Implementation *************************************************************/ void CSDCTransmit::SDCParam(CVector<_BINARY>* pbiData, CParameter& Parameter) { /* Put SDC parameters on a stream */ int i; int iSize; CVector<_BINARY> vecbiData; /* Calculate length of data field in bytes (consistant to table 61 in (6.4.1)) */ const int iLengthDataFieldBytes = (int) ((_REAL) (Parameter.iNumSDCBitsPerSFrame - 20) / 8); /* 20 bits from AFS index and CRC */ const int iUsefulBitsSDC = 20 + iLengthDataFieldBytes * 8; /* "- 20" for the AFS-index and CRC! */ const int iMaxNumBitsDataBlocks = iUsefulBitsSDC - 20; /* Reset enqueue function */ (*pbiData).ResetBitAccess(); /* SDC Header ----------------------------------------------------------- */ /* AFS index (not used by this application, insert a "1" */ (*pbiData).Enqueue((uint32_t) 1, 4); /* Data Entities -------------------------------------------------------- */ /* Init bit-count */ int iNumUsedBits = 0; // Choose types, TEST. Send only important types for this test! // TODO: test, if SDC block is long enough for all types! /* Type 0 */ DataEntityType0(vecbiData, Parameter); // TODO: nicer solution iSize = vecbiData.Size(); if (iNumUsedBits + iSize < iMaxNumBitsDataBlocks) { iNumUsedBits += iSize; vecbiData.ResetBitAccess(); for (i = 0; i < iSize; i++) (*pbiData).Enqueue(vecbiData.Separate(1), 1); } // Only working for either one audio or data service! if (Parameter.iNumAudioService == 1) { /* Type 9 */ DataEntityType9(vecbiData, 0, Parameter); } else { /* Type 5 */ DataEntityType5(vecbiData, 0, Parameter); } // TODO: nicer solution iSize = vecbiData.Size(); if (iNumUsedBits + iSize < iMaxNumBitsDataBlocks) { iNumUsedBits += iSize; vecbiData.ResetBitAccess(); for (i = 0; i < iSize; i++) (*pbiData).Enqueue(vecbiData.Separate(1), 1); } /* Type 1 */ DataEntityType1(vecbiData, 0, Parameter); // TODO: nicer solution iSize = vecbiData.Size(); if (iNumUsedBits + iSize < iMaxNumBitsDataBlocks) { iNumUsedBits += iSize; vecbiData.ResetBitAccess(); for (i = 0; i < iSize; i++) (*pbiData).Enqueue(vecbiData.Separate(1), 1); } /* Zero-pad the unused bits in this SDC-block */ for (i = 0; i < iMaxNumBitsDataBlocks - iNumUsedBits; i++) (*pbiData).Enqueue((uint32_t) 0, 1); /* CRC ------------------------------------------------------------------ */ /* Calculate the CRC and put it at the end of the stream */ CRCObject.Reset(16); (*pbiData).ResetBitAccess(); /* Special treatment of SDC data stream: The CRC (Cyclic Redundancy Check) field shall contain a 16-bit CRC calculated over the AFS index coded in an 8-bit field (4 msbs are 0) and the data field. 4 MSBs from AFS-index. Insert four "0" in the data-stream */ const _BYTE byFirstByte = (_BYTE) (*pbiData).Separate(4); CRCObject.AddByte(byFirstByte); for (i = 0; i < (iUsefulBitsSDC - 4) / SIZEOF__BYTE - 2; i++) CRCObject.AddByte((_BYTE) (*pbiData).Separate(SIZEOF__BYTE)); /* Now, pointer in "enqueue"-function is back at the same place, add CRC */ (*pbiData).Enqueue(CRCObject.GetCRC(), 16); } /******************************************************************************\ * Data entity Type 0 (Multiplex description data entity) * \******************************************************************************/ void CSDCTransmit::DataEntityType0(CVector<_BINARY>& vecbiData, CParameter& Parameter) { /* 24 bits for each stream description + 4 bits for protection levels */ const int iNumBitsTotal = 4 + Parameter.GetTotNumServices() * 24; /* Init return vector (storing this data block) */ vecbiData.Init(iNumBitsTotal + NUM_BITS_HEADER_SDC); vecbiData.ResetBitAccess(); /* Length of the body, excluding the initial 4 bits ("- 4"), measured in bytes ("/ 8") */ uint32_t iLengthInBytes = (iNumBitsTotal - 4) / 8; vecbiData.Enqueue(iLengthInBytes, 7); /* Version flag (not used in this implementation) */ vecbiData.Enqueue((uint32_t) 0, 1); /* Data entity type */ vecbiData.Enqueue((uint32_t) 00, 4); /* Type 00 */ /* Actual body ---------------------------------------------------------- */ /* Protection level for part A */ vecbiData.Enqueue((uint32_t) Parameter.MSCPrLe.iPartA, 2); /* Protection level for part B */ vecbiData.Enqueue((uint32_t) Parameter.MSCPrLe.iPartB, 2); for (size_t i = 0; i < Parameter.GetTotNumServices(); i++) { /* In case of hirachical modulation stream 0 describes the protection level and length of hirarchical data */ if ((i == 0) && ((Parameter.eMSCCodingScheme == CS_3_HMSYM) || (Parameter.eMSCCodingScheme == CS_3_HMMIX))) { /* Protection level for hierarchical */ vecbiData.Enqueue((uint32_t) Parameter.MSCPrLe.iHierarch, 2); /* rfu */ vecbiData.Enqueue((uint32_t) 0, 10); /* Data length for hierarchical */ vecbiData.Enqueue((uint32_t) Parameter.Stream[i].iLenPartB, 12); } else { /* Data length for part A */ vecbiData.Enqueue((uint32_t) Parameter.Stream[i].iLenPartA, 12); /* Data length for part B */ vecbiData.Enqueue((uint32_t) Parameter.Stream[i].iLenPartB, 12); } } } /******************************************************************************\ * Data entity Type 1 (Label data entity) * \******************************************************************************/ void CSDCTransmit::DataEntityType1(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter) { int iLenLabel; /* Length of label. Label is a variable length field of up to 16 bytes defining the label using UTF-8 coding */ const int iLenLabelTmp = Parameter.Service[ServiceID].strLabel.length(); if (iLenLabelTmp > 16) iLenLabel = 16; else iLenLabel = iLenLabelTmp; /* Number in bits (* 8) plus initial 4 bits (+ 4) */ const int iNumBitsTotal = iLenLabel * 8 + 4; /* Init return vector (storing this data block) */ vecbiData.Init(iNumBitsTotal + NUM_BITS_HEADER_SDC); vecbiData.ResetBitAccess(); /**** Multiplex description data entity - type 1 ****/ /* Length of the body, excluding the initial 4 bits, measured in bytes -> only number bytes of label */ vecbiData.Enqueue((uint32_t) iLenLabel, 7); /* Version flag (not used in this implementation) */ vecbiData.Enqueue((uint32_t) 0, 1); /* Data entity type */ vecbiData.Enqueue((uint32_t) 01, 4); /* Type 01 */ /* Actual body ---------------------------------------------------------- */ /* Short Id */ vecbiData.Enqueue((uint32_t) ServiceID, 2); /* rfu */ vecbiData.Enqueue((uint32_t) 0, 2); /* Set all characters of label string */ for (int i = 0; i < iLenLabel; i++) { const char cNewChar = Parameter.Service[ServiceID].strLabel[i]; /* Set character */ vecbiData.Enqueue((uint32_t) cNewChar, 8); } } /******************************************************************************\ * Data entity Type 5 (Application information data entity) * \******************************************************************************/ void CSDCTransmit::DataEntityType5(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter) { int iNumBitsTotal = 0; /* Set total number of bits */ switch (Parameter.Service[ServiceID].DataParam.ePacketModInd) { case CDataParam::PM_SYNCHRON_STR_MODE: iNumBitsTotal = 12 + 16 /* TEST */ /* + application data TODO! */; break; case CDataParam::PM_PACKET_MODE: iNumBitsTotal = 20 + 16 /* TEST */ /* + application data TODO! */; break; } /* Init return vector (storing this data block) */ vecbiData.Init(iNumBitsTotal + NUM_BITS_HEADER_SDC); vecbiData.ResetBitAccess(); /* Length of the body, excluding the initial 4 bits ("- 4"), measured in bytes ("/ 8") */ vecbiData.Enqueue((uint32_t) (iNumBitsTotal - 4) / 8, 7); /* Version flag (not used in this implementation) */ vecbiData.Enqueue((uint32_t) 0, 1); /* Data entity type */ vecbiData.Enqueue((uint32_t) 05, 4); /* Type 05 */ /* Actual body ---------------------------------------------------------- */ /* Short Id */ vecbiData.Enqueue((uint32_t) ServiceID, 2); /* Stream Id */ vecbiData.Enqueue((uint32_t) Parameter.Service[ServiceID].DataParam. iStreamID, 2); /* Packet mode indicator */ switch (Parameter.Service[ServiceID].DataParam.ePacketModInd) { case CDataParam::PM_SYNCHRON_STR_MODE: vecbiData.Enqueue(0 /* 0 */, 1); /* Descriptor */ vecbiData.Enqueue((uint32_t) 0, 7); break; case CDataParam::PM_PACKET_MODE: vecbiData.Enqueue(1 /* 1 */, 1); /* Descriptor */ /* Data unit indicator */ switch (Parameter.Service[ServiceID].DataParam.eDataUnitInd) { case CDataParam::DU_SINGLE_PACKETS: vecbiData.Enqueue(0 /* 0 */, 1); break; case CDataParam::DU_DATA_UNITS: vecbiData.Enqueue(1 /* 1 */, 1); break; } /* Packet Id */ vecbiData.Enqueue( (uint32_t) Parameter.Service[ServiceID].DataParam.iPacketID, 2); /* Application domain */ switch (Parameter.Service[ServiceID].DataParam.eAppDomain) { case CDataParam::AD_DRM_SPEC_APP: vecbiData.Enqueue(0 /* 0000 */, 4); break; case CDataParam::AD_DAB_SPEC_APP: vecbiData.Enqueue(1 /* 0001 */, 4); break; default: throw CGenErr("bad application domain in SDC preparation"); } /* Packet length */ vecbiData.Enqueue( (uint32_t) Parameter.Service[ServiceID].DataParam.iPacketLen, 8); break; } /* Application data */ // Not used // TEST /* Fixed implementation for MOTSlideshow application which is the one and only supported application right now. TODO */ /* rfu */ vecbiData.Enqueue((uint32_t) 0, 5); /* User application identifier. SlideShow = 2 */ vecbiData.Enqueue((uint32_t) 2, 11); } /******************************************************************************\ * Data entity Type 9 (Audio information data entity) * \******************************************************************************/ void CSDCTransmit::DataEntityType9(CVector<_BINARY>& vecbiData, int ServiceID, CParameter& Parameter) { /* Set total number of bits */ const int iNumBitsTotal = 20; /* Init return vector (storing this data block) */ vecbiData.Init(iNumBitsTotal + NUM_BITS_HEADER_SDC); vecbiData.ResetBitAccess(); /* Length of the body, excluding the initial 4 bits ("- 4"), measured in bytes ("/ 8") */ vecbiData.Enqueue((uint32_t) (iNumBitsTotal - 4) / 8, 7); /* Version flag (not used in this implementation) */ vecbiData.Enqueue((uint32_t) 0, 1); /* Data entity type */ vecbiData.Enqueue((uint32_t) 9, 4); /* Type 09 */ /* Actual body ---------------------------------------------------------- */ /* Short Id */ vecbiData.Enqueue((uint32_t) ServiceID, 2); /* Stream Id */ vecbiData.Enqueue((uint32_t) Parameter.Service[ServiceID].AudioParam. iStreamID, 2); /* Audio coding */ switch (Parameter.Service[ServiceID].AudioParam.eAudioCoding) { case CAudioParam::AC_AAC: vecbiData.Enqueue(0 /* 00 */, 2); break; case CAudioParam::AC_CELP: vecbiData.Enqueue(1 /* 01 */, 2); break; case CAudioParam::AC_HVXC: vecbiData.Enqueue(2 /* 10 */, 2); break; } /* SBR flag */ switch (Parameter.Service[ServiceID].AudioParam.eSBRFlag) { case CAudioParam::SB_NOT_USED: vecbiData.Enqueue(0 /* 0 */, 1); break; case CAudioParam::SB_USED: vecbiData.Enqueue(1 /* 1 */, 1); break; } /* Audio mode */ switch (Parameter.Service[ServiceID].AudioParam.eAudioCoding) { case CAudioParam::AC_AAC: /* Channel type */ switch (Parameter.Service[ServiceID].AudioParam.eAudioMode) { case CAudioParam::AM_MONO: vecbiData.Enqueue(0 /* 00 */, 2); break; case CAudioParam::AM_P_STEREO: vecbiData.Enqueue(1 /* 01 */, 2); break; case CAudioParam::AM_STEREO: vecbiData.Enqueue(2 /* 10 */, 2); break; } break; case CAudioParam::AC_CELP: /* rfa */ vecbiData.Enqueue((uint32_t) 0, 1); /* CELP_CRC */ if (!Parameter.Service[ServiceID].AudioParam.bCELPCRC) vecbiData.Enqueue(0 /* 0 */, 1); else vecbiData.Enqueue(1 /* 1 */, 1); break; case CAudioParam::AC_HVXC: /* HVXC_rate */ switch (Parameter.Service[ServiceID].AudioParam.eHVXCRate) { case CAudioParam::HR_2_KBIT: vecbiData.Enqueue(0 /* 0 */, 1); break; case CAudioParam::HR_4_KBIT: vecbiData.Enqueue(1 /* 1 */, 1); break; } /* HVXC CRC */ if (!Parameter.Service[ServiceID].AudioParam.bHVXCCRC) vecbiData.Enqueue(0 /* 0 */, 1); else vecbiData.Enqueue(1 /* 1 */, 1); break; } /* Audio sampling rate */ switch (Parameter.Service[ServiceID].AudioParam.eAudioSamplRate) { case CAudioParam::AS_8_KHZ: vecbiData.Enqueue(0 /* 000 */, 3); break; case CAudioParam::AS_12KHZ: vecbiData.Enqueue(1 /* 001 */, 3); break; case CAudioParam::AS_16KHZ: vecbiData.Enqueue(2 /* 010 */, 3); break; case CAudioParam::AS_24KHZ: vecbiData.Enqueue(3 /* 011 */, 3); break; } /* Text flag */ if (!Parameter.Service[ServiceID].AudioParam.bTextflag) vecbiData.Enqueue(0 /* 0 */, 1); else vecbiData.Enqueue(1 /* 1 */, 1); /* Enhancement flag */ if (!Parameter.Service[ServiceID].AudioParam.bEnhanceFlag) vecbiData.Enqueue(0 /* 0 */, 1); else vecbiData.Enqueue(1 /* 1 */, 1); /* Coder field */ if (Parameter.Service[ServiceID].AudioParam. eAudioCoding == CAudioParam::AC_CELP) { /* CELP index */ vecbiData.Enqueue( (uint32_t) Parameter.Service[ServiceID].AudioParam.iCELPIndex, 5); } else { /* rfa 5 bit */ vecbiData.Enqueue((uint32_t) 0, 5); } /* rfa 1 bit */ vecbiData.Enqueue((uint32_t) 0, 1); } qsstv_9.2.6/qsstv/drmtx/common/datadecoding/DABMOT.cpp0000664000175000017500000016304713203343610021326 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer, Andrea Russo, Doyle Richard, Julian Cable * * Adapted for ham sstv use Ties Bos PA0MBO * * Description: * DAB MOT interface implementation * * 12/22/2003 Doyle Richard * - Header extension decoding * 10/13/2005 Andrea Russo * - Broadcast WebSite application * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "DABMOT.h" #include "../util/Utilities.h" #include #include #include #include #include "drmtx/drmtransmitter.h" #include #if HAVE_LIBZ #include #else #ifdef HAVE_LIBFREEIMAGE # include #endif #endif #define RUNINLEN 24 #define RUNOUTLEN 10 static int bsrTransportId=2; using namespace std; /* Implementation *************************************************************/ ostream & operator<<(ostream & out, CDateAndTime & d) { d.dump(out); return out; } ostream & operator<<(ostream & out, CMOTObject & o) { o.dump(out); return out; } ostream & operator<<(ostream & out, CMOTDirectory & o) { o.dump(out); return out; } /******************************************************************************\ * Encoder * \******************************************************************************/ void CMOTDABEnc::SetMOTObject(CMOTObject & NewMOTObject,int bytesAvailable) { size_t i; size_t k; CMOTObjectRaw MOTObjectRaw; unsigned char xorfname , addfname ; /* Get some necessary parameters of object */ const int iPicSizeBits = NewMOTObject.vecbRawData.Size(); const int iPicSizeBytes = iPicSizeBits / SIZEOF__BYTE; const string strFileName = NewMOTObject.strName; /* File name size is restricted (in this implementation) to 128 (2^7) bytes. If file name is longer, cut it. TODO: better solution: set Ext flag in "ContentName" header extension to allow larger file names */ size_t iFileNameSize = strFileName.size(); if (strFileName=="bsr.bin") { bsrTransportId++; bsrTransportId=bsrTransportId%3; txTransportID=bsrTransportId; } else { if (iFileNameSize > 80) // was 128 iFileNameSize = 80; //was 128 // printf("Binnenkomst SetMOTObject file %s \n", strFileName.c_str()); if (iFileNameSize ==0 ) return; /* special hamcode */ xorfname = 0; addfname = 0; for (k=0; k < iFileNameSize ; k++) { xorfname ^= strFileName[k]; addfname += strFileName[k]; addfname ^= (unsigned char) k ; } txTransportID = 256 * (int)addfname + (int) xorfname ; if (txTransportID <= 2) txTransportID += iFileNameSize; } /* end special hamcode */ /* Copy actual raw data of object */ MOTObjectRaw.Body.Init(iPicSizeBits); MOTObjectRaw.Body = NewMOTObject.vecbRawData; /* Get content type and content sub type of object. We use the format string to get these informations about the object */ int iContentType = 2; /* Set default value (general data) was 0 */ int iContentSubType = 1; /* Set default value (jpg) was 0 */ /* Get ending string which declares the type of the file. Make lowercase */ string strFormat; #if defined(_MSC_VER) && (_MSC_VER < 1400) strFormat = _strlwr(_strdup(NewMOTObject.strFormat.c_str())); #else transform(NewMOTObject.strFormat.begin(), NewMOTObject.strFormat.end(), strFormat.begin(), (int (*)(int)) tolower); #endif // printf("DABMOT strFormat is %s \n", strFormat.c_str()); /* gif: 0, image: 2 */ if (strcmp(strFormat.c_str(), "gif") == 0) { iContentType = 2; iContentSubType = 0; } /* jfif: 1, image: 2. Possible endings: jpg, jpeg, jfif jp2 added sep 14 2012 */ if (( strcmp(strFormat.c_str(), "jpg")==0 ) || (strcmp(strFormat.c_str(), "jpeg") == 0) || (strcmp(strFormat.c_str(), "rs1") == 0) || (strcmp(strFormat.c_str(), "rs2") == 0) || (strcmp(strFormat.c_str(), "rs3") == 0) || (strcmp(strFormat.c_str(), "rs4") == 0) || (strcmp(strFormat.c_str(), "jp2") == 0) || (strcmp(strFormat.c_str(), "jfif") == 0)) { iContentType = 2; iContentSubType = 1; } /* bmp: 2, image: 2 */ if (strcmp(strFormat.c_str(),"bmp") == 0) { iContentType = 2; iContentSubType = 2; } /* png: 3, image: 2 */ if (strcmp(strFormat.c_str(),"png") == 0) { iContentType = 2; iContentSubType = 3; } // printf("na de ifs iContentType is %d iContentSubType is %d \n", iContentType, iContentSubType); /* Header --------------------------------------------------------------- */ /* Header size (including header extension) */ const int iHeaderSize = 7 /* Header core */ + 5 /* TriggerTime */ + 3 + iFileNameSize /* ContentName (header + actual name) */ + 2 /* VersionNumber */ ; /* Allocate memory and reset bit access */ MOTObjectRaw.Header.Init(iHeaderSize * SIZEOF__BYTE); MOTObjectRaw.Header.ResetBitAccess(); // printf("DABMOT iHeaderSize %d \n", iHeaderSize); /* BodySize: This 28-bit field, coded as an unsigned binary number, indicates the total size of the body in bytes */ MOTObjectRaw.Header.Enqueue((uint32_t) iPicSizeBytes, 28); /* HeaderSize: This 13-bit field, coded as an unsigned binary number, indicates the total size of the header in bytes */ MOTObjectRaw.Header.Enqueue((uint32_t) iHeaderSize, 13); /* ContentType: This 6-bit field indicates the main category of the body's content */ MOTObjectRaw.Header.Enqueue((uint32_t) iContentType, 6); /* ContentSubType: This 9-bit field indicates the exact type of the body's content depending on the value of the field ContentType */ MOTObjectRaw.Header.Enqueue((uint32_t) iContentSubType, 9); /* Header extension ----------------------------------------------------- */ /* MOT Slideshow application: Only the MOT parameter ContentName is mandatory and must be used for each slide object that will be handled by the MOT decoder and the memory management of the Slide Show terminal */ /* TriggerTime: This parameter specifies the time for when the presentation takes place. The TriggerTime activates the object according to its ContentType. The value of the parameter field is coded in the UTC format */ /* PLI (Parameter Length Indicator): This 2-bit field describes the total length of the associated parameter. In this case: 1 0 total parameter length = 5 bytes; length of DataField is 4 bytes */ MOTObjectRaw.Header.Enqueue((uint32_t) 2, 2); /* ParamId (Parameter Identifier): This 6-bit field identifies the parameter. 1 0 1 (dec: 5) -> TriggerTime */ MOTObjectRaw.Header.Enqueue((uint32_t) 5, 6); /* Validity flag = 0: "Now", MJD and UTC shall be ignored and be set to 0. Set MJD and UTC to zero. UTC flag is also zero -> short form */ MOTObjectRaw.Header.Enqueue((uint32_t) 0, 32); /* VersionNumber: If several versions of an object are transferred, this parameter indicates its VersionNumber. The parameter value is coded as an unsigned binary number, starting at 0 and being incremented by 1 modulo 256 each time the version changes. If the VersionNumber differs, the content of the body was modified */ /* PLI 0 1 total parameter length = 2 bytes, length of DataField is 1 byte */ MOTObjectRaw.Header.Enqueue((uint32_t) 1, 2); /* ParamId (Parameter Identifier): This 6-bit field identifies the parameter. 1 1 0 (dec: 6) -> VersionNumber */ MOTObjectRaw.Header.Enqueue((uint32_t) 6, 6); /* Version number data field */ MOTObjectRaw.Header.Enqueue((uint32_t) 0, 8); /* ContentName: The DataField of this parameter starts with a one byte field, comprising a 4-bit character set indicator (see table 3) and a 4-bit Rfa field. The following character field contains a unique name or identifier for the object. The total number of characters is determined by the DataFieldLength indicator minus one byte */ /* PLI 1 1 total parameter length depends on the DataFieldLength indicator */ MOTObjectRaw.Header.Enqueue((uint32_t) 3, 2); /* ParamId (Parameter Identifier): This 6-bit field identifies the parameter. 1 1 0 0 (dec: 12) -> ContentName */ MOTObjectRaw.Header.Enqueue((uint32_t) 12, 6); /* Ext (ExtensionFlag): This 1-bit field specifies the length of the DataFieldLength Indicator. 0: the total parameter length is derived from the next 7 bits */ MOTObjectRaw.Header.Enqueue((uint32_t) 0, 1); /* DataFieldLength Indicator: This field specifies as an unsigned binary number the length of the parameter's DataField in bytes. The length of this field is either 7 or 15 bits, depending on the setting of the ExtensionFlag */ MOTObjectRaw.Header.Enqueue((uint32_t) (1 /* header */ + iFileNameSize /* actual data */), 7); // printf("iFileNameSize is %d\n", iFileNameSize); // if (iFileNameSize ==0) return ; /* Character set indicator (0 0 0 0 complete EBU Latin based repertoire) */ MOTObjectRaw.Header.Enqueue((uint32_t) 0, 4); /* Rfa 4 bits */ MOTObjectRaw.Header.Enqueue((uint32_t) 0, 4); /* Character field */ for (i = 0; i < iFileNameSize; i++) MOTObjectRaw.Header.Enqueue((uint32_t) strFileName[i], 8); /* Generate segments ---------------------------------------------------- */ /* Header (header should not be partitioned! TODO) */ const int iPartiSizeHeader = 98; /* Bytes */// TEST was 100 pa0mbo // printf("Voor partitioning header \n"); PartitionUnits(MOTObjectRaw.Header, MOTObjSegments.vvbiHeader,iPartiSizeHeader); /* Body */ //ON4QZ change to better fit in NumDecodeBits PartitionUnits(MOTObjectRaw.Body, MOTObjSegments.vvbiBody, bytesAvailable-14); } void CMOTDABEnc::PartitionUnits(CVector < _BINARY > &vecbiSource, CVector < CVector < _BINARY > >&vecbiDest, const int iPartiSize) { int i, j; int iActSegSize; /* Divide the generated units in partitions */ const int iSourceSize = vecbiSource.Size() / SIZEOF__BYTE; const int iNumSeg = (int) ceil((_REAL) iSourceSize / iPartiSize); /* Bytes */ iNumSegStore = iNumSeg; const int iSizeLastSeg = iSourceSize - (int) floor((_REAL) iSourceSize / iPartiSize) * iPartiSize; /* printf("In PartitionUnits iParti %d iSource %d iNumSeg %d iSizlast %d\n", iPartiSize, iSourceSize, iNumSeg, iSizeLastSeg); */ /* Init memory for destination vector, reset bit access of source */ vecbiDest.Init(iNumSeg); vecbiSource.ResetBitAccess(); for (i = 0; i < iNumSeg; i++) { /* All segments except the last one must have the size "iPartSizeHeader". If "iSizeLastSeg" is =, the source data size is a multiple of the partitions size. In this case, all units have the same size (-> "|| (iSizeLastSeg == 0)") */ if ((i < iNumSeg - 1) || (iSizeLastSeg == 0)) iActSegSize = iPartiSize; else iActSegSize = iSizeLastSeg; /* Add segment data ------------------------------------------------- */ /* Header */ /* Allocate memory for body data and segment header bits (16) */ vecbiDest[i].Init(iActSegSize * SIZEOF__BYTE + 16); vecbiDest[i].ResetBitAccess(); /* Segment header */ /* RepetitionCount: This 3-bit field indicates, as an unsigned binary number, the remaining transmission repetitions for the current object. In our current implementation, no repetitions used. TODO */ vecbiDest[i].Enqueue((uint32_t) 0, 3); /* SegmentSize: This 13-bit field, coded as an unsigned binary number, indicates the size of the segment data field in bytes */ vecbiDest[i].Enqueue((uint32_t) iActSegSize, 13); /* Body */ for (j = 0; j < iActSegSize * SIZEOF__BYTE; j++) vecbiDest[i].Enqueue(vecbiSource.Separate(1), 1); } } void CMOTDABEnc::GenMOTObj(CVector < _BINARY > &vecbiData, CVector < _BINARY > &vecbiSeg, const _BOOLEAN bHeader, const int iSegNum, const int iTranspID, const _BOOLEAN bLastSeg) { int i; CCRC CRCObject; // printf("GenMOTObj iTranspID %d SIZEOF__BYTE %d\n", iTranspID, SIZEOF__BYTE); /* Standard settings for this implementation */ const _BOOLEAN bCRCUsed = true; /* CRC */ const _BOOLEAN bSegFieldUsed = true; /* segment field */ const _BOOLEAN bUsAccFieldUsed = true; /* user access field */ const _BOOLEAN bTransIDFieldUsed = true; /* transport ID field */ unsigned char testdata[10000]; double ownchecksum; /* Total length of object in bits */ int iTotLenMOTObj = 16 /* group header */ ; if (bSegFieldUsed == true) iTotLenMOTObj += 16; if (bUsAccFieldUsed == true) { iTotLenMOTObj += 8; if (bTransIDFieldUsed == true) iTotLenMOTObj += 16; } // printf("DABMOT vecbiSrg.size %d\n", vecbiSeg.Size()); iTotLenMOTObj += vecbiSeg.Size(); if (bCRCUsed == true) iTotLenMOTObj += 16; /* Init data vector */ vecbiData.Init(iTotLenMOTObj); vecbiData.ResetBitAccess(); /* MSC data group header ------------------------------------------------ */ /* Extension flag: this 1-bit flag shall indicate whether the extension field is present, or not. Not used right now -> 0 */ vecbiData.Enqueue((uint32_t) 0, 1); /* CRC flag: this 1-bit flag shall indicate whether there is a CRC at the end of the MSC data group */ if (bCRCUsed == true) vecbiData.Enqueue((uint32_t) 1, 1); else vecbiData.Enqueue((uint32_t) 0, 1); /* Segment flag: this 1-bit flag shall indicate whether the segment field is present, or not */ if (bSegFieldUsed == true) vecbiData.Enqueue((uint32_t) 1, 1); else vecbiData.Enqueue((uint32_t) 0, 1); /* User access flag: this 1-bit flag shall indicate whether the user access field is present, or not. We always use this field -> 1 */ if (bUsAccFieldUsed == true) vecbiData.Enqueue((uint32_t) 1, 1); else vecbiData.Enqueue((uint32_t) 0, 1); /* Data group type: this 4-bit field shall define the type of data carried in the data group data field. Data group types: 3: MOT header information 4: MOT data */ if (bHeader == true) vecbiData.Enqueue((uint32_t) 3, 4); else vecbiData.Enqueue((uint32_t) 4, 4); /* Continuity index: the binary value of this 4-bit field shall be incremented each time a MSC data group of a particular type, with a content different from that of the immediately preceding data group of the same type, is transmitted */ if (bHeader == true) { vecbiData.Enqueue((uint32_t) iContIndexHeader, 4); /* Increment modulo 16 */ iContIndexHeader++; if (iContIndexHeader == 16) iContIndexHeader = 0; } else { vecbiData.Enqueue((uint32_t) iContIndexBody, 4); /* Increment modulo 16 */ iContIndexBody++; if (iContIndexBody == 16) iContIndexBody = 0; } /* Repetition index: the binary value of this 4-bit field shall signal the remaining number of repetitions of a MSC data group with the same data content, occurring in successive MSC data groups of the same type. No repetition used in this implementation right now -> 0, TODO */ vecbiData.Enqueue((uint32_t) 0, 4); /* Extension field: this 16-bit field shall be used to carry the Data Group Conditional Access (DGCA) when general data or MOT data uses conditional access (Data group types 0010 and 0101, respectively). The DGCA contains the Initialization Modifier (IM) and additional Conditional Access (CA) information. For other Data group types, the Extension field is reserved for future additions to the Data group header. Extension field is not used in this implementation! */ /* Session header ------------------------------------------------------- */ /* Segment field */ if (bSegFieldUsed == true) { /* Last: this 1-bit flag shall indicate whether the segment number field is the last or whether there are more to be transmitted */ if (bLastSeg == true) vecbiData.Enqueue((uint32_t) 1, 1); else vecbiData.Enqueue((uint32_t) 0, 1); /* Segment number: this 15-bit field, coded as an unsigned binary number (in the range 0 to 32767), shall indicate the segment number. NOTE: The first segment is numbered 0 and the segment number is incremented by one at each new segment */ // printf("GenMOTObj blastSeg %d, iSegNum %d \n", bLastSeg, iSegNum); vecbiData.Enqueue((uint32_t) iSegNum, 15); } /* User access field */ if (bUsAccFieldUsed == true) { /* Rfa (Reserved for future addition): this 3-bit field shall be reserved for future additions */ vecbiData.Enqueue((uint32_t) 0, 3); /* Transport Id flag: this 1-bit flag shall indicate whether the Transport Id field is present, or not */ if (bTransIDFieldUsed == true) vecbiData.Enqueue((uint32_t) 1, 1); else vecbiData.Enqueue((uint32_t) 0, 1); /* Length indicator: this 4-bit field, coded as an unsigned binary number (in the range 0 to 15), shall indicate the length n in bytes of the Transport Id and End user address fields. We do not use end user address field, only transport ID -> 2 */ if (bTransIDFieldUsed == true) vecbiData.Enqueue((uint32_t) 2, 4); else vecbiData.Enqueue((uint32_t) 0, 4); /* Transport Id (Identifier): this 16-bit field shall uniquely identify one data object (file and header information) from a stream of such objects, It may be used to indicate the object to which the information carried in the data group belongs or relates */ if (bTransIDFieldUsed == true) vecbiData.Enqueue((uint32_t) iTranspID, 16); } /* MSC data group data field -------------------------------------------- */ vecbiSeg.ResetBitAccess(); for (i = 0; i < vecbiSeg.Size(); i++) vecbiData.Enqueue(vecbiSeg.Separate(1), 1); /* MSC data group CRC --------------------------------------------------- */ /* The data group CRC shall be a 16-bit CRC word calculated on the data group header, the session header and the data group data field. The generation shall be based on the ITU-T Recommendation X.25. At the beginning of each CRC word calculation, all shift register stage contents shall be initialized to "1". The CRC word shall be complemented (1's complement) prior to transmission */ if (bCRCUsed == true) { /* Reset bit access */ vecbiData.ResetBitAccess(); /* Calculate the CRC and put it at the end of the segment */ CRCObject.Reset(16); // printf("iTotLenMOTObj = %d \n", iTotLenMOTObj); /* "byLengthBody" was defined in the header */ for (i = 0; i < ((iTotLenMOTObj / SIZEOF__BYTE) - 2) /* CRC */ ; i++) CRCObject.AddByte((_BYTE) vecbiData.Separate(SIZEOF__BYTE)); /* Now, pointer in "enqueue"-function is back at the same place, add CRC */ vecbiData.Enqueue(CRCObject.GetCRC(), 16); // printf("sending crc16 from DABMOT %x iSegNum %d \n", CRCObject.GetCRC(), iSegNum); vecbiData.ResetBitAccess(); /* extra debugging code pa0mbo */ vecbiData.ResetBitAccess(); CRCObject.Reset(16); for (i = 0; i < ((iTotLenMOTObj / SIZEOF__BYTE)) ; i++) { testdata[i] = ((_BYTE) vecbiData.Separate(SIZEOF__BYTE)); CRCObject.AddByte(testdata[i]) ; // printf(" %d %x\n", i, testdata[i]); } CRCObject.crc16_bytewise( &ownchecksum, testdata, iTotLenMOTObj/SIZEOF__BYTE); // ON4QZ divided by SIZEOF__BYTE // printf("Own CRC is %x \n", (int)ownchecksum); // printf("crc16 from DABMOT %x iSegNum %d \n", CRCObject.GetCRC(), iSegNum); /* */ vecbiData.ResetBitAccess(); } } void CMOTDABEnc::prepareSegmentList(unsigned int repetition) // ON4QZ { int i,k,m,counter; unsigned int j; int numHeaderSegments=MOTObjSegments.vvbiHeader.Size(); int numBodySegments=MOTObjSegments.vvbiBody.Size(); segmentList.clear(); for(j=0;j &vecbiNewData) { bool bLastSegment; int segmentNumber; int headerNumber; segmentNumber=segmentList.at(segmentListIdx); if(segmentNumber<0) { //its a header headerNumber=-1-segmentNumber; if((headerNumber+1)==MOTObjSegments.vvbiHeader.Size()) bLastSegment=true; else bLastSegment=false; GenMOTObj(vecbiNewData, MOTObjSegments.vvbiHeader[headerNumber],true, headerNumber, txTransportID, bLastSegment); } else { //its a body segment if ((segmentNumber+1) == MOTObjSegments.vvbiBody.Size()) bLastSegment = true; else bLastSegment = false; GenMOTObj(vecbiNewData,MOTObjSegments.vvbiBody[segmentNumber], false,segmentNumber, txTransportID, bLastSegment); } segmentListIdx++; if(segmentListIdx==segmentList.count()) { segmentListIdx=0; return true; } return false; } //_BOOLEAN CMOTDABEnc::GetDataGroup(CVector < _BINARY > &vecbiNewData) //{ // _BOOLEAN bLastSegment; // /* Init return value. Is overwritten in case the object is ready */ // _BOOLEAN bObjectDone = false; // if (bFirstRound == true) // { // if (bCurSegHeader == true) // { // /* Check if this is last segment */ // if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size() - 1) bLastSegment = true; // else bLastSegment = false; // /* Generate MOT object for header */ // GenMOTObj(vecbiNewData, MOTObjSegments.vvbiHeader[iSegmCntHeader],true, iSegmCntHeader, txTransportID, bLastSegment); // addToLog(QString("FirstRound iSegmCntheader %1 blastseg %2 transportID %3").arg(iSegmCntHeader).arg(bLastSegment).arg(txTransportID),LOGDRMTXMOT); // iSegmCntHeader++; // if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size()) // { // iSegmCntBody = 0; // Reset counter for body // bCurSegHeader = false; // Header is ready, transmit body now // } // } // else // { // /* Check that body size is not zero */ // if (iSegmCntBody < MOTObjSegments.vvbiBody.Size()) // { // /* Check if this is last segment */ // if (iSegmCntBody == RUNINLEN ) bLastSegment = true; // else bLastSegment = false; // if (bLastSegment) // { // /* Generate MOT object for Body */ // GenMOTObj(vecbiNewData,MOTObjSegments.vvbiBody[iNumSegStore-1], false,iNumSegStore-1, txTransportID, bLastSegment); // addToLog(QString("FirstRound Generated MOTObj for seg %1 pseudolast").arg(iNumSegStore-1),LOGDRMTXMOT); // iSegmCntBody= 0; // iSegmCntHeader =0; // bCurSegHeader = true; // bFirstRound = false ; // } // else // { // /* Generate MOT object for Body */ // GenMOTObj(vecbiNewData,MOTObjSegments.vvbiBody[iSegmCntBody], false,iSegmCntBody, txTransportID, bLastSegment); // addToLog(QString("FirstRound Generated MOTObj for seg %1 ").arg(iSegmCntBody),LOGDRMTXMOT); // } // iSegmCntBody++; // } // if (iSegmCntBody == MOTObjSegments.vvbiBody.Size()) // { // iSegmCntHeader = 0; // Reset counter for header // bCurSegHeader = true; // Body is ready, transmit header from next object // bFirstRound = false ; // } // runInCnt++; // } // } // else // not first run // { // if (bCurSegHeader == true) // { // if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size() - 1) // { // bLastSegment = true; // Check if this is last segment // } // else bLastSegment = false; // /* Generate MOT object for header */ // GenMOTObj(vecbiNewData, MOTObjSegments.vvbiHeader[iSegmCntHeader], true, iSegmCntHeader, txTransportID, bLastSegment); // addToLog(QString("iSegmCntheader %1 blastseg %2").arg(iSegmCntHeader).arg(bLastSegment),LOGDRMTXMOT); // iSegmCntHeader++; // if (iSegmCntHeader == MOTObjSegments.vvbiHeader.Size()) // { // iSegmCntBody = 0; // Reset counter for body // bCurSegHeader = false; // Header is ready, transmit body now // } // } // else // { // if (iSegmCntBody < MOTObjSegments.vvbiBody.Size()) // Check that body size is not zero // { // if (iSegmCntBody == MOTObjSegments.vvbiBody.Size() - 1) // { // bLastSegment = true; // Check if this is last segment // } // else bLastSegment = false; // if (bLastSegment) // { // /* Generate MOT object for Body */ // GenMOTObj(vecbiNewData, MOTObjSegments.vvbiBody[iSegmCntBody], false, iNumSegStore-1, txTransportID, bLastSegment); // addToLog(QString("Generated MOTObj for seg %1 last").arg(iNumSegStore-1),LOGDRMTXMOT); // } // else // { // /* Generate MOT object for Body */ // GenMOTObj(vecbiNewData, MOTObjSegments.vvbiBody[iSegmCntBody], false, iSegmCntBody, txTransportID, bLastSegment); // addToLog(QString("Generated MOTObj for seg %1 of %2").arg(iSegmCntBody).arg( iNumSegStore),LOGDRMTXMOT); // } //// printf("GetDataGroup body situation 2nd iSegmCntBody %d iSegNumStore %d blastseg %d\n", iSegmCntBody, iNumSegStore, bLastSegment); // iSegmCntBody++; // } // if (iSegmCntBody == MOTObjSegments.vvbiBody.Size()) // { // iSegmCntHeader = 0; // Reset counter for header // bCurSegHeader = true; // Body is ready, transmit header from next object //// txTransportID++; // /* Signal that old object is done */ // bObjectDone = true; // } // } // } // /* Return status of object transmission */ // return bObjectDone; //} _REAL CMOTDABEnc::GetProgPerc() const { // Get percentage of processed data of current object. _REAL tussenresult; const int iTotNumSeg = MOTObjSegments.vvbiHeader.Size() + MOTObjSegments.vvbiBody.Size(); tussenresult = ((_REAL) iSegmCntBody + (_REAL) iSegmCntHeader) / iTotNumSeg; return tussenresult; } void CMOTDABEnc::Reset() { bFirstRound = true ; runInCnt=0; /* Reset continuity indices */ iContIndexHeader = 0; iContIndexBody = 0; txTransportID = 0; /* Init counter for segments */ iSegmCntHeader = 0; iSegmCntBody = 0; /* Init flag which shows what is currently generated, header or body */ bCurSegHeader = true; /* Start with header */ /* Add a "null object" so that at least one valid object can be processed */ CMOTObject NullObject; SetMOTObject(NullObject,154); } /******************************************************************************\ * Decoder * \******************************************************************************/ _BOOLEAN CMOTDABDec::NewObjectAvailable() { return qiNewObjects.empty() == false; } void CMOTDABDec::GetNextObject(CMOTObject & NewMOTObject) { if (!qiNewObjects.empty()) { TTransportID firstNew = qiNewObjects.front(); qiNewObjects.pop(); NewMOTObject = MOTCarousel[firstNew]; } else { fprintf(stderr, "GetObject called when queue empty\n"); fflush(stderr); } } void CMOTDABDec::DeliverIfReady(TTransportID TransportID) { CMOTObject & o = MOTCarousel[TransportID]; if ((!o.bComplete) && o.bHasHeader && o.Body.Ready()) { o.bComplete = true; if (o.Body.IsZipped()) { if (o.Body.uncompress() == false) /* Can't unzip so change the filename */ o.strName = string(o.strName.c_str()) + ".gz"; } //cerr << o << endl;; qiNewObjects.push(TransportID); } } void CMOTDABDec::AddDataUnit(CVector < _BINARY > &vecbiNewData) { int iLenGroupDataField; CCRC CRCObject; _BOOLEAN bCRCOk; int iSegmentNum; _BINARY biLastFlag; _BINARY btxTransportIDFlag = 0; int iLenIndicat; int iSegmentSize; TTransportID TransportID = -1; /* Get length of data unit */ iLenGroupDataField = vecbiNewData.Size(); /* CRC check ------------------------------------------------------------ */ /* We do the CRC check at the beginning no matter if it is used or not since we have to reset bit access for that */ /* Reset bit extraction access */ vecbiNewData.ResetBitAccess(); /* Check the CRC of this packet */ CRCObject.Reset(16); /* "- 2": 16 bits for CRC at the end */ for (size_t i = 0; i < size_t(iLenGroupDataField / SIZEOF__BYTE) - 2; i++) CRCObject.AddByte((_BYTE) vecbiNewData.Separate(SIZEOF__BYTE)); bCRCOk = CRCObject.CheckCRC(vecbiNewData.Separate(16)); /* MSC data group header ------------------------------------------------ */ /* Reset bit extraction access */ vecbiNewData.ResetBitAccess(); /* Extension flag */ const _BINARY biExtensionFlag = (_BINARY) vecbiNewData.Separate(1); /* CRC flag */ const _BINARY biCRCFlag = (_BINARY) vecbiNewData.Separate(1); /* Segment flag */ const _BINARY biSegmentFlag = (_BINARY) vecbiNewData.Separate(1); /* User access flag */ const _BINARY biUserAccFlag = (_BINARY) vecbiNewData.Separate(1); /* Data group type */ const int iDataGroupType = (int) vecbiNewData.Separate(4); /* Continuity index (not yet used) */ vecbiNewData.Separate(4); /* Repetition index (not yet used) */ vecbiNewData.Separate(4); /* Extension field (not used) */ if (biExtensionFlag == true) vecbiNewData.Separate(16); /* Session header ------------------------------------------------------- */ /* Segment field */ if (biSegmentFlag == true) { /* Last */ biLastFlag = (_BINARY) vecbiNewData.Separate(1); /* Segment number */ iSegmentNum = (int) vecbiNewData.Separate(15); } else { biLastFlag = 0; iSegmentNum = 0; } /* User access field */ if (biUserAccFlag == true) { /* Rfa (Reserved for future addition) */ vecbiNewData.Separate(3); /* Transport Id flag */ btxTransportIDFlag = (_BINARY) vecbiNewData.Separate(1); /* Length indicator */ iLenIndicat = (int) vecbiNewData.Separate(4); /* Transport Id */ if (btxTransportIDFlag == 1) TransportID = (int) vecbiNewData.Separate(16); /* End user address field (not used) */ int iLenEndUserAddress; if (btxTransportIDFlag == 1) iLenEndUserAddress = (iLenIndicat - 2) * SIZEOF__BYTE; else iLenEndUserAddress = iLenIndicat * SIZEOF__BYTE; vecbiNewData.Separate(iLenEndUserAddress); } //cerr << "MOT: new data unit, tid " << TransportID << " CRC " << bCRCOk << " DG" << iDataGroupType << endl; /* MSC data group data field -------------------------------------------- */ /* If CRC is not used enter if-block, if CRC flag is used, it must be ok to enter the if-block */ if ((biCRCFlag == false) || ((biCRCFlag == true) && (bCRCOk == true))) { /* Segmentation header ---------------------------------------------- */ /* Repetition count (not used) */ int repetition_count = vecbiNewData.Separate(3); (void)repetition_count; /* silence warnings */ /* Segment size */ iSegmentSize = (int) vecbiNewData.Separate(13); /* Get MOT data ----------------------------------------------------- */ /* Segment number and user access data is needed */ if ((biSegmentFlag == true) && (biUserAccFlag == true) && (btxTransportIDFlag == 1)) { /* don't make any assumptions about the order or interleaving of Data Groups from the same or different objects. */ /* Distinguish between header and body */ if (iDataGroupType == 3) { /* Header information, i.e. the header core and the header extension, are transferred in Data Group type 3 */ if (MOTmode != headerMode) { /* mode change, throw away any directory */ MOTDirectory.Reset(); //cout << "Reset " << MOTDirectory << endl; } MOTmode = headerMode; /* in theory, there can be only one header at a time, but lets be a bit more tolerant */ if (MOTHeaders.count(TransportID) == 0) { CBitReassembler o; MOTHeaders[TransportID] = o; } CBitReassembler & o = MOTHeaders[TransportID]; o.AddSegment(vecbiNewData, iSegmentSize, iSegmentNum, biLastFlag); /* if the header just got complete, see if the body is complete */ if (o.Ready()) { MOTCarousel[TransportID].AddHeader(o.vecData); DeliverIfReady(TransportID); } } else if (iDataGroupType == 4) { /* Body data segments are transferred in Data Group type 4 */ /* don't worry about modes, just store everything in the carousel defer decisions until the object and either header or directory are complete */ map < TTransportID, CMOTObject >::iterator o = MOTCarousel.find(TransportID); if (o == MOTCarousel.end()) { /* we never saw this before */ MOTCarousel[TransportID].TransportID = TransportID; o = MOTCarousel.find(TransportID); } /* is this an old object we have completed? */ if (o->second.bComplete == false) { o->second.Body.AddSegment(vecbiNewData, iSegmentSize, iSegmentNum, biLastFlag); } else { /* discard the segment */ vecbiNewData.Separate(iSegmentSize * SIZEOF__BYTE); } /* if the body just got complete we can see if its ready to deliver */ DeliverIfReady(TransportID); } else if (iDataGroupType == 6) /* MOT directory */ { //cout << "DG6" << endl; if (MOTmode != directoryMode) { /* mode change, throw away any headers */ MOTHeaders.clear(); MOTDirectory.TransportID = -1; /* forced reset */ MOTmode = directoryMode; //cout << "Reset " << MOTDirectory << endl; } /* The carousel is changing */ if (MOTDirectory.TransportID != TransportID) { /* we never got all the previous directory */ cout << " we never got all the previous directory " << TransportID << ", " << MOTDirectory. TransportID << endl; MOTDirectory.Reset(); MOTDirectory.TransportID = TransportID; MOTDirectoryEntity.Reset(); MOTDirComprEntity.Reset(); } if ((MOTDirectory.TransportID != TransportID) || ((MOTDirectory.TransportID == TransportID) && (!MOTDirectoryEntity.Ready()))) { /* Handle the new segment */ /* rely on the Add routine to check duplicates, set ready, etc. */ MOTDirectoryEntity.AddSegment(vecbiNewData, iSegmentSize, iSegmentNum, biLastFlag); /* have we got the full directory ? */ if (MOTDirectoryEntity.Ready()) { //cout << "Ready " << MOTDirectory << endl; ProcessDirectory(MOTDirectoryEntity); MOTDirectory.TransportID = TransportID; } /* END IF HAVE ALL OF THE NEW DIRECTORY */ } else { vecbiNewData.Separate(iSegmentSize * SIZEOF__BYTE); } } /* of DG type 6 */ #if 0 //Commented until we can test it with a real compressed directory else if (iDataGroupType == 7) /* MOT directory compressed */ { if (MOTmode != directoryMode) { /* mode change, throw away any headers */ MOTHeaders.clear(); MOTDirectory.TransportID = -1; /* forced reset */ MOTmode = directoryMode; } /* The carousel is changing */ if (MOTDirectory.TransportID != TransportID) { /* we never got all the previous directory */ MOTDirectory.Reset(); MOTDirectory.TransportID = TransportID; MOTDirectoryEntity.Reset(); MOTDirComprEntity.Reset(); } if ((MOTDirectory.TransportID != TransportID) || ((MOTDirectory.TransportID == TransportID) && (!MOTDirComprEntity.Ready()))) { /* Handle the new segment */ /* rely on the Add routine to check duplicates, set ready, etc. */ MOTDirComprEntity.AddSegment(vecbiNewData, iSegmentSize, iSegmentNum, biLastFlag); /* have we got the full directory ? */ if (MOTDirComprEntity.Ready()) { /* uncompress data and extract directory */ /* Compression Flag - must be 1 */ const _BOOLEAN bCompressionFlag = MOTDirComprEntity.vecData. Separate(1) ? true : false; /* rfu */ MOTDirComprEntity.vecData.Separate(1); /* EntitySize */ MOTDirComprEntity.vecData.Separate(30); /* CompressionID */ MOTDirComprEntity.vecData.Separate(8); /* rfu */ MOTDirComprEntity.vecData.Separate(2); /* Uncompressed DataLength */ MOTDirComprEntity.vecData.Separate(30); CBitReassembler MOTDirectoryData; MOTDirectoryData.vecData = MOTDirComprEntity.vecData. Separate(MOTDirComprEntity.vecData.Size() - (9 * SIZEOF__BYTE)); if (bCompressionFlag && MOTDirectoryData.IsZipped() && MOTDirectoryData.uncompress()) { ProcessDirectory(MOTDirectoryData); MOTDirectory.TransportID = TransportID; } else { /* reset */ MOTDirComprEntity.Reset(); } } /* END IF HAVE ALL OF THE NEW DIRECTORY */ } else { vecbiNewData.Separate(iSegmentSize * SIZEOF__BYTE); } } /* of DG type 7 */ #endif else { vecbiNewData.Separate(iSegmentSize * SIZEOF__BYTE); } } } } void CMOTDABDec::ProcessDirectory(CBitReassembler & MOTDir) { MOTDirectory.AddHeader(MOTDir.vecData); /* first reset the "I'm in the carousel" flag for all objects and set the "I was in the carousel for the relevant objects then set the "I'm in the carousel" flag for all objects in the new directory. Then delete the objects from the carousel that need deleting leave objects alone that were never in a carousel, they might become valid later. */ /* save bodies of old carousel */ map < TTransportID, CByteReassembler > Body; for (map < TTransportID, CMOTObject >::iterator m = MOTCarousel.begin(); m != MOTCarousel.end(); m++) { Body[m->first] = m->second.Body; } MOTCarousel.erase(MOTCarousel.begin(), MOTCarousel.end()); //cout << "decode directory " << MOTDirectory. iNumberOfObjects << " === " << MOTDirectory.vecObjects.size() << " {"; MOTDirectory.vecObjects.clear(); for (size_t i = 0; i < size_t(MOTDirectory.iNumberOfObjects); i++) { /* add each header to the carousel */ TTransportID tid = (TTransportID) MOTDir.vecData.Separate(16); MOTCarousel[tid].AddHeader(MOTDir.vecData); /* keep any bodies or body fragments previously received */ map < TTransportID, CByteReassembler >::iterator b = Body.find(tid); if (b != Body.end()) MOTCarousel[tid].Body = b->second; /* mark objects which are in the new directory */ MOTDirectory.vecObjects.push_back(tid); //cout << tid << " "; DeliverIfReady(tid); } //cout << "}" << endl; } void CDateAndTime::extract_absolute(CVector < _BINARY > &vecbiData) { vecbiData.Separate(1); /* rfa */ CModJulDate ModJulDate(vecbiData.Separate(17)); day = ModJulDate.GetDay(); month = ModJulDate.GetMonth(); year = ModJulDate.GetYear(); vecbiData.Separate(1); /* rfa */ lto_flag = (int) vecbiData.Separate(1); utc_flag = (int) vecbiData.Separate(1); hours = (int) vecbiData.Separate(5); minutes = (int) vecbiData.Separate(6); if (utc_flag != 0) { seconds = (int) vecbiData.Separate(6); vecbiData.Separate(10); /* rfa */ } else { seconds = 0; } if (lto_flag != 0) { vecbiData.Separate(2); /* rfa */ int sign = (int) vecbiData.Separate(1); half_hours = (int) vecbiData.Separate(5); if (sign == 1) half_hours = 0 - half_hours; } else { half_hours = 0; } } void CDateAndTime::extract_relative(CVector < _BINARY > &vecbiData) { int granularity = (int) vecbiData.Separate(2); int interval = (int) vecbiData.Separate(6); time_t t = time(NULL); switch (granularity) { case 0: t += 2 * 60 * interval; break; case 1: t += 30 * 60 * interval; break; case 2: t += 2 * 60 * 60 * interval; break; case 3: t += 24 * 60 * 60 * interval; break; } struct tm *tmp = gmtime(&t); year = tmp->tm_year; month = tmp->tm_mon; day = tmp->tm_mday; hours = tmp->tm_hour; minutes = tmp->tm_min; seconds = tmp->tm_sec; } void CDateAndTime::dump(ostream & out) { out << year << '/' << uint16_t(month) << '/' << uint16_t(day); out << " " << hours << ':' << minutes << ':' << seconds; out << " flags: " << utc_flag << ':' << lto_flag << ':' << half_hours; } void CMOTObjectBase::decodeExtHeader(_BYTE & bParamId, int &iHeaderFieldLen, int &iDataFieldLen, CVector < _BINARY > &vecbiHeader) const { int iPLI = (int) vecbiHeader.Separate(2); bParamId = (unsigned char) vecbiHeader.Separate(6); iHeaderFieldLen = 1; switch (iPLI) { case 0: /* Total parameter length = 1 byte; no DataField available */ iDataFieldLen = 0; break; case 1: /* Total parameter length = 2 bytes, length of DataField is 1 byte */ iDataFieldLen = 1; break; case 2: /* Total parameter length = 5 bytes; length of DataField is 4 bytes */ iDataFieldLen = 4; break; case 3: /* Total parameter length depends on the DataFieldLength indicator (the maximum parameter length is 32770 bytes) */ /* Ext (ExtensionFlag): This 1-bit field specifies the length of the DataFieldLength Indicator and is coded as follows: - 0: the total parameter length is derived from the next 7 bits; - 1: the total parameter length is derived from the next 15 bits */ _BINARY biExt = (_BINARY) vecbiHeader.Separate(1); /* Get data field length */ if (biExt == 0) { iDataFieldLen = (int) vecbiHeader.Separate(7); iHeaderFieldLen++; } else { iDataFieldLen = (int) vecbiHeader.Separate(15); iHeaderFieldLen += 2; } } } void CReassembler::cachelast(CVector < _BYTE > &vecDataIn, size_t iSegSize) { vecLastSegment.Init(iSegSize); for (size_t i = 0; i < iSegSize; i++) vecLastSegment[i] = vecDataIn.Separate(8); } void CReassembler::copyin(CVector < _BYTE > &vecDataIn, size_t iSegNum, size_t bytes) { size_t offset = iSegNum * iSegmentSize; size_t iNewSize = offset + bytes; if (size_t(vecData.Size()) < iNewSize) vecData.Enlarge(iNewSize - vecData.Size()); for (size_t i = 0; i < bytes; i++) vecData[offset + i] = vecDataIn.Separate(8); } void CReassembler::AddSegment(CVector < _BYTE > &vecDataIn, int iSegSize, int iSegNum, _BOOLEAN bLast) { if (bLast) { if (iLastSegmentNum == -1) { iLastSegmentNum = iSegNum; iLastSegmentSize = iSegSize; /* three cases: 1: single segment - easy! (actually degenerate with case 3) 2: multi-segment and the last segment came first. 3: normal - some segment, not the last, came first, we know the segment size */ if (iSegNum == 0) { /* case 1 */ copyin(vecDataIn, 0, iSegSize); } else if (iSegmentSize == 0) { /* case 2 */ cachelast(vecDataIn, iSegSize); } else { /* case 3 */ copyin(vecDataIn, iSegNum, iSegSize); } } /* otherwise do nothing as we already have the last segment */ } else { iSegmentSize = iSegSize; if (Tracker.HaveSegment(iSegNum) == false) { copyin(vecDataIn, iSegNum, iSegSize); } } Tracker.AddSegment(iSegNum); /* tracking the last segment makes the Ready work! */ if ((iLastSegmentSize != -1) /* we have the last segment */ && (bReady == false) /* we haven't already completed reassembly */ && Tracker.Ready() /* there are no gaps */ ) { if (vecLastSegment.Size() > 0) { /* we have everything, but the last segment came first */ copylast(); } bReady = true; } } void CReassembler::copylast() { size_t offset = iLastSegmentNum * iSegmentSize; vecData.Enlarge(vecLastSegment.Size()); for (size_t i = 0; i < size_t(vecLastSegment.Size()); i++) vecData[offset + i] = vecLastSegment[i]; vecLastSegment.Init(0); } void CBitReassembler::cachelast(CVector < _BYTE > &vecDataIn, size_t iSegSize) { vecLastSegment.Init(8 * iSegSize); vecLastSegment.ResetBitAccess(); for (size_t i = 0; i < 8 * iSegSize; i++) vecLastSegment[i] = vecDataIn.Separate(1); } void CBitReassembler::copyin(CVector < _BYTE > &vecDataIn, size_t iSegNum, size_t bytes) { size_t offset = iSegNum * 8 * iSegmentSize; size_t bits = 8 * bytes; size_t iNewSize = offset + bits; if (size_t(vecData.Size()) < iNewSize) vecData.Enlarge(iNewSize - vecData.Size()); for (size_t i = 0; i < bits; i++) vecData[offset + i] = vecDataIn.Separate(1); } void CBitReassembler::copylast() { size_t offset = iLastSegmentNum * 8 * iSegmentSize; vecData.Enlarge(vecLastSegment.Size()); for (size_t i = 0; i < size_t(vecLastSegment.Size()); i++) vecData[offset + i] = vecLastSegment[i]; vecLastSegment.Init(0); vecLastSegment.ResetBitAccess(); } string CMOTObjectBase::extractString(CVector < _BINARY > &vecbiData, int iLen) const { string strVar; for (size_t i = 0; i < size_t(iLen); i++) { strVar += (char) vecbiData.Separate(SIZEOF__BYTE); } return strVar; } void CMOTDirectory::Reset () { CMOTObjectBase::Reset (); bSortedHeaderInformation = false; DirectoryIndex.clear (); bCompressionFlag = false; iCarouselPeriod = -1; iNumberOfObjects = 0; iSegmentSize = 0; } void CMOTDirectory::AddHeader(CVector < _BINARY > &vecbiHeader) { // int iDirectorySize; /* compression flag - must be zero */ bCompressionFlag = vecbiHeader.Separate(1) ? true : false; /* rfu */ vecbiHeader.Separate(1); /* Directory size: not used */ // iDirectorySize = (int) vecbiHeader.Separate(30); /* Number of objects */ iNumberOfObjects = (int) vecbiHeader.Separate(16); /* Carousel period */ iCarouselPeriod = (int) vecbiHeader.Separate(24); /* rfu */ vecbiHeader.Separate(1); /* Rfa: not used */ vecbiHeader.Separate(2); /* Segment size: not used */ iSegmentSize = (int) vecbiHeader.Separate(13); /* Directory extension length */ int iDirectoryExtensionLength = (int) vecbiHeader.Separate(16); /* Use all header extension data blocks */ int iSizeRec = iDirectoryExtensionLength; /* Use all header extension data blocks */ while (iSizeRec > 0) { _BYTE bParamId; int iHdrFieldLen, iDataFieldLen, iTmp; decodeExtHeader(bParamId, iHdrFieldLen, iDataFieldLen, vecbiHeader); iSizeRec -= (iHdrFieldLen + iDataFieldLen); switch (bParamId) { case 0: /* SortedHeaderInformation */ bSortedHeaderInformation = true; break; case 1: /* DefaultPermitOutdatedVersions */ iTmp = (int) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); if (iTmp == 0) bPermitOutdatedVersions = false; else bPermitOutdatedVersions = true; break; case 9: /* DefaultExpiration */ if (iDataFieldLen == 1) { /* relative */ ExpireTime.extract_relative(vecbiHeader); } else { /* absolute */ ExpireTime.extract_absolute(vecbiHeader); } break; case 34: /* DirectoryIndex */ { _BYTE iProfile = (_BYTE) vecbiHeader.Separate(SIZEOF__BYTE); DirectoryIndex[iProfile] = extractString(vecbiHeader, iDataFieldLen - 1); } break; default: if (iDataFieldLen > 0) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; } } } _BOOLEAN CReassembler::IsZipped() const { /* Check if the header file is a gzip header see GZIP file format specification http://www.ietf.org/rfc/rfc1952.txt */ if(vecData.Size()<3) return false; /* Check for gzip header [31, 139, 8] */ if ((vecData[0] == 31) && (vecData[1] == 139) && (vecData[2] == 8)) return true; else return false; } unsigned int CReassembler::gzGetOriginalSize() const { /* Get the original size from a gzip file last 4 bytes contains the original file size (ISIZE) see GZIP file format specification http://www.ietf.org/rfc/rfc1952.txt */ CVector < _BYTE > byHeader(4); const int iLastByte = vecData.Size() - 1; byHeader[0] = vecData[iLastByte - 3]; byHeader[1] = vecData[iLastByte - 2]; byHeader[2] = vecData[iLastByte - 1]; byHeader[3] = vecData[iLastByte]; return byHeader[0] + (byHeader[1] << 8) + (byHeader[2] << 16) + (byHeader[3] << 24); } _BOOLEAN CReassembler::uncompress() { #if HAVE_LIBZ CVector < _BYTE > vecbRawDataOut; /* Extract the original file size */ unsigned long dest_len = gzGetOriginalSize(); if (dest_len < MAX_DEC_NUM_BYTES_ZIP_DATA) { vecbRawDataOut.Init(dest_len); int zerr; z_stream stream; memset(&stream, 0, sizeof(stream)); if ((zerr = inflateInit2(&stream, -MAX_WBITS)) != Z_OK) return false; /* skip past minimal gzip header */ stream.next_in = &vecData[10]; stream.avail_in = vecData.Size() - 10; stream.next_out = &vecbRawDataOut[0]; stream.avail_out = vecbRawDataOut.Size(); zerr = inflate(&stream, Z_NO_FLUSH); dest_len = vecbRawDataOut.Size() - stream.avail_out; if (zerr != Z_OK && zerr != Z_STREAM_END) return false; inflateEnd(&stream); if (zerr != Z_OK && zerr != Z_STREAM_END) return false; vecData.Init(dest_len); vecData = vecbRawDataOut; return true; } else { vecData.Init(0); return false; } #else # ifdef HAVE_LIBFREEIMAGE CVector < _BYTE > vecbRawDataOut; CVector < _BYTE > &vecbRawDataIn = vecData; /* Extract the original file size */ const unsigned long dest_len = gzGetOriginalSize(); if (dest_len < MAX_DEC_NUM_BYTES_ZIP_DATA) { vecbRawDataOut.Init(dest_len); /* Actual decompression call */ const int zerr = FreeImage_ZLibGUnzip(&vecbRawDataOut[0], dest_len, &vecbRawDataIn[0], vecbRawDataIn.Size()); if (zerr > 0) { /* Copy data */ vecData.Init(zerr); vecData = vecbRawDataOut; return true; } else { vecData.Init(0); return false; } } else { vecData.Init(0); return false; } # else return false; # endif #endif } static const char *txt[] = { "txt", "txt", "html", 0 }; static const char *img[] = { "gif", "jpeg", "bmp", "png", 0 }; static const char *audio[] = { "mpg", "mp2", "mp3", "mpg", "mp2", "mp3", "pcm", "aiff", "atrac", "atrac2", "mp4", 0 }; static const char *video[] = { "mpg", "mp2", "mp4", "h263", 0 }; void CMOTObject::AddHeader(CVector < _BINARY > &vecbiHeader) { /* HeaderSize and BodySize */ iBodySize = (int) vecbiHeader.Separate(28); size_t iHeaderSize = (size_t) vecbiHeader.Separate(13); /* Content type and content sub-type */ iContentType = (int) vecbiHeader.Separate(6); iContentSubType = (int) vecbiHeader.Separate(9); /* 7 bytes for header core */ int iSizeRec = iHeaderSize - 7; /* Use all header extension data blocks */ while (iSizeRec > 0) { _BYTE bParamId; int iHdrFieldLen, iDataFieldLen, iTmp; decodeExtHeader(bParamId, iHdrFieldLen, iDataFieldLen, vecbiHeader); iSizeRec -= (iHdrFieldLen + iDataFieldLen); switch (bParamId) { case 1: /* PermitOutdatedVersions */ iTmp = (int) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); if (iTmp == 0) bPermitOutdatedVersions = false; else bPermitOutdatedVersions = true; break; case 5: /* TriggerTime - OBSOLETE */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 6: /* Version - OBSOLETE */ iVersion = (int) vecbiHeader.Separate(SIZEOF__BYTE); break; case 7: /* RetransmissionDistance */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 9: /* Expiration */ if (iDataFieldLen == 1) { /* relative */ ExpireTime.extract_relative(vecbiHeader); } else { /* absolute */ ExpireTime.extract_absolute(vecbiHeader); } break; case 10: /* Priority */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 11: /* Label */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 12: /* Content Name */ /* TODO - convert characters to UNICODE */ iCharacterSetForName = vecbiHeader.Separate(4); /* rfa */ vecbiHeader.Separate(4); strName = extractString(vecbiHeader, iDataFieldLen - 1); break; case 13: /* UniqueBodyVersion */ iUniqueBodyVersion = (int) vecbiHeader.Separate(32); break; case 15: /* Content Description */ iCharacterSetForDescription = vecbiHeader.Separate(4); /* rfa */ vecbiHeader.Separate(4); strContentDescription = extractString(vecbiHeader, iDataFieldLen - 1); break; case 16: /* Mime Type */ strMimeType = extractString(vecbiHeader, iDataFieldLen); break; case 17: /* Compression Type */ iCompressionType = (int) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 0x21: /* ProfileSubset */ { vecbProfileSubset.clear(); for (size_t i = 0; i < size_t(iDataFieldLen); i++) vecbProfileSubset.push_back((_BYTE) vecbiHeader. Separate(SIZEOF__BYTE)); } break; case 0x23: /* CAInfo */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 0x24: /* CAReplacementObject */ /* not decoded - skip */ (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; case 0x25: /* ScopeStart */ ScopeStart.extract_absolute(vecbiHeader); break; case 0x26: /* ScopeEnd */ ScopeEnd.extract_absolute(vecbiHeader); break; case 0x27: /* ScopeId */ iScopeId = vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; default: /* not decoded - skip */ if (iDataFieldLen > 0) (void) vecbiHeader.Separate(iDataFieldLen * SIZEOF__BYTE); break; } } /* set strFormat */ switch (iContentType) { case 1: strFormat = txt[iContentSubType]; break; case 2: strFormat = img[iContentSubType]; break; case 3: strFormat = audio[iContentSubType]; break; case 4: strFormat = video[iContentSubType]; break; } bHasHeader = true; } void CMOTObject::dump(ostream & out) { out << "MOT(" << TransportID << "):"; out << " Name: " << strName; out << ':' << iCharacterSetForName; out << " Description: " << strContentDescription; out << ':' << iCharacterSetForDescription; out << " mime: " << strMimeType; out << " content: " << iContentType << '/' << iContentSubType; out << " UniqueBodyVersion: " << iUniqueBodyVersion; out << " Expires: " << ExpireTime; out << " PermitOutdatedVersions: " << bPermitOutdatedVersions; out << " Scope: " << hex << iScopeId << dec << " from " << ScopeStart << " to " << ScopeEnd; out << " CompressionType: " << iCompressionType; out << " Version: " << iVersion; out << " Priority: " << iPriority; out << " RetransmissionDistance: " << iRetransmissionDistance; out << " format: " << strFormat; out << " length: " << iBodySize; } void CMOTDirectory::dump(ostream & out) { out << "MOTDIR(" << TransportID << "):"; out << " Expires: " << ExpireTime; out << " PermitOutdatedVersions: " << bPermitOutdatedVersions; out << " CarouselPeriod: " << iCarouselPeriod; out << " SegmentSize: " << iSegmentSize; out << " CompressionFlag: " << bCompressionFlag; out << " SortedHeaderInformation: " << bSortedHeaderInformation; out << " indices { "; for (map < _BYTE, string >::iterator di = DirectoryIndex.begin(); di != DirectoryIndex.end(); di++) { out << hex << di->first << dec << " => " << di->second; out.flush(); } out << " }"; out << " there are " << iNumberOfObjects << " objects {"; for (size_t i = 0; i < vecObjects.size(); i++) out << " " << vecObjects[i]; out << " }"; } qsstv_9.2.6/qsstv/drmtx/common/datadecoding/DABMOT.h0000664000175000017500000003705313203343610020770 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer, Andrea Russo, Julian Cable * * adapted for ham sstv use Ties Bos - PA0MBO * * * Description: * See DABMOT.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DABMOT_H__3B0UBVE98732KJVEW363E7A0D31912__INCLUDED_) #define DABMOT_H__3B0UBVE98732KJVEW363E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "utils/vector.h" #include "../util/CRC.h" #include #include #include #include #include "drm.h" /* Definitions ****************************************************************/ /* Invalid data segment number. Shall be a negative value since the test for invalid data segment number is always "if (iDataSegNum < 0)" */ #define INVALID_DATA_SEG_NUM -1 /* Maximum number of bytes for zip'ed files. We need to specify this number to avoid segmentation faults due to erroneous zip header giving a much too high number of bytes */ #define MAX_DEC_NUM_BYTES_ZIP_DATA 1000000 /* 1 MB */ /* Registrered BWS profiles (ETSI TS 101 498-1) */ #define RESERVED_PROFILE 0x00 #define BASIC_PROFILE 0x01 #define TOP_NEWS_PROFILE 0x02 #define UNRESTRICTED_PC_PROFILE 0xFF /* Classes ********************************************************************/ class CMOTObjectRaw { public: CMOTObjectRaw () { Reset (); } CMOTObjectRaw (const CMOTObjectRaw & nOR) { Header = nOR.Header; Body = nOR.Body; } CMOTObjectRaw & operator= (const CMOTObjectRaw & nOR) { Header = nOR.Header; Body = nOR.Body; return *this; } void Reset () { Header.Init (0); Body.Init (0); } CVector < _BINARY > Header; CVector < _BINARY > Body; }; class CDateAndTime { public: CDateAndTime():utc_flag(0), lto_flag(0), half_hours(0), year(0), month(0), day(0), hours(0), minutes(0), seconds(0) {} void extract_relative (CVector < _BINARY > &vecbiData); void extract_absolute (CVector < _BINARY > &vecbiData); void Reset () { utc_flag = 0; lto_flag = 0; half_hours = 0; year = 0; month = 0; day = 0; hours = 0; minutes = 0; seconds = 0; } void dump(ostream& out); int utc_flag, lto_flag, half_hours; uint16_t year; uint8_t month, day; int hours, minutes, seconds; }; typedef int TTransportID; class CSegmentTracker { public: CSegmentTracker () { Reset (); } void Reset () { vecbHaveSegment.clear (); } size_t size () { return vecbHaveSegment.size (); } _BOOLEAN Ready () { if (vecbHaveSegment.size () == 0) return false; for (size_t i = 0; i < vecbHaveSegment.size (); i++) { if (vecbHaveSegment[i] == false) { return false; } } return true; } void AddSegment (int iSegNum) { if ((iSegNum + 1) > int (vecbHaveSegment.size ())) vecbHaveSegment.resize (iSegNum + 1, false); vecbHaveSegment[iSegNum] = true; } _BOOLEAN HaveSegment (int iSegNum) { if (iSegNum < int (vecbHaveSegment.size ())) return vecbHaveSegment[iSegNum]; return false; } protected: vector < _BOOLEAN > vecbHaveSegment; }; class CReassembler { public: CReassembler(): vecData(), vecLastSegment(), iLastSegmentNum(-1), iLastSegmentSize(-1), iSegmentSize(0), Tracker(), bReady(false) { } CReassembler (const CReassembler & r):iLastSegmentNum (r.iLastSegmentNum), iLastSegmentSize (r.iLastSegmentSize), iSegmentSize (r.iSegmentSize), Tracker (r.Tracker), bReady (r.bReady) { vecData.Init (r.vecData.Size ()); vecData = r.vecData; vecLastSegment.Init (r.vecLastSegment.Size ()); vecLastSegment = r.vecLastSegment; } virtual ~ CReassembler () { } inline CReassembler & operator= (const CReassembler & r) { iLastSegmentNum = r.iLastSegmentNum; iLastSegmentSize = r.iLastSegmentSize; iSegmentSize = r.iSegmentSize; Tracker = r.Tracker; vecData.Init (r.vecData.Size ()); vecData = r.vecData; vecLastSegment.Init (r.vecLastSegment.Size ()); vecLastSegment = r.vecLastSegment; bReady = r.bReady; return *this; } void Reset () { vecData.Init (0); vecData.ResetBitAccess (); vecLastSegment.Init (0); vecLastSegment.ResetBitAccess (); iLastSegmentNum = -1; iLastSegmentSize = -1; iSegmentSize = 0; Tracker.Reset (); bReady = false; } _BOOLEAN Ready () { return bReady; } void AddSegment (CVector < _BYTE > &vecDataIn, int iSegSize, int iSegNum, _BOOLEAN bLast = false); _BOOLEAN IsZipped () const; _BOOLEAN uncompress(); CVector < _BYTE > vecData; protected: virtual void copyin (CVector < _BYTE > &vecDataIn, size_t iSegNum, size_t bytes); virtual void cachelast (CVector < _BYTE > &vecDataIn, size_t iSegSize); virtual void copylast (); unsigned int gzGetOriginalSize () const; CVector < _BYTE > vecLastSegment; int iLastSegmentNum; int iLastSegmentSize; size_t iSegmentSize; CSegmentTracker Tracker; _BOOLEAN bReady; }; class CBitReassembler:public CReassembler { public: CBitReassembler ():CReassembler () { } CBitReassembler (const CBitReassembler & r):CReassembler (r) { } protected: virtual void copyin (CVector < _BYTE > &vecDataIn, size_t iSegNum, size_t bytes); virtual void cachelast (CVector < _BYTE > &vecDataIn, size_t iSegSize); virtual void copylast (); }; typedef CReassembler CByteReassembler; class CMOTObjectBase { public: CMOTObjectBase ():TransportID(-1),ExpireTime(),bPermitOutdatedVersions(false) { Reset (); } virtual ~CMOTObjectBase () { } virtual void Reset () { TransportID = -1; ExpireTime.Reset (); bPermitOutdatedVersions = false; } void decodeExtHeader (_BYTE & bParamId, int &iHeaderFieldLen, int &iDataFieldLen, CVector < _BINARY > &vecbiHeader) const; string extractString (CVector < _BINARY > &vecbiData, int iLen) const; TTransportID TransportID; CDateAndTime ExpireTime; _BOOLEAN bPermitOutdatedVersions; }; class CMOTDirectory:public CMOTObjectBase { public: CMOTDirectory ():CMOTObjectBase(), iCarouselPeriod(0), iNumberOfObjects(0), iSegmentSize(0), bCompressionFlag(false), bSortedHeaderInformation(false), DirectoryIndex(), vecObjects() { } CMOTDirectory (const CMOTDirectory & nD):CMOTObjectBase (nD), iCarouselPeriod (nD.iCarouselPeriod), iNumberOfObjects (nD.iNumberOfObjects), iSegmentSize (nD.iSegmentSize), bCompressionFlag (nD.bCompressionFlag), bSortedHeaderInformation (nD.bSortedHeaderInformation), DirectoryIndex (nD.DirectoryIndex) { } virtual ~CMOTDirectory () { } inline CMOTDirectory & operator= (const CMOTDirectory & nD) { TransportID = nD.TransportID; ExpireTime = nD.ExpireTime; bPermitOutdatedVersions = nD.bPermitOutdatedVersions; bSortedHeaderInformation = nD.bSortedHeaderInformation; bCompressionFlag = nD.bCompressionFlag; iCarouselPeriod = nD.iCarouselPeriod; DirectoryIndex = nD.DirectoryIndex; iNumberOfObjects = nD.iNumberOfObjects; iSegmentSize = nD.iSegmentSize; return *this; } virtual void Reset (); virtual void AddHeader (CVector < _BINARY > &vecbiHeader); void dump(ostream&); int iCarouselPeriod, iNumberOfObjects, iSegmentSize; _BOOLEAN bCompressionFlag, bSortedHeaderInformation; map < _BYTE, string > DirectoryIndex; vector < TTransportID > vecObjects; }; /* we define this to reduce the need for copy constructors and operator= since CReassembler has a good set, the defaults will do for this, but not for classes with CVector members */ class CMOTObject:public CMOTObjectBase { public: CMOTObject ():CMOTObjectBase(), vecbRawData(), bComplete(false), bHasHeader(false), Body(), strName(""), iBodySize(0), iCharacterSetForName(0), iCharacterSetForDescription(0), strFormat(""), strMimeType(""), iCompressionType(0), strContentDescription(""), iVersion(0), iUniqueBodyVersion(0), iContentType(0), iContentSubType(0), iPriority(0), iRetransmissionDistance(0), vecbProfileSubset(), ScopeStart(), ScopeEnd(), iScopeId(0), bReady(false) { } CMOTObject (const CMOTObject & nO):CMOTObjectBase (nO), bComplete (nO.bComplete), bHasHeader (nO.bHasHeader), strName (nO.strName), iBodySize(nO.iBodySize), iCharacterSetForName (nO.iCharacterSetForName), iCharacterSetForDescription (nO.iCharacterSetForDescription), strFormat (nO.strFormat), strMimeType (nO.strMimeType), iCompressionType (nO.iCompressionType), strContentDescription (nO.strContentDescription), iVersion (nO.iVersion), iUniqueBodyVersion (nO.iUniqueBodyVersion), iContentType (nO.iContentType), iContentSubType (nO.iContentSubType), iPriority (nO.iPriority), iRetransmissionDistance (nO.iRetransmissionDistance), vecbProfileSubset (nO.vecbProfileSubset), ScopeStart (nO.ScopeStart), ScopeEnd (nO.ScopeEnd), iScopeId (nO.iScopeId) { Body = nO.Body; vecbRawData.Init (nO.vecbRawData.Size ()); vecbRawData = nO.vecbRawData; } virtual ~ CMOTObject () { } inline CMOTObject & operator= (const CMOTObject & nO) { TransportID = nO.TransportID; ExpireTime = nO.ExpireTime; bPermitOutdatedVersions = nO.bPermitOutdatedVersions; bComplete = nO.bComplete; bHasHeader = nO.bHasHeader; strFormat = nO.strFormat; strName = nO.strName; iBodySize = nO.iBodySize; iCharacterSetForName = nO.iCharacterSetForName; iCharacterSetForDescription = nO.iCharacterSetForDescription; strMimeType = nO.strMimeType; iCompressionType = nO.iCompressionType; strContentDescription = nO.strContentDescription; iVersion = nO.iVersion; iUniqueBodyVersion = nO.iUniqueBodyVersion; iContentType = nO.iContentType; iContentSubType = nO.iContentSubType; iPriority = nO.iPriority; iRetransmissionDistance = nO.iRetransmissionDistance; vecbProfileSubset = nO.vecbProfileSubset; ScopeStart = nO.ScopeStart; ScopeEnd = nO.ScopeEnd; iScopeId = nO.iScopeId; Body = nO.Body; vecbRawData.Init (nO.vecbRawData.Size ()); vecbRawData = nO.vecbRawData; return *this; } void Reset () { vecbRawData.Init (0); bComplete = false; bHasHeader = false; Body.Reset (); strFormat = ""; strName = ""; iBodySize = 0; iCharacterSetForName = 0; iCharacterSetForDescription = 0; strMimeType = ""; iCompressionType = 0; strContentDescription = ""; iVersion = 0; iUniqueBodyVersion = 0; iContentType = 0; iContentSubType = 0; iPriority = 0; iRetransmissionDistance = 0; vecbProfileSubset.clear (); ScopeStart.Reset (); ScopeEnd.Reset (); iScopeId = 0; } void dump(ostream&); void AddHeader (CVector < _BINARY > &header); /* for encoding */ CVector < _BYTE > vecbRawData; _BOOLEAN bComplete, bHasHeader; CByteReassembler Body; string strName; int iBodySize; int iCharacterSetForName; int iCharacterSetForDescription; string strFormat; string strMimeType; int iCompressionType; string strContentDescription; int iVersion, iUniqueBodyVersion; int iContentType, iContentSubType; int iPriority; int iRetransmissionDistance; vector < _BYTE > vecbProfileSubset; /* the following for EPG Objects */ CDateAndTime ScopeStart, ScopeEnd; int iScopeId; protected: _BOOLEAN bReady; }; /* Encoder ------------------------------------------------------------------ */ class CMOTDABEnc { public: CMOTDABEnc ():MOTObject(), MOTObjSegments(), iSegmCntHeader(0), iSegmCntBody(0), bCurSegHeader(false), iContIndexHeader(0), iContIndexBody(0) { txTransportID=0; } virtual ~CMOTDABEnc () { } void Reset (); _BOOLEAN GetDataGroup (CVector < _BINARY > &vecbiNewData); void SetMOTObject (CMOTObject & NewMOTObject, int bytesAvailable); // void SetMOTObjectRunIn (CMOTObject & NewMOTObject); _REAL GetProgPerc () const; int iNumSegStore ; void prepareSegmentList(unsigned int repetition=1); // ON4QZ protected: QList segmentList; int segmentListIdx; class CMOTObjSegm { public: CVector < CVector < _BINARY > >vvbiHeader; CVector < CVector < _BINARY > >vvbiBody; }; void GenMOTSegments (CMOTObjSegm & MOTObjSegm); void PartitionUnits (CVector < _BINARY > &vecbiSource, CVector < CVector < _BINARY > >&vecbiDest, const int iPartiSize); // void PartitionUnitsRunIn (CVector < _BINARY > &vecbiSource, // CVector < CVector < _BINARY > >&vecbiDest, // const int iPartiSize); void GenMOTObj (CVector < _BINARY > &vecbiData, CVector < _BINARY > &vecbiSeg, const _BOOLEAN bHeader, const int iSegNum, const int iTranspID, const _BOOLEAN bLastSeg); CMOTObject MOTObject; CMOTObjSegm MOTObjSegments; int iSegmCntHeader; int iSegmCntBody; int runInCnt; _BOOLEAN bCurSegHeader; int iContIndexHeader; int iContIndexBody; _BOOLEAN bFirstRound; }; /* Decoder ------------------------------------------------------------------ */ class CMOTDABDec { public: CMOTDABDec ():MOTmode (unknown), MOTHeaders(), MOTDirectoryEntity(), MOTDirComprEntity(), MOTDirectory(), MOTCarousel(), qiNewObjects() { } virtual ~ CMOTDABDec () { } /* client methods */ void GetNextObject (CMOTObject & NewMOTObject); void GetObject (CMOTObject & NewMOTObject, TTransportID TransportID) { NewMOTObject = MOTCarousel[TransportID]; } void GetDirectory (CMOTDirectory & MOTDirectoryOut) { MOTDirectoryOut = MOTDirectory; } _BOOLEAN NewObjectAvailable (); /* push from lower level */ void AddDataUnit (CVector < _BINARY > &vecbiNewData); protected: void ProcessDirectory (CBitReassembler &MOTDir); void DeliverIfReady (TTransportID TransportID); /* These fields are the in-progress carousel objects */ enum { unknown, headerMode, directoryMode } MOTmode; /* strictly, there should be only one of these! */ map < TTransportID, CBitReassembler > MOTHeaders; CBitReassembler MOTDirectoryEntity; CBitReassembler MOTDirComprEntity; /* These fields are the cached complete carousel */ CMOTDirectory MOTDirectory; map < TTransportID, CMOTObject > MOTCarousel; queue < TTransportID > qiNewObjects; }; #endif // !defined(DABMOT_H__3B0UBVE98732KJVEW363E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/datadecoding/DataDecoder.cpp0000664000175000017500000001315313203343610022507 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer, Julian Cable * * Description: * Data module (using multimedia information carried in DRM stream) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "DataDecoder.h" #include /* Implementation *************************************************************/ /******************************************************************************\ * Encoder * \******************************************************************************/ void CDataEncoder::GeneratePacket(CVector < _BINARY > &vecbiPacket) { int i; _BOOLEAN bLastFlag; /* Init size for whole packet, not only body */ vecbiPacket.Init(iTotalPacketSize); vecbiPacket.ResetBitAccess(); /* Calculate remaining data size to be transmitted */ const int iRemainSize = vecbiCurDataUnit.Size() - iCurDataPointer; /* Header --------------------------------------------------------------- */ /* First flag */ if (iCurDataPointer == 0) vecbiPacket.Enqueue((uint32_t) 1, 1); else vecbiPacket.Enqueue((uint32_t) 0, 1); /* Last flag */ if (iRemainSize > iPacketLen) { vecbiPacket.Enqueue((uint32_t) 0, 1); bLastFlag = false; } else { vecbiPacket.Enqueue((uint32_t) 1, 1); bLastFlag = true; } /* Packet Id */ vecbiPacket.Enqueue((uint32_t) iPacketID, 2); /* Padded packet indicator (PPI) */ if (iRemainSize < iPacketLen) vecbiPacket.Enqueue((uint32_t) 1, 1); else vecbiPacket.Enqueue((uint32_t) 0, 1); /* Continuity index (CI) */ vecbiPacket.Enqueue((uint32_t) iContinInd, 3); /* Increment index modulo 8 (1 << 3) */ iContinInd++; if (iContinInd == 8) iContinInd = 0; /* Body ----------------------------------------------------------------- */ if (iRemainSize >= iPacketLen) { if (iRemainSize == iPacketLen) { /* Last packet */ for (i = 0; i < iPacketLen; i++) vecbiPacket.Enqueue(vecbiCurDataUnit.Separate(1), 1); } else { for (i = 0; i < iPacketLen; i++) { vecbiPacket.Enqueue(vecbiCurDataUnit.Separate(1), 1); iCurDataPointer++; } } } else { /* Padded packet. If the PPI is 1 then the first byte shall indicate the number of useful bytes that follow, and the data field is completed with padding bytes of value 0x00 */ vecbiPacket.Enqueue((uint32_t) (iRemainSize / SIZEOF__BYTE), SIZEOF__BYTE); /* Data */ for (i = 0; i < iRemainSize; i++) vecbiPacket.Enqueue(vecbiCurDataUnit.Separate(1), 1); /* Padding */ for (i = 0; i < iPacketLen - iRemainSize; i++) vecbiPacket.Enqueue(vecbiCurDataUnit.Separate(1), 1); } /* If this was the last packet, get data for next data unit */ if (bLastFlag == true) { /* Generate new data unit */ MOTSlideShowEncoder.GetDataUnit(vecbiCurDataUnit); vecbiCurDataUnit.ResetBitAccess(); /* Reset data pointer and continuity index */ iCurDataPointer = 0; } /* CRC ------------------------------------------------------------------ */ CCRC CRCObject; /* Reset bit access */ vecbiPacket.ResetBitAccess(); /* Calculate the CRC and put it at the end of the segment */ CRCObject.Reset(16); /* "byLengthBody" was defined in the header */ for (i = 0; i < (iTotalPacketSize / SIZEOF__BYTE - 2); i++) CRCObject.AddByte(_BYTE(vecbiPacket.Separate(SIZEOF__BYTE))); // printf("adding crc16 to packet iTotalPacketSize is %d\n", iTotalPacketSize); /* Now, pointer in "enqueue"-function is back at the same place, add CRC */ vecbiPacket.Enqueue(CRCObject.GetCRC(), 16); } int CDataEncoder::Init(CParameter & Param) { /* Init packet length and total packet size (the total packet length is three bytes longer as it includes the header and CRC fields) */ // TODO we only use always the first service right now const int iCurSelDataServ = 0; Param.Lock(); // was in werkende afgecommentaard pa0mbo // printf("In CDataEncoder na Param.Lock \n"); iPacketLen = Param.Service[iCurSelDataServ].DataParam.iPacketLen * SIZEOF__BYTE; iTotalPacketSize = iPacketLen + 24 /* CRC + header = 24 bits */ ; iPacketID = Param.Service[iCurSelDataServ].DataParam.iPacketID; Param.Unlock(); // was in werkende afgecommentaard pa0mbo /* printf("in CDataEncoder::Init iPackectLen = %d iTotalPacketSize = %d packetID = %d\n", iPacketLen, iTotalPacketSize, iPacketID ); */ /* Init DAB MOT encoder object */ MOTSlideShowEncoder.Init(Param); /* Generate first data unit */ MOTSlideShowEncoder.GetDataUnit(vecbiCurDataUnit); vecbiCurDataUnit.ResetBitAccess(); /* Reset pointer to current position in data unit and continuity index */ iCurDataPointer = 0; iContinInd = 0; /* Return total packet size */ return iTotalPacketSize; } qsstv_9.2.6/qsstv/drmtx/common/datadecoding/DataDecoder.h0000664000175000017500000000452413203343610022156 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See DataDecoder.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DATADECODER_H__3B0BA660_CA3452363E7A0D31912__INCLUDED_) #define DATADECODER_H__3B0BA660_CA3452363E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../Parameter.h" #include "../util/Modul.h" #include "../util/CRC.h" #include "utils/vector.h" #include "DABMOT.h" #include "MOTSlideShow.h" class CJournaline; class CNews; /* Definitions ****************************************************************/ /* Maximum number of packets per stream */ #define MAX_NUM_PACK_PER_STREAM 4 /* Classes ********************************************************************/ /* Encoder ------------------------------------------------------------------ */ class CDataEncoder { public: CDataEncoder () { } virtual ~ CDataEncoder () { } int Init (CParameter & Param); void GeneratePacket(CVector < _BINARY > &vecbiPacket); CMOTSlideShowEncoder *GetSliShowEnc () { return &MOTSlideShowEncoder; } protected: CMOTSlideShowEncoder MOTSlideShowEncoder; CVector < _BINARY > vecbiCurDataUnit; int iPacketLen; int iTotalPacketSize; int iCurDataPointer; int iPacketID; int iContinInd; }; #endif // !defined(DATADECODER_H__3B0BA660_CA3452363E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/datadecoding/MOTSlideShow.cpp0000664000175000017500000001110613203343610022625 0ustar jomajoma /******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * MOT applications (MOT Slideshow and Broadcast Web Site) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "MOTSlideShow.h" #include #include #include "drm.h" #include "drmtransmitter.h" //#include"utils/supportfunctions.h" /* Implementation *************************************************************/ /******************************************************************************\ * Encoder * \******************************************************************************/ void CMOTSlideShowEncoder::GetDataUnit (CVector < _BINARY > &vecbiNewData) { if (allDataSend) { if(extraBlocks-- <=0) stopDRM=true; } /* Get new data group from MOT encoder. If the last MOT object was completely transmitted, this functions returns true. In this case, put a new picture to the MOT encoder object */ if (MOTDAB.GetDataGroup (vecbiNewData) == true) { allDataSend=true; AddNextPicture (); //basically the same // addToLog("loading raw data",LOGDRMMOT); } // arrayBinDump(QString("slice %1").arg(sliceCounter++),vecbiNewData,32,true); } _BOOLEAN CMOTSlideShowEncoder::GetTransStat (string & strCurPict, _REAL & rCurPerc) const { /* Name and current percentage of transmitted data of current picture. */ strCurPict = strCurObjName; rCurPerc = MOTDAB.GetProgPerc (); if (vecPicFileNames.Size () != 0) return true; else return false; } void CMOTSlideShowEncoder::Init (CParameter &TParam) { bytesToBeUsed=(TParam.iNumDecodedBitsMSC/SIZEOF__BYTE); iPictureCnt = 0; strCurObjName = ""; MOTDAB.Reset (); AddNextPicture (); allDataSend=false; extraBlocks=5; sliceCounter=0; MOTDAB.prepareSegmentList(1); // one repitition addToLog("Init and loading raw data",LOGDRMMOT); } void CMOTSlideShowEncoder::AddNextPicture () { int i; unsigned char byteIn; /* Here at least one picture is in container */ if (vecPicFileNames.Size () > 0) { /* Get current file name */ QString tmp=vecPicFileNames[iPictureCnt].name+"."+vecPicFileNames[iPictureCnt].format; strCurObjName = tmp.toLatin1().data(); CMOTObject MOTPicture; /* Set file name and format string */ MOTPicture.strName = strCurObjName; MOTPicture.strFormat = vecPicFileNames[iPictureCnt].format.toLatin1().data(); MOTPicture.vecbRawData.Init (0); for(i=0;icount();i++) { byteIn=vecPicFileNames[iPictureCnt].arrayPtr->at(i); // byteIn=0; /* Add one byte = SIZEOF__BYTE bits */ MOTPicture.vecbRawData.Enlarge (SIZEOF__BYTE); MOTPicture.vecbRawData.Enqueue ((uint32_t)byteIn,SIZEOF__BYTE); } MOTDAB.SetMOTObject (MOTPicture,bytesToBeUsed); /* Set file counter to next picture, test for wrap around */ iPictureCnt++; if (iPictureCnt == vecPicFileNames.Size ()) iPictureCnt = 0; } } void CMOTSlideShowEncoder::AddArray (QByteArray *ba,const QString name,const QString format) { /* Only ContentSubType "JFIF" (JPEG) and ContentSubType "PNG" are allowed for SlideShow application (not tested here!) */ /* Add file name to the list */ int iOldNumObj = vecPicFileNames.Size (); vecPicFileNames.Enlarge (1); vecPicFileNames[iOldNumObj].arrayPtr = ba; vecPicFileNames[iOldNumObj].name=name.toLatin1(); vecPicFileNames[iOldNumObj].format=format; } qsstv_9.2.6/qsstv/drmtx/common/datadecoding/MOTSlideShow.h0000664000175000017500000000445213203343610022300 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(MOTSLIDESHOW_H__3B0UBVE98732KJVEW363LIHGEW982__INCLUDED_) #define MOTSLIDESHOW_H__3B0UBVE98732KJVEW363LIHGEW982__INCLUDED_ #include "../GlobalDefinitions.h" #include "utils/vector.h" #include "DABMOT.h" #include "../Parameter.h" /* Classes ********************************************************************/ /* Encoder ------------------------------------------------------------------ */ class CMOTSlideShowEncoder { public: CMOTSlideShowEncoder ():vecPicFileNames (0) {strCurObjName="";} virtual ~ CMOTSlideShowEncoder () {} void Init (CParameter &TParam); void GetDataUnit(CVector < _BINARY > &vecbiNewData); void AddArray (QByteArray *ba, const QString name, const QString format); void ClearAllFileNames () {vecPicFileNames.Init (0);} _BOOLEAN GetTransStat (string & strCurPict, _REAL & rCurPerc) const; protected: struct SPicDescr { QByteArray *arrayPtr; QString name; QString format; }; void AddNextPicture (); CMOTDABEnc MOTDAB; CVector < SPicDescr > vecPicFileNames; int iPictureCnt; string strCurObjName; bool allDataSend; int extraBlocks; int sliceCounter; int bytesToBeUsed; }; #endif // !defined(MOTSLIDESHOW_H__3B0UBVE98732KJVEW363LIHGEW982__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/interleaver/BlockInterleaver.cpp0000664000175000017500000000457013203343610023520 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "BlockInterleaver.h" /* Implementation *************************************************************/ /******************************************************************************\ * Block-interleaver base class * \******************************************************************************/ void CBlockInterleaver::MakeTable(CVector& veciIntTable, int iFrameSize, int it_0) { int i; int iHighestOne; int is, iq; /* The following equations are taken directly from the DRM-standard paper (7.3.3 and 7.6) */ iHighestOne = iFrameSize; /* s = 2 ^ ceil(log2(iFrameSize)), means: find the highest "1" of iFrameSize. The result of the equation is only one "1" at position "highest position of "1" in iFrameSize plus one". Therefore: "1 << (16 + 1)". This implementation: shift bits in iHighestOne to the left until a "1" reaches position 16. Simultaneously the bit in "is" is right-shifted */ is = 1 << (16 + 1); while (!(iHighestOne & (1 << 16))) { iHighestOne <<= 1; is >>= 1; } iq = is / 4 - 1; veciIntTable[0] = 0; for (i = 1; i < iFrameSize; i++) { veciIntTable[i] = (it_0 * veciIntTable[i - 1] + iq) % is; while (veciIntTable[i] >= iFrameSize) veciIntTable[i] = (it_0 * veciIntTable[i] + iq) % is; } } qsstv_9.2.6/qsstv/drmtx/common/interleaver/BlockInterleaver.h0000664000175000017500000000324213203343610023160 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See Blockinterleaver.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(BLOCK_INTERL_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define BLOCK_INTERL_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "utils/vector.h" /* Classes ********************************************************************/ class CBlockInterleaver { public: CBlockInterleaver() {} virtual ~CBlockInterleaver() {} protected: void MakeTable(CVector& veciIntTable, int iFrameSize, int it_0); }; #endif // !defined(BLOCK_INTERL_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/interleaver/SymbolInterleaver.cpp0000664000175000017500000000714313203343610023732 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * Symbol interleaver for MSC-symbols * We have to support long and short symbol interleaving. Long interleaving * spans over iD times iN_MUX interleaver blocks. To create a "block-wise * cycle-buffer" we shift the indices (stored in a table) each time a complete * block was written. Thus, we dont need to copy data since we only modify * the indices. * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "SymbolInterleaver.h" /* Implementation *************************************************************/ /******************************************************************************\ * Symbol interleaver * \******************************************************************************/ void CSymbInterleaver::ProcessDataInternal(CParameter&) { int i, j; /* Write data in interleaver-memory (always index "0") */ for (i = 0; i < iInputBlockSize; i++) matcInterlMemory[veciCurIndex[0]][i] = (*pvecInputData)[i]; /* Interleave data according to the interleaver table. Use the the interleaver-blocks described in the DRM-standard (Ro(i) = i (mod D) -> "i % iD") */ for (i = 0; i < iInputBlockSize; i++) (*pvecOutputData)[i] = matcInterlMemory[veciCurIndex[i % iD]][veciIntTable[i]]; /* Set new indices. Move blocks (virtually) forward */ for (j = 0; j < iD; j++) { veciCurIndex[j]--; if (veciCurIndex[j] < 0) veciCurIndex[j] = iD - 1; } } void CSymbInterleaver::InitInternal(CParameter& TransmParam) { int i; TransmParam.Lock(); /* Set internal parameters */ iN_MUX = TransmParam.CellMappingTable.iNumUsefMSCCellsPerFrame; /* Allocate memory for table */ veciIntTable.Init(iN_MUX); /* Make interleaver table */ MakeTable(veciIntTable, iN_MUX, SYMB_INTERL_CONST_T_0); /* Set interleaver depth */ switch (TransmParam.eSymbolInterlMode) { case CParameter::SI_LONG: iD = D_LENGTH_LONG_INTERL; break; case CParameter::SI_SHORT: iD = D_LENGTH_SHORT_INTERL; break; } /* Always allocate memory for long interleaver case (interleaver memory) */ matcInterlMemory.Init(D_LENGTH_LONG_INTERL, iN_MUX); /* Index for addressing the buffers */ veciCurIndex.Init(D_LENGTH_LONG_INTERL); for (i = 0; i < D_LENGTH_LONG_INTERL; i++) veciCurIndex[i] = i; /* Define block-sizes for input and output */ iInputBlockSize = iN_MUX; iOutputBlockSize = iN_MUX; /* Since the MSC logical frames must not end at the end of one symbol (could be somewhere in the middle of the symbol), the output buffer must accept more cells than one logical MSC frame is long */ iMaxOutputBlockSize = 2 * iN_MUX; TransmParam.Unlock(); } qsstv_9.2.6/qsstv/drmtx/common/interleaver/SymbolInterleaver.h0000664000175000017500000000433313203343610023375 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See SymbolInterleaver.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(CONVINTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define CONVINTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../Parameter.h" #include "../util/Modul.h" #include "BlockInterleaver.h" /* Definitions ****************************************************************/ #define D_LENGTH_SHORT_INTERL 1 #define D_LENGTH_LONG_INTERL 5 /* This constant is defined in DRM-standard for MSC Cell Interleaving */ #define SYMB_INTERL_CONST_T_0 5 /* Classes ********************************************************************/ class CSymbInterleaver : public CTransmitterModul<_COMPLEX, _COMPLEX>, public CBlockInterleaver { public: CSymbInterleaver() {} virtual ~CSymbInterleaver() {} protected: int iN_MUX; CMatrix<_COMPLEX> matcInterlMemory; CVector veciCurIndex; CVector veciIntTable; int iD; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; #endif // !defined(CONVINTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/matlib/Matlib.h0000664000175000017500000006470013203343610020073 0ustar jomajoma/******************************************************************************\ * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * c++ Mathematic Library (Matlib) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #ifndef _MATLIB_H_ #define _MATLIB_H_ #include #include #include using namespace std; #include "../GlobalDefinitions.h" /* Definitions ****************************************************************/ /* Two different types: constant and temporary buffer */ enum EVecTy {VTY_CONST, VTY_TEMP}; /* These definitions save a lot of redundant code */ #define _VECOP(TYPE, LENGTH, FCT) const int iL = LENGTH; \ CMatlibVector vecRet(iL, VTY_TEMP); \ for (int i = 0; i < iL; i++) \ vecRet[i] = FCT; \ return vecRet #define _VECOPCL(FCT) for (int i = 0; i < iVectorLength; i++) \ operator[](i) FCT; \ return *this #define _MATOP(TYPE, LENGTHROW, LENGTHCOL, FCT) \ const int iRL = LENGTHROW; \ CMatlibMatrix matRet(iRL, LENGTHCOL, VTY_TEMP); \ for (int i = 0; i < iRL; i++) \ matRet[i] = FCT; \ return matRet #define _MATOPCL(FCT) for (int i = 0; i < iRowSize; i++) \ operator[](i) FCT; \ return *this /* In debug mode, test input parameters */ #ifdef _DEBUG_ #define _TESTRNGR(POS) if ((POS >= iVectorLength) || (POS < 0)) \ DebugError("MatLibrRead", "POS", POS, \ "iVectorLength", iVectorLength) #define _TESTRNGW(POS) if ((POS >= iVectorLength) || (POS < 0)) \ DebugError("MatLibrWrite", "POS", POS, \ "iVectorLength", iVectorLength) #define _TESTSIZE(INP) if (INP != iVectorLength) \ DebugError("SizeCheck", "INP", INP, \ "iVectorLength", iVectorLength) #define _TESTRNGRM(POS) if ((POS >= iRowSize) || (POS < 0)) \ DebugError("MatLibrReadMatrix", "POS", POS, \ "iRowSize", iRowSize) #define _TESTRNGWM(POS) if ((POS >= iRowSize) || (POS < 0)) \ DebugError("MatLibrWriteMatrix", "POS", POS, \ "iRowSize", iRowSize) #define _TESTSIZEM(INP) if (INP != iRowSize) \ DebugError("MatLibOperatorMatrix=()", "INP", INP, \ "iRowSize", iRowSize) #else // On Visual c++ 2005 Express Edition there is a segmentation fault if these macros are empty // TODO: FIX this with a better solution #ifdef _MSC_VER #define _TESTRNGR(POS) if (POS != POS) int idummy=0 #define _TESTRNGW(POS) if (POS != POS) int idummy=0 #define _TESTSIZE(INP) if (INP != INP) int idummy=0 #define _TESTRNGRM(POS) if (POS != POS) int idummy=0 #define _TESTRNGWM(POS) if (POS != POS) int idummy=0 #define _TESTSIZEM(INP) if (INP != INP) int idummy=0 #else #define _TESTRNGR(POS) #define _TESTRNGW(POS) #define _TESTSIZE(INP) #define _TESTRNGRM(POS) #define _TESTRNGWM(POS) #define _TESTSIZEM(INP) #endif #endif /* Classes ********************************************************************/ /* Prototypes */ template class CMatlibVector; template class CMatlibMatrix; /* Here we can choose the precision of the Matlib calculations */ typedef _REAL CReal; typedef complex CComplex; typedef CMatlibVector CRealVector; typedef CMatlibVector CComplexVector; typedef CMatlibMatrix CRealMatrix; typedef CMatlibMatrix CComplexMatrix; /******************************************************************************/ /* CMatlibVector class ********************************************************/ /******************************************************************************/ template class CMatlibVector { public: /* Construction, Destruction -------------------------------------------- */ CMatlibVector() : eVType(VTY_CONST), iVectorLength(0), pData(NULL) {} CMatlibVector(const int iNLen, const EVecTy eNTy = VTY_CONST) : eVType(eNTy), iVectorLength(0), pData(NULL) {Init(iNLen);} CMatlibVector(const int iNLen, const T tIniVal) : eVType(VTY_CONST), iVectorLength(0), pData(NULL) {Init(iNLen, tIniVal);} CMatlibVector(CMatlibVector& vecI); CMatlibVector(const CMatlibVector& vecI); virtual ~CMatlibVector() {if (pData != NULL) delete[] pData;} CMatlibVector(const CMatlibVector& fvReal, const CMatlibVector& fvImag) : eVType(VTY_CONST/*VTY_TEMP*/), iVectorLength(fvReal.GetSize()), pData(NULL) { /* Allocate data block for vector */ pData = new CComplex[iVectorLength]; /* Copy data from real-vectors in complex vector */ for (int i = 0; i < iVectorLength; i++) pData[i] = CComplex(fvReal[i], fvImag[i]); } /* Operator[] (Regular indices!!!) */ inline T& operator[](int const iPos) const {_TESTRNGR(iPos); return pData[iPos];} inline T& operator[](int const iPos) {_TESTRNGW(iPos); return pData[iPos];} // For use as l value /* Operator() */ inline T& operator()(int const iPos) const {_TESTRNGR(iPos - 1); return pData[iPos - 1];} inline T& operator()(int const iPos) {_TESTRNGW(iPos - 1); return pData[iPos - 1];} // For use as l value CMatlibVector operator()(const int iFrom, const int iTo) const; CMatlibVector operator()(const int iFrom, const int iStep, const int iTo) const; inline int GetSize() const {return iVectorLength;} void Init(const int iIniLen, const T tIniVal = 0); inline CMatlibVector& Reset(const T tResVal = 0) {_VECOPCL(= tResVal);} CMatlibVector& PutIn(const int iFrom, const int iTo, CMatlibVector& fvA); CMatlibVector& Merge(const CMatlibVector& vecA, T& tB); CMatlibVector& Merge(const CMatlibVector& vecA, const CMatlibVector& vecB); CMatlibVector& Merge(const CMatlibVector& vecA, const CMatlibVector& vecB, const CMatlibVector& vecC); /* operator= */ inline CMatlibVector& operator=(const CMatlibVector& vecI) { Init(vecI.GetSize()); for (int i = 0; i < iVectorLength; i++) operator[](i) = vecI[i]; return *this; } inline CMatlibVector& operator=(const CMatlibVector& vecI) { Init(vecI.GetSize()); for (int i = 0; i < iVectorLength; i++) operator[](i) = vecI[i]; return *this; } /* operator*= */ inline CMatlibVector& operator*=(const CReal& rI) {_VECOPCL(*= rI);} inline CMatlibVector& operator*=(const CComplex& cI) {_VECOPCL(*= cI);} inline CMatlibVector& operator*=(const CMatlibVector& vecI) {_VECOPCL(*= vecI[i]);} inline CMatlibVector& operator*=(const CMatlibVector& vecI) {_VECOPCL(*= vecI[i]);} /* operator/= */ inline CMatlibVector& operator/=(const CReal& rI) {_VECOPCL(/= rI);} inline CMatlibVector& operator/=(const CComplex& cI) {_VECOPCL(/= cI);} inline CMatlibVector& operator/=(const CMatlibVector& vecI) {_VECOPCL(/= vecI[i]);} inline CMatlibVector& operator/=(const CMatlibVector& vecI) {_VECOPCL(/= vecI[i]);} /* operator+= */ inline CMatlibVector& operator+=(const CReal& rI) {_VECOPCL(+= rI);} inline CMatlibVector& operator+=(const CComplex& cI) {_VECOPCL(+= cI);} inline CMatlibVector& operator+=(const CMatlibVector& vecI) {_VECOPCL(+= vecI[i]);} inline CMatlibVector& operator+=(const CMatlibVector& vecI) {_VECOPCL(+= vecI[i]);} /* operator-= */ inline CMatlibVector& operator-=(const CReal& rI) {_VECOPCL(-= rI);} inline CMatlibVector& operator-=(const CComplex& cI) {_VECOPCL(-= cI);} inline CMatlibVector& operator-=(const CMatlibVector& vecI) {_VECOPCL(-= vecI[i]);} inline CMatlibVector& operator-=(const CMatlibVector& vecI) {_VECOPCL(-= vecI[i]);} protected: EVecTy eVType; int iVectorLength; T* pData; }; /* operator* ---------------------------------------------------------------- */ inline CMatlibVector // cv, cv operator*(const CMatlibVector& cvA, const CMatlibVector& cvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] * cvB[i]);} inline CMatlibVector // rv, rv operator*(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), rvA[i] * rvB[i]);} inline CMatlibVector // cv, rv operator*(const CMatlibVector& cvA, const CMatlibVector& rvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] * rvB[i]);} inline CMatlibVector // rv, cv operator*(const CMatlibVector& rvB, const CMatlibVector& cvA) {_VECOP(CComplex, cvA.GetSize(), cvA[i] * rvB[i]);} template inline CMatlibVector // Tv, r operator*(const CMatlibVector& vecA, const CReal& rB) {_VECOP(T, vecA.GetSize(), vecA[i] * rB);} template inline CMatlibVector // r, Tv operator*(const CReal& rA, const CMatlibVector& vecB) {_VECOP(T, vecB.GetSize(), rA * vecB[i]);} template inline CMatlibVector // Tv, c operator*(const CMatlibVector& vecA, const CComplex& cB) {_VECOP(CComplex, vecA.GetSize(), vecA[i] * cB);} template inline CMatlibVector // c, Tv operator*(const CComplex& cA, const CMatlibVector& vecB) {_VECOP(CComplex, vecB.GetSize(), cA * vecB[i]);} /* operator/ ---------------------------------------------------------------- */ inline CMatlibVector // cv, cv operator/(const CMatlibVector& cvA, const CMatlibVector& cvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] / cvB[i]);} inline CMatlibVector // rv, rv operator/(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), rvA[i] / rvB[i]);} inline CMatlibVector // cv, rv operator/(const CMatlibVector& cvA, const CMatlibVector& rvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] / rvB[i]);} inline CMatlibVector // rv, cv operator/(const CMatlibVector& rvA, const CMatlibVector& cvB) {_VECOP(CComplex, rvA.GetSize(), rvA[i] / cvB[i]);} template inline CMatlibVector // Tv, r operator/(const CMatlibVector& vecA, const CReal& rB) {_VECOP(T, vecA.GetSize(), vecA[i] / rB);} template inline CMatlibVector // r, Tv operator/(const CReal& rA, const CMatlibVector& vecB) {_VECOP(T, vecB.GetSize(), rA / vecB[i]);} template inline CMatlibVector // Tv, c operator/(const CMatlibVector& vecA, const CComplex& cB) {_VECOP(CComplex, vecA.GetSize(), vecA[i] / cB);} template inline CMatlibVector // c, Tv operator/(const CComplex& cA, const CMatlibVector& vecB) {_VECOP(CComplex, vecB.GetSize(), cA / vecB[i]);} /* operator+ ---------------------------------------------------------------- */ inline CMatlibVector // cv, cv operator+(const CMatlibVector& cvA, const CMatlibVector& cvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] + cvB[i]);} inline CMatlibVector // rv, rv operator+(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), rvA[i] + rvB[i]);} inline CMatlibVector // cv, rv operator+(const CMatlibVector& cvA, const CMatlibVector& rvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] + rvB[i]);} inline CMatlibVector // rv, cv operator+(const CMatlibVector& rvA, const CMatlibVector& cvB) {_VECOP(CComplex, rvA.GetSize(), rvA[i] + cvB[i]);} template inline CMatlibVector // Tv, r operator+(const CMatlibVector& vecA, const CReal& rB) {_VECOP(T, vecA.GetSize(), vecA[i] + rB);} template inline CMatlibVector // r, Tv operator+(const CReal& rA, const CMatlibVector& vecB) {_VECOP(T, vecB.GetSize(), rA + vecB[i]);} template inline CMatlibVector // Tv, c operator+(const CMatlibVector& vecA, const CComplex& cB) {_VECOP(CComplex, vecA.GetSize(), vecA[i] + cB);} template inline CMatlibVector // c, Tv operator+(const CComplex& cA, const CMatlibVector& vecB) {_VECOP(CComplex, vecB.GetSize(), cA + vecB[i]);} /* operator- ---------------------------------------------------------------- */ inline CMatlibVector // cv, cv operator-(const CMatlibVector& cvA, const CMatlibVector& cvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] - cvB[i]);} inline CMatlibVector // rv, rv operator-(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), rvA[i] - rvB[i]);} inline CMatlibVector // cv, rv operator-(const CMatlibVector& cvA, const CMatlibVector& rvB) {_VECOP(CComplex, cvA.GetSize(), cvA[i] - rvB[i]);} inline CMatlibVector // rv, cv operator-(const CMatlibVector& rvA, const CMatlibVector& cvB) {_VECOP(CComplex, rvA.GetSize(), rvA[i] - cvB[i]);} template inline CMatlibVector // Tv, r operator-(const CMatlibVector& vecA, const CReal& rB) {_VECOP(T, vecA.GetSize(), vecA[i] - rB);} template inline CMatlibVector // r, Tv operator-(const CReal& rA, const CMatlibVector& vecB) {_VECOP(T, vecB.GetSize(), rA - vecB[i]);} template inline CMatlibVector // Tv, c operator-(const CMatlibVector& vecA, const CComplex& cB) {_VECOP(CComplex, vecA.GetSize(), vecA[i] - cB);} template inline CMatlibVector // c, Tv operator-(const CComplex& cA, const CMatlibVector& vecB) {_VECOP(CComplex, vecB.GetSize(), cA - vecB[i]);} /* Implementation ************************************************************** (the implementation of template classes must be in the header file!) */ template CMatlibVector::CMatlibVector(CMatlibVector& vecI) : eVType(VTY_CONST/*VTY_TEMP*/), iVectorLength(vecI.GetSize()), pData(NULL) { /* The copy constructor for the constant vector is a real copying task. But in the case of a temporary buffer only the pointer of the temporary buffer is used. The buffer of the temporary vector is then destroyed!!! Therefore the usage of "VTY_TEMP" should be done if the vector IS NOT USED IN A FUNCTION CALL, otherwise this vector will be destroyed afterwards (if the function argument is not declared with "&") */ if (iVectorLength > 0) { if (vecI.eVType == VTY_CONST) { /* Allocate data block for vector */ pData = new T[iVectorLength]; /* Copy vector */ for (int i = 0; i < iVectorLength; i++) pData[i] = vecI[i]; } else { /* We can define the copy constructor as a destroying operator of the input vector for performance reasons. This saves us from always copy the entire vector */ /* Take data pointer from input vector (steal it) */ pData = vecI.pData; /* Destroy other vector (temporary vectors only) */ vecI.pData = NULL; } } } /* Copy constructor for constant Matlib vectors */ template CMatlibVector::CMatlibVector(const CMatlibVector& vecI) : eVType(VTY_CONST), iVectorLength(vecI.GetSize()), pData(NULL) { if (iVectorLength > 0) { /* Allocate data block for vector */ pData = new T[iVectorLength]; /* Copy vector */ for (int i = 0; i < iVectorLength; i++) pData[i] = vecI[i]; } } template void CMatlibVector::Init(const int iIniLen, const T tIniVal) { iVectorLength = iIniLen; /* Allocate data block for vector */ if (iVectorLength > 0) { if (pData != NULL) delete[] pData; pData = new T[iVectorLength]; /* Init with init value */ for (int i = 0; i < iVectorLength; i++) pData[i] = tIniVal; } } template inline CMatlibVector CMatlibVector::operator()(const int iFrom, const int iTo) const { /* This is also capable of "wrap around" blocks (if the value in "iFrom" is larger then the "iTo" value) */ int i; const int iStartVal = iFrom - 1; if (iFrom > iTo) { /* Wrap around case */ CMatlibVector vecRet(iVectorLength - iStartVal + iTo, VTY_TEMP); int iCurPos = 0; for (i = iStartVal; i < iVectorLength; i++) vecRet[iCurPos++] = operator[](i); for (i = 0; i < iTo; i++) vecRet[iCurPos++] = operator[](i); return vecRet; } else { CMatlibVector vecRet(iTo - iStartVal, VTY_TEMP); for (i = iStartVal; i < iTo; i++) vecRet[i - iStartVal] = operator[](i); return vecRet; } } template inline CMatlibVector CMatlibVector::operator()(const int iFrom, const int iStep, const int iTo) const { CMatlibVector vecRet(size_t(abs(float(iTo - iFrom)) / abs(float(iStep))) + 1, VTY_TEMP); int iOutPos = 0; int i; if (iFrom > iTo) { const int iEnd = iTo - 2; for (i = iFrom - 1; i > iEnd; i += iStep) { vecRet[iOutPos] = operator[](i); iOutPos++; } } else { for (i = iFrom - 1; i < iTo; i += iStep) { vecRet[iOutPos] = operator[](i); iOutPos++; } } return vecRet; } template inline CMatlibVector& CMatlibVector::PutIn(const int iFrom, const int iTo, CMatlibVector& vecI) { const int iStart = iFrom - 1; const int iEnd = iTo - iStart; for (int i = 0; i < iEnd; i++) operator[](i + iStart) = vecI[i]; return *this; } template inline CMatlibVector& CMatlibVector::Merge(const CMatlibVector& vecA, T& tB) { const int iSizeA = vecA.GetSize(); for (int i = 0; i < iSizeA; i++) operator[](i) = vecA[i]; operator[](iSizeA) = tB; return *this; } template inline CMatlibVector& CMatlibVector::Merge(const CMatlibVector& vecA, const CMatlibVector& vecB) { int i; const int iSizeA = vecA.GetSize(); const int iSizeB = vecB.GetSize(); /* Put first vector */ for (i = 0; i < iSizeA; i++) operator[](i) = vecA[i]; /* Put second vector behind the first one, both together must have length of *this */ for (i = 0; i < iSizeB; i++) operator[](i + iSizeA) = vecB[i]; return *this; } template inline CMatlibVector& CMatlibVector::Merge(const CMatlibVector& vecA, const CMatlibVector& vecB, const CMatlibVector& vecC) { int i; const int iSizeA = vecA.GetSize(); const int iSizeB = vecB.GetSize(); const int iSizeC = vecC.GetSize(); const int iSizeAB = iSizeA + iSizeB; /* Put first vector */ for (i = 0; i < iSizeA; i++) operator[](i) = vecA[i]; /* Put second vector behind the first one */ for (i = 0; i < iSizeB; i++) operator[](i + iSizeA) = vecB[i]; /* Put third vector behind previous put vectors */ for (i = 0; i < iSizeC; i++) operator[](i + iSizeAB) = vecC[i]; return *this; } /******************************************************************************/ /* CMatlibMatrix class ********************************************************/ /******************************************************************************/ /* We define: Matrix[row][column] */ template class CMatlibMatrix { public: /* Construction, Destruction -------------------------------------------- */ CMatlibMatrix() : eVType(VTY_CONST), iRowSize(0), ppData(NULL) {} CMatlibMatrix(const int iNRowLen, const int iNColLen, const EVecTy eNTy = VTY_CONST) : eVType(eNTy), iRowSize(0), ppData(NULL) {Init(iNRowLen, iNColLen);} CMatlibMatrix(const int iNRowLen, const int iNColLen, const T tIniVal) : eVType(VTY_CONST), iRowSize(0), ppData(NULL) {Init(iNRowLen, iNColLen, tIniVal);} CMatlibMatrix(const CMatlibMatrix& matI); virtual ~CMatlibMatrix() {if (ppData != NULL) delete[] ppData;} void Init(const int iNRowLen, const int iNColLen, const T tIniVal = 0); inline int GetRowSize() const {return iRowSize;} inline int GetColSize() const {if (iRowSize > 0) return ppData[0].GetSize(); else return 0;} /* Operator[] (Regular indices!!!) */ inline CMatlibVector& operator[](int const iPos) const {_TESTRNGRM(iPos); return ppData[iPos];} inline CMatlibVector& operator[](int const iPos) {_TESTRNGWM(iPos); return ppData[iPos];} // For use as l value /* Operator() */ inline CMatlibVector& operator()(int const iPos) const {_TESTRNGRM(iPos - 1); return ppData[iPos - 1];} inline CMatlibVector& operator()(int const iPos) {_TESTRNGWM(iPos - 1); return ppData[iPos - 1];} // For use as l value CMatlibMatrix operator()(const int iRowFrom, const int iRowTo, const int iColFrom, const int iColTo) const; /* operator= */ inline CMatlibMatrix& operator=(const CMatlibMatrix& matI) {_TESTSIZEM(matI.GetRowSize()); _MATOPCL(= matI[i]);} inline CMatlibMatrix& operator=(const CMatlibMatrix& matI) {_TESTSIZEM(matI.GetRowSize()); _MATOPCL(= matI[i]);} /* operator+= */ inline CMatlibMatrix& operator+=(const CMatlibMatrix& matI) {_MATOPCL(+= matI[i]);} inline CMatlibMatrix& operator+=(const CMatlibMatrix& matI) {_MATOPCL(+= matI[i]);} /* operator-= */ inline CMatlibMatrix& operator-=(const CMatlibMatrix& matI) {_MATOPCL(-= matI[i]);} inline CMatlibMatrix& operator-=(const CMatlibMatrix& matI) {_MATOPCL(-= matI[i]);} /* operator*= */ inline CMatlibMatrix& operator*=(const CReal& rI) {_MATOPCL(*= rI);} inline CMatlibMatrix& operator*=(const CComplex& cI) {_MATOPCL(*= cI);} /* operator/= */ inline CMatlibMatrix& operator/=(const CReal& rI) {_MATOPCL(/= rI);} inline CMatlibMatrix& operator/=(const CComplex& cI) {_MATOPCL(/= cI);} protected: EVecTy eVType; int iRowSize; CMatlibVector* ppData; }; /* Help functions *************************************************************/ /* operator+ */ inline CMatlibMatrix // cm, cm operator+(const CMatlibMatrix& cmA, const CMatlibMatrix& cmB) { const int iRowSizeA = cmA.GetRowSize(); const int iColSizeA = cmA.GetColSize(); CMatlibMatrix matRet(iRowSizeA, iColSizeA, VTY_TEMP); for (int j = 0; j < iRowSizeA; j++) { for (int i = 0; i < iColSizeA; i++) matRet[j][i] = cmA[j][i] + cmB[j][i]; } return matRet; } /* operator- */ inline CMatlibMatrix // cm, cm operator-(const CMatlibMatrix& cmA, const CMatlibMatrix& cmB) { const int iRowSizeA = cmA.GetRowSize(); const int iColSizeA = cmA.GetColSize(); CMatlibMatrix matRet(iRowSizeA, iColSizeA, VTY_TEMP); for (int j = 0; j < iRowSizeA; j++) { for (int i = 0; i < iColSizeA; i++) matRet[j][i] = cmA[j][i] - cmB[j][i]; } return matRet; } /* operator* */ inline CMatlibVector // cm, cv operator*(const CMatlibMatrix& cmA, const CMatlibVector& cvB) { const int iRowSizeA = cmA.GetRowSize(); const int iSizeB = cvB.GetSize(); CMatlibVector vecRet(iSizeB, VTY_TEMP); for (int j = 0; j < iRowSizeA; j++) { vecRet[j] = (CReal) 0.0; for (int i = 0; i < iSizeB; i++) vecRet[j] += cmA[j][i] * cvB[i]; } return vecRet; } /* operator* */ inline CMatlibVector // rm, rv operator*(const CMatlibMatrix& rmA, const CMatlibVector& rvB) { const int iRowSizeA = rmA.GetRowSize(); const int iSizeB = rvB.GetSize(); CMatlibVector vecRet(iSizeB, VTY_TEMP); for (int j = 0; j < iRowSizeA; j++) { vecRet[j] = (CReal) 0.0; for (int i = 0; i < iSizeB; i++) vecRet[j] += rmA[j][i] * rvB[i]; } return vecRet; } /* operator* */ inline CMatlibMatrix // cm, cm operator*(const CMatlibMatrix& cmA, const CMatlibMatrix& cmB) { const int iRowSizeA = cmA.GetRowSize(); const int iRowSizeB = cmB.GetRowSize(); const int iColSizeB = cmB.GetColSize(); CMatlibMatrix matRet(iRowSizeA, iColSizeB, VTY_TEMP); for (int k = 0; k < iColSizeB; k++) { for (int j = 0; j < iRowSizeA; j++) { matRet[j][k] = (CReal) 0.0; for (int i = 0; i < iRowSizeB; i++) matRet[j][k] += cmA[j][i] * cmB[i][k]; } } return matRet; } /* operator* */ inline CMatlibMatrix // c, cm operator*(const CComplex& cA, const CMatlibMatrix& cmB) { const int iRowSizeB = cmB.GetRowSize(); const int iColSizeB = cmB.GetColSize(); CMatlibMatrix matRet(iRowSizeB, iColSizeB, VTY_TEMP); for (int k = 0; k < iColSizeB; k++) { for (int j = 0; j < iRowSizeB; j++) matRet[j][k] = cA * cmB[j][k]; } return matRet; } /* operator* */ inline CMatlibMatrix // r, rm operator*(const CReal& rA, const CMatlibMatrix& rmB) { const int iRowSizeB = rmB.GetRowSize(); const int iColSizeB = rmB.GetColSize(); CMatlibMatrix matRet(iRowSizeB, iColSizeB, VTY_TEMP); for (int k = 0; k < iColSizeB; k++) { for (int j = 0; j < iRowSizeB; j++) matRet[j][k] = rA * rmB[j][k]; } return matRet; } /* Implementation ************************************************************** (the implementation of template classes must be in the header file!) */ template CMatlibMatrix::CMatlibMatrix(const CMatlibMatrix& matI) : eVType(VTY_CONST), iRowSize(matI.GetRowSize()), ppData(NULL) { if (iRowSize > 0) { /* Allocate data block for vector */ ppData = new CMatlibVector[iRowSize]; /* Init column vectors and copy */ for (int i = 0; i < iRowSize; i++) { ppData[i].Init(matI.GetColSize()); /* Copy entire vector */ ppData[i] = matI[i]; } } } template void CMatlibMatrix::Init(const int iNRowLen, const int iNColLen, const T tIniVal) { iRowSize = iNRowLen; /* Allocate data block for vector */ if (iRowSize > 0) { if (ppData != NULL) delete[] ppData; ppData = new CMatlibVector[iRowSize]; /* Init column vectors and set to init value */ for (int i = 0; i < iRowSize; i++) ppData[i].Init(iNColLen, tIniVal); } } template inline CMatlibMatrix CMatlibMatrix::operator()(const int iRowFrom, const int iRowTo, const int iColFrom, const int iColTo) const { const int iStartRow = iRowFrom - 1; const int iStartCol = iColFrom - 1; CMatlibMatrix matRet(iRowTo - iStartRow, iColTo - iStartCol, VTY_TEMP); for (int j = iStartRow; j < iRowTo; j++) { for (int i = iStartCol; i < iColTo; i++) matRet[j - iStartRow][i - iStartCol] = operator[](j)[i]; } return matRet; } /* Include toolboxes after all type definitions */ #include "MatlibStdToolbox.h" #include "MatlibSigProToolbox.h" #endif /* _MATLIB_H_ */ qsstv_9.2.6/qsstv/drmtx/common/matlib/MatlibSigProToolbox.cpp0000664000175000017500000003630313203343610023117 0ustar jomajoma/******************************************************************************\ * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * c++ Mathematic Library (Matlib), signal processing toolbox * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "MatlibSigProToolbox.h" /* Implementation *************************************************************/ CMatlibVector Hann(const int iLen) { int iHalf, i; CMatlibVector fvRet(iLen, VTY_TEMP); if (iLen % 2) { /* Odd length window */ iHalf = (iLen + 1) / 2; /* Hanning window */ CMatlibVector vecTemp(iHalf); CMatlibVector w(iHalf); for (i = 0; i < iHalf; i++) vecTemp[i] = (CReal) i; w = (CReal) 0.5 * (1 - Cos((CReal) 2.0 * crPi * vecTemp / (iLen - 1))); /* Make symmetric window */ return fvRet.Merge(w, w(iHalf - 1, -1, 1)); } else { /* Even length window */ iHalf = iLen / 2; /* Hanning window */ CMatlibVector vecTemp(iHalf); CMatlibVector w(iHalf); for (i = 0; i < iHalf; i++) vecTemp[i] = (CReal) i; w = (CReal) 0.5 * (1 - Cos((CReal) 2.0 * crPi * vecTemp / (iLen - 1))); /* Make symmetric window */ return fvRet.Merge(w, w(iHalf, -1, 1)); } } CMatlibVector Hamming(const int iLen) { int iHalf, i; CMatlibVector fvRet(iLen, VTY_TEMP); if (iLen % 2) { /* Odd length window */ iHalf = (iLen + 1) / 2; /* Hanning window */ CMatlibVector vecTemp(iHalf); CMatlibVector w(iHalf); for (i = 0; i < iHalf; i++) vecTemp[i] = (CReal) i; w = (CReal) 0.54 - (CReal) 0.46 * Cos((CReal) 2.0 * crPi * vecTemp / (iLen - 1)); /* Make symmetric window */ return fvRet.Merge(w, w(iHalf - 1, -1, 1)); } else { /* Even length window */ iHalf = iLen / 2; /* Hanning window */ CMatlibVector vecTemp(iHalf); CMatlibVector w(iHalf); for (i = 0; i < iHalf; i++) vecTemp[i] = (CReal) i; w = (CReal) 0.54 - (CReal) 0.46 * Cos((CReal) 2.0 * crPi * vecTemp / (iLen - 1)); /* Make symmetric window */ return fvRet.Merge(w, w(iHalf, -1, 1)); } } CMatlibVector Nuttallwin(const int iLen) { CMatlibVector fvRet(iLen, VTY_TEMP); /* Nuttall coefficients */ const CReal rA0 = (CReal) 0.3635819; const CReal rA1 = (CReal) 0.4891775; const CReal rA2 = (CReal) 0.1365995; const CReal rA3 = (CReal) 0.0106411; const CReal rArg = (CReal) 2.0 * crPi / (iLen - 1); for (int i = 0; i < iLen; i++) { fvRet[i] = rA0 - rA1 * Cos(rArg * i) + rA2 * Cos(rArg * i * 2) - rA3 * Cos(rArg * i * 3); } return fvRet; } CMatlibVector Bartlett(const int iLen) { const int iHalf = (int) Ceil((CReal) iLen / 2); CMatlibVector fvHalfWin(iHalf); CMatlibVector fvRet(iLen, VTY_TEMP); for (int i = 0; i < iHalf; i++) fvHalfWin[i] = (CReal) 2.0 * i / (iLen - 1); /* Build complete output vector depending on odd or even input length */ if (iLen % 2) fvRet.Merge(fvHalfWin, fvHalfWin(iHalf - 1, -1, 1)); /* Odd */ else fvRet.Merge(fvHalfWin, fvHalfWin(iHalf, -1, 1)); /* Even */ return fvRet; } CMatlibVector Triang(const int iLen) { const int iHalf = (int) Ceil((CReal) iLen / 2); CMatlibVector fvHalfWin(iHalf); CMatlibVector fvRet(iLen, VTY_TEMP); /* Build complete output vector depending on odd or even input length */ if (iLen % 2) { for (int i = 0; i < iHalf; i++) fvHalfWin[i] = (CReal) 2.0 * (i + 1) / (iLen + 1); fvRet.Merge(fvHalfWin, fvHalfWin(iHalf - 1, -1, 1)); /* Odd */ } else { for (int i = 0; i < iHalf; i++) fvHalfWin[i] = ((CReal) 2.0 * (i + 1) - 1) / iLen; fvRet.Merge(fvHalfWin, fvHalfWin(iHalf, -1, 1)); /* Even */ } return fvRet; } CMatlibVector Kaiser(const int iLen, const CReal rBeta) { CReal rX; const int iIsOdd = iLen % 2; const int n = (iLen + 1) / 2; /* Half vector size, round up */ CMatlibVector fvRet(iLen); CMatlibVector fvW(n); const CReal rNorm = Abs(Besseli((CReal) 0.0, rBeta)); const CReal rXind = (iLen - 1) * (iLen - 1); if (iIsOdd == 0) rX = (CReal) 0.5; else rX = (CReal) 0.0; for (int i = 0; i < n; i++) { fvW[i] = Besseli((CReal) 0.0, rBeta * Sqrt((CReal) 1.0 - (CReal) 4.0 * rX * rX / rXind)) / rNorm; rX += (CReal) 1.0; } /* Symmetrical window */ fvRet.Merge(fvW(n, -1, iIsOdd + 1), fvW); return Abs(fvRet); } CReal Besseli(const CReal rNu, const CReal rZ) { const CReal rEp = (CReal) 10e-9; /* Define accuracy */ const CReal rY = rZ / (CReal) 2.0; CReal rReturn = (CReal) 1.0; CReal rD = (CReal) 1.0; CReal rS = (CReal) 1.0; /* Only nu = 0 is supported right now! */ if (rNu != (CReal) 0.0) { #ifdef _DEBUG_ DebugError("MatLibr: Besseli function", "The nu = ", rNu, \ " is not supported, only nu = ", 0); #endif } for (int i = 1; i <= 25 && rReturn * rEp <= rS; i++) { rD *= rY / i; rS = rD * rD; rReturn += rS; } return rReturn; } CMatlibVector Randn(const int iLen) { /* Add some constant distributed random processes together */ _VECOP(CReal, iLen, (CReal) ((((CReal) rand() + rand() + rand() + rand() + rand() + rand() + rand()) / RAND_MAX - 0.5) * /* sqrt(3) * 2 / sqrt(7) */ 1.3093)); } CMatlibVector Filter(const CMatlibVector& fvB, const CMatlibVector& fvA, const CMatlibVector& fvX, CMatlibVector& fvZ) { int m, n, iLenCoeff; const int iSizeA = fvA.GetSize(); const int iSizeB = fvB.GetSize(); const int iSizeX = fvX.GetSize(); const int iSizeZ = fvZ.GetSize(); CMatlibVector fvY(iSizeX, VTY_TEMP); CMatlibVector fvANew, fvBNew; if ((iSizeA == 1) && (fvA[0] == (CReal) 1.0)) { /* FIR filter ------------------------------------------------------- */ const int iSizeXNew = iSizeX + iSizeZ; CMatlibVector rvXNew(iSizeXNew); /* Add old values to input vector */ rvXNew.Merge(fvZ, fvX); /* Actual convolution */ for (m = 0; m < iSizeX; m++) { fvY[m] = (CReal) 0.0; for (n = 0; n < iSizeB; n++) fvY[m] += fvB[n] * rvXNew[m + iSizeB - n - 1]; } /* Save last samples in state vector */ fvZ = rvXNew(iSizeXNew - iSizeZ + 1, iSizeXNew); } else { /* IIR filter ------------------------------------------------------- */ /* Length of coefficients */ iLenCoeff = (int) Max((CReal) iSizeB, (CReal) iSizeA); /* Make fvB and fvA the same length (zero padding) */ if (iSizeB > iSizeA) { fvBNew.Init(iSizeB); fvANew.Init(iSizeB); fvBNew = fvB; fvANew.Merge(fvA, Zeros(iSizeB - iSizeA)); } else { fvBNew.Init(iSizeA); fvANew.Init(iSizeA); fvANew = fvA; fvBNew.Merge(fvB, Zeros(iSizeA - iSizeB)); } /* Filter is implemented as a transposed direct form II structure */ for (m = 0; m < iSizeX; m++) { /* y(m) = (b(1) x(m) + z_1(m - 1)) / a(1) */ fvY[m] = (fvBNew[0] * fvX[m] + fvZ[0]) / fvANew[0]; for (n = 1; n < iLenCoeff; n++) { /* z_{n - 2}(m) = b(n - 1) x(m) + z_{n - 1}(m - 1) - a(n - 1) y(m) */ fvZ[n - 1] = fvBNew[n] * fvX[m] + fvZ[n] - fvANew[n] * fvY[m]; } } } return fvY; } CMatlibVector FirLP(const CReal rNormBW, const CMatlibVector& rvWin) { /* Lowpass filter design using windowing method */ const int iLen = rvWin.GetSize(); const int iHalfLen = (int) Floor((CReal) iLen / 2); CMatlibVector fvRet(iLen, VTY_TEMP); /* Generate truncuated ideal response */ for (int i = 0; i < iLen; i++) fvRet[i] = rNormBW * Sinc(rNormBW * (i - iHalfLen)); /* Apply window */ fvRet *= rvWin; return fvRet; } CMatlibVector FirFiltDec(const CMatlibVector& cvB, const CMatlibVector& cvX, CMatlibVector& cvZ, const int iDecFact) { int m, n, iCurPos; const int iSizeX = cvX.GetSize(); const int iSizeZ = cvZ.GetSize(); const int iSizeB = cvB.GetSize(); const int iSizeXNew = iSizeX + iSizeZ; const int iSizeFiltHist = iSizeB - 1; int iNewLenZ; int iDecSizeY; if (iSizeFiltHist >= iSizeXNew) { /* Special case if no new output can be calculated */ iDecSizeY = 0; iNewLenZ = iSizeXNew; } else { /* Calculate the number of output bits which can be generated from the provided input vector */ iDecSizeY = (int) (((CReal) iSizeXNew - iSizeFiltHist - 1) / iDecFact + 1); /* Since the input vector length must not be a multiple of "iDecFact", some input bits will be unused. To store this number, the size of the state vector "Z" is adapted */ iNewLenZ = iSizeFiltHist - (iDecSizeY * iDecFact - (iSizeXNew - iSizeFiltHist)); } CMatlibVector cvY(iDecSizeY, VTY_TEMP); CMatlibVector cvXNew(iSizeXNew); /* Add old values to input vector */ cvXNew.Merge(cvZ, cvX); /* FIR filter */ for (m = 0; m < iDecSizeY; m++) { iCurPos = m * iDecFact + iSizeFiltHist; cvY[m] = (CReal) 0.0; for (n = 0; n < iSizeB; n++) cvY[m] += cvB[n] * cvXNew[iCurPos - n]; } /* Save last samples in state vector */ cvZ.Init(iNewLenZ); cvZ = cvXNew(iSizeXNew - iNewLenZ + 1, iSizeXNew); return cvY; } CMatlibVector Levinson(const CMatlibVector& vecrRx, const CMatlibVector& vecrB) { /* The levinson recursion [S. Haykin] This algorithm solves the following equations: Rp ap = ep u1, Rp Xp = b, where Rp is a Toepliz-matrix of vector prRx and b = prB is an arbitrary correlation-vector. The Result is ap = prA. Parts of the following code are taken from Ptolemy (http://ptolemy.eecs.berkeley.edu/) */ const int iLength = vecrRx.GetSize(); CRealVector vecrX(iLength, VTY_TEMP); CReal rGamma; CReal rGammaCap; CReal rDelta; CReal rE; CReal rQ; int i, j; CRealVector vecraP(iLength); CRealVector vecrA(iLength); /* Initialize the recursion --------------------------------------------- */ // (a) First coefficient is always unity vecrA[0] = (CReal) 1.0; vecraP[0] = (CReal) 1.0; // (b) vecrX[0] = vecrB[0] / vecrRx[0]; // (c) Initial prediction error is simply the zero-lag of // of the autocorrelation, or the signal power estimate. rE = vecrRx[0]; /* Main loop ------------------------------------------------------------ */ // The order recurrence for (j = 0; j < iLength - 1; j++) { const int iNextInd = j + 1; // (a) Compute the new gamma rGamma = vecrRx[iNextInd]; for (i = 1; i < iNextInd; i++) rGamma += vecrA[i] * vecrRx[iNextInd - i]; // (b), (d) Compute and output the reflection coefficient // (which is also equal to the last AR parameter) vecrA[j + 1] = rGammaCap = - rGamma / rE; // (c) for (i = 1; i < iNextInd; i++) vecraP[i] = vecrA[i] + rGammaCap * vecrA[iNextInd - i]; // Swap a and aP for next order recurrence for (i = 1; i < iNextInd; i++) vecrA[i] = vecraP[i]; // (e) Update the prediction error power rE = rE * ((CReal) 1.0 - rGammaCap * rGammaCap); // (f) rDelta = (CReal) 0.0; for (i = 0; i < iNextInd; i++) rDelta += vecrX[i] * vecrRx[iNextInd - i]; // (g), (i) vecrX[iNextInd] = rQ = (vecrB[iNextInd] - rDelta) / rE; // (h) for (i = 0; i < iNextInd; i++) vecrX[i] = vecrX[i] + rQ * vecrA[iNextInd - i]; } return vecrX; } CMatlibVector Levinson(const CMatlibVector& veccRx, const CMatlibVector& veccB) { /* The levinson recursion [S. Haykin] COMPLEX version! This algorithm solves the following equations: Rp ap = ep u1, Rp Xp = b, where Rp is a Toepliz-matrix of vector prRx and b = prB is an arbitrary correlation-vector. The Result is ap = prA. Parts of the following code are taken from Ptolemy (http://ptolemy.eecs.berkeley.edu/) */ const int iLength = veccRx.GetSize(); CComplexVector veccX(iLength, VTY_TEMP); CComplex cGamma; CComplex cGammaCap; CComplex cDelta; CReal rE; CComplex cQ; int i, j; CComplexVector veccaP(iLength); CComplexVector veccA(iLength); /* Initialize the recursion --------------------------------------------- */ // (a) First coefficient is always unity veccA[0] = (CReal) 1.0; veccaP[0] = (CReal) 1.0; // (b) veccX[0] = veccB[0] / veccRx[0]; // (c) Initial prediction error is simply the zero-lag of // of the autocorrelation, or the signal power estimate. rE = Real(veccRx[0]); /* Main loop ------------------------------------------------------------ */ // The order recurrence for (j = 0; j < iLength - 1; j++) { const int iNextInd = j + 1; // (a) Compute the new gamma cGamma = veccRx[iNextInd]; for (i = 1; i < iNextInd; i++) cGamma += veccA[i] * veccRx[iNextInd - i]; // (b), (d) Compute and output the reflection coefficient // (which is also equal to the last AR parameter) veccA[iNextInd] = cGammaCap = - cGamma / rE; // (c) for (i = 1; i < iNextInd; i++) veccaP[i] = veccA[i] + cGammaCap * Conj(veccA[iNextInd - i]); // Swap a and aP for next order recurrence for (i = 1; i < iNextInd; i++) veccA[i] = veccaP[i]; // (e) Update the prediction error power rE = rE * ((CReal) 1.0 - SqMag(cGammaCap)); // (f) cDelta = (CReal) 0.0; for (i = 0; i < iNextInd; i++) cDelta += veccX[i] * veccRx[iNextInd - i]; // (g), (i) veccX[iNextInd] = cQ = (veccB[iNextInd] - cDelta) / rE; // (h) for (i = 0; i < iNextInd; i++) veccX[i] = veccX[i] + cQ * Conj(veccA[iNextInd - i]); } return veccX; } CMatlibVector DomEig(const CMatlibMatrix& rmI, const CReal rEpsilon) { const int iMaxNumIt = 150; /* Maximum number of iterations */ const int iSize = rmI.GetColSize(); CMatlibVector vecrV(iSize, VTY_TEMP); CMatlibVector vecrVold(iSize); CMatlibVector vecrY(iSize); CReal rLambda, rLambdaold, rError; /* Implementing the power method for getting the dominant eigenvector */ /* Start value for eigenvector */ vecrV = Ones(iSize); rLambda = rLambdaold = (CReal) 1.0; rError = _MAXREAL; int iItCnt = iMaxNumIt; while ((iItCnt > 0) && (rError > rEpsilon)) { /* Save old values needed error calculation */ vecrVold = vecrV; rLambdaold = rLambda; /* Actual power method calculations */ rLambda = Max(Abs(vecrV)); vecrV = (CReal) 1.0 / rLambda * rmI * vecrV; /* Take care of number of iterations and error calculations */ iItCnt--; rError = Max(Abs(rLambda - rLambdaold), Max(Abs(vecrV - vecrVold))); } return vecrV; } CReal LinRegr(const CMatlibVector& rvX, const CMatlibVector& rvY) { /* Linear regression */ CReal Xm(Mean(rvX)); CReal Ym(Mean(rvY)); CRealVector Xmrem(rvX - Xm); /* Remove mean of W */ /* Return only the gradient, we do not calculate and return the offset */ return Sum(Xmrem * (rvY - Ym)) / Sum(Xmrem * Xmrem); } qsstv_9.2.6/qsstv/drmtx/common/matlib/MatlibSigProToolbox.h0000664000175000017500000001126713203343610022566 0ustar jomajoma/******************************************************************************\ * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * c++ Mathematic Library (Matlib), signal processing toolbox * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #ifndef _MATLIB_SIGNAL_PROC_TOOLBOX_H_ #define _MATLIB_SIGNAL_PROC_TOOLBOX_H_ #include "Matlib.h" #include "MatlibStdToolbox.h" #include /* Helpfunctions **************************************************************/ /* Randomize functions */ CMatlibVector Randn(const int iLen); inline CMatlibVector Rand(const int iLen) {_VECOP(CReal, iLen, (CReal) rand() / RAND_MAX);} /* Window functions */ CMatlibVector Hann(const int iLen); CMatlibVector Hamming(const int iLen); CMatlibVector Nuttallwin(const int iLen); CMatlibVector Bartlett(const int iLen); CMatlibVector Triang(const int iLen); CMatlibVector Kaiser(const int iLen, const CReal rBeta); /* Bessel function */ CReal Besseli(const CReal rNu, const CReal rZ); /* Filter data with a recursive (IIR) or nonrecursive (FIR) filter */ CMatlibVector Filter(const CMatlibVector& fvB, const CMatlibVector& fvA, const CMatlibVector& fvX, CMatlibVector& fvZ); /* Levinson durbin recursion */ CMatlibVector Levinson(const CMatlibVector& vecrRx, const CMatlibVector& vecrB); CMatlibVector Levinson(const CMatlibVector& veccRx, const CMatlibVector& veccB); /* Sinc-function */ inline CReal Sinc(const CReal& rI) {return rI == (CReal) 0.0 ? (CReal) 1.0 : sin(crPi * rI) / (crPi * rI);} inline CMatlibVector Sinc(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Sinc(fvI[i]));} /* My own functions --------------------------------------------------------- */ /* Dominant eigenvector */ CMatlibVector DomEig(const CMatlibMatrix& rmI, const CReal rEpsilon = 1e-5); /* Linear regression */ CReal LinRegr(const CMatlibVector& rvX, const CMatlibVector& rvY); /* Lowpass filter design using windowing method */ CMatlibVector FirLP(const CReal rNormBW, const CMatlibVector& rvWin); /* Complex FIR filter with decimation */ CMatlibVector FirFiltDec(const CMatlibVector& cvB, const CMatlibVector& cvX, CMatlibVector& cvZ, const int iDecFact); /* Squared magnitude */ inline CReal SqMag(const CComplex& cI) {return cI.real() * cI.real() + cI.imag() * cI.imag();} inline CReal SqMag(const CReal& rI) {return rI * rI;} inline CMatlibVector SqMag(const CMatlibVector& veccI) {_VECOP(CReal, veccI.GetSize(), SqMag(veccI[i]));} inline CMatlibVector SqMag(const CMatlibVector& vecrI) {_VECOP(CReal, vecrI.GetSize(), SqMag(vecrI[i]));} /* One pole recursion (first order IIR) y_n = lambda * y_{n - 1} + (1 - lambda) * x_n */ inline void IIR1(CReal& rY, const CReal& rX, const CReal rLambda) {rY = rLambda * (rY - rX) + rX;} inline void IIR1(CComplex& cY, const CComplex& cX, const CReal rLambda) {cY = rLambda * (cY - cX) + cX;} inline void IIR1(CMatlibVector& rY, const CMatlibVector& rX, const CReal rLambda) { const int iSize = rY.GetSize(); for (int i = 0; i < iSize; i++) IIR1(rY[i], rX[i], rLambda); } /* Two-sided one pole recursion */ inline void IIR1TwoSided(CReal& rY, const CReal& rX, const CReal rLamUp, const CReal rLamDown) {rX > rY ? IIR1(rY, rX, rLamUp) : IIR1(rY, rX, rLamDown);} /* Get lambda for one-pole recursion from time constant */ inline CReal IIR1Lam(const CReal& rTau, const CReal& rFs) {return exp((CReal) -1.0 / (rTau * rFs));} #endif /* _MATLIB_SIGNAL_PROC_TOOLBOX_H_ */ qsstv_9.2.6/qsstv/drmtx/common/matlib/MatlibStdToolbox.cpp0000664000175000017500000004440713203343610022452 0ustar jomajoma/******************************************************************************\ * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * c++ Mathematic Library (Matlib) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "MatlibStdToolbox.h" /* Implementation *************************************************************/ CReal Min(const CMatlibVector& rvI) { const int iSize = rvI.GetSize(); CReal rMinRet = rvI[0]; for (int i = 1; i < iSize; i++) { if (rvI[i] < rMinRet) rMinRet = rvI[i]; } return rMinRet; } void Min(CReal& rMinVal, int& iMinInd, const CMatlibVector& rvI) { const int iSize = rvI.GetSize(); rMinVal = rvI[0]; /* Init actual minimum value */ iMinInd = 0; /* Init index of minimum */ for (int i = 1; i < iSize; i++) { if (rvI[i] < rMinVal) { rMinVal = rvI[i]; iMinInd = i; } } } CReal Max(const CMatlibVector& rvI) { CReal rMaxRet; int iMaxInd; /* Not used by this function */ Max(rMaxRet, iMaxInd, rvI); return rMaxRet; } void Max(CReal& rMaxVal, int& iMaxInd, const CMatlibVector& rvI) { const int iSize = rvI.GetSize(); rMaxVal = rvI[0]; /* Init actual maximum value */ iMaxInd = 0; /* Init index of maximum */ for (int i = 1; i < iSize; i++) { if (rvI[i] > rMaxVal) { rMaxVal = rvI[i]; iMaxInd = i; } } } CMatlibVector Sort(const CMatlibVector& rvI) { const int iSize = rvI.GetSize(); const int iEnd = iSize - 1; CMatlibVector fvRet(iSize, VTY_TEMP); /* Copy input vector in output vector */ fvRet = rvI; /* Loop through the array one less than its total cell count */ for (int i = 0; i < iEnd; i++) { /* Loop through every cell (value) in array */ for (int j = 0; j < iEnd; j++) { /* Compare the values and switch if necessary */ if (fvRet[j] > fvRet[j + 1]) { const CReal rSwap = fvRet[j]; fvRet[j] = fvRet[j + 1]; fvRet[j + 1] = rSwap; } } } return fvRet; } CMatlibMatrix Eye(const int iLen) { CMatlibMatrix matrRet(iLen, iLen, VTY_TEMP); /* Set all values except of the diagonal to zero, diagonal entries = 1 */ for (int i = 0; i < iLen; i++) { for (int j = 0; j < iLen; j++) { if (i == j) matrRet[i][j] = (CReal) 1.0; else matrRet[i][j] = (CReal) 0.0; } } return matrRet; } CMatlibMatrix Diag(const CMatlibVector& cvI) { const int iSize = cvI.GetSize(); CMatlibMatrix matcRet(iSize, iSize, VTY_TEMP); /* Set the diagonal to the values of the input vector */ for (int i = 0; i < iSize; i++) { for (int j = 0; j < iSize; j++) { if (i == j) matcRet[i][j] = cvI[i]; else matcRet[i][j] = (CReal) 0.0; } } return matcRet; } CReal Trace(const CMatlibMatrix& rmI) { const int iSize = rmI.GetRowSize(); /* matrix must be square */ CReal rReturn = (CReal) 0.0; for (int i = 0; i < iSize; i++) rReturn += rmI[i][i]; return rReturn; } CMatlibMatrix Toeplitz(const CMatlibVector& cvI) { const int iSize = cvI.GetSize(); CMatlibMatrix matcRet(iSize, iSize, VTY_TEMP); /* Create Toeplitz matrix */ for (int i = 0; i < iSize; i++) { for (int j = 0; j < iSize; j++) { if (i < j) matcRet[i][j] = cvI[j - i]; else matcRet[i][j] = Conj(cvI[i - j]); } } return matcRet; } CMatlibMatrix Transp(const CMatlibMatrix& cmI) { const int iRowSize = cmI.GetRowSize(); const int iColSize = cmI.GetColSize(); /* Swaped row and column size due to transpose operation */ CMatlibMatrix matcRet(iColSize, iRowSize, VTY_TEMP); /* Transpose matrix */ for (int i = 0; i < iRowSize; i++) { for (int j = 0; j < iColSize; j++) matcRet[j][i] = cmI[i][j]; } return matcRet; } CMatlibMatrix Inv(const CMatlibMatrix& matrI) { /* Parts of the following code are taken from Ptolemy (http://ptolemy.eecs.berkeley.edu/) The input matrix must be square, this is NOT checked here! */ _COMPLEX temp; int row, col, i; const int iSize = matrI.GetColSize(); CMatlibMatrix matrRet(iSize, iSize, VTY_TEMP); /* Make a working copy of input matrix */ CMatlibMatrix work(matrI); /* Set result to be the identity matrix */ matrRet = Eye(iSize); for (i = 0; i < iSize; i++) { /* Check that the element in (i,i) is not zero */ if ((Real(work[i][i]) == 0) && (Imag(work[i][i]) == 0)) { /* Swap with a row below this one that has a non-zero element in the same column */ for (row = i + 1; row < iSize; row++) { if ((Real(work[i][i]) != 0) || (Imag(work[i][i]) != 0)) break; } // TEST if (row == iSize) { printf("couldn't invert matrix, possibly singular.\n"); matrRet = Eye(iSize); return matrRet; } /* Swap rows */ for (col = 0; col < iSize; col++) { temp = work[i][col]; work[i][col] = work[row][col]; work[row][col] = temp; temp = matrRet[i][col]; matrRet[i][col] = matrRet[row][col]; matrRet[row][col] = temp; } } /* Divide every element in the row by element (i,i) */ temp = work[i][i]; for (col = 0; col < iSize; col++) { work[i][col] /= temp; matrRet[i][col] /= temp; } /* Zero out the rest of column i */ for (row = 0; row < iSize; row++) { if (row != i) { temp = work[row][i]; for (col = iSize - 1; col >= 0; col--) { work[row][col] -= (temp * work[i][col]); matrRet[row][col] -= (temp * matrRet[i][col]); } } } } return matrRet; } /* This function is not listed in the header file. It shall be used only for Matlib internal calculations */ CComplex _integral(MATLIB_CALLBACK_QAUD f, const CReal a, const CReal b, const CReal errorBound, CReal& integralBound, _BOOLEAN& integralError, const CReal ru) { /* The following code (inclusive the actual Quad() function) is based on a JavaScript Example written by Lucio Tavernini. The code is hosted at http://tavernini.com/integral.shtml. Description: Adaptive Simpson's Quadrature _integral(f, a, b, errorBound) attempts to integrate f from a to b while keeping the asymptotic error estimate below errorBound using an adaptive implementation of Simpson's rule. Notes: Instead of NaN we use _MAXREAL. Infinite bounds are not allowed! The lower bound must always be smaller than the higher bound! */ CReal left, right, h, h6, bound; CComplex fa, fb, v1, v2, error, value; int m1, jend, mstart, j; if (integralError) return _MAXREAL; /* NaN */ /* Integrate over [a,b]. Initialize */ const int max = 1024; CRealVector x(max); CComplexVector f1(max); CComplexVector f2(max); CComplexVector f3(max); CComplexVector v(max); int step = 1; int m = 1; bound = errorBound; value = 0; h = b - a; x[0] = a; f1[0] = f(a); f2[0] = f((CReal) 0.5 * (a + b)); f3[0] = f(b); v[0] = h * (f1[0] + (CReal) 4.0 * f2[0] + f3[0]) / (CReal) 6.0; do { /* Are we going to go forward or backward? */ if (step == -1) { /* Forward: j = m,...,max */ step = 1; j = m + 1; jend = max; m = 0; mstart = 0; } else { /* Backward: j = m,...,1 */ step = -1; j = m - 1; jend = -1; m = max - 1; mstart = max - 1; } h = (CReal) 0.5 * h; h6 = h / 6; bound = (CReal) 0.5 * bound; do { left = x[j]; right = x[j] + (CReal) 0.5 * h; /* Complete loss of significance? */ if (left >= right) { printf("integral: Error 1"); return value; } fa = f(x[j] + (CReal) 0.5 * h); fb = f(x[j] + (CReal) 1.5 * h); v1 = h6 * (f1[j] + (CReal) 4.0 * fa + f2[j]); v2 = h6 * (f2[j] + (CReal) 4.0 * fb + f3[j]); error = (v[j] - v1 - v2) / (CReal) 15.0; if ((Abs(error) <= bound) || (Abs(v1 + v2) < Abs(value) * ru)) value = ((v1 + v2) + value) - error; else { if (integralError) return _MAXREAL; /* NaN */ /* Are we out of memory? */ if (m == j) { left = x[j]; right = x[j] + (CReal) 0.5 * h; /* Complete loss of significance? */ if (left >= right) { printf("integral: Error 2"); return value; } value += _integral(f, left, x[j] + 2 * h, bound, integralBound, integralError, ru); } else { /* No, we are not */ left = x[j]; right = x[j] + (CReal) 0.125 * h; if (left >= right) { /* The error bound specified is too small! */ integralError = true; return _MAXREAL; /* NaN */ } m1 = m + step; x[m] = x[j]; x[m1] = x[j] + h; v[m] = v1; v[m1] = v2; f1[m] = f1[j]; f2[m] = fa; f3[m] = f2[j]; f1[m1] = f2[j]; f2[m1] = fb; f3[m1] = f3[j]; m += 2 * step; } } j += step; } while (j != jend); } while (m != mstart); if (integralError) return _MAXREAL; /* NaN */ else return value; } CComplex Quad(MATLIB_CALLBACK_QAUD f, const CReal a, const CReal b, const CReal errorBound) { /* Set globals */ /* Generate rounding unit */ CReal value; CReal ru = (CReal) 1.0; do { ru = (CReal) 0.5 * ru; value = (CReal) 1.0 + ru; } while (value != (CReal) 1.0); ru *= 2; CReal integralBound = errorBound; _BOOLEAN integralError = false; /* Compute */ return _integral(f, a, b, errorBound, integralBound, integralError, ru); } CMatlibVector Fft(const CMatlibVector& cvI, const CFftPlans& FftPlans) { int i; CFftPlans* pCurPlan; fftw_complex* pFftwComplexIn; fftw_complex* pFftwComplexOut; const int n(cvI.GetSize()); CMatlibVector cvReturn(n, VTY_TEMP); /* If input vector has zero length, return */ if (n == 0) return cvReturn; /* Check, if plans are already created, else: create it */ if (!FftPlans.IsInitialized()) { pCurPlan = new CFftPlans; pCurPlan->Init(n); } else { /* Ugly, but ok: We transform "const" object in "non constant" object since we KNOW that the original object is not constant since it was already initialized! */ pCurPlan = (CFftPlans*) &FftPlans; } pFftwComplexIn = pCurPlan->pFftwComplexIn; pFftwComplexOut = pCurPlan->pFftwComplexOut; /* fftw (Homepage: http://www.fftw.org/) */ for (i = 0; i < n; i++) { pFftwComplexIn[i][0] = cvI[i].real(); pFftwComplexIn[i][1] = cvI[i].imag(); /* pa0mbo [0] [1] was .re .im */ } /* Actual fftw call */ fftw_execute(pCurPlan->FFTPlForw); for (i = 0; i < n; i++) cvReturn[i] = CComplex(pFftwComplexOut[i][0], pFftwComplexOut[i][1]); if (!FftPlans.IsInitialized()) delete pCurPlan; return cvReturn; } CMatlibVector Ifft(const CMatlibVector& cvI, const CFftPlans& FftPlans) { int i; CFftPlans* pCurPlan; fftw_complex* pFftwComplexIn; fftw_complex* pFftwComplexOut; const int n(cvI.GetSize()); CMatlibVector cvReturn(n, VTY_TEMP); /* If input vector has zero length, return */ if (n == 0) return cvReturn; /* Check, if plans are already created, else: create it */ if (!FftPlans.IsInitialized()) { pCurPlan = new CFftPlans; pCurPlan->Init(n); } else { /* Ugly, but ok: We transform "const" object in "non constant" object since we KNOW that the original object is not constant since it was already initialized! */ pCurPlan = (CFftPlans*) &FftPlans; } pFftwComplexIn = pCurPlan->pFftwComplexIn; pFftwComplexOut = pCurPlan->pFftwComplexOut; /* fftw (Homepage: http://www.fftw.org/) */ for (i = 0; i < n; i++) { pFftwComplexIn[i][0] = cvI[i].real(); pFftwComplexIn[i][1] = cvI[i].imag(); // printf("vullen pFftwComplexIn %d %14.10f %14.10f \n",i, cvI[i].real(), cvI[i].imag()); } // printf("na vullen pFftwComplexIn \n"); /* Actual fftw call */ fftw_execute(pCurPlan->FFTPlBackw); // printf("Na execute plan in Ifft n is %d \n", n); const CReal scale = (CReal) 1.0 / n; for (i = 0; i < n; i++) { cvReturn[i] = CComplex(pFftwComplexOut[i][0] * scale, pFftwComplexOut[i][1] * scale); // printf("returnvalue %d is %g %g \n", i, pFftwComplexOut[i][0], pFftwComplexOut[i][1]); } if (!FftPlans.IsInitialized()) delete pCurPlan; return cvReturn; } CMatlibVector rfft(const CMatlibVector& fvI, const CFftPlans& FftPlans) { int i; CFftPlans* pCurPlan; double * pFftwRealIn; double * pFftwRealOut; const int iSizeI = fvI.GetSize(); const int iLongLength(iSizeI); const int iShortLength(iLongLength / 2); const int iUpRoundShortLength((iLongLength + 1) / 2); CMatlibVector cvReturn(iShortLength /* Include Nyquist frequency in case of even N */ + 1, VTY_TEMP); /* If input vector has zero length, return */ if (iLongLength == 0) return cvReturn; /* Check, if plans are already created, else: create it */ if (!FftPlans.IsInitialized()) { pCurPlan = new CFftPlans; pCurPlan->Init(iLongLength); } else { /* Ugly, but ok: We transform "const" object in "non constant" object since we KNOW that the original object is not constant since it was already initialized! */ pCurPlan = (CFftPlans*) &FftPlans; } pFftwRealIn = pCurPlan->pFftwRealIn; pFftwRealOut = pCurPlan->pFftwRealOut; /* fftw (Homepage: http://www.fftw.org/) */ for (i = 0; i < iSizeI; i++) pFftwRealIn[i] = fvI[i]; /* Actual fftw call */ fftw_execute(pCurPlan->RFFTPlForw); /* Now build complex output vector */ /* Zero frequency */ cvReturn[0] = pFftwRealOut[0]; for (i = 1; i < iUpRoundShortLength; i++) cvReturn[i] = CComplex(pFftwRealOut[i], pFftwRealOut[iLongLength - i]); /* If N is even, include Nyquist frequency */ if (iLongLength % 2 == 0) cvReturn[iShortLength] = pFftwRealOut[iShortLength]; if (!FftPlans.IsInitialized()) delete pCurPlan; return cvReturn; } CMatlibVector rifft(const CMatlibVector& cvI, const CFftPlans& FftPlans) { /* This function only works with EVEN N! */ int i; CFftPlans* pCurPlan; double* pFftwRealIn; double* pFftwRealOut; const int iShortLength(cvI.GetSize() - 1); /* Nyquist frequency! */ const int iLongLength(iShortLength * 2); CMatlibVector fvReturn(iLongLength, VTY_TEMP); /* If input vector is too short, return */ if (iShortLength <= 0) return fvReturn; /* Check, if plans are already created, else: create it */ if (!FftPlans.IsInitialized()) { pCurPlan = new CFftPlans; pCurPlan->Init(iLongLength); } else { /* Ugly, but ok: We transform "const" object in "non constant" object since we KNOW that the original object is not constant since it was already initialized! */ pCurPlan = (CFftPlans*) &FftPlans; } pFftwRealIn = pCurPlan->pFftwRealIn; pFftwRealOut = pCurPlan->pFftwRealOut; /* Now build half-complex-vector */ pFftwRealIn[0] = cvI[0].real(); for (i = 1; i < iShortLength; i++) { pFftwRealIn[i] = cvI[i].real(); pFftwRealIn[iLongLength - i] = cvI[i].imag(); } /* Nyquist frequency */ pFftwRealIn[iShortLength] = cvI[iShortLength].real(); /* Actual fftw call */ fftw_execute(pCurPlan->RFFTPlBackw); /* Scale output vector */ const CReal scale = (CReal) 1.0 / iLongLength; for (i = 0; i < iLongLength; i++) fvReturn[i] = pFftwRealOut[i] * scale; if (!FftPlans.IsInitialized()) delete pCurPlan; return fvReturn; } CMatlibVector FftFilt(const CMatlibVector& rvH, const CMatlibVector& rvI, CMatlibVector& rvZ, const CFftPlans& FftPlans) { /* This function only works with EVEN N! */ CFftPlans* pCurPlan; const int iL(rvH.GetSize() - 1); /* Nyquist frequency! */ const int iL2(2 * iL); CMatlibVector rvINew(iL2); CMatlibVector rvOutTMP(iL2); /* Check, if plans are already created, else: create it */ if (!FftPlans.IsInitialized()) { pCurPlan = new CFftPlans; pCurPlan->Init(iL2); } else { /* Ugly, but ok: We transform "const" object in "non constant" object since we KNOW that the original object is not constant since it was already initialized! */ pCurPlan = (CFftPlans*) &FftPlans; } /* Update history of input signal */ rvINew.Merge(rvZ, rvI); rvOutTMP = rifft(rfft(rvINew, FftPlans) * rvH, FftPlans); /* Save old input signal vector for next block */ rvZ = rvI; /* Cut out correct samples (to get from cyclic convolution to linear convolution) */ return rvOutTMP(iL + 1, iL2); } /* FftPlans implementation -------------------------------------------------- */ CFftPlans::~CFftPlans() { if (bInitialized) { /* Delete old plans and intermediate buffers */ fftw_destroy_plan(RFFTPlForw); fftw_destroy_plan(RFFTPlBackw); fftw_destroy_plan(FFTPlForw); fftw_destroy_plan(FFTPlBackw); fftw_free(pFftwRealIn); fftw_free(pFftwRealOut); fftw_free(pFftwComplexIn); fftw_free(pFftwComplexOut); } } void CFftPlans::Init(const int iFSi) { if (bInitialized) { /* Delete old plans and intermediate buffers */ fftw_destroy_plan(RFFTPlForw); fftw_destroy_plan(RFFTPlBackw); fftw_destroy_plan(FFTPlForw); fftw_destroy_plan(FFTPlBackw); fftw_free(pFftwRealIn); fftw_free(pFftwRealOut); fftw_free(pFftwComplexIn); fftw_free(pFftwComplexOut); } /* Create new plans and intermediate buffers */ pFftwRealIn = (double *) fftw_malloc(sizeof(double)*2*iFSi); pFftwRealOut = (double *) fftw_malloc(sizeof(double)*2*iFSi); pFftwComplexIn = (fftw_complex *) fftw_malloc(sizeof(fftw_complex)*iFSi); pFftwComplexOut = (fftw_complex *) fftw_malloc(sizeof(fftw_complex)*iFSi); RFFTPlForw = fftw_plan_r2r_1d(iFSi, pFftwRealIn, pFftwRealOut, FFTW_R2HC, FFTW_ESTIMATE); RFFTPlBackw = fftw_plan_r2r_1d(iFSi, pFftwRealIn,pFftwRealOut, FFTW_HC2R, FFTW_ESTIMATE); FFTPlForw = fftw_plan_dft_1d(iFSi, pFftwComplexIn, pFftwComplexOut, FFTW_FORWARD, FFTW_ESTIMATE); FFTPlBackw = fftw_plan_dft_1d(iFSi, pFftwComplexIn, pFftwComplexOut, FFTW_BACKWARD, FFTW_ESTIMATE); bInitialized = true; } qsstv_9.2.6/qsstv/drmtx/common/matlib/MatlibStdToolbox.h0000664000175000017500000002451513203343610022115 0ustar jomajoma/******************************************************************************\ * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * c++ Mathematic Library (Matlib), standard toolbox * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #ifndef _MATLIB_STD_TOOLBOX_H_ #define _MATLIB_STD_TOOLBOX_H_ #include "Matlib.h" /* fftw (Homepage: http://www.fftw.org) */ #include /* Classes ********************************************************************/ class CFftPlans { public: CFftPlans() : RFFTPlForw(NULL), RFFTPlBackw(NULL), bInitialized(false) {} CFftPlans(const int iFftSize) : RFFTPlForw(NULL), RFFTPlBackw(NULL), bInitialized(false) {Init(iFftSize);} virtual ~CFftPlans(); void Init(const int iFSi); inline bool IsInitialized() const {return bInitialized;} fftw_plan RFFTPlForw; fftw_plan RFFTPlBackw; fftw_plan FFTPlForw; fftw_plan FFTPlBackw; double * pFftwRealIn; double * pFftwRealOut; fftw_complex* pFftwComplexIn; fftw_complex* pFftwComplexOut; protected: void Clean(); bool bInitialized; }; /* Helpfunctions **************************************************************/ inline CReal Min(const CReal& rA, const CReal& rB) {return rA < rB ? rA : rB;} inline CMatlibVector Min(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), Min(rvA[i], rvB[i]));} CReal Min(const CMatlibVector& rvI); void Min(CReal& rMinVal /* out */, int& iMinInd /* out */, const CMatlibVector& rvI /* in */); inline CReal Min(const CReal& r1, const CReal& r2, const CReal& r3, const CReal& r4) {return Min(Min(Min(r1, r2), r3), r4);} inline CReal Min(const CReal& r1, const CReal& r2, const CReal& r3, const CReal& r4, const CReal& r5, const CReal& r6, const CReal& r7, const CReal& r8) {return Min(Min(Min(Min(Min(Min(Min(r1, r2), r3), r4), r5), r6), r7), r8);} inline CReal Max(const CReal& rA, const CReal& rB) {return rA > rB ? rA : rB;} inline CMatlibVector Max(const CMatlibVector& rvA, const CMatlibVector& rvB) {_VECOP(CReal, rvA.GetSize(), Max(rvA[i], rvB[i]));} CReal Max(const CMatlibVector& rvI); void Max(CReal& rMaxVal /* out */, int& iMaxInd /* out */, const CMatlibVector& rvI /* in */); inline CReal Max(const CReal& r1, const CReal& r2, const CReal& r3) {return Max(Max(r1, r2), r3);} inline CReal Max(const CReal& r1, const CReal& r2, const CReal& r3, const CReal& r4, const CReal& r5, const CReal& r6, const CReal& r7) {return Max(Max(Max(Max(Max(Max(r1, r2), r3), r4), r5), r6), r7);} inline CMatlibVector Ones(const int iLen) {_VECOP(CReal, iLen, (CReal) 1.0);} inline CMatlibVector Zeros(const int iLen) {_VECOP(CReal, iLen, (CReal) 0.0);} inline CReal Real(const CComplex& cI) {return cI.real();} inline CMatlibVector Real(const CMatlibVector& cvI) {_VECOP(CReal, cvI.GetSize(), Real(cvI[i]));} inline CReal Imag(const CComplex& cI) {return cI.imag();} inline CMatlibVector Imag(const CMatlibVector& cvI) {_VECOP(CReal, cvI.GetSize(), Imag(cvI[i]));} inline CComplex Conj(const CComplex& cI) {return conj(cI);} inline CMatlibVector Conj(const CMatlibVector& cvI) {_VECOP(CComplex, cvI.GetSize(), Conj(cvI[i]));} inline CMatlibMatrix Conj(const CMatlibMatrix& cmI) {_MATOP(CComplex, cmI.GetRowSize(), cmI.GetColSize(), Conj(cmI[i]));} /* Absolute and angle (argument) functions */ inline CReal Abs(const CReal& rI) {return fabs(rI);} inline CMatlibVector Abs(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Abs(fvI[i]));} inline CReal Abs(const CComplex& cI) {return abs(cI);} inline CMatlibVector Abs(const CMatlibVector& cvI) {_VECOP(CReal, cvI.GetSize(), Abs(cvI[i]));} inline CReal Angle(const CComplex& cI) {return arg(cI);} inline CMatlibVector Angle(const CMatlibVector& cvI) {_VECOP(CReal, cvI.GetSize(), Angle(cvI[i]));} /* Trigonometric functions */ inline CReal Sin(const CReal& fI) {return sin(fI);} template inline CMatlibVector Sin(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), sin(vecI[i]));} inline CReal Cos(const CReal& fI) {return cos(fI);} template inline CMatlibVector Cos(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), cos(vecI[i]));} inline CReal Tan(const CReal& fI) {return tan(fI);} template inline CMatlibVector Tan(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), tan(vecI[i]));} inline CReal Sinh(const CReal& fI) {return sinh(fI);} template inline CMatlibVector Sinh(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), sinh(vecI[i]));} inline CReal Cosh(const CReal& fI) {return cosh(fI);} template inline CMatlibVector Cosh(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), cosh(vecI[i]));} inline CReal Tanh(const CReal& fI) {return tanh(fI);} template inline CMatlibVector Tanh(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), tanh(vecI[i]));} /* Square root */ inline CReal Sqrt(const CReal& fI) {return sqrt(fI);} template inline CMatlibVector Sqrt(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), sqrt(vecI[i]));} /* Exponential function */ inline CReal Exp(const CReal& fI) {return exp(fI);} template inline CMatlibVector Exp(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), exp(vecI[i]));} /* Logarithm */ inline CReal Log(const CReal& fI) {return log(fI);} template inline CMatlibVector Log(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), log(vecI[i]));} inline CReal Log10(const CReal& fI) {return log10(fI);} template inline CMatlibVector Log10(const CMatlibVector& vecI) {_VECOP(T, vecI.GetSize(), log10(vecI[i]));} /* Mean, variance and standard deviation */ template inline T Mean(const CMatlibVector& vecI) {return Sum(vecI) / vecI.GetSize();} template inline T Std(CMatlibVector& vecI) {return Sqrt(Var(vecI));} template T Var(const CMatlibVector& vecI); /* Rounding functions */ inline CReal Fix(const CReal& fI) {return (int) fI;} inline CMatlibVector Fix(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Fix(fvI[i]));} inline CReal Floor(const CReal& fI) {return floor(fI);} inline CMatlibVector Floor(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Floor(fvI[i]));} inline CReal Ceil(const CReal& fI) {return ceil(fI);} inline CMatlibVector Ceil(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Ceil(fvI[i]));} inline CReal Round(const CReal& fI) {return Floor(fI + (CReal) 0.5);} inline CMatlibVector Round(const CMatlibVector& fvI) {_VECOP(CReal, fvI.GetSize(), Round(fvI[i]));} inline CReal Sign(const CReal& rI) {return rI == 0 ? 0 : rI > 0 ? 1 : -1;} inline int Mod(const int ix, const int iy) {return ix < 0 ? (ix % iy + iy) % iy : ix % iy;} template T Sum(const CMatlibVector& vecI); CMatlibVector Sort(const CMatlibVector& rvI); /* Matrix inverse */ CMatlibMatrix Inv(const CMatlibMatrix& matrI); /* Identity matrix */ CMatlibMatrix Eye(const int iLen); CMatlibMatrix Diag(const CMatlibVector& cvI); CReal Trace(const CMatlibMatrix& rmI); CMatlibMatrix Toeplitz(const CMatlibVector& cvI); /* Matrix transpose */ CMatlibMatrix Transp(const CMatlibMatrix& cmI); inline CMatlibMatrix TranspH(const CMatlibMatrix& cmI) {return Conj(Transp(cmI));} /* With conjugate complex */ /* Fourier transformations (also included: real FFT) */ CMatlibVector Fft(const CMatlibVector& cvI, const CFftPlans& FftPlans = CFftPlans()); CMatlibVector Ifft(const CMatlibVector& cvI, const CFftPlans& FftPlans = CFftPlans()); CMatlibVector rfft(const CMatlibVector& fvI, const CFftPlans& FftPlans = CFftPlans()); CMatlibVector rifft(const CMatlibVector& cvI, const CFftPlans& FftPlans = CFftPlans()); CMatlibVector FftFilt(const CMatlibVector& rvH, const CMatlibVector& rvI, CMatlibVector& rvZ, const CFftPlans& FftPlans = CFftPlans()); /* Numerical integration */ typedef CComplex(MATLIB_CALLBACK_QAUD)(CReal rX); /* Callback function definition */ CComplex Quad(MATLIB_CALLBACK_QAUD f, const CReal a, const CReal b, const CReal errorBound = 1.e-6); /* Implementation ************************************************************** (the implementation of template classes must be in the header file!) */ template inline T Sum(const CMatlibVector& vecI) { const int iSize = vecI.GetSize(); T SumRet = 0; for (int i = 0; i < iSize; i++) SumRet += vecI[i]; return SumRet; } template inline T Var(const CMatlibVector& vecI) { const int iSize = vecI.GetSize(); /* First calculate mean */ T tMean = Mean(vecI); /* Now variance (sum formula) */ T tRet = 0; for (int i = 0; i < iSize; i++) tRet += (vecI[i] - tMean) * (vecI[i] - tMean); return tRet / (iSize - 1); /* Normalizing */ } #endif /* _MATLIB_STD_TOOLBOX_H_ */ qsstv_9.2.6/qsstv/drmtx/common/mlc/BitInterleaver.cpp0000664000175000017500000001103713203343610021433 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * The two parts with different protection levels shall not overlap in the * interleaving process. Therefore the interleaved lower protected part shall * be appended to the interleaved higher protected part. * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "BitInterleaver.h" /* Implementation *************************************************************/ /******************************************************************************\ * Bit interleaver * \******************************************************************************/ void CBitInterleaver::Interleave(CVector<_DECISION>& InputData) { int i; /* Block 1 -------------------------------------------------------------- */ /* Interleave data according the interleaver table */ for (i = 0; i < ix_in1; i++) vecInterlMemory1[i] = InputData[veciIntTable1[i]]; /* Copy result in input-vector */ for (i = 0; i < ix_in1; i++) InputData[i] = vecInterlMemory1[i]; /* Block 2 -------------------------------------------------------------- */ /* Interleave data according the interleaver table */ for (i = 0; i < ix_in2; i++) vecInterlMemory2[i] = InputData[veciIntTable2[i] + ix_in1]; /* Copy result in input-vector */ for (i = 0; i < ix_in2; i++) InputData[i + ix_in1] = vecInterlMemory2[i]; } void CBitInterleaver::Init(int iNewx_in1, int iNewx_in2, int it_0) { /* Set internal parameters */ ix_in1 = iNewx_in1; ix_in2 = iNewx_in2; /* ix_in1 can be 0 but ix_in2 is always greater than "0" */ if (ix_in1 > 0) { /* Allocate memory for table */ veciIntTable1.Init(ix_in1); /* Make interleaver table */ MakeTable(veciIntTable1, ix_in1, it_0); /* Allocate memory for interleaver */ vecInterlMemory1.Init(ix_in1); } /* Allocate memory for table */ veciIntTable2.Init(ix_in2); /* Make interleaver table */ MakeTable(veciIntTable2, ix_in2, it_0); /* Allocate memory for interleaver */ vecInterlMemory2.Init(ix_in2); } /******************************************************************************\ * Bit deinterleaver * \******************************************************************************/ void CBitDeinterleaver::Deinterleave(CVector& vecInput) { int i; /* Block 1 -------------------------------------------------------------- */ /* Deinterleave data according the deinterleaver table */ for (i = 0; i < ix_in1; i++) vecDeinterlMemory1[veciIntTable1[i]] = vecInput[i]; /* Copy result in input-vector */ for (i = 0; i < ix_in1; i++) vecInput[i] = vecDeinterlMemory1[i]; /* Block 2 -------------------------------------------------------------- */ /* Deinterleave data according the deinterleaver table */ for (i = 0; i < ix_in2; i++) vecDeinterlMemory2[veciIntTable2[i]] = vecInput[i + ix_in1]; /* Copy result in input-vector */ for (i = 0; i < ix_in2; i++) vecInput[i + ix_in1] = vecDeinterlMemory2[i]; } void CBitDeinterleaver::Init(int iNewx_in1, int iNewx_in2, int it_0) { /* Set internal parameters */ ix_in1 = iNewx_in1; ix_in2 = iNewx_in2; /* ix_in1 can be 0 but ix_in2 is always greater than "0" */ if (ix_in1 > 0) { /* Allocate memory for table */ veciIntTable1.Init(ix_in1); /* Make interleaver table */ MakeTable(veciIntTable1, ix_in1, it_0); /* Allocate memory for interleaver */ vecDeinterlMemory1.Init(ix_in1); } /* Allocate memory for table */ veciIntTable2.Init(ix_in2); /* Make interleaver table */ MakeTable(veciIntTable2, ix_in2, it_0); /* Allocate memory for interleaver */ vecDeinterlMemory2.Init(ix_in2); } qsstv_9.2.6/qsstv/drmtx/common/mlc/BitInterleaver.h0000664000175000017500000000446713203343610021111 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(BIT_INTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define BIT_INTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../interleaver/BlockInterleaver.h" #include "utils/vector.h" /* Classes ********************************************************************/ class CBitInterleaver: public CBlockInterleaver { public: CBitInterleaver() {} virtual ~CBitInterleaver() {} void Init(int iNewx_in1, int iNewx_in2, int it_0); void Interleave(CVector<_DECISION>& InputData); protected: int ix_in1; int ix_in2; CVector veciIntTable1; CVector veciIntTable2; CVector<_DECISION> vecInterlMemory1; CVector<_DECISION> vecInterlMemory2; }; class CBitDeinterleaver: public CBlockInterleaver { public: CBitDeinterleaver() {} virtual ~CBitDeinterleaver() {} void Init(int iNewx_in1, int iNewx_in2, int it_0); void Deinterleave(CVector& vecInput); protected: int ix_in1; int ix_in2; CVector veciIntTable1; CVector veciIntTable2; CVector vecDeinterlMemory1; CVector vecDeinterlMemory2; }; #endif // !defined(BIT_INTERLEAVER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/mlc/ChannelCode.cpp0000664000175000017500000001337713203343610020670 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "ChannelCode.h" /* Implementation *************************************************************/ CVector CChannelCode::GenPuncPatTable(ECodScheme eNewCodingScheme, EChanType eNewChannelType, int iN1, int iN2, int iNewNumOutBitsPartA, int iNewNumOutBitsPartB, int iPunctPatPartA, int iPunctPatPartB, int iLevel) { int i; int iNumOutBits; int iNumOutBitsWithMemory; int iTailbitPattern; int iTailbitParamL0; int iTailbitParamL1; int iPartAPatLen; int iPartBPatLen; int iPunctCounter; CVector veciPuncPatPartA; CVector veciPuncPatPartB; CVector veciTailBitPat; CVector veciReturn; /* Number of bits out is the sum of all protection levels */ iNumOutBits = iNewNumOutBitsPartA + iNewNumOutBitsPartB; /* Number of out bits including the state memory */ iNumOutBitsWithMemory = iNumOutBits + MC_CONSTRAINT_LENGTH - 1; /* Init vector, storing table for puncturing pattern */ veciReturn.Init(iNumOutBitsWithMemory); /* Set tail-bit pattern ------------------------------------------------- */ /* We have to consider two cases because in HSYM "N1 + N2" is used instead of only "N2" to calculate the tailbit pattern */ switch (eNewCodingScheme) { case CS_3_HMMIX: iTailbitParamL0 = iN1 + iN2; iTailbitParamL1 = iN2; break; case CS_3_HMSYM: iTailbitParamL0 = 2 * (iN1 + iN2); iTailbitParamL1 = 2 * iN2; break; default: iTailbitParamL0 = 2 * iN2; iTailbitParamL1 = 2 * iN2; } /* Tailbit pattern calculated according DRM-standard. We have to consider two cases because in HSYM "N1 + N2" is used instead of only "N2" */ if (iLevel == 0) iTailbitPattern = iTailbitParamL0 - 12 - iPuncturingPatterns[iPunctPatPartB][1] * (int) ((iTailbitParamL0 - 12) / iPuncturingPatterns[iPunctPatPartB][1]); else iTailbitPattern = iTailbitParamL1 - 12 - iPuncturingPatterns[iPunctPatPartB][1] * (int) ((iTailbitParamL1 - 12) / iPuncturingPatterns[iPunctPatPartB][1]); /* Set puncturing bit patterns and lengths ------------------------------ */ /* Lengths */ iPartAPatLen = iPuncturingPatterns[iPunctPatPartA][0]; iPartBPatLen = iPuncturingPatterns[iPunctPatPartB][0]; /* Vector, storing patterns for part A. Patterns begin at [][2 + x] */ veciPuncPatPartA.Init(iPartAPatLen); for (i = 0; i < iPartAPatLen; i++) veciPuncPatPartA[i] = iPuncturingPatterns[iPunctPatPartA][2 + i]; /* Vector, storing patterns for part B. Patterns begin at [][2 + x] */ veciPuncPatPartB.Init(iPartBPatLen); for (i = 0; i < iPartBPatLen; i++) veciPuncPatPartB[i] = iPuncturingPatterns[iPunctPatPartB][2 + i]; /* Vector, storing patterns for tailbit pattern */ veciTailBitPat.Init(LENGTH_TAIL_BIT_PAT); for (i = 0; i < LENGTH_TAIL_BIT_PAT; i++) veciTailBitPat[i] = iPunctPatTailbits[iTailbitPattern][i]; /* Generate actual table for puncturing pattern ------------------------- */ /* Reset counter for puncturing */ iPunctCounter = 0; for (i = 0; i < iNumOutBitsWithMemory; i++) { if (i < iNewNumOutBitsPartA) { /* Puncturing patterns part A */ /* Get current pattern */ veciReturn[i] = veciPuncPatPartA[iPunctCounter]; /* Increment index and take care of wrap around */ iPunctCounter++; if (iPunctCounter == iPartAPatLen) iPunctCounter = 0; } else { /* In case of FAC do not use special tailbit-pattern! */ if ((i < iNumOutBits) || (eNewChannelType == CT_FAC)) { /* Puncturing patterns part B */ /* Reset counter when beginning of part B is reached */ if (i == iNewNumOutBitsPartA) iPunctCounter = 0; /* Get current pattern */ veciReturn[i] = veciPuncPatPartB[iPunctCounter]; /* Increment index and take care of wrap around */ iPunctCounter++; if (iPunctCounter == iPartBPatLen) iPunctCounter = 0; } else { /* Tailbits */ /* Check when tailbit pattern starts */ if (i == iNumOutBits) iPunctCounter = 0; /* Set tailbit pattern */ veciReturn[i] = veciTailBitPat[iPunctCounter]; /* No test for wrap around needed, since there ist only one cycle of this pattern */ iPunctCounter++; } } } return veciReturn; } CChannelCode::CChannelCode() { /* Create table for parity bit */ for (int j = 0; j < 1 << SIZEOF__BYTE; j++) { /* XOR all bits in byResult. We observe always the LSB by masking using operator "& 1". To get access to all bits in "byResult" we shift the current bit so long until it reaches the mask (at zero) by using operator ">> i". The actual XOR operation is done by "^=" */ vecbiParity[j] = 0; for (int i = 0; i < MC_CONSTRAINT_LENGTH; i++) vecbiParity[j] ^= (j >> i) & 1; } } qsstv_9.2.6/qsstv/drmtx/common/mlc/ChannelCode.h0000664000175000017500000000456713203343610020336 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(CHANNEL_CODE_H__3B0BA660_CA63345347A0D31912__INCLUDED_) #define CHANNEL_CODE_H__3B0BA660_CA63345347A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../tables/TableMLC.h" #include "utils/vector.h" #include "../Parameter.h" /* Classes ********************************************************************/ class CChannelCode { public: CChannelCode(); virtual ~CChannelCode() {} inline _BINARY Convolution(const _BYTE byNewStateShiftReg, const int iGenPolyn) const { /* Mask bits with generator polynomial and get convolution result from pre-calculated table (speed optimization). Since we have a AND operation on the "byGeneratorMatrix", the index of the convolution table cannot exceed the size of the table (although the value in "byNewStateShiftReg" can be larger) */ return vecbiParity[byNewStateShiftReg & byGeneratorMatrix[iGenPolyn]]; } CVector GenPuncPatTable(ECodScheme eNewCodingScheme, EChanType eNewChannelType, int iN1, int iN2, int iNewNumOutBitsPartA, int iNewNumOutBitsPartB, int iPunctPatPartA, int iPunctPatPartB, int iLevel); private: _BINARY vecbiParity[1 << SIZEOF__BYTE]; }; #endif // !defined(CHANNEL_CODE_H__3B0BA660_CA63345347A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/mlc/ConvEncoder.cpp0000664000175000017500000001630713203343610020726 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * Note: We always shift the bits towards the MSB * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "ConvEncoder.h" /* Implementation *************************************************************/ int CConvEncoder::Encode(CVector<_DECISION>& vecInputData, CVector<_DECISION>& vecOutputData) { /* Set output size to zero, increment it each time a new bit is encoded */ int iOutputCnt = 0; /* Reset counter for puncturing and state-register */ _BYTE byStateShiftReg = 0; #ifdef USE_MAX_LOG_MAP /* We know the initial state of the shift registers, therefore a very high soft information value */ vecStateMem.Reset(ML_SOFT_INF_MAX_VALUE); #endif for (int i = 0; i < iNumInBitsWithMemory; i++) { /* Update shift-register (state information) ------------------------ */ /* Shift bits in state-shift-register */ byStateShiftReg <<= 1; /* Tailbits are calculated in this loop. Check when end of vector is reached and no more bits must be added */ if (i < iNumInBits) { /* Add new bit at the beginning */ if (ExtractBit(vecInputData[i]) != 0) byStateShiftReg |= 1; #ifdef USE_MAX_LOG_MAP /* Update shift register for soft information. We assume here that the decision type is some floating point type -> we use fabs() function */ vecStateMem.AddBegin(fabs(vecInputData[i])); #endif } /* Puncturing ------------------------------------------------------- */ /* Depending on the current puncturing pattern, different numbers of output bits are generated. The state shift register "byStateShiftReg" is convoluted with the respective patterns for this bit (is done inside the convolution function) */ #ifdef USE_MAX_LOG_MAP switch (veciTablePuncPat[i]) { case PP_TYPE_0001: /* Pattern 0001 */ vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 0); break; case PP_TYPE_0101: /* Pattern 0101 */ vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 0); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 2); break; case PP_TYPE_0011: /* Pattern 0011 */ vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 0); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 1); break; case PP_TYPE_0111: /* Pattern 0111 */ vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 0); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 1); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 2); break; case PP_TYPE_1111: /* Pattern 1111 */ vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 0); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 1); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 2); vecOutputData[iOutputCnt++] = SoftConvolution(byStateShiftReg, vecStateMem, 3); break; } #else switch (veciTablePuncPat[i]) { case PP_TYPE_0001: /* Pattern 0001 */ vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 0); break; case PP_TYPE_0101: /* Pattern 0101 */ vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 0); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 2); break; case PP_TYPE_0011: /* Pattern 0011 */ vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 0); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 1); break; case PP_TYPE_0111: /* Pattern 0111 */ vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 0); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 1); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 2); break; case PP_TYPE_1111: /* Pattern 1111 */ vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 0); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 1); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 2); vecOutputData[iOutputCnt++] = Convolution(byStateShiftReg, 3); break; } #endif } /* Return number of encoded bits */ return iOutputCnt; } #ifdef USE_MAX_LOG_MAP _DECISION CConvEncoder::SoftConvolution(const _BYTE byNewStateShiftReg, CShiftRegister<_DECISION>& vecStateMem, const int iGenPolyn) { _DECISION decSoftOut; /* Search for minimum norm value of input soft-informations. Here we implement the convolution of the soft information independent of the poylnoms stored in "byGeneratorMatrix[]"! When changing the polynoms, it has to be changed here, too */ switch (iGenPolyn) { case 0: case 3: /* oct: 0155 -> 1101101 */ decSoftOut = Min(Min(Min(Min(vecStateMem[0], vecStateMem[2]), vecStateMem[3]), vecStateMem[5]), vecStateMem[6]); break; case 1: /* oct: 0117 -> 1001111 */ decSoftOut = Min(Min(Min(Min(vecStateMem[0], vecStateMem[1]), vecStateMem[2]), vecStateMem[3]), vecStateMem[6]); break; case 2: /* oct: 0123 -> 1010011 */ decSoftOut = Min(Min(Min(vecStateMem[0], vecStateMem[1]), vecStateMem[4]), vecStateMem[6]); break; } /* Hard decision defines the sign, the norm is defined by the minimum of input norms of soft informations using max-log approximation */ if (Convolution(byNewStateShiftReg, iGenPolyn) == 0) return -decSoftOut; else return decSoftOut; } #endif void CConvEncoder::Init(ECodScheme eNewCodingScheme, EChanType eNewChannelType, int iN1, int iN2, int iNewNumInBitsPartA, int iNewNumInBitsPartB, int iPunctPatPartA, int iPunctPatPartB, int iLevel) { /* Number of bits out is the sum of all protection levels */ iNumInBits = iNewNumInBitsPartA + iNewNumInBitsPartB; /* Number of out bits including the state memory */ iNumInBitsWithMemory = iNumInBits + MC_CONSTRAINT_LENGTH - 1; /* Init vector, storing table for puncturing pattern and generate pattern */ veciTablePuncPat.Init(iNumInBitsWithMemory); veciTablePuncPat = GenPuncPatTable(eNewCodingScheme, eNewChannelType, iN1, iN2, iNewNumInBitsPartA, iNewNumInBitsPartB, iPunctPatPartA, iPunctPatPartB, iLevel); #ifdef USE_MAX_LOG_MAP vecStateMem.Init(MC_CONSTRAINT_LENGTH); #endif } qsstv_9.2.6/qsstv/drmtx/common/mlc/ConvEncoder.h0000664000175000017500000000440513203343610020367 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(CONNVOL_ENC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define CONNVOL_ENC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../tables/TableMLC.h" #include "utils/vector.h" #include "../Parameter.h" #include "ChannelCode.h" /* Classes ********************************************************************/ class CConvEncoder : public CChannelCode { public: CConvEncoder() {} virtual ~CConvEncoder() {} int Encode(CVector<_DECISION>& vecInputData, CVector<_DECISION>& vecOutputData); void Init(ECodScheme eNewCodingScheme, EChanType eNewChannelType, int iN1, int iN2, int iNewNumInBitsPartA, int iNewNumInBitsPartB, int iPunctPatPartA, int iPunctPatPartB, int iLevel); protected: int iNumInBits; int iNumInBitsWithMemory; CVector veciTablePuncPat; EChanType eChannelType; #ifdef USE_MAX_LOG_MAP CShiftRegister<_DECISION> vecStateMem; _DECISION SoftConvolution(const _BYTE byNewStateShiftReg, CShiftRegister<_DECISION>& vecStateMem, const int iGenPolyn); #endif }; #endif // !defined(CONNVOL_ENC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/mlc/EnergyDispersal.cpp0000664000175000017500000000541513203343610021617 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * Note: * Input data stream is divided into a regluar stream and the VSPP stream. * Both stream are treated independently. The respective positions of the * two streams are requested in the init-routine. * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "EnergyDispersal.h" /* Implementation *************************************************************/ void CEngergyDispersal::ProcessData(CVector<_BINARY>* pbiData) { int i; uint32_t iTempShiftRegister; _BINARY biPRBSbit; /* Init shift register and set all registers to "1" with bit-wise not-operation */ iShiftRegisterSPP = ~uint32_t(0); iShiftRegisterVSPP = ~uint32_t(0); /* Main routine */ for (i = 0; i < iNumInBits; i++) { if (i < iEndIndVSPP) { /* Calculate new PRBS bit */ iTempShiftRegister = iShiftRegisterVSPP; /* P(X) = X^9 + X^5 + 1, in this implementation we have to shift n-1! */ biPRBSbit = _BINARY(((iTempShiftRegister >> 4) & 1) ^ ((iTempShiftRegister >> 8) & 1)); /* Shift bits in shift register and add new bit */ iShiftRegisterVSPP <<= 1; iShiftRegisterVSPP |= (biPRBSbit & 1); } else { /* Calculate new PRBS bit */ iTempShiftRegister = iShiftRegisterSPP; /* P(X) = X^9 + X^5 + 1, in this implementation we have to shift n-1! */ biPRBSbit = _BINARY(((iTempShiftRegister >> 4) & 1) ^ ((iTempShiftRegister >> 8) & 1)); /* Shift bits in shift register and add new bit */ iShiftRegisterSPP <<= 1; iShiftRegisterSPP |= (biPRBSbit & 1); } /* Apply PRBS to the data-stream */ (*pbiData)[i] ^= biPRBSbit; } } void CEngergyDispersal::Init(int iNewNumInBits, int iNewLengthVSPP) { /* Set the internal parameters */ iNumInBits = iNewNumInBits; iEndIndVSPP = iNewLengthVSPP; } qsstv_9.2.6/qsstv/drmtx/common/mlc/EnergyDispersal.h0000664000175000017500000000345313203343610021264 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(ENERGYDISPERSAL_H__3B0BA660_CA63_4344_2B_23453E7A0D31912__INCLUDED_) #define ENERGYDISPERSAL_H__3B0BA660_CA63_4344_2B_23453E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "utils/vector.h" /* Classes ********************************************************************/ class CEngergyDispersal { public: CEngergyDispersal() {} virtual ~CEngergyDispersal() {} void ProcessData(CVector<_BINARY>* pbiData); void Init(int iNewNumInBits, int iNewLengthVSPP); protected: int iNumInBits; int iStartIndVSPP; int iEndIndVSPP; uint32_t iShiftRegisterSPP; uint32_t iShiftRegisterVSPP; }; #endif // !defined(ENERGYDISPERSAL_H__3B0BA660_CA63_4344_2B_23453E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/mlc/MLC.cpp0000664000175000017500000003325713203343610017137 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * * Description: * Multi-level-channel (de)coder (MLC) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "MLC.h" #define NUM_FAC_CELLS 45 /* Implementation *************************************************************/ /******************************************************************************\ * MLC-encoder * \******************************************************************************/ void CMLCEncoder::ProcessDataInternal(CParameter&) { int i, j; int iElementCounter; /* Energy dispersal ----------------------------------------------------- */ /* VSPP is treated as a separate part for energy dispersal */ EnergyDisp.ProcessData(pvecInputData); /* Partitioning of input-stream ----------------------------------------- */ iElementCounter = 0; if (iL[2] == 0) { /* Standard departitioning */ /* Protection level A */ for (j = 0; j < iLevels; j++) { /* Bits */ for (i = 0; i < iM[j][0]; i++) { vecEncInBuffer[j][i] = // BitToSoft((*pvecInputData)[iElementCounter]); (*pvecInputData)[iElementCounter]; iElementCounter++; } } /* Protection level B */ for (j = 0; j < iLevels; j++) { /* Bits */ for (i = 0; i < iM[j][1]; i++) { vecEncInBuffer[j][iM[j][0] + i] = // BitToSoft((*pvecInputData)[iElementCounter]); (*pvecInputData)[iElementCounter]; iElementCounter++; } } } else { /* Special partitioning with hierarchical modulation. First set hierarchical bits at the beginning, then append the rest */ /* Hierarchical frame (always "iM[0][1]"). "iM[0][0]" is always "0" in this case */ for (i = 0; i < iM[0][1]; i++) { vecEncInBuffer[0][i] = // BitToSoft((*pvecInputData)[iElementCounter]); (*pvecInputData)[iElementCounter]; iElementCounter++; } /* Protection level A (higher protected part) */ for (j = 1; j < iLevels; j++) { /* Bits */ for (i = 0; i < iM[j][0]; i++) { vecEncInBuffer[j][i] = // BitToSoft((*pvecInputData)[iElementCounter]); (*pvecInputData)[iElementCounter]; iElementCounter++; } } /* Protection level B (lower protected part) */ for (j = 1; j < iLevels; j++) { /* Bits */ for (i = 0; i < iM[j][1]; i++) { vecEncInBuffer[j][iM[j][0] + i] = // BitToSoft((*pvecInputData)[iElementCounter]); (*pvecInputData)[iElementCounter]; iElementCounter++; } } } /* Convolutional encoder ------------------------------------------------ */ for (j = 0; j < iLevels; j++) ConvEncoder[j].Encode(vecEncInBuffer[j], vecEncOutBuffer[j]); /* Bit interleaver ------------------------------------------------------ */ for (j = 0; j < iLevels; j++) if (piInterlSequ[j] != -1) BitInterleaver[piInterlSequ[j]].Interleave(vecEncOutBuffer[j]); /* QAM mapping ---------------------------------------------------------- */ QAMMapping.Map(vecEncOutBuffer[0], vecEncOutBuffer[1], vecEncOutBuffer[2], vecEncOutBuffer[3], vecEncOutBuffer[4], vecEncOutBuffer[5], pvecOutputData); } void CMLCEncoder::InitInternal(CParameter& TransmParam) { int i; int iNumInBits; TransmParam.Lock(); CalculateParam(TransmParam, eChannelType); TransmParam.Unlock(); iNumInBits = iL[0] + iL[1] + iL[2]; /* Init modules --------------------------------------------------------- */ /* Energy dispersal */ EnergyDisp.Init(iNumInBits, iL[2]); /* Encoder */ for (i = 0; i < iLevels; i++) ConvEncoder[i].Init(eCodingScheme, eChannelType, iN[0], iN[1], iM[i][0], iM[i][1], iCodeRate[i][0], iCodeRate[i][1], i); /* Bit interleaver */ /* First init all possible interleaver (According table "TableMLC.h" -> "Interleaver sequence") */ if (eCodingScheme == CS_3_HMMIX) { BitInterleaver[0].Init(iN[0], iN[1], 13); BitInterleaver[1].Init(iN[0], iN[1], 21); } else { BitInterleaver[0].Init(2 * iN[0], 2 * iN[1], 13); BitInterleaver[1].Init(2 * iN[0], 2 * iN[1], 21); } /* QAM-mapping */ QAMMapping.Init(iN_mux, eCodingScheme); /* Allocate memory for internal bit-buffers ----------------------------- */ for (i = 0; i < iLevels; i++) { /* Buffers for each encoder on all different levels */ /* Add bits from higher protected and lower protected part */ vecEncInBuffer[i].Init(iM[i][0] + iM[i][1]); /* Encoder output buffers for all levels. Must have the same length */ vecEncOutBuffer[i].Init(iNumEncBits); } /* Define block-size for input and output */ iInputBlockSize = iNumInBits; iOutputBlockSize = iN_mux; // printf("In init MSCMLCEnc inputblk = %d outpublk = %d\n", // iInputBlockSize, iOutputBlockSize); } /******************************************************************************\ * MLC base class * \******************************************************************************/ void CMLC::CalculateParam(CParameter& Parameter, int iNewChannelType) { int i; // int iMSCDataLenPartA; switch (iNewChannelType) { /* FAC ********************************************************************/ case CT_FAC: eCodingScheme = CS_1_SM; iN_mux = NUM_FAC_CELLS; iNumEncBits = NUM_FAC_CELLS * 2; iLevels = 1; /* Code rates for prot.-Level A and B for each level */ /* Protection Level A */ iCodeRate[0][0] = 0; /* Protection Level B */ iCodeRate[0][1] = iCodRateCombFDC4SM; /* Define interleaver sequence for all levels */ piInterlSequ = iInterlSequ4SM; /* iN: Number of OFDM-cells of each protection level ---------------- */ iN[0] = 0; iN[1] = iN_mux; /* iM: Number of bits each level ------------------------------------ */ iM[0][0] = 0; iM[0][1] = NUM_FAC_BITS_PER_BLOCK; /* iL: Number of bits each protection level ------------------------- */ /* Higher protected part */ iL[0] = 0; /* Lower protected part */ iL[1] = iM[0][1]; /* Very strong protected part (VSPP) */ iL[2] = 0; break; /* MSC ********************************************************************/ case CT_MSC: eCodingScheme = Parameter.eMSCCodingScheme; iN_mux = Parameter.CellMappingTable.iNumUsefMSCCellsPerFrame; // printf("iN_mux %d \n", iN_mux); /* Data length for part A is the sum of all lengths of the streams */ // iMSCDataLenPartA = 0; // for hamversion /* iMSCDataLenPartA = Parameter.Stream[0].iLenPartA + Parameter.Stream[1].iLenPartA + Parameter.Stream[2].iLenPartA + Parameter.Stream[3].iLenPartA; */ switch (eCodingScheme) { case CS_1_SM: iLevels = 1; /* Code rates for prot.-Level A and B for each level */ /* Protection Level A */ iCodeRate[0][0] = 0; /* Protection Level B */ iCodeRate[0][1] = iCodRateCombMSC4SM; /* Define interleaver sequence for all levels */ piInterlSequ = iInterlSequ4SM; iNumEncBits = iN_mux * 2; /* iN: Number of OFDM-cells of each protection level ---------------- */ iN[0] = 0; iN[1] = iN_mux; /* iM: Number of bits each level ------------------------------------ */ iM[0][0] = 0; /* M_p,2 = RX_p * floor((2 * N_2 - 12) / RY_p) */ iM[0][1] = iPuncturingPatterns[iCodRateCombMSC4SM][0] * (int) ((_REAL) (2 * iN_mux - 12) / iPuncturingPatterns[iCodRateCombMSC4SM][1]); /* iL: Number of bits each protection level ------------------------- */ /* Higher protected part */ iL[0] = 0; /* Lower protected part */ iL[1] = iM[0][1]; /* Very strong protected part (VSPP) */ iL[2] = 0; /* printf("in CalcuPar CS_1_SM iN[0]= %d iN[1]= %d iM[0][0] = %d iM[0][1] = %d\n", iN[0], iN[1], iM[0][0], iM[0][1] ); printf("in CalcuPar iL[o]= %d iL[1]= %d iL[2] = %d\n", iL[0], iL[1], iL[1]); */ break; case CS_2_SM: iLevels = 2; /* Code rates for prot.-Level A and B for each level */ for (i = 0; i < 2; i++) { /* Protection Level A */ iCodeRate[i][0] = 0 ; // hamversion /* iCodeRate[i][0] = iCodRateCombMSC16SM[Parameter.MSCPrLe.iPartA][i]; */ /* Protection Level B */ iCodeRate[i][1] = iCodRateCombMSC16SM[Parameter.MSCPrLe.iPartB][i]; } /* Define interleaver sequence for all levels */ piInterlSequ = iInterlSequ16SM; iNumEncBits = iN_mux * 2; /* iN: Number of OFDM-cells of each protection level ------------ */ /* N_1 = ceil(8 * X / (2 * RY_Icm * sum(R_p)) * RY_Icm */ iN[0] = 0; // hamversion /* iN[0] = (int) ceil(8 * (_REAL) iMSCDataLenPartA / (2 * (_REAL) iCodRateCombMSC16SM[Parameter.MSCPrLe.iPartA][2] * ( (_REAL) iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][0]][0] / iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][0]][1] + (_REAL) iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][1]][0] / iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][1]][1]))) * iCodRateCombMSC16SM[Parameter.MSCPrLe.iPartA][2]; */ /* Check if result can be possible, if not -> correct. This can happen, if a wrong number is in "Param.Stream[x].iLenPartA" */ if (iN[0] > iN_mux) iN[0] = 0; iN[1] = iN_mux - iN[0]; /* iM: Number of bits each level -------------------------------- */ for (i = 0; i < 2; i++) { /* M_p,1 = 2 * N_1 * R_p */ iM[i][0] = 0; /* iM[i][0] = (int) (2 * iN[0] * (_REAL) iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][i]][0] / iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartA][i]][1]); */ /* M_p,2 = RX_p * floor((2 * N_2 - 12) / RY_p) */ iM[i][1] = iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartB][i]][0] * (int) ((_REAL) (2 * iN[1] - 12) / iPuncturingPatterns[iCodRateCombMSC16SM[ Parameter.MSCPrLe.iPartB][i]][1]); // printf("In calcparam iM[%d][0] = %d iM[%d][1] = %d \n", i, iM[i][0], i, iM[i][1]); } /* iL: Number of bits each protection level --------------------- */ /* Higher protected part */ iL[0] = iM[0][0] + iM[1][0]; /* Lower protected part */ iL[1] = iM[0][1] + iM[1][1]; /* Very strong protected part (VSPP) */ iL[2] = 0; /* printf("in CalcuPar CS_2_SM iN[0]= %d iN[1]= %d iM[0][0] = %d iM[0][1] = %d\n", iN[0], iN[1], iM[0][0], iM[0][1] ); printf("in CalcuPar iL[o]= %d iL[1]= %d iL[2] = %d\n", iL[0], iL[1], iL[1]); */ break; case CS_3_SM: iLevels = 3; /* Code rates for prot.-Level A and B for each level */ for (i = 0; i < 3; i++) { /* Protection Level A */ iCodeRate[i][0] = 0; /* iCodeRate[i][0] = iCodRateCombMSC64SM[Parameter.MSCPrLe.iPartA][i]; */ /* Protection Level B */ iCodeRate[i][1] = iCodRateCombMSC64SM[Parameter.MSCPrLe.iPartB][i]; } /* Define interleaver sequence for all levels */ piInterlSequ = iInterlSequ64SM; iNumEncBits = iN_mux * 2; /* iN: Number of OFDM-cells of each protection level ------------ */ /* N_1 = ceil(8 * X / (2 * RY_Icm * sum(R_p)) * RY_Icm */ iN[0] = 0; /* Check if result can be possible, if not -> correct. This can happen, if a wrong number is in "Param.Stream[x].iLenPartA" */ if (iN[0] > iN_mux) iN[0] = 0; iN[1] = iN_mux - iN[0]; /* iM: Number of bits each level -------------------------------- */ for (i = 0; i < 3; i++) { /* M_p,1 = 2 * N_1 * R_p */ iM[i][0] = 0; /* iM[i][0] = (int) (2 * iN[0] * (_REAL) iPuncturingPatterns[iCodRateCombMSC64SM[ Parameter.MSCPrLe.iPartA][i]][0] / iPuncturingPatterns[iCodRateCombMSC64SM[ Parameter.MSCPrLe.iPartA][i]][1]); */ /* M_p,2 = RX_p * floor((2 * N_2 - 12) / RY_p) */ iM[i][1] = iPuncturingPatterns[iCodRateCombMSC64SM[ Parameter.MSCPrLe.iPartB][i]][0] * (int) ((_REAL) (2 * iN[1] - 12) / iPuncturingPatterns[iCodRateCombMSC64SM[ Parameter.MSCPrLe.iPartB][i]][1]); } /* iL: Number of bits each protection level --------------------- */ /* Higher protected part */ iL[0] = iM[0][0] + iM[1][0] + iM[2][0]; /* Lower protected part */ iL[1] = iM[0][1] + iM[1][1] + iM[2][1]; /* Very strong protected part (VSPP) */ iL[2] = 0; /* printf("in CalcuPar CS_3_SM iN[0]= %d iN[1]= %d iM[0][0] = %d iM[0][1] = %d\n", iN[0], iN[1], iM[0][0], iM[0][1] ); printf("in CalcuPar iL[o]= %d iL[1]= %d iL[2] = %d\n", iL[0], iL[1], iL[2]); */ break; default: break; } /* Set number of output bits for next module */ Parameter.SetNumDecodedBitsMSC(iL[0] + iL[1] + iL[2]); /* Set total number of bits for hiearchical frame (needed for MSC demultiplexer module) */ Parameter.SetNumBitsHieraFrTot(iL[2]); // Parameter.DataParam.iPacketLen = 1234; break; } } qsstv_9.2.6/qsstv/drmtx/common/mlc/MLC.h0000664000175000017500000000744013203343610016577 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See MLC.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(MLC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define MLC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../util/Modul.h" #include "../Parameter.h" #include "../tables/TableMLC.h" #include "../tables/TableCarMap.h" #include "ConvEncoder.h" //#include "ViterbiDecoder.h" //#include "Metric.h" #include "BitInterleaver.h" #include "QAMMapping.h" #include "EnergyDispersal.h" /* Classes ********************************************************************/ class CMLC { public: CMLC() : iN_mux(0), eChannelType(CT_MSC) {} virtual ~CMLC() {} void CalculateParam(CParameter& Parameter, int iNewChannelType); protected: int iLevels; /* No input bits for each level. First index: Level, second index: Protection level. For three levels: [M_0,l M_1,l M2,l] For six levels: [M_0,lRe M_0,lIm M_1,lRe M_1,lIm M_2,lRe ... ] */ int iM[MC_MAX_NUM_LEVELS][2]; int iN[2]; int iL[3]; int iN_mux; int iCodeRate[MC_MAX_NUM_LEVELS][2]; const int* piInterlSequ; int iNumEncBits; EChanType eChannelType; ECodScheme eCodingScheme; }; class CMLCEncoder : public CTransmitterModul<_BINARY, _COMPLEX>, public CMLC { public: CMLCEncoder() {} virtual ~CMLCEncoder() {} protected: CConvEncoder ConvEncoder[MC_MAX_NUM_LEVELS]; /* Two different types of interleaver table */ CBitInterleaver BitInterleaver[2]; CQAMMapping QAMMapping; CEngergyDispersal EnergyDisp; /* Internal buffers */ CVector<_DECISION> vecEncInBuffer[MC_MAX_NUM_LEVELS]; CVector<_DECISION> vecEncOutBuffer[MC_MAX_NUM_LEVELS]; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& Parameter); }; /******************************************************************************\ * Customized channel (de-)coders * \******************************************************************************/ class CMSCMLCEncoder : public CMLCEncoder { protected: virtual void InitInternal(CParameter& TransmParam) { /* Set corresponding type */ eChannelType = CT_MSC; /* Call init in encoder */ CMLCEncoder::InitInternal(TransmParam); }; }; class CSDCMLCEncoder : public CMLCEncoder { protected: virtual void InitInternal(CParameter& TransmParam) { /* Set corresponding type */ eChannelType = CT_SDC; /* Call init in encoder */ CMLCEncoder::InitInternal(TransmParam); }; }; class CFACMLCEncoder : public CMLCEncoder { protected: virtual void InitInternal(CParameter& TransmParam) { /* Set corresponding type */ eChannelType = CT_FAC; /* Call init in encoder */ CMLCEncoder::InitInternal(TransmParam); }; }; #endif // !defined(MLC_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/mlc/QAMMapping.cpp0000664000175000017500000001436413203343610020454 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "QAMMapping.h" /* Implementation *************************************************************/ void CQAMMapping::Map(CVector<_DECISION>& vecInputData1, CVector<_DECISION>& vecInputData2, CVector<_DECISION>& vecInputData3, CVector<_DECISION>& vecInputData4, CVector<_DECISION>& vecInputData5, CVector<_DECISION>& vecInputData6, CVector<_COMPLEX>* pcOutputData) { /* We always use "& 1" when we combine binary values with logical operators for safety reasons. */ int i; int iIndexReal; int iIndexImag; switch (eMapType) { case CS_1_SM: /* 4QAM ------------------------------------------------------------- */ /* Mapping according DRM-standard: {i_0 q_0} = (y'_0 y'_1) = (y_0,0 y_0,1) */ for (i = 0; i < iOutputBlockSize; i++) { (*pcOutputData)[i] = _COMPLEX( /* Odd entries (second column in "rTableQAM4") */ rTableQAM4[ExtractBit(vecInputData1[2 * i]) & 1][0], /* Even entries in input-vector */ rTableQAM4[ExtractBit(vecInputData1[2 * i + 1]) & 1][1]); } break; case CS_2_SM: /* 16QAM ------------------------------------------------------------ */ /* Mapping according DRM-standard: {i_0 i_1 q_0 q_1} = (y_0,0 y_1,0 y_0,1 y_1,1) */ for (i = 0; i < iOutputBlockSize; i++) { const int i2i = 2 * i; const int i2ip1 = 2 * i + 1; /* Filling indices [y_0,0, y_1,0]. Incoming bits are shifted to their desired positions in the integer variables "iIndexImag" and "iIndexReal" and combined */ iIndexReal = ((ExtractBit(vecInputData1[i2i]) & 1) << 1) | (ExtractBit(vecInputData2[i2i]) & 1); iIndexImag = ((ExtractBit(vecInputData1[i2ip1]) & 1) << 1) | (ExtractBit(vecInputData2[i2ip1]) & 1); (*pcOutputData)[i] = /* Odd entries (second column in "rTableQAM16") */ _COMPLEX(rTableQAM16[iIndexReal][0], /* Even entries in input-vector */ rTableQAM16[iIndexImag][1]); } break; case CS_3_SM: /* 64QAM SM --------------------------------------------------------- */ /* Mapping according DRM-standard: {i_0 i_1 i_2 q_0 q_1 q_2} = (y_0,0 y_1,0 y_2,0 y_0,1 y_1,1 y_2,1) */ for (i = 0; i < iOutputBlockSize; i++) { const int i2i = 2 * i; const int i2ip1 = 2 * i + 1; /* Filling indices [y_0,0, y_1,0, y_2,0]. Incoming bits are shifted to their desired positions in the integer variables "iIndexImag" and "iIndexReal" and combined */ iIndexReal = ((ExtractBit(vecInputData1[i2i]) & 1) << 2) | ((ExtractBit(vecInputData2[i2i]) & 1) << 1) | (ExtractBit(vecInputData3[i2i]) & 1); iIndexImag = ((ExtractBit(vecInputData1[i2ip1]) & 1) << 2) | ((ExtractBit(vecInputData2[i2ip1]) & 1) << 1) | (ExtractBit(vecInputData3[i2ip1]) & 1); (*pcOutputData)[i] = /* Odd entries (second column in "rTableQAM64SM") */ _COMPLEX(rTableQAM64SM[iIndexReal][0], /* Even entries in input-vector */ rTableQAM64SM[iIndexImag][1]); } break; case CS_3_HMSYM: /* 64QAM HMsym ------------------------------------------------------ */ /* Mapping according DRM-standard: {i_0 i_1 i_2 q_0 q_1 q_2} = (y_0,0 y_1,0 y_2,0 y_0,1 y_1,1 y_2,1) */ for (i = 0; i < iOutputBlockSize; i++) { const int i2i = 2 * i; const int i2ip1 = 2 * i + 1; /* Filling indices [y_0,0, y_1,0, y_2,0]. Incoming bits are shifted to their desired positions in the integer variables "iIndexImag" and "iIndexReal" and combined */ iIndexReal = ((ExtractBit(vecInputData1[i2i]) & 1) << 2) | ((ExtractBit(vecInputData2[i2i]) & 1) << 1) | (ExtractBit(vecInputData3[i2i]) & 1); iIndexImag = ((ExtractBit(vecInputData1[i2ip1]) & 1) << 2) | ((ExtractBit(vecInputData2[i2ip1]) & 1) << 1) | (ExtractBit(vecInputData3[i2ip1]) & 1); (*pcOutputData)[i] = /* Odd entries (second column in "rTableQAM64HMsym") */ _COMPLEX(rTableQAM64HMsym[iIndexReal][0], /* Even entries in input-vector */ rTableQAM64HMsym[iIndexImag][1]); } break; case CS_3_HMMIX: /* 64QAM HMmix------------------------------------------------------- */ /* Mapping according DRM-standard: {i_0 i_1 i_2 q_0 q_1 q_2} = (y_0,0Re y_1,0Re y_2,0Re y_0,0Im y_1,0Im y_2,0Im) */ for (i = 0; i < iOutputBlockSize; i++) { /* Filling indices [y_0,0, y_1,0, y_2,0] (Re, Im). Incoming bits are shifted to their desired positions in the integer variables "iIndexImag" and "iIndexReal" and combined */ iIndexReal = ((ExtractBit(vecInputData1[i]) & 1) << 2) | ((ExtractBit(vecInputData3[i]) & 1) << 1) | (ExtractBit(vecInputData5[i]) & 1); iIndexImag = ((ExtractBit(vecInputData2[i]) & 1) << 2) | ((ExtractBit(vecInputData4[i]) & 1) << 1) | (ExtractBit(vecInputData6[i]) & 1); (*pcOutputData)[i] = /* Odd entries (second column in "rTableQAM64HMmix") */ _COMPLEX(rTableQAM64HMmix[iIndexReal][0], /* Even entries in input-vector */ rTableQAM64HMmix[iIndexImag][1]); } break; } } void CQAMMapping::Init(int iNewOutputBlockSize, ECodScheme eNewCodingScheme) { /* Set the two internal parameters */ iOutputBlockSize = iNewOutputBlockSize; eMapType = eNewCodingScheme; } qsstv_9.2.6/qsstv/drmtx/common/mlc/QAMMapping.h0000664000175000017500000000377713203343610020127 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(QAM_MAPPING_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define QAM_MAPPING_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../tables/TableQAMMapping.h" #include "utils/vector.h" #include "../Parameter.h" /* Classes ********************************************************************/ class CQAMMapping { public: CQAMMapping() {} virtual ~CQAMMapping() {} void Map(CVector<_DECISION>& vecInputData1, CVector<_DECISION>& vecInputData2, CVector<_DECISION>& vecInputData3, CVector<_DECISION>& vecInputData4, CVector<_DECISION>& vecInputData5, CVector<_DECISION>& vecInputData6, CVector<_COMPLEX>* pcOutputData); void Init(int iNewOutputBlockSize, ECodScheme eNewCodingScheme); protected: int iOutputBlockSize; ECodScheme eMapType; }; #endif // !defined(QAM_MAPPING_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/ofdmcellmapping/CellMappingTable.cpp0000664000175000017500000005547313203343610024261 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Table of the mapping of OFDM cells. * We build a table of one super-frame where we set flags for each cell to * identify the symbol for this place. E.g. if the flag "CM_MSC" is set for * one table entry this is the cell for a MSC-symbol. The name of the table * is matiMapTab. * We use the table "matcPilotCells" for storing the complex values for the * pilots. For simplicity we allocate memory for all blocks but only the * pilot positions are used. * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "../GlobalDefinitions.h" #include "../tables/TableCarrier.h" #include "CellMappingTable.h" //#define _DEBUG_ 1 /* Implementation *************************************************************/ void CCellMappingTable::MakeTable(ERobMode eNewRobustnessMode, ESpecOcc eNewSpectOccup) { int iNoMSCDummyCells; /* Number of MSC dummy cells */ int iNumTimePilots; /* Number of time pilots per frame */ CScatPilots ScatPilots; int iSym; int iFrameSym; int iCar; int iTimePilotsCounter; int iFreqPilotsCounter; int iScatPilotsCounter; int iMSCCounter; int iFACCounter=0; int iScatPilPhase; int iCarArrInd; int iSpecOccArrayIndex; /* Tables */ const int* piTableFAC; const int* piTableTimePilots; const int* piTableFreqPilots; /* Set Parameters and pointers to the tables ******************************/ switch (eNewSpectOccup) { case SO_0: iSpecOccArrayIndex = 0; break; case SO_1: iSpecOccArrayIndex = 1; break; default: iSpecOccArrayIndex = 1; break; } // initialize defaults to avoid unitialized warning piTableTimePilots = &iTableTimePilRobModA[0][0]; piTableFreqPilots = &iTableFreqPilRobModA[0][0]; piTableFAC = &iTableFACRobModA[0][0]; iNumTimePilots = RMA_NUM_TIME_PIL; /* The robust mode defines all other parameters */ switch (eNewRobustnessMode) { case RM_ROBUSTNESS_MODE_A: iCarrierKmin = iTableCarrierKmin[iSpecOccArrayIndex][0]; iCarrierKmax = iTableCarrierKmax[iSpecOccArrayIndex][0]; iFFTSizeN = RMA_FFT_SIZE_N; RatioTgTu.iEnum = RMA_ENUM_TG_TU; RatioTgTu.iDenom = RMA_DENOM_TG_TU; iNumSymPerFrame = RMA_NUM_SYM_PER_FRAME; iNumSymbolsPerSuperframe = iNumSymPerFrame * NUM_FRAMES_IN_SUPERFRAME; piTableFAC = &iTableFACRobModA[0][0]; iNumTimePilots = RMA_NUM_TIME_PIL; piTableTimePilots = &iTableTimePilRobModA[0][0]; piTableFreqPilots = &iTableFreqPilRobModA[0][0]; iScatPilTimeInt = RMA_SCAT_PIL_TIME_INT; iScatPilFreqInt = RMA_SCAT_PIL_FREQ_INT; /* Scattered pilots phase definition */ ScatPilots.piConst = iTableScatPilConstRobModA; ScatPilots.iColSizeWZ = SIZE_COL_WZ_ROB_MOD_A; ScatPilots.piW = &iScatPilWRobModA[0][0]; ScatPilots.piZ = &iScatPilZRobModA[0][0]; ScatPilots.iQ = iScatPilQRobModA; ScatPilots.piGainTable = &iScatPilGainRobModA[iSpecOccArrayIndex][0]; break; case RM_ROBUSTNESS_MODE_B: iCarrierKmin = iTableCarrierKmin[iSpecOccArrayIndex][1]; iCarrierKmax = iTableCarrierKmax[iSpecOccArrayIndex][1]; iFFTSizeN = RMB_FFT_SIZE_N; RatioTgTu.iEnum = RMB_ENUM_TG_TU; RatioTgTu.iDenom = RMB_DENOM_TG_TU; iNumSymPerFrame = RMB_NUM_SYM_PER_FRAME; iNumSymbolsPerSuperframe = iNumSymPerFrame * NUM_FRAMES_IN_SUPERFRAME; piTableFAC = &iTableFACRobModB[0][0]; iNumTimePilots = RMB_NUM_TIME_PIL; piTableTimePilots = &iTableTimePilRobModB[0][0]; piTableFreqPilots = &iTableFreqPilRobModB[0][0]; iScatPilTimeInt = RMB_SCAT_PIL_TIME_INT; iScatPilFreqInt = RMB_SCAT_PIL_FREQ_INT; /* Scattered pilots phase definition */ ScatPilots.piConst = iTableScatPilConstRobModB; ScatPilots.iColSizeWZ = SIZE_COL_WZ_ROB_MOD_B; ScatPilots.piW = &iScatPilWRobModB[0][0]; ScatPilots.piZ = &iScatPilZRobModB[0][0]; ScatPilots.iQ = iScatPilQRobModB; ScatPilots.piGainTable = &iScatPilGainRobModB[iSpecOccArrayIndex][0]; break; case RM_NO_MODE_DETECTED: case RM_ROBUSTNESS_MODE_D: // not used in HAM default to E joma case RM_ROBUSTNESS_MODE_E: iCarrierKmin = iTableCarrierKmin[iSpecOccArrayIndex][2]; iCarrierKmax = iTableCarrierKmax[iSpecOccArrayIndex][2]; iFFTSizeN = RME_FFT_SIZE_N; RatioTgTu.iEnum = RME_ENUM_TG_TU; RatioTgTu.iDenom = RME_DENOM_TG_TU; iNumSymPerFrame = RME_NUM_SYM_PER_FRAME; iNumSymbolsPerSuperframe = iNumSymPerFrame * NUM_FRAMES_IN_SUPERFRAME; piTableFAC = &iTableFACRobModE[0][0]; iNumTimePilots = RME_NUM_TIME_PIL; piTableTimePilots = &iTableTimePilRobModE[0][0]; piTableFreqPilots = &iTableFreqPilRobModE[0][0]; iScatPilTimeInt = RME_SCAT_PIL_TIME_INT; iScatPilFreqInt = RME_SCAT_PIL_FREQ_INT; /* Scattered pilots phase definition */ ScatPilots.piConst = iTableScatPilConstRobModE; ScatPilots.iColSizeWZ = SIZE_COL_WZ_ROB_MOD_E; ScatPilots.piW = &iScatPilWRobModE[0][0]; ScatPilots.piZ = &iScatPilZRobModE[0][0]; ScatPilots.iQ = iScatPilQRobModE; ScatPilots.piGainTable = &iScatPilGainRobModE[iSpecOccArrayIndex][0]; break; } /* Get number of carriers with DC */ iNumCarrier = iCarrierKmax - iCarrierKmin + 1; /* Length of guard-interval measured in "time-bins". We do the calculation with integer variables -> "/ RatioTgTu.iDenom" MUST be the last operation! */ iGuardSize = iFFTSizeN * RatioTgTu.iEnum / RatioTgTu.iDenom; /* Symbol block size is the guard-interval plus the useful part */ iSymbolBlockSize = iFFTSizeN + iGuardSize; /* Calculate the index of the DC carrier in the shifted spectrum */ iIndexDCFreq = (int) ((_REAL) VIRTUAL_INTERMED_FREQ * iFFTSizeN / SOUNDCRD_SAMPLE_RATE); /* Index of minimum useful carrier (shifted) */ iShiftedKmin = iIndexDCFreq + iCarrierKmin; /* Index. of maximum useful carrier (shifted) */ iShiftedKmax = iIndexDCFreq + iCarrierKmax; /* Calculate number of time-interploated frequency pilots. Special case with robustness mode D: pilots in all carriers! BUT: DC carrier is counted as a pilot in that case!!! Be aware of that! */ if (iScatPilFreqInt > 1) iNumIntpFreqPil = (int) ((_REAL) iNumCarrier / iScatPilFreqInt + 1); else iNumIntpFreqPil = iNumCarrier; // printf("CellMappingTable Maktable iNumCarrier %d iShiftedKmin %d iIndexDCFreq %d iShiftedKmax %d fftsize %d\n", // iNumCarrier, iShiftedKmin, iIndexDCFreq, iShiftedKmax, iFFTSizeN); /* Allocate memory for vectors and matrices ----------------------------- */ /* Allocate memory for mapping table (Matrix) */ matiMapTab.Init(iNumSymbolsPerSuperframe, iNumCarrier); /* Allocate memory for pilot cells definition and set it to zero */ matcPilotCells.Init(iNumSymbolsPerSuperframe, iNumCarrier, _COMPLEX((_REAL) 0.0, (_REAL) 0.0)); /* Allocate memory for vectors with number of certain cells */ veciNumMSCSym.Init(iNumSymbolsPerSuperframe); veciNumFACSym.Init(iNumSymbolsPerSuperframe); /* Build table ************************************************************/ /* Some of the definitions at the beginning are overwritten by successive definitions! E.g., first define all carriers as MSC cells */ iFreqPilotsCounter = 0; iTimePilotsCounter = 0; for (iSym = 0; iSym < iNumSymbolsPerSuperframe; iSym++) { /* Frame symbol: Counts symbols in one frame, not super frame! */ iFrameSym = iSym % iNumSymPerFrame; /* Reset FAC counter at the beginning of each new frame */ if (iFrameSym == 0) iFACCounter = 0; /* Calculate the start value of "p" in equation for gain reference cells in Table 90 (8.4.4.1) */ iScatPilotsCounter = (int) ((_REAL) (iCarrierKmin - (int) ((_REAL) iScatPilFreqInt / 2 + .5) - iScatPilFreqInt * mod(iFrameSym, iScatPilTimeInt) ) / (iScatPilFreqInt * iScatPilTimeInt)); for (iCar = iCarrierKmin; iCar < iCarrierKmax + 1; iCar++) { /* Set carrier array index (since we do not have negative indices in c++) */ iCarArrInd = iCar - iCarrierKmin; /* MSC ---------------------------------------------------------- */ /* First set all cells to MSC-cells */ matiMapTab[iSym][iCarArrInd] = CM_MSC; /* FAC ---------------------------------------------------------- */ /* FAC positions are defined in a table */ if (iFACCounter <= NUM_FAC_CELLS) { /* piTableFAC[x * 2]: first column; piTableFAC[x * 2 + 1]: second column */ if (piTableFAC[iFACCounter * 2] * iNumCarrier + piTableFAC[iFACCounter * 2 + 1] == iFrameSym * iNumCarrier + iCar) { iFACCounter++; matiMapTab[iSym][iCarArrInd] = CM_FAC; } } /* Scattered pilots --------------------------------------------- */ /* Standard: 8.4.4.3: "In some cases gain references fall in locations which coincide with those already defined for either frequency or time references. In these cases, the phase definitions given in clauses 8.4.2 and 8.4.3 take precedence." Therefore, Scattered pilots must be definded FIRST here! */ /* The rule for calculating the scattered pilots is defined in the specification in the following form: e.g.: k = 2 + 4 * (s mod 5) + 20 * p We define a "frequency-" (FreqInt) and "time-interpolation" (TimeInt). In this example, "4" is the FreqInt and "5" is the TimeInt. The first term "2" is the half of the FreqInt, rounded towards infinity. The parameter "20" is FreqInt * TimeInt */ if (iCar == (int) ((_REAL) iScatPilFreqInt / 2 + .5) + iScatPilFreqInt * mod(iFrameSym, iScatPilTimeInt) + iScatPilFreqInt * iScatPilTimeInt * iScatPilotsCounter) { iScatPilotsCounter++; /* Set flag in mapping table */ matiMapTab[iSym][iCarArrInd] = CM_SCAT_PI; /* Set complex value for this pilot */ /* Phase calculation ---------------------------------------- */ int in, im, ip, i; /* Calculations as in drm-standard (8.4.4.3.1) */ /* "in" is ROW No and "im" is COLUMN No! */ in = mod(iFrameSym, ScatPilots.piConst[1] /* "y" */); im = (int) ((_REAL) iFrameSym / ScatPilots.piConst[1] /* "y" */); ip = (int) ((_REAL) (iCar - ScatPilots.piConst[2] /* "k_0" */ - in * ScatPilots.piConst[0] /* "x" */) / ( ScatPilots.piConst[0] /* "x" */ * ScatPilots.piConst[1] /* "y" */)); /* Phase_1024[s,k] = (4Z_256[n,m]pW_1024[n,m] + p^2(1 + s)Q_1024) mod 1024 */ iScatPilPhase = mod(4 * ScatPilots.piZ[in * ScatPilots.iColSizeWZ + im] + ip * ScatPilots.piW[in * ScatPilots.iColSizeWZ + im] + ip * ip * (1 + iFrameSym) * ScatPilots.iQ, 1024); /* Gain calculation and applying of complex value ----------- */ /* Test, if current carrier-index is one of the "boosted pilots" position */ _BOOLEAN bIsBoostedPilot = false; for (i = 0; i < NUM_BOOSTED_SCAT_PILOTS; i++) { /* In case of match set flag */ if (ScatPilots.piGainTable[i] == iCar) bIsBoostedPilot = true; } /* Boosted pilot: Gain = 2, Regular pilot: Gain = sqrt(2) */ if (bIsBoostedPilot) { matcPilotCells[iSym][iCarArrInd] = Polar2Cart(2, iScatPilPhase); /* Add flag for boosted pilot */ matiMapTab[iSym][iCarArrInd] |= CM_BOOSTED_PI; } else { matcPilotCells[iSym][iCarArrInd] = Polar2Cart(sqrt((_REAL) 2.0), iScatPilPhase); } } /* Time-reference pilots ---------------------------------------- */ /* Time refs at the beginning of each frame, we use a table */ if (iFrameSym == 0) { /* Use only the first column in piTableTimePilots */ if (piTableTimePilots[iTimePilotsCounter * 2] == iCar) { /* Set flag in mapping table, consider case of both, scattered pilot and time pilot at same position */ if (_IsScatPil(matiMapTab[iSym][iCarArrInd])) matiMapTab[iSym][iCarArrInd] |= CM_TI_PI; else matiMapTab[iSym][iCarArrInd] = CM_TI_PI; /* Set complex value for this pilot */ matcPilotCells[iSym][iCarArrInd] = Polar2Cart(sqrt((_REAL) 2.0), piTableTimePilots[iTimePilotsCounter * 2 + 1]); if (iTimePilotsCounter == iNumTimePilots - 1) iTimePilotsCounter = 0; else iTimePilotsCounter++; } } /* Frequency-reference pilots ----------------------------------- */ /* These pilots are in all symbols, the positions are stored in a table */ /* piTableFreqPilots[x * 2]: first column; piTableFreqPilots[x * 2 + 1]: second column */ if (piTableFreqPilots[iFreqPilotsCounter * 2] == iCar) { /* Set flag in mapping table, consider case of multiple definitions of pilot-mapping */ if (_IsTiPil(matiMapTab[iSym][iCarArrInd]) || _IsScatPil(matiMapTab[iSym][iCarArrInd])) { matiMapTab[iSym][iCarArrInd] |= CM_FRE_PI; } else matiMapTab[iSym][iCarArrInd] = CM_FRE_PI; /* Set complex value for this pilot */ /* Test for "special case" defined in drm-standard */ _BOOLEAN bIsFreqPilSpeciCase = false; if (eNewRobustnessMode == RM_ROBUSTNESS_MODE_E) { /* For robustness mode D, carriers 7 and 21 (Means: first and second pilot, not No. 28 (NUM_FREQ_PILOTS - 1) */ if (iFreqPilotsCounter != NUM_FREQ_PILOTS - 1) { /* Test for odd values of "s" (iSym) */ if ((iFrameSym % 2) == 1) bIsFreqPilSpeciCase = true; } } /* Apply complex value */ if (bIsFreqPilSpeciCase) matcPilotCells[iSym][iCarArrInd] = Polar2Cart(sqrt((_REAL) 2.0), mod(piTableFreqPilots[iFreqPilotsCounter * 2 + 1] + 512, 1024)); else matcPilotCells[iSym][iCarArrInd] = Polar2Cart(sqrt((_REAL) 2.0), piTableFreqPilots[iFreqPilotsCounter * 2 + 1]); /* Increase counter and wrap if needed */ if (iFreqPilotsCounter == NUM_FREQ_PILOTS - 1) iFreqPilotsCounter = 0; else iFreqPilotsCounter++; } /* DC-carrier (not used by DRM) --------------------------------- */ /* Mark DC-carrier. Must be marked after scattered pilots, because in one case (Robustness Mode D) some pilots must be overwritten! */ if (iCar == 0) matiMapTab[iSym][iCarArrInd] = CM_DC; /* In Robustness Mode A there are three "not used carriers" */ if (eNewRobustnessMode == RM_ROBUSTNESS_MODE_A) { if ((iCar == -1) || (iCar == 1)) matiMapTab[iSym][iCarArrInd] = CM_DC; } } } /* Count individual cells *************************************************/ /* We need to count the cells in a symbol for defining how many values from each source is needed to generate one symbol in carrier-mapping */ /* Init all counters */ iMaxNumMSCSym = 0; iMSCCounter = 0; rAvPowPerSymbol = (_REAL) 0.0; rAvPilPowPerSym = (_REAL) 0.0; for (iSym = 0; iSym < iNumSymbolsPerSuperframe; iSym++) { /* Init all counters */ veciNumMSCSym[iSym] = 0; veciNumFACSym[iSym] = 0; for (iCar = 0; iCar < iNumCarrier; iCar++) { /* MSC */ if (_IsMSC(matiMapTab[iSym][iCar])) { veciNumMSCSym[iSym]++; /* Count ALL MSC cells per super-frame */ iMSCCounter++; } /* FAC */ if (_IsFAC(matiMapTab[iSym][iCar])) veciNumFACSym[iSym]++; /* Calculations for average power per symbol (needed for SNR estimation and simulation). DC carrier is zero (contributes not to the average power) */ if (!_IsDC(matiMapTab[iSym][iCar])) { if (_IsData(matiMapTab[iSym][iCar])) { /* Data cells have average power of 1 */ rAvPowPerSymbol += (_REAL) 1.0; } else { /* All pilots have power of 2 except of the boosted pilots at the edges of the spectrum (they have power of 4) */ if (_IsBoosPil(matiMapTab[iSym][iCar])) { rAvPowPerSymbol += (_REAL) 4.0; rAvPilPowPerSym += (_REAL) 4.0; } else { /* Regular pilot has power of 2 */ rAvPowPerSymbol += (_REAL) 2.0; rAvPilPowPerSym += (_REAL) 2.0; } } } } /* Set maximum for symbol */ /* MSC */ if (iMaxNumMSCSym < veciNumMSCSym[iSym]) iMaxNumMSCSym = veciNumMSCSym[iSym]; } /* Set number of useful MSC cells */ iNumUsefMSCCellsPerFrame = (int) (iMSCCounter / NUM_FRAMES_IN_SUPERFRAME); /* Calculate dummy cells for MSC */ iNoMSCDummyCells = iMSCCounter - iNumUsefMSCCellsPerFrame * NUM_FRAMES_IN_SUPERFRAME; /* Correct last MSC count (because of dummy cells) */ veciNumMSCSym[iNumSymbolsPerSuperframe - 1] -= iNoMSCDummyCells; /* Normalize the average powers */ rAvPowPerSymbol /= iNumSymbolsPerSuperframe; rAvPilPowPerSym /= iNumSymbolsPerSuperframe; /* ########################################################################## */ #ifdef _DEBUG_ /* Save table in file */ FILE* pFile = fopen("CarMapTable.txt", "w"); /* Title */ fprintf(pFile, "Robustness mode "); switch (eNewRobustnessMode) { case RM_ROBUSTNESS_MODE_A: fprintf(pFile, "A"); break; case RM_ROBUSTNESS_MODE_B: fprintf(pFile, "B"); break; case RM_ROBUSTNESS_MODE_E: fprintf(pFile, "E"); break; } fprintf(pFile, " / Spectrum occupancy %d\n\n", iSpecOccArrayIndex); /* Actual table */ for (int i = 0; i < iNumSymbolsPerSuperframe; i++) { for (int j = 0; j < iNumCarrier; j++) { if (_IsDC(matiMapTab[i][j])) { fprintf(pFile, ":"); continue; } if (_IsMSC(matiMapTab[i][j])) { fprintf(pFile, "."); continue; } if (_IsFAC(matiMapTab[i][j])) { fprintf(pFile, "X"); continue; } if (_IsTiPil(matiMapTab[i][j])) { fprintf(pFile, "T"); continue; } if (_IsFreqPil(matiMapTab[i][j])) { fprintf(pFile, "f"); continue; } if (_IsScatPil(matiMapTab[i][j])) { /* Special mark for boosted pilots */ if (_IsBoosPil(matiMapTab[i][j])) fprintf(pFile, "*"); else fprintf(pFile, "0"); continue; } } fprintf(pFile, "\n"); } /* Legend */ fprintf(pFile, "\n\nLegend:\n\t: DC-carrier\n\t. MCS cells"); fprintf(pFile, "\n\tX FAC cells\n\tT time pilots\n\tf frequency pilots"); fprintf(pFile, "\n\t0 scattered pilots\n\t* boosted scattered pilots\n"); fclose(pFile); //#ifdef _DEBUG_ /* Save pilot values in file */ /* Use following command to plot pilot complex values in Matlab: clear all;close all;load PilotCells.dat;subplot(211),mesh(abs(complex(PilotCells(:,1:2:end), PilotCells(:,2:2:end))));subplot(212),mesh(angle(complex(PilotCells(:,1:2:end), PilotCells(:,2:2:end)))) (It plots the absolute of the pilots in the upper plot and angle in the lower plot.) */ pFile = fopen("test/PilotCells.dat", "w"); for (int z = 0; z < iNumSymbolsPerSuperframe; z++) { for (int v = 0; v < iNumCarrier; v++) fprintf(pFile, "%e %e ", matcPilotCells[z][v].real(), matcPilotCells[z][v].imag()); fprintf(pFile, "\n"); } fclose(pFile); #endif /* ########################################################################## */ } _COMPLEX CCellMappingTable::Polar2Cart(const _REAL rAbsolute, const int iPhase) const { /* This function takes phases normalized to 1024 as defined in the drm- standard. */ return _COMPLEX(rAbsolute * cos((_REAL) 2 * crPi * iPhase / 1024), rAbsolute * sin((_REAL) 2 * crPi * iPhase / 1024)); } int CCellMappingTable::mod(const int ix, const int iy) const { /* Modulus definition for integer numbers */ if (ix < 0) return ix % iy + iy; else return ix % iy; } qsstv_9.2.6/qsstv/drmtx/common/ofdmcellmapping/CellMappingTable.h0000664000175000017500000001216713203343610023717 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(CELLMAPPINGTABLE_H__3B0BA660_CA63_4347A0D31912__INCLUDED_) #define CELLMAPPINGTABLE_H__3B0BA660_CA63_4347A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../tables/TableCarMap.h" #include "../tables/TableFAC.h" #include "utils/vector.h" /* Definitions ****************************************************************/ /* Power definitions for pilots, boosted pilots and data cells (average) */ #define AV_DATA_CELLS_POWER ((_REAL) 1.0) #define AV_PILOT_POWER ((_REAL) 2.0) #define AV_BOOSTED_PIL_POWER ((_REAL) 4.0) /* We define a bit for each flag to allow multiple assignments */ #define CM_DC 1 /* Bit 0 */ // CM: Carrier Mapping #define CM_MSC 2 /* Bit 1 */ #define CM_SDC 4 /* Bit 2 */ #define CM_FAC 8 /* Bit 3 */ #define CM_TI_PI 16 /* Bit 4 */ #define CM_FRE_PI 32 /* Bit 5 */ #define CM_SCAT_PI 64 /* Bit 6 */ #define CM_BOOSTED_PI 128 /* Bit 7 */ /* Definitions for checking the cells */ #define _IsDC(a) ((a) & CM_DC) #define _IsMSC(a) ((a) & CM_MSC) #define _IsSDC(a) ((a) & CM_SDC) #define _IsFAC(a) ((a) & CM_FAC) #define _IsData(a) (((a) & CM_MSC) || ((a) & CM_SDC) || ((a) & CM_FAC)) #define _IsTiPil(a) ((a) & CM_TI_PI) #define _IsFreqPil(a) ((a) & CM_FRE_PI) #define _IsScatPil(a) ((a) & CM_SCAT_PI) #define _IsPilot(a) (((a) & CM_TI_PI) || ((a) & CM_FRE_PI) || ((a) & CM_SCAT_PI)) #define _IsBoosPil(a) ((a) & CM_BOOSTED_PI) /* Classes ********************************************************************/ class CCellMappingTable { public: CCellMappingTable() : iNumSymbolsPerSuperframe(0) {} virtual ~CCellMappingTable() {} void MakeTable(ERobMode eNewRobustnessMode, ESpecOcc eNewSpectOccup); struct CRatio {int iEnum; int iDenom;}; /* Mapping table and pilot cell matrix */ CMatrix matiMapTab; CMatrix<_COMPLEX> matcPilotCells; int iNumSymbolsPerSuperframe; int iNumSymPerFrame; /* Number of symbols per frame */ int iNumCarrier; int iScatPilTimeInt; /* Time interpolation */ int iScatPilFreqInt; /* Frequency interpolation */ int iMaxNumMSCSym; /* Max number of MSC cells in a symbol */ /* Number of MSC cells in a symbol */ CVector veciNumMSCSym; /* Number of FAC cells in a symbol */ CVector veciNumFACSym; /* Number of SDC cells in a symbol */ CVector veciNumSDCSym; int iFFTSizeN; /* FFT size of the OFDM modulation */ int iCarrierKmin; /* Carrier index of carrier with lowest frequency */ int iCarrierKmax; /* Carrier index of carrier with highest frequency */ int iIndexDCFreq; /* Index of DC carrier */ int iShiftedKmin; /* Shifted carrier min ("sound card pass-band") */ int iShiftedKmax; /* Shifted carrier max ("sound card pass-band") */ CRatio RatioTgTu; /* Ratio between guard-interval and useful part */ int iGuardSize; /* Length of guard-interval measured in "time-bins" */ int iSymbolBlockSize; /* Useful part plus guard-interval in "time-bins" */ int iNumIntpFreqPil; /* Number of time-interploated frequency pilots */ int iNumUsefMSCCellsPerFrame; /* Number of MSC cells per multiplex frame N_{MUX} */ int iNumSDCCellsPerSFrame; /* Number of SDC cells per super-frame */ /* Needed for SNR estimation and simulation */ _REAL rAvPowPerSymbol; /* Total average power per symbol */ _REAL rAvScatPilPow; /* Average power of scattered pilots per cell */ _REAL rAvPilPowPerSym ; /* added pa0mbo */ protected: /* Internal parameters for MakeTable function --------------------------- */ struct CScatPilots { CScatPilots(): piConst(NULL), iColSizeWZ(0), piW(NULL), piZ(NULL), iQ(0),piGainTable(NULL) {} /* For the pase */ const int* piConst; int iColSizeWZ; const int* piW; const int* piZ; int iQ; /* For the gain */ const int* piGainTable; }; private: _COMPLEX Polar2Cart(const _REAL rAbsolute, const int iPhase) const; int mod(const int ix, const int iy) const; }; #endif // !defined(CELLMAPPINGTABLE_H__3B0BA660_CA63_4347A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/ofdmcellmapping/OFDMCellMapping.cpp0000664000175000017500000001217613203343610023750 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * Mapping of the symbols on the carriers * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "OFDMCellMapping.h" #include "../tables/TableCarrier.h" /* Implementation *************************************************************/ /******************************************************************************\ * OFDM cells mapping * \******************************************************************************/ /* Dummy cells for the MSC ****************************************************/ /* Already normalized */ const _COMPLEX cDummyCells64QAM[2] = { _COMPLEX(0.1543033499f, 0.1543033499f), _COMPLEX(0.1543033499f, -0.1543033499f) }; const _COMPLEX cDummyCells16QAM[2] = { _COMPLEX(0.3162277660f, 0.3162277660f), _COMPLEX(0.3162277660f, -0.3162277660f) }; void COFDMCellMapping::ProcessDataInternal(CParameter& TransmParam) { const CCellMappingTable& Param = TransmParam.CellMappingTable; /* pa0mbo */ int iCar; int iMSCCounter; int iFACCounter; int iDummyCellCounter; int iSymbolCounterAbs; /* Mapping of the data and pilot cells on the OFDM symbol --------------- */ /* Set absolute symbol position */ iSymbolCounterAbs = TransmParam.iFrameIDTransm * iNumSymPerFrame + iSymbolCounter; /* Init temporary counter */ iDummyCellCounter = 0; iMSCCounter = 0; iFACCounter = 0; for (iCar = 0; iCar < iNumCarrier; iCar++) { /* MSC */ if (_IsMSC(Param.matiMapTab[iSymbolCounterAbs][iCar])) /* pa0mbo was TransmParam. */ { if (iMSCCounter >= Param.veciNumMSCSym[iSymbolCounterAbs]) { /* Insert dummy cells */ (*pvecOutputData)[iCar] = pcDummyCells[iDummyCellCounter]; iDummyCellCounter++; } else (*pvecOutputData)[iCar] = (*pvecInputData)[iMSCCounter]; iMSCCounter++; } /* FAC */ if (_IsFAC(Param.matiMapTab[iSymbolCounterAbs][iCar])) { (*pvecOutputData)[iCar] = (*pvecInputData2)[iFACCounter]; iFACCounter++; } /* DC carrier */ if (_IsDC(Param.matiMapTab[iSymbolCounterAbs][iCar])) (*pvecOutputData)[iCar] = _COMPLEX((_REAL) 0.0, (_REAL) 0.0); /* Pilots */ if (_IsPilot(Param.matiMapTab[iSymbolCounterAbs][iCar])) (*pvecOutputData)[iCar] = Param.matcPilotCells[iSymbolCounterAbs][iCar]; } /* Increase symbol-counter and wrap if needed */ iSymbolCounter++; if (iSymbolCounter == iNumSymPerFrame) { iSymbolCounter = 0; /* Increase frame-counter (ID) (Used also in FAC.cpp) */ TransmParam.iFrameIDTransm++; if (TransmParam.iFrameIDTransm == NUM_FRAMES_IN_SUPERFRAME) TransmParam.iFrameIDTransm = 0; } /* Set absolute symbol position (for updated relative positions) */ iSymbolCounterAbs = TransmParam.iFrameIDTransm * iNumSymPerFrame + iSymbolCounter; /* Set input block-sizes for next symbol */ iInputBlockSize = Param.veciNumMSCSym[iSymbolCounterAbs]; iInputBlockSize2 = Param.veciNumFACSym[iSymbolCounterAbs]; /* printf("OFDMCellmapping proces updated iInpblk %d iInp2 %d iSymbcntrabs %d \n", iInputBlockSize, iInputBlockSize2, iSymbolCounterAbs); */ } void COFDMCellMapping::InitInternal(CParameter& TransmParam) { const CCellMappingTable& Param = TransmParam.CellMappingTable; /* pa0mbo */ iNumSymPerFrame = Param.iNumSymPerFrame; iNumCarrier = Param.iNumCarrier; /* Init symbol-counter */ iSymbolCounter = 0; /* Init frame ID */ TransmParam.iFrameIDTransm = 0; /* Choose right dummy cells for MSC QAM scheme */ switch (TransmParam.eMSCCodingScheme) { case CS_3_HMSYM: // not use so default to case CS_2_SM case CS_3_HMMIX: case CS_1_SM: case CS_2_SM: // pa0mbo was CParameter::CS_2_SM pcDummyCells = (_COMPLEX*) &cDummyCells16QAM[0]; break; case CS_3_SM: pcDummyCells = (_COMPLEX*) &cDummyCells64QAM[0]; // pa0mbo was CParameter::CS_#_SM break; } /* Define block-sizes for input and output of the module ---------------- */ iInputBlockSize = Param.veciNumMSCSym[0]; /* MSC */ iInputBlockSize2 = Param.veciNumFACSym[0]; /* FAC */ iOutputBlockSize = Param.iNumCarrier; /* Output */ // printf("OFDM CELLMAP : Inputblksiz %d Inpublksiz2 %d OutputBlkSiz %d\n", // iInputBlockSize, iInputBlockSize2, iOutputBlockSize); } qsstv_9.2.6/qsstv/drmtx/common/ofdmcellmapping/OFDMCellMapping.h0000664000175000017500000000363513203343610023415 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(OFDMCELLMAPPING_H__3B0BA660_CA63_4344_BB2BE7A0D31912__INCLUDED_) #define OFDMCELLMAPPING_H__3B0BA660_CA63_4344_BB2BE7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../Parameter.h" #include "../util/Modul.h" #include "../tables/TableCarMap.h" #include "../tables/TableFAC.h" /* Classes ********************************************************************/ class COFDMCellMapping : public CTransmitterModul<_COMPLEX, _COMPLEX> { public: COFDMCellMapping() {} virtual ~COFDMCellMapping() {} protected: int iNumSymPerFrame; int iNumCarrier; int iSymbolCounter; _COMPLEX* pcDummyCells; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; #endif // !defined(OFDMCELLMAPPING_H__3B0BA660_CA63_4344_BB2BE7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/sourcedecoders/AudioSourceDecoder.cpp0000664000175000017500000001164713203343610024471 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * Audio source encoder/decoder * * adapted to ham sstv use PA0MBO - Ties Bos * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 1111 * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "AudioSourceDecoder.h" #include #include #define AUD_DEC_TRANSFROM_LENGTH 960 /******************************************************************************\ * Encoder * \******************************************************************************/ void CAudioSourceEncoderImplementation::ProcessDataInternal( CVectorEx < _BINARY > *pvecOutputData, int &iOutputBlockSize) { int i; /* Reset data to zero. This is important since usually not all data is used and this data has to be set to zero as defined in the DRM standard */ for (i = 0; i < iOutputBlockSize; i++) (*pvecOutputData)[i] = 0; /* Data service and text message application ---------------------------- */ if (bIsDataService == true) { // TODO: make a separate modul for data encoding /* Write data packets in stream */ CVector < _BINARY > vecbiData; const int iNumPack = iOutputBlockSize / iTotPacketSize; // printf("In process data AudioSourceEnc iOutputBlcksi %d iTotPacketSize = %d \n", iOutputBlockSize, iTotPacketSize); int iPos = 0; for (int j = 0; j < iNumPack; j++) { /* Get new packet */ DataEncoder.GeneratePacket(vecbiData); /* Put it on stream */ for (i = 0; i < iTotPacketSize; i++) { (*pvecOutputData)[iPos] = vecbiData[i]; iPos++; } } } } void CAudioSourceEncoderImplementation::InitInternalTx(CParameter & TransmParam, int &iOutputBlockSize) { int iCurStreamID; int iCurSelServ = 0; // TEST TransmParam.Lock(); // Calculate number of input samples in mono. Audio block are always 400 ms long // const int iNumInSamplesMono = (int) ((_REAL) SOUNDCRD_SAMPLE_RATE * (_REAL) 0.4 /* 400 ms */ ); /* Set the total available number of bits, byte aligned */ iTotNumBitsForUsage = (TransmParam.iNumDecodedBitsMSC / SIZEOF__BYTE) * SIZEOF__BYTE; /* Total number of bytes which can be used for data and audio */ const int iTotNumBytesForUsage = iTotNumBitsForUsage / SIZEOF__BYTE; /* printf("in audiosourceEncoder init smplmono = %d iTotNumBitsForUsage = %d bytefor usage = %d \n", iNumInSamplesMono, iTotNumBitsForUsage, iTotNumBytesForUsage ); */ if (TransmParam.iNumDataService == 1) { /* Data service ----------------------------------------------------- */ bIsDataService = true; // printf("Data servic is true \n"); iTotPacketSize = DataEncoder.Init(TransmParam); // printf("na DataEncoder Init in AudioSourceEncoder init iTotPacketSize = %d\n", iTotPacketSize); /* Get stream ID for data service */ iCurStreamID = TransmParam.Service[iCurSelServ].DataParam.iStreamID; /* printf(" in AudioSourceEncoder dataservice is true iTotPacketSize = %d, custreamId = %d \n", iTotPacketSize, iCurStreamID ); */ } else { printf("Not implemented \n"); exit(1); } /* Adjust part B length for SDC stream. Notice, that the "TransmParam.iNumDecodedBitsMSC" parameter depends on these settings. Thus, length part A and B have to be set before, preferably in the DRMTransmitter initialization */ if ((TransmParam.Stream[iCurStreamID].iLenPartA == 0) || (iTotNumBytesForUsage < TransmParam.Stream[iCurStreamID].iLenPartA)) { /* Equal error protection was chosen or protection part A was chosen too high, set to equal error protection! */ TransmParam.Stream[iCurStreamID].iLenPartA = 0; TransmParam.Stream[iCurStreamID].iLenPartB = iTotNumBytesForUsage; } else TransmParam.Stream[iCurStreamID].iLenPartB = iTotNumBytesForUsage - TransmParam.Stream[iCurStreamID].iLenPartA; /* Define input and output block size */ iOutputBlockSize = TransmParam.iNumDecodedBitsMSC; TransmParam.Unlock(); } CAudioSourceEncoderImplementation::~CAudioSourceEncoderImplementation() { } qsstv_9.2.6/qsstv/drmtx/common/sourcedecoders/AudioSourceDecoder.h0000664000175000017500000001023413203343610024125 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer, Ollie Haffenden * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(AUIDOSOURCEDECODER_H__3B0BA660_CABB2B_23E7A0D31912__INCLUDED_) #define AUIDOSOURCEDECODER_H__3B0BA660_CABB2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../Parameter.h" #include "../util/Modul.h" #include "../util/CRC.h" //#include "../TextMessage.h" #include "../datadecoding/DataDecoder.h" #include "../util/Utilities.h" /* Classes ********************************************************************/ class CAudioSourceEncoderImplementation { public: CAudioSourceEncoderImplementation() : bUsingTextMessage(false) {} virtual ~CAudioSourceEncoderImplementation(); // void SetTextMessage(const string& strText); // void ClearTextMessage(); void SetPicFileName(QByteArray *ba, const QString name,const QString format) { DataEncoder.GetSliShowEnc()->AddArray(ba,name,format); } void ClearPicFileNames() {DataEncoder.GetSliShowEnc()->ClearAllFileNames();} _BOOLEAN GetTransStat(string& strCPi, _REAL& rCPe) {return DataEncoder.GetSliShowEnc()->GetTransStat(strCPi, rCPe);} protected: // CTextMessageEncoder TextMessage; _BOOLEAN bUsingTextMessage; CDataEncoder DataEncoder; int iTotPacketSize; _BOOLEAN bIsDataService; int iTotNumBitsForUsage; public: virtual void InitInternalTx(CParameter &TransmParam, int &iOutputBlockSize); // virtual void InitInternalRx(CParameter& Param, int &iInputBlockSize, int &iOutputBlockSize); virtual void ProcessDataInternal( CVectorEx<_BINARY>* pvecOutputData, int &iOutputBlockSize); // virtual void ProcessDataInternalRx( CVectorEx<_SAMPLE>* pvecInputData, // CVectorEx<_BINARY>* pvecOutputData, int &InputBlockSize, int &iOutputBlockSize); // virtual void ProcessDataInternal(CVectorEx<_SAMPLE>*,CVectorEx<_BINARY>* pvecOutputData, int &, int &iOutputBlockSize); }; class CAudioSourceEncoder : public CTransmitterModul<_SAMPLE, _BINARY> { public: CAudioSourceEncoder() {} virtual ~CAudioSourceEncoder() {} // void SetTextMessage(const string& strText) {AudioSourceEncoderImpl.SetTextMessage(strText);} // void ClearTextMessage() {AudioSourceEncoderImpl.ClearTextMessage();} void SetPicFileName(QByteArray *ba, const QString name,const QString format) { AudioSourceEncoderImpl.SetPicFileName(ba,name,format); } void ClearPicFileNames() {AudioSourceEncoderImpl.ClearPicFileNames();} _BOOLEAN GetTransStat(string& strCPi, _REAL& rCPe) {return AudioSourceEncoderImpl.GetTransStat(strCPi, rCPe);} protected: CAudioSourceEncoderImplementation AudioSourceEncoderImpl; virtual void InitInternal(CParameter& TransmParam) { AudioSourceEncoderImpl.InitInternalTx(TransmParam, iOutputBlockSize); } virtual void ProcessDataInternal(CParameter& ) { AudioSourceEncoderImpl.ProcessDataInternal(pvecOutputData, iOutputBlockSize); } // virtual void ProcessDataInternalRx(CParameter& ) // { // AudioSourceEncoderImpl.ProcessDataInternalRx(pvecInputData, pvecOutputData, iInputBlockSize, iOutputBlockSize); // } }; #endif // !defined(AUIDOSOURCEDECODER_H__3B0BA660_CABB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableAMSS.h0000664000175000017500000000337013203343610020374 0ustar jomajoma/******************************************************************************\ * BBC Research & Development * Copyright (c) 2005 * * Author(s): * Andrew Murphy * * Description: * Tables for AMSS * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(__TABLE_AMSS_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_) #define __TABLE_AMSS_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_ #include #include "../GlobalDefinitions.h" /* Definitions ****************************************************************/ #define LEN_TABLE_AMSS_CARRIER_MODE 8 const string strTableAMSSCarrierMode[LEN_TABLE_AMSS_CARRIER_MODE] = { "No Carrier Control", // 0 0 0 "reserved", // 0 0 1 "AMC Mode 1 (-3dB)", // 0 1 0 "AMC Mode 2 (-6dB)", // 0 1 1 "DAM Mode 1 (+3dB)", // 1 0 0 "DAM Mode 2 (+6dB)", // 1 0 1 "reserved", // 1 1 0 "reserved" // 1 1 1 }; #endif // !defined(__TABLE_AMSS_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableCarMap.h0000664000175000017500000001537213203343610021001 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sttv use Ties Bos - PA0MBO * * Description: * Tables for carrier mapping * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(TABLE_CAR_MAP_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) #define TABLE_CAR_MAP_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_ #include "../GlobalDefinitions.h" #include "../matlib/Matlib.h" #include "TableQAMMapping.h" /* Global functions ***********************************************************/ /* ---------------------------------------------------------------------------- Implementation of distance to nearest constellation point (symbol) for all QAM types */ inline CComplex MinDist4QAM(const CComplex cI) { /* Return vector pointing to nearest signal point of this constellation. 2 possible constellation points for real and imaginary axis */ return CComplex( /* Real axis minimum distance */ Min(Abs(rTableQAM4[0][0] - Real(cI)), Abs(rTableQAM4[1][0] - Real(cI))), /* Imaginary axis minimum distance */ Min(Abs(rTableQAM4[0][1] - Imag(cI)), Abs(rTableQAM4[1][1] - Imag(cI)))); } inline CComplex MinDist16QAM(const CComplex cI) { /* Return vector pointing to nearest signal point of this constellation. 4 possible constellation points for real and imaginary axis */ return CComplex( /* Real axis minimum distance */ Min(Abs(rTableQAM16[0][0] - Real(cI)), Abs(rTableQAM16[1][0] - Real(cI)), Abs(rTableQAM16[2][0] - Real(cI)), Abs(rTableQAM16[3][0] - Real(cI))), /* Imaginary axis minimum distance */ Min(Abs(rTableQAM16[0][1] - Imag(cI)), Abs(rTableQAM16[1][1] - Imag(cI)), Abs(rTableQAM16[2][1] - Imag(cI)), Abs(rTableQAM16[3][1] - Imag(cI)))); } inline CComplex MinDist64QAM(const CComplex cI) { /* Return vector pointing to nearest signal point of this constellation. 8 possible constellation points for real and imaginary axis */ return CComplex( /* Real axis minimum distance */ Min(Abs(rTableQAM64SM[0][0] - Real(cI)), Abs(rTableQAM64SM[1][0] - Real(cI)), Abs(rTableQAM64SM[2][0] - Real(cI)), Abs(rTableQAM64SM[3][0] - Real(cI)), Abs(rTableQAM64SM[4][0] - Real(cI)), Abs(rTableQAM64SM[5][0] - Real(cI)), Abs(rTableQAM64SM[6][0] - Real(cI)), Abs(rTableQAM64SM[7][0] - Real(cI))), /* Imaginary axis minimum distance */ Min(Abs(rTableQAM64SM[0][1] - Imag(cI)), Abs(rTableQAM64SM[1][1] - Imag(cI)), Abs(rTableQAM64SM[2][1] - Imag(cI)), Abs(rTableQAM64SM[3][1] - Imag(cI)), Abs(rTableQAM64SM[4][1] - Imag(cI)), Abs(rTableQAM64SM[5][1] - Imag(cI)), Abs(rTableQAM64SM[6][1] - Imag(cI)), Abs(rTableQAM64SM[7][1] - Imag(cI)))); } /* Time pilots ****************************************************************/ /* The two numbers are: {carrier no, phase} (Phases are normalized to 1024) */ #define RMA_NUM_TIME_PIL 16 const int iTableTimePilRobModA[RMA_NUM_TIME_PIL][2] = { { 6, 973}, { 7, 205}, {11, 717}, {12, 264}, {15, 357}, {16, 357}, {23, 952}, {29, 440}, {30, 856}, {33, 88}, {34, 88}, {38, 68}, {39, 836}, {41, 836}, {45, 836}, {46, 1008}, }; #define RMB_NUM_TIME_PIL 15 const int iTableTimePilRobModB[RMB_NUM_TIME_PIL][2] = { { 6, 304}, {10, 331}, {11, 108}, {14, 620}, {17, 192}, {18, 704}, {27, 44}, {28, 432}, {30, 588}, {33, 844}, {34, 651}, {38, 651}, {40, 651}, {41, 460}, {44, 944}, }; #define RME_NUM_TIME_PIL 8 const int iTableTimePilRobModE[RME_NUM_TIME_PIL][2] = { { 7, 432}, { 8, 331}, {13, 108}, {14, 620}, {21, 192}, {22, 704}, {26, 44}, {27, 304}, }; /* Scattered pilots ***********************************************************/ /* Definitions for the positions of scattered pilots */ #define RMA_SCAT_PIL_FREQ_INT 4 #define RMA_SCAT_PIL_TIME_INT 5 #define RMB_SCAT_PIL_FREQ_INT 2 #define RMB_SCAT_PIL_TIME_INT 3 #define RME_SCAT_PIL_FREQ_INT 1 #define RME_SCAT_PIL_TIME_INT 4 /* Phase definitions of scattered pilots ------------------------------------ */ const int iTableScatPilConstRobModA[3] = {4, 5, 2}; const int iTableScatPilConstRobModB[3] = {2, 3, 1}; const int iTableScatPilConstRobModE[3] = {1, 4, 1}; #define SIZE_ROW_WZ_ROB_MOD_A 5 #define SIZE_COL_WZ_ROB_MOD_A 3 const int iScatPilWRobModA[SIZE_ROW_WZ_ROB_MOD_A][SIZE_COL_WZ_ROB_MOD_A] = { {228, 341, 455}, {455, 569, 683}, {683, 796, 910}, {910, 0, 114}, {114, 228, 341} }; const int iScatPilZRobModA[SIZE_ROW_WZ_ROB_MOD_A][SIZE_COL_WZ_ROB_MOD_A] = { {0, 81, 248}, {18, 106, 106}, {122, 116, 31}, {129, 129, 39}, {33, 32, 111} }; const int iScatPilQRobModA = 36; #define SIZE_ROW_WZ_ROB_MOD_B 3 #define SIZE_COL_WZ_ROB_MOD_B 5 const int iScatPilWRobModB[SIZE_ROW_WZ_ROB_MOD_B][SIZE_COL_WZ_ROB_MOD_B] = { {512, 0, 512, 0, 512}, {0, 512, 0, 512, 0}, {512, 0, 512, 0, 512} }; const int iScatPilZRobModB[SIZE_ROW_WZ_ROB_MOD_B][SIZE_COL_WZ_ROB_MOD_B] = { {0, 57, 164, 64, 12}, {168, 255, 161, 106, 118}, {25, 232, 132, 233, 38} }; const int iScatPilQRobModB = 12; #define SIZE_ROW_WZ_ROB_MOD_E 4 #define SIZE_COL_WZ_ROB_MOD_E 5 const int iScatPilWRobModE[SIZE_ROW_WZ_ROB_MOD_E][SIZE_COL_WZ_ROB_MOD_E] = { {512, 0, 512, 0, 512}, {0, 512, 0, 512, 0}, {512, 0, 512, 0, 512}, {0, 512, 0, 512, 0} }; const int iScatPilZRobModE[SIZE_ROW_WZ_ROB_MOD_E][SIZE_COL_WZ_ROB_MOD_E] = { {0, 57, 164, 64, 12}, {168, 255, 161, 106, 118}, {25, 232, 132, 233, 38}, {168, 255, 161, 106, 118} }; const int iScatPilQRobModE = 10; /* Gain definitions of scattered pilots ------------------------------------- */ #define NUM_BOOSTED_SCAT_PILOTS 4 const int iScatPilGainRobModA[2][NUM_BOOSTED_SCAT_PILOTS] = { {2, 4, 50, 54}, {2, 6, 54, 58} }; const int iScatPilGainRobModB[2][NUM_BOOSTED_SCAT_PILOTS] = { {1, 3, 43, 45}, {1, 3, 49, 51} }; const int iScatPilGainRobModE[2][NUM_BOOSTED_SCAT_PILOTS] = { {1,29, 0, 0}, {1,31, 0, 0} }; #endif // !defined(TABLE_CAR_MAP_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableCarrier.h0000664000175000017500000000467013203343610021224 0ustar jomajoma /* Definitions ****************************************************************/ /* FAC ************************************************************************/ #define NUM_FAC_CELLS 45 /* FAC positions. The two numbers are {symbol no, carrier no} */ const int iTableFACRobModA[NUM_FAC_CELLS][2] = { { 1, 10}, { 1, 22}, { 1, 30}, { 1, 50}, { 2, 14}, { 2, 26}, { 2, 34}, { 3, 18}, { 3, 30}, { 3, 38}, { 4, 22}, { 4, 34}, { 4, 42}, { 5, 18}, { 5, 26}, { 5, 38}, { 5, 46}, { 6, 22}, { 6, 30}, { 6, 42}, { 6, 50}, { 7, 26}, { 7, 34}, { 7, 46}, { 8, 10}, { 8, 30}, { 8, 38}, { 8, 50}, { 9, 14}, { 9, 34}, { 9, 42}, {10, 18}, {10, 38}, {10, 46}, {11, 10}, {11, 22}, {11, 42}, {11, 50}, {12, 14}, {12, 26}, {12, 46}, {13, 18}, {13, 30}, {14, 22}, {14, 34}, }; const int iTableFACRobModB[NUM_FAC_CELLS][2] = { { 0, 21}, { 1, 11}, { 1, 23}, { 1, 35}, { 2, 13}, { 2, 25}, { 2, 37}, { 3, 15}, { 3, 27}, { 3, 39}, { 4, 5}, { 4, 17}, { 4, 29}, { 4, 41}, { 5, 7}, { 5, 19}, { 5, 31}, { 6, 9}, { 6, 21}, { 6, 33}, { 7, 11}, { 7, 23}, { 7, 35}, { 8, 13}, { 8, 25}, { 8, 37}, { 9, 15}, { 9, 27}, { 9, 39}, {10, 5}, {10, 17}, {10, 29}, {10, 41}, {11, 7}, {11, 19}, {11, 31}, {12, 9}, {12, 21}, {12, 33}, {13, 11}, {13, 23}, {13, 35}, {14, 13}, {14, 25}, {14, 37}, }; const int iTableFACRobModE[NUM_FAC_CELLS][2] = { { 1, 7}, { 1,23}, { 2, 8}, { 2,16}, { 2,24}, { 3, 9}, { 3,17}, { 4,10}, { 4,18}, { 5,11}, { 5,19}, { 6, 4}, { 6,12}, { 7,13}, { 7,21}, { 8, 6}, { 8,14}, { 8,22}, { 9, 7}, { 9,23}, {10, 8}, {10,16}, {10,24}, {11, 9}, {11,13}, {11,17}, {12,10}, {12,18}, {13,11}, {13,19}, {14, 4}, {14,12}, {14,16}, {15,13}, {15,21}, {16, 6}, {16,14}, {16,22}, {17, 7}, {17,23}, {18, 8}, {18,16}, {18,24}, {19, 9}, {19,17}, }; /* Frequency pilots ***********************************************************/ #define NUM_FREQ_PILOTS 3 const int iTableFreqPilRobModA[NUM_FREQ_PILOTS][2] = { { 9, 205}, {27, 836}, {36, 215} }; const int iTableFreqPilRobModB[NUM_FREQ_PILOTS][2] = { { 8, 331}, {24, 651}, {32, 555} }; const int iTableFreqPilRobModE[NUM_FREQ_PILOTS][2] = { { 5, 788}, {15, 1014}, {20, 332} }; /* Spectrum occupancy, carrier numbers for each mode **************************/ const int iTableCarrierKmin[2][3] = { {2, 1, 1}, {2, 1, 1} }; const int iTableCarrierKmax[2][3] = { {54, 45, 29}, {58, 51, 31} }; qsstv_9.2.6/qsstv/drmtx/common/tables/TableDRMGlobal.h0000664000175000017500000000653013203343610021375 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBo * * Description: * DRM global definitions * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(TABLE_DRM_GLOB_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) #define TABLE_DRM_GLOB_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_ /* Definitions ****************************************************************/ /* We define a "virtual" intermedia frequency for the DC carrier in the range of the FFT-size. This IF is independent of the "real" IF defined by the frequency estimation acquisition unit. Here, we are constrained to certain numbers to get continuous signals like they are defined in the DRM-standard, i.e. the frequency pilots which have to be continuous. Our IF must be a multiple of 1500 Hz and must also be chosen so that the largest mode (20 kHz) must fit into the range of the FFT-size. Therefore 6000 Hz was chosen */ #define VIRTUAL_INTERMED_FREQ 6000 // Hz #define SOUNDCRD_SAMPLE_RATE 48000 // Hz pa0mbo was 48000 #define AUD_DEC_TRANSFORM_LENGTH 960 /* DRM parameters */ #define NUM_FRAMES_IN_SUPERFRAME 3 #define RMA_FFT_SIZE_N 1152 // RMB: Robustness Mode A #define RMA_NUM_SYM_PER_FRAME 15 #define RMA_ENUM_TG_TU 1 #define RMA_DENOM_TG_TU 9 #define RMB_FFT_SIZE_N 1024 // RMA: Robustness Mode B #define RMB_NUM_SYM_PER_FRAME 15 #define RMB_ENUM_TG_TU 1 #define RMB_DENOM_TG_TU 4 #define RME_FFT_SIZE_N 640 // RME: Robustness Mode E #define RME_NUM_SYM_PER_FRAME 20 #define RME_ENUM_TG_TU 1 #define RME_DENOM_TG_TU 2 #define MAX_NUM_STREAMS 4 #define MAX_NUM_SERVICES 4 #define NUM_ROBUSTNESS_MODES 3 /* Service ID has 24 bits, define a number which cannot be an ID and fits into the 32 bits of the length of the variable (e.g.: 1 << 25) */ #define SERV_ID_NOT_USED (1 << 25) /* Define a stream ID which is not valid to show that this service is not attached to a stream */ #define STREAM_ID_NOT_USED (MAX_NUM_STREAMS + 1) /* Audio stream definitions ------------------------------------------------- */ /* The text message (when present) shall occupy the last four bytes of the lower protected part of each logical frame carrying an audio stream (6.5.1) */ #define NUM_BYTES_TEXT_MESS_IN_AUD_STR 4 #endif // !defined(TABLE_DRM_GLOB_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableFAC.cpp0000664000175000017500000006410013203343610020553 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Tables for FAC * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "TableFAC.h" /* Definitions ****************************************************************/ /* ETSI ES201980V2.1.1: page 115, 7.5.3: ...FAC shall use 4-QAM mapping. A fixed code rate shall be applied...R_all=0.6... 6 tailbits are used for the encoder to get in zero state -> 65 [number of cells] * 2 [4-QAM] * 0.6 [code-rate] - 6 [tailbits] = 72 */ // #define NUM_FAC_BITS_PER_BLOCK 72 /* iTableNumOfServices[a][b] a: Number of audio services b: Number of data services (6.3.4) */ const int iTableNumOfServices[5][5] = { /* -> Data */ {-1, 1, 2, 3, 15}, { 4, 5, 6, 7, -1}, { 8, 9, 10, -1, -1}, {12, 13, -1, -1, -1}, { 0, -1, -1, -1, -1} }; /* Language code */ #define LEN_TABLE_LANGUAGE_CODE 16 const string strTableLanguageCode[LEN_TABLE_LANGUAGE_CODE] = { "No language specified", "Arabic", "Bengali", "Chinese (Mandarin)", "Dutch", "English", "French", "German", "Hindi", "Japanese", "Javanese", "Korean", "Portuguese", "Russian", "Spanish", "Other language" }; /* Programme Type codes */ #define LEN_TABLE_PROG_TYPE_CODE_TOT 32 #define LEN_TABLE_PROG_TYPE_CODE 30 const string strTableProgTypCod[LEN_TABLE_PROG_TYPE_CODE_TOT] = { "No programme type", "News", "Current Affairs", "Information", "Sport", "Education", "Drama", "Culture", "Science", "Varied", "Pop Music", "Rock Music", "Easy Listening Music", "Light Classical", "Serious Classical", "Other Music", "Weather/meteorology", "Finance/Business", "Children's programmes", "Social Affairs", "Religion", "Phone In", "Travel", "Leisure", "Jazz Music", "Country Music", "National Music", "Oldies Music", "Folk Music", "Documentary", "Not used", "Not used" }; /* Country code table according to ISO 3166 */ const struct elCountry TableCountryCode[LEN_TABLE_COUNTRY_CODE] = { {"af", "Afghanistan"}, {"ax", "Aland Islands"}, {"al", "Albania"}, {"dz", "Algeria"}, {"as", "American Samoa"}, {"ad", "Andorra"}, {"ao", "Angola"}, {"ai", "Anguilla"}, {"aq", "Antarctica"}, {"ag", "Antigua and barbuda"}, {"ar", "Argentina"}, {"am", "Armenia"}, {"aw", "Aruba"}, {"au", "Australia"}, {"at", "Austria"}, {"az", "Azerbaijan"}, {"bs", "Bahamas"}, {"bh", "Bahrain"}, {"bd", "Bangladesh"}, {"bb", "Barbados"}, {"by", "Belarus"}, {"be", "Belgium"}, {"bz", "Belize"}, {"bj", "Benin"}, {"bm", "Bermuda"}, {"bt", "Bhutan"}, {"bo", "Bolivia"}, {"ba", "Bosnia and Herzegovina"}, {"bw", "Botswana"}, {"bv", "Bouvet Island"}, {"br", "Brazil"}, {"io", "British Indian Ocean Ter."}, {"bn", "Brunei Darussalam"}, {"bg", "Bulgaria"}, {"bf", "Burkina Faso"}, {"bi", "Burundi"}, {"kh", "Cambodia"}, {"cm", "Cameroon"}, {"ca", "Canada"}, {"cv", "Cape Verde"}, {"ky", "Cayman Islands"}, {"cf", "Central African Republic"}, {"td", "Chad"}, {"cl", "Chile"}, {"cn", "China"}, {"cx", "Christmas Island"}, {"cc", "Cocos (Keeling) Islands"}, {"co", "Colombia"}, {"km", "Comoros"}, {"cg", "Congo Democratic Rep."}, {"cd", "Congo"}, {"ck", "Cook Islands"}, {"cr", "Costa Rica"}, {"ci", "Cte d'Ivoire"}, {"hr", "Croatia"}, {"cu", "Cuba"}, {"cy", "Cyprus"}, {"cz", "Czech Republic"}, {"dk", "Denmark"}, {"dj", "Djibouti"}, {"dm", "Dominica"}, {"do", "Dominican Republic"}, {"ec", "Ecuador"}, {"eg", "Egypt"}, {"sv", "El Salvador"}, {"gq", "Equatorial Guinea"}, {"er", "Eritrea"}, {"ee", "Estonia"}, {"et", "Ethiopia"}, {"fk", "Falkland Islands"}, {"fo", "Faroe Islands"}, {"fj", "Fiji"}, {"fi", "Finland"}, {"fr", "France"}, {"gf", "French Guiana"}, {"pf", "French Polynesia"}, {"tf", "French Southern Ter."}, {"ga", "Gabon"}, {"gm", "Gambia"}, {"ge", "Georgia"}, {"de", "Germany"}, {"gh", "Ghana"}, {"gi", "Gibraltar"}, {"gr", "Greece"}, {"gl", "Greenland"}, {"gd", "Grenada"}, {"gp", "Guadeloupe"}, {"gu", "Guam"}, {"gt", "Guatemala"}, {"gg", "Guernsey"}, {"gn", "Guinea"}, {"gw", "Guinea-Bissau"}, {"gy", "Guyana"}, {"ht", "Haiti"}, {"hm", "Heard Is. Mcdonald Is."}, {"va", "Vatican City State"}, {"hn", "Honduras"}, {"hk", "Hong Kong"}, {"hu", "Hungary"}, {"is", "Iceland"}, {"in", "India"}, {"id", "Indonesia"}, {"ir", "Iran"}, {"iq", "Iraq"}, {"im", "Isle of Man"}, {"ie", "Ireland"}, {"il", "Israel"}, {"it", "Italy"}, {"jm", "Jamaica"}, {"jp", "Japan"}, {"je", "Jersey"}, {"jo", "Jordan"}, {"kz", "Kazakhstan"}, {"ke", "Kenya"}, {"ki", "Kiribati"}, {"kp", "Korea Democratic Rep."}, {"kr", "Korea, Republic of"}, {"kw", "Kuwait"}, {"kg", "Kyrgyzstan"}, {"la", "Lao People's Democratic Rep."}, {"lv", "Latvia"}, {"lb", "Lebanon"}, {"ls", "Lesotho"}, {"lr", "Liberia"}, {"ly", "Libyan Arab Jamahiriya"}, {"li", "Liechtenstein"}, {"lt", "Lithuania"}, {"lu", "Luxembourg"}, {"mo", "Macao"}, {"mk", "Macedonia"}, {"mg", "Madagascar"}, {"mw", "Malawi"}, {"my", "Malaysia"}, {"mv", "Maldives"}, {"ml", "Mali"}, {"mt", "Malta"}, {"mh", "Marshall Islands"}, {"mq", "Martinique"}, {"mr", "Mauritania"}, {"mu", "Mauritius"}, {"yt", "Mayotte"}, {"mx", "Mexico"}, {"fm", "Micronesia"}, {"md", "Moldova"}, {"mc", "Monaco"}, {"mn", "Mongolia"}, {"me", "Montenegro"}, {"ms", "Montserrat"}, {"ma", "Morocco"}, {"mz", "Mozambique"}, {"mm", "Myanmar"}, {"na", "Namibia"}, {"nr", "Nauru"}, {"np", "Nepal"}, {"nl", "Netherlands"}, {"an", "Netherlands Antilles"}, {"nc", "New Caledonia"}, {"nz", "New Zealand"}, {"ni", "Nicaragua"}, {"ne", "Niger"}, {"ng", "Nigeria"}, {"nu", "Niue"}, {"nf", "Norfolk Island"}, {"mp", "Northern Mariana Is."}, {"no", "Norway"}, {"om", "Oman"}, {"pk", "Pakistan"}, {"pw", "Palau"}, {"ps", "Palestinian Territory"}, {"pa", "Panama"}, {"pg", "Papua New Guinea"}, {"py", "Paraguay"}, {"pe", "Peru"}, {"ph", "Philippines"}, {"pn", "Pitcairn"}, {"pl", "Poland"}, {"pt", "Portugal"}, {"pr", "Puerto Rico"}, {"qa", "Qatar"}, {"re", "Runion"}, {"ro", "Romania"}, {"ru", "Russian Federation"}, {"rw", "Rwanda"}, {"sh", "Saint Helena"}, {"kn", "Saint Kitts and Nevis"}, {"lc", "Saint Lucia"}, {"pm", "Saint Pierre and Miquelon"}, {"vc", "Saint Vincent and the Grenadines"}, {"ws", "Samoa"}, {"sm", "San Marino"}, {"st", "Sao Tome and Principe"}, {"sa", "Saudi arabia"}, {"sn", "Senegal"}, {"rs", "Serbia"}, {"sc", "Seychelles"}, {"sl", "Sierra Leone"}, {"sg", "Singapore"}, {"sk", "Slovakia"}, {"si", "Slovenia"}, {"sb", "Solomon Islands"}, {"so", "Somalia"}, {"za", "South Africa"}, {"gs", "South Georgia South Sandwich Is."}, {"es", "Spain"}, {"lk", "Sri Lanka"}, {"sd", "Sudan"}, {"sr", "Suriname"}, {"sj", "Svalbard and Jan Mayen"}, {"sz", "Swaziland"}, {"se", "Sweden"}, {"ch", "Switzerland"}, {"sy", "Syrian Arab Republic"}, {"tw", "Taiwan"}, {"tj", "Tajikistan"}, {"tz", "Tanzania"}, {"th", "Thailand"}, {"tl", "Timor-Leste"}, {"tg", "Togo"}, {"tk", "Tokelau"}, {"to", "Tonga"}, {"tt", "Trinidad and Tobago"}, {"tn", "Tunisia"}, {"tr", "Turkey"}, {"tm", "Turkmenistan"}, {"tc", "Turks and Caicos Islands"}, {"tv", "Tuvalu"}, {"ug", "Uganda"}, {"ua", "Ukraine"}, {"ae", "United Arab Emirates"}, {"gb", "United Kingdom"}, {"us", "United States"}, {"um", "United States Is."}, {"uy", "Uruguay"}, {"uz", "Uzbekistan"}, {"vu", "Vanuatu"}, {"ve", "Venezuela"}, {"vn", "Vietnam"}, {"vg", "Virgin Islands, British"}, {"vi", "Virgin Islands, U.S."}, {"wf", "Wallis and Futuna"}, {"eh", "Western Sahara"}, {"ye", "Yemen"}, {"zm", "Zambia"}, {"zw", "Zimbabwe"} }; /* Get country name from ISO 3166 A2 */ string GetISOCountryName(const string strA2) { for (int i = 0; i < LEN_TABLE_COUNTRY_CODE; i++) { if (!strA2.compare(TableCountryCode[i].strcode)) return TableCountryCode[i].strDesc; } return ""; } /* Language code table according to ISO 639-2 */ /* All Alpha 3 codes: "bibliographic" (B code) and "terminological" (T code) */ const struct elLanguage TableISOLanguageCode[LEN_TABLE_ISO_LANGUAGE_CODE] = { {"aar", "Afar"}, {"abk", "Abkhazian"}, {"ace", "Achinese"}, {"ach", "Acoli"}, {"ada", "Adangme"}, {"ady", "Adyghe; Adygei"}, {"afa", "Afro-Asiatic (Other)"}, {"afh", "Afrihili"}, {"afr", "Afrikaans"}, {"ain", "Ainu"}, {"aka", "Akan"}, {"akk", "Akkadian"}, {"alb", "Albanian"}, {"sqi", "Albanian"}, {"ale", "Aleut"}, {"alg", "Algonquian languages"}, {"alt", "Southern Altai"}, {"amh", "Amharic"}, {"ang", "English, Old (ca.450-1100)"}, {"anp", "Angika"}, {"apa", "Apache languages"}, {"ara", "Arabic"}, {"arc", "Aramaic"}, {"arg", "Aragonese"}, {"arm", "Armenian"}, {"hye", "Armenian"}, {"arn", "Araucanian"}, {"arp", "Arapaho"}, {"art", "Artificial (Other)"}, {"arw", "Arawak"}, {"asm", "Assamese"}, {"ast", "Asturian; Bable"}, {"ath", "Athapascan languages"}, {"aus", "Australian languages"}, {"ava", "Avaric"}, {"ave", "Avestan"}, {"awa", "Awadhi"}, {"aym", "Aymara"}, {"aze", "Azerbaijani"}, {"bad", "Banda"}, {"bai", "Bamileke languages"}, {"bak", "Bashkir"}, {"bal", "Baluchi"}, {"bam", "Bambara"}, {"ban", "Balinese"}, {"baq", "Basque"}, {"eus", "Basque"}, {"bas", "Basa"}, {"bat", "Baltic (Other)"}, {"bej", "Beja"}, {"bel", "Belarusian"}, {"bem", "Bemba"}, {"ben", "Bengali"}, {"ber", "Berber (Other)"}, {"bho", "Bhojpuri"}, {"bih", "Bihari"}, {"bik", "Bikol"}, {"bin", "Bini"}, {"bis", "Bislama"}, {"bla", "Siksika"}, {"bnt", "Bantu (Other)"}, {"bos", "Bosnian"}, {"bra", "Braj"}, {"bre", "Breton"}, {"btk", "Batak (Indonesia)"}, {"bua", "Buriat"}, {"bug", "Buginese"}, {"bul", "Bulgarian"}, {"bur", "Burmese"}, {"mya", "Burmese"}, {"byn", "Blin; Bilin"}, {"cad", "Caddo"}, {"cai", "Central American Indian (Other)"}, {"car", "Carib"}, {"cat", "Catalan; Valencian"}, {"cau", "Caucasian (Other)"}, {"ceb", "Cebuano"}, {"cel", "Celtic (Other)"}, {"cha", "Chamorro"}, {"chb", "Chibcha"}, {"che", "Chechen"}, {"chg", "Chagatai"}, {"chi", "Chinese"}, {"zho", "Chinese"}, {"chk", "Chuukese"}, {"chm", "Mari"}, {"chn", "Chinook jargon"}, {"cho", "Choctaw"}, {"chp", "Chipewyan"}, {"chr", "Cherokee"}, {"chu", "Church Slavic - Slavonic..."}, {"chv", "Chuvash"}, {"chy", "Cheyenne"}, {"cmc", "Chamic languages"}, {"cop", "Coptic"}, {"cor", "Cornish"}, {"cos", "Corsican"}, {"cpe", "Creoles and pidgins, English based"}, {"cpf", "Creoles and pidgins, French-based"}, {"cpp", "Creoles and pidgins, Portuguese-based"}, {"cre", "Cree"}, {"crh", "Crimean Tatar; Crimean Turkish"}, {"crp", "Creoles and pidgins (Other)"}, {"csb", "Kashubian"}, {"cus", "Cushitic (Other)"}, {"cze", "Czech"}, {"ces", "Czech"}, {"dak", "Dakota"}, {"dan", "Danish"}, {"dar", "Dargwa"}, {"day", "Dayak"}, {"del", "Delaware"}, {"den", "Slave (Athapascan)"}, {"dgr", "Dogrib"}, {"din", "Dinka"}, {"div", "Divehi; Dhivehi; Maldivian"}, {"doi", "Dogri"}, {"dra", "Dravidian (Other)"}, {"dsb", "Lower Sorbian"}, {"dua", "Duala"}, {"dum", "Dutch, Middle (ca.1050-1350)"}, {"dut", "Dutch; Flemish"}, {"nld", "Dutch; Flemish"}, {"dyu", "Dyula"}, {"dzo", "Dzongkha"}, {"efi", "Efik"}, {"egy", "Egyptian (Ancient)"}, {"eka", "Ekajuk"}, {"elx", "Elamite"}, {"eng", "English"}, {"enm", "English, Middle (1100-1500)"}, {"epo", "Esperanto"}, {"est", "Estonian"}, {"ewe", "Ewe"}, {"ewo", "Ewondo"}, {"fan", "Fang"}, {"fao", "Faroese"}, {"fat", "Fanti"}, {"fij", "Fijian"}, {"fil", "Filipino; Pilipino"}, {"fin", "Finnish"}, {"fiu", "Finno-Ugrian (Other)"}, {"fon", "Fon"}, {"fre", "French"}, {"fra", "French"}, {"frm", "French, Middle (ca.1400-1600)"}, {"fro", "French, Old (842-ca.1400)"}, {"frr", "Northern Frisian"}, {"frs", "Eastern Frisian"}, {"fry", "Western Frisian"}, {"ful", "Fulah"}, {"fur", "Friulian"}, {"gaa", "Ga"}, {"gay", "Gayo"}, {"gba", "Gbaya"}, {"gem", "Germanic (Other)"}, {"geo", "Georgian"}, {"kat", "Georgian"}, {"ger", "German"}, {"deu", "German"}, {"gez", "Geez"}, {"gil", "Gilbertese"}, {"gla", "Gaelic; Scottish Gaelic"}, {"gle", "Irish"}, {"glg", "Galician"}, {"glv", "Manx"}, {"gmh", "German, Middle High (ca.1050-1500)"}, {"goh", "German, Old High (ca.750-1050)"}, {"gon", "Gondi"}, {"gor", "Gorontalo"}, {"got", "Gothic"}, {"grb", "Grebo"}, {"grc", "Greek, Ancient (to 1453)"}, {"gre", "Greek, Modern (1453-)"}, {"ell", "Greek, Modern (1453-)"}, {"grn", "Guarani"}, {"gsw", "Alemani; Swiss German"}, {"guj", "Gujarati"}, {"gwi", "Gwichin"}, {"hai", "Haida"}, {"hat", "Haitian; Haitian Creole"}, {"hau", "Hausa"}, {"haw", "Hawaiian"}, {"heb", "Hebrew"}, {"her", "Herero"}, {"hil", "Hiligaynon"}, {"him", "Himachali"}, {"hin", "Hindi"}, {"hit", "Hittite"}, {"hmn", "Hmong"}, {"hmo", "Hiri Motu"}, {"hsb", "Upper Sorbian"}, {"hun", "Hungarian"}, {"hup", "Hupa"}, {"iba", "Iban"}, {"ibo", "Igbo"}, {"ice", "Icelandic"}, {"isl", "Icelandic"}, {"ido", "Ido"}, {"iii", "Sichuan Yi"}, {"ijo", "Ijo"}, {"iku", "Inuktitut"}, {"ile", "Interlingue"}, {"ilo", "Iloko"}, {"ina", "Interlingua"}, {"inc", "Indic (Other)"}, {"ind", "Indonesian"}, {"ine", "Indo-European (Other)"}, {"inh", "Ingush"}, {"ipk", "Inupiaq"}, {"ira", "Iranian (Other)"}, {"iro", "Iroquoian languages"}, {"ita", "Italian"}, {"jav", "Javanese"}, {"jbo", "Lojban"}, {"jpn", "Japanese"}, {"jpr", "Judeo-Persian"}, {"jrb", "Judeo-Arabic"}, {"kaa", "Kara-Kalpak"}, {"kab", "Kabyle"}, {"kac", "Kachin"}, {"kal", "Kalaallisut; Greenlandic"}, {"kam", "Kamba"}, {"kan", "Kannada"}, {"kar", "Karen"}, {"kas", "Kashmiri"}, {"kau", "Kanuri"}, {"kaw", "Kawi"}, {"kaz", "Kazakh"}, {"kbd", "Kabardian"}, {"kha", "Khasi"}, {"khi", "Khoisan (Other)"}, {"khm", "Khmer"}, {"kho", "Khotanese"}, {"kik", "Kikuyu; Gikuyu"}, {"kin", "Kinyarwanda"}, {"kir", "Kirghiz"}, {"kmb", "Kimbundu"}, {"kok", "Konkani"}, {"kom", "Komi"}, {"kon", "Kongo"}, {"kor", "Korean"}, {"kos", "Kosraean"}, {"kpe", "Kpelle"}, {"krc", "Karachay-Balkar"}, {"krl", "Karelian"}, {"kro", "Kru"}, {"kru", "Kurukh"}, {"kua", "Kuanyama; Kwanyama"}, {"kum", "Kumyk"}, {"kur", "Kurdish"}, {"kut", "Kutenai"}, {"lad", "Ladino"}, {"lah", "Lahnda"}, {"lam", "Lamba"}, {"lao", "Lao"}, {"lat", "Latin"}, {"lav", "Latvian"}, {"lez", "Lezghian"}, {"lim", "Limburgan; Limburger; Limburgish"}, {"lin", "Lingala"}, {"lit", "Lithuanian"}, {"lol", "Mongo"}, {"loz", "Lozi"}, {"ltz", "Luxembourgish; Letzeburgesch"}, {"lua", "Luba-Lulua"}, {"lub", "Luba-Katanga"}, {"lug", "Ganda"}, {"lui", "Luiseno"}, {"lun", "Lunda"}, {"luo", "Luo (Kenya and Tanzania)"}, {"lus", "lushai"}, {"mac", "Macedonian"}, {"mkd", "Macedonian"}, {"mad", "Madurese"}, {"mag", "Magahi"}, {"mah", "Marshallese"}, {"mai", "Maithili"}, {"mak", "Makasar"}, {"mal", "Malayalam"}, {"man", "Mandingo"}, {"mao", "Maori"}, {"mri", "Maori"}, {"map", "Austronesian (Other)"}, {"mar", "Marathi"}, {"mas", "Masai"}, {"may", "Malay"}, {"msa", "Malay"}, {"mdf", "Moksha"}, {"mdr", "Mandar"}, {"men", "Mende"}, {"mga", "Irish, Middle (900-1200)"}, {"mic", "Mi'kmaq; Micmac"}, {"min", "Minangkabau"}, {"mis", "Miscellaneous languages"}, {"mkh", "Mon-Khmer (Other)"}, {"mlg", "Malagasy"}, {"mlt", "Maltese"}, {"mnc", "Manchu"}, {"mni", "Manipuri"}, {"mno", "Manobo languages"}, {"moh", "Mohawk"}, {"mol", "Moldavian"}, {"mon", "Mongolian"}, {"mos", "Mossi"}, {"mul", "Multiple languages"}, {"mun", "Munda languages"}, {"mus", "Creek"}, {"mwl", "Mirandese"}, {"mwr", "Marwari"}, {"myn", "Mayan languages"}, {"myv", "Erzya"}, {"nah", "Nahuatl"}, {"nai", "North American Indian"}, {"nap", "Neapolitan"}, {"nau", "Nauru"}, {"nav", "Navajo; Navaho"}, {"nbl", "Ndebele, South; South Ndebele"}, {"nde", "Ndebele, North; North Ndebele"}, {"ndo", "Ndonga"}, {"nds", "Low German; Low Saxon..."}, {"nep", "Nepali"}, {"new", "Nepal Bhasa; Newari"}, {"nia", "Nias"}, {"nic", "Niger-Kordofanian (Other)"}, {"niu", "Niuean"}, {"nno", "Norwegian Nynorsk"}, {"nob", "Norwegian Bokml"}, {"nog", "Nogai"}, {"non", "Norse, Old"}, {"nor", "Norwegian"}, {"nqo", "N'ko"}, {"nso", "Northern Sotho; Pedi; Sepedi"}, {"nub", "Nubian languages"}, {"nwc", "Classical Newari; Classical Nepal Bhasa"}, {"nya", "Chichewa; Chewa; Nyanja"}, {"nym", "Nyamwezi"}, {"nyn", "Nyankole"}, {"nyo", "Nyoro"}, {"nzi", "Nzima"}, {"oci", "Occitan (post 1500); Provenal"}, {"oji", "Ojibwa"}, {"ori", "Oriya"}, {"orm", "Oromo"}, {"osa", "Osage"}, {"oss", "Ossetian; Ossetic"}, {"ota", "Turkish, Ottoman (1500-1928)"}, {"oto", "Otomian languages"}, {"paa", "Papuan (Other)"}, {"pag", "Pangasinan"}, {"pal", "Pahlavi"}, {"pam", "Pampanga"}, {"pan", "Panjabi; Punjabi"}, {"pap", "Papiamento"}, {"pau", "Palauan"}, {"peo", "Persian, Old (ca.600-400 B.C.)"}, {"per", "Persian"}, {"fas", "Persian"}, {"phi", "Philippine (Other)"}, {"phn", "Phoenician"}, {"pli", "Pali"}, {"pol", "Polish"}, {"pon", "Pohnpeian"}, {"por", "Portuguese"}, {"pra", "Prakrit languages"}, {"pro", "Provenal, Old (to 1500)"}, {"pus", "Pushto"}, {"que", "Quechua"}, {"raj", "Rajasthani"}, {"rap", "Rapanui"}, {"rar", "Rarotongan"}, {"roa", "Romance (Other)"}, {"roh", "Raeto-Romance"}, {"rom", "Romany"}, {"rum", "Romanian"}, {"ron", "Romanian"}, {"run", "Rundi"}, {"rup", "Aromanian; Arumanian; Macedo-Romanian"}, {"rus", "Russian"}, {"sad", "Sandawe"}, {"sag", "Sango"}, {"sah", "Yakut"}, {"sai", "South American Indian (Other)"}, {"sal", "Salishan languages"}, {"sam", "Samaritan Aramaic"}, {"san", "Sanskrit"}, {"sas", "Sasak"}, {"sat", "Santali"}, {"scc", "Serbian"}, {"srp", "Serbian"}, {"scn", "Sicilian"}, {"sco", "Scots"}, {"scr", "Croatian"}, {"hrv", "Croatian"}, {"sel", "Selkup"}, {"sem", "Semitic (Other)"}, {"sga", "Irish, Old (to 900)"}, {"sgn", "Sign Languages"}, {"shn", "Shan"}, {"sid", "Sidamo"}, {"sin", "Sinhala; Sinhalese"}, {"sio", "Siouan languages"}, {"sit", "Sino-Tibetan (Other)"}, {"sla", "Slavic (Other)"}, {"slo", "Slovak"}, {"slk", "Slovak"}, {"slv", "Slovenian"}, {"sma", "Southern Sami"}, {"sme", "Northern Sami"}, {"smi", "Sami languages (Other)"}, {"smj", "Lule Sami"}, {"smn", "Inari Sami"}, {"smo", "Samoan"}, {"sms", "Skolt Sami"}, {"sna", "Shona"}, {"snd", "Sindhi"}, {"snk", "Soninke"}, {"sog", "Sogdian"}, {"som", "Somali"}, {"son", "Songhai"}, {"sot", "Sotho, Southern"}, {"spa", "Spanish; Castilian"}, {"srd", "Sardinian"}, {"srn", "Sranan Togo"}, {"srr", "Serer"}, {"ssa", "Nilo-Saharan (Other)"}, {"ssw", "Swati"}, {"suk", "Sukuma"}, {"sun", "Sundanese"}, {"sus", "Susu"}, {"sux", "Sumerian"}, {"swa", "Swahili"}, {"swe", "Swedish"}, {"syr", "Syriac"}, {"tah", "Tahitian"}, {"tai", "Tai (Other)"}, {"tam", "Tamil"}, {"tat", "Tatar"}, {"tel", "Telugu"}, {"tem", "Timne"}, {"ter", "Tereno"}, {"tet", "Tetum"}, {"tgk", "Tajik"}, {"tgl", "Tagalog"}, {"tha", "Thai"}, {"tib", "Tibetan"}, {"bod", "Tibetan"}, {"tig", "Tigre"}, {"tir", "Tigrinya"}, {"tiv", "Tiv"}, {"tkl", "Tokelau"}, {"tlh", "Klingon; tlhIngan-Hol"}, {"tli", "Tlingit"}, {"tmh", "Tamashek"}, {"tog", "Tonga (Nyasa)"}, {"ton", "Tonga (Tonga Islands)"}, {"tpi", "Tok Pisin"}, {"tsi", "Tsimshian"}, {"tsn", "Tswana"}, {"tso", "Tsonga"}, {"tuk", "Turkmen"}, {"tum", "Tumbuka"}, {"tup", "Tupi languages"}, {"tur", "Turkish"}, {"tut", "Altaic (Other)"}, {"tvl", "Tuvalu"}, {"twi", "Twi"}, {"tyv", "Tuvinian"}, {"udm", "Udmurt"}, {"uga", "Ugaritic"}, {"uig", "Uighur; Uyghur"}, {"ukr", "Ukrainian"}, {"umb", "Umbundu"}, {"und", "Undetermined"}, {"urd", "Urdu"}, {"uzb", "Uzbek"}, {"vai", "Vai"}, {"ven", "Venda"}, {"vie", "Vietnamese"}, {"vol", "Volapk"}, {"vot", "Votic"}, {"wak", "Wakashan languages"}, {"wal", "Walamo"}, {"war", "Waray"}, {"was", "Washo"}, {"wel", "Welsh"}, {"cym", "Welsh"}, {"wen", "Sorbian languages"}, {"wln", "Walloon"}, {"wol", "Wolof"}, {"xal", "Kalmyk; Oirat"}, {"xho", "Xhosa"}, {"yao", "Yao"}, {"yap", "Yapese"}, {"yid", "Yiddish"}, {"yor", "Yoruba"}, {"ypk", "Yupik languages"}, {"zap", "Zapotec"}, {"zen", "Zenaga"}, {"zha", "Zhuang; Chuang"}, {"znd", "Zande"}, {"zul", "Zulu"}, {"zun", "Zuni"}, {"zxx", "No linguistic content"}, {"zza", "Zaza; Dimili; Dimli; Kirdki..."} }; /* Get language name from ISO */ string GetISOLanguageName(const string strA3) { for (int i = 0; i < LEN_TABLE_ISO_LANGUAGE_CODE; i++) { if (!strA3.compare(TableISOLanguageCode[i].strISOCode)) return TableISOLanguageCode[i].strDesc; } return ""; } /* CIRAF zones */ const string strTableCIRAFzones[LEN_TABLE_CIRAF_ZONES] = { "", /* 0 undefined */ "Alaska", /* 1 */ "west Canada", /* 2 */ "central Canada - west", /* 3 */ "central Canada - east, Baffin Island", /* 4 */ "Greenland", /* 5 */ "west USA", /* 6 */ "central USA", /* 7 */ "east USA", /* 8 */ "east Canada", /* 9 */ "Belize, Guatemala, Mexico", /* 10 */ "Caribbean, central America", /* 11 */ "northwestern south America", /* 12 */ "northeast Brazil", /* 13 */ "southwestern south America", /* 14 */ "southeast Brazil", /* 15 */ "south Argentina, south Chile, Falkland Islands", /* 16 */ "Iceland", /* 17 */ "Scandinavia", /* 18 */ "west Russia northwest", /* 19 */ "west Russia north", /* 20 */ "central Russia northwest", /* 21 */ "central Russia north", /* 22 */ "central Russia east", /* 23 */ "east Russia northwest", /* 24 */ "east Russia north", /* 25 */ "east Russia northeast", /* 26 */ "northwest Europe", /* 27 */ "central east south Europe", /* 28 */ "Baltics and west Russia", /* 29 */ "central Asia, west Russia southeast", /* 30 */ "central Russia southwest, east Kazakhstan, east Kyrgyzstan", /* 31 */ "central Russia south, west Mongolia", /* 32 */ "central Russia southeast, east Mongolia", /* 33 */ "east Russia southwest: Sakhalin, Sikhote Alin", /* 34 */ "east Russia east: Kamchatka", /* 35 */ "Azores, Canary Island, Madeira", /* 36 */ "southwest Europe, northwest Africa", /* 37 */ "Egypt, Libya", /* 38 */ "Middle East", /* 39 */ "Afghanistan, Iran", /* 40 */ "Bangladesh, Bhutan, India, Nepal, Pakistan", /* 41 */ "west China", /* 42 */ "central China", /* 43 */ "east China, Macao, Hong Kong, North Korea, South Korea, Taiwan", /* 44 */ "Japan", /* 45 */ "west Africa", /* 46 */ "west Sudan", /* 47 */ "Horn of Africa", /* 48 */ "Kampuchea, Laos, Myanmar, Vietnam", /* 49 */ "Philippines", /* 50 */ "Malaysia, Papua New Guinea, west Indonesia", /* 51 */ "Angola, Burundi, Congo, Gabon, Zaire", /* 52 */ "Madagascar, Malawi, Mozambique, Seychelles, Zambia, Zimbabwe", /* 53 */ "Malaysia, Singapore, west Indonesia", /* 54 */ "northeast Australia", /* 55 */ "Caledonia, Fiji/Vanuatu", /* 56 */ "Botswana, Lesotho, Namibia, Swaziland, South African Republic", /* 57 */ "west Australia", /* 58 */ "southeast Australia", /* 59 */ "New Zealand", /* 60 */ "Hawaii", /* 61 */ "Phoenix Islands, Samoa", /* 62 */ "Cook Islands, Polynesia", /* 63 */ "Guam/Palau, Saipan", /* 64 */ "Kiribati, Marshall", /* 65 */ "central Atlantic - south: Ascension, St. Helena", /* 66 */ "Antarctica", /* 67 */ "southwest Indian Ocean: Kerguelen", /* 68 */ "Antarctica", /* 69 */ "Antarctica", /* 70 */ "Antarctica", /* 71 */ "Antarctica", /* 72 */ "Antarctica", /* 73 */ "South Pole", /* 74 */ "North Pole", /* 75 */ "northeast Pacific", /* 76 */ "central Pacific - northeast", /* 77 */ "central Pacific - southeast", /* 78 */ "central Indian Ocean", /* 79 */ "northern Atlantic", /* 80 */ "central Atlantic", /* 81 */ "northwest Pacific", /* 82 */ "south Pacific", /* 83 */ "south Atlantic", /* 84 */ "southeast Indian Ocean" /* 85 */ }; qsstv_9.2.6/qsstv/drmtx/common/tables/TableFAC.h0000664000175000017500000000632113203343610020221 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Tables for FAC * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(TABLE_FAC_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_) #define TABLE_FAC_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_ #include #include "../GlobalDefinitions.h" /* Definitions ****************************************************************/ /* ETSI ES201980V2.1.1: page 115, 7.5.3: ...FAC shall use 4-QAM mapping. A fixed code rate shall be applied...R_all=0.6... 6 tailbits are used for the encoder to get in zero state -> 65 [number of cells] * 2 [4-QAM] * 0.6 [code-rate] - 6 [tailbits] = 72 */ #define NUM_FAC_BITS_PER_BLOCK 48 /* iTableNumOfServices[a][b] a: Number of audio services b: Number of data services (6.3.4) */ extern const int iTableNumOfServices[5][5]; /* Language code */ #define LEN_TABLE_LANGUAGE_CODE 16 extern const string strTableLanguageCode[LEN_TABLE_LANGUAGE_CODE]; /* Programme Type codes */ #define LEN_TABLE_PROG_TYPE_CODE_TOT 32 #define LEN_TABLE_PROG_TYPE_CODE 30 extern const string strTableProgTypCod[LEN_TABLE_PROG_TYPE_CODE_TOT]; /* Country code table according to ISO 3166 */ #define LEN_TABLE_COUNTRY_CODE 244 #define LEN_COUNTRY_CODE 2 #define MAX_LEN_DESC_COUNTRY_CODE 44 struct elCountry { char strcode [LEN_COUNTRY_CODE+1]; char strDesc [MAX_LEN_DESC_COUNTRY_CODE+1]; }; extern const struct elCountry TableCountryCode[LEN_TABLE_COUNTRY_CODE]; /* Get country name from ISO 3166 A2 */ string GetISOCountryName(const string strA2); /* Language code table according to ISO/IEC 639-2 */ #define LEN_TABLE_ISO_LANGUAGE_CODE 505 #define LEN_ISO_LANGUAGE_CODE 3 #define MAX_LEN_DESC_ISO_LANGUAGE_CODE 44 struct elLanguage { char strISOCode [LEN_ISO_LANGUAGE_CODE+1]; char strDesc [MAX_LEN_DESC_ISO_LANGUAGE_CODE+1]; }; extern const struct elLanguage TableISOLanguageCode[LEN_TABLE_ISO_LANGUAGE_CODE]; /* Get language name from ISO 3166 */ string GetISOLanguageName(const string strA3); /* CIRAF zones */ #define LEN_TABLE_CIRAF_ZONES 86 extern const string strTableCIRAFzones[LEN_TABLE_CIRAF_ZONES]; #endif // !defined(TABLE_FAC_H__3B0_CA63_4344_BGDEB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableMLC.h0000664000175000017500000002130313203343610020240 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Tables for MLC * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(_TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) #define _TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_ #include "../GlobalDefinitions.h" /* Definitions ****************************************************************/ /* Default number of iterations at application startup */ #define MC_NUM_ITERATIONS 1 /* Generator polynomials used for channel coding (octal form, defined by a leading "0"!). We must bit-reverse the octal-forms given in the standard since we shift bits from right to the left! */ /* In this implementation we shift bits from right to left, therefore the order of the code-words are: [..., b_(0, i), b_(1, i), b(2, i), b(3, i), ...] */ #define MC_NUM_OUTPUT_BITS_PER_STEP 4 /* MC: Multi-level Coder */ const _BYTE byGeneratorMatrix[MC_NUM_OUTPUT_BITS_PER_STEP] = { 0155, /* (133) x_{0, i} */ 0117, /* (171) x_{1, i} */ 0123, /* (145) x_{2, i} */ 0155 /* (133) x_{3, i} */ }; #define MC_CONSTRAINT_LENGTH 7 /* Since we have a periodical structure in the trellis it is enough to build one step. 2^(MC_CONSTRAINT_LENGTH - 1) states have to be considered. ("- 1": since one bit is the transition to the next state) */ #define MC_NUM_STATES (1 << (MC_CONSTRAINT_LENGTH - 1)) #define MC_NUM_OUTPUT_COMBINATIONS (1 << MC_NUM_OUTPUT_BITS_PER_STEP) /* Maximum number of levels (Its in case of HMmix) */ #define MC_MAX_NUM_LEVELS 6 /* Puncturing --------------------------------------------------------------- */ /* Only these types of patterns are used in DRM */ #define PP_TYPE_0000 0 /* not used, dummy */ #define PP_TYPE_1111 1 #define PP_TYPE_0111 2 #define PP_TYPE_0011 3 #define PP_TYPE_0001 4 #define PP_TYPE_0101 5 /* {a, b, c ...}: a = Number of groups, b = Number of "1"s, c = Patterns */ const uint32_t iPuncturingPatterns[13][10] = { /* B0: 1 B1: 1 B2: 1 B3: 1 */ {1, 4, PP_TYPE_1111, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 B1: 1 1 1 B2: 1 1 1 B3: 1 0 0 */ {3, 10, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 B1: 1 B2: 1 B3: 0 */ {1, 3, PP_TYPE_0111, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 1 B1: 1 1 1 1 B2: 1 1 1 0 B3: 0 0 0 0 */ {4, 11, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 B1: 1 B2: 0 B3: 0 */ {1, 2, PP_TYPE_0011, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 1 B1: 1 0 1 0 B2: 0 1 0 0 B3: 0 0 0 0 */ {4, 7, PP_TYPE_0011, PP_TYPE_0101, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 B1: 1 0 1 B2: 0 0 0 B3: 0 0 0 */ {3, 5, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0011, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 B1: 1 0 B2: 0 0 B3: 0 0 */ {2, 3, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 1 1 1 1 1 B1: 1 0 0 1 0 0 1 0 B2: 0 0 0 0 0 0 0 0 B3: 0 0 0 0 0 0 0 0 */ {8, 11, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0011, PP_TYPE_0001}, /* B0: 1 1 1 B1: 1 0 0 B2: 0 0 0 B3: 0 0 0 */ {3, 4, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 1 B1: 1 0 0 0 B2: 0 0 0 0 B3: 0 0 0 0 */ {4, 5, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000, PP_TYPE_0000}, /* B0: 1 1 1 1 1 1 1 B1: 1 0 0 0 0 0 0 B2: 0 0 0 0 0 0 0 B3: 0 0 0 0 0 0 0 */ {7, 8, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0000}, /* B0: 1 1 1 1 1 1 1 1 B1: 1 0 0 0 0 0 0 0 B2: 0 0 0 0 0 0 0 0 B3: 0 0 0 0 0 0 0 0 */ {8, 9, PP_TYPE_0011, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001, PP_TYPE_0001} }; /* Puncturing patterns for tailbits */ #define LENGTH_TAIL_BIT_PAT 6 const uint32_t iPunctPatTailbits[12][LENGTH_TAIL_BIT_PAT] = { /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 0 0 0 0 0 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 0 0 0 0 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 0 0 1 0 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0011, PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 0 1 0 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 0 1 1 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0011, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 0 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0011}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 0 0 0 0 0 0 */ {PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 1 0 0 0 0 0 */ {PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_0111}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 1 0 0 1 0 0 */ {PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_0111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_0111}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 1 1 0 1 0 0 */ {PP_TYPE_1111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_0111}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 1 1 0 1 0 1 */ {PP_TYPE_1111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_1111}, /* B0: 1 1 1 1 1 1 B1: 1 1 1 1 1 1 B2: 1 1 1 1 1 1 B3: 1 1 1 1 0 1 */ {PP_TYPE_1111, PP_TYPE_1111, PP_TYPE_1111, PP_TYPE_1111, PP_TYPE_0111, PP_TYPE_1111}, }; /* Code rate combinations --------------------------------------------------- */ /* row-index: protection level */ /* {a, b, c}: a = R_0, b = R_1, c = RY_Icm */ /* {a}: a = R_0 */ const int iCodRateCombMSC4SM = { 6 }; const int iCodRateCombMSC16SM[2][3] = { {2, 7, 3}, {4, 9, 4} }; /* {a, b, c, d}: a = R_0, b = R_1, c = R_2, d = RY_Icm */ const int iCodRateCombMSC64SM[4][4] = { {0, 4, 9, 4}, {2, 7, 10, 15}, {4, 9, 11, 8}, {7, 10, 12, 45} }; /* {a}: a = R_0 */ const int iCodRateCombFDC4SM = { 6 }; /* Interleaver sequence ----------------------------------------------------- */ /* The different coding modes in DRM use bit-interleavers in certain paths. We define the following vectors to store the position and type of the interleaver as described in the DRM-standard Interleaver modules have to be initialized in the way: [0]: t_0 = 13; [1]: t_0 = 21; "-1": no interleaver in this level */ const int iInterlSequ4SM[MC_MAX_NUM_LEVELS] = { 1, -1, -1, -1, -1, -1}; const int iInterlSequ16SM[MC_MAX_NUM_LEVELS] = { 0, 1, -1, -1, -1, -1}; const int iInterlSequ64SM[MC_MAX_NUM_LEVELS] = {-1, 0, 1, -1, -1, -1}; #endif // !defined(_TABLE_MLC_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/tables/TableQAMMapping.h0000664000175000017500000000565713203343610021575 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Tables for QAM mapping (Mapping is already normalized) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(QAM_MAPPING_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) #define QAM_MAPPING_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_ #include "../GlobalDefinitions.h" /* Definitions ****************************************************************/ /* Input bits are collected in bytes separately for imaginary and real part. The order is: [i_0, i_1, i_2] and [q_0, q_1, q_2] -> {i, q} All entries are normalized according to the DRM-standard */ const _REAL rTableQAM64SM[8][2] = { { 1.0801234497f, 1.0801234497f}, {-0.1543033499f, -0.1543033499f}, { 0.4629100498f, 0.4629100498f}, {-0.7715167498f, -0.7715167498f}, { 0.7715167498f, 0.7715167498f}, {-0.4629100498f, -0.4629100498f}, { 0.1543033499f, 0.1543033499f}, {-1.0801234497f, -1.0801234497f} }; const _REAL rTableQAM64HMsym[8][2] = { { 1.0801234497f, 1.0801234497f}, { 0.4629100498f, 0.4629100498f}, { 0.7715167498f, 0.7715167498f}, { 0.1543033499f, 0.1543033499f}, {-0.1543033499f, -0.1543033499f}, {-0.7715167498f, -0.7715167498f}, {-0.4629100498f, -0.4629100498f}, {-1.0801234497f, -1.0801234497f} }; const _REAL rTableQAM64HMmix[8][2] = { { 1.0801234497f, 1.0801234497f}, { 0.4629100498f, -0.1543033499f}, { 0.7715167498f, 0.4629100498f}, { 0.1543033499f, -0.7715167498f}, {-0.1543033499f, 0.7715167498f}, {-0.7715167498f, -0.4629100498f}, {-0.4629100498f, 0.1543033499f}, {-1.0801234497f, -1.0801234497f} }; const _REAL rTableQAM16[4][2] = { { 0.9486832980f, 0.9486832980f}, {-0.3162277660f, -0.3162277660f}, { 0.3162277660f, 0.3162277660f}, {-0.9486832980f, -0.9486832980f} }; const _REAL rTableQAM4[2][2] = { { 0.7071067811f, 0.7071067811f}, {-0.7071067811f, -0.7071067811f} }; #endif // !defined(QAM_MAPPING_H__3B0_CA63_4344_BB2B_23E7912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/util/Buffer.h0000664000175000017500000002316713203343610017603 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * Transfer buffer between different modules * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(PUFFER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define PUFFER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "appglobal.h" #include "../GlobalDefinitions.h" #include "vector.h" /* Classes ********************************************************************/ /* Buffer base class */ template class CBuffer { public: CBuffer() : iBufferSize(0), bRequestFlag(false) , bNoMoreDataFlag(false){} virtual ~CBuffer() {} void SetRequestFlag(const _BOOLEAN bNewRequestFlag) { bRequestFlag = bNewRequestFlag; } void SetNoMoreDataFlag(const _BOOLEAN bNewNoMoreDataFlag) { bNoMoreDataFlag = bNewNoMoreDataFlag; } _BOOLEAN GetRequestFlag() const {return bRequestFlag;} _BOOLEAN GetNoMoreDataFlag() const {return bNoMoreDataFlag;} /* Virtual function to be declared by the derived object */ virtual void Init(const int iNewBufferSize); virtual CVectorEx* Get(const int iRequestedSize) = 0; virtual CVectorEx* QueryWriteBuffer() = 0; virtual void Put(const int iOfferedSize) = 0; virtual void Clear() = 0; virtual int GetFillLevel() const = 0; CVectorEx &getVecBuffer() {return vecBuffer;} protected: CVectorEx vecBuffer; int iBufferSize; _BOOLEAN bRequestFlag; _BOOLEAN bNoMoreDataFlag; }; /* Single block buffer */ template class CSingleBuffer : public CBuffer { public: CSingleBuffer() : iFillLevel(0) {} CSingleBuffer(const int iNBufSize) {Init(iNBufSize);} virtual ~CSingleBuffer() {} virtual void Init(const int iNewBufferSize); virtual CVectorEx* Get(const int iRequestedSize); virtual CVectorEx* QueryWriteBuffer() {return &(this->vecBuffer);} virtual void Put(const int iOfferedSize); virtual void Clear() {iFillLevel = 0;} virtual int GetFillLevel() const {return iFillLevel;} protected: int iFillLevel; }; /* Cyclic buffer */ template class CCyclicBuffer : public CBuffer { public: enum EBufferState {BS_FULL, BS_EMPTY}; // BS: Buffer Status CCyclicBuffer() {Clear();} CCyclicBuffer(const int iNBufSize) {Init(iNBufSize);} virtual ~CCyclicBuffer() {} virtual void Init(const int iNewBufferSize); virtual CVectorEx* Get(const int iRequestedSize) ; virtual CVectorEx* QueryWriteBuffer() { return &vecInOutBuffer;} virtual void Put(const int iOfferedSize); virtual void Clear(); virtual int GetFillLevel() const; protected: CVectorEx vecInOutBuffer; int iPut; int iGet; EBufferState iBufferState; }; /* Implementation *************************************************************/ template void CBuffer::Init(const int iNewBufferSize) { // printf("init van CBuffer size %d \n", iNewBufferSize); /* Assign buffer size */ iBufferSize = iNewBufferSize; /* Allocate memory for data field */ vecBuffer.Init(iBufferSize); } /******************************************************************************\ * Single block buffer * \******************************************************************************/ template void CSingleBuffer::Init(const int iNewBufferSize) { /* Only initialize buffer when size has changed, otherwise preserve data */ if (iNewBufferSize != this->iBufferSize) { CBuffer::Init(iNewBufferSize); /* Reset buffer parameters (empty buffer) */ iFillLevel = 0; } } template CVectorEx* CSingleBuffer::Get(const int iRequestedSize) { /* Get data */ #ifdef _DEBUG_ if (iRequestedSize > iFillLevel) { DebugError("SingleBuffer Get()", "FillLevel", iFillLevel, "Requested size", iRequestedSize); } #endif /* Block is read, buffer is now empty again */ iFillLevel -= iRequestedSize; return &(this->vecBuffer); } template void CSingleBuffer::Put(const int iOfferedSize) { /* New Block was added, set new fill level */ iFillLevel += iOfferedSize; #ifdef _DEBUG_ if (iFillLevel > this->iBufferSize) { DebugError("SingleBuffer Put()", "FillLevel", iFillLevel, "Buffer size", this->iBufferSize); } #endif } /******************************************************************************\ * Cyclic buffer * \******************************************************************************/ template void CCyclicBuffer::Init(const int iNewBufferSize) { // printf("In Init CCcyclic Buffer size is %d\n", iNewBufferSize); /* Only initialize buffer when size has changed, otherwise preserve data */ if (iNewBufferSize != this->iBufferSize) { CBuffer::Init(iNewBufferSize); /* Make in- and output buffer the same size as the main buffer to make sure that the worst-case is no problem */ vecInOutBuffer.Init(iNewBufferSize); /* Reset buffer parameters (empty buffer) */ iPut = 0; iGet = 0; iBufferState = BS_EMPTY; } } template void CCyclicBuffer::Clear() { /* Clear buffer by resetting the pointer */ iPut = 0; iGet = 0; iBufferState = BS_EMPTY; this->bRequestFlag = false; } template CVectorEx* CCyclicBuffer::Get(const int iRequestedSize) { int i; int iAvailSpace; int iElementCount; /* Test if enough data is available for reading */ // printf("Ccyclicbuffer get iPut %d iGet %d \n", iPut, iGet); iAvailSpace = iPut - iGet; /* Test if wrap is needed */ if ((iAvailSpace < 0) || ((iAvailSpace == 0) && (iBufferState == BS_FULL))) iAvailSpace += this->iBufferSize; #ifdef _DEBUG_ if (iAvailSpace < iRequestedSize) { DebugError("CyclicBuffer Get()", "Availabe space", iAvailSpace, "Requested size", iAvailSpace); } #endif /* Get data ------------------------------------------------------------- */ iElementCount = 0; /* Test if data can be read in one block */ if (this->iBufferSize - iGet < iRequestedSize) { /* Data must be read in two portions */ for (i = iGet; i < this->iBufferSize; i++) { vecInOutBuffer[iElementCount] = this->vecBuffer[i]; iElementCount++; } for (i = 0; i < iRequestedSize - this->iBufferSize + iGet; i++) { vecInOutBuffer[iElementCount] = this->vecBuffer[i]; iElementCount++; } } else { /* Data can be read in one block */ for (i = iGet; i < iGet + iRequestedSize; i++) { vecInOutBuffer[iElementCount] = this->vecBuffer[i]; iElementCount++; } } /* Adjust iGet pointer */ iGet += iRequestedSize; if (iGet >= this->iBufferSize) iGet -= this->iBufferSize; /* Test if buffer is empty. If yes, set empty-flag */ if ((iGet == iPut) && (iRequestedSize > 0)) iBufferState = BS_EMPTY; return &vecInOutBuffer; } template void CCyclicBuffer::Put(const int iOfferedSize) { int iAvailSpace; int i; int iElementCount; /* Test if enough data is available for writing */ iAvailSpace = iGet - iPut; /* Test if wrap is needed */ if ((iAvailSpace < 0) || ((iAvailSpace == 0) && (iBufferState == BS_EMPTY))) iAvailSpace += this->iBufferSize; #ifdef _DEBUG_ if (iAvailSpace < iOfferedSize) { DebugError("CyclicBuffer Put()", "Available space", iAvailSpace, "Offered size", iOfferedSize); } #endif /* Put data ------------------------------------------------------------- */ iElementCount = 0; /* Test if data can be written in one block */ if (this->iBufferSize - iPut < iOfferedSize) { /* Data must be written in two steps */ for (i = iPut; i < this->iBufferSize; i++) { this->vecBuffer[i] = vecInOutBuffer[iElementCount]; iElementCount++; } for (i = 0; i < iOfferedSize - this->iBufferSize + iPut; i++) { this->vecBuffer[i] = vecInOutBuffer[iElementCount]; iElementCount++; } } else { /* Data can be written in one block */ for (i = iPut; i < iPut + iOfferedSize; i++) { this->vecBuffer[i] = vecInOutBuffer[iElementCount]; iElementCount++; } } /* Adjust iPut pointer */ iPut += iOfferedSize; if (iPut >= this->iBufferSize) iPut -= this->iBufferSize; /* Test if buffer is full. If yes, set full-flag */ if ((iGet == iPut) && (iOfferedSize > 0)) iBufferState = BS_FULL; } template int CCyclicBuffer::GetFillLevel() const { int iFillLevel; /* Calculate the available data in the buffer. Test if wrap is needed! Take into account the flag-information (full or empty buffer) */ iFillLevel = iPut - iGet; if ((iFillLevel == 0) && (iBufferState == BS_FULL)) iFillLevel = this->iBufferSize; if (iFillLevel < 0) iFillLevel += this->iBufferSize; /* Wrap around */ return iFillLevel; } #endif // !defined(PUFFER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/util/CRC.cpp0000664000175000017500000002005013203343610017320 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * adapted for ham sstv use Ties Bos - PA0MBO * Description: NOTE: This code is NOT speed optimized! We should calculate the CRC byte-wise and precalculate the results in a table (TODO!) * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "CRC.h" /* Implementation *************************************************************/ void CCRC::Reset(const int iNewDegree) { /* Build mask of bit, which was shifted out of the shift register */ iBitOutPosMask = 1 << iNewDegree; /* Index of vector storing the polynominals for CRC calculation */ iDegIndex = iNewDegree - 1; /* Init state shift-register with ones. Set all registers to "1" with bit-wise not operation */ iStateShiftReg = ~uint32_t(0); } void CCRC::AddByte(const _BYTE byNewInput) { for (int i = 0; i < SIZEOF__BYTE; i++) { /* Shift bits in shift-register for transistion */ iStateShiftReg <<= 1; /* Take bit, which was shifted out of the register-size and place it at the beginning (LSB) (If condition is not satisfied, implicitely a "0" is added) */ if ((iStateShiftReg & iBitOutPosMask) > 0) iStateShiftReg |= 1; /* Add new data bit to the LSB */ if ((byNewInput & (1 << (SIZEOF__BYTE - i - 1))) > 0) iStateShiftReg ^= 1; /* Add mask to shift-register if first bit is true */ if (iStateShiftReg & 1) iStateShiftReg ^= iPolynMask[iDegIndex]; } } void CCRC::AddBit(const _BINARY biNewInput) { /* Shift bits in shift-register for transistion */ iStateShiftReg <<= 1; /* Take bit, which was shifted out of the register-size and place it at the beginning (LSB) (If condition is not satisfied, implicitely a "0" is added) */ if ((iStateShiftReg & iBitOutPosMask) > 0) iStateShiftReg |= 1; /* Add new data bit to the LSB */ if (biNewInput > 0) iStateShiftReg ^= 1; /* Add mask to shift-register if first bit is true */ if (iStateShiftReg & 1) iStateShiftReg ^= iPolynMask[iDegIndex]; } uint32_t CCRC::GetCRC() { /* Return inverted shift-register (1's complement) */ iStateShiftReg = ~iStateShiftReg; /* Remove bit which where shifted out of the shift-register frame */ return iStateShiftReg & (iBitOutPosMask - 1); } _BOOLEAN CCRC::CheckCRC(const uint32_t iCRC) { if (iCRC == GetCRC()) return true; else return false; } CCRC::CCRC() { /* These polynominals are used in the DRM-standard */ iPolynMask[0] = 0; iPolynMask[1] = 1 << 1; iPolynMask[2] = 1 << 1; iPolynMask[4] = (1 << 1) | (1 << 2) | (1 << 4); iPolynMask[5] = (1 << 1) | (1 << 2) | (1 << 3) | (1 << 5); iPolynMask[7] = (1 << 2) | (1 << 3) | (1 << 4); iPolynMask[15] = (1 << 5) | (1 << 12); } /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Andreas Dittrich, Torsten Schorr */ /* */ /* Author(s) : Andreas Dittrich (dittrich@eit.uni-kl.de), */ /* Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 27.07.2004 */ /* Last change : 27.07.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* crc16_bytewise.c */ /* */ /******************************************************************************/ /* Description: */ /* CRC-16 checksum calculation of a byte stream */ /* Usage: */ /* */ /* crc16_bytewise(double *checksum, unsigned char *in, long N); */ /* */ /* calculates double checksum of uint8 bytes */ /* */ /******************************************************************************/ /************* * * adjusted for use in own plain C programa * by M.Bos - PA0MBO * * Date Dec 9th 2007 */ /******************************************************************************/ /* function */ /******************************************************************************/ void CCRC::crc16_bytewise(double checksum[], unsigned char in[], long N) { long int i; int j; unsigned int b = 0xFFFF; unsigned int x = 0x1021; /* (1) 0001000000100001 */ unsigned int y=0; for (i = 0; i < N - 2; i++) { for (j = 7; j >= 0; j--) { y = (((b >> 15) + (unsigned int) (in[i] >> j)) & 0x01) & 0x01; /* extra parenth pa0mbo */ if (y == 1) b = ((b << 1) ^ x); else b = (b << 1); } } for (i = N - 2; i < N; i++) { for (j = 7; j >= 0; j--) { y = (((b >> 15) + (unsigned int) ((in[i] >> j) & 0x01)) ^ 0x01) & 0x01; /* extra parent pa0mbo */ if (y == 1) b = ((b << 1) ^ x); else b = (b << 1); } } *checksum = (double) (b & 0xFFFF); } qsstv_9.2.6/qsstv/drmtx/common/util/CRC.h0000664000175000017500000000360713203343610016776 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * extended for ham sstv use Ties Bos - PA0MBO * * Description: * See CRC.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(CRC_H__3B0BA660_CA63_4VASDGLJNAJ2B_23E7A0D31912__INCLUDED_) #define CRC_H__3B0BA660_CA63_4VASDGLJNAJ2B_23E7A0D31912__INCLUDED_ #include "../GlobalDefinitions.h" /* Classes ********************************************************************/ class CCRC { public: CCRC(); virtual ~CCRC() {} void Reset(const int iNewDegree); void AddByte(const _BYTE byNewInput); void AddBit(const _BINARY biNewInput); _BOOLEAN CheckCRC(const uint32_t iCRC); uint32_t GetCRC(); void crc16_bytewise(double checksum[], unsigned char in[], long N); protected: int iDegIndex; uint32_t iBitOutPosMask; uint32_t iPolynMask[16]; uint32_t iStateShiftReg; }; #endif // !defined(CRC_H__3B0BA660_CA63_4VASDGLJNAJ2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/util/Modul.h0000664000175000017500000003123313203343610017443 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * High level class for all modules. The common functionality for reading * and writing the transfer-buffers are implemented here. * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(AFX_MODUL_H__41E39CD3_2AEC_400E_907B_148C0EC17A43__INCLUDED_) #define AFX_MODUL_H__41E39CD3_2AEC_400E_907B_148C0EC17A43__INCLUDED_ #include "Buffer.h" #include "utils/vector.h" #include "../Parameter.h" #include /* Classes ********************************************************************/ /* CModul ------------------------------------------------------------------- */ template class CModul { public: CModul(); virtual ~CModul() {} virtual void Init(CParameter& Parameter); virtual void Init(CParameter& Parameter, CBuffer& OutputBuffer); protected: CVectorEx* pvecInputData; CVectorEx* pvecOutputData; /* Max block-size are used to determine the size of the requiered buffer */ int iMaxOutputBlockSize; /* Actual read (or written) size of the data */ int iInputBlockSize; int iOutputBlockSize; void Lock() {Mutex.Lock();} void Unlock() {Mutex.Unlock();} void InitThreadSave(CParameter& Parameter); virtual void InitInternal(CParameter& Parameter) = 0; void ProcessDataThreadSave(CParameter& Parameter); virtual void ProcessDataInternal(CParameter& Parameter) = 0; private: CMutex Mutex; }; /* CTransmitterModul -------------------------------------------------------- */ template class CTransmitterModul : public CModul { public: CTransmitterModul(); virtual ~CTransmitterModul() {} virtual void Init(CParameter& Parameter); virtual void Init(CParameter& Parameter, CBuffer& OutputBuffer); virtual void ReadData(CParameter& Parameter, CBuffer& OutputBuffer); virtual void ProcessData(CParameter& Parameter, CBuffer& OutputBuffer); virtual _BOOLEAN ProcessData(CParameter& Parameter, CBuffer& InputBuffer, CBuffer& OutputBuffer); virtual void ProcessData(CParameter& Parameter, CBuffer& InputBuffer, CBuffer& InputBuffer2, // CBuffer& InputBuffer3, pa0mbo CBuffer& OutputBuffer); virtual _BOOLEAN WriteData(CParameter& Parameter, CBuffer& InputBuffer); protected: /* Additional buffers if the derived class has multiple input streams */ CVectorEx* pvecInputData2; CVectorEx* pvecInputData3; /* Actual read (or written) size of the data */ int iInputBlockSize2; int iInputBlockSize3; }; /* Implementation *************************************************************/ /******************************************************************************\ * CModul * \******************************************************************************/ template CModul::CModul() { /* Initialize everything with zeros */ iMaxOutputBlockSize = 0; iInputBlockSize = 0; iOutputBlockSize = 0; pvecInputData = NULL; pvecOutputData = NULL; } template void CModul::ProcessDataThreadSave(CParameter& Parameter) { /* Get a lock for the resources */ Lock(); /* Call processing routine of derived modul */ ProcessDataInternal(Parameter); /* Unlock resources */ Unlock(); } template void CModul::InitThreadSave(CParameter& Parameter) { /* Get a lock for the resources */ Lock(); try { /* Call init of derived modul */ InitInternal(Parameter); /* Unlock resources */ Unlock(); } catch (CGenErr) { /* Unlock resources */ Unlock(); /* Throws the same error again which was send by the function */ throw; } } template void CModul::Init(CParameter& Parameter) { /* Init some internal variables */ iInputBlockSize = 0; /* Call init of derived modul */ InitThreadSave(Parameter); } template void CModul::Init(CParameter& Parameter, CBuffer& OutputBuffer) { /* Init some internal variables */ iMaxOutputBlockSize = 0; iInputBlockSize = 0; iOutputBlockSize = 0; /* Call init of derived modul */ InitThreadSave(Parameter); /* Init output transfer buffer */ if (iMaxOutputBlockSize != 0) OutputBuffer.Init(iMaxOutputBlockSize); else { if (iOutputBlockSize != 0) OutputBuffer.Init(iOutputBlockSize); } } /******************************************************************************\ * Transmitter modul (CTransmitterModul) * \******************************************************************************/ template CTransmitterModul::CTransmitterModul() { /* Initialize all member variables with zeros */ iInputBlockSize2 = 0; iInputBlockSize3 = 0; pvecInputData2 = NULL; pvecInputData3 = NULL; } template void CTransmitterModul::Init(CParameter& Parameter) { /* Init some internal variables */ iInputBlockSize2 = 0; iInputBlockSize3 = 0; /* Init base-class */ CModul::Init(Parameter); } template void CTransmitterModul::Init(CParameter& Parameter, CBuffer& OutputBuffer) { /* Init some internal variables */ iInputBlockSize2 = 0; iInputBlockSize3 = 0; /* Init base-class */ CModul::Init(Parameter, OutputBuffer); } template _BOOLEAN CTransmitterModul:: ProcessData(CParameter& Parameter, CBuffer& InputBuffer, CBuffer& OutputBuffer) { // printf("Tx Par Inp Outp request is %d\n", OutputBuffer.GetRequestFlag()); /* OUTPUT-DRIVEN modul implementation in the transmitter ---------------- */ /* Look in output buffer if data is requested */ if (OutputBuffer.GetRequestFlag() == true) { // printf("CTransmitterModul Getrequest is true\n"); /* Check, if enough input data is available */ if (InputBuffer.GetFillLevel() < this->iInputBlockSize) { /* Set request flag */ InputBuffer.SetRequestFlag(true); return false; } /* Get vector from transfer-buffer */ this->pvecInputData = InputBuffer.Get(this->iInputBlockSize); /* Query vector from output transfer-buffer for writing */ this->pvecOutputData = OutputBuffer.QueryWriteBuffer(); /* Copy extended data from vectors */ (*(this->pvecOutputData)).SetExData((*(this->pvecInputData)).GetExData()); /* Call the underlying processing-routine */ this->ProcessDataInternal(Parameter); /* Write processed data from internal memory in transfer-buffer */ OutputBuffer.Put(this->iOutputBlockSize); /* Data was provided, clear data request */ OutputBuffer.SetRequestFlag(false); } return true; } template void CTransmitterModul:: ProcessData(CParameter& Parameter, CBuffer& InputBuffer, CBuffer& InputBuffer2, // CBuffer& InputBuffer3, pa0mbo CBuffer& OutputBuffer) { /* OUTPUT-DRIVEN modul implementation in the transmitter ---------------- */ /* Look in output buffer if data is requested */ // printf("Tx Par Inp1 Inp2 Outp request is %d inp1size %d inp2size %d \n", // OutputBuffer.GetRequestFlag(), this->iInputBlockSize, iInputBlockSize2); if (OutputBuffer.GetRequestFlag() == true) { /* Check, if enough input data is available from all sources */ if (InputBuffer.GetFillLevel() < this->iInputBlockSize) { /* Set request flag */ // printf("tx modul 2 inputs setting request on buf1 \n"); InputBuffer.SetRequestFlag(true); return; } if (InputBuffer2.GetFillLevel() < iInputBlockSize2) { /* Set request flag */ // printf("tx modul 2 inputs setting request on buf2 \n"); InputBuffer2.SetRequestFlag(true); return; } /* if (InputBuffer3.GetFillLevel() < iInputBlockSize3) { InputBuffer3.SetRequestFlag(true); return; } */ /* Get vectors from transfer-buffers */ addToLog(QString("ProcesData get %1").arg(this->iInputBlockSize),LOGDRMTX); this->pvecInputData = InputBuffer.Get(this->iInputBlockSize); pvecInputData2 = InputBuffer2.Get(iInputBlockSize2); // pvecInputData3 = InputBuffer3.Get(iInputBlockSize3); pa0mbo /* Query vector from output transfer-buffer for writing */ this->pvecOutputData = OutputBuffer.QueryWriteBuffer(); /* Call the underlying processing-routine */ this->ProcessDataInternal(Parameter); /* Write processed data from internal memory in transfer-buffer */ OutputBuffer.Put(this->iOutputBlockSize); /* Data was provided, clear data request */ OutputBuffer.SetRequestFlag(false); } } template void CTransmitterModul::ProcessData(CParameter& Parameter, CBuffer& OutputBuffer) { // printf("Tx par Outp request flag is %d\n", OutputBuffer.GetRequestFlag()); /* OUTPUT-DRIVEN modul implementation in the transmitter ---------------- */ /* Look in output buffer if data is requested */ if (OutputBuffer.GetRequestFlag() == true) { /* Read data and write it in the transfer-buffer. Query vector from output transfer-buffer for writing */ this->pvecOutputData = OutputBuffer.QueryWriteBuffer(); /* Call the underlying processing-routine */ this->ProcessDataInternal(Parameter); /* Write processed data from internal memory in transfer-buffer */ OutputBuffer.Put(this->iOutputBlockSize); /* Data was provided, clear data request */ OutputBuffer.SetRequestFlag(false); } } template void CTransmitterModul:: ReadData(CParameter& Parameter, CBuffer& OutputBuffer) { // printf("CTransmitterModul entry flag is %d\n", OutputBuffer.GetRequestFlag()); /* OUTPUT-DRIVEN modul implementation in the transmitter ---------------- */ /* Look in output buffer if data is requested */ // printf("Tx ReadData request flag is %d \n", OutputBuffer.GetRequestFlag()); if (OutputBuffer.GetRequestFlag() == true) { /* Read data and write it in the transfer-buffer. Query vector from output transfer-buffer for writing */ this->pvecOutputData = OutputBuffer.QueryWriteBuffer(); /* Call the underlying processing-routine */ this->ProcessDataInternal(Parameter); /* Write processed data from internal memory in transfer-buffer */ OutputBuffer.Put(this->iOutputBlockSize); /* Data was provided, clear data request */ OutputBuffer.SetRequestFlag(false); } } template _BOOLEAN CTransmitterModul:: WriteData(CParameter& Parameter, CBuffer& InputBuffer) { // printf("WriteData fill %d Inpblk size %d \n", // InputBuffer.GetFillLevel(), this->iInputBlockSize); /* OUTPUT-DRIVEN modul implementation in the transmitter */ /* Check, if enough input data is available */ if (InputBuffer.GetFillLevel() < this->iInputBlockSize) { // printf("set request flag transmitter module WriteData \n"); /* Set request flag */ InputBuffer.SetRequestFlag(true); return false; } // printf("Getting the data in TXModul from input buffer\n"); /* Get vector from transfer-buffer */ this->pvecInputData = InputBuffer.Get(this->iInputBlockSize); /* Call the underlying processing-routine */ this->ProcessDataInternal(Parameter); return true; } #endif // !defined(AFX_MODUL_H__41E39CD3_2AEC_400E_907B_148C0EC17A43__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/util/Utilities.cpp0000664000175000017500000002263613203343610020700 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2004 * * Author(s): * Volker Fischer * * Description: * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "Utilities.h" #include #include #if defined(_WIN32) # ifdef HAVE_SETUPAPI # ifndef INITGUID # define INITGUID 1 # endif # include # include # if defined(_MSC_VER) && (_MSC_VER < 1400) || defined(__MINGW32__) DEFINE_GUID(GUID_DEVINTERFACE_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73); # endif # endif #elif defined(__APPLE__) #include #include #include #endif /* Implementation *************************************************************/ /******************************************************************************\ * Signal level meter * \******************************************************************************/ //void //CSignalLevelMeter::Update(const _REAL rVal) //{ // /* Search for maximum. Decrease this max with time */ // /* Decrease max with time */ // if (rCurLevel >= METER_FLY_BACK) // rCurLevel -= METER_FLY_BACK; // else // { // if ((rCurLevel <= METER_FLY_BACK) && (rCurLevel > 1)) // rCurLevel -= 2; // } // /* Search for max */ // const _REAL rCurAbsVal = Abs(rVal); // if (rCurAbsVal > rCurLevel) // rCurLevel = rCurAbsVal; //} //void //CSignalLevelMeter::Update(const CVector < _REAL > vecrVal) //{ // /* Do the update for entire vector */ // const int iVecSize = vecrVal.Size(); // for (int i = 0; i < iVecSize; i++) // Update(vecrVal[i]); //} //void //CSignalLevelMeter::Update(const CVector < _SAMPLE > vecsVal) //{ // /* Do the update for entire vector, convert to real */ // const int iVecSize = vecsVal.Size(); // for (int i = 0; i < iVecSize; i++) // Update((_REAL) vecsVal[i]); //} //_REAL CSignalLevelMeter::Level() //{ // const _REAL // rNormMicLevel = rCurLevel / _MAXSHORT; // /* Logarithmic measure */ // if (rNormMicLevel > 0) // return 20.0 * log10(rNormMicLevel); // else // return RET_VAL_LOG_0; //} /******************************************************************************\ * Bandpass filter * \******************************************************************************/ void CDRMBandpassFilt::Process(CVector < _COMPLEX > &veccData) { int i; /* Copy CVector data in CMatlibVector */ for (i = 0; i < iBlockSize; i++) cvecDataTmp[i] = veccData[i]; /* Apply FFT filter */ cvecDataTmp = CComplexVector(FftFilt (cvecB, Real(cvecDataTmp), rvecZReal, FftPlanBP), FftFilt(cvecB, Imag(cvecDataTmp), rvecZImag, FftPlanBP)); /* Copy CVector data in CMatlibVector */ for (i = 0; i < iBlockSize; i++) veccData[i] = cvecDataTmp[i]; } void CDRMBandpassFilt::Init(const int iNewBlockSize, const _REAL rOffsetHz, const ESpecOcc eSpecOcc, const EFiltType eNFiTy) { CReal rMargin = 0.0; /* Set internal parameter */ iBlockSize = iNewBlockSize; /* Init temporary vector */ cvecDataTmp.Init(iBlockSize); /* Choose correct filter for chosen DRM bandwidth. Also, adjust offset frequency for different modes. E.g., 5 kHz mode is on the right side of the DC frequency */ CReal rNormCurFreqOffset = rOffsetHz / SOUNDCRD_SAMPLE_RATE; /* Band-pass filter bandwidth */ CReal rBPFiltBW = ((CReal) 10000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; /* Negative margin for receiver filter for better interferer rejection */ if (eNFiTy == FT_TRANSMITTER) rMargin = (CReal) 0.0; /* Hz was 300 */ else rMargin = (CReal) 0.0; /* Hz */ switch (eSpecOcc) { case SO_0: rBPFiltBW = ((CReal) 2000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; // pa0mbo was 4500.0 moet zijn 2250? /* Completely on the right side of DC */ rNormCurFreqOffset = (rOffsetHz + (CReal) 1100.0) / SOUNDCRD_SAMPLE_RATE; // pa0mbo // ( (CReal) 7100.0 ) / SOUNDCRD_SAMPLE_RATE; // pa0mbo // printf("util Bandpass filt init SO_0 BW %g rNormOffs %g\n", rBPFiltBW, rNormCurFreqOffset); break; case SO_1: rBPFiltBW = ((CReal) 2500.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; // pa0mbo was 5000.0 moet zijn 2500 ? /* Completely on the right side of DC */ rNormCurFreqOffset = (rOffsetHz + (CReal) 1250.0) / SOUNDCRD_SAMPLE_RATE; // pa0mbo // ( (CReal) 7240.0 ) / SOUNDCRD_SAMPLE_RATE; // pa0mbo // printf("util drmbandpass SO_1 BW = %g , Offset = %g \n", rBPFiltBW, rNormCurFreqOffset); break; case SO_2: rBPFiltBW = ((CReal) 9000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; /* Centered */ rNormCurFreqOffset = rOffsetHz / SOUNDCRD_SAMPLE_RATE; break; case SO_3: rBPFiltBW = ((CReal) 10000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; /* Centered */ rNormCurFreqOffset = rOffsetHz / SOUNDCRD_SAMPLE_RATE; break; case SO_4: rBPFiltBW = ((CReal) 18000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; /* Main part on the right side of DC */ rNormCurFreqOffset = (rOffsetHz + (CReal) 4500.0) / SOUNDCRD_SAMPLE_RATE; break; case SO_5: rBPFiltBW = ((CReal) 20000.0 + rMargin) / SOUNDCRD_SAMPLE_RATE; /* Main part on the right side of DC */ rNormCurFreqOffset = (rOffsetHz + (CReal) 5000.0) / SOUNDCRD_SAMPLE_RATE; break; } // printf("Init bandpass BW = %g rNorm %g \n", rBPFiltBW, rNormCurFreqOffset); /* FFT plan is initialized with the long length */ FftPlanBP.Init(iBlockSize * 2); /* State memory (init with zeros) and data vector */ rvecZReal.Init(iBlockSize, (CReal) 0.0); rvecZImag.Init(iBlockSize, (CReal) 0.0); rvecDataReal.Init(iBlockSize); rvecDataImag.Init(iBlockSize); /* "+ 1" because of the Nyquist frequency (filter in frequency domain) */ cvecB.Init(iBlockSize + 1); /* Actual filter design */ CRealVector vecrFilter(iBlockSize); vecrFilter = FirLP(rBPFiltBW, Nuttallwin(iBlockSize)); /* Copy actual filter coefficients. It is important to initialize the vectors with zeros because we also do a zero-padding */ CRealVector rvecB(2 * iBlockSize, (CReal) 0.0); /* Modulate filter to shift it to the correct IF frequency */ for (int i = 0; i < iBlockSize; i++) { rvecB[i] = vecrFilter[i] * Cos((CReal) 2.0 * crPi * rNormCurFreqOffset * i); } /* Transformation in frequency domain for fft filter */ cvecB = rfft(rvecB, FftPlanBP); /* debugging pa0mbo for (i=0; i < iBlockSize; i++) { printf(" vecrFilter[%d] is %g cvecB[%d] real is %g \n", i, vecrFilter[i], i, cvecB[i].real()); } */ // printf("end of init BPfilt, iBlockSize %d rBPFBW %g rOffsetHz %g i rNormFreqoff %g\n", // iBlockSize, rBPFiltBW, rOffsetHz, rNormCurFreqOffset ) ; // printf("Soundcard sample rate is %d \n", SOUNDCRD_SAMPLE_RATE); } /******************************************************************************\ * Modified Julian Date * \******************************************************************************/ void CModJulDate::Set(const uint32_t iModJulDate) { uint32_t iZ, iA, iAlpha, iB, iC, iD, iE; _REAL rJulDate; /* Definition of the Modified Julian Date */ rJulDate = (_REAL) iModJulDate + 2400000.5; /* Get "real" date out of Julian Date (Taken from "http://mathforum.org/library/drmath/view/51907.html") */ // 1. Add .5 to the JD and let Z = integer part of (JD+.5) and F the // fractional part F = (JD+.5)-Z iZ = (uint32_t) (rJulDate + (_REAL) 0.5); // rF = (rJulDate + (_REAL) 0.5) - iZ; // 2. If Z < 2299161, take A = Z // If Z >= 2299161, calculate alpha = INT((Z-1867216.25)/36524.25) // and A = Z + 1 + alpha - INT(alpha/4). if (iZ < 2299161) iA = iZ; else { iAlpha = (int) (((_REAL) iZ - (_REAL) 1867216.25) / (_REAL) 36524.25); iA = iZ + 1 + iAlpha - (int) ((_REAL) iAlpha / (_REAL) 4.0); } // 3. Then calculate: // B = A + 1524 // C = INT( (B-122.1)/365.25) // D = INT( 365.25*C ) // E = INT( (B-D)/30.6001 ) iB = iA + 1524; iC = (int) (((_REAL) iB - (_REAL) 122.1) / (_REAL) 365.25); iD = (int) ((_REAL) 365.25 * iC); iE = (int) (((_REAL) iB - iD) / (_REAL) 30.6001); // The day of the month dd (with decimals) is: // dd = B - D - INT(30.6001*E) + F iDay = iB - iD - (int) ((_REAL) 30.6001 * iE); // + rF; // The month number mm is: // mm = E - 1, if E < 13.5 // or // mm = E - 13, if E > 13.5 if ((_REAL) iE < 13.5) iMonth = iE - 1; else iMonth = iE - 13; // The year yyyy is: // yyyy = C - 4716 if m > 2.5 // or // yyyy = C - 4715 if m < 2.5 if ((_REAL) iMonth > 2.5) iYear = iC - 4716; else iYear = iC - 4715; } qsstv_9.2.6/qsstv/drmtx/common/util/Utilities.h0000664000175000017500000000650013203343610020335 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2004 * * Author(s): * Volker Fischer * * Description: * Implements: * - Signal level meter * - Bandpass filter * - Modified Julian Date * - Reverberation effect * - Hamlib interface * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(UTILITIES_H__3B0BA660_CA63_4344_B3452345D31912__INCLUDED_) #define UTILITIES_H__3B0BA660_CA63_4344_B3452345D31912__INCLUDED_ #include "../GlobalDefinitions.h" //#include "Settings.h" #include "utils/vector.h" #include "../matlib/Matlib.h" #include #include #ifdef HAVE_LIBHAMLIB # include #endif /* Definitions ****************************************************************/ #define METER_FLY_BACK 15 /* Classes ********************************************************************/ /* Signal level meter ------------------------------------------------------- */ //class CSignalLevelMeter //{ //public: // CSignalLevelMeter() : rCurLevel((_REAL) 0.0) {} // virtual ~CSignalLevelMeter() {} // void Init(_REAL rStartVal) {rCurLevel = Abs(rStartVal);} // void Update(const _REAL rVal); // void Update(const CVector<_REAL> vecrVal); // void Update(const CVector<_SAMPLE> vecsVal); // _REAL Level(); //protected: // _REAL rCurLevel; //}; /* Bandpass filter ---------------------------------------------------------- */ class CDRMBandpassFilt { public: enum EFiltType {FT_TRANSMITTER, FT_RECEIVER}; void Init(const int iNewBlockSize, const _REAL rOffsetHz, const ESpecOcc eSpecOcc, const EFiltType eNFiTy); void Process(CVector<_COMPLEX>& veccData); protected: int iBlockSize; CComplexVector cvecDataTmp; CRealVector rvecZReal; /* State memory real part */ CRealVector rvecZImag; /* State memory imaginary part */ CRealVector rvecDataReal; CRealVector rvecDataImag; CFftPlans FftPlanBP; CComplexVector cvecB; }; /* Modified Julian Date ----------------------------------------------------- */ class CModJulDate { public: CModJulDate() : iYear(0), iDay(0), iMonth(0) {} CModJulDate(const uint32_t iModJulDate) {Set(iModJulDate);} void Set(const uint32_t iModJulDate); int GetYear() {return iYear;} int GetDay() {return iDay;} int GetMonth() {return iMonth;} protected: int iYear, iDay, iMonth; }; struct CHamlib { enum ESMeterState {SS_VALID, SS_NOTVALID, SS_TIMEOUT}; }; #endif // !defined(UTILITIES_H__3B0BA660_CA63_4344_B3452345D31912__INCLUDED_) qsstv_9.2.6/qsstv/documentation/manual/doxygen_sqlite3.db0000664000175000017500000005000013203343610022356 0ustar jomajomaSQLite format 3@  -           0.y --tableincludesincludesCREATE TABLE includes (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, local INTEGER NOT NULL,id_src INTEGER NOT NULL,id_dst INTEGER NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq))!!tableinnerclassinnerclassCREATE TABLE innerclass (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, refid TEXT NOT NULL,prot INTEGER NOT NULL,name TEXT NOT NULL)IstablefilesfilesCREATE TABLE files (name TEXT PRIMARY KEY NOT NULL))=indexsqlite_autoindex_files_1filesMwtablerefidsrefidsCREATE TABLE refids (refid TEXT PRIMARY KEY NOT NULL)+?indexsqlite_autoindex_refids_1refids]tablexrefsxrefs CREATE TABLE xrefs (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,refid_src INTEGER NOT NULL, refid_dst INTEGER NOT NULL, id_file INTEGER NOT NULL, line INTEGER NOT NULL, column INTEGER NOT NULL) z Ctablememberdefmemberdef CREATE TABLE memberdef (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id_file INTEGER NOT NULL,line INTEGER NOT NULL,column INTEGER NOT NULL,refid TEXT NOT NULL,name TEXT NOT NULL,definition TEXT,type TEXT,argsstring TEXT,scope TEXT,initializer TEXT,prot INTEGER,const INTEGER,virt INTEGER,static INTEGER NOT NULL,explicit INTEGER,inline INTEGER,final INTEGER,sealed INTEGER,new INTEGER,optional INTEGER,required INTEGER,mutable INTEGER,initonly INTEGER,readable INTEGER,writable INTEGER,gettable INTEGER,settable INTEGER,accessor INTEGER,addable INTEGER,removable INTEGER,raisable INTEGER,kind INTEGER,id_bodyfile INTEGER,bodystart INTEGER,bodyend INTEGER,detaileddescription TEXT,briefdescription TEXT,inbodydescription TEXT)  !!) ##Qtablecompounddefcompounddef CREATE TABLE compounddef (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name TEXT NOT NULL,kind TEXT NOT NULL,prot INTEGER NOT NULL,refid TEXT NOT NULL,id_file INTEGER NOT NULL,line INTEGER NOT NULL,column INTEGER NOT NULL)d ++tablebasecompoundrefbasecompoundrefCREATE TABLE basecompoundref (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, base TEXT NOT NULL,derived TEXT NOT NULL,refid TEXT NOT NULL,prot INTEGER NOT NULL,virt INTEGER NOT NULL)m 11tablederivedcompoundrefderivedcompoundrefCREATE TABLE derivedcompoundref (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, base TEXT NOT NULL,derived TEXT NOT NULL,refid TEXT NOT NULL,prot INTEGER NOT NULL,virt INTEGER NOT NULL)     H!++ytableinnernamespacesinnernamespacesCREATE TABLE innernamespaces (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,refid TEXT NOT NULL,name TEXT NOT NULL)B _tableparamsparamsCREATE TABLE params (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,attributes TEXT,type TEXT,declname TEXT,defnname TEXT,array TEXT,defval TEXT,briefdescription TEXT)5--tablememberdef_paramsmemberdef_paramsCREATE TABLE memberdef_params (rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,id_memberdef INTEGER NOT NULL,id_param INTEGER NOT NULL) qsstv_9.2.6/qsstv/documentation/manual/manual.doxy0000664000175000017500000022333613203343610021126 0ustar jomajoma# Doxyfile 1.8.1.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = QSSTV # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 9.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this # tag. The format is ext=language, where ext is a file extension, and language # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = manual.txt # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.txt # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = images \ ../../icons # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = NO # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = manual # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # style sheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = qsstv.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see http://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = YES # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see http://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. # However, it is strongly recommended to install a local # copy of MathJax from http://www.mathjax.org before deployment. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # http://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. The # format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths # or URLs. Note that each tag file must have a unique name (where the name does # NOT include the path). If a tag file is not located in the directory in which # doxygen is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. #DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES qsstv_9.2.6/qsstv/documentation/manual/manual.txt0000664000175000017500000011625713203343610020765 0ustar jomajoman/*************************************************************************** * Copyright (C) 2000-2011 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /** \file */ // Documentation /*! \mainpage QSSTV 9.2 \author Johan Maes ON4QZ \section intro_sec Introduction QSSTV 9 is a program for receiving and transmitting SSTV and HAMDRM (sometimes called DSSTV). It is compatible with most of MMSSTV and EasyPal
!!! ALSO READ THE FAQ AT http://users.telenet.be/on4qz/qsstv_9/faq.html !!! This manual is divided in the following sections: - \subpage whatsnew - \subpage changelog - \subpage installation - \subpage gettingstarted - \subpage statusbar - \subpage imagepopup - \subpage RXSSTV - \subpage TXSSTV - \subpage RXDRM - \subpage TXDRM - \subpage fixdrm - \subpage gallery - \subpage editor - \subpage externalprog - \subpage todo1 - \subpage credits - \subpage Copying 73's Johan ON4QZ \page whatsnew What's New QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x - Build on top QT 5.x ( and also compatible with Qt 4.8) - Better synchronization in SSTV mode - New SSTV narrow band modes (MP73-N,MP110-N,MP140-N,MC110-N,MC140-N,MC180-N) - Changed GUI layout - Gallery window now shows all the rx/tx images. - RX and TX images for SSTV and DRM now in separate gallery tab. - TX Stock Images for fast selecting preferred TX Images. - SSTV Images only saved after a configurable percentage completed - Setting and reading frequency via CAT interface - Preferred fast frequency selection for SSTV and DRM - Editor/templates: multi-line inputs for x,y and z - Pulse audio direct interface \page changelog Change log \li 20170817 QSSTV 9.2.6 - Changed the .pro file for autodetecing correct libopenjpg2 (DL1JBE -Tom) - ftp transfer - initialize bug fix (VK6MN- Mike) - Help manual -> path correction and corrected some typo's (DJ0MBA- Marinus) - SSTV initialize bug fix (Adrian) - Camera support for Raspberry PI Cam - fixed audio loopback use - fixed transmission after stop, image was not restarted at top \li 20161022 QSSTV 9.2.5 - Screen size reduced for use with smaller screens-fixed. - rig control - added capabilities test. \li 20161022 QSSTV 9.2.4 - some minor bugfixing - eliminated online status setting in Config Notication tab (doubled with setting in Operator settings) - bug fix: incremental counter on filename wih hybrid mode - added filename to statusbar when sending DRM image \li 20161021 QSSTV 9.2.3 - bug fix: memory leak in tx DRM when loading/resizing images - faster compression of tx images - bug-fix: hybrid mode saved images with wrong file extension. Receivers tried downloading wrong file. - Added all the patches (more then 20) from Mike, VK6M: rx/tx notifications and a large number of patches for image handling - Added new features (such a save waterfall image) implmented by Mike, VK6M - Todo: update the documentation ! \li 20160929 QSSTV 9.2.2 - added CTRL_F keyboard shortcut to switch to and from full screen. This is mainly used on low resolution screens where the top and/or bottom taskbars are masking part of the QSSTV window. \li 20160929 QSSTV 9.2.1 - added low Resolution mode - changed SSTV sync detection - some minor bug fixes \li 20160703 QSSTV 9.1.8 - The program uses jp2 files for sending images in DRM mode. The file extensions were not correct. ->fixed - changes of the configuration do not need a restart of the program anymore (adding templates, stock images, DRM Profiles) - images in the gallery are now resized. - added menu option To Tx in Gallery Images RX and TX. - image in viewer is zoomed when resized while keeping aspect ratio. - Screen size reduced to 791x684 for use with smaller screens. - Added voice/data port selection for PTT (thanks to David VK3DCU) \li 20160701 QSSTV 9.1.7 - Normally the audio is generated on the left channel. There is now an option in the soundconfig to swap left and right channel. Some radios like the TS590 are using the right audio channel via USB (test done by PE1DFQ - Gerard). - On request from Michael DL3YAP: Added CW ID button to manually send the CW ID as specified in the CW config. - Name of ID button in the lower status bar changed to WF ID (waterfall ID) to avoid confusion with CW ID. - Fixed bug: Waterfall font size was not correctly saved. - Added "Bold" option for Waterfall font. \li 20160628 QSSTV 9.1.6 - ftp transfer crashes when transmitting in hybrid mode-> solved \li 20160416 QSSTV 9.1.5 - upload received images to ftp server (sstv and drm) gave file error -> solved \li 20160415 QSSTV 9.1.4 - rx image save button was not working -> fixed \li 20160410 QSSTV 9.1.3 - fixing compiler error: missing function cleanupcache in release mode \li 20160409 QSSTV 9.1.2 - implementation of image cache for faster image display in the gallery - bug fix ,race condition for RxNotification \li 20160408 QSSTV 9.1.1 - replaced jpeg2000 library Jasper with openjpeg because some distros won't support Jasper anymore. Jasper has not been maintained for more than 10 years. \li 20151130 QSSTV 9.0.9 - directories are auto-created if they don't exist - additional CAT command now also works with rigctld \li 20150930 QSSTV 9.0.8 - fix DRM status update \li 20150929 QSSTV 9.0.7 - fixed hang on exit \li 20150928 QSSTV 9.0.6 - performace optimization (especially for Raspberry Pi 2) \li 20150926 QSSTV 9.0.4 - added option for slow cpu (see Options ->GUI) This makes it possible to run QSSTV running on a Raspberry Pi 2. - minor change to ALSA sound interface. - some more bug fixing \li 20150910 QSSTV 9.0.3 - xmlrpc bug fix (persistent connections) - manual (a lot of) spelling corrections - compatibility with Qt 4.8 \li 20150907 QSSTV 9.0.2 - changed configuration frequencies to allow for data modes on Icom - changed Editor, you may need to check/re-edit your template files (text offsets may have changed) \li 20150831 QSSTV 9.0.1 - first release \page installation Installation Warning: from version 9.1.1 and higher, Jasper library is dropped and openjpeg is used We need openjpeg2 (e.g. libopenjpeg2.1 or higher) and not libopenjpeg 1.5 \section step1 Step 1: Prerequisites Before you can compile QSSTV make sure that you have installed the following software - g++ - libfftw3-dev - qt5-default (qt4-default) - hamlib-dev - libasound2-dev - libpulse-dev - libopenjp2-7 - libopenjp2-7-dev - libv4l-dev QSSTV is compatible with Qt 4.8.6 but mostly tested on Qt 5.4.x or higher

On Ubuntu, Debian or Mint you can type:

sudo apt-get install g++ libfftw3-dev qt5-default libpulse-dev
sudo apt-get install hamlib-dev libasound-dev  libv4l-dev
sudo apt-get install libopenjp2-7 libopenjp2-7-dev
If you don't find libopenjp2-7 you can download it with the follwing commands if you're running a Debian derived distribution:
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7_2.1.0-2_i386.deb
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7-dev_2.1.0-2_i386.deb
or
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7_2.1.0-2_amd64.deb
wget http://ftp.de.debian.org/debian/pool/main/o/openjpeg2/libopenjp2-7-dev_2.1.0-2_amd64.deb
and install the packages with the package manager or simply by double clicking on them. First install the library and then the development package. This is the case for example for Linux Mint 17.3. For specific instructions on installation on different distributions: have a look at the FAQ html http://users.telenet.be/on4qz/qsstv_9/faq.html \section step2 Step 2: Getting the software The latest versions of QSSTV is always available at http://users.telenet.be/on4qz Download the latest tar file to a local directory (e.g. ~/Downloads) \section step3 Step 3: Compile and Install the software Go to the directory you have chosen and extract the tar file. Note: replace the 9.1.1 with the appropriate version you have downloaded
>cd ~/Downloads
>tar -xvzf qsstv_9.1.1.tar.gz
>cd qsstv_9.1.1
>qmake
>make
>sudo make install
\section step4 Step 4: Run QSSTV You can now run the program by typing qsstv at the prompt of a terminal session, or make a short cut on your desktop.
>qsstv
If you have problems compiling the software, please give as much information as possible but at least: - Linux Distribution (e.g. Ubuntu 12.10) - QT Version (e.g Qt 5.4.1) - Dump of the compile process showing the error \page gettingstarted Getting Started The program is build around 3 windows - Receive window: Receive functions and configuration - Transmit window: Transmit functions and camera control - Gallery window: History of received images, transmit images and templates The program will remember the last position and the size of each window on restart. \section config Configuration Before we can use QSSTV you need to do some configuration. \image html config.png The configuration tool is accessed through the "Options" menu in the receive window. The following tabs are available

\li Personal Settings

\image html config1.png

- Call sign - First Name - Last Name - QTH - Locator (Grid Square)
This information can also be used in templates (see also \ref editor)

\li Directories

\image html config2.png

- RX SSTV Images: directory for saving the SSTV received images - RX DRM Images: directory for saving the DRM received images - TX Images: directory for images to transmit - Templates: directory where the template files are stored - Audio Records: directory for audio files (where you save/read recorded audio files) - Documentation: URL of the user manual (if you copied the manual locally then you can point to it with e.g. file:///usr/share/doc/qsstv/manual

\li Gui

\image html config3.png

- Stretch: if checked, the image will fill the receive window (keeping the aspect ratio) else it will be displayed as is. - Background Colour: colour used for image borders and background in the gallery - Image Background Colour: Default image background Push the push button to select the colour selector. - Gallery: Rows and columns: set-up the number of rows and columns to be used in the Gallery tab. If you're running on a slow CPU (like on a Raspberry Pi) select row=1 and columns=1. - Slow CPU: Select this option if you're running on a slow CPU (e.g. Rapsberry Pi) - Low Resolution: Select this option if your display is for example 800x480. This options sets the maximum vertical resolution of QSSTV to less than 480 lines. It therefore removes some features from the receive window (Rx Notification Window in DRM) and the transmit window (Image replay Preview and TX Notifications in DRM mode). You can toggle to and from full screen by using the CTRL_F key combination.

\li Audio

\image html config4.png

- ALSA Input Audio Device : depending on your hardware (e.g. default,hw:0,0) - ALSA Output Audio Device : depending on your hardware (e.g. default,hw:0,0) - PulseAudio: native pulse audio interface
Note: Most distributions use Pulse Audio interface.. You can select the audio card settings through the audio applet by right clicking on the Speaker icon and selecting the Sound Preferences - RX Clock frequency : clock used while receiving SSTV images,(see also \ref calib) - TX Clock frequency : clock used while transmitting SSTV images,(see also \ref calib) - Sound Input routing - From sound card: default mode - From file: decode a previously recorded file - From sound card and record: decode and record to a file (wav type, stereo 48000) - Maximum recording size: limits the size of the recorded file - Sound Output routing - To sound card: default - Playback: playback a wav-file (use 48000 samples per second recording in mono or stereo) - Playback and record: playback the sound and record at the same time. - Swap left and right channel - If selected, audio will be sent on the right audio channel instead of the left channel (e.g Kenwood tranceivers using USB sound interfaces) - PTT tone on other audio channel - A tone will be sent on the right channel to enable PTT. If the above "Swap left and right channel" is selected, it will be sent on the left channel.

Note: To playback an audio file, be sure the format is of type wav and has a samplerate of 48000 samples/second. You can always open the file with audacity and export the file to adapt the type and/or samplerate
\li CAT

\image html config5.png

- Special Serial Port: If you have a separate serial interface to control the PTT you can enable Special Serial Port to control it. You can select RTS and or DTR in inverted or non-inverted mode (i.e. +RTS will assert RTS at +12V when the PTT is active and -RTS will assert RTS at -12V). +RTS and/or +DTR is used most of the time. The same goes for DTR.
You cannot select both +RTS and -RTS or +DTR and -DTR at the same time. - Enable Hamlib Cat Interface - Radio Model: drop down list from the radio models - CIV Address: only used for ICOM, if left empty, the default address of the radio will be used - Serial Port/host: either the serial port (e.g. /dev/ttyUSB0) or the host address (e.g. localhost:4532) - Handshake, Parity, Data bits, Stop bits, Baud rate: serial port settings - PTT Serial Port: serial port (e.g. /dev/ttyS0) only used if "Enable PTT serial Interface" is selected - PTT Control via: If the radio uses a CAT command to activate Transmission then select "CAT". If you have a radio that does not support such a CAT command, you can let Hamlib use the RTS or DTR on the serial port specified by "PTT Serial Port". - There are 2 CAT ports: -CAT (voice port): the normal setting -CAT (data port): to be used with some kenwood tranceivers(e.g. kenwood TS-480) to force data port instead of audio port (source: David VK3DCU) Example: IC-706MKIIG via a cat interface such as interfaceOne. \anchor flrigconfig - Enable XMLRPC This allows you to connect to the Flrig program using the XMLRPC protocol. Flrig will handle all the communication with the transceiver (including PTT). - TX Delay: The program will wait for the selected delay before transmitting any audio. Note: The option Enable XMLRPC excludes the use of hamlib. A sample set-up of Flrig is shown below.

\image html flrig1.png

\li CW

\image html config6.png

- Tone: frequency of the CW tone - Words per Minute: CW transmission speed - Text To Send: this text will be send at the end of an image transmission if the option is enabled. \li Repeater

\image html config7.png

- Enable repeater: enable repeater operation - Image Interval (min): interval time before sending one of the Idle Images - Repeater TX mode: the mode the repeater will use to send the images - Idle Image[1-4]: images send by the repeater if there is no activity for more than the interval time - Idle Template:template that will be super-imposed on the idle images - Repeater Template: template that will be super-imposed on the repeated(received) images \li FTP

\image html config8.png

This is used to save the received images to an FTP server. The images will also still be saved in the local rx folder. - Enable FTP: enable ftp operation - FTP Port: default 21 - Default Image Format: select the image format from the drop down bow (used only in SSTV) - Remote Hostname: hostname of the ftp server (e.g. myftp.home.net or 192.168.0.1) - Remote directory:the ftp server directory where you'll store the images - FTP Login name: your login name on the server (can be anonymous) - FTP Password: if you need one, otherwise leave blank - Image store: - Image1 - image30: The files will be saved under the generic name imageXX, where xx ranges from 1 to 30. When a new image arrives, the old images are shifted down (i.e. image29 becomes image30, image28 becomes image 29 etc ..) and the new one is stored as image1. -file name: the image (or other type of file) is stored with a file name derived from the mode (SSTV) or from the file name transmitted in DRM. Note: This FTP server is unrelated to the FTP server for Hybrid Mode. You can test the connection by clicking the Test connection button. It will set-up a connection to the server and send a test file to check if all parameters are correct. You will either see a pop-up with "Connection OK" or an error message showing the reason of the fail. \li Waterfall

\image html config9.png

- Start Pic: Waterfall text to send at the beginning of a DRM transmission - End Pic: Waterfall text to send at the end of a DRM transmission - FIX: Waterfall text to send at the beginning of a DRM retransmission - BSR: Waterfall text to send at the beginning of a DRM request for retransmission
Note: you can also use %%m. This will be replaced by your call sign \li Hybrid

\image html config10.png

- Enable Reception in Hybrid Mode: allows reception of hamDRM in hybrid mode. If this is not enabled, hybrid mode files will not be shown or stored. - FTP Port: default 21 (cannot be modified at this moment for compatibility with EasyPal) - Remote Hostname: hostname of your ftp server - Remote directory:the ftp server directory where the stored images are - FTP Login name: the login name on the server - FTP Password: will be encrypted Login name, password,hostname and directories will be encrypted before being sent on the air. If you want to use the special server, the directories to store images is relative to the directory HybridFiles1. So first create a top level directory HybridFiles1. If you leave the Remote Directory empty, then the files will be placed in the directory HybridFiles1. If you put for example "testdir" in the Remote Directory (as shown in the above screen shot), then you need to create testdir under HybridFiles (HybridFiles1/testdir). QSSTV will not create those directories for you. EasyPal also use two other directories on the same level as HybridFiles1 - OnlineCallsigns1 - RxOkNotifications1 You can create them on your server but they are not used by QSSTV at this moment. You can test the connection by clicking the Test connection button. It will setup a connection to the server and send a test file to check if all parameters are correct. You will either see a pop-up with "Connection OK" or an error message showing the reason of the fail. \li DRM Profiles

\image html config11.png

Used for quick selection of the most common settings you use in DRM. Choose a short name for the profile and make a selection for all the parameters. The name will appear in the Profiles drop-down box in the Transmit window for DRM. \li Frequencies \anchor configFreq

\image html config12.png

- List of selectable frequencies. Click Add to add a new combo frequency/mode/modulation. Enter the frequency and select the mode and modulation type.
To move a frequency/mode/modulation up or down the list, click first on the entry in the table and then click on one of the arrow buttons. - Hamlib Data Command: (only used with Hamlib) As far a I know Hamlib does not support switching the Icomxxx to data mode. As a result, if you for example selected USB-D1 on a Icom 7600,changing the frequency will switch the rig back to the regular USB (data mode off).
Hamlib Data Command allows you to send a "raw command" that will be executed when you change frequencies. - Example: FEFE7AE01A060101FD and Hex button checked: will put the Icom in data mode D1 (LSB, USB or FM) and the Filter 1. - Hex: if checked the text is interpreted as hex values else it will be interpreted as a regular ASCII string. - Note 1: you can put any valid raw command here, it will be send on every frequency change - Note 2: Flrig does not support FM data modes. \section calib Calibration Note: Calibration is only needed for SSTV mode All SSTV applications need an accurate and stable clock. The accuracy of a PC clock is not always correct. Therefore it's necessary to execute some sort of calibration. You need to synchronize your PC with an network time server via the ntp protocol. Every Linux distribution has some configuration tool that allows you to install the ntp client. Be sure it's active. You can check it with:
>ntpdc -p
The selected ntp server should have an asterisk in the first column.
remote           local      st poll reach  delay   offset    disp
=======================================================================
*stratum1dc1.bc  10.119.37.19     2   64  377 0.00386  0.036853 0.06850
You can now launch the Calibration.

It will take several minutes to complete. Be sure to wait long enough, the progress is extremely slow

\image html calibration.png When RX and TX calibration is finished, press the OK button to accept the new values. \li Note: You can always enter the clock values manually. \page statusbar Statusbar \image html statusbar.png - Radio Frequency: the current frequency of the radio (only if CAT interface is enabled) - Drop down menu to set the radio on the selected frequency (only if CAT interface is enabled) (see also \ref configFreq Config freq) - WF Text: gives you a selection of user defined text you can send to appear as waterfall text.

\image html wftextpopup.png
Send the text by clicking the tx button next to it
The %%m will be substituted by your callsign and the %%s by the average SNR of the last received DRM stream.

- BSR: When a file is not completely received, you can ask for a retransmission. \image html bsr_select.png By default the latest received file is selected (you can select another one through the drop-down box).
There are two modes: EasyPal and Compatible. EasyPal mode is more advanced and is normally used as EasyPal is the de facto standard on Windows and QSSTV also uses this mode in BSR reception.
Note: BSR is greyed out in SSTV.

- WF ID: send callsign in waterfall - this is a short-cut to send your own callsign in the waterfall - CW ID: send callsign in CW

- PTT indicator: turns red while the PTT is activated. \page imagepopup Image Viewer All the images displayed in QSSTV have pop-up actions. This is an example for the Gallery.
\image html Gallery_image_options.png

By right clicking on the images, a pop-up window appears that can have one or more of the following actions: - New: open the editor to create a new image. - Load: load new file into window - To TX: send image to TX window - Edit: edit the selected image - Print: print the selected image - Delete: delete the selected image, a pop-up will ask if you want to delete the file also from disk., if so the file will be moved to the trash folder. - View: Display the image in a new window actual size (the window is resizeable). - Properties: displays the image and file properties if available \page RXSSTV Receive SSTV Window \image html rxwidget1.png Menu toolbar: \li \image html start.png start receiving images \li \image html stop.png stop receiving images \li \image html replay.png force a restart (e.g. when you see a wrong synchronization then click the restart button). \li \image html filesave.png save the image at any time using the save button. You will probably want to use this if the Auto-save is not selected. Note only active in SSTV mode. \li \image html eraser.png erase the screen Sync Indicator (vu-meter S): - sync quality ranging from 0-10 Volume (vu-meter V): - adjust your recording level to half scale. SSTV tab: - Use VIS Code: the reception will only start if a correct VIS code is received. If left unchecked, QSSTV will auto-detect the modes (this is the most used method). - Auto-slant: A lot of times the receive clock of the local station is not equal to the transmit clock of the sending station. The result is a slanted image. If The auto-slant is activated, the program will automatically try to compensate for those clock differences. You may notice a momentary freeze of the image build-up while the program is recalculating the image. - Auto-save: When the program detect the end of the image, the image will be saved to disk. - Save if Complete %: Auto-save if the image is at least completed for the indicated percentage. - Mode: you can either select AUTO or one of the supported SSTV modes. When AUTO is selected, the program will try to determine the mode of the image it is receiving. If a specific mode is selected the program will reject all images except if they are transmitted in the selected mode. - Signals: Normal and DX. When the Sensitivity is set to DX the signal will run until the end of the image before resynchronization. Spectrum and Waterfall:
There are three markers for SSTV (red lines): - 1200: Sync frequency - 1500: Lower video frequency - 2300: Upper video frequency In DRM, the markers indicate the 3 unmodulated carrier frequencies \page TXSSTV Transmit SSTV Window \image html txwidget1.png The TX progress-bar indicates the progress of the transmission.

\anchor sstvMenu Menu toolbar: \li \image html start.png start transmitting images \li \image html stop.png stop transmitting images \li \image html tone.png sends a repeater tone of 1750 Hz \li \image html fileopen.png loads a file in the transmit window \li \image html edit.png opens the image editor \li \image html camera.png takes a snapshot if there is a camera installed that is supported by v4l2 \li \image html binary.png only used in DRM mode \li \image html doubletone.png let you select frequency and duration of a tone to send \li \image html sweep.png let you select the sweep frequencies and duration to send \li \image html hybrid_dis_checkbox.png This check-box is disabled in SSTV mode \li \image html refreshbutton.png You can refresh the content of the replay image by clicking the Refresh button (e.g. when you have loaded a new image in the preview image window).

- Select the transmission mode (Martin 1, Scottie etc.).

\anchor Control - Select CW if you want to append a morse message after the image (the message is set in Options->Configuration->CW) . - If the VOX check-box is set a tone will be sent before the actual image is sent so that you can use the VOX on your transceiver (if you do not have PTT control). - Select the template (or none) you want as an overlay (see \ref gallery). Only the templates that are in the Gallery will be available. The text inputs correspond to the following macros: \li TO: %%c - call of the contacted station \li RSV %%r - RSV (radio-strength-video best is 595) \li Op: %%o - name of the operator of the contacted station \li x %%x - comment1 \li y %%y - comment2 \li z %%z - comment3 \n see also \ref editor - The last received image is displayed at the bottom right. It will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor
Right clicking on this image also allows you to load other images for insertion. Use the refresh button to update the main window if necessary. \page RXDRM Receive DRM Window \image html receivedrm.png SNR (vu-meter S): - SNR in dB Volume (vu-meter V): - adjust your recording level to half scale (better too low than too high). Received segments: \image html rxdrm_segments.png - green: correctly received segments - red: missing segments Constellation: \image html rxdrm_constellation.png - FAC constellation (always QAM 4) - MSC constellation. Receive status \image html rxdrm_status.png - Mode (A,B or E) - Bandwidth (2.2 kHz or 2.5 kHz) - Interleave (Short or Long) - Protection (Normal or High) - QAM (4,16 or 64) - SNR (should be above 6 dBm) - Offset (0 Hz if no frequency offset) - Total Segm.: total number of segments in the file - RX Sgmnts.: number of correctly received segment - Cur. Sgmnt.: segment currently transmitted - Transp. ID; unique identifier for the current stream. - Callsign from the transmitting station \image html statusleds.png - TIME: green if time sync else red - FRAME: green if frame sync else red - FAC: green if FAC correctly received else red - MSC: - red: incorrectly received - green: correctly received - yellow: already received When an data stream is received , the program will try to decode it and save it in the receive image directory. If the data stream is a text file it will be displayed in a separate window. Just click OK to close it. \image html waterfall.png Spectrum:
You can select the spectrum or the waterfall by clicking in this window. In DRM the waterfall gives you better view. The three markers above the waterfall indicate the position of the pilot frequencies. This helps tuning the radio to the correct frequency.

(8) see \ref RXSSTV \page TXDRM Transmit DRM Window \image html transmitdrm.png see also \ref sstvMenu under SSTV TX - \image html binary.png Click here to send a binary file (basically any file will do) - \image html hybrid_checkbox.png When this check-box is checked, the image is transmitted in hybrid mode. For the other icons and actions see also \ref TXSSTV

Mode Selection \image html txdrm_options.png
- Mode (A,B or E) - Bandwidth (2.2 kHz or 2.5 kHz) - Interleave (Short or Long) - Protection (Normal or High) - QAM (4,16 or 64) - Reed Solomon: (rs1, rs2, rs3 or rs4).File encoder for forward error correction. On HF it is recommended to always use Reed Solomon. The most often used is rs2. The higher the number, the more protection but also the more overhead. - Profile: quick selection of a profile (i.e. settings of mode,QAM ...) as defined in the Options->Configuration->DRM Profiles)
\image html txdrm_status.png The TX progress-bar indicates the progress of the transmission. see also \ref Control under SSTV TX - Last received image will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor
- Compression

\image html txdrm_compression.png
Avoid to send huge images (especially if you're not in hybrid mode).
You can drag the slider to compress the image before it is sent (the original image is not modified). The file size is shown on the right. You can see the result in the image frame when you release the handle.
Note: This does not include the overhead of the RS-encoding. \page fixdrm Sending FIX in DRM \image html fix.png When the image you transmitted is not correctly received, the other station can send a BSR. When you receive a BSR and it is destined for you, then the above popup will show. You can either send the fix or cancel.
If the BSR is not for you then the following window will pop-up for a few seconds. \image html bsr_nfy.png \page gallery Gallery The Gallery contains six tabs. The directories where the different images are stored are configured in the Directories tab of the Configuration.
\image html Gallery_rx.png
- RX SSTV: SSTV images are stored on disk and shown here if the Auto-save is enabled in the receive window and the minimum percentage is reached - RX DRM: All images received in DRM mode are stored on disk and shown here. - TX SSTV: When sending an image in SSTV mode then the resulting images is stored on disk and shown here (this includes the template overlay). - TX DRM: When sending an image in SSTV mode then the resulting images is stored on disk and shown here (this includes the template overlay). - TX Stock: Contains your selection of "Stock" images you want to use for transmission. - Templates: template images to be used as overlay on tx images

Some examles \image html Gallery_txdrm.png
\image html Gallery_templates.png \page editor Editor The editor can be used for regular image editing and for the creation and editing of template images. Template images are used as overlays. They will be dynamically adapted when you select the template in the TX-window. While in edit mode, you can change all the attributes (such as size, position, colours etc ...). If you save the canvas as an image, the scene will be rendered (i.e. flattened) and become a single image object. If you save the canvas as a template, all objects will be accessible again when loaded.
To create an object, click on the left menu to select the type of object (e.g circle) and then click on the canvas where you want the object positioned. Just click on an item to select it. A outline of the item will be shown by a dashed line. If you hoover over the object you will see the cursor change to a hand-icon (in the middle of the object) to move it, or to a resize-icon if you are on a border. The attributes (line colour, fill colour, gradients etc ..) that are active in the top menu will be used to create the item. Object have also a z-component, i.e they can be in front our behind another object. This can be changed by right clicking on the item and use the Arrange selection. \image html editor_1.png \li Top menu 1 - Image Size: Select the size of the image: the outline of the image will be shown on the canvas. \image html editor_image_size.png - Font: drop down box where you can select the text font - Font size: text size - Bold : bold text - Italic: italic text - Underline: underlined text - Pen width: width of lines in number of pixels \li Top menu 2 - Fill: Fill colour drop down menu - Line: Line colour drop down menu - Gradient: Gradient selection menu \li Left menu - \image html arrow.png select/deselect objects - \image html fcircle.png create filled circle/ellipse - \image html frect.png create filled rectangle -\image html line.png create line -\image html camera.png insert image -\image html replay.png insert replay image place-holder. When the template will be loaded in the TX-window, this place-holder will replaced by the last received image -\image html text.png create text. When you select this option a window will pop-up to enter text.
-\image html entertext.png
You can enter multiple lines of text. Click OK, the window will be hidden and you can click on the canvas to position the text. The text will appear on the canvas. -\image html multiline.png
\li Bottom menu - Horizontal Shear: shear selected object horizontally - Rotate: rotate selected object \li Right menu - Vertical Shear: shear selected object vertically

If you right click on an object then the following pop-up menu will be shown:

\li Arrange - Forward - one level forward - Backward - one level backward - Bring to Front - all the way to the front - Sent to Back - all the way to the back \li Change text - change the text of a text object \li Expand - object will expand horizontally and vertically to fill the complete canvas \li Delete - remove selected object from the canvas \li Lock - lock items so that they can not be moved or resized \li Unlock - unlock selected items

We need some sort of macro's to enable variable text when transmitting images. The editor uses predefined strings that will be replaced by the "actual content" when the template is processed just before transmission.
Here's an example of the editor using macros and the result in the transmitter.


\image html editor_2.png

\image html transmitdrm.png Following macro's are supported:
Macro's where the value is defined in the configuration \li %%m - my callsign \li %%q - my QTH \li %%l - my locator \li %%n - my last name \li %%f - my first name Macro's where the value is entered in the TX-window prior to transmission \li %%c - call of the contacted station \li %%r - RSV (radio-strength-video best is 595) You can also input free text as is sometimes required for contest (e.g. 595#007 or Good Copy) \li %%o - name of the operator of the contacted station \li %%x - comment1 \li %%y - comment2 \li %%z - comment3 Note: comment 1,2 and 3 can be multi-line. Macro's where the value is defined by the system \li %%t - time in hours:minutes format \li %%d - date in year/month/day format \li %%v - qsstv_version \li %%s - SNR - only to be used for DRM in the WF Text see also \ref statusbar \page credits Credits - SSTV:
Many thanks to all testers and users of QSSTV - too many to name them all.

- DRM:
I started developing the DRM functionality in QSSTV after studying the excellent work Ties Bos (PA0MBO) did on txrxamadrm.
see: http://www.pa0mbo.nl/ties/public_html/hamradio/txamadrm/index.html
The software is NOT based on the hamdrm.dll but on DIORAMA (http://nt.eit.uni-kl.de/static/diorama/index.html)
and adapted by PA0MBO. For more information , see the manual of txrxamadrm. This document contains references to Easypal (by VK4AES). Erik Sundstrup was kind enough to give me permission to use the extended BSR functionality and the DRM Hybrid mode. Easypal was used extensively to test my program.

\image html vk4aes.jpg

Erik is now silent key as of 14th march 2015. We will miss him.
I hope there will be other OM's that take up the maintenance,enhancements and development of EasyPal so that people running Windows will continue to enjoy his software. \page externalprog External Programs QSSTV can interface with other programs.

Flrig see \ref flrigconfig

Cqrlog: QSSTV (when in DRM mode) sends the following information to Cqrlog: - program: identifies QSSTV - version: protocol version - date: based on UTC - time: based on UTC (time when the images is correctly received) - endtime: based on UTC (always = time) - call: call sign of the received station - mhz: frequency in MHz - mode: SSTV (ADIF restriction: there is no DSSTV nor DRM specified in ADIF, SSTV is the closest match) - notes: contains file name, DRM mode information (i.e mode, QAM, protection.. hybrid)

- Setup:

\image html cqrlog1.png


- Do not enable Run Fldigi ... - Start Cqrlog and select Remote mode for Fldigi - If you want to see the QSO's: Select "Show QSO list" from the file menu.

\image html cqrlog2.png
Note: Unless you configured the Automatic refresh, you will only see the QSO's if you hit the Refresh button. \page todo1 To Do \li fax implementation and testing \li expand function in editor \li improve documentation \page Copying Copying This software uses Qt for Linux: see http://qt.digia.com/ The application is released under GPLv3 */ qsstv_9.2.6/qsstv/documentation/manual/qsstv.css0000664000175000017500000003007413203343610020631 0ustar jomajoma/* The standard CSS for doxygen */ body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; } /* @group Heading Levels */ h1 { font-size: 150%; } .title { font-size: 150%; font-weight: bold; margin: 10px 2px; } h2 { font-size: 120%; } h3 { font-size: 100%; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; padding: 2px; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code { color: #4665A2; } a.codeRef { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 10px; margin-right: 5px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #C4CFE5; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; } .memname { white-space: nowrap; font-weight: bold; margin-left: 6px; } .memproto { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 8px; border-top-left-radius: 8px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 8px; -moz-border-radius-topleft: 8px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 8px; -webkit-border-top-left-radius: 8px; background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; } .memdoc { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 2px 5px; background-color: #FBFCFD; border-top-width: 0; /* opera specific markup */ border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); /* webkit specific markup */ -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .params, .retval, .exception, .tparams { border-spacing: 6px 2px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0px; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; margin: 5px; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ div.dynheader { margin-top: 8px; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; text-align:left; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { font-size: 8pt; padding-left: 5px; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } dl { padding: 0 0 0 10px; } dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug { border-left:4px solid; padding: 0 0 0 6px; } dl.note { border-color: #D0C000; } dl.warning, dl.attention { border-color: #FF0000; } dl.pre, dl.post, dl.invariant { border-color: #00D000; } dl.deprecated { border-color: #505050; } dl.todo { border-color: #00C0E0; } dl.test { border-color: #3030E0; } dl.bug { border-color: #C08050; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: left; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } qsstv_9.2.6/qsstv/drmtx/common/DRMSignalIO.cpp0000664000175000017500000001223513203343610017752 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer, Cesco (HB9TLK) * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * Transmit and receive data * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "DRMSignalIO.h" #include #include "appglobal.h" #define pi 4.0*atan(1.0) /******************************************************************************\ * Transmitter * \******************************************************************************/ void CTransmitData::ProcessDataInternal(CParameter&) { int i; const int iNs2 = iInputBlockSize * 2; rNormFactor =1000.0 ; // pa0mbo (was 16000) for (i = 0; i < iNs2; i += 2) { const int iCurIndex = iBlockCnt * iNs2 + i; /* Imaginary, real */ const short sCurOutReal = (short) ((*pvecInputData)[i / 2].real() * rNormFactor); const short sCurOutImag = (short) ((*pvecInputData)[i / 2].imag() * rNormFactor); /* Envelope, phase */ const short sCurOutEnv = (short) (Abs((*pvecInputData)[i / 2]) * (_REAL) 256.0); const short sCurOutPhase = (short) (Angle((*pvecInputData)[i / 2]) * (_REAL) 5000.0); /* 2^15 / pi / 2 -> approx. 5000 */ switch (eOutputFormat) { case OF_REAL_VAL: // vecsDataOut[iCurIndex] = sCurOutReal; vecsDataOut[iCurIndex] = sCurOutReal; vecsDataOut[iCurIndex + 1] = 0; // (short) 15000.0*sin(pi*1500.0*i/48000.0) ; // pa0mbo 1500 Hz test signaal // printf("%d %d \n", i/2 , vecsDataOut[iCurIndex]); break; case OF_IQ_POS: /* Send inphase and quadrature (I / Q) signal to stereo sound card output. I: left channel, Q: right channel */ vecsDataOut[iCurIndex] = sCurOutReal; vecsDataOut[iCurIndex + 1] = sCurOutImag; break; case OF_IQ_NEG: /* Send inphase and quadrature (I / Q) signal to stereo sound card output. I: right channel, Q: left channel */ vecsDataOut[iCurIndex] = sCurOutImag; vecsDataOut[iCurIndex + 1] = sCurOutReal; break; case OF_EP: /* Send envelope and phase signal to stereo sound card output. Envelope: left channel, Phase: right channel */ vecsDataOut[iCurIndex] = sCurOutEnv; vecsDataOut[iCurIndex + 1] = sCurOutPhase; break; } } iBlockCnt++; if (iBlockCnt == iNumBlocks) { iBlockCnt = 0; pSound->Write(vecsDataOut); // printf("DRMSignalIO na pSound-> write\n"); addToLog(QString("writing vecsDataOut:%1").arg(vecsDataOut.size()),LOGDRMTX); } } void CTransmitData::InitInternal(CParameter& TransmParam) { /* float* pCurFilt; int iNumTapsTransmFilt; CReal rNormCurFreqOffset; */ const int iSymbolBlockSize = TransmParam.CellMappingTable.iSymbolBlockSize; /* Init vector for storing a complete DRM frame number of OFDM symbols */ iBlockCnt = 0; TransmParam.Lock(); iNumBlocks = TransmParam.CellMappingTable.iNumSymPerFrame; ESpecOcc eSpecOcc = TransmParam.GetSpectrumOccup(); TransmParam.Unlock(); iBigBlockSize = iSymbolBlockSize * 2 * iNumBlocks; /* stereo */ // printf("iBigBlockSize in init Ctransmitdata = %d\n", iBigBlockSize); vecsDataOut.Init(iBigBlockSize); if (pFileTransmitter != NULL) { fclose(pFileTransmitter); } /* Init sound interface */ // pSound->Init(iBigBlockSize, true); /* Init bandpass filter object */ BPFilter.Init(iSymbolBlockSize, rDefCarOffset, eSpecOcc,CDRMBandpassFilt::FT_TRANSMITTER); /* printf("DRMSignalIO BPFilter init Symbolsize %d rDefCaroffset %g eSpecooc %d \n", iSymbolBlockSize, rDefCarOffset, eSpecOcc); */ /* All robustness modes and spectrum occupancies should have the same output power. Calculate the normaization factor based on the average power of symbol (the number 3000 was obtained through output tests) */ rNormFactor = (CReal) 6000.0 / Sqrt(TransmParam.CellMappingTable.rAvPowPerSymbol); // pa0mbo was 3000.0 nu as in ham /* Define block-size for input */ iInputBlockSize = iSymbolBlockSize; } CTransmitData::~CTransmitData() { /* Close file */ if (pFileTransmitter != NULL) fclose(pFileTransmitter); } qsstv_9.2.6/qsstv/drmtx/common/DRMSignalIO.h0000664000175000017500000001006213203343610017413 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See DRMSignalIO.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DRMSIGNALIO_H__3B0BA660_CA63_4344_B_23E7A0D31912__INCLUDED_) #define DRMSIGNALIO_H__3B0BA660_CA63_4344_B_23E7A0D31912__INCLUDED_ #include "Parameter.h" #include "soundinterface.h" #include #include "matlib/Matlib.h" //#include "IQInputFilter.h" #include "util/Modul.h" #include "util/Utilities.h" /* Definitions ****************************************************************/ /* Number of FFT blocks used for averaging. See next definition ("NUM_SMPLS_4_INPUT_SPECTRUM") for how to set the parameters */ #define NUM_AV_BLOCKS_PSD 16 #define LEN_PSD_AV_EACH_BLOCK 512 /* same but for the rpsd tag */ #define NUM_AV_BLOCKS_PSD_RSI 150 #define LEN_PSD_AV_EACH_BLOCK_RSI 256 #define PSD_OVERLAP_RSI 128 /* power gain of the Hamming window */ #define PSD_WINDOW_GAIN 0.39638 /* Length of vector for input spectrum. We use approx. 0.2 sec of sampled data for spectrum calculation, this is 2^13 = 8192 to make the FFT work more efficient. Make sure that this number is not smaller than the symbol lenght in 48 khz domain of longest mode (which is mode A/B: 1280) */ #define NUM_SMPLS_4_INPUT_SPECTRUM (NUM_AV_BLOCKS_PSD * LEN_PSD_AV_EACH_BLOCK) /* The RSI output needs 400ms with a 50% overlap, so this needs more space I think the RSCI spec is slightly wrong - using 150 windows consumes just over 400ms, 149 would be exact */ #define INPUT_DATA_VECTOR_SIZE (NUM_AV_BLOCKS_PSD_RSI * (LEN_PSD_AV_EACH_BLOCK_RSI-PSD_OVERLAP_RSI)+PSD_OVERLAP_RSI) #define RNIP_SEARCH_RANGE_NARROW 5100.0 #define RNIP_SEARCH_RANGE_WIDE 15100.0 #define RNIP_EXCLUDE_BINS 2 // either side of the peak /* Use raw 16 bit data or in text form for file format for DRM data. Defining the following macro will enable the raw data option */ #define FILE_DRM_USING_RAW_DATA /* Classes ********************************************************************/ class CTransmitData : public CTransmitterModul<_COMPLEX, _COMPLEX> { public: enum EOutFormat {OF_REAL_VAL /* real valued */, OF_IQ_POS, OF_IQ_NEG /* I / Q */, OF_EP /* envelope / phase */}; CTransmitData(CSoundOutInterface* pNS) : pFileTransmitter(NULL), pSound(pNS), eOutputFormat(OF_REAL_VAL), rDefCarOffset((_REAL) VIRTUAL_INTERMED_FREQ) // , strOutFileName("test/TransmittedData.txt") { } virtual ~CTransmitData(); void SetIQOutput(const EOutFormat eFormat) {eOutputFormat = eFormat;} EOutFormat GetIQOutput() {return eOutputFormat;} void SetCarOffset(const CReal rNewCarOffset) {rDefCarOffset = rNewCarOffset;} protected: FILE* pFileTransmitter; CSoundOutInterface* pSound; CVector vecsDataOut; int iBlockCnt; int iNumBlocks; EOutFormat eOutputFormat; CDRMBandpassFilt BPFilter; CReal rDefCarOffset; CReal rNormFactor; int iBigBlockSize; // string strOutFileName; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& Parameter); }; #endif // !defined(DRMSIGNALIO_H__3B0BA660_CA63_4344_B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/DataIO.cpp0000664000175000017500000000422113203343610017037 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001-2006 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "DataIO.h" #include #include /******************************************************************************\ * FAC data * \******************************************************************************/ /* Transmitter */ void CGenerateFACData::ProcessDataInternal(CParameter& TransmParam) { FACTransmit.FACParam(pvecOutputData, TransmParam); } void CGenerateFACData::InitInternal(CParameter& TransmParam) { FACTransmit.Init(TransmParam); /* Define block-size for output */ iOutputBlockSize = NUM_FAC_BITS_PER_BLOCK; } /******************************************************************************\ * SDC data * \******************************************************************************/ /* Transmitter */ void CGenerateSDCData::ProcessDataInternal(CParameter& TransmParam) { SDCTransmit.SDCParam(pvecOutputData, TransmParam); } void CGenerateSDCData::InitInternal(CParameter& TransmParam) { /* Define block-size for output */ iOutputBlockSize = TransmParam.iNumSDCBitsPerSFrame; } qsstv_9.2.6/qsstv/drmtx/common/DataIO.h0000664000175000017500000000773513203343610016521 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001-2005 * * Author(s): * Volker Fischer, Andrew Murphy * * Description: * See Data.cpp * * 11/21/2005 Andrew Murphy, BBC Research & Development, 2005 * - Addition GetSDCReceive(), Added CSplit class * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DATA_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define DATA_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ # include "soundinterface.h" #include "Parameter.h" #include "util/Modul.h" #include "FAC/FAC.h" #include "SDC/SDC.h" //#include "TextMessage.h" //#include "util/AudioFile.h" #include "util/Utilities.h" //#include "AMDemodulation.h" // For CMixer /* Definitions ****************************************************************/ /* In case of random-noise, define number of blocks */ #define DEFAULT_NUM_SIM_BLOCKS 50 /* Length of vector for audio spectrum. We use a power-of-two length to make the FFT work more efficient */ #define NUM_SMPLS_4_AUDIO_SPECTRUM 256 /* Time span used for averaging the audio spectrum. Shall be higher than the 400 ms DRM audio block */ #define TIME_AV_AUDIO_SPECT_MS 500 /* ms */ /* Number of blocks for averaging the audio spectrum */ #define NUM_BLOCKS_AV_AUDIO_SPEC Ceil(((_REAL) SOUNDCRD_SAMPLE_RATE * \ TIME_AV_AUDIO_SPECT_MS / 1000 / NUM_SMPLS_4_AUDIO_SPECTRUM)) /* Normalization constant for two mixed signals. If this constant is 2, no overrun of the "short" variable can happen but signal has quite much lower power -> compromise */ #define MIX_OUT_CHAN_NORM_CONST ((_REAL) 1.0 / sqrt((_REAL) 2.0)) class CGenSimData : public CTransmitterModul<_BINARY, _BINARY> { public: CGenSimData() : eCntType(CT_TIME), iNumSimBlocks(DEFAULT_NUM_SIM_BLOCKS), iNumErrors(0), iCounter(0), strFileName("SimTime.dat"), tiStartTime(0) {} virtual ~CGenSimData() {} void SetSimTime(int iNewTi, string strNewFileName); void SetNumErrors(int iNewNE, string strNewFileName); protected: enum ECntType {CT_TIME, CT_ERRORS}; ECntType eCntType; int iNumSimBlocks; int iNumErrors; int iCounter; int iMinNumBlocks; string strFileName; time_t tiStartTime; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; /* FAC ---------------------------------------------------------------------- */ class CGenerateFACData : public CTransmitterModul<_BINARY, _BINARY> { public: CGenerateFACData() {} virtual ~CGenerateFACData() {} protected: CFACTransmit FACTransmit; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; /* SDC ---------------------------------------------------------------------- */ class CGenerateSDCData : public CTransmitterModul<_BINARY, _BINARY> { public: CGenerateSDCData() {} virtual ~CGenerateSDCData() {} protected: CSDCTransmit SDCTransmit; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; #endif // !defined(DATA_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/DrmTransmitter.cpp0000664000175000017500000002015313203343610020717 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use by Ties Bos - PA0MBO * * Description: * DRM-transmitter * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "DrmTransmitter.h" #include "csoundout.h" #include "appglobal.h" #include "drm.h" #include "supportfunctions.h" /* Implementation *************************************************************/ void CDRMTransmitter::Start() { TransmParam.bRunThread = true; // Set run flag // Init(); // Initialization of the modules Run(); } void CDRMTransmitter::Stop() { TransmParam.bRunThread = false; } void CDRMTransmitter::Run() { /* The hand over of data is done via an intermediate-buffer. The calling convention is always "input-buffer, output-buffer". Additional, the DRM-parameters are fed to the function */ while (TransmParam.bRunThread) { addToLog("AudioSourceEncoder",LOGDRMTX); AudioSourceEncoder.ProcessData(TransmParam, AudSrcBuf); //arrayBinDump(QString("audiosrc %1").arg(runCounter++),AudSrcBuf,32,true); addToLog("MSCMLCEncoder",LOGPERFORM); MSCMLCEncoder.ProcessData(TransmParam, AudSrcBuf, MLCEncBuf); addToLog("SymbInterleaver",LOGPERFORM); SymbInterleaver.ProcessData(TransmParam, MLCEncBuf, IntlBuf); addToLog("GenerateFACData",LOGPERFORM); GenerateFACData.ReadData(TransmParam, GenFACDataBuf); addToLog("FACMLCEncoder",LOGPERFORM); FACMLCEncoder.ProcessData(TransmParam, GenFACDataBuf, FACMapBuf); addToLog("OFDMCellMapping",LOGPERFORM); OFDMCellMapping.ProcessData(TransmParam, IntlBuf, FACMapBuf, CarMapBuf); addToLog("OFDMModulation",LOGPERFORM); OFDMModulation.ProcessData(TransmParam, CarMapBuf, OFDMModBuf); addToLog("TransmitData",LOGPERFORM); TransmitData.WriteData(TransmParam, OFDMModBuf); // arrayComplexDump(QString("cd "),OFDMModBuf.getVecBuffer(),8,true); if (stopDRM) { TransmParam.bRunThread=false; addToLog("stopping drm",LOGPERFORM); } } } void CDRMTransmitter::Init() { int PacLen, nr_decoded_bits ; // added pa0mbo OFDMCellMapping.Init(TransmParam, CarMapBuf); // Defines number of cells, important! // SDCMLCEncoder.Init(TransmParam, SDCMapBuf); // Defines number of SDC bits per super-frame MSCMLCEncoder.Init(TransmParam, MLCEncBuf); nr_decoded_bits = TransmParam.iNumDecodedBitsMSC ; PacLen = (nr_decoded_bits/8) - 3 ; // printf("PacLen is %d\n", PacLen); TransmParam.Service[0].DataParam.iPacketLen=PacLen; // added Oct 19th 2011 pa0mbo TransmParam.iNumAudioService=0; TransmParam.iNumDataService =1 ; TransmParam.Service[0].eAudDataFlag = CService::SF_DATA; TransmParam.Service[0].DataParam.iStreamID = 0; TransmParam.Service[0].DataParam.eDataUnitInd = CDataParam::DU_DATA_UNITS; TransmParam.Service[0].DataParam.eAppDomain = CDataParam::AD_DAB_SPEC_APP; // end added block SymbInterleaver.Init(TransmParam, IntlBuf); GenerateFACData.Init(TransmParam, GenFACDataBuf); FACMLCEncoder.Init(TransmParam, FACMapBuf); OFDMModulation.Init(TransmParam, OFDMModBuf); AudioSourceEncoder.Init(TransmParam, AudSrcBuf); TransmitData.Init(TransmParam); } CDRMTransmitter::CDRMTransmitter() : pSoundOutInterface(new CSoundOut), TransmitData(pSoundOutInterface), // UEP only works with Dream receiver, FIXME! -> disabled for now bUseUEP(false) { } void CDRMTransmitter::init_base() { TransmParam.init(); /* Init streams */ TransmParam.ResetServicesStreams(); /* Init frame ID counter (index) */ TransmParam.iFrameIDTransm = 0; /* Date, time. TODO: use computer system time... */ TransmParam.iDay = 0; TransmParam.iMonth = 0; TransmParam.iYear = 0; TransmParam.iUTCHour = 0; TransmParam.iUTCMin = 0; /**************************************************************************/ /* Robustness mode and spectrum occupancy. Available transmission modes: RM_ROBUSTNESS_MODE_A: Gaussian channels, with minor fading, RM_ROBUSTNESS_MODE_B: Time and frequency selective channels, with longer delay spread, RM_ROBUSTNESS_MODE_C: As robustness mode B, but with higher Doppler spread, RM_ROBUSTNESS_MODE_D: As robustness mode B, but with severe delay and Doppler spread. Available bandwidths: SO_0: 4.5 kHz, SO_1: 5 kHz, SO_2: 9 kHz, SO_3: 10 kHz, SO_4: 18 kHz, SO_5: 20 kHz PA0MBO: for ham use now only modes A, B and E */ TransmParam.InitCellMapTable(RM_ROBUSTNESS_MODE_E, SO_1); // was B pa0mbo 21-10-2011 /* Protection levels for MSC. Depend on the modulation scheme. Look at TableMLC.h, iCodRateCombMSC16SM, iCodRateCombMSC64SM, iCodRateCombMSC64HMsym, iCodRateCombMSC64HMmix for available numbers */ TransmParam.MSCPrLe.iPartA = 0; TransmParam.MSCPrLe.iPartB = 0; TransmParam.MSCPrLe.iHierarch = 0; /* Either one audio or one data service can be chosen */ // _BOOLEAN bIsAudio = false; CService Service; /* In the current version only one service and one stream is supported. The stream IDs must be 0 in both cases */ /* Data Service only, no Audio*/ TransmParam.SetNumOfServices(0,1); TransmParam.SetCurSelDataService(0); TransmParam.SetAudDataFlag(0, CService::SF_DATA); CDataParam DataParam; DataParam.iStreamID = 0; /* Init SlideShow application */ DataParam.iPacketLen = 45; /* TEST */ DataParam.eDataUnitInd = CDataParam::DU_DATA_UNITS; DataParam.eAppDomain = CDataParam::AD_DAB_SPEC_APP; TransmParam.SetDataParam(0, DataParam); /* The value 0 indicates that the application details are provided solely by SDC data entity type 5 */ Service.iServiceDescr = 0; /* Init service parameters, 24 bit unsigned integer number */ Service.iServiceID = 0; // Service label data. Up to 16 bytes defining the label using UTF-8 coding Service.strLabel = "MYCALL"; /* Language (see TableFAC.h, "strTableLanguageCode[]") */ Service.iLanguage = 5; /* 5 -> english */ TransmParam.SetServiceParameters(0, Service); /* Interleaver mode of MSC service. Long interleaving (2 s): SI_LONG, short interleaving (400 ms): SI_SHORT */ TransmParam.eSymbolInterlMode = CParameter::SI_LONG; /* MSC modulation scheme. Available modes: 16-QAM standard mapping (SM): CS_2_SM, 64-QAM standard mapping (SM): CS_3_SM, 64-QAM symmetrical hierarchical mapping (HMsym): CS_3_HMSYM, 64-QAM mixture of the previous two mappings (HMmix): CS_3_HMMIX */ TransmParam.eMSCCodingScheme = CS_2_SM; // was CS_3_SM pa0mbo 21-11-2011 /* SDC modulation scheme. Available modes: 4-QAM standard mapping (SM): CS_1_SM, 16-QAM standard mapping (SM): CS_2_SM */ // TransmParam.eSDCCodingScheme = CS_2_SM; pa0mbo /* Set desired intermedia frequency (IF) in Hertz */ SetCarOffset(350.0); /* Default: "VIRTUAL_INTERMED_FREQ" was 12000.0 pa0mbo */ rDefCarOffset=(_REAL) VIRTUAL_INTERMED_FREQ; if (bUseUEP == true) { // TEST TransmParam.SetStreamLen(0, 80, 0); } else { /* Length of part B is set automatically (equal error protection (EEP), if "= 0"). Sets the number of bytes, should not exceed total number of bytes available in MSC block */ TransmParam.SetStreamLen(0, 0, 0); } } qsstv_9.2.6/qsstv/drmtx/common/DrmTransmitter.h0000664000175000017500000000731213203343610020366 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See DrmTransmitter.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DRMTRANSM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define DRMTRANSM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include #include "util/Buffer.h" #include "Parameter.h" #include "DataIO.h" #include "mlc/MLC.h" #include "interleaver/SymbolInterleaver.h" #include "ofdmcellmapping/OFDMCellMapping.h" #include "OFDM.h" #include "DRMSignalIO.h" #include "sourcedecoders/AudioSourceDecoder.h" #include "soundinterface.h" /* Classes ********************************************************************/ class CDRMTransmitter { public: CDRMTransmitter(); virtual ~CDRMTransmitter() {} void Init(); void init_base(); void Start(); void Stop(); /* Get pointer to internal modules */ // CSoundInInterface* GetSoundInInterface() {return pSoundInInterface;} CSoundOutInterface* GetSoundOutInterface() {return pSoundOutInterface;} CAudioSourceEncoder* GetAudSrcEnc() {return &AudioSourceEncoder;} CTransmitData* GetTransData() {return &TransmitData;} // CReadData* GetReadData() {return &ReadData;} CParameter* GetParameters() {return &TransmParam;} void SetCarOffset(const _REAL rNewCarOffset) { /* Has to be set in OFDM modulation and transmitter filter module */ OFDMModulation.SetCarOffset(rNewCarOffset); TransmitData.SetCarOffset(rNewCarOffset); rDefCarOffset = rNewCarOffset; } _REAL GetCarOffset() {return rDefCarOffset;} protected: void Run(); /* Parameters */ CParameter TransmParam; /* Buffers */ CSingleBuffer<_SAMPLE> DataBuf; CSingleBuffer<_BINARY> AudSrcBuf; CSingleBuffer<_COMPLEX> MLCEncBuf; CCyclicBuffer<_COMPLEX> IntlBuf; CSingleBuffer<_BINARY> GenFACDataBuf; CCyclicBuffer<_COMPLEX> FACMapBuf; CSingleBuffer<_BINARY> GenSDCDataBuf; CCyclicBuffer<_COMPLEX> SDCMapBuf; CSingleBuffer<_COMPLEX> CarMapBuf; CSingleBuffer<_COMPLEX> OFDMModBuf; // CSoundInInterface* pSoundInInterface; CSoundOutInterface* pSoundOutInterface; /* Modules */ // CReadData ReadData; CAudioSourceEncoder AudioSourceEncoder; CMSCMLCEncoder MSCMLCEncoder; CSymbInterleaver SymbInterleaver; CGenerateFACData GenerateFACData; CFACMLCEncoder FACMLCEncoder; CGenerateSDCData GenerateSDCData; CSDCMLCEncoder SDCMLCEncoder; COFDMCellMapping OFDMCellMapping; COFDMModulation OFDMModulation; CTransmitData TransmitData; _REAL rDefCarOffset; _BOOLEAN bUseUEP; }; #define BWs 2 #define MODES 3 #define PROTECTIONS 2 #define QAMS 3 extern int partTable[BWs][MODES][PROTECTIONS][QAMS]; #endif // !defined(DRMTRANSM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/GlobalDefinitions.h0000664000175000017500000002135713203343610021010 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001-2006 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBo * * Description: * Global definitions * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(DEF_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define DEF_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "appglobal.h" #include "appdefs.h" #include #include #include #include "../config.h" #include "tables/TableDRMGlobal.h" /* Definitions ****************************************************************/ /* When you define the following flag, a directory called "test" MUST EXIST in the windows directory (or linux directory if you use Linux)! */ #define _DEBUG_ #undef _DEBUG_ /* Choose algorithms -------------------------------------------------------- */ /* There are two algorithms available for frequency offset estimation for tracking mode: Using frequency pilots or the guard-interval correlation. In case of guard-interval correlation (which will be chosen if this macro is defined), the Hilbert filter in TimeSync must be used all the time -> more CPU usage. Also, the frequency tracking range is smaller */ #undef USE_FRQOFFS_TRACK_GUARDCORR /* The sample rate offset estimation can be done using the frequency pilots or the movement of the estimated impulse response. Defining this macro will enable the frequency pilot based estimation. Simulations showed that this method is more vulnerable to bad channel situations */ #undef USE_SAMOFFS_TRACK_FRE_PIL /* Using max-log MAP decoder. A lot more memory and CPU is needed for this method. This is just for showing the potential of an improved decoding method and should not be activated for the "regular" version of Dream */ #undef USE_MAX_LOG_MAP /* This method tries to speed up the audio output after a re-synchronization when long symbol interleaver is used. We work with erasure symbols to mark data which is not yet received. We hope that the channel decoder can still decode audio even if not all data is yet received to fill the interleaver history */ #define USE_ERASURE_FOR_FASTER_ACQ /* If the following macro is defined, the Wiener filter for channel estimation in time direction will be a Decision-Directed channel estimation -> additional to the actual pilot cells, hard decisions about the data cells are used as new pilots, too */ #undef USE_DD_WIENER_FILT_TIME #if HAVE_STDINT_H # include #elif HAVE_INTTYPES_H # include #elif defined(_WIN32) # ifndef HAVE_INT8_T # define HAVE_INT8_T 1 typedef signed char int8_t; # endif # ifndef HAVE_INT16_T # define HAVE_INT16_T 1 typedef signed __int16 int16_t; # endif # ifndef HAVE_INT32_T # define HAVE_INT32_T 1 typedef signed __int32 int32_t; # endif typedef unsigned char uint8_t; # ifndef HAVE_U_INT16_T # define HAVE_U_INT16_T 1 typedef unsigned __int16 uint16_t; # endif # ifndef HAVE_U_INT32_T # define HAVE_U_INT32_T 1 typedef unsigned __int32 uint32_t; # endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; #else typedef signed char int8_t; typedef unsigned char uint8_t; typedef signed int int16_t; typedef unsigned int uint16_t; typedef signed long int32_t; typedef unsigned long uint32_t; typedef signed long long int64_t; typedef unsigned long long uint64_t; #endif /* Define type-specific information */ #define SIZEOF__BYTE 8 #define _MAXSHORT 32767 #define _MAXREAL ((_REAL) 3.4e38) /* Max for float */ #ifdef USE_ERASURE_FOR_FASTER_ACQ /* Use max-value for showing that this is an erasure */ # define ERASURE_TAG_VALUE _MAXREAL #endif /* MAP ---------------------------------------------------------------------- */ #ifdef USE_MAX_LOG_MAP typedef _REAL _DECISION; # define ML_SOFT_INF_MAX_VALUE ((_DECISION) 1e10) inline _BINARY ExtractBit(_DECISION dD) {return dD > 0 ? 1 : 0;} inline _DECISION BitToSoft(_BINARY biB) {return biB == 0 ? -1.0 : 1.0;} #else typedef _BINARY _DECISION; #define ExtractBit(a) (a) #define BitToSoft(a) (a) #endif /* Definitions for window message system ------------------------------------ */ typedef unsigned int _MESSAGE_IDENT; #define MS_FAC_CRC 1 /* MS: Message */ #define MS_SDC_CRC 2 #define MS_MSC_CRC 3 #define MS_FRAME_SYNC 4 #define MS_TIME_SYNC 5 #define MS_IOINTERFACE 6 #define MS_RESET_ALL 7 #define MS_MOT_OBJ_STAT 8 #define GUI_CONTROL_UPDATE_TIME 500 /* Milliseconds */ #define GUI_CONTROL_UPDATE_TIME_FAST 250 /* Milliseconds */ /* Global enumerations ------------------------------------------------------ */ enum ESpecOcc {SO_0, SO_1, SO_2, SO_3, SO_4, SO_5}; /* SO: Spectrum Occupancy */ enum ERobMode {RM_ROBUSTNESS_MODE_A, RM_ROBUSTNESS_MODE_B, RM_ROBUSTNESS_MODE_E, RM_ROBUSTNESS_MODE_D, // pa0mbo was MODE_D RM_NO_MODE_DETECTED}; /* RM: Robustness Mode */ /* Constants ---------------------------------------------------------------- */ const _REAL crPi = ((_REAL) 3.14159265358979323846); #define S9_DBUV 34.0 /* S9 in dBuV for converting HamLib S-meter readings to RSCI format */ /* Define a number for the case: log10(0), which would lead to #inf */ #define RET_VAL_LOG_0 ((_REAL) -200.0) ///* Standard definitions */ //#define true 1 //#define false 0 /* Classes ********************************************************************/ /* For metric */ class CDistance { public: /* Distance towards 0 or towards 1 */ _REAL rTow0; _REAL rTow1; }; /* Viterbi needs information of equalized received signal and channel */ class CEquSig { public: CEquSig() : cSig(_COMPLEX((_REAL) 0.0, (_REAL) 0.0)), rChan((_REAL) 0.0) {} CEquSig(const _COMPLEX cNS, const _REAL rNC) : cSig(cNS), rChan(rNC) {} _COMPLEX cSig; /* Actual signal */ _REAL rChan; /* Channel power at this cell */ }; /* Mutex object to access data safely from different threads */ /* QT mutex */ #ifdef USE_QT_GUI # if #if (QT_VERSION >= QT_VERSION_CHECK(3, 0, 0)) # include # else # include # endif class CMutex { public: void Lock() {Mutex.lock();} void Unlock() {Mutex.unlock();} protected: QMutex Mutex; }; #else /* No GUI and no threads, we do not need mutex in this case */ class CMutex { public: void Lock() {} void Unlock() {} }; #endif class CGenErr { public: CGenErr(string strNE) : strError(strNE) {} string strError; }; // FIXME something nicer than using "MAX_NUM_TAPS_DRM_CHAN" /* For simulation, data from channel simulation */ #define MAX_NUM_TAPS_DRM_CHAN 4 template class CChanSimData { public: T tIn; /* Channel input data */ T tOut; /* Output of the channel (with noise) */ T tRef; /* Channel reference signal (without noise) */ _COMPLEX veccTap[MAX_NUM_TAPS_DRM_CHAN]; /* Tap gains */ _COMPLEX veccTapBackw[MAX_NUM_TAPS_DRM_CHAN]; }; typedef CChanSimData<_REAL> CChanSimDataMod; /* OFDM modulated signals */ typedef CChanSimData<_COMPLEX> CChanSimDataDemod; /* Demodulated signals */ /* Path for simulation output and status files */ #define SIM_OUT_FILES_PATH "test/" /* Prototypes for global functions ********************************************/ /* Posting a window message */ //void PostWinMessage(const _MESSAGE_IDENT MessID, const int iMessageParam = 0); /* Debug error handling */ void DebugError(const char* pchErDescr, const char* pchPar1Descr, const double dPar1, const char* pchPar2Descr, const double dPar2); void ErrorMessage(string strErrorString); /* Global functions ***********************************************************/ /* Converting _REAL to _SAMPLE */ inline _SAMPLE Real2Sample(const _REAL rInput) { /* Lower bound */ if (rInput < -_MAXSHORT) return -_MAXSHORT; /* Upper bound */ if (rInput > _MAXSHORT) return _MAXSHORT; return (_SAMPLE) rInput; } #endif // !defined(DEF_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/OFDM.cpp0000664000175000017500000001241013203343610016462 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * OFDM modulation; * OFDM demodulation, SNR estimation, PSD estimation * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "OFDM.h" /* Implementation *************************************************************/ /******************************************************************************\ * OFDM-modulation * \******************************************************************************/ void COFDMModulation::ProcessDataInternal(CParameter&) { int i; // printf("In COFDMModul iShiftKmin %d iEndIndex %d , iDFTSize %d iGuardSize %d\n", // iShiftedKmin, iEndIndex, iDFTSize, iGuardSize); /* Copy input vector in matlib vector and place bins at the correct position */ for (i = iShiftedKmin; i < iEndIndex; i++) { // veccFFTInput[150] = _COMPLEX((_REAL) 1.0, (_REAL) -1.0); // test pa0mbo veccFFTInput[i] = (*pvecInputData)[i - iShiftedKmin]; // veccFFTInput[iDFTSize -1 - i] = Conj((*pvecInputData)[i - iShiftedKmin]); // printf(" veccFFTInput %d %g %g\n", i,(veccFFTInput[i]).real(), (veccFFTInput[i]).imag()); } /* Calculate inverse fast Fourier transformation */ veccFFTOutput = Ifft(veccFFTInput, FftPlan); /* Copy complex FFT output in output buffer and scale */ for (i = 0; i < iDFTSize; i++) (*pvecOutputData)[i + iGuardSize] = veccFFTOutput[i] * (CReal) iDFTSize; /* Copy data from the end to the guard-interval (Add guard-interval) */ for (i = 0; i < iGuardSize; i++) (*pvecOutputData)[i] = (*pvecOutputData)[iDFTSize + i]; /* tbv test printout pa0mbo printf("===========\n"); for (i=0; i < iDFTSize + iGuardSize ; i++) printf("%d %g \n",i, ((*pvecOutputData)[i]).real()); printf("=============\n"); */ /* Shift spectrum to desired IF ----------------------------------------- */ /* Only apply shifting if phase is not zero */ if (cExpStep != _COMPLEX((_REAL) 1.0, (_REAL) 0.0)) { for (i = 0; i < iOutputBlockSize; i++) { (*pvecOutputData)[i] = (*pvecOutputData)[i] * Conj(cCurExp); // pa0mbo shift off /* Rotate exp-pointer on step further by complex multiplication with precalculated rotation vector cExpStep. This saves us from calling sin() and cos() functions all the time (iterative calculation of these functions) */ cCurExp *= cExpStep; } } } void COFDMModulation::InitInternal(CParameter& TransmParam) { TransmParam.Lock(); /* Get global parameters */ iDFTSize = TransmParam.CellMappingTable.iFFTSizeN; iGuardSize = TransmParam.CellMappingTable.iGuardSize; iShiftedKmin = TransmParam.CellMappingTable.iShiftedKmin; /* Last index */ iEndIndex = TransmParam.CellMappingTable.iShiftedKmax + 1; /* Normalized offset correction factor for IF shift. Subtract the default IF frequency ("VIRTUAL_INTERMED_FREQ") */ const _REAL rNormCurFreqOffset = (_REAL) -2.0 * crPi * // ((_REAL ) -6751.0)/ SOUNDCRD_SAMPLE_RATE; (rDefCarOffset - VIRTUAL_INTERMED_FREQ) / SOUNDCRD_SAMPLE_RATE; // printf("COFDMMod rDefCarOffset %g Virt IF %g rNormCurFreqoffset %g \n", rDefCarOffset, (_REAL) VIRTUAL_INTERMED_FREQ, rNormCurFreqOffset); /* Rotation vector for exp() calculation */ cExpStep = _COMPLEX(cos(rNormCurFreqOffset), sin(rNormCurFreqOffset)); // printf("COFDMMod cExpStep real %g imag %g \n", cos(rNormCurFreqOffset), sin(rNormCurFreqOffset)); /* Start with phase null (can be arbitrarily chosen) */ cCurExp = (_REAL) 1.0; /* Init plans for FFT (faster processing of Fft and Ifft commands) */ FftPlan.Init(iDFTSize); // printf("In FftPlan.Init iDFTSize is %d \n", iDFTSize); /* Allocate memory for intermediate result of fft. Zero out input vector (because only a few bins are used, the rest has to be zero) */ veccFFTInput.Init(iDFTSize, (CReal) 0.0); veccFFTOutput.Init(iDFTSize); /* Define block-sizes for input and output */ iInputBlockSize = TransmParam.CellMappingTable.iNumCarrier; iOutputBlockSize = TransmParam.CellMappingTable.iSymbolBlockSize; // printf("In COFDMMOd init DFTsize %d Guardsize %d ShiftedKmin %d \n", iDFTSize, iGuardSize, iShiftedKmin); // printf("In COFDMMOd init Inputblcksize %d Outputblocksize %d \n", iInputBlockSize, iOutputBlockSize); TransmParam.Unlock(); } qsstv_9.2.6/qsstv/drmtx/common/OFDM.h0000664000175000017500000000443613203343610016140 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * See OFDM.cpp * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(OFDM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define OFDM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "Parameter.h" #include "util/Modul.h" #include "matlib/Matlib.h" /* Definitions ****************************************************************/ /* Time constant for IIR averaging of PSD estimation */ #define TICONST_PSD_EST_OFDM ((CReal) 1.0) /* sec */ /* Classes ********************************************************************/ class COFDMModulation : public CTransmitterModul<_COMPLEX, _COMPLEX> { public: COFDMModulation() : rDefCarOffset((_REAL) VIRTUAL_INTERMED_FREQ) {} virtual ~COFDMModulation() {} void SetCarOffset(const _REAL rNewCarOffset) {rDefCarOffset = rNewCarOffset;} protected: CFftPlans FftPlan; CComplexVector veccFFTInput; CComplexVector veccFFTOutput; int iShiftedKmin; int iEndIndex; int iDFTSize; int iGuardSize; _COMPLEX cCurExp; _COMPLEX cExpStep; _REAL rDefCarOffset; virtual void InitInternal(CParameter& TransmParam); virtual void ProcessDataInternal(CParameter& TransmParam); }; #endif // !defined(OFDM_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/Parameter.cpp0000664000175000017500000010171513203343610017664 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2007 * * Author(s): * Volker Fischer, Andrew Murphy * * Adapter for ham sstv use Ties Bos - PA0MBO * * Description: * DRM Parameters * ****************************************************************************** * * This program is free software(), you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation(), either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY(), without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program(), if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #include "Parameter.h" //#include "DrmReceiver.h" #include #include #include //#include "util/LogPrint.h" /* Implementation *************************************************************/ CParameter::CParameter(): // pDRMRec(pRx), Stream(MAX_NUM_STREAMS), Service(MAX_NUM_SERVICES), iNumAudioFrames(0), vecbiAudioFrameStatus(0), bMeasurePSD(), vecrPSD(0), matcReceivedPilotValues(), RawSimDa(), eSimType(ST_NONE), iDRMChannelNum(0), iSpecChDoppler(0), rBitErrRate(0.0), rSyncTestParam(0.0), rSINR(0.0), iNumBitErrors(0), iChanEstDelay(0), iNumTaps(0), iPathDelay(MAX_NUM_TAPS_DRM_CHAN), rGainCorr(0.0), iOffUsfExtr(0), ReceiveStatus(), FrontEndParameters(), AltFreqSign(), rMER(0.0), rWMERMSC(0.0), rWMERFAC(0.0), rSigmaEstimate(0.0), rMinDelay(0.0), rMaxDelay(0.0), bMeasureDelay(), vecrRdel(0), vecrRdelThresholds(0), vecrRdelIntervals(0), bMeasureDoppler(0), rRdop(0.0), bMeasureInterference(false), rIntFreq(0.0), rINR(0.0), rICR(0.0), rMaxPSDwrtSig(0.0), rMaxPSDFreq(0.0), rSigStrengthCorrection(0.0), bRunThread(false), bUsingMultimedia(false), CellMappingTable(), rSysSimSNRdB(0.0), iFrequency(0), bValidSignalStrength(false), rSigStr(0.0), rIFSigStr(0.0), iCurSelAudioService(0), iCurSelDataService(0), eRobustnessMode(RM_ROBUSTNESS_MODE_B), eSpectOccup(SO_3), LastAudioService(), LastDataService(), Mutex() { init(); GenerateRandomSerialNumber(); CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); } void CParameter::init() { eSymbolInterlMode=SI_LONG; eMSCCodingScheme=CS_1_SM; eSDCCodingScheme=CS_1_SM; iNumAudioService=0; iNumDataService=0; iAMSSCarrierMode=0; sReceiverID=" "; sSerialNumber=""; sDataFilesDirectory="."; MSCPrLe.init(); iNumBitsHierarchFrameTotal=0; iNumDecodedBitsMSC=0; iNumSDCBitsPerSFrame=0; iNumAudioDecoderBits=0; iNumDataDecoderBits=0; iYear=0; iMonth=0; iDay=0; iUTCHour=0; iUTCMin=0; iFrameIDTransm=0; iFrameIDReceiv=0; rFreqOffsetAcqui=0.0; rFreqOffsetTrack=0.0; rResampleOffset=0.0; iTimingOffsTrack=0; eReceiverMode=RM_NONE; eAcquiState=AS_NO_SIGNAL; } CParameter::~CParameter() { } CParameter::CParameter(const CParameter& p): // pDRMRec(p.pDRMRec), eSymbolInterlMode(p.eSymbolInterlMode), eMSCCodingScheme(p.eMSCCodingScheme), eSDCCodingScheme(p.eSDCCodingScheme), iNumAudioService(p.iNumAudioService), iNumDataService(p.iNumDataService), iAMSSCarrierMode(p.iAMSSCarrierMode), sReceiverID(p.sReceiverID), sSerialNumber(p.sSerialNumber), sDataFilesDirectory(p.sDataFilesDirectory), MSCPrLe(p.MSCPrLe), Stream(p.Stream), Service(p.Service), iNumBitsHierarchFrameTotal(p.iNumBitsHierarchFrameTotal), iNumDecodedBitsMSC(p.iNumDecodedBitsMSC), iNumSDCBitsPerSFrame(p.iNumSDCBitsPerSFrame), iNumAudioDecoderBits(p.iNumAudioDecoderBits), iNumDataDecoderBits(p.iNumDataDecoderBits), iYear(p.iYear), iMonth(p.iMonth), iDay(p.iDay), iUTCHour(p.iUTCHour), iUTCMin(p.iUTCMin), iFrameIDTransm(p.iFrameIDTransm), iFrameIDReceiv(p.iFrameIDReceiv), rFreqOffsetAcqui(p.rFreqOffsetAcqui), rFreqOffsetTrack(p.rFreqOffsetTrack), rResampleOffset(p.rResampleOffset), iTimingOffsTrack(p.iTimingOffsTrack), eReceiverMode(p.eReceiverMode), eAcquiState(p.eAcquiState), iNumAudioFrames(p.iNumAudioFrames), vecbiAudioFrameStatus(p.vecbiAudioFrameStatus), bMeasurePSD(p.bMeasurePSD), vecrPSD(p.vecrPSD), //matcReceivedPilotValues(p.matcReceivedPilotValues), matcReceivedPilotValues(), // OPH says copy constructor for CMatrix not safe yet RawSimDa(p.RawSimDa), eSimType(p.eSimType), iDRMChannelNum(p.iDRMChannelNum), iSpecChDoppler(p.iSpecChDoppler), rBitErrRate(p.rBitErrRate), rSyncTestParam (p.rSyncTestParam), rSINR(p.rSINR), iNumBitErrors(p.iNumBitErrors), iChanEstDelay(p.iChanEstDelay), iNumTaps(p.iNumTaps), iPathDelay(p.iPathDelay), rGainCorr(p.rGainCorr), iOffUsfExtr(p.iOffUsfExtr), ReceiveStatus(p.ReceiveStatus), FrontEndParameters(p.FrontEndParameters), AltFreqSign(p.AltFreqSign), rMER(p.rMER), rWMERMSC(p.rWMERMSC), rWMERFAC(p.rWMERFAC), rSigmaEstimate(p.rSigmaEstimate), rMinDelay(p.rMinDelay), rMaxDelay(p.rMaxDelay), bMeasureDelay(p.bMeasureDelay), vecrRdel(p.vecrRdel), vecrRdelThresholds(p.vecrRdelThresholds), vecrRdelIntervals(p.vecrRdelIntervals), bMeasureDoppler(p.bMeasureDoppler), rRdop(p.rRdop), bMeasureInterference(p.bMeasureInterference), rIntFreq(p.rIntFreq), rINR(p.rINR), rICR(p.rICR), rMaxPSDwrtSig(p.rMaxPSDwrtSig), rMaxPSDFreq(p.rMaxPSDFreq), rSigStrengthCorrection(p.rSigStrengthCorrection), bRunThread(p.bRunThread), bUsingMultimedia(p.bUsingMultimedia), CellMappingTable(), // jfbc CCellMappingTable uses a CMatrix :( // GPSData(p.GPSData), rSysSimSNRdB(p.rSysSimSNRdB), iFrequency(p.iFrequency), bValidSignalStrength(p.bValidSignalStrength), rSigStr(p.rSigStr), rIFSigStr(p.rIFSigStr), iCurSelAudioService(p.iCurSelAudioService), iCurSelDataService(p.iCurSelDataService), eRobustnessMode(p.eRobustnessMode), eSpectOccup(p.eSpectOccup), LastAudioService(p.LastAudioService), LastDataService(p.LastDataService) //, Mutex() // jfbc: I don't think this state should be copied { CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); matcReceivedPilotValues = p.matcReceivedPilotValues; // TODO } CParameter& CParameter::operator=(const CParameter& p) { // pDRMRec = p.pDRMRec; eSymbolInterlMode = p.eSymbolInterlMode; eMSCCodingScheme = p.eMSCCodingScheme; eSDCCodingScheme = p.eSDCCodingScheme; iNumAudioService = p.iNumAudioService; iNumDataService = p.iNumDataService; iAMSSCarrierMode = p.iAMSSCarrierMode; sReceiverID = p.sReceiverID; sSerialNumber = p.sSerialNumber; sDataFilesDirectory = p.sDataFilesDirectory; MSCPrLe = p.MSCPrLe; Stream = p.Stream; Service = p.Service; iNumBitsHierarchFrameTotal = p.iNumBitsHierarchFrameTotal; iNumDecodedBitsMSC = p.iNumDecodedBitsMSC; iNumSDCBitsPerSFrame = p.iNumSDCBitsPerSFrame; iNumAudioDecoderBits = p.iNumAudioDecoderBits; iNumDataDecoderBits = p.iNumDataDecoderBits; iYear = p.iYear; iMonth = p.iMonth; iDay = p.iDay; iUTCHour = p.iUTCHour; iUTCMin = p.iUTCMin; iFrameIDTransm = p.iFrameIDTransm; iFrameIDReceiv = p.iFrameIDReceiv; rFreqOffsetAcqui = p.rFreqOffsetAcqui; rFreqOffsetTrack = p.rFreqOffsetTrack; rResampleOffset = p.rResampleOffset; iTimingOffsTrack = p.iTimingOffsTrack; eReceiverMode = p.eReceiverMode; eAcquiState = p.eAcquiState; iNumAudioFrames = p.iNumAudioFrames; vecbiAudioFrameStatus = p.vecbiAudioFrameStatus; bMeasurePSD = p.bMeasurePSD; vecrPSD = p.vecrPSD; matcReceivedPilotValues = p.matcReceivedPilotValues; RawSimDa = p.RawSimDa; eSimType = p.eSimType; iDRMChannelNum = p.iDRMChannelNum; iSpecChDoppler = p.iSpecChDoppler; rBitErrRate = p.rBitErrRate; rSyncTestParam = p.rSyncTestParam; rSINR = p.rSINR; iNumBitErrors = p.iNumBitErrors; iChanEstDelay = p.iChanEstDelay; iNumTaps = p.iNumTaps; iPathDelay = p.iPathDelay; rGainCorr = p.rGainCorr; iOffUsfExtr = p.iOffUsfExtr; ReceiveStatus = p.ReceiveStatus; FrontEndParameters = p.FrontEndParameters; AltFreqSign = p.AltFreqSign; rMER = p.rMER; rWMERMSC = p.rWMERMSC; rWMERFAC = p.rWMERFAC; rSigmaEstimate = p.rSigmaEstimate; rMinDelay = p.rMinDelay; rMaxDelay = p.rMaxDelay; bMeasureDelay = p.bMeasureDelay; vecrRdel = p.vecrRdel; vecrRdelThresholds = p.vecrRdelThresholds; vecrRdelIntervals = p.vecrRdelIntervals; bMeasureDoppler = p.bMeasureDoppler; rRdop = p.rRdop; bMeasureInterference = p.bMeasureInterference; rIntFreq = p.rIntFreq; rINR = p.rINR; rICR = p.rICR; rMaxPSDwrtSig = p.rMaxPSDwrtSig; rMaxPSDFreq = p.rMaxPSDFreq; rSigStrengthCorrection = p.rSigStrengthCorrection; bRunThread = p.bRunThread; bUsingMultimedia = p.bUsingMultimedia; CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); // don't copy CMatrix // GPSData = p.GPSData; rSysSimSNRdB = p.rSysSimSNRdB; iFrequency = p.iFrequency; bValidSignalStrength = p.bValidSignalStrength; rSigStr = p.rSigStr; rIFSigStr = p.rIFSigStr; iCurSelAudioService = p.iCurSelAudioService; iCurSelDataService = p.iCurSelDataService; eRobustnessMode = p.eRobustnessMode; eSpectOccup = p.eSpectOccup; LastAudioService = p.LastAudioService; LastDataService = p.LastDataService; return *this; } void CParameter::ResetServicesStreams() { int i; if(GetReceiverMode() == RM_DRM) { /* Store informations about last services selected * this for select current service automatically after a resync */ if (iCurSelAudioService > 0) LastAudioService.Save(iCurSelAudioService, Service[iCurSelAudioService].iServiceID); if (iCurSelDataService > 0) LastDataService.Save(iCurSelDataService, Service[iCurSelDataService].iServiceID); /* Reset everything to possible start values */ for (i = 0; i < MAX_NUM_SERVICES; i++) { Service[i].AudioParam.strTextMessage = ""; Service[i].AudioParam.iStreamID = STREAM_ID_NOT_USED; Service[i].AudioParam.eAudioCoding = CAudioParam::AC_AAC; Service[i].AudioParam.eSBRFlag = CAudioParam::SB_NOT_USED; Service[i].AudioParam.eAudioSamplRate = CAudioParam::AS_24KHZ; Service[i].AudioParam.bTextflag = false; Service[i].AudioParam.bEnhanceFlag = false; Service[i].AudioParam.eAudioMode = CAudioParam::AM_MONO; Service[i].AudioParam.iCELPIndex = 0; Service[i].AudioParam.bCELPCRC = false; Service[i].AudioParam.eHVXCRate = CAudioParam::HR_2_KBIT; Service[i].AudioParam.bHVXCCRC = false; Service[i].DataParam.iStreamID = STREAM_ID_NOT_USED; Service[i].DataParam.ePacketModInd = CDataParam::PM_PACKET_MODE; Service[i].DataParam.eDataUnitInd = CDataParam::DU_SINGLE_PACKETS; Service[i].DataParam.iPacketID = 0; Service[i].DataParam.iPacketLen = 0; Service[i].DataParam.eAppDomain = CDataParam::AD_DRM_SPEC_APP; Service[i].DataParam.iUserAppIdent = 0; Service[i].iServiceID = SERV_ID_NOT_USED; Service[i].eCAIndication = CService::CA_NOT_USED; Service[i].iLanguage = 0; Service[i].strCountryCode = ""; Service[i].strLanguageCode = ""; Service[i].eAudDataFlag = CService::SF_AUDIO; Service[i].iServiceDescr = 0; Service[i].strLabel = ""; } for (i = 0; i < MAX_NUM_STREAMS; i++) { Stream[i].iLenPartA = 0; Stream[i].iLenPartB = 0; } } else { // Set up encoded AM audio parameters Service[0].AudioParam.strTextMessage = ""; Service[0].AudioParam.iStreamID = 0; Service[0].AudioParam.eAudioCoding = CAudioParam::AC_AAC; Service[0].AudioParam.eSBRFlag = CAudioParam::SB_NOT_USED; Service[0].AudioParam.eAudioSamplRate = CAudioParam::AS_24KHZ; Service[0].AudioParam.bTextflag = false; Service[0].AudioParam.bEnhanceFlag = false; Service[0].AudioParam.eAudioMode = CAudioParam::AM_MONO; Service[0].AudioParam.iCELPIndex = 0; Service[0].AudioParam.bCELPCRC = false; Service[0].AudioParam.eHVXCRate = CAudioParam::HR_2_KBIT; Service[0].AudioParam.bHVXCCRC = false; Service[0].iServiceID = SERV_ID_NOT_USED; Service[0].eCAIndication = CService::CA_NOT_USED; Service[0].iLanguage = 0; Service[0].strCountryCode = ""; Service[0].strLanguageCode = ""; Service[0].eAudDataFlag = CService::SF_AUDIO; Service[0].iServiceDescr = 0; Service[0].strLabel = ""; Stream[0].iLenPartA = 0; Stream[0].iLenPartB = 1044; } /* Reset alternative frequencies */ AltFreqSign.Reset(); /* Date, time */ iDay = 0; iMonth = 0; iYear = 0; iUTCHour = 0; iUTCMin = 0; } void CParameter::GetActiveServices(set& actServ) { /* Init return vector */ actServ.clear(); /* Get active services */ for (int i = 0; i < MAX_NUM_SERVICES; i++) { if (Service[i].IsActive()) /* A service is active, add ID to set */ actServ.insert(i); } } /* using a set ensures each stream appears only once */ void CParameter::GetActiveStreams(set& actStr) { actStr.clear(); /* Determine which streams are active */ for (int i = 0; i < MAX_NUM_SERVICES; i++) { if (Service[i].IsActive()) { /* Audio stream */ if (Service[i].AudioParam.iStreamID != STREAM_ID_NOT_USED) actStr.insert(Service[i].AudioParam.iStreamID); /* Data stream */ if (Service[i].DataParam.iStreamID != STREAM_ID_NOT_USED) actStr.insert(Service[i].DataParam.iStreamID); } } } _REAL CParameter::GetBitRateKbps(const int iShortID, const _BOOLEAN bAudData) { /* Init lengths to zero in case the stream is not yet assigned */ int iLen = 0; /* First, check if audio or data service and get lengths */ if (Service[iShortID].eAudDataFlag == CService::SF_AUDIO) { /* Check if we want to get the data stream connected to an audio stream */ if (bAudData == true) { iLen = GetStreamLen( Service[iShortID].DataParam.iStreamID); } else { iLen = GetStreamLen( Service[iShortID].AudioParam.iStreamID); } } else { iLen = GetStreamLen( Service[iShortID].DataParam.iStreamID); } /* We have 3 frames with time duration of 1.2 seconds. Bit rate should be returned in kbps (/ 1000) */ return (_REAL) iLen * SIZEOF__BYTE * 3 / (_REAL) 1.2 / 1000; } _REAL CParameter::PartABLenRatio(const int iShortID) { int iLenA = 0; int iLenB = 0; /* Get the length of protection part A and B */ if (Service[iShortID].eAudDataFlag == CService::SF_AUDIO) { /* Audio service */ if (Service[iShortID].AudioParam.iStreamID != STREAM_ID_NOT_USED) { iLenA = Stream[Service[iShortID].AudioParam.iStreamID].iLenPartA; iLenB = Stream[Service[iShortID].AudioParam.iStreamID].iLenPartB; } } else { /* Data service */ if (Service[iShortID].DataParam.iStreamID != STREAM_ID_NOT_USED) { iLenA = Stream[Service[iShortID].DataParam.iStreamID].iLenPartA; iLenB = Stream[Service[iShortID].DataParam.iStreamID].iLenPartB; } } const int iTotLen = iLenA + iLenB; if (iTotLen != 0) return (_REAL) iLenA / iTotLen; else return (_REAL) 0.0; } void CParameter::InitCellMapTable(const ERobMode eNewWaveMode, const ESpecOcc eNewSpecOcc) { /* Set new values and make table */ eRobustnessMode = eNewWaveMode; eSpectOccup = eNewSpecOcc; CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); } _BOOLEAN CParameter::SetWaveMode(const ERobMode eNewWaveMode) { /* First check if spectrum occupancy and robustness mode pair is defined */ if (( (eNewWaveMode == RM_ROBUSTNESS_MODE_E) || (eNewWaveMode == RM_ROBUSTNESS_MODE_D) ) && !( (eSpectOccup == SO_3) || (eSpectOccup == SO_5) )) { /* Set spectrum occupance to a valid parameter */ eSpectOccup = SO_3; } /* Apply changes only if new paramter differs from old one */ if (eRobustnessMode != eNewWaveMode) { /* Set new value */ eRobustnessMode = eNewWaveMode; /* This parameter change provokes update of table */ CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForWaveMode(); /* Signal that parameter has changed */ return true; } else return false; } void CParameter::SetSpectrumOccup(ESpecOcc eNewSpecOcc) { /* First check if spectrum occupancy and robustness mode pair is defined */ if (( (eRobustnessMode == RM_ROBUSTNESS_MODE_E) || (eRobustnessMode == RM_ROBUSTNESS_MODE_D) ) && !( (eNewSpecOcc == SO_3) || (eNewSpecOcc == SO_5) )) { /* Set spectrum occupance to a valid parameter */ eNewSpecOcc = SO_3; } /* Apply changes only if new paramter differs from old one */ if (eSpectOccup != eNewSpecOcc) { /* Set new value */ eSpectOccup = eNewSpecOcc; /* This parameter change provokes update of table */ CellMappingTable.MakeTable(eRobustnessMode, eSpectOccup); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForSpectrumOccup(); } } void CParameter::SetStreamLen(const int iStreamID, const int iNewLenPartA, const int iNewLenPartB) { /* Apply changes only if parameters have changed */ if ((Stream[iStreamID].iLenPartA != iNewLenPartA) || (Stream[iStreamID].iLenPartB != iNewLenPartB)) { /* Use new parameters */ Stream[iStreamID].iLenPartA = iNewLenPartA; Stream[iStreamID].iLenPartB = iNewLenPartB; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSC(); } } int CParameter::GetStreamLen(const int iStreamID) { if(iStreamID != STREAM_ID_NOT_USED) return Stream[iStreamID].iLenPartA + Stream[iStreamID].iLenPartB; else return 0; } void CParameter::SetNumDecodedBitsMSC(const int iNewNumDecodedBitsMSC) { /* Apply changes only if parameters have changed */ if (iNewNumDecodedBitsMSC != iNumDecodedBitsMSC) { iNumDecodedBitsMSC = iNewNumDecodedBitsMSC; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSCDemux(); } } void CParameter::SetNumDecodedBitsSDC(const int iNewNumDecodedBitsSDC) { /* Apply changes only if parameters have changed */ if (iNewNumDecodedBitsSDC != iNumSDCBitsPerSFrame) { iNumSDCBitsPerSFrame = iNewNumDecodedBitsSDC; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForNoDecBitsSDC(); } } void CParameter::SetNumBitsHieraFrTot(const int iNewNumBitsHieraFrTot) { /* Apply changes only if parameters have changed */ if (iNewNumBitsHieraFrTot != iNumBitsHierarchFrameTotal) { iNumBitsHierarchFrameTotal = iNewNumBitsHieraFrTot; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSCDemux(); } } void CParameter::SetNumAudioDecoderBits(const int iNewNumAudioDecoderBits) { /* Apply changes only if parameters have changed */ if (iNewNumAudioDecoderBits != iNumAudioDecoderBits) { iNumAudioDecoderBits = iNewNumAudioDecoderBits; } } void CParameter::SetNumDataDecoderBits(const int iNewNumDataDecoderBits) { /* Apply changes only if parameters have changed */ if (iNewNumDataDecoderBits != iNumDataDecoderBits) { iNumDataDecoderBits = iNewNumDataDecoderBits; } } void CParameter::SetMSCProtLev(const CMSCProtLev NewMSCPrLe, const _BOOLEAN bWithHierarch) { // _BOOLEAN bParamersHaveChanged = false; if ((NewMSCPrLe.iPartA != MSCPrLe.iPartA) || (NewMSCPrLe.iPartB != MSCPrLe.iPartB)) { MSCPrLe.iPartA = NewMSCPrLe.iPartA; MSCPrLe.iPartB = NewMSCPrLe.iPartB; // bParamersHaveChanged = true; } /* Apply changes only if parameters have changed */ if (bWithHierarch == true) { if (NewMSCPrLe.iHierarch != MSCPrLe.iHierarch) { MSCPrLe.iHierarch = NewMSCPrLe.iHierarch; // bParamersHaveChanged = true; } } /* In case parameters have changed, set init flags */ // if (bParamersHaveChanged == true) // if(pDRMRec) pDRMRec->InitsForMSC(); } void CParameter::SetServiceParameters(int iShortID, const CService& newService) { Service[iShortID] = newService; } void CParameter::SetAudioParam(const int iShortID, const CAudioParam& NewAudParam) { /* Apply changes only if parameters have changed */ if (Service[iShortID].AudioParam != NewAudParam) { Service[iShortID].AudioParam = NewAudParam; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForAudParam(); } } CAudioParam CParameter::GetAudioParam(const int iShortID) { return Service[iShortID].AudioParam; } void CParameter::SetDataParam(const int iShortID, const CDataParam& NewDataParam) { CDataParam& DataParam = Service[iShortID].DataParam; /* Apply changes only if parameters have changed */ if (DataParam != NewDataParam) { DataParam = NewDataParam; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForDataParam(); } } CDataParam CParameter::GetDataParam(const int iShortID) { return Service[iShortID].DataParam; } void CParameter::SetInterleaverDepth(const ESymIntMod eNewDepth) { if (eSymbolInterlMode != eNewDepth) { eSymbolInterlMode = eNewDepth; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForInterlDepth(); } } void CParameter::SetMSCCodingScheme(const ECodScheme eNewScheme) { if (eMSCCodingScheme != eNewScheme) { eMSCCodingScheme = eNewScheme; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSCCodSche(); } } void CParameter::SetSDCCodingScheme(const ECodScheme eNewScheme) { if (eSDCCodingScheme != eNewScheme) { eSDCCodingScheme = eNewScheme; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForSDCCodSche(); } } void CParameter::SetCurSelAudioService(const int iNewService) { /* Change the current selected audio service ID only if the new ID does contain an audio service. If not, keep the old ID. In that case it is possible to select a "data-only" service and still listen to the audio of the last selected service */ if ((iCurSelAudioService != iNewService) && (Service[iNewService].AudioParam.iStreamID != STREAM_ID_NOT_USED)) { iCurSelAudioService = iNewService; LastAudioService.Reset(); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForAudParam(); } } void CParameter::SetCurSelDataService(const int iNewService) { /* Change the current selected data service ID only if the new ID does contain a data service. If not, keep the old ID. In that case it is possible to select a "data-only" service and click back to an audio service to be able to decode data service and listen to audio at the same time */ if ((iCurSelDataService != iNewService) && (Service[iNewService].DataParam.iStreamID != STREAM_ID_NOT_USED)) { iCurSelDataService = iNewService; LastDataService.Reset(); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForDataParam(); } } void CParameter::EnableMultimedia(const _BOOLEAN bFlag) { if (bUsingMultimedia != bFlag) { bUsingMultimedia = bFlag; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSCDemux(); } } void CParameter::SetNumOfServices(const size_t iNNumAuSe, const size_t iNNumDaSe) { /* Check whether number of activated services is not greater than the number of services signalled by the FAC because it can happen that a false CRC check (it is only a 8 bit CRC) of the FAC block initializes a wrong service */ set actServ; GetActiveServices(actServ); if (actServ.size() > iNNumAuSe + iNNumDaSe) { /* Reset services and streams and set flag for init modules */ ResetServicesStreams(); // if(pDRMRec) pDRMRec->InitsForMSCDemux(); } if ((iNumAudioService != iNNumAuSe) || (iNumDataService != iNNumDaSe)) { iNumAudioService = iNNumAuSe; iNumDataService = iNNumDaSe; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSCDemux(); } } void CParameter::SetAudDataFlag(const int iShortID, const CService::ETyOServ iNewADaFl) { if (Service[iShortID].eAudDataFlag != iNewADaFl) { Service[iShortID].eAudDataFlag = iNewADaFl; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSC(); } } void CParameter::SetServiceID(const int iShortID, const uint32_t iNewServiceID) { if (Service[iShortID].iServiceID != iNewServiceID) { /* JFBC - what is this for? */ if ((iShortID == 0) && (Service[0].iServiceID > 0)) ResetServicesStreams(); Service[iShortID].iServiceID = iNewServiceID; /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForMSC(); /* If the receiver has lost the sync automatically restore last current service selected */ if ((iShortID > 0) && (iNewServiceID > 0)) { if(LastAudioService.iServiceID == iNewServiceID) { /* Restore last audio service selected */ iCurSelAudioService = LastAudioService.iService; LastAudioService.Reset(); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForAudParam(); } if (LastDataService.iServiceID == iNewServiceID) { /* Restore last data service selected */ iCurSelDataService = LastDataService.iService; LastDataService.Reset(); /* Set init flags */ // if(pDRMRec) pDRMRec->InitsForDataParam(); } } } } /* Implementaions for simulation -------------------------------------------- */ void CRawSimData::Add(uint32_t iNewSRS) { /* Attention, function does not take care of overruns, data will be lost if added to a filled shift register! */ if (iCurWritePos < ciMaxDelBlocks) veciShRegSt[iCurWritePos++] = iNewSRS; } uint32_t CRawSimData::Get() { /* We always use the first value of the array for reading and do a shift of the other data by adding a arbitrary value (0) at the end of the whole shift register */ uint32_t iRet = veciShRegSt[0]; veciShRegSt.AddEnd(0); iCurWritePos--; return iRet; } _REAL CParameter::GetSysSNRdBPilPos() const { /* Get system SNR in dB for the pilot positions. Since the average power of the pilots is higher than the data cells, the SNR is also higher at these positions compared to the total SNR of the DRM signal. */ return (_REAL) 10.0 * log10(pow((_REAL) 10.0, rSysSimSNRdB / 10) / CellMappingTable.rAvPowPerSymbol * CellMappingTable.rAvScatPilPow * (_REAL) CellMappingTable.iNumCarrier); } void CParameter::SetSNR(const _REAL iNewSNR) { SNRstat.addSample(iNewSNR); } _REAL CParameter::GetSNR() { return SNRstat.getCurrent(); } _REAL CParameter::GetNominalSNRdB() { /* Convert SNR from system bandwidth to nominal bandwidth */ return (_REAL) 10.0 * log10(pow((_REAL) 10.0, rSysSimSNRdB / 10) * GetSysToNomBWCorrFact()); } void CParameter::SetNominalSNRdB(const _REAL rSNRdBNominal) { /* Convert SNR from nominal bandwidth to system bandwidth */ rSysSimSNRdB = (_REAL) 10.0 * log10(pow((_REAL) 10.0, rSNRdBNominal / 10) / GetSysToNomBWCorrFact()); } _REAL CParameter::GetNominalBandwidth() { _REAL rNomBW; /* Nominal bandwidth as defined in the DRM standard */ switch (eSpectOccup) { case SO_0: rNomBW = (_REAL) 4500.0; /* Hz */ break; case SO_1: rNomBW = (_REAL) 5000.0; /* Hz */ break; case SO_2: rNomBW = (_REAL) 9000.0; /* Hz */ break; case SO_3: rNomBW = (_REAL) 10000.0; /* Hz */ break; case SO_4: rNomBW = (_REAL) 18000.0; /* Hz */ break; case SO_5: rNomBW = (_REAL) 20000.0; /* Hz */ break; default: rNomBW = (_REAL) 10000.0; /* Hz */ break; } return rNomBW; } _REAL CParameter::GetSysToNomBWCorrFact() { _REAL rNomBW = GetNominalBandwidth(); /* Calculate system bandwidth (N / T_u) */ const _REAL rSysBW = (_REAL) CellMappingTable.iNumCarrier / CellMappingTable.iFFTSizeN * SOUNDCRD_SAMPLE_RATE; return rSysBW / rNomBW; } void CParameter::SetIFSignalLevel(_REAL rNewSigStr) { rIFSigStr = rNewSigStr; } _REAL CParameter::GetIFSignalLevel() { return rIFSigStr; } void CRxStatus::SetStatus(const ETypeRxStatus OK) { status = OK; iNum++; if(OK==RX_OK) iNumOK++; } //void CParameter::GenerateReceiverID() //{ // //Set receiver ID // string sVer; // unsigned int iImplementation = 0;; // unsigned int iMajor = 0; // unsigned int iMinor = 0; // sReceiverID = "drea"; // sVer = dream_version; // size_t pos; // while((pos = sVer.find('.')) != string::npos) // sVer.replace(pos, 1, " "); // if ((pos = sVer.find("cvs")) != string::npos) // sVer.replace(pos, 3, " "); // stringstream ssVer(sVer); // ssVer >> iImplementation >> iMajor >> iMinor; // stringstream ssInfoVer; // ssInfoVer << setw(2) << setfill('0') << iImplementation << setw(2) << setfill('0') << iMajor << setw(2) << setfill('0') << iMinor; // sReceiverID += ssInfoVer.str(); // while (sSerialNumber.length() < 6) // sSerialNumber += "_"; // if (sSerialNumber.length() > 6) // sSerialNumber.erase(6, pDRMRec->GetParameters()->sSerialNumber.length()-6); // sReceiverID += pDRMRec->GetParameters()->sSerialNumber; //} void CParameter::GenerateRandomSerialNumber() { //seed random number generator srand((unsigned int)time(0)); char randomChars[36]; for (size_t q=0; q < 36; q++) { if (q < 26) randomChars[q] = char(q)+97; else randomChars[q] = (char(q)-26)+48; } char serialNumTemp[7]; for (size_t i=0; i < 6; i++) serialNumTemp[i] = randomChars[(int) 35.0*rand()/RAND_MAX]; serialNumTemp[6] = '\0'; sSerialNumber = serialNumTemp; } CMinMaxMean::CMinMaxMean():rSum(0.0),rCur(0.0), rMin(numeric_limits<_REAL>::max()),rMax(numeric_limits<_REAL>::min()),iNum(0) { } void CMinMaxMean::addSample(_REAL r) { rCur = r; rSum += r; iNum++; if(r>rMax) rMax = r; if(r0) rMean = rSum / iNum; rSum = 0.0; iNum = 0; return rMean; } void CMinMaxMean::getMinMax(_REAL& rMinOut, _REAL& rMaxOut) { if(rMin <= rMax) { rMinOut = rMin; rMaxOut = rMax; } else { rMinOut = 0.0; rMaxOut = 0.0; } rMin = numeric_limits<_REAL>::max(); rMax = numeric_limits<_REAL>::min(); } string CServiceDefinition::Frequency(size_t n) const { if(n>=veciFrequencies.size()) return ""; // not in the list stringstream ss; int iFrequency = veciFrequencies[n]; switch (iSystemID) { case 0: case 1: case 2: /* AM or DRM */ ss << iFrequency; break; case 3: case 4: case 5: /* 'FM1 frequency' - 87.5 to 107.9 MHz (100 kHz steps) */ ss << 87.5 + 0.1 * float(iFrequency); break; case 6: case 7: case 8: /* 'FM2 frequency'- 76.0 to 90.0 MHz (100 kHz steps) */ ss << 76.0 + 0.1 * float(iFrequency); break; case 9: case 10: case 11: if(iFrequency<=11) { int chan = iFrequency / 4; char subchan = 'A' + iFrequency % 4; ss << "Band I channel " << (chan+2) << subchan; } else if(64<= iFrequency && iFrequency <=95) { int chan = iFrequency / 4; char subchan = 'A' + iFrequency % 4; ss << "Band III channel " << (chan-11) << subchan; } else if(96<= iFrequency && iFrequency <=101) { int chan = iFrequency / 6; char subchan = 'A' + iFrequency % 6; ss << "Band III+ channel " << (chan-3) << subchan; } else if(128<= iFrequency && iFrequency <=143) { char chan = iFrequency - 128; double m = 1452.96+1.712*double(chan); ss << "European L-Band channel L" << ('A'+chan) << ", " << m << " MHz"; } else if(160<= iFrequency && iFrequency <=182) { int chan = iFrequency - 159; double m = 1451.072+1.744*double(chan); ss << "Canadian L-Band channel " << chan << ", " << m << " MHz"; } else { ss << "unknown channel " << iFrequency; } break; default: break; } return ss.str(); } string CServiceDefinition::FrequencyUnits() const { switch (iSystemID) { case 0: case 1: case 2: return "kHz"; break; case 3: case 4: case 5: case 6: case 7: case 8: return "MHz"; break; default: return ""; break; } } string CServiceDefinition::System() const { switch (iSystemID) { case 0: return "DRM"; break; case 1: case 2: return "AM"; break; case 3: case 4: case 5: case 6: case 7: case 8: return "FM"; break; case 9: case 10: case 11: return "DAB"; break; default: return ""; break; } } string COtherService::ServiceID() const { stringstream ss; /* switch (iSystemID) { case 0: case 1: ss << "ID:" << hex << setw(6) << iServiceID; break; case 3: case 6: ss << "ECC+PI:" << hex << setw(6) << iServiceID; break; case 4: case 7: ss << "PI:" << hex << setw(4) << iServiceID; break; case 9: ss << "ECC+aud:" << hex << setw(6) << iServiceID; break; case 10: ss << "AUDIO:" << hex << setw(4) << iServiceID; break; case 11: ss << "DATA:" << hex << setw(8) << iServiceID; break; break; default: break; } */ return ss.str(); } /* See ETSI ES 201 980 v2.1.1 Annex O */ _BOOLEAN CAltFreqSched::IsActive(const time_t ltime) { int iScheduleStart; int iScheduleEnd; int iWeekDay; /* Empty schedule is always active */ if (iDuration == 0) return true; /* Calculate time in UTC */ struct tm *gmtCur = gmtime(<ime); /* Check day tm_wday: day of week (0 - 6; Sunday = 0) I must normalize so Monday = 0 */ if (gmtCur->tm_wday == 0) iWeekDay = 6; else iWeekDay = gmtCur->tm_wday - 1; /* iTimeWeek minutes since last Monday 00:00 in UTC */ /* the value is in the range 0 <= iTimeWeek < 60 * 24 * 7) */ const int iTimeWeek = (iWeekDay * 24 * 60) + (gmtCur->tm_hour * 60) + gmtCur->tm_min; /* Day Code: this field indicates which days the frequency schedule * (the following Start Time and Duration) applies to. * The msb indicates Monday, the lsb Sunday. Between one and seven bits may be set to 1. */ for (int i = 0; i < 7; i++) { /* Check if day is active */ if ((1 << (6 - i)) & iDayCode) { /* Tuesday -> 1 * 24 * 60 = 1440 */ iScheduleStart = (i * 24 * 60) + iStartTime; iScheduleEnd = iScheduleStart + iDuration; /* the normal check (are we inside start and end?) */ if ((iTimeWeek >= iScheduleStart) && (iTimeWeek <= iScheduleEnd)) return true; /* the wrap-around check */ const int iMinutesPerWeek = 7 * 24 * 60; if (iScheduleEnd > iMinutesPerWeek) { /* our duration wraps into next Monday (or even later) */ if (iTimeWeek < (iScheduleEnd - iMinutesPerWeek)) return true; } } } return false; } qsstv_9.2.6/qsstv/drmtx/common/Parameter.h0000664000175000017500000007567613203343610017351 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001-2007 * * Author(s): * Volker Fischer, Andrew Murphy, Andrea Russo * * Adapted for ham sstv use Ties Bos - PA0MBO * * Description: * See Parameter.cpp * * 10/01/2007 Andrew Murphy, BBC Research & Development, 2005 * - Additions to include additional RSCI related fields * * 11/21/2005 Andrew Murphy, BBC Research & Development, 2005 * - Additions to include AMSS demodulation (Added class * CAltFreqOtherServicesSign) * * 11/28/2005 Andrea Russo * - Added classes for store alternative frequencies schedules and regions * ******************************************************************************* * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(PARAMETER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) #define PARAMETER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_ #include "GlobalDefinitions.h" #include "ofdmcellmapping/CellMappingTable.h" #include "matlib/Matlib.h" #include //#include "GPSData.h" //#include "ServiceInformation.h" #include #include #include class CDRMReceiver; /* CS: Coding Scheme */ enum ECodScheme { CS_1_SM, CS_2_SM, CS_3_SM, CS_3_HMSYM, CS_3_HMMIX }; /* CT: Channel Type */ enum EChanType { CT_MSC, CT_SDC, CT_FAC }; enum ETypeIntFreq { FLINEAR, FDFTFILTER, FWIENER }; enum ETypeIntTime { TLINEAR, TWIENER }; enum ETypeSNREst { SNR_FAC, SNR_PIL }; enum ETypeRxStatus { NOT_PRESENT, CRC_ERROR, DATA_ERROR, RX_OK }; /* RM: Receiver mode (analog or digital demodulation) */ enum ERecMode { RM_DRM, RM_AM, RM_NONE }; /* Acquisition state of receiver */ enum EAcqStat {AS_NO_SIGNAL, AS_WITH_SIGNAL}; /* Receiver state */ enum ERecState {RS_TRACKING, RS_ACQUISITION}; /* Classes ********************************************************************/ class CAudioParam { public: /* AC: Audio Coding */ enum EAudCod { AC_AAC, AC_CELP, AC_HVXC }; /* SB: SBR */ enum ESBRFlag { SB_NOT_USED, SB_USED }; /* AM: Audio Mode */ enum EAudMode { AM_MONO, AM_P_STEREO, AM_STEREO }; /* HR: HVXC Rate */ enum EHVXCRate { HR_2_KBIT, HR_4_KBIT }; /* AS: Audio Sampling rate */ enum EAudSamRat { AS_8_KHZ, AS_12KHZ, AS_16KHZ, AS_24KHZ }; CAudioParam(): strTextMessage(), iStreamID(STREAM_ID_NOT_USED), eAudioCoding(AC_AAC), eSBRFlag(SB_NOT_USED), eAudioSamplRate(AS_24KHZ), bTextflag(false), bEnhanceFlag(false), eAudioMode(AM_MONO), iCELPIndex(0), bCELPCRC(false), eHVXCRate(HR_2_KBIT), bHVXCCRC(false) { } CAudioParam(const CAudioParam& ap): strTextMessage(ap.strTextMessage), iStreamID(ap.iStreamID), eAudioCoding(ap.eAudioCoding), eSBRFlag(ap.eSBRFlag), eAudioSamplRate(ap.eAudioSamplRate), bTextflag(ap.bTextflag), bEnhanceFlag(ap.bEnhanceFlag), eAudioMode(ap.eAudioMode), iCELPIndex(ap.iCELPIndex), bCELPCRC(ap.bCELPCRC), eHVXCRate(ap.eHVXCRate), bHVXCCRC(ap.bHVXCCRC) { } CAudioParam& operator=(const CAudioParam& ap) { strTextMessage = ap.strTextMessage; iStreamID = ap.iStreamID; eAudioCoding = ap.eAudioCoding; eSBRFlag = ap.eSBRFlag; eAudioSamplRate = ap.eAudioSamplRate; bTextflag = ap.bTextflag; bEnhanceFlag = ap.bEnhanceFlag; eAudioMode = ap.eAudioMode; iCELPIndex = ap.iCELPIndex; bCELPCRC = ap.bCELPCRC; eHVXCRate = ap.eHVXCRate; bHVXCCRC = ap.bHVXCCRC; return *this; } /* Text-message */ string strTextMessage; /* Max length is (8 * 16 Bytes) */ int iStreamID; /* Stream Id of the stream which carries the audio service */ EAudCod eAudioCoding; /* This field indicated the source coding system */ ESBRFlag eSBRFlag; /* SBR flag */ EAudSamRat eAudioSamplRate; /* Audio sampling rate */ _BOOLEAN bTextflag; /* Indicates whether a text message is present or not */ _BOOLEAN bEnhanceFlag; /* Enhancement flag */ /* For AAC: Mono, LC Stereo, Stereo --------------------------------- */ EAudMode eAudioMode; /* Audio mode */ /* For CELP --------------------------------------------------------- */ int iCELPIndex; /* This field indicates the CELP bit rate index */ _BOOLEAN bCELPCRC; /* This field indicates whether the CRC is used or not */ /* For HVXC --------------------------------------------------------- */ EHVXCRate eHVXCRate; /* This field indicates the rate of the HVXC */ _BOOLEAN bHVXCCRC; /* This field indicates whether the CRC is used or not */ /* This function is needed for detection changes in the class */ _BOOLEAN operator!=(const CAudioParam AudioParam) { if (iStreamID != AudioParam.iStreamID) return true; if (eAudioCoding != AudioParam.eAudioCoding) return true; if (eSBRFlag != AudioParam.eSBRFlag) return true; if (eAudioSamplRate != AudioParam.eAudioSamplRate) return true; if (bTextflag != AudioParam.bTextflag) return true; if (bEnhanceFlag != AudioParam.bEnhanceFlag) return true; switch (AudioParam.eAudioCoding) { case AC_AAC: if (eAudioMode != AudioParam.eAudioMode) return true; break; case AC_CELP: if (bCELPCRC != AudioParam.bCELPCRC) return true; if (iCELPIndex != AudioParam.iCELPIndex) return true; break; case AC_HVXC: if (eHVXCRate != AudioParam.eHVXCRate) return true; if (bHVXCCRC != AudioParam.bHVXCCRC) return true; break; } return false; } }; class CDataParam { public: /* PM: Packet Mode */ enum EPackMod { PM_SYNCHRON_STR_MODE, PM_PACKET_MODE }; /* DU: Data Unit */ enum EDatUnit { DU_SINGLE_PACKETS, DU_DATA_UNITS }; /* AD: Application Domain */ enum EApplDomain { AD_DRM_SPEC_APP, AD_DAB_SPEC_APP, AD_OTHER_SPEC_APP }; int iStreamID; /* Stream Id of the stream which carries the data service */ EPackMod ePacketModInd; /* Packet mode indicator */ /* In case of packet mode ------------------------------------------- */ EDatUnit eDataUnitInd; /* Data unit indicator */ int iPacketID; /* Packet Id (2 bits) */ int iPacketLen; /* Packet length */ // "DAB specified application" not yet implemented!!! EApplDomain eAppDomain; /* Application domain */ int iUserAppIdent; /* User application identifier, only DAB */ CDataParam(): iStreamID(STREAM_ID_NOT_USED), ePacketModInd(PM_PACKET_MODE), eDataUnitInd(DU_DATA_UNITS), iPacketID(0), iPacketLen(0), eAppDomain(AD_DAB_SPEC_APP), iUserAppIdent(2) // was 0 ipc 2 (AT_MOTSLISHOW) pa0mbo Nov 7th 2011 { } CDataParam(const CDataParam& DataParam): iStreamID(DataParam.iStreamID), ePacketModInd(DataParam.ePacketModInd), eDataUnitInd(DataParam.eDataUnitInd), iPacketID(DataParam.iPacketID), iPacketLen(DataParam.iPacketLen), eAppDomain(DataParam.eAppDomain), iUserAppIdent(DataParam.iUserAppIdent) { } CDataParam& operator=(const CDataParam& DataParam) { iStreamID = DataParam.iStreamID; ePacketModInd = DataParam.ePacketModInd; eDataUnitInd = DataParam.eDataUnitInd; iPacketID = DataParam.iPacketID; iPacketLen = DataParam.iPacketLen; eAppDomain = DataParam.eAppDomain; iUserAppIdent = DataParam.iUserAppIdent; return *this; } /* This function is needed for detection changes in the class */ _BOOLEAN operator!=(const CDataParam DataParam) { if (iStreamID != DataParam.iStreamID) return true; if (ePacketModInd != DataParam.ePacketModInd) return true; if (DataParam.ePacketModInd == PM_PACKET_MODE) { if (eDataUnitInd != DataParam.eDataUnitInd) return true; if (iPacketID != DataParam.iPacketID) return true; if (iPacketLen != DataParam.iPacketLen) return true; if (eAppDomain != DataParam.eAppDomain) return true; if (DataParam.eAppDomain == AD_DAB_SPEC_APP) if (iUserAppIdent != DataParam.iUserAppIdent) return true; } return false; } }; class CService { public: /* CA: CA system */ enum ECACond { CA_USED, CA_NOT_USED }; /* SF: Service Flag */ enum ETyOServ { SF_AUDIO, SF_DATA }; CService(): iServiceID(SERV_ID_NOT_USED), eCAIndication(CA_NOT_USED), iLanguage(0), eAudDataFlag(SF_AUDIO), iServiceDescr(0), strCountryCode(), strLanguageCode(), strLabel(), AudioParam(), DataParam() { } CService(const CService& s): iServiceID(s.iServiceID), eCAIndication(s.eCAIndication), iLanguage(s.iLanguage), eAudDataFlag(s.eAudDataFlag), iServiceDescr(s.iServiceDescr), strCountryCode(s.strCountryCode), strLanguageCode(s.strLanguageCode), strLabel(s.strLabel), AudioParam(s.AudioParam), DataParam(s.DataParam) { } CService& operator=(const CService& s) { iServiceID = s.iServiceID; eCAIndication = s.eCAIndication; iLanguage = s.iLanguage; eAudDataFlag = s.eAudDataFlag; iServiceDescr = s.iServiceDescr; strCountryCode = s.strCountryCode; strLanguageCode = s.strLanguageCode; strLabel = s.strLabel; AudioParam = s.AudioParam; DataParam = s.DataParam; return *this; } _BOOLEAN IsActive() const { return iServiceID != SERV_ID_NOT_USED; } uint32_t iServiceID; ECACond eCAIndication; int iLanguage; ETyOServ eAudDataFlag; int iServiceDescr; string strCountryCode; string strLanguageCode; /* Label of the service */ string strLabel; /* Audio parameters */ CAudioParam AudioParam; /* Data parameters */ CDataParam DataParam; }; class CStream { public: CStream():iLenPartA(0), iLenPartB(0) { } CStream(const CStream& s):iLenPartA(s.iLenPartA), iLenPartB(s.iLenPartB) { } CStream& operator=(const CStream& Stream) { iLenPartA=Stream.iLenPartA; iLenPartB=Stream.iLenPartB; return *this; } bool operator==(const CStream Stream) { if (iLenPartA != Stream.iLenPartA) return false; if (iLenPartB != Stream.iLenPartB) return false; return true; } int iLenPartA; /* Data length for part A */ int iLenPartB; /* Data length for part B */ }; class CMSCProtLev { public: CMSCProtLev(){init();} void init() { iPartA=iPartB=iHierarch=0; }; CMSCProtLev(const CMSCProtLev& p):iPartA(p.iPartA),iPartB(p.iPartB),iHierarch(p.iHierarch) {} CMSCProtLev& operator=(const CMSCProtLev& NewMSCProtLev) { iPartA = NewMSCProtLev.iPartA; iPartB = NewMSCProtLev.iPartB; iHierarch = NewMSCProtLev.iHierarch; return *this; } int iPartA; /* MSC protection level for part A */ int iPartB; /* MSC protection level for part B */ int iHierarch; /* MSC protection level for hierachical frame */ }; /* Alternative Frequency Signalling ************************************** */ /* Alternative frequency signalling Schedules informations class */ class CAltFreqSched { public: CAltFreqSched():iDayCode(0),iStartTime(0),iDuration(0) { } CAltFreqSched(const CAltFreqSched& nAFS): iDayCode(nAFS.iDayCode), iStartTime(nAFS.iStartTime), iDuration(nAFS.iDuration) { } CAltFreqSched& operator=(const CAltFreqSched& nAFS) { iDayCode = nAFS.iDayCode; iStartTime = nAFS.iStartTime; iDuration = nAFS.iDuration; return *this; } _BOOLEAN operator==(const CAltFreqSched& nAFS) { if (iDayCode != nAFS.iDayCode) return false; if (iStartTime != nAFS.iStartTime) return false; if (iDuration != nAFS.iDuration) return false; return true; } _BOOLEAN IsActive(const time_t ltime); int iDayCode; int iStartTime; int iDuration; }; /* Alternative frequency signalling Regions informations class */ class CAltFreqRegion { public: CAltFreqRegion():veciCIRAFZones(), iLatitude(0), iLongitude(0), iLatitudeEx(0), iLongitudeEx(0) { } CAltFreqRegion(const CAltFreqRegion& nAFR): veciCIRAFZones(nAFR.veciCIRAFZones), iLatitude(nAFR.iLatitude), iLongitude(nAFR.iLongitude), iLatitudeEx(nAFR.iLatitudeEx), iLongitudeEx(nAFR.iLongitudeEx) { } CAltFreqRegion& operator=(const CAltFreqRegion& nAFR) { iLatitude = nAFR.iLatitude; iLongitude = nAFR.iLongitude; iLatitudeEx = nAFR.iLatitudeEx; iLongitudeEx = nAFR.iLongitudeEx; veciCIRAFZones = nAFR.veciCIRAFZones; return *this; } _BOOLEAN operator==(const CAltFreqRegion& nAFR) { if (iLatitude != nAFR.iLatitude) return false; if (iLongitude != nAFR.iLongitude) return false; if (iLatitudeEx != nAFR.iLatitudeEx) return false; if (iLongitudeEx != nAFR.iLongitudeEx) return false; /* Vector sizes */ if (veciCIRAFZones.size() != nAFR.veciCIRAFZones.size()) return false; /* Vector contents */ for (size_t i = 0; i < veciCIRAFZones.size(); i++) if (veciCIRAFZones[i] != nAFR.veciCIRAFZones[i]) return false; return true; } vector veciCIRAFZones; int iLatitude; int iLongitude; int iLatitudeEx; int iLongitudeEx; }; class CServiceDefinition { public: CServiceDefinition():veciFrequencies(), iRegionID(0), iScheduleID(0),iSystemID(0) { } CServiceDefinition(const CServiceDefinition& nAF): veciFrequencies(nAF.veciFrequencies), iRegionID(nAF.iRegionID), iScheduleID(nAF.iScheduleID), iSystemID(nAF.iSystemID) { } CServiceDefinition& operator=(const CServiceDefinition& nAF) { veciFrequencies = nAF.veciFrequencies; iRegionID = nAF.iRegionID; iScheduleID = nAF.iScheduleID; iSystemID = nAF.iSystemID; return *this; } bool operator==(const CServiceDefinition& sd) const { size_t i; /* Vector sizes */ if (veciFrequencies.size() != sd.veciFrequencies.size()) return false; /* Vector contents */ for (i = 0; i < veciFrequencies.size(); i++) if (veciFrequencies[i] != sd.veciFrequencies[i]) return false; if (iRegionID != sd.iRegionID) return false; if (iScheduleID != sd.iScheduleID) return false; if (iSystemID != sd.iSystemID) return false; return true; } bool operator!=(const CServiceDefinition& sd) const { return !(*this==sd); } string Frequency(size_t) const; string FrequencyUnits() const; string System() const; vector veciFrequencies; int iRegionID; int iScheduleID; int iSystemID; }; class CMultiplexDefinition: public CServiceDefinition { public: CMultiplexDefinition():CServiceDefinition(), veciServRestrict(4), bIsSyncMultplx(false) { } CMultiplexDefinition(const CMultiplexDefinition& nAF):CServiceDefinition(nAF), veciServRestrict(nAF.veciServRestrict), bIsSyncMultplx(nAF.bIsSyncMultplx) { } CMultiplexDefinition& operator=(const CMultiplexDefinition& nAF) { CServiceDefinition(*this) = nAF; veciServRestrict = nAF.veciServRestrict; bIsSyncMultplx = nAF.bIsSyncMultplx; return *this; } bool operator==(const CMultiplexDefinition& md) const { if (CServiceDefinition(*this) != md) return false; /* Vector sizes */ if (veciServRestrict.size() != md.veciServRestrict.size()) return false; /* Vector contents */ for (size_t i = 0; i < veciServRestrict.size(); i++) if (veciServRestrict[i] != md.veciServRestrict[i]) return false; if (bIsSyncMultplx != md.bIsSyncMultplx) return false; return true; } vector veciServRestrict; _BOOLEAN bIsSyncMultplx; }; class COtherService: public CServiceDefinition { public: COtherService(): CServiceDefinition(), bSameService(true), iShortID(0), iServiceID(SERV_ID_NOT_USED) { } COtherService(const COtherService& nAF): CServiceDefinition(nAF), bSameService(nAF.bSameService), iShortID(nAF.iShortID), iServiceID(nAF.iServiceID) { } COtherService& operator=(const COtherService& nAF) { CServiceDefinition(*this) = nAF; bSameService = nAF.bSameService; iShortID = nAF.iShortID; iServiceID = nAF.iServiceID; return *this; } bool operator==(const COtherService& nAF) { if (CServiceDefinition(*this) != nAF) return false; if (bSameService != nAF.bSameService) return false; if (iShortID != nAF.iShortID) return false; if (iServiceID != nAF.iServiceID) return false; return true; } string ServiceID() const; _BOOLEAN bSameService; int iShortID; uint32_t iServiceID; }; /* Alternative frequency signalling class */ class CAltFreqSign { public: CAltFreqSign():vecRegions(16),vecSchedules(16),vecMultiplexes(),vecOtherServices(), bRegionVersionFlag(false),bScheduleVersionFlag(false), bMultiplexVersionFlag(false),bOtherServicesVersionFlag(false) { } CAltFreqSign(const CAltFreqSign& a):vecRegions(a.vecRegions), vecSchedules(a.vecSchedules), vecMultiplexes(a.vecMultiplexes), bRegionVersionFlag(a.bRegionVersionFlag), bScheduleVersionFlag(a.bScheduleVersionFlag), bMultiplexVersionFlag(a.bMultiplexVersionFlag), bOtherServicesVersionFlag(a.bOtherServicesVersionFlag) { } CAltFreqSign& operator=(const CAltFreqSign& a) { vecRegions = a.vecRegions; vecSchedules = a.vecSchedules; vecMultiplexes = a.vecMultiplexes; bRegionVersionFlag = a.bRegionVersionFlag; bScheduleVersionFlag = a.bScheduleVersionFlag; bMultiplexVersionFlag = a.bMultiplexVersionFlag; bOtherServicesVersionFlag = a.bOtherServicesVersionFlag; return *this; } void ResetRegions(_BOOLEAN b) { vecRegions.clear(); vecRegions.resize(16); bRegionVersionFlag=b; } void ResetSchedules(_BOOLEAN b) { vecSchedules.clear(); vecSchedules.resize(16); bScheduleVersionFlag=b; } void ResetMultiplexes(_BOOLEAN b) { vecMultiplexes.clear(); bMultiplexVersionFlag=b; } void ResetOtherServices(_BOOLEAN b) { vecOtherServices.clear(); bOtherServicesVersionFlag=b; } void Reset() { ResetRegions(false); ResetSchedules(false); ResetMultiplexes(false); ResetOtherServices(false); } vector < vector > vecRegions; // outer vector indexed by regionID vector < vector > vecSchedules; // outer vector indexed by scheduleID vector < CMultiplexDefinition > vecMultiplexes; vector < COtherService > vecOtherServices; _BOOLEAN bRegionVersionFlag; _BOOLEAN bScheduleVersionFlag; _BOOLEAN bMultiplexVersionFlag; _BOOLEAN bOtherServicesVersionFlag; }; /* Class to store information about the last service selected ------------- */ class CLastService { public: CLastService():iService(0), iServiceID(SERV_ID_NOT_USED) { } CLastService(const CLastService& l):iService(l.iService), iServiceID(l.iServiceID) { } CLastService& operator=(const CLastService& l) { iService = l.iService; iServiceID = l.iServiceID; return *this; } void Reset() { iService = 0; iServiceID = SERV_ID_NOT_USED; }; void Save(const int iCurSel, const int iCurServiceID) { if (iCurServiceID != SERV_ID_NOT_USED) { iService = iCurSel; iServiceID = iCurServiceID; } }; /* store only fac parameters */ int iService; uint32_t iServiceID; }; /* Classes to keep track of status flags for RSCI rsta tag and log file */ class CRxStatus { public: CRxStatus():status(NOT_PRESENT),iNum(0),iNumOK(0) {} CRxStatus(const CRxStatus& s):status(s.status),iNum(s.iNum),iNumOK(s.iNumOK) {} CRxStatus& operator=(const CRxStatus& s) { status = s.status; iNum = s.iNum; iNumOK = s.iNumOK; return *this;} void SetStatus(const ETypeRxStatus); ETypeRxStatus GetStatus() { return status; } int GetCount() { return iNum; } int GetOKCount() { return iNumOK; } void ResetCounts() { iNum=0; iNumOK = 0; } private: ETypeRxStatus status; int iNum, iNumOK; }; class CReceiveStatus { public: CReceiveStatus():FSync(),TSync(),Interface(), FAC(),SDC(),Audio(),LLAudio(),MOT() { } CReceiveStatus(const CReceiveStatus& s):FSync(s.FSync), TSync(s.TSync), Interface(s.Interface), FAC(s.FAC), SDC(s.SDC), Audio(s.Audio),LLAudio(s.LLAudio),MOT(s.MOT) { } CReceiveStatus& operator=(const CReceiveStatus& s) { FSync = s.FSync; TSync = s.TSync; Interface = s.Interface; FAC = s.FAC; SDC = s.SDC; Audio = s.Audio; LLAudio = s.LLAudio; MOT = s.MOT; return *this; } CRxStatus FSync; CRxStatus TSync; CRxStatus Interface; CRxStatus FAC; CRxStatus SDC; CRxStatus Audio; CRxStatus LLAudio; CRxStatus MOT; }; /* Simulation raw-data management. We have to implement a shift register with varying size. We do that by adding a variable for storing the current write position. */ class CRawSimData { /* We have to implement a shift register with varying size. We do that by adding a variable for storing the current write position. We use always the first value of the array for reading and do a shift of the other data by adding a arbitrary value (0) at the end of the whole shift register */ public: /* Here, the maximal size of the shift register is set */ CRawSimData():ciMaxDelBlocks(50), iCurWritePos(0) { veciShRegSt.Init(ciMaxDelBlocks); } void Add(uint32_t iNewSRS); uint32_t Get(); void Reset() { iCurWritePos = 0; } protected: /* Max number of delayed blocks */ int ciMaxDelBlocks; CShiftRegister < uint32_t > veciShRegSt; int iCurWritePos; }; class CFrontEndParameters { public: enum ESMeterCorrectionType {S_METER_CORRECTION_TYPE_CAL_FACTOR_ONLY, S_METER_CORRECTION_TYPE_AGC_ONLY, S_METER_CORRECTION_TYPE_AGC_RSSI}; // Constructor CFrontEndParameters(): eSMeterCorrectionType(S_METER_CORRECTION_TYPE_CAL_FACTOR_ONLY), rSMeterBandwidth(10000.0), rDefaultMeasurementBandwidth(10000.0), bAutoMeasurementBandwidth(true), rCalFactorAM(0.0), rCalFactorDRM(0.0), rIFCentreFreq(12000.0) {} CFrontEndParameters(const CFrontEndParameters& p): eSMeterCorrectionType(p.eSMeterCorrectionType), rSMeterBandwidth(p.rSMeterBandwidth), rDefaultMeasurementBandwidth(p.rDefaultMeasurementBandwidth), bAutoMeasurementBandwidth(p.bAutoMeasurementBandwidth), rCalFactorAM(p.rCalFactorAM), rCalFactorDRM(p.rCalFactorDRM), rIFCentreFreq(p.rIFCentreFreq) {} CFrontEndParameters& operator=(const CFrontEndParameters& p) { eSMeterCorrectionType = p.eSMeterCorrectionType; rSMeterBandwidth = p.rSMeterBandwidth; rDefaultMeasurementBandwidth = p.rDefaultMeasurementBandwidth; bAutoMeasurementBandwidth = p.bAutoMeasurementBandwidth; rCalFactorAM = p.rCalFactorAM; rCalFactorDRM = p.rCalFactorDRM; rIFCentreFreq = p.rIFCentreFreq; return *this; } ESMeterCorrectionType eSMeterCorrectionType; _REAL rSMeterBandwidth; // The bandwidth the S-meter uses to do the measurement _REAL rDefaultMeasurementBandwidth; // Bandwidth to do measurement if not synchronised _BOOLEAN bAutoMeasurementBandwidth; // true: use the current FAC bandwidth if locked, false: use default bandwidth always _REAL rCalFactorAM; _REAL rCalFactorDRM; _REAL rIFCentreFreq; }; class CMinMaxMean { public: CMinMaxMean(); void addSample(_REAL); _REAL getCurrent(); _REAL getMean(); void getMinMax(_REAL&, _REAL&); protected: _REAL rSum, rCur, rMin, rMax; int iNum; }; class CParameter { public: CParameter(); void init(); CParameter(const CParameter& p); //CParameter(CDRMReceiver *pRx, CParameter *pParameter); // OPH - just copy some of the members virtual ~CParameter(); CParameter& operator=(const CParameter&); /* Enumerations --------------------------------------------------------- */ /* AS: AFS in SDC is valid or not */ enum EAFSVali { AS_VALID, AS_NOT_VALID }; /* SI: Symbol Interleaver */ enum ESymIntMod { SI_LONG, SI_SHORT }; /* ST: Simulation Type */ enum ESimType { ST_NONE, ST_BITERROR, ST_MSECHANEST, ST_BER_IDEALCHAN, ST_SYNC_PARAM, ST_SINR }; /* Misc. Functions ------------------------------------------------------ */ void GenerateRandomSerialNumber(); // void GenerateReceiverID(); void ResetServicesStreams(); void GetActiveServices(set& actServ); void GetActiveStreams(set& actStr); void InitCellMapTable(const ERobMode eNewWaveMode, const ESpecOcc eNewSpecOcc); void SetNumDecodedBitsMSC(const int iNewNumDecodedBitsMSC); void SetNumDecodedBitsSDC(const int iNewNumDecodedBitsSDC); void SetNumBitsHieraFrTot(const int iNewNumBitsHieraFrTot); void SetNumAudioDecoderBits(const int iNewNumAudioDecoderBits); void SetNumDataDecoderBits(const int iNewNumDataDecoderBits); _BOOLEAN SetWaveMode(const ERobMode eNewWaveMode); ERobMode GetWaveMode() const { return eRobustnessMode; } void SetFrequency(int iNewFrequency) { iFrequency = iNewFrequency; } int GetFrequency() { return iFrequency; } void SetServiceParameters(int iShortID, const CService& newService); void SetCurSelAudioService(const int iNewService); int GetCurSelAudioService() const { return iCurSelAudioService; } void SetCurSelDataService(const int iNewService); int GetCurSelDataService() const { return iCurSelDataService; } void ResetCurSelAudDatServ() { iCurSelAudioService = 0; iCurSelDataService = 0; } void EnableMultimedia(const _BOOLEAN bFlag); _BOOLEAN GetEnableMultimedia() const { return bUsingMultimedia; } _REAL GetDCFrequency() const { return SOUNDCRD_SAMPLE_RATE * (rFreqOffsetAcqui + rFreqOffsetTrack); } _REAL GetBitRateKbps(const int iShortID, const _BOOLEAN bAudData); _REAL PartABLenRatio(const int iShortID); /* Parameters controlled by FAC ----------------------------------------- */ void SetInterleaverDepth(const ESymIntMod eNewDepth); ESymIntMod GetInterleaverDepth() { return eSymbolInterlMode; } void SetMSCCodingScheme(const ECodScheme eNewScheme); void SetSDCCodingScheme(const ECodScheme eNewScheme); void SetSpectrumOccup(ESpecOcc eNewSpecOcc); ESpecOcc GetSpectrumOccup() const { return eSpectOccup; } void SetNumOfServices(const size_t iNNumAuSe, const size_t iNNumDaSe); size_t GetTotNumServices() { return iNumAudioService + iNumDataService; } void SetAudDataFlag(const int iShortID, const CService::ETyOServ iNewADaFl); void SetServiceID(const int iShortID, const uint32_t iNewServiceID); // CDRMReceiver* pDRMRec; joma removed rx /* Symbol interleaver mode (long or short interleaving) */ ESymIntMod eSymbolInterlMode; ECodScheme eMSCCodingScheme; /* MSC coding scheme */ ECodScheme eSDCCodingScheme; /* SDC coding scheme */ size_t iNumAudioService; size_t iNumDataService; /* AMSS */ int iAMSSCarrierMode; /* Serial number and received ID */ string sReceiverID; string sSerialNumber; string sDataFilesDirectory; /* Parameters controlled by SDC ----------------------------------------- */ void SetAudioParam(const int iShortID, const CAudioParam& NewAudParam); CAudioParam GetAudioParam(const int iShortID); CDataParam GetDataParam(const int iShortID); void SetDataParam(const int iShortID, const CDataParam& NewDataParam); void SetMSCProtLev(const CMSCProtLev NewMSCPrLe, const _BOOLEAN bWithHierarch); void SetStreamLen(const int iStreamID, const int iNewLenPartA, const int iNewLenPartB); void GetStreamLen(const int iStreamID, int& iLenPartA, int& iLenPartB); int GetStreamLen(const int iStreamID); /* Protection levels for MSC */ CMSCProtLev MSCPrLe; vector Stream; vector Service; /* information about services gathered from SDC, EPG and web schedules */ // map ServiceInformation; /* These values are used to set input and output block sizes of some modules */ int iNumBitsHierarchFrameTotal; int iNumDecodedBitsMSC; int iNumSDCBitsPerSFrame; /* Number of SDC bits per super-frame */ int iNumAudioDecoderBits; /* Number of input bits for audio module */ int iNumDataDecoderBits; /* Number of input bits for data decoder module */ /* Date */ int iYear; int iMonth; int iDay; /* UTC (hours and minutes) */ int iUTCHour; int iUTCMin; /* Identifies the current frame. This parameter is set by FAC */ int iFrameIDTransm; int iFrameIDReceiv; /* Synchronization ------------------------------------------------------ */ _REAL rFreqOffsetAcqui; _REAL rFreqOffsetTrack; _REAL rResampleOffset; int iTimingOffsTrack; ERecMode GetReceiverMode() { return eReceiverMode; } ERecMode eReceiverMode; EAcqStat GetAcquiState() { return eAcquiState; } EAcqStat eAcquiState; int iNumAudioFrames; CVector <_BINARY> vecbiAudioFrameStatus; _BOOLEAN bMeasurePSD; /* vector to hold the PSD valued for the rpsd tag. */ CVector <_REAL> vecrPSD; CMatrix <_COMPLEX> matcReceivedPilotValues; /* Simulation ----------------------------------------------------------- */ CRawSimData RawSimDa; ESimType eSimType; int iDRMChannelNum; int iSpecChDoppler; _REAL rBitErrRate; _REAL rSyncTestParam; /* For any other simulations, used with "ST_SYNC_PARAM" type */ _REAL rSINR; int iNumBitErrors; int iChanEstDelay; int iNumTaps; vector iPathDelay; _REAL rGainCorr; int iOffUsfExtr; void SetSNR(const _REAL); _REAL GetSNR(); void SetNominalSNRdB(const _REAL rSNRdBNominal); _REAL GetNominalSNRdB(); void SetSystemSNRdB(const _REAL rSNRdBSystem) { rSysSimSNRdB = rSNRdBSystem; } _REAL GetSystemSNRdB() const { return rSysSimSNRdB; } _REAL GetSysSNRdBPilPos() const; CReceiveStatus ReceiveStatus; CFrontEndParameters FrontEndParameters; CAltFreqSign AltFreqSign; void Lock() { Mutex.Lock(); } void Unlock() { Mutex.Unlock(); } /* Channel Estimation */ _REAL rMER; _REAL rWMERMSC; _REAL rWMERFAC; _REAL rSigmaEstimate; _REAL rMinDelay; _REAL rMaxDelay; _BOOLEAN bMeasureDelay; CRealVector vecrRdel; CRealVector vecrRdelThresholds; CRealVector vecrRdelIntervals; _BOOLEAN bMeasureDoppler; _REAL rRdop; /* interference (constellation-based measurement rnic)*/ _BOOLEAN bMeasureInterference; _REAL rIntFreq, rINR, rICR; /* peak of PSD - for PSD-based interference measurement rnip */ _REAL rMaxPSDwrtSig; _REAL rMaxPSDFreq; /* the signal level as measured at IF by dream */ void SetIFSignalLevel(_REAL); _REAL GetIFSignalLevel(); _REAL rSigStrengthCorrection; /* General -------------------------------------------------------------- */ _REAL GetNominalBandwidth(); _REAL GetSysToNomBWCorrFact(); _BOOLEAN bRunThread; _BOOLEAN bUsingMultimedia; CCellMappingTable CellMappingTable; // CGPSData GPSData; CMinMaxMean SNRstat, SigStrstat; protected: _REAL rSysSimSNRdB; int iFrequency; _BOOLEAN bValidSignalStrength; _REAL rSigStr; _REAL rIFSigStr; /* Current selected audio service for processing */ int iCurSelAudioService; int iCurSelDataService; ERobMode eRobustnessMode; /* E.g.: Mode A, B, C or D */ ESpecOcc eSpectOccup; /* For resync to last service------------------------------------------- */ CLastService LastAudioService; CLastService LastDataService; CMutex Mutex; }; #endif // !defined(PARAMETER_H__3B0BA660_CA63_4344_BB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/drmtx/common/csoundout.cpp0000664000175000017500000000076713203343610017774 0ustar jomajoma#include "csoundout.h" #include "appglobal.h" #include "dsp/synthes.h" #include "utils/vector.h" CSoundOut::CSoundOut() { } CSoundOut::~CSoundOut() { } //void CSoundOut::Init(int iNewBufferSize, bool bNewBlocking) //{ //} bool CSoundOut::Write(CVector< _SAMPLE >& psData) { // addToLog(QString("csize start %1").arg(psData.Size()/2),LOGSOUND); synthesPtr->writeBuffer((quint32 *)&psData[0],psData.Size()/2); // addToLog(QString("csize end %1").arg(psData.Size()/2),LOGSOUND); return false; } qsstv_9.2.6/qsstv/drmtx/common/csoundout.h0000664000175000017500000000046313203343610017432 0ustar jomajoma#ifndef CSOUNDOUT_H #define CSOUNDOUT_H #include "GlobalDefinitions.h" #include "soundinterface.h" class CSoundOut: public CSoundOutInterface { public: CSoundOut(); ~CSoundOut(); // void Init(int iNewBufferSize, bool bNewBlocking); bool Write(CVector< _SAMPLE >& psData); }; #endif // CSOUNDOUT_H qsstv_9.2.6/qsstv/drmtx/common/soundinterface.h0000664000175000017500000000335713203343610020425 0ustar jomajoma/******************************************************************************\ * British Broadcasting Corporation * Copyright (c) 2007 * * Author(s): * Julian Cable * * Decription: * sound interfaces * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #ifndef _SOUNDINTERFACE_H #define _SOUNDINTERFACE_H #include "appglobal.h" #include "utils/vector.h" //class CSoundInInterface : public CSelectionInterface //{ //public: // virtual ~CSoundInInterface() {} // /* sound card interface - used by ReadData */ // virtual void Init(int iNewBufferSize, _BOOLEAN bNewBlocking = true)=0; // virtual _BOOLEAN Read(CVector& psData)=0; // virtual void Close()=0; //}; class CSoundOutInterface { public: virtual ~CSoundOutInterface() {} /* sound card interface - used by WriteData */ // virtual void Init(int iNewBufferSize, _BOOLEAN bNewBlocking = true)=0; virtual _BOOLEAN Write(CVector& psData)=0; }; #endif qsstv_9.2.6/qsstv/sstv/modes/modeavt.cpp0000664000175000017500000001765413203343610017073 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "modeavt.h" #include "configparams.h" // one number is 1 startbit + 16 databits. #define WORDTIME (5.3108/32.) #define BITTIME (WORDTIME/17) modeAVT::modeAVT(esstvMode m,unsigned int len, bool tx,bool narrowMode):modeBase(m,len,tx,narrowMode) { avtTrailerDetect=true; trailerState=D1900; code=0; duration=0; } modeAVT:: ~modeAVT() { } void modeAVT::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock))/3.; } modeBase::eModeBase modeAVT::process(quint16 *demod,unsigned int syncPos,bool goToSync,unsigned int rxPos) { unsigned int i=0; unsigned char a,b; if(goToSync) { if(syncPos >=length) { addToLog(QString("modebase:process: syncPos: %1 > length %2").arg(syncPos).arg(length),LOGMODES); return MBENDOFIMAGE; } else { for(i=0;i0) count --; else duration=0; } if(count>50) { count=10; trailerState=D1900END; } break; case D1900END: if(fabs(avgSample-1900.) <50.) { if(count<10) count++; } else { debugState=st1900E; if (count >0) count --; } if (count==0) { duration-=5; if((duration<(unsigned int)(0.011*rxClock/SUBSAMPLINGFACTOR)) && (duration>(unsigned int)(0.009*rxClock/SUBSAMPLINGFACTOR))) { bitCounter=0; count=10; trailerState=DELAYHALF; } else { duration=0; trailerState=D1900; } } break; case DELAYHALF: debugState=stHALF; count++; code=0; if(count>=(unsigned int)(round((BITTIME/2)*rxClock/SUBSAMPLINGFACTOR))) trailerState=BITS; break; case BITS: debugState=stBITS+bitCounter; code=code<<1; if(avgSample>1900.) code|=0x0001; bitCounter++; if (bitCounter==16) trailerState=CALCDELAY; else { count=0; trailerState=DELAYFULL; } break; case DELAYFULL: debugState=stFULL; count++; if(count>=(unsigned int)(round(BITTIME*rxClock/SUBSAMPLINGFACTOR))) trailerState=BITS; break; case CALCDELAY: //check if a=code>>8; b=(code&0xFF)^0xFF; addToLog(QString("avtcode =%1 mode=%1,pos=%1").arg(QString::number(code,16)).arg((code&0xE000)>>13).arg((code&0x1F00)>>8),LOGMODES); count=0; duration=0; if(a!=b) { trailerState=D1900; break; } a&=0x1F; delay=(unsigned int)(((31-a)*WORDTIME+BITTIME/2)*rxClock/SUBSAMPLINGFACTOR); trailerState=WAITSTART; break; case WAITSTART: debugState=stWAIT; delay--; if(delay==0) { avtTrailerDetect=false; debugState=stColorLine0; return modeBase::process(demod,i,true,rxPos); } break; } } } else { return modeBase::process(demod,0,false,rxPos); } return MBRUNNING; } modeBase::embState modeAVT::rxSetupLine() { start=lineTimeTableRX[lineCounter]; // addToLog(QString("modeAVT: subLine %1").arg(subLine),LOGMODES); switch(subLine) { case 0: calcPixelPositionTable(REDLINE,false); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 1: calcPixelPositionTable(GREENLINE,false); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 2: calcPixelPositionTable(BLUELINE,false); pixelArrayPtr=blueArrayPtr; return MBPIXELS; break; default: return MBENDOFLINE; } } void modeAVT::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i; int ofx=0; if(tx) ofx=1; debugState=stColorLine0+colorLine; switch (colorLine) { case REDLINE: break; case GREENLINE: start+=(visibleLineLength); break; case BLUELINE: start+=(2.*visibleLineLength); break; } for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(start+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } } modeBase::embState modeAVT::txSetupLine() { switch(subLine) { case 0: calcPixelPositionTable(GREENLINE,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 1: txFreq=1500.; txDur=(unsigned int)rint(blank); return MBTXGAP; case 2: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 3: txFreq=1500.; txDur=(unsigned int)rint(blank); return MBTXGAP; case 4: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 5: txFreq=1500; txDur=(unsigned int)rint(fp); return MBTXGAP; case 6: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; default: return MBENDOFLINE; } } qsstv_9.2.6/qsstv/sstv/modes/modeavt.h0000664000175000017500000000440613203343610016527 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MODEAVT_H #define MODEAVT_H #include "modebase.h" /** @author Johan Maes */ class modeAVT : public modeBase { enum eTrailerState {D1900,D1900END,DELAYHALF,DELAYFULL,BITS,CALCDELAY,WAITSTART}; public: modeAVT(esstvMode m,unsigned int len,bool tx,bool narrowMode); ~modeAVT(); eModeBase process(quint16 *demod, unsigned int syncPos, bool goToSync, unsigned int rxPos); protected: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); embState txSetupLine(); bool avtTrailerDetect; unsigned int duration; unsigned int bitCounter; unsigned int code; unsigned int count; eTrailerState trailerState; DSPFLOAT avgSample; unsigned int delay; }; #endif qsstv_9.2.6/qsstv/sstv/modes/modebase.cpp0000664000175000017500000004425413203343610017207 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "modebase.h" #include "appglobal.h" #include "configparams.h" #include "dispatch/dispatcher.h" #include "dsp/synthes.h" #include "rxwidget.h" #include "txwidget.h" #include const QString stateStr[modeBase::MBTXGAPROBOT+1]= { "ERROR", "SETUPLINE", "PIXELS", "SYNC", "ENDOFLINE", "EOIMAGE", "RXWAIT", "MB1500", "MB2300", "TXGAP", "TXGAPROBOT" }; modeBase::modeBase(esstvMode m, unsigned int len, bool tx, bool narrowMode) { mode=m; narrow=narrowMode; if(narrow) { lowerFreq=2044; syncFreq=1900; } else { lowerFreq=1500; syncFreq=1200; } transmit=tx; length=len; greenArrayPtr=NULL; blueArrayPtr=NULL; redArrayPtr=NULL; yArrayPtr=NULL; pixelArrayPtr=NULL; pixelPositionTable=NULL; debugStatePtr=NULL; addToLog(QString("mb constructor mode=%1").arg((int) m),LOGMODES); if(transmit) { localClock=txClock; activeSSTVParam=&txSSTVParam; } else { localClock=rxClock; activeSSTVParam=&rxSSTVParam; } } modeBase::~modeBase() { deleteBuffers(); } /** \brief delete existing buffers Deletes all buffers, and sets the pointers to NULL; */ void modeBase::deleteBuffers() { if(pixelPositionTable) delete [] pixelPositionTable; if(greenArrayPtr) delete [] greenArrayPtr; if(blueArrayPtr) delete [] blueArrayPtr; if(redArrayPtr) delete [] redArrayPtr; if(yArrayPtr) delete [] yArrayPtr; if(debugStatePtr) delete [] debugStatePtr; greenArrayPtr=blueArrayPtr=redArrayPtr=yArrayPtr=NULL; debugStatePtr=NULL; pixelPositionTable=NULL; } /** \brief initialize the selected mode This function initializes all buffers and mode parameters. The localClock will be set to rxClk if rxClk is not zero in receive mode, else the rxClock of the configuration will be used. The localClock is always equal to the txClock from the configuration while in transmit mode; \param[in] rxClk adjusted receive clock */ void modeBase::init(DSPFLOAT clk) { localClock=clk; lineCounter=0; displayLineCounter=0; subLine=0; sampleCounter=0; setupSSTVLineTimeTable(mode,localClock,transmit); state=MBSETUPLINE; debugState=stHUNT; deleteBuffers(); pixelPositionTable=new unsigned int[activeSSTVParam->numberOfPixels]; greenArrayPtr=new unsigned char[activeSSTVParam->numberOfPixels]; blueArrayPtr=new unsigned char[activeSSTVParam->numberOfPixels]; redArrayPtr=new unsigned char[activeSSTVParam->numberOfPixels]; yArrayPtr=new unsigned char[activeSSTVParam->numberOfPixels]; debugStatePtr=new unsigned int [length]; for(unsigned int i=0;ifpt*localClock; bp=activeSSTVParam->bpt*localClock; blank=activeSSTVParam->blankt*localClock; } else { fp=activeSSTVParam->fp*localClock; bp=activeSSTVParam->bp*localClock; blank=activeSSTVParam->blank*localClock; } syncDuration=activeSSTVParam->sync*localClock; setupParams(localClock); activeSSTVParam->pixelDuration=visibleLineLength/(double)activeSSTVParam->numberOfPixels; avgSample=0; avgSampleCounter=0; isRunning=false; // if(transmit) // { // txWidgetPtr->getImageViewerPtr()->createImage(QSize(activeSSTVParam->numberOfPixels,activeSSTVParam->numberOfDisplayLines),QColor(128,128,128)); // } // else // { // rxWidgetPtr->getImageViewerPtr()->createImage(QSize(activeSSTVParam->numberOfPixels,activeSSTVParam->numberOfDisplayLines),QColor(128,128,128)); // } } void modeBase::redrawFast(bool r) { fastRedraw=r; if (!fastRedraw) { lineDisplayEvent *ce= new lineDisplayEvent(displayLineCounter); QApplication::postEvent( dispatcherPtr, ce ); // Qt will delete it when done } } modeBase::eModeBase modeBase::process(quint16 *demod,unsigned int syncPos,bool goToSync,unsigned int rxPos) { unsigned int i=0; if(goToSync) { if(syncPos >=length) { addToLog(QString("modebase:process: syncPos: %1 > length %2").arg(syncPos).arg(length),LOGMODES); return MBENDOFIMAGE; } else { for(i=0;i=activeSSTVParam->numberOfDisplayLines) { switchState(MBEOIMAGE); } else { subLine=0; switchState(rxSetupLine()); } } pixelCounter=0; subLine++; } sample=demod[i]; debugStatePtr[i]=debugState; switch(state) { case MBPIXELS: if(getPixels()) { switchState(MBSETUPLINE); } break; case MBEOIMAGE: return MBENDOFIMAGE; break; case MBRXWAIT: if(sampleCounter>=marker) { switchState(MBSETUPLINE); } break; case MBSYNC: if(sampleCounter>=syncPosition) { // addToLog(QString("modebase:mbsync =%1").arg(sampleCounter+rxSampleCounter),LOGMODES); switchState(MBSETUPLINE); } break; case MB1500: { // check ODD/EVEN Line for Robot 24/72 if(sampleCounter>=marker) { avgFreqGap/=avgFreqGapCounter; addToLog(QString("GapCounter1 %1 at %2").arg(avgFreqGap).arg(sampleCounter),LOGMODES); if(avgFreqGap > 1900) { qDebug() << "switching to 2300"<< QString("GapCounter2 %1 at %2").arg(avgFreqGap).arg(i+ rxPos); subLine=10; } switchState(MBSETUPLINE); } else { avgFreqGap+=demod[i]; avgFreqGapCounter++; } } break; case MB2300: { // check ODD/EVEN Line for Robot 24/72 if(sampleCounter>=marker) { avgFreqGap/=avgFreqGapCounter; addToLog(QString("GapCounter2 %1 at %2").arg(avgFreqGap).arg(sampleCounter),LOGMODES); if(avgFreqGap < 1900) { qDebug() << "switching to 1500" << QString("GapCounter2 %1 at %2").arg(avgFreqGap).arg(i+ rxPos); subLine=3; } switchState(MBSETUPLINE); } else { avgFreqGap+=demod[i]; avgFreqGapCounter++; } } break; default: addToLog(QString("unknown state in modeBase: %1 receive").arg((int)state),LOGMODES); break; } sampleCounter++; } return MBRUNNING; } /** \brief transfer pixels to pixelArrayPtr This function checks the sampleCounter and stores the pixel in the pixelArray \return true if end of line (all pixels stored) */ bool modeBase::getPixels() { int color; double dev=activeSSTVParam->deviation*2; double fc=activeSSTVParam->subcarrier; avgSample+=sample; avgSampleCounter++; if(sampleCounter>=pixelPositionTable[pixelCounter]+(activeSSTVParam->pixelDuration/2)) { // addToLog(QString("modebase:getPixels[0] =%1").arg(sampleCounter+rxSampleCounter),LOGMODES); // color=128+lround(((double)avgSample/(double)avgSampleCounter-fc)*255./dev); color=128+lround(((double)sample-fc)*255./dev); if(color<0) color=0; if (color>255) color=255; pixelArrayPtr[pixelCounter]=(unsigned char)color; pixelCounter++; avgSample=0; avgSampleCounter=0; if(pixelCounter>=activeSSTVParam->numberOfPixels) return true; } return false; // indicate, it's not the end of the line } /** \brief transfer data to rxImage (mode depended) This function is the default behaviour. it calls combineColors(). This function must be reimplemented in the derived classes for all other colour modes. */ void modeBase::showLine() { combineColors(); } /** \brief tranfer data to rxImage in RGB mode Combine R, G and B arrays (like in Martin mode) into the rxImage and advances the displayCounter */ void modeBase::combineColors() { unsigned int i; QRgb *pixelArray=rxWidgetPtr->getImageViewerPtr()->getScanLineAddress(displayLineCounter); for(i=0;inumberOfPixels;i++) { pixelArray[i]=qRgb(redArrayPtr[i],greenArrayPtr[i],blueArrayPtr[i]); // pixelArray[i]=qRgb(greenArrayPtr[i],greenArrayPtr[i],greenArrayPtr[i]); // pixelArray[i]=qRgb(255,0,0); } displayLineCounter++; } /** \brief tranfer data to rxImage in grayscale Black and White image transfer. greenArray contains the luminance info. */ void modeBase::grayConversion() { unsigned int i; QRgb *pixelArray=rxWidgetPtr->getImageViewerPtr()->getScanLineAddress(displayLineCounter); for(i=0;inumberOfPixels;i++) { pixelArray[i]=qRgb(greenArrayPtr[i],greenArrayPtr[i],greenArrayPtr[i]); } displayLineCounter++; } /** \brief tranfer data to rxImage in YUV mode Combine Y, U and V arrays (like in PD modes) into the rxImage and advances the displayCounter */ void modeBase::yuvConversion(unsigned char *array) { unsigned int i; int r,g,b; QRgb *pixelArray=rxWidgetPtr->getImageViewerPtr()->getScanLineAddress(displayLineCounter); for (i=0;inumberOfPixels;i++) { r=(100*array[i]+140*redArrayPtr[i]-17850)/100; b=(100*array[i]+178*blueArrayPtr[i]-22695)/100; g=(100*array[i]- 71*redArrayPtr[i]-33*blueArrayPtr[i]+13260)/100; // r=b=g=array[i]; //test r=(r>255 ? 255 : r); r=(r<0 ? 0 : r); b=(b>255 ? 255 : b); b=(b<0 ? 0 : b); g=(g>255 ? 255 : g); g=(g<0 ? 0 : g); pixelArray[i]=qRgb(r,g,b); } displayLineCounter++; } modeBase::eModeBase modeBase::transmitImage(imageViewer *iv) { txImPtr=iv; if(!iv->hasValidImage()) return MBENDOFIMAGE; addToLog(QString("Starting Transmit Image"),LOGMODES); displayLineCounter=0; lineCounter=0; sampleCounter=0; getLine(); state=MBSETUPLINE; start=0; subLine=0; abortRun=false; while(!abortRun) { isRunning=true; if(state==MBSETUPLINE) { switchState(txSetupLine()); subLine++; pixelCounter=0; } switch (state) { case MBPIXELS: { addToLog(QString("MBPIXELS: samplcntr=%1").arg(sampleCounter),LOGMODES); sendPixelBuffer(); switchState(MBSETUPLINE); // check for end of subline } break; case MBTXGAP: { // addToLog(QString("MBTXGAP: samplcntr=%1").arg(sampleCounter),LOGMODES); synthesPtr->sendSamples(txDur,txFreq); //expressed in samples; sampleCounter+=txDur; switchState(MBSETUPLINE); } break; case MBENDOFLINE: { // addToLog(QString("MBENDOFLINE samplcntr=%1 line: %2").arg(sampleCounter).arg(lineCounter),LOGMODES); if(++lineCounter>=activeSSTVParam->numberOfDataLines) state=MBEOIMAGE; else { getLine(); switchState(MBSETUPLINE); subLine=0; } } break; default: // addToLog(QString("default: samplcntr=%1").arg(sampleCounter),LOGMODES); sampleCounter=0; return MBENDOFIMAGE; } } isRunning=false; abortRun=false; addToLog("abortrun detected",LOGMODES); return MBABORTED; } /** \brief abort tx Only used for aborting a transmission */ void modeBase::abort() { abortRun=true; addToLog("modebase: abort received",LOGMODES); } /** \brief send pixels in the pixelArray This function sends one subLine of colour information contained in the pixelArray. */ void modeBase::sendPixelBuffer() { double f; // addToLog (QString(" sendPixelBuffer: pixelBuffer: %1").arg(QString::number((ulong)pixelArrayPtr,16)),LOGMODES); do { f=lowerFreq+((double)pixelArrayPtr[pixelCounter]*(2300-lowerFreq)/255.); while(sampleCounter2300) f=2300; if (fsendSample(f); sampleCounter++; } pixelCounter++; } while(pixelCounternumberOfPixels); // addToLog(QString("modebase: lpw=%1").arg(sampleCounter),LOGMODES); } /** \brief get YUV information Get the YUV information from the image and setup the colour arrays. The displayCounter is incremented by 1 or 2, depending on the mode (e.g. 1 if Robot24 and 2 if Robot36). */ void modeBase::getLineY(bool evenodd) { // we will process 2 lines at a time // QColor c; int tO,tE; int r,yo,ye,b; if ((displayLineCounter&1) && (evenodd)) return; // only even lines accepted // txImPtr->createImage(QSize(activeSSTVParam->numberOfPixels,activeSSTVParam->numberOfDisplayLines),QColor(128,128,128),imageStretch); unsigned int *pixelArrayE=txImPtr->getScanLineAddress(displayLineCounter); if (evenodd) { unsigned int *pixelArrayO=txImPtr->getScanLineAddress(displayLineCounter+1); for (unsigned int i=0;inumberOfPixels;i++) { tE=pixelArrayE[i]; ye=(59*qGreen(tE)+30*qRed(tE)+11*qBlue(tE))/100; tO=pixelArrayO[i]; yo=(59*qGreen(tO)+30*qRed(tO)+11*qBlue(tO))/100; r=(qRed(tO)+qRed(tE))/2; b=(qBlue(tO)+qBlue(tE))/2; r=(10*r-5*(yo+ye)+7*255)/14; b=(100*b-50*(yo+ye)+89*255)/178; redArrayPtr[i]=(r>255 ? 255 : r); redArrayPtr[i]=(r<0 ? 0 : r); blueArrayPtr[i]=(b>255 ? 255 : b); blueArrayPtr[i]=(b<0 ? 0 : b); yArrayPtr[i]=(ye>255 ? 255 : ye); yArrayPtr[i]=(ye<0 ? 0 : ye); greenArrayPtr[i]=(yo>255 ? 255 : yo); greenArrayPtr[i]=(yo<0 ? 0 : yo); } displayLineCounter++; } else { // addToLog(QString("getline=%1").arg(lineCounter),LOGMODES); for (unsigned int i=0;inumberOfPixels;i++) { tE=pixelArrayE[i]; ye=(59*qGreen(tE)+30*qRed(tE)+11*qBlue(tE))/100; r=qRed(tE); b=qBlue(tE); r=(10*r-10*(ye)+7*255)/14; b=(100*b-100*(ye)+89*255)/178; redArrayPtr[i]=(r>255 ? 255 : r<0 ? 0 : r); blueArrayPtr[i]=(b>255 ? 255 : b<0 ? 0 : b); yArrayPtr[i]=(ye>255 ? 255 : ye<0 ? 0 : ye); } } displayLineCounter++; } /** \brief get luminance (B&W) information Get the luminance information from the image and setup the colour array. The displayCounter is incremented */ void modeBase::getLineBW() { unsigned int t; // txImPtr->createImage(QSize(activeSSTVParam->numberOfPixels,activeSSTVParam->numberOfDisplayLines),QColor(128,128,128),imageStretch); unsigned int *pixelArray=txImPtr->getScanLineAddress(displayLineCounter); for (unsigned int i=0;inumberOfPixels;i++) { t=pixelArray[i]; greenArrayPtr[i]=qGray(t); } displayLineCounter++; } /** \brief get RGB information Get the RGB information from the image and setup the colour arrays. The displayCounter is incremented */ void modeBase::getLine() { unsigned int t; // txImPtr->createImage(QSize(activeSSTVParam->numberOfPixels,activeSSTVParam->numberOfDisplayLines),QColor(128,128,128)); // addToLog (QString(" Bufferpointers: green: %1 red %2, blue %3") // .arg(QString::number((ulong)greenArrayPtr,16)) // .arg(QString::number((ulong)redArrayPtr,16)) // .arg(QString::number((ulong)blueArrayPtr,16)),LOGMODES); unsigned int *pixelArray=txImPtr->getScanLineAddress(displayLineCounter); for (unsigned int i=0;inumberOfPixels;i++) { t=pixelArray[i]; greenArrayPtr[i]=qGreen(t); redArrayPtr[i]=qRed(t); blueArrayPtr[i]=qBlue(t); // greenArrayPtr[i]=255; // redArrayPtr[i]=0; // blueArrayPtr[i]=0; } displayLineCounter++; } void modeBase::switchState(embState newState) { // addToLog(QString("%1 to %2").arg(stateStr[state]).arg(stateStr[newState]),LOGMODES); state=newState; } qsstv_9.2.6/qsstv/sstv/modes/modebase.h0000664000175000017500000001377213203343610016655 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MODEBASE_H #define MODEBASE_H #include "../sstvparam.h" #include "widgets/imageviewer.h" #include #define MODESTATESCALER 10 #define stHUNT (0*MODESTATESCALER) #define stColorLine0 (10*MODESTATESCALER) #define stColorLine1 (20*MODESTATESCALER) #define stColorLine2 (30*MODESTATESCALER) #define stColorLine3 (40*MODESTATESCALER) #define stColorLine4 (50*MODESTATESCALER) #define stG1 (60*MODESTATESCALER) #define stG1a (65*MODESTATESCALER) #define stG2 (70*MODESTATESCALER) #define stG2a (75*MODESTATESCALER) #define stSync (80*MODESTATESCALER) #define stWaitVIS (90*MODESTATESCALER) #define stSTART (100*MODESTATESCALER) #define stWaitSync (110*MODESTATESCALER) #define stFP (120*MODESTATESCALER) #define stBP (130*MODESTATESCALER) #define stRepTone (140*MODESTATESCALER) #define st1900B (150*MODESTATESCALER) #define st1900E (160*MODESTATESCALER) #define stWAIT (170*MODESTATESCALER) #define stHALF (180*MODESTATESCALER) #define stFULL (190*MODESTATESCALER) #define stBITS (200*MODESTATESCALER) class imageViewer; class modeBase { public: enum embState {MBERROR,MBSETUPLINE,MBPIXELS,MBSYNC,MBENDOFLINE,MBEOIMAGE,MBRXWAIT,MB1500,MB2300,MBTXGAP,MBTXGAPROBOT}; enum eModeBase {MBRUNNING,MBENDOFIMAGE,MBABORTED}; modeBase(esstvMode m,unsigned int len,bool tx,bool narrowMode); virtual ~modeBase(); /*! \brief initialize mode specific items This function is called by modeInit(), and can overwrite some or all of the local parameters. At least it should set the visible length. \param[in] clock can be the rxClock or the txClock */ virtual void setupParams(double clock)=0; virtual bool getPixels(); virtual unsigned long adjustSyncPosition(unsigned long syncPos0,bool isRetrace) { if(isRetrace) return syncPos0; else return (syncPos0+10); } // virtual unsigned long retraceAdjust(unsigned long syncPos) // { // return syncPos-lineTimeTableRX[1]; // } void redrawFast(bool r); virtual eModeBase process(quint16 *demod, unsigned int syncPos, bool goToSync, unsigned int rxPos); void init(DSPFLOAT clk); unsigned int *debugStatePtr; void abort(); esstvMode getMode() { return mode;} eModeBase transmitImage(imageViewer *iv); void setRxSampleCounter(int sc) { rxSampleCounter=sc;} void saveImage(); int receivedLines() {return displayLineCounter;} int imageLines() {return activeSSTVParam->numberOfDisplayLines;} int imagePixels() {return activeSSTVParam->numberOfPixels;} bool aborted() {return !abortRun;} bool isNarrow() {return narrow;} protected: DSPFLOAT visibleLineLength; esstvMode mode; bool transmit; bool fastRedraw; DSPFLOAT fp; DSPFLOAT bp; DSPFLOAT blank; DSPFLOAT syncDuration; DSPFLOAT localClock; quint16 sample; DSPFLOAT start; sSSTVParam *activeSSTVParam; unsigned int marker; DSPFLOAT markerFloat; unsigned int syncPosition; unsigned int syncEndPosition; unsigned int lineCounter; unsigned int displayLineCounter; unsigned int pixelCounter; unsigned int sampleCounter; embState state; unsigned int subLine; unsigned int length; unsigned char *greenArrayPtr; unsigned char *blueArrayPtr; unsigned char *redArrayPtr; unsigned char *yArrayPtr; unsigned char *pixelArrayPtr; unsigned int *pixelPositionTable; unsigned int debugState; uint avgFreqGap; uint avgFreqGapCounter; DSPFLOAT txFreq; unsigned int txDur; void deleteBuffers(); virtual void showLine(); void combineColors(); void yuvConversion(unsigned char *array); void grayConversion(); /*! \brief setup the rx mode timing for one subline at a time. Each line is subdivided in subLines. A subLine can be a pixel line, a delay or a sync. This function is called from the receive function in the modebase. \param subLine active phase in the reception of a image line */ virtual embState rxSetupLine()=0; /** \brief setup the tx mode timing for one subline at a time. Each line is subdivided in subLines. A subLine can be a pixel line, a delay or a sync. This function is called from transmit function in the modebase. \param subln active phase in the reception of a image line */ virtual embState txSetupLine()=0; virtual void getLine(); void getLineY(bool evenodd); void getLineBW(); int rxSampleCounter; DSPFLOAT syncFreq; DSPFLOAT lowerFreq; private: void switchState(embState newState); void sendPixelBuffer(); bool abortRun; bool isRunning; imageViewer *txImPtr; int avgSample; int avgSampleCounter; bool narrow; }; #endif qsstv_9.2.6/qsstv/sstv/modes/modebw.cpp0000664000175000017500000001050113203343610016671 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "modebw.h" #include "math.h" modeBW::modeBW(esstvMode m,unsigned int len, bool tx,bool narrowMode) : modeBase(m,len,tx,narrowMode) { } modeBW::~modeBW() { } void modeBW::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-syncDuration); } modeBase::embState modeBW::rxSetupLine() { start=lineTimeTableRX[lineCounter]; switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: calcPixelPositionTable(GREENLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine0; pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 2: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 3: debugState=stSync; syncPosition=(unsigned int)round(lineTimeTableRX[lineCounter+1]); return MBSYNC; break; default: return MBENDOFLINE; } } void modeBW::showLine() { grayConversion(); } void modeBW::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i;DSPFLOAT lineStart=start; int ofx=0; if(tx) ofx=1; switch (colorLine) { case GREENLINE: lineStart+=bp; break; } for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } } modeBase::embState modeBW::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 1: calcPixelPositionTable(GREENLINE,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 2: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 3: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 0: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; default: return MBENDOFLINE; } } /** \brief get the pixel information for transmission in B&W */ void modeBW::getLine() { getLineBW(); } qsstv_9.2.6/qsstv/sstv/modes/modebw.h0000664000175000017500000000514513203343610016346 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODEBW_H #define MODEBW_H #include "modebase.h" /** @author Johan Maes */ class modeBW : public modeBase { public: modeBW(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeBW(); protected: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); void showLine(); embState txSetupLine(); void getLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/modegbr.cpp0000664000175000017500000001227713203343610017047 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "modegbr.h" modeGBR::modeGBR(esstvMode m,unsigned int len, bool tx,bool narrowMode):modeBase(m,len,tx,narrowMode) { } modeGBR::~modeGBR() { } void modeGBR::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-2*blank-syncDuration)/3.; } modeBase::embState modeGBR::rxSetupLine() { start=lineTimeTableRX[lineCounter]; //if(subLine==0) addToLog(QString("modeGBR: subLine %1, line=%2, absSampleCounter %3").arg(subLine).arg(lineCounter).arg(start+rxSampleCounter),DBMODES); switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: calcPixelPositionTable(GREENLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine0; pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 2: debugState=stG1; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 3: calcPixelPositionTable(BLUELINE,false); markerFloat+=visibleLineLength; debugState=stColorLine1; pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 4: debugState=stG2; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 5: calcPixelPositionTable(REDLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine2; pixelArrayPtr=redArrayPtr; return MBPIXELS; case 6: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 7: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; break; default: return MBENDOFLINE; } } void modeGBR::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i;DSPFLOAT lineStart=start; int ofx=0; if(tx) ofx=1; switch (colorLine) { case GREENLINE: lineStart+=bp; // addToLog(QString("calcPixelPosition: startGreen %1").arg(start+rxSampleCounter),DBMODES); break; case BLUELINE: lineStart+=(bp+visibleLineLength+blank); // addToLog(QString("calcPixelPosition: startBlue %1").arg(start+rxSampleCounter),DBMODES); break; case REDLINE: lineStart+=(bp+2.*visibleLineLength+2.*blank); // addToLog(QString("calcPixelPosition: startRed %1").arg(start+rxSampleCounter),DBMODES); break; } for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } } modeBase::embState modeGBR::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 0: calcPixelPositionTable(GREENLINE,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 1: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 2: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 3: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 4: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 5: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 6: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 7: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; default: return MBENDOFLINE; } } qsstv_9.2.6/qsstv/sstv/modes/modegbr.h0000664000175000017500000000362413203343610016510 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MODEGBR_H #define MODEGBR_H #include "modebase.h" /** @author Johan Maes */ class modeGBR : public modeBase { public: modeGBR(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeGBR(); protected: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); embState txSetupLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/modegbr2.cpp0000664000175000017500000001513013203343610017120 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "modegbr2.h" // Scottie 1,2 and SDX modeGBR2::modeGBR2(esstvMode m,unsigned int len, bool tx,bool narrowMode):modeBase(m,len,tx,narrowMode) { } modeGBR2::~modeGBR2() { } void modeGBR2::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-2*blank-syncDuration)/3.; } modeBase::embState modeGBR2::rxSetupLine() { // the start of the Scottie mode is always at the start of the green line // if(subLine==0) addToLog(QString("modeGBR2: subLine %1, line=%2").arg(subLine).arg(lineCounter),DBMODES); switch(subLine) { case 0: debugState=stG1; start=lineTimeTableRX[lineCounter]; markerFloat=start+blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: calcPixelPositionTable(GREENLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine0; pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 2: debugState=stG2; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 3: calcPixelPositionTable(BLUELINE,false); markerFloat+=visibleLineLength; debugState=stColorLine1; pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 4: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 5: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; case 6: debugState=stBP; markerFloat+=bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 7: calcPixelPositionTable(REDLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine2; pixelArrayPtr=redArrayPtr; return MBPIXELS; break; default: return MBENDOFLINE; } } void modeGBR2::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i; DSPFLOAT lineStart=start; int ofx=0; if(tx) ofx=1; // debugState=colorLine; switch (colorLine) { case GREENLINE: lineStart+=blank; // addToLog(QString("gbr2: greenstart=%1").arg(start),DBMODES); break; case BLUELINE: lineStart+=(blank+visibleLineLength+blank); syncEndPosition=(unsigned int)(lineStart+fp+syncDuration); // addToLog(QString("gbr2: bluestart=%1").arg(start),DBMODES); break; case REDLINE: lineStart+=2*blank+fp+syncDuration+bp+2.*visibleLineLength; // addToLog(QString("gbr2: redstart=%1").arg(start),DBMODES); break; } for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } } unsigned long modeGBR2::adjustSyncPosition(unsigned long syncPos0,bool isRetrace) { #define SCOTTYCOMPENSATION 15 if(isRetrace) return syncPos0+SCOTTYCOMPENSATION; if(syncPos0<(unsigned long)(fp+2*visibleLineLength+2*blank+syncDuration/2)) { return syncPos0+(unsigned long)(bp+visibleLineLength)+SCOTTYCOMPENSATION; } else { return syncPos0-(unsigned long)(fp+2*visibleLineLength+2*blank+syncDuration)+SCOTTYCOMPENSATION; } } //unsigned long modeGBR2::retraceAdjust(unsigned long syncPos) //{ // return syncPos-(unsigned long)(blank+visibleLineLength+syncDuration); //} modeBase::embState modeGBR2::txSetupLine() { start=lineTimeTableTX[lineCounter]; // if(subLine==0) addToLog(QString("modeGBR2: subLine %1, line=%2").arg(subLine).arg(lineCounter),DBMODES); switch(subLine) { case 0: calcPixelPositionTable(GREENLINE,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 1: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 2: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 3: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 4: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 5: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; case 6: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 7: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; default: return MBENDOFLINE; } } qsstv_9.2.6/qsstv/sstv/modes/modegbr2.h0000664000175000017500000000536713203343610016600 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODEGBR2_H #define MODEGBR2_H #include "modebase.h" /** @author Johan Maes */ class modeGBR2 : public modeBase { public: modeGBR2(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeGBR2(); protected: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); unsigned long adjustSyncPosition(unsigned long syncPos0, bool isRetrace); // unsigned long retraceAdjust(unsigned long syncPos); // int adaptStartPosition(bool vertRetrace); embState txSetupLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/modepd.cpp0000664000175000017500000001457413203343610016702 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "modepd.h" modePD::modePD(esstvMode m,unsigned int len,bool tx,bool narrowMode): modeBase(m,len,tx,narrowMode) { } modePD::~modePD() { } void modePD::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-syncDuration)/4; } modeBase::embState modePD::rxSetupLine() { start=lineTimeTableRX[lineCounter]; switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: debugState=stColorLine0 ; calcPixelPositionTable(YLINEODD,false); markerFloat+=visibleLineLength; pixelArrayPtr=yArrayPtr; return MBPIXELS; case 2: debugState=stColorLine1 ; calcPixelPositionTable(REDLINE,false); markerFloat+=visibleLineLength; pixelArrayPtr=redArrayPtr; return MBPIXELS; case 3: debugState=stColorLine2; calcPixelPositionTable(BLUELINE,false); markerFloat+=visibleLineLength; pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 4: debugState=stColorLine3; calcPixelPositionTable(YLINEEVEN,false); markerFloat+=visibleLineLength; pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 5: debugState=stFP; start=lineTimeTableRX[lineCounter]; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 6: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; default: return MBENDOFLINE; } } void modePD::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i; int ofx=0; if(tx) ofx=1; DSPFLOAT lineStart=start; switch (colorLine) { case YLINEODD: lineStart+=bp; for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; case REDLINE: lineStart+=(bp+visibleLineLength); for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; case BLUELINE: lineStart+=(bp+2*visibleLineLength); for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; case YLINEEVEN: lineStart+=(bp+3*visibleLineLength); for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; } } void modePD::showLine() { yuvConversion(yArrayPtr); yuvConversion(greenArrayPtr); } modeBase::embState modePD::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 0: calcPixelPositionTable(YLINEODD,true); pixelArrayPtr=yArrayPtr; return MBPIXELS; case 1: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 2: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 3: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 4: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 5: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 6: calcPixelPositionTable(YLINEEVEN,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 7: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 8: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 9: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; default: // lineCounter++; return MBENDOFLINE; } } void modePD::getLine() { getLineY(true); } qsstv_9.2.6/qsstv/sstv/modes/modepd.h0000664000175000017500000000513713203343610016342 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODEPD_H #define MODEPD_H #include "modebase.h" /** @author Johan Maes */ class modePD : public modeBase { public: modePD(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modePD(); protected: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); void showLine(); embState txSetupLine(); void getLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/modergb.cpp0000664000175000017500000001442713203343610017046 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "modergb.h" modeRGB::modeRGB(esstvMode m,unsigned int len, bool tx,bool narrowMode):modeBase(m,len,tx,narrowMode) { } #define MODERGBDEBUG modeRGB::~modeRGB() { } void modeRGB::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-2*blank-syncDuration)/3.; } modeBase::embState modeRGB::rxSetupLine() { start=lineTimeTableRX[lineCounter]; switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: debugState=stColorLine0 ; calcPixelPositionTable(REDLINE,false); markerFloat+=visibleLineLength; pixelArrayPtr=redArrayPtr; return MBPIXELS; case 2: debugState=stG1; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 3: debugState=stColorLine1; calcPixelPositionTable(GREENLINE,false); markerFloat+=visibleLineLength; pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 4: debugState=stG2; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 5: debugState=stColorLine2; calcPixelPositionTable(BLUELINE,false); markerFloat+=visibleLineLength; pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 6: debugState=stFP; start=lineTimeTableRX[lineCounter]; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 7: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; default: return MBENDOFLINE; } } void modeRGB::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i;DSPFLOAT lineStart=start; int ofx=0; if(tx) ofx=1; switch (colorLine) { case REDLINE: lineStart+=bp; // addToLog(QString("calcPixelPosition: startGreen %1").arg(start+rxSampleCounter),DBMODES); break; case GREENLINE: lineStart+=(bp+visibleLineLength+blank); // addToLog(QString("calcPixelPosition: startBlue %1").arg(start+rxSampleCounter),DBMODES); break; case BLUELINE: lineStart+=(bp+2.*visibleLineLength+2.*blank); // addToLog(QString("calcPixelPosition: startRed %1").arg(start+rxSampleCounter),DBMODES); break; } for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } } //void modeRGB::calcPixelPositionTable(unsigned int colorLine,bool tx) //{ // unsigned int i; // int ofx=0; // if(tx) ofx=1; // debugState=colorLine; // switch (colorLine) // { // case REDLINE: // start+=bp; // break; // case GREENLINE: // start+=bp+blank+visibleLineLength; // break; // case BLUELINE: // start+=bp+2.*blank+2.*visibleLineLength; // break; // } // for(i=0;inumberOfPixels;i++) // { // pixelPositionTable[i]=(unsigned int)round(start+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); // } //} modeBase::embState modeRGB::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 0: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 1: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 2: calcPixelPositionTable(GREENLINE,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 3: txFreq=lowerFreq; txDur=(unsigned int)rint(blank); return MBTXGAP; case 4: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 5: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 6: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 7: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; default: return MBENDOFLINE; } } qsstv_9.2.6/qsstv/sstv/modes/modergb.h0000664000175000017500000000507613203343610016513 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODERGB_H #define MODERGB_H #include "modebase.h" /** @author Johan Maes */ class modeRGB : public modeBase { public: modeRGB(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeRGB(); private: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); embState txSetupLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/moderobot1.cpp0000664000175000017500000001760713203343610017505 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "moderobot1.h" modeRobot1::modeRobot1(esstvMode m,unsigned int len, bool tx,bool narrowMode):modeBase(m,len,tx,narrowMode) { } modeRobot1::~modeRobot1() { } void modeRobot1::setupParams(double clock) { visibleLineLength=(getLineLength(mode,clock)-fp-bp-blank-syncDuration)/3.; } modeBase::embState modeRobot1::rxSetupLine() { switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: debugState=stColorLine0; calcPixelPositionTable(YLINEODD,false); markerFloat+=2*visibleLineLength; marker=(unsigned int)round(markerFloat); pixelArrayPtr=yArrayPtr; return MBPIXELS; case 2: debugState=stG1; avgFreqGap=0; avgFreqGapCounter=0; markerFloat+=((blank/3)*2); marker=(unsigned int)round(markerFloat); return MB1500; case 3: debugState=stG1a; markerFloat+=(blank/3); marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 4: debugState=stColorLine1; calcPixelPositionTable(REDLINE,false); pixelArrayPtr=redArrayPtr; markerFloat+=visibleLineLength; marker=(unsigned int)round(markerFloat); return MBPIXELS; case 5: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 6: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; case 7: debugState=stBP; markerFloat+=bp; marker=(unsigned int)round(markerFloat); lineCounter++; return MBRXWAIT; case 8: debugState=stColorLine2; calcPixelPositionTable(YLINEEVEN,false); pixelArrayPtr=greenArrayPtr; markerFloat+=2*visibleLineLength; marker=(unsigned int)round(markerFloat); return MBPIXELS; case 9: debugState=stG2; avgFreqGap=0; avgFreqGapCounter=0; markerFloat+=((blank/3)*2); marker=(unsigned int)round(markerFloat); return MB2300; case 10: debugState=stG2a; markerFloat+=(blank/3); marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 11: debugState=stColorLine3; calcPixelPositionTable(BLUELINE,false); pixelArrayPtr=blueArrayPtr; markerFloat+=visibleLineLength; marker=(unsigned int)round(markerFloat); return MBPIXELS; case 12: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 13: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; default: return MBENDOFLINE; } } void modeRobot1::showLine() { yuvConversion(yArrayPtr); yuvConversion(greenArrayPtr); } //unsigned long modeRobot1::adjustSyncPosition(unsigned long syncPos0) // { // if(syncPos0numberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(markerFloat+(((float)(i+ofx)*visibleLineLength*2)/activeSSTVParam->numberOfPixels)); } break; case REDLINE: case BLUELINE: for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(markerFloat+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; } } /** \todo resync odd/even line via frequency detection */ modeBase::embState modeRobot1::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 0: markerFloat=start+bp; calcPixelPositionTable(YLINEODD,true); pixelArrayPtr=yArrayPtr; return MBPIXELS; case 1: txFreq=lowerFreq; txDur=(unsigned int)rint((2*blank)/3); return MBTXGAP; case 2: txFreq=1900.; txDur=(unsigned int)rint(blank/3); return MBTXGAP; case 3: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 4: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 5: txFreq=syncFreq; lineCounter++; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 6: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); lineCounter++; return MBTXGAP; case 7: markerFloat=start+bp; calcPixelPositionTable(YLINEEVEN,true); pixelArrayPtr=greenArrayPtr; return MBPIXELS; case 8: txFreq=2300.; txDur=(unsigned int)rint((2*blank)/3); return MBTXGAP; case 9: txFreq=1900.; txDur=(unsigned int)rint(blank/3); return MBTXGAP; case 10: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 11: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 12: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; case 13: txFreq=lowerFreq; txDur=(unsigned int)rint(bp); return MBTXGAP; default: return MBENDOFLINE; } } void modeRobot1::getLine() { getLineY(true); } qsstv_9.2.6/qsstv/sstv/modes/moderobot1.h0000664000175000017500000000526213203343610017144 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODEROBOT1_H #define MODEROBOT1_H #include "modebase.h" /** @author Johan Maes */ class modeRobot1 : public modeBase { public: modeRobot1 (esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeRobot1(); private: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); // unsigned long adjustSyncPosition(unsigned long syncPos0); void setupParams(double clock); void showLine(); embState txSetupLine(); void getLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/moderobot2.cpp0000664000175000017500000001647013203343610017503 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "moderobot2.h" modeRobot2::modeRobot2(esstvMode m,unsigned int len,bool tx,bool narrowMode): modeBase(m,len,tx,narrowMode) { } modeRobot2::~modeRobot2() { } void modeRobot2::setupParams(double clock) { //double tmp=(activeSSTVParam->imageTime/(double)activeSSTVParam->numberOfDataLines)*clock; //visibleLineLength=(tmp-fp-bp-2*blank-syncDuration)/4; visibleLineLength=(getLineLength(mode,clock)-fp-bp-2*blank-syncDuration)/4.; } modeBase::embState modeRobot2::rxSetupLine() { switch(subLine) { case 0: debugState=stBP; start=lineTimeTableRX[lineCounter]; markerFloat=start+bp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 1: calcPixelPositionTable(YLINEODD,false); markerFloat+=2*visibleLineLength; debugState=stColorLine0; pixelArrayPtr=yArrayPtr; return MBPIXELS; case 2: debugState=stG1; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 3: calcPixelPositionTable(REDLINE,false); markerFloat+=visibleLineLength; debugState=stColorLine1; pixelArrayPtr=redArrayPtr; return MBPIXELS; case 4: debugState=stG2; markerFloat+=blank; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 5: calcPixelPositionTable(BLUELINE,false); markerFloat+=visibleLineLength; debugState=stColorLine2; pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 6: debugState=stFP; markerFloat+=fp; marker=(unsigned int)round(markerFloat); return MBRXWAIT; case 7: debugState=stSync; markerFloat+=syncDuration; marker=(unsigned int)round(markerFloat); syncPosition=marker; return MBSYNC; default: return MBENDOFLINE; } } void modeRobot2::showLine() { yuvConversion(yArrayPtr); } void modeRobot2::calcPixelPositionTable(unsigned int colorLine,bool tx) { unsigned int i; DSPFLOAT lineStart=start; int ofx=0; if(tx) ofx=1; // debugState=colorLine; switch (colorLine) { case YLINEODD: lineStart+=bp; break; case REDLINE: lineStart+=(bp+2*visibleLineLength+blank); break; case BLUELINE: lineStart+=bp+2*blank+3*visibleLineLength; // addToLog(QString("gbr2: redstart=%1").arg(start),DBMODES); break; } switch (colorLine) { case YLINEODD: for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*2*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; default: for(i=0;inumberOfPixels;i++) { pixelPositionTable[i]=(unsigned int)round(lineStart+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); } break; } } //void modeRobot2::calcPixelPositionTable(unsigned int colorLine,bool tx) //{ // unsigned int i; // int ofx=0; // if(tx) ofx=1; // double start; // if (tx) start=lineTimeTableTX[lineCounter]; // else start=lineTimeTableRX[lineCounter]; // debugState=colorLine; // if (tx) start+=9; // switch (colorLine) // { // case YLINEODD: // start+=bp; // for(i=0;inumberOfPixels;i++) // { // pixelPositionTable[i]=(unsigned int)round(start+(((float)(i+ofx)*2*visibleLineLength)/activeSSTVParam->numberOfPixels)); // } // break; // case REDLINE: // start+=(bp+blank+2*visibleLineLength); // for(i=0;inumberOfPixels;i++) // { // pixelPositionTable[i]=(unsigned int)round(start+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); // } // break; // case BLUELINE: // start+=(bp+2*blank+3*visibleLineLength); // for(i=0;inumberOfPixels;i++) // { // pixelPositionTable[i]=(unsigned int)(round)(start+(((float)(i+ofx)*visibleLineLength)/activeSSTVParam->numberOfPixels)); // } // break; // } //} modeBase::embState modeRobot2::txSetupLine() { start=lineTimeTableTX[lineCounter]; switch(subLine) { case 0: txFreq=lowerFreq; txDur=(unsigned int)rint(bp+6); return MBTXGAP; case 1: calcPixelPositionTable(YLINEODD,true); pixelArrayPtr=yArrayPtr; return MBPIXELS; case 2: txFreq=lowerFreq; txDur=(unsigned int)rint((2*blank)/3); return MBTXGAP; case 3: txFreq=1900.; txDur=(unsigned int)rint(blank/3); return MBTXGAP; case 4: calcPixelPositionTable(REDLINE,true); pixelArrayPtr=redArrayPtr; return MBPIXELS; case 5: txFreq=2300.; txDur=(unsigned int)rint((2*blank)/3); return MBTXGAP; case 6: txFreq=1900.; txDur=(unsigned int)rint(blank/3); return MBTXGAP; case 7: calcPixelPositionTable(BLUELINE,true); pixelArrayPtr=blueArrayPtr; return MBPIXELS; case 8: txFreq=lowerFreq; txDur=(unsigned int)rint(fp); return MBTXGAP; case 9: txFreq=syncFreq; txDur=(unsigned int)rint(syncDuration); return MBTXGAP; default: return MBENDOFLINE; } } void modeRobot2::getLine() { getLineY(false); } qsstv_9.2.6/qsstv/sstv/modes/moderobot2.h0000664000175000017500000000516013203343610017142 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef MODEROBOT2_H #define MODEROBOT2_H #include "modebase.h" /** @author Johan Maes */ class modeRobot2 : public modeBase { public: modeRobot2(esstvMode m, unsigned int len, bool tx, bool narrowMode); ~modeRobot2(); private: embState rxSetupLine(); void calcPixelPositionTable(unsigned int colorLine,bool tx); void setupParams(double clock); void showLine(); embState txSetupLine(); void getLine(); }; #endif qsstv_9.2.6/qsstv/sstv/modes/modes.h0000664000175000017500000000333113203343610016173 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MODES_H #define MODES_H #include "modegbr.h" #include "modegbr2.h" #include "modergb.h" #include "moderobot1.h" #include "moderobot2.h" #include "modepd.h" #include "modebw.h" #include "modeavt.h" #endif qsstv_9.2.6/qsstv/config/baseconfig.cpp0000664000175000017500000000014613203343610016657 0ustar jomajoma#include "baseconfig.h" baseConfig::baseConfig(QWidget *parent):QWidget(parent) { changed=false; } qsstv_9.2.6/qsstv/config/baseconfig.h0000664000175000017500000000066413203343610016331 0ustar jomajoma#ifndef BASECONFIG_H #define BASECONFIG_H #include #include #include #include "utils/supportfunctions.h" class baseConfig: public QWidget { public: baseConfig(QWidget *parent = 0); virtual void readSettings()=0; virtual void writeSettings()=0; virtual void getParams()=0; virtual void setParams()=0; bool hasChanged() {return changed;} protected: bool changed; }; #endif // BASECONFIG_H qsstv_9.2.6/qsstv/config/configdialog.cpp0000664000175000017500000000437313203343610017212 0ustar jomajoma#include "configdialog.h" #include "ui_configdialog.h" #include "gallerywidget.h" #include "mainwindow.h" #include "txwidget.h" #include "filewatcher.h" configDialog::configDialog(QWidget *parent) : QDialog(parent), ui(new Ui::configDialog) { ui->setupUi(this); ui->catWidget->attachRigController(rigControllerPtr); ui->configTabWidget->setCurrentIndex(0); } configDialog::~configDialog() { delete ui; } void configDialog::readSettings() { ui->cwWidget->readSettings(); ui->directoryWidget->readSettings(); ui->drmProfilesWidget->readSettings(); ui->ftpWidget->readSettings(); ui->guiWidget->readSettings(); ui->hybridWidget->readSettings(); ui->hybridNotifyWidget->readSettings(); ui->operatorWidget->readSettings(); ui->repeaterWidget->readSettings(); ui->catWidget->readSettings(); ui->soundWidget->readSettings(); ui->waterfallWidget->readSettings(); ui->freqSelectWidget->readSettings(); } void configDialog::writeSettings() { ui->operatorWidget->writeSettings(); ui->directoryWidget->writeSettings(); ui->soundWidget->writeSettings(); ui->guiWidget->writeSettings(); ui->catWidget->writeSettings(); ui->ftpWidget->writeSettings(); ui->repeaterWidget->writeSettings(); ui->hybridWidget->writeSettings(); ui->hybridNotifyWidget->writeSettings(); ui->drmProfilesWidget->writeSettings(); ui->cwWidget->writeSettings(); ui->waterfallWidget->writeSettings(); soundNeedsRestart=ui->soundWidget->hasChanged(); guiNeedsRestart=ui->guiWidget->hasChanged(); ui->freqSelectWidget->writeSettings(); if(ui->guiWidget->backGroundColorChanged) { emit bgColorChanged(); ui->guiWidget->backGroundColorChanged=false; } } /** Opens the configuration dialog */ int configDialog::exec() { if(QDialog::exec()) { writeSettings(); if(ui->directoryWidget->hasChanged() || ui->guiWidget->hasChanged()) { galleryWidgetPtr->changedMatrix(); } if(ui->drmProfilesWidget->hasChanged()) { txWidgetPtr->reloadProfiles(); } if(ui->directoryWidget->hasChanged()) { fileWatcherPtr->init(); } mainWindowPtr->setSSTVDRMPushButton(transmissionModeIndex==TRXDRM); return QDialog::Accepted; } else { return QDialog::Rejected; } } qsstv_9.2.6/qsstv/config/configdialog.h0000664000175000017500000000067013203343610016653 0ustar jomajoma#ifndef CONFIGDIALOG_H #define CONFIGDIALOG_H #include namespace Ui { class configDialog; } class configDialog : public QDialog { Q_OBJECT public: explicit configDialog(QWidget *parent = 0); ~configDialog(); void readSettings(); void writeSettings(); int exec(); bool soundNeedsRestart; bool guiNeedsRestart; signals: void bgColorChanged(); private: Ui::configDialog *ui; }; #endif // CONFIGDIALOG_H qsstv_9.2.6/qsstv/config/configdialog.ui0000664000175000017500000003247313203343610017047 0ustar jomajoma configDialog 0 0 818 438 Configuration 1 0 0 0 0 2 Operator 1 0 0 0 0 Directories 1 0 0 0 0 Gui 1 0 0 0 0 Sound 1 0 0 0 0 CAT 1 0 0 0 0 CW 1 0 0 0 0 Repeater 1 0 0 0 0 FTP 1 0 0 0 0 Waterfall 1 0 0 0 0 Hybrid 1 0 0 0 0 Notifications 1 0 0 0 0 DRM Profiles 1 0 0 0 0 Frequencies 1 0 0 0 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok soundConfig QWidget
soundconfig.h
1
directoriesConfig QWidget
directoriesconfig.h
1
operatorConfig QWidget
operatorconfig.h
1
guiConfig QWidget
guiconfig.h
1
rigConfig QWidget
rigconfig.h
1
cwConfig QWidget
cwconfig.h
1
repeaterConfig QWidget
repeaterconfig.h
1
ftpConfig QWidget
ftpconfig.h
1
waterfallConfig QWidget
waterfallconfig.h
1
hybridConfig QWidget
hybridconfig.h
1
drmProfileConfig QWidget
drmprofileconfig.h
1
frequencySelectWidget QWidget
frequencyselectwidget.h
1
hybridNotifyConfig QWidget
hybridnotifyconfig.h
1
buttonBox accepted() configDialog accept() 248 254 157 274 buttonBox rejected() configDialog reject() 316 260 286 274
qsstv_9.2.6/qsstv/config/configparams.h0000664000175000017500000000065413203343610016701 0ustar jomajoma#ifndef CONFIGPARAMS_H #define CONFIGPARAMS_H #include "cwconfig.h" #include "directoriesconfig.h" #include "drmprofileconfig.h" #include "ftpconfig.h" #include "guiconfig.h" #include "hybridconfig.h" #include "hybridnotifyconfig.h" #include "operatorconfig.h" #include "repeaterconfig.h" #include "rigconfig.h" #include "soundconfig.h" #include "waterfallconfig.h" #include "frequencyselectwidget.h" #endif // CONFIGPARAMS_H qsstv_9.2.6/qsstv/config/cwconfig.cpp0000664000175000017500000000263413203343610016362 0ustar jomajoma#include "cwconfig.h" #include "ui_cwconfig.h" QString cwText; int cwTone; int cwWPM; //bool enableCW; cwConfig::cwConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::cwConfig) { ui->setupUi(this); } cwConfig::~cwConfig() { delete ui; } void cwConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("CW"); cwText=qSettings.value("cwtext","").toString(); cwTone=qSettings.value("cwtone",800).toInt(); cwWPM=qSettings.value("cwWPM",12).toInt(); // enableCW=qSettings.value("enableCW",false).toBool(); qSettings.endGroup(); setParams(); } void cwConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("CW"); qSettings.setValue("cwtext",cwText); qSettings.setValue("cwtone",cwTone); qSettings.setValue("cwWPM",cwWPM); // qSettings.setValue("enableCW",enableCW); qSettings.endGroup(); } void cwConfig::getParams() { QString cwTextCopy=cwText; int cwToneCopy=cwTone; int cwWPMCopy=cwWPM; getValue(cwText,ui->cwTextLineEdit); getValue(cwTone,ui->cwToneSpinBox); getValue(cwWPM,ui->cwWPMSpinBox); // getValue(enableCW,ui->enableCWCheckBox); changed=false; if(cwTextCopy!=cwText || cwToneCopy!=cwTone || cwWPMCopy!=cwWPM) changed=true; } void cwConfig::setParams() { setValue(cwText,ui->cwTextLineEdit); setValue(cwTone,ui->cwToneSpinBox); setValue(cwWPM,ui->cwWPMSpinBox); // setValue(enableCW,ui->enableCWCheckBox); } qsstv_9.2.6/qsstv/config/cwconfig.h0000664000175000017500000000067413203343610016031 0ustar jomajoma#ifndef CWCONFIG_H #define CWCONFIG_H #include "baseconfig.h" extern QString cwText; extern int cwTone; extern int cwWPM; //extern bool enableCW; namespace Ui { class cwConfig; } class cwConfig : public baseConfig { Q_OBJECT public: explicit cwConfig(QWidget *parent = 0); ~cwConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private: Ui::cwConfig *ui; }; #endif // CWCONFIG_H qsstv_9.2.6/qsstv/config/cwconfig.ui0000664000175000017500000001435713203343610016222 0ustar jomajoma cwConfig 0 0 482 182 Dialog 1 0 0 0 0 6 0 0 0 0 0 0 145 25 Words PerMinute false 4 30 12 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 0 0 0 0 0 145 25 Text to send false Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 0 0 0 0 0 145 25 Tone false 300 2300 50 800 Qt::Horizontal QSizePolicy::Expanding 20 20 Qt::Vertical QSizePolicy::Expanding 20 54 qsstv_9.2.6/qsstv/config/directoriesconfig.cpp0000664000175000017500000001360513203343610020265 0ustar jomajoma#include "directoriesconfig.h" #include "ui_directoriesconfig.h" QString rxSSTVImagesPath; QString rxDRMImagesPath; QString txSSTVImagesPath; QString txDRMImagesPath; QString txStockImagesPath; QString templatesPath; QString audioPath; bool saveTXimages; QString docURL; directoriesConfig::directoriesConfig(QWidget *parent) :baseConfig(parent), ui(new Ui::directoriesConfig) { ui->setupUi(this); connect(ui->rxSSTVImagesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseRxSSTVImagesPath())); connect(ui->rxDRMImagesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseRxDRMImagesPath())); connect(ui->txSSTVImagesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseTxSSTVImagesPath())); connect(ui->txDRMImagesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseTxDRMImagesPath())); connect(ui->txStockImagesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseTxStockImagesPath())); connect(ui->templatesPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseTemplatesPath())); connect(ui->audioPathBrowseButton,SIGNAL(clicked()),SLOT(slotBrowseAudioPath())); } directoriesConfig::~directoriesConfig() { delete ui; } void directoriesConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("DIRECTORIES"); rxSSTVImagesPath=qSettings.value("rxSSTVImagesPath",QString(getenv("HOME"))+"/qsstv/rx_sstv/").toString(); rxDRMImagesPath=qSettings.value("rxDRMImagesPath",QString(getenv("HOME"))+"/qsstv/rx_drm/").toString(); txSSTVImagesPath=qSettings.value("txSSTVImagesPath",QString(getenv("HOME"))+"/qsstv/tx_sstv/").toString(); txDRMImagesPath=qSettings.value("txDRMImagesPath",QString(getenv("HOME"))+"/tx_drm/").toString(); txStockImagesPath=qSettings.value("txStockImagesPath",QString(getenv("HOME"))+"/tx_stock/").toString(); templatesPath=qSettings.value("templatesPath",QString(getenv("HOME"))+"/templates/").toString(); audioPath=qSettings.value("audioPath",QString(getenv("HOME"))+"/audio/").toString(); docURL=qSettings.value("docURL","http://users.telenet.be/on4qz/qsstv/manual").toString(); saveTXimages=qSettings.value("saveTXimages",false).toBool(); qSettings.endGroup(); setParams(); } void directoriesConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("DIRECTORIES"); qSettings.setValue("rxSSTVImagesPath",rxSSTVImagesPath); qSettings.setValue("rxDRMImagesPath",rxDRMImagesPath); qSettings.setValue("txSSTVImagesPath",txSSTVImagesPath); qSettings.setValue("txDRMImagesPath",txDRMImagesPath); qSettings.setValue("txStockImagesPath",txStockImagesPath); qSettings.setValue("templatesPath",templatesPath); qSettings.setValue("audioPath",audioPath); qSettings.setValue("docURL",docURL); qSettings.setValue("saveTXimages",saveTXimages); qSettings.endGroup(); } void directoriesConfig::getParams() { QString rxSSTVImagePathSaved=rxSSTVImagesPath; QString rxDRMImagePathSaved=rxDRMImagesPath; QString txSSTVImagePathSaved=txSSTVImagesPath; QString txDRMImagePathSaved=txDRMImagesPath; QString txStockImagePathSaved=txStockImagesPath; QString templatesPathSaved=templatesPath; getValue(rxSSTVImagesPath,ui->rxSSTVImagesPathLineEdit); getValue(rxDRMImagesPath,ui->rxDRMImagesPathLineEdit); getValue(txSSTVImagesPath,ui->txSSTVImagesPathLineEdit); getValue(txDRMImagesPath,ui->txDRMImagesPathLineEdit); getValue(txStockImagesPath,ui->txStockImagesPathLineEdit); getValue(templatesPath,ui->templatesPathLineEdit); getValue(audioPath,ui->audioPathLineEdit); getValue(docURL,ui->docPathLineEdit); getValue(saveTXimages,ui->saveTXcheckBox); changed=false; if(rxSSTVImagePathSaved!=rxSSTVImagesPath || rxDRMImagePathSaved!=rxDRMImagesPath || txSSTVImagePathSaved!=txSSTVImagesPath || txDRMImagePathSaved!=txDRMImagesPath || txStockImagePathSaved!=txStockImagesPath || templatesPathSaved!=templatesPath ) changed=true; // always save it } void directoriesConfig::setParams() { setValue(rxSSTVImagesPath,ui->rxSSTVImagesPathLineEdit); setValue(rxDRMImagesPath,ui->rxDRMImagesPathLineEdit); setValue(txSSTVImagesPath,ui->txSSTVImagesPathLineEdit); setValue(txDRMImagesPath,ui->txDRMImagesPathLineEdit); setValue(txStockImagesPath,ui->txStockImagesPathLineEdit); setValue(templatesPath,ui->templatesPathLineEdit); setValue(audioPath,ui->audioPathLineEdit); setValue(docURL,ui->docPathLineEdit); setValue(saveTXimages,ui->saveTXcheckBox); // create directories if not exist createDir(rxSSTVImagesPath); createDir(rxDRMImagesPath); createDir(txSSTVImagesPath); createDir(txDRMImagesPath); createDir(txStockImagesPath); createDir(templatesPath); createDir(rxSSTVImagesPath+"/cache"); createDir(rxDRMImagesPath+"/cache"); createDir(txSSTVImagesPath+"/cache"); createDir(txDRMImagesPath+"/cache"); createDir(txStockImagesPath+"/cache"); createDir(audioPath); } void directoriesConfig::createDir(QString path) { QDir dd(path); if(!dd.exists()) { dd.mkpath(path); } } /** Browse function for path where the rximages are stored */ void directoriesConfig::slotBrowseRxSSTVImagesPath() { browseDir(ui->rxSSTVImagesPathLineEdit,rxSSTVImagesPath); } void directoriesConfig::slotBrowseRxDRMImagesPath() { browseDir(ui->rxDRMImagesPathLineEdit,rxDRMImagesPath); } /** Browse function for path where the tximages are stored */ void directoriesConfig::slotBrowseTxSSTVImagesPath() { browseDir(ui->txSSTVImagesPathLineEdit,txSSTVImagesPath); } void directoriesConfig::slotBrowseTxDRMImagesPath() { browseDir(ui->txDRMImagesPathLineEdit,txDRMImagesPath); } void directoriesConfig::slotBrowseTxStockImagesPath() { browseDir(ui->txStockImagesPathLineEdit,txStockImagesPath); } /** Browse function for path where the templates are stored */ void directoriesConfig::slotBrowseTemplatesPath() { browseDir(ui->templatesPathLineEdit,templatesPath); } /** Browse function for audio path */ void directoriesConfig::slotBrowseAudioPath() { browseDir(ui->audioPathLineEdit,audioPath); } qsstv_9.2.6/qsstv/config/directoriesconfig.h0000664000175000017500000000172213203343610017727 0ustar jomajoma#ifndef DIRECTORIES_H #define DIRECTORIES_H #include "baseconfig.h" extern QString rxSSTVImagesPath; extern QString rxDRMImagesPath; extern QString txSSTVImagesPath; extern QString txDRMImagesPath; extern QString txStockImagesPath; extern QString templatesPath; extern QString audioPath; extern bool saveTXimages; extern QString docURL; namespace Ui { class directoriesConfig; } class directoriesConfig : public baseConfig { Q_OBJECT public: explicit directoriesConfig(QWidget *parent = 0); ~directoriesConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private slots: void slotBrowseRxSSTVImagesPath(); void slotBrowseRxDRMImagesPath(); void slotBrowseTxSSTVImagesPath(); void slotBrowseTxDRMImagesPath(); void slotBrowseTxStockImagesPath(); void slotBrowseTemplatesPath(); void slotBrowseAudioPath(); private: Ui::directoriesConfig *ui; void createDir(QString path); }; #endif // DIRECTORIES_H qsstv_9.2.6/qsstv/config/directoriesconfig.ui0000664000175000017500000003216213203343610020117 0ustar jomajoma directoriesConfig 0 0 700 345 Dialog 1 0 0 0 0 6 0 0 0 0 0 0 150 25 RX SSTV Images false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 RX DRM Images false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 TX SSTV Images false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 TX DRM Images false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 TX Stock Images false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 Templates false 0 0 Browse ... 6 0 0 0 0 0 0 150 25 Audio Records false 0 0 Browse ... Save TX images in TX SSTV or TX DRM directory Qt::Vertical QSizePolicy::Expanding 20 184 6 0 0 0 0 0 0 150 25 Documentation false qsstv_9.2.6/qsstv/config/drmprofileconfig.cpp0000664000175000017500000001732213203343610020114 0ustar jomajoma#include "drmprofileconfig.h" #include "ui_drmprofileconfig.h" #include "utils/supportfunctions.h" #include "configparams.h" sprofile drmPFArray[NUMBEROFPROFILES]; drmProfileConfig *drmProfileConfigPtr; drmProfileConfig::drmProfileConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::drmProfileConfig) { ui->setupUi(this); readSettings(); } drmProfileConfig::~drmProfileConfig() { writeSettings(); delete ui; } void drmProfileConfig::readSettings() { QSettings qSettings; qSettings.beginGroup ("DRMPROFILE" ); drmPFArray[0].name=qSettings.value ("drmPF1Name","Profile 1").toString(); drmPFArray[0].params.robMode=qSettings.value ("drmPF1Mode",0).toInt(); drmPFArray[0].params.qam=qSettings.value("drmPF1QAM",0).toInt(); drmPFArray[0].params.bandwith=qSettings.value("drmPF1Bandwidth",0).toInt(); drmPFArray[0].params.protection=qSettings.value("drmPF1Protection",0).toInt(); drmPFArray[0].params.interleaver=qSettings.value("drmPF1Interleave",0).toInt(); drmPFArray[0].params.reedSolomon=qSettings.value("drmPF1ReedSolomon",0).toInt(); drmPFArray[1].name=qSettings.value ("drmPF2Name","Profile 2").toString(); drmPFArray[1].params.robMode=qSettings.value ("drmPF2Mode",0).toInt(); drmPFArray[1].params.qam=qSettings.value("drmPF2QAM",0).toInt(); drmPFArray[1].params.bandwith=qSettings.value("drmPF2Bandwidth",0).toInt(); drmPFArray[1].params.protection=qSettings.value("drmPF2Protection",0).toInt(); drmPFArray[1].params.interleaver=qSettings.value("drmPF2Interleave",0).toInt(); drmPFArray[1].params.reedSolomon=qSettings.value("drmPF2ReedSolomon",0).toInt(); drmPFArray[2].name=qSettings.value ("drmPF3Name","Profile 3").toString(); drmPFArray[2].params.robMode=qSettings.value ("drmPF3Mode",0).toInt(); drmPFArray[2].params.qam=qSettings.value("drmPF3QAM",0).toInt(); drmPFArray[2].params.bandwith=qSettings.value("drmPF3Bandwidth",0).toInt(); drmPFArray[2].params.protection=qSettings.value("drmPF3Protection",0).toInt(); drmPFArray[2].params.interleaver=qSettings.value("drmPF3Interleave",0).toInt(); drmPFArray[2].params.reedSolomon=qSettings.value("drmPF3ReedSolomon",0).toInt(); qSettings.endGroup(); setParams(); } void drmProfileConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup ("DRMPROFILE" ); qSettings.setValue ("drmPF1Name",drmPFArray[0].name); qSettings.setValue ("drmPF1Mode",drmPFArray[0].params.robMode); qSettings.setValue("drmPF1QAM",drmPFArray[0].params.qam); qSettings.setValue("drmPF1Bandwidth",drmPFArray[0].params.bandwith); qSettings.setValue("drmPF1Protection",drmPFArray[0].params.protection); qSettings.setValue("drmPF1Interleave",drmPFArray[0].params.interleaver); qSettings.setValue("drmPF1ReedSolomon",drmPFArray[0].params.reedSolomon); qSettings.setValue ("drmPF2Name",drmPFArray[1].name); qSettings.setValue ("drmPF2Mode",drmPFArray[1].params.robMode); qSettings.setValue("drmPF2QAM",drmPFArray[1].params.qam); qSettings.setValue("drmPF2Bandwidth",drmPFArray[1].params.bandwith); qSettings.setValue("drmPF2Protection",drmPFArray[1].params.protection); qSettings.setValue("drmPF2Interleave",drmPFArray[1].params.interleaver); qSettings.setValue("drmPF2ReedSolomon",drmPFArray[1].params.reedSolomon); qSettings.setValue ("drmPF3Name",drmPFArray[2].name); qSettings.setValue ("drmPF3Mode",drmPFArray[2].params.robMode); qSettings.setValue("drmPF3QAM",drmPFArray[2].params.qam); qSettings.setValue("drmPF3Bandwidth",drmPFArray[2].params.bandwith); qSettings.setValue("drmPF3Protection",drmPFArray[2].params.protection); qSettings.setValue("drmPF3Interleave",drmPFArray[2].params.interleaver); qSettings.setValue("drmPF3ReedSolomon",drmPFArray[2].params.reedSolomon); qSettings.endGroup(); } void drmProfileConfig::getParams() { sprofile drmPFArrayCopy[NUMBEROFPROFILES]; drmPFArrayCopy[0]=drmPFArray[0]; drmPFArrayCopy[1]=drmPFArray[1]; drmPFArrayCopy[2]=drmPFArray[2]; getValue(drmPFArray[0].name,ui->namePF1LineEdit); drmPFArray[0].params.callsign=myCallsign; getIndex(drmPFArray[0].params.robMode,ui->drmPF1ModeComboBox); getIndex(drmPFArray[0].params.qam,ui->drmPF1QAMComboBox); getIndex(drmPFArray[0].params.bandwith,ui->drmPF1BandwidthComboBox); getIndex(drmPFArray[0].params.protection,ui->drmPF1ProtectionComboBox); getIndex(drmPFArray[0].params.interleaver,ui->drmPF1InterleaveComboBox); getIndex(drmPFArray[0].params.reedSolomon,ui->drmPF1ReedSolomonComboBox); getValue(drmPFArray[1].name,ui->namePF2LineEdit); drmPFArray[1].params.callsign=myCallsign; getIndex(drmPFArray[1].params.robMode,ui->drmPF2ModeComboBox); getIndex(drmPFArray[1].params.qam,ui->drmPF2QAMComboBox); getIndex(drmPFArray[1].params.bandwith,ui->drmPF2BandwidthComboBox); getIndex(drmPFArray[1].params.protection,ui->drmPF2ProtectionComboBox); getIndex(drmPFArray[1].params.interleaver,ui->drmPF2InterleaveComboBox); getIndex(drmPFArray[1].params.reedSolomon,ui->drmPF2ReedSolomonComboBox); getValue(drmPFArray[2].name,ui->namePF3LineEdit); drmPFArray[2].params.callsign=myCallsign; getIndex(drmPFArray[2].params.robMode,ui->drmPF3ModeComboBox); getIndex(drmPFArray[2].params.qam,ui->drmPF3QAMComboBox); getIndex(drmPFArray[2].params.bandwith,ui->drmPF3BandwidthComboBox); getIndex(drmPFArray[2].params.protection,ui->drmPF3ProtectionComboBox); getIndex(drmPFArray[2].params.interleaver,ui->drmPF3InterleaveComboBox); getIndex(drmPFArray[2].params.reedSolomon,ui->drmPF3ReedSolomonComboBox); changed=false; if( diff(drmPFArrayCopy[0],drmPFArray[0]) || diff(drmPFArrayCopy[1],drmPFArray[1]) || diff(drmPFArrayCopy[2],drmPFArray[2])) changed=true; } bool drmProfileConfig::diff(sprofile a,sprofile b) { return (a.name!=b.name || a.params.robMode!=b.params.robMode || a.params.qam!= b.params.qam || a.params.bandwith!=b.params.bandwith || a.params.protection!=b.params.protection || a.params.interleaver!=b.params.interleaver || a.params.reedSolomon!=b.params.reedSolomon); } void drmProfileConfig::setParams() { setValue(drmPFArray[0].name,ui->namePF1LineEdit); setIndex(drmPFArray[0].params.robMode,ui->drmPF1ModeComboBox); setIndex(drmPFArray[0].params.qam,ui->drmPF1QAMComboBox); setIndex(drmPFArray[0].params.bandwith,ui->drmPF1BandwidthComboBox); setIndex(drmPFArray[0].params.protection,ui->drmPF1ProtectionComboBox); setIndex(drmPFArray[0].params.interleaver,ui->drmPF1InterleaveComboBox); setIndex(drmPFArray[0].params.reedSolomon,ui->drmPF1ReedSolomonComboBox); setValue(drmPFArray[1].name,ui->namePF2LineEdit); setIndex(drmPFArray[1].params.robMode,ui->drmPF2ModeComboBox); setIndex(drmPFArray[1].params.qam,ui->drmPF2QAMComboBox); setIndex(drmPFArray[1].params.bandwith,ui->drmPF2BandwidthComboBox); setIndex(drmPFArray[1].params.protection,ui->drmPF2ProtectionComboBox); setIndex(drmPFArray[1].params.interleaver,ui->drmPF2InterleaveComboBox); setIndex(drmPFArray[1].params.reedSolomon,ui->drmPF2ReedSolomonComboBox); setValue(drmPFArray[2].name,ui->namePF3LineEdit); setIndex(drmPFArray[2].params.robMode,ui->drmPF3ModeComboBox); setIndex(drmPFArray[2].params.qam,ui->drmPF3QAMComboBox); setIndex(drmPFArray[2].params.bandwith,ui->drmPF3BandwidthComboBox); setIndex(drmPFArray[2].params.protection,ui->drmPF3ProtectionComboBox); setIndex(drmPFArray[2].params.interleaver,ui->drmPF3InterleaveComboBox); setIndex(drmPFArray[2].params.reedSolomon,ui->drmPF3ReedSolomonComboBox); } bool drmProfileConfig::getDRMParams(int idx,drmTxParams &d) { if((idx<0)||(idx>=NUMBEROFPROFILES)) { return false; } d=drmPFArray[idx].params; return true; } bool drmProfileConfig::getName(int idx, QString &n) { if((idx<0)||(idx>=NUMBEROFPROFILES)) { return false; } n=drmPFArray[idx].name; return true; } qsstv_9.2.6/qsstv/config/drmprofileconfig.h0000664000175000017500000000153413203343610017557 0ustar jomajoma#ifndef DRMPROFILECONFIG_H #define DRMPROFILECONFIG_H #include "drmtx/drmparams.h" #include "baseconfig.h" #define NUMBEROFPROFILES 3 struct sprofile { QString name; drmTxParams params; }; extern sprofile drmPFArray[NUMBEROFPROFILES]; bool getDRMParams(int idx, drmTxParams &d); bool getName(int idx,QString &n); namespace Ui { class drmProfileConfig; } class drmProfileConfig : public baseConfig { Q_OBJECT public: explicit drmProfileConfig(QWidget *parent = 0); ~drmProfileConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); bool getDRMParams(int idx,drmTxParams &d); bool getName(int idx, QString &n); private: Ui::drmProfileConfig *ui; bool diff(sprofile a,sprofile b); }; extern drmProfileConfig *drmProfileConfigPtr; #endif // DRMPROFILECONFIG qsstv_9.2.6/qsstv/config/drmprofileconfig.ui0000664000175000017500000006174113203343610017753 0ustar jomajoma drmProfileConfig 0 0 434 330 Form 1 0 0 0 0 1 Profile 1 1 0 0 0 0 Profile Name 6 1 30 0 Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false A B E 30 0 BW Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 2.2 kHz 2.2 kHz 2.5 kHz 30 0 QAM Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 4 16 64 30 0 Interleave Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Short Long 30 0 Prot. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false High Low 30 0 Rs Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false None RS1 RS2 RS3 RS4 Profile 2 1 0 0 0 0 Profile Name 1 30 0 Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false A B E 30 0 BW Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 2.2 kHz 2.2 kHz 2.5 kHz 30 0 QAM Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 4 16 64 30 0 Interleave Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Short Long 30 0 Prot. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false High Low 30 0 Rs Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false None RS1 RS2 RS3 RS4 Profile 3 1 0 0 0 0 Profile Name 1 30 0 Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false A B E 30 0 BW Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 2.2 kHz 2.2 kHz 2.5 kHz 30 0 QAM Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 4 16 64 30 0 Interleave Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Short Long 30 0 Prot. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false High Low 30 0 Rs Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false None RS1 RS2 RS3 RS4 Qt::Vertical 20 121 qsstv_9.2.6/qsstv/config/frequencyselectwidget.cpp0000664000175000017500000001531513203343610021170 0ustar jomajoma#include "frequencyselectwidget.h" #include "ui_frequencyselectwidget.h" QStringList freqList; QStringList modeList; QStringList sbModeList; QString additionalCommand; bool additionalCommandHex; frequencySelectWidget::frequencySelectWidget(QWidget *parent) :baseConfig(parent), ui(new Ui::frequencySelectWidget) { ui->setupUi(this); QStringList sl; sl<<"Frequencyy"<<"Mode"<<"Modulation"; ui->tableWidget->setAlternatingRowColors (false); ui->tableWidget->setColumnCount(3); ui->tableWidget->setHorizontalHeaderLabels(sl); connect(ui->tableWidget,SIGNAL(itemChanged(QTableWidgetItem *)),this,SLOT(slotItemChanged())); connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(slotCellClicked(int,int))); connect(ui->addFreqPushButton,SIGNAL(clicked()),this,SLOT(slotFreqAdd())); connect(ui->deleteFreqPushButton,SIGNAL(clicked()),this,SLOT(slotFreqDelete())); connect(ui->moveUpFreqPushButton,SIGNAL(clicked()),this,SLOT(slotFreqUp())); connect(ui->moveDownFreqPushButton,SIGNAL(clicked()),this,SLOT(slotFreqDown())); lastRowSelected=-1; } frequencySelectWidget::~frequencySelectWidget() { writeSettings(); delete ui; } void frequencySelectWidget::readSettings() { QSettings qSettings; qSettings.beginGroup("FREQSELECT"); freqList=qSettings.value("frequencyList",QStringList()).toStringList(); modeList=qSettings.value("modeList",QStringList()).toStringList(); sbModeList=qSettings.value("sbModeList",QStringList()).toStringList(); additionalCommand=qSettings.value("additionalCommand",QString()).toString(); additionalCommandHex=qSettings.value("additionalCommandHex",false).toBool(); if(modeList.count()!=freqList.count() || sbModeList.count()!=freqList.count()) { // invalid config freqList.clear(); modeList.clear(); sbModeList.clear(); } setParams(); qSettings.endGroup(); } void frequencySelectWidget::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("FREQSELECT"); qSettings.setValue("frequencyList",freqList); qSettings.setValue("modeList",modeList); qSettings.setValue("sbModeList",sbModeList); qSettings.setValue("additionalCommand",additionalCommand); qSettings.setValue("additionalCommandHex",additionalCommandHex); qSettings.endGroup(); } void frequencySelectWidget::constructTable() { int i; while(ui->tableWidget->rowCount()>0) { ui->tableWidget->removeRow(0); } ui->tableWidget->setRowCount(freqList.count()); for(i=0;itableWidget->setRowCount(freqList.count()); } } } void frequencySelectWidget:: getParams() { int i; bool ok; freqList.clear(); modeList.clear(); sbModeList.clear(); for(i=0;itableWidget->rowCount();i++) { ui->tableWidget->item(i,0)->text().toDouble(&ok); { if (!ok) { blockSignals(true); ui->tableWidget->item(i,0)->setText(""); blockSignals(false); } } freqList.append(ui->tableWidget->item(i,0)->text()); modeList.append(((QComboBox *)ui->tableWidget->cellWidget(i,1))->currentText()); sbModeList.append(((QComboBox *)ui->tableWidget->cellWidget(i,2))->currentText()); } getValue(additionalCommand,ui->additionalCommandLineEdit); getValue(additionalCommandHex,ui->additionalCommandHexCheckBox); } void frequencySelectWidget::setParams() { constructTable(); setValue(additionalCommand,ui->additionalCommandLineEdit); setValue(additionalCommandHex,ui->additionalCommandHexCheckBox); } void frequencySelectWidget::slotFreqAdd() { freqList.append(""); modeList.append("SSTV"); sbModeList.append("LSB"); createEntry(freqList.count()-1); } void frequencySelectWidget::slotFreqDelete() { int curRow=lastRowSelected; freqList.takeAt(curRow); modeList.takeAt(curRow); sbModeList.takeAt(curRow); constructTable(); if((curRowtableWidget->setCurrentCell(curRow-1,0); ui->tableWidget->item(curRow-1, 0)->setSelected(true); setLastRowSelected(); } } void frequencySelectWidget::slotFreqUp() { int curRow=lastRowSelected; QString f,m,sb; if(curRow>0) { f=freqList.at(curRow-1); m=modeList.at(curRow-1); sb=sbModeList.at(curRow-1); freqList[curRow-1]=freqList.at(curRow); modeList[curRow-1]=modeList.at(curRow); sbModeList[curRow-1]=sbModeList.at(curRow); freqList[curRow]=f; modeList[curRow]=m; sbModeList[curRow]=sb; constructTable(); ui->tableWidget->setCurrentCell(curRow-1,0); ui->tableWidget->item(curRow-1, 0)->setSelected(true); setLastRowSelected(); } } void frequencySelectWidget::slotFreqDown() { int curRow=lastRowSelected; QString f,m,sb; if(curRow<(ui->tableWidget->rowCount()-1) && curRow>=0) { f=freqList.at(curRow+1); m=modeList.at(curRow+1); sb=sbModeList.at(curRow+1); freqList[curRow+1]=freqList.at(curRow); modeList[curRow+1]=modeList.at(curRow); sbModeList[curRow+1]=sbModeList.at(curRow); freqList[curRow]=f; modeList[curRow]=m; sbModeList[curRow]=sb; constructTable(); ui->tableWidget->setCurrentCell(curRow+1,0); ui->tableWidget->item(curRow+1, 0)->setSelected(true); setLastRowSelected(); } } void frequencySelectWidget::createEntry(int row) { QComboBox *cb, *sb; QTableWidgetItem *ct; if(row>(ui->tableWidget->rowCount()-1)) { ui->tableWidget->setRowCount(row+1); } ui->tableWidget-> blockSignals(true); ct=new QTableWidgetItem(); ct->setText(freqList.at(row)); ui->tableWidget->setItem(row,0,ct); cb=new QComboBox(this); cb->addItem("SSTV"); cb->addItem("DRM"); // cb->setCurrentText(modeList.at(row)); setValue(modeList.at(row),cb); ui->tableWidget->setCellWidget(row,1,cb); sb=new QComboBox(this); sb->addItem("LSB"); sb->addItem("USB"); sb->addItem("FM"); sb->addItem("AM"); // sb->setCurrentText(sbModeList.at(row)); setValue(sbModeList.at(row),sb); ui->tableWidget->setCellWidget(row,2,sb); connect(cb,SIGNAL(currentIndexChanged(int)),SLOT(slotItemChanged())); connect(sb,SIGNAL(currentIndexChanged(int)),SLOT(slotItemChanged())); ui->tableWidget->blockSignals(false); } void frequencySelectWidget::slotItemChanged() { getParams(); } void frequencySelectWidget::setLastRowSelected() { lastRowSelected=ui->tableWidget->currentRow(); if(lastRowSelected>=ui->tableWidget->rowCount()) { lastRowSelected=-1; } } void frequencySelectWidget::slotCellClicked(int r,int) { lastRowSelected=r; } qsstv_9.2.6/qsstv/config/frequencyselectwidget.h0000664000175000017500000000161713203343610020635 0ustar jomajoma#ifndef FREQUENCYSELECTWIDGET_H #define FREQUENCYSELECTWIDGET_H #include "baseconfig.h" #include extern QStringList freqList; extern QStringList modeList; extern QStringList sbModeList; extern QString additionalCommand; extern bool additionalCommandHex; namespace Ui { class frequencySelectWidget; } class frequencySelectWidget : public baseConfig { Q_OBJECT public: explicit frequencySelectWidget(QWidget *parent = 0); ~frequencySelectWidget(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private slots: void slotFreqAdd(); void slotFreqDelete(); void slotFreqUp(); void slotFreqDown(); void slotItemChanged(); void slotCellClicked(int r, int); private: Ui::frequencySelectWidget *ui; void constructTable(); void createEntry(int row); void setLastRowSelected(); int lastRowSelected; }; #endif // FREQUENCYSELECTWIDGET_H qsstv_9.2.6/qsstv/config/frequencyselectwidget.ui0000664000175000017500000001046113203343610021020 0ustar jomajoma frequencySelectWidget 0 0 788 473 Form 1 0 0 0 0 Add Delete Qt::Vertical 20 13 Qt::StrongFocus :/icons/up.png:/icons/up.png Qt::Vertical 20 18 Qt::StrongFocus :/icons/down.png:/icons/down.png Qt::Horizontal 40 20 true Enter the frequency in MHz and select the mode. Example: 14.230 SSTV USB 7.058 DRM LSB Hamlib Data Command Hex qsstv_9.2.6/qsstv/config/ftpconfig.cpp0000664000175000017500000001166013203343610016541 0ustar jomajoma#include "ftpconfig.h" #include "ui_ftpconfig.h" #include "ftp.h" #include #include bool enableFTP; int ftpPort; QString ftpRemoteHost; QString ftpRemoteSSTVDirectory; QString ftpRemoteDRMDirectory; QString ftpLogin; QString ftpPassword; QString ftpDefaultImageFormat; eftpSaveFormat ftpSaveFormat; int ftpNumImages; ftpConfig::ftpConfig(QWidget *parent) : baseConfig (parent), ui(new Ui::ftpConfig) { ui->setupUi(this); foreach (QByteArray format, QImageWriter::supportedImageFormats()) { QString text = tr("%1").arg(QString(format)); ui->ftpDefaultImageFormatComboBox->addItem(text); } connect(ui->testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton())); } ftpConfig::~ftpConfig() { delete ui; } void ftpConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("FTPCONFIG"); enableFTP=qSettings.value("enableFTP",false).toBool(); ftpPort=qSettings.value("ftpPort",21).toInt(); ftpRemoteHost=qSettings.value("ftpRemoteHost","").toString(); ftpRemoteSSTVDirectory=qSettings.value("ftpRemoteSSTVDirectory","").toString(); ftpRemoteDRMDirectory=qSettings.value("ftpRemoteDRMDirectory","").toString(); ftpLogin=qSettings.value("ftpLogin","").toString(); ftpPassword=qSettings.value("ftpPassword","").toString(); ftpDefaultImageFormat=qSettings.value("ftpDefaultImageFormat","png").toString(); ftpSaveFormat=(eftpSaveFormat)qSettings.value("ftpSaveFormat",0).toInt(); ftpNumImages=qSettings.value("ftpNumImages",30).toInt(); qSettings.endGroup(); setParams(); } void ftpConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("FTPCONFIG"); qSettings.setValue("enableFTP",enableFTP); qSettings.setValue("ftpPort",ftpPort); qSettings.setValue("ftpRemoteHost",ftpRemoteHost); qSettings.setValue("ftpRemoteSSTVDirectory",ftpRemoteSSTVDirectory); qSettings.setValue("ftpRemoteDRMDirectory",ftpRemoteDRMDirectory); qSettings.setValue("ftpLogin",ftpLogin); qSettings.setValue("ftpPassword",ftpPassword); qSettings.setValue("ftpDefaultImageFormat",ftpDefaultImageFormat); qSettings.setValue("ftpSaveFormat",(int)ftpSaveFormat); qSettings.setValue("ftpNumImages",ftpNumImages); qSettings.endGroup(); } void ftpConfig::getParams() { bool enableFTPCopy=enableFTP; int ftpPortCopy=ftpPort; QString ftpRemoteHostCopy=ftpRemoteHost; QString ftpRemoteSSTVDirectoryCopy=ftpRemoteSSTVDirectory; QString ftpRemoteDRMDirectoryCopy=ftpRemoteDRMDirectory; QString ftpLoginCopy=ftpLogin; QString ftpPasswordCopy=ftpPassword; QString ftpDefaultImageFormatCopy=ftpDefaultImageFormat; eftpSaveFormat ftpSaveFormatCopy=ftpSaveFormat; getValue(enableFTP,ui->enableFTPCheckBox); getValue(ftpPort,ui->ftpPortSpinBox); getValue(ftpRemoteHost,ui->remoteHostLineEdit); getValue(ftpNumImages,ui->ftpNumImagesSpinBox); getValue(ftpRemoteSSTVDirectory,ui->remoteSSTVDirectoryLineEdit); getValue(ftpRemoteDRMDirectory,ui->remoteDRMDirectoryLineEdit); getValue(ftpLogin,ui->ftpLoginLineEdit); getValue(ftpPassword,ui->ftpPasswordLineEdit); getValue(ftpDefaultImageFormat,ui->ftpDefaultImageFormatComboBox); if(ui->imageRadioButton->isChecked()) { ftpSaveFormat=FTPIM; } else { ftpSaveFormat=FTPFILE; } changed=false; if(enableFTPCopy!=enableFTP || ftpPortCopy!=ftpPort || ftpRemoteHostCopy!=ftpRemoteHost || ftpRemoteSSTVDirectoryCopy!=ftpRemoteSSTVDirectory || ftpRemoteDRMDirectoryCopy!=ftpRemoteDRMDirectory || ftpLoginCopy!=ftpLogin || ftpPasswordCopy!=ftpPassword || ftpDefaultImageFormatCopy!=ftpDefaultImageFormat || ftpSaveFormatCopy!=ftpSaveFormat) changed=true; } void ftpConfig::setParams() { setValue(enableFTP,ui->enableFTPCheckBox); setValue(ftpPort,ui->ftpPortSpinBox); setValue(ftpRemoteHost,ui->remoteHostLineEdit); setValue(ftpNumImages,ui->ftpNumImagesSpinBox); setValue(ftpRemoteSSTVDirectory,ui->remoteSSTVDirectoryLineEdit); setValue(ftpRemoteDRMDirectory,ui->remoteDRMDirectoryLineEdit); setValue(ftpLogin,ui->ftpLoginLineEdit); setValue(ftpPassword,ui->ftpPasswordLineEdit); if(ftpSaveFormat==FTPIM) { ui->imageRadioButton->setChecked(true); } else { ui->filenameRadioButton->setChecked(true); } setValue(ftpDefaultImageFormat,ui->ftpDefaultImageFormatComboBox); } void ftpConfig::slotTestFTPPushButton() { QString r1,r2; QApplication::setOverrideCursor(Qt::WaitCursor); ftpInterface fInt("TestUploadConnection"); ui->testFTPPushButton->setDisabled(true); getParams(); fInt.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory); r1=fInt.execFTPTest(); fInt.init(); fInt.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteDRMDirectory); r2=fInt.execFTPTest(); QApplication::restoreOverrideCursor(); ui->testFTPPushButton->setDisabled(false); QMessageBox::information(this,"Testing Connection","",QString("SSTV: %1\nDRM: %2").arg(r1).arg(r2)); } qsstv_9.2.6/qsstv/config/ftpconfig.h0000664000175000017500000000145613203343610016210 0ustar jomajoma#ifndef FTPCONFIG_H #define FTPCONFIG_H #include "baseconfig.h" #define NUMFTPRXIMAGES 30 enum eftpSaveFormat {FTPIM,FTPFILE}; extern bool enableFTP; extern int ftpPort; extern QString ftpRemoteHost; extern QString ftpRemoteSSTVDirectory; extern QString ftpRemoteDRMDirectory; extern QString ftpLogin; extern QString ftpPassword; extern QString ftpFilename; extern QString ftpDefaultImageFormat; extern eftpSaveFormat ftpSaveFormat; extern int ftpNumImages; namespace Ui { class ftpConfig; } class ftpConfig : public baseConfig { Q_OBJECT public: explicit ftpConfig(QWidget *parent = 0); ~ftpConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private slots: void slotTestFTPPushButton(); private: Ui::ftpConfig *ui; }; #endif // FTPCONFIG_H qsstv_9.2.6/qsstv/config/ftpconfig.ui0000664000175000017500000003575213203343610016404 0ustar jomajoma ftpConfig 0 0 751 517 Form 1 0 0 0 0 6 0 0 0 0 Enable File Upload to FTP Server Qt::Horizontal QSizePolicy::Expanding 20 20 FTP Port false 1 10000 21 Qt::Horizontal QSizePolicy::Expanding 20 20 Default Image Format false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Host false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Login false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Password false QLineEdit::Password Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Directory SSTV false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Directory DRM false Qt::Horizontal QSizePolicy::Preferred 20 20 Image store 1 0 0 0 0 image1 to image 1 50 30 Qt::Horizontal 40 20 filename This ftp server is used to upload your received pictures. You can save them as a rotating sequence of images (image1 being the latest and image30 being the oldest) or simply under their own filename. true Qt::Horizontal 40 20 Test connection Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 6 qsstv_9.2.6/qsstv/config/guiconfig.cpp0000664000175000017500000000652713203343610016542 0ustar jomajoma#include "guiconfig.h" #include "ui_guiconfig.h" #include #include int galleryRows; int galleryColumns; bool imageStretch; QColor backGroundColor; QColor imageBackGroundColor; bool slowCPU; bool lowRes; guiConfig::guiConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::guiConfig) { ui->setupUi(this); backGroundColorChanged=false; connect(ui->backgroundColorPushButton,SIGNAL(clicked()),SLOT(slotBGColorSelect())); connect(ui->imageBackgroundColorPushButton,SIGNAL(clicked()),SLOT(slotIBGColorSelect())); } guiConfig::~guiConfig() { delete ui; } void guiConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("GUI"); galleryRows=qSettings.value("galleryRows",4).toInt(); galleryColumns=qSettings.value("galleryColumns",4).toInt(); imageStretch=qSettings.value("imageStretch",true).toBool(); backGroundColor=qSettings.value("backGroundColor",QColor(128,128,128)).value(); imageBackGroundColor=qSettings.value("imageBackGroundColor",QColor(0,0,128)).value(); slowCPU=qSettings.value("slowCPU",false).toBool(); lowRes=qSettings.value("lowRes",false).toBool(); qSettings.endGroup(); setParams(); } void guiConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("GUI"); qSettings.setValue("galleryRows",galleryRows); qSettings.setValue("galleryColumns",galleryColumns); qSettings.setValue("imageStretch",imageStretch); qSettings.setValue("backGroundColor",backGroundColor); qSettings.setValue("imageBackGroundColor",imageBackGroundColor); qSettings.setValue("slowCPU",slowCPU); qSettings.setValue("lowRes",lowRes); qSettings.endGroup(); } void guiConfig::getParams() { int galleryRowsCopy=galleryRows; int galleryColumnsCopy=galleryColumns; getValue(galleryRows,ui->rowsSpinBox); getValue(galleryColumns, ui->columnsSpinBox); changed=false; if( galleryRowsCopy!=galleryRows || galleryColumnsCopy!=galleryColumns) changed=true; getValue(imageStretch,ui->stretchCheckBox); getValue(slowCPU,ui->slowCPUCheckBox); getValue(lowRes,ui->lowResCheckBox); } void guiConfig::setParams() { setValue(galleryRows,ui->rowsSpinBox); setValue(galleryColumns, ui->columnsSpinBox); setValue(imageStretch,ui->stretchCheckBox); setColorLabel(backGroundColor,false); setColorLabel(imageBackGroundColor,true); setValue(slowCPU,ui->slowCPUCheckBox); setValue(lowRes,ui->lowResCheckBox); } void guiConfig::slotBGColorSelect() { QColor c; c=QColorDialog::getColor(backGroundColor,this,"",QColorDialog::ShowAlphaChannel); setColorLabel(c,false); } void guiConfig::slotIBGColorSelect() { QColor c; c=QColorDialog::getColor(imageBackGroundColor,this,"",QColorDialog::ShowAlphaChannel); setColorLabel(c,true); } void guiConfig::setColorLabel(QColor c,bool image) { if (c.isValid()) { if(!image) { backGroundColorChanged=true; QPalette palette = ui->backGroundColorLabel->palette(); palette.setColor(ui->backGroundColorLabel->backgroundRole(), c); ui->backGroundColorLabel->setPalette(palette); backGroundColor=c; } else { QPalette palette = ui->imageBackGroundColorLabel->palette(); palette.setColor(ui->imageBackGroundColorLabel->backgroundRole(), c); ui->imageBackGroundColorLabel->setPalette(palette); imageBackGroundColor=c; } } } qsstv_9.2.6/qsstv/config/guiconfig.h0000664000175000017500000000135713203343610016203 0ustar jomajoma#ifndef GUICONFIG_H #define GUICONFIG_H #include #include "baseconfig.h" extern int galleryRows; extern int galleryColumns; extern bool imageStretch; extern QString defaultImageFormat; extern QColor backGroundColor; extern QColor imageBackGroundColor; extern bool slowCPU; extern bool lowRes; namespace Ui { class guiConfig; } class guiConfig :public baseConfig { Q_OBJECT public: explicit guiConfig(QWidget *parent = 0); ~guiConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); bool backGroundColorChanged; private slots: void slotBGColorSelect(); void slotIBGColorSelect(); private: Ui::guiConfig *ui; void setColorLabel(QColor c, bool image); }; #endif // GUICONFIG_H qsstv_9.2.6/qsstv/config/guiconfig.ui0000664000175000017500000001724313203343610016372 0ustar jomajoma guiConfig 0 0 548 446 Form Images 1 0 0 0 0 Background Color Qt::RightToLeft Stretch Image Background color 60 0 true QFrame::Box QFrame::Sunken 3 60 0 true QFrame::Box QFrame::Sunken 3 Gallery 1 0 0 0 0 Rows Columns Exit and restart QSSTV If slow CPU or Low Resolution has changed. Performance 1 0 0 0 0 Qt::LeftToRight Check if slow CPU Resolution 1 0 0 0 0 Qt::LeftToRight Check if Low Screen Resolution Qt::Vertical 20 238 qsstv_9.2.6/qsstv/config/hybridconfig.cpp0000664000175000017500000001100213203343610017217 0ustar jomajoma#include "hybridconfig.h" #include "ui_hybridconfig.h" #include "ftp.h" #include "hybridcrypt.h" #include bool enableHybridRx; //bool enableSpecialServer; int hybridFtpPort; QString hybridFtpRemoteHost; QString hybridFtpRemoteDirectory; QString hybridFtpLogin; QString hybridFtpPassword; QString hybridFtpHybridFilesDirectory; hybridConfig::hybridConfig(QWidget *parent) :baseConfig(parent), ui(new Ui::hybridConfig) { ui->setupUi(this); // connect(testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton())); connect(ui->testHybridPushButton,SIGNAL(clicked()),SLOT(slotTestHybridPushButton())); } hybridConfig::~hybridConfig() { delete ui; } void hybridConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("HYBRID"); enableHybridRx=qSettings.value("enableHybridRx",true).toBool(); // enableSpecialServer=qSettings.value("enableSpecialServer",false).toBool(); hybridFtpPort=qSettings.value("hybridFtpPort",21).toInt(); hybridFtpRemoteHost=qSettings.value("hybridFtpRemoteHost","").toString(); hybridFtpRemoteDirectory=qSettings.value("hybridFtpRemoteDirectory","").toString(); hybridFtpLogin=qSettings.value("hybridFtpLogin","").toString(); hybridFtpPassword=qSettings.value("hybridFtpPassword","").toString(); hybridFtpHybridFilesDirectory=qSettings.value("hybridFtpHybridFilesDirectory","HybridFiles1").toString(); qSettings.endGroup(); setParams(); } void hybridConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("HYBRID"); qSettings.setValue("enableHybridRx",enableHybridRx); // qSettings.setValue("enableSpecialServer",enableSpecialServer); qSettings.setValue("hybridFtpPort",hybridFtpPort); qSettings.setValue("hybridFtpRemoteHost",hybridFtpRemoteHost); qSettings.setValue("hybridFtpRemoteDirectory",hybridFtpRemoteDirectory); qSettings.setValue("hybridFtpLogin",hybridFtpLogin); qSettings.setValue("hybridFtpPassword",hybridFtpPassword); qSettings.setValue("hybridFtpHybridFilesDirectory",hybridFtpHybridFilesDirectory); qSettings.endGroup(); } void hybridConfig::getParams() { bool enableHybridRxCopy=enableHybridRx; // bool enableSpecialServerCopy=enableSpecialServer; int hybridFtpPortCopy=hybridFtpPort; QString hybridFtpRemoteHostCopy=hybridFtpRemoteHost; QString hybridFtpRemoteDirectoryCopy=hybridFtpRemoteDirectory; QString hybridFtpLoginCopy=hybridFtpLogin; QString hybridFtpPasswordCopy=hybridFtpPassword; getValue(enableHybridRx,ui->enableHybridRxCheckBox); // getValue(enableSpecialServer,ui->enableSpecialServerCheckBox); getValue(hybridFtpPort,ui->hybridFtpPortSpinBox); getValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit); getValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit); getValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit); getValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit); getValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit); changed=false; if( enableHybridRxCopy!=enableHybridRx // || enableSpecialServerCopy!=enableSpecialServer || hybridFtpPortCopy!=hybridFtpPort || hybridFtpRemoteHostCopy!=hybridFtpRemoteHost || hybridFtpRemoteDirectoryCopy!=hybridFtpRemoteDirectory || hybridFtpLoginCopy!=hybridFtpLogin || hybridFtpPasswordCopy!=hybridFtpPassword) changed=true; } void hybridConfig::setParams() { setValue(enableHybridRx,ui->enableHybridRxCheckBox); // setValue(enableSpecialServer,ui->enableSpecialServerCheckBox); setValue(hybridFtpPort,ui->hybridFtpPortSpinBox); setValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit); setValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit); setValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit); setValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit); setValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit); } void hybridConfig::slotTestHybridPushButton() { QString msg; ftpInterface fInt("TestHybridConnection"); ui->testHybridPushButton->setDisabled(true); getParams(); fInt.setupConnection(hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory); // fInt.setupConnection(hc.host(),hc.port(),hc.user(),hc.passwd(),hc.dir()+"/"+hybridFtpHybridFilesDirectory); msg=fInt.execFTPTest(); ui->testHybridPushButton->setDisabled(false); QMessageBox::information(this,"Test Connection",msg); } qsstv_9.2.6/qsstv/config/hybridconfig.h0000664000175000017500000000131713203343610016674 0ustar jomajoma#ifndef HYBRIDCONFIG_H #define HYBRIDCONFIG_H #include "baseconfig.h" extern bool enableHybridRx; //extern bool enableSpecialServer; extern int hybridFtpPort; extern QString hybridFtpRemoteHost; extern QString hybridFtpRemoteDirectory; extern QString hybridFtpLogin; extern QString hybridFtpPassword; extern QString hybridFtpHybridFilesDirectory; namespace Ui { class hybridConfig; } class hybridConfig : public baseConfig { Q_OBJECT public: explicit hybridConfig(QWidget *parent = 0); ~hybridConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private slots: void slotTestHybridPushButton(); private: Ui::hybridConfig *ui; }; #endif // HYBRIDCONFIG_H qsstv_9.2.6/qsstv/config/hybridconfig.ui0000664000175000017500000002641513203343610017070 0ustar jomajoma hybridConfig 0 0 730 372 Form Enable Reception in Hybrid Mode true Qt::Horizontal QSizePolicy::Expanding 20 20 FTP Port false true 1 10000 21 Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Host false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Login false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Password false QLineEdit::Password Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Directory false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Hybrid Files Directory false Qt::Horizontal QSizePolicy::Preferred 20 20 Qt::Horizontal 40 20 Test connection Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 38 qsstv_9.2.6/qsstv/config/hybridnotifyconfig.cpp0000664000175000017500000001104413203343610020456 0ustar jomajoma#include "hybridnotifyconfig.h" #include "ui_hybridnotifyconfig.h" #include "ftp.h" #include bool enableHybridNotify; bool enableHybridNotifySnoop; int hybridNotifyPort; QString hybridNotifyRemoteHost; QString hybridNotifyRemoteDir; QString hybridNotifyLogin; QString hybridNotifyPassword; QString hybridNotifyDir; hybridNotifyConfig::hybridNotifyConfig(QWidget *parent) :baseConfig(parent), ui(new Ui::hybridNotifyConfig) { ui->setupUi(this); // connect(testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton())); connect(ui->testNotifyPushButton,SIGNAL(clicked()),SLOT(slotTestNotifyPushButton())); } hybridNotifyConfig::~hybridNotifyConfig() { delete ui; } void hybridNotifyConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("HYBRID_NOTIFY"); enableHybridNotify=qSettings.value("enableHybridNotify",true).toBool(); enableHybridNotifySnoop=qSettings.value("enableHybridNotifySnoop",true).toBool(); hybridNotifyPort=qSettings.value("hybridNotifyPort",21).toInt(); hybridNotifyRemoteHost=qSettings.value("hybridNotifyRemoteHost","").toString(); hybridNotifyRemoteDir=qSettings.value("hybridNotifyRemoteDir","").toString(); hybridNotifyLogin=qSettings.value("hybridNotifyLogin","").toString(); hybridNotifyPassword=qSettings.value("hybridNotifyPassword","").toString(); hybridNotifyDir=qSettings.value("hybridNotifyDirectory","RxOkNotifications1").toString(); qSettings.endGroup(); setParams(); } void hybridNotifyConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("HYBRID_NOTIFY"); qSettings.setValue("enableHybridNotify",enableHybridNotify); qSettings.setValue("enableHybridNotifySnoop",enableHybridNotifySnoop); qSettings.setValue("hybridNotifyPort",hybridNotifyPort); qSettings.setValue("hybridNotifyRemoteHost",hybridNotifyRemoteHost); qSettings.setValue("hybridNotifyRemoteDir",hybridNotifyRemoteDir); qSettings.setValue("hybridNotifyLogin",hybridNotifyLogin); qSettings.setValue("hybridNotifyPassword",hybridNotifyPassword); qSettings.setValue("hybridNotifyDir",hybridNotifyDir); qSettings.endGroup(); } void hybridNotifyConfig::getParams() { bool enableHybridNotifyCopy=enableHybridNotify; bool enableHybridNotifySnoopCopy=enableHybridNotifySnoop; int hybridNotifyPortCopy=hybridNotifyPort; QString hybridNotifyRemoteHostCopy=hybridNotifyRemoteHost; QString hybridNotifyRemoteDirCopy=hybridNotifyRemoteDir; QString hybridNotifyDirCopy=hybridNotifyDir; QString hybridNotifyLoginCopy=hybridNotifyLogin; QString hybridNotifyPasswordCopy=hybridNotifyPassword; getValue(enableHybridNotify,ui->enableHybridNotifyCheckBox); getValue(enableHybridNotifySnoop,ui->enableHybridNotifySnoopCheckBox); getValue(hybridNotifyPort,ui->hybridNotifyPortSpinBox); getValue(hybridNotifyRemoteHost,ui->hybridNotifyRemoteHostLineEdit); getValue(hybridNotifyRemoteDir,ui->hybridNotifyRemoteDirLineEdit); getValue(hybridNotifyLogin,ui->hybridNotifyLoginLineEdit); getValue(hybridNotifyPassword,ui->hybridNotifyPasswordLineEdit); getValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit); changed=false; if( enableHybridNotifyCopy!=enableHybridNotify || enableHybridNotifySnoopCopy!=enableHybridNotifySnoop || hybridNotifyPortCopy!=hybridNotifyPort || hybridNotifyRemoteHostCopy!=hybridNotifyRemoteHost || hybridNotifyRemoteDirCopy!=hybridNotifyRemoteDir || hybridNotifyDirCopy!=hybridNotifyDir || hybridNotifyLoginCopy!=hybridNotifyLogin || hybridNotifyPasswordCopy!=hybridNotifyPassword) changed=true; } void hybridNotifyConfig::setParams() { setValue(enableHybridNotify,ui->enableHybridNotifyCheckBox); setValue(enableHybridNotifySnoop,ui->enableHybridNotifySnoopCheckBox); setValue(hybridNotifyPort,ui->hybridNotifyPortSpinBox); setValue(hybridNotifyRemoteHost,ui->hybridNotifyRemoteHostLineEdit); setValue(hybridNotifyRemoteDir,ui->hybridNotifyRemoteDirLineEdit); setValue(hybridNotifyLogin,ui->hybridNotifyLoginLineEdit); setValue(hybridNotifyPassword,ui->hybridNotifyPasswordLineEdit); setValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit); } void hybridNotifyConfig::slotTestNotifyPushButton() { QString msg; ftpInterface fInt("TestNotifyConnection"); ui->testNotifyPushButton->setDisabled(true); getParams(); fInt.setupConnection(hybridNotifyRemoteHost,hybridNotifyPort, hybridNotifyLogin,hybridNotifyPassword,hybridNotifyRemoteDir+"/"+hybridNotifyDir); msg=fInt.execFTPTest(); ui->testNotifyPushButton->setDisabled(false); QMessageBox::information(this,"Test Connection",msg); } qsstv_9.2.6/qsstv/config/hybridnotifyconfig.h0000664000175000017500000000140013203343610020116 0ustar jomajoma#ifndef HYBRIDNOTIFYCONFIG_H #define HYBRIDNOTIFYCONFIG_H #include "baseconfig.h" extern bool enableHybridNotify; extern bool enableHybridNotifySnoop; extern int hybridNotifyPort; extern QString hybridNotifyRemoteHost; extern QString hybridNotifyRemoteDir; extern QString hybridNotifyLogin; extern QString hybridNotifyPassword; extern QString hybridNotifyDir; namespace Ui { class hybridNotifyConfig; } class hybridNotifyConfig : public baseConfig { Q_OBJECT public: explicit hybridNotifyConfig(QWidget *parent = 0); ~hybridNotifyConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private slots: void slotTestNotifyPushButton(); private: Ui::hybridNotifyConfig *ui; }; #endif // HYBRIDNOTIFYCONFIG_H qsstv_9.2.6/qsstv/config/hybridnotifyconfig.ui0000664000175000017500000002745413203343610020325 0ustar jomajoma hybridNotifyConfig 0 0 806 388 Form 1 0 0 0 0 Send RX Notifications in Hybrid Mode true Qt::Horizontal 40 20 Check who else got it Qt::Horizontal QSizePolicy::Expanding 28 24 FTP Port false true 1 10000 21 6 0 0 0 0 0 0 145 25 Host false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Login false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Password false QLineEdit::Password Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Directory false Qt::Horizontal QSizePolicy::Preferred 20 20 6 0 0 0 0 0 0 145 25 Notifications Directory false Qt::Horizontal QSizePolicy::Preferred 20 20 Qt::Horizontal 40 20 Test connection Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 38 qsstv_9.2.6/qsstv/config/operatorconfig.cpp0000664000175000017500000000544313203343610017605 0ustar jomajoma#include "operatorconfig.h" #include "ui_operatorconfig.h" QString myCallsign; QString myQth; QString myLocator; QString myLastname; QString myFirstname; QString lastReceivedCall; bool onlineStatusEnabled; QString onlineStatusText; operatorConfig::operatorConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::operatorConfig) { ui->setupUi(this); } operatorConfig::~operatorConfig() { delete ui; } void operatorConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("PERSONAL"); myCallsign=qSettings.value("callsign",QString("NOCALL")).toString(); myQth=qSettings.value("qth",QString("NOWHERE")).toString(); myLastname=qSettings.value("lastname",QString("NONAME")).toString(); myFirstname=qSettings.value("firstname",QString("NOFIRSTNAME")).toString(); myLocator=qSettings.value("locator",QString("NOLOCATOR")).toString(); onlineStatusEnabled=qSettings.value("onlinestatusenabled",true).toBool(); onlineStatusText=qSettings.value("onlinestatustext",QString("")).toString(); qSettings.endGroup(); setParams(); } void operatorConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("PERSONAL"); qSettings.setValue("callsign",myCallsign); qSettings.setValue("qth",myQth); qSettings.setValue("locator",myLocator); qSettings.setValue("lastname",myLastname); qSettings.setValue("firstname",myFirstname); qSettings.setValue("onlinestatusenabled",onlineStatusEnabled); qSettings.setValue("onlinestatustext",onlineStatusText); qSettings.endGroup(); } void operatorConfig::getParams() { QString myCallsignCopy=myCallsign; QString myQthCopy=myQth; QString myLocatorCopy= myLocator; QString myLastnameCopy=myLastname; QString myFirstnameCopy=myFirstname; QString onlineStatusTextCopy=onlineStatusText; bool onlineStatusEnabledCopy=onlineStatusEnabled; getValue(myCallsign,ui->callsignLineEdit); getValue(myLastname,ui->lastnameLineEdit); getValue(myFirstname,ui->firstnameLineEdit); getValue(myQth,ui->qthLineEdit); getValue(myLocator,ui->locatorLineEdit); getValue(onlineStatusText,ui->onlineStatusText); getValue(onlineStatusEnabled,ui->onlineStatusCheckbox); changed=false; if( myCallsignCopy!=myCallsign || myQthCopy!=myQth || myLocatorCopy!= myLocator || myLastnameCopy!=myLastname || myFirstnameCopy!=myFirstname || onlineStatusEnabledCopy!=onlineStatusEnabled || onlineStatusTextCopy!=onlineStatusText) changed=true; } void operatorConfig::setParams() { setValue(myCallsign,ui->callsignLineEdit); setValue(myLastname,ui->lastnameLineEdit); setValue(myFirstname,ui->firstnameLineEdit); setValue(myQth,ui->qthLineEdit); setValue(myLocator,ui->locatorLineEdit); setValue(onlineStatusEnabled,ui->onlineStatusCheckbox); setValue(onlineStatusText,ui->onlineStatusText); } qsstv_9.2.6/qsstv/config/operatorconfig.h0000664000175000017500000000117413203343610017247 0ustar jomajoma#ifndef OPERATORCONFIG_H #define OPERATORCONFIG_H #include "baseconfig.h" extern QString myCallsign; extern QString myQth; extern QString myLocator; extern QString myLastname; extern QString myFirstname; extern QString lastReceivedCall; extern bool onlineStatusEnabled; extern QString onlineStatusText; namespace Ui { class operatorConfig; } class operatorConfig : public baseConfig { Q_OBJECT public: explicit operatorConfig(QWidget *parent = 0); ~operatorConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private: Ui::operatorConfig *ui; }; #endif // OPERATORCONFIG_H qsstv_9.2.6/qsstv/config/operatorconfig.ui0000664000175000017500000002017213203343610017434 0ustar jomajoma operatorConfig 0 0 680 272 Form 1 0 0 0 0 0 0 130 25 Firstname false Qt::AlignRight Qt::Horizontal QSizePolicy::Expanding 120 20 0 0 130 25 Lastname false Qt::AlignRight Qt::Horizontal QSizePolicy::Expanding 120 20 0 0 130 25 Callsign false Qt::AlignRight Qt::Horizontal QSizePolicy::Expanding 120 20 0 0 130 25 QTH false Qt::AlignRight Qt::Horizontal QSizePolicy::Expanding 120 20 0 0 130 25 Locator false Qt::AlignRight Qt::Horizontal QSizePolicy::Expanding 120 20 Allow other users to see your online status via the notification server Online Status Text 120 antenna, radio, operating freq or other info Qt::Vertical QSizePolicy::Expanding 21 30 qsstv_9.2.6/qsstv/config/repeaterconfig.cpp0000664000175000017500000001002313203343610017547 0ustar jomajoma#include "repeaterconfig.h" #include "ui_repeaterconfig.h" bool repeaterEnable; int repeaterImageInterval; esstvMode repeaterTxMode; QString repeaterImage1; QString repeaterImage2; QString repeaterImage3; QString repeaterImage4; QString repeaterAcknowledge; QString repeaterTemplate; QString idleTemplate; repeaterConfig::repeaterConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::repeaterConfig) { ui->setupUi(this); } repeaterConfig::~repeaterConfig() { delete ui; } void repeaterConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("REPEATER"); repeaterImageInterval=qSettings.value("repeaterImageInterval",10).toInt(); repeaterEnable=qSettings.value("repeaterEnable",false).toBool(); repeaterTxMode=(esstvMode)qSettings.value("repeaterTxMode",0).toInt(); repeaterImage1=qSettings.value("repeaterImage1","").toString(); repeaterImage2=qSettings.value("repeaterImage2","").toString(); repeaterImage3=qSettings.value("repeaterImage3","").toString(); repeaterImage4=qSettings.value("repeaterImage4","").toString(); repeaterAcknowledge=qSettings.value("repeaterAcknowledge","").toString(); repeaterTemplate=qSettings.value("repeaterTemplate","").toString(); idleTemplate=qSettings.value("idleTemplate","").toString(); qSettings.endGroup(); setParams(); } void repeaterConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("REPEATER"); qSettings.setValue("repeaterImageInterval",repeaterImageInterval); qSettings.setValue("repeaterEnable",repeaterEnable); qSettings.setValue("repeaterTxMode",repeaterTxMode); qSettings.setValue("repeaterImage1",repeaterImage1); qSettings.setValue("repeaterImage2",repeaterImage2); qSettings.setValue("repeaterImage3",repeaterImage3); qSettings.setValue("repeaterImage4",repeaterImage4); qSettings.setValue("repeaterAcknowledge",repeaterAcknowledge); qSettings.setValue("repeaterTemplate",repeaterTemplate); qSettings.setValue("idleTemplate",idleTemplate); qSettings.endGroup(); } void repeaterConfig::getParams() { int temp; bool repeaterEnableCopy=repeaterEnable; int repeaterImageIntervalCopy=repeaterImageInterval; esstvMode repeaterTxModeCopy=repeaterTxMode; QString repeaterImage1Copy=repeaterImage1; QString repeaterImage2Copy=repeaterImage2; QString repeaterImage3Copy=repeaterImage3; QString repeaterImage4Copy=repeaterImage4; QString repeaterAcknowledgeCopy=repeaterAcknowledge; QString repeaterTemplateCopy=repeaterTemplate; QString idleTemplateCopy=idleTemplate; getValue(repeaterImageInterval,ui->imageIntervalSpinBox); getValue(repeaterEnable,ui->repeaterEnableCheckBox); getIndex(temp,ui->repeaterTxModeComboBox); repeaterTxMode=(esstvMode)temp; getValue(repeaterImage1,ui->repeaterImage1LineEdit); getValue(repeaterImage2,ui->repeaterImage2LineEdit); getValue(repeaterImage3,ui->repeaterImage3LineEdit); getValue(repeaterImage4,ui->repeaterImage4LineEdit); getValue(idleTemplate,ui->idleTemplateLineEdit); getValue(repeaterTemplate,ui->repeaterTemplateLineEdit); changed=false; if( repeaterEnableCopy!=repeaterEnable || repeaterImageIntervalCopy!=repeaterImageInterval || repeaterTxModeCopy!=repeaterTxMode || repeaterImage1Copy!=repeaterImage1 || repeaterImage2Copy!=repeaterImage2 || repeaterImage3Copy!=repeaterImage3 || repeaterImage4Copy!=repeaterImage4 || repeaterAcknowledgeCopy!=repeaterAcknowledge || repeaterTemplateCopy!=repeaterTemplate || idleTemplateCopy!=idleTemplate) changed=true; } void repeaterConfig::setParams() {; setValue(repeaterImageInterval,ui->imageIntervalSpinBox); setValue(repeaterEnable,ui->repeaterEnableCheckBox); setIndex(repeaterTxMode,ui->repeaterTxModeComboBox); setValue(repeaterImage1,ui->repeaterImage1LineEdit); setValue(repeaterImage2,ui->repeaterImage2LineEdit); setValue(repeaterImage3,ui->repeaterImage3LineEdit); setValue(repeaterImage4,ui->repeaterImage4LineEdit); setValue(idleTemplate,ui->idleTemplateLineEdit); setValue(repeaterTemplate,ui->repeaterTemplateLineEdit); } qsstv_9.2.6/qsstv/config/repeaterconfig.h0000664000175000017500000000136113203343610017221 0ustar jomajoma#ifndef REPEATERCONFIG_H #define REPEATERCONFIG_H #include "baseconfig.h" #include "sstv/sstvparam.h" extern bool repeaterEnable; extern int repeaterImageInterval; extern esstvMode repeaterTxMode; extern QString repeaterImage1; extern QString repeaterImage2; extern QString repeaterImage3; extern QString repeaterImage4; extern QString repeaterAcknowledge; extern QString repeaterTemplate; extern QString idleTemplate; namespace Ui { class repeaterConfig; } class repeaterConfig : public baseConfig { Q_OBJECT public: explicit repeaterConfig(QWidget *parent = 0); ~repeaterConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private: Ui::repeaterConfig *ui; }; #endif // REPEATERCONFIG_H qsstv_9.2.6/qsstv/config/repeaterconfig.ui0000664000175000017500000002436613203343610017421 0ustar jomajoma repeaterConfig 0 0 624 474 Form Enable Repeater Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 0 0 0 Image Interval (min) false 5 Qt::Horizontal QSizePolicy::Expanding 60 20 6 0 0 0 0 Repeater TX mode false 6 0 0 0 0 Idle Image 1 false false 0 0 Browse ... 6 0 0 0 0 Idle Image 2 false false 0 0 Browse ... 6 0 0 0 0 Idle Image 3 false false 0 0 Browse ... 6 0 0 0 0 Idle Image 4 false false 0 0 Browse ... Idle Template false 0 0 Browse ... Repeater Template false 0 0 Browse ... Qt::Vertical 20 202 qsstv_9.2.6/qsstv/config/rigconfig.cpp0000664000175000017500000002270213203343610016530 0ustar jomajoma#include "rigconfig.h" #include "ui_rigconfig.h" #include "appglobal.h" #include "configparams.h" #include "utils/supportfunctions.h" #include "rigcontrol.h" #include #include rigConfig::rigConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::rigConfig) { ui->setupUi(this); connect(ui->enableCATCheckBox,SIGNAL(clicked()),SLOT(slotEnableCAT())); connect(ui->enablePTTCheckBox,SIGNAL(clicked()),SLOT(slotEnablePTT())); connect(ui->enableXMLRPCCheckBox,SIGNAL(clicked()),SLOT(slotEnableXMLRPC())); connect(ui->restartPushButton,SIGNAL(clicked()),SLOT(slotRestart())); connect(ui->RTSCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT0())); connect(ui->DTRCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT1())); connect(ui->nRTSCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT2())); connect(ui->nDTRCheckBox,SIGNAL(clicked()),SLOT(slotCheckPTT3())); rigController=NULL; cp=NULL; } rigConfig::~rigConfig() { delete ui; } void rigConfig::attachRigController(rigControl *rigCtrl) { rigController=rigCtrl; } void rigConfig::readSettings() { cp=rigController->params(); QSettings qSettings; qSettings.beginGroup(cp->configLabel); cp->serialPort=qSettings.value("serialPort","/dev/ttyS0").toString(); cp->radioModel=qSettings.value("radioModel","dummy").toString(); cp->civAddress=qSettings.value("civAddress","").toString(); cp->baudrate=qSettings.value("baudrate",9600).toInt(); cp->parity=qSettings.value("parity","None").toString(); cp->stopbits=qSettings.value("stopbits",1).toInt(); cp->databits=qSettings.value("databits",8).toInt(); cp->handshake=qSettings.value("handshake","None").toString(); cp->enableCAT=qSettings.value("enableCAT",0).toBool(); cp->enableSerialPTT=qSettings.value("enableSerialPTT",0).toBool(); cp->pttSerialPort=qSettings.value("pttSerialPort","/dev/ttyS0").toString(); cp->activeRTS=qSettings.value("activeRTS",1).toBool(); cp->activeDTR=qSettings.value("activeDTR",0).toBool(); cp->nactiveRTS=qSettings.value("nactiveRTS",1).toBool(); cp->nactiveDTR=qSettings.value("nactiveDTR",0).toBool(); cp->enableXMLRPC=qSettings.value("enableXMLRPC",0).toBool(); cp->XMLRPCPort=qSettings.value("XMLRPCPort","7362").toInt(); cp->txOnDelay=qSettings.value("txOnDelay",0.0).toDouble(); cp->pttType=(ptt_type_t)qSettings.value("pttType",(int)RIG_PTT_RIG).toInt(); qSettings.endGroup(); setParams(); } void rigConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup(cp->configLabel); qSettings.setValue("serialPort",cp->serialPort); qSettings.setValue("radioModel",cp->radioModel); qSettings.setValue("civAddress",cp->civAddress); qSettings.setValue("baudrate",cp->baudrate); qSettings.setValue("parity",cp->parity); qSettings.setValue("stopbits",cp->stopbits); qSettings.setValue("databits",cp->databits); qSettings.setValue("handshake",cp->handshake); qSettings.setValue("enableCAT",cp->enableCAT); qSettings.setValue("enableSerialPTT",cp->enableSerialPTT); qSettings.setValue("pttSerialPort",cp->pttSerialPort); qSettings.setValue("activeRTS",cp->activeRTS); qSettings.setValue("activeDTR",cp->activeDTR); qSettings.setValue("nactiveRTS",cp->nactiveRTS); qSettings.setValue("nactiveDTR",cp->nactiveDTR); qSettings.setValue("pttType",(int) cp->pttType); qSettings.setValue("enableXMLRPC",cp->enableXMLRPC); qSettings.setValue("XMLRPCPort",cp->XMLRPCPort); qSettings.setValue("txOnDelay",cp->txOnDelay); qSettings.endGroup(); } void rigConfig::getParams() { scatParams *cpCopy=new scatParams; *cpCopy=*cp; getValue(cp->serialPort,ui->serialPortLineEdit); if(ui->radioModelComboBox->count()!=0) getValue(cp->radioModel,ui->radioModelComboBox); getValue(cp->civAddress,ui->civAddressLineEdit); getValue(cp->baudrate,ui->baudrateComboBox); getValue(cp->parity,ui->parityComboBox); getValue(cp->stopbits,ui->stopbitsComboBox); getValue(cp->databits,ui->databitsComboBox); getValue(cp->handshake,ui->handshakeComboBox); getValue(cp->enableCAT,ui->enableCATCheckBox); getValue(cp->enableSerialPTT,ui->enablePTTCheckBox); getValue(cp->pttSerialPort,ui->pttSerialPortLineEdit); getValue(cp->activeRTS,ui->RTSCheckBox); getValue(cp->activeDTR,ui->DTRCheckBox); getValue(cp->nactiveRTS,ui->nRTSCheckBox); getValue(cp->nactiveDTR,ui->nDTRCheckBox); if(ui->catVoiceRadioButton->isChecked()) cp->pttType=RIG_PTT_RIG; if(ui->catDataRadioButton->isChecked()) cp->pttType=RIG_PTT_RIG_MICDATA; if(ui->rtsRadioButton->isChecked()) cp->pttType=RIG_PTT_SERIAL_RTS; if(ui->dtrRadioButton->isChecked()) cp->pttType=RIG_PTT_SERIAL_DTR; getValue(cp->txOnDelay,ui->txOnDelayDoubleSpinBox); getValue(cp->enableXMLRPC,ui->enableXMLRPCCheckBox); getValue(cp->XMLRPCPort,ui->XMLRPCPortLineEdit); changed=false; if( cpCopy->serialPort!=cp->serialPort || cpCopy->radioModel!=cp->radioModel || cpCopy->civAddress!=cp->civAddress || cpCopy->baudrate!=cp->baudrate || cpCopy->stopbits!=cp->stopbits || cpCopy->databits!=cp->databits || cpCopy->handshake!=cp->handshake || cpCopy->enableCAT!=cp->enableCAT || cpCopy->enableSerialPTT!=cp->enableSerialPTT || cpCopy->pttSerialPort!=cp->pttSerialPort || cpCopy->activeRTS!=cp->activeRTS || cpCopy->activeDTR!=cp->activeDTR || cpCopy->nactiveRTS!=cp->nactiveRTS || cpCopy->nactiveDTR!=cp->nactiveDTR || cpCopy->pttType!=cp->pttType || cpCopy->enableXMLRPC!=cp->enableXMLRPC || cpCopy->XMLRPCPort!=cp->XMLRPCPort ) changed=true; delete cpCopy; } void rigConfig::setParams() { if(rigController->getRadioList(ui->radioModelComboBox)) setValue(cp->radioModel,ui->radioModelComboBox); setValue(cp->serialPort,ui->serialPortLineEdit); setValue(cp->civAddress,ui->civAddressLineEdit); setValue(cp->baudrate,ui->baudrateComboBox); setValue(cp->parity,ui->parityComboBox); setValue(cp->stopbits,ui->stopbitsComboBox); setValue(cp->databits,ui->databitsComboBox); setValue(cp->handshake,ui->handshakeComboBox); setValue(cp->enableCAT,ui->enableCATCheckBox); setValue(cp->enableSerialPTT,ui->enablePTTCheckBox); setValue(cp->pttSerialPort,ui->pttSerialPortLineEdit); if(cp->activeRTS) cp->nactiveRTS=false; if(cp->activeDTR) cp->nactiveDTR=false; setValue(cp->activeRTS,ui->RTSCheckBox); setValue(cp->activeDTR,ui->DTRCheckBox); setValue(cp->nactiveRTS,ui->nRTSCheckBox); setValue(cp->nactiveDTR,ui->nDTRCheckBox); switch(cp->pttType) { case RIG_PTT_RIG: setValue(true,ui->catVoiceRadioButton); break; case RIG_PTT_RIG_MICDATA: setValue(true,ui->catDataRadioButton); break; case RIG_PTT_SERIAL_RTS: setValue(true,ui->rtsRadioButton); break; case RIG_PTT_SERIAL_DTR: setValue(true,ui->dtrRadioButton); break; default: setValue(true,ui->catVoiceRadioButton); break; } if(cp->enableCAT && cp->enableSerialPTT) { if(cp->serialPort==cp->pttSerialPort) { cp->enableSerialPTT=false; } } setValue(cp->enableSerialPTT,ui->enablePTTCheckBox); setValue(cp->txOnDelay,ui->txOnDelayDoubleSpinBox); setValue(cp->enableXMLRPC,ui->enableXMLRPCCheckBox); setValue(cp->XMLRPCPort,ui->XMLRPCPortLineEdit); } void rigConfig::slotEnableCAT() { if(ui->enableCATCheckBox->isChecked() && ui->enablePTTCheckBox->isChecked()) { if(ui->pttSerialPortLineEdit->text()==ui->serialPortLineEdit->text()) { QMessageBox::critical(this,"Configuration error", "The PTT serialport must be different from the CAT serial port if both are enabled"); ui->enablePTTCheckBox->setChecked(false); } } if(ui->enableCATCheckBox->isChecked()) { ui->enableXMLRPCCheckBox->setChecked(false); rigController->init(); } else { rigController->disable(); } getParams(); } void rigConfig::slotEnablePTT() { if(ui->enableCATCheckBox->isChecked() && ui->enablePTTCheckBox->isChecked()) { if(ui->pttSerialPortLineEdit->text()==ui->serialPortLineEdit->text()) { QMessageBox::critical(this,"Configuration error", "The PTT serialport must be different from the CAT serial port if both are enabled"); ui->enablePTTCheckBox->setChecked(false); return; } } if(ui->enablePTTCheckBox->isChecked()) { ui->enableXMLRPCCheckBox->setChecked(false); } getParams(); } void rigConfig::slotEnableXMLRPC() { ui->enableCATCheckBox->setChecked(false); ui->enablePTTCheckBox->setChecked(false); } void rigConfig::slotRestart() { getParams(); if(ui->enableCATCheckBox->isChecked()) { if(rigController->init()) { ui->restartPushButton->setStyleSheet("background-color: green"); } else { ui->restartPushButton->setStyleSheet("background-color: red"); } } } void rigConfig::slotCheckPTT0() { checkPTT(0,ui->RTSCheckBox->isChecked()); } void rigConfig::slotCheckPTT1() {checkPTT(1,ui->DTRCheckBox->isChecked()); } void rigConfig::slotCheckPTT2() { checkPTT(2,ui->nRTSCheckBox->isChecked()); } void rigConfig::slotCheckPTT3() { checkPTT(3,ui->nDTRCheckBox->isChecked()); } void rigConfig::checkPTT(int p,bool b) { if(!b) return; switch (p) { case 0: setValue(false,ui->nRTSCheckBox); break; case 1: setValue(false,ui->nDTRCheckBox); break; case 2: setValue(false,ui->RTSCheckBox); break; case 3: setValue(false,ui->DTRCheckBox); break; } } qsstv_9.2.6/qsstv/config/rigconfig.h0000664000175000017500000000134513203343610016175 0ustar jomajoma#ifndef RIGCONFIG_H #define RIGCONFIG_H #include "baseconfig.h" class rigControl; struct scatParams; namespace Ui { class rigConfig; } class rigConfig : public baseConfig { Q_OBJECT public: explicit rigConfig(QWidget *parent = 0); ~rigConfig(); void attachRigController(rigControl *rigCtrl); void readSettings(); void writeSettings(); void getParams(); void setParams(); public slots: void slotEnableCAT(); void slotEnablePTT(); void slotEnableXMLRPC(); void slotRestart(); void slotCheckPTT0(); void slotCheckPTT1(); void slotCheckPTT2(); void slotCheckPTT3(); private: Ui::rigConfig *ui; scatParams *cp; rigControl *rigController; void checkPTT(int p,bool b); }; #endif // RIGCONFIG_H qsstv_9.2.6/qsstv/config/rigconfig.ui0000664000175000017500000006016313203343610016366 0ustar jomajoma rigConfig 0 0 633 426 9 Form 1 0 0 0 0 true Special Serial Port 1 0 0 0 0 Enable PTT serial Interface Qt::Horizontal 19 20 60 0 PTT Serial Port Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Qt::Horizontal 20 20 +RTS +DTR -RTS -DTR Qt::Horizontal 19 20 true Hamlib Control 1 0 0 0 0 Enable Hamlib Cat Interface 1 60 0 Radio Model Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Ubuntu Mono 75 false true false 60 0 CIV Address Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 50 16777215 108 0 Serial Port/Host Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 1 60 0 Parity Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 70 16777215 None Odd Even 60 0 Databits Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 7 8 60 0 Baudrate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 70 16777215 5 300 600 1200 2400 4800 9600 19200 38400 57600 115200 230400 460800 60 0 StopBits Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 1 2 60 0 Handshake Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 None Hardware XOn/XOff Qt::Horizontal 40 20 PTT Control via: true CAT (Voice port) true true CAT (Data port) RTS DTR Qt::Horizontal 40 20 Qt::Horizontal 40 20 Restart CAT Interface Qt::Horizontal 40 20 true XMLRPC Interface 1 0 0 0 0 Enable XMLRPC Interface Qt::Horizontal 138 20 60 0 Port Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Qt::Horizontal 138 20 60 0 TX on Delay Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 1 5.000000000000000 0.100000000000000 60 0 in seconds Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Qt::Horizontal 40 20 Qt::Vertical 20 17 qsstv_9.2.6/qsstv/config/soundconfig.cpp0000664000175000017500000001432313203343610017077 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "soundconfig.h" #include "ui_soundconfig.h" #include "configparams.h" #include "supportfunctions.h" #include "soundalsa.h" #include #include int samplingrate; double rxClock; double txClock; bool pulseSelected; bool alsaSelected; bool swapChannel; bool pttToneOtherChannel; QString inputAudioDevice; QString outputAudioDevice; soundBase::edataSrc soundRoutingInput; soundBase::edataDst soundRoutingOutput; quint32 recordingSize; soundConfig::soundConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::soundConfig) { QStringList inputPCMList, outputPCMList; ui->setupUi(this); getCardList(inputPCMList, outputPCMList); ui->inputPCMNameComboBox->addItems(inputPCMList); ui->outputPCMNameComboBox->addItems(outputPCMList); } soundConfig::~soundConfig() { delete ui; } void soundConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("SOUND"); rxClock=qSettings.value("rxclock",BASESAMPLERATE).toDouble(); txClock=qSettings.value("txclock",BASESAMPLERATE).toDouble(); if(fabs(1-rxClock/BASESAMPLERATE)>0.002) rxClock=BASESAMPLERATE; if(fabs(1-txClock/BASESAMPLERATE)>0.002) txClock=BASESAMPLERATE; samplingrate=BASESAMPLERATE; inputAudioDevice=qSettings.value("inputAudioDevice","default").toString(); outputAudioDevice=qSettings.value("outputAudioDevice","default").toString(); alsaSelected=qSettings.value("alsaSelected",false).toBool(); pulseSelected=qSettings.value("pulseSelected",false).toBool(); swapChannel=qSettings.value("swapChannel",false).toBool(); pttToneOtherChannel=qSettings.value("pttToneOtherChannel",false).toBool(); soundRoutingInput= (soundBase::edataSrc)qSettings.value("soundRoutingInput", 0 ).toInt(); soundRoutingOutput= (soundBase::edataDst)qSettings.value("soundRoutingOutput", 0 ).toInt(); recordingSize= qSettings.value("recordingSize", 100 ).toInt(); qSettings.endGroup(); setParams(); } void soundConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("SOUND"); qSettings.setValue("rxclock",rxClock); qSettings.setValue("txclock",txClock); qSettings.setValue("inputAudioDevice",inputAudioDevice); qSettings.setValue("outputAudioDevice",outputAudioDevice); qSettings.setValue("alsaSelected",alsaSelected); qSettings.setValue("pulseSelected",pulseSelected); qSettings.setValue("swapChannel",swapChannel); qSettings.setValue("pttToneOtherChannel",pttToneOtherChannel); qSettings.setValue ("soundRoutingInput", soundRoutingInput ); qSettings.setValue ("soundRoutingOutput",soundRoutingOutput ); qSettings.setValue ("recordingSize",recordingSize ); qSettings.endGroup(); } void soundConfig::setParams() { setValue(rxClock,ui->inputClockLineEdit,9); setValue(txClock,ui->outputClockLineEdit,9); setValue(inputAudioDevice,ui->inputPCMNameComboBox); setValue(outputAudioDevice,ui->outputPCMNameComboBox); setValue(alsaSelected,ui->alsaRadioButton); setValue(pulseSelected,ui->pulseRadioButton); setValue(swapChannel,ui->swapChannelCheckBox); setValue(pttToneOtherChannel,ui->pttToneCheckBox); if(soundRoutingInput==soundBase::SNDINCARD) ui->inFromCard->setChecked(true); else if (soundRoutingInput==soundBase::SNDINFROMFILE) ui->inFromFile->setChecked(true); else ui->inRecordFromCard->setChecked(true); if(soundRoutingOutput==soundBase::SNDOUTCARD) ui->outToCard->setChecked(true); else ui->outRecord->setChecked(true); setValue(recordingSize,ui->mbSpinBox); } void soundConfig::getParams() { QString inputAudioDeviceCopy=inputAudioDevice; QString outputAudioDeviceCopy=outputAudioDevice; bool alsaSelectedCopy=alsaSelected; soundBase::edataSrc soundRoutingInputCopy=soundRoutingInput; soundBase::edataDst soundRoutingOutputCopy=soundRoutingOutput; getValue(rxClock,ui->inputClockLineEdit); getValue(txClock,ui->inputClockLineEdit); getValue(inputAudioDevice,ui->inputPCMNameComboBox); getValue(outputAudioDevice,ui->outputPCMNameComboBox); getValue(alsaSelected,ui->alsaRadioButton); getValue(pulseSelected,ui->pulseRadioButton); getValue(swapChannel,ui->swapChannelCheckBox); getValue(pttToneOtherChannel,ui->pttToneCheckBox); if (ui->inFromCard->isChecked()) soundRoutingInput=soundBase::SNDINCARD; else if(ui->inFromFile->isChecked()) soundRoutingInput=soundBase::SNDINFROMFILE; else soundRoutingInput=soundBase::SNDINCARDTOFILE; if (ui->outToCard->isChecked()) soundRoutingOutput=soundBase::SNDOUTCARD; else soundRoutingOutput=soundBase::SNDOUTTOFILE; getValue(recordingSize,ui->mbSpinBox); changed=false; if(inputAudioDeviceCopy!=inputAudioDevice || outputAudioDeviceCopy!=outputAudioDevice || soundRoutingInputCopy!=soundRoutingInput || soundRoutingOutputCopy!=soundRoutingOutput || alsaSelectedCopy!=alsaSelected) { changed=true; } } qsstv_9.2.6/qsstv/config/soundconfig.h0000664000175000017500000000142013203343610016536 0ustar jomajoma#ifndef soundConfig_H #define soundConfig_H #include "baseconfig.h" #include "soundbase.h" extern int samplingrate; extern double rxClock; extern double txClock; extern bool pulseSelected; extern bool alsaSelected; extern bool swapChannel; extern bool pttToneOtherChannel; extern QString inputAudioDevice; extern QString outputAudioDevice; extern soundBase::edataSrc soundRoutingInput; extern soundBase::edataDst soundRoutingOutput; extern quint32 recordingSize; namespace Ui { class soundConfig; } class soundConfig : public baseConfig { Q_OBJECT public: explicit soundConfig(QWidget *parent = 0); ~soundConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); private: Ui::soundConfig *ui; }; #endif // soundConfig_H qsstv_9.2.6/qsstv/config/soundconfig.ui0000664000175000017500000002361313203343610016734 0ustar jomajoma soundConfig 0 0 490 326 Form 1 0 0 0 0 Audio Interface 1 0 0 0 0 ALSA 1 0 0 0 25 Input Audio Device false 0 0 0 25 Output Audio Device false PulseAudio true 0 0 0 0 Input Clock Frequency false 0 0 0 0 Output Clock Frequency false Sound Input 1 0 0 0 0 From sound card true From file From sound card and record Sound Output 1 0 0 0 0 To sound card true To sound card and record Swap left and right channel PTT tone on other audio channel 1 999 5 100 Maximum recording size (in MB) false Qt::Horizontal QSizePolicy::Expanding 51 20 Qt::Vertical 20 25 qsstv_9.2.6/qsstv/config/waterfallconfig.cpp0000664000175000017500000000621513203343610017731 0ustar jomajoma#include "waterfallconfig.h" #include "ui_waterfallconfig.h" #include QString startPicWF; QString endPicWF; QString fixWF; QString bsrWF; QString startBinWF; QString endBinWF; QString wfFont; int wfFontSize; bool wfBold; QString sampleString; waterfallConfig::waterfallConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::waterfallConfig) { ui->setupUi(this); connect(ui->fontComboBox,SIGNAL(currentIndexChanged(QString)),SLOT(slotFontChanged())); connect(ui->sizeSpinBox,SIGNAL(valueChanged(int)),SLOT(slotFontChanged())); connect(ui->boldCheckBox,SIGNAL(clicked(bool)),SLOT(slotFontChanged())); } waterfallConfig::~waterfallConfig() { delete ui; } void waterfallConfig::readSettings() { QSettings qSettings; qSettings.beginGroup("WATERFALL"); startPicWF=qSettings.value("startPicWF","START PIC").toString(); endPicWF=qSettings.value("endPicWF","END PIC").toString(); fixWF=qSettings.value("fixWF","FIX").toString(); bsrWF=qSettings.value("bsrWF","BSR").toString(); startBinWF=qSettings.value("startBinWF","START BIN").toString(); endBinWF=qSettings.value("endBinWF","END BIN").toString(); wfFont=qSettings.value("wfFont","Arial").toString(); wfFontSize=qSettings.value("wfFontSize",12).toInt(); wfBold=qSettings.value("wfBold",false).toBool(); sampleString=qSettings.value("sampleString","Sample Text").toString(); qSettings.endGroup(); setParams(); } void waterfallConfig::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("WATERFALL"); qSettings.setValue("startPicWF",startPicWF); qSettings.setValue("endPicWF",endPicWF); qSettings.setValue("fixWF",fixWF); qSettings.setValue("bsrWF",bsrWF); qSettings.setValue("startBinWF",startBinWF); qSettings.setValue("endBinWF",endBinWF); qSettings.setValue("wfFont",wfFont); qSettings.setValue("wfFontSize",wfFontSize); qSettings.setValue("wfBold",wfBold); qSettings.setValue("sampleString",sampleString); qSettings.endGroup(); } void waterfallConfig::getParams() { getValue(startPicWF,ui->startPicTextEdit); getValue(endPicWF,ui->endPicTextEdit); getValue(fixWF,ui->fixTextEdit); getValue(bsrWF,ui->bsrTextEdit); getValue(startBinWF,ui->startBinTextEdit); getValue(endBinWF,ui->endBinTextEdit); getValue(wfFont,ui->fontComboBox); getValue(wfFontSize,ui->sizeSpinBox); getValue(wfBold,ui->boldCheckBox); getValue(sampleString,ui->sampleLineEdit); } void waterfallConfig::setParams() { setValue(startPicWF,ui->startPicTextEdit); setValue(endPicWF,ui->endPicTextEdit); setValue(fixWF,ui->fixTextEdit); setValue(bsrWF,ui->bsrTextEdit); setValue(startBinWF,ui->startBinTextEdit); setValue(endBinWF,ui->endBinTextEdit); ui->fontComboBox->blockSignals(true); ui->sizeSpinBox->blockSignals(true); setValue(sampleString,ui->sampleLineEdit); setValue(wfFont,ui->fontComboBox); setValue(wfFontSize,ui->sizeSpinBox); ui->fontComboBox->blockSignals(false); ui->sizeSpinBox->blockSignals(false); setValue(wfBold,ui->boldCheckBox); slotFontChanged(); } void waterfallConfig::slotFontChanged() { getParams(); QFont f(wfFont); f.setBold(wfBold); f.setPixelSize(wfFontSize); ui->sampleLineEdit->setFont(f); } qsstv_9.2.6/qsstv/config/waterfallconfig.h0000664000175000017500000000124013203343610017367 0ustar jomajoma#ifndef WATERFALLCONFIG_H #define WATERFALLCONFIG_H #include "baseconfig.h" extern QString startPicWF; extern QString endPicWF; extern QString fixWF; extern QString bsrWF; extern QString startBinWF; extern QString endBinWF; extern QString wfFont; extern int wfFontSize; extern bool wfBold; namespace Ui { class waterfallConfig; } class waterfallConfig : public baseConfig { Q_OBJECT public: explicit waterfallConfig(QWidget *parent = 0); ~waterfallConfig(); void readSettings(); void writeSettings(); void getParams(); void setParams(); public slots: void slotFontChanged(); private: Ui::waterfallConfig *ui; }; #endif // WATERFALLCONFIG_H qsstv_9.2.6/qsstv/config/waterfallconfig.ui0000664000175000017500000001610713203343610017565 0ustar jomajoma waterfallConfig 0 0 683 437 Form 1 0 0 0 0 0 0 FIX false Start Binary 0 0 BSR false 0 0 0 0 0 0 End Picture false 0 0 16777215 16777215 2 1 0 0 Start Picture false 0 0 0 0 0 0 End Binary 0 0 0 0 Qt::Vertical 20 3 Font Size 8 12 Qt::RightToLeft Bold Sample fontLabel fontLabel qsstv_9.2.6/qsstv/dispatch/dispatcher.cpp0000664000175000017500000004562213203343610017247 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*! The dispatcher is the central system that routes all messages from the different threads. It also starts, stops and synchronizes the threads. */ #include "dispatcher.h" #include "appglobal.h" #include "configparams.h" #include "rxwidget.h" #include "txwidget.h" #include "gallerywidget.h" #include "widgets/spectrumwidget.h" #include "widgets/vumeter.h" #include "rxfunctions.h" #include "mainwindow.h" #include "utils/ftp.h" #include "rigcontrol.h" #include "logbook/logbook.h" #include "dirdialog.h" #include #include /*! creates dispatcher instance */ dispatcher::dispatcher() { mbox=NULL; progressFTP=NULL; lastFileName.clear(); prTimerIndex=0; } /*! delete dispatcher instance */ dispatcher::~dispatcher() { } void dispatcher::init() { editorActive=false; infoTextPtr=new textDisplay(mainWindowPtr); mainWindowPtr->spectrumFramePtr->init(RXSTRIPE,1,BASESAMPLERATE/SUBSAMPLINGFACTOR); infoTextPtr->hide(); setOnlineStatus(true, onlineStatusText); connect(notifyRXIntf, SIGNAL(notification(QString)), this, SLOT(slotRXNotification(QString))); connect(notifyTXIntf, SIGNAL(notification(QString)), this, SLOT(slotTXNotification(QString))); connect(hybridTxIntf, SIGNAL(commandsDone(bool)), this, SLOT(slotHybridTxDone(bool))); } void dispatcher::setOnlineStatus(bool online, QString info) { txWidgetPtr->functionsPtr()->setOnlineStatus(online, info); // TODO: move to rxWidget->functions->? if (!online && enableFTP) { ftpInterface rxftp("RX Image Cleanup"); rxftp.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory); rxftp.uploadToRXServer(""); // mark SSTV offline rxftp.changePath(ftpRemoteDRMDirectory); rxftp.uploadToRXServer(""); // mark DSSTV/DRM offline } } void dispatcher::who() { txWidgetPtr->functionsPtr()->who(); } /*! All communication between the threads are passed via this eventhandler. */ void dispatcher::customEvent( QEvent * e ) { dispatchEventType type; ftpInterface * iPtr; QString fn; type=(dispatchEventType)e->type(); addToLog(((baseEvent*)e)->description,LOGDISPATCH); switch(type) { case displayFFT: addToLog("dispatcher: displayFFT",LOGDISPATCH); mainWindowPtr->spectrumFramePtr->realFFT(((displayFFTEvent*)e)->data()); rxWidgetPtr->vMeterPtr()->setValue(soundIOPtr->getVolumeDb()); // addToLog(QString::number(soundIOPtr->getVolumeDb()),LOGALL); break; case displaySync: // addToLog("dispatcher: displaySync",LOGDISPATCH); uint s; ((displaySyncEvent*)e)->getInfo(s); rxWidgetPtr->sMeterPtr()->setValue((double)s); break; case rxSSTVStatus: rxWidgetPtr->setSSTVStatusText(((rxSSTVStatusEvent*)e)->getStr()); break; case startImageRX: addToLog("dispatcher: clearing RxImage",LOGDISPATCH); // rxWidgetPtr->getImageViewerPtr()->createImage( ((startImageRXEvent*)e)->getSize(),QColor(0,0,128),imageStretch); rxWidgetPtr->getImageViewerPtr()->createImage( ((startImageRXEvent*)e)->getSize(),imageBackGroundColor,imageStretch); lastCallsign=""; break; case lineDisplay: { rxWidgetPtr->getImageViewerPtr()->displayImage(); } break; case endSSTVImageRX: if(autoSave) { addToLog("dispatcher:endImage savingRxImage",LOGDISPATCH); saveRxSSTVImage(((endImageSSTVRXEvent*)e)->getModeName()); } break; case rxDRMStatus: rxWidgetPtr->setDRMStatusText(((rxDRMStatusEvent*)e)->getStr()); break; case statusBarMsg: statusBarPtr->showMessage(((statusBarMsgEvent*)e)->getStr()); break; case callEditor: if(editorActive) break; editorActive=true; ed=new editor(); ed->show(); iv=((callEditorEvent*)e)->getImageViewer(); addToLog (QString(" callEditorEvent imageViewPtr: %1").arg(QString::number((ulong)iv,16)),LOGDISPATCH); addToLog(QString("editor: filename %1").arg(((callEditorEvent*)e)->getFilename()),LOGDISPATCH); ed->openFile(((callEditorEvent*)e)->getFilename()); break; case rxDRMNotify: rxWidgetPtr->setDRMNotifyText(((rxDRMNotifyEvent*)e)->getStr()); break; case rxDRMNotifyAppend: rxWidgetPtr->appendDRMNotifyText(((rxDRMNotifyAppendEvent*)e)->getStr()); break; case txDRMNotify: txWidgetPtr->setDRMNotifyText(((txDRMNotifyEvent*)e)->getStr()); break; case txDRMNotifyAppend: txWidgetPtr->appendDRMNotifyText(((txDRMNotifyAppendEvent*)e)->getStr()); break; case txPrepareComplete: txWidgetPtr->prepareTxComplete(((txPrepareCompleteEvent *)e)->ok()); break; case editorFinished: if(!editorActive) break; if(((editorFinishedEvent*)e)->isOK()) { addToLog (QString(" editorFinishedEvent imageViewPtr: %1").arg(QString::number((ulong)iv,16)),LOGDISPATCH); iv->reload(); } editorActive=false; delete ed; break; case templatesChanged: galleryWidgetPtr->changedMatrix(imageViewer::TEMPLATETHUMB); txWidgetPtr->setupTemplatesComboBox(); break; case progressTX: txTimeCounter=0; addToLog(QString("dispatcher: progress duration=%1").arg(((progressTXEvent*)e)->getInfo()),LOGDISPATCH); prTimerIndex=startTimer(((progressTXEvent*)e)->getInfo()*10); // time in seconds -> times 1000 for msec,divide by 100 for progress break; case stoppingTX: addToLog("dispatcher: endTXImage",LOGDISPATCH); break; case endImageTX: //addToLog("dispatcher: endTXImage",LOGDISPATCH); while(soundIOPtr->isPlaying()) { qApp->processEvents(); } addToLog("dispatcher: endTXImage",LOGDISPATCH); startRX(); break; case displayDRMInfo: if(!slowCPU) { rxWidgetPtr->mscWdg()->setConstellation(MSC); rxWidgetPtr->facWdg()->setConstellation(FAC); } rxWidgetPtr->statusWdg()->setStatus(); break; case displayDRMStat: DSPFLOAT s1; ((displayDRMStatEvent*)e)->getInfo(s1); rxWidgetPtr->sMeterPtr()->setValue(s1); break; case loadRXImage: { QString fn=((loadRXImageEvent *)e)->getFilename(); rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false); } break; case moveToTx: { txWidgetPtr->setImage(((moveToTxEvent *)e)->getFilename()); } break; case saveDRMImage: { QString info; ((saveDRMImageEvent*)e)->getFilename(fn); ((saveDRMImageEvent*)e)->getInfo(info); if(!rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false)) { if(mbox==NULL) delete mbox; mbox = new QMessageBox(mainWindowPtr); mbox->setWindowTitle("Received file"); mbox->setText(QString("Saved file %1").arg(fn)); mbox->show(); QTimer::singleShot(4000, mbox, SLOT(hide())); break; } saveImage(fn, info); } break; case prepareFix: addToLog("prepareFix",LOGDISPATCH); startDRMFIXTx( ((prepareFixEvent*)e)->getData()); break; case displayText: infoTextPtr->clear(); infoTextPtr->setWindowTitle(QString("Received from %1").arg(drmCallsign)); infoTextPtr->append(((displayTextEvent*)e)->getStr()); infoTextPtr->show(); break; case displayMBox: if(mbox==NULL) delete mbox; mbox = new QMessageBox(mainWindowPtr); mbox->setWindowTitle(((displayMBoxEvent*)e)->getTitle()); mbox->setText(((displayMBoxEvent*)e)->getStr()); mbox->show(); QTimer::singleShot(4000, mbox, SLOT(hide())); break; case displayProgressFTP: { if(((displayProgressFTPEvent*)e)->getTotal()==0) { delete progressFTP; progressFTP=NULL; break; } if(progressFTP==NULL) { progressFTP=new QProgressDialog("FTP Transfer","Cancel",0,0,mainWindowPtr); } progressFTP->show(); progressFTP->setMaximum(((displayProgressFTPEvent*)e)->getTotal()); progressFTP->setValue(((displayProgressFTPEvent*)e)->getBytes()); } break; case ftpSetup: iPtr=((ftpSetupEvent*)e)->getFtpIntfPtr(); if(iPtr==notifyRXIntf) { notifyRXDone=DFTPWAITING; } else if(iPtr==hybridTxIntf) { hybridTxDone=DFTPWAITING; } else if(iPtr==notifyTXIntf) { notifyTxDone=DFTPWAITING; } iPtr->setupConnection( ((ftpSetupEvent*)e)->getHost(), ((ftpSetupEvent*)e)->getPort(), ((ftpSetupEvent*)e)->getUser(), ((ftpSetupEvent*)e)->getPassword(), ((ftpSetupEvent*)e)->getDir()); break; case ftpUploadFile: ((ftpUploadFileEvent*)e)->getFtpIntfPtr()->uploadFile( ((ftpUploadFileEvent*)e)->getSrcFn(), ((ftpUploadFileEvent*)e)->getDstFn(), ((ftpUploadFileEvent*)e)->getReconnect() ); break; case notifyAction: notifyRXIntf->mremove(((notifyActionEvent*)e)->getToRemove()); notifyRXIntf->uploadData(((notifyActionEvent*)e)->getMsg().toLatin1(), ((notifyActionEvent*)e)->getFilename()); break; case notifyCheck: iPtr=((ftpSetupEvent*)e)->getFtpIntfPtr(); iPtr->startNotifyCheck( ((notifyCheckEvent*)e)->getFilename(), ((notifyCheckEvent*)e)->getInterval(), ((notifyCheckEvent*)e)->getRepeats(), ((notifyCheckEvent*)e)->getToRemove() ); break; default: addToLog(QString("unsupported event: %1").arg(((baseEvent*)e)->description), LOGALL); break; } ((baseEvent *)e)->setDone(); } void dispatcher::idleAll() { if(prTimerIndex>=0) { killTimer(prTimerIndex); prTimerIndex=-1; txWidgetPtr->setProgress(0); } rigControllerPtr->activatePTT(false); rxWidgetPtr->functionsPtr()->stopAndWait(); txWidgetPtr->functionsPtr()->stopAndWait(); } void dispatcher::startRX() { idleAll(); soundIOPtr->startCapture(); rxWidgetPtr->functionsPtr()->startRX(); } void dispatcher::startTX(txFunctions::etxState state) { idleAll(); rigControllerPtr->activatePTT(true); soundIOPtr->startPlayback(); txWidgetPtr->functionsPtr()->startTX(state); } void dispatcher::prepareTX(txFunctions::etxState state) { txWidgetPtr->functionsPtr()->prepareTX(state); } void dispatcher::startDRMFIXTx(QByteArray ba) { if(!txWidgetPtr->functionsPtr()->prepareFIX(ba)) return; startTX(txFunctions::TXSENDDRMFIX); } void dispatcher::startDRMTxBinary() { //TODO: this whole thing should probably live in txWidget::slotBinary QFileInfo finfo; int txtime=0; QMessageBox mbox(mainWindowPtr); QPushButton *sendButton; dirDialog d((QWidget *)mainWindowPtr,"Binary File"); QString filename=d.openFileName("","*"); if(filename.isEmpty()) return; if(!txWidgetPtr->functionsPtr()->prepareBinary(filename)) return; txtime = txWidgetPtr->functionsPtr()->calcTxTime(true,0); finfo.setFile(filename); if (txtime > (3*60)) mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle("TX Binary File"); mbox.setText(QString("'%1'").arg(filename)); mbox.setInformativeText(QString("The file is %1Kb and will take %2 seconds on air to send"). arg(finfo.size()/1000.0,0,'f',0).arg(txtime)); if (useHybrid) sendButton = mbox.addButton(tr("Upload ready to transmit"), QMessageBox::AcceptRole); else sendButton = mbox.addButton(tr("Start Transmitting"), QMessageBox::AcceptRole); mbox.setStandardButtons(QMessageBox::Cancel); mbox.exec(); if (mbox.clickedButton() == sendButton) { txWidgetPtr->functionsPtr()->prepareTX(txFunctions::TXPREPAREDRMBINARY); } } void dispatcher::logSSTV(QString call,bool fromFSKID) { if(lastFileName.isEmpty()) { return; } if(fromFSKID) { QDateTime dt(QDateTime::currentDateTime().toUTC()); int diffsec=saveTimeStamp.secsTo(dt); if(diffsec<2) { logBookPtr->logQSO(call,"SSTV",lastFileName); } lastCallsign=call; } else { logBookPtr->logQSO(call,"SSTV",""); } } void dispatcher::saveRxSSTVImage(QString shortModeName) { QString info,s,fileName; int m; QDateTime dt(QDateTime::currentDateTime().toUTC()); //this is compatible with QT 4.6 dt.setTimeSpec(Qt::UTC); if (shortModeName.isEmpty()) { lastFileName.clear(); return; } if(!autoSave) { lastFileName=shortModeName; } else { fileName=QString("%1/%2_%3.%4").arg(rxSSTVImagesPath).arg(shortModeName).arg(dt.toString("yyyyMMdd_HHmmss")).arg(defaultImageFormat); addToLog(QString("dispatcher: saveRxImage():%1 ").arg(fileName),LOGDISPATCH); rxWidgetPtr->getImageViewerPtr()->save(fileName,defaultImageFormat,true,false); info=""; m=0; while (m<=NUMSSTVMODES && shortModeName!=SSTVTable[m].shortName) m++; if (m<=NUMSSTVMODES) info += SSTVTable[m].name; else info += shortModeName; if (!lastCallsign.isEmpty()) info += " de "+lastCallsign; saveImage(fileName, info); lastFileName=QString("%1_%2.%3").arg(shortModeName).arg(dt.toString("yyyyMMdd_HHmmss")).arg(defaultImageFormat); saveTimeStamp= dt; } } void dispatcher::saveImage(QString fileName, QString infotext) { QFileInfo info(fileName); QString fn="/tmp/"+info.baseName()+"."+ftpDefaultImageFormat; galleryWidgetPtr->putRxImage(fileName); txWidgetPtr->setPreviewWidget(fileName); if(enableFTP) { QImage *imp = rxWidgetPtr->getImageViewerPtr()->getImagePtr(); QImage im; if (imp && imp->width()) { // the original source image is available, possibly in higher quality // than the displayed image. Only for DRM Images. im = QImage(imp->convertToFormat(QImage::Format_RGB32)); } else { // Uses the displayed image in whatever quality is displayed. // Applies to SSTV images. rxWidgetPtr->getImageViewerPtr()->save(fn,ftpDefaultImageFormat,true,false); im = QImage(fn); } QString text, remoteDir; QPainter p; double freq=0; int pixelSize, height, width; rigControllerPtr->getFrequency(freq); text = QString("%1 UTC %2 kHz "). arg(QDateTime::currentDateTime().toUTC().toString("hh:mm ddd MMM d, yyyy")). arg(freq/1000,1,'f',0); if (transmissionModeIndex==TRXSSTV) { remoteDir = ftpRemoteSSTVDirectory; } else { remoteDir = ftpRemoteDRMDirectory; } if (!infotext.isEmpty()) text += " "+infotext; // Limit uploaded size if ((im.width() > 960) || (im.height() > 768)) { im = im.scaled(960,768, Qt::KeepAspectRatio); } // Stamp text over the top left of the image // and keep it the same portion, unless the // font would be unreadable QFont font("Arial"); pixelSize = 9 * im.width()/320; if (pixelSize<8) pixelSize=8; font.setPixelSize(pixelSize); QFontMetrics fontm(font); width = fontm.width(text) + 6; height= fontm.height() + 2; p.begin(&im); p.setPen(Qt::black); p.fillRect(0,0,width,height, Qt::black); p.setPen(Qt::white); p.setBrush(Qt::white); p.setFont(font); p.drawText(2,height-fontm.descent()-1, text); im.save(fn, ftpDefaultImageFormat.toUpper().toLatin1().data()); p.end(); uploadToRXServer(remoteDir, fn); QFile::remove(fn); } } void dispatcher::uploadToRXServer(QString remoteDir, QString fn) { displayMBoxEvent *stmb=0; eftpError ftpResult; ftpInterface ftpIntf("Save RX Image"); ftpIntf.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,remoteDir); ftpResult=ftpIntf.uploadToRXServer(fn); switch(ftpResult) { case FTPOK: break; case FTPERROR: stmb= new displayMBoxEvent("FTP Error",QString("Host: %1: %2").arg(ftpRemoteHost).arg(ftpIntf.getLastError())); break; case FTPNAMEERROR: stmb= new displayMBoxEvent("FTP Error",QString("Host: %1, Error in filename").arg(ftpRemoteHost)); break; case FTPCANCELED: stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 Canceled").arg(ftpRemoteHost)); break; case FTPTIMEOUT: stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 timed out").arg(ftpRemoteHost)); break; default: stmb= new displayMBoxEvent("FTP Error",QString("Unknown FTP error: %1").arg(ftpResult)); break; } if(ftpResult!=FTPOK) { QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done } } void dispatcher::timerEvent(QTimerEvent *event) { if(event->timerId()==prTimerIndex) { txWidgetPtr->setProgress(++txTimeCounter); if(txTimeCounter>=100) { if(prTimerIndex>=0) { killTimer(prTimerIndex); prTimerIndex=-1; txWidgetPtr->setProgress(0); } } txWidgetPtr->setProgress(txTimeCounter); } } void dispatcher::slotRXNotification(QString info) { if (info != "") { rxWidgetPtr->appendDRMNotifyText(info); } } void dispatcher::slotTXNotification(QString info) { if (info != "") { txWidgetPtr->appendDRMNotifyText(info); } } void dispatcher::slotHybridTxDone(bool error) { if(error) { hybridTxDone=DFTPERROR; } else { hybridTxDone=DFTPOK; } } qsstv_9.2.6/qsstv/dispatch/dispatcher.h0000664000175000017500000000623013203343610016704 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DISPATCHER_H #define DISPATCHER_H #include "dispatchevents.h" #include "appglobal.h" #include #include "textdisplay.h" #include "txfunctions.h" class editor; class imageViewer; #include enum eftpResult {DFTPWAITING,DFTPOK,DFTPERROR}; /** @author Johan Maes */ class dispatcher : public QObject { Q_OBJECT public: dispatcher(); ~dispatcher(); void init(); void idleAll(); void startRX(); void startTX(txFunctions::etxState state); void prepareTX(txFunctions::etxState state); void readSettings(); void writeSettings(); void customEvent( QEvent * e ); void startDRMFIXTx(QByteArray ba); void startDRMTxBinary(); // void startDRMHybridTx(QString fn); // void startDRMHybridText(QString txt); // void sendSweepTone(double duration,double lowerFreq,double upperFreq); void saveImage(QString fileName, QString infotext); void uploadToRXServer(QString remoteDir, QString fn); void logSSTV(QString call, bool fromFSKID); void setOnlineStatus(bool online, QString info=""); void who(); eftpResult notifyRXDone; eftpResult hybridTxDone; eftpResult notifyTxDone; private slots: void slotRXNotification(QString info); void slotTXNotification(QString); // void slotWhoResult(); void slotHybridTxDone(bool error); private: void saveRxSSTVImage(QString shortModeName); void timerEvent(QTimerEvent *event); bool editorActive; editor *ed; imageViewer *iv; int txTimeCounter; int prTimerIndex; int logTimerIndex; textDisplay *infoTextPtr; QMessageBox *mbox; QProgressDialog *progressFTP; QString lastFileName; QString lastCallsign; QDateTime saveTimeStamp; }; #endif qsstv_9.2.6/qsstv/dispatch/dispatchevents.h0000664000175000017500000004222113203343610017602 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DISPATCHEVENT_H #define DISPATCHEVENT_H #include #include "widgets/imageviewer.h" #include "appdefs.h" #include class ftpInterface; /** dispatch events are used to communicate with the different threads */ enum dispatchEventType { info = QEvent::User, //!< send when dsp stops running soundcardIdle, //!< send when soundcard stops running displayFFT, displaySync, displayDRMStat, displayDRMInfo, syncDisp, //!< synchro display event lineDisplay, //!< display 1 line eraseDisp, createMode, startImageRX, endSSTVImageRX, endImageTX, stoppingTX, progressTX, // verticalRetrace, // syncLost, outOfSync, // statusMsg, //!< display status message rxSSTVStatus, //! shows message in sstv tab rxDRMStatus, //! shows message in drm tab rxDRMNotify, //! shows text in rx notifications box rxDRMNotifyAppend, txDRMNotify, //! shows text in tx notifications box txDRMNotifyAppend, txPrepareComplete, //!< tx preparations (uploading etc) complete closeWindows, callEditor, templatesChanged, editorFinished, changeRXFilter, startAutoRepeater, startRepeater, stopRxTx, loadRXImage, saveDRMImage, prepareFix, displayText, displayMBox, displayProgressFTP, moveToTx, notifyAction, ftpSetup, notifyCheck, ftpUploadFile, statusBarMsg }; class baseEvent: public QEvent { public: baseEvent(QEvent::Type t):QEvent(t) {doneIt=NULL;} void waitFor(bool *d) {doneIt=d;} void setDone() { if(doneIt!=NULL) *doneIt=true; } QString description; private: bool *doneIt; }; /** this event is send when the dspfunc thread stops running */ class infoEvent : public baseEvent { public: /** create event */ infoEvent(QString t):baseEvent( (QEvent::Type) info ), str(t) { description="infoEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; /** this event is send when the soundcard thread goes to idle */ class soundcardIdleEvent : public baseEvent { public: /** create event */ soundcardIdleEvent():baseEvent( (QEvent::Type) soundcardIdle ) { { description=" soudcardIdleEvent"; } } }; /** this event is send with teh sync quality info and the signal volume */ class displaySyncEvent : public baseEvent { public: /** create event */ displaySyncEvent(uint s):baseEvent( (QEvent::Type) displaySync), sync(s) { description=" displaySyncEvent"; } /** returns int sync value */ void getInfo(uint &s) {s=sync;} private: uint sync; DSPFLOAT vol; }; class displayDRMStatEvent : public baseEvent { public: /** create event */ displayDRMStatEvent(uint s):baseEvent( (QEvent::Type) displayDRMStat), snr(s) { description=" displayDRMStatEvent"; } /** returns length and pointer from the event */ void getInfo(DSPFLOAT &s) {s=snr;} private: DSPFLOAT snr; }; //class statusMsgEvent : public baseEvent //{ //public: // /** create event */ // statusMsgEvent(QString t):baseEvent( (QEvent::Type)statusMsg ), str(t) // { // description="statusMsgEvent"; // } // /** returns info string from the event */ // QString getStr() const { return str; } //private: // QString str; //}; class ftpSetupEvent : public baseEvent { public: /** create event */ ftpSetupEvent(ftpInterface * ftpIntf,QString h,int p,QString u,QString pwd,QString d) :baseEvent( (QEvent::Type)ftpSetup ),ftpIntfPtr(ftpIntf), host(h),port(p),user(u),password(pwd),dir(d) { description="ftpSetupEvent"; } /** returns settings from the event */ ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; } QString getHost() const { return host; } int getPort() const { return port; } QString getUser() const { return user; } QString getPassword() const { return password; } QString getDir() const { return dir; } private: ftpInterface *ftpIntfPtr; QString host; int port; QString user; QString password; QString dir; }; class ftpUploadFileEvent : public baseEvent { public: /** create event */ ftpUploadFileEvent(ftpInterface * ftpIntf,QString srcFn,QString dstFn,bool recon) :baseEvent( (QEvent::Type)ftpUploadFile ),ftpIntfPtr(ftpIntf),sourceFilename(srcFn), destFilename(dstFn),reconnect(recon) { description="ftpUploadFileEvent"; } /** returns settings from the event */ ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; } QString getSrcFn() const { return sourceFilename; } QString getDstFn() const { return destFilename; } bool getReconnect() const { return reconnect; } private: ftpInterface *ftpIntfPtr; QString sourceFilename; QString destFilename; bool reconnect; }; class notifyActionEvent : public baseEvent { public: /** create event */ notifyActionEvent(QString toRem,QString message,QString fn) :baseEvent( (QEvent::Type)notifyAction ), toRemove(toRem),msg(message),filename(fn) { description="notifyActionEvent"; } /** returns settings from the event */ QString getToRemove() const { return toRemove; } QString getMsg() const { return msg; } QString getFilename() const { return filename; } private: QString toRemove; QString msg; QString filename; }; class notifyCheckEvent : public baseEvent { public: /** create event */ notifyCheckEvent(ftpInterface * ftpIntf,QString fn,int intv, int rp, bool rm) :baseEvent( (QEvent::Type)notifyCheck),ftpIntfPtr(ftpIntf), filename(fn),interval(intv),repeats(rp),remove(rm) { description="notifyCheckEvent"; } /** returns settings from the event */ ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; } QString getFilename() const { return filename; } int getInterval() const { return interval; } int getRepeats() const { return repeats; } bool getToRemove() const { return remove; } private: ftpInterface *ftpIntfPtr; QString filename; int interval; int repeats; bool remove; }; class rxSSTVStatusEvent : public baseEvent { public: /** create event */ rxSSTVStatusEvent(QString t):baseEvent( (QEvent::Type)rxSSTVStatus ), str(t) { description="rxSSTVStatusEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class rxDRMStatusEvent : public baseEvent { public: /** create event */ rxDRMStatusEvent(QString t):baseEvent( (QEvent::Type)rxDRMStatus ), str(t) { description="rxDRMStatusEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class rxDRMNotifyEvent : public baseEvent { public: /** create event */ rxDRMNotifyEvent(QString t):baseEvent( (QEvent::Type)rxDRMNotify ), str(t) { description="rxDRMNotifyEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class rxDRMNotifyAppendEvent : public baseEvent { public: /** create event */ rxDRMNotifyAppendEvent(QString t):baseEvent( (QEvent::Type)rxDRMNotifyAppend ), str(t) { description="rxDRMNotifyAppendEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class txDRMNotifyEvent : public baseEvent { public: /** create event */ txDRMNotifyEvent(QString t):baseEvent( (QEvent::Type)txDRMNotify ), str(t) { description="txDRMNotifyEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class txDRMNotifyAppendEvent : public baseEvent { public: /** create event */ txDRMNotifyAppendEvent(QString t):baseEvent( (QEvent::Type)txDRMNotifyAppend ), str(t) { description="txDRMNotifyAppendEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class txPrepareCompleteEvent : public baseEvent { public: /** create event */ txPrepareCompleteEvent(bool tok):baseEvent( (QEvent::Type)txPrepareComplete ), _ok(tok) { description="txPrepareCompleteEvent"; } /** returns info string from the event */ bool ok() const { return _ok; } private: bool _ok; }; class lineDisplayEvent : public baseEvent { public: /** create event */ lineDisplayEvent(uint lineNbr):baseEvent( (QEvent::Type)lineDisplay ), lineNumber(lineNbr) { description="lineDisplayEvent"; } /** returns length and pointer from the event */ void getInfo(uint &lineNbr) const { lineNbr=lineNumber;} private: uint lineNumber; }; class eraseDisplayEvent : public baseEvent { public: /** create event */ eraseDisplayEvent():baseEvent( (QEvent::Type)eraseDisp ) { description="eraseDisplayEvent"; } }; class displayDRMInfoEvent : public baseEvent { public: /** create event */ displayDRMInfoEvent():baseEvent( (QEvent::Type)displayDRMInfo) { description="displayDRMInfo"; } }; class startAutoRepeaterEvent: public baseEvent { public: /** create event */ startAutoRepeaterEvent():baseEvent( (QEvent::Type)startAutoRepeater ) { description="startAutoRepeaterEvent"; } }; class startRepeaterEvent: public baseEvent { public: /** create event */ startRepeaterEvent():baseEvent( (QEvent::Type)startRepeater ) { description="startRepeaterEvent"; } }; class createModeEvent : public baseEvent { public: /** create event */ createModeEvent(uint m,QString t):baseEvent( (QEvent::Type)createMode ), mode(m) ,str(t) { description="createModeEvent"; } /** returns info string from the event */ void getMode(uint &m,QString &s) const { m=mode;s=str; } private: uint mode; QString str; }; class loadRXImageEvent : public baseEvent { public: loadRXImageEvent(QString fn):baseEvent( (QEvent::Type)loadRXImage),fileName(fn) { description="loadRXImageEvent"; } QString getFilename() {return fileName;} private: QString fileName; }; class moveToTxEvent : public baseEvent { public: moveToTxEvent(QString fn):baseEvent( (QEvent::Type)moveToTx),fileName(fn) { description="moveToTxEvent"; } QString getFilename() {return fileName;} private: QString fileName; }; class saveDRMImageEvent : public baseEvent { public: saveDRMImageEvent(QString fn,QString i):baseEvent( (QEvent::Type)saveDRMImage),fileName(fn),info(i) { description="saveDRMImageEvent"; } void getFilename(QString &fn) {fn=fileName;} void getInfo(QString &i) {i=info;} private: QString fileName; QString info; }; class startImageRXEvent : public baseEvent { public: /** create event */ startImageRXEvent(QSize ims):baseEvent( (QEvent::Type)startImageRX ),imSize(ims) { description="startImageRXEvent"; } QSize getSize() {return imSize;} private: QSize imSize; }; class endImageSSTVRXEvent : public baseEvent { public: /** create event */ endImageSSTVRXEvent(QString mn):baseEvent( (QEvent::Type)endSSTVImageRX ),modeName(mn) { description="endImageSSTVRXEvent"; } QString getModeName() {return modeName;} private: QString modeName; }; class endImageTXEvent : public baseEvent { public: /** create event */ endImageTXEvent():baseEvent( (QEvent::Type)endImageTX ) { description="endImageTXEvent"; } }; class stopTXEvent : public baseEvent { public: /** create event */ stopTXEvent():baseEvent( (QEvent::Type)stoppingTX ) { description="stopTXEvent"; } }; //class verticalRetraceEvent : public baseEvent //{ //public: // /** create event */ // verticalRetraceEvent():baseEvent( (QEvent::Type) verticalRetrace ) // { // description="verticalRetraceEvent"; // } //}; //class syncLostEvent : public baseEvent //{ //public: // /** create event */ // syncLostEvent():baseEvent( (QEvent::Type) syncLost ) // { // description="syncLostEvent"; // } //}; class outOfSyncEvent : public baseEvent { public: /** create event */ outOfSyncEvent():baseEvent( (QEvent::Type)outOfSync ) { description="outOfSyncEvent"; } }; class progressTXEvent : public baseEvent { public: /** create event */ progressTXEvent(double tim):baseEvent( (QEvent::Type)progressTX ), txTime(tim) { description="progressTXEvent"; } /** returns length and pointer from the event */ double getInfo() { return txTime;} private: double txTime; }; class closeWindowsEvent : public baseEvent { public: /** create event */ closeWindowsEvent():baseEvent( (QEvent::Type)closeWindows) { description="closeWindowEvent"; } /** returns length and pointer from the event */ }; class callEditorEvent : public baseEvent { public: /** create event */ callEditorEvent(imageViewer *iv,QString fn):baseEvent( (QEvent::Type) callEditor ), filename(fn),imviewer(iv) { description="callEditorEvent"; } /** returns info string from the event */ QString getFilename() const { return filename; } imageViewer *getImageViewer() { return imviewer; } private: QString filename; imageViewer *imviewer; }; class templatesChangedEvent : public baseEvent { public: /** create event */ templatesChangedEvent():baseEvent( (QEvent::Type) templatesChanged ) { description="templateChangeEvent"; } }; class editorFinishedEvent : public baseEvent { public: /** create event */ editorFinishedEvent(bool b,QString fn):baseEvent( (QEvent::Type)editorFinished),ok(b),filename(fn) { description="editorFinishedEvent"; } bool isOK() { return ok;} QString getFilename() const { return filename; } private: bool ok; QString filename; }; class displayFFTEvent : public baseEvent { public: /** create event */ displayFFTEvent(DSPFLOAT *buf):baseEvent( (QEvent::Type)displayFFT),buffer(buf) { description="displayFFTEvent"; } DSPFLOAT *data() { return buffer;} private: DSPFLOAT *buffer; }; class filterRXChangedEvent: public baseEvent { public: /** create event */ filterRXChangedEvent(int fIndex):baseEvent( (QEvent::Type)changeRXFilter),filterIndex(fIndex) { description="filterChangedEvent"; } int index() { return filterIndex;} private: int filterIndex; }; class stopRxTxEvent : public baseEvent { public: /** create event */ stopRxTxEvent():baseEvent( (QEvent::Type)stopRxTx) { description="stopRxTxEvent"; } }; class prepareFixEvent: public baseEvent { public: prepareFixEvent(QByteArray ba):baseEvent( (QEvent::Type)prepareFix),data(ba) { description="filterChangedEvent"; } QByteArray &getData() {return data;} private: QByteArray data; }; /** this event is send when the dspfunc thread stops running */ class displayTextEvent : public baseEvent { public: /** create event */ displayTextEvent(QString t):baseEvent( (QEvent::Type) displayText ), str(t) { description="displayTextEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; class displayMBoxEvent : public baseEvent { public: /** create event */ displayMBoxEvent(QString title,QString text):baseEvent( (QEvent::Type) displayMBox ), str(text), title(title) { description="displayMBoxEvent"; } /** returns info string from the event */ QString getStr() const { return str; } QString getTitle() const { return title; } private: QString str; QString title; }; class displayProgressFTPEvent : public baseEvent { public: /** create event */ displayProgressFTPEvent(quint64 byts,quint64 tot):baseEvent( (QEvent::Type) displayProgressFTP ), bytes(byts),total(tot) { description="displayMBoxEvent"; } /** returns info string from the event */ quint64 getTotal() const { return total; } quint64 getBytes() const { return bytes; } private: quint64 bytes; quint64 total; }; class statusBarMsgEvent : public baseEvent { public: /** create event */ statusBarMsgEvent(QString t):baseEvent( (QEvent::Type)statusBarMsg ), str(t) { description="statusBarMsgEvent"; } /** returns info string from the event */ QString getStr() const { return str; } private: QString str; }; #endif qsstv_9.2.6/qsstv/drmrx/bits2bytes.cpp0000664000175000017500000000732213203343610016543 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Torsten Schorr */ /* */ /* Author(s) : Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 23.07.2004 */ /* Last change : 23.07.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* bits2bytes.c */ /* */ /******************************************************************************/ /* Description: */ /* Deinterleaver/Interleaver generation for DRM frames */ /* Usage: */ /* */ /* bytes = bits2bytes(bits); */ /* */ /* converts a serial double bit-stream into a uint8 byte-stream */ /******************************************************************************/ /* * modified for use directly in C-language without Matlab interface * M.Bos - PA0MBO * Date Nov 15th 2007 * */ #include #include #include #include void bits2bytes(double *inbits, int N, unsigned char /*@out@ */ *outbytes) { unsigned char single_byte; int m, n; if (N % 8 != 0) { return; } for (m = 0; m < N / 8; m++) { single_byte = '\0'; for (n = 7; n >= 0; n--) { single_byte |= ((fabs(inbits[8 * m + 7 - n]) > DBL_EPSILON) & 0x01) << n; } outbytes[m] = single_byte; } return; } qsstv_9.2.6/qsstv/drmrx/channeldecode.cpp0000664000175000017500000007626113203343610017235 0ustar jomajoma /* * file channeldecode.c * * Author M.Bos - PA0MBO * Date Feb 21st 2009 * * superframe sync of drm demapping * deinterleaving channel decoding of FAC and MSC frame * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include "appglobal.h" #include #include #include #include #include #include #include "drmproto.h" #include "drmdefs.h" #include "drm.h" #include #include "configparams.h" #define PI (4.0*atan(1.0)) #define CHANNELDECODING 1 char localDrmCallsign[9]= {0, 0, 0, 0, 0, 0, 0, 0, 0}; //changed ON4QZ #define MSD_ITER 4 extern int transmission_frame_buffer_data_valid; extern int fac_valid; extern int robustness_mode; extern int spectrum_occupancy; extern int symbols_per_frame; extern int K_modulo; extern int K_dc; extern float mean_energy_of_used_cells; extern int FAC_cells_k[65]; extern float transmission_frame_buffer[82980]; extern float channel_transfer_function_buffer[82980]; extern int transmission_frame_buffer_wptr; extern int lFAC; extern int runstate; extern struct mplex_desc multiplex_description; extern struct audio_info audio_information; extern struct appl_info application_information; extern struct stream_info stream_information; extern struct time_info time_and_date; extern int channel_decoded_data_buffer_data_valid; extern double channel_decoded_data_buffer[110000]; extern int audio_data_flag; extern int length_decoded_data; extern int MSC_Demapper[6][2959]; int lMSC; //changed ON4QZ float MSC_cells_sequence[2 * 2959]; //changed ON4QZ bool MSCAvailable; int spectrum_occupancy_new; int msc_mode_new; int interleaver_depth_new; bool callsignValid; char getfacchar(double *); void channel_decoding(void) { static int /*@only@ */ *FAC_Deinterleaver; static double RX[13] = { 1, 3, 1, 4, 1, 4, 3, 2, 8, 3, 4, 7, 8 }; static double RY[13] = { 4, 10, 3, 11, 2, 7, 5, 3, 11, 4, 5, 8, 9 }; // static int RYlcmSM16[2] = { 3, 4 }; // static int RYlcmSM64[4] = { 4, 15, 8, 45 }; static int RatesSM16[2][2] = { {3, 8}, {5, 10} }; static int RatesSM64[4][3] = { {1, 5, 10}, {3, 8, 11}, {5, 10, 12}, {8, 11, 13} }; static int frame_index; static int enough_frames; static int frame_count; static int msc_parameters_valid; static int robustness_mode_old; static int msc_mode; static int interleaver_depth; static int MSC_Demapper_symbolwise[6][2959]; static double SNR_estimation[2959]; static double squared_noise_signal_buffer[121490]; static double noise_power_density[461]; static int SNR_estimation_valid; int i, j, k, n; static int msc_parameters_changed; int symbol_period; int trxfrmbufptr; double received_real[3000], received_imag[3000], snr[3000]; float transfer_function_FAC[3000]; /* complex */ static double L[6]; static double L_FAC[4]; static int PL[6]; static int PL_FAC[4]; static double fac_data[72]; double checksum; static double channel_parameters[20]; double facblock[72]; double temp; static int identity; static int identityCount; static int old_ptr; static int MSC_carrier_usage[288]; static int cnt_MSC_used_carriers; static int MSC_used_carriers[288]; static int min_index_equal_samples; static int max_index_equal_samples; static int /*@only@ */ *Part_Deinterleaver = NULL; static int Deinterleaver[18000]; int no_of_streams = 1; static int N_MUX; static int N1, N2; static int ratesA[3], ratesB[3], Lvspp, xin1, xin2; float sum1; float transfer_function_MSC[2 * 2959]; /* complex nrs */ static int rowdimL, coldimL; double SPPhard[10628]; int n_SPPhard; double VSPPhard[100]; static double res_iters, calc_variance; static double noise_signal[2 * 2959]; static double squared_noise_signal[2959]; double sum2; double weighted_noise_power_density[288]; double samples_resorted[288][15]; int posrow, poscolumn, totindex; int VSPPlength, HPPlength; int Tu_list[] = { Tu_A, Tu_B, Tu_C, Tu_D }; double part1, part2; if (runstate == RUN_STATE_POWER_ON) { if (FAC_Deinterleaver != NULL) free(FAC_Deinterleaver); FAC_Deinterleaver = deinterleaver(0, 1, 90, 21); return; } if (runstate == RUN_STATE_INIT) { transmission_frame_buffer_wptr = 0; frame_index = 1; enough_frames = 0; frame_count = 0; msc_parameters_valid = 0; robustness_mode_old = -1; msc_mode = -1; interleaver_depth = -1; fac_valid = -1; multiplex_description.HM_length = 0; callsignValid=false; return; } channel_decoded_data_buffer_data_valid = 0; if (transmission_frame_buffer_data_valid == 0) { MSCAvailable=false; /* clear various datastructures */ frame_index = 1; enough_frames = 0; frame_count = 0; msc_parameters_valid = 0; transmission_frame_buffer_wptr = 0; multiplex_description.PL_PartA = -1; multiplex_description.PL_PartB = -1; multiplex_description.HM_length = 0; multiplex_description.PL_HM = -1; audio_information.ID[0] = 0; audio_information.ID[1] = 0; audio_information.ID[2] = 0; audio_information.ID[3] = 0; audio_information.stream_ID[0] = -1; audio_information.stream_ID[1] = -1; audio_information.stream_ID[2] = -1; audio_information.stream_ID[3] = -1; audio_information.audio_coding[0] = 0; audio_information.audio_coding[1] = 0; audio_information.audio_coding[2] = 0; audio_information.audio_coding[3] = 0; audio_information.SBR_flag[0] = 0; audio_information.SBR_flag[1] = 0; audio_information.SBR_flag[2] = 0; audio_information.SBR_flag[3] = 0; audio_information.audio_mode[0] = 0; audio_information.audio_mode[1] = 0; audio_information.audio_mode[2] = 0; audio_information.audio_mode[3] = 0; audio_information.sampling_rate[0] = 0; audio_information.sampling_rate[1] = 0; audio_information.sampling_rate[2] = 0; audio_information.sampling_rate[3] = 0; audio_information.text_flag[0] = 0; audio_information.text_flag[1] = 0; audio_information.text_flag[2] = 0; audio_information.text_flag[3] = 0; audio_information.enhancement_flag[0] = 0; audio_information.enhancement_flag[1] = 0; audio_information.enhancement_flag[2] = 0; audio_information.enhancement_flag[3] = 0; audio_information.coder_field[0] = 0; audio_information.coder_field[1] = 0; audio_information.coder_field[2] = 0; audio_information.coder_field[3] = 0; audio_information.bytes_per_frame[0] = 0; audio_information.bytes_per_frame[1] = 0; audio_information.bytes_per_frame[2] = 0; audio_information.bytes_per_frame[3] = 0; application_information.ID[0] = 0; application_information.ID[1] = 0; application_information.ID[2] = 0; application_information.ID[3] = 0; application_information.stream_ID[0] = -1; application_information.stream_ID[1] = -1; application_information.stream_ID[2] = -1; application_information.stream_ID[3] = -1; application_information.packet_mode[0] = 0; application_information.packet_mode[1] = 0; application_information.packet_mode[2] = 0; application_information.packet_mode[3] = 0; application_information.data_unit_indicator[0] = 0; application_information.data_unit_indicator[1] = 0; application_information.data_unit_indicator[2] = 0; application_information.data_unit_indicator[3] = 0; application_information.packet_ID[0] = 0; application_information.packet_ID[1] = 0; application_information.packet_ID[2] = 0; application_information.packet_ID[3] = 0; application_information.enhancement_flag[0] = 0; application_information.enhancement_flag[1] = 0; application_information.enhancement_flag[2] = 0; application_information.enhancement_flag[3] = 0; application_information.application_domain[0] = 0; application_information.application_domain[1] = 0; application_information.application_domain[2] = 0; application_information.application_domain[3] = 0; application_information.packet_length[0] = 0; application_information.packet_length[1] = 0; application_information.packet_length[2] = 0; application_information.packet_length[3] = 0; application_information.user_application_type[0] = 0; application_information.user_application_type[1] = 0; application_information.user_application_type[2] = 0; application_information.user_application_type[3] = 0; application_information.user_application_identifier[0] = 0; application_information.user_application_identifier[1] = 0; application_information.user_application_identifier[2] = 0; application_information.user_application_identifier[3] = 0; application_information.label[0][0] = '\0'; application_information.label[1][0] = '\0'; application_information.label[2][0] = '\0'; application_information.label[3][0] = '\0'; application_information.country[0][0] = '\0'; application_information.country[1][0] = '\0'; application_information.country[2][0] = '\0'; application_information.country[3][0] = '\0'; application_information.language_code[0] = 0; application_information.language_code[1] = 0; application_information.language_code[2] = 0; application_information.language_code[3] = 0; application_information.programme_type_code[0] = 0; application_information.programme_type_code[1] = 0; application_information.programme_type_code[2] = 0; application_information.programme_type_code[3] = 0; application_information.bytes_per_frame[0] = 0;; application_information.bytes_per_frame[1] = 0;; application_information.bytes_per_frame[2] = 0;; application_information.bytes_per_frame[3] = 0;; stream_information.number_of_audio_services = 0; stream_information.number_of_data_services = 0; stream_information.number_of_streams = 0; stream_information.number_of_audio_streams = 0; stream_information.number_of_data_streams = 0; time_and_date.day = -1; time_and_date.month = -1; time_and_date.year = -1; time_and_date.hours = -1; time_and_date.minutes = -1; // sdc_mode = -1; msc_mode = -1; robustness_mode_old = -1; interleaver_depth = -1; for (i = 0; i < 41490; i++) squared_noise_signal_buffer[i] = 0.0; for (i = 0; i < 461; i++) noise_power_density[i] = 0.0; SNR_estimation_valid = 0; fac_valid = -1; // audio_service_index = 1; return; } symbol_period = Tu_list[robustness_mode]; if (CHANNELDECODING == 0) { frame_index = (frame_index % 6) + 1; /* in matlab check for existence of symbol_period & symbols_per_frame */ if ((symbol_period != -1) & (symbols_per_frame != -1)) { transmission_frame_buffer_wptr = (transmission_frame_buffer_wptr + symbol_period * symbols_per_frame) % (symbol_period * symbols_per_frame * 6); } SNR_estimation_valid = 0; return; } // iterations = 0; calc_variance = -0.05; msc_parameters_changed = 0; if (robustness_mode != robustness_mode_old) { if (robustness_mode < 0) return; symbol_period = Tu_list[robustness_mode]; lFAC = mkfacmap(robustness_mode, K_dc, K_modulo, FAC_cells_k); } /* FAC decoding */ fac_valid = 1; for (i = 0; i < lFAC; i++) { trxfrmbufptr = (frame_index - 1) * symbol_period * symbols_per_frame + FAC_cells_k[i]; received_real[i] = (double) transmission_frame_buffer[2 * trxfrmbufptr]; received_imag[i] = (double) transmission_frame_buffer[2 * trxfrmbufptr + 1]; transfer_function_FAC[i * 2] = channel_transfer_function_buffer[2 * trxfrmbufptr]; transfer_function_FAC[i * 2 + 1] = channel_transfer_function_buffer[2 * trxfrmbufptr + 1]; snr[i] = sqrt(transfer_function_FAC[i * 2] * transfer_function_FAC[i * 2] + transfer_function_FAC[i * 2 + 1] * transfer_function_FAC[i * 2 +1]); } received_real[9] = 0.0; received_imag[9] = 0.0; L_FAC[0] = 0.0; L_FAC[1] = 48.0; PL_FAC[0] = 0; PL_FAC[1] = 6; (void) msdhardfac(received_real, received_imag, lFAC, snr, 0, L_FAC, 2, 0, FAC_Deinterleaver, PL_FAC, 4, 0, fac_data); for (i = 0; i < 40; i++) { facblock[i] = fac_data[i]; } for (i = 40; i < 48; i++) { facblock[i] = 1.0 - fac_data[i]; } for (i = 0; i < 10; i++) { channel_parameters[i] = fac_data[i]; } crc8_c(&checksum, facblock, 48); if (fabs(checksum) > DBL_EPSILON) { spectrum_occupancy = -1; fac_valid = 0; identityCount=0; msc_parameters_valid = 0 ; /* added pa0mbo 23 nov 2011 */ return; } msc_parameters_valid = 1; /* frame alignment */ temp = 2.0 * channel_parameters[0] + channel_parameters[1]; identity = (int) temp % 3; if (identity != ((frame_index - 1) % 3)) { old_ptr = transmission_frame_buffer_wptr; transmission_frame_buffer_wptr = identity * symbol_period * symbols_per_frame; for (i = 0; i < symbol_period * symbols_per_frame; i++) { trxfrmbufptr = transmission_frame_buffer_wptr + i; transmission_frame_buffer[2 * trxfrmbufptr] = transmission_frame_buffer[2 * (old_ptr + i)]; transmission_frame_buffer[2 * trxfrmbufptr + 1] =transmission_frame_buffer[2 * (old_ptr + i) + 1]; channel_transfer_function_buffer[2 * trxfrmbufptr] = channel_transfer_function_buffer[2 * (old_ptr + i)]; channel_transfer_function_buffer[2 * trxfrmbufptr + 1] =channel_transfer_function_buffer[2 * (old_ptr + i) + 1]; } frame_index = identity + 1; } interleaver_depth_new = (int) channel_parameters[3]; msc_mode_new = (int) channel_parameters[4]; if (fabs(channel_parameters[6] - 1.0) < DBL_EPSILON) { msc_mode_new = msc_mode_new + 2 * (int) channel_parameters[9]; } spectrum_occupancy_new = (int) channel_parameters[2]; if (spectrum_occupancy_new > 1) { spectrum_occupancy = -1; fac_valid = 0; identityCount=0; return; } identityCount++; audio_data_flag = (int) channel_parameters[6]; // we need 3 consequetive valid fac's to have a complete call /* decoding of text in fac data */ localDrmCallsign[3*identity] = getfacchar(&facblock[10]); localDrmCallsign[3*identity+1] = getfacchar(&facblock[17]); localDrmCallsign[3*identity+2] = getfacchar(&facblock[24]); localDrmCallsign[3*identity+3] = '\0'; if ((identity == 2) && (identityCount>=3)) { identityCount=0; drmCallsign=localDrmCallsign; callsignValid=true; } if ((spectrum_occupancy != spectrum_occupancy_new) || (robustness_mode_old != robustness_mode)) { spectrum_occupancy = spectrum_occupancy_new; interleaver_depth = interleaver_depth_new; lMSC = mkmscmap(robustness_mode, spectrum_occupancy, interleaver_depth, K_dc, K_modulo); for (j = 0; j < 6; j++) { for (i = 0; i < lMSC; i++) { MSC_Demapper_symbolwise[j][i] = MSC_Demapper[j][i] % symbol_period; } } /* do the binning and calc carrier usage */ for (i = 0; i < symbol_period; i++) { MSC_carrier_usage[i] = 0; for (j = 0; j < 6; j++) { for (k = 0; k < lMSC; k++) { if (MSC_Demapper_symbolwise[j][k] == i) { (MSC_carrier_usage[i])++; } } } } cnt_MSC_used_carriers = 0; for (i = 0; i < symbol_period; i++) { if (MSC_carrier_usage[i] != 0) { MSC_used_carriers[cnt_MSC_used_carriers++] = i; } } msc_parameters_changed = 1; // sdc_parameters_changed = 1; } else { if (interleaver_depth != interleaver_depth_new) { interleaver_depth = interleaver_depth_new; lMSC = mkmscmap(robustness_mode, spectrum_occupancy, interleaver_depth,K_dc, K_modulo); /* do the binning and calc carrier usage */ for (i = 0; i < symbol_period; i++) { MSC_carrier_usage[i] = 0; for (j = 0; j < 6; j++) { for (k = 0; k < lMSC; k++) { if (MSC_Demapper_symbolwise[j][k] == i) { (MSC_carrier_usage[i])++; } } } } cnt_MSC_used_carriers = 0; for (i = 0; i < symbol_period; i++) { if (MSC_carrier_usage[i] != 0) { MSC_used_carriers[cnt_MSC_used_carriers++] = i; } } msc_parameters_changed = 1; } } robustness_mode_old = robustness_mode; interleaver_depth = interleaver_depth_new; /* frame count : deinterleaving possible after 2 received frames for short and after 6 received frames for long interleaving */ frame_count++; if (frame_count >= 6 - 4 * interleaver_depth) { enough_frames = 1; } else { if (frame_count == 1) { min_index_equal_samples = transmission_frame_buffer_wptr; max_index_equal_samples = transmission_frame_buffer_wptr + symbol_period * symbols_per_frame; } else { if (transmission_frame_buffer_wptr < min_index_equal_samples) { min_index_equal_samples = transmission_frame_buffer_wptr; } if (transmission_frame_buffer_wptr + symbol_period * symbols_per_frame > max_index_equal_samples) { max_index_equal_samples = transmission_frame_buffer_wptr + symbol_period * symbols_per_frame; } } } if (msc_mode != msc_mode_new) { msc_mode = msc_mode_new; msc_parameters_changed = 1; msc_parameters_valid = 1; } multiplex_description.HM_length = 0; multiplex_description.PL_HM = 0; if (fabs(fac_data[5] - 1.0) < DBL_EPSILON) { multiplex_description.PL_PartA = 1; multiplex_description.PL_PartB = 1; } else { multiplex_description.PL_PartA = 0; multiplex_description.PL_PartB = 0; } application_information.stream_ID[0] = 0; application_information.stream_ID[1] = -1; application_information.stream_ID[2] = -1; application_information.stream_ID[3] = -1; application_information.packet_mode[0] = 1; application_information.packet_mode[1] = 0; application_information.packet_mode[2] = 0; application_information.packet_mode[3] = 0; application_information.data_unit_indicator[0] = 1; application_information.data_unit_indicator[1] = 0; application_information.data_unit_indicator[2] = 0; application_information.data_unit_indicator[3] = 0; application_information.application_domain[0] = 1; application_information.application_domain[1] = 0; application_information.application_domain[2] = 0; application_information.application_domain[3] = 0; for (i = 0; i < 16; i++) application_information.application_data[0][i] = 0; /* *** MSC DECODING *** */ N_MUX = lMSC; /* MSC parameters settings */ if ((msc_parameters_changed == 1) && (msc_parameters_valid == 1)) { if (msc_mode == 0) /* 64-QAM SM */ { // rylcm = RYlcmSM64[multiplex_description.PL_PartA]; for (i = 0; i < 3; i++) { ratesA[i] = RatesSM64[multiplex_description.PL_PartA][i] - 1; } N1 = 0; N2 = N_MUX - N1; for (i = 0; i < 3; i++) { ratesB[i] = RatesSM64[multiplex_description.PL_PartB][i] - 1; } for (i = 0; i < 3; i++) { L[i] = 2 * N1 * (RX[ratesA[i]] / RY[ratesA[i]]); L[i + 3] = (RX[ratesB[i]] * floor((2 * N2 - 12) / RY[ratesB[i]])); } Lvspp = 0; rowdimL = 3; coldimL = 2; xin1 = 2 * N1; xin2 = 2 * N2; for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i] = i; if (Part_Deinterleaver != NULL) free(Part_Deinterleaver); Part_Deinterleaver = deinterleaver(xin1, 13, xin2, 13); for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i + xin1 + xin2] = Part_Deinterleaver[i]; free(Part_Deinterleaver); Part_Deinterleaver = deinterleaver(xin1, 21, xin2, 21); for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i + 2 * (xin1 + xin2)] = Part_Deinterleaver[i]; for (i = 0; i < 3; i++) { PL[i] = ratesA[i]; PL[i + 3] = ratesB[i]; } } else if (msc_mode == 1) /* 16-QAM SM */ { // rylcm = RYlcmSM16[multiplex_description.PL_PartA]; for (i = 0; i < 2; i++) //joma { ratesA[i] = RatesSM16[multiplex_description.PL_PartA][i] - 1; } N1 = 0; N2 = N_MUX - N1; for (i = 0; i < 2; i++) //changed ON4QZ { ratesB[i] = RatesSM16[multiplex_description.PL_PartB][i] - 1; } for (i = 0; i < 2; i++) { L[i] = 2 * N1 * (RX[ratesA[i]] / RY[ratesA[i]]); L[i + 2] = (RX[ratesB[i]] * floor((2 * N2 - 12) / RY[ratesB[i]])); } rowdimL = 2; coldimL = 2; Lvspp = 0; xin1 = 2 * N1; xin2 = 2 * N2; if (Part_Deinterleaver != NULL) free(Part_Deinterleaver); Part_Deinterleaver = deinterleaver(xin1, 13, xin2, 13); for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i] = Part_Deinterleaver[i]; free(Part_Deinterleaver); Part_Deinterleaver = deinterleaver(xin1, 21, xin2, 21); for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i + (xin1 + xin2)] = Part_Deinterleaver[i]; for (i = 0; i < 2; i++) { PL[i] = ratesA[i]; PL[i + 2] = ratesB[i]; } } else if (msc_mode == 3) /* 4-QAM */ { // rylcm = (int) RY[multiplex_description.PL_PartA]; ratesA[0] = (int) RX[multiplex_description.PL_PartA] - 1; N1 = 0; N2 = N_MUX - N1; ratesB[0] = (int) RX[multiplex_description.PL_PartB] - 1; if (robustness_mode == 0) { if (spectrum_occupancy == 0) { L[0] = 0; L[1] = 768; } else { L[0] = 0; L[1] = 837; } } if (robustness_mode == 1) { if (spectrum_occupancy == 0) { L[0] = 0; L[1] = 537; } else { L[0] = 0; L[1] = 627; } } if (robustness_mode == 2) { if (spectrum_occupancy == 0) { L[0] = 0; L[1] = 399; } else { L[0] = 0; L[1] = 435; } } Lvspp = 0; xin1 = 2 * N1; xin2 = 2 * N2; if (Part_Deinterleaver != NULL) free(Part_Deinterleaver); Part_Deinterleaver = deinterleaver(xin1, 21, xin2, 21); for (i = 0; i < xin1 + xin2; i++) Deinterleaver[i] = Part_Deinterleaver[i]; PL[0] = 0; PL[1] = 6; rowdimL = 1; coldimL = 2; } } if (msc_parameters_valid != 0) { for (i = 0; i < lMSC; i++) { trxfrmbufptr = MSC_Demapper[frame_index - 1][i]; received_real[i] = (double) transmission_frame_buffer[2 * trxfrmbufptr]; received_imag[i] = (double) transmission_frame_buffer[2 * trxfrmbufptr + 1]; MSC_cells_sequence[2 * i] = (float) received_real[i]; MSC_cells_sequence[2 * i + 1] = (float) received_imag[i]; transfer_function_MSC[i * 2] = channel_transfer_function_buffer[2 * trxfrmbufptr]; transfer_function_MSC[i * 2 + 1] = channel_transfer_function_buffer[2 * trxfrmbufptr + 1]; } if (enough_frames == 0) { for (i = 0; i < lMSC; i++) { if ((MSC_Demapper[frame_index - 1][i] > max_index_equal_samples) || (MSC_Demapper[frame_index - 1][i] < min_index_equal_samples)) { transfer_function_MSC[2 * i] = 0.0; transfer_function_MSC[2 * i + 1] = 0.0; } SNR_estimation[i] = sqrt(transfer_function_MSC[2 * i] * transfer_function_MSC[i * 2] + transfer_function_MSC[i * 2 + 1] * transfer_function_MSC[i * 2 + 1]); } n_SPPhard = msdhardmsc(received_real, received_imag, lMSC, SNR_estimation, N1, L, rowdimL, coldimL, Lvspp, Deinterleaver, PL, MSD_ITER, 1, SPPhard, VSPPhard, &res_iters, &calc_variance, noise_signal); channel_decoded_data_buffer_data_valid = 2; length_decoded_data = n_SPPhard; } else { MSCAvailable=true; SNR_estimation_valid = 0; if (SNR_estimation_valid < 1) { for (i = 0; i < lMSC; i++) { SNR_estimation[i] = sqrt(transfer_function_MSC[2 * i] * transfer_function_MSC[i * 2] + transfer_function_MSC[i * 2 + 1] * transfer_function_MSC[i * 2 + 1]); } } else { for (i = 0; i < 461; i++) { if (fabs(noise_power_density[i] - 0.0) < DBL_EPSILON) noise_power_density[i] = 1.0; } for (i = 0; i < lMSC; i++) { if (noise_power_density[MSC_Demapper_symbolwise[frame_index - 1][i]] <= 0.0) { exit(EXIT_FAILURE); } part1 = sqrt(transfer_function_MSC[i * 2] * transfer_function_MSC[i * 2] + transfer_function_MSC[i * 2 +1] * transfer_function_MSC[i *2 + 1]); part2 =sqrt(noise_power_density[MSC_Demapper_symbolwise[frame_index - 1][i]]); SNR_estimation[i] = part1 / part2; } } n_SPPhard = msdhardmsc(received_real, received_imag, lMSC, SNR_estimation, N1, L, rowdimL, coldimL, Lvspp, Deinterleaver, PL, MSD_ITER, 1, SPPhard, VSPPhard, &res_iters, &calc_variance, noise_signal); length_decoded_data = n_SPPhard; sum1 = 0.0; sum2 = 0.0; for (i = 0; i < lMSC; i++) { squared_noise_signal[i] = noise_signal[2 * i] * noise_signal[2 * i] + noise_signal[2 * i + 1] * noise_signal[2 * i + 1]; sum1 += (transfer_function_MSC[2 * i] * transfer_function_MSC[2 * i] + transfer_function_MSC[2 * i + 1] * transfer_function_MSC[2 * i + 1]) * squared_noise_signal[i]; sum2 += (transfer_function_MSC[2 * i] * transfer_function_MSC[2 * i] + transfer_function_MSC[2 * i + 1] * transfer_function_MSC[2 * i + 1]) * mean_energy_of_used_cells; } // calc_weighted_variance = sum1 / sum2; for (i = 0; i < lMSC; i++) { squared_noise_signal_buffer[MSC_Demapper[frame_index - 1][i]] = squared_noise_signal[i]; } /* now calc the sum of the reshaped "symbol_period" number of columns */ for (i = 0; i < symbol_period; i++) { weighted_noise_power_density[i] = 0.0; for (j = 0; j < 6 * symbols_per_frame; j++) { weighted_noise_power_density[i] += squared_noise_signal_buffer[i + j * symbol_period]; } } for (i = 0; i < symbol_period; i++) /* rows */ for (j = 0; j < symbols_per_frame; j++) /* columns */ samples_resorted[i][j] = 0.0; for (i = 0; i < lMSC; i++) { totindex = (MSC_Demapper[frame_index - 1][i]) % (symbol_period * symbols_per_frame); posrow = totindex % symbol_period; poscolumn = totindex / symbol_period; samples_resorted[posrow][poscolumn] = squared_noise_signal[i] * (transfer_function_MSC[i * 2] * transfer_function_MSC[i * 2] + transfer_function_MSC[i * 2 + 1] * transfer_function_MSC[i * 2 + 1]); } for (i = 0; i < cnt_MSC_used_carriers; i++) { sum1 = 0.0; for (j = 0; j < symbols_per_frame; j++) sum1 += samples_resorted[MSC_used_carriers[i]][j]; noise_power_density[MSC_used_carriers[i]] = noise_power_density[MSC_used_carriers[i]] * (1.0 - 0.2) + 0.2 * sum1 / MSC_carrier_usage[MSC_used_carriers[i]]; } if (SNR_estimation_valid < 1) { SNR_estimation_valid++; } channel_decoded_data_buffer_data_valid = 1; } if (Lvspp != 0) { VSPPlength = multiplex_description.stream_lengths[0][0] * 8 + multiplex_description.stream_lengths[1][0] * 8; HPPlength = 0; for (i = 0; i < no_of_streams; i++) { HPPlength += 8 * multiplex_description.stream_lengths[0][i]; } n = 0; for (i = 0; i < HPPlength; i++) channel_decoded_data_buffer[n++] = SPPhard[i]; for (i = 0; i < VSPPlength; i++) channel_decoded_data_buffer[n++] = VSPPhard[i]; for (i = 0; i < n_SPPhard - HPPlength; i++) channel_decoded_data_buffer[n++] = SPPhard[HPPlength + i]; } else { for (i = 0; i < n_SPPhard; i++) { channel_decoded_data_buffer[i] = SPPhard[i]; } } } frame_index = (frame_index % 6) + 1; transmission_frame_buffer_wptr =((transmission_frame_buffer_wptr +symbol_period * symbols_per_frame) % (symbol_period *symbols_per_frame * 6)); return; } char getfacchar(double *facdata) { char karakter; int macht, i; macht=64; karakter =0; for (i=0; i < 7 ; i++) { if (facdata[i] == 1.0) { karakter += macht; } macht /= 2; } return(karakter); } qsstv_9.2.6/qsstv/drmrx/crc16_bytewise.cpp0000664000175000017500000001065013203343610017300 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Andreas Dittrich, Torsten Schorr */ /* */ /* Author(s) : Andreas Dittrich (dittrich@eit.uni-kl.de), */ /* Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 27.07.2004 */ /* Last change : 27.07.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* crc16_bytewise.c */ /* */ /******************************************************************************/ /* Description: */ /* CRC-16 checksum calculation of a byte stream */ /* Usage: */ /* */ /* crc16_bytewise(double *checksum, unsigned char *in, long N); */ /* */ /* calculates double checksum of uint8 bytes */ /* */ /******************************************************************************/ /************* * * adjusted for use in own plain C programa * by M.Bos - PA0MBO * * Date Dec 9th 2007 */ #include #include /******************************************************************************/ /* function */ /******************************************************************************/ void crc16_bytewise(double /*@out@ */ checksum[],unsigned char in[], long N) { long int i; int j; unsigned int b = 0xFFFF; unsigned int x = 0x1021; /* (1) 0001000000100001 */ unsigned int y; for (i = 0; i < N - 2; i++) { for (j = 7; j >= 0; j--) { y = (((b >> 15) + (unsigned int) (in[i] >> j)) & 0x01) & 0x01; /* extra parenth pa0mbo */ if (y == 1) b = ((b << 1) ^ x); else b = (b << 1); } } for (i = N - 2; i < N; i++) { for (j = 7; j >= 0; j--) { y = (((b >> 15) + (unsigned int) ((in[i] >> j) & 0x01)) ^ 0x01) & 0x01; /* extra parent pa0mbo */ if (y == 1) b = ((b << 1) ^ x); else b = (b << 1); } } *checksum = (double) (b & 0xFFFF); } qsstv_9.2.6/qsstv/drmrx/crc8_c.cpp0000664000175000017500000000076313203343610015614 0ustar jomajoma /* * File crc8_c.c * * from diorama-1.1.1 by A. Dittrich & T. Schorr * * */ #include #include #include void crc8_c( /*@out@ */ double checksum[], double in[], int N) { int i; unsigned int b = 0xFF; unsigned int x = 0x1D; /* (1) 00011101 */ unsigned int y; for (i = 0; i < N; i++) { y = ((b >> 7) + (int) floor(in[i] + 0.5)) & 0x01; if (y == 1) b = ((b << 1) ^ x); else b = (b << 1); } *checksum = (double) (b & 0xFF); } qsstv_9.2.6/qsstv/drmrx/deinterleaver.cpp0000664000175000017500000000472513203343610017306 0ustar jomajoma /* * File deinterleaver.c * * follows deinterleaver.m by * Torsten Schorr * * Author M.Bos - PA0MBO * Date Feb 21st 2009 * * * N.B. separate routines for different return arguments */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include int *deinterleaver(int xinA, int tA, int xinB, int tB) { int *deinterl; int i; int sA, sB, qA, qB; int PIofi; double part1, part2; double part3; deinterl = (int *) malloc((xinA + xinB) * sizeof(int)); if (deinterl == NULL) { printf("Cannot malloc space for deinterl in routine deinterleaver\n"); exit(EXIT_FAILURE); } if (xinA < 0) { printf("deinterleaver: xinA must be > = 0!\n"); free(deinterl); exit(EXIT_FAILURE); } if (tA < 1) { printf("deinterleaver: tA must be a natural number!\n"); free(deinterl); exit(EXIT_FAILURE); } if (xinB < 6) { printf("deinterleaver: xinB must be >= 6!\n"); free(deinterl); exit(EXIT_FAILURE); } if (tB < 1) { printf("deinterleaver: tB must be a natural number\n"); free(deinterl); exit(EXIT_FAILURE); } if (xinA == 0) sA = 0; else { part1 = log((double) xinA); part2 = log(2.0); part3 = ceil(part1 / part2); sA = (int) pow(2, part3); } qA = sA / 4 - 1; if (xinB == 0) sB = 0; else { part1 = log((double) xinB); part2 = log(2.0); part3 = ceil(part1 / part2); sB = (int) pow(2, part3); } qB = sB / 4 - 1; deinterl[0] = 0; PIofi = 0; for (i = 1; i <= xinA - 1; i++) { PIofi = (tA * PIofi + qA) % sA; while (PIofi >= xinA) { PIofi = (tA * PIofi + qA) % sA; } deinterl[PIofi] = i; } deinterl[xinA] = xinA; PIofi = 0; for (i = 1; i <= xinB - 1; i++) { PIofi = (tB * PIofi + qB) % sB; while (PIofi >= xinB) { PIofi = (tB * PIofi + qB) % sB; } deinterl[PIofi + xinA] = i + xinA; } return (deinterl); } qsstv_9.2.6/qsstv/drmrx/demodulator.cpp0000664000175000017500000012303613203343610016771 0ustar jomajoma#include "demodulator.h" #include "appglobal.h" #include "drm.h" #include #include #include "nrutil.h" #include "utils/supportfunctions.h" #include demodulator *demodulatorPtr; void ludcmp(float **, int, int *, float *); void lubksb(float **, int, int *, float *); int Ts_list[DRMNUMMODES] = { Ts_A, Ts_B, Ts_C, Ts_D }; int Tu_list[DRMNUMMODES] = { Tu_A, Tu_B, Tu_C, Tu_D }; int Tg_list[DRMNUMMODES] = { Tg_A, Tg_B, Tg_C, Tg_D }; float FAC_cells_sequence[200]; bool FACAvailable; float deltaFS; float freqOffset; float tempbuf[30000]; demodulator::demodulator() { } demodulator::~demodulator() { fftwf_destroy_plan(p1); } void demodulator::init() { int i,j,k; FACAvailable=false; N_symbols_mode_detection = 20; N_symbols_frequency_pilot_search = 15; time_offset_log_last = 0; symbol_counter = 0; N_samples_needed = N_symbols_mode_detection * 320; input_samples_buffer_request = N_samples_needed; SNR_time_out_counter = SNR_TIMEOUT; fac_not_valid_counter = FACVALIDCNTR; mode_and_occupancy_code_last = -1; timeSyncFlag = false; frequencySyncFlag = false; frameSyncFlag = false; doSynchronize=false; rsbufwidx = 0; symbufwidx = 0; iterationCounter=0; samplerate_offset_estimation = 0; samplerate_offset=0; smp_rate_conv_fft_phase_diff = 0; smp_rate_conv_fft_phase_offset = 0; smp_rate_conv_in_out_delay = 0; transmission_frame_buffer_data_valid = 0; p1 = fftwf_plan_dft_1d(256,(fftwf_complex *)ss,(fftwf_complex *)S, FFTW_FORWARD, FFTW_PATIENT); counter=0; k = 0; for (i = 0; i < 4; i++) // number of robustness modes { for (j = 0; j < 6; j++) /* number of spectrumoccupancies */ { no_of_used_cells_per_frame_list[k++] = (K_min_K_max_list[1][j + i * 6] - K_min_K_max_list[0][j + i * 6] + 1 - no_of_unused_carriers_list[i]) * symbols_per_frame_list[i]; } } sigmaq_noise_list[0] = (float) pow(10.0, -16.0 / 10.0); sigmaq_noise_list[1] = (float) pow(10.0, -14.0 / 10.0); sigmaq_noise_list[2] = (float) pow(10.0, -14.0 / 10.0); sigmaq_noise_list[3] = (float) pow(10.0, -12.0 / 10.0); SNR_timeout_counter=0; delta_freq_offset=0; } bool demodulator::demodulate(float *sigin,int numSamples) { int i; numberOfSamples=numSamples; transmission_frame_buffer_data_valid = 0; // fac_valid can be -1,0,1 addToLog(QString("block %1 samples %2" ).arg(iterationCounter).arg(numSamples),LOGDRMDEMOD); // if(iterationCounter<40) arrayDump(QString("DEM %1").arg(iterationCounter),sigin,128,true); // arrayDump(QString("bl%1").arg(iterationCounter),sigin,32,true); // logfile->addToAux(QString("block %1").arg(iterationCounter)); // arrayDump(QString("rs"),sigin,numSamples*2,true); // if (fac_valid == 0) // { // fac_not_valid_counter--; // if (fac_not_valid_counter <= 0) // { // doSynchronize = true; // fac_not_valid_counter = FACVALIDCNTR; // } // } // else // { // if (fac_valid == 1) // { // fac_not_valid_counter = FACVALIDCNTR; // } // } if (doSynchronize) { doSynchronize = false; init(); } if (numberOfSamples> 0) { ++iterationCounter; // logfile->addToAux(QString("iterationCounter %1").arg(iterationCounter)); // arrayDump("sig1",sigin,RXSTRIPE,true); // logfile->addToAux(QString("rsbufwidx %1 offset %2").arg(rsbufwidx).arg(320 * N_symbols_mode_detection/2)); // arrayDump("sigD",&rs_buffer[320 * N_symbols_mode_detection],16,true); for(i=0;i20) { for(i=0;i<(256*block);i++)tempbuf[i]=rs_buffer[2*i]; psdmean(tempbuf, psd, 256, block); /* globals pa0mbo */ for(i=0;i<(256*block);i++)tempbuf[i]=rs_buffer[2*i+1]; psdmean(tempbuf, cpsd, 256, block); /* globals pa0mbo */ } } if(!timeSync()) { return false; } if(!frequencySync()) { return false; } if(!frameSync()) { return false; } if(channelEstimation()) { channel_decoding(); srcDecoder->decode(); } if(doSynchronize) { // see if we have to save the data (for BSR and endOfImage) // srcDecoder.checkSaveImage(); } return true; } bool demodulator::timeSync() { int i; samplerate_offset= samplerate_offset_estimation; if (!timeSyncFlag) { frequencySyncFlag=false; // enough data for time sync ? N_samples_needed = N_symbols_mode_detection * 320 - rsbufwidx; if (N_samples_needed > 0) { input_samples_buffer_request = N_samples_needed; return false; } spectrum_occupancy = -1; /* -1 denotes unknown */ getmode(rs_buffer, N_symbols_mode_detection * 320, &mode_block); robustness_mode = mode_block.mode_indx; time_offset = mode_block.time_offset; samplerate_offset_estimation = mode_block.sample_rate_offset; frequency_offset_fractional_init = mode_block.freq_offset_fract; time_offset_integer = (int) floor(time_offset + 0.5); if(robustness_mode!=99) { addToLog(QString("numSamples %1, robustmode %2,timeoffset %3,smplrateOffsetEst %4,freqOffsetFracInit %5,timeOffsetInteger %6") .arg(numberOfSamples).arg( robustness_mode).arg(time_offset).arg(samplerate_offset_estimation).arg(frequency_offset_fractional_init).arg(time_offset_integer),LOGDRMDEMOD); } if ((fabsf(samplerate_offset_estimation) > 200.0E-5) && (robustness_mode != 99)) { // sample_rate offset too large N_samples_needed = N_symbols_mode_detection * 320; input_samples_buffer_request = N_samples_needed; rsbufwidx = 0; // samplerate_offset_estimation=0; return false; } if (robustness_mode != 99) { // logfile->addToAux("timesync found"); addToLog(QString("found robustness_mode: %1").arg(robustness_mode),LOGDRMDEMOD); timeSyncFlag = true; Ts = Ts_list[robustness_mode]; Tu = Tu_list[robustness_mode]; Tg = Tg_list[robustness_mode]; Tgh = (int) floor(Tg / 2 + 0.5); symbols_per_frame = symbols_per_frame_list[robustness_mode]; K_dc = Tu / 2; K_modulo = Tu; for (i = 0; i < 21; i++) time_ref_cells_k[i] = time_ref_cells_k_list[robustness_mode][i]; for (i = 0; i < 21; i++) time_ref_cells_theta_1024[i] = time_ref_cells_theta_1024_list[robustness_mode][i]; y = y_list[robustness_mode]; symbols_per_2D_window = symbols_per_2D_window_list[robustness_mode]; symbols_to_delay = symbols_to_delay_list[robustness_mode]; // symbol align rs_buffer rsbufwidx = rsbufwidx - time_offset_integer; for (i = 0; i < rsbufwidx; i++) { rs_buffer[i * 2] = rs_buffer[(i + time_offset_integer) * 2]; rs_buffer[i * 2 + 1] =rs_buffer[(i + time_offset_integer) * 2 + 1]; } counter++; (void) getofdm(NULL, 0.0, 0.0, 0.0, Ts, Tu, NULL, NULL, 1, 1, 1); /* initialisation */ } else { samplerate_offset_estimation = 0.0; int shift=320 * N_symbols_mode_detection; // int shift=512; memmove(rs_buffer,&rs_buffer[shift*2],sizeof(float)*2*(rsbufwidx-shift)); rsbufwidx -= shift; // arrayDump("sig2",rs_buffer,16,true); // for (i = 0; i < rsbufwidx; i++) /* pa0mbo was rsbufwidx-1 ? */ // { // rs_buffer[i * 2] = rs_buffer[(shift + i) * 2]; // rs_buffer[i * 2 + 1] = rs_buffer[(shift + i) * 2 + 1]; // } N_samples_needed = N_symbols_mode_detection * 320 - rsbufwidx; if (N_samples_needed > 0) { input_samples_buffer_request = N_samples_needed; } else { input_samples_buffer_request = 0; } return false; } addToLog(QString("timeSync found robustness mode:%1").arg(robustness_mode),LOGDRMDEMOD); } return true; } bool demodulator::frequencySync() { int i,j; int sp_idx, K_min_, K_max_, K_dc_indx, K_dc_plus2_indx; int K_min_indx, K_min_minus4_indx, K_max_indx, K_max_plus1_indx; float tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; // float energy_ratio_K2_to_K0; float energy_ratio_K_max_to_K_max_p1; float energy_ratio_K_min_to_K_min_m4; float spectrum_occupancy_indicator[6]; int t_smp; struct drmComplex S_buffer[288][20]; /* pa0mbo check */ if (!frequencySyncFlag) { frameSyncFlag=false; // enough f=date for pilot search? N_samples_needed = (N_symbols_frequency_pilot_search + 1) * Ts - (rsbufwidx); if (N_samples_needed > 0) { input_samples_buffer_request = N_samples_needed; return false; } Zi[0] = -1.0; delta_time_offset_integer = 0; freq_offset_init = frequency_offset_fractional_init; time_offset_fractional_init = time_offset - time_offset_integer; delta_time_offset_I_init = samplerate_offset_estimation * Ts; t_smp = 0; for (i = 0; i < N_symbols_frequency_pilot_search; i++) { delta_time_offset_integer = getofdm(&rs_buffer[2 * t_smp], time_offset_fractional_init,freq_offset_init, delta_time_offset_I_init, Ts, Tu, Zi, symbol_temp, 0, 1,1); for (j = 0; j < K_modulo; j++) { symbol_buffer[(i * K_modulo + j) * 2] = symbol_temp[j * 2]; symbol_buffer[(i * K_modulo + j) * 2 + 1] = symbol_temp[j * 2 + 1]; } t_smp = t_smp + Ts + delta_time_offset_integer; } freq_offset_integer = getfoffsint(symbol_buffer, N_symbols_frequency_pilot_search, K_dc,K_modulo, Tu); // prepare for new round delta_time_offset_integer = 0; freq_offset_init = -freq_offset_integer + frequency_offset_fractional_init; time_offset_fractional_init = 0.0; Zi[0] = -1.0; // detmn frequency occupancy // start with reshaping symbol_buffer to S_buffer for (i = 0; i < N_symbols_frequency_pilot_search; i++) { for (j = 0; j < K_modulo; j++) { (S_buffer[j][i]).re = symbol_buffer[(j + i * K_modulo) * 2]; (S_buffer[j][i]).im = symbol_buffer[(j + i * K_modulo) * 2 + 1]; } } /* now per freq occupancy mode */ for (sp_idx = 0; sp_idx < 2; sp_idx++) { K_min_ = K_min_K_max_list[0][sp_idx + robustness_mode * 6]; K_max_ = K_min_K_max_list[1][sp_idx + robustness_mode * 6]; if (K_min_ != K_max_) { K_dc_indx = (int) floor(freq_offset_integer / (2.0 * M_PI) + 0.5) + Tu / 2; K_dc_indx = K_dc_indx % Tu; K_dc_plus2_indx = (K_dc_indx + 2 + Tu) % Tu; K_min_indx = (K_dc_indx + K_min_ + Tu) % Tu; K_min_minus4_indx = (K_min_indx - 4 + Tu) % Tu; K_max_indx = (K_dc_indx + K_max_ + Tu) % Tu; K_max_plus1_indx = (K_max_indx + 1 + Tu) % Tu; // calc energy ratios tmp1 = 0.0; tmp2 = 0.0; tmp3 = 0.0; tmp4 = 0.0; tmp5 = 0.0; tmp6 = 0.0; for (i = 0; i < N_symbols_frequency_pilot_search; i++) { tmp1 += (S_buffer[K_dc_plus2_indx][i]).re * (S_buffer[K_dc_plus2_indx][i]).re + (S_buffer[K_dc_plus2_indx][i]).im * (S_buffer[K_dc_plus2_indx][i]).im; tmp2 += (S_buffer[K_dc_indx][i]).re * (S_buffer[K_dc_indx][i]).re + (S_buffer[K_dc_indx][i]).im * (S_buffer[K_dc_indx][i]).im; tmp3 += (S_buffer[K_max_indx][i]).re * (S_buffer[K_max_indx][i]).re + (S_buffer[K_max_indx][i]).im * (S_buffer[K_max_indx][i]).im; tmp4 += (S_buffer[K_max_plus1_indx][i]).re * (S_buffer[K_max_plus1_indx][i]).re + (S_buffer[K_max_plus1_indx][i]).im * (S_buffer[K_max_plus1_indx][i]).im; tmp5 += (S_buffer[K_min_indx][i]).re * (S_buffer[K_min_indx][i]).re + (S_buffer[K_min_indx][i]).im * (S_buffer[K_min_indx][i]).im; tmp6 += (S_buffer[K_min_minus4_indx][i]).re * (S_buffer[K_min_minus4_indx][i]).re + (S_buffer[K_min_minus4_indx][i]).im * (S_buffer[K_min_minus4_indx][i]).im; } // energy_ratio_K2_to_K0 = tmp1 / tmp2; energy_ratio_K_max_to_K_max_p1 = tmp3 / tmp4; energy_ratio_K_min_to_K_min_m4 = tmp5 / tmp6; spectrum_occupancy_indicator[sp_idx] = energy_ratio_K_min_to_K_min_m4 + energy_ratio_K_max_to_K_max_p1; } else spectrum_occupancy_indicator[sp_idx] = 0.0; } // detmn max in spectrum_occupancy_indicator and its index tmp1 = 0.0; for (sp_idx = 0; sp_idx < 2; sp_idx++) { if (spectrum_occupancy_indicator[sp_idx] > tmp1) { tmp1 = spectrum_occupancy_indicator[sp_idx]; spectrum_occupancy_estimation = sp_idx; } } frequencySyncFlag = true; addToLog(QString("spectrum occupancy estimation:%1").arg(spectrum_occupancy_estimation),LOGDRMDEMOD); } return true; } bool demodulator::frameSync() { int i,j,k; int symbol0; int symbol_no_to_equalize; int t_smp; if (!frameSyncFlag) { initChannelEstimation=true; // enough data ? N_symbols_needed = symbols_per_frame + symbols_per_2D_window - 1; N_samples_needed = (N_symbols_needed + 1) * Ts - (rsbufwidx); if (N_samples_needed > 0) { input_samples_buffer_request = N_samples_needed; return false; } t_smp = 0; for (i = 0; i < symbols_per_frame; i++) { delta_time_offset_integer = getofdm(&rs_buffer[2 * t_smp], time_offset_fractional_init,freq_offset_init, delta_time_offset_I_init, Ts, Tu, Zi,symbol_temp, 0, 1,1); for (j = 0; j < K_modulo; j++) { symbol_buffer[(i * K_modulo + j) * 2] = symbol_temp[j * 2]; symbol_buffer[(i * K_modulo + j) * 2 + 1] = symbol_temp[j * 2 + 1]; } t_smp = t_smp + Ts + delta_time_offset_integer; } // search first symbol of frame using time ref cells symbol0 = getsymbolidx(symbol_buffer, symbols_per_frame, time_ref_cells_k,time_ref_cells_theta_1024, K_dc, K_modulo, 21); symbol_no_to_equalize =((symbol0 - symbols_to_delay + symbols_per_frame) % symbols_per_frame) + 1; frameSyncFlag = true; symbol_counter = 0; // frame align rs_buffer if (symbol_no_to_equalize != 1) { rsbufwidx -= (symbol_no_to_equalize - 1) * Ts; for (j = 0; j < rsbufwidx; j++) /* pa0mbo was rsbufwidx 22-4-07 now better */ { rs_buffer[j * 2] = rs_buffer[((symbol_no_to_equalize - 1) * Ts + j) * 2]; rs_buffer[j * 2 + 1] = rs_buffer[((symbol_no_to_equalize - 1) * Ts + j) * 2 + 1]; } } symbufwidx = 0; Zi[0] = -1.0; t_smp = 0; for(i=0;i<(Tu_A * 2 * 26);i++) { symbol_buffer[i]=0; } for (i = 0; i 0) { input_samples_buffer_request = N_samples_needed; return false; } // now set the parameter spectrum_occupancy if (spectrum_occupancy <= 0) { if (spectrum_occupancy_estimation < 0) spectrum_occupancy = 3; else spectrum_occupancy = spectrum_occupancy_estimation; } if (spectrum_occupancy > 3) spectrum_occupancy = 3; // 4 and 5 not yet supported mode_and_occupancy_code = mode_and_occupancy_code_table[robustness_mode * 6 + spectrum_occupancy]; if (mode_and_occupancy_code < 0) { spectrum_occupancy = 1; mode_and_occupancy_code = mode_and_occupancy_code_table[robustness_mode * 6 + spectrum_occupancy]; } if (mode_and_occupancy_code != mode_and_occupancy_code_last) { K_min = K_min_K_max_list[0][spectrum_occupancy + robustness_mode * 6]; K_max = K_min_K_max_list[1][spectrum_occupancy + robustness_mode * 6]; carrier_per_symbol = K_max - K_min + 1; (void) getofdmsync(NULL, Ts, Tu, NULL, K_max - K_min + 1, 0, NULL, NULL, 1, 1, 1); /* initialisation */ // reformat pilot index stuff into th K_dc/K_modulo block // first call listsinit to get gain_ref_cells_k etc // Jan 5th 2009 changed listsinit() call to an include of all code from listsinit.c Tu = Tu_list[robustness_mode]; Ts = Ts_list[robustness_mode]; Tg = Ts - Tu; sigmaq_noise = sigmaq_noise_list[robustness_mode]; symbols_per_frame = symbols_per_frame_list[robustness_mode]; for (i = 0; i < 3; i++) { freq_ref_cells_k[i] = freq_ref_cells_k_list[robustness_mode][i]; freq_ref_cells_theta_1024[i] = freq_ref_cells_theta_1024_list[robustness_mode][i]; } cnt_time_ref_cells = time_ref_cells_cnt_list[robustness_mode]; for (i = 0; i < cnt_time_ref_cells; i++) { time_ref_cells_k[i] = time_ref_cells_k_list[robustness_mode][i]; time_ref_cells_theta_1024[i] =time_ref_cells_theta_1024_list[robustness_mode][i]; } K_min = K_min_K_max_list[0][spectrum_occupancy_estimation + robustness_mode * 6]; K_max = K_min_K_max_list[1][spectrum_occupancy_estimation + robustness_mode * 6]; carrier_per_symbol = K_max - K_min + 1; for (i = 0; i < 4; i++) { power_boost[i] = power_boost_list[robustness_mode][spectrum_occupancy_estimation][i]; } x = x_list[robustness_mode]; y = y_list[robustness_mode]; k0 = k0_list[robustness_mode]; Q_1024 = Q_1024_list[robustness_mode]; mean_energy_of_used_cells =(float) (no_of_used_cells_per_frame_list[spectrum_occupancy_estimation + robustness_mode * 6] + 3 + cnt_time_ref_cells); rndcnt = 0; for (s = 0; s < symbols_per_frame; s++) { nnn = s % y; m = (int) floor((double) (s / y)); p_min = (int) ceil((double) ((K_min - k0 - x * nnn) / (x * y))); p_max = (int) floor((double) ((K_max - k0 - x * nnn) / (x * y))); for (p = p_min; p <= p_max; p++) { k = k0 + x * nnn + x * y * p; theta_1024 = (4*Z_256_list[robustness_mode][nnn][m]+p*W_1024_list[robustness_mode][nnn][m]+p*p*(1 +s)*Q_1024) % 1024; a = sqrtf(2.0); // power boost for (i = 0; i < 4; i++) { if (k == power_boost[i]) a = 2; } // is time ref cell ? if (s == 0) { for (i = 0; i < cnt_time_ref_cells; i++) { if (k == time_ref_cells_k[i]) { indx = i; theta_1024 = time_ref_cells_theta_1024[indx]; a = sqrtf(2.0); mean_energy_of_used_cells -= 1.0; } } } // is frequence reference cell? for (i = 0; i < 3; i++) { if (k == freq_ref_cells_k[i]) { indx = i; theta_1024 = freq_ref_cells_theta_1024[indx]; if (robustness_mode == 3) { theta_1024 = (theta_1024 + 512 * s) % 1024; } a = sqrtf(2.0); mean_energy_of_used_cells -= 1.0; } } gain_ref_cells_k[rndcnt] = k + s * carrier_per_symbol; gain_ref_cells_theta_1024[rndcnt] = theta_1024; gain_ref_cells_a[rndcnt++] = a; mean_energy_of_used_cells =(float) (mean_energy_of_used_cells - 1.0 + a * a); } } mean_energy_of_used_cells /=no_of_used_cells_per_frame_list[spectrum_occupancy_estimation + robustness_mode * 6]; addToLog(QString("mean_energy_of_used_cells %1").arg(mean_energy_of_used_cells),LOGDRMDEMOD); // precompute 2-D Wiener filter matrix // uses gain_ref_cells etc // and rndcnt symbols_per_2D_window = symbols_per_2D_window_list[robustness_mode]; symbols_to_delay = symbols_to_delay_list[robustness_mode]; f_cut_t = 0.0675 / (1.0 * (double) y); f_cut_k = 1.75 * (float) Tg / (float) Tu; for(i=0;i<5;i++) cnt_tr_cells[i]=0; // start nnn-loop for (nnn = 0; nnn < y; nnn++) { for (i = 0; i < rndcnt; i++) { training_cells_k[nnn][i] = (gain_ref_cells_k[i] - K_min +(symbols_per_frame -nnn) * carrier_per_symbol) % (symbols_per_frame * carrier_per_symbol) + K_min; } // cnt_tr_cells[nnn] = 0; for (i = 0; i < rndcnt; i++) { if ((training_cells_k[nnn][i] - K_min) <(carrier_per_symbol * symbols_per_2D_window)) { gain_ref_cells_subset_index[nnn][cnt_tr_cells[nnn]] = i; gain_ref_cells_subset[nnn][(cnt_tr_cells[nnn])++] =training_cells_k[nnn][i]; } } cnt_next_pilot_cells[nnn] = 0; for (i = 0; i < rndcnt; i++) { if (((training_cells_k[nnn][i] - K_min) >= (carrier_per_symbol * symbols_per_2D_window)) && ((training_cells_k[nnn][i] - K_min) < carrier_per_symbol * (symbols_per_2D_window + 1))) { next_pilot_cells_k_index[nnn][cnt_next_pilot_cells[nnn]] = i; next_pilot_cells_k[nnn][(cnt_next_pilot_cells[nnn])++] = ((training_cells_k[nnn][i]- K_min) % carrier_per_symbol) + K_min; } } // now sort training cells in subset if necessary sortbrkpnt = 0; for (i = 1; i < cnt_tr_cells[nnn]; i++) { if (gain_ref_cells_subset[nnn][i] < gain_ref_cells_subset[nnn][i - 1]) sortbrkpnt = i; // break in data ? } if (sortbrkpnt > 0) { // keep first part in sorttmp for (i = 0; i < sortbrkpnt; i++) { sorttmp[i] = gain_ref_cells_subset[nnn][i]; sorttmp2[i] = gain_ref_cells_subset_index[nnn][i]; /* pa0mbo added 22-jan-2009 */ } // now shift smaller ones to start of vector for (i = 0; i < cnt_tr_cells[nnn] - sortbrkpnt; i++) { gain_ref_cells_subset[nnn][i] = gain_ref_cells_subset[nnn][i + sortbrkpnt]; gain_ref_cells_subset_index[nnn][i] =gain_ref_cells_subset_index[nnn][i + sortbrkpnt]; } // replace last part from tmp for (i = cnt_tr_cells[nnn] - sortbrkpnt; i < cnt_tr_cells[nnn];i++) { gain_ref_cells_subset[nnn][i] =sorttmp[i + sortbrkpnt - cnt_tr_cells[nnn]]; gain_ref_cells_subset_index[nnn][i] =sorttmp2[i + sortbrkpnt - cnt_tr_cells[nnn]]; } sortbrkpnt = 0; } // copy to training_cells_k for (i = 0; i < cnt_tr_cells[nnn]; i++) { training_cells_k[nnn][i] = gain_ref_cells_subset[nnn][i]; } gain_ref_cells_per_window = cnt_tr_cells[nnn]; for (k_index1 = 0; k_index1 < gain_ref_cells_per_window; k_index1++) { for (k_index2 = 0; k_index2 < gain_ref_cells_per_window;k_index2++) { k1_pos = (((gain_ref_cells_subset[nnn][k_index1] -K_min)) % carrier_per_symbol) + K_min; t1_pos = (gain_ref_cells_subset[nnn][k_index1] - K_min) / carrier_per_symbol; k2_pos = ((gain_ref_cells_subset[nnn][k_index2] -K_min)) % carrier_per_symbol + K_min; t2_pos = ((gain_ref_cells_subset[nnn][k_index2] - K_min)) / carrier_per_symbol; xsinc1 = (k1_pos - k2_pos) * f_cut_k; xsinc2 = (t1_pos - t2_pos) * f_cut_t; if (k1_pos == k2_pos) xsinc1 = 1.0; else { rest = sin(M_PI * xsinc1); xsinc1 = rest / (M_PI * xsinc1); } if (fabs(xsinc2) < DBL_EPSILON) xsinc2 = 1.0; else { rest = sin(M_PI * xsinc2); xsinc2 = rest / (M_PI * xsinc2); } PHI[k_index1][k_index2] = (float) (xsinc1 * xsinc2); } } for (i = 0; i < gain_ref_cells_per_window; i++) { PHI[i][i] += sigmaq_noise * 2.0 /((gain_ref_cells_a[gain_ref_cells_subset_index[nnn][i]]) * (gain_ref_cells_a[gain_ref_cells_subset_index[nnn][i]])); } // now the matrix inversion from numerical recipes NP = gain_ref_cells_per_window; amatrix = matrix(1, NP, 1, NP); indxlu = ivector(1, NP); collu = fvector(1, NP); for (i = 1; i <= NP; i++) for (j = 1; j <= NP; j++) amatrix[i][j] = PHI[i - 1][j - 1]; ludcmp(amatrix, NP, indxlu, &dlu); /* decompose just once */ for (j = 1; j <= NP; j++) { for (i = 1; i <= NP; i++) collu[i] = 0.0; collu[j] = 1.0; lubksb(amatrix, NP, indxlu, collu); for (i = 1; i <= NP; i++) PHI_INV[i - 1][j - 1] = collu[i]; } free_fvector(collu, 1, NP); free_ivector(indxlu, 1, NP); free_matrix(amatrix, 1, NP, 1, NP); for (k_index1 = 0; k_index1 < (K_max - K_min + 1); k_index1++) { for (k_index2 = 0; k_index2 < gain_ref_cells_per_window; k_index2++) { k1_pos = k_index1 + K_min; t1_pos = symbols_to_delay; k2_pos = (training_cells_k[nnn][k_index2] - K_min) % (K_max -K_min + 1) + K_min; t2_pos = (training_cells_k[nnn][k_index2] - K_min) / (K_max -K_min + 1); xsinc1 = (k1_pos - k2_pos) * f_cut_k; xsinc2 = (t1_pos - t2_pos) * f_cut_t; if (k1_pos == k2_pos) xsinc1 = 1.0; else { rest = sin(M_PI * xsinc1); xsinc1 = rest / (M_PI * xsinc1); } if (t1_pos == t2_pos) xsinc2 = 1.0; else { rest = sin(M_PI * xsinc2); xsinc2 = rest / (M_PI * xsinc2); } THETA[k_index2] = (float) (xsinc1 * xsinc2); } // calc matrix product THETA*PHI_INV for (j = 0; j < NP; j++) { W_symbol[j] = 0.0; for (k = 0; k < NP; k++) W_symbol[j] += THETA[k] * PHI_INV[k][j]; } for (j = 0; j < NP; j++) { W_symbol_blk[nnn][j][k_index1] = W_symbol[j]; } } for (k_index1 = 0; k_index1 < cnt_next_pilot_cells[nnn]; k_index1++) { for (k_index2 = 0; k_index2 < gain_ref_cells_per_window;k_index2++) { k1_pos = next_pilot_cells_k[nnn][k_index1]; t1_pos = symbols_per_2D_window - 1; k2_pos = (training_cells_k[nnn][k_index2] - K_min) % (K_max -K_min + 1) +K_min; t2_pos = (training_cells_k[nnn][k_index2] - K_min) / (K_max -K_min + 1); xsinc1 = (k1_pos - k2_pos) * f_cut_k; xsinc2 = (t1_pos - t2_pos) * f_cut_t; if (k1_pos == k2_pos) xsinc1 = 1.0; else { rest = sin(M_PI * xsinc1); xsinc1 = rest / (M_PI * xsinc1); } if (t1_pos == t2_pos) xsinc2 = 1.0; else { rest = sin(M_PI * xsinc2); xsinc2 = rest / (M_PI * xsinc2); } THETA[k_index2] = (float) (xsinc1 * xsinc2); } /* end k_index2-loop */ // calc matrix product THETA*PHI_INV for (j = 0; j < NP; j++) { W_pilots[j] = 0.0; for (k = 0; k < NP; k++) W_pilots[j] += THETA[k] * PHI_INV[k][j]; } for (j = 0; j < NP; j++) { W_pilots_blk[nnn][j][k_index1] = W_pilots[j]; } } /* end k_index1-loop */ } /* end nnn-loop pa0mbo 26-5-2007 */ for (i = 0; i < rndcnt; i++) { temp = ((gain_ref_cells_k[i] - K_min) / (carrier_per_symbol)) * (K_modulo - carrier_per_symbol); gain_ref_cells_k[i] += temp + K_dc - 1; } lFAC = mkfacmap(robustness_mode, K_dc, K_modulo, FAC_cells_k); mode_and_occupancy_code_last = mode_and_occupancy_code; for (i = 0; i < cnt_tr_cells[y-1]; i++) // joma y-1 was y { next_pilots[2 * i] = 0.0; /* real part */ // modified joma was j now i next_pilots[2 * i + 1] = 0.0; /* imag */ } gain_ref_cells_per_frame = rndcnt; gain_ref_cells_per_y_symbols = rndcnt / (symbols_per_frame / y); } // in matlab code here for display toctic_equalization = 0 etc t_smp = 0; for (i = 0; i < symbols_per_frame; i++) { symbol_counter++; // shifted symbol index nn = (i - symbols_to_delay + symbols_per_frame) % symbols_per_frame; ntwee = nn % y; mtwee = nn / y; for (j = 0; j < cnt_tr_cells[ntwee]; j++) { gain_ref_cells_subset_nn[j] =(mtwee * gain_ref_cells_per_y_symbols + gain_ref_cells_subset_index[ntwee][j]) % gain_ref_cells_per_frame; training_cells_relative_index[j] =(gain_ref_cells_k[gain_ref_cells_subset_nn[j]] +(symbols_per_frame -nn) * K_modulo) % (K_modulo * symbols_per_frame); } cnt_actual_pilots_rel_indx = 0; // logfile->addToAux(QString("block %1").arg(iterationCounter)); for (j = 0; j < cnt_tr_cells[ntwee]; j++) { if ((training_cells_relative_index[j] - (symbols_per_2D_window-1) * K_modulo) >= 0) { actual_pilots_relative_index[cnt_actual_pilots_rel_indx++] = j; } ntc_indx = training_cells_relative_index[j] + i * K_modulo + 1; /* pa0mbo in matlab +1 =OK trcrindx 1 lager dan in M */ hoek =(float) (2.0 * M_PI *(float)gain_ref_cells_theta_1024[gain_ref_cells_subset_nn[j]] /1024.0); tmpreal =(float) (cos(hoek) / gain_ref_cells_a[gain_ref_cells_subset_nn[j]]); tmpimag =(float) (-sin(hoek) /gain_ref_cells_a[gain_ref_cells_subset_nn[j]]); normalized_training_cells[2 * j] = symbol_buffer[2 * ntc_indx] * tmpreal - symbol_buffer[2 * ntc_indx + 1] * tmpimag; /* real part */ normalized_training_cells[2 * j + 1] = symbol_buffer[2 * ntc_indx + 1] * tmpreal + symbol_buffer[2 * ntc_indx] * tmpimag; /* imag part */ } for (j = 0; j < cnt_actual_pilots_rel_indx; j++) { actual_pilots[2 * j] = normalized_training_cells[2 * (actual_pilots_relative_index[j])]; /* real part */ actual_pilots[2 * j + 1] = normalized_training_cells[2 * (actual_pilots_relative_index[j]) + 1]; /* imag */ } temp1 = 0.0; temp2 = 0.0; for (j = 0; j < cnt_actual_pilots_rel_indx; j++) { temp1 += actual_pilots[2 * j] * next_pilots[2 * j] + actual_pilots[2 * j + 1] * next_pilots[2 * j + 1]; /* real part */ temp2 += actual_pilots[2 * j] * next_pilots[2 * j + 1] -actual_pilots[2 * j + 1] * next_pilots[2 * j]; } if (i != 0) delta_freq_offset = (float) atan2(temp2, temp1 + MIN_ABS_H); for (j = 0; j < K_max - K_min + 1; j++) { H[2 * j] = 0.0; H[2 * j + 1] = 0.0; for (k = 0; k < cnt_tr_cells[ntwee]; k++) { H[2 * j] += normalized_training_cells[2 * k] * W_symbol_blk[ntwee][k][j]; H[2 * j + 1] += normalized_training_cells[2 * k + 1] * W_symbol_blk[ntwee][k][j]; } } for (j = 0; j < cnt_actual_pilots_rel_indx; j++) { next_pilots[2 * j] = 0.0; next_pilots[2 * j + 1] = 0.0; for (k = 0; k < cnt_tr_cells[ntwee]; k++) { next_pilots[2 * j] += normalized_training_cells[2 * k] * W_pilots_blk[ntwee][k][j]; next_pilots[2 * j + 1] += normalized_training_cells[2 * k + 1] * W_pilots_blk[ntwee][k][j]; } } for (j = K_min; j <= K_max; j++) { trxbuf_indx = transmission_frame_buffer_wptr + i * K_modulo + K_dc + j; symbuf_indx = (i + symbols_to_delay) * K_modulo + K_dc + j; tmp1 = H[2 * (j - K_min)] * H[2 * (j - K_min)] + H[2 * (j - K_min) +1] * H[2 * (j -K_min) +1] + MIN_ABS_H; tmp2 = H[2 * (j - K_min)] / tmp1; tmp3 = -H[2 * (j - K_min) + 1] / tmp1; transmission_frame_buffer[2 * trxbuf_indx] =symbol_buffer[2 * symbuf_indx] * tmp2 -symbol_buffer[2 * symbuf_indx + 1] * tmp3; transmission_frame_buffer[2 * trxbuf_indx + 1] =symbol_buffer[2 * symbuf_indx] * tmp3 +symbol_buffer[2 * symbuf_indx + 1] * tmp2; channel_transfer_function_buffer[2 * trxbuf_indx] =H[2 * (j - K_min)]; channel_transfer_function_buffer[2 * trxbuf_indx + 1] =H[2 * (j - K_min) + 1]; } // get next symbol if ((iterationCounter>=0) && (iterationCounter<=180)) { // arrayDump("b179",&rs_buffer[2 * t_smp],Ts,true); // logfile->addToAux(QString("block %1").arg(iterationCounter)); // arrayDump("h179",H,K_max - K_min + 1,true); } delta_time_offset_integer =getofdmsync(&rs_buffer[2 * t_smp], Ts, Tu, H, K_max - K_min + 1,delta_freq_offset, Zi, symbol_temp, 0, 1,1); // arrayDump("symtmp",symbol_temp,K_modulo,true); // addToLog(QString("delta_time_offset_integer %1").arg(delta_time_offset_integer),LOGDRMDEMOD); for (j = 0; j < K_modulo; j++) { symbol_buffer[(symbufwidx * K_modulo + j) * 2] = symbol_temp[j * 2]; symbol_buffer[(symbufwidx * K_modulo + j) * 2 + 1] = symbol_temp[j * 2 + 1]; } symbufwidx++; t_smp += Ts + delta_time_offset_integer; /* next symbol */ } /* end i-loop over symbols_per_frame */ // fac_valid=0; freq_offset = Zi[4]; time_offset_fractional = Zi[5]; delta_time_offset_I = Zi[2]; addToLog("GREEN on channel estimation",LOGDRMDEMOD); // clock too slow or too fast: adjust playing speed smp_rate_conv_fft_phase_diff = 4 * (t_smp - N_symbols_needed * Ts); smp_rate_conv_fft_phase_offset = 4 * time_offset_fractional; smp_rate_conv_in_out_delay += smp_rate_conv_fft_phase_diff; addToLog(QString("Rate %1 %2 %3").arg(smp_rate_conv_fft_phase_diff).arg(smp_rate_conv_fft_phase_offset).arg(smp_rate_conv_in_out_delay),LOGDRMDEMOD); // display results freqOffset=-freq_offset * 12000.0 / (float) Tu / (2.0 * M_PI); deltaFS= (1.0 / (delta_time_offset_I / Ts + 1.0) - 1.0) ; samplerate_offset=delta_time_offset_I /Ts; // symbol align rs_buffer // swap symbol buffer symbufwidx -= symbols_per_frame; for (i = 0; i < symbufwidx * K_modulo; i++) { symbol_buffer[i * 2] = symbol_buffer[2 * symbols_per_frame * K_modulo + 2 * i]; symbol_buffer[i * 2 + 1] = symbol_buffer[2 * symbols_per_frame * K_modulo + 2 * i + 1]; } // SNR estimation using FAC cells // mean energy of used cells set in listsinit() sum_MERFAC = 0.0; sum_WMERFAC = 0.0; sum_weight_FAC = 0.0; for (i = 0; i < lFAC; i++) { trxbuf_indx = transmission_frame_buffer_wptr + FAC_cells_k[i]; /* pa0mbo 18-5-2007 checked */ FAC_cells_sequence[i * 2] = transmission_frame_buffer[2 * trxbuf_indx]; FAC_cells_sequence[i * 2 + 1] = transmission_frame_buffer[2 * trxbuf_indx + 1]; t1 = (float) (fabs(FAC_cells_sequence[i * 2]) - sqrt(0.5)); t1 = t1 * t1; t2 = (float) (fabs(FAC_cells_sequence[i * 2 + 1]) - sqrt(0.5)); t2 = t2 * t2; FAC_squared_noise_sequence[i] = t1 + t2; t1 = channel_transfer_function_buffer[trxbuf_indx * 2]; t1 = t1 * t1; t2 = channel_transfer_function_buffer[trxbuf_indx * 2 + 1]; t2 = t2 * t2; squared_weight_sequence[i] = t1 + t2; sum_MERFAC += FAC_squared_noise_sequence[i]; sum_WMERFAC += FAC_squared_noise_sequence[i] * (squared_weight_sequence[i] + 1.0E-10); sum_weight_FAC += squared_weight_sequence[i]; } FACAvailable=true; avgSNRAvailable=true; MERFAC = (float) (log(sum_MERFAC / lFAC + 1.0E-10)); MERFAC /= (log(10.0)); MERFAC *= -10.0; WMERFAC =(float) (log(sum_WMERFAC /(mean_energy_of_used_cells * (sum_weight_FAC + lFAC * 1.0E-10)))); WMERFAC /= (log(10.0)); WMERFAC *= -10.0; SNR_dB = WMERFAC; addToLog(QString("SNR-FAC =%1").arg(SNR_dB),LOGDRMDEMOD); // N_samples_needed = (symbols_per_frame + 1) * Ts - rsbufwidx; if (SNR_dB < SNR_MIN_DB) { SNR_timeout_counter--; if (SNR_timeout_counter <= 0) { doSynchronize = true; SNR_timeout_counter = SNR_TIMEOUT; } transmission_frame_buffer_data_valid = 0; fac_not_valid_counter--; if (fac_not_valid_counter <= 0) { doSynchronize = true; fac_not_valid_counter = FACVALIDCNTR; } } else { SNR_timeout_counter = SNR_TIMEOUT; transmission_frame_buffer_data_valid = 1; fac_valid = 1; } if (doSynchronize) N_samples_needed = N_symbols_mode_detection * 320 - rsbufwidx; else { rsbufwidx -= t_smp; for (i = 0; i < rsbufwidx; i++) { rs_buffer[i * 2] = rs_buffer[(i + t_smp) * 2]; rs_buffer[i * 2 + 1] = rs_buffer[(i + t_smp) * 2 + 1]; } N_samples_needed = (symbols_per_frame + 1) * Ts - rsbufwidx; } if (N_samples_needed > 0) { input_samples_buffer_request = N_samples_needed; } else { input_samples_buffer_request = 0; } return true; } qsstv_9.2.6/qsstv/drmrx/demodulator.h0000664000175000017500000000624613203343610016441 0ustar jomajoma#ifndef DEMODULATOR_H #define DEMODULATOR_H #include #include "drmproto.h" #include "drmdefs.h" #include "sourcedecoder.h" #define SNR_TIMEOUT 10 #define FACVALIDCNTR 10 #define SNR_MIN_DB 3 #define DRMNUMMODES 4 //original //#define SNR_TIMEOUT 3 //#define FAC_NOT_VALID 4 //#define SNR_MIN_DB 5 //#define FAC_NOT_VALID_TIMEOUT 4 extern int Ts_list[DRMNUMMODES]; extern int Tu_list[DRMNUMMODES]; extern int Tg_list[DRMNUMMODES]; extern bool FACAvailable; class demodulator { public: demodulator(); ~demodulator(); void init(); bool demodulate(float *sigin, int numSamples); bool isTimeSync() {return timeSyncFlag;} bool isFrequencySync() {return frequencySyncFlag;} bool isFrameSync() {return frameSyncFlag;} bool isFACAvailable() {return FACAvailable;} private: int iterationCounter; bool timeSync(); bool frequencySync(); bool frameSync(); bool channelEstimation(); int symbol_counter; int N_samples_needed; int SNR_time_out_counter; int fac_not_valid_counter; int mode_and_occupancy_code_last; int rsbufwidx; int symbufwidx; int smp_rate_conv_fft_phase_diff; float smp_rate_conv_fft_phase_offset; int smp_rate_conv_in_out_delay; fftwf_plan p1; drmComplex ss[256], S[256]; // float rs_buffer[DRMBUFSIZE]; float rs_buffer[10*8000]; bool doSynchronize; bool timeSyncFlag; bool frequencySyncFlag; bool frameSyncFlag; int numberOfSamples; smode_info mode_block; float time_offset; float frequency_offset_fractional_init; int time_offset_integer; int counter; int Ts, Tu, Tg, Tgh; float freq_offset_integer; int x,y, k0; int symbols_per_2D_window; int delta_time_offset_integer; float time_offset_fractional_init; float freq_offset_init; float delta_time_offset_I_init; float Zi[6]; float symbol_temp[2 * Tu_A]; float symbol_buffer[Tu_A * 2 * 26]; int time_ref_cells_k[21]; int time_ref_cells_theta_1024[21]; int symbols_to_delay; int N_symbols_needed; int no_of_used_cells_per_frame_list[24]; float sigmaq_noise_list[4]; int gain_ref_cells_k[712]; int gain_ref_cells_theta_1024[712]; float gain_ref_cells_a[712]; int training_cells_k[5][712]; int cnt_tr_cells[5]; int gain_ref_cells_per_frame; int gain_ref_cells_per_y_symbols; float next_pilots[2*70]; /* complex */ //joma int K_min,K_max; float W_symbol_blk[5][208][229]; float W_symbol[208]; float W_pilots_blk[5][208][205]; float W_pilots[208]; int SNR_timeout_counter; float delta_freq_offset; int mode_and_occupancy_code; int carrier_per_symbol; int freq_ref_cells_k[3]; int freq_ref_cells_theta_1024[3]; int power_boost[4]; int Q_1024; int gain_ref_cells_subset[5][209]; int gain_ref_cells_subset_index[5][209]; int cnt_next_pilot_cells[5]; int next_pilot_cells_k_index[5][40]; int next_pilot_cells_k[5][40]; float PHI[208][208]; float PHI_INV[208][208]; float THETA[208]; int gain_ref_cells_subset_nn[209]; int training_cells_relative_index[209]; int actual_pilots_relative_index[209]; float normalized_training_cells[1424]; float actual_pilots[458]; float H[458]; float delta_time_offset_I; float time_offset_fractional; bool initChannelEstimation; }; #endif // DEMODULATOR_H qsstv_9.2.6/qsstv/drmrx/drm.cpp0000664000175000017500000001416613203343610015237 0ustar jomajoma/* * File drm.h * * M.Bos - PA0MBO * Date feb 21st 2009 */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include "drm.h" //float acq_signal[2*DRMBUFSIZE]; //contains complex numbers int input_samples_buffer_request; int symbols_per_frame_list[4] = { 15, 15, 20, 24 }; int time_ref_cells_k_list[4][21] = { {6, 7, 11, 12, 15, 16, 23, 29, 30, 33, 34, 38, 39, 41, 45, 46, 0, 0, 0, 0, 0}, {6, 10, 11, 14, 17, 18, 27, 28, 30, 33, 34, 38, 40, 41, 44, 0, 0, 0, 0, 0, 0}, {7, 8, 13, 14, 21, 22, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0} }; int time_ref_cells_theta_1024_list[4][21] = { {973, 205, 717, 264, 357, 357, 952, 440, 856, 88, 88, 68, 836, 836, 836, 1008, 0, 0, 0, 0, 0}, {304, 331, 108, 620, 192, 704, 44, 432, 588, 844, 651,651, 651, 460, 950, 0, 0, 0, 0, 0, 0}, {432, 331, 108, 620, 192, 704, 44, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0} }; int y_list[4] = { 5, 3, 4, 3 }; int symbols_per_2D_window_list[4] = { 10, 6, 8, 6 }; int symbols_to_delay_list[4] = { 5, 3, 4, 3 }; float cpsd[513], psd[513]; int N_symbols_frequency_pilot_search = 15; int K_min_K_max_list[2][24] = { {2, 2, -102, -114, -98, -110, 1, 1, -91, -103, -87, -99, 1, 1, 0, -69, 0, -67, 0, 0, 0, -44, 0, -43}, {54, 58, 102, 114, 314, 350, 45, 51, 91, 103, 279, 311, 29,31, 0, 69, 0, 213, 0, 0, 0, 44, 0, 135} }; float samplerate_offset_estimation; float samplerate_offset; int N_symbols_mode_detection; int time_offset_log_last; int transmission_frame_buffer_data_valid; int fac_valid=0; int no_of_unused_carriers_list[4] = { 2, 1, 1, 1 }; int freq_ref_cells_k_list[4][3] = { {9, 27, 36}, {8, 24, 32}, {5, 15, 20}, {5, 15, 20}}; int freq_ref_cells_theta_1024_list[4][3] = { {205, 836, 215}, {331, 651, 555}, {788, 1014, 332}, {788, 1014, 332} }; int x_list[4] = { 4, 2, 1, 1 }; int k0_list[4] = { 2, 1, 1, 1 }; int dimw1024[4][2] = { {5, 3}, {3, 5}, {2, 10}, {3, 8} }; /* matrix[mode][n][m] */ int W_1024_list[4][5][10] = { {{228, 341, 455, 0, 0, 0, 0, 0, 0, 0}, {455, 569, 683, 0, 0, 0, 0, 0, 0, 0}, {683, 796, 910, 0, 0, 0, 0, 0, 0, 0}, {910, 0, 114, 0, 0, 0, 0, 0, 0, 0}, {114, 228, 341, 0, 0, 0, 0, 0, 0, 0}}, {{512, 0, 512, 0, 512, 0, 0, 0, 0, 0}, {0, 512, 0, 512, 0, 0, 0, 0, 0, 0}, {512, 0, 512, 0, 512, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {{512, 0, 512, 0, 512, 0, 0, 0, 0, 0}, {0, 512, 0, 512, 0, 0, 0, 0, 0, 0}, {512, 0, 512, 0, 512, 0, 0, 0, 0, 0}, {0, 512, 0, 512, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {{465, 372, 279, 186, 93, 0, 931, 838, 745, 652}, {931, 838, 745, 652, 559, 465, 372, 279, 186, 93}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} }; int Z_256_list[4][5][10] = { {{0, 81, 248, 0, 0, 0, 0, 0, 0, 0}, {18, 106, 106, 0, 0, 0, 0, 0, 0, 0}, {122, 116, 31, 0, 0, 0, 0, 0, 0, 0}, {129, 129, 39, 0, 0, 0, 0, 0, 0, 0}, {33, 32, 111, 0, 0, 0, 0, 0, 0, 0}}, {{0, 57, 164, 64, 12, 0, 0, 0, 0, 0}, {168, 255, 161, 106, 118, 0, 0, 0, 0, 0}, {25, 232, 132, 233, 38, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 57, 164, 64, 12, 0, 0, 0, 0, 0}, {168, 255, 161, 106, 118, 0, 0, 0, 0, 0}, {25, 232, 132, 233, 38, 0, 0, 0, 0, 0}, {168, 255, 161, 106, 118, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {{0, 240, 17, 60, 220, 38, 151, 101, 0, 0}, {110, 7, 78, 82, 175, 150, 106, 25, 0, 0}, {165, 7, 252, 124, 253, 177, 197, 142, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} }; int Q_1024_list[4] = { 36, 12, 10, 14 }; int power_boost_list[4][6][4] = { {{2, 6, 50, 54}, {2, 6, 54, 58}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 3, 43, 45}, {1, 3, 49, 51}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 29, 0, 0}, {1, 31, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}} }; int mode_and_occupancy_code_table[14] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; int robustness_mode, spectrum_occupancy_estimation; int spectrum_occupancy; int symbols_per_frame; int time_ref_cells_cnt_list[4] = { 16, 15, 8, 16 }; int K_modulo, K_dc; float mean_energy_of_used_cells; int FAC_cells_k[65]; float transmission_frame_buffer[82980]; /* complex */ float channel_transfer_function_buffer[82980]; /* complex */ int transmission_frame_buffer_wptr = 0; int lFAC; //Display * display; int runstate; struct mplex_desc multiplex_description; struct audio_info audio_information; struct appl_info application_information; struct stream_info stream_information; struct time_info time_and_date; struct dflttmsg default_text_message; struct dfltdunitasmbly default_data_unit_assembly; struct dfltMOTdirasmbly default_MOT_directory_assembly; struct dfltMOTobjasmbly default_MOT_object_assembly; struct dfltMOTobjasmblyinfo default_MOT_object_assembly_information; struct dfltMOTobj default_MOT_object; int channel_decoded_data_buffer_data_valid; double channel_decoded_data_buffer[110000]; float WMERFAC; /* char text_message[1000]; */ int audio_data_flag; int length_decoded_data; int MSC_Demapper[6][2959]; long bufaucnt[2048]; emscStatus msc_valid; int bodyTotalSegments; int rxSegments; int currentSegmentNumber; unsigned int rxTransportID; QList drmBlockList; sourceDecoder *srcDecoder; uint txTransportID; bool stopDRM; float avgSNR; float lastAvgSNR; bool avgSNRAvailable; QString drmCallsign; qsstv_9.2.6/qsstv/drmrx/drm.h0000664000175000017500000000741213203343610014700 0ustar jomajoma#ifndef DRM_H #define DRM_H /* * File drm.h * * M.Bos - PA0MBO * Date feb 21st 2009 */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include "drmdefs.h" #include "structtemplates.h" #include #include class demodulator; class sourceDecoder; class ftpInterface; extern int input_samples_buffer_request; extern int symbols_per_frame_list[4]; extern int time_ref_cells_k_list[4][21]; extern int time_ref_cells_theta_1024_list[4][21]; extern int y_list[4]; extern int symbols_per_2D_window_list[4]; extern int symbols_to_delay_list[4]; extern int N_symbols_frequency_pilot_search; extern int K_min_K_max_list[2][24]; extern float samplerate_offset_estimation; extern float samplerate_offset; //ON4QZ extern int N_symbols_mode_detection; extern int time_offset_log_last; extern int transmission_frame_buffer_data_valid; extern int fac_valid; extern int no_of_unused_carriers_list[4]; extern int freq_ref_cells_k_list[4][3]; extern int freq_ref_cells_theta_1024_list[4][3]; extern int x_list[4]; extern int k0_list[4]; extern int dimw1024[4][2]; /* matrix[mode][n][m] */ extern int W_1024_list[4][5][10]; extern int Z_256_list[4][5][10]; extern int Q_1024_list[4]; extern int power_boost_list[4][6][4]; extern int mode_and_occupancy_code_table[14]; extern int robustness_mode, spectrum_occupancy_estimation; extern int spectrum_occupancy; extern int symbols_per_frame;extern QString drmCallsign; extern int time_ref_cells_cnt_list[4]; extern int K_modulo, K_dc; extern float mean_energy_of_used_cells; extern int FAC_cells_k[65]; extern float transmission_frame_buffer[82980]; /* complex */ extern float channel_transfer_function_buffer[82980]; /* complex */ extern int transmission_frame_buffer_wptr; extern int lFAC; extern float cpsd[513], psd[513]; //Display * display; extern int runstate; extern struct mplex_desc multiplex_description; extern struct audio_info audio_information; extern struct appl_info application_information; extern struct stream_info stream_information; extern struct time_info time_and_date; extern struct dflttmsg default_text_message; extern struct dfltdunitasmbly default_data_unit_assembly; extern struct dfltMOTdirasmbly default_MOT_directory_assembly; extern struct dfltMOTobjasmbly default_MOT_object_assembly; extern struct dfltMOTobjasmblyinfo default_MOT_object_assembly_information; extern struct dfltMOTobj default_MOT_object; extern int channel_decoded_data_buffer_data_valid; extern double channel_decoded_data_buffer[110000]; extern float WMERFAC; extern bool callsignValid; /* char text_message[1000]; */ extern int audio_data_flag; extern int length_decoded_data; extern int MSC_Demapper[6][2959]; extern long bufaucnt[2048]; extern int spectrum_occupancy_new; extern int msc_mode_new; extern int interleaver_depth_new; extern float freqOffset; extern float deltaFS; //extern char drmCallsign[9]; extern demodulator *demodulatorPtr; enum emscStatus {INVALID,VALID,ALREADYRECEIVED}; extern emscStatus msc_valid; extern int bodyTotalSegments; extern int rxSegments; extern int currentSegmentNumber; extern unsigned int rxTransportID; extern QList drmBlockList; extern uint txTransportID; extern bool stopDRM; extern float avgSNR; extern float lastAvgSNR; extern bool avgSNRAvailable; extern sourceDecoder *srcDecoder; extern QString drmCallsign; #endif qsstv_9.2.6/qsstv/drmrx/drmconstellationframe.cpp0000664000175000017500000000401413203343610021040 0ustar jomajoma#include "drmconstellationframe.h" #include "ui_drmconstellationframe.h" #include #include "drm.h" #include "math.h" #include "appdefs.h" extern float MSC_cells_sequence[2 * 2959]; extern int lMSC; extern bool MSCAvailable; extern int lFAC; extern float FAC_cells_sequence[200]; extern bool FACAvailable; #define CSTRANGE 1.5 #define CSTSPAN 3. drmConstellationFrame::drmConstellationFrame(QWidget *parent) : QFrame(parent), ui(new Ui::drmConstellationFrame) { ui->setupUi(this); lmsc=0; } drmConstellationFrame::~drmConstellationFrame() { delete ui; } void drmConstellationFrame::paintEvent (QPaintEvent *e) { int i,posx,posy; QPainter qpainter (this); // qpainter.drawRect (contentsRect()); qpainter.setPen (QPen (Qt::blue, 2)); qpainter.drawLine (contentsRect().x()+contentsRect().width()/2, contentsRect().y(), contentsRect().x()+contentsRect().width()/2,contentsRect().y()+contentsRect().height()); qpainter.drawLine (contentsRect().x(), contentsRect().y()+contentsRect().height()/2, contentsRect().x()+contentsRect().width(),contentsRect().y()+contentsRect().height()/2); for(i=0;i enum econstellation {FAC,MSC}; namespace Ui { class drmConstellationFrame; } class drmConstellationFrame : public QFrame { Q_OBJECT public: explicit drmConstellationFrame(QWidget *parent = 0); ~drmConstellationFrame(); void setConstellation(econstellation constellation); void clearConstellation(); private: Ui::drmConstellationFrame *ui; void paintEvent (QPaintEvent *); float ConstellationArray[2 * 2959]; int lmsc; }; #endif // DRMCONSTELLATIONFRAME_H qsstv_9.2.6/qsstv/drmrx/drmconstellationframe.ui0000664000175000017500000000774413203343610020710 0ustar jomajoma drmConstellationFrame 0 0 400 300 76 76 76 180 180 180 0 0 0 60 60 60 76 76 76 76 76 76 180 180 180 0 0 0 60 60 60 76 76 76 0 0 0 180 180 180 0 0 0 0 0 0 0 0 0 Frame QFrame::Panel QFrame::Sunken 3 qsstv_9.2.6/qsstv/drmrx/drmdefs.h0000664000175000017500000000160213203343610015535 0ustar jomajoma/* * File drmdefs.h * * M.Bos - PA0MBO * Date Feb 21st 2009 */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #define DRMBUFSIZE 50000 #define Ts_A 320 #define Tu_A 288 #define Tg_A 32 #define Ts_B 320 #define Tu_B 256 #define Tg_B 64 #define Ts_C 240 #define Tu_C 160 #define Tg_C 64 #define Ts_D 200 #define Tu_D 112 #define Tg_D 88 #define RUN_STATE_POWER_ON -2 #define RUN_STATE_INIT -1 #define RUN_STATE_FIRST 0 #define RUN_STATE_NORMAL 1 qsstv_9.2.6/qsstv/drmrx/drmproto.h0000664000175000017500000000626313203343610015767 0ustar jomajoma#ifndef DRMPROTO_H #define DRMPROTO_H /* * file drmproto.h * * defines the protoypes for project RXAMADRM * * PA0MBO - M.BOS * * Date Feb 21st 2009 * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ struct smode_info { int mode_indx; float time_offset; float sample_rate_offset; float freq_offset_fract; }; struct soutblock_ofdm { int OKflag; float phifcl; int dtoffsI; int dfoffsI; float foffs; float toffsfr; }; void init_audio (void); //int monorec (short int *,int n); //void drmfilter (float *, float *, float *, float *, int, int); int demodulate ( /*@null@ */ float *, int, int); void drmfilter1c (float *, float *, float *, int, int); void drmfilter1 (float *, float *, float *, int, int); void initGetmode(int n); void getmode (/*@null@ */ float *, int, /*@null@ *//*@out@ */ smode_info *); float getfoffsint (float *, int, int, int, int); int resample (float *, /*@out@ */ float *, float, int, int); int getofdm ( /*@null@ */ float *, float, float, float, int, int, /*@null@ */ float *, /*@null@ */ float *, int, int, int); int getsymbolidx (float *, int, int *, int *, int, int, int); int getofdmsync ( /*@null@ */ float *, int, int, /*@null@ */ float *, int, float, /*@null@ */ float *, /*@null@ */ float *, int, int, int); int mkfacmap (int, int, int, int /*@out@ */ *); void showFAC ( /*@null@ */ float *, int, /*@null@ */ char argv[], int argc, int); int *deinterleaver (int, int, int, int); int msdhardfac ( /*@out@ */ double *, /*@out@ */ double *, int, /*@out@ */ double *, int, double *, int, int, int *, int *, int, int, double *); int mkmscmap (int, int, int, int, int); int msdhardsdc (double *, double *, int, double *, int, double *, int, int, int, int *, int *, int, int, double *); //void crc16_c (double *, double *, int); /*void copy_mplex_desc(struct mplex_desc *, struct mplex_desc *); int cmp_mplex_desc(struct mplex_desc *, struct mplex_desc *); */ int msdhardmsc (double *, double *, int, double *, int, double *, int, int, int, int *, int *, int, int, /*@out@ */ double *, /*@out@ */ double *, double *, double *, double *); void bits2bytes (double *, int, unsigned char /*@out@ */ *); void crc16_bytewise (double /*@out@ */ *, unsigned char *, long); int deflate_uncompress (unsigned char *, int, char /*@out@ */ *, int, unsigned char /*@out@ */ *, int *, double /*@out@ */ *); float **matrix (long, long, long, long); int *ivector (long, long); float *fvector (long, long); void channel_decoding (void); void source_decoding (void); void crc8_c (double *, double *, int); void psdmean (float *, float *, int, int); void psdcmean (float *, float *, int, int); struct drmComplex { float re; float im; }; #endif qsstv_9.2.6/qsstv/drmrx/drmpsdframe.cpp0000664000175000017500000000351513203343610016755 0ustar jomajoma#include "drmpsdframe.h" #include "ui_drmpsdframe.h" #include #include "drm.h" #include "math.h" #define PSDRANGE 70. #define PSDLOW 0. drmPSDFrame::drmPSDFrame(QWidget *parent) : QFrame(parent), ui(new Ui::drmPSDFrame) { ui->setupUi(this); } drmPSDFrame::~drmPSDFrame() { delete ui; } void drmPSDFrame::paintEvent (QPaintEvent *e) { int i,x1,x2,y1,y2; float y; QPainter qpainter (this); //qpainter.drawRect (contentsRect()); qpainter.setPen (QPen (Qt::blue, 1)); qpainter.drawLine (contentsRect().x()+contentsRect().width()/2, contentsRect().y(), contentsRect().x()+contentsRect().width()/2,contentsRect().y()+contentsRect().height()); qpainter.drawLine (contentsRect().x(), contentsRect().y()+contentsRect().height()/2, contentsRect().x()+contentsRect().width(),contentsRect().y()+contentsRect().height()/2); // draw PSD Info x1=0; y1=contentsRect().height(); for(i=0;iPSDRANGE) y=PSDRANGE; y2=contentsRect().height()-rint((y/PSDRANGE) *(float)contentsRect().height()); x2=(i*contentsRect().width())/(PSDSPAN/4); qpainter.drawLine(x1,y1,x2,y2); x1=x2;y1=y2; } qpainter.setPen (QPen (Qt::red, 1)); x1=0; y1=contentsRect().height(); for(i=0;iPSDRANGE) y=PSDRANGE; y2=contentsRect().height()-rint((y/PSDRANGE) *(float)contentsRect().height()); x2=(i*contentsRect().width())/(PSDSPAN/4); qpainter.drawLine(x1,y1,x2,y2); x1=x2;y1=y2; } QFrame::paintEvent(e); } void drmPSDFrame::setPSD() { for(int i=0;i #define PSDSPAN 512 namespace Ui { class drmPSDFrame; } class drmPSDFrame : public QFrame { Q_OBJECT public: explicit drmPSDFrame(QWidget *parent = 0); ~drmPSDFrame(); void setPSD(); private: Ui::drmPSDFrame *ui; void paintEvent (QPaintEvent *); float psdArray[PSDSPAN]; float psdCArray[PSDSPAN/4]; }; #endif // DRMPSDFRAME_H qsstv_9.2.6/qsstv/drmrx/drmpsdframe.ui0000664000175000017500000000772013203343610016612 0ustar jomajoma drmPSDFrame 0 0 390 239 76 76 76 180 180 180 0 0 0 60 60 60 76 76 76 76 76 76 180 180 180 0 0 0 60 60 60 76 76 76 0 0 0 180 180 180 0 0 0 0 0 0 0 0 0 Frame QFrame::Panel QFrame::Sunken 3 qsstv_9.2.6/qsstv/drmrx/drmrx.cpp0000664000175000017500000000301013203343610015573 0ustar jomajoma#include "drmrx.h" #include "appglobal.h" #include "drm.h" #include "demodulator.h" #include "dispatcher.h" #include "filters.h" drmRx::drmRx(QObject *parent) : QObject(parent),iqFilter(RXSTRIPE) { srcDecoder=new sourceDecoder; demodulatorPtr=new demodulator; } drmRx::~drmRx() { delete srcDecoder; } void drmRx::init() { avgSNR=0; avgSNRAvailable=false; n = DRMBUFSIZE; /* initialisations */ demodulatorPtr->init(); initGetmode( n / 4); rRation = 1.000; samplerate_offset_estimation = 0.0; runstate = RUN_STATE_POWER_ON; /* POWER_ON */ channel_decoding(); runstate = RUN_STATE_INIT; /* INIT */ channel_decoding(); runstate = RUN_STATE_FIRST; /* FIRSTRUN */ runstate = RUN_STATE_NORMAL; /* NORMAL RUN */ srcDecoder->init(); } void drmRx::run(DSPFLOAT *dataPtr) { bool done=false; DSPFLOAT temp; displayDRMStatEvent *ce1; displayDRMInfoEvent *ce2 ; temp=WMERFAC; if(temp<0) temp=0; if(avgSNRAvailable) { avgSNR=(1-0.05)*avgSNR+0.05*temp; ce1 = new displayDRMStatEvent(avgSNR); ce1->waitFor(&done); QApplication::postEvent(dispatcherPtr, ce1); while(!done) { usleep(10);} } if(input_samples_buffer_request ==0) { demodulatorPtr->demodulate(resamp_signal,0); } iqFilter.process(dataPtr,resamp_signal,RXSTRIPE); im=RXSTRIPE; demodulatorPtr->demodulate(resamp_signal,im); done=false; ce2 = new displayDRMInfoEvent; ce2->waitFor(&done); QApplication::postEvent(dispatcherPtr, ce2); while(!done) { usleep(10);} } qsstv_9.2.6/qsstv/drmrx/drmrx.h0000664000175000017500000000067113203343610015252 0ustar jomajoma#ifndef DRMRX_H #define DRMRX_H #include #include "appdefs.h" #include "drmdefs.h" #include "filters.h" class drmRx : public QObject { Q_OBJECT public: explicit drmRx(QObject *parent = 0); ~drmRx(); void init(); void run(DSPFLOAT *dataPtr); void eraseImage(){} signals: public slots: private: int n,im; float rRation; float resamp_signal[2 * DRMBUFSIZE]; drmHilbertFilter iqFilter; }; #endif // DRMRX_H qsstv_9.2.6/qsstv/drmrx/drmstatusframe.cpp0000664000175000017500000001656113203343610017517 0ustar jomajoma#include "drmstatusframe.h" #include "ui_drmstatusframe.h" #include "appglobal.h" #include "drmrx/demodulator.h" #include #include "configparams.h" drmStatusFrame::drmStatusFrame(QWidget *parent) : QFrame(parent), ui(new Ui::drmStatusFrame) { ui->setupUi(this); greenPXM=new QPixmap(40,30); greenPXM->fill(Qt::green); redPXM=new QPixmap(40,30); redPXM->fill(Qt::red); yellowPXM=new QPixmap(40,30); yellowPXM->fill(Qt::yellow); init(); } drmStatusFrame::~drmStatusFrame() { delete ui; } void drmStatusFrame::init() { mode=""; bandwidth=0; interleave=""; protection=""; qam=0; call.clear(); ui->mscLED->setPixmap(*redPXM); ui->facLED->setPixmap(*redPXM); ui->frameLED->setPixmap(*redPXM); ui->timeLED->setPixmap(*redPXM); prevTimeSync=false; prevFacValid=0; prevFrameSync=false; prevMscValid=INVALID; prevCurrentSegment=-1; prevTransportID=0; prevRxSeg=-1; prevRobustnessMode=-1; QString prevCall=""; prevSspectrumOccupancy=-1; prevProtection=-1; prevInterleaverDepth=-1; prevMscMode=-1; prevBodyTotalSegments=-1; prevWMERFAC=-9999; prevFreqOff=-9999; prevBlockCount=-1; } void drmStatusFrame::setStatus() { bool tmp; tmp=demodulatorPtr->isTimeSync(); if(tmp!=prevTimeSync) { prevTimeSync=tmp; if(prevTimeSync) { ui->timeLED->setPixmap(*greenPXM); } else { ui->timeLED->setPixmap(*redPXM); if(prevFacValid) ui->facLED->setPixmap(*redPXM); if(prevFrameSync) ui->frameLED->setPixmap(*redPXM); if(prevMscValid!=INVALID) ui->mscLED->setPixmap(*redPXM); prevFacValid=0; prevFrameSync=false; prevMscValid=INVALID; return; } } tmp=demodulatorPtr->isFrameSync(); if(tmp!=prevFrameSync) { prevFrameSync=tmp; if(tmp) ui->frameLED->setPixmap(*greenPXM); else { ui->frameLED->setPixmap(*redPXM); if(prevFacValid==1) ui->facLED->setPixmap(*redPXM); if(prevMscValid!=INVALID) ui->mscLED->setPixmap(*redPXM); prevFacValid=0; prevMscValid=INVALID; return; } } if(prevFacValid!=fac_valid) { prevFacValid=fac_valid; if(fac_valid==1) ui->facLED->setPixmap(*greenPXM); else { ui->facLED->setPixmap(*redPXM); if(prevMscValid!=INVALID) ui->mscLED->setPixmap(*redPXM); prevMscValid=INVALID; return; } } switch(robustness_mode) { case 0: mode="A"; break; case 1: mode="B"; break; case 2: mode="E"; break; default: mode=""; break; } if(mode=="") return; if(prevRobustnessMode!=robustness_mode) { prevRobustnessMode=robustness_mode; ui->modeEdit->setText(mode); } if(callsignValid) { call=drmCallsign; if(prevCall!=call) { prevCall=call; ui->callEdit->setText(call); lastReceivedCall=call; } } if(prevMscValid!=msc_valid) { prevMscValid=msc_valid; switch(msc_valid) { case INVALID: ui->mscLED->setPixmap(*redPXM); break; case VALID: ui->mscLED->setPixmap(*greenPXM); break; case ALREADYRECEIVED: ui->mscLED->setPixmap(*yellowPXM); break; } } if(prevSspectrumOccupancy!=spectrum_occupancy_new) { prevSspectrumOccupancy=spectrum_occupancy_new; switch(spectrum_occupancy_new) { case 0: bandwidth=2.3; break; case 1: bandwidth=2.5;; break; default:bandwidth=0; break; } ui->bandwidthEdit->setText(QString::number(bandwidth)); } if(prevProtection!=multiplex_description.PL_PartB) { prevProtection=multiplex_description.PL_PartB; switch (multiplex_description.PL_PartB) { case 0: protection="High"; break; case 1: protection="Low"; break; default: ; break; } ui->protectionEdit->setText(protection); } if(prevInterleaverDepth!=interleaver_depth_new) { prevInterleaverDepth=interleaver_depth_new; switch(interleaver_depth_new) { case 0: interleave="Long"; break; case 1: interleave="Short"; break; default: ; break; } ui->interleaveEdit->setText(interleave); } if(prevMscMode!=msc_mode_new) { prevMscMode=msc_mode_new; switch(msc_mode_new) { case 0: qam=64; break; case 1: qam=16; break; case 3: qam=4; break; default: qam=0; break; } ui->qamEdit->setText(QString::number(qam)); } if(prevRxSeg!=rxSegments) { prevRxSeg=rxSegments; ui->rxSegmentsEdit->setText(QString::number(rxSegments)); } int tempWMERFAC =round(WMERFAC); if(prevWMERFAC!=tempWMERFAC) { prevWMERFAC=tempWMERFAC; ui->snrEdit->setText(QString::number(prevWMERFAC)+" dB"); } if(prevFreqOff!=((int)round(freqOffset-350))) { prevFreqOff=((int)round(freqOffset-350)); ui->offsetEdit->setText(QString::number(prevFreqOff)+" Hz"); } if(prevBodyTotalSegments!=bodyTotalSegments) { prevBodyTotalSegments=bodyTotalSegments; ui->totalSegmentsEdit->setText(QString::number(bodyTotalSegments)); ui->blocksReceivedLabel->setMaxBlocks(bodyTotalSegments); } if(prevTransportID!=rxTransportID) { prevTransportID=rxTransportID; ui->transportIDEdit->setText(QString::number(prevTransportID)); } if(prevCurrentSegment!=currentSegmentNumber) { prevCurrentSegment=currentSegmentNumber; ui->currentSegmentEdit->setText(QString::number(prevCurrentSegment)); } if(prevBlockCount!=drmBlockList.count()) { prevBlockCount=drmBlockList.count(); ui->blocksReceivedLabel->setBlocks(drmBlockList); } } QString modeToString(uint mode) { QString tmp; tmp+="Mode: "; switch(mode/10000) { case 0: tmp+="A"; break; case 1: tmp+="B"; break; case 2: tmp+="E"; break; default: tmp+="-"; break; } tmp+="\nBW: "; mode-=(mode/10000)*10000; switch(mode/1000) { case 0: tmp+="2.3"; break; case 1: tmp+="2.5";; break; default:tmp+="---"; break; } tmp+="\nProt: "; mode-=(mode/1000)*1000; switch(mode/100) { case 0: tmp+="High"; break; case 1: tmp+="Low"; break; default:tmp+="---" ; break; } tmp+="\nQAM: "; mode-=(mode/100)*100; switch(mode/10) { case 0: tmp+="4"; break; case 1: tmp+="16"; break; case 2: tmp+="64"; break; default: tmp+="--"; break; } return tmp; } QString compactModeToString(uint mode) { QString tmp; switch(mode/10000) { case 0: tmp+="A"; break; case 1: tmp+="B"; break; case 2: tmp+="E"; break; default: tmp+="-"; break; } tmp+="/"; // bandwidth mode-=(mode/10000)*10000; switch(mode/1000) { case 0: tmp+="2.3"; break; case 1: tmp+="2.5";; break; default:tmp+="---"; break; } tmp+="/"; mode-=(mode/1000)*1000; switch(mode/100) { case 0: tmp+="Hi"; break; case 1: tmp+="Lo"; break; default:tmp+="--" ; break; } tmp+="/"; mode-=(mode/100)*100; switch(mode/10) { case 0: tmp+="4"; break; case 1: tmp+="16"; break; case 2: tmp+="64"; break; default: tmp+="--"; break; } tmp+="/"; switch(mode&1) { case 0: tmp+="Long"; break; case 1: tmp+="Short"; break; default:tmp+="--" ; break; } return tmp; } qsstv_9.2.6/qsstv/drmrx/drmstatusframe.h0000664000175000017500000000206613203343610017157 0ustar jomajoma#ifndef DRMSTATUSFRAME_H #define DRMSTATUSFRAME_H #include "drm.h" #include #include class demodulator; namespace Ui { class drmStatusFrame; } class drmStatusFrame : public QFrame { Q_OBJECT public: explicit drmStatusFrame(QWidget *parent = 0); ~drmStatusFrame(); void init(); void setStatus(); private: Ui::drmStatusFrame *ui; QString call; // void paintEvent (QPaintEvent *e); QString mode; float bandwidth; QString interleave; QString protection; int qam; QPixmap *greenPXM; QPixmap *redPXM; QPixmap *yellowPXM; bool prevTimeSync; int prevFacValid; bool prevFrameSync; emscStatus prevMscValid; int prevCurrentSegment; uint prevTransportID; int prevRxSeg; int prevRobustnessMode; QString prevCall; int prevSspectrumOccupancy; int prevProtection; int prevInterleaverDepth; int prevMscMode; int prevBodyTotalSegments; float prevWMERFAC; int prevFreqOff; int prevBlockCount; }; QString modeToString(uint mode); QString compactModeToString(uint mode); #endif // DRMSTATUSFRAME_H qsstv_9.2.6/qsstv/drmrx/drmstatusframe.ui0000664000175000017500000010527613203343610017354 0ustar jomajoma drmStatusFrame 0 0 285 210 0 0 0 0 8 Frame QFrame::StyledPanel QFrame::Raised 1 0 0 0 0 1 0 15 Offset 40 0 QFrame::Box 0 15 InterL. Bandw 0 15 RX Seg Cur. Seg 40 0 QFrame::Box 40 0 QFrame::Box QAM 40 0 QFrame::Box 40 0 QFrame::Box Protec Total Seg 40 0 QFrame::Box SNR 0 15 Mode 40 0 QFrame::Box 40 0 QFrame::Box 40 0 QFrame::Box 40 0 QFrame::Box Transp. ID 40 0 QFrame::Box Callsign 12 75 true QFrame::Box Qt::AlignCenter 0 17 16777215 17 false 2 1 50 12 1000 12 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 50 50 50 180 180 180 50 50 50 50 50 50 50 50 50 8 75 false true true QFrame::Panel QFrame::Raised 3 Qt::AlignCenter 8 75 true FRAME Qt::AlignCenter 50 12 1000 12 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 50 50 50 180 180 180 50 50 50 50 50 50 50 50 50 8 75 false true true QFrame::Panel QFrame::Raised 3 Qt::AlignCenter 50 12 1000 12 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 50 50 50 180 180 180 50 50 50 50 50 50 50 50 50 8 75 false true true QFrame::Panel QFrame::Raised 3 Qt::AlignCenter 8 75 true TIME Qt::AlignCenter 8 75 true FAC Qt::AlignCenter 40 0 8 75 true MSC Qt::AlignCenter 50 12 1000 12 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 76 76 76 180 180 180 50 50 50 60 60 60 76 76 76 50 50 50 180 180 180 50 50 50 50 50 50 50 50 50 8 75 false true true QFrame::Panel QFrame::Raised 3 Qt::AlignCenter Qt::Vertical 20 40 drmSegmentsView QLabel
drmsegmentsview.h
qsstv_9.2.6/qsstv/drmrx/filter1.cpp0000664000175000017500000000204313203343610016012 0ustar jomajoma /* * File filter1.c * * implements filter routine a la MATLAB * for real data in vector sigin[] * * PA0MBO - M.Bos * Date Feb 21st 2009 * * result is stored in y[] * dataLen is number of elements in input (sigin) and mih is length of * the filter vector h[] * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include void drmfilter1(float *sigin, float *out, float *coef, int dataLen, int coefLen) { int i, j; for (i = 0; i < dataLen; i++) { out[i] = 0.0; for (j = 0; ((j <= i) && (j < coefLen)); j++) { out[i] += coef[j] * sigin[i - j]; } } } qsstv_9.2.6/qsstv/drmrx/filter1c.cpp0000664000175000017500000000236013203343610016157 0ustar jomajoma /* * File filter1c.c * * implements filter routine a la MATLAB * * PA0MBO - M.Bos * Date Feb 21st 2009 * * input signal is complex and should be stored * real 1 / imag component 2 , real 2, imag2 etc.. * * result is stored in y[] in the same manner (y[] is alsdo complex) * dataLen is number of elements in input (sigin) and coefLen is length of * the filter vector h[] * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include void drmfilter1c(float *sigin, float *y, float *coef, int dataLen, int coefLen) { int i, j; for (i = 0; i < dataLen; i++) { y[i * 2] = 0.0; y[i * 2 + 1] = 0.0; for (j = 0; ((j <= i) && (j < coefLen)); j++) { y[i * 2] += coef[j] * sigin[(i - j) * 2]; y[i * 2 + 1] += coef[j] * sigin[(i - j) * 2 + 1]; } } } qsstv_9.2.6/qsstv/drmrx/fixform.cpp0000664000175000017500000000215313203343610016120 0ustar jomajoma#include "fixform.h" #include "ui_fixform.h" #include "drmstatusframe.h" #include "appglobal.h" #include "drmrx/drm.h" #include "configparams.h" fixForm::fixForm(QWidget *parent) : QDialog(parent), ui(new Ui::fixForm) { ui->setupUi(this); } fixForm::~fixForm() { delete ui; } void fixForm::setInfoInternal(int mode, QString fileName, int missing, QByteArray *ba) { common(mode,fileName,missing); // ui->infoTextEdit->appendPlainText("BSR for a picture you send"); ui->previewWidget->openImage(ba); } void fixForm::setInfoExternal(int mode, QString fileName, int missing) { common(mode,fileName,missing); ui->infoTextEdit->appendPlainText("BSR for a picture you received"); ui->previewWidget->openImage(fileName,false,false,false); } void fixForm::common(int mode,QString fileName,int missing) { ui->filenameLineEdit->setText("Filename: "+fileName+"\n"); if(callsignValid) { ui->infoTextEdit->appendPlainText("From: "+ QString(drmCallsign)); } ui->infoTextEdit->appendPlainText(modeToString(mode)); ui->infoTextEdit->appendPlainText(QString("Requested segments: %1").arg(missing)); } qsstv_9.2.6/qsstv/drmrx/fixform.h0000664000175000017500000000071113203343610015563 0ustar jomajoma#ifndef FIXFORM_H #define FIXFORM_H #include namespace Ui { class fixForm; } class fixForm : public QDialog { Q_OBJECT public: explicit fixForm(QWidget *parent = 0); ~fixForm(); void setInfoInternal(int mode, QString fileName, int missing, QByteArray *ba); void setInfoExternal(int mode, QString fileName, int missing); private: Ui::fixForm *ui; void common(int mode, QString fileName, int missing); }; #endif // FIXFORM_H qsstv_9.2.6/qsstv/drmrx/fixform.ui0000664000175000017500000000644513203343610015763 0ustar jomajoma fixForm 0 0 501 299 FIX 200 120 200 120 Qt::Horizontal 40 20 Cancel Fix Qt::Horizontal 40 20 imageViewer QWidget
widgets/imageviewer.h
1
drmSegmentsView QLabel
drmsegmentsview.h
cancelPushButton clicked() fixForm reject() 205 275 250 149 fixPushButton clicked() fixForm accept() 296 275 250 149
qsstv_9.2.6/qsstv/drmrx/getfoffsint.cpp0000664000175000017500000000647213203343610016774 0ustar jomajoma /* * * file getfoffsint.c * * implements get_frequency_offset_integer function * from diorama MATLAB code * * Author M.Bos - PA0MBO * * Date Feb 21st 2009 * * output: freq_offset_integer (float) * inputs: symbol_buffer (filled bu getofdm), N_symbols, K_dc, * K_modulo, Tu * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #define PI (4.0*atan(1.0)) struct cmplxnmbr { float re; float im; }; float getfoffsint(float *symbolbuf, int N_symbols, int K_dc, int K_modulo, int Tu) { int i, j; struct cmplxnmbr S[288][30]; /* Tu x 30 ? pa0mbo? */ float dS_sum[288 * 2]; float tmp1, tmp2; int k_pilot1, k_pilot2, k_pilot3; float abs_dS_sum[288], pilot_indicator[288]; float dummy, freq_offset_integer; int K_dc_offset; /* reshape symbolbuf to matrix S */ for (i = 0; i < N_symbols; i++) { for (j = 0; j < K_modulo; j++) { (S[j][i]).re = symbolbuf[(j + i * K_modulo) * 2]; (S[j][i]).im = symbolbuf[(j + i * K_modulo) * 2 + 1]; } } /* now accumulate phase diffs all carriers */ for (i = 0; i < Tu; i++) { dS_sum[i * 2] = 0.0; dS_sum[i * 2 + 1] = 0.0; } for (i = 1; i < N_symbols; i++) { for (j = 0; j < Tu; j++) { tmp1 = (S[j][i - 1]).re * (S[j][i]).re + /* real ac + bd */ (S[j][i - 1]).im * (S[j][i]).im; tmp2 = (S[j][i - 1]).im * (S[j][i]).re - /* imag. bc - ad */ (S[j][i - 1]).re * (S[j][i]).im; dS_sum[j * 2] += cos(atan2(tmp2, tmp1)); dS_sum[j * 2 + 1] += sin(atan2(tmp2, tmp1)); } } /* detect pilots */ k_pilot1 = (int) ceil((float) (9 * Tu / 288)); k_pilot2 = (int) ceil((float) (27 * Tu / 288)); k_pilot3 = (int) ceil((float) (36 * Tu / 288)); for (i = 0; i < Tu; i++) { abs_dS_sum[i] = (float) sqrt(dS_sum[i * 2] * dS_sum[i * 2] + dS_sum[i * 2 + 1] * dS_sum[i * 2 + 1]); } for (i = 0; i < Tu - k_pilot1; i++) { pilot_indicator[i] = abs_dS_sum[k_pilot1 + i]; } for (i = 0; i < k_pilot1; i++) { pilot_indicator[i + Tu - k_pilot1] = abs_dS_sum[i]; } for (i = 0; i < Tu - k_pilot2; i++) { pilot_indicator[i] += abs_dS_sum[k_pilot2 + i]; } for (i = 0; i < k_pilot2; i++) { pilot_indicator[i + Tu - k_pilot2] += abs_dS_sum[i]; } for (i = 0; i < Tu - k_pilot3; i++) { pilot_indicator[i] += abs_dS_sum[k_pilot3 + i]; } for (i = 0; i < k_pilot3; i++) { pilot_indicator[i + Tu - k_pilot3] += abs_dS_sum[i]; } /* Now find max pilot_indicator and index */ dummy = -1.0E20; K_dc_offset = 0; for (i = 0; i < Tu; i++) { if (pilot_indicator[i] > dummy) { dummy = pilot_indicator[i]; K_dc_offset = i; } } K_dc_offset = ((K_dc_offset - K_dc + Tu / 2 + Tu) % Tu) - Tu / 2; freq_offset_integer = (float) (2 * PI * K_dc_offset); return (freq_offset_integer); } qsstv_9.2.6/qsstv/drmrx/getmode.cpp0000664000175000017500000002405313203343610016075 0ustar jomajoma /* * File getmode.c * * Author M.Bos - PA0MBO * Date Feb 21st 2009 * * routine to determine robustness mode * of baseband drm signal (complex) * in "in" real and imag components * stored alternatively in sequence * * returns number of the mode A=0, B=1, etc... * input param. n is number of samples in rsbuf * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include #include "structtemplates.h" #include "drmproto.h" #include "drmdefs.h" #include "appglobal.h" #include "utils/supportfunctions.h" static /*@only@ */ float *in_, *abs_in_, *abs_in_in_; static /*@only@ */ float *conv_in_, *conv_abs_in_in_; static bool initDone=false; void initGetmode(int n) { if(initDone) return; initDone=true; /* create and initialize arrays */ in_ =(float *) malloc((n - Tu_D) * 2 * sizeof(float)); /* complex data */ if (in_ == NULL) { printf("mem alloc problem in getmode \n"); exit(EXIT_FAILURE); } conv_in_ = (float *)malloc((n - Tu_D) * 2 * sizeof(float)); /* complex */ if (conv_in_ == NULL) { printf("mem alloc problem in getmode \n"); exit(EXIT_FAILURE); } abs_in_ = (float *)malloc(n * sizeof(float)); if (abs_in_ == NULL) { printf("mem alloc problem in getmode \n"); exit(EXIT_FAILURE); } abs_in_in_ = (float *)malloc((n - Tu_D) * sizeof(float)); if (abs_in_in_ == NULL) { printf("mem alloc problem in getmode \n"); exit(EXIT_FAILURE); } conv_abs_in_in_ = (float *)malloc((n - Tu_D) * sizeof(float)); if (conv_abs_in_in_ == NULL) { printf("mem alloc problem in getmode \n"); exit(EXIT_FAILURE); } return; } /* end initializations */ void getmode(float *input, int n, smode_info * result) { float EPSILON = 1.0E-10; float SNR_mode_det = (float) (exp(15.0 * log(10) / 10.0)); float rho; int Ts_list[4] = { Ts_A, Ts_B, Ts_C, Ts_D }; int Tu_list[4] = { Tu_A, Tu_B, Tu_C, Tu_D }; float max_abs_gamma_rel_list[] = { 0.0, 0.0, 0.0, 0.0 }; int theta_list[] = { 0, 0, 0, 0 }; float epsilon_ML_list[] = { 0.0, 0.0, 0.0, 0.0 }; int N_symbols_mode_det, Ts, Tu, Tg, t_smp; int mode, i, j, theta, maxOK; float max_abs_gamma_rel, tmpmax, epsilon_ML; // float frequency_offset_fract; int b[20], time_offset_mean; float sumx, sumy, sumxx, sumxy, slope, boffs; // float a[20]; float gamma[2 * Ts_A], Phi[Ts_A]; float my_rect[Ts_D - Tu_D]; rho = SNR_mode_det / (SNR_mode_det + 1); N_symbols_mode_det = ((n + 1) / Ts_A) - 1; for (mode = 0; mode < 3; mode++) // ON4QZ 3 was 4 { Ts = Ts_list[mode]; Tu = Tu_list[mode]; Tg = Ts - Tu; t_smp = 0; /* initialize arrays with zero's */ for (i = 0; i < Ts; i++) { gamma[i * 2] = 0.0; gamma[i * 2 + 1] = 0.0; Phi[i] = 0.0; } for (i = 0; i < n - Tu; i++) /* complex mult */ { in_[2 * i] = input[2 * i] * input[(i + Tu) * 2] + input[2 * i + 1] * input[(i + Tu) * 2 +1]; in_[2 * i + 1] = -input[2 * i] * input[(i + Tu) * 2 + 1] + input[2 * i + 1] * input[(i + Tu) * 2]; } // arrayDump("gM1",input,16,true); my_rect[0] = 0.5; // ON4QZ for (i = 1; i < Tg; i++) { my_rect[i] = 1.0; } // my_rect[Tg-1] = 0.5; // ON4QZ drmfilter1c(in_, conv_in_, my_rect, n - Tu, Tg); for (i = 0; i < n; i++) { abs_in_[i] = input[i * 2] * input[i * 2] + input[i * 2 + 1] * input[i * 2 + 1]; } for (i = 0; i < n - Tu; i++) { abs_in_in_[i] = abs_in_[i] + abs_in_[i + Tu]; } drmfilter1(abs_in_in_, conv_abs_in_in_, my_rect, n - Tu, Tg); for (j = 0; j < N_symbols_mode_det; j++) { for (i = 0; i < Ts; i++) { gamma[i * 2] = gamma[i * 2] + conv_in_[(t_smp + Tg + i - 1) * 2]; /* pa0mbo -1 ios nieuw */ gamma[i * 2 + 1] = gamma[i * 2 + 1] + conv_in_[(t_smp + Tg + i - 1) * 2 + 1]; Phi[i] = Phi[i] + (float) (0.5 * (EPSILON + conv_abs_in_in_[t_smp + Tg + i - 1])); } t_smp += Ts; } /* detmn max and index in abs(gamma .. rho*Phi) */ theta = 0; max_abs_gamma_rel = -1.0E20; /* debugging printf("==== mode %d === gamma\n",mode); */ for (i = 0; i < Ts; i++) { tmpmax = (float) sqrt(gamma[2 * i] * gamma[2 * i] + gamma[2 * i + 1] * gamma[2 * i + 1]); /* printf("%g\n", tmpmax); */ tmpmax -= rho * Phi[i]; if (tmpmax > max_abs_gamma_rel) { max_abs_gamma_rel = tmpmax; theta = i; } } // arrayDump("gM2",gamma,Ts*2,true); /* printf("===============\n"); */ max_abs_gamma_rel = (float) sqrt(gamma[theta * 2] * gamma[theta * 2] + gamma[theta * 2 + 1] * gamma[theta * 2 + 1]) / (rho * Phi[theta]); epsilon_ML = (float) atan2(gamma[2 * theta], gamma[2 * theta + 1]); max_abs_gamma_rel_list[mode] = max_abs_gamma_rel; theta_list[mode] = theta; epsilon_ML_list[mode] = epsilon_ML; } /* debugging printf("max gamma list %g %g %g %g \n", max_abs_gamma_rel_list[0], max_abs_gamma_rel_list[1], max_abs_gamma_rel_list[2], max_abs_gamma_rel_list[3]); printf("theta list %d %d %d %d \n", theta_list[0], theta_list[1], theta_list[2], theta_list[3]); printf("epsilon ML list %g %g %g %g \n", epsilon_ML_list[0], epsilon_ML_list[1], epsilon_ML_list[2], epsilon_ML_list[3]); end debug info */ /* now decide for particular mode */ max_abs_gamma_rel = -1.0E20; for (i = 0; i < 4; i++) { if (max_abs_gamma_rel_list[i] > max_abs_gamma_rel) { max_abs_gamma_rel = max_abs_gamma_rel_list[i]; mode = i; } } // < 0.6) // was 0.6 { for (i = 0; i < 3; i++) //ON4QZ 3 was 4 { if ((i != mode) && (max_abs_gamma_rel_list[i] > 0.6)) { maxOK = 0; } } } else { maxOK = 0; } if (maxOK == 0) { result->mode_indx = 99; result->time_offset = 0.0; result->sample_rate_offset = 0.0; result->freq_offset_fract = 0.0; return; } else { addToLog("max mode ok",LOGDRMDEMOD); Ts = Ts_list[mode]; Tu = Tu_list[mode]; Tg = Ts - Tu; time_offset_mean = theta_list[mode]; /* pa0mbo checked +1 removed on Dec 22nd 2006 */ // frequency_offset_fract = epsilon_ML_list[mode]; /* now recalculate several vars with the established mode */ for (i = 0; i < n - Tu; i++) { in_[2 * i] = input[2 * i] * input[(i + Tu) * 2] + input[2 * i + 1] * input[(i + Tu) * 2 + 1]; in_[2 * i + 1] = -input[2 * i] * input[(i + Tu) * 2 + 1] + input[2 * i + 1] * input[(i + Tu) * 2]; } my_rect[0] = 0.5; for (i = 1; i < Tg; i++) { my_rect[i] = 1.0; } my_rect[Tg - 1] = 0.5; drmfilter1c(in_, conv_in_, my_rect, n - Tu, Tg); for (i = 0; i < n; i++) { abs_in_[i] = input[i * 2] * input[i * 2] + input[i * 2 + 1] * input[i * 2 + 1]; } for (i = 0; i < n - Tu; i++) { abs_in_in_[i] = abs_in_[i] + abs_in_[i + Tu]; } drmfilter1(abs_in_in_, conv_abs_in_in_, my_rect, n - Tu, Tg); t_smp = Tg + time_offset_mean + Ts / 2; for (j = 0; j < (N_symbols_mode_det - 2); j++) { max_abs_gamma_rel = -1.0E20; for (i = 0; i < Ts; i++) { gamma[i * 2] = conv_in_[(t_smp + i) * 2]; gamma[i * 2 + 1] = conv_in_[(t_smp + i) * 2 + 1]; Phi[i] = (float) (0.5 * (EPSILON + conv_abs_in_in_[t_smp + i])); /* detmn max and its indx */ tmpmax = (float) sqrt(gamma[2 * i] * gamma[2 * i] + gamma[2 * i + 1] * gamma[2 * i + 1]) - rho * Phi[i]; if (tmpmax > max_abs_gamma_rel) { max_abs_gamma_rel = tmpmax; // a[j] = tmpmax; b[j] = i; } } t_smp += Ts; } /* Now least squares to 0...N_symbols_mode_det-3 and b[0] .. */ sumx = 0.0; sumy = 0.0; sumxx = 0.0; sumxy = 0.0; for (i = 0; i < N_symbols_mode_det - 2; i++) { sumx += (float) i; sumy += (float) b[i]; sumxx += (float) i *(float) i; sumxy += (float) i *(float) b[i]; } slope = (float) (((N_symbols_mode_det - 2) * sumxy - sumx * sumy) / ((N_symbols_mode_det - 2) * sumxx - sumx * sumx)); boffs = (float) ((sumy * sumxx - sumx * sumxy) / ((N_symbols_mode_det - 2) * sumxx - sumx * sumx)); } /* printf("in getmode N_symbols_mode_det %d \n", N_symbols_mode_det); printf("mode is %d toffs %g samplroffs %g f_offs_fract %g\n", mode, fmod((boffs + Ts / 2 + time_offset_mean - 1), (float) Ts), slope / ((float) Ts), epsilon_ML_list[mode]); */ /* pa0mbo todo reliability check */ result->mode_indx = mode; result->time_offset = fmodf((boffs + Ts / 2 + time_offset_mean - 1), (float) Ts); /* fp rest pa0mbo was -2 */ result->sample_rate_offset = slope / ((float) Ts); result->freq_offset_fract = epsilon_ML_list[mode]; //logfile->addToAux(QString("%1 %2 %3 %4").arg( mode).arg(result->time_offset).arg(result->sample_rate_offset).arg(result->freq_offset_fract)); } qsstv_9.2.6/qsstv/drmrx/getofdm.cpp0000664000175000017500000003121213203343610016071 0ustar jomajoma /* * File getofdm.c * * Author PA0MBO - M.BOS * DATE Feb 21st 2009 * * implements more or less the get_ofdm_symbol * MATLAB routine from diorama-1.1.1 * * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include "drmproto.h" #include "appglobal.h" #define PI (atan(1.0)*4.0) int getofdm( /*@null@ */ float *rs, float time_offset_fractional_init, float freq_offset_init, float delta_time_offset_I_init, int Ts, int Tu, /*@null@ */ float Zi[], /*@null@ */ float *out, int init, int TIME_SYNC_ENABLE, int FREQ_SYNC_ENABLE) { float EPSILON = 1.0E-10; float max_theta = 10.0; // float max_time_offset_ctrl = 10.0; // float max_delta_time_offset = 2.0; float kP_small_timing_controller = 0.01; float kP_large_timing_controller = 0.01; float threshold_timing_small_large = 2.0; float kI_timing_controller = 0.00020; float kP_small_freq_controller = 0.750; float threshold_freq_small_large = 0.75; float kI_freq_controller = 0.0008; int Tg, Tgh; float phi_freq_correction_last; float delta_time_offset_I; float delta_time_offset_P; float dfreq_offset_I; float freq_offset, time_offset_fractional; int i; float temp1[] = { 0.0, 0.0 }, temp2, temp3, temp4; float temp[] = { 0.0, 0.0 }; float temp5[] = { 0.0, 0.0 }; float temp6, temp7; float temp8[] = { 0.0, 0.0 }; float temp9, temp10; float theta_plus, theta_minus, delta_theta; float time_offset_ctrl; float delta_time_offset; int delta_time_offset_integer; float epsilon_ML, freq_offset_ctrl, dfreq_offset_P; float kP_large_freq_controller, dfreq_offset; float tmptheta, term1; static float *exp_temp; static float *out1; static drmComplex s[288], S[288]; /* 288 = max Tu */ static fftwf_plan p = NULL; if (init == 1) { /* malloc space for arrays */ if ((exp_temp = (float *)malloc(Tu * 2 * sizeof(float))) == NULL) { printf("cannot malloc space for exp_temp in get_ofdm_symbol\n"); exit(EXIT_FAILURE); } if ((out1 = (float *)malloc(Tu * 2 * sizeof(float))) == NULL) { printf("cannot malloc space for out1 in get_ofdm_symbol\n"); exit(EXIT_FAILURE); } if (p != NULL) { fftwf_destroy_plan(p); } p = fftwf_plan_dft_1d(Tu,(fftwf_complex *)s,(fftwf_complex *)S,FFTW_FORWARD, FFTW_ESTIMATE); return (0); } else { /* fixed parameters */ EPSILON = 1.0E-10; max_theta = 5.0; // max_time_offset_ctrl = 10.0; // max_delta_time_offset = 2.0; kP_small_timing_controller = 0.01; kP_large_timing_controller = 0.01; threshold_timing_small_large = 2.0; kI_timing_controller = 0.00005; kP_small_freq_controller = 0.05; kP_large_freq_controller = 0.75; threshold_freq_small_large = 0.5; kI_freq_controller = 0.0008; Tg = Ts - Tu; Tgh = (int) floor(Tg / 2 + 0.5); if (Zi[0] < 0.0) { phi_freq_correction_last = 0.0; delta_time_offset_I = delta_time_offset_I_init; dfreq_offset_I = 0.0; freq_offset = freq_offset_init; time_offset_fractional = time_offset_fractional_init; } else { phi_freq_correction_last = Zi[1]; delta_time_offset_I = Zi[2]; dfreq_offset_I = Zi[3]; freq_offset = Zi[4]; time_offset_fractional = Zi[5]; } if (TIME_SYNC_ENABLE == 1) { temp1[0] = 0.0; temp1[1] = 0.0; temp2 = 0.0; temp3 = 0.0; temp5[0] = 0.0; temp5[1] = 0.0; temp6 = 0.0; temp7 = 0.0; temp8[0] = 0.0; temp8[1] = 0.0; temp9 = 0.0; temp10 = 0.0; for (i = 0; i < Tg + 2; i++) { // logfile->addToAux(QString("tm1 %1 %2 %3 %4 %5").arg(rs[i * 2] ).arg(rs[(Tu + i) * 2]).arg(rs[i * 2 + 1]).arg(rs[(Tu + i) * 2 + 1]).arg(temp1[0])); temp1[0] += rs[i * 2] * rs[(Tu + i) * 2] + rs[i * 2 + 1] * rs[(Tu + i) * 2 + 1]; /* real part */ temp1[1] += -rs[i * 2] * rs[(Tu + i) * 2 + 1] + rs[i * 2 + 1] * rs[(Tu + i) * 2]; /* imag part */ temp2 += rs[i * 2] * rs[i * 2] + rs[i * 2 + 1] * rs[i * 2 + 1]; temp3 += rs[(i + Tu) * 2] * rs[(i + Tu) * 2] + rs[(i + Tu) * 2 + 1] * rs[(i + Tu) * 2 + 1]; } temp4 = (float) (EPSILON + 0.5 * (temp2 + temp3)); // logfile->addToAux(QString("tmp %1 %2 %3 %4 %5").arg(temp1[0]).arg(temp1[1]).arg(temp2).arg(temp3).arg(temp4)); /* time offset measurement : theta */ for (i = 0; i < 5; i++) { temp5[0] += rs[i * 2] * rs[(Tu + i) * 2] + rs[i * 2 + 1] * rs[(Tu + i) * 2 + 1]; /* 1-5 * Tu_1_5 */ temp5[1] += -rs[i * 2] * rs[(Tu + i) * 2 + 1] + rs[i * 2 +1] * rs[(Tu + i) * 2]; temp6 += rs[i * 2] * rs[i * 2] + rs[i * 2 + 1] * rs[i * 2 + 1]; /* 1-5 * 1-5' */ temp7 += rs[(i + Tu) * 2] * rs[(i + Tu) * 2] + rs[(i + Tu) * 2 + 1] * rs[(i + Tu) * 2 + 1]; /* Tu_1_5 * Tu_1_5' */ /* pa0mbo check for OK */ temp8[0] += rs[(i + Tg - 3) * 2] * rs[(i + Tu + Tg - 3) * 2] + rs[(i + Tg - 3) * 2 + 1] * rs[(i + Tu + Tg - 3) * 2 + 1]; /* Tg -2 +2 * Tg + Tu -2 +2 */ temp8[1] += -rs[(i + Tg - 3) * 2] * rs[(i + Tu + Tg - 3) * 2 + 1] + rs[(i + Tg - 3) * 2 + 1] + rs[(i + Tu + Tg - 3) * 2]; temp9 += rs[(i + Tg - 3) * 2] * rs[(i + Tg - 3) * 2] + rs[(i + Tg - 3) * 2 + 1] * rs[(i + Tg - 3) * 2 + 1]; /* Tg-2+2 * Tg-2+2 */ temp10 += rs[(i + Tg + Tu - 3) * 2] * rs[(i + Tg + Tu - 3) * 2] + rs[(i + Tg + Tu - 3) * 2 + 1] * rs[(i + Tg + Tu - 3) * 2 + 1]; /* TG+Tu-2+2 * Tg+Tu-2+2 */ } theta_plus = (float) sqrt((temp1[0] - temp5[0]) * (temp1[0] - temp5[0]) + (temp1[1] - temp5[1]) * (temp1[1] - temp5[1])); theta_plus -= (0.5 * (-temp6 - temp7)); theta_minus = (float) sqrt((temp1[0] - temp8[0]) * (temp1[0] - temp8[0]) + (temp1[1] - temp8[1]) * (temp1[1] - temp8[1])); theta_minus -= (0.5 * (temp9 - temp10)); delta_theta = (theta_plus - theta_minus) * Tgh / temp4; /* now limit the delta_theta value */ if (delta_theta < -max_theta) delta_theta = -max_theta; if (delta_theta > max_theta) delta_theta = max_theta; /* P-I controller for theta */ time_offset_ctrl = delta_theta - time_offset_fractional; delta_time_offset_I += kI_timing_controller * time_offset_ctrl; delta_time_offset_P = kP_large_timing_controller * time_offset_ctrl + threshold_timing_small_large * (kP_small_timing_controller -kP_large_timing_controller) * tanh(time_offset_ctrl / threshold_timing_small_large); delta_time_offset = delta_time_offset_P + delta_time_offset_I + time_offset_fractional; delta_time_offset_integer = (int) floor(delta_time_offset + 0.5); // logfile->addToAux(QString("dt %1 %2 %3 %4 %5").arg(time_offset_ctrl).arg(delta_time_offset_I).arg(delta_time_offset_P).arg(delta_time_offset).arg(delta_time_offset_integer)); /* now limit delta_time_offset_integer */ if (delta_time_offset_integer < -1) delta_time_offset_integer = -1; if (delta_time_offset_integer > 1) delta_time_offset_integer = 1; time_offset_fractional = delta_time_offset - delta_time_offset_integer; /* printf("delta_time_offset_integer as used in phi_freq_corr %d phifcl %g \n", delta_time_offset_integer, phi_freq_correction_last); */ phi_freq_correction_last += (delta_time_offset_integer / Tu) * freq_offset; } else { delta_time_offset_integer = 0; time_offset_fractional = 0.0; } /* printf("in getofdm delta_time_offset_integer is %d time_offs_fract %g\n", delta_time_offset_integer, time_offset_fractional); */ if (FREQ_SYNC_ENABLE == 1) { temp[0] = 0.0; temp[1] = 0.0; for (i = 0; i < Tg; i++) { temp[0] += rs[(i + 1 + delta_time_offset_integer) * 2] * rs[(i + 1 + delta_time_offset_integer + Tu) * 2] + rs[(i + 1 + delta_time_offset_integer) * 2 + 1] * rs[(i + 1 + delta_time_offset_integer + Tu) * 2 + 1]; temp[1] += rs[(i + 1 + delta_time_offset_integer) * 2 + 1] * rs[(i + 1 + delta_time_offset_integer + Tu) * 2] - rs[(i + 1 + delta_time_offset_integer) * 2] * rs[(i + 1 + delta_time_offset_integer + Tu) * 2 + 1]; } epsilon_ML = (float) (atan2(temp[1], temp[0])); /* filter epsilon_ML */ freq_offset_ctrl = fmodf(epsilon_ML - freq_offset + PI + 100.0 * PI, 2 * PI) - PI; dfreq_offset_I += kI_freq_controller * freq_offset_ctrl; dfreq_offset_P = kP_large_freq_controller * freq_offset_ctrl + threshold_freq_small_large * (kP_small_freq_controller - kP_large_freq_controller) * tanh(freq_offset_ctrl / threshold_freq_small_large); dfreq_offset = dfreq_offset_P + dfreq_offset_I; freq_offset += dfreq_offset; } else { /* freq_offset =0.0 */ } /* printf("in getofdm freq_offset = %g\n", freq_offset); */ /* get symbol and correct frequency */ for (i = 0; i < Tu; i++) { tmptheta = (freq_offset / Tu) * i + phi_freq_correction_last; exp_temp[i * 2] = (float) cos(tmptheta); exp_temp[i * 2 + 1] = (float) sin(tmptheta); } for (i = 0; i < Tu; i++) { (s[i]).re = rs[(1 + delta_time_offset_integer + Tgh + i) * 2] * exp_temp[i * 2] - rs[(1 + delta_time_offset_integer + Tgh + i) * 2 + 1] * exp_temp[i * 2 + 1]; (s[i]).im = rs[(1 + delta_time_offset_integer + Tgh + i) * 2] * exp_temp[i * 2 + 1] + rs[(1 + delta_time_offset_integer + Tgh + i) * 2 + 1] * exp_temp[i * 2]; } phi_freq_correction_last = (float) fmod(phi_freq_correction_last + (float) Ts / (float) Tu * freq_offset, (float)(2.0 * PI)); /* Now do fft and output symbol */ fftwf_execute(p); for (i = 0; i <= Tu / 2; i++) { term1 = (float) (i * 2.0 * PI * (Tgh + time_offset_fractional) / Tu); /* Euler */ exp_temp[i * 2] = (float) cos(term1); exp_temp[i * 2 + 1] = (float) sin(term1); } /* now calc out */ for (i = 0; i < Tu / 2; i++) { out1[i * 2] = (float) (((S[(Tu - 1 - i)]).re) * exp_temp[(i + 1) * 2] + ((S[(Tu - 1 - i)]).im) * exp_temp[(i + 1) * 2 + 1]); /* real = ac+bd */ out1[i * 2 + 1] = (float) (((S[(Tu - 1 - i)]).im) * exp_temp[(i + 1) * 2] - ((S[(Tu - 1 - i)]).re) * exp_temp[(i + 1) * 2 + 1]); /* imag bc -ad */ } /* Now flip out1 to out */ for (i = 0; i < Tu / 2; i++) { out[i * 2] = out1[(Tu / 2 - 1 - i) * 2]; out[i * 2 + 1] = out1[(Tu / 2 - i - 1) * 2 + 1]; out[(Tu / 2 + i) * 2] = (float) (((S[i]).re) * exp_temp[i * 2] - ((S[i]).im) * exp_temp[i * 2 + 1]); out[(Tu / 2 + i) * 2 + 1] = (float) (((S[i]).im) * exp_temp[i * 2] + ((S[i]).re) * exp_temp[i * 2 + 1]); } Zi[0] = 1.0; Zi[1] = phi_freq_correction_last; Zi[2] = delta_time_offset_I; Zi[3] = dfreq_offset_I; Zi[4] = freq_offset; Zi[5] = time_offset_fractional; return (delta_time_offset_integer); } } qsstv_9.2.6/qsstv/drmrx/getofdmsync.cpp0000664000175000017500000002777713203343610017013 0ustar jomajoma /* * File getofdmsync.c * * Author PA0MBO - M.BOS * DATE Feb 21st 2009 * * implements more or less the get_ofdm_symbol_sync * MATLAB routine from diorama-1.1.1 * * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include "drmproto.h" #include "appglobal.h" #include "utils/supportfunctions.h" extern int FREQ_SYNC_ENABLE; #define PI (atan(1.0)*4.0) void filter1(float *, float *, float *, int, int); static int Tg, Tgh; static int Tc; static int Tgs, Tgsh; static float kP_small_timing_controller = 0.0005; static float kP_large_timing_controller = 0.003; /* pa0mbo was 0.01 */ static float threshold_timing_small_large = 2.0; /* was 2.0 */ static float kI_timing_controller = 0.000020; /* was 0.00005 */ static drmComplex s[512], S[512]; static drmComplex s1[512], S1[512]; static fftwf_plan p1=NULL; static fftwf_plan p2=NULL; static float /*@only@ */ *exp_temp=NULL; static float /*@only@ */ *out1=NULL; int getofdmsync( /*@null@ */ float *rs, int Ts, int Tu, /*@null@ */ float *H, int lH, float delta_freq_offset, /*@null@ */ float *Zi, /*@null@ */ float *out, int init, int TIME_SYNC_ENABLE, int FREQ_SYNC_ENABLE) { int max_delta_theta; int max_delta_time_offset_integer = 3; int max_symbol_position_offset; float h_absq[512]; /* 2 x max el */ static float sinfilter[256]; /* too long */ float h_absq_filtered[512]; float dummy; float delta_theta, delta_theta_tmp; int dftmp, symbol_position_offset, spotmp; float freq_offset_ctrl; int i; float kP_freq_controller; // float *pinput; float time_offset_ctrl; float delta_time_offset_P, delta_time_offset; int delta_time_offset_integer; float tmptheta, term1; int indexin; float time_offset_fractional, freq_offset; float delta_time_offset_I, phi_freq_correction_last; /* pa0mbo if-part checken 16 april 2007 */ if (init == 1) { Tg = Ts - Tu; Tgh = (int) floor(Tg / 2 + 0.5); Tc = (int) pow(2, ceil(log((double) lH) / log(2.0))); Tgs = (int) floor((float) Tg / (float) Tu * (float) Tc); Tgsh = (int) floor((float) Tg / (float) Tu / 2.0 * (float) Tc); /* printf("Tg %d, Tgh %d, Tc %d,Tu %d, Tgs %d, Tgsh %d\n", Tg, Tgh, Tc, Tu, Tgs, Tgsh); */ /* malloc space for arrays */ if(exp_temp!=NULL) free(exp_temp); if(out1!=NULL) free(out1); if ((exp_temp = (float *)malloc((Tu * 2 + 2) * sizeof(float))) == NULL) { printf("cannot malloc space for exp_temp in get_ofdm_symbol\n"); exit(EXIT_FAILURE); } if ((out1 = (float *)malloc(Tu * 2 * sizeof(float))) == NULL) { printf("cannot malloc space for out1 in get_ofdm_symbol\n"); exit(EXIT_FAILURE); } addToLog("syn 1",LOGPERFORM); if (p1 != NULL) { fftwf_destroy_plan(p1); } if (p2 != NULL) { fftwf_destroy_plan(p2); } p1 = fftwf_plan_dft_1d(Tc,(fftwf_complex *)s,(fftwf_complex *)S,FFTW_FORWARD, FFTW_PATIENT); addToLog("syn 2",LOGPERFORM); p2 = fftwf_plan_dft_1d(Tu,(fftwf_complex *)s1,(fftwf_complex *)S1, FFTW_FORWARD, FFTW_PATIENT); addToLog("syn 3",LOGPERFORM); /* printf("xxxx sinfilter\n"); */ for (i = 0; i < Tgs; i++) { sinfilter[i] = (float) pow(sin((float) (i + 1.0) / (float) (Tgs + 1.0) * PI), 0.001); } return (0); } else { /* fixed parameters */ Tg = Ts - Tu; Tgh = (int) floor(Tg / 2 + 0.5); Tc = (int) pow(2, ceil(log((double) lH) / log(2.0))); Tgs = (int) floor((float) Tg / (float) Tu * (float) Tc); Tgsh = (int) floor((float) Tg / (float) Tu / 2.0 * (float) Tc); kP_small_timing_controller = 0.001; /* pa0mbo was 0.005 */ kP_large_timing_controller = 0.001; /* pa0mbo was 0.01 */ threshold_timing_small_large = (float) Tgh; kI_timing_controller = 2E-5; /* pa0mbo was 0.000005 */ max_delta_theta = Tgh; max_delta_time_offset_integer = 3; max_symbol_position_offset = Tgh - max_delta_time_offset_integer; kP_freq_controller = 0.01; /* pa0mbo was 0.01 */ phi_freq_correction_last = Zi[1]; delta_time_offset_I = Zi[2]; freq_offset = Zi[4]; time_offset_fractional = Zi[5]; /* debugging */ addToLog(QString("ofdmsync: dfo= %1 tof=%2 fofs= %3 dtoI = %4 phicl = %5") .arg(delta_freq_offset).arg(time_offset_fractional).arg(freq_offset) .arg(delta_time_offset_I).arg(phi_freq_correction_last),LOGDRMDEMOD); if (TIME_SYNC_ENABLE == 1) { /* estimate time offset */ /* first copy H data to s buffer that is destroyed by fft */ // pinput = H; for (i = 0; i < lH; i++) { s[i].re = H[i * 2]; s[i].im = H[i * 2 + 1]; } /* zero fill to power of 2 elements */ for (i = lH; i < Tc; i++) { s[i].re = 0.0; s[i].im = 0.0; } fftwf_execute(p1); /* do complex fft */ /* printf("xxx h_absq\n"); */ for (i = 0; i < Tc; i++) { h_absq[i] = (float) (S[i].re * S[i].re + S[i].im * S[i].im); h_absq[i + Tc] = (float) (S[i].re * S[i].re + S[i].im * S[i].im); /* needed 2 times */ /* printf(" %g\n", h_absq[i]); */ } drmfilter1(h_absq, h_absq_filtered, sinfilter, 2 * Tc, Tgs); /* debugging printf("xxx filter h_abs \n"); for (i=0; i < 2*Tc ; i++) printf("%g \n", h_absq_filtered[i]); printf("ooooo\n"); */ /* now determine max and position */ dummy = -1.0E30; delta_theta = 0.0; for (i = 0; i < 2 * Tc; i++) { if (h_absq_filtered[i] > dummy) { dummy = h_absq_filtered[i]; delta_theta = (float) i; } } /* debugging printf("ofdmsync: dummy= %g delta_theta=%g\n", dummy, delta_theta); */ delta_theta = (float) (((((Tc + Tgsh - (int) delta_theta + (int) (Tc * 1.5)) % Tc) - Tc / 2) * Tu) / (float) Tc); /* printf("delta_theta rescaled %g\n", delta_theta); */ if (delta_theta >= (float) max_delta_theta) delta_theta_tmp = (float) max_delta_theta; else delta_theta_tmp = delta_theta; if (delta_theta_tmp > (float) -max_delta_theta) delta_theta = delta_theta_tmp; else delta_theta = (float) -max_delta_theta; /* filter theta: P-I controller */ time_offset_ctrl = delta_theta - time_offset_fractional; delta_time_offset_I += kI_timing_controller * time_offset_ctrl; delta_time_offset_P = kP_large_timing_controller * time_offset_ctrl + threshold_timing_small_large * (kP_small_timing_controller - kP_large_timing_controller) * tanhf(time_offset_ctrl / threshold_timing_small_large); delta_time_offset = delta_time_offset_P + delta_time_offset_I + time_offset_fractional; delta_time_offset_integer = (int) floor(delta_time_offset + 0.5); if (delta_time_offset_integer > -max_delta_time_offset_integer) dftmp = delta_time_offset_integer; else dftmp = -max_delta_time_offset_integer; if (dftmp > max_delta_time_offset_integer) delta_time_offset_integer = max_delta_time_offset_integer; else delta_time_offset_integer = dftmp; /* only +/- one symbol */ time_offset_fractional = delta_time_offset - delta_time_offset_integer; /* debugging printf("delta_t_offs %g delta_t_int %d time_offs_fract %g \n", delta_time_offset, delta_time_offset_integer, time_offset_fractional); */ /* get best time window */ symbol_position_offset = (int) floor(delta_theta - delta_time_offset_integer + 0.5); if (symbol_position_offset > -max_symbol_position_offset) spotmp = symbol_position_offset; else spotmp = -max_symbol_position_offset; if (spotmp < max_symbol_position_offset) symbol_position_offset = spotmp; else symbol_position_offset = max_symbol_position_offset; /* do integer time offset correction and comp phase shift */ phi_freq_correction_last += ((float) delta_time_offset_integer / Tu) * freq_offset; } else { delta_time_offset_integer = 0; time_offset_fractional = 0; symbol_position_offset = 0; } if (FREQ_SYNC_ENABLE == 1) { /* frequency offset estimation */ freq_offset_ctrl = delta_freq_offset; freq_offset += kP_freq_controller * freq_offset_ctrl; } /* get symbol and correct frequency */ for (i = 0; i < Tu; i++) { indexin = i + symbol_position_offset; tmptheta = (freq_offset / Tu) * indexin + phi_freq_correction_last; exp_temp[i * 2] = (float) cos(tmptheta); exp_temp[i * 2 + 1] = (float) sin(tmptheta); } for (i = 0; i < Tu; i++) { indexin =i + 1 + delta_time_offset_integer + Tgh + symbol_position_offset; s1[i].re = rs[indexin * 2] * exp_temp[i * 2] - rs[indexin * 2 + 1] * exp_temp[i * 2 + 1]; s1[i].im = rs[indexin * 2] * exp_temp[i * 2 + 1] + rs[indexin * 2 + 1] * exp_temp[i * 2]; } phi_freq_correction_last = fmodf(phi_freq_correction_last + (float) Ts / (float) Tu * freq_offset, 2.0 * PI); /* Now do fft and output symbol */ fftwf_execute(p2); /* printf("xxx exp_temp in getofdmsync \n"); */ for (i = 0; i <= Tu / 2; i++) { term1 = (float) ((i * 2.0 * PI / (float) Tu) * (Tgh + time_offset_fractional - symbol_position_offset)); /* Euler */ exp_temp[i * 2] = (float) cos(term1); exp_temp[i * 2 + 1] = (float) sin(term1); /* printf(" %g %g \n", exp_temp[i*2], exp_temp[i*2+1]); */ } /* now calc out */ for (i = 0; i < Tu / 2; i++) { out1[i * 2] = (float) (((S1[(Tu - 1 - i)]).re) * exp_temp[(i + 1) * 2] + ((S1[(Tu - 1 - i)]).im) * exp_temp[(i + 1) * 2 + 1]); /* real = ac+bd */ out1[i * 2 + 1] = (float) (((S1[(Tu - 1 - i)]).im) * exp_temp[(i + 1) * 2] - ((S1[(Tu - 1 - i)]).re) * exp_temp[(i + 1) * 2 + 1]); /* imag bc -ad */ } for (i = 0; i < (Tu / 2 - 1); i++) { out1[(Tu / 2 + i) * 2] = (float) (((S1[i]).re) * exp_temp[i * 2] - ((S1[i]).im) * exp_temp[i * 2 + 1]); out1[(Tu / 2 + i) * 2 + 1] = (float) (((S1[i]).im) * exp_temp[i * 2] + ((S1[i]).re) * exp_temp[i * 2 + 1]); } /* Now flip out1 to out */ for (i = 0; i < Tu / 2; i++) { out[i * 2] = out1[(Tu / 2 - 1 - i) * 2]; out[i * 2 + 1] = out1[(Tu / 2 - 1 - i) * 2 + 1]; } /* now put in the rest */ for (i = Tu / 2; i < Tu; i++) { out[i * 2] = out1[i * 2]; out[i * 2 + 1] = out1[i * 2 + 1]; } Zi[1] = phi_freq_correction_last; Zi[2] = delta_time_offset_I; Zi[4] = freq_offset; Zi[5] = time_offset_fractional; return (delta_time_offset_integer); } } qsstv_9.2.6/qsstv/drmrx/getsymbolidx.cpp0000664000175000017500000000647413203343610017172 0ustar jomajoma /* * * file getsymbolidx.c * * corresponds with matlab file get_symbol_index.m * from diorama-1.1.1 * by Andreas Dittrich * * translated to C * by M.Bos - PA0MBO * * Date feb 21st 2009 * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include struct cmplxnmbr { float re; float im; }; #define PI (4.0*atan(1.00)) int getsymbolidx(float *symbol_buffer, int symbols_per_frame, int *time_ref_cells_k, int *time_ref_cells_theta_1024, int K_dc, int K_modulo, int n_time_ref_cells) { struct cmplxnmbr S[288][25]; /* max 24 symbols per frame */ int i, j, n, symbol0; float sum_real_xx[25]; // float sum_imag_xx[25]; float tmp1real, tmp1imag, tmp2real, tmp2imag; int k1_index, k2_index; float phi1, phi2; float max_sum_xx; /* reshape symbol buffer to matrix S */ for (i = 0; i < symbols_per_frame; i++) { for (j = 0; j < K_modulo; j++) { (S[j][i]).re = symbol_buffer[(j + i * K_modulo) * 2]; (S[j][i]).im = symbol_buffer[(j + i * K_modulo) * 2 + 1]; } } /* debugging printf("ooo symbols buffer in get symbolidx\n"); for (i=0; i < K_modulo; i++) printf("%g\n", sqrt( (S[i][0]).re* (S[i][0]).re+ (S[i][0]).im*(S[i][0]).im)); printf("oooo\n"); */ for (i = 0; i < symbols_per_frame; i++) { sum_real_xx[i] = 0.0; // sum_imag_xx[i] = 0.0; } for (n = 0; n < n_time_ref_cells - 1; n++) { if (time_ref_cells_k[n + 1] - time_ref_cells_k[n] == 1) { k1_index = K_dc + time_ref_cells_k[n]; k2_index = K_dc + time_ref_cells_k[n + 1]; phi1 = (2.0 * PI * time_ref_cells_theta_1024[n]) / 1024.0; phi2 = (2.0 * PI * time_ref_cells_theta_1024[n + 1]) / 1024.0; /* printf("timeref[n] is %d timeref[n+1] is %d n is %d\n", time_ref_cells_k[n], time_ref_cells_k[n+1], n); printf("in getsymbolidx K_dc is %d k1_index %d k2_index %d phi1 %g phi2 %g\n", K_dc, k1_index, k2_index, phi1, phi2); */ for (j = 0; j < symbols_per_frame; j++) { tmp1real = (S[k1_index][j]).re * cos(phi1) + (S[k1_index][j]).im * sin(phi1); tmp1imag = (S[k1_index][j]).im * cos(phi1) - (S[k1_index][j]).re * sin(phi1); tmp2real = (S[k2_index][j]).re * cos(phi2) + (S[k2_index][j]).im * sin(phi2); tmp2imag = (S[k2_index][j]).im * cos(phi2) - (S[k2_index][j]).re * sin(phi2); sum_real_xx[j] += tmp1real * tmp2real + tmp1imag * tmp2imag; /* sum_imag_xx[j] += tmp1imag*tmp2real - tmp1real*tmp2imag; */ } } } /* detmn of index of max in abs(sum..xx) */ max_sum_xx = -1.0E20; symbol0 = 0; for (j = 0; j < symbols_per_frame; j++) { tmp1real = fabs(sum_real_xx[j]); /* debugging printf("abs_sum_real_xx[%d] %g\n", j, tmp1real); */ if (tmp1real > max_sum_xx) { max_sum_xx = tmp1real; symbol0 = j; } } return (symbol0); } qsstv_9.2.6/qsstv/drmrx/lubksb.cpp0000664000175000017500000000064713203343610015736 0ustar jomajomavoid lubksb(float **a, int n, int *indx, float b[]) { int i,ii=0,ip,j; float sum; for (i=1;i<=n;i++) { ip=indx[i]; sum=b[ip]; b[ip]=b[i]; if (ii) for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j]; else if (sum) ii=i; b[i]=sum; } for (i=n;i>=1;i--) { sum=b[i]; for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j]; b[i]=sum/a[i][i]; } } /* (C) Copr. 1986-92 Numerical Recipes Software 0!-"1. */ qsstv_9.2.6/qsstv/drmrx/ludcmp.cpp0000664000175000017500000000221313203343610015727 0ustar jomajoma#include #define NRANSI #include "nrutil.h" #define TINY 1.0e-20; void ludcmp(float **a, int n, int *indx, float *d) { int i,imax=0,j,k; float big,dum,sum,temp; float *vv; vv=fvector(1,n); *d=1.0; for (i=1;i<=n;i++) { big=0.0; for (j=1;j<=n;j++) if ((temp=fabs(a[i][j])) > big) big=temp; if (big == 0.0) nrerror("Singular matrix in routine ludcmp"); vv[i]=1.0/big; } for (j=1;j<=n;j++) { for (i=1;i= big) { big=dum; imax=i; } } if (j != imax) { for (k=1;k<=n;k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1;i<=n;i++) a[i][j] *= dum; } } free_fvector(vv,1,n); } #undef TINY #undef NRANSI /* (C) Copr. 1986-92 Numerical Recipes Software 0!-"1. */ qsstv_9.2.6/qsstv/drmrx/mkfacmap.cpp0000664000175000017500000002426113203343610016231 0ustar jomajoma /* * File mkfacmap.c * * * produces FAC mapping data * * Author M.Bos * Date Feb 21st 2009 * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include int mkfacmap(int robustness_mode, int K_dc, int K_modulo, int /*@out@ */ *FACmap) { int elem_cnt, i; switch (robustness_mode) { case 0: elem_cnt = 45; i = 0; FACmap[i++] = K_dc + K_modulo + 10; FACmap[i++] = K_dc + K_modulo + 22; FACmap[i++] = K_dc + K_modulo + 30; FACmap[i++] = K_dc + K_modulo + 50; FACmap[i++] = K_dc + 2 * K_modulo + 14; FACmap[i++] = K_dc + 2 * K_modulo + 26; FACmap[i++] = K_dc + 2 * K_modulo + 34; FACmap[i++] = K_dc + 3 * K_modulo + 18; FACmap[i++] = K_dc + 3 * K_modulo + 30; FACmap[i++] = K_dc + 3 * K_modulo + 38; FACmap[i++] = K_dc + 4 * K_modulo + 22; FACmap[i++] = K_dc + 4 * K_modulo + 34; FACmap[i++] = K_dc + 4 * K_modulo + 42; FACmap[i++] = K_dc + 5 * K_modulo + 18; FACmap[i++] = K_dc + 5 * K_modulo + 26; FACmap[i++] = K_dc + 5 * K_modulo + 38; FACmap[i++] = K_dc + 5 * K_modulo + 46; FACmap[i++] = K_dc + 6 * K_modulo + 22; FACmap[i++] = K_dc + 6 * K_modulo + 30; FACmap[i++] = K_dc + 6 * K_modulo + 42; FACmap[i++] = K_dc + 6 * K_modulo + 50; FACmap[i++] = K_dc + 7 * K_modulo + 26; FACmap[i++] = K_dc + 7 * K_modulo + 34; FACmap[i++] = K_dc + 7 * K_modulo + 46; FACmap[i++] = K_dc + 8 * K_modulo + 10; FACmap[i++] = K_dc + 8 * K_modulo + 30; FACmap[i++] = K_dc + 8 * K_modulo + 38; FACmap[i++] = K_dc + 8 * K_modulo + 50; FACmap[i++] = K_dc + 9 * K_modulo + 14; FACmap[i++] = K_dc + 9 * K_modulo + 34; FACmap[i++] = K_dc + 9 * K_modulo + 42; FACmap[i++] = K_dc + 10 * K_modulo + 18; FACmap[i++] = K_dc + 10 * K_modulo + 38; FACmap[i++] = K_dc + 10 * K_modulo + 46; FACmap[i++] = K_dc + 11 * K_modulo + 10; FACmap[i++] = K_dc + 11 * K_modulo + 22; FACmap[i++] = K_dc + 11 * K_modulo + 42; FACmap[i++] = K_dc + 11 * K_modulo + 50; FACmap[i++] = K_dc + 12 * K_modulo + 14; FACmap[i++] = K_dc + 12 * K_modulo + 26; FACmap[i++] = K_dc + 12 * K_modulo + 46; FACmap[i++] = K_dc + 13 * K_modulo + 18; FACmap[i++] = K_dc + 13 * K_modulo + 30; FACmap[i++] = K_dc + 14 * K_modulo + 22; FACmap[i++] = K_dc + 14 * K_modulo + 34; break; case 1: elem_cnt = 45; i = 0; FACmap[i++] = K_dc + 21; FACmap[i++] = K_dc + K_modulo + 11; FACmap[i++] = K_dc + K_modulo + 23; FACmap[i++] = K_dc + K_modulo + 35; FACmap[i++] = K_dc + 2 * K_modulo + 13; FACmap[i++] = K_dc + 2 * K_modulo + 25; FACmap[i++] = K_dc + 2 * K_modulo + 37; FACmap[i++] = K_dc + 3 * K_modulo + 15; FACmap[i++] = K_dc + 3 * K_modulo + 27; FACmap[i++] = K_dc + 3 * K_modulo + 39; FACmap[i++] = K_dc + 4 * K_modulo + 5; FACmap[i++] = K_dc + 4 * K_modulo + 17; FACmap[i++] = K_dc + 4 * K_modulo + 29; FACmap[i++] = K_dc + 4 * K_modulo + 41; FACmap[i++] = K_dc + 5 * K_modulo + 7; FACmap[i++] = K_dc + 5 * K_modulo + 19; FACmap[i++] = K_dc + 5 * K_modulo + 31; FACmap[i++] = K_dc + 6 * K_modulo + 9; FACmap[i++] = K_dc + 6 * K_modulo + 21; FACmap[i++] = K_dc + 6 * K_modulo + 33; FACmap[i++] = K_dc + 7 * K_modulo + 11; FACmap[i++] = K_dc + 7 * K_modulo + 23; FACmap[i++] = K_dc + 7 * K_modulo + 35; FACmap[i++] = K_dc + 8 * K_modulo + 13; FACmap[i++] = K_dc + 8 * K_modulo + 25; FACmap[i++] = K_dc + 8 * K_modulo + 37; FACmap[i++] = K_dc + 9 * K_modulo + 15; FACmap[i++] = K_dc + 9 * K_modulo + 27; FACmap[i++] = K_dc + 9 * K_modulo + 39; FACmap[i++] = K_dc + 10 * K_modulo + 5; FACmap[i++] = K_dc + 10 * K_modulo + 17; FACmap[i++] = K_dc + 10 * K_modulo + 29; FACmap[i++] = K_dc + 10 * K_modulo + 41; FACmap[i++] = K_dc + 11 * K_modulo + 7; FACmap[i++] = K_dc + 11 * K_modulo + 19; FACmap[i++] = K_dc + 11 * K_modulo + 31; FACmap[i++] = K_dc + 12 * K_modulo + 9; FACmap[i++] = K_dc + 12 * K_modulo + 21; FACmap[i++] = K_dc + 12 * K_modulo + 33; FACmap[i++] = K_dc + 13 * K_modulo + 11; FACmap[i++] = K_dc + 13 * K_modulo + 23; FACmap[i++] = K_dc + 13 * K_modulo + 35; FACmap[i++] = K_dc + 14 * K_modulo + 13; FACmap[i++] = K_dc + 14 * K_modulo + 25; FACmap[i++] = K_dc + 14 * K_modulo + 37; break; case 2: elem_cnt = 45; i = 0; FACmap[i++] = K_dc + K_modulo + 7; FACmap[i++] = K_dc + K_modulo + 23; FACmap[i++] = K_dc + 2 * K_modulo + 8; FACmap[i++] = K_dc + 2 * K_modulo + 16; FACmap[i++] = K_dc + 2 * K_modulo + 24; FACmap[i++] = K_dc + 3 * K_modulo + 9; FACmap[i++] = K_dc + 3 * K_modulo + 17; FACmap[i++] = K_dc + 4 * K_modulo + 10; FACmap[i++] = K_dc + 4 * K_modulo + 18; FACmap[i++] = K_dc + 5 * K_modulo + 11; FACmap[i++] = K_dc + 5 * K_modulo + 19; FACmap[i++] = K_dc + 6 * K_modulo + 4; FACmap[i++] = K_dc + 6 * K_modulo + 12; FACmap[i++] = K_dc + 7 * K_modulo + 13; FACmap[i++] = K_dc + 7 * K_modulo + 21; FACmap[i++] = K_dc + 8 * K_modulo + 6; FACmap[i++] = K_dc + 8 * K_modulo + 14; FACmap[i++] = K_dc + 8 * K_modulo + 22; FACmap[i++] = K_dc + 9 * K_modulo + 7; FACmap[i++] = K_dc + 9 * K_modulo + 23; FACmap[i++] = K_dc + 10 * K_modulo + 8; FACmap[i++] = K_dc + 10 * K_modulo + 16; FACmap[i++] = K_dc + 10 * K_modulo + 24; FACmap[i++] = K_dc + 11 * K_modulo + 9; FACmap[i++] = K_dc + 11 * K_modulo + 13; FACmap[i++] = K_dc + 11 * K_modulo + 17; FACmap[i++] = K_dc + 12 * K_modulo + 10; FACmap[i++] = K_dc + 12 * K_modulo + 18; FACmap[i++] = K_dc + 13 * K_modulo + 11; FACmap[i++] = K_dc + 13 * K_modulo + 19; FACmap[i++] = K_dc + 14 * K_modulo + 4; FACmap[i++] = K_dc + 14 * K_modulo + 12; FACmap[i++] = K_dc + 14 * K_modulo + 16; FACmap[i++] = K_dc + 15 * K_modulo + 13; FACmap[i++] = K_dc + 15 * K_modulo + 21; FACmap[i++] = K_dc + 16 * K_modulo + 6; FACmap[i++] = K_dc + 16 * K_modulo + 14; FACmap[i++] = K_dc + 16 * K_modulo + 22; FACmap[i++] = K_dc + 17 * K_modulo + 7; FACmap[i++] = K_dc + 17 * K_modulo + 23; FACmap[i++] = K_dc + 18 * K_modulo + 8; FACmap[i++] = K_dc + 18 * K_modulo + 16; FACmap[i++] = K_dc + 18 * K_modulo + 24; FACmap[i++] = K_dc + 19 * K_modulo + 9; FACmap[i++] = K_dc + 19 * K_modulo + 17; break; case 3: /* does not exist in amateur mode */ elem_cnt = 45; i = 0; FACmap[i++] = K_dc + 3 * K_modulo + 9; FACmap[i++] = K_dc + 3 * K_modulo + 18; FACmap[i++] = K_dc + 3 * K_modulo + 27; FACmap[i++] = K_dc + 4 * K_modulo + 10; FACmap[i++] = K_dc + 4 * K_modulo + 19; FACmap[i++] = K_dc + 5 * K_modulo + 11; FACmap[i++] = K_dc + 5 * K_modulo + 20; FACmap[i++] = K_dc + 5 * K_modulo + 29; FACmap[i++] = K_dc + 6 * K_modulo + 12; FACmap[i++] = K_dc + 6 * K_modulo + 30; FACmap[i++] = K_dc + 7 * K_modulo + 13; FACmap[i++] = K_dc + 7 * K_modulo + 22; FACmap[i++] = K_dc + 7 * K_modulo + 31; FACmap[i++] = K_dc + 8 * K_modulo + 5; FACmap[i++] = K_dc + 8 * K_modulo + 14; FACmap[i++] = K_dc + 8 * K_modulo + 23; FACmap[i++] = K_dc + 8 * K_modulo + 32; FACmap[i++] = K_dc + 9 * K_modulo + 6; FACmap[i++] = K_dc + 9 * K_modulo + 15; FACmap[i++] = K_dc + 9 * K_modulo + 24; FACmap[i++] = K_dc + 9 * K_modulo + 33; FACmap[i++] = K_dc + 10 * K_modulo + 16; FACmap[i++] = K_dc + 10 * K_modulo + 25; FACmap[i++] = K_dc + 10 * K_modulo + 34; FACmap[i++] = K_dc + 11 * K_modulo + 8; FACmap[i++] = K_dc + 11 * K_modulo + 17; FACmap[i++] = K_dc + 11 * K_modulo + 26; FACmap[i++] = K_dc + 11 * K_modulo + 35; FACmap[i++] = K_dc + 12 * K_modulo + 9; FACmap[i++] = K_dc + 12 * K_modulo + 18; FACmap[i++] = K_dc + 12 * K_modulo + 27; FACmap[i++] = K_dc + 12 * K_modulo + 36; FACmap[i++] = K_dc + 13 * K_modulo + 10; FACmap[i++] = K_dc + 13 * K_modulo + 19; FACmap[i++] = K_dc + 13 * K_modulo + 37; FACmap[i++] = K_dc + 14 * K_modulo + 11; FACmap[i++] = K_dc + 14 * K_modulo + 20; FACmap[i++] = K_dc + 14 * K_modulo + 29; FACmap[i++] = K_dc + 15 * K_modulo + 12; FACmap[i++] = K_dc + 15 * K_modulo + 30; FACmap[i++] = K_dc + 16 * K_modulo + 13; FACmap[i++] = K_dc + 16 * K_modulo + 22; FACmap[i++] = K_dc + 16 * K_modulo + 31; FACmap[i++] = K_dc + 17 * K_modulo + 5; FACmap[i++] = K_dc + 17 * K_modulo + 14; FACmap[i++] = K_dc + 17 * K_modulo + 23; FACmap[i++] = K_dc + 17 * K_modulo + 32; FACmap[i++] = K_dc + 18 * K_modulo + 6; FACmap[i++] = K_dc + 18 * K_modulo + 15; FACmap[i++] = K_dc + 18 * K_modulo + 24; FACmap[i++] = K_dc + 18 * K_modulo + 33; FACmap[i++] = K_dc + 19 * K_modulo + 16; FACmap[i++] = K_dc + 19 * K_modulo + 25; FACmap[i++] = K_dc + 19 * K_modulo + 34; FACmap[i++] = K_dc + 20 * K_modulo + 8; FACmap[i++] = K_dc + 20 * K_modulo + 17; FACmap[i++] = K_dc + 20 * K_modulo + 26; FACmap[i++] = K_dc + 20 * K_modulo + 35; FACmap[i++] = K_dc + 21 * K_modulo + 9; FACmap[i++] = K_dc + 21 * K_modulo + 18; FACmap[i++] = K_dc + 21 * K_modulo + 27; FACmap[i++] = K_dc + 21 * K_modulo + 36; FACmap[i++] = K_dc + 22 * K_modulo + 10; FACmap[i++] = K_dc + 22 * K_modulo + 19; FACmap[i++] = K_dc + 22 * K_modulo + 37; break; default: printf("wrong robustness mode in cal to mkfacmap\n"); exit(EXIT_FAILURE); } return elem_cnt; } qsstv_9.2.6/qsstv/drmrx/mkmap.h0000664000175000017500000000006313203343610015216 0ustar jomajoma#ifndef MKMAP_H #define MKMAP_H #endif // MKMAP_H qsstv_9.2.6/qsstv/drmrx/mkmscmap.cpp0000664000175000017500000002474013203343610016264 0ustar jomajoma /* * file mkmscmap.c * * makes MSC_Demapper * * cf create_MSC_demapper.m matlab code by * Torsten Schorr 2004 * * recoded in C by PA0MBO - M.Bos * * date Feb 21st 2009 * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include #include "drmdefs.h" #include "structtemplates.h" #include "drmproto.h" extern int symbols_per_frame_list[4]; extern int time_ref_cells_k_list[4][21]; extern int y_list[4]; extern int K_min_K_max_list[2][24]; extern int freq_ref_cells_k_list[4][3]; extern int x_list[4]; extern int k0_list[4]; extern int mode_and_occupancy_code_table[24]; extern int time_ref_cells_cnt_list[4]; extern int lFAC; extern int MSC_Demapper[6][2959]; int mkmscmap(int robustness_mode, int spectrum_occupancy, int interleaver_depth, int K_dc, int K_modulo) { int frames_per_superframe = 3; int K_min; int K_max; int mode_and_occupancy_code; int x, y, k0; int s; // int Tu; int gain_ref_cells_k[712]; int unused_carriers_k[3]; int i, m, j; int first_symbol; int control_cells_k[65]; int pilot_cells_k[600]; int cnt_msc_cells = 0; int rndcnt, cnt_time_ref_cells; int n, k, p, p_min, p_max; int contains; int term; int N_SFA, N_L, N_MUX, D; int cnt_msc_cells_3_superframes; static int *PICMSC_inv = NULL; int step, ncGIMSC; // int nrGIMSC; int columnv[5]; int rowv[1000]; int vproduct[5][1000]; int GIMSC_inv[5000]; int cnt_GIMSC; int Cell_Deinterleaver[5000]; int FAC_cells_k[65]; /* reeds global */ // int Tu_list[] = { Tu_A, Tu_B, Tu_C, Tu_D }; int symbols_per_frame; int freq_ref_cells_k[3]; int time_ref_cells_k[21]; // int carrier_per_symbol; int MSC_cells_k[8877]; int MSC_cells_3_superframes[3 * 8877]; // Tu = Tu_list[robustness_mode]; K_min = K_min_K_max_list[0][spectrum_occupancy + robustness_mode * 6]; K_max = K_min_K_max_list[1][spectrum_occupancy + robustness_mode * 6]; mode_and_occupancy_code = mode_and_occupancy_code_table[robustness_mode * 6 + spectrum_occupancy]; if (mode_and_occupancy_code < 0) { printf("BAD MODE AND OCCUPANCY CODE \n"); } symbols_per_frame = symbols_per_frame_list[robustness_mode]; // carrier_per_symbol = K_max - K_min + 1; x = x_list[robustness_mode]; y = y_list[robustness_mode]; k0 = k0_list[robustness_mode]; rndcnt = 0; for (s = 0; s < symbols_per_frame; s++) { n = s % y; m = s / y; p_min = (int) ceil((double) ((K_min - k0 - x * n) / (x * y))); p_max = (K_max - k0 - x * n) / (x * y); for (p = p_min; p <= p_max; p++) { k = k0 + x * n + x * y * p; gain_ref_cells_k[rndcnt++] = k + s * K_modulo; /* printf("gain_ref_cells_k[%d] = %d\n", rndcnt-1, gain_ref_cells_k[rndcnt-1]); */ } } unused_carriers_k[0] = 0; if (robustness_mode == 0) { unused_carriers_k[1] = 1; } for (i = 0; i < 3; i++) { freq_ref_cells_k[i] = freq_ref_cells_k_list[robustness_mode][i]; } cnt_time_ref_cells = time_ref_cells_cnt_list[robustness_mode]; for (i = 0; i < cnt_time_ref_cells; i++) { time_ref_cells_k[i] = time_ref_cells_k_list[robustness_mode][i]; } lFAC = mkfacmap(robustness_mode, 0, K_modulo, FAC_cells_k); /* MSC cells per superframe */ first_symbol = 0; cnt_msc_cells = 0; for (m = 0; m < frames_per_superframe; m++) { for (i = 0; i < lFAC; i++) { control_cells_k[i] = FAC_cells_k[i] + K_modulo * symbols_per_frame * m; /* printf("control_cells_k[%d] = %d FAC_cells_k %d K_modulo %d symbols_per_frame %d m %d \n", i, control_cells_k[i], FAC_cells_k[i], K_modulo, symbols_per_frame, m); */ } for (j = 3; j < cnt_time_ref_cells + 3; j++) { pilot_cells_k[j] = K_modulo * symbols_per_frame * m + time_ref_cells_k[j - 3]; } for (j = 3 + cnt_time_ref_cells; j < 3 + cnt_time_ref_cells + rndcnt; j++) { pilot_cells_k[j] = K_modulo * symbols_per_frame * m + gain_ref_cells_k[j - 3 - cnt_time_ref_cells]; } for (s = first_symbol; s < symbols_per_frame; s++) { for (j = 0; j < 3; j++) { pilot_cells_k[j] = K_modulo * symbols_per_frame * m + K_modulo * s + freq_ref_cells_k[j]; } for (k = K_min; k <= K_max; k++) { contains = 0; term = k + K_modulo * symbols_per_frame * m + K_modulo * s; for (j = 0; j < 3 + cnt_time_ref_cells + rndcnt; j++) { if (term == pilot_cells_k[j]) { contains = 1; goto uit; } } for (j = 0; j < lFAC; j++) { if (term == control_cells_k[j]) { contains = 1; goto uit; } } if (robustness_mode == 0) { for (j = 0; j < 1; j++) { if (term == K_modulo * symbols_per_frame * m + K_modulo * s + unused_carriers_k[j]) { contains = 1; goto uit; } } } else { if (term == K_modulo * symbols_per_frame * m + K_modulo * s) /* pa0mbo 29-11-2007 was + unused_carriers_k[0] */ { contains = 1; goto uit; } } uit:if (contains == 0) { MSC_cells_k[cnt_msc_cells++] = term; /* debugging printf("%d cell=%d \n", cnt_msc_cells, MSC_cells_k[cnt_msc_cells -1]); */ } } /* end k-loop */ } /* end s-loop */ first_symbol = 0; } /* end m -loop */ N_SFA = cnt_msc_cells; N_L = N_SFA % frames_per_superframe; N_MUX = (N_SFA - N_L) / frames_per_superframe; /* cell interleaver for MSC_cells */ cnt_msc_cells_3_superframes = 0; for (i = 0; i < N_SFA - N_L; i++) { MSC_cells_3_superframes[cnt_msc_cells_3_superframes++] = K_dc + MSC_cells_k[i]; } for (i = 0; i < N_SFA - N_L; i++) { MSC_cells_3_superframes[cnt_msc_cells_3_superframes++] = K_dc + symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_k[i]; } for (i = 0; i < N_SFA - N_L; i++) { MSC_cells_3_superframes[cnt_msc_cells_3_superframes++] = K_dc + 2 * symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_k[i]; } /* for (i=0; i < cnt_msc_cells_3_superframes; i++) printf("MSC_cells3..[%d] = %d\n", i, MSC_cells_3_superframes[i]); printf("====\n"); */ if (PICMSC_inv != NULL) free(PICMSC_inv); PICMSC_inv = deinterleaver(0, 1, N_MUX, 5); if (interleaver_depth == 0) { /* convolutional deinterleaver ETSI ES 201980 / 7.6 */ D = 5; /* calc of GIMSC_inv in steps */ /* first step [1:N_MUX+1:D*(N_MUX+1)] */ step = N_MUX + 1; // nrGIMSC = D; ncGIMSC = (int) ceil((float) N_MUX / D); /* printf("ncGIMSC = %d\n", ncGIMSC); */ columnv[0] = 1; rowv[0] = 0; for (i = 1; i < D; i++) columnv[i] = columnv[i - 1] + step; for (i = 1; i < ncGIMSC; i++) rowv[i] = rowv[i - 1] + D; for (i = 0; i < D; i++) { for (j = 0; j < ncGIMSC; j++) { vproduct[i][j] = columnv[i] + rowv[j]; } } cnt_GIMSC = 0; for (j = 0; j < ncGIMSC; j++) { for (i = 0; i < D; i++) { GIMSC_inv[cnt_GIMSC++] = vproduct[i][j]; /* printf("GIMSC_inv[%d] = %d \n", cnt_GIMSC-1, vproduct[i][j]); */ } } cnt_GIMSC--; /* printf("xxx Cell_Deinterleaver\n"); */ for (i = 0; i < N_MUX; i++) { Cell_Deinterleaver[i] = GIMSC_inv[PICMSC_inv[i]]; /* printf("%d \n", Cell_Deinterleaver[i]); */ } /* printf("xxx\n"); */ for (i = 0; i < N_MUX; i++) { MSC_Demapper[5][i] = MSC_cells_3_superframes[Cell_Deinterleaver[i] - 1]; MSC_Demapper[0][i] = ((MSC_cells_3_superframes[N_MUX + Cell_Deinterleaver[i] - 1] + 1) % (2 * symbols_per_frame * frames_per_superframe * K_modulo)) - 1; MSC_Demapper[1][i] = ((MSC_cells_3_superframes[2 * N_MUX + Cell_Deinterleaver[i] - 1] + 1) % (2 * symbols_per_frame * frames_per_superframe * K_modulo)) - 1; MSC_Demapper[2][i] = ((symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[Cell_Deinterleaver[i] - 1] + 1) % (2 * symbols_per_frame * frames_per_superframe * K_modulo)) - 1; MSC_Demapper[3][i] = ((symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[N_MUX + Cell_Deinterleaver[i] - 1] + 1) % (2 * symbols_per_frame * frames_per_superframe * K_modulo)) - 1; MSC_Demapper[4][i] = ((symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[2 * N_MUX + Cell_Deinterleaver[i] - 1] + 1) % (2 * symbols_per_frame * frames_per_superframe * K_modulo)) - 1; } } else { /* printf("xxx Cell_Deinterleaver\n"); */ for (i = 0; i < N_MUX; i++) { Cell_Deinterleaver[i] = PICMSC_inv[i]; /* printf("%d \n", Cell_Deinterleaver[i]); */ } /* printf("xxx\n"); */ /* printf("xxxx MSC_Demap[1]\n"); */ for (i = 0; i < N_MUX; i++) { MSC_Demapper[1][i] = MSC_cells_3_superframes[Cell_Deinterleaver[i]]; /* pa0mbo -1 binnen [] weggehaald */ /* printf("%d \n", MSC_Demapper[1][i]); */ MSC_Demapper[2][i] = (MSC_cells_3_superframes[N_MUX + Cell_Deinterleaver[i]]) % (2 * symbols_per_frame * frames_per_superframe * K_modulo); MSC_Demapper[3][i] = (MSC_cells_3_superframes[2 * N_MUX + Cell_Deinterleaver[i]]) % (2 * symbols_per_frame * frames_per_superframe * K_modulo); MSC_Demapper[4][i] = (symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[Cell_Deinterleaver[i]]) % (2 * symbols_per_frame * frames_per_superframe * K_modulo); MSC_Demapper[5][i] = (symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[N_MUX + Cell_Deinterleaver[i]]) % (2 * symbols_per_frame * frames_per_superframe * K_modulo); MSC_Demapper[0][i] = (symbols_per_frame * frames_per_superframe * K_modulo + MSC_cells_3_superframes[2 * N_MUX + Cell_Deinterleaver[i]]) % (2 * symbols_per_frame * frames_per_superframe * K_modulo); } } return N_MUX; } qsstv_9.2.6/qsstv/drmrx/msd_hard.h0000664000175000017500000000347513203343610015704 0ustar jomajoma signed char puncturing[13][17] = { {0, 15, 0}, {-4, 15, 2, 7, 2, 7, -4}, {0, 7, 0}, {-6, 7, 2, 7, 2, 7, 2, 3, -6}, {0, 3, 0}, {-6, 3, 2, 5, 2, 3, 2, 1, -6}, {-4, 3, 2, 1, 2, 3, -4}, {-2, 3, 2, 1, -2}, {-14, 3, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 3, 2, 1, -14}, {-4, 3, 2, 1, 2, 1, -4}, {-6, 3, 2, 1, 2, 1, 2, 1, -6}, {-12, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, -12}, {-14, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, -14} }; /* int RX[13] = {1, 3, 1, 4, 1, 4, 3, 2, 8, 3, 4, 7, 8}; */ int RY[13] = { 4, 10, 3, 11, 2, 7, 5, 3, 11, 4, 5, 8, 9 }; signed char tailpuncturing[12][13] = { {-10, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, -10}, {-10, 7, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, -10}, {-10, 7, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, -10}, {-10, 7, 2, 7, 2, 3, 2, 7, 2, 3, 2, 3, -10}, {-10, 7, 2, 7, 2, 3, 2, 7, 2, 7, 2, 3, -10}, {-10, 7, 2, 7, 2, 7, 2, 7, 2, 7, 2, 3, -10}, {-10, 7, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, -10}, {-10, 15, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, -10}, {-10, 15, 2, 7, 2, 7, 2, 15, 2, 7, 2, 7, -10}, {-10, 15, 2, 15, 2, 7, 2, 15, 2, 7, 2, 7, -10}, {-10, 15, 2, 15, 2, 7, 2, 15, 2, 7, 2, 15, -10}, {-10, 15, 2, 15, 2, 15, 2, 15, 2, 7, 2, 15, -10} }; #define SQRT2 1.41421356237310F #define SQRT10 3.16227766016838F #define SQRT42 6.48074069840786F float partitioning[4][8] = { {7 / SQRT42, 5 / SQRT42, 3 / SQRT42, 1 / SQRT42, -1 / SQRT42, -3 / SQRT42, -5 / SQRT42, -7 / SQRT42}, /* 64-QAM Ungerb�k Set Partitioning */ {7 / SQRT42, -1 / SQRT42, 5 / SQRT42, -3 / SQRT42, 3 / SQRT42, -5 / SQRT42, 1 / SQRT42, -7 / SQRT42}, /* 64-QAM Block Partitioning */ {3 / SQRT10, 1 / SQRT10, -1 / SQRT10, -3 / SQRT10}, /* 16-QAM Ungerb�k Set Partitioning */ {1 / SQRT2, -1 / SQRT2} }; /* 4-QAM Ungerb�k Set Partitioning */ #undef SQRT2 #undef SQRT10 #undef SQRT42 qsstv_9.2.6/qsstv/drmrx/msd_hard_sdc.h0000664000175000017500000000626413203343610016534 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Torsten Schorr */ /* */ /* Author(s) : Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 15.06.2004 */ /* Last change : 30.06.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* msd_hard.h (part of msd_hard) */ /* */ /******************************************************************************/ /* Description: */ /* constants and tables for msd_hard.c */ /* */ /******************************************************************************/ extern signed char puncturing[13][17]; /* int RX[13] = {1, 3, 1, 4, 1, 4, 3, 2, 8, 3, 4, 7, 8}; */ extern int RY[13]; extern signed char tailpuncturing[12][13]; #define SQRT2 1.41421356237310F #define SQRT10 3.16227766016838F #define SQRT42 6.48074069840786F extern float partitioning[4][8]; #undef SQRT2 #undef SQRT10 #undef SQRT42 qsstv_9.2.6/qsstv/drmrx/msdhardfac.cpp0000664000175000017500000005330213203343610016544 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Torsten Schorr */ /* */ /* Author(s) : Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 15.06.2004 */ /* Last change : 22.07.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* msdhardfac.c */ /* */ /******************************************************************************/ /* Description: */ /* Multi-Stage-Decoder for DRM QAM signals (iterations with hard decisions) */ /* Usage: */ /* */ /* [LPhardout, HPhardout, VSPPhardout] = */ /* msd_hard (received, H, N1, L, Lvspp, */ /* Deinterleaver,PL, maxiter, SDCorMSC); */ /* */ /* received: samples of an FAC, SDC or MSC frame */ /* H: estimated channel transfer function */ /* N1: number of OFDM cells in the higher protected part (part A) */ /* L: number of information bits for Part A/B for each level in (2xl)-matrix */ /* Lvspp: number of information bits in the very strongly protected part */ /* Deinterleaver: deinterleavers for each levels in (Nxl)-int32-matrix */ /* PL: Protection Levels for Part A/B for each level in (2xl)-matrix */ /* maxiter: maximum number of decoding iterations */ /* SDCorMSC: 1 for SDC and MSC frames, 0 for FAC frames */ /* */ /******************************************************************************/ /* * changed filename to msdhardfac.c * and added new interface to accomodate * own C-language interface instead of * Matlab interface * * Author of changes M.Bos - PA0MBO * Date July 10th 2007 * changed memory alignment of lastiter and malloc to prevent IRIX problem */ #include #include #include #include #include #include "viterbi_decode.h" #include "msd_hard.h" #define ITER_BREAK #define CONSIDERING_SNR #ifdef CONSIDERING_SNR #define ARG_INDEX_OFFSET 1 #define NARGS_RHS_STR "9" #define NARGS_RHS 9 #else /* */ #define ARG_INDEX_OFFSET 0 #define NARGS_RHS_STR "8" #define NARGS_RHS 8 #endif /* */ #define PROGNAME "msd_hard" #define PRBS_INIT(reg) reg = 511; #define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1) #define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1) int msdhardfac(double /*@out@ */ *received_real, double /*@out@ */ *received_imag, int Lrxdata, /*@out@ */ double *snr, int N1, double *L, int dimL, int Lvspp, int *Deinterleaver, int *PL, int maxiter, int SDCorMSC, double *facdata) { double *received, *first_received, *L1, *L2, L1_real[10], *L2_real, *L1_imag, *L2_imag; double *PL1, *PL2, PL1_real[10], *PL2_real, *PL1_imag, *PL2_imag, *output_ptr, L_dummy[3] = { 0, 0, 0 }; float *metric_real, *metric_imag, *metric, *first_metric, closest_one, closest_zero, sample, *llr, dist; char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *hardpoints_ptr, *lastiter, *infoout[3]; int m, n, N, no_of_levels, iteration, diff; int sample_index, rp_real[3], rp_imag[3], *rp, level, subset_point, no_of_bits, error, msd_mem_size, viterbi_mem_size; int PRBS_reg; int HMmix = 0, HMsym = 0; int i; #ifdef CONSIDERING_SNR double *signal_to_noise_ratio; float SNR; #endif /* */ /* new interface to C-language */ signal_to_noise_ratio = snr; no_of_levels = 1; for (i = 0; i < dimL; i++) { L1_real[i] = L[i]; /* debugging printf("L[%d] = %g , L1_real[%d] = %g\n", i, L[i], i, L1_real[i]); */ } L2_real = L1_real + no_of_levels; L1_imag = L_dummy; L2_imag = L_dummy; for (i = 0; i < 2; i++) { PL1_real[i] = (double) PL[i]; } PL2_real = PL1_real + no_of_levels; PL1_imag = PL2_real + no_of_levels; PL2_imag = PL1_imag + no_of_levels; /* pa0mbo will not be OK has to be checked !! will do for the moment */ /* debugging printf("PL1_real[0]= %g, PL1_real[1]= %g, PL2_real[0]= %g, PL2_real[1]= %g, PL1_imag[0]= %g, PL2_imag[0]= %g\n", PL1_real[0], PL1_real[1], PL2_real[0], PL2_real[1], PL1_imag[0], PL2_imag[0]); */ SDCorMSC = ((0 - SDCorMSC) != 0); /* debugging printf("SDCorMSC = %d\n", SDCorMSC); */ if (Lrxdata < 20) { printf("msdhardfac: length rxdata should be >= 20\n"); exit(1); } N = Lrxdata; if (N < 20) { printf("msdhardfac: N has to be >= 20!\n"); exit(1); } if ((N1 < 0) || (N1 > N - 20)) { printf("msdhardfac: N1 has to be >= 0!\n"); exit(1); } if (Lvspp < 0) { printf("msdhardfac: Lvspp has to be >= 0!\n"); exit(1); } if (maxiter < 0) { printf("msdhardfac: maxiter must not be negativ."); exit(1); } if (HMmix && (Lvspp == 0)) { printf("msdhardfac: HMmix requires Lvspp > 0."); exit(1); } /* printf("start mem alloc \n "); printf("N= %d, no_of_levels= %d\n", N, no_of_levels); */ /* memory allocation and initialization: */ no_of_bits = 0; for (level = 0; level < no_of_levels; level++) { no_of_bits += (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level] + (int) L2_imag[level] + 6; /* printf(" --- level %d L1real %d L2real %d L1imga %d L2imag %d\n", level, (int)L1_real[level], (int)L2_real[level], (int)L1_imag[level], (int)L2_imag[level]); */ } msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char); viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char); /* printf("msdhardfac: viterbi_mem_size is %d STATES is %d\n", viterbi_mem_size, STATES); */ if (received_imag == NULL) { memory_ptr = (char *) malloc(viterbi_mem_size + msd_mem_size + N * sizeof(double) + 2); received_imag = (double *) (memory_ptr + viterbi_mem_size + msd_mem_size); memset(received_imag, 0, N * sizeof(double)); } else { memory_ptr = (char *) malloc(viterbi_mem_size + msd_mem_size + 2); /* printf("msdhardfac: debugging memory_ptr alloc succeeded viterbi_size = %d mds_size=%d end addr is %x\n", viterbi_mem_size, msd_mem_size, memory_ptr+ viterbi_mem_size+msd_mem_size); */ if (memory_ptr == NULL) { printf("msdhardfac: cannot malloc for memory_ptr\n"); exit(1); } } if (!memory_ptr) { printf("Failed memory request!\n"); exit(1); } viterbi_mem = memory_ptr; msd_mem = memory_ptr + viterbi_mem_size; llr = (float *) msd_mem; hardpoints = (char *) (msd_mem + 2 * N * sizeof(float)); lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2); infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 + 2 * N * sizeof(char)); infoout[1] = 0; for (m = 1; m < no_of_levels; m++) { infoout[m] = infoout[m - 1] + (int) L1_real[m - 1] + (int) L2_real[m - 1] + 6 + (int) L1_imag[m - 1] + (int) L2_imag[m - 1] + 6; /* debugging pa0mbo printf("infoout[%d] = %p \n", m, infoout[m]); */ } memset(hardpoints, 0, 2 * N * sizeof(char)); /* choosing partitioning type: */ if (no_of_levels == 3) { if ((Lvspp != 0) && HMmix) { /* HMmix 64-QAM */ metric_real = partitioning[1]; metric_imag = partitioning[0]; rp_real[0] = (N - 12) - RY[(int) PL2_real[0]] * ((N - 12) / RY[(int) PL2_real[0]]); rp_real[1] = ((N - N1) - 12) - RY[(int) PL2_real[1]] * (((N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = ((N - N1) - 12) - RY[(int) PL2_real[2]] * (((N - N1) - 12) / RY[(int) PL2_real[2]]); rp_imag[0] = ((N - N1) - 12) - RY[(int) PL2_imag[0]] * (((N - N1) - 12) / RY[(int) PL2_imag[0]]); rp_imag[1] = ((N - N1) - 12) - RY[(int) PL2_imag[1]] * (((N - N1) - 12) / RY[(int) PL2_imag[1]]); rp_imag[2] = ((N - N1) - 12) - RY[(int) PL2_imag[2]] * (((N - N1) - 12) / RY[(int) PL2_imag[2]]); } else if (Lvspp != 0) { /* HMsym 64-QAM */ HMsym = 1; metric_real = partitioning[1]; metric_imag = partitioning[1]; rp_real[0] = (2 * N - 12) - RY[(int) PL2_real[0]] * ((2 * N - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = (2 * (N - N1) - 12) - RY[(int) PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[2]]); } else { /* SM 64-QAM */ metric_real = partitioning[0]; metric_imag = partitioning[0]; rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = (2 * (N - N1) - 12) - RY[(int) PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[2]]); }} else if (no_of_levels == 2) { /* SM 16-QAM */ rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); metric_real = partitioning[2]; metric_imag = partitioning[2]; } else { /* SM 4-QAM */ rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); metric_real = partitioning[3]; metric_imag = partitioning[3]; } if (!SDCorMSC) { rp_real[0] = -12; rp_real[1] = -12; rp_real[2] = -12; } if (Lvspp != 0) { L1_real[0] = 0; L2_real[0] = (double) Lvspp; } /* debugging pa0mbo printf("=== voor viterbi \n"); for (i=0; i < 2*N ; i++) { printf("hadpoints[%d] = %d \n",i, hardpoints[i]); } */ /* Multi-Stage Decoding: */ /* first decoding: */ PL1 = PL1_real; PL2 = PL2_real; L1 = L1_real; L2 = L2_real; rp = rp_real; first_metric = metric_real; first_received = received_real; hardpoints_ptr = hardpoints; /* debugging printf("msdhardfac: at start first decoding\n"); printf("PL1[0] = %g, PL2[0]= %g, L1_real[0]= %g, L2_real[0]=%g, L1[0]=%g, L2[0]= %g, rp[0]= %d\n", PL1[0], PL2[0], L1_real[0], L2_real[0], L1[0], L2[0], rp[0]); */ for (n = 0; n <= HMmix; n++) { for (level = 0; level < no_of_levels; level++) { metric = first_metric; received = first_received; for (m = 0; m < 2 - HMmix; m++) { /* for real and imaginary part */ for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix) { sample = (float) received[sample_index >> (1 - HMmix)]; /* extract real or imaginary part respectively */ closest_zero = fabs(sample - metric[(int) hardpoints_ptr[sample_index]]); /* printf("msdhardfac: index= %d sample = %g metric = %g closest_zero = %g \n", sample_index, sample, metric[hardpoints_ptr[sample_index]], closest_zero); pa0mbo */ for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1))) { dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]); if (dist < closest_zero) { closest_zero = dist; } } closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] + (0x1 << level)]); /* printf("closest_one %g\n", closest_one); pa0mbo */ for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1))) { dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]); if (dist < closest_one) { closest_one = dist; } } /* printf("final closest_zero=%g closest_one=%g\n", closest_zero, closest_one); pa0mbo */ #ifdef CONSIDERING_SNR SNR = (float) signal_to_noise_ratio[sample_index >> (1 - HMmix)]; llr[sample_index] = (closest_zero - closest_one) * SNR; /* printf("llr[%d] = %g\n", sample_index, llr[sample_index]); */ /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */ #else /* */ llr[sample_index] = (closest_zero - closest_one); /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */ #endif /* */ } /* end loop sample_index */ metric = metric_imag; received = received_imag; } /* end loop m */ /* printf(" level %d HMsym %d HMmix %d N1 %d n %d\n", level, HMsym, HMmix, N1, n); printf("msdhardfac: (level || (!HMsym ..) = %d\n", (level || (!HMsym && (n || !HMmix)))* (2 - HMmix)*N1 ); printf("eerste viter PL1[0] %g PL2[0] %g L1[0] %g L2[0] %g L1_real[0] %g L2_real[0] %g rp[0] %d\n", PL1[0], PL2[0], L1[0], L2[0], L1_real[0], L2_real[0], rp[0]); for (i=0; i < 17 ; i++) printf("puncturing[6][%d] = %d\n", i, puncturing[6][i]); */ error = viterbi_decode(llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int) PL1[level]], puncturing[(int) PL2[level]], tailpuncturing[rp[level] + 12], infoout[level] + n * ((int) L1_real[level] + (int) L2_real[level] + 6), hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level, (int) L1[level] + (int) L2[level] + 6, rp[level] + 12, viterbi_mem); /* debugging pa0mbo printf("=== na eerste viterbi \n"); for (i=0; i < 2*N ; i++) { printf("infoout[0][%d] = %d \n",i, infoout[0][i]); } */ if (error) { free(memory_ptr); printf("msdhardfac: Error in Viterbi decoder"); return 1; } } /* end loop level */ PL1 = PL1_imag; PL2 = PL2_imag; L1 = L1_imag; L2 = L2_imag; rp = rp_imag; first_metric = metric_imag; first_received = received_imag; hardpoints_ptr = hardpoints + N; } /* end loop over n */ diff = 1; iteration = 0; /* iterations: */ while (iteration < maxiter) { PL1 = PL1_real; PL2 = PL2_real; L1 = L1_real; L2 = L2_real; rp = rp_real; first_metric = metric_real; first_received = received_real; hardpoints_ptr = hardpoints; #ifdef ITER_BREAK memcpy(lastiter, hardpoints, 2 * N); #endif /* */ for (n = 0; n <= HMmix; n++) { for (level = 0; level < no_of_levels; level++) { metric = first_metric; received = first_received; for (m = 0; m < 2 - HMmix; m++) { /* for real and imaginary part */ for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix) { sample = (float) received[sample_index >> (1 - HMmix)]; /* extract real or imaginary part respectively */ closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index] & ~(0x1 << level)]); closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] | (0x1 << level)]); #ifdef CONSIDERING_SNR SNR = (float) signal_to_noise_ratio[sample_index >> (1 - HMmix)]; llr[sample_index] = (closest_zero - closest_one) * SNR; /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */ #else /* */ llr[sample_index] = (closest_zero - closest_one); /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */ #endif /* */ } /* end loop over sample_index */ metric = metric_imag; received = received_imag; } /* end loop over m */ /* printf("Tweede viterbi PL1[0] %g PL2[0] %g L1[0] %g L2[0] %g L1_real[0] %g L2_real[0] %g rp[0] %d\n", PL1[0], PL2[0], L1[0], L2[0], L1_real[0], L2_real[0], rp[0]); */ error = viterbi_decode(llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int) PL1[level]], puncturing[(int) PL2[level]], tailpuncturing[rp[level]], infoout[level] + n * ((int) L1_real[level] + (int) L2_real[level] + 6), hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level, (int) L1[level] + (int) L2[level] + 6, rp[level] + 12, viterbi_mem); if (error) { free(memory_ptr); printf("msdhardfac: Error in Viterbi decoder"); return 1; } #ifdef ITER_BREAK if (level == 0) { diff = 0; for (sample_index = 0;sample_index <((int)(((2 - HMmix) * N * sizeof(char)) / sizeof(int))); sample_index++) { diff += (((int *) hardpoints)[sample_index] ^ ((int *) lastiter)[sample_index]) != 0; } /*diff = memcmp (lastiter,hardpoints,2 * N); */ if (!diff) { break; } } #endif /* */ } /* for (level = 0; level < no_of_levels; level++) */ PL1 = PL1_imag; PL2 = PL2_imag; L1 = L1_imag; L2 = L2_imag; rp = rp_imag; first_metric = metric_imag; first_received = received_imag; hardpoints_ptr = hardpoints + N; } /* for (n = 0; n <= HMmix; n++) */ #ifdef ITER_BREAK if (!diff) { break; } #endif /* */ iteration++; } /* while (iteration < maxiter) */ /* Energy Dispersal */ no_of_bits = 0; for (level = (Lvspp != 0); level < no_of_levels; level++) { no_of_bits += (int) L1_real[level] + (int) L2_real[level]; } for (level = 0; level < no_of_levels; level++) { no_of_bits += (int) L1_imag[level] + (int) L2_imag[level]; } output_ptr = facdata; PRBS_INIT(PRBS_reg); n = 0; if (HMmix) { for (m = Lvspp + 6; m < Lvspp + 6 + (int) L1_imag[0]; m++) { output_ptr[n++] = (double) (infoout[0][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} for (level = (Lvspp != 0); level < no_of_levels; level++) { for (m = 0; m < (int) L1_real[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); } for (m = (int) L1_real[level] + (int) L2_real[level] + 6; m < (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} if (HMmix) { for (m = Lvspp + 6 + (int) L1_imag[0]; m < Lvspp + 6 + (int) L1_imag[0] + (int) L2_imag[0]; m++) { output_ptr[n++] = (double) (infoout[0][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} for (level = (Lvspp != 0); level < no_of_levels; level++) { for (m = (int) L1_real[level]; m < (int) L1_real[level] + (int) L2_real[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); } for (m = (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level]; m < (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level] + (int) L2_imag[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} PRBS_INIT(PRBS_reg); if (Lvspp != 0) { printf ("msdhardfac: There is a very strongly protected part, but no variable to put it into!"); } free(memory_ptr); return 0; } qsstv_9.2.6/qsstv/drmrx/msdhardmsc.cpp0000664000175000017500000004777413203343610016615 0ustar jomajoma /* * changed filename to msdhardmsc.c * and added new interface to accomodate * own C-language interface instead of * Matlab interface * * almost fully copied from msd_hard.c * by Torsten Schorr Kaiserslautern 2004 * * Author of changes M.Bos - PA0MBO * Date Feb 21st 2009 */ #include #include #include #include #include /* #include "viterbi_decode.h" */ #include "msd_hard_sdc.h" #define ITER_BREAK #define CONSIDERING_SNR #ifdef CONSIDERING_SNR #define ARG_INDEX_OFFSET 1 #define NARGS_RHS_STR "9" #define NARGS_RHS 9 #else /* */ #define ARG_INDEX_OFFSET 0 #define NARGS_RHS_STR "8" #define NARGS_RHS 8 #endif /* */ #define STATES 64 #define PROGNAME "msd_hard" #define PRBS_INIT(reg) reg = 511; #define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1) #define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1) int viterbi_decode(float *, int, int, signed char *, signed char *, signed char *, char *, char *, int, int *, int, int, char *); int msdhardmsc(double *received_real, double *received_imag, int Lrxdata, double *snr, int N1, double *L, int rowdimL, int coldimL, int Lvspp, int *Deinterleaver, int *PL, int maxiter, int SDCorMSC, /*@out@ */ double *SPPhard, /*@out@ */ double *VSPPhard, double *iterations, double *calc_variance, double *noise_signal) { double *received, *first_received, *L1, *L2, L1_real[10], *L2_real, *L1_imag, *L2_imag; double *PL1, *PL2, PL1_real[10], *PL2_real, *PL1_imag, *PL2_imag, *output_ptr, L_dummy[3] = { 0, 0, 0 }; float *metric_real, *metric_imag, *metric, *first_metric, closest_one, closest_zero, sample, *llr, dist; double variance; char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *hardpoints_ptr, *lastiter, *infoout[3]; int m, n, N, no_of_levels, iteration, diff; int sample_index, rp_real[3], rp_imag[3], *rp, level, subset_point, no_of_bits, error, msd_mem_size, viterbi_mem_size; int PRBS_reg; int HMmix = 0, HMsym = 0; int i; #ifdef CONSIDERING_SNR double *signal_to_noise_ratio; float SNR; #endif /* */ /* new interface to C-language */ signal_to_noise_ratio = snr; no_of_levels = rowdimL; for (i = 0; i < rowdimL * coldimL; i++) { L1_real[i] = L[i]; /* debugging printf("L[%d] = %g , L1_real[%d] = %g\n", i, L[i], i, L1_real[i]); */ } L2_real = L1_real + no_of_levels; L1_imag = L_dummy; L2_imag = L_dummy; for (i = 0; i < coldimL * rowdimL; i++) /* pa0mbo 4 niet gebruiken later */ { PL1_real[i] = (double) PL[i]; /* printf("PL1_real[%d] = %g \n", i , PL1_real[i]); */ } PL2_real = PL1_real + no_of_levels; PL1_imag = PL2_real + no_of_levels; PL2_imag = PL1_imag + no_of_levels; /* pa0mbo will not be OK has to be checked !! will do for the moment */ /* debugging printf("PL1_real[0]= %g, PL1_real[1]= %g, PL2_real[0]= %g, PL2_real[1]= %g, PL1_imag[0]= %g, PL2_imag[0]= %g\n", PL1_real[0], PL1_real[1], PL2_real[0], PL2_real[1], PL1_imag[0], PL2_imag[0]); */ SDCorMSC = ((0 - SDCorMSC) != 0); /* debugging printf("SDCorMSC = %d\n", SDCorMSC); */ if (Lrxdata < 20) { printf("msdhardmsc: length rxdata should be >= 20\n"); exit(1); } N = Lrxdata; if (N < 20) { printf("msdhardmsc: N has to be >= 20!\n"); exit(1); } if ((N1 < 0) || (N1 > N - 20)) { printf("msdhardmsc: N1 has to be >= 0!\n"); exit(1); } if (Lvspp < 0) { printf("msdhardmsc: Lvspp has to be >= 0!\n"); exit(1); } if (maxiter < 0) { printf("msdhardmsc: maxiter must not be negativ."); exit(1); } if (HMmix && (Lvspp == 0)) { printf("msdhardmsc: HMmix requires Lvspp > 0."); exit(1); } /* printf("start mem alloc \n "); printf("N= %d, no_of_levels= %d\n", N, no_of_levels); */ /* memory allocation and initialization: */ no_of_bits = 0; for (level = 0; level < no_of_levels; level++) { no_of_bits += (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level] + (int) L2_imag[level] + 6; /* printf(" --- level %d L1real %d L2real %d L1imga %d L2imag %d\n", level, (int)L1_real[level], (int)L2_real[level], (int)L1_imag[level], (int)L2_imag[level]); */ } msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char); viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char); /* printf("msdhardmsc: viterbi_mem_size is %d STATES is %d\n", viterbi_mem_size, STATES); */ if (received_imag == NULL) { memory_ptr = (char *) malloc(viterbi_mem_size + msd_mem_size + N * sizeof(double) + 2); received_imag = (double *) (memory_ptr + viterbi_mem_size + msd_mem_size); memset(received_imag, 0, N * sizeof(double)); } else { memory_ptr = (char *) malloc(viterbi_mem_size + msd_mem_size + 2); /* printf("msdhardmsc: debugging memory_ptr alloc succeeded viterbi_size = %d mds_size=%d end addr is %x\n", viterbi_mem_size, msd_mem_size, memory_ptr+ viterbi_mem_size+msd_mem_size); */ if (memory_ptr == NULL) { printf("msdhardmsc: cannot malloc for memory_ptr\n"); exit(1); } } if (!memory_ptr) { printf("Failed memory request!\n"); exit(1); } viterbi_mem = memory_ptr; msd_mem = memory_ptr + viterbi_mem_size; llr = (float *) msd_mem; hardpoints = (char *) (msd_mem + 2 * N * sizeof(float)); lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2); infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 + 2 * N * sizeof(char)); infoout[1] = 0; for (m = 1; m < no_of_levels; m++) { infoout[m] = infoout[m - 1] + (int) L1_real[m - 1] + (int) L2_real[m - 1] + 6 + (int) L1_imag[m - 1] + (int) L2_imag[m - 1] + 6; /* debugging pa0mbo printf("infoout[%d] = %p \n", m, infoout[m]); */ } memset(hardpoints, 0, 2 * N * sizeof(char)); /* choosing partitioning type: */ if (no_of_levels == 3) { if ((Lvspp != 0) && HMmix) { /* HMmix 64-QAM */ metric_real = partitioning[1]; metric_imag = partitioning[0]; rp_real[0] = (N - 12) - RY[(int) PL2_real[0]] * ((N - 12) / RY[(int) PL2_real[0]]); rp_real[1] = ((N - N1) - 12) - RY[(int) PL2_real[1]] * (((N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = ((N - N1) - 12) - RY[(int) PL2_real[2]] * (((N - N1) - 12) / RY[(int) PL2_real[2]]); rp_imag[0] = ((N - N1) - 12) - RY[(int) PL2_imag[0]] * (((N - N1) - 12) / RY[(int) PL2_imag[0]]); rp_imag[1] = ((N - N1) - 12) - RY[(int) PL2_imag[1]] * (((N - N1) - 12) / RY[(int) PL2_imag[1]]); rp_imag[2] = ((N - N1) - 12) - RY[(int) PL2_imag[2]] * (((N - N1) - 12) / RY[(int) PL2_imag[2]]); } else if (Lvspp != 0) { /* HMsym 64-QAM */ HMsym = 1; metric_real = partitioning[1]; metric_imag = partitioning[1]; rp_real[0] = (2 * N - 12) - RY[(int) PL2_real[0]] * ((2 * N - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = (2 * (N - N1) - 12) - RY[(int) PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[2]]); } else { /* SM 64-QAM */ metric_real = partitioning[0]; metric_imag = partitioning[0]; rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); rp_real[2] = (2 * (N - N1) - 12) - RY[(int) PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[2]]); }} else if (no_of_levels == 2) { /* SM 16-QAM */ rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); rp_real[1] = (2 * (N - N1) - 12) - RY[(int) PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[1]]); metric_real = partitioning[2]; metric_imag = partitioning[2]; /* printf("SM 16 QAM\n"); */ } else { /* SM 4-QAM */ rp_real[0] = (2 * (N - N1) - 12) - RY[(int) PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int) PL2_real[0]]); metric_real = partitioning[3]; metric_imag = partitioning[3]; } if (!SDCorMSC) { rp_real[0] = -12; rp_real[1] = -12; rp_real[2] = -12; } if (Lvspp != 0) { L1_real[0] = 0; L2_real[0] = (double) Lvspp; } /* debugging pa0mbo printf("=== voor viterbi \n"); for (i=0; i < 2*N ; i++) { printf("hardpoints[%d] = %d \n",i, hardpoints[i]); } */ /* Multi-Stage Decoding: */ /* first decoding: */ PL1 = PL1_real; PL2 = PL2_real; L1 = L1_real; L2 = L2_real; rp = rp_real; first_metric = metric_real; first_received = received_real; hardpoints_ptr = hardpoints; /* debugging printf("msdhardmsc: at start first decoding\n"); printf("PL1[0] = %g, PL2[0]= %g, L1_real[0]= %g, L2_real[0]=%g, L1[0]=%g, L2[0]= %g, rp[0]= %d\n", PL1[0], PL2[0], L1_real[0], L2_real[0], L1[0], L2[0], rp[0]); */ for (n = 0; n <= HMmix; n++) { for (level = 0; level < no_of_levels; level++) { metric = first_metric; received = first_received; for (m = 0; m < 2 - HMmix; m++) { /* for real and imaginary part */ for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix) { sample = (float) received[sample_index >> (1 - HMmix)]; /* extract real or imaginary part respectively */ closest_zero = fabs(sample - metric[(int) hardpoints_ptr[sample_index]]); /* printf("msdhardmsc: index= %d sample = %g metric = %g closest_zero = %g \n", sample_index, sample, metric[hardpoints_ptr[sample_index]], closest_zero); pa0mbo */ for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1))) { dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]); if (dist < closest_zero) { closest_zero = dist; } } closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] + (0x1 << level)]); /* printf("closest_one %g\n", closest_one); pa0mbo */ for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1))) { dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]); if (dist < closest_one) { closest_one = dist; } } /* printf("final closest_zero=%g closest_one=%g\n", closest_zero, closest_one); pa0mbo */ #ifdef CONSIDERING_SNR SNR = (float) signal_to_noise_ratio[sample_index >> (1 - HMmix)]; llr[sample_index] = (closest_zero - closest_one) * SNR; /* printf("llr[%d] = %g\n", sample_index, llr[sample_index]); */ /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */ #else /* */ llr[sample_index] = (closest_zero - closest_one); /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */ #endif /* */ } /* end loop sample_index */ metric = metric_imag; received = received_imag; } /* end loop m */ /* printf(" level %d HMsym %d HMmix %d N1 %d n %d\n", level, HMsym, HMmix, N1, n); printf("msdhardmsc: (level || (!HMsym ..) = %d\n", (level || (!HMsym && (n || !HMmix)))* (2 - HMmix)*N1 ); printf("eerste viter PL1[0] %g PL2[0] %g L1[0] %g L2[0] %g L1_real[0] %g L2_real[0] %g rp[0] %d\n", PL1[0], PL2[0], L1[0], L2[0], L1_real[0], L2_real[0], rp[0]); */ /* for (i=0; i < 17 ; i++) printf("puncturing[6][%d] = %d\n", i, puncturing[6][i]); printf("level %d rp[level] %d \n", level, rp[level]); printf("tailpuncturing[... ] = %p\n", tailpuncturing[rp[level]]); for (i=0; i < 13 ; i++) printf("inhoud is %d ", tailpuncturing[rp[level]][i]); */ error = viterbi_decode(llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int) PL1[level]], puncturing[(int) PL2[level]], tailpuncturing[rp[level]], infoout[level] + n * ((int) L1_real[level] + (int) L2_real[level] + 6), hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level, (int) L1[level] + (int) L2[level] + 6, rp[level] + 12, viterbi_mem); /* debugging pa0mbo printf("=== na eerste viterbi \n"); for (i=0; i < 2*N ; i++) { printf("infoout[0][%d] = %d \n",i, infoout[0][i]); } */ if (error) { free(memory_ptr); printf("msdhardmsc: Error in Viterbi decoder"); return 1; } } /* end loop level */ PL1 = PL1_imag; PL2 = PL2_imag; L1 = L1_imag; L2 = L2_imag; rp = rp_imag; first_metric = metric_imag; first_received = received_imag; hardpoints_ptr = hardpoints + N; } /* end loop over n */ diff = 1; iteration = 0; /* iterations: */ while (iteration < maxiter) { PL1 = PL1_real; PL2 = PL2_real; L1 = L1_real; L2 = L2_real; rp = rp_real; first_metric = metric_real; first_received = received_real; hardpoints_ptr = hardpoints; #ifdef ITER_BREAK memcpy(lastiter, hardpoints, 2 * N); #endif /* */ for (n = 0; n <= HMmix; n++) { for (level = 0; level < no_of_levels; level++) { metric = first_metric; received = first_received; for (m = 0; m < 2 - HMmix; m++) { /* for real and imaginary part */ for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix) { sample = (float) received[sample_index >> (1 - HMmix)]; /* extract real or imaginary part respectively */ closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index] & ~(0x1 << level)]); closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] | (0x1 << level)]); #ifdef CONSIDERING_SNR SNR = (float) signal_to_noise_ratio[sample_index >> (1 - HMmix)]; llr[sample_index] = (closest_zero - closest_one) * SNR; /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */ #else /* */ llr[sample_index] = (closest_zero - closest_one); /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */ #endif /* */ } /* end loop over sample_index */ metric = metric_imag; received = received_imag; } /* end loop over m */ /* printf("Tweede viterbi PL1[0] %g PL2[0] %g L1[0] %g L2[0] %g L1_real[0] %g L2_real[0] %g rp[0] %d\n", PL1[0], PL2[0], L1[0], L2[0], L1_real[0], L2_real[0], rp[0]); */ error = viterbi_decode(llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int) PL1[level]], puncturing[(int) PL2[level]], tailpuncturing[rp[level]], infoout[level] + n * ((int) L1_real[level] + (int) L2_real[level] + 6), hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level, (int) L1[level] + (int) L2[level] + 6, rp[level] + 12, viterbi_mem); if (error) { free(memory_ptr); printf("msdhardmsc: Error in Viterbi decoder"); return 1; } #ifdef ITER_BREAK if (level == 0) { diff = 0; for (sample_index = 0;sample_index <(int)((2 - HMmix) * N * sizeof(char) / sizeof(int));sample_index++) { diff += (((int *) hardpoints)[sample_index] ^ ((int *) lastiter)[sample_index]) != 0; } /*diff = memcmp (lastiter,hardpoints,2 * N); */ if (!diff) { break; } } #endif /* */ } /* for (level = 0; level < no_of_levels; level++) */ PL1 = PL1_imag; PL2 = PL2_imag; L1 = L1_imag; L2 = L2_imag; rp = rp_imag; first_metric = metric_imag; first_received = received_imag; hardpoints_ptr = hardpoints + N; } /* for (n = 0; n <= HMmix; n++) */ #ifdef ITER_BREAK if (!diff) { break; } #endif /* */ iteration++; } /* while (iteration < maxiter) */ /* Energy Dispersal */ no_of_bits = 0; for (level = (Lvspp != 0); level < no_of_levels; level++) { no_of_bits += (int) L1_real[level] + (int) L2_real[level]; } for (level = 0; level < no_of_levels; level++) { no_of_bits += (int) L1_imag[level] + (int) L2_imag[level]; } output_ptr = SPPhard; PRBS_INIT(PRBS_reg); n = 0; if (HMmix) { for (m = Lvspp + 6; m < Lvspp + 6 + (int) L1_imag[0]; m++) { output_ptr[n++] = (double) (infoout[0][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} /* printf("msdhardmsc: 1e n %d\n", n); */ for (level = (Lvspp != 0); level < no_of_levels; level++) { for (m = 0; m < (int) L1_real[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); } /* printf("msdhardmsc: 2a n %d\n", n); */ for (m = (int) L1_real[level] + (int) L2_real[level] + 6; m < (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} /* printf("msdhardmsc: 2b n %d\n", n); */ if (HMmix) { for (m = Lvspp + 6 + (int) L1_imag[0]; m < Lvspp + 6 + (int) L1_imag[0] + (int) L2_imag[0]; m++) { output_ptr[n++] = (double) (infoout[0][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} /* printf("msdhardmsc: 3e n %d\n", n); */ for (level = (Lvspp != 0); level < no_of_levels; level++) { for (m = (int) L1_real[level]; m < (int) L1_real[level] + (int) L2_real[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); } for (m = (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level]; m < (int) L1_real[level] + (int) L2_real[level] + 6 + (int) L1_imag[level] + (int) L2_imag[level]; m++) { output_ptr[n++] = (double) (infoout[level][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); }} /* printf("msdhardmsc: 4e n %d\n", n); */ PRBS_INIT(PRBS_reg); if (Lvspp != 0) { printf ("msdhardmsc: There is a very strongly protected part, but no variable to put it into!"); } no_of_bits = Lvspp; output_ptr = VSPPhard; for (m = 0; m < Lvspp; m++) { output_ptr[m] = (double) (infoout[0][m] ^ PRBS_BIT(PRBS_reg)); PRBS_SHIFT(PRBS_reg); } output_ptr = iterations; output_ptr[0] = (double) iteration; output_ptr = calc_variance; variance = 0.0; for (sample_index = 0; sample_index < N; sample_index++) { sample = (float) received_real[sample_index]; /* extract real part respectively */ dist = (sample - metric_real[(int) hardpoints[(2 - HMmix) * sample_index]]); variance += (double) dist *(double) dist; sample = (float) received_imag[sample_index]; /* extract imaginary part respectively */ dist = (sample - metric_imag[(int) hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]); variance += (double) dist *(double) dist; } output_ptr[0] = variance / ((double) N); output_ptr = noise_signal; for (sample_index = 0; sample_index < N; sample_index++) { sample = (float) received_real[sample_index]; /* extract real part */ output_ptr[sample_index * 2] = (sample - metric_real[(int) hardpoints[(2 - HMmix) * sample_index]]); sample = (float) received_imag[sample_index]; /* extract imaginary part */ output_ptr[2 * sample_index + 1] = (sample - metric_imag[(int) hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]); } free(memory_ptr); return n; } qsstv_9.2.6/qsstv/drmrx/newfft.cpp0000664000175000017500000001272713203343610015747 0ustar jomajoma#include #include /****************************************************************************** * * MiXViews - an X window system based sound & data editor/processor * * Copyright (c) 1993, 1994 Regents of the University of California * * Author: Douglas Scott * Date: December 13, 1994 * * Permission to use, copy and modify this software and its documentation * for research and/or educational purposes and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. The author reserves the right to distribute this * software and its documentation. The University of California and the author * make no representations about the suitability of this software for any * purpose, and in no event shall University of California be liable for any * damage, loss of data, or profits resulting from its use. * It is provided "as is" without express or implied warranty. * ******************************************************************************/ void rfft(float *, int, int); void cfft(float *, int, int); static double twopi = M_PI * 2.0; static double pi = M_PI; /* If forward is true, rfft replaces 2*N real data points in buf with N complex values representing the positive frequency half of their Fourier spectrum, with *(buf+1) replaced with the real part of the Nyquist frequency value. If forward is false, rfft expects buf to contain a positive frequency spectrum arranged as before, and replaces it with 2*N real values. N MUST be a power of 2. */ void rfft(float *buf, int N2, int forward) { float c2, h1r, h1i, h2r, h2i, temp; float br, bi; float theta = (float) (pi / N2); float wr = 1.; float wi = 0.; float c1 = 0.5; float wpr; float wpi; int N2p1; int i, i1, i2, i3, i4; /* debugging pa0mbo printf("N2 is %d\n",N2); */ if (forward == 1) { c2 = -0.5; cfft(buf, N2, forward); /* debugging pa0mbo printf("na cfft\n"); */ br = *buf; bi = *(buf + 1); /* debuging pa0mbo printf(" na br ni = \n"); */ } else { c2 = 0.5; theta = -theta; br = *(buf + 1); bi = 0.; *(buf + 1) = 0.; } wpr = (float) (-2. * pow(sin(0.5 * theta), 2.)); wpi = (float) sin(theta); N2p1 = (N2 << 1) + 1; /* debugging pa0mbo printf(" N2p1 is %d\n",N2p1); */ for (i = 0; i <= N2 >> 1; i++) { i1 = i << 1; i2 = i1 + 1; i3 = N2p1 - i2; i4 = i3 + 1; if (i == 0) { h1r = c1 * (*(buf + i1) + br); h1i = c1 * (*(buf + i2) - bi); h2r = -c2 * (*(buf + i2) + bi); h2i = c2 * (*(buf + i1) - br); *(buf + i1) = h1r + (wr * h2r) - (wi * h2i); *(buf + i2) = h1i + (wr * h2i) + (wi * h2r); br = h1r - (wr * h2r) + (wi * h2i); bi = -h1i + (wr * h2i) + (wi * h2r); } else { h1r = c1 * (*(buf + i1) + *(buf + i3)); h1i = c1 * (*(buf + i2) - *(buf + i4)); h2r = -c2 * (*(buf + i2) + *(buf + i4)); h2i = c2 * (*(buf + i1) - *(buf + i3)); *(buf + i1) = h1r + wr * h2r - wi * h2i; *(buf + i2) = h1i + wr * h2i + wi * h2r; *(buf + i3) = h1r - wr * h2r + wi * h2i; *(buf + i4) = -h1i + wr * h2i + wi * h2r; } wr = ((temp = wr) * wpr) - (wi * wpi) + wr; wi = (wi * wpr) + (temp * wpi) + wi; } if (forward == 1) *(buf + 1) = br; else cfft(buf, N2, forward); } /* cfft replaces float array x containing NC complex values (2*NC float values alternating real, imagininary, etc.) by its Fourier transform if forward is true, or by its inverse Fourier transform if forward is false, using a recursive Fast Fourier transform method due to Danielson and Lanczos. NC MUST be a power of 2. */ void bitreverse(float *, int); void cfft(float *buf, int N2, int forward) { int delta; int ND = N2 << 1; int mmax; float theta, wpr, wpi, wr, wi; float rtemp, itemp; int i, j, m; float scale; register float *bi, *be; bitreverse(buf, ND); for (mmax = 2; mmax < ND; mmax = delta) { delta = mmax << 1; theta = (float) (twopi / ((forward == 1) ? mmax : -mmax)); wpr = (float) (-2. * pow(sin(0.5 * theta), 2.)); wpi = (float) sin(theta); wr = 1.; wi = 0.; for (m = 0; m < mmax; m += 2) { for (i = m; i < ND; i += delta) { j = i + mmax; rtemp = (wr * *(buf + j)) - (wi * *(buf + j + 1)); itemp = (wr * *(buf + j + 1)) + (wi * *(buf + j)); *(buf + j) = *(buf + i) - rtemp; *(buf + j + 1) = *(buf + i + 1) - itemp; *(buf + i) += rtemp; *(buf + i + 1) += itemp; } wr = ((rtemp = wr) * wpr) - (wi * wpi) + wr; wi = (wi * wpr) + (rtemp * wpi) + wi; } } /* scale output */ /* scale = forward ? 1./ND : 2.; this is the original */ scale = (float) ((forward == 1) ? 1.0 : 1.0 / ND); if ((fabs(scale) - 1.0) < DBL_EPSILON) { bi = buf; be = buf + ND; while (bi < be) *bi++ *= scale; } } /* bitreverse places float array x containing N/2 complex values into bit-reversed order */ void bitreverse(float *buf, int N) { int i, j, m; for (i = j = 0; i < N; i += 2, j += m) { if (j > i) { float rtemp = *(buf + j); /* complex exchange */ float itemp = *(buf + j + 1); *(buf + j) = *(buf + i); *(buf + j + 1) = *(buf + i + 1); *(buf + i) = rtemp; *(buf + i + 1) = itemp; } for (m = N >> 1; m >= 2 && j >= m; m >>= 1) j -= m; } } qsstv_9.2.6/qsstv/drmrx/nrutil.cpp0000664000175000017500000004276613203343610016001 0ustar jomajoma#if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */ #include #include #include #define NR_END 1 #define FREE_ARG char* void nrerror(const char *error_text) /* Numerical Recipes standard error handler */ { fprintf(stderr, "Numerical Recipes run-time error...\n"); fprintf(stderr, "%s\n", error_text); fprintf(stderr, "...now exiting to system...\n"); exit(1); } // allocate a float vector with subscript range v[nl..nh] float *fvector(long nl, long nh) { float *v; v = (float *) malloc((size_t) ((nh - nl + 1 + NR_END) * sizeof(float))); if (!v) nrerror("allocation failure in vector()"); return v - nl + NR_END; } // allocate an int vector with subscript range v[nl..nh] int *ivector(long nl, long nh) { int *v; v = (int *) malloc((size_t) ((nh - nl + 1 + NR_END) * sizeof(int))); if (!v) nrerror("allocation failure in ivector()"); return v - nl + NR_END; } // allocate an unsigned char vector with subscript range v[nl..nh] unsigned char *cvector(long nl, long nh) { unsigned char *v; v = (unsigned char *) malloc((size_t) ((nh - nl + 1 + NR_END) * sizeof(unsigned char))); if (!v) nrerror("allocation failure in cvector()"); return v - nl + NR_END; } // allocate an unsigned long vector with subscript range v[nl..nh] unsigned long *lvector(long nl, long nh) { unsigned long *v; v = (unsigned long *) malloc((size_t) ((nh - nl + 1 + NR_END) * sizeof(long))); if (!v) nrerror("allocation failure in lvector()"); return v - nl + NR_END; } // allocate a double vector with subscript range v[nl..nh] double *dvector(long nl, long nh) { double *v; v = (double *) malloc((size_t) ((nh - nl + 1 + NR_END) * sizeof(double))); if (!v) nrerror("allocation failure in dvector()"); return v - nl + NR_END; } // allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] float **matrix(long nrl, long nrh, long ncl, long nch) { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; float **m; /* allocate pointers to rows */ m = (float **) malloc((size_t) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (float *) malloc((size_t) ((nrow * ncol + NR_END) * sizeof(float))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } // allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] double **dmatrix(long nrl, long nrh, long ncl, long nch) { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; double **m; /* allocate pointers to rows */ m = (double **) malloc((size_t) ((nrow + NR_END) * sizeof(double *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (double *) malloc((size_t) ((nrow * ncol + NR_END) * sizeof(double))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } // allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] int **imatrix(long nrl, long nrh, long ncl, long nch) { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; int **m; /* allocate pointers to rows */ m = (int **) malloc((size_t) ((nrow + NR_END) * sizeof(int *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (int *) malloc((size_t) ((nrow * ncol + NR_END) * sizeof(int))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long ,long newrl, long newcl) /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */ { long i, j, nrow = oldrh - oldrl + 1, ncol = oldcl - newcl; float **m; /* allocate array of pointers to rows */ m = (float **) malloc((size_t) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure in submatrix()"); m += NR_END; m -= newrl; /* set pointers to rows */ for (i = oldrl, j = newrl; i <= oldrh; i++, j++) m[j] = a[i] + ncol; /* return pointer to array of pointers to rows */ return m; } float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch) /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1 and ncol=nch-ncl+1. The routine should be called with the address &a[0][0] as the first argument. */ { long i, j, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; float **m; /* allocate pointers to rows */ m = (float **) malloc((size_t) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure in convert_matrix()"); m += NR_END; m -= nrl; /* set pointers to rows */ m[nrl] = a - ncl; for (i = 1, j = nrl + 1; i < nrow; i++, j++) m[j] = m[j - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh) /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */ { long i, j, nrow = nrh - nrl + 1, ncol = nch - ncl + 1, ndep = ndh - ndl + 1; float ***t; /* allocate pointers to pointers to rows */ t = (float ***) malloc((size_t) ((nrow + NR_END) * sizeof(float **))); if (!t) nrerror("allocation failure 1 in f3tensor()"); t += NR_END; t -= nrl; /* allocate pointers to rows and set pointers to them */ t[nrl] = (float **) malloc((size_t) ((nrow * ncol + NR_END) * sizeof(float *))); if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()"); t[nrl] += NR_END; t[nrl] -= ncl; /* allocate rows and set pointers to them */ t[nrl][ncl] = (float *) malloc((size_t) ((nrow * ncol * ndep + NR_END) * sizeof(float))); if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()"); t[nrl][ncl] += NR_END; t[nrl][ncl] -= ndl; for (j = ncl + 1; j <= nch; j++) t[nrl][j] = t[nrl][j - 1] + ndep; for (i = nrl + 1; i <= nrh; i++) { t[i] = t[i - 1] + ncol; t[i][ncl] = t[i - 1][ncl] + ncol * ndep; for (j = ncl + 1; j <= nch; j++) t[i][j] = t[i][j - 1] + ndep; } /* return pointer to array of pointers to rows */ return t; } void free_fvector(float *v, long nl, long ) /* free a float vector allocated with vector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_ivector(int *v, long nl, long ) /* free an int vector allocated with ivector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_cvector(unsigned char *v, long nl, long ) /* free an unsigned char vector allocated with cvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_lvector(unsigned long *v, long nl, long ) /* free an unsigned long vector allocated with lvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_dvector(double *v, long nl, long ) /* free a double vector allocated with dvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_matrix(float **m, long nrl, long , long ncl, long ) /* free a float matrix allocated by matrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_dmatrix(double **m, long nrl, long , long ncl, long ) /* free a double matrix allocated by dmatrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_imatrix(int **m, long nrl, long , long ncl, long ) /* free an int matrix allocated by imatrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_submatrix(float **b, long nrl, long , long , long ) /* free a submatrix allocated by submatrix() */ { free((FREE_ARG) (b + nrl - NR_END)); } void free_convert_matrix(float **b, long nrl, long , long , long ) /* free a matrix allocated by convert_matrix() */ { free((FREE_ARG) (b + nrl - NR_END)); } void free_f3tensor(float ***t, long nrl, long , long ncl, long , long ndl,long ) /* free a float f3tensor allocated by f3tensor() */ { free((FREE_ARG) (t[nrl][ncl] + ndl - NR_END)); free((FREE_ARG) (t[nrl] + ncl - NR_END)); free((FREE_ARG) (t + nrl - NR_END)); } #else /* ANSI */ /* traditional - K&R */ #include #define NR_END 1 #define FREE_ARG char* void nrerror(error_text) char error_text[]; /* Numerical Recipes standard error handler */ { void exit(); fprintf(stderr, "Numerical Recipes run-time error...\n"); fprintf(stderr, "%s\n", error_text); fprintf(stderr, "...now exiting to system...\n"); exit(1); } float *vector(nl, nh) long nh, nl; /* allocate a float vector with subscript range v[nl..nh] */ { float *v; v = (float *) malloc((unsigned int) ((nh - nl + 1 + NR_END) * sizeof(float))); if (!v) nrerror("allocation failure in vector()"); return v - nl + NR_END; } int *ivector(nl, nh) long nh, nl; /* allocate an int vector with subscript range v[nl..nh] */ { int *v; v = (int *) malloc((unsigned int) ((nh - nl + 1 + NR_END) * sizeof(int))); if (!v) nrerror("allocation failure in ivector()"); return v - nl + NR_END; } unsigned char *cvector(nl, nh) long nh, nl; /* allocate an unsigned char vector with subscript range v[nl..nh] */ { unsigned char *v; v = (unsigned char *) malloc((unsigned int) ((nh - nl + 1 + NR_END) * sizeof(unsigned char))); if (!v) nrerror("allocation failure in cvector()"); return v - nl + NR_END; } unsigned long *lvector(nl, nh) long nh, nl; /* allocate an unsigned long vector with subscript range v[nl..nh] */ { unsigned long *v; v = (unsigned long *) malloc((unsigned int) ((nh - nl + 1 + NR_END) * sizeof(long))); if (!v) nrerror("allocation failure in lvector()"); return v - nl + NR_END; } double *dvector(nl, nh) long nh, nl; /* allocate a double vector with subscript range v[nl..nh] */ { double *v; v = (double *) malloc((unsigned int) ((nh - nl + 1 + NR_END) * sizeof(double))); if (!v) nrerror("allocation failure in dvector()"); return v - nl + NR_END; } float **matrix(nrl, nrh, ncl, nch) long nch, ncl, nrh, nrl; /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */ { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; float **m; /* allocate pointers to rows */ m = (float **) malloc((unsigned int) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (float *) malloc((unsigned int) ((nrow * ncol + NR_END) * sizeof(float))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } double **dmatrix(nrl, nrh, ncl, nch) long nch, ncl, nrh, nrl; /* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */ { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; double **m; /* allocate pointers to rows */ m = (double **) malloc((unsigned int) ((nrow + NR_END) * sizeof(double *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (double *) malloc((unsigned int) ((nrow * ncol + NR_END) * sizeof(double))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } int **imatrix(nrl, nrh, ncl, nch) long nch, ncl, nrh, nrl; /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */ { long i, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; int **m; /* allocate pointers to rows */ m = (int **) malloc((unsigned int) ((nrow + NR_END) * sizeof(int *))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl] = (int *) malloc((unsigned int) ((nrow * ncol + NR_END) * sizeof(int))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for (i = nrl + 1; i <= nrh; i++) m[i] = m[i - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } float **submatrix(a, oldrl, oldrh, oldcl, oldch, newrl, newcl) float **a; long newcl, newrl, oldch, oldcl, oldrh, oldrl; /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */ { long i, j, nrow = oldrh - oldrl + 1, ncol = oldcl - newcl; float **m; /* allocate array of pointers to rows */ m = (float **) malloc((unsigned int) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure in submatrix()"); m += NR_END; m -= newrl; /* set pointers to rows */ for (i = oldrl, j = newrl; i <= oldrh; i++, j++) m[j] = a[i] + ncol; /* return pointer to array of pointers to rows */ return m; } float **convert_matrix(a, nrl, nrh, ncl, nch) float *a; long nch, ncl, nrh, nrl; /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1 and ncol=nch-ncl+1. The routine should be called with the address &a[0][0] as the first argument. */ { long i, j, nrow = nrh - nrl + 1, ncol = nch - ncl + 1; float **m; /* allocate pointers to rows */ m = (float **) malloc((unsigned int) ((nrow + NR_END) * sizeof(float *))); if (!m) nrerror("allocation failure in convert_matrix()"); m += NR_END; m -= nrl; /* set pointers to rows */ m[nrl] = a - ncl; for (i = 1, j = nrl + 1; i < nrow; i++, j++) m[j] = m[j - 1] + ncol; /* return pointer to array of pointers to rows */ return m; } float ***f3tensor(nrl, nrh, ncl, nch, ndl, ndh) long nch, ncl, ndh, ndl, nrh, nrl; /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */ { long i, j, nrow = nrh - nrl + 1, ncol = nch - ncl + 1, ndep = ndh - ndl + 1; float ***t; /* allocate pointers to pointers to rows */ t = (float ***) malloc((unsigned int) ((nrow + NR_END) * sizeof(float **))); if (!t) nrerror("allocation failure 1 in f3tensor()"); t += NR_END; t -= nrl; /* allocate pointers to rows and set pointers to them */ t[nrl] = (float **) malloc((unsigned int) ((nrow * ncol + NR_END) * sizeof(float *))); if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()"); t[nrl] += NR_END; t[nrl] -= ncl; /* allocate rows and set pointers to them */ t[nrl][ncl] = (float *) malloc((unsigned int) ((nrow * ncol * ndep + NR_END) * sizeof(float))); if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()"); t[nrl][ncl] += NR_END; t[nrl][ncl] -= ndl; for (j = ncl + 1; j <= nch; j++) t[nrl][j] = t[nrl][j - 1] + ndep; for (i = nrl + 1; i <= nrh; i++) { t[i] = t[i - 1] + ncol; t[i][ncl] = t[i - 1][ncl] + ncol * ndep; for (j = ncl + 1; j <= nch; j++) t[i][j] = t[i][j - 1] + ndep; } /* return pointer to array of pointers to rows */ return t; } void free_vector(v, nl, nh) float *v; long nh, nl; /* free a float vector allocated with vector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_ivector(v, nl, nh) int *v; long nh, nl; /* free an int vector allocated with ivector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_cvector(v, nl, nh) long nh, nl; unsigned char *v; /* free an unsigned char vector allocated with cvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_lvector(v, nl, nh) long nh, nl; unsigned long *v; /* free an unsigned long vector allocated with lvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_dvector(v, nl, nh) double *v; long nh, nl; /* free a double vector allocated with dvector() */ { free((FREE_ARG) (v + nl - NR_END)); } void free_matrix(m, nrl, nrh, ncl, nch) float **m; long nch, ncl, nrh, nrl; /* free a float matrix allocated by matrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_dmatrix(m, nrl, nrh, ncl, nch) double **m; long nch, ncl, nrh, nrl; /* free a double matrix allocated by dmatrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_imatrix(m, nrl, nrh, ncl, nch) int **m; long nch, ncl, nrh, nrl; /* free an int matrix allocated by imatrix() */ { free((FREE_ARG) (m[nrl] + ncl - NR_END)); free((FREE_ARG) (m + nrl - NR_END)); } void free_submatrix(b, nrl, nrh, ncl, nch) float **b; long nch, ncl, nrh, nrl; /* free a submatrix allocated by submatrix() */ { free((FREE_ARG) (b + nrl - NR_END)); } void free_convert_matrix(b, nrl, nrh, ncl, nch) float **b; long nch, ncl, nrh, nrl; /* free a matrix allocated by convert_matrix() */ { free((FREE_ARG) (b + nrl - NR_END)); } void free_f3tensor(t, nrl, nrh, ncl, nch, ndl, ndh) float ***t; long nch, ncl, ndh, ndl, nrh, nrl; /* free a float f3tensor allocated by f3tensor() */ { free((FREE_ARG) (t[nrl][ncl] + ndl - NR_END)); free((FREE_ARG) (t[nrl] + ncl - NR_END)); free((FREE_ARG) (t + nrl - NR_END)); } #endif /* ANSI */ qsstv_9.2.6/qsstv/drmrx/nrutil.h0000664000175000017500000000654113203343610015435 0ustar jomajoma#ifndef _NR_UTILS_H_ #define _NR_UTILS_H_ /* static float sqrarg; #define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg) */ /* static double dsqrarg; #define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg) */ /* static double dmaxarg1,dmaxarg2; #define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\ (dmaxarg1) : (dmaxarg2)) static double dminarg1,dminarg2; #define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\ (dminarg1) : (dminarg2)) static float maxarg1,maxarg2; #define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\ (maxarg1) : (maxarg2)) static float minarg1,minarg2; #define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\ (minarg1) : (minarg2)) static long lmaxarg1,lmaxarg2; #define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\ (lmaxarg1) : (lmaxarg2)) static long lminarg1,lminarg2; #define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\ (lminarg1) : (lminarg2)) static int imaxarg1,imaxarg2; #define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\ (imaxarg1) : (imaxarg2)) static int iminarg1,iminarg2; #define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\ (iminarg1) : (iminarg2)) */ #define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) #if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */ void nrerror (const char error_text[]); float *fvector (long nl, long nh); int *ivector (long nl, long nh); unsigned char *cvector (long nl, long nh); unsigned long *lvector (long nl, long nh); double *dvector (long nl, long nh); float **matrix (long nrl, long nrh, long ncl, long nch); double **dmatrix (long nrl, long nrh, long ncl, long nch); int **imatrix (long nrl, long nrh, long ncl, long nch); float **submatrix (float **a, long oldrl, long oldrh, long oldcl, long oldch, long newrl, long newcl); float **convert_matrix (float *a, long nrl, long nrh, long ncl, long nch); float ***f3tensor (long nrl, long nrh, long ncl, long nch, long ndl, long ndh); void free_fvector (float *v, long nl, long nh); void free_ivector (int *v, long nl, long nh); void free_cvector (unsigned char *v, long nl, long nh); void free_lvector (unsigned long *v, long nl, long nh); void free_dvector (double *v, long nl, long nh); void free_matrix (float **m, long nrl, long nrh, long ncl, long nch); void free_dmatrix (double **m, long nrl, long nrh, long ncl, long nch); void free_imatrix (int **m, long nrl, long nrh, long ncl, long nch); void free_submatrix (float **b, long nrl, long nrh, long ncl, long nch); void free_convert_matrix (float **b, long nrl, long nrh, long ncl, long nch); void free_f3tensor (float ***t, long nrl, long nrh, long ncl, long nch, long ndl, long ndh); #else /* ANSI */ /* traditional - K&R */ void nrerror (); float *vector (); float **matrix (); float **submatrix (); float **convert_matrix (); float ***f3tensor (); double *dvector (); double **dmatrix (); int *ivector (); int **imatrix (); unsigned char *cvector (); unsigned long *lvector (); void free_vector (); void free_dvector (); void free_ivector (); void free_cvector (); void free_lvector (); void free_matrix (); void free_submatrix (); void free_convert_matrix (); void free_dmatrix (); void free_imatrix (); void free_f3tensor (); #endif /* ANSI */ #endif /* _NR_UTILS_H_ */ qsstv_9.2.6/qsstv/drmrx/psdcmean.cpp0000664000175000017500000000465013203343610016244 0ustar jomajoma /* * File psdcmean.c * * Calculates mean powerspectrum of complex input data * using blocklength lblock and nblocks as number * of blocks to be processed. * * Author M.Bos - PA0MBO * Date Feb 21st 2009 * * resulting power spectral density of complex input * signal in rsbuf is stored in cpsd[] * length of datablock to be processed is lblock * nblocks is the nuber of blocks of input data * to be processed. * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include void cfft(float *, int, int); void psdcmean(float *rsbuf, float *cpsd, int lblock, int nblocks) { float *pinput; int i, j; float tmpinbuf[2048]; float result[512]; /* check space */ if (lblock > 1024) { printf("not enough temp space\b"); exit(EXIT_FAILURE); } /* clear array result before accumulating new data */ for (i = 0; i < (lblock / 2); i++) { result[i] = 0.0; } /* loop over all blocks taking care to keep track of ptr in input */ pinput = rsbuf; for (j = 0; j < nblocks; j++) { /* Now fill tmpinbuf with converted data from input */ for (i = 0; i < lblock; i++) { tmpinbuf[i * 2] = pinput[2 * i]; tmpinbuf[i * 2 + 1] = pinput[2 * i + 1]; } cfft(tmpinbuf, lblock / 2, 1); for (i = 1; i < lblock / 2; ++i) { result[i] += sqrt(tmpinbuf[i * 2] * tmpinbuf[i * 2] + tmpinbuf[i * 2 + 1] * tmpinbuf[i * 2 + 1]); } pinput += 2 * lblock; /* update pointer in input data */ } for (i = 0; i < lblock / 2; i++) { result[i] = (float) (10.0 * log(result[i] + 1.0e-8) / 2.305 - 14.0); } /* interchange halfs of cpsd buffer as in matlab code from plot_input_spectrum in diorama */ for (i = 1; i < lblock / 4; i++) { cpsd[i] = result[lblock / 4 + i]; cpsd[i + lblock / 4 - 1] = result[i]; } } qsstv_9.2.6/qsstv/drmrx/psdmean.cpp0000664000175000017500000000410613203343610016075 0ustar jomajoma /* * File psdmean.c * * Calculates mean powerspectrum of input data * using blocklength lblock and nblocks as number * of blocks to be processed. * * Author M.Bos - PA0MBO * Date Feb 21st 2009 * * resulting power spectral density of real input data * vector input[] is stored in psd[] * lblock is the length of the block of data to be * processed and nblock is the number of data blocks * to be processed * */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ #include #include #include #include #include void rfft(float *, int, int); void psdmean(float *input, float *psd, int lblock, int nblocks) { float *pinput; int i, j; float tmpinbuf[1024]; /* check for space allocated */ if (lblock > 1024) { printf("lblokc param too large in call psdmean\n"); exit(EXIT_FAILURE); } /* clear array psd before accumulating new data */ for (i = 0; i < lblock / 2; i++) { psd[i] = 0.0; } /* loop over all blocks taking care to keep track of ptr in input */ pinput = input; for (j = 0; j < nblocks; j++) { /* Now fill tmpinbuf with converted data from input */ for (i = 0; i < lblock; i++) { tmpinbuf[i] = pinput[i]; } rfft(tmpinbuf, lblock / 2, 1); for (i = 1; i < lblock / 2; ++i) { psd[i] += sqrt(tmpinbuf[i * 2] * tmpinbuf[i * 2] + tmpinbuf[2 * i + 1] * tmpinbuf[2 * i + 1]); } pinput += lblock; /* update pointer in input data */ } for (i = 1; i < lblock / 2; ++i) psd[i] = (float) (10.0 * log(psd[i] + 1.0e-8) / 2.3025 - 14.0); } qsstv_9.2.6/qsstv/drmrx/resamplefilter.h0000664000175000017500000000700113203343610017126 0ustar jomajoma /* Automatically generated file with MATLAB */ /* File name: "ResampleFilter.m" */ /* Filter taps in time-domain */ #ifndef _RESAMPLEFILTER_H_ #define _RESAMPLEFILTER_H_ #define RES_FILT_NUM_TAPS_PER_PHASE 12 #define INTERP_DECIM_I_D 10 /* Filter for ratios close to 1 */ static float fResTaps1To1[INTERP_DECIM_I_D][RES_FILT_NUM_TAPS_PER_PHASE] = { {-0.00129181992672801360f, 0.00561586829442904840f, -0.01349857823816511800f, 0.02541150940858524100f, -0.04267869501534898200f, 0.07724474282951483700f, 0.96609875058711103000f, -0.01641812005088002400f, -0.00427135103965109450f, 0.00726225824406205160f, -0.00544188094946287510f, 0.00266742068076876060f }, {-0.00207886551285772290f, 0.00866090598717600930f, -0.02161960909069559500f, 0.04383507935997314800f, -0.08302470868585065700f, 0.18738870090358245000f, 0.93524350914423104000f, -0.09031872116141286000f, 0.02909509423931267600f, -0.00897188476756275060f, 0.00178311012364952820f, 0.00010586149691723067f }, {-0.00287519800425638110f, 0.01143197533872717000f, -0.02889142869399521600f, 0.06060641890050100900f, -0.12152802242786863000f, 0.30933747340895279000f, 0.87539536840978205000f, -0.14271415809850990000f, 0.05516985095031713000f, -0.02205265100214613000f, 0.00761119378345958850f, -0.00187713739944610450f }, {-0.00354120720771153910f, 0.01351098086300389300f, -0.03433664370844288100f, 0.07367662235517660800f, -0.15398027155782226000f, 0.43728178746780866000f, 0.79013921003423337000f, -0.17341770937821352000f, 0.07263788052016696700f, -0.03120859084480779800f, 0.01170664402374247200f, -0.00319259334815649940f }, {-0.00391755659664638590f, 0.01447751287549226700f, -0.03701682481313090000f, 0.08107302414568577600f, -0.17606165300033697000f, 0.56464344237183917000f, 0.68451472884717957000f, -0.18369620562420094000f, 0.08111657494320076400f, -0.03614676421513295800f, 0.01396276906259418800f, -0.00384568128202934270f }, {-0.00384568128202934270f, 0.01396276906259418800f, -0.03614676421513295800f, 0.08111657494320076400f, -0.18369620562420094000f, 0.68451472884717957000f, 0.56464344237183917000f, -0.17606165300033697000f, 0.08107302414568577600f, -0.03701682481313090000f, 0.01447751287549226700f, -0.00391755659664638590f }, {-0.00319259334815649940f, 0.01170664402374247200f, -0.03120859084480779800f, 0.07263788052016696700f, -0.17341770937821352000f, 0.79013921003423337000f, 0.43728178746780866000f, -0.15398027155782226000f, 0.07367662235517660800f, -0.03433664370844288100f, 0.01351098086300389300f, -0.00354120720771153910f }, {-0.00187713739944610450f, 0.00761119378345958850f, -0.02205265100214613000f, 0.05516985095031713000f, -0.14271415809850990000f, 0.87539536840978205000f, 0.30933747340895279000f, -0.12152802242786863000f, 0.06060641890050100900f, -0.02889142869399521600f, 0.01143197533872717000f, -0.00287519800425638110f }, {0.00010586149691723067f, 0.00178311012364952820f, -0.00897188476756275060f, 0.02909509423931267600f, -0.09031872116141286000f, 0.93524350914423104000f, 0.18738870090358245000f, -0.08302470868585065700f, 0.04383507935997314800f, -0.02161960909069559500f, 0.00866090598717600930f, -0.00207886551285772290f }, {0.00266742068076876060f, -0.00544188094946287510f, 0.00726225824406205160f, -0.00427135103965109450f, -0.01641812005088002400f, 0.96609875058711103000f, 0.07724474282951483700f, -0.04267869501534898200f, 0.02541150940858524100f, -0.01349857823816511800f, 0.00561586829442904840f, -0.00129181992672801360f } }; #endif /* _RESAMPLEFILTER_H_ */ qsstv_9.2.6/qsstv/drmrx/sourcedecoder.cpp0000664000175000017500000006247013203343610017304 0ustar jomajoma#include "sourcedecoder.h" #include "drm.h" #include "appglobal.h" #include "drmproto.h" #include "configparams.h" #include "dispatch/dispatcher.h" #include "reedsolomoncoder.h" #include "demodulator.h" #include "ftp.h" #include "configparams.h" #include "logbook/logbook.h" #include "drmstatusframe.h" #include #include #include #include #include #include sourceDecoder::sourceDecoder(QObject *parent) : QObject(parent) { transportBlockPtrList.clear(); } void sourceDecoder::init() { lastTransportBlockPtr=NULL; bodyTotalSegments=0; checkIt=false; erasureList.clear(); lastContinuityIndex=-1; alreadyDisplayed=false; } /*! \brief decode of valid data block • header 8 bits. • data field n bytes. • CRC 16 bits. \return bool return true if successful */ bool sourceDecoder::decode() { double checksum; int N_partB; // if(!demodulatorPtr->isTimeSync()) if (channel_decoded_data_buffer_data_valid != 1) return false; if (audio_data_flag == 0) { addToLog("audio decoding not implemented in qsstv !\n",LOGDRMSRC); return false; } addToLog("Datapacket received",LOGPERFORM); N_partB = (int) (length_decoded_data/ 8); addToLog(QString("N-partB lenght=%1").arg(N_partB),LOGDRMSRC); if(N_partB>PACKETBUFFERLEN) { addToLog(QString("packet buffer length exceeded: lenght=%1").arg(N_partB),LOGDRMMOT); } bits2bytes (channel_decoded_data_buffer, N_partB * 8, packetBuffer); crc16_bytewise(&checksum, packetBuffer,N_partB); if(fabs (checksum) <= DBL_EPSILON) { if(!setupDataBlock(packetBuffer,true,N_partB)) { msc_valid=INVALID; return false; } } else { msc_valid=INVALID; return false; } // at this point we have a dataPacket we now check header / data and buils a transport stream switch(currentDataPacket.dataGroupType) { case MOTDATA: addToLog("Datasegment",LOGDRMSRC); addDataSegment(); break; case MOTHEAD: addToLog("Headersegment",LOGDRMSRC); addHeaderSegment(); break; default: return false; break; } return true; } bool sourceDecoder::setupDataBlock(unsigned char *buffer,bool crcIsOK,int len) { currentDataBlock.length=len; unsigned char header=buffer[0]; unsigned int availableBytes; const char *bufPtr; currentDataBlock.ba=QByteArray((char *)buffer,len); currentDataBlock.firstFlag=currentDataBlock.lastFlag=false; if(header & 0x80) currentDataBlock.firstFlag = true; if(header & 0x40) currentDataBlock.lastFlag = true; currentDataBlock.packetID = (header & 0x30) >> 4; currentDataBlock.PPI = (header & 0x8) >> 3; currentDataBlock.continuityIndex = (header & 0x7); currentDataBlock.log(); if ((currentDataBlock.PPI != 0) && (crcIsOK)) { availableBytes=buffer[1]; bufPtr=(const char *)&buffer[2]; } else { availableBytes=len-3; bufPtr=(const char *)&buffer[1]; } if(currentDataBlock.firstFlag) { holdingBuffer.clear(); lastContinuityIndex=currentDataBlock.continuityIndex; } else { if(lastContinuityIndex<0) { return false; } lastContinuityIndex=(lastContinuityIndex+1)%8; if(currentDataBlock.continuityIndex!=lastContinuityIndex) { lastContinuityIndex=-1; return false; } } holdingBuffer.append(bufPtr,availableBytes); if(currentDataBlock.lastFlag) { return setupDataPacket(holdingBuffer); } return false; } void dataBlock::log() { addToLog(QString("FFlag %1,LFlag %2, PacketID %3,PPI %4,ContIdx %5, CRC %6 len %7") .arg(firstFlag).arg(lastFlag).arg(packetID).arg(PPI).arg(continuityIndex).arg(crcOK).arg(length),LOGDRMMOT); } //MSC Header Description 2 bytes or 4 bytes if Extension field // First Byte // B7 Extension Flag Header has 2 more bytes in the Extension field // B6 CRC Flag MOT has CRC // B5 Session Flag MOT last flag and segment number present. // B4 UserAccess Flag Mot user access field present. // B3-B0 Data Group Type // 0 0 0 0 (0) General data; // 0 0 0 1 (1) CA messages (for example ECMs or EMMs: see subclause 9.3.2.1); // 0 0 1 0 (2) General data and CA parameters (for example, DGCA); // 0 0 1 1 (3) MOT header information; // 0 1 0 0 (4) MOT data // 0 1 0 1 (5) MOT data and CA parameters. //Second Byte // B7-B4 Continuity Index // B3-B0 Repetition Index // 2 more extension bytes if flag is set // B15-B0 Extension Field - no further specifications // Session Header (presence indicated by Session Flag // if last flag and segment number present // B15 last segment // B14-B0 segment number // user access fields // B7-B5 rfa (not used) // B4 TransportID present flag // B3-B0 length of user access fields // if set // B15-B0 TransportID // other bytes filled with End user address field // This is followed with a 2 bytes Segmentation header // B15-B13 Repetition Count (not used) // B12-B0 Length of the data that follows bool sourceDecoder::setupDataPacket(QByteArray ba) { double checksum; unsigned char lengthIndicator; unsigned char header; currentDataPacket.ba=ba; // drop crc header=ba.at(0); currentDataPacket.transportID =0xFFFF; currentDataPacket.extFlag=false; currentDataPacket.crcFlag=false; currentDataPacket.sessionFlag=false; currentDataPacket.userFlag=false; currentDataPacket.lastSegment=false; currentDataPacket.crcOK=currentDataBlock.crcOK; if(header&0x10) currentDataPacket.userFlag=true; currentDataPacket.dataGroupType=(edataGroupType)(header&0x07); if(header&0x80) currentDataPacket.extFlag=true; if(header&0x20) currentDataPacket.sessionFlag=true; if(header&0x40) { currentDataPacket.crcFlag=true; crc16_bytewise (&checksum,(unsigned char *)currentDataPacket.ba.data(),currentDataPacket.ba.count()); if (fabs (checksum) <= DBL_EPSILON) { currentDataPacket.crcOK=true; } else { currentDataPacket.crcOK=false; msc_valid=INVALID; return false; } currentDataPacket.chop(2); // drop crc } currentDataPacket.advance(2); //skip header and continuity bits if(currentDataPacket.extFlag) currentDataPacket.advance(2); // just skip the extension bytes if(currentDataPacket.sessionFlag) { currentDataPacket.segmentNumber = (((unsigned char)(currentDataPacket.ba.at(0)) & 0x7F))*256+ ((unsigned char)currentDataPacket.ba.at(1)) ; if(currentDataPacket.ba.at(0)&0x80) { currentDataPacket.lastSegment=true; } currentSegmentNumber=currentDataPacket.segmentNumber; currentDataPacket.advance(2); } if (currentDataPacket.userFlag) { currentDataPacket.userAccessField = (unsigned char)(currentDataPacket.ba.at(0)); currentDataPacket.advance(1); lengthIndicator = (currentDataPacket.userAccessField& 0xF); if((currentDataPacket.userAccessField & 0x10) && (lengthIndicator>=2)) currentDataPacket.transportID = (((unsigned char)(currentDataPacket.ba.at(0))))*256+ ((unsigned char)currentDataPacket.ba.at(1)) ; currentDataPacket.advance(lengthIndicator); } currentDataPacket.segmentSize=(((unsigned char)(currentDataPacket.ba.at(0)) & 0x1F))*256+ ((unsigned char)currentDataPacket.ba.at(1)); currentDataPacket.advance(2); currentDataPacket.lenght=currentDataPacket.ba.count(); currentDataPacket.log(); return true; } void dataPacket::log() { addToLog(QString("extF %1,dType %2, sessionF %3, lastSegment %4, segment# %5, userF %6, transportId %7, len %8") .arg(extFlag).arg(dataGroupType).arg(sessionFlag).arg(lastSegment).arg(segmentNumber).arg(userFlag).arg(transportID).arg(lenght),LOGDRMMOT); } bool sourceDecoder::addHeaderSegment() { loadRXImageEvent *stce; displayMBoxEvent *stmb; transportBlock *tbPtr; addToLog(QString("Header segsize: %1").arg(currentDataPacket.segmentSize),LOGDRMSRC); tbPtr=getTransporPtr(currentDataPacket.transportID,true); if(!tbPtr->alreadyReceived) msc_valid=VALID; else { msc_valid=ALREADYRECEIVED; if(!alreadyDisplayed) { alreadyDisplayed=true; // redisplay stce= new loadRXImageEvent(QString("%1").arg(tbPtr->newFileName)); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done stmb= new displayMBoxEvent("DRM Receive",QString("File %1 already received").arg(tbPtr->newFileName)); QApplication::postEvent( dispatcherPtr, stmb ); } return true; } tbPtr->headerReceived=true; unsigned char *dataPtr=(unsigned char *)currentDataPacket.ba.data(); unsigned char PLI; unsigned char paramID; unsigned char extBit; unsigned short dataFieldLength; tbPtr->bodySize = (((unsigned int)dataPtr[0]) << 20) + (((unsigned int)dataPtr[1]) << 12) + (((unsigned int)dataPtr[2]) << 4) + ((((unsigned int)dataPtr[3]) & 0xF0) >> 4); tbPtr->headerSize = (((unsigned int)dataPtr[3] & 0x0F) << 9) + (((unsigned int)dataPtr[4]) << 1) + ((((unsigned int)dataPtr[5]) & 0x80) >> 7); tbPtr->contentType = (((unsigned int)dataPtr[5] & 0x7E) >> 1); tbPtr->contentSubtype = ((((unsigned int)dataPtr[5]) & 0x1) <<8) +((unsigned int)dataPtr[6]); currentDataPacket.advance(7); // size of header core // The header core is followed by a number of parameter blocks // the first byte of every parameter block contains a 2-bits PLI (B7 and B6) indicating the type of parameter block. while(currentDataPacket.ba.count()) // todo { PLI=dataPtr[0]>>6; paramID=dataPtr[0]&0x3F; switch (PLI) { case 0: currentDataPacket.advance(1); break; case 1: loadParams(tbPtr,paramID,1); currentDataPacket.advance(2); break; case 2: loadParams(tbPtr,paramID,4); currentDataPacket.advance(5); break; case 3: extBit=dataPtr[0]&0x80; if(extBit) { dataFieldLength=256*(dataPtr[0]&0x7F)+dataPtr[1]; currentDataPacket.advance(2); } else { dataFieldLength=dataPtr[0]&0x7F; currentDataPacket.advance(1); } loadParams(tbPtr,paramID,dataFieldLength); currentDataPacket.advance(dataFieldLength); break; } } return true; } void sourceDecoder::loadParams(transportBlock *tbPtr,unsigned char paramID,int len) { // QByteArray testBA; // char *data; // unsigned int ct; rxDRMStatusEvent *stce; QString tmp,t; switch(paramID) { case 5: // expiration break; case 6: break; case 12: tbPtr->fileName=QString::fromLatin1(currentDataPacket.ba.data()+1).left(len-1); stce= new rxDRMStatusEvent(QString("%1").arg(tbPtr->fileName)); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done break; default: break; } } void sourceDecoder::addDataSegment() { int i; transportBlock *tbPtr; tbPtr=getTransporPtr(currentDataPacket.transportID,true); rxTransportID=currentDataPacket.transportID; if(callsignValid) tbPtr->callsign=drmCallsign; addToLog(QString("Data segsize: %1 segment# %2").arg(currentDataPacket.segmentSize).arg(currentDataPacket.segmentNumber),LOGDRMSRC); if(!tbPtr->alreadyReceived) msc_valid=VALID; else { msc_valid=ALREADYRECEIVED; // return; } if(currentDataPacket.lastSegment) { tbPtr->totalSegments=currentDataPacket.segmentNumber+1; tbPtr->lastSegmentReceived=true; } else { tbPtr->defaultSegmentSize=currentDataPacket.segmentSize; } for(i=tbPtr->dataSegmentPtrList.count();i<=currentDataPacket.segmentNumber;i++) { tbPtr->dataSegmentPtrList.append(new dataSegment(tbPtr->defaultSegmentSize)); } if(!tbPtr->dataSegmentPtrList.at(currentDataPacket.segmentNumber)->hasData()) { checkIt=true; } else { msc_valid=ALREADYRECEIVED; } if(tbPtr->alreadyReceived) { msc_valid=ALREADYRECEIVED; checkIt=false; } if(tbPtr->totalSegmentstotalSegments=currentDataPacket.segmentNumber+1; bodyTotalSegments=tbPtr->totalSegments; rxSegments=tbPtr->segmentsReceived; // bytesReceived=rxSegments*tbPtr->defaultSegmentSize; tbPtr->dataSegmentPtrList.at(currentDataPacket.segmentNumber)->setData(currentDataPacket.ba,currentDataPacket.segmentNumber,true); writeData(tbPtr); } void sourceDecoder::writeData(transportBlock *tbPtr) { int i; QByteArray ba; int length=0; erasureList.clear(); erasureList.append(tbPtr->totalSegments); erasureList.append(tbPtr->defaultSegmentSize); for(i=0;idataSegmentPtrList.count();i++) { if(!tbPtr->dataSegmentPtrList.at(i)->hasData()) { erasureList.append(i); ba.append(QByteArray(tbPtr->defaultSegmentSize,0x00)); } else { ba.append(tbPtr->dataSegmentPtrList.at(i)->data); } length+=tbPtr->dataSegmentPtrList.at(i)->data.size(); } tbPtr->segmentsReceived=0; drmBlockList.clear(); for(i=0;idataSegmentPtrList.count();i++) { if(tbPtr->dataSegmentPtrList.at(i)->hasData()) { drmBlockList.append(i); tbPtr->segmentsReceived++; } } if(tbPtr->isAlmostComplete()<63) return ; if(!tbPtr->lastSegmentReceived) return; checkSaveImage(ba,tbPtr); } void sourceDecoder::saveImage(transportBlock *tbPtr) { int i; eftpError ftpResult; QByteArray hybridBa; QImage test; displayTextEvent *stce; displayMBoxEvent *stmb=0; notifyActionEvent *na; rxDRMNotifyEvent *rxne; QString t; bool done=false; bool textMode=false; QString downloadF, RxOkF; bool saveOK=false; alreadyDisplayed=true; if(tbPtr->alreadyReceived) { return ; } if(tbPtr->fileName.isEmpty()) return ; if(tbPtr->retrieveTries==0) lastAvgSNR=avgSNR; rxne = new rxDRMNotifyEvent(""); QApplication::postEvent( dispatcherPtr, rxne ); // Qt will delete it when done isHybrid=false; if((tbPtr->fileName.left(3)==".de") || (tbPtr->fileName.left(3)=="de_")) { isHybrid=true; ftpInterface ftpIntf("Save Image FTP"); if((enableHybridRx) && (soundRoutingInput!=soundBase::SNDINFROMFILE)) { addToLog(QString("Hybrid filename %1, attempt %2").arg(tbPtr->fileName).arg(tbPtr->retrieveTries+1),LOGALL); downloadF=rxDRMImagesPath+"/"+tbPtr->fileName; for(i=0;idataSegmentPtrList.count();i++) { hybridBa+=tbPtr->dataSegmentPtrList.at(i)->data; } if(hc.deCrypt(&hybridBa)) { if ((tbPtr->retrieveTries==0) && rxNotifySetup()) { RxOkF = "Dummy"+tbPtr->fileName+"+++."+myCallsign+QString(" %1dB SNR").arg(lastAvgSNR,0,'f',0); if (enableHybridNotify) { na=new notifyActionEvent("*+++."+myCallsign+"*","Dummy\r\n", RxOkF); QApplication::postEvent( dispatcherPtr, na); // Qt will delete it when done } if (enableHybridNotifySnoop) { rxNotifyCheck(tbPtr->fileName); } } tbPtr->retrieveTries++; ftpIntf.setupConnection(hc.host(),hc.port(),hc.user(),hc.passwd(),hc.dir()+"/"+hybridFtpHybridFilesDirectory); ftpResult=ftpIntf.downloadFile(tbPtr->fileName.toLatin1(),downloadF); switch(ftpResult) { case FTPOK: break; case FTPERROR: stmb= new displayMBoxEvent("FTP Error",QString("Host: %1: %2").arg(ftpRemoteHost).arg(ftpIntf.getLastError())); errorOut() << "ftp error" << ftpRemoteHost << ftpIntf.getLastError(); break; case FTPNAMEERROR: stmb= new displayMBoxEvent("FTP Error",QString("Host: %1, Error in filename").arg(ftpRemoteHost)); errorOut() << "ftp filename error" << ftpRemoteHost << ftpIntf.getLastError(); break; case FTPCANCELED: stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 Canceled").arg(ftpRemoteHost)); errorOut() << "ftp connection error" << ftpRemoteHost << ftpIntf.getLastError(); break; case FTPTIMEOUT: stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 timed out").arg(ftpRemoteHost)); errorOut() << "ftp connection timeout error" << ftpRemoteHost << ftpIntf.getLastError(); break; } if(ftpResult!=FTPOK) { if ((ftpResult!=FTPTIMEOUT) || (tbPtr->retrieveTries>1)) { QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done tbPtr->setAlreadyReceived(true); } return; } } else { if (tbPtr->retrieveTries==0) { stmb= new displayMBoxEvent("Hybrid Error","No file downloaded"); QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done return; } } } else { downloadF.clear(); } tbPtr->newFileName=downloadF; } if(tbPtr->newFileName.isEmpty()) return ; if(!test.load(tbPtr->newFileName)) { // maybe text QFileInfo finfo(tbPtr->newFileName); if((finfo.suffix()=="txt") || (finfo.suffix()=="chat") ) { QFile fi(tbPtr->newFileName); if(!fi.open(QIODevice::ReadOnly)) return; t=fi.readAll(); stce= new displayTextEvent(t); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done textMode=true; } saveOK=true; } else { saveOK=true; } if(saveOK) { QFileInfo tfi(tbPtr->newFileName); QString modestr(tfi.fileName()); modestr+=QString(" %1dB ").arg(lastAvgSNR,0,'f',0); if(isHybrid) modestr+="Hybrid "; modestr+=compactModeToString(tbPtr->modeCode); logBookPtr->logQSO(tbPtr->callsign,"DSSTV",modestr); } tbPtr->setAlreadyReceived(true); if(!textMode) { QString info=""; if (isHybrid) info+="Hybrid"; else info+=compactModeToString(tbPtr->modeCode); info+=QString(" %2dB de %3").arg(lastAvgSNR,0,'f',0).arg(tbPtr->callsign); // slotRXNotification("*** "+info); saveDRMImageEvent *ce = new saveDRMImageEvent(tbPtr->newFileName,info); ce->waitFor(&done); QApplication::postEvent(dispatcherPtr, ce); while(!done) { usleep(10); } checkIt=false; } } bool sourceDecoder::rxNotifySetup() { ftpSetupEvent *se; if (!(enableHybridNotify || enableHybridNotifySnoop)) return false; se=new ftpSetupEvent (notifyRXIntf,hybridNotifyRemoteHost,hybridNotifyPort,hybridNotifyLogin,hybridNotifyPassword,hybridNotifyRemoteDir+"/RxOkNotifications1"); QApplication::postEvent( dispatcherPtr, se); // Qt will delete it when done return true; } bool sourceDecoder::rxNotifyCheck(QString fn) { rxDRMNotifyEvent *rxne; notifyCheckEvent *se; rxne = new rxDRMNotifyEvent(""); QApplication::postEvent( dispatcherPtr, rxne ); if (!enableHybridNotifySnoop) return false; se=new notifyCheckEvent(notifyRXIntf,fn, 5, 45/5, false); QApplication::postEvent( dispatcherPtr,se ); return true; } bool sourceDecoder::checkSaveImage(QByteArray ba,transportBlock *tbPtr) { prepareFixEvent *pe; QFile outFile; reedSolomonCoder rsd; QString fileName; QString extension; fileName=rxDRMImagesPath+"/"+tbPtr->fileName; tbPtr->newFileName=fileName; QByteArray baFile; QByteArray *baFilePtr; if(!checkIt) return false; QFileInfo qfinf(fileName); extension=qfinf.suffix().toLower(); if((extension=="rs1") || (extension=="rs2") ||(extension=="rs3")||(extension=="rs4")) { // try to decode if(tbPtr->alreadyReceived) return false; if(!rsd.decode(ba,fileName,tbPtr->newFileName,baFile,extension,erasureList)) return false; baFilePtr=&baFile; } else { if(!tbPtr->isComplete()) return false; tbPtr->newFileName=fileName; if((tbPtr->fileName=="bsr.bin")&&(!tbPtr->alreadyReceived)) { tbPtr->setAlreadyReceived(true); pe = new prepareFixEvent(ba); QApplication::postEvent(dispatcherPtr, pe); return false; } baFilePtr=&ba; } if(!tbPtr->alreadyReceived) { outFile.setFileName(tbPtr->newFileName); if(outFile.open(QIODevice::WriteOnly)<=0) { outFile.close(); return false; } outFile.write(*baFilePtr); outFile.close(); erasureList.clear(); saveImage(tbPtr); } return false; } QList *sourceDecoder::getBSR() { int i; transportBlock *tbPtr; bsrList.clear(); for(i=0;ialreadyReceived) continue; if(tbPtr->fileName=="bsr.bin") continue; bsrList.append(bsrBlock(tbPtr)); } return &bsrList; } bool sourceDecoder::storeBSR(transportBlock *tb, bool compat) { int i; int needsFiller; int prevErasure=0; // QByteArray ba; erasureList.clear(); erasureList.append(tb->totalSegments); erasureList.append(tb->defaultSegmentSize); for(i=0;idataSegmentPtrList.count();i++) { if(!tb->dataSegmentPtrList.at(i)->hasData()) { erasureList.append(i); } } tb->baBSR.clear(); if(erasureList.count()<3) return false; //erasurelist has already totalSegments and defaultSegmentSize tb->baBSR.append(QString::number(tb->transportID).toLatin1().data()); tb->baBSR.append("\n"); tb->baBSR.append("H_OK\n"); tb->baBSR.append(QString::number(erasureList.at(1)).toLatin1().data()); tb->baBSR.append("\n"); tb->baBSR.append(QString::number(erasureList.at(2)).toLatin1().data()); tb->baBSR.append("\n"); prevErasure=erasureList.at(2); needsFiller=false; for(i=3;ibaBSR.append(QString::number(-1).toLatin1().data()); tb->baBSR.append("\n"); needsFiller=false; } tb->baBSR.append(QString::number(erasureList.at(i)).toLatin1().data()); tb->baBSR.append("\n"); } prevErasure=erasureList.at(i); } if(needsFiller) { tb->baBSR.append(QString::number(-1).toLatin1().data()); tb->baBSR.append("\n"); needsFiller=false; tb->baBSR.append(QString::number(erasureList.at(erasureList.count()-1)).toLatin1().data()); tb->baBSR.append("\n"); } tb->baBSR.append("-99\n"); if(!compat) { QString temp; tb->baBSR.append(tb->fileName+"\n"); temp=QString::number(tb->modeCode); while(temp.length()<5) temp.prepend("0"); tb->baBSR.append(temp); } return true; } transportBlock *sourceDecoder::getTransporPtr(unsigned short tId,bool create) { int i; rxDRMStatusEvent *stce; bool found=false; for(i=0;itransportID==tId) { found=true; break; } } if(found) lastTransportBlockPtr=transportBlockPtrList.at(i); else if (create) { callsignValid=false; bodyTotalSegments=0; drmBlockList.clear(); stce= new rxDRMStatusEvent(""); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done if(transportBlockPtrList.count()>=MAXTRANSPORTLISTS) { //delete the oldest transportBlockPtrList.removeFirst(); } for(i=0;ifileName=="bsr.bin") { transportBlockPtrList.takeAt(i); } else i++; } transportBlockPtrList.append(new transportBlock(tId)); lastTransportBlockPtr=transportBlockPtrList.last(); lastTransportBlockPtr->robMode=robustness_mode; lastTransportBlockPtr->interLeaver=interleaver_depth_new; lastTransportBlockPtr->mscMode=msc_mode_new; // qam lastTransportBlockPtr->mpx=multiplex_description.PL_PartB; lastTransportBlockPtr->spectrum=spectrum_occupancy_new; // remap msc_new to modeCode int mCode=1; //default QAM16 if(msc_mode_new==3) mCode=0; if(msc_mode_new==0) mCode=2; int protection=0; if(multiplex_description.PL_PartB==1) protection=1; lastTransportBlockPtr->modeCode=robustness_mode*10000+spectrum_occupancy_new*1000+protection*100+mCode*10+interleaver_depth_new; } else { return NULL; } return lastTransportBlockPtr; } void sourceDecoder::removeTransporPtr(transportBlock * ptr) { int i; for(i=0;i #include #include #define PACKETBUFFERLEN 512 #define NUMSERVICES 4 #define MAXTRANSPORTLISTS 5 #include #include #include #include #include "appdefs.h" #include "hybridcrypt.h" #include "ftp.h" enum edataGroupType {GENDATA,CAMESS,GENCA,MOTHEAD,MOTDATA,MOTDATACA}; struct dataSegment { dataSegment(int newSize) { crcOK=false; recovered=false; segmentNumber=-1; data.resize(newSize); data.fill(0XAA,newSize); } void setData(QByteArray ba,short int segNumber,bool crcok) { crcOK=crcok; data=ba; segmentNumber=segNumber; } void clearData() { data.clear(); } bool crcOK; bool recovered; short int segmentNumber; bool hasData() {return (crcOK||recovered);} QByteArray data; }; struct dataPacket { void log(); QByteArray ba; bool extFlag; bool crcFlag; bool sessionFlag; bool userFlag; bool crcOK; edataGroupType dataGroupType; unsigned char continuityIndex; unsigned char repetitionIndex; unsigned short segmentNumber; bool lastSegment; unsigned short transportID; unsigned char userAccessField; unsigned short segmentSize; int offset; int lenght; unsigned int advance(int numBytes) { ba.remove(0,numBytes); return ba.count(); } unsigned int chop(int numBytes) { ba.chop(numBytes); return ba.count(); } }; struct dataBlock { void log(); bool firstFlag; bool lastFlag; short packetID; bool PPI; unsigned char continuityIndex; bool crcOK; unsigned int length; QByteArray ba; }; struct transportBlock { transportBlock(unsigned short tId) { clear(); transportID=tId; } void clear() { totalSegments=0; headerReceived=false; segmentsReceived=0; bodySize=0; headerSize=0; alreadyReceived=false; retrieveTries=0; // blockList.clear(); lastSegmentReceived=false; defaultSegmentSize=0; } bool isComplete() { if(!headerReceived) return false; if(segmentsReceivedclearData(); } } } unsigned short transportID; unsigned int bodySize; unsigned int headerSize; unsigned short contentType; unsigned short contentSubtype; unsigned int defaultSegmentSize; QString fileName; QString newFileName; bool headerReceived; bool alreadyReceived; int retrieveTries; unsigned short segmentsReceived; bool lastSegmentReceived; int totalSegments; QString callsign; // QList blockList; QVector dataSegmentPtrList; int robMode; int interLeaver; int mscMode; // qam int mpx; int spectrum; QByteArray baBSR; uint modeCode; //mode(A=0,B=1,E=2) BW(0=2.3,1=2.5) prot(High=0,LOW=1) QAM(4=0,16=1,64=2) ineterleaver }; struct bsrBlock { bsrBlock(transportBlock *tb) { tbPtr=tb; } transportBlock *tbPtr; }; class sourceDecoder : public QObject { Q_OBJECT public: explicit sourceDecoder(QObject *parent = 0); void init(); bool decode(); // bool hasStarted(){return started;} QList *getBSR(); bool checkSaveImage(QByteArray ba, transportBlock *tbPtr); void saveImage(transportBlock *tbPtr); bool storeBSR(transportBlock *tb,bool compat); bool rxNotifySetup(); bool rxNotifyCheck(QString fn); private: bool setupDataBlock(unsigned char *buffer,bool crcIsOK,int len); bool setupDataPacket(QByteArray ba); void addDataSegment(); bool addHeaderSegment(); void loadParams(transportBlock *tbPtr, unsigned char paramID, int len); void writeData(transportBlock *tbPtr); transportBlock *getTransporPtr(unsigned short tId,bool create); void removeTransporPtr(transportBlock * ptr); unsigned char packetBuffer[PACKETBUFFERLEN]; dataBlock currentDataBlock; dataPacket currentDataPacket; QList transportBlockPtrList; transportBlock *lastTransportBlockPtr; QList erasureList; QByteArray holdingBuffer; short int lastContinuityIndex; bool checkIt; QList bsrList; bool isHybrid; hybridCrypt hc; bool alreadyDisplayed; // ftpInterface *notifyIntf; }; #endif // SOURCEDECODER_H qsstv_9.2.6/qsstv/drmrx/structtemplates.h0000664000175000017500000001062313203343610017357 0ustar jomajoma/* * File structtemplates.h * part of package RXAMADRM * M.Bos - PA0MBO * Date feb 21st 2009 */ /************************************************************************* * * PA0MBO * * COPYRIGHT (C) 2009 M.Bos * * This file is part of the distribution package RXAMADRM * * This package is free software and you can redistribute is * and/or modify it under the terms of the GNU General Public License * * More details can be found in the accompanying file COPYING *************************************************************************/ struct mplex_desc { int stream_lengths[2][6]; int PL_PartA; int PL_PartB; int HM_length; int PL_HM; }; struct audio_info { int ID[4]; int stream_ID[4]; int audio_coding[4]; int SBR_flag[4]; int audio_mode[4]; int sampling_rate[4]; int text_flag[4]; int enhancement_flag[4]; int coder_field[4]; int bytes_per_frame[4]; }; struct appl_info { int ID[4]; int stream_ID[4]; int packet_mode[4]; int data_unit_indicator[4]; int packet_ID[4]; int enhancement_flag[4]; int application_domain[4]; int packet_length[4]; int application_data[4][100]; /* pa0mbo checken for max later */ int appl_data_length[4]; int user_application_type[4]; int user_application_identifier[4]; char label[4][100]; /* pa0mbo check max 100 */ char language[4][100]; /* ibid */ char country[4][100]; /* inid */ int language_code[4]; int programme_type_code[4]; int bytes_per_frame[4]; }; struct stream_info { int number_of_audio_services; int number_of_data_services; int number_of_streams; int number_of_audio_streams; int number_of_data_streams; int audio_streams[4]; int data_streams[4]; int audio_services[4]; int data_services[4]; }; struct time_info { int day; int month; int year; int hours; int minutes; }; struct dflttmsg { int stream_no; int current_toggle; int first_last_flag; int command_flag; double field1; double field2; char segments[8][256]; /* pa0mbo check max dim 100 later */ char string[256]; int CRC_error; int first_seg_received; char current_segment[256]; /* check dim 256 later pa0mbo */ int current_segment_no; int current_segment_length; }; struct dfltdunitasmbly { int ID; int first_packet_received; int packet_ID; int continuity_index; int application_domain; char application_data[120000]; /* pa0mbo check max dim 1200 */ int CRC_error; char data_unit[120000]; int cnt_data_unit; }; struct dfltMOTdirasmbly { int transport_ID; int continuity_index; int current_segment_no; int body_complete; char body[120000]; /* pa0mbo check max dim 12000 */ int bodycnt; }; struct dfltMOTobjasmbly { int transport_ID; int header_continuity_index; int current_header_segment_no; int body_continuity_index; int current_body_segment_no; int header_complete; int body_complete; int doDelete; char header[900]; /* pa0mbo check max 900 dim */ int hdrcnt; //char body[120000]; /* pa0mbo check max dim 100 */ char body[140000]; //joma /* pa0mbo check max dim 100 */ int bodycnt; }; struct dfltMOTobjasmblyinfo { int transport_ID[120000]; /* pa0mbo check max dim 100 */ int cntID; }; struct dfltMOTobj { int ID; int content_type; int content_subtype; int creation_time; int start_validity; int expire_time; int trigger_time; int version_number; unsigned char repetition_distance[100]; /* pa0mbo check max 100 dim */ unsigned char group_reference[100]; /* pa0mbo check */ int priority; char label[16]; char content_name[30]; /* pa0mbo check max dim 30 */ char content_description[100]; /* pa0mbo check later */ unsigned char mime_type[100]; /* pa0mbo chack 100 dim later */ unsigned char compression_type; unsigned char header[900]; int hdrcnt; unsigned char body[1200000]; /* chck these dims 100 later */ int bodycnt; int error; }; struct shadowMOTobj { int transport_ID; int hdr_segment_count ; int hdr_highest_segm ; int hdr_segment_lengths[10]; int body_segment_lengths[2000]; char header [10][250]; int body_segment_count ; int body_highest_segm; int body_cnt; int header_cnt; char body[2000][250]; int body_complete; int header_complete; }; qsstv_9.2.6/qsstv/drmrx/viterbi_decode.cpp0000664000175000017500000002453413203343610017424 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Torsten Schorr */ /* */ /* Author(s) : Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 15.06.2004 */ /* Last change : 01.07.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* viterbi_decode.c (part of msd_hard) */ /* */ /******************************************************************************/ /* Description: */ /* Viterbi Decoder for Multi-Stage Decoding */ /* */ /******************************************************************************/ #include #include #include "viterbi_decode.h" int viterbi_decode(float *llr, int N, int N_PartA, signed char *puncturing1, signed char *puncturing2, signed char *puncturing3, char *infoout, char *cwout, int bitpos, int *Deinterleaver, int L, int N_tail, char *memory_ptr) { float *old_metrics, *new_metrics, inf = (float) 1e20; char *path_reg; signed char *puncture_ptr; void *swap_ptr; int symbol_index, j, symbol_pos, symbol_pos2, symbol_pos3; float symbols_acc[QOFB]; float metric_path2, metric_s1, metric_s2, metric_inc; char mask, codebits; int part, state, N_Part, path_reg_index, butterfly, info_index; if (!llr || !infoout || !cwout || !memory_ptr) { return ENOMEM; } /* debugging pa0mbo printf("viterbidecoder: N = %d, N_PartA = %d , L = %d, N_tail= %d STATES = %d\n", N, N_PartA, L, N_tail, STATES ); */ old_metrics = (float *) (memory_ptr + 0); new_metrics = (float *) (memory_ptr + STATES * sizeof(float)); path_reg = (char *) (memory_ptr + STATES * sizeof(float) + STATES * sizeof(float)); for (j = 1; j < STATES; j++) { old_metrics[j] = -inf; } old_metrics[0] = 0; symbol_index = 0; path_reg_index = 0; puncture_ptr = puncturing1 + 1; N_Part = N_PartA; /* pa0mbo debugging printf("address puncturing1 = %p \n", puncturing1); printf("inhoud :\n"); for (i=0; i < 10 ; i++) printf("%d\n", puncturing1[i]); printf("address puncturing2 = %p \n", puncturing2); printf("inhoud :\n"); for (i=0; i < 10 ; i++) printf("%d\n", puncturing2[i]); printf("address puncturing3 = %p \n", puncturing3); printf("inhoud :\n"); for (i=0; i < 10 ; i++) printf("%d\n", puncturing3[i]); */ for (part = 0; part < 3; part++) { while (symbol_index < N_Part) { symbol_pos = Deinterleaver[symbol_index]; symbols_acc[0] = -llr[symbol_pos]; symbols_acc[1] = llr[symbol_pos]; symbols_acc[2] = -llr[symbol_pos]; symbols_acc[3] = llr[symbol_pos]; /* printf(" part = %d symbol_index %d symbol_pos %d puncturing switch = %d N_Part %d\n", part, symbol_index, symbol_pos, (*puncture_ptr) , N_Part ) ; pa0mbo */ switch (*puncture_ptr) { case 3: symbol_pos = Deinterleaver[symbol_index + 1]; symbols_acc[0] += -llr[symbol_pos]; symbols_acc[1] += -llr[symbol_pos]; symbols_acc[2] += llr[symbol_pos]; symbols_acc[3] += llr[symbol_pos]; symbol_index += 2; break; case 5: symbol_pos = Deinterleaver[symbol_index + 1]; symbols_acc[0] += -llr[symbol_pos]; symbols_acc[1] += -llr[symbol_pos]; symbols_acc[2] += -llr[symbol_pos]; symbols_acc[3] += -llr[symbol_pos]; symbol_index += 2; break; case 7: symbol_pos = Deinterleaver[symbol_index + 1]; symbol_pos2 = Deinterleaver[symbol_index + 2]; symbols_acc[0] += -llr[symbol_pos] - llr[symbol_pos2]; symbols_acc[1] += -llr[symbol_pos] - llr[symbol_pos2]; symbols_acc[2] += llr[symbol_pos] - llr[symbol_pos2]; symbols_acc[3] += llr[symbol_pos] - llr[symbol_pos2]; symbol_index += 3; break; case 15: symbol_pos = Deinterleaver[symbol_index + 1]; symbol_pos2 = Deinterleaver[symbol_index + 2]; symbol_pos3 = Deinterleaver[symbol_index + 3]; symbols_acc[0] += -llr[symbol_pos] - llr[symbol_pos2] - llr[symbol_pos3]; symbols_acc[1] += -llr[symbol_pos] - llr[symbol_pos2] + llr[symbol_pos3]; symbols_acc[2] += llr[symbol_pos] - llr[symbol_pos2] - llr[symbol_pos3]; symbols_acc[3] += llr[symbol_pos] - llr[symbol_pos2] + llr[symbol_pos3]; symbol_index += 4; break; default: symbol_index++; } /* printf("puncture_ptr %p pp_increm = %d \n", puncture_ptr, *(puncture_ptr+1)); */ puncture_ptr += *(puncture_ptr + 1); symbols_acc[7] = -symbols_acc[0]; symbols_acc[6] = -symbols_acc[1]; symbols_acc[5] = -symbols_acc[2]; symbols_acc[4] = -symbols_acc[3]; for (butterfly = 0; butterfly < NOOFBF; butterfly++) { metric_s1 = old_metrics[butterfly]; metric_s2 = old_metrics[butterfly + NOOFBF]; metric_inc = symbols_acc[(int) CODER_OUTPUT[butterfly]]; new_metrics[2 * butterfly] = metric_s1 + metric_inc; path_reg[path_reg_index + 2 * butterfly] = 0; metric_path2 = metric_s2 - metric_inc; /* Add */ if (metric_path2 > new_metrics[2 * butterfly]) { /* Compare */ new_metrics[2 * butterfly] = metric_path2; path_reg[path_reg_index + 2 * butterfly] = 1; /* Select */ } new_metrics[2 * butterfly + 1] = metric_s1 - metric_inc; path_reg[path_reg_index + 2 * butterfly + 1] = 0; metric_path2 = metric_s2 + metric_inc; /* Add */ if (metric_path2 > new_metrics[2 * butterfly + 1]) { /* Compare */ new_metrics[2 * butterfly + 1] = metric_path2; path_reg[path_reg_index + 2 * butterfly + 1] = 1; /* Select */ } } /* are hard coded butterflies faster? */ path_reg_index += STATES; swap_ptr = old_metrics; old_metrics = new_metrics; new_metrics = (float *)swap_ptr; } if (part == 0) { puncture_ptr = puncturing2 + 1; N_Part = N - N_tail; } else { puncture_ptr = puncturing3 + 1; N_Part = N; } } /* trace back */ state = 0; symbol_index = N - 1; info_index = L - 1; N_Part = N - N_tail; path_reg_index -= STATES; puncture_ptr = puncturing3 + 1 - *puncturing3; for (part = 2; part >= 0; part--) { while (symbol_index >= N_Part) { infoout[info_index] = state & 0x1; /* information bit output */ info_index--; mask = 0 - ((state & 0x1) ^ path_reg[path_reg_index + state]); state = (state >> 1) | (path_reg[path_reg_index + state] * NOOFBF); /* code bits ouput and interleaving: */ codebits = CODER_OUTPUT[state & ~(NOOFBF)] ^ mask; switch (*puncture_ptr) { case 3: cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x2) >> 1) << bitpos; symbol_index -= 2; break; case 5: cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x4) >> 2) << bitpos; symbol_index -= 2; break; case 7: cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x4) >> 2) << bitpos; cwout[Deinterleaver[symbol_index - 1]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index - 1]] |= ((codebits & 0x2) >> 1) << bitpos; symbol_index -= 3; break; case 15: cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index]] |= (codebits & 0x1) << bitpos; cwout[Deinterleaver[symbol_index - 1]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index - 1]] |= ((codebits & 0x4) >> 2) << bitpos; cwout[Deinterleaver[symbol_index - 2]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index - 2]] |= ((codebits & 0x2) >> 1) << bitpos; symbol_index -= 4; break; default: symbol_index--; } cwout[Deinterleaver[symbol_index + 1]] &= ~(0x1 << bitpos); cwout[Deinterleaver[symbol_index + 1]] |= (codebits & 0x1) << bitpos; path_reg_index -= STATES; puncture_ptr -= *(puncture_ptr - 1); } if (part == 2) { puncture_ptr = puncturing2 + 1 - *puncturing2; N_Part = N_PartA; } else { puncture_ptr = puncturing1 + 1 - *puncturing1; N_Part = 0; } } return 0; } qsstv_9.2.6/qsstv/drmrx/viterbi_decode.h0000664000175000017500000000717013203343610017066 0ustar jomajoma /******************************************************************************/ /* */ /* University of Kaiserslautern, Institute of Communications Engineering */ /* Copyright (C) 2004 Torsten Schorr */ /* */ /* Author(s) : Torsten Schorr (schorr@eit.uni-kl.de) */ /* Project start: 15.06.2004 */ /* Last change : 30.06.2004 */ /* */ /******************************************************************************/ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* */ /******************************************************************************/ /******************************************************************************/ /* */ /* viterbi_decode.h (part of msd_hard) */ /* */ /******************************************************************************/ /* Description: */ /* function headers and constants for viterbi_decode.c */ /* */ /******************************************************************************/ #ifndef STATES #define STATES 64 /* number of states */ #endif /* */ #ifndef NOOFBF #define NOOFBF 32 /* number of butterflies */ #endif /* */ #ifndef QOFB #define QOFB 8 /* number of different output patterns per input symbol */ #endif /* */ #ifndef NOPB #define NOPB 4 /* number of parity bits */ #endif /* */ /* decoder output for zero input, states 1:32 */ const char CODER_OUTPUT[] = { 0, 6, 3, 5, 3, 5, 0, 6, 4, 2, 7, 1, 7, 1, 4, 2, 1, 7, 2, 4, 2, 4, 1, 7, 5, 3, 6, 0, 6, 0, 5, 3 }; int viterbi_decode (float *llr, int N, int N_PartA, signed char *puncturing1, signed char *puncturing2, signed char *puncturing3, char *infoout, char *cwout, int bitpos, int *Deinterleaver, int L, int N_tail, char *memory_ptr); qsstv_9.2.6/qsstv/drmtx/bsrform.cpp0000664000175000017500000000412713203343610016125 0ustar jomajoma#include "bsrform.h" #include "ui_bsrform.h" #include "drmrx/drmstatusframe.h" #include "drm.h" bsrForm::bsrForm(QWidget *parent) : QDialog(parent), ui(new Ui::bsrForm) { ui->setupUi(this); connect(ui->bsrComboBox,SIGNAL(currentIndexChanged(int)),this, SLOT(slotBSRSelection(int))); connect(ui->cancelPushButton,SIGNAL(clicked()),this,SLOT(slotCanceled())); connect(ui->easypalPushButton,SIGNAL(clicked()),this,SLOT(slotEasypal())); connect(ui->compatiblePushButton,SIGNAL(clicked()),this,SLOT(slotCompatible())); } bsrForm::~bsrForm() { delete ui; } void bsrForm::init() { int i; bsrPtr=srcDecoder->getBSR(); if(bsrPtr->count()==0) { ui->infoTextEdit->clear(); ui->infoTextEdit->appendPlainText("No BSR available"); return; } for(i=bsrPtr->count()-1;i>=0;i--) //latest first { ui->bsrComboBox->addItem(bsrPtr->at(i).tbPtr->fileName); } slotBSRSelection(0); } bool bsrForm::hasBSR() { return (bsrPtr->count()>0); } QByteArray *bsrForm::getBA(bool compat) { int i; i=bsrPtr->count()-1-ui->bsrComboBox->currentIndex(); if(srcDecoder->storeBSR(bsrPtr->at(i).tbPtr,compat)) { drmParams.robMode=bsrPtr->at(i).tbPtr->robMode; drmParams.interleaver=bsrPtr->at(i).tbPtr->interLeaver; drmParams.qam=bsrPtr->at(i).tbPtr->mscMode; drmParams.protection=bsrPtr->at(i).tbPtr->mpx; drmParams.bandwith=bsrPtr->at(i).tbPtr->spectrum; return(&bsrPtr->at(i).tbPtr->baBSR); } return NULL; } void bsrForm::slotBSRSelection(int idx) { int i; transportBlock *tbPtr; i=bsrPtr->count()-1-idx; ui->infoTextEdit->clear(); tbPtr=bsrPtr->at(i).tbPtr; ui->infoTextEdit->appendPlainText(tbPtr->callsign); ui->infoTextEdit->appendPlainText("Segments received: "+QString::number(tbPtr->segmentsReceived)); ui->infoTextEdit->appendPlainText("Total Segments: "+QString::number(tbPtr->totalSegments)); ui->infoTextEdit->appendPlainText(modeToString(tbPtr->modeCode)); } void bsrForm::slotCanceled() { done(CANCEL); } void bsrForm::slotEasypal() { done(EASYPAL); } void bsrForm::slotCompatible() { done (COMPAT); } qsstv_9.2.6/qsstv/drmtx/bsrform.h0000664000175000017500000000126313203343610015570 0ustar jomajoma#ifndef BSRFORM_H #define BSRFORM_H #include #include "drmrx/sourcedecoder.h" #include "drmtx/drmtransmitter.h" namespace Ui { class bsrForm; } class bsrForm : public QDialog { Q_OBJECT public: enum eResult {CANCEL,EASYPAL,COMPAT}; explicit bsrForm(QWidget *parent = 0); ~bsrForm(); void init(); QByteArray *getBA(bool compat); bool hasBSR(); drmTxParams getDRMParams() {return drmParams;} public slots: void slotCompatible(); void slotEasypal(); void slotCanceled(); private slots: void slotBSRSelection(int); private: Ui::bsrForm *ui; void displayInfo(int idx); QList *bsrPtr; drmTxParams drmParams; }; #endif // BSRFORM_H qsstv_9.2.6/qsstv/drmtx/bsrform.ui0000664000175000017500000000400713203343610015755 0ustar jomajoma bsrForm 0 0 514 367 BSR Send BSR (latest on top) Qt::Horizontal 40 20 Cancel Easypal Compatible Qt::Horizontal 40 20 qsstv_9.2.6/qsstv/drmtx/config.h0000664000175000017500000000577113203343610015373 0ustar jomajoma/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FFTW3_H 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `faac' library (-lfaac). */ /* #undef HAVE_LIBFAAC */ /* Define to 1 if you have the `faad' library (-lfaad). */ /* #undef HAVE_LIBFAAD */ /* Define if you have Hamlib */ /* #undef HAVE_LIBHAMLIB */ /* Define to 1 if you have the `pcap' library (-lpcap). */ /* #undef HAVE_LIBPCAP */ /* Define to 1 if you have the `qwt' library (-lqwt). */ /* #undef HAVE_LIBQWT */ /* Define to 1 if you have the `rt' library (-lrt). */ #define HAVE_LIBRT 1 /* Define if you have libsndfile */ /* #undef HAVE_LIBSNDFILE */ /* Define to 1 if you have the `z' library (-lz). */ #define HAVE_LIBZ 0 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define if you have Hamlib >= 1.2.1 */ /* #undef HAVE_RIG_PARSE_MODE */ /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "drm" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you want to use the ALSA audio lib */ #define USE_ALSA 1 /* Define if you want to use the faac library */ /* #undef USE_FAAC_LIBRARY */ /* Define if you want to use the faad2 library */ /* #undef USE_FAAD2_LIBRARY */ /* Define if you want to use the jack audio lib */ /* #undef USE_JACK */ /* Define if you want to use the OSS audio lib */ /* #undef USE_OSS */ /* Define if you want to use the portaudio audio lib */ /* #undef USE_PORTAUDIO */ /* Define if you want to use the QT GUI */ /* #undef USE_QT_GUI */ /* Version number of package */ #define VERSION "1.12b" qsstv_9.2.6/qsstv/drmtx/drmparams.cpp0000664000175000017500000000120413203343610016432 0ustar jomajoma#include "drmparams.h" #include "configparams.h" int numTxFrames; drmTxParams drmParams; QList fixBlockList; drmTxParams modeToParams(unsigned int mode) { drmTxParams prm; prm.robMode=mode/10000; mode-=(mode/10000)*10000; prm.bandwith=mode/1000; mode-=(mode/1000)*1000; prm.protection=mode/100; mode-=(mode/100)*100; prm.qam=mode/10; prm.interleaver=0; prm.callsign=myCallsign; return prm; } unsigned int paramsToMode(drmTxParams prm) { uint mode=1; mode+=prm.robMode*10000; mode+=prm.bandwith*1000; mode+=prm.protection*100; mode+=prm.qam*10; mode+=prm.interleaver; return mode; } qsstv_9.2.6/qsstv/drmtx/drmparams.h0000664000175000017500000000066413203343610016110 0ustar jomajoma#ifndef DRMPARAMS_H #define DRMPARAMS_H #include #include struct drmTxParams { int robMode; int qam; int bandwith; int interleaver; int protection; QString callsign; int reedSolomon; }; drmTxParams modeToParams(unsigned int mode); unsigned int paramsToMode(drmTxParams prm); extern int numTxFrames; extern drmTxParams drmParams; extern QList fixBlockList; #endif // DRMPARAMS_H qsstv_9.2.6/qsstv/drmtx/drmtransmitter.cpp0000664000175000017500000000521313203343610017527 0ustar jomajoma#include "drmtransmitter.h" #include "configparams.h" #include "drm.h" // timing table; int partTable[BWs][MODES][PROTECTIONS][QAMS]= { { {{96,160,240},{67,140,201}}, {{49,103,149},{96,160,240}}, {{67,112,168},{49,83,124}} }, { {{104,174,261},{78,163,235}}, {{54,113,163},{104,174,261}}, {{78,130,196},{54,90,135}} } }; drmTransmitter::drmTransmitter() { DRMTransmitter=NULL; } drmTransmitter::~drmTransmitter() { } void drmTransmitter::init(QByteArray *ba, QString name, QString format, drmTxParams params) { if(DRMTransmitter) delete DRMTransmitter; dataLength=ba->count(); DRMTransmitter=new CDRMTransmitter; // int picSize; ERobMode RobMod; ESpecOcc BW ; CParameter::ESymIntMod eNewDepth; ECodScheme eNewScheme; CMSCProtLev eNewMSCPre; CService Service; DRMTransmitter->init_base(); // DRMTransmitter.GetSoundOutInterface()->SetDev(nr_devout); DRMTransmitter->GetAudSrcEnc()->ClearPicFileNames(); TransmParam = DRMTransmitter->GetParameters(); // picSize=ba->size(); DRMTransmitter->GetAudSrcEnc()->SetPicFileName(ba,name,format); switch (params.robMode) { case 0 : RobMod = RM_ROBUSTNESS_MODE_A; break; case 1 : RobMod = RM_ROBUSTNESS_MODE_B ; break ; default: RobMod = RM_ROBUSTNESS_MODE_E ; break; } switch (params.bandwith) { case 0 : BW = SO_0; break; default : BW = SO_1 ; break ; } TransmParam->InitCellMapTable(RobMod , BW); switch (params.interleaver) { case 0 : eNewDepth = CParameter::SI_LONG; break ; default : eNewDepth = CParameter::SI_SHORT; break; } TransmParam->SetInterleaverDepth(eNewDepth); switch (params.qam) { case 0 : eNewScheme = CS_1_SM ; //4Bit QAM break; case 1 : eNewScheme = CS_2_SM ; //16Bit QAM break ; default : eNewScheme = CS_3_SM; // 64Bit QAM break; } TransmParam->SetMSCCodingScheme(eNewScheme); switch (params.protection) { case 1 : eNewMSCPre.iPartB = 1; //Norm break; default: eNewMSCPre.iPartB = 0 ; //High break ; } TransmParam->SetMSCProtLev(eNewMSCPre, false); Service.iServiceDescr=0; Service.iServiceID=0; Service.iLanguage=5; Service.strLabel=params.callsign.toLatin1().data(); TransmParam->SetServiceParameters(0,Service); DRMTransmitter->Init(); // calculate transmision time duration=(double)(numTxFrames)*0.4*1.005; // 1.005 ->some extra time for buffers } void drmTransmitter::start(bool startTx) { if(startTx) { stopDRM=false; DRMTransmitter->Start(); } else { stopDRM=true; } } qsstv_9.2.6/qsstv/drmtx/drmtransmitter.h0000664000175000017500000000106213203343610017172 0ustar jomajoma#ifndef DRMTRANSMITTER_H #define DRMTRANSMITTER_H #include "common/GlobalDefinitions.h" #include "common/DrmTransmitter.h" #include "drmparams.h" class drmTransmitter { public: drmTransmitter(); ~drmTransmitter(); void init(QByteArray *ba, QString name, QString format, drmTxParams params); void start(bool startTx); double getDuration() {return duration;} // expressed in seconds double transmissionTime; private: CDRMTransmitter *DRMTransmitter; CParameter* TransmParam ; int dataLength; double duration; }; #endif // DRMTRANSMITTER_H qsstv_9.2.6/qsstv/drmtx/drmtx.cpp0000664000175000017500000003000413203343610015602 0ustar jomajoma#include "drmtx.h" #include "appglobal.h" #include "soundbase.h" #include "dispatcher.h" #include "drmtransmitter.h" #include "drmparams.h" #include "reedsolomoncoder.h" #include "hybridcrypt.h" #include "configparams.h" #include "txwidget.h" #include "ftp.h" #include "hybridcrypt.h" drmTx::drmTx(QObject *parent) : QObject(parent) { txDRM=new drmTransmitter; txList.clear(); hybridTxCount=1; } drmTx::~drmTx() { delete txDRM; } void drmTx::init() { connect(onlineStatusIntf, SIGNAL(listingComplete()), this, SLOT(slotWhoResult())); } void drmTx::start() { statusBarMsgEvent *statBar; statBar=new statusBarMsgEvent("Sending "+drmTxFileName.fileName()); QApplication::postEvent(dispatcherPtr,statBar); txDRM->start(true); } void drmTx::forgetTxFileName() { drmTxStamp=""; } QString drmTx::getTxFileName(QString fileName) { QString prefix; QFileInfo finf; if(useHybrid) { prefix=QString("de_"+myCallsign+"-%1-").arg(hybridTxCount); } else { // Once allocated, keep the same TX name... // cleared by applyTemplate() or forgetTxFileName() if (drmTxStamp.isEmpty()) drmTxStamp=QDateTime::currentDateTime().toUTC().toString("yyyyMMddHHmmss"); prefix = drmTxStamp+"-"; } if(fileName.isEmpty()) { finf.setFile(txWidgetPtr->getImageViewerPtr()->getCompressedFilename()); } else { finf.setFile(fileName); } drmTxFileName.setFile(prefix + finf.fileName()); return drmTxFileName.fileName(); } bool drmTx::initDRMImage(bool binary,QString fileName) { eRSType rsType; reedSolomonCoder rsd; QFile inf; setTxParams(drmParams); if (binary && fileName.isEmpty()) return false; if (!binary && !txWidgetPtr->getImageViewerPtr()->hasValidImage()) return false; addToLog(QString("bin=%1, fileName=%2").arg(binary).arg(fileName),LOGDRMTX); // make sure drmTxFileName is up to date getTxFileName(fileName); if(!useHybrid) { if(binary) { inf.setFileName(fileName); if(!inf.open(QIODevice::ReadOnly)) { addToLog(QString("Unable to open '%1' for read").arg(fileName),LOGDRMTX); return false; } baDRM=inf.readAll(); } else { if(!txWidgetPtr->getImageViewerPtr()->copyToBuffer(&baDRM)) { addToLog(QString("Unable to copy image from txWidget->viewer"),LOGDRMTX); return false; } drmTxFileName.setFile(drmTxFileName.completeBaseName()+".jp2"); } rsType=(eRSType)drmTxParameters.reedSolomon; if(rsType!=RSTNONE) { rsd.encode(baDRM,drmTxFileName.suffix(),rsType); txDRM->init(&baDRM,drmTxFileName.baseName(),rsTypeStr[rsType],drmTxParameters); } else { txDRM->init(&baDRM,drmTxFileName.baseName(),drmTxFileName.suffix(),drmTxParameters); } } else { hybridCrypt hc; drmTxHybridParameters.bandwith=1; // bw 2.2 drmTxHybridParameters.robMode=2; // mode E drmTxHybridParameters.interleaver=0; // long drmTxHybridParameters.protection=0; // high drmTxHybridParameters.qam=0; // 4bit QAM drmTxHybridParameters.callsign=myCallsign; // we have to fill in the body baDRM.clear(); hc.enCrypt(&baDRM); txDRM->init(&baDRM,drmTxFileName.baseName(),drmTxFileName.suffix(),drmTxHybridParameters); hybridTxCount++; } return true; } void drmTx::updateTxList() { fixBlockList.clear(); if ((txList.count()>0) && (txList.last().transportID == txTransportID)) return; if(txList.count()>5) txList.removeFirst(); txList.append(txSession()); txList.last().filename=drmTxFileName.baseName(); txList.last().extension=drmTxFileName.suffix(); txList.last().ba=baDRM; if (useHybrid) { txList.last().drmParams=drmTxHybridParameters; ftpDRMHybridNotifyCheck(txList.last().filename+"."+txList.last().extension); } else { txList.last().drmParams=drmTxParameters; } // transportID is set txList.last().transportID=txTransportID; } bool drmTx::ftpDRMHybrid(QString fileName, QString destName) { QByteArray ba; QString ftpErrorStr; ftpSetupEvent *ftpSetup; ftpUploadFileEvent *ftpUpload; addToLog(QString("destName='%1' last='%2'").arg(destName).arg(lastHybridUpload),LOGFTP); if (destName == lastHybridUpload) { addToLog(QString("%1 already uploaded").arg(destName), LOGFTP); return true; } ftpSetup=new ftpSetupEvent(hybridTxIntf,hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory); QApplication::postEvent(dispatcherPtr,ftpSetup); // hybridTxIntf->setupConnection(hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory); hybridTxIntf->closeWhenDone(); if (fileName.isEmpty()) { txWidgetPtr->getImageViewerPtr()->copyToBuffer(&ba); if(!ftmp.open()) return false; ftmp.write(ba); ftmp.close(); ftpUpload=new ftpUploadFileEvent(hybridTxIntf,ftmp.fileName(),destName,true); } else { ftpUpload=new ftpUploadFileEvent(hybridTxIntf,fileName,destName,true); } QApplication::postEvent(dispatcherPtr,ftpUpload); while(dispatcherPtr->hybridTxDone==DFTPWAITING) { qApp->processEvents(); } if(dispatcherPtr->hybridTxDone!=DFTPOK) { ftpErrorStr=hybridTxIntf->getLastError(); addToLog(QString("ftpDRMHybrid Upload Error: %1").arg(ftpErrorStr),LOGDRMTX); displayMBoxEvent *mbe = new displayMBoxEvent("Upload Error",ftpErrorStr); QApplication::postEvent( dispatcherPtr, mbe ); return false; } lastHybridUpload=destName; addToLog(QString("hybridTxCount updated to %1").arg(hybridTxCount),LOGDRMTX); return true; } void drmTx::clearLastHybridUpload() { addToLog(QString("Clearing lasHybridUpload, was: %1").arg(lastHybridUpload),LOGFTP); lastHybridUpload = ""; } bool drmTx::ftpDRMHybridNotifyCheck(QString fn) { txDRMNotifyEvent *txne; ftpSetupEvent *ftpSetup; notifyCheckEvent *ce; if (!enableHybridNotify) return false; // notifyTXIntf->setupConnection(hybridFtpRemoteHost, hybridFtpPort, // hybridFtpLogin, hybridFtpPassword, // hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory); ftpSetup=new ftpSetupEvent(notifyTXIntf,hybridNotifyRemoteHost,hybridNotifyPort,hybridNotifyLogin,hybridNotifyPassword,hybridNotifyRemoteDir+"/RxOkNotifications1"); QApplication::postEvent(dispatcherPtr,ftpSetup); // } // else // // NOT CORRECT !!! there is no default; // { // hybridCrypt hc; // // notification to last RX Hybrid Image server or custom server if selected // notifyTXIntf->setupConnection(hc.host(),hc.port(),hc.user(),hc.passwd(),hc.dir()+"/RxOkNotifications1"); // } txne = new txDRMNotifyEvent(""); QApplication::postEvent( dispatcherPtr, txne ); ce=new notifyCheckEvent(notifyTXIntf,fn, 15, 60/15, true); QApplication::postEvent( dispatcherPtr, ce ); // notifyTXIntf->startNotifyCheck(fn, 15, 60/15, true); return true; } //void drmTx::rxNotification(QString info) //{ // if (info != "") { // txDRMNotifyAppendEvent *txne = new txDRMNotifyAppendEvent(info); // QApplication::postEvent( dispatcherPtr, txne ); // } //} void drmTx::setupStatusIntf() { if (!hybridNotifyRemoteHost.isEmpty()) { onlineStatusIntf->setupConnection(hybridNotifyRemoteHost, hybridNotifyPort, hybridNotifyLogin, hybridNotifyPassword, hybridNotifyRemoteDir+"/OnlineCallsigns1"); onlineStatusIntf->closeWhenDone(); onlineStatusIntf->hideProgress(); } } void drmTx::who() { // get a list of online callsigns setupStatusIntf(); onlineStatusIntf->getListing("*"); rxDRMNotifyEvent *rxne = new rxDRMNotifyEvent("Retrieving List..."); QApplication::postEvent( dispatcherPtr, rxne ); // slotWhoResult is called when we have the info } void drmTx::slotWhoResult() { int i; QString info="Online User List\n"; QList users = onlineStatusIntf->getListingResults(); onlineStatusIntf->clearListingResults(); for (i=0; iuploadData(QByteArray("Dummy\r\n"), myCallsign+"."+info); } else { onlineStatusIntf->mremove(myCallsign+".*"); } } if (enableHybridRx && !online) { hybridCrypt hc; hybridTxIntf->setupConnection(hc.host(),hc.port(),hc.user(),hc.passwd(),hc.dir()+"/"+hybridFtpHybridFilesDirectory); hybridTxIntf->mremove("de_"+myCallsign+"-*"); // Delete hybrid images sent hybridTxIntf->closeWhenDone(); } if (!online) { onlineStatusIntf->wait(-1); hybridTxIntf->wait(-1); notifyTXIntf->wait(-1); } } double drmTx::calcTxTime(int overheadTime) { double tim=0; // tim= soundIOPtr->getPlaybackStartupTime(); tim+=overheadTime; tim+=txDRM->getDuration(); return tim; } int drmTx::processFIX(QByteArray bsrByteArray) { int i,j; bool inSeries; // bool extended; // todo check use of extended bool done; int block; int trID,lastBlock; fixBlockList.clear(); QString str(bsrByteArray); str.replace("\r",""); // information is in the QByteArray ba QStringList sl; sl=str.split("\n",QString::SkipEmptyParts); if(sl.at(1)!="H_OK") { return -1; } trID=sl.at(0).toUInt(); lastBlock=sl.at(3).toUInt(); fixBlockList.append(lastBlock++); inSeries=false; done=false; // extended=false; for(i=4;(!done)&&iinit(&baDRM,"bsr","bin",drmTxParameters); addToLog(QString("bsr.bin send %1").arg(baDRM.size()),LOGPERFORM); } bool drmTx::initDRMFIX(txSession *sessionPtr) { reedSolomonCoder rsd; eRSType rsType; rsType=(eRSType)sessionPtr->drmParams.reedSolomon; baDRM=sessionPtr->ba; if(rsType!=RSTNONE) { rsd.encode(baDRM,sessionPtr->extension,rsType); txDRM->init(&baDRM,sessionPtr->filename,rsTypeStr[rsType],sessionPtr->drmParams); } else { txDRM->init(&baDRM,sessionPtr->filename,sessionPtr->extension,sessionPtr->drmParams); } return true; } void drmTx::sendBSR(QByteArray *p,drmTxParams dp) { setTxParams(dp); initDRMBSR(p); dispatcherPtr->startTX(txFunctions::TXSENDDRMBSR); addToLog("sendDRMBSR",LOGDRMTX); } txSession *drmTx::getSessionPtr(uint transportID) { int i; for(i=0;isetParam(templateFilename,useTemplate); } qsstv_9.2.6/qsstv/drmtx/drmtx.h0000664000175000017500000000347713203343610015265 0ustar jomajoma#ifndef DRMTX_H #define DRMTX_H #include #include #include #include "hybridcrypt.h" #include "drmtransmitter.h" #include "reedsolomoncoder.h" #include "ftp.h" class imageViewer; struct txSession { drmTxParams drmParams; QByteArray ba; // contains the image data in jpg, jp2 .... format uint transportID; QString filename; QString extension; }; class drmTransmitter; class drmTx : public QObject { Q_OBJECT public: explicit drmTx(QObject *parent = 0); ~drmTx(); void init(); void start(); void forgetTxFileName(); QString getTxFileName(QString fileName); bool ftpDRMHybrid(QString fileName, QString destName); bool initDRMImage(bool binary, QString fileName); void updateTxList(); void who(); void setOnlineStatus(bool online, QString info=""); void sendBSR(QByteArray *p,drmTxParams dp); int processFIX(QByteArray bsrByteArray); void initDRMBSR(QByteArray *ba); bool initDRMFIX(txSession *sessionPtr); // bool initDRMFIX(QString fileName,QString extension,eRSType rsType,int mode); txSession *getSessionPtr(uint transportID); void applyTemplate(QString templateFilename, bool useTemplate, imageViewer *ivPtr); void setTxParams(drmTxParams params) { drmTxParameters=params; } double calcTxTime(int overheadTime); void clearLastHybridUpload(); signals: private slots: // void rxNotification(QString info); void slotWhoResult(); private: void runRx(); bool ftpDRMHybridNotifyCheck(QString fn); void setupStatusIntf(); drmTransmitter *txDRM; QList txList; drmTxParams drmTxParameters; drmTxParams drmTxHybridParameters; QFileInfo drmTxFileName; QString drmTxStamp; int hybridTxCount; QByteArray baDRM; QString lastHybridUpload; QTemporaryFile ftmp; }; #endif // DRMTX_H qsstv_9.2.6/qsstv/dsp/downsamplefilter.cpp0000664000175000017500000002247213203343610017465 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "downsamplefilter.h" #include "appglobal.h" #include "arraydumper.h" #include "logging.h" #include #include #define VOLINTEGRATOR 0.5 downsampleFilter::downsampleFilter() { filteredDataBuffer=0; volumeBuffer=0; filterParams=0; samplesI=0; samplesQ=0; volSamples=0; filterLength=0; } downsampleFilter::downsampleFilter(unsigned int len, bool scaled) { filteredDataBuffer=0; volumeBuffer=0; filterParams=0; samplesI=0; samplesQ=0; volSamples=0; filterLength=0; setFilterParams(scaled); allocate(len); init(); } downsampleFilter::~downsampleFilter() { if(filteredDataBuffer) delete [] filteredDataBuffer; if(filterParams) delete [] filterParams; if(samplesI) delete [] samplesI; if(samplesQ) delete [] samplesQ; if(volSamples) delete [] volSamples; } void downsampleFilter::allocate(unsigned int len) { length=len; if(filteredDataBuffer) delete [] filteredDataBuffer; filteredDataBuffer=new FILTERPARAMTYPE [length]; volumeBuffer=new unsigned int [length/4+CONVDELAY]; } void downsampleFilter::init() { unsigned int i; first=true; for(i=0;i0) { sampleBufferYIPtr=new FILTERPARAMTYPE[nPoles+1]; for(i=0;i<=nPoles;i++) sampleBufferYIPtr[i] =0; } volumePtr=new FILTERPARAMTYPE[dataLen]; demodPtr=new quint16[dataLen]; filteredPtr=new FILTERPARAMTYPE[dataLen]; for(i=0;i0) { nco.init(frCenter/SAMPLERATE); } fltrIndex=nZeroes; coefIndex = nZeroes+1; } void filter::processFIR(FILTERPARAMTYPE *dataPtr, double *dataOutputPtr) { // FILTERPARAMTYPE resI; // FILTERPARAMTYPE *fp1; // const FILTERPARAMTYPE *cf1; // unsigned int i,k; // for (k=0;kavgVolume) avgVolume=avgVolume*(1-volumeAttackIntegrator)+(volumeAttackIntegrator)*vol; // // else if (volnZeroes) { fi -=(nZeroes+1); } resI+=sampleBufferIPtr[fi+i]*(*cf1); } dataOutputPtr[k]=resI/gain; } // FILTERPARAMTYPE resI; // FILTERPARAMTYPE *fp1; // const FILTERPARAMTYPE *cf1; // unsigned int i,k; // for (k=0;knZeroes) { fi -=(nZeroes+1); } resI+=sampleBufferIPtr[fi+i]*(*cf1); } dataOutputPtr[k]=(quint16)rint(resI/gain); } // FILTERPARAMTYPE resI; // FILTERPARAMTYPE *fp1; // const FILTERPARAMTYPE *cf1; // unsigned int i,k; // for (k=0;k2600) temp=prevTemp; // prevTemp=temp; // dataOutputPtr[k]=temp; // double vol=sqrt(resI*resI+resQ*resQ); // if (vol>avgVolume) avgVolume=avgVolume*(1-volumeAttackIntegrator)+(volumeAttackIntegrator)*vol; // else if (volnZeroes) { fi -=(nZeroes+1); } resI+=sampleBufferIPtr[fi+i]*(*cf1); resQ+=sampleBufferQPtr[fi+i]*(*cf1); } resI/=gain; resQ/=gain; discRe=resI*resIprev+resQ*resQprev; discIm=-resQ*resIprev+resQprev*resI; resIprev=resI; resQprev=resQ; if(discRe==0) discRe=0.0001; temp=frCenter-atan2(discIm,discRe)*angleToFc; if(temp<500) temp=prevTemp; if(temp>2600) temp=prevTemp; prevTemp=temp; dataOutputPtr[k]=temp; double vol=sqrt(resI*resI+resQ*resQ); if (vol>avgVolume) avgVolume=avgVolume*(1-volumeAttackIntegrator)+(volumeAttackIntegrator)*vol; else if (vol2600) temp=prevTemp; // prevTemp=temp; // dataOutputPtr[k]=temp; // double vol=sqrt(resI*resI+resQ*resQ); // if (vol>avgVolume) avgVolume=avgVolume*(1-volumeAttackIntegrator)+(volumeAttackIntegrator)*vol; // else if (volnZeroes) // { // fi -=(nZeroes+1); // } // resQ+=sampleBufferIPtr[fi+i]*(*cf1); // } // dataOutputPtr[2*k+1]=sampleBufferIPtr[(nZeroes+1)/2]; // just delay // dataOutputPtr[2*k]=resQ/gain; // } FILTERPARAMTYPE resQ=0; const FILTERPARAMTYPE *cf1; FILTERPARAMTYPE *fp1; uint i,k; for (k=0;k #define FILTERPARAMTYPE double #define TXWFNUMTAPS 121 #define NUMTAPSPOST 0 #define NUMRXFILTERS 1 #define SYNCBPNUMZEROES 8 #define SYNCBPNUMPOLES 8 #define SYNCBPGAIN 103035.237413 extern const double z_sync_bp[SYNCBPNUMZEROES+1]; extern const double p_sync_bp[SYNCBPNUMPOLES]; #define VIDEOBPNUMZEROES 8 #define VIDEOBPNUMPOLES 8 #define VIDEOBPGAIN 2284.945151 extern const double z_video_bp[VIDEOBPNUMZEROES+1]; extern const double p_video_bp[VIDEOBPNUMPOLES]; #define VIDEOFIRNUMTAPS 181 #define VIDEOFIRGAIN 10.000014 #define VIDEOFIRCENTER 1900 extern const double videoFilterCoefFIR[VIDEOFIRNUMTAPS]; #define HILBERTTAPS 121 #define HILBERTGAIN 1.569474 extern const double hilbertCoef[HILBERTTAPS]; #define DRMHILBERTTAPS 153 #define DRMHILBERTGAIN 1.569749 extern const FILTERPARAMTYPE drmHilbertCoef[DRMHILBERTTAPS]; enum efilterType {FNARROW,FWIDE}; enum epostFilterType {NONE}; extern const FILTERPARAMTYPE wfFilterCoef[TXWFNUMTAPS]; DSPFLOAT calculateGain(const DSPFLOAT *fp,unsigned int len); struct sfilters { const QString filterName; const FILTERPARAMTYPE *filterPtr; DSPFLOAT centerFrequency; }; //extern sfilters filterStruct[NUMRXFILTERS]; #endif qsstv_9.2.6/qsstv/dsp/filters.cpp0000664000175000017500000000737213203343610015560 0ustar jomajoma#include "filters.h" #include "filter.h" #include syncFilter:: syncFilter(uint maxLength): sync1200(filter::FTFIR,maxLength),sync1900(filter::FTFIR,maxLength), vol1200(filter::FTFIR,maxLength),vol1900(filter::FTFIR,maxLength) { init(); } syncFilter::~syncFilter() { } void syncFilter:: init() { // setup the syncFilters sync1200.init(); sync1200.setupMatchedFilter(1200,60); sync1900.init(); sync1900.setupMatchedFilter(1900,60); vol1200.init(); vol1200.nZeroes=HILBERTTAPS-1; vol1200.coefZPtr=(FILTERPARAMTYPE *)hilbertCoef; vol1200.gain=HILBERTGAIN; vol1200.volumeAttackIntegrator=0.07; vol1200.volumeDecayIntegrator=0.05; vol1200.allocate(); vol1900.init(); vol1900.nZeroes=HILBERTTAPS-1; vol1900.coefZPtr=(FILTERPARAMTYPE *)hilbertCoef; vol1900.gain=HILBERTGAIN; vol1900.volumeAttackIntegrator=0.07; vol1900.volumeDecayIntegrator=0.05; vol1900.allocate(); detect1200Ptr= vol1200.volumePtr; detect1900Ptr= vol1900.volumePtr; } void syncFilter::process(FILTERPARAMTYPE *dataPtr) { sync1200.processFIR(dataPtr,sync1200.filteredPtr); sync1900.processFIR(dataPtr,sync1900.filteredPtr); vol1200.processHILBVolume(sync1200.filteredPtr); vol1900.processHILBVolume(sync1900.filteredPtr); } videoFilter::videoFilter(uint maxLength):videoFltr(filter::FTFIR,maxLength),lpFltr(filter::FTFIR,maxLength) { init(); } videoFilter::~videoFilter() { } void videoFilter::init() { videoFltr.init(); lpFltr.init(); videoFltr.volumeAttackIntegrator=0.07; videoFltr.volumeDecayIntegrator=0.01; videoFltr.nZeroes=VIDEOFIRNUMTAPS-1; videoFltr.gain=VIDEOFIRGAIN; videoFltr.frCenter=VIDEOFIRCENTER; videoFltr.coefZPtr=(FILTERPARAMTYPE *)videoFilterCoefFIR; videoFltr.allocate(); demodPtr=videoFltr.demodPtr; lpFltr.setupMatchedFilter(0,1); } void videoFilter::process(FILTERPARAMTYPE *dataPtr) { videoFltr.processFIRDemod(dataPtr,videoFltr.filteredPtr); lpFltr.processFIRInt(videoFltr.filteredPtr,videoFltr.demodPtr); } wfFilter::wfFilter(uint maxLength):wfFltr(filter::FTFIR,maxLength) { init(); } wfFilter::~wfFilter() { } void wfFilter::init() { wfFltr.init(); wfFltr.nZeroes=TXWFNUMTAPS-1; wfFltr.gain=1; wfFltr.coefZPtr=(FILTERPARAMTYPE *)wfFilterCoef; wfFltr.volumeAttackIntegrator=0.07; wfFltr.volumeDecayIntegrator=0.01; wfFltr.allocate(); } void wfFilter::process(double *dataPtr, uint dataLength) { wfFltr.dataLen=dataLength; wfFltr.processFIR(dataPtr,dataPtr); } drmHilbertFilter::drmHilbertFilter(uint maxLength):drmFltr(filter::FTFIR,maxLength) { init(); } drmHilbertFilter::~drmHilbertFilter() { } void drmHilbertFilter::init() { drmFltr.init(); drmFltr.nZeroes=DRMHILBERTTAPS-1; drmFltr.nPoles=0; drmFltr.coefZPtr=(FILTERPARAMTYPE *)drmHilbertCoef; drmFltr.gain=DRMHILBERTGAIN; drmFltr.allocate(); } //void drmHilbertFilter::process(float *dataPtr,uint dataLength) //{ // process(dataPtr,dataPtr,dataLength); //} void drmHilbertFilter::process(FILTERPARAMTYPE *dataPtr, float *outputPtr,uint dataLength) { drmFltr.dataLen=dataLength; drmFltr.processIQ(dataPtr,outputPtr); } //void drmHilbertFilter::processIQ(FILTERPARAMTYPE *data, FILTERPARAMTYPE *output,uint dataLength) //{ // length=dataLength; // FILTERPARAMTYPE resQ=0; // const FILTERPARAMTYPE *cf1; // FILTERPARAMTYPE *fp1; // unsigned int i; // uint k; // for (k=0;k //#include "appglobal.h" #include "appdefs.h" /** @author Johan Maes */ /** Numerical Controlled Oscillator The next value for the sine and/or cosine is calculated each time the function is called */ class NCO // numerical controlled oscillator { public: /** create an instance of the NCO with a given frequency \warning the frequency is the normilized frequency i.e F/samplingrate; */ NCO(double freq=0.5) { init(freq); } ~NCO() { } /** initialize the oscilator This function is automatically called from the constructor \param[in] frequency the frequency the oscillator must be running at \warning the frequency is the normilized frequency i.e F/samplingrate; */ void init(double frequency) { w=(2*frequency*M_PI); b=2.*cos(w); s1=sin(-w); s2=sin(-2.*w); c1=sin(M_PI/2.-w); c2=sin(M_PI/2.-2.*w); } /** get the sine and cosine values \param[out] sinVal sine value \param[out] cosVal cosine value */ void getSinCos(double &cosVal,double &sinVal) { sinVal=b*s1-s2; s2=s1; s1=sinVal; cosVal=b*c1-c2; c2=c1; c1=cosVal; } /** get the sine value \return sine value */ double getSine() { double sinVal=b*s1-s2; s2=s1; return(s1=sinVal); } /** produce the I & Q values \param[out] I the I component (val multiplied by a sine) \param[out] Q the Q component (val multiplied by a cosine) \param[in] val the real value of the sample */ void multiply(double &i, double &q,double val) { double t=b*s1-s2; i=val*t; s2=s1; s1=t; t=b*c1-c2; c2=c1; q=val*t; c1=t; } private: double w; double b; double s1,s2; double c1,c2; }; #endif qsstv_9.2.6/qsstv/dsp/synthes.cpp0000664000175000017500000001346713203343610015607 0ustar jomajoma/*************************************************************************** * Copyright (C) 2004 by Johan Maes - ON4QZ * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "synthes.h" #include "appglobal.h" #include "soundbase.h" #include "soundconfig.h" #include "supportfunctions.h" #include /* To generate the frequency, we have to calculate the instant phase jump of the signal by dividing the frequency by the SR. We multiply this by the number of entries in the sine lookup table. // This value is added to the old index of the sine table. */ synthesizer *synthesPtr; synthesizer::synthesizer(double txSmpClock) { // generate the table int i; txSamplingClock=txSmpClock; addToLog(QString("synthes: tx sampling clock=%1").arg(txSamplingClock),LOGSOUND); for (i=0;igetLength(); while ((dataPtr=waterfallPtr->nextLine())!=NULL) { addToLog(QString("sending id len=%1").arg(len),LOGSYNTHES); for (i=0;i>16) & 0xFFFF)+(tst<<16); } return tst; } void synthesizer::write(double sample) { quint32 smp=filter(sample); // while((!soundIOPtr->txBuffer.put(smp)) && (soundIOPtr->isPlaying())) while((!soundIOPtr->txBuffer.put(smp))) { usleep(2000); } } // buffer must already contain correct stereo information void synthesizer::writeBuffer(quint32 *buffer, int len) { int i; if(swapChannel) { for(i=0;i>16) & 0xFFFF)+(buffer[i]<<16); } } while((!soundIOPtr->txBuffer.put(buffer,len)) && (soundIOPtr->isPlaying())) { usleep(2000); } } void synthesizer::setFilter(efilterType txFilterType) { // filterLength=TXNUMTAPS; switch (txFilterType) { // case F400: // case F600: // case F1000: // case F800: //filterI=f800TX; default: break; } } //void synthesizer::fillBuffer() //{ // unsigned int i; // unsigned int sz; // sz=soundIOPtr->txBuffer.getBufferSize(); // for(i=0;i<50000;i++) // { // soundIOPtr->txBuffer.put((SOUNDFRAME)(round(nextSample(2300)))); // } // for(;i<(sz);i++) // { // soundIOPtr->txBuffer.put((SOUNDFRAME)(round(nextSample(1500)))); // } // for(;itxBuffer.put((SOUNDFRAME)(round(0))); // } // addToLog(QString("buffercount %1").arg(soundIOPtr->txBuffer.getWriteIndex()),LOGSYNTHES); //} qsstv_9.2.6/qsstv/dsp/synthes.h0000664000175000017500000000543413203343610015247 0ustar jomajoma/*************************************************************************** * Copyright (C) 2004 by Johan Maes - ON4QZ * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SYNTHES_H #define SYNTHES_H #include #include "filterparam.h" #include "waterfalltext.h" #define SINTABLEN 2048 #define TONEBUFLEN (BASESAMPLERATE/1200) class synthesizer { public: synthesizer(double txSmpClock); ~synthesizer(); double nextSample(double freq) { double temp; int t; temp=(freq/txSamplingClock)*(double)SINTABLEN+oldAngle; oldAngle=fmod(temp,SINTABLEN); t=(int)(oldAngle+0.5); return sineTable[t%SINTABLEN]; } void sendTone(double duration,double lowerFrequency,double upperFrequency, bool concat); void sendSamples(unsigned int numSamples,double frequency); void sendSweep(unsigned int duration,double lowerFrequency, double upperFrequency); void sendSilence(double duration); void sendSample(double freq); void setFilter(efilterType txFilterType); void sendWFText(); void writeBuffer(quint32 *buffer,int len); private: double txSamplingClock; double oldAngle; double sineTable[SINTABLEN]; const float *filterI; unsigned int filterLength; SOUNDFRAME filter(double sample); void write(double sample); double sample; double adjust; // waterfallText *waterfallPtr; double toneBuffer[TONEBUFLEN]; uint pttToneCounter; // void fillBuffer(); //only for test }; extern synthesizer *synthesPtr; #endif qsstv_9.2.6/qsstv/editor/canvassizeform.cpp0000664000175000017500000000101213203343610017623 0ustar jomajoma#include "canvassizeform.h" #include "ui_canvassizeform.h" #include "supportfunctions.h" canvasSizeForm::canvasSizeForm(QWidget *parent) : QDialog(parent), ui(new Ui::canvasSizeForm) { ui->setupUi(this); } canvasSizeForm::~canvasSizeForm() { delete ui; } QRect canvasSizeForm::getSize() { int x; int y; getValue(x,ui->widthSpinBox); getValue(y,ui->heightSpinBox); return QRect(0,0,x,y); } void canvasSizeForm::setSize(int x,int y) { setValue(x,ui->widthSpinBox); setValue(y,ui->heightSpinBox); } qsstv_9.2.6/qsstv/editor/canvassizeform.h0000664000175000017500000000054313203343610017300 0ustar jomajoma#ifndef CANVASSIZEFORM_H #define CANVASSIZEFORM_H #include namespace Ui { class canvasSizeForm; } class canvasSizeForm : public QDialog { Q_OBJECT public: explicit canvasSizeForm(QWidget *parent = 0); ~canvasSizeForm(); QRect getSize(); void setSize(int x,int y); private: Ui::canvasSizeForm *ui; }; #endif // CANVASSIZEFORM_H qsstv_9.2.6/qsstv/editor/canvassizeform.ui0000664000175000017500000000651113203343610017467 0ustar jomajoma canvasSizeForm 0 0 202 138 Image Size Width 300 1800 1 800 Height 256 1024 Qt::Horizontal 40 20 Qt::Vertical 20 16 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() canvasSizeForm accept() 248 254 157 274 buttonBox rejected() canvasSizeForm reject() 316 260 286 274 qsstv_9.2.6/qsstv/editor/editor.cpp0000664000175000017500000002244713203343610016076 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "editor.h" #include #include "appglobal.h" #include "utils/dirdialog.h" #include "editorview.h" #include "configparams.h" #include "dispatcher.h" /*! constructor */ editor::editor(QWidget *parent,Qt::WindowFlags flags): QMainWindow(parent,flags) { ev=new editorView(this); setCentralWidget (ev); initActions(); initMenubar(); statusBar()->showMessage("Select a tool"); setMinimumSize(640,480); resize(640,480); addToLog (QString(" editor create: %1") .arg(QString::number((ulong)this,16)),LOGEDIT); setWindowTitle("QSSTV Editor"); } /*! destructor (saves settings on deletion) */ editor::~editor() { addToLog (QString(" editor delete: %1") .arg(QString::number((ulong)this,16)),LOGEDIT); writeSettings(); } /*! reads the settings (saved images for tx,rx,templates) */ void editor::readSettings() { QSettings qSettings; qSettings.beginGroup ("Editor" ); int windowWidth = qSettings.value( "windowWidth", 640 ).toInt(); int windowHeight = qSettings.value( "windowHeight", 480 ).toInt(); int windowX = qSettings.value( "windowX", -1 ).toInt(); int windowY = qSettings.value( "windowY", -1 ).toInt(); if ( windowX != -1 || windowY != -1 ) move ( windowX, windowY ); resize ( windowWidth, windowHeight ); qSettings.endGroup(); } /*! writes the settings (saved images for tx,rx,templates) */ void editor::writeSettings() { QSettings qSettings; qSettings.beginGroup ("Editor" ); qSettings.setValue ( "windowWidth", width() ); qSettings.setValue ( "windowHeight", height() ); qSettings.setValue ( "windowX", x() ); qSettings.setValue ( "windowY", y() ); qSettings.endGroup(); } void editor::initActions() { fileNew = new QAction(QIcon(":/icons/filenew.png"),tr("&New"),this); fileNew->setShortcut(tr("Ctrl+N")); fileNew->setStatusTip(tr("Create a new image")); connect(fileNew, SIGNAL(triggered()), this, SLOT(slotFileNew())); fileOpen = new QAction(QIcon(":/icons/fileopen.png"),tr("&Open"),this); fileOpen->setShortcut(tr("Ctrl+O")); fileOpen->setStatusTip(tr("Open an image file")); connect(fileOpen, SIGNAL(triggered()), this, SLOT(slotFileOpen())); fileSave = new QAction(QIcon(":/icons/filesave.png"),tr("&Save file .."),this); fileSave->setStatusTip(tr("Save the file under the same name and format")); connect(fileSave, SIGNAL(triggered()), this, SLOT(slotFileSave())); fileSaveImage = new QAction(tr("Save &Image file .."),this); fileSaveImage->setStatusTip(tr("Save the file in PNG format")); connect(fileSaveImage, SIGNAL(triggered()), this, SLOT(slotFileSaveImage())); fileSaveTemplate = new QAction(("Save &Template .."),this); fileSaveTemplate->setStatusTip(tr("Save template file ")); connect(fileSaveTemplate, SIGNAL(triggered()), this, SLOT(slotFileSaveTemplate())); fileQuit = new QAction(tr("Quit"),this); fileQuit->setShortcut(tr("Ctrl+Q")); fileQuit->setStatusTip(tr("Quits the editor")); connect(fileQuit, SIGNAL(triggered()), this, SLOT(slotFileQuit())); clearAll= new QAction(QIcon(":/icons/eraser.png"),tr("Clear &All"),this); clearAll->setShortcut(tr("Ctrl+A")); clearAll->setStatusTip(tr("Delete all objects and fill the background with the background color")); connect(clearAll, SIGNAL(triggered()), ev, SLOT(slotClearAll())); copy= new QAction(tr("Copy"),this); copy->setShortcut(tr("Ctrl+C")); connect(copy, SIGNAL(triggered()), ev->getScene(), SLOT(slotCopy())); paste= new QAction(tr("Paste"),this); paste->setShortcut(tr("Ctrl+V")); connect(paste, SIGNAL(triggered()), ev->getScene(), SLOT(slotPaste())); deleteAction=new QAction(tr("&Delete"),this); deleteAction->setShortcut(tr("Del")); connect(deleteAction, SIGNAL(triggered()), ev->getScene(), SLOT(slotDeleteItem())); // dump= new QAction(tr("dump"),this); // connect(dump, SIGNAL(triggered()), ev, SLOT(slotDump())); } void editor::initMenubar() { fileMenu=menuBar()->addMenu(tr("&File")); editMenu=menuBar()->addMenu(tr("&Edit")); fileMenu->addAction(fileNew); fileMenu->addAction(fileOpen); fileMenu->addAction(fileSave); fileMenu->addAction(fileSaveImage); fileMenu->addAction(fileSaveTemplate); fileMenu->addAction(fileQuit); editMenu->addAction(deleteAction); editMenu->addAction(copy); editMenu->addAction(paste); editMenu->addAction(clearAll); // editMenu->addAction(dump); } void editor::slotFileNew() { if(ev->isModified()) { switch( QMessageBox::information( this, "Editor", "The document has not been saved as a template\n", "&Continue Anyway","Cancel",NULL, -1, // Enter == button 0 1 ) ) { // Escape == button 2 case 0: // Continu clicked break; case 1: // Cancel clicked return; break; } } ev->slotClearAll(); localFile.close(); localFile.setFileName(""); } void editor::slotFileOpen() { /* QFileDialog *fd = new QFileDialog(this,0,true); fd->show();*/ dirDialog d(this,0); QString s=d.openFileName(txStockImagesPath,"*.png *.gif *.jpg *.templ"); if (s==QString::null) return ; if (s.isEmpty()) return ; localFile.setFileName(s); ev->open(localFile); addToLog("localfile after open = " + localFile.fileName(),LOGEDIT); } /*! \fn editor::slotFileSave() \brief save file under same name and same type */ void editor::slotFileSave() { if(localFile.fileName().isEmpty()) { slotFileSaveTemplate(); return; } if(ev->getScene()->getImageType()==editorScene::FLATIMAGE) { addToLog("localfile to save = " + localFile.fileName(),LOGEDIT); ev->save(localFile,false); } else { ev->save(localFile,true); } } void editor::slotFileSaveImage() { dirDialog d((QWidget *)this,"Editor"); QString s(localFile.fileName()); if(s.isEmpty()) { s=txStockImagesPath; } s=d.saveFileName(s,"*.png","png"); if (s==QString::null) return ; if (s.isEmpty()) return ; localFile.setFileName(s); ev->save(localFile,false); } void editor::slotFileSaveTemplate() { dirDialog d((QWidget *)this,"Browse"); QString s(localFile.fileName()); if(s.isEmpty()) { s=templatesPath; } s=d.saveFileName(s,"*.templ","templ"); if (s==QString::null) return ; if (s.isEmpty()) return ; localFile.setFileName(s); ev->save(localFile,true); } void editor::slotFileQuit() { close(); } void editor::closeEvent(QCloseEvent *e) { if(ev->isModified()) { QMessageBox msgBox; msgBox.setText("The document has been modified."); msgBox.setInformativeText("Do you want to save your changes?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Save: slotFileSave(); break; case QMessageBox::Discard: // Don't Save was clicked break; case QMessageBox::Cancel: return; break; default: // should never be reached break; } } editorFinishedEvent *ce = new editorFinishedEvent(true,localFile.fileName()); QApplication::postEvent(dispatcherPtr, ce ); // Qt will delete it when done emit imageAvailable(ev->getImage()); writeSettings(); e->accept(); } //bool editor::render(QImage **im,QString fn) //{ // if(!openFile(fn)) return false; // *im=ev->getScene()->renderImage(); // addToLog(QString("editor: render size: %1 x %2").arg((*im)->size().width()).arg((*im)->size().height()),LOGEDIT); // return true; //} bool editor::setImage(QImage *im) { ev->setImage(im); return true; } bool editor::openFile(QString fn) { QFile f(fn); localFile.setFileName(fn); return ev->open(f); } qsstv_9.2.6/qsstv/editor/editor.h0000664000175000017500000000515013203343610015533 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDITOR_H #define EDITOR_H #include #include #include class editorView; /*! Mainwindow for the image gallery This editor allows the creation of images and templates. */ /*! @author Johan Maes - ON4QZ */ class editor : public QMainWindow { Q_OBJECT public: editor(QWidget *parent=0,Qt::WindowFlags flags = 0); ~editor(); // void editImage(QImage *ima); bool openFile(QString fn); void readSettings(); // bool render(QImage **im,QString fn); bool setImage(QImage *im); public slots: void slotFileNew(); void slotFileOpen(); void slotFileSave(); void slotFileSaveImage(); void slotFileSaveTemplate(); void slotFileQuit(); private: editorView *ev; void closeEvent(QCloseEvent *); void initActions(); void initMenubar(); void writeSettings(); QAction *fileNew; QAction *fileOpen; QAction *fileSave; QAction *fileSaveImage; QAction *fileSaveTemplate; QAction *fileQuit; QAction *clearAll; QAction *copy; QAction *paste; QAction *deleteAction; // QAction *dump; QMenu *fileMenu; QMenu *editMenu; QFile localFile; QFile externalFile; }; #endif qsstv_9.2.6/qsstv/editor/editorform.ui0000664000175000017500000013356413203343610016620 0ustar jomajoma editorForm 0 0 648 697 0 0 Adobe Helvetica 9 Editor true Image Size 100 22 16777215 22 false QFontComboBox::ScalableFonts Bitstream Charter 22 22 22 22 Sans Serif 75 true B true 22 22 22 22 75 true true I true 22 22 22 22 75 true true U true Pen width Qt::Horizontal 298 24 Fill ... 22 22 QToolButton::MenuButtonPopup Qt::NoArrow Line ... 22 22 QToolButton::MenuButtonPopup Gradient ... 22 22 QToolButton::MenuButtonPopup Qt::Horizontal 40 20 2 1 1 1 1 1 1 2 30 30 :/icons/arrow.png:/icons/arrow.png 22 22 true 30 30 :/icons/fcircle.png:/icons/fcircle.png 22 22 true 30 30 :/icons/frect.png:/icons/frect.png 22 22 true 30 30 :/icons/line.png:/icons/line.png 22 22 true 30 30 :/icons/image.png:/icons/image.png 22 22 true 30 30 :/icons/replay.png:/icons/replay.png 22 22 true 30 30 :/icons/text.png:/icons/text.png 22 22 true Qt::Vertical 45 88 2 Qt::Vertical 2 4 QFrame::Box QFrame::Plain 4 Qt::Vertical 2 4 0 0 0 0 V-Shear Qt::AlignCenter false 1 Qt::Horizontal 2 20 -25 25 Qt::Vertical QSlider::TicksBelow 10 Qt::Horizontal 2 20 0 0 80 30 16777215 16777215 0 170 0 0 0 255 0 170 0 0 0 255 0 0 255 0 0 255 true QFrame::Panel QFrame::Sunken 3 true 4 QLCDNumber::Dec QLCDNumber::Filled 0.000000000000000 0 Qt::Vertical 20 40 0 0 80 30 100 30 0 170 0 0 0 255 0 170 0 0 0 255 0 0 255 0 0 255 true QFrame::Panel QFrame::Sunken 3 true 4 QLCDNumber::Dec QLCDNumber::Filled 0.000000000000000 0 0 0 60 25 60 50 Rotate Qt::AlignCenter false 80 80 80 80 255 255 255 128 128 128 192 192 192 160 160 160 64 64 64 85 85 85 255 255 255 255 255 255 255 255 255 0 0 0 128 128 128 0 0 0 64 64 64 255 255 220 0 0 0 255 255 255 128 128 128 192 192 192 160 160 160 64 64 64 85 85 85 255 255 255 255 255 255 255 255 255 0 0 0 128 128 128 0 0 0 64 64 64 255 255 220 0 0 0 64 64 64 128 128 128 192 192 192 160 160 160 64 64 64 85 85 85 64 64 64 255 255 255 64 64 64 128 128 128 128 128 128 0 0 0 128 128 128 255 255 220 0 0 0 0 359 0 Qt::Vertical false false true 10.000000000000000 true Qt::Horizontal 40 20 0 0 60 25 60 16777215 H-Shear Qt::AlignCenter false 0 0 80 30 80 30 0 170 0 0 0 255 0 170 0 0 0 255 0 0 255 0 0 255 true QFrame::Panel QFrame::Sunken 3 true 4 QLCDNumber::Dec QLCDNumber::Filled 0.000000000000000 0 Qt::Horizontal 40 20 0 0 100 30 16777215 30 255 0 0 255 0 0 255 0 0 -25 25 1 5 Qt::Horizontal QSlider::TicksBelow 5 qsstv_9.2.6/qsstv/editor/editorscene.cpp0000664000175000017500000004257213203343610017115 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "editorscene.h" #include "gradientdialog.h" #include "appglobal.h" #include "ui_textform.h" #include "mainwidgets/gallerywidget.h" #include "txwidget.h" editorScene::editorScene(QGraphicsView *parent) : QGraphicsScene(parent) { contextMenu=new QMenu(); arrange = new QMenu( "Arrange"); arrange->setTearOffEnabled(true); arrange->addAction("Forward",this,SLOT(slotSendForward())); arrange->addAction("Backward",this,SLOT(slotSendBackward())); arrange->addAction("Bring to front",this,SLOT(slotBringToFront())); arrange->addAction("Send to back",this,SLOT(slotSendToBack())); contextMenu->addMenu(arrange); contextMenu->addSeparator(); contextMenu->addAction("Change Text",this,SLOT(slotChangeText())); contextMenu->addSeparator(); contextMenu->addAction("Delete",this,SLOT(slotDeleteItem())); contextMenu->addAction("Expand",this,SLOT(slotExpand())); contextMenu->addAction("Lock",this,SLOT(slotLock())); contextMenu->addAction("Unlock",this,SLOT(slotUnlock())); zMax=0; pasted=false; copyItem=NULL; mode=MOVE; imageType=NONE; localImage=NULL; rotate=0; vShear=0; hShear=0; border=QRectF(0,0,0,0); borderItemPtr=NULL; penWidth=1; } editorScene::~editorScene() { if(localImage!=NULL) delete localImage; if((!pasted) &&(copyItem!=NULL)) delete copyItem; delete arrange; delete contextMenu; } bool editorScene::load(QFile &f) { bool borderSet=false; QImage im; itemBase *item; quint32 magic; QString version; quint16 streamVersion; int type; if(f.fileName().isEmpty()) return false; if(!f.open(QIODevice::ReadOnly)) return false; QDataStream str(&f); str >> magic; if (magic != MAGICNUMBER) { //try to load an image f.reset(); if(im.load(&f,0)) { addToLog("image loaded",LOGEDIT); imageType=FLATIMAGE; setImage(&im); border=QRect(0,0,im.width(),im.height()); borderSet=true; f.close(); return true; } else { addToLog("image failed to load",LOGEDIT); f.close(); return false; } } imageType=TEMPLATE; str >> version; // at this moment we do not use the version str >> streamVersion; str.setVersion(streamVersion); while (!str.atEnd()) { str >> type; switch (type) { case itemBase::RECTANGLE: item=new itemRectangle(contextMenu); break; case itemBase::ELLIPSE: item=new itemEllipse(contextMenu); break; case itemBase::LINE: item=new itemLine(contextMenu); break; case itemBase::TEXT: item=new itemText(contextMenu); break; case itemBase::IMAGE: item=new itemImage(contextMenu); break; case itemBase::REPLAY: item=new itemReplayImage(contextMenu); break; case itemBase::SBORDER: borderSet=true; item=new itemImage(contextMenu); item->load(str); border=item->rect(); delete item; continue; break; default: addToLog("Error in datastream",LOGEDIT); f.close(); return false; break; } item->load(str); addItem(item); } optimizeDepth(); if(!borderSet) border=QRectF(0,0,320,256); addToLog(QString("border position %1,%2 size: %3 x %4 border set=%5") .arg(border.topLeft().x()).arg(border.topLeft().y()) .arg(border.width()).arg(border.height()).arg(borderSet),LOGEDIT); f.close(); setSceneRect(border); return true; } QImage *editorScene::renderImage(int w,int h) { clearSelection(); if (localImage!=NULL) delete localImage; if(w==0) { localImage=new QImage(border.width(),border.height(),QImage::Format_ARGB32_Premultiplied); } else { localImage=new QImage(w,h,QImage::Format_ARGB32_Premultiplied); } addToLog(QString("editorScene: pre-render size: %1 x %2").arg(localImage->size().width()).arg(localImage->size().height()),LOGEDIT); QPainter painter(localImage); painter.setRenderHint(QPainter::Antialiasing); localImage->fill(0); render(&painter); addToLog(QString("editor: post-render size: %1 x %2").arg(localImage->size().width()).arg(localImage->size().height()),LOGEDIT); return localImage; } void editorScene::flattenImage(int w,int h) { if (localImage!=NULL) delete localImage; setSceneRect(border); localImage=new QImage(w,h,QImage::Format_ARGB32_Premultiplied); convertText(); convertReplayImage(); QPainter painter(localImage); painter.setRenderHint(QPainter::Antialiasing); localImage->fill(0); render(&painter); } void editorScene::convertReplayImage() { QString fn; QImage im; fn=txWidgetPtr->getPreviewFilename(); if(fn.isEmpty()) return; im.load(fn); if(im.isNull()) return; foreach(QGraphicsItem *t,items()) { if(t->type()==itemBase::REPLAY) { itemReplayImage *itt=qgraphicsitem_cast(t); itt->setImage(im); } } } void editorScene::convertText() { foreach(QGraphicsItem *t,items()) { if(t->type()==itemBase::TEXT) { itemText *itt=qgraphicsitem_cast(t); itt->setText(mexp.convert(itt->text())); } } } bool editorScene::save(QFile &f,bool templ) { QImage im(border.width(),border.height(),QImage::Format_ARGB32_Premultiplied); im.fill(0); setSceneRect(border); clearSelection(); addToLog(QString("editorscene:save %1 x %2").arg(sceneRect().width()).arg(sceneRect().height()),LOGEDIT); if(!templ) { QPainter painter(&im); painter.setRenderHint(QPainter::Antialiasing); render(&painter); im.save(&f,"PNG"); return true; } if(!f.open(QIODevice::WriteOnly)) return false; QDataStream str(&f); str.setVersion(QDataStream::Qt_4_4); // Header with a "magic number" and a version str << (quint32) MAGICNUMBER; str << CONFIGVERSION; str << (quint16) QDataStream::Qt_4_4; itemBase *it; foreach(QGraphicsItem *t,items()) { it=qgraphicsitem_cast(t); if(t->type()>itemBase::BASE) { it->save(str); } } f.close(); return true; } void editorScene::setMode(eMode m) { mode = m; if(mode==INSERT) clearSelection () ; } void editorScene::setItemType(itemBase::egraphType tp) { itemType = tp; } void editorScene::apply(changeFlags cf) { QPen p; itemBase *it; if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { it=qgraphicsitem_cast(t); if(cf & DFILLCOLOR) { it->setBrush(fillColor); } if(cf & DLINECOLOR) { p=it->pen(); p.setColor(lineColor); it->setPen(p); } if(cf & DPEN) { p=it->pen(); p.setWidth(penWidth); it->setPen(p); } if(cf & DGRADIENT) { gradientDialog gd; sgradientParam tmp; tmp=gd.param(); it->setGradient(tmp); it->update(); } if(cf & DTRANSFORM) { it->setTransform(rotate,hShear,vShear); } if(t->type()==itemBase::TEXT) { itemText *itt=qgraphicsitem_cast(t); if(cf & DFONT) itt->setFont(font); if(cf & DTEXT) itt->setText(text); } it->update(); } } void editorScene::clearAll() { foreach(QGraphicsItem *t,items()) { if((t->type()>itemBase::BASE) && (t->type()!=itemBase::SBORDER)) { removeItem(t); delete t; } } } void editorScene::itemSetup(itemBase *item) { QPen p; gradientDialog gd; sgradientParam tmp; tmp=gd.param(); item->setGradient(tmp); item->setTransform(rotate,hShear,vShear); p=item->pen(); p.setColor(lineColor); p.setWidth(penWidth); item->setPen(p); item->setBrush(fillColor); item->setZValue(zMax); zMax+=1; addItem(item); } void editorScene::setImage(QImage *im) { itemBase *item; item=new itemImage(contextMenu); item->setImage(*im); item->setRect(0,0,im->width(),im->height()); itemSetup(item); item->setPos(QPointF(0,0)); item->setSelected(true); emit changeSize(im->width(),im->height()); } void editorScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { itemBase *item; QImage im; if (mouseEvent->button() == Qt::LeftButton) { switch(mode) { case INSERT: switch(itemType) { case itemBase::RECTANGLE: item=new itemRectangle(contextMenu); itemSetup(item); item->setPos(mouseEvent->scenePos()); break; case itemBase::LINE: item=new itemLine(contextMenu); itemSetup(item); item->setPos(mouseEvent->scenePos()); break; case itemBase::ELLIPSE: item=new itemEllipse(contextMenu); itemSetup(item); item->setPos(mouseEvent->scenePos()); break; case itemBase::TEXT: if (!text.isEmpty()) { item=new itemText(contextMenu); item->setFont(font); item->setText(text); itemSetup(item); item->setPos(mouseEvent->scenePos()); } break; case itemBase::IMAGE: if(im.load(fl)) { item=new itemImage(contextMenu); item->setImage(im); itemSetup(item); item->setPos(mouseEvent->scenePos()); } break; case itemBase::REPLAY: item=new itemReplayImage(contextMenu); itemSetup(item); item->setPos(mouseEvent->scenePos()); break; case itemBase::SBORDER: case itemBase::BASE: break; } break; case MOVE: if(!selectedItems().isEmpty()) { item=qgraphicsitem_cast(selectedItems().first()); } break; case PICK: break; } } QGraphicsScene::mousePressEvent(mouseEvent); } void editorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { QGraphicsScene::mouseMoveEvent(mouseEvent); } void editorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { itemBase *item; if(mode==MOVE) { if(!selectedItems().isEmpty()) { item=qgraphicsitem_cast(selectedItems().first()); emit itemSelected(item); } } else if(mode==PICK) { emit colorSelected(mouseEvent->scenePos()); ((QGraphicsView *)parent())->setCursor(Qt::ArrowCursor); } mode=MOVE; QGraphicsScene::mouseReleaseEvent(mouseEvent); } void editorScene::slotCopy() { itemBase *item; if((!pasted) &&(copyItem!=NULL)) delete copyItem; if(selectedItems().isEmpty()) return; // nothing to do item=qgraphicsitem_cast(selectedItems().first()); makeCopy(item); } void editorScene::makeCopy(itemBase *it) { itemBase *item=it; itemBase::egraphType type=(itemBase::egraphType)item->type(); switch(type) { case itemBase::RECTANGLE: copyItem=new itemRectangle(item->getParam().menu); break; case itemBase::LINE: copyItem=new itemLine(item->getParam().menu); break; case itemBase::ELLIPSE: copyItem=new itemEllipse(item->getParam().menu); break; case itemBase::TEXT: copyItem=new itemText(item->getParam().menu); break; case itemBase::IMAGE: copyItem=new itemImage(item->getParam().menu); break; case itemBase::REPLAY: copyItem=new itemReplayImage(item->getParam().menu); break; default: return; } copyItem->setParam(item->getParam()); copyItem->setPos(item->pos()+QPointF(10,10)); pasted=false; } void editorScene::slotPaste() { clearSelection(); copyItem->setZValue(zMax+1); zMax+=1; addItem(copyItem); pasted=true, makeCopy(copyItem); clearSelection(); } void editorScene::slotExpand() { itemBase *it; if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { it=qgraphicsitem_cast(t); if(it->type()!=itemBase::TEXT) { it->setRect(border); it->setPos(0,0); } } } void editorScene::slotChangeText() { if(selectedItems().isEmpty()) return; // nothing to do itemText *item=qgraphicsitem_cast(selectedItems().first()); if(!item) { return; } if(item->type()!=itemBase::TEXT) return; QDialog d(0); Ui::textForm t; t.setupUi(&d); t.plainTextEdit->setPlainText(item->text()); if(d.exec()==QDialog::Accepted) { item->setText(t.plainTextEdit->toPlainText()); } } void editorScene::slotDeleteItem() { if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { removeItem(t); delete t; } } void editorScene::slotLock() { itemBase *it; if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { it=qgraphicsitem_cast(t); it->setLocked(true); } } void editorScene::slotUnlock() { itemBase *it; if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { it=qgraphicsitem_cast(t); it->setLocked(false); } } void editorScene::slotBringToFront() { if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { zMax+=1; t->setZValue(zMax); } optimizeDepth(); } void editorScene::slotSendToBack() { if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { t->setZValue(0.5); } optimizeDepth(); } void editorScene::slotSendBackward() { if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { t->setZValue(t->zValue()-1.5); } optimizeDepth(); } void editorScene::slotSendForward() { if(selectedItems().isEmpty()) return; // nothing to do foreach(QGraphicsItem *t,selectedItems()) { t->setZValue(t->zValue()+1.5); } optimizeDepth(); } void editorScene::optimizeDepth() { itemBase *it; zMax=items().count(); qreal i=0; foreach(QGraphicsItem *t,items(itemsBoundingRect ())) { it=qgraphicsitem_cast(t); if(it->type()==itemBase::SBORDER) { it->setZValue(0.1); } else if(it->type()>itemBase::BASE) { it->setZValue(zMax-i); i+=1; } addToLog(QString("optimize_1 type=%1 pos=%2,%3 resctPos=%4,%5").arg(it->getTypeStr()).arg(t->pos().x()).arg(t->pos().y()).arg(it->rect().x()).arg(it->rect().y()),LOGEDIT); addToLog(QString("Boundingrect t=%1 %2,%3 %4,%5").arg(it->getTypeStr()).arg(it->boundingRect().x()).arg(it->boundingRect().y()).arg(it->boundingRect().width()).arg(it->boundingRect().height()),LOGEDIT); } //optimize position } void editorScene::addBorder(int w,int h) { if (borderItemPtr==NULL) { borderItemPtr=new itemBorder(contextMenu); itemSetup(borderItemPtr); } borderItemPtr->setPos(0,0); borderItemPtr->setRect(0,0,w,h); border=QRectF(0,0,w,h); slotSendToBack(); } void editorScene::overlay(QImage *ima) { clearSelection(); setSceneRect(border); if (localImage!=NULL) delete localImage; localImage=new QImage(ima->copy()); convertText(); convertReplayImage(); QPainter painter(localImage); painter.setRenderHint(QPainter::Antialiasing); render(&painter,QRectF(),QRectF(),Qt::IgnoreAspectRatio); } void editorScene::addConversion(QChar tag,QString value,bool clear) { if(clear) mexp.clear(); mexp.addConversion(tag,value); } qsstv_9.2.6/qsstv/editor/editorscene.h0000664000175000017500000001027113203343610016551 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDITORSCENE_H #define EDITORSCENE_H #include //#include "graphics.h" #include "graphicitems.h" #include "utils/supportfunctions.h" #include "utils/macroexpansion.h" class QGraphicsSceneMouseEvent; #define CHANGECOLOR #define CHANGE class editorScene : public QGraphicsScene { Q_OBJECT public: enum eImageType { NONE, /*!< no image defined */ FLATIMAGE, /*!< loaded image is a simple image (png,jpeg,...) */ TEMPLATE /*!< loaded image is a template file */ }; enum eMode { MOVE, INSERT,PICK}; enum doChange {DNOCHANGE = 0, DFILLCOLOR = 1, DLINECOLOR=2, DGRADIENT=4,DTEXT = 8,DFONT=16,DPEN=32,DTRANSFORM=64}; Q_DECLARE_FLAGS(changeFlags, doChange); editorScene(QGraphicsView *parent=0); ~editorScene(); QColor fillColor; QColor lineColor; QGradient gradient; QColor gradientColor; QFont font; QString text; QString fl; double penWidth; void apply(changeFlags cf); void clearAll(); QRectF border; int rotate; qreal hShear; qreal vShear; bool load(QFile &f); bool save(QFile &f,bool templ); void setImage(QImage *im); eMode mode; eImageType getImageType(){return imageType;} QImage *renderImage(int w, int h); macroExpansion mexp; void overlay(QImage *ima); void addBorder(int w,int h); QImage *getImagePtr() {return localImage;} void addConversion(QChar tag,QString value,bool clear=false); // bool event(QEvent *); public slots: void setMode(eMode m); void setItemType(itemBase::egraphType tp); // void editorLostFocus(DiagramTextItem *item); void slotCopy(); void slotPaste(); void slotExpand(); void slotDeleteItem(); void slotLock(); void slotUnlock(); void slotBringToFront(); void slotSendToBack(); void slotSendBackward(); void slotSendForward(); void slotChangeText(); signals: // void itemInserted(itemBase *itm); // void textInserted(itemBase *itm); void changeSize(int,int); void itemSelected(itemBase *itm); void colorSelected( const QPointF &p); protected: void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent); void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent); private: itemBase *copyItem; itemBase::egraphType itemType; bool leftButtonDown; bool pasted; qreal zMax; QPointF startPoint; // Context menus QMenu *contextMenu; QMenu *arrange; void optimizeDepth(); void itemSetup(itemBase *item); void makeCopy(itemBase *it); eImageType imageType; QImage *localImage; void flattenImage(int w,int h); void convertText(); // QString textConversion(QString str); // QString convertedText; itemBase *borderItemPtr; void convertReplayImage(); }; Q_DECLARE_OPERATORS_FOR_FLAGS(editorScene::changeFlags) #endif qsstv_9.2.6/qsstv/editor/editorview.cpp0000664000175000017500000004271313203343610016767 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "editorview.h" #include "appglobal.h" #include "utils/dirdialog.h" #include "graphicitems.h" #include "gradientdialog.h" #include "canvassizeform.h" #include "ui_textform.h" #define TBFILL 0 #define TBLINE 1 #define TBGRAD 2 #define NUMCOLORSELECTORS 12 static QColor defaultColors[NUMCOLORSELECTORS]= { qRgba( 0, 0, 0,255), qRgba(255,255,255,255), qRgba(255, 0, 0,255), qRgba( 0,255, 0,255), qRgba( 0, 0,255,255), qRgba(128,128,128,255), qRgba(255, 0, 0,128), qRgba( 0,255, 0,128), qRgba( 0, 0,255,128), qRgba(255,255, 0,128), qRgba( 0,255,255,128), qRgba(255, 0,255,128) }; struct sCanvasSize { const QString s; int width; int height; }; #define SIZES 8 sCanvasSize canvasSizeArray[SIZES]= { {"160x120",160,120}, {"320x240",320,240}, {"320x256",320,256}, {"500x400",500,400}, {"500x496",500,496}, {"640x496",640,496}, {"800x616",800,616}, {"1024x800",1024,800} }; //int s; #define BORDER 4 /** editorview */ editorView::editorView(QWidget *parent):QWidget(parent), Ui::editorForm() { setupUi(this); scene=new editorScene(canvas); canvas->setScene(scene); // canvas->setFixedSize(800,700);; pickMode=NOPICK; //border= new QGraphicsRectItem(0,0,320,256); // scene->border=border->rect(); // scene->addItem(border); scene->setMode(editorScene::MOVE); scene->setItemType(itemBase::BASE); // for (int i=0; iaddItem(canvasSizeArray[i].s); connect(imageSizePushButton,SIGNAL(clicked()),SLOT(slotChangeCanvasSize())); readSettings(); // sizeComboBox->setCurrentIndex(canvasSizeIndex); // scene->setSceneRect(0,0,canvasSizeArray[canvasSizeIndex].width,canvasSizeArray[canvasSizeIndex].height); connect(scene,SIGNAL(itemSelected(itemBase*)),SLOT(slotItemSelected(itemBase*))); // connect(sizeComboBox, SIGNAL(activated(int)), SLOT(slotChangeCanvasSize(int))); connect(arrowPushButton,SIGNAL(clicked()),SLOT(slotArrow())); connect(rectanglePushButton,SIGNAL(clicked()),SLOT(slotRectangle())); connect(circlePushButton,SIGNAL(clicked()),SLOT(slotCircle())); connect(replayPushButton,SIGNAL(clicked()),SLOT(slotReplay())); connect(imagePushButton,SIGNAL(clicked()),SLOT(slotImage())); connect(linePushButton,SIGNAL(clicked()),SLOT(slotLine())); connect(textPushButton,SIGNAL(clicked()),SLOT(slotText())); rotateLCD->display( " 0'" ); connect(rotateDial, SIGNAL(valueChanged(int)),SLOT(slotRotateChanged(int)) ); hshearLCD->display( "0.00" ); vshearLCD->display( "0.00" ); connect(hshearSlider, SIGNAL(valueChanged(int)),SLOT(slotShearChanged(int)) ); connect(vshearSlider, SIGNAL(valueChanged(int)),SLOT(slotShearChanged(int)) ); //connect (scene,SIGNAL(changeSize(int,int)),SLOT(slotChangeCanvasSize(int,int))); // connect(textLineEdit, SIGNAL(textChanged(const QString &)),SLOT(slotTextReturnPressed(const QString &)) ); // slotRotateChanged(0); // slotShearChanged(0); fontComboBox->setCurrentIndex(currentFontIndex); connect(fontComboBox,SIGNAL(currentFontChanged(const QFont &)),SLOT(slotFontChanged(const QFont &))); fontSizeSpinBox->setRange(6, 180); fontSizeSpinBox->setValue(currentPointSize); scene->font.setPointSize(fontSizeSpinBox->value()); connect(fontSizeSpinBox,SIGNAL( valueChanged (int)),SLOT(slotFontSizeChanged(int))); penWidthSpinBox->setRange(0,99); penWidthSpinBox->setValue(currentPenWidth); connect(penWidthSpinBox,SIGNAL( valueChanged (double)),SLOT(slotPenWidthChanged(double))); boldButton->setChecked(scene->font.bold()); italicButton->setChecked(scene->font.italic()); underlineButton->setChecked(scene->font.underline()); connect(boldButton,SIGNAL( clicked(bool)),SLOT(slotBold(bool))); connect(italicButton,SIGNAL( clicked(bool)),SLOT(slotItalic(bool))); connect(underlineButton,SIGNAL( clicked(bool)),SLOT(slotUnderline(bool))); QAction *action; action = new QAction("Color Picker", this); action->setData(TBFILL); connect(action, SIGNAL(triggered()),this,SLOT(slotColorPicker())); fillToolButton->setMenu(createColorMenu(SLOT(slotColorDialog()),TBFILL,"Select Color")); fillToolButton->menu()->addAction(action); // scene->fillColor=QColor(127,127,0); fillToolButton->setIcon(createColorToolButtonIcon(":/icons/colorfill.png", scene->fillColor)); connect(fillToolButton, SIGNAL(clicked()),this, SLOT(slotButtonTriggered())); action = new QAction("Color Picker", this); action->setData(TBLINE); connect(action, SIGNAL(triggered()),this,SLOT(slotColorPicker())); lineToolButton->setMenu(createColorMenu(SLOT(slotColorDialog()),TBLINE,"Select Color")); lineToolButton->menu()->addAction(action); lineToolButton->setIcon(createColorToolButtonIcon(":/icons/colorline.png", scene->lineColor)); connect(lineToolButton, SIGNAL(clicked()),this, SLOT(slotButtonTriggered())); connect(scene,SIGNAL(colorSelected( const QPointF &)),this,SLOT(slotColorPicked(const QPointF &))); gradientToolButton->setMenu(createColorMenu(SLOT(slotGradientDialog()),TBGRAD,"Select Gradient")); gradientToolButton->setIcon(createColorToolButtonIcon(":/icons/gradient.png", scene->gradientColor)); connect(gradientToolButton, SIGNAL(clicked()),this, SLOT(slotButtonTriggered())); // setup the defaults slotRotateChanged(0); setTransform(); slotFontChanged(fontComboBox->currentFont()); slotPenWidthChanged(currentPenWidth); changeCanvasSize(); #ifndef QT_NO_DEBUG dump(); #endif modified=false; } editorView::~editorView() { writeSettings(); } /*! reads the settings (saved images for tx,rx,templates) */ void editorView::readSettings() { QSettings qSettings; qSettings.beginGroup ("Editor"); canvasWidth=qSettings.value("canvasWidth", 800 ).toInt(); canvasHeight=qSettings.value("canvasHeight", 600 ).toInt(); currentFontIndex=qSettings.value("currentfontindex", 2 ).toInt(); currentPointSize=qSettings.value("currentpointSize", 24).toInt(); currentPenWidth=qSettings.value("currentpenwidth", 1).toDouble(); scene->font = qSettings.value("fillcolor", qApp->font()).value(); scene->fillColor = qSettings.value("fillcolor", QColor(Qt::white)).value(); scene->lineColor = qSettings.value("linecolor", QColor(Qt::black )).value(); scene->gradientColor = qSettings.value("gradientcolor",QColor( Qt::red )).value(); qSettings.endGroup(); } /*! writes the settings (saved images for tx,rx,templates) */ void editorView::writeSettings() { QSettings qSettings; qSettings.beginGroup ("Editor" ); // qSettings.setValue ("canvassizeindex", sizeComboBox->currentIndex()); qSettings.setValue ("currentfontindex", fontComboBox->currentIndex()); qSettings.setValue ("currentpenwidth", penWidthSpinBox->value()); qSettings.setValue ("currentpointsize",fontSizeSpinBox->value()); qSettings.setValue ("fillcolor", scene->fillColor); qSettings.setValue ("linecolor", scene->lineColor); qSettings.setValue ("gradientcolor", scene->gradientColor); qSettings.setValue ("canvasWidth",canvasWidth); qSettings.setValue ("canvasHeight",canvasHeight); qSettings.endGroup(); } void editorView::slotArrow() { } void editorView::slotRectangle() { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::RECTANGLE); modified=true; } void editorView::slotCircle() { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::ELLIPSE); modified=true; } void editorView::slotText() { QDialog d(this); Ui::textForm t; t.setupUi(&d); t.plainTextEdit->setPlainText(txt); if(d.exec()==QDialog::Accepted) { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::TEXT); scene->text=t.plainTextEdit->toPlainText(); txt=t.plainTextEdit->toPlainText(); scene->apply(editorScene::DTEXT); } modified=true; } void editorView::slotLine() { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::LINE); modified=true; } void editorView::slotColorPicker() { int tp; colorPickImage=scene->renderImage(0,0); addToLog(QString("colorpicker triggered size %1 x %2").arg(colorPickImage->width()).arg(colorPickImage->height()),LOGEDIT); QAction *act; act=qobject_cast(sender()); tp=act->data().toInt(); if (tp==TBFILL) { pickMode=PICKFILLCOLOR; } else if (tp==TBLINE) { pickMode=PICKLINECOLOR; } scene->setMode(editorScene::PICK); //setCursor(Qt::ArrowCursor); } void editorView::slotColorPicked(const QPointF &p) { QRgb c=colorPickImage->pixel(p.x(),p.y()); addToLog(QString("Picked color r=%1,g=%2,b=%3 alpha=%4").arg(qRed(c)).arg(qGreen(c)).arg(qBlue(c)).arg(qAlpha(c)),LOGEDIT); if(pickMode==PICKFILLCOLOR) { scene->fillColor.setRgba(c); fillToolButton->setIcon(createColorToolButtonIcon(":/icons/colorfill.png",scene->fillColor)); } else { scene->lineColor.setRgba(c); lineToolButton->setIcon(createColorToolButtonIcon(":/icons/colorline.png",scene->lineColor)); } canvas->setCursor(Qt::ArrowCursor); } void editorView::slotImage() { QString fileName; dirDialog dd((QWidget *)this,"editor"); scene->fl=dd.openFileName(QString()); scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::IMAGE); modified=true; } void editorView::slotReplay() { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::REPLAY); modified=true; } void editorView::changeCanvasSize() { rotateDial->setValue(0); hshearSlider->setValue(0); vshearSlider->setValue(0); setTransform(); scene->addBorder(canvasWidth,canvasHeight); canvas->setSceneRect(0,0,canvasWidth,canvasHeight); modified=true; } void editorView::slotChangeCanvasSize() { QRect r; canvasSizeForm csize; csize.setSize(canvasWidth,canvasHeight); if(csize.exec()==QDialog::Accepted) { r=csize.getSize(); canvasWidth=r.width(); canvasHeight=r.height(); changeCanvasSize(); } } void editorView::slotFontChanged(const QFont &f) { scene->font=f; scene->font.setPointSize(fontSizeSpinBox->value()); scene->font.setBold(boldButton->isChecked()); scene->font.setItalic(italicButton->isChecked()); scene->font.setUnderline(underlineButton->isChecked()); scene->apply(editorScene::DFONT); modified=true; } void editorView::slotFontSizeChanged(int sz) { scene->font.setPointSize(sz); scene->apply(editorScene::DFONT); modified=true; } void editorView::slotPenWidthChanged(double pw) { scene->penWidth=pw; scene->apply(editorScene::DPEN); modified=true; } void editorView::slotBold(bool b) { scene->font.setBold(b); scene->apply(editorScene::DFONT); modified=true; } void editorView::slotItalic(bool b) { scene->font.setItalic(b); scene->apply(editorScene::DFONT); modified=true; } void editorView::slotUnderline(bool b) { scene->font.setUnderline(b); scene->apply(editorScene::DFONT); modified=true; } /*! \todo image insert check if this is used */ void editorView::setImage(QImage *) { scene->setMode(editorScene::INSERT); scene->setItemType(itemBase::IMAGE); modified=true; } void editorView::slotClearAll() { scene->clearAll(); } void editorView::slotButtonTriggered() { QToolButton *act; act=qobject_cast(sender()); if (act==fillToolButton) { scene->apply(editorScene::DFILLCOLOR); } else if (act==lineToolButton) { scene->apply(editorScene::DLINECOLOR); } else if (act==gradientToolButton) { scene->apply(editorScene::DGRADIENT); } else { return; } } void editorView::slotColorDialog() { int tp; QAction *act; QColor c; act=qobject_cast(sender()); tp=act->data().toInt(); switch(tp) { case TBFILL: c=QColorDialog::getColor(scene->fillColor,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) { scene->fillColor=c; fillToolButton->setIcon(createColorToolButtonIcon(":/icons/colorfill.png",scene->fillColor)); } break; case TBLINE: c=QColorDialog::getColor(scene->lineColor,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) { scene->lineColor=c; lineToolButton->setIcon(createColorToolButtonIcon(":/icons/colorline.png",scene->lineColor)); } break; default: break; } } void editorView::slotGradientDialog() { gradientDialog gDiag(this); gDiag.selectGradient(); } void editorView::save(QFile &f,bool templ) { scene->save(f,templ); modified=false; } bool editorView::open(QFile &f) { if(!scene->load(f)) return false; canvasWidth=scene->border.width(); canvasHeight=scene->border.height(); changeCanvasSize(); #ifndef QT_NO_DEBUG dump(); #endif return true; } void editorView::setTransform() { // int r=450-rotateDial->value(); // if ( r >= 360 ) r-=360; int r=rotateDial->value(); scene->rotate=r; scene->hShear=(double)hshearSlider->value()/10.; scene->vShear=(double)vshearSlider->value()/10.; scene->apply(editorScene::DTRANSFORM); } /*! \todo check if used */ void editorView::slotTextReturnPressed(const QString &) { } void editorView::slotRotateChanged(int) { QString tmp; // int r=450-rotateDial->value(); // if ( r >= 360 ) r-=360; int r=rotateDial->value(); tmp.sprintf( "%3i'", r ); rotateLCD->display( tmp ); setTransform(); } void editorView::slotShearChanged(int) { QString tmp; double shearVal; QSlider *sl; sl=qobject_cast(sender()); shearVal=((double)sl->value())/10; tmp.sprintf( "%1.3f", shearVal ); if ( shearVal >= 0 ) tmp.insert( 0, " " ); if(sl==hshearSlider) { hshearLCD->display( tmp ); } else { vshearLCD->display( tmp ); } setTransform(); } QIcon editorView::createColorToolButtonIcon(const QString &imageFile, QColor color) { QPixmap pixmap(22, 30); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); QPixmap image(imageFile); QRect target(0, 0, 22, 22); QRect source(0, 0, 22, 22); painter.fillRect(QRect(0, 22, 22, 8), color); painter.drawPixmap(target, image, source); return QIcon(pixmap); } QMenu *editorView::createColorMenu(const char * slot,int type,QString text) { QMenu *colorMenu = new QMenu; QAction *action = new QAction(text, this); action->setData(type); connect(action, SIGNAL(triggered()),this,slot); colorMenu->addAction(action); return colorMenu; } void editorView::slotItemSelected(itemBase* ib) { sitemParam p; p=ib->getParam(); if(p.type==itemBase::TEXT) { boldButton->setChecked(p.font.bold()); underlineButton->setChecked(p.font.underline()); italicButton->setChecked(p.font.italic()); fontComboBox->setCurrentFont(p.font); fontSizeSpinBox->setValue(p.font.pointSize()); } penWidthSpinBox->setValue(p.pen.widthF()); int rot=p.rotation; rotateDial->setValue(rot); hshearSlider->setValue((int)(p.hShear*10)); vshearSlider->setValue((int)(p.vShear*10)); } #ifndef QT_NO_DEBUG void editorView::dump() { QString t; int i; QList l=scene->items(); itemBase *b; addToLog(QString("dump editorView of items: %1").arg(l.count()),LOGEDIT); //exclude border for(i=0;itype()>=itemBase::BASE) { b=qgraphicsitem_cast(l.at(i)); switch((int)b->type()) { case itemBase::TEXT: t="Text:"; break; case itemBase::LINE: t="Line:"; break; case itemBase::IMAGE: t="Image:"; break; case itemBase::RECTANGLE: t="Rectangle:"; break; case itemBase::ELLIPSE: t="Ellipse:"; break; case itemBase::SBORDER: t="Border:"; break; default: t=QString("Ill: %1").arg(l.at(i)->type()); break; } addToLog(QString("editorViewItems %1 pos=%2,%3 rectxy=%4,%5 size=%6x%7 depth=%8") .arg(t) .arg(b->pos().x()).arg(b->pos().y()) .arg(b->rect().x()).arg(b->rect().y()) .arg(b->rect().width()).arg(b->rect().height()) .arg(b->zValue()),LOGEDIT); } } } #endif qsstv_9.2.6/qsstv/editor/editorview.h0000664000175000017500000000664013203343610016433 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDITORVIEW_H #define EDITORVIEW_H #include #include "editorscene.h" #include "ui_editorform.h" /** @author Johan Maes - ON4QZ */ class editorForm; enum eactionType {SELECT,COLORPICK,RECTANGLE,ELLIPSE,LINE,IMAGE,TEXT}; enum ePickMode {NOPICK, PICKFILLCOLOR,PICKLINECOLOR}; /** Widget to display the various canvasItems */ class editorView : public QWidget,private Ui::editorForm { Q_OBJECT public: editorView(QWidget *parent = 0); ~editorView(); void readSettings(); void writeSettings(); bool isModified() {return modified;} bool open(QFile &f); void save(QFile &f,bool templ); QImage *getImage() { return image;} void setImage(QImage *ima); editorScene *getScene() {return scene;} public slots: void slotChangeCanvasSize(); void slotArrow(); void slotRectangle(); void slotCircle(); void slotColorPicker(); void slotColorPicked(const QPointF &p); void slotText(); void slotImage(); void slotReplay(); void slotLine(); void slotClearAll(); //Font void slotFontChanged(const QFont &); void slotFontSizeChanged(int); void slotPenWidthChanged(double); void slotBold(bool); void slotItalic(bool); void slotUnderline(bool); //Color void slotColorDialog(); void slotGradientDialog(); void slotButtonTriggered(); //Transform void slotRotateChanged(int); void slotShearChanged(int); // void slotShearRotateChanged(double,int); //item feedback void slotItemSelected(itemBase*); //Debug void slotTextReturnPressed(const QString &); private: editorScene *scene; bool modified; QImage *image; void setTransform(); QIcon createColorToolButtonIcon(const QString &imageFile, QColor color); QMenu *createColorMenu(const char *,int,QString text); int canvasSizeIndex; int currentPointSize; int currentFontIndex; double currentPenWidth; QString txt; QImage *colorPickImage; ePickMode pickMode; int canvasWidth; int canvasHeight; void changeCanvasSize(); void dump(); }; #endif qsstv_9.2.6/qsstv/editor/gradientdialog.cpp0000664000175000017500000002412613203343610017561 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "gradientdialog.h" #include "appdefs.h" #include gradientDialog::gradientDialog(QWidget *parent):QDialog(parent), Ui::gradientForm() { setupUi(this); readSettings(); connect(color1Button,SIGNAL(clicked()),SLOT(slotColorDialog())); connect(color2Button,SIGNAL(clicked()),SLOT(slotColorDialog())); connect(color3Button,SIGNAL(clicked()),SLOT(slotColorDialog())); connect(color4Button,SIGNAL(clicked()),SLOT(slotColorDialog())); previewLabel->setBackgroundRole(QPalette::Base); g=NULL; slotUpdate(); connect(pos1SpinBox,SIGNAL(valueChanged(int)),SLOT(slotUpdate())); connect(pos2SpinBox,SIGNAL(valueChanged(int)),SLOT(slotUpdate())); connect(pos3SpinBox,SIGNAL(valueChanged(int)),SLOT(slotUpdate())); connect(pos4SpinBox,SIGNAL(valueChanged(int)),SLOT(slotUpdate())); connect(dial,SIGNAL(valueChanged(int)),SLOT(slotUpdate())); connect(noGradientButton,SIGNAL(clicked()),SLOT(slotUpdate())); connect(linearGradientButton,SIGNAL(clicked()),SLOT(slotUpdate())); connect(radialGradientButton,SIGNAL(clicked()),SLOT(slotUpdate())); connect(conicalGradientButton,SIGNAL(clicked()),SLOT(slotUpdate())); } gradientDialog::~gradientDialog() { writeSettings(); if(g==NULL) delete g; } void gradientDialog::readSettings() { QSettings qSettings; qSettings.beginGroup ("Editor"); gParam.color1 = qSettings.value("gradcolor1", QColor(Qt::red)).value(); gParam.color2 = qSettings.value("gradcolor2", QColor(Qt::green )).value(); gParam.color3 = qSettings.value("gradcolor3", QColor(Qt::yellow)).value(); gParam.color4 = qSettings.value("gradcolor4", QColor(Qt::blue )).value(); gParam.pos1=qSettings.value("gradpos1", 0 ).toInt(); gParam.pos2=qSettings.value("gradpos2", 0 ).toInt(); gParam.pos3=qSettings.value("gradpos3", 0 ).toInt(); gParam.pos4=qSettings.value("gradpos4", 0 ).toInt(); pos1SpinBox->setValue(gParam.pos1); pos2SpinBox->setValue(gParam.pos2); pos3SpinBox->setValue(gParam.pos3); pos4SpinBox->setValue(gParam.pos4); gParam.direction=qSettings.value("graddirection", 0 ).toInt(); dial->setValue((gParam.direction+90)%360); if(qSettings.value("nogradbutton", 1 ).toBool()) { noGradientButton->setChecked(true); gParam.type=sgradientParam::NONE; } else if(qSettings.value("lineargradbutton", 0 ).toBool()) { linearGradientButton->setChecked(true); gParam.type=sgradientParam::LINEAR;; } else if(qSettings.value("radialgradbutton", 0 ).toBool()) { radialGradientButton->setChecked(true); gParam.type=sgradientParam::RADIAL; } else if(qSettings.value("conicalgradbutton", 0 ).toBool()) { conicalGradientButton->setChecked(true); gParam.type=sgradientParam::CONICAL; } qSettings.endGroup(); } void gradientDialog::writeSettings() { QSettings qSettings; qSettings.beginGroup ("Editor" ); qSettings.setValue ("gradcolor1", gParam.color1); qSettings.setValue ("gradcolor2", gParam.color2); qSettings.setValue ("gradcolor3", gParam.color3); qSettings.setValue ("gradcolor4", gParam.color4); qSettings.setValue ("gradpos1", gParam.pos1); qSettings.setValue ("gradpos2", gParam.pos2); qSettings.setValue ("gradpos3", gParam.pos3); qSettings.setValue ("gradpos4", gParam.pos4); qSettings.setValue ("graddirection", gParam.direction); qSettings.setValue ("nogradbutton",noGradientButton->isChecked()); qSettings.setValue ("lineargradbutton",linearGradientButton->isChecked()); qSettings.setValue ("radialgradbutton",radialGradientButton->isChecked()); qSettings.setValue ("conicalgradbutton",conicalGradientButton->isChecked()); qSettings.endGroup(); } void sgradientParam::load(QDataStream &str) { int t; str >> color1; str >> color2; str >> color3; str >> color4; str >> pos1; str >> pos2; str >> pos3; str >>pos4; str >> t; type=(gType)t; str >> direction; } void sgradientParam::save(QDataStream &str) { str << color1; str << color2; str << color3; str << color4; str << pos1; str << pos2; str << pos3; str << pos4; str << (int)type; str << direction; } void gradientDialog::slotColorDialog() { QColor c; QPushButton *act=qobject_cast(sender()); if (act==color1Button) { c=QColorDialog::getColor(gParam.color1,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) gParam.color1=c; } else if (act==color2Button) { c=QColorDialog::getColor(gParam.color2,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) gParam.color2=c; } else if (act==color3Button) { c=QColorDialog::getColor(gParam.color3,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) gParam.color3=c; } else if (act==color4Button) { c=QColorDialog::getColor(gParam.color4,this,"",QColorDialog::ShowAlphaChannel); if (c.isValid()) gParam.color4=c; } slotUpdate(); } /*! \todo split param update from graphic creation */ void gradientDialog::slotUpdate() { QString s; QPalette palette; QBrush brush; gParam.direction=(270+dial->value())%360; gParam.pos1=pos1SpinBox->value(); gParam.pos2=pos2SpinBox->value(); gParam.pos3=pos3SpinBox->value(); gParam.pos4=pos4SpinBox->value(); if(noGradientButton->isChecked()) gParam.type=sgradientParam::NONE; else if (linearGradientButton->isChecked()) gParam.type=sgradientParam::LINEAR; else if (radialGradientButton->isChecked()) gParam.type=sgradientParam::RADIAL; else if (conicalGradientButton->isChecked()) gParam.type=sgradientParam::CONICAL; s=gParam.color1.name(); color1Button->setStyleSheet("background-color: "+s+"; border-style: outset; border-width: 2px;border-radius: 10px; border-color: beige; padding: 6px"); s=gParam.color2.name(); color2Button->setStyleSheet("background-color: "+s+"; border-style: outset; border-width: 2px;border-radius: 10px; border-color: beige; padding: 6px"); s=gParam.color3.name(); color3Button->setStyleSheet("background-color: "+s+"; border-style: outset; border-width: 2px;border-radius: 10px; border-color: beige; padding: 6px"); s=gParam.color4.name(); color4Button->setStyleSheet("background-color: "+s+"; border-style: outset; border-width: 2px;border-radius: 10px; border-color: beige; padding: 6px"); // brush.setStyle(Qt::SolidPattern); // brush.setColor(gParam.color1); // palette.setBrush(QPalette::Active, QPalette::Button, brush); // color1Button->setPalette(palette); // brush.setColor(gParam.color2);11 // palette.setBrush(QPalette::Active, QPalette::Button, brush); // color2Button->setPalette(palette); // brush.setColor(gParam.color3); // palette.setBrush(QPalette::Active, QPalette::Button, brush); // color3Button->setPalette(palette); // brush.setColor(gParam.color4); // palette.setBrush(QPalette::Active, QPalette::Button, brush); // color4Button->setPalette(palette); brush.setStyle(Qt::SolidPattern); if(gParam.type!=sgradientParam::NONE) { QBrush br(buildGradient(gParam,previewLabel->rect())); palette.setBrush(QPalette::Active, QPalette::Base, br); } else { QBrush br(gParam.color1); palette.setBrush(QPalette::Active, QPalette::Base, br); } previewLabel->setPalette(palette); } void gradientDialog::selectGradient() { exec(); } void grSetup (sgradientParam prm,QGradient &g) { g.setColorAt(prm.pos1/100.,prm.color1); if(prm.pos2<=prm.pos1) return ; g.setColorAt(prm.pos2/100.,prm.color2); if(prm.pos3<=prm.pos2) return ; g.setColorAt(prm.pos3/100.,prm.color3); if(prm.pos4<=prm.pos3) return ; g.setColorAt(prm.pos4/100.,prm.color4); } QGradient buildGradient(sgradientParam prm, QRectF f) { qreal w=f.width(); qreal h=f.height(); qreal d=(double)prm.direction; qreal x1,y1,x2,y2; qreal temp; if(prm.type==sgradientParam::NONE) { QLinearGradient g(0,0,0,0); grSetup(prm,g); return g; } if(prm.type==sgradientParam::LINEAR) { if(fabs(w/2*tan(M_PI/2-d*M_PI/180))<=(w/2)) { x1=f.x()+w/2-(w/2*tan(M_PI/2-d*M_PI/180.)); y1=f.y()+h; x2=f.x()+w/2+(w/2*tan(M_PI/2-d*M_PI/180.)); y2=f.y(); if ((prm.direction>180) && (prm.direction<=359)) { temp=x1; x1=x2;x2=temp; temp=y1; y1=y2;y2=temp; } } else { x1=f.x(); y1=f.y()+h/2+(h/2*tan(d*M_PI/180.)); x2=f.x()+w; y2=f.y()+h/2-(h/2*tan(d*M_PI/180.)); if ((prm.direction>90) && (prm.direction<=270)) { temp=x1; x1=x2;x2=temp; temp=y1; y1=y2;y2=temp; } } QLinearGradient g(x1,y1,x2,y2); grSetup(prm,g); return g; } else if(prm.type==sgradientParam::RADIAL) { QRadialGradient g(QPointF(f.x()+f.width()/2,f.y()+f.height()/2),f.width()/2); grSetup(prm,g); return g; } else if(sgradientParam::CONICAL) { QConicalGradient g(QPointF(f.x()+f.width()/2,f.y()+f.height()/2),prm.direction); grSetup(prm,g); return g; } } qsstv_9.2.6/qsstv/editor/gradientdialog.h0000664000175000017500000000475113203343610017230 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef GRADIENTDIALOG_H #define GRADIENTDIALOG_H #include #include "ui_gradientform.h" struct sgradientParam { enum gType {NONE,LINEAR,RADIAL,CONICAL}; sgradientParam() { type=NONE; } QColor color1; QColor color2; QColor color3; QColor color4; int pos1; int pos2; int pos3; int pos4; gType type; int direction; void load(QDataStream &str); void save(QDataStream &str); }; /** @author Johan Maes - ON4QZ */ class gradientForm; /** Widget to disply the various canvasItems */ class gradientDialog : public QDialog,private Ui::gradientForm { Q_OBJECT public: gradientDialog(QWidget *parent = 0); ~gradientDialog(); void readSettings(); void writeSettings(); void selectGradient(); sgradientParam param() {return gParam;} // QGradient *constructGradient( QRectF f); public slots: void slotColorDialog(); void slotUpdate(); private: sgradientParam gParam; void update(); QGradient *g; }; QGradient buildGradient(sgradientParam prm, QRectF f); #endif qsstv_9.2.6/qsstv/editor/gradientform.ui0000664000175000017500000002703513203343610017122 0ustar jomajoma gradientForm 0 0 300 330 300 330 300 330 9 Gradients QLayout::SetMinimumSize 45 16777215 Color Position true 45 16777215 100 45 16777215 100 45 16777215 100 45 16777215 100 Direction Qt::AlignCenter 0 0 170 0 0 170 0 0 170 0 0 0 360 1 90 90 true false true 10.000000000000000 true Qt::Vertical 20 40 130 100 130 100 Gradient type Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter None true Linear Radial Conical 130 100 130 100 0 255 127 0 255 127 255 255 255 true QFrame::Panel QFrame::Sunken 2 Qt::AlignCenter 0 0 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false buttonBox accepted() gradientForm accept() 248 254 157 274 buttonBox rejected() gradientForm reject() 316 260 286 274 qsstv_9.2.6/qsstv/editor/graphicitems.cpp0000664000175000017500000004305113203343610017261 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "graphicitems.h" #include "appglobal.h" #include "editorscene.h" /*! */ static QPainterPath qt_graphicsItem_shapeFromPath(const QPainterPath &path, const QPen &pen) { // We unfortunately need this hack as QPainterPathStroker will set a width of 1.0 // if we pass a value of 0.0 to QPainterPathStroker::setWidth() const qreal penWidthZero = qreal(0.00000001); if (path == QPainterPath()) return path; QPainterPathStroker ps; ps.setCapStyle(pen.capStyle()); if (pen.widthF() <= 0.0) ps.setWidth(penWidthZero); else ps.setWidth(pen.widthF()); ps.setJoinStyle(pen.joinStyle()); ps.setMiterLimit(pen.miterLimit()); QPainterPath p = ps.createStroke(path); p.addPath(path); return p; } itemBase::itemBase(QMenu *cntxtMenu) { setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); setAcceptHoverEvents (true); param.locked=false; param.modified=true; param.menu=cntxtMenu; } void itemBase::highlightSelected(QPainter *painter,const QStyleOptionGraphicsItem *option) { /// qreal itemPenWidth = pen().widthF(); // const qreal pad = itemPenWidth / 2; // const qreal pad = itemPenWidth; const qreal penWidth = 0; // cosmetic pen const QColor fgcolor = option->palette.windowText().color(); const QColor bgcolor( // ensure good contrast against fgcolor fgcolor.red() > 127 ? 0 : 255, fgcolor.green() > 127 ? 0 : 255, fgcolor.blue() > 127 ? 0 : 255); painter->setPen(QPen(bgcolor, penWidth, Qt::SolidLine)); painter->setPen(QPen(option->palette.windowText(), 0, Qt::DashLine)); painter->setBrush(Qt::NoBrush); painter->drawRect(boundingRect()); // painter->drawRect(boundingRect().adjusted(pad, pad, -pad, -pad)); } QPainterPath itemBase::shape() const { QPainterPath path; path.addRect(param.rct); return qt_graphicsItem_shapeFromPath(path,pen()); } void itemBase::setBrush(QColor c) { param.fillColor=c; QAbstractGraphicsShapeItem::setBrush(param.fillColor); } void itemBase::load(QDataStream &str) { // str << type(); this item is already read by the loader QTransform f; QPointF p; QRectF r; QColor c; QPen pn; QBrush br; QString t; QFont fnt; qreal z; str >> param.rotation; str >> param.hShear; str >> param.vShear; str >> z; setZValue(z); param.zValue=z; str >> p; setPos(p); param.position=p; str >> r; setRect(r); str >> c; param.fillColor=c; setBrush(c); str >> pn; setPen(pn); str >> br; QAbstractGraphicsShapeItem::setBrush(br); str >> param.locked; str >>param.im; str >>t; setText(t); str >>fnt; setFont(fnt); str >> param.line; param.gradient.load(str); setTransform (); } void itemBase::save(QDataStream &str) { str << type(); str << param.rotation; str << param.hShear; str << param.vShear; str << zValue(); str << pos(); str << rect(); str << param.fillColor; str << pen(); str << brush(); str << param.locked; str << param.im; str << param.txt; str << param.font; str << param.line; param.gradient.save(str); } void itemBase::setTransform () { QTransform tx; tx.translate(rect().x()+rect().width()/2,rect().y()+rect().height()/2); tx.shear(param.hShear,param.vShear); tx.rotate(param.rotation); tx.translate(-rect().x()-rect().width()/2,-rect().y()-rect().height()/2); QAbstractGraphicsShapeItem::setTransform(tx,false); update(); } void itemBase::setTransform ( int rot,double hs,double vs) { param.rotation=rot; param.hShear=hs; param.vShear=vs; setTransform (); } void itemBase::hoverMoveEvent ( QGraphicsSceneHoverEvent * event ) { if(((editorScene*)scene())->mode==editorScene::PICK) { QPixmap pm(":/icons/colorpicker.png"); QCursor cpCursor(pm,0,pm.height()-1); setCursor(cpCursor); return; } if(((editorScene*)scene())->mode==editorScene::INSERT) { setCursor(Qt::ArrowCursor); return; } if(param.locked) { grab = NO; setCursor(Qt::ForbiddenCursor); } else if(type()!=LINE) { grab = getCorner(event->pos()); if(type()==TEXT) grab=NO; if ((grab == CUL)|| (grab == CDR)) setCursor(Qt::SizeFDiagCursor); if ((grab == CUR)|| (grab == CDL)) setCursor(Qt::SizeBDiagCursor); if ((grab == HU) || (grab == HD)) setCursor(Qt::SizeVerCursor); if ((grab == VL) || (grab == VR)) setCursor(Qt::SizeHorCursor); if (grab == NO) setCursor(Qt::OpenHandCursor); } else { grab=NO; setCursor(Qt::CrossCursor); } //QAbstractGraphicsShapeItem::hoverEnterEvent(event); QAbstractGraphicsShapeItem::hoverMoveEvent(event); } itemBase::corner itemBase::getCorner( QPointF mouse) { double x = rect().x(); double y = rect().y(); double h = rect().height(); double w = rect().width(); double diff; diff=w; if (diff>h) diff=h; diff/=10; if (diff>10) diff=10; else if (diff<1) diff=1; QRectF cul (x,y, diff,diff); QRectF cur (x+w-diff,y, diff,diff); QRectF cdl (x,y+h-diff,diff,diff); QRectF cdr (x+w-diff,y+h-diff,diff,diff); QRectF hu (x+diff,y,w-(2*diff),diff); QRectF hd (x+diff,y+h-diff,w-(2*diff),diff); QRectF vl (x,y+diff,diff,h-(2*diff)); QRectF vr (x+w-diff,y+diff,diff,h-(2*diff)); if ( cul.contains(mouse) ) return CUL; if ( cur.contains(mouse) ) return CUR; if ( cdl.contains(mouse) ) return CDL; if ( cdr.contains(mouse) ) return CDR; if ( hu.contains(mouse) ) return HU; if ( hd.contains(mouse) ) return HD; if ( vl.contains(mouse) ) return VL; if ( vr.contains(mouse) ) return VR; return NO; } void itemBase::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) { if(((editorScene*)scene())->mode==editorScene::PICK) return; if(((editorScene*)scene())->mode==editorScene::INSERT) return; if(param.locked) return; QPointF mouse = event->pos(); //resize! prepareGeometryChange(); param.modified=true; switch ( grab) { case NO : QAbstractGraphicsShapeItem::mouseMoveEvent(event); break; case HD : if(mouse.y()-rect().y()>1) setRect(rect().x(),rect().y(),rect().width(),mouse.y()-rect().y()); break; case HU : if(rect().height()+(rect().y()-mouse.y())>0) setRect(rect().x(),mouse.y(),rect().width(),rect().height()+(rect().y()-mouse.y())); break; case VR : if(mouse.x()-rect().x()>1) setRect(rect().x(),rect().y(),mouse.x()-rect().x(),rect().height()); break; case VL : if(rect().width()+(rect().x()-mouse.x())>1) setRect(mouse.x(),rect().y(),rect().width()+(rect().x()-mouse.x()),rect().height()); break; case CDR : if(((mouse.x()-rect().x())>1)&&((mouse.y()-rect().y())>1)) setRect(rect().x(),rect().y(),mouse.x()-rect().x(),mouse.y()-rect().y()); break; case CUR : if(((mouse.x()-rect().x())>1)&&((rect().height()+(rect().y()-mouse.y()))>1)) setRect(rect().x(),mouse.y(),mouse.x()-rect().x(),rect().height()+(rect().y()-mouse.y())); break; case CDL : if(((rect().width()+(rect().x()-mouse.x()))>1)&&((mouse.y()-rect().y())>1)) setRect(mouse.x(),rect().y(),rect().width()+(rect().x()-mouse.x()),mouse.y()-rect().y()); break; case CUL : if(((rect().width()+(rect().x()-mouse.x()))>1)&&((rect().height()+(rect().y()-mouse.y()))>1)) setRect(mouse.x(),mouse.y(),rect().width()+(rect().x()-mouse.x()),rect().height()+(rect().y()-mouse.y())); break; } update(); } QString itemBase::getTypeStr() { QString tp; switch(type()) { case BASE: tp="Base"; break; case RECTANGLE: tp="Rectangle"; break; case ELLIPSE: tp="Ellipse"; break; case IMAGE: tp="Image"; break; case LINE: tp="Line"; break; case TEXT: tp="Text"; break; case REPLAY: tp="Replay"; break; case SBORDER: tp="SBorder"; break; } return tp; } void itemBase::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { if(((editorScene*)scene())->mode==editorScene::PICK) return; setSelected(true); param.menu->exec(event->screenPos()); } // Text graphics itemText::itemText(QMenu *cntxtMenu): itemBase(cntxtMenu) { param.font.setFamily("Times"); param.font.setPointSize(24); param.font.setStyleStrategy(QFont::ForceOutline); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); setAcceptHoverEvents (true); } itemText::~itemText() { } void itemText::setText(const QString &t) { // QPainterPath tt; // prepareGeometryChange(); param.modified=true; param.txt=t; // tt.addText(0, 0, param.font, param.txt); // param.rct=tt.controlPointRect(); update(); } void itemText::setFont(QFont f) { // QPainterPath tt; // prepareGeometryChange(); param.modified=true; param.font=f; param.font.setStyleStrategy(QFont::ForceOutline); // tt.addText(0, 0, param.font, param.txt); // param.rct=tt.controlPointRect(); update(); } static QRectF setupTextLayout(QTextLayout *layout) { layout->setCacheEnabled(true); layout->beginLayout(); while (layout->createLine().isValid()) ; layout->endLayout(); qreal maxWidth = 0; qreal y = 0; for (int i = 0; i < layout->lineCount(); ++i) { QTextLine line = layout->lineAt(i); maxWidth = qMax(maxWidth, line.naturalTextWidth()); line.setPosition(QPointF(0, y)); y += line.height(); } return QRectF(0, 0, maxWidth, y); } void itemText::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { QPainterPath tt; QString tmp=param.txt; tmp.replace(QLatin1Char('\n'), QChar::LineSeparator); QTextLayout layout(tmp, param.font); QPen p; if (param.modified) { param.modified=false; if(param.gradient.type!=sgradientParam::NONE) { QAbstractGraphicsShapeItem::setBrush(buildGradient(param.gradient,rect())); } else { QAbstractGraphicsShapeItem::setBrush(param.fillColor); } } p.setBrush(brush()); painter->setPen(p); QTextLayout::FormatRange range; range.start = 0; range.length = layout.text().length(); range.format.setTextOutline(pen()); QList formats; formats.append(range); layout.setAdditionalFormats(formats); param.rct=setupTextLayout(&layout); layout.draw(painter, QPointF(0, 0)); if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } itemRectangle::itemRectangle(QMenu *cntxtMenu): itemBase(cntxtMenu) { setRect(0,0,100,100); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); } void itemRectangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { // if (resized ) prepareGeometryChange(); if (param.modified) { param.modified=false; if(param.gradient.type!=sgradientParam::NONE) { QAbstractGraphicsShapeItem::setBrush(buildGradient(param.gradient,rect())); } else { QAbstractGraphicsShapeItem::setBrush(param.fillColor); } } painter->setPen(pen()); painter->setBrush(brush()); painter->drawRect(param.rct); if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } itemEllipse::itemEllipse(QMenu *cntxtMenu): itemBase(cntxtMenu) { setRect(0,0,100,100); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); } void itemEllipse::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { // if(resized) prepareGeometryChange(); if (param.modified) { param.modified=false; if(param.gradient.type!=sgradientParam::NONE) { QAbstractGraphicsShapeItem::setBrush(buildGradient(param.gradient,rect())); } else { QAbstractGraphicsShapeItem::setBrush(param.fillColor); } } painter->setPen(pen()); painter->setBrush(brush()); painter->drawEllipse(param.rct); if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } itemImage::itemImage(QMenu *cntxtMenu): itemBase(cntxtMenu) { setRect(0,0,100,100); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); } void itemImage::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { QImage tim; tim=param.im.scaled(param.rct.width(),param.rct.height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); qreal pad=pen().widthF()/2; painter->drawImage(param.rct.adjusted(pad,pad,-pad,-pad),tim); painter->setBrush(Qt::NoBrush); painter->setPen(pen()); //painter->drawRect(param.rct); if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } itemLine::itemLine(QMenu *cntxtMenu): itemBase(cntxtMenu) { // setRect(0,0,100,100); param.line.setPoints(QPoint(0,0),QPoint(100,0)); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); } QPainterPath itemLine::shape() const { QPainterPath path; if (param.line.isNull()) return path; path.moveTo(param.line.p1()); path.lineTo(param.line.p2()); return qt_graphicsItem_shapeFromPath(path,pen()); } QRectF itemLine::boundingRect() const { if (pen().widthF() == 0.0) { const qreal x1 = param.line.p1().x(); const qreal x2 = param.line.p2().x(); const qreal y1 = param.line.p1().y(); const qreal y2 = param.line.p2().y(); qreal lx = qMin(x1, x2); qreal rx = qMax(x1, x2); qreal ty = qMin(y1, y2); qreal by = qMax(y1, y2); return QRectF(lx, ty, rx - lx, by - ty); } return shape().controlPointRect(); } void itemLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { // if (resized ) prepareGeometryChange(); painter->setPen(pen()); painter->setBrush(brush()); painter->drawLine(param.line); if (option->state & QStyle::State_Selected) // highlightSelected(painter,option); { const qreal penWidth = 0; // cosmetic pen const QColor fgcolor = option->palette.windowText().color(); const QColor bgcolor( // ensure good contrast against fgcolor fgcolor.red() > 127 ? 0 : 255, fgcolor.green() > 127 ? 0 : 255, fgcolor.blue() > 127 ? 0 : 255); painter->setPen(QPen(bgcolor, penWidth, Qt::SolidLine)); painter->setBrush(Qt::NoBrush); painter->strokePath(shape(),QPen(bgcolor, penWidth, Qt::SolidLine)); painter->setPen(QPen(option->palette.windowText(), 0, Qt::DashLine)); painter->setBrush(Qt::NoBrush); painter->strokePath(shape(),QPen(option->palette.windowText(), 0, Qt::DashLine)); } } itemReplayImage::itemReplayImage(QMenu *cntxtMenu): itemBase(cntxtMenu) { setRect(0,0,100,100); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); } void itemReplayImage::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { QImage tim; if (param.im.isNull()) { QBrush b(Qt::black,Qt::Dense5Pattern); painter->setPen(pen()); painter->setBrush(b); painter->drawRect(param.rct); } else { tim=param.im.scaled(param.rct.width(),param.rct.height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); qreal pad=pen().widthF()/2; // painter->drawImage(param.rct.adjusted(pad,pad,-pad,-pad), param.im, param.im.rect()); painter->drawImage(param.rct.adjusted(pad,pad,-pad,-pad), tim); painter->setBrush(Qt::NoBrush); painter->setPen(pen()); } if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } itemBorder::itemBorder(QMenu *cntxtMenu): itemBase(cntxtMenu) { setRect(0,0,100,100); setFlags(QGraphicsItem::QGraphicsItem::ItemIgnoresTransformations); } void itemBorder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *) { // if (resized ) prepareGeometryChange(); if (param.modified) { param.modified=false; if(param.gradient.type!=sgradientParam::NONE) { QAbstractGraphicsShapeItem::setBrush(buildGradient(param.gradient,rect())); } else { QAbstractGraphicsShapeItem::setBrush(param.fillColor); } } painter->setPen(pen()); painter->setBrush(Qt::NoBrush); painter->drawRect(param.rct); if (option->state & QStyle::State_Selected) highlightSelected(painter,option); } qsstv_9.2.6/qsstv/editor/graphicitems.h0000664000175000017500000001442113203343610016725 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef GRAPHICITEMS_H #define GRAPHICITEMS_H #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include #endif #include "appdefs.h" #include "gradientdialog.h" struct sitemParam { // must be set before returning parameters qreal zValue; int type; QPen pen; QBrush brush; QPointF position; // are used dynamically, no need to setup QFont font; QString txt; int rotation; double hShear; double vShear; QImage im; sgradientParam gradient; QRectF rct; bool locked; QLineF line; bool modified; QColor fillColor; QMenu *menu; }; class itemBase : public QAbstractGraphicsShapeItem { public: enum egraphType {BASE=QGraphicsItem::UserType+1,RECTANGLE,ELLIPSE,IMAGE,LINE,TEXT,REPLAY,SBORDER}; itemBase(QMenu *cntxtMenu); virtual QRectF rect() { return param.rct;} virtual void setRect( const QRectF & rectangle ) { param.rct=rectangle; param.modified=true; } virtual void setRect( qreal x, qreal y, qreal width, qreal height ) { param.rct=QRectF(x,y,width,height); param.modified=true; } void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); void mouseMoveEvent ( QGraphicsSceneMouseEvent * event ); virtual QRectF boundingRect() const { return shape().controlPointRect(); } QString getTypeStr(); void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); void setLocked(bool b) {param.locked=b;} void setGradient(sgradientParam pm) { param.modified=true; param.gradient=pm;} void setBrush(QColor c); void setImage(QImage ima) {param.im=ima;} virtual QPainterPath shape() const; virtual void setText(const QString &) {}; virtual void setFont(QFont) { } QString text() const { return param.txt;} void load(QDataStream &str); void save(QDataStream &str); void setTransform ( int rot,double hs,double vs); sitemParam getParam() { param.zValue=zValue(); param.type=type(); param.pen=pen(); param.brush=brush(); param.position=pos(); return param; } void setParam(sitemParam sp) { setPen(sp.pen); setBrush(sp.fillColor); setFont(sp.font); // are used dynamically, no need to setup param.txt=sp.txt; param.rotation=sp.rotation; param.hShear=sp.hShear; param.vShear=sp.vShear; setTransform (param.rotation,param.hShear,param.vShear); param.im=sp.im; param.gradient=sp.gradient; param.rct=sp.rct; param.locked=sp.locked; param.line=sp.line; param.modified=true; param.fillColor=sp.fillColor; param.menu=sp.menu; } protected: void highlightSelected(QPainter *painter,const QStyleOptionGraphicsItem *option); sitemParam param; private: enum corner {CUL,CUR,CDL,CDR,HU,HD,VL,VR,NO}; void setTransform (); corner getCorner( QPointF mouse); bool grabbed; corner grab; }; class itemText : public itemBase { public: itemText(QMenu *cntxtMenu); ~itemText(); void setText(const QString &t); void setFont(QFont f); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); //QRectF boundingRect() const; int type() const {return TEXT;} // void hover(){;} }; class itemRectangle : public itemBase { public: itemRectangle(QMenu *cntxtMenu); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); int type() const {return RECTANGLE;} }; class itemEllipse : public itemBase { public: itemEllipse(QMenu *cntxtMenu); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); // QRectF boundingRect() const; int type() const {return ELLIPSE;} }; class itemImage : public itemBase { public: itemImage(QMenu *cntxtMenu); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); // QRectF boundingRect() const; int type() const {return IMAGE;} }; class itemLine : public itemBase { public: itemLine(QMenu *cntxtMenu); void setRect( const QRectF & rectangle ) { prepareGeometryChange(); param.rct=rectangle; param.line.setPoints(param.rct.topLeft(),param.rct.bottomRight()); param.modified=true; } void setRect( qreal x, qreal y, qreal width, qreal height ) { prepareGeometryChange(); param.rct=QRectF(x,y,width,height); param.line.setLine(x,y,width,height); param.modified=true; } QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); QPainterPath shape() const; int type() const {return LINE;} }; class itemReplayImage : public itemBase { public: itemReplayImage(QMenu *cntxtMenu); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); int type() const {return REPLAY;} }; class itemBorder : public itemBase { public: itemBorder(QMenu *cntxtMenu); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); int type() const {return SBORDER;} }; #endif qsstv_9.2.6/qsstv/editor/qdialog_p.h0000664000175000017500000000657213203343610016215 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDIALOG_P_H #define QDIALOG_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "private/qwidget_p.h" #include "QtCore/qeventloop.h" #include "QtCore/qpointer.h" #include "QtGui/qdialog.h" #include "QtGui/qpushbutton.h" QT_BEGIN_NAMESPACE class QSizeGrip; class QDialogPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QDialog) public: QDialogPrivate() : mainDef(0), orientation(Qt::Horizontal),extension(0), doShowExtension(false), #ifndef QT_NO_SIZEGRIP resizer(0), sizeGripEnabled(false), #endif rescode(0), resetModalityTo(-1), wasModalitySet(true), eventLoop(0) {} QPointer mainDef; Qt::Orientation orientation; QWidget *extension; bool doShowExtension; QSize size, min, max; #ifndef QT_NO_SIZEGRIP QSizeGrip *resizer; bool sizeGripEnabled; #endif QPoint lastRMBPress; void setDefault(QPushButton *); void setMainDefault(QPushButton *); void hideDefault(); void resetModalitySetByOpen(); #ifdef Q_WS_WINCE_WM void _q_doneAction(); #endif #ifdef Q_WS_MAC virtual void mac_nativeDialogModalHelp() {} #endif int rescode; int resetModalityTo; bool wasModalitySet; QPointer eventLoop; }; QT_END_NAMESPACE #endif // QDIALOG_P_H qsstv_9.2.6/qsstv/editor/textform.ui0000664000175000017500000000425513203343610016310 0ustar jomajoma textForm 0 0 284 103 Enter text Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Qt::Horizontal 40 20 Qt::Vertical 20 19 buttonBox accepted() textForm accept() 248 254 157 274 buttonBox rejected() textForm reject() 316 260 286 274 qsstv_9.2.6/qsstv/icons/arrow.png0000664000175000017500000000045213203343610015561 0ustar jomajomaPNG  IHDRnbKGD]^IDATx Ph=B$q_t1c#ϡBǡ{hn+><|s3ܯӯvE3}j zI#CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignature1b33aaff61d83f1bfdabf2d1ccd5cef4eIENDB`qsstv_9.2.6/qsstv/icons/binary.png0000664000175000017500000000027513203343610015716 0ustar jomajomaPNG  IHDRL4PLTE̙333 tRNS0JXIDATxڥA0CڴSiaRBƜ\M>%Xʙ2S'{mYLY:L/kuP!{߬*ZIENDB`qsstv_9.2.6/qsstv/icons/camera.png0000664000175000017500000000313313203343610015656 0ustar jomajomaPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@pЀ; X9Bݻ ?K3Pq,(a30T0ʕ+>}z Al444 P=3Pݿ>\*A@˝SszL3211v3#?ҥ˞Qu+((d0P- #Ly lll`ˁ!O ^~ffgx @Ϫ +r|a0V/!! // ׯ_3񃁅aߥo ay9C#7h P #Bdixf KAs80M01<ŋ`4 Z" zRL  @(d,18swǏ|~`B"(T@@~,_s i3 /8 `=zVr<,9T]]^z?*H=@[nR7p#`X Cp|իW@C^<ưs6p-[z #@QRɀ Ɓ Gf&"" ## Ag0d3gceXx9Crr Aπ Pn  &p=Ld8X(@qPWS(P=4Cc m [le8y8Ǡ+@+K@4w K8kx/^e?c_|` \^;Ae-oƁ[AhǏ i[aEc rH[/aQ밸Ç U9r ,[*"gȉ@E0 ce v]p(,7(T#g?d aB^ .@aL (Aj@aA Ŭ` ..>rEn; UmEU7 Gb.P(UUzcdG+g+SS<υ]55n,ɐ$  LzmZ֭[ UVVr*c9nMMMqBk[`mB\.|>]a&J<ZZZ`=w>V,cccG\U$A.CPCCC֯_Jp89~k\>|22-̓EQ$egWWEQRUTUCyçVm6mڔ\ s8g'M4M0?A<UJ C~GYGw\g$Iqذa:;;с:(Q/', W׶6"p1JD|U(xӤ:Asz0RG8{(?AfwJ_G*(V,of4$1vO@3vBz&#w\ Ptuuֱ,H$r*H,I!+VTU*NẊ`.&uXe'O2M$k^!+6ȊMճXHLBKOȇ9SQ!FcI1app0?55u<=| X' Ȳ dEx&BjEYwZNU`0{!-so@V,V: BQAۑN/R*i~"Kx<=^QBXK 0m'93><<!"8GʏK###4??OiSr3/ަϟ8ql@*~&"vƘAe@yr,Oult$$H\#ADQچzιBڼ?넙.[ݷo:q))ogwynkڗh~Sܶ Gj># Ů(ɧx$B xT3 Պr9B+cx0o'wRxdHB*!: ](S#mCI&'L%tJ{LEDfENC*fIENDB`qsstv_9.2.6/qsstv/icons/colorpicker.png0000664000175000017500000000047513203343610016750 0ustar jomajomaPNG  IHDRĴl;gAMA abKGD pHYs  #utIME :.tIDATxԻ 0?<ᘃ L6A& S q8]N(>EBJ[sG~ڄ^@9wfnyL{KSS-C111DcHP#"FcEJ) ”v2:Ͻqfnrַo鹽ϖKE}Yы5X<#sVZ7vv{ѱ`ybvTX|,@B19j=1Ÿ|<ޙ p[V]s0|vƕ XHBYFFspӉѻB\ ];sfkO럜0dBLhƈY#޵)aG*]tSL &7 Wck.m1#ĩLJw}g kw8zK>l^ZٳNt& g˷md:SwἈSKXɏxwf'Y-Kkl37ԋE<[XƉKe;NOˆ/b&_'%,ؤ#O{>fYK0 =Ӈ3nM~bbI?h~TU{e&/YcGZ~>5z s;fr틡e?13SցRqY**ji*~=bItc=D. O$zG nY#]5a RR6\ &O]8V&^ S%PN̶RO=4֡RցRuMa ֌Zd+J\O@ o_@L Ͼuڗ?JeJRv gȲ/ѹ,@N'%| >_~$~u(euTu::RlM U\*@he㘶$cwJ-zwu,cV aⰧ TS Yj% ʺ-$e&Ivޔ" 4PJHe cZ-$]Vشyؾ2Ĵ2I싥*|`΍rRR绤T$eE-)nllT Z=Xq+@wr$Xi'V JWE+>7La>}|2ѳi+)ou,2ۅ]YE# mg#Soڏ>y- 8RRF*gkhn캩mzc\޷a/!kA3Tύ eBa+RI(()RHH$qِI RR*%rהwM'Gl>sbm~s3{)˸?|IyW&3svO%lxv oÈTC<3F..bs%MfUEqAv'77ѻI&X|C3u~jJUh0gwƤP&@3ƆK_y2PX0=/xM`G0[Mev)-żrX\sxxց{So 16h%xkN01~;` >_ap'{jbKYqUwhɥԆ1c%+5&3T?ݗt ӝWaOO\ЀQwO1v-Fh(|t3!Cxͮj ]M/&#҅CڢH%6 :cw\F.R&~L9 ug;^1M4:Sm~//hKkF+(u8TIENDB`qsstv_9.2.6/qsstv/icons/doubleleft.png0000664000175000017500000000216713203343610016561 0ustar jomajomaPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe< IDATxb?-@022U l8H?`db |q0 @y: 1 *5y?f@DRJ GV#6/jn o_@, Uϰ>M w`jV eKϚaMA^xS,f`}AjOVK^<{S@o;/;-I6k1Ï۷j=,~ F Tc@98h6Xe& @L u@[2IENDB`qsstv_9.2.6/qsstv/icons/doubleright.png0000664000175000017500000000207413203343610016741 0ustar jomajomaPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@1%sz _Yb @zs  @ o]~ a`/.Eտ$41jO`b`e u20ϗv_ 7CeY r~ YTp@Lc7)9 ߍ쀆3͗_ 6߿ \,jƈ0D\-ہpbi7b` `ay~P'P}_(Df_Af  W_XK᧵;?&`P0ozgvhB l|(L˯Gӛ;v^ 5_10Yq0%3K`f/@k3{1$b=a`.5O`x5y/0gp P\ -`x0{g %?[ !&5 X y~d y0z"R/$I;3+fe 9OoLa 86$(dbLG@Ο4 / A4/SK/Xb+  D@^2ܸׯ @`b7`$͆a`e: л^00fi  F"q09{3İ@E. 43@~ #f47w&vvH 4˂:S.#h-k8w@1bħ+E xâ98Pf4?ϰ Ĉ+湤.g1PNM``w}~W=HBS /DZ% Fs1N*VLdA3g{Va˝Ojv 8iQ]IZp_w 8$^mcHmCdt_Z{ϐ{:t`gxTJx<%_Fqwؽ9}㤪<̐E2{IAww8c9t~#qlK1([0uhmU_xJ;S빯ZM$2a g*x^W OT-[{!~AѨ(ȋcp.kVk6˔Zђ\Z Ŝ6@q,ˀQ*Lױ^}ۨУ, 5qaOe_(W 6QQg:ư Y5<9YYb7r /k:-)䤑ޗS:S5'I"̲۷VZұdԦneW]#,+>9GBFsL=~Ym/ESnaINL˾i,5>͒GBC"=oj1(*cL|PdfLf 6tmdg(vXa[/u-(8ϟa< @Idr7ԭ\HyyV(*J.v_S=%f"o!=5x``@B!N:F۽Ϛʧ]@ ]IENDB`qsstv_9.2.6/qsstv/icons/eraser.png0000664000175000017500000000231213203343610015705 0ustar jomajomaPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<\IDAT8[lUƿs^fBUjQBE5\#Ś(ES⍘hP#&ByՄi& ٺ*mY7[?۹!y=*iVn\i֓|؏Z{2?Mq'1!yP$Ŷ-c?NNqcdo~(7Hmp M?u3z4mئQX3kS<0 fo Ё=@4]@l ;gɯwmk[7{_eAaT_IENDB`qsstv_9.2.6/qsstv/icons/filenew.png0000664000175000017500000000147113203343610016062 0ustar jomajomaPNG  IHDRĴl;bKGD pHYs  tIME79HwIDAT8˵[Hau77-܊Xx&\)HlE=ehJ *5P9άjudP'Ȍ {TJZ[ycdRB3&1z 4%4"޳~V%+T7O'fRf[hu[^34.%Kl¸%\SK+xgE{S!=p~/IENDB`qsstv_9.2.6/qsstv/icons/fileopen.png0000664000175000017500000000251413203343610016231 0ustar jomajomaPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@1`b$UCyIgec2.IdA焋oJǥ @A @m)Sx_ϻ?9P6sQ>1~e`ï? k?}`CzW'y~^V?3Lsp03ԴOťQ mWh0 bre01/`><҆W .9< @,PSOx`g=Ϡ&`k(ۅ{/1  x >. rx#? 7d:n[34)P X]'+SI~,,u _ab^IZjs  0l@[Ocg``8l0;y hB {^3(2I0p1|} ~gÏ j ?YYN݃wWeE @+[Kt޾/g7@9×@O ݇ o^d ><c޿ L˟?C` +[Dn=a`^ w |+o X-|d-@Wbcq`1?k1L@@?`|pp`a`xdx/@~  h·^𗅝50g˰ ps3?Ë/ <@H*$Y>A?x1( 03߷ 7`'W 2?1"uEbH@ A!sB2ddɾw3U3;k;vK O[6?Q]OT3zBvĤd)f,jnq9wb7>_ẞʵKPq>~ &p]>}޺_ᔔ. հryzm/#&a{U _•O1)8w*,1z·x_dҳu/,,?,͔b4:Jq;x͌t!bfۈ{+;e2}Ƚ1bH4˖:p|eώ p~U:ݛ<3#g;%0q]_8*,&Ub_92{IENDB`qsstv_9.2.6/qsstv/icons/gradient.png0000664000175000017500000000142313203343610016223 0ustar jomajomaPNG  IHDRĴl; pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?-@11 8b  #_@߿0M 7Z?'$@`i^?~c`x A dg`x~`'~c ! 1*FF0F(M a+@ {dcA߿AF`_(r0(x?/ 3 3ff`b&&3AjLL```# c$-#3  $j q) d(#̵ 32b1H 4() ll l l @fa.n j1`PPTDU@8 d0 O> A4pAAAU~@d9(la0 ' N:h2XTAƍpu 9d`xpz "`0>(@_8  E(,`b A,w1 ` .-J$C̫ >@1QRS Fv)y&@, Jf˖-^G ^nPyP.@,bX4TH=&`}g-FIENDB`qsstv_9.2.6/qsstv/icons/left.png0000664000175000017500000000233013203343610015356 0ustar jomajomaPNG  IHDRĴl;sBIT|dIDAT8KEU=;;nP *CA1BPO&&m7$&o0AET4-DA'<H$F ;==3UeW*UկU%%?e 2 @(`֊}߷⹭FڻAu32F@W_iX3[=̲>$YS!n[\dlgQ ~̛ovd 7^v ߡ׳J&jm!DK1$^}_a*(--}ز!K.m-8c5}1kj'=Sfsry>˯yQܻ6҆z7:)wzcc aP]̾9pϰst{nrcEи "E)^bAC0ah6 ,穡=?o'ԪBYd1(XaYu Ck\.az᧟XR/?9"1lqS²GNA&a0}7gc+vɆdZI9=޳ P`f_~X)JxTF?e9=Z L̼~1hY 2CY[%αeqhR#9T! JCtsla:-T)0f̣×_ s΀&fi ЭL,naDp$سF6l{mqz"HJDd\i^Uڊ:zq1,k@N9>aXSjh}Qslc0Tx] /䟥n0A@{?V'˯Ip?֧_~T*z @X~A?i-!NZe4@Xk3*ȋh< @X h7N6)Y׀R9a,gIENDB`qsstv_9.2.6/qsstv/icons/line.png0000664000175000017500000000116013203343610015353 0ustar jomajomaPNG  IHDRabKGD pHYs  #utIME%(IDATxmoA3F PDpJAEIEA(  %(MH|vng(8OZjۙ"GhH44U5EBށC[ 8LWpvop@mu'"Pr| x1r/(RQ 3mdy0IǜAo/ ȑIldу_ua;c3߽ f +m?ki|Yw7snܾ(Ӣ&#$:OX]`e>t Ǘˎo]tNm{D .2:yMvj>|)ߌ y;CZlZ%j4_U`j4Ϝ[$*x !i<{쮊Lϟ h n-U"sXNy3ِtEld{YUȺDUǎ |CxG(Rҝo(U NIENDB`qsstv_9.2.6/qsstv/icons/qsstv.png0000664000175000017500000000210313203343610015602 0ustar jomajomaPNG  IHDR,+jbKGD pHYs  tIME 3uS.IDATXOHP𯵂lj3QTƘn+cxɱ$Ž"2d2 @CMn="9mqBÁ(;/}/y/yޥ&폏シ6bX B r 50~tV=Rx"W} cu@UUegO8;:ny/ԝMZF2";aP), UX, IBb n֗pT+nHsT:J޺Y;X]*)08\ÒIgģ$ @ K&YX۶a6wIֶm躎q",jϹ;&O[=,62,Zf=jG DX,dpt[J أiedIx+v-]Ry5 X^_INpa- ~j4N.˲8 N0 !vGH¼XrW/U eв@|<ɠeU N0Y :ah5ņIð+NU/Z4ZușB,-]l MBWfg2nueY0 MygX<4ribz4Ua_SOwkŽegN{ UU@ ?V{-/i2 `@Lp`̀ޤbװ3'lba6t%c&M5OR^B4`?]G]cekN6~:\.yhg xJQC[ |;j@X۶Н^p0aquƁ:dHox' :.oO[_gi,or-m`m:h4 lҧ*[Ƣ@///cvv+՛P}D\p;]PR3VM*vKR;UtwIENDB`qsstv_9.2.6/qsstv/icons/qsstvsplash.png0000664000175000017500000031277313203343610017036 0ustar jomajomaPNG  IHDRJ\bKGD pHYs  tIME #tEXtCommentCreated with GIMPW IDATxyeY'<]Rҵը[X$Ģal1q0fab&ᙰ`BҀBF[K]]կY2G9ws2J i/c3&ۺ^8QMun])%0뵮udrچm6%|9GFʜM|ʜXlZZ:F@Wx6D#5ure2ڪߍYlO/SokLhT O ?h@] mՁ DZvOgI ]N]ɿ$9wp˫q(QfMu`c*).}QҦ?Nθ9`)+LyYEʮ]t$n %HxC8l~/A4Ip٠YE59"4]@J* \+Hvy7j[95__SuE,RQd٤.:˦+`qaAG bIxCm.LIUOyƢצplp]®.Au])+;N^l ^D/S"lR;JbQftȲyJ8TITzJF囨~gp)`[XwLsx*u+,s~7Vi^vI?[(3:qMO|lSt)ehAp&^3V}$K[3l~[F㢤1^%ޭv{3KM+e`{_wi3V_69c2nj،1`4P7tg5m,,jLug%`03 y^ 4 n<Ü40k.յ03m!eh0P7V%plw{]h,kܾ}lagPwSf{vUkY/:&X"[ll{7a`m6bC{c" U xbRDzaSu¥N*)ҭ*WyCNl<:)gPQ'nT &f )֔\6B!m6+Uw[ۢu9ogB ?1=UPvj*Ǩ!*Em{=%D "TLKl<ۄxTAHRR\Q^z"@lyȇ9׼";ߺӪ*@:˔~oKmԢn<7]N%Q@O RŹs}>%V M ҴJc0!-#pm(&gn`PY6mS%ˎ:fYQ.2p*6ޚ VXWyДa\ ۀxt*)β *Y6)c lY6oE S Y6M Uɤi. EtdGkWmY6R\Ȳ e 7#UT܇eRq ]JmqHR"G)nrP.A06MnfqXmvQ8Q5m x@R_wWp4o NS W2-l cQrM-bϣ`K`Z)01\Y]TN`jZV6U`Td7mcMN'U􍋾8Uqb_ l6ۖpϳa{2ٮeɿ <3PfEix20K eќq& 2s&ϲUQ@vmÀW݋ie!`h i|BلQ5Ki!:69U$]ϻ41GL٠NE}EwT +.!\I*{m@UwTtB[2%dsIC=FUC1)Tp|ɶU Mu-";ʈW`l |o@zMoB pssd$DD=ߤ2\O;M=,lHk@MVDtNBthTvmʬ׌xuS5IP,9R6ضK^5թ68ۦm0v\5Vܖz=5&ƌ혴J'-vy;do]]bϫth/%Cg޵$) H!f@y~.H*ZGzHy;Xj{O9_6Gp3_~ƗL$8dCtf`/p 9@J@,Ez?ı ]} ҵCtOӜYqT&ӅUZf']EKK&14ɁdVp1 mxAxS#9-$w]pc7fIv/G^PRB߳@wl3p.\{ikɷ =f$' rz,&Vʼh>4.? #c5 b1%vA%xH?|3$V"Dp; 9Еrh26.%$+TK)ntBS`9˜6}m t >y#PhZi;Ne iD9B_m?,9FOqojQ1u\N@Իl9eʢw.Gsp2>\ݩ8%f͎byCE;ExWo{oθk"T|:yH?=|h?{_!&V=)1bAy9pAo)R/忁X:[)@b=th^| b1Q ~8]Y;g|Kf?) )^E.~R8g>W!iH:O6/+H:oϸ { FA /`3q&n@c)eH\ HH0=I䀏1ͨ|%= qF.'eN$[Hh /TON3TRm2 ۰ɹTC[+`!wf)s@J&ha 7@9%+mzBļtJ$}$hOÂyL6א6W6"i<+ xK`O~h MVY6B7x0)r jI4C@x<39M&6A8̃ezw rԲ{[ƀjzI49 n ;1Pl։|qK-§hށ{UpS8 , dQ^oRgz7Ճ^Tq!F"V*B3E=`MI 1ʙr9g |Dox/ @бދl;:}'?&4 V~O1c8 9+z%C9gs D DˠLh\8@IQ/ns@f̮96X \f1 <30s ƛ=AxoRU& G@@?C/l)hVmjGje *۱|EAN!dL01\M4BYd4yI+f}b^S<&j14V,i`U1*he퉱|S6l K IDAT:ThZ_F}O2tS5B L}O9u+Kul H"cc|a!r'pQo h-"}~M]ʀ#:|yAƲP7B4VNktHxxIڰ%)d)IjSb:U Ű  -ͼrrȴ\U␚MWmɣ|SVDL g,J|3؟k=H) oeZ IH0W˳Q")zHGj2N͆˘t/lkt{ޘBř [hg1xEz]wW>> D+[B(W ѡjzY;"*(c2'Opl9a~s fޫ*~dL, ;ֵcG!A$WKQ?g ̂)p_96a>H"W3e+M|6@"f%Q egS y95L`f'WBKDD* xT!5DO}xM۴Ѻ={ͼ݈?I!drdw~2 . AXy"e8L?pQT _5Kaa]85&, vɲi.K1针~yVxQl)l6QV}7kcXtg/lpd/Ar>mj=@#H@<M50q?5?y Wth`ǞژD&xP#M D:<̙Q)@71i τp/ho-# *dMN|9pǞH^6IJ"L %`erh!O`
Z[_ /l0%!IS R՛Mddqlq=)Q®Љ*@k:MnEMr3lR:PUVBۮwub% [ـMVE–{W\3*="Pmtk7F$77:b<Z>m gMs")=W5:9?)UP4C% }߃'SIcA@9$"8! Nl3E{,HFi4HH{l LHYG`߃`5:9Nć;:G:;`*f$qn&mw1ܾ 0@=4 J >< &$W ZZr !Iyw5KhGFN2dv6cJB&koD9 6$ IVcǕ5:7lG! E/il<_YXIF&rr2@.W|l1fo )xBeo@ ԬT)ïUFD`ByȲic͙U eEvyCȢEg*8w[]?%#bF;RH>^0ڽU@K۫* 5L m:V800Ӑs$HcxA^p~MSI :f _BgYukcS't1!:D2c~w]j~8 bFT8xؖB ]Ľ-@]c˹OR6&N#@t^e߆ 54H"ÞZ&iE,sZlh=fɄ4=H #&2WAg aw=Br9^SwY4Dй)L&gu 6 H 5_н2MI%8vH<avH{ |s߇M%fƼ$=4UPU$Qi~o~'zw8Qe6axr+-0Lld%Ez& VKMY$$f)lBWLz:rH&]_gp c>[θ@5 porvS+[{+OYp &Cdc} X )$= yρ{Zn=Eߑ>14#\OZ`"#bۂΚL7j- ~xαI#|=5w_Tqj#d@.Dh/lc2_} 8V{~xM7hFN} {.׾Oc#uzѥ|)m96hRI1EIh/DY21ielVrO[ |g[{}``N+_v:] ñ$ mPzY&diXak\o2gfޫ}Y_R^uuBTkN^pW04Cc4ޖon?f'|F#zP2UYʪ x~w9to]Gco\WvCnCü~҇5Gf3- m&+\|ǑocEc {<6,$ 3LFcxN 2SIe t>?seT7j.C>H'?~$rmR SdnmHz}|v߄"&' ~'hN-$}:h,{((<>{Ok.-0_ B^ͦ ? F{W7 аS\_;و)J 9 pm%ܡ*g0-]*q&vt&ЗI4 Щ %mm*{SA _+,ўH3 AhUxp@#^wGf r%IL&IW!s!+1NBS0:ВyK% tm wog xVS;r$o7lӱ`2!ci:÷3EǩSvO"y?G*o>M-ʥ3;c𪜞lDCn?vZ+;y>xjd T}!&BPH׫ r mwgdsm`<~wD_U6J3q-ݯ ܸ0Z=I#>3#N湾A996J&šiiTN6yC;B"M`+h^Be7f\Wjk_O#@ؠ!z@4W45vy~o.ri7Pq͌G&Cʑ1g~C1k~O 53) vZ{/sb߅rE^IaHl(7~#+H.:{H. mj+*&xZ]N8}~m1MV^uBƼ|dP]cx㷖G{`W>;ߊ|ۣ |@T9LҎ5pc6 ձ 3γi' Ǥ. ) d rSMhl<v.`]WMa)yXt.QAt3M)aaZJm%q&=! EyRz!P]v_Etp Sm8MOl].fT=‰cg-Ųjvo~@QjY"!D2*t#g$KB?jV>C. J"Qo٠{<6 *H 7܇b<달 Ԋc\;qxmyVf߇{Ritzy~+ ZU&d^8RaÝW~RYV*{'ii&MpY2S16MʇqY{J"h.1^b)lmMUaa "$A9* ~8 מ7~{^&CכM/lr~=\]">MP% [6uL,-˧T2 .WMqn%&O71qul`:eu z y %皖 zbGpZ8Zn k;;NlP6'|VŇ;iVYC~8xWCzc +謑a #F@МldnDxΙ7ަ>ۧ&7S_㠇Vʼ:cV8.3ԍH06NZw|f6j[!(5nH'-ݫr[e'sRU8 4W؋,̂UfRF ʱɒWi9HF2%/n'tBSlq66 bʳێ ké6"y=o >k4"C{}Db-ڜ%JgT0> ];jH)ERYzKc(9J2 gMܟ̾SA혥Es ]ںT+hsoR9S3/u^ni> CsF"4]'~ . 9URsc0Aؚ Bf+i n [Kzq~/&E 0/T)=1.W\>]\w;ho6/cs`8@+0r,D!U,=1XtOcXW;A짶$cX?x*A:sE)t^!\>dx H-4A$` :0hQ6W!UZ=mci:V`^V"vaz 2gA{"MqD2y %M]0ͤJ0 .'pjeKP*6?q,ڇ㋤c\&k{7ة7N:g {пvk{hݍC*=~M\60ۘ@:8js5$;Acgp,ϨpWBPZVFl&ǀq26YVxAq:{bczɈ3瀺[6P, &Er$ܛ ^#MHj~>ctNH]lYnK1f'ZQoK {Wn'߂Wd Ľm4J l.ocVBQ9() 4G;hFs&z38X)2` YȉO E^gLǀy%1C XCuJ $.:EMn$e7!RVvR`uY{#F;r j7bG\>/A| 8R f$ 8$xV 1j4;ғ5~:2Jڔ?͆O${q'"}&QxoZҕcDfZUDmF|Q$_<&d]!)K$ Fp2 }g HYC!%Δ>z q^VkDO\6J D.$h =xg iTv|րaPdg/vMJ7e_2#JK, XEYn-}ؖkq&{wq6w4ӶQEpIyQ6&e"L`t$6˶|*ԯb~f̤ˉh HFøDvJtvB=ܩq)4F698eC%~k |?zr:3Kyׯa_Gh;mu Q:lmoL뮏mo ~wS,p3F2@+SS+P7M97 *K{^1DʙdL9Aw^`q3bԇ2X)A/TcB mMq7_D2G]CZA 0~x翙@SŹBZ+eh;UrpW) ]a\>^Y9R 69Ge`(4u`2ˮ- Sm&!R0=glЙ1g_zr\$#D$MƊ2p1)TUćjH Κڼ]ױwi xݹ!q {)* `+TΫio \:IcWTȅ ӸdtԟlT~6¥*B*%Ѵe.>_[ Vžt 7hm=p1aS:&)G0*;o"묭X3謡zAg B*$mSBS9 Jq>ܛ/R_s'` >\z1?Asr7JFX>H=e A i~MOP,[A{I% ^SRy hž +KR5(0mpU_(/(+s~β9{3lVa,.;@X:D3,LHF=Ľ-> 3R~F@ cS}0!$r(Z^)R%{7u.5Dr1zpנqL.?t!CBB&1>Mć;@Al Z$& xԵзΣv t7އpr;;FO|[h| Z'j&AbGwu74Vcy;?Lc$P6<5o-@|7VϲYGY6%}3"aHXq}\OѸQx%4Ρ}~B#dz,b}Wᷖ7hvV?1~0xJ<g:!!>3H `8H{ ?:#li")Ula2MI`XN%'n6 s~jQ+ _ @RUM׌G!e\MW]@+d`Ƨhۗ0zu4.ysREc$M75*]+HQ5 +"GH`C }#c{r|ݻ1) ؓ]\FYN܇pDۈUr p$*8Cp%ynۃ&] P[π=7Ȧe%g@2 [j)*r$G{S}3ˊɃfC}Cq$Jn8C=xdx+ObT)UU w + @D=t<ȒeVջ{{zٙ=I @x CA&e:dmmJ:*d4)*Dˡ iI$ES$E@@,{soLOUGWMe~_VUh`*}O%:Rn!36z%1xG£o*\?p1P!V*eA`PF-LnQi,eI,C76T͏[FSA524)}pjGV6Sm*$OWuk;Al0cYzүAMׁ3ﶃi5"[/8' >x9lWk٣:hDzxCPO}HmmDxs_z뗿w58lEH)xO羻<3[:ڠMwz'Q*IkJŚv-L1`~V`ML6p 业Ɩ n2D_Tr7m^6vUP1z2nRϧ l3&^[U?yt[;ݲZEBH/;7:R},h78CzcG4bMG3) Zh!̥'´Gw}Sɛ/"K_^ : L SqdGLR׃ G=oxAoE`,o>}}qz^pn =df_.2¯eu z[:,yXx"0>GʌS,IIJlI{<6%h#d;Uo/3h/#~?~=OJ~nV>N`6yfuSёoUx;g*A5R m~do*mk,V⺾<_pa!cS@N*ѱ\:a ī`>E e0rRl'ܶ7Z~M:y~ㄎUrOg>]A0<{_Ksq]~i 8D=$FK>MăVdI#oF~jŔw0v9=8{G4~+߃h>G7fR$th~e.j3uZ^}Ծ(#TȠ kC+BKMI []/i.!>_"_C40FS1 [-_׀wp3r񶉠=A}wdP]Q|8-{OxU!eJ(W"27 8S *eH2rSVx6E Ȉ`]})]9.@Ea,5*Qч,] PBta~Q,jPSc46" &H(Bg{-NMA# qnF8fd5 IDAT 4ܶi> "\Sį ڋ:D 3\ݸ! Z0doWfcE#&9i? EySDEYH&"cjDKV!_v9)A@(\ZDcSh _ @W);~4/CA#uMQV5RcGc4__{9 j ֯`]v:.F7fhy_Z[tGaf b4pnZP|{bb8 ][R,;dBtʪ5ŋn/w WQ6 TDvlRm" N=yAsn z~ T= O"^RKrU='m0B3-jozv(**T"h i3%j rZ0] +`EtW~~]aVcWMģj3Kڗv LWE2A}~oEl8O[h-=;uDJbf0ںdCYDmf XyNZ)3IPղ-,Ȍe]_ۑ/0 Oc6uYwP>};AO /7h=u9Kb$00*AmF\_7ةYQ6#𓕀i+}ߊ$( 9Q(D@+^($( vS6b06c~RW@-\`n=Xe3q]1'g恹f&Kگ:~Mk/74K~^souX̮]TBz[ :"[J%n,CA00ܼ~>hjLiTZO->2bYGt Y}`(t}( >WmjghٌjMK->e$^]zpW!>+tDmb_~sAߚ_dgvڵB;Fn\'WGo]PсWo߁ߜE#·m4@-ZYFx A4؂~٩!l"m@ @;PܛupE2i(&c} Z8tPm.\F1::(9@xY Kz*E~w'/"=GE|{DZ"`fN Ko,0oqMt Jul4۫zڅfc~x̳ rU6gIڋ?W! 2w@8MC! lyA/=]r;+?2rҶk#ƌ)˴3)_xLbP{0/oyʅrU`(?jf+lƁHv\t̍aԵUASy:"Oi:5hK˯;:@z@3/Q69snq;vɱaDbLs-,:ҰfqMj@d5Z$RԠu(55A0w nFT!Ƈߜ΄ģ~'# n=?s 8ZkL ,ﱑY0)8e2Τ:$+k<) ͳ@;0i e❊`KYVb1.2ݺo̟ [,fN; -y6S>y"ƌfj"Nke60}E/ < <`0"R 6lodNA_~IM w^>%tm=olJxff>Ic냕~;2I>CǑC$k9گ|kR|wiXr!}:[)[׾Qw%= оE(@+E}CH+dq^Dm%hW!Dqme1&?;plH(?:;ޥٳ:wzH6@ҠEIAжeL˝ |85sI8Խr蟜7klhg8~cFLa\e,yڋGlcf4Fx QY a\v9n"\@o;SXp_ hD n;ibb7Am);g3.k?q uq03Ԣ1ŧx>zm|6}oDvdy 1.7A&: =ڿ82^sAeȠhh~$v7ڸ@k!אOclL!k_F6p%m-6 0$_aoM!h FxǛӷ ~SﯩNL$l;뀳ςpz;q!JNv4k+(kD 1lL#zGc\u͹aoR+֠Q~}>7 I!ѽp`wFx0.8`%y}+5m{(@aR09`hS *6ב)(i8a^_ALmҢ*|v@;v N.9_k/pQo# z}1%@jglmJ4<-_]YJ;FBj7 !x9 7o ,y,_>c:Usϯcik|Ye~ESB#%ܲKn,#CYQX8Kqp9kM, ΫʗQ dC'BȘ-ޮ:aZQ;@9$ab t"fdlU9;{1Ag~.j3GPo!\u͙4ܼһ=Bbv Q3V* eYFCEE} =at۶*8*zz'\ &Ip-7[2-2X۫ b-Ȝnps lTX}2`֚eCMR]&:'+/aS E%4dɕk8(Q!vo#vmo^st>(_֕s!]5HԻ>XG4qq9oN ՒavK^UP!DC 7P][h#@Yt8}_ڃ7 @mtg?Qɨ Q WwlcW tlԉ'.of[;;L yjHP~cFF Y[!=xu-](Rm4u_Y۫8BH¡VD>}ZЕP,#nsq.Ux9-fM[Q6e ,1c?١lx2:B"o!l6Ez]ەw6^Qc@s F9{'`} ޤp$yE/y>a~Mڸ^>Qд!O-hu?W4 i#Q4ܝTH V"f<}qM3Pq2m_E`mAw k:ﮃK/}2Ď lOzc.$ukDPDmE*z[S"!= !T"Cm~F[0\Q?tJ%ؼy~TP8wal.Ru5? v5O7  :fΉ,%'XDd]luQ6m`E\0Ǖ鞄=lwB{'?HF:F2CkaEoa 7%ּ~?5lJ%;0'\$,$ɟD;0ۿTSա(M4*xPq~2W@4D^@МC4p?/o.I ^"؇opxP{grhnSR><&w&3G*->֨bt. s,'Ġyqz0[eȔB(FNg3x0s:*]lҰxCY1eJ /hxѰ?#ϡw!l/Dvz dC4t]1G)OeDV.+/<39Z k>Qo >6in(@H>/d~^8Bg{*b~k"F6F~ 1hQ F ߜJbM׼U` X| cOKFXݓi^ Vk/ 6FX>T1<LKXi:=bۗ#fGay}: O19\k^UR;;YisR]H4ID~ bԇ@%#Z<li#$QrL@4FPI1((toͥV:gvL@a}' EXiL*'"X3nzmH,LTaW7","28Ioւ<ܛ0닂qoZY('^_yϷqU[ݣB<##o~1B"G}4!D1{bJ~ qjn{|*)23pһ*.|!߉^~?N>a;2g5v) !8DVc o"PCtWphMY`qp!(^-wm" U& SߩⰏ h&j3GИ?$`KCS/3:i$F0X:KWoA6& B`7,=&Jw нԏkoZegI2W 6^Yb' A@م (V` a9Ou}ƵL[@y?r [7SP3Gmsh>1! it!)TE%NF2 '颩AE u5 RԚTҠe)}l]*6^ÍeYwU#}? |Oɸ BSJ26n , Cd6檱?kRIQ2eBo[pZhv k/`{^XO}1f n=vs(`Skk'1$D#eS< v)V$ab F̞k!u~:+v8cpO 쭣}1D4/ᧀ;$*UqC3ۆ:H0*xuM?S`XsҎbQt"snY >AA0[# k۫|M:sIJKpU^VúR'E:Qlk>7\)JF!Oȣ3k ;oX_G#i&u4D` /y,ZKAWkHr=IΌaH@pJ+u( za69ZGkغ5|-s}mgb( T!lap2Kg3U-U`?v)i0TP(UxXR1J0}>+_M݇Naڅ n lmHUp}yWd):iquॆ\N$QzQy~u$eeU?g,ۆć`zZ $BM#6(w56n@֚,!C}t)\#!ԜL{aj) 9׮H.r..->9,lEW9@c0H>w!ZC0X/a͗Q;GPN*b}h*J'05.$ Q~oZ*`y[׾U@)4N1Ap[ݫ y.:p6Q*LRo{E$zch{ g3\HOZtБ #y4 neE^寠{%nBHc7g[6O!OTta[*Wq$T> {󀫻*'vj 80t|Vߔ&OF!C QO5 EM8 Y8!}o_Ҋ*OMEwV7 뿫b9eXnM* .{]DʊX^x۫6p,,@([%2<0Vo:<|^aYfra{x6고a IDATG<s }Jk)rAT-l/hob~WAGd7z^X|P <<ѷZxY0ۓCq=00 # iZ$=m{&CW?*r* YDJӓ G\~&[M_t{ 9G9LXNxc>3ϟ玢YH֮{%t|9k!hg9VY1UnwF[+XyYl]sԓWj'\MIx[]L7O>wL3]ˈ@ƫ:ë!hoJ먝<CH>phE@]pm.Q?ׁFZKpҫ!lbg4 r]Wwo0pK5XcvK#t7_ƍ/~5VHQqcAֳ .)~Kz\o?v/UÍe V`!Ƞr ĺ:jGQF0X+9k6I1-y̤M|O`E8J':9n7iW*p&-W76}j:RtNyj' @8lM't֤l0c>_c_Dwg>ÙK~kS|f<׮#iuBi `'J@u&YIN :N̝¼oq  TbRɎO|#h/u@H V/"5y85fS;Q1gT|9tsrUCoSJ)r`bX(< \R\O1*macK@7p{K5rk&Fښ,d6P iS#.*)eprf\1TUoO ڢ*)C[TPN]߂]߂_EOޟ>jAͥH99=Yp9>3 PI 1;4HZGޟ1u@ԖVz~CH /=W> q%6sX89jf $dZOW.wU1|#_iЩ;% ։uNyg@^}[> ya6/}{f*]^l @ sWA𛳙ߜ݉ :qMF%Q񨇰p{mg'x;0s) hQρH;؄ĕ/vrT&Tr)Yo^o3e0ߌ~+/<<9JYog"e5f(0ߡ$s>UG}"n# B`;ߓԩ@Hu犑6x9rh卝 xybx9X $=J vW}v  SQz+q82@~?p@hW瀛P.pQ;fxsǑ$v17ukȔOn_G1E*nބx<ĭ׀ۗV/C ]ھ @8f0NG~#0{^%m&č+k.Cl DSuuYKi`1@ZqDnw1ysk<ν.@x/4g7a3.[\]$-ŶS@\U"8,Q§&:F4sqrA% ̔ sҹ2~ʾ0_CAsACPqj&VmȠa^AwU$ tseBQr۝bEX*QAQ@ '\ċjUr~/Jȏ 3ܳO<5δZJ^~#,צ[˴:2P~VDYd )W6\Mأ}Ϥ.w"i },MzYv>l&|OA}ߏU킒mDMģFG,mƇ;1OΝ.s4w~o"Y  Nk~':mUpA5d՟0e{ZN?,B6umJMXxB2.G .E` 290III= ĝ2dLE`zI4 A񰇰4n"!8taE`,bZ TČ-\$msWeh rlK0=F@(ߩs!Wa(dYls۪]]6Lod*tj״0U9@\1djp(K^cIJ{=Xay0䏣HU~`ܴh| dɉYդ5â0=my98{`IG`~Iju¥-$@3ᇎ}2w2HH}mSo@\ NmvW9. ]2Me@(aI/A6IKݘv oW1 e@N"obojp3qOq6V[YoA|*^LpXbr]XlW. gma0 ӞYy ;/ l 9"R`ٮV?S6;7oA%1d !}D.7 :sǠÍe$Bzh̟̅oYЎC fV2V N)$%moޒ&4lc*TtT~e0$lν.&/:TU*,4~M X4Hoל3TL\JL*=tas@GTNe ]Xw_q&`I*B (G= חИ?xOA%~xvB9aY] oo}SG͵\߭: V bLq% s,F$_\qrq~:TL/8ňʦ-r_74St"ba\raTN F(pmRL.[fQD0faF f{_R`_i.&;Pqh5f1Q7ҫ!,`㿁I &L*kTL9,K8@]`l6a ]8aoSٔa\ !3?ȫեeE:G`Z7|RS%t kϑ+,"UH7AprXE،~2t憵@^5m+~۫HF/WoB ID bZ)@Ƞ`wV*$Llb‚HK1opGn .ʞsIDubxQ0gLdҭJb˺[k9թPUTA9\o7һ)ʠ MM[Q69zw3&,+Ǖg9TRIZd 1?!ًrɓ{ȇ2ʔHsvy/S$&e.˲EXfpHWEFl!uXj迪sy/%ۍ|QހaNŜS\)\Qa\&$߫~bNMEA,S7cQ *&=0&b@j0qJ;36Pd3] `όxUrX(f6Tg22\ |k1>%֢#]ݸF|Υ.2E/*\^S.Jo8,Wlbvt"icprؕNh,S 256rv.6FkN42뚞5jvqRq),eQ. l%Qo(:3*FQIk{ й\swTEsEjn D tʛDpeE= X2qY$m@Tٸ9Y"ŨOssY|ΦRe8 @m77E\-(W[/:8 r ,)}€s,#\YoZP )@ƝH jp. <Q+)#ee2Rh_\V9/ a#jNᜭh`V!2: IyCJ}u7tR"\eqNjMs֜sBJR>ZnIMx2.Zٔ>W6=W=EQr:$z/꿽WRo5MqzSzy79y^o8@'VQ*Ӗm7Nzn q܅Ʒ=N0':2re`EER(qm@|bjWܡJ8`=&7*'Ӡ(oSELUFلC*lRL#q}^4(os]Tv+y* ˨uM}C}lI0@,sw{!)":"A|Dtn:Y]X(nUQ)ý /)XH_Dʰ`.R{%XfGm rJk8F_exQה;rm m*Et9Q1E+we40pDoSJ؛(UI* 8w콊IlriV~ؗ Trde5]˵:ܝCquax4]l)m<8, 2HiIsUM-3y˟K(y%ha Ų-&G0\-[@ 8cSh\stL dʳ-b|9򩜴eUV{䂡Ot0$Ԃl`Q.8%ݶa L^0NՍVp"{9J.n.7Gl59$ryCoǖq\g~(z1XU2twEtlWt%A1n3wSgh"&e}~`x{ u!$bb((Wzraʀd•(,"yU>s05 AY >eUR趴E58}\+@3 6!"[2**92򆶺-r}[M Sr/<]Q<8|N`SKLRt!, rQ!HvE$(2O,*:\rRP0\P@Q6](^E,UD,ʌDC\!IHZAUt9uZN\M[V_ޅ:&8m}*?sS}pR`;Qw(09qg(ι-Mv/ йK*lR ݒ2<)B(.R~ )2K"% rU3 *7.A JC]f'˸2z* hSGHEAp^ tNݕ,e]+H,sHMnΊe &32~/lژkN9Vސk U%Jww/NuMnoT w Hz.Vʒv$ݵ\eƩcv0 e զy-E9 t(,uUQ6LLWfQ6m&eT leA:X$s=P8oJc6(8TUe޺|T݊];g.Q692ʦ̝./amr76":ߣ\saRiMV9h ڍPZy2is5.e }lnOLr.fXk(-c3ψʚq@$I6`k@PWp۸p+鼅-nGڤn(54[ tNZ:^ݸN6M;/+e hSXD0!`coWoa:MR-r°EC96mNٸ{ ۍmbX&=ouÙ6W'- )@9ǵ~-hߢͱi&籇.#G-GW99iaѸzє)8op qXhim)7M?˒ͥ}FxQM|qc 0Ʋisuq*: Nk I:!"ZUqU^k|֖v ,ߥ QTJ}\}E3m(e 2m.(4QW9=b 5ٞs'**s9QKCmw¾ sa᪯(3 Ur*pW{Ef-嬨,#oH[rL(oSplsXꪣl[h[1hrk̂"T2tX38 e]@2euƹ EeftA,a8Z)CѫvIoI4eXӓK^-&=lWvUb|LѤm[8aeeXHmZr. s QX@ ĺYq~7|&9 JWp$9ٴ'̱bNi/'OѦ͑ hSHLҳelUjیI\ڮm7|X͹wX2a-ѶHR>E4f{aMM{EN.oBKmK:R+[FoRy&Pu' M8;%Gm]v|L@beHL1-M-K 0WU̸ Cvc9Ů .+]VUSk.{"cdHvycϻ+\jg ֺQ.2wHq|\t!":.3N>-2\y@ܥڍnĂ=>'O`oCfvw'."=$j3ZHX寠qUW.#ނ[ qD:y C"9hF 1<S'iaqW ߾o&0@#(/@ԡjM$^QkQDGh4Kc4w qN`#;2EOx9Z@9S.\T&)BBGϨR#P@uQ׊6 0Rin5LS'-GGʑi16QPuppd8 y?_B'Ibĉl?D%^{5D=nOåG)c>pk[  )Ҽ*yFqB@vB@u `lxzߍC;0-Z!"}yjɃ`uvtPP$I Ckkx.?qo8<4YoC\B5ۘu-[xnÞ5?_h_?2^{E{p(ה2`3+K-<3\ƪ )2l%.o;aa]sJ,eYy2}l_lڤ @ &?*rus%į`f#NJ %)3?`}WΡvk=~7~q25 4W/?̾Y$AET0w)v.Z Ҡ QѺ_Cm;X{KMwER]X@ c.)eysld; Dy~kCduuXg'o$8m/{+"8/ d"LvJ麊h׵ lqO d Q@ER@J f=IT *I2V `4h8`0j]_/ B u܌mYA Zmj;51ضm8yd=@@xM8w/nz M^9tiafizZf= )tK&!͒f;i&aڢ7\) 9 "c~N%ҲV/@" e۴ua\ua*a{'B~DR*F|fKO~܋'-%m$}STRd~wh~ ^g8ppl %:mKM٢ڡZy|0 ١Yn04uQe{O^%VLUDM>CAba%0y$RdtG;Z_F`=hGvLۭloL>wXS鐛QH0W/0tiIP*WZ|K2y8tK4 YqcbVB c6Rom0hZ4M6WV>^&˲2 t'Ua 6% ? y7d2r9r)` 4e!dMD^e\#T:**;:7%&lָFx҂:w'5~H:q]HQoi_7Di0|Tݴ\Qiue69*{/R>oCnP>mLt<`"ɋ}0ۮ:Imr"B,"(bem+]}ö=+aHۛ)d|϶u]< ~ǭf~uamw-+W[sBqyv>kk\zR`Y2v;鈷c;(eyb<&4[}*"&;T˒Xaq7uW7@h6;L.Emwkklll!ta$kxp2LFڱsgv]cEVWWꔆ2W_&7􄹽uJ(DZjH!X},ˢf**85FtQ &:ЛO4スu}Yh&;sn*5): ЙJڽU:MPAhVWwnJit{3e t0u?ͯ+Sg siX}u/uAxLAuׯ_GJc M܌e#͒;@PFs)ξ~PN_CQmo3ҙ8p dkkD7o*q0x~%Xd[g${B\.a[0>wLԢnjy!w%"8pz^{ ?zm)ϡG W =+DK% Ғ@v[[[caa : $㫽g{7>>$Jqr@F}< .A}ŲfII> X<1XVl=}r<;;; gmj7^ 8>K$F)ܤNrVWhZxGT`}}w7LpR,t&]5?$UA1QHIz~zVcM6{K~G|P2iB˧ ~/ՋxA֧ywZ4x1(D|?^ wUǶm|[RRh68RJn޼IkOAр #ϱ> CAEWO/c[6- ضv\u,ܹ?2s)q?9[T.o&` iI50QW:'u-elKXݎ;~"w~Mu^a@//Vۅ&%(JmS.<NOOxty<ץQy.e! " 㰳ϤgMw=ti@׍ $`*i=x7=axO)u 4>"%!ѨKVѭ f(MU.R>kvW].6IA)[u]:U$TeM:j2a~o7 ˔dtq2Imr6&T߈|DXg#?Oʄfܾ>1::f%ҲV;Yʗo=kTG#",e}V2voDwh\|֟9X=J!kkkDG c'k7]u"|Z,&sH~6]ҙ2G 7 l  laejt1 ]QPu ]!HN 7MKk&@7BCpy#Eޒ$^5P&LԦPMZa8&ju#EeY [Kb*--5FvP}$8}Uf̏dP vBDqg5l]fU8]> Xc7 ,M7]ZsOu-4ۘJi\t0'P05&SfpQA+aȌۡOD'b{ ,3LVg̶NBZWjt0 m;sh:,))d^M(yuNկw,V>jضGex _NiE]v]y2M }AJJ亢{ ʿ*&@״IG͠|uyK[.R F'W6クjSƨP]'P$ګ7~]\vfćK"dqClัo4kZiTB{cX;vp nmsG׈]tĥC}}bxm8v|-'dQ?~Hgv쎱8###!IJc7Rž;1o:*國piZyߛ\tR|4"i37v<;<:0<3ccc80>|6*YX\xZRR7:FFFslnV܄wL:q5LHKvR~?M??(:πu bi"i A4@\MA)3QXWoҰ> 6 d aU 9x /! ju +:.[^>2{k<ϻPud~sCS, MҲ2fM@f.MٯO͎mY WnUi6[!sy'~ Qaqţ,8t$`37|}(\" M]-4: աTS mݍbnbZ.GLq&B븮m9l-ffgY[[ò,DZ,;f'3Y׽I~ GEH:#&}0{ jP4d&,uleQo&U']SJ}oIiv;M ED/)Lߨ&УƁnuknm>@1V@G&n~~u1lq$C""^CZa( -BƯ,$!N4<bF rw, BO77$qp CQu@mIoKW)) w};>$k0Qq[[[^77IP‡4 O}MӪr_d/m< 8O("vP# p6a/# nR6]sR u_gMwa0TE;*f]Wg iUQ`:?;8f&KSa<0 d2Ns |f.""d>ߞ登ߠ&]xWұK<]J`9|gy/z.\f2j* rV' ¸ksLx,+g-L~&MR$=oUv2$j=8&sLjgځwX`ܶ94qVWWDJ/:nn:lur</Cja266F&aaaZ Sjkg6"YS;)Uc*̖рv`u*'T*vf7auSu۽Pbցo.ZpJ[%vRձ'MT6:0M(IݙoP2 Qk#8I_ Um}_;|+eC !F_LM1~`a۱e"D>Z l+>T!ak<~|kyD'A(._C i׮]#s!Rw!Խ!>@ O-־˝!~#*23T$MGܾQlF!ax/]S?$W#VX~C841rad8q!n.p7mR%m,ŋ.XΝ;ȇrXjdӴh浔tRyF)kG.5_~^zP/݀tR }vtR۽Kf b;(ML&i{ͣ.iلK4yF4İӍ娏bQRP@U-}C G؄r9 CXTI(ߦZZbs-2<~sY L>mkZvOo\+u{*a*q{;Yk_ A 3*JUQ4ޔ}W]4@OM kkSgƂ!Š~LS nr^ Lk{+ l &ݛWS:-N2C*bSgE.\,cccLbll0accE_믿έ[X]Y}aʶ 7n |bܒ8NnS|̜ M0?8?Fle;ndxCT*aHVZ;wy&333l>VdglXAHǮ׶(^SnKv64tZ~B\dY,)٪n!6p?yΝ; }‿XcL61A >P,r_d/Hk~$!e2Uetd+//c6od2KT$<fkA$z*VS<2`&{zaMC-gL/g 3Ʊ_g( @R/9-M ħ[d@D=}?u&bzOi~r/JS`ыQzaŷs3lUBEP<\ץT*155ӧ9vr !$VqЗ=Qwvvudl,(O|n: MLpq&84j3;;˭۷YZZ(O 0֙fMs?Q=x߰tfRUŒ1?wacE/=V/k@;mp~mـhĻd2r~ +c'Lfbyy?? gLLLc??`xrDob IDATrZw)h7i4JӰۦxkmSId5!7 H@cݔR ^)[^}0#[~0CR@g|XAHc< <ӟ`~.Kwm|!Ġ3366Ɖ'x9}4cmw aiix;)aDd,Xv=ҽ=t;W]֢r<^8wŸ<7mYdزr s1N:4Z ++H))}e0lh̾ȱ}t:Ư{3UZ"py'8{,Ƨ qnXeiJ6jd ׋wH\e~nFtgotױsۼcfaab1>kYA/jx*(ӧ!^[MXw&Z:p]@^MoOS-m~shet3.R-xRQwi=٥j:UmbtLM7(z}~8K?+|ꗹ?g}w)011i&P( $r1?f,-/uB}{^qh5llU%z.foQRD~{ʚq꯰#+_gɼGr1ML>lrɓ'c]0dqqp=2GY[[kqbk'?Gܭ/i/.3B;DQiX|ǹ?iUkA")X|m}q:ҏe!Q<裔Pony?X^ZJˊݹcccbѣGRrx&4Г~Ti3>$yO^ܨIIyO~W A-ήMZgvvex$ZD+Lݻ~S&=B{.`|0v(2 ֍I W=A'Y33388~!.^cģk\=Ov3g&37gb̔ yK8)$Tf&RA:tL[@\ 4*=]Z6E0ZwQ&tLɘyPKi z{riçi}g[sט}Yɳcgaj(l( R24TRp-76bñ1+߂OX  2\0qiZ9l_cg9gyH\#rN4lR۷YY]R022u[_/hƾaHDDmljq@%.- #ŮRRQW:2(dیsm666azzo& DqJ{ ,-b ^zMhڕS{ҭi)MAEĀ.`]bQZ:3@e_Wns7L&C>_`ll A@P \>/5%{;Æwx I݌]P6䈻S/' E@ A""<>Y"h:E\;wm\r0 ;aoݺv^,NF KֵIzRJgM߻]7=(p`G) 2l?{z,&@F$&NM ihz`)R[RͤSH{ta`lq@FUj3ֺݑR~;O?k7W((DQāÐNpc9xb #{_y#|SGl.K4D<+߭nژ]7<rU0; o[dxUNh4)c#$ߎкJDQ{^3lu~KX\\rüv';@/"llQ5ۇE `ka^{OA--l" B,ۦlr2+y1e]?Q}.ѻ{aLM=׾F ~t7 Bad &:Of}F|>Oj5^>w-2Rm_K%3F&QZS]uRnrx[ƀ?U4xdE-JAWZ'I&ih? 6aA|?JviQov]LS.,jlvTԄ}VAw?Sהk哔˥63AElool6i4A@#uj?:dœ*)J1 C6Ð-&fwˣ3w^0$|0 {|#&H.L^pj9r <X-.'!-V27oСCa_% ~65tei^a4v3VȠ ĺ7C2b- bs};Lh}UْE vR%gRgIem^N篮(wM k|82쫻)$+9=$!Ib>ZLuJ_Eblss@s$$闝 ˿Qչpz(3,.S)9<98F1jj L"FT*Sh6؎CuZ~xϭ[:2u#jtiW^3܎璑xfY<`[aHduu0 T*yhZNqM :πlnoHLC{ lG& 4`dkAFLS_iCpLB>4LU:F҂4 ^U 'AՉiݧyأlh :AM۶ ڪ$R qB)WE_Ad8QJS͔9Z!7lw2yGW_`cZVrgF&%i7_g}})%TQY kFRe ojh6u*c@=4#lGp Rb 2m[ ]%:vaiiBԑ#Bp;göm=J.cvvVayA6Oq\.8f Ǎ zNn2F_35sbo 3u\|3fxK:K&vߍY0 iZlll d||l6˵kTMC ]pNktUnk0~?-0ۤXq6]Pu`L0aL'FSPbpM DӤ1!&!i ^\Li(3Y("QڏA84C:7"&G?!:N2 QQb8.aYsd7qv.!?q]ۦlIg$R wpyZr8xaRv)w&!m SթnUd2fK^_@RA_%X#'nI6رc ƵkZơC8r0;; ?@ ,l~'fa8dsY?ޕF y#v\ןt0| cxя3em۶N_˻;:loo8puJDu!&sЬ gR7Z Hk`qu*"I'u~ӲW@<$oTT/ pt>l*&M&2r\LӚn2iN0&=A4_Nm[M;M ,Rš"N!(E6k>.BX.cݛ'?¨?>ddd!Cҗ|Sr9n߾͎l:8+d&2l6ۇ°e>Tjض022Ça׿5~~ JO<Lϳ5 &ƽ)l2 Evt\.Gˏ4؛'*2Xtw'?~r6.l(C;.[&nݢh05586_@TbmK_0x=V&(iCUK%خIoLھwuZ&iw#IF.x lEf3qw$IϩL:ЛFyduбZ+ t5UݩtƓufIWRnm2RJ;MR8mТlR!266F\Bavkbv0xY^|E0dddigff޿|uu=l& #6lV7Y]]Ų,FGG4-h4w :`β-!ɐ( ,ƒ%_k_a2>>O?7oի r:}bmrS;mqA\m󝃚n;:e 7-.ַx?'^0RJllj]l KJDۅj7s. H)9t0eq]8i)ibnHjn@PT:&y31Eg\$老j ^UC'CfɄ5uV e#Of0Ȍh(Et!Nl%u*mDcM+;FiG]2J]W.]ݙ5m7nN+e뫦1@N$*iMΔyJRF 7nܠh0==4l3TT*fp)%Q>DA% Ue~~K.r9(JLMMqe3;7}o~Ѷ:v%\BVĉ;v ˲h4&v>'.v@϶²-UVVW|2w\.s)N:zܼyg_WU{5-Ry- Cɝwv_Wa 8N:8U*T&IwmLOOwB7x/ZNa, sidUVP^t{խKxZ?o]'4¦cz@\MVPH'$2ݻl}p^@,+$ Myz~힥QIkꮧ{i~湔@<+_8x R)dccDA޼q5ܤ^w#"2G6P(P s*Xdݻwt+kpJ.^B 2\RTx:xWWWa}c͍M7m$gYgaltk+w9./_Huby˄!8x|VE~eYkpf/؉\=;_Ų,">(0M.0ޫkI%@p? o e %J@@HA)ƌIjQ"Hxvu ) 7=zߢ|[ ]*o>O.l2<<񃌍e"ˑ嘜DmYw /V~:ׯ_gqu? ?`0;멿/2t_*yZT* 2˽^iI"!fõLF;!~/?6RNH(i;J:tssDԱ؃J|bZdۺ]ޏ=&>DtB3կ UdXt Kg}jؠEg<-7eM"y<' o֤ꓢrBP7)SyE? ,++ٹ8w;d}okL&P^.d2͡͞Zj+++,//c-A'ңb!€l}Ov1 yKQqi\d=r׫[YƲbMve7*ykr*"}?xԀeXwT_TTt5YuOuN G]M;hwYeNx皼s3)U,^Gz\up6^2쭗am\um߁ a9vbnvbɻ!n; y + g=hK7^ۺ=)DJ{TnBiE;Ly=- FxOkEшzh E 94mY eztO}oq3>*?8"s@\)S1HiGt05E(Q'YhyMH8O[ l(کjWm"[ą=M;}ts4R(%IgZVǭ*f3b(bRYià~XP)J>m.3aR $,P ]+'ߖbnDi#}t: in,5ЯT#r Di4Ωe%1MY-n84ē~JR6{C 8DкQ):܀gHj Sc{*3 V)UjyM/nqjY0RG 5UuKcJgr4IќW{I:!hk<:7:d/i@"4u л1ԮbL0u3t>{X&ewr2K H$*jCAQuozl,&\w+5֕`St&]r U(N1TB;UNwYB[WF].=#nqngLL#2sYe`M4R$ dWpЍ4gN FK;eJ*/ g錋,J1&z@64;̠R 0\RNJOSݔ0gg]`geRt31⺅a6OI_@eM$){PA'qO#'3s`5MNLxf2V*)TcYXY_Y,٫S^~@WGrC0%| %턆)73TMO Ss!ХjS}jYIh5bRgO <-P7kʹd&z Rg\ǖHB?P^u<{s(,g5)̲%+ ~)PrPY6@e/2gQqi̠uV2~a.k>Lj4z9UiT3)sMMJLy~6*3@v81iʛ͐eSb\ë\S@>d4кu%CM圢PdѓHR YSPOjZ&Rū @Ff3˦i_$@21&L-qyD>P(7iXiMwmV^ |K[(FgԂWk e}k@ 0`M,=.$KyJۨeg A2cxvQ7$-+0ġ,3fV\%M(d RW:ΡooWU&ǜ=daew&bXWx0Mgeg^)ۛȧ[ ,*RU( ~j7,Y5&&.㗥|1vҐRVee6mdL;@X+}@`6'OnDl*` }UA:Wu0U90&i~*3BȚPقZc[$BQ*r2&| ),I2ktF&mucA7_փ0LA\Teu(iNn%%1,.{$"0SQFKiZiI:̏-"^HH^<AaHQ5ʙ!Н=k t1Q\Ί*-:ylʅi&t˯c(*FPh6H4 o|Eg\gʦф7 MuME4AtmSi֫Ɠ澄 sT݉lA0)!32藫yMTPT1YF}&N8R~V:1UƏ)F4,Ctc @Sج u)C*hR3IUŨf% %sZyCD@eg)Qc )E(¤nFIQKm uk)ȍR@B3WnNf}LcU4@tUe)kIL)R@ʚ): +~PY6)a N(XP6daƲxoU;J0hgIDiU&0[r DN̲ Ђʩlf&{qTML `˚e2tD@`r j*x=@xV,U`XJjM uMjySi1jL U,@@ @3ЯZ@YaE0Kr*Xt @&Q5lC.(Yl^u2b\JЄ2:1($ RIdAià >^>vY6gy:,Y u5;y2 gg]Te)e)FƬ5ЩeA,9YliNLX,>,YS]ucUY' k)7TA`坅>DJg\Y`_Y6! e]OB:$n=VZTyCIaC3X,Y69$W,Y6)eՠ)jʲpcl~,TKի &SKm0lI1U lAG0j,iRiKuUe:P5u IRR;lFx%˞J2MQWT t4e } =M[>̲I>q3i ddmIYMNN°qMi݉ep{SK7)R溉LNC} tJO 銚]&M\ 4MqITRèi#JwX)o.7qII}:YuƩ:@ 'ǓNO4QģJg<],PgխϪM]@w]nAY0;W(W2*uhN'TgOH> >SFx'-m jΪmwIuH(TI&5<|̸G~:!FI'@2CҳMDj@ތ,fR+{Zgj _nzsЭ725@$_*P0UY(Pw{40NmE%$2hԫJ'mR>8AUXie-]yf~r QBMMQ.u mmƳRt0 1UJ1 &2իݬw&@_ LیaM5a(McrZ)Ckd`hؿ8TGS4M@0őKf SG<Ydu8U[OE| κ1QW,:Sڌ3 *Vx\D>:J;!H1ZO Mgި dDnJPֹ, ՔvlƟ I aYE'PD-en2t$,uYWCM7(k6m,Q o)CUU/GY1QrL3nfumbHN$~E&,,lW#ZtJRT]9>5ks˪U}Ť*}PieUPnh ,e!p#ln/Y(:Lć (n uNY"፩BD2JsZn2Mr PݬY6Iw3&@J|"fȢ~= 7tu N)kTD C~!ANeife"˦ Н6 eaʳ2Y,`:B*Xͪny6T@$xxvE0f͘eSz)'4,:`}P]<+}P oLrTL52i dъu͸xU$el3dD8UmIJPw?SnɬɺTFe9f3.5'~HPNqJ=]i_LL M O9IdR;YTxO,II%99HFuyڵ4B(I-xHNj3iIM4u%36ˌ C>k0ӊ5%YB3U*lS 5i@ k]]ZiR{M'8EȦmR7#!KT0ldS =uNʤczoIX;u;kuC+:`fhS+ [57-ŜgStڦ uUQxȪ4tuR 4;@0'&R, hHUUUul)0`8ʽu2EBg\REXF0YuT@z4O1Cv5iՊ((M(Y]_)eQI\4hq)CʐAN9-H$ִ4 p>i⯞VT\Ofɦ>dCձB*' lg6+i<}L)}Zij茫] 5QO1Yi;N+OH-oſ;Z5j,n͒tFPPfӖ )ר g*v]0wziKbY3L _,RE lR^ֱβTÉeY@4gիGC+Jbt ~VCAW?SyƒЭ7w)C ЦlS% MάaMZ5&ei Y脧cp`Ve(&3G@q624YͲ9K)Ã̲%&;Ho]U } t)$U3O:{{f̢\N#ҦW{M*&QY6M5NxZ,:t:*,V״gpӁu24b7 7yβIYgd2KyCJL@|zRJ;s7! ę3g5s%]^ vwwS-{ٳg5zeu#I)K`XzO@9&^f2v>mB1!8QmbAJwwA\:H~Ayuh4Q]aQٳu3FgPǞ?cc퐌AH@0 6v]G)ipa;"v1;71W簳36E8c-0 W2cϪ`۞ǵWq iYjbȠti|xƒrl͉ *qݐ` 155D!_x,fdhA9 ]LxS2͂53qNT AA5,zӳ 9PvǀdM?c;fnM>;\裏}y‰EᔷfP0oa.O} ;# X=}eYQxumY6'N4>& ߸2/a?9f8vJqZYM!XzcmطMA<~AzM>g]mEck_oMM@ gM&GlLi* . 4ՅP$ j뤠LAx $PiCSU;I]@@)Yoq~y^Ik4K[B IDATRl~I4Ҋpx{*O>Ʃ[W{ X8J2|\j ^rS뢁k|w&vA8zqg!kw|RI9ӽ]ܿ}#o‹KS;Hυkؘ4ImVrA=9u=[Ob3/n\X9MK8Gae1W.OtRlh6;dDIs+SNDY zuCyI?ȢKMZLS_Ec`TFjY Y9 t4M5©ߧ.:$ӫN*ӓ= psc 'NyX__eYrD 6Uό&@رcNUx`;Ծx"zb)%j :.ͻ^ò, `ᛟw郫PccF*8c,I!+8vvvl6QTQ'Mϝ09w&S|sss ۃeYq{ط\/_F2A2)± ]Pb{ݖeE}麮?D7[(MqS;@8NvU%1Tf|Y ̪W9%7}K8Bp3x":GGgx%gK 937kX@V',pWn6 ,Gн*1&ݐ 5"1o X[[2jq_Vs ^HBߢmt!8(X߆cAZ2u'sXe> O@F>2&`{{~Q6|WmX,T*X,F'iQT*n(\~ {a ]L=s9iL ` &YD`ktyP(́xF<ق5ezSQo:k>?8W茿i^uЋ @ϒxE7L6^5@Ou]z? !ַ4Zu!]9[ MN@w?)xh6cΝ88~8c8y$.|3 -)%677!~CBJ ^@ET8X]^_?D?< ;V*:!\2^,#<<nRڵkc.pYGtɰ- bJj8u;q.È}-J, ^ilOM̘n$Blmn k׮RF{qp#8lF.~<pq4Mmض~`q8 U[w~??э 56nh灔22|:^xz=J%ضˋO៥]* ?>\aފ n;u >#p]ON> J3ub`͛FT_|v@f̲9@,ɨ RȲcѧ,&q:@˚$gc~go8x(x*F>baȄRι]T x:N.1țc>`uuW^.|d2;E8{n,jAEPcP{X9:6Gr<^X766Fn(q1>,AP\_g}>,89.S^ZZu] n)Z&󗿈otwmQa(O . l6N>ӧOsCc,{>o>*ss8q"67T) Uk8q?E4ڸȐe3>^:NVaaa;;;8y$ =7G9x?~ߍ|C#Ahz6(ZP!Ja)) GSilNGd٤0S,:p<+~#u'=mAeG  ;"v'a0]2л"h4[( ]ZЋ"r^ڵkz*8Jx3dz돛&'%b.ӎ8{8~8" zoH?Sw_@y XxR>_@B?xq'9H)FAJ;?<c{׿~HT OZt?8nvׂ1DhE.C.3BmpvDB q`9j^w8 ٶ &F~ԕJsssN^cww~J88~8,%xhb'!!ǂ3<(J8pl=P~k<mF32H8gMb%s;4}:7Jjz~f$(kMSY,R>Yʮd-.Y|g(xgOlqu )$$lq84DB` 7h!+qPg P*}ulooc8q1ŌjG^ N:Ϫ[\;cAq<<(2l'g<4LG `ĪF*M1W0>TIϤI8.!w݅; p\°\XͮT*XYYk4pmm kWlɓXXXb1zz>J/"oy؃CyckAs!C'j\.e{ク{˶QVpI.8Q|o./\.}OcpjcI3<2hA ;m ̞Qzz ,r, a_ƾf`RcGxDm\yg?3k}țû0Nsr1/F c88z(Ο?],--Vaɇܽ x~zCIN#\cV+r {eeh4XXX@VSpo{I5h{\>ڝ6Ν;Jbo؆ctlLdɄbpC _|yjԧ%&hP@V*nY=b۶QG{nkjZ>>P,{>t  2fx 9VJ /0Z6otp _~~/?7hwy'Ru|'8G!2e>H{M9}~wp K5e), fqSgte S LlS)Y0P_Ŭ鎾Ef< (>o'0`jSh4e8Oj?2}P/-|ΤO5c 4(i4aΟn>5D?zls=vU,-.^cye Z899G(h?z(Q.vc v]s[8y* vňdEc3#c1ڙO& 8){Un=B_.n6=z4 l4h5[+(h6<* 5a[?/1(z(<.(Jow7c:ڮ;;u]u;mEW(1NX8Tv}Ǘb+jAJv4{XYY8((c>[uk}=p^xngFt]ޤ" eXpgoᩝ>.\8f !%e_v}זŅ(1Nk/,,ȣ_ z^ Fs'LY1a?5鷇eY{Usbw^\&&9nQV!@>b_:1vh5[hۑ19(bt*!bp8PX^O9g)F-{84 4S<@Mq4Q `2I"U#D)[_&N @"|F`yxAų1*X?a{szߩ 4|"8vA? * .\ߵ/GVDYECVѣ7R3b=p8 n ZB>~ ;ѣ,+Js1T) Tőpo} {(cJ7d.6v:傱鍘?94vzq7qqOr o}-3|AryLf.AF;;;p=mayqOXE"0:y2LG@ڞ~_[!a0F2vw &Q\vBjSO=Kms!?V4̅8z(*_w<`)Z;Gzxp<><א0zv\?thyyi_8ׁlv0Aq:eGf`Әk]Y-5GiUʆD3u :4eZmlh@wrz,\ 1~䮪c \otA#jMut-Kx$&8Bsl.* 8$;6o?NO(`jz=t:pαSaAi5cwFňe϶q/;'Ҥ3Aň-XݧIỶ>vvv.z^̙3xB׃o(F>G:vz# p73!q~/G\.1ĞRT.akk V T1_]zѸ<E<dYXC !.KRh}ѣ v}0D0xyp /]`0m1N2 O}{Ov~NvNJp'|Ϝzzݮ?_=|u ( O "H-dZ}2{ .1ׁiO=^b lnxz `¢tp'doZ>{p9@ l@ 0?X'ŕ >1lێGJǏJgckwEXe?‹7{c,VBuZEF Η6yxrEla냟}Jexx-/1C0e> &}a~%7ck'p0?H" |gѷrt~l|(|.J(K|--y?NI.oXDC\C( /"{9z>6669Kcг`޷Hy+K҂%R0r=+ ѹ!"@WO,t|[yU YQo Ely( 66O"c(-o|;<\x27g pǢg\> \?F׋y #_yX{w{7J/^̵g4>Ž}ޏ YVdTX_^G( IDATWε7=)%Z,`ooV "G>ềd<2CWej0M6vF/c)Ćbp?;&ljU u!PtlocJNcw&bi$6+oPc.upkRr :Ca|2H/bN)64+&LfMҕ'DzМ& % 9mA5"2x tw]Xn89ɓ'RHhj*is+8糛##wD间@"lPc <灻 ,6(,`c(a;D+++p+}ϒǂix1^@8b{c \$wzOOJ$VVV0gZۉϝqwY4MhQ6z xݻ; Dc+E`EJLG>ibdzkG~PGĒRq!{tN.?>`plsj50ư2oNe Dt,$y (h;x"!*b䖁7~w2VJaaSu] HX[CbP+Puziߥ !8~4i[nw06J|pX_=,,-YD@spR" 4ڧsK'iO;6\5 BeT*oamm ^>N,mY^pdGXaG!JRtY[ W~^=ccj}./b 龺X.c~YNymlll/UJ fZ qcIki: 0Cl0 b'c^tXa}X4'10˂mE[dOb7$;=By,5/LYoDOB } %aC$ڡHupp=_&ǐM'\ۮ(?x4faa `exLp\"<M|<_z TWD/RJ M&K꿔~W:t\DjYAK Ԏנ{}IG15RJ,,,-ESZ N\ܤmD.t3ᑏ{owZvvGFb! ,XF% y[*Le ]/gI6 cR>"Rs$ $bG"qTta}(X,`GR`pRh\ ["6k3z7RJ&{(8@/1)& щrpGy~.3RJE,y(*mxϢtP)1} `9#c h O 4)B읡35rg)iu?tM13f(H޽5%mL^mE<=I07ٲz ,&g),Le>c(qu&f:<nf3!1nla]Y8r|.'~pU CJ% pnRک`ihS`b NkS _"B:XjG"{?S~22n5̌y }P^N'|Ow膌w8~'N H)cQLIu>eέE$ 1|RHql"loXw'OX^^ÿRJlZzzVW,v 0KiUBC#L$$lk{8Bwv#8߃gw(Iӟ|(*{ hQ*wyP,q|Ǣkyo*\/m2a2F\Bau0អs22]2Le%`lRfp-ɞV#ć-)FCq%B10FGJ>$p]N(^A7"fz L;Ϡ2 h*[[[RbnnP}֏n@xB~fZ!D:ϡ߁}+S ^¸ I#c=yԤ[Z]r(`Lg= gqs~!$(r>6\XX@bJ,,.T*.hqW^{{{vH&H"尼f1\v O<:+ sCV<OAehxp/9'"_Hs|>RTUT<v y^f!rܹyh]c{x?VB<yBK e%2 ձ`: >8U10ӓkx$5[uU_Mit&|1#\oBۍ@䆝1cemeò-,-.T |Ik> f;c;@ٌy!pUgVSp#b86*`aa=S2xJE7R,m{Xy/~|_ǎc {!%lvjP[^F҃*cc Z ?Iў%0Sa1`wr7.Dv{aBJ ;3c-R `0¶ض .])ѷ, \|\A p4|:.\X6cYU eXIZO_{Gr/}# D0 $ >_=?hZNh]G>oLD##U7b6a b6.(0T 'i,ݴ@q14=>pG;.\9lj6~G 8d{}\lln | Br Iy/ןɘJFp|.9 P% ]н!<3xiރ0ve ^usY_@s"n>v;J aپŋ{}?F-I*D(}|3*RLRvK #0$Fa_ѧaC0 аσ۱] yKŠ7Zet-@A^G.y8s : >5Q)S|$b*"Qҩ+L=}4O܇+g9R,_@k"nx ^7 6 W4|˾5MN]Ir,@=E/}o4(mL4$i8(g)w-4;Nи'0|6aYg⾔gdri ݆)'@o"5ƴ 4 HwoI2򷖖X>{{WXXXƇ`hY,>@p Cr0. On&ߝ g/hD5cw?lM So0>\c-TkU5j6۶Qq$zO|;~"y*Xے|c 'L127.C8 ⮫g|6b q|-cf-[^}+w6>Z>81 dE+Oa@3+`q)c2rÊ1 bmۆT'>'[ Wjaqq1ґd) NryB|BJ =jѣmKox7?w)НgJ=:M@ Oso(^{ُ`?]ض˱pli_,]89'm=ϣjJ?ˉ{ |71VӍ=/UႛD0Ŗ^:-iˀQ7i<F̸%`hǿл$W6){T[kI!q!) K?.j4%jU.b#m`g,_Y X "Ma|B)calG YmQԕ/'gl41/֮ 0f,TF,?'2yz(qaa{i<`,Q."0nv_=E99Ub͗Rŀv:]xh:#!ǂvLO0uKƮ.dGl8&gk7ĭمe1x^h)!I HJP*(.{R5vHưW9ZV4EF}ot; 'CuOnq89vw?¥c O3`%]I .(\@qDw^]x Xg\WTb*ss6^&P.v} >&~4q<_ji$tY^6a'fлljTi-SL 4$I4.*E'oϑ3}E_oݜbVpxca8qPV!8>X]]",BPjGL(cd`!8O՝&l \p$vww/!nqt[kG\' -T*u} EE_5J)>ȌQkl $[i9|Gpk Vh4B EB`^G<58j?51@Տ"c )SGO9sO%&1L" 1>|ruH{=뻐R|%4-XV~yl8P-,,sۖ( ]ɿk<ѹ4F VZ.#/ݽH:6N|78NNV(|w!ZBJp~|=] N)dlĭ?<|j2cp]<7t)4_q]'Rm}es6hY6a0L܉T2dI\ϒeS&׌x|ke A;vq%%xw 8;oM_;5W`D!W۲RbṾtZRn}׫~ӏX3v^^_%0΃T ˲;ڭ6"lfcRA??>e$0_u 0޼q70̺lBT2ݽ=l#σ1m>q 4z ИGNmX6HHj^&yVn1k~t:R/Dp˭zMgBD;O,,K0|\K\wW,Eo 6_FߛNNUs%Tɔ“8s!.2t7C8߉$ lvƌDܲPٙ;pN:VƯ@zZB팁|/H9* ,B/5>i{x:Vlq?-Ȳ,[kNwOߧo#ɲ- XH` ")EU!J!Tb} O(Dg)Y{pcf_βʅA8&3cc ']EY׺hlljn'kJ5Џ-zZMe;// 䳛0`ߧHֿ HhiZZҾm)K3F}\i l2y^/ 5d';Ni@P;tբ(Y<*:G+␞^7i:o.c_.Sh$.3kFاzg||V^;Y~ᐞ6mj\pG~ODe }8ʙK|#FLj<3E"zF*vA9kz>h02" ڗLlSǂ:^)%<'4xNH=ۢ߉5%P! [P`ݥ^R+Hd8Lq'qo[67#ڵw'? AzM@x '匩,E8#u%&S`Z6RK$ٟ*Ci @S-!Yn`[T䲥KiĒbM5$$*Nd{}sןG%,a{`Pء'<$EQbdh[`a}}ISSS'R=Cf8 Y7L:111 lmm019ڕF Ye%` ޛddzŦܵ?_t#e`affs|HpHIBQ xpH&ݴ.O]=/k%*4(~ &{+h1&Μchڨzs5HPnllyz; Œ5X/󲛆*@('{O3_]ilEjSSS?bCez,u[HJy n)f2(gffqj/rdVo {0' ,V>?547YdJIfԵ 6h[zF'hem8J[-2C(m.gT_ I! /+iY\7]Vp|;߳$Fz!DNMOh6ۃ8Gt\w)z0 >|,vvvqppQD^ɱ7ڏceD֑Xq9OeQ` Qannggg@4p&ԃ0 ]}6/9ٝ;d,V0St^@J9,s&^ o 1{Itv` 2Vj`sy̝+vvv< 3̷ sgQxRnem=ln+ hM2dM[KsM)hX,@y1˦i9AxsN?u/i1).iپX( VW="GUʌAz Ǭ}~tK)кdJ=IC9>xnMs%$q`)cʟ|.9.~Aafٍ7&joLb0:: !6^}U8<<ϟy~:~lF;}OT=ϺZqsol,?X|`g>r{ 1cvfffu/qq {*9jAgqm^Y}q4]|`: KxwLxsl)T0~ aor(!cw↫v RY6M;nmiβTȲIwSP]P4c !$ dld&򄇉1 CpM{`m*?웶D-l jfy,[z܌Ka,1??(Fư0Ubvv㘝'?Yzze~^1z s3 AHAf0f)M}se8s QLywr`_{8{l6Ժ>j##;Z-eQarrQe U< XYYAs}o]< ~gAJ)=V-W_Jғ(077}b bgC5;S=qFk#~_4T Œ R=G=;/CxS)qU Z+չic8>`1X)AQ`{o 򮶆ۀaʦrHրzU ;M鼠Zu,Em=gyEjm jIx?q3A XGhQPUTpƲN<8AhE󶈣=Ϣ(1  Adj>Ix?Q'@4 {/676q5>R,ҚCݢ̙3 z>|C׿uK122Ww~7|G-ro@y °YDs5~(.1|K7|jj*qZٳxq ;s{3ڒE0VJ#Ad#HE c.|/0fܚKIApܠ - LCdԥ /:lu7)bqJ8[0NG7@+cp؂p#UDdyE6- ڦk4TQ%n$4a  vM9uTc*[0 {0PTx3eg~}B3 xs^($$ja7n`###Iu>iZ޾:w;(8sK6Ν;1L_EGOI43Whn(=)xG@]eC=Ga1DQEIfSyCFTO91%뱀sCB`=/gW߹z;*籼 ƀ7xo S81 bx**p2Sĩ{"W?q4{^|/|۸{DZ'~y#.yy 0 c",E!D$YBq>]x1Ty),( r90aOq\3PG V+m&vk3 SY˸imPR͋n(:,Ln2ϻ`G Cx08F 3G 蹗)pPn'qd C0qg*`ŸQ!ʚ

p< iw Ht-qYbƎ( юۀdjL 6UXqzuH9N]& 2Y:w 7YucHi*m *9 nPI+ˠc  AOGQ ICE4"[-  Bc<0Na" `ibbC\1,#z2VWW!"8~:pws9 wY}dgEQf.!g1;3++똘_":MH?ʟRsciǐ,QvQE1@K_8/og9E5-)ߝue e^4 EB}e f`w<) őZ q'FGtwbı1`TĶ[`c}7nf3`remm W\ _sCӏCi.0Љc QЂ PƉ{HA1|G\rO= Hv?<a{åK/`}}=}, =x, B&b=WoI gԨm`$=$"mr]1: NpLU.n gpR,&˟rP k QV3VfE$lM1S)V7 (U9) sEa#&bիx'QQ(9 JD^|^l6H*.Od1kds`"w|[[X[[˗/BQ,,.3h~h<0Yb/=8z B(BXs=[똝E ߼_0 l6!lc |_͒ CBt hǸz _җյSh)M;Xu 7VVSOe 5#-EAi177dww:]]? &ڳY(Docu|+_QO|U{[Me3־p/d|/_FR׿q,.-a㟂C( h`B`ss 7o/f7n~fX N5(17 %pkm W'xoxѸdSޤ}gj8TeT˲yzmz @|7g46J[dٌj5G F;;;V1;;Ob#GQ!qtt[\yl wA0buu+7VCVߏёQox͊9u k2CYUP\c?Sܒz@1.D^뜍q) x C" x 8G~cu ,fOmLAQyԄ%Z-e`fM_!bgɒr2EK!(BV(`O`s,bZ~7oD9,o$?f )%;]~* Cl歑+xORv;ޱ<+v_a~<7V$3iٻם~0`Bql={CC@K&I p J@ܶ}lRw"˦tݘe:GL yX> xnw3cKi'j5Q)Ο_ǒnq?M:nb W,ӓӘ < {\mu7}0Q~{ccC\y43nM),"nַ)V :ٟ\-I Mj58fX^><D:7Xʂimi6 `#߉XXӹ~]֠ޱSg&I oa3Y__Qo~s.ZTQPΩأBHV#}/bߍs? 099I<Ѓ:_\\Ľ6㥒p?E…+;٭ cazIDATl ע>d,p9,..~"qX&ݗ$Wt0MΆ3 iʲIyڲlڲP'm4e,(0>nZ2|98:R@4 `z9Er."p0PDJV q f @<-((UV/V@ 0 vԭ֭[>>O>ukQCg)BՂu3g2ưp,V7 9u ۆ B%ʉ gjIlSߡSBl%,8ic$NQqPn%Ƒ=i$1= tVK%i68j6qTzzf{~G>NǕrSg2_SUWVX`|`":N7+k^TFFF)uTj$cW{$j#rF߀?j)ˎ'`u@${snPcث7!>*S G,_y/=XS_!0dOCr7E/`|qSH*zյn޲uAg/zI4 :(Kr=魓dD@8D`9`a]Xz?xA8 ^{<54Mz^ S yjѠRX2=F߇?8JnƙxCa'~47qcMVLj~@yxI  *aъiɡw6{ZQMvoMkYdh`){c5TgTSP@]txA!ne )>e*5HL>T au0mf_Fi0Y)adk@a2 & nP6RhUu}B(w꾮{Jœd0 ,SU! C[~7&c: %̄eN9yq^ɪΡPe<& $S“̲ b۝[ֲns;UeMSLŏ$=U>t[i W-8oeق8;[{ ,Mg4XQ)mʫbξ8l2IδaAА1oZt~G;e29DMV*း-/VEeHݮ,>&,\E͆~*:ՊIHԎZ K62:oNe%3)fqʐ+Iiض m5q0elc87Ӕ]tq.랣๩uL<:rcQ^?n+lޡ_ѡ7~OX [oo^ˎ`#͙&,{ޜ(&$'R&i62JS4HsfC /fiH&w])ϙ6,ZEm m@}GKX"|rWmy6͐O,3qҰ`4W.&f&Ac@>U@1#Dy}^HB֏oGPGؖ b(9oL r_fMQT7,Pd*%N.<@DT! NIC* mRtQc 5yIZmw?PlT(k@8 *e~eRci{5oVA+COh{i)V1[*CJL3a'n̸)@2Uw~J}QVkRt_)0l7U{&%Iq&Mn*e' :`ˀd[Df T )CI^ nЩ( MɢڀX[~2+ˁʃnLQl:(0?rP\a XEJ;VK+ M@R&&@  PRbOj!9lSeJmlUe((V:I9A6ֲ "7.gvQ&0=̼żsdلDM 0.˦~~f<|kml6'e|PO4w"2*@ItRͲiЕqlQa0I|t[o1lS(g>LDnu( ut'g؉\T;*C;mB( )J`˔2 š `RRxoG"=d9e[p^nTtSۆyc3܇f=Phu$ 进T`3MxpIDIcc>,TpoӒe6etmD!&$lb˔ &8 Hg%= 6;( aLuV˰5^UɁNsb^̜JUn|e+1>,WPr@ҷ\LBeXeM .CehrʲI$lUdټ7m lR2ǔesX_ 0@6ů Ney/R0<& b[:J;jO*K6J~rLId7X2grT4C^m0Zl9t6&nևd=qSldٴͮ b5^.&c*گ;e mXӞf|P^&i0a@ H2 *2}w&Z՜*T7*baR2INwTg ӆDX˨ 4=EXm]Vx߅%z:)aJ"2&i'sݴ!ۤ-*'M@5(PUFH x,S'Vla#F1T1}]9L Y,>׽kgvrq6xp`wK`7K)9L8E>sg])sĉ'I`aw @ە_(:qI) N܉'N=kky;˷'N8qĉ'eD3|_||;qĉ'N8qRJ <<|7Cĉ'N8qɰ '+og^SIvϷ'N8qĉ'Հ8Q~ po'N8qĉ'NBY`&Ϸ'N8qĉ'' {x?; 3IENDB`qsstv_9.2.6/qsstv/icons/replay.png0000664000175000017500000000261113203343610015722 0ustar jomajomaPNG  IHDRĴl;sBIT|d@IDAT8K\WsϹwtgl$1X2ɎdQb) EbAXX%A(!<"I`m=}p6r %S;25-7dqtѴ# &|\x܃TϔϽ]>.42]# ^8ۚvo~ிV8_`.6ˋW;wJ'ZEY#;涛_Cǽ[_8l[*3w䫯zO4qMJQ݈߭\ý۫?yk{ wz+?ٱ/++dY>*I4›!J@*AB3El3$NxI0}Ɨsg+OdlAo8?!7|MC10W)mV;k+@$U9s|e 0Q!O̗iT*fad"CfrI( wg{4{ŧhmprv瞪3StH tJdl&s4M8>gK_:,egOUU5j%Bc b1 qaAsyD2rS]>)ӅFpY-ؚF[I^o/L}O#CQpl/MY|=@F#-(r;b0IHWrtC^6O ,9TeOn?RГ1ٷâvQMYJ <>sY֐mIPw^b /PxFkM%rP`^;$ݙpBJE3hAxq 4@ܷ"!&3mm#|N^LM3hq{`}3P؆00E f22qrf͇_.Q-GLeqIjtHEe !d'-h+)< u[a > ;'$2JZ]Vx泔Bt;ni1_]I!4 Ub\Im?2CIt-ԣx+~@#6ZGWXi:LUH$1uۭ=fjf\XNtG7Ʋm0sՆ9.ŦmI.߬cbY,T̕܉ќ,\ljBE0j_[TĔ)@ť:YVT*эhq?ȈRS{8Gր/0FT*4oţ +9* Q()tIU;2PՌeAnZEIENDB`qsstv_9.2.6/qsstv/icons/stop.png0000664000175000017500000000214213203343610015412 0ustar jomajomaPNG  IHDRĴl;bKGD pHYs mtIME  yAIDATxڝۏSE?3ҞnO^,٘B$ QLi ONB|AL4&BE,ݬ-K9gƇ˂o.7CT80m^ *)ЀЪl)rAkCہ="#TBEG )Lo>7=ʮȵIF8V̥Z+ܜ5@E)Kd>r agvn}m.ЬZ?U ͈c?]%TgcpL?Mg2}xEs %R01ټb=wU(Jz ۶ ֮mIz㞢*Fk! 7e?oÝ3uX,H~婡#v*`%z90|kSѝyo3_7 '-ޓHf lbh4ЏThwb,[wWџM`55Y%%y}c?H$-q_&C+z绲 q ayH!)+RH)V4{!@&pNc1\Gktx94An{ЊKH5ĝQD2pVcdtAZei)Lӭ)˼R%ی2\7@qN˭tG*!!RQi:ɓ_}ԙhf}n S'}S4iPwcO@(J;!(oxl aͻۤ}'\j19;3 VѨrMlKb_ oܠmTjqtM 1_/LcYxF*Z?["vR8)rez<DYFŵR 'Q7 8aO`kr xDY\!"kIENDB`qsstv_9.2.6/qsstv/icons/text.png0000664000175000017500000000100513203343610015406 0ustar jomajomaPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8=K+A$`ER tr[VnBl%+?+f9Cr3ÙQ"2˛w j\#B0wDc"=EQE$@.[86h:p&";0FIPIn3Q'ZZq8sn$Z-5U*( n6}4N }9`kNcJŃzrB_nwZj0vrƘ?Ǿ׵q_MU_O~w6'R*^ / Jj)@ /CP,"(A)S@>x5u>~o{A`1IENDB`qsstv_9.2.6/qsstv/icons/tone.png0000664000175000017500000000054613203343610015400 0ustar jomajomaPNG  IHDRͭ'sBIT|dIDAT8=KA@]J1  ?@K6vV +AJ!.U%E. 80}1 ؆|'耗8/`\,oJI:}h?BQlXe͝ןːsK9{{Bj'h5mٔ0ct]hd^c ZXـ(3a^$vZn5\LRh192"TO~{ogIENDB`qsstv_9.2.6/qsstv/icons/transparency.png0000664000175000017500000000023013203343610017132 0ustar jomajomaPNG  IHDRw=bKGD pHYs  tIME ,3j*%IDATHA0|J ԧg@ 7 - IENDB`qsstv_9.2.6/qsstv/icons/up.png0000664000175000017500000000142313203343610015052 0ustar jomajomaPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@11   @:7^Uw 0 P?Ó?ŁXΠP1یaG<'s1833`\\ {p6n#WSZ{VϿF6P 632aRC5_͎ǭ2ܟ3p|6 % v G70N<{"gOu@M ʛ00?mF⫯ oD8O6z#@1õ ̼ ̬x= 4o ^=c`:o&#0hG,HS:30؀pV}.DyXSFQbx ߟ޽ F鿾~g~# 6z`RQ2 "S@@Af1@`2kIENDB`qsstv_9.2.6/qsstv/icons/whatsthis.png0000664000175000017500000000033013203343610016440 0ustar jomajomaPNG  IHDRIDAT픱0Dqw+\6&;3ZP~#̭(%9} 2f}Y`. TN6]sGPrb ?Qz3ź9 nѮ)%] í po~t|M{.IENDB`qsstv_9.2.6/qsstv/logbook/logbook.cpp0000664000175000017500000000407513203343610016407 0ustar jomajoma#include "logbook.h" #include "appglobal.h" #include "xmlrpc/xmlinterface.h" #include "xmlrpc/ipcmessage.h" #include "configparams.h" #include "rig/rigcontrol.h" #include slogParam logParamArray[NUMLOGPARAMS]= { {"program","QSSTV 9"}, {"version", "1"}, {"date","" }, {"time","" }, {"endTime","" }, {"call","" , }, {"mhz","" }, {"mode","" }, {"tx","" }, {"rx","" }, {"name","" }, {"qth","" }, {"state","" }, {"province","" }, {"country","" }, {"locator","" }, {"serialout","" }, {"serialin","" }, {"free1","" }, {"notes","" }, {"power","" } }; // to be independent from localization QString monthArray[12]= { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; logBook::logBook() { ipcQueue=new ipcMessage(1238); } void logBook::logQSO(QString call,QString mode,QString comment) { int i; QDateTime dt(QDateTime::currentDateTimeUtc()); QString tmp; getFrequency(); if(frequency!=-1) setParam(LFREQ,QString::number(frequency/1000000.,'g',9)); setParam(LCALL,call); setParam(LNOTES,comment); tmp=QString::number(dt.date().day())+" "+monthArray[dt.date().month()-1]+" "+QString::number(dt.date().year()); setParam(LDATE,tmp); tmp=QString::number(dt.time().hour()*100+dt.time().minute()).rightJustified(4,'0'); setParam(LTIME,tmp); setParam(LENDTIME,tmp); setParam(LMODE,mode); setParam(LNOTES,comment); tmp.clear(); for(i=0;isendMessage(tmp); } void logBook::getFrequency() { frequency=-1; if(rigControllerPtr->params()->enableXMLRPC) // we get the frequency from flrig or alike { frequency=xmlIntfPtr->getFrequency(); } else if(rigControllerPtr->params()->enableCAT) // we get the frequency from hamlib { if(!rigControllerPtr->getFrequency(frequency)) { frequency=-1; } } } void logBook::setParam(eIndex tag,QString value) { logParamArray[tag].val=value; } qsstv_9.2.6/qsstv/logbook/logbook.h0000664000175000017500000000102513203343610016044 0ustar jomajoma#ifndef LOGBOOK_H #define LOGBOOK_H #include class ipcMessage; #define NUMLOGPARAMS 21 struct slogParam { QString tag; QString val; }; class logBook { public: enum eIndex {LPROG,LVER,LDATE,LTIME,LENDTIME,LCALL,LFREQ,LMODE,LTX,LRX,LNAME,LQTH,LSTATE,LPROV,LCNTRY,LLOC,LSO,LSI,LFREE,LNOTES,LPWR}; logBook(); void logQSO(QString call, QString mode, QString comment); private: void getFrequency(); double frequency; void setParam(eIndex tag,QString value); ipcMessage *ipcQueue; }; #endif // LOGBOOK_H qsstv_9.2.6/qsstv/mainwidgets/gallerywidget.cpp0000664000175000017500000001241613203343610020473 0ustar jomajoma#include "gallerywidget.h" #include "ui_gallerywidget.h" #include "configparams.h" #include "utils/logging.h" #include "appglobal.h" #include #include "dispatch/dispatcher.h" #include #include #include "txwidget.h" galleryWidget::galleryWidget(QWidget *parent) : QWidget(parent), ui(new Ui::galleryWidget) { ui->setupUi(this); ui->tabWidget->setCurrentIndex(0); ui->templateMatrix->setSortFlag(QDir::Name); } galleryWidget::~galleryWidget() { writeSettings(); delete ui; } void galleryWidget::init() { readSettings(); } void galleryWidget::changedMatrix() { changedMatrix(imageViewer::RXSSTVTHUMB); changedMatrix(imageViewer::RXDRMTHUMB); changedMatrix(imageViewer::TXSSTVTHUMB); changedMatrix(imageViewer::TXDRMTHUMB); changedMatrix(imageViewer::TXSTOCKTHUMB); changedMatrix(imageViewer::TEMPLATETHUMB); } void galleryWidget::slotDirChanged(QString dn) { if(dn==txStockImagesPath) { ui->txStockMatrix->changed(); } if(dn==templatesPath) { ui->templateMatrix->changed(); txWidgetPtr->setupTemplatesComboBox(); } } void galleryWidget::changedMatrix(imageViewer::thumbType itype) { switch(itype) { case imageViewer::RXSSTVTHUMB: ui->rxSSTVMatrix->init(galleryRows,galleryColumns,rxSSTVImagesPath,imageViewer::RXSSTVTHUMB); break; case imageViewer::RXDRMTHUMB: ui->rxDRMMatrix->init(galleryRows,galleryColumns,rxDRMImagesPath,imageViewer::RXDRMTHUMB); break; case imageViewer::TXSSTVTHUMB: ui->txSSTVMatrix->init(galleryRows,galleryColumns,txSSTVImagesPath,imageViewer::TXSSTVTHUMB); break; case imageViewer::TXDRMTHUMB: ui->txDRMMatrix->init(galleryRows,galleryColumns,txDRMImagesPath,imageViewer::TXDRMTHUMB); break; case imageViewer::TXSTOCKTHUMB: ui->txStockMatrix->init(galleryRows,galleryColumns,txStockImagesPath,imageViewer::TXSTOCKTHUMB); break; case imageViewer::TEMPLATETHUMB: ui->templateMatrix->init(galleryRows,galleryColumns,templatesPath,imageViewer::TEMPLATETHUMB); break; default: break; } } /*! reads the settings (saved images for tx,rx,templates) */ void galleryWidget::readSettings() { QSettings qSettings; qSettings.beginGroup ("Gallery"); splashStr+=QString( "Loading RX images" ).rightJustified(25,' ')+"\n"; splashPtr->showMessage ( splashStr ,Qt::AlignLeft,Qt::white); qApp->processEvents(); ui->rxSSTVMatrix->init(galleryRows,galleryColumns,rxSSTVImagesPath,imageViewer::RXSSTVTHUMB); ui->rxDRMMatrix->init(galleryRows,galleryColumns,rxDRMImagesPath,imageViewer::RXDRMTHUMB); splashStr+=QString( "Loading TX images" ).rightJustified(25,' ')+"\n"; splashPtr->showMessage ( splashStr ,Qt::AlignLeft,Qt::white); qApp->processEvents(); ui->txSSTVMatrix->init(galleryRows,galleryColumns,txSSTVImagesPath,imageViewer::TXSSTVTHUMB); ui->txDRMMatrix->init(galleryRows,galleryColumns,txDRMImagesPath,imageViewer::TXDRMTHUMB); ui->txStockMatrix->init(galleryRows,galleryColumns,txStockImagesPath,imageViewer::TXSTOCKTHUMB); splashStr+=QString( "Loading Templates" ).rightJustified(25,' ')+"\n"; splashPtr->showMessage ( splashStr ,Qt::AlignLeft,Qt::white); ui->templateMatrix->init(galleryRows,galleryColumns,templatesPath,imageViewer::TEMPLATETHUMB); } /*! writes the settings (saved images for tx,rx,templates) */ void galleryWidget::writeSettings() { QSettings qSettings; qSettings.beginGroup ( "Gallery" ); qSettings.endGroup(); } /*! setup of the user interface */ /*! closeEvent signals the dispatcher to initiate program exit. */ /*! get the filename of a template \param[in] tm index of template \return QString containing filename, check with QString.isNull for validity */ QString galleryWidget::getTemplateFileName ( int tm ) { int i; QString str; QStringList slTemp; if(tm>=0) { for(i=0;itemplateMatrix->getFileList().count();i++) { str=ui->templateMatrix->getFileList().at(i).absoluteFilePath(); slTemp.append(str); } slTemp.sort(); return slTemp.at(tm); } else return QString(); } const QStringList &galleryWidget::getFilenames() { QString str; sl.clear(); int i; for(i=0;itemplateMatrix->getFileList().count();i++) { str=getTemplateFileName (i); QFileInfo fi(str); sl.append(fi.baseName()); } return sl; } /*! loads an image in the rximages gallery in a new position \param[in] fn the filename */ void galleryWidget::putRxImage ( QString fn ) { if(transmissionModeIndex==TRXSSTV) { statusBarPtr->showMessage ( "Saved: "+fn ); ui->rxSSTVMatrix->changed(); } else { statusBarPtr->showMessage ( "Saved: "+fn+QString(" (%1dB)").arg(lastAvgSNR,0,'f',0) ); ui->rxDRMMatrix->changed(); } } void galleryWidget::txImageChanged() { if(transmissionModeIndex==TRXSSTV) { ui->txSSTVMatrix->changed(); } else { ui->txDRMMatrix->changed(); } } void galleryWidget::txStockImageChanged() { ui->txStockMatrix->changed(); } /*! loads an image in the rximages gallery in a new position \return QString containing filename, check with QString.isEmpty for validity */ QString galleryWidget::getLastRxImage() { return ui->rxDRMMatrix->getLastFile(); } qsstv_9.2.6/qsstv/mainwidgets/gallerywidget.h0000664000175000017500000000143413203343610020136 0ustar jomajoma#ifndef GALLERYWIDGET_H #define GALLERYWIDGET_H #include #include "imageviewer.h" #define NUMTHUMBS 12 namespace Ui { class galleryWidget; } class galleryWidget : public QWidget { Q_OBJECT public: explicit galleryWidget(QWidget *parent = 0); ~galleryWidget(); void init(); void writeSettings(); void readSettings(); void changedMatrix(); void changedMatrix(imageViewer::thumbType itype); void putRxImage(QString fn); void txImageChanged (); void txStockImageChanged(); QString getTemplateFileName(int); const QStringList &getFilenames(); QString getLastRxImage(); public slots: void slotDirChanged(QString); private: Ui::galleryWidget *ui; QStringList sl; }; extern galleryWidget *galleryWidgetPtr; #endif // GALLERYWIDGET_H qsstv_9.2.6/qsstv/mainwidgets/gallerywidget.ui0000664000175000017500000000737013203343610020331 0ustar jomajoma galleryWidget 0 0 516 364 Form 1 1 1 1 1 0 0 8 4 RX SSTV 30 40 441 261 RX DRM 9 9 492 314 TX SSTV 20 20 451 301 TX DRM 110 90 120 80 TX Stock 150 120 120 80 Templates 9 9 492 314 imageMatrix QWidget

imagematrix.h
1 qsstv_9.2.6/qsstv/mainwidgets/rxfunctions.cpp0000664000175000017500000000732513203343610020215 0ustar jomajoma#include "rxfunctions.h" #include "appglobal.h" #include "configparams.h" #include "drmrx.h" #include "soundbase.h" #include "dispatcher.h" #include "rxwidget.h" #include "sstvrx.h" #include const QString rxStateStr[rxFunctions::RXINIT+1]= { "IDLE", "RUNNING", "RESTART", "INIT" }; rxFunctions::rxFunctions(QObject *parent) : QThread(parent) { rxState=RXIDLE; sstvRxPtr=new sstvRx; drmRxPtr=new drmRx; rxBytes=0; setObjectName("rx-thread"); } rxFunctions::~rxFunctions() { delete sstvRxPtr; delete drmRxPtr; } //static DSPFLOAT dummyBuf[RXSTRIPE]; void rxFunctions::run() { int count; DSPFLOAT tempBuf[RXSTRIPE]; unsigned int volBuf[RXSTRIPE]; abort=false; while(!abort) { switch(rxState) { case RXIDLE: msleep(200); break; case RXRUNNING: if((count=soundIOPtr->rxBuffer.count())isCapturing()) { // qDebug() << " not capturing"; switchRxState(RXINIT); } } else { // addToLog("Load new buf",LOGPERFORM); rxBytes+=RXSTRIPE; // addToLog(QString("rxBytes=%1").arg(rxBytes),LOGRXFUNC); soundIOPtr->rxBuffer.copyNoCheck(tempBuf,RXSTRIPE); soundIOPtr->rxVolumeBuffer.copyNoCheck(volBuf,RXSTRIPE); displayFFTEvent* ce = new displayFFTEvent(tempBuf); // addToLog("fft display start",LOGPERFORM); // ce->waitFor(&done); QApplication::postEvent(dispatcherPtr, ce); // while(!done) {usleep(100);} addToLog("fft display done",LOGPERFORM); switch (transmissionModeIndex) { case TRXDRM: addToLog("drmRxPtr->run",LOGPERFORM); drmRxPtr->run(tempBuf); break; case TRXSSTV: sstvRxPtr->run(tempBuf,volBuf); break; case TRXNOMODE: switchRxState(RXIDLE); break; } } break; case RXINIT: forceInit(); switchRxState(RXIDLE); break; case RXRESTART: { init(); switchRxState(RXRUNNING); } break; } } abort=false; rxState=RXIDLE; } void rxFunctions::stopThread() { abort=true; if(!isRunning()) return; while(abort) { qApp->processEvents(); } } void rxFunctions::init() { switchRxState(RXINIT); } void rxFunctions::forceInit() { if(transmissionModeIndex==TRXDRM) { drmRxPtr->init(); } else { sstvRxPtr->init(); } } void rxFunctions::stopAndWait() { if(soundIOPtr) soundIOPtr->idleRX(); switchRxState(RXINIT); if(!isRunning()) { return; } while((rxState!=RXIDLE) && (isRunning())) { qApp->processEvents(); } } void rxFunctions::restartRX() { switchRxState(RXRESTART); } void rxFunctions::startRX() { switchRxState(RXRUNNING); } void rxFunctions::eraseImage() { if(isRunning()) { if(transmissionModeIndex==TRXDRM) { drmRxPtr->eraseImage(); } else { sstvRxPtr->eraseImage(); } } } void rxFunctions::switchRxState(erxState newState) { addToLog(QString("%1 to %2").arg(rxStateStr[rxState]).arg(rxStateStr[newState]),LOGRXFUNC); rxState=newState; } #ifndef QT_NO_DEBUG unsigned int rxFunctions::setOffset(unsigned int offset,bool ask) { return sstvRxPtr->setOffset(offset,ask); } #endif qsstv_9.2.6/qsstv/mainwidgets/rxfunctions.h0000664000175000017500000000151013203343610017650 0ustar jomajoma#ifndef RXFUNCTIONS_H #define RXFUNCTIONS_H #include #include "appdefs.h" #include "sstv/syncprocessor.h" #include "utils/buffermanag.h" class downsampleFilter; class iirFilter; class modeBase; class sstvRx; class drmRx; class rxFunctions : public QThread { Q_OBJECT public: enum erxState {RXIDLE,RXRUNNING,RXRESTART,RXINIT}; explicit rxFunctions(QObject *parent = 0); ~rxFunctions(); void run(); void init(); void stopAndWait(); void startRX(); void restartRX(); void eraseImage(); QString getModeStr(); sstvRx *sstvRxPtr; void stopThread(); #ifndef QT_NO_DEBUG unsigned int setOffset(unsigned int offset,bool ask); #endif private: drmRx *drmRxPtr; bool abort; erxState rxState; void switchRxState(erxState newState); uint rxBytes; void forceInit(); }; #endif // RXFUNCTIONS_H qsstv_9.2.6/qsstv/mainwidgets/rxwidget.cpp0000664000175000017500000002033713203343610017466 0ustar jomajoma#include "rxwidget.h" #include "appglobal.h" #include "dispatcher.h" #include "dirdialog.h" #include "rxfunctions.h" #include "imageviewer.h" #include "sstvparam.h" #include "filterparam.h" #include "mainwindow.h" #include "soundbase.h" #include "vumeter.h" #include "sstvrx.h" #include "guiconfig.h" #include "mainwindow.h" #include "configparams.h" #include "ftp.h" rxWidget::rxWidget(QWidget *parent):QWidget(parent),ui(new Ui::rxWidget) { int i; ui->setupUi(this); rxFunctionsPtr=new rxFunctions(); ui->syncWidget->setHorizontal(false); ui->syncWidget->setLabelText("S"); ui->vuWidget->setHorizontal(true); ui->vuWidget->setLabelText("V"); imageViewerPtr=ui->imageFrame; ui->sstvModeComboBox->addItem("Auto"); for(i=0;isstvModeComboBox->addItem(getSSTVModeNameLong((esstvMode)i)); } foreach (QByteArray format, QImageWriter::supportedImageFormats()) { QString text = tr("%1").arg(QString(format)); ui->defaultImageFormatComboBox->addItem(text); } connect(&rxFunctionsPtr->sstvRxPtr->syncWideProc,SIGNAL(callReceived(QString)),SLOT(slotNewCall(QString))); connect(rxFunctionsPtr->sstvRxPtr,SIGNAL(resetCall()),SLOT(slotResetCall())); connect(ui->logPushButton,SIGNAL(clicked()),SLOT(slotLogCall())); connect(ui->whoPushButton,SIGNAL(clicked()),SLOT(slotWho())); notifyRXIntf = new ftpInterface("RX Notification FTP"); } rxWidget::~rxWidget() { writeSettings(); rxFunctionsPtr->terminate(); delete rxFunctionsPtr; delete notifyRXIntf; } void rxWidget::init() { splashStr+=QString( "Setting up RX" ).rightJustified(25,' ')+"\n"; splashPtr->showMessage ( splashStr ,Qt::AlignLeft,Qt::white); qApp->processEvents(); readSettings(); // imageViewerPtr->createImage(QSize(320,256),QColor(0,0,128),imageStretch); imageViewerPtr->createImage(QSize(320,256),imageBackGroundColor,imageStretch); imageViewerPtr->setType(imageViewer::RXIMG); setSettingsTab(); rxFunctionsPtr->init(); // make connections after initialization connect(ui->startToolButton, SIGNAL(clicked()),SLOT(slotStart())); connect(ui->stopToolButton, SIGNAL(clicked()),SLOT(slotStop())); connect(ui->resyncToolButton,SIGNAL(clicked()),SLOT(slotResync())); connect(ui->autoSlantAdjustCheckBox,SIGNAL(clicked()),SLOT(slotGetParams())); connect(ui->squelchComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotGetParams())); connect(ui->settingsTableWidget,SIGNAL(currentChanged(int)),this, SLOT(slotTransmissionMode(int))); connect(ui->eraseToolButton, SIGNAL(clicked()),SLOT(slotErase())); connect(ui->saveToolButton, SIGNAL(clicked()),SLOT(slotSave())); if(slowCPU) { ui->drmFACLabel->hide(); ui->drmMSCLabel->hide(); ui->drmMSCWidget->hide(); ui->drmFACWidget->hide(); } if(slowCPU || lowRes) { ui->rxNotificationList->hide(); ui->whoPushButton->hide(); // ui->whoSpacer->hide(); } } void rxWidget::readSettings() { QSettings qSettings; qSettings.beginGroup("RX"); useVIS=qSettings.value("useVIS",false).toBool(); autoSlantAdjust=qSettings.value("autoSlantAdjust",false).toBool(); autoSave=qSettings.value("autoSave",true).toBool(); squelch=qSettings.value("squelch",1).toInt(); // filterIndex=qSettings.value("filterIndex",0).toInt(); sstvModeIndexRx=(esstvMode)qSettings.value("sstvModeIndexRx",0).toInt(); defaultImageFormat=qSettings.value("defaultImageFormat","png").toString(); minCompletion=qSettings.value("minCompletion",25).toInt(); setParams(); qSettings.endGroup(); } void rxWidget::writeSettings() { QSettings qSettings; qSettings.beginGroup("RX"); getParams(); qSettings.setValue("useVIS",useVIS); qSettings.setValue("autoSlantAdjust",autoSlantAdjust); qSettings.setValue("autoSave",autoSave); qSettings.setValue("squelch",squelch); qSettings.setValue("sstvModeIndexRx",sstvModeIndexRx); qSettings.setValue("defaultImageFormat",defaultImageFormat); qSettings.setValue("minCompletion",minCompletion); qSettings.endGroup(); } void rxWidget::getParams() { int temp; getValue(useVIS,ui->useVISCheckBox); getValue(autoSlantAdjust,ui->autoSlantAdjustCheckBox); getValue(autoSave,ui->autoSaveCheckBox); getIndex(squelch,ui->squelchComboBox); getIndex(temp,ui->sstvModeComboBox); sstvModeIndexRx=(esstvMode)temp; getValue(defaultImageFormat,ui->defaultImageFormatComboBox); getValue(minCompletion,ui->completeSpinBox); } void rxWidget::setParams() { setValue(useVIS,ui->useVISCheckBox); setValue(autoSlantAdjust,ui->autoSlantAdjustCheckBox); setValue(autoSave,ui->autoSaveCheckBox); setIndex(squelch,ui->squelchComboBox); setIndex(sstvModeIndexRx,ui->sstvModeComboBox); setValue(defaultImageFormat,ui->defaultImageFormatComboBox); setValue(minCompletion,ui->completeSpinBox); } void rxWidget::slotGetParams() { getParams(); } void rxWidget::slotStart() { getParams(); dispatcherPtr->startRX(); } void rxWidget::slotStop() { getParams(); dispatcherPtr->idleAll(); } void rxWidget::slotResync() { rxFunctionsPtr->restartRX(); } void rxWidget::slotTransmissionMode(int rxtxMode) { emit modeSwitch(rxtxMode); } void rxWidget::changeTransmissionMode(int rxtxMode) { transmissionModeIndex=(etransmissionMode)rxtxMode; dispatcherPtr->idleAll(); setSettingsTab(); switch(transmissionModeIndex) { case TRXSSTV: mainWindowPtr->setSSTVDRMPushButton(false); ui->resyncToolButton->setEnabled(true); break; case TRXDRM: mainWindowPtr->setSSTVDRMPushButton(true); ui->resyncToolButton->setEnabled(false); break; default: break; } dispatcherPtr->startRX(); } void rxWidget::slotLogCall() { QString call; call=ui->callLineEdit->text().toUpper(); dispatcherPtr->logSSTV(call,false); } void rxWidget::slotNewCall(QString call) { ui->callLineEdit->setText(call); dispatcherPtr->logSSTV(call,true); } void rxWidget::slotResetCall() { ui->callLineEdit->clear(); } void rxWidget::slotErase() { rxFunctionsPtr->eraseImage(); imageViewerPtr->createImage(QSize(320,256),imageBackGroundColor,imageStretch); } void rxWidget::slotSave() { QDateTime dt(QDateTime::currentDateTime().toUTC()); //this is compatible with QT 4.6 QString path; QString info; dirDialog d(this); if(transmissionModeIndex==TRXSSTV) { path=rxSSTVImagesPath; } else { QMessageBox::information(this,"Saving image","Not available in DRM mode"); return; } info=""; QString fileName=d.saveFileName(path,"*","png"); if (fileName==QString::null) return ; getImageViewerPtr()->save(fileName,defaultImageFormat,true,false); dispatcherPtr->saveImage(fileName,info); } void rxWidget::slotWho() { dispatcherPtr->who(); } void rxWidget::setSettingsTab() { int i; if((transmissionModeIndex>=0)&&(transmissionModeIndexsettingsTableWidget->widget(i)->setEnabled(false); } ui->settingsTableWidget->widget(transmissionModeIndex)->setEnabled(true); ui->settingsTableWidget->setCurrentIndex(transmissionModeIndex); } ui->vuWidget->setMaximum(100); ui->vuWidget->setMinimum(0); ui->vuWidget->setValue(-15); if(transmissionModeIndex==TRXDRM) { ui->syncWidget->setColors(QColor(0,90,0),QColor(0,190,0),Qt::green); ui->syncWidget->setMaximum(25.); ui->syncWidget->setMinimum(5.); ui->syncWidget->setValue(0.); ui->vuWidget->setColors(QColor(255,50,0),Qt::green,Qt::red); mainWindowPtr->spectrumFramePtr->displaySettings(true); } else { ui->syncWidget->setColors(Qt::red,QColor(255,165,0),Qt::green); ui->syncWidget->setMaximum(10.); ui->syncWidget->setMinimum(0.); ui->syncWidget->setValue(0.); ui->vuWidget->setColors(QColor(255,50,0),Qt::green,Qt::red); mainWindowPtr->spectrumFramePtr->displaySettings(false); } } void rxWidget::startRX(bool st) { if(st) { getParams(); dispatcherPtr->startRX(); addToLog("starting rxfunction run",LOGRXMAIN); } else { dispatcherPtr->idleAll(); } } void rxWidget::setSSTVStatusText(QString txt) { ui->sstvStatusLineEdit->setText(txt); } vuMeter *rxWidget::vMeterPtr() { return ui->vuWidget; } vuMeter *rxWidget::sMeterPtr() { return ui->syncWidget; } qsstv_9.2.6/qsstv/mainwidgets/rxwidget.h0000664000175000017500000000345713203343610017137 0ustar jomajoma#ifndef RXWIDGET_H #define RXWIDGET_H #include #include #include "spectrumwidget.h" #include "ui_rxwidget.h" class rxFunctions; class imageViewer; class spectrumWidget; class vuMeter; namespace Ui { class rxWidget; } class rxWidget : public QWidget { Q_OBJECT public: explicit rxWidget(QWidget *parent = 0); ~rxWidget(); void readSettings(); void writeSettings(); void startRX(bool st); rxFunctions *functionsPtr() {return rxFunctionsPtr;} imageViewer *getImageViewerPtr(){ return imageViewerPtr;} // spectrumWidget *fftDisplayPtr() ; vuMeter *vMeterPtr(); vuMeter *sMeterPtr(); drmConstellationFrame *mscWdg() {return ui->drmMSCWidget;} drmConstellationFrame *facWdg() {return ui->drmFACWidget;} void setDRMStatusText(QString txt) { ui->drmStatusLineEdit->clear(); ui->drmStatusLineEdit->appendPlainText(txt); } void setDRMNotifyText(QString txt) { //ui->rxNotificationList->clear(); ui->rxNotificationList->setPlainText(txt); } void appendDRMNotifyText(QString txt) { ui->rxNotificationList->appendPlainText(txt); } // drmPSDFrame *psdWdg() {return ui->drmPSDWidget;} drmStatusFrame *statusWdg() {return ui->drmStatusWidget;} // int getFilterIndex(); void init(); void setSSTVStatusText(QString txt); void setSettingsTab(); void changeTransmissionMode(int rxtxMode); private slots: void slotStart(); void slotStop(); void slotResync(); void slotGetParams(); void slotTransmissionMode(int rxtxMode); void slotNewCall(QString); void slotResetCall(); void slotLogCall(); void slotErase(); void slotSave(); void slotWho(); signals: void modeSwitch(int); private: Ui::rxWidget *ui; rxFunctions *rxFunctionsPtr; imageViewer *imageViewerPtr; void getParams(); void setParams(); }; #endif // RXWIDGET_H qsstv_9.2.6/qsstv/mainwidgets/rxwidget.ui0000664000175000017500000010132513203343610017316 0ustar jomajoma rxWidget 0 0 1004 660 0 0 0 20 Ubuntu Mono 9 50 false false Form 1 1 1 1 1 1 Start receiver Status Start receiver ... :/icons/start.png:/icons/start.png Stop receiver Stop receiver ... :/icons/stop.png:/icons/stop.png Restart receiver Restart receiver ... :/icons/replay.png:/icons/replay.png Save image Save Image ... :/icons/filesave.png:/icons/filesave.png ... :/icons/eraser.png:/icons/eraser.png Qt::Horizontal 40 20 1 1 280 200 16777215 16777215 2 18 0 18 16777215 18 0 18 16777215 true 0 0 0 0 16777215 16777215 1 SSTV 1 0 0 0 0 1 Sensitivity - Higher is more sensitive Sensitivity - Higher is more sensitive Signals Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Default Image format Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Save image when complete Save image when complete Qt::RightToLeft Autosave Use VIS Code to start Use VIS Code to start Qt::RightToLeft Use VIS Normal DX Correct slant automatically Correct slant automatically Qt::RightToLeft Auto Slant Save if Complete (%) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Call: LOG QSO 0 0 QFrame::Panel QFrame::Sunken 2 Qt::Vertical 17 0 DRM 1 0 0 0 0 0 120 QFrame::StyledPanel QFrame::Raised 0 0 0 0 16777215 40 true 1 FAC Qt::AlignCenter 0 55 16777215 120 76 76 76 197 197 197 0 0 0 60 60 60 76 76 76 76 76 76 197 197 197 0 0 0 60 60 60 76 76 76 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 QFrame::Panel QFrame::Sunken 3 1 MSC Qt::AlignCenter 0 55 16777215 120 76 76 76 197 197 197 0 0 0 60 60 60 76 76 76 76 76 76 197 197 197 0 0 0 60 60 60 76 76 76 0 0 0 197 197 197 0 0 0 0 0 0 0 0 0 QFrame::Panel QFrame::Sunken 3 Qt::Vertical QSizePolicy::Expanding 20 95 Qt::Horizontal 40 20 Who is on? 0 0 0 20 16777215 16777215 0 0 Qt::NoContextMenu false Rx Notifications seen for the last DRM Hybrid Item. You usually only get a partial list due to timing, internet speeds, and the sender having read and deleted them already. QPlainTextEdit::NoWrap true 8 imageViewer QWidget
widgets/imageviewer.h
1
vuMeter QWidget
widgets/vumeter.h
1
drmStatusFrame QFrame
drmrx/drmstatusframe.h
1
drmConstellationFrame QFrame
drmrx/drmconstellationframe.h
1
qsstv_9.2.6/qsstv/mainwidgets/txfunctions.cpp0000664000175000017500000003353613203343610020222 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2014 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "txfunctions.h" #include "appglobal.h" #include "sstv/sstvtx.h" #include "sstv/cw.h" #include "configparams.h" #include #include "dsp/synthes.h" #include "sstv/modes/modes.h" #include "dispatch/dispatcher.h" #include "cw.h" #include #include #include "txwidget.h" #include "soundbase.h" #include "waterfalltext.h" #include "hybridcrypt.h" #include "rigcontrol.h" #include "drm.h" #include "drmtx.h" #include "fixform.h" #include "mainwindow.h" QMutex txMutex; int templateIndex; bool useTemplate; bool useCW; bool useVOX; const QString txStateStr[txFunctions::TXTEST+1]= { "IDLE", "ACTIVE", "SENDTONE", "SENDID", "SENDDRM", "SENDDRMPIC", "SENDDRMBINARY", "SENDDRMBSR", "SENDDRMFIX", "SENDDRMTXT", "SSTVIMAGE", "SSTVPOST", "RESTART", "PREPARESSTV", "PREPAREDRM", "PREPAREDRMBINARY", "TXTEST" }; txFunctions::txFunctions(QObject *parent) : QThread(parent) { txState=TXIDLE; started=false; sstvTxPtr=new sstvTx; drmTxPtr=new drmTx; } txFunctions::~txFunctions() { delete synthesPtr; delete sstvTxPtr; delete drmTxPtr; } void txFunctions::init() { synthesPtr=new synthesizer(txClock); switchTxState(TXIDLE); addToLog("txFunc: Init",LOGTXFUNC); drmTxPtr->init(); } void txFunctions::run() { double waterfallTime; QString startWFTxt,endWFTxt; abort=false; init(); while(!abort) { started=true; switch (txState) { case TXIDLE: msleep(10); break; case TXACTIVE: msleep(1); break; case TXSENDTONE: waitTxOn(); addToLog("txFunc: entered TXSENDTONE",LOGTXFUNC); startProgress(toneDuration); synthesPtr->sendTone(toneDuration,toneLowerFrequency,toneUpperFrequency,false); addToLog("txFunc: TXSENDTONE waiting for end",LOGTXFUNC); waitEnd(); switchTxState(TXIDLE); break; case TXPREPAREDRMBINARY: { bool ok=true; if (useHybrid) ok=drmTxPtr->ftpDRMHybrid(binaryFilename, drmTxPtr->getTxFileName(binaryFilename)); switchTxState(TXIDLE); prepareTXComplete(ok); } break; case TXPREPAREDRMPIC: { bool ok=true; if (useHybrid) ok=drmTxPtr->ftpDRMHybrid("", drmTxPtr->getTxFileName("")); switchTxState(TXIDLE); prepareTXComplete(ok); } break; case TXSENDDRMPIC: startWFTxt = startPicWF; endWFTxt = endPicWF; if (drmTxPtr->initDRMImage(false,"")) { drmTxPtr->updateTxList(); switchTxState(TXSENDDRM); } else switchTxState(TXIDLE); break; case TXSENDDRMBINARY: startWFTxt = startBinWF; endWFTxt = endBinWF; if (drmTxPtr->initDRMImage(true,binaryFilename)) { drmTxPtr->updateTxList(); switchTxState(TXSENDDRM); } else switchTxState(TXIDLE); break; case TXSENDDRMBSR: startWFTxt = bsrWF; endWFTxt = ""; switchTxState(TXSENDDRM); break; case TXSENDDRMFIX: startWFTxt = fixWF; endWFTxt = ""; switchTxState(TXSENDDRM); break; case TXSENDDRM: waitTxOn(); waterfallTime=waterfallPtr->getDuration(endWFTxt); waterfallTime+=waterfallPtr->getDuration(startWFTxt); startProgress(drmTxPtr->calcTxTime(waterfallTime)); addToLog("start of wf",LOGTXFUNC); if(useVOX) synthesPtr->sendTone(1.,1700.,0,false); waterfallPtr->setText(startWFTxt); synthesPtr->sendWFText(); addToLog("start of txDrm",LOGTXFUNC); drmTxPtr->start(); addToLog("end of txDrm",LOGTXFUNC); if(txState==TXSENDDRM) // abort if txState is idle { waterfallPtr->setText(endWFTxt); synthesPtr->sendWFText(); addToLog("end of wf",LOGTXFUNC); addToLog("txFunc: TXSENDDRM waiting for end",LOGTXFUNC); waitEnd(); } switchTxState(TXIDLE); break; case TXSENDDRMTXT: waitTxOn(); break; case TXSENDWFID: addToLog("Entered TXSENDID",LOGTXFUNC); waitTxOn(); addToLog("after txon TXSENDID",LOGTXFUNC); startProgress(waterfallPtr->getDuration()); if(useVOX) synthesPtr->sendTone(1.,1700.,0,false); synthesPtr->sendWFText(); addToLog("TXSENDID waiting for end",LOGTXFUNC); waitEnd(); addToLog("TXSENDID end",LOGTXFUNC); switchTxState(TXIDLE); break; case TXSENDCWID: waitTxOn(); if(useVOX) synthesPtr->sendTone(1.,1700.,0,false); sendCW(); waitEnd(); switchTxState(TXIDLE); break; case TXPREPARESSTV: switchTxState(TXIDLE); prepareTXComplete(true); break; case TXSSTVIMAGE: waitTxOn(); addToLog("Entered SSTVTXIMAGE",LOGTXFUNC); startProgress(sstvTxPtr->calcTxTime(0)); addToLog("Entered before SSTVTXIMAGE",LOGTXFUNC); if(sstvTxPtr->sendImage(txWidgetPtr->getImageViewerPtr())) { switchTxState(TXSSTVPOST); } else { switchTxState(TXIDLE); } break; case TXSSTVPOST: addToLog("Entered TXSSTVPOST ",LOGTXFUNC); if (useCW) { sendCW(); } else { sendFSKID(); } waitEnd(); switchTxState(TXRESTART); break; case TXRESTART: switchTxState(TXIDLE); break; case TXTEST: sendTestPattern(); break; } } started=false; addToLog("txFunc stopped",LOGTXFUNC); abort=false; txState=TXIDLE; } void txFunctions::setOnlineStatus(bool online, QString info) { drmTxPtr->setOnlineStatus(online, info); } void txFunctions::who() { drmTxPtr->who(); } int txFunctions::calcTxTime(bool binary, int overhead) { bool ok=false; int txTime=0; if (binary) { ok=drmTxPtr->initDRMImage(true, binaryFilename); } else { ok=drmTxPtr->initDRMImage(false, ""); } if (ok) txTime = drmTxPtr->calcTxTime(overhead); addToLog(QString("ok=%1, time=%2").arg(ok).arg(txTime), LOGTXFUNC); return txTime; } void txFunctions::setDRMTxParams(drmTxParams params) { drmTxPtr->setTxParams(params); } void txFunctions::startProgress(double duration) { progressTXEvent *ce; ce=new progressTXEvent(duration+rigControllerPtr->getTxDelay()+SILENCEDELAY); QApplication::postEvent( dispatcherPtr, ce ); // Qt will delete it when done } void txFunctions::stopThread() { abort=true; if(!isRunning()) return; while(abort && isRunning()) { qApp->processEvents(); } } bool txFunctions::txBusy() { if(isRunning() && txState!=TXIDLE) { return true; } return false; } void txFunctions::startTX(etxState state) { switchTxState(state); } void txFunctions::prepareTXComplete(bool ok) { txPrepareCompleteEvent *ce; ce=new txPrepareCompleteEvent(ok); QApplication::postEvent( dispatcherPtr, ce ); // Qt will delete it when done } void txFunctions::prepareTX(etxState state) { if (txState != TXIDLE) { addToLog("txState is not TXIDLE",LOGTXFUNC); return; } switch (state) { case TXPREPARESSTV: case TXSSTVIMAGE: switchTxState(TXPREPARESSTV); break; case TXPREPAREDRMPIC: case TXSENDDRMPIC: switchTxState(TXPREPAREDRMPIC); break; case TXPREPAREDRMBINARY: case TXSENDDRMBINARY:switchTxState(TXPREPAREDRMBINARY); break; default: addToLog(QString("Invalid prepareTX state:%1").arg(state),LOGTXFUNC); } } void txFunctions::waitTxOn() { double txDelay; txDelay=rigControllerPtr->getTxDelay(); if(txDelay!=0) { synthesPtr->sendSilence(txDelay); } } void txFunctions::waitEnd() { synthesPtr->sendTone(SILENCEDELAY,00,0,true); // send silence addToLog("waitEnd() posting endTXImage",LOGTXFUNC); endImageTXEvent *ce=new endImageTXEvent; QApplication::postEvent(dispatcherPtr, ce ); // Qt will delete it when done } void txFunctions::stopAndWait() { stopDRM=true; if(transmissionModeIndex==TRXSSTV) { sstvTxPtr->abort(); switchTxState(TXRESTART); while(txState!=TXIDLE) { qApp->processEvents(); } } addToLog("txFunc: stop initiated",LOGTXFUNC); switchTxState(TXIDLE); while(txState!=TXIDLE) { qApp->processEvents(); } if(soundIOPtr) soundIOPtr->idleTX(); addToLog("txFunc: stop executed",LOGTXFUNC); } void txFunctions::sendTestPattern() { syncBurst(); } /** send a burst of syncs */ void txFunctions::syncBurst() { // send 5msec 1200Hz followed by 50 msec silence // synthesPtr->sendTone(0.005,1200.); for (int i=0;i<50;i++) { synthesPtr->sendTone(0.005,1200,0,true); synthesPtr->sendTone(0.020,1700,0,true); } synthesPtr->sendSilence(0.100);; } void txFunctions::sendCW() { addToLog("txFunc:sendCW",LOGTXFUNC); float tone; float duration; initCW(cwText); synthesPtr->sendSilence(0.5); while(sendTextCW(tone,duration)) { synthesPtr->sendTone(duration,tone,0,true); } } void txFunctions:: sendFSKChar(int IDChar) { int TxBit; for (int i=0;i<6;i++) { TxBit = IDChar & 0x01; IDChar = IDChar >> 1; if (TxBit == 0x01) synthesPtr->sendTone(0.022,1900.,0,true); else synthesPtr->sendTone(0.022,2100.,0,true); } } // sendFSKID by DL3YAP void txFunctions:: sendFSKID() { int idx; int l; int IDChar; int Checksum; if (myCallsign.isEmpty()) return; // addToLog("txFunc:sendFSKID",LOGFSKID); l=myCallsign.size(); idx=0; // synthesPtr->sendTone(2.0,00,0,false); synthesPtr->sendTone(0.3,1500.,0,false); synthesPtr->sendTone(0.1,2100.,0,true); synthesPtr->sendTone(0.022,1900.,0,true); IDChar = 0x2A; sendFSKChar(IDChar); QChar IDText= QChar(myCallsign[idx]); IDChar=int(IDText.toLatin1()); IDChar = (IDChar - 0x20); Checksum = IDChar; while (idx < l) { sendFSKChar(IDChar); idx++; QChar IDText=QChar(myCallsign[idx].toUpper()); IDChar=int(IDText.toLatin1()); IDChar = (IDChar - 0x20); if (idx < l) { Checksum = Checksum ^ IDChar; } } IDChar = 0x01; sendFSKChar(IDChar); IDChar = Checksum & 0x3F ; sendFSKChar(IDChar); synthesPtr->sendTone(0.1,1900.,0,true); } void txFunctions::sendBSR(QByteArray *p,drmTxParams dp) { if(p==NULL) return; drmTxPtr->sendBSR(p,dp); } //void txFunctions::sendHybrid(QString fn) //{ // drmTxPtr->sendHybrid(fn); //} bool txFunctions::prepareFIX(QByteArray bsrByteArray) { int trID; displayMBoxEvent *stce; txSession *sessionPtr; fixForm fx(mainWindowPtr); trID=drmTxPtr->processFIX(bsrByteArray); if(trID<0) return false; sessionPtr=drmTxPtr->getSessionPtr((uint)trID); if (sessionPtr==NULL) { stce= new displayMBoxEvent("BSR Received","This BSR is not for you"); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done return false; } else { // take it from the transmitlist fx.setInfoInternal(paramsToMode(sessionPtr->drmParams),sessionPtr->filename,fixBlockList.count(),&sessionPtr->ba); if(fx.exec()==QDialog::Rejected) return false; drmTxPtr->initDRMFIX(sessionPtr); } return true; } bool txFunctions::prepareBinary(QString fileName) { binaryFilename=fileName; return true; } void txFunctions::applyTemplate(imageViewer *ivPtr,QString templateFilename) { if(transmissionModeIndex==TRXSSTV) { sstvTxPtr->applyTemplate(templateFilename,useTemplate,ivPtr); } else { drmTxPtr->applyTemplate(templateFilename,useTemplate,ivPtr); } } void txFunctions::forgetTxFileName() { drmTxPtr->forgetTxFileName(); } void txFunctions::switchTxState(etxState newState) { addToLog(QString("%1 to %2").arg(txStateStr[txState]).arg(txStateStr[newState]),LOGTXFUNC); txState=newState; } void txFunctions::txTestPattern(imageViewer *ivPtr,etpSelect sel) { sstvTxPtr->createTestPattern(ivPtr,sel); } qsstv_9.2.6/qsstv/mainwidgets/txfunctions.h0000664000175000017500000000417413203343610017663 0ustar jomajoma#ifndef TXFUNCTIONS_H #define TXFUNCTIONS_H #include #include "appdefs.h" #include "drmparams.h" #include "testpatternselection.h" #define SILENCEDELAY 0.600 // send silence after transmission extern int templateIndex; extern bool useTemplate; extern bool useCW; extern bool useVOX; class sstvTx; class drmTx; class imageViewer; class txFunctions : public QThread { Q_OBJECT public: enum etxState { TXIDLE, //!< in idle loop TXACTIVE, TXSENDTONE, TXSENDWFID, TXSENDCWID, TXSENDDRM, TXSENDDRMPIC, TXSENDDRMBINARY, TXSENDDRMBSR, TXSENDDRMFIX, TXSENDDRMTXT, TXSSTVIMAGE, TXSSTVPOST, TXRESTART, TXPREPARESSTV, TXPREPAREDRMPIC, TXPREPAREDRMBINARY, TXTEST }; txFunctions(QObject *parent); ~txFunctions(); void init(); void run(); void stopThread(); void startTX(etxState state); void prepareTX(etxState state); void stopAndWait(); void setToneParam(double duration,double lowerFreq,double upperFreq=0) { toneDuration=duration; toneLowerFrequency=lowerFreq; toneUpperFrequency=upperFreq; } bool prepareFIX(QByteArray bsrByteArray); bool prepareBinary(QString fileName); void sendBSR(QByteArray *p,drmTxParams dp); void applyTemplate(imageViewer *ivPtr,QString templateFilename); void forgetTxFileName(); etxState getTXState() { return txState;} void setDRMTxParams(drmTxParams params); void setOnlineStatus(bool online, QString info=""); void who(); // bool initDRMFIX(txSession *sessionPtr); int calcTxTime(bool binary, int overhead); void txTestPattern(imageViewer *ivPtr, etpSelect sel); bool txBusy(); private: void waitTxOn(); void waitEnd(); void sendCW(); void sendFSKID(); void sendTestPattern(); void syncBurst(); void sendFSKChar(int IDChar); void switchTxState(etxState newState); void startProgress(double duration); void prepareTXComplete(bool ok); etxState txState; bool started; bool abort; double toneDuration; double toneLowerFrequency; double toneUpperFrequency; QString binaryFilename; sstvTx *sstvTxPtr; drmTx *drmTxPtr; }; #endif // TXFUNCTIONS_H qsstv_9.2.6/qsstv/mainwidgets/txwidget.cpp0000664000175000017500000005544213203343610017475 0ustar jomajoma#include "txwidget.h" #include "appglobal.h" #include "drmtx/drmparams.h" #include "rxwidget.h" #include "rxfunctions.h" #include "ui_txwidget.h" #include #include "configparams.h" #include "dispatcher.h" #include "supportfunctions.h" #include "gallerywidget.h" #include "waterfalltext.h" #include "ui_freqform.h" #include "ui_sweepform.h" #include "cameradialog.h" #include "soundbase.h" #include "waterfallform.h" #include "bsrform.h" #include "mainwindow.h" #include "rigcontrol.h" #include "imageviewer.h" #include "testpatternselection.h" txWidget::txWidget(QWidget *parent) : QWidget(parent), ui(new Ui::txWidget) { int i; QString tmp; ui->setupUi(this); ui->previewWidget->setType(imageViewer::PREVIEW); txFunctionsPtr=new txFunctions(this); imageViewerPtr=ui->imageFrame; imageViewerPtr->displayImage(); for(i=0;isstvModeComboBox->addItem(getSSTVModeNameLong((esstvMode)i)); } ui->sstvResizeComboBox->addItem("Stretch"); ui->sstvResizeComboBox->addItem("Crop"); ui->sstvResizeComboBox->addItem("Fit"); connect(ui->sstvModeComboBox,SIGNAL(activated(int)),SLOT(slotModeChanged(int ))); connect(ui->sstvResizeComboBox,SIGNAL(activated(int)),SLOT(slotResizeChanged(int))); connect(ui->drmTxBandwidthComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->drmTxInterleaveComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->drmTxProtectionComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->drmTxQAMComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->drmTxModeComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->drmTxReedSolomonComboBox,SIGNAL(activated(int)),SLOT(slotGetTXParams())); connect(ui->templatesComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotGetParams())); connect(ui->templateCheckBox,SIGNAL(toggled(bool)),SLOT(slotGetParams())); connect(ui->refreshPushButton,SIGNAL(clicked()),SLOT(slotGetParams())); connect(ui->cwCheckBox,SIGNAL(toggled(bool)),SLOT(slotGetTXParams())); connect(ui->voxCheckBox,SIGNAL(toggled(bool)),SLOT(slotGetTXParams())); connect(ui->toCallLineEdit,SIGNAL(editingFinished ()),SLOT(slotGetParams())); connect(ui->operatorLineEdit,SIGNAL(editingFinished ()),SLOT(slotGetParams())); connect(ui->rsvLineEdit,SIGNAL(editingFinished ()),SLOT(slotGetParams())); connect(ui->xPlainTextEdit,SIGNAL(editingFinished()),SLOT(slotGetParams())); connect(ui->yPlainTextEdit,SIGNAL(editingFinished()),SLOT(slotGetParams())); connect(ui->zPlainTextEdit,SIGNAL(editingFinished()),SLOT(slotGetParams())); connect(ui->startToolButton, SIGNAL(clicked()), this, SLOT(slotStart())); connect(ui->stopToolButton, SIGNAL(clicked()), this, SLOT(slotStop())); connect(ui->drmProfileComboBox,SIGNAL(activated(int)),SLOT(slotProfileChanged(int ))); connect(ui->hybridCheckBox,SIGNAL(toggled(bool)),SLOT(slotHybridToggled())); connect(ui->uploadToolButton, SIGNAL(clicked()), this, SLOT(slotUpload())); connect(ui->generateToneToolButton, SIGNAL(clicked()), this, SLOT(slotGenerateSignal())); connect(ui->sweepToneToolButton, SIGNAL(clicked()), this, SLOT(slotSweepSignal())); connect(ui->repeaterToneToolButton, SIGNAL(clicked()), this, SLOT(slotGenerateRepeaterTone())); connect(ui->openToolButton, SIGNAL(clicked()), this, SLOT(slotFileOpen())); connect(ui->editToolButton, SIGNAL(clicked()), this, SLOT(slotEdit())); connect(ui->snapshotToolButton, SIGNAL(clicked()), this, SLOT(slotSnapshot())); connect(ui->binaryPushButton,SIGNAL(clicked()),this,SLOT(slotBinary())); connect(ui->sizeSlider,SIGNAL(valueChanged(int)),SLOT(slotSize(int))); connect(ui->settingsTableWidget,SIGNAL(currentChanged(int)),this, SLOT(slotTransmissionMode(int))); connect(imageViewerPtr,SIGNAL(imageChanged()),SLOT(slotImageChanged())); connect(ui->templateCheckBox,SIGNAL(toggled(bool)),SLOT(slotImageChanged())); connect(ui->templatesComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotImageChanged())); sizeRatio=-1; hybridTxIntf = new ftpInterface("HybridTX"); notifyTXIntf = new ftpInterface("HybridTXNotify"); onlineStatusIntf = new ftpInterface("HybridOnlineStatus"); } txWidget::~txWidget() { writeSettings(); delete hybridTxIntf; delete notifyTXIntf; delete onlineStatusIntf; txFunctionsPtr->terminate(); delete txFunctionsPtr; delete ui; } void txWidget::init() { splashStr+=QString( "Setting up TX" ).rightJustified(25,' ')+"\n"; splashPtr->showMessage ( splashStr ,Qt::AlignLeft,Qt::white); qApp->processEvents(); readSettings(); initView(); setProfileNames(); ed=NULL; repeaterIndex=0; repeaterTimer=new QTimer(this); connect(repeaterTimer,SIGNAL(timeout()),SLOT(slotRepeaterTimer())); repeaterTimer->start(60000*repeaterImageInterval); imageViewerPtr->setType(imageViewer::TXIMG); slotModeChanged(sstvModeIndexTx); ui->sizeSlider->setValue(sizeRatio); changeTransmissionMode(transmissionModeIndex); // setSettingsTab(); slotProfileChanged(0); if(lowRes) { ui->txNotificationList->hide(); ui->refreshPushButton->hide(); ui->previewWidget->hide(); } } void txWidget::readSettings() { QSettings qSettings; qSettings.beginGroup("TX"); sstvModeIndexTx=((esstvMode)qSettings.value("sstvModeIndexTx",0).toInt()); if((sstvModeIndexTx=NOTVALID)) { sstvModeIndexTx=M1; } templateIndex=qSettings.value("templateIndex",0).toInt(); useTemplate=qSettings.value("useTemplate",false).toBool(); useCW=qSettings.value("useCW",false).toBool(); useVOX=qSettings.value("useVOX",false).toBool(); useHybrid=qSettings.value("useHybrid",false).toBool(); sizeRatio=qSettings.value("sizeRatio",25).toInt(); drmParams.bandwith=qSettings.value("drmBandWith",0).toInt(); drmParams.interleaver=qSettings.value("drmInterLeaver",0).toInt(); drmParams.protection=qSettings.value("drmProtection",0).toInt(); drmParams.qam=qSettings.value("drmQAM",0).toInt(); drmParams.robMode=qSettings.value("drmRobMode",0).toInt(); drmParams.reedSolomon=qSettings.value("drmReedSolomon",0).toInt(); qSettings.endGroup(); setParams(); } void txWidget::writeSettings() { QSettings qSettings; slotGetParams(); qSettings.beginGroup("TX"); qSettings.setValue( "sstvModeIndexTx", sstvModeIndexTx); qSettings.setValue( "templateIndex", templateIndex); qSettings.setValue( "useTemplate", useTemplate); qSettings.setValue( "useVOX", useVOX); qSettings.setValue( "useCW", useCW); qSettings.setValue( "useHybrid", useHybrid); qSettings.setValue("drmBandWith",drmParams.bandwith); qSettings.setValue("drmInterLeaver",drmParams.interleaver); qSettings.setValue("drmProtection",drmParams.protection); qSettings.setValue("drmQAM",drmParams.qam); qSettings.setValue("drmRobMode",drmParams.robMode); qSettings.setValue("drmReedSolomon",drmParams.reedSolomon); qSettings.setValue("sizeRatio",sizeRatio); qSettings.endGroup(); } void txWidget::slotGetTXParams() { // get only the params that don't require re-applying the template // used by prepareTX() and slotGetParams() int temp=sstvModeIndexTx; getIndex(temp,ui->sstvModeComboBox); sstvModeIndexTx=esstvMode(temp); getValue(useVOX,ui->voxCheckBox); getValue(useCW,ui->cwCheckBox); getIndex(drmParams.bandwith,ui->drmTxBandwidthComboBox); getIndex(drmParams.interleaver,ui->drmTxInterleaveComboBox); getIndex(drmParams.protection,ui->drmTxProtectionComboBox); getIndex(drmParams.qam,ui->drmTxQAMComboBox); getIndex(drmParams.robMode,ui->drmTxModeComboBox); getIndex(drmParams.reedSolomon,ui->drmTxReedSolomonComboBox); drmParams.callsign=myCallsign; updateTxTime(); txFunctionsPtr->forgetTxFileName(); } void txWidget::slotGetParams() { getIndex(templateIndex,ui->templatesComboBox); getValue(useTemplate,ui->templateCheckBox); getValue(useHybrid,ui->hybridCheckBox); getValue(imageViewerPtr->toCall,ui->toCallLineEdit); getValue(imageViewerPtr->toOperator,ui->operatorLineEdit); getValue(imageViewerPtr->rsv,ui->rsvLineEdit); getValue(imageViewerPtr->comment1,ui->xPlainTextEdit); getValue(imageViewerPtr->comment2,ui->yPlainTextEdit); getValue(imageViewerPtr->comment3,ui->zPlainTextEdit); slotGetTXParams(); getValue(sizeRatio,ui->sizeSlider); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); if(txFunctionsPtr->getTXState()==txFunctions::TXIDLE) { applyTemplate(); } } void txWidget::setParams() { setIndex(((int)sstvModeIndexTx),ui->sstvModeComboBox); ui->templateCheckBox->blockSignals(true); ui->templatesComboBox->blockSignals(true); setIndex(templateIndex,ui->templatesComboBox); setValue(useTemplate,ui->templateCheckBox); ui->templateCheckBox->blockSignals(false); ui->templatesComboBox->blockSignals(false); setValue(useVOX,ui->voxCheckBox); setValue(useCW,ui->cwCheckBox); setValue(useHybrid,ui->hybridCheckBox); setIndex(drmParams.bandwith,ui->drmTxBandwidthComboBox); setIndex(drmParams.interleaver,ui->drmTxInterleaveComboBox); setIndex(drmParams.protection,ui->drmTxProtectionComboBox); setIndex(drmParams.qam,ui->drmTxQAMComboBox); setIndex(drmParams.robMode,ui->drmTxModeComboBox); setIndex(drmParams.reedSolomon,ui->drmTxReedSolomonComboBox); setValue(sizeRatio,ui->sizeSlider); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); updateTxTime(); } void txWidget::copyProfile(drmTxParams d) { drmParams=d; setIndex(drmParams.bandwith,ui->drmTxBandwidthComboBox); setIndex(drmParams.interleaver,ui->drmTxInterleaveComboBox); setIndex(drmParams.protection,ui->drmTxProtectionComboBox); setIndex(drmParams.qam,ui->drmTxQAMComboBox); setIndex(drmParams.robMode,ui->drmTxModeComboBox); setIndex(drmParams.reedSolomon,ui->drmTxReedSolomonComboBox); } void txWidget::initView() { imageViewerPtr->createImage(QSize(320,256),imageBackGroundColor,imageStretch); imageViewerPtr->setType(imageViewer::TXIMG); setupTemplatesComboBox(); ui->txProgressBar->setRange(0,100); } void txWidget::setupTemplatesComboBox() { QStringList sl; int i; ui->templatesComboBox->clear(); sl=galleryWidgetPtr->getFilenames(); for(i=0;itemplatesComboBox->insertItem(i,sl.at(i)); } ui->templatesComboBox->setCurrentIndex(templateIndex); } QString txWidget::getPreviewFilename() { return ui->previewWidget->getFilename(); } void txWidget::setPreviewWidget(QString fn) { ui->previewWidget->openImage(fn,false,false,false); } void txWidget::startTX(bool st,bool check) { if(st) { //slotGetParams(); if(check) { if(!imageViewerPtr->hasValidImage()) { QMessageBox::warning(this,"TX Error","No image loaded"); return; } } } else { writeSettings(); txFunctionsPtr->stopAndWait(); } } void txWidget::slotStart() { if(imageViewerPtr->hasValidImage()) { doTx=1; prepareTx(); } } void txWidget::slotUpload() { if(imageViewerPtr->hasValidImage()) { doTx=0; prepareTx(); } } void txWidget::prepareTx() { addToLog(QString("doTx=%1").arg(doTx),LOGTXMAIN); ui->uploadToolButton->setEnabled(false); ui->startToolButton->setEnabled(false); switch (transmissionModeIndex) { case TRXSSTV: dispatcherPtr->prepareTX(txFunctions::TXPREPARESSTV); break; case TRXDRM: dispatcherPtr->prepareTX(txFunctions::TXPREPAREDRMPIC); break; case TRXNOMODE: break; } } void txWidget::prepareTxComplete(bool ok) { addToLog(QString("ok=%1, doTx=%2").arg(ok).arg(doTx),LOGTXMAIN); if (!ok) { addToLog("Upload/prepare failed",LOGTXMAIN); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); } ui->startToolButton->setEnabled(true); if (ok && doTx) { if (doTx==2) { if (useHybrid) { QMessageBox mbox(mainWindowPtr); QPushButton *sendButton; mbox.setWindowTitle("TX Binary File"); mbox.setText("The file has been uploaded ready for transmission"); sendButton = mbox.addButton(tr("Start Transmitting"), QMessageBox::AcceptRole); mbox.setStandardButtons(QMessageBox::Cancel); mbox.exec(); if (mbox.clickedButton() == sendButton) { dispatcherPtr->startTX(txFunctions::TXSENDDRMBINARY); } } else { dispatcherPtr->startTX(txFunctions::TXSENDDRMBINARY); } } else { startTxImage(); } } } void txWidget::startTxImage() { QDateTime dt(QDateTime::currentDateTime().toUTC()); //this is compatible with QT 4.6 dt.setTimeSpec(Qt::UTC); if(!imageViewerPtr->hasValidImage()) return; QFileInfo finf=imageViewerPtr->getFilename(); QString fn; switch(transmissionModeIndex) { case TRXSSTV: if(saveTXimages) { fn=QString("%1/%2_%3.%4").arg(txSSTVImagesPath).arg(finf.baseName()).arg(dt.toString("yyyyMMdd_HHmmss")).arg(defaultImageFormat); imageViewerPtr->save(fn,defaultImageFormat,true,false); galleryWidgetPtr->txImageChanged(); } dispatcherPtr->startTX(txFunctions::TXSSTVIMAGE); break; case TRXDRM: if(saveTXimages) { fn=QString("%1/%2_%3.%4").arg(txDRMImagesPath).arg(finf.baseName()).arg(dt.toString("yyyyMMdd_HHmmss")).arg(defaultImageFormat); imageViewerPtr->save(fn,defaultImageFormat,true,false); galleryWidgetPtr->txImageChanged(); } dispatcherPtr->startTX(txFunctions::TXSENDDRMPIC); break; // case FAX: // break; case TRXNOMODE: break; } } void txWidget::sendBSR() { QByteArray *p; bsrForm::eResult res; bsrForm bsrf; bsrf.init(); res=(bsrForm::eResult)bsrf.exec(); if(res==bsrForm::CANCEL) return; p=bsrf.getBA(res==bsrForm::COMPAT); txFunctionsPtr->sendBSR(p,bsrf.getDRMParams()); } void txWidget::sendWFID() { waterfallPtr->setText(myCallsign); dispatcherPtr->startTX(txFunctions::TXSENDWFID); addToLog("sendWFID",LOGTXMAIN); } void txWidget::sendCWID() { dispatcherPtr->startTX(txFunctions::TXSENDCWID); addToLog("sendWFID",LOGTXMAIN); } void txWidget::sendWfText() { waterfallForm wf; if((wf.exec()==QDialog::Accepted)&&(!wf.text().isEmpty())) { waterfallPtr->setText(wf.text()); dispatcherPtr->startTX(txFunctions::TXSENDWFID); addToLog("sendID",LOGTXMAIN); } } void txWidget::slotStop() { dispatcherPtr->startRX(); ui->startToolButton->setEnabled(true); } //void txWidget::slotDisplayStatusMessage(QString s) //{ // statusBarPtr->showMessage(s); //} //void txWidget::slotReplay() //{ // QString fn; // QImage *im=NULL; // fn=galleryWidgetPtr->getLastRxImage(); // editorScene scene(0); // QFile f(fn); // if(!scene.load(f)) // { // QMessageBox::warning(this,"Image Properties","Error while loading\n" + fn); // return; // } // im=scene.renderImage(); // dispatcherPtr->setTXImage(im); // slotStartTX(); //} void txWidget::slotFileOpen() { QString fileName; imageViewerPtr->openImage(fileName,txStockImagesPath,true,true,true,false); applyTemplate(); } void txWidget::slotGenerateSignal() { QDialog qd; Ui::freqForm *ff=new Ui::freqForm; ff->setupUi(&qd); int freq; int duration; if(qd.exec()) { getValue(freq,ff->frequencySpinBox); getValue(duration,ff->durationSpinBox); txFunctionsPtr->setToneParam((double)duration,(double)freq); dispatcherPtr->startTX(txFunctions::TXSENDTONE); } } void txWidget::slotSweepSignal() { QDialog qd; Ui::sweepForm *ff=new Ui::sweepForm; ff->setupUi(&qd); int upperFreq; int lowerFreq; int duration; if(qd.exec()) { getValue(lowerFreq,ff->lowerFrequencySpinBox); getValue(upperFreq,ff->upperFrequencySpinBox); getValue(duration,ff->durationSpinBox); txFunctionsPtr->setToneParam((double)duration,(double)lowerFreq,(double)upperFreq); dispatcherPtr->startTX(txFunctions::TXSENDTONE); } } void txWidget::slotGenerateRepeaterTone() { // addToLog(QString("start of buffer %1").arg(soundIOPtr->txBuffer.count()),LOGTXMAIN); txFunctionsPtr->setToneParam(3.,1750); dispatcherPtr->startTX(txFunctions::TXSENDTONE); addToLog("sendTone",LOGTXMAIN); } void txWidget::slotEdit() { if (ed!=NULL) delete ed; ed=new editor(this); if(txFunctionsPtr->txBusy()) { QMessageBox::warning(this,"Editor","Transmission busy, editor not available"); return; } connect(ed,SIGNAL(imageAvailable(QImage *)),SLOT(setImage(QImage *))); ed->setImage(imageViewerPtr->getImagePtr()); ed->show(); } /** \todo implement repeater */ void txWidget::applyTemplate() { txFunctionsPtr->applyTemplate(imageViewerPtr,galleryWidgetPtr->getTemplateFileName(ui->templatesComboBox->currentIndex())); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); updateTxTime(); } void txWidget::updateTxTime() { int s=txFunctionsPtr->calcTxTime(false,0); ui->sizeDurationLabel->setText( QString::number(s)+"s"); } void txWidget::setImage(QString fn) { imageViewerPtr->openImage(fn,true,true,false); } void txWidget::setProgress(uint prg) { ui->txProgressBar->setValue(prg); } void txWidget::slotModeChanged(int m) { addToLog("slotModeChange",LOGTXMAIN); if(transmissionModeIndex==TRXSSTV) { sstvModeIndexTx=(esstvMode)m; applyTemplate(); } } void txWidget::slotResizeChanged(int i) { switch (i) { case 0: // Stretch imageViewerPtr->setAspectMode(Qt::IgnoreAspectRatio); break; case 1: // Crop imageViewerPtr->setAspectMode(Qt::KeepAspectRatioByExpanding); break; case 2: // Fit imageViewerPtr->setAspectMode(Qt::KeepAspectRatio); break; } applyTemplate(); } /** \todo implement repeater */ // void txWidget::repeat(QImage *im,esstvMode sm) void txWidget::repeat(QImage *,esstvMode ) { /* setValue((int)sm,ui->modeComboBox); txf->setModeIndex((sstvMode)sm); // slotModeChanged(sm); txf->setImage(im); dsp->setCaptureSource(true,NULL,false); txf->process();*/ } void txWidget::slotRepeaterTimer() { QString fn; QFile fi; if(txFunctionsPtr->isRunning()) repeaterTimer->start(60000*repeaterImageInterval); else if ((rxWidgetPtr->functionsPtr()->isRunning()) || (!repeaterEnable)) { // wait 10 seconds and check if busy or repeaterEnable has changed repeaterTimer->start(10000); } else { switch(repeaterIndex) { case 0: fn=repeaterImage1; break; case 1: fn=repeaterImage2; break; case 2: fn=repeaterImage3; break; case 3: fn=repeaterImage4; break; default: fn=repeaterImage1; break; } fi.setFileName(fn); if (fi.exists()) { slotModeChanged(repeaterTxMode); setImage(fn); } repeaterIndex++; if(repeaterIndex>3) repeaterIndex=0; repeaterTimer->start(60000*repeaterImageInterval); //QApplication::processEvents(); startAutoRepeaterEvent* ce = new startAutoRepeaterEvent(); QApplication::postEvent(dispatcherPtr, ce ); } } void txWidget::slotSnapshot() { QImage *im; cameraDialog camera; if(camera.exec()==QDialog::Accepted) { im=camera.getImage(); if(im) { QTemporaryFile itmp(txStockImagesPath+"/snapshotXXXXXX.jpg"); itmp.setAutoRemove(false); if(!itmp.open()) return; im->save(itmp.fileName()); setImage(itmp.fileName()); galleryWidgetPtr->txStockImageChanged(); } } } void txWidget::setSettingsTab() { { if(transmissionModeIndex==TRXDRM) { ui->hybridCheckBox->setEnabled(true); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); ui->binaryPushButton->setEnabled(true); ui->sizeLabel->setEnabled(true); ui->sizeSlider->setEnabled(true); ui->sizeKbLabel->setEnabled(true); ui->sizeDurationLabel->setEnabled(true); mainWindowPtr->setSSTVDRMPushButton(true); } else { ui->hybridCheckBox->setEnabled(false); ui->uploadToolButton->setEnabled(false); ui->binaryPushButton->setEnabled(false); ui->sizeLabel->setEnabled(false); ui->sizeSlider->setEnabled(false); ui->sizeKbLabel->setEnabled(false); ui->sizeDurationLabel->setEnabled(false); ui->sizeDurationLabel->setText("-"); mainWindowPtr->setSSTVDRMPushButton(false); } } applyTemplate(); } void txWidget::slotSize(int v) { QString t; if(sizeRatio!=v) { sizeRatioChanged=true; sizeRatio=v; slotSizeApply(); } } void txWidget::slotSizeApply() { float fileSize; QApplication::setOverrideCursor(Qt::WaitCursor); sizeRatioChanged=false; fileSize=imageViewerPtr->setSizeRatio(sizeRatio,transmissionModeIndex==TRXDRM); imageViewerPtr->displayImage(); ui->sizeKbLabel->setText( QString::number(fileSize/1000)+ "kB"); // applyTemplate(); QApplication::restoreOverrideCursor(); } void txWidget::slotTransmissionMode(int rxtxMode) { emit modeSwitch(rxtxMode); } void txWidget::changeTransmissionMode(int rxtxMode) { int i; transmissionModeIndex=(etransmissionMode)rxtxMode; if((transmissionModeIndex>=0)&&(transmissionModeIndexsettingsTableWidget->widget(i)->setEnabled(false); } ui->settingsTableWidget->widget(transmissionModeIndex)->setEnabled(true); ui->settingsTableWidget->blockSignals(true); ui->settingsTableWidget->setCurrentIndex(transmissionModeIndex); ui->settingsTableWidget->blockSignals(false); } setSettingsTab(); } void txWidget::slotProfileChanged(int i) { drmProfileConfigPtr->getDRMParams(i,drmParams); setParams(); } void txWidget::reloadProfiles() { int index; index= ui->drmProfileComboBox->currentIndex(); setProfileNames(); slotProfileChanged(index); } void txWidget::setProfileNames() { QString tmp; ui->drmProfileComboBox->clear(); if(drmProfileConfigPtr->getName(0,tmp)) { ui->drmProfileComboBox->addItem(tmp); } if(drmProfileConfigPtr->getName(1,tmp)) { ui->drmProfileComboBox->addItem(tmp); } if(drmProfileConfigPtr->getName(2,tmp)) { ui->drmProfileComboBox->addItem(tmp); } } void txWidget::slotImageChanged() { int temp=sizeRatio; sizeRatio=-1; slotSize(temp); } void txWidget::slotBinary() { slotGetParams(); doTx=2; dispatcherPtr->startDRMTxBinary(); } void txWidget::slotHybridToggled() { getValue(useHybrid,ui->hybridCheckBox); ui->uploadToolButton->setEnabled(useHybrid && (transmissionModeIndex!=TRXSSTV)); updateTxTime(); } void txWidget::txTestPattern(etpSelect sel) { txFunctionsPtr->txTestPattern(imageViewerPtr,sel); } qsstv_9.2.6/qsstv/mainwidgets/txwidget.h0000664000175000017500000000525313203343610017135 0ustar jomajoma#ifndef TXWIDGET_H #define TXWIDGET_H #include "imageviewer.h" #include "sstvparam.h" #include "txfunctions.h" #include "drmtransmitter.h" #include "ui_txwidget.h" #include class drmTransmitter; namespace Ui { class txWidget; } class txWidget : public QWidget { Q_OBJECT public: explicit txWidget(QWidget *parent = 0); ~txWidget(); void init(); void startTX(bool st, bool check=true); void prepareTx(); void prepareTxComplete(bool ok); void writeSettings(); void readSettings(); imageViewer *getImagePtr(); void repeat(QImage *im,esstvMode sm); void setImage(QImage *ima); void setImage(QString fn); void setProgress(uint prg); void setupTemplatesComboBox(); void setPreviewWidget(QString fn); void setSettingsTab(); txFunctions *functionsPtr() {return txFunctionsPtr;} imageViewer *getImageViewerPtr(){ return imageViewerPtr;} QString getPreviewFilename(); void txTestPattern(etpSelect sel); void setDRMNotifyText(QString txt) { //ui->txNotificationList->clear(); ui->txNotificationList->setPlainText(txt); } void appendDRMNotifyText(QString txt) { ui->txNotificationList->appendPlainText(txt); } // bool prepareHybrid(QString fn); bool prepareText(QString txt); void copyProfile(drmTxParams d); void setProfileNames(); void reloadProfiles(); void changeTransmissionMode(int rxtxMode); // void test(); // void sendFIX(); void sendBSR(); void sendWfText(); void sendWFID(); void sendCWID(); public slots: void slotGetTXParams(); void slotGetParams(); void slotStart(); void slotUpload(); void slotStop(); // void slotDisplayStatusMessage(QString); void slotGenerateSignal(); void slotSweepSignal(); void slotGenerateRepeaterTone(); void slotEdit(); // void slotReplay(); void slotRepeaterTimer(); void slotFileOpen(); void slotSnapshot(); void slotSize(int v); void slotSizeApply(); void slotTransmissionMode(int rxtxMode); void slotProfileChanged(int ); void slotImageChanged(); void slotModeChanged(int); void slotResizeChanged(int); void slotBinary(); void slotHybridToggled(); signals: void modeSwitch(int); private: Ui::txWidget *ui; txFunctions *txFunctionsPtr; void initView(); void setParams(); void sendHybrid(QString fn); editor *ed; QTimer *repeaterTimer; int repeaterIndex; QImage origImage; QImage resultImage; void applyTemplate(); void updateTxTime(); imageViewer *imageViewerPtr; etransmissionMode currentTXMode; int sizeRatio; bool sizeRatioChanged; int drmProfileIdx; QString previewFilename; int doTx; void startTxImage(); }; #endif // TXWIDGET_H qsstv_9.2.6/qsstv/mainwidgets/txwidget.ui0000664000175000017500000013640413203343610017326 0ustar jomajoma txWidget 0 0 990 835 8 Form 1 0 0 0 0 1 2 Start transmit Start transmit ... :/icons/start.png:/icons/start.png Stop transmit Stop transmit ... :/icons/stop.png:/icons/stop.png Send repeater tone Send repeater tone ... :/icons/tone.png:/icons/tone.png Load image Load image ... :/icons/fileopen.png:/icons/fileopen.png Edit image Edit image ... :/icons/edit.png:/icons/edit.png Camera snapshot Camera snapshot ... :/icons/camera.png:/icons/camera.png :/icons/binary.png:/icons/binary.png Qt::Horizontal 10 20 Hybrid Upload Now Upload Now Upload :/icons/up.png:/icons/up.png Qt::Horizontal 40 20 Send tone Send tone ... :/icons/doubletone.png:/icons/doubletone.png Send sweep tones Send sweep tones ... :/icons/sweep.png:/icons/sweep.png 320 256 16777215 16777215 Size 1 1000 10 25 false Qt::Horizontal true true QSlider::TicksBelow 2 80 0 80 16777215 QFrame::StyledPanel QFrame::Sunken 3 1 50 0 TextLabel 1 0 0 0 0 0 0 0 211 221 238 255 255 255 233 238 246 105 110 119 140 147 158 0 0 0 255 255 255 0 0 0 255 255 255 215 229 238 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 0 0 0 211 221 238 255 255 255 244 248 255 105 110 119 140 147 158 0 0 0 255 255 255 0 0 0 255 255 255 215 229 238 0 0 0 0 0 128 255 255 255 0 0 192 128 0 128 128 128 128 211 221 238 255 255 255 244 248 255 105 110 119 140 147 158 128 128 128 255 255 255 128 128 128 255 255 255 215 229 238 0 0 0 0 0 128 255 255 255 0 0 192 128 0 128 1 SSTV Qt::Horizontal 40 20 Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Transmit mode Transmit mode Qt::Vertical 20 19 Qt::Horizontal 40 20 DRM 0 0 0 0 1 0 30 0 Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 40 0 40 25 A B E 30 0 QAM Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 45 0 45 16777215 4 16 64 30 0 BW Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 70 0 70 16777215 2.2 kHz 2.2 kHz 2.5 kHz 30 0 Interl. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Short Long 30 0 Prot. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 65 0 65 25 High Low Profile Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 16777215 25 30 0 Rs Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 65 0 65 16777215 None RS1 RS2 RS3 RS4 TX Progress Qt::AlignCenter false 0 1 0 Select template Select template Send CW at end Send CW at end CW Use Template Send leading tone Send leading tone VOX 1 0 0 0 To: false 120 25 120 25 Template info Template info 0 0 Op: false 120 25 120 25 Template info Template info 0 0 RSV false 50 25 100 25 Template info Template info 1 10 0 x false 0 0 0 32 16777215 50 1 10 0 y false 0 0 0 32 16777215 50 1 10 0 z false 0 0 0 32 16777215 16777215 4 Refresh 100 80 Qt::Vertical 20 28 0 0 false Rx Notifications seen for the last DSSTV Hybrid image sent QPlainTextEdit::NoWrap true 8 imageViewer QWidget
widgets/imageviewer.h
1
xyzPlainTextEdit QPlainTextEdit
xyzplaintextedit.h
qsstv_9.2.6/qsstv/rig/freqdisplay.cpp0000664000175000017500000000050513203343610016415 0ustar jomajoma#include "freqdisplay.h" #include "ui_freqdisplay.h" freqDisplay::freqDisplay(QWidget *parent) : QWidget(parent), ui(new Ui::freqDisplay) { ui->setupUi(this); } freqDisplay::~freqDisplay() { delete ui; } void freqDisplay::display(double freq) { ui->frequencyLCD->display(QString("%1").arg(freq/1000,8,'f',3)); } qsstv_9.2.6/qsstv/rig/freqdisplay.h0000664000175000017500000000050013203343610016055 0ustar jomajoma#ifndef FREQDISPLAY_H #define FREQDISPLAY_H #include namespace Ui { class freqDisplay; } class freqDisplay : public QWidget { Q_OBJECT public: explicit freqDisplay(QWidget *parent = 0); ~freqDisplay(); void display(double freq); private: Ui::freqDisplay *ui; }; #endif // FREQDISPLAY_H qsstv_9.2.6/qsstv/rig/freqdisplay.ui0000664000175000017500000002351313203343610016254 0ustar jomajoma freqDisplay 0 0 214 52 Form 2 1 1 1 1 75 true kHz 180 50 0 170 255 255 255 127 0 255 255 0 255 127 0 170 0 255 255 0 0 0 0 85 255 127 0 0 127 0 0 127 0 85 0 0 170 255 255 255 127 0 255 255 0 255 127 0 170 0 255 255 0 0 0 0 85 255 127 0 0 127 0 0 127 0 85 0 0 170 0 255 255 127 0 255 255 0 255 127 0 170 0 255 255 0 0 170 0 85 255 127 0 0 127 0 0 127 0 85 0 true QFrame::Box QFrame::Sunken 10 QLCDNumber::Filled qsstv_9.2.6/qsstv/rig/rigcontrol.cpp0000664000175000017500000003206413203343610016261 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "rigcontrol.h" #include "appglobal.h" #include #include #include #include #include #include "mainwindow.h" #include #include "txwidget.h" #include "configparams.h" #define MAXCONFLEN 128 QList capsList; bool radiolistLoaded=false; int collect(const rig_caps *caps,rig_ptr_t) { capsList.append(caps); return 1; } rigControl::rigControl(int radioIndex) { rigControlEnabled=false; catParams.configLabel=QString("radio%1").arg(radioIndex); rig_set_debug(RIG_DEBUG_NONE); getRadioList(); serialP=0; lastFrequency=0.0; xmlModes<<"USB"<<"LSB"<<"FM"<<"AM"; } rigControl::~rigControl() { rig_close(my_rig); /* close port */ rig_cleanup(my_rig); /* if you care about memory */ } bool rigControl::init() { int retcode; if(!catParams.enableCAT) return false; catParams.radioModelNumber=getModelNumber(getRadioModelIndex()); my_rig = rig_init(catParams.radioModelNumber); if(!my_rig) { addToLog(QString("Error in connection using radio model %1").arg(catParams.radioModel),LOGALL); initError=QString("Error in connection using radio model %1").arg(catParams.radioModel); return false; } if(QString(my_rig->caps->mfg_name)=="Icom") { if(!catParams.civAddress.isEmpty()) { rig_set_conf(my_rig, rig_token_lookup(my_rig, "civaddr"), catParams.civAddress.toLatin1()); } } strncpy(my_rig->state.rigport.pathname,(const char *)catParams.serialPort.toLatin1().data(),FILPATHLEN); strncpy(my_rig->state.pttport.pathname,(const char *)catParams.serialPort.toLatin1().data(),FILPATHLEN); my_rig->state.rigport.parm.serial.rate = catParams.baudrate; my_rig->state.rigport.parm.serial.data_bits=catParams.databits; my_rig->state.rigport.parm.serial.stop_bits=catParams.stopbits; if(catParams.parity=="Even") my_rig->state.rigport.parm.serial.parity= RIG_PARITY_EVEN; else if (catParams.parity=="Odd") my_rig->state.rigport.parm.serial.parity = RIG_PARITY_ODD; else my_rig->state.rigport.parm.serial.parity = RIG_PARITY_NONE; if(catParams.handshake=="XOn/Xoff") my_rig->state.rigport.parm.serial.handshake = RIG_HANDSHAKE_XONXOFF; if(catParams.handshake=="Hardware") my_rig->state.rigport.parm.serial.handshake = RIG_HANDSHAKE_HARDWARE; else my_rig->state.rigport.parm.serial.handshake = RIG_HANDSHAKE_NONE; my_rig->state.pttport.type.ptt = catParams.pttType; addToLog(QString("rigcontrol:init rigport.pathname: %1").arg(my_rig->state.rigport.pathname),LOGRIGCTRL); retcode = rig_open(my_rig); if (retcode != RIG_OK ) { addToLog(QString("CAT Error: %1").arg(QString(rigerror(retcode))),LOGALL); initError=QString("CAT Error: %1").arg(QString(rigerror(retcode))); return false; } addToLog("rigcontroller successfully opened",LOGRIGCTRL); rigControlEnabled=true; // int verbose=0; // rig_set_debug(verbose<2 ? RIG_DEBUG_NONE: (rig_debug_level_e)verbose); // rig_debug(RIG_DEBUG_VERBOSE, "rigctl, %s\n", hamlib_version); // test if we can contact the tranceiver canSetFreq=(my_rig->caps->set_freq != NULL); canGetFreq=(my_rig->caps->get_freq != NULL); canSetMode=(my_rig->caps->set_mode != NULL); canGetMode=(my_rig->caps->get_mode != NULL); canSetPTT=(my_rig->caps->set_ptt != NULL); canGetPTT=(my_rig->caps->get_ptt != NULL); double fr; if(!getFrequency(fr)) { // rigControlEnabled=false; } return true; } bool rigControl::getFrequency(double &frequency) { int retcode; if(catParams.enableXMLRPC) { frequency=xmlIntfPtr->getFrequency(); } else { if(!rigControlEnabled || !canGetFreq) return false; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &frequency); if (retcode != RIG_OK ) frequency=lastFrequency; // {errorMessage(retcode,"getFrequency"); return false; } } return true; } bool rigControl::setFrequency(double frequency) { int retcode; if(catParams.enableXMLRPC) { xmlIntfPtr->setFrequency(frequency); } else { if(!rigControlEnabled || !canSetFreq) return false; // retcode = rig_set_vfo(my_rig, RIG_VFO_CURR); // if (retcode != RIG_OK ) {errorMessage(retcode,"setVFO"); return false; } retcode = rig_set_freq(my_rig, RIG_VFO_CURR, frequency); if (retcode != RIG_OK ) {errorMessage(retcode,"setFrequency"); return false; } } return true; } void rigControl::disable() { if(rigControlEnabled) { rig_close(my_rig); /* close port */ rig_cleanup(my_rig); rigControlEnabled=false; } } bool rigControl::getMode(QString &mode) { if(catParams.enableXMLRPC) { mode =xmlIntfPtr->getMode(); } else { rmode_t rmode; pbwidth_t width; int retcode; if(!rigControlEnabled || !canGetMode) return false; retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (retcode != RIG_OK ) {errorMessage(retcode,"getMode"); return false; } mode=QString(rig_strrmode(rmode)); } return true; } bool rigControl::setMode(QString mode) { QString orgMode; int i; int pos=-1; if(catParams.enableXMLRPC) { orgMode=xmlIntfPtr->getMode(); for(i=0;i=0) { orgMode.replace(xmlModes.at(i),mode); break; } } if(pos>=0) xmlIntfPtr->setMode(orgMode); } else { rmode_t rmode=rig_parse_mode(mode.toLatin1().data()); int retcode; if(!rigControlEnabled || !canSetMode) return false; retcode = rig_set_mode(my_rig, RIG_VFO_CURR, rmode, rig_passband_normal(my_rig,rmode)); if (retcode != RIG_OK ) {errorMessage(retcode,"setMode"); return false; } } return true; } bool rigControl::setPTT(bool on) { int retcode; ptt_t ptt; /* Hamlib will fall back to RIG_PTT_ON if RIG_PTT_ON_DATA is not available in current hamlib configuration */ if(on) ptt=RIG_PTT_ON_DATA; else ptt=RIG_PTT_OFF; if(!rigControlEnabled || !canSetPTT) return false; retcode = rig_set_ptt (my_rig, RIG_VFO_CURR,ptt); if (retcode != RIG_OK ) {errorMessage(retcode,"setPTT"); return false; } return true; } void rigControl::errorMessage(int errorCode,QString command) { QMessageBox::information(0,"Cat interface",QString("Error in connection: %1\n%2").arg(QString(rigerror(errorCode))).arg(command)); } void rigControl::getRadioList() { if(!radiolistLoaded) { capsList.clear(); rig_load_all_backends(); rig_list_foreach(collect,0); qSort(capsList.begin(),capsList.end(),model_Sort); radiolistLoaded=true; } } bool rigControl::getRadioList(QComboBox *cb) { int i; if(capsList.count()==0) return false; QStringList sl; for (i=0;irig_model); t=t.rightJustified(5,' ')+" "; t+= capsList.at(i)->mfg_name; t+=","; t+=capsList.at(i)->model_name; sl << t; } cb->addItems(sl); return true; } int rigControl::getModelNumber(int idx) { if(idx<0) return 0; return capsList.at(idx)->rig_model; } int rigControl::getRadioModelIndex() { int i; QString t=catParams.radioModel; t=t.remove(0,5); t=t.simplified(); QStringList sl=t.split(","); if(sl.count()==1) sl.append(""); for(i=0;imfg_name==sl.at(0)) && (capsList.at(i)->model_name==sl.at(1))) { return i; } } return -1; } bool model_Sort(const rig_caps *caps1,const rig_caps *caps2) { if(caps1->mfg_name==caps2->mfg_name) { if (QString::compare(caps1->model_name,caps2->model_name)<0) return true; return false; } if (QString::compare(caps1->mfg_name,caps2->mfg_name)<0) return true; return false; } void rigControl::activatePTT(bool b) { int modemlines; if(catParams.enableSerialPTT) { if (catParams.pttSerialPort.isEmpty()) return; if(serialP==0) { serialP=::open(catParams.pttSerialPort.toLatin1().data(),O_RDWR); if (serialP<=0) { QMessageBox::warning(txWidgetPtr,"Serial Port Error", QString("Unable to open serial port %1\ncheck Options->Configuration\n" "make sure that you have read/write permission\nIf you do not have a serial port,\n" "then disable -Serial PTT- option in the configuration").arg(catParams.pttSerialPort) , QMessageBox::Ok,0 ); return; } else { ioctl(serialP,TIOCMGET,&modemlines); if(catParams.activeDTR) modemlines &= ~TIOCM_DTR; if(catParams.activeRTS)modemlines &= ~TIOCM_RTS; if(catParams.nactiveDTR) modemlines |= ~TIOCM_DTR; if(catParams.nactiveRTS)modemlines |= ~TIOCM_RTS; ioctl(serialP,TIOCMSET,&modemlines); } } if(serialP>0) { if(b) { ioctl(serialP,TIOCMGET,&modemlines); if(catParams.activeDTR) modemlines |= TIOCM_DTR; if(catParams.activeRTS)modemlines |= TIOCM_RTS; if(catParams.nactiveDTR) modemlines &= ~TIOCM_DTR; if(catParams.nactiveRTS)modemlines &= ~TIOCM_RTS; ioctl(serialP,TIOCMSET,&modemlines); //ioctl(serial,TIOCMBIS,&t); } else { ioctl(serialP,TIOCMGET,&modemlines); if(catParams.activeDTR) modemlines &= ~TIOCM_DTR; if(catParams.activeRTS) modemlines &= ~TIOCM_RTS; if(catParams.nactiveDTR) modemlines |= ~TIOCM_DTR; if(catParams.nactiveRTS)modemlines |= ~TIOCM_RTS; ioctl(serialP,TIOCMSET,&modemlines); // ioctl(serial,TIOCMBIC,&t); } } } else if(catParams.enableXMLRPC) { xmlIntfPtr->activatePTT(b); } else rigControllerPtr->setPTT(b); // does nothing if rigController is disabled mainWindowPtr->setPTT(b); if(b) { addToLog("dispatcher: PTT activated",LOGDISPATCH); } else { addToLog("dispatcher: PTT deactivated",LOGDISPATCH); } } int rigControl::rawCommand(QByteArray ba) { int i; bool result; char rxBuffer[100]; QString command="w "; QByteArray cmdBa; if(!rigControlEnabled) return 0; struct rig_state *rs; rs = &my_rig->state; // check if backend via rigctld if(catParams.radioModelNumber==2) { // we need to send this as a command string if(additionalCommandHex) { for(i=0;irigport,cmdBa.constData(), cmdBa.count()); } else { result=write_block(&rs->rigport,ba.constData(), ba.count()); } read_block(&rs->rigport,rxBuffer,99); return result; } qsstv_9.2.6/qsstv/rig/rigcontrol.h0000664000175000017500000000413713203343610015726 0ustar jomajoma#ifndef RIGCONTROL_H #define RIGCONTROL_H #include #include "xmlinterface.h" #include #include extern "C" int write_block(hamlib_port_t *p, const char *txbuffer, size_t count); extern "C" int read_block(hamlib_port_t *p, char *rxbuffer, size_t count); bool model_Sort(const rig_caps *caps1,const rig_caps *caps2); struct scatParams { QString configLabel; QString serialPort; /**< serial port device*/ QString radioModel; int radioModelNumber; QString civAddress; int baudrate; /**< serial port baudrate*/ QString parity; int stopbits; int databits; QString handshake; bool enableCAT; bool enableSerialPTT; QString pttSerialPort; bool activeRTS; bool activeDTR; bool nactiveRTS; bool nactiveDTR; ptt_type_t pttType; bool enableXMLRPC; int XMLRPCPort; double txOnDelay; }; class rigControl: public QObject { Q_OBJECT public: rigControl(int radioIndex); ~rigControl(); bool init(); bool enabled() {return rigControlEnabled;} bool getFrequency(double &frequency); bool setFrequency(double frequency); bool getMode(QString &mode); bool setMode(QString mode); int getModelNumber(int idx); int getRadioModelIndex(); bool getRadioList(QComboBox *cb); void disable(); scatParams* params() {return &catParams;} void activatePTT(bool b); double getTxDelay() {return catParams.txOnDelay;} int rawCommand(QByteArray ba); QString initError; private: RIG *my_rig; // handle to rig (nstance) freq_t freq; // frequency rmode_t rmode; // radio mode of operation pbwidth_t width; vfo_t vfo; // vfo selection int strength; // S-Meter level int retcode; // generic return code from functions rig_model_t myrig_model; bool rigControlEnabled; void errorMessage(int errorCode,QString command); void getRadioList(); scatParams catParams; int serialP; bool setPTT(bool On); double lastFrequency; QStringList xmlModes; bool canSetFreq; bool canGetFreq; bool canSetMode; bool canGetMode; bool canSetPTT; bool canGetPTT; }; #endif qsstv_9.2.6/qsstv/scope/plotform.ui0000664000175000017500000001561113203343610016123 0ustar jomajoma plotForm 0 0 866 524 Scope 2 1 0 10 2 300 0 QFrame::Box QFrame::Sunken 2 false 300 0 QFrame::Box QFrame::Sunken 2 false 300 0 QFrame::Box QFrame::Sunken 2 false Qt::Horizontal QSizePolicy::Expanding 74 20 75 true < 75 true > Samples true Qt::Horizontal QSizePolicy::Expanding 73 20 2 Position 1 0 150 0 Zoom 10 0 150 0 QwtPlot QFrame
qwt_plot.h
1
QwtWheel QWidget
qwt_wheel.h
qsstv_9.2.6/qsstv/scope/scopeoffset.cpp0000664000175000017500000000062113203343610016741 0ustar jomajoma#include "scopeoffset.h" #include "ui_scopeoffset.h" uint dataScopeOffset; scopeOffset::scopeOffset(QWidget *parent) : QDialog(parent), ui(new Ui::scopeOffset) { ui->setupUi(this); } scopeOffset::~scopeOffset() { delete ui; } void scopeOffset::setOffset(unsigned int offset) { ui->spinBox->setValue(offset); } unsigned int scopeOffset::getOffset() { return ui->spinBox->value(); } qsstv_9.2.6/qsstv/scope/scopeoffset.h0000664000175000017500000000060413203343610016407 0ustar jomajoma#ifndef SCOPEOFFSET_H #define SCOPEOFFSET_H #include extern uint dataScopeOffset; namespace Ui { class scopeOffset; } class scopeOffset : public QDialog { Q_OBJECT public: explicit scopeOffset(QWidget *parent = 0); ~scopeOffset(); void setOffset(unsigned int offset); unsigned int getOffset(); private: Ui::scopeOffset *ui; }; #endif // SCOPEOFFSET_H qsstv_9.2.6/qsstv/scope/scopeoffset.ui0000664000175000017500000000411313203343610016574 0ustar jomajoma scopeOffset 0 0 417 149 Scope Sample Offset Select offset 10000 10 K samples Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() scopeOffset accept() 248 254 157 274 buttonBox rejected() scopeOffset reject() 316 260 286 274 qsstv_9.2.6/qsstv/scope/scopeplot.cpp0000664000175000017500000003475213203343610016445 0ustar jomajoma/*************************************************************************** * Copyright (C) 2008 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "scopeplot.h" #include "appglobal.h" #include "qwt_plot.h" #include "qwt_plot_curve.h" #include "qwt_plot_grid.h" #include "qwt_plot_marker.h" #include "qwt_plot_canvas.h" #include "qwt_plot_picker.h" #include "qwt_picker_machine.h" #include "qwt_legend_label.h" #include "qwt_symbol.h" #include #include #include scopePlot::scopePlot(QString title, QWidget *parent) : QMainWindow(parent) { wd=new QWidget(this); ui.setupUi(wd); mrk1=0; mrk2=0; initActions(); initMenuBar(); initToolBar(); initStatusBar(); curve1 = new QwtPlotCurve("Curve 1"); curve2 = new QwtPlotCurve("Curve 2"); curve3 = new QwtPlotCurve("Curve 3"); curve4 = new QwtPlotCurve("Curve 4"); xScaleMul=1.; xPrimeScaleMul=1.; xAltScaleMul=1; xAxisTitle="Samples"; xAltAxisTitle="Time (s)"; toggleMarker=false; showCrv1=true; showCrv2=true; showCrv3=true; showCrv4=true; setWindowTitle("Scope " +qsstvVersion); init(title); } scopePlot::~scopePlot() { delete curve1; delete curve2; delete curve3; delete curve4; delete toolsMenu; } void scopePlot::setXScaleMultiplier(double mul) { xPrimeScaleMul=mul; xScaleMul=mul; } void scopePlot::setAlternativeScaleMultiplier(double mul) { xAltScaleMul=mul; } void scopePlot::initActions() { zoomAction = new QAction(QIcon(":/icons/viewmagplus.png"), tr("&Zoom"), this); zoomAction->setCheckable(true); zoomAction->setStatusTip(tr("Zoom in or out")); connect(zoomAction, SIGNAL(toggled(bool)), this, SLOT(slotZoom(bool))); } void scopePlot::initMenuBar() { toolsMenu=new QMenu(tr("&Zoom")); toolsMenu->addAction(zoomAction); menuBar()->addMenu(toolsMenu); } void scopePlot::initToolBar() { } void scopePlot::initStatusBar() { } void scopePlot::init(QString title) { setup=true; setCentralWidget(wd); connect(ui.offsetWheel, SIGNAL(valueChanged(double)),SLOT(slotOffsetChanged(double ))); connect(ui.rangeWheel, SIGNAL(valueChanged(double)), SLOT(slotRangeChanged(double ))); connect(ui.samplesPushButton, SIGNAL(clicked()), this, SLOT(slotSamplesButtton())); plW=ui.plotWindow; plW->setTitle(title); plW->setCanvasBackground(Qt::darkBlue); curve1->attach(plW); curve2->attach(plW); curve3->attach(plW); curve4->attach(plW); plW->setAxisTitle(QwtPlot::xBottom,xAxisTitle); plW->setAxisScale(QwtPlot::xBottom, 0, 100); plW->setAxisTitle(QwtPlot::yLeft, "Values"); plW->setAxisScale(QwtPlot::yLeft, -1.5, 1.5); QwtPlotGrid *grid = new QwtPlotGrid; grid->enableXMin(true); grid->setMajorPen(QPen(Qt::white, 0, Qt::DotLine)); grid->setMinorPen(QPen(Qt::gray, 0 , Qt::DotLine)); grid->attach(plW); QwtText m1("M1"); m1.setColor(QColor(Qt::white)); marker1=new QwtPlotMarker(); marker1->setValue(0.0, 0.0); marker1->setLabel(m1); marker1->setLabelAlignment(Qt::AlignRight | Qt::AlignBottom); marker1->setLinePen(QPen(QColor(200,150,0), 0, Qt::DashDotLine)); marker1->setSymbol( new QwtSymbol(QwtSymbol::Diamond,QColor(Qt::green), QColor(Qt::green), QSize(7,7))); // marker1->hide(); marker1->attach(plW); QwtText m2("M2"); m2.setColor(QColor(Qt::white)); marker2=new QwtPlotMarker(); marker2->setValue(0.0, 0.0); marker2->setLabel(m2); marker2->setLabelAlignment(Qt::AlignLeft | Qt::AlignTop); marker2->setLinePen(QPen(QColor(200,150,0), 0, Qt::DashDotLine)); marker2->setSymbol( new QwtSymbol(QwtSymbol::Diamond,QColor(Qt::yellow), QColor(Qt::yellow), QSize(7,7))); // marker2->hide(); marker2->attach(plW); legend = new QwtLegend; legend->setFrameStyle(QFrame::Box|QFrame::Sunken); legend->setDefaultItemMode(QwtLegendData::Checkable); QPalette pal(legend->palette()); pal.setColor(QPalette::Window,Qt::darkBlue); pal.setColor(QPalette::WindowText,Qt::white); pal.setColor(QPalette::Text,Qt::black); legend->setPalette(pal); plW->insertLegend(legend, QwtPlot::BottomLegend); picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, plW->canvas()); picker->setStateMachine(new QwtPickerDragPointMachine()); picker->setRubberBandPen(QColor(Qt::green)); picker->setRubberBand(QwtPicker::CrossRubberBand); picker->setTrackerPen(QColor(Qt::white)); picker->setEnabled(true); plW->replot(); QwtPlotItemList items = plW->itemList( QwtPlotItem::Rtti_PlotCurve); for ( int i = 0; i < items.size(); i++ ) { const QVariant itemInfo = plW->itemToInfo( items[i] ); QwtLegendLabel *legendLabel =qobject_cast( legend->legendWidget( itemInfo ) ); if (legendLabel ) { legendLabel->setChecked( true ); } items[i]->setVisible( true ); } connect(picker, SIGNAL(moved(const QPointF &)),SLOT(pickerMoved(const QPointF &))); connect(picker, SIGNAL(selected(const QPointF &)), SLOT(pickerSelected(const QPointF &))); connect(legend, SIGNAL(checked(const QVariant &, bool ,int)),SLOT(legendClicked(const QVariant &,bool))); connect(ui.nextButton, SIGNAL(clicked()),SLOT(slotNext())); connect(ui.previousButton, SIGNAL(clicked()),SLOT(slotPrevious())); plW->setAxisTitle(QwtPlot::xBottom,xAxisTitle); xOffset=0; } void scopePlot::setCurveOn(int i,bool b) { QwtPlotItemList items = plW->itemList( QwtPlotItem::Rtti_PlotCurve); if(i>=items.size()) return; const QVariant itemInfo = plW->itemToInfo( items[i] ); QwtLegendLabel *legendLabel =qobject_cast( legend->legendWidget( itemInfo ) ); if (legendLabel ) { legendLabel->setChecked(b); } items[i]->setVisible( b ); } void scopePlot::slotSamplesButtton() { long i; if (ui.samplesPushButton->isChecked()) { ui.samplesPushButton->setText(xAltAxisTitle); plW->setAxisTitle(QwtPlot::xBottom,xAltAxisTitle); xScaleMul=xAltScaleMul; ui.offsetWheel->setSingleStep(10*xScaleMul); ui.rangeWheel->setSingleStep(10*xScaleMul); } else { ui.samplesPushButton->setText(xAxisTitle); plW->setAxisTitle(QwtPlot::xBottom,xAxisTitle); xScaleMul=xPrimeScaleMul; ui.offsetWheel->setSingleStep(1); ui.rangeWheel->setSingleStep(1); } for(i=0;isetPageStepCount(10); ui.rangeWheel->setPageStepCount(10); if(x.size()==c1.size()) curve1->setSamples(x.data(), c1.data(), x.size()); if(x.size()==c3.size()) curve2->setSamples(x.data(), c3.data(), x.size()); if(x.size()==c3.size()) curve3->setSamples(x.data(), c3.data(), x.size()); if(x.size()==c4.size()) curve4->setSamples(x.data(), c4.data(), x.size()); setupWheels(x.size()); plW->replot(); } void scopePlot::plot1DUpdate(double *data) { for (long i = 0; i < c1.size(); i++) { c1[i]=data[i]; } curve1->setSamples(x.data(), c1.data(), x.size()); plW->replot(); } void scopePlot::plotData(unsigned int size, short int * iData, QString curve1Name,QString yLLabel, double * dData, QString curve2Name, QString yRLabel) { add1(iData,size,curve1Name,yLLabel); add3(dData,size,curve2Name,yRLabel); show(); } void scopePlot::plotData(unsigned int size, double * dData1, QString curve1Name, QString yLLabel, double * dData2, QString curve2Name, QString yRLabel) { add1(dData1,size,curve1Name,yLLabel); add3(dData2,size,curve2Name,yRLabel); show(); } void scopePlot::add1(short int *data, unsigned long len,QString name,QString yLeftLabel) { x.resize(len); c1.resize(len); for (unsigned long i = 0; i < len; i++) { x[i]=(double)(i+xOffset)*xScaleMul; c1[i]=(double)data[i]; } plot1(name,yLeftLabel); } void scopePlot::add1(double *data, unsigned long len,QString curveName,QString yLeftLabel) { x.resize(len); c1.resize(len); for (unsigned long i = 0; i < len; i++) { x[i]=(double)(i+xOffset)*xScaleMul; c1[i]=data[i]; } plot1(curveName,yLeftLabel); } void scopePlot::add2(double *data, unsigned long len,QString curveName) { c2.resize(len); for (unsigned long i = 0; i < len; i++) { c2[i]=data[i]; } plot2(curveName); } void scopePlot::add3(double *data, unsigned long len,QString curveName,QString yRightLabel) { c3.resize(len); for (unsigned long i = 0; i < len; i++) { c3[i]=data[i]; } plot3(curveName,yRightLabel); } void scopePlot::add4(double *data, unsigned long len,QString curveName) { c4.resize(len); for (unsigned long i = 0; i < len; i++) { c4[i]=data[i]; } plot4(curveName); } void scopePlot::show() { QMainWindow::show(); plW->show(); plW->replot(); } void scopePlot::refresh() { plW->replot(); } void scopePlot::plot1(QString curveName,QString yLeftLabel) { plW->setAxisTitle(QwtPlot::yLeft, yLeftLabel); plW->setAxisAutoScale(QwtPlot::yLeft); plW->setAxisAutoScale(QwtPlot::xBottom); curve1->setTitle(curveName); curve1->setPen(QPen(Qt::yellow)); curve1->setYAxis(QwtPlot::yLeft); curve1->setSamples(x.data(), c1.data(), x.size()); setupWheels(x.size()); } void scopePlot::plot2(QString curveName) { // axes plW->setAxisAutoScale(QwtPlot::yLeft); plW->enableAxis(QwtPlot::yLeft); curve2->setTitle(curveName); curve2->setPen(QPen(Qt::red)); curve2->setYAxis(QwtPlot::yLeft); curve2->setSamples(x.data(), c2.data(), x.size()); plW->replot(); } void scopePlot::plot3(QString curveName,QString yRightLabel) { // axes plW->setAxisTitle(QwtPlot::yRight,yRightLabel); plW->enableAxis(QwtPlot::yRight); curve3->setTitle(curveName); curve3->setPen(QPen(Qt::green)); curve3->setYAxis(QwtPlot::yRight); curve3->setSamples(x.data(), c3.data(), x.size()); plW->setAxisAutoScale(QwtPlot::yRight); plW->replot(); } void scopePlot::plot4(QString curveName) { // axes plW->setAxisAutoScale(QwtPlot::yRight); plW->enableAxis(QwtPlot::yRight); curve4->setTitle(curveName); curve4->setPen(QPen(Qt::white)); curve4->setYAxis(QwtPlot::yRight); curve4->setSamples(x.data(), c4.data(), x.size()); plW->replot(); } void scopePlot::slotZoom(bool) { } void scopePlot::slotOffsetChanged(double ioffset) { if (setup) return; if((ioffset-range/2)setValue(startPoint+range/2); return; } if((ioffset+range/2)>endPoint) { ui.offsetWheel->setValue(endPoint-range/2); return; } dispCenter=ioffset; plW->setAxisScale(QwtPlot::xBottom,dispCenter-range/2,dispCenter+range/2); plW->replot(); } void scopePlot::slotRangeChanged(double irange) { if (setup) return; if((dispCenter-irange/2)setValue((dispCenter-startPoint)*1.999); return; } if((dispCenter+irange/2)>endPoint) { ui.rangeWheel->setValue((endPoint-dispCenter)*1.999); return; } range=irange; plW->setAxisScale(QwtPlot::xBottom,dispCenter-range/2,dispCenter+range/2); plW->replot(); } void scopePlot::setupWheels(int size) { setup=true; // offset is from 0 to size-range // range is from 10 to if (x.size()==0) { QMessageBox::warning(0,"Scope Plot", "No data in Scope Plot" , QMessageBox::Ok,0 ); return; } blockSignals(true); startPoint=x[0]; endPoint=x[size-1]; range=endPoint-startPoint; dispCenter=(endPoint+startPoint)/2; ui.offsetWheel->setMass(0.5); ui.rangeWheel->setMass(0.5); ui.offsetWheel->setRange(startPoint, endPoint); ui.offsetWheel->setTotalAngle(3600.0); ui.rangeWheel->setRange(range/200., range); // range=endPoint-startPoint; ui.rangeWheel->setTotalAngle(3600.0); blockSignals(false); ui.offsetWheel->setValue(dispCenter); ui.rangeWheel->setValue(range); setup=false; plW->setAxisScale(QwtPlot::xBottom,dispCenter-range/2,dispCenter+range/2); } void scopePlot::pickerMoved(const QPointF &pos) { QString info; info.sprintf("x=%7g, yL=%7g, yR=%7g", plW->invTransform(QwtPlot::xBottom, pos.x()), plW->invTransform(QwtPlot::yLeft, pos.y()), plW->invTransform(QwtPlot::yRight, pos.y()) ); // ui.positionLabel->setText(info); } void scopePlot::pickerSelected(const QPointF &pos) { if (!toggleMarker) { marker1->setValue(pos); } else { marker2->setValue(pos); } toggleMarker=!toggleMarker; showMarker(); plW->replot(); } void scopePlot::showMarker() { QString t1,t2,t3; t1="M1 : "+QString::number(marker1->xValue(),'g',7).rightJustified(11)+QString::number(marker1->yValue(),'g',7).rightJustified(11); t2="M2 : "+QString::number(marker2->xValue(),'g',7).rightJustified(11)+QString::number(marker2->yValue(),'g',7).rightJustified(11); t3="DIF: "+QString::number(marker2->xValue()-marker1->xValue(),'g',7).rightJustified(11)+QString::number(marker2->yValue()-marker1->yValue(),'g',7).rightJustified(11); ui.marker1Label->setText(t1); ui.marker2Label->setText(t2); ui.marker3Label->setText(t3); } void scopePlot::legendClicked(const QVariant &itemInfo, bool on) { QwtPlotItem *plotItem = plW->infoToItem( itemInfo ); if ( plotItem ) { plotItem->setVisible( on ); plW->replot(); } } qsstv_9.2.6/qsstv/scope/scopeplot.h0000664000175000017500000001254313203343610016104 0ustar jomajoma/*************************************************************************** * Copyright (C) 2008 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SCOPEPLOT_H #define SCOPEPLOT_H #include #include #include "ui_plotform.h" #include "qwt_plot.h" #include "qwt_legend.h" class QwtPlotCurve; class QwtPlotMarker; class QwtPlotPicker; /**Data plotting in scope format *@author Johan Maes -- ON4QZ */ class scopePlot : public QMainWindow { Q_OBJECT public: scopePlot(QString title,QWidget *parent=0); ~scopePlot(); void setXScaleMultiplier(double mul); void setAlternativeScaleMultiplier(double mul); void setOffset(unsigned int offset) {xOffset=offset;} void init(QString title=QString::null); void add1(short int *data, unsigned long len,QString curveName,QString yLeftLabel); void add1(double *data, unsigned long len,QString curveName,QString yLeftLabel); void add2(double *data, unsigned long len,QString curveName); void add3(double *data, unsigned long len,QString curveName,QString yRightLabel); void add4(double *data, unsigned long len,QString curveName); void plot1(QString name,QString yLeftLabel); void plot2(QString curveName); void plot3(QString curveName,QString yRightLabel); void plot4(QString curveName); void plotData(unsigned int size, short int * iData, QString curve1Name, QString yLLabel, double * dData, QString curve2Name, QString yRLabel); void plotData(unsigned int size, double * dData1, QString curve1Name, QString yLLabel, double * dData2, QString curve2Name, QString yRLabel); void show(); void plot1DUpdate(double *data); void XYL(unsigned int i,int ix,int iy) { x[i]=(double)ix; c1[i]=(double)iy; } void X(unsigned int i,int ix) { x[i]=(double)ix; } void YL(unsigned int i,int iy) { c1[i]=(double)iy; } void YR(unsigned int i,int iy) { c3[i]=(double)iy; } void XYLYR(unsigned int i,int ix,int iyl,int iyr) { x[i]=(double)ix; c1[i]=(double)iyl; c3[i]=(double)iyr; } void XYL(unsigned int i,double ix,double iy) { x[i]=ix; c1[i]=iy; } void X(unsigned int i,double ix) { x[i]=ix; } void YL(unsigned int i,double iy) { c1[i]=iy; } void YR(unsigned int i,double iy) { c3[i]=iy; } void XYLYR(unsigned int i,double ix,double iyl,double iyr) { x[i]=ix; c1[i]=iyl; c3[i]=iyr; } void resize(unsigned long i) { x.resize(i); c1.resize(i); c3.resize(i); } void refresh(); public slots: void slotZoom(bool b); void slotOffsetChanged(double offset); void slotRangeChanged(double range); void pickerMoved(const QPointF &pos); void pickerSelected(const QPointF &pos); // void plotMouseMoved(const QMouseEvent &e); // void plotMouseReleased(const QMouseEvent &e); void legendClicked(const QVariant &itemInfo, bool on); void slotNext() { emit next(); } void slotPrevious() { emit previous(); } void slotSamplesButtton(); void setCurveOn(int i,bool b); signals: void next(); void previous(); private: QwtPlot *plW; QToolBar *toolsToolbar; QMenu *toolsMenu; QAction *zoomAction; // plotForm *pl; QVector x; QVector c1; QVector c2; QVector c3; QVector c4; double startPoint; double endPoint; double dispCenter; void initActions(); void initMenuBar(); void initToolBar(); void initStatusBar(); void setupWheels(int size); double xScaleMul; double xPrimeScaleMul; double xAltScaleMul; bool setup; long int mrk1,mrk2; void showMarker(); bool toggleMarker; bool showCrv1; bool showCrv2; bool showCrv3; bool showCrv4; Ui::plotForm ui; QWidget *wd; QwtPlotCurve *curve1; QwtPlotCurve *curve2; QwtPlotCurve *curve3; QwtPlotCurve *curve4; QwtPlotMarker *marker1; QwtPlotMarker *marker2; QwtLegend *legend; QwtPlotPicker *picker; QString xAxisTitle; QString xAltAxisTitle; double range; unsigned int xOffset; }; #endif qsstv_9.2.6/qsstv/scope/scopeview.cpp0000664000175000017500000001773013203343610016436 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #include "scopeview.h" #include "utils/loggingparams.h" scopeView::scopeView(QString title) : scopePlot(title) { xOffset=0; init(); } scopeView::~scopeView() { } void scopeView::init() { setCurveName("data1",SCDATA1); setCurveName("data2",SCDATA2); setCurveName("data3",SCDATA3); setCurveName("data4",SCDATA4); clear(); } void scopeView::clear() { int i; index=0; for (i=0;iSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,float *data,unsigned int position,unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx, qint8 *data, unsigned int position, unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,quint8 *data, unsigned int position, unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,qint16 *data,unsigned int position,unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,quint16 *data,unsigned int position,unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,qint32 *data,unsigned int position,unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::addData(ecurve Idx,quint32 *data,unsigned int position,unsigned int len) { unsigned int i,j; double *ar=NULL; if(positionSCOPEMAXDATA) i=SCOPEMAXDATA; index=i; addToLog(QString("data1 %1").arg(index+xOffset),LOGSCOPE); } void scopeView::setCurveName(QString title,int idx) { if((idx>=0)&&(idx<=SCDATA4)) { curveNameArray[idx]=title; } } void scopeView::show(bool d1,bool d2,bool d3,bool d4) { if(d1) { add1(array1,index,curveNameArray[SCDATA1],yLeftTitle); setCurveOn(SCDATA1,true); } else setCurveOn(SCDATA1,false); if(d2) { add2(array2,index,curveNameArray[SCDATA2]); setCurveOn(SCDATA2,true); } else setCurveOn(SCDATA2,false); if (d3) { add3(array3,index,curveNameArray[SCDATA3],yRightTitle); setCurveOn(SCDATA3,true); } else setCurveOn(SCDATA3,false); if (d4) { add4(array4,index,curveNameArray[SCDATA4]); setCurveOn(SCDATA4,true); } else setCurveOn(SCDATA4,false); scopePlot::show(); } qsstv_9.2.6/qsstv/scope/scopeview.h0000664000175000017500000000732413203343610016101 0ustar jomajoma/*************************************************************************** * Copyright (C) 2005 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * In addition, as a special exception, the copyright holders give * * permission to link the code of this program with any edition of * * the Qt library by Trolltech AS, Norway (or with modified versions * * of Qt that use the same license as Qt), and distribute linked * * combinations including the two. You must obey the GNU General * * Public License in all respects for all of the code used other than * * Qt. If you modify this file, you may extend this exception to * * your version of the file, but you are not obligated to do so. If * * you do not wish to do so, delete this exception statement from * * your version. * ***************************************************************************/ #ifndef SCOPEVIEW_H #define SCOPEVIEW_H #include "appglobal.h" #include #include "scopeplot.h" #define SCOPEMAXDATA 300000 /** @author Johan Maes */ enum ecurve{SCDATA1,SCDATA2,SCDATA3,SCDATA4}; #define NUMCURVES 4 class scopeView: public scopePlot { public: scopeView(QString title); ~scopeView(); void init(); void clear(); void setOffset (int xoffset); void addData(ecurve Idx,double *data,unsigned int position,unsigned int len); void addData(ecurve Idx,float *data,unsigned int position,unsigned int len); void addData(ecurve Idx,qint8 *data,unsigned int position,unsigned int len); void addData(ecurve Idx,quint8 *data,unsigned int position,unsigned int len); void addData(ecurve Idx,qint16 *data,unsigned int position,unsigned int len); void addData(ecurve Idx,quint16 *data,unsigned int position,unsigned int len); void addData(ecurve Idx,qint32 *data,unsigned int position,unsigned int len); void addData(ecurve Idx,quint32 *data,unsigned int position,unsigned int len); void show(bool data,bool sync,bool state,bool d4); void setCurveName(QString title,int idx); void setAxisTitles(QString x,QString yData1,QString yData2) { xTitle=x; yLeftTitle=yData1; yRightTitle=yData2; } private: double array1[SCOPEMAXDATA]; double array2[SCOPEMAXDATA]; double array3[SCOPEMAXDATA]; double array4[SCOPEMAXDATA]; unsigned int index; QString curveNameArray[NUMCURVES]; QString xTitle; QString yLeftTitle; QString yRightTitle; unsigned int xOffset; }; #endif qsstv_9.2.6/qsstv/sound/calibration.cpp0000664000175000017500000001326313203343610016735 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "calibration.h" #include "ui_calibration.h" #include #include "appglobal.h" #include "soundbase.h" #include "dispatcher.h" #include #include "QMessageBox" #include #define ITERATIONS 8000 /** * \class calibration * * Check first if ntp is running and it is synchronised. A dialog window will appear and show the progress of the RX and TX clocks. * About 10000 blocks of data will be read/written to calculate the exact timing. If the OK button is pressed, the clocks will be saved for later use. * **/ /** * @brief Calibration constructor * * @param parent parent widget pointer */ calibration::calibration(QWidget *parent) : QDialog(parent), ui(new Ui::calibration) { ui->setupUi(this); init(); } calibration::~calibration() { delete ui; } /** * @brief start calibration * * Call this function to start the calibration proces. The use the results, check the return status and get the value of the clocks by calling getRXClock() and getTXClock(). * * \sa getRXClock() \sa getTXClock() * * @return bool true if calibration is successful. Return false if an error occured or the dialog was canceled */ int calibration::exec() { init(); show(); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); if(!start(true)) return QDialog::Rejected; if(!start(false)) return QDialog::Rejected; ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); while(!stopped) { qApp->processEvents(); } if(!canceled) return QDialog::Accepted; return QDialog::Rejected; } /** * @brief initialize * * This function is called by exec to initialize the calibration and setup the dialog box * */ void calibration::init() { stopped=false; canceled=false; // find out if we working with nanoseconds or microseconds ui->rxProgress->setMaximum(ITERATIONS-1); ui->txProgress->setMaximum(ITERATIONS-1); ui->rxProgress->setValue(0); ui->txProgress->setValue(0); display(BASESAMPLERATE,ui->rxLCD); display(BASESAMPLERATE,ui->txLCD); connect(this,SIGNAL(finished(int)),SLOT(hasFinished(int))); } /** * @brief slot for finish * * This slot is called when the dialog is closed by pressing CANCEL or OK. It will abort the loop executed in start and set the bool canceled to false or true * depending on the CANCEL or OK button being presssed. **/ void calibration::hasFinished(int result) { stopped=true; if(result==QDialog::Rejected) canceled=true; } /** * @brief initialize * * @param bool isRX: If isRX is set then the receive clock will be calibrated, else the transmit clock will be calibrated. * * Start is called by exec and performs the clock calibration using NTP (Network Time Protocol). * It starts counting when the first 100 blocks are read or when the first 100 blocks are written in order to start with a stable condition. * @return bool returns true if calibration is successful or false when either the CANCEL button was pressed or a read NTP time erro has occured. * **/ bool calibration::start(bool isRX) { unsigned int i; double clock=0; unsigned int frames; double elapsedTime; double elapsed=0; if(!soundIOPtr->calibrate(isRX)) { QMessageBox::critical(this,"Calibration Error","Souncard not active"); return false; } for(i=0;(iprocessEvents(); if(soundIOPtr->calibrationCount(frames,elapsedTime)) { i++; logFilePtr->addToAux(QString("%1\t%2\t%3").arg(frames).arg(elapsedTime).arg(elapsedTime-elapsed)); elapsed=elapsedTime; if(i%2==0) { clock=((double)frames*CALIBRATIONSIZE)/(elapsedTime); // debug joma if(isRX) { display((int) round(clock),ui->rxLCD); ui->rxProgress->setValue(i); } else { display((int) round(clock),ui->txLCD); ui->txProgress->setValue(i); } } } else { usleep(10000); } } dispatcherPtr->idleAll(); if(isRX) { rxCardClock=clock; } else { txCardClock=clock; } return true; } void calibration::display(int value,QLCDNumber *dspl) { // QString tmp=QString::number(value,'g',6); // if(tmp.length()==5) tmp+=".0"; dspl->display(value); } qsstv_9.2.6/qsstv/sound/calibration.h0000664000175000017500000000153313203343610016377 0ustar jomajoma#ifndef CALIBRATION_H #define CALIBRATION_H #include #include class QLCDNumber; namespace Ui { class calibration; } class calibration : public QDialog { Q_OBJECT public: explicit calibration(QWidget *parent = 0); ~calibration(); int exec(); /** ** @brief get calibrated receive clock * * @return double calibrated value of the rxclock */ double getRXClock() {return rxCardClock;} /** * @brief get calibrated transmit clock * * @return double calibrated value of the txclock */ double getTXClock(){return txCardClock;} public slots: void hasFinished(int result); private: Ui::calibration *ui; double rxCardClock; double txCardClock; bool stopped; void init(); bool start(bool isRX); void display(int value,QLCDNumber *dspl); bool canceled; }; #endif // CALIBRATION_H qsstv_9.2.6/qsstv/sound/calibration.ui0000664000175000017500000005157313203343610016576 0ustar jomajoma calibration 0 0 488 207 Soundcard Calibration RX Clock 24 144 46 85 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 0 76 76 76 255 85 0 0 0 255 85 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 0 76 76 76 255 85 0 0 0 255 255 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 0 255 0 0 255 true QFrame::NoFrame 2 2 false 5 QLCDNumber::Filled 48000.000000000000000 48000 TX Clock 24 144 46 85 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 0 76 76 76 255 85 0 0 0 255 85 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 0 76 76 76 255 85 0 0 0 255 255 255 255 0 0 255 255 255 127 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 0 255 0 0 255 Qt::LeftToRight true QFrame::NoFrame 2 2 false 5 QLCDNumber::Filled 48000.000000000000000 48000 Only used for SSTV. This takes several minutes,. Please be patient. Qt::Vertical 20 238 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() calibration accept() 248 254 157 274 buttonBox rejected() calibration reject() 316 260 286 274 qsstv_9.2.6/qsstv/sound/resamplefilter.cpp0000664000175000017500000000661713203343610017471 0ustar jomajoma/* Automatically generated file with MATLAB */ /* File name: "ResampleFilter.m" */ /* Filter taps in time-domain */ #include "resamplefilter.h" /* Filter for ratios close to 1 */ float fResTaps1To1[INTERP_DECIM_I_D][RES_FILT_NUM_TAPS_PER_PHASE] = { { -0.00129181992672801360f, 0.00561586829442904840f, -0.01349857823816511800f, 0.02541150940858524100f, -0.04267869501534898200f, 0.07724474282951483700f, 0.96609875058711103000f, -0.01641812005088002400f, -0.00427135103965109450f, 0.00726225824406205160f, -0.00544188094946287510f, 0.00266742068076876060f }, { -0.00207886551285772290f, 0.00866090598717600930f, -0.02161960909069559500f, 0.04383507935997314800f, -0.08302470868585065700f, 0.18738870090358245000f, 0.93524350914423104000f, -0.09031872116141286000f, 0.02909509423931267600f, -0.00897188476756275060f, 0.00178311012364952820f, 0.00010586149691723067f }, { -0.00287519800425638110f, 0.01143197533872717000f, -0.02889142869399521600f, 0.06060641890050100900f, -0.12152802242786863000f, 0.30933747340895279000f, 0.87539536840978205000f, -0.14271415809850990000f, 0.05516985095031713000f, -0.02205265100214613000f, 0.00761119378345958850f, -0.00187713739944610450f }, { -0.00354120720771153910f, 0.01351098086300389300f, -0.03433664370844288100f, 0.07367662235517660800f, -0.15398027155782226000f, 0.43728178746780866000f, 0.79013921003423337000f, -0.17341770937821352000f, 0.07263788052016696700f, -0.03120859084480779800f, 0.01170664402374247200f, -0.00319259334815649940f }, { -0.00391755659664638590f, 0.01447751287549226700f, -0.03701682481313090000f, 0.08107302414568577600f, -0.17606165300033697000f, 0.56464344237183917000f, 0.68451472884717957000f, -0.18369620562420094000f, 0.08111657494320076400f, -0.03614676421513295800f, 0.01396276906259418800f, -0.00384568128202934270f }, { -0.00384568128202934270f, 0.01396276906259418800f, -0.03614676421513295800f, 0.08111657494320076400f, -0.18369620562420094000f, 0.68451472884717957000f, 0.56464344237183917000f, -0.17606165300033697000f, 0.08107302414568577600f, -0.03701682481313090000f, 0.01447751287549226700f, -0.00391755659664638590f }, { -0.00319259334815649940f, 0.01170664402374247200f, -0.03120859084480779800f, 0.07263788052016696700f, -0.17341770937821352000f, 0.79013921003423337000f, 0.43728178746780866000f, -0.15398027155782226000f, 0.07367662235517660800f, -0.03433664370844288100f, 0.01351098086300389300f, -0.00354120720771153910f }, { -0.00187713739944610450f, 0.00761119378345958850f, -0.02205265100214613000f, 0.05516985095031713000f, -0.14271415809850990000f, 0.87539536840978205000f, 0.30933747340895279000f, -0.12152802242786863000f, 0.06060641890050100900f, -0.02889142869399521600f, 0.01143197533872717000f, -0.00287519800425638110f }, { 0.00010586149691723067f, 0.00178311012364952820f, -0.00897188476756275060f, 0.02909509423931267600f, -0.09031872116141286000f, 0.93524350914423104000f, 0.18738870090358245000f, -0.08302470868585065700f, 0.04383507935997314800f, -0.02161960909069559500f, 0.00866090598717600930f, -0.00207886551285772290f }, { 0.00266742068076876060f, -0.00544188094946287510f, 0.00726225824406205160f, -0.00427135103965109450f, -0.01641812005088002400f, 0.96609875058711103000f, 0.07724474282951483700f, -0.04267869501534898200f, 0.02541150940858524100f, -0.01349857823816511800f, 0.00561586829442904840f, -0.00129181992672801360f } }; qsstv_9.2.6/qsstv/sound/resamplefilter.h0000664000175000017500000000061313203343610017124 0ustar jomajoma/* Automatically generated file with MATLAB */ /* File name: "ResampleFilter.m" */ /* Filter taps in time-domain */ #ifndef _RESAMPLEFILTER_H_ #define _RESAMPLEFILTER_H_ #define RES_FILT_NUM_TAPS_PER_PHASE 12 #define INTERP_DECIM_I_D 10 /* Filter for ratios close to 1 */ extern float fResTaps1To1[INTERP_DECIM_I_D][RES_FILT_NUM_TAPS_PER_PHASE]; #endif /* _RESAMPLEFILTER_H_ */ qsstv_9.2.6/qsstv/sound/soundalsa.cpp0000664000175000017500000002601613203343610016437 0ustar jomajoma#include "soundalsa.h" #include "configparams.h" soundAlsa::soundAlsa() { captureHandle=NULL; playbackHandle=NULL; } soundAlsa::~soundAlsa() { } void soundAlsa::closeDevices() { if(captureHandle!=NULL) snd_pcm_close(captureHandle); captureHandle=NULL; if(playbackHandle!=NULL) snd_pcm_close(playbackHandle); playbackHandle=NULL; } bool soundAlsa::init(int samplerate) { int iteration=0; soundDriverOK=false; sampleRate=samplerate; int err; QString tempDevice; tempDevice=outputAudioDevice.left(outputAudioDevice.indexOf(" ")); for(iteration=0;iteration<20;iteration++) { err = snd_pcm_open(&playbackHandle,tempDevice.toLatin1().data(), SND_PCM_STREAM_PLAYBACK,0); //open in blocking mode if (err==-EBUSY) { msleep(500); continue;// give it another try } else { if(!alsaErrorHandler(err,"Unable to open "+outputAudioDevice)) return false; break; } } if(!alsaErrorHandler(err,"Unable to open "+outputAudioDevice)) return false; tempDevice=inputAudioDevice.left(inputAudioDevice.indexOf(" ")); err = snd_pcm_open(&captureHandle,tempDevice.toLatin1().data(), SND_PCM_STREAM_CAPTURE, 0); if(!alsaErrorHandler(err,"Unable to open "+inputAudioDevice)) return false; snd_pcm_hw_params_malloc ( &hwparams ); snd_pcm_sw_params_malloc ( &swparams ); if(setupSoundParams(true)) { if(setupSoundParams(false)) soundDriverOK=true; } snd_pcm_hw_params_free ( hwparams ); snd_pcm_sw_params_free ( swparams ); return soundDriverOK; } void soundAlsa::prepareCapture() { int err; if((err=snd_pcm_prepare (captureHandle)) < 0) { alsaErrorHandler(err,"Unable to prepare "+inputAudioDevice); } if((err=snd_pcm_start (captureHandle))< 0) { alsaErrorHandler(err,"Unable to start "+inputAudioDevice); } } void soundAlsa::preparePlayback() { snd_pcm_prepare (playbackHandle); } int soundAlsa::read(int &countAvailable) { int i,count; // addToLog("1",LOGPERFORM); countAvailable=snd_pcm_avail(captureHandle); // check for available frames if(countAvailable>=DOWNSAMPLESIZE) { addToLog(QString("countAV %1").arg(countAvailable),LOGPERFORM); count = snd_pcm_readi(captureHandle, tempRXBuffer,DOWNSAMPLESIZE); addToLog(QString("3 %1").arg(count),LOGPERFORM); //we have enough data to read; if ( count < 0 ) { if ( count != -EAGAIN ) { if ( count == -EPIPE ) { // Overrun snd_pcm_prepare (captureHandle ); snd_pcm_start (captureHandle); errorOut() << "Overrun"; } else { snd_pcm_drop (captureHandle ); errorOut() <<"Overrun , reason: "<< count << "Stopping device"; } } addToLog("soundIO: sound eagain",LOGSOUND); return 0; } if(count!=DOWNSAMPLESIZE) { errorOut() <<"Partial read "<< count ; return 0; } if (is32bit) { for(i=1;i>16); tempRXBuffer[i]=tempRXBuffer[2*i+1]; // qDebug() << QString::number(tempRXBuffer[i],16); } } if (isStereo) { for(i=1;i=DOWNSAMPLESIZE) { count=snd_pcm_readi(captureHandle, tempRXBuffer,DOWNSAMPLESIZE); countAvailable-=count; } // countAvailable=snd_pcm_avail(captureHandle); // check for available frames // addToLog(QString("counts available %1").arg(countAvailable),LOGPERFORM); } void soundAlsa::flushPlayback() { } bool soundAlsa::setupSoundParams(bool isCapture) { int err=0; int dir=0; snd_pcm_t *handle; isStereo=false; snd_pcm_format_t format; playbackPeriodSize=PERIODSIZE; playbackBufferSize=BUFFERSIZE; capturePeriodSize=PERIODSIZE; captureBufferSize=PERIODSIZE*2; if(isCapture) handle=captureHandle; else handle=playbackHandle; /* Choose all parameters */ err = snd_pcm_hw_params_any ( handle, hwparams ); if(!alsaErrorHandler(err,"Broken configuration : no configurations available")) { return false; } err=snd_pcm_hw_params_get_format (hwparams, &format ); /* Set the interleaved read/write format */ err = snd_pcm_hw_params_set_access ( handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED ); if(!alsaErrorHandler(err,"Access type not available : ")) return false; /* Set the sample format */ is32bit=false; err = snd_pcm_hw_params_set_format ( handle, hwparams, SND_PCM_FORMAT_S16_LE ); if(!alsaErrorHandler(err,"Sample format S16_LE not available : ")) { is32bit=true; err = snd_pcm_hw_params_set_format ( handle, hwparams, SND_PCM_FORMAT_S32_LE ); if(!alsaErrorHandler(err,"Sample format S32_LE not available : ")) { return false; } } /* Set the count of channels */ if(isCapture) { snd_pcm_hw_params_get_channels_min(hwparams,&minChannelsCapture); snd_pcm_hw_params_get_channels_max(hwparams,&maxChannelsCapture); err = snd_pcm_hw_params_set_channels ( handle, hwparams, minChannelsCapture); if(!alsaErrorHandler(err,"Channels count not correct; " )) return false; } else { snd_pcm_hw_params_get_channels_min(hwparams,&minChannelsPlayback); snd_pcm_hw_params_get_channels_max(hwparams,&maxChannelsPlayback); err = snd_pcm_hw_params_set_channels ( handle, hwparams, 2); //allways stereo output if(!alsaErrorHandler(err,"Channels count not correct; " )) { return false; } } err = snd_pcm_hw_params_set_rate ( handle, hwparams, sampleRate, 0 ); if(!alsaErrorHandler(err,QString("Samplerate %1 not available").arg(sampleRate))) return false; if(isCapture) { err = snd_pcm_hw_params_set_period_size_near ( handle, hwparams, &capturePeriodSize, &dir ); if(!alsaErrorHandler(err,QString("Unable to set period size %1 for capture").arg(capturePeriodSize))) return false; err = snd_pcm_hw_params_set_buffer_size_near ( handle, hwparams, &captureBufferSize ); if(!alsaErrorHandler(err,QString("Unable to set buffersize %1 for capture").arg(captureBufferSize))) return false; } else { err = snd_pcm_hw_params_set_period_size_near ( handle, hwparams, &playbackPeriodSize, &dir ); if(!alsaErrorHandler(err,QString("Unable to set period size %1 for playback").arg(playbackPeriodSize))) return false; err = snd_pcm_hw_params_set_buffer_size_near ( handle, hwparams, &playbackBufferSize ); if(!alsaErrorHandler(err,QString("Unable to set buffersize %1 for playback").arg(playbackBufferSize))) return false; } err = snd_pcm_hw_params ( handle, hwparams ); if(isCapture) { if(!alsaErrorHandler(err,QString("Unable to set hw params for capture:"))) return false; } else { if(!alsaErrorHandler(err,QString("Unable to set hw params for playback:"))) return false; } /* Get the current swparams */ err = snd_pcm_sw_params_current ( handle, swparams ); if(!alsaErrorHandler(err,"Unable to determine current swparams")) return false; err = snd_pcm_sw_params_set_start_threshold ( handle, swparams, 128); if(!alsaErrorHandler(err,"Unable to set start threshold mode")) return false; /* Write the parameters to the record/playback device */ err = snd_pcm_sw_params ( handle, swparams ); if(!alsaErrorHandler(err,"Unable to set sw params for output")) return false; if(minChannelsCapture==STEREOCHANNEL) isStereo=true; return true; } bool soundAlsa::alsaErrorHandler(int err,QString info) { if(err<0) { errorHandler(info,QString ( snd_strerror ( err ))); return false; } return true; } void getCardList(QStringList &alsaInputList, QStringList &alsaOutputList) { bool isOutput,isInput; QString deviceName; QString deviceDescription; void **hints, **n; char *name, *descr, *io; alsaInputList.clear(); alsaOutputList.clear(); if (snd_device_name_hint(-1, "pcm", &hints) < 0) return; n = hints; while (*n != NULL) { isInput=isOutput=true; io = snd_device_name_get_hint(*n, "IOID"); if(io!=NULL) { if (strcmp(io, "Input") == 0) isOutput=false; if (strcmp(io, "Output") == 0) isInput=false; } name = snd_device_name_get_hint(*n, "NAME"); descr = snd_device_name_get_hint(*n, "DESC"); deviceName=QString(name); if (descr!=NULL) { deviceDescription=QString(descr).split("\n").at(0); } if( !deviceName.contains("surround",Qt::CaseInsensitive) && !deviceName.contains("dmix",Qt::CaseInsensitive) && !deviceName.contains("front",Qt::CaseInsensitive) && !deviceName.contains("plughw",Qt::CaseInsensitive) && !deviceName.contains("null",Qt::CaseInsensitive) && !deviceName.contains("hdmi",Qt::CaseInsensitive) && !deviceName.contains("sysdefault",Qt::CaseInsensitive) && !deviceName.contains("dsnoop",Qt::CaseInsensitive) ) { if(isInput) alsaInputList.append(deviceName + " -- " +deviceDescription); if(isOutput) alsaOutputList.append(deviceName+ " -- " +deviceDescription); } if (name != NULL) free(name); if (descr != NULL) free(descr); if (io != NULL) free(io); n++; } snd_device_name_free_hint(hints); } qsstv_9.2.6/qsstv/sound/soundalsa.h0000664000175000017500000000205413203343610016100 0ustar jomajoma#ifndef SOUNDALSA_H #define SOUNDALSA_H #include "soundbase.h" #include void getCardList(QStringList &alsaInputList, QStringList &alsaOutputList); class soundAlsa:public soundBase { public: soundAlsa(); ~soundAlsa(); bool init(int samplerate); void prepareCapture(); void preparePlayback(); int read(int &countAvailable); int write(uint numFrames); protected: void flushCapture(); void flushPlayback(); void closeDevices(); void waitPlaybackEnd(); private: bool setupSoundParams(bool isCapture); bool alsaErrorHandler(int err,QString Info); snd_pcm_uframes_t playbackPeriodSize; snd_pcm_uframes_t playbackBufferSize; snd_pcm_uframes_t capturePeriodSize; snd_pcm_uframes_t captureBufferSize; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams; snd_pcm_t *playbackHandle; snd_pcm_t *captureHandle; unsigned int minChannelsCapture; unsigned int maxChannelsCapture; unsigned int minChannelsPlayback; unsigned int maxChannelsPlayback; bool is32bit; }; #endif // SOUNDALSA_H qsstv_9.2.6/qsstv/sound/soundbase.cpp0000664000175000017500000002445513203343610016436 0ustar jomajoma#include "soundbase.h" #include "logging.h" #include "configparams.h" #include "arraydumper.h" #include #include #include #include #include const QString captureStateStr[soundBase::CPEND+1]= { "Capture Init", "Capture Starting", "Capture Running", "Capture Calibrate Starting", "Capture Calibrate Wait", "Capture Calibrate", "Capture End" }; const QString playbackStateStr[soundBase::PBEND+1]= { "Playback Init", "Playback Starting", "Playback Running", "Playback Calibrate 1", "Playback Calibrate 2", "Playback End" }; soundBase::soundBase(QObject *parent) : QThread(parent) { captureState=CPINIT; playbackState=PBINIT; downsampleFilterPtr=new downsampleFilter(DOWNSAMPLESIZE,true); } void soundBase::run() { stopThread=false; unsigned int delay=0; //todo check use of delay while(!stopThread) { if((captureState==CPINIT) && (playbackState==PBINIT)) { msleep(100); continue; } switch (captureState) { case CPINIT: break; case CPSTARTING: prepareCapture(); flushCapture(); rxBuffer.reset(); //clear the rxBuffer rxVolumeBuffer.reset(); switchCaptureState(CPRUNNING); break; case CPRUNNING: if (capture()==0) msleep(1); break; case CPCALIBRATESTART: prepareCapture(); flushCapture(); switchCaptureState(CPCALIBRATEWAIT); break; case CPCALIBRATEWAIT: if(captureCalibration(true)==0) msleep(0); break; case CPCALIBRATE: if(captureCalibration(false)==0) msleep(0); break; case CPEND: switchCaptureState(CPINIT); break; } switch(playbackState) { case PBINIT: break; case PBSTARTING: preparePlayback(); flushPlayback(); prebuf=true; if (play()==0) msleep(10); else { prebuf=false; switchPlaybackState(PBRUNNING); addToLog("playback started",LOGSOUND); } break; case PBRUNNING: if (play()==0) { addToLog(QString("playback stopped: delay=%1").arg(delay),LOGSOUND); waitPlaybackEnd(); msleep(delay); waveOut.close(); addToLog("playback stopped",LOGSOUND); switchPlaybackState(PBINIT); } msleep(0); break; case PBCALIBRATESTART: { preparePlayback(); flushPlayback(); switchPlaybackState(PBCALIBRATEWAIT); } break; case PBCALIBRATEWAIT: { if(playbackCalibration(true)==0) { msleep(0); } } break; case PBCALIBRATE: { if(playbackCalibration(false)==0) { msleep(0); } } break; case PBEND: switchPlaybackState(PBINIT); break; } } } int soundBase::capture() { int count=0; if(rxBuffer.spaceLeft()downSample4(tempRXBuffer); volume=downsampleFilterPtr->avgVolumeDb; rxBuffer.putNoCheck(downsampleFilterPtr->filteredDataPtr(),RXSTRIPE); rxVolumeBuffer.putNoCheck(downsampleFilterPtr->getVolumePtr(),RXSTRIPE); return count; } int soundBase::captureCalibration(bool leadIn) { int count; count=read(countAvailable); if(count==0) return 0; if(leadIn) { leadInCounter++; if(leadInCounter==CALIBRATIONLEADIN) { stopwatch.start(); mutex.lock(); clock_gettime(CLOCK_MONOTONIC,&ts); ustartcalibrationTime=(double)ts.tv_sec +(double)ts.tv_nsec / 1000000000.0; calibrationFrames=0; mutex.unlock(); switchCaptureState(CPCALIBRATE); } } else { mutex.lock(); calibrationFrames++; calibrationTime=stopwatch.elapsed(); clock_gettime(CLOCK_MONOTONIC,&ts); ucalibrationTime=(double)ts.tv_sec +(double)ts.tv_nsec / 1000000000.0 -ustartcalibrationTime; mutex.unlock(); //logFilePtr->addToAux(QString("%1\t%2\t%3").arg(countAvailable).arg(calibrationFrames).arg(calibrationTime) ); } addToLog(QString("read report count:%1 available %2 elapsed qtime %3, time: %4").arg(count).arg(countAvailable).arg(calibrationTime).arg(ucalibrationTime),LOGSOUND); return count; } bool soundBase::calibrate(bool isCapture) { if (!soundDriverOK) return false; switchCaptureState(CPINIT); switchPlaybackState(PBINIT); calibrationFrames=0; calibrationTime=0; ucalibrationTime=0; leadInCounter=0; prevFrames=0; if (!isRunning()) start(); if (isCapture) { switchCaptureState(CPCALIBRATESTART); } else { txBuffer.fill(0); switchPlaybackState(PBCALIBRATESTART); } return true; } int soundBase::playbackCalibration(bool leadIn) { int count; // count=write(DOWNSAMPLESIZE); count=write(CALIBRATIONSIZE); // debug joma addToLog(QString("calib count %1").arg(count),LOGCALIB); if(leadIn) { leadInCounter++; if(leadInCounter==CALIBRATIONLEADIN) { // stopwatch.start(); mutex.lock(); clock_gettime(CLOCK_MONOTONIC,&ts); ustartcalibrationTime=(double)ts.tv_sec +(double)ts.tv_nsec / 1000000000.0; addToLog(QString("calib start time %1").arg(ustartcalibrationTime),LOGCALIB); calibrationFrames=0; mutex.unlock(); switchPlaybackState(PBCALIBRATE); } } else { mutex.lock(); calibrationFrames++; clock_gettime(CLOCK_MONOTONIC,&ts); ucalibrationTime=(double)ts.tv_sec +(double)ts.tv_nsec / 1000000000.0 -ustartcalibrationTime; mutex.unlock(); // addToLog(QString("calib time %1 frames %2").arg(ucalibrationTime).arg(calibrationFrames),LOGCALIB); //logFilePtr->addToAux(QString("%1\t%2\t%3").arg(countAvailable).arg(calibrationFrames).arg(calibrationTime) ); } return count; } bool soundBase::calibrationCount(unsigned int &frames, double &elapsedTime) { mutex.lock(); frames=calibrationFrames; elapsedTime=ucalibrationTime; mutex.unlock(); if(frames==prevFrames) return false; prevFrames=frames; // addToLog(QString("calib ok time %1 frames %2").arg(elapsedTime).arg(frames),LOGCALIB); return true; } void soundBase::idleTX() { waveOut.closeFile(); waveIn.closeFile(); playbackState=PBINIT; } void soundBase::idleRX() { waveOut.closeFile(); waveIn.closeFile(); captureState=CPINIT; } void soundBase::stopSoundThread() { idleRX(); idleTX(); stopThread=true; while(isRunning()) { QApplication::processEvents(); } closeDevices(); } bool soundBase::startCapture() { switchPlaybackState(PBINIT); soundIOPtr->rxBuffer.reset(); soundIOPtr->rxVolumeBuffer.reset(); downsampleFilterPtr->init(); storedFrames=0; switch(soundRoutingInput) { case SNDINFROMFILE: if(!waveIn.openFileForRead("",true)) { errorHandler("File not opened",""); return false; } break; case SNDINCARDTOFILE: { if(!soundDriverOK) { errorHandler("No valid sound device (see configuration)",""); return false; } if(!waveOut.openFileForWrite("",true,true)) // always output stereo { errorHandler("File not opened",""); return false; } } break; case SNDINCARD: if(!soundDriverOK) { errorHandler("No valid sound device (see configuration)",""); return false; } break; } switchCaptureState(CPSTARTING); return true; } int soundBase::play() { unsigned int numFrames; int framesWritten; if(prebuf) { if(txBuffer.count()<(DOWNSAMPLESIZE*8)) { return 0; } } if((numFrames=txBuffer.count())>=DOWNSAMPLESIZE) numFrames=DOWNSAMPLESIZE; if(numFrames>0) { framesWritten=0; } if(soundRoutingOutput==SNDOUTTOFILE) // output the wav-file { if(storedFrames<=(ulong)recordingSize*1048576L) { waveOut.write((quint16*)txBuffer.readPointer(),numFrames); //always stereo storedFrames+=numFrames; } } txBuffer.copyNoCheck(tempTXBuffer,numFrames); addToLog(QString("frames to write: %1 at %2 buffered:%3").arg(numFrames).arg(txBuffer.getReadIndex()).arg(txBuffer.count()),LOGSOUND); // framesWritten=write(numFrames); framesWritten=write(DOWNSAMPLESIZE); addToLog(QString("frames written: %1").arg(framesWritten),LOGSOUND); if(framesWritten<0) { addToLog("Sound write error",LOGSOUND); } return numFrames; } bool soundBase::startPlayback() { switchCaptureState(CPINIT); if(!soundDriverOK) { errorHandler("No valid sound device (see configuration)",""); return false; } storedFrames=0; soundIOPtr->txBuffer.reset(); if(soundRoutingOutput==SNDOUTTOFILE) { if(!waveOut.openFileForWrite("",true,true)) // indicate stereo { errorHandler("File not opened",""); return false; } } playbackState=PBSTARTING; addToLog(QString("start playback, txbuffercount: %1").arg(txBuffer.count()),LOGSOUND); return true; } void soundBase::errorHandler(QString title, QString info) { addToLog(title+" "+info,LOGSOUND); lastErrorStr=title+" "+info; } void soundBase::switchCaptureState(ecaptureState cs) { addToLog(QString("Switching from captureState %1 to %2").arg(captureStateStr[captureState]).arg(captureStateStr[cs]),LOGSOUND); captureState=cs; } void soundBase::switchPlaybackState(eplaybackState ps) { addToLog(QString("Switching from playbackState %1 to %2").arg(playbackStateStr[playbackState]).arg(playbackStateStr[ps]),LOGSOUND); playbackState=ps; } qsstv_9.2.6/qsstv/sound/soundbase.h0000664000175000017500000000567313203343610016104 0ustar jomajoma#ifndef SOUNDBASE_H #define SOUNDBASE_H #include "appglobal.h" #include "wavio.h" #include "buffermanag.h" #include "downsamplefilter.h" #include #include #define BYTESPOWER 18 //WWV WWVH 2500.0, 5000.0, 10000.0 //· GBR 60.0 kHz //· RWM 4996.0, 9996.0, 14996.0 //· CHU 7335.0 #define PERIODSIZE (DOWNSAMPLESIZE) #define BUFFERSIZE (8*DOWNSAMPLESIZE) #define CALIBRATIONSIZE (PERIODSIZE) #define CALIBRATIONLEADIN 80 class soundBase : public QThread { Q_OBJECT public: enum edataSrc{SNDINCARD,SNDINFROMFILE,SNDINCARDTOFILE}; enum edataDst{SNDOUTCARD,SNDOUTTOFILE}; enum eplaybackState{PBINIT,PBSTARTING,PBRUNNING,PBCALIBRATESTART,PBCALIBRATEWAIT,PBCALIBRATE,PBEND}; enum ecaptureState{CPINIT,CPSTARTING,CPRUNNING,CPCALIBRATESTART,CPCALIBRATEWAIT,CPCALIBRATE,CPEND}; explicit soundBase(QObject *parent = 0); virtual bool init(int samplerate)=0; void run(); void idleRX(); void idleTX(); void stopSoundThread(); virtual void getCardList() {;} bool startCapture(); bool startPlayback(); buffer rxBuffer; buffer rxVolumeBuffer; buffer txBuffer; double getVolumeDb(){return volume;} uint *getVolumePtr() {return downsampleFilterPtr->getVolumePtr();} const QString getLastError() { return lastErrorStr;} bool isPlaying() {return playbackState!=PBINIT;} bool isCapturing() {return captureState!=CPINIT;} bool calibrate(bool isCapture); bool calibrationCount(unsigned int &frames, double &elapsedTime); int countAvailable; signals: public slots: protected: bool soundDriverOK; bool isStereo; int capture(); int play(); virtual int read(int &countAvailable)=0; virtual int write(uint numFrames)=0; virtual void flushCapture()=0; virtual void flushPlayback()=0; virtual void prepareCapture() {;} virtual void preparePlayback() {;} virtual void closeDevices()=0; virtual void waitPlaybackEnd()=0; int sampleRate; qint16 tempRXBuffer[DOWNSAMPLESIZE*2*2]; // in some cases the hardware interface is stereo (can be S16_LE or S32_LE) quint32 tempTXBuffer[DOWNSAMPLESIZE*2]; bool stopThread; eplaybackState playbackState; ecaptureState captureState; wavIO waveIn; wavIO waveOut; void errorHandler(QString title,QString info); void switchCaptureState(ecaptureState cs); void switchPlaybackState(eplaybackState ps); private: downsampleFilter *downsampleFilterPtr; double volume; // uint intVolume; int captureCalibration(bool leadIn); int playbackCalibration(bool leadIn); QMutex mutex; QTime stopwatch; unsigned int calibrationFrames; unsigned int leadInCounter; int calibrationTime; double ucalibrationTime; double ustartcalibrationTime; struct timespec ts; QString lastErrorStr; quint64 storedFrames; bool prebuf; unsigned int prevFrames; }; #endif // SOUNDBASE_H qsstv_9.2.6/qsstv/sound/soundpulse.cpp0000664000175000017500000001316313203343610016646 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "soundpulse.h" #include #include soundPulse::soundPulse() { sd[0].stream = NULL; sd[1].stream = NULL; } soundPulse::~soundPulse() { if(sd[0].stream) pa_simple_free(sd[0].stream); if(sd[1].stream) pa_simple_free(sd[1].stream); sd[0].stream = NULL; sd[1].stream = NULL; } bool soundPulse::init(int samplerate) { soundDriverOK=false; QString sname; sampleRate=samplerate; //open two streams (capture and play) int err; sd[0].stream = NULL; sd[0].dir = PA_STREAM_RECORD; sd[0].stream_params.format = PA_SAMPLE_S16LE; sd[0].stream_params.channels = MONOCHANNEL; sd[0].stream_params.rate=sampleRate; sd[0].buffer_attrs.maxlength = (uint32_t)-1; // let the server decide sd[0].buffer_attrs.minreq = (uint32_t)-1; sd[0].buffer_attrs.prebuf = (uint32_t)-1; sd[0].buffer_attrs.tlength = (uint32_t)-1; sd[0].buffer_attrs.fragsize = CAPTFRAGSIZE * sizeof(short int); sd[1].stream = NULL; sd[1].dir = PA_STREAM_PLAYBACK; sd[1].stream = NULL; sd[1].stream_params.format = PA_SAMPLE_S16LE; sd[1].stream_params.channels = STEREOCHANNEL; sd[1].stream_params.rate=sampleRate; sd[1].buffer_attrs.fragsize = (uint32_t)-1; // let the server decide sd[1].buffer_attrs.maxlength = (uint32_t)-1; sd[1].buffer_attrs.minreq = (uint32_t)-1; sd[1].buffer_attrs.prebuf = (uint32_t)-1; sd[1].buffer_attrs.tlength = PLAYLENGTH * sizeof(quint32); // opening device sname=QString("capture %1").arg(getpid()); sd[0].stream = pa_simple_new(NULL, shortName.toLatin1().data(), sd[0].dir, NULL,sname.toLatin1().data(), &sd[0].stream_params, NULL,&sd[0].buffer_attrs, &err); // sd[0].stream = pa_simple_new(NULL, shortName.toLatin1().data(), sd[0].dir, NULL,sname.toLatin1().data(), &sd[0].stream_params, NULL,&sd[0].buffer_attrs, &err); if(sd[0].stream==NULL) { errorHandler("PulseAudio read init error",QString(pa_strerror(err))); return false; } sname=QString("playback %1").arg(getpid()); sd[1].stream = pa_simple_new(NULL, shortName.toLatin1().data(), sd[1].dir, NULL,sname.toLatin1().data(), &sd[1].stream_params, NULL,&sd[1].buffer_attrs, &err); if(sd[1].stream==NULL) { errorHandler("PulseAudio read init error",QString(pa_strerror(err))); return false; } isStereo=false; soundDriverOK=true; return true; } int soundPulse::read(int &countAvailable) { int err=PA_OK; pa_usec_t latency; latency = pa_simple_get_latency(sd[0].stream, &err); if(err!=PA_OK) { errorHandler("PulseAudio latency error:", QString(pa_strerror(err))); return -1; } countAvailable= pa_usec_to_bytes(latency, &sd[0].stream_params); if (pa_simple_read(sd[0].stream, tempRXBuffer,sizeof(qint16)*DOWNSAMPLESIZE, &err) <0) { errorHandler("PulseAudio read error",QString(pa_strerror(err))); return -1; } return DOWNSAMPLESIZE; } int soundPulse::write(uint numFrames) { int err; if(numFrames!=0) { if (pa_simple_write(sd[1].stream, tempTXBuffer,sizeof(quint32)*numFrames, &err) <0) { errorHandler("PulseAudio write error",QString(pa_strerror(err))); return -1; } } return numFrames; } void soundPulse::waitPlaybackEnd() { } void soundPulse::flushCapture() { int err=PA_OK; pa_usec_t t = pa_simple_get_latency(sd[0].stream, &err); if (t && err == PA_OK) { size_t bytes = pa_usec_to_bytes(t, &sd[0].stream_params); while (bytes > sizeof(qint16)*PERIODSIZE) { pa_simple_read(sd[0].stream, tempRXBuffer,sizeof(qint16)*PERIODSIZE, &err); if (err != PA_OK) break; bytes -= sizeof(qint16)*PERIODSIZE; } if (bytes) pa_simple_read(sd[0].stream, tempRXBuffer, bytes, &err); } // int err; // if(pa_simple_flush (sd[0].stream, &err)<0) // { // errorHandler("flush: ", QString(pa_strerror(err))); // } } void soundPulse::flushPlayback() { int err; if(pa_simple_flush (sd[1].stream, &err)<0) { errorHandler("flush: ", QString(pa_strerror(err))); } } void soundPulse::closeDevices() { if (sd[0].stream) pa_simple_free(sd[0].stream); sd[0].stream=0; if (sd[1].stream) pa_simple_free(sd[1].stream); sd[1].stream=0; msleep(1000); } qsstv_9.2.6/qsstv/sound/soundpulse.h0000664000175000017500000000135013203343610016306 0ustar jomajoma#ifndef SOUNDPULSE_H #define SOUNDPULSE_H #include "soundbase.h" #define CAPTFRAGSIZE 512 //#define PLAYLENGTH 512 #define PLAYLENGTH (4096*5) /*! \file soundio.h */ #include #include class soundPulse:public soundBase { public: soundPulse(); ~soundPulse(); bool init(int samplerate); int read(int &countAvailable); int write(uint numFrames); protected: void flushCapture(); void flushPlayback(); void closeDevices(); void waitPlaybackEnd(); private: struct stream_data { pa_simple* stream; pa_sample_spec stream_params; pa_buffer_attr buffer_attrs; pa_stream_direction_t dir; double src_ratio; size_t blocksize; } sd[2]; }; #endif // SOUNDPULSE_H qsstv_9.2.6/qsstv/sound/waterfalltext.cpp0000664000175000017500000000730613203343610017335 0ustar jomajoma#include "waterfalltext.h" #include "appglobal.h" #include "configparams.h" #include "imageviewer.h" #include "filters.h" #include "supportfunctions.h" #include "drm.h" #include "math.h" #include #include #define FREQ_AMPLITUDE 16E3 #define FREQ_OFFSET 350.0 #define FREQ_MAX 2600. //#define FONTSIZE 13 //#define FONTNAME "Arial" waterfallText::waterfallText() { out=NULL; outFiltered=NULL; dataBuffer=NULL; txFilter=NULL; phr=phi=NULL; } /** \todo:: txFilter not used */ waterfallText::~waterfallText() { fftw_destroy_plan(plan); if(out) fftw_free(out); if(outFiltered) delete outFiltered; if(dataBuffer) fftw_free(dataBuffer); } void waterfallText::init() { int i; double ph; double binSize; if(phr!=NULL) delete phr; if(phi!=NULL) delete phi; fftLength=TXSTRIPE*SUBSAMPLINGFACTOR/2; samplingrate=BASESAMPLERATE; binSize=(double)(BASESAMPLERATE)/((double)fftLength); txFilter= new wfFilter(TXSTRIPE); out = (fftw_complex *) fftw_malloc(sizeof(fftw_complex)*fftLength); dataBuffer = (fftw_complex *) fftw_malloc(sizeof(fftw_complex)*fftLength); outFiltered = new DSPFLOAT [fftLength]; audioBuf = new DSPFLOAT [fftLength]; // create the fftw plan plan = fftw_plan_dft_1d(fftLength, dataBuffer, out, FFTW_BACKWARD, FFTW_ESTIMATE); imageWidth=(FREQ_MAX-FREQ_OFFSET)/binSize; // imageWidth=200; startFreqIndex=(int)round(FREQ_OFFSET/binSize); //Chirp phr=new double[imageWidth]; phi=new double[imageWidth]; amplitude=FREQ_AMPLITUDE/sqrt(imageWidth); for(i=0;i #include #include "macroexpansion.h" class imageViewer; class wfFilter; class waterfallText { public: waterfallText(); ~ waterfallText(); void init(); void setText(QString txt); QImage *getImagePtr() {return ℑ} DSPFLOAT *nextLine(); int getLength() {return fftLength;} double getDuration(QString txt=QString()); private: int fftLength; int samplingrate; fftw_complex *out; fftw_complex *dataBuffer; DSPFLOAT *outFiltered; DSPFLOAT *audioBuf; fftw_plan plan; void setupImage(QString txt); QString convert(QString txt); int imageWidth; int width; int height; int line; wfFilter *txFilter; QImage image; int dLine; int startFreqIndex; double *phr; double *phi; double amplitude; macroExpansion mexp; }; #endif // WATERFALLTEXT_H qsstv_9.2.6/qsstv/sound/wavio.cpp0000664000175000017500000002212713203343610015572 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "wavio.h" #include "appglobal.h" #include "configparams.h" #include "utils/dirdialog.h" #include "unistd.h" #include /** constructor: creates a waveIO instance \param samplingRate wave file samplingrate (e.g. 8000, 11025 ...) */ wavIO::wavIO(unsigned int samplingRate) { samplingrate=samplingRate; reading=false; writing=false; } wavIO::~wavIO() { } void wavIO::closeFile() { inopf.close(); reading=false; writing=false; } /** opens a wave file for reading \param fname the name of the file to open \param ask if ask==true, a filedialog will be opened \return true if the file is succcesfully opened. The file is also checked if it is a supported format. \sa read */ bool wavIO::openFileForRead(QString fname,bool ask) { QString tmp; if (ask) { dirDialog d((QWidget *)mainWindowPtr,"Wave file"); QString s=d.openFileName(audioPath,"*"); if (s==QString::null) return false; if (s.isEmpty()) return false; inopf.setFileName(s); } else { inopf.setFileName(fname); } if(!inopf.open(QIODevice::ReadOnly)) { return false; } reading=true; if(inopf.read(&waveHeader.chunkID[0],sizeof(sWave))!=sizeof(sWave)) { closeFile(); return false; } // check the header if( (!checkString(waveHeader.chunkID,"RIFF")) ||(!checkString(waveHeader.format,"WAVE")) ||(!checkString(waveHeader.subChunk1ID,"fmt ")) ||(!checkString(waveHeader.subChunk2ID,"data"))) { addToLog("wavio read header error",LOGALL); closeFile(); return false; } if( (waveHeader.subChunk1Size!=16) ||(waveHeader.audioFormat!=1) ||(waveHeader.numChannels>STEREOCHANNEL) ||(waveHeader.sampleRate!=samplingrate) // ||(waveHeader.byteRate!=sizeof(SOUNDFRAME)*samplingrate) ||(waveHeader.blockAlign!=waveHeader.numChannels*2) ||(waveHeader.bitsPerSample!=16)) { addToLog("wavio read header error, not supported",LOGALL); closeFile(); return false; } numberOfChannels=waveHeader.numChannels; numberOfSamples=waveHeader.subChunk2Size/(2*numberOfChannels); // number of mono or stereo samples samplesRead=0; return true; } /** read data from wave file \param dPtr pointer to buffer for SOUNDFRAME type samples. \param numSamples number of samples to read \return returns the number of samples read. -1 is returned if there is an error, 0 is returned on end of the file else the numeber of samples read. The file will be closed on reaching the end of file; Output is always in mono. */ int wavIO::read(short int *dPtr ,uint numSamples) { int i,llen,result; qint16 *tempBuf; if(!inopf.isOpen()) { addToLog("wavio not open during read",LOGALL); return -1; } llen=numSamples*sizeof(quint16)*numberOfChannels; // lenght in bytes if(waveHeader.numChannels==1) { result=inopf.read((char*)dPtr,llen); //we do not need conversion } else { tempBuf=new qint16[llen/2]; result=inopf.read((char*)tempBuf,llen); for(i=0;i<(result/4);i++) { dPtr[i]=tempBuf[2*i]; } delete [] tempBuf; } if(result==0) inopf.close(); samplesRead+=result/(sizeof(quint16)*numberOfChannels); return result/(sizeof(quint16)*numberOfChannels); } /** opens a wave file for writing \param fname the name of the file to open \param ask if ask==true, a filedialog will be opened \return true if the file is succcesfully opened, and the header written, false otherwise? \sa write */ bool wavIO::openFileForWrite(QString fname,bool ask,bool isStereo) { QFileInfo fin; if (ask) { dirDialog d((QWidget *)mainWindowPtr,"wave IO"); QString fn=d.saveFileName(audioPath,"*.wav","wav"); inopf.setFileName(fn); } else { inopf.setFileName(fname); } if(!inopf.open(QIODevice::WriteOnly|QIODevice::Truncate)) { return false; } numberOfSamples=0; if(isStereo) numberOfChannels=2; else numberOfChannels=1; initHeader(); if(!writeHeader()) return false; writing=true; numberOfSamples=0; return true; } /** \brief write data to wave file To signal the end, call this function with numSamples=0. The file will automatically be closed. \param dPtr pointer to buffer for 16 bit samples SOUNDFRAME indicates if samples are mono or stereo \param numSamples number of samples to read \return returns true the correct number of samples are written. false otherwise. */ bool wavIO::write(quint16 *dPtr, uint numSamples) { uint i; int len; quint16 *tempBufPtr; len=numSamples*sizeof(quint16)*2; // we're outputting stereo tempBufPtr=0; quint16 *tmpPtr; tmpPtr=dPtr; if((!writing)&&(numSamples!=0)) { addToLog("wavio not open during write",LOGALL); return true; } if((!writing)&&(numSamples==0)) return true; if(numSamples==0) { addToLog(QString("wavio write close samples=%1").arg(numberOfSamples),LOGWAVIO); inopf.flush(); writeHeader(); closeFile(); return true; } // we need stereo output and input is mono tempBufPtr=new quint16 [numSamples*2]; tmpPtr=tempBufPtr; for(i=0;i /*! a WAVE format structure The canonical WAVE format starts with the RIFF header: \verbatim 0 4 ChunkID Contains the letters "RIFF" in ASCII form (0x52494646 big-endian form). 4 4 ChunkSize 36 + SubChunk2Size, or more precisely: 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) This is the size of the rest of the chunk following this number. This is the size of the entire file in bytes minus 8 bytes for the two fields not included in this count: ChunkID and ChunkSize. 8 4 Format Contains the letters "WAVE" (0x57415645 big-endian form). The "WAVE" format consists of two subchunks: "fmt " and "data": The "fmt " subchunk describes the sound data's format: 12 4 Subchunk1ID Contains the letters "fmt " (0x666d7420 big-endian form). 16 4 Subchunk1Size 16 for PCM. This is the size of the rest of the Subchunk which follows this number. 20 2 AudioFormat PCM = 1 (i.e. Linear quantization) Values other than 1 indicate some form of compression. 22 2 NumChannels Mono = 1, Stereo = 2, etc. 24 4 SampleRate 8000, 44100, etc. 28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8 32 2 BlockAlign == NumChannels * BitsPerSample/8 The number of bytes for one sample including all channels. I wonder what happens when this number isn't an integer? 34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc. 2 ExtraParamSize if PCM, then doesn't exist X ExtraParams space for extra parameters The "data" subchunk contains the size of the data and the actual sound: 36 4 Subchunk2ID Contains the letters "data" (0x64617461 big-endian form). 40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8 This is the number of bytes in the data. You can also think of this as the size of the read of the subchunk following this number. 44 * Data The actual sound data. \endverbatim */ struct sWave { char chunkID[4]; //!< Contains the letters "RIFF" int chunkSize; //!< 36 + SubChunk2Size char format[4]; //!< Contains the letters "WAVE" char subChunk1ID[4]; //!< Contains the letters "fmt " int subChunk1Size; //!< 16 for PCM short int audioFormat; //!< PCM = 1 (i.e. Linear quantization) short int numChannels; //!< Mono = 1, Stereo = 2, etc. unsigned int sampleRate; //!< 8000, 44100, etc. unsigned int byteRate; //!< == SampleRate * NumChannels * BitsPerSample/8 short int blockAlign; //!< == NumChannels * BitsPerSample/8 short int bitsPerSample; //!< 8 bits = 8, 16 bits = 16, etc. char subChunk2ID[4]; //!< Contains the letters "data" int subChunk2Size; //!< NumSamples * NumChannels * BitsPerSample/8 }; //! class for accessing .wav files class wavIO { public: wavIO(unsigned int samplingR=BASESAMPLERATE); ~wavIO(); bool openFileForRead(QString fname,bool ask); bool openFileForWrite(QString fname, bool ask, bool isStereo); int read (short int *dPtr, uint len); bool write(quint16 *dPtr, uint len); void setSamplingrate(int sr) {samplingrate=sr;} int getNumberOfChannels(){return numberOfChannels;} void closeFile(); /** return the number of samples in the opened file */ unsigned int getNumberOfSamples() { return numberOfSamples; } /** close all opened files */ void close() { if(inopf.isOpen()) { write(NULL,0); // flush everything in case we are writing closeFile(); } } private: sWave waveHeader; unsigned int numberOfSamples; unsigned int samplesRead; unsigned int samplingrate; int numberOfChannels; QFile inopf; void initHeader(); bool writeHeader(); bool checkString(char *str,const char *cstr); bool reading; bool writing; }; #endif qsstv_9.2.6/qsstv/sstv/cw.cpp0000664000175000017500000001235113203343610014723 0ustar jomajoma/*************************************************************************** cw.cpp - QSSTV ------------------- begin : Tue Apr 17 22:27:58 CEST 2001 copyright : (C) 2001 by Johan Maes ON1MH email : on1mh@pandora.be ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "cw.h" #include #include "appglobal.h" #include "configparams.h" enum eCWState {CWNEW,CWNEXTDOT,CWDOTSPACING,CWNEXTCHAR,CWCHARSPACING,CWWORDSPACING,CWEND,CWFINISHED}; enum eCWResult {CWIDLE,CWfalse,CWtrue}; static int dotIndex; static const char *dotPtr; static int charIndex; static float dotSpacing; static eCWState cwState; static eCWResult result; // const char *charLookupCW(char a); // bool sendChar(float &duration); // const char *s; static struct { char key; const char *cw; } charTable[] = { {'A', ".-" }, {'B',"-..." },{'C', "-.-." }, {'D', "-.." }, {'E',"." },{'F',"..-." }, {'G', "--." }, {'H',"...." },{'I',".." }, {'J', ".---" }, {'K',"-.-" },{'L',".-.." }, {'M', "--" }, {'N',"-." },{'O',"---" }, {'P', ".--." }, {'Q',"--.-" },{'R',".-." }, {'S', "..." }, {'T',"-" },{'U',"..-" }, {'V', "...-" }, {'W',".--" },{'X',"-..-" }, {'Y', "-.--" }, {'Z',"--.." }, {'0', "-----" }, {'1',".----" },{'2', "..---"}, {'3', "...--" }, {'4',"....-" },{'5',"....." }, {'6', "-...." }, {'7',"--..." },{'8',"---.." }, {'9', "----." }, {'"', ".-..-."}, {'\'', ".----." },{'$',"...-..-"}, {'(', "-.--." }, { ')', "-.--.-" },{'+',".-.-."}, {',', "--..--"}, {'-', "-....-" },{'.',".-.-.-"}, {'/', "-..-." }, { ':', "---..." },{';',"-.-.-."}, {'=', "-...-" }, { '?', "..--.." },{'_',"..--.-"}, {0, "" } }; static QString cwString; void initCW(QString cwTxt) { cwState=CWNEW; dotSpacing=1.2/(float)cwWPM; cwString=cwTxt; } const char *charLookupCW(const char a) { char b; int i=0;; b=toupper(a); dotIndex=0; while (charTable[i].key!=0) { if(charTable[i].key==b) { return (charTable[i].cw); } i++; } return NULL; } bool nextSymbolCW(float &duration) { if (dotPtr[dotIndex]==0) { return false; } else if(dotPtr[dotIndex]=='.') { duration=dotSpacing; } else { duration=3*dotSpacing; } dotIndex++; return true; } float getCWDuration() { float tim=0; float tone,duration; tone=0; while(sendTextCW(tone,duration)) { tim+=duration; } return tim; } bool sendTextCW(float &tone,float &duration) { result=CWIDLE; do { switch (cwState) { case CWNEW: { charIndex=0; if (cwString[0]==0) { result=CWfalse; } cwState=CWNEXTCHAR; } break; case CWNEXTCHAR: { if(cwString[charIndex]==' ') { charIndex++; cwState=CWWORDSPACING; } else { dotPtr=charLookupCW(cwString[charIndex++].toLatin1()); if (dotPtr==NULL) { cwState=CWEND; } else { dotIndex=0; cwState=CWNEXTDOT; } } } break; case CWNEXTDOT: { if(nextSymbolCW(duration)) { tone=(float)cwTone; cwState=CWDOTSPACING; result=CWtrue; } else { cwState=CWCHARSPACING; } } break; case CWDOTSPACING: { tone=0; duration=dotSpacing; cwState=CWNEXTDOT; result=CWtrue; } break; case CWCHARSPACING: { tone=0; duration=2*dotSpacing; // we already had a dotspace cwState=CWNEXTCHAR; result=CWtrue; } break; case CWWORDSPACING: { tone=0; duration=4*dotSpacing; // we already had a charspace cwState=CWNEXTCHAR; result=CWtrue; } break; case CWEND: { tone=0; duration=7*dotSpacing; cwState=CWFINISHED; result=CWtrue; } break; case CWFINISHED: { result=CWfalse; } break; } } while(result==CWIDLE); return (result==CWtrue); } qsstv_9.2.6/qsstv/sstv/cw.h0000664000175000017500000000223013203343610014363 0ustar jomajoma/*************************************************************************** cw.h - QSSTV ------------------- begin : Tue Apr 17 22:27:58 CEST 2001 copyright : (C) 2001 by Johan Maes ON1MH email : on1mh@pandora.be ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef CW_H #define CW_H #include void initCW(QString cwTxt); bool sendTextCW(float &tone,float &duration); float getCWDuration(); #endif qsstv_9.2.6/qsstv/sstv/sstvparam.cpp0000664000175000017500000004373113203343610016340 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "sstvparam.h" #include "appglobal.h" #include "utils/supportfunctions.h" #include "configparams.h" #include bool useVIS; bool autoSlantAdjust; bool autoSave; int squelch; int filterIndex; DSPFLOAT *lineTimeTableRX=NULL; DSPFLOAT *lineTimeTableTX=NULL; sSSTVParam rxSSTVParam; //sFAXParam rxFAXParam; sSSTVParam txSSTVParam; //sFAXParam txFAXParam; esstvMode sstvModeIndexRx; esstvMode sstvModeIndexTx; /** \brief setup the lineTable Setup a table containing the relative positions expressed in samples \param modeIndex index of the different modes: Martin1=0 , .... \param clock the adjusted samplingrate */ void setupSSTVLineTimeTable(esstvMode modeIndex,DSPFLOAT clock, bool transmit) { unsigned int i; if(transmit) { if (lineTimeTableTX!=NULL) delete [] lineTimeTableTX; lineTimeTableTX=new DSPFLOAT [SSTVTable[modeIndex].numberOfDataLines+1]; for (i=0;iaddToAux(QString("%1\t%2").arg(getSSTVModeNameShort((esstvMode) i)).arg(getLineLength((esstvMode) i,12000))); } } /*! return the sync width expressed in number of samples */ DSPFLOAT getSyncWidth(esstvMode modeIndex,DSPFLOAT clock) { return (SSTVTable[modeIndex].sync*clock); } /** \brief setup active parameters Setup active parameters given the VIS code \param[in] viscode VIS code of the mode to select \param[in] tx if set to true then parameters for transmit \return Returns the modeIndex if successful else NOTVALID */ esstvMode initializeParametersVIS(unsigned int viscode,bool tx) { esstvMode t; t=lookupVIS(viscode); initializeSSTVParametersIndex(t,tx); return t; } /** * \brief setup active parameters Setup active parameters given the modeIndex * \param[in] modeIndex selected mode * \param[in] tx if set to true then parameters for transmit * \return true if successful */ bool initializeSSTVParametersIndex(esstvMode modeIndex,bool tx) { if (modeIndex < NUMSSTVMODES) { if(tx) txSSTVParam=SSTVTable[modeIndex]; else rxSSTVParam=SSTVTable[modeIndex]; printActiveSSTVParam(tx); return true; } return false; } /** * \brief print active parameters Print the active parameters for debugging purposes (to logFilePtr and/or console) \sa logFile */ #ifndef QT_NO_DEBUG void printActiveSSTVParam(bool tx) { double clock; sSSTVParam * SSTVParam; if(tx) { SSTVParam=&txSSTVParam; clock=txClock; } else { SSTVParam=&rxSSTVParam; clock=rxClock; } addToLog(QString("name=%1, shortname=%2").arg(SSTVParam->name).arg(SSTVParam->shortName),LOGPARAM); addToLog(QString("imageTime=%1,numpix=%2,numDisplayLines=%3, numDataLines=%4,viscode=%5").arg(SSTVParam->imageTime) .arg(SSTVParam->numberOfPixels).arg(SSTVParam->numberOfDisplayLines).arg(SSTVParam->numberOfDataLines).arg(QString::number(SSTVParam->VISCode,16)),LOGPARAM); addToLog(QString("Samplecounters imageTime=%1 , lineTime=%2").arg(rint(SSTVParam->imageTime*clock)).arg(rint(SSTVParam->imageTime*11025./SSTVParam->numberOfDataLines)),LOGPARAM); } #else void printActiveSSTVParam(bool) {} #endif /** * setup parameters given the VIS code * @param vc VIS code of the mode to select * @return Returns the modeIndex if successful else NOTVALID */ esstvMode lookupVIS(unsigned int vc) { if(vc==0) return NOTVALID; esstvMode t=M1; do { if (SSTVTable[(int)t].VISCode==vc) { break; } t=(esstvMode)(t+1); } while (t=NUMSSTVMODES) return NOTVALID; return t; } /** \brief longname lookup Returns the long name of the mode \param[in] modeIndex selected mode \return short name of the mode or empty string if not a valid mode */ QString getSSTVModeNameLong(esstvMode modeIndex) { if(modeIndex==NOTVALID) return QString(""); return(SSTVTable[(int)modeIndex].name); } /** \brief shortname lookup Returns the short name of the mode \param[in] modeIndex selected mode \return short name of the mode or empty string if not a valid mode */ QString getSSTVModeNameShort(esstvMode modeIndex) { if(modeIndex==NOTVALID) return QString(""); return(SSTVTable[(int)modeIndex].shortName); } //QString getFAXModeNameLong(efaxMode modeIndex) //{ // if(modeIndex>=FAXNONE) return QString(""); // return(FAXTable[(int)modeIndex].name); //} //QString getFAXModeShort(efaxMode modeIndex) //{ // if(modeIndex>=FAXNONE) return QString(""); // return(FAXTable[(int)modeIndex].shortName); //} /** \brief lookup mode by line length Returns the closest match for a given line length \param[in] lineLength line length in samples \param clock the rx or tx clock to be used \return returns the modeIndex or NOTVALID if none found */ esstvMode modeLookup(unsigned int lineLength,DSPFLOAT clock) { int i; DSPFLOAT errLine, totalError; totalError=9999999; esstvMode lmode=NOTVALID; for (i=M1;ihighest) highest=length; } return highest; } // if slant \ raise image time /** \brief parameter table for all SSTV, FAX and CALIBRATION modes */ sSSTVParam SSTVTable[NUMSSTVMODES+1]= { // name shortName mode imagetime Pix Dis Txl VIS sync fp bp blank synctx fptx bptx blanktx {"Martin 1" ,"M1", M1, 114.29700,320,256,256,0xAC ,0.00500,0.00080,0.00050,0.00050,0.00500,0.00080,0.00000,0.00050,0.,1900,400 }, {"Martin 2" ,"M2", M2, 58.06400,320,256,256,0x28 ,0.00500,0.00080,0.00050,0.00050,0.00500,0.00080,0.00000,0.00050,0.,1900,400 }, {"Scottie 1" ,"S1", S1, 109.63250,320,256,256,0x3C ,0.00900,0.00010,0.00125,0.00125,0.00900,0.00080,0.00080,0.00125,0.,1900,400 }, {"Scottie 2" ,"S2", S2, 71.09450,320,256,256,0xB8 ,0.00900,0.00010,0.00150,0.00150,0.00900,0.00000,0.00110,0.00125,0.,1900,400 }, {"Scottie DX","SDX", SDX, 268.89380,320,256,256,0xCC ,0.00900,0.00000,0.00000,0.00100,0.00900,0.00000,0.00000,0.00100,0.,1900,400 }, {"SC2 60", "SC2-60", SC2_60, 61.54350,320,256,256,0xBB ,0.00500,0.00100,0.00100,0.00100,0.00500,0.00000,0.00000,0.00000,0.,1900,400 }, {"SC2 120", "SC2-120",SC2_120, 121.74250,320,256,256,0x3F ,0.00500,0.00100,0.00100,0.00100,0.00500,0.00000,0.00000,0.00000,0.,1900,400 }, {"SC2 180", "SC2-180",SC2_180, 182.03850,320,256,256,0xB7 ,0.00500,0.00100,0.00100,0.00100,0.00500,0.00000,0.00000,0.00000,0.,1900,400 }, {"Robot 24", "R24", R24, 24.00150,160,120,120,0x84 ,0.00600,0.00010,0.00300,0.00450,0.00600,0.00000,0.00120,0.00380,0.,1900,400 }, {"Robot 36" ,"R36", R36, 36.00200,320,240,240,0x88 ,0.00900,0.00040,0.00250,0.00700,0.00900,0.00000,0.00300,0.00540,0.,1900,400 }, {"Robot 72" ,"R72", R72, 72.00500,320,240,240,0x0C ,0.00900,0.00040,0.00350,0.00600,0.00900,0.00040,0.00250,0.00600,0.,1900,400 }, {"P3" ,"P3" , P3, 203.06420,640,496,496,0x71 ,0.00520,0.00210,0.00080,0.00250,0.00520,0.00104,0.00104,0.00104,0.,1900,400 }, {"P5" ,"P5" , P5, 304.59600,640,496,496,0x72 ,0.00780,0.00160,0.00160,0.00160,0.00780,0.00160,0.00160,0.00160,0.,1900,400 }, {"P7" ,"P7" , P7, 406.12800,640,496,496,0xF3 ,0.01040,0.00210,0.00210,0.00210,0.01040,0.00210,0.00210,0.00210,0.,1900,400 }, {"B/W 8" ,"BW8" , BW8, 8.02800,160,120,120,0x82 ,0.00600,0.00050,0.00050,0.00000,0.00600,0.00100,0.00050,0.00000,0.,1900,400 }, {"B/W 12" ,"BW12" , BW12, 12.00100,160,120,120,0x86 ,0.00600,0.00050,0.00150,0.00000,0.00600,0.00100,0.00100,0.00000,0.,1900,400 }, {"PD50" ,"PD50", PD50, 49.68770,320,256,128,0xDD ,0.02000,0.00000,0.00208,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD90" ,"PD90", PD90, 89.99500,320,256,128,0x63 ,0.02000,0.00000,0.00208,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD120" ,"PD120", PD120, 126.11150,640,496,248,0x5F ,0.02000,0.00000,0.00208,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD160" ,"PD160", PD160, 160.89420,512,400,200,0xE2 ,0.02000,0.00000,0.00200,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD180" ,"PD180", PD180, 187.06450,640,496,248,0x60 ,0.02000,0.00000,0.00200,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD240" ,"PD240", PD240, 248.01700,640,496,248,0xE1 ,0.02000,0.00200,0.00200,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"PD290" ,"PD290", PD290, 288.70200,800,616,308,0xDE ,0.02000,0.00000,0.00200,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400 }, {"MP73" ,"MP73", MP73, 72.9642,320,256,128,0x2523,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MP115" ,"MP115", MP115, 115.4640 ,320,256,128,0x2923,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MP140" ,"MP140", MP140, 139.5280,320,256,128,0x2A23,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MP175" ,"MP175", MP175, 175.3730,320,256,128,0x2C23,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MR73" ,"MR73", MR73, 73.2980 ,320,256,256,0x4523,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MR90" ,"MR90", MR90, 90.1950 ,320,256,256,0x4623,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MR115" ,"MR115", MR115, 115.2850 ,320,256,256,0x4923,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MR140" ,"MR140", MR140, 140.3740 ,320,256,256,0x4a23,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"MR175" ,"MR175", MR175, 175.1920 ,320,256,256,0x4a23,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"ML180" ,"ML180", ML180, 180.2085 ,640,496,496,0x8523,0.00900,0.00050,0.00050,0.00050,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"ML240" ,"ML240", ML240, 239.7328 ,640,496,496,0x8623,0.00900,0.00050,0.00050,0.00050,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"ML280" ,"ML280", ML280, 280.4060 ,640,496,496,0x8923,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"ML320" ,"ML320", ML320, 320.0910 ,640,496,496,0x8A23,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,1900,400 }, {"FAX480" ,"FAX480", FAX480, 133.63300,512,500,500,0x00 ,0.00512,0.00000,0.00000,0.00000,0.00512,0.00000,0.00000,0.00000,0.,1900,400 }, // narrowModes {"MP73-Narrow" ,"MP73-N", MP73N, 72.9665,320,256,128, 0x5C256D,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"MP110-Narrow" ,"MP110-N", MP110N, 109.8320,320,256,128, 0x44456D,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"MP140-Narrow" ,"MP140-N", MP140N, 139.5300,320,256,128 ,0x40556D,0.00900,0.00000,0.00100,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"MC110-Narrow" ,"MC110-N", MC110N, 109.703, 320,256,256, 0x05456D,0.00800,0.00000,0.00050,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"MC140-Narrow" ,"MC140-N", MC140N, 140.426, 320,256,256, 0x01556D,0.00800,0.00000,0.00050,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"MC180-Narrow" ,"MC180-N", MC180N, 180.363, 320,256,256, 0x0D656D,0.00800,0.00000,0.00050,0.00000,0.00900,0.00000,0.00100,0.00000,0.,2172,128 }, {"AVT24" ,"AVT24", AVT24, 22.50160,128,120,120,0xc0 ,0.00500,0.00080,0.00050,0.00050,0.00500,0.00080,0.00000,0.00050,0.,1900,400 }, {"AVT90" ,"AVT90", AVT90, 90.00450,320,240,240,0x44 ,0.00500,0.00080,0.00050,0.00050,0.00500,0.00080,0.00000,0.00050,0.,1900,400 }, {"AVT94" ,"AVT94", AVT94, 93.75000,320,200,200,0x48 ,0.00500,0.00080,0.00050,0.00050,0.00500,0.00080,0.00000,0.00050,0.,1900,400 }, {"No Mode" ,"NOTVALID",NOTVALID ,0.00000,0,0,0,0x0000,0.00000,0.00000,0.000000,0.0000,0.00000,0.00000,0.000000,0.0000,0.,0,0} }; //sFAXParam FAXTable[NUMFAXMODES+1]= //{ //// name shortName mode modulation lpm ioc lines pixels carr dev start sFreq stop sFreq phL invert colorM // {"NOAA" ,"NOAA", NOAA ,DEMODAM, 120., 576, 800, 1810, 2400, 400, 0 , 300, 0, 450 , 0, false, 1}, // {"HFFAX" ,"HFFXAX", HFFAX ,DEMODFM, 120., 288, 800, 905, 1900, 400, 5 , 300, 5, 450 , 20, false, 1}, // {"Custom" ,"Custom", FAXCUSTOM ,DEMODAM, 121., 288, 180, 905, 1900, 400, 5 , 300, 5, 450 , 20, false, 1}, // {"No Mode" ,"NOTVALID",FAXNONE ,0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0 , 0, false, 0}, //}; //#ifndef QT_NO_DEBUG //void printActiveFAXParam(bool tx) //{ // sFAXParam * FAXParam; // if(tx) // { // FAXParam=&txFAXParam; // } // else // { // FAXParam=&rxFAXParam; // } // addToLog(QString("name=%1, shortname=%2\n").arg(FAXParam->name).arg(FAXParam->shortName),LOGPARAM); // addToLog(QString("modulation=%1,lpm=%2,ioc=%3,numDisplayLines=%4, subcarrier=%5,deviation=%6\n").arg(FAXParam->modulation) // .arg(FAXParam->lpm).arg(FAXParam->ioc).arg(FAXParam->numberOfDisplayLines).arg(FAXParam->subcarrier) // .arg(FAXParam->deviation),LOGPARAM); //} //#else //void printActiveFAXParam(bool ) {} //#endif ///** // * \brief setup active parameters // Setup active parameters given the modeIndex // * \param[in] modeIndex selected mode // * \return true if successful //*/ //bool initializeFAXParametersIndex(efaxMode modeIndex,bool tx) //{ // if (modeIndex < NUMFAXMODES) // { // if(tx) // { // txFAXParam=FAXTable[modeIndex]; // txFAXParam.numberOfPixels=(txFAXParam.ioc*31419+5000)/10000; // } // else // { // rxFAXParam=FAXTable[modeIndex]; // rxFAXParam.numberOfPixels=(rxFAXParam.ioc*31419+5000)/10000; // } // printActiveFAXParam(tx); // return true; // } // return false; //} //void copyCustomParam(bool tx) //{ //// memmove((char *)&FAXTable[FAXCUSTOM],(char *)&activeFAXParam,sizeof(sFAXParam)); // if(tx) FAXTable[FAXCUSTOM]=txFAXParam; // else FAXTable[FAXCUSTOM]=rxFAXParam;; //} /*** \brief setup the FAX lineTable Setup a table containing the relative positions expressed in samples \param clock the adjusted samplingrate */ //void setupFAXLineTimeTable(DSPFLOAT clock,bool tx) //{ // unsigned int i; // if(tx) // { // for (i=1;i<=txFAXParam.numberOfDisplayLines;i++) // { // // one lineTime= lpm/60 // lineTimeTableTX[i-1]=((60.*(DSPFLOAT)i)/txFAXParam.lpm)*clock; // } // } // else // { // for (i=1;i<=rxFAXParam.numberOfDisplayLines;i++) // { // // one lineTime= lpm/60 // lineTimeTableRX[i-1]=((60.*(DSPFLOAT)i)/rxFAXParam.lpm)*clock; // } // } //} quint32 getMaxLineSamples() { int i; DSPFLOAT maxTime=0; DSPFLOAT time; for(i=M1;i<=FAX480;i++) { time=SSTVTable[i].imageTime/(DSPFLOAT)SSTVTable[i].numberOfDataLines; if(time>maxTime) maxTime=time; } return rint(maxTime*SAMPLERATE); } qsstv_9.2.6/qsstv/sstv/sstvparam.h0000664000175000017500000001001013203343610015765 0ustar jomajoma#ifndef SSTVPARAM_H #define SSTVPARAM_H #include #include "appglobal.h" /** \file */ /** SSTV Parameter functions @author Johan Maes - ON4QZ */ //#define NUMFAXMODES 3 //!< Number of FAX Modes for RX and TX #define GREENLINE 0 //!< index for green line buffer #define BLUELINE 1 //!< index for blue line buffer #define REDLINE 2 //!< index for red line buffer #define YLINEODD 3 //!< index for intensity line buffer 0 #define YLINEEVEN 4 //!< index for intensity line buffer 1 #define VIDEOBW 800 #define MAXLINES 800 #define DEMODAM 0 #define DEMODFM 1 #define MINSYNCWIDTH 0.004 #define MAXSYNCWIDTH 0.020 #define RETRACEWIDTH 0.29 /** \brief SSTV Modes M1 to FAX480 are using sync pulses, AVT modes do not use syncs. */ enum esstvMode { M1, M2, S1, S2, SDX, SC2_60, SC2_120, SC2_180, R24, R36, R72, P3, P5, P7, BW8, BW12, PD50, PD90, PD120, PD160, PD180, PD240, PD290, MP73, MP115, MP140, MP175, MR73, MR90, MR115, MR140, MR175, ML180, ML240, ML280, ML320, FAX480, MP73N, MP110N, MP140N, MC110N, MC140N, MC180N, AVT24, AVT90, AVT94, NOTVALID }; #define NUMSSTVMODES NOTVALID //!< Number of SSTV Modes for RX and TX #define STARTNARROW MP73N #define ENDNARROW MC180N #define STARTWIDE M1 #define ENDWIDE FAX480 //enum efaxMode //{ // NOAA, // HFFAX, // FAXCUSTOM, // FAXNONE //}; /* // struc used in frequency detection struct sTimeFreq { DSPFLOAT t; // time in sec DSPFLOAT dt; // minimum duration in sec unsigned int f; // frequency to detect (freq=0 if any freq) }; */ /** \brief sstv parameter structure Structure containing all the mode depended parameters Some of the parameters are updated at run time */ struct sSSTVParam { QString name; QString shortName; enum esstvMode mode; DSPFLOAT imageTime; unsigned int numberOfPixels; // NumberOfPixels per Line unsigned int numberOfDisplayLines; unsigned int numberOfDataLines; // data lines quint32 VISCode; float sync; //used for rx float fp; float bp; float blank; float synct; // used for tx float fpt; float bpt; float blankt; DSPFLOAT pixelDuration; int subcarrier; int deviation; }; //struct sFAXParam //{ // ~sFAXParam(){} // QString name; // QString shortName; //// enum efaxMode mode; // uint modulation; // double lpm; // unsigned int ioc; // unsigned int numberOfDisplayLines; // unsigned int numberOfPixels; // int subcarrier; // int deviation; // int aptStartDuration; // int aptStartFreq; // int aptStopDuration; // int aptStopFreq; // unsigned int numberOfPhasingLines; // bool inverted; // unsigned int colorMode; //}; extern sSSTVParam SSTVTable[NUMSSTVMODES+1]; //extern sFAXParam FAXTable[NUMFAXMODES+1]; extern sSSTVParam rxSSTVParam; //extern sFAXParam rxFAXParam; extern sSSTVParam txSSTVParam; //extern sFAXParam txFAXParam; extern DSPFLOAT *lineTimeTableRX; extern DSPFLOAT *lineTimeTableTX; void setupSSTVLineTimeTable(esstvMode modeIndex,DSPFLOAT clock,bool transmit); DSPFLOAT getLineLength(esstvMode modeIndex,DSPFLOAT clock); DSPFLOAT getSyncWidth(esstvMode modeIndex,DSPFLOAT clock); //void setupFAXLineTimeTable(DSPFLOAT clock); esstvMode initializeParametersVIS(unsigned int viscode,bool tx); bool initializeSSTVParametersIndex(esstvMode modeIndex,bool tx); //bool initializeFAXParametersIndex(efaxMode modeIndex,bool tx); esstvMode lookupVIS(unsigned int vc); QString getSSTVModeNameLong(esstvMode m); QString getSSTVModeNameShort(esstvMode m); void dumpSamplesPerLine(); //QString getFAXModeNameLong(efaxMode m); //QString getFAXModeShort(efaxMode m); esstvMode modeLookup(unsigned int lineLength,DSPFLOAT clock); DSPFLOAT longestLine(DSPFLOAT clock); bool lineIsValid(esstvMode mode,unsigned int lineLength,DSPFLOAT clock); void printActiveSSTVParam(bool tx); void copyCustomParam(bool tx); quint32 getMaxLineSamples(); extern bool useVIS; extern bool autoSlantAdjust; extern bool autoSave; extern int squelch; extern esstvMode sstvModeIndexRx; extern esstvMode sstvModeIndexTx; #endif qsstv_9.2.6/qsstv/sstv/sstvrx.cpp0000664000175000017500000003434613203343610015673 0ustar jomajoma#include "sstvrx.h" #include "appglobal.h" #include "configparams.h" #include "dispatcher.h" #include "filterparam.h" #include "filters.h" #include "modes/modebase.h" #ifndef QT_NO_DEBUG #include "utils/arraydumper.h" #include "scope/scopeview.h" #include "scope/scopeoffset.h" #endif QString defaultImageFormat; int minCompletion; #define DECAY 0.9956 const QString stateStr[sstvRx::END+1]= { "Hunting", "Processing", "WaitForSync", "SlantAdjust", "Restart", "Sync Lost", "Wait", "End" }; sstvRx::sstvRx(QObject *parent) : QObject(parent),syncNarrowProc(true),syncWideProc(false) { syncFilterPtr=NULL; videoFilterPtr=NULL; syncProcPtr=NULL; #ifndef QT_NO_DEBUG scopeViewerData=new scopeView("Data Scope"); scopeViewerSyncNarrow=new scopeView("Sync Scope Narrow"); scopeViewerSyncWide=new scopeView("Sync Scope Wide"); #endif } void sstvRx::init() { setFilters(); // setup sstvRx Filters resetParams(true); #ifndef QT_NO_DEBUG scopeViewerData->setAlternativeScaleMultiplier(SUBSAMPLINGFACTOR/rxClock); scopeViewerData->setCurveName("RX VOL",SCDATA1); scopeViewerData->setCurveName("TEST",SCDATA2); scopeViewerData->setCurveName("STATE",SCDATA3); scopeViewerData->setCurveName("DEMOD",SCDATA4); scopeViewerData->setAxisTitles("Samples","int","State"); scopeViewerSyncNarrow->setAlternativeScaleMultiplier(SUBSAMPLINGFACTOR/rxClock); scopeViewerSyncWide->setAlternativeScaleMultiplier(SUBSAMPLINGFACTOR/rxClock); #endif } void sstvRx::resetParams(bool bufferReset) { SSTVState=HUNTING; bufferCounter=0; if(bufferReset) { agcVolume=0; bufferVideoDemod.reset(); bufferSync1200Vol.reset(); bufferSync1900Vol.reset(); bufferInputVol.reset(); // bufferSyncDemod.skip(RXSTRIPE); syncNarrowProc.reset(); syncWideProc.reset(); } else { syncNarrowProc.init(); syncWideProc.init(); } } sstvRx::~sstvRx() { if(videoFilterPtr!=NULL) delete videoFilterPtr; if(syncFilterPtr !=NULL) delete syncFilterPtr; } void sstvRx::setFilters() { if(videoFilterPtr==NULL) videoFilterPtr=new videoFilter(RXSTRIPE); else videoFilterPtr->init(); if(syncFilterPtr==NULL) syncFilterPtr=new syncFilter(RXSTRIPE); else syncFilterPtr->init(); } void sstvRx::run(DSPFLOAT *dataPtr, unsigned int *inputVolumePtr) { int i; bufferCounter++; if(videoFilterPtr==NULL) { errorOut() << "videoFltr NULL"; return; } // run AGC for(i=0;iagcVolume) agcVolume=tmp; else agcVolume*=DECAY; if(agcVolume<1000) agcVolume=1000; //maximum gain is 8 dataPtr[i]=dataPtr[i]*8000/agcVolume; } videoFilterPtr->process(dataPtr); bufferVideoDemod.putNoCheck(videoFilterPtr->demodPtr,RXSTRIPE); syncFilterPtr->process(dataPtr); // bufferSyncDemod.putNoCheck(syncFilterPtr->demodPtr,RXSTRIPE); bufferSync1200Vol.putNoCheck(syncFilterPtr->detect1200Ptr,RXSTRIPE); bufferSync1900Vol.putNoCheck(syncFilterPtr->detect1900Ptr,RXSTRIPE); // bufferSyncVol.putNoCheck(syncFilterPtr->test1Ptr,RXSTRIPE); // bufferTest.putNoCheck(syncFilterPtr->test2Ptr,RXSTRIPE); bufferInputVol.putNoCheck(inputVolumePtr,RXSTRIPE); while (bufferVideoDemod.count()) { syncWideProc.freqPtr=bufferVideoDemod.readPointer(); syncNarrowProc.freqPtr=bufferVideoDemod.readPointer(); syncWideProc.syncVolumePtr =bufferSync1200Vol.readPointer(); syncNarrowProc.syncVolumePtr =bufferSync1900Vol.readPointer(); // syncWideProc.inputVolumePtr=bufferInputVol.readPointer(); // syncNarrowProc.inputVolumePtr=bufferInputVol.readPointer(); displaySyncEvent* ce; if(syncProcPtr) { ce = new displaySyncEvent(syncProcPtr->syncQuality); } else { ce = new displaySyncEvent(0); } QApplication::postEvent(dispatcherPtr, ce); #ifndef QT_NO_DEBUG scopeViewerData->addData(SCDATA2,dataPtr,syncWideProc.sampleCounter,RXSTRIPE); scopeViewerData->addData(SCDATA4,bufferVideoDemod.readPointer(),syncWideProc.sampleCounter,RXSTRIPE); #endif process(); } // addToLog(QString("After process readIndex:=%1 sampleCounter:=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); } void sstvRx::advanceBuffers() { syncWideProc.sampleCounter+=RXSTRIPE; syncNarrowProc.sampleCounter+=RXSTRIPE; bufferVideoDemod.skip(RXSTRIPE); bufferSync1200Vol.skip(RXSTRIPE); bufferSync1900Vol.skip(RXSTRIPE); bufferInputVol.skip(RXSTRIPE); } void sstvRx::rewindBuffers(uint rlen) { syncWideProc.sampleCounter-=rlen; syncNarrowProc.sampleCounter-=rlen; bufferVideoDemod.rewind(rlen); bufferSync1200Vol.rewind(rlen); bufferSync1900Vol.rewind(rlen); bufferInputVol.rewind(rlen); } void sstvRx::process() { // unsigned int ri; quint32 block; quint32 syncPosition; quint32 sampleCounterLatch; quint32 diff; syncProcessor::esyncProcessState syncStateWide; syncProcessor::esyncProcessState syncStateNarrow; syncProcessor::esyncProcessState syncState; rxSSTVStatusEvent *stce; syncWideProc.process(); syncStateWide=syncWideProc.getSyncState(syncPosition); if(syncStateWide!=syncProcessor::MODEDETECT) { usingWide=true; syncNarrowProc.setEnabled(false); syncProcPtr=&syncWideProc; } else { syncNarrowProc.process(); syncStateNarrow=syncNarrowProc.getSyncState(syncPosition); if(syncStateNarrow!=syncProcessor::MODEDETECT) { usingWide=false; syncWideProc.setEnabled(false); syncProcPtr=&syncNarrowProc; } else { syncProcPtr=NULL; syncState=syncProcessor::MODEDETECT; if(SSTVState!=HUNTING) { switchState(HUNTING); } } } if(syncProcPtr) { syncState=syncProcPtr->getSyncState(syncPosition); } if((syncProcPtr!=0) && (syncProcPtr->getSyncState(syncPosition)==syncProcessor::SYNCLOST)) { switchState(SYNCLOST); } switch (SSTVState) { case HUNTING: if(syncProcPtr==NULL) { stce= new rxSSTVStatusEvent(QString("No sync")); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done advanceBuffers(); break; // no sync } stce= new rxSSTVStatusEvent(QString("Receiving ")+getSSTVModeNameLong(syncProcPtr->getMode())); lastUsedModeStr=getSSTVModeNameShort(syncProcPtr->getMode()); QApplication::postEvent( dispatcherPtr, stce ); // Qt will delete it when done // fall trough for first processing switchState(SLANTADJUST); // for logging // clear the call received via fskID emit (resetCall()); case SLANTADJUST: sampleCounterLatch=syncProcPtr->sampleCounter; //remember where we've got // ri=bufferVideoDemod.getReadIndex(); // addToLog(QString("rxFunctions: sampleCounterLatch= %1,readIndex=%2").arg(sampleCounterLatch).arg(ri),LOGRXFUNC); block=(syncPosition)/RXSTRIPE; bufferVideoDemod.rewind(syncProcPtr->sampleCounter-block*RXSTRIPE); // ri=bufferVideoDemod.getReadIndex(); // addToLog(QString("sc_rewind: block=%1,new readIndex= %2").arg(block).arg(ri),LOGRXFUNC); syncProcPtr->sampleCounter=block*RXSTRIPE; syncProcPtr->currentModePtr->setRxSampleCounter(syncProcPtr->sampleCounter); syncProcPtr->currentModePtr->redrawFast(true); syncProcPtr->currentModePtr->process(bufferVideoDemod.readPointer(),syncPosition-syncProcPtr->sampleCounter,true,syncProcPtr->sampleCounter); // scopeViewerData->addData(SCDATA2,bufferVideoDemod.readPointer(),syncProcPtr->sampleCounter,RXSTRIPE); // addToLog(QString("slant scope add demodIdx=%1; syncProcPtr->sampleCounter=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); #ifndef QT_NO_DEBUG scopeViewerData->addData(SCDATA3,syncProcPtr->currentModePtr->debugStatePtr,syncProcPtr->sampleCounter,RXSTRIPE); #endif addToLog(QString("rxFunctions: currentMode pos:=%1, syncProcPtr->sampleCounter %2").arg(syncPosition-syncProcPtr->sampleCounter).arg(syncProcPtr->sampleCounter),LOGRXFUNC); // addToLog(QString("after Current mode set: %1,syncProcPtr->sampleCounter: %2").arg(rxHoldingBuffer.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); while(syncProcPtr->sampleCountersampleCounter+=RXSTRIPE; // addToLog(QString("loop readIndex: %1,syncProcPtr->sampleCounter: %2").arg(rxHoldingBuffer.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); syncProcPtr->currentModePtr->process(bufferVideoDemod.readPointer(),0,false,syncProcPtr->sampleCounter); // scopeViewerData->addData(SCDATA2,bufferVideoDemod.readPointer(),syncProcPtr->sampleCounter,RXSTRIPE); #ifndef QT_NO_DEBUG scopeViewerData->addData(SCDATA3,syncProcPtr->currentModePtr->debugStatePtr,syncProcPtr->sampleCounter,RXSTRIPE); #endif } addToLog(QString("end loop readIndex: %1,syncProcPtr->sampleCounter: %2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); syncProcPtr->currentModePtr->redrawFast(false); syncProcPtr->recalculateMatchArray(); switchState(PROCESSING); advanceBuffers(); break; case PROCESSING: if(syncState!=syncProcessor::INSYNC) { switchState(END); } else if(syncProcPtr->retraceFlag) { addToLog(QString("retrace detected"),LOGRXFUNC); saveImage(); // addToLog(QString("before rewind readIndex:=%1 sampleCounter:=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); rewindBuffers(8*RXSTRIPE); syncProcPtr->resetRetraceFlag(); resetParams(false); // addToLog(QString("after resetParms readIndex:=%1 sampleCounter:=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); break; } else { if(syncProcPtr->currentModePtr->process(bufferVideoDemod.readPointer(),0,false,syncProcPtr->sampleCounter)==modeBase::MBENDOFIMAGE) { switchState(END); } } if(syncProcPtr->hasNewClock()) { syncProcPtr->currentModePtr->init(syncProcPtr->getNewClock()); switchState(SLANTADJUST); } #ifndef QT_NO_DEBUG scopeViewerData->addData(SCDATA3,syncProcPtr->currentModePtr->debugStatePtr,syncProcPtr->sampleCounter,RXSTRIPE); #endif advanceBuffers(); if(syncProcPtr->tempOutOfSync) { bufferIdx=bufferVideoDemod.getReadIndex(); switchState(WAITFORSYNC); } break; case WAITFORSYNC: { if(!(syncState==syncProcessor::INSYNC)) { switchState(END); } else if(syncProcPtr->retraceFlag) { addToLog(QString("retrace detected"),LOGRXFUNC); saveImage(); // addToLog(QString("before rewind readIndex:=%1 sampleCounter:=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); rewindBuffers(8*RXSTRIPE); syncProcPtr->resetRetraceFlag(); resetParams(false); // addToLog(QString("after resetParms readIndex:=%1 sampleCounter:=%2").arg(bufferVideoDemod.getReadIndex()).arg(syncProcPtr->sampleCounter),LOGRXFUNC); break; } else { currentIdx=bufferVideoDemod.getReadIndex(); if(!syncProcPtr->tempOutOfSync) { bufferVideoDemod.setReadIndex(bufferIdx); while(bufferVideoDemod.getReadIndex()!=currentIdx) { if(syncProcPtr->currentModePtr->process(bufferVideoDemod.readPointer(),0,false,syncProcPtr->sampleCounter)==modeBase::MBENDOFIMAGE) { switchState(END); } bufferVideoDemod.skip(RXSTRIPE); } if(syncProcPtr->currentModePtr->process(bufferVideoDemod.readPointer(),0,false,syncProcPtr->sampleCounter)==modeBase::MBENDOFIMAGE) { switchState(END); } switchState(PROCESSING); } } advanceBuffers(); break; } case RESTART: resetParams(true); break; case SYNCLOST: saveImage(); diff=(syncProcPtr->sampleCounter-syncProcPtr->lastValidSyncCounter)/RXSTRIPE; addToLog(QString("rewind after synclost %1").arg(diff),LOGRXFUNC); rewindBuffers(diff*RXSTRIPE); syncProcPtr->resetRetraceFlag(); resetParams(false); break; case WAIT: break; case END: saveImage(); resetParams(false); // will set state to HUNTING advanceBuffers(); break; } } void sstvRx::saveImage() { bool done; addToLog("saveImage",LOGRXFUNC); endImageSSTVRXEvent *endce; if(syncProcPtr->currentModePtr->receivedLines()<(syncProcPtr->currentModePtr->imageLines()*minCompletion)/100) { endce = new endImageSSTVRXEvent(""); } else { endce = new endImageSSTVRXEvent(getSSTVModeNameShort(syncProcPtr->getMode())); } endce->waitFor(&done); QApplication::postEvent(dispatcherPtr, endce); while(!done) { usleep(100);} } void sstvRx::switchState(eSSTVState newState) { addToLog(QString("%1 to %2").arg(stateStr[SSTVState]).arg(stateStr[newState]),LOGRXFUNC); SSTVState=newState; } void sstvRx::eraseImage() { switchState(RESTART); while(SSTVState!=HUNTING) { QApplication::processEvents(); } } #ifndef QT_NO_DEBUG unsigned int sstvRx::setOffset(unsigned int offset,bool ask) { unsigned int xOffset=0; if(ask) { scopeOffset so; so.setOffset(offset); if(so.exec()==QDialog::Accepted) { xOffset=so.getOffset()*1000; } } else { xOffset=offset*1000; } syncNarrowProc.clear(); syncWideProc.clear(); scopeViewerData->clear(); syncNarrowProc.setOffset(xOffset); syncWideProc.setOffset(xOffset); scopeViewerData->setOffset(xOffset); return xOffset/1000; } #endif qsstv_9.2.6/qsstv/sstv/sstvrx.h0000664000175000017500000000412613203343610015331 0ustar jomajoma#ifndef SSTVRX_H #define SSTVRX_H #include #include "appdefs.h" #include "utils/buffermanag.h" #include "syncprocessor.h" extern int minCompletion; class modeBase; class syncFilter; class videoFilter; class rectConvolution; class integrator; class sstvRx : public QObject { Q_OBJECT public: enum eSSTVState {HUNTING,PROCESSING,WAITFORSYNC,SLANTADJUST,RESTART,SYNCLOST,WAIT,END}; explicit sstvRx(QObject *parent = 0); ~sstvRx(); void init(); void setFilters(); void run(DSPFLOAT *dataPtr, unsigned int *inputVolumePtr); void eraseImage(); syncProcessor syncNarrowProc; syncProcessor syncWideProc; #ifndef QT_NO_DEBUG unsigned int setOffset(unsigned int offset,bool ask); #endif signals: void resetCall(); private: // void getData(); void process(); void switchState(eSSTVState newState); void resetParams(bool bufferReset); void saveImage(); void advanceBuffers(); void rewindBuffers(uint rlen); // DSPFLOAT rxHoldingBuffer[RXSTRIPE]; buffer bufferVideoDemod; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering // buffer bufferSyncDemod; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering buffer bufferSync1200Vol; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering buffer bufferSync1900Vol; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering buffer bufferTest; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering buffer bufferInputVol; // 2^22= 4194304, divided by samplingrate 12000 gives 349 seconds buffering // buffer bufferInputVolume; syncFilter *syncFilterPtr; videoFilter *videoFilterPtr; DSPFLOAT tempBuffer[RXSTRIPE]; rectConvolution *syncConvolvePtr; integrator *volumeIntergratorPtr; eSSTVState SSTVState; unsigned int bufferCounter; QString lastUsedModeStr; unsigned int bufferIdx; unsigned int currentIdx; bool usingWide; syncProcessor *syncProcPtr; DSPFLOAT agcVolume; }; #endif // SSTVRX_H qsstv_9.2.6/qsstv/sstv/sstvtx.cpp0000664000175000017500000001540713203343610015672 0ustar jomajoma#include "sstvtx.h" #include "appglobal.h" #include "configparams.h" #include "soundbase.h" #include "sstv/cw.h" #include "dispatcher.h" #include "synthes.h" #include "modes/modes.h" #include "txfunctions.h" sstvTx::sstvTx() { currentMode=0; oldMode=NOTVALID; } sstvTx::~sstvTx() { if(currentMode) delete currentMode; } void sstvTx::init() { sampleCounter=0; } void sstvTx::sendPreamble() { addToLog("txFunc:sendPreamble",LOGTXFUNC); synthesPtr->sendTone(0.1,1900.,0,true); synthesPtr->sendTone(0.1,1500.,0,true); synthesPtr->sendTone(0.1,1900.,0,true); synthesPtr->sendTone(0.1,1500.,0,true); synthesPtr->sendTone(0.1,2300.,0,true); synthesPtr->sendTone(0.1,1500.,0,true); synthesPtr->sendTone(0.1,2300.,0,true); synthesPtr->sendTone(0.1,1500.,0,true); synthesPtr->sendTone(0.3,1900.,0,true); synthesPtr->sendTone(0.01,1200.,0,true); synthesPtr->sendTone(0.3,1900.,0,true); } void sstvTx::sendVIS() { int i,l; int t=txSSTVParam.VISCode; addToLog("txFunc:sendVis",LOGTXFUNC); if(currentMode->isNarrow()) { l=24; synthesPtr->sendTone(0.300,1900,0,true); synthesPtr->sendTone(0.100,2100,0,true); synthesPtr->sendTone(0.022,1900,0,true); // startbit for (i=0;isendTone(0.022,1900,0,true); else synthesPtr->sendTone(0.022,2100,0,true); t>>=1; } } else { if ((t&0xFF)==0x23) l=16; else l=8; synthesPtr->sendTone(0.030,1200,0,true); // startbit for (i=0;isendTone(0.030,1100,0,true); else synthesPtr->sendTone(0.030,1300,0,true); t>>=1; } synthesPtr->sendTone(0.030,1200,0,true); // stopbit } } bool sstvTx::create(esstvMode m,DSPFLOAT clock) { if((oldMode==m) && (currentMode!=NULL)) { currentMode->init(clock); return true; } oldMode=m; if(currentMode) delete currentMode; currentMode=0; switch (m) { case M1: case M2: currentMode=new modeGBR(m,TXSTRIPE,true,false); break; case S1: case S2: case SDX: currentMode=new modeGBR2(m,TXSTRIPE,true,false); break; case R36: currentMode=new modeRobot1(m,TXSTRIPE,true,false); break; case R24: case R72: case MR73: case MR90: case MR115: case MR140: case MR175: case ML180: case ML240: case ML280: case ML320: currentMode=new modeRobot2(m,TXSTRIPE,true,false); break; case SC2_60: case SC2_120: case SC2_180: case P3: case P5: case P7: case MC110N: case MC140N: case MC180N: currentMode=new modeRGB(m,TXSTRIPE,true,false); break; case FAX480: case BW8: case BW12: currentMode=new modeBW(m,TXSTRIPE,true,false); break; case AVT24: case AVT90: case AVT94: currentMode=new modeAVT(m,TXSTRIPE,true,false); break; case PD50: case PD90: case PD120: case PD160: case PD180: case PD240: case PD290: case MP73: case MP115: case MP140: case MP175: currentMode=new modePD(m,TXSTRIPE,true,false); break; case MP73N: case MP110N: case MP140N: currentMode=new modePD(m,TXSTRIPE,true,true); break; default: m=NOTVALID; break; } if (m!=NOTVALID) { initializeSSTVParametersIndex(m,true); QString s=getSSTVModeNameLong(m); addToLog("create: create TX mode",LOGTXFUNC); currentMode->init(clock); return true; } return false; } double sstvTx::FSKIDTime() { double tim; double charTime=0.022*6; tim=(myCallsign.size()+3)*charTime; tim+=0.422; return tim; } double sstvTx::calcTxTime(int overheadTime) { double tim=0; // tim= soundIOPtr->getPlaybackStartupTime(); tim+=SILENCEDELAY; initializeSSTVParametersIndex(sstvModeIndexTx,true); int t=txSSTVParam.VISCode; tim+=1.41; //preamble; if ((t&0xFF)==0x23) tim+=18.*0.03; else tim+=10.*0.03; tim+=txSSTVParam.imageTime; // if(enableCW) if(useCW) { tim+=0.5 ;//CW silence gap initCW(cwText); tim+=getCWDuration(); tim+=0.3; // trailer; } else { tim+=FSKIDTime(); } tim+=overheadTime; return tim; } bool sstvTx::sendImage(imageViewer *ivPtr) { modeBase::eModeBase mb; if(useVOX) synthesPtr->sendTone(1.,1700.,0,false); if(txSSTVParam.mode==FAX480) { for (int i=0;i<1220;i++) { synthesPtr->sendTone(0.00205,1500,0,true); synthesPtr->sendTone(0.00205,2300,0,true); } } else { sendPreamble(); sendVIS(); } addToLog("txFunc: sendImage",LOGTXFUNC); mb=currentMode->transmitImage(ivPtr); if(mb==modeBase::MBABORTED) return false; else return true; } void sstvTx::applyTemplate(QString templateFilename,bool useTemplate,imageViewer *ivPtr) { create(sstvModeIndexTx,txClock); ivPtr->setParam(templateFilename,useTemplate, txSSTVParam.numberOfPixels,txSSTVParam.numberOfDisplayLines); } void sstvTx::abort() { if(currentMode) currentMode->abort(); } bool sstvTx::aborted() { if(currentMode) return currentMode->aborted(); else return true; } void sstvTx::createTestPattern(imageViewer *ivPtr,etpSelect sel) { int i,j; QRgb *pixelPtr; int nb=txSSTVParam.numberOfPixels; int nl=txSSTVParam.numberOfDisplayLines; ivPtr->clear(); ivPtr->createImage(QSize(nb,nl),imageBackGroundColor,false); switch (sel) { case TPRASTER: for(i=0;igetScanLineAddress(i); if(i<2) { int val=0;; for(j=0;j=(nl-2)) { { int val=0;; for(j=0;jgetScanLineAddress(i); for(j=0;jgetScanLineAddress(i); for(j=0;jgetScanLineAddress(i); for(j=0;jsetValidImage(true); ivPtr->displayImage(); } qsstv_9.2.6/qsstv/sstv/sstvtx.h0000664000175000017500000000123613203343610015332 0ustar jomajoma#ifndef SSTVTX_H #define SSTVTX_H #include "sstvparam.h" #include "testpatternselection.h" class modeBase; class imageViewer; class sstvTx { public: sstvTx(); ~sstvTx(); void init(); double calcTxTime(int overheadTime); bool sendImage(imageViewer *ivPtr); void abort(); bool aborted(); void applyTemplate(QString templateFilename, bool useTemplate, imageViewer *ivPtr); void createTestPattern(imageViewer *ivPtr, etpSelect sel); private: modeBase *currentMode; bool create(esstvMode m,DSPFLOAT clock); void sendPreamble(); void sendVIS(); esstvMode oldMode; unsigned long sampleCounter; double FSKIDTime(); }; #endif // SSTVTX_H qsstv_9.2.6/qsstv/sstv/syncprocessor.cpp0000664000175000017500000006702013203343610017231 0ustar jomajoma#include "syncprocessor.h" #include "appglobal.h" #include "sstvparam.h" #include "configparams.h" #include "dispatchevents.h" #include "dispatcher.h" #include "modes/modes.h" #ifndef QT_NO_DEBUG #include "scope/scopeview.h" #endif #define LINETOLERANCEMODEDETECT 0.015 #define LINETOLERANCEINSYNC 0.008 #define SYNCAVGINTEGRATOR 0.09 #define FILTERDELAYCORRECTION -18 #define MINVOLUME 300 //#define DISABLERETRACE //#define DISABLEDETECT //#define DISABLENARROW ssenitivity sensitivityArray[2]= { // minMatchedLines maxLineDistanceModeDetect maxLineDistanceInSync onVolume offVolume startToMax; { 6, 2, 7, 3000, 2500 , 1.5}, { 6, 2, 7 , 2000, 1800 , 1.5} }; //const QString syncStateStr[syncProcessor::SYNCVALID+1]= //{ // "SYNCOFF", // "SYNCUP", // "SYNCSTART", // "SYNCON", // "SYNCDOWN", // "SYNCEND", // "SYNCVALID" //}; const QString syncStateStr[syncProcessor::SYNCVALID+1]= { "SYNCOFF", "SYNCUP", "SYNCVALID" }; const QString stateStr[syncProcessor::RETRACEWAIT+1]= { "Mode detect", "In Sync", "Sync Lost New Mode", "Sync Lost False syncs", "Sync Lost Missing Lines", "Sync Lost", "Retrace Wait" }; syncProcessor::syncProcessor(bool narrow, QObject *parent) : QObject(parent),streamDecode(narrow) { detectNarrow=narrow; currentModePtr=NULL; visMode=NOTVALID; maxLineSamples=getMaxLineSamples(); // syncFound=false; if(!detectNarrow) { connect(streamDecode.getFskDecoderPtr(),SIGNAL(callReceived(QString)),SLOT(slotNewCall(QString))); connect(streamDecode.getVisDecoderPtr(),SIGNAL(visCodeWideDetected(int,uint)),SLOT(slotVisCodeDetected(int,uint))); } else { connect(streamDecode.getVisDecoderPtr(),SIGNAL(visCodeNarrowDetected(int,uint)),SLOT(slotVisCodeDetected(int,uint))); } } syncProcessor::~syncProcessor() { int i; for(i=0;i<=ENDNARROW;i++) { matchArray[i].clear(); } if(currentModePtr!=NULL) delete currentModePtr; } void syncProcessor::reset() { sampleCounter=0; init(); if(!detectNarrow) streamDecode.reset(); // scopeViewerSyncNarrow->clear(); // scopeViewerSyncWide->clear(); #ifndef QT_NO_DEBUG scopeViewerSyncNarrow->setCurveName("SYNC VOL",SCDATA1); scopeViewerSyncNarrow->setCurveName("SYNC AVG",SCDATA2); scopeViewerSyncNarrow->setCurveName("SYNC STATE",SCDATA3); scopeViewerSyncNarrow->setCurveName("FREQ",SCDATA4); scopeViewerSyncNarrow->setAxisTitles("Samples","int","State"); scopeViewerSyncWide->setCurveName("SYNC VOL",SCDATA1); scopeViewerSyncWide->setCurveName("SYNC AVG",SCDATA2); scopeViewerSyncWide->setCurveName("SYNC STATE",SCDATA3); scopeViewerSyncWide->setCurveName("FREQ",SCDATA4); scopeViewerSyncWide->setAxisTitles("Samples","int","State"); #endif } /** * @brief * */ void syncProcessor::init() { enabled=true; if(detectNarrow) { idxStart=STARTNARROW; idxEnd=ENDNARROW; } else { idxStart=STARTWIDE; idxEnd=ENDWIDE; } if(sstvModeIndexRx!=0) { if((sstvModeIndexRx>=idxStart) && (sstvModeIndexRx<=idxEnd)) { idxEnd=idxStart=(esstvMode)(sstvModeIndexRx-1); } else { enabled=false; } } else if(visMode!=NOTVALID) { if((visMode>=idxStart) && (visMode<=idxEnd)) idxEnd=idxStart=visMode; } visMode=NOTVALID; // and reset the visMode syncProcesState=MODEDETECT; modifiedClock=rxClock/SUBSAMPLINGFACTOR; syncArrayIndex=0; syncArray[0].init(); retraceFlag=false; syncState=SYNCOFF; displaySyncEvent* ce; ce = new displaySyncEvent(0); // reset sync vuMeter QApplication::postEvent(dispatcherPtr, ce); addToLog("init called",LOGSYNCSTATE); clearMatchArray(); currentMode=NOTVALID; lineTolerance=LINETOLERANCEMODEDETECT; minMatchedLines=sensitivityArray[squelch].minMatchedLines; } //void syncProcessor::reset() //{ // sampleCounter=0; // init(); //} void syncProcessor::process() { // if(!syncFound) syncQuality=0; #ifdef DISABLENARROW if(!detectNarrow) { #endif streamDecode.process(freqPtr,sampleCounter); if(enabled) { extractSync(); } #ifdef DISABLENARROW } #endif #ifndef QT_NO_DEBUG if(detectNarrow) { scopeViewerSyncNarrow->addData(SCDATA1,syncVolumePtr,sampleCounter,RXSTRIPE); // scopeViewerSyncNarrow->addData(SCDATA2,inputVolumePtr,sampleCounter,RXSTRIPE); scopeViewerSyncNarrow->addData(SCDATA3,syncStateBuffer,sampleCounter,RXSTRIPE); scopeViewerSyncNarrow->addData(SCDATA4,freqPtr,sampleCounter,RXSTRIPE); } else { scopeViewerSyncWide->addData(SCDATA1,syncVolumePtr,sampleCounter,RXSTRIPE); // scopeViewerSyncWide->addData(SCDATA2,inputVolumePtr,sampleCounter,RXSTRIPE); scopeViewerSyncWide->addData(SCDATA3,syncStateBuffer,sampleCounter,RXSTRIPE); scopeViewerSyncWide->addData(SCDATA4,freqPtr,sampleCounter,RXSTRIPE); } #endif } void syncProcessor::extractSync() { int i; int lastSync; for(i=0;isensitivityArray[squelch].onVolume) { syncArray[syncArrayIndex].start=sampleCounter+i; syncArray[syncArrayIndex].startVolume=syncVolumePtr[i]; switchSyncState(SYNCACTIVE,sampleCounter+i); } break; case SYNCACTIVE: if(syncVolumePtr[i]last()->to].end; if((sampleCounter+RXSTRIPE-RXSTRIPE/7)>(lastSync+10*samplesPerLine)) { tempOutOfSync=true; } missingLines=(uint) round(((sampleCounter+RXSTRIPE-RXSTRIPE/7)-(lastSync+samplesPerLine))/samplesPerLine+1); calcSyncQuality(); } else if(visMode!=NOTVALID) { if(sampleCounter>visTimeout) { visMode=NOTVALID; init(); } } } void syncProcessor::slotNewCall(QString call) { emit callReceived(call); retraceFlag=true; } void syncProcessor::slotVisCodeDetected(int mode,uint visSampleCounter) { if((mode>=idxStart) && (mode<=idxEnd)) { visMode=(esstvMode)mode; idxStart=idxEnd=(esstvMode)mode; minMatchedLines=3; visTimeout=visSampleCounter+4*getLineLength(visMode,modifiedClock); } else { visMode=NOTVALID; } } bool syncProcessor::validateSync() { bool result; #ifndef DISABLERETRACE if(syncArray[syncArrayIndex].diffStartEnd()>=MINRETRACEWIDTH) { syncArray[syncArrayIndex].retrace=true; result=true; } else if(syncArray[syncArrayIndex].diffStartEnd()>=MINRETRACEWIDTH/4) { if((syncArrayIndex>2) && (syncArray[syncArrayIndex].end-syncArray[syncArrayIndex-1].start)>=MINRETRACEWIDTH && (syncArray[syncArrayIndex].start-syncArray[syncArrayIndex-1].end)<=MINRETRACEWIDTH/5) { syncArray[syncArrayIndex-1].end=syncArray[syncArrayIndex].end; syncArray[syncArrayIndex-1].retrace=true; syncArray[syncArrayIndex-1].diffStartEnd(); // just calculate the width; syncArrayIndex--; } result=true; } #endif else if((syncArray[syncArrayIndex].diffStartEnd()>=0.004*SAMPLERATE) && (syncArray[syncArrayIndex].diffStartEnd()<=0.025*SAMPLERATE)) { syncArray[syncArrayIndex].retrace=false; // addToLog(QString("index %1, mid:=%2").arg(syncArrayIndex).arg(syncArray[syncArrayIndex].mid),LOGSYNCACCEPTED); result=true; } else { addToLog(QString("Sync rejected:%1 end:%2 width %3").arg(syncArray[syncArrayIndex].start) .arg(syncArray[syncArrayIndex].end).arg(syncArray[syncArrayIndex].diffStartEnd()),LOGSYNCREJECTED); result=false; } if(result) { checkSyncArray(); switch(syncProcesState) { case MODEDETECT: if(findMatch()) { visMode=NOTVALID; //reset visMode; #ifndef DISABLEDETECT //we have a new mode if(!createModeBase()) { addToLog("Error creating modeBase",LOGALL); result=false; } else { falseSyncs=0; lineTolerance=LINETOLERANCEINSYNC; // when we have S1,S2 or SDX then we have to set the syncposition at the beginning of the green line // syncPosition=currentModePtr->adjustSyncPosition(syncArray[0].end)- FILTERDELAYCORRECTION; // type 1 sync end unsigned int syncCorrected;; syncWidth=getSyncWidth(currentMode ,modifiedClock); if(syncArray[0].retrace) { syncCorrected=syncArray[0].end; } else { syncCorrected=(syncArray[0].start+syncArray[0].end)/2+syncWidth/2; } syncPosition=currentModePtr->adjustSyncPosition(syncCorrected,syncArray[0].retrace)+FILTERDELAYCORRECTION; // type 2 sync end tempOutOfSync=false; slantAdjustLine=6; slantAdjust(true); switchProcessState(INSYNC); } #endif } break; case INSYNC: trackSyncs(); break; case SYNCLOSTNEWMODE: case SYNCLOSTFALSESYNC: case SYNCLOSTMISSINGLINES: case SYNCLOST: addToLog("synclost detected",LOGSYNCSTATE); break; case RETRACEWAIT: break; } syncArrayIndex++; syncArray[syncArrayIndex].init(); } return result; } void syncProcessor::trackSyncs() { // calcSyncQuality(); if(addToChain(currentMode,activeChainPtr->last()->to)) { falseSyncs=0; missingLines=0; if(tempOutOfSync) { // check if we can resynchronize if(activeChainPtr->last()->lineSpacing<=2) { tempOutOfSync=false; } } } else { falseSyncs++; } if(retraceFlag) { switchProcessState(RETRACEWAIT); return; } if(currentModeMatchChanged) { currentModeMatchChanged=false; calculateLineNumber(activeChainPtr->last()->from,activeChainPtr->last()->to); lastSyncTest=activeChainPtr->last()->endTo; slantAdjust(false); if(falseSlantSync>=10) { switchProcessState(SYNCLOSTFALSESYNC); } } } void syncProcessor::calcSyncQuality() { int k; quint16 fs=0; syncQuality=10-(missingLines*5/25); //calc false syncs in the last 10 if(activeChainPtr->count()>=10) { for(k=activeChainPtr->count()-10;kcount()-1;k++) { fs+=activeChainPtr->at(k)->to-activeChainPtr->at(k)->from-1; } } syncQuality-=((falseSyncs*5)/30); syncQuality-=(falseSlantSync*2); if(syncQuality<0) syncQuality=0; if((syncQuality<=0) && (squelch!=1)) { switchProcessState(SYNCLOST); } } void syncProcessor::calculateLineNumber(uint fromIdx,uint toIdx) { quint16 lnbr; double fract; lineCompare(samplesPerLine,0,toIdx,lnbr,fract); syncArray[toIdx].length=syncArray[toIdx].end-syncArray[fromIdx].end; syncArray[toIdx].lineNumber=lnbr; lastUpdatedSync=toIdx; } void syncProcessor::checkSyncArray() { if(syncArray[syncArrayIndex].retrace) { syncArray[0]=syncArray[syncArrayIndex]; syncArrayIndex=0; // syncPosition=syncArray[0].end + FILTERDELAYCORRECTION; addToLog(QString("Found retrace: start:%1 end:%2 width %3").arg(syncArray[0].start).arg(syncArray[0].end).arg(syncArray[0].end-syncArray[0].start),LOGSYNCACCEPTED); if(syncProcesState==INSYNC) { retraceFlag=true; syncProcesState=RETRACEWAIT; } } if(syncArrayIndex>=(MAXSYNCENTRIES-1)) { //shift syncArray dropTop(); } addToLog(QString("Found sync: start:%1 end:%2 width %3 at %4").arg(syncArray[syncArrayIndex].start).arg(syncArray[syncArrayIndex].end).arg(syncArray[syncArrayIndex].end-syncArray[syncArrayIndex].start).arg(syncArrayIndex),LOGSYNCACCEPTED); } bool syncProcessor::findMatch() { int i,j,k,m; int fs; uint minTotLines=9999; double minFract=1; int idx=-1; QList changeList; QList modeList; QList totalLinesList; QList totalFractList; addToLog (QString(" checking match for syncArrayIndex %1 at %2").arg(syncArrayIndex).arg(syncArray[syncArrayIndex].end),LOGSYNCMATCH); for(i=idxStart;i<=idxEnd;i++) { syncWidth=getSyncWidth((esstvMode)i ,modifiedClock); if(addToMatch((esstvMode)i)) { for(j=0;jcount()>=(int)minMatchedLines) { changeList.append(matchArray[i][j]); modeList.append(i); } } } } for (m=0;m=totalLinesList.at(m)) && (totalFractList.at(m)<=minFract)) { idx=m; minTotLines=totalLinesList.at(m); minFract=totalFractList.at(m); } } if(idx>=0) { currentMode=(esstvMode)modeList.at(idx); activeChainPtr=changeList.at(idx); samplesPerLine=getLineLength(currentMode,modifiedClock); fs=0; for(k=0;kcount()-1;k++) { fs+=activeChainPtr->at(k)->to-activeChainPtr->at(k)->from-1; } if (fs>20) { clearMatchArray(); return false; } cleanupMatchArray(); return true; } return false; } uint syncProcessor::calcTotalLines(modeMatchList *mlPtr) { int i; uint lines=0; for(i=0;icount();i++) { lines+=mlPtr->at(i)->lineSpacing; } return lines; } double syncProcessor::calcTotalFract(modeMatchList *mlPtr) { int i; double fract=0; for(i=0;icount();i++) { fract+=mlPtr->at(i)->fraction; } return fract; } bool syncProcessor::addToMatch(esstvMode mode) { int i; if(syncArrayIndex<1) return false; for(i=syncArrayIndex-1;i>=0;i--) { if(addToChain(mode,i)) { return true; } } return false; } bool syncProcessor::addToChain(esstvMode mode, uint fromIdx) { int i; double fract; quint16 lnbr; samplesPerLine=getLineLength(mode,modifiedClock); if(!lineCompare(samplesPerLine,fromIdx,syncArrayIndex,lnbr,fract)) { return false; } if((syncArray[syncArrayIndex].diffStartEnd()syncWidth*2) || (syncArray[fromIdx].diffStartEnd()syncWidth*2) { if(fromIdx!=0 || !syncArray[0].retrace) { return false; } } if(syncProcesState==MODEDETECT) { if(lnbr>sensitivityArray[squelch].maxLineDistanceModeDetect) { return false; } } bool found=false; if(matchArray[mode].count()==0) // we don't have a chain yet { matchArray[mode].append(new modeMatchList); matchArray[mode][0]->append(new smatchEntry(fromIdx,syncArrayIndex,lnbr,fract,syncArray[fromIdx].end,syncArray[syncArrayIndex].end)); addToLog(QString("Match: mode=%1,new chain=%2 syncIndex=%3 end=%4").arg(getSSTVModeNameShort(mode)).arg(matchArray[mode].count()-1).arg(syncArrayIndex).arg(syncArray[syncArrayIndex].end),LOGSYNCMATCH); } else { // can we append this to an existing chain? for(i=0;ilast()->to==fromIdx) { if((syncProcesState==INSYNC) && (i==0) ) { currentModeMatchChanged=true; } matchArray[mode][i]->append(new smatchEntry(fromIdx,syncArrayIndex,lnbr,fract,syncArray[fromIdx].end,syncArray[syncArrayIndex].end)); addToLog(QString("Match: mode=%1,chain=%2 syncIndex=%3 end=%4").arg(getSSTVModeNameShort(mode)).arg(i).arg(syncArrayIndex).arg(syncArray[syncArrayIndex].end),LOGSYNCMATCH); found=true; break; } } if(!found) { matchArray[mode].append(new modeMatchList); matchArray[mode].last()->append(new smatchEntry(fromIdx,syncArrayIndex,lnbr,fract,syncArray[fromIdx].end,syncArray[syncArrayIndex].end)); addToLog(QString("Match: mode=%1,new chain=%2 syncIndex=%3 end=%4").arg(getSSTVModeNameShort(mode)).arg(matchArray[mode].count()-1).arg(syncArrayIndex).arg(syncArray[syncArrayIndex].end),LOGSYNCMATCH); } } return true; } void syncProcessor::clearMatchArray() { int i,j; for(i=idxStart;i<=idxEnd;i++) { for(j=0;jcount();i++) { delete matchArray[mode][chainIdx]->at(i); } matchArray[mode][chainIdx]->clear(); delete matchArray[mode][chainIdx]; matchArray[mode].takeAt(chainIdx); } void syncProcessor::cleanupMatchArray() { int i,j; // double fract=0; // quint16 lnbr=0; for(i=idxStart;i<=idxEnd;i++) { for(j=0;jprepend(new smatchEntry(0,activeChainPtr->at(0)->from ,lnbr,fract,syncArray[0].end,syncArray[activeChainPtr->at(0)->to].end)); // } // } for(i=0;icount();i++) { syncArray[activeChainPtr->at(i)->from].inUse=true; syncArray[activeChainPtr->at(i)->to].inUse=true; } for(i=0;i=syncArrayIndex) return; // delete or adapt the matchArrays for(i=idxStart;i<=idxEnd;i++) //all modes { for(j=0;jcount();) { ml=matchArray[i][j]; if (ml->at(k)->from==entry) { delete matchArray[i][j]->takeAt(k); } else { if(ml->at(k)->from>entry) { ml->at(k)->from--; } if(ml->at(k)->to>entry) { ml->at(k)->to--; } k++; } } if(matchArray[i][j]->count()==0) { delete matchArray[i].takeAt(j); } else { j++; } } } for(i=entry;i<(int)syncArrayIndex;i++) { syncArray[i]=syncArray[i+1]; } syncArrayIndex--; } void syncProcessor::recalculateMatchArray() { } bool syncProcessor::lineCompare(DSPFLOAT samPerLine, int srcIdx, int dstIdx, quint16 &lineNumber, double &fraction) { double delta; double intPart; delta=(double)(syncArray[dstIdx].end-syncArray[srcIdx].end); fraction=modf(delta/samPerLine,&intPart); if(fraction>=0.5) { fraction=(1-fraction); intPart+=1.; } fraction=fraction/intPart; lineNumber=(int)intPart; return (fractioninit(modifiedClock); startImageRXEvent* ce = new startImageRXEvent(QSize(currentModePtr->imagePixels(),currentModePtr->imageLines())); ce->waitFor(&done); QApplication::postEvent(dispatcherPtr, ce); while(!done) { QApplication::processEvents(); } } return (currentMode!=NOTVALID); } void syncProcessor::regression(DSPFLOAT &a,DSPFLOAT &b,bool initial) { /* calculate linear regression formula x=a+by b=sum((x[i]-xm)*(y[i]-ym))/sum((y[i]-ym)*(y[i]-ym)) a=xm-b*ym */ int j; int count=activeChainPtr->count(); falseSlantSync=0; DSPFLOAT sum_x,sum_y,sum_xx,sum_xy; sum_x=sum_y=sum_xx=sum_xy=a=b=0; unsigned int endZero; unsigned int tempCount=0; // if(currentMode==S1 || currentMode==S2) // { // j=1; // endZero=syncArray[1].end-samplesPerLine; // } // else { j=0; endZero=syncArray[0].end; } for(;jat(j)->fraction>0.006)&&(!initial)) { continue; } slantXYArray[tempCount].y=(DSPFLOAT)(syncArray[activeChainPtr->at(j)->to].end-endZero); slantXYArray[tempCount].x= syncArray[activeChainPtr->at(j)->to].lineNumber*samplesPerLine; addToLog(QString("pos: %1, x=%2 y=%3 syncIndex:%4, diff %5").arg(tempCount).arg(slantXYArray[tempCount].x).arg(slantXYArray[tempCount].y).arg(activeChainPtr->at(j)->to).arg(slantXYArray[tempCount].x-slantXYArray[tempCount].y) ,LOGSLANT); if((fabs(slantXYArray[tempCount].x-slantXYArray[tempCount].y)>150.)&&(!initial)) { falseSlantSync++; continue; } sum_x+=slantXYArray[tempCount].x; sum_y+=slantXYArray[tempCount].y; sum_xx+=slantXYArray[tempCount].x*slantXYArray[tempCount].x; sum_xy+=slantXYArray[tempCount].x*slantXYArray[tempCount].y; lastValidSyncCounter=syncArray[activeChainPtr->at(j)->to].end; tempCount++; } b=((tempCount)*sum_xy-(sum_x*sum_y))/((tempCount)*sum_xx-(sum_x*sum_x)); a=sum_y/(tempCount)-(b*sum_x)/(tempCount); } bool syncProcessor::slantAdjust(bool initial) { DSPFLOAT a,b; if ((currentMode>=AVT24) && (currentMode <= AVT94)) return true; if(currentMode==NOTVALID) return true; falseSlantSync=0; if(!initial) { if(syncArray[activeChainPtr->last()->to].lineNumber0.02) || (fabs(a)>100)) return false; } else { if((fabs(1.-b)>0.005) || (fabs(a)>50)) return false; } if (((fabs(1.-b)>0.00001) || (fabs(a)>1) ) && autoSlantAdjust) { newClock=true; modifiedClock*=b; samplesPerLine=getLineLength(currentMode,modifiedClock); //recalculate the samples per line addToLog(QString("new clock accepted: %1 a=%2,b=%3").arg(modifiedClock).arg(a).arg(b),LOGSLANT); syncArray[0].end+=(long)round(a); syncArray[0].start+=(long)round(a); unsigned int syncCorrected; if(syncArray[0].retrace) { syncCorrected=syncArray[0].end; } else { syncCorrected=(syncArray[0].start+syncArray[0].end)/2+getSyncWidth(currentMode,modifiedClock)/2; } syncPosition=currentModePtr->adjustSyncPosition(syncCorrected,syncArray[0].retrace)+FILTERDELAYCORRECTION; // type 2 sync end recalculateMatchArray(); addToLog(QString("slantAdjust: modified syncpos:=%1").arg(syncPosition),LOGSLANT); return true; } return false; } void syncProcessor::switchSyncState(esyncState newState,quint32 sampleCntr) { Q_UNUSED(sampleCntr) if(syncState!=newState) { addToLog(QString("switching from %1 to %2 at %3").arg(syncStateStr[syncState]).arg(syncStateStr[newState]).arg(sampleCntr),LOGSYNCSTATE); syncState=newState; } } void syncProcessor::switchProcessState(esyncProcessState newState) { addToLog(QString("syncProcessState %1 to %2").arg(stateStr[syncProcesState]).arg(stateStr[newState]),LOGSYNCPROCESSSTATE); if((newState==SYNCLOSTFALSESYNC) || (newState==SYNCLOSTNEWMODE)||(newState==SYNCLOSTMISSINGLINES) || (newState==SYNCLOST)) { newState=SYNCLOST; } syncProcesState=newState; } #ifndef QT_NO_DEBUG void syncProcessor::setOffset(unsigned int dataScopeOffset) { xOffset=dataScopeOffset; scopeViewerSyncNarrow->setOffset(xOffset); scopeViewerSyncWide->setOffset(xOffset); } void syncProcessor::clear() { scopeViewerSyncNarrow->clear(); scopeViewerSyncWide->clear(); xOffset=0; scopeViewerSyncNarrow->setOffset(xOffset); scopeViewerSyncWide->setOffset(xOffset); } #endif qsstv_9.2.6/qsstv/sstv/syncprocessor.h0000664000175000017500000001173613203343610016701 0ustar jomajoma#ifndef SYNCPROCESSOR_H #define SYNCPROCESSOR_H #include #include "visfskid.h" #include #include #include "filters.h" #define MAXSYNCENTRIES 2048 #define STATESCALER 100 class modeBase; struct ssenitivity { unsigned int minMatchedLines; unsigned int maxLineDistanceModeDetect; unsigned int maxLineDistanceInSync; DSPFLOAT onVolume; DSPFLOAT offVolume; DSPFLOAT startToMax; // DSPFLOAT minVolume; // DSPFLOAT currentVolumeRatio; // DSPFLOAT switchOff; // unsigned int minMatchedLines; // unsigned int maxSyncsLost; // unsigned int maxLineDistance; // DSPFLOAT prevMaxIntegrator; // DSPFLOAT trackMaxIntegrator; // DSPFLOAT falseSyncs; }; struct ssyncEntry { ssyncEntry() { init(); } void init() { start=0; end=0; startVolume=0; // endVolume=0; // midVolume=0; maxVolume=0; width=0; inUse=false; retrace=false; lineNumber=0; length=0; } int diffStartEnd() { width=end-start; return width; } uint start; uint startVolume; uint end; // uint endVolume; // uint midVolume; uint maxVolume; uint width; bool inUse; bool retrace; uint lineNumber; uint length; }; struct smatchEntry { smatchEntry() { init(); } smatchEntry(uint fromIdx,uint toIdx,uint lineSpace,double fract,uint endFromSample,uint endToSample) { from=fromIdx; to=toIdx; lineSpacing=lineSpace; fraction=fract; endFrom=endFromSample; endTo=endToSample; } void init() { from=0; to=0; lineSpacing=0; fraction=0; endFrom=0; endTo=0; } uint from; uint to; uint lineSpacing; double fraction; uint endFrom; uint endTo; }; struct sslantXY { DSPFLOAT x; DSPFLOAT y; }; typedef QList modeMatchList; typedef QList modeMatchChain; class syncProcessor : public QObject { Q_OBJECT public: // enum esyncState {SYNCOFF,SYNCUP,SYNCSTART,SYNCON,SYNCDOWN,SYNCEND,SYNCVALID}; enum esyncState {SYNCOFF,SYNCACTIVE,SYNCVALID}; enum esyncProcessState {MODEDETECT,INSYNC,SYNCLOSTNEWMODE,SYNCLOSTFALSESYNC,SYNCLOSTMISSINGLINES,SYNCLOST,RETRACEWAIT}; explicit syncProcessor(bool narrow,QObject *parent = 0); ~syncProcessor(); void init(); void reset(); void process(); esyncProcessState getSyncState(quint32 &syncPos) {syncPos=syncPosition; return syncProcesState; } esstvMode getMode() {return currentMode;} void resetRetraceFlag(); bool hasNewClock() { bool nc=newClock; newClock=false; return nc; } void clear(); void recalculateMatchArray(); DSPFLOAT getNewClock() {return modifiedClock;} void setEnabled(bool enable) {enabled=enable;} quint32 sampleCounter; quint32 syncPosition; quint32 lastValidSyncCounter; // DSPFLOAT trackMax; int syncQuality; modeBase *currentModePtr; quint16 *freqPtr; DSPFLOAT *syncVolumePtr; // unsigned int *inputVolumePtr; videoFilter *videoFilterPtr; bool retraceFlag; bool tempOutOfSync; #ifndef QT_NO_DEBUG void setOffset(unsigned int dataScopeOffset); unsigned int xOffset; unsigned int syncStateBuffer[RXSTRIPE]; #endif public slots: void slotNewCall(QString call); void slotVisCodeDetected(int, uint visSampleCounter); signals: void callReceived(QString); private: quint32 maxLineSamples; quint16 syncArrayIndex; ssyncEntry syncArray[MAXSYNCENTRIES]; modeMatchChain matchArray[ENDNARROW+1]; quint16 slantAdjustLine; esstvMode currentMode; esyncState syncState; esyncProcessState syncProcesState; bool newClock; esstvMode idxStart; esstvMode idxEnd; DSPFLOAT modifiedClock; DSPFLOAT samplesPerLine; streamDecoder streamDecode; DSPFLOAT lineTolerance; modeMatchList *activeChainPtr; bool currentModeMatchChanged; uint lastSyncTest; uint lastUpdatedSync; sslantXY slantXYArray[MAXSYNCENTRIES]; esstvMode visMode; void extractSync(); bool validateSync(); bool findMatch(); bool addToMatch(esstvMode mode); bool addToChain(esstvMode mode, uint fromIdx); bool lineCompare(DSPFLOAT samPerLine, int srcIdx, int dstIdx, quint16 &lineNumber, double &fraction); void switchSyncState(esyncState newState, quint32 sampleCntr); void switchProcessState(esyncProcessState newState); uint calcTotalLines(modeMatchList *mlPtr); double calcTotalFract(modeMatchList *mlPtr); void clearMatchArray(); void removeMatchArrayChain(esstvMode mode,int chainIdx); void cleanupMatchArray(); void dropTop(); void deleteSyncArrayEntry(uint entry); bool createModeBase(); void checkSyncArray(); void trackSyncs(); void calcSyncQuality(); void calculateLineNumber(uint fromIdx, uint toIdx); void regression(DSPFLOAT &a, DSPFLOAT &b, bool initial); bool slantAdjust(bool initial); DSPFLOAT syncWidth; // signal quality quint16 falseSlantSync; quint16 unmatchedSyncs; quint16 falseSyncs; quint16 avgLineSpacing; quint16 missingLines; bool detectNarrow; bool enabled; uint minMatchedLines; uint visTimeout; }; #endif // SYNCPROCESSOR_H qsstv_9.2.6/qsstv/sstv/visfskid.cpp0000664000175000017500000003667413203343610016152 0ustar jomajoma#include "visfskid.h" #include const QString fskStateStr[fskIdDecoder::GETID+1]= { "FSKINIT", "WAITS1500", "WAITE1500", "WAITS1900", "WAITE1900", "WAITS2100", "WAITE2100", "GETID" }; const QString visStateStr[visDecoder::GETCODE+1]= { "VISINIT", "WAITS1200", "WAITE1200", "WAITS1900", "WAITE1900", "GETCODE" }; //const QString retraceStateStr[retraceDetector::RETRACEWAITEND+1]= //{ // "RETRACEINIT", // "RETRACESTART", // "RETRACEEND", //}; fskDecoder::fskDecoder() { sampleCounter=0; } bool fskDecoder::waitStartFreq(unsigned int freqL,unsigned int freqH) { if((avgFreq>=freqL) && (avgFreq<=freqH)) { if(avgCounter=freqL) && (avgFreq<=freqH)) { if(avgCountermaxWait) { timeout=true; } else { timeout=false; } return false; } bool fskDecoder::waitEndFreq(unsigned int freqL,unsigned int freqH) { if((avgFreqfreqH)) { if(avgCounter) avgCounter--; else return true; } else { if(avgCounterfreqH)) { if(avgCountermaxWait) { timeout=true; } else { timeout=false; } return false; } void fskDecoder::init() { avgCounter=0; bitCounter=0; code=0; checksum=0; sampleCounter=0; timeoutCounter=0; } fskIdDecoder::fskIdDecoder() { fskState=FSKINIT; } bool fskIdDecoder::assemble(bool reset) { if(reset) { checksum=0; headerFound=false; endFound=false; fskIDStr.clear(); return true; } if(!headerFound) // waiting for start { if(symbol==0x2A) { addToLog("headerFound",LOGFSKID); headerFound=true; return false; } return true; // indicate resync } if(symbol==0x01) { endFound=true; return false; } if(endFound) { if(checksum!=symbol) { fskIDStr.clear(); } emit callReceived(fskIDStr); fskIDStr.clear(); return true; } else { checksum=checksum^symbol; fskIDStr.append(symbol+0x20); addToLog(QString("fskstr %1 %2").arg(fskIDStr).arg(QString::number(symbol,16)),LOGFSKID); if(fskIDStr.length()>9) { fskIDStr.clear(); return true; } } return false; } void fskIdDecoder::reset() { avgCount=FSKAVGCOUNT; switchState(FSKINIT,0); init(); } QString fskIdDecoder::getFSKId() { QString tmp(fskIDStr); fskIDStr.clear(); return tmp; } void fskIdDecoder::switchState(efskState newState,unsigned int i) { Q_UNUSED(i); addToLog(QString("%1 to %2 at samplecounter:%3 syncSamplCntr%4").arg(fskStateStr[fskState]).arg(fskStateStr[newState]).arg(sampleCounter+i).arg(syncSampleCounter+i),LOGFSKID); fskState=newState; } void fskIdDecoder::extract(unsigned int syncSampleCtr, bool narrow) { int i; if(narrow) return; syncSampleCounter=syncSampleCtr; bool timeout; for(i=0;i=FSKMIN1500)) // && ((sampleCounter+i-startSampleCounter)<2*FSKMIN1500)) { switchState(WAITSTART2100,i); timeoutCounter=0; } else switchState(FSKINIT,i); } } break; case WAITSTART2100: if(waitStartFreq(2000,2200,100,timeout)) { switchState(WAITEND2100,i); startSampleCounter=sampleCounter+i; } else if(timeout) { switchState(FSKINIT,i); } break; case WAITEND2100: { if(waitEndFreq(2000,2200)) { if(((sampleCounter+i-startSampleCounter)>=FSKMIN2100) && ((sampleCounter+i-startSampleCounter)<2*FSKMIN2100)) { switchState(WAITSTART1900,i); timeoutCounter=0; } else switchState(FSKINIT,i); } } break; case WAITSTART1900: if(waitStartFreq(1800,2000,50,timeout)) { switchState(WAITEND1900,i); startSampleCounter=sampleCounter+i; } else if(timeout) { switchState(FSKINIT,i); } break; case WAITEND1900: { if((sampleCounter+i-startSampleCounter)>=(FSKBIT/2-avgCount-56)) { switchState(GETID,i); startSampleCounter=sampleCounter+i; assemble(true); bitCounter=0; symbol=0; } } break; case GETID: if((sampleCounter+i-startSampleCounter)>=FSKBIT) { startSampleCounter=sampleCounter+i; symbol>>=1; if(avgFreq<2000) { symbol|=0x20; } addToLog(QString("bit %1, %2 - %3 ").arg(bitCounter).arg(sampleCounter+i).arg(QString::number(symbol,2)),LOGFSKID); bitCounter++; if(bitCounter==6) { if(assemble(false)) { switchState(FSKINIT,i); } bitCounter=0; } } break; } } sampleCounter+=RXSTRIPE; } // VISDECODER // h1 1900 Hz 300 // p1 1200 Hz 10 // h2 1900 Hz 300 // c1 1200 Hz 30 // d0 1100 Hz 30 (1) - 1300 Hz (0) // d1 1100 Hz 30 (1) - 1300 Hz (0) // d2 1100 Hz 30 (1) - 1300 Hz (0) // d3 1100 Hz 30 (1) - 1300 Hz (0) // d4 1100 Hz 30 (1) - 1300 Hz (0) // d5 1100 Hz 30 (1) - 1300 Hz (0) // d6 1100 Hz 30 (1) - 1300 Hz (0) // d7 1100 Hz 30 (1) - 1300 Hz (0) // c2 1200 Hz 30 visDecoder::visDecoder() { visState=VISINIT; } void visDecoder::reset() { avgCount=VISAVGCOUNT; switchState(VISINIT,0); init(); } uint visDecoder::getCode() { return code; } void visDecoder::switchState(evisState newState,unsigned int i) { Q_UNUSED(i); addToLog(QString("%1 to %2 at samplecounter:%3 samplecounter%4").arg(visStateStr[visState]).arg(visStateStr[newState]).arg(sampleCounter+i).arg(sampleCounter+i),LOGVISCODE); visState=newState; } void visDecoder::extract(unsigned int syncSampleCtr, bool narrow) { syncSampleCounter=syncSampleCtr; if (narrow) extractNarrow(); else extractWide(); } void visDecoder::extractNarrow() { int i; unsigned int syncTemp; Q_UNUSED(syncTemp); bool timeout=false; for(i=0;i=VISMIN1900) && ((sampleCounter+i-startSampleCounter)<2*VISMIN1900)) { switchState(WAITSTART2100,i); } else switchState(VISINIT,i); } } break; case WAITSTART2100: if(waitStartFreq(2000,2200,50,timeout)) { switchState(WAITEND2100,i); startSampleCounter=sampleCounter+i; } else if(timeout) { switchState(VISINIT,i); } break; case WAITEND2100: if(waitEndFreq(2000,2200,1250,timeout)) { switchState(WAITSTARTBIT,i); startSampleCounter=sampleCounter+i; } else if(timeout) { switchState(VISINIT,i); } break; case WAITSTARTBIT: if(waitEndFreq(1800,2000,VISBITNARROW/2,timeout)) { switchState(VISINIT,i); // too short } if (timeout) { validCode=false; switchState(GETCODE,i); startSampleCounter=sampleCounter+i; bitCounter=0; bit=1; symbol=0; } break; case GETCODE: if((sampleCounter+i-startSampleCounter)>=VISBITNARROW) { startSampleCounter=sampleCounter+i; if(avgFreq<2000) { symbol|=bit; //24 bits } addToLog(QString("bit %1, %2 - %3 ").arg(bitCounter).arg(syncSampleCounter+i).arg(QString::number(symbol,2)),LOGFSKID); bitCounter++; bit<<=1; if(bitCounter==24) { // check for validity if((symbol&0xFFF)!=0x56D) { validCode=false; } else { quint8 NVIS =((symbol>>12)&0x3F); quint8 XNVIS=((symbol>>18)&0x3F); if((NVIS^0x15)!=XNVIS) { validCode=false; } else { validCode=true; if((mode=lookupVIS(symbol))!=NOTVALID) { emit visCodeNarrowDetected((int)mode,syncSampleCounter+i); } } switchState(VISINIT,i); } } addToLog(QString("bit %1, %2 - %3 ").arg(bitCounter).arg(syncSampleCounter+i).arg(QString::number(symbol,2)),LOGFSKID); } break; default: switchState(VISINIT,i); break; } } sampleCounter+=RXSTRIPE; } void visDecoder::extractWide() { int i; bool timeout=false; for(i=0;i=VISMIN1900) && ((sampleCounter+i-startSampleCounter)<2*VISMIN1900)) { addToLog(QString("end1900 at %1").arg(syncSampleCounter+i),LOGVISCODE); switchState(WAITSTART1200,i); timeoutCounter=0; } else switchState(VISINIT,i); } } break; case WAITSTART1200: if(waitStartFreq(1100,1300,50,timeout)) { addToLog(QString("start1200 at %1").arg(syncSampleCounter+i),LOGVISCODE); switchState(WAITEND1200,i); startSampleCounter=sampleCounter+i; timeoutCounter=0; } else if(timeout) { switchState(VISINIT,i); } break; case WAITEND1200: { if(waitEndFreq(1100,1300,VISBITWIDE/2-50,timeout)) { switchState(VISINIT,i); // too short } if (timeout) { validCode=false; switchState(GETCODE,i); startSampleCounter=sampleCounter+i; addToLog(QString("startbit at %1").arg(syncSampleCounter+i),LOGVISCODE); bitCounter=0; bit=1; symbol=0; } } break; case GETCODE: if((sampleCounter+i-startSampleCounter)>=VISBITWIDE) { if(avgFreq>1400) { //end of VIS detected validCode=true; addToLog(QString("end bits at %1").arg(syncSampleCounter+i),LOGVISCODE); if (bitCounter<=11) { symbol&=0xFF; } else { symbol&=0xFFFF; } // check for validity if((mode=lookupVIS(symbol))!=NOTVALID) { emit visCodeWideDetected((int)mode,syncSampleCounter+i); } switchState(VISINIT,i); } else { startSampleCounter=sampleCounter+i; // symbol>>=1; if(avgFreq<1200) { symbol|=bit; //16 bits } addToLog(QString("bit %1, %2 - %3 ").arg(bitCounter).arg(syncSampleCounter+i).arg(QString::number(symbol,2)),LOGVISCODE); bitCounter++; bit<<=1; } } break; default: switchState(VISINIT,i); break; } } sampleCounter+=RXSTRIPE; } streamDecoder::streamDecoder(bool narrow) { fskCoder.setDataPtr(avgBuffer); visCoder.setDataPtr(avgBuffer); // retracer.setDataPtr(avgBuffer); isNarrow=narrow; } void streamDecoder::reset() { avgFreq=0; fskCoder.reset(); visCoder.reset(); // retracer.reset(); } void streamDecoder::process(quint16 *freqPtr , unsigned int syncSampleCtr) { int i; for(i=0;i #include "sstvparam.h" #define FSKMIN1500 ((SAMPLERATE*100)/1000) #define FSKMIN2100 ((SAMPLERATE*70)/1000) #define FSKMIN1900 ((SAMPLERATE*18)/1000) #define FSKBIT ((SAMPLERATE*22)/1000) #define FSKAVGCOUNT 25 #define VISAVGCOUNT 25 #define RETRACEAVGCOUNT 100 #define FREQAVG 0.05 #define VISMIN1900 ((SAMPLERATE*200)/1000) #define VISMINWIDE1200 ((SAMPLERATE*25)/1000) #define VISBITWIDE ((SAMPLERATE*30)/1000) #define VISMINNARROW2100 ((SAMPLERATE*80)/1000) #define VISBITNARROW ((SAMPLERATE*22)/1000) #define MINRETRACEWIDTH ((SAMPLERATE*290)/1000) class fskDecoder : public QObject { Q_OBJECT public: fskDecoder(); virtual void extract(unsigned int syncSampleCtr, bool narrow)=0; void setDataPtr(DSPFLOAT *dataPtr) {freqPtr=dataPtr;} virtual void reset()=0; protected: unsigned char bitCounter; quint32 symbol; quint32 bit; unsigned char checksum; unsigned int code; unsigned int sampleCounter; unsigned int startSampleCounter; unsigned int syncSampleCounter; unsigned int timeoutCounter; bool validCode; DSPFLOAT *freqPtr; DSPFLOAT avgFreq; uint avgCounter; uint avgCount; unsigned int count1500; unsigned int count2100; unsigned int count1900; bool waitStartFreq(unsigned int freqL, unsigned int freqH); bool waitEndFreq(unsigned int freqL,unsigned int freqH); bool waitStartFreq(unsigned int freqL,unsigned int freqH,unsigned long maxWait,bool &timeout); bool waitEndFreq(unsigned int freqL, unsigned int freqH, unsigned long maxWait, bool &timeout); void init(); }; class fskIdDecoder : public fskDecoder { Q_OBJECT public: enum efskState {FSKINIT,WAITSTART1500,WAITEND1500,WAITSTART1900,WAITEND1900,WAITSTART2100,WAITEND2100,GETID}; fskIdDecoder(); void extract(unsigned int syncSampleCtr, bool narrow); void reset(); QString getFSKId(); signals: void callReceived(QString); private: void switchState(efskState newState, unsigned int i); bool assemble(bool reset); unsigned int fskIDChar; QString fskStr; unsigned int fskAVGCounter; QString fskIDStr; bool headerFound; bool endFound; efskState fskState; }; class visDecoder : public fskDecoder { Q_OBJECT public: enum evisState {VISINIT,WAITSTART1200,WAITEND1200,WAITSTART1900,WAITEND1900,WAITSTART2100,WAITEND2100,WAITSTARTBIT,GETCODE}; visDecoder(); void extract(unsigned int syncSampleCtr, bool narrow); void extractNarrow(); void extractWide(); void reset(); uint getCode(); esstvMode mode; signals: void visCodeNarrowDetected(int,uint); void visCodeWideDetected(int,uint ); private: void switchState(evisState newState, unsigned int i); evisState visState; }; //class retraceDetector: public fskDecoder //{ //public: // retraceDetector(); // enum eretraceState {RETRACEINIT,RETRACEWAITSTART,RETRACEWAITEND}; // void extract(unsigned int syncSampleCtr); // void reset(); //private: // void switchState(eretraceState newState, unsigned int i); // eretraceState retraceState; //}; class streamDecoder { public: streamDecoder(bool narrow); void reset(); void process(quint16 *freqPtr, unsigned int syncSampleCtr); uint getVisCode() {return visCoder.getCode();} fskIdDecoder *getFskDecoderPtr() {return &fskCoder;} visDecoder *getVisDecoderPtr() {return &visCoder;} private: DSPFLOAT avgFreq; DSPFLOAT avgBuffer[RXSTRIPE]; fskIdDecoder fskCoder; visDecoder visCoder; // retraceDetector retracer; quint16 freqPtr(); bool isNarrow; }; #endif // VISFSKID_H qsstv_9.2.6/qsstv/utils/arraydumper.cpp0000664000175000017500000001224413203343610017007 0ustar jomajoma#include "arraydumper.h" #include "appglobal.h" void arrayDump(QString label,short int *data, unsigned int len,bool toAux,bool singleColumn) { unsigned int i,j; QString dumpStr,tmp; if(!singleColumn) { for( i=0;iaddToAux(dumpStr); } else { addToLog(dumpStr,LOGALL); } } } else { dumpStr=label+" "; if(toAux) logFilePtr->addToAux(dumpStr); else addToLog(dumpStr,LOGALL); for(i=0;iaddToAux(tmp); else addToLog(tmp,LOGALL); } } } void arrayDump(QString label,int *data, unsigned int len,bool toAux) { unsigned int i,j; QString dumpStr,tmp; for( i=0;iaddToAux(dumpStr); } else { addToLog(dumpStr,LOGALL); } } } void arrayDump(QString label,quint16 *data, unsigned int len,bool inHex,bool toAux) { unsigned int i,j; QString dumpStr,tmp; for( i=0;iaddToAux(dumpStr); } else { addToLog(dumpStr,LOGALL); } } } void arrayDump(QString label, quint32* data, unsigned int len,bool inHex, bool toAux) { unsigned int i,j; QString dumpStr,tmp; for( i=0;iaddToAux(dumpStr); } else { addToLog(dumpStr,LOGALL); } } } void arrayDump(QString label, float *data, unsigned int len, bool toAux, bool singleColumn) { unsigned int i,j; QString dumpStr,tmp; if(!singleColumn) { for( i=0;iaddToAux(dumpStr); } else { addToLog(dumpStr,LOGALL); } } } else { dumpStr=label+" "; if(toAux) logFilePtr->addToAux(dumpStr); else addToLog(dumpStr,LOGALL); for(i=0;iaddToAux(tmp); else addToLog(tmp,LOGALL); } } } //void arrayComplexDump(QString label,CVectorEx<_COMPLEX> data,unsigned int len,bool toAux) //{ // CVectorEx<_COMPLEX> vct=data; // _COMPLEX c; // unsigned int i,j; //// unsigned int len; //// len=vct.Size()/8; // QString dumpStr,tmp; // for( i=0;iaddToAux(dumpStr); // } // else // { // addToLog(dumpStr,LOGALL); // } // } //} //void arrayBinDump(QString label,CVector<_BINARY> data,unsigned int len,bool toAux) //{ // CVector<_BINARY> vct=data; // unsigned int i,j; //// unsigned int len; //// len=vct.Size()/8; // QString dumpStr,tmp; // for( i=0;iaddToAux(dumpStr); // } // else // { // addToLog(dumpStr,LOGALL); // } // } //} qsstv_9.2.6/qsstv/utils/arraydumper.h0000664000175000017500000000133013203343610016446 0ustar jomajoma#ifndef ARRAYDUMPER_H #define ARRAYDUMPER_H #include //#include "vector.h" void arrayDump(QString label, short int *data, unsigned int len, bool toAux, bool singleColumn); void arrayDump(QString label,quint16 *data, unsigned int len,bool inHex,bool toAux); void arrayDump(QString label, int *data, unsigned int len, bool toAux); void arrayDump(QString label, float *data, unsigned int len, bool toAux, bool singleColumn); void arrayDump(QString label, quint32 *data, unsigned int len, bool inHex, bool toAux); //void arrayBinDump(QString label, CVector<_BINARY> data, unsigned int len, bool toAux); //void arrayComplexDump(QString label,CVectorEx<_COMPLEX> data,unsigned int len,bool toAux); #endif // ARRAYDUMPER_H qsstv_9.2.6/qsstv/utils/buffermanag.h0000664000175000017500000001177413203343610016405 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef BUFFERMANAG_H #define BUFFERMANAG_H #include #include #include "appglobal.h" #include template class buffer { public: buffer() { memblock=new T[1<count()) { mutex.unlock(); return false; } for(i=0;ispaceLeft()) { mutex.unlock(); return false; } // addToLog(QString("writing %1").arg(len),LOGSOUND); for(i=0;icount()) { mutex.unlock(); return false; } readIndex+=s; readIndex&= ((1<spaceLeft()) { mutex.unlock(); return false; } readIndex-=s; readIndex&= ((1< #include #include #include #include #include "openjpeg.h" #include "color.h" /*-------------------------------------------------------- Matrix for sYCC, Amendment 1 to IEC 61966-2-1 Y : 0.299 0.587 0.114 :R Cb: -0.1687 -0.3312 0.5 :G Cr: 0.5 -0.4187 -0.0812 :B Inverse: R: 1 -3.68213e-05 1.40199 :Y G: 1.00003 -0.344125 -0.714128 :Cb - 2^(prec - 1) B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1) -----------------------------------------------------------*/ static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr, int *out_r, int *out_g, int *out_b) { int r, g, b; cb -= offset; cr -= offset; r = y + (int)(1.402 * (float)cr); if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r; g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr); if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g; b = y + (int)(1.772 * (float)cb); if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b; } static void sycc444_to_rgb(opj_image_t *img) { int *d0, *d1, *d2, *r, *g, *b; const int *y, *cb, *cr; unsigned int maxw, maxh, max, i; int offset, upb; upb = (int)img->comps[0].prec; offset = 1<<(upb - 1); upb = (1<comps[0].w; maxh = (unsigned int)img->comps[0].h; max = maxw * maxh; y = img->comps[0].data; cb = img->comps[1].data; cr = img->comps[2].data; d0 = r = (int*)malloc(sizeof(int) * (size_t)max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max); for(i = 0U; i < max; ++i) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++cb; ++cr; ++r; ++g; ++b; } free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[2].data); img->comps[2].data = d2; }/* sycc444_to_rgb() */ static void sycc422_to_rgb(opj_image_t *img) { int *d0, *d1, *d2, *r, *g, *b; const int *y, *cb, *cr; unsigned int maxw, maxh, max; int offset, upb; unsigned int i, j; upb = (int)img->comps[0].prec; offset = 1<<(upb - 1); upb = (1<comps[0].w; maxh = (unsigned int)img->comps[0].h; max = maxw * maxh; y = img->comps[0].data; cb = img->comps[1].data; cr = img->comps[2].data; d0 = r = (int*)malloc(sizeof(int) * (size_t)max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max); for(i=0U; i < maxh; ++i) { for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } if (j < maxw) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } } free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[2].data); img->comps[2].data = d2; #if defined(USE_JPWL) || defined(USE_MJ2) img->comps[1].w = maxw; img->comps[1].h = maxh; img->comps[2].w = maxw; img->comps[2].h = maxh; #else img->comps[1].w = (OPJ_UINT32)maxw; img->comps[1].h = (OPJ_UINT32)maxh; img->comps[2].w = (OPJ_UINT32)maxw; img->comps[2].h = (OPJ_UINT32)maxh; #endif img->comps[1].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx; img->comps[1].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy; }/* sycc422_to_rgb() */ static void sycc420_to_rgb(opj_image_t *img) { int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; const int *y, *cb, *cr, *ny; unsigned int maxw, maxh, max; int offset, upb; unsigned int i, j; upb = (int)img->comps[0].prec; offset = 1<<(upb - 1); upb = (1<comps[0].w; maxh = (unsigned int)img->comps[0].h; max = maxw * maxh; y = img->comps[0].data; cb = img->comps[1].data; cr = img->comps[2].data; d0 = r = (int*)malloc(sizeof(int) * (size_t)max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max); for(i=0U; i < (maxh & ~(unsigned int)1U); i += 2U) { ny = y + maxw; nr = r + maxw; ng = g + maxw; nb = b + maxw; for(j=0; j < (maxw & ~(unsigned int)1U); j += 2U) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; } if(j < maxw) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; } y += maxw; r += maxw; g += maxw; b += maxw; } if(i < maxh) { for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } if(j < maxw) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); } } free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[2].data); img->comps[2].data = d2; #if defined(USE_JPWL) || defined(USE_MJ2) img->comps[1].w = maxw; img->comps[1].h = maxh; img->comps[2].w = maxw; img->comps[2].h = maxh; #else img->comps[1].w = (OPJ_UINT32)maxw; img->comps[1].h = (OPJ_UINT32)maxh; img->comps[2].w = (OPJ_UINT32)maxw; img->comps[2].h = (OPJ_UINT32)maxh; #endif img->comps[1].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx; img->comps[1].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy; }/* sycc420_to_rgb() */ void color_sycc_to_rgb(opj_image_t *img) { if(img->numcomps < 3) { img->color_space = OPJ_CLRSPC_GRAY; return; } if((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && (img->comps[2].dx == 2) && (img->comps[0].dy == 1) && (img->comps[1].dy == 2) && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */ { sycc420_to_rgb(img); } else if((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && (img->comps[2].dx == 2) && (img->comps[0].dy == 1) && (img->comps[1].dy == 1) && (img->comps[2].dy == 1))/* horizontal sub-sample only */ { sycc422_to_rgb(img); } else if((img->comps[0].dx == 1) && (img->comps[1].dx == 1) && (img->comps[2].dx == 1) && (img->comps[0].dy == 1) && (img->comps[1].dy == 1) && (img->comps[2].dy == 1))/* no sub-sample */ { sycc444_to_rgb(img); } else { fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__); return; } img->color_space = OPJ_CLRSPC_SRGB; }/* color_sycc_to_rgb() */ #if defined(OPJ_HAVE_LIBLCMS2) || defined(OPJ_HAVE_LIBLCMS1) #ifdef OPJ_HAVE_LIBLCMS1 /* Bob Friesenhahn proposed:*/ #define cmsSigXYZData icSigXYZData #define cmsSigLabData icSigLabData #define cmsSigCmykData icSigCmykData #define cmsSigYCbCrData icSigYCbCrData #define cmsSigLuvData icSigLuvData #define cmsSigGrayData icSigGrayData #define cmsSigRgbData icSigRgbData #define cmsUInt32Number DWORD #define cmsColorSpaceSignature icColorSpaceSignature #define cmsGetHeaderRenderingIntent cmsTakeRenderingIntent #endif /* OPJ_HAVE_LIBLCMS1 */ /*#define DEBUG_PROFILE*/ void color_apply_icc_profile(opj_image_t *image) { cmsHPROFILE in_prof, out_prof; cmsHTRANSFORM transform; cmsColorSpaceSignature in_space, out_space; cmsUInt32Number intent, in_type, out_type, nr_samples; int *r, *g, *b; int prec, i, max, max_w, max_h; OPJ_COLOR_SPACE oldspace; in_prof = cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); #ifdef DEBUG_PROFILE FILE *icm = fopen("debug.icm","wb"); fwrite( image->icc_profile_buf,1, image->icc_profile_len,icm); fclose(icm); #endif if(in_prof == NULL) return; in_space = cmsGetPCS(in_prof); out_space = cmsGetColorSpace(in_prof); intent = cmsGetHeaderRenderingIntent(in_prof); max_w = (int)image->comps[0].w; max_h = (int)image->comps[0].h; prec = (int)image->comps[0].prec; oldspace = image->color_space; if(out_space == cmsSigRgbData) /* enumCS 16 */ { if( prec <= 8 ) { in_type = TYPE_RGB_8; out_type = TYPE_RGB_8; } else { in_type = TYPE_RGB_16; out_type = TYPE_RGB_16; } out_prof = cmsCreate_sRGBProfile(); image->color_space = OPJ_CLRSPC_SRGB; } else if(out_space == cmsSigGrayData) /* enumCS 17 */ { in_type = TYPE_GRAY_8; out_type = TYPE_RGB_8; out_prof = cmsCreate_sRGBProfile(); image->color_space = OPJ_CLRSPC_SRGB; } else if(out_space == cmsSigYCbCrData) /* enumCS 18 */ { in_type = TYPE_YCbCr_16; out_type = TYPE_RGB_16; out_prof = cmsCreate_sRGBProfile(); image->color_space = OPJ_CLRSPC_SRGB; } else { #ifdef DEBUG_PROFILE fprintf(stderr,"%s:%d: color_apply_icc_profile\n\tICC Profile has unknown " "output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n", __FILE__,__LINE__,out_space, (out_space>>24) & 0xff,(out_space>>16) & 0xff, (out_space>>8) & 0xff, out_space & 0xff); #endif return; } #ifdef DEBUG_PROFILE fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)" "\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec, max_w,max_h, (void*)in_prof,(void*)out_prof); fprintf(stderr,"\trender_intent (%u)\n\t" "color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t" " type: in(%u) out:(%u)\n", intent, in_space, (in_space>>24) & 0xff,(in_space>>16) & 0xff, (in_space>>8) & 0xff, in_space & 0xff, out_space, (out_space>>24) & 0xff,(out_space>>16) & 0xff, (out_space>>8) & 0xff, out_space & 0xff, in_type,out_type ); #else (void)prec; (void)in_space; #endif /* DEBUG_PROFILE */ transform = cmsCreateTransform(in_prof, in_type, out_prof, out_type, intent, 0); #ifdef OPJ_HAVE_LIBLCMS2 /* Possible for: LCMS_VERSION >= 2000 :*/ cmsCloseProfile(in_prof); cmsCloseProfile(out_prof); #endif if(transform == NULL) { #ifdef DEBUG_PROFILE fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. " "ICC Profile ignored.\n",__FILE__,__LINE__); #endif image->color_space = oldspace; #ifdef OPJ_HAVE_LIBLCMS1 cmsCloseProfile(in_prof); cmsCloseProfile(out_prof); #endif return; } if(image->numcomps > 2)/* RGB, RGBA */ { if( prec <= 8 ) { unsigned char *inbuf, *outbuf, *in, *out; max = max_w * max_h; nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char); in = inbuf = (unsigned char*)malloc(nr_samples); out = outbuf = (unsigned char*)malloc(nr_samples); r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; for(i = 0; i < max; ++i) { *in++ = (unsigned char)*r++; *in++ = (unsigned char)*g++; *in++ = (unsigned char)*b++; } cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; for(i = 0; i < max; ++i) { *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++; } free(inbuf); free(outbuf); } else { unsigned short *inbuf, *outbuf, *in, *out; max = max_w * max_h; nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short); in = inbuf = (unsigned short*)malloc(nr_samples); out = outbuf = (unsigned short*)malloc(nr_samples); r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; for(i = 0; i < max; ++i) { *in++ = (unsigned short)*r++; *in++ = (unsigned short)*g++; *in++ = (unsigned short)*b++; } cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; for(i = 0; i < max; ++i) { *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++; } free(inbuf); free(outbuf); } } else /* GRAY, GRAYA */ { unsigned char *in, *inbuf, *out, *outbuf; max = max_w * max_h; nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char); in = inbuf = (unsigned char*)malloc(nr_samples); out = outbuf = (unsigned char*)malloc(nr_samples); image->comps = (opj_image_comp_t*) realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t)); if(image->numcomps == 2) image->comps[3] = image->comps[1]; image->comps[1] = image->comps[0]; image->comps[2] = image->comps[0]; image->comps[1].data = (int*)calloc((size_t)max, sizeof(int)); image->comps[2].data = (int*)calloc((size_t)max, sizeof(int)); image->numcomps += 2; r = image->comps[0].data; for(i = 0; i < max; ++i) { *in++ = (unsigned char)*r++; } cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; for(i = 0; i < max; ++i) { *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++; } free(inbuf); free(outbuf); }/* if(image->numcomps */ cmsDeleteTransform(transform); #ifdef OPJ_HAVE_LIBLCMS1 cmsCloseProfile(in_prof); cmsCloseProfile(out_prof); #endif }/* color_apply_icc_profile() */ void color_cielab_to_rgb(opj_image_t *image) { int *row; int enumcs, numcomps; image->color_space = OPJ_CLRSPC_SRGB; numcomps = (int)image->numcomps; if(numcomps != 3) { fprintf(stderr,"%s:%d:\n\tnumcomps %d not handled. Quitting.\n", __FILE__,__LINE__,numcomps); return; } row = (int*)image->icc_profile_buf; enumcs = row[0]; if(enumcs == 14) /* CIELab */ { int *L, *a, *b, *red, *green, *blue; int *src0, *src1, *src2, *dst0, *dst1, *dst2; double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; double minL, maxL, mina, maxa, minb, maxb; unsigned int default_type; unsigned int i, max; cmsHPROFILE in, out; cmsHTRANSFORM transform; cmsUInt16Number RGB[3]; cmsCIELab Lab; in = cmsCreateLab4Profile(NULL); out = cmsCreate_sRGBProfile(); transform = cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); #ifdef OPJ_HAVE_LIBLCMS2 cmsCloseProfile(in); cmsCloseProfile(out); #endif if(transform == NULL) { #ifdef OPJ_HAVE_LIBLCMS1 cmsCloseProfile(in); cmsCloseProfile(out); #endif return; } prec0 = (double)image->comps[0].prec; prec1 = (double)image->comps[1].prec; prec2 = (double)image->comps[2].prec; default_type = (unsigned int)row[1]; if(default_type == 0x44454600)/* DEF : default */ { rl = 100; ra = 170; rb = 200; ol = 0; oa = pow(2, prec1 - 1); ob = pow(2, prec2 - 2) + pow(2, prec2 - 3); } else { rl = row[2]; ra = row[4]; rb = row[6]; ol = row[3]; oa = row[5]; ob = row[7]; } L = src0 = image->comps[0].data; a = src1 = image->comps[1].data; b = src2 = image->comps[2].data; max = image->comps[0].w * image->comps[0].h; red = dst0 = (int*)malloc(max * sizeof(int)); green = dst1 = (int*)malloc(max * sizeof(int)); blue = dst2 = (int*)malloc(max * sizeof(int)); minL = -(rl * ol)/(pow(2, prec0)-1); maxL = minL + rl; mina = -(ra * oa)/(pow(2, prec1)-1); maxa = mina + ra; minb = -(rb * ob)/(pow(2, prec2)-1); maxb = minb + rb; for(i = 0; i < max; ++i) { Lab.L = minL + (double)(*L) * (maxL - minL)/(pow(2, prec0)-1); ++L; Lab.a = mina + (double)(*a) * (maxa - mina)/(pow(2, prec1)-1); ++a; Lab.b = minb + (double)(*b) * (maxb - minb)/(pow(2, prec2)-1); ++b; cmsDoTransform(transform, &Lab, RGB, 1); *red++ = RGB[0]; *green++ = RGB[1]; *blue++ = RGB[2]; } cmsDeleteTransform(transform); #ifdef OPJ_HAVE_LIBLCMS1 cmsCloseProfile(in); cmsCloseProfile(out); #endif free(src0); image->comps[0].data = dst0; free(src1); image->comps[1].data = dst1; free(src2); image->comps[2].data = dst2; image->color_space = OPJ_CLRSPC_SRGB; image->comps[0].prec = 16; image->comps[1].prec = 16; image->comps[2].prec = 16; return; } fprintf(stderr,"%s:%d:\n\tenumCS %d not handled. Ignoring.\n", __FILE__,__LINE__, enumcs); }/* color_apply_conversion() */ #endif /* OPJ_HAVE_LIBLCMS2 || OPJ_HAVE_LIBLCMS1 */ void color_cmyk_to_rgb(opj_image_t *image) { float C, M, Y, K; float sC, sM, sY, sK; unsigned int w, h, max, i; w = image->comps[0].w; h = image->comps[0].h; if(image->numcomps < 4) return; max = w * h; sC = 1.0F / (float)((1 << image->comps[0].prec) - 1); sM = 1.0F / (float)((1 << image->comps[1].prec) - 1); sY = 1.0F / (float)((1 << image->comps[2].prec) - 1); sK = 1.0F / (float)((1 << image->comps[3].prec) - 1); for(i = 0; i < max; ++i) { /* CMYK values from 0 to 1 */ C = (float)(image->comps[0].data[i]) * sC; M = (float)(image->comps[1].data[i]) * sM; Y = (float)(image->comps[2].data[i]) * sY; K = (float)(image->comps[3].data[i]) * sK; /* Invert all CMYK values */ C = 1.0F - C; M = 1.0F - M; Y = 1.0F - Y; K = 1.0F - K; /* CMYK -> RGB : RGB results from 0 to 255 */ image->comps[0].data[i] = (int)(255.0F * C * K); /* R */ image->comps[1].data[i] = (int)(255.0F * M * K); /* G */ image->comps[2].data[i] = (int)(255.0F * Y * K); /* B */ } free(image->comps[3].data); image->comps[3].data = NULL; image->comps[0].prec = 8; image->comps[1].prec = 8; image->comps[2].prec = 8; image->numcomps -= 1; image->color_space = OPJ_CLRSPC_SRGB; for (i = 3; i < image->numcomps; ++i) { memcpy(&(image->comps[i]), &(image->comps[i+1]), sizeof(image->comps[i])); } }/* color_cmyk_to_rgb() */ /* * This code has been adopted from sjpx_openjpeg.c of ghostscript */ void color_esycc_to_rgb(opj_image_t *image) { int y, cb, cr, sign1, sign2, val; unsigned int w, h, max, i; int flip_value = (1 << (image->comps[0].prec-1)); int max_value = (1 << image->comps[0].prec) - 1; if(image->numcomps < 3) return; w = image->comps[0].w; h = image->comps[0].h; sign1 = (int)image->comps[1].sgnd; sign2 = (int)image->comps[2].sgnd; max = w * h; for(i = 0; i < max; ++i) { y = image->comps[0].data[i]; cb = image->comps[1].data[i]; cr = image->comps[2].data[i]; if( !sign1) cb -= flip_value; if( !sign2) cr -= flip_value; val = (int) ((float)y - (float)0.0000368 * (float)cb + (float)1.40199 * (float)cr + (float)0.5); if(val > max_value) val = max_value; else if(val < 0) val = 0; image->comps[0].data[i] = val; val = (int) ((float)1.0003 * (float)y - (float)0.344125 * (float)cb - (float)0.7141128 * (float)cr + (float)0.5); if(val > max_value) val = max_value; else if(val < 0) val = 0; image->comps[1].data[i] = val; val = (int) ((float)0.999823 * (float)y + (float)1.77204 * (float)cb - (float)0.000008 *(float)cr + (float)0.5); if(val > max_value) val = max_value; else if(val < 0) val = 0; image->comps[2].data[i] = val; } image->color_space = OPJ_CLRSPC_SRGB; }/* color_esycc_to_rgb() */ qsstv_9.2.6/qsstv/utils/color.h0000664000175000017500000000440613203343610015240 0ustar jomajoma/* * The copyright in this software is being made available under the 2-clauses * BSD License, included below. This software may be subject to other third * party and contributor rights, including patent rights, and no such rights * are granted under this license. * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _OPJ_COLOR_H_ #define _OPJ_COLOR_H_ extern void color_sycc_to_rgb(opj_image_t *img); extern void color_apply_icc_profile(opj_image_t *image); extern void color_cielab_to_rgb(opj_image_t *image); extern void color_cmyk_to_rgb(opj_image_t *image); extern void color_esycc_to_rgb(opj_image_t *image); #endif /* _OPJ_COLOR_H_ */ qsstv_9.2.6/qsstv/utils/dirdialog.cpp0000664000175000017500000000605113203343610016411 0ustar jomajoma#include "dirdialog.h" #include #include static QString lastPath; dirDialog::dirDialog(QWidget * parent,QString title) { parentPtr=parent; dialogTitle=title; } dirDialog::~dirDialog() { } /*! \fn dirDialog::openFileName(const QString &path, const QString &filter, bool single) \brief selection of a file \param path directory to open (preselected) if empty, the last accessed directory will be used \param filter types to select from (e.g. mydirs*) \param single allows selection of more than one file if true \return if canceled or no selection then returns an empty string else return string containing absolute filename */ QString dirDialog::openFileName(const QString &path, const QString &filter) { QString fn; if (path.isEmpty() && lastPath.isEmpty()) { lastPath=QDir::homePath(); } else if (!path.isEmpty()) { lastPath=path; } fn=QFileDialog::getOpenFileName(parentPtr,dialogTitle,lastPath,filter); if(!fn.isEmpty()) { QFileInfo fi(fn); lastPath=fi.absolutePath(); } return fn; } /*! \fn dirDialog::openDirName(const QString &path, const QString &filter) \brief selection of a directory \param path directory to open (preselected) \param filter types to select from (e.g. mydirs*) \return if canceled or no selection then return an empty string else return string containing absolute dirname */ QString dirDialog::openDirName(const QString &path) { QString fn; if ((path.isEmpty()) && lastPath.isEmpty()) { lastPath=QDir::homePath(); } else if (!path.isEmpty()) { lastPath=path; } fn=QFileDialog::getExistingDirectory(parentPtr,dialogTitle,lastPath); if(!fn.isEmpty()) { lastPath=fn; } return fn; } /*! \fn dirDialog::saveFileName(const QString &path, const QString &filter,QString extension) \brief Save a file to disk Saves a file to disk. A dialogbox is opened with \a startWith directory (or /dir/subdir/..../filename) preselected \param path directory to open (can include filename to preselect) \param filter file types to select from (e.g. *.txt *.doc) \param extension if extension is not empty or NULL, thenn this string will be appended to the filename. A dot will automatically be insterted (i.e specify "txt" not ".txt"). \return if canceled or no selection then return an empty string else return string containing absolute filename. */ QString dirDialog::saveFileName(const QString &path, const QString &filter, QString extension) { QString fn; if ((path.isEmpty()) && lastPath.isEmpty()) { lastPath=QDir::currentPath(); } else if (!path.isEmpty()) { lastPath=path; } QString exten(extension); fn=QFileDialog::getSaveFileName(parentPtr,dialogTitle,lastPath,filter); if(fn.isEmpty()) return fn; QFileInfo fi(fn); if(!exten.isEmpty()) { if(fi.suffix()=="") { fi.setFile(fi.absoluteFilePath()+"."+exten); } } lastPath=fi.absolutePath(); return fi.absoluteFilePath(); } qsstv_9.2.6/qsstv/utils/dirdialog.h0000664000175000017500000000072713203343610016062 0ustar jomajoma#ifndef DIRDIALOG_H #define DIRDIALOG_H #include #include class dirDialog { public: dirDialog(QWidget *parent,QString title=""); ~dirDialog(); QString openFileName(const QString &startWith, const QString &filter="*"); QString openDirName(const QString &path); QString saveFileName(const QString &path, const QString &filter,QString extension); private: QWidget * parentPtr; QString dialogTitle; }; #endif // DIRDIALOG_H qsstv_9.2.6/qsstv/utils/fftcalc.cpp0000664000175000017500000000237413203343610016061 0ustar jomajoma#include "fftcalc.h" fftCalc::fftCalc() { plan=NULL; out=NULL; dataBuffer=NULL; } fftCalc::~fftCalc() { if(plan)fftw_destroy_plan(plan); if(out) fftw_free(out); if(dataBuffer) fftw_free(dataBuffer); } void fftCalc::init(int length,int nblocks,int isamplingrate) { windowSize=length; fftLength=windowSize*nblocks; blocks=nblocks; blockIndex=0; createHamming(); samplingrate=isamplingrate; //prepare fft if(plan)fftw_destroy_plan(plan); if(out) fftw_free(out); if(dataBuffer) fftw_free(dataBuffer); out = (double *)fftw_malloc(fftLength * sizeof(double)); dataBuffer = (double *)fftw_malloc(fftLength * sizeof(double)); // create the fftw plan plan = fftw_plan_r2r_1d(fftLength, dataBuffer, out, FFTW_R2HC, FFTW_ESTIMATE); } void fftCalc::createHamming() { int i; hammingBuffer= new double[fftLength]; for(i=0;i #include class fftCalc { public: fftCalc(); ~fftCalc(); void init(int length,int nblocks,int isamplingrate); void realFFT(double *data); double *out; private: void createHamming(); void doFFT(); double *hammingBuffer; double *dataBuffer; int windowSize; int fftLength; int samplingrate; unsigned int blocks; unsigned int blockIndex; fftw_plan plan; }; #endif // FFTCALC_H qsstv_9.2.6/qsstv/utils/filewatcher.cpp0000664000175000017500000000056313203343610016752 0ustar jomajoma#include "filewatcher.h" #include "configparams.h" #include "gallerywidget.h" fileWatcher::fileWatcher() { } void fileWatcher::init() { if(directories().count()>0) { removePaths(directories()); } addPath(txStockImagesPath); addPath(templatesPath); connect(this,SIGNAL(directoryChanged(QString)),galleryWidgetPtr,SLOT(slotDirChanged(QString))); } qsstv_9.2.6/qsstv/utils/filewatcher.h0000664000175000017500000000035413203343610016415 0ustar jomajoma#ifndef FILEWATCHER_H #define FILEWATCHER_H #include #include class fileWatcher : public QFileSystemWatcher { public: fileWatcher(); void init(); signals: public slots: }; #endif // FILEWATCHER_H qsstv_9.2.6/qsstv/utils/ftp.cpp0000664000175000017500000004616513203343610015256 0ustar jomajoma/*************************************************************************** * Copyright (C) 2004 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "ftp.h" #include "appglobal.h" #include "dispatch/dispatcher.h" //#include #include #include "configparams.h" #include #include #include #include #define FTPTIMEOUTTIME 12000 QString commandStr[15]= { "None", "SetTxMode", "SetProxy", "ConnectToHost", "Login", "Close", "List", "Cd", "Get", "Put", "Remove", "Mkdir", "Rmdir", "Rename", "RawCommand" }; ftpInterface::ftpInterface(QString id) { ftp=NULL; addToLog(id, LOGFTP); name=id; sourceFn=NULL; timeoutExpired=false; canCloseWhenDone=false; displayProgress=true; init(); } ftpInterface::~ftpInterface() { addToLog(QString("'%1' FTP destroy in delete").arg(name),LOGFTP); destroy(); if (ftp) delete ftp; } void ftpInterface::init() { destroy(); if(ftp) delete ftp; addToLog(QString("FTP init '%1'").arg(name), LOGFTP); ftp = new QFtp( 0); disconnectTimer.setInterval(FTPTIMEOUTTIME); connect( ftp, SIGNAL(commandStarted(int)),SLOT(ftp_commandStarted(int)) ); connect( ftp, SIGNAL(commandFinished(int,bool)),SLOT(ftp_commandFinished(int,bool)) ); connect( ftp, SIGNAL(done(bool)),SLOT(ftp_done(bool)) ); connect( ftp, SIGNAL(stateChanged(int)),SLOT(ftp_stateChanged(int)) ); connect( ftp, SIGNAL(listInfo(const QUrlInfo &)),SLOT(ftp_listInfo(const QUrlInfo &)) ); connect( ftp, SIGNAL(rawCommandReply(int, const QString &)),SLOT(ftp_rawCommandReply(int, const QString &)) ); connect( ftp, SIGNAL(dataTransferProgress(qint64,qint64)),SLOT(slotProgress(qint64,qint64)) ); connect(¬ifyTimer, SIGNAL(timeout()), this, SLOT(notifyTick())); connect(&timeoutTimer, SIGNAL(timeout()), this, SLOT(slotTimeout())); connect(&disconnectTimer, SIGNAL(timeout()), this, SLOT(slotDisconnect())); timeoutTimer.setSingleShot(true); timeoutTimer.setInterval(FTPTIMEOUTTIME); } void ftpInterface::destroy() { disconnectTimer.stop(); mremove_listids.clear(); listingResults.clear(); notifyId=-1; ftpDone=true; connectPending=false; ftpCommandSuccess=false; if(ftp) { addToLog("FTP show state in destroy",LOGFTP); ftp_stateChanged(ftp->state()); if( ftp->state() != QFtp::Unconnected ) { addToLog(QString("Closing '%1' to %2").arg(name).arg(host),LOGFTP); ftp->close(); } } } void ftpInterface::setupConnection(QString tHost,int tPort,QString tUser,QString tPasswd,QString tDirectory) { addToLog(QString("'%1' host %2, User=%3,directory=%4").arg(name).arg(tHost).arg(tUser).arg(tDirectory), LOGFTP); if(host!=tHost || user!=tUser || passwd!=tPasswd || port!=tPort) { if (ftp) destroy(); } host=tHost; port=tPort; user=tUser; passwd=tPasswd; changePath(tDirectory); } eftpError ftpInterface::doConnect() { aborting=false; if(isUnconnected() && !connectPending) { //addToLog(QString("FTP connect to host %1").arg(host),LOGFTP); connectToHost(); } else if (connectPending) { addToLog(QString("'%1' connection pending to %2").arg(name).arg(host),LOGFTP); } else { addToLog(QString("'%1' already connected to %2, %3").arg(name).arg(host).arg(commandStr[ftp->currentCommand()]),LOGFTP); } return FTPOK; } eftpError ftpInterface::uploadFile(QString fileName,QString targetFilename,bool reconnect) { int id; Q_UNUSED(id); eftpError result=FTPOK; addToLog("uploadFile",LOGFTP); if ( fileName.isNull() ) { addToLog("fileName is NULL",LOGFTP); return FTPNAMEERROR; } if(reconnect) { result=doConnect(); if(result!=FTPOK) return result; } sourceFn=new QFile(fileName); if ( !sourceFn->open( QIODevice::ReadOnly ) ) { // QMessageBox::critical( 0, tr("Upload error"), // tr("Can't open file '%1' for reading.").arg(fileName) ); addToLog(QString("Unable to read '%1'").arg(fileName), LOGFTP); sourceFn=NULL; return FTPNAMEERROR; } QFileInfo fi( fileName ); QFileInfo fin(targetFilename); addToLog(QString("'%1' put '%2', %3 bytes").arg(name).arg(targetFilename).arg(sourceFn->size()),LOGFTP); ftpDone=false; if(fin.fileName().isEmpty()) { id=ftp->put( sourceFn, fi.fileName(),QFtp::Binary); } else { id=ftp->put( sourceFn, fin.fileName(),QFtp::Binary); } addToLog(QString("'%1' put '%2', %3 bytes. id=%4").arg(name).arg(targetFilename).arg(sourceFn->size()).arg(id),LOGFTP); // result = wait(-3); if (result!=FTPOK) return result; return FTPOK; } eftpError ftpInterface::uploadData(const QByteArray & data,QString targetFilename) { int id; Q_UNUSED(id) eftpError result; QFileInfo fin(targetFilename); if(fin.fileName().isEmpty()) return FTPNAMEERROR; result=doConnect(); if(result!=FTPOK) return result; ftpDone=false; id=ftp->put( data,fin.fileName(),QFtp::Binary); addToLog(QString("'%1' '%2', %3 bytes, id:%4").arg(name).arg(targetFilename).arg(data.size()).arg(id),LOGFTP); return FTPOK; } eftpError ftpInterface::downloadFile(QString sourceFileName,QString destinationFilename) { eftpError result; addToLog("FTP downloadFile",LOGFTP); QFile *destFn; destFn=new QFile(destinationFilename); if(!destFn->open(QIODevice::WriteOnly)) { addToLog(QString("FTP unable to open destinationFilename %1").arg(destinationFilename),LOGFTP); return FTPNAMEERROR; } if (sourceFileName.isNull() ) return FTPNAMEERROR; result=doConnect(); if(result!=FTPOK) return result; ftpDone=false; addToLog(QString("'%1' get '%2' destination '%3'").arg(name).arg(sourceFileName).arg(destFn->fileName()),LOGFTP); ftp->get( sourceFileName, destFn,QFtp::Binary); result = wait(-3); if(result!=FTPOK) return result; addToLog(QString("FTP file: %1 bytes: %2").arg(destinationFilename).arg(QFile(destinationFilename).size()),LOGFTP); return FTPOK; } eftpError ftpInterface::wait(int timeout) { timeoutTimer.stop(); if (timeout < 0) timeout = FTPTIMEOUTTIME * (0-timeout); if (timeout) timeoutTimer.setInterval(timeout); addToLog(QString("'%1' tim.start timeout=%2").arg(name).arg(timeout),LOGFTP); timeoutTimer.start(); timeoutExpired=false; while (!ftpDone) { if(aborting) return FTPCANCELED; qApp->processEvents(); if(timeout && timeoutExpired) { addToLog(QString("'%1' Timeout Expired").arg(name),LOGALL); return FTPTIMEOUT; } } if(!ftpCommandSuccess) return FTPERROR; return FTPOK; } eftpError ftpInterface::remove(QString path) { int id; Q_UNUSED(id); eftpError result=doConnect(); if(result!=FTPOK) return result; ftpDone=false; id = ftp->remove(path); addToLog(QString("Name=%1 Path=%2 id:%3").arg(name).arg(path).arg(id),LOGFTP); return FTPOK; } eftpError ftpInterface::mremove(QString path) { int id; eftpError result; addToLog(QString("FTP mremove"),LOGFTP); result=doConnect(); if(result!=FTPOK) return result; ftpDone=false; id = ftp->list(path); if (id>0) mremove_listids.append(id); addToLog(QString("'%1' Path='%2' id=%3").arg(name).arg(path).arg(id),LOGFTP); return FTPOK; } eftpError ftpInterface::getListing(QString path) { int id; Q_UNUSED(id); eftpError result; addToLog("FTP getListing",LOGFTP); result=doConnect(); if(result!=FTPOK) return result; ftpDone=false; id = ftp->list(path); addToLog(QString("'%1' Path='%2' id:%3").arg(name).arg(path).arg(id),LOGFTP); return FTPOK; } QList ftpInterface::getListingResults() { return listingResults; } void ftpInterface::clearListingResults() { listingResults.clear(); } eftpError ftpInterface::startNotifyCheck(QString fn, int interval, int repeats, bool rm) { addToLog(QString("'%1' startNotifyCheck(%2,%3,%4,%5)").arg(name).arg(fn).arg(interval).arg(repeats).arg(rm),LOGFTP); notifyMask = "Dummy"+fn+"+++*"; notifyTicks = -1; notifyRepeats = repeats; notifyRemove = rm; notifyList.clear(); notifyTimer.setSingleShot(false); notifyTimer.setInterval(interval*1000); notifyTimer.start(); disconnectTimer.setInterval(interval*1000 * 2); notifyTick(); return FTPOK; } void ftpInterface::notifyTick() { // runs once every interval seconds notifyTicks++; addToLog(QString("'%1': ticks=%2 notifyid=%3").arg(name).arg(notifyTicks).arg(notifyId), LOGFTP); if (notifyTicks>notifyRepeats) { notifyTimer.stop(); disconnectTimer.setInterval(FTPTIMEOUTTIME); } else if (notifyId<0) { eftpError result=doConnect(); if (result==FTPOK) { ftpDone=false; notifyId = ftp->list(notifyMask); } } } void ftpInterface::slotTimeout() { timeoutExpired=true; addToLog(QString("'%1' Timeout (%2ms) Host:%3 ").arg(name).arg(timeoutTimer.interval()).arg(host),LOGALL); slotAbort(); } void ftpInterface::connectToHost() { int id; Q_UNUSED(id); addToLog(QString("'%1' connectToHost %2").arg(name).arg(host), LOGFTP); destroy(); ftpDone=false; connectPending=true; ftp->connectToHost(host,port); ftp->login( user, passwd ); if(!directory.isEmpty()) { id = ftp->cd(directory); addToLog(QString("'%1': cd '%2' id:%3").arg(name).arg(directory).arg(id),LOGFTP); } } // This slot is connected to the QComboBox::activated() signal of the // remotePath. void ftpInterface::changePath( const QString &newPath ) { int id; Q_UNUSED(id); if (directory != newPath) { directory=""; doConnect(); id = ftp->cd( newPath ); addToLog(QString("'%1':'%2' id:%3").arg(name).arg(newPath).arg(id), LOGFTP); directory=newPath; } } /**************************************************************************** ** ** Slots connected to signals of the QFtp class ** *****************************************************************************/ void ftpInterface::ftp_commandStarted(int id) { Q_UNUSED(id); addToLog(QString("'%1' id:%2, %3").arg(name).arg(id).arg(commandStr[ftp->currentCommand()]),LOGFTP); if ( ftp->currentCommand() == QFtp::List ) { } addToLog(QString("'%1' tim.restart interval=%2").arg(name).arg(timeoutTimer.interval()),LOGFTP); timeoutTimer.start(); } void ftpInterface::ftp_commandFinished(int id,bool err) { // Q_UNUSED(id); QIODevice *p; slotProgress(0,0); addToLog(QString("'%1' id:%2,%3 error:%4").arg(name).arg(id).arg(commandStr[ftp->currentCommand()]).arg(err),LOGFTP); if (ftp->currentCommand() == QFtp::Login) { connectPending=false; } else if (ftp->currentCommand() == QFtp::List) { if (id==notifyId) { notifyId=-1; } else if (mremove_listids.contains(id)) { mremove_listids.removeOne(id); } else { emit listingComplete(); } } if(err) { addToLog(QString("FTP error:%1").arg(ftp->errorString()),LOGFTP); ftpCommandSuccess=false; } else { ftpCommandSuccess=true; } p=ftp->currentDevice(); if(p) { delete ftp->currentDevice(); } } void ftpInterface::ftp_done( bool error ) { timeoutTimer.stop(); if ( error ) { // If we are connected, but not logged in, it is not meaningful to stay // connected to the server since the error is a really fatal one (login // failed). if(!isLoggedIn()) { emit commandsDone(error); ftpCommandSuccess=false; addToLog(QString("'%1': error and not logged in-> disconnecting").arg(host),LOGFTP); destroy(); ftpDone=true; return; } addToLog(QString("'%1': %2 error").arg(name).arg(host),LOGFTP); } else { addToLog(QString("'%1': %2 OK").arg(name).arg(host),LOGFTP); } mremove_listids.clear(); if (!isUnconnected() && canCloseWhenDone) { addToLog(QString("'%1': schedule disconnect in %2ms").arg(name).arg(disconnectTimer.interval()),LOGFTP); disconnectTimer.start(); } ftpCommandSuccess=true; ftpDone=true; emit commandsDone(error); } void ftpInterface::slotDisconnect() { addToLog(QString("'%1'").arg(name), LOGFTP); destroy(); } bool ftpInterface::isLoggedIn() { return ftp->state() == QFtp::LoggedIn; } bool ftpInterface::isUnconnected() { return ftp->state() == QFtp::Unconnected; } bool ftpInterface::isBusy() { return !ftpDone; } void ftpInterface::ftp_stateChanged( int ) { dumpState(); } void ftpInterface::dumpState() { switch (ftp->state() ) { case QFtp::Unconnected: addToLog(QString("FTPss Unconnected name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; case QFtp::HostLookup: addToLog(QString("FTPss Host lookup name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; case QFtp::Connecting: addToLog(QString("FTPss Connecting name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; case QFtp::Connected: addToLog(QString("FTPss Connected name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; case QFtp::LoggedIn: addToLog(QString("FTPss Logged In name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; case QFtp::Closing: addToLog(QString("FTPss Closing name:=%1 :host=%2").arg(name).arg(host),LOGFTP); break; default: addToLog(QString("FTPss uknown %1 name:=%2 host=%3").arg(ftp->state()).arg(name).arg(host),LOGFTP); break; } } void ftpInterface::ftp_listInfo( const QUrlInfo & ent) { timeoutTimer.start(); if (ent.isFile()) { addToLog(QString("currentId=%1, name=%2").arg(ftp->currentId()).arg(ent.name()), LOGFTP); if (ftp->currentId()==notifyId) { QString name = ent.name().mid(notifyMask.length()); if (!notifyList.contains(name)) { addToLog(QString("New Notification:'%1'").arg(name), LOGALL); notifyList.append(name); // qDebug() << "info"; emit notification(name); } if (notifyRemove) remove(ent.name()); } else if (mremove_listids.contains(ftp->currentId())) { // qDebug() << "rem"; remove(ent.name()); } else { listingResults.append(ent); addToLog(QString("List Entry: %1").arg(ent.name()), LOGFTP); } } } void ftpInterface::ftp_rawCommandReply( int code, const QString &text ) { Q_UNUSED(code); Q_UNUSED(text); addToLog(QString("FTP Raw Command Reply: code=%1 , %2").arg(code).arg(text),LOGFTP); } void ftpInterface::slotAbort() { aborting=true; ftp->abort(); } void ftpInterface::slotProgress(qint64 bytes ,qint64 total) { if (displayProgress) { displayProgressFTPEvent *stmb; stmb=new displayProgressFTPEvent(bytes,total); QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done } addToLog(QString("'%1' tim.restart interval=%2").arg(name).arg(timeoutTimer.interval()),LOGFTP); timeoutTimer.start(); } eftpError ftpInterface::uploadToRXServer(QString fn) { int i; eftpError result; addToLog("FTP show state",LOGFTP); ftp_stateChanged(ftp->state()); result=doConnect(); if(result!=FTPOK) return result; if(fn.length()>0) { if(ftpSaveFormat==FTPIM) { ftpDone=false; ftp->remove(QString("image%1").arg(ftpNumImages)); wait(-1); for(i=ftpNumImages; i>0; i--) { ftpDone=false; ftp->rename(QString("image%1").arg(i-1),QString("image%1").arg(i)); wait(-1); addToLog("FTP done: in rename",LOGFTP); } ftpDone=false; result=uploadFile(fn,"image1",false); } else { ftpDone=false; result=uploadFile(fn,"",false); } } if (result!=FTPOK) return result; // indicate the images were updated // width=1:online, 2:offline // Height=change each time to indicate images were updated int status=(fn.length()>0) ? 1 : 2; QImage im(status,QDateTime::currentDateTime().time().minute(),QImage::Format_RGB32); im.fill(Qt::black); QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); im.save(&buffer, "JPG"); uploadData(ba,"checknew.jpg"); result=wait(-1); return result; } QString ftpInterface::execFTPTest() { QString ret=""; QString fn; QString rfn; eftpError ftpResult; addToLog(QString("%1 execFTPTest").arg(name), LOGFTP); QTemporaryFile tst; if (!tst.open()) { ret=QString("Error writing temp file: %1, %2").arg(tst.fileName()).arg(strerror(errno)); } else { fn=tst.fileName(); tst.write("connection test\n"); tst.close(); rfn = QString("test_%1.txt").arg( myCallsign); ftpResult=uploadFile(fn,rfn,true); ftpResult=wait(-1); switch(ftpResult) { case FTPCANCELED: ret="Connection Canceled"; break; case FTPOK: ret="Connection OK"; break; case FTPERROR: ret=getLastError(); break; case FTPNAMEERROR: ret="Error in filename"; break; case FTPTIMEOUT: ret="FTP timed out"; break; default: ret="Unknown error"; break; } if (ftpResult==FTPOK) { remove(rfn); ftpResult=wait(-1); switch(ftpResult) { case FTPCANCELED: ret="mremove: Connection Canceled"; break; case FTPOK: ret="Connection OK"; break; case FTPERROR: ret=getLastError(); break; case FTPNAMEERROR: ret="mremove: Error in filename"; break; case FTPTIMEOUT: ret="mremove: FTP timed out"; break; default: ret="mremove: Unknown error"; break; } } } return ret; } qsstv_9.2.6/qsstv/utils/ftp.h0000664000175000017500000000765213203343610014721 0ustar jomajoma/*************************************************************************** * Copyright (C) 2004 by Johan Maes * * on4qz@telenet.be * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FTPINTERFACE_H #define FTPINTERFACE_H #include "qglobal.h" # if(QT_VERSION > QT_VERSION_CHECK(5, 0, 0)) #include "qftp.h" # else #include #endif #include #include #include enum eftpError {FTPOK,FTPERROR,FTPNAMEERROR,FTPCANCELED,FTPTIMEOUT}; class ftpInterface: public QObject { Q_OBJECT public: ftpInterface(QString id); ~ftpInterface(); void setupConnection(QString tHost,int tPort,QString tUser,QString tPasswd,QString tDirectory); void changePath( const QString &newPath ); eftpError uploadFile(QString fileName, QString fixFilename, bool reconnect); eftpError uploadData(const QByteArray & data, QString fixFilename); eftpError downloadFile(QString sourceFileName,QString destinationFilename); eftpError wait(int timeout = 0); eftpError remove(QString path); eftpError mremove(QString path); eftpError getListing(QString path); eftpError startNotifyCheck(QString fn, int interval, int repeats, bool rm); QList getListingResults(); void clearListingResults(); void closeWhenDone(bool can=true) { canCloseWhenDone=can; } void hideProgress(bool hide=true) { displayProgress=!hide; } bool isUnconnected(); bool isLoggedIn(); bool isBusy(); void dumpState(); eftpError uploadToRXServer(QString fn); QString getLastError() {return ftp->errorString();} QString execFTPTest(); void init(); signals: void notification(QString info); void listingComplete(); void commandsDone(bool error); private slots: void ftp_commandStarted(int); void ftp_commandFinished(int,bool); void ftp_done(bool); void ftp_stateChanged(int); void ftp_listInfo(const QUrlInfo &); void ftp_rawCommandReply(int, const QString &); void slotAbort(); void slotProgress(qint64 total, qint64 bytes); void notifyTick(); void slotTimeout(); void slotDisconnect(); private: void connectToHost(); eftpError doConnect(); void destroy(); QFtp *ftp; QFile *sourceFn; bool ftpDone; bool aborting; QString host; QString user; QString passwd; QString directory; int port; bool ftpCommandSuccess; QTimer timeoutTimer; bool timeoutExpired; QString name; QList mremove_listids; QList listingResults; QList notifyList; QTimer notifyTimer; QTimer disconnectTimer; QString notifyMask; int notifyTicks; int notifyRepeats; bool notifyRemove; int notifyId; bool connectPending; bool canCloseWhenDone; bool displayProgress; }; //extern ftpInterface *ftpIntf; #endif qsstv_9.2.6/qsstv/utils/hexconvertor.cpp0000664000175000017500000000075613203343610017207 0ustar jomajoma#include "hexconvertor.h" bool hexFromString(QString s,QByteArray &ba,bool toHex) { int i,j; unsigned char res; bool ok; QString tmp; if(toHex) { if((s.length()&1)!=0) return false; ba.resize(s.length()/2); for(i=0,j=0;i #include bool hexFromString(QString s, QByteArray &ba, bool toHex); #endif // HEXCONVERTOR_H qsstv_9.2.6/qsstv/utils/hybridcrypt.cpp0000664000175000017500000001176113203343610017022 0ustar jomajoma#include "hybridcrypt.h" #include #include "configparams.h" #include "QResource" hybridCrypt::hybridCrypt() { key1=4; key2=5; key3=7; key4=1; } bool hybridCrypt::enCrypt(QByteArray *ba) { int i; QString string,hstr; hcFtpPort=21; if(!hybridFtpRemoteHost.isEmpty()) { hcFtpRemoteHost=hybridFtpRemoteHost; hcFtpLogin=hybridFtpLogin; hcFtpPassword=hybridFtpPassword; hcFtpRemoteDirectory=hybridFtpRemoteDirectory; //always relatif to /HybridFiles } hstr=QChar(63)+hcFtpRemoteHost+QChar(34)+hcFtpLogin+QChar(60)+hcFtpPassword+QChar(62)+hcFtpRemoteDirectory+QChar(58); hcFtpRemoteHost.clear(); hcFtpLogin.clear(); hcFtpPassword.clear(); hcFtpRemoteDirectory.clear(); reverseString(hstr); for(i=0;iclear(); while(string.length()%4!=0) { string.append(QChar(0)); } do { num1=string.at(sc++).toLatin1(); num2=string.at(sc++).toLatin1(); num3=string.at(sc++).toLatin1(); num4=string.at(sc++).toLatin1(); res1=num1*key1; bufI=num2*key3; res1=res1+bufI; res2= num1 * key2; bufI= num2 * key4; res2= res2 + bufI; res3= num3 * key1; bufI= num4 * key3; res3= res3 + bufI; res4= num3 * key2; bufI= num4 * key4; res4= res4 + bufI; for(bufI=0;bufI<4;bufI++) { switch(bufI) { case 0: r1=res1>>8; r2=res1&0xff; break; case 1: r1=res2>>8; r2=res2&0xff; break; case 2: r1=res3>>8; r2=res3&0xff; break; case 3: r1=res4>>8; r2=res4&0xff; break; } if((r1==0) &&(r2==0)) { r1=0xFF; r2=0xFF; } if(r1==0xFF) r1=0xFE; if(r2==0) { r2=r1; r1=0xFD; } ba->append(r1); ba->append(r2); } } while(scappend("\r\n"); return true; } bool hybridCrypt::deCrypt(QByteArray *ba) { QString result; int baSize; bool ok; int charCount=0; QString tempStr="0x00"; short int bufI, bufI2, divzr, num1, num2, num3, num4, res1, res2, res3, res4; unsigned char r1,r2; result=""; res1=res2=res3=res4=0; divzr=key1*key4; bufI2=key3*key2; divzr-=bufI2; if(divzr==0) return false; baSize=ba->size(); if(baSize!=3) { baSize=ba->size()-2; //drop /r/n if(baSize%2!=0) return false; } if(baSize<20) return false; do { for(bufI=0;bufI<4;bufI++,charCount+=2) { r1=ba->at(charCount); r2=ba->at(charCount+1); if(r1==0xFF) { r1=r2=0; } if(r1==0xFE) { r1=0; } if(r1==0xFD) { r1=r2; r2=0; } switch(bufI) { case 0: res1=r1*256+r2; break; case 1: res2=r1*256+r2; break; case 2: res3=r1*256+r2; break; case 3: res4=r1*256+r2; break; } } bufI= res1 * key4; bufI2= res2 * key3; num1= bufI - bufI2; num1= num1 / divzr; bufI= res2 * key1; bufI2= res1 * key2; num2= bufI - bufI2; num2 = num2 / divzr; bufI= res3 * key4; bufI2= res4 * key3; num3= bufI - bufI2; num3= num3 / divzr; bufI= res4 * key1; bufI2= res3 * key2; num4= bufI - bufI2; num4= num4 / divzr; tempStr[2]=QChar(num1); tempStr[3]=QChar(num2); result.append(QChar(tempStr.toInt(&ok,16))); tempStr[2]=QChar(num3); tempStr[3]=QChar(num4); result.append(QChar(tempStr.toInt(&ok,16))); } while(charCount #include class hybridCrypt { public: hybridCrypt(); bool enCrypt(QByteArray *ba); bool deCrypt(QByteArray *ba); QString host() {return hcFtpRemoteHost;} QString user() {return hcFtpLogin;} QString passwd(){return hcFtpPassword;} QString dir() {return hcFtpRemoteDirectory;} int port() {return hcFtpPort;} private: QString hcFtpRemoteHost; QString hcFtpLogin; QString hcFtpPassword; QString hcFtpRemoteDirectory; int hcFtpPort; short int key1,key2,key3,key4; void reverseString(QString & s); bool getParam(QString result); QString charToHex(QChar c); }; #endif // HYBRIDCRYPT_H qsstv_9.2.6/qsstv/utils/jp2io.cpp0000664000175000017500000004226613203343610015506 0ustar jomajoma#include "jp2io.h" #include "color.h" #include "appglobal.h" #include "loggingparams.h" #include #include #include #include #include #include #define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a" #define JP2_MAGIC "\x0d\x0a\x87\x0a" #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" static size_t opj_strnlen_s(const char *src, size_t max_len) { size_t len; if (src == NULL) { return 0U; } for (len = 0U; (*src != '\0') && (len < max_len); src++, len++); return len; } static int opj_strcpy_s(char* dst, size_t dst_size, const char* src) { size_t src_len = 0U; if ((dst == NULL) || (dst_size == 0U)) { return EINVAL; } if (src == NULL) { dst[0] = '\0'; return EINVAL; } src_len = opj_strnlen_s(src, dst_size); if (src_len >= dst_size) { return ERANGE; } memcpy(dst, src, src_len); dst[src_len] = '\0'; return 0; } /** sample error callback expecting a FILE* client object */ static void error_callback(const char *msg, void *client_data) { (void)client_data; Q_UNUSED( msg ) addToLog(QString("[ERROR] %1").arg(msg),LOGIMAG); } /** sample warning callback expecting a FILE* client object */ static void warning_callback(const char *msg, void *client_data) { (void)client_data; Q_UNUSED( msg ) addToLog(QString("[WARNING] %1").arg(msg),LOGIMAG); } /** sample debug callback expecting no client object */ static void info_callback(const char *msg, void *client_data) { (void)client_data; Q_UNUSED( msg ) addToLog(QString("[INFO] %1").arg(msg),LOGIMAG); } /*! * Divide an integer by a power of 2 and round upwards. */ // -------------------- int_ceildivpow2() ------------------------------------ static inline int int_ceildivpow2(int a, int b) { return (a + (1 << b) - 1) >> b; } // --------------------------------------------------------------------------- jp2IO::jp2IO() { } void jp2IO::init() { jp2Image = NULL; l_stream = NULL; /* Stream */ l_codec = NULL; /* Handle to a decompressor */ cstr_index = NULL; } bool jp2IO::check(QString fileName) { quint64 size; char data[12]; QFile fi(fileName); set_default_parameters(¶meters); // set decoding parameters to default values if(!fi.open(QIODevice::ReadOnly)) return false; size=fi.read(data,12); fi.close(); if(size!=12) { return false; } if (memcmp(data, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(data, JP2_MAGIC, 4) == 0) { magicFormat = JP2_CFMT; magicStr = ".jp2"; } else if (memcmp(data, J2K_CODESTREAM_MAGIC, 4) == 0) { magicFormat = J2K_CFMT; magicStr = ".j2k or .jpc or .j2c"; } else return false; parameters.decod_format=magicFormat; return true; } void jp2IO::set_default_parameters(opj_decompress_parameters* parameters) { if (parameters) { memset(parameters, 0, sizeof(opj_decompress_parameters)); /* default decoding parameters (command line specific) */ parameters->decod_format = -1; parameters->cod_format = -1; /* default decoding parameters (core) */ opj_set_default_decoder_parameters(&(parameters->core)); } } void jp2IO::destroy_parameters(opj_decompress_parameters* parameters) { if (parameters) { if (parameters->precision) { free(parameters->precision); parameters->precision = NULL; } } } QImage jp2IO::decode(QString fileName) { QImage qimage; int width; // image width and height int wr, hr; // taken from OpenJPEG init(); l_stream = opj_stream_create_default_file_stream(fileName.toLatin1(),1); if (!l_stream) { qDebug() << "ERROR -> failed to create the stream from the file " << parameters.infile; destroy_parameters(¶meters); return qimage; } /* decode the JPEG2000 stream */ /* ---------------------- */ switch(parameters.decod_format) { case J2K_CFMT: /* JPEG-2000 codestream */ { /* Get a decoder handle */ l_codec = opj_create_decompress(OPJ_CODEC_J2K); break; } case JP2_CFMT: /* JPEG 2000 compressed image data */ { /* Get a decoder handle */ l_codec = opj_create_decompress(OPJ_CODEC_JP2); break; } case JPT_CFMT: /* JPEG 2000, JPIP */ { /* Get a decoder handle */ l_codec = opj_create_decompress(OPJ_CODEC_JPT); break; } default: // fprintf(stderr, "skipping file..\n"); destroy_parameters(¶meters); opj_stream_destroy(l_stream); } /* catch events using our callbacks and give a local context */ opj_set_info_handler(l_codec, info_callback,00); opj_set_warning_handler(l_codec, warning_callback,00); opj_set_error_handler(l_codec, error_callback,00); // t = opj_clock(); /* Setup the decoder decoding parameters using user parameters */ if ( !opj_setup_decoder(l_codec, &(parameters.core)) ){ qDebug() << "ERROR -> opj_decompress: failed to setup the decoder"; destroy_parameters(¶meters); opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); return qimage; } /* Read the main header of the codestream and if necessary the JP2 boxes*/ if(! opj_read_header(l_stream, l_codec, &jp2Image)){ qDebug() << "ERROR -> opj_decompress: failed to read the header"; destroy_parameters(¶meters); opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); return qimage; } if (!parameters.nb_tile_to_decode) { /* Optional if you want decode the entire image */ if (!opj_set_decode_area(l_codec, jp2Image, (OPJ_INT32)parameters.DA_x0, (OPJ_INT32)parameters.DA_y0, (OPJ_INT32)parameters.DA_x1, (OPJ_INT32)parameters.DA_y1)){ qDebug() << "ERROR -> opj_decompress: failed to set the decoded area"; destroy_parameters(¶meters); opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); return qimage; } /* Get the decoded image */ if (!(opj_decode(l_codec, l_stream, jp2Image) && opj_end_decompress(l_codec, l_stream))) { qDebug() <<"ERROR -> opj_decompress: failed to decode image!"; destroy_parameters(¶meters); opj_destroy_codec(l_codec); opj_stream_destroy(l_stream); opj_image_destroy(jp2Image); return qimage; } } /* Close the byte stream */ opj_stream_destroy(l_stream); if( jp2Image->color_space != OPJ_CLRSPC_SYCC && jp2Image->numcomps == 3 && jp2Image->comps[0].dx == jp2Image->comps[0].dy && jp2Image->comps[1].dx != 1 ) jp2Image->color_space = OPJ_CLRSPC_SYCC; else if (jp2Image->numcomps <= 2) jp2Image->color_space = OPJ_CLRSPC_GRAY; if(jp2Image->color_space == OPJ_CLRSPC_SYCC){ color_sycc_to_rgb(jp2Image); } else if(jp2Image->color_space == OPJ_CLRSPC_EYCC){ color_esycc_to_rgb(jp2Image); } if(jp2Image->icc_profile_buf) { free(jp2Image->icc_profile_buf); jp2Image->icc_profile_buf = NULL; jp2Image->icc_profile_len = 0; } /* Force RGB output */ /* ---------------- */ if (parameters.force_rgb) { switch (jp2Image->color_space) { case OPJ_CLRSPC_SRGB: break; case OPJ_CLRSPC_GRAY: jp2Image = convert_gray_to_rgb(jp2Image); break; default: fprintf(stderr, "ERROR -> opj_decompress: don't know how to convert image to RGB colorspace!\n"); opj_image_destroy(jp2Image); jp2Image = NULL; break; } if (jp2Image == NULL) { fprintf(stderr, "ERROR -> opj_decompress: failed to convert to RGB image!\n"); destroy_parameters(¶meters); opj_destroy_codec(l_codec); return qimage; } } // decode image width and height width = jp2Image->comps[0].w; wr = int_ceildivpow2(jp2Image->comps[0].w, jp2Image->comps[0].factor); // height = jp2Image->comps[0].h; hr = int_ceildivpow2(jp2Image->comps[0].h, jp2Image->comps[0].factor); // alloc memory for a new image qimage=QImage(wr, hr, QImage::Format_RGB32); // get a pointer to the first pixel data in result image QRgb *bits = (QRgb *)qimage.bits(); for(int i = 0; i < wr * hr; i++) { unsigned char R, G, B; // calculate coords int x = (i) % (wr); // int y = height - (i) / (wr) - 1; int y = (i) / (wr); #define idx( _x, _y ) ( _x + _y * width ) R = jp2Image->comps[0].data[ idx( x, y ) ]; G = jp2Image->comps[1].data[ idx( x, y ) ]; B = jp2Image->comps[2].data[ idx( x, y ) ]; // fill the bit with read pallete bits[i] = qRgb(R, G, B); } destroy_parameters(¶meters); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); return qimage; } opj_image_t *jp2IO::convert_gray_to_rgb(opj_image_t* original) { OPJ_UINT32 compno; opj_image_t* l_new_image = NULL; opj_image_cmptparm_t* l_new_components = NULL; l_new_components = (opj_image_cmptparm_t*)malloc((original->numcomps + 2U) * sizeof(opj_image_cmptparm_t)); if (l_new_components == NULL) { fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); opj_image_destroy(original); return NULL; } l_new_components[0].bpp = l_new_components[1].bpp = l_new_components[2].bpp = original->comps[0].bpp; l_new_components[0].dx = l_new_components[1].dx = l_new_components[2].dx = original->comps[0].dx; l_new_components[0].dy = l_new_components[1].dy = l_new_components[2].dy = original->comps[0].dy; l_new_components[0].h = l_new_components[1].h = l_new_components[2].h = original->comps[0].h; l_new_components[0].w = l_new_components[1].w = l_new_components[2].w = original->comps[0].w; l_new_components[0].prec = l_new_components[1].prec = l_new_components[2].prec = original->comps[0].prec; l_new_components[0].sgnd = l_new_components[1].sgnd = l_new_components[2].sgnd = original->comps[0].sgnd; l_new_components[0].x0 = l_new_components[1].x0 = l_new_components[2].x0 = original->comps[0].x0; l_new_components[0].y0 = l_new_components[1].y0 = l_new_components[2].y0 = original->comps[0].y0; for(compno = 1U; compno < original->numcomps; ++compno) { l_new_components[compno+2U].bpp = original->comps[compno].bpp; l_new_components[compno+2U].dx = original->comps[compno].dx; l_new_components[compno+2U].dy = original->comps[compno].dy; l_new_components[compno+2U].h = original->comps[compno].h; l_new_components[compno+2U].w = original->comps[compno].w; l_new_components[compno+2U].prec = original->comps[compno].prec; l_new_components[compno+2U].sgnd = original->comps[compno].sgnd; l_new_components[compno+2U].x0 = original->comps[compno].x0; l_new_components[compno+2U].y0 = original->comps[compno].y0; } l_new_image = opj_image_create(original->numcomps + 2U, l_new_components, OPJ_CLRSPC_SRGB); free(l_new_components); if (l_new_image == NULL) { fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n"); opj_image_destroy(original); return NULL; } l_new_image->x0 = original->x0; l_new_image->x1 = original->x1; l_new_image->y0 = original->y0; l_new_image->y1 = original->y1; l_new_image->comps[0].factor = l_new_image->comps[1].factor = l_new_image->comps[2].factor = original->comps[0].factor; l_new_image->comps[0].alpha = l_new_image->comps[1].alpha = l_new_image->comps[2].alpha = original->comps[0].alpha; l_new_image->comps[0].resno_decoded = l_new_image->comps[1].resno_decoded = l_new_image->comps[2].resno_decoded = original->comps[0].resno_decoded; memcpy(l_new_image->comps[0].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); memcpy(l_new_image->comps[1].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); memcpy(l_new_image->comps[2].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32)); for(compno = 1U; compno < original->numcomps; ++compno) { l_new_image->comps[compno+2U].factor = original->comps[compno].factor; l_new_image->comps[compno+2U].alpha = original->comps[compno].alpha; l_new_image->comps[compno+2U].resno_decoded = original->comps[compno].resno_decoded; memcpy(l_new_image->comps[compno+2U].data, original->comps[compno].data, original->comps[compno].w * original->comps[compno].h * sizeof(OPJ_INT32)); } opj_image_destroy(original); return l_new_image; } QByteArray jp2IO::encode(QImage qimage, QImage &newImage,int &fileSize, int compressionRatio) { QByteArray byteArray; QString fn=QString("%1/%2").arg(QDir::tempPath()).arg("qsstv.tmp"); // char *of=fn.toLatin1().data(); bool success; init(); fileSize=0; opj_set_default_encoder_parameters(&cparameters); cparameters.cp_disto_alloc = 1; createImage(qimage); cparameters.cod_format=JP2_CFMT; if(opj_strcpy_s(cparameters.outfile, sizeof(cparameters.outfile), fn.toLatin1().data()) != 0) { return byteArray; } raw_cp.rawBitDepth = 0; raw_cp.rawComp = 0; raw_cp.rawComps = 0; raw_cp.rawHeight = 0; raw_cp.rawSigned = 0; raw_cp.rawWidth = 0; // cparameters.tcp_mct = (char) 255; // This will be set later according to the input image or the provided option cparameters.tcp_mct = (jp2Image->numcomps >= 3) ? 1 : 0; cparameters.tcp_rates[0] = compressionRatio; /* MOD antonin : losslessbug */ cparameters.tcp_numlayers++; cparameters.cp_disto_alloc = 1; l_codec = opj_create_compress(OPJ_CODEC_JP2); /* catch events using our callbacks and give a local context */ opj_set_info_handler(l_codec, info_callback,00); opj_set_warning_handler(l_codec, warning_callback,00); opj_set_error_handler(l_codec, error_callback,00); /* open a byte stream for writing and allocate memory for all tiles */ if (! opj_setup_encoder(l_codec, &cparameters, jp2Image)) { addToLog("failed to encode image: opj_setup_encoder",LOGIMAG); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); return byteArray; } l_stream = opj_stream_create_default_file_stream(cparameters.outfile,OPJ_FALSE); if (! l_stream) { opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); return byteArray; } /* encode the image */ success = opj_start_compress(l_codec,jp2Image,l_stream); if (!success) { addToLog("failed to encode image: opj_start_compress",LOGIMAG); } success = success && opj_encode(l_codec, l_stream); if (!success) { addToLog("failed to encode image: opj_encode",LOGIMAG); } success = success && opj_end_compress(l_codec, l_stream); if (!success) { addToLog("failed to encode image: opj_end_compress",LOGIMAG); } if (!success) { opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); addToLog("failed to encode image",LOGIMAG); remove(parameters.outfile); return byteArray; } opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(jp2Image); /* free user parameters structure */ if(cparameters.cp_comment) free(cparameters.cp_comment); if(cparameters.cp_matrice) free(cparameters.cp_matrice); if(raw_cp.rawComps) free(raw_cp.rawComps); QFile fi(fn); if(fi.open(QIODevice::ReadOnly)) { byteArray=fi.readAll(); fileSize=byteArray.count(); } fi.close(); check(fn); newImage=decode(fn); fi.remove(); remove(parameters.outfile); return byteArray; } bool jp2IO::createImage(QImage qimage) { int i; int numcmpts=3; opj_image_cmptparm_t cmptparm[4]; /* maximum of 4 components */ memset(&cmptparm[0], 0, sizeof(cmptparm)); for(i = 0; i < 4; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = (OPJ_UINT32)cparameters.subsampling_dx; cmptparm[i].dy = (OPJ_UINT32)cparameters.subsampling_dy; cmptparm[i].w = qimage.width(); cmptparm[i].h = qimage.height(); } jp2Image = opj_image_create(numcmpts, &cmptparm[0],OPJ_CLRSPC_SRGB); if(!jp2Image) return false; if (numcmpts == 4) { jp2Image->comps[3].alpha = 1; } /* set image offset and reference grid */ jp2Image->x0 = (OPJ_UINT32)cparameters.image_offset_x0; jp2Image->y0 = (OPJ_UINT32)cparameters.image_offset_y0; jp2Image->x1 = jp2Image->x0 + (qimage.width() - 1U) * (OPJ_UINT32)cparameters.subsampling_dx + 1U; jp2Image->y1 = jp2Image->y0 + (qimage.height() - 1U) * (OPJ_UINT32)cparameters.subsampling_dy + 1U; int width = jp2Image->comps[0].w; int height = jp2Image->comps[0].h; QRgb *bits; QRgb color; int index = 0; int x,y; bits= (QRgb *)qimage.bits(); for(y = 0; y < height; y++) { for(x = 0; x < width; x++) { color=bits[x+y* width]; jp2Image->comps[0].data[index] = (OPJ_INT32)qRed(color); /* R */ jp2Image->comps[1].data[index] = (OPJ_INT32)qGreen(color); /* G */ jp2Image->comps[2].data[index] = (OPJ_INT32)qBlue(color); /* B */ index++; } } return true; } qsstv_9.2.6/qsstv/utils/jp2io.h0000664000175000017500000000555513203343610015153 0ustar jomajoma#ifndef JP2READER_H #define JP2READER_H #include "openjpeg.h" #include #include #define J2K_CFMT 0 #define JP2_CFMT 1 #define JPT_CFMT 2 typedef enum opj_prec_mode { OPJ_PREC_MODE_CLIP, OPJ_PREC_MODE_SCALE } opj_precision_mode; typedef struct opj_prec { OPJ_UINT32 prec; opj_precision_mode mode; }opj_precision; // used in encode /**@name RAW component encoding parameters */ /*@{*/ typedef struct raw_comp_cparameters { /** subsampling in X direction */ int dx; /** subsampling in Y direction */ int dy; /*@}*/ } raw_comp_cparameters_t; /**@name RAW image encoding parameters */ /*@{*/ typedef struct raw_cparameters { /** width of the raw image */ int rawWidth; /** height of the raw image */ int rawHeight; /** number of components of the raw image */ int rawComp; /** bit depth of the raw image */ int rawBitDepth; /** signed/unsigned raw image */ OPJ_BOOL rawSigned; /** raw components parameters */ raw_comp_cparameters_t *rawComps; /*@}*/ } raw_cparameters_t; typedef struct opj_decompress_params { opj_dparameters_t core; // core library parameters char infile[OPJ_PATH_LEN]; // input file name char outfile[OPJ_PATH_LEN]; // output file name int decod_format; // input file format 0: J2K, 1: JP2, 2: JPT int cod_format; // output file format 0: PGX, 1: PxM, 2: BMP char indexfilename[OPJ_PATH_LEN]; // index file name OPJ_UINT32 DA_x0; // Decoding area left boundary OPJ_UINT32 DA_x1; // Decoding area right boundary OPJ_UINT32 DA_y0; // Decoding area up boundary OPJ_UINT32 DA_y1; // Decoding area bottom boundary OPJ_BOOL m_verbose; // Verbose mode OPJ_UINT32 tile_index; // tile number of the decoded tile OPJ_UINT32 nb_tile_to_decode; // Nb of tile to decode opj_precision* precision; OPJ_UINT32 nb_precision; int force_rgb; // force output colorspace to RGB int upsample;// upsample components according to their dx/dy values int split_pnm;// split output components to different files }opj_decompress_parameters; class jp2IO { public: jp2IO(); bool check(QString fileName); QImage decode(QString fileName); QByteArray encode(QImage qimage, QImage &newImage, int &fileSize, int compressionRatio=0 ); private: int magicFormat; QString magicStr; opj_decompress_parameters parameters; /* decompression parameters */ opj_cparameters_t cparameters; opj_image_t* jp2Image; opj_stream_t *l_stream ; /* Stream */ opj_codec_t* l_codec; /* Handle to a decompressor */ opj_codestream_index_t* cstr_index; void set_default_parameters(opj_decompress_parameters* parameters); void destroy_parameters(opj_decompress_parameters* parameters); opj_image_t *convert_gray_to_rgb(opj_image_t* original); void init(); // used in encode (compress) raw_cparameters_t raw_cp; bool createImage(QImage qimage); }; #endif // JP2READER_H qsstv_9.2.6/qsstv/utils/logging.cpp0000664000175000017500000001603313203343610016102 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "logging.h" #include #include #include #include #include #include "ui_loggingform.h" /*! class logFile \brief utility class to enable logging facilities Create an instance of this class giving the basename of the logfile. By default the log is disabled. call setEnabled(true) to enable logging */ //logFile logfile; logFile::logFile() { #ifdef ENABLELOGGING lf=new QFile; auxFile=new QFile; #endif logCount=0; savedLogEntry=""; savedPosMask=0; mask.set(); //all masks set:this will enable all logfile messages } /*! creates logfile with name=logname, and opens it for writing */ #ifdef ENABLELOGGING bool logFile::open(QString logname) { lf->setFileName(QDir::homePath()+"/"+logname); auxFile->setFileName(QDir::homePath()+"/aux_"+logname); return reopen(); } #else bool logFile::open(QString ) { return true;} #endif /*! closes the logfile */ logFile::~logFile() { close(); } void logFile::close() { #ifdef ENABLELOGGING errorOut() << "closing logfile"; add("End of logfile",LOGALL); add("....,",LOGALL); delete ts; delete auxTs; lf->close(); auxFile->close(); #endif } void logFile::reset() { close(); reopen(); } bool logFile::reopen() { #ifdef ENABLELOGGING setEnabled(false); QFileInfo finf(*lf); QFileInfo finfaux(*auxFile); errorOut() << "opening logfile--: " << finf.absoluteFilePath(); if(!lf->open(QIODevice::WriteOnly)) { errorOut() << "logfile creation failed"; return false; } errorOut() << "opening logfile: " << finfaux.absoluteFilePath(); if(!auxFile->open(QIODevice::WriteOnly)) { errorOut() << "auxillary file creation failed"; lf->close(); return false; } setEnabled(true); ts= new QTextStream( lf ); auxTs= new QTextStream( auxFile); savedLogEntry=""; logCount=0; timer.start(); *ts<< "Time \tElapsed \t Level \t Count\t Info\n"; ts->flush(); #endif return true; } /*! \brief Writes to the logfile The output is flushed after every access.Identical messages are only logged once. The count indicates the number of duplicate messages. */ #ifdef ENABLELOGGING void logFile::add(QString t,short unsigned int posMask) { if(!(posMask==LOGALL)) // always show messages with DBALL { if (!mask.test(posMask)) return; } if (!enabled) return; mutex.lock(); if(logCount==0) { logCount=1; savedLogEntry=t; timer.restart(); tmp=QString("%1 ").arg(timer.elapsed(),5); tmp2=timer.currentTime().toString("HH:mm:ss:zzz "); savedPosMask=posMask; } if ((t==savedLogEntry) &&(deduplicate)) logCount++; else { if(!deduplicate) { savedLogEntry=t; tmp=QString("%1 ").arg(timer.elapsed(),5); tmp2 = timer.currentTime().toString("HH:mm:ss:zzz "); savedPosMask=posMask; } if(savedPosMask==LOGALL) { *ts << tmp2<< "\t" << tmp << "\tALL \t" << logCount << "\t" << savedLogEntry <<"\n"; } else { *ts << tmp2<< "\t" << tmp << "\t" << levelStr[savedPosMask] <<"\t" << logCount << "\t" << savedLogEntry <<"\n"; } tmp=QString("%1 ").arg(timer.elapsed(),5); tmp2 = timer.currentTime().toString("HH:mm:ss:zzz "); timer.restart();; savedLogEntry=t; savedPosMask=posMask; logCount=1; } ts->flush(); lf->flush(); mutex.unlock(); } #else void logFile::add(QString ,short unsigned int) {} #endif void logFile::add(const char *fileName,const char *functionName, int line, QString t,short unsigned int posMask) { QString s; s=QString(fileName)+":"+QString(functionName)+":"+QString::number(line)+" "+ t; add(s,posMask); } #ifdef ENABLELOGGING void logFile::addToAux(QString t) { if (!enabled) return; mutex.lock(); *auxTs << t << "\n"; auxTs->flush(); auxFile->flush(); mutex.unlock(); } #else void logFile::addToAux(QString ){} #endif /*! if enable=true logging wil be performed \return previous logging state (true if logging was enabled) */ bool logFile::setEnabled(bool enable) { bool t=enabled; enabled=enable; return t; } void logFile::setLogMask(std::bitset logMask) { mask=logMask; } void logFile::maskSelect(QWidget *wPtr) { int i,j; QDialog lf(wPtr); QCheckBox *cb; // QTableWidgetItem *item; Ui::loggingForm ui; ui.setupUi(&lf); ui.maskTableWidget->setRowCount((NUMDEBUGLEVELS+1)/2); for(i=0;irowCount();i++) { for(j=0;(j<2)&(i*2+jsetChecked(mask.test(i*2+j)); ui.maskTableWidget->setCellWidget(i,j,cb); } } ui.deduplicateCheckBox->setChecked(deduplicate); if(lf.exec()==QDialog::Accepted) { for(i=0;irowCount();i++) { for(j=0;(j<2)&(i*2+jcellWidget(i,j); mask.set(i*2+j,cb->isChecked()); } } deduplicate=ui.deduplicateCheckBox->isChecked(); } } void logFile::readSettings() { QSettings qSettings; qSettings.beginGroup ("logging"); mask=qSettings.value("mask",1).toULongLong(); deduplicate=qSettings.value("deduplicate",true).toBool(); qSettings.endGroup(); } void logFile::writeSettings() { QSettings qSettings; qSettings.beginGroup ("logging"); qSettings.setValue ( "mask", (qulonglong)mask.to_ulong()); qSettings.setValue ( "deduplicate", deduplicate); qSettings.endGroup(); } qsstv_9.2.6/qsstv/utils/logging.h0000664000175000017500000000242713203343610015551 0ustar jomajoma #ifndef LOGGING_H #define LOGGING_H #include #include #include #include #include #include #include "loggingparams.h" #ifndef QT_NO_DEBUG #define ENABLELOGGING #endif #define errorOut() qDebug() #ifdef ENABLELOGGING #define addToLog(x,y) logFilePtr->add(__FILE__,__func__,__LINE__,x,y) #else #define addToLog(x,y) {} #endif class QTextStream; class logFile { public: logFile(); logFile(QString logname); ~logFile(); bool open(QString logname); void add(QString t,short unsigned int posMask); void add(const char *fileName,const char *functionName, int line, QString t,short unsigned int posMask); void dummyAdd(QString,int) {} void addToAux(QString t); bool setEnabled(bool e); void setLogMask(std::bitset logMask); void maskSelect(QWidget *wPtr=0); void readSettings(); void writeSettings(); void close(); void reset(); bool reopen(); private: QString tmp; QString tmp2; QFile *lf; QTextStream *ts; QFile *auxFile; QTextStream *auxTs; bool enabled; QMutex mutex; QTime timer; std::bitset mask; QString savedLogEntry; int logCount; int savedPosMask; bool deduplicate; }; #endif qsstv_9.2.6/qsstv/utils/loggingform.ui0000664000175000017500000000513613203343610016623 0ustar jomajoma loggingForm Qt::WindowModal 0 0 449 459 Logging Selector true 10 2 false 200 false 200 false Deduplicate Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() loggingForm accept() 248 254 157 274 buttonBox rejected() loggingForm reject() 316 260 286 274 qsstv_9.2.6/qsstv/utils/loggingparams.cpp0000664000175000017500000000424113203343610017304 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "loggingparams.h" QString levelStr[NUMDEBUGLEVELS]= { "GALLERY ", "PARAMS ", "FFT ", "WAVIO ", "SYNTHES ", "DISPATC ", "SOUNDIO ", "RXFUNC ", "TXFUNC ", "SYNCSTATE", "SYNCPROCESSSTATE", "SYNCEXTR ", "SYNCEVAL", "SYNCACC ", "SYNCREJ ", "SYNCMATCH", "SYNCLOST", "SLANTAD ", "MODES ", "FTP ", "IMAGE ", "SCOPE ", "CAM ", "RX MAIN ", "TX MAIN ", "EDITOR ", "RIGCTRL ", "DRMDEMOD ", "DRMRXSRC ", "DRMMOT ", "DRMTX ", "DRMTXMOT ", "DRMTXCOD ", "DRMTXAAA ", "XMLRPC ", "FSKID ", "VISCODE ", "RETRACE ", "CALIBRATE", "NOTIFY ", "PERFORM " }; qsstv_9.2.6/qsstv/utils/loggingparams.h0000664000175000017500000000131713203343610016752 0ustar jomajoma#ifndef LOGGINGPARAMS_H #define LOGGINGPARAMS_H #include enum debugLevels {LOGGALLERY,LOGPARAM,LOGFFT,LOGWAVIO,LOGSYNTHES,LOGDISPATCH,LOGSOUND, LOGRXFUNC,LOGTXFUNC,LOGSYNCSTATE,LOGSYNCPROCESSSTATE,LOGSYNCEXTRACT,LOGSYNCEVAL,LOGSYNCACCEPTED,LOGSYNCREJECTED,LOGSYNCMATCH,LOGSYNCLOST,LOGSLANT, LOGMODES,LOGFTP,LOGIMAG,LOGSCOPE,LOGCAM,LOGRXMAIN,LOGTXMAIN,LOGEDIT,LOGRIGCTRL, LOGDRMDEMOD,LOGDRMSRC,LOGDRMMOT,LOGDRMTX,LOGDRMTXMOT,LOGDRMTXCOD,LOGDRMTXAAA,LOGXML, LOGFSKID,LOGVISCODE,LOGRETRACE,LOGCALIB,LOGNOTIFY,LOGPERFORM,LOGALL=99}; #define NUMDEBUGLEVELS (LOGPERFORM+1) extern QString levelStr[NUMDEBUGLEVELS]; #endif // LOGGINGPARAMS_H qsstv_9.2.6/qsstv/utils/macroexpansion.cpp0000664000175000017500000000171313203343610017501 0ustar jomajoma#include "macroexpansion.h" macroExpansion::macroExpansion() { convertList.clear(); } QString macroExpansion::convert(QString txt) { int i,j; bool special=false; QChar c; QString convertedText; { for (i=0;i #include struct sconvert { QChar tag; QString replacement; }; class macroExpansion { public: macroExpansion(); QString convert(QString txt); void addConversion(QChar tag,QString value); void clear() {convertList.clear();} private: QList convertList; }; #endif // MACROEXPANSION_H qsstv_9.2.6/qsstv/utils/qftp.cpp0000664000175000017500000022614113203343610015431 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qglobal.h" #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include "qftp.h" #include "qabstractsocket.h" #ifndef QT_NO_FTP #include "qcoreapplication.h" #include "qtcpsocket.h" #include "qurlinfo.h" #include "qstringlist.h" #include "qregexp.h" #include "qtimer.h" #include "qfileinfo.h" #include "qhash.h" #include "qtcpserver.h" #include "qlocale.h" QT_BEGIN_NAMESPACE class QFtpPI; /* The QFtpDTP (DTP = Data Transfer Process) controls all client side data transfer between the client and server. */ class QFtpDTP : public QObject { Q_OBJECT public: enum ConnectState { CsHostFound, CsConnected, CsClosed, CsHostNotFound, CsConnectionRefused }; QFtpDTP(QFtpPI *p, QObject *parent = 0); void setData(QByteArray *); void setDevice(QIODevice *); void writeData(); void setBytesTotal(qint64 bytes); bool hasError() const; QString errorMessage() const; void clearError(); void connectToHost(const QString & host, quint16 port); int setupListener(const QHostAddress &address); void waitForConnection(); QTcpSocket::SocketState state() const; qint64 bytesAvailable() const; qint64 read(char *data, qint64 maxlen); QByteArray readAll(); void abortConnection(); static bool parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info); signals: void listInfo(const QUrlInfo&); void readyRead(); void dataTransferProgress(qint64, qint64); void connectState(int); private slots: void socketConnected(); void socketReadyRead(); void socketError(QAbstractSocket::SocketError); void socketConnectionClosed(); void socketBytesWritten(qint64); void setupSocket(); void dataReadyRead(); private: void clearData(); QTcpSocket *socket; QTcpServer listener; QFtpPI *pi; QString err; qint64 bytesDone; qint64 bytesTotal; bool callWriteData; // If is_ba is true, ba is used; ba is never 0. // Otherwise dev is used; dev can be 0 or not. union { QByteArray *ba; QIODevice *dev; } data; bool is_ba; QByteArray bytesFromSocket; }; /********************************************************************** * * QFtpPI - Protocol Interpreter * *********************************************************************/ class QFtpPI : public QObject { Q_OBJECT public: QFtpPI(QObject *parent = 0); void connectToHost(const QString &host, quint16 port); bool sendCommands(const QStringList &cmds); bool sendCommand(const QString &cmd) { return sendCommands(QStringList(cmd)); } void clearPendingCommands(); void abort(); QString currentCommand() const { return currentCmd; } bool rawCommand; bool transferConnectionExtended; QFtpDTP dtp; // the PI has a DTP which is not the design of RFC 959, but it // makes the design simpler this way signals: void connectState(int); void finished(const QString&); void error(int, const QString&); void rawFtpReply(int, const QString&); private slots: void hostFound(); void connected(); void connectionClosed(); void delayedCloseFinished(); void readyRead(); void error(QAbstractSocket::SocketError); void dtpConnectState(int); private: // the states are modelled after the generalized state diagram of RFC 959, // page 58 enum State { Begin, Idle, Waiting, Success, Failure }; enum AbortState { None, AbortStarted, WaitForAbortToFinish }; bool processReply(); bool startNextCmd(); QTcpSocket commandSocket; QString replyText; char replyCode[3]; State state; AbortState abortState; QStringList pendingCommands; QString currentCmd; bool waitForDtpToConnect; bool waitForDtpToClose; QByteArray bytesFromSocket; friend class QFtpDTP; }; /********************************************************************** * * QFtpCommand implemenatation * *********************************************************************/ class QFtpCommand { public: QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba); QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice *dev = 0); ~QFtpCommand(); int id; QFtp::Command command; QStringList rawCmds; // If is_ba is true, ba is used; ba is never 0. // Otherwise dev is used; dev can be 0 or not. union { QByteArray *ba; QIODevice *dev; } data; bool is_ba; static QBasicAtomicInt idCounter; }; QBasicAtomicInt QFtpCommand::idCounter = Q_BASIC_ATOMIC_INITIALIZER(1); QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba) : command(cmd), rawCmds(raw), is_ba(true) { id = idCounter.fetchAndAddRelaxed(1); data.ba = new QByteArray(ba); } QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice *dev) : command(cmd), rawCmds(raw), is_ba(false) { id = idCounter.fetchAndAddRelaxed(1); data.dev = dev; } QFtpCommand::~QFtpCommand() { if (is_ba) delete data.ba; } /********************************************************************** * * QFtpDTP implemenatation * *********************************************************************/ QFtpDTP::QFtpDTP(QFtpPI *p, QObject *parent) : QObject(parent), socket(0), listener(this), pi(p), callWriteData(false) { clearData(); listener.setObjectName(QLatin1String("QFtpDTP active state server")); connect(&listener, SIGNAL(newConnection()), SLOT(setupSocket())); } void QFtpDTP::setData(QByteArray *ba) { is_ba = true; data.ba = ba; } void QFtpDTP::setDevice(QIODevice *dev) { is_ba = false; data.dev = dev; } void QFtpDTP::setBytesTotal(qint64 bytes) { bytesTotal = bytes; bytesDone = 0; emit dataTransferProgress(bytesDone, bytesTotal); } void QFtpDTP::connectToHost(const QString & host, quint16 port) { bytesFromSocket.clear(); if (socket) { delete socket; socket = 0; } socket = new QTcpSocket(this); #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket socket->setProperty("_q_networksession", property("_q_networksession")); #endif socket->setObjectName(QLatin1String("QFtpDTP Passive state socket")); connect(socket, SIGNAL(connected()), SLOT(socketConnected())); connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), SLOT(socketConnectionClosed())); connect(socket, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))); socket->connectToHost(host, port); } int QFtpDTP::setupListener(const QHostAddress &address) { #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket listener.setProperty("_q_networksession", property("_q_networksession")); #endif if (!listener.isListening() && !listener.listen(address, 0)) return -1; return listener.serverPort(); } void QFtpDTP::waitForConnection() { // This function is only interesting in Active transfer mode; it works // around a limitation in QFtp's design by blocking, waiting for an // incoming connection. For the default Passive mode, it does nothing. if (listener.isListening()) listener.waitForNewConnection(); } QTcpSocket::SocketState QFtpDTP::state() const { return socket ? socket->state() : QTcpSocket::UnconnectedState; } qint64 QFtpDTP::bytesAvailable() const { if (!socket || socket->state() != QTcpSocket::ConnectedState) return (qint64) bytesFromSocket.size(); return socket->bytesAvailable(); } qint64 QFtpDTP::read(char *data, qint64 maxlen) { qint64 read; if (socket && socket->state() == QTcpSocket::ConnectedState) { read = socket->read(data, maxlen); } else { read = qMin(maxlen, qint64(bytesFromSocket.size())); memcpy(data, bytesFromSocket.data(), read); bytesFromSocket.remove(0, read); } bytesDone += read; return read; } QByteArray QFtpDTP::readAll() { QByteArray tmp; if (socket && socket->state() == QTcpSocket::ConnectedState) { tmp = socket->readAll(); bytesDone += tmp.size(); } else { tmp = bytesFromSocket; bytesFromSocket.clear(); } return tmp; } void QFtpDTP::writeData() { if (!socket) return; if (is_ba) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::writeData: write %d bytes", data.ba->size()); #endif if (data.ba->size() == 0) emit dataTransferProgress(0, bytesTotal); else socket->write(data.ba->data(), data.ba->size()); socket->close(); clearData(); } else if (data.dev) { callWriteData = false; const qint64 blockSize = 16*1024; char buf[16*1024]; qint64 read = data.dev->read(buf, blockSize); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::writeData: write() of size %lli bytes", read); #endif if (read > 0) { socket->write(buf, read); } else if (read == -1 || (!data.dev->isSequential() && data.dev->atEnd())) { // error or EOF if (bytesDone == 0 && socket->bytesToWrite() == 0) emit dataTransferProgress(0, bytesTotal); socket->close(); clearData(); } // do we continue uploading? callWriteData = data.dev != 0; } } void QFtpDTP::dataReadyRead() { writeData(); } inline bool QFtpDTP::hasError() const { return !err.isNull(); } inline QString QFtpDTP::errorMessage() const { return err; } inline void QFtpDTP::clearError() { err.clear(); } void QFtpDTP::abortConnection() { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::abortConnection, bytesAvailable == %lli", socket ? socket->bytesAvailable() : (qint64) 0); #endif callWriteData = false; clearData(); if (socket) socket->abort(); } static void _q_fixupDateTime(QDateTime *dateTime) { // Adjust for future tolerance. const int futureTolerance = 86400; if (dateTime->secsTo(QDateTime::currentDateTime()) < -futureTolerance) { QDate d = dateTime->date(); d.setDate(d.year() - 1, d.month(), d.day()); dateTime->setDate(d); } } static void _q_parseUnixDir(const QStringList &tokens, const QString &userName, QUrlInfo *info) { // Unix style, 7 + 1 entries // -rw-r--r-- 1 ftp ftp 17358091 Aug 10 2004 qt-x11-free-3.3.3.tar.gz // drwxr-xr-x 3 ftp ftp 4096 Apr 14 2000 compiled-examples // lrwxrwxrwx 1 ftp ftp 9 Oct 29 2005 qtscape -> qtmozilla if (tokens.size() != 8) return; char first = tokens.at(1).at(0).toLatin1(); if (first == 'd') { info->setDir(true); info->setFile(false); info->setSymLink(false); } else if (first == '-') { info->setDir(false); info->setFile(true); info->setSymLink(false); } else if (first == 'l') { info->setDir(true); info->setFile(false); info->setSymLink(true); } // Resolve filename QString name = tokens.at(7); if (info->isSymLink()) { int linkPos = name.indexOf(QLatin1String(" ->")); if (linkPos != -1) name.resize(linkPos); } info->setName(name); // Resolve owner & group info->setOwner(tokens.at(3)); info->setGroup(tokens.at(4)); // Resolve size info->setSize(tokens.at(5).toLongLong()); QStringList formats; formats << QLatin1String("MMM dd yyyy") << QLatin1String("MMM dd hh:mm") << QLatin1String("MMM d yyyy") << QLatin1String("MMM d hh:mm") << QLatin1String("MMM d yyyy") << QLatin1String("MMM dd yyyy"); QString dateString = tokens.at(6); dateString[0] = dateString[0].toUpper(); // Resolve the modification date by parsing all possible formats QDateTime dateTime; int n = 0; #ifndef QT_NO_DATESTRING do { dateTime = QLocale::c().toDateTime(dateString, formats.at(n++)); } while (n < formats.size() && (!dateTime.isValid())); #endif if (n == 2 || n == 4) { // Guess the year. dateTime.setDate(QDate(QDate::currentDate().year(), dateTime.date().month(), dateTime.date().day())); _q_fixupDateTime(&dateTime); } if (dateTime.isValid()) info->setLastModified(dateTime); // Resolve permissions int permissions = 0; QString p = tokens.at(2); permissions |= (p[0] == QLatin1Char('r') ? QUrlInfo::ReadOwner : 0); permissions |= (p[1] == QLatin1Char('w') ? QUrlInfo::WriteOwner : 0); permissions |= (p[2] == QLatin1Char('x') ? QUrlInfo::ExeOwner : 0); permissions |= (p[3] == QLatin1Char('r') ? QUrlInfo::ReadGroup : 0); permissions |= (p[4] == QLatin1Char('w') ? QUrlInfo::WriteGroup : 0); permissions |= (p[5] == QLatin1Char('x') ? QUrlInfo::ExeGroup : 0); permissions |= (p[6] == QLatin1Char('r') ? QUrlInfo::ReadOther : 0); permissions |= (p[7] == QLatin1Char('w') ? QUrlInfo::WriteOther : 0); permissions |= (p[8] == QLatin1Char('x') ? QUrlInfo::ExeOther : 0); info->setPermissions(permissions); bool isOwner = info->owner() == userName; info->setReadable((permissions & QUrlInfo::ReadOther) || ((permissions & QUrlInfo::ReadOwner) && isOwner)); info->setWritable((permissions & QUrlInfo::WriteOther) || ((permissions & QUrlInfo::WriteOwner) && isOwner)); } static void _q_parseDosDir(const QStringList &tokens, const QString &userName, QUrlInfo *info) { // DOS style, 3 + 1 entries // 01-16-02 11:14AM epsgroup // 06-05-03 03:19PM 1973 readme.txt if (tokens.size() != 4) return; Q_UNUSED(userName); QString name = tokens.at(3); info->setName(name); info->setSymLink(name.toLower().endsWith(QLatin1String(".lnk"))); if (tokens.at(2) == QLatin1String("")) { info->setFile(false); info->setDir(true); } else { info->setFile(true); info->setDir(false); info->setSize(tokens.at(2).toLongLong()); } // Note: We cannot use QFileInfo; permissions are for the server-side // machine, and QFileInfo's behavior depends on the local platform. int permissions = QUrlInfo::ReadOwner | QUrlInfo::WriteOwner | QUrlInfo::ReadGroup | QUrlInfo::WriteGroup | QUrlInfo::ReadOther | QUrlInfo::WriteOther; QString ext; int extIndex = name.lastIndexOf(QLatin1Char('.')); if (extIndex != -1) ext = name.mid(extIndex + 1); if (ext == QLatin1String("exe") || ext == QLatin1String("bat") || ext == QLatin1String("com")) permissions |= QUrlInfo::ExeOwner | QUrlInfo::ExeGroup | QUrlInfo::ExeOther; info->setPermissions(permissions); info->setReadable(true); info->setWritable(info->isFile()); QDateTime dateTime; #ifndef QT_NO_DATESTRING dateTime = QLocale::c().toDateTime(tokens.at(1), QLatin1String("MM-dd-yy hh:mmAP")); if (dateTime.date().year() < 1971) { dateTime.setDate(QDate(dateTime.date().year() + 100, dateTime.date().month(), dateTime.date().day())); } #endif info->setLastModified(dateTime); } bool QFtpDTP::parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info) { if (buffer.isEmpty()) return false; QString bufferStr = QString::fromLatin1(buffer).trimmed(); // Unix style FTP servers QRegExp unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+" "(\\S*)\\s+(\\d+)\\s+(\\S+\\s+\\S+\\s+\\S+)\\s+(\\S.*)")); if (unixPattern.indexIn(bufferStr) == 0) { _q_parseUnixDir(unixPattern.capturedTexts(), userName, info); return true; } // DOS style FTP servers QRegExp dosPattern(QLatin1String("^(\\d\\d-\\d\\d-\\d\\d\\d?\\d?\\ \\ \\d\\d:\\d\\d[AP]M)\\s+" "(|\\d+)\\s+(\\S.*)$")); if (dosPattern.indexIn(bufferStr) == 0) { _q_parseDosDir(dosPattern.capturedTexts(), userName, info); return true; } // Unsupported return false; } void QFtpDTP::socketConnected() { bytesDone = 0; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsConnected)"); #endif emit connectState(QFtpDTP::CsConnected); } void QFtpDTP::socketReadyRead() { if (!socket) return; if (pi->currentCommand().isEmpty()) { socket->close(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsClosed)"); #endif emit connectState(QFtpDTP::CsClosed); return; } if (pi->abortState == QFtpPI::AbortStarted) { // discard data socket->readAll(); return; } if (pi->currentCommand().startsWith(QLatin1String("LIST"))) { while (socket->canReadLine()) { QUrlInfo i; QByteArray line = socket->readLine(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP read (list): '%s'", line.constData()); #endif if (parseDir(line, QLatin1String(""), &i)) { emit listInfo(i); } else { // some FTP servers don't return a 550 if the file or directory // does not exist, but rather write a text to the data socket // -- try to catch these cases if (line.endsWith("No such file or directory\r\n")) err = QString::fromLatin1(line); } } } else { if (!is_ba && data.dev) { do { QByteArray ba; ba.resize(socket->bytesAvailable()); qint64 bytesRead = socket->read(ba.data(), ba.size()); if (bytesRead < 0) { // a read following a readyRead() signal will // never fail. return; } ba.resize(bytesRead); bytesDone += bytesRead; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP read: %lli bytes (total %lli bytes)", bytesRead, bytesDone); #endif if (data.dev) // make sure it wasn't deleted in the slot data.dev->write(ba); emit dataTransferProgress(bytesDone, bytesTotal); // Need to loop; dataTransferProgress is often connected to // slots that update the GUI (e.g., progress bar values), and // if events are processed, more data may have arrived. } while (socket->bytesAvailable()); } else { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP readyRead: %lli bytes available (total %lli bytes read)", bytesAvailable(), bytesDone); #endif emit dataTransferProgress(bytesDone+socket->bytesAvailable(), bytesTotal); emit readyRead(); } } } void QFtpDTP::socketError(QAbstractSocket::SocketError e) { if (e == QTcpSocket::HostNotFoundError) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsHostNotFound)"); #endif emit connectState(QFtpDTP::CsHostNotFound); } else if (e == QTcpSocket::ConnectionRefusedError) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsConnectionRefused)"); #endif emit connectState(QFtpDTP::CsConnectionRefused); } } void QFtpDTP::socketConnectionClosed() { if (!is_ba && data.dev) { clearData(); } // bytesFromSocket = socket->readAll(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsClosed)"); #endif emit connectState(QFtpDTP::CsClosed); } void QFtpDTP::socketBytesWritten(qint64 bytes) { bytesDone += bytes; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::bytesWritten(%lli)", bytesDone); #endif emit dataTransferProgress(bytesDone, bytesTotal); if (callWriteData) writeData(); } void QFtpDTP::setupSocket() { socket = listener.nextPendingConnection(); socket->setObjectName(QLatin1String("QFtpDTP Active state socket")); connect(socket, SIGNAL(connected()), SLOT(socketConnected())); connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), SLOT(socketConnectionClosed())); connect(socket, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))); listener.close(); } void QFtpDTP::clearData() { is_ba = false; data.dev = 0; } /********************************************************************** * * QFtpPI implemenatation * *********************************************************************/ QFtpPI::QFtpPI(QObject *parent) : QObject(parent), rawCommand(false), transferConnectionExtended(true), dtp(this), commandSocket(0), state(Begin), abortState(None), currentCmd(QString()), waitForDtpToConnect(false), waitForDtpToClose(false) { commandSocket.setObjectName(QLatin1String("QFtpPI_socket")); connect(&commandSocket, SIGNAL(hostFound()), SLOT(hostFound())); connect(&commandSocket, SIGNAL(connected()), SLOT(connected())); connect(&commandSocket, SIGNAL(disconnected()), SLOT(connectionClosed())); connect(&commandSocket, SIGNAL(readyRead()), SLOT(readyRead())); connect(&commandSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(error(QAbstractSocket::SocketError))); connect(&dtp, SIGNAL(connectState(int)), SLOT(dtpConnectState(int))); } void QFtpPI::connectToHost(const QString &host, quint16 port) { emit connectState(QFtp::HostLookup); #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket & DTP commandSocket.setProperty("_q_networksession", property("_q_networksession")); dtp.setProperty("_q_networksession", property("_q_networksession")); #endif commandSocket.connectToHost(host, port); } /* Sends the sequence of commands \a cmds to the FTP server. When the commands are all done the finished() signal is emitted. When an error occurs, the error() signal is emitted. If there are pending commands in the queue this functions returns false and the \a cmds are not added to the queue; otherwise it returns true. */ bool QFtpPI::sendCommands(const QStringList &cmds) { if (!pendingCommands.isEmpty()) return false; if (commandSocket.state() != QTcpSocket::ConnectedState || state!=Idle) { emit error(QFtp::NotConnected, QFtp::tr("Not connected")); return true; // there are no pending commands } pendingCommands = cmds; startNextCmd(); return true; } void QFtpPI::clearPendingCommands() { pendingCommands.clear(); dtp.abortConnection(); currentCmd.clear(); state = Idle; } void QFtpPI::abort() { pendingCommands.clear(); if (abortState != None) // ABOR already sent return; abortState = AbortStarted; #if defined(QFTPPI_DEBUG) qDebug("QFtpPI send: ABOR"); #endif commandSocket.write("ABOR\r\n", 6); if (currentCmd.startsWith(QLatin1String("STOR "))) dtp.abortConnection(); } void QFtpPI::hostFound() { emit connectState(QFtp::Connecting); } void QFtpPI::connected() { state = Begin; #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [connected()]", state); #endif // try to improve performance by setting TCP_NODELAY commandSocket.setSocketOption(QAbstractSocket::LowDelayOption, 1); emit connectState(QFtp::Connected); } void QFtpPI::connectionClosed() { commandSocket.close(); emit connectState(QFtp::Unconnected); } void QFtpPI::delayedCloseFinished() { emit connectState(QFtp::Unconnected); } void QFtpPI::error(QAbstractSocket::SocketError e) { if (e == QTcpSocket::HostNotFoundError) { emit connectState(QFtp::Unconnected); emit error(QFtp::HostNotFound, QFtp::tr("Host %1 not found").arg(commandSocket.peerName())); } else if (e == QTcpSocket::ConnectionRefusedError) { emit connectState(QFtp::Unconnected); emit error(QFtp::ConnectionRefused, QFtp::tr("Connection refused to host %1").arg(commandSocket.peerName())); } else if (e == QTcpSocket::SocketTimeoutError) { emit connectState(QFtp::Unconnected); emit error(QFtp::ConnectionRefused, QFtp::tr("Connection timed out to host %1").arg(commandSocket.peerName())); } } void QFtpPI::readyRead() { if (waitForDtpToClose) return; while (commandSocket.canReadLine()) { // read line with respect to line continuation QString line = QString::fromLatin1(commandSocket.readLine()); if (replyText.isEmpty()) { if (line.length() < 3) { // protocol error return; } const int lowerLimit[3] = {1,0,0}; const int upperLimit[3] = {5,5,9}; for (int i=0; i<3; i++) { replyCode[i] = line[i].digitValue(); if (replyCode[i]upperLimit[i]) { // protocol error return; } } } QString endOfMultiLine; endOfMultiLine[0] = '0' + replyCode[0]; endOfMultiLine[1] = '0' + replyCode[1]; endOfMultiLine[2] = '0' + replyCode[2]; endOfMultiLine[3] = QLatin1Char(' '); QString lineCont(endOfMultiLine); lineCont[3] = QLatin1Char('-'); QString lineLeft4 = line.left(4); while (lineLeft4 != endOfMultiLine) { if (lineLeft4 == lineCont) replyText += line.mid(4); // strip 'xyz-' else replyText += line; if (!commandSocket.canReadLine()) return; line = QString::fromLatin1(commandSocket.readLine()); lineLeft4 = line.left(4); } replyText += line.mid(4); // strip reply code 'xyz ' if (replyText.endsWith(QLatin1String("\r\n"))) replyText.chop(2); if (processReply()) replyText = QLatin1String(""); } } /* Process a reply from the FTP server. Returns true if the reply was processed or false if the reply has to be processed at a later point. */ bool QFtpPI::processReply() { #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() begin]", state); if (replyText.length() < 400) qDebug("QFtpPI recv: %d %s", 100*replyCode[0]+10*replyCode[1]+replyCode[2], replyText.toLatin1().constData()); else qDebug("QFtpPI recv: %d (text skipped)", 100*replyCode[0]+10*replyCode[1]+replyCode[2]); #endif int replyCodeInt = 100*replyCode[0] + 10*replyCode[1] + replyCode[2]; // process 226 replies ("Closing Data Connection") only when the data // connection is really closed to avoid short reads of the DTP if (replyCodeInt == 226 || (replyCodeInt == 250 && currentCmd.startsWith(QLatin1String("RETR")))) { if (dtp.state() != QTcpSocket::UnconnectedState) { waitForDtpToClose = true; return false; } } switch (abortState) { case AbortStarted: abortState = WaitForAbortToFinish; break; case WaitForAbortToFinish: abortState = None; return true; default: break; } // get new state static const State table[5] = { /* 1yz 2yz 3yz 4yz 5yz */ Waiting, Success, Idle, Failure, Failure }; switch (state) { case Begin: if (replyCode[0] == 1) { return true; } else if (replyCode[0] == 2) { state = Idle; emit finished(QFtp::tr("Connected to host %1").arg(commandSocket.peerName())); break; } // reply codes not starting with 1 or 2 are not handled. return true; case Waiting: if (static_cast(replyCode[0]) < 0 || replyCode[0] > 5) state = Failure; else #if defined(Q_OS_IRIX) && defined(Q_CC_GNU) { // work around a crash on 64 bit gcc IRIX State *t = (State *) table; state = t[replyCode[0] - 1]; } #else if (replyCodeInt == 202) state = Failure; else state = table[replyCode[0] - 1]; #endif break; default: // ignore unrequested message return true; } #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() intermediate]", state); #endif // special actions on certain replies emit rawFtpReply(replyCodeInt, replyText); if (rawCommand) { rawCommand = false; } else if (replyCodeInt == 227) { // 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2) // rfc959 does not define this response precisely, and gives // both examples where the parenthesis are used, and where // they are missing. We need to scan for the address and host // info. QRegExp addrPortPattern(QLatin1String("(\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)")); if (addrPortPattern.indexIn(replyText) == -1) { #if defined(QFTPPI_DEBUG) qDebug("QFtp: bad 227 response -- address and port information missing"); #endif // this error should be reported } else { QStringList lst = addrPortPattern.capturedTexts(); QString host = lst[1] + QLatin1Char('.') + lst[2] + QLatin1Char('.') + lst[3] + QLatin1Char('.') + lst[4]; quint16 port = (lst[5].toUInt() << 8) + lst[6].toUInt(); waitForDtpToConnect = true; dtp.connectToHost(host, port); } } else if (replyCodeInt == 229) { // 229 Extended Passive mode OK (|||10982|) int portPos = replyText.indexOf(QLatin1Char('(')); if (portPos == -1) { #if defined(QFTPPI_DEBUG) qDebug("QFtp: bad 229 response -- port information missing"); #endif // this error should be reported } else { ++portPos; QChar delimiter = replyText.at(portPos); QStringList epsvParameters = replyText.mid(portPos).split(delimiter); waitForDtpToConnect = true; dtp.connectToHost(commandSocket.peerAddress().toString(), epsvParameters.at(3).toInt()); } } else if (replyCodeInt == 230) { if (currentCmd.startsWith(QLatin1String("USER ")) && pendingCommands.count()>0 && pendingCommands.first().startsWith(QLatin1String("PASS "))) { // no need to send the PASS -- we are already logged in pendingCommands.pop_front(); } // 230 User logged in, proceed. emit connectState(QFtp::LoggedIn); } else if (replyCodeInt == 213) { // 213 File status. if (currentCmd.startsWith(QLatin1String("SIZE "))) dtp.setBytesTotal(replyText.simplified().toLongLong()); } else if (replyCode[0]==1 && currentCmd.startsWith(QLatin1String("STOR "))) { dtp.waitForConnection(); dtp.writeData(); } // react on new state switch (state) { case Begin: // should never happen break; case Success: // success handling state = Idle; // no break! case Idle: if (dtp.hasError()) { emit error(QFtp::UnknownError, dtp.errorMessage()); dtp.clearError(); } startNextCmd(); break; case Waiting: // do nothing break; case Failure: // If the EPSV or EPRT commands fail, replace them with // the old PASV and PORT instead and try again. if (currentCmd.startsWith(QLatin1String("EPSV"))) { transferConnectionExtended = false; pendingCommands.prepend(QLatin1String("PASV\r\n")); } else if (currentCmd.startsWith(QLatin1String("EPRT"))) { transferConnectionExtended = false; pendingCommands.prepend(QLatin1String("PORT\r\n")); } else { emit error(QFtp::UnknownError, replyText); } if (state != Waiting) { state = Idle; startNextCmd(); } break; } #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() end]", state); #endif return true; } /* Starts next pending command. Returns false if there are no pending commands, otherwise it returns true. */ bool QFtpPI::startNextCmd() { if (waitForDtpToConnect) // don't process any new commands until we are connected return true; #if defined(QFTPPI_DEBUG) if (state != Idle) qDebug("QFtpPI startNextCmd: Internal error! QFtpPI called in non-Idle state %d", state); #endif if (pendingCommands.isEmpty()) { currentCmd.clear(); emit finished(replyText); return false; } currentCmd = pendingCommands.first(); // PORT and PASV are edited in-place, depending on whether we // should try the extended transfer connection commands EPRT and // EPSV. The PORT command also triggers setting up a listener, and // the address/port arguments are edited in. QHostAddress address = commandSocket.localAddress(); if (currentCmd.startsWith(QLatin1String("PORT"))) { if ((address.protocol() == QTcpSocket::IPv6Protocol) && transferConnectionExtended) { int port = dtp.setupListener(address); currentCmd = QLatin1String("EPRT |"); currentCmd += (address.protocol() == QTcpSocket::IPv4Protocol) ? QLatin1Char('1') : QLatin1Char('2'); currentCmd += QLatin1Char('|') + address.toString() + QLatin1Char('|') + QString::number(port); currentCmd += QLatin1Char('|'); } else if (address.protocol() == QTcpSocket::IPv4Protocol) { int port = dtp.setupListener(address); QString portArg; quint32 ip = address.toIPv4Address(); portArg += QString::number((ip & 0xff000000) >> 24); portArg += QLatin1Char(',') + QString::number((ip & 0xff0000) >> 16); portArg += QLatin1Char(',') + QString::number((ip & 0xff00) >> 8); portArg += QLatin1Char(',') + QString::number(ip & 0xff); portArg += QLatin1Char(',') + QString::number((port & 0xff00) >> 8); portArg += QLatin1Char(',') + QString::number(port & 0xff); currentCmd = QLatin1String("PORT "); currentCmd += portArg; } else { // No IPv6 connection can be set up with the PORT // command. return false; } currentCmd += QLatin1String("\r\n"); } else if (currentCmd.startsWith(QLatin1String("PASV"))) { if ((address.protocol() == QTcpSocket::IPv6Protocol) && transferConnectionExtended) currentCmd = QLatin1String("EPSV\r\n"); } pendingCommands.pop_front(); #if defined(QFTPPI_DEBUG) qDebug("QFtpPI send: %s", currentCmd.left(currentCmd.length()-2).toLatin1().constData()); #endif state = Waiting; commandSocket.write(currentCmd.toLatin1()); return true; } void QFtpPI::dtpConnectState(int s) { switch (s) { case QFtpDTP::CsClosed: if (waitForDtpToClose) { // there is an unprocessed reply if (processReply()) replyText = QLatin1String(""); else return; } waitForDtpToClose = false; readyRead(); return; case QFtpDTP::CsConnected: waitForDtpToConnect = false; startNextCmd(); return; case QFtpDTP::CsHostNotFound: case QFtpDTP::CsConnectionRefused: emit error(QFtp::ConnectionRefused, QFtp::tr("Connection refused for data connection")); startNextCmd(); return; default: return; } } /********************************************************************** * * QFtpPrivate * *********************************************************************/ class QFtpPrivate { Q_DECLARE_PUBLIC(QFtp) public: inline QFtpPrivate(QFtp *owner) : close_waitForStateChange(false), state(QFtp::Unconnected), transferMode(QFtp::Passive), error(QFtp::NoError), q_ptr(owner) { } ~QFtpPrivate() { while (!pending.isEmpty()) delete pending.takeFirst(); } // private slots void _q_startNextCommand(); void _q_piFinished(const QString&); void _q_piError(int, const QString&); void _q_piConnectState(int); void _q_piFtpReply(int, const QString&); int addCommand(QFtpCommand *cmd); QFtpPI pi; QList pending; bool close_waitForStateChange; QFtp::State state; QFtp::TransferMode transferMode; QFtp::Error error; QString errorString; QString host; quint16 port; QString proxyHost; quint16 proxyPort; QFtp *q_ptr; }; int QFtpPrivate::addCommand(QFtpCommand *cmd) { pending.append(cmd); if (pending.count() == 1) { // don't emit the commandStarted() signal before the ID is returned QTimer::singleShot(0, q_func(), SLOT(_q_startNextCommand())); } return cmd->id; } /********************************************************************** * * QFtp implementation * *********************************************************************/ /*! \class QFtp \brief The QFtp class provides an implementation of the client side of FTP protocol. \ingroup network \inmodule QtNetwork This class provides a direct interface to FTP that allows you to have more control over the requests. However, for new applications, it is recommended to use QNetworkAccessManager and QNetworkReply, as those classes possess a simpler, yet more powerful API. The class works asynchronously, so there are no blocking functions. If an operation cannot be executed immediately, the function will still return straight away and the operation will be scheduled for later execution. The results of scheduled operations are reported via signals. This approach depends on the event loop being in operation. The operations that can be scheduled (they are called "commands" in the rest of the documentation) are the following: connectToHost(), login(), close(), list(), cd(), get(), put(), remove(), mkdir(), rmdir(), rename() and rawCommand(). All of these commands return a unique identifier that allows you to keep track of the command that is currently being executed. When the execution of a command starts, the commandStarted() signal with the command's identifier is emitted. When the command is finished, the commandFinished() signal is emitted with the command's identifier and a bool that indicates whether the command finished with an error. In some cases, you might want to execute a sequence of commands, e.g. if you want to connect and login to a FTP server. This is simply achieved: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 0 In this case two FTP commands have been scheduled. When the last scheduled command has finished, a done() signal is emitted with a bool argument that tells you whether the sequence finished with an error. If an error occurs during the execution of one of the commands in a sequence of commands, all the pending commands (i.e. scheduled, but not yet executed commands) are cleared and no signals are emitted for them. Some commands, e.g. list(), emit additional signals to report their results. Example: If you want to download the INSTALL file from the Qt FTP server, you would write this: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 1 For this example the following sequence of signals is emitted (with small variations, depending on network traffic, etc.): \snippet doc/src/snippets/code/src_network_access_qftp.cpp 2 The dataTransferProgress() signal in the above example is useful if you want to show a \link QProgressBar progress bar \endlink to inform the user about the progress of the download. The readyRead() signal tells you that there is data ready to be read. The amount of data can be queried then with the bytesAvailable() function and it can be read with the read() or readAll() function. If the login fails for the above example, the signals would look like this: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 3 You can then get details about the error with the error() and errorString() functions. For file transfer, QFtp can use both active or passive mode, and it uses passive file transfer mode by default; see the documentation for setTransferMode() for more details about this. Call setProxy() to make QFtp connect via an FTP proxy server. The functions currentId() and currentCommand() provide more information about the currently executing command. The functions hasPendingCommands() and clearPendingCommands() allow you to query and clear the list of pending commands. If you are an experienced network programmer and want to have complete control you can use rawCommand() to execute arbitrary FTP commands. \warning The current version of QFtp doesn't fully support non-Unix FTP servers. \sa QNetworkAccessManager, QNetworkRequest, QNetworkReply, {FTP Example} */ /*! Constructs a QFtp object with the given \a parent. */ QFtp::QFtp(QObject *parent) : QObject(parent), d(new QFtpPrivate(this)) { d->errorString = tr("Unknown error"); connect(&d->pi, SIGNAL(connectState(int)), SLOT(_q_piConnectState(int))); connect(&d->pi, SIGNAL(finished(QString)), SLOT(_q_piFinished(QString))); connect(&d->pi, SIGNAL(error(int,QString)), SLOT(_q_piError(int,QString))); connect(&d->pi, SIGNAL(rawFtpReply(int,QString)), SLOT(_q_piFtpReply(int,QString))); connect(&d->pi.dtp, SIGNAL(readyRead()), SIGNAL(readyRead())); connect(&d->pi.dtp, SIGNAL(dataTransferProgress(qint64,qint64)), SIGNAL(dataTransferProgress(qint64,qint64))); connect(&d->pi.dtp, SIGNAL(listInfo(QUrlInfo)), SIGNAL(listInfo(QUrlInfo))); } /*! \enum QFtp::State This enum defines the connection state: \var Unconnected There is no connection to the host. \var HostLookup A host name lookup is in progress. \var Connecting An attempt to connect to the host is in progress. \var Connected Connection to the host has been achieved. \var LoggedIn Connection and user login have been achieved. \var Closing The connection is closing down, but it is not yet closed. (The state will be \c Unconnected when the connection is closed.) \sa stateChanged() state() */ /*! \enum QFtp::TransferMode FTP works with two socket connections; one for commands and another for transmitting data. While the command connection is always initiated by the client, the second connection can be initiated by either the client or the server. This enum defines whether the client (Passive mode) or the server (Active mode) should set up the data connection. \var Passive The client connects to the server to transmit its data. \var Active The server connects to the client to transmit its data. */ /*! \enum QFtp::TransferType This enum identifies the data transfer type used with get and put commands. \var Binary The data will be transferred in Binary mode. \var Ascii The data will be transferred in Ascii mode and new line characters will be converted to the local format. */ /*! \enum QFtp::Error This enum identifies the error that occurred. \var NoError No error occurred. \var HostNotFound The host name lookup failed. \var ConnectionRefused The server refused the connection. \var NotConnected Tried to send a command, but there is no connection to a server. \var UnknownError An error other than those specified above occurred. \sa error() */ /*! \enum QFtp::Command This enum is used as the return value for the currentCommand() function. This allows you to perform specific actions for particular commands, e.g. in a FTP client, you might want to clear the directory view when a list() command is started; in this case you can simply check in the slot connected to the start() signal if the currentCommand() is \c List. \var None No command is being executed. \var SetTransferMode set the \link TransferMode transfer\endlink mode. \var SetProxy switch proxying on or off. \var ConnectToHost connectToHost() is being executed. \var Login login() is being executed. \var Close close() is being executed. \var List list() is being executed. \var Cd cd() is being executed. \var Get get() is being executed. \var Put put() is being executed. \var Remove remove() is being executed. \var Mkdir mkdir() is being executed. \var Rmdir rmdir() is being executed. \var Rename rename() is being executed. \var RawCommand rawCommand() is being executed. \sa currentCommand() */ /*! \fn void QFtp::stateChanged(int state) This signal is emitted when the state of the connection changes. The argument \a state is the new state of the connection; it is one of the \l State values. It is usually emitted in response to a connectToHost() or close() command, but it can also be emitted "spontaneously", e.g. when the server closes the connection unexpectedly. \sa connectToHost() close() state() State */ /*! \fn void QFtp::listInfo(const QUrlInfo &i); This signal is emitted for each directory entry the list() command finds. The details of the entry are stored in \a i. \sa list() */ /*! \fn void QFtp::commandStarted(int id) This signal is emitted when processing the command identified by \a id starts. \sa commandFinished() done() */ /*! \fn void QFtp::commandFinished(int id, bool error) This signal is emitted when processing the command identified by \a id has finished. \a error is true if an error occurred during the processing; otherwise \a error is false. \sa commandStarted() done() error() errorString() */ /*! \fn void QFtp::done(bool error) This signal is emitted when the last pending command has finished; (it is emitted after the last command's commandFinished() signal). \a error is true if an error occurred during the processing; otherwise \a error is false. \sa commandFinished() error() errorString() */ /*! \fn void QFtp::readyRead() This signal is emitted in response to a get() command when there is new data to read. If you specify a device as the second argument in the get() command, this signal is \e not emitted; instead the data is written directly to the device. You can read the data with the readAll() or read() functions. This signal is useful if you want to process the data in chunks as soon as it becomes available. If you are only interested in the complete data, just connect to the commandFinished() signal and read the data then instead. \sa get() read() readAll() bytesAvailable() */ /*! \fn void QFtp::dataTransferProgress(qint64 done, qint64 total) This signal is emitted in response to a get() or put() request to indicate the current progress of the download or upload. \a done is the amount of data that has already been transferred and \a total is the total amount of data to be read or written. It is possible that the QFtp class is not able to determine the total amount of data that should be transferred, in which case \a total is 0. (If you connect this signal to a QProgressBar, the progress bar shows a busy indicator if the total is 0). \warning \a done and \a total are not necessarily the size in bytes, since for large files these values might need to be "scaled" to avoid overflow. \sa get(), put(), QProgressBar */ /*! \fn void QFtp::rawCommandReply(int replyCode, const QString &detail); This signal is emitted in response to the rawCommand() function. \a replyCode is the 3 digit reply code and \a detail is the text that follows the reply code. \sa rawCommand() */ /*! Connects to the FTP server \a host using port \a port. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c HostLookup, then \c Connecting, then \c Connected. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa stateChanged() commandStarted() commandFinished() */ int QFtp::connectToHost(const QString &host, quint16 port) { QStringList cmds; cmds << host; cmds << QString::number((uint)port); int id = d->addCommand(new QFtpCommand(ConnectToHost, cmds)); d->pi.transferConnectionExtended = true; return id; } /*! Logs in to the FTP server with the username \a user and the password \a password. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c LoggedIn. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::login(const QString &user, const QString &password) { QStringList cmds; cmds << (QLatin1String("USER ") + (user.isNull() ? QLatin1String("anonymous") : user) + QLatin1String("\r\n")); cmds << (QLatin1String("PASS ") + (password.isNull() ? QLatin1String("anonymous@") : password) + QLatin1String("\r\n")); return d->addCommand(new QFtpCommand(Login, cmds)); } /*! Closes the connection to the FTP server. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c Closing, then \c Unconnected. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa stateChanged() commandStarted() commandFinished() */ int QFtp::close() { return d->addCommand(new QFtpCommand(Close, QStringList(QLatin1String("QUIT\r\n")))); } /*! Sets the current FTP transfer mode to \a mode. The default is QFtp::Passive. \sa QFtp::TransferMode */ int QFtp::setTransferMode(TransferMode mode) { int id = d->addCommand(new QFtpCommand(SetTransferMode, QStringList())); d->pi.transferConnectionExtended = true; d->transferMode = mode; return id; } /*! Enables use of the FTP proxy on host \a host and port \a port. Calling this function with \a host empty disables proxying. QFtp does not support FTP-over-HTTP proxy servers. Use QNetworkAccessManager for this. */ int QFtp::setProxy(const QString &host, quint16 port) { QStringList args; args << host << QString::number(port); return d->addCommand(new QFtpCommand(SetProxy, args)); } /*! Lists the contents of directory \a dir on the FTP server. If \a dir is empty, it lists the contents of the current directory. The listInfo() signal is emitted for each directory entry found. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa listInfo() commandStarted() commandFinished() */ int QFtp::list(const QString &dir) { QStringList cmds; cmds << QLatin1String("TYPE A\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); if (dir.isEmpty()) cmds << QLatin1String("LIST\r\n"); else cmds << (QLatin1String("LIST ") + dir + QLatin1String("\r\n")); return d->addCommand(new QFtpCommand(List, cmds)); } /*! Changes the working directory of the server to \a dir. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::cd(const QString &dir) { return d->addCommand(new QFtpCommand(Cd, QStringList(QLatin1String("CWD ") + dir + QLatin1String("\r\n")))); } /*! Downloads the file \a file from the server. If \a dev is 0, then the readyRead() signal is emitted when there is data available to read. You can then read the data with the read() or readAll() functions. If \a dev is not 0, the data is written directly to the device \a dev. Make sure that the \a dev pointer is valid for the duration of the operation (it is safe to delete it when the commandFinished() signal is emitted). In this case the readyRead() signal is \e not emitted and you cannot read data with the read() or readAll() functions. If you don't read the data immediately it becomes available, i.e. when the readyRead() signal is emitted, it is still available until the next command is started. For example, if you want to present the data to the user as soon as there is something available, connect to the readyRead() signal and read the data immediately. On the other hand, if you only want to work with the complete data, you can connect to the commandFinished() signal and read the data when the get() command is finished. The data is transferred as Binary or Ascii depending on the value of \a type. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa readyRead() dataTransferProgress() commandStarted() commandFinished() */ int QFtp::get(const QString &file, QIODevice *dev, TransferType type) { QStringList cmds; if (type == Binary) cmds << QLatin1String("TYPE I\r\n"); else cmds << QLatin1String("TYPE A\r\n"); cmds << QLatin1String("SIZE ") + file + QLatin1String("\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); cmds << QLatin1String("RETR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Get, cmds, dev)); } /*! \overload Writes a copy of the given \a data to the file called \a file on the server. The progress of the upload is reported by the dataTransferProgress() signal. The data is transferred as Binary or Ascii depending on the value of \a type. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. Since this function takes a copy of the \a data, you can discard your own copy when this function returns. \sa dataTransferProgress() commandStarted() commandFinished() */ int QFtp::put(const QByteArray &data, const QString &file, TransferType type) { QStringList cmds; if (type == Binary) cmds << QLatin1String("TYPE I\r\n"); else cmds << QLatin1String("TYPE A\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); cmds << QLatin1String("ALLO ") + QString::number(data.size()) + QLatin1String("\r\n"); cmds << QLatin1String("STOR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Put, cmds, data)); } /*! Reads the data from the IO device \a dev, and writes it to the file called \a file on the server. The data is read in chunks from the IO device, so this overload allows you to transmit large amounts of data without the need to read all the data into memory at once. The data is transferred as Binary or Ascii depending on the value of \a type. Make sure that the \a dev pointer is valid for the duration of the operation (it is safe to delete it when the commandFinished() is emitted). */ int QFtp::put(QIODevice *dev, const QString &file, TransferType type) { QStringList cmds; if (type == Binary) cmds << QLatin1String("TYPE I\r\n"); else cmds << QLatin1String("TYPE A\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); if (!dev->isSequential()) cmds << QLatin1String("ALLO ") + QString::number(dev->size()) + QLatin1String("\r\n"); cmds << QLatin1String("STOR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Put, cmds, dev)); } /*! Deletes the file called \a file from the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::remove(const QString &file) { return d->addCommand(new QFtpCommand(Remove, QStringList(QLatin1String("DELE ") + file + QLatin1String("\r\n")))); } /*! Creates a directory called \a dir on the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::mkdir(const QString &dir) { return d->addCommand(new QFtpCommand(Mkdir, QStringList(QLatin1String("MKD ") + dir + QLatin1String("\r\n")))); } /*! Removes the directory called \a dir from the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::rmdir(const QString &dir) { return d->addCommand(new QFtpCommand(Rmdir, QStringList(QLatin1String("RMD ") + dir + QLatin1String("\r\n")))); } /*! Renames the file called \a oldname to \a newname on the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::rename(const QString &oldname, const QString &newname) { QStringList cmds; cmds << QLatin1String("RNFR ") + oldname + QLatin1String("\r\n"); cmds << QLatin1String("RNTO ") + newname + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Rename, cmds)); } /*! Sends the raw FTP command \a command to the FTP server. This is useful for low-level FTP access. If the operation you wish to perform has an equivalent QFtp function, we recommend using the function instead of raw FTP commands since the functions are easier and safer. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa rawCommandReply() commandStarted() commandFinished() */ int QFtp::rawCommand(const QString &command) { QString cmd = command.trimmed() + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(RawCommand, QStringList(cmd))); } /*! Returns the number of bytes that can be read from the data socket at the moment. \sa get() readyRead() read() readAll() */ qint64 QFtp::bytesAvailable() const { return d->pi.dtp.bytesAvailable(); } /*! \fn qint64 QFtp::readBlock(char *data, quint64 maxlen) Use read() instead. */ /*! Reads \a maxlen bytes from the data socket into \a data and returns the number of bytes read. Returns -1 if an error occurred. \sa get() readyRead() bytesAvailable() readAll() */ qint64 QFtp::read(char *data, qint64 maxlen) { return d->pi.dtp.read(data, maxlen); } /*! Reads all the bytes available from the data socket and returns them. \sa get() readyRead() bytesAvailable() read() */ QByteArray QFtp::readAll() { return d->pi.dtp.readAll(); } /*! Aborts the current command and deletes all scheduled commands. If there is an unfinished command (i.e. a command for which the commandStarted() signal has been emitted, but for which the commandFinished() signal has not been emitted), this function sends an \c ABORT command to the server. When the server replies that the command is aborted, the commandFinished() signal with the \c error argument set to \c true is emitted for the command. Due to timing issues, it is possible that the command had already finished before the abort request reached the server, in which case, the commandFinished() signal is emitted with the \c error argument set to \c false. For all other commands that are affected by the abort(), no signals are emitted. If you don't start further FTP commands directly after the abort(), there won't be any scheduled commands and the done() signal is emitted. \warning Some FTP servers, for example the BSD FTP daemon (version 0.3), wrongly return a positive reply even when an abort has occurred. For these servers the commandFinished() signal has its error flag set to \c false, even though the command did not complete successfully. \sa clearPendingCommands() */ void QFtp::abort() { if (d->pending.isEmpty()) return; clearPendingCommands(); d->pi.abort(); } /*! Returns the identifier of the FTP command that is being executed or 0 if there is no command being executed. \sa currentCommand() */ int QFtp::currentId() const { if (d->pending.isEmpty()) return 0; return d->pending.first()->id; } /*! Returns the command type of the FTP command being executed or \c None if there is no command being executed. \sa currentId() */ QFtp::Command QFtp::currentCommand() const { if (d->pending.isEmpty()) return None; return d->pending.first()->command; } /*! Returns the QIODevice pointer that is used by the FTP command to read data from or store data to. If there is no current FTP command being executed or if the command does not use an IO device, this function returns 0. This function can be used to delete the QIODevice in the slot connected to the commandFinished() signal. \sa get() put() */ QIODevice* QFtp::currentDevice() const { if (d->pending.isEmpty()) return 0; QFtpCommand *c = d->pending.first(); if (c->is_ba) return 0; return c->data.dev; } /*! Returns true if there are any commands scheduled that have not yet been executed; otherwise returns false. The command that is being executed is \e not considered as a scheduled command. \sa clearPendingCommands() currentId() currentCommand() */ bool QFtp::hasPendingCommands() const { return d->pending.count() > 1; } /*! Deletes all pending commands from the list of scheduled commands. This does not affect the command that is being executed. If you want to stop this as well, use abort(). \sa hasPendingCommands() abort() */ void QFtp::clearPendingCommands() { // delete all entires except the first one while (d->pending.count() > 1) delete d->pending.takeLast(); } /*! Returns the current state of the object. When the state changes, the stateChanged() signal is emitted. \sa State stateChanged() */ QFtp::State QFtp::state() const { return d->state; } /*! Returns the last error that occurred. This is useful to find out what went wrong when receiving a commandFinished() or a done() signal with the \c error argument set to \c true. If you start a new command, the error status is reset to \c NoError. */ QFtp::Error QFtp::error() const { return d->error; } /*! Returns a human-readable description of the last error that occurred. This is useful for presenting a error message to the user when receiving a commandFinished() or a done() signal with the \c error argument set to \c true. The error string is often (but not always) the reply from the server, so it is not always possible to translate the string. If the message comes from Qt, the string has already passed through tr(). */ QString QFtp::errorString() const { return d->errorString; } /*! \internal */ void QFtpPrivate::_q_startNextCommand() { Q_Q(QFtp); if (pending.isEmpty()) return; QFtpCommand *c = pending.first(); error = QFtp::NoError; errorString = QT_TRANSLATE_NOOP(QFtp, QLatin1String("Unknown error")); if (q->bytesAvailable()) q->readAll(); // clear the data emit q->commandStarted(c->id); // Proxy support, replace the Login argument in place, then fall // through. if (c->command == QFtp::Login && !proxyHost.isEmpty()) { QString loginString = c->rawCmds.first().trimmed(); loginString += QLatin1Char('@') + host; if (port && port != 21) loginString += QLatin1Char(':') + QString::number(port); loginString += QLatin1String("\r\n"); c->rawCmds[0] = loginString; } if (c->command == QFtp::SetTransferMode) { _q_piFinished(QLatin1String("Transfer mode set")); } else if (c->command == QFtp::SetProxy) { proxyHost = c->rawCmds[0]; proxyPort = c->rawCmds[1].toUInt(); c->rawCmds.clear(); _q_piFinished(QLatin1String("Proxy set to ") + proxyHost + QLatin1Char(':') + QString::number(proxyPort)); } else if (c->command == QFtp::ConnectToHost) { #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the PI pi.setProperty("_q_networksession", q->property("_q_networksession")); #endif if (!proxyHost.isEmpty()) { host = c->rawCmds[0]; port = c->rawCmds[1].toUInt(); pi.connectToHost(proxyHost, proxyPort); } else { pi.connectToHost(c->rawCmds[0], c->rawCmds[1].toUInt()); } } else { if (c->command == QFtp::Put) { if (c->is_ba) { pi.dtp.setData(c->data.ba); pi.dtp.setBytesTotal(c->data.ba->size()); } else if (c->data.dev && (c->data.dev->isOpen() || c->data.dev->open(QIODevice::ReadOnly))) { pi.dtp.setDevice(c->data.dev); if (c->data.dev->isSequential()) { pi.dtp.setBytesTotal(0); pi.dtp.connect(c->data.dev, SIGNAL(readyRead()), SLOT(dataReadyRead())); pi.dtp.connect(c->data.dev, SIGNAL(readChannelFinished()), SLOT(dataReadyRead())); } else { pi.dtp.setBytesTotal(c->data.dev->size()); } } } else if (c->command == QFtp::Get) { if (!c->is_ba && c->data.dev) { pi.dtp.setDevice(c->data.dev); } } else if (c->command == QFtp::Close) { state = QFtp::Closing; emit q->stateChanged(state); } pi.sendCommands(c->rawCmds); } } /*! \internal */ void QFtpPrivate::_q_piFinished(const QString&) { if (pending.isEmpty()) return; QFtpCommand *c = pending.first(); if (c->command == QFtp::Close) { // The order of in which the slots are called is arbitrary, so // disconnect the SIGNAL-SIGNAL temporary to make sure that we // don't get the commandFinished() signal before the stateChanged() // signal. if (state != QFtp::Unconnected) { close_waitForStateChange = true; return; } } emit q_func()->commandFinished(c->id, false); pending.removeFirst(); delete c; if (pending.isEmpty()) { emit q_func()->done(false); } else { _q_startNextCommand(); } } /*! \internal */ void QFtpPrivate::_q_piError(int errorCode, const QString &text) { Q_Q(QFtp); if (pending.isEmpty()) { qWarning("QFtpPrivate::_q_piError was called without pending command!"); return; } QFtpCommand *c = pending.first(); // non-fatal errors if (c->command == QFtp::Get && pi.currentCommand().startsWith(QLatin1String("SIZE "))) { pi.dtp.setBytesTotal(0); return; } else if (c->command==QFtp::Put && pi.currentCommand().startsWith(QLatin1String("ALLO "))) { return; } error = QFtp::Error(errorCode); switch (q->currentCommand()) { case QFtp::ConnectToHost: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Connecting to host failed:\n%1")) .arg(text); break; case QFtp::Login: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Login failed:\n%1")) .arg(text); break; case QFtp::List: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Listing directory failed:\n%1")) .arg(text); break; case QFtp::Cd: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Changing directory failed:\n%1")) .arg(text); break; case QFtp::Get: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Downloading file failed:\n%1")) .arg(text); break; case QFtp::Put: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Uploading file failed:\n%1")) .arg(text); break; case QFtp::Remove: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Removing file failed:\n%1")) .arg(text); break; case QFtp::Mkdir: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Creating directory failed:\n%1")) .arg(text); break; case QFtp::Rmdir: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Removing directory failed:\n%1")) .arg(text); break; default: errorString = text; break; } pi.clearPendingCommands(); q->clearPendingCommands(); emit q->commandFinished(c->id, true); pending.removeFirst(); delete c; if (pending.isEmpty()) emit q->done(true); else _q_startNextCommand(); } /*! \internal */ void QFtpPrivate::_q_piConnectState(int connectState) { state = QFtp::State(connectState); emit q_func()->stateChanged(state); if (close_waitForStateChange) { close_waitForStateChange = false; _q_piFinished(QLatin1String(QT_TRANSLATE_NOOP("QFtp", "Connection closed"))); } } /*! \internal */ void QFtpPrivate::_q_piFtpReply(int code, const QString &text) { if (q_func()->currentCommand() == QFtp::RawCommand) { pi.rawCommand = true; emit q_func()->rawCommandReply(code, text); } } /*! Destructor. */ QFtp::~QFtp() { abort(); close(); } QT_END_NAMESPACE #include "qftp.moc" #include "moc_qftp.cpp" #endif // QT_NO_FTP #endif // QT_VERSION qsstv_9.2.6/qsstv/utils/qftp.h0000664000175000017500000001123413203343610015071 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QFTP_H #define QFTP_H #include #include "qurlinfo.h" #include QT_BEGIN_HEADER class QFtpPrivate; class QFtp : public QObject { Q_OBJECT public: explicit QFtp(QObject *parent = 0); virtual ~QFtp(); enum State { Unconnected, HostLookup, Connecting, Connected, LoggedIn, Closing }; enum Error { NoError, UnknownError, HostNotFound, ConnectionRefused, NotConnected }; enum Command { None, SetTransferMode, SetProxy, ConnectToHost, Login, Close, List, Cd, Get, Put, Remove, Mkdir, Rmdir, Rename, RawCommand }; enum TransferMode { Active, Passive }; enum TransferType { Binary, Ascii }; int setProxy(const QString &host, quint16 port); int connectToHost(const QString &host, quint16 port=21); int login(const QString &user = QString(), const QString &password = QString()); int close(); int setTransferMode(TransferMode mode); int list(const QString &dir = QString()); int cd(const QString &dir); int get(const QString &file, QIODevice *dev=0, TransferType type = Binary); int put(const QByteArray &data, const QString &file, TransferType type = Binary); int put(QIODevice *dev, const QString &file, TransferType type = Binary); int remove(const QString &file); int mkdir(const QString &dir); int rmdir(const QString &dir); int rename(const QString &oldname, const QString &newname); int rawCommand(const QString &command); qint64 bytesAvailable() const; qint64 read(char *data, qint64 maxlen); QByteArray readAll(); int currentId() const; QIODevice* currentDevice() const; Command currentCommand() const; bool hasPendingCommands() const; void clearPendingCommands(); State state() const; Error error() const; QString errorString() const; public Q_SLOTS: void abort(); Q_SIGNALS: void stateChanged(int); void listInfo(const QUrlInfo&); void readyRead(); void dataTransferProgress(qint64, qint64); void rawCommandReply(int, const QString&); void commandStarted(int); void commandFinished(int, bool); void done(bool); private: Q_DISABLE_COPY(QFtp) QScopedPointer d; Q_PRIVATE_SLOT(d, void _q_startNextCommand()) Q_PRIVATE_SLOT(d, void _q_piFinished(const QString&)) Q_PRIVATE_SLOT(d, void _q_piError(int, const QString&)) Q_PRIVATE_SLOT(d, void _q_piConnectState(int)) Q_PRIVATE_SLOT(d, void _q_piFtpReply(int, const QString&)) }; QT_END_HEADER #endif // QFTP_H qsstv_9.2.6/qsstv/utils/qurlinfo.cpp0000664000175000017500000004036213203343610016315 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qurlinfo.h" #include "qurl.h" #include "qdir.h" #include QT_BEGIN_NAMESPACE class QUrlInfoPrivate { public: QUrlInfoPrivate() : permissions(0), size(0), isDir(false), isFile(true), isSymLink(false), isWritable(true), isReadable(true), isExecutable(false) {} QString name; int permissions; QString owner; QString group; qint64 size; QDateTime lastModified; QDateTime lastRead; bool isDir; bool isFile; bool isSymLink; bool isWritable; bool isReadable; bool isExecutable; }; /*! \class QUrlInfo \brief The QUrlInfo class stores information about URLs. \ingroup io \ingroup network The information about a URL that can be retrieved includes name(), permissions(), owner(), group(), size(), lastModified(), lastRead(), isDir(), isFile(), isSymLink(), isWritable(), isReadable() and isExecutable(). You can create your own QUrlInfo objects passing in all the relevant information in the constructor, and you can modify a QUrlInfo; for each getter mentioned above there is an equivalent setter. Note that setting values does not affect the underlying resource that the QUrlInfo provides information about; for example if you call setWritable(true) on a read-only resource the only thing changed is the QUrlInfo object, not the resource. \sa QUrl, {FTP Example} */ /*! \enum QUrlInfo::PermissionSpec This enum is used by the permissions() function to report the permissions of a file. \var ReadOwner The file is readable by the owner of the file. \var WriteOwner The file is writable by the owner of the file. \var ExeOwner The file is executable by the owner of the file. \var ReadGroup The file is readable by the group. \var WriteGroup The file is writable by the group. \var ExeGroup The file is executable by the group. \var ReadOther The file is readable by anyone. \var WriteOther The file is writable by anyone. \var ExeOther The file is executable by anyone. */ /*! Constructs an invalid QUrlInfo object with default values. \sa isValid() */ QUrlInfo::QUrlInfo() { d = 0; } /*! Copy constructor, copies \a ui to this URL info object. */ QUrlInfo::QUrlInfo(const QUrlInfo &ui) { if (ui.d) { d = new QUrlInfoPrivate; *d = *ui.d; } else { d = 0; } } /*! Constructs a QUrlInfo object by specifying all the URL's information. The information that is passed is the \a name, file \a permissions, \a owner and \a group and the file's \a size. Also passed is the \a lastModified date/time and the \a lastRead date/time. Flags are also passed, specifically, \a isDir, \a isFile, \a isSymLink, \a isWritable, \a isReadable and \a isExecutable. */ QUrlInfo::QUrlInfo(const QString &name, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable) { d = new QUrlInfoPrivate; d->name = name; d->permissions = permissions; d->owner = owner; d->group = group; d->size = size; d->lastModified = lastModified; d->lastRead = lastRead; d->isDir = isDir; d->isFile = isFile; d->isSymLink = isSymLink; d->isWritable = isWritable; d->isReadable = isReadable; d->isExecutable = isExecutable; } /*! Constructs a QUrlInfo object by specifying all the URL's information. The information that is passed is the \a url, file \a permissions, \a owner and \a group and the file's \a size. Also passed is the \a lastModified date/time and the \a lastRead date/time. Flags are also passed, specifically, \a isDir, \a isFile, \a isSymLink, \a isWritable, \a isReadable and \a isExecutable. */ QUrlInfo::QUrlInfo(const QUrl &url, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable) { d = new QUrlInfoPrivate; d->name = QFileInfo(url.path()).fileName(); d->permissions = permissions; d->owner = owner; d->group = group; d->size = size; d->lastModified = lastModified; d->lastRead = lastRead; d->isDir = isDir; d->isFile = isFile; d->isSymLink = isSymLink; d->isWritable = isWritable; d->isReadable = isReadable; d->isExecutable = isExecutable; } /*! Sets the name of the URL to \a name. The name is the full text, for example, "http://qt.nokia.com/doc/qurlinfo.html". If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setName(const QString &name) { if (!d) d = new QUrlInfoPrivate; d->name = name; } /*! If \a b is true then the URL is set to be a directory; if \a b is false then the URL is set not to be a directory (which normally means it is a file). (Note that a URL can refer to both a file and a directory even though most file systems do not support this.) If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setDir(bool b) { if (!d) d = new QUrlInfoPrivate; d->isDir = b; } /*! If \a b is true then the URL is set to be a file; if \b is false then the URL is set not to be a file (which normally means it is a directory). (Note that a URL can refer to both a file and a directory even though most file systems do not support this.) If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setFile(bool b) { if (!d) d = new QUrlInfoPrivate; d->isFile = b; } /*! Specifies that the URL refers to a symbolic link if \a b is true and that it does not if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setSymLink(bool b) { if (!d) d = new QUrlInfoPrivate; d->isSymLink = b; } /*! Specifies that the URL is writable if \a b is true and not writable if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setWritable(bool b) { if (!d) d = new QUrlInfoPrivate; d->isWritable = b; } /*! Specifies that the URL is readable if \a b is true and not readable if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setReadable(bool b) { if (!d) d = new QUrlInfoPrivate; d->isReadable = b; } /*! Specifies that the owner of the URL is called \a s. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setOwner(const QString &s) { if (!d) d = new QUrlInfoPrivate; d->owner = s; } /*! Specifies that the owning group of the URL is called \a s. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setGroup(const QString &s) { if (!d) d = new QUrlInfoPrivate; d->group = s; } /*! Specifies the \a size of the URL. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setSize(qint64 size) { if (!d) d = new QUrlInfoPrivate; d->size = size; } /*! Specifies that the URL has access permissions \a p. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setPermissions(int p) { if (!d) d = new QUrlInfoPrivate; d->permissions = p; } /*! Specifies that the object the URL refers to was last modified at \a dt. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setLastModified(const QDateTime &dt) { if (!d) d = new QUrlInfoPrivate; d->lastModified = dt; } /*! \since 4.4 Specifies that the object the URL refers to was last read at \a dt. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setLastRead(const QDateTime &dt) { if (!d) d = new QUrlInfoPrivate; d->lastRead = dt; } /*! Destroys the URL info object. */ QUrlInfo::~QUrlInfo() { delete d; } /*! Assigns the values of \a ui to this QUrlInfo object. */ QUrlInfo &QUrlInfo::operator=(const QUrlInfo &ui) { if (ui.d) { if (!d) d= new QUrlInfoPrivate; *d = *ui.d; } else { delete d; d = 0; } return *this; } /*! Returns the file name of the URL. \sa isValid() */ QString QUrlInfo::name() const { if (!d) return QString(); return d->name; } /*! Returns the permissions of the URL. You can use the \c PermissionSpec flags to test for certain permissions. \sa isValid() */ int QUrlInfo::permissions() const { if (!d) return 0; return d->permissions; } /*! Returns the owner of the URL. \sa isValid() */ QString QUrlInfo::owner() const { if (!d) return QString(); return d->owner; } /*! Returns the group of the URL. \sa isValid() */ QString QUrlInfo::group() const { if (!d) return QString(); return d->group; } /*! Returns the size of the URL. \sa isValid() */ qint64 QUrlInfo::size() const { if (!d) return 0; return d->size; } /*! Returns the last modification date of the URL. \sa isValid() */ QDateTime QUrlInfo::lastModified() const { if (!d) return QDateTime(); return d->lastModified; } /*! Returns the date when the URL was last read. \sa isValid() */ QDateTime QUrlInfo::lastRead() const { if (!d) return QDateTime(); return d->lastRead; } /*! Returns true if the URL is a directory; otherwise returns false. \sa isValid() */ bool QUrlInfo::isDir() const { if (!d) return false; return d->isDir; } /*! Returns true if the URL is a file; otherwise returns false. \sa isValid() */ bool QUrlInfo::isFile() const { if (!d) return false; return d->isFile; } /*! Returns true if the URL is a symbolic link; otherwise returns false. \sa isValid() */ bool QUrlInfo::isSymLink() const { if (!d) return false; return d->isSymLink; } /*! Returns true if the URL is writable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isWritable() const { if (!d) return false; return d->isWritable; } /*! Returns true if the URL is readable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isReadable() const { if (!d) return false; return d->isReadable; } /*! Returns true if the URL is executable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isExecutable() const { if (!d) return false; return d->isExecutable; } /*! Returns true if \a i1 is greater than \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::greaterThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { switch (sortBy) { case QDir::Name: return i1.name() > i2.name(); case QDir::Time: return i1.lastModified() > i2.lastModified(); case QDir::Size: return i1.size() > i2.size(); default: return false; } } /*! Returns true if \a i1 is less than \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::lessThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { return !greaterThan(i1, i2, sortBy); } /*! Returns true if \a i1 equals to \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::equal(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { switch (sortBy) { case QDir::Name: return i1.name() == i2.name(); case QDir::Time: return i1.lastModified() == i2.lastModified(); case QDir::Size: return i1.size() == i2.size(); default: return false; } } /*! Returns true if this QUrlInfo is equal to \a other; otherwise returns false. \sa lessThan(), equal() */ bool QUrlInfo::operator==(const QUrlInfo &other) const { if (!d) return other.d == 0; if (!other.d) return false; return (d->name == other.d->name && d->permissions == other.d->permissions && d->owner == other.d->owner && d->group == other.d->group && d->size == other.d->size && d->lastModified == other.d->lastModified && d->lastRead == other.d->lastRead && d->isDir == other.d->isDir && d->isFile == other.d->isFile && d->isSymLink == other.d->isSymLink && d->isWritable == other.d->isWritable && d->isReadable == other.d->isReadable && d->isExecutable == other.d->isExecutable); } /*! \fn bool QUrlInfo::operator!=(const QUrlInfo &other) const \since 4.2 Returns true if this QUrlInfo is not equal to \a other; otherwise returns false. \sa lessThan(), equal() */ /*! Returns true if the URL info is valid; otherwise returns false. Valid means that the QUrlInfo contains real information. You should always check if the URL info is valid before relying on the values. */ bool QUrlInfo::isValid() const { return d != 0; } QT_END_NAMESPACE qsstv_9.2.6/qsstv/utils/qurlinfo.h0000664000175000017500000001072513203343610015762 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QURLINFO_H #define QURLINFO_H #include #include #include QT_BEGIN_HEADER QT_BEGIN_NAMESPACE class QUrl; class QUrlInfoPrivate; class QUrlInfo { public: enum PermissionSpec { ReadOwner = 00400, WriteOwner = 00200, ExeOwner = 00100, ReadGroup = 00040, WriteGroup = 00020, ExeGroup = 00010, ReadOther = 00004, WriteOther = 00002, ExeOther = 00001 }; QUrlInfo(); QUrlInfo(const QUrlInfo &ui); QUrlInfo(const QString &name, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable); QUrlInfo(const QUrl &url, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable); QUrlInfo &operator=(const QUrlInfo &ui); virtual ~QUrlInfo(); virtual void setName(const QString &name); virtual void setDir(bool b); virtual void setFile(bool b); virtual void setSymLink(bool b); virtual void setOwner(const QString &s); virtual void setGroup(const QString &s); virtual void setSize(qint64 size); virtual void setWritable(bool b); virtual void setReadable(bool b); virtual void setPermissions(int p); virtual void setLastModified(const QDateTime &dt); void setLastRead(const QDateTime &dt); bool isValid() const; QString name() const; int permissions() const; QString owner() const; QString group() const; qint64 size() const; QDateTime lastModified() const; QDateTime lastRead() const; bool isDir() const; bool isFile() const; bool isSymLink() const; bool isWritable() const; bool isReadable() const; bool isExecutable() const; static bool greaterThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); static bool lessThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); static bool equal(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); bool operator==(const QUrlInfo &i) const; inline bool operator!=(const QUrlInfo &i) const { return !operator==(i); } private: QUrlInfoPrivate *d; }; QT_END_NAMESPACE QT_END_HEADER #endif // QURLINFO_H qsstv_9.2.6/qsstv/utils/reedsolomoncoder.cpp0000664000175000017500000001763213203343610020025 0ustar jomajoma#include "reedsolomoncoder.h" #include #include #include "rs.h" #include "configparams.h" #define RSBSIZE 255 #define rse32 encode_rs #define rsd32 eras_dec_rs #define ENCODE 0 #define DECODE 1 QString rsTypeStr[RST4+1]= { "", "rs1", "rs2", "rs3", "rs4" }; reedSolomonCoder::reedSolomonCoder() { zeroPositions=NULL; newZeroPositions=NULL; } reedSolomonCoder::~reedSolomonCoder() { if(zeroPositions!=NULL) delete zeroPositions; if(newZeroPositions!=NULL) delete newZeroPositions; } void reedSolomonCoder::init() { ec_buf.clear(); /* pointer to encoding/decoding buffer */ tr_buf.clear(); /* pointer to transmit-buffer (fread/fwrite) */ bk_buf.clear(); /* pointer to backup-buffer for resync */ rs_bsize=0; rs_dsize=0; bep_size=0; sumOfFailures=0; uncorrectableFailures=0; if(zeroPositions!=NULL) delete zeroPositions; if(newZeroPositions!=NULL) delete newZeroPositions; } // if the extension is not rs1,rs2 or rs3 then newFilename is set to fn and return value is true bool reedSolomonCoder::decode(QByteArray &ba,QString fn,QString &newFileName,QByteArray &baFile,QString extension,QList &erasuresArray) { int i,j; int startOfSegment,row; // QByteArray *t; init(); origFileName=fn; fpin.setFileName(fn); if(extension=="rs1") fileType=RST1; else if(extension=="rs2") fileType=RST2; else if(extension=="rs3") fileType=RST3; else if(extension=="rs4") fileType=RST4; else { return false; } tr_buf=ba; got=tr_buf.size(); bep_size = got/RSBSIZE; if (got % RSBSIZE) { bep_size++ ; tr_buf=tr_buf.leftJustified(bep_size*RSBSIZE,'\0'); } int rest=tr_buf.count()%64; if(rest!=0) { tr_buf=tr_buf.leftJustified(bep_size*RSBSIZE+(64-rest),'\0'); } ec_buf.resize(bep_size*RSBSIZE); bk_buf.resize(bep_size*RSBSIZE); rs_bsize=RSBSIZE; switch (fileType) { case RST1: rs_dsize=RSDSIZERS1; break; case RST2: rs_dsize=RSDSIZERS2; break; case RST3: rs_dsize=RSDSIZERS3; break; case RST4: rs_dsize=RSDSIZERS4; break; case RSTNONE: return false; } init_rs(rs_dsize); // setup erasure info numMissing=0; if(erasuresArray.count()>2) // we have erasure positions { totalSegments=erasuresArray.at(0); segmentLength=erasuresArray.at(1); numMissing=erasuresArray.count()-2; if(zeroPositions) delete zeroPositions; if(newZeroPositions) delete newZeroPositions; zeroPositions=new int[segmentLength*(totalSegments+1)]; newZeroPositions=new int[256*bep_size]; for(i=0;i<(segmentLength*totalSegments);i++) zeroPositions[i]=-1; } else { errorOut() << "no erasure info"; return false; } /* now label the erasures positions */ for (i= 0 ; i < numMissing; i++) { startOfSegment = erasuresArray.at(i+2)*segmentLength ; // +2 because of header in array for (j=0; j < segmentLength ; j++) { row = (startOfSegment +j ) / bep_size; /* if ( row < rs_dsize) */ zeroPositions[startOfSegment+j] = row; } } /* distribute version pa0mbo for the indexes */ int *pointzero=newZeroPositions; for (i=0; i < bep_size ; i++) { for (j=0; j < 255 ; j++) { *(pointzero++) = *(zeroPositions + j*bep_size + i); } } distribute((byte *)tr_buf.data(),(byte *)ec_buf.data(),bep_size,rs_bsize,DECODE); if(!decode_and_write()) { // fpout.close(); return false; } // fpin.close(); // fpout.close(); // tr_buf=ec_buf; if(uncorrectableFailures>0) return false; // if(fpout.open(QIODevice::ReadOnly)<=0) return false; // tr_buf=fpout.readAll(); if (bep_size != (((unsigned char) tr_buf[1]) + ((unsigned char) tr_buf[2])*256 )) { errorOut()<< "problems with bep_size coded in file"; errorOut() << "bep_size: " << bep_size <<" coded size: " << (((unsigned char) tr_buf[1]) + ((unsigned char) tr_buf[2])*256 ) ; errorOut() << "bep_sizeaa: " << bep_size <<" coded size: " << (((unsigned char) ba[1]) + ((unsigned char)ba[2])*256 ) ; return false; } coded_file_size = bep_size*rs_dsize - (int)tr_buf[0]; strncpy(coded_file_ext, tr_buf.data()+3,3); coded_file_ext[3]=0; QFileInfo fileInfo(origFileName); QString baseName=rxDRMImagesPath+"/"+fileInfo.completeBaseName(); baseName.append("."); baseName.append(coded_file_ext); tr_buf=tr_buf.right(tr_buf.count()-7); tr_buf=tr_buf.left(coded_file_size); newFileName=baseName; baFile=tr_buf; if(uncorrectableFailures>0) { return false; } return true; } void reedSolomonCoder::distribute(byte *src, byte *dst, int rows, int cols, int reverse) { unsigned int i,j,rc,ri,rl; rc=rows*cols; ri=0; rl = reverse ? cols : rows; for(i=0;i using union gives problems with allignement { for(j=0;j<64 && i+j=rc) { ri-=rc-1; /* go around and add one. */ } } } } /* decode buffer and write to fpout */ bool reedSolomonCoder::decode_and_write() { register int i, j; int nr_erasures; int eras_pos[255]; tr_buf.clear(); for(i=0;i(rs_bsize-rs_dsize)) { return false; } } } if(nr_erasures>(rs_bsize-rs_dsize)) nr_erasures=rs_bsize-rs_dsize-1; int failure=rsd32(((byte *)ec_buf.data()+(i*rs_bsize)),eras_pos, nr_erasures); if (failure>0) { sumOfFailures+=failure; } else if (failure==-1) { uncorrectableFailures++; return false; } tr_buf.append(ec_buf.data()+i*rs_bsize,rs_dsize); } return true; } bool reedSolomonCoder::encode(QByteArray &ba,QString extension,eRSType rsType) { int i,j; unsigned char dataByte; QByteArray temp; QString suffix=extension.leftJustified(3,0); tr_buf=ba; fileType=rsType; rs_bsize=RSBSIZE; switch (fileType) { case RST1: rs_dsize=RSDSIZERS1; break; case RST2: rs_dsize=RSDSIZERS2; break; case RST3: rs_dsize=RSDSIZERS3; break; case RST4: rs_dsize=RSDSIZERS4; break; case RSTNONE: return false; } init_rs(rs_dsize); got = tr_buf.size(); chunks = (got+7) / rs_dsize ; if (((got+7) % rs_dsize ) > 0) chunks++ ; bep_size=chunks; // ec_buf.resize(bep_size*RSBSIZE); ec_buf.clear(); bk_buf.resize(bep_size*RSBSIZE); dataByte = (unsigned char) ( rs_dsize - ( got % rs_dsize)) ; /* surplus in filelength */ ec_buf.append(dataByte); dataByte = (unsigned char) ( chunks % 256) ; ec_buf.append(dataByte); dataByte = (unsigned char) (chunks/256) ; ec_buf.append(dataByte); ec_buf.append(suffix.toLatin1().at(0)); ec_buf.append(suffix.toLatin1().at(1)); ec_buf.append(suffix.toLatin1().at(2)); dataByte=0; ec_buf.append(dataByte); ec_buf.append(tr_buf.left(rs_dsize-7)); ec_buf.resize(ec_buf.count()+RSBSIZE-rs_dsize); rse32(((byte *)ec_buf.data()),((byte *)ec_buf.data()+(rs_dsize))); for (i=1;i #include enum eRSType {RSTNONE,RST1,RST2,RST3,RST4}; extern QString rsTypeStr[RST4+1]; union long_byte_union { quint64 i; unsigned char b[8]; }; class reedSolomonCoder { public: reedSolomonCoder(); ~reedSolomonCoder(); void init(); bool decode(QByteArray &ba, QString fn, QString &newFileName, QByteArray &baFile, QString extension, QList &erasuresArray); bool encode(QByteArray &ba, QString extension, eRSType rsType); private: void distribute(byte *src, byte *dst, int rows, int cols, int reverse); bool decode_and_write(); QByteArray ec_buf; /* pointer to encoding/decoding buffer */ QByteArray tr_buf; /* pointer to transmit-buffer (fread/fwrite) */ QByteArray bk_buf; /* pointer to backup-buffer for resync */ int rs_bsize; int rs_dsize; int bep_size; unsigned long sumOfFailures; unsigned long uncorrectableFailures; int k; QFile fpin, fpout; long got,chunks; int coded_file_size ; char coded_file_ext[4] ; QString origFileName; char *p ; eRSType fileType; int totalSegments; int segmentLength; int *zeroPositions; int *newZeroPositions; int numMissing; }; #endif // REEDSOLOMONCODER_H qsstv_9.2.6/qsstv/utils/rs.cpp0000664000175000017500000003241213203343610015077 0ustar jomajoma/* * Reed-Solomon coding and decoding * Phil Karn (karn@ka9q.ampr.org) September 1996 * Separate CCSDS version create Dec 1998, merged into this version May 1999 * * This file is derived from my generic RS encoder/decoder, which is * in turn based on the program "new_rs_erasures.c" by Robert * Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy * (harit@spectra.eng.hawaii.edu), Aug 1995 * Copyright 1999 Phil Karn, KA9Q * May be used under the terms of the GNU public license */ #include #include "rs.h" static int KK; /* MM, KK, B0, PRIM are user-defined in rs.h */ /* Primitive polynomials - see Lin & Costello, Appendix A, * and Lee & Messerschmitt, p. 453. */ /* 1+x^2+x^3+x^4+x^8 */ int Pp[MM+1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 }; /* This defines the type used to store an element of the Galois Field * used by the code. Make sure this is something larger than a char if * if anything larger than GF(256) is used. * * Note: unsigned char will work up to GF(256) but int seems to run * faster on the Pentium. */ typedef int gf; /* index->polynomial form conversion table */ static gf Alpha_to[NN + 1]; /* Polynomial->index form conversion table */ static gf Index_of[NN + 1]; /* No legal value in index form represents zero, so * we need a special value for this purpose */ #define A0 (NN) /* Generator polynomial g(x) in index form */ //static gf Gg[NN - KK + 1]; static gf Gg[NN-RSDSIZERS4+1]; //worst case static int RS_init=0; /* Initialization flag */ /* Compute x % NN, where NN is 2**MM - 1, * without a slow divide */ static gf modnn(int x) { while (x >= NN) { x -= NN; x = (x >> MM) + (x & NN); } return x; } #define min(a,b) ((a) < (b) ? (a) : (b)) #define CLEAR(a,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = 0;\ } #define COPY(a,b,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = (b)[ci];\ } #define COPYDOWN(a,b,n) {\ int ci;\ for(ci=(n)-1;ci >=0;ci--)\ (a)[ci] = (b)[ci];\ } #define Ldec 1 /* generate GF(2**m) from the irreducible polynomial p(X) in Pp[0]..Pp[m] lookup tables: index->polynomial form alpha_to[] contains j=alpha**i; polynomial form -> index form index_of[j=alpha**i] = i alpha=2 is the primitive element of GF(2**m) HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows: Let @ represent the primitive element commonly called "alpha" that is the root of the primitive polynomial p(x). Then in GF(2^m), for any 0 <= i <= 2^m-2, @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for example the polynomial representation of @^5 would be given by the binary representation of the integer "alpha_to[5]". Similarily, index_of[] can be used as follows: As above, let @ represent the primitive element of GF(2^m) that is the root of the primitive polynomial p(x). In order to find the power of @ (alpha) that has the polynomial representation a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) we consider the integer "i" whose binary representation with a(0) being LSB and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry "index_of[i]". Now, @^index_of[i] is that element whose polynomial representation is (a(0),a(1),a(2),...,a(m-1)). NOTE: The element alpha_to[2^m-1] = 0 always signifying that the representation of "@^infinity" = 0 is (0,0,0,...,0). Similarily, the element index_of[0] = A0 always signifying that the power of alpha which has the polynomial representation (0,0,...,0) is "infinity". */ static void generate_gf(void) { register int i, mask; mask = 1; Alpha_to[MM] = 0; for (i = 0; i < MM; i++) { Alpha_to[i] = mask; Index_of[Alpha_to[i]] = i; /* If Pp[i] == 1 then, term @^i occurs in poly-repr of @^MM */ if (Pp[i] != 0) Alpha_to[MM] ^= mask; /* Bit-wise EXOR operation */ mask <<= 1; /* single left-shift */ } Index_of[Alpha_to[MM]] = MM; /* * Have obtained poly-repr of @^MM. Poly-repr of @^(i+1) is given by * poly-repr of @^i shifted left one-bit and accounting for any @^MM * term that may occur when poly-repr of @^i is shifted. */ mask >>= 1; for (i = MM + 1; i < NN; i++) { if (Alpha_to[i - 1] >= mask) Alpha_to[i] = Alpha_to[MM] ^ ((Alpha_to[i - 1] ^ mask) << 1); else Alpha_to[i] = Alpha_to[i - 1] << 1; Index_of[Alpha_to[i]] = i; } Index_of[0] = A0; Alpha_to[NN] = 0; } /* * Obtain the generator polynomial of the TT-error correcting, length * NN=(2**MM -1) Reed Solomon code from the product of (X+@**(B0+i)), i = 0, * ... ,(2*TT-1) * * Examples: * * If B0 = 1, TT = 1. deg(g(x)) = 2*TT = 2. * g(x) = (x+@) (x+@**2) * * If B0 = 0, TT = 2. deg(g(x)) = 2*TT = 4. * g(x) = (x+1) (x+@) (x+@**2) (x+@**3) */ static void gen_poly(void) { register int i, j; Gg[0] = 1; for (i = 0; i < NN - KK; i++) { Gg[i+1] = 1; /* * Below multiply (Gg[0]+Gg[1]*x + ... +Gg[i]x^i) by * (@**(B0+i)*PRIM + x) */ for (j = i; j > 0; j--) if (Gg[j] != 0) Gg[j] = Gg[j - 1] ^ Alpha_to[modnn((Index_of[Gg[j]]) + (B0 + i) *PRIM)]; else Gg[j] = Gg[j - 1]; /* Gg[0] can never be zero */ Gg[0] = Alpha_to[modnn(Index_of[Gg[0]] + (B0 + i) * PRIM)]; } /* convert Gg[] to index form for quicker encoding */ for (i = 0; i <= NN - KK; i++) Gg[i] = Index_of[Gg[i]]; } /* * take the string of symbols in data[i], i=0..(k-1) and encode * systematically to produce NN-KK parity symbols in bb[0]..bb[NN-KK-1] data[] * is input and bb[] is output in polynomial form. Encoding is done by using * a feedback shift register with appropriate connections specified by the * elements of Gg[], which was generated above. Codeword is c(X) = * data(X)*X**(NN-KK)+ b(X) */ int encode_rs(dtype data[], dtype bb[]) { register int i, j; gf feedback; CLEAR(bb,NN-KK); for(i = KK - 1; i >= 0; i--) { feedback = Index_of[data[i] ^ bb[NN - KK - 1]]; if (feedback != A0) { /* feedback term is non-zero */ for (j = NN - KK - 1; j > 0; j--) if (Gg[j] != A0) bb[j] = bb[j - 1] ^ Alpha_to[modnn(Gg[j] + feedback)]; else bb[j] = bb[j - 1]; bb[0] = Alpha_to[modnn(Gg[0] + feedback)]; } else { /* feedback term is zero. encoder becomes a * single-byte shifter */ for (j = NN - KK - 1; j > 0; j--) bb[j] = bb[j - 1]; bb[0] = 0; } } return 0; } /* * Performs ERRORS+ERASURES decoding of RS codes. If decoding is successful, * writes the codeword into data[] itself. Otherwise data[] is unaltered. * * Return number of symbols corrected, or -1 if codeword is illegal * or uncorrectable. If eras_pos is non-null, the detected error locations * are written back. NOTE! This array must be at least NN-KK elements long. * * First "no_eras" erasures are declared by the calling program. Then, the * maximum # of errors correctable is t_after_eras = floor((NN-KK-no_eras)/2). * If the number of channel errors is not greater than "t_after_eras" the * transmitted codeword will be recovered. Details of algorithm can be found * in R. Blahut's "Theory ... of Error-Correcting Codes". * Warning: the eras_pos[] array must not contain duplicate entries; decoder failure * will result. The decoder *could* check for this condition, but it would involve * extra time on every decoding operation. */ int eras_dec_rs(dtype data[], int eras_pos[], int no_eras) { int deg_lambda, el, deg_omega; int i, j, r,k; gf u,q,tmp,num1,num2,den,discr_r; gf lambda[NN-KK + 1], s[NN-KK + 1]; /* Err+Eras Locator poly * and syndrome poly */ gf b[NN-KK + 1], t[NN-KK + 1], omega[NN-KK + 1]; gf root[NN-KK], reg[NN-KK + 1], loc[NN-KK]; int syn_error, count; /* form the syndromes; i.e., evaluate data(x) at roots of g(x) * namely @**(B0+i)*PRIM, i = 0, ... ,(NN-KK-1) */ for(i=1;i<=NN-KK;i++) { s[i] = data[0]; } for(j=1;j 0) { /* Init lambda to be the erasure locator polynomial */ lambda[1] = Alpha_to[modnn(PRIM * eras_pos[0])]; for (i = 1; i < no_eras; i++) { u = modnn(PRIM*eras_pos[i]); for (j = i+1; j > 0; j--) { tmp = Index_of[lambda[j - 1]]; if(tmp != A0) { lambda[j] ^= Alpha_to[modnn(u + tmp)]; } } } } for(i=0;i 0; j--){ if (reg[j] != A0) { reg[j] = modnn(reg[j] + j); q ^= Alpha_to[reg[j]]; } } if (q != 0) continue; /* store root (index-form) and error location number */ root[count] = i; loc[count] = k; /* If we've already found max possible roots, * abort the search to save time */ if(++count == deg_lambda) break; } if (deg_lambda != count) { /* * deg(lambda) unequal to number of roots => uncorrectable * error detected */ count = -1; goto finish; } /* * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo * x**(NN-KK)). in index form. Also find deg(omega). */ deg_omega = 0; for (i = 0; i < NN-KK;i++){ tmp = 0; j = (deg_lambda < i) ? deg_lambda : i; for(;j >= 0; j--){ if ((s[i + 1 - j] != A0) && (lambda[j] != A0)) tmp ^= Alpha_to[modnn(s[i + 1 - j] + lambda[j])]; } if(tmp != 0) deg_omega = i; omega[i] = Index_of[tmp]; } omega[NN-KK] = A0; /* * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = * inv(X(l))**(B0-1) and den = lambda_pr(inv(X(l))) all in poly-form */ for (j = count-1; j >=0; j--) { num1 = 0; for (i = deg_omega; i >= 0; i--) { if (omega[i] != A0) num1 ^= Alpha_to[modnn(omega[i] + i * root[j])]; } num2 = Alpha_to[modnn(root[j] * (B0 - 1) + NN)]; den = 0; /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ for (i = min(deg_lambda,NN-KK-1) & ~1; i >= 0; i -=2) { if(lambda[i+1] != A0) den ^= Alpha_to[modnn(lambda[i+1] + i * root[j])]; } if (den == 0) { /* Convert to dual- basis */ count = -1; goto finish; } /* Apply error to data */ if (num1 != 0) { data[loc[j]] ^= Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - Index_of[den])]; } } finish: if(eras_pos != NULL){ for(i=0;i #include #include #include "appglobal.h" #include "dirdialog.h" QString lastPath(""); bool getValue(int &val, QLineEdit* input) { bool ok; QString s; s=input->text(); val=s.toInt(&ok,0); // allow ayutomatic conversion from hex to decimal in the classic C++ way : 0x is hex other are decimal return ok; } bool getValue(double &val, QLineEdit* input) { bool ok; QString s; s=input->text(); val=s.toDouble(&ok); return ok; } bool getValue(int &val, QString input) { bool ok; val=input.toInt(&ok); return ok; } bool getValue(double &val, QString input) { bool ok; val=input.toDouble(&ok); return ok; } void getValue(bool &val, QCheckBox *input) { val=input->isChecked(); } void getValue(int &val, QSpinBox *input) { val=input->value(); } void getValue(uint &val, QSpinBox *input) { val=input->value(); } void getValue(double &val, QDoubleSpinBox *input) { val=input->value(); } void getValue(QString &s, QLineEdit *input) { s=input->text(); } void getValue(QString &s, QPlainTextEdit *input) { s=input->toPlainText(); } void getValue(int &s, QComboBox *input) { s=input->currentText().toInt(); } void getIndex(int &s, QComboBox *input) { s=input->currentIndex(); } void getValue(QString &s, QComboBox *input) { s=input->currentText(); } void getValue(int &s, QButtonGroup *input) { s=input->checkedId(); } void getValue(bool &s, QRadioButton *input) { s=input->isChecked(); } void getValue(int &val, QSlider *input) { val=input->value(); } void setValue(int val, QLineEdit* output) { output->setText(QString::number(val)); } void setValue(double val, QLineEdit* output) { output->setText(QString::number(val)); } /** \brief sets double number in a QlineEdit \param val the value to set \param output pointer to QLineEdit \param prec the required precision */ void setValue(double val, QLineEdit* output,int prec) { output->setText(QString::number(val,'g',prec)); } void setValue(bool val, QCheckBox *input) { input->setChecked(val); } void setValue(int val, QSpinBox *input) { input->setValue(val); } void setValue(uint val, QSpinBox *input) { input->setValue(val); } void setValue(double val, QDoubleSpinBox *input) { input->setValue(val); } void setValue(QString s, QLineEdit *input) { input->setText(s); } void setValue(QString s, QPlainTextEdit *input) { input->setPlainText(s); } void setValue(int s, QComboBox *input) { int i; for(i=0;icount();i++) { if(input->itemText(i).toInt()==s) { input->setCurrentIndex(i); return; } } input->setCurrentIndex(0); } void setIndex(int s, QComboBox *input) { input->setCurrentIndex(s); } void setValue(QString s, QComboBox *input) { int i; for(i=0;icount();i++) { if(input->itemText(i)==s) { input->setCurrentIndex(i); return; } } input->setCurrentIndex(0); } void setValue(int s, QButtonGroup *input) { input->button(s)->setChecked(true); } void setValue(bool s, QRadioButton *input) { input->setChecked(s); } void setValue(int val, QSlider *input) { input->setValue(val); } bool browseGetFile(QLineEdit *le,QString deflt, const QString &filter) { dirDialog d((QWidget *)le,"Browse"); QString s=d.openFileName(deflt,filter); if (s==QString::null) return false; if (s.isEmpty()) return false; le->setText(s); return true; } bool browseSaveFile(QLineEdit *le,QString deflt,const QString &filter) { dirDialog d((QWidget *)le,"Browse"); QString s=d.saveFileName(deflt,filter,""); if (s==QString::null) return false; if (s.isEmpty()) return false; le->setText(s); return true; } bool browseDir(QLineEdit *le,QString deflt) { dirDialog d((QWidget *)le,"Browse"); QString s=d.openDirName(deflt); if (s==QString::null) return false; if (s.isEmpty()) return false; le->setText(s); return true; } void deleteFiles(QString dirPath,QString extension) { int i; QDir dir(dirPath); QStringList filters; QFile fi; filters << extension; dir.setNameFilters(filters); QFileInfoList entries = dir.entryInfoList(filters,QDir::Files|QDir::NoSymLinks); for(i=0;i #include #include #include #include #include #include #include #include #include #include /** \file */ #define OK true #define NOK false /** get int value from a QLinedit */ bool getValue(int &val, QLineEdit *input); /** get double value from a QLinedit */ bool getValue(double &val, QLineEdit *input); /** get int value from a QString */ bool getValue(int &val, QString input); bool getValue(double &val, QString input); void getValue(bool &val, QCheckBox *input); void getValue(int &val, QSpinBox *input); void getValue(uint &val, QSpinBox *input); void getValue(double &val, QDoubleSpinBox *input); void getValue(QString &s, QLineEdit *input); void getValue(QString &s, QPlainTextEdit *input); void getValue(int &s, QComboBox *input); void getIndex(int &s, QComboBox *input); void getValue(QString &s, QComboBox *input); void getValue(int &s, QButtonGroup *input); void getValue(bool &val, QRadioButton *input); void getValue(int &val, QSlider *input); void setValue(int val, QLineEdit* output); void setValue(double val, QLineEdit* output); void setValue(double val, QLineEdit* output,int prec); void setValue(bool val, QCheckBox *input); void setValue(int val, QSpinBox *input); void setValue(uint val, QSpinBox *input); void setValue(double val, QDoubleSpinBox *input); void setValue(QString s, QLineEdit *input); void setValue(QString s, QPlainTextEdit *input); void setValue(int s, QComboBox *input); void setIndex(int s, QComboBox *input); void setValue(QString s, QComboBox *input); void setValue(int s, QButtonGroup *input); void setValue(bool val, QRadioButton *input); void setValue(int val, QSlider *input); bool browseGetFile(QLineEdit *le,QString deflt,const QString &filter="*"); bool browseSaveFile(QLineEdit *le,QString deflt,const QString &filter="*"); bool browseDir(QLineEdit *le, QString deflt); void deleteFiles(QString dirPath,QString extension); bool trash(QString filename,bool forceDelete); class timingAnalyser { public: timingAnalyser(); ~timingAnalyser(); void start(); unsigned long result(); private: QTime tm; }; #endif qsstv_9.2.6/qsstv/utils/vector.h0000664000175000017500000003501713203343610015426 0ustar jomajoma/******************************************************************************\ * Technische Universitaet Darmstadt, Institut fuer Nachrichtentechnik * Copyright (c) 2001 * * Author(s): * Volker Fischer * * Description: * * ****************************************************************************** * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \******************************************************************************/ #if !defined(VECTOR_H__3B0BA660_CA6LIUBEFIB2B_23E7A0D31912__INCLUDED_) #define VECTOR_H__3B0BA660_CA6LIUBEFIB2B_23E7A0D31912__INCLUDED_ //#include "drmtx/common/GlobalDefinitions.h" #include "appdefs.h" using namespace std; /* Because of the library: "complex" */ #include #include #include #include /******************************************************************************\ * CVector base class * \******************************************************************************/ template class CVector : public vector { public: CVector() : iBitArrayCounter(0), iVectorSize(0) {pData = this->begin();} CVector(const int iNeSi) {Init(iNeSi);} CVector(const int iNeSi, const TData tInVa) {Init(iNeSi, tInVa);} virtual ~CVector() {} /* Copy constructor: The order of the initialization list must not be changed. First, the base class must be initialized, then the pData pointer must be set to the new data source. The bit access is, by default, reset */ CVector(const CVector& vecI) : vector(static_cast&>(vecI)), iBitArrayCounter(0), iVectorSize(vecI.Size()) {pData = this->begin();} virtual void Init(const int iNewSize); /* Use this init to give all elements a defined value */ virtual void Init(const int iNewSize, const TData tIniVal); void Reset(const TData tResetVal); void Enlarge(const int iAddedSize); void Add(const TData& tI) {Enlarge(1); pData[iVectorSize - 1] = tI;} inline int Size() const {return iVectorSize;} /* This operator allows for a l-value assignment of this object: CVector[x] = y is possible */ inline TData& operator[](const int iPos) { #ifdef _DEBUG_ if ((iPos < 0) || (iPos > iVectorSize - 1)) { DebugError("Writing vector out of bounds", "Vector size", iVectorSize, "New parameter", iPos); } #endif return pData[iPos];} inline TData operator[](const int iPos) const { #ifdef _DEBUG_ if ((iPos < 0) || (iPos > iVectorSize - 1)) { DebugError("Reading vector out of bounds", "Vector size", iVectorSize, "New parameter", iPos); } #endif return pData[iPos];} inline CVector& operator=(const CVector& vecI) { #ifdef _DEBUG_ /* Vectors which shall be copied MUST have same size! (If this is satisfied, the parameter "iVectorSize" must not be adjusted as a side effect) */ if (vecI.Size() != iVectorSize) { DebugError("Vector operator=() different size", "Vector size", iVectorSize, "New parameter", vecI.Size()); } #endif vector::operator=(vecI); /* Reset my data pointer in case, the operator=() of the base class did change the actual memory */ pData = this->begin(); return *this; } /* Bit operation functions */ void Enqueue(uint32_t iInformation, const int iNumOfBits); uint32_t Separate(const int iNumOfBits); void ResetBitAccess() {iBitArrayCounter = 0;} protected: typename vector::iterator pData; int iBitArrayCounter; int iVectorSize; }; /* Implementation *************************************************************/ template void CVector::Init(const int iNewSize) { iVectorSize = iNewSize; /* Clear old buffer and reserve memory for new buffer, get iterator for pointer operations */ this->clear(); this->resize(iNewSize); pData = this->begin(); } template void CVector::Init(const int iNewSize, const TData tIniVal) { /* Call actual init routine */ Init(iNewSize); /* Set values */ Reset(tIniVal); } template void CVector::Enlarge(const int iAddedSize) { iVectorSize += iAddedSize; this->resize(iVectorSize); /* We have to reset the pointer since it could be that the vector size was zero before enlarging the vector */ pData = this->begin(); } template void CVector::Reset(const TData tResetVal) { /* Set all values to reset value */ for (int i = 0; i < iVectorSize; i++) pData[i] = tResetVal; } template void CVector::Enqueue(uint32_t iInformation, const int iNumOfBits) { /* Enqueue bits in bit array */ for (int i = 0; i < iNumOfBits; i++) { /* We want to put the bits on the array with the MSB first */ operator[](iBitArrayCounter + iNumOfBits - i - 1) = _BINARY(iInformation & 1); /* Shift one bit to mask next bit at LSB-position */ iInformation >>= 1; } iBitArrayCounter += iNumOfBits; } template uint32_t CVector::Separate(const int iNumOfBits) { uint32_t iInformation; /* Check, if current position plus new bit-size is smaller than the maximum length of the bit vector. Error code: return a "0" */ if (iBitArrayCounter + iNumOfBits > iVectorSize) return 0; /* Separate out bits from bit-array */ iInformation = 0; for (int i = 0; i < iNumOfBits; i++) { /* MSB comes first, therefore shift left */ iInformation <<= 1; iInformation |= pData[iBitArrayCounter + i] & 1; } iBitArrayCounter += iNumOfBits; return iInformation; } /******************************************************************************\ * CShiftRegister class * \******************************************************************************/ template class CShiftRegister : public CVector { public: CShiftRegister() : CVector() {} CShiftRegister(const int iNeSi) : CVector(iNeSi) {} CShiftRegister(const int iNeSi, const TData tInVa) : CVector(iNeSi, tInVa) {} /* Add one value at the beginning, shift the others to the right */ void AddBegin(const TData tNewD); /* Add one value at the end, shift the others to the left */ void AddEnd(const TData tNewD); /* Add a vector at the end, shift others to the left */ void AddEnd(const CVector& vectNewD, const int iLen); }; /* Implementation *************************************************************/ template void CShiftRegister::AddBegin(const TData tNewD) { /* Shift old values */ for (int i = this->iVectorSize - 1; i > 0; i--) this->pData[i] = this->pData[i - 1]; /* Add new value */ this->pData[0] = tNewD; } template void CShiftRegister::AddEnd(const TData tNewD) { /* Shift old values */ for (int i = 0; i < this->iVectorSize - 1; i++) this->pData[i] = this->pData[i + 1]; /* Add new value */ this->pData[this->iVectorSize - 1] = tNewD; } template void CShiftRegister::AddEnd(const CVector& vectNewD, const int iLen) { int i, iBlockEnd, iMovLen; iBlockEnd = this->iVectorSize - iLen; iMovLen = iLen; /* Shift old values */ for (i = 0; i < iBlockEnd; i++) this->pData[i] = this->pData[iMovLen++]; /* Add new block of data */ for (i = 0; i < iLen; i++) this->pData[iBlockEnd++] = vectNewD[i]; } /******************************************************************************\ * CFIFO class (first in, first out) * \******************************************************************************/ template class CFIFO : public CVector { public: CFIFO() : CVector(), iCurIdx(0) {} CFIFO(const int iNeSi) : CVector(iNeSi), iCurIdx(0) {} CFIFO(const int iNeSi, const TData tInVa) : CVector(iNeSi, tInVa), iCurIdx(0) {} void Add(const TData tNewD); inline TData Get() {return this->pData[iCurIdx];} virtual void Init(const int iNewSize); virtual void Init(const int iNewSize, const TData tIniVal); protected: int iCurIdx; }; template void CFIFO::Init(const int iNewSize) { iCurIdx = 0; CVector::Init(iNewSize); } template void CFIFO::Init(const int iNewSize, const TData tIniVal) { iCurIdx = 0; CVector::Init(iNewSize, tIniVal); } template void CFIFO::Add(const TData tNewD) { this->pData[iCurIdx] = tNewD; /* Increment index */ iCurIdx++; if (iCurIdx >= this->iVectorSize) iCurIdx = 0; } /******************************************************************************\ * CMovingAv class (moving average) * \******************************************************************************/ template class CMovingAv : public CVector { public: CMovingAv() : CVector(), iCurIdx(0) {} CMovingAv(const int iNeSi) : CVector(iNeSi), iCurIdx(0) {} CMovingAv(const int iNeSi, const TData tInVa) : CVector(iNeSi, tInVa), iCurIdx(0) {} void Add(const TData tNewD); inline TData GetAverage() {return tCurAvResult;} virtual void Init(const int iNewSize); void InitVec(const int iNewSize, const int iNewVecSize); protected: int iCurIdx; TData tCurAvResult; }; template void CMovingAv::InitVec(const int iNewSize, const int iNewVecSize) { iCurIdx = 0; CVector::Init(iNewSize); /* Init each vector in vector */ for (int i = 0; i < iNewSize; i++) this->pData[i].Init(iNewVecSize, 0); /* Init current average result */ tCurAvResult.Init(iNewVecSize, 0); } template void CMovingAv::Init(const int iNewSize) { iCurIdx = 0; tCurAvResult = TData(0); /* Only for scalars! */ CVector::Init(iNewSize); } template void CMovingAv::Add(const TData tNewD) { /* Optimized calculation of the moving average. We only add a new value and subtract the old value from the result. We only need one addition and a history buffer */ /* Subtract oldest value */ tCurAvResult -= this->pData[iCurIdx]; /* Add new value and write in memory */ tCurAvResult += tNewD; this->pData[iCurIdx] = tNewD; /* Increase position pointer and test if wrap */ iCurIdx++; if (iCurIdx >= this->iVectorSize) iCurIdx = 0; } /******************************************************************************\ * CVectorEx class (Extended vector with additional information) * \******************************************************************************/ class CExtendedVecData { public: /* Symbol ID of the current block. This number only identyfies the position in a frame, NOT in a super-frame */ int iSymbolID; /* This flag indicates that the symbol ID has changed */ _BOOLEAN bSymbolIDHasChanged; /* The channel estimation needs information about timing corrections, because it is using information from the symbol memory */ int iCurTimeCorr; }; template class CVectorEx : public CVector { public: CVectorEx() {} virtual ~CVectorEx() {} CExtendedVecData& GetExData() {return ExtendedData;} void SetExData(CExtendedVecData& NewExData) {ExtendedData = NewExData;} protected: CExtendedVecData ExtendedData; }; /******************************************************************************\ * CMatrix base class * \******************************************************************************/ template class CMatrix { public: CMatrix() : ppData(NULL), iRow(0), iCol(0) {} CMatrix(const int iNewR, const int iNewC) {Init(iNewR, iNewC);} CMatrix(const int iNewR, const int iNewC, const TData tInVa) {Init(iNewR, iNewC, tInVa);} CMatrix(const CMatrix& m): ppData(NULL) { Init(m.iRow,m.iCol); for (int i=0; i& operator[](const int iPos) const { #ifdef _DEBUG_ if ((iPos < 0) || (iPos > iRow - 1)) { DebugError("Matrix: Writing vector out of bounds", "Row size", iRow, "New parameter", iPos); } #endif return ppData[iPos];} inline CMatrix& operator=(const CMatrix& m) { this->Init(m.NumRows(), m.NumColumns()); for (int i=0; ippData[i] = m[i]; return *this; } #ifdef _DEBUG_ inline CVector operator[](const int iPos) const { if ((iPos < 0) || (iPos > iRow - 1)) { DebugError("Matrix: Reading vector out of bounds", "Row size", iRow, "New parameter", iPos); } return ppData[iPos];} #endif inline int NumRows(void) const { return iRow;} inline int NumColumns(void) const { return iCol;} protected: CVector* ppData; int iRow; int iCol; }; /* Implementation *************************************************************/ template void CMatrix::Init(const int iNewRow, const int iNewColumn) { iRow = iNewRow; iCol = iNewColumn; if (iRow > 0) { /* Delete resources from previous init */ if (ppData != NULL) delete[] ppData; /* Allocate new memory for history buffer */ ppData = new CVector[iRow]; for (int i = 0; i < iRow; i++) ppData[i].Init(iNewColumn); } } template void CMatrix::Init(const int iNewRow, const int iNewColumn, const TData tIniVal) { /* Call actual init routine */ Init(iNewRow, iNewColumn); /* Set values */ Reset(tIniVal); } template void CMatrix::Reset(const TData tResetVal) { /* Set all values to reset value */ for (int i = 0; i < iRow; i++) for (int j = 0; j < ppData[i].Size(); j++) ppData[i][j] = tResetVal; } template CMatrix::~CMatrix() { /* Delete buffer */ if (ppData != NULL) delete[] ppData; } #endif // !defined(VECTOR_H__3B0BA660_CA6LIUBEFIB2B_23E7A0D31912__INCLUDED_) qsstv_9.2.6/qsstv/videocapt/cameradialog.cpp0000664000175000017500000002376013203343610017707 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "cameradialog.h" #include "ui_cameradialog.h" #include "appglobal.h" #include #include "imagesettings.h" #include "videocapture.h" #include #include #include #include #include #include //#include //#include #define NUMRES 5 //standard resolutions int standardResolution[NUMRES][2]= { // {1920,1080}, {1280,720}, {800,600}, {640,480}, {320,240}, {160,120} }; cameraDialog::cameraDialog(QWidget *parent) : QDialog(parent), ui(new Ui::cameraDialog) { ui->setupUi(this); cameraActive=false; videoCapturePtr=NULL; listCameraDevices(); if(cameraList.count()==0) { return; } connect(ui->settingsButton,SIGNAL(clicked()),SLOT(slotSettings())); ui->devicesComboBox->setCurrentIndex(0); imageSettings settingsDialog(cameraList.at(0).deviceName); videoCapturePtr=new videoCapture; connect(ui->devicesComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotDeviceChanged(int))); connect(ui->formatsComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotFormatChanged(int))); connect(ui->sizeComboBox,SIGNAL(currentIndexChanged(int)),SLOT(slotSizeChanged(int))); timerID=0; } cameraDialog::~cameraDialog() { delete ui; } int cameraDialog::exec() { if(!restartCapturing(true)) { QMessageBox::warning(this,"Capturing","Unable to start capturing"); return QDialog::Rejected; } int result; addToLog("cameracontrol exec",LOGCAM); result=QDialog::exec(); deactivateTimer(); videoCapturePtr->stopStreaming(); videoCapturePtr->close(); if(result==QDialog::Accepted) return true; return false; } void cameraDialog::deactivateTimer() { if(timerID) killTimer(timerID); timerID=0; } void cameraDialog::timerEvent(QTimerEvent *) { int ret; qDebug() << "capt"; ret=videoCapturePtr->getFrame(); if(ret>0) { ui->viewFinder->openImage(*videoCapturePtr->getImage()); } else if(ret==0) { return; } else { deactivateTimer(); videoCapturePtr->stopStreaming(); videoCapturePtr->close(); QMessageBox::critical(this,"Capture error",videoCapturePtr->getErrorString()); } } QImage *cameraDialog::getImage() { return videoCapturePtr->getImage(); } void cameraDialog::slotSettings() { imageSettings settingsDialog(cameraList.at(ui->devicesComboBox->currentIndex()).deviceName); settingsDialog.exec(); } void cameraDialog::listCameraDevices() { int i; cameraList.clear(); QDir devDir("/dev"); QStringList devList; devDir.setFilter(QDir::System| QDir::NoSymLinks); devDir.setSorting(QDir::Name); devDir.setNameFilters(QStringList("video*")); devList=devDir.entryList(); getCameraInfo(devList); for(i=0;idevicesComboBox->addItem(cameraList.at(i).deviceDescription); } if(cameraList.count()>0) setupFormatComboBox(cameraList.at(0)); } void cameraDialog::setupFormatComboBox(scameraDevice cd) { int i; ui->formatsComboBox->blockSignals(true); ui->formatsComboBox->clear(); for(i=0;iformatsComboBox->addItem(cd.formats.at(i).description); } ui->formatsComboBox->setCurrentIndex(cd.formatIdx); ui->formatsComboBox->blockSignals(false); setupSizeComboBox(cd.formats.at(cd.formatIdx)); } void cameraDialog::setupSizeComboBox(sformats frmat) { int i; ui->sizeComboBox->blockSignals(true); ui->sizeComboBox->clear(); for(i=0;isizeComboBox->addItem(frmat.cameraSizes.at(i).description); } ui->sizeComboBox->setCurrentIndex(frmat.sizeIdx); ui->sizeComboBox->blockSignals(false); } void cameraDialog::getCameraInfo(QStringList devList) { int fd; int i; bool ok=true; QString camDev; QList formats; for(i=0;i>8)&0xFF; t+=(pixelFormat>>16)&0xFF; t+=(pixelFormat>>24)&0xFF; return t; } QList cameraDialog::getFormatList(int fd) { int j,ret; unsigned int resx,resy; QList formatsList; v4l2_frmsizeenum frm; struct v4l2_fmtdesc fmt; QList scsList; int i = 0; do { scsList.clear(); memset(&fmt, 0, sizeof fmt); fmt.index = i; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if ((ret = v4l2_ioctl(fd, VIDIOC_ENUM_FMT, &fmt)) < 0) break; else { frm.index=0; frm.pixel_format=fmt.pixelformat; while(v4l2_ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frm) >=0) { if(frm.type==V4L2_FRMSIZE_TYPE_DISCRETE) { scsList.append(scameraSizes(frm.discrete.width,frm.discrete.height,QString("%1x%2").arg(frm.discrete.width).arg(frm.discrete.height))); } else // we have a stepwise resolution { // scsList.append(scameraSizes(frm.stepwise.max_width,frm.stepwise.max_height,QString("%1x%2").arg(frm.stepwise.max_width).arg(frm.stepwise.max_height))); for(j=0;j=frm.stepwise.min_width) && (resy>=frm.stepwise.min_height)) scsList.append(scameraSizes(resx,resy,QString("%1x%2").arg(resx).arg(resy))); } } frm.index++; } formatsList.append(sformats(fmt.pixelformat,pixelFormatStr(fmt.pixelformat),scsList)); } i++; } while (ret != EINVAL); return formatsList; } void cameraDialog::slotDeviceChanged(int idx) { setupFormatComboBox(cameraList.at(idx)); slotFormatChanged(cameraList.at(idx).formatIdx); } void cameraDialog::slotFormatChanged(int idx) { setupSizeComboBox(cameraList.at(ui->devicesComboBox->currentIndex()).formats.at(idx)); slotSizeChanged(cameraList.at(ui->devicesComboBox->currentIndex()).formats.at(idx).sizeIdx); cameraList[(ui->devicesComboBox->currentIndex())].formatIdx=idx; } void cameraDialog::slotSizeChanged(int idx) { cameraList[ui->devicesComboBox->currentIndex()].formats[ui->formatsComboBox->currentIndex()].sizeIdx=idx; restartCapturing(); } bool cameraDialog::restartCapturing(bool first) { int ret; if(!videoCapturePtr) return false; if(!first) { deactivateTimer(); videoCapturePtr->stopStreaming(); videoCapturePtr->close(); } ret=videoCapturePtr->open(cameraList.at(ui->devicesComboBox->currentIndex()).deviceName); if(ret<0) { return false; } if(!videoCapturePtr->init(cameraList.at(ui->devicesComboBox->currentIndex()).formats.at(ui->formatsComboBox->currentIndex()).format, cameraList.at(ui->devicesComboBox->currentIndex()).formats.at(ui->formatsComboBox->currentIndex()).cameraSizes.at(ui->sizeComboBox->currentIndex()).width, cameraList.at(ui->devicesComboBox->currentIndex()).formats.at(ui->formatsComboBox->currentIndex()).cameraSizes.at(ui->sizeComboBox->currentIndex()).height)) { return false; } cameraActive=true; videoCapturePtr->startSnapshots(); timerID=startTimer(50); return true; } qsstv_9.2.6/qsstv/videocapt/cameradialog.h0000664000175000017500000000342613203343610017351 0ustar jomajoma#ifndef CAMERADIALOG_H #define CAMERADIALOG_H #include #include namespace Ui { class cameraDialog; } class videoCapture; struct scameraSizes { scameraSizes(int w,int h,QString desc) { description=desc; width=w; height=h; } QString description; int width; int height; }; struct sformats { sformats(int frmt,QString desc,QList cs) { format=frmt; description=desc; cameraSizes=cs; sizeIdx=0; } int format; QString description; int sizeIdx; bool stepwise; QList cameraSizes; }; struct scameraDevice { scameraDevice(QString devName,QString devDescription,QString driv,QString bus,QList frmts) { deviceName=devName; deviceDescription=devDescription; driver=driv; busInfo=bus; formats=frmts; formatIdx=0; } QString deviceName; QString deviceDescription; QString driver; QString busInfo; QList formats; int formatIdx; }; class cameraDialog : public QDialog { Q_OBJECT public: explicit cameraDialog(QWidget *parent = 0); ~cameraDialog(); int exec(); QImage *getImage(); private slots: void slotSettings(); void slotDeviceChanged(int idx); void slotFormatChanged(int idx); void slotSizeChanged(int idx); private: Ui::cameraDialog *ui; void listCameraDevices(); QList cameraList; void getCameraInfo(QStringList devList); videoCapture *videoCapturePtr; bool cameraActive; void timerEvent(QTimerEvent *event); QString pixelFormatStr(int pixelFormat); QList getFormatList(int fd); void setupFormatComboBox(scameraDevice cd); void setupSizeComboBox(sformats frmat); int timerID; bool restartCapturing(bool first=false); void deactivateTimer(); }; #endif // CAMERADIALOG_H qsstv_9.2.6/qsstv/videocapt/cameradialog.ui0000664000175000017500000001411013203343610017527 0ustar jomajoma cameraDialog 0 0 585 361 Camera 1 0 255 255 255 145 145 145 255 255 255 145 145 145 145 145 145 145 145 145 0 TextLabel 0 0 QFrame::Box true Settings Devices Qt::AlignCenter Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok imageViewer QLabel
imageviewer.h
buttonBox accepted() cameraDialog accept() 248 254 157 274 buttonBox rejected() cameraDialog reject() 316 260 286 274
qsstv_9.2.6/qsstv/videocapt/imagesettings.cpp0000664000175000017500000002062713203343610020141 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * * * * * Part of this software has been copied from examples of the Qt Toolkit. * ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "imagesettings.h" #include "ui_imagesettings.h" #include "v4l2control.h" #include #include #include #include #include #include #include #include #include imageSettings::imageSettings(QString cameraDevice, QWidget *parent) : QDialog(parent) { camDev=cameraDevice.toLatin1(); ui= new Ui::imageSettingsUi; ui->setupUi(this); gridLayout=NULL; loadCapabilities(); ui->buttonBox->button(QDialogButtonBox::Ok)->setDefault(false); ui->buttonBox->button(QDialogButtonBox::Cancel)->setDefault(false); } imageSettings::~imageSettings() { delete ui; } bool imageSettings::loadCapabilities() { int fd; struct v4l2_capability cap; struct v4l2_queryctrl ctrl; row=0; fd = v4l2_open(camDev, O_RDWR, 0); if(fd < 0) { QString msg= msg.sprintf("Unable to open file %s\n%s", camDev.constData(), strerror(errno)); QMessageBox::warning(NULL, "v4l2ucp: Unable to open file", msg, "OK"); return false; } if(v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == -1) { QString msg; msg.sprintf("%s is not a V4L2 device", camDev.constData()); QMessageBox::warning(NULL, "v4l2ucp: Not a V4L2 device", msg, "OK"); return false; } ui->driverLabel->setText((const char *)cap.driver); ui->cardLabel->setText((const char *)cap.card); ui->busLabel->setText((const char *)cap.bus_info); ui->deviceLabel->setText(camDev.constData()); #ifdef V4L2_CTRL_FLAG_NEXT_CTRL /* Try the extended control API first */ ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL; if(v4l2_ioctl (fd, VIDIOC_QUERYCTRL, &ctrl)==0) { do { addControl(ctrl, fd); ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL; } while(v4l2_ioctl (fd, VIDIOC_QUERYCTRL, &ctrl)==0); } else #endif { /* Fall back on the standard API */ /* Check all the standard controls */ for(int i=V4L2_CID_BASE; iaddWidget(l,row,0); gridLayout->addWidget(w,row,1); if(ctrl.flags & V4L2_CTRL_FLAG_GRABBED) { w->setEnabled(false); } else { w->setEnabled(true); } QPushButton *pb; pb = new QPushButton("Update", grid); gridLayout->addWidget(pb,row,2); QObject::connect( pb, SIGNAL(clicked()), w, SLOT(updateStatus()) ); if(ctrl.type == V4L2_CTRL_TYPE_BUTTON) { l = new QLabel(grid); gridLayout->addWidget(l,row,3); } else { pb = new QPushButton("Reset", grid); gridLayout->addWidget(pb,row,3); QObject::connect(pb, SIGNAL(clicked()), w, SLOT(resetToDefault()) ); } row++; } void imageSettings::addNewTab(QString tabName) { QVBoxLayout *vLayout; QWidget *tab=new QWidget(); vLayout = new QVBoxLayout(tab); QScrollArea *scrollArea = new QScrollArea(tab); scrollArea->setWidgetResizable(true); grid = new QWidget(); grid->setGeometry(QRect(0, 0, 592, 100)); scrollArea->setWidget(grid); vLayout->addWidget(scrollArea); ui->tabWidget->addTab(tab, tabName); gridLayout = new QGridLayout(); grid->setLayout(gridLayout); gridLayout->setSpacing(0); gridLayout->setMargin(1); gridLayout->setContentsMargins(0, 0, 0, 0); } void imageSettings::showEvent(QShowEvent * event) { ui->buttonBox->button(QDialogButtonBox::Ok)->setDefault(false); ui->buttonBox->button(QDialogButtonBox::Cancel)->setDefault(false); QDialog::showEvent(event); } qsstv_9.2.6/qsstv/videocapt/imagesettings.h0000664000175000017500000000527313203343610017606 0ustar jomajoma/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef IMAGESETTINGS_H #define IMAGESETTINGS_H #include /* for videodev2.h */ #include #include #include class QCameraImageCapture; namespace Ui { class imageSettingsUi; } class imageSettings : public QDialog { Q_OBJECT public: imageSettings(QString cameraDevice, QWidget *parent = 0); ~imageSettings(); private: QByteArray camDev; Ui::imageSettingsUi *ui; QCameraImageCapture *imagecapture; bool loadCapabilities(); void addControl(struct v4l2_queryctrl &ctrl, int fd); void addNewTab(QString tabName); QWidget *grid; QGridLayout *gridLayout; int row; void showEvent(QShowEvent * event); }; #endif // IMAGESETTINGS_H qsstv_9.2.6/qsstv/videocapt/imagesettings.ui0000664000175000017500000001067513203343610017776 0ustar jomajoma imageSettingsUi 0 0 600 320 Camera Device 0 General Card: Driver: Bus: Device: Qt::Horizontal 40 20 Qt::Vertical 20 382 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() imageSettingsUi accept() 322 272 44 230 buttonBox rejected() imageSettingsUi reject() 405 262 364 227 qsstv_9.2.6/qsstv/videocapt/v4l2control.cpp0000664000175000017500000002010213203343610017452 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * * * This software has been partially copied from the program: * * qv4l2: a control panel controlling v4l2 devices. * * * * Copyright (C) 2006 Hans Verkuil * * ***************************************************************************/ #include "v4l2control.h" #include #include #include //#include #include /* for videodev2.h */ #include #include #include #include #include #include //#include V4L2Control::V4L2Control(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : QWidget(parent), cid(ctrl.id), default_value(ctrl.default_value) { this->fd = fd; strncpy(name, (const char *)ctrl.name, sizeof(name)); name[sizeof(name)-1] = '\0'; layout.setSpacing(1); layout.setContentsMargins(0,0,0,0); this->setLayout(&layout); } void V4L2Control::updateHardware() { struct v4l2_control c; c.id = cid; c.value = getValue(); if(v4l2_ioctl(fd, VIDIOC_S_CTRL, &c) == -1) { QString msg; msg.sprintf("Unable to set %s\n%s", name, strerror(errno)); QMessageBox::warning(this, "Unable to set control", msg, "OK"); } updateStatus(); } void V4L2Control::updateStatus() { struct v4l2_control c; c.id = cid; if(v4l2_ioctl(fd, VIDIOC_G_CTRL, &c) == -1) { QString msg; msg.sprintf("Unable to get %s\n%s", name,strerror(errno)); QMessageBox::warning(this, "Unable to get control", msg, "OK"); } else { if(c.value != getValue()) setValue(c.value); } struct v4l2_queryctrl ctrl; ctrl.id = cid; if(v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &ctrl) == -1) { QString msg; msg.sprintf("Unable to get the status of %s\n%s", name,strerror(errno)); QMessageBox::warning(this, "Unable to get control status", msg, "OK"); } else { setEnabled((ctrl.flags &( V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_GRABBED)) == 0); } } void V4L2Control::resetToDefault() { if(isEnabled()) { setValue(default_value); updateHardware(); } } /* * V4L2IntegerControl */ V4L2IntegerControl::V4L2IntegerControl (int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : V4L2Control(fd, ctrl, parent), minimum(ctrl.minimum), maximum(ctrl.maximum), step(ctrl.step) { int pageStep = (maximum-minimum)/10; if(step > pageStep) pageStep = step; sl = new QSlider(Qt::Horizontal, this); sl->setMinimum(minimum); sl->setMaximum(maximum); sl->setFocusPolicy(Qt::StrongFocus); sl->setPageStep(pageStep); sl->setValue(default_value); sl->setVisible(true); this->layout.addWidget(sl); QString defStr; defStr.setNum(default_value); le = new QLineEdit(this); le->setText(defStr); le->setValidator(new QIntValidator(minimum, maximum, this)); this->layout.addWidget(le); QObject::connect( sl, SIGNAL(valueChanged(int)),this, SLOT(SetValueFromSlider()) ); QObject::connect( sl, SIGNAL(sliderReleased()), this, SLOT(SetValueFromSlider()) ); QObject::connect( le, SIGNAL(returnPressed()), this, SLOT(SetValueFromText()) ); updateStatus(); } void V4L2IntegerControl::setValue(int val) { if(val < minimum) val = minimum; if(val > maximum) val = maximum; if(step > 1) { int mod = (val-minimum)%step; if(mod > step/2) { val += step-mod; } else { val -= mod; } } QString str; str.setNum(val); le->setText(str); /* FIXME: find clean solution to prevent infinite loop */ sl->blockSignals(true); sl->setValue(val); sl->blockSignals(false); } int V4L2IntegerControl::getValue() { return sl->value(); } void V4L2IntegerControl::SetValueFromSlider() { setValue(sl->value()); updateHardware(); } void V4L2IntegerControl::SetValueFromText() { if(le->hasAcceptableInput()) { setValue(le->text().toInt()); updateHardware(); } else { SetValueFromSlider(); } } /* * V4L2BooleanControl */ V4L2BooleanControl::V4L2BooleanControl (int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : V4L2Control(fd, ctrl, parent), cb(new QCheckBox(this)) { this->layout.addWidget(cb); QObject::connect( cb, SIGNAL(clicked()), this, SLOT(updateHardware()) ); updateStatus(); } void V4L2BooleanControl::setValue(int val) { cb->setChecked(val != 0); } int V4L2BooleanControl::getValue() { return cb->isChecked(); } /* * V4L2MenuControl */ V4L2MenuControl::V4L2MenuControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : V4L2Control(fd, ctrl, parent) { int i,j; int defIdx=0; cb = new QComboBox(this); this->layout.addWidget(cb); for(i=ctrl.minimum,j=0; i<=ctrl.maximum; i++,j++) { struct v4l2_querymenu qm; qm.id = ctrl.id; qm.index = i; if(v4l2_ioctl(fd, VIDIOC_QUERYMENU, &qm) == 0) { cb->insertItem(i, (const char *)qm.name); indexValueArray[j]=i; if(i==default_value) { defIdx=j; } } else { cb->insertItem(i,"Unsupported"); } } // cb->setCurrentIndex(defIdx); setValue(defIdx); QObject::connect( cb, SIGNAL(activated(int)), this, SLOT(menuActivated(int)) ); updateStatus(); updateHardware(); } void V4L2MenuControl::setValue(int val) { cb->setCurrentIndex(val); } int V4L2MenuControl::getValue() { return indexValueArray[cb->currentIndex()]; } void V4L2MenuControl::menuActivated(int val) { setValue(val); updateHardware(); } /* * V4L2ButtonControl */ V4L2ButtonControl::V4L2ButtonControl (int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent) : V4L2Control(fd, ctrl, parent) { QPushButton *pb = new QPushButton((const char *)ctrl.name, this); this->layout.addWidget(pb); QObject::connect( pb, SIGNAL(clicked()), this, SLOT(updateHardware()) ); } void V4L2ButtonControl::updateStatus() { struct v4l2_queryctrl ctrl; ctrl.id = cid; if(v4l2_ioctl(fd, VIDIOC_QUERYCTRL, &ctrl) == -1) { QString msg; msg.sprintf("Unable to get the status of %s\n%s", name, strerror(errno)); QMessageBox::warning(this, "Unable to get control status", msg, "OK"); } else { setEnabled((ctrl.flags &( V4L2_CTRL_FLAG_DISABLED | V4L2_CTRL_FLAG_GRABBED)) == 0); } } void V4L2ButtonControl::resetToDefault() { } qsstv_9.2.6/qsstv/videocapt/v4l2control.h0000664000175000017500000000362413203343610017131 0ustar jomajoma#ifndef V4L2CONTROL_H #define V4L2CONTROL_H #include #include #include #include #include #include #include class V4L2Control : public QWidget { Q_OBJECT public slots: void updateHardware(); virtual void updateStatus(); virtual void resetToDefault(); virtual void setValue(int val) = 0; public: virtual int getValue() = 0; protected: V4L2Control(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); int fd; int cid; int default_value; char name[32]; QHBoxLayout layout; }; class V4L2IntegerControl : public V4L2Control { Q_OBJECT public: V4L2IntegerControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); public slots: void setValue(int val); public: int getValue(); private slots: void SetValueFromSlider(void); void SetValueFromText(void); private: int minimum; int maximum; int step; QSlider *sl; QLineEdit *le; }; class V4L2BooleanControl : public V4L2Control { Q_OBJECT public: V4L2BooleanControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); public slots: void setValue(int val); public: int getValue(); private: QCheckBox *cb; }; class V4L2MenuControl : public V4L2Control { Q_OBJECT public: V4L2MenuControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); public slots: void setValue(int val); public: int getValue(); private: QComboBox *cb; short int indexValueArray[256]; private slots: void menuActivated(int val); }; class V4L2ButtonControl : public V4L2Control { Q_OBJECT public slots: void updateStatus(); void resetToDefault(); public: V4L2ButtonControl(int fd, const struct v4l2_queryctrl &ctrl, QWidget *parent); public slots: void setValue(int) {}; int getValue() { return 0; }; }; #endif // V4L2CONTROL_H qsstv_9.2.6/qsstv/videocapt/videocapture.cpp0000664000175000017500000003024413203343610017764 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * * * This software contains parts of the following softwares * * videoCapture.cpp -- Kapture * * * * Copyright (C) 2006-2009 * * Detlev Casanova (detlev.casanova@gmail.com) * * * * qv4l2: a control panel controlling v4l2 devices. * * * * Copyright (C) 2006 Hans Verkuil * * ***************************************************************************/ #include "videocapture.h" #include "configparams.h" #include "appglobal.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include videoCapture::videoCapture() { dev = 0; opened = false; allocated = false; localImage=NULL; numBuffers=2; } videoCapture::~videoCapture() { if(localImage!=NULL) delete localImage; close(); } void videoCapture::close() { if(!opened) return; v4l2_close(dev); opened = false; allocated = false; } bool videoCapture::open(QString videoDev) { videoDevice=videoDev; if (opened) return true; addToLog("opening Videocapture device",LOGCAM); dev = v4l2_open(videoDevice.toLatin1().data(), O_RDWR); if (dev < 0) { addToLog(QString("Error opening %1, %2").arg(videoDevice).arg(errno),LOGCAM); return false; } // dumpCaps(cap); opened = true; return opened; } bool videoCapture::init(int pixelFormat,int width,int height) { getFormat(srcFmt); srcFmt.fmt.pix.pixelformat=pixelFormat; srcFmt.fmt.pix.width=width; srcFmt.fmt.pix.height=height; // srcFmt.fmt.pix.width=320; // srcFmt.fmt.pix.height=240; setFormat(srcFmt); dstFmt=srcFmt; qFmt=checkConversionNeeded(); if(qFmt==QImage::Format_Invalid) { needsConversion=true; convertData = v4lconvert_create(dev); dstFmt.fmt.pix.pixelformat=V4L2_PIX_FMT_RGB24; qFmt=QImage::Format_RGB888; } else { needsConversion=false; } if(needsConversion) { v4lconvert_try_format(convertData, &dstFmt, &srcFmt); getFormat(srcFmt); //restore srcFmt } if(localImage) delete localImage; localImage=new QImage( dstFmt.fmt.pix.width,dstFmt.fmt.pix.height,qFmt); if (!allocated) { if(allocateBuffers(numBuffers)>=0) { allocated=true; } else { return false; } } else { allocateBuffers(0); // deallocate buffers if(allocateBuffers(numBuffers)>=0) { allocated=true; } else { return false; } } return true; } int videoCapture::allocateBuffers(int numBufs) { int ret; memset(&rb, 0, sizeof rb); rb.count = numBufs; rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; rb.memory = V4L2_MEMORY_MMAP; ret = v4l2_ioctl(dev, VIDIOC_REQBUFS, &rb); if (ret < 0) { addToLog(QString("Unable to allocate buffers for %1, %2").arg(videoDevice).arg(errno),LOGCAM); } return ret; } bool videoCapture::setFormat(v4l2_format &fmt) { addToLog("setFormat",LOGCAM); // memset(&fmt, 0, sizeof fmt); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // fmt.fmt.pix.width = width; // fmt.fmt.pix.height = height; fmt.fmt.pix.field = V4L2_FIELD_ANY; // fmt.fmt.pix.pixelformat = pixelformat; // fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; // fmt.fmt.pix.pixelformat =V4L2_PIX_FMT_RGB24; fmt.fmt.pix.bytesperline=0; if (v4l2_ioctl(dev, VIDIOC_S_FMT, &fmt) < 0) { addToLog(QString("Error while setting format , %1").arg(strerror(errno)),LOGCAM); return false; } getFormat(fmt); return true; } bool videoCapture::getFormat(v4l2_format &fmt) { addToLog("getFormat",LOGCAM); memset(&fmt, 0, sizeof fmt); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (v4l2_ioctl(dev, VIDIOC_G_FMT, &fmt) < 0) { addToLog(QString("Error while getting format , %1").arg(errno),LOGCAM); return false; } return true; } int videoCapture::getFrame() { int ret = 0; // Dequeue a buffer. errorString.clear(); ret = v4l2_ioctl(dev, VIDIOC_DQBUF, &buf); //addToLog(QString("Dequeue buffer %1").arg(buf.index),LOGCAM); if(ret==EAGAIN) { return 0; } else if (ret < 0) { addToLog(QString("Unable to dequeue buffer , %1").arg(strerror(errno)),LOGCAM); errorString=QString("Unable to dequeue buffer , %1").arg(strerror(errno)); return -1; } convert(mem[buf.index]); // Requeue the buffer. ret = v4l2_ioctl(dev, VIDIOC_QBUF, &buf); //addToLog(QString("Requeue buffer %1").arg(buf.index),LOGCAM); if (ret < 0) { addToLog(QString("Unable to requeue buffer %1").arg(errno),LOGCAM); return -1; } return 1; } bool videoCapture::convert(unsigned char *src) { int result=0; // if (localImage!=NULL) delete localImage; // localImage=new QImage( dstFmt.fmt.pix.width,dstFmt.fmt.pix.height,qFmt); if(needsConversion) { result=v4lconvert_convert(convertData,&srcFmt,&dstFmt, src,srcFmt.fmt.pix.sizeimage, localImage->bits(),dstFmt.fmt.pix.sizeimage); } else { memcpy(localImage->bits(),src,localImage->byteCount()); } if (result<0) return false; return true; } int videoCapture::currentWidth(v4l2_format fmt) const { return (int) fmt.fmt.pix.width; } int videoCapture::currentHeight(v4l2_format fmt) const { return (int) fmt.fmt.pix.height; } int videoCapture::currentPixelFormat(v4l2_format fmt) const { return (int) fmt.fmt.pix.pixelformat; } bool videoCapture::captureStop() { int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; int ret; if(!streaming) return false; ret = v4l2_ioctl(dev, VIDIOC_STREAMOFF, &type); if (ret < 0) { addToLog(QString("Unable to stop capture, %1").arg(errno),LOGCAM); return false; } streaming = false; return true; } bool videoCapture::captureStart() { int i, ret; if (!opened) return false; addToLog("captureStart",LOGCAM); //Allocate buffers if(!mmapped) { // Map the buffers. memset(&buf, 0, sizeof buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; for (i = 0; i < numBuffers; i++) { buf.index = i; ret = v4l2_ioctl(dev, VIDIOC_QUERYBUF, &buf); if (ret < 0) { addToLog(QString("Unable to query buffer %1").arg(ret),LOGCAM); return false; } mem[i] = (uchar *) v4l2_mmap(0, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, dev, buf.m.offset); if (mem[i] == MAP_FAILED) { addToLog(QString("Unable to map buffers %1").arg(ret),LOGCAM); return false; } bufLength = buf.length; mmapped = true; } // Queue the buffers for (i = 0; i < numBuffers; i++) { buf.index = i; ret = v4l2_ioctl(dev, VIDIOC_QBUF, &buf); if (ret < 0) { addToLog(QString("Unable to queue buffer %1").arg(errno),LOGCAM); return false; } } } // Start streaming. ret = v4l2_ioctl(dev, VIDIOC_STREAMON, &buf.type); if (ret < 0) { addToLog(QString("Unable to start capture %1").arg(errno),LOGCAM); return false; } streaming = true; return true; } bool videoCapture::stopStreaming() { int i; bool ok=true; if(!streaming) return false; for(i=0;i #include #include #include "appdefs.h" #include struct tableFormat { QString description; unsigned int val1; unsigned int val2; }; extern tableFormat sizeList[]; extern tableFormat fpsList[]; class videoCapture : public QObject { Q_OBJECT public: videoCapture(); ~videoCapture(); void close(); bool open(QString videoDev); // QList getFormatList(QList &description); // QList getSizesList() const; // QList formatList; // QList sizeList; QList descripList; bool setFormat(v4l2_format &fmt); bool getFormat(v4l2_format &fmt); int getFrame(); int currentWidth(v4l2_format fmt) const; int currentHeight(v4l2_format fmt) const; int currentPixelFormat(v4l2_format fmt) const; // int changeCtrl(int ctrl, int value = 0); // int defaultCtrlVal(unsigned int control, int &defaultValue); // bool isOpened() const {return opened;}; QImage *getImage() {return localImage;} bool captureStart(); bool captureStop(); bool stopStreaming(); bool startSnapshots(); bool init(int pixelFormat, int width, int height); QString getErrorString() {return errorString;} private: int dev; v4l2_format srcFmt; v4l2_format dstFmt; v4l2_buffer buf; v4l2_requestbuffers rb; bool allocated; uchar *mem[4]; size_t bufLength; QImage *localImage; bool opened; bool mmapped; bool streaming; void dumpCaps(v4l2_capability &cap); int numBuffers; QString pixelFormatStr(int pixelFormat); struct v4lconvert_data *convertData; bool convert(unsigned char *src); enum QImage::Format checkConversionNeeded (); enum QImage::Format qFmt; bool needsConversion; QString videoDevice; int allocateBuffers(int numBufs); QString errorString; }; #endif qsstv_9.2.6/qsstv/widgets/drmsegmentsview.cpp0000664000175000017500000000304313203343610020202 0ustar jomajoma#include "drmsegmentsview.h" #include #include #include #include drmSegmentsView::drmSegmentsView(QWidget *parent) :QLabel(parent) { maxBlocks=1; colFail=QColor(Qt::red); colOK=QColor(Qt::green); setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); setLineWidth(3); setScaledContents(true); blockListCount=-1; } drmSegmentsView::~drmSegmentsView() { } void drmSegmentsView::paintEvent(QPaintEvent *e) { int i; int blockX; float blockWidth; QRectF rct; QLabel::paintEvent(e); // if(blockListCount==blockList.count()) // { // return; // } // blockListCount=blockList.count(); QPainter painter(this); painter.setPen(QPen(colFail, 1, Qt::SolidLine)); painter.setBrush(QBrush(colFail)); painter.setRenderHint(QPainter::Antialiasing); rct=QRectF(contentsRect().left(),contentsRect().top() ,contentsRect().width()-4 ,contentsRect().height()-4 ); blockWidth=(float)(contentsRect().width()-4)/maxBlocks; painter.drawRect(rct); painter.setBrush(QBrush(colOK)); painter.setPen(QPen(colOK, 1, Qt::SolidLine)); for(i=0;i blkList) { blockList=blkList; } qsstv_9.2.6/qsstv/widgets/drmsegmentsview.h0000664000175000017500000000115513203343610017651 0ustar jomajoma#ifndef DRMSEGMENTSVIEW_H #define DRMSEGMENTSVIEW_H #include class drmSegmentsView : public QLabel { Q_OBJECT public: explicit drmSegmentsView(QWidget *parent = 0); ~drmSegmentsView(); void setColorFail(QColor color); void setColorOK(QColor color); void setMaxBlocks(int mb) { if(mb==0) maxBlocks=1; else maxBlocks=mb;} void setBlocks(QList blkList); protected: void paintEvent(QPaintEvent *e); private: QColor colFail; QColor colOK; QList blockList; short int maxBlocks; int blockListCount; }; #endif // DRMSEGMENTSVIEW_H qsstv_9.2.6/qsstv/widgets/drmsegmentsview.ui0000664000175000017500000000241213203343610020034 0ustar jomajoma drmSegmentsView 0 0 302 48 Form true 0 0 0 0 0 QFrame::Box QFrame::Plain 2 TextLabel qsstv_9.2.6/qsstv/widgets/extviewer.cpp0000664000175000017500000000133613203343610017004 0ustar jomajoma#include "extviewer.h" #include "ui_extviewer.h" #include #include extViewer::extViewer(QWidget *parent) : QDialog(parent), ui(new Ui::extViewer) { ui->setupUi(this); activeMovie=false; setModal(false); setWindowState(Qt::WindowMaximized); } extViewer::~extViewer() { delete ui; } void extViewer::setup(QString fn) { int fw,fh; // we want the original image ui->imViewer->stretch=true; ui->imViewer->setType(imageViewer::EXTVIEW); ui->imViewer->openImage(fn,false,false,false); fileName=fn; QFileInfo fi(fn); fw=ui->imViewer-> getImagePtr()->width(); fh=ui->imViewer->getImagePtr()->height(); ui->lineEdit->setText(QString("%1 %2x%3").arg(fi.fileName()).arg(fw).arg(fh)); } qsstv_9.2.6/qsstv/widgets/extviewer.h0000664000175000017500000000064613203343610016454 0ustar jomajoma#ifndef EXTVIEWER_H #define EXTVIEWER_H #include #include namespace Ui { class extViewer; } class extViewer : public QDialog { Q_OBJECT public: explicit extViewer(QWidget *parent = 0); ~extViewer(); void setup(QString fn); private: Ui::extViewer *ui; int w,h; int labelWidth,labelHeight; QString fileName; QMovie qm; QImage im; bool activeMovie; }; #endif // EXTVIEWER_H qsstv_9.2.6/qsstv/widgets/extviewer.ui0000664000175000017500000000206713203343610016641 0ustar jomajoma extViewer 0 0 524 327 Viewer :/icons/qsstv.png:/icons/qsstv.png true imageViewer QWidget
widgets/imageviewer.h
1
qsstv_9.2.6/qsstv/widgets/fftdisplay.cpp0000664000175000017500000001216113203343610017125 0ustar jomajoma#include "fftdisplay.h" #include "appglobal.h" #include "configparams.h" #include "math.h" #include "arraydumper.h" #include fftDisplay::fftDisplay(QWidget *parent) : QLabel(parent) { // blockIndex=0; arMagSAvg=NULL; // hammingBuffer=NULL; fftArray=NULL; // out=NULL; // dataBuffer=NULL; showWaterfall=false; fftMax=FFTMAX; range=RANGE; avgVal=0.05; // plan=0; setScaledContents(true); imagePtr=NULL; imWidth=-1; imHeight=-1; arMagWAvg=NULL; displayCounter=0; } fftDisplay::~fftDisplay() { delete imagePtr; if(fftArray) delete fftArray; if(arMagSAvg) delete []arMagSAvg; if(arMagWAvg) delete []arMagWAvg; } void fftDisplay::init(int length,int nblocks,int isamplingrate) { int i; windowSize=length; fftLength=windowSize*nblocks; samplingrate=isamplingrate; if(fftArray) delete fftArray; if(arMagSAvg) delete [] arMagSAvg; step=(double)samplingrate/(double)fftLength; //freq step per bin binBegin=(int) rint(FFTLOW/step); binEnd =(int) rint(FFTHIGH/step); binDiff=binEnd-binBegin; fftArray=new QPolygon(binDiff); arMagSAvg=new double[binDiff]; for(i=0;ifill(Qt::black); } else { *imagePtr=imagePtr->scaled(QSize(imWidth,imHeight)); } } } if(!showWaterfall) { for (i=binBegin,j=0;i1)tmp=1; int pos=(int)rint((double)(j*(imWidth-1))/(double)binDiff); fftArray->setPoint(j,pos,(imHeight-1)*tmp); // range 0 -> -1 } } else { memmove(imagePtr->scanLine(1),imagePtr->scanLine(0),(imWidth*(imHeight-2))*sizeof(uint)); uint *ptr=(uint *)imagePtr->scanLine(0); for(i=0;i1)tmp=1; c.setHsv(240-tmp*60,255,tmp*255); ptr[i]=c.rgb(); } } update(); } void fftDisplay::drawMarkers(QPainter *painter, int top, int bot) { painter->drawLine((((marker1-FFTLOW)*imWidth)/FFTSPAN),top,(((marker1-FFTLOW)*imWidth)/FFTSPAN),bot); painter->drawLine((((marker2-FFTLOW)*imWidth)/FFTSPAN),top,(((marker2-FFTLOW)*imWidth)/FFTSPAN),bot); painter->drawLine((((marker3-FFTLOW)*imWidth)/FFTSPAN),top,(((marker3-FFTLOW)*imWidth)/FFTSPAN),bot); } QImage *fftDisplay::getImage() { QImage *im = new QImage(width(),height()+10,QImage::Format_RGB32); QPainter p(im); QPen pn; if (!showWaterfall) { } else { if (imagePtr) { im->fill(Qt::black); p.drawImage(0,5,*imagePtr); pn.setColor(Qt::red); pn.setWidth(3); p.setPen(pn); drawMarkers(&p,0,4); drawMarkers(&p,height()+5,height()+9); } } return im; } void fftDisplay::paintEvent(QPaintEvent *p) { QPen pn; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); if(!showWaterfall) { pn.setColor(Qt::red); pn.setWidth(1); painter.setPen(pn); drawMarkers(&painter,0,imHeight); pn.setColor(Qt::green); painter.setPen(pn); painter.drawPolyline(*fftArray); } else { if(imagePtr) { scaledImage=imagePtr->scaled(QSize(width(),height())); painter.drawImage(0,0,scaledImage); } } QLabel::paintEvent(p); } qsstv_9.2.6/qsstv/widgets/fftdisplay.h0000664000175000017500000000265513203343610016601 0ustar jomajoma#ifndef FFTDISPLAY_H #define FFTDISPLAY_H #include #include #include "appdefs.h" #include "fftw3.h" #include #include #define FFTAVERAGING 0.1 #define VOLAVG 0.1 //#define VALAVG 1. #define FFTHIGH 2900 #define FFTLOW 200 #define FFTSPAN (FFTHIGH-FFTLOW) #define FFTMAX 6 #define RANGE 30. class fftDisplay : public QLabel { Q_OBJECT public: explicit fftDisplay(QWidget *parent=0); ~fftDisplay(); void init(int length, int slices, int isamplingrate); void showFFT(double *fftData); void setMaxDb(int mb){fftMax=mb;} void setRange(int rg) {range=rg;} void displayWaterfall(bool wf) {showWaterfall=wf;} void setMarkers(int mrk1=0, int mrk2=0, int mrk3=0); void setAvg(double d) {avgVal=d;} QImage *getImage(); private: void drawMarkers(QPainter *painter, int top, int bot); void paintEvent(QPaintEvent *p); // void mousePressEvent( QMouseEvent *e ); int windowSize; int fftLength; int samplingrate; double *arMagSAvg; double *arMagWAvg; double maxMagnitude; QPolygon *fftArray; // bool ready; bool showWaterfall; double fftMax; double range; QImage *imagePtr; QImage scaledImage; // void setSize(int w,int h); QMutex mutex; int marker1; int marker2; int marker3; double step; //freq step per bin int binBegin; int binEnd; int binDiff; double avgVal; int imWidth; int imHeight; int displayCounter; }; #endif // FFTDISPLAY_H qsstv_9.2.6/qsstv/widgets/freqform.ui0000664000175000017500000001504113203343610016434 0ustar jomajoma freqForm 0 0 270 139 8 Test Signal 6 11 6 0 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 Frequency false 300 2500 1200 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 Duration (sec) false 1 100 10 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 Qt::Horizontal QSizePolicy::Expanding 20 20 OK Cancel Qt::Horizontal QSizePolicy::Expanding 20 20 Qt::Vertical QSizePolicy::Expanding 20 20 qPixmapFromMimeSource okButton clicked() freqForm accept() 20 20 20 20 cancelButton clicked() freqForm reject() 20 20 20 20 qsstv_9.2.6/qsstv/widgets/imagematrix.cpp0000664000175000017500000001315413203343610017272 0ustar jomajoma#include "imagematrix.h" #include #include #include #define MINCOLSIZE 32 #define MINROWSIZE 26 #define MAXCOLSIZE 64 #define MAXROWSIZE 52 imageMatrix::imageMatrix(QWidget *parent) : QWidget(parent) { parentPtr=parent; parentPtr->resize(511, 300); verticalLayout = NULL; horizontalLayout=NULL; sortFlags=QDir::Time; } imageMatrix::~imageMatrix() { // if(verticalLayout!=NULL) delete verticalLayout; // if( horizontalLayout!=NULL) delete horizontalLayout; } void imageMatrix::setupLayout() { if(verticalLayout!=NULL) delete verticalLayout; verticalLayout = new QVBoxLayout(parentPtr); horizontalLayout=new QHBoxLayout(); verticalLayout->setObjectName(QString::fromUtf8("vt1")); verticalLayout->setSpacing(2); verticalLayout->setContentsMargins(1, 1, 1, 1); gridLayout = new QGridLayout(); gridLayout->setSpacing(1); gridLayout->setObjectName(QString::fromUtf8("gridLo")); gridLayout->setSizeConstraint(QLayout::SetNoConstraint); verticalLayout->addLayout(gridLayout); horizontalLayout = new QHBoxLayout(); horizontalLayout->setObjectName(QString::fromUtf8("htl")); horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer); beginPushButton = new QPushButton(this); beginPushButton->setObjectName(QString::fromUtf8("beginPushButton")); QIcon icon2; icon2.addFile(QString::fromUtf8(":/icons/doubleleft.png"), QSize(), QIcon::Normal, QIcon::Off); beginPushButton->setIcon(icon2); horizontalLayout->addWidget(beginPushButton); prevPushButton = new QPushButton(this); prevPushButton->setObjectName(QString::fromUtf8("prevPushButton")); QIcon icon; icon.addFile(QString::fromUtf8(":/icons/left.png"), QSize(), QIcon::Normal, QIcon::Off); prevPushButton->setIcon(icon); horizontalLayout->addWidget(prevPushButton); pageLabel=new QLabel; horizontalLayout->addWidget(pageLabel); // horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); // horizontalLayout->addItem(horizontalSpacer_2); nextPushButton = new QPushButton(this); nextPushButton->setObjectName(QString::fromUtf8("nextPushButton")); QIcon icon1; icon1.addFile(QString::fromUtf8(":/icons/start.png"), QSize(), QIcon::Normal, QIcon::Off); nextPushButton->setIcon(icon1); horizontalLayout->addWidget(nextPushButton); endPushButton = new QPushButton(this); endPushButton->setObjectName(QString::fromUtf8("endPushButton")); QIcon icon3; icon3.addFile(QString::fromUtf8(":/icons/doubleright.png"), QSize(), QIcon::Normal, QIcon::Off); endPushButton->setIcon(icon3); horizontalLayout->addWidget(endPushButton); horizontalSpacer_3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer_3); verticalLayout->addLayout(horizontalLayout); connect(prevPushButton,SIGNAL(clicked()),SLOT(slotPrev())); connect(nextPushButton,SIGNAL(clicked()),SLOT(slotNext())); connect(beginPushButton,SIGNAL(clicked()),SLOT(slotBegin())); connect(endPushButton,SIGNAL(clicked()),SLOT(slotEnd())); } void imageMatrix::init(int numRows, int numColumns, QString dir,imageViewer::thumbType tt) { int i,j; rows=numRows; columns=numColumns; dirPath=dir; imageViewer *imv; setupLayout(); for(i=0;isetType(tt); gridLayout->addWidget(imv, i, j, 1, 1); connect(imv,SIGNAL(layoutChanged()),SLOT(slotLayoutChanged())); } } for (i=0;isetRowMinimumHeight(i,MINROWSIZE); gridLayout->setRowStretch(i,0); } for (i=0;isetColumnMinimumWidth(i,MINCOLSIZE); gridLayout->setColumnStretch(i,1); } currentPage=0; getList(); // displayFiles(); } void imageMatrix::getList() { QDir dir(dirPath); dir.setFilter(QDir::Files | QDir::NoSymLinks); dir.setSorting(sortFlags); fileList = dir.entryInfoList(); numPages=ceil((double)fileList.count()/(double)(rows*columns)); if(numPages==0) numPages=1; slotBegin(); } QString imageMatrix::getLastFile() { if (fileList.count()>0) { return fileList.last().absoluteFilePath(); } else return QString(); } void imageMatrix::displayFiles() { int i,j,k; QString tempStr; int offset=currentPage*rows*columns; pageLabel->setText(QString(" Page %1 of %2").arg(currentPage+1).arg(numPages).leftJustified(17,' ')); for(i=0;i=fileList.count()) { ((imageViewer *)gridLayout->itemAtPosition(i,j)->widget())->clear(); j++; } else { tempStr=fileList.at(k).absoluteFilePath(); if(((imageViewer *)gridLayout->itemAtPosition(i,j)->widget())->openImage(tempStr,false,false,true)) { j++; } else { fileList.removeAt(k); } } } } } void imageMatrix::changed() { getList(); // displayFiles(); } void imageMatrix::slotPrev() { if(currentPage!=0) currentPage--; displayFiles(); } void imageMatrix::slotNext() { currentPage++; if(currentPage>=numPages) { currentPage--; } displayFiles(); } void imageMatrix::slotBegin() { currentPage=0; displayFiles(); } void imageMatrix::slotEnd() { currentPage=numPages-1; if(currentPage<0) currentPage=0; displayFiles(); } void imageMatrix::slotLayoutChanged() { getList(); displayFiles(); } qsstv_9.2.6/qsstv/widgets/imagematrix.h0000664000175000017500000000242013203343610016731 0ustar jomajoma#ifndef IMAGEMATRIX_H #define IMAGEMATRIX_H #include #include #include #include #include "widgets/imageviewer.h" class imageMatrix : public QWidget { Q_OBJECT public: explicit imageMatrix(QWidget *parent = 0); ~imageMatrix(); void init(int numRows, int numColumns, QString dir, imageViewer::thumbType tt); void setupFiles(); void changed(); QFileInfoList getFileList(){return fileList;} QString getLastFile(); void setSortFlag(QDir::SortFlags sf) {sortFlags=sf;} private: void getList(); void displayFiles(); void setupLayout(); QVBoxLayout *verticalLayout; QHBoxLayout *horizontalLayout; QGridLayout *gridLayout; QSpacerItem *horizontalSpacer; QSpacerItem *horizontalSpacer_2; QSpacerItem *horizontalSpacer_3; QString dirPath; QPushButton *prevPushButton; QPushButton *nextPushButton; QPushButton *beginPushButton; QPushButton *endPushButton; QLabel *pageLabel; QList imageViewerPtrList; QFileInfoList fileList; int rows; int columns; int numPages; int currentPage; QWidget *parentPtr; QDir::SortFlags sortFlags; private slots: void slotPrev(); void slotNext(); void slotBegin(); void slotEnd(); void slotLayoutChanged(); }; #endif // IMAGEMATRIX_H qsstv_9.2.6/qsstv/widgets/imageviewer.cpp0000664000175000017500000006611113203343610017270 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "imageviewer.h" #include "appglobal.h" #include "utils/logging.h" #include "configparams.h" #include "dispatcher.h" #include "dirdialog.h" #include "extviewer.h" #include "jp2io.h" #include #include #include #define RATIOSCALE 1. /** \class imageViewer The image is stored in it's original format and size. All interactions are done on the original image. A scaled version is used to display the contents. */ imageViewer::imageViewer(QWidget *parent): QLabel(parent) { addToLog("image creation",LOGIMAG); validImage=false; setFrameStyle(QFrame::Sunken | QFrame::Panel); QBrush b; QPalette palette; b.setTexture(QPixmap::fromImage(QImage(":/icons/transparency.png"))); palette.setBrush(QPalette::Active,QPalette::Base,b); palette.setBrush(QPalette::Inactive,QPalette::Base,b); palette.setBrush(QPalette::Disabled,QPalette::Base,b); setPalette(palette); setBackgroundRole(QPalette::Base); setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); setAspectMode(Qt::IgnoreAspectRatio); setBackgroundRole(QPalette::Dark); popup=new QMenu (this); newAct = new QAction(tr("&New"),this); connect(newAct, SIGNAL(triggered()), this, SLOT(slotNew())); loadAct = new QAction(tr("&Load"), this); connect(loadAct, SIGNAL(triggered()), this, SLOT(slotLoad())); toTXAct = new QAction(tr("&To TX"), this); connect(toTXAct, SIGNAL(triggered()), this, SLOT(slotToTX())); editAct = new QAction(tr("&Edit"), this); connect(editAct, SIGNAL(triggered()), this, SLOT(slotEdit())); printAct = new QAction(tr("&Print"), this); connect(printAct, SIGNAL(triggered()), this, SLOT(slotPrint())); uploadAct = new QAction(tr("&Upload to FTP"), this); connect(uploadAct, SIGNAL(triggered()), this, SLOT(slotUploadFTP())); deleteAct = new QAction(tr("&Delete"), this); connect(deleteAct, SIGNAL(triggered()), this, SLOT(slotDelete())); viewAct = new QAction(tr("&View"), this); connect(viewAct, SIGNAL(triggered()), this, SLOT(slotView())); propertiesAct = new QAction(tr("Propert&ies"), this); connect(propertiesAct, SIGNAL(triggered()), this, SLOT(slotProperties())); zoomInAct = new QAction(tr("Zoom In (&+)"), this); connect(zoomInAct, SIGNAL(triggered()), this, SLOT(slotZoomIn())); zoomOutAct = new QAction(tr("Zoom Out (&-)"), this); connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(slotZoomOut())); connect(configDialogPtr,SIGNAL(bgColorChanged()), SLOT(slotBGColorChanged())); clickTimer.setSingleShot(true); clickTimer.setInterval(40); connect(&clickTimer, SIGNAL(timeout()), this, SLOT(slotLeftClick())); init(RXIMG); activeMovie=false; stretch=false; // } imageViewer::~imageViewer() { } void imageViewer::init(thumbType tp) { setScaledContents(false); setAlignment(Qt::AlignCenter); setAutoFillBackground(true); slotBGColorChanged(); addToLog(QString("image creation %1").arg(tp),LOGIMAG); setType(tp); setPixmap(QPixmap()); clear(); } bool imageViewer::openImage(QString &filename,QString start,bool ask,bool showMessage,bool emitSignal,bool fromCache) { QImage tempImage; QFile fi(filename); QFileInfo finf(filename); QString cacheFileName; jp2IO jp2; displayMBoxEvent *stmb=0; editorScene ed; bool success=false; bool cacheHit=false; if(activeMovie) { activeMovie=false; qm.stop(); } if (filename.isEmpty()&&!ask) return false; if(ask) { dirDialog dd((QWidget *)this,"Browse"); filename=dd.openFileName(start,"*"); } if(filename.isEmpty()) { imageFileName=""; return false; } if(fromCache) { cacheFileName=finf.absolutePath()+"/cache/"+finf.baseName()+finf.created().toString()+".png"; if(tempImage.load(cacheFileName)) { cacheHit=true; success=true; orgWidth=tempImage.text("orgWidth").toInt(); orgHeight=tempImage.text("orgHeight").toInt(); } } if(!success) { if(jp2.check(filename)) { tempImage=jp2.decode(filename); if(!tempImage.isNull()) { success=true; } } else if(tempImage.load(filename)) { success=true; } else if(ed.load(fi)) { success=true; tempImage=QImage(ed.renderImage(0,0)->copy()); } } if(!success) { if(showMessage) { stmb= new displayMBoxEvent("Image Loader",QString("Unable to load image:\n%1").arg(filename)); QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done } validImage=false; imageFileName=""; return false; } if(fromCache) { sourceImage=QImage(); if(!cacheHit) { orgWidth=tempImage.width(); orgHeight=tempImage.height(); tempImage=tempImage.scaledToWidth(120, Qt::FastTransformation); // save cacheImage for next time tempImage.setText("orgWidth",QString::number(orgWidth)); tempImage.setText("orgHeight",QString::number(orgHeight)); tempImage.save(cacheFileName,"PNG"); } stretch=true; displayedImage=tempImage; } else { sourceImage=tempImage.convertToFormat(QImage::Format_ARGB32_Premultiplied); orgWidth=tempImage.width(); orgHeight=tempImage.height(); displayedImage=sourceImage; } view=QRect(); imageFileName=filename; QFileInfo finfo(filename); if (finfo.suffix().toLower()=="gif") { //we will try a animated gif qm.setFileName(filename); if(qm.isValid()) { if(qm.frameCount()>1) { activeMovie=true; setMovie(&qm); qm.start(); displayedImage=QImage(); } else { displayImage(); // we have a single image gif } } } else { displayImage(); } validImage=true; if (emitSignal) emit imageChanged(); return true; } bool imageViewer::openImage(QString &filename,bool showMessage,bool emitSignal,bool fromCache) { return openImage(filename,"",false,showMessage,emitSignal,fromCache); } bool imageViewer::openImage(QImage im) { imageFileName=""; if(!im.isNull()) { validImage=true; sourceImage=im; displayedImage=im; compressedImageData.clear(); displayImage(); return true; } validImage=false; return false; } bool imageViewer::openImage(QByteArray *ba) { QImage tempImage; QBuffer buffer(ba); buffer.open(QIODevice::ReadOnly); if(tempImage.load(&buffer,NULL)) { return openImage(tempImage.convertToFormat(QImage::Format_ARGB32_Premultiplied)); } validImage=false; return false; } void imageViewer::clear() { validImage=false; imageFileName.clear(); sourceImage=QImage(); displayedImage=QImage(); compressedImageData.clear(); view=QRect(); setPixmap(QPixmap()); targetWidth=0; targetHeight=0; templateFileName.clear(); useTemplate=false; } bool imageViewer::hasValidImage() { return validImage; } void imageViewer::createImage(QSize sz,QColor fill,bool scale) { clear(); displayedImage=QImage(sz,QImage::Format_ARGB32_Premultiplied); if(!displayedImage.isNull()) { displayedImage.fill(fill.rgb()); useCompression=false; } stretch=scale; displayImage(); emit imageChanged(); } void imageViewer::copy(imageViewer *src) { imageFileName=src->imageFileName; ttype=src->ttype; openImage(imageFileName,false,false,false); } QRgb *imageViewer::getScanLineAddress(int line) { return (QRgb *)displayedImage.scanLine(line); } void imageViewer::displayImage() { if(displayedImage.isNull()) { return; } if (view.isNull()) { if(hasScaledContents() || (displayedImage.width()>width()) || (displayedImage.height()>height()) || stretch) { QPixmap mp; mp=QPixmap::fromImage(displayedImage.scaled(width()-2,height()-2,Qt::KeepAspectRatio,Qt::SmoothTransformation)); setPixmap(QPixmap::fromImage(displayedImage.scaled(width()-2,height()-2,Qt::KeepAspectRatio,Qt::SmoothTransformation))); // qDebug()<< "mp size" << mp.width() << mp.height() << hasScaledContents() << "display width" << width() << height() << imageFileName; } else { // qDebug()<< "xy" << width() << height() << hasScaledContents(); setPixmap(QPixmap::fromImage(displayedImage)); } } else { QImage im = displayedImage.copy(view); setPixmap(QPixmap::fromImage(im.scaled(width()-2,height()-2,Qt::KeepAspectRatio,Qt::SmoothTransformation))); } } void imageViewer::zoom(const QPoint centre, int dlevel) { addToLog(QString("centre=%1,%2 dlevel=%3").arg(centre.x()).arg(centre.y()).arg(dlevel),LOGIMAG); if (view.isNull()) { view=displayedImage.rect(); } while ((dlevel!=0) && (view.width()<=displayedImage.width())) { if (dlevel>0) { // halve the size of the viewed area if ((view.width()>300) && (view.height()>300)) { addToLog("zoom in",LOGIMAG); view.adjust(+view.width()/4, +view.height()/4, -view.width()/4, -view.height()/4); } dlevel--; } else { // double the size of the viewed area addToLog("zoom out",LOGIMAG); view.adjust(-view.width()/2, -view.height()/2, +view.width()/2, +view.height()/2); dlevel++; } } if ((view.width() > displayedImage.width()) || (view.height() > displayedImage.height()) ) { view=displayedImage.rect(); } else { view.moveCenter(centre); // ensure the view is within the image if (view.x()<0) view.moveLeft(0); if (view.y()<0) view.moveTop(0); if (view.x()+view.width() > displayedImage.width()) view.moveRight(displayedImage.width()); if (view.y()+view.height() > displayedImage.height()) view.moveBottom(displayedImage.height()); } addToLog(QString("View:%1,%2,%3,%4").arg(view.x()).arg(view.y()).arg(view.width()).arg(view.height()),LOGIMAG); displayImage(); } QPoint imageViewer::mapToImage(const QPoint &pos) { QRect cr = contentsRect(); cr.adjust(margin(),margin(),-margin(),-margin()); QRect aligned = QStyle::alignedRect(QApplication::layoutDirection(), QFlag(alignment()), pixmap()->size(), cr); QRect inter = aligned.intersected(cr); QPoint c = pos; c-=inter.topLeft(); if (view.isNull()) { c.setX(displayedImage.width() * c.x()/inter.width()); c.setY(displayedImage.height() * c.y()/inter.height()); } else { c.setX(view.width() * c.x()/inter.width()); c.setY(view.height() * c.y()/inter.height()); } c+=view.topLeft(); return c; } void imageViewer::setType(thumbType tp) { ttype=tp; switch(ttype) { case RXIMG: case EXTVIEW: case PREVIEW: case RXSSTVTHUMB: imageFilePath=rxSSTVImagesPath; break; case RXDRMTHUMB: imageFilePath=rxDRMImagesPath; break; case TXSSTVTHUMB: imageFilePath=txSSTVImagesPath; break; case TXDRMTHUMB: imageFilePath=txDRMImagesPath; break; case TXIMG: case TXSTOCKTHUMB: imageFilePath=txStockImagesPath; break; case TEMPLATETHUMB: imageFilePath=templatesPath; break; } if((tp==RXSSTVTHUMB) || (tp==RXDRMTHUMB) || (tp==TXSSTVTHUMB) || (tp==TXDRMTHUMB) ||(tp==TXSTOCKTHUMB) ||(tp==TEMPLATETHUMB)) { setScaledContents(false); setAlignment(Qt::AlignCenter); } popup->removeAction(newAct); popup->removeAction(loadAct); popup->removeAction(toTXAct); popup->removeAction(editAct); popup->removeAction(printAct); popup->removeAction(uploadAct); popup->removeAction(deleteAct); popup->removeAction(viewAct); popup->removeAction(propertiesAct); switch(tp) { case EXTVIEW: popup->addAction(zoomInAct); popup->addAction(zoomOutAct); popup->addAction(propertiesAct); break; case RXIMG: popup->addAction(viewAct); popup->addAction(propertiesAct); break; case TXIMG: popup->addAction(newAct); popup->addAction(loadAct); popup->addAction(editAct); popup->addAction(printAct); popup->addAction(viewAct); popup->addAction(propertiesAct); break; case PREVIEW: popup->addAction(loadAct); popup->addAction(toTXAct); popup->addAction(viewAct); popup->addAction(propertiesAct); break; case RXSSTVTHUMB: case RXDRMTHUMB: popup->addAction(uploadAct); case TXSSTVTHUMB: case TXDRMTHUMB: popup->addAction(toTXAct); popup->addAction(printAct); popup->addAction(deleteAct); popup->addAction(viewAct); popup->addAction(propertiesAct); break; case TXSTOCKTHUMB: case TEMPLATETHUMB: popup->addAction(newAct); popup->addAction(loadAct); popup->addAction(toTXAct); popup->addAction(editAct); popup->addAction(printAct); popup->addAction(deleteAct); popup->addAction(viewAct); popup->addAction(propertiesAct); break; } popupEnabled=true; } void imageViewer::mousePressEvent( QMouseEvent *e ) { if (e->button() == Qt::LeftButton) { if (e->type() == QEvent::MouseButtonDblClick) { clickTimer.stop(); if (ttype==EXTVIEW) { if (pixmap()) { QPoint c = mapToImage(e->pos()); if (e->modifiers() & Qt::ShiftModifier) zoom(c, -1); else zoom(c, +1); } } else { if (hasValidImage()) slotView(); } } else if (e->type() == QEvent::MouseButtonPress) { if (ttype==EXTVIEW) { if (pixmap()) { clickPos = mapToImage(e->pos()); clickTimer.start(); } } } } else if (e->button() == Qt::RightButton) { if(popupEnabled) { if (pixmap()) clickPos = mapToImage(e->pos()); popup->popup(QCursor::pos()); } } } void imageViewer::slotLeftClick() { switch (ttype) { case EXTVIEW: zoom(clickPos, 0); break; default: break; } } void imageViewer::slotDelete() { if(imageFileName.isEmpty()) return; if(QMessageBox::question(this,"Delete file","Do you want to delete the file and\n move it to the trash folder?",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes) { trash(imageFileName,true); } imageFileName=""; emit layoutChanged(); } void imageViewer::slotEdit() { if(imageFileName.isEmpty()) { slotLoad(); if (imageFileName.isEmpty()) return; } callEditorEvent *ce = new callEditorEvent( this,imageFileName ); QApplication::postEvent(dispatcherPtr, ce ); // Qt will delete it when done } void imageViewer::slotLoad() { QString fileNameTmp; dirDialog dd((QWidget *)this,"Browse"); fileNameTmp=dd.openFileName(imageFilePath); if(openImage(fileNameTmp,true,false,false)) { imageFileName=fileNameTmp; if(ttype==TEMPLATETHUMB) { templatesChangedEvent *ce = new templatesChangedEvent( ); QApplication::postEvent(dispatcherPtr, ce ); // Qt will delete it when done } else if((ttype==TXIMG) ||(ttype==PREVIEW)) { emit imageChanged(); } } } void imageViewer::slotNew() { callEditorEvent *ce = new callEditorEvent( this,NULL); QApplication::postEvent(dispatcherPtr, ce ); // Qt will delete it when done } void imageViewer::slotPrint() { } void imageViewer::slotUploadFTP() { QString remoteDir; switch (ttype) { case RXSSTVTHUMB: remoteDir = ftpRemoteSSTVDirectory; break; case RXDRMTHUMB: remoteDir = ftpRemoteDRMDirectory; break; default: break; } if (!remoteDir.isEmpty()) dispatcherPtr->uploadToRXServer(remoteDir, imageFileName); } void imageViewer::slotView() { extViewer vm(this); vm.setup(imageFileName); vm.exec(); } void imageViewer::slotBGColorChanged() { QPalette mpalette; mpalette.setColor(QPalette::Window,backGroundColor); setBackgroundRole(QPalette::Window); mpalette.setColor(QPalette::WindowText, Qt::yellow); setPalette(mpalette); } void imageViewer::slotProperties() { QFileInfo fi(imageFileName); if(fi.exists()) { QMessageBox::information(this,"Image Properties", "File: " + imageFileName + "\n File size: " + QString::number(fi.size()) + "\n Image width: " + QString::number(orgWidth) + "\n Image height: " + QString::number(orgHeight) + "\n Last Modified: " + fi.lastModified().toString() ,QMessageBox::Ok); } else { QMessageBox::information(this,"Image Properties", " Image width: " + QString::number(orgWidth) + "\n Image height: " + QString::number(orgHeight) ,QMessageBox::Ok); } } void imageViewer::slotZoomIn() { zoom(clickPos,+1); } void imageViewer::slotZoomOut() { zoom(clickPos,-1); } void imageViewer::slotToTX() { moveToTxEvent *mt=0; mt=new moveToTxEvent(imageFileName); QApplication::postEvent(dispatcherPtr, mt); // Qt will delete it when done } void imageViewer::save(QString fileName,QString fmt,bool convertRGB, bool source) { QImage im; if(source) { if(sourceImage.isNull()) return; } else { if(displayedImage.isNull()) return; } if(!convertRGB) { if(source) im=sourceImage; else im=displayedImage; } else { if(source) im=sourceImage.convertToFormat(QImage::Format_RGB32); else im=displayedImage.convertToFormat(QImage::Format_RGB32);; } im.save(fileName,fmt.toUpper().toLatin1().data()); } bool imageViewer::copyToBuffer(QByteArray *ba) { QImage im; jp2IO jp2; int fileSize; if(displayedImage.isNull()) { return false; } if (compressedImageData.isEmpty()) { compressedImageData=jp2.encode(displayedImage.convertToFormat(QImage::Format_RGB32),im,fileSize,compressionRatio); } *ba = compressedImageData; if (compressedImageData.isEmpty()) { return false; } return true; } uint imageViewer:: setSizeRatio(int sizeRatio,bool usesCompression) { if(!usesCompression) return sourceImage.byteCount(); compressionRatio=sizeRatio; return applyTemplate(); } bool imageViewer::reload() { return openImage(imageFileName ,true,false,false); } void imageViewer::setParam(QString templateFn,bool usesTemplate,int width,int height) { targetWidth=width; targetHeight=height; templateFileName=templateFn; useTemplate=usesTemplate; applyTemplate(); displayImage(); } void imageViewer::setAspectMode(Qt::AspectRatioMode mode) { aspectRatioMode = mode; } int imageViewer::applyTemplate() { QImage *resultImage; jp2IO jp2; QImage overlayedImage; int tWidth=targetWidth,tHeight=targetHeight; int compRatio; if(sourceImage.isNull()) return 0; QFile fi(templateFileName); if(ttype!=TXIMG) return 0; editorScene tscene(0); resultImage=&sourceImage; if(transmissionModeIndex==TRXDRM) { useCompression=true; } else { useCompression=false; } compRatio=compressionRatio; if (tWidth==0 && tHeight==0 && useCompression && (sourceImage.width()>1000 || sourceImage.height()>1000) ) { // if this is going DRM, and its not already a small image // and the size slider is set for smaller sizes // we can pre-scale the image to smaller dimensions to // improve the compression speed // Changing the ratio makes the slider work consistently // About every 50 is where the compression ratio stops // making much difference to the size. It's also the point where // you are losing significant detail due to compression anyway. addToLog(QString("CompressionRatio=%1").arg(compressionRatio),LOGIMAG); if (compressionRatio > 150) { tWidth =sourceImage.width() / 4; tHeight=sourceImage.height() / 4; compRatio = ((compRatio - 151) * 3) + 45; } else if (compressionRatio > 100) { tWidth =sourceImage.width() / 3; tHeight=sourceImage.height() / 3; compRatio -= 73; } else if (compressionRatio > 50) { tWidth =sourceImage.width() / 2; tHeight=sourceImage.height() / 2; compRatio -= 38; } } if((fi.fileName().isEmpty()) || (!useTemplate)) { addToLog(QString("No Template, targetW,H=%1,%2").arg(targetWidth).arg(targetHeight), LOGIMAG); if(tWidth!=0 && tHeight!=0) { QImage scaledImage = QImage(sourceImage .scaled(tWidth, tHeight, aspectRatioMode, Qt::SmoothTransformation ) ); // Crop to intended dimensions at the centre of the image displayedImage = QImage(scaledImage .copy((scaledImage.width()-tWidth)/2, (scaledImage.height()-tHeight)/2, tWidth, tHeight ) ); } else { displayedImage=sourceImage; } resultImage=&displayedImage; } else { addToLog("apply temlate",LOGIMAG); // sconvert cnv; if((!fi.fileName().isEmpty()) && (useTemplate)) { tscene.load(fi); tscene.addConversion('c',toCall,true); tscene.addConversion('r',rsv); tscene.addConversion('o',toOperator); tscene.addConversion('t',QDateTime::currentDateTime().toUTC().toString("hh:mm")); tscene.addConversion('d',QDateTime::currentDateTime().toUTC().toString("yyyy/MM/dd")); tscene.addConversion('m',myCallsign); tscene.addConversion('q',myQth); tscene.addConversion('l',myLocator); tscene.addConversion('n',myLastname); tscene.addConversion('f',myFirstname); tscene.addConversion('v',qsstvVersion); tscene.addConversion('x',comment1); tscene.addConversion('y',comment2); tscene.addConversion('z',comment3); addToLog(QString("Template size=%1,%2, SourceW,H=%3,%4 TargetW,H=%5,%6"). arg(tscene.width()).arg(tscene.height()). arg(sourceImage.width()).arg(sourceImage.height()). arg(tWidth).arg(tHeight), LOGIMAG); if(tWidth!=0 && tHeight!=0) { QImage scaledImage = QImage(sourceImage .scaled(tWidth, tHeight, aspectRatioMode, Qt::SmoothTransformation ) ); overlayedImage= QImage(scaledImage .copy((scaledImage.width()-tWidth)/2, (scaledImage.height()-tHeight)/2, tWidth, tHeight ) ); tscene.overlay(&overlayedImage); } else { tscene.overlay(&sourceImage); } resultImage=tscene.getImagePtr(); addToLog(QString("resultImageW,H=%1,%2").arg(resultImage->width()).arg(resultImage->height()), LOGIMAG); } } if(useCompression) { bool useOriginal=false; int fileSize; compressedImageData=jp2.encode(resultImage->convertToFormat(QImage::Format_RGB32),compressedImage,fileSize,compRatio); if (!useTemplate && !imageFileName.isEmpty()) { QFile original(imageFileName); if (original.open(QIODevice::ReadOnly) && (original.size() < fileSize)) { useOriginal=true; compressedFilename=imageFileName; addToLog(QString("Using original image data (%1 bytes)").arg(original.size()),LOGIMAG); statusBarPtr->showMessage("Using original Image (smaller)"); compressedImageData = original.readAll(); displayedImage.load(imageFileName); } } if (!useOriginal) { displayedImage=compressedImage; int pos; pos=imageFileName.lastIndexOf(".",-1); compressedFilename=imageFileName.left(pos)+".jp2"; statusBarPtr->showMessage(""); addToLog(QString("Image Compressed to %1 bytes").arg(compressedImageData.size()),LOGIMAG); addToLog(QString("displayedImageW,H=%1,%2 compRatio=%3"). arg(displayedImage.width()).arg(displayedImage.height()). arg(compRatio), LOGIMAG); } addToLog(QString("compressed size %1").arg(compressedImageData.size()),LOGIMAG); return fileSize; } else { displayedImage=resultImage->convertToFormat(QImage::Format_RGB32); compressedImageData.clear(); return displayedImage.byteCount(); } } void imageViewer::resizeEvent(QResizeEvent *) { displayImage(); } qsstv_9.2.6/qsstv/widgets/imageviewer.h0000664000175000017500000001213013203343610016725 0ustar jomajoma/*************************************************************************** * Copyright (C) 2000-2008 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMAGEVIEWER_H #define IMAGEVIEWER_H #include #include #include #include #include "editor/editor.h" #include "editor/editorscene.h" class QMenu; class QAction; class editor; class imageViewer : public QLabel { Q_OBJECT /*! thumbnail type */ public: enum thumbType { RXIMG, /*!< just for receiver */ TXIMG, /*!< just for transmitter */ RXSSTVTHUMB, /*!< thumbnail for receiver. */ RXDRMTHUMB, /*!< thumbnail for receiver. */ TXSSTVTHUMB,/*!< thumbnail for transmitter. */ TXDRMTHUMB,/*!< thumbnail for transmitter. */ TXSTOCKTHUMB,/*!< thumbnail for transmitter. */ TEMPLATETHUMB, /*!< thumbnail for template. */ PREVIEW, /*!< preview tx. */ EXTVIEW /*!< extViewer. */ }; imageViewer(QWidget *parent=0); ~imageViewer(); void init(thumbType tp); bool openImage(QString &filename, QString start, bool ask, bool showMessage, bool emitSignal,bool fromCache); bool openImage(QString &filename, bool showMessage, bool emitSignal, bool fromCache); bool openImage(QImage im); bool openImage(QByteArray *ba); void setParam(QString templateFn,bool usesTemplate,int width=0,int height=0); void clear(); bool reload(); // void scale( int w, int h); QImage * getImagePtr() {return &sourceImage;} bool hasValidImage(); void setValidImage(bool v) { validImage=v; } void createImage(QSize sz, QColor fill, bool scale); QRgb *getScanLineAddress(int line); void copy(imageViewer *src); void setType(thumbType t); QString getFilename() {return imageFileName;} QString getCompressedFilename() {return compressedFilename;} void enablePopup(bool en) {popupEnabled=en;} void displayImage(); QPoint mapToImage(const QPoint &pos); void zoom(QPoint centre, int dlevel); void save(QString fileName, QString fmt, bool convertRGB, bool source); bool copyToBuffer(QByteArray *ba); // int calcSize(int &sizeRatio); uint setSizeRatio(int sizeRatio,bool usesCompression); void setAspectMode(Qt::AspectRatioMode mode); int getFileSize(){return fileSize;} QString toCall; QString toOperator; QString rsv; QString comment1; QString comment2; QString comment3; bool stretch; void getOrgSize(int &w,int &h) {w=orgWidth; h=orgHeight;} int applyTemplate(); protected: void resizeEvent(QResizeEvent *); private slots: void slotDelete(); void slotEdit(); void slotLoad(); void slotNew(); void slotPrint(); void slotUploadFTP(); void slotProperties(); void slotToTX(); void slotView(); void slotBGColorChanged(); void slotZoomIn(); void slotZoomOut(); void slotLeftClick(); signals: void layoutChanged(); void imageChanged(); private: QImage displayedImage; QImage sourceImage; QImage compressedImage; QByteArray compressedImageData; void mousePressEvent( QMouseEvent *e ); bool validImage; QString imageFileName; QString compressedFilename; QString imageFilePath; thumbType ttype; bool popupEnabled; QMenu *popup; QAction *newAct; QAction *loadAct; QAction *toTXAct; QAction *editAct; QAction *printAct; QAction *uploadAct; QAction *deleteAct; QAction *viewAct; QAction *propertiesAct; QAction *zoomInAct; QAction *zoomOutAct; // double psizeRatio; int compressionRatio; // 0=lossless 99 is max compression int fileSize; QString format; QMovie qm; bool activeMovie; bool useCompression; QString templateFileName; Qt::AspectRatioMode aspectRatioMode; bool useTemplate; int targetWidth; int targetHeight; int orgWidth; int orgHeight; QRect view; QPoint clickPos; QTimer clickTimer; }; #endif qsstv_9.2.6/qsstv/widgets/markerwidget.cpp0000664000175000017500000000144013203343610017443 0ustar jomajoma#include "markerwidget.h" #include "fftdisplay.h" #include "QDebug" markerWidget::markerWidget(QWidget *parent) : QLabel(parent) { } void markerWidget::paintEvent(QPaintEvent *p) { QPen pn; QPainter painter(this); pn.setColor(Qt::red); pn.setWidth(2); painter.setPen(pn); if ((marker1>FFTLOW)&&(marker1<(FFTLOW+FFTSPAN))) { painter.drawLine((((marker1-FFTLOW)*width())/FFTSPAN),0,(((marker1-FFTLOW)*width())/FFTSPAN),height()); } if ((marker2>FFTLOW)&&(marker2<(FFTLOW+FFTSPAN))) painter.drawLine((((marker2-FFTLOW)*width())/FFTSPAN),0,(((marker2-FFTLOW)*width())/FFTSPAN),height()); if ((marker3>FFTLOW)&&(marker3<(FFTLOW+FFTSPAN))) painter.drawLine((((marker3-FFTLOW)*width())/FFTSPAN),0,(((marker3-FFTLOW)*width())/FFTSPAN),height()); QLabel::paintEvent(p); } qsstv_9.2.6/qsstv/widgets/markerwidget.h0000664000175000017500000000072113203343610017111 0ustar jomajoma#ifndef MARKERWIDGET_H #define MARKERWIDGET_H #include class markerWidget : public QLabel { Q_OBJECT public: explicit markerWidget(QWidget *parent = 0); void setMarkerLabel(QLabel *markerLabel); void setMarkers(int mrk1, int mrk2=0, int mrk3=0){ marker1=mrk1;marker2=mrk2;marker3=mrk3;update();} signals: public slots: private: void paintEvent(QPaintEvent *p); int marker1; int marker2; int marker3; }; #endif // MARKERWIDGET_H qsstv_9.2.6/qsstv/widgets/spectrumwidget.cpp0000664000175000017500000000610413203343610020026 0ustar jomajoma#include "spectrumwidget.h" #include "appglobal.h" #include "ui_spectrumwidget.h" #include "utils/supportfunctions.h" #include "utils/logging.h" #include "markerwidget.h" spectrumWidget::spectrumWidget(QWidget *parent) : QFrame(parent), ui(new Ui::spectrumWidget) { ui->setupUi(this); readSettings(); connect(ui->maxDbSpinbox,SIGNAL(valueChanged(int)),SLOT(slotMaxDbChanged(int))); connect(ui->rangeSpinbox,SIGNAL(valueChanged(int)),SLOT(slotRangeChanged(int))); connect(ui->avgDoubleSpinBox,SIGNAL(valueChanged(double)),SLOT(slotAvgChanged(double))); } spectrumWidget::~spectrumWidget() { writeSettings(); delete ui; } void spectrumWidget::init(int length,int slices,int isamplingrate) { addToLog(QString("Size: %1, Slices %2, Samplingrate %3").arg(length).arg(slices).arg(isamplingrate),LOGFFT); fftFunc.init(length,slices,isamplingrate); ui->spectrWidget->init(length,slices,isamplingrate); ui->waterfallWidget->init(length,slices,isamplingrate); } void spectrumWidget::realFFT(double *iBuffer) { fftFunc.realFFT(iBuffer); ui->spectrWidget->showFFT(fftFunc.out); ui->waterfallWidget->showFFT(fftFunc.out); } void spectrumWidget::readSettings() { QSettings qSettings; qSettings.beginGroup("SPECTRUM"); maxdb=qSettings.value("maxdb",-25).toInt(); range=qSettings.value("range",35).toInt(); avg=qSettings.value("avg",0.90).toDouble(); qSettings.endGroup(); setParams(); } void spectrumWidget::writeSettings() { QSettings qSettings; getParams(); qSettings.beginGroup("SPECTRUM"); qSettings.setValue( "maxdb",maxdb); qSettings.setValue( "range",range); qSettings.setValue("avg",avg); qSettings.endGroup(); } void spectrumWidget::getParams() { getValue(maxdb,ui->maxDbSpinbox); getValue(range,ui->rangeSpinbox); getValue(avg,ui->avgDoubleSpinBox); } void spectrumWidget::setParams() { setValue(maxdb,ui->maxDbSpinbox); setValue(range,ui->rangeSpinbox); setValue(avg,ui->avgDoubleSpinBox); slotMaxDbChanged(maxdb); slotRangeChanged(range); slotAvgChanged(avg); } void spectrumWidget::displaySettings(bool drm) { ui->spectrWidget->displayWaterfall(false); ui->waterfallWidget->displayWaterfall(true); if(drm) { ui->spectrWidget->setMarkers(725,1475,1850); ui->waterfallWidget->setMarkers(725,1475,1850); ui->markerLabelSpectrum->setMarkers(725,1475,1850); ui->markerLabelWF->setMarkers(725,1475,1850); } else { ui->spectrWidget->setMarkers(1200,1500,2300); ui->waterfallWidget->setMarkers(1200,1500,2300); ui->markerLabelSpectrum->setMarkers(1200,1500,2300); ui->markerLabelWF->setMarkers(1200,1500,2300); } } QImage *spectrumWidget::getImage() { return ui->waterfallWidget->getImage(); } void spectrumWidget::slotMaxDbChanged(int mb) { ui->spectrWidget->setMaxDb(mb); ui->waterfallWidget->setMaxDb(mb); maxdb=mb; } void spectrumWidget::slotRangeChanged(int rg) { ui->spectrWidget->setRange(rg); ui->waterfallWidget->setRange(rg); range=rg; } void spectrumWidget::slotAvgChanged(double d) { ui->spectrWidget->setAvg(d); ui->waterfallWidget->setAvg(d); } qsstv_9.2.6/qsstv/widgets/spectrumwidget.h0000664000175000017500000000147113203343610017475 0ustar jomajoma#ifndef SPECTRUMWIDGET_H #define SPECTRUMWIDGET_H #include #include "fftcalc.h" namespace Ui { class spectrumWidget; } class spectrumWidget : public QFrame { Q_OBJECT public: spectrumWidget(QWidget *parent = 0); ~spectrumWidget(); void init(int length, int slices, int isamplingrate); // void realFFT(short int *iBuffer); // void realFFT(float *iBuffer); void realFFT(double *iBuffer); void readSettings(); void writeSettings(); void displaySettings(bool drm); double getVolumeDb(); QImage *getImage(); private slots: void slotMaxDbChanged(int mb); void slotRangeChanged(int rg); void getParams(); void setParams(); void slotAvgChanged(double); private: Ui::spectrumWidget *ui; int maxdb; int range; double avg; fftCalc fftFunc; }; #endif // SPECTRUMWIDGET_H qsstv_9.2.6/qsstv/widgets/spectrumwidget.ui0000664000175000017500000007071613203343610017673 0ustar jomajoma spectrumWidget 0 0 515 696 334 0 Ubuntu Mono 9 50 false Frame QFrame::Panel QFrame::Sunken 2 0 0 0 0 0 16777215 8 255 255 255 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 255 255 255 255 255 255 255 255 255 0 0 0 0 0 127 0 0 0 0 0 63 255 255 220 0 0 0 255 255 255 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 255 255 255 255 255 255 255 255 255 0 0 0 0 0 127 0 0 0 0 0 63 255 255 220 0 0 0 0 0 63 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 0 0 63 255 255 255 0 0 63 0 0 127 0 0 127 0 0 0 0 0 127 255 255 220 0 0 0 true 1 16777215 8 255 255 255 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 255 255 255 255 255 255 255 255 255 0 0 0 0 0 127 0 0 0 0 0 63 255 255 220 0 0 0 255 255 255 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 255 255 255 255 255 255 255 255 255 0 0 0 0 0 127 0 0 0 0 0 63 255 255 220 0 0 0 0 0 63 0 0 127 0 0 191 0 0 159 0 0 63 0 0 84 0 0 63 255 255 255 0 0 63 0 0 127 0 0 127 0 0 0 0 0 127 255 255 220 0 0 0 true 1 10 50 false false Max dB Qt::AlignCenter false 10 Range Qt::AlignCenter Avg Qt::AlignCenter 0 0 16777215 30 QAbstractSpinBox::PlusMinus -40 10 0 0 0 16777215 30 QAbstractSpinBox::PlusMinus 10 50 10 16777215 30 QAbstractSpinBox::PlusMinus 0.010000000000000 1.000000000000000 0.010000000000000 fftDisplay QWidget
fftdisplay.h
1
markerWidget QLabel
widgets/markerwidget.h
qsstv_9.2.6/qsstv/widgets/sweepform.ui0000664000175000017500000001556313203343610016633 0ustar jomajoma sweepForm 0 0 469 156 Test Signal 6 0 Lower Frequency false 300 2500 1200 6 0 Upper Frequency false 300 2500 2300 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 Duration (sec) false 1 100 10 Qt::Horizontal QSizePolicy::Expanding 20 20 6 0 Qt::Horizontal QSizePolicy::Expanding 20 20 OK Cancel Qt::Horizontal QSizePolicy::Expanding 20 20 Qt::Vertical QSizePolicy::Expanding 20 20 qPixmapFromMimeSource okButton clicked() sweepForm accept() 20 20 20 20 cancelButton clicked() sweepForm reject() 20 20 20 20 qsstv_9.2.6/qsstv/widgets/testpatternselection.cpp0000664000175000017500000000101213203343610021234 0ustar jomajoma#include "testpatternselection.h" #include "ui_testpatternselection.h" testPatternSelection::testPatternSelection(QWidget *parent) : QDialog(parent), ui(new Ui::testPatternSelection) { ui->setupUi(this); } testPatternSelection::~testPatternSelection() { delete ui; } etpSelect testPatternSelection::getSelection() { if(ui->rasterRadioButton->isChecked()) return TPRASTER; else if(ui->whiteRadioButton->isChecked()) return TPWHITE; else if(ui->blackRadioButton->isChecked()) return TPBLACK; return TPGRAY; } qsstv_9.2.6/qsstv/widgets/testpatternselection.h0000664000175000017500000000066213203343610020713 0ustar jomajoma#ifndef TESTPATTERNSELECTION_H #define TESTPATTERNSELECTION_H #include enum etpSelect {TPBLACK,TPWHITE,TPGRAY,TPRASTER}; namespace Ui { class testPatternSelection; } class testPatternSelection : public QDialog { Q_OBJECT public: explicit testPatternSelection(QWidget *parent = 0); ~testPatternSelection(); etpSelect getSelection(); private: Ui::testPatternSelection *ui; }; #endif // TESTPATTERNSELECTION_H qsstv_9.2.6/qsstv/widgets/testpatternselection.ui0000664000175000017500000000753613203343610021110 0ustar jomajoma testPatternSelection 0 0 184 205 Dialog Select Test Pattern 2 2 2 2 2 Raster true White true Black true Gray true Qt::Horizontal 40 20 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() testPatternSelection accept() 248 254 157 274 buttonBox rejected() testPatternSelection reject() 316 260 286 274 qsstv_9.2.6/qsstv/widgets/textdisplay.cpp0000664000175000017500000000071213203343610017331 0ustar jomajoma#include "textdisplay.h" #include "ui_textdisplay.h" textDisplay::textDisplay(QWidget *parent) : QDialog(parent), ui(new Ui::textDisplay) { ui->setupUi(this); } textDisplay::~textDisplay() { delete ui; } void textDisplay::clear() { ui->plainTextEdit->clear(); } void textDisplay::append(QString t) { int i; QStringList sl; sl=t.split("\r\n"); for(i=0;iplainTextEdit->appendPlainText(sl.at(i)); } } qsstv_9.2.6/qsstv/widgets/textdisplay.h0000664000175000017500000000051113203343610016773 0ustar jomajoma#ifndef TEXTDISPLAY_H #define TEXTDISPLAY_H #include namespace Ui { class textDisplay; } class textDisplay : public QDialog { Q_OBJECT public: explicit textDisplay(QWidget *parent = 0); ~textDisplay(); void clear(); void append(QString t); private: Ui::textDisplay *ui; }; #endif // TEXTDISPLAY_H qsstv_9.2.6/qsstv/widgets/textdisplay.ui0000664000175000017500000000320113203343610017160 0ustar jomajoma textDisplay 0 0 400 300 Received Text 30 240 341 32 Qt::Horizontal QDialogButtonBox::Ok 10 20 371 211 buttonBox accepted() textDisplay accept() 248 254 157 274 buttonBox rejected() textDisplay reject() 316 260 286 274 qsstv_9.2.6/qsstv/widgets/vumeter.cpp0000664000175000017500000001462013203343610016451 0ustar jomajoma/*************************************************************************** * Copyright (C) 2008 - Giuseppe Cigala * * g_cigala@virgilio.it * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "vumeter.h" #include "configparams.h" #define BW 5 #define SG 100 #define LG 500 #define OFFSET 50 vuMeter::vuMeter(QWidget *parent) : QWidget(parent) { colBack = QColor(50, 50, 255); colValue = Qt::white; colHigh = Qt::red; colMid = Qt::green; colLow = Qt::blue; min = 0; max = 100; val =9; prevValue = 0; horizontal=false; divisions=20; labelText="V"; } void vuMeter::setLabelText(QString t) { labelText=t; } void vuMeter::paintEvent(QPaintEvent *) { if(width()>height()) horizontal=true; else horizontal=false; if (horizontal) { w=LG; h=SG; rw=5; rh=30; // rect rounding } else { w=SG; h=LG; rw=30; rh=5; // rect rounding } if(!slowCPU) { paintBorder(); } paintBar(); } void vuMeter::paintBorder() { QLinearGradient linGrad; QLinearGradient linGrad1; QRectF border1; QRectF rct; QPainter painter(this); QColor light = Qt::white; QColor dark = colBack.darker(255); painter.setPen(QPen(colBack, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter.setRenderHint(QPainter::Antialiasing); if (horizontal) { linGrad.setStart(250,BW); linGrad.setFinalStop(250, 2*BW); linGrad1.setStart(1,SG-3*BW); linGrad1.setFinalStop(1, SG-BW); border1=QRectF(5, 20, w-2*BW, h-5*BW); rct=QRectF(2*BW,h/2-10, 20, 25); } else { linGrad.setStart(BW,1); linGrad.setFinalStop(2*BW, 1); linGrad1.setStart(SG-3*BW,1); linGrad1.setFinalStop(SG-BW, 1); border1=QRectF(20, 5, w-5*BW, h-2*BW); rct=QRectF(w/2-10, h-4*BW-10, 20, 25); } painter.setWindow(0, 0, w, h); linGrad.setColorAt(0, light); linGrad.setColorAt(1, colBack); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); QRectF border(5, 5, w-2*BW, h-2*BW); painter.drawRoundRect(border, rw,rh); linGrad1.setColorAt(0, colBack); linGrad1.setColorAt(1, dark); linGrad1.setSpread(QGradient::PadSpread); painter.setBrush(linGrad1); painter.drawRoundRect(border1, rw,rh); //paint label painter.setPen(QPen(colValue, 2)); QFont valFont("Arial", 24, QFont::Bold); painter.setFont(valFont); painter.drawText(rct, Qt::AlignCenter, labelText); } void vuMeter::paintBar() { QLinearGradient linGrad; int i; double bar; QRectF bar1; QRectF bar2; double length; QPainter painter(this); painter.setWindow(0, 0, w, h); painter.setRenderHint(QPainter::Antialiasing); if (horizontal) { linGrad.setStart(w,h); linGrad.setFinalStop(0,h); bar2=QRectF(OFFSET,3*BW,w-OFFSET-3*BW,h-6*BW); length = bar2.width(); bar = abs(length * (1-(val-min)/(max-min))); bar1=QRectF(bar2.x()+bar2.width()-bar,bar2.y(),bar, bar2.height()); } else { linGrad.setStart(w,0); linGrad.setFinalStop(w,h); bar2=QRectF(3*BW,4*BW,w-6*BW,h-1*OFFSET); length = bar2.height(); bar = abs(length * (val-min)/(max-min)); bar1=QRectF(bar2.x(),bar2.y(),bar2.width(), bar2.height()-bar); } linGrad.setColorAt(0, colHigh); linGrad.setColorAt(0.5, colMid); linGrad.setColorAt(1, colLow); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); painter.drawRect(bar2); // draw background bar painter.setBrush(QColor(40, 40, 40)); painter.drawRect(bar1); painter.setPen(QPen(Qt::black, 2)); for (i = 0; i <=divisions; i++) { if(horizontal) { painter.drawLine(bar2.left()+bar2.width()*i/divisions, bar2.top(), bar2.left()+bar2.width()*i/divisions, bar2.bottom()); } else { painter.drawLine(bar2.left(), bar2.top()+bar2.height()*i/divisions, bar2.right(), bar2.top()+bar2.height()*i/divisions); } } } void vuMeter::setColorBg(QColor color) { colBack = color; update(); } void vuMeter::setColorValue(QColor color) { colValue = color; update(); } void vuMeter::setColorHigh(QColor color) { colHigh = color; update(); } void vuMeter::setColorMid(QColor color) { colMid = color; update(); } void vuMeter::setColors(QColor cL,QColor cM,QColor cH) { colLow = cL; colMid = cM; colHigh = cH; update(); } void vuMeter::setColorLow(QColor color) { colLow = color; update(); } void vuMeter::setValue(double value) { if((fabs(1-(value/prevValue))<0.05) && (slowCPU)) { return; } if (value > max) { val = max; } else if (value < min) { val = min; } else { val = value; } prevValue=value; update(); } void vuMeter::setMinimum(double minValue) { if (minValue > max) { min = max; max = minValue; update(); } else { min = minValue; update(); } } void vuMeter::setMaximum(double maxValue) { if (maxValue < min) { max = min; min = maxValue; update(); } else { max = maxValue; update(); } } QSize vuMeter::minimumSizeHint() const { return QSize(10, 54); } QSize vuMeter::sizeHint() const { return QSize(100, 540); } qsstv_9.2.6/qsstv/widgets/vumeter.h0000664000175000017500000000561313203343610016120 0ustar jomajoma/*************************************************************************** * Copyright (C) 2008 - Giuseppe Cigala * * g_cigala@virgilio.it * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef VUMETER_H #define VUMETER_H #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include #endif class vuMeter : public QWidget { Q_OBJECT QColor colorBg() const { return colBack; } QColor colorValue() const { return colValue;} QColor colorLow() const { return colLow;} QColor colorHigh() const { return colHigh;} double value() const { return val; } double minValue() const {return min;} double maxValue() const {return max; } public: vuMeter(QWidget *parent = 0); QSize minimumSizeHint() const; QSize sizeHint() const; void setHorizontal(bool h) {horizontal=h;} void setLabelText(QString t); signals: void valueChanged(double); public slots: void setColorBg(QColor); void setColorValue(QColor); void setColorHigh(QColor); void setColorMid(QColor); void setColorLow(QColor); void setColors(QColor,QColor ,QColor); void setDivisions(int div) {divisions=div;} void setValue(double); void setMaximum(double); void setMinimum(double); protected: void paintEvent(QPaintEvent *); void paintBorder(); void paintBar(); private: double min; double max; double val; QColor colBack; QColor colValue; QColor colHigh; QColor colLow; QColor colMid; bool horizontal; qreal w; qreal h; int rw; int rh; int divisions; QString labelText; double prevValue; }; #endif qsstv_9.2.6/qsstv/widgets/waterfallform.cpp0000664000175000017500000000366313203343610017634 0ustar jomajoma#include "waterfallform.h" #include "ui_waterfallform.h" #include "appglobal.h" #include "sound/waterfalltext.h" waterfallForm::waterfallForm(QWidget *parent) : QDialog(parent), ui(new Ui::waterfallForm) { ui->setupUi(this); connect (ui->text1PushButton,SIGNAL(clicked()),SLOT(slotText1())); connect (ui->text2PushButton,SIGNAL(clicked()),SLOT(slotText2())); connect (ui->text3PushButton,SIGNAL(clicked()),SLOT(slotText3())); connect (ui->text4PushButton,SIGNAL(clicked()),SLOT(slotText4())); readSettings(); txt=""; } waterfallForm::~waterfallForm() { writeSettings(); delete ui; } void waterfallForm::accept() { writeSettings(); done(QDialog::Accepted); } void waterfallForm::slotText1() { getParams(); txt=txt1; accept(); } void waterfallForm::slotText2() { getParams(); txt=txt2; accept(); } void waterfallForm::slotText3() { getParams(); txt=txt3; accept(); } void waterfallForm::slotText4() { getParams(); txt=txt4; accept(); } void waterfallForm::getParams() { txt1=ui->wfText1->toPlainText(); txt2=ui->wfText2->toPlainText(); txt3=ui->wfText3->toPlainText(); txt4=ui->wfText4->toPlainText(); } void waterfallForm::setParams() { ui->wfText1->setPlainText(txt1); ui->wfText2->setPlainText(txt2); ui->wfText3->setPlainText(txt3); ui->wfText4->setPlainText(txt4); } void waterfallForm::readSettings() { QFont ft; QSettings qSettings; qSettings.beginGroup("Waterfall"); txt1=qSettings.value("text1","").toString(); txt2=qSettings.value("text2","").toString(); txt3=qSettings.value("text3","").toString(); txt4=qSettings.value("text4","").toString(); qSettings.endGroup(); setParams(); } void waterfallForm::writeSettings() { getParams(); QSettings qSettings; qSettings.beginGroup("Waterfall"); qSettings.setValue("text1",txt1); qSettings.setValue("text2",txt2); qSettings.setValue("text3",txt3); qSettings.setValue("text4",txt4); qSettings.endGroup(); } qsstv_9.2.6/qsstv/widgets/waterfallform.h0000664000175000017500000000114613203343610017273 0ustar jomajoma#ifndef WATERFALLFORM_H #define WATERFALLFORM_H #include namespace Ui { class waterfallForm; } class waterfallForm : public QDialog { Q_OBJECT public: explicit waterfallForm(QWidget *parent = 0); ~waterfallForm(); QString text(){ return txt;} private slots: void slotText1(); void slotText2(); void slotText3(); void slotText4(); private: Ui::waterfallForm *ui; QString txt1; QString txt2; QString txt3; QString txt4; QString txt; void readSettings(); void writeSettings(); void getParams(); void setParams(); void accept(); }; #endif // WATERFALLFORM_H qsstv_9.2.6/qsstv/widgets/waterfallform.ui0000664000175000017500000001126313203343610017462 0ustar jomajoma waterfallForm 0 0 323 421 8 Waterfall Text 0 80 16777215 80 TX #1 0 80 16777215 80 TX #2 0 80 16777215 80 TX #3 0 80 16777215 80 TX #4 Qt::Horizontal 40 20 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Save Qt::Horizontal 40 20 buttonBox accepted() waterfallForm accept() 248 254 157 274 buttonBox rejected() waterfallForm reject() 316 260 286 274 qsstv_9.2.6/qsstv/widgets/xyzplaintextedit.cpp0000664000175000017500000000040613203343610020410 0ustar jomajoma#include "xyzplaintextedit.h" #include xyzPlainTextEdit::xyzPlainTextEdit(QWidget *parent) : QPlainTextEdit(parent) { } void xyzPlainTextEdit::focusOutEvent(QFocusEvent * event) { emit editingFinished(); QPlainTextEdit::focusOutEvent(event); } qsstv_9.2.6/qsstv/widgets/xyzplaintextedit.h0000664000175000017500000000053713203343610020062 0ustar jomajoma#ifndef XYZPLAINTEXTEDIT_H #define XYZPLAINTEXTEDIT_H #include #include class xyzPlainTextEdit : public QPlainTextEdit { Q_OBJECT public: explicit xyzPlainTextEdit(QWidget *parent = 0); void focusOutEvent(QFocusEvent * event); signals: void editingFinished(); public slots: }; #endif // XYZPLAINTEXTEDIT_H qsstv_9.2.6/qsstv/xmlrpc/ipcmessage.cpp0000664000175000017500000000273413203343610016744 0ustar jomajoma#include "ipcmessage.h" #include #include "appglobal.h" #include #include #include #include #include #include //extern int errno; // error NO. ipcMessage::ipcMessage(int messageKey) { key=messageKey; messageQId = msgget(key, MSGPERM|IPC_CREAT); if(messageQId<0) errorOut() << "IPC Error" << strerror(errno); } ipcMessage::~ipcMessage() { closeQueue(); } bool ipcMessage::sendMessage(QString t) { if(messageQId<0) return false; int len; // message to send msgBuf.mtype = MTYPE; // set the type of message strncpy(msgBuf.mtext,t.toLatin1().data(),MSGTXMAXLEN); len=strlen(msgBuf.mtext); // send the message to queue rc = msgsnd(messageQId, &msgBuf, len+1, IPC_NOWAIT); if (rc < 0) { if(rc<0) errorOut() << "IPC Error" << strerror(errno); return false; } return true; } bool ipcMessage::receiveMessage(QString &t) { if(messageQId<0) return false; // read the message from queue rc = msgrcv(messageQId, &msgBuf, sizeof(msgBuf.mtext), 0, IPC_NOWAIT); if (rc < -1) { if(rc<0) errorOut() << "IPC Error" << strerror(errno); return false; } if(rc>=0) { t=msgBuf.mtext; return true; } return false; } bool ipcMessage::closeQueue() { // remove the queue rc=msgctl(messageQId,IPC_RMID,NULL); if (rc < 0) { if(rc<0) errorOut() << "IPC Error" << strerror(errno); return false; } return 0; } qsstv_9.2.6/qsstv/xmlrpc/ipcmessage.h0000664000175000017500000000077113203343610016410 0ustar jomajoma#ifndef IPCMESSAGE_H #define IPCMESSAGE_H #include #define MSGTXMAXLEN 2048 #define MSGPERM 0666 // msg queue permission #define MTYPE 88 struct smessageBuf { long mtype; char mtext[MSGTXMAXLEN]; }; class ipcMessage { public: ipcMessage(int messageKey); ~ipcMessage(); void essage(); bool sendMessage(QString t); bool receiveMessage(QString &t); bool closeQueue(); private: smessageBuf msgBuf; int key; int messageQId, rc; int done; }; #endif // IPCMESSAGE_H qsstv_9.2.6/qsstv/xmlrpc/maiaFault.cpp0000664000175000017500000000414213203343610016522 0ustar jomajoma/* * libMaia - maiaFault.cpp * Copyright (c) 2007 Sebastian Wiedenroth * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "maiaFault.h" #include "maiaObject.h" MaiaFault::MaiaFault(const MaiaFault &other) : QObject(other.parent()) { fault = other.fault; } MaiaFault::MaiaFault(int faultCode, QString faultString, QObject *parent) : QObject(parent) { fault["faultCode"] = faultCode; fault["faultString"] = faultString; } QString MaiaFault::toString() { QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", QString("version=\"1.0\" encoding=\"UTF-8\"" )); doc.appendChild(header); QDomElement methodResponse = doc.createElement("methodResponse"); doc.appendChild(methodResponse); QDomElement faultelement = doc.createElement("fault"); methodResponse.appendChild(faultelement); faultelement.appendChild(MaiaObject::toXml(fault)); return doc.toString(); } qsstv_9.2.6/qsstv/xmlrpc/maiaFault.h0000664000175000017500000000324513203343610016172 0ustar jomajoma/* * libMaia - maiaFault.h * Copyright (c) 2007 Sebastian Wiedenroth * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIAFAULT_H #define MAIAFAULT_H #include #include class MaiaFault : public QObject { Q_OBJECT public: MaiaFault(int faultCode = 0, QString faultString = QString(), QObject *parent = 0); MaiaFault(const MaiaFault &other); QString toString(); QMap fault; }; Q_DECLARE_METATYPE(MaiaFault) #endif qsstv_9.2.6/qsstv/xmlrpc/maiaObject.cpp0000664000175000017500000002407013203343610016657 0ustar jomajoma/* * libMaia - maiaObject.cpp * Copyright (c) 2003 Frerich Raabe and * Ian Reinhart Geiser * Copyright (c) 2007 Sebastian Wiedenroth * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "maiaObject.h" #include "appglobal.h" MaiaObject::MaiaObject(QObject* parent) : QObject(parent) { QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars); } QDomElement MaiaObject::toXml(QVariant arg) { //dummy document QDomDocument doc; //value element, we need this in each case if(arg.isNull()) { QDomElement tagString = doc.createElement("value"); QDomText textString = doc.createTextNode(""); // tagValue.appendChild(tagString); tagString.appendChild(textString); return tagString; } QDomElement tagValue = doc.createElement("value"); switch(arg.type()) { case QVariant::String: { QDomElement tagString = doc.createElement("string"); QDomText textString = doc.createTextNode(arg.toString()); tagValue.appendChild(tagString); tagString.appendChild(textString); return tagValue; } case QVariant::Int: { QDomElement tagInt = doc.createElement("int"); QDomText textInt = doc.createTextNode(QString::number(arg.toInt())); tagValue.appendChild(tagInt); tagInt.appendChild(textInt); return tagValue; } case QVariant::Double: { QDomElement tagDouble = doc.createElement("double"); QDomText textDouble = doc.createTextNode(QString::number(arg.toDouble(),'g',9)); tagValue.appendChild(tagDouble); tagDouble.appendChild(textDouble); return tagValue; } case QVariant::Bool: { QString textValue = arg.toBool() ? "1" : "0"; QDomElement tag = doc.createElement("boolean"); QDomText text = doc.createTextNode(textValue); tagValue.appendChild(tag); tag.appendChild(text); return tagValue; } case QVariant::ByteArray: { QString textValue = arg.toByteArray().toBase64(); QDomElement tag = doc.createElement("base64"); QDomText text = doc.createTextNode(textValue); tagValue.appendChild(tag); tag.appendChild(text); return tagValue; } case QVariant::DateTime: { QString textValue = arg.toDateTime().toString("yyyyMMddThh:mm:ss"); QDomElement tag = doc.createElement("datetime.iso8601"); QDomText text = doc.createTextNode(textValue); tagValue.appendChild(tag); tag.appendChild(text); return tagValue; } case QVariant::List: { QDomElement tagArray = doc.createElement("array"); QDomElement tagData = doc.createElement("data"); tagArray.appendChild(tagData); tagValue.appendChild(tagArray); const QList args = arg.toList(); for(int i = 0; i < args.size(); ++i) { tagData.appendChild(toXml(args.at(i))); } return tagValue; } case QVariant::Map: { QDomElement tagStruct = doc.createElement("struct"); QDomElement member; QDomElement name; tagValue.appendChild(tagStruct); QMap map = arg.toMap(); QMapIterator i(map); while(i.hasNext()) { i.next(); member = doc.createElement("member"); name = doc.createElement("name"); // (key) -> name -> member -> struct tagStruct.appendChild(member); member.appendChild(name); name.appendChild(doc.createTextNode(i.key())); // add variables by recursion member.appendChild(toXml(i.value())); } return tagValue; } default: errorOut() << "Failed to marshal unknown variant type: " << arg.type() << endl; } return QDomElement(); //QString::null; } QVariant MaiaObject::fromXml(const QDomElement &elem) { if(elem.tagName().toLower() != "value") { return QVariant(); } // If no type is indicated, the type is string. if(!elem.firstChild().isElement()) { return QVariant(elem.text()); } const QDomElement typeElement = elem.firstChild().toElement(); const QString typeName = typeElement.tagName().toLower(); if(typeName == "string") return QVariant(typeElement.text()); else if(typeName == "i4" || typeName == "int") { return QVariant(typeElement.text().toInt()); } else if(typeName == "double") return QVariant(typeElement.text().toDouble()); else if (typeName == "boolean") { if(typeElement.text().toLower() == "true" || typeElement.text() == "1") return QVariant(true); else return QVariant(false); } else if(typeName == "base64") return QVariant(QByteArray::fromBase64( typeElement.text().toLatin1())); else if(typeName == "datetime" || typeName == "datetime.iso8601") return QVariant(QDateTime::fromString(typeElement.text(), "yyyyMMddThh:mm:ss")); else if(typeName == "nil") return QVariant(); // Non-standard extension: http://ontosys.com/xml-rpc/extensions.php else if ( typeName == "array" ) { QList values; QDomNode valueNode = typeElement.firstChild().firstChild(); while(!valueNode.isNull()) { values << fromXml(valueNode.toElement()); valueNode = valueNode.nextSibling(); } return QVariant(values); } else if ( typeName == "struct" ) { QMap map; QDomNode memberNode = typeElement.firstChild(); while(!memberNode.isNull()) { const QString key = memberNode.toElement().elementsByTagName("name").item(0).toElement().text(); const QVariant data = fromXml(memberNode.toElement().elementsByTagName("value").item(0).toElement()); map[key] = data; memberNode = memberNode.nextSibling(); } return QVariant(map); } else { errorOut() << "Cannot demarshal unknown type " << typeElement.tagName().toLower(); } return QVariant(); } QString MaiaObject::prepareCall(QString method, QList args) { QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", QString("version=\"1.0\" encoding=\"UTF-8\"" )); doc.appendChild(header); QDomElement methodCall = doc.createElement("methodCall"); QDomElement methodName = doc.createElement("methodName"); QDomElement params = doc.createElement("params"); QDomElement param; doc.appendChild(methodCall); methodCall.appendChild(methodName); methodName.appendChild(doc.createTextNode(method)); methodCall.appendChild(params); for(int i = 0; i < args.size(); ++i) { param = doc.createElement("param"); param.appendChild(toXml(args.at(i))); params.appendChild(param); } return doc.toString(); } QString MaiaObject::prepareResponse(QVariant arg) { QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", QString("version=\"1.0\" encoding=\"UTF-8\"" )); doc.appendChild(header); QDomElement methodResponse = doc.createElement("methodResponse"); QDomElement params = doc.createElement("params"); QDomElement param; doc.appendChild(methodResponse); methodResponse.appendChild(params); // if(!arg.isNull()) { param = doc.createElement("param"); param.appendChild(toXml(arg)); params.appendChild(param); } return doc.toString(-1); } void MaiaObject::parseResponse(QString response, QNetworkReply* reply) { QDomDocument doc; QVariant arg; QString errorMsg; int errorLine; int errorColumn; if(!doc.setContent(response, &errorMsg, &errorLine, &errorColumn)) { emit fault(-32700, QString("parse error: response not well formed at line %1: %2").arg(errorLine).arg(errorMsg), reply); delete this; return; } if(doc.documentElement().firstChild().toElement().tagName().toLower() == "params") { QDomNode paramNode = doc.documentElement().firstChild().firstChild(); if(!paramNode.isNull()) { arg = fromXml( paramNode.firstChild().toElement() ); } emit aresponse(arg, reply); } else if(doc.documentElement().firstChild().toElement().tagName().toLower() == "fault") { const QVariant errorVariant = fromXml(doc.documentElement().firstChild().firstChild().toElement()); emit fault(errorVariant.toMap() [ "faultCode" ].toInt(), errorVariant.toMap() [ "faultString" ].toString(), reply); } else { emit fault(-32600, tr("parse error: invalid xml-rpc. not conforming to spec."), reply); } delete this; return; } qsstv_9.2.6/qsstv/xmlrpc/maiaObject.h0000664000175000017500000000412313203343610016321 0ustar jomajoma/* * libMaia - maiaObject.h * Copyright (c) 2003 Frerich Raabe and * Ian Reinhart Geiser * Copyright (c) 2007 Sebastian Wiedenroth * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIAOBJECT_H #define MAIAOBJECT_H #include #include #include class MaiaObject : public QObject { Q_OBJECT public: MaiaObject(QObject* parent = 0); static QDomElement toXml(QVariant arg); static QVariant fromXml(const QDomElement &elem); QString prepareCall(QString method, QList args); static QString prepareResponse(QVariant arg); public slots: void parseResponse(QString response, QNetworkReply* reply); signals: void aresponse(QVariant &, QNetworkReply* reply); void call(const QString, const QList); void fault(int, const QString &, QNetworkReply* reply); }; #endif qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcClient.cpp0000664000175000017500000000734413203343610020022 0ustar jomajoma/* * libMaia - maiaXmlRpcClient.cpp * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "maiaXmlRpcClient.h" #include "maiaFault.h" MaiaXmlRpcClient::MaiaXmlRpcClient(QObject* parent) : QObject(parent), manager(this), request() { init(); } MaiaXmlRpcClient::MaiaXmlRpcClient(QUrl url, QObject* parent) : QObject(parent), manager(this), request(url) { init(); setUrl(url); } MaiaXmlRpcClient::MaiaXmlRpcClient(QUrl url, QString userAgent, QObject *parent) : QObject(parent) { // userAgent should adhere to RFC 1945 http://tools.ietf.org/html/rfc1945 init(); request.setRawHeader("User-Agent", userAgent.toLatin1()); setUrl(url); } void MaiaXmlRpcClient::init() { request.setRawHeader("User-Agent", "libmaia/0.2"); request.setHeader(QNetworkRequest::ContentTypeHeader, "text/xml"); connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); connect(&manager, SIGNAL(sslErrors(QNetworkReply *, const QList &)), this, SIGNAL(sslErrors(QNetworkReply *, const QList &))); } void MaiaXmlRpcClient::setUrl(QUrl url) { if(!url.isValid()) return; request.setUrl(url); } void MaiaXmlRpcClient::setUserAgent(QString userAgent) { request.setRawHeader("User-Agent", userAgent.toLatin1()); } QNetworkReply* MaiaXmlRpcClient::call(QString method, QList args, QObject* responseObject, const char* responseSlot, QObject* faultObject, const char* faultSlot) { MaiaObject* call = new MaiaObject(this); connect(call, SIGNAL(aresponse(QVariant &, QNetworkReply *)), responseObject, responseSlot); connect(call, SIGNAL(fault(int, const QString &, QNetworkReply *)), faultObject, faultSlot); QNetworkReply* reply = manager.post( request, call->prepareCall(method, args).toUtf8() ); callmap[reply] = call; return reply; } void MaiaXmlRpcClient::setSslConfiguration(const QSslConfiguration &config) { request.setSslConfiguration(config); } QSslConfiguration MaiaXmlRpcClient::sslConfiguration () const { return request.sslConfiguration(); } void MaiaXmlRpcClient::replyFinished(QNetworkReply* reply) { QString response; if(!callmap.contains(reply)) return; if(reply->error() != QNetworkReply::NoError) { MaiaFault fault(-32300, reply->errorString()); response = fault.toString(); } else { response = QString::fromUtf8(reply->readAll()); } // parseResponse deletes the MaiaObject callmap[reply]->parseResponse(response, reply); reply->deleteLater(); callmap.remove(reply); } qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcClient.h0000664000175000017500000000447613203343610017472 0ustar jomajoma/* * libMaia - maiaXmlRpcClient.h * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIAXMLRPCCLIENT_H #define MAIAXMLRPCCLIENT_H #include #include #include #include "maiaObject.h" class MaiaXmlRpcClient : public QObject { Q_OBJECT public: MaiaXmlRpcClient(QObject* parent = 0); MaiaXmlRpcClient(QUrl url, QObject* parent = 0); MaiaXmlRpcClient(QUrl url, QString userAgent, QObject *parent = 0); void setUrl(QUrl url); void setUserAgent(QString userAgent); QNetworkReply* call(QString method, QList args, QObject* responseObject, const char* responseSlot, QObject* faultObject, const char* faultSlot); void setSslConfiguration(const QSslConfiguration &config); QSslConfiguration sslConfiguration () const; signals: void sslErrors(QNetworkReply *reply, const QList &errors); private slots: void replyFinished(QNetworkReply*); private: void init(); QNetworkAccessManager manager; QNetworkRequest request; QMap callmap; }; #endif qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcServer.cpp0000664000175000017500000000676313203343610020056 0ustar jomajoma/* * libMaia - maiaXmlRpcServer.cpp * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "maiaXmlRpcServer.h" #include "maiaFault.h" MaiaXmlRpcServer::MaiaXmlRpcServer(const QHostAddress &address, quint16 port, QObject* parent) : QObject(parent) { allowedAddresses = NULL; connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection())); server.listen(address, port); } MaiaXmlRpcServer::MaiaXmlRpcServer(quint16 port, QObject* parent) : QObject(parent) { allowedAddresses = NULL; connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection())); server.listen(QHostAddress::Any, port); } MaiaXmlRpcServer::MaiaXmlRpcServer(const QHostAddress &address, quint16 port, QList *allowedAddresses, QObject *parent) : QObject(parent) { this->allowedAddresses = allowedAddresses; connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection())); server.listen(address, port); } void MaiaXmlRpcServer::addMethod(QString method, QObject* responseObject, const char* responseSlot) { objectMap[method] = responseObject; slotMap[method] = responseSlot; } void MaiaXmlRpcServer::removeMethod(QString method) { objectMap.remove(method); slotMap.remove(method); } void MaiaXmlRpcServer::getMethod(QString method, QObject **responseObject, const char **responseSlot) { if(!objectMap.contains(method)) { *responseObject = NULL; *responseSlot = NULL; return; } *responseObject = objectMap[method]; *responseSlot = slotMap[method]; } void MaiaXmlRpcServer::newConnection() { QTcpSocket *connection = server.nextPendingConnection(); if (!this->allowedAddresses || this->allowedAddresses->isEmpty() || this->allowedAddresses->contains(connection->peerAddress())) { MaiaXmlRpcServerConnection *client = new MaiaXmlRpcServerConnection(connection, this); connect(client, SIGNAL(getMethod(QString, QObject **, const char**)),this, SLOT(getMethod(QString, QObject **, const char**))); } else { qWarning() << "Rejected connection attempt from" << connection->peerAddress().toString(); connection->disconnectFromHost(); } } QHostAddress MaiaXmlRpcServer::getServerAddress() { return server.serverAddress(); } qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcServer.h0000664000175000017500000000464313203343610017516 0ustar jomajoma/* * libMaia - maiaXmlRpcServer.h * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIAXMLRPCSERVER_H #define MAIAXMLRPCSERVER_H #include #include #include #include "maiaObject.h" #include "maiaXmlRpcServerConnection.h" class MaiaXmlRpcServer : public QObject { Q_OBJECT public: MaiaXmlRpcServer(const QHostAddress &address = QHostAddress::Any, quint16 port = 8080, QObject* parent = 0); MaiaXmlRpcServer(const QHostAddress &address = QHostAddress::Any, quint16 port = 8080, QList *allowedAddresses = 0, QObject *parent = 0); MaiaXmlRpcServer(quint16 port = 8080, QObject* parent = 0); void addMethod(QString method, QObject *responseObject, const char* responseSlot); void removeMethod(QString method); QHostAddress getServerAddress(); public slots: void getMethod(QString method, QObject **responseObject, const char** responseSlot); private slots: void newConnection(); private: QTcpServer server; QHash objectMap; QHash slotMap; QList *allowedAddresses; friend class maiaXmlRpcServerConnection; }; #endif qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcServerConnection.cpp0000664000175000017500000002255413203343610022072 0ustar jomajoma/* * libMaia - maiaXmlRpcServerConnection.cpp * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "maiaXmlRpcServerConnection.h" #include "maiaXmlRpcServer.h" #include "appglobal.h" MaiaXmlRpcServerConnection::MaiaXmlRpcServerConnection(QTcpSocket *connection, QObject* parent) : QObject(parent) { header = NULL; clientConnection = connection; connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readFromSocket())); connect(clientConnection, SIGNAL(disconnected()), this, SLOT(slotDisconnect())); } MaiaXmlRpcServerConnection::~MaiaXmlRpcServerConnection() { clientConnection->deleteLater(); delete header; } void MaiaXmlRpcServerConnection::slotDisconnect() { deleteLater(); } void MaiaXmlRpcServerConnection::readFromSocket() { QString lastLine; while(clientConnection->canReadLine() && !header) { lastLine = clientConnection->readLine(); headerString += lastLine; if(lastLine == "\r\n") { /* http header end */ header = new QHttpRequestHeader(headerString); if(!header->isValid()) { /* return http error */ errorOut() << "Invalid Header"; return; } else if(header->method() != "POST") { /* return http error */ errorOut() << "No Post!"; return; } else if(!header->contentLength()) { /* return fault */ errorOut() << "No Content Length"; return; } } } if(header) { if(header->contentLength() <= clientConnection->bytesAvailable()) { /* all data complete */ parseCall(clientConnection->readAll()); delete header; header=NULL; } } } void MaiaXmlRpcServerConnection::sendResponse(QString content) { QHttpResponseHeader header(200, "OK"); QByteArray block; header.setValue("Server", "MaiaXmlRpc/0.1"); header.setValue("Content-Type", "text/xml"); header.setValue("Connection","close"); header.setContentLength(content.toUtf8().length()); block.append(header.toString().toUtf8()); block.append(content.toUtf8()); clientConnection->write(block); // clientConnection->disconnectFromHost(); } void MaiaXmlRpcServerConnection::parseCall(QString call) { QDomDocument doc; QList args; QVariant ret; QString response; QObject *responseObject; const char *responseSlot; if(!doc.setContent(call)) { /* received invalid xml */ MaiaFault fault(-32700, "parse error: not well formed"); sendResponse(fault.toString()); return; } QDomElement methodNameElement = doc.documentElement().firstChildElement("methodName"); QDomElement params = doc.documentElement().firstChildElement("params"); if(methodNameElement.isNull()) { /* invalid call */ MaiaFault fault(-32600, "server error: invalid xml-rpc. not conforming to spec"); sendResponse(fault.toString()); return; } QString methodName = methodNameElement.text(); emit getMethod(methodName, &responseObject, &responseSlot); if(!responseObject) { /* unknown method */ MaiaFault fault(-32601, "server error: requested method not found"); sendResponse(fault.toString()); return; } QDomNode paramNode = params.firstChild(); while(!paramNode.isNull()) { args << MaiaObject::fromXml( paramNode.firstChild().toElement()); paramNode = paramNode.nextSibling(); } if(!invokeMethodWithVariants(responseObject, responseSlot, args, &ret)) { /* error invoking... */ MaiaFault fault(-32602, "server error: invalid method parameters"); sendResponse(fault.toString()); return; } if(ret.canConvert()) { response = ret.value().toString(); } else { response = MaiaObject::prepareResponse(ret); } sendResponse(response); } /* taken from http://delta.affinix.com/2006/08/14/invokemethodwithvariants/ thanks to Justin Karneges once again :) */ bool invokeMethodWithVariants(QObject *obj, const QByteArray &method, const QVariantList &args, QVariant *ret, Qt::ConnectionType type) { // QMetaObject::invokeMethod() has a 10 argument maximum if(args.count() > 10) return false; QList argTypes; for(int n = 0; n < args.count(); ++n) argTypes += args[n].typeName(); // get return type int metatype = 0; QByteArray retTypeName = getReturnType(obj->metaObject(), method, argTypes); if(!retTypeName.isEmpty() && retTypeName != "QVariant") { metatype = QMetaType::type(retTypeName.data()); if(metatype == 0) // lookup failed return false; } QGenericArgument arg[10]; for(int n = 0; n < args.count(); ++n) arg[n] = QGenericArgument(args[n].typeName(), args[n].constData()); QGenericReturnArgument retarg; QVariant retval; QString test(QMetaType::typeName(metatype)); if(metatype != 0) { if( test=="void") { retval=QVariant(); retTypeName=""; } else { retval = QVariant(metatype, (const void *)0); } retarg = QGenericReturnArgument(retval.typeName(), retval.data()); } else { /* QVariant */ retarg = QGenericReturnArgument("QVariant", &retval); } if(retTypeName.isEmpty()) { /* void */ if(!QMetaObject::invokeMethod(obj, method.data(), type, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8], arg[9])) return false; } else { if(!QMetaObject::invokeMethod(obj, method.data(), type, retarg, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8], arg[9])) return false; } if(retval.isValid() && ret) *ret = retval; return true; } QByteArray getReturnType(const QMetaObject *obj,const QByteArray &method, const QList argTypes) { for(int n = 0; n < obj->methodCount(); ++n) { QMetaMethod m = obj->method(n); #if QT_VERSION >= 0x050000 QByteArray sig = m.methodSignature(); #else QByteArray sig = m.signature(); #endif int offset = sig.indexOf('('); if(offset == -1) continue; QByteArray name = sig.mid(0, offset); if(name != method) continue; if(m.parameterTypes() != argTypes) continue; return m.typeName(); } return QByteArray(); } /* simple Qt4 class emulater */ #if QT_VERSION >= 0x050000 QHttpRequestHeader::QHttpRequestHeader(QString headerString) { this->mHeaderString = headerString; QStringList hdrs = headerString.split("\r\n"); QStringList hdrkv; for (int i = 0; i < hdrs.size(); i++) { if (hdrs.at(i).trimmed().isEmpty()) break; if (i == 0) { hdrkv = hdrs.at(i).split(" "); this->mMethod = hdrkv.at(0); } else { hdrkv = hdrs.at(i).split(":"); this->mHeaders[hdrkv.at(0)] = hdrkv.at(1).trimmed(); } } } bool QHttpRequestHeader::isValid() { if (this->mHeaderString.isEmpty()) return false; if (this->mMethod != "GET" && this->mMethod != "POST") return false; if (this->mHeaders.size() < 2) return false; return true; } QString QHttpRequestHeader::method() { return this->mMethod; } uint QHttpRequestHeader::contentLength() const { uint clen = 0; clen = this->mHeaders.value("Content-length").toUInt(); return clen; } QHttpResponseHeader::QHttpResponseHeader(int code, QString text) { this->mCode = code; this->mText = text; } void QHttpResponseHeader::setValue(const QString &key, const QString &value) { this->mHeaders[key] = value; } QString QHttpResponseHeader::toString() const { QMapIterator it(this->mHeaders); QString hdrstr; hdrstr += QString("HTTP/1.1 %1 %2\r\n").arg(this->mCode).arg(this->mText); while (it.hasNext()) { it.next(); hdrstr += it.key() + ": " + it.value() + "\r\n"; } hdrstr += "\r\n"; return hdrstr; } #endif qsstv_9.2.6/qsstv/xmlrpc/maiaXmlRpcServerConnection.h0000664000175000017500000000611113203343610021526 0ustar jomajoma/* * libMaia - maiaXmlRpcServerConnection.h * Copyright (c) 2007 Sebastian Wiedenroth * and Karl Glatz * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAIAXMLRPCSERVERCONNECTION_H #define MAIAXMLRPCSERVERCONNECTION_H #include #include #include #include "maiaFault.h" #if QT_VERSION >= 0x050000 class QHttpRequestHeader { public: explicit QHttpRequestHeader(QString headerString); virtual ~QHttpRequestHeader() {} bool isValid(); QString method(); uint contentLength() const; private: QString mHeaderString; QString mMethod; QMap mHeaders; }; class QHttpResponseHeader { public: explicit QHttpResponseHeader(int code, QString text); virtual ~QHttpResponseHeader() {} void setValue(const QString &key, const QString &value); virtual QString toString() const; void setContentLength(int len) { setValue("Content-length", QString::number(len)); } private: int mCode; QString mText; QMap mHeaders; }; #endif class MaiaXmlRpcServerConnection : public QObject { Q_OBJECT public: MaiaXmlRpcServerConnection(QTcpSocket *connection, QObject *parent = 0); ~MaiaXmlRpcServerConnection(); signals: void getMethod(QString method, QObject **responseObject, const char **responseSlot); private slots: void readFromSocket(); void slotDisconnect(); private: void sendResponse(QString content); void parseCall(QString call); QTcpSocket *clientConnection; QString headerString; QHttpRequestHeader *header; }; QByteArray getReturnType(const QMetaObject *obj, const QByteArray &method, const QList argTypes); bool invokeMethodWithVariants(QObject *obj, const QByteArray &method, const QVariantList &args, QVariant *ret, Qt::ConnectionType type = Qt::AutoConnection); #endif qsstv_9.2.6/qsstv/xmlrpc/xmlinterface.cpp0000664000175000017500000000735713203343610017313 0ustar jomajoma#include "xmlinterface.h" #include "appglobal.h" xmlInterface::xmlInterface(QObject *parent) : QObject(parent) { rigInfo.trxState="RX"; rpcServer = new MaiaXmlRpcServer(7362, this); rpcServer->addMethod("main.get_trx_state", this, "getTrxState"); rpcServer->addMethod("rig.take_control", this, "takeControl"); rpcServer->addMethod("rig.set_name", this, "setName"); rpcServer->addMethod("rig.set_modes", this, "setModes"); rpcServer->addMethod("rig.set_mode", this, "setMode"); rpcServer->addMethod("rig.set_bandwidths", this, "setBandwidths"); rpcServer->addMethod("rig.set_bandwidth", this, "setBandwidth"); rpcServer->addMethod("main.set_wf_sideband", this, "setWfSideband"); rpcServer->addMethod("rig.set_frequency", this, "setFrequency"); rpcServer->addMethod("system.multicall", this, "systemMulticall"); rpcServer->addMethod("main.get_frequency", this, "getFrequency"); rpcServer->addMethod("rig.get_mode", this, "getMode"); rpcServer->addMethod("rig.get_bandwidth", this, "getBandwidth"); rpcServer->addMethod("rig.get_notch", this, "getNotch"); } void xmlInterface::takeControl() { log("takeControl",""); } void xmlInterface::setName(QString t) { rigInfo.rigName=t; log("setName",t); } void xmlInterface::setMode(QString t) { rigInfo.mode=t; log("setMode",t); } void xmlInterface::setModes(QVariantList t) { log("setModes",t); } void xmlInterface::setBandwidths(QVariantList t) { log("setBandwidths",t); } void xmlInterface::setBandwidth(QString t) { rigInfo.bandWidth=t; log("setBandwidth",t); } void xmlInterface::setWfSideband(QString t) { log("setWfSideband",t); } void xmlInterface::setFrequency(double d) { rigInfo.frequency=d; log("setFrequency",QString::number(d,'g',9)); } QString xmlInterface::getTrxState() { // log("getTrxSate",rigInfo.trxState); return rigInfo.trxState; } double xmlInterface::getFrequency() { log("getFrequency",QString::number(rigInfo.frequency,'g',9)); return rigInfo.frequency; } QString xmlInterface::getMode() { log("getMode",rigInfo.mode); return rigInfo.mode; } int xmlInterface::getNotch(int t) { log("getNotch",QString::number(rigInfo.notch)); rigInfo.notch=t; return 1; } QString xmlInterface::getBandwidth() { log("getBandwidth",rigInfo.bandWidth); return rigInfo.bandWidth; } QVariantList xmlInterface::systemMulticall(QVariantList s) { QVariant ret; QVariantMap m; QVariantList args; QVariantList tmp; QVariantList results; // QString response; QObject *responseObject; const char *responseSlot; int i,j; log("systemMulticall",s); for(i=0;igetMethod(m["methodName"].toString(), &responseObject, &responseSlot); if(responseObject!=0) { args=m["params"].toList(); for(j=0;j #include "maiaXmlRpcServer.h" #include "maiaXmlRpcServerConnection.h" struct sxmlInfo { sxmlInfo() { frequency=-1.; } QString rigName; QString bandWidth; double frequency; QString mode; QString trxState; int notch; }; class xmlInterface : public QObject { Q_OBJECT public: explicit xmlInterface(QObject *parent = 0); void activatePTT(bool b); public slots: void takeControl(); void setName(QString t); void setModes(QVariantList t); void setBandwidths(QVariantList t); void setBandwidth(QString t); void setWfSideband(QString t); void setMode(QString t); void setFrequency(double d); QVariantList systemMulticall(QVariantList s); double getFrequency(); QString getMode(); QString getBandwidth(); QString getTrxState(); int getNotch(int t); private: MaiaXmlRpcServer *rpcServer; void log(QString cmd,QString t); void log(QString cmd, QVariantList t); sxmlInfo rigInfo; }; #endif // XMLINTERFACE_H qsstv_9.2.6/qsstv/appdefs.h0000664000175000017500000000143713203343610014405 0ustar jomajoma#ifndef APPDEFS_H #define APPDEFS_H #include #include using namespace std; /* Because of the library: "complex" */ #define SOUNDFRAME quint32 #define BASESAMPLERATE 48000 #define SUBSAMPLINGFACTOR 4 #define MONOCHANNEL 1 #define STEREOCHANNEL 2 #define RXSTRIPE 1024 #define TXSTRIPE 1024 #define FILTERPARAMTYPE double #define DOWNSAMPLESIZE (SUBSAMPLINGFACTOR*RXSTRIPE) #define SAMPLERATE (BASESAMPLERATE/SUBSAMPLINGFACTOR) typedef double DSPFLOAT; typedef unsigned char byte; /* Define the application specific data-types ------------------------------- */ typedef double _REAL; typedef complex<_REAL> _COMPLEX; typedef short _SAMPLE; typedef unsigned char _BYTE; typedef bool _BOOLEAN; typedef unsigned char _BINARY; #endif // APPDEFS_H qsstv_9.2.6/qsstv/appglobal.cpp0000664000175000017500000000316313203343610015255 0ustar jomajoma#include "appglobal.h" #include "logging.h" #include "soundbase.h" #include #include const QString MAJORVERSION = "9.2"; const QString CONFIGVERSION = "9.0"; const QString MINORVERSION = ".6"; const QString LOGVERSION = ("qsstv."+MAJORVERSION+MINORVERSION+".log"); const QString ORGANIZATION = "ON4QZ"; const QString APPLICATION = ("qsstv_" +CONFIGVERSION); const QString qsstvVersion=QString("QSSTV " + MAJORVERSION+MINORVERSION); const QString shortName=QString("QSSTV"); QSplashScreen *splashPtr; QString splashStr; mainWindow *mainWindowPtr; soundBase *soundIOPtr; logFile *logFilePtr; configDialog *configDialogPtr; ftpInterface *notifyRXIntf; ftpInterface *hybridTxIntf; ftpInterface *notifyTXIntf; ftpInterface *onlineStatusIntf; dispatcher *dispatcherPtr; QStatusBar *statusBarPtr; rxWidget *rxWidgetPtr; txWidget *txWidgetPtr; galleryWidget *galleryWidgetPtr; waterfallText *waterfallPtr; rigControl *rigControllerPtr; xmlInterface *xmlIntfPtr; logBook *logBookPtr; fileWatcher *fileWatcherPtr; bool useHybrid; etransmissionMode transmissionModeIndex; // SSTV , DRM QPixmap *greenPXMPtr; QPixmap *redPXMPtr; #ifndef QT_NO_DEBUG scopeView *scopeViewerData; scopeView *scopeViewerSyncNarrow; scopeView *scopeViewerSyncWide; #endif void globalInit() { logFilePtr=new logFile(); logFilePtr->open(LOGVERSION); QSettings qSettings; qSettings.beginGroup("MAIN"); logFilePtr->readSettings(); greenPXMPtr=new QPixmap(16,16); greenPXMPtr->fill(Qt::green); redPXMPtr=new QPixmap(16,16); redPXMPtr->fill(Qt::red); qSettings.endGroup(); } void globalEnd(void) { logFilePtr->close(); } qsstv_9.2.6/qsstv/appglobal.h0000664000175000017500000000337713203343610014731 0ustar jomajoma#ifndef APPGLOBAL_H #define APPGLOBAL_H #include "logging.h" //#include "mainwindow.h" #include "appdefs.h" class QSplashScreen; class scopeView; class rxWidget; class txWidget; class galleryWidget; class waterfallText; class rigControl; class xmlInterface; class logBook; class dispatcher; class fileWatcher; class ftpInterface; enum etransmissionMode {TRXSSTV,TRXDRM,TRXNOMODE}; extern const QString MAJORVERSION; extern const QString CONFIGVERSION; extern const QString MINORVERSION; extern const QString ORGANIZATION; extern const QString APPLICATION; extern const QString qsstvVersion; extern const QString shortName; #define MAGICNUMBER (('4'<<24)+('Q'<<16)+('Z'<<8)+'S') class soundBase; class mainWindow; class QStatusBar; class configDialog; extern mainWindow *mainWindowPtr; extern soundBase *soundIOPtr; extern QSplashScreen *splashPtr; extern QString splashStr; extern dispatcher *dispatcherPtr; extern QStatusBar *statusBarPtr; extern fileWatcher *fileWatcherPtr; extern rxWidget *rxWidgetPtr; extern txWidget *txWidgetPtr; extern galleryWidget *galleryWidgetPtr; extern waterfallText *waterfallPtr; extern rigControl *rigControllerPtr; extern xmlInterface *xmlIntfPtr; extern configDialog *configDialogPtr; extern logBook *logBookPtr; extern QPixmap *greenPXMPtr; extern QPixmap *redPXMPtr; extern logFile *logFilePtr; extern bool useHybrid; extern ftpInterface *notifyRXIntf; extern ftpInterface *hybridTxIntf; extern ftpInterface *notifyTXIntf; extern ftpInterface *onlineStatusIntf; extern etransmissionMode transmissionModeIndex; // SSTV , DRM #ifndef QT_NO_DEBUG extern scopeView *scopeViewerData; extern scopeView *scopeViewerSyncNarrow; extern scopeView *scopeViewerSyncWide; #endif void globalInit(void); void globalEnd(void); #endif // APPGLOBAL_H qsstv_9.2.6/qsstv/main.cpp0000664000175000017500000000565013203343610014243 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include "appglobal.h" #include "mainwindow.h" #include #include #include #include "dispatcher.h" QSplashScreen *splash; int main( int argc, char ** argv ) { int result; QTimer tm; tm.setSingleShot(true); QApplication::setColorSpec( QApplication::ManyColor ); QCoreApplication::setOrganizationName(ORGANIZATION); QCoreApplication::setApplicationName(APPLICATION); QApplication app( argc, argv ); QPixmap pixmap(":/icons/qsstvsplash.png"); QSplashScreen splash(pixmap,Qt::WindowStaysOnTopHint); splashPtr=&splash; splash.show(); QFont f; f.setBold(true); f.setPixelSize(20); splashPtr->setFont(f); splashStr="\n\n\n"; splashStr+=QString( "Starting %1").arg(qsstvVersion).rightJustified(25,' ')+"\n"; splash.showMessage (splashStr,Qt::AlignLeft,Qt::white); tm.start(100); globalInit(); mainWindowPtr=new mainWindow; mainWindowPtr->setWindowIcon(QPixmap(":/icons/qsstv.png")); while(1) { app.processEvents(); if(!tm.isActive()) break; } mainWindowPtr->init(); // this must follow show() because window has to be drawn first to determine fftframe window size mainWindowPtr->hide(); tm.start(100); while(1) { app.processEvents(); if(!tm.isActive()) break; } splash.finish(mainWindowPtr); mainWindowPtr->show(); mainWindowPtr->startRunning(); result=app.exec(); globalEnd(); return result; } qsstv_9.2.6/qsstv/mainwindow.cpp0000664000175000017500000004035313203343610015472 0ustar jomajoma/************************************************************************** * Copyright (C) 2000-2012 by Johan Maes * * on4qz@telenet.be * * http://users.telenet.be/on4qz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "mainwindow.h" #include "appglobal.h" #include "utils/logging.h" #include "dispatch/dispatcher.h" #include "ui_mainwindow.h" #include "soundpulse.h" #include "soundalsa.h" #include "configdialog.h" #include "configparams.h" #include "rigcontrol.h" #include "waterfalltext.h" #include "calibration.h" #include "frequencyselectwidget.h" #include "hexconvertor.h" #ifndef QT_NO_DEBUG #include "scope/scopeview.h" #endif #include "scope/scopeoffset.h" #include "rxfunctions.h" #include "logbook.h" #include "testpatternselection.h" #include #include #include #include #include #include "filewatcher.h" /** * @brief * * @param parent */ mainWindow::mainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { QApplication::instance()->thread()->setObjectName("qsstv_main"); wfTextPushButton=new QPushButton("WF Text",this); bsrPushButton=new QPushButton("BSR",this); freqComboBox=new QComboBox(this); idPushButton=new QPushButton("WF ID",this); cwPushButton=new QPushButton("CW ID",this); QFont f; freqDisplay = new QLabel(this); f.setBold(true); f.setPixelSize(15); freqDisplay->setFont(f); freqDisplay->setObjectName("freqDisplay"); freqDisplay->setMinimumSize(QSize(100, 0)); freqDisplay->setMaximumSize(QSize(100, 16777215)); freqDisplay->setFrameShape(QFrame::Box); freqDisplay->setFrameShadow(QFrame::Raised); freqDisplay->setLineWidth(2); pttText.setText(" PTT"); pttIcon=new QLabel(this); pttIcon->setFixedSize(16,16); pttIcon->setPixmap(*greenPXMPtr); pttIcon->setFrameShape(QFrame::Panel); pttIcon->setFrameShadow(QFrame::Raised); pttIcon->setLineWidth(2); rigControllerPtr=new rigControl(1); // must preceed configDialog construction configDialogPtr=new configDialog(this); configDialogPtr->readSettings(); ui->setupUi(this); setWindowTitle(qsstvVersion); setWindowIcon(QPixmap(":/icons/qsstv.png")); ui->maintabWidget->setCurrentIndex(0); ui->statusBar->addPermanentWidget(freqDisplay); ui->statusBar->addPermanentWidget(freqComboBox); ui->statusBar->addPermanentWidget(wfTextPushButton); ui->statusBar->addPermanentWidget(bsrPushButton); ui->statusBar->addPermanentWidget(idPushButton); ui->statusBar->addPermanentWidget(cwPushButton); ui->statusBar->addPermanentWidget(&pttText); ui->statusBar->addPermanentWidget(pttIcon); statusBarPtr=statusBar(); // must be after setup UI spectrumFramePtr=ui->spectrumFrame; // setting up pointers soundIOPtr=NULL; fileWatcherPtr=NULL; rxWidgetPtr=ui->rxWindow; txWidgetPtr=ui->txWindow; galleryWidgetPtr=ui->galleryWindow; readSettings(); if(pulseSelected) soundIOPtr=new soundPulse; else soundIOPtr=new soundAlsa; dispatcherPtr=new dispatcher; waterfallPtr=new waterfallText; xmlIntfPtr=new xmlInterface; logBookPtr=new logBook; // setup connections connect(ui->actionSaveWaterfallImage,SIGNAL(triggered()),this, SLOT(slotSaveWaterfallImage())); connect(ui->actionExit,SIGNAL(triggered()),this, SLOT(slotExit())); connect(ui->actionConfigure,SIGNAL(triggered()),this, SLOT(slotConfigure())); connect(ui->actionCalibrate,SIGNAL(triggered()),this, SLOT(slotCalibrate())); connect(ui->actionAboutQSSTV, SIGNAL(triggered()),SLOT(slotAboutQSSTV())); connect(ui->actionAboutQt, SIGNAL(triggered()),SLOT(slotAboutQt())); connect(ui->actionUsersGuide, SIGNAL(triggered()),SLOT(slotDocumentation())); connect(idPushButton, SIGNAL(clicked()), this, SLOT(slotSendWFID())); connect(cwPushButton, SIGNAL(clicked()), this, SLOT(slotSendCWID())); connect(bsrPushButton, SIGNAL(clicked()), this, SLOT(slotSendBSR())); connect(freqComboBox,SIGNAL(activated(int)),SLOT(slotSetFrequency(int))); connect(wfTextPushButton, SIGNAL(clicked()), this, SLOT(slotSendWfText())); connect(rxWidgetPtr,SIGNAL(modeSwitch(int)),this, SLOT(slotModeChange(int))); connect(txWidgetPtr,SIGNAL(modeSwitch(int)),this, SLOT(slotModeChange(int))); QAction *fs = new QAction(this); fs->setShortcut(Qt::Key_F | Qt::CTRL); connect(fs, SIGNAL(triggered()), this, SLOT(slotFullScreen())); this->addAction(fs); #ifdef ENABLELOGGING connect(ui->actionLogSettings, SIGNAL(triggered()),SLOT(slotLogSettings())); connect(ui->actionResetLog, SIGNAL(triggered()),SLOT(slotResetLog())); #else ui->menuOptions->removeAction(ui->actionLogSettings); ui->menuOptions->removeAction(ui->actionResetLog); #endif #ifndef QT_NO_DEBUG connect(ui->actionShowDataScope, SIGNAL(triggered()),SLOT(slotShowDataScope())); connect(ui->actionShowSyncScopeNarrow, SIGNAL(triggered()),SLOT(slotShowSyncScopeNarrow())); connect(ui->actionShowSyncScopeWide, SIGNAL(triggered()),SLOT(slotShowSyncScopeWide())); connect(ui->actionScopeOffset,SIGNAL(triggered()),this, SLOT(slotScopeOffset())); connect(ui->actionClearScope,SIGNAL(triggered()),this, SLOT(slotClearScope())); connect(ui->actionDumpSamplesPerLine,SIGNAL(triggered()),this, SLOT(slotDumpSamplesPerLine())); connect(ui->actionTxTestPattern,SIGNAL(triggered()),this, SLOT(slotTxTestPattern())); #else ui->menuOptions->removeAction(ui->actionDumpSamplesPerLine); ui->menuScope->removeAction(ui->actionShowDataScope); ui->menuScope->removeAction(ui->actionShowSyncScopeNarrow); ui->menuScope->removeAction(ui->actionShowSyncScopeWide); ui->menuScope->removeAction(ui->actionScopeOffset); ui->menuScope->menuAction()->setVisible(false); #endif } /** * @brief * */ mainWindow::~mainWindow() { delete ui; } /** * @brief initialize sound device and dispatcher * */ void mainWindow::init() { // starting threads // todo ftp threads cleanUpCache(rxSSTVImagesPath); cleanUpCache(rxDRMImagesPath); cleanUpCache(txSSTVImagesPath); cleanUpCache(txDRMImagesPath); //start rx and tx threads rxWidgetPtr->functionsPtr()->start(); txWidgetPtr->functionsPtr()->start(); restartSound(true); dispatcherPtr->init(); galleryWidgetPtr->init(); txWidgetPtr->init(); waterfallPtr->init(); rigControllerPtr->init(); rxWidgetPtr->init(); if(!rigControllerPtr->initError.isEmpty()) { splashStr+=rigControllerPtr->initError.rightJustified(25,' ')+"\n"; splashPtr->showMessage(splashStr ,Qt::AlignLeft,Qt::white); } startTimer(1000); if(fileWatcherPtr==NULL) fileWatcherPtr=new fileWatcher; fileWatcherPtr->init(); } void mainWindow::restartSound(bool inStartUp) { //first check if sound if(soundIOPtr!=NULL) { soundIOPtr->stopSoundThread(); delete soundIOPtr; soundIOPtr=NULL; } if(pulseSelected) soundIOPtr=new soundPulse; else soundIOPtr=new soundAlsa; if(!soundIOPtr->init(BASESAMPLERATE)) { if(inStartUp) { splashStr+=QString("Soundcard error: %1").arg(soundIOPtr->getLastError()).rightJustified(25,' ')+"\n";; splashPtr->showMessage(splashStr ,Qt::AlignLeft,Qt::white); } else { QMessageBox::critical(this, tr("Soundcard error"),soundIOPtr->getLastError()); } } soundIOPtr->start(); } void mainWindow::startRunning() { dispatcherPtr->startRX(); } void mainWindow::readSettings() { QSettings qSettings; qSettings.beginGroup("MAIN"); int windowWidth = qSettings.value("windowWidth", 460 ).toInt(); int windowHeight = qSettings.value("windowHeight", 530 ).toInt(); int windowX = qSettings.value( "windowX", -1 ).toInt(); int windowY = qSettings.value( "windowY", -1 ).toInt(); resize( windowWidth, windowHeight ); if ( windowX != -1 || windowY != -1 ) { move( windowX, windowY ); } transmissionModeIndex=(etransmissionMode)qSettings.value("transmissionModeIndex",0).toInt(); qSettings.endGroup(); ui->spectrumFrame->readSettings(); // configDialogPtr->readSettings(); logFilePtr->readSettings(); } void mainWindow::writeSettings() { QSettings qSettings; qSettings.beginGroup("MAIN"); qSettings.setValue( "windowWidth", width() ); qSettings.setValue( "windowHeight", height() ); qSettings.setValue( "windowX", x() ); qSettings.setValue( "windowY", y() ); qSettings.setValue("transmissionModeIndex",(int)transmissionModeIndex); logFilePtr->writeSettings(); galleryWidgetPtr->writeSettings(); rxWidgetPtr->writeSettings(); txWidgetPtr->writeSettings(); configDialogPtr->writeSettings(); logFilePtr->writeSettings(); qSettings.endGroup(); ui->spectrumFrame->writeSettings(); } /** *\todo fontselection */ void mainWindow::setNewFont() { // QFont fnt; // fnt.fromString(fontString); // setFont(fnt); // galMW->setFont(fnt); // rxMW->setFont(fnt); // txMW->setFont(fnt); } void mainWindow::slotSaveWaterfallImage() { QImage *wf = ui->spectrumFrame->getImage(); if (wf) { double freq=0; QDateTime now=QDateTime::currentDateTime(); QString fn="waterfall-"+now.toString("yyyyMMddhhmmss")+".jpg"; QImage im(wf->width()+2, wf->height()+22, QImage::Format_RGB32); QPainter p(&im); im.fill(Qt::black); p.setPen(Qt::lightGray); p.drawImage(2,20,*wf); p.drawRect(0,0,wf->width()+1,wf->height()+21); //TODO: rig frequency etc rigControllerPtr->getFrequency(freq); if (freq>0) p.drawText(1,15, QString("%1 MHz").arg(freq/1000000.0,1,'f',6)); else p.drawText(1,15, "no freq"); if (im.save(fn, "jpg")) { statusBarPtr->showMessage("Saved "+fn); } else { statusBarPtr->showMessage("Error saving image"); } delete wf; } } void mainWindow::slotExit() { int exit; exit=QMessageBox::information(this, tr("Quit..."),tr("Do you really want to quit QSSTV?"), QMessageBox::Ok, QMessageBox::Cancel); if(exit==QMessageBox::Ok) { statusBarPtr->showMessage("Cleaning up..."); dispatcherPtr->idleAll(); dispatcherPtr->setOnlineStatus(false); rxWidgetPtr->functionsPtr()->stopThread(); txWidgetPtr->functionsPtr()->stopThread(); if(soundIOPtr) soundIOPtr->stopSoundThread(); writeSettings(); QApplication::quit(); } } void mainWindow::closeEvent ( QCloseEvent *e ) { slotExit(); e->ignore(); } void mainWindow::slotConfigure() { if(configDialogPtr->exec()==QDialog::Accepted) { if(configDialogPtr->soundNeedsRestart) { restartSound(false); } dispatcherPtr->init(); } } void mainWindow::slotLogSettings() { logFilePtr->maskSelect(this); } void mainWindow::slotResetLog() { logFilePtr->reset(); } void mainWindow::slotDocumentation() { QDesktopServices::openUrl(docURL); } void mainWindow::slotAboutQSSTV() { QString temp=tr("QSSTV\nVersion: ") + MAJORVERSION + MINORVERSION; temp += "\n http://users.telenet.be/on4qz \n(c) 2000-2016 -- Johan Maes - ON4QZ\n HAMDRM Software based on RX/TXAMADRM\n from PA0MBO"; QMessageBox::about(this,tr("About..."),temp); } void mainWindow::slotAboutQt() { QMessageBox::aboutQt(this,tr("About...")); } void mainWindow::setPTT(bool p) { if(p) pttIcon->setPixmap(*redPXMPtr); else pttIcon->setPixmap(*greenPXMPtr); } void mainWindow::setSSTVDRMPushButton(bool inDRM) { int i; QString modeStr; bsrPushButton->setEnabled(inDRM); freqComboBox->clear(); if(inDRM) modeStr="DRM"; else modeStr="SSTV"; modModeList.clear(); for(i=0;iaddItem(freqList.at(i)); modModeList.append(sbModeList.at(i)); } } } void mainWindow::slotCalibrate() { calibration calib(this); if(calib.exec()==QDialog::Accepted) { rxClock=calib.getRXClock(); txClock=calib.getTXClock(); } writeSettings(); } void mainWindow::slotModeChange(int rxtxMode) { txWidgetPtr->changeTransmissionMode(rxtxMode); rxWidgetPtr->changeTransmissionMode(rxtxMode); lastReceivedCall.clear(); } void mainWindow::slotSendBSR() { txWidgetPtr->sendBSR(); } void mainWindow::slotSendWFID() { txWidgetPtr->sendWFID(); } void mainWindow::slotSendCWID() { txWidgetPtr->sendCWID(); } void mainWindow::slotSendWfText() { txWidgetPtr->sendWfText(); } void mainWindow::slotSetFrequency(int freqIndex) { QByteArray ba; QString freqStr,mode; freqStr=freqComboBox->itemText(freqIndex); mode=modModeList.at(freqIndex); if(freqStr.isEmpty()) return; double fr=freqStr.toDouble()*1000000.; rigControllerPtr->setFrequency(fr); rigControllerPtr->setMode(mode); QString s=additionalCommand; //FEF7AE01A060101FD if(!s.isEmpty() && !rigControllerPtr->params()->enableXMLRPC) { if(hexFromString(s,ba,additionalCommandHex)) { rigControllerPtr->rawCommand(ba); } else { QMessageBox::critical(this,"Cat Error","Advanced command invalid"); } } } void mainWindow::timerEvent(QTimerEvent *) { double fr; if(rigControllerPtr->getFrequency(fr)) { fr/=1000000.; if(fr>1) freqDisplay->setText(QString::number(fr,'f',6)); } } void mainWindow::cleanUpCache(QString dirPath) { int i,j; bool found; QFileInfoList orgFileList; QFileInfoList cacheFileList; QFileInfoList removeFileList; QDir dirOrg(dirPath); dirOrg.setFilter(QDir::Files | QDir::NoSymLinks); orgFileList = dirOrg.entryInfoList(); // get a orgiriginal filelist QDir dirCache(dirPath+"/cache"); dirCache.setFilter(QDir::Files | QDir::NoSymLinks); cacheFileList = dirCache.entryInfoList(); // get a orgiriginal filelist for(i=0;isetWindowState(Qt::WindowMaximized); } else { this->setWindowState(Qt::WindowFullScreen); } } #ifndef QT_NO_DEBUG void mainWindow::slotShowDataScope() { scopeViewerData->show(true,true,true,true); } void mainWindow::slotShowSyncScopeNarrow() { scopeViewerSyncNarrow->show(true,true,true,true); } void mainWindow::slotShowSyncScopeWide() { scopeViewerSyncWide->show(true,true,true,true); } void mainWindow::slotScopeOffset() { dataScopeOffset=rxWidgetPtr->functionsPtr()->setOffset(dataScopeOffset,true); } void mainWindow::slotDumpSamplesPerLine() { dumpSamplesPerLine(); } void mainWindow::slotClearScope() { scopeViewerData->clear(); scopeViewerSyncNarrow->clear(); scopeViewerSyncWide->clear(); } void mainWindow::slotTxTestPattern() { etpSelect sel; testPatternSelection tpsel; if(tpsel.exec()==QDialog::Accepted) { sel=tpsel.getSelection(); txWidgetPtr->txTestPattern(sel); } } #endif qsstv_9.2.6/qsstv/mainwindow.h0000664000175000017500000000326213203343610015135 0ustar jomajoma#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include class configDialog; class spectrumWidget; namespace Ui { class MainWindow; } class mainWindow : public QMainWindow { Q_OBJECT public: explicit mainWindow(QWidget *parent = 0); ~mainWindow(); void init(); void startRunning(); void setNewFont(); void setPTT(bool p); void setSSTVDRMPushButton(bool inDRM); spectrumWidget *spectrumFramePtr; private slots: void slotConfigure(); void slotSaveWaterfallImage(); void slotExit(); void slotResetLog(); void slotLogSettings(); void slotAboutQt(); void slotAboutQSSTV(); void slotFullScreen(); void slotDocumentation(); void slotCalibrate(); void slotModeChange(int); void slotSendWFID(); void slotSendCWID(); void slotSendBSR(); void slotSendWfText(); void slotSetFrequency(int freqIndex); #ifndef QT_NO_DEBUG void slotShowDataScope(); void slotShowSyncScopeNarrow(); void slotShowSyncScopeWide(); void slotScopeOffset(); void slotClearScope(); void slotDumpSamplesPerLine(); void slotTxTestPattern(); #endif private: Ui::MainWindow *ui; void closeEvent ( QCloseEvent *e ); void readSettings(); void writeSettings(); void restartSound(bool inStartUp); void cleanUpCache(QString dirPath); QComboBox *transmissionModeComboBox; QPushButton *wfTextPushButton; QPushButton *fixPushButton; QPushButton *bsrPushButton; QPushButton *idPushButton; QPushButton *cwPushButton; QComboBox *freqComboBox; QLabel pttText; QLabel *pttIcon; QLabel *freqDisplay; void timerEvent(QTimerEvent *); QStringList modModeList; }; #endif // MAINWINDOW_H qsstv_9.2.6/qsstv/mainwindow.ui0000664000175000017500000002277013203343610015330 0ustar jomajoma MainWindow 0 0 831 566 8 50 false false MainWindow QTabWidget::Rounded 0 0 0 0 0 50 false false QTabWidget::Rounded 0 50 false Receive 1 1 1 1 1 Transmit 1 1 1 1 1 Gallery 1 1 1 1 1 0 0 160 0 180 16777215 QFrame::StyledPanel QFrame::Raised 0 0 831 18 50 false File Options Help Scope 0 0 16777215 16777215 Exit Configuration Dump Samples Per Line Calibrate Show Data Scope Log Settings Reset Log About QSSTV About Qt Users Guide Show Sync Scope Narrow Scope Offset Show Sync Scope Wide TX Test Pattern Clear true &Full Screen Qt::WidgetShortcut false Save Waterfall Image rxWidget QWidget
rxwidget.h
1
txWidget QWidget
txwidget.h
1
galleryWidget QWidget
gallerywidget.h
1
spectrumWidget QFrame
spectrumwidget.h
1
qsstv_9.2.6/qsstv/qsstv.pro0000664000175000017500000003741513203343610014521 0ustar jomajoma#------------------------------------------------- # # Project created by QtCreator 2014-08-10T15:28:21 # #------------------------------------------------- QT += core gui xml network #multimedia multimediawidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CXXFLAGS_DEBUG += -O0 QMAKE_CXXFLAGS_RELEASE-= -O2 QMAKE_CXXFLAGS_RELEASE += -O3 TARGET = qsstv TEMPLATE = app INCLUDEPATH += config utils sound widgets dsp dispatch logbook mainwidgets rig sstv videocapt drmrx drmtx xmlrpc CONFIG += link_pkgconfig PKGCONFIG += libopenjp2 SOURCES += main.cpp\ mainwindow.cpp \ config/baseconfig.cpp \ config/soundconfig.cpp \ utils/dirdialog.cpp \ utils/logging.cpp \ utils/loggingparams.cpp \ appglobal.cpp \ utils/supportfunctions.cpp \ sound/wavio.cpp \ config/directoriesconfig.cpp \ config/configdialog.cpp \ sound/soundbase.cpp \ sound/soundpulse.cpp \ widgets/spectrumwidget.cpp \ widgets/vumeter.cpp \ widgets/fftdisplay.cpp \ widgets/markerwidget.cpp \ dsp/downsamplefilter.cpp \ utils/arraydumper.cpp \ sound/soundalsa.cpp \ sound/calibration.cpp \ dsp/synthes.cpp \ dsp/filterparam.cpp \ sound/waterfalltext.cpp \ utils/macroexpansion.cpp \ widgets/imageviewer.cpp \ editor/editor.cpp \ editor/editorscene.cpp \ editor/editorview.cpp \ editor/gradientdialog.cpp \ editor/graphicitems.cpp \ widgets/textdisplay.cpp \ dispatch/dispatcher.cpp \ drmrx/bits2bytes.cpp \ drmrx/channeldecode.cpp \ drmrx/crc16_bytewise.cpp \ drmrx/crc8_c.cpp \ drmrx/deinterleaver.cpp \ drmrx/demodulator.cpp \ drmrx/drm.cpp \ drmrx/drmconstellationframe.cpp \ drmrx/drmpsdframe.cpp \ drmrx/drmrx.cpp \ drmrx/drmstatusframe.cpp \ drmrx/filter1.cpp \ drmrx/filter1c.cpp \ drmrx/fixform.cpp \ drmrx/getfoffsint.cpp \ drmrx/getmode.cpp \ drmrx/getofdm.cpp \ drmrx/getofdmsync.cpp \ drmrx/getsymbolidx.cpp \ drmrx/lubksb.cpp \ drmrx/ludcmp.cpp \ drmrx/mkfacmap.cpp \ drmrx/mkmscmap.cpp \ drmrx/msdhardfac.cpp \ drmrx/msdhardmsc.cpp \ drmrx/newfft.cpp \ drmrx/nrutil.cpp \ drmrx/psdcmean.cpp \ drmrx/psdmean.cpp \ drmrx/sourcedecoder.cpp \ drmrx/viterbi_decode.cpp \ drmtx/common/datadecoding/DABMOT.cpp \ drmtx/common/datadecoding/DataDecoder.cpp \ drmtx/common/datadecoding/MOTSlideShow.cpp \ drmtx/common/FAC/FAC.cpp \ drmtx/common/interleaver/BlockInterleaver.cpp \ drmtx/common/interleaver/SymbolInterleaver.cpp \ drmtx/common/matlib/MatlibSigProToolbox.cpp \ drmtx/common/matlib/MatlibStdToolbox.cpp \ drmtx/common/mlc/BitInterleaver.cpp \ drmtx/common/mlc/ChannelCode.cpp \ drmtx/common/mlc/ConvEncoder.cpp \ drmtx/common/mlc/EnergyDispersal.cpp \ drmtx/common/mlc/MLC.cpp \ drmtx/common/mlc/QAMMapping.cpp \ drmtx/common/ofdmcellmapping/CellMappingTable.cpp \ drmtx/common/ofdmcellmapping/OFDMCellMapping.cpp \ drmtx/common/SDC/SDCTransmit.cpp \ drmtx/common/sourcedecoders/AudioSourceDecoder.cpp \ drmtx/common/tables/TableFAC.cpp \ drmtx/common/util/CRC.cpp \ drmtx/common/util/Utilities.cpp \ drmtx/common/csoundout.cpp \ drmtx/common/DataIO.cpp \ drmtx/common/DRMSignalIO.cpp \ drmtx/common/DrmTransmitter.cpp \ drmtx/common/OFDM.cpp \ drmtx/common/Parameter.cpp \ drmtx/bsrform.cpp \ drmtx/drmparams.cpp \ drmtx/drmtransmitter.cpp \ drmtx/drmtx.cpp \ logbook/logbook.cpp \ mainwidgets/gallerywidget.cpp \ mainwidgets/rxfunctions.cpp \ mainwidgets/rxwidget.cpp \ mainwidgets/txfunctions.cpp \ mainwidgets/txwidget.cpp \ rig/freqdisplay.cpp \ rig/rigcontrol.cpp \ sstv/modes/modeavt.cpp \ sstv/modes/modebase.cpp \ sstv/modes/modebw.cpp \ sstv/modes/modegbr.cpp \ sstv/modes/modegbr2.cpp \ sstv/modes/modepd.cpp \ sstv/modes/modergb.cpp \ sstv/modes/moderobot1.cpp \ sstv/modes/moderobot2.cpp \ sstv/cw.cpp \ sstv/sstvparam.cpp \ sstv/sstvrx.cpp \ sstv/sstvtx.cpp \ sstv/syncprocessor.cpp \ utils/qurlinfo.cpp \ utils/reedsolomoncoder.cpp \ utils/rs.cpp \ xmlrpc/ipcmessage.cpp \ xmlrpc/maiaFault.cpp \ xmlrpc/maiaObject.cpp \ xmlrpc/maiaXmlRpcClient.cpp \ xmlrpc/maiaXmlRpcServer.cpp \ xmlrpc/maiaXmlRpcServerConnection.cpp \ xmlrpc/xmlinterface.cpp \ config/operatorconfig.cpp \ widgets/extviewer.cpp \ config/guiconfig.cpp \ utils/ftp.cpp \ utils/qftp.cpp \ sound/resamplefilter.cpp \ widgets/imagematrix.cpp \ widgets/waterfallform.cpp \ config/rigconfig.cpp \ config/cwconfig.cpp \ config/drmprofileconfig.cpp \ config/ftpconfig.cpp \ config/hybridconfig.cpp \ config/repeaterconfig.cpp \ config/waterfallconfig.cpp \ utils/hybridcrypt.cpp \ videocapt/cameradialog.cpp \ videocapt/imagesettings.cpp \ videocapt/v4l2control.cpp \ videocapt/videocapture.cpp \ sstv/visfskid.cpp \ dsp/filters.cpp \ dsp/filter.cpp \ widgets/drmsegmentsview.cpp \ widgets/xyzplaintextedit.cpp \ utils/hexconvertor.cpp \ config/frequencyselectwidget.cpp \ editor/canvassizeform.cpp \ utils/fftcalc.cpp \ config/hybridnotifyconfig.cpp \ utils/jp2io.cpp \ utils/color.cpp \ widgets/testpatternselection.cpp \ utils/filewatcher.cpp HEADERS += mainwindow.h \ config/baseconfig.h \ config/configparams.h \ config/soundconfig.h \ utils/dirdialog.h \ utils/logging.h \ utils/loggingparams.h \ appglobal.h \ utils/supportfunctions.h \ utils/buffermanag.h \ sound/wavio.h \ config/directoriesconfig.h \ appdefs.h \ config/configdialog.h \ sound/soundbase.h \ sound/soundpulse.h \ widgets/spectrumwidget.h \ widgets/vumeter.h \ widgets/fftdisplay.h \ widgets/markerwidget.h \ dsp/downsamplefilter.h \ dsp/nco.h \ utils/macroexpansion.h \ utils/arraydumper.h \ sound/soundalsa.h \ sound/calibration.h \ dsp/synthes.h \ dsp/filterparam.h \ sound/waterfalltext.h \ utils/macroexpansion.h \ widgets/imageviewer.h \ editor/editor.h \ editor/editorscene.h \ editor/editorview.h \ editor/gradientdialog.h \ editor/graphicitems.h \ editor/qdialog_p.h \ widgets/textdisplay.h \ dispatch/dispatcher.h \ dispatch/dispatchevents.h \ drmrx/demodulator.h \ drmrx/drm.h \ drmrx/drmconstellationframe.h \ drmrx/drmdefs.h \ drmrx/drmproto.h \ drmrx/drmpsdframe.h \ drmrx/drmrx.h \ drmrx/drmstatusframe.h \ drmrx/fixform.h \ drmrx/mkmap.h \ drmrx/msd_hard.h \ drmrx/msd_hard_sdc.h \ drmrx/nrutil.h \ drmrx/resamplefilter.h \ drmrx/sourcedecoder.h \ drmrx/structtemplates.h \ drmrx/viterbi_decode.h \ drmtx/common/datadecoding/DABMOT.h \ drmtx/common/datadecoding/DataDecoder.h \ drmtx/common/datadecoding/MOTSlideShow.h \ drmtx/common/FAC/FAC.h \ drmtx/common/interleaver/BlockInterleaver.h \ drmtx/common/interleaver/SymbolInterleaver.h \ drmtx/common/matlib/Matlib.h \ drmtx/common/matlib/MatlibSigProToolbox.h \ drmtx/common/matlib/MatlibStdToolbox.h \ drmtx/common/mlc/BitInterleaver.h \ drmtx/common/mlc/ChannelCode.h \ drmtx/common/mlc/ConvEncoder.h \ drmtx/common/mlc/EnergyDispersal.h \ drmtx/common/mlc/MLC.h \ drmtx/common/mlc/QAMMapping.h \ drmtx/common/ofdmcellmapping/CellMappingTable.h \ drmtx/common/ofdmcellmapping/OFDMCellMapping.h \ drmtx/common/SDC/SDC.h \ drmtx/common/sourcedecoders/AudioSourceDecoder.h \ drmtx/common/tables/TableAMSS.h \ drmtx/common/tables/TableCarMap.h \ drmtx/common/tables/TableCarrier.h \ drmtx/common/tables/TableDRMGlobal.h \ drmtx/common/tables/TableFAC.h \ drmtx/common/tables/TableMLC.h \ drmtx/common/tables/TableQAMMapping.h \ drmtx/common/util/Buffer.h \ drmtx/common/util/CRC.h \ drmtx/common/util/Modul.h \ drmtx/common/util/Utilities.h \ drmtx/common/csoundout.h \ drmtx/common/DataIO.h \ drmtx/common/DRMSignalIO.h \ drmtx/common/DrmTransmitter.h \ drmtx/common/GlobalDefinitions.h \ drmtx/common/OFDM.h \ drmtx/common/Parameter.h \ drmtx/common/soundinterface.h \ drmtx/bsrform.h \ drmtx/config.h \ drmtx/drmparams.h \ drmtx/drmtransmitter.h \ drmtx/drmtx.h \ logbook/logbook.h \ mainwidgets/gallerywidget.h \ mainwidgets/rxfunctions.h \ mainwidgets/rxwidget.h \ mainwidgets/txfunctions.h \ mainwidgets/txwidget.h \ rig/freqdisplay.h \ rig/rigcontrol.h \ sstv/modes/modeavt.h \ sstv/modes/modebase.h \ sstv/modes/modebw.h \ sstv/modes/modegbr.h \ sstv/modes/modegbr2.h \ sstv/modes/modepd.h \ sstv/modes/modergb.h \ sstv/modes/moderobot1.h \ sstv/modes/moderobot2.h \ sstv/modes/modes.h \ sstv/cw.h \ sstv/sstvparam.h \ sstv/sstvrx.h \ sstv/sstvtx.h \ sstv/syncprocessor.h \ utils/qurlinfo.h \ utils/reedsolomoncoder.h \ utils/rs.h \ utils/vector.h \ xmlrpc/ipcmessage.h \ xmlrpc/maiaFault.h \ xmlrpc/maiaObject.h \ xmlrpc/maiaXmlRpcClient.h \ xmlrpc/maiaXmlRpcServer.h \ xmlrpc/maiaXmlRpcServerConnection.h \ xmlrpc/xmlinterface.h \ config/operatorconfig.h \ widgets/extviewer.h \ config/guiconfig.h \ utils/ftp.h \ utils/qftp.h \ sound/resamplefilter.h \ widgets/imagematrix.h \ widgets/waterfallform.h \ config/rigconfig.h \ config/cwconfig.h \ config/drmprofileconfig.h \ config/ftpconfig.h \ config/hybridconfig.h \ config/repeaterconfig.h \ config/waterfallconfig.h \ utils/hybridcrypt.h \ videocapt/cameradialog.h \ videocapt/imagesettings.h \ videocapt/v4l2control.h \ videocapt/videocapture.h \ sstv/visfskid.h \ dsp/filters.h \ dsp/filter.h \ widgets/drmsegmentsview.h \ widgets/xyzplaintextedit.h \ utils/hexconvertor.h \ config/frequencyselectwidget.h \ editor/canvassizeform.h \ utils/fftcalc.h \ config/hybridnotifyconfig.h \ utils/jp2io.h \ utils/color.h \ widgets/testpatternselection.h \ utils/filewatcher.h FORMS += mainwindow.ui \ config/guiconfig.ui \ config/soundconfig.ui \ utils/loggingform.ui \ config/directoriesconfig.ui \ config/configdialog.ui \ widgets/spectrumwidget.ui \ sound/calibration.ui \ editor/editorform.ui \ editor/gradientform.ui \ editor/textform.ui \ widgets/textdisplay.ui \ config/operatorconfig.ui \ drmrx/drmconstellationframe.ui \ drmrx/drmpsdframe.ui \ drmrx/drmstatusframe.ui \ widgets/extviewer.ui \ widgets/sweepform.ui \ widgets/waterfallform.ui \ config/rigconfig.ui \ config/cwconfig.ui \ config/drmprofileconfig.ui \ config/ftpconfig.ui \ config/hybridconfig.ui \ config/repeaterconfig.ui \ config/waterfallconfig.ui \ drmtx/bsrform.ui \ mainwidgets/gallerywidget.ui \ mainwidgets/rxwidget.ui \ mainwidgets/txwidget.ui \ widgets/freqform.ui \ rig/freqdisplay.ui \ videocapt/cameradialog.ui \ videocapt/imagesettings.ui \ widgets/drmsegmentsview.ui \ drmrx/fixform.ui \ config/frequencyselectwidget.ui \ editor/canvassizeform.ui \ config/hybridnotifyconfig.ui \ widgets/testpatternselection.ui LIBS += -lasound \ -lpulse \ -lpulse-simple \ -lfftw3f \ -lfftw3 \ -lhamlib \ -lv4l2 \ -lv4lconvert \ -lrt OTHER_FILES += \ icons/fileopen.png \ icons/filesave.png \ icons/mgc.raw \ icons/mgc2.raw \ icons/arrow.png \ icons/camera.png \ icons/colorfill.png \ icons/colorline.png \ icons/colorpicker.png \ icons/colorselector.png \ icons/doubleleft.png \ icons/doubleright.png \ icons/doubletone.png \ icons/edit.png \ icons/eraser.png \ icons/fcircle.png \ icons/filenew.png \ icons/frect.png \ icons/gradient.png \ icons/image.png \ icons/left.png \ icons/line.png \ icons/qsstv.png \ icons/qsstvsplash.png \ icons/replay.png \ icons/start.png \ icons/stop.png \ icons/sweep.png \ icons/text.png \ icons/tone.png \ icons/transparency.png \ icons/whatsthis.png \ documentation/manual/qsstv.css \ documentation/manual/images/rxdrm_segments.png \ documentation/manual/images/hybrid_dis_checkbox.png \ documentation/manual/images/hybrid_checkbox.png \ documentation/manual/images/statusleds.png \ documentation/manual/images/txdrm_compression.png \ documentation/manual/images/rxdrm_constellation.png \ documentation/manual/images/statusbar.png \ documentation/manual/images/wf_bsr_id.png \ documentation/manual/images/bsr_nfy.png \ documentation/manual/images/rxdrm_status.png \ documentation/manual/images/txdrm_status.png \ documentation/manual/images/config.png \ documentation/manual/images/calibration.png \ documentation/manual/images/sstvdrmselect.png \ documentation/manual/images/wftextpopup.png \ documentation/manual/images/txdrm_options.png \ documentation/manual/images/editor_1.png \ documentation/manual/images/bsr_select.png \ documentation/manual/images/config9.png \ documentation/manual/images/cqrlog1.png \ documentation/manual/images/config5.png \ documentation/manual/images/config1.png \ documentation/manual/images/config8.png \ documentation/manual/images/config11.png \ documentation/manual/images/flrig1.png \ documentation/manual/images/editor_2.png \ documentation/manual/images/config6.png \ documentation/manual/images/config3.png \ documentation/manual/images/fix.png \ documentation/manual/images/config2.png \ documentation/manual/images/config10.png \ documentation/manual/images/config7.png \ documentation/manual/images/config4.png \ documentation/manual/images/cqrlog2.png \ documentation/manual/images/Gallery_template.png \ documentation/manual/images/editor_3.png \ documentation/manual/images/waterfall.png \ documentation/manual/images/receivedrm.png \ documentation/manual/images/Gallery_tx.png \ documentation/manual/images/transmitdrm.png \ documentation/manual/images/tx-with-template.png \ documentation/manual/images/Gallery_rx.png \ documentation/manual/manual.txt \ documentation/manual/manual.doxy \ documentation/manual/images/txwidget1.png \ documentation/manual/images/rxwidget1.png \ icons/binary.png \ documentation/manual/images/Gallery_image_options.png \ documentation/manual/images/eraser.png \ documentation/manual/images/refreshbutton.png \ documentation/manual/images/config12.png \ documentation/manual/images/binary.png \ documentation/manual/images/vk4aes.jpg \ documentation/manual/images/multiline.png \ documentation/manual/images/entertext.png \ ../COPYING \ ../README.txt \ documentation/manual/images/editor_image_size.png \ documentation/manual/images/Gallery_templates.png \ documentation/manual/images/Gallery_txdrm.png CONFIG(debug ,debug|release){ message(added debugging) SOURCES += scope/scopeoffset.cpp \ scope/scopeview.cpp \ scope/scopeplot.cpp HEADERS += scope/scopeoffset.h \ scope/scopeview.h \ scope/scopeplot.h FORMS += scope/scopeoffset.ui \ scope/plotform.ui INCLUDEPATH += ../qwt LIBS += ../qwt/libqwt.a } CONFIG(debug ,debug|release){ dox.commands = cd $$PWD/documentation/manual ;doxygen manual.doxy; dox.depends= FORCE PRE_TARGETDEPS += dox message(dox will be generated) } dox.path=/usr/share/doc/$$TARGET dox.files= $$PWD/manual/* QMAKE_EXTRA_TARGETS += dox RESOURCES += \ qsstv.qrc target.path = /usr/bin INSTALLS += target dox qsstv_9.2.6/qsstv/qsstv.qrc0000664000175000017500000000235713203343610014503 0ustar jomajoma icons/fileopen.png icons/filesave.png icons/text.png icons/image.png icons/fcircle.png icons/frect.png icons/arrow.png icons/colorpicker.png icons/replay.png icons/qsstv.png icons/transparency.png icons/start.png icons/camera.png icons/tone.png icons/stop.png icons/edit.png icons/doubletone.png icons/sweep.png icons/qsstvsplash.png icons/colorfill.png icons/colorselector.png icons/eraser.png icons/filenew.png icons/gradient.png icons/colorline.png icons/left.png icons/doubleleft.png icons/doubleright.png icons/binary.png icons/down.png icons/up.png qsstv_9.2.6/qwt/qwt_plot_spectrocurve.h0000664000175000017500000000414113203343610017066 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_3D_H #define QWT_PLOT_CURVE_3D_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" class QwtSymbol; class QwtColorMap; /*! \brief Curve that displays 3D points as dots, where the z coordinate is mapped to a color. */ class QWT_EXPORT QwtPlotSpectroCurve: public QwtPlotSeriesItem, QwtSeriesStore { public: //! Paint attributes enum PaintAttribute { //! Clip points outside the canvas rectangle ClipPoints = 1 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotSpectroCurve( const QString &title = QString::null ); explicit QwtPlotSpectroCurve( const QwtText &title ); virtual ~QwtPlotSpectroCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setColorMap( QwtColorMap * ); const QwtColorMap *colorMap() const; void setColorRange( const QwtInterval & ); QwtInterval & colorRange() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void setPenWidth(double width); double penWidth() const; protected: virtual void drawDots( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; private: void init(); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotSpectroCurve::PaintAttributes ) #endif qsstv_9.2.6/qwt/qwt_plot_spectrogram.cpp0000664000175000017500000004127513203343610017234 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_spectrogram.h" #include "qwt_painter.h" #include "qwt_interval.h" #include "qwt_scale_map.h" #include "qwt_color_map.h" #include #include #include #include #include #if QT_VERSION >= 0x040400 #include #include #include #endif class QwtPlotSpectrogram::PrivateData { public: PrivateData(): data( NULL ) { colorMap = new QwtLinearColorMap(); displayMode = ImageMode; conrecFlags = QwtRasterData::IgnoreAllVerticesOnLevel; #if 0 conrecFlags |= QwtRasterData::IgnoreOutOfRange; #endif } ~PrivateData() { delete data; delete colorMap; } QwtRasterData *data; QwtColorMap *colorMap; DisplayModes displayMode; QList contourLevels; QPen defaultContourPen; QwtRasterData::ConrecFlags conrecFlags; }; /*! Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false The z value is initialized by 8.0. \param title Title \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotSpectrogram::QwtPlotSpectrogram( const QString &title ): QwtPlotRasterItem( title ) { d_data = new PrivateData(); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 8.0 ); } //! Destructor QwtPlotSpectrogram::~QwtPlotSpectrogram() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotSpectrogram int QwtPlotSpectrogram::rtti() const { return QwtPlotItem::Rtti_PlotSpectrogram; } /*! The display mode controls how the raster data will be represented. \param mode Display mode \param on On/Off The default setting enables ImageMode. \sa DisplayMode, displayMode() */ void QwtPlotSpectrogram::setDisplayMode( DisplayMode mode, bool on ) { if ( on != bool( mode & d_data->displayMode ) ) { if ( on ) d_data->displayMode |= mode; else d_data->displayMode &= ~mode; } legendChanged(); itemChanged(); } /*! The display mode controls how the raster data will be represented. \param mode Display mode \return true if mode is enabled */ bool QwtPlotSpectrogram::testDisplayMode( DisplayMode mode ) const { return ( d_data->displayMode & mode ); } /*! Change the color map Often it is useful to display the mapping between intensities and colors as an additional plot axis, showing a color bar. \param colorMap Color Map \sa colorMap(), QwtScaleWidget::setColorBarEnabled(), QwtScaleWidget::setColorMap() */ void QwtPlotSpectrogram::setColorMap( QwtColorMap *colorMap ) { if ( d_data->colorMap != colorMap ) { delete d_data->colorMap; d_data->colorMap = colorMap; } invalidateCache(); legendChanged(); itemChanged(); } /*! \return Color Map used for mapping the intensity values to colors \sa setColorMap() */ const QwtColorMap *QwtPlotSpectrogram::colorMap() const { return d_data->colorMap; } /*! Build and assign the default pen for the contour lines In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotSpectrogram::setDefaultContourPen( const QColor &color, qreal width, Qt::PenStyle style ) { setDefaultContourPen( QPen( color, width, style ) ); } /*! \brief Set the default pen for the contour lines If the spectrogram has a valid default contour pen a contour line is painted using the default contour pen. Otherwise (pen.style() == Qt::NoPen) the pen is calculated for each contour level using contourPen(). \sa defaultContourPen(), contourPen() */ void QwtPlotSpectrogram::setDefaultContourPen( const QPen &pen ) { if ( pen != d_data->defaultContourPen ) { d_data->defaultContourPen = pen; legendChanged(); itemChanged(); } } /*! \return Default contour pen \sa setDefaultContourPen() */ QPen QwtPlotSpectrogram::defaultContourPen() const { return d_data->defaultContourPen; } /*! \brief Calculate the pen for a contour line The color of the pen is the color for level calculated by the color map \param level Contour level \return Pen for the contour line \note contourPen is only used if defaultContourPen().style() == Qt::NoPen \sa setDefaultContourPen(), setColorMap(), setContourLevels() */ QPen QwtPlotSpectrogram::contourPen( double level ) const { if ( d_data->data == NULL || d_data->colorMap == NULL ) return QPen(); const QwtInterval intensityRange = d_data->data->interval(Qt::ZAxis); const QColor c( d_data->colorMap->rgb( intensityRange, level ) ); return QPen( c ); } /*! Modify an attribute of the CONREC algorithm, used to calculate the contour lines. \param flag CONREC flag \param on On/Off \sa testConrecFlag(), renderContourLines(), QwtRasterData::contourLines() */ void QwtPlotSpectrogram::setConrecFlag( QwtRasterData::ConrecFlag flag, bool on ) { if ( bool( d_data->conrecFlags & flag ) == on ) return; if ( on ) d_data->conrecFlags |= flag; else d_data->conrecFlags &= ~flag; itemChanged(); } /*! Test an attribute of the CONREC algorithm, used to calculate the contour lines. \param flag CONREC flag \return true, is enabled The default setting enables QwtRasterData::IgnoreAllVerticesOnLevel \sa setConrecClag(), renderContourLines(), QwtRasterData::contourLines() */ bool QwtPlotSpectrogram::testConrecFlag( QwtRasterData::ConrecFlag flag ) const { return d_data->conrecFlags & flag; } /*! Set the levels of the contour lines \param levels Values of the contour levels \sa contourLevels(), renderContourLines(), QwtRasterData::contourLines() \note contourLevels returns the same levels but sorted. */ void QwtPlotSpectrogram::setContourLevels( const QList &levels ) { d_data->contourLevels = levels; qSort( d_data->contourLevels ); legendChanged(); itemChanged(); } /*! \return Levels of the contour lines. The levels are sorted in increasing order. \sa contourLevels(), renderContourLines(), QwtRasterData::contourLines() */ QList QwtPlotSpectrogram::contourLevels() const { return d_data->contourLevels; } /*! Set the data to be displayed \param data Spectrogram Data \sa data() */ void QwtPlotSpectrogram::setData( QwtRasterData *data ) { if ( data != d_data->data ) { delete d_data->data; d_data->data = data; invalidateCache(); itemChanged(); } } /*! \return Spectrogram data \sa setData() */ const QwtRasterData *QwtPlotSpectrogram::data() const { return d_data->data; } /*! \return Spectrogram data \sa setData() */ QwtRasterData *QwtPlotSpectrogram::data() { return d_data->data; } /*! \return Bounding interval for an axis The default implementation returns the interval of the associated raster data object. \param axis X, Y, or Z axis \sa QwtRasterData::interval() */ QwtInterval QwtPlotSpectrogram::interval(Qt::Axis axis) const { if ( d_data->data == NULL ) return QwtInterval(); return d_data->data->interval( axis ); } /*! \brief Pixel hint The geometry of a pixel is used to calculated the resolution and alignment of the rendered image. The default implementation returns data()->pixelHint( rect ); \param area In most implementations the resolution of the data doesn't depend on the requested area. \return Bounding rectangle of a pixel \sa QwtPlotRasterItem::pixelHint(), QwtRasterData::pixelHint(), render(), renderImage() */ QRectF QwtPlotSpectrogram::pixelHint( const QRectF &area ) const { if ( d_data->data == NULL ) return QRectF(); return d_data->data->pixelHint( area ); } /*! \brief Render an image from data and color map. For each pixel of area the value is mapped into a color. \param xMap X-Scale Map \param yMap Y-Scale Map \param area Requested area for the image in scale coordinates \param imageSize Size of the requested image \return A QImage::Format_Indexed8 or QImage::Format_ARGB32 depending on the color map. \sa QwtRasterData::value(), QwtColorMap::rgb(), QwtColorMap::colorIndex() */ QImage QwtPlotSpectrogram::renderImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &area, const QSize &imageSize ) const { if ( imageSize.isEmpty() || d_data->data == NULL || d_data->colorMap == NULL ) { return QImage(); } const QwtInterval intensityRange = d_data->data->interval( Qt::ZAxis ); if ( !intensityRange.isValid() ) return QImage(); QImage::Format format = ( d_data->colorMap->format() == QwtColorMap::RGB ) ? QImage::Format_ARGB32 : QImage::Format_Indexed8; QImage image( imageSize, format ); if ( d_data->colorMap->format() == QwtColorMap::Indexed ) image.setColorTable( d_data->colorMap->colorTable( intensityRange ) ); d_data->data->initRaster( area, image.size() ); #if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE) uint numThreads = renderThreadCount(); if ( numThreads <= 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; const int numRows = imageSize.height() / numThreads; QList< QFuture > futures; for ( uint i = 0; i < numThreads; i++ ) { QRect tile( 0, i * numRows, image.width(), numRows ); if ( i == numThreads - 1 ) { tile.setHeight( image.height() - i * numRows ); renderTile( xMap, yMap, tile, &image ); } else { futures += QtConcurrent::run( this, &QwtPlotSpectrogram::renderTile, xMap, yMap, tile, &image ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else // QT_VERSION < 0x040400 const QRect tile( 0, 0, image.width(), image.height() ); renderTile( xMap, yMap, tile, &image ); #endif d_data->data->discardRaster(); return image; } /*! \brief Render a tile of an image. Rendering in tiles can be used to composite an image in parallel threads. \param xMap X-Scale Map \param yMap Y-Scale Map \param tile Geometry of the tile in image coordinates \param image Image to be rendered */ void QwtPlotSpectrogram::renderTile( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &tile, QImage *image ) const { const QwtInterval range = d_data->data->interval( Qt::ZAxis ); if ( !range.isValid() ) return; if ( d_data->colorMap->format() == QwtColorMap::RGB ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); QRgb *line = reinterpret_cast( image->scanLine( y ) ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->rgb( range, d_data->data->value( tx, ty ) ); } } } else if ( d_data->colorMap->format() == QwtColorMap::Indexed ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); unsigned char *line = image->scanLine( y ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->colorIndex( range, d_data->data->value( tx, ty ) ); } } } } /*! \brief Return the raster to be used by the CONREC contour algorithm. A larger size will improve the precision of the CONREC algorithm, but will slow down the time that is needed to calculate the lines. The default implementation returns rect.size() / 2 bounded to the resolution depending on pixelSize(). \param area Rectangle, where to calculate the contour lines \param rect Rectangle in pixel coordinates, where to paint the contour lines \return Raster to be used by the CONREC contour algorithm. \note The size will be bounded to rect.size(). \sa drawContourLines(), QwtRasterData::contourLines() */ QSize QwtPlotSpectrogram::contourRasterSize( const QRectF &area, const QRect &rect ) const { QSize raster = rect.size() / 2; const QRectF pixelRect = pixelHint( area ); if ( !pixelRect.isEmpty() ) { const QSize res( qCeil( rect.width() / pixelRect.width() ), qCeil( rect.height() / pixelRect.height() ) ); raster = raster.boundedTo( res ); } return raster; } /*! Calculate contour lines \param rect Rectangle, where to calculate the contour lines \param raster Raster, used by the CONREC algorithm \return Calculated contour lines \sa contourLevels(), setConrecFlag(), QwtRasterData::contourLines() */ QwtRasterData::ContourLines QwtPlotSpectrogram::renderContourLines( const QRectF &rect, const QSize &raster ) const { if ( d_data->data == NULL ) return QwtRasterData::ContourLines(); return d_data->data->contourLines( rect, raster, d_data->contourLevels, d_data->conrecFlags ); } /*! Paint the contour lines \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param contourLines Contour lines \sa renderContourLines(), defaultContourPen(), contourPen() */ void QwtPlotSpectrogram::drawContourLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtRasterData::ContourLines &contourLines ) const { if ( d_data->data == NULL ) return; const int numLevels = d_data->contourLevels.size(); for ( int l = 0; l < numLevels; l++ ) { const double level = d_data->contourLevels[l]; QPen pen = defaultContourPen(); if ( pen.style() == Qt::NoPen ) pen = contourPen( level ); if ( pen.style() == Qt::NoPen ) continue; painter->setPen( pen ); const QPolygonF &lines = contourLines[level]; for ( int i = 0; i < lines.size(); i += 2 ) { const QPointF p1( xMap.transform( lines[i].x() ), yMap.transform( lines[i].y() ) ); const QPointF p2( xMap.transform( lines[i+1].x() ), yMap.transform( lines[i+1].y() ) ); QwtPainter::drawLine( painter, p1, p2 ); } } } /*! \brief Draw the spectrogram \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \sa setDisplayMode(), renderImage(), QwtPlotRasterItem::draw(), drawContourLines() */ void QwtPlotSpectrogram::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( d_data->displayMode & ImageMode ) QwtPlotRasterItem::draw( painter, xMap, yMap, canvasRect ); if ( d_data->displayMode & ContourMode ) { // Add some pixels at the borders const int margin = 2; QRectF rasterRect( canvasRect.x() - margin, canvasRect.y() - margin, canvasRect.width() + 2 * margin, canvasRect.height() + 2 * margin ); QRectF area = QwtScaleMap::invTransform( xMap, yMap, rasterRect ); const QRectF br = boundingRect(); if ( br.isValid() ) { area &= br; if ( area.isEmpty() ) return; rasterRect = QwtScaleMap::transform( xMap, yMap, area ); } QSize raster = contourRasterSize( area, rasterRect.toRect() ); raster = raster.boundedTo( rasterRect.toRect().size() ); if ( raster.isValid() ) { const QwtRasterData::ContourLines lines = renderContourLines( area, raster ); drawContourLines( painter, xMap, yMap, lines ); } } } qsstv_9.2.6/qwt/qwt_plot_spectrogram.h0000664000175000017500000000702313203343610016672 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SPECTROGRAM_H #define QWT_PLOT_SPECTROGRAM_H #include "qwt_global.h" #include "qwt_raster_data.h" #include "qwt_plot_rasteritem.h" #include class QwtColorMap; /*! \brief A plot item, which displays a spectrogram A spectrogram displays 3-dimensional data, where the 3rd dimension ( the intensity ) is displayed using colors. The colors are calculated from the values using a color map. On multi-core systems the performance of the image composition can often be improved by dividing the area into tiles - each of them rendered in a different thread ( see QwtPlotItem::setRenderThreadCount() ). In ContourMode contour lines are painted for the contour levels. \image html spectrogram3.png \sa QwtRasterData, QwtColorMap, QwtPlotItem::setRenderThreadCount() */ class QWT_EXPORT QwtPlotSpectrogram: public QwtPlotRasterItem { public: /*! The display mode controls how the raster data will be represented. \sa setDisplayMode(), testDisplayMode() */ enum DisplayMode { //! The values are mapped to colors using a color map. ImageMode = 0x01, //! The data is displayed using contour lines ContourMode = 0x02 }; //! Display modes typedef QFlags DisplayModes; explicit QwtPlotSpectrogram( const QString &title = QString::null ); virtual ~QwtPlotSpectrogram(); void setDisplayMode( DisplayMode, bool on = true ); bool testDisplayMode( DisplayMode ) const; void setData( QwtRasterData *data ); const QwtRasterData *data() const; QwtRasterData *data(); void setColorMap( QwtColorMap * ); const QwtColorMap *colorMap() const; virtual QwtInterval interval(Qt::Axis) const; virtual QRectF pixelHint( const QRectF & ) const; void setDefaultContourPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setDefaultContourPen( const QPen & ); QPen defaultContourPen() const; virtual QPen contourPen( double level ) const; void setConrecFlag( QwtRasterData::ConrecFlag, bool on ); bool testConrecFlag( QwtRasterData::ConrecFlag ) const; void setContourLevels( const QList & ); QList contourLevels() const; virtual int rtti() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; protected: virtual QImage renderImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &area, const QSize &imageSize ) const; virtual QSize contourRasterSize( const QRectF &, const QRect & ) const; virtual QwtRasterData::ContourLines renderContourLines( const QRectF &rect, const QSize &raster ) const; virtual void drawContourLines( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtRasterData::ContourLines& lines ) const; void renderTile( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &imageRect, QImage *image ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotSpectrogram::DisplayModes ) #endif qsstv_9.2.6/qwt/qwt_plot_svgitem.h0000664000175000017500000000302013203343610016013 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SVGITEM_H #define QWT_PLOT_SVGITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include class QSvgRenderer; class QByteArray; /*! \brief A plot item, which displays data in Scalable Vector Graphics (SVG) format. SVG images are often used to display maps */ class QWT_EXPORT QwtPlotSvgItem: public QwtPlotItem { public: explicit QwtPlotSvgItem( const QString& title = QString::null ); explicit QwtPlotSvgItem( const QwtText& title ); virtual ~QwtPlotSvgItem(); bool loadFile( const QRectF&, const QString &fileName ); bool loadData( const QRectF&, const QByteArray & ); virtual QRectF boundingRect() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual int rtti() const; protected: const QSvgRenderer &renderer() const; QSvgRenderer &renderer(); void render( QPainter *painter, const QRectF &viewBox, const QRectF &rect ) const; QRectF viewBox( const QRectF &area ) const; private: void init(); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_textlabel.cpp0000664000175000017500000001272213203343610016665 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_textlabel.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include static QRect qwtItemRect( int renderFlags, const QRectF &rect, const QSizeF &itemSize ) { int x; if ( renderFlags & Qt::AlignLeft ) { x = rect.left(); } else if ( renderFlags & Qt::AlignRight ) { x = rect.right() - itemSize.width(); } else { x = rect.center().x() - 0.5 * itemSize.width(); } int y; if ( renderFlags & Qt::AlignTop ) { y = rect.top(); } else if ( renderFlags & Qt::AlignBottom ) { y = rect.bottom() - itemSize.height(); } else { y = rect.center().y() - 0.5 * itemSize.height(); } return QRect( x, y, itemSize.width(), itemSize.height() ); } class QwtPlotTextLabel::PrivateData { public: PrivateData(): margin( 5 ) { } QwtText text; int margin; QPixmap pixmap; }; /*! \brief Constructor Initializes an text label with an empty text Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false The z value is initialized by 150 \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotTextLabel::QwtPlotTextLabel(): QwtPlotItem( QwtText( "Label" ) ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::AutoScale, false ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 150 ); } //! Destructor QwtPlotTextLabel::~QwtPlotTextLabel() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotTextLabel int QwtPlotTextLabel::rtti() const { return QwtPlotItem::Rtti_PlotTextLabel; } /*! Set the text The label will be aligned to the plot canvas according to the alignment flags of text. \param text Text to be displayed \sa text(), QwtText::renderFlags() */ void QwtPlotTextLabel::setText( const QwtText &text ) { if ( d_data->text != text ) { d_data->text = text; invalidateCache(); itemChanged(); } } /*! \return Text to be displayed \sa setText() */ QwtText QwtPlotTextLabel::text() const { return d_data->text; } /*! Set the margin The margin is the distance between the contentsRect() of the plot canvas and the rectangle where the label can be displayed. \param margin Margin \sa margin(), textRect() */ void QwtPlotTextLabel::setMargin( int margin ) { margin = qMax( margin, 0 ); if ( d_data->margin != margin ) { d_data->margin = margin; itemChanged(); } } /*! \return Margin added to the contentsMargins() of the canvas \sa setMargin() */ int QwtPlotTextLabel::margin() const { return d_data->margin; } /*! Draw the text label \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates \sa textRect() */ void QwtPlotTextLabel::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { Q_UNUSED( xMap ); Q_UNUSED( yMap ); const int m = d_data->margin; const QRectF rect = textRect( canvasRect.adjusted( m, m, -m, -m ), d_data->text.textSize( painter->font() ) ); const bool doAlign = QwtPainter::roundingAlignment( painter ); if ( doAlign ) { // when the paint device is aligning it is not one // where scalability matters ( PDF, SVG ). // As rendering a text label is an expensive operation // we use a cache. int pw = 0; if ( d_data->text.borderPen().style() != Qt::NoPen ) pw = qMax( d_data->text.borderPen().width(), 1 ); QRect pixmapRect; pixmapRect.setLeft( qFloor( rect.left() ) - pw ); pixmapRect.setTop( qFloor( rect.top() ) - pw ); pixmapRect.setRight( qCeil( rect.right() ) + pw ); pixmapRect.setBottom( qCeil( rect.bottom() ) + pw ); if ( d_data->pixmap.isNull() || ( pixmapRect.size() != d_data->pixmap.size() ) ) { d_data->pixmap = QPixmap( pixmapRect.size() ); d_data->pixmap.fill( Qt::transparent ); const QRect r( pw, pw, pixmapRect.width() - 2 * pw, pixmapRect.height() - 2 * pw ); QPainter pmPainter( &d_data->pixmap ); d_data->text.draw( &pmPainter, r ); } painter->drawPixmap( pixmapRect, d_data->pixmap ); } else { d_data->text.draw( painter, rect ); } } /*! \brief Align the text label \param rect Canvas rectangle with margins subtracted \param textSize Size required to draw the text \return A rectangle aligned according the the alignment flags of the text. \sa setMargin(), QwtText::renderFlags(), QwtText::textSize() */ QRectF QwtPlotTextLabel::textRect( const QRectF &rect, const QSizeF &textSize ) const { return qwtItemRect( d_data->text.renderFlags(), rect, textSize ); } //! Invalidate all internal cache void QwtPlotTextLabel::invalidateCache() { d_data->pixmap = QPixmap(); } qsstv_9.2.6/qwt/qwt_plot_textlabel.h0000664000175000017500000000343513203343610016333 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_TEXT_LABEL_H #define QWT_PLOT_TEXT_LABEL_H 1 #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_text.h" /*! \brief A plot item, which displays a text label QwtPlotTextLabel displays a text label aligned to the plot canvas. In opposite to QwtPlotMarker the position of the label is unrelated to plot coordinates. As drawing a text is an expensive operation the label is cached in a pixmap to speed up replots. \par Example The following code shows how to add a title. \verbatim QwtText title( "Plot Title" ); title.setRenderFlags( Qt::AlignHCenter | Qt::AlignTop ); QFont font; font.setBold( true ); title.setFont( font ); QwtPlotTextLabel *titleItem = new QwtPlotTextLabel(); titleItem->setText( title ); titleItem->attach( this ); \endverbatim \sa QwtPlotMarker */ class QWT_EXPORT QwtPlotTextLabel: public QwtPlotItem { public: QwtPlotTextLabel(); virtual ~QwtPlotTextLabel(); virtual int rtti() const; void setText( const QwtText & ); QwtText text() const; void setMargin( int margin ); int margin() const; virtual QRectF textRect( const QRectF &, const QSizeF & ) const; protected: virtual void draw( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &) const; void invalidateCache(); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_tradingcurve.cpp0000664000175000017500000004361713203343610017405 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_tradingcurve.h" #include "qwt_scale_map.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include static inline bool qwtIsSampleInside( const QwtOHLCSample &sample, double tMin, double tMax, double vMin, double vMax ) { const double t = sample.time; const QwtInterval interval = sample.boundingInterval(); const bool isOffScreen = ( t < tMin ) || ( t > tMax ) || ( interval.maxValue() < vMin ) || ( interval.minValue() > vMax ); return !isOffScreen; } class QwtPlotTradingCurve::PrivateData { public: PrivateData(): symbolStyle( QwtPlotTradingCurve::CandleStick ), symbolExtent( 0.6 ), minSymbolWidth( 2.0 ), maxSymbolWidth( -1.0 ), paintAttributes( QwtPlotTradingCurve::ClipSymbols ) { symbolBrush[0] = QBrush( Qt::white ); symbolBrush[1] = QBrush( Qt::black ); } QwtPlotTradingCurve::SymbolStyle symbolStyle; double symbolExtent; double minSymbolWidth; double maxSymbolWidth; QPen symbolPen; QBrush symbolBrush[2]; // Increasing/Decreasing QwtPlotTradingCurve::PaintAttributes paintAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotTradingCurve::QwtPlotTradingCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotTradingCurve::QwtPlotTradingCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotTradingCurve::~QwtPlotTradingCurve() { delete d_data; } //! Initialize internal members void QwtPlotTradingCurve::init() { setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); d_data = new PrivateData; setData( new QwtTradingChartData() ); setZ( 19.0 ); } //! \return QwtPlotItem::Rtti_PlotTradingCurve int QwtPlotTradingCurve::rtti() const { return QwtPlotTradingCurve::Rtti_PlotTradingCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotTradingCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotTradingCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Initialize data with an array of samples. \param samples Vector of samples \sa QwtPlotSeriesItem::setData() */ void QwtPlotTradingCurve::setSamples( const QVector &samples ) { setData( new QwtTradingChartData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotTradingCurve::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Set the symbol style \param style Symbol style \sa symbolStyle(), setSymbolExtent(), setSymbolPen(), setSymbolBrush() */ void QwtPlotTradingCurve::setSymbolStyle( SymbolStyle style ) { if ( style != d_data->symbolStyle ) { d_data->symbolStyle = style; legendChanged(); itemChanged(); } } /*! \return Symbol style \sa setSymbolStyle(), symbolExtent(), symbolPen(), symbolBrush() */ QwtPlotTradingCurve::SymbolStyle QwtPlotTradingCurve::symbolStyle() const { return d_data->symbolStyle; } /*! Build and assign the symbol pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotTradingCurve::setSymbolPen( const QColor &color, qreal width, Qt::PenStyle style ) { setSymbolPen( QPen( color, width, style ) ); } /*! \brief Set the symbol pen The symbol pen is used for rendering the lines of the bar or candlestick symbols \sa symbolPen(), setSymbolBrush() */ void QwtPlotTradingCurve::setSymbolPen( const QPen &pen ) { if ( pen != d_data->symbolPen ) { d_data->symbolPen = pen; legendChanged(); itemChanged(); } } /*! \return Symbol pen \sa setSymbolPen(), symbolBrush() */ QPen QwtPlotTradingCurve::symbolPen() const { return d_data->symbolPen; } /*! Set the symbol brush \param direction Direction type \param brush Brush used to fill the body of all candlestick symbols with the direction \sa symbolBrush(), setSymbolPen() */ void QwtPlotTradingCurve::setSymbolBrush( Direction direction, const QBrush &brush ) { if ( direction < 0 || direction >= 2 ) return; if ( brush != d_data->symbolBrush[ direction ] ) { d_data->symbolBrush[ direction ] = brush; legendChanged(); itemChanged(); } } /*! \param direction \return Brush used to fill the body of all candlestick symbols with the direction \sa setSymbolPen(), symbolBrush() */ QBrush QwtPlotTradingCurve::symbolBrush( Direction direction ) const { if ( direction < 0 || direction >= 2 ) return QBrush(); return d_data->symbolBrush[ direction ]; } /*! \brief Set the extent of the symbol The width of the symbol is given in scale coordinates. When painting a symbol the width is scaled into paint device coordinates by scaledSymbolWidth(). The scaled width is bounded by minSymbolWidth(), maxSymbolWidth() \param extent Symbol width in scale coordinates \sa symbolExtent(), scaledSymbolWidth(), setMinSymbolWidth(), setMaxSymbolWidth() */ void QwtPlotTradingCurve::setSymbolExtent( double extent ) { extent = qMax( 0.0, extent ); if ( extent != d_data->symbolExtent ) { d_data->symbolExtent = extent; legendChanged(); itemChanged(); } } /*! \return Extent of a symbol in scale coordinates \sa setSymbolExtent(), scaledSymbolWidth(), minSymbolWidth(), maxSymbolWidth() */ double QwtPlotTradingCurve::symbolExtent() const { return d_data->symbolExtent; } /*! Set a minimum for the symbol width \param width Width in paint device coordinates \sa minSymbolWidth(), setMaxSymbolWidth(), setSymbolExtent() */ void QwtPlotTradingCurve::setMinSymbolWidth( double width ) { width = qMax( width, 0.0 ); if ( width != d_data->minSymbolWidth ) { d_data->minSymbolWidth = width; legendChanged(); itemChanged(); } } /*! \return Minmum for the symbol width \sa setMinSymbolWidth(), maxSymbolWidth(), symbolExtent() */ double QwtPlotTradingCurve::minSymbolWidth() const { return d_data->minSymbolWidth; } /*! Set a maximum for the symbol width A value <= 0.0 means an unlimited width \param width Width in paint device coordinates \sa maxSymbolWidth(), setMinSymbolWidth(), setSymbolExtent() */ void QwtPlotTradingCurve::setMaxSymbolWidth( double width ) { if ( width != d_data->maxSymbolWidth ) { d_data->maxSymbolWidth = width; legendChanged(); itemChanged(); } } /*! \return Maximum for the symbol width \sa setMaxSymbolWidth(), minSymbolWidth(), symbolExtent() */ double QwtPlotTradingCurve::maxSymbolWidth() const { return d_data->maxSymbolWidth; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotTradingCurve::boundingRect() const { QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.isValid() && orientation() == Qt::Vertical ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawSymbols() */ void QwtPlotTradingCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; painter->save(); if ( d_data->symbolStyle != QwtPlotTradingCurve::NoSymbol ) drawSymbols( painter, xMap, yMap, canvasRect, from, to ); painter->restore(); } /*! Draw symbols \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa drawSeries() */ void QwtPlotTradingCurve::drawSymbols( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const QRectF tr = QwtScaleMap::invTransform( xMap, yMap, canvasRect ); const QwtScaleMap *timeMap, *valueMap; double tMin, tMax, vMin, vMax; const Qt::Orientation orient = orientation(); if ( orient == Qt::Vertical ) { timeMap = &xMap; valueMap = &yMap; tMin = tr.left(); tMax = tr.right(); vMin = tr.top(); vMax = tr.bottom(); } else { timeMap = &yMap; valueMap = &xMap; vMin = tr.left(); vMax = tr.right(); tMin = tr.top(); tMax = tr.bottom(); } const bool inverted = timeMap->isInverting(); const bool doClip = d_data->paintAttributes & ClipSymbols; const bool doAlign = QwtPainter::roundingAlignment( painter ); double symbolWidth = scaledSymbolWidth( xMap, yMap, canvasRect ); if ( doAlign ) symbolWidth = qFloor( 0.5 * symbolWidth ) * 2.0; QPen pen = d_data->symbolPen; pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); for ( int i = from; i <= to; i++ ) { const QwtOHLCSample s = sample( i ); if ( !doClip || qwtIsSampleInside( s, tMin, tMax, vMin, vMax ) ) { QwtOHLCSample translatedSample; translatedSample.time = timeMap->transform( s.time ); translatedSample.open = valueMap->transform( s.open ); translatedSample.high = valueMap->transform( s.high ); translatedSample.low = valueMap->transform( s.low ); translatedSample.close = valueMap->transform( s.close ); const int brushIndex = ( s.open < s.close ) ? QwtPlotTradingCurve::Increasing : QwtPlotTradingCurve::Decreasing; if ( doAlign ) { translatedSample.time = qRound( translatedSample.time ); translatedSample.open = qRound( translatedSample.open ); translatedSample.high = qRound( translatedSample.high ); translatedSample.low = qRound( translatedSample.low ); translatedSample.close = qRound( translatedSample.close ); } switch( d_data->symbolStyle ) { case Bar: { drawBar( painter, translatedSample, orient, inverted, symbolWidth ); break; } case CandleStick: { painter->setBrush( d_data->symbolBrush[ brushIndex ] ); drawCandleStick( painter, translatedSample, orient, symbolWidth ); break; } default: { if ( d_data->symbolStyle >= UserSymbol ) { painter->setBrush( d_data->symbolBrush[ brushIndex ] ); drawUserSymbol( painter, d_data->symbolStyle, translatedSample, orient, inverted, symbolWidth ); } } } } } } /*! \brief Draw a symbol for a symbol style >= UserSymbol The implementation does nothing and is intended to be overloaded \param painter Qt painter, initialized with pen/brush \param symbolStyle Symbol style \param sample Samples already translated into paint device coordinates \param orientation Vertical or horizontal \param inverted True, when the opposite scale ( Qt::Vertical: x, Qt::Horizontal: y ) is increasing in the opposite direction as QPainter coordinates. \param symbolWidth Width of the symbol in paint device coordinates */ void QwtPlotTradingCurve::drawUserSymbol( QPainter *painter, SymbolStyle symbolStyle, const QwtOHLCSample &sample, Qt::Orientation orientation, bool inverted, double symbolWidth ) const { Q_UNUSED( painter ) Q_UNUSED( symbolStyle ) Q_UNUSED( orientation ) Q_UNUSED( inverted ) Q_UNUSED( symbolWidth ) Q_UNUSED( sample ) } /*! \brief Draw a bar \param painter Qt painter, initialized with pen/brush \param sample Sample, already translated into paint device coordinates \param orientation Vertical or horizontal \param inverted When inverted is false the open tick is painted to the left/top, otherwise it is painted right/bottom. The close tick is painted in the opposite direction of the open tick. painted in the opposite d opposite direction. \param width Width or height of the candle, depending on the orientation \sa Bar */ void QwtPlotTradingCurve::drawBar( QPainter *painter, const QwtOHLCSample &sample, Qt::Orientation orientation, bool inverted, double width ) const { double w2 = 0.5 * width; if ( inverted ) w2 *= -1; if ( orientation == Qt::Vertical ) { QwtPainter::drawLine( painter, sample.time, sample.low, sample.time, sample.high ); QwtPainter::drawLine( painter, sample.time - w2, sample.open, sample.time, sample.open ); QwtPainter::drawLine( painter, sample.time + w2, sample.close, sample.time, sample.close ); } else { QwtPainter::drawLine( painter, sample.low, sample.time, sample.high, sample.time ); QwtPainter::drawLine( painter, sample.open, sample.time - w2, sample.open, sample.time ); QwtPainter::drawLine( painter, sample.close, sample.time + w2, sample.close, sample.time ); } } /*! \brief Draw a candle stick \param painter Qt painter, initialized with pen/brush \param sample Samples already translated into paint device coordinates \param orientation Vertical or horizontal \param width Width or height of the candle, depending on the orientation \sa CandleStick */ void QwtPlotTradingCurve::drawCandleStick( QPainter *painter, const QwtOHLCSample &sample, Qt::Orientation orientation, double width ) const { const double t = sample.time; const double v1 = qMin( sample.low, sample.high ); const double v2 = qMin( sample.open, sample.close ); const double v3 = qMax( sample.low, sample.high ); const double v4 = qMax( sample.open, sample.close ); if ( orientation == Qt::Vertical ) { QwtPainter::drawLine( painter, t, v1, t, v2 ); QwtPainter::drawLine( painter, t, v3, t, v4 ); QRectF rect( t - 0.5 * width, sample.open, width, sample.close - sample.open ); QwtPainter::drawRect( painter, rect ); } else { QwtPainter::drawLine( painter, v1, t, v2, t ); QwtPainter::drawLine( painter, v3, t, v4, t ); const QRectF rect( sample.open, t - 0.5 * width, sample.close - sample.open, width ); QwtPainter::drawRect( painter, rect ); } } /*! \return A rectangle filled with the color of the symbol pen \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotTradingCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); return defaultIcon( d_data->symbolPen.color(), size ); } /*! Calculate the symbol width in paint coordinates The width is calculated by scaling the symbol extent into paint device coordinates bounded by the minimum/maximum symbol width. \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \return Symbol width in paint coordinates \sa symbolExtent(), minSymbolWidth(), maxSymbolWidth() */ double QwtPlotTradingCurve::scaledSymbolWidth( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { Q_UNUSED( canvasRect ); if ( d_data->maxSymbolWidth > 0.0 && d_data->minSymbolWidth >= d_data->maxSymbolWidth ) { return d_data->minSymbolWidth; } const QwtScaleMap *map = ( orientation() == Qt::Vertical ) ? &xMap : &yMap; const double pos = map->transform( map->s1() + d_data->symbolExtent ); double width = qAbs( pos - map->p1() ); width = qMax( width, d_data->minSymbolWidth ); if ( d_data->maxSymbolWidth > 0.0 ) width = qMin( width, d_data->maxSymbolWidth ); return width; } qsstv_9.2.6/qwt/qwt_plot_tradingcurve.h0000664000175000017500000001215013203343610017036 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_TRADING_CURVE_H #define QWT_PLOT_TRADING_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" /*! \brief QwtPlotTradingCurve illustrates movements in the price of a financial instrument over time. QwtPlotTradingCurve supports candlestick or bar ( OHLC ) charts that are used in the domain of technical analysis. While the length ( height or width depending on orientation() ) of each symbol depends on the corresponding OHLC sample the size of the other dimension can be controlled using: - setSymbolExtent() - setSymbolMinWidth() - setSymbolMaxWidth() The extent is a size in scale coordinates, so that the symbol width is increasing when the plot is zoomed in. Minimum/Maximum width is in widget coordinates independent from the zoom level. When setting the minimum and maximum to the same value, the width of the symbol is fixed. */ class QWT_EXPORT QwtPlotTradingCurve: public QwtPlotSeriesItem, QwtSeriesStore { public: /*! \brief Symbol styles. The default setting is QwtPlotSeriesItem::CandleStick. \sa setSymbolStyle(), symbolStyle() */ enum SymbolStyle { //! Nothing is displayed NoSymbol = -1, /*! A line on the chart shows the price range (the highest and lowest prices) over one unit of time, e.g. one day or one hour. Tick marks project from each side of the line indicating the opening and closing price. */ Bar, /*! The range between opening/closing price are displayed as a filled box. The fill brush depends on the direction of the price movement. The box is connected to the highest/lowest values by lines. */ CandleStick, /*! SymbolTypes >= UserSymbol are displayed by drawUserSymbol(), that needs to be overloaded and implemented in derived curve classes. \sa drawUserSymbol() */ UserSymbol = 100 }; /*! \brief Direction of a price movement */ enum Direction { //! The closing price is higher than the opening price Increasing, //! The closing price is lower than the opening price Decreasing }; /*! Attributes to modify the drawing algorithm. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { //! Check if a symbol is on the plot canvas before painting it. ClipSymbols = 0x01 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotTradingCurve( const QString &title = QString::null ); explicit QwtPlotTradingCurve( const QwtText &title ); virtual ~QwtPlotTradingCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setSymbolStyle( SymbolStyle style ); SymbolStyle symbolStyle() const; void setSymbolPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setSymbolPen( const QPen & ); QPen symbolPen() const; void setSymbolBrush( Direction, const QBrush & ); QBrush symbolBrush( Direction ) const; void setSymbolExtent( double width ); double symbolExtent() const; void setMinSymbolWidth( double ); double minSymbolWidth() const; void setMaxSymbolWidth( double ); double maxSymbolWidth() const; virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawSymbols( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawUserSymbol( QPainter *, SymbolStyle, const QwtOHLCSample &, Qt::Orientation, bool inverted, double width ) const; void drawBar( QPainter *painter, const QwtOHLCSample &, Qt::Orientation, bool inverted, double width ) const; void drawCandleStick( QPainter *, const QwtOHLCSample &, Qt::Orientation, double width ) const; virtual double scaledSymbolWidth( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotTradingCurve::PaintAttributes ) #endif qsstv_9.2.6/qwt/qwt_plot_xml.cpp0000664000175000017500000000214313203343610015475 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \warning The plot editor has never been implemented. */ void QwtPlot::applyProperties( const QString & /* xmlDocument */ ) { #if 0 // Temporary dummy code, for designer tests setTitle( xmlDocument ); replot(); #endif } /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \return QString::null \warning The plot editor has never been implemented. */ QString QwtPlot::grabProperties() const { #if 0 // Temporary dummy code, for designer tests return title().text(); #else return QString::null; #endif } qsstv_9.2.6/qwt/qwt_plot_zoneitem.cpp0000664000175000017500000001605613203343610016537 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_zoneitem.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include class QwtPlotZoneItem::PrivateData { public: PrivateData(): orientation( Qt::Vertical ), pen( Qt::NoPen ) { QColor c( Qt::darkGray ); c.setAlpha( 100 ); brush = QBrush( c ); } Qt::Orientation orientation; QPen pen; QBrush brush; QwtInterval interval; }; /*! \brief Constructor Initializes the zone with no pen and a semi transparent gray brush Sets the following item attributes: - QwtPlotItem::AutoScale: false - QwtPlotItem::Legend: false The z value is initialized by 5 \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotZoneItem::QwtPlotZoneItem(): QwtPlotItem( QwtText( "Zone" ) ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::AutoScale, false ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 5 ); } //! Destructor QwtPlotZoneItem::~QwtPlotZoneItem() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotZone int QwtPlotZoneItem::rtti() const { return QwtPlotItem::Rtti_PlotZone; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotZoneItem::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! \brief Assign a pen The pen is used to draw the border lines of the zone \param pen Pen \sa pen(), setBrush() */ void QwtPlotZoneItem::setPen( const QPen &pen ) { if ( d_data->pen != pen ) { d_data->pen = pen; itemChanged(); } } /*! \return Pen used to draw the border lines \sa setPen(), brush() */ const QPen &QwtPlotZoneItem::pen() const { return d_data->pen; } /*! \brief Assign a brush The brush is used to fill the zone \param brush Brush \sa pen(), setBrush() */ void QwtPlotZoneItem::setBrush( const QBrush &brush ) { if ( d_data->brush != brush ) { d_data->brush = brush; itemChanged(); } } /*! \return Brush used to fill the zone \sa setPen(), brush() */ const QBrush &QwtPlotZoneItem::brush() const { return d_data->brush; } /*! \brief Set the orientation of the zone A horizontal zone highlights an interval of the y axis, a vertical zone of the x axis. It is unbounded in the opposite direction. \sa orientation(), QwtPlotItem::setAxes() */ void QwtPlotZoneItem::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation != orientation ) { d_data->orientation = orientation; itemChanged(); } } /*! \return Orientation of the zone \sa setOrientation() */ Qt::Orientation QwtPlotZoneItem::orientation() { return d_data->orientation; } /*! Set the interval of the zone For a horizontal zone the interval is related to the y axis, for a vertical zone it is related to the x axis. \param min Minimum of the interval \param max Maximum of the interval \sa interval(), setOrientation() */ void QwtPlotZoneItem::setInterval( double min, double max ) { setInterval( QwtInterval( min, max ) ); } /*! Set the interval of the zone For a horizontal zone the interval is related to the y axis, for a vertical zone it is related to the x axis. \param interval Zone interval \sa interval(), setOrientation() */ void QwtPlotZoneItem::setInterval( const QwtInterval &interval ) { if ( d_data->interval != interval ) { d_data->interval = interval; itemChanged(); } } /*! \return Zone interval \sa setInterval(), orientation() */ QwtInterval QwtPlotZoneItem::interval() const { return d_data->interval; } /*! Draw the zone \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates */ void QwtPlotZoneItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( !d_data->interval.isValid() ) return; QPen pen = d_data->pen; pen.setCapStyle( Qt::FlatCap ); const bool doAlign = QwtPainter::roundingAlignment( painter ); if ( d_data->orientation == Qt::Horizontal ) { double y1 = yMap.transform( d_data->interval.minValue() ); double y2 = yMap.transform( d_data->interval.maxValue() ); if ( doAlign ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QRectF r( canvasRect.left(), y1, canvasRect.width(), y2 - y1 ); r = r.normalized(); if ( ( d_data->brush.style() != Qt::NoBrush ) && ( y1 != y2 ) ) { QwtPainter::fillRect( painter, r, d_data->brush ); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); QwtPainter::drawLine( painter, r.left(), r.top(), r.right(), r.top() ); QwtPainter::drawLine( painter, r.left(), r.bottom(), r.right(), r.bottom() ); } } else { double x1 = xMap.transform( d_data->interval.minValue() ); double x2 = xMap.transform( d_data->interval.maxValue() ); if ( doAlign ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QRectF r( x1, canvasRect.top(), x2 - x1, canvasRect.height() ); r = r.normalized(); if ( ( d_data->brush.style() != Qt::NoBrush ) && ( x1 != x2 ) ) { QwtPainter::fillRect( painter, r, d_data->brush ); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); QwtPainter::drawLine( painter, r.left(), r.top(), r.left(), r.bottom() ); QwtPainter::drawLine( painter, r.right(), r.top(), r.right(), r.bottom() ); } } } /*! The bounding rectangle is build from the interval in one direction and something invalid for the opposite direction. \return An invalid rectangle with valid boundaries in one direction */ QRectF QwtPlotZoneItem::boundingRect() const { QRectF br = QwtPlotItem::boundingRect(); const QwtInterval &intv = d_data->interval; if ( intv.isValid() ) { if ( d_data->orientation == Qt::Horizontal ) { br.setTop( intv.minValue() ); br.setBottom( intv.maxValue() ); } else { br.setLeft( intv.minValue() ); br.setRight( intv.maxValue() ); } } return br; } qsstv_9.2.6/qwt/qwt_plot_zoneitem.h0000664000175000017500000000333713203343610016202 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ZONE_ITEM_H #define QWT_PLOT_ZONE_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_interval.h" class QPen; class QBrush; /*! \brief A plot item, which displays a zone A horizontal zone highlights an interval of the y axis - a vertical zone an interval of the x axis - and is unbounded in the opposite direction. It is filled with a brush and its border lines are optionally displayed with a pen. \note For displaying an area that is bounded for x and y coordinates use QwtPlotShapeItem */ class QWT_EXPORT QwtPlotZoneItem: public QwtPlotItem { public: explicit QwtPlotZoneItem(); virtual ~QwtPlotZoneItem(); virtual int rtti() const; void setOrientation( Qt::Orientation ); Qt::Orientation orientation(); void setInterval( double min, double max ); void setInterval( const QwtInterval & ); QwtInterval interval() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; virtual void draw( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &) const; virtual QRectF boundingRect() const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_zoomer.cpp0000664000175000017500000003546113203343610016221 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_zoomer.h" #include "qwt_plot.h" #include "qwt_scale_div.h" #include "qwt_picker_machine.h" #include class QwtPlotZoomer::PrivateData { public: uint zoomRectIndex; QStack zoomStack; int maxStackDepth; }; /*! \brief Create a zoomer for a plot canvas. The zoomer is set to those x- and y-axis of the parent plot of the canvas that are enabled. If both or no x-axis are enabled, the picker is set to QwtPlot::xBottom. If both or no y-axis are enabled, it is set to QwtPlot::yLeft. The zoomer is initialized with a QwtPickerDragRectMachine, the tracker mode is set to QwtPicker::ActiveOnly and the rubber band is set to QwtPicker::RectRubberBand \param canvas Plot canvas to observe, also the parent object \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase() */ QwtPlotZoomer::QwtPlotZoomer( QWidget *canvas, bool doReplot ): QwtPlotPicker( canvas ) { if ( canvas ) init( doReplot ); } /*! \brief Create a zoomer for a plot canvas. The zoomer is initialized with a QwtPickerDragRectMachine, the tracker mode is set to QwtPicker::ActiveOnly and the rubber band is set to QwtPicker;;RectRubberBand \param xAxis X axis of the zoomer \param yAxis Y axis of the zoomer \param canvas Plot canvas to observe, also the parent object \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase() */ QwtPlotZoomer::QwtPlotZoomer( int xAxis, int yAxis, QWidget *canvas, bool doReplot ): QwtPlotPicker( xAxis, yAxis, canvas ) { if ( canvas ) init( doReplot ); } //! Init the zoomer, used by the constructors void QwtPlotZoomer::init( bool doReplot ) { d_data = new PrivateData; d_data->maxStackDepth = -1; setTrackerMode( ActiveOnly ); setRubberBand( RectRubberBand ); setStateMachine( new QwtPickerDragRectMachine() ); if ( doReplot && plot() ) plot()->replot(); setZoomBase( scaleRect() ); } QwtPlotZoomer::~QwtPlotZoomer() { delete d_data; } /*! \brief Limit the number of recursive zoom operations to depth. A value of -1 set the depth to unlimited, 0 disables zooming. If the current zoom rectangle is below depth, the plot is unzoomed. \param depth Maximum for the stack depth \sa maxStackDepth() \note depth doesn't include the zoom base, so zoomStack().count() might be maxStackDepth() + 1. */ void QwtPlotZoomer::setMaxStackDepth( int depth ) { d_data->maxStackDepth = depth; if ( depth >= 0 ) { // unzoom if the current depth is below d_data->maxStackDepth const int zoomOut = int( d_data->zoomStack.count() ) - 1 - depth; // -1 for the zoom base if ( zoomOut > 0 ) { zoom( -zoomOut ); for ( int i = int( d_data->zoomStack.count() ) - 1; i > int( d_data->zoomRectIndex ); i-- ) { ( void )d_data->zoomStack.pop(); // remove trailing rects } } } } /*! \return Maximal depth of the zoom stack. \sa setMaxStackDepth() */ int QwtPlotZoomer::maxStackDepth() const { return d_data->maxStackDepth; } /*! \return The zoom stack. zoomStack()[0] is the zoom base, zoomStack()[1] the first zoomed rectangle. \sa setZoomStack(), zoomRectIndex() */ const QStack &QwtPlotZoomer::zoomStack() const { return d_data->zoomStack; } /*! \return Initial rectangle of the zoomer \sa setZoomBase(), zoomRect() */ QRectF QwtPlotZoomer::zoomBase() const { return d_data->zoomStack[0]; } /*! Reinitialized the zoom stack with scaleRect() as base. \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa zoomBase(), scaleRect() QwtPlot::autoReplot(), QwtPlot::replot(). */ void QwtPlotZoomer::setZoomBase( bool doReplot ) { QwtPlot *plt = plot(); if ( plt == NULL ) return; if ( doReplot ) plt->replot(); d_data->zoomStack.clear(); d_data->zoomStack.push( scaleRect() ); d_data->zoomRectIndex = 0; rescale(); } /*! \brief Set the initial size of the zoomer. base is united with the current scaleRect() and the zoom stack is reinitialized with it as zoom base. plot is zoomed to scaleRect(). \param base Zoom base \sa zoomBase(), scaleRect() */ void QwtPlotZoomer::setZoomBase( const QRectF &base ) { const QwtPlot *plt = plot(); if ( !plt ) return; const QRectF sRect = scaleRect(); const QRectF bRect = base | sRect; d_data->zoomStack.clear(); d_data->zoomStack.push( bRect ); d_data->zoomRectIndex = 0; if ( base != sRect ) { d_data->zoomStack.push( sRect ); d_data->zoomRectIndex++; } rescale(); } /*! \return Rectangle at the current position on the zoom stack. \sa zoomRectIndex(), scaleRect(). */ QRectF QwtPlotZoomer::zoomRect() const { return d_data->zoomStack[d_data->zoomRectIndex]; } /*! \return Index of current position of zoom stack. */ uint QwtPlotZoomer::zoomRectIndex() const { return d_data->zoomRectIndex; } /*! \brief Zoom in Clears all rectangles above the current position of the zoom stack and pushes the normalized rectangle on it. \note If the maximal stack depth is reached, zoom is ignored. \note The zoomed signal is emitted. */ void QwtPlotZoomer::zoom( const QRectF &rect ) { if ( d_data->maxStackDepth >= 0 && int( d_data->zoomRectIndex ) >= d_data->maxStackDepth ) { return; } const QRectF zoomRect = rect.normalized(); if ( zoomRect != d_data->zoomStack[d_data->zoomRectIndex] ) { for ( uint i = int( d_data->zoomStack.count() ) - 1; i > d_data->zoomRectIndex; i-- ) { ( void )d_data->zoomStack.pop(); } d_data->zoomStack.push( zoomRect ); d_data->zoomRectIndex++; rescale(); Q_EMIT zoomed( zoomRect ); } } /*! \brief Zoom in or out Activate a rectangle on the zoom stack with an offset relative to the current position. Negative values of offset will zoom out, positive zoom in. A value of 0 zooms out to the zoom base. \param offset Offset relative to the current position of the zoom stack. \note The zoomed signal is emitted. \sa zoomRectIndex() */ void QwtPlotZoomer::zoom( int offset ) { if ( offset == 0 ) d_data->zoomRectIndex = 0; else { int newIndex = d_data->zoomRectIndex + offset; newIndex = qMax( 0, newIndex ); newIndex = qMin( int( d_data->zoomStack.count() ) - 1, newIndex ); d_data->zoomRectIndex = uint( newIndex ); } rescale(); Q_EMIT zoomed( zoomRect() ); } /*! \brief Assign a zoom stack In combination with other types of navigation it might be useful to modify to manipulate the complete zoom stack. \param zoomStack New zoom stack \param zoomRectIndex Index of the current position of zoom stack. In case of -1 the current position is at the top of the stack. \note The zoomed signal might be emitted. \sa zoomStack(), zoomRectIndex() */ void QwtPlotZoomer::setZoomStack( const QStack &zoomStack, int zoomRectIndex ) { if ( zoomStack.isEmpty() ) return; if ( d_data->maxStackDepth >= 0 && int( zoomStack.count() ) > d_data->maxStackDepth ) { return; } if ( zoomRectIndex < 0 || zoomRectIndex > int( zoomStack.count() ) ) zoomRectIndex = zoomStack.count() - 1; const bool doRescale = zoomStack[zoomRectIndex] != zoomRect(); d_data->zoomStack = zoomStack; d_data->zoomRectIndex = uint( zoomRectIndex ); if ( doRescale ) { rescale(); Q_EMIT zoomed( zoomRect() ); } } /*! Adjust the observed plot to zoomRect() \note Initiates QwtPlot::replot() */ void QwtPlotZoomer::rescale() { QwtPlot *plt = plot(); if ( !plt ) return; const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex]; if ( rect != scaleRect() ) { const bool doReplot = plt->autoReplot(); plt->setAutoReplot( false ); double x1 = rect.left(); double x2 = rect.right(); if ( !plt->axisScaleDiv( xAxis() ).isIncreasing() ) qSwap( x1, x2 ); plt->setAxisScale( xAxis(), x1, x2 ); double y1 = rect.top(); double y2 = rect.bottom(); if ( !plt->axisScaleDiv( yAxis() ).isIncreasing() ) qSwap( y1, y2 ); plt->setAxisScale( yAxis(), y1, y2 ); plt->setAutoReplot( doReplot ); plt->replot(); } } /*! Reinitialize the axes, and set the zoom base to their scales. \param xAxis X axis \param yAxis Y axis */ void QwtPlotZoomer::setAxis( int xAxis, int yAxis ) { if ( xAxis != QwtPlotPicker::xAxis() || yAxis != QwtPlotPicker::yAxis() ) { QwtPlotPicker::setAxis( xAxis, yAxis ); setZoomBase( scaleRect() ); } } /*! Qt::MidButton zooms out one position on the zoom stack, Qt::RightButton to the zoom base. Changes the current position on the stack, but doesn't pop any rectangle. \note The mouse events can be changed, using QwtEventPattern::setMousePattern: 2, 1 */ void QwtPlotZoomer::widgetMouseReleaseEvent( QMouseEvent *me ) { if ( mouseMatch( MouseSelect2, me ) ) zoom( 0 ); else if ( mouseMatch( MouseSelect3, me ) ) zoom( -1 ); else if ( mouseMatch( MouseSelect6, me ) ) zoom( +1 ); else QwtPlotPicker::widgetMouseReleaseEvent( me ); } /*! Qt::Key_Plus zooms in, Qt::Key_Minus zooms out one position on the zoom stack, Qt::Key_Escape zooms out to the zoom base. Changes the current position on the stack, but doesn't pop any rectangle. \note The keys codes can be changed, using QwtEventPattern::setKeyPattern: 3, 4, 5 */ void QwtPlotZoomer::widgetKeyPressEvent( QKeyEvent *ke ) { if ( !isActive() ) { if ( keyMatch( KeyUndo, ke ) ) zoom( -1 ); else if ( keyMatch( KeyRedo, ke ) ) zoom( +1 ); else if ( keyMatch( KeyHome, ke ) ) zoom( 0 ); } QwtPlotPicker::widgetKeyPressEvent( ke ); } /*! Move the current zoom rectangle. \param dx X offset \param dy Y offset \note The changed rectangle is limited by the zoom base */ void QwtPlotZoomer::moveBy( double dx, double dy ) { const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex]; moveTo( QPointF( rect.left() + dx, rect.top() + dy ) ); } /*! Move the the current zoom rectangle. \param pos New position \sa QRectF::moveTo() \note The changed rectangle is limited by the zoom base */ void QwtPlotZoomer::moveTo( const QPointF &pos ) { double x = pos.x(); double y = pos.y(); if ( x < zoomBase().left() ) x = zoomBase().left(); if ( x > zoomBase().right() - zoomRect().width() ) x = zoomBase().right() - zoomRect().width(); if ( y < zoomBase().top() ) y = zoomBase().top(); if ( y > zoomBase().bottom() - zoomRect().height() ) y = zoomBase().bottom() - zoomRect().height(); if ( x != zoomRect().left() || y != zoomRect().top() ) { d_data->zoomStack[d_data->zoomRectIndex].moveTo( x, y ); rescale(); } } /*! \brief Check and correct a selected rectangle Reject rectangles with a height or width < 2, otherwise expand the selected rectangle to a minimum size of 11x11 and accept it. \return true If the rectangle is accepted, or has been changed to an accepted one. */ bool QwtPlotZoomer::accept( QPolygon &pa ) const { if ( pa.count() < 2 ) return false; QRect rect = QRect( pa[0], pa[int( pa.count() ) - 1] ); rect = rect.normalized(); const int minSize = 2; if ( rect.width() < minSize && rect.height() < minSize ) return false; const int minZoomSize = 11; const QPoint center = rect.center(); rect.setSize( rect.size().expandedTo( QSize( minZoomSize, minZoomSize ) ) ); rect.moveCenter( center ); pa.resize( 2 ); pa[0] = rect.topLeft(); pa[1] = rect.bottomRight(); return true; } /*! \brief Limit zooming by a minimum rectangle \return zoomBase().width() / 10e4, zoomBase().height() / 10e4 */ QSizeF QwtPlotZoomer::minZoomSize() const { return QSizeF( d_data->zoomStack[0].width() / 10e4, d_data->zoomStack[0].height() / 10e4 ); } /*! Rejects selections, when the stack depth is too deep, or the zoomed rectangle is minZoomSize(). \sa minZoomSize(), maxStackDepth() */ void QwtPlotZoomer::begin() { if ( d_data->maxStackDepth >= 0 ) { if ( d_data->zoomRectIndex >= uint( d_data->maxStackDepth ) ) return; } const QSizeF minSize = minZoomSize(); if ( minSize.isValid() ) { const QSizeF sz = d_data->zoomStack[d_data->zoomRectIndex].size() * 0.9999; if ( minSize.width() >= sz.width() && minSize.height() >= sz.height() ) { return; } } QwtPlotPicker::begin(); } /*! Expand the selected rectangle to minZoomSize() and zoom in if accepted. \param ok If true, complete the selection and emit selected signals otherwise discard the selection. \sa accept(), minZoomSize() \return True if the selection has been accepted, false otherwise */ bool QwtPlotZoomer::end( bool ok ) { ok = QwtPlotPicker::end( ok ); if ( !ok ) return false; QwtPlot *plot = QwtPlotZoomer::plot(); if ( !plot ) return false; const QPolygon &pa = selection(); if ( pa.count() < 2 ) return false; QRect rect = QRect( pa[0], pa[int( pa.count() - 1 )] ); rect = rect.normalized(); QRectF zoomRect = invTransform( rect ).normalized(); const QSizeF minSize = minZoomSize(); if ( minSize.isValid() ) { const QPointF center = zoomRect.center(); zoomRect.setSize( zoomRect.size().expandedTo( minZoomSize() ) ); zoomRect.moveCenter( center ); } zoom( zoomRect ); return true; } qsstv_9.2.6/qwt/qwt_plot_zoomer.h0000664000175000017500000001030613203343610015655 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ZOOMER_H #define QWT_PLOT_ZOOMER_H #include "qwt_global.h" #include "qwt_plot_picker.h" #include /*! \brief QwtPlotZoomer provides stacked zooming for a plot widget QwtPlotZoomer selects rectangles from user inputs ( mouse or keyboard ) translates them into plot coordinates and adjusts the axes to them. The selection is supported by a rubber band and optionally by displaying the coordinates of the current mouse position. Zooming can be repeated as often as possible, limited only by maxStackDepth() or minZoomSize(). Each rectangle is pushed on a stack. The default setting how to select rectangles is a QwtPickerDragRectMachine with the following bindings: - QwtEventPattern::MouseSelect1\n The first point of the zoom rectangle is selected by a mouse press, the second point from the position, where the mouse is released. - QwtEventPattern::KeySelect1\n The first key press selects the first, the second key press selects the second point. - QwtEventPattern::KeyAbort\n Discard the selection in the state, where the first point is selected. To traverse the zoom stack the following bindings are used: - QwtEventPattern::MouseSelect3, QwtEventPattern::KeyUndo\n Zoom out one position on the zoom stack - QwtEventPattern::MouseSelect6, QwtEventPattern::KeyRedo\n Zoom in one position on the zoom stack - QwtEventPattern::MouseSelect2, QwtEventPattern::KeyHome\n Zoom to the zoom base The setKeyPattern() and setMousePattern() functions can be used to configure the zoomer actions. The following example shows, how to configure the 'I' and 'O' keys for zooming in and out one position on the zoom stack. The "Home" key is used to "unzoom" the plot. \code zoomer = new QwtPlotZoomer( plot ); zoomer->setKeyPattern( QwtEventPattern::KeyRedo, Qt::Key_I, Qt::ShiftModifier ); zoomer->setKeyPattern( QwtEventPattern::KeyUndo, Qt::Key_O, Qt::ShiftModifier ); zoomer->setKeyPattern( QwtEventPattern::KeyHome, Qt::Key_Home ); \endcode QwtPlotZoomer is tailored for plots with one x and y axis, but it is allowed to attach a second QwtPlotZoomer ( without rubber band and tracker ) for the other axes. \note The realtime example includes an derived zoomer class that adds scrollbars to the plot canvas. \sa QwtPlotPanner, QwtPlotMagnifier */ class QWT_EXPORT QwtPlotZoomer: public QwtPlotPicker { Q_OBJECT public: explicit QwtPlotZoomer( QWidget *, bool doReplot = true ); explicit QwtPlotZoomer( int xAxis, int yAxis, QWidget *, bool doReplot = true ); virtual ~QwtPlotZoomer(); virtual void setZoomBase( bool doReplot = true ); virtual void setZoomBase( const QRectF & ); QRectF zoomBase() const; QRectF zoomRect() const; virtual void setAxis( int xAxis, int yAxis ); void setMaxStackDepth( int ); int maxStackDepth() const; const QStack &zoomStack() const; void setZoomStack( const QStack &, int zoomRectIndex = -1 ); uint zoomRectIndex() const; public Q_SLOTS: void moveBy( double x, double y ); virtual void moveTo( const QPointF & ); virtual void zoom( const QRectF & ); virtual void zoom( int up ); Q_SIGNALS: /*! A signal emitting the zoomRect(), when the plot has been zoomed in or out. \param rect Current zoom rectangle. */ void zoomed( const QRectF &rect ); protected: virtual void rescale(); virtual QSizeF minZoomSize() const; virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void begin(); virtual bool end( bool ok = true ); virtual bool accept( QPolygon & ) const; private: void init( bool doReplot ); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_point_3d.cpp0000664000175000017500000000120613203343610015355 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_3d.h" #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPoint3D &point ) { debug.nospace() << "QwtPoint3D(" << point.x() << "," << point.y() << "," << point.z() << ")"; return debug.space(); } #endif qsstv_9.2.6/qwt/qwt_point_3d.h0000664000175000017500000000757113203343610015035 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef QWT_POINT_3D_H #define QWT_POINT_3D_H 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief QwtPoint3D class defines a 3D point in double coordinates */ class QWT_EXPORT QwtPoint3D { public: QwtPoint3D(); QwtPoint3D( double x, double y, double z ); QwtPoint3D( const QwtPoint3D & ); QwtPoint3D( const QPointF & ); bool isNull() const; double x() const; double y() const; double z() const; double &rx(); double &ry(); double &rz(); void setX( double x ); void setY( double y ); void setZ( double y ); QPointF toPoint() const; bool operator==( const QwtPoint3D & ) const; bool operator!=( const QwtPoint3D & ) const; private: double d_x; double d_y; double d_z; }; Q_DECLARE_TYPEINFO(QwtPoint3D, Q_MOVABLE_TYPE); #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPoint3D & ); #endif /*! Constructs a null point. \sa isNull() */ inline QwtPoint3D::QwtPoint3D(): d_x( 0.0 ), d_y( 0.0 ), d_z( 0.0 ) { } //! Constructs a point with coordinates specified by x, y and z. inline QwtPoint3D::QwtPoint3D( double x, double y, double z = 0.0 ): d_x( x ), d_y( y ), d_z( z ) { } /*! Copy constructor. Constructs a point using the values of the point specified. */ inline QwtPoint3D::QwtPoint3D( const QwtPoint3D &other ): d_x( other.d_x ), d_y( other.d_y ), d_z( other.d_z ) { } /*! Constructs a point with x and y coordinates from a 2D point, and a z coordinate of 0. */ inline QwtPoint3D::QwtPoint3D( const QPointF &other ): d_x( other.x() ), d_y( other.y() ), d_z( 0.0 ) { } /*! \return True if the point is null; otherwise returns false. A point is considered to be null if x, y and z-coordinates are equal to zero. */ inline bool QwtPoint3D::isNull() const { return d_x == 0.0 && d_y == 0.0 && d_z == 0.0; } //! \return The x-coordinate of the point. inline double QwtPoint3D::x() const { return d_x; } //! \return The y-coordinate of the point. inline double QwtPoint3D::y() const { return d_y; } //! \return The z-coordinate of the point. inline double QwtPoint3D::z() const { return d_z; } //! \return A reference to the x-coordinate of the point. inline double &QwtPoint3D::rx() { return d_x; } //! \return A reference to the y-coordinate of the point. inline double &QwtPoint3D::ry() { return d_y; } //! \return A reference to the z-coordinate of the point. inline double &QwtPoint3D::rz() { return d_z; } //! Sets the x-coordinate of the point to the value specified by x. inline void QwtPoint3D::setX( double x ) { d_x = x; } //! Sets the y-coordinate of the point to the value specified by y. inline void QwtPoint3D::setY( double y ) { d_y = y; } //! Sets the z-coordinate of the point to the value specified by z. inline void QwtPoint3D::setZ( double z ) { d_z = z; } /*! \return 2D point, where the z coordinate is dropped. */ inline QPointF QwtPoint3D::toPoint() const { return QPointF( d_x, d_y ); } //! \return True, if this point and other are equal; otherwise returns false. inline bool QwtPoint3D::operator==( const QwtPoint3D &other ) const { return ( d_x == other.d_x ) && ( d_y == other.d_y ) && ( d_z == other.d_z ); } //! \return True if this rect and other are different; otherwise returns false. inline bool QwtPoint3D::operator!=( const QwtPoint3D &other ) const { return !operator==( other ); } #endif qsstv_9.2.6/qwt/qwt_point_data.cpp0000664000175000017500000001524713203343610015772 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_data.h" #include "qwt_math.h" #include /*! Constructor \param x Array of x values \param y Array of y values \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const QVector &x, const QVector &y ): d_x( x ), d_y( y ) { } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const double *x, const double *y, size_t size ) { d_x.resize( size ); ::memcpy( d_x.data(), x, size * sizeof( double ) ); d_y.resize( size ); ::memcpy( d_y.data(), y, size * sizeof( double ) ); } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointArrayData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtPointArrayData::size() const { return qMin( d_x.size(), d_y.size() ); } /*! Return the sample at position i \param index Index \return Sample at position i */ QPointF QwtPointArrayData::sample( size_t index ) const { return QPointF( d_x[int( index )], d_y[int( index )] ); } //! \return Array of the x-values const QVector &QwtPointArrayData::xData() const { return d_x; } //! \return Array of the y-values const QVector &QwtPointArrayData::yData() const { return d_y; } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \warning The programmer must assure that the memory blocks referenced by the pointers remain valid during the lifetime of the QwtPlotCPointer object. \sa QwtPlotCurve::setData(), QwtPlotCurve::setRawSamples() */ QwtCPointerData::QwtCPointerData( const double *x, const double *y, size_t size ): d_x( x ), d_y( y ), d_size( size ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtCPointerData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtCPointerData::size() const { return d_size; } /*! Return the sample at position i \param index Index \return Sample at position i */ QPointF QwtCPointerData::sample( size_t index ) const { return QPointF( d_x[int( index )], d_y[int( index )] ); } //! \return Array of the x-values const double *QwtCPointerData::xData() const { return d_x; } //! \return Array of the y-values const double *QwtCPointerData::yData() const { return d_y; } /*! Constructor \param size Number of points \param interval Bounding interval for the points \sa setInterval(), setSize() */ QwtSyntheticPointData::QwtSyntheticPointData( size_t size, const QwtInterval &interval ): d_size( size ), d_interval( interval ) { } /*! Change the number of points \param size Number of points \sa size(), setInterval() */ void QwtSyntheticPointData::setSize( size_t size ) { d_size = size; } /*! \return Number of points \sa setSize(), interval() */ size_t QwtSyntheticPointData::size() const { return d_size; } /*! Set the bounding interval \param interval Interval \sa interval(), setSize() */ void QwtSyntheticPointData::setInterval( const QwtInterval &interval ) { d_interval = interval.normalized(); } /*! \return Bounding interval \sa setInterval(), size() */ QwtInterval QwtSyntheticPointData::interval() const { return d_interval; } /*! Set a the "rectangle of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). If interval().isValid() == false the x values are calculated in the interval rect.left() -> rect.right(). \sa rectOfInterest() */ void QwtSyntheticPointData::setRectOfInterest( const QRectF &rect ) { d_rectOfInterest = rect; d_intervalOfInterest = QwtInterval( rect.left(), rect.right() ).normalized(); } /*! \return "rectangle of interest" \sa setRectOfInterest() */ QRectF QwtSyntheticPointData::rectOfInterest() const { return d_rectOfInterest; } /*! \brief Calculate the bounding rectangle This implementation iterates over all points, what could often be implemented much faster using the characteristics of the series. When there are many points it is recommended to overload and reimplement this method using the characteristics of the series ( if possible ). \return Bounding rectangle */ QRectF QwtSyntheticPointData::boundingRect() const { if ( d_size == 0 || !( d_interval.isValid() || d_intervalOfInterest.isValid() ) ) { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // something invalid } return qwtBoundingRect( *this ); } /*! Calculate the point from an index \param index Index \return QPointF(x(index), y(x(index))); \warning For invalid indices ( index < 0 || index >= size() ) (0, 0) is returned. */ QPointF QwtSyntheticPointData::sample( size_t index ) const { if ( index >= d_size ) return QPointF( 0, 0 ); const double xValue = x( index ); const double yValue = y( xValue ); return QPointF( xValue, yValue ); } /*! Calculate a x-value from an index x values are calculated by dividing an interval into equidistant steps. If !interval().isValid() the interval is calculated from the "rectangle of interest". \param index Index of the requested point \return Calculated x coordinate \sa interval(), rectOfInterest(), y() */ double QwtSyntheticPointData::x( uint index ) const { const QwtInterval &interval = d_interval.isValid() ? d_interval : d_intervalOfInterest; if ( !interval.isValid() || d_size == 0 || index >= d_size ) return 0.0; const double dx = interval.width() / d_size; return interval.minValue() + index * dx; } qsstv_9.2.6/qwt/qwt_point_data.h0000664000175000017500000000677013203343610015440 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_POINT_DATA_H #define QWT_POINT_DATA_H 1 #include "qwt_global.h" #include "qwt_series_data.h" /*! \brief Interface for iterating over two QVector objects. */ class QWT_EXPORT QwtPointArrayData: public QwtSeriesData { public: QwtPointArrayData( const QVector &x, const QVector &y ); QwtPointArrayData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const QVector &xData() const; const QVector &yData() const; private: QVector d_x; QVector d_y; }; /*! \brief Data class containing two pointers to memory blocks of doubles. */ class QWT_EXPORT QwtCPointerData: public QwtSeriesData { public: QwtCPointerData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const double *xData() const; const double *yData() const; private: const double *d_x; const double *d_y; size_t d_size; }; /*! \brief Synthetic point data QwtSyntheticPointData provides a fixed number of points for an interval. The points are calculated in equidistant steps in x-direction. If the interval is invalid, the points are calculated for the "rectangle of interest", what normally is the displayed area on the plot canvas. In this mode you get different levels of detail, when zooming in/out. \par Example The following example shows how to implement a sinus curve. \code #include #include #include #include #include class SinusData: public QwtSyntheticPointData { public: SinusData(): QwtSyntheticPointData( 100 ) { } virtual double y( double x ) const { return qSin( x ); } }; int main(int argc, char **argv) { QApplication a( argc, argv ); QwtPlot plot; plot.setAxisScale( QwtPlot::xBottom, 0.0, 10.0 ); plot.setAxisScale( QwtPlot::yLeft, -1.0, 1.0 ); QwtPlotCurve *curve = new QwtPlotCurve( "y = sin(x)" ); curve->setData( new SinusData() ); curve->attach( &plot ); plot.show(); return a.exec(); } \endcode */ class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData { public: QwtSyntheticPointData( size_t size, const QwtInterval & = QwtInterval() ); void setSize( size_t size ); virtual size_t size() const; void setInterval( const QwtInterval& ); QwtInterval interval() const; virtual QRectF boundingRect() const; virtual QPointF sample( size_t i ) const; /*! Calculate a y value for a x value \param x x value \return Corresponding y value */ virtual double y( double x ) const = 0; virtual double x( uint index ) const; virtual void setRectOfInterest( const QRectF & ); QRectF rectOfInterest() const; private: size_t d_size; QwtInterval d_interval; QRectF d_rectOfInterest; QwtInterval d_intervalOfInterest; }; #endif qsstv_9.2.6/qwt/qwt_point_mapper.cpp0000664000175000017500000004542413203343610016345 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_mapper.h" #include "qwt_scale_map.h" #include "qwt_pixel_matrix.h" #include #include #include #include #if QT_VERSION >= 0x040400 #include #include #include #if !defined(QT_NO_QFUTURE) #define QWT_USE_THREADS 0 #endif #endif static QRectF qwtInvalidRect( 0.0, 0.0, -1.0, -1.0 ); // Helper class to work around the 5 parameters // limitation of QtConcurrent::run() class QwtDotsCommand { public: const QwtSeriesData *series; int from; int to; QRgb rgb; }; static void qwtRenderDots( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtDotsCommand command, const QPoint &pos, QImage *image ) { const QRgb rgb = command.rgb; QRgb *bits = reinterpret_cast( image->bits() ); const int w = image->width(); const int h = image->height(); const int x0 = pos.x(); const int y0 = pos.y(); for ( int i = command.from; i <= command.to; i++ ) { const QPointF sample = command.series->sample( i ); const int x = static_cast( xMap.transform( sample.x() ) + 0.5 ) - x0; const int y = static_cast( yMap.transform( sample.y() ) + 0.5 ) - y0; if ( x >= 0 && x < w && y >= 0 && y < h ) bits[ y * w + x ] = rgb; } } static inline int qwtRoundValue( double value ) { #if 1 return qRound( value ); #else // A little bit faster, but differs from qRound() // for negative values. Should be no problem as we are // rounding widgets coordinates, where negative values // are clipped off anyway ( at least when there is no // painter transformation ) return static_cast( value + 0.5 ); #endif } // some functors, so that the compile can inline struct QwtRoundI { inline int operator()( double value ) { return qwtRoundValue( value ); } }; struct QwtRoundF { inline double operator()( double value ) { return static_cast( qwtRoundValue( value ) ); } }; struct QwtNoRoundF { inline double operator()( double value ) { return value; } }; // mapping points without any filtering - beside checking // the bounding rectangle template static inline Polygon qwtToPoints( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { Polygon polyline( to - from + 1 ); Point *points = polyline.data(); int numPoints = 0; if ( boundingRect.isValid() ) { // iterating over all values // filtering out all points outside of // the bounding rectangle for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const double x = xMap.transform( sample.x() ); const double y = yMap.transform( sample.y() ); if ( boundingRect.contains( x, y ) ) { points[ numPoints ].rx() = round( x ); points[ numPoints ].ry() = round( y ); numPoints++; } } polyline.resize( numPoints ); } else { // simply iterating over all values // without any filtering for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const double x = xMap.transform( sample.x() ); const double y = yMap.transform( sample.y() ); points[ numPoints ].rx() = round( x ); points[ numPoints ].ry() = round( y ); numPoints++; } } return polyline; } static inline QPolygon qwtToPointsI( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPoints( boundingRect, xMap, yMap, series, from, to, QwtRoundI() ); } template static inline QPolygonF qwtToPointsF( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { return qwtToPoints( boundingRect, xMap, yMap, series, from, to, round ); } // Mapping points with filtering out consecutive // points mapped to the same position template static inline Polygon qwtToPolylineFiltered( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { // in curves with many points consecutive points // are often mapped to the same position. As this might // result in empty lines ( or symbols hidden by others ) // we try to filter them out Polygon polyline( to - from + 1 ); Point *points = polyline.data(); const QPointF sample0 = series->sample( from ); points[0].rx() = round( xMap.transform( sample0.x() ) ); points[0].ry() = round( yMap.transform( sample0.y() ) ); int pos = 0; for ( int i = from + 1; i <= to; i++ ) { const QPointF sample = series->sample( i ); const Point p( round( xMap.transform( sample.x() ) ), round( yMap.transform( sample.y() ) ) ); if ( points[pos] != p ) points[++pos] = p; } polyline.resize( pos + 1 ); return polyline; } static inline QPolygon qwtToPolylineFilteredI( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPolylineFiltered( xMap, yMap, series, from, to, QwtRoundI() ); } template static inline QPolygonF qwtToPolylineFilteredF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { return qwtToPolylineFiltered( xMap, yMap, series, from, to, round ); } template static inline Polygon qwtToPointsFiltered( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { // F.e. in scatter plots ( no connecting lines ) we // can sort out all duplicates ( not only consecutive points ) Polygon polygon( to - from + 1 ); Point *points = polygon.data(); QwtPixelMatrix pixelMatrix( boundingRect.toAlignedRect() ); int numPoints = 0; for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const int x = qwtRoundValue( xMap.transform( sample.x() ) ); const int y = qwtRoundValue( yMap.transform( sample.y() ) ); if ( pixelMatrix.testAndSetPixel( x, y, true ) == false ) { points[ numPoints ].rx() = x; points[ numPoints ].ry() = y; numPoints++; } } polygon.resize( numPoints ); return polygon; } static inline QPolygon qwtToPointsFilteredI( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPointsFiltered( boundingRect, xMap, yMap, series, from, to ); } static inline QPolygonF qwtToPointsFilteredF( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPointsFiltered( boundingRect, xMap, yMap, series, from, to ); } class QwtPointMapper::PrivateData { public: PrivateData(): boundingRect( qwtInvalidRect ) { } QRectF boundingRect; QwtPointMapper::TransformationFlags flags; }; //! Constructor QwtPointMapper::QwtPointMapper() { d_data = new PrivateData(); } //! Destructor QwtPointMapper::~QwtPointMapper() { delete d_data; } /*! Set the flags affecting the transformation process \param flags Flags \sa flags(), setFlag() */ void QwtPointMapper::setFlags( TransformationFlags flags ) { d_data->flags = flags; } /*! \return Flags affecting the transformation process \sa setFlags(), setFlag() */ QwtPointMapper::TransformationFlags QwtPointMapper::flags() const { return d_data->flags; } /*! Modify a flag affecting the transformation process \param flag Flag type \param on Value \sa flag(), setFlags() */ void QwtPointMapper::setFlag( TransformationFlag flag, bool on ) { if ( on ) d_data->flags |= flag; else d_data->flags &= ~flag; } /*! \return True, when the flag is set \param flag Flag type \sa setFlag(), setFlags() */ bool QwtPointMapper::testFlag( TransformationFlag flag ) const { return d_data->flags & flag; } /*! Set a bounding rectangle for the point mapping algorithm A valid bounding rectangle can be used for optimizations \param rect Bounding rectangle \sa boundingRect() */ void QwtPointMapper::setBoundingRect( const QRectF &rect ) { d_data->boundingRect = rect; } /*! \return Bounding rectangle \sa setBoundingRect() */ QRectF QwtPointMapper::boundingRect() const { return d_data->boundingRect; } /*! \brief Translate a series of points into a QPolygonF When the WeedOutPoints flag is enabled consecutive points, that are mapped to the same position will be one point. When RoundPoints is set all points are rounded to integers but returned as PolygonF - what only makes sense when the further processing of the values need a QPolygonF. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygonF QwtPointMapper::toPolygonF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygonF polyline; if ( d_data->flags & WeedOutPoints ) { if ( d_data->flags & RoundPoints ) { polyline = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtRoundF() ); } else { polyline = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtNoRoundF() ); } } else { if ( d_data->flags & RoundPoints ) { polyline = qwtToPointsF( qwtInvalidRect, xMap, yMap, series, from, to, QwtRoundF() ); } else { polyline = qwtToPointsF( qwtInvalidRect, xMap, yMap, series, from, to, QwtNoRoundF() ); } } return polyline; } /*! \brief Translate a series of points into a QPolygon When the WeedOutPoints flag is enabled consecutive points, that are mapped to the same position will be one point. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygon QwtPointMapper::toPolygon( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygon polyline; if ( d_data->flags & WeedOutPoints ) { polyline = qwtToPolylineFilteredI( xMap, yMap, series, from, to ); } else { polyline = qwtToPointsI( qwtInvalidRect, xMap, yMap, series, from, to ); } return polyline; } /*! \brief Translate a series into a QPolygonF - WeedOutPoints & RoundPoints & boundingRect().isValid() All points that are mapped to the same position will be one point. Points outside of the bounding rectangle are ignored. - WeedOutPoints & RoundPoints & !boundingRect().isValid() All consecutive points that are mapped to the same position will one point - WeedOutPoints & !RoundPoints All consecutive points that are mapped to the same position will one point - !WeedOutPoints & boundingRect().isValid() Points outside of the bounding rectangle are ignored. When RoundPoints is set all points are rounded to integers but returned as PolygonF - what only makes sense when the further processing of the values need a QPolygonF. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygonF QwtPointMapper::toPointsF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygonF points; if ( d_data->flags & WeedOutPoints ) { if ( d_data->flags & RoundPoints ) { if ( d_data->boundingRect.isValid() ) { points = qwtToPointsFilteredF( d_data->boundingRect, xMap, yMap, series, from, to ); } else { // without a bounding rectangle all we can // do is to filter out duplicates of // consecutive points points = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtRoundF() ); } } else { // when rounding is not allowed we can't use // qwtToPointsFilteredF points = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtNoRoundF() ); } } else { if ( d_data->flags & RoundPoints ) { points = qwtToPointsF( d_data->boundingRect, xMap, yMap, series, from, to, QwtRoundF() ); } else { points = qwtToPointsF( d_data->boundingRect, xMap, yMap, series, from, to, QwtNoRoundF() ); } } return points; } /*! \brief Translate a series of points into a QPolygon - WeedOutPoints & boundingRect().isValid() All points that are mapped to the same position will be one point. Points outside of the bounding rectangle are ignored. - WeedOutPoints & !boundingRect().isValid() All consecutive points that are mapped to the same position will one point - !WeedOutPoints & boundingRect().isValid() Points outside of the bounding rectangle are ignored. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygon QwtPointMapper::toPoints( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygon points; if ( d_data->flags & WeedOutPoints ) { if ( d_data->boundingRect.isValid() ) { points = qwtToPointsFilteredI( d_data->boundingRect, xMap, yMap, series, from, to ); } else { // when we don't have the bounding rectangle all // we can do is to filter out consecutive duplicates points = qwtToPolylineFilteredI( xMap, yMap, series, from, to ); } } else { points = qwtToPointsI( d_data->boundingRect, xMap, yMap, series, from, to ); } return points; } /*! \brief Translate a series into a QImage \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \param pen Pen used for drawing a point of the image, where a point is mapped to \param antialiased True, when the dots should be displayed antialiased \param numThreads Number of threads to be used for rendering. If numThreads is set to 0, the system specific ideal thread count is used. \return Image displaying the series */ QImage QwtPointMapper::toImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, const QPen &pen, bool antialiased, uint numThreads ) const { Q_UNUSED( antialiased ) #if QWT_USE_THREADS if ( numThreads == 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; #else Q_UNUSED( numThreads ) #endif // a very special optimization for scatter plots // where every sample is mapped to one pixel only. const QRect rect = d_data->boundingRect.toAlignedRect(); QImage image( rect.size(), QImage::Format_ARGB32 ); image.fill( Qt::transparent ); if ( pen.width() <= 1 && pen.color().alpha() == 255 ) { QwtDotsCommand command; command.series = series; command.rgb = pen.color().rgba(); #if QWT_USE_THREADS const int numPoints = ( to - from + 1 ) / numThreads; QList< QFuture > futures; for ( uint i = 0; i < numThreads; i++ ) { const QPoint pos = rect.topLeft(); const int index0 = from + i * numPoints; if ( i == numThreads - 1 ) { command.from = index0; command.to = to; qwtRenderDots( xMap, yMap, command, pos, &image ); } else { command.from = index0; command.to = index0 + numPoints - 1; futures += QtConcurrent::run( &qwtRenderDots, xMap, yMap, command, pos, &image ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else command.from = from; command.to = to; qwtRenderDots( xMap, yMap, command, rect.topLeft(), &image ); #endif } else { // fallback implementation: to be replaced later by // setting the pixels of the image like above, TODO ... QPainter painter( &image ); painter.setPen( pen ); painter.setRenderHint( QPainter::Antialiasing, antialiased ); const int chunkSize = 1000; for ( int i = from; i <= to; i += chunkSize ) { const int indexTo = qMin( i + chunkSize - 1, to ); const QPolygon points = toPoints( xMap, yMap, series, i, indexTo ); painter.drawPoints( points ); } } return image; } qsstv_9.2.6/qwt/qwt_point_mapper.h0000664000175000017500000000520213203343610016000 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_POINT_MAPPER_H #define QWT_POINT_MAPPER_H #include "qwt_global.h" #include "qwt_series_data.h" #include class QwtScaleMap; class QPolygonF; class QPolygon; /*! \brief A helper class for translating a series of points QwtPointMapper is a collection of methods and optimizations for translating a series of points into paint device coordinates. It is used by QwtPlotCurve but might also be useful for similar plot items displaying a QwtSeriesData. */ class QWT_EXPORT QwtPointMapper { public: /*! \brief Flags affecting the transformation process \sa setFlag(), setFlags() */ enum TransformationFlag { //! Round points to integer values RoundPoints = 0x01, /*! Try to remove points, that are translated to the same position. */ WeedOutPoints = 0x02 }; /*! \brief Flags affecting the transformation process \sa setFlag(), setFlags() */ typedef QFlags TransformationFlags; QwtPointMapper(); ~QwtPointMapper(); void setFlags( TransformationFlags ); TransformationFlags flags() const; void setFlag( TransformationFlag, bool on = true ); bool testFlag( TransformationFlag ) const; void setBoundingRect( const QRectF & ); QRectF boundingRect() const; QPolygonF toPolygonF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygon toPolygon( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygon toPoints( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygonF toPointsF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QImage toImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, const QPen &, bool antialiased, uint numThreads ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPointMapper::TransformationFlags ) #endif qsstv_9.2.6/qwt/qwt_point_polar.cpp0000664000175000017500000000612213203343610016166 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * QwtPolar Widget Library * Copyright (C) 2008 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_polar.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #endif /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates \sa setPoint(), toPoint() */ QwtPointPolar::QwtPointPolar( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates */ void QwtPointPolar::setPoint( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and return values in Cartesian coordinates \return Converted point in Cartesian coordinates \note Invalid or null points will be returned as QPointF(0.0, 0.0) \sa isValid(), isNull() */ QPointF QwtPointPolar::toPoint() const { if ( d_radius <= 0.0 ) return QPointF( 0.0, 0.0 ); const double x = d_radius * qCos( d_azimuth ); const double y = d_radius * qSin( d_azimuth ); return QPointF( x, y ); } /*! \brief Compare 2 points Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \return True if the point is equal to other; otherwise return false. \sa normalized() */ bool QwtPointPolar::operator==( const QwtPointPolar &other ) const { return d_radius == other.d_radius && d_azimuth == other.d_azimuth; } /*! Compare 2 points Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \return True if the point is not equal to other; otherwise return false. \sa normalized() */ bool QwtPointPolar::operator!=( const QwtPointPolar &other ) const { return d_radius != other.d_radius || d_azimuth != other.d_azimuth; } /*! Normalize radius and azimuth When the radius is < 0.0 it is set to 0.0. The azimuth is a value >= 0.0 and < 2 * M_PI. \return Normalized point */ QwtPointPolar QwtPointPolar::normalized() const { const double radius = qMax( d_radius, 0.0 ); double azimuth = d_azimuth; if ( azimuth < -2.0 * M_PI || azimuth >= 2 * M_PI ) azimuth = ::fmod( d_azimuth, 2 * M_PI ); if ( azimuth < 0.0 ) azimuth += 2 * M_PI; return QwtPointPolar( azimuth, radius ); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPointPolar &point ) { debug.nospace() << "QwtPointPolar(" << point.azimuth() << "," << point.radius() << ")"; return debug.space(); } #endif qsstv_9.2.6/qwt/qwt_point_polar.h0000664000175000017500000001073713203343610015642 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef _QWT_POINT_POLAR_H_ #define _QWT_POINT_POLAR_H_ 1 #include "qwt_global.h" #include "qwt_math.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A point in polar coordinates In polar coordinates a point is determined by an angle and a distance. See http://en.wikipedia.org/wiki/Polar_coordinate_system */ class QWT_EXPORT QwtPointPolar { public: QwtPointPolar(); QwtPointPolar( double azimuth, double radius ); QwtPointPolar( const QwtPointPolar & ); QwtPointPolar( const QPointF & ); void setPoint( const QPointF & ); QPointF toPoint() const; bool isValid() const; bool isNull() const; double radius() const; double azimuth() const; double &rRadius(); double &rAzimuth(); void setRadius( double ); void setAzimuth( double ); bool operator==( const QwtPointPolar & ) const; bool operator!=( const QwtPointPolar & ) const; QwtPointPolar normalized() const; private: double d_azimuth; double d_radius; }; /*! Constructs a null point, with a radius and azimuth set to 0.0. \sa QPointF::isNull() */ inline QwtPointPolar::QwtPointPolar(): d_azimuth( 0.0 ), d_radius( 0.0 ) { } /*! Constructs a point with coordinates specified by radius and azimuth. \param azimuth Azimuth \param radius Radius */ inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ): d_azimuth( azimuth ), d_radius( radius ) { } /*! Constructs a point using the values of the point specified. \param other Other point */ inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ): d_azimuth( other.d_azimuth ), d_radius( other.d_radius ) { } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isValid() const { return d_radius >= 0.0; } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isNull() const { return d_radius == 0.0; } //! Returns the radius. inline double QwtPointPolar::radius() const { return d_radius; } //! Returns the azimuth. inline double QwtPointPolar::azimuth() const { return d_azimuth; } //! Returns the radius. inline double &QwtPointPolar::rRadius() { return d_radius; } //! Returns the azimuth. inline double &QwtPointPolar::rAzimuth() { return d_azimuth; } //! Sets the radius to radius. inline void QwtPointPolar::setRadius( double radius ) { d_radius = radius; } //! Sets the atimuth to atimuth. inline void QwtPointPolar::setAzimuth( double azimuth ) { d_azimuth = azimuth; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & ); #endif inline QPoint qwtPolar2Pos( const QPoint &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPoint qwtDegree2Pos( const QPoint &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtPolar2Pos( const QPointF &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPointF( x, y); } inline QPointF qwtDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtFastPolar2Pos( const QPointF &pole, double radius, double angle ) { #if QT_VERSION < 0x040601 const double x = pole.x() + radius * ::cos( angle ); const double y = pole.y() - radius * ::sin( angle ); #else const double x = pole.x() + radius * qFastCos( angle ); const double y = pole.y() - radius * qFastSin( angle ); #endif return QPointF( x, y); } inline QPointF qwtFastDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtFastPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QwtPointPolar qwtFastPos2Polar( const QPointF &pos ) { return QwtPointPolar( qwtFastAtan2( pos.y(), pos.x() ), qSqrt( qwtSqr( pos.x() ) + qwtSqr( pos.y() ) ) ); } #endif qsstv_9.2.6/qwt/qwt_raster_data.cpp0000664000175000017500000002652413203343610016141 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_raster_data.h" #include "qwt_point_3d.h" class QwtRasterData::ContourPlane { public: inline ContourPlane( double z ): d_z( z ) { } inline bool intersect( const QwtPoint3D vertex[3], QPointF line[2], bool ignoreOnPlane ) const; inline double z() const { return d_z; } private: inline int compare( double z ) const; inline QPointF intersection( const QwtPoint3D& p1, const QwtPoint3D &p2 ) const; double d_z; }; inline bool QwtRasterData::ContourPlane::intersect( const QwtPoint3D vertex[3], QPointF line[2], bool ignoreOnPlane ) const { bool found = true; // Are the vertices below (-1), on (0) or above (1) the plan ? const int eq1 = compare( vertex[0].z() ); const int eq2 = compare( vertex[1].z() ); const int eq3 = compare( vertex[2].z() ); /* (a) All the vertices lie below the contour level. (b) Two vertices lie below and one on the contour level. (c) Two vertices lie below and one above the contour level. (d) One vertex lies below and two on the contour level. (e) One vertex lies below, one on and one above the contour level. (f) One vertex lies below and two above the contour level. (g) Three vertices lie on the contour level. (h) Two vertices lie on and one above the contour level. (i) One vertex lies on and two above the contour level. (j) All the vertices lie above the contour level. */ static const int tab[3][3][3] = { // jump table to avoid nested case statements { { 0, 0, 8 }, { 0, 2, 5 }, { 7, 6, 9 } }, { { 0, 3, 4 }, { 1, 10, 1 }, { 4, 3, 0 } }, { { 9, 6, 7 }, { 5, 2, 0 }, { 8, 0, 0 } } }; const int edgeType = tab[eq1+1][eq2+1][eq3+1]; switch ( edgeType ) { case 1: // d(0,0,-1), h(0,0,1) line[0] = vertex[0].toPoint(); line[1] = vertex[1].toPoint(); break; case 2: // d(-1,0,0), h(1,0,0) line[0] = vertex[1].toPoint(); line[1] = vertex[2].toPoint(); break; case 3: // d(0,-1,0), h(0,1,0) line[0] = vertex[2].toPoint(); line[1] = vertex[0].toPoint(); break; case 4: // e(0,-1,1), e(0,1,-1) line[0] = vertex[0].toPoint(); line[1] = intersection( vertex[1], vertex[2] ); break; case 5: // e(-1,0,1), e(1,0,-1) line[0] = vertex[1].toPoint(); line[1] = intersection( vertex[2], vertex[0] ); break; case 6: // e(-1,1,0), e(1,0,-1) line[0] = vertex[2].toPoint(); line[1] = intersection( vertex[0], vertex[1] ); break; case 7: // c(-1,1,-1), f(1,1,-1) line[0] = intersection( vertex[0], vertex[1] ); line[1] = intersection( vertex[1], vertex[2] ); break; case 8: // c(-1,-1,1), f(1,1,-1) line[0] = intersection( vertex[1], vertex[2] ); line[1] = intersection( vertex[2], vertex[0] ); break; case 9: // f(-1,1,1), c(1,-1,-1) line[0] = intersection( vertex[2], vertex[0] ); line[1] = intersection( vertex[0], vertex[1] ); break; case 10: // g(0,0,0) // The CONREC algorithm has no satisfying solution for // what to do, when all vertices are on the plane. if ( ignoreOnPlane ) found = false; else { line[0] = vertex[2].toPoint(); line[1] = vertex[0].toPoint(); } break; default: found = false; } return found; } inline int QwtRasterData::ContourPlane::compare( double z ) const { if ( z > d_z ) return 1; if ( z < d_z ) return -1; return 0; } inline QPointF QwtRasterData::ContourPlane::intersection( const QwtPoint3D& p1, const QwtPoint3D &p2 ) const { const double h1 = p1.z() - d_z; const double h2 = p2.z() - d_z; const double x = ( h2 * p1.x() - h1 * p2.x() ) / ( h2 - h1 ); const double y = ( h2 * p1.y() - h1 * p2.y() ) / ( h2 - h1 ); return QPointF( x, y ); } //! Constructor QwtRasterData::QwtRasterData() { } //! Destructor QwtRasterData::~QwtRasterData() { } /*! Set the bounding interval for the x, y or z coordinates. \param axis Axis \param interval Bounding interval \sa interval() */ void QwtRasterData::setInterval( Qt::Axis axis, const QwtInterval &interval ) { d_intervals[axis] = interval; } /*! \brief Initialize a raster Before the composition of an image QwtPlotSpectrogram calls initRaster(), announcing the area and its resolution that will be requested. The default implementation does nothing, but for data sets that are stored in files, it might be good idea to reimplement initRaster(), where the data is resampled and loaded into memory. \param area Area of the raster \param raster Number of horizontal and vertical pixels \sa initRaster(), value() */ void QwtRasterData::initRaster( const QRectF &area, const QSize &raster ) { Q_UNUSED( area ); Q_UNUSED( raster ); } /*! \brief Discard a raster After the composition of an image QwtPlotSpectrogram calls discardRaster(). The default implementation does nothing, but if data has been loaded in initRaster(), it could deleted now. \sa initRaster(), value() */ void QwtRasterData::discardRaster() { } /*! \brief Pixel hint pixelHint() returns the geometry of a pixel, that can be used to calculate the resolution and alignment of the plot item, that is representing the data. Width and height of the hint need to be the horizontal and vertical distances between 2 neighbored points. The center of the hint has to be the position of any point ( it doesn't matter which one ). An empty hint indicates, that there are values for any detail level. Limiting the resolution of the image might significantly improve the performance and heavily reduce the amount of memory when rendering a QImage from the raster data. The default implementation returns an empty rectangle recommending to render in target device ( f.e. screen ) resolution. \param area In most implementations the resolution of the data doesn't depend on the requested area. \return Bounding rectangle of a pixel */ QRectF QwtRasterData::pixelHint( const QRectF &area ) const { Q_UNUSED( area ); return QRectF(); } /*! Calculate contour lines \param rect Bounding rectangle for the contour lines \param raster Number of data pixels of the raster data \param levels List of limits, where to insert contour lines \param flags Flags to customize the contouring algorithm \return Calculated contour lines An adaption of CONREC, a simple contouring algorithm. http://local.wasp.uwa.edu.au/~pbourke/papers/conrec/ */ QwtRasterData::ContourLines QwtRasterData::contourLines( const QRectF &rect, const QSize &raster, const QList &levels, ConrecFlags flags ) const { ContourLines contourLines; if ( levels.size() == 0 || !rect.isValid() || !raster.isValid() ) return contourLines; const double dx = rect.width() / raster.width(); const double dy = rect.height() / raster.height(); const bool ignoreOnPlane = flags & QwtRasterData::IgnoreAllVerticesOnLevel; const QwtInterval range = interval( Qt::ZAxis ); bool ignoreOutOfRange = false; if ( range.isValid() ) ignoreOutOfRange = flags & IgnoreOutOfRange; QwtRasterData *that = const_cast( this ); that->initRaster( rect, raster ); for ( int y = 0; y < raster.height() - 1; y++ ) { enum Position { Center, TopLeft, TopRight, BottomRight, BottomLeft, NumPositions }; QwtPoint3D xy[NumPositions]; for ( int x = 0; x < raster.width() - 1; x++ ) { const QPointF pos( rect.x() + x * dx, rect.y() + y * dy ); if ( x == 0 ) { xy[TopRight].setX( pos.x() ); xy[TopRight].setY( pos.y() ); xy[TopRight].setZ( value( xy[TopRight].x(), xy[TopRight].y() ) ); xy[BottomRight].setX( pos.x() ); xy[BottomRight].setY( pos.y() + dy ); xy[BottomRight].setZ( value( xy[BottomRight].x(), xy[BottomRight].y() ) ); } xy[TopLeft] = xy[TopRight]; xy[BottomLeft] = xy[BottomRight]; xy[TopRight].setX( pos.x() + dx ); xy[TopRight].setY( pos.y() ); xy[BottomRight].setX( pos.x() + dx ); xy[BottomRight].setY( pos.y() + dy ); xy[TopRight].setZ( value( xy[TopRight].x(), xy[TopRight].y() ) ); xy[BottomRight].setZ( value( xy[BottomRight].x(), xy[BottomRight].y() ) ); double zMin = xy[TopLeft].z(); double zMax = zMin; double zSum = zMin; for ( int i = TopRight; i <= BottomLeft; i++ ) { const double z = xy[i].z(); zSum += z; if ( z < zMin ) zMin = z; if ( z > zMax ) zMax = z; } if ( ignoreOutOfRange ) { if ( !range.contains( zMin ) || !range.contains( zMax ) ) continue; } if ( zMax < levels[0] || zMin > levels[levels.size() - 1] ) { continue; } xy[Center].setX( pos.x() + 0.5 * dx ); xy[Center].setY( pos.y() + 0.5 * dy ); xy[Center].setZ( 0.25 * zSum ); const int numLevels = levels.size(); for ( int l = 0; l < numLevels; l++ ) { const double level = levels[l]; if ( level < zMin || level > zMax ) continue; QPolygonF &lines = contourLines[level]; const ContourPlane plane( level ); QPointF line[2]; QwtPoint3D vertex[3]; for ( int m = TopLeft; m < NumPositions; m++ ) { vertex[0] = xy[m]; vertex[1] = xy[0]; vertex[2] = xy[m != BottomLeft ? m + 1 : TopLeft]; const bool intersects = plane.intersect( vertex, line, ignoreOnPlane ); if ( intersects ) { lines += line[0]; lines += line[1]; } } } } } that->discardRaster(); return contourLines; } qsstv_9.2.6/qwt/qwt_raster_data.h0000664000175000017500000000517413203343610015604 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_RASTER_DATA_H #define QWT_RASTER_DATA_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include #include #include class QwtScaleMap; /*! \brief QwtRasterData defines an interface to any type of raster data. QwtRasterData is an abstract interface, that is used by QwtPlotRasterItem to find the values at the pixels of its raster. Often a raster item is used to display values from a matrix. Then the derived raster data class needs to implement some sort of resampling, that maps the raster of the matrix into the requested raster of the raster item ( depending on resolution and scales of the canvas ). */ class QWT_EXPORT QwtRasterData { public: //! Contour lines typedef QMap ContourLines; //! Flags to modify the contour algorithm enum ConrecFlag { //! Ignore all vertices on the same level IgnoreAllVerticesOnLevel = 0x01, //! Ignore all values, that are out of range IgnoreOutOfRange = 0x02 }; //! Flags to modify the contour algorithm typedef QFlags ConrecFlags; QwtRasterData(); virtual ~QwtRasterData(); virtual void setInterval( Qt::Axis, const QwtInterval & ); const QwtInterval &interval(Qt::Axis) const; virtual QRectF pixelHint( const QRectF & ) const; virtual void initRaster( const QRectF &, const QSize& raster ); virtual void discardRaster(); /*! \return the value at a raster position \param x X value in plot coordinates \param y Y value in plot coordinates */ virtual double value( double x, double y ) const = 0; virtual ContourLines contourLines( const QRectF &rect, const QSize &raster, const QList &levels, ConrecFlags ) const; class Contour3DPoint; class ContourPlane; private: // Disabled copy constructor and operator= QwtRasterData( const QwtRasterData & ); QwtRasterData &operator=( const QwtRasterData & ); QwtInterval d_intervals[3]; }; /*! \return Bounding interval for a axis \sa setInterval */ inline const QwtInterval &QwtRasterData::interval( Qt::Axis axis) const { return d_intervals[axis]; } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtRasterData::ConrecFlags ) #endif qsstv_9.2.6/qwt/qwt_round_scale_draw.cpp0000664000175000017500000002015113203343610017151 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include #include #include #include class QwtRoundScaleDraw::PrivateData { public: PrivateData(): center( 50.0, 50.0 ), radius( 50.0 ), startAngle( -135.0 ), endAngle( 135.0 ) { } QPointF center; double radius; double startAngle; double endAngle; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The center is set to (50, 50) with a radius of 50. The angle range is set to [-135, 135]. */ QwtRoundScaleDraw::QwtRoundScaleDraw() { d_data = new QwtRoundScaleDraw::PrivateData; setRadius( 50 ); scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } //! Destructor QwtRoundScaleDraw::~QwtRoundScaleDraw() { delete d_data; } /*! Change of radius the scale Radius is the radius of the backbone without ticks and labels. \param radius New Radius \sa moveCenter() */ void QwtRoundScaleDraw::setRadius( double radius ) { d_data->radius = radius; } /*! Get the radius Radius is the radius of the backbone without ticks and labels. \return Radius of the scale \sa setRadius(), extent() */ double QwtRoundScaleDraw::radius() const { return d_data->radius; } /*! Move the center of the scale draw, leaving the radius unchanged \param center New center \sa setRadius() */ void QwtRoundScaleDraw::moveCenter( const QPointF ¢er ) { d_data->center = center; } //! Get the center of the scale QPointF QwtRoundScaleDraw::center() const { return d_data->center; } /*! \brief Adjust the baseline circle segment for round scales. The baseline will be drawn from min(angle1,angle2) to max(angle1, angle2). The default setting is [ -135, 135 ]. An angle of 0 degrees corresponds to the 12 o'clock position, and positive angles count in a clockwise direction. \param angle1 \param angle2 boundaries of the angle interval in degrees. \warning
  • The angle range is limited to [-360, 360] degrees. Angles exceeding this range will be clipped.
  • For angles more or equal than 360 degrees above or below min(angle1, angle2), scale marks will not be drawn.
  • If you need a counterclockwise scale, use QwtScaleDiv::setInterval()
*/ void QwtRoundScaleDraw::setAngleRange( double angle1, double angle2 ) { #if 0 angle1 = qBound( -360.0, angle1, 360.0 ); angle2 = qBound( -360.0, angle2, 360.0 ); #endif d_data->startAngle = angle1; d_data->endAngle = angle2; if ( d_data->startAngle == d_data->endAngle ) { d_data->startAngle -= 1; d_data->endAngle += 1; } scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ void QwtRoundScaleDraw::drawLabel( QPainter *painter, double value ) const { const QwtText label = tickLabel( painter->font(), value ); if ( label.isEmpty() ) return; const double tval = scaleMap().transform( value ); if ( ( tval >= d_data->startAngle + 360.0 ) || ( tval <= d_data->startAngle - 360.0 ) ) { return; } double radius = d_data->radius; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) { radius += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) radius += tickLength( QwtScaleDiv::MajorTick ); const QSizeF sz = label.textSize( painter->font() ); const double arc = qwtRadians( tval ); const double x = d_data->center.x() + ( radius + sz.width() / 2.0 ) * qSin( arc ); const double y = d_data->center.y() - ( radius + sz.height() / 2.0 ) * qCos( arc ); const QRectF r( x - sz.width() / 2, y - sz.height() / 2, sz.width(), sz.height() ); label.draw( painter, r ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtRoundScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const double tval = scaleMap().transform( value ); const double cx = d_data->center.x(); const double cy = d_data->center.y(); const double radius = d_data->radius; if ( ( tval < d_data->startAngle + 360.0 ) || ( tval > d_data->startAngle - 360.0 ) ) { const double arc = qwtRadians( tval ); const double sinArc = qSin( arc ); const double cosArc = qCos( arc ); const double x1 = cx + radius * sinArc; const double x2 = cx + ( radius + len ) * sinArc; const double y1 = cy - radius * cosArc; const double y2 = cy - ( radius + len ) * cosArc; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtRoundScaleDraw::drawBackbone( QPainter *painter ) const { const double deg1 = scaleMap().p1(); const double deg2 = scaleMap().p2(); const int a1 = qRound( qMin( deg1, deg2 ) - 90 ); const int a2 = qRound( qMax( deg1, deg2 ) - 90 ); const double radius = d_data->radius; const double x = d_data->center.x() - radius; const double y = d_data->center.y() - radius; painter->drawArc( QRectF( x, y, 2 * radius, 2 * radius ), -a2 * 16, ( a2 - a1 + 1 ) * 16 ); // counterclockwise } /*! Calculate the extent of the scale The extent is the distance between the baseline to the outermost pixel of the scale draw. radius() + extent() is an upper limit for the radius of the bounding circle. \param font Font used for painting the labels \return Calculated extent \sa setMinimumExtent(), minimumExtent() \warning The implemented algorithm is not too smart and calculates only an upper limit, that might be a few pixels too large */ double QwtRoundScaleDraw::extent( const QFont &font ) const { double d = 0.0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { const QwtScaleDiv &sd = scaleDiv(); const QList &ticks = sd.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double value = ticks[i]; if ( !sd.contains( value ) ) continue; const QwtText label = tickLabel( font, value ); if ( label.isEmpty() ) continue; const double tval = scaleMap().transform( value ); if ( ( tval < d_data->startAngle + 360 ) && ( tval > d_data->startAngle - 360 ) ) { const double arc = qwtRadians( tval ); const QSizeF sz = label.textSize( font ); const double off = qMax( sz.width(), sz.height() ); double x = off * qSin( arc ); double y = off * qCos( arc ); const double dist = qSqrt( x * x + y * y ); if ( dist > d ) d = dist; } } } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // pen width can be zero d += pw; } if ( hasComponent( QwtAbstractScaleDraw::Labels ) && ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) ) { d += spacing(); } d = qMax( d, minimumExtent() ); return d; } qsstv_9.2.6/qwt/qwt_round_scale_draw.h0000664000175000017500000000364213203343610016624 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ROUND_SCALE_DRAW_H #define QWT_ROUND_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include /*! \brief A class for drawing round scales QwtRoundScaleDraw can be used to draw round scales. The circle segment can be adjusted by setAngleRange(). The geometry of the scale can be specified with moveCenter() and setRadius(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtRoundScaleDraw: public QwtAbstractScaleDraw { public: QwtRoundScaleDraw(); virtual ~QwtRoundScaleDraw(); void setRadius( double radius ); double radius() const; void moveCenter( double x, double y ); void moveCenter( const QPointF & ); QPointF center() const; void setAngleRange( double angle1, double angle2 ); virtual double extent( const QFont & ) const; protected: virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtRoundScaleDraw( const QwtRoundScaleDraw & ); QwtRoundScaleDraw &operator=( const QwtRoundScaleDraw &other ); class PrivateData; PrivateData *d_data; }; //! Move the center of the scale draw, leaving the radius unchanged inline void QwtRoundScaleDraw::moveCenter( double x, double y ) { moveCenter( QPointF( x, y ) ); } #endif qsstv_9.2.6/qwt/qwt_samples.h0000664000175000017500000001154013203343610014751 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SAMPLES_H #define QWT_SAMPLES_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include #include //! \brief A sample of the types (x1-x2, y) or (x, y1-y2) class QWT_EXPORT QwtIntervalSample { public: QwtIntervalSample(); QwtIntervalSample( double, const QwtInterval & ); QwtIntervalSample( double value, double min, double max ); bool operator==( const QwtIntervalSample & ) const; bool operator!=( const QwtIntervalSample & ) const; //! Value double value; //! Interval QwtInterval interval; }; /*! Constructor The value is set to 0.0, the interval is invalid */ inline QwtIntervalSample::QwtIntervalSample(): value( 0.0 ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, const QwtInterval &intv ): value( v ), interval( intv ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, double min, double max ): value( v ), interval( min, max ) { } //! Compare operator inline bool QwtIntervalSample::operator==( const QwtIntervalSample &other ) const { return value == other.value && interval == other.interval; } //! Compare operator inline bool QwtIntervalSample::operator!=( const QwtIntervalSample &other ) const { return !( *this == other ); } //! \brief A sample of the types (x1...xn, y) or (x, y1..yn) class QWT_EXPORT QwtSetSample { public: QwtSetSample(); QwtSetSample( double, const QVector & = QVector() ); bool operator==( const QwtSetSample &other ) const; bool operator!=( const QwtSetSample &other ) const; double added() const; //! value double value; //! Vector of values associated to value QVector set; }; /*! Constructor The value is set to 0.0 */ inline QwtSetSample::QwtSetSample(): value( 0.0 ) { } /*! Constructor \param v Value \param s Set of values */ inline QwtSetSample::QwtSetSample( double v, const QVector< double > &s ): value( v ), set( s ) { } //! Compare operator inline bool QwtSetSample::operator==( const QwtSetSample &other ) const { return value == other.value && set == other.set; } //! Compare operator inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const { return !( *this == other ); } //! \return All values of the set added inline double QwtSetSample::added() const { double y = 0.0; for ( int i = 0; i < set.size(); i++ ) y += set[i]; return y; } /*! \brief Open-High-Low-Close sample used in financial charts In financial charts the movement of a price in a time interval is often represented by the opening/closing prices and the lowest/highest prices in this interval. \sa QwtTradingChartData */ class QWT_EXPORT QwtOHLCSample { public: QwtOHLCSample( double time = 0.0, double open = 0.0, double high = 0.0, double low = 0.0, double close = 0.0 ); QwtInterval boundingInterval() const; bool isValid() const; /*! Time of the sample, usually a number representing a specific interval - like a day. */ double time; //! Opening price double open; //! Highest price double high; //! Lowest price double low; //! Closing price double close; }; /*! Constructor \param t Time value \param o Open value \param h High value \param l Low value \param c Close value */ inline QwtOHLCSample::QwtOHLCSample( double t, double o, double h, double l, double c ): time( t ), open( o ), high( h ), low( l ), close( c ) { } /*! \brief Check if a sample is valid A sample is valid, when all of the following checks are true: - low <= high - low <= open <= high - low <= close <= high \return True, when the sample is valid */ inline bool QwtOHLCSample::isValid() const { return ( low <= high ) && ( open >= low ) && ( open <= high ) && ( close >= low ) && ( close <= high ); } /*! \brief Calculate the bounding interval of the OHLC values For valid samples the limits of this interval are always low/high. \return Bounding interval \sa isValid() */ inline QwtInterval QwtOHLCSample::boundingInterval() const { double minY = open; minY = qMin( minY, high ); minY = qMin( minY, low ); minY = qMin( minY, close ); double maxY = open; maxY = qMax( maxY, high ); maxY = qMax( maxY, low ); maxY = qMax( maxY, close ); return QwtInterval( minY, maxY ); } #endif qsstv_9.2.6/qwt/qwt_sampling_thread.cpp0000664000175000017500000000426713203343610017011 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_sampling_thread.h" #include "qwt_system_clock.h" class QwtSamplingThread::PrivateData { public: QwtSystemClock clock; double interval; bool isStopped; }; //! Constructor QwtSamplingThread::QwtSamplingThread( QObject *parent ): QThread( parent ) { d_data = new PrivateData; d_data->interval = 1000; // 1 second d_data->isStopped = true; } //! Destructor QwtSamplingThread::~QwtSamplingThread() { delete d_data; } /*! Change the interval (in ms), when sample() is called. The default interval is 1000.0 ( = 1s ) \param interval Interval \sa interval() */ void QwtSamplingThread::setInterval( double interval ) { if ( interval < 0.0 ) interval = 0.0; d_data->interval = interval; } /*! \return Interval (in ms), between 2 calls of sample() \sa setInterval() */ double QwtSamplingThread::interval() const { return d_data->interval; } /*! \return Time (in ms) since the thread was started \sa QThread::start(), run() */ double QwtSamplingThread::elapsed() const { if ( d_data->isStopped ) return 0.0; return d_data->clock.elapsed(); } /*! Terminate the collecting thread \sa QThread::start(), run() */ void QwtSamplingThread::stop() { d_data->isStopped = true; } /*! Loop collecting samples started from QThread::start() \sa stop() */ void QwtSamplingThread::run() { d_data->clock.start(); d_data->isStopped = false; while ( !d_data->isStopped ) { const double elapsed = d_data->clock.elapsed(); sample( elapsed / 1000.0 ); if ( d_data->interval > 0.0 ) { const double msecs = d_data->interval - ( d_data->clock.elapsed() - elapsed ); if ( msecs > 0.0 ) usleep( qRound( 1000.0 * msecs ) ); } } } qsstv_9.2.6/qwt/qwt_sampling_thread.h0000664000175000017500000000210113203343610016437 0ustar jomajoma#ifndef _QWT_SAMPLING_THREAD_H_ #define _QWT_SAMPLING_THREAD_H_ #include "qwt_global.h" #include /*! \brief A thread collecting samples at regular intervals. Continuous signals are converted into a discrete signal by collecting samples at regular intervals. A discrete signal can be displayed by a QwtPlotSeriesItem on a QwtPlot widget. QwtSamplingThread starts a thread calling periodically sample(), to collect and store ( or emit ) a single sample. \sa QwtPlotCurve, QwtPlotSeriesItem */ class QWT_EXPORT QwtSamplingThread: public QThread { Q_OBJECT public: virtual ~QwtSamplingThread(); double interval() const; double elapsed() const; public Q_SLOTS: void setInterval( double interval ); void stop(); protected: explicit QwtSamplingThread( QObject *parent = NULL ); virtual void run(); /*! Collect a sample \param elapsed Time since the thread was started in milliseconds */ virtual void sample( double elapsed ) = 0; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_scale_div.cpp0000664000175000017500000001662613203343610015603 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_div.h" #include "qwt_math.h" #include /*! Construct a division without ticks \param lowerBound First boundary \param upperBound Second boundary \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { } /*! Construct a scale division \param interval Interval \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval, QList ticks[NTickTypes] ): d_lowerBound( interval.minValue() ), d_upperBound( interval.maxValue() ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct a scale division \param lowerBound First boundary \param upperBound Second boundary \param ticks List of major, medium and minor ticks \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, QList ticks[NTickTypes] ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct a scale division \param lowerBound First boundary \param upperBound Second boundary \param minorTicks List of minor ticks \param mediumTicks List medium ticks \param majorTicks List of major ticks \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, const QList &minorTicks, const QList &mediumTicks, const QList &majorTicks ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { d_ticks[ MinorTick ] = minorTicks; d_ticks[ MediumTick ] = mediumTicks; d_ticks[ MajorTick ] = majorTicks; } /*! Change the interval \param lowerBound First boundary \param upperBound Second boundary \note lowerBound might be greater than upperBound for inverted scales */ void QwtScaleDiv::setInterval( double lowerBound, double upperBound ) { d_lowerBound = lowerBound; d_upperBound = upperBound; } /*! Change the interval \param interval Interval */ void QwtScaleDiv::setInterval( const QwtInterval &interval ) { d_lowerBound = interval.minValue(); d_upperBound = interval.maxValue(); } /*! \return lowerBound -> upperBound */ QwtInterval QwtScaleDiv::interval() const { return QwtInterval( d_lowerBound, d_upperBound ); } /*! Set the first boundary \param lowerBound First boundary \sa lowerBiound(), setUpperBound() */ void QwtScaleDiv::setLowerBound( double lowerBound ) { d_lowerBound = lowerBound; } /*! \return First boundary \sa upperBound() */ double QwtScaleDiv::lowerBound() const { return d_lowerBound; } /*! Set the second boundary \param upperBound Second boundary \sa upperBound(), setLowerBound() */ void QwtScaleDiv::setUpperBound( double upperBound ) { d_upperBound = upperBound; } /*! \return upper bound \sa lowerBound() */ double QwtScaleDiv::upperBound() const { return d_upperBound; } /*! \return upperBound() - lowerBound() */ double QwtScaleDiv::range() const { return d_upperBound - d_lowerBound; } /*! \brief Equality operator \return true if this instance is equal to other */ bool QwtScaleDiv::operator==( const QwtScaleDiv &other ) const { if ( d_lowerBound != other.d_lowerBound || d_upperBound != other.d_upperBound ) { return false; } for ( int i = 0; i < NTickTypes; i++ ) { if ( d_ticks[i] != other.d_ticks[i] ) return false; } return true; } /*! \brief Inequality \return true if this instance is not equal to other */ bool QwtScaleDiv::operator!=( const QwtScaleDiv &other ) const { return ( !( *this == other ) ); } //! Check if the scale division is empty( lowerBound() == upperBound() ) bool QwtScaleDiv::isEmpty() const { return ( d_lowerBound == d_upperBound ); } //! Check if the scale division is increasing( lowerBound() <= upperBound() ) bool QwtScaleDiv::isIncreasing() const { return d_lowerBound <= d_upperBound; } /*! Return if a value is between lowerBound() and upperBound() \param value Value \return true/false */ bool QwtScaleDiv::contains( double value ) const { const double min = qMin( d_lowerBound, d_upperBound ); const double max = qMax( d_lowerBound, d_upperBound ); return value >= min && value <= max; } /*! Invert the scale division \sa inverted() */ void QwtScaleDiv::invert() { qSwap( d_lowerBound, d_upperBound ); for ( int i = 0; i < NTickTypes; i++ ) { QList& ticks = d_ticks[i]; const int size = ticks.count(); const int size2 = size / 2; for ( int j = 0; j < size2; j++ ) qSwap( ticks[j], ticks[size - 1 - j] ); } } /*! \return A scale division with inverted boundaries and ticks \sa invert() */ QwtScaleDiv QwtScaleDiv::inverted() const { QwtScaleDiv other = *this; other.invert(); return other; } /*! Return a scale division with an interval [lowerBound, upperBound] where all ticks outside this interval are removed \param lowerBound Lower bound \param upperBound Upper bound \return Scale division with all ticks inside of the given interval \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv QwtScaleDiv::bounded( double lowerBound, double upperBound ) const { const double min = qMin( lowerBound, upperBound ); const double max = qMax( lowerBound, upperBound ); QwtScaleDiv sd; sd.setInterval( lowerBound, upperBound ); for ( int tickType = 0; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList &ticks = d_ticks[ tickType ]; QList boundedTicks; for ( int i = 0; i < ticks.size(); i++ ) { const double tick = ticks[i]; if ( tick >= min && tick <= max ) boundedTicks += tick; } sd.setTicks( tickType, boundedTicks ); } return sd; } /*! Assign ticks \param type MinorTick, MediumTick or MajorTick \param ticks Values of the tick positions */ void QwtScaleDiv::setTicks( int type, const QList &ticks ) { if ( type >= 0 && type < NTickTypes ) d_ticks[type] = ticks; } /*! Return a list of ticks \param type MinorTick, MediumTick or MajorTick \return Tick list */ QList QwtScaleDiv::ticks( int type ) const { if ( type >= 0 && type < NTickTypes ) return d_ticks[type]; return QList(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleDiv &scaleDiv ) { debug << scaleDiv.lowerBound() << "<->" << scaleDiv.upperBound(); debug << "Major: " << scaleDiv.ticks( QwtScaleDiv::MajorTick ); debug << "Medium: " << scaleDiv.ticks( QwtScaleDiv::MediumTick ); debug << "Minor: " << scaleDiv.ticks( QwtScaleDiv::MinorTick ); return debug; } #endif qsstv_9.2.6/qwt/qwt_scale_div.h0000664000175000017500000000530413203343610015237 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DIV_H #define QWT_SCALE_DIV_H #include "qwt_global.h" #include "qwt_interval.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing a scale division A Qwt scale is defined by its boundaries and 3 list for the positions of the major, medium and minor ticks. The upperLimit() might be smaller than the lowerLimit() to indicate inverted scales. Scale divisions can be calculated from a QwtScaleEngine. \sa QwtScaleEngine::divideScale(), QwtPlot::setAxisScaleDiv(), QwtAbstractSlider::setScaleDiv() */ class QWT_EXPORT QwtScaleDiv { public: //! Scale tick types enum TickType { //! No ticks NoTick = -1, //! Minor ticks MinorTick, //! Medium ticks MediumTick, //! Major ticks MajorTick, //! Number of valid tick types NTickTypes }; explicit QwtScaleDiv( double lowerBound = 0.0, double upperBound = 0.0 ); explicit QwtScaleDiv( const QwtInterval &, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, const QList &minorTicks, const QList &mediumTicks, const QList &majorTicks ); bool operator==( const QwtScaleDiv & ) const; bool operator!=( const QwtScaleDiv & ) const; void setInterval( double lowerBound, double upperBound ); void setInterval( const QwtInterval & ); QwtInterval interval() const; void setLowerBound( double ); double lowerBound() const; void setUpperBound( double ); double upperBound() const; double range() const; bool contains( double value ) const; void setTicks( int tickType, const QList & ); QList ticks( int tickType ) const; bool isEmpty() const; bool isIncreasing() const; void invert(); QwtScaleDiv inverted() const; QwtScaleDiv bounded( double lowerBound, double upperBound ) const; private: double d_lowerBound; double d_upperBound; QList d_ticks[NTickTypes]; }; Q_DECLARE_TYPEINFO( QwtScaleDiv, Q_MOVABLE_TYPE ); #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleDiv & ); #endif #endif qsstv_9.2.6/qwt/qwt_scale_draw.cpp0000664000175000017500000005413213203343610015750 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #if QT_VERSION < 0x040601 #define qFastSin(x) qSin(x) #define qFastCos(x) qCos(x) #endif class QwtScaleDraw::PrivateData { public: PrivateData(): len( 0 ), alignment( QwtScaleDraw::BottomScale ), labelAlignment( 0 ), labelRotation( 0.0 ) { } QPointF pos; double len; Alignment alignment; Qt::Alignment labelAlignment; double labelRotation; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The position is at (0, 0) with a length of 100. The orientation is QwtAbstractScaleDraw::Bottom. */ QwtScaleDraw::QwtScaleDraw() { d_data = new QwtScaleDraw::PrivateData; setLength( 100 ); } //! Destructor QwtScaleDraw::~QwtScaleDraw() { delete d_data; } /*! Return alignment of the scale \sa setAlignment() \return Alignment of the scale */ QwtScaleDraw::Alignment QwtScaleDraw::alignment() const { return d_data->alignment; } /*! Set the alignment of the scale \param align Alignment of the scale The default alignment is QwtScaleDraw::BottomScale \sa alignment() */ void QwtScaleDraw::setAlignment( Alignment align ) { d_data->alignment = align; } /*! Return the orientation TopScale, BottomScale are horizontal (Qt::Horizontal) scales, LeftScale, RightScale are vertical (Qt::Vertical) scales. \return Orientation of the scale \sa alignment() */ Qt::Orientation QwtScaleDraw::orientation() const { switch ( d_data->alignment ) { case TopScale: case BottomScale: return Qt::Horizontal; case LeftScale: case RightScale: default: return Qt::Vertical; } } /*! \brief Determine the minimum border distance This member function returns the minimum space needed to draw the mark labels at the scale's endpoints. \param font Font \param start Start border distance \param end End border distance */ void QwtScaleDraw::getBorderDistHint( const QFont &font, int &start, int &end ) const { start = 0; end = 0; if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return; // Find the ticks, that are mapped to the borders. // minTick is the tick, that is mapped to the top/left-most position // in widget coordinates. double minTick = ticks[0]; double minPos = scaleMap().transform( minTick ); double maxTick = minTick; double maxPos = minPos; for ( int i = 1; i < ticks.count(); i++ ) { const double tickPos = scaleMap().transform( ticks[i] ); if ( tickPos < minPos ) { minTick = ticks[i]; minPos = tickPos; } if ( tickPos > scaleMap().transform( maxTick ) ) { maxTick = ticks[i]; maxPos = tickPos; } } double e = 0.0; double s = 0.0; if ( orientation() == Qt::Vertical ) { s = -labelRect( font, minTick ).top(); s -= qAbs( minPos - qRound( scaleMap().p2() ) ); e = labelRect( font, maxTick ).bottom(); e -= qAbs( maxPos - scaleMap().p1() ); } else { s = -labelRect( font, minTick ).left(); s -= qAbs( minPos - scaleMap().p1() ); e = labelRect( font, maxTick ).right(); e -= qAbs( maxPos - scaleMap().p2() ); } if ( s < 0.0 ) s = 0.0; if ( e < 0.0 ) e = 0.0; start = qCeil( s ); end = qCeil( e ); } /*! Determine the minimum distance between two labels, that is necessary that the texts don't overlap. \param font Font \return The maximum width of a label \sa getBorderDistHint() */ int QwtScaleDraw::minLabelDist( const QFont &font ) const { if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.isEmpty() ) return 0; const QFontMetrics fm( font ); const bool vertical = ( orientation() == Qt::Vertical ); QRectF bRect1; QRectF bRect2 = labelRect( font, ticks[0] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0.0, bRect2.height(), bRect2.width() ); } double maxDist = 0.0; for ( int i = 1; i < ticks.count(); i++ ) { bRect1 = bRect2; bRect2 = labelRect( font, ticks[i] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0.0, bRect2.height(), bRect2.width() ); } double dist = fm.leading(); // space between the labels if ( bRect1.right() > 0 ) dist += bRect1.right(); if ( bRect2.left() < 0 ) dist += -bRect2.left(); if ( dist > maxDist ) maxDist = dist; } double angle = qwtRadians( labelRotation() ); if ( vertical ) angle += M_PI / 2; const double sinA = qFastSin( angle ); // qreal -> double if ( qFuzzyCompare( sinA + 1.0, 1.0 ) ) return qCeil( maxDist ); const int fmHeight = fm.ascent() - 2; // The distance we need until there is // the height of the label font. This height is needed // for the neighbored label. double labelDist = fmHeight / qFastSin( angle ) * qFastCos( angle ); if ( labelDist < 0 ) labelDist = -labelDist; // For text orientations close to the scale orientation if ( labelDist > maxDist ) labelDist = maxDist; // For text orientations close to the opposite of the // scale orientation if ( labelDist < fmHeight ) labelDist = fmHeight; return qCeil( labelDist ); } /*! Calculate the width/height that is needed for a vertical/horizontal scale. The extent is calculated from the pen width of the backbone, the major tick length, the spacing and the maximum width/height of the labels. \param font Font used for painting the labels \return Extent \sa minLength() */ double QwtScaleDraw::extent( const QFont &font ) const { double d = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( orientation() == Qt::Vertical ) d = maxLabelWidth( font ); else d = maxLabelHeight( font ); if ( d > 0 ) d += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // pen width can be zero d += pw; } d = qMax( d, minimumExtent() ); return d; } /*! Calculate the minimum length that is needed to draw the scale \param font Font used for painting the labels \return Minimum length that is needed to draw the scale \sa extent() */ int QwtScaleDraw::minLength( const QFont &font ) const { int startDist, endDist; getBorderDistHint( font, startDist, endDist ); const QwtScaleDiv &sd = scaleDiv(); const uint minorCount = sd.ticks( QwtScaleDiv::MinorTick ).count() + sd.ticks( QwtScaleDiv::MediumTick ).count(); const uint majorCount = sd.ticks( QwtScaleDiv::MajorTick ).count(); int lengthForLabels = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) lengthForLabels = minLabelDist( font ) * majorCount; int lengthForTicks = 0; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero lengthForTicks = qCeil( ( majorCount + minorCount ) * ( pw + 1.0 ) ); } return startDist + endDist + qMax( lengthForLabels, lengthForTicks ); } /*! Find the position, where to paint a label The position has a distance that depends on the length of the ticks in direction of the alignment(). \param value Value \return Position, where to paint a label */ QPointF QwtScaleDraw::labelPosition( double value ) const { const double tval = scaleMap().transform( value ); double dist = spacing(); if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) dist += qMax( 1, penWidth() ); if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) dist += tickLength( QwtScaleDiv::MajorTick ); double px = 0; double py = 0; switch ( alignment() ) { case RightScale: { px = d_data->pos.x() + dist; py = tval; break; } case LeftScale: { px = d_data->pos.x() - dist; py = tval; break; } case BottomScale: { px = tval; py = d_data->pos.y() + dist; break; } case TopScale: { px = tval; py = d_data->pos.y() - dist; break; } } return QPointF( px, py ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Length of the tick \sa drawBackbone(), drawLabel() */ void QwtScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const bool roundingAlignment = QwtPainter::roundingAlignment( painter ); QPointF pos = d_data->pos; double tval = scaleMap().transform( value ); if ( roundingAlignment ) tval = qRound( tval ); const int pw = penWidth(); int a = 0; if ( pw > 1 && roundingAlignment ) a = 1; switch ( alignment() ) { case LeftScale: { double x1 = pos.x() + a; double x2 = pos.x() + a - pw - len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case RightScale: { double x1 = pos.x(); double x2 = pos.x() + pw + len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case BottomScale: { double y1 = pos.y(); double y2 = pos.y() + pw + len; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } case TopScale: { double y1 = pos.y() + a; double y2 = pos.y() - pw - len + a; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtScaleDraw::drawBackbone( QPainter *painter ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); const QPointF &pos = d_data->pos; const double len = d_data->len; const int pw = qMax( penWidth(), 1 ); // pos indicates a border not the center of the backbone line // so we need to shift its position depending on the pen width // and the alignment of the scale double off; if ( doAlign ) { if ( alignment() == LeftScale || alignment() == TopScale ) off = ( pw - 1 ) / 2; else off = pw / 2; } else { off = 0.5 * penWidth(); } switch ( alignment() ) { case LeftScale: { double x = pos.x() - off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case RightScale: { double x = pos.x() + off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case TopScale: { double y = pos.y() - off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } case BottomScale: { double y = pos.y() + off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } } } /*! \brief Move the position of the scale The meaning of the parameter pos depends on the alignment:
QwtScaleDraw::LeftScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the left of the backbone.
QwtScaleDraw::RightScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the right of the backbone.
QwtScaleDraw::TopScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line. Scale marks and labels are drawn above the backbone.
QwtScaleDraw::BottomScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line Scale marks and labels are drawn below the backbone.
\param pos Origin of the scale \sa pos(), setLength() */ void QwtScaleDraw::move( const QPointF &pos ) { d_data->pos = pos; updateMap(); } /*! \return Origin of the scale \sa move(), length() */ QPointF QwtScaleDraw::pos() const { return d_data->pos; } /*! Set the length of the backbone. The length doesn't include the space needed for overlapping labels. \param length Length of the backbone \sa move(), minLabelDist() */ void QwtScaleDraw::setLength( double length ) { #if 1 if ( length >= 0 && length < 10 ) length = 10; // why should we accept negative lengths ??? if ( length < 0 && length > -10 ) length = -10; #else length = qMax( length, 10 ); #endif d_data->len = length; updateMap(); } /*! \return the length of the backbone \sa setLength(), pos() */ double QwtScaleDraw::length() const { return d_data->len; } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone(), boundingLabelRect() */ void QwtScaleDraw::drawLabel( QPainter *painter, double value ) const { QwtText lbl = tickLabel( painter->font(), value ); if ( lbl.isEmpty() ) return; QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( painter->font() ); const QTransform transform = labelTransformation( pos, labelSize ); painter->save(); painter->setWorldTransform( transform, true ); lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); painter->restore(); } /*! \brief Find the bounding rectangle for the label. The coordinates of the rectangle are absolute ( calculated from pos() ). in direction of the tick. \param font Font used for painting \param value Value \return Bounding rectangle \sa labelRect() */ QRect QwtScaleDraw::boundingLabelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRect(); const QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); return transform.mapRect( QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); } /*! Calculate the transformation that is needed to paint a label depending on its alignment and rotation. \param pos Position where to paint the label \param size Size of the label \return Transformation matrix \sa setLabelAlignment(), setLabelRotation() */ QTransform QwtScaleDraw::labelTransformation( const QPointF &pos, const QSizeF &size ) const { QTransform transform; transform.translate( pos.x(), pos.y() ); transform.rotate( labelRotation() ); int flags = labelAlignment(); if ( flags == 0 ) { switch ( alignment() ) { case RightScale: { if ( flags == 0 ) flags = Qt::AlignRight | Qt::AlignVCenter; break; } case LeftScale: { if ( flags == 0 ) flags = Qt::AlignLeft | Qt::AlignVCenter; break; } case BottomScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignBottom; break; } case TopScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignTop; break; } } } double x, y; if ( flags & Qt::AlignLeft ) x = -size.width(); else if ( flags & Qt::AlignRight ) x = 0.0; else // Qt::AlignHCenter x = -( 0.5 * size.width() ); if ( flags & Qt::AlignTop ) y = -size.height(); else if ( flags & Qt::AlignBottom ) y = 0; else // Qt::AlignVCenter y = -( 0.5 * size.height() ); transform.translate( x, y ); return transform; } /*! Find the bounding rectangle for the label. The coordinates of the rectangle are relative to spacing + tick length from the backbone in direction of the tick. \param font Font used for painting \param value Value \return Bounding rectangle that is needed to draw a label */ QRectF QwtScaleDraw::labelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRectF( 0.0, 0.0, 0.0, 0.0 ); const QPointF pos = labelPosition( value ); const QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); QRectF br = transform.mapRect( QRectF( QPointF( 0, 0 ), labelSize ) ); br.translate( -pos.x(), -pos.y() ); return br; } /*! Calculate the size that is needed to draw a label \param font Label font \param value Value \return Size that is needed to draw a label */ QSizeF QwtScaleDraw::labelSize( const QFont &font, double value ) const { return labelRect( font, value ).size(); } /*! Rotate all labels. When changing the rotation, it might be necessary to adjust the label flags too. Finding a useful combination is often the result of try and error. \param rotation Angle in degrees. When changing the label rotation, the label flags often needs to be adjusted too. \sa setLabelAlignment(), labelRotation(), labelAlignment(). */ void QwtScaleDraw::setLabelRotation( double rotation ) { d_data->labelRotation = rotation; } /*! \return the label rotation \sa setLabelRotation(), labelAlignment() */ double QwtScaleDraw::labelRotation() const { return d_data->labelRotation; } /*! \brief Change the label flags Labels are aligned to the point tick length + spacing away from the backbone. The alignment is relative to the orientation of the label text. In case of an flags of 0 the label will be aligned depending on the orientation of the scale: QwtScaleDraw::TopScale: Qt::AlignHCenter | Qt::AlignTop\n QwtScaleDraw::BottomScale: Qt::AlignHCenter | Qt::AlignBottom\n QwtScaleDraw::LeftScale: Qt::AlignLeft | Qt::AlignVCenter\n QwtScaleDraw::RightScale: Qt::AlignRight | Qt::AlignVCenter\n Changing the alignment is often necessary for rotated labels. \param alignment Or'd Qt::AlignmentFlags see \sa setLabelRotation(), labelRotation(), labelAlignment() \warning The various alignments might be confusing. The alignment of the label is not the alignment of the scale and is not the alignment of the flags ( QwtText::flags() ) returned from QwtAbstractScaleDraw::label(). */ void QwtScaleDraw::setLabelAlignment( Qt::Alignment alignment ) { d_data->labelAlignment = alignment; } /*! \return the label flags \sa setLabelAlignment(), labelRotation() */ Qt::Alignment QwtScaleDraw::labelAlignment() const { return d_data->labelAlignment; } /*! \param font Font \return the maximum width of a label */ int QwtScaleDraw::maxLabelWidth( const QFont &font ) const { double maxWidth = 0.0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const double w = labelSize( font, ticks[i] ).width(); if ( w > maxWidth ) maxWidth = w; } } return qCeil( maxWidth ); } /*! \param font Font \return the maximum height of a label */ int QwtScaleDraw::maxLabelHeight( const QFont &font ) const { double maxHeight = 0.0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const double h = labelSize( font, ticks[i] ).height(); if ( h > maxHeight ) maxHeight = h; } } return qCeil( maxHeight ); } void QwtScaleDraw::updateMap() { const QPointF pos = d_data->pos; double len = d_data->len; QwtScaleMap &sm = scaleMap(); if ( orientation() == Qt::Vertical ) sm.setPaintInterval( pos.y() + len, pos.y() ); else sm.setPaintInterval( pos.x(), pos.x() + len ); } qsstv_9.2.6/qwt/qwt_scale_draw.h0000664000175000017500000000613213203343610015412 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DRAW_H #define QWT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include #include #include /*! \brief A class for drawing scales QwtScaleDraw can be used to draw linear or logarithmic scales. A scale has a position, an alignment and a length, which can be specified . The labels can be rotated and aligned to the ticks using setLabelRotation() and setLabelAlignment(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtScaleDraw: public QwtAbstractScaleDraw { public: /*! Alignment of the scale draw \sa setAlignment(), alignment() */ enum Alignment { //! The scale is below BottomScale, //! The scale is above TopScale, //! The scale is left LeftScale, //! The scale is right RightScale }; QwtScaleDraw(); virtual ~QwtScaleDraw(); void getBorderDistHint( const QFont &, int &start, int &end ) const; int minLabelDist( const QFont & ) const; int minLength( const QFont & ) const; virtual double extent( const QFont & ) const; void move( double x, double y ); void move( const QPointF & ); void setLength( double length ); Alignment alignment() const; void setAlignment( Alignment ); Qt::Orientation orientation() const; QPointF pos() const; double length() const; void setLabelAlignment( Qt::Alignment ); Qt::Alignment labelAlignment() const; void setLabelRotation( double rotation ); double labelRotation() const; int maxLabelHeight( const QFont & ) const; int maxLabelWidth( const QFont & ) const; QPointF labelPosition( double val ) const; QRectF labelRect( const QFont &, double val ) const; QSizeF labelSize( const QFont &, double val ) const; QRect boundingLabelRect( const QFont &, double val ) const; protected: QTransform labelTransformation( const QPointF &, const QSizeF & ) const; virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtScaleDraw( const QwtScaleDraw & ); QwtScaleDraw &operator=( const QwtScaleDraw &other ); void updateMap(); class PrivateData; PrivateData *d_data; }; /*! Move the position of the scale \param x X coordinate \param y Y coordinate \sa move(const QPointF &) */ inline void QwtScaleDraw::move( double x, double y ) { move( QPointF( x, y ) ); } #endif qsstv_9.2.6/qwt/qwt_scale_engine.cpp0000664000175000017500000006705113203343610016264 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_engine.h" #include "qwt_math.h" #include "qwt_scale_map.h" #include #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif static inline double qwtLog( double base, double value ) { return log( value ) / log( base ); } static inline QwtInterval qwtLogInterval( double base, const QwtInterval &interval ) { return QwtInterval( qwtLog( base, interval.minValue() ), qwtLog( base, interval.maxValue() ) ); } static inline QwtInterval qwtPowInterval( double base, const QwtInterval &interval ) { return QwtInterval( qPow( base, interval.minValue() ), qPow( base, interval.maxValue() ) ); } #if 1 // this version often doesn't find the best ticks: f.e for 15: 5, 10 static double qwtStepSize( double intervalSize, int maxSteps, uint base ) { const double minStep = QwtScaleArithmetic::divideInterval( intervalSize, maxSteps, base ); if ( minStep != 0.0 ) { // # ticks per interval const int numTicks = qCeil( qAbs( intervalSize / minStep ) ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * qAbs( minStep ), qAbs( intervalSize ), intervalSize ) > 0 ) { // The minor steps doesn't fit into the interval return 0.5 * intervalSize; } } return minStep; } #else static double qwtStepSize( double intervalSize, int maxSteps, uint base ) { if ( maxSteps <= 0 ) return 0.0; if ( maxSteps > 2 ) { for ( int numSteps = maxSteps; numSteps > 1; numSteps-- ) { const double stepSize = intervalSize / numSteps; const double p = ::floor( ::log( stepSize ) / ::log( base ) ); const double fraction = qPow( base, p ); for ( uint n = base; n > 1; n /= 2 ) { if ( qFuzzyCompare( stepSize, n * fraction ) ) return stepSize; if ( n == 3 && ( base % 2 ) == 0 ) { if ( qFuzzyCompare( stepSize, 2 * fraction ) ) return stepSize; } } } } return intervalSize * 0.5; } #endif static const double _eps = 1.0e-6; /*! Ceil a value, relative to an interval \param value Value to be ceiled \param intervalSize Interval size \return Rounded value \sa floorEps() */ double QwtScaleArithmetic::ceilEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value - eps ) / intervalSize; return ::ceil( value ) * intervalSize; } /*! Floor a value, relative to an interval \param value Value to be floored \param intervalSize Interval size \return Rounded value \sa floorEps() */ double QwtScaleArithmetic::floorEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value + eps ) / intervalSize; return ::floor( value ) * intervalSize; } /*! \brief Divide an interval into steps \f$stepSize = (intervalSize - intervalSize * 10e^{-6}) / numSteps\f$ \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleArithmetic::divideEps( double intervalSize, double numSteps ) { if ( numSteps == 0.0 || intervalSize == 0.0 ) return 0.0; return ( intervalSize - ( _eps * intervalSize ) ) / numSteps; } /*! Calculate a step size for a given interval \param intervalSize Interval size \param numSteps Number of steps \param base Base for the division ( usually 10 ) \return Calculated step size */ double QwtScaleArithmetic::divideInterval( double intervalSize, int numSteps, uint base ) { if ( numSteps <= 0 ) return 0.0; const double v = QwtScaleArithmetic::divideEps( intervalSize, numSteps ); if ( v == 0.0 ) return 0.0; const double lx = qwtLog( base, qFabs( v ) ); const double p = ::floor( lx ); const double fraction = qPow( base, lx - p ); uint n = base; while ( ( n > 1 ) && ( fraction <= n / 2 ) ) n /= 2; double stepSize = n * qPow( base, p ); if ( v < 0 ) stepSize = -stepSize; return stepSize; } class QwtScaleEngine::PrivateData { public: PrivateData(): attributes( QwtScaleEngine::NoAttribute ), lowerMargin( 0.0 ), upperMargin( 0.0 ), referenceValue( 0.0 ), base( 10 ), transform( NULL ) { } ~PrivateData() { delete transform; } QwtScaleEngine::Attributes attributes; double lowerMargin; double upperMargin; double referenceValue; uint base; QwtTransform* transform; }; /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtScaleEngine::QwtScaleEngine( uint base ) { d_data = new PrivateData; setBase( base ); } //! Destructor QwtScaleEngine::~QwtScaleEngine () { delete d_data; } /*! Assign a transformation \param transform Transformation The transformation object is used as factory for clones that are returned by transformation() The scale engine takes ownership of the transformation. \sa QwtTransform::copy(), transformation() */ void QwtScaleEngine::setTransformation( QwtTransform *transform ) { if ( transform != d_data->transform ) { delete d_data->transform; d_data->transform = transform; } } /*! Create and return a clone of the transformation of the engine. When the engine has no special transformation NULL is returned, indicating no transformation. \return A clone of the transfomation \sa setTransformation() */ QwtTransform *QwtScaleEngine::transformation() const { QwtTransform *transform = NULL; if ( d_data->transform ) transform = d_data->transform->copy(); return transform; } /*! \return the margin at the lower end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::lowerMargin() const { return d_data->lowerMargin; } /*! \return the margin at the upper end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::upperMargin() const { return d_data->upperMargin; } /*! \brief Specify margins at the scale's endpoints \param lower minimum distance between the scale's lower boundary and the smallest enclosed value \param upper minimum distance between the scale's upper boundary and the greatest enclosed value Margins can be used to leave a minimum amount of space between the enclosed intervals and the boundaries of the scale. \warning \li QwtLogScaleEngine measures the margins in decades. \sa upperMargin(), lowerMargin() */ void QwtScaleEngine::setMargins( double lower, double upper ) { d_data->lowerMargin = qMax( lower, 0.0 ); d_data->upperMargin = qMax( upper, 0.0 ); } /*! Calculate a step size for an interval size \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleEngine::divideInterval( double intervalSize, int numSteps ) const { return QwtScaleArithmetic::divideInterval( intervalSize, numSteps, d_data->base ); } /*! Check if an interval "contains" a value \param interval Interval \param value Value \return True, when the value is inside the interval */ bool QwtScaleEngine::contains( const QwtInterval &interval, double value ) const { if ( !interval.isValid() ) return false; if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 ) return false; if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 ) return false; return true; } /*! Remove ticks from a list, that are not inside an interval \param ticks Tick list \param interval Interval \return Stripped tick list */ QList QwtScaleEngine::strip( const QList& ticks, const QwtInterval &interval ) const { if ( !interval.isValid() || ticks.count() == 0 ) return QList(); if ( contains( interval, ticks.first() ) && contains( interval, ticks.last() ) ) { return ticks; } QList strippedTicks; for ( int i = 0; i < ticks.count(); i++ ) { if ( contains( interval, ticks[i] ) ) strippedTicks += ticks[i]; } return strippedTicks; } /*! \brief Build an interval around a value In case of v == 0.0 the interval is [-0.5, 0.5], otherwide it is [0.5 * v, 1.5 * v] \param value Initial value \return Calculated interval */ QwtInterval QwtScaleEngine::buildInterval( double value ) const { const double delta = ( value == 0.0 ) ? 0.5 : qAbs( 0.5 * value ); if ( DBL_MAX - delta < value ) return QwtInterval( DBL_MAX - delta, DBL_MAX ); if ( -DBL_MAX + delta > value ) return QwtInterval( -DBL_MAX, -DBL_MAX + delta ); return QwtInterval( value - delta, value + delta ); } /*! Change a scale attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtScaleEngine::setAttribute( Attribute attribute, bool on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; } /*! \return True, if attribute is enabled. \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtScaleEngine::testAttribute( Attribute attribute ) const { return ( d_data->attributes & attribute ); } /*! Change the scale attribute \param attributes Set scale attributes \sa Attribute, attributes() */ void QwtScaleEngine::setAttributes( Attributes attributes ) { d_data->attributes = attributes; } /*! \return Scale attributes \sa Attribute, setAttributes(), testAttribute() */ QwtScaleEngine::Attributes QwtScaleEngine::attributes() const { return d_data->attributes; } /*! \brief Specify a reference point \param r new reference value The reference point is needed if options IncludeReference or Symmetric are active. Its default value is 0.0. \sa Attribute */ void QwtScaleEngine::setReference( double r ) { d_data->referenceValue = r; } /*! \return the reference value \sa setReference(), setAttribute() */ double QwtScaleEngine::reference() const { return d_data->referenceValue; } /*! Set the base of the scale engine While a base of 10 is what 99.9% of all applications need certain scales might need a different base: f.e 2 The default setting is 10 \param base Base of the engine \sa base() */ void QwtScaleEngine::setBase( uint base ) { d_data->base = qMax( base, 2U ); } /*! \return base Base of the scale engine \sa setBase() */ uint QwtScaleEngine::base() const { return d_data->base; } /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtLinearScaleEngine::QwtLinearScaleEngine( uint base ): QwtScaleEngine( base ) { } //! Destructor QwtLinearScaleEngine::~QwtLinearScaleEngine() { } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa setAttribute() */ void QwtLinearScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = QwtScaleArithmetic::divideInterval( interval.width(), qMax( maxNumSteps, 1 ), base() ); if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for an interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. \return Calculated scale division */ QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); if ( interval.width() <= 0 ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = QwtScaleArithmetic::divideInterval( interval.width(), maxMajorSteps, base() ); } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param stepSize Step size \param maxMinorSteps Maximum number of minor steps \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLinearScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinorSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinorSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinorSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { ticks[i] = strip( ticks[i], interval ); // ticks very close to 0.0 are // explicitely set to 0.0 for ( int j = 0; j < ticks[i].count(); j++ ) { if ( qwtFuzzyCompare( ticks[i][j], 0.0, stepSize ) == 0 ) ticks[i][j] = 0.0; } } } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLinearScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { int numTicks = qRound( interval.width() / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += interval.minValue() + i * stepSize; ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLinearScaleEngine::buildMinorTicks( const QList& majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { double minStep = qwtStepSize( stepSize, maxMinorSteps, base() ); if ( minStep == 0.0 ) return; // # ticks per interval const int numTicks = qCeil( qAbs( stepSize / minStep ) ) - 1; int medIndex = -1; if ( numTicks % 2 ) medIndex = numTicks / 2; // calculate minor ticks for ( int i = 0; i < majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < numTicks; k++ ) { val += minStep; double alignedValue = val; if ( qwtFuzzyCompare( val, 0.0, stepSize ) == 0 ) alignedValue = 0.0; if ( k == medIndex ) mediumTicks += alignedValue; else minorTicks += alignedValue; } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLinearScaleEngine::align( const QwtInterval &interval, double stepSize ) const { double x1 = interval.minValue(); double x2 = interval.maxValue(); if ( -DBL_MAX + stepSize <= x1 ) { const double x = QwtScaleArithmetic::floorEps( x1, stepSize ); if ( qwtFuzzyCompare( x1, x, stepSize ) != 0 ) x1 = x; } if ( DBL_MAX - stepSize >= x2 ) { const double x = QwtScaleArithmetic::ceilEps( x2, stepSize ); if ( qwtFuzzyCompare( x2, x, stepSize ) != 0 ) x2 = x; } return QwtInterval( x1, x2 ); } /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtLogScaleEngine::QwtLogScaleEngine( uint base ): QwtScaleEngine( base ) { setTransformation( new QwtLogTransform() ); } //! Destructor QwtLogScaleEngine::~QwtLogScaleEngine() { } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtLogScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { if ( x1 > x2 ) qSwap( x1, x2 ); const double logBase = base(); QwtInterval interval( x1 / qPow( logBase, lowerMargin() ), x2 * qPow( logBase, upperMargin() ) ); if ( interval.maxValue() / interval.minValue() < logBase ) { // scale width is less than one step -> try to build a linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); linearScaler.autoScale( maxNumSteps, x1, x2, stepSize ); QwtInterval linearInterval = QwtInterval( x1, x2 ).normalized(); linearInterval = linearInterval.limited( LOG_MIN, LOG_MAX ); if ( linearInterval.maxValue() / linearInterval.minValue() < logBase ) { // the aligned scale is still less than one step if ( stepSize < 0.0 ) stepSize = -qwtLog( logBase, qAbs( stepSize ) ); else stepSize = qwtLog( logBase, stepSize ); return; } } double logRef = 1.0; if ( reference() > LOG_MIN / 2 ) logRef = qMin( reference(), LOG_MAX / 2 ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) { const double delta = qMax( interval.maxValue() / logRef, logRef / interval.minValue() ); interval.setInterval( logRef / delta, logRef * delta ); } if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( logRef ); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( qwtLogInterval( logBase, interval ).width(), qMax( maxNumSteps, 1 ) ); if ( stepSize < 1.0 ) stepSize = 1.0; if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for an interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. \return Calculated scale division */ QwtScaleDiv QwtLogScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() <= 0 ) return QwtScaleDiv(); const double logBase = base(); if ( interval.maxValue() / interval.minValue() < logBase ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); if ( stepSize != 0.0 ) { if ( stepSize < 0.0 ) stepSize = -qPow( logBase, -stepSize ); else stepSize = qPow( logBase, stepSize ); } return linearScaler.divideScale( x1, x2, maxMajorSteps, maxMinorSteps, stepSize ); } stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = divideInterval( qwtLogInterval( logBase, interval ).width(), maxMajorSteps ); if ( stepSize < 1.0 ) stepSize = 1.0; // major step must be >= 1 decade } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLogScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinorSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinorSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinorSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = strip( ticks[i], interval ); } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLogScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { double width = qwtLogInterval( base(), interval ).width(); int numTicks = qRound( width / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; const double lxmin = ::log( interval.minValue() ); const double lxmax = ::log( interval.maxValue() ); const double lstep = ( lxmax - lxmin ) / double( numTicks - 1 ); QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += qExp( lxmin + double( i ) * lstep ); ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLogScaleEngine::buildMinorTicks( const QList &majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { const double logBase = base(); if ( stepSize < 1.1 ) // major step width is one base { double minStep = divideInterval( stepSize, maxMinorSteps + 1 ); if ( minStep == 0.0 ) return; const int numSteps = qRound( stepSize / minStep ); int mediumTickIndex = -1; if ( ( numSteps > 2 ) && ( numSteps % 2 == 0 ) ) mediumTickIndex = numSteps / 2; for ( int i = 0; i < majorTicks.count() - 1; i++ ) { const double v = majorTicks[i]; const double s = logBase / numSteps; if ( s >= 1.0 ) { for ( int j = 2; j < numSteps; j++ ) { minorTicks += v * j * s; } } else { for ( int j = 1; j < numSteps; j++ ) { const double tick = v + j * v * ( logBase - 1 ) / numSteps; if ( j == mediumTickIndex ) mediumTicks += tick; else minorTicks += tick; } } } } else { double minStep = divideInterval( stepSize, maxMinorSteps ); if ( minStep == 0.0 ) return; if ( minStep < 1.0 ) minStep = 1.0; // # subticks per interval int numTicks = qRound( stepSize / minStep ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * minStep, stepSize, stepSize ) > 0 ) { numTicks = 0; } if ( numTicks < 1 ) return; int mediumTickIndex = -1; if ( ( numTicks > 2 ) && ( numTicks % 2 ) ) mediumTickIndex = numTicks / 2; // substep factor = base^substeps const qreal minFactor = qMax( qPow( logBase, minStep ), qreal( logBase ) ); for ( int i = 0; i < majorTicks.count(); i++ ) { double tick = majorTicks[i]; for ( int j = 0; j < numTicks; j++ ) { tick *= minFactor; if ( j == mediumTickIndex ) mediumTicks += tick; else minorTicks += tick; } } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLogScaleEngine::align( const QwtInterval &interval, double stepSize ) const { const QwtInterval intv = qwtLogInterval( base(), interval ); double x1 = QwtScaleArithmetic::floorEps( intv.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( intv.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return qwtPowInterval( base(), QwtInterval( x1, x2 ) ); } qsstv_9.2.6/qwt/qwt_scale_engine.h0000664000175000017500000001424113203343610015722 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_ENGINE_H #define QWT_SCALE_ENGINE_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_interval.h" class QwtTransform; /*! \brief Arithmetic including a tolerance */ class QWT_EXPORT QwtScaleArithmetic { public: static double ceilEps( double value, double intervalSize ); static double floorEps( double value, double intervalSize ); static double divideEps( double interval, double steps ); static double divideInterval( double interval, int numSteps, uint base ); }; /*! \brief Base class for scale engines. A scale engine tries to find "reasonable" ranges and step sizes for scales. The layout of the scale can be varied with setAttribute(). Qwt offers implementations for logarithmic and linear scales. */ class QWT_EXPORT QwtScaleEngine { public: /*! Layout attributes \sa setAttribute(), testAttribute(), reference(), lowerMargin(), upperMargin() */ enum Attribute { //! No attributes NoAttribute = 0x00, //! Build a scale which includes the reference() value. IncludeReference = 0x01, //! Build a scale which is symmetric to the reference() value. Symmetric = 0x02, /*! The endpoints of the scale are supposed to be equal the outmost included values plus the specified margins (see setMargins()). If this attribute is *not* set, the endpoints of the scale will be integer multiples of the step size. */ Floating = 0x04, //! Turn the scale upside down. Inverted = 0x08 }; //! Layout attributes typedef QFlags Attributes; explicit QwtScaleEngine( uint base = 10 ); virtual ~QwtScaleEngine(); void setBase( uint base ); uint base() const; void setAttribute( Attribute, bool on = true ); bool testAttribute( Attribute ) const; void setAttributes( Attributes ); Attributes attributes() const; void setReference( double reference ); double reference() const; void setMargins( double lower, double upper ); double lowerMargin() const; double upperMargin() const; /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Return value) */ virtual void autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const = 0; /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0.0, the scaleEngine calculates one. \return Calculated scale division */ virtual QwtScaleDiv divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize = 0.0 ) const = 0; void setTransformation( QwtTransform * ); QwtTransform *transformation() const; protected: bool contains( const QwtInterval &, double val ) const; QList strip( const QList&, const QwtInterval & ) const; double divideInterval( double interval, int numSteps ) const; QwtInterval buildInterval( double v ) const; private: class PrivateData; PrivateData *d_data; }; /*! \brief A scale engine for linear scales The step size will fit into the pattern \f$\left\{ 1,2,5\right\} \cdot 10^{n}\f$, where n is an integer. */ class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine { public: QwtLinearScaleEngine( uint base = 10 ); virtual ~QwtLinearScaleEngine(); virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; protected: QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; void buildMinorTicks( const QList& majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const; }; /*! \brief A scale engine for logarithmic scales The step size is measured in *decades* and the major step size will be adjusted to fit the pattern \f$\left\{ 1,2,3,5\right\} \cdot 10^{n}\f$, where n is a natural number including zero. \warning the step size as well as the margins are measured in *decades*. */ class QWT_EXPORT QwtLogScaleEngine: public QwtScaleEngine { public: QwtLogScaleEngine( uint base = 10 ); virtual ~QwtLogScaleEngine(); virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; protected: QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; void buildMinorTicks( const QList& majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleEngine::Attributes ) #endif qsstv_9.2.6/qwt/qwt_scale_map.cpp0000664000175000017500000001275113203343610015571 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_map.h" #include "qwt_math.h" #include #include /*! \brief Constructor The scale and paint device intervals are both set to [0,1]. */ QwtScaleMap::QwtScaleMap(): d_s1( 0.0 ), d_s2( 1.0 ), d_p1( 0.0 ), d_p2( 1.0 ), d_cnv( 1.0 ), d_ts1( 0.0 ), d_transform( NULL ) { } //! Copy constructor QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ): d_s1( other.d_s1 ), d_s2( other.d_s2 ), d_p1( other.d_p1 ), d_p2( other.d_p2 ), d_cnv( other.d_cnv ), d_ts1( other.d_ts1 ), d_transform( NULL ) { if ( other.d_transform ) d_transform = other.d_transform->copy(); } /*! Destructor */ QwtScaleMap::~QwtScaleMap() { delete d_transform; } //! Assignment operator QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other ) { d_s1 = other.d_s1; d_s2 = other.d_s2; d_p1 = other.d_p1; d_p2 = other.d_p2; d_cnv = other.d_cnv; d_ts1 = other.d_ts1; delete d_transform; d_transform = NULL; if ( other.d_transform ) d_transform = other.d_transform->copy(); return *this; } /*! Initialize the map with a transformation */ void QwtScaleMap::setTransformation( QwtTransform *transform ) { if ( transform != d_transform ) { delete d_transform; d_transform = transform; } setScaleInterval( d_s1, d_s2 ); } //! Get the transformation const QwtTransform *QwtScaleMap::transformation() const { return d_transform; } /*! \brief Specify the borders of the scale interval \param s1 first border \param s2 second border \warning scales might be aligned to transformation depending boundaries */ void QwtScaleMap::setScaleInterval( double s1, double s2 ) { d_s1 = s1; d_s2 = s2; if ( d_transform ) { d_s1 = d_transform->bounded( d_s1 ); d_s2 = d_transform->bounded( d_s2 ); } updateFactor(); } /*! \brief Specify the borders of the paint device interval \param p1 first border \param p2 second border */ void QwtScaleMap::setPaintInterval( double p1, double p2 ) { d_p1 = p1; d_p2 = p2; updateFactor(); } void QwtScaleMap::updateFactor() { d_ts1 = d_s1; double ts2 = d_s2; if ( d_transform ) { d_ts1 = d_transform->transform( d_ts1 ); ts2 = d_transform->transform( ts2 ); } d_cnv = 1.0; if ( d_ts1 != ts2 ) d_cnv = ( d_p2 - d_p1 ) / ( ts2 - d_ts1 ); } /*! Transform a rectangle from scale to paint coordinates \param xMap X map \param yMap Y map \param rect Rectangle in scale coordinates \return Rectangle in paint coordinates \sa invTransform() */ QRectF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { double x1 = xMap.transform( rect.left() ); double x2 = xMap.transform( rect.right() ); double y1 = yMap.transform( rect.top() ); double y2 = yMap.transform( rect.bottom() ); if ( x2 < x1 ) qSwap( x1, x2 ); if ( y2 < y1 ) qSwap( y1, y2 ); if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 ) x1 = 0.0; if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 ) x2 = 0.0; if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 ) y1 = 0.0; if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 ) y2 = 0.0; return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param pos Position in paint coordinates \return Position in scale coordinates \sa transform() */ QPointF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QPointF &pos ) { return QPointF( xMap.invTransform( pos.x() ), yMap.invTransform( pos.y() ) ); } /*! Transform a point from scale to paint coordinates \param xMap X map \param yMap Y map \param pos Position in scale coordinates \return Position in paint coordinates \sa invTransform() */ QPointF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QPointF &pos ) { return QPointF( xMap.transform( pos.x() ), yMap.transform( pos.y() ) ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param rect Rectangle in paint coordinates \return Rectangle in scale coordinates \sa transform() */ QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { const double x1 = xMap.invTransform( rect.left() ); const double x2 = xMap.invTransform( rect.right() - 1 ); const double y1 = yMap.invTransform( rect.top() ); const double y2 = yMap.invTransform( rect.bottom() - 1 ); const QRectF r( x1, y1, x2 - x1, y2 - y1 ); return r.normalized(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleMap &map ) { debug.nospace() << "QwtScaleMap(" << map.transformation() << ", s:" << map.s1() << "->" << map.s2() << ", p:" << map.p1() << "->" << map.p2() << ")"; return debug.space(); } #endif qsstv_9.2.6/qwt/qwt_scale_map.h0000664000175000017500000000730113203343610015231 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_MAP_H #define QWT_SCALE_MAP_H #include "qwt_global.h" #include "qwt_transform.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif class QRectF; /*! \brief A scale map QwtScaleMap offers transformations from the coordinate system of a scale into the linear coordinate system of a paint device and vice versa. */ class QWT_EXPORT QwtScaleMap { public: QwtScaleMap(); QwtScaleMap( const QwtScaleMap& ); ~QwtScaleMap(); QwtScaleMap &operator=( const QwtScaleMap & ); void setTransformation( QwtTransform * ); const QwtTransform *transformation() const; void setPaintInterval( double p1, double p2 ); void setScaleInterval( double s1, double s2 ); double transform( double s ) const; double invTransform( double p ) const; double p1() const; double p2() const; double s1() const; double s2() const; double pDist() const; double sDist() const; static QRectF transform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QRectF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QPointF transform( const QwtScaleMap &, const QwtScaleMap &, const QPointF & ); static QPointF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QPointF & ); bool isInverting() const; private: void updateFactor(); double d_s1, d_s2; // scale interval boundaries double d_p1, d_p2; // paint device interval boundaries double d_cnv; // conversion factor double d_ts1; QwtTransform *d_transform; }; /*! \return First border of the scale interval */ inline double QwtScaleMap::s1() const { return d_s1; } /*! \return Second border of the scale interval */ inline double QwtScaleMap::s2() const { return d_s2; } /*! \return First border of the paint interval */ inline double QwtScaleMap::p1() const { return d_p1; } /*! \return Second border of the paint interval */ inline double QwtScaleMap::p2() const { return d_p2; } /*! \return qwtAbs(p2() - p1()) */ inline double QwtScaleMap::pDist() const { return qAbs( d_p2 - d_p1 ); } /*! \return qwtAbs(s2() - s1()) */ inline double QwtScaleMap::sDist() const { return qAbs( d_s2 - d_s1 ); } /*! Transform a point related to the scale interval into an point related to the interval of the paint device \param s Value relative to the coordinates of the scale \return Transformed value \sa invTransform() */ inline double QwtScaleMap::transform( double s ) const { if ( d_transform ) s = d_transform->transform( s ); return d_p1 + ( s - d_ts1 ) * d_cnv; } /*! Transform an paint device value into a value in the interval of the scale. \param p Value relative to the coordinates of the paint device \return Transformed value \sa transform() */ inline double QwtScaleMap::invTransform( double p ) const { double s = d_ts1 + ( p - d_p1 ) / d_cnv; if ( d_transform ) s = d_transform->invTransform( s ); return s; } //! \return True, when ( p1() < p2() ) != ( s1() < s2() ) inline bool QwtScaleMap::isInverting() const { return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) ); } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & ); #endif #endif qsstv_9.2.6/qwt/qwt_scale_widget.cpp0000664000175000017500000005420013203343610016272 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_widget.h" #include "qwt_painter.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_scale_div.h" #include "qwt_text.h" #include "qwt_scale_engine.h" #include #include #include #include #include class QwtScaleWidget::PrivateData { public: PrivateData(): scaleDraw( NULL ) { colorBar.colorMap = NULL; } ~PrivateData() { delete scaleDraw; delete colorBar.colorMap; } QwtScaleDraw *scaleDraw; int borderDist[2]; int minBorderDist[2]; int scaleLength; int margin; int titleOffset; int spacing; QwtText title; QwtScaleWidget::LayoutFlags layoutFlags; struct t_colorBar { bool isEnabled; int width; QwtInterval interval; QwtColorMap *colorMap; } colorBar; }; /*! \brief Create a scale with the position QwtScaleWidget::Left \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QWidget *parent ): QWidget( parent ) { initScale( QwtScaleDraw::LeftScale ); } /*! \brief Constructor \param align Alignment. \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QwtScaleDraw::Alignment align, QWidget *parent ): QWidget( parent ) { initScale( align ); } //! Destructor QwtScaleWidget::~QwtScaleWidget() { delete d_data; } //! Initialize the scale void QwtScaleWidget::initScale( QwtScaleDraw::Alignment align ) { d_data = new PrivateData; d_data->layoutFlags = 0; if ( align == QwtScaleDraw::RightScale ) d_data->layoutFlags |= TitleInverted; d_data->borderDist[0] = 0; d_data->borderDist[1] = 0; d_data->minBorderDist[0] = 0; d_data->minBorderDist[1] = 0; d_data->margin = 4; d_data->titleOffset = 0; d_data->spacing = 2; d_data->scaleDraw = new QwtScaleDraw; d_data->scaleDraw->setAlignment( align ); d_data->scaleDraw->setLength( 10 ); d_data->scaleDraw->setScaleDiv( QwtLinearScaleEngine().divideScale( 0.0, 100.0, 10, 5 ) ); d_data->colorBar.colorMap = new QwtLinearColorMap(); d_data->colorBar.isEnabled = false; d_data->colorBar.width = 10; const int flags = Qt::AlignHCenter | Qt::TextExpandTabs | Qt::TextWordWrap; d_data->title.setRenderFlags( flags ); d_data->title.setFont( font() ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } /*! Toggle an layout flag \param flag Layout flag \param on true/false \sa testLayoutFlag(), LayoutFlag */ void QwtScaleWidget::setLayoutFlag( LayoutFlag flag, bool on ) { if ( ( ( d_data->layoutFlags & flag ) != 0 ) != on ) { if ( on ) d_data->layoutFlags |= flag; else d_data->layoutFlags &= ~flag; } } /*! Test a layout flag \param flag Layout flag \return true/false \sa setLayoutFlag(), LayoutFlag */ bool QwtScaleWidget::testLayoutFlag( LayoutFlag flag ) const { return ( d_data->layoutFlags & flag ); } /*! Give title new text contents \param title New title \sa title(), setTitle(const QwtText &); */ void QwtScaleWidget::setTitle( const QString &title ) { if ( d_data->title.text() != title ) { d_data->title.setText( title ); layoutScale(); } } /*! Give title new text contents \param title New title \sa title() \warning The title flags are interpreted in direction of the label, AlignTop, AlignBottom can't be set as the title will always be aligned to the scale. */ void QwtScaleWidget::setTitle( const QwtText &title ) { QwtText t = title; const int flags = title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom ); t.setRenderFlags( flags ); if ( t != d_data->title ) { d_data->title = t; layoutScale(); } } /*! Change the alignment \param alignment New alignment \sa alignment() */ void QwtScaleWidget::setAlignment( QwtScaleDraw::Alignment alignment ) { if ( d_data->scaleDraw ) d_data->scaleDraw->setAlignment( alignment ); if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } layoutScale(); } /*! \return position \sa setPosition() */ QwtScaleDraw::Alignment QwtScaleWidget::alignment() const { if ( !scaleDraw() ) return QwtScaleDraw::LeftScale; return scaleDraw()->alignment(); } /*! Specify distances of the scale's endpoints from the widget's borders. The actual borders will never be less than minimum border distance. \param dist1 Left or top Distance \param dist2 Right or bottom distance \sa borderDist() */ void QwtScaleWidget::setBorderDist( int dist1, int dist2 ) { if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] ) { d_data->borderDist[0] = dist1; d_data->borderDist[1] = dist2; layoutScale(); } } /*! \brief Specify the margin to the colorBar/base line. \param margin Margin \sa margin() */ void QwtScaleWidget::setMargin( int margin ) { margin = qMax( 0, margin ); if ( margin != d_data->margin ) { d_data->margin = margin; layoutScale(); } } /*! \brief Specify the distance between color bar, scale and title \param spacing Spacing \sa spacing() */ void QwtScaleWidget::setSpacing( int spacing ) { spacing = qMax( 0, spacing ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; layoutScale(); } } /*! \brief Change the alignment for the labels. \sa QwtScaleDraw::setLabelAlignment(), setLabelRotation() */ void QwtScaleWidget::setLabelAlignment( Qt::Alignment alignment ) { d_data->scaleDraw->setLabelAlignment( alignment ); layoutScale(); } /*! \brief Change the rotation for the labels. See QwtScaleDraw::setLabelRotation(). \param rotation Rotation \sa QwtScaleDraw::setLabelRotation(), setLabelFlags() */ void QwtScaleWidget::setLabelRotation( double rotation ) { d_data->scaleDraw->setLabelRotation( rotation ); layoutScale(); } /*! Set a scale draw scaleDraw has to be created with new and will be deleted in ~QwtScaleWidget() or the next call of setScaleDraw(). scaleDraw will be initialized with the attributes of the previous scaleDraw object. \param scaleDraw ScaleDraw object \sa scaleDraw() */ void QwtScaleWidget::setScaleDraw( QwtScaleDraw *scaleDraw ) { if ( ( scaleDraw == NULL ) || ( scaleDraw == d_data->scaleDraw ) ) return; const QwtScaleDraw* sd = d_data->scaleDraw; if ( sd ) { scaleDraw->setAlignment( sd->alignment() ); scaleDraw->setScaleDiv( sd->scaleDiv() ); QwtTransform *transform = NULL; if ( sd->scaleMap().transformation() ) transform = sd->scaleMap().transformation()->copy(); scaleDraw->setTransformation( transform ); } delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; layoutScale(); } /*! \return scaleDraw of this scale \sa setScaleDraw(), QwtScaleDraw::setScaleDraw() */ const QwtScaleDraw *QwtScaleWidget::scaleDraw() const { return d_data->scaleDraw; } /*! \return scaleDraw of this scale \sa QwtScaleDraw::setScaleDraw() */ QwtScaleDraw *QwtScaleWidget::scaleDraw() { return d_data->scaleDraw; } /*! \return title \sa setTitle() */ QwtText QwtScaleWidget::title() const { return d_data->title; } /*! \return start border distance \sa setBorderDist() */ int QwtScaleWidget::startBorderDist() const { return d_data->borderDist[0]; } /*! \return end border distance \sa setBorderDist() */ int QwtScaleWidget::endBorderDist() const { return d_data->borderDist[1]; } /*! \return margin \sa setMargin() */ int QwtScaleWidget::margin() const { return d_data->margin; } /*! \return distance between scale and title \sa setMargin() */ int QwtScaleWidget::spacing() const { return d_data->spacing; } /*! \brief paintEvent */ void QwtScaleWidget::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); draw( &painter ); } /*! \brief draw the scale */ void QwtScaleWidget::draw( QPainter *painter ) const { d_data->scaleDraw->draw( painter, palette() ); if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 && d_data->colorBar.interval.isValid() ) { drawColorBar( painter, colorBarRect( contentsRect() ) ); } QRect r = contentsRect(); if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { r.setLeft( r.left() + d_data->borderDist[0] ); r.setWidth( r.width() - d_data->borderDist[1] ); } else { r.setTop( r.top() + d_data->borderDist[0] ); r.setHeight( r.height() - d_data->borderDist[1] ); } if ( !d_data->title.isEmpty() ) drawTitle( painter, d_data->scaleDraw->alignment(), r ); } /*! Calculate the the rectangle for the color bar \param rect Bounding rectangle for all components of the scale \return Rectangle for the color bar */ QRectF QwtScaleWidget::colorBarRect( const QRectF& rect ) const { QRectF cr = rect; if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { cr.setLeft( cr.left() + d_data->borderDist[0] ); cr.setWidth( cr.width() - d_data->borderDist[1] + 1 ); } else { cr.setTop( cr.top() + d_data->borderDist[0] ); cr.setHeight( cr.height() - d_data->borderDist[1] + 1 ); } switch ( d_data->scaleDraw->alignment() ) { case QwtScaleDraw::LeftScale: { cr.setLeft( cr.right() - d_data->margin - d_data->colorBar.width ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::RightScale: { cr.setLeft( cr.left() + d_data->margin ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::BottomScale: { cr.setTop( cr.top() + d_data->margin ); cr.setHeight( d_data->colorBar.width ); break; } case QwtScaleDraw::TopScale: { cr.setTop( cr.bottom() - d_data->margin - d_data->colorBar.width ); cr.setHeight( d_data->colorBar.width ); break; } } return cr; } /*! Event handler for resize events \param event Resize event */ void QwtScaleWidget::resizeEvent( QResizeEvent *event ) { Q_UNUSED( event ); layoutScale( false ); } /*! Recalculate the scale's geometry and layout based on the current geometry and fonts. \param update_geometry Notify the layout system and call update to redraw the scale */ void QwtScaleWidget::layoutScale( bool update_geometry ) { int bd0, bd1; getBorderDistHint( bd0, bd1 ); if ( d_data->borderDist[0] > bd0 ) bd0 = d_data->borderDist[0]; if ( d_data->borderDist[1] > bd1 ) bd1 = d_data->borderDist[1]; int colorBarWidth = 0; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) colorBarWidth = d_data->colorBar.width + d_data->spacing; const QRectF r = contentsRect(); double x, y, length; if ( d_data->scaleDraw->orientation() == Qt::Vertical ) { y = r.top() + bd0; length = r.height() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::LeftScale ) x = r.right() - 1.0 - d_data->margin - colorBarWidth; else x = r.left() + d_data->margin + colorBarWidth; } else { x = r.left() + bd0; length = r.width() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::BottomScale ) y = r.top() + d_data->margin + colorBarWidth; else y = r.bottom() - 1.0 - d_data->margin - colorBarWidth; } d_data->scaleDraw->move( x, y ); d_data->scaleDraw->setLength( length ); const int extent = qCeil( d_data->scaleDraw->extent( font() ) ); d_data->titleOffset = d_data->margin + d_data->spacing + colorBarWidth + extent; if ( update_geometry ) { updateGeometry(); update(); } } /*! Draw the color bar of the scale widget \param painter Painter \param rect Bounding rectangle for the color bar \sa setColorBarEnabled() */ void QwtScaleWidget::drawColorBar( QPainter *painter, const QRectF& rect ) const { if ( !d_data->colorBar.interval.isValid() ) return; const QwtScaleDraw* sd = d_data->scaleDraw; QwtPainter::drawColorBar( painter, *d_data->colorBar.colorMap, d_data->colorBar.interval.normalized(), sd->scaleMap(), sd->orientation(), rect ); } /*! Rotate and paint a title according to its position into a given rectangle. \param painter Painter \param align Alignment \param rect Bounding rectangle */ void QwtScaleWidget::drawTitle( QPainter *painter, QwtScaleDraw::Alignment align, const QRectF &rect ) const { QRectF r = rect; double angle; int flags = d_data->title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter ); switch ( align ) { case QwtScaleDraw::LeftScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left(), r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::RightScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left() + d_data->titleOffset, r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::BottomScale: angle = 0.0; flags |= Qt::AlignBottom; r.setTop( r.top() + d_data->titleOffset ); break; case QwtScaleDraw::TopScale: default: angle = 0.0; flags |= Qt::AlignTop; r.setBottom( r.bottom() - d_data->titleOffset ); break; } if ( d_data->layoutFlags & TitleInverted ) { if ( align == QwtScaleDraw::LeftScale || align == QwtScaleDraw::RightScale ) { angle = -angle; r.setRect( r.x() + r.height(), r.y() - r.width(), r.width(), r.height() ); } } painter->save(); painter->setFont( font() ); painter->setPen( palette().color( QPalette::Text ) ); painter->translate( r.x(), r.y() ); if ( angle != 0.0 ) painter->rotate( angle ); QwtText title = d_data->title; title.setRenderFlags( flags ); title.draw( painter, QRectF( 0.0, 0.0, r.width(), r.height() ) ); painter->restore(); } /*! \brief Notify a change of the scale This virtual function can be overloaded by derived classes. The default implementation updates the geometry and repaints the widget. */ void QwtScaleWidget::scaleChange() { layoutScale(); } /*! \return a size hint */ QSize QwtScaleWidget::sizeHint() const { return minimumSizeHint(); } /*! \return a minimum size hint */ QSize QwtScaleWidget::minimumSizeHint() const { const Qt::Orientation o = d_data->scaleDraw->orientation(); // Border Distance cannot be less than the scale borderDistHint // Note, the borderDistHint is already included in minHeight/minWidth int length = 0; int mbd1, mbd2; getBorderDistHint( mbd1, mbd2 ); length += qMax( 0, d_data->borderDist[0] - mbd1 ); length += qMax( 0, d_data->borderDist[1] - mbd2 ); length += d_data->scaleDraw->minLength( font() ); int dim = dimForLength( length, font() ); if ( length < dim ) { // compensate for long titles length = dim; dim = dimForLength( length, font() ); } QSize size( length + 2, dim ); if ( o == Qt::Vertical ) size.transpose(); int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); return size + QSize( left + right, top + bottom ); } /*! \brief Find the height of the title for a given width. \param width Width \return height Height */ int QwtScaleWidget::titleHeightForWidth( int width ) const { return qCeil( d_data->title.heightForWidth( width, font() ) ); } /*! \brief Find the minimum dimension for a given length. dim is the height, length the width seen in direction of the title. \param length width for horizontal, height for vertical scales \param scaleFont Font of the scale \return height for horizontal, width for vertical scales */ int QwtScaleWidget::dimForLength( int length, const QFont &scaleFont ) const { const int extent = qCeil( d_data->scaleDraw->extent( scaleFont ) ); int dim = d_data->margin + extent + 1; if ( !d_data->title.isEmpty() ) dim += titleHeightForWidth( length ) + d_data->spacing; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) dim += d_data->colorBar.width + d_data->spacing; return dim; } /*! \brief Calculate a hint for the border distances. This member function calculates the distance of the scale's endpoints from the widget borders which is required for the mark labels to fit into the widget. The maximum of this distance an the minimum border distance is returned. \param start Return parameter for the border width at the beginning of the scale \param end Return parameter for the border width at the end of the scale \warning
  • The minimum border distance depends on the font.
\sa setMinBorderDist(), getMinBorderDist(), setBorderDist() */ void QwtScaleWidget::getBorderDistHint( int &start, int &end ) const { d_data->scaleDraw->getBorderDistHint( font(), start, end ); if ( start < d_data->minBorderDist[0] ) start = d_data->minBorderDist[0]; if ( end < d_data->minBorderDist[1] ) end = d_data->minBorderDist[1]; } /*! Set a minimum value for the distances of the scale's endpoints from the widget borders. This is useful to avoid that the scales are "jumping", when the tick labels or their positions change often. \param start Minimum for the start border \param end Minimum for the end border \sa getMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::setMinBorderDist( int start, int end ) { d_data->minBorderDist[0] = start; d_data->minBorderDist[1] = end; } /*! Get the minimum value for the distances of the scale's endpoints from the widget borders. \param start Return parameter for the border width at the beginning of the scale \param end Return parameter for the border width at the end of the scale \sa setMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::getMinBorderDist( int &start, int &end ) const { start = d_data->minBorderDist[0]; end = d_data->minBorderDist[1]; } /*! \brief Assign a scale division The scale division determines where to set the tick marks. \param scaleDiv Scale Division \sa For more information about scale divisions, see QwtScaleDiv. */ void QwtScaleWidget::setScaleDiv( const QwtScaleDiv &scaleDiv ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->scaleDiv() != scaleDiv ) { sd->setScaleDiv( scaleDiv ); layoutScale(); Q_EMIT scaleDivChanged(); } } /*! Set the transformation \param transformation Transformation \sa QwtAbstractScaleDraw::scaleDraw(), QwtScaleMap */ void QwtScaleWidget::setTransformation( QwtTransform *transformation ) { d_data->scaleDraw->setTransformation( transformation ); layoutScale(); } /*! En/disable a color bar associated to the scale \sa isColorBarEnabled(), setColorBarWidth() */ void QwtScaleWidget::setColorBarEnabled( bool on ) { if ( on != d_data->colorBar.isEnabled ) { d_data->colorBar.isEnabled = on; layoutScale(); } } /*! \return true, when the color bar is enabled \sa setColorBarEnabled(), setColorBarWidth() */ bool QwtScaleWidget::isColorBarEnabled() const { return d_data->colorBar.isEnabled; } /*! Set the width of the color bar \param width Width \sa colorBarWidth(), setColorBarEnabled() */ void QwtScaleWidget::setColorBarWidth( int width ) { if ( width != d_data->colorBar.width ) { d_data->colorBar.width = width; if ( isColorBarEnabled() ) layoutScale(); } } /*! \return Width of the color bar \sa setColorBarEnabled(), setColorBarEnabled() */ int QwtScaleWidget::colorBarWidth() const { return d_data->colorBar.width; } /*! \return Value interval for the color bar \sa setColorMap(), colorMap() */ QwtInterval QwtScaleWidget::colorBarInterval() const { return d_data->colorBar.interval; } /*! Set the color map and value interval, that are used for displaying the color bar. \param interval Value interval \param colorMap Color map \sa colorMap(), colorBarInterval() */ void QwtScaleWidget::setColorMap( const QwtInterval &interval, QwtColorMap *colorMap ) { d_data->colorBar.interval = interval; if ( colorMap != d_data->colorBar.colorMap ) { delete d_data->colorBar.colorMap; d_data->colorBar.colorMap = colorMap; } if ( isColorBarEnabled() ) layoutScale(); } /*! \return Color map \sa setColorMap(), colorBarInterval() */ const QwtColorMap *QwtScaleWidget::colorMap() const { return d_data->colorBar.colorMap; } qsstv_9.2.6/qwt/qwt_scale_widget.h0000664000175000017500000000672713203343610015752 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_WIDGET_H #define QWT_SCALE_WIDGET_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_scale_draw.h" #include #include #include #include class QPainter; class QwtTransform; class QwtScaleDiv; class QwtColorMap; /*! \brief A Widget which contains a scale This Widget can be used to decorate composite widgets with a scale. */ class QWT_EXPORT QwtScaleWidget : public QWidget { Q_OBJECT public: //! Layout flags of the title enum LayoutFlag { /*! The title of vertical scales is painted from top to bottom. Otherwise it is painted from bottom to top. */ TitleInverted = 1 }; //! Layout flags of the title typedef QFlags LayoutFlags; explicit QwtScaleWidget( QWidget *parent = NULL ); explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL ); virtual ~QwtScaleWidget(); Q_SIGNALS: //! Signal emitted, whenever the scale division changes void scaleDivChanged(); public: void setTitle( const QString &title ); void setTitle( const QwtText &title ); QwtText title() const; void setLayoutFlag( LayoutFlag, bool on ); bool testLayoutFlag( LayoutFlag ) const; void setBorderDist( int start, int end ); int startBorderDist() const; int endBorderDist() const; void getBorderDistHint( int &start, int &end ) const; void getMinBorderDist( int &start, int &end ) const; void setMinBorderDist( int start, int end ); void setMargin( int ); int margin() const; void setSpacing( int td ); int spacing() const; void setScaleDiv( const QwtScaleDiv &sd ); void setTransformation( QwtTransform * ); void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; QwtScaleDraw *scaleDraw(); void setLabelAlignment( Qt::Alignment ); void setLabelRotation( double rotation ); void setColorBarEnabled( bool ); bool isColorBarEnabled() const; void setColorBarWidth( int ); int colorBarWidth() const; void setColorMap( const QwtInterval &, QwtColorMap * ); QwtInterval colorBarInterval() const; const QwtColorMap *colorMap() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; int titleHeightForWidth( int width ) const; int dimForLength( int length, const QFont &scaleFont ) const; void drawColorBar( QPainter *painter, const QRectF & ) const; void drawTitle( QPainter *painter, QwtScaleDraw::Alignment, const QRectF &rect ) const; void setAlignment( QwtScaleDraw::Alignment ); QwtScaleDraw::Alignment alignment() const; QRectF colorBarRect( const QRectF& ) const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); void draw( QPainter *p ) const; void scaleChange(); void layoutScale( bool update = true ); private: void initScale( QwtScaleDraw::Alignment ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleWidget::LayoutFlags ) #endif qsstv_9.2.6/qwt/qwt_series_data.cpp0000664000175000017500000002115213203343610016123 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_series_data.h" #include "qwt_math.h" static inline QRectF qwtBoundingRect( const QPointF &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPoint3D &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPointPolar &sample ) { return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample ) { return QRectF( sample.interval.minValue(), sample.value, sample.interval.maxValue() - sample.interval.minValue(), 0.0 ); } static inline QRectF qwtBoundingRect( const QwtSetSample &sample ) { double minY = sample.set[0]; double maxY = sample.set[0]; for ( int i = 1; i < sample.set.size(); i++ ) { if ( sample.set[i] < minY ) minY = sample.set[i]; if ( sample.set[i] > maxY ) maxY = sample.set[i]; } double minX = sample.value; double maxX = sample.value; return QRectF( minX, minY, maxX - minX, maxY - minY ); } static inline QRectF qwtBoundingRect( const QwtOHLCSample &sample ) { const QwtInterval interval = sample.boundingInterval(); return QRectF( interval.minValue(), sample.time, interval.width(), 0.0 ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ template QRectF qwtBoundingRectT( const QwtSeriesData& series, int from, int to ) { QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid; if ( from < 0 ) from = 0; if ( to < 0 ) to = series.size() - 1; if ( to < from ) return boundingRect; int i; for ( i = from; i <= to; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect = rect; i++; break; } } for ( ; i <= to; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) ); boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) ); boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) ); boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) ); } } return boundingRect; } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset The horizontal coordinates represent the azimuth, the vertical coordinates the radius. Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! Constructor \param samples Samples */ QwtPointSeriesData::QwtPointSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtPoint3DSeriesData::QwtPoint3DSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPoint3DSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtIntervalSeriesData::QwtIntervalSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtIntervalSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtSetSeriesData::QwtSetSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtSetSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtTradingChartData::QwtTradingChartData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtTradingChartData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } qsstv_9.2.6/qwt/qwt_series_data.h0000664000175000017500000002170413203343610015573 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_DATA_H #define QWT_SERIES_DATA_H 1 #include "qwt_global.h" #include "qwt_samples.h" #include "qwt_point_3d.h" #include "qwt_point_polar.h" #include #include /*! \brief Abstract interface for iterating over samples Qwt offers several implementations of the QwtSeriesData API, but in situations, where data of an application specific format needs to be displayed, without having to copy it, it is recommended to implement an individual data access. A subclass of QwtSeriesData must implement: - size()\n Should return number of data points. - sample()\n Should return values x and y values of the sample at specific position as QPointF object. - boundingRect()\n Should return the bounding rectangle of the data series. It is used for autoscaling and might help certain algorithms for displaying the data. You can use qwtBoundingRect() for an implementation but often it is possible to implement a more efficient algorithm depending on the characteristics of the series. The member d_boundingRect is intended for caching the calculated rectangle. */ template class QwtSeriesData { public: //! Constructor QwtSeriesData(); //! Destructor virtual ~QwtSeriesData(); //! \return Number of samples virtual size_t size() const = 0; /*! Return a sample \param i Index \return Sample at position i */ virtual T sample( size_t i ) const = 0; /*! Calculate the bounding rect of all samples The bounding rect is necessary for autoscaling and can be used for a couple of painting optimizations. qwtBoundingRect(...) offers slow implementations iterating over the samples. For large sets it is recommended to implement something faster f.e. by caching the bounding rectangle. \return Bounding rectangle */ virtual QRectF boundingRect() const = 0; /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rectangle of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). It can be used to implement different levels of details. The default implementation does nothing. \param rect Rectangle of interest */ virtual void setRectOfInterest( const QRectF &rect ); protected: //! Can be used to cache a calculated bounding rectangle mutable QRectF d_boundingRect; private: QwtSeriesData &operator=( const QwtSeriesData & ); }; template QwtSeriesData::QwtSeriesData(): d_boundingRect( 0.0, 0.0, -1.0, -1.0 ) { } template QwtSeriesData::~QwtSeriesData() { } template void QwtSeriesData::setRectOfInterest( const QRectF & ) { } /*! \brief Template class for data, that is organized as QVector QVector uses implicit data sharing and can be passed around as argument efficiently. */ template class QwtArraySeriesData: public QwtSeriesData { public: //! Constructor QwtArraySeriesData(); /*! Constructor \param samples Array of samples */ QwtArraySeriesData( const QVector &samples ); /*! Assign an array of samples \param samples Array of samples */ void setSamples( const QVector &samples ); //! \return Array of samples const QVector samples() const; //! \return Number of samples virtual size_t size() const; /*! \return Sample at a specific position \param index Index \return Sample at position index */ virtual T sample( size_t index ) const; protected: //! Vector of samples QVector d_samples; }; template QwtArraySeriesData::QwtArraySeriesData() { } template QwtArraySeriesData::QwtArraySeriesData( const QVector &samples ): d_samples( samples ) { } template void QwtArraySeriesData::setSamples( const QVector &samples ) { QwtSeriesData::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_samples = samples; } template const QVector QwtArraySeriesData::samples() const { return d_samples; } template size_t QwtArraySeriesData::size() const { return d_samples.size(); } template T QwtArraySeriesData::sample( size_t i ) const { return d_samples[ static_cast( i ) ]; } //! Interface for iterating over an array of points class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData { public: QwtPointSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of 3D points class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData { public: QwtPoint3DSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of intervals class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData { public: QwtIntervalSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of samples class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData { public: QwtSetSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; /*! Interface for iterating over an array of OHLC samples */ class QWT_EXPORT QwtTradingChartData: public QwtArraySeriesData { public: QwtTradingChartData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); /*! Binary search for a sorted series of samples qwtUpperSampleIndex returns the index of sample that is the upper bound of value. Is the the value smaller than the smallest value the return value will be 0. Is the value greater or equal than the largest value the return value will be -1. \par Example The following example shows finds a point of curve from an x coordinate \verbatim #include #include struct compareX { inline bool operator()( const double x, const QPointF &pos ) const { return ( x < pos.x() ); } }; QLineF curveLineAt( const QwtPlotCurve *curve, double x ) { int index = qwtUpperSampleIndex( *curve->data(), x, compareX() ); if ( index == -1 && x == curve->sample( curve->dataSize() - 1 ).x() ) { // the last sample is excluded from qwtUpperSampleIndex index = curve->dataSize() - 1; } QLineF line; // invalid if ( index > 0 ) { line.setP1( curve->sample( index - 1 ) ); line.setP2( curve->sample( index ) ); } return line; } \endverbatim \param series Series of samples \param value Value \param lessThan Compare operation \note The samples must be sorted according to the order specified by the lessThan object of the range [begin, end) and returns the position of the one-past-the-last occurrence of value. If no such item is found, returns the position where the item should be inserted. */ template inline int qwtUpperSampleIndex( const QwtSeriesData &series, double value, LessThan lessThan ) { const int indexMax = series.size() - 1; if ( indexMax < 0 || !lessThan( value, series.sample( indexMax ) ) ) return -1; int indexMin = 0; int n = indexMax; while ( n > 0 ) { const int half = n >> 1; const int indexMid = indexMin + half; if ( lessThan( value, series.sample( indexMid ) ) ) { n = half; } else { indexMin = indexMid + 1; n -= half + 1; } } return indexMin; } #endif qsstv_9.2.6/qwt/qwt_series_store.h0000664000175000017500000001132013203343610016007 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_STORE_H #define QWT_SERIES_STORE_H #include "qwt_global.h" #include "qwt_series_data.h" /*! \brief Bridge between QwtSeriesStore and QwtPlotSeriesItem QwtAbstractSeriesStore is an abstract interface only to make it possible to isolate the template based methods ( QwtSeriesStore ) from the regular methods ( QwtPlotSeriesItem ) to make it possible to derive from QwtPlotSeriesItem without any hassle with templates. */ class QwtAbstractSeriesStore { protected: //! Destructor virtual ~QwtAbstractSeriesStore() {} //! dataChanged() indicates, that the series has been changed. virtual void dataChanged() = 0; /*! Set a the "rectangle of interest" for the stored series \sa QwtSeriesData::setRectOfInterest() */ virtual void setRectOfInterest( const QRectF & ) = 0; //! \return Bounding rectangle of the stored series virtual QRectF dataRect() const = 0; //! \return Number of samples virtual size_t dataSize() const = 0; }; /*! \brief Class storing a QwtSeriesData object QwtSeriesStore and QwtPlotSeriesItem are intended as base classes for all plot items iterating over a series of samples. Both classes share a virtual base class ( QwtAbstractSeriesStore ) to bridge between them. QwtSeriesStore offers the template based part for the plot item API, so that QwtPlotSeriesItem can be derived without any hassle with templates. */ template class QwtSeriesStore: public virtual QwtAbstractSeriesStore { public: /*! \brief Constructor The store contains no series */ explicit QwtSeriesStore(); //! Destructor ~QwtSeriesStore(); /*! Assign a series of samples \param series Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void setData( QwtSeriesData *series ); //! \return the the series data QwtSeriesData *data(); //! \return the the series data const QwtSeriesData *data() const; /*! \param index Index \return Sample at position index */ T sample( int index ) const; /*! \return Number of samples of the series \sa setData(), QwtSeriesData::size() */ virtual size_t dataSize() const; /*! \return Bounding rectangle of the series or an invalid rectangle, when no series is stored \sa QwtSeriesData::boundingRect() */ virtual QRectF dataRect() const; /*! Set a the "rect of interest" for the series \param rect Rectangle of interest \sa QwtSeriesData::setRectOfInterest() */ virtual void setRectOfInterest( const QRectF &rect ); /*! Replace a series without deleting the previous one \param series New series \return Previously assigned series */ QwtSeriesData *swapData( QwtSeriesData *series ); private: QwtSeriesData *d_series; }; template QwtSeriesStore::QwtSeriesStore(): d_series( NULL ) { } template QwtSeriesStore::~QwtSeriesStore() { delete d_series; } template inline QwtSeriesData *QwtSeriesStore::data() { return d_series; } template inline const QwtSeriesData *QwtSeriesStore::data() const { return d_series; } template inline T QwtSeriesStore::sample( int index ) const { return d_series ? d_series->sample( index ) : T(); } template void QwtSeriesStore::setData( QwtSeriesData *series ) { if ( d_series != series ) { delete d_series; d_series = series; dataChanged(); } } template size_t QwtSeriesStore::dataSize() const { if ( d_series == NULL ) return 0; return d_series->size(); } template QRectF QwtSeriesStore::dataRect() const { if ( d_series == NULL ) return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid return d_series->boundingRect(); } template void QwtSeriesStore::setRectOfInterest( const QRectF &rect ) { if ( d_series ) d_series->setRectOfInterest( rect ); } template QwtSeriesData* QwtSeriesStore::swapData( QwtSeriesData *series ) { QwtSeriesData * swappedSeries = d_series; d_series = series; return swappedSeries; } #endif qsstv_9.2.6/qwt/qwt_slider.cpp0000664000175000017500000005572413203343610015136 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_slider.h" #include "qwt_painter.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include static QSize qwtHandleSize( const QSize &size, Qt::Orientation orientation, bool hasTrough ) { QSize handleSize = size; if ( handleSize.isEmpty() ) { const int handleThickness = 16; handleSize.setWidth( 2 * handleThickness ); handleSize.setHeight( handleThickness ); if ( !hasTrough ) handleSize.transpose(); if ( orientation == Qt::Vertical ) handleSize.transpose(); } return handleSize; } static QwtScaleDraw::Alignment qwtScaleDrawAlignment( Qt::Orientation orientation, QwtSlider::ScalePosition scalePos ) { QwtScaleDraw::Alignment align; if ( orientation == Qt::Vertical ) { // NoScale lays out like Left if ( scalePos == QwtSlider::LeadingScale ) align = QwtScaleDraw::RightScale; else align = QwtScaleDraw::LeftScale; } else { // NoScale lays out like Bottom if ( scalePos == QwtSlider::TrailingScale ) align = QwtScaleDraw::TopScale; else align = QwtScaleDraw::BottomScale; } return align; } class QwtSlider::PrivateData { public: PrivateData(): repeatTimerId( 0 ), updateInterval( 150 ), stepsIncrement( 0 ), pendingValueChange( false ), borderWidth( 2 ), spacing( 4 ), scalePosition( QwtSlider::TrailingScale ), hasTrough( true ), hasGroove( false ), mouseOffset( 0 ) { } int repeatTimerId; bool timerTick; int updateInterval; int stepsIncrement; bool pendingValueChange; QRect sliderRect; QSize handleSize; int borderWidth; int spacing; Qt::Orientation orientation; QwtSlider::ScalePosition scalePosition; bool hasTrough; bool hasGroove; int mouseOffset; mutable QSize sizeHintCache; }; /*! Construct vertical slider in QwtSlider::Trough style with a scale to the left. The scale is initialized to [0.0, 100.0] and the value set to 0.0. \param parent Parent widget \sa setOrientation(), setScalePosition(), setBackgroundStyle() */ QwtSlider::QwtSlider( QWidget *parent ): QwtAbstractSlider( parent ) { initSlider( Qt::Vertical ); } /*! Construct a slider in QwtSlider::Trough style When orientation is Qt::Vertical the scale will be aligned to the left - otherwise at the the top of the slider. The scale is initialized to [0.0, 100.0] and the value set to 0.0. \param parent Parent widget \param orientation Orientation of the slider. */ QwtSlider::QwtSlider( Qt::Orientation orientation, QWidget *parent ): QwtAbstractSlider( parent ) { initSlider( orientation ); } //! Destructor QwtSlider::~QwtSlider() { delete d_data; } void QwtSlider::initSlider( Qt::Orientation orientation ) { if ( orientation == Qt::Vertical ) setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); else setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); d_data = new QwtSlider::PrivateData; d_data->orientation = orientation; scaleDraw()->setAlignment( qwtScaleDrawAlignment( orientation, d_data->scalePosition ) ); scaleDraw()->setLength( 100 ); setScale( 0.0, 100.0 ); setValue( 0.0 ); } /*! \brief Set the orientation. \param orientation Allowed values are Qt::Horizontal and Qt::Vertical. \sa orientation(), scalePosition() */ void QwtSlider::setOrientation( Qt::Orientation orientation ) { if ( orientation == d_data->orientation ) return; d_data->orientation = orientation; scaleDraw()->setAlignment( qwtScaleDrawAlignment( orientation, d_data->scalePosition ) ); if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtSlider::orientation() const { return d_data->orientation; } /*! \brief Change the position of the scale \param scalePosition Position of the scale. \sa ScalePosition, scalePosition() */ void QwtSlider::setScalePosition( ScalePosition scalePosition ) { if ( d_data->scalePosition == scalePosition ) return; d_data->scalePosition = scalePosition; scaleDraw()->setAlignment( qwtScaleDrawAlignment( d_data->orientation, scalePosition ) ); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return Position of the scale \sa setScalePosition() */ QwtSlider::ScalePosition QwtSlider::scalePosition() const { return d_data->scalePosition; } /*! \brief Change the slider's border width The border width is used for drawing the slider handle and the trough. \param width Border width \sa borderWidth() */ void QwtSlider::setBorderWidth( int width ) { if ( width < 0 ) width = 0; if ( width != d_data->borderWidth ) { d_data->borderWidth = width; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return the border width. \sa setBorderWidth() */ int QwtSlider::borderWidth() const { return d_data->borderWidth; } /*! \brief Change the spacing between trough and scale A spacing of 0 means, that the backbone of the scale is covered by the trough. The default setting is 4 pixels. \param spacing Number of pixels \sa spacing(); */ void QwtSlider::setSpacing( int spacing ) { if ( spacing <= 0 ) spacing = 0; if ( spacing != d_data->spacing ) { d_data->spacing = spacing; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return Number of pixels between slider and scale \sa setSpacing() */ int QwtSlider::spacing() const { return d_data->spacing; } /*! \brief Set the slider's handle size When the size is empty the slider handle will be painted with a default size depending on its orientation() and backgroundStyle(). \param size New size \sa handleSize() */ void QwtSlider::setHandleSize( const QSize &size ) { if ( size != d_data->handleSize ) { d_data->handleSize = size; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return Size of the handle. \sa setHandleSize() */ QSize QwtSlider::handleSize() const { return d_data->handleSize; } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtSlider() or the next call of setScaleDraw(). \sa scaleDraw() */ void QwtSlider::setScaleDraw( QwtScaleDraw *scaleDraw ) { const QwtScaleDraw *previousScaleDraw = this->scaleDraw(); if ( scaleDraw == NULL || scaleDraw == previousScaleDraw ) return; if ( previousScaleDraw ) scaleDraw->setAlignment( previousScaleDraw->alignment() ); setAbstractScaleDraw( scaleDraw ); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ const QwtScaleDraw *QwtSlider::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ QwtScaleDraw *QwtSlider::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! Notify changed scale void QwtSlider::scaleChange() { QwtAbstractSlider::scaleChange(); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \brief Specify the update interval for automatic scrolling The minimal accepted value is 50 ms. \param interval Update interval in milliseconds \sa setUpdateInterval() */ void QwtSlider::setUpdateInterval( int interval ) { d_data->updateInterval = qMax( interval, 50 ); } /*! \return Update interval in milliseconds for automatic scrolling \sa setUpdateInterval() */ int QwtSlider::updateInterval() const { return d_data->updateInterval; } /*! Draw the slider into the specified rectangle. \param painter Painter \param sliderRect Bounding rectangle of the slider */ void QwtSlider::drawSlider( QPainter *painter, const QRect &sliderRect ) const { QRect innerRect( sliderRect ); if ( d_data->hasTrough ) { const int bw = d_data->borderWidth; innerRect = sliderRect.adjusted( bw, bw, -bw, -bw ); painter->fillRect( innerRect, palette().brush( QPalette::Mid ) ); qDrawShadePanel( painter, sliderRect, palette(), true, bw, NULL ); } const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); if ( d_data->hasGroove ) { const int slotExtent = 4; const int slotMargin = 4; QRect slotRect; if ( orientation() == Qt::Horizontal ) { int slotOffset = qMax( 1, handleSize.width() / 2 - slotMargin ); int slotHeight = slotExtent + ( innerRect.height() % 2 ); slotRect.setWidth( innerRect.width() - 2 * slotOffset ); slotRect.setHeight( slotHeight ); } else { int slotOffset = qMax( 1, handleSize.height() / 2 - slotMargin ); int slotWidth = slotExtent + ( innerRect.width() % 2 ); slotRect.setWidth( slotWidth ); slotRect.setHeight( innerRect.height() - 2 * slotOffset ); } slotRect.moveCenter( innerRect.center() ); QBrush brush = palette().brush( QPalette::Dark ); qDrawShadePanel( painter, slotRect, palette(), true, 1 , &brush ); } if ( isValid() ) drawHandle( painter, handleRect(), transform( value() ) ); } /*! Draw the thumb at a position \param painter Painter \param handleRect Bounding rectangle of the handle \param pos Position of the handle marker in widget coordinates */ void QwtSlider::drawHandle( QPainter *painter, const QRect &handleRect, int pos ) const { const int bw = d_data->borderWidth; qDrawShadePanel( painter, handleRect, palette(), false, bw, &palette().brush( QPalette::Button ) ); pos++; // shade line points one pixel below if ( orientation() == Qt::Horizontal ) { qDrawShadeLine( painter, pos, handleRect.top() + bw, pos, handleRect.bottom() - bw, palette(), true, 1 ); } else // Vertical { qDrawShadeLine( painter, handleRect.left() + bw, pos, handleRect.right() - bw, pos, palette(), true, 1 ); } } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when handleRect() contains pos \sa scrolledTo() */ bool QwtSlider::isScrollPosition( const QPoint &pos ) const { if ( handleRect().contains( pos ) ) { const double v = ( orientation() == Qt::Horizontal ) ? pos.x() : pos.y(); d_data->mouseOffset = v - transform( value() ); return true; } return false; } /*! \brief Determine the value for a new position of the slider handle. \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtSlider::scrolledTo( const QPoint &pos ) const { int p = ( orientation() == Qt::Horizontal ) ? pos.x() : pos.y(); p -= d_data->mouseOffset; int min = transform( lowerBound() ); int max = transform( upperBound() ); if ( min > max ) qSwap( min, max ); p = qBound( min, p, max ); return invTransform( p ); } /*! Mouse press event handler \param event Mouse event */ void QwtSlider::mousePressEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } const QPoint pos = event->pos(); if ( isValid() && d_data->sliderRect.contains( pos ) ) { if ( !handleRect().contains( pos ) ) { const int markerPos = transform( value() ); d_data->stepsIncrement = pageSteps(); if ( d_data->orientation == Qt::Horizontal ) { if ( pos.x() < markerPos ) d_data->stepsIncrement = -d_data->stepsIncrement; } else { if ( pos.y() < markerPos ) d_data->stepsIncrement = -d_data->stepsIncrement; } if ( isInverted() ) d_data->stepsIncrement = -d_data->stepsIncrement; d_data->timerTick = false; d_data->repeatTimerId = startTimer( qMax( 250, 2 * updateInterval() ) ); return; } } QwtAbstractSlider::mousePressEvent( event ); } /*! Mouse release event handler \param event Mouse event */ void QwtSlider::mouseReleaseEvent( QMouseEvent *event ) { if ( d_data->repeatTimerId > 0 ) { killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = 0; d_data->timerTick = false; d_data->stepsIncrement = 0; } if ( d_data->pendingValueChange ) { d_data->pendingValueChange = false; Q_EMIT valueChanged( value() ); } QwtAbstractSlider::mouseReleaseEvent( event ); } /*! Timer event handler Handles the timer, when the mouse stays pressed inside the sliderRect(). \param event Mouse event */ void QwtSlider::timerEvent( QTimerEvent *event ) { if ( event->timerId() != d_data->repeatTimerId ) { QwtAbstractSlider::timerEvent( event ); return; } if ( !isValid() ) { killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = 0; return; } const double v = value(); incrementValue( d_data->stepsIncrement ); if ( v != value() ) { if ( isTracking() ) Q_EMIT valueChanged( value() ); else d_data->pendingValueChange = true; Q_EMIT sliderMoved( value() ); } if ( !d_data->timerTick ) { // restart the timer with a shorter interval killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = startTimer( updateInterval() ); d_data->timerTick = true; } } /*! Qt paint event handler \param event Paint event */ void QwtSlider::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); if ( d_data->scalePosition != QwtSlider::NoScale ) { if ( !d_data->sliderRect.contains( event->rect() ) ) scaleDraw()->draw( &painter, palette() ); } drawSlider( &painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( &painter, this, d_data->sliderRect ); } /*! Qt resize event handler \param event Resize event */ void QwtSlider::resizeEvent( QResizeEvent *event ) { Q_UNUSED( event ); layoutSlider( false ); } /*! Handles QEvent::StyleChange and QEvent::FontChange events \param event Change event */ void QwtSlider::changeEvent( QEvent *event ) { if ( event->type() == QEvent::StyleChange || event->type() == QEvent::FontChange ) { if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } QwtAbstractSlider::changeEvent( event ); } /*! Recalculate the slider's geometry and layout based on the current geometry and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtSlider::layoutSlider( bool update_geometry ) { int bw = 0; if ( d_data->hasTrough ) bw = d_data->borderWidth; const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); QRect sliderRect = contentsRect(); /* The marker line of the handle needs to be aligned to the scale. But the marker is in the center and we need space enough to display the rest of the handle. But the scale itself usually needs margins for displaying the tick labels, that also might needs space beyond the backbone. Now it depends on what needs more margins. If it is the slider the scale gets shrunk, otherwise the slider. */ int scaleMargin = 0; if ( d_data->scalePosition != QwtSlider::NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); scaleMargin = qMax( d1, d2 ) - bw; } int scaleX, scaleY, scaleLength; if ( d_data->orientation == Qt::Horizontal ) { const int handleMargin = handleSize.width() / 2 - 1; if ( scaleMargin > handleMargin ) { int off = scaleMargin - handleMargin; sliderRect.adjust( off, 0, -off, 0 ); } scaleX = sliderRect.left() + bw + handleSize.width() / 2 - 1; scaleLength = sliderRect.width() - handleSize.width(); } else { int handleMargin = handleSize.height() / 2 - 1; if ( scaleMargin > handleMargin ) { int off = scaleMargin - handleMargin; sliderRect.adjust( 0, off, 0, -off ); } scaleY = sliderRect.top() + bw + handleSize.height() / 2 - 1; scaleLength = sliderRect.height() - handleSize.height(); } scaleLength -= 2 * bw; // now align slider and scale according to the ScalePosition if ( d_data->orientation == Qt::Horizontal ) { const int h = handleSize.height() + 2 * bw; if ( d_data->scalePosition == QwtSlider::TrailingScale ) { sliderRect.setTop( sliderRect.bottom() + 1 - h ); scaleY = sliderRect.top() - d_data->spacing; } else { sliderRect.setHeight( h ); scaleY = sliderRect.bottom() + 1 + d_data->spacing; } } else // Qt::Vertical { const int w = handleSize.width() + 2 * bw; if ( d_data->scalePosition == QwtSlider::LeadingScale ) { sliderRect.setWidth( w ); scaleX = sliderRect.right() + 1 + d_data->spacing; } else { sliderRect.setLeft( sliderRect.right() + 1 - w ); scaleX = sliderRect.left() - d_data->spacing; } } d_data->sliderRect = sliderRect; scaleDraw()->move( scaleX, scaleY ); scaleDraw()->setLength( scaleLength ); if ( update_geometry ) { d_data->sizeHintCache = QSize(); // invalidate updateGeometry(); update(); } } /*! En/Disable the trough The slider can be cutomized by showing a trough for the handle. \param on When true, the groove is visible \sa hasTrough(), setGroove() */ void QwtSlider::setTrough( bool on ) { if ( d_data->hasTrough != on ) { d_data->hasTrough = on; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return True, when the trough is visisble \sa setTrough(), hasGroove() */ bool QwtSlider::hasTrough() const { return d_data->hasTrough; } /*! En/Disable the groove The slider can be cutomized by showing a groove for the handle. \param on When true, the groove is visible \sa hasGroove(), setThrough() */ void QwtSlider::setGroove( bool on ) { if ( d_data->hasGroove != on ) { d_data->hasGroove = on; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return True, when the groove is visisble \sa setGroove(), hasTrough() */ bool QwtSlider::hasGroove() const { return d_data->hasGroove; } /*! \return minimumSizeHint() */ QSize QwtSlider::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtSlider::minimumSizeHint() const { if ( !d_data->sizeHintCache.isEmpty() ) return d_data->sizeHintCache; const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); int bw = 0; if ( d_data->hasTrough ) bw = d_data->borderWidth; int sliderLength = 0; int scaleExtent = 0; if ( d_data->scalePosition != QwtSlider::NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); const int scaleBorderDist = 2 * ( qMax( d1, d2 ) - bw ); int handleBorderDist; if ( d_data->orientation == Qt::Horizontal ) handleBorderDist = handleSize.width(); else handleBorderDist = handleSize.height(); sliderLength = scaleDraw()->minLength( font() ); if ( handleBorderDist > scaleBorderDist ) { // We need additional space for the overlapping handle sliderLength += handleBorderDist - scaleBorderDist; } scaleExtent += d_data->spacing; scaleExtent += qCeil( scaleDraw()->extent( font() ) ); } sliderLength = qMax( sliderLength, 84 ); // from QSlider int w = 0; int h = 0; if ( d_data->orientation == Qt::Horizontal ) { w = sliderLength; h = handleSize.height() + 2 * bw + scaleExtent; } else { w = handleSize.width() + 2 * bw + scaleExtent; h = sliderLength; } // finally add margins int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); w += left + right; h += top + bottom; d_data->sizeHintCache = QSize( w, h ); return d_data->sizeHintCache; } /*! \return Bounding rectangle of the slider handle */ QRect QwtSlider::handleRect() const { if ( !isValid() ) return QRect(); const int markerPos = transform( value() ); QPoint center = d_data->sliderRect.center(); if ( d_data->orientation == Qt::Horizontal ) center.setX( markerPos ); else center.setY( markerPos ); QRect rect; rect.setSize( qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ) ); rect.moveCenter( center ); return rect; } /*! \return Bounding rectangle of the slider - without the scale */ QRect QwtSlider::sliderRect() const { return d_data->sliderRect; } qsstv_9.2.6/qwt/qwt_slider.h0000664000175000017500000000665013203343610014575 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SLIDER_H #define QWT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_slider.h" class QwtScaleDraw; /*! \brief The Slider Widget QwtSlider is a slider widget which operates on an interval of type double. Its position is related to a scale showing the current value. The slider can be customized by having a through, a groove - or both. \image html sliders.png */ class QWT_EXPORT QwtSlider: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( ScalePosition BackgroundStyle ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( ScalePosition scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( bool trough READ hasTrough WRITE setTrough ) Q_PROPERTY( bool groove READ hasGroove WRITE setGroove ) Q_PROPERTY( QSize handleSize READ handleSize WRITE setHandleSize ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int spacing READ spacing WRITE setSpacing ) public: /*! Position of the scale \sa QwtSlider(), setScalePosition(), setOrientation() */ enum ScalePosition { //! The slider has no scale NoScale, //! The scale is right of a vertical or below a horizontal slider LeadingScale, //! The scale is left of a vertical or above a horizontal slider TrailingScale }; explicit QwtSlider( QWidget *parent = NULL ); explicit QwtSlider( Qt::Orientation, QWidget *parent = NULL ); virtual ~QwtSlider(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; void setScalePosition( ScalePosition ); ScalePosition scalePosition() const; void setTrough( bool ); bool hasTrough() const; void setGroove( bool ); bool hasGroove() const; void setHandleSize( const QSize & ); QSize handleSize() const; void setBorderWidth( int bw ); int borderWidth() const; void setSpacing( int ); int spacing() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; void setUpdateInterval( int ); int updateInterval() const; protected: virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; virtual void drawSlider ( QPainter *, const QRect & ) const; virtual void drawHandle( QPainter *, const QRect &, int pos ) const; virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void paintEvent ( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void timerEvent( QTimerEvent * ); virtual void scaleChange(); QRect sliderRect() const; QRect handleRect() const; private: QwtScaleDraw *scaleDraw(); void layoutSlider( bool ); void initSlider( Qt::Orientation ); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_spline.cpp0000664000175000017500000002041213203343610015130 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_spline.h" #include "qwt_math.h" class QwtSpline::PrivateData { public: PrivateData(): splineType( QwtSpline::Natural ) { } QwtSpline::SplineType splineType; // coefficient vectors QVector a; QVector b; QVector c; // control points QPolygonF points; }; static int lookup( double x, const QPolygonF &values ) { #if 0 //qLowerBound/qHigherBound ??? #endif int i1; const int size = values.size(); if ( x <= values[0].x() ) i1 = 0; else if ( x >= values[size - 2].x() ) i1 = size - 2; else { i1 = 0; int i2 = size - 2; int i3 = 0; while ( i2 - i1 > 1 ) { i3 = i1 + ( ( i2 - i1 ) >> 1 ); if ( values[i3].x() > x ) i2 = i3; else i1 = i3; } } return i1; } //! Constructor QwtSpline::QwtSpline() { d_data = new PrivateData; } /*! Copy constructor \param other Spline used for initialization */ QwtSpline::QwtSpline( const QwtSpline& other ) { d_data = new PrivateData( *other.d_data ); } /*! Assignment operator \param other Spline used for initialization \return *this */ QwtSpline &QwtSpline::operator=( const QwtSpline & other ) { *d_data = *other.d_data; return *this; } //! Destructor QwtSpline::~QwtSpline() { delete d_data; } /*! Select the algorithm used for calculating the spline \param splineType Spline type \sa splineType() */ void QwtSpline::setSplineType( SplineType splineType ) { d_data->splineType = splineType; } /*! \return the spline type \sa setSplineType() */ QwtSpline::SplineType QwtSpline::splineType() const { return d_data->splineType; } /*! \brief Calculate the spline coefficients Depending on the value of \a periodic, this function will determine the coefficients for a natural or a periodic spline and store them internally. \param points Points \return true if successful \warning The sequence of x (but not y) values has to be strictly monotone increasing, which means points[i].x() < points[i+1].x(). If this is not the case, the function will return false */ bool QwtSpline::setPoints( const QPolygonF& points ) { const int size = points.size(); if ( size <= 2 ) { reset(); return false; } d_data->points = points; d_data->a.resize( size - 1 ); d_data->b.resize( size - 1 ); d_data->c.resize( size - 1 ); bool ok; if ( d_data->splineType == Periodic ) ok = buildPeriodicSpline( points ); else ok = buildNaturalSpline( points ); if ( !ok ) reset(); return ok; } /*! \return Points, that have been by setPoints() */ QPolygonF QwtSpline::points() const { return d_data->points; } //! \return A coefficients const QVector &QwtSpline::coefficientsA() const { return d_data->a; } //! \return B coefficients const QVector &QwtSpline::coefficientsB() const { return d_data->b; } //! \return C coefficients const QVector &QwtSpline::coefficientsC() const { return d_data->c; } //! Free allocated memory and set size to 0 void QwtSpline::reset() { d_data->a.resize( 0 ); d_data->b.resize( 0 ); d_data->c.resize( 0 ); d_data->points.resize( 0 ); } //! True if valid bool QwtSpline::isValid() const { return d_data->a.size() > 0; } /*! Calculate the interpolated function value corresponding to a given argument x. \param x Coordinate \return Interpolated coordinate */ double QwtSpline::value( double x ) const { if ( d_data->a.size() == 0 ) return 0.0; const int i = lookup( x, d_data->points ); const double delta = x - d_data->points[i].x(); return( ( ( ( d_data->a[i] * delta ) + d_data->b[i] ) * delta + d_data->c[i] ) * delta + d_data->points[i].y() ); } /*! \brief Determines the coefficients for a natural spline \return true if successful */ bool QwtSpline::buildNaturalSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); // set up tridiagonal equation system; use coefficient // vectors as temporary buffers QVector h( size - 1 ); for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0 ) return false; } QVector d( size - 1 ); double dy1 = ( p[1].y() - p[0].y() ) / h[0]; for ( i = 1; i < size - 1; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( h[i-1] + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; } // // solve it // // L-U Factorization for ( i = 1; i < size - 2; i++ ) { c[i] /= a[i]; a[i+1] -= b[i] * c[i]; } // forward elimination QVector s( size ); s[1] = d[1]; for ( i = 2; i < size - 1; i++ ) s[i] = d[i] - c[i-1] * s[i-1]; // backward elimination s[size - 2] = - s[size - 2] / a[size - 2]; for ( i = size - 3; i > 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] ) / a[i]; s[size - 1] = s[0] = 0.0; // // Finally, determine the spline coefficients // for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } /*! \brief Determines the coefficients for a periodic spline \return true if successful */ bool QwtSpline::buildPeriodicSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); QVector d( size - 1 ); QVector h( size - 1 ); QVector s( size ); // // setup equation system; use coefficient // vectors as temporary buffers // for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0.0 ) return false; } const int imax = size - 2; double htmp = h[imax]; double dy1 = ( p[0].y() - p[imax].y() ) / htmp; for ( i = 0; i <= imax; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( htmp + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; htmp = h[i]; } // // solve it // // L-U Factorization a[0] = qSqrt( a[0] ); c[0] = h[imax] / a[0]; double sum = 0; for ( i = 0; i < imax - 1; i++ ) { b[i] /= a[i]; if ( i > 0 ) c[i] = - c[i-1] * b[i-1] / a[i]; a[i+1] = qSqrt( a[i+1] - qwtSqr( b[i] ) ); sum += qwtSqr( c[i] ); } b[imax-1] = ( b[imax-1] - c[imax-2] * b[imax-2] ) / a[imax-1]; a[imax] = qSqrt( a[imax] - qwtSqr( b[imax-1] ) - sum ); // forward elimination s[0] = d[0] / a[0]; sum = 0; for ( i = 1; i < imax; i++ ) { s[i] = ( d[i] - b[i-1] * s[i-1] ) / a[i]; sum += c[i-1] * s[i-1]; } s[imax] = ( d[imax] - b[imax-1] * s[imax-1] - sum ) / a[imax]; // backward elimination s[imax] = - s[imax] / a[imax]; s[imax-1] = -( s[imax-1] + b[imax-1] * s[imax] ) / a[imax-1]; for ( i = imax - 2; i >= 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] + c[i] * s[imax] ) / a[i]; // // Finally, determine the spline coefficients // s[size-1] = s[0]; for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } qsstv_9.2.6/qwt/qwt_spline.h0000664000175000017500000000460113203343610014577 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SPLINE_H #define QWT_SPLINE_H #include "qwt_global.h" #include #include /*! \brief A class for spline interpolation The QwtSpline class is used for cubical spline interpolation. Two types of splines, natural and periodic, are supported. \par Usage:
  1. First call setPoints() to determine the spline coefficients for a tabulated function y(x).
  2. After the coefficients have been set up, the interpolated function value for an argument x can be determined by calling QwtSpline::value().
\par Example: \code #include QPolygonF interpolate(const QPolygonF& points, int numValues) { QwtSpline spline; if ( !spline.setPoints(points) ) return points; QPolygonF interpolatedPoints(numValues); const double delta = (points[numPoints - 1].x() - points[0].x()) / (points.size() - 1); for(i = 0; i < points.size(); i++) / interpolate { const double x = points[0].x() + i * delta; interpolatedPoints[i].setX(x); interpolatedPoints[i].setY(spline.value(x)); } return interpolatedPoints; } \endcode */ class QWT_EXPORT QwtSpline { public: //! Spline type enum SplineType { //! A natural spline Natural, //! A periodic spline Periodic }; QwtSpline(); QwtSpline( const QwtSpline & ); ~QwtSpline(); QwtSpline &operator=( const QwtSpline & ); void setSplineType( SplineType ); SplineType splineType() const; bool setPoints( const QPolygonF& points ); QPolygonF points() const; void reset(); bool isValid() const; double value( double x ) const; const QVector &coefficientsA() const; const QVector &coefficientsB() const; const QVector &coefficientsC() const; protected: bool buildNaturalSpline( const QPolygonF & ); bool buildPeriodicSpline( const QPolygonF & ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_symbol.cpp0000664000175000017500000012037713203343610015156 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt.h" #include "qwt_symbol.h" #include "qwt_painter.h" #include "qwt_graphic.h" #include #include #include #include #include #include namespace QwtTriangle { enum Type { Left, Right, Up, Down }; } static QwtGraphic qwtPathGraphic( const QPainterPath &path, const QPen &pen, const QBrush& brush ) { QwtGraphic graphic; graphic.setRenderHint( QwtGraphic::RenderPensUnscaled ); QPainter painter( &graphic ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); return graphic; } static inline QRectF qwtScaledBoundingRect( const QwtGraphic &graphic, const QSizeF size ) { QSizeF scaledSize = size; if ( scaledSize.isEmpty() ) scaledSize = graphic.defaultSize(); const QSizeF sz = graphic.controlPointRect().size(); double sx = 1.0; if ( sz.width() > 0.0 ) sx = scaledSize.width() / sz.width(); double sy = 1.0; if ( sz.height() > 0.0 ) sy = scaledSize.height() / sz.height(); return graphic.scaledBoundingRect( sx, sy ); } static inline void qwtDrawPixmapSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QSize size = symbol.size(); if ( size.isEmpty() ) size = symbol.pixmap().size(); const QTransform transform = painter->transform(); if ( transform.isScaling() ) { const QRect r( 0, 0, size.width(), size.height() ); size = transform.mapRect( r ).size(); } QPixmap pm = symbol.pixmap(); if ( pm.size() != size ) pm = pm.scaled( size ); QPointF pinPoint( 0.5 * size.width(), 0.5 * size.height() ); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); painter->resetTransform(); for ( int i = 0; i < numPoints; i++ ) { const QPointF pos = transform.map( points[i] ) - pinPoint; QwtPainter::drawPixmap( painter, QRect( pos.toPoint(), pm.size() ), pm ); } } static inline void qwtDrawGraphicSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtGraphic &graphic, const QwtSymbol &symbol ) { const QRectF pointRect = graphic.controlPointRect(); if ( pointRect.isEmpty() ) return; double sx = 1.0; double sy = 1.0; const QSize sz = symbol.size(); if ( sz.isValid() ) { sx = sz.width() / pointRect.width(); sy = sz.height() / pointRect.height(); } QPointF pinPoint = pointRect.center(); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); const QTransform transform = painter->transform(); for ( int i = 0; i < numPoints; i++ ) { QTransform tr = transform; tr.translate( points[i].x(), points[i].y() ); tr.scale( sx, sy ); tr.translate( -pinPoint.x(), -pinPoint.y() ); painter->setTransform( tr ); graphic.render( painter ); } painter->setTransform( transform ); } static inline void qwtDrawEllipseSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const QSize size = symbol.size(); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } } static inline void qwtDrawRectSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRect r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } } static inline void qwtDrawDiamondSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); if ( QwtPainter::roundingAlignment( painter ) ) { for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const int x1 = x - size.width() / 2; const int y1 = y - size.height() / 2; const int x2 = x1 + size.width(); const int y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( x, y1 ); polygon += QPointF( x1, y ); polygon += QPointF( x, y2 ); polygon += QPointF( x2, y ); QwtPainter::drawPolygon( painter, polygon ); } } else { for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - 0.5 * size.width(); const double y1 = pos.y() - 0.5 * size.height(); const double x2 = x1 + size.width(); const double y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( pos.x(), y1 ); polygon += QPointF( x2, pos.y() ); polygon += QPointF( pos.x(), y2 ); polygon += QPointF( x1, pos.y() ); QwtPainter::drawPolygon( painter, polygon ); } } } static inline void qwtDrawTriangleSymbols( QPainter *painter, QwtTriangle::Type type, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double sw2 = 0.5 * size.width(); double sh2 = 0.5 * size.height(); if ( doAlign ) { sw2 = qFloor( sw2 ); sh2 = qFloor( sh2 ); } QPolygonF triangle( 3 ); QPointF *trianglePoints = triangle.data(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; double x = pos.x(); double y = pos.y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } const double x1 = x - sw2; const double x2 = x1 + size.width(); const double y1 = y - sh2; const double y2 = y1 + size.height(); switch ( type ) { case QwtTriangle::Left: { trianglePoints[0].rx() = x2; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x1; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Right: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x2; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x1; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Up: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y2; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y1; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Down: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y2; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y1; break; } } QwtPainter::drawPolygon( painter, triangle ); } } static inline void qwtDrawLineSymbols( QPainter *painter, int orientations, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); int off = 0; QPen pen = symbol.pen(); if ( pen.width() > 1 ) { pen.setCapStyle( Qt::FlatCap ); off = 1; } painter->setPen( pen ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = qFloor( size.width() ); const int sh = qFloor( size.height() ); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const int x = qRound( points[i].x() ) - sw2; const int y = qRound( points[i].y() ); QwtPainter::drawLine( painter, x, y, x + sw + off, y ); } if ( orientations & Qt::Vertical ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ) - sh2; QwtPainter::drawLine( painter, x, y, x, y + sh + off ); } } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const double x = points[i].x() - sw2; const double y = points[i].y(); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const double y = points[i].y() - sh2; const double x = points[i].x(); QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } } static inline void qwtDrawXCrossSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); int off = 0; QPen pen = symbol.pen(); if ( pen.width() > 1 ) { pen.setCapStyle( Qt::FlatCap ); off = 1; } painter->setPen( pen ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const int x = qRound( pos.x() ); const int y = qRound( pos.y() ); const int x1 = x - sw2; const int x2 = x1 + sw + off; const int y1 = y - sh2; const int y2 = y1 + sh + off; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x2, y1, x1, y2 ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - sw2; const double x2 = x1 + sw; const double y1 = pos.y() - sh2; const double y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x1, y2, x2, y1 ); } } } static inline void qwtDrawStar1Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); painter->setPen( symbol.pen() ); if ( QwtPainter::roundingAlignment( painter ) ) { QRect r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i].toPoint() ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.top() + d1 ), qRound( r.right() - d1 ), qRound( r.bottom() - d1 ) ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.bottom() - d1 ), qRound( r .right() - d1), qRound( r.top() + d1 ) ); const QPoint c = r.center(); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } else { QRectF r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i] ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const QPointF c = r.center(); const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, r.left() + d1, r.top() + d1, r.right() - d1, r.bottom() - d1 ); QwtPainter::drawLine( painter, r.left() + d1, r.bottom() - d1, r.right() - d1, r.top() + d1 ); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } } static inline void qwtDrawStar2Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QPen pen = symbol.pen(); if ( pen.width() > 1 ) pen.setCapStyle( Qt::FlatCap ); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const double cos30 = 0.866025; // cos(30°) const double dy = 0.25 * symbol.size().height(); const double dx = 0.5 * symbol.size().width() * cos30 / 3.0; QPolygonF star( 12 ); QPointF *starPoints = star.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - 3 * dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qRound( x - 3 * dx ); y1 = qRound( y - 2 * dy ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double x4 = x1 + 3 * dx; const double x5 = x1 + 4 * dx; const double x6 = x1 + 5 * dx; const double x7 = x1 + 6 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 2 * dy; const double y4 = y1 + 3 * dy; const double y5 = y1 + 4 * dy; starPoints[0].rx() = x4; starPoints[0].ry() = y1; starPoints[1].rx() = x5; starPoints[1].ry() = y2; starPoints[2].rx() = x7; starPoints[2].ry() = y2; starPoints[3].rx() = x6; starPoints[3].ry() = y3; starPoints[4].rx() = x7; starPoints[4].ry() = y4; starPoints[5].rx() = x5; starPoints[5].ry() = y4; starPoints[6].rx() = x4; starPoints[6].ry() = y5; starPoints[7].rx() = x3; starPoints[7].ry() = y4; starPoints[8].rx() = x1; starPoints[8].ry() = y4; starPoints[9].rx() = x2; starPoints[9].ry() = y3; starPoints[10].rx() = x1; starPoints[10].ry() = y2; starPoints[11].rx() = x3; starPoints[11].ry() = y2; QwtPainter::drawPolygon( painter, star ); } } static inline void qwtDrawHexagonSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const double cos30 = 0.866025; // cos(30°) const double dx = 0.5 * ( symbol.size().width() - cos30 ); const double dy = 0.25 * symbol.size().height(); QPolygonF hexaPolygon( 6 ); QPointF *hexaPoints = hexaPolygon.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qCeil( x1 ); y1 = qCeil( y1 ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 3 * dy; const double y4 = y1 + 4 * dy; hexaPoints[0].rx() = x2; hexaPoints[0].ry() = y1; hexaPoints[1].rx() = x3; hexaPoints[1].ry() = y2; hexaPoints[2].rx() = x3; hexaPoints[2].ry() = y3; hexaPoints[3].rx() = x2; hexaPoints[3].ry() = y4; hexaPoints[4].rx() = x1; hexaPoints[4].ry() = y3; hexaPoints[5].rx() = x1; hexaPoints[5].ry() = y2; QwtPainter::drawPolygon( painter, hexaPolygon ); } } class QwtSymbol::PrivateData { public: PrivateData( QwtSymbol::Style st, const QBrush &br, const QPen &pn, const QSize &sz ): style( st ), size( sz ), brush( br ), pen( pn ), isPinPointEnabled( false ) { cache.policy = QwtSymbol::AutoCache; } ~PrivateData() { } Style style; QSize size; QBrush brush; QPen pen; bool isPinPointEnabled; QPointF pinPoint; struct Path { QPainterPath path; QwtGraphic graphic; } path; struct Pixmap { QPixmap pixmap; } pixmap; struct Graphic { QwtGraphic graphic; } graphic; struct PaintCache { QwtSymbol::CachePolicy policy; QPixmap pixmap; } cache; }; /*! Default Constructor \param style Symbol Style The symbol is constructed with gray interior, black outline with zero width, no size and style 'NoSymbol'. */ QwtSymbol::QwtSymbol( Style style ) { d_data = new PrivateData( style, QBrush( Qt::gray ), QPen( Qt::black, 0 ), QSize() ); } /*! \brief Constructor \param style Symbol Style \param brush brush to fill the interior \param pen outline pen \param size size \sa setStyle(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( QwtSymbol::Style style, const QBrush &brush, const QPen &pen, const QSize &size ) { d_data = new PrivateData( style, brush, pen, size ); } /*! \brief Constructor The symbol gets initialized by a painter path. The style is set to QwtSymbol::Path, the size is set to empty ( the path is displayed unscaled ). \param path painter path \param brush brush to fill the interior \param pen outline pen \sa setPath(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( const QPainterPath &path, const QBrush &brush, const QPen &pen ) { d_data = new PrivateData( QwtSymbol::Path, brush, pen, QSize() ); setPath( path ); } //! Destructor QwtSymbol::~QwtSymbol() { delete d_data; } /*! Change the cache policy The default policy is AutoCache \param policy Cache policy \sa CachePolicy, cachePolicy() */ void QwtSymbol::setCachePolicy( QwtSymbol::CachePolicy policy ) { if ( d_data->cache.policy != policy ) { d_data->cache.policy = policy; invalidateCache(); } } /*! \return Cache policy \sa CachePolicy, setCachePolicy() */ QwtSymbol::CachePolicy QwtSymbol::cachePolicy() const { return d_data->cache.policy; } /*! \brief Set a painter path as symbol The symbol is represented by a painter path, where the origin ( 0, 0 ) of the path coordinate system is mapped to the position of the symbol. When the symbol has valid size the painter path gets scaled to fit into the size. Otherwise the symbol size depends on the bounding rectangle of the path. The following code defines a symbol drawing an arrow: \verbatim #include QwtSymbol *symbol = new QwtSymbol(); QPen pen( Qt::black, 2 ); pen.setJoinStyle( Qt::MiterJoin ); symbol->setPen( pen ); symbol->setBrush( Qt::red ); QPainterPath path; path.moveTo( 0, 8 ); path.lineTo( 0, 5 ); path.lineTo( -3, 5 ); path.lineTo( 0, 0 ); path.lineTo( 3, 5 ); path.lineTo( 0, 5 ); QTransform transform; transform.rotate( -30.0 ); path = transform.map( path ); symbol->setPath( path ); symbol->setPinPoint( QPointF( 0.0, 0.0 ) ); setSize( 10, 14 ); \endverbatim \param path Painter path \note The style is implicitely set to QwtSymbol::Path. \sa path(), setSize() */ void QwtSymbol::setPath( const QPainterPath &path ) { d_data->style = QwtSymbol::Path; d_data->path.path = path; d_data->path.graphic.reset(); } /*! \return Painter path for displaying the symbol \sa setPath() */ const QPainterPath &QwtSymbol::path() const { return d_data->path.path; } /*! Set a pixmap as symbol \param pixmap Pixmap \sa pixmap(), setGraphic() \note the style() is set to QwtSymbol::Pixmap \note brush() and pen() have no effect */ void QwtSymbol::setPixmap( const QPixmap &pixmap ) { d_data->style = QwtSymbol::Pixmap; d_data->pixmap.pixmap = pixmap; } /*! \return Assigned pixmap \sa setPixmap() */ const QPixmap &QwtSymbol::pixmap() const { return d_data->pixmap.pixmap; } /*! Set a graphic as symbol \param graphic Graphic \sa graphic(), setPixmap() \note the style() is set to QwtSymbol::Graphic \note brush() and pen() have no effect */ void QwtSymbol::setGraphic( const QwtGraphic &graphic ) { d_data->style = QwtSymbol::Graphic; d_data->graphic.graphic = graphic; } /*! \return Assigned graphic \sa setGraphic() */ const QwtGraphic &QwtSymbol::graphic() const { return d_data->graphic.graphic; } /*! \brief Specify the symbol's size If the 'h' parameter is left out or less than 0, and the 'w' parameter is greater than or equal to 0, the symbol size will be set to (w,w). \param width Width \param height Height (defaults to -1) \sa size() */ void QwtSymbol::setSize( int width, int height ) { if ( ( width >= 0 ) && ( height < 0 ) ) height = width; setSize( QSize( width, height ) ); } /*! Set the symbol's size \param size Size \sa size() */ void QwtSymbol::setSize( const QSize &size ) { if ( size.isValid() && size != d_data->size ) { d_data->size = size; invalidateCache(); } } /*! \return Size \sa setSize() */ const QSize& QwtSymbol::size() const { return d_data->size; } /*! \brief Assign a brush The brush is used to draw the interior of the symbol. \param brush Brush \sa brush() */ void QwtSymbol::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; invalidateCache(); if ( d_data->style == QwtSymbol::Path ) d_data->path.graphic.reset(); } } /*! \return Brush \sa setBrush() */ const QBrush& QwtSymbol::brush() const { return d_data->brush; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtSymbol::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen The pen is used to draw the symbol's outline. \param pen Pen \sa pen(), setBrush() */ void QwtSymbol::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; invalidateCache(); if ( d_data->style == QwtSymbol::Path ) d_data->path.graphic.reset(); } } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtSymbol::pen() const { return d_data->pen; } /*! \brief Set the color of the symbol Change the color of the brush for symbol types with a filled area. For all other symbol types the color will be assigned to the pen. \param color Color \sa setBrush(), setPen(), brush(), pen() */ void QwtSymbol::setColor( const QColor &color ) { switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star2: case QwtSymbol::Hexagon: { if ( d_data->brush.color() != color ) { d_data->brush.setColor( color ); invalidateCache(); } break; } case QwtSymbol::Cross: case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Star1: { if ( d_data->pen.color() != color ) { d_data->pen.setColor( color ); invalidateCache(); } break; } default: { if ( d_data->brush.color() != color || d_data->pen.color() != color ) { invalidateCache(); } d_data->brush.setColor( color ); d_data->pen.setColor( color ); } } } /*! \brief Set and enable a pin point The position of a complex symbol is not always aligned to its center ( f.e an arrow, where the peak points to a position ). The pin point defines the position inside of a Pixmap, Graphic, SvgDocument or PainterPath symbol where the represented point has to be aligned to. \param pos Position \param enable En/Disable the pin point alignment \sa pinPoint(), setPinPointEnabled() */ void QwtSymbol::setPinPoint( const QPointF &pos, bool enable ) { if ( d_data->pinPoint != pos ) { d_data->pinPoint = pos; if ( d_data->isPinPointEnabled ) { invalidateCache(); } } setPinPointEnabled( enable ); } /*! \return Pin point \sa setPinPoint(), setPinPointEnabled() */ QPointF QwtSymbol::pinPoint() const { return d_data->pinPoint; } /*! En/Disable the pin point alignment \param on Enabled, when on is true \sa setPinPoint(), isPinPointEnabled() */ void QwtSymbol::setPinPointEnabled( bool on ) { if ( d_data->isPinPointEnabled != on ) { d_data->isPinPointEnabled = on; invalidateCache(); } } /*! \return True, when the pin point translation is enabled \sa setPinPoint(), setPinPointEnabled() */ bool QwtSymbol::isPinPointEnabled() const { return d_data->isPinPointEnabled; } /*! Render an array of symbols Painting several symbols is more effective than drawing symbols one by one, as a couple of layout calculations and setting of pen/brush can be done once for the complete array. \param painter Painter \param points Array of points \param numPoints Number of points */ void QwtSymbol::drawSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { if ( numPoints <= 0 ) return; bool useCache = false; // Don't use the pixmap, when the paint device // could generate scalable vectors if ( QwtPainter::roundingAlignment( painter ) && !painter->transform().isScaling() ) { if ( d_data->cache.policy == QwtSymbol::Cache ) { useCache = true; } else if ( d_data->cache.policy == QwtSymbol::AutoCache ) { if ( painter->paintEngine()->type() == QPaintEngine::Raster ) { useCache = true; } else { switch( d_data->style ) { case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Cross: break; case QwtSymbol::Pixmap: { if ( !d_data->size.isEmpty() && d_data->size != d_data->pixmap.pixmap.size() ) { useCache = true; } break; } default: useCache = true; } } } } if ( useCache ) { const QRect br = boundingRect(); const QRect rect( 0, 0, br.width(), br.height() ); if ( d_data->cache.pixmap.isNull() ) { d_data->cache.pixmap = QwtPainter::backingStore( NULL, br.size() ); d_data->cache.pixmap.fill( Qt::transparent ); QPainter p( &d_data->cache.pixmap ); p.setRenderHints( painter->renderHints() ); p.translate( -br.topLeft() ); const QPointF pos; renderSymbols( &p, &pos, 1 ); } const int dx = br.left(); const int dy = br.top(); for ( int i = 0; i < numPoints; i++ ) { const int left = qRound( points[i].x() ) + dx; const int top = qRound( points[i].y() ) + dy; painter->drawPixmap( left, top, d_data->cache.pixmap ); } } else { painter->save(); renderSymbols( painter, points, numPoints ); painter->restore(); } } /*! \brief Draw the symbol into a rectangle The symbol is painted centered and scaled into the target rectangle. It is always painted uncached and the pin point is ignored. This method is primarily intended for drawing a symbol to the legend. \param painter Painter \param rect Target rectangle for the symbol */ void QwtSymbol::drawSymbol( QPainter *painter, const QRectF &rect ) const { if ( d_data->style == QwtSymbol::NoSymbol ) return; if ( d_data->style == QwtSymbol::Graphic ) { d_data->graphic.graphic.render( painter, rect, Qt::KeepAspectRatio ); } else if ( d_data->style == QwtSymbol::Path ) { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } d_data->path.graphic.render( painter, rect, Qt::KeepAspectRatio ); return; } else if ( d_data->style == QwtSymbol::SvgDocument ) { } else { const QRect br = boundingRect(); // scale the symbol size to fit into rect. const double ratio = qMin( rect.width() / br.width(), rect.height() / br.height() ); painter->save(); painter->translate( rect.center() ); painter->scale( ratio, ratio ); const bool isPinPointEnabled = d_data->isPinPointEnabled; d_data->isPinPointEnabled = false; const QPointF pos; renderSymbols( painter, &pos, 1 ); d_data->isPinPointEnabled = isPinPointEnabled; painter->restore(); } } /*! Render the symbol to series of points \param painter Qt painter \param points Positions of the symbols \param numPoints Number of points */ void QwtSymbol::renderSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { switch ( d_data->style ) { case QwtSymbol::Ellipse: { qwtDrawEllipseSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Rect: { qwtDrawRectSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Diamond: { qwtDrawDiamondSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Cross: { qwtDrawLineSymbols( painter, Qt::Horizontal | Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::XCross: { qwtDrawXCrossSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Triangle: case QwtSymbol::UTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Up, points, numPoints, *this ); break; } case QwtSymbol::DTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Down, points, numPoints, *this ); break; } case QwtSymbol::RTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Right, points, numPoints, *this ); break; } case QwtSymbol::LTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Left, points, numPoints, *this ); break; } case QwtSymbol::HLine: { qwtDrawLineSymbols( painter, Qt::Horizontal, points, numPoints, *this ); break; } case QwtSymbol::VLine: { qwtDrawLineSymbols( painter, Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::Star1: { qwtDrawStar1Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Star2: { qwtDrawStar2Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Hexagon: { qwtDrawHexagonSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Path: { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } qwtDrawGraphicSymbols( painter, points, numPoints, d_data->path.graphic, *this ); break; } case QwtSymbol::Pixmap: { qwtDrawPixmapSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Graphic: { qwtDrawGraphicSymbols( painter, points, numPoints, d_data->graphic.graphic, *this ); break; } case QwtSymbol::SvgDocument: { break; } default:; } } /*! Calculate the bounding rectangle for a symbol at position (0,0). \return Bounding rectangle */ QRect QwtSymbol::boundingRect() const { QRectF rect; switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Hexagon: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( pw, pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::XCross: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star1: case QwtSymbol::Star2: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( 2 * pw, 2 * pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::Path: { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } rect = qwtScaledBoundingRect( d_data->path.graphic, d_data->size ); break; } case QwtSymbol::Pixmap: { if ( d_data->size.isEmpty() ) rect.setSize( d_data->pixmap.pixmap.size() ); else rect.setSize( d_data->size ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); // pinpoint ??? break; } case QwtSymbol::Graphic: { rect = qwtScaledBoundingRect( d_data->graphic.graphic, d_data->size ); break; } default: { rect.setSize( d_data->size ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); } } if ( d_data->style == QwtSymbol::Graphic || d_data->style == QwtSymbol::SvgDocument || d_data->style == QwtSymbol::Path ) { QPointF pinPoint( 0.0, 0.0 ); if ( d_data->isPinPointEnabled ) pinPoint = rect.center() - d_data->pinPoint; rect.moveCenter( pinPoint ); } QRect r; r.setLeft( qFloor( rect.left() ) ); r.setTop( qFloor( rect.top() ) ); r.setRight( qCeil( rect.right() ) ); r.setBottom( qCeil( rect.bottom() ) ); if ( d_data->style != QwtSymbol::Pixmap ) r.adjust( -1, -1, 1, 1 ); // for antialiasing return r; } /*! Invalidate the cached symbol pixmap The symbol invalidates its cache, whenever an attribute is changed that has an effect ob how to display a symbol. In case of derived classes with individual styles ( >= QwtSymbol::UserStyle ) it might be necessary to call invalidateCache() for attributes that are relevant for this style. \sa CachePolicy, setCachePolicy(), drawSymbols() */ void QwtSymbol::invalidateCache() { if ( !d_data->cache.pixmap.isNull() ) d_data->cache.pixmap = QPixmap(); } /*! Specify the symbol style \param style Style \sa style() */ void QwtSymbol::setStyle( QwtSymbol::Style style ) { if ( d_data->style != style ) { d_data->style = style; invalidateCache(); } } /*! \return Current symbol style \sa setStyle() */ QwtSymbol::Style QwtSymbol::style() const { return d_data->style; } qsstv_9.2.6/qwt/qwt_symbol.h0000664000175000017500000001410713203343610014614 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYMBOL_H #define QWT_SYMBOL_H #include "qwt_global.h" #include class QPainter; class QRect; class QSize; class QBrush; class QPen; class QColor; class QPointF; class QPolygonF; class QPainterPath; class QPixmap; class QByteArray; class QwtGraphic; //! A class for drawing symbols class QWT_EXPORT QwtSymbol { public: /*! Symbol Style \sa setStyle(), style() */ enum Style { //! No Style. The symbol cannot be drawn. NoSymbol = -1, //! Ellipse or circle Ellipse, //! Rectangle Rect, //! Diamond Diamond, //! Triangle pointing upwards Triangle, //! Triangle pointing downwards DTriangle, //! Triangle pointing upwards UTriangle, //! Triangle pointing left LTriangle, //! Triangle pointing right RTriangle, //! Cross (+) Cross, //! Diagonal cross (X) XCross, //! Horizontal line HLine, //! Vertical line VLine, //! X combined with + Star1, //! Six-pointed star Star2, //! Hexagon Hexagon, /*! The symbol is represented by a painter path, where the origin ( 0, 0 ) of the path coordinate system is mapped to the position of the symbol. \sa setPath(), path() */ Path, /*! The symbol is represented by a pixmap. The pixmap is centered or aligned to its pin point. \sa setPinPoint() */ Pixmap, /*! The symbol is represented by a graphic. The graphic is centered or aligned to its pin point. \sa setPinPoint() */ Graphic, /*! The symbol is represented by a SVG graphic. The graphic is centered or aligned to its pin point. \sa setPinPoint() */ SvgDocument, /*! Styles >= QwtSymbol::UserSymbol are reserved for derived classes of QwtSymbol that overload drawSymbols() with additional application specific symbol types. */ UserStyle = 1000 }; /*! Depending on the render engine and the complexity of the symbol shape it might be faster to render the symbol to a pixmap and to paint this pixmap. F.e. the raster paint engine is a pure software renderer where in cache mode a draw operation usually ends in raster operation with the the backing store, that are usually faster, than the algorithms for rendering polygons. But the opposite can be expected for graphic pipelines that can make use of hardware acceleration. The default setting is AutoCache \sa setCachePolicy(), cachePolicy() \note The policy has no effect, when the symbol is painted to a vector graphics format ( PDF, SVG ). \warning Since Qt 4.8 raster is the default backend on X11 */ enum CachePolicy { //! Don't use a pixmap cache NoCache, //! Always use a pixmap cache Cache, /*! Use a cache when one of the following conditions is true: - The symbol is rendered with the software renderer ( QPaintEngine::Raster ) */ AutoCache }; public: QwtSymbol( Style = NoSymbol ); QwtSymbol( Style, const QBrush &, const QPen &, const QSize & ); QwtSymbol( const QPainterPath &, const QBrush &, const QPen & ); virtual ~QwtSymbol(); void setCachePolicy( CachePolicy ); CachePolicy cachePolicy() const; void setSize( const QSize & ); void setSize( int width, int height = -1 ); const QSize& size() const; void setPinPoint( const QPointF &pos, bool enable = true ); QPointF pinPoint() const; void setPinPointEnabled( bool ); bool isPinPointEnabled() const; virtual void setColor( const QColor & ); void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; void setPath( const QPainterPath & ); const QPainterPath &path() const; void setPixmap( const QPixmap & ); const QPixmap &pixmap() const; void setGraphic( const QwtGraphic & ); const QwtGraphic &graphic() const; #ifndef QWT_NO_SVG void setSvgDocument( const QByteArray & ); #endif void drawSymbol( QPainter *, const QRectF & ) const; void drawSymbol( QPainter *, const QPointF & ) const; void drawSymbols( QPainter *, const QPolygonF & ) const; void drawSymbols( QPainter *, const QPointF *, int numPoints ) const; virtual QRect boundingRect() const; void invalidateCache(); protected: virtual void renderSymbols( QPainter *, const QPointF *, int numPoints ) const; private: // Disabled copy constructor and operator= QwtSymbol( const QwtSymbol & ); QwtSymbol &operator=( const QwtSymbol & ); class PrivateData; PrivateData *d_data; }; /*! \brief Draw the symbol at a specified position \param painter Painter \param pos Position of the symbol in screen coordinates */ inline void QwtSymbol::drawSymbol( QPainter *painter, const QPointF &pos ) const { drawSymbols( painter, &pos, 1 ); } /*! \brief Draw symbols at the specified points \param painter Painter \param points Positions of the symbols in screen coordinates */ inline void QwtSymbol::drawSymbols( QPainter *painter, const QPolygonF &points ) const { drawSymbols( painter, points.data(), points.size() ); } #endif qsstv_9.2.6/qwt/qwt_system_clock.cpp0000664000175000017500000001760713203343610016351 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_system_clock.h" #if QT_VERSION >= 0x040800 #define USE_ELAPSED_TIMER 1 #endif #if USE_ELAPSED_TIMER #include class QwtSystemClock::PrivateData { public: QElapsedTimer timer; }; QwtSystemClock::QwtSystemClock() { d_data = new PrivateData(); } QwtSystemClock::~QwtSystemClock() { delete d_data; } bool QwtSystemClock::isNull() const { return d_data->timer.isValid(); } void QwtSystemClock::start() { d_data->timer.start(); } double QwtSystemClock::restart() { const qint64 nsecs = d_data->timer.restart(); return nsecs / 1e6; } double QwtSystemClock::elapsed() const { const qint64 nsecs = d_data->timer.nsecsElapsed(); return nsecs / 1e6; } #else // !USE_ELAPSED_TIMER #include #if !defined(Q_OS_WIN) #include #endif #if defined(Q_OS_MAC) #include #include #define QWT_HIGH_RESOLUTION_CLOCK #elif defined(_POSIX_TIMERS) #include #define QWT_HIGH_RESOLUTION_CLOCK #elif defined(Q_OS_WIN) #define QWT_HIGH_RESOLUTION_CLOCK #include #endif #if defined(QWT_HIGH_RESOLUTION_CLOCK) class QwtHighResolutionClock { public: QwtHighResolutionClock(); void start(); double restart(); double elapsed() const; bool isNull() const; static double precision(); private: #if defined(Q_OS_MAC) static double msecsTo( uint64_t, uint64_t ); uint64_t d_timeStamp; #elif defined(_POSIX_TIMERS) static double msecsTo( const struct timespec &, const struct timespec & ); static bool isMonotonic(); struct timespec d_timeStamp; clockid_t d_clockId; #elif defined(Q_OS_WIN) LARGE_INTEGER d_startTicks; LARGE_INTEGER d_ticksPerSecond; #endif }; #if defined(Q_OS_MAC) QwtHighResolutionClock::QwtHighResolutionClock(): d_timeStamp( 0 ) { } double QwtHighResolutionClock::precision() { return 1e-6; } void QwtHighResolutionClock::start() { d_timeStamp = mach_absolute_time(); } double QwtHighResolutionClock::restart() { const uint64_t timeStamp = mach_absolute_time(); const double elapsed = msecsTo( d_timeStamp, timeStamp ); d_timeStamp = timeStamp; return elapsed; } double QwtHighResolutionClock::elapsed() const { return msecsTo( d_timeStamp, mach_absolute_time() ); } bool QwtHighResolutionClock::isNull() const { return d_timeStamp == 0; } double QwtHighResolutionClock::msecsTo( uint64_t from, uint64_t to ) { const uint64_t difference = to - from; static double conversion = 0.0; if ( conversion == 0.0 ) { mach_timebase_info_data_t info; kern_return_t err = mach_timebase_info( &info ); // convert the timebase into ms if ( err == 0 ) conversion = 1e-6 * ( double ) info.numer / ( double ) info.denom; } return conversion * ( double ) difference; } #elif defined(_POSIX_TIMERS) QwtHighResolutionClock::QwtHighResolutionClock() { d_clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME; d_timeStamp.tv_sec = d_timeStamp.tv_nsec = 0; } double QwtHighResolutionClock::precision() { struct timespec resolution; int clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME; ::clock_getres( clockId, &resolution ); return resolution.tv_nsec / 1e3; } inline bool QwtHighResolutionClock::isNull() const { return d_timeStamp.tv_sec <= 0 && d_timeStamp.tv_nsec <= 0; } inline void QwtHighResolutionClock::start() { ::clock_gettime( d_clockId, &d_timeStamp ); } double QwtHighResolutionClock::restart() { struct timespec timeStamp; ::clock_gettime( d_clockId, &timeStamp ); const double elapsed = msecsTo( d_timeStamp, timeStamp ); d_timeStamp = timeStamp; return elapsed; } inline double QwtHighResolutionClock::elapsed() const { struct timespec timeStamp; ::clock_gettime( d_clockId, &timeStamp ); return msecsTo( d_timeStamp, timeStamp ); } inline double QwtHighResolutionClock::msecsTo( const struct timespec &t1, const struct timespec &t2 ) { return ( t2.tv_sec - t1.tv_sec ) * 1e3 + ( t2.tv_nsec - t1.tv_nsec ) * 1e-6; } bool QwtHighResolutionClock::isMonotonic() { // code copied from qcore_unix.cpp #if (_POSIX_MONOTONIC_CLOCK-0 > 0) return true; #else static int returnValue = 0; if ( returnValue == 0 ) { #if (_POSIX_MONOTONIC_CLOCK-0 < 0) || !defined(_SC_MONOTONIC_CLOCK) returnValue = -1; #elif (_POSIX_MONOTONIC_CLOCK == 0) // detect if the system support monotonic timers const long x = sysconf( _SC_MONOTONIC_CLOCK ); returnValue = ( x >= 200112L ) ? 1 : -1; #endif } return returnValue != -1; #endif } #elif defined(Q_OS_WIN) QwtHighResolutionClock::QwtHighResolutionClock() { d_startTicks.QuadPart = 0; QueryPerformanceFrequency( &d_ticksPerSecond ); } double QwtHighResolutionClock::precision() { LARGE_INTEGER ticks; if ( QueryPerformanceFrequency( &ticks ) && ticks.QuadPart > 0 ) return 1e3 / ticks.QuadPart; return 0.0; } inline bool QwtHighResolutionClock::isNull() const { return d_startTicks.QuadPart <= 0; } inline void QwtHighResolutionClock::start() { QueryPerformanceCounter( &d_startTicks ); } inline double QwtHighResolutionClock::restart() { LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); const double dt = ticks.QuadPart - d_startTicks.QuadPart; d_startTicks = ticks; return dt / d_ticksPerSecond.QuadPart * 1e3; } inline double QwtHighResolutionClock::elapsed() const { LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); const double dt = ticks.QuadPart - d_startTicks.QuadPart; return dt / d_ticksPerSecond.QuadPart * 1e3; } #endif #endif // QWT_HIGH_RESOLUTION_CLOCK class QwtSystemClock::PrivateData { public: #if defined(QWT_HIGH_RESOLUTION_CLOCK) QwtHighResolutionClock *clock; #endif QTime time; }; //! Constructs a null clock object. QwtSystemClock::QwtSystemClock() { d_data = new PrivateData; #if defined(QWT_HIGH_RESOLUTION_CLOCK) d_data->clock = NULL; if ( QwtHighResolutionClock::precision() > 0.0 ) d_data->clock = new QwtHighResolutionClock; #endif } //! Destructor QwtSystemClock::~QwtSystemClock() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) delete d_data->clock; #endif delete d_data; } /*! \return true if the clock has never been started. */ bool QwtSystemClock::isNull() const { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) return d_data->clock->isNull(); #endif return d_data->time.isNull(); } /*! Sets the start time to the current time. */ void QwtSystemClock::start() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) { d_data->clock->start(); return; } #endif d_data->time.start(); } /*! Set the start time to the current time \return Time, that is elapsed since the previous start time. */ double QwtSystemClock::restart() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) return d_data->clock->restart(); #endif return d_data->time.restart(); } /*! \return Number of milliseconds that have elapsed since the last time start() or restart() was called or 0.0 for null clocks. */ double QwtSystemClock::elapsed() const { double elapsed = 0.0; #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) { if ( !d_data->clock->isNull() ) elapsed = d_data->clock->elapsed(); return elapsed; } #endif if ( !d_data->time.isNull() ) elapsed = d_data->time.elapsed(); return elapsed; } #endif qsstv_9.2.6/qwt/qwt_system_clock.h0000664000175000017500000000246413203343610016011 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYSTEM_CLOCK_H #define QWT_SYSTEM_CLOCK_H #include "qwt_global.h" /*! \brief QwtSystemClock provides high resolution clock time functions. Sometimes the resolution offered by QTime ( millisecond ) is not accurate enough for implementing time measurements ( f.e. sampling ). QwtSystemClock offers a subset of the QTime functionality using higher resolution timers ( if possible ). Precision and time intervals are multiples of milliseconds (ms). \note The implementation uses high-resolution performance counter on Windows, mach_absolute_time() on the Mac or POSIX timers on other systems. If none is available it falls back on QTimer. */ class QWT_EXPORT QwtSystemClock { public: QwtSystemClock(); virtual ~QwtSystemClock(); bool isNull() const; void start(); double restart(); double elapsed() const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_text.cpp0000664000175000017500000003722713203343610014636 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_text_engine.h" #include #include #include #include #include #include #include #include #include class QwtTextEngineDict { public: static QwtTextEngineDict &dict(); void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); const QwtTextEngine *textEngine( QwtText::TextFormat ) const; const QwtTextEngine *textEngine( const QString &, QwtText::TextFormat ) const; private: QwtTextEngineDict(); ~QwtTextEngineDict(); typedef QMap EngineMap; inline const QwtTextEngine *engine( EngineMap::const_iterator &it ) const { return it.value(); } EngineMap d_map; }; QwtTextEngineDict &QwtTextEngineDict::dict() { static QwtTextEngineDict engineDict; return engineDict; } QwtTextEngineDict::QwtTextEngineDict() { d_map.insert( QwtText::PlainText, new QwtPlainTextEngine() ); #ifndef QT_NO_RICHTEXT d_map.insert( QwtText::RichText, new QwtRichTextEngine() ); #endif } QwtTextEngineDict::~QwtTextEngineDict() { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { const QwtTextEngine *textEngine = engine( it ); delete textEngine; } } const QwtTextEngine *QwtTextEngineDict::textEngine( const QString& text, QwtText::TextFormat format ) const { if ( format == QwtText::AutoText ) { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { if ( it.key() != QwtText::PlainText ) { const QwtTextEngine *e = engine( it ); if ( e && e->mightRender( text ) ) return e; } } } EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = engine( it ); if ( e ) return e; } it = d_map.find( QwtText::PlainText ); return engine( it ); } void QwtTextEngineDict::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { if ( format == QwtText::AutoText ) return; if ( format == QwtText::PlainText && engine == NULL ) return; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = this->engine( it ); if ( e ) delete e; d_map.remove( format ); } if ( engine != NULL ) d_map.insert( format, engine ); } const QwtTextEngine *QwtTextEngineDict::textEngine( QwtText::TextFormat format ) const { const QwtTextEngine *e = NULL; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) e = engine( it ); return e; } class QwtText::PrivateData { public: PrivateData(): renderFlags( Qt::AlignCenter ), borderRadius( 0 ), borderPen( Qt::NoPen ), backgroundBrush( Qt::NoBrush ), paintAttributes( 0 ), layoutAttributes( 0 ), textEngine( NULL ) { } int renderFlags; QString text; QFont font; QColor color; double borderRadius; QPen borderPen; QBrush backgroundBrush; QwtText::PaintAttributes paintAttributes; QwtText::LayoutAttributes layoutAttributes; const QwtTextEngine *textEngine; }; class QwtText::LayoutCache { public: void invalidate() { textSize = QSizeF(); } QFont font; QSizeF textSize; }; /*! Constructor \param text Text content \param textFormat Text format */ QwtText::QwtText( const QString &text, QwtText::TextFormat textFormat ) { d_data = new PrivateData; d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache = new LayoutCache; } //! Copy constructor QwtText::QwtText( const QwtText &other ) { d_data = new PrivateData; *d_data = *other.d_data; d_layoutCache = new LayoutCache; *d_layoutCache = *other.d_layoutCache; } //! Destructor QwtText::~QwtText() { delete d_data; delete d_layoutCache; } //! Assignment operator QwtText &QwtText::operator=( const QwtText & other ) { *d_data = *other.d_data; *d_layoutCache = *other.d_layoutCache; return *this; } //! Relational operator bool QwtText::operator==( const QwtText &other ) const { return d_data->renderFlags == other.d_data->renderFlags && d_data->text == other.d_data->text && d_data->font == other.d_data->font && d_data->color == other.d_data->color && d_data->borderRadius == other.d_data->borderRadius && d_data->borderPen == other.d_data->borderPen && d_data->backgroundBrush == other.d_data->backgroundBrush && d_data->paintAttributes == other.d_data->paintAttributes && d_data->textEngine == other.d_data->textEngine; } //! Relational operator bool QwtText::operator!=( const QwtText &other ) const // invalidate { return !( other == *this ); } /*! Assign a new text content \param text Text content \param textFormat Text format \sa text() */ void QwtText::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache->invalidate(); } /*! \return Text as QString. \sa setText() */ QString QwtText::text() const { return d_data->text; } /*! \brief Change the render flags The default setting is Qt::AlignCenter \param renderFlags Bitwise OR of the flags used like in QPainter::drawText() \sa renderFlags(), QwtTextEngine::draw() \note Some renderFlags might have no effect, depending on the text format. */ void QwtText::setRenderFlags( int renderFlags ) { if ( renderFlags != d_data->renderFlags ) { d_data->renderFlags = renderFlags; d_layoutCache->invalidate(); } } /*! \return Render flags \sa setRenderFlags() */ int QwtText::renderFlags() const { return d_data->renderFlags; } /*! Set the font. \param font Font \note Setting the font might have no effect, when the text contains control sequences for setting fonts. */ void QwtText::setFont( const QFont &font ) { d_data->font = font; setPaintAttribute( PaintUsingTextFont ); } //! Return the font. QFont QwtText::font() const { return d_data->font; } /*! Return the font of the text, if it has one. Otherwise return defaultFont. \param defaultFont Default font \return Font used for drawing the text \sa setFont(), font(), PaintAttributes */ QFont QwtText::usedFont( const QFont &defaultFont ) const { if ( d_data->paintAttributes & PaintUsingTextFont ) return d_data->font; return defaultFont; } /*! Set the pen color used for drawing the text. \param color Color \note Setting the color might have no effect, when the text contains control sequences for setting colors. */ void QwtText::setColor( const QColor &color ) { d_data->color = color; setPaintAttribute( PaintUsingTextColor ); } //! Return the pen color, used for painting the text QColor QwtText::color() const { return d_data->color; } /*! Return the color of the text, if it has one. Otherwise return defaultColor. \param defaultColor Default color \return Color used for drawing the text \sa setColor(), color(), PaintAttributes */ QColor QwtText::usedColor( const QColor &defaultColor ) const { if ( d_data->paintAttributes & PaintUsingTextColor ) return d_data->color; return defaultColor; } /*! Set the radius for the corners of the border frame \param radius Radius of a rounded corner \sa borderRadius(), setBorderPen(), setBackgroundBrush() */ void QwtText::setBorderRadius( double radius ) { d_data->borderRadius = qMax( 0.0, radius ); } /*! \return Radius for the corners of the border frame \sa setBorderRadius(), borderPen(), backgroundBrush() */ double QwtText::borderRadius() const { return d_data->borderRadius; } /*! Set the background pen \param pen Background pen \sa borderPen(), setBackgroundBrush() */ void QwtText::setBorderPen( const QPen &pen ) { d_data->borderPen = pen; setPaintAttribute( PaintBackground ); } /*! \return Background pen \sa setBorderPen(), backgroundBrush() */ QPen QwtText::borderPen() const { return d_data->borderPen; } /*! Set the background brush \param brush Background brush \sa backgroundBrush(), setBorderPen() */ void QwtText::setBackgroundBrush( const QBrush &brush ) { d_data->backgroundBrush = brush; setPaintAttribute( PaintBackground ); } /*! \return Background brush \sa setBackgroundBrush(), borderPen() */ QBrush QwtText::backgroundBrush() const { return d_data->backgroundBrush; } /*! Change a paint attribute \param attribute Paint attribute \param on On/Off \note Used by setFont(), setColor(), setBorderPen() and setBackgroundBrush() \sa testPaintAttribute() */ void QwtText::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! Test a paint attribute \param attribute Paint attribute \return true, if attribute is enabled \sa setPaintAttribute() */ bool QwtText::testPaintAttribute( PaintAttribute attribute ) const { return d_data->paintAttributes & attribute; } /*! Change a layout attribute \param attribute Layout attribute \param on On/Off \sa testLayoutAttribute() */ void QwtText::setLayoutAttribute( LayoutAttribute attribute, bool on ) { if ( on ) d_data->layoutAttributes |= attribute; else d_data->layoutAttributes &= ~attribute; } /*! Test a layout attribute \param attribute Layout attribute \return true, if attribute is enabled \sa setLayoutAttribute() */ bool QwtText::testLayoutAttribute( LayoutAttribute attribute ) const { return d_data->layoutAttributes | attribute; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \param width Width \return Calculated height */ double QwtText::heightForWidth( double width, const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); double h = 0; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width + left + right ); h -= top + bottom; } else { h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width ); } return h; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \return Calculated height */ /*! Returns the size, that is needed to render text \param defaultFont Font of the text \return Caluclated size */ QSizeF QwtText::textSize( const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); if ( !d_layoutCache->textSize.isValid() || d_layoutCache->font != font ) { d_layoutCache->textSize = d_data->textEngine->textSize( font, d_data->renderFlags, d_data->text ); d_layoutCache->font = font; } QSizeF sz = d_layoutCache->textSize; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); sz -= QSizeF( left + right, top + bottom ); } return sz; } /*! Draw a text into a rectangle \param painter Painter \param rect Rectangle */ void QwtText::draw( QPainter *painter, const QRectF &rect ) const { if ( d_data->paintAttributes & PaintBackground ) { if ( d_data->borderPen != Qt::NoPen || d_data->backgroundBrush != Qt::NoBrush ) { painter->save(); painter->setPen( d_data->borderPen ); painter->setBrush( d_data->backgroundBrush ); if ( d_data->borderRadius == 0 ) { QwtPainter::drawRect( painter, rect ); } else { painter->setRenderHint( QPainter::Antialiasing, true ); painter->drawRoundedRect( rect, d_data->borderRadius, d_data->borderRadius ); } painter->restore(); } } painter->save(); if ( d_data->paintAttributes & PaintUsingTextFont ) { painter->setFont( d_data->font ); } if ( d_data->paintAttributes & PaintUsingTextColor ) { if ( d_data->color.isValid() ) painter->setPen( d_data->color ); } QRectF expandedRect = rect; if ( d_data->layoutAttributes & MinimumLayout ) { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( painter->font(), QApplication::desktop() ); double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); expandedRect.setTop( rect.top() - top ); expandedRect.setBottom( rect.bottom() + bottom ); expandedRect.setLeft( rect.left() - left ); expandedRect.setRight( rect.right() + right ); } d_data->textEngine->draw( painter, expandedRect, d_data->renderFlags, d_data->text ); painter->restore(); } /*! Find the text engine for a text format In case of QwtText::AutoText the first text engine (beside QwtPlainTextEngine) is returned, where QwtTextEngine::mightRender returns true. If there is none QwtPlainTextEngine is returned. If no text engine is registered for the format QwtPlainTextEngine is returnd. \param text Text, needed in case of AutoText \param format Text format \return Corresponding text engine */ const QwtTextEngine *QwtText::textEngine( const QString &text, QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( text, format ); } /*! Assign/Replace a text engine for a text format With setTextEngine it is possible to extend Qwt with other types of text formats. For QwtText::PlainText it is not allowed to assign a engine == NULL. \param format Text format \param engine Text engine \sa QwtMathMLTextEngine \warning Using QwtText::AutoText does nothing. */ void QwtText::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { QwtTextEngineDict::dict().setTextEngine( format, engine ); } /*! \brief Find the text engine for a text format textEngine can be used to find out if a text format is supported. \param format Text format \return The text engine, or NULL if no engine is available. */ const QwtTextEngine *QwtText::textEngine( QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( format ); } qsstv_9.2.6/qwt/qwt_text.h0000664000175000017500000001402613203343610014273 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_H #define QWT_TEXT_H #include "qwt_global.h" #include #include #include #include class QColor; class QPen; class QBrush; class QRectF; class QPainter; class QwtTextEngine; /*! \brief A class representing a text A QwtText is a text including a set of attributes how to render it. - Format\n A text might include control sequences (f.e tags) describing how to render it. Each format (f.e MathML, TeX, Qt Rich Text) has its own set of control sequences, that can be handles by a special QwtTextEngine for this format. - Background\n A text might have a background, defined by a QPen and QBrush to improve its visibility. The corners of the background might be rounded. - Font\n A text might have an individual font. - Color\n A text might have an individual color. - Render Flags\n Flags from Qt::AlignmentFlag and Qt::TextFlag used like in QPainter::drawText(). \sa QwtTextEngine, QwtTextLabel */ class QWT_EXPORT QwtText { public: /*! \brief Text format The text format defines the QwtTextEngine, that is used to render the text. \sa QwtTextEngine, setTextEngine() */ enum TextFormat { /*! The text format is determined using QwtTextEngine::mightRender() for all available text engines in increasing order > PlainText. If none of the text engines can render the text is rendered like QwtText::PlainText. */ AutoText = 0, //! Draw the text as it is, using a QwtPlainTextEngine. PlainText, //! Use the Scribe framework (Qt Rich Text) to render the text. RichText, /*! Use a MathML (http://en.wikipedia.org/wiki/MathML) render engine to display the text. The Qwt MathML extension offers such an engine based on the MathML renderer of the Qt solutions package. To enable MathML support the following code needs to be added to the application: \verbatim QwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine()); \endverbatim */ MathMLText, /*! Use a TeX (http://en.wikipedia.org/wiki/TeX) render engine to display the text ( not implemented yet ). */ TeXText, /*! The number of text formats can be extended using setTextEngine. Formats >= QwtText::OtherFormat are not used by Qwt. */ OtherFormat = 100 }; /*! \brief Paint Attributes Font and color and background are optional attributes of a QwtText. The paint attributes hold the information, if they are set. */ enum PaintAttribute { //! The text has an individual font. PaintUsingTextFont = 0x01, //! The text has an individual color. PaintUsingTextColor = 0x02, //! The text has an individual background. PaintBackground = 0x04 }; //! Paint attributes typedef QFlags PaintAttributes; /*! \brief Layout Attributes The layout attributes affects some aspects of the layout of the text. */ enum LayoutAttribute { /*! Layout the text without its margins. This mode is useful if a text needs to be aligned accurately, like the tick labels of a scale. If QwtTextEngine::textMargins is not implemented for the format of the text, MinimumLayout has no effect. */ MinimumLayout = 0x01 }; //! Layout attributes typedef QFlags LayoutAttributes; QwtText( const QString & = QString::null, TextFormat textFormat = AutoText ); QwtText( const QwtText & ); ~QwtText(); QwtText &operator=( const QwtText & ); bool operator==( const QwtText & ) const; bool operator!=( const QwtText & ) const; void setText( const QString &, QwtText::TextFormat textFormat = AutoText ); QString text() const; bool isNull() const; bool isEmpty() const; void setFont( const QFont & ); QFont font() const; QFont usedFont( const QFont & ) const; void setRenderFlags( int flags ); int renderFlags() const; void setColor( const QColor & ); QColor color() const; QColor usedColor( const QColor & ) const; void setBorderRadius( double ); double borderRadius() const; void setBorderPen( const QPen & ); QPen borderPen() const; void setBackgroundBrush( const QBrush & ); QBrush backgroundBrush() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLayoutAttribute( LayoutAttribute, bool on = true ); bool testLayoutAttribute( LayoutAttribute ) const; double heightForWidth( double width, const QFont & = QFont() ) const; QSizeF textSize( const QFont & = QFont() ) const; void draw( QPainter *painter, const QRectF &rect ) const; static const QwtTextEngine *textEngine( const QString &text, QwtText::TextFormat = AutoText ); static const QwtTextEngine *textEngine( QwtText::TextFormat ); static void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); private: class PrivateData; PrivateData *d_data; class LayoutCache; LayoutCache *d_layoutCache; }; //! \return text().isNull() inline bool QwtText::isNull() const { return text().isNull(); } //! \return text().isEmpty() inline bool QwtText::isEmpty() const { return text().isEmpty(); } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::PaintAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::LayoutAttributes ) Q_DECLARE_METATYPE( QwtText ) #endif qsstv_9.2.6/qwt/qwt_text_engine.cpp0000664000175000017500000002113313203343610016150 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_engine.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include static QString taggedRichText( const QString &text, int flags ) { QString richText = text; // By default QSimpleRichText is Qt::AlignLeft if ( flags & Qt::AlignJustify ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignRight ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignHCenter ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } return richText; } class QwtRichTextDocument: public QTextDocument { public: QwtRichTextDocument( const QString &text, int flags, const QFont &font ) { setUndoRedoEnabled( false ); setDefaultFont( font ); setHtml( text ); // make sure we have a document layout ( void )documentLayout(); QTextOption option = defaultTextOption(); if ( flags & Qt::TextWordWrap ) option.setWrapMode( QTextOption::WordWrap ); else option.setWrapMode( QTextOption::NoWrap ); option.setAlignment( static_cast( flags ) ); setDefaultTextOption( option ); QTextFrame *root = rootFrame(); QTextFrameFormat fm = root->frameFormat(); fm.setBorder( 0 ); fm.setMargin( 0 ); fm.setPadding( 0 ); fm.setBottomMargin( 0 ); fm.setLeftMargin( 0 ); root->setFrameFormat( fm ); adjustSize(); } }; class QwtPlainTextEngine::PrivateData { public: int effectiveAscent( const QFont &font ) const { const QString fontKey = font.key(); QMap::const_iterator it = d_ascentCache.find( fontKey ); if ( it == d_ascentCache.end() ) { int ascent = findAscent( font ); it = d_ascentCache.insert( fontKey, ascent ); } return ( *it ); } private: int findAscent( const QFont &font ) const { static const QString dummy( "E" ); static const QColor white( Qt::white ); const QFontMetrics fm( font ); QPixmap pm( fm.width( dummy ), fm.height() ); pm.fill( white ); QPainter p( &pm ); p.setFont( font ); p.drawText( 0, 0, pm.width(), pm.height(), 0, dummy ); p.end(); const QImage img = pm.toImage(); int row = 0; for ( row = 0; row < img.height(); row++ ) { const QRgb *line = reinterpret_cast( img.scanLine( row ) ); const int w = pm.width(); for ( int col = 0; col < w; col++ ) { if ( line[col] != white.rgb() ) return fm.ascent() - row + 1; } } return fm.ascent(); } mutable QMap d_ascentCache; }; //! Constructor QwtTextEngine::QwtTextEngine() { } //! Destructor QwtTextEngine::~QwtTextEngine() { } //! Constructor QwtPlainTextEngine::QwtPlainTextEngine() { d_data = new PrivateData; } //! Destructor QwtPlainTextEngine::~QwtPlainTextEngine() { delete d_data; } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtPlainTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, width, QWIDGETSIZE_MAX ), flags, text ); return rect.height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtPlainTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ), flags, text ); return rect.size(); } /*! Return margins around the texts \param font Font of the text \param left Return 0 \param right Return 0 \param top Return value for the top margin \param bottom Return value for the bottom margin */ void QwtPlainTextEngine::textMargins( const QFont &font, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = 0; const QFontMetricsF fm( font ); top = fm.ascent() - d_data->effectiveAscent( font ); bottom = fm.descent(); } /*! \brief Draw the text in a clipping rectangle A wrapper for QPainter::drawText. \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered */ void QwtPlainTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtPainter::drawText( painter, rect, flags, text ); } /*! Test if a string can be rendered by this text engine. \return Always true. All texts can be rendered by QwtPlainTextEngine */ bool QwtPlainTextEngine::mightRender( const QString & ) const { return true; } #ifndef QT_NO_RICHTEXT //! Constructor QwtRichTextEngine::QwtRichTextEngine() { } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText() \param text Text to be rendered \param width Width \return Calculated height */ double QwtRichTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { QwtRichTextDocument doc( text, flags, font ); doc.setPageSize( QSizeF( width, QWIDGETSIZE_MAX ) ); return doc.documentLayout()->documentSize().height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText() \param text Text to be rendered \return Caluclated size */ QSizeF QwtRichTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, font ); QTextOption option = doc.defaultTextOption(); if ( option.wrapMode() != QTextOption::NoWrap ) { option.setWrapMode( QTextOption::NoWrap ); doc.setDefaultTextOption( option ); doc.adjustSize(); } return doc.size(); } /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText() \param text Text to be rendered */ void QwtRichTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, painter->font() ); QwtPainter::drawSimpleRichText( painter, rect, flags, doc ); } /*! Wrap text into
tags according flags \param text Text \param flags Bitwise OR of the flags like in for QPainter::drawText() \return Tagged text */ QString QwtRichTextEngine::taggedText( const QString &text, int flags ) const { return taggedRichText( text, flags ); } /*! Test if a string can be rendered by this text engine \param text Text to be tested \return Qt::mightBeRichText(text); */ bool QwtRichTextEngine::mightRender( const QString &text ) const { return Qt::mightBeRichText( text ); } /*! Return margins around the texts \param left Return 0 \param right Return 0 \param top Return 0 \param bottom Return 0 */ void QwtRichTextEngine::textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = bottom = 0; } #endif // !QT_NO_RICHTEXT qsstv_9.2.6/qwt/qwt_text_engine.h0000664000175000017500000001136713203343610015625 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_ENGINE_H #define QWT_TEXT_ENGINE_H 1 #include "qwt_global.h" #include class QFont; class QRectF; class QString; class QPainter; /*! \brief Abstract base class for rendering text strings A text engine is responsible for rendering texts for a specific text format. They are used by QwtText to render a text. QwtPlainTextEngine and QwtRichTextEngine are part of the Qwt library. The implementation of QwtMathMLTextEngine uses code from the Qt solution package. Because of license implications it is built into a separate library. \sa QwtText::setTextEngine() */ class QWT_EXPORT QwtTextEngine { public: virtual ~QwtTextEngine(); /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const = 0; /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered \return Calculated size */ virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const = 0; /*! Test if a string can be rendered by this text engine \param text Text to be tested \return true, if it can be rendered */ virtual bool mightRender( const QString &text ) const = 0; /*! Return margins around the texts The textSize might include margins around the text, like QFontMetrics::descent(). In situations where texts need to be aligned in detail, knowing these margins might improve the layout calculations. \param font Font of the text \param text Text to be rendered \param left Return value for the left margin \param right Return value for the right margin \param top Return value for the top margin \param bottom Return value for the bottom margin */ virtual void textMargins( const QFont &font, const QString &text, double &left, double &right, double &top, double &bottom ) const = 0; /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText() \param text Text to be rendered */ virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const = 0; protected: QwtTextEngine(); }; /*! \brief A text engine for plain texts QwtPlainTextEngine renders texts using the basic Qt classes QPainter and QFontMetrics. */ class QWT_EXPORT QwtPlainTextEngine: public QwtTextEngine { public: QwtPlainTextEngine(); virtual ~QwtPlainTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: class PrivateData; PrivateData *d_data; }; #ifndef QT_NO_RICHTEXT /*! \brief A text engine for Qt rich texts QwtRichTextEngine renders Qt rich texts using the classes of the Scribe framework of Qt. */ class QWT_EXPORT QwtRichTextEngine: public QwtTextEngine { public: QwtRichTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: QString taggedText( const QString &, int flags ) const; }; #endif // !QT_NO_RICHTEXT #endif qsstv_9.2.6/qwt/qwt_text_label.cpp0000664000175000017500000001534313203343610015770 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_label.h" #include "qwt_text.h" #include "qwt_painter.h" #include #include #include class QwtTextLabel::PrivateData { public: PrivateData(): indent( 4 ), margin( 0 ) { } int indent; int margin; QwtText text; }; /*! Constructs an empty label. \param parent Parent widget */ QwtTextLabel::QwtTextLabel( QWidget *parent ): QFrame( parent ) { init(); } /*! Constructs a label that displays the text, text \param parent Parent widget \param text Text */ QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ): QFrame( parent ) { init(); d_data->text = text; } //! Destructor QwtTextLabel::~QwtTextLabel() { delete d_data; } void QwtTextLabel::init() { d_data = new PrivateData(); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } /*! Interface for the designer plugin - does the same as setText() \sa plainText() */ void QwtTextLabel::setPlainText( const QString &text ) { setText( QwtText( text ) ); } /*! Interface for the designer plugin \return Text as plain text \sa setPlainText(), text() */ QString QwtTextLabel::plainText() const { return d_data->text.text(); } /*! Change the label's text, keeping all other QwtText attributes \param text New text \param textFormat Format of text \sa QwtText */ void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text.setText( text, textFormat ); update(); updateGeometry(); } /*! Change the label's text \param text New text */ void QwtTextLabel::setText( const QwtText &text ) { d_data->text = text; update(); updateGeometry(); } //! Return the text const QwtText &QwtTextLabel::text() const { return d_data->text; } //! Clear the text and all QwtText attributes void QwtTextLabel::clear() { d_data->text = QwtText(); update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::indent() const { return d_data->indent; } /*! Set label's text indent in pixels \param indent Indentation in pixels */ void QwtTextLabel::setIndent( int indent ) { if ( indent < 0 ) indent = 0; d_data->indent = indent; update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::margin() const { return d_data->margin; } /*! Set label's margin in pixels \param margin Margin in pixels */ void QwtTextLabel::setMargin( int margin ) { d_data->margin = margin; update(); updateGeometry(); } //! Return label's margin in pixels QSize QwtTextLabel::sizeHint() const { return minimumSizeHint(); } //! Return a minimum size hint QSize QwtTextLabel::minimumSizeHint() const { QSizeF sz = d_data->text.textSize( font() ); int mw = 2 * ( frameWidth() + d_data->margin ); int mh = mw; int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int align = d_data->text.renderFlags(); if ( align & Qt::AlignLeft || align & Qt::AlignRight ) mw += d_data->indent; else if ( align & Qt::AlignTop || align & Qt::AlignBottom ) mh += d_data->indent; } sz += QSizeF( mw, mh ); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! \param width Width \return Preferred height for this widget, given the width. */ int QwtTextLabel::heightForWidth( int width ) const { const int renderFlags = d_data->text.renderFlags(); int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); width -= 2 * frameWidth(); if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight ) width -= indent; int height = qCeil( d_data->text.heightForWidth( width, font() ) ); if ( ( renderFlags & Qt::AlignTop ) || ( renderFlags & Qt::AlignBottom ) ) height += indent; height += 2 * frameWidth(); return height; } /*! Qt paint event \param event Paint event */ void QwtTextLabel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); } //! Redraw the text and focus indicator void QwtTextLabel::drawContents( QPainter *painter ) { const QRect r = textRect(); if ( r.isEmpty() ) return; painter->setFont( font() ); painter->setPen( palette().color( QPalette::Active, QPalette::Text ) ); drawText( painter, QRectF( r ) ); if ( hasFocus() ) { const int m = 2; QRect focusRect = contentsRect().adjusted( m, m, -m + 1, -m + 1); QwtPainter::drawFocusRect( painter, this, focusRect ); } } //! Redraw the text void QwtTextLabel::drawText( QPainter *painter, const QRectF &textRect ) { d_data->text.draw( painter, textRect ); } /*! Calculate geometry for the text in widget coordinates \return Geometry for the text */ QRect QwtTextLabel::textRect() const { QRect r = contentsRect(); if ( !r.isEmpty() && d_data->margin > 0 ) { r.setRect( r.x() + d_data->margin, r.y() + d_data->margin, r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin ); } if ( !r.isEmpty() ) { int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int renderFlags = d_data->text.renderFlags(); if ( renderFlags & Qt::AlignLeft ) r.setX( r.x() + indent ); else if ( renderFlags & Qt::AlignRight ) r.setWidth( r.width() - indent ); else if ( renderFlags & Qt::AlignTop ) r.setY( r.y() + indent ); else if ( renderFlags & Qt::AlignBottom ) r.setHeight( r.height() - indent ); } } return r; } int QwtTextLabel::defaultIndent() const { if ( frameWidth() <= 0 ) return 0; QFont fnt; if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) fnt = d_data->text.font(); else fnt = font(); return QFontMetrics( fnt ).width( 'x' ) / 2; } qsstv_9.2.6/qwt/qwt_text_label.h0000664000175000017500000000346613203343610015440 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_LABEL_H #define QWT_TEXT_LABEL_H #include "qwt_global.h" #include "qwt_text.h" #include class QString; class QPaintEvent; class QPainter; /*! \brief A Widget which displays a QwtText */ class QWT_EXPORT QwtTextLabel : public QFrame { Q_OBJECT Q_PROPERTY( int indent READ indent WRITE setIndent ) Q_PROPERTY( int margin READ margin WRITE setMargin ) Q_PROPERTY( QString plainText READ plainText WRITE setPlainText ) public: explicit QwtTextLabel( QWidget *parent = NULL ); explicit QwtTextLabel( const QwtText &, QWidget *parent = NULL ); virtual ~QwtTextLabel(); void setPlainText( const QString & ); QString plainText() const; public Q_SLOTS: void setText( const QString &, QwtText::TextFormat textFormat = QwtText::AutoText ); virtual void setText( const QwtText & ); void clear(); public: const QwtText &text() const; int indent() const; void setIndent( int ); int margin() const; void setMargin( int ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual int heightForWidth( int ) const; QRect textRect() const; virtual void drawText( QPainter *, const QRectF & ); protected: virtual void paintEvent( QPaintEvent *e ); virtual void drawContents( QPainter * ); private: void init(); int defaultIndent() const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_thermo.cpp0000664000175000017500000005503413203343610015144 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_thermo.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include "qwt_color_map.h" #include #include #include #include #include #include static inline void qwtDrawLine( QPainter *painter, int pos, const QColor &color, const QRect &pipeRect, const QRect &liquidRect, Qt::Orientation orientation ) { painter->setPen( color ); if ( orientation == Qt::Horizontal ) { if ( pos >= liquidRect.left() && pos < liquidRect.right() ) painter->drawLine( pos, pipeRect.top(), pos, pipeRect.bottom() ); } else { if ( pos >= liquidRect.top() && pos < liquidRect.bottom() ) painter->drawLine( pipeRect.left(), pos, pipeRect.right(), pos ); } } QVector qwtTickList( const QwtScaleDiv &scaleDiv ) { QVector values; double lowerLimit = scaleDiv.interval().minValue(); double upperLimit = scaleDiv.interval().maxValue(); if ( upperLimit < lowerLimit ) qSwap( lowerLimit, upperLimit ); values += lowerLimit; for ( int tickType = QwtScaleDiv::MinorTick; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList ticks = scaleDiv.ticks( tickType ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( v > lowerLimit && v < upperLimit ) values += v; } } values += upperLimit; return values; } class QwtThermo::PrivateData { public: PrivateData(): orientation( Qt::Vertical ), scalePosition( QwtThermo::TrailingScale ), spacing( 3 ), borderWidth( 2 ), pipeWidth( 10 ), alarmLevel( 0.0 ), alarmEnabled( false ), autoFillPipe( true ), originMode( QwtThermo::OriginMinimum ), origin( 0.0 ), colorMap( NULL ), value( 0.0 ) { rangeFlags = QwtInterval::IncludeBorders; } ~PrivateData() { delete colorMap; } Qt::Orientation orientation; QwtThermo::ScalePosition scalePosition; int spacing; int borderWidth; int pipeWidth; QwtInterval::BorderFlags rangeFlags; double alarmLevel; bool alarmEnabled; bool autoFillPipe; QwtThermo::OriginMode originMode; double origin; QwtColorMap *colorMap; double value; }; /*! Constructor \param parent Parent widget */ QwtThermo::QwtThermo( QWidget *parent ): QwtAbstractScale( parent ) { d_data = new PrivateData; QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->orientation == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); layoutThermo( true ); } //! Destructor QwtThermo::~QwtThermo() { delete d_data; } /*! \brief Exclude/Include min/max values According to the flags minValue() and maxValue() are included/excluded from the pipe. In case of an excluded value the corresponding tick is painted 1 pixel off of the pipeRect(). F.e. when a minimum of 0.0 has to be displayed as an empty pipe the minValue() needs to be excluded. \param flags Range flags \sa rangeFlags() */ void QwtThermo::setRangeFlags( QwtInterval::BorderFlags flags ) { if ( d_data->rangeFlags != flags ) { d_data->rangeFlags = flags; update(); } } /*! \return Range flags \sa setRangeFlags() */ QwtInterval::BorderFlags QwtThermo::rangeFlags() const { return d_data->rangeFlags; } /*! Set the current value. \param value New Value \sa value() */ void QwtThermo::setValue( double value ) { if ( d_data->value != value ) { d_data->value = value; update(); } } //! Return the value. double QwtThermo::value() const { return d_data->value; } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtThermo() or the next call of setScaleDraw(). */ void QwtThermo::setScaleDraw( QwtScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ const QwtScaleDraw *QwtThermo::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ QwtScaleDraw *QwtThermo::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! Paint event handler \param event Paint event */ void QwtThermo::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); const QRect tRect = pipeRect(); if ( !tRect.contains( event->rect() ) ) { if ( d_data->scalePosition != QwtThermo::NoScale ) scaleDraw()->draw( &painter, palette() ); } const int bw = d_data->borderWidth; const QBrush brush = palette().brush( QPalette::Base ); qDrawShadePanel( &painter, tRect.adjusted( -bw, -bw, bw, bw ), palette(), true, bw, d_data->autoFillPipe ? &brush : NULL ); drawLiquid( &painter, tRect ); } /*! Resize event handler \param event Resize event */ void QwtThermo::resizeEvent( QResizeEvent *event ) { Q_UNUSED( event ); layoutThermo( false ); } /*! Qt change event handler \param event Event */ void QwtThermo::changeEvent( QEvent *event ) { switch( event->type() ) { case QEvent::StyleChange: case QEvent::FontChange: { layoutThermo( true ); break; } default: break; } } /*! Recalculate the QwtThermo geometry and layout based on pipeRect() and the fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtThermo::layoutThermo( bool update_geometry ) { const QRect tRect = pipeRect(); const int bw = d_data->borderWidth + d_data->spacing; const bool inverted = ( upperBound() < lowerBound() ); int from, to; if ( d_data->orientation == Qt::Horizontal ) { from = tRect.left(); to = tRect.right(); if ( d_data->rangeFlags & QwtInterval::ExcludeMinimum ) { if ( inverted ) to++; else from--; } if ( d_data->rangeFlags & QwtInterval::ExcludeMaximum ) { if ( inverted ) from--; else to++; } if ( d_data->scalePosition == QwtThermo::TrailingScale ) { scaleDraw()->setAlignment( QwtScaleDraw::TopScale ); scaleDraw()->move( from, tRect.top() - bw ); } else { scaleDraw()->setAlignment( QwtScaleDraw::BottomScale ); scaleDraw()->move( from, tRect.bottom() + bw ); } scaleDraw()->setLength( to - from ); } else // Qt::Vertical { from = tRect.top(); to = tRect.bottom(); if ( d_data->rangeFlags & QwtInterval::ExcludeMinimum ) { if ( inverted ) from--; else to++; } if ( d_data->rangeFlags & QwtInterval::ExcludeMaximum ) { if ( inverted ) to++; else from--; } if ( d_data->scalePosition == QwtThermo::LeadingScale ) { scaleDraw()->setAlignment( QwtScaleDraw::RightScale ); scaleDraw()->move( tRect.right() + bw, from ); } else { scaleDraw()->setAlignment( QwtScaleDraw::LeftScale ); scaleDraw()->move( tRect.left() - bw, from ); } scaleDraw()->setLength( to - from ); } if ( update_geometry ) { updateGeometry(); update(); } } /*! \return Bounding rectangle of the pipe ( without borders ) in widget coordinates */ QRect QwtThermo::pipeRect() const { int mbd = 0; if ( d_data->scalePosition != QwtThermo::NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); mbd = qMax( d1, d2 ); } const int bw = d_data->borderWidth; const int scaleOff = bw + mbd; const QRect cr = contentsRect(); QRect pipeRect = cr; if ( d_data->orientation == Qt::Horizontal ) { pipeRect.adjust( scaleOff, 0, -scaleOff, 0 ); if ( d_data->scalePosition == QwtThermo::TrailingScale ) pipeRect.setTop( cr.top() + cr.height() - bw - d_data->pipeWidth ); else pipeRect.setTop( bw ); pipeRect.setHeight( d_data->pipeWidth ); } else // Qt::Vertical { pipeRect.adjust( 0, scaleOff, 0, -scaleOff ); if ( d_data->scalePosition == QwtThermo::LeadingScale ) pipeRect.setLeft( bw ); else pipeRect.setLeft( cr.left() + cr.width() - bw - d_data->pipeWidth ); pipeRect.setWidth( d_data->pipeWidth ); } return pipeRect; } /*! \brief Set the orientation. \param orientation Allowed values are Qt::Horizontal and Qt::Vertical. \sa orientation(), scalePosition() */ void QwtThermo::setOrientation( Qt::Orientation orientation ) { if ( orientation == d_data->orientation ) return; d_data->orientation = orientation; if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } layoutThermo( true ); } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtThermo::orientation() const { return d_data->orientation; } /*! \brief Change how the origin is determined. \sa originMode(), serOrigin(), origin() */ void QwtThermo::setOriginMode( OriginMode m ) { if ( m == d_data->originMode ) return; d_data->originMode = m; update(); } /*! \return Mode, how the origin is determined. \sa setOriginMode(), serOrigin(), origin() */ QwtThermo::OriginMode QwtThermo::originMode() const { return d_data->originMode; } /*! \brief Specifies the custom origin. If originMode is set to OriginCustom this property controls where the liquid starts. \param origin New origin level \sa setOriginMode(), originMode(), origin() */ void QwtThermo::setOrigin( double origin ) { if ( origin == d_data->origin ) return; d_data->origin = origin; update(); } /*! \return Origin of the thermo, when OriginCustom is enabled \sa setOrigin(), setOriginMode(), originMode() */ double QwtThermo::origin() const { return d_data->origin; } /*! \brief Change the position of the scale \param scalePosition Position of the scale. \sa ScalePosition, scalePosition() */ void QwtThermo::setScalePosition( ScalePosition scalePosition ) { if ( d_data->scalePosition == scalePosition ) return; d_data->scalePosition = scalePosition; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutThermo( true ); } /*! \return Scale position. \sa setScalePosition() */ QwtThermo::ScalePosition QwtThermo::scalePosition() const { return d_data->scalePosition; } //! Notify a scale change. void QwtThermo::scaleChange() { layoutThermo( true ); } /*! Redraw the liquid in thermometer pipe. \param painter Painter \param pipeRect Bounding rectangle of the pipe without borders */ void QwtThermo::drawLiquid( QPainter *painter, const QRect &pipeRect ) const { painter->save(); painter->setClipRect( pipeRect, Qt::IntersectClip ); painter->setPen( Qt::NoPen ); const QwtScaleMap scaleMap = scaleDraw()->scaleMap(); QRect liquidRect = fillRect( pipeRect ); if ( d_data->colorMap != NULL ) { const QwtInterval interval = scaleDiv().interval().normalized(); // Because the positions of the ticks are rounded // we calculate the colors for the rounded tick values QVector values = qwtTickList( scaleDraw()->scaleDiv() ); if ( scaleMap.isInverting() ) qSort( values.begin(), values.end(), qGreater() ); else qSort( values.begin(), values.end(), qLess() ); int from; if ( !values.isEmpty() ) { from = qRound( scaleMap.transform( values[0] ) ); qwtDrawLine( painter, from, d_data->colorMap->color( interval, values[0] ), pipeRect, liquidRect, d_data->orientation ); } for ( int i = 1; i < values.size(); i++ ) { const int to = qRound( scaleMap.transform( values[i] ) ); for ( int pos = from + 1; pos < to; pos++ ) { const double v = scaleMap.invTransform( pos ); qwtDrawLine( painter, pos, d_data->colorMap->color( interval, v ), pipeRect, liquidRect, d_data->orientation ); } qwtDrawLine( painter, to, d_data->colorMap->color( interval, values[i] ), pipeRect, liquidRect, d_data->orientation ); from = to; } } else { if ( !liquidRect.isEmpty() && d_data->alarmEnabled ) { const QRect r = alarmRect( liquidRect ); if ( !r.isEmpty() ) { painter->fillRect( r, palette().brush( QPalette::Highlight ) ); liquidRect = QRegion( liquidRect ).subtracted( r ).boundingRect(); } } painter->fillRect( liquidRect, palette().brush( QPalette::ButtonText ) ); } painter->restore(); } /*! \brief Change the spacing between pipe and scale A spacing of 0 means, that the backbone of the scale is below the pipe. The default setting is 3 pixels. \param spacing Number of pixels \sa spacing(); */ void QwtThermo::setSpacing( int spacing ) { if ( spacing <= 0 ) spacing = 0; if ( spacing != d_data->spacing ) { d_data->spacing = spacing; layoutThermo( true ); } } /*! \return Number of pixels between pipe and scale \sa setSpacing() */ int QwtThermo::spacing() const { return d_data->spacing; } /*! Set the border width of the pipe. \param width Border width \sa borderWidth() */ void QwtThermo::setBorderWidth( int width ) { if ( width <= 0 ) width = 0; if ( width != d_data->borderWidth ) { d_data->borderWidth = width; layoutThermo( true ); } } /*! \return Border width of the thermometer pipe. \sa setBorderWidth() */ int QwtThermo::borderWidth() const { return d_data->borderWidth; } /*! \brief Assign a color map for the fill color \param colorMap Color map \warning The alarm threshold has no effect, when a color map has been assigned */ void QwtThermo::setColorMap( QwtColorMap *colorMap ) { if ( colorMap != d_data->colorMap ) { delete d_data->colorMap; d_data->colorMap = colorMap; } } /*! \return Color map for the fill color \warning The alarm threshold has no effect, when a color map has been assigned */ QwtColorMap *QwtThermo::colorMap() { return d_data->colorMap; } /*! \return Color map for the fill color \warning The alarm threshold has no effect, when a color map has been assigned */ const QwtColorMap *QwtThermo::colorMap() const { return d_data->colorMap; } /*! \brief Change the brush of the liquid. Changes the QPalette::ButtonText brush of the palette. \param brush New brush. \sa fillBrush(), QWidget::setPalette() */ void QwtThermo::setFillBrush( const QBrush& brush ) { QPalette pal = palette(); pal.setBrush( QPalette::ButtonText, brush ); setPalette( pal ); } /*! \return Liquid ( QPalette::ButtonText ) brush. \sa setFillBrush(), QWidget::palette() */ QBrush QwtThermo::fillBrush() const { return palette().brush( QPalette::ButtonText ); } /*! \brief Specify the liquid brush above the alarm threshold Changes the QPalette::Highlight brush of the palette. \param brush New brush. \sa alarmBrush(), QWidget::setPalette() \warning The alarm threshold has no effect, when a color map has been assigned */ void QwtThermo::setAlarmBrush( const QBrush& brush ) { QPalette pal = palette(); pal.setBrush( QPalette::Highlight, brush ); setPalette( pal ); } /*! \return Liquid brush ( QPalette::Highlight ) above the alarm threshold. \sa setAlarmBrush(), QWidget::palette() \warning The alarm threshold has no effect, when a color map has been assigned */ QBrush QwtThermo::alarmBrush() const { return palette().brush( QPalette::Highlight ); } /*! Specify the alarm threshold. \param level Alarm threshold \sa alarmLevel() \warning The alarm threshold has no effect, when a color map has been assigned */ void QwtThermo::setAlarmLevel( double level ) { d_data->alarmLevel = level; d_data->alarmEnabled = 1; update(); } /*! \return Alarm threshold. \sa setAlarmLevel() \warning The alarm threshold has no effect, when a color map has been assigned */ double QwtThermo::alarmLevel() const { return d_data->alarmLevel; } /*! Change the width of the pipe. \param width Width of the pipe \sa pipeWidth() */ void QwtThermo::setPipeWidth( int width ) { if ( width > 0 ) { d_data->pipeWidth = width; layoutThermo( true ); } } /*! \return Width of the pipe. \sa setPipeWidth() */ int QwtThermo::pipeWidth() const { return d_data->pipeWidth; } /*! \brief Enable or disable the alarm threshold \param on true (disabled) or false (enabled) \warning The alarm threshold has no effect, when a color map has been assigned */ void QwtThermo::setAlarmEnabled( bool on ) { d_data->alarmEnabled = on; update(); } /*! \return True, when the alarm threshold is enabled. \warning The alarm threshold has no effect, when a color map has been assigned */ bool QwtThermo::alarmEnabled() const { return d_data->alarmEnabled; } /*! \return the minimum size hint \sa minimumSizeHint() */ QSize QwtThermo::sizeHint() const { return minimumSizeHint(); } /*! \return Minimum size hint \warning The return value depends on the font and the scale. \sa sizeHint() */ QSize QwtThermo::minimumSizeHint() const { int w = 0, h = 0; if ( d_data->scalePosition != NoScale ) { const int sdExtent = qCeil( scaleDraw()->extent( font() ) ); const int sdLength = scaleDraw()->minLength( font() ); w = sdLength; h = d_data->pipeWidth + sdExtent + d_data->spacing; } else // no scale { w = 200; h = d_data->pipeWidth; } if ( d_data->orientation == Qt::Vertical ) qSwap( w, h ); w += 2 * d_data->borderWidth; h += 2 * d_data->borderWidth; // finally add the margins int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); w += left + right; h += top + bottom; return QSize( w, h ); } /*! \brief Calculate the filled rectangle of the pipe \param pipeRect Rectangle of the pipe \return Rectangle to be filled ( fill and alarm brush ) \sa pipeRect(), alarmRect() */ QRect QwtThermo::fillRect( const QRect &pipeRect ) const { double origin; if ( d_data->originMode == OriginMinimum ) { origin = qMin( lowerBound(), upperBound() ); } else if ( d_data->originMode == OriginMaximum ) { origin = qMax( lowerBound(), upperBound() ); } else // OriginCustom { origin = d_data->origin; } const QwtScaleMap scaleMap = scaleDraw()->scaleMap(); int from = qRound( scaleMap.transform( d_data->value ) ); int to = qRound( scaleMap.transform( origin ) ); if ( to < from ) qSwap( from, to ); QRect fillRect = pipeRect; if ( d_data->orientation == Qt::Horizontal ) { fillRect.setLeft( from ); fillRect.setRight( to ); } else // Qt::Vertical { fillRect.setTop( from ); fillRect.setBottom( to ); } return fillRect.normalized(); } /*! \brief Calculate the alarm rectangle of the pipe \param fillRect Filled rectangle in the pipe \return Rectangle to be filled with the alarm brush \sa pipeRect(), fillRect(), alarmLevel(), alarmBrush() */ QRect QwtThermo::alarmRect( const QRect &fillRect ) const { QRect alarmRect( 0, 0, -1, -1); // something invalid if ( !d_data->alarmEnabled ) return alarmRect; const bool inverted = ( upperBound() < lowerBound() ); bool increasing; if ( d_data->originMode == OriginCustom ) { increasing = d_data->value > d_data->origin; } else { increasing = d_data->originMode == OriginMinimum; } const QwtScaleMap map = scaleDraw()->scaleMap(); const int alarmPos = qRound( map.transform( d_data->alarmLevel ) ); const int valuePos = qRound( map.transform( d_data->value ) ); if ( d_data->orientation == Qt::Horizontal ) { int v1, v2; if ( inverted ) { v1 = fillRect.left(); v2 = alarmPos - 1; v2 = qMin( v2, increasing ? fillRect.right() : valuePos ); } else { v1 = alarmPos + 1; v1 = qMax( v1, increasing ? fillRect.left() : valuePos ); v2 = fillRect.right(); } alarmRect.setRect( v1, fillRect.top(), v2 - v1 + 1, fillRect.height() ); } else { int v1, v2; if ( inverted ) { v1 = alarmPos + 1; v1 = qMax( v1, increasing ? fillRect.top() : valuePos ); v2 = fillRect.bottom(); } else { v1 = fillRect.top(); v2 = alarmPos - 1; v2 = qMin( v2, increasing ? fillRect.bottom() : valuePos ); } alarmRect.setRect( fillRect.left(), v1, fillRect.width(), v2 - v1 + 1 ); } return alarmRect; } qsstv_9.2.6/qwt/qwt_thermo.h0000664000175000017500000001113713203343610014605 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_THERMO_H #define QWT_THERMO_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include "qwt_interval.h" class QwtScaleDraw; class QwtColorMap; /*! \brief The Thermometer Widget QwtThermo is a widget which displays a value in an interval. It supports: - a horizontal or vertical layout; - a range; - a scale; - an alarm level. \image html sysinfo.png The fill colors might be calculated from an optional color map If no color map has been assigned QwtThermo uses the following colors/brushes from the widget palette: - QPalette::Base Background of the pipe - QPalette::ButtonText Fill brush below the alarm level - QPalette::Highlight Fill brush for the values above the alarm level - QPalette::WindowText For the axis of the scale - QPalette::Text For the labels of the scale */ class QWT_EXPORT QwtThermo: public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePosition ) Q_ENUMS( OriginMode ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( ScalePosition scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( OriginMode originMode READ originMode WRITE setOriginMode ) Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled ) Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( int spacing READ spacing WRITE setSpacing ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth ) Q_PROPERTY( double value READ value WRITE setValue ) public: /*! Position of the scale \sa setScalePosition(), setOrientation() */ enum ScalePosition { //! The slider has no scale NoScale, //! The scale is right of a vertical or below of a horizontal slider LeadingScale, //! The scale is left of a vertical or above of a horizontal slider TrailingScale }; /*! Origin mode. This property specifies where the beginning of the liquid is placed. \sa setOriginMode(), setOrigin() */ enum OriginMode { //! The origin is the minimum of the scale OriginMinimum, //! The origin is the maximum of the scale OriginMaximum, //! The origin is specified using the origin() property OriginCustom }; explicit QwtThermo( QWidget *parent = NULL ); virtual ~QwtThermo(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; void setScalePosition( ScalePosition ); ScalePosition scalePosition() const; void setSpacing( int ); int spacing() const; void setBorderWidth( int w ); int borderWidth() const; void setOriginMode( OriginMode ); OriginMode originMode() const; void setOrigin( double ); double origin() const; void setFillBrush( const QBrush &b ); QBrush fillBrush() const; void setAlarmBrush( const QBrush &b ); QBrush alarmBrush() const; void setAlarmLevel( double v ); double alarmLevel() const; void setAlarmEnabled( bool tf ); bool alarmEnabled() const; void setColorMap( QwtColorMap * ); QwtColorMap *colorMap(); const QwtColorMap *colorMap() const; void setPipeWidth( int w ); int pipeWidth() const; void setRangeFlags( QwtInterval::BorderFlags ); QwtInterval::BorderFlags rangeFlags() const; double value() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; public Q_SLOTS: virtual void setValue( double val ); protected: virtual void drawLiquid( QPainter *, const QRect & ) const; virtual void scaleChange(); virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void changeEvent( QEvent * ); QwtScaleDraw *scaleDraw(); QRect pipeRect() const; QRect fillRect( const QRect & ) const; QRect alarmRect( const QRect & ) const; private: void layoutThermo( bool ); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_transform.cpp0000664000175000017500000000623213203343610015655 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_transform.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qExp(x) ::exp(x) #endif //! Smallest allowed value for logarithmic scales: 1.0e-150 const double QwtLogTransform::LogMin = 1.0e-150; //! Largest allowed value for logarithmic scales: 1.0e150 const double QwtLogTransform::LogMax = 1.0e150; //! Constructor QwtTransform::QwtTransform() { } //! Destructor QwtTransform::~QwtTransform() { } /*! \param value Value to be bounded \return value unmodified */ double QwtTransform::bounded( double value ) const { return value; } //! Constructor QwtNullTransform::QwtNullTransform(): QwtTransform() { } //! Destructor QwtNullTransform::~QwtNullTransform() { } /*! \param value Value to be transformed \return value unmodified */ double QwtNullTransform::transform( double value ) const { return value; } /*! \param value Value to be transformed \return value unmodified */ double QwtNullTransform::invTransform( double value ) const { return value; } //! \return Clone of the transformation QwtTransform *QwtNullTransform::copy() const { return new QwtNullTransform(); } //! Constructor QwtLogTransform::QwtLogTransform(): QwtTransform() { } //! Destructor QwtLogTransform::~QwtLogTransform() { } /*! \param value Value to be transformed \return log( value ) */ double QwtLogTransform::transform( double value ) const { return ::log( value ); } /*! \param value Value to be transformed \return exp( value ) */ double QwtLogTransform::invTransform( double value ) const { return qExp( value ); } /*! \param value Value to be bounded \return qBound( LogMin, value, LogMax ) */ double QwtLogTransform::bounded( double value ) const { return qBound( LogMin, value, LogMax ); } //! \return Clone of the transformation QwtTransform *QwtLogTransform::copy() const { return new QwtLogTransform(); } /*! Constructor \param exponent Exponent */ QwtPowerTransform::QwtPowerTransform( double exponent ): QwtTransform(), d_exponent( exponent ) { } //! Destructor QwtPowerTransform::~QwtPowerTransform() { } /*! \param value Value to be transformed \return Exponentiation preserving the sign */ double QwtPowerTransform::transform( double value ) const { if ( value < 0.0 ) return -qPow( -value, 1.0 / d_exponent ); else return qPow( value, 1.0 / d_exponent ); } /*! \param value Value to be transformed \return Inverse exponentiation preserving the sign */ double QwtPowerTransform::invTransform( double value ) const { if ( value < 0.0 ) return -qPow( -value, d_exponent ); else return qPow( value, d_exponent ); } //! \return Clone of the transformation QwtTransform *QwtPowerTransform::copy() const { return new QwtPowerTransform( d_exponent ); } qsstv_9.2.6/qwt/qwt_transform.h0000664000175000017500000000666013203343610015327 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TRANSFORM_H #define QWT_TRANSFORM_H #include "qwt_global.h" /*! \brief A transformation between coordinate systems QwtTransform manipulates values, when being mapped between the scale and the paint device coordinate system. A transformation consists of 2 methods: - transform - invTransform where one is is the inverse function of the other. When p1, p2 are the boundaries of the paint device coordinates and s1, s2 the boundaries of the scale, QwtScaleMap uses the following calculations: - p = p1 + ( p2 - p1 ) * ( T( s ) - T( s1 ) / ( T( s2 ) - T( s1 ) ); - s = invT ( T( s1 ) + ( T( s2 ) - T( s1 ) ) * ( p - p1 ) / ( p2 - p1 ) ); */ class QWT_EXPORT QwtTransform { public: QwtTransform(); virtual ~QwtTransform(); /*! Modify value to be a valid value for the transformation. The default implementation does nothing. */ virtual double bounded( double value ) const; /*! Transformation function \param value Value \return Modified value \sa invTransform() */ virtual double transform( double value ) const = 0; /*! Inverse transformation function \param value Value \return Modified value \sa transform() */ virtual double invTransform( double value ) const = 0; //! Virtualized copy operation virtual QwtTransform *copy() const = 0; }; /*! \brief Null transformation QwtNullTransform returns the values unmodified. */ class QWT_EXPORT QwtNullTransform: public QwtTransform { public: QwtNullTransform(); virtual ~QwtNullTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual QwtTransform *copy() const; }; /*! \brief Logarithmic transformation QwtLogTransform modifies the values using log() and exp(). \note In the calculations of QwtScaleMap the base of the log function has no effect on the mapping. So QwtLogTransform can be used for log2(), log10() or any other logarithmic scale. */ class QWT_EXPORT QwtLogTransform: public QwtTransform { public: QwtLogTransform(); virtual ~QwtLogTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual double bounded( double value ) const; virtual QwtTransform *copy() const; static const double LogMin; static const double LogMax; }; /*! \brief A transformation using pow() QwtPowerTransform preserves the sign of a value. F.e. a transformation with a factor of 2 transforms a value of -3 to -9 and v.v. Thus QwtPowerTransform can be used for scales including negative values. */ class QWT_EXPORT QwtPowerTransform: public QwtTransform { public: QwtPowerTransform( double exponent ); virtual ~QwtPowerTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual QwtTransform *copy() const; private: const double d_exponent; }; #endif qsstv_9.2.6/qwt/qwt_wheel.cpp0000664000175000017500000007247013203343610014755 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_wheel.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qFastSin(x) ::sin(x) #define qExp(x) ::exp(x) #endif class QwtWheel::PrivateData { public: PrivateData(): orientation( Qt::Horizontal ), viewAngle( 175.0 ), totalAngle( 360.0 ), tickCount( 10 ), wheelBorderWidth( 2 ), borderWidth( 2 ), wheelWidth( 20 ), isScrolling( false ), mouseOffset( 0.0 ), tracking( true ), pendingValueChanged( false ), updateInterval( 50 ), mass( 0.0 ), timerId( 0 ), speed( 0.0 ), mouseValue( 0.0 ), flyingValue( 0.0 ), minimum( 0.0 ), maximum( 100.0 ), singleStep( 1.0 ), pageStepCount( 1 ), stepAlignment( true ), value( 0.0 ), inverted( false ), wrapping( false ) { }; Qt::Orientation orientation; double viewAngle; double totalAngle; int tickCount; int wheelBorderWidth; int borderWidth; int wheelWidth; bool isScrolling; double mouseOffset; bool tracking; bool pendingValueChanged; // when not tracking int updateInterval; double mass; // for the flying wheel effect int timerId; QTime time; double speed; double mouseValue; double flyingValue; double minimum; double maximum; double singleStep; int pageStepCount; bool stepAlignment; double value; bool inverted; bool wrapping; }; //! Constructor QwtWheel::QwtWheel( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData; setFocusPolicy( Qt::StrongFocus ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } //! Destructor QwtWheel::~QwtWheel() { delete d_data; } /*! \brief En/Disable tracking If tracking is enabled (the default), the wheel emits the valueChanged() signal while the wheel is moving. If tracking is disabled, the wheel emits the valueChanged() signal only when the wheel movement is terminated. The wheelMoved() signal is emitted regardless id tracking is enabled or not. \param enable On/Off \sa isTracking() */ void QwtWheel::setTracking( bool enable ) { d_data->tracking = enable; } /*! \return True, when tracking is enabled \sa setTracking(), valueChanged(), wheelMoved() */ bool QwtWheel::isTracking() const { return d_data->tracking; } /*! \brief Specify the update interval when the wheel is flying Default and minimum value is 50 ms. \param interval Interval in milliseconds \sa updateInterval(), setMass(), setTracking() */ void QwtWheel::setUpdateInterval( int interval ) { d_data->updateInterval = qMax( interval, 50 ); } /*! \return Update interval when the wheel is flying \sa setUpdateInterval(), mass(), isTracking() */ int QwtWheel::updateInterval() const { return d_data->updateInterval; } /*! \brief Mouse press event handler Start movement of the wheel. \param event Mouse event */ void QwtWheel::mousePressEvent( QMouseEvent *event ) { stopFlying(); d_data->isScrolling = wheelRect().contains( event->pos() ); if ( d_data->isScrolling ) { d_data->time.start(); d_data->speed = 0.0; d_data->mouseValue = valueAt( event->pos() ); d_data->mouseOffset = d_data->mouseValue - d_data->value; d_data->pendingValueChanged = false; Q_EMIT wheelPressed(); } } /*! \brief Mouse Move Event handler Turn the wheel according to the mouse position \param event Mouse event */ void QwtWheel::mouseMoveEvent( QMouseEvent *event ) { if ( !d_data->isScrolling ) return; double mouseValue = valueAt( event->pos() ); if ( d_data->mass > 0.0 ) { double ms = d_data->time.restart(); // the interval when mouse move events are posted are somehow // random. To avoid unrealistic speed values we limit ms ms = qMax( ms, 5.0 ); d_data->speed = ( mouseValue - d_data->mouseValue ) / ms; } d_data->mouseValue = mouseValue; double value = boundedValue( mouseValue - d_data->mouseOffset ); if ( d_data->stepAlignment ) value = alignedValue( value ); if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT wheelMoved( d_data->value ); if ( d_data->tracking ) Q_EMIT valueChanged( d_data->value ); else d_data->pendingValueChanged = true; } } /*! \brief Mouse Release Event handler When the wheel has no mass the movement of the wheel stops, otherwise it starts flying. \param event Mouse event */ void QwtWheel::mouseReleaseEvent( QMouseEvent *event ) { Q_UNUSED( event ); if ( !d_data->isScrolling ) return; d_data->isScrolling = false; bool startFlying = false; if ( d_data->mass > 0.0 ) { const int ms = d_data->time.elapsed(); if ( ( qFabs( d_data->speed ) > 0.0 ) && ( ms < 50 ) ) startFlying = true; } if ( startFlying ) { d_data->flyingValue = boundedValue( d_data->mouseValue - d_data->mouseOffset ); d_data->timerId = startTimer( d_data->updateInterval ); } else { if ( d_data->pendingValueChanged ) Q_EMIT valueChanged( d_data->value ); } d_data->pendingValueChanged = false; d_data->mouseOffset = 0.0; Q_EMIT wheelReleased(); } /*! \brief Qt timer event The flying wheel effect is implemented using a timer \param event Timer event \sa updateInterval() */ void QwtWheel::timerEvent( QTimerEvent *event ) { if ( event->timerId() != d_data->timerId ) { QWidget::timerEvent( event ); return; } d_data->speed *= qExp( -d_data->updateInterval * 0.001 / d_data->mass ); d_data->flyingValue += d_data->speed * d_data->updateInterval; d_data->flyingValue = boundedValue( d_data->flyingValue ); double value = d_data->flyingValue; if ( d_data->stepAlignment ) value = alignedValue( value ); if ( qFabs( d_data->speed ) < 0.001 * d_data->singleStep ) { // stop if d_data->speed < one step per second stopFlying(); } if ( value != d_data->value ) { d_data->value = value; update(); if ( d_data->tracking || d_data->timerId == 0 ) Q_EMIT valueChanged( d_data->value ); } } /*! \brief Handle wheel events In/Decrement the value \param event Wheel event */ void QwtWheel::wheelEvent( QWheelEvent *event ) { if ( !wheelRect().contains( event->pos() ) ) { event->ignore(); return; } if ( d_data->isScrolling ) return; stopFlying(); double increment = 0.0; if ( ( event->modifiers() & Qt::ControlModifier) || ( event->modifiers() & Qt::ShiftModifier ) ) { // one page regardless of delta increment = d_data->singleStep * d_data->pageStepCount; if ( event->delta() < 0 ) increment = -increment; } else { const int numSteps = event->delta() / 120; increment = d_data->singleStep * numSteps; } if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = -increment; double value = boundedValue( d_data->value + increment ); if ( d_data->stepAlignment ) value = alignedValue( value ); if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); Q_EMIT wheelMoved( d_data->value ); } } /*! Handle key events - Qt::Key_Home\n Step to minimum() - Qt::Key_End\n Step to maximum() - Qt::Key_Up\n In case of a horizontal or not inverted vertical wheel the value will be incremented by the step size. For an inverted vertical wheel the value will be decremented by the step size. - Qt::Key_Down\n In case of a horizontal or not inverted vertical wheel the value will be decremented by the step size. For an inverted vertical wheel the value will be incremented by the step size. - Qt::Key_PageUp\n The value will be incremented by pageStepSize() * singleStepSize(). - Qt::Key_PageDown\n The value will be decremented by pageStepSize() * singleStepSize(). \param event Key event */ void QwtWheel::keyPressEvent( QKeyEvent *event ) { if ( d_data->isScrolling ) { // don't interfere mouse scrolling return; } double value = d_data->value; double increment = 0.0; switch ( event->key() ) { case Qt::Key_Down: { if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = d_data->singleStep; else increment = -d_data->singleStep; break; } case Qt::Key_Up: { if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = -d_data->singleStep; else increment = d_data->singleStep; break; } case Qt::Key_Left: { if ( d_data->orientation == Qt::Horizontal ) { if ( d_data->inverted ) increment = d_data->singleStep; else increment = -d_data->singleStep; } break; } case Qt::Key_Right: { if ( d_data->orientation == Qt::Horizontal ) { if ( d_data->inverted ) increment = -d_data->singleStep; else increment = d_data->singleStep; } break; } case Qt::Key_PageUp: { increment = d_data->pageStepCount * d_data->singleStep; break; } case Qt::Key_PageDown: { increment = -d_data->pageStepCount * d_data->singleStep; break; } case Qt::Key_Home: { value = d_data->minimum; break; } case Qt::Key_End: { value = d_data->maximum; break; } default:; { event->ignore(); } } if ( event->isAccepted() ) stopFlying(); if ( increment != 0.0 ) { value = boundedValue( d_data->value + increment ); if ( d_data->stepAlignment ) value = alignedValue( value ); } if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); Q_EMIT wheelMoved( d_data->value ); } } /*! \brief Adjust the number of grooves in the wheel's surface. The number of grooves is limited to 6 <= count <= 50. Values outside this range will be clipped. The default value is 10. \param count Number of grooves per 360 degrees \sa tickCount() */ void QwtWheel::setTickCount( int count ) { count = qBound( 6, count, 50 ); if ( count != d_data->tickCount ) { d_data->tickCount = qBound( 6, count, 50 ); update(); } } /*! \return Number of grooves in the wheel's surface. \sa setTickCnt() */ int QwtWheel::tickCount() const { return d_data->tickCount; } /*! \brief Set the wheel border width of the wheel. The wheel border must not be smaller than 1 and is limited in dependence on the wheel's size. Values outside the allowed range will be clipped. The wheel border defaults to 2. \param borderWidth Border width \sa internalBorder() */ void QwtWheel::setWheelBorderWidth( int borderWidth ) { const int d = qMin( width(), height() ) / 3; borderWidth = qMin( borderWidth, d ); d_data->wheelBorderWidth = qMax( borderWidth, 1 ); update(); } /*! \return Wheel border width \sa setWheelBorderWidth() */ int QwtWheel::wheelBorderWidth() const { return d_data->wheelBorderWidth; } /*! \brief Set the border width The border defaults to 2. \param width Border width \sa borderWidth() */ void QwtWheel::setBorderWidth( int width ) { d_data->borderWidth = qMax( width, 0 ); update(); } /*! \return Border width \sa setBorderWidth() */ int QwtWheel::borderWidth() const { return d_data->borderWidth; } /*! \return Rectangle of the wheel without the outer border */ QRect QwtWheel::wheelRect() const { const int bw = d_data->borderWidth; return contentsRect().adjusted( bw, bw, -bw, -bw ); } /*! \brief Set the total angle which the wheel can be turned. One full turn of the wheel corresponds to an angle of 360 degrees. A total angle of n*360 degrees means that the wheel has to be turned n times around its axis to get from the minimum value to the maximum value. The default setting of the total angle is 360 degrees. \param angle total angle in degrees \sa totalAngle() */ void QwtWheel::setTotalAngle( double angle ) { if ( angle < 0.0 ) angle = 0.0; d_data->totalAngle = angle; update(); } /*! \return Total angle which the wheel can be turned. \sa setTotalAngle() */ double QwtWheel::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the wheel's orientation. The default orientation is Qt::Horizontal. \param orientation Qt::Horizontal or Qt::Vertical. \sa orientation() */ void QwtWheel::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation == orientation ) return; if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } d_data->orientation = orientation; update(); } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtWheel::orientation() const { return d_data->orientation; } /*! \brief Specify the visible portion of the wheel. You may use this function for fine-tuning the appearance of the wheel. The default value is 175 degrees. The value is limited from 10 to 175 degrees. \param angle Visible angle in degrees \sa viewAngle(), setTotalAngle() */ void QwtWheel::setViewAngle( double angle ) { d_data->viewAngle = qBound( 10.0, angle, 175.0 ); update(); } /*! \return Visible portion of the wheel \sa setViewAngle(), totalAngle() */ double QwtWheel::viewAngle() const { return d_data->viewAngle; } /*! Determine the value corresponding to a specified point \param pos Position \return Value corresponding to pos */ double QwtWheel::valueAt( const QPoint &pos ) const { const QRectF rect = wheelRect(); double w, dx; if ( d_data->orientation == Qt::Vertical ) { w = rect.height(); dx = rect.top() - pos.y(); } else { w = rect.width(); dx = pos.x() - rect.left(); } if ( w == 0.0 ) return 0.0; if ( d_data->inverted ) { dx = w - dx; } // w pixels is an arc of viewAngle degrees, // so we convert change in pixels to change in angle const double ang = dx * d_data->viewAngle / w; // value range maps to totalAngle degrees, // so convert the change in angle to a change in value const double val = ang * ( maximum() - minimum() ) / d_data->totalAngle; return val; } /*! \brief Qt Paint Event \param event Paint event */ void QwtWheel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); qDrawShadePanel( &painter, contentsRect(), palette(), true, d_data->borderWidth ); drawWheelBackground( &painter, wheelRect() ); drawTicks( &painter, wheelRect() ); if ( hasFocus() ) QwtPainter::drawFocusRect( &painter, this ); } /*! Draw the Wheel's background gradient \param painter Painter \param rect Geometry for the wheel */ void QwtWheel::drawWheelBackground( QPainter *painter, const QRectF &rect ) { painter->save(); QPalette pal = palette(); // draw shaded background QLinearGradient gradient( rect.topLeft(), ( d_data->orientation == Qt::Horizontal ) ? rect.topRight() : rect.bottomLeft() ); gradient.setColorAt( 0.0, pal.color( QPalette::Button ) ); gradient.setColorAt( 0.2, pal.color( QPalette::Midlight ) ); gradient.setColorAt( 0.7, pal.color( QPalette::Mid ) ); gradient.setColorAt( 1.0, pal.color( QPalette::Dark ) ); painter->fillRect( rect, gradient ); // draw internal border const QPen lightPen( palette().color( QPalette::Light ), d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap ); const QPen darkPen( pal.color( QPalette::Dark ), d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap ); const double bw2 = 0.5 * d_data->wheelBorderWidth; if ( d_data->orientation == Qt::Horizontal ) { painter->setPen( lightPen ); painter->drawLine( QPointF( rect.left(), rect.top() + bw2 ), QPointF( rect.right(), rect.top() + bw2 ) ); painter->setPen( darkPen ); painter->drawLine( QPointF( rect.left(), rect.bottom() - bw2 ), QPointF( rect.right(), rect.bottom() - bw2 ) ); } else // Qt::Vertical { painter->setPen( lightPen ); painter->drawLine( QPointF( rect.left() + bw2, rect.top() ), QPointF( rect.left() + bw2, rect.bottom() ) ); painter->setPen( darkPen ); painter->drawLine( QPointF( rect.right() - bw2, rect.top() ), QPointF( rect.right() - bw2, rect.bottom() ) ); } painter->restore(); } /*! Draw the Wheel's ticks \param painter Painter \param rect Geometry for the wheel */ void QwtWheel::drawTicks( QPainter *painter, const QRectF &rect ) { const double range = d_data->maximum - d_data->minimum; if ( range == 0.0 || d_data->totalAngle == 0.0 ) { return; } const QPen lightPen( palette().color( QPalette::Light ), 0, Qt::SolidLine, Qt::FlatCap ); const QPen darkPen( palette().color( QPalette::Dark ), 0, Qt::SolidLine, Qt::FlatCap ); const double cnvFactor = qAbs( d_data->totalAngle / range ); const double halfIntv = 0.5 * d_data->viewAngle / cnvFactor; const double loValue = value() - halfIntv; const double hiValue = value() + halfIntv; const double tickWidth = 360.0 / double( d_data->tickCount ) / cnvFactor; const double sinArc = qFastSin( d_data->viewAngle * M_PI / 360.0 ); if ( d_data->orientation == Qt::Horizontal ) { const double radius = rect.width() * 0.5; double l1 = rect.top() + d_data->wheelBorderWidth; double l2 = rect.bottom() - d_data->wheelBorderWidth - 1; // draw one point over the border if border > 1 if ( d_data->wheelBorderWidth > 1 ) { l1--; l2++; } const double maxpos = rect.right() - 2; const double minpos = rect.left() + 2; // draw tick marks for ( double tickValue = ::ceil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { const double angle = qwtRadians( tickValue - value() ); const double s = qFastSin( angle * cnvFactor ); const double off = radius * ( sinArc + s ) / sinArc; double tickPos; if ( d_data->inverted ) tickPos = rect.left() + off; else tickPos = rect.right() - off; if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( darkPen ); painter->drawLine( QPointF( tickPos - 1 , l1 ), QPointF( tickPos - 1, l2 ) ); painter->setPen( lightPen ); painter->drawLine( QPointF( tickPos, l1 ), QPointF( tickPos, l2 ) ); } } } else // Qt::Vertical { const double radius = rect.height() * 0.5; double l1 = rect.left() + d_data->wheelBorderWidth; double l2 = rect.right() - d_data->wheelBorderWidth - 1; if ( d_data->wheelBorderWidth > 1 ) { l1--; l2++; } const double maxpos = rect.bottom() - 2; const double minpos = rect.top() + 2; for ( double tickValue = ::ceil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { const double angle = qwtRadians( tickValue - value() ); const double s = qFastSin( angle * cnvFactor ); const double off = radius * ( sinArc + s ) / sinArc; double tickPos; if ( d_data->inverted ) tickPos = rect.bottom() - off; else tickPos = rect.top() + off; if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( darkPen ); painter->drawLine( QPointF( l1, tickPos - 1 ), QPointF( l2, tickPos - 1 ) ); painter->setPen( lightPen ); painter->drawLine( QPointF( l1, tickPos ), QPointF( l2, tickPos ) ); } } } } /*! \brief Set the width of the wheel Corresponds to the wheel height for horizontal orientation, and the wheel width for vertical orientation. \param width the wheel's width \sa wheelWidth() */ void QwtWheel::setWheelWidth( int width ) { d_data->wheelWidth = width; update(); } /*! \return Width of the wheel \sa setWheelWidth() */ int QwtWheel::wheelWidth() const { return d_data->wheelWidth; } /*! \return a size hint */ QSize QwtWheel::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \warning The return value is based on the wheel width. */ QSize QwtWheel::minimumSizeHint() const { QSize sz( 3 * d_data->wheelWidth + 2 * d_data->borderWidth, d_data->wheelWidth + 2 * d_data->borderWidth ); if ( d_data->orientation != Qt::Horizontal ) sz.transpose(); return sz; } /*! \brief Set the step size of the counter A value <= 0.0 disables stepping \param stepSize Single step size \sa singleStep(), setPageStepCount() */ void QwtWheel::setSingleStep( double stepSize ) { d_data->singleStep = qMax( stepSize, 0.0 ); } /*! \return Single step size \sa setSingleStep() */ double QwtWheel::singleStep() const { return d_data->singleStep; } /*! \brief En/Disable step alignment When step alignment is enabled value changes initiated by user input ( mouse, keyboard, wheel ) are aligned to the multiples of the single step. \param on On/Off \sa stepAlignment(), setSingleStep() */ void QwtWheel::setStepAlignment( bool on ) { if ( on != d_data->stepAlignment ) { d_data->stepAlignment = on; } } /*! \return True, when the step alignment is enabled \sa setStepAlignment(), singleStep() */ bool QwtWheel::stepAlignment() const { return d_data->stepAlignment; } /*! \brief Set the page step count pageStepCount is a multiplicator for the single step size that typically corresponds to the user pressing PageUp or PageDown. A value of 0 disables page stepping. The default value is 1. \param count Multiplicator for the single step size \sa pageStepCount(), setSingleStep() */ void QwtWheel::setPageStepCount( int count ) { d_data->pageStepCount = qMax( 0, count ); } /*! \return Page step count \sa setPageStepCount(), singleStep() */ int QwtWheel::pageStepCount() const { return d_data->pageStepCount; } /*! \brief Set the minimum and maximum values The maximum is adjusted if necessary to ensure that the range remains valid. The value might be modified to be inside of the range. \param min Minimum value \param max Maximum value \sa minimum(), maximum() */ void QwtWheel::setRange( double min, double max ) { max = qMax( min, max ); if ( d_data->minimum == min && d_data->maximum == max ) return; d_data->minimum = min; d_data->maximum = max; if ( d_data->value < min || d_data->value > max ) { d_data->value = qBound( min, d_data->value, max ); update(); Q_EMIT valueChanged( d_data->value ); } } /*! Set the minimum value of the range \param value Minimum value \sa setRange(), setMaximum(), minimum() \note The maximum is adjusted if necessary to ensure that the range remains valid. */ void QwtWheel::setMinimum( double value ) { setRange( value, maximum() ); } /*! \return The minimum of the range \sa setRange(), setMinimum(), maximum() */ double QwtWheel::minimum() const { return d_data->minimum; } /*! Set the maximum value of the range \param value Maximum value \sa setRange(), setMinimum(), maximum() */ void QwtWheel::setMaximum( double value ) { setRange( minimum(), value ); } /*! \return The maximum of the range \sa setRange(), setMaximum(), minimum() */ double QwtWheel::maximum() const { return d_data->maximum; } /*! \brief Set a new value without adjusting to the step raster \param value New value \sa value(), valueChanged() \warning The value is clipped when it lies outside the range. */ void QwtWheel::setValue( double value ) { stopFlying(); d_data->isScrolling = false; value = qBound( d_data->minimum, value, d_data->maximum ); if ( d_data->value != value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); } } /*! \return Current value of the wheel \sa setValue(), valueChanged() */ double QwtWheel::value() const { return d_data->value; } /*! \brief En/Disable inverted appearance An inverted wheel increases its values in the opposite direction. The direction of an inverted horizontal wheel will be from right to left an inverted vertical wheel will increase from bottom to top. \param on En/Disable inverted appearance \sa isInverted() */ void QwtWheel::setInverted( bool on ) { if ( d_data->inverted != on ) { d_data->inverted = on; update(); } } /*! \return True, when the wheel is inverted \sa setInverted() */ bool QwtWheel::isInverted() const { return d_data->inverted; } /*! \brief En/Disable wrapping If wrapping is true stepping up from maximum() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtWheel::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtWheel::wrapping() const { return d_data->wrapping; } /*! \brief Set the slider's mass for flywheel effect. If the slider's mass is greater then 0, it will continue to move after the mouse button has been released. Its speed decreases with time at a rate depending on the slider's mass. A large mass means that it will continue to move for a long time. Derived widgets may overload this function to make it public. \param mass New mass in kg \bug If the mass is smaller than 1g, it is set to zero. The maximal mass is limited to 100kg. \sa mass() */ void QwtWheel::setMass( double mass ) { if ( mass < 0.001 ) { d_data->mass = 0.0; } else { d_data->mass = qMin( 100.0, mass ); } if ( d_data->mass <= 0.0 ) stopFlying(); } /*! \return mass \sa setMass() */ double QwtWheel::mass() const { return d_data->mass; } //! Stop the flying movement of the wheel void QwtWheel::stopFlying() { if ( d_data->timerId != 0 ) { killTimer( d_data->timerId ); d_data->timerId = 0; d_data->speed = 0.0; } } double QwtWheel::boundedValue( double value ) const { const double range = d_data->maximum - d_data->minimum; if ( d_data->wrapping && range >= 0.0 ) { if ( value < d_data->minimum ) { value += ::ceil( ( d_data->minimum - value ) / range ) * range; } else if ( value > d_data->maximum ) { value -= ::ceil( ( value - d_data->maximum ) / range ) * range; } } else { value = qBound( d_data->minimum, value, d_data->maximum ); } return value; } double QwtWheel::alignedValue( double value ) const { const double stepSize = d_data->singleStep; if ( stepSize > 0.0 ) { value = d_data->minimum + qRound( ( value - d_data->minimum ) / stepSize ) * stepSize; // correct rounding error at the border if ( qFuzzyCompare( value, d_data->maximum ) ) value = d_data->maximum; // correct rounding error if value = 0 if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; } return value; } qsstv_9.2.6/qwt/qwt_wheel.h0000664000175000017500000001141213203343610014407 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WHEEL_H #define QWT_WHEEL_H #include "qwt_global.h" #include /*! \brief The Wheel Widget The wheel widget can be used to change values over a very large range in very small steps. Using the setMass() member, it can be configured as a flying wheel. The default range of the wheel is [0.0, 100.0] \sa The radio example. */ class QWT_EXPORT QwtWheel: public QWidget { Q_OBJECT Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( double minimum READ minimum WRITE setMinimum ) Q_PROPERTY( double maximum READ maximum WRITE setMaximum ) Q_PROPERTY( double singleStep READ singleStep WRITE setSingleStep ) Q_PROPERTY( int pageStepCount READ pageStepCount WRITE setPageStepCount ) Q_PROPERTY( bool stepAlignment READ stepAlignment WRITE setStepAlignment ) Q_PROPERTY( bool tracking READ isTracking WRITE setTracking ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( bool inverted READ isInverted WRITE setInverted ) Q_PROPERTY( double mass READ mass WRITE setMass ) Q_PROPERTY( int updateInterval READ updateInterval WRITE setUpdateInterval ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( double viewAngle READ viewAngle WRITE setViewAngle ) Q_PROPERTY( int tickCount READ tickCount WRITE setTickCount ) Q_PROPERTY( int wheelWidth READ wheelWidth WRITE setWheelWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int wheelBorderWidth READ wheelBorderWidth WRITE setWheelBorderWidth ) public: explicit QwtWheel( QWidget *parent = NULL ); virtual ~QwtWheel(); double value() const; void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; double totalAngle() const; double viewAngle() const; void setTickCount( int ); int tickCount() const; void setWheelWidth( int ); int wheelWidth() const; void setWheelBorderWidth( int ); int wheelBorderWidth() const; void setBorderWidth( int ); int borderWidth() const; void setInverted( bool tf ); bool isInverted() const; void setWrapping( bool tf ); bool wrapping() const; void setSingleStep( double ); double singleStep() const; void setPageStepCount( int ); int pageStepCount() const; void setStepAlignment( bool on ); bool stepAlignment() const; void setRange( double vmin, double vmax ); void setMinimum( double min ); double minimum() const; void setMaximum( double max ); double maximum() const; void setUpdateInterval( int ); int updateInterval() const; void setTracking( bool enable ); bool isTracking() const; double mass() const; public Q_SLOTS: void setValue( double ); void setTotalAngle ( double ); void setViewAngle( double ); void setMass( double ); Q_SIGNALS: /*! \brief Notify a change of value. When tracking is enabled this signal will be emitted every time the value changes. \param value new value \sa setTracking() */ void valueChanged( double value ); /*! This signal is emitted when the user presses the the wheel with the mouse */ void wheelPressed(); /*! This signal is emitted when the user releases the mouse */ void wheelReleased(); /*! This signal is emitted when the user moves the wheel with the mouse. \param value new value */ void wheelMoved( double value ); protected: virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void mouseMoveEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void wheelEvent( QWheelEvent * ); virtual void timerEvent( QTimerEvent * ); void stopFlying(); QRect wheelRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void drawTicks( QPainter *, const QRectF & ); virtual void drawWheelBackground( QPainter *, const QRectF & ); virtual double valueAt( const QPoint & ) const; private: double alignedValue( double ) const; double boundedValue( double ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_widget_overlay.cpp0000664000175000017500000002037613203343610016673 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_widget_overlay.h" #include "qwt_painter.h" #include #include #include #include static QImage::Format qwtMaskImageFormat() { if ( QwtPainter::isX11GraphicsSystem() ) return QImage::Format_ARGB32; return QImage::Format_ARGB32_Premultiplied; } static QRegion qwtAlphaMask( const QImage& image, const QVector rects ) { const int w = image.width(); const int h = image.height(); QRegion region; QRect rect; for ( int i = 0; i < rects.size(); i++ ) { int x1, x2, y1, y2; rects[i].getCoords( &x1, &y1, &x2, &y2 ); x1 = qMax( x1, 0 ); x2 = qMin( x2, w - 1 ); y1 = qMax( y1, 0 ); y2 = qMin( y2, h - 1 ); for ( int y = y1; y <= y2; ++y ) { bool inRect = false; int rx0 = -1; const uint *line = reinterpret_cast ( image.scanLine( y ) ) + x1; for ( int x = x1; x <= x2; x++ ) { const bool on = ( ( *line++ >> 24 ) != 0 ); if ( on != inRect ) { if ( inRect ) { rect.setCoords( rx0, y, x - 1, y ); region += rect; } else { rx0 = x; } inRect = on; } } if ( inRect ) { rect.setCoords( rx0, y, x2, y ); region = region.united( rect ); } } } return region; } class QwtWidgetOverlay::PrivateData { public: PrivateData(): maskMode( QwtWidgetOverlay::MaskHint ), renderMode( QwtWidgetOverlay::AutoRenderMode ), rgbaBuffer( NULL ) { } ~PrivateData() { resetRgbaBuffer(); } void resetRgbaBuffer() { if ( rgbaBuffer ) { ::free( rgbaBuffer ); rgbaBuffer = NULL; } } MaskMode maskMode; RenderMode renderMode; uchar *rgbaBuffer; }; /*! \brief Constructor \param widget Parent widget, where the overlay is aligned to */ QwtWidgetOverlay::QwtWidgetOverlay( QWidget* widget ): QWidget( widget ) { d_data = new PrivateData; setAttribute( Qt::WA_TransparentForMouseEvents ); setAttribute( Qt::WA_NoSystemBackground ); setFocusPolicy( Qt::NoFocus ); if ( widget ) { resize( widget->size() ); widget->installEventFilter( this ); } } //! Destructor QwtWidgetOverlay::~QwtWidgetOverlay() { delete d_data; } /*! \brief Specify how to find the mask for the overlay \param mode New mode \sa maskMode() */ void QwtWidgetOverlay::setMaskMode( MaskMode mode ) { if ( mode != d_data->maskMode ) { d_data->maskMode = mode; d_data->resetRgbaBuffer(); } } /*! \return Mode how to find the mask for the overlay \sa setMaskMode() */ QwtWidgetOverlay::MaskMode QwtWidgetOverlay::maskMode() const { return d_data->maskMode; } /*! Set the render mode \param mode Render mode \sa RenderMode, renderMode() */ void QwtWidgetOverlay::setRenderMode( RenderMode mode ) { d_data->renderMode = mode; } /*! \return Render mode \sa RenderMode, setRenderMode() */ QwtWidgetOverlay::RenderMode QwtWidgetOverlay::renderMode() const { return d_data->renderMode; } /*! Recalculate the mask and repaint the overlay */ void QwtWidgetOverlay::updateOverlay() { updateMask(); update(); } void QwtWidgetOverlay::updateMask() { d_data->resetRgbaBuffer(); QRegion mask; if ( d_data->maskMode == QwtWidgetOverlay::MaskHint ) { mask = maskHint(); } else if ( d_data->maskMode == QwtWidgetOverlay::AlphaMask ) { // TODO: the image doesn't need to be larger than // the bounding rectangle of the hint !! QRegion hint = maskHint(); if ( hint.isEmpty() ) hint += QRect( 0, 0, width(), height() ); // A fresh buffer from calloc() is usually faster // than reinitializing an existing one with // QImage::fill( 0 ) or memset() d_data->rgbaBuffer = ( uchar* )::calloc( width() * height(), 4 ); QImage image( d_data->rgbaBuffer, width(), height(), qwtMaskImageFormat() ); QPainter painter( &image ); draw( &painter ); painter.end(); mask = qwtAlphaMask( image, hint.rects() ); if ( d_data->renderMode == QwtWidgetOverlay::DrawOverlay ) { // we don't need the buffer later d_data->resetRgbaBuffer(); } } // A bug in Qt initiates a full repaint of the widget // when we change the mask, while we are visible ! setVisible( false ); if ( mask.isEmpty() ) clearMask(); else setMask( mask ); setVisible( true ); } /*! Paint event \param event Paint event \sa drawOverlay() */ void QwtWidgetOverlay::paintEvent( QPaintEvent* event ) { const QRegion clipRegion = event->region(); QPainter painter( this ); bool useRgbaBuffer = false; if ( d_data->renderMode == QwtWidgetOverlay::CopyAlphaMask ) { useRgbaBuffer = true; } else if ( d_data->renderMode == QwtWidgetOverlay::AutoRenderMode ) { if ( painter.paintEngine()->type() == QPaintEngine::Raster ) useRgbaBuffer = true; } if ( d_data->rgbaBuffer && useRgbaBuffer ) { const QImage image( d_data->rgbaBuffer, width(), height(), qwtMaskImageFormat() ); QVector rects; if ( clipRegion.rects().size() > 2000 ) { // the region is to complex painter.setClipRegion( clipRegion ); rects += clipRegion.boundingRect(); } else { rects = clipRegion.rects(); } for ( int i = 0; i < rects.size(); i++ ) { const QRect r = rects[i]; painter.drawImage( r.topLeft(), image, r ); } } else { painter.setClipRegion( clipRegion ); draw( &painter ); } } /*! Resize event \param event Resize event */ void QwtWidgetOverlay::resizeEvent( QResizeEvent* event ) { Q_UNUSED( event ); d_data->resetRgbaBuffer(); } void QwtWidgetOverlay::draw( QPainter *painter ) const { QWidget *widget = const_cast< QWidget *>( parentWidget() ); if ( widget ) { painter->setClipRect( parentWidget()->contentsRect() ); // something special for the plot canvas QPainterPath clipPath; ( void )QMetaObject::invokeMethod( widget, "borderPath", Qt::DirectConnection, Q_RETURN_ARG( QPainterPath, clipPath ), Q_ARG( QRect, rect() ) ); if (!clipPath.isEmpty()) { painter->setClipPath( clipPath, Qt::IntersectClip ); } } drawOverlay( painter ); } /*! \brief Calculate an approximation for the mask - MaskHint The hint is used as mask. - AlphaMask The hint is used to speed up the algorithm for calculating a mask from non transparent pixels - NoMask The hint is unused. The default implementation returns an invalid region indicating no hint. \return Hint for the mask */ QRegion QwtWidgetOverlay::maskHint() const { return QRegion(); } /*! \brief Event filter Resize the overlay according to the size of the parent widget. \param object Object to be filtered \param event Event \return See QObject::eventFilter() */ bool QwtWidgetOverlay::eventFilter( QObject* object, QEvent* event ) { if ( object == parent() && event->type() == QEvent::Resize ) { QResizeEvent *resizeEvent = static_cast( event ); resize( resizeEvent->size() ); } return QObject::eventFilter( object, event ); } qsstv_9.2.6/qwt/qwt_widget_overlay.h0000664000175000017500000000776113203343610016343 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WIDGET_OVERLAY_H #define QWT_WIDGET_OVERLAY_H #include "qwt_global.h" #include #include class QPainter; /*! \brief An overlay for a widget The main use case of an widget overlay is to avoid heavy repaint operation of the widget below. F.e. in combination with the plot canvas an overlay avoid replots as the content of the canvas can be restored from its backing store. QwtWidgetOverlay is an abstract base class. Deriving classes are supposed to reimplement the following methods: - drawOverlay() - maskHint() Internally QwtPlotPicker uses overlays for displaying the rubber band and the tracker text. \sa QwtPlotCanvas::BackingStore */ class QWT_EXPORT QwtWidgetOverlay: public QWidget { public: /*! \brief Mask mode When using masks the widget below gets paint events for the masked regions of the overlay only. Otherwise Qt triggers full repaints. On less powerful hardware ( f.e embedded systems ) - or when using the raster paint engine on a remote desktop - bit blitting is a noticeable operation, that needs to be avoided. If and how to mask depends on how expensive the calculation of the mask is and how many pixels can be excluded by the mask. The default setting is MaskHint. \sa setMaskMode(), maskMode() */ enum MaskMode { //! Don't use a mask. NoMask, /*! \brief Use maskHint() as mask For many situations a fast approximation is good enough and it is not necessary to build a more detailed mask ( f.e the bounding rectangle of a text ). */ MaskHint, /*! \brief Calculate a mask by checking the alpha values Sometimes it is not possible to give a fast approximation and the mask needs to be calculated by drawing the overlay and testing the result. When a valid maskHint() is available only pixels inside this approximation are checked. */ AlphaMask }; /*! \brief Render mode For calculating the alpha mask the overlay has already been painted to a temporary QImage. Instead of rendering the overlay twice this buffer can be copied for drawing the overlay. On graphic systems using the raster paint engine ( QWS, Windows ) it means usually copying some memory only. On X11 it results in an expensive operation building a pixmap and for simple overlays it might not be recommended. \note The render mode has no effect, when maskMode() != AlphaMask. */ enum RenderMode { //! Copy the buffer, when using the raster paint engine. AutoRenderMode, //! Always copy the buffer CopyAlphaMask, //! Never copy the buffer DrawOverlay }; QwtWidgetOverlay( QWidget* ); virtual ~QwtWidgetOverlay(); void setMaskMode( MaskMode ); MaskMode maskMode() const; void setRenderMode( RenderMode ); RenderMode renderMode() const; void updateOverlay(); virtual bool eventFilter( QObject *, QEvent *); protected: virtual void paintEvent( QPaintEvent* event ); virtual void resizeEvent( QResizeEvent* event ); virtual QRegion maskHint() const; /*! Draw the widget overlay \param painter Painter */ virtual void drawOverlay( QPainter *painter ) const = 0; private: void updateMask(); void draw( QPainter * ) const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt.h0000664000175000017500000000100013203343610013213 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_H #define QWT_H #include "qwt_global.h" /*! Some constants for use within Qwt. */ namespace Qwt { }; #endif qsstv_9.2.6/qwt/qwt.pro0000664000175000017500000001216213203343610013577 0ustar jomajoma#------------------------------------------------- # # Project created by QtCreator 2014-03-11T09:49:32 # #------------------------------------------------- QT += core gui concurrent greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = qwt TEMPLATE = lib CONFIG += staticlib SOURCES += \ qwt_point_3d.cpp \ qwt_abstract_legend.cpp \ qwt_pixel_matrix.cpp \ qwt_plot_xml.cpp \ qwt_math.cpp \ qwt_sampling_thread.cpp \ qwt_plot_seriesitem.cpp \ qwt_legend_data.cpp \ qwt_point_polar.cpp \ qwt_transform.cpp \ qwt_plot_magnifier.cpp \ qwt_plot_dict.cpp \ qwt_plot_textlabel.cpp \ qwt_scale_map.cpp \ qwt_painter_command.cpp \ qwt_analog_clock.cpp \ qwt_compass_rose.cpp \ qwt_plot_panner.cpp \ qwt_event_pattern.cpp \ qwt_date_scale_draw.cpp \ qwt_point_data.cpp \ qwt_column_symbol.cpp \ qwt_text_label.cpp \ qwt_plot_zoneitem.cpp \ qwt_compass.cpp \ qwt_scale_div.cpp \ qwt_plot_spectrocurve.cpp \ qwt_matrix_raster_data.cpp \ qwt_interval_symbol.cpp \ qwt_system_clock.cpp \ qwt_round_scale_draw.cpp \ qwt_arrow_button.cpp \ qwt_plot_directpainter.cpp \ qwt_interval.cpp \ qwt_widget_overlay.cpp \ qwt_spline.cpp \ qwt_text_engine.cpp \ qwt_series_data.cpp \ qwt_legend_label.cpp \ qwt_plot_picker.cpp \ qwt_plot_abstract_barchart.cpp \ qwt_abstract_scale_draw.cpp \ qwt_plot_grid.cpp \ qwt_color_map.cpp \ qwt_curve_fitter.cpp \ qwt_abstract_scale.cpp \ qwt_plot_scaleitem.cpp \ qwt_dial_needle.cpp \ qwt_plot_shapeitem.cpp \ qwt_plot_barchart.cpp \ qwt_raster_data.cpp \ qwt_magnifier.cpp \ qwt_panner.cpp \ qwt_clipper.cpp \ qwt_picker_machine.cpp \ qwt_null_paintdevice.cpp \ qwt_plot_marker.cpp \ qwt_dyngrid_layout.cpp \ qwt_plot_zoomer.cpp \ qwt_plot_rescaler.cpp \ qwt_plot_intervalcurve.cpp \ qwt_plot_item.cpp \ qwt_text.cpp \ qwt_date.cpp \ qwt_plot_spectrogram.cpp \ qwt_counter.cpp \ qwt_plot_axis.cpp \ qwt_plot_histogram.cpp \ qwt_plot_tradingcurve.cpp \ qwt_abstract_slider.cpp \ qwt_plot_multi_barchart.cpp \ qwt_point_mapper.cpp \ qwt_dial.cpp \ qwt_plot_legenditem.cpp \ qwt_knob.cpp \ qwt_legend.cpp \ qwt_scale_draw.cpp \ qwt_scale_widget.cpp \ qwt_thermo.cpp \ qwt_slider.cpp \ qwt_graphic.cpp \ qwt_plot_rasteritem.cpp \ qwt_plot_renderer.cpp \ qwt_scale_engine.cpp \ qwt_plot_canvas.cpp \ qwt_wheel.cpp \ qwt_plot_curve.cpp \ qwt_plot.cpp \ qwt_date_scale_engine.cpp \ qwt_painter.cpp \ qwt_picker.cpp \ qwt_plot_layout.cpp \ qwt_symbol.cpp HEADERS += \ qwt.h \ qwt_compat.h \ qwt_clipper.h \ qwt_global.h \ qwt_sampling_thread.h \ qwt_system_clock.h \ qwt_plot_magnifier.h \ qwt_arrow_button.h \ qwt_plot_panner.h \ qwt_plot_svgitem.h \ qwt_plot_dict.h \ qwt_plot_zoneitem.h \ qwt_plot_textlabel.h \ qwt_date_scale_draw.h \ qwt_text_label.h \ qwt_round_scale_draw.h \ qwt_legend_label.h \ qwt_plot_seriesitem.h \ qwt_matrix_raster_data.h \ qwt_abstract_legend.h \ qwt_compass.h \ qwt_plot_spectrocurve.h \ qwt_analog_clock.h \ qwt_legend_data.h \ qwt_compass_rose.h \ qwt_interval_symbol.h \ qwt_date_scale_engine.h \ qwt_pixel_matrix.h \ qwt_dyngrid_layout.h \ qwt_magnifier.h \ qwt_spline.h \ qwt_plot_grid.h \ qwt_plot_abstract_barchart.h \ qwt_plot_scaleitem.h \ qwt_raster_data.h \ qwt_point_mapper.h \ qwt_scale_div.h \ qwt_plot_picker.h \ qwt_abstract_scale.h \ qwt_panner.h \ qwt_plot_directpainter.h \ qwt_scale_draw.h \ qwt_plot_layout.h \ qwt_plot_shapeitem.h \ qwt_math.h \ qwt_null_paintdevice.h \ qwt_plot_marker.h \ qwt_legend.h \ qwt_slider.h \ qwt_transform.h \ qwt_scale_widget.h \ qwt_date.h \ qwt_plot_barchart.h \ qwt_point_data.h \ qwt_plot_spectrogram.h \ qwt_abstract_scale_draw.h \ qwt_plot_legenditem.h \ qwt_curve_fitter.h \ qwt_scale_map.h \ qwt_painter_command.h \ qwt_column_symbol.h \ qwt_plot_rescaler.h \ qwt_point_3d.h \ qwt_plot_intervalcurve.h \ qwt_plot_multi_barchart.h \ qwt_widget_overlay.h \ qwt_dial_needle.h \ qwt_plot_zoomer.h \ qwt_plot_histogram.h \ qwt_counter.h \ qwt_abstract_slider.h \ qwt_plot_renderer.h \ qwt_point_polar.h \ qwt_thermo.h \ qwt_knob.h \ qwt_plot_rasteritem.h \ qwt_series_store.h \ qwt_text_engine.h \ qwt_wheel.h \ qwt_plot_canvas.h \ qwt_samples.h \ qwt_dial.h \ qwt_color_map.h \ qwt_plot_tradingcurve.h \ qwt_graphic.h \ qwt_picker_machine.h \ qwt_event_pattern.h \ qwt_painter.h \ qwt_text.h \ qwt_symbol.h \ qwt_scale_engine.h \ qwt_interval.h \ qwt_plot_item.h \ qwt_plot.h \ qwt_series_data.h \ qwt_picker.h \ qwt_plot_curve.h unix:!symbian { maemo5 { target.path = /opt/usr/lib } else { target.path = /usr/lib } INSTALLS += target } qsstv_9.2.6/qwt/qwt_abstract_legend.cpp0000664000175000017500000000164113203343610016762 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_legend.h" /*! Constructor \param parent Parent widget */ QwtAbstractLegend::QwtAbstractLegend( QWidget *parent ): QFrame( parent ) { } //! Destructor QwtAbstractLegend::~QwtAbstractLegend() { } /*! Return the extent, that is needed for elements to scroll the legend ( usually scrollbars ), \param orientation Orientation \return Extent of the corresponding scroll element */ int QwtAbstractLegend::scrollExtent( Qt::Orientation orientation ) const { Q_UNUSED( orientation ); return 0; } qsstv_9.2.6/qwt/qwt_abstract_legend.h0000664000175000017500000000376313203343610016436 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_LEGEND_H #define QWT_ABSTRACT_LEGEND_H #include "qwt_global.h" #include "qwt_legend_data.h" #include #include class QVariant; /*! \brief Abstract base class for legend widgets Legends, that need to be under control of the QwtPlot layout system need to be derived from QwtAbstractLegend. \note Other type of legends can be implemented by connecting to the QwtPlot::legendDataChanged() signal. But as these legends are unknown to the plot layout system the layout code ( on screen and for QwtPlotRenderer ) need to be organized in application code. \sa QwtLegend */ class QWT_EXPORT QwtAbstractLegend : public QFrame { Q_OBJECT public: explicit QwtAbstractLegend( QWidget *parent = NULL ); virtual ~QwtAbstractLegend(); /*! Render the legend into a given rectangle. \param painter Painter \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \sa renderLegend() is used by QwtPlotRenderer */ virtual void renderLegend( QPainter *painter, const QRectF &rect, bool fillBackground ) const = 0; //! \return True, when no plot item is inserted virtual bool isEmpty() const = 0; virtual int scrollExtent( Qt::Orientation ) const; public Q_SLOTS: /*! \brief Update the entries for a plot item \param itemInfo Info about an item \param data List of legend entry attributes for the item */ virtual void updateLegend( const QVariant &itemInfo, const QList &data ) = 0; }; #endif qsstv_9.2.6/qwt/qwt_abstract_scale.cpp0000664000175000017500000002430413203343610016614 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_interval.h" class QwtAbstractScale::PrivateData { public: PrivateData(): maxMajor( 5 ), maxMinor( 3 ), stepSize( 0.0 ) { scaleEngine = new QwtLinearScaleEngine(); scaleDraw = new QwtScaleDraw(); } ~PrivateData() { delete scaleEngine; delete scaleDraw; } QwtScaleEngine *scaleEngine; QwtAbstractScaleDraw *scaleDraw; int maxMajor; int maxMinor; double stepSize; }; /*! Constructor \param parent Parent widget Creates a default QwtScaleDraw and a QwtLinearScaleEngine. The initial scale boundaries are set to [ 0.0, 100.0 ] The scaleStepSize() is initialized to 0.0, scaleMaxMajor() to 5 and scaleMaxMajor to 3. */ QwtAbstractScale::QwtAbstractScale( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData; rescale( 0.0, 100.0, d_data->stepSize ); } //! Destructor QwtAbstractScale::~QwtAbstractScale() { delete d_data; } /*! Set the lower bound of the scale \param value Lower bound \sa lowerBound(), setScale(), setUpperBound() \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setLowerBound( double value ) { setScale( value, upperBound() ); } /*! \return Lower bound of the scale \sa setLowerBound(), setScale(), upperBound() */ double QwtAbstractScale::lowerBound() const { return d_data->scaleDraw->scaleDiv().lowerBound(); } /*! Set the upper bound of the scale \param value Upper bound \sa upperBound(), setScale(), setLowerBound() \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setUpperBound( double value ) { setScale( lowerBound(), value ); } /*! \return Upper bound of the scale \sa setUpperBound(), setScale(), lowerBound() */ double QwtAbstractScale::upperBound() const { return d_data->scaleDraw->scaleDiv().upperBound(); } /*! \brief Specify a scale. Define a scale by an interval The ticks are calculated using scaleMaxMinor(), scaleMaxMajor() and scaleStepSize(). \param lowerBound lower limit of the scale interval \param upperBound upper limit of the scale interval \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setScale( double lowerBound, double upperBound ) { rescale( lowerBound, upperBound, d_data->stepSize ); } /*! \brief Specify a scale. Define a scale by an interval The ticks are calculated using scaleMaxMinor(), scaleMaxMajor() and scaleStepSize(). \param interval Interval */ void QwtAbstractScale::setScale( const QwtInterval &interval ) { setScale( interval.minValue(), interval.maxValue() ); } /*! \brief Specify a scale. scaleMaxMinor(), scaleMaxMajor() and scaleStepSize() and have no effect. \param scaleDiv Scale division \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv ) { if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { #if 1 if ( d_data->scaleEngine ) { d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); } #endif d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! \brief Set the maximum number of major tick intervals. The scale's major ticks are calculated automatically such that the number of major intervals does not exceed ticks. The default value is 5. \param ticks Maximal number of major ticks. \sa scaleMaxMajor(), setScaleMaxMinor(), setScaleStepSize(), QwtScaleEngine::divideInterval() */ void QwtAbstractScale::setScaleMaxMajor( int ticks ) { if ( ticks != d_data->maxMajor ) { d_data->maxMajor = ticks; updateScaleDraw(); } } /*! \return Maximal number of major tick intervals \sa setScaleMaxMajor(), scaleMaxMinor() */ int QwtAbstractScale::scaleMaxMajor() const { return d_data->maxMajor; } /*! \brief Set the maximum number of minor tick intervals The scale's minor ticks are calculated automatically such that the number of minor intervals does not exceed ticks. The default value is 3. \param ticks Maximal number of minor ticks. \sa scaleMaxMajor(), setScaleMaxMinor(), setScaleStepSize(), QwtScaleEngine::divideInterval() */ void QwtAbstractScale::setScaleMaxMinor( int ticks ) { if ( ticks != d_data->maxMinor ) { d_data->maxMinor = ticks; updateScaleDraw(); } } /*! \return Maximal number of minor tick intervals \sa setScaleMaxMinor(), scaleMaxMajor() */ int QwtAbstractScale::scaleMaxMinor() const { return d_data->maxMinor; } /*! \brief Set the step size used for calculating a scale division The step size is hint for calculating the intervals for the major ticks of the scale. A value of 0.0 is interpreted as no hint. \param stepSize Hint for the step size of the scale \sa scaleStepSize(), QwtScaleEngine::divideScale() \note Position and distance between the major ticks also depends on scaleMaxMajor(). */ void QwtAbstractScale::setScaleStepSize( double stepSize ) { if ( stepSize != d_data->stepSize ) { d_data->stepSize = stepSize; updateScaleDraw(); } } /*! \return Hint for the step size of the scale \sa setScaleStepSize(), QwtScaleEngine::divideScale() */ double QwtAbstractScale::scaleStepSize() const { return d_data->stepSize; } /*! \brief Set a scale draw scaleDraw has to be created with new and will be deleted in the destructor or the next call of setAbstractScaleDraw(). \sa abstractScaleDraw() */ void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw ) { if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw ) return; if ( d_data->scaleDraw != NULL ) scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() ); delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() { return d_data->scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const { return d_data->scaleDraw; } /*! \brief Set a scale engine The scale engine is responsible for calculating the scale division and provides a transformation between scale and widget coordinates. scaleEngine has to be created with new and will be deleted in the destructor or the next call of setScaleEngine. */ void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine ) { if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine ) { delete d_data->scaleEngine; d_data->scaleEngine = scaleEngine; } } /*! \return Scale engine \sa setScaleEngine() */ const QwtScaleEngine *QwtAbstractScale::scaleEngine() const { return d_data->scaleEngine; } /*! \return Scale engine \sa setScaleEngine() */ QwtScaleEngine *QwtAbstractScale::scaleEngine() { return d_data->scaleEngine; } /*! \return Scale boundaries and positions of the ticks The scale division might have been assigned explicitly or calculated implicitly by rescale(). */ const QwtScaleDiv &QwtAbstractScale::scaleDiv() const { return d_data->scaleDraw->scaleDiv(); } /*! \return Map to translate between scale and widget coordinates */ const QwtScaleMap &QwtAbstractScale::scaleMap() const { return d_data->scaleDraw->scaleMap(); } /*! Translate a scale value into a widget coordinate \param value Scale value \return Corresponding widget coordinate for value \sa scaleMap(), invTransform() */ int QwtAbstractScale::transform( double value ) const { return qRound( d_data->scaleDraw->scaleMap().transform( value ) ); } /*! Translate a widget coordinate into a scale value \param value Widget coordinate \return Corresponding scale coordinate for value \sa scaleMap(), transform() */ double QwtAbstractScale::invTransform( int value ) const { return d_data->scaleDraw->scaleMap().invTransform( value ); } /*! \return True, when the scale is increasing in opposite direction to the widget coordinates */ bool QwtAbstractScale::isInverted() const { return d_data->scaleDraw->scaleMap().isInverting(); } /*! \return The boundary with the smaller value \sa maximum(), lowerBound(), upperBound() */ double QwtAbstractScale::minimum() const { return qMin( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound() ); } /*! \return The boundary with the larger value \sa minimum(), lowerBound(), upperBound() */ double QwtAbstractScale::maximum() const { return qMax( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound() ); } //! Notify changed scale void QwtAbstractScale::scaleChange() { } /*! Recalculate the scale division and update the scale. \param lowerBound Lower limit of the scale interval \param upperBound Upper limit of the scale interval \param stepSize Major step size \sa scaleChange() */ void QwtAbstractScale::rescale( double lowerBound, double upperBound, double stepSize ) { const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale( lowerBound, upperBound, d_data->maxMajor, d_data->maxMinor, stepSize ); if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { #if 1 d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); #endif d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } void QwtAbstractScale::updateScaleDraw() { rescale( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize ); } qsstv_9.2.6/qwt/qwt_abstract_scale.h0000664000175000017500000000553313203343610016264 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_H #define QWT_ABSTRACT_SCALE_H #include "qwt_global.h" #include class QwtScaleEngine; class QwtAbstractScaleDraw; class QwtScaleDiv; class QwtScaleMap; class QwtInterval; /*! \brief An abstract base class for widgets having a scale The scale of an QwtAbstractScale is determined by a QwtScaleDiv definition, that contains the boundaries and the ticks of the scale. The scale is painted using a QwtScaleDraw object. The scale division might be assigned explicitly - but usually it is calculated from the boundaries using a QwtScaleEngine. The scale engine also decides the type of transformation of the scale ( linear, logarithmic ... ). */ class QWT_EXPORT QwtAbstractScale: public QWidget { Q_OBJECT Q_PROPERTY( double lowerBound READ lowerBound WRITE setLowerBound ) Q_PROPERTY( double upperBound READ upperBound WRITE setUpperBound ) Q_PROPERTY( int scaleMaxMajor READ scaleMaxMajor WRITE setScaleMaxMajor ) Q_PROPERTY( int scaleMaxMinor READ scaleMaxMinor WRITE setScaleMaxMinor ) Q_PROPERTY( double scaleStepSize READ scaleStepSize WRITE setScaleStepSize ) public: QwtAbstractScale( QWidget *parent = NULL ); virtual ~QwtAbstractScale(); void setScale( double lowerBound, double upperBound ); void setScale( const QwtInterval & ); void setScale( const QwtScaleDiv & ); const QwtScaleDiv& scaleDiv() const; void setLowerBound( double value ); double lowerBound() const; void setUpperBound( double value ); double upperBound() const; void setScaleStepSize( double stepSize ); double scaleStepSize() const; void setScaleMaxMajor( int ticks ); int scaleMaxMinor() const; void setScaleMaxMinor( int ticks ); int scaleMaxMajor() const; void setScaleEngine( QwtScaleEngine * ); const QwtScaleEngine *scaleEngine() const; QwtScaleEngine *scaleEngine(); int transform( double ) const; double invTransform( int ) const; bool isInverted() const; double minimum() const; double maximum() const; const QwtScaleMap &scaleMap() const; protected: void rescale( double lowerBound, double upperBound, double stepSize ); void setAbstractScaleDraw( QwtAbstractScaleDraw * ); const QwtAbstractScaleDraw *abstractScaleDraw() const; QwtAbstractScaleDraw *abstractScaleDraw(); virtual void scaleChange(); private: void updateScaleDraw(); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_abstract_scale_draw.cpp0000664000175000017500000002305713203343610017635 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale_draw.h" #include "qwt_math.h" #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include #include class QwtAbstractScaleDraw::PrivateData { public: PrivateData(): spacing( 4.0 ), penWidth( 0 ), minExtent( 0.0 ) { components = QwtAbstractScaleDraw::Backbone | QwtAbstractScaleDraw::Ticks | QwtAbstractScaleDraw::Labels; tickLength[QwtScaleDiv::MinorTick] = 4.0; tickLength[QwtScaleDiv::MediumTick] = 6.0; tickLength[QwtScaleDiv::MajorTick] = 8.0; } ScaleComponents components; QwtScaleMap map; QwtScaleDiv scaleDiv; double spacing; double tickLength[QwtScaleDiv::NTickTypes]; int penWidth; double minExtent; QMap labelCache; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The spacing (distance between ticks and labels) is set to 4, the tick lengths are set to 4,6 and 8 pixels */ QwtAbstractScaleDraw::QwtAbstractScaleDraw() { d_data = new QwtAbstractScaleDraw::PrivateData; } //! Destructor QwtAbstractScaleDraw::~QwtAbstractScaleDraw() { delete d_data; } /*! En/Disable a component of the scale \param component Scale component \param enable On/Off \sa hasComponent() */ void QwtAbstractScaleDraw::enableComponent( ScaleComponent component, bool enable ) { if ( enable ) d_data->components |= component; else d_data->components &= ~component; } /*! Check if a component is enabled \param component Component type \return true, when component is enabled \sa enableComponent() */ bool QwtAbstractScaleDraw::hasComponent( ScaleComponent component ) const { return ( d_data->components & component ); } /*! Change the scale division \param scaleDiv New scale division */ void QwtAbstractScaleDraw::setScaleDiv( const QwtScaleDiv &scaleDiv ) { d_data->scaleDiv = scaleDiv; d_data->map.setScaleInterval( scaleDiv.lowerBound(), scaleDiv.upperBound() ); d_data->labelCache.clear(); } /*! Change the transformation of the scale \param transformation New scale transformation */ void QwtAbstractScaleDraw::setTransformation( QwtTransform *transformation ) { d_data->map.setTransformation( transformation ); } //! \return Map how to translate between scale and pixel values const QwtScaleMap &QwtAbstractScaleDraw::scaleMap() const { return d_data->map; } //! \return Map how to translate between scale and pixel values QwtScaleMap &QwtAbstractScaleDraw::scaleMap() { return d_data->map; } //! \return scale division const QwtScaleDiv& QwtAbstractScaleDraw::scaleDiv() const { return d_data->scaleDiv; } /*! \brief Specify the width of the scale pen \param width Pen width \sa penWidth() */ void QwtAbstractScaleDraw::setPenWidth( int width ) { if ( width < 0 ) width = 0; if ( width != d_data->penWidth ) d_data->penWidth = width; } /*! \return Scale pen width \sa setPenWidth() */ int QwtAbstractScaleDraw::penWidth() const { return d_data->penWidth; } /*! \brief Draw the scale \param painter The painter \param palette Palette, text color is used for the labels, foreground color for ticks and backbone */ void QwtAbstractScaleDraw::draw( QPainter *painter, const QPalette& palette ) const { painter->save(); QPen pen = painter->pen(); pen.setWidth( d_data->penWidth ); pen.setCosmetic( false ); painter->setPen( pen ); if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { painter->save(); painter->setPen( palette.color( QPalette::Text ) ); // ignore pen style const QList &majorTicks = d_data->scaleDiv.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < majorTicks.count(); i++ ) { const double v = majorTicks[i]; if ( d_data->scaleDiv.contains( v ) ) drawLabel( painter, v ); } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); for ( int tickType = QwtScaleDiv::MinorTick; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList &ticks = d_data->scaleDiv.ticks( tickType ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( d_data->scaleDiv.contains( v ) ) drawTick( painter, v, d_data->tickLength[tickType] ); } } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); drawBackbone( painter ); painter->restore(); } painter->restore(); } /*! \brief Set the spacing between tick and labels The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \param spacing Spacing \sa spacing() */ void QwtAbstractScaleDraw::setSpacing( double spacing ) { if ( spacing < 0 ) spacing = 0; d_data->spacing = spacing; } /*! \brief Get the spacing The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \return Spacing \sa setSpacing() */ double QwtAbstractScaleDraw::spacing() const { return d_data->spacing; } /*! \brief Set a minimum for the extent The extent is calculated from the components of the scale draw. In situations, where the labels are changing and the layout depends on the extent (f.e scrolling a scale), setting an upper limit as minimum extent will avoid jumps of the layout. \param minExtent Minimum extent \sa extent(), minimumExtent() */ void QwtAbstractScaleDraw::setMinimumExtent( double minExtent ) { if ( minExtent < 0.0 ) minExtent = 0.0; d_data->minExtent = minExtent; } /*! Get the minimum extent \return Minimum extent \sa extent(), setMinimumExtent() */ double QwtAbstractScaleDraw::minimumExtent() const { return d_data->minExtent; } /*! Set the length of the ticks \param tickType Tick type \param length New length \warning the length is limited to [0..1000] */ void QwtAbstractScaleDraw::setTickLength( QwtScaleDiv::TickType tickType, double length ) { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return; } if ( length < 0.0 ) length = 0.0; const double maxTickLen = 1000.0; if ( length > maxTickLen ) length = maxTickLen; d_data->tickLength[tickType] = length; } /*! \return Length of the ticks \sa setTickLength(), maxTickLength() */ double QwtAbstractScaleDraw::tickLength( QwtScaleDiv::TickType tickType ) const { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return 0; } return d_data->tickLength[tickType]; } /*! \return Length of the longest tick Useful for layout calculations \sa tickLength(), setTickLength() */ double QwtAbstractScaleDraw::maxTickLength() const { double length = 0.0; for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) length = qMax( length, d_data->tickLength[i] ); return length; } /*! \brief Convert a value into its representing label The value is converted to a plain text using QLocale().toString(value). This method is often overloaded by applications to have individual labels. \param value Value \return Label string. */ QwtText QwtAbstractScaleDraw::label( double value ) const { if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; return QLocale().toString( value ); } /*! \brief Convert a value into its representing label and cache it. The conversion between value and label is called very often in the layout and painting code. Unfortunately the calculation of the label sizes might be slow (really slow for rich text in Qt4), so it's necessary to cache the labels. \param font Font \param value Value \return Tick label */ const QwtText &QwtAbstractScaleDraw::tickLabel( const QFont &font, double value ) const { QMap::const_iterator it = d_data->labelCache.find( value ); if ( it == d_data->labelCache.end() ) { QwtText lbl = label( value ); lbl.setRenderFlags( 0 ); lbl.setLayoutAttribute( QwtText::MinimumLayout ); ( void )lbl.textSize( font ); // initialize the internal cache it = d_data->labelCache.insert( value, lbl ); } return ( *it ); } /*! Invalidate the cache used by tickLabel() The cache is invalidated, when a new QwtScaleDiv is set. If the labels need to be changed. while the same QwtScaleDiv is set, invalidateCache() needs to be called manually. */ void QwtAbstractScaleDraw::invalidateCache() { d_data->labelCache.clear(); } qsstv_9.2.6/qwt/qwt_abstract_scale_draw.h0000664000175000017500000000703613203343610017301 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_DRAW_H #define QWT_ABSTRACT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_text.h" class QPalette; class QPainter; class QFont; class QwtTransform; class QwtScaleMap; /*! \brief A abstract base class for drawing scales QwtAbstractScaleDraw can be used to draw linear or logarithmic scales. After a scale division has been specified as a QwtScaleDiv object using setScaleDiv(), the scale can be drawn with the draw() member. */ class QWT_EXPORT QwtAbstractScaleDraw { public: /*! Components of a scale \sa enableComponent(), hasComponent */ enum ScaleComponent { //! Backbone = the line where the ticks are located Backbone = 0x01, //! Ticks Ticks = 0x02, //! Labels Labels = 0x04 }; //! Scale components typedef QFlags ScaleComponents; QwtAbstractScaleDraw(); virtual ~QwtAbstractScaleDraw(); void setScaleDiv( const QwtScaleDiv &s ); const QwtScaleDiv& scaleDiv() const; void setTransformation( QwtTransform * ); const QwtScaleMap &scaleMap() const; QwtScaleMap &scaleMap(); void enableComponent( ScaleComponent, bool enable = true ); bool hasComponent( ScaleComponent ) const; void setTickLength( QwtScaleDiv::TickType, double length ); double tickLength( QwtScaleDiv::TickType ) const; double maxTickLength() const; void setSpacing( double margin ); double spacing() const; void setPenWidth( int width ); int penWidth() const; virtual void draw( QPainter *, const QPalette & ) const; virtual QwtText label( double ) const; /*! Calculate the extent The extent is the distance from the baseline to the outermost pixel of the scale draw in opposite to its orientation. It is at least minimumExtent() pixels. \param font Font used for drawing the tick labels \return Number of pixels \sa setMinimumExtent(), minimumExtent() */ virtual double extent( const QFont &font ) const = 0; void setMinimumExtent( double ); double minimumExtent() const; protected: /*! Draw a tick \param painter Painter \param value Value of the tick \param len Length of the tick \sa drawBackbone(), drawLabel() */ virtual void drawTick( QPainter *painter, double value, double len ) const = 0; /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ virtual void drawBackbone( QPainter *painter ) const = 0; /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ virtual void drawLabel( QPainter *painter, double value ) const = 0; void invalidateCache(); const QwtText &tickLabel( const QFont &, double value ) const; private: QwtAbstractScaleDraw( const QwtAbstractScaleDraw & ); QwtAbstractScaleDraw &operator=( const QwtAbstractScaleDraw & ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtAbstractScaleDraw::ScaleComponents ) #endif qsstv_9.2.6/qwt/qwt_abstract_slider.cpp0000664000175000017500000004374213203343610017016 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_slider.h" #include "qwt_abstract_scale_draw.h" #include "qwt_math.h" #include "qwt_scale_map.h" #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif static double qwtAlignToScaleDiv( const QwtAbstractSlider *slider, double value ) { const QwtScaleDiv &sd = slider->scaleDiv(); const int tValue = slider->transform( value ); if ( tValue == slider->transform( sd.lowerBound() ) ) return sd.lowerBound(); if ( tValue == slider->transform( sd.lowerBound() ) ) return sd.upperBound(); for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { const QList ticks = sd.ticks( i ); for ( int j = 0; j < ticks.size(); j++ ) { if ( slider->transform( ticks[ j ] ) == tValue ) return ticks[ j ]; } } return value; } class QwtAbstractSlider::PrivateData { public: PrivateData(): isScrolling( false ), isTracking( true ), pendingValueChanged( false ), readOnly( false ), totalSteps( 100 ), singleSteps( 1 ), pageSteps( 10 ), stepAlignment( true ), isValid( false ), value( 0.0 ), wrapping( false ), invertedControls( false ) { } bool isScrolling; bool isTracking; bool pendingValueChanged; bool readOnly; uint totalSteps; uint singleSteps; uint pageSteps; bool stepAlignment; bool isValid; double value; bool wrapping; bool invertedControls; }; /*! \brief Constructor The scale is initialized to [0.0, 100.0], the number of steps is set to 100 with 1 and 10 and single an page step sizes. Step alignment is enabled. The initial value is invalid. \param parent Parent widget */ QwtAbstractSlider::QwtAbstractSlider( QWidget *parent ): QwtAbstractScale( parent ) { d_data = new QwtAbstractSlider::PrivateData; setScale( 0.0, 100.0 ); setFocusPolicy( Qt::StrongFocus ); } //! Destructor QwtAbstractSlider::~QwtAbstractSlider() { delete d_data; } /*! Set the value to be valid/invalid \param on When true, the value is invalidated \sa setValue() */ void QwtAbstractSlider::setValid( bool on ) { if ( on != d_data->isValid ) { d_data->isValid = on; sliderChange(); Q_EMIT valueChanged( d_data->value ); } } //! \return True, when the value is invalid bool QwtAbstractSlider::isValid() const { return d_data->isValid; } /*! En/Disable read only mode In read only mode the slider can't be controlled by mouse or keyboard. \param on Enables in case of true \sa isReadOnly() \warning The focus policy is set to Qt::StrongFocus or Qt::NoFocus */ void QwtAbstractSlider::setReadOnly( bool on ) { if ( d_data->readOnly != on ) { d_data->readOnly = on; setFocusPolicy( on ? Qt::StrongFocus : Qt::NoFocus ); update(); } } /*! In read only mode the slider can't be controlled by mouse or keyboard. \return true if read only \sa setReadOnly() */ bool QwtAbstractSlider::isReadOnly() const { return d_data->readOnly; } /*! \brief Enables or disables tracking. If tracking is enabled, the slider emits the valueChanged() signal while the movable part of the slider is being dragged. If tracking is disabled, the slider emits the valueChanged() signal only when the user releases the slider. Tracking is enabled by default. \param on \c true (enable) or \c false (disable) tracking. \sa isTracking(), sliderMoved() */ void QwtAbstractSlider::setTracking( bool on ) { d_data->isTracking = on; } /*! \return True, when tracking has been enabled \sa setTracking() */ bool QwtAbstractSlider::isTracking() const { return d_data->isTracking; } /*! Mouse press event handler \param event Mouse event */ void QwtAbstractSlider::mousePressEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || lowerBound() == upperBound() ) return; d_data->isScrolling = isScrollPosition( event->pos() ); if ( d_data->isScrolling ) { d_data->pendingValueChanged = false; Q_EMIT sliderPressed(); } } /*! Mouse Move Event handler \param event Mouse event */ void QwtAbstractSlider::mouseMoveEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( d_data->isValid && d_data->isScrolling ) { double value = scrolledTo( event->pos() ); if ( value != d_data->value ) { value = boundedValue( value ); if ( d_data->stepAlignment ) { value = alignedValue( value ); } else { value = qwtAlignToScaleDiv( this, value ); } if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); if ( d_data->isTracking ) Q_EMIT valueChanged( d_data->value ); else d_data->pendingValueChanged = true; } } } } /*! Mouse Release Event handler \param event Mouse event */ void QwtAbstractSlider::mouseReleaseEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( d_data->isScrolling && d_data->isValid ) { d_data->isScrolling = false; if ( d_data->pendingValueChanged ) Q_EMIT valueChanged( d_data->value ); Q_EMIT sliderReleased(); } } /*! Wheel Event handler In/decreases the value by s number of steps. The direction depends on the invertedControls() property. When the control or shift modifier is pressed the wheel delta ( divided by 120 ) is mapped to an increment according to pageSteps(). Otherwise it is mapped to singleSteps(). \param event Wheel event */ void QwtAbstractSlider::wheelEvent( QWheelEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || d_data->isScrolling ) return; int numSteps = 0; if ( ( event->modifiers() & Qt::ControlModifier) || ( event->modifiers() & Qt::ShiftModifier ) ) { // one page regardless of delta numSteps = d_data->pageSteps; if ( event->delta() < 0 ) numSteps = -numSteps; } else { const int numTurns = ( event->delta() / 120 ); numSteps = numTurns * d_data->singleSteps; } if ( d_data->invertedControls ) numSteps = -numSteps; const double value = incrementedValue( d_data->value, numSteps ); if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); Q_EMIT valueChanged( d_data->value ); } } /*! Handles key events QwtAbstractSlider handles the following keys: - Qt::Key_Left\n Add/Subtract singleSteps() in direction to lowerBound(); - Qt::Key_Right\n Add/Subtract singleSteps() in direction to upperBound(); - Qt::Key_Down\n Subtract singleSteps(), when invertedControls() is false - Qt::Key_Up\n Add singleSteps(), when invertedControls() is false - Qt::Key_PageDown\n Subtract pageSteps(), when invertedControls() is false - Qt::Key_PageUp\n Add pageSteps(), when invertedControls() is false - Qt::Key_Home\n Set the value to the minimum() - Qt::Key_End\n Set the value to the maximum() \param event Key event \sa isReadOnly() */ void QwtAbstractSlider::keyPressEvent( QKeyEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || d_data->isScrolling ) return; int numSteps = 0; double value = d_data->value; switch ( event->key() ) { case Qt::Key_Left: { numSteps = -static_cast( d_data->singleSteps ); if ( isInverted() ) numSteps = -numSteps; break; } case Qt::Key_Right: { numSteps = d_data->singleSteps; if ( isInverted() ) numSteps = -numSteps; break; } case Qt::Key_Down: { numSteps = -static_cast( d_data->singleSteps ); if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_Up: { numSteps = d_data->singleSteps; if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_PageUp: { numSteps = d_data->pageSteps; if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_PageDown: { numSteps = -static_cast( d_data->pageSteps ); if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_Home: { value = minimum(); break; } case Qt::Key_End: { value = maximum(); break; } default:; { event->ignore(); } } if ( numSteps != 0 ) { value = incrementedValue( d_data->value, numSteps ); } if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); Q_EMIT valueChanged( d_data->value ); } } /*! \brief Set the number of steps The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. The default setting is 100. \param stepCount Number of steps \sa totalSteps(), setSingleSteps(), setPageSteps() */ void QwtAbstractSlider::setTotalSteps( uint stepCount ) { d_data->totalSteps = stepCount; } /*! \return Number of steps \sa setTotalSteps(), singleSteps(), pageSteps() */ uint QwtAbstractSlider::totalSteps() const { return d_data->totalSteps; } /*! \brief Set the number of steps for a single increment The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. \param stepCount Number of steps \sa singleSteps(), setTotalSteps(), setPageSteps() */ void QwtAbstractSlider::setSingleSteps( uint stepCount ) { d_data->singleSteps = stepCount; } /*! \return Number of steps \sa setSingleSteps(), totalSteps(), pageSteps() */ uint QwtAbstractSlider::singleSteps() const { return d_data->singleSteps; } /*! \brief Set the number of steps for a page increment The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. \param stepCount Number of steps \sa pageSteps(), setTotalSteps(), setSingleSteps() */ void QwtAbstractSlider::setPageSteps( uint stepCount ) { d_data->pageSteps = stepCount; } /*! \return Number of steps \sa setPageSteps(), totalSteps(), singleSteps() */ uint QwtAbstractSlider::pageSteps() const { return d_data->pageSteps; } /*! \brief Enable step alignment When step alignment is enabled values resulting from slider movements are aligned to the step size. \param on Enable step alignment when true \sa stepAlignment() */ void QwtAbstractSlider::setStepAlignment( bool on ) { if ( on != d_data->stepAlignment ) { d_data->stepAlignment = on; } } /*! \return True, when step alignment is enabled \sa setStepAlignment() */ bool QwtAbstractSlider::stepAlignment() const { return d_data->stepAlignment; } /*! Set the slider to the specified value \param value New value \sa setValid(), sliderChange(), valueChanged() */ void QwtAbstractSlider::setValue( double value ) { value = qBound( minimum(), value, maximum() ); const bool changed = ( d_data->value != value ) || !d_data->isValid; d_data->value = value; d_data->isValid = true; if ( changed ) { sliderChange(); Q_EMIT valueChanged( d_data->value ); } } //! Returns the current value. double QwtAbstractSlider::value() const { return d_data->value; } /*! If wrapping is true stepping up from upperBound() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtAbstractSlider::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtAbstractSlider::wrapping() const { return d_data->wrapping; } /*! Invert wheel and key events Usually scrolling the mouse wheel "up" and using keys like page up will increase the slider's value towards its maximum. When invertedControls() is enabled the value is scrolled towards its minimum. Inverting the controls might be f.e. useful for a vertical slider with an inverted scale ( decreasing from top to bottom ). \param on Invert controls, when true \sa invertedControls(), keyEvent(), wheelEvent() */ void QwtAbstractSlider::setInvertedControls( bool on ) { d_data->invertedControls = on; } /*! \return True, when the controls are inverted \sa setInvertedControls() */ bool QwtAbstractSlider::invertedControls() const { return d_data->invertedControls; } /*! Increment the slider The step size depends on the number of totalSteps() \param stepCount Number of steps \sa setTotalSteps(), incrementedValue() */ void QwtAbstractSlider::incrementValue( int stepCount ) { const double value = incrementedValue( d_data->value, stepCount ); if ( value != d_data->value ) { d_data->value = value; sliderChange(); } } /*! Increment a value \param value Value \param stepCount Number of steps \return Incremented value */ double QwtAbstractSlider::incrementedValue( double value, int stepCount ) const { if ( d_data->totalSteps == 0 ) return value; const QwtTransform *transformation = scaleMap().transformation(); if ( transformation == NULL ) { const double range = maximum() - minimum(); value += stepCount * range / d_data->totalSteps; } else { QwtScaleMap map = scaleMap(); map.setPaintInterval( 0, d_data->totalSteps ); // we need equidant steps according to // paint device coordinates const double range = transformation->transform( maximum() ) - transformation->transform( minimum() ); const double stepSize = range / d_data->totalSteps; double v = transformation->transform( value ); v = qRound( v / stepSize ) * stepSize; v += stepCount * range / d_data->totalSteps; value = transformation->invTransform( v ); } value = boundedValue( value ); if ( d_data->stepAlignment ) value = alignedValue( value ); return value; } double QwtAbstractSlider::boundedValue( double value ) const { const double vmin = minimum(); const double vmax = maximum(); if ( d_data->wrapping && vmin != vmax ) { const int fullCircle = 360 * 16; const double pd = scaleMap().pDist(); if ( int( pd / fullCircle ) * fullCircle == pd ) { // full circle scales: min and max are the same const double range = vmax - vmin; if ( value < vmin ) { value += ::ceil( ( vmin - value ) / range ) * range; } else if ( value > vmax ) { value -= ::ceil( ( value - vmax ) / range ) * range; } } else { if ( value < vmin ) value = vmax; else if ( value > vmax ) value = vmin; } } else { value = qBound( vmin, value, vmax ); } return value; } double QwtAbstractSlider::alignedValue( double value ) const { if ( d_data->totalSteps == 0 ) return value; if ( scaleMap().transformation() == NULL ) { const double stepSize = ( maximum() - minimum() ) / d_data->totalSteps; if ( stepSize > 0.0 ) { value = lowerBound() + qRound( ( value - lowerBound() ) / stepSize ) * stepSize; } } else { const double stepSize = ( scaleMap().p2() - scaleMap().p1() ) / d_data->totalSteps; if ( stepSize > 0.0 ) { double v = scaleMap().transform( value ); v = scaleMap().p1() + qRound( ( v - scaleMap().p1() ) / stepSize ) * stepSize; value = scaleMap().invTransform( v ); } } // correct rounding error if value = 0 if ( qFuzzyCompare( value + 1.0, 1.0 ) ) { value = 0.0; } else { // correct rounding error at the border if ( qFuzzyCompare( value, upperBound() ) ) value = upperBound(); else if ( qFuzzyCompare( value, lowerBound() ) ) value = lowerBound(); } return value; } /*! Update the slider according to modifications of the scale */ void QwtAbstractSlider::scaleChange() { const double value = qBound( minimum(), d_data->value, maximum() ); const bool changed = ( value != d_data->value ); if ( changed ) { d_data->value = value; } if ( d_data->isValid || changed ) Q_EMIT valueChanged( d_data->value ); updateGeometry(); update(); } //! Calling update() void QwtAbstractSlider::sliderChange() { update(); } qsstv_9.2.6/qwt/qwt_abstract_slider.h0000664000175000017500000001046313203343610016455 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SLIDER_H #define QWT_ABSTRACT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_scale.h" /*! \brief An abstract base class for slider widgets with a scale A slider widget displays a value according to a scale. The class is designed as a common super class for widgets like QwtKnob, QwtDial and QwtSlider. When the slider is nor readOnly() its value can be modified by keyboard, mouse and wheel inputs. The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. Only for linear scales the number of steps correspond with a fixed step size. */ class QWT_EXPORT QwtAbstractSlider: public QwtAbstractScale { Q_OBJECT Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( uint totalSteps READ totalSteps WRITE setTotalSteps ) Q_PROPERTY( uint singleSteps READ singleSteps WRITE setSingleSteps ) Q_PROPERTY( uint pageSteps READ pageSteps WRITE setPageSteps ) Q_PROPERTY( bool stepAlignment READ stepAlignment WRITE setStepAlignment ) Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool tracking READ isTracking WRITE setTracking ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( bool invertedControls READ invertedControls WRITE setInvertedControls ) public: explicit QwtAbstractSlider( QWidget *parent = NULL ); virtual ~QwtAbstractSlider(); void setValid( bool ); bool isValid() const; double value() const; void setWrapping( bool ); bool wrapping() const; void setTotalSteps( uint ); uint totalSteps() const; void setSingleSteps( uint ); uint singleSteps() const; void setPageSteps( uint ); uint pageSteps() const; void setStepAlignment( bool ); bool stepAlignment() const; void setTracking( bool ); bool isTracking() const; void setReadOnly( bool ); bool isReadOnly() const; void setInvertedControls( bool ); bool invertedControls() const; public Q_SLOTS: void setValue( double val ); Q_SIGNALS: /*! \brief Notify a change of value. When tracking is enabled (default setting), this signal will be emitted every time the value changes. \param value New value \sa setTracking(), sliderMoved() */ void valueChanged( double value ); /*! This signal is emitted when the user presses the movable part of the slider. */ void sliderPressed(); /*! This signal is emitted when the user releases the movable part of the slider. */ void sliderReleased(); /*! This signal is emitted when the user moves the slider with the mouse. \param value New value \sa valueChanged() */ void sliderMoved( double value ); protected: virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void mouseMoveEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void wheelEvent( QWheelEvent * ); /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when pos is a valid scroll position \sa scrolledTo() */ virtual bool isScrollPosition( const QPoint &pos ) const = 0; /*! \brief Determine the value for a new position of the movable part of the slider \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ virtual double scrolledTo( const QPoint &pos ) const = 0; void incrementValue( int numSteps ); virtual void scaleChange(); protected: virtual void sliderChange(); double incrementedValue( double value, int stepCount ) const; private: double alignedValue( double ) const; double boundedValue( double ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_analog_clock.cpp0000664000175000017500000001332213203343610016254 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_analog_clock.h" #include "qwt_round_scale_draw.h" #include #include class QwtAnalogClockScaleDraw: public QwtRoundScaleDraw { public: QwtAnalogClockScaleDraw() { setSpacing( 8 ); enableComponent( QwtAbstractScaleDraw::Backbone, false ); setTickLength( QwtScaleDiv::MinorTick, 2 ); setTickLength( QwtScaleDiv::MediumTick, 4 ); setTickLength( QwtScaleDiv::MajorTick, 8 ); setPenWidth( 1 ); } virtual QwtText label( double value ) const { if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 60.0 * 60.0 * 12.0; return QLocale().toString( qRound( value / ( 60.0 * 60.0 ) ) ); } }; /*! Constructor \param parent Parent widget */ QwtAnalogClock::QwtAnalogClock( QWidget *parent ): QwtDial( parent ) { setWrapping( true ); setReadOnly( true ); setOrigin( 270.0 ); setScaleDraw( new QwtAnalogClockScaleDraw() ); setTotalSteps( 60 ); const int secondsPerHour = 60.0 * 60.0; QList majorTicks; QList minorTicks; for ( int i = 0; i < 12; i++ ) { majorTicks += i * secondsPerHour; for ( int j = 1; j < 5; j++ ) minorTicks += i * secondsPerHour + j * secondsPerHour / 5.0; } QwtScaleDiv scaleDiv; scaleDiv.setInterval( 0.0, 12.0 * secondsPerHour ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); setScale( scaleDiv ); QColor knobColor = palette().color( QPalette::Active, QPalette::Text ); knobColor = knobColor.dark( 120 ); QColor handColor; int width; for ( int i = 0; i < NHands; i++ ) { if ( i == SecondHand ) { width = 2; handColor = knobColor.dark( 120 ); } else { width = 8; handColor = knobColor; } QwtDialSimpleNeedle *hand = new QwtDialSimpleNeedle( QwtDialSimpleNeedle::Arrow, true, handColor, knobColor ); hand->setWidth( width ); d_hand[i] = NULL; setHand( static_cast( i ), hand ); } } //! Destructor QwtAnalogClock::~QwtAnalogClock() { for ( int i = 0; i < NHands; i++ ) delete d_hand[i]; } /*! Nop method, use setHand() instead \sa setHand() */ void QwtAnalogClock::setNeedle( QwtDialNeedle * ) { // no op return; } /*! Set a clock hand \param hand Specifies the type of hand \param needle Hand \sa hand() */ void QwtAnalogClock::setHand( Hand hand, QwtDialNeedle *needle ) { if ( hand >= 0 && hand < NHands ) { delete d_hand[hand]; d_hand[hand] = needle; } } /*! \return Clock hand \param hd Specifies the type of hand \sa setHand() */ QwtDialNeedle *QwtAnalogClock::hand( Hand hd ) { if ( hd < 0 || hd >= NHands ) return NULL; return d_hand[hd]; } /*! \return Clock hand \param hd Specifies the type of hand \sa setHand() */ const QwtDialNeedle *QwtAnalogClock::hand( Hand hd ) const { return const_cast( this )->hand( hd ); } /*! \brief Set the current time */ void QwtAnalogClock::setCurrentTime() { setTime( QTime::currentTime() ); } /*! Set a time \param time Time to display */ void QwtAnalogClock::setTime( const QTime &time ) { if ( time.isValid() ) { setValue( ( time.hour() % 12 ) * 60.0 * 60.0 + time.minute() * 60.0 + time.second() ); } else setValid( false ); } /*! \brief Draw the needle A clock has no single needle but three hands instead. drawNeedle() translates value() into directions for the hands and calls drawHand(). \param painter Painter \param center Center of the clock \param radius Maximum length for the hands \param dir Dummy, not used. \param colorGroup ColorGroup \sa drawHand() */ void QwtAnalogClock::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const { Q_UNUSED( dir ); if ( isValid() ) { const double hours = value() / ( 60.0 * 60.0 ); const double minutes = ( value() - qFloor(hours) * 60.0 * 60.0 ) / 60.0; const double seconds = value() - qFloor(hours) * 60.0 * 60.0 - qFloor(minutes) * 60.0; double angle[NHands]; angle[HourHand] = 360.0 * hours / 12.0; angle[MinuteHand] = 360.0 * minutes / 60.0; angle[SecondHand] = 360.0 * seconds / 60.0; for ( int hand = 0; hand < NHands; hand++ ) { const double d = 360.0 - angle[hand] - origin(); drawHand( painter, static_cast( hand ), center, radius, d, colorGroup ); } } } /*! Draw a clock hand \param painter Painter \param hd Specify the type of hand \param center Center of the clock \param radius Maximum length for the hands \param direction Direction of the hand in degrees, counter clockwise \param cg ColorGroup */ void QwtAnalogClock::drawHand( QPainter *painter, Hand hd, const QPointF ¢er, double radius, double direction, QPalette::ColorGroup cg ) const { const QwtDialNeedle *needle = hand( hd ); if ( needle ) { if ( hd == HourHand ) radius = qRound( 0.8 * radius ); needle->draw( painter, center, radius, direction, cg ); } } qsstv_9.2.6/qwt/qwt_analog_clock.h0000664000175000017500000000417113203343610015723 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ANALOG_CLOCK_H #define QWT_ANALOG_CLOCK_H #include "qwt_global.h" #include "qwt_dial.h" #include "qwt_dial_needle.h" #include /*! \brief An analog clock \image html analogclock.png \par Example \code #include QwtAnalogClock *clock = new QwtAnalogClock(...); clock->scaleDraw()->setPenWidth(3); clock->setLineWidth(6); clock->setFrameShadow(QwtDial::Sunken); clock->setTime(); // update the clock every second QTimer *timer = new QTimer(clock); timer->connect(timer, SIGNAL(timeout()), clock, SLOT(setCurrentTime())); timer->start(1000); \endcode \note The examples/dials example shows how to use QwtAnalogClock. */ class QWT_EXPORT QwtAnalogClock: public QwtDial { Q_OBJECT public: /*! Hand type \sa setHand(), hand() */ enum Hand { //! Needle displaying the seconds SecondHand, //! Needle displaying the minutes MinuteHand, //! Needle displaying the hours HourHand, //! Number of needles NHands }; explicit QwtAnalogClock( QWidget* parent = NULL ); virtual ~QwtAnalogClock(); void setHand( Hand, QwtDialNeedle * ); const QwtDialNeedle *hand( Hand ) const; QwtDialNeedle *hand( Hand ); public Q_SLOTS: void setCurrentTime(); void setTime( const QTime & ); protected: virtual void drawNeedle( QPainter *, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; virtual void drawHand( QPainter *, Hand, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; private: // use setHand instead void setNeedle( QwtDialNeedle * ); QwtDialNeedle *d_hand[NHands]; }; #endif qsstv_9.2.6/qwt/qwt_arrow_button.cpp0000664000175000017500000002020213203343610016360 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_arrow_button.h" #include "qwt_math.h" #include #include #include #include #include static const int MaxNum = 3; static const int Margin = 2; static const int Spacing = 1; class QwtArrowButton::PrivateData { public: int num; Qt::ArrowType arrowType; }; static QStyleOptionButton styleOpt( const QwtArrowButton* btn ) { QStyleOptionButton option; option.init( btn ); option.features = QStyleOptionButton::None; if ( btn->isFlat() ) option.features |= QStyleOptionButton::Flat; if ( btn->menu() ) option.features |= QStyleOptionButton::HasMenu; if ( btn->autoDefault() || btn->isDefault() ) option.features |= QStyleOptionButton::AutoDefaultButton; if ( btn->isDefault() ) option.features |= QStyleOptionButton::DefaultButton; if ( btn->isDown() ) option.state |= QStyle::State_Sunken; if ( !btn->isFlat() && !btn->isDown() ) option.state |= QStyle::State_Raised; return option; } /*! \param num Number of arrows \param arrowType see Qt::ArrowType in the Qt docs. \param parent Parent widget */ QwtArrowButton::QwtArrowButton( int num, Qt::ArrowType arrowType, QWidget *parent ): QPushButton( parent ) { d_data = new PrivateData; d_data->num = qBound( 1, num, MaxNum ); d_data->arrowType = arrowType; setAutoRepeat( true ); setAutoDefault( false ); switch ( d_data->arrowType ) { case Qt::LeftArrow: case Qt::RightArrow: setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); break; default: setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); } } //! Destructor QwtArrowButton::~QwtArrowButton() { delete d_data; d_data = NULL; } /*! \brief The direction of the arrows */ Qt::ArrowType QwtArrowButton::arrowType() const { return d_data->arrowType; } /*! \brief The number of arrows */ int QwtArrowButton::num() const { return d_data->num; } /*! \return the bounding rectangle for the label */ QRect QwtArrowButton::labelRect() const { const int m = Margin; QRect r = rect(); r.setRect( r.x() + m, r.y() + m, r.width() - 2 * m, r.height() - 2 * m ); if ( isDown() ) { QStyleOptionButton option = styleOpt( this ); const int ph = style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, this ); const int pv = style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, this ); r.translate( ph, pv ); } return r; } /*! Paint event handler \param event Paint event */ void QwtArrowButton::paintEvent( QPaintEvent *event ) { QPushButton::paintEvent( event ); QPainter painter( this ); drawButtonLabel( &painter ); } /*! \brief Draw the button label \param painter Painter \sa The Qt Manual for QPushButton */ void QwtArrowButton::drawButtonLabel( QPainter *painter ) { const bool isVertical = d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow; const QRect r = labelRect(); QSize boundingSize = labelRect().size(); if ( isVertical ) boundingSize.transpose(); const int w = ( boundingSize.width() - ( MaxNum - 1 ) * Spacing ) / MaxNum; QSize arrow = arrowSize( Qt::RightArrow, QSize( w, boundingSize.height() ) ); if ( isVertical ) arrow.transpose(); QRect contentsSize; // aligned rect where to paint all arrows if ( d_data->arrowType == Qt::LeftArrow || d_data->arrowType == Qt::RightArrow ) { contentsSize.setWidth( d_data->num * arrow.width() + ( d_data->num - 1 ) * Spacing ); contentsSize.setHeight( arrow.height() ); } else { contentsSize.setWidth( arrow.width() ); contentsSize.setHeight( d_data->num * arrow.height() + ( d_data->num - 1 ) * Spacing ); } QRect arrowRect( contentsSize ); arrowRect.moveCenter( r.center() ); arrowRect.setSize( arrow ); painter->save(); for ( int i = 0; i < d_data->num; i++ ) { drawArrow( painter, arrowRect, d_data->arrowType ); int dx = 0; int dy = 0; if ( isVertical ) dy = arrow.height() + Spacing; else dx = arrow.width() + Spacing; arrowRect.translate( dx, dy ); } painter->restore(); if ( hasFocus() ) { QStyleOptionFocusRect option; option.init( this ); option.backgroundColor = palette().color( QPalette::Window ); style()->drawPrimitive( QStyle::PE_FrameFocusRect, &option, painter, this ); } } /*! Draw an arrow int a bounding rectangle \param painter Painter \param r Rectangle where to paint the arrow \param arrowType Arrow type */ void QwtArrowButton::drawArrow( QPainter *painter, const QRect &r, Qt::ArrowType arrowType ) const { QPolygon pa( 3 ); switch ( arrowType ) { case Qt::UpArrow: pa.setPoint( 0, r.bottomLeft() ); pa.setPoint( 1, r.bottomRight() ); pa.setPoint( 2, r.center().x(), r.top() ); break; case Qt::DownArrow: pa.setPoint( 0, r.topLeft() ); pa.setPoint( 1, r.topRight() ); pa.setPoint( 2, r.center().x(), r.bottom() ); break; case Qt::RightArrow: pa.setPoint( 0, r.topLeft() ); pa.setPoint( 1, r.bottomLeft() ); pa.setPoint( 2, r.right(), r.center().y() ); break; case Qt::LeftArrow: pa.setPoint( 0, r.topRight() ); pa.setPoint( 1, r.bottomRight() ); pa.setPoint( 2, r.left(), r.center().y() ); break; default: break; } painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::ButtonText ) ); painter->drawPolygon( pa ); painter->restore(); } /*! \return a size hint */ QSize QwtArrowButton::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \brief Return a minimum size hint */ QSize QwtArrowButton::minimumSizeHint() const { const QSize asz = arrowSize( Qt::RightArrow, QSize() ); QSize sz( 2 * Margin + ( MaxNum - 1 ) * Spacing + MaxNum * asz.width(), 2 * Margin + asz.height() ); if ( d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow ) sz.transpose(); QStyleOption styleOption; styleOption.init( this ); sz = style()->sizeFromContents( QStyle::CT_PushButton, &styleOption, sz, this ); return sz; } /*! Calculate the size for a arrow that fits into a rectangle of a given size \param arrowType Arrow type \param boundingSize Bounding size \return Size of the arrow */ QSize QwtArrowButton::arrowSize( Qt::ArrowType arrowType, const QSize &boundingSize ) const { QSize bs = boundingSize; if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow ) bs.transpose(); const int MinLen = 2; const QSize sz = bs.expandedTo( QSize( MinLen, 2 * MinLen - 1 ) ); // minimum int w = sz.width(); int h = 2 * w - 1; if ( h > sz.height() ) { h = sz.height(); w = ( h + 1 ) / 2; } QSize arrSize( w, h ); if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow ) arrSize.transpose(); return arrSize; } /*! \brief autoRepeat for the space keys */ void QwtArrowButton::keyPressEvent( QKeyEvent *event ) { if ( event->isAutoRepeat() && event->key() == Qt::Key_Space ) Q_EMIT clicked(); QPushButton::keyPressEvent( event ); } qsstv_9.2.6/qwt/qwt_arrow_button.h0000664000175000017500000000262113203343610016032 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ARROW_BUTTON_H #define QWT_ARROW_BUTTON_H #include "qwt_global.h" #include /*! \brief Arrow Button A push button with one or more filled triangles on its front. An Arrow button can have 1 to 3 arrows in a row, pointing up, down, left or right. */ class QWT_EXPORT QwtArrowButton : public QPushButton { public: explicit QwtArrowButton ( int num, Qt::ArrowType, QWidget *parent = NULL ); virtual ~QwtArrowButton(); Qt::ArrowType arrowType() const; int num() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; protected: virtual void paintEvent( QPaintEvent *event ); virtual void drawButtonLabel( QPainter *p ); virtual void drawArrow( QPainter *, const QRect &, Qt::ArrowType ) const; virtual QRect labelRect() const; virtual QSize arrowSize( Qt::ArrowType, const QSize &boundingSize ) const; virtual void keyPressEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_clipper.cpp0000664000175000017500000003101013203343610015270 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_clipper.h" #include "qwt_point_polar.h" #include #include #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif namespace QwtClip { // some templates used for inlining template class LeftEdge; template class RightEdge; template class TopEdge; template class BottomEdge; template class PointBuffer; } template class QwtClip::LeftEdge { public: inline LeftEdge( Value x1, Value, Value, Value ): d_x1( x1 ) { } inline bool isInside( const Point &p ) const { return p.x() >= d_x1; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() ); return Point( d_x1, static_cast< Value >( p2.y() + ( d_x1 - p2.x() ) * dy ) ); } private: const Value d_x1; }; template class QwtClip::RightEdge { public: inline RightEdge( Value, Value x2, Value, Value ): d_x2( x2 ) { } inline bool isInside( const Point &p ) const { return p.x() <= d_x2; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() ); return Point( d_x2, static_cast( p2.y() + ( d_x2 - p2.x() ) * dy ) ); } private: const Value d_x2; }; template class QwtClip::TopEdge { public: inline TopEdge( Value, Value, Value y1, Value ): d_y1( y1 ) { } inline bool isInside( const Point &p ) const { return p.y() >= d_y1; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() ); return Point( static_cast( p2.x() + ( d_y1 - p2.y() ) * dx ), d_y1 ); } private: const Value d_y1; }; template class QwtClip::BottomEdge { public: inline BottomEdge( Value, Value, Value, Value y2 ): d_y2( y2 ) { } inline bool isInside( const Point &p ) const { return p.y() <= d_y2; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() ); return Point( static_cast( p2.x() + ( d_y2 - p2.y() ) * dx ), d_y2 ); } private: const Value d_y2; }; template class QwtClip::PointBuffer { public: PointBuffer( int capacity = 0 ): m_capacity( 0 ), m_size( 0 ), m_buffer( NULL ) { if ( capacity > 0 ) reserve( capacity ); } ~PointBuffer() { if ( m_buffer ) ::free( m_buffer ); } inline void setPoints( int numPoints, const Point *points ) { reserve( numPoints ); m_size = numPoints; ::memcpy( m_buffer, points, m_size * sizeof( Point ) ); } inline void reset() { m_size = 0; } inline int size() const { return m_size; } inline Point *data() const { return m_buffer; } inline Point &operator[]( int i ) { return m_buffer[i]; } inline const Point &operator[]( int i ) const { return m_buffer[i]; } inline void add( const Point &point ) { if ( m_capacity <= m_size ) reserve( m_size + 1 ); m_buffer[m_size++] = point; } private: inline void reserve( int size ) { if ( m_capacity == 0 ) m_capacity = 1; while ( m_capacity < size ) m_capacity *= 2; m_buffer = static_cast( ::realloc( m_buffer, m_capacity * sizeof( Point ) ) ); } int m_capacity; int m_size; Point *m_buffer; }; using namespace QwtClip; template class QwtPolygonClipper { public: QwtPolygonClipper( const Rect &clipRect ): d_clipRect( clipRect ) { } Polygon clipPolygon( const Polygon &polygon, bool closePolygon ) const { #if 0 if ( d_clipRect.contains( polygon.boundingRect() ) ) return polygon; #endif PointBuffer points1; PointBuffer points2( qMin( 256, polygon.size() ) ); points1.setPoints( polygon.size(), polygon.data() ); clipEdge< LeftEdge >( closePolygon, points1, points2 ); clipEdge< RightEdge >( closePolygon, points2, points1 ); clipEdge< TopEdge >( closePolygon, points1, points2 ); clipEdge< BottomEdge >( closePolygon, points2, points1 ); Polygon p; p.resize( points1.size() ); ::memcpy( p.data(), points1.data(), points1.size() * sizeof( Point ) ); return p; } private: template inline void clipEdge( bool closePolygon, PointBuffer &points, PointBuffer &clippedPoints ) const { clippedPoints.reset(); if ( points.size() < 2 ) { if ( points.size() == 1 ) clippedPoints.add( points[0] ); return; } const Edge edge( d_clipRect.x(), d_clipRect.x() + d_clipRect.width(), d_clipRect.y(), d_clipRect.y() + d_clipRect.height() ); int lastPos, start; if ( closePolygon ) { start = 0; lastPos = points.size() - 1; } else { start = 1; lastPos = 0; if ( edge.isInside( points[0] ) ) clippedPoints.add( points[0] ); } const uint nPoints = points.size(); for ( uint i = start; i < nPoints; i++ ) { const Point &p1 = points[i]; const Point &p2 = points[lastPos]; if ( edge.isInside( p1 ) ) { if ( edge.isInside( p2 ) ) { clippedPoints.add( p1 ); } else { clippedPoints.add( edge.intersection( p1, p2 ) ); clippedPoints.add( p1 ); } } else { if ( edge.isInside( p2 ) ) { clippedPoints.add( edge.intersection( p1, p2 ) ); } } lastPos = i; } } const Rect d_clipRect; }; class QwtCircleClipper { public: QwtCircleClipper( const QRectF &r ); QVector clipCircle( const QPointF &, double radius ) const; private: enum Edge { Left, Top, Right, Bottom, NEdges }; QList cuttingPoints( Edge, const QPointF &pos, double radius ) const; double toAngle( const QPointF &, const QPointF & ) const; const QRectF d_rect; }; QwtCircleClipper::QwtCircleClipper( const QRectF &r ): d_rect( r ) { } QVector QwtCircleClipper::clipCircle( const QPointF &pos, double radius ) const { QList points; for ( int edge = 0; edge < NEdges; edge++ ) points += cuttingPoints( static_cast(edge), pos, radius ); QVector intv; if ( points.size() <= 0 ) { QRectF cRect( 0, 0, 2 * radius, 2 * radius ); cRect.moveCenter( pos ); if ( d_rect.contains( cRect ) ) intv += QwtInterval( 0.0, 2 * M_PI ); } else { QList angles; for ( int i = 0; i < points.size(); i++ ) angles += toAngle( pos, points[i] ); qSort( angles ); const int in = d_rect.contains( qwtPolar2Pos( pos, radius, angles[0] + ( angles[1] - angles[0] ) / 2 ) ); if ( in ) { for ( int i = 0; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); } else { for ( int i = 1; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); intv += QwtInterval( angles.last(), angles.first() ); } } return intv; } double QwtCircleClipper::toAngle( const QPointF &from, const QPointF &to ) const { if ( from.x() == to.x() ) return from.y() <= to.y() ? M_PI / 2.0 : 3 * M_PI / 2.0; const double m = qAbs( ( to.y() - from.y() ) / ( to.x() - from.x() ) ); double angle = qAtan( m ); if ( to.x() > from.x() ) { if ( to.y() > from.y() ) angle = 2 * M_PI - angle; } else { if ( to.y() > from.y() ) angle = M_PI + angle; else angle = M_PI - angle; } return angle; } QList QwtCircleClipper::cuttingPoints( Edge edge, const QPointF &pos, double radius ) const { QList points; if ( edge == Left || edge == Right ) { const double x = ( edge == Left ) ? d_rect.left() : d_rect.right(); if ( qAbs( pos.x() - x ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.x() - x ) ); const double m_y1 = pos.y() + off; if ( m_y1 >= d_rect.top() && m_y1 <= d_rect.bottom() ) points += QPointF( x, m_y1 ); const double m_y2 = pos.y() - off; if ( m_y2 >= d_rect.top() && m_y2 <= d_rect.bottom() ) points += QPointF( x, m_y2 ); } } else { const double y = ( edge == Top ) ? d_rect.top() : d_rect.bottom(); if ( qAbs( pos.y() - y ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.y() - y ) ); const double x1 = pos.x() + off; if ( x1 >= d_rect.left() && x1 <= d_rect.right() ) points += QPointF( x1, y ); const double m_x2 = pos.x() - off; if ( m_x2 >= d_rect.left() && m_x2 <= d_rect.right() ) points += QPointF( m_x2, y ); } } return points; } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRectF &clipRect, const QPolygon &polygon, bool closePolygon ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); const QRect r( minX, minY, maxX - minX, maxY - minY ); QwtPolygonClipper clipper( r ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRect &clipRect, const QPolygon &polygon, bool closePolygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygonF QwtClipper::clipPolygonF( const QRectF &clipRect, const QPolygonF &polygon, bool closePolygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Circle clipping clipCircle() divides a circle into intervals of angles representing arcs of the circle. When the circle is completely inside the clip rectangle an interval [0.0, 2 * M_PI] is returned. \param clipRect Clip rectangle \param center Center of the circle \param radius Radius of the circle \return Arcs of the circle */ QVector QwtClipper::clipCircle( const QRectF &clipRect, const QPointF ¢er, double radius ) { QwtCircleClipper clipper( clipRect ); return clipper.clipCircle( center, radius ); } qsstv_9.2.6/qwt/qwt_clipper.h0000664000175000017500000000205113203343610014740 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CLIPPER_H #define QWT_CLIPPER_H #include "qwt_global.h" #include "qwt_interval.h" #include #include class QRect; class QRectF; /*! \brief Some clipping algorithms */ class QWT_EXPORT QwtClipper { public: static QPolygon clipPolygon( const QRect &, const QPolygon &, bool closePolygon = false ); static QPolygon clipPolygon( const QRectF &, const QPolygon &, bool closePolygon = false ); static QPolygonF clipPolygonF( const QRectF &, const QPolygonF &, bool closePolygon = false ); static QVector clipCircle( const QRectF &, const QPointF &, double radius ); }; #endif qsstv_9.2.6/qwt/qwt_color_map.cpp0000664000175000017500000002366213203343610015623 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_color_map.h" #include "qwt_math.h" #include "qwt_interval.h" #include class QwtLinearColorMap::ColorStops { public: ColorStops() { _stops.reserve( 256 ); } void insert( double pos, const QColor &color ); QRgb rgb( QwtLinearColorMap::Mode, double pos ) const; QVector stops() const; private: class ColorStop { public: ColorStop(): pos( 0.0 ), rgb( 0 ) { }; ColorStop( double p, const QColor &c ): pos( p ), rgb( c.rgb() ) { r = qRed( rgb ); g = qGreen( rgb ); b = qBlue( rgb ); } double pos; QRgb rgb; int r, g, b; }; inline int findUpper( double pos ) const; QVector _stops; }; void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color ) { // Lookups need to be very fast, insertions are not so important. // Anyway, a balanced tree is what we need here. TODO ... if ( pos < 0.0 || pos > 1.0 ) return; int index; if ( _stops.size() == 0 ) { index = 0; _stops.resize( 1 ); } else { index = findUpper( pos ); if ( index == _stops.size() || qAbs( _stops[index].pos - pos ) >= 0.001 ) { _stops.resize( _stops.size() + 1 ); for ( int i = _stops.size() - 1; i > index; i-- ) _stops[i] = _stops[i-1]; } } _stops[index] = ColorStop( pos, color ); } inline QVector QwtLinearColorMap::ColorStops::stops() const { QVector positions( _stops.size() ); for ( int i = 0; i < _stops.size(); i++ ) positions[i] = _stops[i].pos; return positions; } inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const { int index = 0; int n = _stops.size(); const ColorStop *stops = _stops.data(); while ( n > 0 ) { const int half = n >> 1; const int middle = index + half; if ( stops[middle].pos <= pos ) { index = middle + 1; n -= half + 1; } else n = half; } return index; } inline QRgb QwtLinearColorMap::ColorStops::rgb( QwtLinearColorMap::Mode mode, double pos ) const { if ( pos <= 0.0 ) return _stops[0].rgb; if ( pos >= 1.0 ) return _stops[ _stops.size() - 1 ].rgb; const int index = findUpper( pos ); if ( mode == FixedColors ) { return _stops[index-1].rgb; } else { const ColorStop &s1 = _stops[index-1]; const ColorStop &s2 = _stops[index]; const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos ); const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) ); const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) ); const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) ); return qRgb( r, g, b ); } } //! Constructor QwtColorMap::QwtColorMap( Format format ): d_format( format ) { } //! Destructor QwtColorMap::~QwtColorMap() { } /*! Build and return a color map of 256 colors The color table is needed for rendering indexed images in combination with using colorIndex(). \param interval Range for the values \return A color table, that can be used for a QImage */ QVector QwtColorMap::colorTable( const QwtInterval &interval ) const { QVector table( 256 ); if ( interval.isValid() ) { const double step = interval.width() / ( table.size() - 1 ); for ( int i = 0; i < table.size(); i++ ) table[i] = rgb( interval, interval.minValue() + step * i ); } return table; } class QwtLinearColorMap::PrivateData { public: ColorStops colorStops; QwtLinearColorMap::Mode mode; }; /*! Build a color map with two stops at 0.0 and 1.0. The color at 0.0 is Qt::blue, at 1.0 it is Qt::yellow. \param format Preferred format of the color map */ QwtLinearColorMap::QwtLinearColorMap( QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( Qt::blue, Qt::yellow ); } /*! Build a color map with two stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \param format Preferred format for the color map */ QwtLinearColorMap::QwtLinearColorMap( const QColor &color1, const QColor &color2, QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( color1, color2 ); } //! Destructor QwtLinearColorMap::~QwtLinearColorMap() { delete d_data; } /*! \brief Set the mode of the color map FixedColors means the color is calculated from the next lower color stop. ScaledColors means the color is calculated by interpolating the colors of the adjacent stops. \sa mode() */ void QwtLinearColorMap::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Mode of the color map \sa setMode() */ QwtLinearColorMap::Mode QwtLinearColorMap::mode() const { return d_data->mode; } /*! Set the color range Add stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \sa color1(), color2() */ void QwtLinearColorMap::setColorInterval( const QColor &color1, const QColor &color2 ) { d_data->colorStops = ColorStops(); d_data->colorStops.insert( 0.0, color1 ); d_data->colorStops.insert( 1.0, color2 ); } /*! Add a color stop The value has to be in the range [0.0, 1.0]. F.e. a stop at position 17.0 for a range [10.0,20.0] must be passed as: (17.0 - 10.0) / (20.0 - 10.0) \param value Value between [0.0, 1.0] \param color Color stop */ void QwtLinearColorMap::addColorStop( double value, const QColor& color ) { if ( value >= 0.0 && value <= 1.0 ) d_data->colorStops.insert( value, color ); } /*! \return Positions of color stops in increasing order */ QVector QwtLinearColorMap::colorStops() const { return d_data->colorStops.stops(); } /*! \return the first color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color1() const { return QColor( d_data->colorStops.rgb( d_data->mode, 0.0 ) ); } /*! \return the second color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color2() const { return QColor( d_data->colorStops.rgb( d_data->mode, 1.0 ) ); } /*! Map a value of a given interval into a RGB value \param interval Range for all values \param value Value to map into a RGB value \return RGB value for value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); } /*! \brief Map a value of a given interval into a color index \param interval Range for all values \param value Value to map into a color index \return Index, between 0 and 255 */ unsigned char QwtLinearColorMap::colorIndex( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() ) return 0; if ( value >= interval.maxValue() ) return 255; const double ratio = ( value - interval.minValue() ) / width; unsigned char index; if ( d_data->mode == FixedColors ) index = static_cast( ratio * 255 ); // always floor else index = static_cast( qRound( ratio * 255 ) ); return index; } class QwtAlphaColorMap::PrivateData { public: QColor color; QRgb rgb; }; /*! Constructor \param color Color of the map */ QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ): QwtColorMap( QwtColorMap::RGB ) { d_data = new PrivateData; d_data->color = color; d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 ); } //! Destructor QwtAlphaColorMap::~QwtAlphaColorMap() { delete d_data; } /*! Set the color \param color Color \sa color() */ void QwtAlphaColorMap::setColor( const QColor &color ) { d_data->color = color; d_data->rgb = color.rgb(); } /*! \return the color \sa setColor() */ QColor QwtAlphaColorMap::color() const { return d_data->color; } /*! \brief Map a value of a given interval into a alpha value alpha := (value - interval.minValue()) / interval.width(); \param interval Range for all values \param value Value to map into a RGB value \return RGB value, with an alpha value */ QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( !qIsNaN(value) && width >= 0.0 ) { const double ratio = ( value - interval.minValue() ) / width; int alpha = qRound( 255 * ratio ); if ( alpha < 0 ) alpha = 0; if ( alpha > 255 ) alpha = 255; return d_data->rgb | ( alpha << 24 ); } return d_data->rgb; } /*! Dummy function, needed to be implemented as it is pure virtual in QwtColorMap. Color indices make no sense in combination with an alpha channel. \return Always 0 */ unsigned char QwtAlphaColorMap::colorIndex( const QwtInterval &, double ) const { return 0; } qsstv_9.2.6/qwt/qwt_color_map.h0000664000175000017500000001166313203343610015266 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLOR_MAP_H #define QWT_COLOR_MAP_H #include "qwt_global.h" #include "qwt_interval.h" #include #include /*! \brief QwtColorMap is used to map values into colors. For displaying 3D data on a 2D plane the 3rd dimension is often displayed using colors, like f.e in a spectrogram. Each color map is optimized to return colors for only one of the following image formats: - QImage::Format_Indexed8\n - QImage::Format_ARGB32\n \sa QwtPlotSpectrogram, QwtScaleWidget */ class QWT_EXPORT QwtColorMap { public: /*! Format for color mapping \sa rgb(), colorIndex(), colorTable() */ enum Format { //! The map is intended to map into RGB values. RGB, /*! The map is intended to map into 8 bit values, that are indices into the color table. */ Indexed }; QwtColorMap( Format = QwtColorMap::RGB ); virtual ~QwtColorMap(); Format format() const; /*! Map a value of a given interval into a RGB value. \param interval Range for the values \param value Value \return RGB value, corresponding to value */ virtual QRgb rgb( const QwtInterval &interval, double value ) const = 0; /*! Map a value of a given interval into a color index \param interval Range for the values \param value Value \return color index, corresponding to value */ virtual unsigned char colorIndex( const QwtInterval &interval, double value ) const = 0; QColor color( const QwtInterval &, double value ) const; virtual QVector colorTable( const QwtInterval & ) const; private: Format d_format; }; /*! \brief QwtLinearColorMap builds a color map from color stops. A color stop is a color at a specific position. The valid range for the positions is [0.0, 1.0]. When mapping a value into a color it is translated into this interval according to mode(). */ class QWT_EXPORT QwtLinearColorMap: public QwtColorMap { public: /*! Mode of color map \sa setMode(), mode() */ enum Mode { //! Return the color from the next lower color stop FixedColors, //! Interpolating the colors of the adjacent stops. ScaledColors }; QwtLinearColorMap( QwtColorMap::Format = QwtColorMap::RGB ); QwtLinearColorMap( const QColor &from, const QColor &to, QwtColorMap::Format = QwtColorMap::RGB ); virtual ~QwtLinearColorMap(); void setMode( Mode ); Mode mode() const; void setColorInterval( const QColor &color1, const QColor &color2 ); void addColorStop( double value, const QColor& ); QVector colorStops() const; QColor color1() const; QColor color2() const; virtual QRgb rgb( const QwtInterval &, double value ) const; virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class ColorStops; private: // Disabled copy constructor and operator= QwtLinearColorMap( const QwtLinearColorMap & ); QwtLinearColorMap &operator=( const QwtLinearColorMap & ); class PrivateData; PrivateData *d_data; }; /*! \brief QwtAlphaColorMap varies the alpha value of a color */ class QWT_EXPORT QwtAlphaColorMap: public QwtColorMap { public: QwtAlphaColorMap( const QColor & = QColor( Qt::gray ) ); virtual ~QwtAlphaColorMap(); void setColor( const QColor & ); QColor color() const; virtual QRgb rgb( const QwtInterval &, double value ) const; private: QwtAlphaColorMap( const QwtAlphaColorMap & ); QwtAlphaColorMap &operator=( const QwtAlphaColorMap & ); virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class PrivateData; PrivateData *d_data; }; /*! Map a value into a color \param interval Valid interval for values \param value Value \return Color corresponding to value \warning This method is slow for Indexed color maps. If it is necessary to map many values, its better to get the color table once and find the color using colorIndex(). */ inline QColor QwtColorMap::color( const QwtInterval &interval, double value ) const { if ( d_format == RGB ) { return QColor( rgb( interval, value ) ); } else { const unsigned int index = colorIndex( interval, value ); return colorTable( interval )[index]; // slow } } /*! \return Intended format of the color map \sa Format */ inline QwtColorMap::Format QwtColorMap::format() const { return d_format; } #endif qsstv_9.2.6/qwt/qwt_column_symbol.cpp0000664000175000017500000001527613203343610016534 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_column_symbol.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include static void qwtDrawBox( QPainter *p, const QRectF &rect, const QPalette &pal, double lw ) { if ( lw > 0.0 ) { if ( rect.width() == 0.0 ) { p->setPen( pal.dark().color() ); p->drawLine( rect.topLeft(), rect.bottomLeft() ); return; } if ( rect.height() == 0.0 ) { p->setPen( pal.dark().color() ); p->drawLine( rect.topLeft(), rect.topRight() ); return; } lw = qMin( lw, rect.height() / 2.0 - 1.0 ); lw = qMin( lw, rect.width() / 2.0 - 1.0 ); const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 ); QPolygonF polygon( outerRect ); if ( outerRect.width() > 2 * lw && outerRect.height() > 2 * lw ) { const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw ); polygon = polygon.subtracted( innerRect ); } p->setPen( Qt::NoPen ); p->setBrush( pal.dark() ); p->drawPolygon( polygon ); } const QRectF windowRect = rect.adjusted( lw, lw, -lw + 1, -lw + 1 ); if ( windowRect.isValid() ) p->fillRect( windowRect, pal.window() ); } static void qwtDrawPanel( QPainter *painter, const QRectF &rect, const QPalette &pal, double lw ) { if ( lw > 0.0 ) { if ( rect.width() == 0.0 ) { painter->setPen( pal.window().color() ); painter->drawLine( rect.topLeft(), rect.bottomLeft() ); return; } if ( rect.height() == 0.0 ) { painter->setPen( pal.window().color() ); painter->drawLine( rect.topLeft(), rect.topRight() ); return; } lw = qMin( lw, rect.height() / 2.0 - 1.0 ); lw = qMin( lw, rect.width() / 2.0 - 1.0 ); const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 ); const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw ); QPolygonF lines[2]; lines[0] += outerRect.bottomLeft(); lines[0] += outerRect.topLeft(); lines[0] += outerRect.topRight(); lines[0] += innerRect.topRight(); lines[0] += innerRect.topLeft(); lines[0] += innerRect.bottomLeft(); lines[1] += outerRect.topRight(); lines[1] += outerRect.bottomRight(); lines[1] += outerRect.bottomLeft(); lines[1] += innerRect.bottomLeft(); lines[1] += innerRect.bottomRight(); lines[1] += innerRect.topRight(); painter->setPen( Qt::NoPen ); painter->setBrush( pal.light() ); painter->drawPolygon( lines[0] ); painter->setBrush( pal.dark() ); painter->drawPolygon( lines[1] ); } painter->fillRect( rect.adjusted( lw, lw, -lw + 1, -lw + 1 ), pal.window() ); } class QwtColumnSymbol::PrivateData { public: PrivateData(): style( QwtColumnSymbol::Box ), frameStyle( QwtColumnSymbol::Raised ), lineWidth( 2 ) { palette = QPalette( Qt::gray ); } QwtColumnSymbol::Style style; QwtColumnSymbol::FrameStyle frameStyle; QPalette palette; int lineWidth; }; /*! Constructor \param style Style of the symbol \sa setStyle(), style(), Style */ QwtColumnSymbol::QwtColumnSymbol( Style style ) { d_data = new PrivateData(); d_data->style = style; } //! Destructor QwtColumnSymbol::~QwtColumnSymbol() { delete d_data; } /*! Specify the symbol style \param style Style \sa style(), setPalette() */ void QwtColumnSymbol::setStyle( Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtColumnSymbol::Style QwtColumnSymbol::style() const { return d_data->style; } /*! Assign a palette for the symbol \param palette Palette \sa palette(), setStyle() */ void QwtColumnSymbol::setPalette( const QPalette &palette ) { d_data->palette = palette; } /*! \return Current palette \sa setPalette() */ const QPalette& QwtColumnSymbol::palette() const { return d_data->palette; } /*! Set the frame, that is used for the Box style. \param frameStyle Frame style \sa frameStyle(), setLineWidth(), setStyle() */ void QwtColumnSymbol::setFrameStyle( FrameStyle frameStyle ) { d_data->frameStyle = frameStyle; } /*! \return Current frame style, that is used for the Box style. \sa setFrameStyle(), lineWidth(), setStyle() */ QwtColumnSymbol::FrameStyle QwtColumnSymbol::frameStyle() const { return d_data->frameStyle; } /*! Set the line width of the frame, that is used for the Box style. \param width Width \sa lineWidth(), setFrameStyle() */ void QwtColumnSymbol::setLineWidth( int width ) { if ( width < 0 ) width = 0; d_data->lineWidth = width; } /*! \return Line width of the frame, that is used for the Box style. \sa setLineWidth(), frameStyle(), setStyle() */ int QwtColumnSymbol::lineWidth() const { return d_data->lineWidth; } /*! Draw the symbol depending on its style. \param painter Painter \param rect Directed rectangle \sa drawBox() */ void QwtColumnSymbol::draw( QPainter *painter, const QwtColumnRect &rect ) const { painter->save(); switch ( d_data->style ) { case QwtColumnSymbol::Box: { drawBox( painter, rect ); break; } default:; } painter->restore(); } /*! Draw the symbol when it is in Box style. \param painter Painter \param rect Directed rectangle \sa draw() */ void QwtColumnSymbol::drawBox( QPainter *painter, const QwtColumnRect &rect ) const { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( d_data->frameStyle ) { case QwtColumnSymbol::Raised: { qwtDrawPanel( painter, r, d_data->palette, d_data->lineWidth ); break; } case QwtColumnSymbol::Plain: { qwtDrawBox( painter, r, d_data->palette, d_data->lineWidth ); break; } default: { painter->fillRect( r, d_data->palette.window() ); } } } qsstv_9.2.6/qwt/qwt_column_symbol.h0000664000175000017500000000736013203343610016174 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLUMN_SYMBOL_H #define QWT_COLUMN_SYMBOL_H #include "qwt_global.h" #include "qwt_interval.h" #include #include #include class QPainter; class QPalette; class QRect; class QwtText; /*! \brief Directed rectangle representing bounding rectangle and orientation of a column. */ class QWT_EXPORT QwtColumnRect { public: //! Direction of the column enum Direction { //! From left to right LeftToRight, //! From right to left RightToLeft, //! From bottom to top BottomToTop, //! From top to bottom TopToBottom }; //! Build an rectangle with invalid intervals directed BottomToTop. QwtColumnRect(): direction( BottomToTop ) { } //! \return A normalized QRect built from the intervals QRectF toRect() const { QRectF r( hInterval.minValue(), vInterval.minValue(), hInterval.maxValue() - hInterval.minValue(), vInterval.maxValue() - vInterval.minValue() ); r = r.normalized(); if ( hInterval.borderFlags() & QwtInterval::ExcludeMinimum ) r.adjust( 1, 0, 0, 0 ); if ( hInterval.borderFlags() & QwtInterval::ExcludeMaximum ) r.adjust( 0, 0, -1, 0 ); if ( vInterval.borderFlags() & QwtInterval::ExcludeMinimum ) r.adjust( 0, 1, 0, 0 ); if ( vInterval.borderFlags() & QwtInterval::ExcludeMaximum ) r.adjust( 0, 0, 0, -1 ); return r; } //! \return Orientation Qt::Orientation orientation() const { if ( direction == LeftToRight || direction == RightToLeft ) return Qt::Horizontal; return Qt::Vertical; } //! Interval for the horizontal coordinates QwtInterval hInterval; //! Interval for the vertical coordinates QwtInterval vInterval; //! Direction Direction direction; }; //! A drawing primitive for columns class QWT_EXPORT QwtColumnSymbol { public: /*! Style \sa setStyle(), style() */ enum Style { //! No Style, the symbol draws nothing NoStyle = -1, /*! The column is painted with a frame depending on the frameStyle() and lineWidth() using the palette(). */ Box, /*! Styles >= QwtColumnSymbol::UserStyle are reserved for derived classes of QwtColumnSymbol that overload draw() with additional application specific symbol types. */ UserStyle = 1000 }; /*! Frame Style used in Box style(). \sa Style, setFrameStyle(), frameStyle(), setStyle(), setPalette() */ enum FrameStyle { //! No frame NoFrame, //! A plain frame style Plain, //! A raised frame style Raised }; public: QwtColumnSymbol( Style = NoStyle ); virtual ~QwtColumnSymbol(); void setFrameStyle( FrameStyle style ); FrameStyle frameStyle() const; void setLineWidth( int width ); int lineWidth() const; void setPalette( const QPalette & ); const QPalette &palette() const; void setStyle( Style ); Style style() const; virtual void draw( QPainter *, const QwtColumnRect & ) const; protected: void drawBox( QPainter *, const QwtColumnRect & ) const; private: class PrivateData; PrivateData* d_data; }; #endif qsstv_9.2.6/qwt/qwt_compass.cpp0000664000175000017500000001635413203343610015315 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_compass.h" #include "qwt_compass_rose.h" #include "qwt_math.h" #include "qwt_scale_draw.h" #include "qwt_painter.h" #include "qwt_dial_needle.h" #include #include #include /*! \brief Constructor Initializes a label map for multiples of 45 degrees */ QwtCompassScaleDraw::QwtCompassScaleDraw() { enableComponent( QwtAbstractScaleDraw::Backbone, false ); enableComponent( QwtAbstractScaleDraw::Ticks, false ); d_labelMap.insert( 0.0, QString::fromLatin1( "N" ) ); d_labelMap.insert( 45.0, QString::fromLatin1( "NE" ) ); d_labelMap.insert( 90.0, QString::fromLatin1( "E" ) ); d_labelMap.insert( 135.0, QString::fromLatin1( "SE" ) ); d_labelMap.insert( 180.0, QString::fromLatin1( "S" ) ); d_labelMap.insert( 225.0, QString::fromLatin1( "SW" ) ); d_labelMap.insert( 270.0, QString::fromLatin1( "W" ) ); d_labelMap.insert( 315.0, QString::fromLatin1( "NW" ) ); #if 0 d_labelMap.insert( 22.5, QString::fromLatin1( "NNE" ) ); d_labelMap.insert( 67.5, QString::fromLatin1( "NEE" ) ); d_labelMap.insert( 112.5, QString::fromLatin1( "SEE" ) ); d_labelMap.insert( 157.5, QString::fromLatin1( "SSE" ) ); d_labelMap.insert( 202.5, QString::fromLatin1( "SSW" ) ); d_labelMap.insert( 247.5, QString::fromLatin1( "SWW" ) ); d_labelMap.insert( 292.5, QString::fromLatin1( "NWW" ) ); d_labelMap.insert( 337.5, QString::fromLatin1( "NNW" ) ); #endif } /*! \brief Constructor \param map Value to label map */ QwtCompassScaleDraw::QwtCompassScaleDraw( const QMap &map ): d_labelMap( map ) { enableComponent( QwtAbstractScaleDraw::Backbone, false ); enableComponent( QwtAbstractScaleDraw::Ticks, false ); } /*! \brief Set a map, mapping values to labels \param map Value to label map The values of the major ticks are found by looking into this map. The default map consists of the labels N, NE, E, SE, S, SW, W, NW. \warning The map will have no effect for values that are no major tick values. Major ticks can be changed by QwtScaleDraw::setScale \sa labelMap(), scaleDraw(), setScale() */ void QwtCompassScaleDraw::setLabelMap( const QMap &map ) { d_labelMap = map; } /*! \return map, mapping values to labels \sa setLabelMap() */ QMap QwtCompassScaleDraw::labelMap() const { return d_labelMap; } /*! Map a value to a corresponding label \param value Value that will be mapped label() looks in the labelMap() for a corresponding label for value or returns an null text. \return Label, or QString::null \sa labelMap(), setLabelMap() */ QwtText QwtCompassScaleDraw::label( double value ) const { if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; if ( value < 0.0 ) value += 360.0; if ( d_labelMap.contains( value ) ) return d_labelMap[value]; return QwtText(); } class QwtCompass::PrivateData { public: PrivateData(): rose( NULL ) { } ~PrivateData() { delete rose; } QwtCompassRose *rose; }; /*! \brief Constructor \param parent Parent widget Create a compass widget with a scale, no needle and no rose. The default origin is 270.0 with no valid value. It accepts mouse and keyboard inputs and has no step size. The default mode is QwtDial::RotateNeedle. */ QwtCompass::QwtCompass( QWidget* parent ): QwtDial( parent ) { d_data = new PrivateData; setScaleDraw( new QwtCompassScaleDraw() ); setOrigin( 270.0 ); setWrapping( true ); setScaleMaxMajor( 36 ); setScaleMaxMinor( 10 ); setScale( 0.0, 360.0 ); // degrees as default setTotalSteps( 360 ); } //! Destructor QwtCompass::~QwtCompass() { delete d_data; } /*! Draw the contents of the scale \param painter Painter \param center Center of the content circle \param radius Radius of the content circle */ void QwtCompass::drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const { QPalette::ColorGroup cg; if ( isEnabled() ) cg = hasFocus() ? QPalette::Active : QPalette::Inactive; else cg = QPalette::Disabled; double north = origin(); if ( isValid() ) { if ( mode() == RotateScale ) north -= value(); } const int margin = 4; drawRose( painter, center, radius - margin, 360.0 - north, cg ); } /*! Draw the compass rose \param painter Painter \param center Center of the compass \param radius of the circle, where to paint the rose \param north Direction pointing north, in degrees counter clockwise \param cg Color group */ void QwtCompass::drawRose( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup cg ) const { if ( d_data->rose ) d_data->rose->draw( painter, center, radius, north, cg ); } /*! Set a rose for the compass \param rose Compass rose \warning The rose will be deleted, when a different rose is set or in ~QwtCompass \sa rose() */ void QwtCompass::setRose( QwtCompassRose *rose ) { if ( rose != d_data->rose ) { if ( d_data->rose ) delete d_data->rose; d_data->rose = rose; update(); } } /*! \return rose \sa setRose() */ const QwtCompassRose *QwtCompass::rose() const { return d_data->rose; } /*! \return rose \sa setRose() */ QwtCompassRose *QwtCompass::rose() { return d_data->rose; } /*! Handles key events Beside the keys described in QwtDial::keyPressEvent numbers from 1-9 (without 5) set the direction according to their position on the num pad. \sa isReadOnly() */ void QwtCompass::keyPressEvent( QKeyEvent *kev ) { if ( isReadOnly() ) return; #if 0 if ( kev->key() == Key_5 ) { invalidate(); // signal ??? return; } #endif double newValue = value(); if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 ) { if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 ) return; switch ( kev->key() ) { case Qt::Key_6: newValue = 180.0 * 0.0; break; case Qt::Key_3: newValue = 180.0 * 0.25; break; case Qt::Key_2: newValue = 180.0 * 0.5; break; case Qt::Key_1: newValue = 180.0 * 0.75; break; case Qt::Key_4: newValue = 180.0 * 1.0; break; case Qt::Key_7: newValue = 180.0 * 1.25; break; case Qt::Key_8: newValue = 180.0 * 1.5; break; case Qt::Key_9: newValue = 180.0 * 1.75; break; } newValue -= origin(); setValue( newValue ); } else { QwtDial::keyPressEvent( kev ); } } qsstv_9.2.6/qwt/qwt_compass.h0000664000175000017500000000402713203343610014754 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COMPASS_H #define QWT_COMPASS_H 1 #include "qwt_global.h" #include "qwt_dial.h" #include "qwt_round_scale_draw.h" #include #include class QwtCompassRose; /*! \brief A special scale draw made for QwtCompass QwtCompassScaleDraw maps values to strings using a special map, that can be modified by the application The default map consists of the labels N, NE, E, SE, S, SW, W, NW. \sa QwtCompass */ class QWT_EXPORT QwtCompassScaleDraw: public QwtRoundScaleDraw { public: explicit QwtCompassScaleDraw(); explicit QwtCompassScaleDraw( const QMap &map ); void setLabelMap( const QMap &map ); QMap labelMap() const; virtual QwtText label( double value ) const; private: QMap d_labelMap; }; /*! \brief A Compass Widget QwtCompass is a widget to display and enter directions. It consists of a scale, an optional needle and rose. \image html dials1.png \note The examples/dials example shows how to use QwtCompass. */ class QWT_EXPORT QwtCompass: public QwtDial { Q_OBJECT public: explicit QwtCompass( QWidget* parent = NULL ); virtual ~QwtCompass(); void setRose( QwtCompassRose *rose ); const QwtCompassRose *rose() const; QwtCompassRose *rose(); protected: virtual void drawRose( QPainter *, const QPointF ¢er, double radius, double north, QPalette::ColorGroup ) const; virtual void drawScaleContents( QPainter *, const QPointF ¢er, double radius ) const; virtual void keyPressEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_compass_rose.cpp0000664000175000017500000001474313203343610016345 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_compass_rose.h" #include "qwt_point_polar.h" #include "qwt_painter.h" #include static QPointF qwtIntersection( QPointF p11, QPointF p12, QPointF p21, QPointF p22 ) { const QLineF line1( p11, p12 ); const QLineF line2( p21, p22 ); QPointF pos; if ( line1.intersect( line2, &pos ) == QLineF::NoIntersection ) return QPointF(); return pos; } class QwtSimpleCompassRose::PrivateData { public: PrivateData(): width( 0.2 ), numThorns( 8 ), numThornLevels( -1 ), shrinkFactor( 0.9 ) { } double width; int numThorns; int numThornLevels; double shrinkFactor; }; /*! Constructor \param numThorns Number of thorns \param numThornLevels Number of thorn levels */ QwtSimpleCompassRose::QwtSimpleCompassRose( int numThorns, int numThornLevels ) { d_data = new PrivateData(); d_data->numThorns = numThorns; d_data->numThornLevels = numThornLevels; const QColor dark( 128, 128, 255 ); const QColor light( 192, 255, 255 ); QPalette palette; palette.setColor( QPalette::Dark, dark ); palette.setColor( QPalette::Light, light ); setPalette( palette ); } //! Destructor QwtSimpleCompassRose::~QwtSimpleCompassRose() { delete d_data; } /*! Set the Factor how to shrink the thorns with each level The default value is 0.9. \param factor Shrink factor \sa shrinkFactor() */ void QwtSimpleCompassRose::setShrinkFactor( double factor ) { d_data->shrinkFactor = factor; } /*! \return Factor how to shrink the thorns with each level \sa setShrinkFactor() */ double QwtSimpleCompassRose::shrinkFactor() const { return d_data->shrinkFactor; } /*! Draw the rose \param painter Painter \param center Center point \param radius Radius of the rose \param north Position \param cg Color group */ void QwtSimpleCompassRose::draw( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup cg ) const { QPalette pal = palette(); pal.setCurrentColorGroup( cg ); drawRose( painter, pal, center, radius, north, d_data->width, d_data->numThorns, d_data->numThornLevels, d_data->shrinkFactor ); } /*! Draw the rose \param painter Painter \param palette Palette \param center Center of the rose \param radius Radius of the rose \param north Position pointing to north \param width Width of the rose \param numThorns Number of thorns \param numThornLevels Number of thorn levels \param shrinkFactor Factor to shrink the thorns with each level */ void QwtSimpleCompassRose::drawRose( QPainter *painter, const QPalette &palette, const QPointF ¢er, double radius, double north, double width, int numThorns, int numThornLevels, double shrinkFactor ) { if ( numThorns < 4 ) numThorns = 4; if ( numThorns % 4 ) numThorns += 4 - numThorns % 4; if ( numThornLevels <= 0 ) numThornLevels = numThorns / 4; if ( shrinkFactor >= 1.0 ) shrinkFactor = 1.0; if ( shrinkFactor <= 0.5 ) shrinkFactor = 0.5; painter->save(); painter->setPen( Qt::NoPen ); for ( int j = 1; j <= numThornLevels; j++ ) { double step = qPow( 2.0, j ) * M_PI / numThorns; if ( step > M_PI_2 ) break; double r = radius; for ( int k = 0; k < 3; k++ ) { if ( j + k < numThornLevels ) r *= shrinkFactor; } double leafWidth = r * width; if ( 2.0 * M_PI / step > 32 ) leafWidth = 16; const double origin = qwtRadians( north ); for ( double angle = origin; angle < 2.0 * M_PI + origin; angle += step ) { const QPointF p = qwtPolar2Pos( center, r, angle ); const QPointF p1 = qwtPolar2Pos( center, leafWidth, angle + M_PI_2 ); const QPointF p2 = qwtPolar2Pos( center, leafWidth, angle - M_PI_2 ); const QPointF p3 = qwtPolar2Pos( center, r, angle + step / 2.0 ); const QPointF p4 = qwtPolar2Pos( center, r, angle - step / 2.0 ); QPainterPath darkPath; darkPath.moveTo( center ); darkPath.lineTo( p ); darkPath.lineTo( qwtIntersection( center, p3, p1, p ) ); painter->setBrush( palette.brush( QPalette::Dark ) ); painter->drawPath( darkPath ); QPainterPath lightPath; lightPath.moveTo( center ); lightPath.lineTo( p ); lightPath.lineTo( qwtIntersection( center, p4, p2, p ) ); painter->setBrush( palette.brush( QPalette::Light ) ); painter->drawPath( lightPath ); } } painter->restore(); } /*! Set the width of the rose heads. Lower value make thinner heads. The range is limited from 0.03 to 0.4. \param width Width */ void QwtSimpleCompassRose::setWidth( double width ) { d_data->width = width; if ( d_data->width < 0.03 ) d_data->width = 0.03; if ( d_data->width > 0.4 ) d_data->width = 0.4; } /*! \return Width of the rose \sa setWidth() */ double QwtSimpleCompassRose::width() const { return d_data->width; } /*! Set the number of thorns on one level The number is aligned to a multiple of 4, with a minimum of 4 \param numThorns Number of thorns \sa numThorns(), setNumThornLevels() */ void QwtSimpleCompassRose::setNumThorns( int numThorns ) { if ( numThorns < 4 ) numThorns = 4; if ( numThorns % 4 ) numThorns += 4 - numThorns % 4; d_data->numThorns = numThorns; } /*! \return Number of thorns \sa setNumThorns(), setNumThornLevels() */ int QwtSimpleCompassRose::numThorns() const { return d_data->numThorns; } /*! Set the of thorns levels \param numThornLevels Number of thorns levels \sa setNumThorns(), numThornLevels() */ void QwtSimpleCompassRose::setNumThornLevels( int numThornLevels ) { d_data->numThornLevels = numThornLevels; } /*! \return Number of thorn levels \sa setNumThorns(), setNumThornLevels() */ int QwtSimpleCompassRose::numThornLevels() const { return d_data->numThornLevels; } qsstv_9.2.6/qwt/qwt_compass_rose.h0000664000175000017500000000424513203343610016006 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COMPASS_ROSE_H #define QWT_COMPASS_ROSE_H 1 #include "qwt_global.h" #include class QPainter; /*! \brief Abstract base class for a compass rose */ class QWT_EXPORT QwtCompassRose { public: //! Destructor virtual ~QwtCompassRose() {}; //! Assign a palette virtual void setPalette( const QPalette &p ) { d_palette = p; } //! \return Current palette const QPalette &palette() const { return d_palette; } /*! Draw the rose \param painter Painter \param center Center point \param radius Radius of the rose \param north Position \param colorGroup Color group */ virtual void draw( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup colorGroup = QPalette::Active ) const = 0; private: QPalette d_palette; }; /*! \brief A simple rose for QwtCompass */ class QWT_EXPORT QwtSimpleCompassRose: public QwtCompassRose { public: QwtSimpleCompassRose( int numThorns = 8, int numThornLevels = -1 ); virtual ~QwtSimpleCompassRose(); void setWidth( double w ); double width() const; void setNumThorns( int count ); int numThorns() const; void setNumThornLevels( int count ); int numThornLevels() const; void setShrinkFactor( double factor ); double shrinkFactor() const; virtual void draw( QPainter *, const QPointF ¢er, double radius, double north, QPalette::ColorGroup = QPalette::Active ) const; static void drawRose( QPainter *, const QPalette &, const QPointF ¢er, double radius, double origin, double width, int numThorns, int numThornLevels, double shrinkFactor ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_compat.h0000664000175000017500000000205013203343610014564 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef _QWT_COMPAT_H_ #define _QWT_COMPAT_H_ #include "qwt_global.h" #include "qwt_interval.h" #include "qwt_point_3d.h" #include #include #include #include #include #include // A couple of definition for Qwt5 compatibility #define qwtMax qMax #define qwtMin qMin #define qwtAbs qAbs #define qwtRound qRound #define QwtArray QVector typedef QList QwtValueList; typedef QPointF QwtDoublePoint; typedef QSizeF QwtDoubleSize; typedef QRectF QwtDoubleRect; typedef QPolygon QwtPolygon; typedef QPolygonF QwtPolygonF; typedef QwtInterval QwtDoubleInterval; typedef QwtPoint3D QwtDoublePoint3D; #endif qsstv_9.2.6/qwt/qwt_counter.cpp0000664000175000017500000004242413203343610015324 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_arrow_button.h" #include "qwt_math.h" #include "qwt_counter.h" #include #include #include #include #include class QwtCounter::PrivateData { public: PrivateData(): minimum( 0.0 ), maximum( 0.0 ), singleStep( 1.0 ), isValid( false ), value( 0.0 ), wrapping( false ) { increment[Button1] = 1; increment[Button2] = 10; increment[Button3] = 100; } QwtArrowButton *buttonDown[ButtonCnt]; QwtArrowButton *buttonUp[ButtonCnt]; QLineEdit *valueEdit; int increment[ButtonCnt]; int numButtons; double minimum; double maximum; double singleStep; bool isValid; double value; bool wrapping; }; /*! The counter is initialized with a range is set to [0.0, 1.0] with 0.01 as single step size. The value is invalid. The default number of buttons is set to 2. The default increments are: \li Button 1: 1 step \li Button 2: 10 steps \li Button 3: 100 steps \param parent */ QwtCounter::QwtCounter( QWidget *parent ): QWidget( parent ) { initCounter(); } void QwtCounter::initCounter() { d_data = new PrivateData; QHBoxLayout *layout = new QHBoxLayout( this ); layout->setSpacing( 0 ); layout->setMargin( 0 ); for ( int i = ButtonCnt - 1; i >= 0; i-- ) { QwtArrowButton *btn = new QwtArrowButton( i + 1, Qt::DownArrow, this ); btn->setFocusPolicy( Qt::NoFocus ); btn->installEventFilter( this ); layout->addWidget( btn ); connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) ); connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) ); d_data->buttonDown[i] = btn; } d_data->valueEdit = new QLineEdit( this ); d_data->valueEdit->setReadOnly( false ); d_data->valueEdit->setValidator( new QDoubleValidator( d_data->valueEdit ) ); layout->addWidget( d_data->valueEdit ); connect( d_data->valueEdit, SIGNAL( editingFinished() ), SLOT( textChanged() ) ); layout->setStretchFactor( d_data->valueEdit, 10 ); for ( int i = 0; i < ButtonCnt; i++ ) { QwtArrowButton *btn = new QwtArrowButton( i + 1, Qt::UpArrow, this ); btn->setFocusPolicy( Qt::NoFocus ); btn->installEventFilter( this ); layout->addWidget( btn ); connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) ); connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) ); d_data->buttonUp[i] = btn; } setNumButtons( 2 ); setRange( 0.0, 1.0 ); setSingleStep( 0.001 ); setValue( 0.0 ); setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); setFocusProxy( d_data->valueEdit ); setFocusPolicy( Qt::StrongFocus ); } //! Destructor QwtCounter::~QwtCounter() { delete d_data; } /*! Set the counter to be in valid/invalid state When the counter is set to invalid, no numbers are displayed and the buttons are disabled. \param on If true the counter will be set as valid \sa setValue(), isValid() */ void QwtCounter::setValid( bool on ) { if ( on != d_data->isValid ) { d_data->isValid = on; updateButtons(); if ( d_data->isValid ) { showNumber( value() ); Q_EMIT valueChanged( value() ); } else { d_data->valueEdit->setText( QString::null ); } } } /*! \return True, if the value is valid \sa setValid(), setValue() */ bool QwtCounter::isValid() const { return d_data->isValid; } /*! \brief Allow/disallow the user to manually edit the value \param on True disable editing \sa isReadOnly() */ void QwtCounter::setReadOnly( bool on ) { d_data->valueEdit->setReadOnly( on ); } /*! \return True, when the line line edit is read only. (default is no) \sa setReadOnly() */ bool QwtCounter::isReadOnly() const { return d_data->valueEdit->isReadOnly(); } /*! \brief Set a new value without adjusting to the step raster The state of the counter is set to be valid. \param value New value \sa isValid(), value(), valueChanged() \warning The value is clipped when it lies outside the range. */ void QwtCounter::setValue( double value ) { const double vmin = qMin( d_data->minimum, d_data->maximum ); const double vmax = qMax( d_data->minimum, d_data->maximum ); value = qBound( vmin, value, vmax ); if ( !d_data->isValid || value != d_data->value ) { d_data->isValid = true; d_data->value = value; showNumber( value ); updateButtons(); Q_EMIT valueChanged( value ); } } /*! \return Current value of the counter \sa setValue(), valueChanged() */ double QwtCounter::value() const { return d_data->value; } /*! \brief Set the minimum and maximum values The maximum is adjusted if necessary to ensure that the range remains valid. The value might be modified to be inside of the range. \param min Minimum value \param max Maximum value \sa minimum(), maximum() */ void QwtCounter::setRange( double min, double max ) { max = qMax( min, max ); if ( d_data->maximum == max && d_data->minimum == min ) return; d_data->minimum = min; d_data->maximum = max; setSingleStep( singleStep() ); const double value = qBound( min, d_data->value, max ); if ( value != d_data->value ) { d_data->value = value; if ( d_data->isValid ) { showNumber( value ); Q_EMIT valueChanged( value ); } } updateButtons(); } /*! Set the minimum value of the range \param value Minimum value \sa setRange(), setMaximum(), minimum() \note The maximum is adjusted if necessary to ensure that the range remains valid. */ void QwtCounter::setMinimum( double value ) { setRange( value, maximum() ); } /*! \return The minimum of the range \sa setRange(), setMinimum(), maximum() */ double QwtCounter::minimum() const { return d_data->minimum; } /*! Set the maximum value of the range \param value Maximum value \sa setRange(), setMinimum(), maximum() */ void QwtCounter::setMaximum( double value ) { setRange( minimum(), value ); } /*! \return The maximum of the range \sa setRange(), setMaximum(), minimum() */ double QwtCounter::maximum() const { return d_data->maximum; } /*! \brief Set the step size of the counter A value <= 0.0 disables stepping \param stepSize Single step size \sa singleStep() */ void QwtCounter::setSingleStep( double stepSize ) { d_data->singleStep = qMax( stepSize, 0.0 ); } /*! \return Single step size \sa setSingleStep() */ double QwtCounter::singleStep() const { return d_data->singleStep; } /*! \brief En/Disable wrapping If wrapping is true stepping up from maximum() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtCounter::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtCounter::wrapping() const { return d_data->wrapping; } /*! Specify the number of buttons on each side of the label \param numButtons Number of buttons \sa numButtons() */ void QwtCounter::setNumButtons( int numButtons ) { if ( numButtons < 0 || numButtons > QwtCounter::ButtonCnt ) return; for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { if ( i < numButtons ) { d_data->buttonDown[i]->show(); d_data->buttonUp[i]->show(); } else { d_data->buttonDown[i]->hide(); d_data->buttonUp[i]->hide(); } } d_data->numButtons = numButtons; } /*! \return The number of buttons on each side of the widget. \sa setNumButtons() */ int QwtCounter::numButtons() const { return d_data->numButtons; } /*! Specify the number of steps by which the value is incremented or decremented when a specified button is pushed. \param button Button index \param numSteps Number of steps \sa incSteps() */ void QwtCounter::setIncSteps( QwtCounter::Button button, int numSteps ) { if ( button >= 0 && button < QwtCounter::ButtonCnt ) d_data->increment[ button ] = numSteps; } /*! \return The number of steps by which a specified button increments the value or 0 if the button is invalid. \param button Button index \sa setIncSteps() */ int QwtCounter::incSteps( QwtCounter::Button button ) const { if ( button >= 0 && button < QwtCounter::ButtonCnt ) return d_data->increment[ button ]; return 0; } /*! Set the number of increment steps for button 1 \param nSteps Number of steps */ void QwtCounter::setStepButton1( int nSteps ) { setIncSteps( QwtCounter::Button1, nSteps ); } //! returns the number of increment steps for button 1 int QwtCounter::stepButton1() const { return incSteps( QwtCounter::Button1 ); } /*! Set the number of increment steps for button 2 \param nSteps Number of steps */ void QwtCounter::setStepButton2( int nSteps ) { setIncSteps( QwtCounter::Button2, nSteps ); } //! returns the number of increment steps for button 2 int QwtCounter::stepButton2() const { return incSteps( QwtCounter::Button2 ); } /*! Set the number of increment steps for button 3 \param nSteps Number of steps */ void QwtCounter::setStepButton3( int nSteps ) { setIncSteps( QwtCounter::Button3, nSteps ); } //! returns the number of increment steps for button 3 int QwtCounter::stepButton3() const { return incSteps( QwtCounter::Button3 ); } //! Set from lineedit void QwtCounter::textChanged() { bool converted = false; const double value = d_data->valueEdit->text().toDouble( &converted ); if ( converted ) setValue( value ); } /*! Handle QEvent::PolishRequest events \param event Event \return see QWidget::event() */ bool QwtCounter::event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { const int w = d_data->valueEdit->fontMetrics().width( "W" ) + 8; for ( int i = 0; i < ButtonCnt; i++ ) { d_data->buttonDown[i]->setMinimumWidth( w ); d_data->buttonUp[i]->setMinimumWidth( w ); } } return QWidget::event( event ); } /*! Handle key events - Ctrl + Qt::Key_Home\n Step to minimum() - Ctrl + Qt::Key_End\n Step to maximum() - Qt::Key_Up\n Increment by incSteps(QwtCounter::Button1) - Qt::Key_Down\n Decrement by incSteps(QwtCounter::Button1) - Qt::Key_PageUp\n Increment by incSteps(QwtCounter::Button2) - Qt::Key_PageDown\n Decrement by incSteps(QwtCounter::Button2) - Shift + Qt::Key_PageUp\n Increment by incSteps(QwtCounter::Button3) - Shift + Qt::Key_PageDown\n Decrement by incSteps(QwtCounter::Button3) \param event Key event */ void QwtCounter::keyPressEvent ( QKeyEvent *event ) { bool accepted = true; switch ( event->key() ) { case Qt::Key_Home: { if ( event->modifiers() & Qt::ControlModifier ) setValue( minimum() ); else accepted = false; break; } case Qt::Key_End: { if ( event->modifiers() & Qt::ControlModifier ) setValue( maximum() ); else accepted = false; break; } case Qt::Key_Up: { incrementValue( d_data->increment[0] ); break; } case Qt::Key_Down: { incrementValue( -d_data->increment[0] ); break; } case Qt::Key_PageUp: case Qt::Key_PageDown: { int increment = d_data->increment[0]; if ( d_data->numButtons >= 2 ) increment = d_data->increment[1]; if ( d_data->numButtons >= 3 ) { if ( event->modifiers() & Qt::ShiftModifier ) increment = d_data->increment[2]; } if ( event->key() == Qt::Key_PageDown ) increment = -increment; incrementValue( increment ); break; } default: { accepted = false; } } if ( accepted ) { event->accept(); return; } QWidget::keyPressEvent ( event ); } /*! Handle wheel events \param event Wheel event */ void QwtCounter::wheelEvent( QWheelEvent *event ) { event->accept(); if ( d_data->numButtons <= 0 ) return; int increment = d_data->increment[0]; if ( d_data->numButtons >= 2 ) { if ( event->modifiers() & Qt::ControlModifier ) increment = d_data->increment[1]; } if ( d_data->numButtons >= 3 ) { if ( event->modifiers() & Qt::ShiftModifier ) increment = d_data->increment[2]; } for ( int i = 0; i < d_data->numButtons; i++ ) { if ( d_data->buttonDown[i]->geometry().contains( event->pos() ) || d_data->buttonUp[i]->geometry().contains( event->pos() ) ) { increment = d_data->increment[i]; } } const int wheel_delta = 120; #if 1 int delta = event->delta(); if ( delta >= 2 * wheel_delta ) delta /= 2; // Never saw an abs(delta) < 240 #endif incrementValue( delta / wheel_delta * increment ); } void QwtCounter::incrementValue( int numSteps ) { const double min = d_data->minimum; const double max = d_data->maximum; double stepSize = d_data->singleStep; if ( !d_data->isValid || min >= max || stepSize <= 0.0 ) return; #if 1 stepSize = qMax( stepSize, 1.0e-10 * ( max - min ) ); #endif double value = d_data->value + numSteps * stepSize; if ( d_data->wrapping ) { const double range = max - min; if ( value < min ) { value += ::ceil( ( min - value ) / range ) * range; } else if ( value > max ) { value -= ::ceil( ( value - max ) / range ) * range; } } else { value = qBound( min, value, max ); } value = min + qRound( ( value - min ) / stepSize ) * stepSize; if ( qFuzzyCompare( value, max ) ) value = max; if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; if ( value != d_data->value ) { d_data->value = value; showNumber( d_data->value ); updateButtons(); Q_EMIT valueChanged( d_data->value ); } } /*! \brief Update buttons according to the current value When the QwtCounter under- or over-flows, the focus is set to the smallest up- or down-button and counting is disabled. Counting is re-enabled on a button release event (mouse or space bar). */ void QwtCounter::updateButtons() { if ( d_data->isValid ) { // 1. save enabled state of the smallest down- and up-button // 2. change enabled state on under- or over-flow for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { d_data->buttonDown[i]->setEnabled( value() > minimum() ); d_data->buttonUp[i]->setEnabled( value() < maximum() ); } } else { for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { d_data->buttonDown[i]->setEnabled( false ); d_data->buttonUp[i]->setEnabled( false ); } } } /*! Display number string \param number Number */ void QwtCounter::showNumber( double number ) { QString text; text.setNum( number ); const int cursorPos = d_data->valueEdit->cursorPosition(); d_data->valueEdit->setText( text ); d_data->valueEdit->setCursorPosition( cursorPos ); } //! Button clicked void QwtCounter::btnClicked() { for ( int i = 0; i < ButtonCnt; i++ ) { if ( d_data->buttonUp[i] == sender() ) incrementValue( d_data->increment[i] ); if ( d_data->buttonDown[i] == sender() ) incrementValue( -d_data->increment[i] ); } } //! Button released void QwtCounter::btnReleased() { Q_EMIT buttonReleased( value() ); } //! A size hint QSize QwtCounter::sizeHint() const { QString tmp; int w = tmp.setNum( minimum() ).length(); int w1 = tmp.setNum( maximum() ).length(); if ( w1 > w ) w = w1; w1 = tmp.setNum( minimum() + singleStep() ).length(); if ( w1 > w ) w = w1; w1 = tmp.setNum( maximum() - singleStep() ).length(); if ( w1 > w ) w = w1; tmp.fill( '9', w ); QFontMetrics fm( d_data->valueEdit->font() ); w = fm.width( tmp ) + 2; if ( d_data->valueEdit->hasFrame() ) w += 2 * style()->pixelMetric( QStyle::PM_DefaultFrameWidth ); // Now we replace default sizeHint contribution of d_data->valueEdit by // what we really need. w += QWidget::sizeHint().width() - d_data->valueEdit->sizeHint().width(); const int h = qMin( QWidget::sizeHint().height(), d_data->valueEdit->minimumSizeHint().height() ); return QSize( w, h ); } qsstv_9.2.6/qwt/qwt_counter.h0000664000175000017500000001036513203343610014770 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COUNTER_H #define QWT_COUNTER_H #include "qwt_global.h" #include /*! \brief The Counter Widget A Counter consists of a label displaying a number and one ore more (up to three) push buttons on each side of the label which can be used to increment or decrement the counter's value. A counter has a range from a minimum value to a maximum value and a step size. When the wrapping property is set the counter is circular. The number of steps by which a button increments or decrements the value can be specified using setIncSteps(). The number of buttons can be changed with setNumButtons(). Example: \code #include QwtCounter *counter = new QwtCounter(parent); counter->setRange(0.0, 100.0); // From 0.0 to 100 counter->setSingleStep( 1.0 ); // Step size 1.0 counter->setNumButtons(2); // Two buttons each side counter->setIncSteps(QwtCounter::Button1, 1); // Button 1 increments 1 step counter->setIncSteps(QwtCounter::Button2, 20); // Button 2 increments 20 steps connect(counter, SIGNAL(valueChanged(double)), myClass, SLOT(newValue(double))); \endcode */ class QWT_EXPORT QwtCounter : public QWidget { Q_OBJECT Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( double minimum READ minimum WRITE setMinimum ) Q_PROPERTY( double maximum READ maximum WRITE setMaximum ) Q_PROPERTY( double singleStep READ singleStep WRITE setSingleStep ) Q_PROPERTY( int numButtons READ numButtons WRITE setNumButtons ) Q_PROPERTY( int stepButton1 READ stepButton1 WRITE setStepButton1 ) Q_PROPERTY( int stepButton2 READ stepButton2 WRITE setStepButton2 ) Q_PROPERTY( int stepButton3 READ stepButton3 WRITE setStepButton3 ) Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) public: //! Button index enum Button { //! Button intended for minor steps Button1, //! Button intended for medium steps Button2, //! Button intended for large steps Button3, //! Number of buttons ButtonCnt }; explicit QwtCounter( QWidget *parent = NULL ); virtual ~QwtCounter(); void setValid( bool ); bool isValid() const; void setWrapping( bool ); bool wrapping() const; bool isReadOnly() const; void setReadOnly( bool ); void setNumButtons( int n ); int numButtons() const; void setIncSteps( QwtCounter::Button btn, int nSteps ); int incSteps( QwtCounter::Button btn ) const; virtual QSize sizeHint() const; double singleStep() const; void setSingleStep( double s ); void setRange( double min, double max ); double minimum() const; void setMinimum( double min ); double maximum() const; void setMaximum( double max ); void setStepButton1( int nSteps ); int stepButton1() const; void setStepButton2( int nSteps ); int stepButton2() const; void setStepButton3( int nSteps ); int stepButton3() const; double value() const; public Q_SLOTS: void setValue( double ); Q_SIGNALS: /*! This signal is emitted when a button has been released \param value The new value */ void buttonReleased ( double value ); /*! This signal is emitted when the counter's value has changed \param value The new value */ void valueChanged ( double value ); protected: virtual bool event( QEvent * ); virtual void wheelEvent( QWheelEvent * ); virtual void keyPressEvent( QKeyEvent * ); private Q_SLOTS: void btnReleased(); void btnClicked(); void textChanged(); private: void incrementValue( int numSteps ); void initCounter(); void updateButtons(); void showNumber( double ); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_curve_fitter.cpp0000664000175000017500000002407113203343610016344 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_curve_fitter.h" #include "qwt_math.h" #include "qwt_spline.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif //! Constructor QwtCurveFitter::QwtCurveFitter() { } //! Destructor QwtCurveFitter::~QwtCurveFitter() { } class QwtSplineCurveFitter::PrivateData { public: PrivateData(): fitMode( QwtSplineCurveFitter::Auto ), splineSize( 250 ) { } QwtSpline spline; QwtSplineCurveFitter::FitMode fitMode; int splineSize; }; //! Constructor QwtSplineCurveFitter::QwtSplineCurveFitter() { d_data = new PrivateData; } //! Destructor QwtSplineCurveFitter::~QwtSplineCurveFitter() { delete d_data; } /*! Select the algorithm used for building the spline \param mode Mode representing a spline algorithm \sa fitMode() */ void QwtSplineCurveFitter::setFitMode( FitMode mode ) { d_data->fitMode = mode; } /*! \return Mode representing a spline algorithm \sa setFitMode() */ QwtSplineCurveFitter::FitMode QwtSplineCurveFitter::fitMode() const { return d_data->fitMode; } /*! Assign a spline \param spline Spline \sa spline() */ void QwtSplineCurveFitter::setSpline( const QwtSpline &spline ) { d_data->spline = spline; d_data->spline.reset(); } /*! \return Spline \sa setSpline() */ const QwtSpline &QwtSplineCurveFitter::spline() const { return d_data->spline; } /*! \return Spline \sa setSpline() */ QwtSpline &QwtSplineCurveFitter::spline() { return d_data->spline; } /*! Assign a spline size ( has to be at least 10 points ) \param splineSize Spline size \sa splineSize() */ void QwtSplineCurveFitter::setSplineSize( int splineSize ) { d_data->splineSize = qMax( splineSize, 10 ); } /*! \return Spline size \sa setSplineSize() */ int QwtSplineCurveFitter::splineSize() const { return d_data->splineSize; } /*! Find a curve which has the best fit to a series of data points \param points Series of data points \return Curve points */ QPolygonF QwtSplineCurveFitter::fitCurve( const QPolygonF &points ) const { const int size = points.size(); if ( size <= 2 ) return points; FitMode fitMode = d_data->fitMode; if ( fitMode == Auto ) { fitMode = Spline; const QPointF *p = points.data(); for ( int i = 1; i < size; i++ ) { if ( p[i].x() <= p[i-1].x() ) { fitMode = ParametricSpline; break; } }; } if ( fitMode == ParametricSpline ) return fitParametric( points ); else return fitSpline( points ); } QPolygonF QwtSplineCurveFitter::fitSpline( const QPolygonF &points ) const { d_data->spline.setPoints( points ); if ( !d_data->spline.isValid() ) return points; QPolygonF fittedPoints( d_data->splineSize ); const double x1 = points[0].x(); const double x2 = points[int( points.size() - 1 )].x(); const double dx = x2 - x1; const double delta = dx / ( d_data->splineSize - 1 ); for ( int i = 0; i < d_data->splineSize; i++ ) { QPointF &p = fittedPoints[i]; const double v = x1 + i * delta; const double sv = d_data->spline.value( v ); p.setX( v ); p.setY( sv ); } d_data->spline.reset(); return fittedPoints; } QPolygonF QwtSplineCurveFitter::fitParametric( const QPolygonF &points ) const { int i; const int size = points.size(); QPolygonF fittedPoints( d_data->splineSize ); QPolygonF splinePointsX( size ); QPolygonF splinePointsY( size ); const QPointF *p = points.data(); QPointF *spX = splinePointsX.data(); QPointF *spY = splinePointsY.data(); double param = 0.0; for ( i = 0; i < size; i++ ) { const double x = p[i].x(); const double y = p[i].y(); if ( i > 0 ) { const double delta = qSqrt( qwtSqr( x - spX[i-1].y() ) + qwtSqr( y - spY[i-1].y() ) ); param += qMax( delta, 1.0 ); } spX[i].setX( param ); spX[i].setY( x ); spY[i].setX( param ); spY[i].setY( y ); } d_data->spline.setPoints( splinePointsX ); if ( !d_data->spline.isValid() ) return points; const double deltaX = splinePointsX[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaX; fittedPoints[i].setX( d_data->spline.value( dtmp ) ); } d_data->spline.setPoints( splinePointsY ); if ( !d_data->spline.isValid() ) return points; const double deltaY = splinePointsY[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaY; fittedPoints[i].setY( d_data->spline.value( dtmp ) ); } return fittedPoints; } class QwtWeedingCurveFitter::PrivateData { public: PrivateData(): tolerance( 1.0 ), chunkSize( 0 ) { } double tolerance; uint chunkSize; }; class QwtWeedingCurveFitter::Line { public: Line( int i1 = 0, int i2 = 0 ): from( i1 ), to( i2 ) { } int from; int to; }; /*! Constructor \param tolerance Tolerance \sa setTolerance(), tolerance() */ QwtWeedingCurveFitter::QwtWeedingCurveFitter( double tolerance ) { d_data = new PrivateData; setTolerance( tolerance ); } //! Destructor QwtWeedingCurveFitter::~QwtWeedingCurveFitter() { delete d_data; } /*! Assign the tolerance The tolerance is the maximum distance, that is acceptable between the original curve and the smoothed curve. Increasing the tolerance will reduce the number of the resulting points. \param tolerance Tolerance \sa tolerance() */ void QwtWeedingCurveFitter::setTolerance( double tolerance ) { d_data->tolerance = qMax( tolerance, 0.0 ); } /*! \return Tolerance \sa setTolerance() */ double QwtWeedingCurveFitter::tolerance() const { return d_data->tolerance; } /*! Limit the number of points passed to a run of the algorithm The runtime of the Douglas Peucker algorithm increases non linear with the number of points. For a chunk size > 0 the polygon is split into pieces passed to the algorithm one by one. \param numPoints Maximum for the number of points passed to the algorithm \sa chunkSize() */ void QwtWeedingCurveFitter::setChunkSize( uint numPoints ) { if ( numPoints > 0 ) numPoints = qMax( numPoints, 3U ); d_data->chunkSize = numPoints; } /*! \return Maximum for the number of points passed to a run of the algorithm - or 0, when unlimited \sa setChunkSize() */ uint QwtWeedingCurveFitter::chunkSize() const { return d_data->chunkSize; } /*! \param points Series of data points \return Curve points */ QPolygonF QwtWeedingCurveFitter::fitCurve( const QPolygonF &points ) const { QPolygonF fittedPoints; if ( d_data->chunkSize == 0 ) { fittedPoints = simplify( points ); } else { for ( int i = 0; i < points.size(); i += d_data->chunkSize ) { const QPolygonF p = points.mid( i, d_data->chunkSize ); fittedPoints += simplify( p ); } } return fittedPoints; } QPolygonF QwtWeedingCurveFitter::simplify( const QPolygonF &points ) const { const double toleranceSqr = d_data->tolerance * d_data->tolerance; QStack stack; stack.reserve( 500 ); const QPointF *p = points.data(); const int nPoints = points.size(); QVector usePoint( nPoints, false ); stack.push( Line( 0, nPoints - 1 ) ); while ( !stack.isEmpty() ) { const Line r = stack.pop(); // initialize line segment const double vecX = p[r.to].x() - p[r.from].x(); const double vecY = p[r.to].y() - p[r.from].y(); const double vecLength = qSqrt( vecX * vecX + vecY * vecY ); const double unitVecX = ( vecLength != 0.0 ) ? vecX / vecLength : 0.0; const double unitVecY = ( vecLength != 0.0 ) ? vecY / vecLength : 0.0; double maxDistSqr = 0.0; int nVertexIndexMaxDistance = r.from + 1; for ( int i = r.from + 1; i < r.to; i++ ) { //compare to anchor const double fromVecX = p[i].x() - p[r.from].x(); const double fromVecY = p[i].y() - p[r.from].y(); double distToSegmentSqr; if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegmentSqr = fromVecX * fromVecX + fromVecY * fromVecY; } else { const double toVecX = p[i].x() - p[r.to].x(); const double toVecY = p[i].y() - p[r.to].y(); const double toVecLength = toVecX * toVecX + toVecY * toVecY; const double s = toVecX * ( -unitVecX ) + toVecY * ( -unitVecY ); if ( s < 0.0 ) { distToSegmentSqr = toVecLength; } else { distToSegmentSqr = qFabs( toVecLength - s * s ); } } if ( maxDistSqr < distToSegmentSqr ) { maxDistSqr = distToSegmentSqr; nVertexIndexMaxDistance = i; } } if ( maxDistSqr <= toleranceSqr ) { usePoint[r.from] = true; usePoint[r.to] = true; } else { stack.push( Line( r.from, nVertexIndexMaxDistance ) ); stack.push( Line( nVertexIndexMaxDistance, r.to ) ); } } QPolygonF stripped; for ( int i = 0; i < nPoints; i++ ) { if ( usePoint[i] ) stripped += p[i]; } return stripped; } qsstv_9.2.6/qwt/qwt_curve_fitter.h0000664000175000017500000000727013203343610016013 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CURVE_FITTER_H #define QWT_CURVE_FITTER_H #include "qwt_global.h" #include #include class QwtSpline; /*! \brief Abstract base class for a curve fitter */ class QWT_EXPORT QwtCurveFitter { public: virtual ~QwtCurveFitter(); /*! Find a curve which has the best fit to a series of data points \param polygon Series of data points \return Curve points */ virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0; protected: QwtCurveFitter(); private: QwtCurveFitter( const QwtCurveFitter & ); QwtCurveFitter &operator=( const QwtCurveFitter & ); }; /*! \brief A curve fitter using cubic splines */ class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter { public: /*! Spline type The default setting is Auto \sa setFitMode(), FitMode() */ enum FitMode { /*! Use the default spline algorithm for polygons with increasing x values ( p[i-1] < p[i] ), otherwise use a parametric spline algorithm. */ Auto, //! Use a default spline algorithm Spline, //! Use a parametric spline algorithm ParametricSpline }; QwtSplineCurveFitter(); virtual ~QwtSplineCurveFitter(); void setFitMode( FitMode ); FitMode fitMode() const; void setSpline( const QwtSpline& ); const QwtSpline &spline() const; QwtSpline &spline(); void setSplineSize( int size ); int splineSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: QPolygonF fitSpline( const QPolygonF & ) const; QPolygonF fitParametric( const QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; /*! \brief A curve fitter implementing Douglas and Peucker algorithm The purpose of the Douglas and Peucker algorithm is that given a 'curve' composed of line segments to find a curve not too dissimilar but that has fewer points. The algorithm defines 'too dissimilar' based on the maximum distance (tolerance) between the original curve and the smoothed curve. The runtime of the algorithm increases non linear ( worst case O( n*n ) ) and might be very slow for huge polygons. To avoid performance issues it might be useful to split the polygon ( setChunkSize() ) and to run the algorithm for these smaller parts. The disadvantage of having no interpolation at the borders is for most use cases irrelevant. The smoothed curve consists of a subset of the points that defined the original curve. In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces the number of points. By adjusting the tolerance parameter according to the axis scales QwtSplineCurveFitter can be used to implement different level of details to speed up painting of curves of many points. */ class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter { public: QwtWeedingCurveFitter( double tolerance = 1.0 ); virtual ~QwtWeedingCurveFitter(); void setTolerance( double ); double tolerance() const; void setChunkSize( uint ); uint chunkSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: virtual QPolygonF simplify( const QPolygonF & ) const; class Line; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_date.cpp0000664000175000017500000003737613203343610014574 0ustar jomajoma#include "qwt_date.h" #include #include #include #include #include #if QT_VERSION >= 0x050000 typedef qint64 QwtJulianDay; static const QwtJulianDay minJulianDayD = Q_INT64_C( -784350574879 ); static const QwtJulianDay maxJulianDayD = Q_INT64_C( 784354017364 ); #else // QDate stores the Julian day as unsigned int, but // but it is QDate::fromJulianDay( int ). That's why // we have the range [ 1, INT_MAX ] typedef int QwtJulianDay; static const QwtJulianDay minJulianDayD = 1; static const QwtJulianDay maxJulianDayD = std::numeric_limits::max(); #endif static inline Qt::DayOfWeek qwtFirstDayOfWeek() { #if QT_VERSION >= 0x040800 return QLocale().firstDayOfWeek(); #else switch( QLocale().country() ) { case QLocale::Maldives: return Qt::Friday; case QLocale::Afghanistan: case QLocale::Algeria: case QLocale::Bahrain: case QLocale::Djibouti: case QLocale::Egypt: case QLocale::Eritrea: case QLocale::Ethiopia: case QLocale::Iran: case QLocale::Iraq: case QLocale::Jordan: case QLocale::Kenya: case QLocale::Kuwait: case QLocale::LibyanArabJamahiriya: case QLocale::Morocco: case QLocale::Oman: case QLocale::Qatar: case QLocale::SaudiArabia: case QLocale::Somalia: case QLocale::Sudan: case QLocale::Tunisia: case QLocale::Yemen: return Qt::Saturday; case QLocale::AmericanSamoa: case QLocale::Argentina: case QLocale::Azerbaijan: case QLocale::Botswana: case QLocale::Canada: case QLocale::China: case QLocale::FaroeIslands: case QLocale::Georgia: case QLocale::Greenland: case QLocale::Guam: case QLocale::HongKong: case QLocale::Iceland: case QLocale::India: case QLocale::Ireland: case QLocale::Israel: case QLocale::Jamaica: case QLocale::Japan: case QLocale::Kyrgyzstan: case QLocale::Lao: case QLocale::Malta: case QLocale::MarshallIslands: case QLocale::Macau: case QLocale::Mongolia: case QLocale::NewZealand: case QLocale::NorthernMarianaIslands: case QLocale::Pakistan: case QLocale::Philippines: case QLocale::RepublicOfKorea: case QLocale::Singapore: case QLocale::SyrianArabRepublic: case QLocale::Taiwan: case QLocale::Thailand: case QLocale::TrinidadAndTobago: case QLocale::UnitedStates: case QLocale::UnitedStatesMinorOutlyingIslands: case QLocale::USVirginIslands: case QLocale::Uzbekistan: case QLocale::Zimbabwe: return Qt::Sunday; default: return Qt::Monday; } #endif } static inline void qwtFloorTime( QwtDate::IntervalType intervalType, QDateTime &dt ) { // when dt is inside the special hour where DST is ending // an hour is no unique. Therefore we have to // use UTC time. const Qt::TimeSpec timeSpec = dt.timeSpec(); if ( timeSpec == Qt::LocalTime ) dt = dt.toTimeSpec( Qt::UTC ); const QTime t = dt.time(); switch( intervalType ) { case QwtDate::Second: { dt.setTime( QTime( t.hour(), t.minute(), t.second() ) ); break; } case QwtDate::Minute: { dt.setTime( QTime( t.hour(), t.minute(), 0 ) ); break; } case QwtDate::Hour: { dt.setTime( QTime( t.hour(), 0, 0 ) ); break; } default: break; } if ( timeSpec == Qt::LocalTime ) dt = dt.toTimeSpec( Qt::LocalTime ); } static inline QDateTime qwtToTimeSpec( const QDateTime &dt, Qt::TimeSpec spec ) { if ( dt.timeSpec() == spec ) return dt; const qint64 jd = dt.date().toJulianDay(); if ( jd < 0 || jd >= INT_MAX ) { // the conversion between local time and UTC // is internally limited. To avoid // overflows we simply ignore the difference // for those dates QDateTime dt2 = dt; dt2.setTimeSpec( spec ); return dt2; } return dt.toTimeSpec( spec ); } static inline double qwtToJulianDay( int year, int month, int day ) { // code from QDate but using doubles to avoid overflows // for large values const int m1 = ( month - 14 ) / 12; const int m2 = ( 367 * ( month - 2 - 12 * m1 ) ) / 12; const double y1 = ::floor( ( 4900.0 + year + m1 ) / 100 ); return ::floor( ( 1461.0 * ( year + 4800 + m1 ) ) / 4 ) + m2 - ::floor( ( 3 * y1 ) / 4 ) + day - 32075; } static inline qint64 qwtFloorDiv64( qint64 a, int b ) { if ( a < 0 ) a -= b - 1; return a / b; } static inline qint64 qwtFloorDiv( int a, int b ) { if ( a < 0 ) a -= b - 1; return a / b; } static inline QDate qwtToDate( int year, int month = 1, int day = 1 ) { #if QT_VERSION >= 0x050000 return QDate( year, month, day ); #else if ( year > 100000 ) { // code from QDate but using doubles to avoid overflows // for large values const int m1 = ( month - 14 ) / 12; const int m2 = ( 367 * ( month - 2 - 12 * m1 ) ) / 12; const double y1 = ::floor( ( 4900.0 + year + m1 ) / 100 ); const double jd = ::floor( ( 1461.0 * ( year + 4800 + m1 ) ) / 4 ) + m2 - ::floor( ( 3 * y1 ) / 4 ) + day - 32075; if ( jd > maxJulianDayD ) { qWarning() << "qwtToDate: overflow"; return QDate(); } return QDate::fromJulianDay( static_cast( jd ) ); } else { return QDate( year, month, day ); } #endif } /*! Translate from double to QDateTime \param value Number of milliseconds since the epoch, 1970-01-01T00:00:00 UTC \param timeSpec Time specification \return Datetime value \sa toDouble(), QDateTime::setMSecsSinceEpoch() \note The return datetime for Qt::OffsetFromUTC will be Qt::UTC */ QDateTime QwtDate::toDateTime( double value, Qt::TimeSpec timeSpec ) { const int msecsPerDay = 86400000; const double days = static_cast( ::floor( value / msecsPerDay ) ); const double jd = QwtDate::JulianDayForEpoch + days; if ( ( jd > maxJulianDayD ) || ( jd < minJulianDayD ) ) { qWarning() << "QwtDate::toDateTime: overflow"; return QDateTime(); } const QDate d = QDate::fromJulianDay( static_cast( jd ) ); const int msecs = static_cast( value - days * msecsPerDay ); static const QTime timeNull( 0, 0, 0, 0 ); QDateTime dt( d, timeNull.addMSecs( msecs ), Qt::UTC ); if ( timeSpec == Qt::LocalTime ) dt = qwtToTimeSpec( dt, timeSpec ); return dt; } /*! Translate from QDateTime to double \param dateTime Datetime value \return Number of milliseconds since 1970-01-01T00:00:00 UTC has passed. \sa toDateTime(), QDateTime::toMSecsSinceEpoch() \warning For values very far below or above 1970-01-01 UTC rounding errors will happen due to the limited significance of a double. */ double QwtDate::toDouble( const QDateTime &dateTime ) { const int msecsPerDay = 86400000; const QDateTime dt = qwtToTimeSpec( dateTime, Qt::UTC ); const double days = dt.date().toJulianDay() - QwtDate::JulianDayForEpoch; const QTime time = dt.time(); const double secs = 3600.0 * time.hour() + 60.0 * time.minute() + time.second(); return days * msecsPerDay + time.msec() + 1000.0 * secs; } /*! Ceil a datetime according the interval type \param dateTime Datetime value \param intervalType Interval type, how to ceil. F.e. when intervalType = QwtDate::Months, the result will be ceiled to the next beginning of a month \return Ceiled datetime \sa floor() */ QDateTime QwtDate::ceil( const QDateTime &dateTime, IntervalType intervalType ) { if ( dateTime.date() >= QwtDate::maxDate() ) return dateTime; QDateTime dt = dateTime; switch ( intervalType ) { case QwtDate::Millisecond: { break; } case QwtDate::Second: { qwtFloorTime( QwtDate::Second, dt ); if ( dt < dateTime ) dt.addSecs( 1 ); break; } case QwtDate::Minute: { qwtFloorTime( QwtDate::Minute, dt ); if ( dt < dateTime ) dt.addSecs( 60 ); break; } case QwtDate::Hour: { qwtFloorTime( QwtDate::Hour, dt ); if ( dt < dateTime ) dt.addSecs( 3600 ); break; } case QwtDate::Day: { dt.setTime( QTime( 0, 0 ) ); if ( dt < dateTime ) dt = dt.addDays( 1 ); break; } case QwtDate::Week: { dt.setTime( QTime( 0, 0 ) ); if ( dt < dateTime ) dt = dt.addDays( 1 ); int days = qwtFirstDayOfWeek() - dt.date().dayOfWeek(); if ( days < 0 ) days += 7; dt = dt.addDays( days ); break; } case QwtDate::Month: { dt.setTime( QTime( 0, 0 ) ); dt.setDate( qwtToDate( dateTime.date().year(), dateTime.date().month() ) ); if ( dt < dateTime ) dt.addMonths( 1 ); break; } case QwtDate::Year: { dt.setTime( QTime( 0, 0 ) ); const QDate d = dateTime.date(); int year = d.year(); if ( d.month() > 1 || d.day() > 1 || !dateTime.time().isNull() ) year++; if ( year == 0 ) year++; // there is no year 0 dt.setDate( qwtToDate( year ) ); break; } } return dt; } /*! Floor a datetime according the interval type \param dateTime Datetime value \param intervalType Interval type, how to ceil. F.e. when intervalType = QwtDate::Months, the result will be ceiled to the next beginning of a month \return Floored datetime \sa floor() */ QDateTime QwtDate::floor( const QDateTime &dateTime, IntervalType intervalType ) { if ( dateTime.date() <= QwtDate::minDate() ) return dateTime; QDateTime dt = dateTime; switch ( intervalType ) { case QwtDate::Millisecond: { break; } case QwtDate::Second: case QwtDate::Minute: case QwtDate::Hour: { qwtFloorTime( intervalType, dt ); break; } case QwtDate::Day: { dt.setTime( QTime( 0, 0 ) ); break; } case QwtDate::Week: { dt.setTime( QTime( 0, 0 ) ); int days = dt.date().dayOfWeek() - qwtFirstDayOfWeek(); if ( days < 0 ) days += 7; dt = dt.addDays( -days ); break; } case QwtDate::Month: { dt.setTime( QTime( 0, 0 ) ); const QDate date = qwtToDate( dt.date().year(), dt.date().month() ); dt.setDate( date ); break; } case QwtDate::Year: { dt.setTime( QTime( 0, 0 ) ); const QDate date = qwtToDate( dt.date().year() ); dt.setDate( date ); break; } } return dt; } /*! Minimum for the supported date range The range of valid dates depends on how QDate stores the Julian day internally. - For Qt4 it is "Tue Jan 2 -4713" - For Qt5 it is "Thu Jan 1 -2147483648" \return minimum of the date range \sa maxDate() */ QDate QwtDate::minDate() { static QDate date; if ( !date.isValid() ) date = QDate::fromJulianDay( minJulianDayD ); return date; } /*! Maximum for the supported date range The range of valid dates depends on how QDate stores the Julian day internally. - For Qt4 it is "Tue Jun 3 5874898" - For Qt5 it is "Tue Dec 31 2147483647" \return maximum of the date range \sa minDate() \note The maximum differs between Qt4 and Qt5 */ QDate QwtDate::maxDate() { static QDate date; if ( !date.isValid() ) date = QDate::fromJulianDay( maxJulianDayD ); return date; } /*! \brief Date of the first day of the first week for a year The first day of a week depends on the current locale ( QLocale::firstDayOfWeek() ). \param year Year \param type Option how to identify the first week \return First day of week 0 \sa QLocale::firstDayOfWeek(), weekNumber() */ QDate QwtDate::dateOfWeek0( int year, Week0Type type ) { const Qt::DayOfWeek firstDayOfWeek = qwtFirstDayOfWeek(); QDate dt0( year, 1, 1 ); // floor to the first day of the week int days = dt0.dayOfWeek() - firstDayOfWeek; if ( days < 0 ) days += 7; dt0 = dt0.addDays( -days ); if ( type == QwtDate::FirstThursday ) { // according to ISO 8601 the first week is defined // by the first thursday. int d = Qt::Thursday - firstDayOfWeek; if ( d < 0 ) d += 7; if ( dt0.addDays( d ).year() < year ) dt0 = dt0.addDays( 7 ); } return dt0; } /*! Find the week number of a date - QwtDate::FirstThursday\n Corresponding to ISO 8601 ( see QDate::weekNumber() ). - QwtDate::FirstDay\n Number of weeks that have begun since dateOfWeek0(). \param date Date \param type Option how to identify the first week \return Week number, starting with 1 */ int QwtDate::weekNumber( const QDate &date, Week0Type type ) { int weekNo; if ( type == QwtDate::FirstDay ) { const QDate day0 = dateOfWeek0( date.year(), type ); weekNo = day0.daysTo( date ) / 7 + 1; } else { weekNo = date.weekNumber(); } return weekNo; } /*! Offset in seconds from Coordinated Universal Time The offset depends on the time specification of dateTime: - Qt::UTC 0, dateTime has no offset - Qt::OffsetFromUTC returns dateTime.utcOffset() - Qt::LocalTime: number of seconds from the UTC For Qt::LocalTime the offset depends on the timezone and daylight savings. \param dateTime Datetime value \return Offset in seconds */ int QwtDate::utcOffset( const QDateTime &dateTime ) { int seconds = 0; switch( dateTime.timeSpec() ) { case Qt::UTC: { break; } case Qt::OffsetFromUTC: { seconds = dateTime.utcOffset(); } default: { const QDateTime dt1( dateTime.date(), dateTime.time(), Qt::UTC ); seconds = dateTime.secsTo( dt1 ); } } return seconds; } /*! Translate a datetime into a string Beside the format expressions documented in QDateTime::toString() the following expressions are supported: - w\n week number: ( 1 - 53 ) - ww\n week number with a leading zero ( 01 - 53 ) \param dateTime Datetime value \param format Format string \param week0Type Specification of week 0 \return Datetime string \sa QDateTime::toString(), weekNumber(), QwtDateScaleDraw */ QString QwtDate::toString( const QDateTime &dateTime, const QString & format, Week0Type week0Type ) { QString weekNo; weekNo.setNum( QwtDate::weekNumber( dateTime.date(), week0Type ) ); QString weekNoWW; if ( weekNo.length() == 1 ) weekNoWW += "0"; weekNoWW += weekNo; QString fmt = format; fmt.replace( "ww", weekNoWW ); fmt.replace( "w", weekNo ); return dateTime.toString( fmt ); } qsstv_9.2.6/qwt/qwt_date.h0000664000175000017500000000673213203343610014231 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef _QWT_DATE_H_ #define _QWT_DATE_H_ #include "qwt_global.h" #include /*! \brief A collection of methods around date/time values Qt offers convenient classes for dealing with date/time values, but Qwt uses coordinate systems that are based on doubles. QwtDate offers methods to translate from QDateTime to double and v.v. A double is interpreted as the number of milliseconds since 1970-01-01T00:00:00 Universal Coordinated Time - also known as "The Epoch". While the range of the Julian day in Qt4 is limited to [0, MAX_INT], Qt5 stores it as qint64 offering a huge range of valid dates. As the significance of a double is below this ( assuming a fraction of 52 bits ) the translation is not bijective with rounding errors for dates very far from Epoch. For a resolution of 1 ms those start to happen for dates above the year 144683. An axis for a date/time interval is expected to be aligned and divided in time/date units like seconds, minutes, ... QwtDate offers several algorithms that are needed to calculate these axes. \sa QwtDateScaleEngine, QwtDateScaleDraw, QDate, QTime */ class QWT_EXPORT QwtDate { public: /*! How to identify the first week of year differs between countries. */ enum Week0Type { /*! According to ISO 8601 the first week of a year is defined as "the week with the year's first Thursday in it". FirstThursday corresponds to the numbering that is implemented in QDate::weekNumber(). */ FirstThursday, /*! "The week with January 1.1 in it." In the U.S. this definition is more common than FirstThursday. */ FirstDay }; /*! Classification of an time interval Time intervals needs to be classified to decide how to align and divide it. */ enum IntervalType { //! The interval is related to milliseconds Millisecond, //! The interval is related to seconds Second, //! The interval is related to minutes Minute, //! The interval is related to hours Hour, //! The interval is related to days Day, //! The interval is related to weeks Week, //! The interval is related to months Month, //! The interval is related to years Year }; enum { //! The Julian day of "The Epoch" JulianDayForEpoch = 2440588 }; static QDate minDate(); static QDate maxDate(); static QDateTime toDateTime( double value, Qt::TimeSpec = Qt::UTC ); static double toDouble( const QDateTime & ); static QDateTime ceil( const QDateTime &, IntervalType ); static QDateTime floor( const QDateTime &, IntervalType ); static QDate dateOfWeek0( int year, Week0Type ); static int weekNumber( const QDate &, Week0Type ); static int utcOffset( const QDateTime & ); static QString toString( const QDateTime &, const QString & format, Week0Type ); }; #endif qsstv_9.2.6/qwt/qwt_date_scale_draw.cpp0000664000175000017500000001517413203343610016750 0ustar jomajoma#include "qwt_date_scale_draw.h" class QwtDateScaleDraw::PrivateData { public: PrivateData( Qt::TimeSpec spec ): timeSpec( spec ), utcOffset( 0 ), week0Type( QwtDate::FirstThursday ) { dateFormats[ QwtDate::Millisecond ] = "hh:mm:ss:zzz\nddd dd MMM yyyy"; dateFormats[ QwtDate::Second ] = "hh:mm:ss\nddd dd MMM yyyy"; dateFormats[ QwtDate::Minute ] = "hh:mm\nddd dd MMM yyyy"; dateFormats[ QwtDate::Hour ] = "hh:mm\nddd dd MMM yyyy"; dateFormats[ QwtDate::Day ] = "ddd dd MMM yyyy"; dateFormats[ QwtDate::Week ] = "Www yyyy"; dateFormats[ QwtDate::Month ] = "MMM yyyy"; dateFormats[ QwtDate::Year ] = "yyyy"; } Qt::TimeSpec timeSpec; int utcOffset; QwtDate::Week0Type week0Type; QString dateFormats[ QwtDate::Year + 1 ]; }; /*! \brief Constructor The default setting is to display tick labels for the given time specification. The first week of a year is defined like for QwtDate::FirstThursday. \param timeSpec Time specification \sa setTimeSpec(), setWeek0Type() */ QwtDateScaleDraw::QwtDateScaleDraw( Qt::TimeSpec timeSpec ) { d_data = new PrivateData( timeSpec ); } //! Destructor QwtDateScaleDraw::~QwtDateScaleDraw() { delete d_data; } /*! Set the time specification used for the tick labels \param timeSpec Time specification \sa timeSpec(), setUtcOffset(), toDateTime() */ void QwtDateScaleDraw::setTimeSpec( Qt::TimeSpec timeSpec ) { d_data->timeSpec = timeSpec; } /*! \return Time specification used for the tick labels \sa setTimeSpec(), utcOffset(), toDateTime() */ Qt::TimeSpec QwtDateScaleDraw::timeSpec() const { return d_data->timeSpec; } /*! Set the offset in seconds from Coordinated Universal Time \param seconds Offset in seconds \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::utcOffset(), setTimeSpec(), toDateTime() */ void QwtDateScaleDraw::setUtcOffset( int seconds ) { d_data->utcOffset = seconds; } /*! \return Offset in seconds from Coordinated Universal Time \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::setUtcOffset(), setTimeSpec(), toDateTime() */ int QwtDateScaleDraw::utcOffset() const { return d_data->utcOffset; } /*! Sets how to identify the first week of a year. \param week0Type Mode how to identify the first week of a year \sa week0Type(). \note week0Type has no effect beside for intervals classified as QwtDate::Week. */ void QwtDateScaleDraw::setWeek0Type( QwtDate::Week0Type week0Type ) { d_data->week0Type = week0Type; } /*! \return Setting how to identify the first week of a year. \sa setWeek0Type() */ QwtDate::Week0Type QwtDateScaleDraw::week0Type() const { return d_data->week0Type; } /*! Set the default format string for an datetime interval type \param intervalType Interval type \param format Default format string \sa dateFormat(), dateFormatOfDate(), QwtDate::toString() */ void QwtDateScaleDraw::setDateFormat( QwtDate::IntervalType intervalType, const QString &format ) { if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { d_data->dateFormats[ intervalType ] = format; } } /*! \param intervalType Interval type \return Default format string for an datetime interval type \sa setDateFormat(), dateFormatOfDate() */ QString QwtDateScaleDraw::dateFormat( QwtDate::IntervalType intervalType ) const { if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { return d_data->dateFormats[ intervalType ]; } return QString::null; } /*! Format string for the representation of a datetime dateFormatOfDate() is intended to be overloaded for situations, where formats are individual for specific datetime values. The default setting ignores dateTime and return the default format for the interval type. \param dateTime Datetime value \param intervalType Interval type \return Format string \sa setDateFormat(), QwtDate::toString() */ QString QwtDateScaleDraw::dateFormatOfDate( const QDateTime &dateTime, QwtDate::IntervalType intervalType ) const { Q_UNUSED( dateTime ) if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { return d_data->dateFormats[ intervalType ]; } return d_data->dateFormats[ QwtDate::Second ]; } /*! \brief Convert a value into its representing label The value is converted to a datetime value using toDateTime() and converted to a plain text using QwtDate::toString(). \param value Value \return Label string. \sa dateFormatOfDate() */ QwtText QwtDateScaleDraw::label( double value ) const { const QDateTime dt = toDateTime( value ); const QString fmt = dateFormatOfDate( dt, intervalType( scaleDiv() ) ); return QwtDate::toString( dt, fmt, d_data->week0Type ); } /*! Find the less detailed datetime unit, where no rounding errors happen. \param scaleDiv Scale division \return Interval type \sa dateFormatOfDate() */ QwtDate::IntervalType QwtDateScaleDraw::intervalType( const QwtScaleDiv &scaleDiv ) const { int intvType = QwtDate::Year; bool alignedToWeeks = true; const QList ticks = scaleDiv.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.size(); i++ ) { const QDateTime dt = toDateTime( ticks[i] ); for ( int j = QwtDate::Second; j <= intvType; j++ ) { const QDateTime dt0 = QwtDate::floor( dt, static_cast( j ) ); if ( dt0 != dt ) { if ( j == QwtDate::Week ) { alignedToWeeks = false; } else { intvType = j - 1; break; } } } if ( intvType == QwtDate::Millisecond ) break; } if ( intvType == QwtDate::Week && !alignedToWeeks ) intvType = QwtDate::Day; return static_cast( intvType ); } /*! Translate a double value into a QDateTime object. \return QDateTime object initialized with timeSpec() and utcOffset(). \sa timeSpec(), utcOffset(), QwtDate::toDateTime() */ QDateTime QwtDateScaleDraw::toDateTime( double value ) const { QDateTime dt = QwtDate::toDateTime( value, d_data->timeSpec ); if ( d_data->timeSpec == Qt::OffsetFromUTC ) { dt = dt.addSecs( d_data->utcOffset ); dt.setUtcOffset( d_data->utcOffset ); } return dt; } qsstv_9.2.6/qwt/qwt_date_scale_draw.h0000664000175000017500000000343613203343610016413 0ustar jomajoma#ifndef _QWT_DATE_SCALE_DRAW_H_ #define _QWT_DATE_SCALE_DRAW_H_ 1 #include "qwt_global.h" #include "qwt_scale_draw.h" #include "qwt_date.h" /*! \brief A class for drawing datetime scales QwtDateScaleDraw displays values as datetime labels. The format of the labels depends on the alignment of the major tick labels. The default format strings are: - Millisecond\n "hh:mm:ss:zzz\nddd dd MMM yyyy" - Second\n "hh:mm:ss\nddd dd MMM yyyy" - Minute\n "hh:mm\nddd dd MMM yyyy" - Hour\n "hh:mm\nddd dd MMM yyyy" - Day\n "ddd dd MMM yyyy" - Week\n "Www yyyy" - Month\n "MMM yyyy" - Year\n "yyyy" The format strings can be modified using setDateFormat() or individually for each tick label by overloading dateFormatOfDate(), Usually QwtDateScaleDraw is used in combination with QwtDateScaleEngine, that calculates scales for datetime intervals. \sa QwtDateScaleEngine, QwtPlot::setAxisScaleDraw() */ class QWT_EXPORT QwtDateScaleDraw: public QwtScaleDraw { public: QwtDateScaleDraw( Qt::TimeSpec = Qt::LocalTime ); virtual ~QwtDateScaleDraw(); void setDateFormat( QwtDate::IntervalType, const QString & ); QString dateFormat( QwtDate::IntervalType ) const; void setTimeSpec( Qt::TimeSpec ); Qt::TimeSpec timeSpec() const; void setUtcOffset( int seconds ); int utcOffset() const; void setWeek0Type( QwtDate::Week0Type ); QwtDate::Week0Type week0Type() const; virtual QwtText label( double ) const; QDateTime toDateTime( double ) const; protected: virtual QwtDate::IntervalType intervalType( const QwtScaleDiv & ) const; virtual QString dateFormatOfDate( const QDateTime &, QwtDate::IntervalType ) const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_date_scale_engine.cpp0000664000175000017500000010251413203343610017253 0ustar jomajoma#include "qwt_date_scale_engine.h" #include "qwt_math.h" #include "qwt_transform.h" #include #include static inline double qwtMsecsForType( QwtDate::IntervalType type ) { static const double msecs[] = { 1.0, 1000.0, 60.0 * 1000.0, 3600.0 * 1000.0, 24.0 * 3600.0 * 1000.0, 7.0 * 24.0 * 3600.0 * 1000.0, 30.0 * 24.0 * 3600.0 * 1000.0, 365.0 * 24.0 * 3600.0 * 1000.0, }; if ( type < 0 || type >= static_cast( sizeof( msecs ) / sizeof( msecs[0] ) ) ) return 1.0; return msecs[ type ]; } static inline int qwtAlignValue( double value, double stepSize, bool up ) { double d = value / stepSize; d = up ? ::ceil( d ) : ::floor( d ); return static_cast( d * stepSize ); } static double qwtIntervalWidth( const QDateTime &minDate, const QDateTime &maxDate, QwtDate::IntervalType intervalType ) { switch( intervalType ) { case QwtDate::Millisecond: { const double secsTo = minDate.secsTo( maxDate ); const double msecs = maxDate.time().msec() - minDate.time().msec(); return secsTo * 1000 + msecs; } case QwtDate::Second: { return minDate.secsTo( maxDate ); } case QwtDate::Minute: { const double secsTo = minDate.secsTo( maxDate ); return ::floor( secsTo / 60 ); } case QwtDate::Hour: { const double secsTo = minDate.secsTo( maxDate ); return ::floor( secsTo / 3600 ); } case QwtDate::Day: { return minDate.daysTo( maxDate ); } case QwtDate::Week: { return ::floor( minDate.daysTo( maxDate ) / 7.0 ); } case QwtDate::Month: { const double years = double( maxDate.date().year() ) - minDate.date().year(); int months = maxDate.date().month() - minDate.date().month(); if ( maxDate.date().day() < minDate.date().day() ) months--; return years * 12 + months; } case QwtDate::Year: { double years = double( maxDate.date().year() ) - minDate.date().year(); if ( maxDate.date().month() < minDate.date().month() ) years -= 1.0; return years; } } return 0.0; } static double qwtRoundedIntervalWidth( const QDateTime &minDate, const QDateTime &maxDate, QwtDate::IntervalType intervalType ) { const QDateTime minD = QwtDate::floor( minDate, intervalType ); const QDateTime maxD = QwtDate::ceil( maxDate, intervalType ); return qwtIntervalWidth( minD, maxD, intervalType ); } static inline int qwtStepCount( int intervalSize, int maxSteps, const int limits[], size_t numLimits ) { for ( uint i = 0; i < numLimits; i++ ) { const int numSteps = intervalSize / limits[ i ]; if ( numSteps > 1 && numSteps <= maxSteps && numSteps * limits[ i ] == intervalSize ) { return numSteps; } } return 0; } static int qwtStepSize( int intervalSize, int maxSteps, uint base ) { if ( maxSteps <= 0 ) return 0; if ( maxSteps > 2 ) { for ( int numSteps = maxSteps; numSteps > 1; numSteps-- ) { const double stepSize = double( intervalSize ) / numSteps; const double p = ::floor( ::log( stepSize ) / ::log( double( base ) ) ); const double fraction = qPow( base, p ); for ( uint n = base; n >= 1; n /= 2 ) { if ( qFuzzyCompare( stepSize, n * fraction ) ) return qRound( stepSize ); if ( n == 3 && ( base % 2 ) == 0 ) { if ( qFuzzyCompare( stepSize, 2 * fraction ) ) return qRound( stepSize ); } } } } return 0; } static int qwtDivideInterval( double intervalSize, int numSteps, const int limits[], size_t numLimits ) { const int v = qCeil( intervalSize / double( numSteps ) ); for ( uint i = 0; i < numLimits - 1; i++ ) { if ( v <= limits[i] ) return limits[i]; } return limits[ numLimits - 1 ]; } static double qwtDivideScale( double intervalSize, int numSteps, QwtDate::IntervalType intervalType ) { if ( intervalType != QwtDate::Day ) { if ( ( intervalSize > numSteps ) && ( intervalSize <= 2 * numSteps ) ) { return 2.0; } } double stepSize; switch( intervalType ) { case QwtDate::Second: case QwtDate::Minute: { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Hour: { static int limits[] = { 1, 2, 3, 4, 6, 12, 24 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Day: { const double v = intervalSize / double( numSteps ); if ( v <= 5.0 ) stepSize = qCeil( v ); else stepSize = qCeil( v / 7 ) * 7; break; } case QwtDate::Week: { static int limits[] = { 1, 2, 4, 8, 12, 26, 52 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Month: { static int limits[] = { 1, 2, 3, 4, 6, 12 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Year: case QwtDate::Millisecond: default: { stepSize = QwtScaleArithmetic::divideInterval( intervalSize, numSteps, 10 ); } } return stepSize; } static double qwtDivideMajorStep( double stepSize, int maxMinSteps, QwtDate::IntervalType intervalType ) { double minStepSize = 0.0; switch( intervalType ) { case QwtDate::Second: { minStepSize = qwtStepSize( stepSize, maxMinSteps, 10 ); if ( minStepSize == 0.0 ) minStepSize = 0.5 * stepSize; break; } case QwtDate::Minute: { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; int numSteps; if ( stepSize > maxMinSteps ) { numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { numSteps = qwtStepCount( stepSize * 60, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Hour: { int numSteps = 0; if ( stepSize > maxMinSteps ) { static int limits[] = { 1, 2, 3, 4, 6, 12, 24, 48, 72 }; numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; numSteps = qwtStepCount( stepSize * 60, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Day: { int numSteps = 0; if ( stepSize > maxMinSteps ) { static int limits[] = { 1, 2, 3, 7, 14, 28 }; numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { static int limits[] = { 1, 2, 3, 4, 6, 12, 24, 48, 72 }; numSteps = qwtStepCount( stepSize * 24, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Week: { const int daysInStep = stepSize * 7; if ( maxMinSteps >= daysInStep ) { // we want to have one tick per day minStepSize = 1.0 / 7.0; } else { // when the stepSize is more than a week we want to // have a tick for each week const int stepSizeInWeeks = stepSize; if ( stepSizeInWeeks <= maxMinSteps ) { minStepSize = 1; } else { minStepSize = QwtScaleArithmetic::divideInterval( stepSizeInWeeks, maxMinSteps, 10 ); } } break; } case QwtDate::Month: { // fractions of months doesn't make any sense if ( stepSize < maxMinSteps ) maxMinSteps = static_cast( stepSize ); static int limits[] = { 1, 2, 3, 4, 6, 12 }; int numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Year: { if ( stepSize >= maxMinSteps ) { minStepSize = QwtScaleArithmetic::divideInterval( stepSize, maxMinSteps, 10 ); } else { // something in months static int limits[] = { 1, 2, 3, 4, 6, 12 }; int numSteps = qwtStepCount( 12 * stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; } break; } default: break; } if ( intervalType != QwtDate::Month && minStepSize == 0.0 ) { minStepSize = 0.5 * stepSize; } return minStepSize; } static QList qwtDstTicks( const QDateTime &dateTime, int secondsMajor, int secondsMinor ) { if ( secondsMinor <= 0 ) QList(); QDateTime minDate = dateTime.addSecs( -secondsMajor ); minDate = QwtDate::floor( minDate, QwtDate::Hour ); const double utcOffset = QwtDate::utcOffset( dateTime ); // find the hours where daylight saving time happens double dstMin = QwtDate::toDouble( minDate ); while ( minDate < dateTime && QwtDate::utcOffset( minDate ) != utcOffset ) { minDate = minDate.addSecs( 3600 ); dstMin += 3600 * 1000.0; } QList ticks; for ( int i = 0; i < 3600; i += secondsMinor ) ticks += dstMin + i * 1000.0; return ticks; } static QwtScaleDiv qwtDivideToSeconds( const QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps, QwtDate::IntervalType intervalType ) { // calculate the min step size double minStepSize = 0; if ( maxMinSteps > 1 ) { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, intervalType ); } bool daylightSaving = false; if ( minDate.timeSpec() == Qt::LocalTime ) { daylightSaving = intervalType > QwtDate::Hour; if ( intervalType == QwtDate::Hour ) { daylightSaving = stepSize > 1; } } const double s = qwtMsecsForType( intervalType ) / 1000; const int secondsMajor = static_cast( stepSize * s ); const double secondsMinor = minStepSize * s; // UTC excludes daylight savings. So from the difference // of a date and its UTC counterpart we can find out // the daylight saving hours const double utcOffset = QwtDate::utcOffset( minDate ); double dstOff = 0; QList majorTicks; QList mediumTicks; QList minorTicks; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addSecs( secondsMajor ) ) { if ( !dt.isValid() ) break; double majorValue = QwtDate::toDouble( dt ); if ( daylightSaving ) { const double offset = utcOffset - QwtDate::utcOffset( dt ); majorValue += offset * 1000.0; if ( offset > dstOff ) { // we add some minor ticks for the DST hour, // otherwise the ticks will be unaligned: 0, 2, 3, 5 ... minorTicks += qwtDstTicks( dt, secondsMajor, qRound( secondsMinor ) ); } dstOff = offset; } if ( majorTicks.isEmpty() || majorTicks.last() != majorValue ) majorTicks += majorValue; if ( secondsMinor > 0.0 ) { const int numMinorSteps = qFloor( secondsMajor / secondsMinor ); for ( int i = 1; i < numMinorSteps; i++ ) { const QDateTime mt = dt.addMSecs( qRound64( i * secondsMinor * 1000 ) ); double minorValue = QwtDate::toDouble( mt ); if ( daylightSaving ) { const double offset = utcOffset - QwtDate::utcOffset( mt ); minorValue += offset * 1000.0; } if ( minorTicks.isEmpty() || minorTicks.last() != minorValue ) { const bool isMedium = ( numMinorSteps % 2 == 0 ) && ( i != 1 ) && ( i == numMinorSteps / 2 ); if ( isMedium ) mediumTicks += minorValue; else minorTicks += minorValue; } } } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } static QwtScaleDiv qwtDivideToMonths( QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps ) { // months are intervals with non // equidistant ( in ms ) steps: we have to build the // scale division manually int minStepDays = 0; int minStepSize = 0.0; if ( maxMinSteps > 1 ) { if ( stepSize == 1 ) { if ( maxMinSteps >= 30 ) minStepDays = 1; else if ( maxMinSteps >= 6 ) minStepDays = 5; else if ( maxMinSteps >= 3 ) minStepDays = 10; minStepDays = 15; } else { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, QwtDate::Month ); } } QList majorTicks; QList mediumTicks; QList minorTicks; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addMonths( stepSize ) ) { if ( !dt.isValid() ) break; majorTicks += QwtDate::toDouble( dt ); if ( minStepDays > 0 ) { for ( int days = minStepDays; days < 30; days += minStepDays ) { const double tick = QwtDate::toDouble( dt.addDays( days ) ); if ( days == 15 && minStepDays != 15 ) mediumTicks += tick; else minorTicks += tick; } } else if ( minStepSize > 0.0 ) { const int numMinorSteps = qRound( stepSize / (double) minStepSize ); for ( int i = 1; i < numMinorSteps; i++ ) { const double minorValue = QwtDate::toDouble( dt.addMonths( i * minStepSize ) ); if ( ( numMinorSteps % 2 == 0 ) && ( i == numMinorSteps / 2 ) ) mediumTicks += minorValue; else minorTicks += minorValue; } } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } static QwtScaleDiv qwtDivideToYears( const QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps ) { QList majorTicks; QList mediumTicks; QList minorTicks; double minStepSize = 0.0; if ( maxMinSteps > 1 ) { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, QwtDate::Year ); } int numMinorSteps = 0; if ( minStepSize > 0.0 ) numMinorSteps = qFloor( stepSize / minStepSize ); bool dateBC = minDate.date().year() < -1; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addYears( stepSize ) ) { if ( dateBC && dt.date().year() > 1 ) { // there is no year 0 in the Julian calendar dt = dt.addYears( -1 ); dateBC = false; } if ( !dt.isValid() ) break; majorTicks += QwtDate::toDouble( dt ); for ( int i = 1; i < numMinorSteps; i++ ) { QDateTime tickDate; const double years = qRound( i * minStepSize ); if ( years >= INT_MAX / 12 ) { tickDate = dt.addYears( years ); } else { tickDate = dt.addMonths( qRound( years * 12 ) ); } const bool isMedium = ( numMinorSteps > 2 ) && ( numMinorSteps % 2 == 0 ) && ( i == numMinorSteps / 2 ); const double minorValue = QwtDate::toDouble( tickDate ); if ( isMedium ) mediumTicks += minorValue; else minorTicks += minorValue; } if ( QwtDate::maxDate().addYears( -stepSize ) < dt.date() ) { break; } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } class QwtDateScaleEngine::PrivateData { public: PrivateData( Qt::TimeSpec spec ): timeSpec( spec ), utcOffset( 0 ), week0Type( QwtDate::FirstThursday ), maxWeeks( 4 ) { } Qt::TimeSpec timeSpec; int utcOffset; QwtDate::Week0Type week0Type; int maxWeeks; }; /*! \brief Constructor The engine is initialized to build scales for the given time specification. It classifies intervals > 4 weeks as >= Qt::Month. The first week of a year is defined like for QwtDate::FirstThursday. \param timeSpec Time specification \sa setTimeSpec(), setMaxWeeks(), setWeek0Type() */ QwtDateScaleEngine::QwtDateScaleEngine( Qt::TimeSpec timeSpec ): QwtLinearScaleEngine( 10 ) { d_data = new PrivateData( timeSpec ); } //! Destructor QwtDateScaleEngine::~QwtDateScaleEngine() { delete d_data; } /*! Set the time specification used by the engine \param timeSpec Time specification \sa timeSpec(), setUtcOffset(), toDateTime() */ void QwtDateScaleEngine::setTimeSpec( Qt::TimeSpec timeSpec ) { d_data->timeSpec = timeSpec; } /*! \return Time specification used by the engine \sa setTimeSpec(), utcOffset(), toDateTime() */ Qt::TimeSpec QwtDateScaleEngine::timeSpec() const { return d_data->timeSpec; } /*! Set the offset in seconds from Coordinated Universal Time \param seconds Offset in seconds \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::utcOffset(), setTimeSpec(), toDateTime() */ void QwtDateScaleEngine::setUtcOffset( int seconds ) { d_data->utcOffset = seconds; } /*! \return Offset in seconds from Coordinated Universal Time \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::setUtcOffset(), setTimeSpec(), toDateTime() */ int QwtDateScaleEngine::utcOffset() const { return d_data->utcOffset; } /*! Sets how to identify the first week of a year. \param week0Type Mode how to identify the first week of a year \sa week0Type(), setMaxWeeks() \note week0Type has no effect beside for intervals classified as QwtDate::Week. */ void QwtDateScaleEngine::setWeek0Type( QwtDate::Week0Type week0Type ) { d_data->week0Type = week0Type; } /*! \return Setting how to identify the first week of a year. \sa setWeek0Type(), maxWeeks() */ QwtDate::Week0Type QwtDateScaleEngine::week0Type() const { return d_data->week0Type; } /*! Set a upper limit for the number of weeks, when an interval can be classified as Qt::Week. The default setting is 4 weeks. \param weeks Upper limit for the number of weeks \note In business charts a year is often devided into weeks [1-52] \sa maxWeeks(), setWeek0Type() */ void QwtDateScaleEngine::setMaxWeeks( int weeks ) { d_data->maxWeeks = qMax( weeks, 0 ); } /*! \return Upper limit for the number of weeks, when an interval can be classified as Qt::Week. \sa setMaxWeeks(), week0Type() */ int QwtDateScaleEngine::maxWeeks() const { return d_data->maxWeeks; } /*! Classification of a date/time interval division \param minDate Minimum ( = earlier ) of the interval \param maxDate Maximum ( = later ) of the interval \param maxSteps Maximum for the number of steps \return Interval classification */ QwtDate::IntervalType QwtDateScaleEngine::intervalType( const QDateTime &minDate, const QDateTime &maxDate, int maxSteps ) const { const double jdMin = minDate.date().toJulianDay(); const double jdMax = maxDate.date().toJulianDay(); if ( ( jdMax - jdMin ) / 365 > maxSteps ) return QwtDate::Year; const int months = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Month ); if ( months > maxSteps * 6 ) return QwtDate::Year; const int days = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Day ); const int weeks = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Week ); if ( weeks > d_data->maxWeeks ) { if ( days > 4 * maxSteps * 7 ) return QwtDate::Month; } if ( days > maxSteps * 7 ) return QwtDate::Week; const int hours = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Hour ); if ( hours > maxSteps * 24 ) return QwtDate::Day; const int seconds = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Second ); if ( seconds >= maxSteps * 3600 ) return QwtDate::Hour; if ( seconds >= maxSteps * 60 ) return QwtDate::Minute; if ( seconds >= maxSteps ) return QwtDate::Second; return QwtDate::Millisecond; } /*! Align and divide an interval The algorithm aligns and divides the interval into steps. Datetime interval divisions are usually not equidistant and the calculated stepSize is can only be used as an approximation for the steps calculated by divideScale(). \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtDateScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { stepSize = 0.0; QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); const QDateTime from = toDateTime( interval.minValue() ); const QDateTime to = toDateTime( interval.maxValue() ); if ( from.isValid() && to.isValid() ) { if ( maxNumSteps < 1 ) maxNumSteps = 1; const QwtDate::IntervalType intvType = intervalType( from, to, maxNumSteps ); double width = qwtIntervalWidth( from, to, intvType ); width = QwtScaleArithmetic::divideInterval( width, maxNumSteps, 10 ); if ( width != 0.0 && !testAttribute( QwtScaleEngine::Floating ) ) { const QDateTime d1 = alignDate( from, width, intvType, false ); const QDateTime d2 = alignDate( to, width, intvType, true ); interval.setMinValue( QwtDate::toDouble( d1 ) ); interval.setMaxValue( QwtDate::toDouble( d2 ) ); } stepSize = width * qwtMsecsForType( intvType ); } x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for a date/time interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \return Calculated scale division */ QwtScaleDiv QwtDateScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; const double min = qMin( x1, x2 ); const double max = qMax( x1, x2 ); const QDateTime from = toDateTime( min ); const QDateTime to = toDateTime( max ); if ( from == to ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize > 0.0 ) { // as interval types above hours are not equidistant // ( even days might have 23/25 hours because of daylight saving ) // the stepSize is used as a hint only maxMajorSteps = qCeil( ( max - min ) / stepSize ); } const QwtDate::IntervalType intvType = intervalType( from, to, maxMajorSteps ); QwtScaleDiv scaleDiv; if ( intvType == QwtDate::Millisecond ) { // for milliseconds and below we can use the decimal system scaleDiv = QwtLinearScaleEngine::divideScale( min, max, maxMajorSteps, maxMinorSteps, stepSize ); } else { const QDateTime minDate = QwtDate::floor( from, intvType ); const QDateTime maxDate = QwtDate::ceil( to, intvType ); scaleDiv = buildScaleDiv( minDate, maxDate, maxMajorSteps, maxMinorSteps, intvType ); // scaleDiv has been calculated from an extended interval // adjusted to the step size. We have to shrink it again. scaleDiv = scaleDiv.bounded( min, max ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } QwtScaleDiv QwtDateScaleEngine::buildScaleDiv( const QDateTime &minDate, const QDateTime &maxDate, int maxMajorSteps, int maxMinorSteps, QwtDate::IntervalType intervalType ) const { // calculate the step size const double stepSize = qwtDivideScale( qwtIntervalWidth( minDate, maxDate, intervalType ), maxMajorSteps, intervalType ); // align minDate to the step size QDateTime dt0 = alignDate( minDate, stepSize, intervalType, false ); if ( !dt0.isValid() ) { // the floored date is out of the range of a // QDateTime - we ceil instead. dt0 = alignDate( minDate, stepSize, intervalType, true ); } QwtScaleDiv scaleDiv; if ( intervalType <= QwtDate::Week ) { scaleDiv = qwtDivideToSeconds( dt0, maxDate, stepSize, maxMinorSteps, intervalType ); } else { if( intervalType == QwtDate::Month ) { scaleDiv = qwtDivideToMonths( dt0, maxDate, stepSize, maxMinorSteps ); } else if ( intervalType == QwtDate::Year ) { scaleDiv = qwtDivideToYears( dt0, maxDate, stepSize, maxMinorSteps ); } } return scaleDiv; } /*! Align a date/time value for a step size For Qt::Day alignments there is no "natural day 0" - instead the first day of the year is used to avoid jumping major ticks positions when panning a scale. For other alignments ( f.e according to the first day of the month ) alignDate() has to be overloaded. \param dateTime Date/time value \param stepSize Step size \param intervalType Interval type \param up When true dateTime is ceiled - otherwise it is floored \return Aligned date/time value */ QDateTime QwtDateScaleEngine::alignDate( const QDateTime &dateTime, double stepSize, QwtDate::IntervalType intervalType, bool up ) const { // what about: (year == 1582 && month == 10 && day > 4 && day < 15) ?? QDateTime dt = dateTime; if ( dateTime.timeSpec() == Qt::OffsetFromUTC ) { dt.setUtcOffset( 0 ); } switch( intervalType ) { case QwtDate::Millisecond: { const int ms = qwtAlignValue( dt.time().msec(), stepSize, up ) ; dt = QwtDate::floor( dateTime, QwtDate::Second ); dt = dt.addMSecs( ms ); break; } case QwtDate::Second: { const int s = qwtAlignValue( dt.time().second(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Minute ); dt = dt.addSecs( s ); break; } case QwtDate::Minute: { const int m = qwtAlignValue( dt.time().minute(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Hour ); dt = dt.addSecs( m * 60 ); break; } case QwtDate::Hour: { const int h = qwtAlignValue( dt.time().hour(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Day ); dt = dt.addSecs( h * 3600 ); break; } case QwtDate::Day: { // What date do we expect f.e. from an alignment of 5 days ?? // Aligning them to the beginning of the year avoids at least // jumping major ticks when panning const int d = qwtAlignValue( dt.date().dayOfYear(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Year ); dt = dt.addDays( d - 1 ); break; } case QwtDate::Week: { const QDate date = QwtDate::dateOfWeek0( dt.date().year(), d_data->week0Type ); const int numWeeks = date.daysTo( dt.date() ) / 7; const int d = qwtAlignValue( numWeeks, stepSize, up ) * 7; dt = QwtDate::floor( dt, QwtDate::Day ); dt.setDate( date ); dt = dt.addDays( d ); break; } case QwtDate::Month: { const int m = qwtAlignValue( dt.date().month() - 1, stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Year ); dt = dt.addMonths( m ); break; } case QwtDate::Year: { const int y = qwtAlignValue( dateTime.date().year(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Day ); if ( y == 0 ) { // there is no year 0 in the Julian calendar dt.setDate( QDate( stepSize, 1, 1 ).addYears( -stepSize ) ); } else { dt.setDate( QDate( y, 1, 1 ) ); } break; } } if ( dateTime.timeSpec() == Qt::OffsetFromUTC ) { dt.setUtcOffset( dateTime.utcOffset() ); } return dt; } /*! Translate a double value into a QDateTime object. For QDateTime result is bounded by QwtDate::minDate() and QwtDate::maxDate() \return QDateTime object initialized with timeSpec() and utcOffset(). \sa timeSpec(), utcOffset(), QwtDate::toDateTime() */ QDateTime QwtDateScaleEngine::toDateTime( double value ) const { QDateTime dt = QwtDate::toDateTime( value, d_data->timeSpec ); if ( !dt.isValid() ) { const QDate date = ( value <= 0.0 ) ? QwtDate::minDate() : QwtDate::maxDate(); dt = QDateTime( date, QTime( 0, 0 ), d_data->timeSpec ); } if ( d_data->timeSpec == Qt::OffsetFromUTC ) { dt = dt.addSecs( d_data->utcOffset ); dt.setUtcOffset( d_data->utcOffset ); } return dt; } qsstv_9.2.6/qwt/qwt_date_scale_engine.h0000664000175000017500000000435713203343610016726 0ustar jomajoma#ifndef _QWT_DATE_SCALE_ENGINE_H_ #define _QWT_DATE_SCALE_ENGINE_H_ 1 #include "qwt_date.h" #include "qwt_scale_engine.h" /*! \brief A scale engine for date/time values QwtDateScaleEngine builds scales from a time intervals. Together with QwtDateScaleDraw it can be used for axes according to date/time values. Years, months, weeks, days, hours and minutes are organized in steps with non constant intervals. QwtDateScaleEngine classifies intervals and aligns the boundaries and tick positions according to this classification. QwtDateScaleEngine supports representations depending on Qt::TimeSpec specifications. The valid range for scales is limited by the range of QDateTime, that differs between Qt4 and Qt5. Datetime values are expected as the number of milliseconds since 1970-01-01T00:00:00 Universal Coordinated Time - also known as "The Epoch", that can be converted to QDateTime using QwtDate::toDateTime(). \sa QwtDate, QwtPlot::setAxisScaleEngine(), QwtAbstractScale::setScaleEngine() */ class QWT_EXPORT QwtDateScaleEngine: public QwtLinearScaleEngine { public: QwtDateScaleEngine( Qt::TimeSpec = Qt::LocalTime ); virtual ~QwtDateScaleEngine(); void setTimeSpec( Qt::TimeSpec ); Qt::TimeSpec timeSpec() const; void setUtcOffset( int seconds ); int utcOffset() const; void setWeek0Type( QwtDate::Week0Type ); QwtDate::Week0Type week0Type() const; void setMaxWeeks( int ); int maxWeeks() const; virtual void autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize = 0.0 ) const; virtual QwtDate::IntervalType intervalType( const QDateTime &, const QDateTime &, int maxSteps ) const; QDateTime toDateTime( double ) const; protected: virtual QDateTime alignDate( const QDateTime &, double stepSize, QwtDate::IntervalType, bool up ) const; private: QwtScaleDiv buildScaleDiv( const QDateTime &, const QDateTime &, int maxMajorSteps, int maxMinorSteps, QwtDate::IntervalType ) const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_dial.cpp0000664000175000017500000004577313203343610014570 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial.h" #include "qwt_dial_needle.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_map.h" #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include #include static inline double qwtAngleDist( double a1, double a2 ) { double dist = qAbs( a2 - a1 ); if ( dist > 360.0 ) dist -= 360.0; return dist; } static inline bool qwtIsOnArc( double angle, double min, double max ) { if ( min < max ) { return ( angle >= min ) && ( angle <= max ); } else { return ( angle >= min ) || ( angle <= max ); } } static inline double qwtBoundedAngle( double min, double angle, double max ) { double from = qwtNormalizeDegrees( min ); double to = qwtNormalizeDegrees( max ); double a; if ( qwtIsOnArc( angle, from, to ) ) { a = angle; if ( a < min ) a += 360.0; } else { if ( qwtAngleDist( angle, from ) < qwtAngleDist( angle, to ) ) { a = min; } else { a = max; } } return a; } class QwtDial::PrivateData { public: PrivateData(): frameShadow( Sunken ), lineWidth( 0 ), mode( RotateNeedle ), origin( 90.0 ), minScaleArc( 0.0 ), maxScaleArc( 0.0 ), needle( NULL ), arcOffset( 0.0 ), mouseOffset( 0.0 ) { } ~PrivateData() { delete needle; } Shadow frameShadow; int lineWidth; QwtDial::Mode mode; double origin; double minScaleArc; double maxScaleArc; double scalePenWidth; QwtDialNeedle *needle; double arcOffset; double mouseOffset; QPixmap pixmapCache; }; /*! \brief Constructor \param parent Parent widget Create a dial widget with no needle. The scale is initialized to [ 0.0, 360.0 ] and 360 steps ( QwtAbstractSlider::setTotalSteps() ). The origin of the scale is at 90°, The value is set to 0.0. The default mode is QwtDial::RotateNeedle. */ QwtDial::QwtDial( QWidget* parent ): QwtAbstractSlider( parent ) { d_data = new PrivateData; setFocusPolicy( Qt::TabFocus ); QPalette p = palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) { const QPalette::ColorGroup colorGroup = static_cast( i ); // Base: background color of the circle inside the frame. // WindowText: background color of the circle inside the scale p.setColor( colorGroup, QPalette::WindowText, p.color( colorGroup, QPalette::Base ) ); } setPalette( p ); QwtRoundScaleDraw* scaleDraw = new QwtRoundScaleDraw(); scaleDraw->setRadius( 0 ); setScaleDraw( scaleDraw ); setScaleArc( 0.0, 360.0 ); // scale as a full circle setScaleMaxMajor( 10 ); setScaleMaxMinor( 5 ); setValue( 0.0 ); } //! Destructor QwtDial::~QwtDial() { delete d_data; } /*! Sets the frame shadow value from the frame style. \param shadow Frame shadow \sa setLineWidth(), QFrame::setFrameShadow() */ void QwtDial::setFrameShadow( Shadow shadow ) { if ( shadow != d_data->frameShadow ) { invalidateCache(); d_data->frameShadow = shadow; if ( lineWidth() > 0 ) update(); } } /*! \return Frame shadow /sa setFrameShadow(), lineWidth(), QFrame::frameShadow() */ QwtDial::Shadow QwtDial::frameShadow() const { return d_data->frameShadow; } /*! Sets the line width of the frame \param lineWidth Line width \sa setFrameShadow() */ void QwtDial::setLineWidth( int lineWidth ) { if ( lineWidth < 0 ) lineWidth = 0; if ( d_data->lineWidth != lineWidth ) { invalidateCache(); d_data->lineWidth = lineWidth; update(); } } /*! \return Line width of the frame \sa setLineWidth(), frameShadow(), lineWidth() */ int QwtDial::lineWidth() const { return d_data->lineWidth; } /*! \return bounding rectangle of the circle inside the frame \sa setLineWidth(), scaleInnerRect(), boundingRect() */ QRect QwtDial::innerRect() const { const int lw = lineWidth(); return boundingRect().adjusted( lw, lw, -lw, -lw ); } /*! \return bounding rectangle of the dial including the frame \sa setLineWidth(), scaleInnerRect(), innerRect() */ QRect QwtDial::boundingRect() const { const QRect cr = contentsRect(); const double dim = qMin( cr.width(), cr.height() ); QRect inner( 0, 0, dim, dim ); inner.moveCenter( cr.center() ); return inner; } /*! \return rectangle inside the scale \sa setLineWidth(), boundingRect(), innerRect() */ QRect QwtDial::scaleInnerRect() const { QRect rect = innerRect(); const QwtAbstractScaleDraw *sd = scaleDraw(); if ( sd ) { int scaleDist = qCeil( sd->extent( font() ) ); scaleDist++; // margin rect.adjust( scaleDist, scaleDist, -scaleDist, -scaleDist ); } return rect; } /*! \brief Change the mode of the dial. \param mode New mode In case of QwtDial::RotateNeedle the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa mode(), setValue(), setOrigin() */ void QwtDial::setMode( Mode mode ) { if ( mode != d_data->mode ) { invalidateCache(); d_data->mode = mode; sliderChange(); } } /*! \return Mode of the dial. \sa setMode(), origin(), setScaleArc(), value() */ QwtDial::Mode QwtDial::mode() const { return d_data->mode; } /*! Invalidate the internal caches used to speed up repainting */ void QwtDial::invalidateCache() { d_data->pixmapCache = QPixmap(); } /*! Paint the dial \param event Paint event */ void QwtDial::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); if ( d_data->mode == QwtDial::RotateScale ) { painter.save(); painter.setRenderHint( QPainter::Antialiasing, true ); drawContents( &painter ); painter.restore(); } const QRect r = contentsRect(); if ( r.size() != d_data->pixmapCache.size() ) { d_data->pixmapCache = QwtPainter::backingStore( this, r.size() ); d_data->pixmapCache.fill( Qt::transparent ); QPainter p( &d_data->pixmapCache ); p.setRenderHint( QPainter::Antialiasing, true ); p.translate( -r.topLeft() ); if ( d_data->mode != QwtDial::RotateScale ) drawContents( &p ); if ( lineWidth() > 0 ) drawFrame( &p ); if ( d_data->mode != QwtDial::RotateNeedle ) drawNeedle( &p ); } painter.drawPixmap( r.topLeft(), d_data->pixmapCache ); if ( d_data->mode == QwtDial::RotateNeedle ) drawNeedle( &painter ); if ( hasFocus() ) drawFocusIndicator( &painter ); } /*! Draw the focus indicator \param painter Painter */ void QwtDial::drawFocusIndicator( QPainter *painter ) const { QwtPainter::drawFocusRect( painter, this, boundingRect() ); } /*! Draw the frame around the dial \param painter Painter \sa lineWidth(), frameShadow() */ void QwtDial::drawFrame( QPainter *painter ) { QwtPainter::drawRoundFrame( painter, boundingRect(), palette(), lineWidth(), d_data->frameShadow ); } /*! \brief Draw the contents inside the frame QPalette::Window is the background color outside of the frame. QPalette::Base is the background color inside the frame. QPalette::WindowText is the background color inside the scale. \param painter Painter \sa boundingRect(), innerRect(), scaleInnerRect(), QWidget::setPalette() */ void QwtDial::drawContents( QPainter *painter ) const { if ( testAttribute( Qt::WA_NoSystemBackground ) || palette().brush( QPalette::Base ) != palette().brush( QPalette::Window ) ) { const QRectF br = boundingRect(); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::Base ) ); painter->drawEllipse( br ); painter->restore(); } const QRectF insideScaleRect = scaleInnerRect(); if ( palette().brush( QPalette::WindowText ) != palette().brush( QPalette::Base ) ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::WindowText ) ); painter->drawEllipse( insideScaleRect ); painter->restore(); } const QPointF center = insideScaleRect.center(); const double radius = 0.5 * insideScaleRect.width(); painter->save(); drawScale( painter, center, radius ); painter->restore(); painter->save(); drawScaleContents( painter, center, radius ); painter->restore(); } /*! Draw the needle \param painter Painter \param center Center of the dial \param radius Length for the needle \param direction Direction of the needle in degrees, counter clockwise \param colorGroup ColorGroup */ void QwtDial::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_data->needle ) { direction = 360.0 - direction; // counter clockwise d_data->needle->draw( painter, center, radius, direction, colorGroup ); } } void QwtDial::drawNeedle( QPainter *painter ) const { if ( !isValid() ) return; QPalette::ColorGroup colorGroup; if ( isEnabled() ) colorGroup = hasFocus() ? QPalette::Active : QPalette::Inactive; else colorGroup = QPalette::Disabled; const QRectF sr = scaleInnerRect(); painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); drawNeedle( painter, sr.center(), 0.5 * sr.width(), transform( value() ) + 270.0, colorGroup ); painter->restore(); } /*! Draw the scale \param painter Painter \param center Center of the dial \param radius Radius of the scale */ void QwtDial::drawScale( QPainter *painter, const QPointF ¢er, double radius ) const { QwtRoundScaleDraw *sd = const_cast( scaleDraw() ); if ( sd == NULL ) return; sd->setRadius( radius ); sd->moveCenter( center ); QPalette pal = palette(); const QColor textColor = pal.color( QPalette::Text ); pal.setColor( QPalette::WindowText, textColor ); // ticks, backbone painter->setFont( font() ); painter->setPen( QPen( textColor, sd->penWidth() ) ); painter->setBrush( Qt::red ); sd->draw( painter, pal ); } /*! Draw the contents inside the scale Paints nothing. \param painter Painter \param center Center of the contents circle \param radius Radius of the contents circle */ void QwtDial::drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const { Q_UNUSED(painter); Q_UNUSED(center); Q_UNUSED(radius); } /*! Set a needle for the dial \param needle Needle \warning The needle will be deleted, when a different needle is set or in ~QwtDial() */ void QwtDial::setNeedle( QwtDialNeedle *needle ) { if ( needle != d_data->needle ) { if ( d_data->needle ) delete d_data->needle; d_data->needle = needle; update(); } } /*! \return needle \sa setNeedle() */ const QwtDialNeedle *QwtDial::needle() const { return d_data->needle; } /*! \return needle \sa setNeedle() */ QwtDialNeedle *QwtDial::needle() { return d_data->needle; } //! \return the scale draw QwtRoundScaleDraw *QwtDial::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! \return the scale draw const QwtRoundScaleDraw *QwtDial::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! Set an individual scale draw The motivation for setting a scale draw is often to overload QwtRoundScaleDraw::label() to return individual tick labels. \param scaleDraw Scale draw \warning The previous scale draw is deleted */ void QwtDial::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); sliderChange(); } /*! Change the arc of the scale \param minArc Lower limit \param maxArc Upper limit \sa minScaleArc(), maxScaleArc() */ void QwtDial::setScaleArc( double minArc, double maxArc ) { if ( minArc != 360.0 && minArc != -360.0 ) minArc = ::fmod( minArc, 360.0 ); if ( maxArc != 360.0 && maxArc != -360.0 ) maxArc = ::fmod( maxArc, 360.0 ); double minScaleArc = qMin( minArc, maxArc ); double maxScaleArc = qMax( minArc, maxArc ); if ( maxScaleArc - minScaleArc > 360.0 ) maxScaleArc = minScaleArc + 360.0; if ( ( minScaleArc != d_data->minScaleArc ) || ( maxScaleArc != d_data->maxScaleArc ) ) { d_data->minScaleArc = minScaleArc; d_data->maxScaleArc = maxScaleArc; invalidateCache(); sliderChange(); } } /*! Set the lower limit for the scale arc \param min Lower limit of the scale arc \sa setScaleArc(), setMaxScaleArc() */ void QwtDial::setMinScaleArc( double min ) { setScaleArc( min, d_data->maxScaleArc ); } /*! \return Lower limit of the scale arc \sa setScaleArc() */ double QwtDial::minScaleArc() const { return d_data->minScaleArc; } /*! Set the upper limit for the scale arc \param max Upper limit of the scale arc \sa setScaleArc(), setMinScaleArc() */ void QwtDial::setMaxScaleArc( double max ) { setScaleArc( d_data->minScaleArc, max ); } /*! \return Upper limit of the scale arc \sa setScaleArc() */ double QwtDial::maxScaleArc() const { return d_data->maxScaleArc; } /*! \brief Change the origin The origin is the angle where scale and needle is relative to. \param origin New origin \sa origin() */ void QwtDial::setOrigin( double origin ) { invalidateCache(); d_data->origin = origin; sliderChange(); } /*! The origin is the angle where scale and needle is relative to. \return Origin of the dial \sa setOrigin() */ double QwtDial::origin() const { return d_data->origin; } /*! \return Size hint \sa minimumSizeHint() */ QSize QwtDial::sizeHint() const { int sh = 0; if ( scaleDraw() ) sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 6 * sh + 2 * lineWidth(); QSize hint( d, d ); if ( !isReadOnly() ) hint = hint.expandedTo( QApplication::globalStrut() ); return hint; } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtDial::minimumSizeHint() const { int sh = 0; if ( scaleDraw() ) sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 3 * sh + 2 * lineWidth(); return QSize( d, d ); } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when the inner circle contains pos \sa scrolledTo() */ bool QwtDial::isScrollPosition( const QPoint &pos ) const { const QRegion region( innerRect(), QRegion::Ellipse ); if ( region.contains( pos ) && ( pos != innerRect().center() ) ) { double angle = QLineF( rect().center(), pos ).angle(); if ( d_data->mode == QwtDial::RotateScale ) angle = 360.0 - angle; double valueAngle = qwtNormalizeDegrees( 90.0 - transform( value() ) ); d_data->mouseOffset = qwtNormalizeDegrees( angle - valueAngle ); d_data->arcOffset = scaleMap().p1(); return true; } return false; } /*! \brief Determine the value for a new position of the slider handle. \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtDial::scrolledTo( const QPoint &pos ) const { double angle = QLineF( rect().center(), pos ).angle(); if ( d_data->mode == QwtDial::RotateScale ) { angle += scaleMap().p1() - d_data->arcOffset; angle = 360.0 - angle; } angle = qwtNormalizeDegrees( angle - d_data->mouseOffset ); angle = qwtNormalizeDegrees( 90.0 - angle ); if ( scaleMap().pDist() >= 360.0 ) { if ( angle < scaleMap().p1() ) angle += 360.0; if ( !wrapping() ) { double boundedAngle = angle; const double arc = angle - transform( value() ); if ( qAbs( arc ) > 180.0 ) { boundedAngle = ( arc > 0 ) ? scaleMap().p1() : scaleMap().p2(); } d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } } else { const double boundedAngle = qwtBoundedAngle( scaleMap().p1(), angle, scaleMap().p2() ); if ( !wrapping() ) d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } return invTransform( angle ); } /*! Change Event handler \param event Change event Invalidates internal paint caches if necessary */ void QwtDial::changeEvent( QEvent *event ) { switch( event->type() ) { case QEvent::EnabledChange: case QEvent::FontChange: case QEvent::StyleChange: case QEvent::PaletteChange: case QEvent::LanguageChange: case QEvent::LocaleChange: { invalidateCache(); break; } default: break; } QwtAbstractSlider::changeEvent( event ); } /*! Wheel Event handler \param event Wheel event */ void QwtDial::wheelEvent( QWheelEvent *event ) { const QRegion region( innerRect(), QRegion::Ellipse ); if ( region.contains( event->pos() ) ) QwtAbstractSlider::wheelEvent( event ); } void QwtDial::setAngleRange( double angle, double span ) { QwtRoundScaleDraw *sd = const_cast( scaleDraw() ); if ( sd ) { angle = qwtNormalizeDegrees( angle - 270.0 ); sd->setAngleRange( angle, angle + span ); } } /*! Invalidate the internal caches and call QwtAbstractSlider::scaleChange() */ void QwtDial::scaleChange() { invalidateCache(); QwtAbstractSlider::scaleChange(); } void QwtDial::sliderChange() { setAngleRange( d_data->origin + d_data->minScaleArc, d_data->maxScaleArc - d_data->minScaleArc ); if ( mode() == RotateScale ) { const double arc = transform( value() ) - scaleMap().p1(); setAngleRange( d_data->origin - arc, d_data->maxScaleArc - d_data->minScaleArc ); } QwtAbstractSlider::sliderChange(); } qsstv_9.2.6/qwt/qwt_dial.h0000664000175000017500000001154313203343610014221 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_H #define QWT_DIAL_H 1 #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_abstract_scale_draw.h" #include #include class QwtDialNeedle; class QwtRoundScaleDraw; /*! \brief QwtDial class provides a rounded range control. QwtDial is intended as base class for dial widgets like speedometers, compass widgets, clocks ... \image html dials2.png A dial contains a scale and a needle indicating the current value of the dial. Depending on Mode one of them is fixed and the other is rotating. If not isReadOnly() the dial can be rotated by dragging the mouse or using keyboard inputs (see QwtAbstractSlider::keyPressEvent()). A dial might be wrapping, what means a rotation below/above one limit continues on the other limit (f.e compass). The scale might cover any arc of the dial, its values are related to the origin() of the dial. Often dials have to be updated very often according to values from external devices. For these high refresh rates QwtDial caches as much as possible. For derived classes it might be necessary to clear these caches manually according to attribute changes using invalidateCache(). \sa QwtCompass, QwtAnalogClock, QwtDialNeedle \note The controls and dials examples shows different types of dials. \note QDial is more similar to QwtKnob than to QwtDial */ class QWT_EXPORT QwtDial: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( Shadow Mode Direction ) Q_PROPERTY( int lineWidth READ lineWidth WRITE setLineWidth ) Q_PROPERTY( Shadow frameShadow READ frameShadow WRITE setFrameShadow ) Q_PROPERTY( Mode mode READ mode WRITE setMode ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( double minScaleArc READ minScaleArc WRITE setMinScaleArc ) Q_PROPERTY( double maxScaleArc READ maxScaleArc WRITE setMaxScaleArc ) public: /*! \brief Frame shadow Unfortunately it is not possible to use QFrame::Shadow as a property of a widget that is not derived from QFrame. The following enum is made for the designer only. It is safe to use QFrame::Shadow instead. */ enum Shadow { //! QFrame::Plain Plain = QFrame::Plain, //! QFrame::Raised Raised = QFrame::Raised, //! QFrame::Sunken Sunken = QFrame::Sunken }; //! Mode controlling whether the needle or the scale is rotating enum Mode { //! The needle is rotating RotateNeedle, //! The needle is fixed, the scales are rotating RotateScale }; explicit QwtDial( QWidget *parent = NULL ); virtual ~QwtDial(); void setFrameShadow( Shadow ); Shadow frameShadow() const; void setLineWidth( int ); int lineWidth() const; void setMode( Mode ); Mode mode() const; void setScaleArc( double min, double max ); void setMinScaleArc( double min ); double minScaleArc() const; void setMaxScaleArc( double min ); double maxScaleArc() const; virtual void setOrigin( double ); double origin() const; void setNeedle( QwtDialNeedle * ); const QwtDialNeedle *needle() const; QwtDialNeedle *needle(); QRect boundingRect() const; QRect innerRect() const; virtual QRect scaleInnerRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); QwtRoundScaleDraw *scaleDraw(); const QwtRoundScaleDraw *scaleDraw() const; protected: virtual void wheelEvent( QWheelEvent * ); virtual void paintEvent( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void drawFrame( QPainter *p ); virtual void drawContents( QPainter * ) const; virtual void drawFocusIndicator( QPainter * ) const; void invalidateCache(); virtual void drawScale( QPainter *, const QPointF ¢er, double radius ) const; virtual void drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const; virtual void drawNeedle( QPainter *, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; virtual void sliderChange(); virtual void scaleChange(); private: void setAngleRange( double angle, double span ); void drawNeedle( QPainter * ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_dial_needle.cpp0000664000175000017500000002576313203343610016101 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial_needle.h" #include "qwt_global.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #if QT_VERSION < 0x040601 #define qFastSin(x) qSin(x) #define qFastCos(x) qCos(x) #endif static void qwtDrawStyle1Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, double length ) { const double r[] = { 0.4, 0.3, 1, 0.8, 1, 0.3, 0.4 }; const double a[] = { -45, -20, -15, 0, 15, 20, 45 }; QPainterPath path; for ( int i = 0; i < 7; i++ ) { const double angle = a[i] / 180.0 * M_PI; const double radius = r[i] * length; const double x = radius * qFastCos( angle ); const double y = radius * qFastSin( angle ); path.lineTo( x, -y ); } painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Light ) ); painter->drawPath( path ); } static void qwtDrawStyle2Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, double length ) { const double ratioX = 0.7; const double ratioY = 0.3; QPainterPath path1; path1.lineTo( ratioX * length, 0.0 ); path1.lineTo( length, ratioY * length ); QPainterPath path2; path2.lineTo( ratioX * length, 0.0 ); path2.lineTo( length, -ratioY * length ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Light ) ); painter->drawPath( path1 ); painter->setBrush( palette.brush( colorGroup, QPalette::Dark ) ); painter->drawPath( path2 ); } static void qwtDrawShadedPointer( QPainter *painter, const QColor &lightColor, const QColor &darkColor, double length, double width ) { const double peak = qMax( length / 10.0, 5.0 ); const double knobWidth = width + 8; QRectF knobRect( 0, 0, knobWidth, knobWidth ); knobRect.moveCenter( QPointF(0, 0) ); QPainterPath path1; path1.lineTo( 0.0, 0.5 * width ); path1.lineTo( length - peak, 0.5 * width ); path1.lineTo( length, 0.0 ); path1.lineTo( 0.0, 0.0 ); QPainterPath arcPath1; arcPath1.arcTo( knobRect, 0.0, -90.0 ); path1 = path1.united( arcPath1 ); QPainterPath path2; path2.lineTo( 0.0, -0.5 * width ); path2.lineTo( length - peak, -0.5 * width ); path2.lineTo( length, 0.0 ); path2.lineTo( 0.0, 0.0 ); QPainterPath arcPath2; arcPath2.arcTo( knobRect, 0.0, 90.0 ); path2 = path2.united( arcPath2 ); painter->setPen( Qt::NoPen ); painter->setBrush( lightColor ); painter->drawPath( path1 ); painter->setBrush( darkColor ); painter->drawPath( path2 ); } static void qwtDrawArrowNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, double length, double width ) { if ( width <= 0 ) width = qMax( length * 0.06, 9.0 ); const double peak = qMax( 2.0, 0.4 * width ); QPainterPath path; path.moveTo( 0.0, 0.5 * width ); path.lineTo( length - peak, 0.3 * width ); path.lineTo( length, 0.0 ); path.lineTo( length - peak, -0.3 * width ); path.lineTo( 0.0, -0.5 * width ); QRectF br = path.boundingRect(); QPalette pal( palette.color( QPalette::Mid ) ); QColor c1 = pal.color( QPalette::Light ); QColor c2 = pal.color( QPalette::Dark ); QLinearGradient gradient( br.topLeft(), br.bottomLeft() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 0.5, c1 ); gradient.setColorAt( 0.5001, c2 ); gradient.setColorAt( 1.0, c2 ); QPen pen( gradient, 1 ); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) ); painter->drawPath( path ); } static void qwtDrawTriangleNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, double length ) { const double width = qRound( length / 3.0 ); QPainterPath path[4]; path[0].lineTo( length, 0.0 ); path[0].lineTo( 0.0, width / 2 ); path[1].lineTo( length, 0.0 ); path[1].lineTo( 0.0, -width / 2 ); path[2].lineTo( -length, 0.0 ); path[2].lineTo( 0.0, width / 2 ); path[3].lineTo( -length, 0.0 ); path[3].lineTo( 0.0, -width / 2 ); const int colorOffset = 10; const QColor darkColor = palette.color( colorGroup, QPalette::Dark ); const QColor lightColor = palette.color( colorGroup, QPalette::Light ); QColor color[4]; color[0] = darkColor.light( 100 + colorOffset ); color[1] = darkColor.dark( 100 + colorOffset ); color[2] = lightColor.light( 100 + colorOffset ); color[3] = lightColor.dark( 100 + colorOffset ); painter->setPen( Qt::NoPen ); for ( int i = 0; i < 4; i++ ) { painter->setBrush( color[i] ); painter->drawPath( path[i] ); } } //! Constructor QwtDialNeedle::QwtDialNeedle(): d_palette( QApplication::palette() ) { } //! Destructor QwtDialNeedle::~QwtDialNeedle() { } /*! Sets the palette for the needle. \param palette New Palette */ void QwtDialNeedle::setPalette( const QPalette &palette ) { d_palette = palette; } /*! \return the palette of the needle. */ const QPalette &QwtDialNeedle::palette() const { return d_palette; } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtDialNeedle::draw( QPainter *painter, const QPointF ¢er, double length, double direction, QPalette::ColorGroup colorGroup ) const { painter->save(); painter->translate( center ); painter->rotate( -direction ); drawNeedle( painter, length, colorGroup ); painter->restore(); } //! Draw the knob void QwtDialNeedle::drawKnob( QPainter *painter, double width, const QBrush &brush, bool sunken ) const { QPalette palette( brush.color() ); QColor c1 = palette.color( QPalette::Light ); QColor c2 = palette.color( QPalette::Dark ); if ( sunken ) qSwap( c1, c2 ); QRectF rect( 0.0, 0.0, width, width ); rect.moveCenter( painter->combinedTransform().map( QPointF() ) ); QLinearGradient gradient( rect.topLeft(), rect.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 0.3, c1 ); gradient.setColorAt( 0.7, c2 ); gradient.setColorAt( 1.0, c2 ); painter->save(); painter->resetTransform(); painter->setPen( QPen( gradient, 1 ) ); painter->setBrush( brush ); painter->drawEllipse( rect ); painter->restore(); } /*! Constructor \param style Style \param hasKnob With/Without knob \param mid Middle color \param base Base color */ QwtDialSimpleNeedle::QwtDialSimpleNeedle( Style style, bool hasKnob, const QColor &mid, const QColor &base ): d_style( style ), d_hasKnob( hasKnob ), d_width( -1 ) { QPalette palette; palette.setColor( QPalette::Mid, mid ); palette.setColor( QPalette::Base, base ); setPalette( palette ); } /*! Set the width of the needle \param width Width \sa width() */ void QwtDialSimpleNeedle::setWidth( double width ) { d_width = width; } /*! \return the width of the needle \sa setWidth() */ double QwtDialSimpleNeedle::width() const { return d_width; } /*! Draw the needle \param painter Painter \param length Length of the needle \param colorGroup Color group, used for painting */ void QwtDialSimpleNeedle::drawNeedle( QPainter *painter, double length, QPalette::ColorGroup colorGroup ) const { double knobWidth = 0.0; double width = d_width; if ( d_style == Arrow ) { if ( width <= 0.0 ) width = qMax(length * 0.06, 6.0); qwtDrawArrowNeedle( painter, palette(), colorGroup, length, width ); knobWidth = qMin( width * 2.0, 0.2 * length ); } else { if ( width <= 0.0 ) width = 5.0; QPen pen ( palette().brush( colorGroup, QPalette::Mid ), width ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->drawLine( QPointF( 0.0, 0.0 ), QPointF( length, 0.0 ) ); knobWidth = qMax( width * 3.0, 5.0 ); } if ( d_hasKnob && knobWidth > 0.0 ) { drawKnob( painter, knobWidth, palette().brush( colorGroup, QPalette::Base ), false ); } } //! Constructor QwtCompassMagnetNeedle::QwtCompassMagnetNeedle( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; palette.setColor( QPalette::Light, light ); palette.setColor( QPalette::Dark, dark ); palette.setColor( QPalette::Base, Qt::gray ); setPalette( palette ); } /*! Draw the needle \param painter Painter \param length Length of the needle \param colorGroup Color group, used for painting */ void QwtCompassMagnetNeedle::drawNeedle( QPainter *painter, double length, QPalette::ColorGroup colorGroup ) const { if ( d_style == ThinStyle ) { const double width = qMax( length / 6.0, 3.0 ); const int colorOffset = 10; const QColor light = palette().color( colorGroup, QPalette::Light ); const QColor dark = palette().color( colorGroup, QPalette::Dark ); qwtDrawShadedPointer( painter, dark.light( 100 + colorOffset ), dark.dark( 100 + colorOffset ), length, width ); painter->rotate( 180.0 ); qwtDrawShadedPointer( painter, light.light( 100 + colorOffset ), light.dark( 100 + colorOffset ), length, width ); const QBrush baseBrush = palette().brush( colorGroup, QPalette::Base ); drawKnob( painter, width, baseBrush, true ); } else { qwtDrawTriangleNeedle( painter, palette(), colorGroup, length ); } } /*! Constructor \param style Arrow style \param light Light color \param dark Dark color */ QwtCompassWindArrow::QwtCompassWindArrow( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; palette.setColor( QPalette::Light, light ); palette.setColor( QPalette::Dark, dark ); setPalette( palette ); } /*! Draw the needle \param painter Painter \param length Length of the needle \param colorGroup Color group, used for painting */ void QwtCompassWindArrow::drawNeedle( QPainter *painter, double length, QPalette::ColorGroup colorGroup ) const { if ( d_style == Style1 ) qwtDrawStyle1Needle( painter, palette(), colorGroup, length ); else qwtDrawStyle2Needle( painter, palette(), colorGroup, length ); } qsstv_9.2.6/qwt/qwt_dial_needle.h0000664000175000017500000000777213203343610015546 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_NEEDLE_H #define QWT_DIAL_NEEDLE_H 1 #include "qwt_global.h" #include class QPainter; class QPoint; /*! \brief Base class for needles that can be used in a QwtDial. QwtDialNeedle is a pointer that indicates a value by pointing to a specific direction. \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialNeedle { public: QwtDialNeedle(); virtual ~QwtDialNeedle(); virtual void setPalette( const QPalette & ); const QPalette &palette() const; virtual void draw( QPainter *painter, const QPointF ¢er, double length, double direction, QPalette::ColorGroup = QPalette::Active ) const; protected: /*! \brief Draw the needle The origin of the needle is at position (0.0, 0.0 ) pointing in direction 0.0 ( = east ). The painter is already initialized with translation and rotation. \param painter Painter \param length Length of the needle \param colorGroup Color group, used for painting \sa setPalette(), palette() */ virtual void drawNeedle( QPainter *painter, double length, QPalette::ColorGroup colorGroup ) const = 0; virtual void drawKnob( QPainter *, double width, const QBrush &, bool sunken ) const; private: QPalette d_palette; }; /*! \brief A needle for dial widgets The following colors are used: - QPalette::Mid\n Pointer - QPalette::Base\n Knob \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialSimpleNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { //! Arrow Arrow, //! A straight line from the center Ray }; QwtDialSimpleNeedle( Style, bool hasKnob = true, const QColor &mid = Qt::gray, const QColor &base = Qt::darkGray ); void setWidth( double width ); double width() const; protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; bool d_hasKnob; double d_width; }; /*! \brief A magnet needle for compass widgets A magnet needle points to two opposite directions indicating north and south. The following colors are used: - QPalette::Light\n Used for pointing south - QPalette::Dark\n Used for pointing north - QPalette::Base\n Knob (ThinStyle only) \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassMagnetNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { //! A needle with a triangular shape TriangleStyle, //! A thin needle ThinStyle }; QwtCompassMagnetNeedle( Style = TriangleStyle, const QColor &light = Qt::white, const QColor &dark = Qt::red ); protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; }; /*! \brief An indicator for the wind direction QwtCompassWindArrow shows the direction where the wind comes from. - QPalette::Light\n Used for Style1, or the light half of Style2 - QPalette::Dark\n Used for the dark half of Style2 \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassWindArrow: public QwtDialNeedle { public: //! Style of the arrow enum Style { //! A needle pointing to the center Style1, //! A needle pointing to the center Style2 }; QwtCompassWindArrow( Style, const QColor &light = Qt::white, const QColor &dark = Qt::gray ); protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; }; #endif qsstv_9.2.6/qwt/qwt_dyngrid_layout.cpp0000664000175000017500000003421513203343610016701 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include #include class QwtDynGridLayout::PrivateData { public: PrivateData(): isDirty( true ) { } void updateLayoutCache(); mutable QList itemList; uint maxColumns; uint numRows; uint numColumns; Qt::Orientations expanding; bool isDirty; QVector itemSizeHints; }; void QwtDynGridLayout::PrivateData::updateLayoutCache() { itemSizeHints.resize( itemList.count() ); int index = 0; for ( QList::iterator it = itemList.begin(); it != itemList.end(); ++it, index++ ) { itemSizeHints[ index ] = ( *it )->sizeHint(); } isDirty = false; } /*! \param parent Parent widget \param margin Margin \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( QWidget *parent, int margin, int spacing ): QLayout( parent ) { init(); setSpacing( spacing ); setMargin( margin ); } /*! \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( int spacing ) { init(); setSpacing( spacing ); } /*! Initialize the layout with default values. */ void QwtDynGridLayout::init() { d_data = new QwtDynGridLayout::PrivateData; d_data->maxColumns = d_data->numRows = d_data->numColumns = 0; d_data->expanding = 0; } //! Destructor QwtDynGridLayout::~QwtDynGridLayout() { for ( int i = 0; i < d_data->itemList.size(); i++ ) delete d_data->itemList[i]; delete d_data; } //! Invalidate all internal caches void QwtDynGridLayout::invalidate() { d_data->isDirty = true; QLayout::invalidate(); } /*! Limit the number of columns. \param maxColumns upper limit, 0 means unlimited \sa maxColumns() */ void QwtDynGridLayout::setMaxColumns( uint maxColumns ) { d_data->maxColumns = maxColumns; } /*! \brief Return the upper limit for the number of columns. 0 means unlimited, what is the default. \return Upper limit for the number of columns \sa setMaxColumns() */ uint QwtDynGridLayout::maxColumns() const { return d_data->maxColumns; } /*! \brief Add an item to the next free position. \param item Layout item */ void QwtDynGridLayout::addItem( QLayoutItem *item ) { d_data->itemList.append( item ); invalidate(); } /*! \return true if this layout is empty. */ bool QwtDynGridLayout::isEmpty() const { return d_data->itemList.isEmpty(); } /*! \return number of layout items */ uint QwtDynGridLayout::itemCount() const { return d_data->itemList.count(); } /*! Find the item at a specific index \param index Index \return Item at a specific index \sa takeAt() */ QLayoutItem *QwtDynGridLayout::itemAt( int index ) const { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; return d_data->itemList.at( index ); } /*! Find the item at a specific index and remove it from the layout \param index Index \return Layout item, removed from the layout \sa itemAt() */ QLayoutItem *QwtDynGridLayout::takeAt( int index ) { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; d_data->isDirty = true; return d_data->itemList.takeAt( index ); } //! \return Number of items in the layout int QwtDynGridLayout::count() const { return d_data->itemList.count(); } /*! Set whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. The default value is 0. \param expanding Or'd orientations \sa expandingDirections() */ void QwtDynGridLayout::setExpandingDirections( Qt::Orientations expanding ) { d_data->expanding = expanding; } /*! \brief Returns whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. \return Orientations, where the layout expands \sa setExpandingDirections() */ Qt::Orientations QwtDynGridLayout::expandingDirections() const { return d_data->expanding; } /*! Reorganizes columns and rows and resizes managed items within a rectangle. \param rect Layout geometry */ void QwtDynGridLayout::setGeometry( const QRect &rect ) { QLayout::setGeometry( rect ); if ( isEmpty() ) return; d_data->numColumns = columnsForWidth( rect.width() ); d_data->numRows = itemCount() / d_data->numColumns; if ( itemCount() % d_data->numColumns ) d_data->numRows++; QList itemGeometries = layoutItems( rect, d_data->numColumns ); int index = 0; for ( QList::iterator it = d_data->itemList.begin(); it != d_data->itemList.end(); ++it ) { ( *it )->setGeometry( itemGeometries[index] ); index++; } } /*! \brief Calculate the number of columns for a given width. The calculation tries to use as many columns as possible ( limited by maxColumns() ) \param width Available width for all columns \return Number of columns for a given width \sa maxColumns(), setMaxColumns() */ uint QwtDynGridLayout::columnsForWidth( int width ) const { if ( isEmpty() ) return 0; uint maxColumns = itemCount(); if ( d_data->maxColumns > 0 ) maxColumns = qMin( d_data->maxColumns, maxColumns ); if ( maxRowWidth( maxColumns ) <= width ) return maxColumns; for ( uint numColumns = 2; numColumns <= maxColumns; numColumns++ ) { const int rowWidth = maxRowWidth( numColumns ); if ( rowWidth > width ) return numColumns - 1; } return 1; // At least 1 column } /*! Calculate the width of a layout for a given number of columns. \param numColumns Given number of columns \param itemWidth Array of the width hints for all items */ int QwtDynGridLayout::maxRowWidth( int numColumns ) const { int col; QVector colWidth( numColumns ); for ( col = 0; col < numColumns; col++ ) colWidth[col] = 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( int index = 0; index < d_data->itemSizeHints.count(); index++ ) { col = index % numColumns; colWidth[col] = qMax( colWidth[col], d_data->itemSizeHints[int( index )].width() ); } int rowWidth = 2 * margin() + ( numColumns - 1 ) * spacing(); for ( col = 0; col < numColumns; col++ ) rowWidth += colWidth[col]; return rowWidth; } /*! \return the maximum width of all layout items */ int QwtDynGridLayout::maxItemWidth() const { if ( isEmpty() ) return 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); int w = 0; for ( int i = 0; i < d_data->itemSizeHints.count(); i++ ) { const int itemW = d_data->itemSizeHints[i].width(); if ( itemW > w ) w = itemW; } return w; } /*! Calculate the geometries of the layout items for a layout with numColumns columns and a given rectangle. \param rect Rect where to place the items \param numColumns Number of columns \return item geometries */ QList QwtDynGridLayout::layoutItems( const QRect &rect, uint numColumns ) const { QList itemGeometries; if ( numColumns == 0 || isEmpty() ) return itemGeometries; uint numRows = itemCount() / numColumns; if ( numColumns % itemCount() ) numRows++; if ( numRows == 0 ) return itemGeometries; QVector rowHeight( numRows ); QVector colWidth( numColumns ); layoutGrid( numColumns, rowHeight, colWidth ); bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH || expandV ) stretchGrid( rect, numColumns, rowHeight, colWidth ); const int maxColumns = d_data->maxColumns; d_data->maxColumns = numColumns; const QRect alignedRect = alignmentRect( rect ); d_data->maxColumns = maxColumns; const int xOffset = expandH ? 0 : alignedRect.x(); const int yOffset = expandV ? 0 : alignedRect.y(); QVector colX( numColumns ); QVector rowY( numRows ); const int xySpace = spacing(); rowY[0] = yOffset + margin(); for ( uint r = 1; r < numRows; r++ ) rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace; colX[0] = xOffset + margin(); for ( uint c = 1; c < numColumns; c++ ) colX[c] = colX[c-1] + colWidth[c-1] + xySpace; const int itemCount = d_data->itemList.size(); for ( int i = 0; i < itemCount; i++ ) { const int row = i / numColumns; const int col = i % numColumns; QRect itemGeometry( colX[col], rowY[row], colWidth[col], rowHeight[row] ); itemGeometries.append( itemGeometry ); } return itemGeometries; } /*! Calculate the dimensions for the columns and rows for a grid of numColumns columns. \param numColumns Number of columns. \param rowHeight Array where to fill in the calculated row heights. \param colWidth Array where to fill in the calculated column widths. */ void QwtDynGridLayout::layoutGrid( uint numColumns, QVector& rowHeight, QVector& colWidth ) const { if ( numColumns <= 0 ) return; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( int index = 0; index < d_data->itemSizeHints.count(); index++ ) { const int row = index / numColumns; const int col = index % numColumns; const QSize &size = d_data->itemSizeHints[int( index )]; rowHeight[row] = ( col == 0 ) ? size.height() : qMax( rowHeight[row], size.height() ); colWidth[col] = ( row == 0 ) ? size.width() : qMax( colWidth[col], size.width() ); } } /*! \return true: QwtDynGridLayout implements heightForWidth(). \sa heightForWidth() */ bool QwtDynGridLayout::hasHeightForWidth() const { return true; } /*! \return The preferred height for this layout, given a width. \sa hasHeightForWidth() */ int QwtDynGridLayout::heightForWidth( int width ) const { if ( isEmpty() ) return 0; const uint numColumns = columnsForWidth( width ); uint numRows = itemCount() / numColumns; if ( itemCount() % numColumns ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numColumns ); layoutGrid( numColumns, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( uint row = 0; row < numRows; row++ ) h += rowHeight[row]; return h; } /*! Stretch columns in case of expanding() & QSizePolicy::Horizontal and rows in case of expanding() & QSizePolicy::Vertical to fill the entire rect. Rows and columns are stretched with the same factor. \param rect Bounding rectangle \param numColumns Number of columns \param rowHeight Array to be filled with the calculated row heights \param colWidth Array to be filled with the calculated column widths \sa setExpanding(), expanding() */ void QwtDynGridLayout::stretchGrid( const QRect &rect, uint numColumns, QVector& rowHeight, QVector& colWidth ) const { if ( numColumns == 0 || isEmpty() ) return; bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH ) { int xDelta = rect.width() - 2 * margin() - ( numColumns - 1 ) * spacing(); for ( uint col = 0; col < numColumns; col++ ) xDelta -= colWidth[col]; if ( xDelta > 0 ) { for ( uint col = 0; col < numColumns; col++ ) { const int space = xDelta / ( numColumns - col ); colWidth[col] += space; xDelta -= space; } } } if ( expandV ) { uint numRows = itemCount() / numColumns; if ( itemCount() % numColumns ) numRows++; int yDelta = rect.height() - 2 * margin() - ( numRows - 1 ) * spacing(); for ( uint row = 0; row < numRows; row++ ) yDelta -= rowHeight[row]; if ( yDelta > 0 ) { for ( uint row = 0; row < numRows; row++ ) { const int space = yDelta / ( numRows - row ); rowHeight[row] += space; yDelta -= space; } } } } /*! Return the size hint. If maxColumns() > 0 it is the size for a grid with maxColumns() columns, otherwise it is the size for a grid with only one row. \return Size hint \sa maxColumns(), setMaxColumns() */ QSize QwtDynGridLayout::sizeHint() const { if ( isEmpty() ) return QSize(); uint numColumns = itemCount(); if ( d_data->maxColumns > 0 ) numColumns = qMin( d_data->maxColumns, numColumns ); uint numRows = itemCount() / numColumns; if ( itemCount() % numColumns ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numColumns ); layoutGrid( numColumns, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( uint row = 0; row < numRows; row++ ) h += rowHeight[row]; int w = 2 * margin() + ( numColumns - 1 ) * spacing(); for ( uint col = 0; col < numColumns; col++ ) w += colWidth[col]; return QSize( w, h ); } /*! \return Number of rows of the current layout. \sa numColumns() \warning The number of rows might change whenever the geometry changes */ uint QwtDynGridLayout::numRows() const { return d_data->numRows; } /*! \return Number of columns of the current layout. \sa numRows() \warning The number of columns might change whenever the geometry changes */ uint QwtDynGridLayout::numColumns() const { return d_data->numColumns; } qsstv_9.2.6/qwt/qwt_dyngrid_layout.h0000664000175000017500000000445013203343610016344 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DYNGRID_LAYOUT_H #define QWT_DYNGRID_LAYOUT_H #include "qwt_global.h" #include #include #include /*! \brief The QwtDynGridLayout class lays out widgets in a grid, adjusting the number of columns and rows to the current size. QwtDynGridLayout takes the space it gets, divides it up into rows and columns, and puts each of the widgets it manages into the correct cell(s). It lays out as many number of columns as possible (limited by maxColumns()). */ class QWT_EXPORT QwtDynGridLayout : public QLayout { Q_OBJECT public: explicit QwtDynGridLayout( QWidget *, int margin = 0, int space = -1 ); explicit QwtDynGridLayout( int space = -1 ); virtual ~QwtDynGridLayout(); virtual void invalidate(); void setMaxColumns( uint maxCols ); uint maxColumns() const; uint numRows () const; uint numColumns () const; virtual void addItem( QLayoutItem * ); virtual QLayoutItem *itemAt( int index ) const; virtual QLayoutItem *takeAt( int index ); virtual int count() const; void setExpandingDirections( Qt::Orientations ); virtual Qt::Orientations expandingDirections() const; QList layoutItems( const QRect &, uint numCols ) const; virtual int maxItemWidth() const; virtual void setGeometry( const QRect &rect ); virtual bool hasHeightForWidth() const; virtual int heightForWidth( int ) const; virtual QSize sizeHint() const; virtual bool isEmpty() const; uint itemCount() const; virtual uint columnsForWidth( int width ) const; protected: void layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const; void stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const; private: void init(); int maxRowWidth( int numCols ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_event_pattern.cpp0000664000175000017500000001512213203343610016516 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_event_pattern.h" #include /*! Constructor \sa MousePatternCode, KeyPatternCode */ QwtEventPattern::QwtEventPattern(): d_mousePattern( MousePatternCount ), d_keyPattern( KeyPatternCount ) { initKeyPattern(); initMousePattern( 3 ); } //! Destructor QwtEventPattern::~QwtEventPattern() { } /*! Set default mouse patterns, depending on the number of mouse buttons \param numButtons Number of mouse buttons ( <= 3 ) \sa MousePatternCode */ void QwtEventPattern::initMousePattern( int numButtons ) { d_mousePattern.resize( MousePatternCount ); switch ( numButtons ) { case 1: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::LeftButton, Qt::ControlModifier ); setMousePattern( MouseSelect3, Qt::LeftButton, Qt::AltModifier ); break; } case 2: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::RightButton ); setMousePattern( MouseSelect3, Qt::LeftButton, Qt::AltModifier ); break; } default: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::RightButton ); setMousePattern( MouseSelect3, Qt::MidButton ); } } setMousePattern( MouseSelect4, d_mousePattern[MouseSelect1].button, d_mousePattern[MouseSelect1].modifiers | Qt::ShiftModifier ); setMousePattern( MouseSelect5, d_mousePattern[MouseSelect2].button, d_mousePattern[MouseSelect2].modifiers | Qt::ShiftModifier ); setMousePattern( MouseSelect6, d_mousePattern[MouseSelect3].button, d_mousePattern[MouseSelect3].modifiers | Qt::ShiftModifier ); } /*! Set default mouse patterns. \sa KeyPatternCode */ void QwtEventPattern::initKeyPattern() { d_keyPattern.resize( KeyPatternCount ); setKeyPattern( KeySelect1, Qt::Key_Return ); setKeyPattern( KeySelect2, Qt::Key_Space ); setKeyPattern( KeyAbort, Qt::Key_Escape ); setKeyPattern( KeyLeft, Qt::Key_Left ); setKeyPattern( KeyRight, Qt::Key_Right ); setKeyPattern( KeyUp, Qt::Key_Up ); setKeyPattern( KeyDown, Qt::Key_Down ); setKeyPattern( KeyRedo, Qt::Key_Plus ); setKeyPattern( KeyUndo, Qt::Key_Minus ); setKeyPattern( KeyHome, Qt::Key_Escape ); } /*! Change one mouse pattern \param pattern Index of the pattern \param button Button \param modifiers Keyboard modifiers \sa QMouseEvent */ void QwtEventPattern::setMousePattern( MousePatternCode pattern, Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { if ( pattern >= 0 && pattern < MousePatternCount ) { d_mousePattern[ pattern ].button = button; d_mousePattern[ pattern ].modifiers = modifiers; } } /*! Change one key pattern \param pattern Index of the pattern \param key Key \param modifiers Keyboard modifiers \sa QKeyEvent */ void QwtEventPattern::setKeyPattern( KeyPatternCode pattern, int key, Qt::KeyboardModifiers modifiers ) { if ( pattern >= 0 && pattern < KeyPatternCount ) { d_keyPattern[ pattern ].key = key; d_keyPattern[ pattern ].modifiers = modifiers; } } //! Change the mouse event patterns void QwtEventPattern::setMousePattern( const QVector &pattern ) { d_mousePattern = pattern; } //! Change the key event patterns void QwtEventPattern::setKeyPattern( const QVector &pattern ) { d_keyPattern = pattern; } //! \return Mouse pattern const QVector & QwtEventPattern::mousePattern() const { return d_mousePattern; } //! \return Key pattern const QVector & QwtEventPattern::keyPattern() const { return d_keyPattern; } //! \return Mouse pattern QVector &QwtEventPattern::mousePattern() { return d_mousePattern; } //! \return Key pattern QVector &QwtEventPattern::keyPattern() { return d_keyPattern; } /*! \brief Compare a mouse event with an event pattern. A mouse event matches the pattern when both have the same button value and in the state value the same key flags(Qt::KeyButtonMask) are set. \param code Index of the event pattern \param event Mouse event \return true if matches \sa keyMatch() */ bool QwtEventPattern::mouseMatch( MousePatternCode code, const QMouseEvent *event ) const { if ( code >= 0 && code < MousePatternCount ) return mouseMatch( d_mousePattern[ code ], event ); return false; } /*! \brief Compare a mouse event with an event pattern. A mouse event matches the pattern when both have the same button value and in the state value the same key flags(Qt::KeyButtonMask) are set. \param pattern Mouse event pattern \param event Mouse event \return true if matches \sa keyMatch() */ bool QwtEventPattern::mouseMatch( const MousePattern &pattern, const QMouseEvent *event ) const { if ( event == NULL ) return false; const MousePattern mousePattern( event->button(), event->modifiers() ); return mousePattern == pattern; } /*! \brief Compare a key event with an event pattern. A key event matches the pattern when both have the same key value and in the state value the same key flags (Qt::KeyButtonMask) are set. \param code Index of the event pattern \param event Key event \return true if matches \sa mouseMatch() */ bool QwtEventPattern::keyMatch( KeyPatternCode code, const QKeyEvent *event ) const { if ( code >= 0 && code < KeyPatternCount ) return keyMatch( d_keyPattern[ code ], event ); return false; } /*! \brief Compare a key event with an event pattern. A key event matches the pattern when both have the same key value and in the state value the same key flags (Qt::KeyButtonMask) are set. \param pattern Key event pattern \param event Key event \return true if matches \sa mouseMatch() */ bool QwtEventPattern::keyMatch( const KeyPattern &pattern, const QKeyEvent *event ) const { if ( event == NULL ) return false; const KeyPattern keyPattern( event->key(), event->modifiers() ); return keyPattern == pattern; } qsstv_9.2.6/qwt/qwt_event_pattern.h0000664000175000017500000001351713203343610016171 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_EVENT_PATTERN #define QWT_EVENT_PATTERN 1 #include "qwt_global.h" #include #include class QMouseEvent; class QKeyEvent; /*! \brief A collection of event patterns QwtEventPattern introduces an level of indirection for mouse and keyboard inputs. Those are represented by symbolic names, so the application code can be configured by individual mappings. \sa QwtPicker, QwtPickerMachine, QwtPlotZoomer */ class QWT_EXPORT QwtEventPattern { public: /*! \brief Symbolic mouse input codes QwtEventPattern implements 3 different settings for mice with 1, 2, or 3 buttons that can be activated using initMousePattern(). The default setting is for 3 button mice. Individual settings can be configured using setMousePattern(). \sa initMousePattern(), setMousePattern(), setKeyPattern() */ enum MousePatternCode { /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton - Qt::LeftButton - Qt::LeftButton */ MouseSelect1, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ControlModifier - Qt::RightButton - Qt::RightButton */ MouseSelect2, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::AltModifier - Qt::LeftButton + Qt::AltModifier - Qt::MidButton */ MouseSelect3, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ShiftModifier - Qt::LeftButton + Qt::ShiftModifier - Qt::LeftButton + Qt::ShiftModifier */ MouseSelect4, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ControlButton | Qt::ShiftModifier - Qt::RightButton + Qt::ShiftModifier - Qt::RightButton + Qt::ShiftModifier */ MouseSelect5, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::AltModifier + Qt::ShiftModifier - Qt::LeftButton + Qt::AltModifier | Qt::ShiftModifier - Qt::MidButton + Qt::ShiftModifier */ MouseSelect6, //! Number of mouse patterns MousePatternCount }; /*! \brief Symbolic keyboard input codes Individual settings can be configured using setKeyPattern() \sa setKeyPattern(), setMousePattern() */ enum KeyPatternCode { //! Qt::Key_Return KeySelect1, //! Qt::Key_Space KeySelect2, //! Qt::Key_Escape KeyAbort, //! Qt::Key_Left KeyLeft, //! Qt::Key_Right KeyRight, //! Qt::Key_Up KeyUp, //! Qt::Key_Down KeyDown, //! Qt::Key_Plus KeyRedo, //! Qt::Key_Minus KeyUndo, //! Qt::Key_Escape KeyHome, //! Number of key patterns KeyPatternCount }; //! A pattern for mouse events class MousePattern { public: //! Constructor MousePattern( Qt::MouseButton btn = Qt::NoButton, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ): button( btn ), modifiers( modifierCodes ) { } //! Button Qt::MouseButton button; //! Keyboard modifier Qt::KeyboardModifiers modifiers; }; //! A pattern for key events class KeyPattern { public: //! Constructor KeyPattern( int keyCode = Qt::Key_unknown, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ): key( keyCode ), modifiers( modifierCodes ) { } //! Key code int key; //! Modifiers Qt::KeyboardModifiers modifiers; }; QwtEventPattern(); virtual ~QwtEventPattern(); void initMousePattern( int numButtons ); void initKeyPattern(); void setMousePattern( MousePatternCode, Qt::MouseButton button, Qt::KeyboardModifiers = Qt::NoModifier ); void setKeyPattern( KeyPatternCode, int keyCode, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ); void setMousePattern( const QVector & ); void setKeyPattern( const QVector & ); const QVector &mousePattern() const; const QVector &keyPattern() const; QVector &mousePattern(); QVector &keyPattern(); bool mouseMatch( MousePatternCode, const QMouseEvent * ) const; bool keyMatch( KeyPatternCode, const QKeyEvent * ) const; protected: virtual bool mouseMatch( const MousePattern &, const QMouseEvent * ) const; virtual bool keyMatch( const KeyPattern &, const QKeyEvent * ) const; private: #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable: 4251) #endif QVector d_mousePattern; QVector d_keyPattern; #if defined(_MSC_VER) #pragma warning(pop) #endif }; //! Compare operator inline bool operator==( QwtEventPattern::MousePattern b1, QwtEventPattern::MousePattern b2 ) { return b1.button == b2.button && b1.modifiers == b2.modifiers; } //! Compare operator inline bool operator==( QwtEventPattern::KeyPattern b1, QwtEventPattern::KeyPattern b2 ) { return b1.key == b2.key && b1.modifiers == b2.modifiers; } #endif qsstv_9.2.6/qwt/qwt_global.h0000664000175000017500000000207013203343610014543 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GLOBAL_H #define QWT_GLOBAL_H #include // QWT_VERSION is (major << 16) + (minor << 8) + patch. #define QWT_VERSION 0x060100 #define QWT_VERSION_STR "6.1.0" #if defined(_MSC_VER) /* MSVC Compiler */ /* template-class specialization 'identifier' is already instantiated */ #pragma warning(disable: 4660) /* inherits via dominance */ #pragma warning(disable: 4250) #endif // _MSC_VER #ifdef QWT_DLL #if defined(QWT_MAKEDLL) // create a Qwt DLL library #define QWT_EXPORT Q_DECL_EXPORT #else // use a Qwt DLL library #define QWT_EXPORT Q_DECL_IMPORT #endif #endif // QWT_DLL #ifndef QWT_EXPORT #define QWT_EXPORT #endif #endif qsstv_9.2.6/qwt/qwt_graphic.cpp0000664000175000017500000006147513203343610015271 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_graphic.h" #include "qwt_painter_command.h" #include #include #include #include #include #include #include static bool qwtHasScalablePen( const QPainter *painter ) { const QPen pen = painter->pen(); bool scalablePen = false; if ( pen.style() != Qt::NoPen && pen.brush().style() != Qt::NoBrush ) { scalablePen = !pen.isCosmetic(); if ( !scalablePen && pen.widthF() == 0.0 ) { const QPainter::RenderHints hints = painter->renderHints(); if ( hints.testFlag( QPainter::NonCosmeticDefaultPen ) ) scalablePen = true; } } return scalablePen; } static QRectF qwtStrokedPathRect( const QPainter *painter, const QPainterPath &path ) { QPainterPathStroker stroker; stroker.setWidth( painter->pen().widthF() ); stroker.setCapStyle( painter->pen().capStyle() ); stroker.setJoinStyle( painter->pen().joinStyle() ); stroker.setMiterLimit( painter->pen().miterLimit() ); QRectF rect; if ( qwtHasScalablePen( painter ) ) { QPainterPath stroke = stroker.createStroke(path); rect = painter->transform().map(stroke).boundingRect(); } else { QPainterPath mappedPath = painter->transform().map(path); mappedPath = stroker.createStroke( mappedPath ); rect = mappedPath.boundingRect(); } return rect; } static inline void qwtExecCommand( QPainter *painter, const QwtPainterCommand &cmd, QwtGraphic::RenderHints renderHints, const QTransform &transform ) { switch( cmd.type() ) { case QwtPainterCommand::Path: { bool doMap = false; if ( renderHints.testFlag( QwtGraphic::RenderPensUnscaled ) && painter->transform().isScaling() ) { bool isCosmetic = painter->pen().isCosmetic(); if ( isCosmetic && painter->pen().widthF() == 0.0 ) { QPainter::RenderHints hints = painter->renderHints(); if ( hints.testFlag( QPainter::NonCosmeticDefaultPen ) ) isCosmetic = false; } doMap = !isCosmetic; } if ( doMap ) { const QTransform transform = painter->transform(); painter->resetTransform(); painter->drawPath( transform.map( *cmd.path() ) ); painter->setTransform( transform ); } else { painter->drawPath( *cmd.path() ); } break; } case QwtPainterCommand::Pixmap: { const QwtPainterCommand::PixmapData *data = cmd.pixmapData(); painter->drawPixmap( data->rect, data->pixmap, data->subRect ); break; } case QwtPainterCommand::Image: { const QwtPainterCommand::ImageData *data = cmd.imageData(); painter->drawImage( data->rect, data->image, data->subRect, data->flags ); break; } case QwtPainterCommand::State: { const QwtPainterCommand::StateData *data = cmd.stateData(); if ( data->flags & QPaintEngine::DirtyPen ) painter->setPen( data->pen ); if ( data->flags & QPaintEngine::DirtyBrush ) painter->setBrush( data->brush ); if ( data->flags & QPaintEngine::DirtyBrushOrigin ) painter->setBrushOrigin( data->brushOrigin ); if ( data->flags & QPaintEngine::DirtyFont ) painter->setFont( data->font ); if ( data->flags & QPaintEngine::DirtyBackground ) { painter->setBackgroundMode( data->backgroundMode ); painter->setBackground( data->backgroundBrush ); } if ( data->flags & QPaintEngine::DirtyTransform ) { painter->setTransform( data->transform * transform ); } if ( data->flags & QPaintEngine::DirtyClipEnabled ) painter->setClipping( data->isClipEnabled ); if ( data->flags & QPaintEngine::DirtyClipRegion) { painter->setClipRegion( data->clipRegion, data->clipOperation ); } if ( data->flags & QPaintEngine::DirtyClipPath ) { painter->setClipPath( data->clipPath, data->clipOperation ); } if ( data->flags & QPaintEngine::DirtyHints) { const QPainter::RenderHints hints = data->renderHints; painter->setRenderHint( QPainter::Antialiasing, hints.testFlag( QPainter::Antialiasing ) ); painter->setRenderHint( QPainter::TextAntialiasing, hints.testFlag( QPainter::TextAntialiasing ) ); painter->setRenderHint( QPainter::SmoothPixmapTransform, hints.testFlag( QPainter::SmoothPixmapTransform ) ); painter->setRenderHint( QPainter::HighQualityAntialiasing, hints.testFlag( QPainter::HighQualityAntialiasing ) ); painter->setRenderHint( QPainter::NonCosmeticDefaultPen, hints.testFlag( QPainter::NonCosmeticDefaultPen ) ); } if ( data->flags & QPaintEngine::DirtyCompositionMode) painter->setCompositionMode( data->compositionMode ); if ( data->flags & QPaintEngine::DirtyOpacity) painter->setOpacity( data->opacity ); break; } default: break; } } class QwtGraphic::PathInfo { public: PathInfo(): d_scalablePen( false ) { // QVector needs a default constructor } PathInfo( const QRectF &pointRect, const QRectF &boundingRect, bool scalablePen ): d_pointRect( pointRect ), d_boundingRect( boundingRect ), d_scalablePen( scalablePen ) { } inline QRectF scaledBoundingRect( double sx, double sy, bool scalePens ) const { if ( sx == 1.0 && sy == 1.0 ) return d_boundingRect; QTransform transform; transform.scale( sx, sy ); QRectF rect; if ( scalePens && d_scalablePen ) { rect = transform.mapRect( d_boundingRect ); } else { rect = transform.mapRect( d_pointRect ); const double l = qAbs( d_pointRect.left() - d_boundingRect.left() ); const double r = qAbs( d_pointRect.right() - d_boundingRect.right() ); const double t = qAbs( d_pointRect.top() - d_boundingRect.top() ); const double b = qAbs( d_pointRect.bottom() - d_boundingRect.bottom() ); rect.adjust( -l, -t, r, b ); } return rect; } inline double scaleFactorX( const QRectF& pathRect, const QRectF &targetRect, bool scalePens ) const { if ( pathRect.width() <= 0.0 ) return 0.0; const QPointF p0 = d_pointRect.center(); const double l = qAbs( pathRect.left() - p0.x() ); const double r = qAbs( pathRect.right() - p0.x() ); const double w = 2.0 * qMin( l, r ) * targetRect.width() / pathRect.width(); double sx; if ( scalePens && d_scalablePen ) { sx = w / d_boundingRect.width(); } else { const double pw = qMax( qAbs( d_boundingRect.left() - d_pointRect.left() ), qAbs( d_boundingRect.right() - d_pointRect.right() ) ); sx = ( w - 2 * pw ) / d_pointRect.width(); } return sx; } inline double scaleFactorY( const QRectF& pathRect, const QRectF &targetRect, bool scalePens ) const { if ( pathRect.height() <= 0.0 ) return 0.0; const QPointF p0 = d_pointRect.center(); const double t = qAbs( pathRect.top() - p0.y() ); const double b = qAbs( pathRect.bottom() - p0.y() ); const double h = 2.0 * qMin( t, b ) * targetRect.height() / pathRect.height(); double sy; if ( scalePens && d_scalablePen ) { sy = h / d_boundingRect.height(); } else { const double pw = qMax( qAbs( d_boundingRect.top() - d_pointRect.top() ), qAbs( d_boundingRect.bottom() - d_pointRect.bottom() ) ); sy = ( h - 2 * pw ) / d_pointRect.height(); } return sy; } private: QRectF d_pointRect; QRectF d_boundingRect; bool d_scalablePen; }; class QwtGraphic::PrivateData { public: PrivateData(): boundingRect( 0.0, 0.0, -1.0, -1.0 ), pointRect( 0.0, 0.0, -1.0, -1.0 ) { } QSizeF defaultSize; QVector commands; QVector pathInfos; QRectF boundingRect; QRectF pointRect; QwtGraphic::RenderHints renderHints; }; /*! \brief Constructor Initializes a null graphic \sa isNull() */ QwtGraphic::QwtGraphic(): QwtNullPaintDevice() { setMode( QwtNullPaintDevice::PathMode ); d_data = new PrivateData; } /*! \brief Copy constructor \param other Source \sa operator=() */ QwtGraphic::QwtGraphic( const QwtGraphic &other ): QwtNullPaintDevice() { setMode( other.mode() ); d_data = new PrivateData( *other.d_data ); } //! Destructor QwtGraphic::~QwtGraphic() { delete d_data; } /*! \brief Assignment operator \param other Source \return A reference of this object */ QwtGraphic& QwtGraphic::operator=(const QwtGraphic &other) { setMode( other.mode() ); *d_data = *other.d_data; return *this; } /*! \brief Clear all stored commands \sa isNull() */ void QwtGraphic::reset() { d_data->commands.clear(); d_data->pathInfos.clear(); d_data->boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_data->pointRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_data->defaultSize = QSizeF(); } /*! \return True, when no painter commands have been stored \sa isEmpty(), commands() */ bool QwtGraphic::isNull() const { return d_data->commands.isEmpty(); } /*! \return True, when the bounding rectangle is empty \sa boundingRect(), isNull() */ bool QwtGraphic::isEmpty() const { return d_data->boundingRect.isEmpty(); } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtGraphic::setRenderHint( RenderHint hint, bool on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtGraphic::testRenderHint( RenderHint hint ) const { return d_data->renderHints.testFlag( hint ); } /*! The bounding rectangle is the controlPointRect() extended by the areas needed for rendering the outlines with unscaled pens. \return Bounding rectangle of the graphic \sa controlPointRect(), scaledBoundingRect() */ QRectF QwtGraphic::boundingRect() const { if ( d_data->boundingRect.width() < 0 ) return QRectF(); return d_data->boundingRect; } /*! The control point rectangle is the bounding rectangle of all control points of the paths and the target rectangles of the images/pixmaps. \return Control point rectangle \sa boundingRect(), scaledBoundingRect() */ QRectF QwtGraphic::controlPointRect() const { if ( d_data->pointRect.width() < 0 ) return QRectF(); return d_data->pointRect; } /*! \brief Calculate the target rectangle for scaling the graphic \param sx Horizontal scaling factor \param sy Vertical scaling factor \note In case of paths that are painted with a cosmetic pen ( see QPen::isCosmetic() ) the target rectangle is different to multiplying the bounding rectangle. \return Scaled bounding rectangle \sa boundingRect(), controlPointRect() */ QRectF QwtGraphic::scaledBoundingRect( double sx, double sy ) const { if ( sx == 1.0 && sy == 1.0 ) return d_data->boundingRect; QTransform transform; transform.scale( sx, sy ); QRectF rect = transform.mapRect( d_data->pointRect ); for ( int i = 0; i < d_data->pathInfos.size(); i++ ) { rect |= d_data->pathInfos[i].scaledBoundingRect( sx, sy, !d_data->renderHints.testFlag( RenderPensUnscaled ) ); } return rect; } //! \return Ceiled defaultSize() QSize QwtGraphic::sizeMetrics() const { const QSizeF sz = defaultSize(); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! \brief Set a default size The default size is used in all methods rendering the graphic, where no size is explicitly specified. Assigning an empty size means, that the default size will be calculated from the bounding rectangle. The default setting is an empty size. \param size Default size \sa defaultSize(), boundingRect() */ void QwtGraphic::setDefaultSize( const QSizeF &size ) { const double w = qMax( qreal( 0.0 ), size.width() ); const double h = qMax( qreal( 0.0 ), size.height() ); d_data->defaultSize = QSizeF( w, h ); } /*! \brief Default size When a non empty size has been assigned by setDefaultSize() this size will be returned. Otherwise the default size is the size of the bounding rectangle. The default size is used in all methods rendering the graphic, where no size is explicitly specified. \return Default size \sa setDefaultSize(), boundingRect() */ QSizeF QwtGraphic::defaultSize() const { if ( !d_data->defaultSize.isEmpty() ) return d_data->defaultSize; return boundingRect().size(); } /*! \brief Replay all recorded painter commands \param painter Qt painter */ void QwtGraphic::render( QPainter *painter ) const { if ( isNull() ) return; const int numCommands = d_data->commands.size(); const QwtPainterCommand *commands = d_data->commands.constData(); const QTransform transform = painter->transform(); painter->save(); for ( int i = 0; i < numCommands; i++ ) { qwtExecCommand( painter, commands[i], d_data->renderHints, transform ); } painter->restore(); } /*! \brief Replay all recorded painter commands The graphic is scaled to fit into the rectangle of the given size starting at ( 0, 0 ). \param painter Qt painter \param size Size for the scaled graphic \param aspectRatioMode Mode how to scale - See Qt::AspectRatioMode */ void QwtGraphic::render( QPainter *painter, const QSizeF &size, Qt::AspectRatioMode aspectRatioMode ) const { const QRectF r( 0.0, 0.0, size.width(), size.height() ); render( painter, r, aspectRatioMode ); } /*! \brief Replay all recorded painter commands The graphic is scaled to fit into the given rectangle \param painter Qt painter \param rect Rectangle for the scaled graphic \param aspectRatioMode Mode how to scale - See Qt::AspectRatioMode */ void QwtGraphic::render( QPainter *painter, const QRectF &rect, Qt::AspectRatioMode aspectRatioMode ) const { if ( isEmpty() || rect.isEmpty() ) return; double sx = 1.0; double sy = 1.0; if ( d_data->pointRect.width() > 0.0 ) sx = rect.width() / d_data->pointRect.width(); if ( d_data->pointRect.height() > 0.0 ) sy = rect.height() / d_data->pointRect.height(); const bool scalePens = !d_data->renderHints.testFlag( RenderPensUnscaled ); for ( int i = 0; i < d_data->pathInfos.size(); i++ ) { const PathInfo info = d_data->pathInfos[i]; const double ssx = info.scaleFactorX( d_data->pointRect, rect, scalePens ); if ( ssx > 0.0 ) sx = qMin( sx, ssx ); const double ssy = info.scaleFactorY( d_data->pointRect, rect, scalePens ); if ( ssy > 0.0 ) sy = qMin( sy, ssy ); } if ( aspectRatioMode == Qt::KeepAspectRatio ) { const double s = qMin( sx, sy ); sx = s; sy = s; } else if ( aspectRatioMode == Qt::KeepAspectRatioByExpanding ) { const double s = qMax( sx, sy ); sx = s; sy = s; } QTransform tr; tr.translate( rect.center().x() - 0.5 * sx * d_data->pointRect.width(), rect.center().y() - 0.5 * sy * d_data->pointRect.height() ); tr.scale( sx, sy ); tr.translate( -d_data->pointRect.x(), -d_data->pointRect.y() ); const QTransform transform = painter->transform(); painter->setTransform( tr, true ); render( painter ); painter->setTransform( transform ); } /*! \brief Replay all recorded painter commands The graphic is scaled to the defaultSize() and aligned to a position. \param painter Qt painter \param pos Reference point, where to render \param alignment Flags how to align the target rectangle to pos. */ void QwtGraphic::render( QPainter *painter, const QPointF &pos, Qt::Alignment alignment ) const { QRectF r( pos, defaultSize() ); if ( alignment & Qt::AlignLeft ) { r.moveLeft( pos.x() ); } else if ( alignment & Qt::AlignHCenter ) { r.moveCenter( QPointF( pos.x(), r.center().y() ) ); } else if ( alignment & Qt::AlignRight ) { r.moveRight( pos.x() ); } if ( alignment & Qt::AlignTop ) { r.moveTop( pos.y() ); } else if ( alignment & Qt::AlignVCenter ) { r.moveCenter( QPointF( r.center().x(), pos.y() ) ); } else if ( alignment & Qt::AlignBottom ) { r.moveBottom( pos.y() ); } render( painter, r ); } /*! \brief Convert the graphic to a QPixmap All pixels of the pixmap get initialized by Qt::transparent before the graphic is scaled and rendered on it. The size of the pixmap is the default size ( ceiled to integers ) of the graphic. \return The graphic as pixmap in default size \sa defaultSize(), toImage(), render() */ QPixmap QwtGraphic::toPixmap() const { if ( isNull() ) return QPixmap(); const QSizeF sz = defaultSize(); const int w = qCeil( sz.width() ); const int h = qCeil( sz.height() ); QPixmap pixmap( w, h ); pixmap.fill( Qt::transparent ); const QRectF r( 0.0, 0.0, sz.width(), sz.height() ); QPainter painter( &pixmap ); render( &painter, r, Qt::KeepAspectRatio ); painter.end(); return pixmap; } /*! \brief Convert the graphic to a QPixmap All pixels of the pixmap get initialized by Qt::transparent before the graphic is scaled and rendered on it. \param size Size of the image \param aspectRatioMode Aspect ratio how to scale the graphic \return The graphic as pixmap \sa toImage(), render() */ QPixmap QwtGraphic::toPixmap( const QSize &size, Qt::AspectRatioMode aspectRatioMode ) const { QPixmap pixmap( size ); pixmap.fill( Qt::transparent ); const QRect r( 0, 0, size.width(), size.height() ); QPainter painter( &pixmap ); render( &painter, r, aspectRatioMode ); painter.end(); return pixmap; } /*! \brief Convert the graphic to a QImage All pixels of the image get initialized by 0 ( transparent ) before the graphic is scaled and rendered on it. The format of the image is QImage::Format_ARGB32_Premultiplied. \param size Size of the image \param aspectRatioMode Aspect ratio how to scale the graphic \return The graphic as image \sa toPixmap(), render() */ QImage QwtGraphic::toImage( const QSize &size, Qt::AspectRatioMode aspectRatioMode ) const { QImage image( size, QImage::Format_ARGB32_Premultiplied ); image.fill( 0 ); const QRect r( 0, 0, size.width(), size.height() ); QPainter painter( &image ); render( &painter, r, aspectRatioMode ); painter.end(); return image; } /*! \brief Convert the graphic to a QImage All pixels of the image get initialized by 0 ( transparent ) before the graphic is scaled and rendered on it. The format of the image is QImage::Format_ARGB32_Premultiplied. The size of the image is the default size ( ceiled to integers ) of the graphic. \return The graphic as image in default size \sa defaultSize(), toPixmap(), render() */ QImage QwtGraphic::toImage() const { if ( isNull() ) return QImage(); const QSizeF sz = defaultSize(); const int w = qCeil( sz.width() ); const int h = qCeil( sz.height() ); QImage image( w, h, QImage::Format_ARGB32 ); image.fill( 0 ); const QRect r( 0, 0, sz.width(), sz.height() ); QPainter painter( &image ); render( &painter, r, Qt::KeepAspectRatio ); painter.end(); return image; } /*! Store a path command in the command list \param path Painter path \sa QPaintEngine::drawPath() */ void QwtGraphic::drawPath( const QPainterPath &path ) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( path ); if ( !path.isEmpty() ) { const QPainterPath scaledPath = painter->transform().map( path ); QRectF pointRect = scaledPath.boundingRect(); QRectF boundingRect = pointRect; if ( painter->pen().style() != Qt::NoPen && painter->pen().brush().style() != Qt::NoBrush ) { boundingRect = qwtStrokedPathRect( painter, path ); } updateControlPointRect( pointRect ); updateBoundingRect( boundingRect ); d_data->pathInfos += PathInfo( pointRect, boundingRect, qwtHasScalablePen( painter ) ); } } /*! \brief Store a pixmap command in the command list \param rect target rectangle \param pixmap Pixmap to be painted \param subRect Reactangle of the pixmap to be painted \sa QPaintEngine::drawPixmap() */ void QwtGraphic::drawPixmap( const QRectF &rect, const QPixmap &pixmap, const QRectF &subRect ) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( rect, pixmap, subRect ); const QRectF r = painter->transform().mapRect( rect ); updateControlPointRect( r ); updateBoundingRect( r ); } /*! \brief Store a image command in the command list \param rect traget rectangle \param image Image to be painted \param subRect Reactangle of the pixmap to be painted \param flags Image conversion flags \sa QPaintEngine::drawImage() */ void QwtGraphic::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( rect, image, subRect, flags ); const QRectF r = painter->transform().mapRect( rect ); updateControlPointRect( r ); updateBoundingRect( r ); } /*! \brief Store a state command in the command list \param state State to be stored \sa QPaintEngine::updateState() */ void QwtGraphic::updateState( const QPaintEngineState &state) { d_data->commands += QwtPainterCommand( state ); } void QwtGraphic::updateBoundingRect( const QRectF &rect ) { QRectF br = rect; const QPainter *painter = paintEngine()->painter(); if ( painter && painter->hasClipping() ) { QRectF cr = painter->clipRegion().boundingRect(); cr = painter->transform().mapRect( br ); br &= cr; } if ( d_data->boundingRect.width() < 0 ) d_data->boundingRect = br; else d_data->boundingRect |= br; } void QwtGraphic::updateControlPointRect( const QRectF &rect ) { if ( d_data->pointRect.width() < 0.0 ) d_data->pointRect = rect; else d_data->pointRect |= rect; } /*! \return List of recorded paint commands \sa setCommands() */ const QVector< QwtPainterCommand > &QwtGraphic::commands() const { return d_data->commands; } /*! \brief Append paint commands \param commands Paint commands \sa commands() */ void QwtGraphic::setCommands( QVector< QwtPainterCommand > &commands ) { reset(); const int numCommands = commands.size(); if ( numCommands <= 0 ) return; // to calculate a proper bounding rectangle we don't simply copy // the commands. const QwtPainterCommand *cmds = commands.constData(); QPainter painter( this ); for ( int i = 0; i < numCommands; i++ ) qwtExecCommand( &painter, cmds[i], RenderHints(), QTransform() ); painter.end(); } qsstv_9.2.6/qwt/qwt_graphic.h0000664000175000017500000001312413203343610014722 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GRAPHIC_H #define QWT_GRAPHIC_H #include "qwt_global.h" #include "qwt_null_paintdevice.h" #include #include #include class QwtPainterCommand; /*! \brief A paint device for scalable graphics QwtGraphic is the representation of a graphic that is tailored for scalability. Like QPicture it will be initialized by QPainter operations and replayed later to any target paint device. While the usual image representations QImage and QPixmap are not scalable Qt offers two paint devices, that might be candidates for representing a vector graphic: - QPicture\n Unfortunately QPicture had been forgotten, when Qt4 introduced floating point based render engines. Its API is still on integers, what make it unusable for proper scaling. - QSvgRenderer/QSvgGenerator\n Unfortunately QSvgRenderer hides to much information about its nodes in internal APIs, that are necessary proper layout calculations. Also it is derived from QObject and can't be copied like QImage/QPixmap. Also QSvgRenderer/QSvgGenerator are no complete SVG implementations with a questionable future in Qt 5. QwtGraphic maps all scalable drawing primitives to a QPainterPath and stores them together with the painter state changes ( pen, brush, transformation ... ) in a list of QwtPaintCommands. For being a complete QPaintDevice it also stores pixmaps or images, what is somehow against the idea of the class, because these objects can be scaled without a loss in quality. The main issue about scaling a QwtGraphic object are the pens used for drawing the outlines of the painter paths. While non cosmetic pens ( QPen::isCosmetic() ) are scaled with the same ratio as the path, cosmetic pens have a fixed width. A graphic might have paths with different pens - cosmetic and non-cosmetic. QwtGraphic caches 2 different rectangles: - control point rectangle\n The control point rectangle is the bounding rectangle of all control point rectangles of the painter paths, or the target rectangle of the pixmaps/images. - bounding rectangle\n The bounding rectangle extends the control point rectangle by what is needed for rendering the outline with an unscaled pen. Because the offset for drawing the outline depends on the shape of the painter path ( the peak of a triangle is different than the flat side ) scaling with a fixed aspect ratio always needs to be calculated from the control point rectangle. \sa QwtPainterCommand */ class QWT_EXPORT QwtGraphic: public QwtNullPaintDevice { public: /*! Hint how to render a graphic \sa setRenderHint(), testRenderHint() */ enum RenderHint { /*! When RenderPensUnscaled is set non cosmetic pens are painted unscaled - like cosmetic pens. The difference to using cosmetic pens is, when the graphic is rendered to a document in a scalable vector format ( PDF, SVG ): the width of non cosmetic pens will be scaled by the document viewer. */ RenderPensUnscaled = 0x1 }; /*! \brief Render hints The default setting is to disable all hints */ typedef QFlags RenderHints; QwtGraphic(); QwtGraphic( const QwtGraphic & ); virtual ~QwtGraphic(); QwtGraphic& operator=( const QwtGraphic & ); void reset(); bool isNull() const; bool isEmpty() const; void render( QPainter * ) const; void render( QPainter *, const QSizeF &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; void render( QPainter *, const QRectF &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; void render( QPainter *, const QPointF &, Qt::Alignment = Qt::AlignTop | Qt::AlignLeft ) const; QPixmap toPixmap() const; QPixmap toPixmap( const QSize &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; QImage toImage() const; QImage toImage( const QSize &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; QRectF scaledBoundingRect( double sx, double sy ) const; QRectF boundingRect() const; QRectF controlPointRect() const; const QVector< QwtPainterCommand > &commands() const; void setCommands( QVector< QwtPainterCommand > & ); void setDefaultSize( const QSizeF & ); QSizeF defaultSize() const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; protected: virtual QSize sizeMetrics() const; virtual void drawPath( const QPainterPath & ); virtual void drawPixmap( const QRectF &, const QPixmap &, const QRectF & ); virtual void drawImage( const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); virtual void updateState( const QPaintEngineState &state ); private: void updateBoundingRect( const QRectF & ); void updateControlPointRect( const QRectF & ); class PathInfo; class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtGraphic::RenderHints ) Q_DECLARE_METATYPE( QwtGraphic ) #endif qsstv_9.2.6/qwt/qwt_interval.cpp0000664000175000017500000002037013203343610015465 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval.h" #include "qwt_math.h" #include /*! \brief Normalize the limits of the interval If maxValue() < minValue() the limits will be inverted. \return Normalized interval \sa isValid(), inverted() */ QwtInterval QwtInterval::normalized() const { if ( d_minValue > d_maxValue ) { return inverted(); } if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum ) { return inverted(); } return *this; } /*! Invert the limits of the interval \return Inverted interval \sa normalized() */ QwtInterval QwtInterval::inverted() const { BorderFlags borderFlags = IncludeBorders; if ( d_borderFlags & ExcludeMinimum ) borderFlags |= ExcludeMaximum; if ( d_borderFlags & ExcludeMaximum ) borderFlags |= ExcludeMinimum; return QwtInterval( d_maxValue, d_minValue, borderFlags ); } /*! Test if a value is inside an interval \param value Value \return true, if value >= minValue() && value <= maxValue() */ bool QwtInterval::contains( double value ) const { if ( !isValid() ) return false; if ( value < d_minValue || value > d_maxValue ) return false; if ( value == d_minValue && d_borderFlags & ExcludeMinimum ) return false; if ( value == d_maxValue && d_borderFlags & ExcludeMaximum ) return false; return true; } //! Unite 2 intervals QwtInterval QwtInterval::unite( const QwtInterval &other ) const { /* If one of the intervals is invalid return the other one. If both are invalid return an invalid default interval */ if ( !isValid() ) { if ( !other.isValid() ) return QwtInterval(); else return other; } if ( !other.isValid() ) return *this; QwtInterval united; BorderFlags flags = IncludeBorders; // minimum if ( d_minValue < other.minValue() ) { united.setMinValue( d_minValue ); flags &= d_borderFlags & ExcludeMinimum; } else if ( other.minValue() < d_minValue ) { united.setMinValue( other.minValue() ); flags &= other.borderFlags() & ExcludeMinimum; } else // d_minValue == other.minValue() { united.setMinValue( d_minValue ); flags &= ( d_borderFlags & other.borderFlags() ) & ExcludeMinimum; } // maximum if ( d_maxValue > other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & ExcludeMaximum; } else if ( other.maxValue() > d_maxValue ) { united.setMaxValue( other.maxValue() ); flags &= other.borderFlags() & ExcludeMaximum; } else // d_maxValue == other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum; } united.setBorderFlags( flags ); return united; } /*! \brief Intersect 2 intervals \param other Interval to be intersect with \return Intersection */ QwtInterval QwtInterval::intersect( const QwtInterval &other ) const { if ( !other.isValid() || !isValid() ) return QwtInterval(); QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMinimum ) qSwap( i1, i2 ); } if ( i1.maxValue() < i2.minValue() ) { return QwtInterval(); } if ( i1.maxValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMaximum || i2.borderFlags() & ExcludeMinimum ) { return QwtInterval(); } } QwtInterval intersected; BorderFlags flags = IncludeBorders; intersected.setMinValue( i2.minValue() ); flags |= i2.borderFlags() & ExcludeMinimum; if ( i1.maxValue() < i2.maxValue() ) { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & ExcludeMaximum; } else if ( i2.maxValue() < i1.maxValue() ) { intersected.setMaxValue( i2.maxValue() ); flags |= i2.borderFlags() & ExcludeMaximum; } else // i1.maxValue() == i2.maxValue() { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum; } intersected.setBorderFlags( flags ); return intersected; } /*! \brief Unite this interval with the given interval. \param other Interval to be united with \return This interval */ QwtInterval& QwtInterval::operator|=( const QwtInterval &other ) { *this = *this | other; return *this; } /*! \brief Intersect this interval with the given interval. \param other Interval to be intersected with \return This interval */ QwtInterval& QwtInterval::operator&=( const QwtInterval &other ) { *this = *this & other; return *this; } /*! \brief Test if two intervals overlap \param other Interval \return True, when the intervals are intersecting */ bool QwtInterval::intersects( const QwtInterval &other ) const { if ( !isValid() || !other.isValid() ) return false; QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() && i1.borderFlags() & ExcludeMinimum ) { qSwap( i1, i2 ); } if ( i1.maxValue() > i2.minValue() ) { return true; } if ( i1.maxValue() == i2.minValue() ) { return !( ( i1.borderFlags() & ExcludeMaximum ) || ( i2.borderFlags() & ExcludeMinimum ) ); } return false; } /*! Adjust the limit that is closer to value, so that value becomes the center of the interval. \param value Center \return Interval with value as center */ QwtInterval QwtInterval::symmetrize( double value ) const { if ( !isValid() ) return *this; const double delta = qMax( qAbs( value - d_maxValue ), qAbs( value - d_minValue ) ); return QwtInterval( value - delta, value + delta ); } /*! Limit the interval, keeping the border modes \param lowerBound Lower limit \param upperBound Upper limit \return Limited interval */ QwtInterval QwtInterval::limited( double lowerBound, double upperBound ) const { if ( !isValid() || lowerBound > upperBound ) return QwtInterval(); double minValue = qMax( d_minValue, lowerBound ); minValue = qMin( minValue, upperBound ); double maxValue = qMax( d_maxValue, lowerBound ); maxValue = qMin( maxValue, upperBound ); return QwtInterval( minValue, maxValue, d_borderFlags ); } /*! \brief Extend the interval If value is below minValue(), value becomes the lower limit. If value is above maxValue(), value becomes the upper limit. extend() has no effect for invalid intervals \param value Value \return extended interval \sa isValid() */ QwtInterval QwtInterval::extend( double value ) const { if ( !isValid() ) return *this; return QwtInterval( qMin( value, d_minValue ), qMax( value, d_maxValue ), d_borderFlags ); } /*! Extend an interval \param value Value \return Reference of the extended interval \sa extend() */ QwtInterval& QwtInterval::operator|=( double value ) { *this = *this | value; return *this; } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtInterval &interval ) { const int flags = interval.borderFlags(); debug.nospace() << "QwtInterval(" << ( ( flags & QwtInterval::ExcludeMinimum ) ? "]" : "[" ) << interval.minValue() << "," << interval.maxValue() << ( ( flags & QwtInterval::ExcludeMaximum ) ? "[" : "]" ) << ")"; return debug.space(); } #endif qsstv_9.2.6/qwt/qwt_interval.h0000664000175000017500000001577613203343610015150 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_H #define QWT_INTERVAL_H #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing an interval The interval is represented by 2 doubles, the lower and the upper limit. */ class QWT_EXPORT QwtInterval { public: /*! Flag indicating if a border is included or excluded \sa setBorderFlags(), borderFlags() */ enum BorderFlag { //! Min/Max values are inside the interval IncludeBorders = 0x00, //! Min value is not included in the interval ExcludeMinimum = 0x01, //! Max value is not included in the interval ExcludeMaximum = 0x02, //! Min/Max values are not included in the interval ExcludeBorders = ExcludeMinimum | ExcludeMaximum }; //! Border flags typedef QFlags BorderFlags; QwtInterval(); QwtInterval( double minValue, double maxValue, BorderFlags = IncludeBorders ); void setInterval( double minValue, double maxValue, BorderFlags = IncludeBorders ); QwtInterval normalized() const; QwtInterval inverted() const; QwtInterval limited( double minValue, double maxValue ) const; bool operator==( const QwtInterval & ) const; bool operator!=( const QwtInterval & ) const; void setBorderFlags( BorderFlags ); BorderFlags borderFlags() const; double minValue() const; double maxValue() const; double width() const; void setMinValue( double ); void setMaxValue( double ); bool contains( double value ) const; bool intersects( const QwtInterval & ) const; QwtInterval intersect( const QwtInterval & ) const; QwtInterval unite( const QwtInterval & ) const; QwtInterval operator|( const QwtInterval & ) const; QwtInterval operator&( const QwtInterval & ) const; QwtInterval &operator|=( const QwtInterval & ); QwtInterval &operator&=( const QwtInterval & ); QwtInterval extend( double value ) const; QwtInterval operator|( double ) const; QwtInterval &operator|=( double ); bool isValid() const; bool isNull() const; void invalidate(); QwtInterval symmetrize( double value ) const; private: double d_minValue; double d_maxValue; BorderFlags d_borderFlags; }; Q_DECLARE_TYPEINFO(QwtInterval, Q_MOVABLE_TYPE); /*! \brief Default Constructor Creates an invalid interval [0.0, -1.0] \sa setInterval(), isValid() */ inline QwtInterval::QwtInterval(): d_minValue( 0.0 ), d_maxValue( -1.0 ), d_borderFlags( IncludeBorders ) { } /*! Constructor Build an interval with from min/max values \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline QwtInterval::QwtInterval( double minValue, double maxValue, BorderFlags borderFlags ): d_minValue( minValue ), d_maxValue( maxValue ), d_borderFlags( borderFlags ) { } /*! Assign the limits of the interval \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline void QwtInterval::setInterval( double minValue, double maxValue, BorderFlags borderFlags ) { d_minValue = minValue; d_maxValue = maxValue; d_borderFlags = borderFlags; } /*! Change the border flags \param borderFlags Or'd BorderMode flags \sa borderFlags() */ inline void QwtInterval::setBorderFlags( BorderFlags borderFlags ) { d_borderFlags = borderFlags; } /*! \return Border flags \sa setBorderFlags() */ inline QwtInterval::BorderFlags QwtInterval::borderFlags() const { return d_borderFlags; } /*! Assign the lower limit of the interval \param minValue Minimum value */ inline void QwtInterval::setMinValue( double minValue ) { d_minValue = minValue; } /*! Assign the upper limit of the interval \param maxValue Maximum value */ inline void QwtInterval::setMaxValue( double maxValue ) { d_maxValue = maxValue; } //! \return Lower limit of the interval inline double QwtInterval::minValue() const { return d_minValue; } //! \return Upper limit of the interval inline double QwtInterval::maxValue() const { return d_maxValue; } /*! A interval is valid when minValue() <= maxValue(). In case of QwtInterval::ExcludeBorders it is true when minValue() < maxValue() \return True, when the interval is valid */ inline bool QwtInterval::isValid() const { if ( ( d_borderFlags & ExcludeBorders ) == 0 ) return d_minValue <= d_maxValue; else return d_minValue < d_maxValue; } /*! \brief Return the width of an interval The width of invalid intervals is 0.0, otherwise the result is maxValue() - minValue(). \return Interval width \sa isValid() */ inline double QwtInterval::width() const { return isValid() ? ( d_maxValue - d_minValue ) : 0.0; } /*! \brief Intersection of two intervals \param other Interval to intersect with \return Intersection of this and other \sa intersect() */ inline QwtInterval QwtInterval::operator&( const QwtInterval &other ) const { return intersect( other ); } /*! Union of two intervals \param other Interval to unite with \return Union of this and other \sa unite() */ inline QwtInterval QwtInterval::operator|( const QwtInterval &other ) const { return unite( other ); } /*! \brief Compare two intervals \param other Interval to compare with \return True, when this and other are equal */ inline bool QwtInterval::operator==( const QwtInterval &other ) const { return ( d_minValue == other.d_minValue ) && ( d_maxValue == other.d_maxValue ) && ( d_borderFlags == other.d_borderFlags ); } /*! \brief Compare two intervals \param other Interval to compare with \return True, when this and other are not equal */ inline bool QwtInterval::operator!=( const QwtInterval &other ) const { return ( !( *this == other ) ); } /*! Extend an interval \param value Value \return Extended interval \sa extend() */ inline QwtInterval QwtInterval::operator|( double value ) const { return extend( value ); } //! \return true, if isValid() && (minValue() >= maxValue()) inline bool QwtInterval::isNull() const { return isValid() && d_minValue >= d_maxValue; } /*! Invalidate the interval The limits are set to interval [0.0, -1.0] \sa isValid() */ inline void QwtInterval::invalidate() { d_minValue = 0.0; d_maxValue = -1.0; } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtInterval::BorderFlags ) Q_DECLARE_METATYPE( QwtInterval ) #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtInterval & ); #endif #endif qsstv_9.2.6/qwt/qwt_interval_symbol.cpp0000664000175000017500000001754713203343610017066 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval_symbol.h" #include "qwt_painter.h" #include "qwt_math.h" #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFastSin(x) qSin(x) #define qFastCos(x) qCos(x) #endif class QwtIntervalSymbol::PrivateData { public: PrivateData(): style( QwtIntervalSymbol::NoSymbol ), width( 6 ) { } bool operator==( const PrivateData &other ) const { return ( style == other.style ) && ( width == other.width ) && ( brush == other.brush ) && ( pen == other.pen ); } QwtIntervalSymbol::Style style; int width; QPen pen; QBrush brush; }; /*! Constructor \param style Style of the symbol \sa setStyle(), style(), Style */ QwtIntervalSymbol::QwtIntervalSymbol( Style style ) { d_data = new PrivateData(); d_data->style = style; } //! Copy constructor QwtIntervalSymbol::QwtIntervalSymbol( const QwtIntervalSymbol &other ) { d_data = new PrivateData(); *d_data = *other.d_data; } //! Destructor QwtIntervalSymbol::~QwtIntervalSymbol() { delete d_data; } //! \brief Assignment operator QwtIntervalSymbol &QwtIntervalSymbol::operator=( const QwtIntervalSymbol &other ) { *d_data = *other.d_data; return *this; } //! \brief Compare two symbols bool QwtIntervalSymbol::operator==( const QwtIntervalSymbol &other ) const { return *d_data == *other.d_data; } //! \brief Compare two symbols bool QwtIntervalSymbol::operator!=( const QwtIntervalSymbol &other ) const { return !( *d_data == *other.d_data ); } /*! Specify the symbol style \param style Style \sa style(), Style */ void QwtIntervalSymbol::setStyle( Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtIntervalSymbol::Style QwtIntervalSymbol::style() const { return d_data->style; } /*! Specify the width of the symbol It is used depending on the style. \param width Width \sa width(), setStyle() */ void QwtIntervalSymbol::setWidth( int width ) { d_data->width = width; } /*! \return Width of the symbol. \sa setWidth(), setStyle() */ int QwtIntervalSymbol::width() const { return d_data->width; } /*! \brief Assign a brush The brush is used for the Box style. \param brush Brush \sa brush() */ void QwtIntervalSymbol::setBrush( const QBrush &brush ) { d_data->brush = brush; } /*! \return Brush \sa setBrush() */ const QBrush& QwtIntervalSymbol::brush() const { return d_data->brush; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtIntervalSymbol::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen \param pen Pen \sa pen(), setBrush() */ void QwtIntervalSymbol::setPen( const QPen &pen ) { d_data->pen = pen; } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtIntervalSymbol::pen() const { return d_data->pen; } /*! Draw a symbol depending on its style \param painter Painter \param orientation Orientation \param from Start point of the interval in target device coordinates \param to End point of the interval in target device coordinates \sa setStyle() */ void QwtIntervalSymbol::draw( QPainter *painter, Qt::Orientation orientation, const QPointF &from, const QPointF &to ) const { const qreal pw = qMax( painter->pen().widthF(), qreal( 1.0 ) ); QPointF p1 = from; QPointF p2 = to; if ( QwtPainter::roundingAlignment( painter ) ) { p1 = p1.toPoint(); p2 = p2.toPoint(); } switch ( d_data->style ) { case QwtIntervalSymbol::Bar: { QwtPainter::drawLine( painter, p1, p2 ); if ( d_data->width > pw ) { if ( ( orientation == Qt::Horizontal ) && ( p1.y() == p2.y() ) ) { const double sw = d_data->width; const double y = p1.y() - sw / 2; QwtPainter::drawLine( painter, p1.x(), y, p1.x(), y + sw ); QwtPainter::drawLine( painter, p2.x(), y, p2.x(), y + sw ); } else if ( ( orientation == Qt::Vertical ) && ( p1.x() == p2.x() ) ) { const double sw = d_data->width; const double x = p1.x() - sw / 2; QwtPainter::drawLine( painter, x, p1.y(), x + sw, p1.y() ); QwtPainter::drawLine( painter, x, p2.y(), x + sw, p2.y() ); } else { const double sw = d_data->width; const double dx = p2.x() - p1.x(); const double dy = p2.y() - p1.y(); const double angle = qAtan2( dy, dx ) + M_PI_2; double dw2 = sw / 2.0; const double cx = qFastCos( angle ) * dw2; const double sy = qFastSin( angle ) * dw2; QwtPainter::drawLine( painter, p1.x() - cx, p1.y() - sy, p1.x() + cx, p1.y() + sy ); QwtPainter::drawLine( painter, p2.x() - cx, p2.y() - sy, p2.x() + cx, p2.y() + sy ); } } break; } case QwtIntervalSymbol::Box: { if ( d_data->width <= pw ) { QwtPainter::drawLine( painter, p1, p2 ); } else { if ( ( orientation == Qt::Horizontal ) && ( p1.y() == p2.y() ) ) { const double sw = d_data->width; const double y = p1.y() - d_data->width / 2; QwtPainter::drawRect( painter, p1.x(), y, p2.x() - p1.x(), sw ); } else if ( ( orientation == Qt::Vertical ) && ( p1.x() == p2.x() ) ) { const double sw = d_data->width; const double x = p1.x() - d_data->width / 2; QwtPainter::drawRect( painter, x, p1.y(), sw, p2.y() - p1.y() ); } else { const double sw = d_data->width; const double dx = p2.x() - p1.x(); const double dy = p2.y() - p1.y(); const double angle = qAtan2( dy, dx ) + M_PI_2; double dw2 = sw / 2.0; const double cx = qFastCos( angle ) * dw2; const double sy = qFastSin( angle ) * dw2; QPolygonF polygon; polygon += QPointF( p1.x() - cx, p1.y() - sy ); polygon += QPointF( p1.x() + cx, p1.y() + sy ); polygon += QPointF( p2.x() + cx, p2.y() + sy ); polygon += QPointF( p2.x() - cx, p2.y() - sy ); QwtPainter::drawPolygon( painter, polygon ); } } break; } default:; } } qsstv_9.2.6/qwt/qwt_interval_symbol.h0000664000175000017500000000431413203343610016517 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_SYMBOL_H #define QWT_INTERVAL_SYMBOL_H #include "qwt_global.h" #include #include class QPainter; class QRect; class QPointF; /*! \brief A drawing primitive for displaying an interval like an error bar \sa QwtPlotIntervalCurve */ class QWT_EXPORT QwtIntervalSymbol { public: //! Symbol style enum Style { //! No Style. The symbol cannot be drawn. NoSymbol = -1, /*! The symbol displays a line with caps at the beginning/end. The size of the caps depends on the symbol width(). */ Bar, /*! The symbol displays a plain rectangle using pen() and brush(). The size of the rectangle depends on the translated interval and the width(), */ Box, /*! Styles >= UserSymbol are reserved for derived classes of QwtIntervalSymbol that overload draw() with additional application specific symbol types. */ UserSymbol = 1000 }; public: QwtIntervalSymbol( Style = NoSymbol ); QwtIntervalSymbol( const QwtIntervalSymbol & ); virtual ~QwtIntervalSymbol(); QwtIntervalSymbol &operator=( const QwtIntervalSymbol & ); bool operator==( const QwtIntervalSymbol & ) const; bool operator!=( const QwtIntervalSymbol & ) const; void setWidth( int ); int width() const; void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; virtual void draw( QPainter *, Qt::Orientation, const QPointF& from, const QPointF& to ) const; private: class PrivateData; PrivateData* d_data; }; #endif qsstv_9.2.6/qwt/qwt_knob.cpp0000664000175000017500000004771613203343610014607 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_knob.h" #include "qwt_round_scale_draw.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFabs(x) ::fabs(x) #define qFastCos(x) qCos(x) #define qFastSin(x) qSin(x) #endif static QSize qwtKnobSizeHint( const QwtKnob *knob, int min ) { int knobWidth = knob->knobWidth(); if ( knobWidth <= 0 ) knobWidth = qMax( 3 * knob->markerSize(), min ); // Add the scale radial thickness to the knobWidth const int extent = qCeil( knob->scaleDraw()->extent( knob->font() ) ); const int d = 2 * ( extent + 4 ) + knobWidth; int left, right, top, bottom; knob->getContentsMargins( &left, &top, &right, &bottom ); return QSize( d + left + right, d + top + bottom ); } static inline double qwtToScaleAngle( double angle ) { // the map is counter clockwise with the origin // at 90° using angles from -180° -> 180° double a = 90.0 - angle; if ( a <= -180.0 ) a += 360.0; else if ( a >= 180.0 ) a -= 360.0; return a; } static double qwtToDegrees( double value ) { return qwtNormalizeDegrees( 90.0 - value ); } class QwtKnob::PrivateData { public: PrivateData(): knobStyle( QwtKnob::Raised ), markerStyle( QwtKnob::Notch ), borderWidth( 2 ), borderDist( 4 ), scaleDist( 4 ), maxScaleTicks( 11 ), knobWidth( 0 ), alignment( Qt::AlignCenter ), markerSize( 8 ), totalAngle( 270.0 ), mouseOffset( 0.0 ) { } QwtKnob::KnobStyle knobStyle; QwtKnob::MarkerStyle markerStyle; int borderWidth; int borderDist; int scaleDist; int maxScaleTicks; int knobWidth; Qt::Alignment alignment; int markerSize; double totalAngle; double mouseOffset; }; /*! \brief Constructor Construct a knob with an angle of 270°. The style is QwtKnob::Raised and the marker style is QwtKnob::Notch. The width of the knob is set to 50 pixels. \param parent Parent widget \sa setTotalAngle() */ QwtKnob::QwtKnob( QWidget* parent ): QwtAbstractSlider( parent ) { d_data = new PrivateData; setScaleDraw( new QwtRoundScaleDraw() ); setTotalAngle( 270.0 ); setScale( 0.0, 10.0 ); setValue( 0.0 ); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); } //! Destructor QwtKnob::~QwtKnob() { delete d_data; } /*! \brief Set the knob type \param knobStyle Knob type \sa knobStyle(), setBorderWidth() */ void QwtKnob::setKnobStyle( KnobStyle knobStyle ) { if ( d_data->knobStyle != knobStyle ) { d_data->knobStyle = knobStyle; update(); } } /*! \return Marker type of the knob \sa setKnobStyle(), setBorderWidth() */ QwtKnob::KnobStyle QwtKnob::knobStyle() const { return d_data->knobStyle; } /*! \brief Set the marker type of the knob \param markerStyle Marker type \sa markerStyle(), setMarkerSize() */ void QwtKnob::setMarkerStyle( MarkerStyle markerStyle ) { if ( d_data->markerStyle != markerStyle ) { d_data->markerStyle = markerStyle; update(); } } /*! \return Marker type of the knob \sa setMarkerStyle(), setMarkerSize() */ QwtKnob::MarkerStyle QwtKnob::markerStyle() const { return d_data->markerStyle; } /*! \brief Set the total angle by which the knob can be turned \param angle Angle in degrees. The angle has to be between [10, 360] degrees. Angles above 360 ( so that the knob can be turned several times around its axis ) have to be set using setNumTurns(). The default angle is 270 degrees. \sa totalAngle(), setNumTurns() */ void QwtKnob::setTotalAngle ( double angle ) { angle = qBound( 10.0, angle, 360.0 ); if ( angle != d_data->totalAngle ) { d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); updateGeometry(); update(); } } /*! \return the total angle \sa setTotalAngle(), setNumTurns(), numTurns() */ double QwtKnob::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the number of turns When numTurns > 1 the knob can be turned several times around its axis - otherwise the total angle is floored to 360°. \sa numTurns(), totalAngle(), setTotalAngle() */ void QwtKnob::setNumTurns( int numTurns ) { numTurns = qMax( numTurns, 1 ); if ( numTurns == 1 && d_data->totalAngle <= 360.0 ) return; const double angle = numTurns * 360.0; if ( angle != d_data->totalAngle ) { d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); updateGeometry(); update(); } } /*! \return Number of turns. When the total angle is below 360° numTurns() is ceiled to 1. \sa setNumTurns(), setTotalAngle(), totalAngle() */ int QwtKnob::numTurns() const { return qCeil( d_data->totalAngle / 360.0 ); } /*! Change the scale draw of the knob For changing the labels of the scales, it is necessary to derive from QwtRoundScaleDraw and overload QwtRoundScaleDraw::label(). \sa scaleDraw() */ void QwtKnob::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); setTotalAngle( d_data->totalAngle ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ const QwtRoundScaleDraw *QwtKnob::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ QwtRoundScaleDraw *QwtKnob::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! Calculate the bounding rectangle of the knob without the scale \return Bounding rectangle of the knob \sa knobWidth(), alignment(), QWidget::contentsRect() */ QRect QwtKnob::knobRect() const { const QRect cr = contentsRect(); const int extent = qCeil( scaleDraw()->extent( font() ) ); const int d = extent + d_data->scaleDist; int w = d_data->knobWidth; if ( w <= 0 ) { const int dim = qMin( cr.width(), cr.height() ); w = dim - 2 * ( d ); w = qMax( 0, w ); } QRect r( 0, 0, w, w ); if ( d_data->alignment & Qt::AlignLeft ) { r.moveLeft( cr.left() + d ); } else if ( d_data->alignment & Qt::AlignRight ) { r.moveRight( cr.right() - d ); } else { r.moveCenter( QPoint( cr.center().x(), r.center().y() ) ); } if ( d_data->alignment & Qt::AlignTop ) { r.moveTop( cr.top() + d ); } else if ( d_data->alignment & Qt::AlignBottom ) { r.moveBottom( cr.bottom() - d ); } else { r.moveCenter( QPoint( r.center().x(), cr.center().y() ) ); } return r; } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when pos is inside the circle of the knob. \sa scrolledTo() */ bool QwtKnob::isScrollPosition( const QPoint &pos ) const { const QRect kr = knobRect(); const QRegion region( kr, QRegion::Ellipse ); if ( region.contains( pos ) && ( pos != kr.center() ) ) { const double angle = QLineF( kr.center(), pos ).angle(); const double valueAngle = qwtToDegrees( transform( value() ) ); d_data->mouseOffset = qwtNormalizeDegrees( angle - valueAngle ); return true; } return false; } /*! \brief Determine the value for a new position of the mouse \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtKnob::scrolledTo( const QPoint &pos ) const { double angle = QLineF( rect().center(), pos ).angle(); angle = qwtNormalizeDegrees( angle - d_data->mouseOffset ); if ( scaleMap().pDist() > 360.0 ) { angle = qwtToDegrees( angle ); const double v = transform( value() ); int numTurns = qFloor( ( v - scaleMap().p1() ) / 360.0 ); double valueAngle = qwtNormalizeDegrees( v ); if ( qAbs( valueAngle - angle ) > 180.0 ) { numTurns += ( angle > valueAngle ) ? -1 : 1; } angle += scaleMap().p1() + numTurns * 360.0; if ( !wrapping() ) { const double boundedAngle = qBound( scaleMap().p1(), angle, scaleMap().p2() ); d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } } else { angle = qwtToScaleAngle( angle ); const double boundedAngle = qBound( scaleMap().p1(), angle, scaleMap().p2() ); if ( !wrapping() ) d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } return invTransform( angle ); } /*! Handle QEvent::StyleChange and QEvent::FontChange; \param event Change event */ void QwtKnob::changeEvent( QEvent *event ) { switch( event->type() ) { case QEvent::StyleChange: case QEvent::FontChange: { updateGeometry(); update(); break; } default: break; } } /*! Repaint the knob \param event Paint event */ void QwtKnob::paintEvent( QPaintEvent *event ) { const QRectF knobRect = this->knobRect(); QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); painter.setRenderHint( QPainter::Antialiasing, true ); if ( !knobRect.contains( event->region().boundingRect() ) ) { scaleDraw()->setRadius( 0.5 * knobRect.width() + d_data->scaleDist ); scaleDraw()->moveCenter( knobRect.center() ); scaleDraw()->draw( &painter, palette() ); } drawKnob( &painter, knobRect ); drawMarker( &painter, knobRect, qwtNormalizeDegrees( transform( value() ) ) ); painter.setRenderHint( QPainter::Antialiasing, false ); if ( hasFocus() ) drawFocusIndicator( &painter ); } /*! \brief Draw the knob \param painter painter \param knobRect Bounding rectangle of the knob (without scale) */ void QwtKnob::drawKnob( QPainter *painter, const QRectF &knobRect ) const { double dim = qMin( knobRect.width(), knobRect.height() ); dim -= d_data->borderWidth * 0.5; QRectF aRect( 0, 0, dim, dim ); aRect.moveCenter( knobRect.center() ); QPen pen( Qt::NoPen ); if ( d_data->borderWidth > 0 ) { QColor c1 = palette().color( QPalette::Light ); QColor c2 = palette().color( QPalette::Dark ); QLinearGradient gradient( aRect.topLeft(), aRect.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 0.3, c1 ); gradient.setColorAt( 0.7, c2 ); gradient.setColorAt( 1.0, c2 ); pen = QPen( gradient, d_data->borderWidth ); } QBrush brush; switch( d_data->knobStyle ) { case QwtKnob::Raised: { double off = 0.3 * knobRect.width(); QRadialGradient gradient( knobRect.center(), knobRect.width(), knobRect.topLeft() + QPointF( off, off ) ); gradient.setColorAt( 0.0, palette().color( QPalette::Midlight ) ); gradient.setColorAt( 1.0, palette().color( QPalette::Button ) ); brush = QBrush( gradient ); break; } case QwtKnob::Styled: { QRadialGradient gradient(knobRect.center().x() - knobRect.width() / 3, knobRect.center().y() - knobRect.height() / 2, knobRect.width() * 1.3, knobRect.center().x(), knobRect.center().y() - knobRect.height() / 2); const QColor c = palette().color( QPalette::Button ); gradient.setColorAt(0, c.lighter(110)); gradient.setColorAt(qreal(0.5), c); gradient.setColorAt(qreal(0.501), c.darker(102)); gradient.setColorAt(1, c.darker(115)); brush = QBrush( gradient ); break; } case QwtKnob::Sunken: { QLinearGradient gradient( knobRect.topLeft(), knobRect.bottomRight() ); gradient.setColorAt( 0.0, palette().color( QPalette::Mid ) ); gradient.setColorAt( 0.5, palette().color( QPalette::Button ) ); gradient.setColorAt( 1.0, palette().color( QPalette::Midlight ) ); brush = QBrush( gradient ); break; } case QwtKnob::Flat: default: brush = palette().brush( QPalette::Button ); } painter->setPen( pen ); painter->setBrush( brush ); painter->drawEllipse( aRect ); } /*! \brief Draw the marker at the knob's front \param painter Painter \param rect Bounding rectangle of the knob without scale \param angle Angle of the marker in degrees ( clockwise, 0 at the 12 o'clock position ) */ void QwtKnob::drawMarker( QPainter *painter, const QRectF &rect, double angle ) const { if ( d_data->markerStyle == NoMarker || !isValid() ) return; const double radians = qwtRadians( angle ); const double sinA = -qFastSin( radians ); const double cosA = qFastCos( radians ); const double xm = rect.center().x(); const double ym = rect.center().y(); const double margin = 4.0; double radius = 0.5 * ( rect.width() - d_data->borderWidth ) - margin; if ( radius < 1.0 ) radius = 1.0; int markerSize = d_data->markerSize; if ( markerSize <= 0 ) markerSize = qRound( 0.4 * radius ); switch ( d_data->markerStyle ) { case Notch: case Nub: { const double dotWidth = qMin( double( markerSize ), radius); const double dotCenterDist = radius - 0.5 * dotWidth; if ( dotCenterDist > 0.0 ) { const QPointF center( xm - sinA * dotCenterDist, ym - cosA * dotCenterDist ); QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth ); ellipse.moveCenter( center ); QColor c1 = palette().color( QPalette::Light ); QColor c2 = palette().color( QPalette::Mid ); if ( d_data->markerStyle == Notch ) qSwap( c1, c2 ); QLinearGradient gradient( ellipse.topLeft(), ellipse.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 1.0, c2 ); painter->setPen( Qt::NoPen ); painter->setBrush( gradient ); painter->drawEllipse( ellipse ); } break; } case Dot: { const double dotWidth = qMin( double( markerSize ), radius); const double dotCenterDist = radius - 0.5 * dotWidth; if ( dotCenterDist > 0.0 ) { const QPointF center( xm - sinA * dotCenterDist, ym - cosA * dotCenterDist ); QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth ); ellipse.moveCenter( center ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().color( QPalette::ButtonText ) ); painter->drawEllipse( ellipse ); } break; } case Tick: { const double rb = qMax( radius - markerSize, 1.0 ); const double re = radius; const QLineF line( xm - sinA * rb, ym - cosA * rb, xm - sinA * re, ym - cosA * re ); QPen pen( palette().color( QPalette::ButtonText ), 0 ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->drawLine ( line ); break; } case Triangle: { const double rb = qMax( radius - markerSize, 1.0 ); const double re = radius; painter->translate( rect.center() ); painter->rotate( angle - 90.0 ); QPolygonF polygon; polygon += QPointF( re, 0.0 ); polygon += QPointF( rb, 0.5 * ( re - rb ) ); polygon += QPointF( rb, -0.5 * ( re - rb ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().color( QPalette::ButtonText ) ); painter->drawPolygon( polygon ); painter->resetTransform(); break; } default: break; } } /*! Draw the focus indicator \param painter Painter */ void QwtKnob::drawFocusIndicator( QPainter *painter ) const { const QRect cr = contentsRect(); int w = d_data->knobWidth; if ( w <= 0 ) { w = qMin( cr.width(), cr.height() ); } else { const int extent = qCeil( scaleDraw()->extent( font() ) ); w += 2 * ( extent + d_data->scaleDist ); } QRect focusRect( 0, 0, w, w ); focusRect.moveCenter( cr.center() ); QwtPainter::drawFocusRect( painter, this, focusRect ); } /*! \brief Set the alignment of the knob Similar to a QLabel::alignment() the flags decide how to align the knob inside of contentsRect(). The default setting is Qt::AlignCenter \param alignment Or'd alignment flags \sa alignment(), setKnobWidth(), knobRect() */ void QwtKnob::setAlignment( Qt::Alignment alignment ) { if ( d_data->alignment != alignment ) { d_data->alignment = alignment; update(); } } /*! \return Alignment of the knob inside of contentsRect() \sa setAlignment(), knobWidth(), knobRect() */ Qt::Alignment QwtKnob::alignment() const { return d_data->alignment; } /*! \brief Change the knob's width. Setting a fixed value for the diameter of the knob is helpful for aligning several knobs in a row. \param width New width \sa knobWidth(), setAlignment() \note Modifies the sizePolicy() */ void QwtKnob::setKnobWidth( int width ) { width = qMax( width, 0 ); if ( width != d_data->knobWidth ) { QSizePolicy::Policy policy; if ( width > 0 ) policy = QSizePolicy::Minimum; else policy = QSizePolicy::MinimumExpanding; setSizePolicy( policy, policy ); d_data->knobWidth = width; updateGeometry(); update(); } } //! Return the width of the knob int QwtKnob::knobWidth() const { return d_data->knobWidth; } /*! \brief Set the knob's border width \param borderWidth new border width */ void QwtKnob::setBorderWidth( int borderWidth ) { d_data->borderWidth = qMax( borderWidth, 0 ); updateGeometry(); update(); } //! Return the border width int QwtKnob::borderWidth() const { return d_data->borderWidth; } /*! \brief Set the size of the marker When setting a size <= 0 the marker will automatically scaled to 40% of the radius of the knob. \sa markerSize(), markerStyle() */ void QwtKnob::setMarkerSize( int size ) { if ( d_data->markerSize != size ) { d_data->markerSize = size; update(); } } /*! \return Marker size \sa setMarkerSize() */ int QwtKnob::markerSize() const { return d_data->markerSize; } /*! \return sizeHint() */ QSize QwtKnob::sizeHint() const { const QSize hint = qwtKnobSizeHint( this, 50 ); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtKnob::minimumSizeHint() const { return qwtKnobSizeHint( this, 20 ); } qsstv_9.2.6/qwt/qwt_knob.h0000664000175000017500000001124013203343610014233 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_KNOB_H #define QWT_KNOB_H #include "qwt_global.h" #include "qwt_abstract_slider.h" class QwtRoundScaleDraw; /*! \brief The Knob Widget The QwtKnob widget imitates look and behavior of a volume knob on a radio. It looks similar to QDial - not to QwtDial. The value range of a knob might be divided into several turns. The layout of the knob depends on the knobWidth(). - width > 0 The diameter of the knob is fixed and the knob is aligned according to the alignment() flags inside of the contentsRect(). - width <= 0 The knob is extended to the minimum of width/height of the contentsRect() and aligned in the other direction according to alignment(). Setting a fixed knobWidth() is helpful to align several knobs with different scale labels. \image html knob.png */ class QWT_EXPORT QwtKnob: public QwtAbstractSlider { Q_OBJECT Q_ENUMS ( KnobStyle MarkerStyle ) Q_PROPERTY( KnobStyle knobStyle READ knobStyle WRITE setKnobStyle ) Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth ) Q_PROPERTY( Qt::Alignment alignment READ alignment WRITE setAlignment ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( int numTurns READ numTurns WRITE setNumTurns ) Q_PROPERTY( MarkerStyle markerStyle READ markerStyle WRITE setMarkerStyle ) Q_PROPERTY( int markerSize READ markerSize WRITE setMarkerSize ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) public: /*! \brief Style of the knob surface Depending on the KnobStyle the surface of the knob is filled from the brushes of the widget palette(). \sa setKnobStyle(), knobStyle() */ enum KnobStyle { //! Fill the knob with a brush from QPalette::Button. Flat, //! Build a gradient from QPalette::Midlight and QPalette::Button Raised, /*! Build a gradient from QPalette::Midlight, QPalette::Button and QPalette::Midlight */ Sunken, /*! Build a radial gradient from QPalette::Button like it is used for QDial in various Qt styles. */ Styled }; /*! \brief Marker type The marker indicates the current value on the knob The default setting is a Notch marker. \sa setMarkerStyle(), setMarkerSize() */ enum MarkerStyle { //! Don't paint any marker NoMarker = -1, //! Paint a single tick in QPalette::ButtonText color Tick, //! Paint a triangle in QPalette::ButtonText color Triangle, //! Paint a circle in QPalette::ButtonText color Dot, /*! Draw a raised ellipse with a gradient build from QPalette::Light and QPalette::Mid */ Nub, /*! Draw a sunken ellipse with a gradient build from QPalette::Light and QPalette::Mid */ Notch }; explicit QwtKnob( QWidget* parent = NULL ); virtual ~QwtKnob(); void setAlignment( Qt::Alignment ); Qt::Alignment alignment() const; void setKnobWidth( int ); int knobWidth() const; void setNumTurns( int ); int numTurns() const; void setTotalAngle ( double angle ); double totalAngle() const; void setKnobStyle( KnobStyle ); KnobStyle knobStyle() const; void setBorderWidth( int bw ); int borderWidth() const; void setMarkerStyle( MarkerStyle ); MarkerStyle markerStyle() const; void setMarkerSize( int ); int markerSize() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); const QwtRoundScaleDraw *scaleDraw() const; QwtRoundScaleDraw *scaleDraw(); QRect knobRect() const; protected: virtual void paintEvent( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void drawKnob( QPainter *, const QRectF & ) const; virtual void drawFocusIndicator( QPainter * ) const; virtual void drawMarker( QPainter *, const QRectF &, double arc ) const; virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_legend.cpp0000664000175000017500000005073413203343610015106 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend.h" #include "qwt_legend_label.h" #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include "qwt_plot_item.h" #include "qwt_painter.h" #include #include #include #include #include #include class QwtLegendMap { public: inline bool isEmpty() const { return d_entries.isEmpty(); } void insert( const QVariant &, const QList & ); void remove( const QVariant & ); void removeWidget( const QWidget * ); QList legendWidgets( const QVariant & ) const; QVariant itemInfo( const QWidget * ) const; private: // we don't know anything about itemInfo and therefore don't have // any key that can be used for a map or hashtab. // But a simple linear list is o.k. here, as we will never have // more than a few entries. class Entry { public: QVariant itemInfo; QList widgets; }; QList< Entry > d_entries; }; void QwtLegendMap::insert( const QVariant &itemInfo, const QList &widgets ) { for ( int i = 0; i < d_entries.size(); i++ ) { Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) { entry.widgets = widgets; return; } } Entry newEntry; newEntry.itemInfo = itemInfo; newEntry.widgets = widgets; d_entries += newEntry; } void QwtLegendMap::remove( const QVariant &itemInfo ) { for ( int i = 0; i < d_entries.size(); i++ ) { Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) { d_entries.removeAt( i ); return; } } } void QwtLegendMap::removeWidget( const QWidget *widget ) { QWidget *w = const_cast( widget ); for ( int i = 0; i < d_entries.size(); i++ ) d_entries[ i ].widgets.removeAll( w ); } QVariant QwtLegendMap::itemInfo( const QWidget *widget ) const { if ( widget != NULL ) { QWidget *w = const_cast( widget ); for ( int i = 0; i < d_entries.size(); i++ ) { const Entry &entry = d_entries[i]; if ( entry.widgets.indexOf( w ) >= 0 ) return entry.itemInfo; } } return QVariant(); } QList QwtLegendMap::legendWidgets( const QVariant &itemInfo ) const { if ( itemInfo.isValid() ) { for ( int i = 0; i < d_entries.size(); i++ ) { const Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) return entry.widgets; } } return QList(); } class QwtLegend::PrivateData { public: PrivateData(): itemMode( QwtLegendData::ReadOnly ), view( NULL ) { } QwtLegendData::Mode itemMode; QwtLegendMap itemMap; class LegendView; LegendView *view; }; class QwtLegend::PrivateData::LegendView: public QScrollArea { public: LegendView( QWidget *parent ): QScrollArea( parent ) { contentsWidget = new QWidget( this ); contentsWidget->setObjectName( "QwtLegendViewContents" ); setWidget( contentsWidget ); setWidgetResizable( false ); viewport()->setObjectName( "QwtLegendViewport" ); // QScrollArea::setWidget internally sets autoFillBackground to true // But we don't want a background. contentsWidget->setAutoFillBackground( false ); viewport()->setAutoFillBackground( false ); } virtual bool event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { setFocusPolicy( Qt::NoFocus ); } if ( event->type() == QEvent::Resize ) { // adjust the size to en/disable the scrollbars // before QScrollArea adjusts the viewport size const QRect cr = contentsRect(); int w = cr.width(); int h = contentsWidget->heightForWidth( cr.width() ); if ( h > w ) { w -= verticalScrollBar()->sizeHint().width(); h = contentsWidget->heightForWidth( w ); } contentsWidget->resize( w, h ); } return QScrollArea::event( event ); } virtual bool viewportEvent( QEvent *event ) { bool ok = QScrollArea::viewportEvent( event ); if ( event->type() == QEvent::Resize ) { layoutContents(); } return ok; } QSize viewportSize( int w, int h ) const { const int sbHeight = horizontalScrollBar()->sizeHint().height(); const int sbWidth = verticalScrollBar()->sizeHint().width(); const int cw = contentsRect().width(); const int ch = contentsRect().height(); int vw = cw; int vh = ch; if ( w > vw ) vh -= sbHeight; if ( h > vh ) { vw -= sbWidth; if ( w > vw && vh == ch ) vh -= sbHeight; } return QSize( vw, vh ); } void layoutContents() { const QwtDynGridLayout *tl = qobject_cast( contentsWidget->layout() ); if ( tl == NULL ) return; const QSize visibleSize = viewport()->contentsRect().size(); const int minW = int( tl->maxItemWidth() ) + 2 * tl->margin(); int w = qMax( visibleSize.width(), minW ); int h = qMax( tl->heightForWidth( w ), visibleSize.height() ); const int vpWidth = viewportSize( w, h ).width(); if ( w > vpWidth ) { w = qMax( vpWidth, minW ); h = qMax( tl->heightForWidth( w ), visibleSize.height() ); } contentsWidget->resize( w, h ); } QWidget *contentsWidget; }; /*! Constructor \param parent Parent widget */ QwtLegend::QwtLegend( QWidget *parent ): QwtAbstractLegend( parent ) { setFrameStyle( NoFrame ); d_data = new QwtLegend::PrivateData; d_data->view = new QwtLegend::PrivateData::LegendView( this ); d_data->view->setObjectName( "QwtLegendView" ); d_data->view->setFrameStyle( NoFrame ); QwtDynGridLayout *gridLayout = new QwtDynGridLayout( d_data->view->contentsWidget ); gridLayout->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); d_data->view->contentsWidget->installEventFilter( this ); QVBoxLayout *layout = new QVBoxLayout( this ); layout->setContentsMargins( 0, 0, 0, 0 ); layout->addWidget( d_data->view ); } //! Destructor QwtLegend::~QwtLegend() { delete d_data; } /*! \brief Set the maximum number of entries in a row F.e when the maximum is set to 1 all items are aligned vertically. 0 means unlimited \param numColums Maximum number of entries in a row \sa maxColumns(), QwtDynGridLayout::setMaxColumns() */ void QwtLegend::setMaxColumns( uint numColums ) { QwtDynGridLayout *tl = qobject_cast( d_data->view->contentsWidget->layout() ); if ( tl ) tl->setMaxColumns( numColums ); } /*! \return Maximum number of entries in a row \sa setMaxColumns(), QwtDynGridLayout::maxColumns() */ uint QwtLegend::maxColumns() const { uint maxCols = 0; const QwtDynGridLayout *tl = qobject_cast( d_data->view->contentsWidget->layout() ); if ( tl ) maxCols = tl->maxColumns(); return maxCols; } /*! \brief Set the default mode for legend labels Legend labels will be constructed according to the attributes in a QwtLegendData object. When it doesn't contain a value for the QwtLegendData::ModeRole the label will be initialized with the default mode of the legend. \param mode Default item mode \sa itemMode(), QwtLegendData::value(), QwtPlotItem::legendData() \note Changing the mode doesn't have any effect on existing labels. */ void QwtLegend::setDefaultItemMode( QwtLegendData::Mode mode ) { d_data->itemMode = mode; } /*! \return Default item mode \sa setDefaultItemMode() */ QwtLegendData::Mode QwtLegend::defaultItemMode() const { return d_data->itemMode; } /*! The contents widget is the only child of the viewport of the internal QScrollArea and the parent widget of all legend items. \return Container widget of the legend items */ QWidget *QwtLegend::contentsWidget() { return d_data->view->contentsWidget; } /*! \return Horizontal scrollbar \sa verticalScrollBar() */ QScrollBar *QwtLegend::horizontalScrollBar() const { return d_data->view->horizontalScrollBar(); } /*! \return Vertical scrollbar \sa horizontalScrollBar() */ QScrollBar *QwtLegend::verticalScrollBar() const { return d_data->view->verticalScrollBar(); } /*! The contents widget is the only child of the viewport of the internal QScrollArea and the parent widget of all legend items. \return Container widget of the legend items */ const QWidget *QwtLegend::contentsWidget() const { return d_data->view->contentsWidget; } /*! \brief Update the entries for an item \param itemInfo Info for an item \param data List of legend entry attributes for the item */ void QwtLegend::updateLegend( const QVariant &itemInfo, const QList &data ) { QList widgetList = legendWidgets( itemInfo ); if ( widgetList.size() != data.size() ) { QLayout *contentsLayout = d_data->view->contentsWidget->layout(); while ( widgetList.size() > data.size() ) { QWidget *w = widgetList.takeLast(); contentsLayout->removeWidget( w ); // updates might be triggered by signals from the legend widget // itself. So we better don't delete it here. w->hide(); w->deleteLater(); } for ( int i = widgetList.size(); i < data.size(); i++ ) { QWidget *widget = createWidget( data[i] ); if ( contentsLayout ) contentsLayout->addWidget( widget ); widgetList += widget; } if ( widgetList.isEmpty() ) { d_data->itemMap.remove( itemInfo ); } else { d_data->itemMap.insert( itemInfo, widgetList ); } updateTabOrder(); } for ( int i = 0; i < data.size(); i++ ) updateWidget( widgetList[i], data[i] ); } /*! \brief Create a widget to be inserted into the legend The default implementation returns a QwtLegendLabel. \param data Attributes of the legend entry \return Widget representing data on the legend \note updateWidget() will called soon after createWidget() with the same attributes. */ QWidget *QwtLegend::createWidget( const QwtLegendData &data ) const { Q_UNUSED( data ); QwtLegendLabel *label = new QwtLegendLabel(); label->setItemMode( defaultItemMode() ); connect( label, SIGNAL( clicked() ), SLOT( itemClicked() ) ); connect( label, SIGNAL( checked( bool ) ), SLOT( itemChecked( bool ) ) ); return label; } /*! \brief Update the widget \param widget Usually a QwtLegendLabel \param data Attributes to be displayed \sa createWidget() \note When widget is no QwtLegendLabel updateWidget() does nothing. */ void QwtLegend::updateWidget( QWidget *widget, const QwtLegendData &data ) { QwtLegendLabel *label = qobject_cast( widget ); if ( label ) { label->setData( data ); if ( !data.value( QwtLegendData::ModeRole ).isValid() ) { // use the default mode, when there is no specific // hint from the legend data label->setItemMode( defaultItemMode() ); } } } void QwtLegend::updateTabOrder() { QLayout *contentsLayout = d_data->view->contentsWidget->layout(); if ( contentsLayout ) { // set tab focus chain QWidget *w = NULL; for ( int i = 0; i < contentsLayout->count(); i++ ) { QLayoutItem *item = contentsLayout->itemAt( i ); if ( w && item->widget() ) QWidget::setTabOrder( w, item->widget() ); w = item->widget(); } } } //! Return a size hint. QSize QwtLegend::sizeHint() const { QSize hint = d_data->view->contentsWidget->sizeHint(); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! \return The preferred height, for a width. \param width Width */ int QwtLegend::heightForWidth( int width ) const { width -= 2 * frameWidth(); int h = d_data->view->contentsWidget->heightForWidth( width ); if ( h >= 0 ) h += 2 * frameWidth(); return h; } /*! Handle QEvent::ChildRemoved andQEvent::LayoutRequest events for the contentsWidget(). \param object Object to be filtered \param event Event \return Forwarded to QwtAbstractLegend::eventFilter() */ bool QwtLegend::eventFilter( QObject *object, QEvent *event ) { if ( object == d_data->view->contentsWidget ) { switch ( event->type() ) { case QEvent::ChildRemoved: { const QChildEvent *ce = static_cast(event); if ( ce->child()->isWidgetType() ) { QWidget *w = static_cast< QWidget * >( ce->child() ); d_data->itemMap.removeWidget( w ); } break; } case QEvent::LayoutRequest: { d_data->view->layoutContents(); if ( parentWidget() && parentWidget()->layout() == NULL ) { /* We want the parent widget ( usually QwtPlot ) to recalculate its layout, when the contentsWidget has changed. But because of the scroll view we have to forward the LayoutRequest event manually. We don't use updateGeometry() because it doesn't post LayoutRequest events when the legend is hidden. But we want the parent widget notified, so it can show/hide the legend depending on its items. */ QApplication::postEvent( parentWidget(), new QEvent( QEvent::LayoutRequest ) ); } break; } default: break; } } return QwtAbstractLegend::eventFilter( object, event ); } /*! Called internally when the legend has been clicked on. Emits a clicked() signal. */ void QwtLegend::itemClicked() { QWidget *w = qobject_cast( sender() ); if ( w ) { const QVariant itemInfo = d_data->itemMap.itemInfo( w ); if ( itemInfo.isValid() ) { const QList widgetList = d_data->itemMap.legendWidgets( itemInfo ); const int index = widgetList.indexOf( w ); if ( index >= 0 ) Q_EMIT clicked( itemInfo, index ); } } } /*! Called internally when the legend has been checked Emits a checked() signal. */ void QwtLegend::itemChecked( bool on ) { QWidget *w = qobject_cast( sender() ); if ( w ) { const QVariant itemInfo = d_data->itemMap.itemInfo( w ); if ( itemInfo.isValid() ) { const QList widgetList = d_data->itemMap.legendWidgets( itemInfo ); const int index = widgetList.indexOf( w ); if ( index >= 0 ) Q_EMIT checked( itemInfo, on, index ); } } } /*! Render the legend into a given rectangle. \param painter Painter \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \sa renderLegend() is used by QwtPlotRenderer - not by QwtLegend itself */ void QwtLegend::renderLegend( QPainter *painter, const QRectF &rect, bool fillBackground ) const { if ( d_data->itemMap.isEmpty() ) return; if ( fillBackground ) { if ( autoFillBackground() || testAttribute( Qt::WA_StyledBackground ) ) { QwtPainter::drawBackgound( painter, rect, this ); } } const QwtDynGridLayout *legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout == NULL ) return; int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); QRect layoutRect; layoutRect.setLeft( qCeil( rect.left() ) + left ); layoutRect.setTop( qCeil( rect.top() ) + top ); layoutRect.setRight( qFloor( rect.right() ) - right ); layoutRect.setBottom( qFloor( rect.bottom() ) - bottom ); uint numCols = legendLayout->columnsForWidth( layoutRect.width() ); QList itemRects = legendLayout->layoutItems( layoutRect, numCols ); int index = 0; for ( int i = 0; i < legendLayout->count(); i++ ) { QLayoutItem *item = legendLayout->itemAt( i ); QWidget *w = item->widget(); if ( w ) { painter->save(); painter->setClipRect( itemRects[index] ); renderItem( painter, w, itemRects[index], fillBackground ); index++; painter->restore(); } } } /*! Render a legend entry into a given rectangle. \param painter Painter \param widget Widget representing a legend entry \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \note When widget is not derived from QwtLegendLabel renderItem does nothing beside the background */ void QwtLegend::renderItem( QPainter *painter, const QWidget *widget, const QRectF &rect, bool fillBackground ) const { if ( fillBackground ) { if ( widget->autoFillBackground() || widget->testAttribute( Qt::WA_StyledBackground ) ) { QwtPainter::drawBackgound( painter, rect, widget ); } } const QwtLegendLabel *label = qobject_cast( widget ); if ( label ) { // icon const QwtGraphic &icon = label->data().icon(); const QSizeF sz = icon.defaultSize(); const QRectF iconRect( rect.x() + label->margin(), rect.center().y() - 0.5 * sz.height(), sz.width(), sz.height() ); icon.render( painter, iconRect, Qt::KeepAspectRatio ); // title QRectF titleRect = rect; titleRect.setX( iconRect.right() + 2 * label->spacing() ); painter->setFont( label->font() ); painter->setPen( label->palette().color( QPalette::Text ) ); const_cast< QwtLegendLabel *>( label )->drawText( painter, titleRect ); } } /*! \return List of widgets associated to a item \param itemInfo Info about an item \sa legendWidget(), itemInfo(), QwtPlot::itemToInfo() */ QList QwtLegend::legendWidgets( const QVariant &itemInfo ) const { return d_data->itemMap.legendWidgets( itemInfo ); } /*! \return First widget in the list of widgets associated to an item \param itemInfo Info about an item \sa itemInfo(), QwtPlot::itemToInfo() \note Almost all types of items have only one widget */ QWidget *QwtLegend::legendWidget( const QVariant &itemInfo ) const { const QList list = d_data->itemMap.legendWidgets( itemInfo ); if ( list.isEmpty() ) return NULL; return list[0]; } /*! Find the item that is associated to a widget \param widget Widget on the legend \return Associated item info \sa legendWidget() */ QVariant QwtLegend::itemInfo( const QWidget *widget ) const { return d_data->itemMap.itemInfo( widget ); } //! \return True, when no item is inserted bool QwtLegend::isEmpty() const { return d_data->itemMap.isEmpty(); } /*! Return the extent, that is needed for the scrollbars \param orientation Orientation ( \return The width of the vertical scrollbar for Qt::Horizontal and v.v. */ int QwtLegend::scrollExtent( Qt::Orientation orientation ) const { int extent = 0; if ( orientation == Qt::Horizontal ) extent = verticalScrollBar()->sizeHint().width(); else extent = horizontalScrollBar()->sizeHint().height(); return extent; } qsstv_9.2.6/qwt/qwt_legend.h0000664000175000017500000000656213203343610014553 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_H #define QWT_LEGEND_H #include "qwt_global.h" #include "qwt_abstract_legend.h" #include class QScrollBar; /*! \brief The legend widget The QwtLegend widget is a tabular arrangement of legend items. Legend items might be any type of widget, but in general they will be a QwtLegendLabel. \sa QwtLegendLabel, QwtPlotItem, QwtPlot */ class QWT_EXPORT QwtLegend : public QwtAbstractLegend { Q_OBJECT public: explicit QwtLegend( QWidget *parent = NULL ); virtual ~QwtLegend(); void setMaxColumns( uint numColums ); uint maxColumns() const; void setDefaultItemMode( QwtLegendData::Mode ); QwtLegendData::Mode defaultItemMode() const; QWidget *contentsWidget(); const QWidget *contentsWidget() const; QWidget *legendWidget( const QVariant & ) const; QList legendWidgets( const QVariant & ) const; QVariant itemInfo( const QWidget * ) const; virtual bool eventFilter( QObject *, QEvent * ); virtual QSize sizeHint() const; virtual int heightForWidth( int w ) const; QScrollBar *horizontalScrollBar() const; QScrollBar *verticalScrollBar() const; virtual void renderLegend( QPainter *, const QRectF &, bool fillBackground ) const; virtual void renderItem( QPainter *, const QWidget *, const QRectF &, bool fillBackground ) const; virtual bool isEmpty() const; virtual int scrollExtent( Qt::Orientation ) const; Q_SIGNALS: /*! A signal which is emitted when the user has clicked on a legend label, which is in QwtLegendData::Clickable mode. \param itemInfo Info for the item item of the selected legend item \param index Index of the legend label in the list of widgets that are associated with the plot item \note clicks are disabled as default \sa setDefaultItemMode(), defaultItemMode(), QwtPlot::itemToInfo() */ void clicked( const QVariant &itemInfo, int index ); /*! A signal which is emitted when the user has clicked on a legend label, which is in QwtLegendData::Checkable mode \param itemInfo Info for the item of the selected legend label \param index Index of the legend label in the list of widgets that are associated with the plot item \param on True when the legend label is checked \note clicks are disabled as default \sa setDefaultItemMode(), defaultItemMode(), QwtPlot::itemToInfo() */ void checked( const QVariant &itemInfo, bool on, int index ); public Q_SLOTS: virtual void updateLegend( const QVariant &, const QList & ); protected Q_SLOTS: void itemClicked(); void itemChecked( bool ); protected: virtual QWidget *createWidget( const QwtLegendData & ) const; virtual void updateWidget( QWidget *widget, const QwtLegendData &data ); private: void updateTabOrder(); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_legend_data.cpp0000664000175000017500000000525213203343610016072 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_data.h" //! Constructor QwtLegendData::QwtLegendData() { } //! Destructor QwtLegendData::~QwtLegendData() { } /*! Set the legend attributes QwtLegendData actually is a QMap with some convenience interfaces \param map Values \sa values() */ void QwtLegendData::setValues( const QMap &map ) { d_map = map; } /*! \return Legend attributes \sa setValues() */ const QMap &QwtLegendData::values() const { return d_map; } /*! \param role Attribute role \return True, when the internal map has an entry for role */ bool QwtLegendData::hasRole( int role ) const { return d_map.contains( role ); } /*! Set an attribute value \param role Attribute role \param data Attribute value \sa value() */ void QwtLegendData::setValue( int role, const QVariant &data ) { d_map[role] = data; } /*! \param role Attribute role \return Attribute value for a specific role */ QVariant QwtLegendData::value( int role ) const { if ( !d_map.contains( role ) ) return QVariant(); return d_map[role]; } //! \return True, when the internal map is empty bool QwtLegendData::isValid() const { return !d_map.isEmpty(); } //! \return Value of the TitleRole attribute QwtText QwtLegendData::title() const { QwtText text; const QVariant titleValue = value( QwtLegendData::TitleRole ); if ( titleValue.canConvert() ) { text = qvariant_cast( titleValue ); } else if ( titleValue.canConvert() ) { text.setText( qvariant_cast( titleValue ) ); } return text; } //! \return Value of the IconRole attribute QwtGraphic QwtLegendData::icon() const { const QVariant iconValue = value( QwtLegendData::IconRole ); QwtGraphic graphic; if ( iconValue.canConvert() ) { graphic = qvariant_cast( iconValue ); } return graphic; } //! \return Value of the ModeRole attribute QwtLegendData::Mode QwtLegendData::mode() const { const QVariant modeValue = value( QwtLegendData::ModeRole ); if ( modeValue.canConvert() ) { const int mode = qvariant_cast( modeValue ); return static_cast( mode ); } return QwtLegendData::ReadOnly; } qsstv_9.2.6/qwt/qwt_legend_data.h0000664000175000017500000000422313203343610015534 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_DATA_H #define QWT_LEGEND_DATA_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_graphic.h" #include #include #include /*! \brief Attributes of an entry on a legend QwtLegendData is an abstract container ( like QAbstractModel ) to exchange attributes, that are only known between to the plot item and the legend. By overloading QwtPlotItem::legendData() any other set of attributes could be used, that can be handled by a modified ( or completely different ) implementation of a legend. \sa QwtLegend, QwtPlotLegendItem \note The stockchart example implements a legend as a tree with checkable items */ class QWT_EXPORT QwtLegendData { public: //! Mode defining how a legend entry interacts enum Mode { //! The legend item is not interactive, like a label ReadOnly, //! The legend item is clickable, like a push button Clickable, //! The legend item is checkable, like a checkable button Checkable }; //! Identifier how to interprete a QVariant enum Role { // The value is a Mode ModeRole, // The value is a title TitleRole, // The value is an icon IconRole, // Values < UserRole are reserved for internal use UserRole = 32 }; QwtLegendData(); ~QwtLegendData(); void setValues( const QMap & ); const QMap &values() const; void setValue( int role, const QVariant & ); QVariant value( int role ) const; bool hasRole( int role ) const; bool isValid() const; QwtGraphic icon() const; QwtText title() const; Mode mode() const; private: QMap d_map; }; #endif qsstv_9.2.6/qwt/qwt_legend_label.cpp0000664000175000017500000002164213203343610016241 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_label.h" #include "qwt_legend_data.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_symbol.h" #include "qwt_graphic.h" #include #include #include #include #include #include #include static const int ButtonFrame = 2; static const int Margin = 2; static QSize buttonShift( const QwtLegendLabel *w ) { QStyleOption option; option.init( w ); const int ph = w->style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, w ); const int pv = w->style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, w ); return QSize( ph, pv ); } class QwtLegendLabel::PrivateData { public: PrivateData(): itemMode( QwtLegendData::ReadOnly ), isDown( false ), spacing( Margin ) { } QwtLegendData::Mode itemMode; QwtLegendData legendData; bool isDown; QPixmap icon; int spacing; }; /*! Set the attributes of the legend label \param legendData Attributes of the label \sa data() */ void QwtLegendLabel::setData( const QwtLegendData &legendData ) { d_data->legendData = legendData; const bool doUpdate = updatesEnabled(); setUpdatesEnabled( false ); setText( legendData.title() ); setIcon( legendData.icon().toPixmap() ); if ( legendData.hasRole( QwtLegendData::ModeRole ) ) setItemMode( legendData.mode() ); if ( doUpdate ) { setUpdatesEnabled( true ); update(); } } /*! \return Attributes of the label \sa setData(), QwtPlotItem::legendData() */ const QwtLegendData &QwtLegendLabel::data() const { return d_data->legendData; } /*! \param parent Parent widget */ QwtLegendLabel::QwtLegendLabel( QWidget *parent ): QwtTextLabel( parent ) { d_data = new PrivateData; setMargin( Margin ); setIndent( Margin ); } //! Destructor QwtLegendLabel::~QwtLegendLabel() { delete d_data; d_data = NULL; } /*! Set the text to the legend item \param text Text label \sa QwtTextLabel::text() */ void QwtLegendLabel::setText( const QwtText &text ) { const int flags = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextExpandTabs | Qt::TextWordWrap; QwtText txt = text; txt.setRenderFlags( flags ); QwtTextLabel::setText( txt ); } /*! Set the item mode The default is QwtLegendData::ReadOnly \param mode Item mode \sa itemMode() */ void QwtLegendLabel::setItemMode( QwtLegendData::Mode mode ) { if ( mode != d_data->itemMode ) { d_data->itemMode = mode; d_data->isDown = false; setFocusPolicy( ( mode != QwtLegendData::ReadOnly ) ? Qt::TabFocus : Qt::NoFocus ); setMargin( ButtonFrame + Margin ); updateGeometry(); } } /*! \return Item mode \sa setItemMode() */ QwtLegendData::Mode QwtLegendLabel::itemMode() const { return d_data->itemMode; } /*! Assign the icon \param icon Pixmap representing a plot item \sa icon(), QwtPlotItem::legendIcon() */ void QwtLegendLabel::setIcon( const QPixmap &icon ) { d_data->icon = icon; int indent = margin() + d_data->spacing; if ( icon.width() > 0 ) indent += icon.width() + d_data->spacing; setIndent( indent ); } /*! \return Pixmap representing a plot item \sa setIcon() */ QPixmap QwtLegendLabel::icon() const { return d_data->icon; } /*! \brief Change the spacing between icon and text \param spacing Spacing \sa spacing(), QwtTextLabel::margin() */ void QwtLegendLabel::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; int indent = margin() + d_data->spacing; if ( d_data->icon.width() > 0 ) indent += d_data->icon.width() + d_data->spacing; setIndent( indent ); } } /*! \return Spacing between icon and text \sa setSpacing(), QwtTextLabel::margin() */ int QwtLegendLabel::spacing() const { return d_data->spacing; } /*! Check/Uncheck a the item \param on check/uncheck \sa setItemMode() */ void QwtLegendLabel::setChecked( bool on ) { if ( d_data->itemMode == QwtLegendData::Checkable ) { const bool isBlocked = signalsBlocked(); blockSignals( true ); setDown( on ); blockSignals( isBlocked ); } } //! Return true, if the item is checked bool QwtLegendLabel::isChecked() const { return d_data->itemMode == QwtLegendData::Checkable && isDown(); } //! Set the item being down void QwtLegendLabel::setDown( bool down ) { if ( down == d_data->isDown ) return; d_data->isDown = down; update(); if ( d_data->itemMode == QwtLegendData::Clickable ) { if ( d_data->isDown ) Q_EMIT pressed(); else { Q_EMIT released(); Q_EMIT clicked(); } } if ( d_data->itemMode == QwtLegendData::Checkable ) Q_EMIT checked( d_data->isDown ); } //! Return true, if the item is down bool QwtLegendLabel::isDown() const { return d_data->isDown; } //! Return a size hint QSize QwtLegendLabel::sizeHint() const { QSize sz = QwtTextLabel::sizeHint(); sz.setHeight( qMax( sz.height(), d_data->icon.height() + 4 ) ); if ( d_data->itemMode != QwtLegendData::ReadOnly ) { sz += buttonShift( this ); sz = sz.expandedTo( QApplication::globalStrut() ); } return sz; } //! Paint event void QwtLegendLabel::paintEvent( QPaintEvent *e ) { const QRect cr = contentsRect(); QPainter painter( this ); painter.setClipRegion( e->region() ); if ( d_data->isDown ) { qDrawWinButton( &painter, 0, 0, width(), height(), palette(), true ); } painter.save(); if ( d_data->isDown ) { const QSize shiftSize = buttonShift( this ); painter.translate( shiftSize.width(), shiftSize.height() ); } painter.setClipRect( cr ); drawContents( &painter ); if ( !d_data->icon.isNull() ) { QRect iconRect = cr; iconRect.setX( iconRect.x() + margin() ); if ( d_data->itemMode != QwtLegendData::ReadOnly ) iconRect.setX( iconRect.x() + ButtonFrame ); iconRect.setSize( d_data->icon.size() ); iconRect.moveCenter( QPoint( iconRect.center().x(), cr.center().y() ) ); painter.drawPixmap( iconRect, d_data->icon ); } painter.restore(); } //! Handle mouse press events void QwtLegendLabel::mousePressEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { setDown( true ); return; } case QwtLegendData::Checkable: { setDown( !isDown() ); return; } default:; } } QwtTextLabel::mousePressEvent( e ); } //! Handle mouse release events void QwtLegendLabel::mouseReleaseEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { setDown( false ); return; } case QwtLegendData::Checkable: { return; // do nothing, but accept } default:; } } QwtTextLabel::mouseReleaseEvent( e ); } //! Handle key press events void QwtLegendLabel::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { if ( !e->isAutoRepeat() ) setDown( true ); return; } case QwtLegendData::Checkable: { if ( !e->isAutoRepeat() ) setDown( !isDown() ); return; } default:; } } QwtTextLabel::keyPressEvent( e ); } //! Handle key release events void QwtLegendLabel::keyReleaseEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { if ( !e->isAutoRepeat() ) setDown( false ); return; } case QwtLegendData::Checkable: { return; // do nothing, but accept } default:; } } QwtTextLabel::keyReleaseEvent( e ); } qsstv_9.2.6/qwt/qwt_legend_label.h0000664000175000017500000000366013203343610015706 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_LABEL_H #define QWT_LEGEND_LABEL_H #include "qwt_global.h" #include "qwt_legend_data.h" #include "qwt_text.h" #include "qwt_text_label.h" #include class QwtLegendData; /*! \brief A widget representing something on a QwtLegend. */ class QWT_EXPORT QwtLegendLabel: public QwtTextLabel { Q_OBJECT public: explicit QwtLegendLabel( QWidget *parent = 0 ); virtual ~QwtLegendLabel(); void setData( const QwtLegendData & ); const QwtLegendData &data() const; void setItemMode( QwtLegendData::Mode ); QwtLegendData::Mode itemMode() const; void setSpacing( int spacing ); int spacing() const; virtual void setText( const QwtText & ); void setIcon( const QPixmap & ); QPixmap icon() const; virtual QSize sizeHint() const; bool isChecked() const; public Q_SLOTS: void setChecked( bool on ); Q_SIGNALS: //! Signal, when the legend item has been clicked void clicked(); //! Signal, when the legend item has been pressed void pressed(); //! Signal, when the legend item has been released void released(); //! Signal, when the legend item has been toggled void checked( bool ); protected: void setDown( bool ); bool isDown() const; virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_magnifier.cpp0000664000175000017500000002704713203343610015612 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_magnifier.h" #include "qwt_math.h" #include #include class QwtMagnifier::PrivateData { public: PrivateData(): isEnabled( false ), wheelFactor( 0.9 ), wheelModifiers( Qt::NoModifier ), mouseFactor( 0.95 ), mouseButton( Qt::RightButton ), mouseButtonModifiers( Qt::NoModifier ), keyFactor( 0.9 ), zoomInKey( Qt::Key_Plus ), zoomInKeyModifiers( Qt::NoModifier ), zoomOutKey( Qt::Key_Minus ), zoomOutKeyModifiers( Qt::NoModifier ), mousePressed( false ) { } bool isEnabled; double wheelFactor; Qt::KeyboardModifiers wheelModifiers; double mouseFactor; Qt::MouseButton mouseButton; Qt::KeyboardModifiers mouseButtonModifiers; double keyFactor; int zoomInKey; Qt::KeyboardModifiers zoomInKeyModifiers; int zoomOutKey; Qt::KeyboardModifiers zoomOutKeyModifiers; bool mousePressed; bool hasMouseTracking; QPoint mousePos; }; /*! Constructor \param parent Widget to be magnified */ QwtMagnifier::QwtMagnifier( QWidget *parent ): QObject( parent ) { d_data = new PrivateData(); setEnabled( true ); } //! Destructor QwtMagnifier::~QwtMagnifier() { delete d_data; } /*! \brief En/disable the magnifier When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param on true or false \sa isEnabled(), eventFilter() */ void QwtMagnifier::setEnabled( bool on ) { if ( d_data->isEnabled != on ) { d_data->isEnabled = on; QObject *o = parent(); if ( o ) { if ( d_data->isEnabled ) o->installEventFilter( this ); else o->removeEventFilter( this ); } } } /*! \return true when enabled, false otherwise \sa setEnabled(), eventFilter() */ bool QwtMagnifier::isEnabled() const { return d_data->isEnabled; } /*! \brief Change the wheel factor The wheel factor defines the ratio between the current range on the parent widget and the zoomed range for each step of the wheel. Use values > 1 for magnification (i.e. 2.0) and values < 1 for scaling down (i.e. 1/2.0 = 0.5). You can use this feature for inverting the direction of the wheel. The default value is 0.9. \param factor Wheel factor \sa wheelFactor(), setWheelButtonState(), setMouseFactor(), setKeyFactor() */ void QwtMagnifier::setWheelFactor( double factor ) { d_data->wheelFactor = factor; } /*! \return Wheel factor \sa setWheelFactor() */ double QwtMagnifier::wheelFactor() const { return d_data->wheelFactor; } /*! Assign keyboard modifiers for zooming in/out using the wheel. The default modifiers are Qt::NoModifiers. \param modifiers Keyboard modifiers \sa wheelModifiers() */ void QwtMagnifier::setWheelModifiers( Qt::KeyboardModifiers modifiers ) { d_data->wheelModifiers = modifiers; } /*! \return Wheel modifiers \sa setWheelModifiers() */ Qt::KeyboardModifiers QwtMagnifier::wheelModifiers() const { return d_data->wheelModifiers; } /*! \brief Change the mouse factor The mouse factor defines the ratio between the current range on the parent widget and the zoomed range for each vertical mouse movement. The default value is 0.95. \param factor Wheel factor \sa mouseFactor(), setMouseButton(), setWheelFactor(), setKeyFactor() */ void QwtMagnifier::setMouseFactor( double factor ) { d_data->mouseFactor = factor; } /*! \return Mouse factor \sa setMouseFactor() */ double QwtMagnifier::mouseFactor() const { return d_data->mouseFactor; } /*! Assign the mouse button, that is used for zooming in/out. The default value is Qt::RightButton. \param button Button \param modifiers Keyboard modifiers \sa getMouseButton() */ void QwtMagnifier::setMouseButton( Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { d_data->mouseButton = button; d_data->mouseButtonModifiers = modifiers; } //! \sa setMouseButton() void QwtMagnifier::getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers &modifiers ) const { button = d_data->mouseButton; modifiers = d_data->mouseButtonModifiers; } /*! \brief Change the key factor The key factor defines the ratio between the current range on the parent widget and the zoomed range for each key press of the zoom in/out keys. The default value is 0.9. \param factor Key factor \sa keyFactor(), setZoomInKey(), setZoomOutKey(), setWheelFactor, setMouseFactor() */ void QwtMagnifier::setKeyFactor( double factor ) { d_data->keyFactor = factor; } /*! \return Key factor \sa setKeyFactor() */ double QwtMagnifier::keyFactor() const { return d_data->keyFactor; } /*! Assign the key, that is used for zooming in. The default combination is Qt::Key_Plus + Qt::NoModifier. \param key \param modifiers \sa getZoomInKey(), setZoomOutKey() */ void QwtMagnifier::setZoomInKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->zoomInKey = key; d_data->zoomInKeyModifiers = modifiers; } /*! \brief Retrieve the settings of the zoom in key \param key Key code, see Qt::Key \param modifiers Keyboard modifiers \sa setZoomInKey() */ void QwtMagnifier::getZoomInKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->zoomInKey; modifiers = d_data->zoomInKeyModifiers; } /*! Assign the key, that is used for zooming out. The default combination is Qt::Key_Minus + Qt::NoModifier. \param key \param modifiers \sa getZoomOutKey(), setZoomOutKey() */ void QwtMagnifier::setZoomOutKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->zoomOutKey = key; d_data->zoomOutKeyModifiers = modifiers; } /*! \brief Retrieve the settings of the zoom out key \param key Key code, see Qt::Key \param modifiers Keyboard modifiers \sa setZoomOutKey() */ void QwtMagnifier::getZoomOutKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->zoomOutKey; modifiers = d_data->zoomOutKeyModifiers; } /*! \brief Event filter When isEnabled() is true, the mouse events of the observed widget are filtered. \param object Object to be filtered \param event Event \return Forwarded to QObject::eventFilter() \sa widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent() widgetKeyReleaseEvent() */ bool QwtMagnifier::eventFilter( QObject *object, QEvent *event ) { if ( object && object == parent() ) { switch ( event->type() ) { case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::Wheel: { widgetWheelEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } default:; } } return QObject::eventFilter( object, event ); } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent() */ void QwtMagnifier::widgetMousePressEvent( QMouseEvent *mouseEvent ) { if ( parentWidget() == NULL ) return; if ( ( mouseEvent->button() != d_data->mouseButton ) || ( mouseEvent->modifiers() != d_data->mouseButtonModifiers ) ) { return; } d_data->hasMouseTracking = parentWidget()->hasMouseTracking(); parentWidget()->setMouseTracking( true ); d_data->mousePos = mouseEvent->pos(); d_data->mousePressed = true; } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(), */ void QwtMagnifier::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { Q_UNUSED( mouseEvent ); if ( d_data->mousePressed && parentWidget() ) { d_data->mousePressed = false; parentWidget()->setMouseTracking( d_data->hasMouseTracking ); } } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), */ void QwtMagnifier::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( !d_data->mousePressed ) return; const int dy = mouseEvent->pos().y() - d_data->mousePos.y(); if ( dy != 0 ) { double f = d_data->mouseFactor; if ( dy < 0 ) f = 1 / f; rescale( f ); } d_data->mousePos = mouseEvent->pos(); } /*! Handle a wheel event for the observed widget. \param wheelEvent Wheel event \sa eventFilter() */ void QwtMagnifier::widgetWheelEvent( QWheelEvent *wheelEvent ) { if ( wheelEvent->modifiers() != d_data->wheelModifiers ) { return; } if ( d_data->wheelFactor != 0.0 ) { /* A positive delta indicates that the wheel was rotated forwards away from the user; a negative value indicates that the wheel was rotated backwards toward the user. Most mouse types work in steps of 15 degrees, in which case the delta value is a multiple of 120 (== 15 * 8). */ double f = qPow( d_data->wheelFactor, qAbs( wheelEvent->delta() / 120.0 ) ); if ( wheelEvent->delta() > 0 ) f = 1 / f; rescale( f ); } } /*! Handle a key press event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtMagnifier::widgetKeyPressEvent( QKeyEvent *keyEvent ) { if ( keyEvent->key() == d_data->zoomInKey && keyEvent->modifiers() == d_data->zoomInKeyModifiers ) { rescale( d_data->keyFactor ); } else if ( keyEvent->key() == d_data->zoomOutKey && keyEvent->modifiers() == d_data->zoomOutKeyModifiers ) { rescale( 1.0 / d_data->keyFactor ); } } /*! Handle a key release event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtMagnifier::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { Q_UNUSED( keyEvent ); } //! \return Parent widget, where the rescaling happens QWidget *QwtMagnifier::parentWidget() { return qobject_cast( parent() ); } //! \return Parent widget, where the rescaling happens const QWidget *QwtMagnifier::parentWidget() const { return qobject_cast( parent() ); } qsstv_9.2.6/qwt/qwt_magnifier.h0000664000175000017500000000457213203343610015255 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MAGNIFIER_H #define QWT_MAGNIFIER_H 1 #include "qwt_global.h" #include class QWidget; class QMouseEvent; class QWheelEvent; class QKeyEvent; /*! \brief QwtMagnifier provides zooming, by magnifying in steps. Using QwtMagnifier a plot can be zoomed in/out in steps using keys, the mouse wheel or moving a mouse button in vertical direction. */ class QWT_EXPORT QwtMagnifier: public QObject { Q_OBJECT public: explicit QwtMagnifier( QWidget * ); virtual ~QwtMagnifier(); QWidget *parentWidget(); const QWidget *parentWidget() const; void setEnabled( bool ); bool isEnabled() const; // mouse void setMouseFactor( double ); double mouseFactor() const; void setMouseButton( Qt::MouseButton, Qt::KeyboardModifiers = Qt::NoModifier ); void getMouseButton( Qt::MouseButton &, Qt::KeyboardModifiers & ) const; // mouse wheel void setWheelFactor( double ); double wheelFactor() const; void setWheelModifiers( Qt::KeyboardModifiers ); Qt::KeyboardModifiers wheelModifiers() const; // keyboard void setKeyFactor( double ); double keyFactor() const; void setZoomInKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getZoomInKey( int &key, Qt::KeyboardModifiers & ) const; void setZoomOutKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getZoomOutKey( int &key, Qt::KeyboardModifiers & ) const; virtual bool eventFilter( QObject *, QEvent * ); protected: /*! Rescale the parent widget \param factor Scale factor */ virtual void rescale( double factor ) = 0; virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetWheelEvent( QWheelEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_math.cpp0000664000175000017500000000314413203343610014572 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_math.h" /*! \brief Find the smallest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMin( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMin( rv, array[i] ); return rv; } /*! \brief Find the largest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMax( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMax( rv, array[i] ); return rv; } /*! \brief Normalize an angle to be int the range [0.0, 2 * PI[ \param radians Angle in radians \return Normalized angle in radians */ double qwtNormalizeRadians( double radians ) { double a = ::fmod( radians, 2.0 * M_PI ); if ( a < 0.0 ) a += 2.0 * M_PI; return a; } /*! \brief Normalize an angle to be int the range [0.0, 360.0[ \param radians Angle in degrees \return Normalized angle in degrees */ double qwtNormalizeDegrees( double degrees ) { double a = ::fmod( degrees, 360.0 ); if ( a < 0.0 ) a += 360.0; return a; } qsstv_9.2.6/qwt/qwt_math.h0000664000175000017500000000645313203343610014245 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MATH_H #define QWT_MATH_H #include "qwt_global.h" #if defined(_MSC_VER) /* Microsoft says: Define _USE_MATH_DEFINES before including math.h to expose these macro definitions for common math constants. These are placed under an #ifdef since these commonly-defined names are not part of the C/C++ standards. */ #define _USE_MATH_DEFINES 1 #endif #include #include "qwt_global.h" #ifndef M_PI_2 // For Qt <= 4.8.4 M_PI_2 is not known by MinGW-w64 // when compiling with -std=c++11 #define M_PI_2 (1.57079632679489661923) #endif #ifndef LOG_MIN //! Minimum value for logarithmic scales #define LOG_MIN 1.0e-100 #endif #ifndef LOG_MAX //! Maximum value for logarithmic scales #define LOG_MAX 1.0e100 #endif QWT_EXPORT double qwtGetMin( const double *array, int size ); QWT_EXPORT double qwtGetMax( const double *array, int size ); QWT_EXPORT double qwtNormalizeRadians( double radians ); QWT_EXPORT double qwtNormalizeDegrees( double degrees ); /*! \brief Compare 2 values, relative to an interval Values are "equal", when : \f$\cdot value2 - value1 <= abs(intervalSize * 10e^{-6})\f$ \param value1 First value to compare \param value2 Second value to compare \param intervalSize interval size \return 0: if equal, -1: if value2 > value1, 1: if value1 > value2 */ inline int qwtFuzzyCompare( double value1, double value2, double intervalSize ) { const double eps = qAbs( 1.0e-6 * intervalSize ); if ( value2 - value1 > eps ) return -1; if ( value1 - value2 > eps ) return 1; return 0; } inline bool qwtFuzzyGreaterOrEqual( double d1, double d2 ) { return ( d1 >= d2 ) || qFuzzyCompare( d1, d2 ); } inline bool qwtFuzzyLessOrEqual( double d1, double d2 ) { return ( d1 <= d2 ) || qFuzzyCompare( d1, d2 ); } //! Return the sign inline int qwtSign( double x ) { if ( x > 0.0 ) return 1; else if ( x < 0.0 ) return ( -1 ); else return 0; } //! Return the square of a number inline double qwtSqr( double x ) { return x * x; } //! Approximation of arc tangent ( error below 0,005 radians ) inline double qwtFastAtan( double x ) { if ( x < -1.0 ) return -M_PI_2 - x / ( x * x + 0.28 ); if ( x > 1.0 ) return M_PI_2 - x / ( x * x + 0.28 ); return x / ( 1.0 + x * x * 0.28 ); } //! Approximation of arc tangent ( error below 0,005 radians ) inline double qwtFastAtan2( double y, double x ) { if ( x > 0 ) return qwtFastAtan( y / x ); if ( x < 0 ) { const double d = qwtFastAtan( y / x ); return ( y >= 0 ) ? d + M_PI : d - M_PI; } if ( y < 0.0 ) return -M_PI_2; if ( y > 0.0 ) return M_PI_2; return 0.0; } // Translate degrees into radians inline double qwtRadians( double degrees ) { return degrees * M_PI / 180.0; } // Translate radians into degrees inline double qwtDegrees( double degrees ) { return degrees * 180.0 / M_PI; } #endif qsstv_9.2.6/qwt/qwt_matrix_raster_data.cpp0000664000175000017500000001747713203343610017534 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_matrix_raster_data.h" #include #include class QwtMatrixRasterData::PrivateData { public: PrivateData(): resampleMode(QwtMatrixRasterData::NearestNeighbour), numColumns(0) { } inline double value(int row, int col) const { return values.data()[ row * numColumns + col ]; } QwtMatrixRasterData::ResampleMode resampleMode; QVector values; int numColumns; int numRows; double dx; double dy; }; //! Constructor QwtMatrixRasterData::QwtMatrixRasterData() { d_data = new PrivateData(); update(); } //! Destructor QwtMatrixRasterData::~QwtMatrixRasterData() { delete d_data; } /*! \brief Set the resampling algorithm \param mode Resampling mode \sa resampleMode(), value() */ void QwtMatrixRasterData::setResampleMode( ResampleMode mode ) { d_data->resampleMode = mode; } /*! \return resampling algorithm \sa setResampleMode(), value() */ QwtMatrixRasterData::ResampleMode QwtMatrixRasterData::resampleMode() const { return d_data->resampleMode; } /*! \brief Assign the bounding interval for an axis Setting the bounding intervals for the X/Y axis is mandatory to define the positions for the values of the value matrix. The interval in Z direction defines the possible range for the values in the matrix, what is f.e used by QwtPlotSpectrogram to map values to colors. The Z-interval might be the bounding interval of the values in the matrix, but usually it isn't. ( f.e a interval of 0.0-100.0 for values in percentage ) \param axis X, Y or Z axis \param interval Interval \sa QwtRasterData::interval(), setValueMatrix() */ void QwtMatrixRasterData::setInterval( Qt::Axis axis, const QwtInterval &interval ) { QwtRasterData::setInterval( axis, interval ); update(); } /*! \brief Assign a value matrix The positions of the values are calculated by dividing the bounding rectangle of the X/Y intervals into equidistant rectangles ( pixels ). Each value corresponds to the center of a pixel. \param values Vector of values \param numColumns Number of columns \sa valueMatrix(), numColumns(), numRows(), setInterval()() */ void QwtMatrixRasterData::setValueMatrix( const QVector &values, int numColumns ) { d_data->values = values; d_data->numColumns = qMax( numColumns, 0 ); update(); } /*! \return Value matrix \sa setValueMatrix(), numColumns(), numRows(), setInterval() */ const QVector QwtMatrixRasterData::valueMatrix() const { return d_data->values; } /*! \brief Change a single value in the matrix \param row Row index \param col Column index \param value New value \sa value(), setValueMatrix() */ void QwtMatrixRasterData::setValue( int row, int col, double value ) { if ( row >= 0 && row < d_data->numRows && col >= 0 && col < d_data->numColumns ) { const int index = row * d_data->numColumns + col; d_data->values.data()[ index ] = value; } } /*! \return Number of columns of the value matrix \sa valueMatrix(), numRows(), setValueMatrix() */ int QwtMatrixRasterData::numColumns() const { return d_data->numColumns; } /*! \return Number of rows of the value matrix \sa valueMatrix(), numColumns(), setValueMatrix() */ int QwtMatrixRasterData::numRows() const { return d_data->numRows; } /*! \brief Calculate the pixel hint pixelHint() returns the geometry of a pixel, that can be used to calculate the resolution and alignment of the plot item, that is representing the data. - NearestNeighbour\n pixelHint() returns the surrounding pixel of the top left value in the matrix. - BilinearInterpolation\n Returns an empty rectangle recommending to render in target device ( f.e. screen ) resolution. \param area Requested area, ignored \return Calculated hint \sa ResampleMode, setMatrix(), setInterval() */ QRectF QwtMatrixRasterData::pixelHint( const QRectF &area ) const { Q_UNUSED( area ) QRectF rect; if ( d_data->resampleMode == NearestNeighbour ) { const QwtInterval intervalX = interval( Qt::XAxis ); const QwtInterval intervalY = interval( Qt::YAxis ); if ( intervalX.isValid() && intervalY.isValid() ) { rect = QRectF( intervalX.minValue(), intervalY.minValue(), d_data->dx, d_data->dy ); } } return rect; } /*! \return the value at a raster position \param x X value in plot coordinates \param y Y value in plot coordinates \sa ResampleMode */ double QwtMatrixRasterData::value( double x, double y ) const { const QwtInterval xInterval = interval( Qt::XAxis ); const QwtInterval yInterval = interval( Qt::YAxis ); if ( !( xInterval.contains(x) && yInterval.contains(y) ) ) return qQNaN(); double value; switch( d_data->resampleMode ) { case BilinearInterpolation: { int col1 = qRound( (x - xInterval.minValue() ) / d_data->dx ) - 1; int row1 = qRound( (y - yInterval.minValue() ) / d_data->dy ) - 1; int col2 = col1 + 1; int row2 = row1 + 1; if ( col1 < 0 ) col1 = col2; else if ( col2 >= static_cast( d_data->numColumns ) ) col2 = col1; if ( row1 < 0 ) row1 = row2; else if ( row2 >= static_cast( d_data->numRows ) ) row2 = row1; const double v11 = d_data->value( row1, col1 ); const double v21 = d_data->value( row1, col2 ); const double v12 = d_data->value( row2, col1 ); const double v22 = d_data->value( row2, col2 ); const double x2 = xInterval.minValue() + ( col2 + 0.5 ) * d_data->dx; const double y2 = yInterval.minValue() + ( row2 + 0.5 ) * d_data->dy; const double rx = ( x2 - x ) / d_data->dx; const double ry = ( y2 - y ) / d_data->dy; const double vr1 = rx * v11 + ( 1.0 - rx ) * v21; const double vr2 = rx * v12 + ( 1.0 - rx ) * v22; value = ry * vr1 + ( 1.0 - ry ) * vr2; break; } case NearestNeighbour: default: { int row = int( (y - yInterval.minValue() ) / d_data->dy ); int col = int( (x - xInterval.minValue() ) / d_data->dx ); // In case of intervals, where the maximum is included // we get out of bound for row/col, when the value for the // maximum is requested. Instead we return the value // from the last row/col if ( row >= d_data->numRows ) row = d_data->numRows - 1; if ( col >= d_data->numColumns ) col = d_data->numColumns - 1; value = d_data->value( row, col ); } } return value; } void QwtMatrixRasterData::update() { d_data->numRows = 0; d_data->dx = 0.0; d_data->dy = 0.0; if ( d_data->numColumns > 0 ) { d_data->numRows = d_data->values.size() / d_data->numColumns; const QwtInterval xInterval = interval( Qt::XAxis ); const QwtInterval yInterval = interval( Qt::YAxis ); if ( xInterval.isValid() ) d_data->dx = xInterval.width() / d_data->numColumns; if ( yInterval.isValid() ) d_data->dy = yInterval.width() / d_data->numRows; } } qsstv_9.2.6/qwt/qwt_matrix_raster_data.h0000664000175000017500000000373313203343610017167 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MATRIX_RASTER_DATA_H #define QWT_MATRIX_RASTER_DATA_H 1 #include "qwt_global.h" #include "qwt_raster_data.h" #include /*! \brief A class representing a matrix of values as raster data QwtMatrixRasterData implements an interface for a matrix of equidistant values, that can be used by a QwtPlotRasterItem. It implements a couple of resampling algorithms, to provide values for positions, that or not on the value matrix. */ class QWT_EXPORT QwtMatrixRasterData: public QwtRasterData { public: /*! \brief Resampling algorithm The default setting is NearestNeighbour; */ enum ResampleMode { /*! Return the value from the matrix, that is nearest to the the requested position. */ NearestNeighbour, /*! Interpolate the value from the distances and values of the 4 surrounding values in the matrix, */ BilinearInterpolation }; QwtMatrixRasterData(); virtual ~QwtMatrixRasterData(); void setResampleMode(ResampleMode mode); ResampleMode resampleMode() const; virtual void setInterval( Qt::Axis, const QwtInterval & ); void setValueMatrix( const QVector &values, int numColumns ); const QVector valueMatrix() const; void setValue( int row, int col, double value ); int numColumns() const; int numRows() const; virtual QRectF pixelHint( const QRectF & ) const; virtual double value( double x, double y ) const; private: void update(); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_null_paintdevice.cpp0000664000175000017500000003201713203343610017167 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_null_paintdevice.h" #include #include class QwtNullPaintDevice::PrivateData { public: PrivateData(): mode( QwtNullPaintDevice::NormalMode ) { } QwtNullPaintDevice::Mode mode; }; class QwtNullPaintDevice::PaintEngine: public QPaintEngine { public: PaintEngine(); virtual bool begin( QPaintDevice * ); virtual bool end(); virtual Type type () const; virtual void updateState(const QPaintEngineState &); virtual void drawRects(const QRect *, int ); virtual void drawRects(const QRectF *, int ); virtual void drawLines(const QLine *, int ); virtual void drawLines(const QLineF *, int ); virtual void drawEllipse(const QRectF &); virtual void drawEllipse(const QRect &); virtual void drawPath(const QPainterPath &); virtual void drawPoints(const QPointF *, int ); virtual void drawPoints(const QPoint *, int ); virtual void drawPolygon(const QPointF *, int , PolygonDrawMode ); virtual void drawPolygon(const QPoint *, int , PolygonDrawMode ); virtual void drawPixmap(const QRectF &, const QPixmap &, const QRectF &); virtual void drawTextItem(const QPointF &, const QTextItem &); virtual void drawTiledPixmap(const QRectF &, const QPixmap &, const QPointF &s); virtual void drawImage(const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); private: QwtNullPaintDevice *nullDevice(); }; QwtNullPaintDevice::PaintEngine::PaintEngine(): QPaintEngine( QPaintEngine::AllFeatures ) { } bool QwtNullPaintDevice::PaintEngine::begin( QPaintDevice * ) { setActive( true ); return true; } bool QwtNullPaintDevice::PaintEngine::end() { setActive( false ); return true; } QPaintEngine::Type QwtNullPaintDevice::PaintEngine::type() const { return QPaintEngine::User; } void QwtNullPaintDevice::PaintEngine::drawRects( const QRect *rects, int rectCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawRects( rects, rectCount ); return; } device->drawRects( rects, rectCount ); } void QwtNullPaintDevice::PaintEngine::drawRects( const QRectF *rects, int rectCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawRects( rects, rectCount ); return; } device->drawRects( rects, rectCount ); } void QwtNullPaintDevice::PaintEngine::drawLines( const QLine *lines, int lineCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawLines( lines, lineCount ); return; } device->drawLines( lines, lineCount ); } void QwtNullPaintDevice::PaintEngine::drawLines( const QLineF *lines, int lineCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawLines( lines, lineCount ); return; } device->drawLines( lines, lineCount ); } void QwtNullPaintDevice::PaintEngine::drawEllipse( const QRectF &rect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawEllipse( rect ); return; } device->drawEllipse( rect ); } void QwtNullPaintDevice::PaintEngine::drawEllipse( const QRect &rect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawEllipse( rect ); return; } device->drawEllipse( rect ); } void QwtNullPaintDevice::PaintEngine::drawPath( const QPainterPath &path) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawPath( path ); } void QwtNullPaintDevice::PaintEngine::drawPoints( const QPointF *points, int pointCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawPoints( points, pointCount ); return; } device->drawPoints( points, pointCount ); } void QwtNullPaintDevice::PaintEngine::drawPoints( const QPoint *points, int pointCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawPoints( points, pointCount ); return; } device->drawPoints( points, pointCount ); } void QwtNullPaintDevice::PaintEngine::drawPolygon( const QPointF *points, int pointCount, PolygonDrawMode mode) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() == QwtNullPaintDevice::PathMode ) { QPainterPath path; if ( pointCount > 0 ) { path.moveTo( points[0] ); for ( int i = 1; i < pointCount; i++ ) path.lineTo( points[i] ); if ( mode != PolylineMode ) path.closeSubpath(); } device->drawPath( path ); return; } device->drawPolygon( points, pointCount, mode ); } void QwtNullPaintDevice::PaintEngine::drawPolygon( const QPoint *points, int pointCount, PolygonDrawMode mode) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() == QwtNullPaintDevice::PathMode ) { QPainterPath path; if ( pointCount > 0 ) { path.moveTo( points[0] ); for ( int i = 1; i < pointCount; i++ ) path.lineTo( points[i] ); if ( mode != PolylineMode ) path.closeSubpath(); } device->drawPath( path ); return; } device->drawPolygon( points, pointCount, mode ); } void QwtNullPaintDevice::PaintEngine::drawPixmap( const QRectF &rect, const QPixmap &pm, const QRectF &subRect ) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawPixmap( rect, pm, subRect ); } void QwtNullPaintDevice::PaintEngine::drawTextItem( const QPointF &pos, const QTextItem &textItem) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawTextItem( pos, textItem ); return; } device->drawTextItem( pos, textItem ); } void QwtNullPaintDevice::PaintEngine::drawTiledPixmap( const QRectF &rect, const QPixmap &pixmap, const QPointF &subRect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawTiledPixmap( rect, pixmap, subRect ); return; } device->drawTiledPixmap( rect, pixmap, subRect ); } void QwtNullPaintDevice::PaintEngine::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawImage( rect, image, subRect, flags ); } void QwtNullPaintDevice::PaintEngine::updateState( const QPaintEngineState &state) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->updateState( state ); } inline QwtNullPaintDevice *QwtNullPaintDevice::PaintEngine::nullDevice() { if ( !isActive() ) return NULL; return static_cast( paintDevice() ); } //! Constructor QwtNullPaintDevice::QwtNullPaintDevice(): d_engine( NULL ) { d_data = new PrivateData; } //! Destructor QwtNullPaintDevice::~QwtNullPaintDevice() { delete d_engine; delete d_data; } /*! Set the render mode \param mode New mode \sa mode() */ void QwtNullPaintDevice::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Render mode \sa setMode() */ QwtNullPaintDevice::Mode QwtNullPaintDevice::mode() const { return d_data->mode; } //! See QPaintDevice::paintEngine() QPaintEngine *QwtNullPaintDevice::paintEngine() const { if ( d_engine == NULL ) { QwtNullPaintDevice *that = const_cast< QwtNullPaintDevice * >( this ); that->d_engine = new PaintEngine(); } return d_engine; } /*! See QPaintDevice::metric() \param deviceMetric Type of metric \return Metric information for the given paint device metric. \sa sizeMetrics() */ int QwtNullPaintDevice::metric( PaintDeviceMetric deviceMetric ) const { int value; switch ( deviceMetric ) { case PdmWidth: { value = sizeMetrics().width(); break; } case PdmHeight: { value = sizeMetrics().height(); break; } case PdmNumColors: { value = 0xffffffff; break; } case PdmDepth: { value = 32; break; } case PdmPhysicalDpiX: case PdmPhysicalDpiY: case PdmDpiY: case PdmDpiX: { value = 72; break; } case PdmWidthMM: { value = qRound( metric( PdmWidth ) * 25.4 / metric( PdmDpiX ) ); break; } case PdmHeightMM: { value = qRound( metric( PdmHeight ) * 25.4 / metric( PdmDpiY ) ); break; } default: value = 0; } return value; } //! See QPaintEngine::drawRects() void QwtNullPaintDevice::drawRects( const QRect *rects, int rectCount) { Q_UNUSED(rects); Q_UNUSED(rectCount); } //! See QPaintEngine::drawRects() void QwtNullPaintDevice::drawRects( const QRectF *rects, int rectCount) { Q_UNUSED(rects); Q_UNUSED(rectCount); } //! See QPaintEngine::drawLines() void QwtNullPaintDevice::drawLines( const QLine *lines, int lineCount) { Q_UNUSED(lines); Q_UNUSED(lineCount); } //! See QPaintEngine::drawLines() void QwtNullPaintDevice::drawLines( const QLineF *lines, int lineCount) { Q_UNUSED(lines); Q_UNUSED(lineCount); } //! See QPaintEngine::drawEllipse() void QwtNullPaintDevice::drawEllipse( const QRectF &rect ) { Q_UNUSED(rect); } //! See QPaintEngine::drawEllipse() void QwtNullPaintDevice::drawEllipse( const QRect &rect ) { Q_UNUSED(rect); } //! See QPaintEngine::drawPath() void QwtNullPaintDevice::drawPath( const QPainterPath &path ) { Q_UNUSED(path); } //! See QPaintEngine::drawPoints() void QwtNullPaintDevice::drawPoints( const QPointF *points, int pointCount) { Q_UNUSED(points); Q_UNUSED(pointCount); } //! See QPaintEngine::drawPoints() void QwtNullPaintDevice::drawPoints( const QPoint *points, int pointCount) { Q_UNUSED(points); Q_UNUSED(pointCount); } //! See QPaintEngine::drawPolygon() void QwtNullPaintDevice::drawPolygon( const QPointF *points, int pointCount, QPaintEngine::PolygonDrawMode mode) { Q_UNUSED(points); Q_UNUSED(pointCount); Q_UNUSED(mode); } //! See QPaintEngine::drawPolygon() void QwtNullPaintDevice::drawPolygon( const QPoint *points, int pointCount, QPaintEngine::PolygonDrawMode mode) { Q_UNUSED(points); Q_UNUSED(pointCount); Q_UNUSED(mode); } //! See QPaintEngine::drawPixmap() void QwtNullPaintDevice::drawPixmap( const QRectF &rect, const QPixmap &pm, const QRectF &subRect ) { Q_UNUSED(rect); Q_UNUSED(pm); Q_UNUSED(subRect); } //! See QPaintEngine::drawTextItem() void QwtNullPaintDevice::drawTextItem( const QPointF &pos, const QTextItem &textItem) { Q_UNUSED(pos); Q_UNUSED(textItem); } //! See QPaintEngine::drawTiledPixmap() void QwtNullPaintDevice::drawTiledPixmap( const QRectF &rect, const QPixmap &pixmap, const QPointF &subRect) { Q_UNUSED(rect); Q_UNUSED(pixmap); Q_UNUSED(subRect); } //! See QPaintEngine::drawImage() void QwtNullPaintDevice::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { Q_UNUSED(rect); Q_UNUSED(image); Q_UNUSED(subRect); Q_UNUSED(flags); } //! See QPaintEngine::updateState() void QwtNullPaintDevice::updateState( const QPaintEngineState &state ) { Q_UNUSED(state); } qsstv_9.2.6/qwt/qwt_null_paintdevice.h0000664000175000017500000000654313203343610016641 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_NULL_PAINT_DEVICE_H #define QWT_NULL_PAINT_DEVICE_H 1 #include "qwt_global.h" #include #include /*! \brief A null paint device doing nothing Sometimes important layout/rendering geometries are not available or changeable from the public Qt class interface. ( f.e hidden in the style implementation ). QwtNullPaintDevice can be used to manipulate or filter out this information by analyzing the stream of paint primitives. F.e. QwtNullPaintDevice is used by QwtPlotCanvas to identify styled backgrounds with rounded corners. */ class QWT_EXPORT QwtNullPaintDevice: public QPaintDevice { public: /*! \brief Render mode \sa setMode(), mode() */ enum Mode { /*! All vector graphic primitives are painted by the corresponding draw methods */ NormalMode, /*! Vector graphic primitives ( beside polygons ) are mapped to a QPainterPath and are painted by drawPath. In PathMode mode only a few draw methods are called: - drawPath() - drawPixmap() - drawImage() - drawPolygon() */ PolygonPathMode, /*! Vector graphic primitives are mapped to a QPainterPath and are painted by drawPath. In PathMode mode only a few draw methods are called: - drawPath() - drawPixmap() - drawImage() */ PathMode }; QwtNullPaintDevice(); virtual ~QwtNullPaintDevice(); void setMode( Mode ); Mode mode() const; virtual QPaintEngine *paintEngine() const; virtual int metric( PaintDeviceMetric metric ) const; virtual void drawRects(const QRect *, int ); virtual void drawRects(const QRectF *, int ); virtual void drawLines(const QLine *, int ); virtual void drawLines(const QLineF *, int ); virtual void drawEllipse(const QRectF &); virtual void drawEllipse(const QRect &); virtual void drawPath(const QPainterPath &); virtual void drawPoints(const QPointF *, int ); virtual void drawPoints(const QPoint *, int ); virtual void drawPolygon( const QPointF *, int , QPaintEngine::PolygonDrawMode ); virtual void drawPolygon( const QPoint *, int , QPaintEngine::PolygonDrawMode ); virtual void drawPixmap(const QRectF &, const QPixmap &, const QRectF &); virtual void drawTextItem(const QPointF &, const QTextItem &); virtual void drawTiledPixmap(const QRectF &, const QPixmap &, const QPointF &s); virtual void drawImage(const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); virtual void updateState( const QPaintEngineState &state ); protected: //! \return Size needed to implement metric() virtual QSize sizeMetrics() const = 0; private: class PaintEngine; PaintEngine *d_engine; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_painter.cpp0000664000175000017500000010512513203343610015305 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #endif #if QT_VERSION < 0x050000 #ifdef Q_WS_X11 #include #endif #endif bool QwtPainter::d_polylineSplitting = true; bool QwtPainter::d_roundingAlignment = true; static inline bool qwtIsClippingNeeded( const QPainter *painter, QRectF &clipRect ) { bool doClipping = false; const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::SVG ) { // The SVG paint engine ignores any clipping, if ( painter->hasClipping() ) { doClipping = true; clipRect = painter->clipRegion().boundingRect(); } } return doClipping; } template static inline void qwtDrawPolyline( QPainter *painter, const T *points, int pointCount, bool polylineSplitting ) { bool doSplit = false; if ( polylineSplitting ) { const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::Raster ) { /* The raster paint engine seems to use some algo with O(n*n). ( Qt 4.3 is better than Qt 4.2, but remains unacceptable) To work around this problem, we have to split the polygon into smaller pieces. */ doSplit = true; } } if ( doSplit ) { const int splitSize = 20; for ( int i = 0; i < pointCount; i += splitSize ) { const int n = qMin( splitSize + 1, pointCount - i ); painter->drawPolyline( points + i, n ); } } else painter->drawPolyline( points, pointCount ); } static inline void qwtUnscaleFont( QPainter *painter ) { if ( painter->font().pixelSize() >= 0 ) return; static QSize screenResolution; if ( !screenResolution.isValid() ) { QDesktopWidget *desktop = QApplication::desktop(); if ( desktop ) { screenResolution.setWidth( desktop->logicalDpiX() ); screenResolution.setHeight( desktop->logicalDpiY() ); } } const QPaintDevice *pd = painter->device(); if ( pd->logicalDpiX() != screenResolution.width() || pd->logicalDpiY() != screenResolution.height() ) { QFont pixelFont( painter->font(), QApplication::desktop() ); pixelFont.setPixelSize( QFontInfo( pixelFont ).pixelSize() ); painter->setFont( pixelFont ); } } /*! Check is the application is running with the X11 graphics system that has some special capabilities that can be used for incremental painting to a widget. \return True, when the graphics system is X11 */ bool QwtPainter::isX11GraphicsSystem() { static int onX11 = -1; if ( onX11 < 0 ) { QPixmap pm( 1, 1 ); QPainter painter( &pm ); onX11 = ( painter.paintEngine()->type() == QPaintEngine::X11 ) ? 1 : 0; } return onX11 == 1; } /*! Check if the painter is using a paint engine, that aligns coordinates to integers. Today these are all paint engines beside QPaintEngine::Pdf and QPaintEngine::SVG. If we have an integer based paint engine it is also checked if the painter has a transformation matrix, that rotates or scales. \param painter Painter \return true, when the painter is aligning \sa setRoundingAlignment() */ bool QwtPainter::isAligning( QPainter *painter ) { if ( painter && painter->isActive() ) { switch ( painter->paintEngine()->type() ) { case QPaintEngine::Pdf: case QPaintEngine::SVG: return false; default:; } const QTransform tr = painter->transform(); if ( tr.isRotating() || tr.isScaling() ) { // we might have to check translations too return false; } } return true; } /*! Enable whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( PDF, SVG ), this flag has no effect. QwtPainter stores this flag only, the rounding itself is done in the painting code ( f.e the plot items ). The default setting is true. \sa roundingAlignment(), isAligning() */ void QwtPainter::setRoundingAlignment( bool enable ) { d_roundingAlignment = enable; } /*! \brief En/Disable line splitting for the raster paint engine In some Qt versions the raster paint engine paints polylines of many points much faster when they are split in smaller chunks: f.e all supported Qt versions >= Qt 5.0 when drawing an antialiased polyline with a pen width >=2. The default setting is true. \sa polylineSplitting() */ void QwtPainter::setPolylineSplitting( bool enable ) { d_polylineSplitting = enable; } //! Wrapper for QPainter::drawPath() void QwtPainter::drawPath( QPainter *painter, const QPainterPath &path ) { painter->drawPath( path ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, double x, double y, double w, double h ) { drawRect( painter, QRectF( x, y, w, h ) ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, const QRectF &rect ) { const QRectF r = rect; QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { if ( !clipRect.intersects( r ) ) return; if ( !clipRect.contains( r ) ) { fillRect( painter, r & clipRect, painter->brush() ); painter->save(); painter->setBrush( Qt::NoBrush ); drawPolyline( painter, QPolygonF( r ) ); painter->restore(); return; } } painter->drawRect( r ); } //! Wrapper for QPainter::fillRect() void QwtPainter::fillRect( QPainter *painter, const QRectF &rect, const QBrush &brush ) { if ( !rect.isValid() ) return; QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); /* Performance of Qt4 is horrible for a non trivial brush. Without clipping expect minutes or hours for repainting large rectangles (might result from zooming) */ if ( deviceClipping ) clipRect &= painter->window(); else clipRect = painter->window(); if ( painter->hasClipping() ) clipRect &= painter->clipRegion().boundingRect(); QRectF r = rect; if ( deviceClipping ) r = r.intersected( clipRect ); if ( r.isValid() ) painter->fillRect( r, brush ); } //! Wrapper for QPainter::drawPie() void QwtPainter::drawPie( QPainter *painter, const QRectF &rect, int a, int alen ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawPie( rect, a, alen ); } //! Wrapper for QPainter::drawEllipse() void QwtPainter::drawEllipse( QPainter *painter, const QRectF &rect ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawEllipse( rect ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, const QString &text ) { drawText( painter, QPointF( x, y ), text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QPointF &pos, const QString &text ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->save(); qwtUnscaleFont( painter ); painter->drawText( pos, text ); painter->restore(); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, double w, double h, int flags, const QString &text ) { drawText( painter, QRectF( x, y, w, h ), flags, text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QRectF &rect, int flags, const QString &text ) { painter->save(); qwtUnscaleFont( painter ); painter->drawText( rect, flags, text ); painter->restore(); } #ifndef QT_NO_RICHTEXT /*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); painter->setFont( txt->defaultFont() ); qwtUnscaleFont( painter ); txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; } #endif // !QT_NO_RICHTEXT //! Wrapper for QPainter::drawLine() void QwtPainter::drawLine( QPainter *painter, const QPointF &p1, const QPointF &p2 ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !( clipRect.contains( p1 ) && clipRect.contains( p2 ) ) ) { QPolygonF polygon; polygon += p1; polygon += p2; drawPolyline( painter, polygon ); return; } painter->drawLine( p1, p2 ); } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, cpa ); qwtDrawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF polygon( pointCount ); ::memcpy( polygon.data(), points, pointCount * sizeof( QPointF ) ); polygon = QwtClipper::clipPolygonF( clipRect, polygon ); qwtDrawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else { qwtDrawPolyline( painter, points, pointCount, d_polylineSplitting ); } } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygon &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygon cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygon( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygon &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygon cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygon( clipRect, cpa ); qwtDrawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPoint *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygon polygon( pointCount ); ::memcpy( polygon.data(), points, pointCount * sizeof( QPoint ) ); polygon = QwtClipper::clipPolygon( clipRect, polygon ); qwtDrawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else qwtDrawPolyline( painter, points, pointCount, d_polylineSplitting ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPointF &pos ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->drawPoint( pos ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPoint &pos ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); if ( pos.x() < minX || pos.x() > maxX || pos.y() < minY || pos.y() > maxY ) { return; } } painter->drawPoint( pos ); } //! Wrapper for QPainter::drawPoints() void QwtPainter::drawPoints( QPainter *painter, const QPoint *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); const QRect r( minX, minY, maxX - minX, maxY - minY ); QPolygon clippedPolygon( pointCount ); QPoint *clippedData = clippedPolygon.data(); int numClippedPoints = 0; for ( int i = 0; i < pointCount; i++ ) { if ( r.contains( points[i] ) ) clippedData[ numClippedPoints++ ] = points[i]; } painter->drawPoints( clippedData, numClippedPoints ); } else { painter->drawPoints( points, pointCount ); } } //! Wrapper for QPainter::drawPoints() void QwtPainter::drawPoints( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF clippedPolygon( pointCount ); QPointF *clippedData = clippedPolygon.data(); int numClippedPoints = 0; for ( int i = 0; i < pointCount; i++ ) { if ( clipRect.contains( points[i] ) ) clippedData[ numClippedPoints++ ] = points[i]; } painter->drawPoints( clippedData, numClippedPoints ); } else { painter->drawPoints( points, pointCount ); } } //! Wrapper for QPainter::drawImage() void QwtPainter::drawImage( QPainter *painter, const QRectF &rect, const QImage &image ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawImage( alignedRect, image ); painter->restore(); } else { painter->drawImage( alignedRect, image ); } } //! Wrapper for QPainter::drawPixmap() void QwtPainter::drawPixmap( QPainter *painter, const QRectF &rect, const QPixmap &pixmap ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawPixmap( alignedRect, pixmap ); painter->restore(); } else { painter->drawPixmap( alignedRect, pixmap ); } } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, const QWidget *widget ) { drawFocusRect( painter, widget, widget->rect() ); } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, const QWidget *widget, const QRect &rect ) { QStyleOptionFocusRect opt; opt.init( widget ); opt.rect = rect; opt.state |= QStyle::State_HasFocus; widget->style()->drawPrimitive( QStyle::PE_FrameFocusRect, &opt, painter, widget ); } /*! Draw a round frame \param painter Painter \param rect Frame rectangle \param palette QPalette::WindowText is used for plain borders QPalette::Dark and QPalette::Light for raised or sunken borders \param lineWidth Line width \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawRoundFrame( QPainter *painter, const QRectF &rect, const QPalette &palette, int lineWidth, int frameStyle ) { enum Style { Plain, Sunken, Raised }; Style style = Plain; if ( (frameStyle & QFrame::Sunken) == QFrame::Sunken ) style = Sunken; else if ( (frameStyle & QFrame::Raised) == QFrame::Raised ) style = Raised; const double lw2 = 0.5 * lineWidth; QRectF r = rect.adjusted( lw2, lw2, -lw2, -lw2 ); QBrush brush; if ( style != Plain ) { QColor c1 = palette.color( QPalette::Light ); QColor c2 = palette.color( QPalette::Dark ); if ( style == Sunken ) qSwap( c1, c2 ); QLinearGradient gradient( r.topLeft(), r.bottomRight() ); gradient.setColorAt( 0.0, c1 ); #if 0 gradient.setColorAt( 0.3, c1 ); gradient.setColorAt( 0.7, c2 ); #endif gradient.setColorAt( 1.0, c2 ); brush = QBrush( gradient ); } else // Plain { brush = palette.brush( QPalette::WindowText ); } painter->save(); painter->setPen( QPen( brush, lineWidth ) ); painter->setBrush( Qt::NoBrush ); painter->drawEllipse( r ); painter->restore(); } /*! Draw a rectangular frame \param painter Painter \param rect Frame rectangle \param palette Palette \param foregroundRole Foreground role used for QFrame::Plain \param frameWidth Frame width \param midLineWidth Used for QFrame::Box \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawFrame( QPainter *painter, const QRectF &rect, const QPalette &palette, QPalette::ColorRole foregroundRole, int frameWidth, int midLineWidth, int frameStyle ) { if ( frameWidth <= 0 || rect.isEmpty() ) return; const int shadow = frameStyle & QFrame::Shadow_Mask; painter->save(); if ( shadow == QFrame::Plain ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path; path.addRect( outerRect ); path.addRect( innerRect ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.color( foregroundRole ) ); painter->drawPath( path ); } else { const int shape = frameStyle & QFrame::Shape_Mask; if ( shape == QFrame::Box ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF midRect1 = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); const QRectF midRect2 = midRect1.adjusted( midLineWidth, midLineWidth, -midLineWidth, -midLineWidth ); const QRectF innerRect = midRect2.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( midRect1.topRight() ); path1.lineTo( midRect1.topLeft() ); path1.lineTo( midRect1.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( midRect1.topRight() ); path2.lineTo( midRect1.bottomRight() ); path2.lineTo( midRect1.bottomLeft() ); QPainterPath path3; path3.moveTo( midRect2.bottomLeft() ); path3.lineTo( midRect2.topLeft() ); path3.lineTo( midRect2.topRight() ); path3.lineTo( innerRect.topRight() ); path3.lineTo( innerRect.topLeft() ); path3.lineTo( innerRect.bottomLeft() ); QPainterPath path4; path4.moveTo( midRect2.bottomLeft() ); path4.lineTo( midRect2.bottomRight() ); path4.lineTo( midRect2.topRight() ); path4.lineTo( innerRect.topRight() ); path4.lineTo( innerRect.bottomRight() ); path4.lineTo( innerRect.bottomLeft() ); QPainterPath path5; path5.addRect( midRect1 ); path5.addRect( midRect2 ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->drawPath( path4 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); painter->drawPath( path3 ); painter->setBrush( palette.mid() ); painter->drawPath( path5 ); } #if 0 // qDrawWinPanel doesn't result in something nice // on a scalable document like PDF. Better draw a // Panel. else if ( shape == QFrame::WinPanel ) { painter->setRenderHint( QPainter::NonCosmeticDefaultPen, true ); qDrawWinPanel ( painter, rect.toRect(), palette, frameStyle & QFrame::Sunken ); } else if ( shape == QFrame::StyledPanel ) { } #endif else { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth - 1.0, frameWidth - 1.0, -( frameWidth - 1.0 ), -( frameWidth - 1.0 ) ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( innerRect.topRight() ); path1.lineTo( innerRect.topLeft() ); path1.lineTo( innerRect.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( innerRect.topRight() ); path2.lineTo( innerRect.bottomRight() ); path2.lineTo( innerRect.bottomLeft() ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); } } painter->restore(); } /*! Draw a rectangular frame with rounded borders \param painter Painter \param rect Frame rectangle \param xRadius x-radius of the ellipses defining the corners \param yRadius y-radius of the ellipses defining the corners \param palette QPalette::WindowText is used for plain borders QPalette::Dark and QPalette::Light for raised or sunken borders \param lineWidth Line width \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawRoundedFrame( QPainter *painter, const QRectF &rect, double xRadius, double yRadius, const QPalette &palette, int lineWidth, int frameStyle ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); painter->setBrush( Qt::NoBrush ); double lw2 = lineWidth * 0.5; QRectF r = rect.adjusted( lw2, lw2, -lw2, -lw2 ); QPainterPath path; path.addRoundedRect( r, xRadius, yRadius ); enum Style { Plain, Sunken, Raised }; Style style = Plain; if ( (frameStyle & QFrame::Sunken) == QFrame::Sunken ) style = Sunken; else if ( (frameStyle & QFrame::Raised) == QFrame::Raised ) style = Raised; if ( style != Plain && path.elementCount() == 17 ) { // move + 4 * ( cubicTo + lineTo ) QPainterPath pathList[8]; for ( int i = 0; i < 4; i++ ) { const int j = i * 4 + 1; pathList[ 2 * i ].moveTo( path.elementAt(j - 1).x, path.elementAt( j - 1 ).y ); pathList[ 2 * i ].cubicTo( path.elementAt(j + 0).x, path.elementAt(j + 0).y, path.elementAt(j + 1).x, path.elementAt(j + 1).y, path.elementAt(j + 2).x, path.elementAt(j + 2).y ); pathList[ 2 * i + 1 ].moveTo( path.elementAt(j + 2).x, path.elementAt(j + 2).y ); pathList[ 2 * i + 1 ].lineTo( path.elementAt(j + 3).x, path.elementAt(j + 3).y ); } QColor c1( palette.color( QPalette::Dark ) ); QColor c2( palette.color( QPalette::Light ) ); if ( style == Raised ) qSwap( c1, c2 ); for ( int i = 0; i < 4; i++ ) { QRectF r = pathList[2 * i].controlPointRect(); QPen arcPen; arcPen.setCapStyle( Qt::FlatCap ); arcPen.setWidth( lineWidth ); QPen linePen; linePen.setCapStyle( Qt::FlatCap ); linePen.setWidth( lineWidth ); switch( i ) { case 0: { arcPen.setColor( c1 ); linePen.setColor( c1 ); break; } case 1: { QLinearGradient gradient; gradient.setStart( r.topLeft() ); gradient.setFinalStop( r.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 1.0, c2 ); arcPen.setBrush( gradient ); linePen.setColor( c2 ); break; } case 2: { arcPen.setColor( c2 ); linePen.setColor( c2 ); break; } case 3: { QLinearGradient gradient; gradient.setStart( r.bottomRight() ); gradient.setFinalStop( r.topLeft() ); gradient.setColorAt( 0.0, c2 ); gradient.setColorAt( 1.0, c1 ); arcPen.setBrush( gradient ); linePen.setColor( c1 ); break; } } painter->setPen( arcPen ); painter->drawPath( pathList[ 2 * i] ); painter->setPen( linePen ); painter->drawPath( pathList[ 2 * i + 1] ); } } else { QPen pen( palette.color( QPalette::WindowText ), lineWidth ); painter->setPen( pen ); painter->drawPath( path ); } painter->restore(); } /*! Draw a color bar into a rectangle \param painter Painter \param colorMap Color map \param interval Value range \param scaleMap Scale map \param orientation Orientation \param rect Traget rectangle */ void QwtPainter::drawColorBar( QPainter *painter, const QwtColorMap &colorMap, const QwtInterval &interval, const QwtScaleMap &scaleMap, Qt::Orientation orientation, const QRectF &rect ) { QVector colorTable; if ( colorMap.format() == QwtColorMap::Indexed ) colorTable = colorMap.colorTable( interval ); QColor c; const QRect devRect = rect.toAlignedRect(); /* We paint to a pixmap first to have something scalable for printing ( f.e. in a Pdf document ) */ QPixmap pixmap( devRect.size() ); QPainter pmPainter( &pixmap ); pmPainter.translate( -devRect.x(), -devRect.y() ); if ( orientation == Qt::Horizontal ) { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.left(), rect.right() ); for ( int x = devRect.left(); x <= devRect.right(); x++ ) { const double value = sMap.invTransform( x ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( x, devRect.top(), x, devRect.bottom() ); } } else // Vertical { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.bottom(), rect.top() ); for ( int y = devRect.top(); y <= devRect.bottom(); y++ ) { const double value = sMap.invTransform( y ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( devRect.left(), y, devRect.right(), y ); } } pmPainter.end(); drawPixmap( painter, rect, pixmap ); } static inline void qwtFillRect( const QWidget *widget, QPainter *painter, const QRect &rect, const QBrush &brush) { if ( brush.style() == Qt::TexturePattern ) { painter->save(); painter->setClipRect( rect ); painter->drawTiledPixmap(rect, brush.texture(), rect.topLeft()); painter->restore(); } else if ( brush.gradient() ) { painter->save(); painter->setClipRect( rect ); painter->fillRect(0, 0, widget->width(), widget->height(), brush); painter->restore(); } else { painter->fillRect(rect, brush); } } /*! Fill a pixmap with the content of a widget In Qt >= 5.0 QPixmap::fill() is a nop, in Qt 4.x it is buggy for backgrounds with gradients. Thus fillPixmap() offers an alternative implementation. \param widget Widget \param pixmap Pixmap to be filled \param offset Offset \sa QPixmap::fill() */ void QwtPainter::fillPixmap( const QWidget *widget, QPixmap &pixmap, const QPoint &offset ) { const QRect rect( offset, pixmap.size() ); QPainter painter( &pixmap ); painter.translate( -offset ); const QBrush autoFillBrush = widget->palette().brush( widget->backgroundRole() ); if ( !( widget->autoFillBackground() && autoFillBrush.isOpaque() ) ) { const QBrush bg = widget->palette().brush( QPalette::Window ); qwtFillRect( widget, &painter, rect, bg); } if ( widget->autoFillBackground() ) qwtFillRect( widget, &painter, rect, autoFillBrush); if ( widget->testAttribute(Qt::WA_StyledBackground) ) { painter.setClipRegion( rect ); QStyleOption opt; opt.initFrom( widget ); widget->style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, widget ); } } /*! Fill rect with the background of a widget \param painter Painter \param rect Rectangle to be filled \param widget Widget \sa QStyle::PE_Widget, QWidget::backgroundRole() */ void QwtPainter::drawBackgound( QPainter *painter, const QRectF &rect, const QWidget *widget ) { if ( widget->testAttribute( Qt::WA_StyledBackground ) ) { QStyleOption opt; opt.initFrom( widget ); opt.rect = rect.toAlignedRect(); widget->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, widget); } else { const QBrush brush = widget->palette().brush( widget->backgroundRole() ); painter->fillRect( rect, brush ); } } /*! \return A pixmap that can be used as backing store \param widget Widget, for which the backinstore is intended \param size Size of the pixmap */ QPixmap QwtPainter::backingStore( QWidget *widget, const QSize &size ) { QPixmap pm; #define QWT_HIGH_DPI 1 #if QT_VERSION >= 0x050000 && QWT_HIGH_DPI qreal pixelRatio = 1.0; if ( widget && widget->windowHandle() ) { pixelRatio = widget->windowHandle()->devicePixelRatio(); } else { if ( qApp ) pixelRatio = qApp->devicePixelRatio(); } pm = QPixmap( size * pixelRatio ); pm.setDevicePixelRatio( pixelRatio ); #else Q_UNUSED( widget ) pm = QPixmap( size ); #endif #if QT_VERSION < 0x050000 #ifdef Q_WS_X11 if ( widget && isX11GraphicsSystem() ) { if ( pm.x11Info().screen() != widget->x11Info().screen() ) pm.x11SetScreen( widget->x11Info().screen() ); } #endif #endif return pm; } qsstv_9.2.6/qwt/qwt_painter.h0000664000175000017500000001376413203343610014761 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_H #define QWT_PAINTER_H #include "qwt_global.h" #include #include #include #include #include class QPainter; class QBrush; class QColor; class QWidget; class QPolygonF; class QRectF; class QImage; class QPixmap; class QwtScaleMap; class QwtColorMap; class QwtInterval; class QTextDocument; class QPainterPath; /*! \brief A collection of QPainter workarounds */ class QWT_EXPORT QwtPainter { public: static void setPolylineSplitting( bool ); static bool polylineSplitting(); static void setRoundingAlignment( bool ); static bool roundingAlignment(); static bool roundingAlignment(QPainter *); static void drawText( QPainter *, double x, double y, const QString & ); static void drawText( QPainter *, const QPointF &, const QString & ); static void drawText( QPainter *, double x, double y, double w, double h, int flags, const QString & ); static void drawText( QPainter *, const QRectF &, int flags, const QString & ); #ifndef QT_NO_RICHTEXT static void drawSimpleRichText( QPainter *, const QRectF &, int flags, const QTextDocument & ); #endif static void drawRect( QPainter *, double x, double y, double w, double h ); static void drawRect( QPainter *, const QRectF &rect ); static void fillRect( QPainter *, const QRectF &, const QBrush & ); static void drawEllipse( QPainter *, const QRectF & ); static void drawPie( QPainter *, const QRectF & r, int a, int alen ); static void drawLine( QPainter *, double x1, double y1, double x2, double y2 ); static void drawLine( QPainter *, const QPointF &p1, const QPointF &p2 ); static void drawLine( QPainter *, const QLineF & ); static void drawPolygon( QPainter *, const QPolygonF & ); static void drawPolyline( QPainter *, const QPolygonF & ); static void drawPolyline( QPainter *, const QPointF *, int pointCount ); static void drawPolygon( QPainter *, const QPolygon & ); static void drawPolyline( QPainter *, const QPolygon & ); static void drawPolyline( QPainter *, const QPoint *, int pointCount ); static void drawPoint( QPainter *, const QPoint & ); static void drawPoints( QPainter *, const QPolygon & ); static void drawPoints( QPainter *, const QPoint *, int pointCount ); static void drawPoint( QPainter *, double x, double y ); static void drawPoint( QPainter *, const QPointF & ); static void drawPoints( QPainter *, const QPolygonF & ); static void drawPoints( QPainter *, const QPointF *, int pointCount ); static void drawPath( QPainter *, const QPainterPath & ); static void drawImage( QPainter *, const QRectF &, const QImage & ); static void drawPixmap( QPainter *, const QRectF &, const QPixmap & ); static void drawRoundFrame( QPainter *, const QRectF &, const QPalette &, int lineWidth, int frameStyle ); static void drawRoundedFrame( QPainter *, const QRectF &, double xRadius, double yRadius, const QPalette &, int lineWidth, int frameStyle ); static void drawFrame( QPainter *, const QRectF &rect, const QPalette &palette, QPalette::ColorRole foregroundRole, int lineWidth, int midLineWidth, int frameStyle ); static void drawFocusRect( QPainter *, const QWidget * ); static void drawFocusRect( QPainter *, const QWidget *, const QRect & ); static void drawColorBar( QPainter *painter, const QwtColorMap &, const QwtInterval &, const QwtScaleMap &, Qt::Orientation, const QRectF & ); static bool isAligning( QPainter *painter ); static bool isX11GraphicsSystem(); static void fillPixmap( const QWidget *, QPixmap &, const QPoint &offset = QPoint() ); static void drawBackgound( QPainter *painter, const QRectF &rect, const QWidget *widget ); static QPixmap backingStore( QWidget *, const QSize & ); private: static bool d_polylineSplitting; static bool d_roundingAlignment; }; //! Wrapper for QPainter::drawPoint() inline void QwtPainter::drawPoint( QPainter *painter, double x, double y ) { QwtPainter::drawPoint( painter, QPointF( x, y ) ); } //! Wrapper for QPainter::drawPoints() inline void QwtPainter::drawPoints( QPainter *painter, const QPolygon &polygon ) { drawPoints( painter, polygon.data(), polygon.size() ); } //! Wrapper for QPainter::drawPoints() inline void QwtPainter::drawPoints( QPainter *painter, const QPolygonF &polygon ) { drawPoints( painter, polygon.data(), polygon.size() ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, double x1, double y1, double x2, double y2 ) { QwtPainter::drawLine( painter, QPointF( x1, y1 ), QPointF( x2, y2 ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, const QLineF &line ) { QwtPainter::drawLine( painter, line.p1(), line.p2() ); } /*! \return True, when line splitting for the raster paint engine is enabled. \sa setPolylineSplitting() */ inline bool QwtPainter::polylineSplitting() { return d_polylineSplitting; } /*! Check whether coordinates should be rounded, before they are painted to a paint engine that rounds to integer values. For other paint engines ( PDF, SVG ), this flag has no effect. \return True, when rounding is enabled \sa setRoundingAlignment(), isAligning() */ inline bool QwtPainter::roundingAlignment() { return d_roundingAlignment; } /*! \return roundingAlignment() && isAligning(painter); \param painter Painter */ inline bool QwtPainter::roundingAlignment(QPainter *painter) { return d_roundingAlignment && isAligning(painter); } #endif qsstv_9.2.6/qwt/qwt_painter_command.cpp0000664000175000017500000001301613203343610017000 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_painter_command.h" //! Construct an invalid command QwtPainterCommand::QwtPainterCommand(): d_type( Invalid ) { } //! Copy constructor QwtPainterCommand::QwtPainterCommand( const QPainterPath &path ): d_type( Path ) { d_path = new QPainterPath( path ); } /*! Constructor for Pixmap paint operation \param rect Target rectangle \param pixmap Pixmap \param subRect Rectangle inside the pixmap \sa QPainter::drawPixmap() */ QwtPainterCommand::QwtPainterCommand( const QRectF &rect, const QPixmap &pixmap, const QRectF& subRect ): d_type( Pixmap ) { d_pixmapData = new PixmapData(); d_pixmapData->rect = rect; d_pixmapData->pixmap = pixmap; d_pixmapData->subRect = subRect; } /*! Constructor for Image paint operation \param rect Target rectangle \param image Image \param subRect Rectangle inside the image \param flags Conversion flags \sa QPainter::drawImage() */ QwtPainterCommand::QwtPainterCommand( const QRectF &rect, const QImage &image, const QRectF& subRect, Qt::ImageConversionFlags flags ): d_type( Image ) { d_imageData = new ImageData(); d_imageData->rect = rect; d_imageData->image = image; d_imageData->subRect = subRect; d_imageData->flags = flags; } /*! Constructor for State paint operation \param state Paint engine state */ QwtPainterCommand::QwtPainterCommand( const QPaintEngineState &state ): d_type( State ) { d_stateData = new StateData(); d_stateData->flags = state.state(); if ( d_stateData->flags & QPaintEngine::DirtyPen ) d_stateData->pen = state.pen(); if ( d_stateData->flags & QPaintEngine::DirtyBrush ) d_stateData->brush = state.brush(); if ( d_stateData->flags & QPaintEngine::DirtyBrushOrigin ) d_stateData->brushOrigin = state.brushOrigin(); if ( d_stateData->flags & QPaintEngine::DirtyFont ) d_stateData->font = state.font(); if ( d_stateData->flags & QPaintEngine::DirtyBackground ) { d_stateData->backgroundMode = state.backgroundMode(); d_stateData->backgroundBrush = state.backgroundBrush(); } if ( d_stateData->flags & QPaintEngine::DirtyTransform ) d_stateData->transform = state.transform(); if ( d_stateData->flags & QPaintEngine::DirtyClipEnabled ) d_stateData->isClipEnabled = state.isClipEnabled(); if ( d_stateData->flags & QPaintEngine::DirtyClipRegion ) { d_stateData->clipRegion = state.clipRegion(); d_stateData->clipOperation = state.clipOperation(); } if ( d_stateData->flags & QPaintEngine::DirtyClipPath ) { d_stateData->clipPath = state.clipPath(); d_stateData->clipOperation = state.clipOperation(); } if ( d_stateData->flags & QPaintEngine::DirtyHints ) d_stateData->renderHints = state.renderHints(); if ( d_stateData->flags & QPaintEngine::DirtyCompositionMode ) d_stateData->compositionMode = state.compositionMode(); if ( d_stateData->flags & QPaintEngine::DirtyOpacity ) d_stateData->opacity = state.opacity(); } /*! Copy constructor \param other Command to be copied */ QwtPainterCommand::QwtPainterCommand(const QwtPainterCommand &other) { copy( other ); } //! Destructor QwtPainterCommand::~QwtPainterCommand() { reset(); } /*! Assignment operator \param other Command to be copied \return Modified command */ QwtPainterCommand &QwtPainterCommand::operator=(const QwtPainterCommand &other) { reset(); copy( other ); return *this; } void QwtPainterCommand::copy( const QwtPainterCommand &other ) { d_type = other.d_type; switch( other.d_type ) { case Path: { d_path = new QPainterPath( *other.d_path ); break; } case Pixmap: { d_pixmapData = new PixmapData( *other.d_pixmapData ); break; } case Image: { d_imageData = new ImageData( *other.d_imageData ); break; } case State: { d_stateData = new StateData( *other.d_stateData ); break; } default: break; } } void QwtPainterCommand::reset() { switch( d_type ) { case Path: { delete d_path; break; } case Pixmap: { delete d_pixmapData; break; } case Image: { delete d_imageData; break; } case State: { delete d_stateData; break; } default: break; } d_type = Invalid; } //! \return Painter path to be painted QPainterPath *QwtPainterCommand::path() { return d_path; } //! \return Attributes how to paint a QPixmap QwtPainterCommand::PixmapData* QwtPainterCommand::pixmapData() { return d_pixmapData; } //! \return Attributes how to paint a QImage QwtPainterCommand::ImageData* QwtPainterCommand::imageData() { return d_imageData; } //! \return Attributes of a state change QwtPainterCommand::StateData* QwtPainterCommand::stateData() { return d_stateData; } qsstv_9.2.6/qwt/qwt_painter_command.h0000664000175000017500000000734013203343610016450 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_COMMAND_H #define QWT_PAINTER_COMMAND_H #include "qwt_global.h" #include #include #include #include class QPainterPath; /*! QwtPainterCommand represents the attributes of a paint operation how it is used between QPainter and QPaintDevice It is used by QwtGraphic to record and replay paint operations \sa QwtGraphic::commands() */ class QWT_EXPORT QwtPainterCommand { public: //! Type of the paint command enum Type { //! Invalid command Invalid = -1, //! Draw a QPainterPath Path, //! Draw a QPixmap Pixmap, //! Draw a QImage Image, //! QPainter state change State }; //! Attributes how to paint a QPixmap struct PixmapData { QRectF rect; QPixmap pixmap; QRectF subRect; }; //! Attributes how to paint a QImage struct ImageData { QRectF rect; QImage image; QRectF subRect; Qt::ImageConversionFlags flags; }; //! Attributes of a state change struct StateData { QPaintEngine::DirtyFlags flags; QPen pen; QBrush brush; QPointF brushOrigin; QBrush backgroundBrush; Qt::BGMode backgroundMode; QFont font; QMatrix matrix; QTransform transform; Qt::ClipOperation clipOperation; QRegion clipRegion; QPainterPath clipPath; bool isClipEnabled; QPainter::RenderHints renderHints; QPainter::CompositionMode compositionMode; qreal opacity; }; QwtPainterCommand(); QwtPainterCommand(const QwtPainterCommand &); QwtPainterCommand( const QPainterPath & ); QwtPainterCommand( const QRectF &rect, const QPixmap &, const QRectF& subRect ); QwtPainterCommand( const QRectF &rect, const QImage &, const QRectF& subRect, Qt::ImageConversionFlags ); QwtPainterCommand( const QPaintEngineState & ); ~QwtPainterCommand(); QwtPainterCommand &operator=(const QwtPainterCommand & ); Type type() const; QPainterPath *path(); const QPainterPath *path() const; PixmapData* pixmapData(); const PixmapData* pixmapData() const; ImageData* imageData(); const ImageData* imageData() const; StateData* stateData(); const StateData* stateData() const; private: void copy( const QwtPainterCommand & ); void reset(); Type d_type; union { QPainterPath *d_path; PixmapData *d_pixmapData; ImageData *d_imageData; StateData *d_stateData; }; }; //! \return Type of the command inline QwtPainterCommand::Type QwtPainterCommand::type() const { return d_type; } //! \return Painter path to be painted inline const QPainterPath *QwtPainterCommand::path() const { return d_path; } //! \return Attributes how to paint a QPixmap inline const QwtPainterCommand::PixmapData* QwtPainterCommand::pixmapData() const { return d_pixmapData; } //! \return Attributes how to paint a QImage inline const QwtPainterCommand::ImageData * QwtPainterCommand::imageData() const { return d_imageData; } //! \return Attributes of a state change inline const QwtPainterCommand::StateData * QwtPainterCommand::stateData() const { return d_stateData; } #endif qsstv_9.2.6/qwt/qwt_panner.cpp0000664000175000017500000003022713203343610015126 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_panner.h" #include "qwt_picker.h" #include "qwt_painter.h" #include #include #include #include #include static QVector qwtActivePickers( QWidget *w ) { QVector pickers; QObjectList children = w->children(); for ( int i = 0; i < children.size(); i++ ) { QwtPicker *picker = qobject_cast( children[i] ); if ( picker && picker->isEnabled() ) pickers += picker; } return pickers; } class QwtPanner::PrivateData { public: PrivateData(): button( Qt::LeftButton ), buttonModifiers( Qt::NoModifier ), abortKey( Qt::Key_Escape ), abortKeyModifiers( Qt::NoModifier ), #ifndef QT_NO_CURSOR cursor( NULL ), restoreCursor( NULL ), hasCursor( false ), #endif isEnabled( false ) { orientations = Qt::Vertical | Qt::Horizontal; } ~PrivateData() { #ifndef QT_NO_CURSOR delete cursor; delete restoreCursor; #endif } Qt::MouseButton button; Qt::KeyboardModifiers buttonModifiers; int abortKey; Qt::KeyboardModifiers abortKeyModifiers; QPoint initialPos; QPoint pos; QPixmap pixmap; QBitmap contentsMask; #ifndef QT_NO_CURSOR QCursor *cursor; QCursor *restoreCursor; bool hasCursor; #endif bool isEnabled; Qt::Orientations orientations; }; /*! Creates an panner that is enabled for the left mouse button. \param parent Parent widget to be panned */ QwtPanner::QwtPanner( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData(); setAttribute( Qt::WA_TransparentForMouseEvents ); setAttribute( Qt::WA_NoSystemBackground ); setFocusPolicy( Qt::NoFocus ); hide(); setEnabled( true ); } //! Destructor QwtPanner::~QwtPanner() { delete d_data; } /*! Change the mouse button and modifiers used for panning The defaults are Qt::LeftButton and Qt::NoModifier */ void QwtPanner::setMouseButton( Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { d_data->button = button; d_data->buttonModifiers = modifiers; } //! Get mouse button and modifiers used for panning void QwtPanner::getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers &modifiers ) const { button = d_data->button; modifiers = d_data->buttonModifiers; } /*! Change the abort key The defaults are Qt::Key_Escape and Qt::NoModifiers \param key Key ( See Qt::Keycode ) \param modifiers Keyboard modifiers */ void QwtPanner::setAbortKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->abortKey = key; d_data->abortKeyModifiers = modifiers; } //! Get the abort key and modifiers void QwtPanner::getAbortKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->abortKey; modifiers = d_data->abortKeyModifiers; } /*! Change the cursor, that is active while panning The default is the cursor of the parent widget. \param cursor New cursor \sa setCursor() */ #ifndef QT_NO_CURSOR void QwtPanner::setCursor( const QCursor &cursor ) { d_data->cursor = new QCursor( cursor ); } #endif /*! \return Cursor that is active while panning \sa setCursor() */ #ifndef QT_NO_CURSOR const QCursor QwtPanner::cursor() const { if ( d_data->cursor ) return *d_data->cursor; if ( parentWidget() ) return parentWidget()->cursor(); return QCursor(); } #endif /*! \brief En/disable the panner When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param on true or false \sa isEnabled(), eventFilter() */ void QwtPanner::setEnabled( bool on ) { if ( d_data->isEnabled != on ) { d_data->isEnabled = on; QWidget *w = parentWidget(); if ( w ) { if ( d_data->isEnabled ) { w->installEventFilter( this ); } else { w->removeEventFilter( this ); hide(); } } } } /*! Set the orientations, where panning is enabled The default value is in both directions: Qt::Horizontal | Qt::Vertical /param o Orientation */ void QwtPanner::setOrientations( Qt::Orientations o ) { d_data->orientations = o; } //! Return the orientation, where paning is enabled Qt::Orientations QwtPanner::orientations() const { return d_data->orientations; } /*! \return True if an orientation is enabled \sa orientations(), setOrientations() */ bool QwtPanner::isOrientationEnabled( Qt::Orientation o ) const { return d_data->orientations & o; } /*! \return true when enabled, false otherwise \sa setEnabled, eventFilter() */ bool QwtPanner::isEnabled() const { return d_data->isEnabled; } /*! \brief Paint event Repaint the grabbed pixmap on its current position and fill the empty spaces by the background of the parent widget. \param pe Paint event */ void QwtPanner::paintEvent( QPaintEvent *pe ) { int dx = d_data->pos.x() - d_data->initialPos.x(); int dy = d_data->pos.y() - d_data->initialPos.y(); QRect r( 0, 0, d_data->pixmap.width(), d_data->pixmap.height() ); r.moveCenter( QPoint( r.center().x() + dx, r.center().y() + dy ) ); QPixmap pm( size() ); QwtPainter::fillPixmap( parentWidget(), pm ); QPainter painter( &pm ); if ( !d_data->contentsMask.isNull() ) { QPixmap masked = d_data->pixmap; masked.setMask( d_data->contentsMask ); painter.drawPixmap( r, masked ); } else { painter.drawPixmap( r, d_data->pixmap ); } painter.end(); if ( !d_data->contentsMask.isNull() ) pm.setMask( d_data->contentsMask ); painter.begin( this ); painter.setClipRegion( pe->region() ); painter.drawPixmap( 0, 0, pm ); } /*! \brief Calculate a mask for the contents of the panned widget Sometimes only parts of the contents of a widget should be panned. F.e. for a widget with a styled background with rounded borders only the area inside of the border should be panned. \return An empty bitmap, indicating no mask */ QBitmap QwtPanner::contentsMask() const { return QBitmap(); } /*! Grab the widget into a pixmap. \return Grabbed pixmap */ QPixmap QwtPanner::grab() const { #if QT_VERSION >= 0x050000 return parentWidget()->grab( parentWidget()->rect() ); #else return QPixmap::grabWidget( parentWidget() ); #endif } /*! \brief Event filter When isEnabled() is true mouse events of the observed widget are filtered. \param object Object to be filtered \param event Event \return Always false, beside for paint events for the parent widget. \sa widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent() */ bool QwtPanner::eventFilter( QObject *object, QEvent *event ) { if ( object == NULL || object != parentWidget() ) return false; switch ( event->type() ) { case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } case QEvent::Paint: { if ( isVisible() ) return true; break; } default:; } return false; } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), */ void QwtPanner::widgetMousePressEvent( QMouseEvent *mouseEvent ) { if ( ( mouseEvent->button() != d_data->button ) || ( mouseEvent->modifiers() != d_data->buttonModifiers ) ) { return; } QWidget *w = parentWidget(); if ( w == NULL ) return; #ifndef QT_NO_CURSOR showCursor( true ); #endif d_data->initialPos = d_data->pos = mouseEvent->pos(); setGeometry( parentWidget()->rect() ); // We don't want to grab the picker ! QVector pickers = qwtActivePickers( parentWidget() ); for ( int i = 0; i < pickers.size(); i++ ) pickers[i]->setEnabled( false ); d_data->pixmap = grab(); d_data->contentsMask = contentsMask(); for ( int i = 0; i < pickers.size(); i++ ) pickers[i]->setEnabled( true ); show(); } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent() */ void QwtPanner::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( !isVisible() ) return; QPoint pos = mouseEvent->pos(); if ( !isOrientationEnabled( Qt::Horizontal ) ) pos.setX( d_data->initialPos.x() ); if ( !isOrientationEnabled( Qt::Vertical ) ) pos.setY( d_data->initialPos.y() ); if ( pos != d_data->pos && rect().contains( pos ) ) { d_data->pos = pos; update(); Q_EMIT moved( d_data->pos.x() - d_data->initialPos.x(), d_data->pos.y() - d_data->initialPos.y() ); } } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(), */ void QwtPanner::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { if ( isVisible() ) { hide(); #ifndef QT_NO_CURSOR showCursor( false ); #endif QPoint pos = mouseEvent->pos(); if ( !isOrientationEnabled( Qt::Horizontal ) ) pos.setX( d_data->initialPos.x() ); if ( !isOrientationEnabled( Qt::Vertical ) ) pos.setY( d_data->initialPos.y() ); d_data->pixmap = QPixmap(); d_data->contentsMask = QBitmap(); d_data->pos = pos; if ( d_data->pos != d_data->initialPos ) { Q_EMIT panned( d_data->pos.x() - d_data->initialPos.x(), d_data->pos.y() - d_data->initialPos.y() ); } } } /*! Handle a key press event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtPanner::widgetKeyPressEvent( QKeyEvent *keyEvent ) { if ( ( keyEvent->key() == d_data->abortKey ) && ( keyEvent->modifiers() == d_data->abortKeyModifiers ) ) { hide(); #ifndef QT_NO_CURSOR showCursor( false ); #endif d_data->pixmap = QPixmap(); } } /*! Handle a key release event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtPanner::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { Q_UNUSED( keyEvent ); } #ifndef QT_NO_CURSOR void QwtPanner::showCursor( bool on ) { if ( on == d_data->hasCursor ) return; QWidget *w = parentWidget(); if ( w == NULL || d_data->cursor == NULL ) return; d_data->hasCursor = on; if ( on ) { if ( w->testAttribute( Qt::WA_SetCursor ) ) { delete d_data->restoreCursor; d_data->restoreCursor = new QCursor( w->cursor() ); } w->setCursor( *d_data->cursor ); } else { if ( d_data->restoreCursor ) { w->setCursor( *d_data->restoreCursor ); delete d_data->restoreCursor; d_data->restoreCursor = NULL; } else w->unsetCursor(); } } #endif qsstv_9.2.6/qwt/qwt_panner.h0000664000175000017500000000557413203343610014602 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PANNER_H #define QWT_PANNER_H 1 #include "qwt_global.h" #include #include class QCursor; /*! \brief QwtPanner provides panning of a widget QwtPanner grabs the contents of a widget, that can be dragged in all directions. The offset between the start and the end position is emitted by the panned signal. QwtPanner grabs the content of the widget into a pixmap and moves the pixmap around, without initiating any repaint events for the widget. Areas, that are not part of content are not painted while panning. This makes panning fast enough for widgets, where repaints are too slow for mouse movements. For widgets, where repaints are very fast it might be better to implement panning manually by mapping mouse events into paint events. */ class QWT_EXPORT QwtPanner: public QWidget { Q_OBJECT public: QwtPanner( QWidget* parent ); virtual ~QwtPanner(); void setEnabled( bool ); bool isEnabled() const; void setMouseButton( Qt::MouseButton, Qt::KeyboardModifiers = Qt::NoModifier ); void getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers & ) const; void setAbortKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getAbortKey( int &key, Qt::KeyboardModifiers & ) const; void setCursor( const QCursor & ); const QCursor cursor() const; void setOrientations( Qt::Orientations ); Qt::Orientations orientations() const; bool isOrientationEnabled( Qt::Orientation ) const; virtual bool eventFilter( QObject *, QEvent * ); Q_SIGNALS: /*! Signal emitted, when panning is done \param dx Offset in horizontal direction \param dy Offset in vertical direction */ void panned( int dx, int dy ); /*! Signal emitted, while the widget moved, but panning is not finished. \param dx Offset in horizontal direction \param dy Offset in vertical direction */ void moved( int dx, int dy ); protected: virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); virtual void paintEvent( QPaintEvent * ); virtual QBitmap contentsMask() const; virtual QPixmap grab() const; private: #ifndef QT_NO_CURSOR void showCursor( bool ); #endif class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_picker.cpp0000664000175000017500000011452113203343610015120 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_picker.h" #include "qwt_picker_machine.h" #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_widget_overlay.h" #include #include #include #include #include #include #include #include #include static inline QRegion qwtMaskRegion( const QRect &r, int penWidth ) { const int pw = qMax( penWidth, 1 ); const int pw2 = penWidth / 2; int x1 = r.left() - pw2; int x2 = r.right() + 1 + pw2 + ( pw % 2 ); int y1 = r.top() - pw2; int y2 = r.bottom() + 1 + pw2 + ( pw % 2 ); QRegion region; region += QRect( x1, y1, x2 - x1, pw ); region += QRect( x1, y1, pw, y2 - y1 ); region += QRect( x1, y2 - pw, x2 - x1, pw ); region += QRect( x2 - pw, y1, pw, y2 - y1 ); return region; } static inline QRegion qwtMaskRegion( const QLine &l, int penWidth ) { const int pw = qMax( penWidth, 1 ); const int pw2 = penWidth / 2; QRegion region; if ( l.x1() == l.x2() ) { region += QRect( l.x1() - pw2, l.y1(), pw, l.y2() ).normalized(); } else if ( l.y1() == l.y2() ) { region += QRect( l.x1(), l.y1() - pw2, l.x2(), pw ).normalized(); } return region; } class QwtPickerRubberband: public QwtWidgetOverlay { public: QwtPickerRubberband( QwtPicker *, QWidget * ); protected: virtual void drawOverlay( QPainter * ) const; virtual QRegion maskHint() const; QwtPicker *d_picker; }; class QwtPickerTracker: public QwtWidgetOverlay { public: QwtPickerTracker( QwtPicker *, QWidget * ); protected: virtual void drawOverlay( QPainter * ) const; virtual QRegion maskHint() const; QwtPicker *d_picker; }; class QwtPicker::PrivateData { public: PrivateData(): enabled( false ), stateMachine( NULL ), resizeMode( QwtPicker::Stretch ), rubberBand( QwtPicker::NoRubberBand ), trackerMode( QwtPicker::AlwaysOff ), isActive( false ), trackerPosition( -1, -1 ), mouseTracking( false ), openGL( false ) { } bool enabled; QwtPickerMachine *stateMachine; QwtPicker::ResizeMode resizeMode; QwtPicker::RubberBand rubberBand; QPen rubberBandPen; QwtPicker::DisplayMode trackerMode; QPen trackerPen; QFont trackerFont; QPolygon pickedPoints; bool isActive; QPoint trackerPosition; bool mouseTracking; // used to save previous value QPointer< QwtPickerRubberband > rubberBandOverlay; QPointer< QwtPickerTracker> trackerOverlay; bool openGL; }; QwtPickerRubberband::QwtPickerRubberband( QwtPicker *picker, QWidget *parent ): QwtWidgetOverlay( parent ), d_picker( picker ) { setMaskMode( QwtWidgetOverlay::MaskHint ); } QRegion QwtPickerRubberband::maskHint() const { return d_picker->rubberBandMask(); } void QwtPickerRubberband::drawOverlay( QPainter *painter ) const { painter->setPen( d_picker->rubberBandPen() ); d_picker->drawRubberBand( painter ); } QwtPickerTracker::QwtPickerTracker( QwtPicker *picker, QWidget *parent ): QwtWidgetOverlay( parent ), d_picker( picker ) { setMaskMode( QwtWidgetOverlay::MaskHint ); } QRegion QwtPickerTracker::maskHint() const { return d_picker->trackerRect( font() ); } void QwtPickerTracker::drawOverlay( QPainter *painter ) const { painter->setPen( d_picker->trackerPen() ); d_picker->drawTracker( painter ); } /*! Constructor Creates an picker that is enabled, but without a state machine. rubber band and tracker are disabled. \param parent Parent widget, that will be observed */ QwtPicker::QwtPicker( QWidget *parent ): QObject( parent ) { init( parent, NoRubberBand, AlwaysOff ); } /*! Constructor \param rubberBand Rubber band style \param trackerMode Tracker mode \param parent Parent widget, that will be observed */ QwtPicker::QwtPicker( RubberBand rubberBand, DisplayMode trackerMode, QWidget *parent ): QObject( parent ) { init( parent, rubberBand, trackerMode ); } //! Destructor QwtPicker::~QwtPicker() { setMouseTracking( false ); delete d_data->stateMachine; delete d_data->rubberBandOverlay; delete d_data->trackerOverlay; delete d_data; } //! Initialize the picker - used by the constructors void QwtPicker::init( QWidget *parent, RubberBand rubberBand, DisplayMode trackerMode ) { d_data = new PrivateData; d_data->rubberBand = rubberBand; if ( parent ) { if ( parent->focusPolicy() == Qt::NoFocus ) parent->setFocusPolicy( Qt::WheelFocus ); d_data->openGL = parent->inherits( "QGLWidget" ); d_data->trackerFont = parent->font(); d_data->mouseTracking = parent->hasMouseTracking(); setEnabled( true ); } setTrackerMode( trackerMode ); } /*! Set a state machine and delete the previous one \param stateMachine State machine \sa stateMachine() */ void QwtPicker::setStateMachine( QwtPickerMachine *stateMachine ) { if ( d_data->stateMachine != stateMachine ) { reset(); delete d_data->stateMachine; d_data->stateMachine = stateMachine; if ( d_data->stateMachine ) d_data->stateMachine->reset(); } } /*! \return Assigned state machine \sa setStateMachine() */ QwtPickerMachine *QwtPicker::stateMachine() { return d_data->stateMachine; } /*! \return Assigned state machine \sa setStateMachine() */ const QwtPickerMachine *QwtPicker::stateMachine() const { return d_data->stateMachine; } //! Return the parent widget, where the selection happens QWidget *QwtPicker::parentWidget() { QObject *obj = parent(); if ( obj && obj->isWidgetType() ) return static_cast( obj ); return NULL; } //! Return the parent widget, where the selection happens const QWidget *QwtPicker::parentWidget() const { QObject *obj = parent(); if ( obj && obj->isWidgetType() ) return static_cast< const QWidget *>( obj ); return NULL; } /*! Set the rubber band style \param rubberBand Rubber band style The default value is NoRubberBand. \sa rubberBand(), RubberBand, setRubberBandPen() */ void QwtPicker::setRubberBand( RubberBand rubberBand ) { d_data->rubberBand = rubberBand; } /*! \return Rubber band style \sa setRubberBand(), RubberBand, rubberBandPen() */ QwtPicker::RubberBand QwtPicker::rubberBand() const { return d_data->rubberBand; } /*! \brief Set the display mode of the tracker. A tracker displays information about current position of the cursor as a string. The display mode controls if the tracker has to be displayed whenever the observed widget has focus and cursor (AlwaysOn), never (AlwaysOff), or only when the selection is active (ActiveOnly). \param mode Tracker display mode \warning In case of AlwaysOn, mouseTracking will be enabled for the observed widget. \sa trackerMode(), DisplayMode */ void QwtPicker::setTrackerMode( DisplayMode mode ) { if ( d_data->trackerMode != mode ) { d_data->trackerMode = mode; setMouseTracking( d_data->trackerMode == AlwaysOn ); } } /*! \return Tracker display mode \sa setTrackerMode(), DisplayMode */ QwtPicker::DisplayMode QwtPicker::trackerMode() const { return d_data->trackerMode; } /*! \brief Set the resize mode. The resize mode controls what to do with the selected points of an active selection when the observed widget is resized. Stretch means the points are scaled according to the new size, KeepSize means the points remain unchanged. The default mode is Stretch. \param mode Resize mode \sa resizeMode(), ResizeMode */ void QwtPicker::setResizeMode( ResizeMode mode ) { d_data->resizeMode = mode; } /*! \return Resize mode \sa setResizeMode(), ResizeMode */ QwtPicker::ResizeMode QwtPicker::resizeMode() const { return d_data->resizeMode; } /*! \brief En/disable the picker When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param enabled true or false \sa isEnabled(), eventFilter() */ void QwtPicker::setEnabled( bool enabled ) { if ( d_data->enabled != enabled ) { d_data->enabled = enabled; QWidget *w = parentWidget(); if ( w ) { if ( enabled ) w->installEventFilter( this ); else w->removeEventFilter( this ); } updateDisplay(); } } /*! \return true when enabled, false otherwise \sa setEnabled(), eventFilter() */ bool QwtPicker::isEnabled() const { return d_data->enabled; } /*! Set the font for the tracker \param font Tracker font \sa trackerFont(), setTrackerMode(), setTrackerPen() */ void QwtPicker::setTrackerFont( const QFont &font ) { if ( font != d_data->trackerFont ) { d_data->trackerFont = font; updateDisplay(); } } /*! \return Tracker font \sa setTrackerFont(), trackerMode(), trackerPen() */ QFont QwtPicker::trackerFont() const { return d_data->trackerFont; } /*! Set the pen for the tracker \param pen Tracker pen \sa trackerPen(), setTrackerMode(), setTrackerFont() */ void QwtPicker::setTrackerPen( const QPen &pen ) { if ( pen != d_data->trackerPen ) { d_data->trackerPen = pen; updateDisplay(); } } /*! \return Tracker pen \sa setTrackerPen(), trackerMode(), trackerFont() */ QPen QwtPicker::trackerPen() const { return d_data->trackerPen; } /*! Set the pen for the rubberband \param pen Rubber band pen \sa rubberBandPen(), setRubberBand() */ void QwtPicker::setRubberBandPen( const QPen &pen ) { if ( pen != d_data->rubberBandPen ) { d_data->rubberBandPen = pen; updateDisplay(); } } /*! \return Rubber band pen \sa setRubberBandPen(), rubberBand() */ QPen QwtPicker::rubberBandPen() const { return d_data->rubberBandPen; } /*! \brief Return the label for a position In case of HLineRubberBand the label is the value of the y position, in case of VLineRubberBand the value of the x position. Otherwise the label contains x and y position separated by a ',' . The format for the string conversion is "%d". \param pos Position \return Converted position as string */ QwtText QwtPicker::trackerText( const QPoint &pos ) const { QString label; switch ( rubberBand() ) { case HLineRubberBand: label.sprintf( "%d", pos.y() ); break; case VLineRubberBand: label.sprintf( "%d", pos.x() ); break; default: label.sprintf( "%d, %d", pos.x(), pos.y() ); } return label; } /*! Calculate the mask for the rubber band overlay \return Region for the mask \sa QWidget::setMask() */ QRegion QwtPicker::rubberBandMask() const { QRegion mask; if ( !isActive() || rubberBand() == NoRubberBand || rubberBandPen().style() == Qt::NoPen ) { return mask; } const QPolygon pa = adjustedPoints( d_data->pickedPoints ); QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( d_data->stateMachine ) selectionType = d_data->stateMachine->selectionType(); switch ( selectionType ) { case QwtPickerMachine::NoSelection: case QwtPickerMachine::PointSelection: { if ( pa.count() < 1 ) return mask; const QPoint pos = pa[0]; const int pw = rubberBandPen().width(); const QRect pRect = pickArea().boundingRect().toRect(); switch ( rubberBand() ) { case VLineRubberBand: { mask += qwtMaskRegion( QLine( pos.x(), pRect.top(), pos.x(), pRect.bottom() ), pw ); break; } case HLineRubberBand: { mask += qwtMaskRegion( QLine( pRect.left(), pos.y(), pRect.right(), pos.y() ), pw ); break; } case CrossRubberBand: { mask += qwtMaskRegion( QLine( pos.x(), pRect.top(), pos.x(), pRect.bottom() ), pw ); mask += qwtMaskRegion( QLine( pRect.left(), pos.y(), pRect.right(), pos.y() ), pw ); break; } default: break; } break; } case QwtPickerMachine::RectSelection: { if ( pa.count() < 2 ) return mask; const int pw = rubberBandPen().width(); switch ( rubberBand() ) { case RectRubberBand: { const QRect r = QRect( pa.first(), pa.last() ); mask = qwtMaskRegion( r.normalized(), pw ); break; } case EllipseRubberBand: { const QRect r = QRect( pa.first(), pa.last() ); mask += r.adjusted( -pw, -pw, pw, pw ); break; } default: break; } break; } case QwtPickerMachine::PolygonSelection: { const int pw = rubberBandPen().width(); if ( pw <= 1 ) { // because of the join style we better // return a mask for a pen width <= 1 only const int off = 2 * pw; const QRect r = pa.boundingRect(); mask += r.adjusted( -off, -off, off, off ); } break; } default: break; } return mask; } /*! Draw a rubber band, depending on rubberBand() \param painter Painter, initialized with a clip region \sa rubberBand(), RubberBand */ void QwtPicker::drawRubberBand( QPainter *painter ) const { if ( !isActive() || rubberBand() == NoRubberBand || rubberBandPen().style() == Qt::NoPen ) { return; } const QPolygon pa = adjustedPoints( d_data->pickedPoints ); QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( d_data->stateMachine ) selectionType = d_data->stateMachine->selectionType(); switch ( selectionType ) { case QwtPickerMachine::NoSelection: case QwtPickerMachine::PointSelection: { if ( pa.count() < 1 ) return; const QPoint pos = pa[0]; const QRect pRect = pickArea().boundingRect().toRect(); switch ( rubberBand() ) { case VLineRubberBand: { QwtPainter::drawLine( painter, pos.x(), pRect.top(), pos.x(), pRect.bottom() ); break; } case HLineRubberBand: { QwtPainter::drawLine( painter, pRect.left(), pos.y(), pRect.right(), pos.y() ); break; } case CrossRubberBand: { QwtPainter::drawLine( painter, pos.x(), pRect.top(), pos.x(), pRect.bottom() ); QwtPainter::drawLine( painter, pRect.left(), pos.y(), pRect.right(), pos.y() ); break; } default: break; } break; } case QwtPickerMachine::RectSelection: { if ( pa.count() < 2 ) return; const QRect rect = QRect( pa.first(), pa.last() ).normalized(); switch ( rubberBand() ) { case EllipseRubberBand: { QwtPainter::drawEllipse( painter, rect ); break; } case RectRubberBand: { QwtPainter::drawRect( painter, rect ); break; } default: break; } break; } case QwtPickerMachine::PolygonSelection: { if ( rubberBand() == PolygonRubberBand ) painter->drawPolyline( pa ); break; } default: break; } } /*! Draw the tracker \param painter Painter \sa trackerRect(), trackerText() */ void QwtPicker::drawTracker( QPainter *painter ) const { const QRect textRect = trackerRect( painter->font() ); if ( !textRect.isEmpty() ) { const QwtText label = trackerText( d_data->trackerPosition ); if ( !label.isEmpty() ) label.draw( painter, textRect ); } } /*! \brief Map the pickedPoints() into a selection() adjustedPoints() maps the points, that have been collected on the parentWidget() into a selection(). The default implementation simply returns the points unmodified. The reason, why a selection() differs from the picked points depends on the application requirements. F.e. : - A rectangular selection might need to have a specific aspect ratio only.\n - A selection could accept non intersecting polygons only.\n - ...\n The example below is for a rectangular selection, where the first point is the center of the selected rectangle. \par Example \verbatim QPolygon MyPicker::adjustedPoints(const QPolygon &points) const { QPolygon adjusted; if ( points.size() == 2 ) { const int width = qAbs(points[1].x() - points[0].x()); const int height = qAbs(points[1].y() - points[0].y()); QRect rect(0, 0, 2 * width, 2 * height); rect.moveCenter(points[0]); adjusted += rect.topLeft(); adjusted += rect.bottomRight(); } return adjusted; }\endverbatim\n \param points Selected points \return Selected points unmodified */ QPolygon QwtPicker::adjustedPoints( const QPolygon &points ) const { return points; } /*! \return Selected points \sa pickedPoints(), adjustedPoints() */ QPolygon QwtPicker::selection() const { return adjustedPoints( d_data->pickedPoints ); } //! \return Current position of the tracker QPoint QwtPicker::trackerPosition() const { return d_data->trackerPosition; } /*! Calculate the bounding rectangle for the tracker text from the current position of the tracker \param font Font of the tracker text \return Bounding rectangle of the tracker text \sa trackerPosition() */ QRect QwtPicker::trackerRect( const QFont &font ) const { if ( trackerMode() == AlwaysOff || ( trackerMode() == ActiveOnly && !isActive() ) ) { return QRect(); } if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 ) return QRect(); QwtText text = trackerText( d_data->trackerPosition ); if ( text.isEmpty() ) return QRect(); const QSizeF textSize = text.textSize( font ); QRect textRect( 0, 0, qCeil( textSize.width() ), qCeil( textSize.height() ) ); const QPoint &pos = d_data->trackerPosition; int alignment = 0; if ( isActive() && d_data->pickedPoints.count() > 1 && rubberBand() != NoRubberBand ) { const QPoint last = d_data->pickedPoints[int( d_data->pickedPoints.count() ) - 2]; alignment |= ( pos.x() >= last.x() ) ? Qt::AlignRight : Qt::AlignLeft; alignment |= ( pos.y() > last.y() ) ? Qt::AlignBottom : Qt::AlignTop; } else alignment = Qt::AlignTop | Qt::AlignRight; const int margin = 5; int x = pos.x(); if ( alignment & Qt::AlignLeft ) x -= textRect.width() + margin; else if ( alignment & Qt::AlignRight ) x += margin; int y = pos.y(); if ( alignment & Qt::AlignBottom ) y += margin; else if ( alignment & Qt::AlignTop ) y -= textRect.height() + margin; textRect.moveTopLeft( QPoint( x, y ) ); const QRect pickRect = pickArea().boundingRect().toRect(); int right = qMin( textRect.right(), pickRect.right() - margin ); int bottom = qMin( textRect.bottom(), pickRect.bottom() - margin ); textRect.moveBottomRight( QPoint( right, bottom ) ); int left = qMax( textRect.left(), pickRect.left() + margin ); int top = qMax( textRect.top(), pickRect.top() + margin ); textRect.moveTopLeft( QPoint( left, top ) ); return textRect; } /*! \brief Event filter When isEnabled() is true all events of the observed widget are filtered. Mouse and keyboard events are translated into widgetMouse- and widgetKey- and widgetWheel-events. Paint and Resize events are handled to keep rubber band and tracker up to date. \param object Object to be filtered \param event Event \return Always false. \sa widgetEnterEvent(), widgetLeaveEvent(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent(), QObject::installEventFilter(), QObject::event() */ bool QwtPicker::eventFilter( QObject *object, QEvent *event ) { if ( object && object == parentWidget() ) { switch ( event->type() ) { case QEvent::Resize: { const QResizeEvent *re = static_cast( event ); if ( d_data->resizeMode == Stretch ) stretchSelection( re->oldSize(), re->size() ); break; } case QEvent::Enter: { widgetEnterEvent( event ); break; } case QEvent::Leave: { widgetLeaveEvent( event ); break; } case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::MouseButtonDblClick: { widgetMouseDoubleClickEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } case QEvent::Wheel: { widgetWheelEvent( static_cast( event ) ); break; } default: break; } } return false; } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMousePressEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( pickArea().contains( mouseEvent->pos() ) ) d_data->trackerPosition = mouseEvent->pos(); else d_data->trackerPosition = QPoint( -1, -1 ); if ( !isActive() ) updateDisplay(); transition( mouseEvent ); } /*! Handle a enter event for the observed widget. \param event Qt event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetEnterEvent( QEvent *event ) { transition( event ); } /*! Handle a leave event for the observed widget. \param event Qt event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetLeaveEvent( QEvent *event ) { transition( event ); d_data->trackerPosition = QPoint( -1, -1 ); if ( !isActive() ) updateDisplay(); } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle mouse double click event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseDoubleClickEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle a wheel event for the observed widget. Move the last point of the selection in case of isActive() == true \param wheelEvent Wheel event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetWheelEvent( QWheelEvent *wheelEvent ) { if ( pickArea().contains( wheelEvent->pos() ) ) d_data->trackerPosition = wheelEvent->pos(); else d_data->trackerPosition = QPoint( -1, -1 ); updateDisplay(); transition( wheelEvent ); } /*! Handle a key press event for the observed widget. Selections can be completely done by the keyboard. The arrow keys move the cursor, the abort key aborts a selection. All other keys are handled by the current state machine. \param keyEvent Key event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyReleaseEvent(), stateMachine(), QwtEventPattern::KeyPatternCode */ void QwtPicker::widgetKeyPressEvent( QKeyEvent *keyEvent ) { int dx = 0; int dy = 0; int offset = 1; if ( keyEvent->isAutoRepeat() ) offset = 5; if ( keyMatch( KeyLeft, keyEvent ) ) dx = -offset; else if ( keyMatch( KeyRight, keyEvent ) ) dx = offset; else if ( keyMatch( KeyUp, keyEvent ) ) dy = -offset; else if ( keyMatch( KeyDown, keyEvent ) ) dy = offset; else if ( keyMatch( KeyAbort, keyEvent ) ) { reset(); } else transition( keyEvent ); if ( dx != 0 || dy != 0 ) { const QRect rect = pickArea().boundingRect().toRect(); const QPoint pos = parentWidget()->mapFromGlobal( QCursor::pos() ); int x = pos.x() + dx; x = qMax( rect.left(), x ); x = qMin( rect.right(), x ); int y = pos.y() + dy; y = qMax( rect.top(), y ); y = qMin( rect.bottom(), y ); QCursor::setPos( parentWidget()->mapToGlobal( QPoint( x, y ) ) ); } } /*! Handle a key release event for the observed widget. Passes the event to the state machine. \param keyEvent Key event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), stateMachine() */ void QwtPicker::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { transition( keyEvent ); } /*! Passes an event to the state machine and executes the resulting commands. Append and Move commands use the current position of the cursor ( QCursor::pos() ). \param event Event */ void QwtPicker::transition( const QEvent *event ) { if ( !d_data->stateMachine ) return; const QList commandList = d_data->stateMachine->transition( *this, event ); QPoint pos; switch ( event->type() ) { case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: { const QMouseEvent *me = static_cast< const QMouseEvent * >( event ); pos = me->pos(); break; } default: pos = parentWidget()->mapFromGlobal( QCursor::pos() ); } for ( int i = 0; i < commandList.count(); i++ ) { switch ( commandList[i] ) { case QwtPickerMachine::Begin: { begin(); break; } case QwtPickerMachine::Append: { append( pos ); break; } case QwtPickerMachine::Move: { move( pos ); break; } case QwtPickerMachine::Remove: { remove(); break; } case QwtPickerMachine::End: { end(); break; } } } } /*! Open a selection setting the state to active \sa isActive(), end(), append(), move() */ void QwtPicker::begin() { if ( d_data->isActive ) return; d_data->pickedPoints.resize( 0 ); d_data->isActive = true; Q_EMIT activated( true ); if ( trackerMode() != AlwaysOff ) { if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 ) { QWidget *w = parentWidget(); if ( w ) d_data->trackerPosition = w->mapFromGlobal( QCursor::pos() ); } } updateDisplay(); setMouseTracking( true ); } /*! \brief Close a selection setting the state to inactive. The selection is validated and maybe fixed by accept(). \param ok If true, complete the selection and emit a selected signal otherwise discard the selection. \return true if the selection is accepted, false otherwise \sa isActive(), begin(), append(), move(), selected(), accept() */ bool QwtPicker::end( bool ok ) { if ( d_data->isActive ) { setMouseTracking( false ); d_data->isActive = false; Q_EMIT activated( false ); if ( trackerMode() == ActiveOnly ) d_data->trackerPosition = QPoint( -1, -1 ); if ( ok ) ok = accept( d_data->pickedPoints ); if ( ok ) Q_EMIT selected( d_data->pickedPoints ); else d_data->pickedPoints.resize( 0 ); updateDisplay(); } else ok = false; return ok; } /*! Reset the state machine and terminate ( end(false) ) the selection */ void QwtPicker::reset() { if ( d_data->stateMachine ) d_data->stateMachine->reset(); if ( isActive() ) end( false ); } /*! Append a point to the selection and update rubber band and tracker. The appended() signal is emitted. \param pos Additional point \sa isActive(), begin(), end(), move(), appended() */ void QwtPicker::append( const QPoint &pos ) { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count(); d_data->pickedPoints.resize( idx + 1 ); d_data->pickedPoints[idx] = pos; updateDisplay(); Q_EMIT appended( pos ); } } /*! Move the last point of the selection The moved() signal is emitted. \param pos New position \sa isActive(), begin(), end(), append() */ void QwtPicker::move( const QPoint &pos ) { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count() - 1; if ( idx >= 0 ) { if ( d_data->pickedPoints[idx] != pos ) { d_data->pickedPoints[idx] = pos; updateDisplay(); Q_EMIT moved( pos ); } } } } /*! Remove the last point of the selection The removed() signal is emitted. \sa isActive(), begin(), end(), append(), move() */ void QwtPicker::remove() { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count() - 1; if ( idx > 0 ) { const int idx = d_data->pickedPoints.count(); const QPoint pos = d_data->pickedPoints[idx - 1]; d_data->pickedPoints.resize( idx - 1 ); updateDisplay(); Q_EMIT removed( pos ); } } } /*! \brief Validate and fix up the selection Accepts all selections unmodified \param selection Selection to validate and fix up \return true, when accepted, false otherwise */ bool QwtPicker::accept( QPolygon &selection ) const { Q_UNUSED( selection ); return true; } /*! A picker is active between begin() and end(). \return true if the selection is active. */ bool QwtPicker::isActive() const { return d_data->isActive; } /*! Return the points, that have been collected so far. The selection() is calculated from the pickedPoints() in adjustedPoints(). \return Picked points */ const QPolygon &QwtPicker::pickedPoints() const { return d_data->pickedPoints; } /*! Scale the selection by the ratios of oldSize and newSize The changed() signal is emitted. \param oldSize Previous size \param newSize Current size \sa ResizeMode, setResizeMode(), resizeMode() */ void QwtPicker::stretchSelection( const QSize &oldSize, const QSize &newSize ) { if ( oldSize.isEmpty() ) { // avoid division by zero. But scaling for small sizes also // doesn't make much sense, because of rounding losses. TODO ... return; } const double xRatio = double( newSize.width() ) / double( oldSize.width() ); const double yRatio = double( newSize.height() ) / double( oldSize.height() ); for ( int i = 0; i < int( d_data->pickedPoints.count() ); i++ ) { QPoint &p = d_data->pickedPoints[i]; p.setX( qRound( p.x() * xRatio ) ); p.setY( qRound( p.y() * yRatio ) ); Q_EMIT changed( d_data->pickedPoints ); } } /*! Set mouse tracking for the observed widget. In case of enable is true, the previous value is saved, that is restored when enable is false. \warning Even when enable is false, mouse tracking might be restored to true. When mouseTracking for the observed widget has been changed directly by QWidget::setMouseTracking while mouse tracking has been set to true, this value can't be restored. */ void QwtPicker::setMouseTracking( bool enable ) { QWidget *widget = parentWidget(); if ( !widget ) return; if ( enable ) { d_data->mouseTracking = widget->hasMouseTracking(); widget->setMouseTracking( true ); } else { widget->setMouseTracking( d_data->mouseTracking ); } } /*! Find the area of the observed widget, where selection might happen. \return parentWidget()->contentsRect() */ QPainterPath QwtPicker::pickArea() const { QPainterPath path; const QWidget *widget = parentWidget(); if ( widget ) path.addRect( widget->contentsRect() ); return path; } //! Update the state of rubber band and tracker label void QwtPicker::updateDisplay() { QWidget *w = parentWidget(); bool showRubberband = false; bool showTracker = false; if ( w && w->isVisible() && d_data->enabled ) { if ( rubberBand() != NoRubberBand && isActive() && rubberBandPen().style() != Qt::NoPen ) { showRubberband = true; } if ( trackerMode() == AlwaysOn || ( trackerMode() == ActiveOnly && isActive() ) ) { if ( trackerPen() != Qt::NoPen && !trackerRect( QFont() ).isEmpty() ) { showTracker = true; } } } QPointer< QwtPickerRubberband > &rw = d_data->rubberBandOverlay; if ( showRubberband ) { if ( rw.isNull() ) { rw = new QwtPickerRubberband( this, w ); rw->setObjectName( "PickerRubberBand" ); rw->resize( w->size() ); } if ( d_data->rubberBand <= RectRubberBand ) rw->setMaskMode( QwtWidgetOverlay::MaskHint ); else rw->setMaskMode( QwtWidgetOverlay::AlphaMask ); rw->updateOverlay(); } else { if ( d_data->openGL ) { // Qt 4.8 crashes for a delete if ( !rw.isNull() ) { rw->hide(); rw->deleteLater(); rw = NULL; } } else { delete rw; } } QPointer< QwtPickerTracker > &tw = d_data->trackerOverlay; if ( showTracker ) { if ( tw.isNull() ) { tw = new QwtPickerTracker( this, w ); tw->setObjectName( "PickerTracker" ); tw->resize( w->size() ); } tw->setFont( d_data->trackerFont ); tw->updateOverlay(); } else { if ( d_data->openGL ) { // Qt 4.8 crashes for a delete if ( !tw.isNull() ) { tw->hide(); tw->deleteLater(); tw = NULL; } } else { delete tw; } } } //! \return Overlay displaying the rubber band const QwtWidgetOverlay *QwtPicker::rubberBandOverlay() const { return d_data->rubberBandOverlay; } //! \return Overlay displaying the tracker text const QwtWidgetOverlay *QwtPicker::trackerOverlay() const { return d_data->trackerOverlay; } qsstv_9.2.6/qwt/qwt_picker.h0000664000175000017500000002247613203343610014574 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PICKER #define QWT_PICKER 1 #include "qwt_global.h" #include "qwt_text.h" #include "qwt_event_pattern.h" #include #include #include #include #include class QWidget; class QMouseEvent; class QWheelEvent; class QKeyEvent; class QwtPickerMachine; class QwtWidgetOverlay; /*! \brief QwtPicker provides selections on a widget QwtPicker filters all enter, leave, mouse and keyboard events of a widget and translates them into an array of selected points. The way how the points are collected depends on type of state machine that is connected to the picker. Qwt offers a couple of predefined state machines for selecting: - Nothing\n QwtPickerTrackerMachine - Single points\n QwtPickerClickPointMachine, QwtPickerDragPointMachine - Rectangles\n QwtPickerClickRectMachine, QwtPickerDragRectMachine - Polygons\n QwtPickerPolygonMachine While these state machines cover the most common ways to collect points it is also possible to implement individual machines as well. QwtPicker translates the picked points into a selection using the adjustedPoints() method. adjustedPoints() is intended to be reimplemented to fix up the selection according to application specific requirements. (F.e. when an application accepts rectangles of a fixed aspect ratio only.) Optionally QwtPicker support the process of collecting points by a rubber band and tracker displaying a text for the current mouse position. \par Example \verbatim #include #include QwtPicker *picker = new QwtPicker(widget); picker->setStateMachine(new QwtPickerDragRectMachine); picker->setTrackerMode(QwtPicker::ActiveOnly); picker->setRubberBand(QwtPicker::RectRubberBand); \endverbatim\n The state machine triggers the following commands: - begin()\n Activate/Initialize the selection. - append()\n Add a new point - move() \n Change the position of the last point. - remove()\n Remove the last point. - end()\n Terminate the selection and call accept to validate the picked points. The picker is active (isActive()), between begin() and end(). In active state the rubber band is displayed, and the tracker is visible in case of trackerMode is ActiveOnly or AlwaysOn. The cursor can be moved using the arrow keys. All selections can be aborted using the abort key. (QwtEventPattern::KeyPatternCode) \warning In case of QWidget::NoFocus the focus policy of the observed widget is set to QWidget::WheelFocus and mouse tracking will be manipulated while the picker is active, or if trackerMode() is AlwayOn. */ class QWT_EXPORT QwtPicker: public QObject, public QwtEventPattern { Q_OBJECT Q_ENUMS( RubberBand DisplayMode ResizeMode ) Q_PROPERTY( bool isEnabled READ isEnabled WRITE setEnabled ) Q_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode ) Q_PROPERTY( DisplayMode trackerMode READ trackerMode WRITE setTrackerMode ) Q_PROPERTY( QPen trackerPen READ trackerPen WRITE setTrackerPen ) Q_PROPERTY( QFont trackerFont READ trackerFont WRITE setTrackerFont ) Q_PROPERTY( RubberBand rubberBand READ rubberBand WRITE setRubberBand ) Q_PROPERTY( QPen rubberBandPen READ rubberBandPen WRITE setRubberBandPen ) public: /*! Rubber band style The default value is QwtPicker::NoRubberBand. \sa setRubberBand(), rubberBand() */ enum RubberBand { //! No rubberband. NoRubberBand = 0, //! A horizontal line ( only for QwtPickerMachine::PointSelection ) HLineRubberBand, //! A vertical line ( only for QwtPickerMachine::PointSelection ) VLineRubberBand, //! A crosshair ( only for QwtPickerMachine::PointSelection ) CrossRubberBand, //! A rectangle ( only for QwtPickerMachine::RectSelection ) RectRubberBand, //! An ellipse ( only for QwtPickerMachine::RectSelection ) EllipseRubberBand, //! A polygon ( only for QwtPickerMachine::PolygonSelection ) PolygonRubberBand, /*! Values >= UserRubberBand can be used to define additional rubber bands. */ UserRubberBand = 100 }; /*! \brief Display mode \sa setTrackerMode(), trackerMode(), isActive() */ enum DisplayMode { //! Display never AlwaysOff, //! Display always AlwaysOn, //! Display only when the selection is active ActiveOnly }; /*! Controls what to do with the selected points of an active selection when the observed widget is resized. The default value is QwtPicker::Stretch. \sa setResizeMode() */ enum ResizeMode { //! All points are scaled according to the new size, Stretch, //! All points remain unchanged. KeepSize }; explicit QwtPicker( QWidget *parent ); explicit QwtPicker( RubberBand rubberBand, DisplayMode trackerMode, QWidget * ); virtual ~QwtPicker(); void setStateMachine( QwtPickerMachine * ); const QwtPickerMachine *stateMachine() const; QwtPickerMachine *stateMachine(); void setRubberBand( RubberBand ); RubberBand rubberBand() const; void setTrackerMode( DisplayMode ); DisplayMode trackerMode() const; void setResizeMode( ResizeMode ); ResizeMode resizeMode() const; void setRubberBandPen( const QPen & ); QPen rubberBandPen() const; void setTrackerPen( const QPen & ); QPen trackerPen() const; void setTrackerFont( const QFont & ); QFont trackerFont() const; bool isEnabled() const; bool isActive() const; virtual bool eventFilter( QObject *, QEvent * ); QWidget *parentWidget(); const QWidget *parentWidget() const; virtual QPainterPath pickArea() const; virtual void drawRubberBand( QPainter * ) const; virtual void drawTracker( QPainter * ) const; virtual QRegion rubberBandMask() const; virtual QwtText trackerText( const QPoint &pos ) const; QPoint trackerPosition() const; virtual QRect trackerRect( const QFont & ) const; QPolygon selection() const; public Q_SLOTS: void setEnabled( bool ); Q_SIGNALS: /*! A signal indicating, when the picker has been activated. Together with setEnabled() it can be used to implement selections with more than one picker. \param on True, when the picker has been activated */ void activated( bool on ); /*! A signal emitting the selected points, at the end of a selection. \param polygon Selected points */ void selected( const QPolygon &polygon ); /*! A signal emitted when a point has been appended to the selection \param pos Position of the appended point. \sa append(). moved() */ void appended( const QPoint &pos ); /*! A signal emitted whenever the last appended point of the selection has been moved. \param pos Position of the moved last point of the selection. \sa move(), appended() */ void moved( const QPoint &pos ); /*! A signal emitted whenever the last appended point of the selection has been removed. \param pos Position of the point, that has been removed \sa remove(), appended() */ void removed( const QPoint &pos ); /*! A signal emitted when the active selection has been changed. This might happen when the observed widget is resized. \param selection Changed selection \sa stretchSelection() */ void changed( const QPolygon &selection ); protected: virtual QPolygon adjustedPoints( const QPolygon & ) const; virtual void transition( const QEvent * ); virtual void begin(); virtual void append( const QPoint & ); virtual void move( const QPoint & ); virtual void remove(); virtual bool end( bool ok = true ); virtual bool accept( QPolygon & ) const; virtual void reset(); virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseDoubleClickEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetWheelEvent( QWheelEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); virtual void widgetEnterEvent( QEvent * ); virtual void widgetLeaveEvent( QEvent * ); virtual void stretchSelection( const QSize &oldSize, const QSize &newSize ); virtual void updateDisplay(); const QwtWidgetOverlay *rubberBandOverlay() const; const QwtWidgetOverlay *trackerOverlay() const; const QPolygon &pickedPoints() const; private: void init( QWidget *, RubberBand rubberBand, DisplayMode trackerMode ); void setMouseTracking( bool ); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_picker_machine.cpp0000664000175000017500000003200113203343610016574 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_picker_machine.h" #include "qwt_event_pattern.h" #include //! Constructor QwtPickerMachine::QwtPickerMachine( SelectionType type ): d_selectionType( type ), d_state( 0 ) { } //! Destructor QwtPickerMachine::~QwtPickerMachine() { } //! Return the selection type QwtPickerMachine::SelectionType QwtPickerMachine::selectionType() const { return d_selectionType; } //! Return the current state int QwtPickerMachine::state() const { return d_state; } //! Change the current state void QwtPickerMachine::setState( int state ) { d_state = state; } //! Set the current state to 0. void QwtPickerMachine::reset() { setState( 0 ); } //! Constructor QwtPickerTrackerMachine::QwtPickerTrackerMachine(): QwtPickerMachine( NoSelection ) { } //! Transition QList QwtPickerTrackerMachine::transition( const QwtEventPattern &, const QEvent *e ) { QList cmdList; switch ( e->type() ) { case QEvent::Enter: case QEvent::MouseMove: { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { cmdList += Move; } break; } case QEvent::Leave: { cmdList += Remove; cmdList += End; setState( 0 ); } default: break; } return cmdList; } //! Constructor QwtPickerClickPointMachine::QwtPickerClickPointMachine(): QwtPickerMachine( PointSelection ) { } //! Transition QList QwtPickerClickPointMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { cmdList += Begin; cmdList += Append; cmdList += End; } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { cmdList += Begin; cmdList += Append; cmdList += End; } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragPointMachine::QwtPickerDragPointMachine(): QwtPickerMachine( PointSelection ) { } //! Transition QList QwtPickerDragPointMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() != 0 ) { cmdList += End; setState( 0 ); } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerClickRectMachine::QwtPickerClickRectMachine(): QwtPickerMachine( RectSelection ) { } //! Transition QList QwtPickerClickRectMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { switch ( state() ) { case 0: { cmdList += Begin; cmdList += Append; setState( 1 ); break; } case 1: { // Uh, strange we missed the MouseButtonRelease break; } default: { cmdList += End; setState( 0 ); } } } } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 1 ) { cmdList += Append; setState( 2 ); } } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { if ( state() == 1 ) { cmdList += Append; setState( 2 ); } else if ( state() == 2 ) { cmdList += End; setState( 0 ); } } } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragRectMachine::QwtPickerDragRectMachine(): QwtPickerMachine( RectSelection ) { } //! Transition QList QwtPickerDragRectMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 2 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() == 2 ) { cmdList += End; setState( 0 ); } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 2 ); } else { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerPolygonMachine::QwtPickerPolygonMachine(): QwtPickerMachine( PolygonSelection ) { } //! Transition QList QwtPickerPolygonMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += Append; } } if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect2, static_cast( event ) ) ) { if ( state() == 1 ) { cmdList += End; setState( 0 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += Append; } } else if ( eventPattern.keyMatch( QwtEventPattern::KeySelect2, static_cast ( event ) ) ) { if ( state() == 1 ) { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragLineMachine::QwtPickerDragLineMachine(): QwtPickerMachine( PolygonSelection ) { } //! Transition QList QwtPickerDragLineMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += End; setState( 0 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() != 0 ) { cmdList += End; setState( 0 ); } } default: break; } return cmdList; } qsstv_9.2.6/qwt/qwt_picker_machine.h0000664000175000017500000001313613203343610016251 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PICKER_MACHINE #define QWT_PICKER_MACHINE 1 #include "qwt_global.h" #include class QEvent; class QwtEventPattern; /*! \brief A state machine for QwtPicker selections QwtPickerMachine accepts key and mouse events and translates them into selection commands. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerMachine { public: /*! Type of a selection. \sa selectionType() */ enum SelectionType { //! The state machine not usable for any type of selection. NoSelection = -1, //! The state machine is for selecting a single point. PointSelection, //! The state machine is for selecting a rectangle (2 points). RectSelection, //! The state machine is for selecting a polygon (many points). PolygonSelection }; //! Commands - the output of a state machine enum Command { Begin, Append, Move, Remove, End }; QwtPickerMachine( SelectionType ); virtual ~QwtPickerMachine(); //! Transition virtual QList transition( const QwtEventPattern &, const QEvent * ) = 0; void reset(); int state() const; void setState( int ); SelectionType selectionType() const; private: const SelectionType d_selectionType; int d_state; }; /*! \brief A state machine for indicating mouse movements QwtPickerTrackerMachine supports displaying information corresponding to mouse movements, but is not intended for selecting anything. Begin/End are related to Enter/Leave events. */ class QWT_EXPORT QwtPickerTrackerMachine: public QwtPickerMachine { public: QwtPickerTrackerMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for point selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 selects a point. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerClickPointMachine: public QwtPickerMachine { public: QwtPickerClickPointMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for point selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 starts the selection, releasing QwtEventPattern::MouseSelect1 or a second press of QwtEventPattern::KeySelect1 terminates it. */ class QWT_EXPORT QwtPickerDragPointMachine: public QwtPickerMachine { public: QwtPickerDragPointMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for rectangle selections Pressing QwtEventPattern::MouseSelect1 starts the selection, releasing it selects the first point. Pressing it again selects the second point and terminates the selection. Pressing QwtEventPattern::KeySelect1 also starts the selection, a second press selects the first point. A third one selects the second point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerClickRectMachine: public QwtPickerMachine { public: QwtPickerClickRectMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for rectangle selections Pressing QwtEventPattern::MouseSelect1 selects the first point, releasing it the second point. Pressing QwtEventPattern::KeySelect1 also selects the first point, a second press selects the second point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerDragRectMachine: public QwtPickerMachine { public: QwtPickerDragRectMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for line selections Pressing QwtEventPattern::MouseSelect1 selects the first point, releasing it the second point. Pressing QwtEventPattern::KeySelect1 also selects the first point, a second press selects the second point and terminates the selection. A common use case of QwtPickerDragLineMachine are pickers for distance measurements. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerDragLineMachine: public QwtPickerMachine { public: QwtPickerDragLineMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for polygon selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 starts the selection and selects the first point, or appends a point. Pressing QwtEventPattern::MouseSelect2 or QwtEventPattern::KeySelect2 appends the last point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerPolygonMachine: public QwtPickerMachine { public: QwtPickerPolygonMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; #endif qsstv_9.2.6/qwt/qwt_pixel_matrix.cpp0000664000175000017500000000213313203343610016343 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_pixel_matrix.h" /*! \brief Constructor \param rect Bounding rectangle for the matrix */ QwtPixelMatrix::QwtPixelMatrix( const QRect& rect ): QBitArray( qMax( rect.width() * rect.height(), 0 ) ), d_rect( rect ) { } //! Destructor QwtPixelMatrix::~QwtPixelMatrix() { } /*! Set the bounding rectangle of the matrix \param rect Bounding rectangle \note All bits are cleared */ void QwtPixelMatrix::setRect( const QRect& rect ) { if ( rect != d_rect ) { d_rect = rect; const int sz = qMax( rect.width() * rect.height(), 0 ); resize( sz ); } fill( false ); } //! \return Bounding rectangle QRect QwtPixelMatrix::rect() const { return d_rect; } qsstv_9.2.6/qwt/qwt_pixel_matrix.h0000664000175000017500000000443113203343610016013 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PIXEL_MATRIX_H #define QWT_PIXEL_MATRIX_H #include "qwt_global.h" #include #include /*! \brief A bit field corresponding to the pixels of a rectangle QwtPixelMatrix is intended to filter out duplicates in an unsorted array of points. */ class QWT_EXPORT QwtPixelMatrix: public QBitArray { public: QwtPixelMatrix( const QRect& rect ); ~QwtPixelMatrix(); void setRect( const QRect& rect ); QRect rect() const; bool testPixel( int x, int y ) const; bool testAndSetPixel( int x, int y, bool on ); int index( int x, int y ) const; private: QRect d_rect; }; /*! \brief Test if a pixel has been set \param x X-coordinate \param y Y-coordinate \return true, when pos is outside of rect(), or when the pixel has already been set. */ inline bool QwtPixelMatrix::testPixel( int x, int y ) const { const int idx = index( x, y ); return ( idx >= 0 ) ? testBit( idx ) : true; } /*! \brief Set a pixel and test if a pixel has been set before \param x X-coordinate \param y Y-coordinate \param on Set/Clear the pixel \return true, when pos is outside of rect(), or when the pixel was set before. */ inline bool QwtPixelMatrix::testAndSetPixel( int x, int y, bool on ) { const int idx = index( x, y ); if ( idx < 0 ) return true; const bool onBefore = testBit( idx ); setBit( idx, on ); return onBefore; } /*! \brief Calculate the index in the bit field corresponding to a position \param x X-coordinate \param y Y-coordinate \return Index, when rect() contains pos - otherwise -1. */ inline int QwtPixelMatrix::index( int x, int y ) const { const int dx = x - d_rect.x(); if ( dx < 0 || dx >= d_rect.width() ) return -1; const int dy = y - d_rect.y(); if ( dy < 0 || dy >= d_rect.height() ) return -1; return dy * d_rect.width() + dx; } #endif qsstv_9.2.6/qwt/qwt_plot.cpp0000664000175000017500000007375613203343610014637 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_plot_dict.h" #include "qwt_plot_layout.h" #include "qwt_scale_widget.h" #include "qwt_scale_engine.h" #include "qwt_text_label.h" #include "qwt_legend.h" #include "qwt_legend_data.h" #include "qwt_plot_canvas.h" #include #include #include #include #include #include static inline void qwtEnableLegendItems( QwtPlot *plot, bool on ) { if ( on ) { QObject::connect( plot, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), plot, SLOT( updateLegendItems( const QVariant &, const QList & ) ) ); } else { QObject::disconnect( plot, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), plot, SLOT( updateLegendItems( const QVariant &, const QList & ) ) ); } } static void qwtSetTabOrder( QWidget *first, QWidget *second, bool withChildren ) { QList tabChain; tabChain += first; tabChain += second; if ( withChildren ) { QList children = second->findChildren(); QWidget *w = second->nextInFocusChain(); while ( children.contains( w ) ) { children.removeAll( w ); tabChain += w; w = w->nextInFocusChain(); } } for ( int i = 0; i < tabChain.size() - 1; i++ ) { QWidget *from = tabChain[i]; QWidget *to = tabChain[i+1]; const Qt::FocusPolicy policy1 = from->focusPolicy(); const Qt::FocusPolicy policy2 = to->focusPolicy(); QWidget *proxy1 = from->focusProxy(); QWidget *proxy2 = to->focusProxy(); from->setFocusPolicy( Qt::TabFocus ); from->setFocusProxy( NULL); to->setFocusPolicy( Qt::TabFocus ); to->setFocusProxy( NULL); QWidget::setTabOrder( from, to ); from->setFocusPolicy( policy1 ); from->setFocusProxy( proxy1); to->setFocusPolicy( policy2 ); to->setFocusProxy( proxy2 ); } } class QwtPlot::PrivateData { public: QPointer titleLabel; QPointer footerLabel; QPointer canvas; QPointer legend; QwtPlotLayout *layout; bool autoReplot; }; /*! \brief Constructor \param parent Parent widget */ QwtPlot::QwtPlot( QWidget *parent ): QFrame( parent ) { initPlot( QwtText() ); } /*! \brief Constructor \param title Title text \param parent Parent widget */ QwtPlot::QwtPlot( const QwtText &title, QWidget *parent ): QFrame( parent ) { initPlot( title ); } //! Destructor QwtPlot::~QwtPlot() { detachItems( QwtPlotItem::Rtti_PlotItem, autoDelete() ); delete d_data->layout; deleteAxesData(); delete d_data; } /*! \brief Initializes a QwtPlot instance \param title Title text */ void QwtPlot::initPlot( const QwtText &title ) { d_data = new PrivateData; d_data->layout = new QwtPlotLayout; d_data->autoReplot = false; // title d_data->titleLabel = new QwtTextLabel( this ); d_data->titleLabel->setObjectName( "QwtPlotTitle" ); d_data->titleLabel->setFont( QFont( fontInfo().family(), 14, QFont::Bold ) ); QwtText text( title ); text.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->titleLabel->setText( text ); // footer d_data->footerLabel = new QwtTextLabel( this ); d_data->footerLabel->setObjectName( "QwtPlotFooter" ); QwtText footer; footer.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->footerLabel->setText( footer ); // legend d_data->legend = NULL; // axis initAxesData(); // canvas d_data->canvas = new QwtPlotCanvas( this ); d_data->canvas->setObjectName( "QwtPlotCanvas" ); d_data->canvas->installEventFilter( this ); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); resize( 200, 200 ); QList focusChain; focusChain << this << d_data->titleLabel << axisWidget( xTop ) << axisWidget( yLeft ) << d_data->canvas << axisWidget( yRight ) << axisWidget( xBottom ) << d_data->footerLabel; for ( int i = 0; i < focusChain.size() - 1; i++ ) qwtSetTabOrder( focusChain[i], focusChain[i+1], false ); qwtEnableLegendItems( this, true ); } /*! \brief Set the drawing canvas of the plot widget QwtPlot invokes methods of the canvas as meta methods ( see QMetaObject ). In opposite to using conventional C++ techniques like virtual methods they allow to use canvas implementations that are derived from QWidget or QGLWidget. The following meta methods could be implemented: - replot() When the canvas doesn't offer a replot method, QwtPlot calls update() instead. - borderPath() The border path is necessary to clip the content of the canvas When the canvas doesn't have any special border ( f.e rounded corners ) it is o.k. not to implement this method. The default canvas is a QwtPlotCanvas \param canvas Canvas Widget \sa canvas() */ void QwtPlot::setCanvas( QWidget *canvas ) { if ( canvas == d_data->canvas ) return; delete d_data->canvas; d_data->canvas = canvas; if ( canvas ) { canvas->setParent( this ); canvas->installEventFilter( this ); if ( isVisible() ) canvas->show(); } } /*! \brief Adds handling of layout requests \param event Event \return See QFrame::event() */ bool QwtPlot::event( QEvent *event ) { bool ok = QFrame::event( event ); switch ( event->type() ) { case QEvent::LayoutRequest: updateLayout(); break; case QEvent::PolishRequest: replot(); break; default:; } return ok; } /*! \brief Event filter The plot handles the following events for the canvas: - QEvent::Resize The canvas margins might depend on its size - QEvent::ContentsRectChange The layout needs to be recalculated \param object Object to be filtered \param event Event \return See QFrame::eventFilter() \sa updateCanvasMargins(), updateLayout() */ bool QwtPlot::eventFilter( QObject *object, QEvent *event ) { if ( object == d_data->canvas ) { if ( event->type() == QEvent::Resize ) { updateCanvasMargins(); } else if ( event->type() == QEvent::ContentsRectChange ) { updateLayout(); } } return QFrame::eventFilter( object, event ); } //! Replots the plot if autoReplot() is \c true. void QwtPlot::autoRefresh() { if ( d_data->autoReplot ) replot(); } /*! \brief Set or reset the autoReplot option If the autoReplot option is set, the plot will be updated implicitly by manipulating member functions. Since this may be time-consuming, it is recommended to leave this option switched off and call replot() explicitly if necessary. The autoReplot option is set to false by default, which means that the user has to call replot() in order to make changes visible. \param tf \c true or \c false. Defaults to \c true. \sa replot() */ void QwtPlot::setAutoReplot( bool tf ) { d_data->autoReplot = tf; } /*! \return true if the autoReplot option is set. \sa setAutoReplot() */ bool QwtPlot::autoReplot() const { return d_data->autoReplot; } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QString &title ) { if ( title != d_data->titleLabel->text().text() ) { d_data->titleLabel->setText( title ); updateLayout(); } } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QwtText &title ) { if ( title != d_data->titleLabel->text() ) { d_data->titleLabel->setText( title ); updateLayout(); } } //! \return Title of the plot QwtText QwtPlot::title() const { return d_data->titleLabel->text(); } //! \return Title label widget. QwtTextLabel *QwtPlot::titleLabel() { return d_data->titleLabel; } //! \return Title label widget. const QwtTextLabel *QwtPlot::titleLabel() const { return d_data->titleLabel; } /*! Change the text the footer \param text New text of the footer */ void QwtPlot::setFooter( const QString &text ) { if ( text != d_data->footerLabel->text().text() ) { d_data->footerLabel->setText( text ); updateLayout(); } } /*! Change the text the footer \param text New text of the footer */ void QwtPlot::setFooter( const QwtText &text ) { if ( text != d_data->footerLabel->text() ) { d_data->footerLabel->setText( text ); updateLayout(); } } //! \return Text of the footer QwtText QwtPlot::footer() const { return d_data->footerLabel->text(); } //! \return Footer label widget. QwtTextLabel *QwtPlot::footerLabel() { return d_data->footerLabel; } //! \return Footer label widget. const QwtTextLabel *QwtPlot::footerLabel() const { return d_data->footerLabel; } /*! \brief Assign a new plot layout \param layout Layout() \sa plotLayout() */ void QwtPlot::setPlotLayout( QwtPlotLayout *layout ) { if ( layout != d_data->layout ) { delete d_data->layout; layout = d_data->layout; updateLayout(); } } //! \return the plot's layout QwtPlotLayout *QwtPlot::plotLayout() { return d_data->layout; } //! \return the plot's layout const QwtPlotLayout *QwtPlot::plotLayout() const { return d_data->layout; } /*! \return the plot's legend \sa insertLegend() */ QwtAbstractLegend *QwtPlot::legend() { return d_data->legend; } /*! \return the plot's legend \sa insertLegend() */ const QwtAbstractLegend *QwtPlot::legend() const { return d_data->legend; } /*! \return the plot's canvas */ QWidget *QwtPlot::canvas() { return d_data->canvas; } /*! \return the plot's canvas */ const QWidget *QwtPlot::canvas() const { return d_data->canvas; } /*! \return Size hint for the plot widget \sa minimumSizeHint() */ QSize QwtPlot::sizeHint() const { int dw = 0; int dh = 0; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { const int niceDist = 40; const QwtScaleWidget *scaleWidget = axisWidget( axisId ); const QwtScaleDiv &scaleDiv = scaleWidget->scaleDraw()->scaleDiv(); const int majCnt = scaleDiv.ticks( QwtScaleDiv::MajorTick ).count(); if ( axisId == yLeft || axisId == yRight ) { int hDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().height(); if ( hDiff > dh ) dh = hDiff; } else { int wDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().width(); if ( wDiff > dw ) dw = wDiff; } } } return minimumSizeHint() + QSize( dw, dh ); } /*! \brief Return a minimum size hint */ QSize QwtPlot::minimumSizeHint() const { QSize hint = d_data->layout->minimumSizeHint( this ); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! Resize and update internal layout \param e Resize event */ void QwtPlot::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); updateLayout(); } /*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa updateAxes(), setAutoReplot() */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); if ( d_data->canvas ) { const bool ok = QMetaObject::invokeMethod( d_data->canvas, "replot", Qt::DirectConnection ); if ( !ok ) { // fallback, when canvas has no a replot method d_data->canvas->update( d_data->canvas->contentsRect() ); } } setAutoReplot( doAutoReplot ); } /*! \brief Adjust plot content to its current size. \sa resizeEvent() */ void QwtPlot::updateLayout() { d_data->layout->activate( this, contentsRect() ); QRect titleRect = d_data->layout->titleRect().toRect(); QRect footerRect = d_data->layout->footerRect().toRect(); QRect scaleRect[QwtPlot::axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) scaleRect[axisId] = d_data->layout->scaleRect( axisId ).toRect(); QRect legendRect = d_data->layout->legendRect().toRect(); QRect canvasRect = d_data->layout->canvasRect().toRect(); // resize and show the visible widgets if ( !d_data->titleLabel->text().isEmpty() ) { d_data->titleLabel->setGeometry( titleRect ); if ( !d_data->titleLabel->isVisibleTo( this ) ) d_data->titleLabel->show(); } else d_data->titleLabel->hide(); if ( !d_data->footerLabel->text().isEmpty() ) { d_data->footerLabel->setGeometry( footerRect ); if ( !d_data->footerLabel->isVisibleTo( this ) ) d_data->footerLabel->show(); } else d_data->footerLabel->hide(); for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { axisWidget( axisId )->setGeometry( scaleRect[axisId] ); #if 1 if ( axisId == xBottom || axisId == xTop ) { // do we need this code any longer ??? QRegion r( scaleRect[axisId] ); if ( axisEnabled( yLeft ) ) r = r.subtracted( QRegion( scaleRect[yLeft] ) ); if ( axisEnabled( yRight ) ) r = r.subtracted( QRegion( scaleRect[yRight] ) ); r.translate( -scaleRect[ axisId ].x(), -scaleRect[axisId].y() ); axisWidget( axisId )->setMask( r ); } #endif if ( !axisWidget( axisId )->isVisibleTo( this ) ) axisWidget( axisId )->show(); } else axisWidget( axisId )->hide(); } if ( d_data->legend ) { if ( d_data->legend->isEmpty() ) { d_data->legend->hide(); } else { d_data->legend->setGeometry( legendRect ); d_data->legend->show(); } } d_data->canvas->setGeometry( canvasRect ); } /*! \brief Calculate the canvas margins \param maps QwtPlot::axisCnt maps, mapping between plot and paint device coordinates \param canvasRect Bounding rectangle where to paint \param left Return parameter for the left margin \param top Return parameter for the top margin \param right Return parameter for the right margin \param bottom Return parameter for the bottom margin Plot items might indicate, that they need some extra space at the borders of the canvas by the QwtPlotItem::Margins flag. updateCanvasMargins(), QwtPlotItem::getCanvasMarginHint() */ void QwtPlot::getCanvasMarginsHint( const QwtScaleMap maps[], const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const { left = top = right = bottom = -1.0; const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( item->testItemAttribute( QwtPlotItem::Margins ) ) { double m[ QwtPlot::axisCnt ]; item->getCanvasMarginHint( maps[ item->xAxis() ], maps[ item->yAxis() ], canvasRect, m[yLeft], m[xTop], m[yRight], m[xBottom] ); left = qMax( left, m[yLeft] ); top = qMax( top, m[xTop] ); right = qMax( right, m[yRight] ); bottom = qMax( bottom, m[xBottom] ); } } } /*! \brief Update the canvas margins Plot items might indicate, that they need some extra space at the borders of the canvas by the QwtPlotItem::Margins flag. getCanvasMarginsHint(), QwtPlotItem::getCanvasMarginHint() */ void QwtPlot::updateCanvasMargins() { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); double margins[axisCnt]; getCanvasMarginsHint( maps, canvas()->contentsRect(), margins[yLeft], margins[xTop], margins[yRight], margins[xBottom] ); bool doUpdate = false; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( margins[axisId] >= 0.0 ) { const int m = qCeil( margins[axisId] ); plotLayout()->setCanvasMargin( m, axisId); doUpdate = true; } } if ( doUpdate ) updateLayout(); } /*! Redraw the canvas. \param painter Painter used for drawing \warning drawCanvas calls drawItems what is also used for printing. Applications that like to add individual plot items better overload drawItems() \sa drawItems() */ void QwtPlot::drawCanvas( QPainter *painter ) { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); drawItems( painter, d_data->canvas->contentsRect(), maps ); } /*! Redraw the canvas items. \param painter Painter used for drawing \param canvasRect Bounding rectangle where to paint \param maps QwtPlot::axisCnt maps, mapping between plot and paint device coordinates \note Usually canvasRect is contentsRect() of the plot canvas. Due to a bug in Qt this rectangle might be wrong for certain frame styles ( f.e QFrame::Box ) and it might be necessary to fix the margins manually using QWidget::setContentsMargins() */ void QwtPlot::drawItems( QPainter *painter, const QRectF &canvasRect, const QwtScaleMap maps[axisCnt] ) const { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item && item->isVisible() ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); painter->setRenderHint( QPainter::HighQualityAntialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); item->draw( painter, maps[item->xAxis()], maps[item->yAxis()], canvasRect ); painter->restore(); } } } /*! \param axisId Axis \return Map for the axis on the canvas. With this map pixel coordinates can translated to plot coordinates and vice versa. \sa QwtScaleMap, transform(), invTransform() */ QwtScaleMap QwtPlot::canvasMap( int axisId ) const { QwtScaleMap map; if ( !d_data->canvas ) return map; map.setTransformation( axisScaleEngine( axisId )->transformation() ); const QwtScaleDiv &sd = axisScaleDiv( axisId ); map.setScaleInterval( sd.lowerBound(), sd.upperBound() ); if ( axisEnabled( axisId ) ) { const QwtScaleWidget *s = axisWidget( axisId ); if ( axisId == yLeft || axisId == yRight ) { double y = s->y() + s->startBorderDist() - d_data->canvas->y(); double h = s->height() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( y + h, y ); } else { double x = s->x() + s->startBorderDist() - d_data->canvas->x(); double w = s->width() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( x, x + w ); } } else { int margin = 0; if ( !plotLayout()->alignCanvasToScale( axisId ) ) margin = plotLayout()->canvasMargin( axisId ); const QRect &canvasRect = d_data->canvas->contentsRect(); if ( axisId == yLeft || axisId == yRight ) { map.setPaintInterval( canvasRect.bottom() - margin, canvasRect.top() + margin ); } else { map.setPaintInterval( canvasRect.left() + margin, canvasRect.right() - margin ); } } return map; } /*! \brief Change the background of the plotting area Sets brush to QPalette::Window of all color groups of the palette of the canvas. Using canvas()->setPalette() is a more powerful way to set these colors. \param brush New background brush \sa canvasBackground() */ void QwtPlot::setCanvasBackground( const QBrush &brush ) { QPalette pal = d_data->canvas->palette(); pal.setBrush( QPalette::Window, brush ); canvas()->setPalette( pal ); } /*! Nothing else than: canvas()->palette().brush( QPalette::Normal, QPalette::Window); \return Background brush of the plotting area. \sa setCanvasBackground() */ QBrush QwtPlot::canvasBackground() const { return canvas()->palette().brush( QPalette::Normal, QPalette::Window ); } /*! \return \c true if the specified axis exists, otherwise \c false \param axisId axis index */ bool QwtPlot::axisValid( int axisId ) { return ( ( axisId >= QwtPlot::yLeft ) && ( axisId < QwtPlot::axisCnt ) ); } /*! \brief Insert a legend If the position legend is \c QwtPlot::LeftLegend or \c QwtPlot::RightLegend the legend will be organized in one column from top to down. Otherwise the legend items will be placed in a table with a best fit number of columns from left to right. insertLegend() will set the plot widget as parent for the legend. The legend will be deleted in the destructor of the plot or when another legend is inserted. Legends, that are not inserted into the layout of the plot widget need to connect to the legendDataChanged() signal. Calling updateLegend() initiates this signal for an initial update. When the application code wants to implement its own layout this also needs to be done for rendering plots to a document ( see QwtPlotRenderer ). \param legend Legend \param pos The legend's position. For top/left position the number of columns will be limited to 1, otherwise it will be set to unlimited. \param ratio Ratio between legend and the bounding rectangle of title, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa legend(), QwtPlotLayout::legendPosition(), QwtPlotLayout::setLegendPosition() */ void QwtPlot::insertLegend( QwtAbstractLegend *legend, QwtPlot::LegendPosition pos, double ratio ) { d_data->layout->setLegendPosition( pos, ratio ); if ( legend != d_data->legend ) { if ( d_data->legend && d_data->legend->parent() == this ) delete d_data->legend; d_data->legend = legend; if ( d_data->legend ) { connect( this, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), d_data->legend, SLOT( updateLegend( const QVariant &, const QList & ) ) ); if ( d_data->legend->parent() != this ) d_data->legend->setParent( this ); qwtEnableLegendItems( this, false ); updateLegend(); qwtEnableLegendItems( this, true ); QwtLegend *lgd = qobject_cast( legend ); if ( lgd ) { switch ( d_data->layout->legendPosition() ) { case LeftLegend: case RightLegend: { if ( lgd->maxColumns() == 0 ) lgd->setMaxColumns( 1 ); // 1 column: align vertical break; } case TopLegend: case BottomLegend: { lgd->setMaxColumns( 0 ); // unlimited break; } default: break; } } QWidget *previousInChain = NULL; switch ( d_data->layout->legendPosition() ) { case LeftLegend: { previousInChain = axisWidget( QwtPlot::xTop ); break; } case TopLegend: { previousInChain = this; break; } case RightLegend: { previousInChain = axisWidget( QwtPlot::yRight ); break; } case BottomLegend: { previousInChain = footerLabel(); break; } } if ( previousInChain ) qwtSetTabOrder( previousInChain, legend, true ); } } updateLayout(); } /*! Emit legendDataChanged() for all plot item \sa QwtPlotItem::legendData(), legendDataChanged() */ void QwtPlot::updateLegend() { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { updateLegend( *it ); } } /*! Emit legendDataChanged() for a plot item \param plotItem Plot item \sa QwtPlotItem::legendData(), legendDataChanged() */ void QwtPlot::updateLegend( const QwtPlotItem *plotItem ) { if ( plotItem == NULL ) return; QList legendData; if ( plotItem->testItemAttribute( QwtPlotItem::Legend ) ) legendData = plotItem->legendData(); const QVariant itemInfo = itemToInfo( const_cast< QwtPlotItem *>( plotItem) ); Q_EMIT legendDataChanged( itemInfo, legendData ); } /*! \brief Update all plot items interested in legend attributes Call QwtPlotItem::updateLegend(), when the QwtPlotItem::LegendInterest flag is set. \param itemInfo Info about the plot item \param legendData Entries to be displayed for the plot item ( usually 1 ) \sa QwtPlotItem::LegendInterest, QwtPlotLegendItem, QwtPlotItem::updateLegend() */ void QwtPlot::updateLegendItems( const QVariant &itemInfo, const QList &legendData ) { QwtPlotItem *plotItem = infoToItem( itemInfo ); if ( plotItem ) { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item->testItemInterest( QwtPlotItem::LegendInterest ) ) item->updateLegend( plotItem, legendData ); } } } /*! \brief Attach/Detach a plot item \param plotItem Plot item \param on When true attach the item, otherwise detach it */ void QwtPlot::attachItem( QwtPlotItem *plotItem, bool on ) { if ( plotItem->testItemInterest( QwtPlotItem::LegendInterest ) ) { // plotItem is some sort of legend const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; QList legendData; if ( on && item->testItemAttribute( QwtPlotItem::Legend ) ) { legendData = item->legendData(); plotItem->updateLegend( item, legendData ); } } } if ( on ) insertItem( plotItem ); else removeItem( plotItem ); Q_EMIT itemAttached( plotItem, on ); if ( plotItem->testItemAttribute( QwtPlotItem::Legend ) ) { // the item wants to be represented on the legend if ( on ) { updateLegend( plotItem ); } else { const QVariant itemInfo = itemToInfo( plotItem ); Q_EMIT legendDataChanged( itemInfo, QList() ); } } if ( autoReplot() ) update(); } /*! \brief Build an information, that can be used to identify a plot item on the legend. The default implementation simply wraps the plot item into a QVariant object. When overloading itemToInfo() usually infoToItem() needs to reimplemeted too. \code QVariant itemInfo; qVariantSetValue( itemInfo, plotItem ); \endcode \param plotItem Plot item \return Plot item embedded in a QVariant \sa infoToItem() */ QVariant QwtPlot::itemToInfo( QwtPlotItem *plotItem ) const { QVariant itemInfo; qVariantSetValue( itemInfo, plotItem ); return itemInfo; } /*! \brief Identify the plot item according to an item info object, that has bee generated from itemToInfo(). The default implementation simply tries to unwrap a QwtPlotItem pointer: \code if ( itemInfo.canConvert() ) return qvariant_cast( itemInfo ); \endcode \param itemInfo Plot item \return A plot item, when successful, otherwise a NULL pointer. \sa itemToInfo() */ QwtPlotItem *QwtPlot::infoToItem( const QVariant &itemInfo ) const { if ( itemInfo.canConvert() ) return qvariant_cast( itemInfo ); return NULL; } qsstv_9.2.6/qwt/qwt_plot.h0000664000175000017500000002025213203343610014263 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_H #define QWT_PLOT_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_plot_dict.h" #include "qwt_scale_map.h" #include "qwt_interval.h" #include #include #include class QwtPlotLayout; class QwtAbstractLegend; class QwtScaleWidget; class QwtScaleEngine; class QwtScaleDiv; class QwtScaleDraw; class QwtTextLabel; /*! \brief A 2-D plotting widget QwtPlot is a widget for plotting two-dimensional graphs. An unlimited number of plot items can be displayed on its canvas. Plot items might be curves (QwtPlotCurve), markers (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived from QwtPlotItem. A plot can have up to four axes, with each plot item attached to an x- and a y axis. The scales at the axes can be explicitly set (QwtScaleDiv), or are calculated from the plot items, using algorithms (QwtScaleEngine) which can be configured separately for each axis. The simpleplot example is a good starting point to see how to set up a plot widget. \image html plot.png \par Example The following example shows (schematically) the most simple way to use QwtPlot. By default, only the left and bottom axes are visible and their scales are computed automatically. \verbatim #include #include QwtPlot *myPlot = new QwtPlot("Two Curves", parent); // add curves QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1"); QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2"); // connect or copy the data to the curves curve1->setData(...); curve2->setData(...); curve1->attach(myPlot); curve2->attach(myPlot); // finally, refresh the plot myPlot->replot(); \endverbatim */ class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict { Q_OBJECT Q_PROPERTY( QBrush canvasBackground READ canvasBackground WRITE setCanvasBackground ) Q_PROPERTY( bool autoReplot READ autoReplot WRITE setAutoReplot ) #if 0 // This property is intended to configure the plot // widget from a special dialog in the deigner plugin. // Disabled until such a dialog has been implemented. Q_PROPERTY( QString propertiesDocument READ grabProperties WRITE applyProperties ) #endif public: //! \brief Axis index enum Axis { //! Y axis left of the canvas yLeft, //! Y axis right of the canvas yRight, //! X axis below the canvas xBottom, //! X axis above the canvas xTop, //! Number of axes axisCnt }; /*! Position of the legend, relative to the canvas. \sa insertLegend() */ enum LegendPosition { //! The legend will be left from the QwtPlot::yLeft axis. LeftLegend, //! The legend will be right from the QwtPlot::yRight axis. RightLegend, //! The legend will be below the footer BottomLegend, //! The legend will be above the title TopLegend }; explicit QwtPlot( QWidget * = NULL ); explicit QwtPlot( const QwtText &title, QWidget * = NULL ); virtual ~QwtPlot(); void applyProperties( const QString & ); QString grabProperties() const; void setAutoReplot( bool = true ); bool autoReplot() const; // Layout void setPlotLayout( QwtPlotLayout * ); QwtPlotLayout *plotLayout(); const QwtPlotLayout *plotLayout() const; // Title void setTitle( const QString & ); void setTitle( const QwtText &t ); QwtText title() const; QwtTextLabel *titleLabel(); const QwtTextLabel *titleLabel() const; // Footer void setFooter( const QString & ); void setFooter( const QwtText &t ); QwtText footer() const; QwtTextLabel *footerLabel(); const QwtTextLabel *footerLabel() const; // Canvas void setCanvas( QWidget * ); QWidget *canvas(); const QWidget *canvas() const; void setCanvasBackground( const QBrush & ); QBrush canvasBackground() const; virtual QwtScaleMap canvasMap( int axisId ) const; double invTransform( int axisId, int pos ) const; double transform( int axisId, double value ) const; // Axes QwtScaleEngine *axisScaleEngine( int axisId ); const QwtScaleEngine *axisScaleEngine( int axisId ) const; void setAxisScaleEngine( int axisId, QwtScaleEngine * ); void setAxisAutoScale( int axisId, bool on = true ); bool axisAutoScale( int axisId ) const; void enableAxis( int axisId, bool tf = true ); bool axisEnabled( int axisId ) const; void setAxisFont( int axisId, const QFont &f ); QFont axisFont( int axisId ) const; void setAxisScale( int axisId, double min, double max, double step = 0 ); void setAxisScaleDiv( int axisId, const QwtScaleDiv & ); void setAxisScaleDraw( int axisId, QwtScaleDraw * ); double axisStepSize( int axisId ) const; QwtInterval axisInterval( int axisId ) const; const QwtScaleDiv &axisScaleDiv( int axisId ) const; const QwtScaleDraw *axisScaleDraw( int axisId ) const; QwtScaleDraw *axisScaleDraw( int axisId ); const QwtScaleWidget *axisWidget( int axisId ) const; QwtScaleWidget *axisWidget( int axisId ); void setAxisLabelAlignment( int axisId, Qt::Alignment ); void setAxisLabelRotation( int axisId, double rotation ); void setAxisTitle( int axisId, const QString & ); void setAxisTitle( int axisId, const QwtText & ); QwtText axisTitle( int axisId ) const; void setAxisMaxMinor( int axisId, int maxMinor ); int axisMaxMinor( int axisId ) const; void setAxisMaxMajor( int axisId, int maxMajor ); int axisMaxMajor( int axisId ) const; // Legend void insertLegend( QwtAbstractLegend *, LegendPosition = QwtPlot::RightLegend, double ratio = -1.0 ); QwtAbstractLegend *legend(); const QwtAbstractLegend *legend() const; void updateLegend(); void updateLegend( const QwtPlotItem * ); // Misc virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void updateLayout(); virtual void drawCanvas( QPainter * ); void updateAxes(); void updateCanvasMargins(); virtual void getCanvasMarginsHint( const QwtScaleMap maps[], const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const; virtual bool event( QEvent * ); virtual bool eventFilter( QObject *, QEvent * ); virtual void drawItems( QPainter *, const QRectF &, const QwtScaleMap maps[axisCnt] ) const; virtual QVariant itemToInfo( QwtPlotItem * ) const; virtual QwtPlotItem *infoToItem( const QVariant & ) const; Q_SIGNALS: /*! A signal indicating, that an item has been attached/detached \param plotItem Plot item \param on Attached/Detached */ void itemAttached( QwtPlotItem *plotItem, bool on ); /*! A signal with the attributes how to update the legend entries for a plot item. \param itemInfo Info about a plot item, build from itemToInfo() \param data Attributes of the entries ( usually <= 1 ) for the plot item. \sa itemToInfo(), infoToItem(), QwtAbstractLegend::updateLegend() */ void legendDataChanged( const QVariant &itemInfo, const QList &data ); public Q_SLOTS: virtual void replot(); void autoRefresh(); protected: static bool axisValid( int axisId ); virtual void resizeEvent( QResizeEvent *e ); private Q_SLOTS: void updateLegendItems( const QVariant &itemInfo, const QList &data ); private: friend class QwtPlotItem; void attachItem( QwtPlotItem *, bool ); void initAxesData(); void deleteAxesData(); void updateScaleDiv(); void initPlot( const QwtText &title ); class AxisData; AxisData *d_axisData[axisCnt]; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_abstract_barchart.cpp0000664000175000017500000002203213203343610020345 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_abstract_barchart.h" #include "qwt_scale_map.h" static inline double qwtTransformWidth( const QwtScaleMap &map, double value, double width ) { const double w2 = 0.5 * width; const double v1 = map.transform( value - w2 ); const double v2 = map.transform( value + w2 ); return qAbs( v2 - v1 ); } class QwtPlotAbstractBarChart::PrivateData { public: PrivateData(): layoutPolicy( QwtPlotAbstractBarChart::AutoAdjustSamples ), layoutHint( 0.5 ), spacing( 10 ), margin( 5 ), baseline( 0.0 ) { } QwtPlotAbstractBarChart::LayoutPolicy layoutPolicy; double layoutHint; int spacing; int margin; double baseline; }; /*! Constructor \param title Title of the chart */ QwtPlotAbstractBarChart::QwtPlotAbstractBarChart( const QwtText &title ): QwtPlotSeriesItem( title ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Margins, true ); setZ( 19.0 ); } //! Destructor QwtPlotAbstractBarChart::~QwtPlotAbstractBarChart() { delete d_data; } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \param policy Layout policy \sa layoutPolicy(), layoutHint() */ void QwtPlotAbstractBarChart::setLayoutPolicy( LayoutPolicy policy ) { if ( policy != d_data->layoutPolicy ) { d_data->layoutPolicy = policy; itemChanged(); } } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \return Layout policy of the chart item \sa setLayoutPolicy(), layoutHint() */ QwtPlotAbstractBarChart::LayoutPolicy QwtPlotAbstractBarChart::layoutPolicy() const { return d_data->layoutPolicy; } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \param hint Layout hint \sa LayoutPolicy, layoutPolicy(), layoutHint() */ void QwtPlotAbstractBarChart::setLayoutHint( double hint ) { hint = qMax( 0.0, hint ); if ( hint != d_data->layoutHint ) { d_data->layoutHint = hint; itemChanged(); } } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \return Layout policy of the chart item \sa LayoutPolicy, setLayoutHint(), layoutPolicy() */ double QwtPlotAbstractBarChart::layoutHint() const { return d_data->layoutHint; } /*! \brief Set the spacing The spacing is the distance between 2 samples ( bars for QwtPlotBarChart or a group of bars for QwtPlotMultiBarChart ) in paint device coordinates. \sa spacing() */ void QwtPlotAbstractBarChart::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; itemChanged(); } } /*! \return Spacing between 2 samples ( bars or groups of bars ) \sa setSpacing(), margin() */ int QwtPlotAbstractBarChart::spacing() const { return d_data->spacing; } /*! \brief Set the margin The margin is the distance between the outmost bars and the contentsRect() of the canvas. The default setting is 5 pixels. \param margin Margin \sa spacing(), margin() */ void QwtPlotAbstractBarChart::setMargin( int margin ) { margin = qMax( margin, 0 ); if ( margin != d_data->margin ) { d_data->margin = margin; itemChanged(); } } /*! \return Margin between the outmost bars and the contentsRect() of the canvas. \sa setMargin(), spacing() */ int QwtPlotAbstractBarChart::margin() const { return d_data->margin; } /*! \brief Set the baseline The baseline is the origin for the chart. Each bar is painted from the baseline in the direction of the sample value. In case of a horizontal orientation() the baseline is interpreted as x - otherwise as y - value. The default value for the baseline is 0. \param value Value for the baseline \sa baseline(), QwtPlotSeriesItem::orientation() */ void QwtPlotAbstractBarChart::setBaseline( double value ) { if ( value != d_data->baseline ) { d_data->baseline = value; itemChanged(); } } /*! \return Value for the origin of the bar chart \sa setBaseline(), QwtPlotSeriesItem::orientation() */ double QwtPlotAbstractBarChart::baseline() const { return d_data->baseline; } /*! Calculate the width for a sample in paint device coordinates \param map Scale map for the corresponding scale \param canvasSize Size of the canvas in paint device coordinates \param boundingSize Bounding size of the chart in plot coordinates ( used in AutoAdjustSamples mode ) \param value Value of the sample \return Sample width \sa layoutPolicy(), layoutHint() */ double QwtPlotAbstractBarChart::sampleWidth( const QwtScaleMap &map, double canvasSize, double boundingSize, double value ) const { double width; switch( d_data->layoutPolicy ) { case ScaleSamplesToAxes: { width = qwtTransformWidth( map, value, d_data->layoutHint ); break; } case ScaleSampleToCanvas: { width = canvasSize * d_data->layoutHint; break; } case FixedSampleSize: { width = d_data->layoutHint; break; } case AutoAdjustSamples: default: { const size_t numSamples = dataSize(); double w = 1.0; if ( numSamples > 1 ) { w = qAbs( boundingSize / ( numSamples - 1 ) ); } width = qwtTransformWidth( map, value, w ); width -= d_data->spacing; } } return width; } /*! \brief Calculate a hint for the canvas margin Bar charts need to reserve some space for displaying the bars for the first and the last sample. The hint is calculated from the layoutHint() depending on the layoutPolicy(). The margins are in target device coordinates ( pixels on screen ) \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \param left Returns the left margin \param top Returns the top margin \param right Returns the right margin \param bottom Returns the bottom margin \return Margin \sa layoutPolicy(), layoutHint(), QwtPlotItem::Margins QwtPlot::getCanvasMarginsHint(), QwtPlot::updateCanvasMargins() */ void QwtPlotAbstractBarChart::getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom ) const { double hint = -1.0; switch( layoutPolicy() ) { case ScaleSampleToCanvas: { if ( orientation() == Qt::Vertical ) hint = 0.5 * canvasRect.width() * d_data->layoutHint; else hint = 0.5 * canvasRect.height() * d_data->layoutHint; break; } case FixedSampleSize: { hint = 0.5 * d_data->layoutHint; break; } case AutoAdjustSamples: case ScaleSamplesToAxes: default: { const size_t numSamples = dataSize(); if ( numSamples <= 0 ) break; // doesn't work for nonlinear scales const QRectF br = dataRect(); double spacing = 0.0; double sampleWidthS = 1.0; if ( layoutPolicy() == ScaleSamplesToAxes ) { sampleWidthS = qMax( d_data->layoutHint, 0.0 ); } else { spacing = d_data->spacing; if ( numSamples > 1 ) { sampleWidthS = qAbs( br.width() / ( numSamples - 1 ) ); } } double ds, w; if ( orientation() == Qt::Vertical ) { ds = qAbs( xMap.sDist() ); w = canvasRect.width(); } else { ds = qAbs( yMap.sDist() ); w = canvasRect.height(); } const double sampleWidthP = ( w - spacing * ds ) * sampleWidthS / ( ds + sampleWidthS ); hint = 0.5 * sampleWidthP; hint += qMax( d_data->margin, 0 ); } } if ( orientation() == Qt::Vertical ) { left = right = hint; top = bottom = -1.0; // no hint } else { left = right = -1.0; // no hint top = bottom = hint; } } qsstv_9.2.6/qwt/qwt_plot_abstract_barchart.h0000664000175000017500000000504213203343610020014 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ABSTRACT_BAR_CHART_H #define QWT_PLOT_ABSTRACT_BAR_CHART_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" /*! \brief Abstract base class for bar chart items In opposite to almost all other plot items bar charts can't be displayed inside of their bounding rectangle and need a special API how to calculate the width of the bars and how they affect the layout of the attached plot. */ class QWT_EXPORT QwtPlotAbstractBarChart: public QwtPlotSeriesItem { public: /*! \brief Mode how to calculate the bar width setLayoutPolicy(), setLayoutHint(), barWidthHint() */ enum LayoutPolicy { /*! The sample width is calculated by dividing the bounding rectangle by the number of samples. \sa boundingRectangle() \note The layoutHint() is ignored */ AutoAdjustSamples, /*! layoutHint() defines an interval in axis coordinates */ ScaleSamplesToAxes, /*! The bar width is calculated by multiplying layoutHint() with the height or width of the canvas. \sa boundingRectangle() */ ScaleSampleToCanvas, /*! layoutHint() defines a fixed width in paint device coordinates. */ FixedSampleSize }; explicit QwtPlotAbstractBarChart( const QwtText &title ); virtual ~QwtPlotAbstractBarChart(); void setLayoutPolicy( LayoutPolicy ); LayoutPolicy layoutPolicy() const; void setLayoutHint( double ); double layoutHint() const; void setSpacing( int ); int spacing() const; void setMargin( int ); int margin() const; void setBaseline( double ); double baseline() const; virtual void getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const; protected: double sampleWidth( const QwtScaleMap &map, double canvasSize, double dataSize, double value ) const; private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_axis.cpp0000664000175000017500000004332713203343610015652 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_math.h" #include "qwt_scale_widget.h" #include "qwt_scale_div.h" #include "qwt_scale_engine.h" class QwtPlot::AxisData { public: bool isEnabled; bool doAutoScale; double minValue; double maxValue; double stepSize; int maxMajor; int maxMinor; bool isValid; QwtScaleDiv scaleDiv; QwtScaleEngine *scaleEngine; QwtScaleWidget *scaleWidget; }; //! Initialize axes void QwtPlot::initAxesData() { int axisId; for ( axisId = 0; axisId < axisCnt; axisId++ ) d_axisData[axisId] = new AxisData; d_axisData[yLeft]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::LeftScale, this ); d_axisData[yRight]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::RightScale, this ); d_axisData[xTop]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::TopScale, this ); d_axisData[xBottom]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::BottomScale, this ); d_axisData[yLeft]->scaleWidget->setObjectName( "QwtPlotAxisYLeft" ); d_axisData[yRight]->scaleWidget->setObjectName( "QwtPlotAxisYRight" ); d_axisData[xTop]->scaleWidget->setObjectName( "QwtPlotAxisXTop" ); d_axisData[xBottom]->scaleWidget->setObjectName( "QwtPlotAxisXBottom" ); #if 1 // better find the font sizes from the application font QFont fscl( fontInfo().family(), 10 ); QFont fttl( fontInfo().family(), 12, QFont::Bold ); #endif for ( axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; d.scaleEngine = new QwtLinearScaleEngine; d.scaleWidget->setTransformation( d.scaleEngine->transformation() ); d.scaleWidget->setFont( fscl ); d.scaleWidget->setMargin( 2 ); QwtText text = d.scaleWidget->title(); text.setFont( fttl ); d.scaleWidget->setTitle( text ); d.doAutoScale = true; d.minValue = 0.0; d.maxValue = 1000.0; d.stepSize = 0.0; d.maxMinor = 5; d.maxMajor = 8; d.isValid = false; } d_axisData[yLeft]->isEnabled = true; d_axisData[yRight]->isEnabled = false; d_axisData[xBottom]->isEnabled = true; d_axisData[xTop]->isEnabled = false; } void QwtPlot::deleteAxesData() { for ( int axisId = 0; axisId < axisCnt; axisId++ ) { delete d_axisData[axisId]->scaleEngine; delete d_axisData[axisId]; d_axisData[axisId] = NULL; } } /*! \return Scale widget of the specified axis, or NULL if axisId is invalid. \param axisId Axis index */ const QwtScaleWidget *QwtPlot::axisWidget( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! \return Scale widget of the specified axis, or NULL if axisId is invalid. \param axisId Axis index */ QwtScaleWidget *QwtPlot::axisWidget( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! Change the scale engine for an axis \param axisId Axis index \param scaleEngine Scale engine \sa axisScaleEngine() */ void QwtPlot::setAxisScaleEngine( int axisId, QwtScaleEngine *scaleEngine ) { if ( axisValid( axisId ) && scaleEngine != NULL ) { AxisData &d = *d_axisData[axisId]; delete d.scaleEngine; d.scaleEngine = scaleEngine; d_axisData[axisId]->scaleWidget->setTransformation( scaleEngine->transformation() ); d.isValid = false; autoRefresh(); } } /*! \param axisId Axis index \return Scale engine for a specific axis */ QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \param axisId Axis index \return Scale engine for a specific axis */ const QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \return \c True, if autoscaling is enabled \param axisId Axis index */ bool QwtPlot::axisAutoScale( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->doAutoScale; else return false; } /*! \return \c True, if a specified axis is enabled \param axisId Axis index */ bool QwtPlot::axisEnabled( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->isEnabled; else return false; } /*! \return The font of the scale labels for a specified axis \param axisId Axis index */ QFont QwtPlot::axisFont( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->font(); else return QFont(); } /*! \return The maximum number of major ticks for a specified axis \param axisId Axis index \sa setAxisMaxMajor(), QwtScaleEngine::divideScale() */ int QwtPlot::axisMaxMajor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMajor; else return 0; } /*! \return the maximum number of minor ticks for a specified axis \param axisId Axis index \sa setAxisMaxMinor(), QwtScaleEngine::divideScale() */ int QwtPlot::axisMaxMinor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMinor; else return 0; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId).lowerBound(), axisScaleDiv(axisId).upperBound() are the current limits of the axis scale. \param axisId Axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv(), QwtScaleEngine::divideScale() */ const QwtScaleDiv &QwtPlot::axisScaleDiv( int axisId ) const { return d_axisData[axisId]->scaleDiv; } /*! \brief Return the scale draw of a specified axis \param axisId Axis index \return Specified scaleDraw for axis, or NULL if axis is invalid. */ const QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \brief Return the scale draw of a specified axis \param axisId Axis index \return Specified scaleDraw for axis, or NULL if axis is invalid. */ QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \brief Return the step size parameter that has been set in setAxisScale. This doesn't need to be the step size of the current scale. \param axisId Axis index \return step size parameter value \sa setAxisScale(), QwtScaleEngine::divideScale() */ double QwtPlot::axisStepSize( int axisId ) const { if ( !axisValid( axisId ) ) return 0; return d_axisData[axisId]->stepSize; } /*! \brief Return the current interval of the specified axis This is only a convenience function for axisScaleDiv( axisId )->interval(); \param axisId Axis index \return Scale interval \sa QwtScaleDiv, axisScaleDiv() */ QwtInterval QwtPlot::axisInterval( int axisId ) const { if ( !axisValid( axisId ) ) return QwtInterval(); return d_axisData[axisId]->scaleDiv.interval(); } /*! \return Title of a specified axis \param axisId Axis index */ QwtText QwtPlot::axisTitle( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->title(); else return QwtText(); } /*! \brief Enable or disable a specified axis When an axis is disabled, this only means that it is not visible on the screen. Curves, markers and can be attached to disabled axes, and transformation of screen coordinates into values works as normal. Only xBottom and yLeft are enabled by default. \param axisId Axis index \param tf \c true (enabled) or \c false (disabled) */ void QwtPlot::enableAxis( int axisId, bool tf ) { if ( axisValid( axisId ) && tf != d_axisData[axisId]->isEnabled ) { d_axisData[axisId]->isEnabled = tf; updateLayout(); } } /*! Transform the x or y coordinate of a position in the drawing region into a value. \param axisId Axis index \param pos position \return Position as axis coordinate \warning The position can be an x or a y coordinate, depending on the specified axis. */ double QwtPlot::invTransform( int axisId, int pos ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).invTransform( pos ) ); else return 0.0; } /*! \brief Transform a value into a coordinate in the plotting region \param axisId Axis index \param value value \return X or Y coordinate in the plotting region corresponding to the value. */ double QwtPlot::transform( int axisId, double value ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).transform( value ) ); else return 0.0; } /*! \brief Change the font of an axis \param axisId Axis index \param font Font \warning This function changes the font of the tick labels, not of the axis title. */ void QwtPlot::setAxisFont( int axisId, const QFont &font ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setFont( font ); } /*! \brief Enable autoscaling for a specified axis This member function is used to switch back to autoscaling mode after a fixed scale has been set. Autoscaling is enabled by default. \param axisId Axis index \param on On/Off \sa setAxisScale(), setAxisScaleDiv(), updateAxes() \note The autoscaling flag has no effect until updateAxes() is executed ( called by replot() ). */ void QwtPlot::setAxisAutoScale( int axisId, bool on ) { if ( axisValid( axisId ) && ( d_axisData[axisId]->doAutoScale != on ) ) { d_axisData[axisId]->doAutoScale = on; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. In updateAxes() the scale engine calculates a scale division from the specified parameters, that will be assigned to the scale widget. So updates of the scale widget usually happen delayed with the next replot. \param axisId Axis index \param min Minimum of the scale \param max Maximum of the scale \param stepSize Major step size. If step == 0, the step size is calculated automatically using the maxMajor setting. \sa setAxisMaxMajor(), setAxisAutoScale(), axisStepSize(), QwtScaleEngine::divideScale() */ void QwtPlot::setAxisScale( int axisId, double min, double max, double stepSize ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.isValid = false; d.minValue = min; d.maxValue = max; d.stepSize = stepSize; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. The scale division will be stored locally only until the next call of updateAxes(). So updates of the scale widget usually happen delayed with the next replot. \param axisId Axis index \param scaleDiv Scale division \sa setAxisScale(), setAxisAutoScale() */ void QwtPlot::setAxisScaleDiv( int axisId, const QwtScaleDiv &scaleDiv ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv = scaleDiv; d.isValid = true; autoRefresh(); } } /*! \brief Set a scale draw \param axisId Axis index \param scaleDraw Object responsible for drawing scales. By passing scaleDraw it is possible to extend QwtScaleDraw functionality and let it take place in QwtPlot. Please note that scaleDraw has to be created with new and will be deleted by the corresponding QwtScale member ( like a child object ). \sa QwtScaleDraw, QwtScaleWidget \warning The attributes of scaleDraw will be overwritten by those of the previous QwtScaleDraw. */ void QwtPlot::setAxisScaleDraw( int axisId, QwtScaleDraw *scaleDraw ) { if ( axisValid( axisId ) ) { axisWidget( axisId )->setScaleDraw( scaleDraw ); autoRefresh(); } } /*! Change the alignment of the tick labels \param axisId Axis index \param alignment Or'd Qt::AlignmentFlags see \sa QwtScaleDraw::setLabelAlignment() */ void QwtPlot::setAxisLabelAlignment( int axisId, Qt::Alignment alignment ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelAlignment( alignment ); } /*! Rotate all tick labels \param axisId Axis index \param rotation Angle in degrees. When changing the label rotation, the label alignment might be adjusted too. \sa QwtScaleDraw::setLabelRotation(), setAxisLabelAlignment() */ void QwtPlot::setAxisLabelRotation( int axisId, double rotation ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelRotation( rotation ); } /*! Set the maximum number of minor scale intervals for a specified axis \param axisId Axis index \param maxMinor Maximum number of minor steps \sa axisMaxMinor() */ void QwtPlot::setAxisMaxMinor( int axisId, int maxMinor ) { if ( axisValid( axisId ) ) { maxMinor = qBound( 0, maxMinor, 100 ); AxisData &d = *d_axisData[axisId]; if ( maxMinor != d.maxMinor ) { d.maxMinor = maxMinor; d.isValid = false; autoRefresh(); } } } /*! Set the maximum number of major scale intervals for a specified axis \param axisId Axis index \param maxMajor Maximum number of major steps \sa axisMaxMajor() */ void QwtPlot::setAxisMaxMajor( int axisId, int maxMajor ) { if ( axisValid( axisId ) ) { maxMajor = qBound( 1, maxMajor, 10000 ); AxisData &d = *d_axisData[axisId]; if ( maxMajor != d.maxMajor ) { d.maxMajor = maxMajor; d.isValid = false; autoRefresh(); } } } /*! \brief Change the title of a specified axis \param axisId Axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QString &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Change the title of a specified axis \param axisId Axis index \param title Axis title */ void QwtPlot::setAxisTitle( int axisId, const QwtText &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Rebuild the axes scales In case of autoscaling the boundaries of a scale are calculated from the bounding rectangles of all plot items, having the QwtPlotItem::AutoScale flag enabled ( QwtScaleEngine::autoScale() ). Then a scale division is calculated ( QwtScaleEngine::didvideScale() ) and assigned to scale widget. When the scale boundaries have been assigned with setAxisScale() a scale division is calculated ( QwtScaleEngine::didvideScale() ) for this interval and assigned to the scale widget. When the scale has been set explicitly by setAxisScaleDiv() the locally stored scale division gets assigned to the scale widget. The scale widget indicates modifications by emitting a QwtScaleWidget::scaleDivChanged() signal. updateAxes() is usually called by replot(). \sa setAxisAutoScale(), setAxisScale(), setAxisScaleDiv(), replot() QwtPlotItem::boundingRect() */ void QwtPlot::updateAxes() { // Find bounding interval of the item data // for all axes, where autoscaling is enabled QwtInterval intv[axisCnt]; const QwtPlotItemList& itmList = itemList(); QwtPlotItemIterator it; for ( it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( !item->testItemAttribute( QwtPlotItem::AutoScale ) ) continue; if ( !item->isVisible() ) continue; if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) ) { const QRectF rect = item->boundingRect(); if ( rect.width() >= 0.0 ) intv[item->xAxis()] |= QwtInterval( rect.left(), rect.right() ); if ( rect.height() >= 0.0 ) intv[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() ); } } // Adjust scales for ( int axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; double minValue = d.minValue; double maxValue = d.maxValue; double stepSize = d.stepSize; if ( d.doAutoScale && intv[axisId].isValid() ) { d.isValid = false; minValue = intv[axisId].minValue(); maxValue = intv[axisId].maxValue(); d.scaleEngine->autoScale( d.maxMajor, minValue, maxValue, stepSize ); } if ( !d.isValid ) { d.scaleDiv = d.scaleEngine->divideScale( minValue, maxValue, d.maxMajor, d.maxMinor, stepSize ); d.isValid = true; } QwtScaleWidget *scaleWidget = axisWidget( axisId ); scaleWidget->setScaleDiv( d.scaleDiv ); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); scaleWidget->setBorderDist( startDist, endDist ); } for ( it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item->testItemInterest( QwtPlotItem::ScaleInterest ) ) { item->updateScaleDiv( axisScaleDiv( item->xAxis() ), axisScaleDiv( item->yAxis() ) ); } } } qsstv_9.2.6/qwt/qwt_plot_barchart.cpp0000664000175000017500000002635113203343610016472 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_barchart.h" #include "qwt_scale_map.h" #include "qwt_column_symbol.h" #include "qwt_painter.h" #include class QwtPlotBarChart::PrivateData { public: PrivateData(): symbol( NULL ), legendMode( QwtPlotBarChart::LegendChartTitle ) { } ~PrivateData() { delete symbol; } QwtColumnSymbol *symbol; QwtPlotBarChart::LegendMode legendMode; }; /*! Constructor \param title Title of the curve */ QwtPlotBarChart::QwtPlotBarChart( const QwtText &title ): QwtPlotAbstractBarChart( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotBarChart::QwtPlotBarChart( const QString &title ): QwtPlotAbstractBarChart( QwtText( title ) ) { init(); } //! Destructor QwtPlotBarChart::~QwtPlotBarChart() { delete d_data; } void QwtPlotBarChart::init() { d_data = new PrivateData; setData( new QwtPointSeriesData() ); } //! \return QwtPlotItem::Rtti_PlotBarChart int QwtPlotBarChart::rtti() const { return QwtPlotItem::Rtti_PlotBarChart; } /*! Initialize data with an array of points \param samples Vector of points \note QVector is implicitly shared \note QPolygonF is derived from QVector */ void QwtPlotBarChart::setSamples( const QVector &samples ) { setData( new QwtPointSeriesData( samples ) ); } /*! Initialize data with an array of doubles The indices in the array are taken as x coordinate, while the doubles are interpreted as y values. \param samples Vector of y coordinates \note QVector is implicitly shared */ void QwtPlotBarChart::setSamples( const QVector &samples ) { QVector points; for ( int i = 0; i < samples.size(); i++ ) points += QPointF( i, samples[ i ] ); setData( new QwtPointSeriesData( points ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotBarChart::setSamples( QwtSeriesData *data ) { setData( data ); } /*! \brief Assign a symbol The bar chart will take the ownership of the symbol, hence the previously set symbol will be delete by setting a new one. If \p symbol is \c NULL no symbol will be drawn. \param symbol Symbol \sa symbol() */ void QwtPlotBarChart::setSymbol( QwtColumnSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtColumnSymbol *QwtPlotBarChart::symbol() const { return d_data->symbol; } /*! Set the mode that decides what to display on the legend In case of LegendBarTitles barTitle() needs to be overloaded to return individual titles for each bar. \param mode New mode \sa legendMode(), legendData(), barTitle(), QwtPlotItem::ItemAttribute */ void QwtPlotBarChart::setLegendMode( LegendMode mode ) { if ( mode != d_data->legendMode ) { d_data->legendMode = mode; legendChanged(); } } /*! \return Legend mode \sa setLegendMode() */ QwtPlotBarChart::LegendMode QwtPlotBarChart::legendMode() const { return d_data->legendMode; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotBarChart::boundingRect() const { const size_t numSamples = dataSize(); if ( numSamples == 0 ) return QwtPlotSeriesItem::boundingRect(); const double baseLine = baseline(); QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.bottom() < baseLine ) rect.setBottom( baseLine ); if ( rect.top() > baseLine ) rect.setTop( baseLine ); if ( rect.isValid() && ( orientation() == Qt::Horizontal ) ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw an interval of the bar chart \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawSymbols() */ void QwtPlotBarChart::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; const QRectF br = data()->boundingRect(); const QwtInterval interval( br.left(), br.right() ); painter->save(); for ( int i = from; i <= to; i++ ) { drawSample( painter, xMap, yMap, canvasRect, interval, i, sample( i ) ); } painter->restore(); } /*! Draw a sample \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param boundingInterval Bounding interval of sample values \param index Index of the sample \param sample Value of the sample \sa drawSeries() */ void QwtPlotBarChart::drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QPointF &sample ) const { QwtColumnRect barRect; if ( orientation() == Qt::Horizontal ) { const double barHeight = sampleWidth( yMap, canvasRect.height(), boundingInterval.width(), sample.y() ); const double x1 = xMap.transform( baseline() ); const double x2 = xMap.transform( sample.y() ); const double y = yMap.transform( sample.x() ); const double y1 = y - 0.5 * barHeight; const double y2 = y + 0.5 * barHeight; barRect.direction = ( x1 < x2 ) ? QwtColumnRect::LeftToRight : QwtColumnRect::RightToLeft; barRect.hInterval = QwtInterval( x1, x2 ).normalized(); barRect.vInterval = QwtInterval( y1, y2 ); } else { const double barWidth = sampleWidth( xMap, canvasRect.width(), boundingInterval.width(), sample.y() ); const double x = xMap.transform( sample.x() ); const double x1 = x - 0.5 * barWidth; const double x2 = x + 0.5 * barWidth; const double y1 = yMap.transform( baseline() ); const double y2 = yMap.transform( sample.y() ); barRect.direction = ( y1 < y2 ) ? QwtColumnRect::TopToBottom : QwtColumnRect::BottomToTop; barRect.hInterval = QwtInterval( x1, x2 ); barRect.vInterval = QwtInterval( y1, y2 ).normalized(); } drawBar( painter, index, sample, barRect ); } /*! Draw a bar \param painter Painter \param sampleIndex Index of the sample represented by the bar \param sample Value of the sample \param rect Bounding rectangle of the bar */ void QwtPlotBarChart::drawBar( QPainter *painter, int sampleIndex, const QPointF &sample, const QwtColumnRect &rect ) const { const QwtColumnSymbol *specialSym = specialSymbol( sampleIndex, sample ); const QwtColumnSymbol *sym = specialSym; if ( sym == NULL ) sym = d_data->symbol; if ( sym ) { sym->draw( painter, rect ); } else { // we build a temporary default symbol QwtColumnSymbol sym( QwtColumnSymbol::Box ); sym.setLineWidth( 1 ); sym.setFrameStyle( QwtColumnSymbol::Plain ); sym.draw( painter, rect ); } delete specialSym; } /*! Needs to be overloaded to return a non default symbol for a specific sample \param sampleIndex Index of the sample represented by the bar \param sample Value of the sample \return NULL, indicating to use the default symbol */ QwtColumnSymbol *QwtPlotBarChart::specialSymbol( int sampleIndex, const QPointF &sample ) const { Q_UNUSED( sampleIndex ); Q_UNUSED( sample ); return NULL; } /*! \brief Return the title of a bar In LegendBarTitles mode the title is displayed on the legend entry corresponding to a bar. The default implementation is a dummy, that is intended to be overloaded. \param sampleIndex Index of the bar \return An empty text \sa LegendBarTitles */ QwtText QwtPlotBarChart::barTitle( int sampleIndex ) const { Q_UNUSED( sampleIndex ); return QwtText(); } /*! \brief Return all information, that is needed to represent the item on the legend In case of LegendBarTitles an entry for each bar is returned, otherwise the chart is represented like any other plot item from its title() and the legendIcon(). \return Information, that is needed to represent the item on the legend \sa title(), setLegendMode(), barTitle(), QwtLegend, QwtPlotLegendItem */ QList QwtPlotBarChart::legendData() const { QList list; if ( d_data->legendMode == LegendBarTitles ) { const size_t numSamples = dataSize(); for ( size_t i = 0; i < numSamples; i++ ) { QwtLegendData data; QVariant titleValue; qVariantSetValue( titleValue, barTitle( i ) ); data.setValue( QwtLegendData::TitleRole, titleValue ); if ( !legendIconSize().isEmpty() ) { QVariant iconValue; qVariantSetValue( iconValue, legendIcon( i, legendIconSize() ) ); data.setValue( QwtLegendData::IconRole, iconValue ); } list += data; } } else { return QwtPlotAbstractBarChart::legendData(); } return list; } /*! \return Icon representing a bar or the chart on the legend When the legendMode() is LegendBarTitles the icon shows the bar corresponding to index - otherwise the bar displays the default symbol. \param index Index of the legend entry \param size Icon size \sa setLegendMode(), drawBar(), QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotBarChart::legendIcon( int index, const QSizeF &size ) const { QwtColumnRect column; column.hInterval = QwtInterval( 0.0, size.width() - 1.0 ); column.vInterval = QwtInterval( 0.0, size.height() - 1.0 ); QwtGraphic icon; icon.setDefaultSize( size ); icon.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); int barIndex = -1; if ( d_data->legendMode == QwtPlotBarChart::LegendBarTitles ) barIndex = index; drawBar( &painter, barIndex, QPointF(), column ); return icon; } qsstv_9.2.6/qwt/qwt_plot_barchart.h0000664000175000017500000000674613203343610016145 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_BAR_CHART_H #define QWT_PLOT_BAR_CHART_H #include "qwt_global.h" #include "qwt_plot_abstract_barchart.h" #include "qwt_series_data.h" class QwtColumnRect; class QwtColumnSymbol; /*! \brief QwtPlotBarChart displays a series of a values as bars. Each bar might be customized individually by implementing a specialSymbol(). Otherwise it is rendered using a default symbol. Depending on its orientation() the bars are displayed horizontally or vertically. The bars cover the interval between the baseline() and the value. By activating the LegendBarTitles mode each sample will have its own entry on the legend. The most common use case of a bar chart is to display a list of y coordinates, where the x coordinate is simply the index in the list. But for other situations ( f.e. when values are related to dates ) it is also possible to set x coordinates explicitly. \sa QwtPlotMultiBarChart, QwtPlotHistogram, QwtPlotCurve::Sticks, QwtPlotSeriesItem::orientation(), QwtPlotAbstractBarChart::baseline() */ class QWT_EXPORT QwtPlotBarChart: public QwtPlotAbstractBarChart, public QwtSeriesStore { public: /*! \brief Legend modes. The default setting is QwtPlotBarChart::LegendChartTitle. \sa setLegendMode(), legendMode() */ enum LegendMode { /*! One entry on the legend showing the default symbol and the title() of the chart \sa QwtPlotItem::title() */ LegendChartTitle, /*! One entry for each value showing the individual symbol of the corresponding bar and the bar title. \sa specialSymbol(), barTitle() */ LegendBarTitles }; explicit QwtPlotBarChart( const QString &title = QString::null ); explicit QwtPlotBarChart( const QwtText &title ); virtual ~QwtPlotBarChart(); virtual int rtti() const; void setSamples( const QVector & ); void setSamples( const QVector & ); void setSamples( QwtSeriesData *series ); void setSymbol( QwtColumnSymbol * ); const QwtColumnSymbol *symbol() const; void setLegendMode( LegendMode ); LegendMode legendMode() const; virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtColumnSymbol *specialSymbol( int sampleIndex, const QPointF& ) const; virtual QwtText barTitle( int sampleIndex ) const; protected: virtual void drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QPointF& sample ) const; virtual void drawBar( QPainter *, int sampleIndex, const QPointF& point, const QwtColumnRect & ) const; QList legendData() const; QwtGraphic legendIcon( int index, const QSizeF & ) const; private: void init(); class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_canvas.cpp0000664000175000017500000006745113203343610016165 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_canvas.h" #include "qwt_painter.h" #include "qwt_null_paintdevice.h" #include "qwt_math.h" #include "qwt_plot.h" #include #include #include #include #include class QwtStyleSheetRecorder: public QwtNullPaintDevice { public: QwtStyleSheetRecorder( const QSize &size ): d_size( size ) { } virtual void updateState( const QPaintEngineState &state ) { if ( state.state() & QPaintEngine::DirtyPen ) { d_pen = state.pen(); } if ( state.state() & QPaintEngine::DirtyBrush ) { d_brush = state.brush(); } if ( state.state() & QPaintEngine::DirtyBrushOrigin ) { d_origin = state.brushOrigin(); } } virtual void drawRects(const QRectF *rects, int count ) { for ( int i = 0; i < count; i++ ) border.rectList += rects[i]; } virtual void drawPath( const QPainterPath &path ) { const QRectF rect( QPointF( 0.0, 0.0 ), d_size ); if ( path.controlPointRect().contains( rect.center() ) ) { setCornerRects( path ); alignCornerRects( rect ); background.path = path; background.brush = d_brush; background.origin = d_origin; } else { border.pathList += path; } } void setCornerRects( const QPainterPath &path ) { QPointF pos( 0.0, 0.0 ); for ( int i = 0; i < path.elementCount(); i++ ) { QPainterPath::Element el = path.elementAt(i); switch( el.type ) { case QPainterPath::MoveToElement: case QPainterPath::LineToElement: { pos.setX( el.x ); pos.setY( el.y ); break; } case QPainterPath::CurveToElement: { QRectF r( pos, QPointF( el.x, el.y ) ); clipRects += r.normalized(); pos.setX( el.x ); pos.setY( el.y ); break; } case QPainterPath::CurveToDataElement: { if ( clipRects.size() > 0 ) { QRectF r = clipRects.last(); r.setCoords( qMin( r.left(), el.x ), qMin( r.top(), el.y ), qMax( r.right(), el.x ), qMax( r.bottom(), el.y ) ); clipRects.last() = r.normalized(); } break; } } } } protected: virtual QSize sizeMetrics() const { return d_size; } private: void alignCornerRects( const QRectF &rect ) { for ( int i = 0; i < clipRects.size(); i++ ) { QRectF &r = clipRects[i]; if ( r.center().x() < rect.center().x() ) r.setLeft( rect.left() ); else r.setRight( rect.right() ); if ( r.center().y() < rect.center().y() ) r.setTop( rect.top() ); else r.setBottom( rect.bottom() ); } } public: QVector clipRects; struct Border { QList pathList; QList rectList; QRegion clipRegion; } border; struct Background { QPainterPath path; QBrush brush; QPointF origin; } background; private: const QSize d_size; QPen d_pen; QBrush d_brush; QPointF d_origin; }; static void qwtDrawBackground( QPainter *painter, QwtPlotCanvas *canvas ) { painter->save(); const QPainterPath borderClip = canvas->borderPath( canvas->rect() ); if ( !borderClip.isEmpty() ) painter->setClipPath( borderClip, Qt::IntersectClip ); const QBrush &brush = canvas->palette().brush( canvas->backgroundRole() ); if ( brush.style() == Qt::TexturePattern ) { QPixmap pm( canvas->size() ); QwtPainter::fillPixmap( canvas, pm ); painter->drawPixmap( 0, 0, pm ); } else if ( brush.gradient() ) { QVector rects; if ( brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode ) { rects += canvas->rect(); } else { rects = painter->clipRegion().rects(); } #if 1 bool useRaster = false; if ( painter->paintEngine()->type() == QPaintEngine::X11 ) { // Qt 4.7.1: gradients on X11 are broken ( subrects + // QGradient::StretchToDeviceMode ) and horrible slow. // As workaround we have to use the raster paintengine. // Even if the QImage -> QPixmap translation is slow // it is three times faster, than using X11 directly useRaster = true; } #endif if ( useRaster ) { QImage::Format format = QImage::Format_RGB32; const QGradientStops stops = brush.gradient()->stops(); for ( int i = 0; i < stops.size(); i++ ) { if ( stops[i].second.alpha() != 255 ) { // don't use Format_ARGB32_Premultiplied. It's // recommended by the Qt docs, but QPainter::drawImage() // is horrible slow on X11. format = QImage::Format_ARGB32; break; } } QImage image( canvas->size(), format ); QPainter p( &image ); p.setPen( Qt::NoPen ); p.setBrush( brush ); p.drawRects( rects ); p.end(); painter->drawImage( 0, 0, image ); } else { painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawRects( rects ); } } else { painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawRects( painter->clipRegion().rects() ); } painter->restore(); } static inline void qwtRevertPath( QPainterPath &path ) { if ( path.elementCount() == 4 ) { QPainterPath::Element el0 = path.elementAt(0); QPainterPath::Element el3 = path.elementAt(3); path.setElementPositionAt( 0, el3.x, el3.y ); path.setElementPositionAt( 3, el0.x, el0.y ); } } static QPainterPath qwtCombinePathList( const QRectF &rect, const QList &pathList ) { if ( pathList.isEmpty() ) return QPainterPath(); QPainterPath ordered[8]; // starting top left for ( int i = 0; i < pathList.size(); i++ ) { int index = -1; QPainterPath subPath = pathList[i]; const QRectF br = pathList[i].controlPointRect(); if ( br.center().x() < rect.center().x() ) { if ( br.center().y() < rect.center().y() ) { if ( qAbs( br.top() - rect.top() ) < qAbs( br.left() - rect.left() ) ) { index = 1; } else { index = 0; } } else { if ( qAbs( br.bottom() - rect.bottom() ) < qAbs( br.left() - rect.left() ) ) { index = 6; } else { index = 7; } } if ( subPath.currentPosition().y() > br.center().y() ) qwtRevertPath( subPath ); } else { if ( br.center().y() < rect.center().y() ) { if ( qAbs( br.top() - rect.top() ) < qAbs( br.right() - rect.right() ) ) { index = 2; } else { index = 3; } } else { if ( qAbs( br.bottom() - rect.bottom() ) < qAbs( br.right() - rect.right() ) ) { index = 5; } else { index = 4; } } if ( subPath.currentPosition().y() < br.center().y() ) qwtRevertPath( subPath ); } ordered[index] = subPath; } for ( int i = 0; i < 4; i++ ) { if ( ordered[ 2 * i].isEmpty() != ordered[2 * i + 1].isEmpty() ) { // we don't accept incomplete rounded borders return QPainterPath(); } } const QPolygonF corners( rect ); QPainterPath path; //path.moveTo( rect.topLeft() ); for ( int i = 0; i < 4; i++ ) { if ( ordered[2 * i].isEmpty() ) { path.lineTo( corners[i] ); } else { path.connectPath( ordered[2 * i] ); path.connectPath( ordered[2 * i + 1] ); } } path.closeSubpath(); #if 0 return path.simplified(); #else return path; #endif } static inline void qwtDrawStyledBackground( QWidget *w, QPainter *painter ) { QStyleOption opt; opt.initFrom(w); w->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, w); } static QWidget *qwtBackgroundWidget( QWidget *w ) { if ( w->parentWidget() == NULL ) return w; if ( w->autoFillBackground() ) { const QBrush brush = w->palette().brush( w->backgroundRole() ); if ( brush.color().alpha() > 0 ) return w; } if ( w->testAttribute( Qt::WA_StyledBackground ) ) { QImage image( 1, 1, QImage::Format_ARGB32 ); image.fill( Qt::transparent ); QPainter painter( &image ); painter.translate( -w->rect().center() ); qwtDrawStyledBackground( w, &painter ); painter.end(); if ( qAlpha( image.pixel( 0, 0 ) ) != 0 ) return w; } return qwtBackgroundWidget( w->parentWidget() ); } static void qwtFillBackground( QPainter *painter, QWidget *widget, const QVector &fillRects ) { if ( fillRects.isEmpty() ) return; QRegion clipRegion; if ( painter->hasClipping() ) clipRegion = painter->transform().map( painter->clipRegion() ); else clipRegion = widget->contentsRect(); // Try to find out which widget fills // the unfilled areas of the styled background QWidget *bgWidget = qwtBackgroundWidget( widget->parentWidget() ); for ( int i = 0; i < fillRects.size(); i++ ) { const QRect rect = fillRects[i].toAlignedRect(); if ( clipRegion.intersects( rect ) ) { QPixmap pm( rect.size() ); QwtPainter::fillPixmap( bgWidget, pm, widget->mapTo( bgWidget, rect.topLeft() ) ); painter->drawPixmap( rect, pm ); } } } static void qwtFillBackground( QPainter *painter, QwtPlotCanvas *canvas ) { QVector rects; if ( canvas->testAttribute( Qt::WA_StyledBackground ) ) { QwtStyleSheetRecorder recorder( canvas->size() ); QPainter p( &recorder ); qwtDrawStyledBackground( canvas, &p ); p.end(); if ( recorder.background.brush.isOpaque() ) rects = recorder.clipRects; else rects += canvas->rect(); } else { const QRectF r = canvas->rect(); const double radius = canvas->borderRadius(); if ( radius > 0.0 ) { QSizeF sz( radius, radius ); rects += QRectF( r.topLeft(), sz ); rects += QRectF( r.topRight() - QPointF( radius, 0 ), sz ); rects += QRectF( r.bottomRight() - QPointF( radius, radius ), sz ); rects += QRectF( r.bottomLeft() - QPointF( 0, radius ), sz ); } } qwtFillBackground( painter, canvas, rects); } class QwtPlotCanvas::PrivateData { public: PrivateData(): focusIndicator( NoFocusIndicator ), borderRadius( 0 ), paintAttributes( 0 ), backingStore( NULL ) { styleSheet.hasBorder = false; } ~PrivateData() { delete backingStore; } FocusIndicator focusIndicator; double borderRadius; QwtPlotCanvas::PaintAttributes paintAttributes; QPixmap *backingStore; struct StyleSheet { bool hasBorder; QPainterPath borderPath; QVector cornerRects; struct StyleSheetBackground { QBrush brush; QPointF origin; } background; } styleSheet; }; /*! \brief Constructor \param plot Parent plot widget \sa QwtPlot::setCanvas() */ QwtPlotCanvas::QwtPlotCanvas( QwtPlot *plot ): QFrame( plot ) { setFrameStyle( QFrame::Panel | QFrame::Sunken ); setLineWidth( 2 ); d_data = new PrivateData; #ifndef QT_NO_CURSOR setCursor( Qt::CrossCursor ); #endif setAutoFillBackground( true ); setPaintAttribute( QwtPlotCanvas::BackingStore, true ); setPaintAttribute( QwtPlotCanvas::Opaque, true ); setPaintAttribute( QwtPlotCanvas::HackStyledBackground, true ); } //! Destructor QwtPlotCanvas::~QwtPlotCanvas() { delete d_data; } //! Return parent plot widget QwtPlot *QwtPlotCanvas::plot() { return qobject_cast( parent() ); } //! Return parent plot widget const QwtPlot *QwtPlotCanvas::plot() const { return qobject_cast( parent() ); } /*! \brief Changing the paint attributes \param attribute Paint attribute \param on On/Off \sa testPaintAttribute(), backingStore() */ void QwtPlotCanvas::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( bool( d_data->paintAttributes & attribute ) == on ) return; if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; switch ( attribute ) { case BackingStore: { if ( on ) { if ( d_data->backingStore == NULL ) d_data->backingStore = new QPixmap(); if ( isVisible() ) { #if QT_VERSION >= 0x050000 *d_data->backingStore = grab( rect() ); #else *d_data->backingStore = QPixmap::grabWidget( this, rect() ); #endif } } else { delete d_data->backingStore; d_data->backingStore = NULL; } break; } case Opaque: { if ( on ) setAttribute( Qt::WA_OpaquePaintEvent, true ); break; } case HackStyledBackground: case ImmediatePaint: { break; } } } /*! Test whether a paint attribute is enabled \param attribute Paint attribute \return true, when attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCanvas::testPaintAttribute( PaintAttribute attribute ) const { return d_data->paintAttributes & attribute; } //! \return Backing store, might be null const QPixmap *QwtPlotCanvas::backingStore() const { return d_data->backingStore; } //! Invalidate the internal backing store void QwtPlotCanvas::invalidateBackingStore() { if ( d_data->backingStore ) *d_data->backingStore = QPixmap(); } /*! Set the focus indicator \sa FocusIndicator, focusIndicator() */ void QwtPlotCanvas::setFocusIndicator( FocusIndicator focusIndicator ) { d_data->focusIndicator = focusIndicator; } /*! \return Focus indicator \sa FocusIndicator, setFocusIndicator() */ QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator() const { return d_data->focusIndicator; } /*! Set the radius for the corners of the border frame \param radius Radius of a rounded corner \sa borderRadius() */ void QwtPlotCanvas::setBorderRadius( double radius ) { d_data->borderRadius = qMax( 0.0, radius ); } /*! \return Radius for the corners of the border frame \sa setBorderRadius() */ double QwtPlotCanvas::borderRadius() const { return d_data->borderRadius; } /*! Qt event handler for QEvent::PolishRequest and QEvent::StyleChange \param event Qt Event \return See QFrame::event() */ bool QwtPlotCanvas::event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { if ( testPaintAttribute( QwtPlotCanvas::Opaque ) ) { // Setting a style sheet changes the // Qt::WA_OpaquePaintEvent attribute, but we insist // on painting the background. setAttribute( Qt::WA_OpaquePaintEvent, true ); } } if ( event->type() == QEvent::PolishRequest || event->type() == QEvent::StyleChange ) { updateStyleSheetInfo(); } return QFrame::event( event ); } /*! Paint event \param event Paint event */ void QwtPlotCanvas::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); if ( testPaintAttribute( QwtPlotCanvas::BackingStore ) && d_data->backingStore != NULL ) { QPixmap &bs = *d_data->backingStore; if ( bs.size() != size() ) { bs = QwtPainter::backingStore( this, size() ); if ( testAttribute(Qt::WA_StyledBackground) ) { QPainter p( &bs ); qwtFillBackground( &p, this ); drawCanvas( &p, true ); } else { QPainter p; if ( d_data->borderRadius <= 0.0 ) { QwtPainter::fillPixmap( this, bs ); p.begin( &bs ); drawCanvas( &p, false ); } else { p.begin( &bs ); qwtFillBackground( &p, this ); drawCanvas( &p, true ); } if ( frameWidth() > 0 ) drawBorder( &p ); } } painter.drawPixmap( 0, 0, *d_data->backingStore ); } else { if ( testAttribute(Qt::WA_StyledBackground ) ) { if ( testAttribute( Qt::WA_OpaquePaintEvent ) ) { qwtFillBackground( &painter, this ); drawCanvas( &painter, true ); } else { drawCanvas( &painter, false ); } } else { if ( testAttribute( Qt::WA_OpaquePaintEvent ) ) { if ( autoFillBackground() ) { qwtFillBackground( &painter, this ); qwtDrawBackground( &painter, this ); } } else { if ( borderRadius() > 0.0 ) { QPainterPath clipPath; clipPath.addRect( rect() ); clipPath = clipPath.subtracted( borderPath( rect() ) ); painter.save(); painter.setClipPath( clipPath, Qt::IntersectClip ); qwtFillBackground( &painter, this ); qwtDrawBackground( &painter, this ); painter.restore(); } } drawCanvas( &painter, false ); if ( frameWidth() > 0 ) drawBorder( &painter ); } } if ( hasFocus() && focusIndicator() == CanvasFocusIndicator ) drawFocusIndicator( &painter ); } void QwtPlotCanvas::drawCanvas( QPainter *painter, bool withBackground ) { bool hackStyledBackground = false; if ( withBackground && testAttribute( Qt::WA_StyledBackground ) && testPaintAttribute( HackStyledBackground ) ) { // Antialiasing rounded borders is done by // inserting pixels with colors between the // border color and the color on the canvas, // When the border is painted before the plot items // these colors are interpolated for the canvas // and the plot items need to be clipped excluding // the anialiased pixels. In situations, where // the plot items fill the area at the rounded // borders this is noticeable. // The only way to avoid these annoying "artefacts" // is to paint the border on top of the plot items. if ( d_data->styleSheet.hasBorder && !d_data->styleSheet.borderPath.isEmpty() ) { // We have a border with at least one rounded corner hackStyledBackground = true; } } if ( withBackground ) { painter->save(); if ( testAttribute( Qt::WA_StyledBackground ) ) { if ( hackStyledBackground ) { // paint background without border painter->setPen( Qt::NoPen ); painter->setBrush( d_data->styleSheet.background.brush ); painter->setBrushOrigin( d_data->styleSheet.background.origin ); painter->setClipPath( d_data->styleSheet.borderPath ); painter->drawRect( contentsRect() ); } else { qwtDrawStyledBackground( this, painter ); } } else if ( autoFillBackground() ) { painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( backgroundRole() ) ); if ( d_data->borderRadius > 0.0 && ( rect() == frameRect() ) ) { if ( frameWidth() > 0 ) { painter->setClipPath( borderPath( rect() ) ); painter->drawRect( rect() ); } else { painter->setRenderHint( QPainter::Antialiasing, true ); painter->drawPath( borderPath( rect() ) ); } } else { painter->drawRect( rect() ); } } painter->restore(); } painter->save(); if ( !d_data->styleSheet.borderPath.isEmpty() ) { painter->setClipPath( d_data->styleSheet.borderPath, Qt::IntersectClip ); } else { if ( d_data->borderRadius > 0.0 ) painter->setClipPath( borderPath( frameRect() ), Qt::IntersectClip ); else painter->setClipRect( contentsRect(), Qt::IntersectClip ); } plot()->drawCanvas( painter ); painter->restore(); if ( withBackground && hackStyledBackground ) { // Now paint the border on top QStyleOptionFrame opt; opt.initFrom(this); style()->drawPrimitive( QStyle::PE_Frame, &opt, painter, this); } } /*! Draw the border of the plot canvas \param painter Painter \sa setBorderRadius() */ void QwtPlotCanvas::drawBorder( QPainter *painter ) { if ( d_data->borderRadius > 0 ) { if ( frameWidth() > 0 ) { QwtPainter::drawRoundedFrame( painter, QRectF( frameRect() ), d_data->borderRadius, d_data->borderRadius, palette(), frameWidth(), frameStyle() ); } } else { #if QT_VERSION >= 0x040500 QStyleOptionFrameV3 opt; opt.init(this); int frameShape = frameStyle() & QFrame::Shape_Mask; int frameShadow = frameStyle() & QFrame::Shadow_Mask; opt.frameShape = QFrame::Shape( int( opt.frameShape ) | frameShape ); #if 0 opt.rect = frameRect(); #endif switch (frameShape) { case QFrame::Box: case QFrame::HLine: case QFrame::VLine: case QFrame::StyledPanel: case QFrame::Panel: { opt.lineWidth = lineWidth(); opt.midLineWidth = midLineWidth(); break; } default: { opt.lineWidth = frameWidth(); break; } } if ( frameShadow == Sunken ) opt.state |= QStyle::State_Sunken; else if ( frameShadow == Raised ) opt.state |= QStyle::State_Raised; style()->drawControl(QStyle::CE_ShapedFrame, &opt, painter, this); #else drawFrame( painter ); #endif } } /*! Resize event \param event Resize event */ void QwtPlotCanvas::resizeEvent( QResizeEvent *event ) { QFrame::resizeEvent( event ); updateStyleSheetInfo(); } /*! Draw the focus indication \param painter Painter */ void QwtPlotCanvas::drawFocusIndicator( QPainter *painter ) { const int margin = 1; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QwtPainter::drawFocusRect( painter, this, focusRect ); } /*! Invalidate the paint cache and repaint the canvas \sa invalidatePaintCache() */ void QwtPlotCanvas::replot() { invalidateBackingStore(); if ( testPaintAttribute( QwtPlotCanvas::ImmediatePaint ) ) repaint( contentsRect() ); else update( contentsRect() ); } //! Update the cached information about the current style sheet void QwtPlotCanvas::updateStyleSheetInfo() { if ( !testAttribute(Qt::WA_StyledBackground ) ) return; QwtStyleSheetRecorder recorder( size() ); QPainter painter( &recorder ); QStyleOption opt; opt.initFrom(this); style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this); painter.end(); d_data->styleSheet.hasBorder = !recorder.border.rectList.isEmpty(); d_data->styleSheet.cornerRects = recorder.clipRects; if ( recorder.background.path.isEmpty() ) { if ( !recorder.border.rectList.isEmpty() ) { d_data->styleSheet.borderPath = qwtCombinePathList( rect(), recorder.border.pathList ); } } else { d_data->styleSheet.borderPath = recorder.background.path; d_data->styleSheet.background.brush = recorder.background.brush; d_data->styleSheet.background.origin = recorder.background.origin; } } /*! Calculate the painter path for a styled or rounded border When the canvas has no styled background or rounded borders the painter path is empty. \param rect Bounding rectangle of the canvas \return Painter path, that can be used for clipping */ QPainterPath QwtPlotCanvas::borderPath( const QRect &rect ) const { if ( testAttribute(Qt::WA_StyledBackground ) ) { QwtStyleSheetRecorder recorder( rect.size() ); QPainter painter( &recorder ); QStyleOption opt; opt.initFrom(this); opt.rect = rect; style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this); painter.end(); if ( !recorder.background.path.isEmpty() ) return recorder.background.path; if ( !recorder.border.rectList.isEmpty() ) return qwtCombinePathList( rect, recorder.border.pathList ); } else if ( d_data->borderRadius > 0.0 ) { double fw2 = frameWidth() * 0.5; QRectF r = QRectF(rect).adjusted( fw2, fw2, -fw2, -fw2 ); QPainterPath path; path.addRoundedRect( r, d_data->borderRadius, d_data->borderRadius ); return path; } return QPainterPath(); } qsstv_9.2.6/qwt/qwt_plot_canvas.h0000664000175000017500000001153013203343610015615 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CANVAS_H #define QWT_PLOT_CANVAS_H #include "qwt_global.h" #include #include class QwtPlot; class QPixmap; /*! \brief Canvas of a QwtPlot. Canvas is the widget where all plot items are displayed \sa QwtPlot::setCanvas(), QwtPlotGLCanvas */ class QWT_EXPORT QwtPlotCanvas : public QFrame { Q_OBJECT Q_PROPERTY( double borderRadius READ borderRadius WRITE setBorderRadius ) public: /*! \brief Paint attributes The default setting enables BackingStore and Opaque. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! \brief Paint double buffered reusing the content of the pixmap buffer when possible. Using a backing store might improve the performance significantly, when working with widget overlays ( like rubber bands ). Disabling the cache might improve the performance for incremental paints (using QwtPlotDirectPainter ). \sa backingStore(), invalidateBackingStore() */ BackingStore = 1, /*! \brief Try to fill the complete contents rectangle of the plot canvas When using styled backgrounds Qt assumes, that the canvas doesn't fill its area completely ( f.e because of rounded borders ) and fills the area below the canvas. When this is done with gradients it might result in a serious performance bottleneck - depending on the size. When the Opaque attribute is enabled the canvas tries to identify the gaps with some heuristics and to fill those only. \warning Will not work for semitransparent backgrounds */ Opaque = 2, /*! \brief Try to improve painting of styled backgrounds QwtPlotCanvas supports the box model attributes for customizing the layout with style sheets. Unfortunately the design of Qt style sheets has no concept how to handle backgrounds with rounded corners - beside of padding. When HackStyledBackground is enabled the plot canvas tries to separate the background from the background border by reverse engineering to paint the background before and the border after the plot items. In this order the border gets perfectly antialiased and you can avoid some pixel artifacts in the corners. */ HackStyledBackground = 4, /*! When ImmediatePaint is set replot() calls repaint() instead of update(). \sa replot(), QWidget::repaint(), QWidget::update() */ ImmediatePaint = 8 }; //! Paint attributes typedef QFlags PaintAttributes; /*! \brief Focus indicator The default setting is NoFocusIndicator \sa setFocusIndicator(), focusIndicator(), paintFocus() */ enum FocusIndicator { //! Don't paint a focus indicator NoFocusIndicator, /*! The focus is related to the complete canvas. Paint the focus indicator using paintFocus() */ CanvasFocusIndicator, /*! The focus is related to an item (curve, point, ...) on the canvas. It is up to the application to display a focus indication using f.e. highlighting. */ ItemFocusIndicator }; explicit QwtPlotCanvas( QwtPlot * = NULL ); virtual ~QwtPlotCanvas(); QwtPlot *plot(); const QwtPlot *plot() const; void setFocusIndicator( FocusIndicator ); FocusIndicator focusIndicator() const; void setBorderRadius( double ); double borderRadius() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; const QPixmap *backingStore() const; void invalidateBackingStore(); virtual bool event( QEvent * ); Q_INVOKABLE QPainterPath borderPath( const QRect & ) const; public Q_SLOTS: void replot(); protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void drawFocusIndicator( QPainter * ); virtual void drawBorder( QPainter * ); void updateStyleSheetInfo(); private: void drawCanvas( QPainter *, bool withBackground ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCanvas::PaintAttributes ) #endif qsstv_9.2.6/qwt/qwt_plot_curve.cpp0000664000175000017500000007360013203343610016027 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_curve.h" #include "qwt_point_data.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include "qwt_plot.h" #include "qwt_curve_fitter.h" #include "qwt_symbol.h" #include "qwt_point_mapper.h" #include #include #include #include static void qwtUpdateLegendIconSize( QwtPlotCurve *curve ) { if ( curve->symbol() && curve->testLegendAttribute( QwtPlotCurve::LegendShowSymbol ) ) { QSize sz = curve->symbol()->boundingRect().size(); sz += QSize( 2, 2 ); // margin if ( curve->testLegendAttribute( QwtPlotCurve::LegendShowLine ) ) { // Avoid, that the line is completely covered by the symbol int w = qCeil( 1.5 * sz.width() ); if ( w % 2 ) w++; sz.setWidth( qMax( 8, w ) ); } curve->setLegendIconSize( sz ); } } static int qwtVerifyRange( int size, int &i1, int &i2 ) { if ( size < 1 ) return 0; i1 = qBound( 0, i1, size - 1 ); i2 = qBound( 0, i2, size - 1 ); if ( i1 > i2 ) qSwap( i1, i2 ); return ( i2 - i1 + 1 ); } class QwtPlotCurve::PrivateData { public: PrivateData(): style( QwtPlotCurve::Lines ), baseline( 0.0 ), symbol( NULL ), attributes( 0 ), paintAttributes( QwtPlotCurve::ClipPolygons | QwtPlotCurve::FilterPoints ), legendAttributes( 0 ) { pen = QPen( Qt::black ); curveFitter = new QwtSplineCurveFitter; } ~PrivateData() { delete symbol; delete curveFitter; } QwtPlotCurve::CurveStyle style; double baseline; const QwtSymbol *symbol; QwtCurveFitter *curveFitter; QPen pen; QBrush brush; QwtPlotCurve::CurveAttributes attributes; QwtPlotCurve::PaintAttributes paintAttributes; QwtPlotCurve::LegendAttributes legendAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotCurve::~QwtPlotCurve() { delete d_data; } //! Initialize internal members void QwtPlotCurve::init() { setItemAttribute( QwtPlotItem::Legend ); setItemAttribute( QwtPlotItem::AutoScale ); d_data = new PrivateData; setData( new QwtPointSeriesData() ); setZ( 20.0 ); } //! \return QwtPlotItem::Rtti_PlotCurve int QwtPlotCurve::rtti() const { return QwtPlotItem::Rtti_PlotCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Specify an attribute how to draw the legend icon \param attribute Attribute \param on On/Off /sa testLegendAttribute(). legendIcon() */ void QwtPlotCurve::setLegendAttribute( LegendAttribute attribute, bool on ) { if ( on != testLegendAttribute( attribute ) ) { if ( on ) d_data->legendAttributes |= attribute; else d_data->legendAttributes &= ~attribute; qwtUpdateLegendIconSize( this ); legendChanged(); } } /*! \return True, when attribute is enabled \sa setLegendAttribute() */ bool QwtPlotCurve::testLegendAttribute( LegendAttribute attribute ) const { return ( d_data->legendAttributes & attribute ); } /*! Set the curve's drawing style \param style Curve style \sa style() */ void QwtPlotCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the curve \sa setStyle() */ QwtPlotCurve::CurveStyle QwtPlotCurve::style() const { return d_data->style; } /*! \brief Assign a symbol The curve will take the ownership of the symbol, hence the previously set symbol will be delete by setting a new one. If \p symbol is \c NULL no symbol will be drawn. \param symbol Symbol \sa symbol() */ void QwtPlotCurve::setSymbol( QwtSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; qwtUpdateLegendIconSize( this ); legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtSymbol *QwtPlotCurve::symbol() const { return d_data->symbol; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotCurve::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotCurve::pen() const { return d_data->pen; } /*! \brief Assign a brush. In case of brush.style() != QBrush::NoBrush and style() != QwtPlotCurve::Sticks the area between the curve and the baseline will be filled. In case !brush.color().isValid() the area will be filled by pen.color(). The fill algorithm simply connects the first and the last curve point to the baseline. So the curve data has to be sorted (ascending or descending). \param brush New brush \sa brush(), setBaseline(), baseline() */ void QwtPlotCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used to fill the area between lines and the baseline \sa setBrush(), setBaseline(), baseline() */ const QBrush& QwtPlotCurve::brush() const { return d_data->brush; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawCurve(), drawSymbols(), */ void QwtPlotCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const size_t numSamples = dataSize(); if ( !painter || numSamples <= 0 ) return; if ( to < 0 ) to = numSamples - 1; if ( qwtVerifyRange( numSamples, from, to ) > 0 ) { painter->save(); painter->setPen( d_data->pen ); /* Qt 4.0.0 is slow when drawing lines, but it's even slower when the painter has a brush. So we don't set the brush before we really need it. */ drawCurve( painter, d_data->style, xMap, yMap, canvasRect, from, to ); painter->restore(); if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { painter->save(); drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); painter->restore(); } } } /*! \brief Draw the line part (without symbols) of a curve interval. \param painter Painter \param style curve style, see QwtPlotCurve::CurveStyle \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawDots(), drawLines(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawCurve( QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { switch ( style ) { case Lines: if ( testCurveAttribute( Fitted ) ) { // we always need the complete // curve for fitting from = 0; to = dataSize() - 1; } drawLines( painter, xMap, yMap, canvasRect, from, to ); break; case Sticks: drawSticks( painter, xMap, yMap, canvasRect, from, to ); break; case Steps: drawSteps( painter, xMap, yMap, canvasRect, from, to ); break; case Dots: drawDots( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } } /*! \brief Draw lines If the CurveAttribute Fitted is enabled a QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa setCurveAttribute(), setCurveFitter(), draw(), drawLines(), drawDots(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( from > to ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); const bool doFit = ( d_data->attributes & Fitted ) && d_data->curveFitter; const bool doFill = ( d_data->brush.style() != Qt::NoBrush ) && ( d_data->brush.color().alpha() > 0 ); QRectF clipRect; if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF()); clipRect = canvasRect.adjusted(-pw, -pw, pw, pw); } bool doIntegers = false; #if QT_VERSION < 0x040800 // For Qt <= 4.7 the raster paint engine is significantly faster // for rendering QPolygon than for QPolygonF. So let's // see if we can use it. if ( painter->paintEngine()->type() == QPaintEngine::Raster ) { // In case of filling or fitting performance doesn't count // because both operations are much more expensive // then drawing the polyline itself if ( !doFit && !doFill ) doIntegers = true; } #endif const bool noDuplicates = d_data->paintAttributes & FilterPoints; QwtPointMapper mapper; mapper.setFlag( QwtPointMapper::RoundPoints, doAlign ); mapper.setFlag( QwtPointMapper::WeedOutPoints, noDuplicates ); mapper.setBoundingRect( canvasRect ); if ( doIntegers ) { const QPolygon polyline = mapper.toPolygon( xMap, yMap, data(), from, to ); if ( d_data->paintAttributes & ClipPolygons ) { const QPolygon clipped = QwtClipper::clipPolygon( clipRect.toAlignedRect(), polyline, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polyline ); } } else { QPolygonF polyline = mapper.toPolygonF( xMap, yMap, data(), from, to ); if ( doFit ) polyline = d_data->curveFitter->fitCurve( polyline ); if ( d_data->paintAttributes & ClipPolygons ) { const QPolygonF clipped = QwtClipper::clipPolygonF( clipRect, polyline, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polyline ); } if ( doFill ) { fillCurve( painter, xMap, yMap, canvasRect, polyline ); } } } /*! Draw sticks \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawDots(), drawLines(), drawSteps() */ void QwtPlotCurve::drawSticks( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { painter->save(); painter->setRenderHint( QPainter::Antialiasing, false ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double x0 = xMap.transform( d_data->baseline ); double y0 = yMap.transform( d_data->baseline ); if ( doAlign ) { x0 = qRound( x0 ); y0 = qRound( y0 ); } const Qt::Orientation o = orientation(); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( o == Qt::Horizontal ) QwtPainter::drawLine( painter, x0, yi, xi, yi ); else QwtPainter::drawLine( painter, xi, y0, xi, yi ); } painter->restore(); } /*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const QColor color = painter->pen().color(); if ( painter->pen().style() == Qt::NoPen || color.alpha() == 0 ) { return; } const bool doFill = ( d_data->brush.style() != Qt::NoBrush ) && ( d_data->brush.color().alpha() > 0 ); const bool doAlign = QwtPainter::roundingAlignment( painter ); QwtPointMapper mapper; mapper.setBoundingRect( canvasRect ); mapper.setFlag( QwtPointMapper::RoundPoints, doAlign ); if ( d_data->paintAttributes & FilterPoints ) { if ( ( color.alpha() == 255 ) && !( painter->renderHints() & QPainter::Antialiasing ) ) { mapper.setFlag( QwtPointMapper::WeedOutPoints, true ); } } if ( doFill ) { mapper.setFlag( QwtPointMapper::WeedOutPoints, false ); QPolygonF points = mapper.toPointsF( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); fillCurve( painter, xMap, yMap, canvasRect, points ); } else if ( d_data->paintAttributes & ImageBuffer ) { const QImage image = mapper.toImage( xMap, yMap, data(), from, to, d_data->pen, painter->testRenderHint( QPainter::Antialiasing ), renderThreadCount() ); painter->drawImage( canvasRect.toAlignedRect(), image ); } else if ( d_data->paintAttributes & MinimizeMemory ) { const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } QwtPainter::drawPoint( painter, QPointF( xi, yi ) ); } } else { if ( doAlign ) { const QPolygon points = mapper.toPoints( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); } else { const QPolygonF points = mapper.toPointsF( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); } } } /*! Draw step function The direction of the steps depends on Inverted attribute. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa CurveAttribute, setCurveAttribute(), draw(), drawCurve(), drawDots(), drawLines(), drawSticks() */ void QwtPlotCurve::drawSteps( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polygon( 2 * ( to - from ) + 1 ); QPointF *points = polygon.data(); bool inverted = orientation() == Qt::Vertical; if ( d_data->attributes & Inverted ) inverted = !inverted; const QwtSeriesData *series = data(); int i, ip; for ( i = from, ip = 0; i <= to; i++, ip += 2 ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( ip > 0 ) { const QPointF &p0 = points[ip - 2]; QPointF &p = points[ip - 1]; if ( inverted ) { p.rx() = p0.x(); p.ry() = yi; } else { p.rx() = xi; p.ry() = p0.y(); } } points[ip].rx() = xi; points[ip].ry() = yi; } if ( d_data->paintAttributes & ClipPolygons ) { const QPolygonF clipped = QwtClipper::clipPolygonF( canvasRect, polygon, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polygon ); } if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, canvasRect, polygon ); } /*! Specify an attribute for drawing the curve \param attribute Curve attribute \param on On/Off /sa testCurveAttribute(), setCurveFitter() */ void QwtPlotCurve::setCurveAttribute( CurveAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) == on ) return; if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } /*! \return true, if attribute is enabled \sa setCurveAttribute() */ bool QwtPlotCurve::testCurveAttribute( CurveAttribute attribute ) const { return d_data->attributes & attribute; } /*! Assign a curve fitter The curve fitter "smooths" the curve points, when the Fitted CurveAttribute is set. setCurveFitter(NULL) also disables curve fitting. The curve fitter operates on the translated points ( = widget coordinates) to be functional for logarithmic scales. Obviously this is less performant for fitting algorithms, that reduce the number of points. For situations, where curve fitting is used to improve the performance of painting huge series of points it might be better to execute the fitter on the curve points once and to cache the result in the QwtSeriesData object. \param curveFitter() Curve fitter \sa Fitted */ void QwtPlotCurve::setCurveFitter( QwtCurveFitter *curveFitter ) { delete d_data->curveFitter; d_data->curveFitter = curveFitter; itemChanged(); } /*! Get the curve fitter. If curve fitting is disabled NULL is returned. \return Curve fitter \sa setCurveFitter(), Fitted */ QwtCurveFitter *QwtPlotCurve::curveFitter() const { return d_data->curveFitter; } /*! Fill the area between the curve and the baseline with the curve brush \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param polygon Polygon - will be modified ! \sa setBrush(), setBaseline(), setStyle() */ void QwtPlotCurve::fillCurve( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, QPolygonF &polygon ) const { if ( d_data->brush.style() == Qt::NoBrush ) return; closePolyline( painter, xMap, yMap, polygon ); if ( polygon.count() <= 2 ) // a line can't be filled return; QBrush brush = d_data->brush; if ( !brush.color().isValid() ) brush.setColor( d_data->pen.color() ); if ( d_data->paintAttributes & ClipPolygons ) polygon = QwtClipper::clipPolygonF( canvasRect, polygon, true ); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( brush ); QwtPainter::drawPolygon( painter, polygon ); painter->restore(); } /*! \brief Complete a polygon to be a closed polygon including the area between the original polygon and the baseline. \param painter Painter \param xMap X map \param yMap Y map \param polygon Polygon to be completed */ void QwtPlotCurve::closePolyline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( polygon.size() < 2 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); double baseline = d_data->baseline; if ( orientation() == Qt::Vertical ) { if ( yMap.transformation() ) baseline = yMap.transformation()->bounded( baseline ); double refY = yMap.transform( baseline ); if ( doAlign ) refY = qRound( refY ); polygon += QPointF( polygon.last().x(), refY ); polygon += QPointF( polygon.first().x(), refY ); } else { if ( xMap.transformation() ) baseline = xMap.transformation()->bounded( baseline ); double refX = xMap.transform( baseline ); if ( doAlign ) refX = qRound( refX ); polygon += QPointF( refX, polygon.last().y() ); polygon += QPointF( refX, polygon.first().y() ); } } /*! Draw symbols \param painter Painter \param symbol Curve symbol \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa setSymbol(), drawSeries(), drawCurve() */ void QwtPlotCurve::drawSymbols( QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { QwtPointMapper mapper; mapper.setFlag( QwtPointMapper::RoundPoints, QwtPainter::roundingAlignment( painter ) ); mapper.setFlag( QwtPointMapper::WeedOutPoints, testPaintAttribute( QwtPlotCurve::FilterPoints ) ); mapper.setBoundingRect( canvasRect ); const int chunkSize = 500; for ( int i = from; i <= to; i += chunkSize ) { const int n = qMin( chunkSize, to - i + 1 ); const QPolygonF points = mapper.toPointsF( xMap, yMap, data(), i, i + n - 1 ); if ( points.size() > 0 ) symbol.drawSymbols( painter, points ); } } /*! \brief Set the value of the baseline The baseline is needed for filling the curve with a brush or the Sticks drawing style. The interpretation of the baseline depends on the orientation(). With Qt::Horizontal, the baseline is interpreted as a horizontal line at y = baseline(), with Qt::Vertical, it is interpreted as a vertical line at x = baseline(). The default value is 0.0. \param value Value of the baseline \sa baseline(), setBrush(), setStyle(), QwtPlotAbstractSeriesItem::orientation() */ void QwtPlotCurve::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return Value of the baseline \sa setBaseline() */ double QwtPlotCurve::baseline() const { return d_data->baseline; } /*! Find the closest curve point for a specific position \param pos Position, where to look for the closest curve point \param dist If dist != NULL, closestPoint() returns the distance between the position and the closest curve point \return Index of the closest curve point, or -1 if none can be found ( f.e when the curve has no points ) \note closestPoint() implements a dumb algorithm, that iterates over all points */ int QwtPlotCurve::closestPoint( const QPoint &pos, double *dist ) const { const size_t numSamples = dataSize(); if ( plot() == NULL || numSamples <= 0 ) return -1; const QwtSeriesData *series = data(); const QwtScaleMap xMap = plot()->canvasMap( xAxis() ); const QwtScaleMap yMap = plot()->canvasMap( yAxis() ); int index = -1; double dmin = 1.0e10; for ( uint i = 0; i < numSamples; i++ ) { const QPointF sample = series->sample( i ); const double cx = xMap.transform( sample.x() ) - pos.x(); const double cy = yMap.transform( sample.y() ) - pos.y(); const double f = qwtSqr( cx ) + qwtSqr( cy ); if ( f < dmin ) { index = i; dmin = f; } } if ( dist ) *dist = qSqrt( dmin ); return index; } /*! \return Icon representing the curve on the legend \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); if ( size.isEmpty() ) return QwtGraphic(); QwtGraphic graphic; graphic.setDefaultSize( size ); graphic.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &graphic ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); if ( d_data->legendAttributes == 0 || d_data->legendAttributes & QwtPlotCurve::LegendShowBrush ) { QBrush brush = d_data->brush; if ( brush.style() == Qt::NoBrush && d_data->legendAttributes == 0 ) { if ( style() != QwtPlotCurve::NoCurve ) { brush = QBrush( pen().color() ); } else if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { brush = QBrush( d_data->symbol->pen().color() ); } } if ( brush.style() != Qt::NoBrush ) { QRectF r( 0, 0, size.width(), size.height() ); painter.fillRect( r, brush ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine ) { if ( pen() != Qt::NoPen ) { QPen pn = pen(); pn.setCapStyle( Qt::FlatCap ); painter.setPen( pn ); const double y = 0.5 * size.height(); QwtPainter::drawLine( &painter, 0.0, y, size.width(), y ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) { if ( d_data->symbol ) { QRectF r( 0, 0, size.width(), size.height() ); d_data->symbol->drawSymbol( &painter, r ); } } return graphic; } /*! Initialize data with an array of points. \param samples Vector of points \note QVector is implicitly shared \note QPolygonF is derived from QVector */ void QwtPlotCurve::setSamples( const QVector &samples ) { setData( new QwtPointSeriesData( samples ) ); } /*! Assign a series of points setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotCurve::setSamples( QwtSeriesData *data ) { setData( data ); } #ifndef QWT_NO_COMPAT /*! \brief Initialize the data by pointing to memory blocks which are not managed by QwtPlotCurve. setRawSamples is provided for efficiency. It is important to keep the pointers during the lifetime of the underlying QwtCPointerData class. \param xData pointer to x data \param yData pointer to y data \param size size of x and y \sa QwtCPointerData */ void QwtPlotCurve::setRawSamples( const double *xData, const double *yData, int size ) { setData( new QwtCPointerData( xData, yData, size ) ); } /*! Set data by copying x- and y-values from specified memory blocks. Contrary to setRawSamples(), this function makes a 'deep copy' of the data. \param xData pointer to x values \param yData pointer to y values \param size size of xData and yData \sa QwtPointArrayData */ void QwtPlotCurve::setSamples( const double *xData, const double *yData, int size ) { setData( new QwtPointArrayData( xData, yData, size ) ); } /*! \brief Initialize data with x- and y-arrays (explicitly shared) \param xData x data \param yData y data \sa QwtPointArrayData */ void QwtPlotCurve::setSamples( const QVector &xData, const QVector &yData ) { setData( new QwtPointArrayData( xData, yData ) ); } #endif // !QWT_NO_COMPAT qsstv_9.2.6/qwt/qwt_plot_curve.h0000664000175000017500000002411513203343610015471 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_H #define QWT_PLOT_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" #include "qwt_text.h" #include #include class QPainter; class QPolygonF; class QwtScaleMap; class QwtSymbol; class QwtCurveFitter; /*! \brief A plot item, that represents a series of points A curve is the representation of a series of points in the x-y plane. It supports different display styles, interpolation ( f.e. spline ) and symbols. \par Usage
a) Assign curve properties
When a curve is created, it is configured to draw black solid lines with in QwtPlotCurve::Lines style and no symbols. You can change this by calling setPen(), setStyle() and setSymbol().
b) Connect/Assign data.
QwtPlotCurve gets its points using a QwtSeriesData object offering a bridge to the real storage of the points ( like QAbstractItemModel ). There are several convenience classes derived from QwtSeriesData, that also store the points inside ( like QStandardItemModel ). QwtPlotCurve also offers a couple of variations of setSamples(), that build QwtSeriesData objects from arrays internally.
c) Attach the curve to a plot
See QwtPlotItem::attach()
\par Example: see examples/bode \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap */ class QWT_EXPORT QwtPlotCurve: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! Curve styles. \sa setStyle(), style() */ enum CurveStyle { /*! Don't draw a curve. Note: This doesn't affect the symbols. */ NoCurve = -1, /*! Connect the points with straight lines. The lines might be interpolated depending on the 'Fitted' attribute. Curve fitting can be configured using setCurveFitter(). */ Lines, /*! Draw vertical or horizontal sticks ( depending on the orientation() ) from a baseline which is defined by setBaseline(). */ Sticks, /*! Connect the points with a step function. The step function is drawn from the left to the right or vice versa, depending on the QwtPlotCurve::Inverted attribute. */ Steps, /*! Draw dots at the locations of the data points. Note: This is different from a dotted line (see setPen()), and faster as a curve in QwtPlotCurve::NoStyle style and a symbol painting a point. */ Dots, /*! Styles >= QwtPlotCurve::UserCurve are reserved for derived classes of QwtPlotCurve that overload drawCurve() with additional application specific curve types. */ UserCurve = 100 }; /*! Attribute for drawing the curve \sa setCurveAttribute(), testCurveAttribute(), curveFitter() */ enum CurveAttribute { /*! For QwtPlotCurve::Steps only. Draws a step function from the right to the left. */ Inverted = 0x01, /*! Only in combination with QwtPlotCurve::Lines A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \note Curve fitting requires temporary memory for calculating coefficients and additional points. If painting in QwtPlotCurve::Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. */ Fitted = 0x02 }; //! Curve attributes typedef QFlags CurveAttributes; /*! Attributes how to represent the curve on the legend \sa setLegendAttribute(), testLegendAttribute(), QwtPlotItem::legendData(), legendIcon() */ enum LegendAttribute { /*! QwtPlotCurve tries to find a color representing the curve and paints a rectangle with it. */ LegendNoAttribute = 0x00, /*! If the style() is not QwtPlotCurve::NoCurve a line is painted with the curve pen(). */ LegendShowLine = 0x01, /*! If the curve has a valid symbol it is painted. */ LegendShowSymbol = 0x02, /*! If the curve has a brush a rectangle filled with the curve brush() is painted. */ LegendShowBrush = 0x04 }; //! Legend attributes typedef QFlags LegendAttributes; /*! Attributes to modify the drawing algorithm. The default setting enables ClipPolygons | FilterPoints \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance */ ClipPolygons = 0x01, /*! Tries to reduce the data that has to be painted, by sorting out duplicates, or paintings outside the visible area. Might have a notable impact on curves with many close points. Only a couple of very basic filtering algorithms are implemented. */ FilterPoints = 0x02, /*! Minimize memory usage that is temporarily needed for the translated points, before they get painted. This might slow down the performance of painting */ MinimizeMemory = 0x04, /*! Render the points to a temporary image and paint the image. This is a very special optimization for Dots style, when having a huge amount of points. With a reasonable number of points QPainter::drawPoints() will be faster. */ ImageBuffer = 0x08 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotCurve( const QString &title = QString::null ); explicit QwtPlotCurve( const QwtText &title ); virtual ~QwtPlotCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLegendAttribute( LegendAttribute, bool on = true ); bool testLegendAttribute( LegendAttribute ) const; #ifndef QWT_NO_COMPAT void setRawSamples( const double *xData, const double *yData, int size ); void setSamples( const double *xData, const double *yData, int size ); void setSamples( const QVector &xData, const QVector &yData ); #endif void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); int closestPoint( const QPoint &pos, double *dist = NULL ) const; double minXValue() const; double maxXValue() const; double minYValue() const; double maxYValue() const; void setCurveAttribute( CurveAttribute, bool on = true ); bool testCurveAttribute( CurveAttribute ) const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setBaseline( double ); double baseline() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( QwtSymbol * ); const QwtSymbol *symbol() const; void setCurveFitter( QwtCurveFitter * ); QwtCurveFitter *curveFitter() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawCurve( QPainter *p, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *p, const QwtSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawLines( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSticks( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawDots( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSteps( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void fillCurve( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &canvasRect, QPolygonF & ) const; void closePolyline( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; private: class PrivateData; PrivateData *d_data; }; //! boundingRect().left() inline double QwtPlotCurve::minXValue() const { return boundingRect().left(); } //! boundingRect().right() inline double QwtPlotCurve::maxXValue() const { return boundingRect().right(); } //! boundingRect().top() inline double QwtPlotCurve::minYValue() const { return boundingRect().top(); } //! boundingRect().bottom() inline double QwtPlotCurve::maxYValue() const { return boundingRect().bottom(); } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::PaintAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::LegendAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::CurveAttributes ) #endif qsstv_9.2.6/qwt/qwt_plot_dict.cpp0000664000175000017500000001057413203343610015627 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_dict.h" class QwtPlotDict::PrivateData { public: class ItemList: public QList { public: void insertItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qUpperBound( begin(), end(), item, LessZThan() ); insert( it, item ); } void removeItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qLowerBound( begin(), end(), item, LessZThan() ); for ( ; it != end(); ++it ) { if ( item == *it ) { erase( it ); break; } } } private: class LessZThan { public: inline bool operator()( const QwtPlotItem *item1, const QwtPlotItem *item2 ) const { return item1->z() < item2->z(); } }; }; ItemList itemList; bool autoDelete; }; /*! Constructor Auto deletion is enabled. \sa setAutoDelete(), QwtPlotItem::attach() */ QwtPlotDict::QwtPlotDict() { d_data = new QwtPlotDict::PrivateData; d_data->autoDelete = true; } /*! Destructor If autoDelete() is on, all attached items will be deleted \sa setAutoDelete(), autoDelete(), QwtPlotItem::attach() */ QwtPlotDict::~QwtPlotDict() { detachItems( QwtPlotItem::Rtti_PlotItem, d_data->autoDelete ); delete d_data; } /*! En/Disable Auto deletion If Auto deletion is on all attached plot items will be deleted in the destructor of QwtPlotDict. The default value is on. \sa autoDelete(), insertItem() */ void QwtPlotDict::setAutoDelete( bool autoDelete ) { d_data->autoDelete = autoDelete; } /*! \return true if auto deletion is enabled \sa setAutoDelete(), insertItem() */ bool QwtPlotDict::autoDelete() const { return d_data->autoDelete; } /*! Insert a plot item \param item PlotItem \sa removeItem() */ void QwtPlotDict::insertItem( QwtPlotItem *item ) { d_data->itemList.insertItem( item ); } /*! Remove a plot item \param item PlotItem \sa insertItem() */ void QwtPlotDict::removeItem( QwtPlotItem *item ) { d_data->itemList.removeItem( item ); } /*! Detach items from the dictionary \param rtti In case of QwtPlotItem::Rtti_PlotItem detach all items otherwise only those items of the type rtti. \param autoDelete If true, delete all detached items */ void QwtPlotDict::detachItems( int rtti, bool autoDelete ) { PrivateData::ItemList list = d_data->itemList; QwtPlotItemIterator it = list.begin(); while ( it != list.end() ) { QwtPlotItem *item = *it; ++it; // increment before removing item from the list if ( rtti == QwtPlotItem::Rtti_PlotItem || item->rtti() == rtti ) { item->attach( NULL ); if ( autoDelete ) delete item; } } } /*! \brief A QwtPlotItemList of all attached plot items. Use caution when iterating these lists, as removing/detaching an item will invalidate the iterator. Instead you can place pointers to objects to be removed in a removal list, and traverse that list later. \return List of all attached plot items. */ const QwtPlotItemList &QwtPlotDict::itemList() const { return d_data->itemList; } /*! \return List of all attached plot items of a specific type. \param rtti See QwtPlotItem::RttiValues \sa QwtPlotItem::rtti() */ QwtPlotItemList QwtPlotDict::itemList( int rtti ) const { if ( rtti == QwtPlotItem::Rtti_PlotItem ) return d_data->itemList; QwtPlotItemList items; PrivateData::ItemList list = d_data->itemList; for ( QwtPlotItemIterator it = list.begin(); it != list.end(); ++it ) { QwtPlotItem *item = *it; if ( item->rtti() == rtti ) items += item; } return items; } qsstv_9.2.6/qwt/qwt_plot_dict.h0000664000175000017500000000317013203343610015266 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file !*/ #ifndef QWT_PLOT_DICT #define QWT_PLOT_DICT #include "qwt_global.h" #include "qwt_plot_item.h" #include /// \var typedef QList< QwtPlotItem *> QwtPlotItemList /// \brief See QT 4.x assistant documentation for QList typedef QList QwtPlotItemList; typedef QList::ConstIterator QwtPlotItemIterator; /*! \brief A dictionary for plot items QwtPlotDict organizes plot items in increasing z-order. If autoDelete() is enabled, all attached items will be deleted in the destructor of the dictionary. QwtPlotDict can be used to get access to all QwtPlotItem items - or all items of a specific type - that are currently on the plot. \sa QwtPlotItem::attach(), QwtPlotItem::detach(), QwtPlotItem::z() */ class QWT_EXPORT QwtPlotDict { public: explicit QwtPlotDict(); virtual ~QwtPlotDict(); void setAutoDelete( bool ); bool autoDelete() const; const QwtPlotItemList& itemList() const; QwtPlotItemList itemList( int rtti ) const; void detachItems( int rtti = QwtPlotItem::Rtti_PlotItem, bool autoDelete = true ); protected: void insertItem( QwtPlotItem * ); void removeItem( QwtPlotItem * ); private: class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_directpainter.cpp0000664000175000017500000002033113203343610017531 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_directpainter.h" #include "qwt_scale_map.h" #include "qwt_plot.h" #include "qwt_plot_canvas.h" #include "qwt_plot_seriesitem.h" #include #include #include #include static inline void qwtRenderItem( QPainter *painter, const QRect &canvasRect, QwtPlotSeriesItem *seriesItem, int from, int to ) { // A minor performance improvement is possible // with caching the maps. TODO ... QwtPlot *plot = seriesItem->plot(); const QwtScaleMap xMap = plot->canvasMap( seriesItem->xAxis() ); const QwtScaleMap yMap = plot->canvasMap( seriesItem->yAxis() ); painter->setRenderHint( QPainter::Antialiasing, seriesItem->testRenderHint( QwtPlotItem::RenderAntialiased ) ); seriesItem->drawSeries( painter, xMap, yMap, canvasRect, from, to ); } static inline bool qwtHasBackingStore( const QwtPlotCanvas *canvas ) { return canvas->testPaintAttribute( QwtPlotCanvas::BackingStore ) && canvas->backingStore() && !canvas->backingStore()->isNull(); } class QwtPlotDirectPainter::PrivateData { public: PrivateData(): attributes( 0 ), hasClipping(false), seriesItem( NULL ) { } QwtPlotDirectPainter::Attributes attributes; bool hasClipping; QRegion clipRegion; QPainter painter; QwtPlotSeriesItem *seriesItem; int from; int to; }; //! Constructor QwtPlotDirectPainter::QwtPlotDirectPainter( QObject *parent ): QObject( parent ) { d_data = new PrivateData; } //! Destructor QwtPlotDirectPainter::~QwtPlotDirectPainter() { delete d_data; } /*! Change an attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtPlotDirectPainter::setAttribute( Attribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; if ( ( attribute == AtomicPainter ) && on ) reset(); } } /*! \return True, when attribute is enabled \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtPlotDirectPainter::testAttribute( Attribute attribute ) const { return d_data->attributes & attribute; } /*! En/Disables clipping \param enable Enables clipping is true, disable it otherwise \sa hasClipping(), clipRegion(), setClipRegion() */ void QwtPlotDirectPainter::setClipping( bool enable ) { d_data->hasClipping = enable; } /*! \return true, when clipping is enabled \sa setClipping(), clipRegion(), setClipRegion() */ bool QwtPlotDirectPainter::hasClipping() const { return d_data->hasClipping; } /*! \brief Assign a clip region and enable clipping Depending on the environment setting a proper clip region might improve the performance heavily. F.e. on Qt embedded only the clipped part of the backing store will be copied to a ( maybe unaccelerated ) frame buffer device. \param region Clip region \sa clipRegion(), hasClipping(), setClipping() */ void QwtPlotDirectPainter::setClipRegion( const QRegion ®ion ) { d_data->clipRegion = region; d_data->hasClipping = true; } /*! \return Currently set clip region. \sa setClipRegion(), setClipping(), hasClipping() */ QRegion QwtPlotDirectPainter::clipRegion() const { return d_data->clipRegion; } /*! \brief Draw a set of points of a seriesItem. When observing an measurement while it is running, new points have to be added to an existing seriesItem. drawSeries() can be used to display them avoiding a complete redraw of the canvas. Setting plot()->canvas()->setAttribute(Qt::WA_PaintOutsidePaintEvent, true); will result in faster painting, if the paint engine of the canvas widget supports this feature. \param seriesItem Item to be painted \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the series will be painted to its last point. */ void QwtPlotDirectPainter::drawSeries( QwtPlotSeriesItem *seriesItem, int from, int to ) { if ( seriesItem == NULL || seriesItem->plot() == NULL ) return; QWidget *canvas = seriesItem->plot()->canvas(); const QRect canvasRect = canvas->contentsRect(); QwtPlotCanvas *plotCanvas = qobject_cast( canvas ); if ( plotCanvas && qwtHasBackingStore( plotCanvas ) ) { QPainter painter( const_cast( plotCanvas->backingStore() ) ); if ( d_data->hasClipping ) painter.setClipRegion( d_data->clipRegion ); qwtRenderItem( &painter, canvasRect, seriesItem, from, to ); if ( testAttribute( QwtPlotDirectPainter::FullRepaint ) ) { plotCanvas->repaint(); return; } } bool immediatePaint = true; if ( !canvas->testAttribute( Qt::WA_WState_InPaintEvent ) ) { #if QT_VERSION < 0x050000 if ( !canvas->testAttribute( Qt::WA_PaintOutsidePaintEvent ) ) #endif immediatePaint = false; } if ( immediatePaint ) { if ( !d_data->painter.isActive() ) { reset(); d_data->painter.begin( canvas ); canvas->installEventFilter( this ); } if ( d_data->hasClipping ) { d_data->painter.setClipRegion( QRegion( canvasRect ) & d_data->clipRegion ); } else { if ( !d_data->painter.hasClipping() ) d_data->painter.setClipRect( canvasRect ); } qwtRenderItem( &d_data->painter, canvasRect, seriesItem, from, to ); if ( d_data->attributes & QwtPlotDirectPainter::AtomicPainter ) { reset(); } else { if ( d_data->hasClipping ) d_data->painter.setClipping( false ); } } else { reset(); d_data->seriesItem = seriesItem; d_data->from = from; d_data->to = to; QRegion clipRegion = canvasRect; if ( d_data->hasClipping ) clipRegion &= d_data->clipRegion; canvas->installEventFilter( this ); canvas->repaint(clipRegion); canvas->removeEventFilter( this ); d_data->seriesItem = NULL; } } //! Close the internal QPainter void QwtPlotDirectPainter::reset() { if ( d_data->painter.isActive() ) { QWidget *w = static_cast( d_data->painter.device() ); if ( w ) w->removeEventFilter( this ); d_data->painter.end(); } } //! Event filter bool QwtPlotDirectPainter::eventFilter( QObject *, QEvent *event ) { if ( event->type() == QEvent::Paint ) { reset(); if ( d_data->seriesItem ) { const QPaintEvent *pe = static_cast< QPaintEvent *>( event ); QWidget *canvas = d_data->seriesItem->plot()->canvas(); QPainter painter( canvas ); painter.setClipRegion( pe->region() ); bool doCopyCache = testAttribute( CopyBackingStore ); if ( doCopyCache ) { QwtPlotCanvas *plotCanvas = qobject_cast( canvas ); if ( plotCanvas ) { doCopyCache = qwtHasBackingStore( plotCanvas ); if ( doCopyCache ) { painter.drawPixmap( plotCanvas->contentsRect().topLeft(), *plotCanvas->backingStore() ); } } } if ( !doCopyCache ) { qwtRenderItem( &painter, canvas->contentsRect(), d_data->seriesItem, d_data->from, d_data->to ); } return true; // don't call QwtPlotCanvas::paintEvent() } } return false; } qsstv_9.2.6/qwt/qwt_plot_directpainter.h0000664000175000017500000000612713203343610017205 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_DIRECT_PAINTER_H #define QWT_PLOT_DIRECT_PAINTER_H #include "qwt_global.h" #include class QRegion; class QwtPlotSeriesItem; /*! \brief Painter object trying to paint incrementally Often applications want to display samples while they are collected. When there are too many samples complete replots will be expensive to be processed in a collection cycle. QwtPlotDirectPainter offers an API to paint subsets ( f.e all additions points ) without erasing/repainting the plot canvas. On certain environments it might be important to calculate a proper clip region before painting. F.e. for Qt Embedded only the clipped part of the backing store will be copied to a ( maybe unaccelerated ) frame buffer. \warning Incremental painting will only help when no replot is triggered by another operation ( like changing scales ) and nothing needs to be erased. */ class QWT_EXPORT QwtPlotDirectPainter: public QObject { public: /*! \brief Paint attributes \sa setAttribute(), testAttribute(), drawSeries() */ enum Attribute { /*! Initializing a QPainter is an expensive operation. When AtomicPainter is set each call of drawSeries() opens/closes a temporary QPainter. Otherwise QwtPlotDirectPainter tries to use the same QPainter as long as possible. */ AtomicPainter = 0x01, /*! When FullRepaint is set the plot canvas is explicitly repainted after the samples have been rendered. */ FullRepaint = 0x02, /*! When QwtPlotCanvas::BackingStore is enabled the painter has to paint to the backing store and the widget. In certain situations/environments it might be faster to paint to the backing store only and then copy the backing store to the canvas. This flag can also be useful for settings, where Qt fills the the clip region with the widget background. */ CopyBackingStore = 0x04 }; //! Paint attributes typedef QFlags Attributes; QwtPlotDirectPainter( QObject *parent = NULL ); virtual ~QwtPlotDirectPainter(); void setAttribute( Attribute, bool on ); bool testAttribute( Attribute ) const; void setClipping( bool ); bool hasClipping() const; void setClipRegion( const QRegion & ); QRegion clipRegion() const; void drawSeries( QwtPlotSeriesItem *, int from, int to ); void reset(); virtual bool eventFilter( QObject *, QEvent * ); private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotDirectPainter::Attributes ) #endif qsstv_9.2.6/qwt/qwt_plot_grid.cpp0000664000175000017500000002317313203343610015630 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_grid.h" #include "qwt_painter.h" #include "qwt_text.h" #include "qwt_scale_map.h" #include "qwt_scale_div.h" #include "qwt_math.h" #include #include class QwtPlotGrid::PrivateData { public: PrivateData(): xEnabled( true ), yEnabled( true ), xMinEnabled( false ), yMinEnabled( false ) { } bool xEnabled; bool yEnabled; bool xMinEnabled; bool yMinEnabled; QwtScaleDiv xScaleDiv; QwtScaleDiv yScaleDiv; QPen majorPen; QPen minorPen; }; //! Enables major grid, disables minor grid QwtPlotGrid::QwtPlotGrid(): QwtPlotItem( QwtText( "Grid" ) ) { d_data = new PrivateData; setItemInterest( QwtPlotItem::ScaleInterest, true ); setZ( 10.0 ); } //! Destructor QwtPlotGrid::~QwtPlotGrid() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotGrid int QwtPlotGrid::rtti() const { return QwtPlotItem::Rtti_PlotGrid; } /*! \brief Enable or disable vertical grid lines \param on Enable (true) or disable \sa Minor grid lines can be enabled or disabled with enableXMin() */ void QwtPlotGrid::enableX( bool on ) { if ( d_data->xEnabled != on ) { d_data->xEnabled = on; legendChanged(); itemChanged(); } } /*! \brief Enable or disable horizontal grid lines \param on Enable (true) or disable \sa Minor grid lines can be enabled or disabled with enableYMin() */ void QwtPlotGrid::enableY( bool on ) { if ( d_data->yEnabled != on ) { d_data->yEnabled = on; legendChanged(); itemChanged(); } } /*! \brief Enable or disable minor vertical grid lines. \param on Enable (true) or disable \sa enableX() */ void QwtPlotGrid::enableXMin( bool on ) { if ( d_data->xMinEnabled != on ) { d_data->xMinEnabled = on; legendChanged(); itemChanged(); } } /*! \brief Enable or disable minor horizontal grid lines \param on Enable (true) or disable \sa enableY() */ void QwtPlotGrid::enableYMin( bool on ) { if ( d_data->yMinEnabled != on ) { d_data->yMinEnabled = on; legendChanged(); itemChanged(); } } /*! Assign an x axis scale division \param scaleDiv Scale division */ void QwtPlotGrid::setXDiv( const QwtScaleDiv &scaleDiv ) { if ( d_data->xScaleDiv != scaleDiv ) { d_data->xScaleDiv = scaleDiv; itemChanged(); } } /*! Assign a y axis division \param scaleDiv Scale division */ void QwtPlotGrid::setYDiv( const QwtScaleDiv &scaleDiv ) { if ( d_data->yScaleDiv != scaleDiv ) { d_data->yScaleDiv = scaleDiv; itemChanged(); } } /*! Build and assign a pen for both major and minor grid lines In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotGrid::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen for both major and minor grid lines \param pen Pen \sa setMajorPen(), setMinorPen() */ void QwtPlotGrid::setPen( const QPen &pen ) { if ( d_data->majorPen != pen || d_data->minorPen != pen ) { d_data->majorPen = pen; d_data->minorPen = pen; legendChanged(); itemChanged(); } } /*! Build and assign a pen for both major grid lines In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotGrid::setMajorPen( const QColor &color, qreal width, Qt::PenStyle style ) { setMajorPen( QPen( color, width, style ) ); } /*! Assign a pen for the major grid lines \param pen Pen \sa majorPen(), setMinorPen(), setPen() */ void QwtPlotGrid::setMajorPen( const QPen &pen ) { if ( d_data->majorPen != pen ) { d_data->majorPen = pen; legendChanged(); itemChanged(); } } /*! Build and assign a pen for the minor grid lines In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotGrid::setMinorPen( const QColor &color, qreal width, Qt::PenStyle style ) { setMinorPen( QPen( color, width, style ) ); } /*! Assign a pen for the minor grid lines \param pen Pen \sa minorPen(), setMajorPen(), setPen() */ void QwtPlotGrid::setMinorPen( const QPen &pen ) { if ( d_data->minorPen != pen ) { d_data->minorPen = pen; legendChanged(); itemChanged(); } } /*! \brief Draw the grid The grid is drawn into the bounding rectangle such that grid lines begin and end at the rectangle's borders. The X and Y maps are used to map the scale divisions into the drawing region screen. \param painter Painter \param xMap X axis map \param yMap Y axis \param canvasRect Contents rectangle of the plot canvas */ void QwtPlotGrid::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { // draw minor grid lines QPen minorPen = d_data->minorPen; minorPen.setCapStyle( Qt::FlatCap ); painter->setPen( minorPen ); if ( d_data->xEnabled && d_data->xMinEnabled ) { drawLines( painter, canvasRect, Qt::Vertical, xMap, d_data->xScaleDiv.ticks( QwtScaleDiv::MinorTick ) ); drawLines( painter, canvasRect, Qt::Vertical, xMap, d_data->xScaleDiv.ticks( QwtScaleDiv::MediumTick ) ); } if ( d_data->yEnabled && d_data->yMinEnabled ) { drawLines( painter, canvasRect, Qt::Horizontal, yMap, d_data->yScaleDiv.ticks( QwtScaleDiv::MinorTick ) ); drawLines( painter, canvasRect, Qt::Horizontal, yMap, d_data->yScaleDiv.ticks( QwtScaleDiv::MediumTick ) ); } // draw major grid lines QPen majorPen = d_data->majorPen; majorPen.setCapStyle( Qt::FlatCap ); painter->setPen( majorPen ); if ( d_data->xEnabled ) { drawLines( painter, canvasRect, Qt::Vertical, xMap, d_data->xScaleDiv.ticks( QwtScaleDiv::MajorTick ) ); } if ( d_data->yEnabled ) { drawLines( painter, canvasRect, Qt::Horizontal, yMap, d_data->yScaleDiv.ticks( QwtScaleDiv::MajorTick ) ); } } void QwtPlotGrid::drawLines( QPainter *painter, const QRectF &canvasRect, Qt::Orientation orientation, const QwtScaleMap &scaleMap, const QList &values ) const { const double x1 = canvasRect.left(); const double x2 = canvasRect.right() - 1.0; const double y1 = canvasRect.top(); const double y2 = canvasRect.bottom() - 1.0; const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < values.count(); i++ ) { double value = scaleMap.transform( values[i] ); if ( doAlign ) value = qRound( value ); if ( orientation == Qt::Horizontal ) { if ( qwtFuzzyGreaterOrEqual( value, y1 ) && qwtFuzzyLessOrEqual( value, y2 ) ) { QwtPainter::drawLine( painter, x1, value, x2, value ); } } else { if ( qwtFuzzyGreaterOrEqual( value, x1 ) && qwtFuzzyLessOrEqual( value, x2 ) ) { QwtPainter::drawLine( painter, value, y1, value, y2 ); } } } } /*! \return the pen for the major grid lines \sa setMajorPen(), setMinorPen(), setPen() */ const QPen &QwtPlotGrid::majorPen() const { return d_data->majorPen; } /*! \return the pen for the minor grid lines \sa setMinorPen(), setMajorPen(), setPen() */ const QPen &QwtPlotGrid::minorPen() const { return d_data->minorPen; } /*! \return true if vertical grid lines are enabled \sa enableX() */ bool QwtPlotGrid::xEnabled() const { return d_data->xEnabled; } /*! \return true if minor vertical grid lines are enabled \sa enableXMin() */ bool QwtPlotGrid::xMinEnabled() const { return d_data->xMinEnabled; } /*! \return true if horizontal grid lines are enabled \sa enableY() */ bool QwtPlotGrid::yEnabled() const { return d_data->yEnabled; } /*! \return true if minor horizontal grid lines are enabled \sa enableYMin() */ bool QwtPlotGrid::yMinEnabled() const { return d_data->yMinEnabled; } /*! \return the scale division of the x axis */ const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const { return d_data->xScaleDiv; } /*! \return the scale division of the y axis */ const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const { return d_data->yScaleDiv; } /*! Update the grid to changes of the axes scale division \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes() */ void QwtPlotGrid::updateScaleDiv( const QwtScaleDiv& xScaleDiv, const QwtScaleDiv& yScaleDiv ) { setXDiv( xScaleDiv ); setYDiv( yScaleDiv ); } qsstv_9.2.6/qwt/qwt_plot_grid.h0000664000175000017500000000460313203343610015272 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_GRID_H #define QWT_PLOT_GRID_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_div.h" class QPainter; class QPen; class QwtScaleMap; class QwtScaleDiv; /*! \brief A class which draws a coordinate grid The QwtPlotGrid class can be used to draw a coordinate grid. A coordinate grid consists of major and minor vertical and horizontal grid lines. The locations of the grid lines are determined by the X and Y scale divisions which can be assigned with setXDiv() and setYDiv(). The draw() member draws the grid within a bounding rectangle. */ class QWT_EXPORT QwtPlotGrid: public QwtPlotItem { public: explicit QwtPlotGrid(); virtual ~QwtPlotGrid(); virtual int rtti() const; void enableX( bool tf ); bool xEnabled() const; void enableY( bool tf ); bool yEnabled() const; void enableXMin( bool tf ); bool xMinEnabled() const; void enableYMin( bool tf ); bool yMinEnabled() const; void setXDiv( const QwtScaleDiv &sx ); const QwtScaleDiv &xScaleDiv() const; void setYDiv( const QwtScaleDiv &sy ); const QwtScaleDiv &yScaleDiv() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); void setMajorPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setMajorPen( const QPen & ); const QPen& majorPen() const; void setMinorPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setMinorPen( const QPen &p ); const QPen& minorPen() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual void updateScaleDiv( const QwtScaleDiv &xMap, const QwtScaleDiv &yMap ); private: void drawLines( QPainter *painter, const QRectF &, Qt::Orientation orientation, const QwtScaleMap &, const QList & ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_histogram.cpp0000664000175000017500000004341713203343610016703 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_histogram.h" #include "qwt_plot.h" #include "qwt_painter.h" #include "qwt_column_symbol.h" #include "qwt_scale_map.h" #include #include static inline bool qwtIsCombinable( const QwtInterval &d1, const QwtInterval &d2 ) { if ( d1.isValid() && d2.isValid() ) { if ( d1.maxValue() == d2.minValue() ) { if ( !( d1.borderFlags() & QwtInterval::ExcludeMaximum && d2.borderFlags() & QwtInterval::ExcludeMinimum ) ) { return true; } } } return false; } class QwtPlotHistogram::PrivateData { public: PrivateData(): baseline( 0.0 ), style( Columns ), symbol( NULL ) { } ~PrivateData() { delete symbol; } double baseline; QPen pen; QBrush brush; QwtPlotHistogram::HistogramStyle style; const QwtColumnSymbol *symbol; }; /*! Constructor \param title Title of the histogram. */ QwtPlotHistogram::QwtPlotHistogram( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the histogram. */ QwtPlotHistogram::QwtPlotHistogram( const QString &title ): QwtPlotSeriesItem( title ) { init(); } //! Destructor QwtPlotHistogram::~QwtPlotHistogram() { delete d_data; } //! Initialize data members void QwtPlotHistogram::init() { d_data = new PrivateData(); setData( new QwtIntervalSeriesData() ); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, true ); setZ( 20.0 ); } /*! Set the histogram's drawing style \param style Histogram style \sa HistogramStyle, style() */ void QwtPlotHistogram::setStyle( HistogramStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the histogram \sa HistogramStyle, setStyle() */ QwtPlotHistogram::HistogramStyle QwtPlotHistogram::style() const { return d_data->style; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotHistogram::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen, that is used in a style() depending way. \param pen New pen \sa pen(), brush() */ void QwtPlotHistogram::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used in a style() depending way. \sa setPen(), brush() */ const QPen &QwtPlotHistogram::pen() const { return d_data->pen; } /*! Assign a brush, that is used in a style() depending way. \param brush New brush \sa pen(), brush() */ void QwtPlotHistogram::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used in a style() depending way. \sa setPen(), brush() */ const QBrush &QwtPlotHistogram::brush() const { return d_data->brush; } /*! \brief Assign a symbol In Column style an optional symbol can be assigned, that is responsible for displaying the rectangle that is defined by the interval and the distance between baseline() and value. When no symbol has been defined the area is displayed as plain rectangle using pen() and brush(). \sa style(), symbol(), drawColumn(), pen(), brush() \note In applications, where different intervals need to be displayed in a different way ( f.e different colors or even using different symbols) it is recommended to overload drawColumn(). */ void QwtPlotHistogram::setSymbol( const QwtColumnSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtColumnSymbol *QwtPlotHistogram::symbol() const { return d_data->symbol; } /*! \brief Set the value of the baseline Each column representing an QwtIntervalSample is defined by its interval and the interval between baseline and the value of the sample. The default value of the baseline is 0.0. \param value Value of the baseline \sa baseline() */ void QwtPlotHistogram::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return Value of the baseline \sa setBaseline() */ double QwtPlotHistogram::baseline() const { return d_data->baseline; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotHistogram::boundingRect() const { QRectF rect = data()->boundingRect(); if ( !rect.isValid() ) return rect; if ( orientation() == Qt::Horizontal ) { rect = QRectF( rect.y(), rect.x(), rect.height(), rect.width() ); if ( rect.left() > d_data->baseline ) rect.setLeft( d_data->baseline ); else if ( rect.right() < d_data->baseline ) rect.setRight( d_data->baseline ); } else { if ( rect.bottom() < d_data->baseline ) rect.setBottom( d_data->baseline ); else if ( rect.top() > d_data->baseline ) rect.setTop( d_data->baseline ); } return rect; } //! \return QwtPlotItem::Rtti_PlotHistogram int QwtPlotHistogram::rtti() const { return QwtPlotItem::Rtti_PlotHistogram; } /*! Initialize data with an array of samples. \param samples Vector of points */ void QwtPlotHistogram::setSamples( const QVector &samples ) { setData( new QwtIntervalSeriesData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotHistogram::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Draw a subset of the histogram samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawOutline(), drawLines(), drawColumns */ void QwtPlotHistogram::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { if ( !painter || dataSize() <= 0 ) return; if ( to < 0 ) to = dataSize() - 1; switch ( d_data->style ) { case Outline: drawOutline( painter, xMap, yMap, from, to ); break; case Lines: drawLines( painter, xMap, yMap, from, to ); break; case Columns: drawColumns( painter, xMap, yMap, from, to ); break; default: break; } } /*! Draw a histogram in Outline style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style() \warning The outline style requires, that the intervals are in increasing order and not overlapping. */ void QwtPlotHistogram::drawOutline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); double v0 = ( orientation() == Qt::Horizontal ) ? xMap.transform( baseline() ) : yMap.transform( baseline() ); if ( doAlign ) v0 = qRound( v0 ); QwtIntervalSample previous; QPolygonF polygon; for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = this->sample( i ); if ( !sample.interval.isValid() ) { flushPolygon( painter, v0, polygon ); previous = sample; continue; } if ( previous.interval.isValid() ) { if ( !qwtIsCombinable( previous.interval, sample.interval ) ) flushPolygon( painter, v0, polygon ); } if ( orientation() == Qt::Vertical ) { double x1 = xMap.transform( sample.interval.minValue() ); double x2 = xMap.transform( sample.interval.maxValue() ); double y = yMap.transform( sample.value ); if ( doAlign ) { x1 = qRound( x1 ); x2 = qRound( x2 ); y = qRound( y ); } if ( polygon.size() == 0 ) polygon += QPointF( x1, v0 ); polygon += QPointF( x1, y ); polygon += QPointF( x2, y ); } else { double y1 = yMap.transform( sample.interval.minValue() ); double y2 = yMap.transform( sample.interval.maxValue() ); double x = xMap.transform( sample.value ); if ( doAlign ) { y1 = qRound( y1 ); y2 = qRound( y2 ); x = qRound( x ); } if ( polygon.size() == 0 ) polygon += QPointF( v0, y1 ); polygon += QPointF( x, y1 ); polygon += QPointF( x, y2 ); } previous = sample; } flushPolygon( painter, v0, polygon ); } /*! Draw a histogram in Columns style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style(), setSymbol(), drawColumn() */ void QwtPlotHistogram::drawColumns( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { painter->setPen( d_data->pen ); painter->setBrush( d_data->brush ); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = series->sample( i ); if ( !sample.interval.isNull() ) { const QwtColumnRect rect = columnRect( sample, xMap, yMap ); drawColumn( painter, rect, sample ); } } } /*! Draw a histogram in Lines style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style(), setPen() */ void QwtPlotHistogram::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->setPen( d_data->pen ); painter->setBrush( Qt::NoBrush ); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = series->sample( i ); if ( !sample.interval.isNull() ) { const QwtColumnRect rect = columnRect( sample, xMap, yMap ); QRectF r = rect.toRect(); if ( doAlign ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( rect.direction ) { case QwtColumnRect::LeftToRight: { QwtPainter::drawLine( painter, r.topRight(), r.bottomRight() ); break; } case QwtColumnRect::RightToLeft: { QwtPainter::drawLine( painter, r.topLeft(), r.bottomLeft() ); break; } case QwtColumnRect::TopToBottom: { QwtPainter::drawLine( painter, r.bottomRight(), r.bottomLeft() ); break; } case QwtColumnRect::BottomToTop: { QwtPainter::drawLine( painter, r.topRight(), r.topLeft() ); break; } } } } } //! Internal, used by the Outline style. void QwtPlotHistogram::flushPolygon( QPainter *painter, double baseLine, QPolygonF &polygon ) const { if ( polygon.size() == 0 ) return; if ( orientation() == Qt::Horizontal ) polygon += QPointF( baseLine, polygon.last().y() ); else polygon += QPointF( polygon.last().x(), baseLine ); if ( d_data->brush.style() != Qt::NoBrush ) { painter->setPen( Qt::NoPen ); painter->setBrush( d_data->brush ); if ( orientation() == Qt::Horizontal ) { polygon += QPointF( polygon.last().x(), baseLine ); polygon += QPointF( polygon.first().x(), baseLine ); } else { polygon += QPointF( baseLine, polygon.last().y() ); polygon += QPointF( baseLine, polygon.first().y() ); } QwtPainter::drawPolygon( painter, polygon ); polygon.pop_back(); polygon.pop_back(); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setBrush( Qt::NoBrush ); painter->setPen( d_data->pen ); QwtPainter::drawPolyline( painter, polygon ); } polygon.clear(); } /*! Calculate the area that is covered by a sample \param sample Sample \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Rectangle, that is covered by a sample */ QwtColumnRect QwtPlotHistogram::columnRect( const QwtIntervalSample &sample, const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { QwtColumnRect rect; const QwtInterval &iv = sample.interval; if ( !iv.isValid() ) return rect; if ( orientation() == Qt::Horizontal ) { const double x0 = xMap.transform( baseline() ); const double x = xMap.transform( sample.value ); const double y1 = yMap.transform( iv.minValue() ); const double y2 = yMap.transform( iv.maxValue() ); rect.hInterval.setInterval( x0, x ); rect.vInterval.setInterval( y1, y2, iv.borderFlags() ); rect.direction = ( x < x0 ) ? QwtColumnRect::RightToLeft : QwtColumnRect::LeftToRight; } else { const double x1 = xMap.transform( iv.minValue() ); const double x2 = xMap.transform( iv.maxValue() ); const double y0 = yMap.transform( baseline() ); const double y = yMap.transform( sample.value ); rect.hInterval.setInterval( x1, x2, iv.borderFlags() ); rect.vInterval.setInterval( y0, y ); rect.direction = ( y < y0 ) ? QwtColumnRect::BottomToTop : QwtColumnRect::TopToBottom; } return rect; } /*! Draw a column for a sample in Columns style(). When a symbol() has been set the symbol is used otherwise the column is displayed as plain rectangle using pen() and brush(). \param painter Painter \param rect Rectangle where to paint the column in paint device coordinates \param sample Sample to be displayed \note In applications, where different intervals need to be displayed in a different way ( f.e different colors or even using different symbols) it is recommended to overload drawColumn(). */ void QwtPlotHistogram::drawColumn( QPainter *painter, const QwtColumnRect &rect, const QwtIntervalSample &sample ) const { Q_UNUSED( sample ); if ( d_data->symbol && ( d_data->symbol->style() != QwtColumnSymbol::NoStyle ) ) { d_data->symbol->draw( painter, rect ); } else { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } QwtPainter::drawRect( painter, r ); } } /*! A plain rectangle without pen using the brush() \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \return A graphic displaying the icon \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotHistogram::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); return defaultIcon( d_data->brush, size ); } qsstv_9.2.6/qwt/qwt_plot_histogram.h0000664000175000017500000001030713203343610016340 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_HISTOGRAM_H #define QWT_PLOT_HISTOGRAM_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_column_symbol.h" #include #include class QwtIntervalData; class QString; class QPolygonF; /*! \brief QwtPlotHistogram represents a series of samples, where an interval is associated with a value ( \f$y = f([x1,x2])\f$ ). The representation depends on the style() and an optional symbol() that is displayed for each interval. \note The term "histogram" is used in a different way in the areas of digital image processing and statistics. Wikipedia introduces the terms "image histogram" and "color histogram" to avoid confusions. While "image histograms" can be displayed by a QwtPlotCurve there is no applicable plot item for a "color histogram" yet. \sa QwtPlotBarChart, QwtPlotMultiBarChart */ class QWT_EXPORT QwtPlotHistogram: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! Histogram styles. The default style is QwtPlotHistogram::Columns. \sa setStyle(), style(), setSymbol(), symbol(), setBaseline() */ enum HistogramStyle { /*! Draw an outline around the area, that is build by all intervals using the pen() and fill it with the brush(). The outline style requires, that the intervals are in increasing order and not overlapping. */ Outline, /*! Draw a column for each interval. When a symbol() has been set the symbol is used otherwise the column is displayed as plain rectangle using pen() and brush(). */ Columns, /*! Draw a simple line using the pen() for each interval. */ Lines, /*! Styles >= UserStyle are reserved for derived classes that overload drawSeries() with additional application specific ways to display a histogram. */ UserStyle = 100 }; explicit QwtPlotHistogram( const QString &title = QString::null ); explicit QwtPlotHistogram( const QwtText &title ); virtual ~QwtPlotHistogram(); virtual int rtti() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setBaseline( double reference ); double baseline() const; void setStyle( HistogramStyle style ); HistogramStyle style() const; void setSymbol( const QwtColumnSymbol * ); const QwtColumnSymbol *symbol() const; virtual void drawSeries( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: virtual QwtColumnRect columnRect( const QwtIntervalSample &, const QwtScaleMap &, const QwtScaleMap & ) const; virtual void drawColumn( QPainter *, const QwtColumnRect &, const QwtIntervalSample & ) const; void drawColumns( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; void drawOutline( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; void drawLines( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; private: void init(); void flushPolygon( QPainter *, double baseLine, QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; #endif qsstv_9.2.6/qwt/qwt_plot_intervalcurve.cpp0000664000175000017500000003620313203343610017572 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_intervalcurve.h" #include "qwt_interval_symbol.h" #include "qwt_scale_map.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include #include static inline bool qwtIsHSampleInside( const QwtIntervalSample &sample, double xMin, double xMax, double yMin, double yMax ) { const double y = sample.value; const double x1 = sample.interval.minValue(); const double x2 = sample.interval.maxValue(); const bool isOffScreen = ( y < yMin ) || ( y > yMax ) || ( x1 < xMin && x2 < xMin ) || ( x1 > xMax && x2 > xMax ); return !isOffScreen; } static inline bool qwtIsVSampleInside( const QwtIntervalSample &sample, double xMin, double xMax, double yMin, double yMax ) { const double x = sample.value; const double y1 = sample.interval.minValue(); const double y2 = sample.interval.maxValue(); const bool isOffScreen = ( x < xMin ) || ( x > xMax ) || ( y1 < yMin && y2 < yMin ) || ( y1 > yMax && y2 > yMax ); return !isOffScreen; } class QwtPlotIntervalCurve::PrivateData { public: PrivateData(): style( QwtPlotIntervalCurve::Tube ), symbol( NULL ), pen( Qt::black ), brush( Qt::white ) { paintAttributes = QwtPlotIntervalCurve::ClipPolygons; paintAttributes |= QwtPlotIntervalCurve::ClipSymbol; pen.setCapStyle( Qt::FlatCap ); } ~PrivateData() { delete symbol; } QwtPlotIntervalCurve::CurveStyle style; const QwtIntervalSymbol *symbol; QPen pen; QBrush brush; QwtPlotIntervalCurve::PaintAttributes paintAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotIntervalCurve::~QwtPlotIntervalCurve() { delete d_data; } //! Initialize internal members void QwtPlotIntervalCurve::init() { setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); d_data = new PrivateData; setData( new QwtIntervalSeriesData() ); setZ( 19.0 ); } //! \return QwtPlotItem::Rtti_PlotIntervalCurve int QwtPlotIntervalCurve::rtti() const { return QwtPlotIntervalCurve::Rtti_PlotIntervalCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotIntervalCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotIntervalCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Initialize data with an array of samples. \param samples Vector of samples */ void QwtPlotIntervalCurve::setSamples( const QVector &samples ) { setData( new QwtIntervalSeriesData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotIntervalCurve::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Set the curve's drawing style \param style Curve style \sa CurveStyle, style() */ void QwtPlotIntervalCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the curve \sa setStyle() */ QwtPlotIntervalCurve::CurveStyle QwtPlotIntervalCurve::style() const { return d_data->style; } /*! Assign a symbol. \param symbol Symbol \sa symbol() */ void QwtPlotIntervalCurve::setSymbol( const QwtIntervalSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtIntervalSymbol *QwtPlotIntervalCurve::symbol() const { return d_data->symbol; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotIntervalCurve::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! \brief Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotIntervalCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotIntervalCurve::pen() const { return d_data->pen; } /*! Assign a brush. The brush is used to fill the area in Tube style(). \param brush Brush \sa brush(), pen(), setStyle(), CurveStyle */ void QwtPlotIntervalCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used to fill the area in Tube style() \sa setBrush(), setStyle(), CurveStyle */ const QBrush& QwtPlotIntervalCurve::brush() const { return d_data->brush; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotIntervalCurve::boundingRect() const { QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.isValid() && orientation() == Qt::Vertical ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw a subset of the samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawTube(), drawSymbols() */ void QwtPlotIntervalCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; switch ( d_data->style ) { case Tube: drawTube( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } if ( d_data->symbol && ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) ) { drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); } } /*! Draw a tube Builds 2 curves from the upper and lower limits of the intervals and draws them with the pen(). The area between the curves is filled with the brush(). \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawSeries(), drawSymbols() */ void QwtPlotIntervalCurve::drawTube( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->save(); const size_t size = to - from + 1; QPolygonF polygon( 2 * size ); QPointF *points = polygon.data(); for ( uint i = 0; i < size; i++ ) { QPointF &minValue = points[i]; QPointF &maxValue = points[2 * size - 1 - i]; const QwtIntervalSample intervalSample = sample( from + i ); if ( orientation() == Qt::Vertical ) { double x = xMap.transform( intervalSample.value ); double y1 = yMap.transform( intervalSample.interval.minValue() ); double y2 = yMap.transform( intervalSample.interval.maxValue() ); if ( doAlign ) { x = qRound( x ); y1 = qRound( y1 ); y2 = qRound( y2 ); } minValue.rx() = x; minValue.ry() = y1; maxValue.rx() = x; maxValue.ry() = y2; } else { double y = yMap.transform( intervalSample.value ); double x1 = xMap.transform( intervalSample.interval.minValue() ); double x2 = xMap.transform( intervalSample.interval.maxValue() ); if ( doAlign ) { y = qRound( y ); x1 = qRound( x1 ); x2 = qRound( x2 ); } minValue.rx() = x1; minValue.ry() = y; maxValue.rx() = x2; maxValue.ry() = y; } } if ( d_data->brush.style() != Qt::NoBrush ) { painter->setPen( QPen( Qt::NoPen ) ); painter->setBrush( d_data->brush ); if ( d_data->paintAttributes & ClipPolygons ) { const qreal m = 1.0; const QPolygonF p = QwtClipper::clipPolygonF( canvasRect.adjusted( -m, -m, m, m ), polygon, true ); QwtPainter::drawPolygon( painter, p ); } else { QwtPainter::drawPolygon( painter, polygon ); } } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); painter->setBrush( Qt::NoBrush ); if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF() ); const QRectF clipRect = canvasRect.adjusted( -pw, -pw, pw, pw ); QPolygonF p; p.resize( size ); ::memcpy( p.data(), points, size * sizeof( QPointF ) ); p = QwtClipper::clipPolygonF( clipRect, p ); QwtPainter::drawPolyline( painter, p ); p.resize( size ); ::memcpy( p.data(), points + size, size * sizeof( QPointF ) ); p = QwtClipper::clipPolygonF( clipRect, p ); QwtPainter::drawPolyline( painter, p ); } else { QwtPainter::drawPolyline( painter, points, size ); QwtPainter::drawPolyline( painter, points + size, size ); } } painter->restore(); } /*! Draw symbols for a subset of the samples \param painter Painter \param symbol Interval symbol \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted \sa setSymbol(), drawSeries(), drawTube() */ void QwtPlotIntervalCurve::drawSymbols( QPainter *painter, const QwtIntervalSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { painter->save(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const QRectF tr = QwtScaleMap::invTransform( xMap, yMap, canvasRect ); const double xMin = tr.left(); const double xMax = tr.right(); const double yMin = tr.top(); const double yMax = tr.bottom(); const bool doClip = d_data->paintAttributes & ClipSymbol; for ( int i = from; i <= to; i++ ) { const QwtIntervalSample s = sample( i ); if ( orientation() == Qt::Vertical ) { if ( !doClip || qwtIsVSampleInside( s, xMin, xMax, yMin, yMax ) ) { const double x = xMap.transform( s.value ); const double y1 = yMap.transform( s.interval.minValue() ); const double y2 = yMap.transform( s.interval.maxValue() ); symbol.draw( painter, orientation(), QPointF( x, y1 ), QPointF( x, y2 ) ); } } else { if ( !doClip || qwtIsHSampleInside( s, xMin, xMax, yMin, yMax ) ) { const double y = yMap.transform( s.value ); const double x1 = xMap.transform( s.interval.minValue() ); const double x2 = xMap.transform( s.interval.maxValue() ); symbol.draw( painter, orientation(), QPointF( x1, y ), QPointF( x2, y ) ); } } } painter->restore(); } /*! \return Icon for the legend In case of Tube style() the icon is a plain rectangle filled with the brush(). If a symbol is assigned it is scaled to size. \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotIntervalCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); if ( size.isEmpty() ) return QwtGraphic(); QwtGraphic icon; icon.setDefaultSize( size ); icon.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); if ( d_data->style == Tube ) { QRectF r( 0, 0, size.width(), size.height() ); painter.fillRect( r, d_data->brush ); } if ( d_data->symbol && ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) ) { QPen pen = d_data->symbol->pen(); pen.setWidthF( pen.widthF() ); pen.setCapStyle( Qt::FlatCap ); painter.setPen( pen ); painter.setBrush( d_data->symbol->brush() ); if ( orientation() == Qt::Vertical ) { const double x = 0.5 * size.width(); d_data->symbol->draw( &painter, orientation(), QPointF( x, 0 ), QPointF( x, size.height() - 1.0 ) ); } else { const double y = 0.5 * size.height(); d_data->symbol->draw( &painter, orientation(), QPointF( 0.0, y ), QPointF( size.width() - 1.0, y ) ); } } return icon; } qsstv_9.2.6/qwt/qwt_plot_intervalcurve.h0000664000175000017500000000764013203343610017242 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_INTERVAL_CURVE_H #define QWT_PLOT_INTERVAL_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" class QwtIntervalSymbol; /*! \brief QwtPlotIntervalCurve represents a series of samples, where each value is associated with an interval ( \f$[y1,y2] = f(x)\f$ ). The representation depends on the style() and an optional symbol() that is displayed for each interval. QwtPlotIntervalCurve might be used to display error bars or the area between 2 curves. */ class QWT_EXPORT QwtPlotIntervalCurve: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! \brief Curve styles. The default setting is QwtPlotIntervalCurve::Tube. \sa setStyle(), style() */ enum CurveStyle { /*! Don't draw a curve. Note: This doesn't affect the symbols. */ NoCurve, /*! Build 2 curves from the upper and lower limits of the intervals and draw them with the pen(). The area between the curves is filled with the brush(). */ Tube, /*! Styles >= QwtPlotIntervalCurve::UserCurve are reserved for derived classes that overload drawSeries() with additional application specific curve types. */ UserCurve = 100 }; /*! Attributes to modify the drawing algorithm. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance. */ ClipPolygons = 0x01, //! Check if a symbol is on the plot canvas before painting it. ClipSymbol = 0x02 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotIntervalCurve( const QString &title = QString::null ); explicit QwtPlotIntervalCurve( const QwtText &title ); virtual ~QwtPlotIntervalCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( const QwtIntervalSymbol * ); const QwtIntervalSymbol *symbol() const; virtual void drawSeries( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawTube( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *, const QwtIntervalSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotIntervalCurve::PaintAttributes ) #endif qsstv_9.2.6/qwt/qwt_plot_item.cpp0000664000175000017500000003714613203343610015646 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_item.h" #include "qwt_text.h" #include "qwt_plot.h" #include "qwt_legend_data.h" #include "qwt_scale_div.h" #include "qwt_graphic.h" #include class QwtPlotItem::PrivateData { public: PrivateData(): plot( NULL ), isVisible( true ), attributes( 0 ), interests( 0 ), renderHints( 0 ), renderThreadCount( 1 ), z( 0.0 ), xAxis( QwtPlot::xBottom ), yAxis( QwtPlot::yLeft ), legendIconSize( 8, 8 ) { } mutable QwtPlot *plot; bool isVisible; QwtPlotItem::ItemAttributes attributes; QwtPlotItem::ItemInterests interests; QwtPlotItem::RenderHints renderHints; uint renderThreadCount; double z; int xAxis; int yAxis; QwtText title; QSize legendIconSize; }; /*! Constructor \param title Title of the item */ QwtPlotItem::QwtPlotItem( const QwtText &title ) { d_data = new PrivateData; d_data->title = title; } //! Destroy the QwtPlotItem QwtPlotItem::~QwtPlotItem() { attach( NULL ); delete d_data; } /*! \brief Attach the item to a plot. This method will attach a QwtPlotItem to the QwtPlot argument. It will first detach the QwtPlotItem from any plot from a previous call to attach (if necessary). If a NULL argument is passed, it will detach from any QwtPlot it was attached to. \param plot Plot widget \sa detach() */ void QwtPlotItem::attach( QwtPlot *plot ) { if ( plot == d_data->plot ) return; if ( d_data->plot ) d_data->plot->attachItem( this, false ); d_data->plot = plot; if ( d_data->plot ) d_data->plot->attachItem( this, true ); } /*! \brief This method detaches a QwtPlotItem from any QwtPlot it has been associated with. detach() is equivalent to calling attach( NULL ) \sa attach() */ void QwtPlotItem::detach() { attach( NULL ); } /*! Return rtti for the specific class represented. QwtPlotItem is simply a virtual interface class, and base classes will implement this method with specific rtti values so a user can differentiate them. The rtti value is useful for environments, where the runtime type information is disabled and it is not possible to do a dynamic_cast<...>. \return rtti value \sa RttiValues */ int QwtPlotItem::rtti() const { return Rtti_PlotItem; } //! Return attached plot QwtPlot *QwtPlotItem::plot() const { return d_data->plot; } /*! Plot items are painted in increasing z-order. \return setZ(), QwtPlotDict::itemList() */ double QwtPlotItem::z() const { return d_data->z; } /*! \brief Set the z value Plot items are painted in increasing z-order. \param z Z-value \sa z(), QwtPlotDict::itemList() */ void QwtPlotItem::setZ( double z ) { if ( d_data->z != z ) { if ( d_data->plot ) // update the z order d_data->plot->attachItem( this, false ); d_data->z = z; if ( d_data->plot ) d_data->plot->attachItem( this, true ); itemChanged(); } } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QString &title ) { setTitle( QwtText( title ) ); } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QwtText &title ) { if ( d_data->title != title ) { d_data->title = title; legendChanged(); #if 0 itemChanged(); #endif } } /*! \return Title of the item \sa setTitle() */ const QwtText &QwtPlotItem::title() const { return d_data->title; } /*! Toggle an item attribute \param attribute Attribute type \param on true/false \sa testItemAttribute(), ItemInterest */ void QwtPlotItem::setItemAttribute( ItemAttribute attribute, bool on ) { if ( d_data->attributes.testFlag( attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; if ( attribute == QwtPlotItem::Legend ) legendChanged(); itemChanged(); } } /*! Test an item attribute \param attribute Attribute type \return true/false \sa setItemAttribute(), ItemInterest */ bool QwtPlotItem::testItemAttribute( ItemAttribute attribute ) const { return d_data->attributes.testFlag( attribute ); } /*! Toggle an item interest \param interest Interest type \param on true/false \sa testItemInterest(), ItemAttribute */ void QwtPlotItem::setItemInterest( ItemInterest interest, bool on ) { if ( d_data->interests.testFlag( interest ) != on ) { if ( on ) d_data->interests |= interest; else d_data->interests &= ~interest; itemChanged(); } } /*! Test an item interest \param interest Interest type \return true/false \sa setItemInterest(), ItemAttribute */ bool QwtPlotItem::testItemInterest( ItemInterest interest ) const { return d_data->interests.testFlag( interest ); } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtPlotItem::setRenderHint( RenderHint hint, bool on ) { if ( d_data->renderHints.testFlag( hint ) != on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; itemChanged(); } } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtPlotItem::testRenderHint( RenderHint hint ) const { return d_data->renderHints.testFlag( hint ); } /*! On multi core systems rendering of certain plot item ( f.e QwtPlotRasterItem ) can be done in parallel in several threads. The default setting is set to 1. \param numThreads Number of threads to be used for rendering. If numThreads is set to 0, the system specific ideal thread count is used. The default thread count is 1 ( = no additional threads ) */ void QwtPlotItem::setRenderThreadCount( uint numThreads ) { d_data->renderThreadCount = numThreads; } /*! \return Number of threads to be used for rendering. If numThreads() is set to 0, the system specific ideal thread count is used. */ uint QwtPlotItem::renderThreadCount() const { return d_data->renderThreadCount; } /*! Set the size of the legend icon The default setting is 8x8 pixels \param size Size \sa legendIconSize(), legendIcon() */ void QwtPlotItem::setLegendIconSize( const QSize &size ) { if ( d_data->legendIconSize != size ) { d_data->legendIconSize = size; legendChanged(); } } /*! \return Legend icon size \sa setLegendIconSize(), legendIcon() */ QSize QwtPlotItem::legendIconSize() const { return d_data->legendIconSize; } /*! \return Icon representing the item on the legend The default implementation returns an invalid icon \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotItem::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ) Q_UNUSED( size ) return QwtGraphic(); } /*! \brief Return a default icon from a brush The default icon is a filled rectangle used in several derived classes as legendIcon(). \param brush Fill brush \param size Icon size \return A filled rectangle */ QwtGraphic QwtPlotItem::defaultIcon( const QBrush &brush, const QSizeF &size ) const { QwtGraphic icon; if ( !size.isEmpty() ) { icon.setDefaultSize( size ); QRectF r( 0, 0, size.width(), size.height() ); QPainter painter( &icon ); painter.fillRect( r, brush ); } return icon; } //! Show the item void QwtPlotItem::show() { setVisible( true ); } //! Hide the item void QwtPlotItem::hide() { setVisible( false ); } /*! Show/Hide the item \param on Show if true, otherwise hide \sa isVisible(), show(), hide() */ void QwtPlotItem::setVisible( bool on ) { if ( on != d_data->isVisible ) { d_data->isVisible = on; itemChanged(); } } /*! \return true if visible \sa setVisible(), show(), hide() */ bool QwtPlotItem::isVisible() const { return d_data->isVisible; } /*! Update the legend and call QwtPlot::autoRefresh() for the parent plot. \sa QwtPlot::legendChanged(), QwtPlot::autoRefresh() */ void QwtPlotItem::itemChanged() { if ( d_data->plot ) d_data->plot->autoRefresh(); } /*! Update the legend of the parent plot. \sa QwtPlot::updateLegend(), itemChanged() */ void QwtPlotItem::legendChanged() { if ( testItemAttribute( QwtPlotItem::Legend ) && d_data->plot ) d_data->plot->updateLegend( this ); } /*! Set X and Y axis The item will painted according to the coordinates of its Axes. \param xAxis X Axis ( QwtPlot::xBottom or QwtPlot::xTop ) \param yAxis Y Axis ( QwtPlot::yLeft or QwtPlot::yRight ) \sa setXAxis(), setYAxis(), xAxis(), yAxis(), QwtPlot::Axis */ void QwtPlotItem::setAxes( int xAxis, int yAxis ) { if ( xAxis == QwtPlot::xBottom || xAxis == QwtPlot::xTop ) d_data->xAxis = xAxis; if ( yAxis == QwtPlot::yLeft || yAxis == QwtPlot::yRight ) d_data->yAxis = yAxis; itemChanged(); } /*! Set the X axis The item will painted according to the coordinates its Axes. \param axis X Axis ( QwtPlot::xBottom or QwtPlot::xTop ) \sa setAxes(), setYAxis(), xAxis(), QwtPlot::Axis */ void QwtPlotItem::setXAxis( int axis ) { if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d_data->xAxis = axis; itemChanged(); } } /*! Set the Y axis The item will painted according to the coordinates its Axes. \param axis Y Axis ( QwtPlot::yLeft or QwtPlot::yRight ) \sa setAxes(), setXAxis(), yAxis(), QwtPlot::Axis */ void QwtPlotItem::setYAxis( int axis ) { if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) { d_data->yAxis = axis; itemChanged(); } } //! Return xAxis int QwtPlotItem::xAxis() const { return d_data->xAxis; } //! Return yAxis int QwtPlotItem::yAxis() const { return d_data->yAxis; } /*! \return An invalid bounding rect: QRectF(1.0, 1.0, -2.0, -2.0) \note A width or height < 0.0 is ignored by the autoscaler */ QRectF QwtPlotItem::boundingRect() const { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid } /*! \brief Calculate a hint for the canvas margin When the QwtPlotItem::Margins flag is enabled the plot item indicates, that it needs some margins at the borders of the canvas. This is f.e. used by bar charts to reserve space for displaying the bars. The margins are in target device coordinates ( pixels on screen ) \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \param left Returns the left margin \param top Returns the top margin \param right Returns the right margin \param bottom Returns the bottom margin \return The default implementation returns 0 for all margins \sa QwtPlot::getCanvasMarginsHint(), QwtPlot::updateCanvasMargins() */ void QwtPlotItem::getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom ) const { Q_UNUSED( xMap ); Q_UNUSED( yMap ); Q_UNUSED( canvasRect ); // use QMargins, when we don't need to support Qt < 4.6 anymore left = top = right = bottom = 0.0; } /*! \brief Return all information, that is needed to represent the item on the legend Most items are represented by one entry on the legend showing an icon and a text, but f.e. QwtPlotMultiBarChart displays one entry for each bar. QwtLegendData is basically a list of QVariants that makes it possible to overload and reimplement legendData() to return almost any type of information, that is understood by the receiver that acts as the legend. The default implementation returns one entry with the title() of the item and the legendIcon(). \return Data, that is needed to represent the item on the legend \sa title(), legendIcon(), QwtLegend, QwtPlotLegendItem */ QList QwtPlotItem::legendData() const { QwtLegendData data; QwtText label = title(); label.setRenderFlags( label.renderFlags() & Qt::AlignLeft ); QVariant titleValue; qVariantSetValue( titleValue, label ); data.setValue( QwtLegendData::TitleRole, titleValue ); const QwtGraphic graphic = legendIcon( 0, legendIconSize() ); if ( !graphic.isNull() ) { QVariant iconValue; qVariantSetValue( iconValue, graphic ); data.setValue( QwtLegendData::IconRole, iconValue ); } QList list; list += data; return list; } /*! \brief Update the item to changes of the axes scale division Update the item, when the axes of plot have changed. The default implementation does nothing, but items that depend on the scale division (like QwtPlotGrid()) have to reimplement updateScaleDiv() updateScaleDiv() is only called when the ScaleInterest interest is enabled. The default implementation does nothing. \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes(), ScaleInterest */ void QwtPlotItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv ) { Q_UNUSED( xScaleDiv ); Q_UNUSED( yScaleDiv ); } /*! \brief Update the item to changes of the legend info Plot items that want to display a legend ( not those, that want to be displayed on a legend ! ) will have to implement updateLegend(). updateLegend() is only called when the LegendInterest interest is enabled. The default implementation does nothing. \param item Plot item to be displayed on a legend \param data Attributes how to display item on the legend \sa QwtPlotLegendItem \note Plot items, that want to be displayed on a legend need to enable the QwtPlotItem::Legend flag and to implement legendData() and legendIcon() */ void QwtPlotItem::updateLegend( const QwtPlotItem *item, const QList &data ) { Q_UNUSED( item ); Q_UNUSED( data ); } /*! \brief Calculate the bounding scale rectangle of 2 maps \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Bounding scale rect of the scale maps, not normalized */ QRectF QwtPlotItem::scaleRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { return QRectF( xMap.s1(), yMap.s1(), xMap.sDist(), yMap.sDist() ); } /*! \brief Calculate the bounding paint rectangle of 2 maps \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Bounding paint rectangle of the scale maps, not normalized */ QRectF QwtPlotItem::paintRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { const QRectF rect( xMap.p1(), yMap.p1(), xMap.pDist(), yMap.pDist() ); return rect; } qsstv_9.2.6/qwt/qwt_plot_item.h0000664000175000017500000002023313203343610015300 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ITEM_H #define QWT_PLOT_ITEM_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_legend_data.h" #include "qwt_graphic.h" #include #include #include class QPainter; class QwtScaleMap; class QwtScaleDiv; class QwtPlot; /*! \brief Base class for items on the plot canvas A plot item is "something", that can be painted on the plot canvas, or only affects the scales of the plot widget. They can be categorized as: - Representator\n A "Representator" is an item that represents some sort of data on the plot canvas. The different representator classes are organized according to the characteristics of the data: - QwtPlotMarker Represents a point or a horizontal/vertical coordinate - QwtPlotCurve Represents a series of points - QwtPlotSpectrogram ( QwtPlotRasterItem ) Represents raster data - ... - Decorators\n A "Decorator" is an item, that displays additional information, that is not related to any data: - QwtPlotGrid - QwtPlotScaleItem - QwtPlotSvgItem - ... Depending on the QwtPlotItem::ItemAttribute flags, an item is included into autoscaling or has an entry on the legend. Before misusing the existing item classes it might be better to implement a new type of plot item ( don't implement a watermark as spectrogram ). Deriving a new type of QwtPlotItem primarily means to implement the YourPlotItem::draw() method. \sa The cpuplot example shows the implementation of additional plot items. */ class QWT_EXPORT QwtPlotItem { public: /*! \brief Runtime type information RttiValues is used to cast plot items, without having to enable runtime type information of the compiler. */ enum RttiValues { //! Unspecific value, that can be used, when it doesn't matter Rtti_PlotItem = 0, //! For QwtPlotGrid Rtti_PlotGrid, //! For QwtPlotScaleItem Rtti_PlotScale, //! For QwtPlotLegendItem Rtti_PlotLegend, //! For QwtPlotMarker Rtti_PlotMarker, //! For QwtPlotCurve Rtti_PlotCurve, //! For QwtPlotSpectroCurve Rtti_PlotSpectroCurve, //! For QwtPlotIntervalCurve Rtti_PlotIntervalCurve, //! For QwtPlotHistogram Rtti_PlotHistogram, //! For QwtPlotSpectrogram Rtti_PlotSpectrogram, //! For QwtPlotSvgItem Rtti_PlotSVG, //! For QwtPlotTradingCurve Rtti_PlotTradingCurve, //! For QwtPlotBarChart Rtti_PlotBarChart, //! For QwtPlotMultiBarChart Rtti_PlotMultiBarChart, //! For QwtPlotShapeItem Rtti_PlotShape, //! For QwtPlotTextLabel Rtti_PlotTextLabel, //! For QwtPlotZoneItem Rtti_PlotZone, /*! Values >= Rtti_PlotUserItem are reserved for plot items not implemented in the Qwt library. */ Rtti_PlotUserItem = 1000 }; /*! \brief Plot Item Attributes Various aspects of a plot widget depend on the attributes of the attached plot items. If and how a single plot item participates in these updates depends on its attributes. \sa setItemAttribute(), testItemAttribute(), ItemInterest */ enum ItemAttribute { //! The item is represented on the legend. Legend = 0x01, /*! The boundingRect() of the item is included in the autoscaling calculation as long as its width or height is >= 0.0. */ AutoScale = 0x02, /*! The item needs extra space to display something outside its bounding rectangle. \sa getCanvasMarginHint() */ Margins = 0x04 }; //! Plot Item Attributes typedef QFlags ItemAttributes; /*! \brief Plot Item Interests Plot items might depend on the situation of the corresponding plot widget. By enabling an interest the plot item will be notified, when the corresponding attribute of the plot widgets has changed. \sa setItemAttribute(), testItemAttribute(), ItemInterest */ enum ItemInterest { /*! The item is interested in updates of the scales \sa updateScaleDiv() */ ScaleInterest = 0x01, /*! The item is interested in updates of the legend ( of other items ) This flag is intended for items, that want to implement a legend for displaying entries of other plot item. \note If the plot item wants to be represented on a legend enable QwtPlotItem::Legend instead. \sa updateLegend() */ LegendInterest = 0x02 }; //! Plot Item Interests typedef QFlags ItemInterests; //! Render hints enum RenderHint { //! Enable antialiasing RenderAntialiased = 0x1 }; //! Render hints typedef QFlags RenderHints; explicit QwtPlotItem( const QwtText &title = QwtText() ); virtual ~QwtPlotItem(); void attach( QwtPlot *plot ); void detach(); QwtPlot *plot() const; void setTitle( const QString &title ); void setTitle( const QwtText &title ); const QwtText &title() const; virtual int rtti() const; void setItemAttribute( ItemAttribute, bool on = true ); bool testItemAttribute( ItemAttribute ) const; void setItemInterest( ItemInterest, bool on = true ); bool testItemInterest( ItemInterest ) const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; void setRenderThreadCount( uint numThreads ); uint renderThreadCount() const; void setLegendIconSize( const QSize & ); QSize legendIconSize() const; double z() const; void setZ( double z ); void show(); void hide(); virtual void setVisible( bool ); bool isVisible () const; void setAxes( int xAxis, int yAxis ); void setXAxis( int axis ); int xAxis() const; void setYAxis( int axis ); int yAxis() const; virtual void itemChanged(); virtual void legendChanged(); /*! \brief Draw the item \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas in painter coordinates */ virtual void draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const = 0; virtual QRectF boundingRect() const; virtual void getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasSize, double &left, double &top, double &right, double &bottom) const; virtual void updateScaleDiv( const QwtScaleDiv&, const QwtScaleDiv& ); virtual void updateLegend( const QwtPlotItem *, const QList & ); QRectF scaleRect( const QwtScaleMap &, const QwtScaleMap & ) const; QRectF paintRect( const QwtScaleMap &, const QwtScaleMap & ) const; virtual QList legendData() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: QwtGraphic defaultIcon( const QBrush &, const QSizeF & ) const; private: // Disabled copy constructor and operator= QwtPlotItem( const QwtPlotItem & ); QwtPlotItem &operator=( const QwtPlotItem & ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::ItemAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::ItemInterests ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::RenderHints ) Q_DECLARE_METATYPE( QwtPlotItem * ) #endif qsstv_9.2.6/qwt/qwt_plot_layout.cpp0000664000175000017500000012561513203343610016224 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_layout.h" #include "qwt_text.h" #include "qwt_text_label.h" #include "qwt_scale_widget.h" #include "qwt_abstract_legend.h" #include #include class QwtPlotLayout::LayoutData { public: void init( const QwtPlot *, const QRectF &rect ); struct t_legendData { int frameWidth; int hScrollExtent; int vScrollExtent; QSize hint; } legend; struct t_titleData { QwtText text; int frameWidth; } title; struct t_footerData { QwtText text; int frameWidth; } footer; struct t_scaleData { bool isEnabled; const QwtScaleWidget *scaleWidget; QFont scaleFont; int start; int end; int baseLineOffset; double tickOffset; int dimWithoutTitle; } scale[QwtPlot::axisCnt]; struct t_canvasData { int contentsMargins[ QwtPlot::axisCnt ]; } canvas; }; /* Extract all layout relevant data from the plot components */ void QwtPlotLayout::LayoutData::init( const QwtPlot *plot, const QRectF &rect ) { // legend if ( plot->legend() ) { legend.frameWidth = plot->legend()->frameWidth(); legend.hScrollExtent = plot->legend()->scrollExtent( Qt::Horizontal ); legend.vScrollExtent = plot->legend()->scrollExtent( Qt::Vertical ); const QSize hint = plot->legend()->sizeHint(); int w = qMin( hint.width(), qFloor( rect.width() ) ); int h = plot->legend()->heightForWidth( w ); if ( h <= 0 ) h = hint.height(); if ( h > rect.height() ) w += legend.hScrollExtent; legend.hint = QSize( w, h ); } // title title.frameWidth = 0; title.text = QwtText(); if ( plot->titleLabel() ) { const QwtTextLabel *label = plot->titleLabel(); title.text = label->text(); if ( !( title.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) title.text.setFont( label->font() ); title.frameWidth = plot->titleLabel()->frameWidth(); } // footer footer.frameWidth = 0; footer.text = QwtText(); if ( plot->footerLabel() ) { const QwtTextLabel *label = plot->footerLabel(); footer.text = label->text(); if ( !( footer.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) footer.text.setFont( label->font() ); footer.frameWidth = plot->footerLabel()->frameWidth(); } // scales for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scaleWidget = plot->axisWidget( axis ); scale[axis].isEnabled = true; scale[axis].scaleWidget = scaleWidget; scale[axis].scaleFont = scaleWidget->font(); scale[axis].start = scaleWidget->startBorderDist(); scale[axis].end = scaleWidget->endBorderDist(); scale[axis].baseLineOffset = scaleWidget->margin(); scale[axis].tickOffset = scaleWidget->margin(); if ( scaleWidget->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) { scale[axis].tickOffset += scaleWidget->scaleDraw()->maxTickLength(); } scale[axis].dimWithoutTitle = scaleWidget->dimForLength( QWIDGETSIZE_MAX, scale[axis].scaleFont ); if ( !scaleWidget->title().isEmpty() ) { scale[axis].dimWithoutTitle -= scaleWidget->titleHeightForWidth( QWIDGETSIZE_MAX ); } } else { scale[axis].isEnabled = false; scale[axis].start = 0; scale[axis].end = 0; scale[axis].baseLineOffset = 0; scale[axis].tickOffset = 0.0; scale[axis].dimWithoutTitle = 0; } } // canvas plot->canvas()->getContentsMargins( &canvas.contentsMargins[ QwtPlot::yLeft ], &canvas.contentsMargins[ QwtPlot::xTop ], &canvas.contentsMargins[ QwtPlot::yRight ], &canvas.contentsMargins[ QwtPlot::xBottom ] ); } class QwtPlotLayout::PrivateData { public: PrivateData(): spacing( 5 ) { } QRectF titleRect; QRectF footerRect; QRectF legendRect; QRectF scaleRect[QwtPlot::axisCnt]; QRectF canvasRect; QwtPlotLayout::LayoutData layoutData; QwtPlot::LegendPosition legendPos; double legendRatio; unsigned int spacing; unsigned int canvasMargin[QwtPlot::axisCnt]; bool alignCanvasToScales[QwtPlot::axisCnt]; }; /*! \brief Constructor */ QwtPlotLayout::QwtPlotLayout() { d_data = new PrivateData; setLegendPosition( QwtPlot::BottomLegend ); setCanvasMargin( 4 ); setAlignCanvasToScales( false ); invalidate(); } //! Destructor QwtPlotLayout::~QwtPlotLayout() { delete d_data; } /*! Change a margin of the canvas. The margin is the space above/below the scale ticks. A negative margin will be set to -1, excluding the borders of the scales. \param margin New margin \param axis One of QwtPlot::Axis. Specifies where the position of the margin. -1 means margin at all borders. \sa canvasMargin() \warning The margin will have no effect when alignCanvasToScale() is true */ void QwtPlotLayout::setCanvasMargin( int margin, int axis ) { if ( margin < -1 ) margin = -1; if ( axis == -1 ) { for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->canvasMargin[axis] = margin; } else if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->canvasMargin[axis] = margin; } /*! \param axisId Axis index \return Margin around the scale tick borders \sa setCanvasMargin() */ int QwtPlotLayout::canvasMargin( int axisId ) const { if ( axisId < 0 || axisId >= QwtPlot::axisCnt ) return 0; return d_data->canvasMargin[axisId]; } /*! \brief Set the align-canvas-to-axis-scales flag for all axes \param on True/False \sa setAlignCanvasToScale(), alignCanvasToScale() */ void QwtPlotLayout::setAlignCanvasToScales( bool on ) { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->alignCanvasToScales[axis] = on; } /*! Change the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size, - align with the axis scale ends to control its size. The axisId parameter is somehow confusing as it identifies a border of the plot and not the axes, that are aligned. F.e when QwtPlot::yLeft is set, the left end of the the x-axes ( QwtPlot::xTop, QwtPlot::xBottom ) is aligned. \param axisId Axis index \param on New align-canvas-to-axis-scales setting \sa setCanvasMargin(), alignCanvasToScale(), setAlignCanvasToScales() \warning In case of on == true canvasMargin() will have no effect */ void QwtPlotLayout::setAlignCanvasToScale( int axisId, bool on ) { if ( axisId >= 0 && axisId < QwtPlot::axisCnt ) d_data->alignCanvasToScales[axisId] = on; } /*! Return the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size - align with the axis scale ends to control its size. \param axisId Axis index \return align-canvas-to-axis-scales setting \sa setAlignCanvasToScale(), setAlignCanvasToScale(), setCanvasMargin() */ bool QwtPlotLayout::alignCanvasToScale( int axisId ) const { if ( axisId < 0 || axisId >= QwtPlot::axisCnt ) return false; return d_data->alignCanvasToScales[ axisId ]; } /*! Change the spacing of the plot. The spacing is the distance between the plot components. \param spacing New spacing \sa setCanvasMargin(), spacing() */ void QwtPlotLayout::setSpacing( int spacing ) { d_data->spacing = qMax( 0, spacing ); } /*! \return Spacing \sa margin(), setSpacing() */ int QwtPlotLayout::spacing() const { return d_data->spacing; } /*! \brief Specify the position of the legend \param pos The legend's position. \param ratio Ratio between legend and the bounding rectangle of title, footer, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos, double ratio ) { if ( ratio > 1.0 ) ratio = 1.0; switch ( pos ) { case QwtPlot::TopLegend: case QwtPlot::BottomLegend: if ( ratio <= 0.0 ) ratio = 0.33; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::LeftLegend: case QwtPlot::RightLegend: if ( ratio <= 0.0 ) ratio = 0.5; d_data->legendRatio = ratio; d_data->legendPos = pos; break; default: break; } } /*! \brief Specify the position of the legend \param pos The legend's position. Valid values are \c QwtPlot::LeftLegend, \c QwtPlot::RightLegend, \c QwtPlot::TopLegend, \c QwtPlot::BottomLegend. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos ) { setLegendPosition( pos, 0.0 ); } /*! \return Position of the legend \sa setLegendPosition(), QwtPlot::setLegendPosition(), QwtPlot::legendPosition() */ QwtPlot::LegendPosition QwtPlotLayout::legendPosition() const { return d_data->legendPos; } /*! Specify the relative size of the legend in the plot \param ratio Ratio between legend and the bounding rectangle of title, footer, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. */ void QwtPlotLayout::setLegendRatio( double ratio ) { setLegendPosition( legendPosition(), ratio ); } /*! \return The relative size of the legend in the plot. \sa setLegendPosition() */ double QwtPlotLayout::legendRatio() const { return d_data->legendRatio; } /*! \brief Set the geometry for the title This method is intended to be used from derived layouts overloading activate() \sa titleRect(), activate() */ void QwtPlotLayout::setTitleRect( const QRectF &rect ) { d_data->titleRect = rect; } /*! \return Geometry for the title \sa activate(), invalidate() */ QRectF QwtPlotLayout::titleRect() const { return d_data->titleRect; } /*! \brief Set the geometry for the footer This method is intended to be used from derived layouts overloading activate() \sa footerRect(), activate() */ void QwtPlotLayout::setFooterRect( const QRectF &rect ) { d_data->footerRect = rect; } /*! \return Geometry for the footer \sa activate(), invalidate() */ QRectF QwtPlotLayout::footerRect() const { return d_data->footerRect; } /*! \brief Set the geometry for the legend This method is intended to be used from derived layouts overloading activate() \param rect Rectangle for the legend \sa legendRect(), activate() */ void QwtPlotLayout::setLegendRect( const QRectF &rect ) { d_data->legendRect = rect; } /*! \return Geometry for the legend \sa activate(), invalidate() */ QRectF QwtPlotLayout::legendRect() const { return d_data->legendRect; } /*! \brief Set the geometry for an axis This method is intended to be used from derived layouts overloading activate() \param axis Axis index \param rect Rectangle for the scale \sa scaleRect(), activate() */ void QwtPlotLayout::setScaleRect( int axis, const QRectF &rect ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->scaleRect[axis] = rect; } /*! \param axis Axis index \return Geometry for the scale \sa activate(), invalidate() */ QRectF QwtPlotLayout::scaleRect( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) { static QRectF dummyRect; return dummyRect; } return d_data->scaleRect[axis]; } /*! \brief Set the geometry for the canvas This method is intended to be used from derived layouts overloading activate() \sa canvasRect(), activate() */ void QwtPlotLayout::setCanvasRect( const QRectF &rect ) { d_data->canvasRect = rect; } /*! \return Geometry for the canvas \sa activate(), invalidate() */ QRectF QwtPlotLayout::canvasRect() const { return d_data->canvasRect; } /*! Invalidate the geometry of all components. \sa activate() */ void QwtPlotLayout::invalidate() { d_data->titleRect = d_data->footerRect = d_data->legendRect = d_data->canvasRect = QRect(); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->scaleRect[axis] = QRect(); } /*! \return Minimum size hint \param plot Plot widget \sa QwtPlot::minimumSizeHint() */ QSize QwtPlotLayout::minimumSizeHint( const QwtPlot *plot ) const { class ScaleData { public: ScaleData() { w = h = minLeft = minRight = tickOffset = 0; } int w; int h; int minLeft; int minRight; int tickOffset; } scaleData[QwtPlot::axisCnt]; int canvasBorder[QwtPlot::axisCnt]; int fw; plot->canvas()->getContentsMargins( &fw, NULL, NULL, NULL ); int axis; for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scl = plot->axisWidget( axis ); ScaleData &sd = scaleData[axis]; const QSize hint = scl->minimumSizeHint(); sd.w = hint.width(); sd.h = hint.height(); scl->getBorderDistHint( sd.minLeft, sd.minRight ); sd.tickOffset = scl->margin(); if ( scl->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) sd.tickOffset += qCeil( scl->scaleDraw()->maxTickLength() ); } canvasBorder[axis] = fw + d_data->canvasMargin[axis] + 1; } for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { ScaleData &sd = scaleData[axis]; if ( sd.w && ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::yLeft] ) && scaleData[QwtPlot::yLeft].w ) { int shiftLeft = sd.minLeft - canvasBorder[QwtPlot::yLeft]; if ( shiftLeft > scaleData[QwtPlot::yLeft].w ) shiftLeft = scaleData[QwtPlot::yLeft].w; sd.w -= shiftLeft; } if ( ( sd.minRight > canvasBorder[QwtPlot::yRight] ) && scaleData[QwtPlot::yRight].w ) { int shiftRight = sd.minRight - canvasBorder[QwtPlot::yRight]; if ( shiftRight > scaleData[QwtPlot::yRight].w ) shiftRight = scaleData[QwtPlot::yRight].w; sd.w -= shiftRight; } } if ( sd.h && ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::xBottom] ) && scaleData[QwtPlot::xBottom].h ) { int shiftBottom = sd.minLeft - canvasBorder[QwtPlot::xBottom]; if ( shiftBottom > scaleData[QwtPlot::xBottom].tickOffset ) shiftBottom = scaleData[QwtPlot::xBottom].tickOffset; sd.h -= shiftBottom; } if ( ( sd.minLeft > canvasBorder[QwtPlot::xTop] ) && scaleData[QwtPlot::xTop].h ) { int shiftTop = sd.minRight - canvasBorder[QwtPlot::xTop]; if ( shiftTop > scaleData[QwtPlot::xTop].tickOffset ) shiftTop = scaleData[QwtPlot::xTop].tickOffset; sd.h -= shiftTop; } } } const QWidget *canvas = plot->canvas(); int left, top, right, bottom; canvas->getContentsMargins( &left, &top, &right, &bottom ); const QSize minCanvasSize = canvas->minimumSize(); int w = scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; int cw = qMax( scaleData[QwtPlot::xBottom].w, scaleData[QwtPlot::xTop].w ) + left + 1 + right + 1; w += qMax( cw, minCanvasSize.width() ); int h = scaleData[QwtPlot::xBottom].h + scaleData[QwtPlot::xTop].h; int ch = qMax( scaleData[QwtPlot::yLeft].h, scaleData[QwtPlot::yRight].h ) + top + 1 + bottom + 1; h += qMax( ch, minCanvasSize.height() ); const QwtTextLabel *labels[2]; labels[0] = plot->titleLabel(); labels[1] = plot->footerLabel(); for ( int i = 0; i < 2; i++ ) { const QwtTextLabel *label = labels[i]; if ( label && !label->text().isEmpty() ) { // If only QwtPlot::yLeft or QwtPlot::yRight is showing, // we center on the plot canvas. const bool centerOnCanvas = !( plot->axisEnabled( QwtPlot::yLeft ) && plot->axisEnabled( QwtPlot::yRight ) ); int labelW = w; if ( centerOnCanvas ) { labelW -= scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } int labelH = label->heightForWidth( labelW ); if ( labelH > labelW ) // Compensate for a long title { w = labelW = labelH; if ( centerOnCanvas ) { w += scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } labelH = label->heightForWidth( labelW ); } h += labelH + d_data->spacing; } } // Compute the legend contribution const QwtAbstractLegend *legend = plot->legend(); if ( legend && !legend->isEmpty() ) { if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { int legendW = legend->sizeHint().width(); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) w += d_data->spacing; if ( legendH > h ) legendW += legend->scrollExtent( Qt::Horizontal ); if ( d_data->legendRatio < 1.0 ) legendW = qMin( legendW, int( w / ( 1.0 - d_data->legendRatio ) ) ); w += legendW + d_data->spacing; } else // QwtPlot::Top, QwtPlot::Bottom { int legendW = qMin( legend->sizeHint().width(), w ); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) h += d_data->spacing; if ( d_data->legendRatio < 1.0 ) legendH = qMin( legendH, int( h / ( 1.0 - d_data->legendRatio ) ) ); h += legendH + d_data->spacing; } } return QSize( w, h ); } /*! Find the geometry for the legend \param options Options how to layout the legend \param rect Rectangle where to place the legend \return Geometry for the legend \sa Options */ QRectF QwtPlotLayout::layoutLegend( Options options, const QRectF &rect ) const { const QSize hint( d_data->layoutData.legend.hint ); int dim; if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { // We don't allow vertical legends to take more than // half of the available space. dim = qMin( hint.width(), int( rect.width() * d_data->legendRatio ) ); if ( !( options & IgnoreScrollbars ) ) { if ( hint.height() > rect.height() ) { // The legend will need additional // space for the vertical scrollbar. dim += d_data->layoutData.legend.hScrollExtent; } } } else { dim = qMin( hint.height(), int( rect.height() * d_data->legendRatio ) ); dim = qMax( dim, d_data->layoutData.legend.vScrollExtent ); } QRectF legendRect = rect; switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: legendRect.setWidth( dim ); break; case QwtPlot::RightLegend: legendRect.setX( rect.right() - dim ); legendRect.setWidth( dim ); break; case QwtPlot::TopLegend: legendRect.setHeight( dim ); break; case QwtPlot::BottomLegend: legendRect.setY( rect.bottom() - dim ); legendRect.setHeight( dim ); break; } return legendRect; } /*! Align the legend to the canvas \param canvasRect Geometry of the canvas \param legendRect Maximum geometry for the legend \return Geometry for the aligned legend */ QRectF QwtPlotLayout::alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const { QRectF alignedRect = legendRect; if ( d_data->legendPos == QwtPlot::BottomLegend || d_data->legendPos == QwtPlot::TopLegend ) { if ( d_data->layoutData.legend.hint.width() < canvasRect.width() ) { alignedRect.setX( canvasRect.x() ); alignedRect.setWidth( canvasRect.width() ); } } else { if ( d_data->layoutData.legend.hint.height() < canvasRect.height() ) { alignedRect.setY( canvasRect.y() ); alignedRect.setHeight( canvasRect.height() ); } } return alignedRect; } /*! Expand all line breaks in text labels, and calculate the height of their widgets in orientation of the text. \param options Options how to layout the legend \param rect Bounding rectangle for title, footer, axes and canvas. \param dimTitle Expanded height of the title widget \param dimFooter Expanded height of the footer widget \param dimAxis Expanded heights of the axis in axis orientation. \sa Options */ void QwtPlotLayout::expandLineBreaks( Options options, const QRectF &rect, int &dimTitle, int &dimFooter, int dimAxis[QwtPlot::axisCnt] ) const { dimTitle = dimFooter = 0; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) dimAxis[axis] = 0; int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.contentsMargins[ axis ]; if ( !d_data->alignCanvasToScales[axis] ) backboneOffset[axis] += d_data->canvasMargin[axis]; } bool done = false; while ( !done ) { done = true; // the size for the 4 axis depend on each other. Expanding // the height of a horizontal axis will shrink the height // for the vertical axis, shrinking the height of a vertical // axis will result in a line break what will expand the // width and results in shrinking the width of a horizontal // axis what might result in a line break of a horizontal // axis ... . So we loop as long until no size changes. if ( !( ( options & IgnoreTitle ) || d_data->layoutData.title.text.isEmpty() ) ) { double w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.title.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.title.frameWidth; if ( d > dimTitle ) { dimTitle = d; done = false; } } if ( !( ( options & IgnoreFooter ) || d_data->layoutData.footer.text.isEmpty() ) ) { double w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.footer.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.footer.frameWidth; if ( d > dimFooter ) { dimFooter = d; done = false; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { const struct LayoutData::t_scaleData &scaleData = d_data->layoutData.scale[axis]; if ( scaleData.isEnabled ) { double length; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { length = rect.width() - dimAxis[QwtPlot::yLeft] - dimAxis[QwtPlot::yRight]; length -= scaleData.start + scaleData.end; if ( dimAxis[QwtPlot::yRight] > 0 ) length -= 1; length += qMin( dimAxis[QwtPlot::yLeft], scaleData.start - backboneOffset[QwtPlot::yLeft] ); length += qMin( dimAxis[QwtPlot::yRight], scaleData.end - backboneOffset[QwtPlot::yRight] ); } else // QwtPlot::yLeft, QwtPlot::yRight { length = rect.height() - dimAxis[QwtPlot::xTop] - dimAxis[QwtPlot::xBottom]; length -= scaleData.start + scaleData.end; length -= 1; if ( dimAxis[QwtPlot::xBottom] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xTop] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xBottom] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xBottom].tickOffset, double( scaleData.start - backboneOffset[QwtPlot::xBottom] ) ); } if ( dimAxis[QwtPlot::xTop] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xTop].tickOffset, double( scaleData.end - backboneOffset[QwtPlot::xTop] ) ); } if ( dimTitle > 0 ) length -= dimTitle + d_data->spacing; } int d = scaleData.dimWithoutTitle; if ( !scaleData.scaleWidget->title().isEmpty() ) { d += scaleData.scaleWidget->titleHeightForWidth( qFloor( length ) ); } if ( d > dimAxis[axis] ) { dimAxis[axis] = d; done = false; } } } } } /*! Align the ticks of the axis to the canvas borders using the empty corners. \param options Layout options \param canvasRect Geometry of the canvas ( IN/OUT ) \param scaleRect Geometries of the scales ( IN/OUT ) \sa Options */ void QwtPlotLayout::alignScales( Options options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const { int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales[axis] ) { backboneOffset[axis] += d_data->canvasMargin[axis]; } if ( !( options & IgnoreFrames ) ) { backboneOffset[axis] += d_data->layoutData.canvas.contentsMargins[axis]; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; const int startDist = d_data->layoutData.scale[axis].start; const int endDist = d_data->layoutData.scale[axis].end; QRectF &axisRect = scaleRect[axis]; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { const QRectF &leftScaleRect = scaleRect[QwtPlot::yLeft]; const int leftOffset = backboneOffset[QwtPlot::yLeft] - startDist; if ( leftScaleRect.isValid() ) { const double dx = leftOffset + leftScaleRect.width(); if ( d_data->alignCanvasToScales[QwtPlot::yLeft] && dx < 0.0 ) { /* The axis needs more space than the width of the left scale. */ const double cLeft = canvasRect.left(); // qreal -> double canvasRect.setLeft( qMax( cLeft, axisRect.left() - dx ) ); } else { const double minLeft = leftScaleRect.left(); const double left = axisRect.left() + leftOffset; axisRect.setLeft( qMax( left, minLeft ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::yLeft] && leftOffset < 0 ) { canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - leftOffset ) ); } else { if ( leftOffset > 0 ) axisRect.setLeft( axisRect.left() + leftOffset ); } } const QRectF &rightScaleRect = scaleRect[QwtPlot::yRight]; const int rightOffset = backboneOffset[QwtPlot::yRight] - endDist + 1; if ( rightScaleRect.isValid() ) { const double dx = rightOffset + rightScaleRect.width(); if ( d_data->alignCanvasToScales[QwtPlot::yRight] && dx < 0 ) { /* The axis needs more space than the width of the right scale. */ const double cRight = canvasRect.right(); // qreal -> double canvasRect.setRight( qMin( cRight, axisRect.right() + dx ) ); } const double maxRight = rightScaleRect.right(); const double right = axisRect.right() - rightOffset; axisRect.setRight( qMin( right, maxRight ) ); } else { if ( d_data->alignCanvasToScales[QwtPlot::yRight] && rightOffset < 0 ) { canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + rightOffset ) ); } else { if ( rightOffset > 0 ) axisRect.setRight( axisRect.right() - rightOffset ); } } } else // QwtPlot::yLeft, QwtPlot::yRight { const QRectF &bottomScaleRect = scaleRect[QwtPlot::xBottom]; const int bottomOffset = backboneOffset[QwtPlot::xBottom] - endDist + 1; if ( bottomScaleRect.isValid() ) { const double dy = bottomOffset + bottomScaleRect.height(); if ( d_data->alignCanvasToScales[QwtPlot::xBottom] && dy < 0 ) { /* The axis needs more space than the height of the bottom scale. */ const double cBottom = canvasRect.bottom(); // qreal -> double canvasRect.setBottom( qMin( cBottom, axisRect.bottom() + dy ) ); } else { const double maxBottom = bottomScaleRect.top() + d_data->layoutData.scale[QwtPlot::xBottom].tickOffset; const double bottom = axisRect.bottom() - bottomOffset; axisRect.setBottom( qMin( bottom, maxBottom ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xBottom] && bottomOffset < 0 ) { canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + bottomOffset ) ); } else { if ( bottomOffset > 0 ) axisRect.setBottom( axisRect.bottom() - bottomOffset ); } } const QRectF &topScaleRect = scaleRect[QwtPlot::xTop]; const int topOffset = backboneOffset[QwtPlot::xTop] - startDist; if ( topScaleRect.isValid() ) { const double dy = topOffset + topScaleRect.height(); if ( d_data->alignCanvasToScales[QwtPlot::xTop] && dy < 0 ) { /* The axis needs more space than the height of the top scale. */ const double cTop = canvasRect.top(); // qreal -> double canvasRect.setTop( qMax( cTop, axisRect.top() - dy ) ); } else { const double minTop = topScaleRect.bottom() - d_data->layoutData.scale[QwtPlot::xTop].tickOffset; const double top = axisRect.top() + topOffset; axisRect.setTop( qMax( top, minTop ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xTop] && topOffset < 0 ) { canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - topOffset ) ); } else { if ( topOffset > 0 ) axisRect.setTop( axisRect.top() + topOffset ); } } } } /* The canvas has been aligned to the scale with largest border distances. Now we have to realign the other scale. */ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { QRectF &sRect = scaleRect[axis]; if ( !sRect.isValid() ) continue; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { if ( d_data->alignCanvasToScales[QwtPlot::yLeft] ) { double y = canvasRect.left() - d_data->layoutData.scale[axis].start; if ( !( options & IgnoreFrames ) ) y += d_data->layoutData.canvas.contentsMargins[ QwtPlot::yLeft ]; sRect.setLeft( y ); } if ( d_data->alignCanvasToScales[QwtPlot::yRight] ) { double y = canvasRect.right() - 1 + d_data->layoutData.scale[axis].end; if ( !( options & IgnoreFrames ) ) y -= d_data->layoutData.canvas.contentsMargins[ QwtPlot::yRight ]; sRect.setRight( y ); } if ( d_data->alignCanvasToScales[ axis ] ) { if ( axis == QwtPlot::xTop ) sRect.setBottom( canvasRect.top() ); else sRect.setTop( canvasRect.bottom() ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xTop] ) { double x = canvasRect.top() - d_data->layoutData.scale[axis].start; if ( !( options & IgnoreFrames ) ) x += d_data->layoutData.canvas.contentsMargins[ QwtPlot::xTop ]; sRect.setTop( x ); } if ( d_data->alignCanvasToScales[QwtPlot::xBottom] ) { double x = canvasRect.bottom() - 1 + d_data->layoutData.scale[axis].end; if ( !( options & IgnoreFrames ) ) x -= d_data->layoutData.canvas.contentsMargins[ QwtPlot::xBottom ]; sRect.setBottom( x ); } if ( d_data->alignCanvasToScales[ axis ] ) { if ( axis == QwtPlot::yLeft ) sRect.setRight( canvasRect.left() ); else sRect.setLeft( canvasRect.right() ); } } } } /*! \brief Recalculate the geometry of all components. \param plot Plot to be layout \param plotRect Rectangle where to place the components \param options Layout options \sa invalidate(), titleRect(), footerRect() legendRect(), scaleRect(), canvasRect() */ void QwtPlotLayout::activate( const QwtPlot *plot, const QRectF &plotRect, Options options ) { invalidate(); QRectF rect( plotRect ); // undistributed rest of the plot rect // We extract all layout relevant parameters from the widgets, // and save them to d_data->layoutData. d_data->layoutData.init( plot, rect ); if ( !( options & IgnoreLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { d_data->legendRect = layoutLegend( options, rect ); // subtract d_data->legendRect from rect const QRegion region( rect.toRect() ); rect = region.subtracted( d_data->legendRect.toRect() ).boundingRect(); switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: rect.setLeft( rect.left() + d_data->spacing ); break; case QwtPlot::RightLegend: rect.setRight( rect.right() - d_data->spacing ); break; case QwtPlot::TopLegend: rect.setTop( rect.top() + d_data->spacing ); break; case QwtPlot::BottomLegend: rect.setBottom( rect.bottom() - d_data->spacing ); break; } } /* +---+-----------+---+ | Title | +---+-----------+---+ | | Axis | | +---+-----------+---+ | A | | A | | x | Canvas | x | | i | | i | | s | | s | +---+-----------+---+ | | Axis | | +---+-----------+---+ | Footer | +---+-----------+---+ */ // title, footer and axes include text labels. The height of each // label depends on its line breaks, that depend on the width // for the label. A line break in a horizontal text will reduce // the available width for vertical texts and vice versa. // expandLineBreaks finds the height/width for title, footer and axes // including all line breaks. int dimTitle, dimFooter, dimAxes[QwtPlot::axisCnt]; expandLineBreaks( options, rect, dimTitle, dimFooter, dimAxes ); if ( dimTitle > 0 ) { d_data->titleRect.setRect( rect.left(), rect.top(), rect.width(), dimTitle ); rect.setTop( d_data->titleRect.bottom() + d_data->spacing ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the title centered to the canvas d_data->titleRect.setX( rect.left() + dimAxes[QwtPlot::yLeft] ); d_data->titleRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } } if ( dimFooter > 0 ) { d_data->footerRect.setRect( rect.left(), rect.bottom() - dimFooter, rect.width(), dimFooter ); rect.setBottom( d_data->footerRect.top() - d_data->spacing ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the footer centered to the canvas d_data->footerRect.setX( rect.left() + dimAxes[QwtPlot::yLeft] ); d_data->footerRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } } d_data->canvasRect.setRect( rect.x() + dimAxes[QwtPlot::yLeft], rect.y() + dimAxes[QwtPlot::xTop], rect.width() - dimAxes[QwtPlot::yRight] - dimAxes[QwtPlot::yLeft], rect.height() - dimAxes[QwtPlot::xBottom] - dimAxes[QwtPlot::xTop] ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { // set the rects for the axes if ( dimAxes[axis] ) { int dim = dimAxes[axis]; QRectF &scaleRect = d_data->scaleRect[axis]; scaleRect = d_data->canvasRect; switch ( axis ) { case QwtPlot::yLeft: scaleRect.setX( d_data->canvasRect.left() - dim ); scaleRect.setWidth( dim ); break; case QwtPlot::yRight: scaleRect.setX( d_data->canvasRect.right() ); scaleRect.setWidth( dim ); break; case QwtPlot::xBottom: scaleRect.setY( d_data->canvasRect.bottom() ); scaleRect.setHeight( dim ); break; case QwtPlot::xTop: scaleRect.setY( d_data->canvasRect.top() - dim ); scaleRect.setHeight( dim ); break; } scaleRect = scaleRect.normalized(); } } // +---+-----------+---+ // | <- Axis -> | // +-^-+-----------+-^-+ // | | | | | | // | | | | // | A | | A | // | x | Canvas | x | // | i | | i | // | s | | s | // | | | | // | | | | | | // +-V-+-----------+-V-+ // | <- Axis -> | // +---+-----------+---+ // The ticks of the axes - not the labels above - should // be aligned to the canvas. So we try to use the empty // corners to extend the axes, so that the label texts // left/right of the min/max ticks are moved into them. alignScales( options, d_data->canvasRect, d_data->scaleRect ); if ( !d_data->legendRect.isEmpty() ) { // We prefer to align the legend to the canvas - not to // the complete plot - if possible. d_data->legendRect = alignLegend( d_data->canvasRect, d_data->legendRect ); } } qsstv_9.2.6/qwt/qwt_plot_layout.h0000664000175000017500000000622413203343610015663 0ustar jomajoma/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_LAYOUT_H #define QWT_PLOT_LAYOUT_H #include "qwt_global.h" #include "qwt_plot.h" /*! \brief Layout engine for QwtPlot. It is used by the QwtPlot widget to organize its internal widgets or by QwtPlot::print() to render its content to a QPaintDevice like a QPrinter, QPixmap/QImage or QSvgRenderer. \sa QwtPlot::setPlotLayout() */ class QWT_EXPORT QwtPlotLayout { public: /*! Options to configure the plot layout engine \sa activate(), QwtPlotRenderer */ enum Option { //! Unused AlignScales = 0x01, /*! Ignore the dimension of the scrollbars. There are no scrollbars, when the plot is not rendered to widgets. */ IgnoreScrollbars = 0x02, //! Ignore all frames. IgnoreFrames = 0x04, //! Ignore the legend. IgnoreLegend = 0x08, //! Ignore the title. IgnoreTitle = 0x10, //! Ignore the footer. IgnoreFooter = 0x20 }; //! Layout options typedef QFlags

p~ះK~oܠ7 &[4<"^_lp տ +9xaM]@G,LpL×= tV8f7y ܠUHXw0yWϳ>GoT?oß-/G |T"'&^hvQ]MzjS";KM^ K6$QSdĺD5aGD ^B+0-c DIBH谮ck huz:P+ d&1mOV+cZjS.!C9VsAׄ Bgl+Gfz–N> d3ҢvtXw@!!UEN#6v5aKPg=ͱUbr!aLxb61S⑦=qBPT*7(P^tM-/)B 5+H)*툍+XUUȆIxiP & LG,")U ]&b+Y-0煙#Bc'_i.4eCi%f:kq.4Ct 2 ILۜIܔBh>AyJz^ђo 02BT:{?]rK^4]BT eiLC]' jW!y_0;m%iGh5ul$)cްb`-ڳ{VJMsYJZ~DtMp+f%-s#\Vp"ߐ4QVh 63%ٖ75D,u5"2*<94U(W\e-YR%WMF׎tH?f7$[iT#Rfl5UHSI;R2dsYUPD;4­(+$dkHVP횽J#m9]+6S4MLW&A-[F‘IJY'O_j7dQ bO .&fE5;'AA="HB0bRANPDHQK Xa[\0LC$ ;QEBT̼ 66 kcǂqM TPv|`%UҜ(@āҰZUog+l|/]F˷Q=ΔΡKl֨|MHECn Ӟn1iw"eH%okY.)ȝDGd\ +*;4Et6!r?ƅmAg͒|בM̈́1k‘uNy&Yv'u҃^w {rXGd=!v 1'dp%t'¢ (a{30j3DGPj^"Mޤ=!t-ܶcQ_L4891]&=N!n #C12qttz!Y2'A,2õ|Cfkڡmq"'3t.д +s7Kږ!.D⥗4o))WOOz'cX08 Q{?B M0 R>'!{RnM;ͽ8!|Yn:9؉kѰ`vl0q. #XR@aHs`֜; c=&Uкi[!ͅH^}{9=ðoyq<p,÷0TsF]Pnհo ?>g @C}rQ)"5>\TJW4y`cbBDs>HߐDHZi԰E+m iL%5EHDn, QQadklG]荣P#.u=UY Q洱(F6nC:*F6 +AGQ=M>' bHbeVԲK-߀!#z959Md"Um=rEfyƜw[E6C0U 5nh9YJ՘eQe@jO1^FFt1Ө0'["52mBDyؚ!߀!Ro2*q 4dyDC#M(ޠl5v hbghhV{ c2s_2. 6}Å^P;A+-' z4N0YnVI0R;Qvk4HsvBפڑ+C# 1T!Ba"B)1]T,e%>zfü\5s'SuW\2VrLB{sy awq[3Sh Jbƻ1TyݕJoe$J*ekj%6ZJ_c|DzATTaz.pBel*'v->I=?8*H ܶu:!#ĕ п@y_w7|wG >~K O;?W> ӭa,,C~`~心/}]^{ ~3Q߅v@x D_^e[-xiƗ!>,ΐD.̮߆aM`{6s>{v4CwtF?|.h%!(48e!sqLsO JoyLk@Z*)!86#,ҩV{(ɖV=)23&[$iq"bz/8K#LⅥ >I%$%I&Ҵ-18G` ]"V;Li{Ik4sE\ȣ@È$QC(Akd4GFPIzKJ *B*r9bLG=ݤ`_^yĄ&A,X@%TdS " SBMKOC1$H!B xӈF iODKwg"C/}+ID!u Î *Щty[RN'T ޣ e!DYl )d]L̜zbtM; U˴$#dQPZIHe;(%ZӪ6@E:J|LڀX+hO-MW;k%^Id<3LwXw&®ȺY 6JЏNo-)Bkzi%\"CE-&B,CICVʤu&y*zU}KL[`P2S'(Rm+zܕF"$FA+< jɅ?FJpZav@qd K$ XCl)Zȵ.c0c[b:'i$dMe#J/2c"4%fbe;3PӞ@IT(Eݶ-v@ѝiI I_ p#7#tx5KE(g>{qϹX'Lܝ{WZU}ߧ(HZ$ڣ&U,VP R=E5D>0 jOH6ȪIQFD&LWR[fciϰtW`cS<)LԆPEc[ƍ6_uDnvjE=La+iêQ MM HAEwvGajDr)d ; [4l\glT}M%"z 1ೠWh}O(R CH%Ȃ ̐CvI2zL@0(fPyEdPׂ ݨq~H\}67>xZQ=[C3Ћ}ށ=X CuN]ؾ?y|L:}C8|fwA>˰>o߂0~\,qqpy|ǟ(z z>կ槮'>6o۷k_1?(kr߆)/L,\Z0< {޼ zph?BcCH?xWF0awܿ:B?329נ02Y.}wGJn g?y82;E>76'mB$7MlK߆9A!36#20i\ȇ-EfL*?ĤYh4Ui$`7` i48L Y1l=Yؘ0Y65|̰؜ !(Y  n[]|9-3_ƻ\M &J3;A0=HU$5zQV"@Sdjޚp6>3G8,dmg 24lk jhJf#PYb*Fb5ېYP:P9Om40fݨwzFQ CyaV(۬Pp+aZy"^kLL_q*)4kl'fm3+#*dzGe ȪuX^PUlFn9--PiՂeٓI AnXĦ%I4P`(v2k5^{v:YlPu#ȣzT?_bu! iyLfē? ~ 'e:y . |ހFp?X[o۟u} >0]M7h8</[ |f㟄_᱗>u6|37.~-^7fwpq)V?JXyoxq5SxUX_ n64(C4iAXvt*q@gG  _RENݾ%}=AQՏ]mawfOznopn G x?<|=8ܺ ǟ'f' s綂K-'_','O:Ym ~ 7}c~õ~8y ~^W-8iX~̮hk׿6N>oͷfm#`)Tq)[Y/|!/B*U*&3X F@#9}`8.A͝QuG&O0B_0yv_N@JQZTi dGP ^*ɠj|;ŽI @#9G Vb6IESy?dAFG%{dJlD,&jsA2Z$G#1 :!J}_,YkT0m`{EFHDI@'tȍn Bi!"7XD/ŔU mٺ"A)ESi٘ qH$I2!&eZ:V9z^RD. VXI("Vxeȕ6={B f'2puLe`23&M hO(%wLT) 1=c,G\E1W 5z J 8q' Eԑ@Iz]B*Q-:%HkM$f O*]FSXPKEa VD5k4#M{GEo$I(B=FgT!45:"z۠BBQR .#g&Fc*0AH x1ʪTֈ١V9^=NDbגB@͖TT4(l0`54@҈xGI0PF6l@ vJ @U"F 4  b`p@+R#p6!"DD4z@L:HU8t'v y0,3΄1:VkJI(pF6 0g>s+)쫀X־Ld*I`R؂*DM*d2soQJ=0B"p2dA@c ybKY4 @=61{p _K3t`=xg u?+Λ.e2޿N.=yVgpKpŷ><} SNweP{1*7+/}P/f3hw0} >=JĦ|_vϾ#89xeP ې.&bwK<X}~v/)v4Op"%hѤ!&\(zCè5 BL= !Sa5J%L#A I3)Ɠ}&oRMH(CONh- )L (H%Dhq9KJ ގG:w2haUUFREUQ%Bh rlpW̡ז y("]#QSbB!b"w ]d;l!ѾBGRP8҃qdRdF $1iiEX*q9I!0+ xJ=LVbJH$1+)̹#L+%C-B 1ڑĬ2_XT*)%SJ;:JDTP[D-*};()L 5&󘀜AE!:R2V+ԣh9AWSPzQ Dz(')sC0r*+DPJkYR`@"@DPdJP!СPTjV.0cGoSў, BH3%#ks(P h`ZMPL #D)4$*r A4p> BJTPK)2,BbLBHJ %)Ed0(T䪠 y}SHd,jP %Bz%L3*dةv'ɲu F]AۂT! ERHcB oBK2Xzrhɐr8B`]ABB>:_&ч O8'1L_͹3?<+`6z0ʎVJdgODuz.OGWG) ~߁ނ+pqڗFg1'YW4߸ ܛo?{¯<yF^H?\=x*|Mxi%8plՃ1kyT5_w pVӏ9u9\7J`xs6WdM ПrWt+0G9U:qABF ֟o3$cƢ1aEv`뚪8).8v rʆhMCPvlDn@A,j#%1@ʚXn7`tgʬ\" Bf =ua0fzjURѧ@j[TJ4$)A dL. IDATb;4b{\Ԍ 4Vc=lb(C);&¦_1h'cFM(R3Z/°bg9BLϐ}_MƠ[M5NXT DQJNc%B+R$Ȃ$F4`"W o*B% RXeMFWfL6 u&zlPY2$e#A w7ap"u*P\Ƌ\)$kMR 2E.J Z,PeLS!L[Ѐ": TQ1u" GAt=TLb8zpBTC%"ѕ hGXK ġCH 9k tzv_" hnddYKSi"c+OtsJz,R*f4B- ёF-FpۀҒr@US{B"%p-xK(&LR51&J mHjrDԔy\\i!H]iyCvm$Bie sؗeuq]. Ih Y օD`ʀFX=+YDqA&Z@ bm(MO;SH(g:DuxQd$OaDKIV2UN$PU& D)覅yCQJ!d"$ cC5N( mp;;C$IP5V`+ hb1N%cP%*$UeOlը2د299#+EvD0F9r"ʏ Q=t-7`8/Tf\oeO1|]r ye>t/{m[3q";^4*fcNMsr˵6].Dvq-=WcÁo&I:dD$'dBaQIP;L`Х`)z":'&Rq83gLՀTy˴ H0OuFwe%Ibf E/F7NOtFMyZJ|;|+㮂ZjJH@aOHP(؊0XDZ(LņA ƒ$X lMAttr3do<u\fO^l%w=!XfI],{ڜi-#ٕ2ʐTš<){%;\S˪AH2TjvKF22)O)W8e88K[Yp&cL zv~vLSIxBDB vYyPL*Xԙ1YN &(.eUmd%GF8hD'b•L 8q 9ِ|g`O@#CVD=[-Py27wc`ٺ?pBfL"6WL6 QBYxJ5RZ78,92 ! (?Y|TQ].tLo]PG@3.cPyr3Jַ~\zz8 !@^hOg <)xwGGL:2..߁O# (ڮᆇg^ƌr7B#oO 8`{_?m0 ^s|]xQ?%hF~^7*ث}7Jw@ P?960qJea͑\!Q4P>)bl9?=䤔 H <r`m3:BYnǶZqLq /`b2G}o4r@9ӢL6o(1 ! - b! nj"P ߐ/ z7 %8<$͘ܓHB*Sێ&$vB%u\):n\4t\ZC' c,7ĒXi&2R R&x=s#*7F`3/d+M*3;~TS$ `w HkZE&;E# JH%ZE]MmF5> pI{L3#DV싞lNL:w<裖ǍD3b"jJ$\H9n m*C[f>@I$3P +)ŐRcؐUoB'@/4*NbEf/ 4)QKK(S!둪 IA(aI⅂(ZatE=q,S(lsJH)Y73Պ'!7:TT!XV%R'I $p(3XL4ʸ8˒]1btdHTdQBqPF-ZDT6F{ϹܞP7[, "D,H3^0Tʁ RV t !VD!A4[ B4.J- Ї#iUb9"Rb,}6,KM-Za;!rFLSP(*$oRt`)3iZQIB!"$T`@Mp1BIYhze!&i;;E>jpuc< bk$i,%P$-&i_w+ֲ<Î'VN]]]'tOO8CѤF-ʴD(U`/hda$!ь8t](8"Tpq}qN{ַVw/&gfw~gWةJJ:ޓB8J=pNh#<,%D!jiVHLj. 8-sZ[3R0oA 1" ɼ$Q@%$tܠ 7V£`^CkLwE(ī 4xzBU 1]nT[XR>1x\?jۤpMQxݸ|Mmp!ݮ ]uIkOi j'tW\!}}x}xHS8 W];y>xv7'^_ :l<]xp&?q52|u) G/᭛ŧ|B\֧߇ouRC4:HOFvqBFC3P_,vy;DLj G>"-$??vn}W$p'L"K[Ȣ$` NqM nq'M4|r*ch']{80uԞqٖ+CeKx55uRc!e:>yFX$3͌8]p9S+ҦUFaj-$J}K.<۶aY!~:e%mѪ% 2:J[ѷO!#h d>j>C5PƮealo`-sXh& I ؠd6EztpɔÙQENZ:tNȴ!k؅%1شB iч"h0"Lк"$I sOI MaIP 96^q.M'W~5=a@]c '!ML W[:1`DX2)n3f H7͏~MnRۭ؍2@{C[f%XF,%7xAeTy:PNZD'@ jV@tCu@/;78=V m˨d K NAGGeDm*fZR:2H*zR",LJ), ݀>%*]JM݂  q=bF&6T\hnAg;B9*䑇vePh 30: >#xΝ|t~CxMS/uM(!|—P~;p X<Hp]F(`|[`t nB:5ssڃ;O\ &D}zֺ,< y7S݂TTǪDG: d= kv N!D'rH1^'G1쮋pxt+ /(|#OW0Mzz2l 3؄L zcuDԈ"*%2ZEj2@<>)E ]`/Kv5#\@7[풺 H&=t#"v {֞4J\Itd$g%/,;EK!16 UO=LatoH'iJhݚdoNA4qrQ SeTU?ܸH4gsL{y&Q}q+}G2#ւb$2cGW*d1PE& A@7g!a.lꙒ}5FU=FÇ$Q|b ᜺iOYϢjipoaf MP1A|aiҙ%VLU䈑dG ,2EՃ7+N*$p]s{rٻO+IFmJOLH*G FKj@Q>yI"ei$Rlj5˧_<3.qn9I%HiDldHKYSvjwo?vNX`bt|$dIB g8r|>Lv4pBbfB0Y;(>HZpv)G7)j>_aDԛM5' HhZBJaQ Q ZA|W=*CkcT?e*o&< )HV*09ܐtYs^z^e |%-"OX?6B'U4qE9dYK2:v>$JE½QK2=S4㘸?%o툏Q^]_⹗~pUw>o\{>7Ȧ%zZR0-uQQO+J 2`- 2K(r M\#eMPqBlNbe S)0]-hCK]I|ψ Fl%VZDhI}@тf=UZw< IZ%m Ta824!HPYnm2YUF 4!R?+Tܸz\?FnMJotͬ}"p!9 w M?Vg_?ܺݱ qnѭtOw+N_pnvɮ׃ή:BJعܭ=%-xae?*1]DŽ| = ?n{]Ba~ t0f֭Y d:!C'Э[(cfkف:sѽQvh<7QXfꏴc:<D=ЕJ`BFRkGTGIE"- 4e N%bEYM5b2/!JV,&-Y1xBBEC1Bq$Dʠz $BUi6&6)Cq옗/؉G8h3譎X;8ؙZvfðf]VhD3`y۷|\h-Uf Y۲av).jXC*՜zGΌ jbDNv&pmӋ,h>V b1i{0&7o}h)Dgn8"F)M&Xੴ`}zO* 9O[LZ=dQJy~I~l\g$YpBxOo|jdj k]t%cWHkTq8vYx ,1 'E"LP2ֲmj{\`D"%3 KX cDiI&}Dh(,K B<01Us.֙lS7.qxM|PPOx*:$$M8wRJ(Bg%Zjn:#q%KIX%7S{{g$<ʼnqɆNN?u T7ޞrÆڊiu2Z5$Q4C+*gw/<2~Fqxfd5Z=Fg>Ó^>û_{_睏ަ 'Ħ[K t,W#vB iʢd` 2ba|Mc,e$B0os_D ZOe,#OX5Ȗ2̂"{1 ADXKj,+ӂ~d)&"l(zвAi!?6f׹}Ο |\p}[ #oXSy[3'Tq'ĎOep5 ? [``&ܙ&'uǡ /v)|c|Η;`e=X\ɥmyNoYk]? _y`+8jw>A+CpNN@!Nh_~_k0o@苝6F, 4؇ ǝ/ЂAv{=`:H ?x( zw _+ mRE -h ^ D 2VxhPAH=KI=v")EIG,E *<X5%+G9%-DfDlwfq4*A%A"E쀄)2TGkBv~C_c䘧O0Y$չT3"Z;x J*KV߫d-J@ӄ 7*f{M -=eD.8e%b6E5t ;Zf\݂~9;-N9H\p ʆ}j!ĚĈ[mH:^ 5$y<0EˁÌqvm%,[BrLz,ufɚa, zD_I.(BmXZ%z,=Hz(QDpc/%zWV=p1ق՘Q%"mcj,ҡ92d#[][XX<Ѯrkw=y7e[JzQ}bcH~W R3=xAB6E H, K n=RF*09Vr,?sS 1gE5+ Og|`8:@>c? >7nV5;k#SX^qN"?|_ëOV.A XY3gaex7U㟆]Xkp& u^w"tq< , 7!i`\p;McS]aЏ،cYӛ1,iE]U_Vk88KQLsuƓOV-B=3f1^D!/=Uc9DrI8`!xOFXa_O ߓC`hSr4R)(C5sT#M(Icl;&rSt skz@k@`_#f{da Td${-nM)Xaa֫hA_1LfaEl٫ v|K.9*!uB$W͐`:\Mn{7?h=&wz0W5R|LN0Iam0h&QX Js 9B }DU3Fac)c$9.iB"qNn[.&!vI-im\+0".`= yؤEs0ćU\?b|i-4ڲ6<rpm9BĴB(KnH hLXƒx*$D X0:0+3zcmDBlHx*$o֯1bp扗DS>' .=[-9bF>;my$JP 9&Z\"gZlp"݃0&ć} sXCV7 80`ю )6%IqO ScH>8Gqq;WMKd,A:Z,RL03 Ph(DΑ:%00X o Q40<\?_ԏՔg,1c]Ox~k=>qGDq&]S &#.ceM/,@I`ٯy; AWNW8~3I)Rђ\V4C"*EH%<^&FQ g:Acq 4QJ ʓ%s,"dq=l\ôp_w.K >rԥӝ^DyrÑo{ ?p]x.*<.WDk(;|p$he ׿^[[$G Q0^u9&ۛ_/O_~;Eg=^| aJܽ [a=w ]3#_ՇW}:fb티h `,D9|sV>;_0nޭx@uрtDdJ?T''c}\Ă 0,*xQXL#k]-xޕ9Q@Oབྷkn>-~ҿ\]N:9OXoR!u0,97 XOnMx 1\ NRs=u[J\{l ߁z O0.E`X$YG٠._D 1{8$ @U'AaU\yL9~bf^3yx٭C['{d'h}Ey#\LT,ѐ D*|g4;ᡟ0=7ǜUEmdg=B>.b"!+Iא4.ҽGmoM->~8] w C䙭͈*U5}9sa>2 O]0Zm5qDd`hŭ9-ELXHOfZQmJCMM3 )!D~` o`T $ E9x~ -|M2!+o>~~]^g>ٛ}߽>ͽY.D]Igp$"=ڠwT;vc]NpEݨxZ:HX)u`uxQCF hQгP;2Q")zm4T"8 s@qp/"|bMMSZ/fTfbŸF盧z\?v{7OS w:{k@¯C΀7`n> Ag\>; /5C>l=L~t6cm82|fG ,*xB@^]uF't"v `"A`z&~sj6ar֛­ѝ?R_@v!b]S`?z2luznN{_2ubg|=Dm͊4l |Y#1##}Aֶb%Y ]*sCJHJp_*|83lÎm!"à 9䔩Q涒|O%u-Z04=ɔ^(RxPrMK'-Kaaf<9SlaYoO~+|@r.EoG+-dYtawqiy.˼.?-^wXhͶ|>"R}r 2<pז |ֳ\<.VW{lP< QN<,/GS^s}=^ /pW_Rr=N1ϓs5 RNP& | OW^y6#;z1an7iubgPB"H52{Hʓ!$mCDcA ihhEEdo3ڿxq)~Ulㅨŕ-v(.*~ϼuhVKu|P1پCuTΊI][}$c!&Շx5~ݞd>8! Pۧt(LMBv}u4%uX㒞#KkK_4vA--D,in9lZɛMj?`p8?1 $7PO!-{ O.ib7ЦA>\I-g^|cC-pMFQ$$+g̋YGY=( Yh􉅦q-C7)* bo,NPwR'<ɗa|a$_"^^?^[]'|cP y EXu;]Ө͔9c*ST* 1+f& jA@ d0O(ief+[F2gPYozsH"1Y®/0M$X].Ph(+AĖl$QFh@zE {՟fÊ#́ ×= vMlv7 ـlEؾfSok?4|! W׺vuz Ts_هAڱ1m{ t|Э{>r>hU9\Yؼ -la1+zk+ؽ K*p\߆{?x#я`c*wg3sgaVQؾޅnļ43-V?!})=|zG:emAٻ ŝwtKmGu`wߗYG eKٿ\ DJM%'[˃6uCtI-TgAZ&!“Ɇ%A (hn=!# Ռ_kQ0K )Q3r5 _beRz"ZqAHI-8'@~chZ!*C)\M!㘴A]_ R^& = -~@]f5 M_`u}ItC˜:M  TOZ{EMp OD\B0=e2=8 N82:zc{`+JObBE U. )>3=~ Yn %rYy.Bt8hF” UgYNGŠk1-[=S>ړ}#fh3…G'IH£~ 'Pr 39|'R~K rmvsB4r >x,V1̠{F- ހw&h4I3T߷ ыgyf9qE ~ϲ3\yG5ll)Eaܜ],G1GbJnFx ]1=rG'ptՎ mt/gĢ$QmqC,1K-"p h ._3\:=5Wp~xӟl~%Egy nfJz|y\(L)ipgb5JYM _sPVZ9AZtn $>t.cPAPŊ=dxdd)Gyd8)`j !,68Jf1}K^nww69)Ŗh:H BI8 zCp FQ !E҈dQ\3;۝Vr퟇"m!PdEtPuꜮdlb2[Jf( $r;,i%"Oz:}#ɧ`)GBgaV`m^- Wah?G0:]ː{=) rB .Ri[Z!C >,$I68C VG\`H:ނ ,~P2.֝BC8܂XV Bf IDAT;a.Xȟiy`@DNQs6{@`B YZ ^AD BiC4*Z +Q] ?.'qj,y U>mHllrW4"gfNЉR=&L#2E/{,&ttejV,\4´4C5H$S$4g%]4B 6BLɅ m줄T:Gh3")'Z$8BEVѤydUY%&%d,]Uj+>K8v >ɜCmXl)TP&lX/.ŎznEG6^#^^wcS#vc c$gyL+KY"07Y4?ѳ/ѼR a BFԏMSM[^(MLtU U4H^ ɽDh!C0%$Uא /!2 Q%C& PsHUXYp2qD2XUPe-^Cm/ȷZ #hTPKȓ2B*ZGBvs*d_Htơl9Op:ALh1bVS!d9ՉLC)UY4BS=)E]j@bԝa)r*yFu5 *.>qj'>P(93cvicYc܋#܏i]JS,pbo4&3FN%$,hyy dVWĔ#N=!,bӤd b׈J:i,֙ŒuDG IQQ  }dJw 4>HJ}IRg(Ռa;!\FR>RQK5F ש;)2uiub֟KֹYgY[}1켴˶f}e7 L梞E B iI:h&';j2QcD1rb"&bFc5VmM4T%Sdry0JDmf8u*5'vt `@SZ#/eg+hBAM6(,&'F:9JH X&FrL:BA<# JTƟxhFHb(HQ5t A,4Xh&`DDIđ^**tRFZ҈IeґSמt9tΟ.»qXڀp5 Bm~ z˰cM<$TpׄcNQZx m/|H:`LaH8_+ٸ(9l*Y8؃ɂ9 '~}H$ >[xJa<<܁skp| sڄ\ 0*Ҽ6^.J!ނ   N iZA!c*0R,q& EX+~`ς( P<i OHЅAL/ + j!ꌳ*y_2e G#ɢcDxT73ns\* 4Y|J9Q5k|BY,xӄ4TRM{>Ď?d_ǘ/s?R{ My>ͦLGE bT%UZ s`쵟'Y> YA#17ɼ&|S!CthaEFcXфFEh:$3BvC>=jvS8x;GTzub.ɪ.jJKbaԔ}:#'&rj]rw\%G&!׉mr*HC>jHbۗ NzL'5ʔCBYY{ 'J-ʊBCcU|1:/xe>=lEO){xMV%?ު{>FKnWtS,}"ni^5TbK*'1WgVgFg &]=N=W{KUɤX;`F,pn1~;DG‹J!jy:xhr!L6 zOjr2.$c8JH@XԾb:%s*Ɯx?ehր<{UzSV93<&<|u_m<`ЕAIА:]ɡp0kuO耍J/k i&no)gc}@yJQ -FYbp&beun9fȌn/rl/2Tjf1F-T$Z+]{l<@,@ 3|\E:֭H]jo`%px18!E ,{ a`-8 8s` v&RT\+&RՀ 67 H[,}^ڀ&tl)H?Q&p܂> \y .v *=%8t? I_*64 fpV `ƅ jHΒR|Pk@ z.!3PA_ȯd*",Z` ؠTk rg!ϱs#3%tu_𫕘CK+f0sf/xGLj>5%ptq?GcJꬥUɘ}EV;Z7x2mCf\H4ʂ;/_r99 w~K~;obƘN ـfhS\jglIo:/Z=ƕK=rx~ai.KR^⵶N&ʢ7|3^'ߘrCVv ĝFNK\_K g M &Il_g Ճe^uA|կ>8#%27}f$92[W:}c.ڗ*C*թξamTj $,H]ZBD; !MH=HCU<%SD{eC?!Pm\F=`ު:;DNE^I\9NZeO$;5UoO92%n{'\\3{ܭ.~ c?ew[<\:|rg%ӐcbqR&b(O>57y.nQ2 eD1рɹzaZf=b&%0j7лDZ]FN>NQ;'6ΣƥM 2GlmPvpAcMV^`wfZ4p3ڹ;A_ør;`9x4*|xRF] l7]1|X9<1 hUgpF^>HhDBӖ'vL !E}:Oq&(wG%pk2Ǜ)Bne1kOBMc4CKLܜXmVn"liF؎MTa-qn9i3֗y/Ye&^%2y%ܤC8)ߨR"teI9)2 A$K$,( FK2psp$\@o#LXxhȡD67v*0 œ&8_bC SVQ")Le*RF sܷHh\땰#|Ƙ0J^ w$rU"n1Hdd'tA$t(RHW+:*(I/ vd &[߯#D8ZjJ,UHPII%'WjL#9HX^_QIo6U>=$!LYJ AYMEDUH-cA[SZM<$Rw+ʺ`͐NR5B(ՙ-쬆ltbcj+>>BXmRn2mj'ɆlᣄyIv wBV1֑:anS~~ VECwk NU$+,@e&Ђ,N j1!3Ήp4F/ *'e&dGD.Z8yg%$I;QXI *h by^ /jc3D.7لXg!^Bv̷!q8ƤITEtE&}3QL }C]F,"UImFzyZ=6>. E*Q7CN)sJ(E`#$ؕ\hYgz1=olOt>;qKAT-≎."D J(@ Ym2}O6䔴K(gvA!͑E(ɓў8Gm9dV!JꤖFhL2IbؾAA2G(+̆a g.a+>ŒU/%OU$C9$4 9nҾvH7'wٹdR*e9I-P;X) -'+h@vύQ:nC(Vd^t{Mf{.|*^&rj% xAqu=I hʒ#KBp{f"=d^>$/Lڕq] Q$̽eXQrj'fDӈi&hP,8$&* 9!kL@)8>o#(g L&wMNLP|{KLT.\-ui5taP,1J>' +0Nn^*u2G}V89yR]p' xn =ݢlO6d}B4)z3vqX߇l.5[ >"& ^[_ynTjڃټ0o\Mn݁^ .IxWDr,/ l67 6m8|7 8W$e!iP)j B?SS 0|DyNI4#;VtVWv|/xBLBC /b X8 32S9EGKamLsyD++ e;š1$Z&T-VΪ%'`_Ͱ(#M#>Ni %%3HrJ[)ESE m& IE&is|=w|Mst!q~yVuS,% aW_٘f0q߈U⑂t/Frb +_O1뛿iY< 3NK{ Ô}&0@MѤ=*% *rOђoz1[Yb4NP$ a1fVcQQʌ!|;^Ց7I6!^}@l:z*_,]r)a,-,,x'''h @ؑEh664})?F#j ""2qϘ&#GhX$LH H>^48<\7wHҜ,mJ> "EʷQY30߄`"U{ni W˘gYv[O8O'Efowxgkkc IDATen#]wKa3/B }  ΓUb({!c]xeFRr~!-FEa0,L-fTBI$Z0UHJO4gXHM\"I?Fr`v>G׎$JHIWg2.CD5#"xacQ0!@a,*1TxGdcs3^&^Aa~(s+ zųhl"ޜl$̱I%1.Y4qcF:bZpS{C9eߗj2 Lx˶1Z^5ej-7H1IQ&-]"ろuKg:RYHߑ!ʗ\A?&U,~EVvk"s R']#>P+ԔC0 2à$|2`~|5O6xutGȂ0T#afSb#ɄfN ˌP2bcJjFa_%zȲKuG!WWRj b2)fY0-U=NVR3l2OC{ 54 ,v%oyv EST>I9?Q y!(X)+cKJC.N+W{IE5fZ7*@ ,hM !M@ӊr@M?]*$Q|mp*PSR 0 CRۧ N/G* 2Ai)kNE(fq{n|$$uHEH?gx??4l؟DBbh[ R 2<1掇$5D*0v3}HW}ƈX %Fc G:SHqa8EnΑ)ThA9etL*> n#t7E_jHj bj%A!TDliUZW:#\h}jvۛ&Xkq32<,ICdb27~>'B{Lfaᐧ 9"ƚD)^BlK.ej=$m43 E$rwH`&tH:vl&"GA!yB%45 q2#X!YCu\"d6JVALPE?d{]` uqOd/@LX! CrIOҼAH$U׀!  3jX!< 4\50CUԙ68s)$M+'%[*5d-&TajMn*DI)1Є( RY/sy{?N뻴l7l=淫<9,NW! Ѐ__%{k֑$K0lM&XUlc{pglzHI#A+ex.CG2bYDh@"t`6Pn,3/T$&\($<2I$Ge!r؂#!AeގIv\AJ|/ʅt ɾbY qpS8x' DK:G̪ _|>}&5/bɂ$8 /GHJ4rHaf81b:ErnzH锌)S #T(*j,j`.VJI[ FJ 1 #Qf>R"p- C8' IlbW#RRGMLĻJӵO.EtѠ@W$1}p XWك|'k Zl+p|g*{0CmL}~._H T}QPb8 %l*XtN\ڛE4-i/|@ągjW 䢐#HsB0Y$Q!i~xD>wʔA CO@\O}"FD Q#$oH33JJOHD4ds\"&>4; e9 '&hU-Ep3$&vU#E0Q <]Ef\&ʸIʘ*cJ>#c)#pE]^ꠂnKl~˵!USPLRՄ,BvHg%#RiBRK$,d0G*ih9Od*((iHa.Jܧ!G" 7E9p3), -dbx ] 9S8[ͨt/xboHTS%tJZ"Bck(BGtFoFW\|QG&'-󤱏{dI+LY QQNm` ̑f" ͢>"sľK#2IJA^& DZ)Xy6f`j>r:#rO`:Ksl&e:ZS9/a8ތZ`<dIa3dT'STT@N|£ڂuK2 =AXS," 2DU$RpeK2\J(p>%<3uQ7{9- n|l!f2ܜ% 83fӍCk#))< /I% )$ gȱ gQҘ,KL!Pp #bF#AţL^|^xHyFy P<: IN U+|d+?wDUD =Q}2BM+B@OQ۔ԏD7P+HQp@QdLer#Fds`d(6Q%9"Y]F P);(y IhDF[D͢J={}tΟxn!]q^,lun݅A*\ /ʳa"2=W# ۂ_~ӟW_׿?[? ]X_W> ߺ^oq0?ݿ Y3uks9M i E4r,0 Y¸D[U0 PDN!ӨXBBj(ǕZ L@)+BX5H%A:@ceKJJPvgrJB #ȈHS !8 % JF("j, 3e4Oq{oS6yMn|>?fHj@(3US6al #E)2t<5f8ûܻIz+PUԉtQj@D1UBYE C1R&%V1Y{͚ ݄$KcL0h6u$ +.A@P<44*5>{l{wRg5YF1Hi)A4C %F[JLҬH"'o?/XRa ٹB[1遤j!tScm#G 2C t%Ojn tlJI^Y!5N8s][pi2@-"7d4)wGLq. &)"PxH\U4YA[dDKtk!ݰ QP4 %TTZ bʜlF3sE)+Alux'W~ o6<+`ԃ_G=8rx,X'NB /mkLx>)}J0ׄոx~ooǿ_OM_z4/p)t:pc%Ou[dI({P<ʲ׽Aq}O!{礤w}`,kUЂru;'}Һ##Y@ zeۋڱ<+`98s%53A3Ә]4 Pi$e\!5rz"ԔDB)(akvh+H$2@ T8 i<0Mk5qBfH$ ElEBQ(3"& 暄v%?;k]ފ"ﲿ+p㈺t#tt{IqqVc2&u)wDf2S->LʗO` d3~ӢdVԌDIM#0J?^y8o 4׶fWi:>΄>38qEVR:Q#0Xq $d2ch2s}*sO$= TDzM,)M}`qK3跰' (kd"R᜷{sɨR<4sѳ_`S*ov3r"9THtdHW02cDyF9ߦrgN^D1l̶?l}xז(/4)8eظ"(P: e"S-`o7)*QÝ/30[Dk5q65cbMn$ n!4%6zNؕl.yS|LX5p&%jRR0AmչqtIغ8h]RvԔ(wLDQC,YtYܱ3TVO0?6)lw(E>lY/yYu˔6 &#P` ,(],%UfXB 3PAP fK ܈1cp `8=wUqT(]ED@M|*8j0rWT"]t|_<i?}qc:zF-r hqHBB  Lpo9.єVU(ŀ,PY0J|h $no9nj(ͻh'pNaL($ -H ѐpM@Dk& xDzT2<}i`C}㑐&  P58$9  ~ W3_z*wamzN:<)̜#v1_ .O~>&+؅ߠ~VS0\<_uaЪ`į^w/^Wo~ N7W/B"CW2\ ƻp)9]`", ߇G>:T;ƒ߁0g_6[xG6?* ox;^Յ`C(PM5;2DdXb1!AB"PqiQT0H 1Z(iJI5ה ABf4P1 cRR䌝rZ<⊨i4%WJ(Jj!v`p8'Kz6eШ[$5}{tF׏sTlTF=`/X@>Z.b:P΁=FOn$!ȧUჷ{?j~ UY\ 8(RzcE(2;G2ZÜ ې]:ww^:)Fڌ7(';&y}f]z}ϝt &9=ǀ-\{ N*wׇ]$G`JKuN7>a=>(>)a3}p71IɺSB3RdV-hTMA %JY3fr}`cߝrm7Le~}2|r T м>sG`ڃ=?0:\m?/g}^?ka, \}p_Jw{ 87?γPK[}o_ԟ]}^Hu5a闽6d'%0#(F9p{/L _q`BuhyRI735KXcG?|""$e@7(]8\ݡRTi ڄhHSJ+hI%IM2bRS)#n$1!iNXCf{ELZhTѪjV 9KV1(sRcEe[kǻl;MDB7K \s=k8>]P,:G{ Nrc3H=Z  IDATΉ2$`nҡ6)L$ʰV-P ȳ#>Gx\mGB2{KYbZf]\Jj'L zXeokdB-#Ɩafw bt)A1 Q{1n:z[sK5eMڬ %nʸ.%Ne1aKdnr \cLb$n} )>iYr >2f>Y3,?;}0 HF1˱#=cї$>i_`9WYXUne&M Ai G0u!3HЀ%G mΡأFdp@ݧ5x;&ku&sI$ sd8ZZ̀&SQ (LƴY;hߚ#Lx|`F*: D!V"ژdS^$9I:˫mnh*DTFm0j;#l;LaBo%/=\Ħ鯵(8։eDQnz8sҧC0E!F1p/1;7꘣gbXX/mZIEՖSM$ bJ%< %[Q44l^^M{Ut!u ( ʒYŕ UN4q=VpAXz8~cJfE V@pd$FYUTmJrOb&BH9p7踍nȽg~fJ\aIUGX7%Kv 4hTD2p̈́ >%79SLm!G~~m8e=܄F tSVՊߖoi{jOtЯxv?t>:o@{ӛ#^O܆i8u*{CQ䇅(4h5w Kpco;B4:Ԧ/>O=fkZ[)ѠL==_{7}p`C ?癞ŝSVa> ]S~ u(NY\[64A1p Dw׫@!_\. iMQw]6e<*Q%$% R'$cCB0XIJMZvDT&#'䦬0+؜tbRT"M I yE"ʘN2$+|W8zܶ`'^SK}o&q dhdQYAL-`gQ14 ,+ˌf}F)㊠(ҰY8 i3FT6ZOax Ѣ℥[ rKxztwD8h$uMv6I&s*M6fVfT͍6ъZAh4Km9dG*ӂL҈87AV - |AYНKǭ-k#6wYF&LCa v.Ʊ9,!>Jd kneéŬr2m2| \JX%iKY4ˈ(_q aȂXax2;Y*$7ONX0 &E&<"h#eڢ :8á HCGpF l쑨dև "EKe6y;]: R*A@"(wІ1TC58r gRAs@P,9[t:!E"+bm?x4A1jJ83f\%B쭿PoS, !,5ɭ%s[UGg9.r O}AsBIQWf $(k K郳\bpCBNdLi?-^x\1Ok6)yx1s4 n޿ɞ S\=D*R*5O+#*퀉jp}-d6nUSd4@ dùPP8S~5!Q=`.^&oAr6,< =娲~w'w᳗{.q߅?}xo܁N }XՆ.g}!z n ;q;N. pg(|)9dO^{o៾ ^6|7`~ ;>ϣ ay>tO;. dc8ߝ)UY ޅ߁Z]-)<5K >U^b28[>snD?% f(`wd6_qCɖK jȪY" =ؓ1:a@0!{s{AU4OZ8L͑1'5RPjuN#. siVSW! r&p:ݼ( CV3 a#(f9yǎ32/s7+?0K"1 X#)Q̢8>R!!#q,2 f$p^ٝckaɷGDtcU9c(RT4`2sKߢvd+KѦK͍F1]Qǜ.(sL آdiI>p,ϩƎI c,Gd@90aJa5Iղw4YڤU@1=Qg凊a؏kp=kuVB2 e* єPHPj̅/|xs3h8jLJ|S>~OG} ">wz2{ +=V /SNr◎F0/ɫgyZLs߫G~J`1v d RPxY\$H++iWW>ܓO|1:kg;F:A9W66'S"7FE-'C*aeB'p9= P'\3&z1`EdÔP PV  DRRFtQ%XjҦMAe\ Ǐ7 +p`5Q\ -aCvwƾjBMo7 `,\y}kS/;շn+žmOy|g`<g`vڂo/ؼ?ܺ7|yH ꚧ!k07wN‘yG.p4H]}ʻsۇL BPzH.9BYEP:\rޭD1Ʃ)R"pHI,J8DX+-tY, a 2tPHE0pZ3Ks(5& 3(|AcB U|ˤk1ols{dM-Ihcq.fna`QE :ƚ9r(7(% umA(!5zq'APMjCI+ɸthIVki1@1K23%mS څLt @a$/%eH)9YYZRȭ!`=?9-Y,KD{7j7>LyFI:C e$X򍬳3p# !))JB[`ֶY K&|qX ͕4O:FQ !%JBZ#,tIZI*T9A#qv祿su[W;p6qRG*( AD=,7,Xӂb8C,6:O{Q,х!i!dRc8B) BQ$S9fRP"&qwǨp';|Ov#9ȐY~CB xi1d׉nWi]ΞZԂ8eXgܤhEQY\@JJ16dpM%2窬t/xfɍfK:֠q؇X0uO,<ar8P<~d YVaC` Wofoӡe:Nd)dDN PҸt{||kWY_fuuF ~aF,B5 9PhL ega mDK8> aiAH. zv{XBFVuk-,SHKG 0Vi@I!AJH $$8I,2,XP(` Nvn@`%h)uxi!0TnLcW` 8BzΜ8[D4⒇ӒpЕH" UT8)0:#F"$70JSpJ Am! +M=t "(b9 FU c;q`}-*H"\~)yh ]05ҿIEfP)(f9uBM (M!E|.PA1I8!b( 8C&4Z Qc" Ғ.tV*"Klff9dd#p"ԡX:?Is$ȍdQ҉J*1S'KǠ THabio.3{{G?~wܾ6KYyƫ@3k齨JD(fTƅ<+ Ϗox{[w_vL' $J@f8l0e'޹˭[pwr3_9sO88Nނoq= {H:Cçލ)[A2VTxOojbA8FGU(TV B "PB@8H% </p!HzSsT, rGJHDpRbB(d`0+07Q=10-v^xk?r8^)i~HpᲧK_}&,}ƒa4|/+|TPu$xݧOנCpg^VUx qd~zS MYH l( ʇ񗯿b;p8"9\Mj"XH( & ]raXbò#K"9rvv{u˷g{\P1DEU@Osso\/8|M`W#8?9v1>,$jPx@IGe#C`zp0ymx,TQZԝ6?Ϩwg,?Q;7sv9;#~2ٴh (>fش?g^>%YWټ:&D1Ec3)ۧ(c?ٛ'[9 {:}OS vm@bmpsUؿΆThPK*zj5ᛞA},4?5'sH#;\=/i롆5Q!#Pajxg$Tcfc8qU^Y_c+gpćp9W4ݫ9K/3iO>~wV ~pu0>rmºH ǣ0( GIx°=r6s9:;|I.K?LlaR7~Э0xn~3 M=H& E> vcl+T$R5:X vUA*}hoaVHXwmAF(rX)d$hw" ºI, )ZVh-D  U-x_M@t> ;d0`N d( 5Z$߄Sf>,;[YhBM k+O÷.v3 O׃-߅Phl V C %xЃYsgǸOTaj2.|N>4, ulaOơ`d`v *ԃ5-n"Ѵ^ }wz:/M.pxZpyp-YjeJL(Am,(F (eq^&- ]WsdE*#Rq;bTK{ EڡMTlK)+1sܟd#|$W @P;#!DEL13 Ǟy&nm0;`gEE!/ѯ|dM 6P ;c%Re{ɉS F[_|'ۜ6r.QD2Ģer(实N!Drc`([{9Ěvdz2mDi; GgzS!4'1ZjD i00m.7V_ߡS`Z){i1 xdkw!:̕D'#c {_[7Q@l\S{Z)Px!Ay\*1  U0)qcbJ߽2;w8qQ7fyo=BX{Y^Qb-p*;1N?<=B́gwR~L-P̽ֆMZ]JMaPI pH% VF̧DRc"7x!v8'u@6xeM:Xx@$51xJY5Z$^3G/ zK}Bpnlٓa?: G!̮q"P9QZ_=8.^/{JcA{}?s@1Xj@Mx `a|N= Q 4DO~*w̯ކ do'.rV;G6-[/Í7;?@iZjC"C^^ntEV[0܂nnW wvU`u,RP &GfNKE > H0: ˜qY 4zI&=j%)L_^% iТScjKij@ K h精]Q[!H $":BłX(m@N -s".1>GE8 Es!/H$.}` Ɠ X dt~ͧVrq{oCޱ%[=I6A_ȁBPJjQiEN޼Z?otXXMa٘ H!hOI$}_1G "5ZO9QxS˻=x|@O0%:4q LF1Y捧K^bgw*^HP ymcNmDf2T&JB#]5ׁV#;xN˘ϱ<рk- 0=8+M vH8g%8O!=F:*0!EԞ9GҘ:Gx}~pȍ(#XoaLriL J#!UŦru%iE”*ɼ(-2~)aDѓd;;6ys/fsdqCEV>6єJfivj:C>(:̭͝s,1LQd9VxAxDedw&@U1ą%{D$Q S;چtX/# mͶ:"ζIxD۟㚐L^J#MkP<$*k0ow,;*=6Ǹ(phd$PRG1:U$8RZj(&тTE"PH+oD #ICF^g*"Cª |'5wdڲh5ƷJ 4-2F\lzˮ,p,}0mVCoBc l {UnU @.Bу`;R'v߀ Qi&A`ka`x3qy (=p\K|NΏ 21k`y忀pa5*3`fࠄMX1(6߇B.2\@8J B~nNDDRĠcMeApsmjsޗᶥۼϘkGa` v9HFxԔMiXB'%[_pydS7;]rLDqVF'DAJx.39ءK4ʹUhIe%UuP)Nj>N{!1P Ӟ!: $9?GL6!%y/~48\v``f: ys{!V6~Nz@ )k6-ޛ-| |guN܂;{7ᑅp.fR)x Q :Tno~!൬bz11ӵ WHZJ)P&IbKG Ir fZy(jJGxo8J~v6^l*hg xX! ŒJ>g)T[J UԠs1܏\x-+_7dH9~AA738\:Csh4VxѼ{b@YV|`[A{@u0F +MA v jv'Ƚ=6>ͷo1(CݴzaĔoh`i' R4iv&_c9VΠI"zNᾔA-_1QiwupR uH  Ōv~z 5 9eR\Ci%K, ҅?ȍ9ܜn@BzKz&6źMBq]R s! 2ːFEdPo&"y$8^E ?,_Pǡ=J5_c"њd'wD)M*a-XI4=#W2ۮCE a"bԟ1Jiodt G)-GqИ$x$+?@gLTNm]K,~xG$-T=&[Gh@vK 'd}J"6rV↧y,]`:v 2_AefbffH3&g+&X^ lw- ;0# YH] Jc:tRHcyII6sfĘ: ߨ1#㎙@+XF|OYѫMν##FtO|]!'݂^xZle5xσ [`CVʄ$/~+#%\{kD XSel V79.rpBt SOMd5l| J(=B两gy^s_ ׆ΌYHɅ+L 2r T e$V[C(,2lq8Nr5Wa/AH7[|1a#{w&ϮSu18ug[{kRj~ª;'?| k7^}ꈃnߢl5+mQ1DzZ0_)28U+\_ N ä 3 a+ۅ)n: BVx)4Q3X| zh`o|,kF8 1fVao oõχcyBoVOt(kRs1[ );pNH 7[=]bǿ`[x7,Ð}QX6Cj_}xf? Z ԺXN-,^:P{V:f+F)()pEwU"Ge6Xb4C4̴*=CK'UG,LHRO1wWbMfpV֓ ,_Qbųι wh"sX3"OX|O%?4_;\coCQTH1bXj3R83hlXLj;av[XLDBZ15LP~ f> N=OkpYIz͵1/nWp}pw$8@زpk@%i+'4;=gKиVQbȅƗIe4b0P6HaL Q ˪撹\sVQ<LoQ=-_RF¹ddihU4pQ}v WO}E%$ q A[Z=}3ixo3crmuW.W4fBMBE'Ύxp򱄴\`x>>},QV V)p 4ЈcՈKJ ?V9Fx;B8YdO% (b$CH ,RO+Y"OқDVkWwaU)iK u?W~ .lކgFV9O|!аʋqί5U^/p(ܼc_EغE  Qx & 9'BBB`ic I? "3n]ٿ75ؽPw^WV~ނj%=T";`2(o@BvN. opL0L,փ( `ԦD5,iP#8#%[SʒdSl) ZΡ>3SNyZo54CɈUVkGNsKx"_gspanDQi rjJIZzqEtJ&) 8(p1j!hi0e#%o\Ⱦ *ʭVDg l@6 E' K Zk)D$бG7,ڣŦB)BclMDkʨV A37_B{D'JaH9g":`e\0ܝw_Nyֈ}Kmҩ_mM|v0cid1gO :ͰtQ^<ܢ_LT9XLb^Xbc8*#ƞ!Q{(Ze{ $!4>1x`g$c*>{c.~;9f̂ <DXUB{-P֒<'zwU)j% lq.Fj@|;hc~LYtSIEj$"aXzȒ(GnVb:Ȱ* A9wFx NT _igfB֛CuH8Q 1_$Y!}~wRxPq IJCg# *Ke,6[>7ϔ,?0#mgop4d<8ͦ$4S,]Y"!'#t"G !&8%LLa)*^TiuB%Nlf6BF ^4)#f] 2z TY`V? /LЇz,r9G T#4:c8UBR&`҇C oAGw`xЙlr}< ^ C˃`+!m=a|s%FA4݅'՗q?a]84[p%p7 x؅? I@*A Jg?pft:0X>B^04z v9 MUBAҀ _ poFKs0`Н  Y ̅rΏСё%T>>佸aМ ?Sw !.X  S{OSV ESQ=44GYFa& l&AMđ!qr#L:, r{u֗]!o7)r(gz[_MȢPkl{seN{>1;o?uFQqTxF^ A x06X6KCKLB$k5u?BH℡r&ؐ"{M,u-olp,J%2)P0I @ H%'dIC[pf83=t^_}ۻ=KH,Y?@TuWo}}}]?$acD˔81X;cZi8Kt1TLIL%M䎲[-f s{]cL&">XUdA1#Vp@I3| /젔 l~D=FH(r')JA),Y6<^WL&@j |!6=ģ)~>j3R!I,ءy[*tAr%8}Lp|TA#3Z(Nee G%"cM,h槿sV/SIj$ TʓS..vy2/2--'[MaT4H =8].Yu;U3Ilql8 "XA2Z-ByJ= taYplugɖ8XdZV\f}H/ޟsԌYhiR8Ux<k`{^h.nSasPC)--k$*Hd4%c#DDVkڅ2$x6г6K5"'yYo\I6:´: U6͚SϜknߚGb{/_|JTDVHYq=j14D\2!/cPZr@ÄPA )RX(<Hek(l¸ԉLǞJԌ "wMo <=b=PBQPOf^(A ;pD~j R*\ CKBѝA4:P:81T!`*h'4 _+KC`i1K}p;}X^/~O7&<|XzKa]7yPt}|P{߇c30CV;;a}usch}>H.3Фصh|އj߿ĕnp1XY2AZFı V*5H&$#eCA\qSLU@Z`U>!#*;P E\Fѣ5L]ZKG9 Ͻe]wngލm[P:]B*%OHH9NWyiM7vH|Jq~Cxpx%4`70c[>'.G %W7 Cɱ4!i\ʤPhb"0bD$5;lLuzDs]~~o0^]F8դjEȤ"Ij"đDJCal"ST d*BW+s rHQ@"PJ"3A# 5XHP/\YeٶN/⥄S㈊{t?dJc&7+ \HC^cV޸O[+*eQ m NňZ  He]bC aVv`k£n{n ~>F,pE '^xp 8l?a2 sAx%X{?'!}{5-;;]05ހTA4^ S_{? 0TaP,V s3j6 td1 0̓H29,Xq̺(0S1Td:ıNbcSh|K$w<(`IK˪fOjgLD DAĞ%UJ eN*w,ۂ֨IWkɅLs9`5 =?:|bste 0eqM@3V ]b/ʒK8ۢ$bX.=\|/ЫVSl ١fb'hJc#6-dTQ1}#cX7-Y#IY'l1؎[$u*n…Ik0V:0JZJ/h k`S( (sbS1 GTY `%#hKv'yA#9bS5*[T >b,^@c%8S1tW8Z7M.>CPvyrvE{7sg6ӣMZdk۞b+OQO$ .cT *oɢ t0YCNcJy)c5o To1E\oaV=s#fqIr356SfLA "wmsϣG>IC5Gcʺ9G%6}FMu0Yt͞.{D3BF 8fx{|=PdN%`>38+, *gLa}jM45gp3}#l.d{ g/$8QjufNٔ#cm Ukq?#2C{jB[.ߤ&<4tڏ9<3lrqМ?XGol'1BiL1B #`fQ>"BPF11J8$nL#(?K5aLF;QR3!%*@QLى M߃S^<H雏!Ұ;: Q̜.c0pِg?]ؚZx,&~9 K_C9Vn܅c2? 3{a'ׁTxҭ݁G߁sҜסq6h7BdX+\:@]@z|AF1 ^ &ėӪ4" )zm=vš>Q+#bO& F! .]K.A( mA`bI94y>,).V t$Cl5e Bb{ǐ& ss4'_&> +{k!#- $ʼni&P(a> I`fję.<%bw&$yl)ȅE(KyT/h"'QAd,x<3\ s 9d fNJ %ʳ.`T jURA<=štdG8ZPOfظ9;56HIH9`\x"SGv8עi^S>ݶtl΄G5>z;S5FvFZP*uVF-IAy*Vyth#2밿ӢUaq.x3LMpZ9q|S>לjmRnAΨx("Z&I j4C1<$';1`yHD%, NEHY1ck*gȥ-3"fb+r=9FK^ 4B:tIgJ =9zr58MD<4q~`_Vҥ0  s,*hqޜw쒺gxl"҄I$=A& ؠRGn\ DX08fOбb;˅9+GNQdz89ETDQRłXGVx)HiOd@0LX(Ro@8Y#)XJ#Dp ΢4EQXgpE [t6OFlwS\e-]cuԢ?c~t JV}Qb"aq!@128)qE=J:+TG:#:&TT@B:b_JQGA )呑E:Cd2JA[“PQe DMB\8seێ?i <=I[[#^[!6InWa Kil0ۃ1oBg6`$Γ^< YGBd82; 0G^ |?Ut \𖬭9X]sYSxQ~!49?˛>_eUچ?/U:\[;r;|>5ظó8 ?yO;|ƣИX"vjAc1Dw IhJ0{ /<8D-J IDATU)nCt8P}ֱD 7A݇ +Z~/x_%[9$Q'E*Lhި @%44#-Q6x/74Y$h+H4ȳ84s 3(k|LHٞpi.|<+X]`7k~YNKs_=}$ R }I󕯝`o)Sb3O6IPrJ0*#MGĸW[ ݲ4o{MܹjV(D".aP{H 4&"|X~edV̉DG?E5٧`k}];oZGJ: ;[tDLGb3lXGU`"ED:/F(#R =>/g+t3%qB+Njd ]}z6vlmJuĊQy@6*34p(5 LFY ,4 IO森su5U9F<>=O/v&~gd7P.a=(MS5%Ϊ Q2 F ߀t.La\6x@6޷ۇo3Q0Csd%^<|Z pM8vNkp-h`'/}ނàU; ?A3N?c86+0exgA}(,LXc|Ju =} 30}<4uo}1SkݽJ];-R`T-^4,;/hzR0~&$(9~/4{@%m6MA"5I`'%!*SLL5F^ѵkPŌ;|,Ȍ! u.@1mUXDHQ !kKW8g'aŃY>njJ!+B0ij@!DRnksGS*>% 'OsMz;|O*jO6 L3l) &$9pr+I.H2jh C˒8ZRgu΋GOegDIԌOxt* ZL35ĭO{:A"|l@-qbiuʌ+!_m⧫Onnl=&z U/FX RJw#* o)*MY:zS`R-S!dMDN1S16'y>؏JEK.eXZIȌAC8Jx;1Zthd< d`H,:)ϼ!MnL1IP.1H5',^6E%sLKɥKY[zg~CvWоITeIwuLtIJ"$&$H02z+')Oшb%6-'򂴐Hk8.1ëjG]gx M=:OCDʸ0a58qvĠD؈+X|. $_𩋰*ȃ x_= k346a-I;,/qXfν(_ͫ!ʌ!\PFkzʵV5#y ,l݄VTBahCҤwC:NJ4X.4.A !> 2;L+;NA/ԈoNC'WvI3U5t3F7&#D6&=UPѩ&izbYbYk-b4A4!&3I4s? %L:횩4w1^D{cD-.3À!u9=PEIGbhi23?ĮLb:ͻ=Nko4*I2J3iPGf"inAh+_`ߌt.`5(U hHZUx8E+AFh_"Ze||;.~-DJL~orGCc4LMo"}\83x[Vhwږ򮤻QFob|dI]m"EMH̯yvsD&c[l/NFx@'9}Zyj#8|-ғI$4 <&ı%DuLbOVT m/[B EPmt@E/XM0$ R^oxr'9"|$~%ڴQ@(&J8| IlU`*"J5H0]*4lhDE UD#%{lR6N;>/e ڝyfgg Ho[i!<=qx>UXaHp!Ap(;& X{Z,(!Rbʼn Z D$qFk*\s(@J|DRK5 @&)2PMC4)- "XQm%J] L%"HTdD.BEI$:RhpU &i^!` ^Q<= H0}3K8UPm@DPFa' =Dx0O?(-߇/ao!Pϋ߆KC3φ5x=8\|+]?Sw!zO &߀KW01M8?Ma߃B1t7`qͷ\R%u7x=3Aqڸ K=<]ǐ@.ڗ`zX>~6x=! j9u@70~SaBrY>hfArNjC5 c6~ʠ|Y\qu ''VX!ulk?TU Bct2HQaJIhPDF$}%).R.]P?Dr1eoHitIꨅ(xK03opxCw^Rnd,#n]MhlZc{FDrثgPxSQ[5_l4\cC@{!@&҈z29L-4 U'o!9 *ދH$*]h''ѽKE̙ii_ĩI^j4n~poٖDE4}54x4sЀ% {fir̨s6#8g[ܹ>k~ ?qw*Inw 1(=g=GGg^x/Lqb jDcs@quc?7gOXpAI,3S$)[5 >HYj Q)xGMGY2(FEj3Wwoݤ1"=QcD$+ $đ ])4Ca3hմzTvRԬ>kin`xRw([R1WɊ{X<+W;w>iNF{hcAEJ6(a*^vݻ7|~D"a^2`,VhAkca)HO\CI9k%fdۻTGO(!fB luxB: S߯@|Kxz)&!* (-^i@$+*4!01r*P)0SXMkbe`0-hh)k,:JP BLBW ߁ K~Ï4ŒH|Y B!H,A5(I1Vx)T5ĄDPĈRxBE 0[_߀8v/}+9=—!0'P]qH YiMߓӐ {P_15_p!4^rMN~^u+G*p[n-=9 t HGG\< u[?qB <9vt ;dK8R"lv[`zF..}u۽1_:^v>|&jaeu~ܹbup;1zAUހ][!hC,L]cp9\u %(6C"g=Z{pT HjGU?ϸ@C"4xbzZeh#Aj_HgкĤ c@xXk~B 磫^n)A1S C^OحL0LKE?wCd;˜L.pCA%ـ)Vc<;%>WO(y{$ 2Nd2 0Y v Bzb,a$Q9XKZ8(I&Y8`bsZ[EjAzX]OeA+Pޘ3N.%FS.=@La ^FYT0K87D^عAfᦇyRX(`F0ph)]7D*z E&k31.~79&wG\~27wF]lJȔqOT I5JԭAUZʡKnC0^`zM&lGj_ /j|N [|Voo{{v* dM#~4Z|ƶiF 8G)`u)UJnw>Ûl<`B2 zY7 "r0 h tI[(" ;ZyLU4 'efƌG9[G5>2-SYbɜl!d Xz@#בMf:fes ~l< Xw9DI4FNlIbJУOn,-(AS$OZsNsFII)0TF0`B <ꁇJD&I`K<[%`d-2T$LG_@əĂԖcx ,EaP V4#OR૘ "AՏH,Q-fPeDd ֣K*PÉ,GH"X inb XBf*zAI\dkKlRSSpAL(ň z_4`iFAuN j/CqAְkg:6 IDAT`N]o,B~팆Мu:\nCZB}MI{9*: |MQ5Xo:Lzw{Ξs»߁K ~4|.;vф t%( s >[a& C}^wۄ$PP=%w!u6Aq!,KĠ9p7!^r)/`Nԧ.MOιtvC~ąmQ@I%6+dh+=Az [Qh%^Q 0ASJ塕&pı 2J:)aL 2$4ˍ\$g_j⥄C'uDtp:]7QH m34<"W2ݧųL˜'H3w*sU2L}`:>[rG6ErQ oO]93 ~ 37L=i %~AAa5@H "J#&А:,22ځ:*vIg4V ,EQ*#/s~A"3qbJ}o3uf|Ä'c!汌]"W8+!XK2 Rsiy1_3\:Yͯ`>> RtDTXd89KxRWCI@EizŐIAT96!~o̝?T" /=K3&uVU6doi`OFi>K:5gc6)Jhjz3S4 H%K r?: Noos ~3Sҡ;vxT18kbĠNWȄ(s:4jޫ1Ņy sLmDAi>i $aYjt>=KsD;>ӝl`hc 6=>5g嘨+YJkD=\?&cOO #Zdָ)4G(KXXBcH"V%Zv? 9ʥKs z>`1l GUa>V$SRa$(5ѰNBthHB[ e9>1R%asٲzxH0e;o!O[ȧ dl; *$軮U7Q&.O"Tڃcw}kzw̧sW2o]h ( Hp \4ak0>q燇p[ھ힟Oaqޅf?wV_;.%}oo?e*[;ѩR@| /p w`8Tζx{9֧=8a0;o@ Ȑq:߁؈ủ蔽!qƃmvې.(D ד ylkazt6~Ϛe6N!4=FADD:AH4Ә nK_0Av^}kɡ-Im@Z #"#VBT&d>׏xw/1H E%'$A,V$3]jk%r} ]<83gAf"8ʔ)񌏧3rX?m,~HXRJT󟰳9ɻcVdFRYJ ~d`w HBn,2:~B͏=)I\Pu̞4!U4rm4Vgg.ro4zsC:q`ks89I]*UCfOn2[^-U"v)/l&)1 6PWP"zB8NGUd`E 6wVH :0LDVPU|(a(%S]2Od0df)xZOoNs,YE Aya.@PLBЂrie| of.;vg{c(ZW߃g( YR[qxS1*)L7!Uh34l@>sf^|*/û!L*ЩgC%ք)̵k_n߁n1Djc[VS]EYϟ;MN@VA4[yf]Zybf932gbed=~Sͽ̓OX9?R(];Kܘ'S1/'ܴ+7nwOz=א$#֓Tɯz{qS+(A'TKIncSr|:ԥG`d k҂ܷ mRxA[XyOR= wGO5\|BW+m'cΌYd 7g(g/`;Fo0.<; _#gGw+q %<[[gQdUJZU+Gb"NEbuDt-\q1,38)DUA=r^x.T[\p!/^F9G+x1>FPf0KE/yCɷf$b<7i2às3mGOu1AO"*P%aH.!)sfLÅeۈ' {'Ĭd!b|~OPB03Lbzo4;T[298hg|Oh~ q̳ ߾C6-Ls1ƯkZ09+ɐ2 >&;yBd<[1=v>TOơ49|Q2Ay1V>+cx ia9إ7y‰)EOˣQh_YkZZOips췄X"'ν w /F꫰__'?9nʾw*˰^vw qgu r~' - y4{ kW\+P Ï9/5߇q?yKVYsro^wpZ`N$#}nx OCO1ݱZ嬋`p srBuk?rs>>A6qV8]ݭE(;q *iޢ[֏xY, ,iVC>n,kӀfؙRbZsHWq(ћ~A^(6LoL71kmsN{ܓ [!t263wvh{қ/S;O>S13?\`u~dy @ ,dJ0~!x 'UnVKVvΰazFmG g :Z.RأVKPeN?3l *bl]n4> #t &7*c^/'fέSzW!shq:{lpYB8`Mx9p1}_}jt<# !hю+/DM^pMl*~3 8dɸMWdu$(1B)fUL"o N8˯D|1k &c˃AӫacnmL}wop'U%'F;G7%m_O?B|ow_6RNByDTetEJ(fh"z|<8nnQԮ3T&" $ykL""[GG$5.}2.0 BP2or^pDĐ+ ?P"VZ|GYyToX[&\ mrPDxvK)=eLӤ;Q-)gΕ,,Eǟb|nʓ_af9Pi1"M#86EDwd9PU2&#sS.=s4]22"40|BG~|/MqTatsïS$<&_ާ0g..F%\x]B6w.R~LA]ړ#"bD6TS*OBW,'THgp|rD¢ݳ$*x kDw98r̼ ^\? a \Vuscc |=ؿ |ixP@ހ!Yvn8w>; >tkvG]y܄ ӊ 1v :HûνjwCcB0{` d "eazBB`’ӌxZڂFf-',``sD x(P_yjdg3?}tJW-qd/K Lg>XR&eNͳ$FKd tB|AR!;ϾN-%߾5 &`[ s@.e `Zp7O}GNJ(`FE+WX=qi.#=?h)L=p:$1D5Ce$3#z#-r࡭%DӉ P>bDG~ zȁO!" *3JGSǖα i< -v RiDE1)A%8u'tO3|"$'У>y#K4 vc|2E({V&-+|6-o ޣ[0) g4 +4bMHI!f5"KȭHmQ!W}TvXŜ˟䠨s29( I)#9dd,;#w dLUҴuNAcD.f>ۧ~Dm q/EO|( -f~GxЬs wG?Ѩ4w:[e1֏ADQ-yT_%M簼Grz,-g87@H?RL*jPz:2c4 1DLuER} fl2Z 5 M1)lLt0c:c"QKH7FR)EC٢1&0(?{_L l뾈@+(>:mZ MKsӹdڇ̞;?5A0@>wan% @m>YW'{tqͶY^Kpr.doϿ?ЪMw 8څՋpM[0혏K{Ӆ=Mh enN" @O/,sk{z{CH(l+A8~<(1G'/ߒEl+IH2ٻ{ꭺ,yEJ@S?ꋋ|M1kP>#թ#xUآ%Zͺ`aTwđ ^d/Z.g_7[`I0[G PdLMB0g!FYE@w$T^A EF ilB@N HZ˟a.X9gրWԕs-D&<Ecâ1p=Km'Wލq&Y+w8yI[<ƈתmA}ejDy*DեR%1c/,[>c3s~Yd_̱^Iq( LtA G[@dS|M|¨E!+JTu -t>W?/p Hp->d:l)R3>Tc)YTNqnP>JBk_XL~H$z4Ul^3e4c~rCQPb^?+0qӼ.QrY %xC384m%yS" _Ё,B&yW bc4}aD*/82( )bG3Ȉ Ґ6[_:a;elBLH bPBguNR$U?3\sۧqD?6̏-H"S`g0(&C<FDbBT"&<#Y>3ĴBDq)xe(~ oL -=>wgͩ;&5Oa˼":ա}FD$MI18XlriΠZC~i p# צnoF zN>l=|-ţrK).q|'W#Mii(mJ)%. \3" ? Ad+Z24%Y{RĂjv879PaS~U!Huqxb%lmP ]B l^ߣe$' x%\8ZP2Z:;"<5xY";~! '{R /OӄR{X5c9Hi3Qa9TBPM %H[F@&ACVPs@{4ŋ$xpA*tHsc<"Iq.4>ɟ|t֞]:b͞DLoR7 B9נ]½Oz֌O慳.|l'O~ܹ 瞭;qX~ [uGЀKgk)W?_k܃tLL.lnR@5#-wuQ`uf5֟#@aG5А699@0:XR(8 Vo`YD9EʫL)M.' .:DcZ>‹M^":AZnHѪW'"PK/Au8D(b._ nUGWv 97 1Wrui-/3=0#fV Ϋ7PIL#$C!bKlW9(.wr͵m̠B/TP)%iMF 8<Zm6eZa;#JBՄd,=N;yM{uBq9fI۟bLT &)K-] (h=[a;aJ ֘ϵhmĭۈo] iSbtcO0P|eaSfe^ ,PCƒHA:)54NJrY18\ o&3<#|촠AiLl **1xMKI=F.:zd$; &%  렍X(3ڛq;󊅓 giM' Q"ZT`#70TŐN't\4$g=_vrJw`&$&`+"3Y1$!)XZT9}+/98F̂7% x0+OP(v:1. ⓱?M@nԟ5|,p3s֯J9EN=*E-&sa9c$$`GqTQj`c^%s}yH{LB̍Z|#lTc5E1"hf"btQF Hd 4.bUxdUgFQ oҊ tu ]ڳ!*B?$bJϦh =pߑm\ɹ!Tv$ڪqmכl]d}/[0 h< ;PkH\4av. AV1l}f^r um@g|ZR1)yik] j^q^}蛗w~ +߇|:ga>x6Y z 8TqA ʍ?W?&C d7j"|৿DկTuJ+3Ob#ZU~1 \3TG%@(ΰi E¢ BP4*b+lLFV9zYΒ>i(dL>zTA0ÙWJmA"Stή’f5]qr6} OuĹ6 fbr/U9N&G0eA7@Tp=:Ѧx.@?`L }A{)&ATX(ASs2 p(Z] ZU..֟b%_m,y=]A^KE!8K1u9]>3J#z *^85w7(G8f^h"k1EI&ۈfX\(=uJ$x)I&DJ"@zuվ;SXyMى١̡T`Pg G끋$F3n dac#(!6Ԍeht-. ł0@&[1BX ]#<ȠV4 YCqF^)efeAD CxJ !p~L3m5QX%Bڐ }GkE0:A*8)$hb>yrI`QNI0,z z™91VXQttTyԁ .ˀp(Dj^%Fw`z< ҺiN<,Ju𝚕B܃W~>6g`z]np"4-rc?_WIϜξ0Jp}߄72G !lܮ~.VR̯5H(nԯ;]4=5qtrZ_T;u▙@yZaAEƘuٟoBR J_Z< B!؋qe?KɌ=sL!eBIc E!) WdXC5)t^" IV f!Z+Ҁr`dCHSbq&DѰO2cq[>+p}~. ƚ4%lό4ОE^) GX@" д G ٔw]:I B92 p"ʌVx0uGQ9.0XgI)הy $-㳪#.4ZUv)wWM?h98DA E&&DԥD]%(h >K&*޻;)،ٺoOԎDB'&( 4y蓫&69n"0YH ྱTs ̄Pk r&D+S%%H"7<+e%Zآ"7 qFjASV3P KCrt;>kOVНEҮ:u+$Ȭc=p!Q8ukrΠ"ܫc6ofs+qpң%Vyx#Ӭ8C[ ]Zd̢0%2*|=ϚQs܈ʲ- ,!@D" a&9b 0j L,1aJk;gj蚜[[͊Y)z͓ Q4k5phCޮٝ4S;>m4.d)rA:Oczy~QؐJQA˖ta$2 JUe]訨<Ԇo9iK-@рˈ pM,ȔBZGmӺGaupxnN2)GB8~(GN&HS"h㨀>΅0tb${vʴ].!-B*oKJ)>]" /$vtc% QHJ'v3F^TV0Ԇ!CG]THLX $ei sY,AIj k쬂V??xȔ<@~G~O"MkoHPqfY-v̡LsWɹz&uS9?x3Sѵ_Xy P| %@w8lO^ z?:mX>_z]Ϭԯ=އ1|GuN52T_`v 8bkUM2[wi!8==h]b\v~^8gj U q5C( 1df\Ocx_`g"&2+T %9=cKOf|gBoN *GBetS$ L1i )S}n7YMp_qbgFro5Ss*QGLNqU.ewΦx#>q )P9bdsZw)_Hn9D"QE8GT Ye%9@Ja0ی5nW~ڏ(~ا9uqJlȸ Cn6}`LxE !u$#sE92]Bp N%#8|mz;:}gN%hA6o ^IU#{W'/{ x ϚC(SsgJT0L#Pe E''|-^h)+nŶZ xlW3D\7sM N Nfc>ٽ7,&>y:| &*<:+ IDAT1CW+ 2s[(SM۪kD*fNclJlpNE1c$9R4qb }HȫLǜR|ۙ3 n@z-cL˻>s7d a8e*߫LŘ7!|6$;2ai:}#&,z3UM/DK E4͙2i'g؎} q(y{d9ݏr?̓#-X)d-o]D}pf띢\[Eh?ˠwT S5!ܑ7@HApY>6TWX\c;a{_Y!8*|!ZͲux7`g.ú#<%|f:N8h;]Z_3p>sNk1̮xZ5v?] 7{wҏ 8Y3=5P꨹<\|zBȇGGcV3'?akztگfy\,Ou!u3OArzldB ,49;6^s9iG38Ǯ %i`bgɗ㷮I-+ WmJ 3x7?<[E_I%K4 [\y*[ĮN&-4KbY{;_<^=iS2\Z̙JV DZdgD0"/S׸/S~0ey2[a ֜Y\`YB[L4 hw8^lX9ն, I1GPjx)xs EyKɎd.(Eng#b7 E NIH!'"v x&/6-5ciK[o}1Ng3 J>|> KuqebR ۅm m{Msr_1/=S;~D5l1_ÿ$OZ'pēbqlE'jFVď".WdGsd9Gŀ˴ɷR.|E1͔- Zrn|5;f=E0hSa<(9Q/Dp ]Yt' '/TX=|$dm񵳔>Fp&(5&/ň'ךtmNA11v&4nEfUT83ӂ%Al)K<yϠU -Mn<Ϯ{i} bJQKܾ}))U WL;1Bu=y8?a#yخ7( Sy ol5E-7*@u?V姠" ^= kWGzf#M/ŗ>ῂ3Ol܂'pf[_׿:ZrgQoI;5pG |opiMj/H>OC~[5w}hU9fJmx"`/6E$#->0m\N)kNt<#4a\’ <"a5"$V)a`#KTԁ(lLtB4/-xFcisEQlAd#B8L&mQ~mp }WCVN/sTt/'-\LAMdtیO0&ʲ ^¢$3K4Yo±vt[]E㸝sua>fxt"=C^daiO3<&yL؄6K^:OzCTb>Uc\HFېEhJ :8 P ]TBGf͓vZXatAV=&%.:s^K3b^13G) *BhE. :P#ӊR4v&VM*3C)%sYQ1abJ#.Y"=*-S| sՐ4XLLD4{^`*yɲV7= _'gy0ޜ94MA 8GnIkTx8Aͷ'{m͚8 _=y܁OSI?_!ay3h%0}P`}=r>u|Tq7G\gnuo_iS^Zgj(evZޕ| e0ai+V8]xF\-mfq7í{+̮]x͒Ӓ-2 k)9푏aoaILqCq |o!}&Xu$!~nrv-%zvw5mmqrs@`;48y~>A?.{6+dohk|"+ OܜL:7 `7DqkqEZ(%ӊlYqFTP%㸅|F+Y '2r),Y2MmixiE9@s%R>q*)"0aڠW1"Kc SKb$J6?C.ylpGG_@@iF'pӿ˴Sh"@ܨOamנwuL/h C.Dg,BC؄~Bo5$y_17pp^ Wg aox 5o>[y1z~__F~[0R N;0A f9A>جa%ڵ*CKIaq'aM:nsj*X?:Bv~WkԬ{ ٲWgbu?ܤr 'VP6L WVAwq&ȸʅ.;5spP%5#yiC^"A,NPF7 \8';lW' ©5h} ;/9h4wY?.Ol \dC]j*0 wA,Ac=1p}ㇰ㾸F[\"Gl47w~t?ߍ~r97#?Hi!Wr"viD[T}"Ŷ*1y;?"m>F!y4%W8 [ z6x 0ee =GuK<{WӿIb:q0žQOQ>R8о;DZ ?r^s샮d.մLlR4M`L?yνgy8}!_1싘mKdW Qp1wʫie5);>樱v&VϮVX =5`gdv!d~ %3"vɉ{&rDE FZ2a3@Ȑ*"!&b0mI4@PARB#04i`5 gr8{:ok‘%)+W=NwCvk D{@ 4;-0M0g;ϯ obeǏhoeu)a߃^#LbtBրnQn)ܻ良1G#~$kh #1bocoZ5J??'gr䡴YČQh_яA^ hYKsކ\~վ_C.W*/Rpa wPl޿PAR 迅4u8X߀3E:ը WգE1 U \߅=W\_~_+~㟂,<CcӾ 18"k@q.:^z ݇ғ|(5lXtd95HD!/*0yȢSOq]̃?ƄNJ8t\]eCbI.bd1yvhSBbs`pW1 d;d5Le)>7c>3mָj8 CkQǓϡUqI}~I Z[4GXqLU! fHb69=Ӓ- g/[; 4W9?-$>; lmopỹSx; 9R(*(#XIJ@2$D uF9Dgo2rKf3ū̋>> _g8z8Zh>1yse۝{̋NfӻFVJalė-|0I뜺~ ltGqO1qq.-s NBuR,rq3~=ɒ-rbbʼn^->L2vopy_iҬz˦ {zj2Lш3?])g!/YͯFŶYnU ;>;uR}wkM&#~(o s%56IJ=xDxɾP&L25)M&aY-^,ϯ9Np% ;hMZ ӄs0F45u5ˤ:AD)]>σ{D_o\]Q ?51rQ)0Uu9cE\خT8\ʜY[/7X߆Ƙ;7WfvOha'BqH-] uIj-/-O[kw/L`SS<>?39|~W! ;.%ˬtXA%):C5Q ߦO7c'W1.JZ\Du8g5uCSI%;%?k&{|"Lf^'Nr% TM=]'G1>mשk*MpսN!ޢ?vWV:ɒ=iE79mhS,ئW0 &fC!'̌#iD2}+}O0.#?X mJ]*4k-4&"@XfrhN8o:$i = yd$b<|D0n*,y?̓s̟o 1XWawixsp?-Zew`a!UfH>+ LL hNOmC Ǧ=^.L_| # E6e`+ o)95w[wehHVېPq;y,g7{pס݇!J 1ԅ0A0qH}g&L[Ec:LA׊0ރfQd搮@)Ex "@ PaB[xP lU1![+#BJ?FWX4bsf4`+"dԌf9ÍT7qu뜶!I=L IDATAlp6, 3"0M҉!A74jX'#4‹D4=A=jcE "wMM:4zgy=K˳X3O%mBwH_W)6sbMn8 *d:-#:gHCB5"5ɧmE]cŚ%xFD}kGeMf3bOKJj3?Y4cq5S g;#ACEtG~,ɿ̰>b:HQ}KCr1Uh!EWp+[,y< K^ހ]d5eԒWL{zVa*{;{~rybcS#Ӝf-Єh"XF8Ecvc8u)}<41layc}ܱAWj{dNuэ 2og|+4?zmBL M[r$$%gȳ6ZT@ŀE ?͸aAU]B Ei q.9^+נQ8@ZR MT̫X0 z2Rf*w{+xn؀kp0o_l4|kX܆G=W`k_ EU3YWk18u|W v+UBV!RB⦇i;nBW:+pWB%lл~`u,"jYu@("m3i1c㘔K)#$5q?6h50ILPut 05e2Y|,]gb)HP- Zm)R %Kp TATQ VTO x趁}1%1=c=FG"z]Ԁ&цȭ"_b@>C;r"X|w<=0evIsSai씨)GcR{ij̹)|i7PiI X(!-F!U0^CbUGfU`@U9;$:4c YKZ &ϔ0愦Eu/;9ˣ DfP+su\df8lZa_#8c?H9/54eK>GILH8iJq9@BPCZcZE18Hɶ+ٰ3LDbrl{9ﶏY3F Ptye4'JE t'ҤN={ n^!XF,6Jb0aT 79*'d2#L&);D'M$m\d"{Fqr \ %"%Гk@A͘\Lg3>'L=3Mpq|N?$Sɾcy{8VqLU @-G#r=-H|#R,./c.V|7qҳt <ݻ~ 6yTeBC=]V$@K@xHZH0Km+2*™Hk9֍*kC%06gI$`7B J? <%O JTqa`ELC <0 < QIY6DCt+p0'}`d~›ih=Zޮa},!\T@`@di$NQyBpAQB&(0# Tn -mHi0b/HЖD`cFјT[IJk@#- %,t!p?xB<'gz!M+ Fpn/b]! > 6ZR w`Mh}. ,͢ ~8mW{ù9spb>(Ͼ\?>~ga;.}LG.Ҧp⫰&Į,sO'@pݢz /D[}8  a q\{!|_:ûP?Y+`>̾ aoN~k{hQw _NCH .{5:-eâ Rſ[ .oLJRtNzJT?DCG!EYdbJ0U $`_~FWhv*Մɦ"6F"qŚت Dcn[ nXh<.Z=`}RԡEQ3RtX|M@(MV@dO$ {c=(WbH0Rt "oA=ރlς8ڙ"6`dPqţU*+ę(F*F)Ss5N}׏84eޭMct)101OѤ>=I`fYF\@cjT4]B=GD f([8q]"ʈLR.Ֆ61(aĦa9L.!Àaj)!7mB[`K+m"YYPt;&0eLHmI2YU#8FQNn4Ag,$3!RBr1L0*Gfn/2b apv z ;V!QF#bs̉.2GzCjHsTf!RI/vFtpIAEZʩS6 c[R4LIlc5cu lv8#g@m!*F6$Ʊö> /S),f&68#% bl1+) NrVxW9=`\#@)qQWȀ- WLI =HeʾHu~*μ?aʼJ i::rf+cŸ;CU9rGBE3G*ܙpnFM|/b-N8U Zu Y"+zLFAs&=3 V8 Y#*5RnrSNRbƦA:%FfMh,RcMr)s!RCAf3<#0RR QQJP-\3AXFkd`h(21@fV#JIcy2O1 o Y.LԽ,x| *HSuh}7jޒ_IYG {޽ P7!q`kEJe^Q@<K[`V`!8VD[` -ؿ7o™=$n =P}F Sq=,!Vx] v}EFtxE)rW"Ob+KIRrPE6PH$ :Q)9f"(!$ HX!*OP<4 dl#)S;͚ tDhfGP#@\DDk񂲂b[$Ju?ȵO1xj>*N">ii>@(}8D߫ 1*еRCܖDkWΗDJ_UhQ?ܨ(└ qT)>%3Qle Q85[/OK %z8`I ư\-1TA0BB0"ec9.i!SE`L/KIN#\3%$U%,-slSI %yK%R$C)͚XÜV CbMJ i VF,L߆.7at/Brudpa5:LZ}Xt̽PH+vo<^HǐB)1 wt҃"mzzD /!)r+ΰ؎+lRc,k<~JZgHr8T)*da5y6ds4 3SJ$;Q .]T܄F٣\NqP` 8ĩb*ȃ : RҨ*fD%CglS8ax$ :Dcn~8D$aq[h.NH̔.89R%L"L KMFfŶ35Ý%hL5'!,Q3M Q'(V%҉;I_rPMf |  Zq0+c,*P@Z 2 icZHyfFۼ};_a]LҧKw_{hLހkPrs8E 8uQhU~ѯOR#|.+'0P;}8؅J0£χ|:ܚނ=ف_كs[\-8ñ,QoBDhAqh` >$u'_&Tk>lѩy8h@L/~tԎCy`v>}";]4'[Ł]iZ Eև> >KEV,@C_(Ħ$W1Ukq<+'5Mh-5t".Z WE'1)Gҫ%Ff t, 9au19L6@f KTHD6# :=Ĕ&c$2AoEdr@nN3bc5l%ss]B6рRXfSDqހ|zxP2r$Rhgkh#e  IC+1Ks,(h1êƨ!Qy6# 6F+/X)hy+hqr-[PiX&# &#DrAhGd*ŋRJδey$ F\uT23J ;&Qƨq!;x(8slm͡ `A?v2j0ไ8GXoW5Ltq>F1IGj0Vyg"8"[ 3iԀ k[ 3H h̗![EVr' 2}b4ĞO{.T[2mAw:@E] sPp!f1qHOllG;NJS)k݌o0a)Fȥ'#eb$YaD6 [01a@iǩ$df?3)ySRgQIlcxnΤ3ARWD.appl~"<LvLCQ74cґp1Y/I3ƘBYE: O|^j8ߥoJyLMԽwOhFQ' d̟}Ҵ?t E8_g`r^0/PB<=y:߅g6f~SMy /+E؄- IDATCxeX~A 'OoU"MTۗ bEF^<a}~ '>ja/WwT^[xWTf .zH?;waY:I w˜|x|`=p Ze& /PEEw  ,Qq${&~tz?s&œ"K("8'&C> }.n+}􃧙G+qwG5g4Jݳq O$UAXŘT4{9ZGhkܶp>jM} > C !"YBČ-!H'wȂ Y(PIc. 2E:'1" .CQbdĔF]NV33 INXd{Ӽz r)-:C~\F~ X `YXSiڅF5 i%x%|mwq;R7xAujO/{mRac.APa)72!j\"|αl``w- HsޤjJkLUP/oŗw6?쓉XSFe]m2퓾p:MTėwz!3%]V( kXU!naN‹'#הm82mVR~ʃVJd>y_kP.FKt} T_g*W9^?r}HCb,w,KDkyEzC@uhFl-Mb(Eu96 }|GR}}zAFdE5Ր3Հ ך_NxɈG?>fNҬ3)&7{ocyv}ZL/p69\GH,/$[19`$! HhKLGɡ8$=յ׭(D$+~P{޺绝>vZ}w$#Z)n+\_!GyJ)k835|Eܾal'$[}_~Sgj 3XyS \ܟ{.9&ͭL,Z R^dSgO&lEl#"[+fY8%`vc{EU%3C%S6è?djk|i9I~ş%$P5=+w?; L>K-ySgܩ0>+{8xn\tPot \a-x밵@A`a&=84:0؄>\~zD`0kO!p=h+ 8w665Mñ6LC_Gp-(s@/7op&`Cֆ:$M OY0%诇rBb&㢒`g( GD= ZHRCI0y<0Z,) hLjkXQZ;3M'(2H=D+*`Vv.Y8f}{ :N1\m(Zr;fH0#rń1C.ۄ>,2^THGp4Lx/9 Xk+*fp{Ћ>Ev(UI;HM&L:`O?`CV-KxL/ѰQkN<4z9ϾBwqdG{bV#(gSk꺉c j3C9JB =L9'*>3h|1ŀj;;?C~H1mщR"(V{">u?N#H4f=E5rϩrEOޥJ1K4ovȔ:3-ϗ)+I,;Cn]6ERD%FHm;(\Z8E!zXa%2*hv i`(K:d|Űh҉Lgt^!ui>~ٽV`,&ܫquH'JH a֤H(&#]5/{q՞!R|R%y쨎8J_QLM۟Pf6!%AnuCef* 1P, 3YR4|F]Bܫxf{Jb KI'?|>!:ۧL>axĖF[&o_5CEil2&5!QU/Z49>Ն;;|"ȏ}X=XO%!KY=t`< ߺ&M8g6rO>| CȹE'_aqOek=L-CZӡGkX4vn@ua??;tM 4fa}-I8&Q+,ev2xIّR08,$L@qiH{  L+RGl{KF^P׎tZR5tTMXAARID$56h+HGnϩө2j1ŵHSI\KyhB!2z |X(8pID֍GHE] jr<8CPsaMMS%^V-y_H)U3š6Baq]b!}N4Ns:9{llIn2D;?DZg>KS27nͥ^[HHR—Vv.e:Ar8?qLL[VhoswK7iCEn+ҹTTDMs\2"\.5C+=-1.mC9Urn㊃fIDx H>q#D[L*>}4? 84D{hµQHṠm{P C퉯sW`Er5\{m}4`zH: ՄsT55\X[Мe{0a{,HZ vIRXY @ɧWCw|Icaf=8p~`X w#:L,0x>aE8rHEXH݅?܆Bl`/}Zۏ{ҳ0`_ k0e(/kh)7!DK!O\\:dv_#؁rbԉ.K k%dTN{&:Dja"Z tT X!dBh2;UZsG \+Y/g#E'=xp 81SJyH)a' _tz^åY>+Pk$E3MbM$4*QqT)eU0TcͤQ"SGB8-Â$nF)RTyREN@L']I ~,)DJBDT"q*=-+,^F\נJA3iFr']3;Ou}ɵEP1xڔD  څLxSa(d:ir|٘!bͫWl!9ئVa,Cj"Wh.Zh`#CtCAn‰gF#rQ +&65'5LL r0|HiLG!IjC=FmDC\Q UT֑5!k'U踤"C[ h,G5B[ZB9H9?sOnwܽAUUhL9m4f,l\Nzp!ZQi_ Sv@9\:sĠCn&V,HuII9g D1#/2=&ikDm(/^vGgϞbs++{wr 1HJT/<nkC*}`i}#43PQ2*Fd{4Mpe̱Qû7kGyؗN6筏\p̥pfeZXW x  fР L52S5#C>ygOA(M%!%1Hz0#qkQ cp‚1Ëۘ.A`6A^%A avK*Ls=zdC1VTHoоE-.cTN*ڧƓ҈,ִ=h')DP Bz=ʂv𪤋Mi1n ~R!} _@aGhCBԆr tNZr!Bmxc/ӧ_~Bj hzpw#piXk[p$8 O< G?χkj)[<8*?^ \64|k0HOnm׷! Ͼ=YU O >dS;+f8>/#5a+'gR;&oCȨ.] ~{Pq5^s|^HJ΅&uK5sr؞ ERv3jyY7ƀxD,љB{I 4Zbpȉ5o$aUUhቼ'FיuFխD5D^fRK ß@1@ij^D0HE~`. &X 0߷,]Qp;P} " (.C&e?x~dlDy\y)~z ?~z ?^f K>YûaG FWp;7D?f6Le/Q2aQSВhSLm嘉0"v(_&"j~6 z-V͆^`"M «LD;"wO? /Oi5 b-k9OjJT+ 7p. 6 i:dEOr D:pG8s|8wcdx )?\Sgȷ1F 9}ӧO O$;U|I< pjL }BA"5N8jQ^'*| ,Fv1^hsd$ IDATsg9. :fǧ*7&=v S6%sa'+xy&\Z=a曭<7__|n˓ ;UK&QŁ*6ƻ (ej 5[x*Ş%y޳ּ$֖v$2%A"5U#(`̓y^5ᎄYObx*FI~gp9xП??z6__z= ,ȯ~,S-1,= 7@|{_sWBooZj\ka'+s-hA1gz+|#l:qe ʦ<.30"L.Av.6'7#PmJמj=/j@XZ]G"8H6I,Nw1A)l+1:4Y?1_58s-zX Nb"a&m֋ {/p+=SplrŔ;[L6#ldT:e7H[qB48HklZ:eY3ܧZT%LEP vhp":FYfzw^sd8Q[\')ˣ/$/!7Q|Th#l9jRfʘX@ӡX+ d%v;֟g>:hV-bK{Xq45iwg(wSj"\wH{ijP[TWkDmL7bQ1ULN+ZӉ3 ~,YòdeQ{9&-AҸ_ t Ӌ ͣy4?}*,CT: MP$ؘ޽ }= -h>Q †n{py_ f^lݺC GTh>t~|v~ }sp4lއ`'P Boҁ,?ݷgw 鿴o~} ~Q6-8kkfa>ư~D;{geS w߅i9{τׯHH39{Ii.&̽1WnVc4ϛ 0 ʏ ,.#3-@2qmuQJr`ג!ɥLRqhD&2G`^!} EmY*Z{&mX_"CY}(j&ciQ7"KHG![D[׸* &?|T7|h!#R)%`b E'B`T5bRxڇ `zBsX@7Xq-xeXsO4O"F4w9Yh! VD6 Q@4JP2` "ȉ1&J b3+|v|/' >NVckT)A%(Ѫ=1&@iddP?1iDqDa{&x3F(ljFehR-\J3>p5V*::C5Q2%&T><"tULJ#R äb6Kj_"{ZofLQ (5'l4X-Ekڛ[%^SG6]p~md9&)1 ͢cF2E&ty s5<ܷ=J76i]C/#YOu0eTyE"Ƕ%NP&̓m Љ3%?RT:!׹eCi&AM4Q )&򸱦uVCҸ&v J3!Oqچ(wB3Qґ`uM[z PTG=o#h61\%acnݺ^gk ̪_y|45EC Ct s?̶+P0g9<7a#B/~5Ȳ ^vz"x"N,_?*>{ &0xVBu$kn5$g{n 3pg^{By6~%HcN^߿pt ߂i<1K[aX#@!.ե{6NMoAY3Actۭџ`0A}g@X41 ̳?eǯ7jj$X }ؓ4aމ& vGP$؟\ L &>Ũdܭ%7>w2NdrEn{gL^awPlm31%^4gA5ɜA:O#ܴ÷#hUE td9:39?L6QCw΍w-~+LRHԸ #cCz.'^} \Sn@oD!{9K5 b4PQ:)v'0[v2xzlI)$DsCSORZCmzLpnL p$*$~Tt̜{=SP)A7W.-+>tPl 쵊O!ւ$^I9o"'n:(B- J !N 0h 3Mfpx1b+t$#Y\J09mOp=Z۫xu7߾Ijv0CINIX0e4L)GN|b/04.mJ"rz33/g>^uy%w'kz"zEA z AZ6ʅ|lN4:ʳc)Mx:WxJP !*y W{xŗ I:: TIHJTxP;XKI-6W+B A "s6 aw1(c!>n۰r=Eb.eS`:,k# *?9TAN:vUƨ[IvVBNg!&W kZv뒍YJQZҥ^G[q~1J(\v 4Smty)dL2KtKgxϼH7Yc{cwrYe}7'ӴmBSAae:r~%f7lP#*~YtI=1T42nta<$C84e=`IBxخ3ɣ m=6 D9 q|ʐ1gÉCO: RC-kg$l9L.Jj:uÔh4@O)yjX[ 9A7Ylr7bkCź[hbL|NpdAECS5:!*' F525jC"0+i-L2q4F֙>;L1`R'e"dž1F~:۬S" *#KKi}(ib\?בTEd uJlb#8!?N0yK鹰)vXS 0IlI#y^ GD QΨf7m#V9w&e{zͺS<1q>F8D{0HY[t;e4f}# ?PEzUsj˼c6yqm)[=T<#|E.Pv V>1d([B30Öa `DeK{D!AR>r)ǵJ2ǎ@H? e A{0YN B 6G {PuFY2cF$Q)+pK?wkL/ ~Ύ ơb( _Fڄ<Bqj>O~Af e@zsC譂!h-EJy3CKG=bh7^-<Y w?yh,:Q`}_o} 6x<9 A:g?~=Z\[? s9xp<4&gaG 5߃Ys?CD UXH9ޱ#Z?d6f._yެ"pS> 4p8S4fp-QPR06ܹmO\p83қJ54a$9C;4$EK !D$#9zgmضc, P2 Ƕ}9j 0v Fbtmfb1I}vDy*{ Y *h1jf/#<H8K]F%Ĭ.2i4%!h87x'=>8VOLuC81$5,91=QI$ 76QnW/aIW2*5+i.[ȥ,7x&E;bCCe±a5-[XA52``axnns^ѣ8=r?ܿuq{Kԝ"3cLD>wgNzR182ɫ'};ol2,R:W>0nCyf/ ,c:GZH)*bPE$pdBvglyr8A[M#|'$5kP(G7&V@kXK[tlNFT`>0c% _Rғu` LNJ<#J-ڂʘr@dD:bsه_gi^lZup!kCzsP}P9 > >2|`wZ4_`I͢A._7GVuMHBb/A}Nÿd} G$KOkS׮p2t!w]xpO0]prNj 8%.jr!-X-o߀A 8K03!?g8qX>O\Ga_ Kw^?/_Sxw` $z"/%bfuXW3x+H}> *h9RY*Nt%TِѠE5r 䐻yfS lNUCɘQ"Fh6vo_o3/]aKHN{ۜk\q}# <ȝqdkyGJgY]>-a/f-Kڐ(Ǹ;-`Wrk!R |\4khq UK$BHIN~NKq{m*39c^ÿ>@]ytDmSy <͑yѫX` V«LL<٧W]s5 vRȸs u"ݒ {\;oQʟ穣GyA%}.3{}^@>No8 \oev7> w^dGحxګ$}I>W΍>\^g՝42A#`ާ1-=eDҝ{o%W g(`W$>p=$gGrIO`:⢁mJY ;py0co]{ш8%5>b%\u\a%rAũ*nap_õ780ݻG:S9tXh>㼣=6夗0[k1ލLR]:+I=;.O8-*Nْ_[܎c7vHWH>J6s߅~PR.p7Hq[C64.p -ZLHM9BݐGRbPTLY%a7xO6/s^|:j0C—m76Ę3HUWM{IRvQ2٥dFdDfA'd;_dw5)nI@1xuxtp7"L!{zm[C^]W׈㯲{S/mɷnt]ޙo2'k+, *ga~Ɛ$.mbTN0 vt*D2N eľ35Foۚ:HCklb7z&x*2ӤU7qeRFfIq̩#5)<s}x\UeݜY7"2G-|gem O2P|Ȝ+ҚL /";݆<,\ )HnY YYM0vMXK>pz`Jpo*~{? &[P!װ%X8 kx0pEy pt`vbH.~μnag HPgEa?O:< .wF~ NA`V()8uv˰ ^[4~  >(`T}suV~jze x#A@x avMfgzx_뿎D#?hA:hPN"":x |1"B1dG~nPi&ֈcq&1S=V~ !EFw&67yĶqU7)Dpj6 lw5=6Uj1]Zk,$D5[ЧHl|Ez8<*w*K5yW<Ϟl#_˝4ari5IX.Gx|Tup-6[5ѤEkijgț}8ns9?3<8lqb%RSX!vO.PpaYv 5n0 յK:rurF76zOYgwatvZb$?ŭBOO!Т9EF~eT6=z?0+ YtO-i^5|~Ԗ1R;bG+{2O%H&7*m4N;jC \|"b1A^UF|~~-\*s#cvn#{ҒdG N1'~{MvoqA#mn?:k#^ qsP)=*_s.8-#A(TgpAkD8Y?cߟw3\zOÿq8#n$؟=C\_.[亊/3ӘZ,~T͙O0Y]b{ DqCwU1w&4M.m> ?EE6㔱$,'$'h܃i&+0= gɮW*>b'iA yǜiY̡ۤ'Y3yiYp}67>χ7h{#r[$+βŏ16 7x&pHm,C.cH^ޫیܽOZd*z2,LZ=)ʘ7 <b mGV6@Eed|\Jdet,C’{DSܯA6~%"<#CӤ'TPeyMy#̴:HKɌ76#$z=4 5X0y={pp` @mtnbKP?yh ?_GEx 'auO,yxPx)~ϿW>6ob8sw:Y4~p8z^}$T*ՁwK*B(g~~' Udm.B &lBeBUx#.| ރ;7 "<;bmm?o^x1]cx!o ˰nf a o{ x *D0=u>ȷ}_"$eG#TMm\!1cmd&d!%!)k)IFP^ 77"CAR"Q `!NB8PHHHj'zohhA.X &9LHIosܭ)ڿN W)Rdi fre]Ls 0(`%aqfJffЙDfoMJER1 }#h] M_nթrc:D16B|Lf;n{ރ:h}H5DX+X0`!{X>Bn[/lE16~?mfv ͷ#TOjƱ5s$#dLSGގb3zx^)jYIG#؃;aLjZ)JXD0LrZX7Eg`nfHRh.4,1KrCw|؇ zXIKD$;/>]4Y_ڀ"x7%|濂=x헠6df }~KpHP> 7.WV` <pNC(L\(R̥|O(Vn&K]Px$Kp8\u .V޾wa\4!m[ ׫qhuv ޾y :b+Jamf`,\Q,V/mOA)N:Qd,C݇Vag W %Ǻİl.}qHұnSoN<6߫{@Ty6 wGzOkZ~6WPq8D+=P~=`]U``2—heH q ҢV'WtqL>T RDn2p*Rh.fHl#PSZPc0p}5P=o8q\s](m7| ͋:`ɩ3ql!,9G Ndϔp.C]!· GhҘE;S)A$ր3Ml2$f R c9h0$IO;{Rm0>NLHr-Al0̒8HY`OM Vbuړ@NN1M !MK AAoޮB K|MTvmK:O3}L2VF GXt <RTgx(&dv}إN0n:hrqxr#qLvcu $ uV14AOAiه[CC(N) '{ 0 iة`?lsrz?k 쀔 XYB] 4BqdTU`.Pzvn3*hR=mS\`U%@6PXci6aaE!rȕmp[C+uQ:EA^JYmuqr8Cj 1ZAaz]Kn: .Il|7X=JE`(srr, p%~6\ {7w|[e]| =]#`l&`o@;q_7P o`ѧDY1||\1Bu83w_r^*AS|݂Ixv`|Im\z>QҬ0*p}.>~|z\yP|_BDžZ;YѫAtPtp+uP;S\JM @ATd`Z9P1h#4[Aأ#<UA rF}qIp"ҐK ;jA[l)LO@ kN.MK=vtZ@V<+mR xXg9(BdJ b)ɵM\*^Noɲ=6;ũ)k%( !s=_yM.[&]|e*>SDȈ!;qG9 - :!l` &`EL#Xd9EL #-C+nc 0/YA~hB Uab0.မր>}) Dz;!;^t[`!TEa89\Ēq/ -* W+hwzz:DWvX WW_~\kφ8dTzl#M:ОYw w=Ѵ5(0CfG4g*' 02]p\E"r $y$y9Bȥ"1=,10X1!Da"P i蕐=8a6HLG  >6r~Na`.vhm罋ϳhJǩxS.m05RaW$LD5-t^!eppiwj )$>u,ega FW`D!nϮ!3%Ŋ- ,וi*9! [/_MKHYguYphK}&ّ0#CDyzh= ֠p$@.h6FX4I2m Zt%bAό\X9a4B) B;\ Tc}!$vWX@9 V+귘+ zX?+XtQ^6_5+o ?aDavtd j+Eܼ\ ~)H'*и=x9ta|XWUx9&H^keԏ.udV;?]F7W ϝw;/;])|! oBhg? =o i3 _{ ܹY`y-^ cUX{K!/߇[a();_-R[;ր2hn#A39V\{ tZT{`McYp %Mr\Fa%6gˑR2 IDAT]TI  ɹ 56(/*5Hos6%sizeM[)iIK[\=|XCu(YŢΰ"C#𵠜Z2a rDQC~KH^eJg6PF `h>e 2 % 6Lу:c߻ O0:%eb$;Y[FVTVVUwWUͭ)JZX3Ao3<6a:6 ,ɴHI![M6ں=c'dMQʌ=F% +do wwY٠ *!1! bvѳ 9s pH'$xВx?Ni'ͬIX%x>9<f7,t0Bӈ 'BG9KH:jJioQ; ELp9^B<-Eрq BᨩYQ, U9XuMŢAC,T5h9rb787rv#f&x4pkx:@ U_b(+&:LmԊI>vN1 mQENR ibЈ Fi!&+%L1LЃ+GG'mV _eSH&ðjT}o7(Eϣ܀xgfHu{L2(̓± G dj쒺}cꥣ?6|.W\msevB") )OWQM #%4w862E$ܧ@29 }pGpSr]1{HM % ª1UI<2Gp':쒸]M!*(|)`7¥\ 5 ȳVmtQ H*P |~̂QGW&A(Q!JOpM@Xq&u*W0T`¹)5?&p3Ђuu<̭>S?= Q!h=Z?Z9 翋ojC_@`#P7KN > ~x-wڅOMg0)8?@XKZ x>2wa0_K_+_kc᷿xgy&|&|Jѭ < wkߊAC1<ӯ>k1 ĸh[9~ x#[oEoGJַ/o[Ӈ_}\Kû?:"/Gʏ@u٬ 32fM_dHg̓mÉ q;^G043F&J\^z]H7qgSg R)P'Wcx!1&O > !E!Q#Bb4`-EBtPU=|,"aj>wtsscFgrDHSh 15c bb Aa%<)LUa'k%(Nyծsz$EG:ӃUZ hGM:hb#@,"kqӼyKi}`& \g& L{D!) Ld! TBsJbHP蚢v:ĩxs"?Iqr|b9\#0yUe ypA t'#%P5X}>`I-P Rw vB ų9I`.0c 1<ˇ8W`PI A@ 3e+jL&R'9ƤYDA֠c ~ӓe y.,s5>!o߻[)!"5*@40x1Q ӈ cP*+*!C%(KԄxf*<^ȃCR%(RHACcΌP_[1)ABԟ?Z֣_D]ߍz@tF'!߆HwSX&Y`=Xx6{7j>-~߁l=VW@_1~:ҵpp ۿ kbߴBf{1&j\n\5J"2ұ 05'5_,B;&Rxip%ځcx)6=I K%\|xnnt M |6ay vag;:w!su:o0N v~"!( px1j<]p_2u P 0!c9(Gc| 8R`Qx_DJ)b+R]AH hH$V-!p38@9jx.xmyz`%dX0 C2q GUx hϲ3WwG)~NYbB<Bp`(ʗL-Ü9 +9^=HV#*Kq5.0u)݁ě*(I~ЈHDhDUZ, 75brX+D )Za L!N?sDӬQVOMb'ѱB `D Zdl|@A$Q_OBl7{ۆ DC0izJe1HPGQ*L*ʱÌ3M_yՓt _eiZ^#dJ  `uu&[c'6JO^mt8xT ()QbL*f&+T@Z ^ hW{<߼K91)MvU|qu{2Q<>F5ܙ!K Ŵ[Lw }vz0*%4R~T pґLTA: I U8'͆hTc=InPJJP 8 K1ď~dB>7a9h~8 =IMX]|o~' fYt ODs-8sOÝDD)]/j߇W#^&as>|?۷;%Xj9-u>ɘ{r.,? ߂U(_GAڎsp\Ԅ|_WV0Fm84^6΂2)"BU͐Eǟk:V,݀yJ9sTPi! O2mD*7qMH%2AzTBi@J4AZ=B+LL̕"kGzu*X`G*2 ) wB_8hx#Avhͻ콸giYFw(A _BBQ]-u|>BBޣApނ 0(8x~F]Xzbsr@}QBV"l OBWc͈ēb;OLK(R 8/] ā[FT|U8Dō*v ؀2"HG+"N!R jx]?ypsq6bZ$ClXJX-(dVoxM~ˉmvz-/~3)OYTl1c'#nӦE-AY/I 8$16eG(I4QP Jz Fp 4@CE!!P*f}2>uAht"oU9O/W|~KO5X2%z#9qm;ӛh K-QHx(+4r@ u'k ou6ԄƁrQŭ)0&-mZ !Q=?Z˗g' \?IPs{ nl0ano[p|ϑпތڍ ܂tCֈ4-åaXT9E=4pmXٌC͗A 8:瞁럆AD@݀OQtx,lCXlL\X3u{_Ϝ'#٧ݏԪp6l=x?۷hk&./DmP&SIcpMh,Eh wc(Oz ay}v=s_/ (hCEXBXtgp74@)J\B"A, IR#5A$ \to!$ AO+ h6FɄ4)"ը!dP9C"wYɬP$㘂>#* -QsZaZ}r; |qL0t O`N3Afo; adB !ǸB͊\X&U cBhp&H44NlP~v$0& H 8<0CXgcM4 i< <"T(5!@!D\>JEq:"Ztiڠs@o`1@=-I J+Jt$΢'h E8M*`+ǖL)ҴFѤJ_`+AO0:$:O ($@ޒfǤ'3rْ 1G7woRH@bZGx3%Sқh5Vf,*0O8_'v/GǮN:!xTD0(˚"OfNt!p= ?-$B{ĬA4/cs7PaZB&ÊkwO_ Lk`LEx[ǩ! .Gbf\93YH fʹF#Iqv!9.e&@Ǣ<>%28<>gup?GUD f9@ɒnY\d 3\km4=ՍϦ?7s7 XF6B,޵tLn襖2qޡ4is! YGTNB ! Mda͘&Td8#p@VHxhLgLIB]-Ztx#``KSƬ! ϐ]H ͎M~?fǢY2GtQ)-wFj34 A=$5) h)%!)MDQnDlFc)Mҩ-I*, O4b {((R* >Cs,CJRѤNuV:S{X2釜a}x=Sg\*U1IH0>AՑ S6aܤęw89E1`IU01IÐmJ$SBoni3enƅT73-j.a(2JQG 'EPPkAՀ"UȐdBO}YVv8fi5~Ƨ:a]uP8Og0Kx|}495F6C@r+h3eB1c$b ,&$q1m$)-0dEKLDʩh"6Pi 2%इGO*+B qP$w_"[ / yԃl6-h0y70w2x qxx  x8iyl ޹ XƌfYlCi g`kn#~~t7jE7eolÙ8ws`O?-h7kP C{C#\_%oKzo1st`|56Bo!(ccy_560D@& @(+<: L*I]@"K9bE ‘JFS9Q4k 'H=63䅧LaqQs))K iHɪ^H*:Z(N!IPy =n&&vp;5{8dX3O,QVo|&LD$c+}ey.1/"]=L{CrlhlmZZ9hxK+r1"AJ!pF@]yhHEa@6ږd/RDȑ%3&A!4!c%<2PÆ)u IDATKR=,XXZL9I85VLual %A;ATtFC"wGkmʻ'rlx(28gJJuM$NyBQ"]&R y4jOH`)e{qwiEϴRp aAQq`6yhTSᄣ{npv$I4GrLYÓ ɾpZ2H$2L*o)A&[սwZs[c6Z衄 &CyJH Ifh[2I.n9JUc&NQ1sՔ4J#MN 6 ,J )A}.Rs.Q >R'V?n߉w)WpcX?_MX{ .}_[m bZ}EK1la.F|޾ s2p+p\ pCHϲMGT1w &fZ΃.DG#?I5gn@$phZhh4"ט(#u¥^M9F+dJ2 k2HSE'68C3L`Cs qRRS0%1)d% Y@MX?W9LbBk D$K8_Np{EqI@Ith`ɑtEylW &MYin' 74EZQ#L)d݉?7_Q0 :c@)nGU黠zic$1,FD:.(#PGx5k]  JS mIێM|֨>W?g- \ \wv;\'tLvKL)jqކ߆YPODo?mx{N\W^z(>&s /~?UVrSGHp3˱br,|娣 څoA!,/!(vڅמ7|xUډY8k Vl!لFq(nQI學u0w:z~g`A-^YptQ$(EXrᙀIJhS*('fv9aܤd@V*KJ HkL%gZRL$yIT並0b %R&%!1#P0ƴ-iK"#\_1F5$ѿW sco-Gf"}.J*Rl*r\D^|#TJMMYXs)Z6wG; jv5g[tfO|ugqj9 @Ng6 arN` u,(EԎSYy kyM LD"QL' l\̐2>_ݎ 6`:.IaڇiYǥ AI* |F kP2X o}N~xW/]w*{B"CBJ(J ((%)rB1 "q+%(@&@ظLk*qkop1/ߐۂTol|o.dRA}kkqȤ"k<~rK|1\~hE1ZPT4FJN#rG=pR' <3 ''++sgxa 3or2,Q($ (#.lh$ˆ~KTrŷȭQ_ħ&aEi֣heCуa0g8HIݰo߅EnL װ|)2L޹tƿYq߹uèaM0t9Ŏovނfn\' 'oEj1?Qv7Wco ;qS>\V?ch0߄,c!Blf{Q'RKc5r:,e߇$'pPEmµKp;U(V/fĹCV i(c3Y݃lʠfOg_@)%c+c}??eMHǑR$<4ZT1\8hȦP zh8=舮\tLei t`f #E*<-N xK9 C [c!)(:=v Mj{~kUsY2`eA} pGl$SXGC_xj RicǬ< bc,9瞻l&̐jVIhA<2Adp1`!$1_؆#9-YhF#p8dsml()c>@Uw޻wpܞu=p O zL;d' C(!:^$@ןBxr0J4 ׸.&#\D kXDGa]-{] ͓8ܔKG m9끛D _bC {<۲& -[ ip'@᠑(!I')"氩lx)VPx?=aE-̓(7GuKKQ23k<4_WXlwXhn XW`@RHPZ(}E"nS V>e(Wk쮔3!EhgQ6%>sUCb)3<\wR7 ZYhk2Ѳ',yE5(,p̡PZ mh@ ƓGzazXw0}u>?#85/Ay7_J+-W6kn^ͨ<)iB%H|j>qOg,⼌;b *ShN#E#5`4w;wN Z;'9f9'pwKpׯΛ.ӣ1ƶ=*$&2-;mYفDy΃h OPs"Ux$ړMƜJ/y":Mڒ:LW,@^8Z$ :>^`<-ll# ӸkA!`=Xe?V:@X~辴! On1SOC.? җc`WEl)NU469G.fa-K+pg3jAg60BTwau- 35\ܒQg".ތӐs=#|^~&_C/ߎ6GA)߈Q oO~N›4Ÿ|#: >77KoF_#$۽$֊+߃cJ=YV ZwNםHMH.!Ve2TQ*;2B)!DZ AHOV2o'茥rsN^X|kQSM9F97eg`Jm2v~%ػ~YC7]MSch;fN.XYѹټu ZH[9=NWFH6(/Q|t^8EVgOU\[ -|LEt|t,ґBgjSpbs#/a) .ZʳO$lܬUko+noNpws5C7/Mt;2X܊Wp,%GlxŔ'*Fӄۛ#~e^[oufttRdĸ;Bm]O+~o.TO͠ ic?AI=^H:@uVѦD`^2z|WX.T@Js`1H:!c# gB ߂紶2MAVݯ]jT@]g^A+[JӾ Ltzw"݋NT_X '=8A)BO|4^E;cpm x|ޅ'~ނOc4>ND~3Q?x߂'>o= ~j&p~= ﯟN +/ 48vjPO!d$O0Ѷ[ 62Pp"Bh:hfƼ=*ũ:"cq.0b~ u""Rk<"=}!}"şeYqj"Ek3@:7/bZJEPuJK{_jDϭS$~~H5wXBx?ԇ~s=|9_rF![IG0$d&AAY\+U I]Ӱ2XHRϨe"*ʒwE SL:@Ya:S, Š2,jer+HMlSwV#!c)E8*oIF$.j18&'z6B?AXń7.pѴNh#ĸCn 9۲4jez~U ׮P?VŸR=6#t:Hb qzcL7\\^b>d3\ T$Uq0@)C-gԳuAh.plEԢX_># ܂6-z09P! X:vx)#AAУqp,p44{MVŲH_-;vU(g*LRX"( #!L*rˬv z[|}] G %#E2#QbfLWjAu <A`#`dҒ JBѦhciV^|/>a LW%52ɘep@GWg!)*)߻F7ڧlU/N$ԤeBH%FhA'Kp-:TO#UCʔ8U, IDAT*> Y(cUSU"k;ئ.amq:C+YzM];a0۴\zf,V(*3 JaZG[p]B;tC7-!P$9Mi1I-"?oENSOԋ^=C6H,*N+?SdK]͚׮5Jo|@- EBׂQ#Э,R%v%2z..~<|ĭHe,9x`h:ܐcUGxMU2 =4 A@* 0 Bia%8\ !5>f$4JГ=`P4B`MSy_EiAy갩ť):GJ6XD)h af@k NP&-"y2mA]4B)G;? 1zKB~~z?j^ +ud6kgw4`@XT0oûߵ_`9{B)"/ZD0stfTŮPQ.BH9Gd$sem;N)BϏ7Ae;$9 b~|}¼C3?7 Ez,{}'Eyp Eh5R;EH!r&.8Wx( t#SF)A:O'Umm7(rc0FѠf'S,ޑjL cMRK;w1L{ &MŬaYLX϶װHG3l=2m1^d`j87r4ʳ|Dey\_C+bS8Бʩ] 6ŶDw!TQ#Qzt 4 $Ki"4ZcVnp{ޯ(ry³<أ  GRpB4,|߽@]mYz:bˆ1/T%2Ժ"?`丼L7xk$R,'T WK[W^͛oM{Tqxp@';tFa5!@R ` ')Z\ )}љSB N<VbBIz`Q C-)i-RH$xE*0~`#wFJUͼeiV>)s1k!T|Ngjݻ`=X_ve0lySXA8x㐬EnxKȳS:vL> 7` _sn 7_'iXEpIp"p)e8 }>s?_{9Eǟ\hyۑ|$BgW^ZG/?S/K0K~p|;#|] < Oi?UXXGm}ڷBoKi|'RWs.Ǡ ȴNN dzma 3+"S@ւ‚RۘliL~CX Q4c[`$t NQӢ 6V"UW-5󄤃4w:6M`KN[Z8;$yRӉtv;%W7(v#,C%Fɨ6T)z#n4fZ w\*YZ`c^hR!e q\ZҸ4=ܡ _5V),НE ZE'u) G |YܬHJܴA[6VXP[M &^4`sf-,}lJ-C6& :SgԌ<1i^7n#uiÔAvm9KJC=pL4ׁM’}ll.0Ӈ[8 h m7O"E5&5wvrܝSC$Vu$6CU Zj 0JPKOEl^|@*JU%S4;q;5wxw-NMO(].Iݻԃ3r [ Tw`XMvVI|~wݚ;g!ITԱTҩ@sDkI6BKX:#&#QiŀѦ3oז#\٫Hc6)X7[]yHG>jC=ږ)J}`e`.t8ރ>|sqVᱳVGx,_~'9vt*ݸ'k0~@9vxv/jBoCz>NC.T5k>E!}HTFV"VzL= D+I >Z7VY:h%醐&mxE$Bz.N̪4Z6'm}Gv i-RE3ZC*=L;E?琭V!4I BLTL G7yE^"O+Ѕ[AWx|+zITz6] 4<=aQ hrT%ԝ`5() ɛo~"Q$yOUpx Q U:6?߻%B(v(m`2:Q=' |S )-m҄{O54,IB^SnXYpַ"[@¡D mӑe9 Y’w 7jԈAזVy4M J :yȒ ,BTbS"Uq& ۨHAzF6ҳ}ZW2:8bo .*H$}WcjpO/iuq`PR)p jX{AkaȟZ0I|2= й`lB@g;BkցT#EOk c(7^b9A h3$H5DeLu r.ӔQ`K =O*0 )Y%Q`@s3D-h|qas4!JM ֫4V1 \whHNn'8A"Q ~69J0YEƈAU%(p*_$`\(Õw旿;\.S@{ĥ조d!16abأ%:(E4! D(!XTJC2Q4d0dӆx#X{Weiu&@!TNhJAt-R$4 8# $. R0D6Zj},Cx25z>_6Z5Bavkg`vũy8ẒxcPcpu.sQ*i ͇$"6?\lf;"C4,=7փX|RQ*d9q64`{$ɦeX`;8pPfHG,>,-ԦS#k=)<4zN#|QIلZ4&Sy"Ij`@nԺd:d$fhV ƴ*@>UN9jr992Z vo5$&"`v!cI[KpCB|'CJ!6.7{_8 y2N:0X:Qb;B $y >PQm@JV7yp{s2lW(U46r$Jhc!r0:csŶfxIeM-Zfk(&5ֳB@'LAYt~eq~G`$xh| RiM롱IJY:0JtK1 V8U@t;s7тfƑS8ǀ ŦK[wփW~hH>~ c>GnKbk蝄lƛ֡%*RVxq.wwc{+pEtށ[@> g?`XXqb d?:_|s ?Ĥa|>|qHm 1cdu^{7cFcߋ꿀uQqxe3O{r n1{~6>ic/] ߁pmuP1~r)~h5RAh"t1gR ב 2/jQ\+fV {ta:bb'Ȍϙ4E5 >Gi1f%)ۙf&jg)戽$0ɠH-nTc(Qq7xs"S슖atfpHWv+e8M81F+w8'=YNa)2m,A>qϒX^DCN1HH`f+rgY9 zJ`k2jepc, Ţrl=i4xhqo3\~]$z"x]&U l O_# o_nQRƅS̎675bD5"& *REz {쥁6{]{*J>\j3m~8cOg@rnâ8yy%5Z{I}#1#БmeXGQ5Cg³,(8z6A 9)7*'8ljRwT̮A5C㎻Ƿ8X~#7q"=E.Ohwy(*cnr2c좼s-!2hѣӏ T0_TWQ\G_K[y(Q6rBA9l0FotF_CZb3И0l J JʝZ⹇V ~#l]T8{5` *xLM[:} Q>Ldr`}`M~uWQ8 PbJu|ley^ّp|1|PC9l~Yx2At{ L9DZĐ'0CKbƀ+AYX- 1Rbd1AU e(WXm)ʣ}B[ փWY}=^JbԀ1L`> ݽA_|fw03.f#xǿyk1oBw}hg;ҿVrg2goE)݃hMk;xEpN_$5`YUp"Ы܎""~m=r9 QcG+;QGه{8'oނ߈V]_ә"K߄0\> GWo{qڲ}` [ bc50tz0_{n!4*14u޷'{;%_At=aQ \J"\Ec$u3MBE@2<`XL u☕JG*0AGi%g8p9+=&0tBgnIǒ$Y3k\YbmB4ӵ$b 4m0MN d,db*F*9cг kJ:[@.k tB_Yeu[߰uo]=7<4)(QذbDN$~C'%q@Ȑ XȲ()R$EITdcUuUݪ߰*&)tR_㢺g}^3:fCaQYWG]A]&u&E~^j/tUh2cQz׳uN}&ORGum WC*Łkd8 w*\j҄]ɊZzIn´m&vpHYy\d(+IjsҮn1Ƒ܊e O_;d5O.TJ JA3!IX+FQ ~8".CyլJ<ሬU%W tفF9\SG IDATCO*WXgC5|z%LҀjWG L.;( "n651J\aAƚ}W9lckhi ԾV @/2Kg c|-i]Xxf96t}Ǟ/i]%#e,KJkfU39 u0 Vk( 9*{iE%H0`. 2I{!еnV$Uk`w [ ڌ. :WK: h8VB`441dEO]x5=/(nN]߅B\!D pDXeJF`@z*=:_6(!"וY]3  x>]gtĚU]md;l.j4Hө }\y67Kp}pxݦ  .]o},0/Mj=7cg)lFB߇v 7]}Q a%xn?|'<ܹ wow@Z?hv#qcO$ڏ%}6 4N3aG>R./)cFۨ4e F#RB`H] S)dt$^;J\zT\Iųp*Ć_/>68ΠTn%%p^8T%mR.MLvi*Mr̴" x.3Hmͻ$\ *gʫ,JjnXmO z`.lN3L%R0k% t42>FzDnt.~lc_o@ \kmbhlu/_EX A5[_5&E&i+^%8Zyia,+'bkCh֖ V^|I+ȋy( ig)>Sbh˔E b߲9MGa_8 eeyCo˰oٗ/'_= 7£go/ϼ>MJ}> .3|6>gom_ xg>/? +SZ,®]Çx<X`{ 윞'}p%ؿ QX ;V@~/[ݞ Tf:;`@lFכHZ1\BJ v] Y*DWGc@Y3A=2ZW jUaw= kہI_R}hRjPB*5ITH4'BH DžJnm…C`A%f2ŭ&UFrM&sw ߐ?^C5őU8PI %S5~'RH.vX9ZQPjZ$6A,'qO7T)aRa 2l]VsPZO[6 PzLJ/uF|r _ mor1t'e~PWfȦҧj>f ቃo*exnh6!u{ykļ "&ZPVz oPwaI']0; 9˸}p<_W-,GG GIx߃_C…M _?KJ?NAM3bI{Ljk ~F£w/>n +? oG O{NM;0=;p0? x5xˏs ?rqR~5m3#ç?7p~`fNpT`,^t_!F} ?{"BWھ\YJ* MTig>GLV:aR }5Sp0ueP%(hZ@pBIsE_{^: aF «G GAY=h-Iǔkwbj^jʘ1<+ ZM$*beV5!7 Ml7p5A94@8!V3 Lڳb  SPFuʢD*\ѕ " y ߅C/u{` \A]0n¯:d+BNMX~ >< wu)L'WѾ*lmگg;w7ho%< nnҽ7^|6+߰B+'#}gLsp?83X1q>̣0o᡿NrdPe׎NmåkfF O/pYSz^3G- }ryxIg^{n\?|P&sq -,,ô䇻$ͶZ%7nβ3T5j?rU;VQ%۞e~0up6èI+"HU*8i p5[m 6,7n8 kqV$[qCɊJ7WLe̽(ۤTjUZbXu9HLЂjҢ ˮ5Ε !SQ "zeZm*UD 8hE5["#3}!/9%}g}v?|EģE!Wus,e}H_bh@@Mdd7~MaB/4"T0UC0*}1ӱp8sQvv#gqfT}&f -!NmRnzl!`?Jō.'ձ13OGq(Q`cBSZɈbI]78_#U=F-*PP$Y@ZcDFUKx/Ў׫ι)Q!`D 2a4+㵯Zq+똡,lzWk8Vn4o{][ss*䕤vȈRP?N d|CP&ësUARg{/ 'BTJqi T*>,|"㈶7>Ċ@)s|k/@n_^cm^X<{,(s s(A6MIO'{ɦ,ls}#9 r6?~Z=>Sk> o7A:@~4c4px+g܁w"'[ ;Ofӏv ~>ϻ~^ޅx cBx+| f`UoG?v45GO>l;6SVuk?gx&p< |qx_p-&{۬ %ӳ}|os~oS3x(vwd {%m?bj\Ӊ%2o~_=wa#GѼ-+f(Ξ1P۰8n,zɈ[pe,:x ׾ ;~altssHg$lrC$Lg0 zű20heDEh[Y5 3u` Dh5h, Nx KaK $%3]IiS $WIjK*RtƆ*1cA"dtĔMzȄªakH`.,'Z$ S 3vP'9zeІDأJ 2kɵE\# -+N)KW)Aɭ0 &DB]@9H-}iuMTdn`PBFhL'X wL')sf @36y@^d~KFwHv4%PDDk;q4s(G_2O CJlqp9BYK`]p彬ʝxp1Vb ' m:婳t۱Se6n(%}GaŞ{"Y3߳5ÌIhJLd"GcL5ܔC2?qyms#SEJLX~V([y@7›#K>S(iSj0X ̠š„l :gg9OVR87$6 s#ScNgL>!GBXVb陴R_͋`0I@ SB ji!vƹɮPj& OFTi%GԄ<DW7!R(&BQ)5ZǿP7md&ɭy ! r攦ŧtO+hXUpaI+(d6%n:m n:_SXyieFHi .,)*]"̘bX (^oE@.Z*FrHR$C#-*:㇊wi(Qh4:rj^Q՞i LBrz{GiQXɔFRɑf¾µ>{L=s`<;#{ol™_͇dpz'M7t%^pc0ہ+l= !*l gKC *`vlo%`I8/ З v쫯™ QsYa#n|)'_Ih76|?Zpyi0<<|C?iV/^ਇ'w/T7få?v WGCkEA7Ptl%32֟$)ŵ>3[Ġu;sdguSF`*/Dj @шk-H4+gX)vF2o-δ7<*GMZ Ņ9=-}$S!8#NpEHa:0-!#5ZmeJPgjQkQ&dWY=lG@2ښ$gۤSzhQ;#zK0sdUbuĒ RT7ByJ+ -C3e-Z馁aAfHUeXbil# l;AY)ָ66iePEjPQ IS-S? 5Ll@8KgqKO- L A]%m@Z \p;18Jb][x)T~$8xU xhu_-l\ 2SFGLt t-FvY0 h]!4j4D6*CO#VX[rp85aHxu#@P0e`R*5X *\ Zx"#M*-Y&hHn`ku %C!1k5G0'#)pRH" @H 8 T( hPG\^[Gh,;IhG4#k#PSAœ?"4Rl͔!'*CbOB VJ@f ڰ&،g%bӹ _ %4qLp4ZY2A+%5ɠ=Eb7Dp-uIT7k31|WAG1idMS&`?Bph\UxH~ U~;;pn{;Y\˷s<:x%3`:* MaE'i(DWpYQﴍ8n}??cjNgf:9 w4؇8 <ymp:uu>qq7N›eSn _}$Pو|NoCHn3I}܆ï~.ӰW`o|K^xͺ\}W/ùᅧ ~SG͍L ?uNVftg`]훠:ȖMDżC4}T= ⸺eNep)ޮM)*,Zapdߙ|͙zh 7z^*=RͬVc&xa#+u!n68\r0m? TXSBOѪ[%$ߣqQi<B6G̘6\N^rN&9SG\-pP`=S0Mj}3EP&#)ZXߚC4 LТ !UK:|EbPA{9¥H{,2k)8Q_uGt@3*qKq]'zQ+4J`ckVyw!Bi52a>E?Yg{O]KoBi{X0 =G|8NdR2чr!8SBX̖MM eb-Kkg'b"3f" CP@RHeYeY**TrBUVQVI*MbI#@y0s8Ng[d1<}zZ{}ހuc4Fhdk쳎.',:a mz*3`4aJ7 @E;dFM*nlBH,QrK 0LL "E;&t"uSUT!0!P/NpD|Jӌfd-J)XeF +mIM!5 :0%X20y:7ɔ u$\VVryY`vB"AEaE!̌l (ԖؓQ%PcN]c7Rqtȶ"D:Z5{{5jE\E@%בuBʖ][vmHŠ`^ǸvBe2K&jZl!MC.@gv{^``]ohe- %YڦAX(Cj&t0+<.iV١ RV,v`MG+P؆+o+ZJ̱b KeƐLp"I MbRI7̨l/A*POL=ֺnlCM`kC7O(iP_U8t?\y PE<\o;a:՘5P4h:{ua2x4\'rA*Spm ٯW_*$#x~x?xm>0ϟ_|xYm0_:WBUGx `Rզ.' 0HS2%Hk|'  / b;'&  2laLLkMiWrqD3o;!w۵jAE;&gĩ`)%QG^pFwǔc'#Um 1$SkTxR{c2&qZmZHsY0#y^f 6*L^\/tbP "L,e96qu Q%asACv@,՘auRmh e LgH!3LNK`eBHI'#4tQ!TNBainXyՔ3mrɊ C:"tTb()HD(3&JfZڡ1i,]]NP<{:Fd<+<#k09h,5$gǔ>CYf&-e 0Z';<8כ@nz[c:p1 xocT ;\l}#e EOM3Jt!E WHO@ {rW H@,y<$9GcKbZZ JWSX R̮x UT[%בG3)ÎaӤJfU݀"WBBQXp]FRBS&(ccH@F  [p60p¶B$, 6-“qĴT.ضJ<4r@n[ϾoA>g- ܡ pi ްpi8E1)A;-/ W_*{|n{.&, 5`0}pY8.8| .W:x:yxIx5 a} ξxp989`2AVWԻ|Yx ~=qw>xts?O|~f}=>0# mAT_|Kp.xgae\ 6xu5< 7o_TwCw\ʁʶ$t[fOSM+t;GJj6Nk29xRHH3Kr k)\5!e%IQ:7 9)ѿ% F l U 2vqƒ ͺV>E1wE=?6`ݽ ]N53$4eGQ[XliFȝ @iD;7"6cgІE 4n &2(3V=a(8k)e0T RE' [|]`2:KQbKR@9`CsC4>cOaah5(#v@RlIF(%; cUgWwd|(TV @),R+8YKn31{dhhF >"k1) D cN'[J Z=ͤ9Bőn@M/%#9A-:15=Z*_P:ZIVq)˸aDk5ƶࣾiD'=Ϻ$Nhi4B20&ˢ䀥syTe3B2J$9iVD<@6FL NB>Xg"nli鏙FA"r}Ç ^7lJ, xK{w7FeoŲ s>l<%Qy)ȆQTC1 Q#7i J:QIbT*G!41c!9 9Ds[$c~O2z^1$3ADҍM߳9hON@nՏ֭/PНv K`ʥ0i?oA[aC*J"0:0ԛpǽ:MVi8r7rc{eg >x >?r^Sί=W+o0:ROȫ߀Cw5z6`086Dk"|}MctxN}Ϭ<|L?RB׮hd_25E`NK^Ir\sR_bUuoV5>Pey֨z c4d7ȁDn3UφoS&6ꈳ)1hƇfy7%ʹ X,8X)d/UNe3-5-REnhE(m~C Eb1^^MK6S`j:(߳U}dh~:" F5V({hrBxF(En; 5c3Y'.AVbm#7`úS9 Pe7 7NC=M{F1ibxhL:awE`>d"F@r5LbQ}3WVgv3tOzLG+rU,%>“o$շrSje{+_&,a׹%7m؟M\{}n}U^9X%ٽ`Aɒ zORH CA:C(pfφ F3rľ9t=]$_V$e (E,8Œ>gIb%:pPY%dPQMD,tVDʚzϜ2;0ӋߧDVqkZȸo1P(jl} r:n7;T.OtX3/cJx:aEna䨥 K?f:~>}f5ƗW,/k/0̃_]^j4jڅkWa윇;ʎJ.悚quQo/KP| q.^_7z/A:,A`ϭo '& ֢0(Wisl+Jian #hd-3 Qt0; D$hg/:,UvL(ijRaHDJ<ݬ#Z1e!Y*o d BG"K22eEL T0<'杇βl-Հa׻Ƞ,H6ZBa&p#]vVM IDAT%aS*#HlBHvP8˨hl& eDTS"AI(HFLj*WBց%" ;2 mdꦬTG]ŝwmGYz8$lA+, kd='Ц̎bHAg)E8l3G2v*a5aI!ME]hYm&l2-)E(rdV$ֽCK)1pEX B]ZDA`FR?GxIxI({p“Fxw6|cuȥh#Sۑ;(9SZeZYd!kSkXR)!hTƓ:%&||'_c+e |} o~VnC* "5=.nH[Ct4zfa@B?ٸDȱm@,kGښO!L3mn쇍O̫x0'p$9ƌjNAU*Qɓgm`Z3 bZv>>ǠN+Mh9lZ%@b ;~y bL{r.Č m>M mN-訤"f5c0EQ V}&a.80(?keKwRU#|؈;7#ԉj+q<.mSmﰏۘ :nN;EKw(;hwK<Qa.v%\fAA 1]}l7 5 Gr2$^a7T 0n)OXdE=C6.~#HM( Y 1(e t_է7x9Dj:6̂y { ӏ\F]?y;,,yҘQK4wf'5ÇS<[r Pʀ2NǮLw3*sx6( -s}GW7_I72ؼpOX\z|Ҽ~O>jy.?Iwl~, YebdY2 \c(5+ "Aact?MhHlm2wa$W`8s018@3qto6;~`ޜBmGo'6g X+;)ۡ}ّqat;Gvȿ>|/) .p[VcX짝vzn{2X <7D L O\-Ɯ}u aƟm[Hu-ı*bmy tb1}&31=I9*kog8yI껷iƽ=:Ka&= ֺet7taJHׁ}ܪO ]z-xv11mX> PvG4Je2#N-~vށ#k?݆8f = SWS{U O¼UC{a} _;3p(^'~ '? prz@> 0\V K~ZXϾ'W g7uC0@7֞+>`Y0ف x߭D˰uo0^,u [9K¼Tdҷ^=՛`C^6]޹mgݽF\o[5.vֶHsĶAecR>5gi̮n1okfrMGA` ؤ2#Sm7<ǰN\a\&/d61& 4`3 Y]`v{AlV a TlHt&&;.0𻘫gRHݘ)$-aR0ʆ"7Md&چi{0;rL"P@8nz M)r&l ]PhB50yFaXᎂ4f̮%;Z"dvLBB&fI cbgi[GX]cb}ߌ⋖zG/VWZ̐"/vX )]ױޚco 3*#{eCrzahuCVLw]Gq׌'.]#ϮDƴ9S1W \) i3 ,~dpvξ8+TMKgXD#$0L{qJGbPɜ@/w~%!c4ְ3AjխL"&p|x>`wvIm͔OM m+*NwmFz= ]kLƳ*L ןM= XsP[$SupjarVr ̜Ĭ=G O.R0jf-D.-!.|dR`B;toe6MI3G*9r_C|Ĺn_Į]jdxm6Z*.ychL&J_'^ yș720ߚ|#9);Mi`ޢcB1\g7AMM\7`Аwg[ZYr5BZ<_u0!b׎;ZC޵s1cw-m7c{0%ѦL,8yHŹktұQer[gҵ@:C^Ϝ[BAjG+*X&iZ0Lag;Nic&^د`Pmdxhv1 "n|8q5uy=مKW]?[W4q%Z:/JyJu</p,ynA~Z}pǣpu80<=c4[ccw^/^=oso}=iKEMЉ=ڼ'T7;[ ^7_;ovkvKppIha@|GS}=q8r>?Uɿv__9w*yn&]7E/ϱ1SO7iu+ތPbMKI(Tyܭ D$6:Θ1gQ N9~E;ч8B* aj fxsC*3xz76-|saS@ϵ"R'P4_'g h\GHP]!Q8pE ׬҇VɝT.lsxG؅IW)t,Q`Hڸa&mɄX`b˂)KCdrcBIS&LIlXdq!&FhN2o'%`gHU$/GUG*?Zǧs%I AƮ*(e+w [8@EfcdHH*Ve@s 5b{,$-PDN))UH1-}M$n@mAq< vi$l%GԄ[ V)mi2W j6Z|0ܚC'bS wúVro'@|K!i,pu(ڈ{'`7..MFX9{gNM28Z5Rll+ i7|LXN[lQT}v կo4eEpcY"2&PPBd0p6Q7-KJ@61Ad]2щlb؄wF<7 NMN{!Fs1#[Fn1B) IW&md )$` ҵ1D <JbRNZGs+p%\$'PptpvrF#Â)MGY%ʠFDnr )bD˜S{S24Ƿd7 .A1#nn 1/qhuKE {+ֺ zWϪ#!a-9Ahπ? x'gUxi(JxgWwLn|ᶏL/? ;"ǿGF ppj'a ౏M+^}G'pQ8u%56H 8O{?i2/jVսg/ <,/5dKʎh"Pڦi+Lo#W4^3asDqIG ׭,@2;A2G|em!%sPWPeO%%i(Fu XlQwAf])J'X7 +۞[G :'`>&5^1P h(W}&b w!fr[xr&斁{sБ6LQ-@BDO-Idw|cEGS޲ _о_H#-LF[D|X,,-ڀf7lD96%Ht&X|R CȂMfP,t K0@ƫW)<6a#, ہp>1KޒXDTdO KRσʀPDJB`l2UKZp^32`$%GC(LM̽Cb 0̙b0pHZ[VXpP%p1'dޘ hn`bI z$FM"Du|@D&ŤfȽ2j̎PbnF0ǡg`%HiXڜ9eRL";d}웩9{On&1ZhC,0܁jFԟ'8ӓ,jw"tG%eJj|o J Y2%)awG- w@ T_^A.eLV 3DpYIl]NMP8:b$)}/~4^;B!j`0&"6!Ye 1H48K5 `# \2Dhp+o[;^s7pY=.ħ< R9 n,hŕ߆@uNP6~r]*UX,Ӌ_ 0 e` O_)8QMHO<%dvS}qACLAW`߫7}}u^Y'9/Gޫ'C>~s>=wކ{BM̦~nO޺ ;yJC\]m@{okʗµaGTڶBj5=(H%!R+y4{W߀)еJz#]#JHFw0B@A(ulM,D5 ǠHY%/f\m(Fk $G##(lY :,Y*" |HA >z3C'1H;Z,uY`ب1x(% '(1mu,N ۚfveg0CLKr\aiCMɁ h+r)TRZDTKل UaGU*(5BJ%V,Z=4S'5VJBnlK$:bW>c2.C0x:iM#2B m&[;͙.餩a;IBR3vI02*:t:@iT)axE;ܑQ_Ěd$&JדSPYa( $Ri %[LW@G&ԆA ]MH+ -"^8ZEv i3a\tʂ&:\N p;trPިD 9N'9!q}`ȢԤosErѯ=mR>NK.*vo bɛԿ.zѦ%BOn; 6'gw7 QķCE}@;;E(ō̬RidWN dXp[eN7(e ;#"LUDB /sfhZR=TPwL3A-Ltl$Ia B=C䜐݀Hʷ֭uk}g+N@NwPfV-:o7ðe-?M>AfcQCO38Vi/n>v pq8|S| /Sݰ~JwO~Po?9؞+j4?U8~@wÇ3o|~Aw8 _z^o|(|aԀ_#Wr L[~pa}'amy 6NW>t?_k<ִ:puغ K+Q? ]ɲ{k, #=3'S5 B֒mE0{J+&ZX /SPl.Le#_zZŎ:\@N1!8а&X JJ ceM-{sont7 $fEH*2eŲS9Nr]I*'TeW9|KI˔eGdM)"EIg$И^s{|Xu.ɲD[.=_k ʂɭ^'72U.BiAAtBYu1:Tu@1!hwsT҈g`ЕQQ7E0VwRL['<:xNI04z7dÞp IDATqLcUPBRM j1(݆?OSIR0aożCaR(']N'-.;){JVzmOհhXf#UoE²"E,]Om/h߉U ds:YlOs_aտ. 7CB5x}2jcsZfTtv<3߫#Dw2MFhkgѿFȍuc}+wT>Bv]G\spB5^W>]N@}}w4g?.UéHoO[~ g~6xNxns6,o{;\_{ .^xw=?o|3 s|l Q?>Uc}pƒQ?r?\>?OgbwǻϼEw ௽7xOw)x"<n ޥgGag~{=K-nP!?u71@C~jB VZGiGâ4P<0 nj t8We5{ռcwm[B$TX̆-%xg # ҀPԖS~x^yt L\ ZmvqnzUԻ ʌPՋt `Zkq( R(3xszhs۵twr[ڻ^Cf!Y@ I$(F56=sB--&Ѕz kE7m4qc/_VŖasLyP,ҲUɣ5fh9w>.4.q  ]tP*~ Qr뺖t>Zv-7@b$:/Ƶ5&̼k?!!n_fxh Vq6E~0BoszM9ڮYmc"ʮ[5ۧbY 7h-Xgl$ײe}E 4j*Pk9]>WAӲߴ9L5ϩkAlF׿,DZٙHxD_AY6Bm_0*sLuƺnobϻ\uɓ{@au/_ >M?4l 7n/_7 {xnǕYx/}}p7a6Sꚓ;7kHV+89߀/}\}~sx&H[;xcsx[ΛV]~u7 ?YxN+? 0 5$Oy<~t>Kw瞅w<xig+uځ?ӞͲ.>%x~/.څgڧ oY+S\Qʹd}5בzqjs,R GA60'58fv88(Xjps۔F%)Qkl$Sz1v;?4@A-Ev<~7gII;[;!:"~B5EOmjB ExXk]ꬴ P`2`akwi@/L)2#3b]`EzdP߁O@/F z/Z[2{i]1bF*zɻu ̪'[+H썅(5;dLdX*.BaL,{iCZ]+5:L9N K3djQp*3EHAHQI5P5ĥ쏫 y:p}\z|ȿ[ii\L:IB{%\ >>O,(UW*FQHY0BKv:YBsG/z@@2G* A AodZH%6-^L ts TGyY$Ԧ4 [vŊj :&rXݶ<7)VoNIQIROGYri M,B!EmZsDˆ ѐh w ־rk}db 5n$2Q*Af>`S1nor azH݇gw}̃E(6pΟ{vy | |q =3^v nn/tN<<\:r˿[o7<w0yr <4ey{< w "n[= '[; ݻq | n Exr*~mO~w?'+ܧt? _=N6x`Fxkpm.@?:W^6}+;!-`$M=ߚ~cu̓M@ݨ}.ѓjdKXе 0[ th#¨Ec!M#!$˄`.ɚX-Ƽ6xgJ7Á9P+]O^vXJ?zB}텞-1\|hy; T\Iڵ~-p(#F I#KH]#9EN3jt¦u6Mڡ(:*Hc`FQT =%T*`:aʩƁulX7`6 lqIGjncG6S,Pi kڄAɡT[*;(#Ha[2T&Zh;p8, XL(нjTS%'7sKYSE YM3Q,SoRxI:SuWR;B<@`+fE4dv`XS.Qa$냢5&26B1Ǔ6V j$U8ٍHDDCaxנp.N_M)Tz*YȐiESe)Ƣ*9̤i)KVVI\߶/cyK [,Xs)Aht&,k 0qC9}RC deuY_Rhvs[ٯDG |8Co#;e/=n`\3ڰcӓ#5Q:<8bE"#215jCҶWvQYրY`raٝ2{%l8Ѿ& ɝ㆖-u KۄmcN3Q0A?q @N"PE؈ M@.kDQ3HkǨZ*[0G.0k Vp#ƺ܆{0[Y7; 'NCg?ؑP};g| o\sw=#~3 n;K0g᥋w-zxh|%a9PN|= u^ -aCbd4/HI~a2,l BLeU\EIZw#1O%UVx,I =L2uBl92b,t2fɰy4BBGhIH/PaJvf1niluk]l Լ˚#j,Vn8E98`̙u%CЍ8bT92 ;] FU$t]5M#ZIT~S2,<'tB j 2`&&R-}Ǝ."$°!kfHbB R:$(+ ) DJ*1;jQ&a)\fcR#eZ[bqɲu%@I̝bRd˟ ۀsnEJP-"b[BbY%!,5htL}%r\]S\ZLA!!`T M^9˜B(1U5Qf`PR"T%>6a0r7Q3)j9RnU[4uB iazXjOܬ3!jo!h(DfTW3a]pDUjl%&/\stZ_a>Hh4jt%Л50q сBڃ.>ljl2 gB pQN&Iil}̅Y{#dߧ]GM >-R)!jPzL8Ў*EBSd*`H)ck_[!ҥ0 rBقő8fΘ-2?&!oۊoәjPY@%HW*EڤL t04b+,钿CxDX7uzƋ@s?l©SpazڧO2kCW'_,z߅Kx |+x |zǭ/'% 瞂>O{Gs_9~qe_: {Wwŗᾇa_ у{nk[Né.?/j >N58߄o>N_{)0~1n{;k֯?iXtpW];2dV8<{էJ~p_} au!u 7PN em?F1Pc(KQ )BJ3^|v-ĦqjdF*FB RP;Քb kK0Ā&%= #^ I!fH(7>lPr0syWXJ V -MIYDW(Tk:4WNO!dbY!9Bo 7j1ăJ;bE Akb*M`ltV P.tE#VI3KbG溍W#:_K1'op2K'hRbH@)5 ~!&8UDž%)8%T1Ri>|M@vŧ(;^Ư`0cK2[)nӺgI®VH_RŐЄ>C58M%7\/d: 59yK|[+k35azlkʌX\He!Že"L@*nk?r 7J MF%Vp=Ћũ{dk)6.p׎^5cjLAum\5eNR4P c ׫&Mq ZQi>j&\mbRh5>T]1s:W" 6D1UB$ JS ǮJnL1BնL$O0-{ΩK#'Nw`&˩T? m <6ʫw&K(zM<8]eOEz ɬȝaX`dJ?zl'e3QXJNZnXrrj?-}K$(Sp-ܹ+WPWLPkh"Y`cQ2֜BedtR`d"XF3QR lgR(n`HvL0;V\NK   H3ni.(^թRT >Qgf \ħQ[t1 n (=i3 C̭k1M` hgm 0 &XO^P-N*L#-\b`Nʸ>*snR`w|s<")(5B]E0F]t*L"B/#k V+")uJq"+U ìFLC!}$Bv0QgaHUd~3ݝxO;})X<+qzHX7iE nz^{m;c>@|/q_{~ƹ߅wx6ǓOë9?Da8VK܃p?pOM^#.svx<,}s7ջᣟr>5>/>1agoû|CpT_<$Gw.HOU/6<UsCu>5x;n܁O-¯^0|l7Mr<?[+)ԙw7bqt58".i_ z>vխw? 5nM/Cfp..5ׄwBoCЍF.ACej$րK HHeEf-J²P1aq"DeR?V]`1scCrznldu%LTA؄ʺTrq2 /W\zg?`I+Ԓg[ \D"*w %z>QG&$ ff Ɏ n/W=7$(9lJ3&΋h,cUP$JL,6F7 sP,B[%RXJ5s6aZjVRܶD J1ˍ)BQgEv@VkBC,t fB@7s)).Z= +Ht V}+҄0 >Z96JƬƜԬ+x"c<$J_XP34uȖf;.ALHbt]&o)c4 lM8 }r)֓Pvm_?3qBD ^i ;n^TjӲ)@~ݬgRC=CHLTرm"2.5Sl-`%r"j-Ts0D+g Qlɢ, lcNی[OwF;"JG&`lRErǨ36e!ۂhlDjI83ea_8Ae7l8*=YƌVZJBWˢgh2gf&OA9`$f+SBKv;dYR'`ZBe- t?)ڵ&9xQV8<NƝkq_1 IDAT**,{kmB5ےٍ5|u}V ^zfL+:RuCrcX%8l^x), ;C O;@pK_r|#tpӝ7%XK]ݟ+6<;6r[W__{^~t<|]{rw>p4ĿW/_q^dOo8O/]< }^}N5_"l Ov3yػN_U>[!&"LpA|m[07J~Vw+$w GOByi{} =Ԁ[fұ̩SDz@BHbE $\u*bBDo 0)]ӧ88?Xnt~gC'X!`V*%QiN/CtnJ,0,HP ==5:똶2#4 U0Rnj8l75!Eɔ`HZ[v XgDu@SFы1V` .Ԉ"tv yluhT-Ĥt'{د)9%,HX=2{`]Po~u `L!ҭ (FJ:m@JEIq>Yf`kfTYPC@u$Pz 2E(j.UρiV tD6 7X`0ӂ|#PCVK.\#R9(csfBDN tJف,+q䱥YG*+0 ]3 rzbџ텰_q(Ⱥw@{wWwiWW}lBtj._e'l2E*G!`cĵJq۾Y5z?ۺ/)a#ފu\d8$|c@͍ucX)z n_v֛}Xvȕ'}t-_7;}9? ix=x)A\n;+_gNz P/|§G8u%'vpiT{gEM!opש}w']-=5`w'pz-x%x׿i[g]q z'|[S~νn)_ ^O({7??W)zn+ `{^H2}ړTV^n;C8 0;G(J""fN2UlD9ޱ_?R4JAsjby7-YXh*Ѡ&k[NɈꔪԣP,Сh4B >1D51jX !ӡ{{R@Zhĩ&չu-&4pv":[)T\|[Fl -qL2 ԍs/بrlTbYLĩ"c kEg:n2X))P>)]B%G y 9S -` eXo Ek%kvY;= &R'!`P56;W,ѝ-W>nFS2@#}UAɕ0*}ِ#eg,cF׾ųwL dE3iR?saf/:UEXE!]l3},*YBg>͝Է^fV&m&`ou|67֍-WaU{Wp w{p u9zS~A~c?U sr; >|Njzn}?5;x"So<Eu]7 W8~><}3L4 z'3LCpi_wxwᥗ}8ga* $@#]L0LT'N!J߄urEZL"ڱثd*G(s~i&"&P=>R3*^ F3d,7{X#=OcϭsA" +-?"g׭,XQ> ,Ag*4q<28 ,tXL MأK8[1r+YPMIDm(X*3k锶h"j54ך 7ZJ[P{~$NSMUHĉ]#pt/IdQ "h$&"4! m{WwUzYYʇm@ɧVIzs徯?k "qtnE Ja%vBR?A`=ՄTp}$zN#٭! GiDͱlg‘zr勥bi@=jҖe\*dZ a(5]qЃreXYBz84XYaVX*+t)z)6NcƳ4;KLıHN5 B[cY(@q8 #'v!8j% =85;^h>s aʘt& $q:6:Nk#:NKR*6HXoV09`\d]8.|c3Yfβ0w%W+z' )p1Tgrhwu$+b ;4yȉdƳn>5 o),_S{'g>ׯ'[û.߄i-pf`^RStĩ5d#"oS /[Sg| Wjb|p t>e'_&nvN}Y&58w|D WpcނϾ@]{oy >`a"O÷K;+-xXxZ+/^9RMp"z }8XG:JWaoo~XÍZ|Dc8]*+>"W=[,45ES |bHXp>`1YRqQ"/7*K_Fa{rrk{x悛Nx[R=Ts63kyB54̭Ge`LS-x΄WsaX b!$p]Ďq+}KWY+>d _i:r3$ +gܝ-H@۱Lzi!6-LʊHbRsq2vג1"$x`}=B-)@( Y.cs(\2  ɻ _"nxbL"``D~Fim!E-'b8Y)4"̀պH'e[D&-s">'g&0Xs@TbnB4 >]jy1<ͷW/` mTjPz#J͵8 Uvj7tֱIv Fy`/rX }L 3dLdpL“ Q>EgRNj[Jnxx~QTxGDULpj5D$kC^2 ,EHN82g8U`7)՜q3lz:8p\h&-R&-O O/T70snǬXL<̖N׹-ElIoGb92{i508zQzнqN!zy;m*B/U:zR2ɝm\)hYbŚ 61]80Tl'5y|/#NSz(dAkfF w9߇{LӤё7#\ &ȯQESQYE-潴n7~4ZpHaL1T Ҕոp.gfVP)Ey8cN;a3<̺aJNrgY\S/& /5HSh0:E5v,/An`ک}5'T| <x]j&/ᮦ 9< ܣcipOp,zT vC?oHO>p x!xΟ?mw7<|?|:j{f{s?|eNxas_ ⿄w}/\|nCਅO)IxpgY o~n>ć#o-xmOeIHs/tG8ݒo 5tk >}爍\ڶ="n`:/ڲ>ԝQmw-04L(w5d& 1a˘$E К:a3{fo40DO_FKf$JQDWj}'`5Ut j"%=Y!dd\f{uT8"Q7&2zl2 Ye# :!ZBdQYGL'L*YOA%Ya!'ܯqWSmQ[a\õ潬qB'cj LˈID3p$DYK6j4LMF0yG! vcu%!Orܪ#TP[6D`A%p/DQ#H焴{&\O̱N L-Bc{5MʈUJG#=)sQK 2!fAΨax֬\aT؞T%M/kcU !B]25+m,#+cpFa1/P,ɈD)H XaE\P#C-W0"d8w f8Ėꁹ1 ёRQ89>p`$A6usX*'mf+6JE0mT tr }(2੉tT6 8, 33Ȝ*5#‡7x$zcH9ॢ=u=OZ[ާaGIJ*H!;n/e$Rh2l0R5 t[F:VZe&5HFr$CdF,{"%#6DhX`H`>IW" ԶBd@jab*:B@A"X?T/^;κĂWί)'\hXinA zZ4Ѥ{~(حӚ>-`O ~CVhon<}T"' l7Ny#:UI$x>~~OC?o=;Sw<oib՛!=Éc߁<z~a۔F`~֟ [srO_Oa |^Kz5w:Ek_|JS?fmO_g<7_'`p%L vEa!yF&ac>QTs:D\cYYçK`TDl M LG \:3QP5ir͑Vk~A8][$b-!`kVVE8[YG 䜸˝al99{s<) :Ĩ.Z,(7m P@-=3")2Sb}&B3dMen2VA\diZ0tPZOE0EMD-Ri{8 v2Ι=c,&vơDT#.45XC񖋩"|ZlQv KMj"TƲ=16IIR]ⰉlmhcB_yr 1l1 IDATɐD)QkLM&P2ek^O#jeF2-{QPacns\n܊ӈ'Hj/;0 t`V V޳p5xM!}kqV!+JMye44̲ae M]Qf`d"v0*s 6<9*jT2L:tFD1#ƶF¢~,i qCCc#AH\+,h$1j-9YV0dèX2^f@p3I CpQpD` F87*V16XQy}J"}C=XV rLL 5L2^`2M> !ҋUN1SLYlC[s3:(:|p*|`BS~ڝs߆aMJA~yeܸLk:yxAy&? mZ}u%_?^~ &= 睚UةinM/~ _&W-x9H ȏi ׵mNh7w8:]mq ?[qOi4F#wCl5#7Qc3R݂rύ*- "`zK0 j&tW %+/ i@x=iN[&qJ>ͬkC8K^f}l?Pp|n4[5BHvv`L儳0HpVH_(sa52 ``z({C2dMS]G=MUB(%ROtYVw,@Ou!, !!"(r[nBh0  M0Fa$FVDoXV l8S^hnYԀC A:Vd[Mer<Sj Չl+A&Y8Mخ"wqC2$fm50 -i HCfwNIaM9kf^)\)+PsțPNi]\dRgI iWșQ"&Z|e-C0nup,o}ʍCrmY/=Mb@5&SN86Z +XN`5fCXՀp0bKOH7c VUnD[k)n, UfX,\%d ,ch$B2> qC PbT3y\0ULzr0  }#$)`'aؗ3:d 1X#H';ag!05`Ê- 8C6^CYYjpSgLzjޚ(R0vQ#+Dr%,&JdІlqucCkD UE=L4I,v2T-mi8le* jQT=iljhĮc>!R0)1%9l)8a1ÖG4&a]!%hiz?ّ͠1jVRp- KF5Uɢwq3q=B(n7pm LO>ͫw@w֝oV$Ȯ z8gd+t /kUjw> G׿+0yzloC LQRyun|\ 7 sa|swM%?uJ9XM= |j:?x^YpH!uzz[ 8#LmĠ`mx4wKX5$knN*;lJ7 ~m2%f\r;JH)ʪ>) VOU f.VS:bPM5׈Y7ХB4<ԣ2b%08!d1 12@k;(K5 |e}_ VƣS_KUфu/²he0hL5)j6%P[S(!#Y1tU& dpsCעcHa'0*P,HY yZV(d &$ E ׽Ċ`&Cq5HRDYjJ ꥩDwp~}ƢE-H,9r. CAf^pkoq,RXg-Xr7(h6a{J>?uNGFnkW;q/}M 86xa`ghPCe|_G N#^Ә޻M?i}o.?z/a[ކ!< ~])gz(;<7 Ջmpe8q|Y}=zP>\ >'7絻3g) b/I,)ќC гtdǻ~(q! H]BcՈX֛3-k@AAZoTI9&BLzPzmVײq"L`Dib)?q\2^ q+N}ԫ #CZ-VsA_YRPAVlVs- "۬;:}#_g:Sa4 YS&G|A Tb]lفQ D\FH&$G )5_!M ]0 kRJ>MY%i4+ oUEeESLZse;q@ĐzKHPReMԱuѐY(E&5&(>>$YjB|qz=AD9;G{J EÆX* d è8F)#FH^c+LE 1FH bI5"&PD.{S/$BcV ] R[}GZm#K0m"7JeH#.}MNĵhz^/;κEhVݘK"fwmP9MZ] Fp4U}E_G OaL/+-}r^MynQmP'a:I@Tu| Fc=<s?{{@~?ې~DW{][p|" 99* o_+G{cQ=d|)&Y P # bne!1㳡fUOc2F*")8񴦃QH- RScIXdgq0Hd@dl8jF f`N6[Zgvc`=՚LrR{Fui m3JflqJlX`JOJJE*R<"EEtklM-BH,uLG%Fd1dk*o'UE/xA'%@!N(n`kj&xWa9C\Iv:l1 %<7 IpN* ^I#{v*g5GQ03fL<8^| .Y4 -CdPja(]ƥۚ['dŒH(LZH1hi}Dΐ I g"bbD-b[̒P uQb|oh 7 DiH/a"D10T9DKd)"dh݀/a- idki(9ZwHHXl,3 R2jihc1Ο-96MB)T3 eהr% :l2κePC!K`k`}lX9&l3sOBlayغN?fK_֎56׸݇ӗ_ǞT 0sn]3 R {+KG j 14<,Wy /{Tʅ0`JCo_v7a`w'+ww YkO>rs= OGe/= ǗanF 57;Pc= W#Ge7-06 #?lȨ|u.#Ϧ١^߹BYrYݢ&8[@c*,EI̛F0BN+M|LƚGY E 2dʘy& FoXX\_ *\Q/l+ u,-̶%3y(f9&'DOp{ļ()cxL96; U63-rS"_noB8M6cԵvYڳqJ ;yĬ$(aU: uRl#N;K4?:P} F8Ì 璌w9.# iƖ{0nv 6q,6 u: 19ޒeq9Ι!cXȼÎ"v,Z9aQ3K{b ǑbRv#V. mA!W[8w]TRLdGOc縦FRWͽFTf2 }bhW䘱VSKl"u'aį>ŴENɂFªʴGS$mǑ>Sy،Y97Ld ,o~{go`s<T70ABF8`ћF?pF7̖ڀ`J`ILjƶJD5,,ǰ PJbg{N=:0PmK(gI-wה"pI8* ; {&{5Ň9r`9)JzƜmw0*&"iNNsʒU8 /\M1sH~)%T&2g⾧~24Oa ]00>&KEhI>t Yъ/\}0&vN4m:G ޯ*CX=ݴe3f\ 3K-y{&y(-jiW.; ;+,Cz5Zsο[ן+{U4}@eOkJ4?>X ''ߥtx%}-pܚ %|a_^~A o18RSF>{G%~pR]?O=S| ~ub..܃' qO?fY0 ~7܆Wat$lW^To] Nx뿠Oؿ~n?Yp#Z@ZTLu\:K{2`mf}J0Hի%h7/b[O9acʗřHu)A\8cT!=wWe^5Rb{^'ۈ2@*;U2c̬f4Jˈr*l1iCfhdX'd!2Pu2Q$Za UHBZjH8b2K/x%}N.g:${/ Ojk\ӘBp 55d=XuZF#tQŌ=R(x EgMpZje*P~ m&hJ D9P"LJ`f"/cK-ϙH %ʒ-s#L1tV=.x{ J-i|+')YN{!B/Krz)]W#XfJXvabF>#x~E5dٕj: 0:ĺ9&l1dLCBMCJƳ&K!a=Tف18z%=( Fб-siтwB6:ӗ1֤Qs͝NGW$krZߙvBcԠ]Eҿ&̺6ZKI2qtXB O y.r|X \W(-Gԥl;VBoiLt:4*1e!d9`;C6.E̠Rw qH*,JDa#c|NN,#?Ē6$G4H(vL;wsvYΝ)lԷmiZ߄s-Ӊ ,ݦQ}o TA|O (vᖗǷmQ$@IT]L.I'{0jƝ.f !J6eԕB,axpD  ASi㈩Jfh#JGX'I\LP uV"xz,G38@??uɮR }Q$=HQgKl(@ SBqUbZ BUƄjḄ'A̒RmO>RTI}LJI"EM$. I5ޤ+sX՞XAJbB?Pʊ<)L$(C1/PJL zGB)4ќT9%J ÇGBU\D]"9Wv.)!и%z0q>gVIf2L - "BhR@.g`B^C T$ R(Rp(9{*^qE3:X 'd )xdp`f^<Ͱ4},B$Jo))>2癌rT"BPS0`9۫ztNH%]f=H"ԁ<( h G%4JΦ j\T$r((l&b;1LRGYyrYn:+wr e{^wueÜ׭S _:aT7ziGsq> 7/5ؼ\mvY(V%fngox{^6a:\9M8xey|k||cп p$ u?lÇxEg.|57q >ªǟ;׿OYP[:*5ń}9R㽨`YJGm]@HEJT\43b%T"h$8F VF'3( '8'ގf ֠S L>|1竢AԃgA6c*ʒB!gG_]0;T%c@*:2LH0Iw{^;XQ@PV%ƃ-%ƶTjǪ#ɑ DW#4 zr ji{+) / cBPR-dH!8#AGTѐpc-w7Y"~6İ]4B)6nt)p7k}8,D(a C.8zo@q?\-H;ppc20pmR[6;.0ce-٦x,aKS̷sWᮻmo7oY#&x |cFz2iә,ȣ6}XsW^/|kpϾdq5_bJ3pn~We!M x{mkV}p|^y&3#p1K~)x: TwCf\y?g=KN&$J=9e0maӊ%j!@IJJ a/-57e'(pB^;zO u} Kh 9;zSKN(6=jߵ:d7Il"%Qi) Bi (K5KFо$ѹDT3b}dۯ<\#"%Q@tvByVV&gra[M1{ OdgiF2*Nj&!8D+CgOUXئwkWM?l_[_~ ~ Λ|O>М0!QBc*_|:/?''~?Spp~7Exvec2]X }gyܲ7PTwX!؎>47|V ϼa刐pNPű"8!dE$AF:~]`ԢޮA?NZrb*5H5 RNGGsLܡ}<̫dV uޫެvK6a^Po) sona:oRU4].!u&Em 3"FИ 30cgUp1a-2,~*c\9cI9x:hQn2#RApMa'RD9UiQǠ%ӇB.\@MIP(1r\D~*2Ũ=C[6 JhVɀ"4["a d Õbsjs b)(gu(8qPh ̲% 4x&;O 7=Im*,lA cX2`9nXlJ7P.R+8bnj6NX &Х(ٔԐ2h+q"4fx#Gtc|YE+Ȫ7uT:^cN2GGaEe'ֻJam??e[_}/_Dx{^d8fs;/Aw΄7C \z6%|WO5x嫰u/scᓿlXR勶oXtc2 x[Co4z~w#\d/?x ~/_kO<  lY(N/7/DO> u.x2< ?qKqk< 7waQl ]m z>.Kh_oG~ܰ: ް{=3G!LaxXۡZd(*9Z^-|' fWP!&DQ=+Vř!nEu}1=DV1#BBDy#A @u'&xw#s²աP}e-F1\1l(c&XČM$(JiL&|ܚH;rDr1g RDY l#Jը#>dȪ(~:%*­ptM#B*#J)f)2=ܿQy/!ԩ[7X7)t&zI1 u)4G֧IiFa!59)V?jjx7v?LfЍ}l945<Ua"J=))31Zee@hP&qt86JAV]\L7M@ l|NwՑHUJE-J_d,)ޙ# voi{3PhUgމL E~`0fxx  5Ke%F[*+ص Ů8ŭ:FJ8JYd@FfJG| ('80[:WQA\6*ZQPALo.mGr d9>8Jj%/Dz*ӑXc7P/0dǐ MXݩݗP؀P[FZ[e8X8z&|+D 2BWjNF>5wfs2?|m0ozk9'-8`wph."y%<6<\ 6\SwOͥn1a~GO;_4!kp{3|^1t ,~yn O}~LT~bz~ x.CkF* o/!oF:8w =-8vIvn…mlwË/ڤb~܀`~??ᙗup711w_KWM.~&K;;pCX>m| =y?׭*]ٰ?+ VBy\RH%5`!Ж u:Bs' &uevlFc( S1qH`ɭXJ"ڳr3m]M er2=X9^,d%SDmOX%8Ju-!\f9e/v}z<  Kčiq*#pJj @[E%E]QD#)s35p\t8*t9Cq?q#@.4SȽg9S4CRE\E-X%VX.OO;*:\*@@}&c_P;誖W UQXcM#WƷpay gV /sҞ_@;)&&R ([ë0.WxN?jNջ9Q+w.cOǀg f>b>ht? i8hY/^;/zI[ # x <~qْ;?xqfM> {~W5" O&oF`c5|v|̢̗> Yx[=jPza 0$\߂etˍTr5cE4~]Wl_Kf[a;Xqf-p||^BM]SQXYUɞy~<>1/ʼ!B8 u>ZbXQ43K%V &(d0{c:8"0tY"9dfsacdq뚘RX(, Sj5h W ji(L( Sj}1@ni,QFp\yE̹jrV/,lj\ 1}8[:x%ݨHlӂK,Yd8Ҡ D$F̞Vbt,W"Dq t,rPqIUZW#SYx/,#ŊA(驃2b:1K8ieF;=}ϲr֎ԘNXpuɑfV7(R0®WXh"g}w Γ5:P`cƄ5>0`ke&YVS;(0WhtJi8 6m?p:n(邼oVzjvTifۭq7 ܱtN)!\&MަSbQ*SWR.<U4Rell)3mGބj-V5R:E^F;TVnw2elZӧm]|d%6:ѵr\J(x?I ykVdF @-pZp}a^C59NȐm6f`͉ gnu7ͱ)2;9huBl-挥jkH&Z3DN݆O418y.\:W oI 33ի֍j2&ΦLaU`& ytgoK2aj~7܌f u4p3%́]Y Ym@}  &2mH,a,6R'!\"1( jqSGKgHɞk}W@W0XPW蓲w =ɡFIġ3mHCK YG-")k4ǁݮ&d(͒,VJ^B ш*ļT`UcJMЄ_S;:e AvQc` #̥!hSCW `etD_ O`JC&sM?ڐHų(C 歜x O3Z{+(ХJ xlK<=b^zꝁa0-;qm`82ڊ 8P/"I,I8:%mTN臂=5r>Tȵr3N &JIҖEY-zd(edyz( )QLPU! uW+C8[ 5^K5A .]k X'.3 e k=[25#KQ7nPtr|tCaBAYurk|X" $cdz:ʑiCa En:*5dm$9[B :}bwv6FYUY:YuH"aMY%^  6GtqJ je3m@zBV^I0ػ[f\Q. 2+Ta",)IjiBc!Ӂ^KV#l*Rd1 Z)N8X%uRu[-H(jfӵc+R*]! Xk`~ FA:s لN*iȝ)Zxb ?W|ppEhұ)N']) nAź:CeWSh%螆m֕c @kMڳoZu.k׬>';Vd)̹; l3o~tj߀?>/\pr8s~.?I«8O_{:BIU5Bv'qtkCf?G*z^q,˸G-U9±hqN!LrO:aݫ\d A Ni,n!@=u?G{8HȜn#syԟgIuvF[Ag(0"⨛#tO7Ky -&ДKt!ԬBhJnh@yfoG2{só_K= xQR͓}~ -o.xmp{a}^{vOÍ{ ~pS/qq][y8| 9 ~b- G_xãK_} >vCu~'ܑxpqν wٺ~߃ݳ&k{߄u]cvxW의.Y [ၸс~54^exul|WIxz ZYmZ:ϸ!Q.)>*GRG+BG*Mαk *FnB FQgQSZ{˄2P#D(0UGC}We!:B#&JBI]r,$*€pMb!4M~4+M$R jbpRj,lŚɳ<-AB.Ef0e@8Pdh8Tp0w>+ՋPQYjc w$&NgwX "nQoy# ˂SDW" QXb584 {J#i1w$RIIqiz4 \@ӵUAل”@*:ڒ-[ӞD),"*,g ̔QeDxc=iϓ\`QH4&O2e!7Lp J߲Z9r.T!* Nf [B+r()͘'J5-f +7<5* y h_S5T +"R1}sWQi fn'YZ㢧͎:xЀNKG@]AW ] }f^'0c/HsD!BWlTO-}5 JtNxITC8$QaΑ;CUj =1,ZROqbHBkyjEXh>:+$!Nhښ0SyOXV34ݔI]bΉ %!gHUMDWCr@&hZnw&(D`֜M)e< SlRH rOupq-zKExʺH 11"DUŧ}Í1Pk7ða,lWZ3]}{ }w={ _\ۅ`Sq $=ܸ g*X}ݛ6Mڂs|kp~r"<?</4!Z _]65p8ނ{ ,Q^_W?YKSwBaS _|W,G䋟 [Zz_?o ?"L?/ڷ i0n==k LHH( oNLʼn*ִc)[,efDy^x-!:D.8| GI8\vxIAYУW .]FuDɈT*uv5Z11[ġq-uj2 NA+T*vRI `0lc3M'kůXx)~m;@ofe]4rga9^mQF᷉ 71R}u3~q'vPKɑ B8e9Sb uTdXX(kT9EqR۪+h;z U<{Y!6­y&NJ,8TWL@^@Hqk<&&g֑ vg'mƩ'O‚ths0Ⱥf GUܐ(1YHS)'mdCd?\8"$ws!#nZ@ {a0jT΃s? boy՜.'#pNcA'v7gc;شѰO{O-uڜ2R9/B 7 }Kg{,te8߀TړslXb ±i6uMuibt!n,4o[gu qv=@ [ub?EbͰ5F m3{k}1S,%Ƞh>I?>wIrv`?͹}>˜ȯs.S#XpvٔϳO2sBG =Ō MsXgrLܕg.s]p̩K$ <҇l8(9%SF,jNMuScR4TgZ튍= +˾%`\{cafZS2|{ǹp91q|}R͘Yޫ[64AXmY%&);??pL}@;K!< y<w}M._V(^*-UGulqbjoŇהv4) =9X^-Aҵg9W6=o ~1xSEc- NOa[۫o6ÃãϔW> ~[^]~y9>mMxlO]~%#oz {t]yu/[>-cWx&-[~;ćD߀e{x>S;Upj--upSh@RmXzՀY#r3eAf/l1d%41ʌm( R%\ nV\brdu OA3 c&{ AJCcT 4 a ϊ"ZN{ԲnqT5Lab9bSlb]O#q9sR칠Z5h,k![𷧁_;ˉ@c{vTd.g,*'qLEe$Z[ih-*GV$ZLjL])Wgq>(u0fݱ+v{U.](| Ig`lM&QDGAi݂,Y+rx2DkahPfU^ sg80^,ʣF65.IXt4D&ds$ E8\a 3rZqs{ػxSxm8 guX #.3פ͙k.wqak>EOc8l%RL=xi^6! Wqi[1cs+79U-iB\SŴq{.{gǁW g!/5,ڎ{unK_'9\ɖl%Aœsncsp.luffٖ̍P2þQ:2Nh犙InW+{9:rҒˋkt[pȰB T+,cbq6"7GnHD;x\.I{g7_SO8Us<tgxOGg=yܻqv >\:rU>Dq͂\'>g<[wƝ% m˳b;~m~CpK>t ]L-NLG0a:5p2lן,bM O> cػ\yaLKP}ܼWu_ 7_,+%?X?\޳[w#xeKiJdW?,|=Kpi&p%?4׿ȣcp&og>W~ .×?OJ pp?n})Lhx r1;sNȗ+Q-ڠJcCl]OvpW'EMY( ٖyXC"+<77qrq!Z+D S0ؾf%Cfba$$tgǯ冣4t.yj\5 n#ː jfd3یٞz~4c_A2+{Aaպb =b \"T|!iB6Y\vWoZ =ض=ya^n-) {&~dL!<%>'1C+ZeW0RO' 9A$`a#^ l 4vz$|2 FD>;eI4ǂ X֚=ƫ l4`\fW4ӓ0B=6fLpn ]:SWIi*+#"(&ZƖ'}E# "zfoY%omӡ2I. 2:%" WD]O?u!ڊaZlBQVe=?@z쉧DI3`, [! oqzp6$'jBv (uq:f=nmĹ'>;p|%L4!B?Ĵ_V3(=!2OX ً9: na4̀:qvQPɘ HP~[ky| 2[z2au; !PSI<0 o &Šw=g vhfq9kmR@90[Fx;b|:KJ7h s|"da;Dp/QF Nc#C-]b9 f34;u {\ #b ȅX21\:؉pfX  @gsG=سB0jt1  ӀΈǺg922[߀)f|S1'dd"xcťA>V\`g|juv/i4O;j;C|eJ?-X\)G  /-nNNZؿTU^Ye/--l>o-Vnw]+ګK\T2/s/3ۿTp IDAT l_$л g咸&x%?o-\x~8Ŏ5W`x/ x'^ u'?{wB> 3:sOJO!;*ًE;6'A#ݵ}l3]) ">QO ^qBg4~rF [&jbR0K3g&)$%3CD %0EawG GYhDdNb=7ʨ)D @ՀqBv# ف&&yAÚVf6SgB4OV WUP|8LˌZ6ge”b%oK<AkydH$_kf8i0 ⱌY18[vEPl0y  oº2P bDeJ uDz'nb.E% DtB@ئH 3[#Ц0 ɁF0 JX8r>SK۰-j3CTissX3HCHɚP މMҏBJJ/rhı"`v@ da7608CNLb!wN- 9,r- lŰJ3Y*U̬#4P˚s-xc9+wb'"!W1##XLeS3UA$3u#Ța[|Nj3a:OEai@>fዋgDZqnt 1YAPvK0V{4^-|Zh T0re\>;ay…9,uio}Em˫jFm-wwƝ%'\9% 'a~67O*7B<ڃxZgOn@~VO?z?o)"胿 z.W,>|paEs58ZOO7 ~S? |[ឃO6x8ae4vMxExm9\އ_}?_v.[{ ~鷋%xSַ]؟Ó/?KWG? NwX:õk{$`6X\hBazH- .mY^tE;k//뻿;!yx2in> 4L*U&3U_;1"j J`!IdJXB4@ ɉ7T]U- U,t1 ގ;M:$RLR'6F&݀B* a҈EDq*(2BѶ+шư"eB<;t9P'%qwu+w7FQ#4Q! a5ĔCZ (* , T_Rbp)&"QzhPWx q} G.E h]6R/&k*xFM$U,7DIS@\,a;- 5i*j'{ِ!0fW0(whS.ٝ\/a,]BSBަCe&Peŏml DBqSK){Q-rx } #B)'Ea,1X%4cȹprO Z^ beM\)QdM"PJ0R "domf-CF3jW*-9m͕+}j؝[Iw-]eP=Hnsn ;"+̘a89k~%p] ۵ˢq]xͫ=OV>烿/ֆ i8-(0 Bx4$gZ8 \3S92岍%`ƀUŒw Mft0a=^F@J%v֎^!hfԌt(Ep\ۄ`B0fw-)RFSV Y3vj eA;2FBLv$d-Y"Ul{eD+OevݘBY (GJc@i* i.w+s(떃UID 댪RK,^ye,Ӑ*L+w[^AxLHIv:0QGay"Ô@R5՚z>+sΰIoS3-lo_uNTqۮqM쪖; )3$FfQR1-cFt@wnca un7GNf7<])sq0]tB P UDela0Jbʐi4DM8L̙0w@+J`S5Ќ f0:1Ob(DID$|Olw'4ĒPLR<χr:&&fdRWGAk1`T|iYRQ̥g 2T)$eҶJʖhRrTjff-9vSp5~2a^bʹZg7όv|@[T|TfmF""X;u$ۄXD.YR4%AEH6 d:.W:c8UqxSJ۴!ș%*"HPn ,?;e'x]6$”Jc[Zp4kW \ Q&1x*`Q, axz)%6 '$JTaǸ$;~Fڀuh(՝a[ P%YTg :$ݢc*}4V fr2b0Mޱ4j, eBƓ@U"g-3SoHjZxUÉІemrY %R $ Z0Or`=bԂY(nL.d^ =Y4&lYA14~Ij t*i,V~4ȕA:Lrf2R"BHZ#d:AqQZ/iqLfd{]XB+=1lgy ®p, !-Ri4 uK$1Dj"Nl`]G $U$ Y,HO3$-p9,=BkXr-8#0AŤlAGG*Xu h6@CtTlu4Rj'0Ɔ4"4-޶TRHO}X5he 6Tvl132HZ'dzd*scY`bY,U21t*Xy-ipޓC>}`"Y$, H'I7 *섬 jHtǙ:;θ3 "?3ȏcDD]TW-1F*9/|UO>C=ď0Ϲ:~>~!=??jZrsY7֥Պo}yǒĿE`U h8h 89j+:Yc 25I5-#1nt \(75vAcWG49؍ !qS%,͘g-=n3SLtۄK3 D@PЪDvRάsX/(Rl55\U de#J_Odl6J',d [Ym$>%hA H)#ܴ3.LFiU11 8"XÎ%Pbp` 0{$f$L^h*/oILt EHlcNb%aUհJ7(/?29 7POȨѢqE3AynNKK>@"&aD03D9ٝF;$ID'0O210"u^fN>rcfĜL$^ OQS596xHORh LQ2[j䨣7`#tj 18fGX- $ĸcX0bG#[9ld"}Mg5l ]28qnC9vmV&`j4ȭ>glsŋ+SC ܢJBkb~hA iI`"7h,QAϖvMjat u=" Q}*dp g?M1X)T:p5jBW$[A65! ML&?ԟ!⑕%aL;Z}n~=zW_T3}=o{{Kio~o~󛿬-n8Tl3Ĭt6/(đt"3=M-y\N#1Nk0p"%L%3@mMF,dtgJ`@oKa9 [WQܠ:W=Q"4qs]-PY1:K&\0C jdj&4ّlv 3 T Dtd1c(#Iٌ#5)H}K씴j3,CgBW+=T}ZCFBYaO} 8K̂ :@7bkT .QN2w:#SN_jHƠ:@+bK`Blyqk1d$J+!fCgCJl&duBd2'gZc7["8%Du€c ZL Jހ`PDwF|/Hr Dpe曄aYNlv+ Ljd<τM*ժ|]O3t8I'5FF`<DbWN3Jd#m 5$9&V 0f:NPȲT+FB k X(f@Sz$B  ql8G%K e}VqUF% .K*9D%#tm駞m3amfn_z+Vpe؈6l6˗0wߠ7;vFcc#\v%;o=[1,[9p{eƍE^_-o{8xkaa˖-L>z֭[VgybȪիd2sq2gxI\ݫP%tz<d" G"2D#Q!BEQ y% b'2hANMuҰP5xl(L'ٶpw5~" 4[B^(D!: ~!f! IDATv,LT3GTˈbW)5Qud)b*P%% 2a&F6 s!4UҠdSPDȸt;,`dOZZ@Р%FC+"j RxD8'(qxDqM:*Y Q C@)bFY\QDҠ<4V@S.& \Īm4p٣J˫Ct3Ty.j'00u!$jFhMV2F@6jnp !69BS@4K$Daʎi|jF19OāȌBedC/9wJI%$dM  OX$PhƠ"ø TKX_$YFX]eMpqU5a"pHf"1q4x5GP ٩ UTT!39DVA%(Պ4$WC C@ Bԁ8,zCqBAd ٢Z&t*GȂ#rHҤ:T/!0Y8, 'nM\% BGot0&'<\m"q }*DjEhHPסW$l M:8BR]ek' c Zg:P:Dt$ď6YSUD-JhP! GdUnHP$)EHDYǘ8Vm053&%pkt~t4C DY~P#r^ vzX)DSGCF6D*$xKNzGZXimkaÆ1}t?֭N=!'t"?ӟMݱ̖Kɲ_Mo:ں:њbpݵ2kL:>HƏ?(BD)c^̿S׳x~/PZ~Hq]#F0bp^y֬^ͻn P,yaRVZ}Sba+k=z4O?ǝwʹiS>|Ϫի9x'ITD4 'q5D"܂Gc<7I Z@("A(d[$*1@"< !F&FWv0qT*0W85I H&u4Ri^K4%B(\L A%2$M @D(YJԊd:6I^GHdy?ij&!EiV%Ī١̖PIm9hb6dюL$hFg$F@-I:Ud(bTz]%R <)t a0R%YytP"C KɸAMٯ(x!"IbdKcc$R$Óˡe#(ԥ*18E)Jud6$P貁^9lmP"8"LTUM~cH ($ٷ2I;&Jq""MgBz1c$xOŌHژ$ǐdk{"4W(t%QWj!>N]Y2$D4X/F <ݙO{m B4Q #@dMieHq2NEJ "'.J$HH'N]!c41()7@ EAt KE~pH *0i$* q#AC %:#YF"#$ӡ+LUDH6PLPJj4'nrq#i$5б@4+L *ͿORZ82u04!1hbai#]P^)v%Hb|cb#4tB%k/qt%qP $0"O!щKV嵏>ySU5[#k-Z,{Ar98R!+V ב_ xl޼qx~f\bc1b׬LG:-N:Kuu5BZq_>/1ss1sM7ݴBfq\W7np]ÆsE0yT HЏ@@)ź똼u2GfE3oZk?1}ƌݙ \b A!A1ƃL&DI]BNH6dBpԶH(9EDUgZ@/iوaZc"(MPNXDEIZL8 W8Nc?(rN*ڀ.$z tA/3y̧ƦD%N.@SC6 DHeۓN=DIg.<&3I &*q>x \11x&FKv4dEҗ8O&I /8 B%لIPB#%‚AF@TXÌA1h;1x2.RIFp\jKIFdL'.klNڂ_,If3I%!Yy 6/p$n#(I*VHSj?h)ҮII"F I(9phB$L6I]N.4xcS#) ']k PQb'CDI;*<'L"NXl;/2T0 TZB҄DEG'ډ4&{, 4d3#J2mr&pYLDmrpU9x!`UPH:ŲHG{EEƏGHe^J\z%,Z<6lCpwO\OTQNk͜9s/ru]̞C]]=}6jjj}L:u8&1w\~_pх{܃HbL`0L~>ur}UU:|wm6;X.rq,Y”)S8㘧z-Wv;{.qsYgя}8):P |fY,;E,o~RQjݯݵX_q^}BVMC3|UX,UXaۥ~KHk6byCQ "bJ 7Fu1SB( T6>>"Ibc aPDz.iJbA6(s+"!cbXD(96-X^3Qaz*B~q\1c.BR4@=_d2Q[׀b>ٲusь;. @YBM8.5574]m¦ hٶYIt$ZSS[KCC b9 rz$#Ų-۶|UU,llټ&v{W~+kVR[׀1k o? ^Mâ#t{O'xbgj͆ (dYwiFf:!CY?;Gu{?9sNqYں~KX,G}1!"޷"hUOhX@ef͘IMM-RrLZ֝j8h6GJ6_Cބgi{DjViw ;B0z8$s`>q ߧL/mwۥ~&Aq:\+ byXm93_@&Ak:dʘ c;bS 5yӺZh1Hp7lr8SN]j4CMm-A$J;Na5?u*}9d2͛1'?hNRCN3o VtuB?p]w#Oz($Â0@ݷ b,"Ecu<|OåwEZ?lbWq/~ n/}K*),(~/v #_r&_q9߹;@=Lt%ІSN9SN9N:~0(:SrbX,o0J(d6y<bٻ,\k-[?<{x_C="0#W_k}[۶m8_~9˗/G?e]e]ƒ%Krhi>*|vcį^K.o}[?y嗹?OGG+Vࢋ.+/穧jJ2N3uh_lbXVi },>o+ }Gy&@#t}>9nF֬Ye]s衇9f1ڼ;{$7 ÐUV7MΝˣ>ʔ)S{y{f8hd壟lbXU`Thiakf̘Q$>tP.]ٳٴi|0^޷RHo˦Mx8hkkcɒ%KqJ }Xz53gΤf-ZC OOPQaMO?ͣ>JUUlذ;n@m]{QkVX, #@<ߠ+&K+ Cw;ǐdb,_SO=۷/|;l6ٸq#'x"ZkFg2&}n:Yz387ofĈva\rPMUUBcc#6lx :4$ ؖ;v[}Y֯_A?VhoZ3m,b!phjt%\>|F֮g ~_sSOQWWٳ|+V}h yXn ~>7nd…hd2477`R,\N;mPCkMT?2m^W@FI6?)K.-?|:,XիW3f6o̐!CKk]6} mbX4b1zvLjj :F]i|, w7fZs-tR~!,CuuutttѦ|w555455!d477ƙgɔ)S?N]e%B!}MW1|/^Έ#9s&]wLìZ9spp! J4u]l9]qPH݊A+@,YQ# 7.bJw&}% +>,Afر;s {챯`)E6?o.':!awsvyn̙{?NƄEΞw.55̙=믻0 .@㦦&Yljhßw]\%>=&ff`A dX,^5qc~ z$?j4]C8|1Q5z V,c܄^*\G;B#TKQJ-3H)G)1&0Z#|~ H Ү ׵V*N)5|P~-JUg0~5_ii 7bX,4G"ޘw;Fłb9DMMb@1q4V.%Ci-Ph9 1l6KTWvL\.ЦaڎO\c=~&-/js9|?tq @}ץP, +(q*) vs. s(X,(C* x.x!.f̴h9 i FRW_Gc}?DMuMm_ѴlF.( L8h=$ǿ},BTu }B!ϖ͛h9uuu[ 2f}>*<ߧ{e}g;oc괙}ѥ>HMM[7olUcX,bO|\.Ȇ e2d(G}3^|}6C8摣Y>+ں:f? R2rjjxꉿE!jh͈QXis=FOuU5qQU]Gɚիxťoh3nms~b!Ϫ/c! C sbfь9Ү~X,b@!Rv1vđ,}hX,b,i.X,bX,VX,bX,+@,bX, bX,ŲH!YNabX,rQJ*شqCbX,#-mX,qV0~bX,=ܸamId;d1A7J ikmh95aj$ i1}bH; ϐs\cX,GbٸԚL4 ma>= G!YCoTʌ3JJ&H ! [ EѴg4}Ri`۶E06<ߧ'۶R,Os׿_驍}Sz44[ޟHŒ1LI\ gHٳδd7oaζ滮˴)VX,uN}l6kbü`K ᡵv%`i<3 og)nFc_Pjֺl0dc U^ ֝7 fBZ`IDATA8BcdLֵdq$Fv y=g@yab @YbX,}HExӦ¸2d=o\K.OqރZuŹdP?Π]}֩0)wo{i_SrJݘJK?n(,rQd x,OzCӆʍO6XbX,AAJIuu5AYq[&()%L8h "J%Lkad2xֆbX6L! #°%Z.qL68N (%$KL&VnuJ *)%ZryHRJaXne}F{Mi娏@R|Dhꊾݿt3fшT<)@'|>)>1 {˴X,kE//g`מ{n!8d.1eqƙg?‹/ Un̳;֚o>\,[ !xJ>\15򑏲a8?|9=?^ 5[J0n~cXk_Zg~3.":6n؀r-[ou]\ .K ٌ\om["CRJ͛edipnu]Xjǿ-Րz()`I Yf1o<{1Y /k>qYn6m"~60nܸuۖ-/Q/~I&aAv_F!2= 'c]1w[dĉZF~l6ˊ+xꩧ0aq~)%vmm]'2k,.qEiaw}7^{mb6c/DEFveNT1@1Z2IW:?O}'9Yv DQٳ^XPt(<,---.Gq8SUut^on}8ٓɒx8 81P[[>28Q'$D}~#,`ɄQ9c%K8#3~l݊#%#93%X,k" Cꫮλr_~=_787ՍoB5|[oy7z(,^Z+f͚I&/fA1O`yǝ<🨫O'6m:7x#ϼogŊ<`n|xX>3i8Y8㌽_gCW VZIK6>l~HY42e2k׮eQe3~ƍ?GR1#G6uƍ; ByviiwV>ŀT eVҘ9r$۷og„ w}z!}9رGfڵ9-Anm--'?K/dxa~_R[[W^w93Ð%KpI'Opӧ>ſL4 xf|1@:'e1R?r3͛^#g̘>bGJ80ƌs 5L6uYDSƀIlHw ȞZԔ;|R<#v|+_A C_d *];woy7>Mi[:8zp[J|Ŋa],hjj}C{S8뒙쇺:xgXpg @JK/̯~+V\u Ð;7~|zadY֮[K[[J)&ODMM5U(Xv|&fԨQH)ye:;:Z3~x5} 7cC4EYh1G}4qϩr +V,o}+J+jjkhkk'(g'JDQT~7uu| Mƴihnn`Zuq}l|Lwwf֮}bٰq#hvN㐤Z}\x|_ €0 Z۷/W_1s?Og_eh4y27f&LO>۷9$%u߹R.[jw{_<|eV8I&ɧ¨<;!CPUSgKN?Ϥ:A_7w_BqҏM?BMGtIy4=sOIo(ut32 ;#RDQDJw?L]lW@,2!XnYd qm66lȘѣˆ1?>0wq''tg԰9_Ɨ~8唓4iA$88nKϕ!PJ!(P%lW=ؤZ4$n(\G;?( lٲ֑d2dxq}Yn3A1W1{,eOʕ8޲Y3gnz A It2}`4VSQ6= !=z >s-d7h"lBKK CAkUW]'֊|E}z&cP(dNz!;I&K/1o޼x.^[I< ľڿ]\n9&51o]GΙYb%yzɜu,_oy[Pb% ƌÄ|T40LgAQ}0zif@Tac( }JK{xƀ8~{,^駟WD} bUmFuU5$PR)-Z_q˪U8[߾K.9\|#_(sg;uuIfÇydY΋/1n$1}T|?<=v$0ejXt)BV\IL6eV8/Ǝ# #5Ә)r)T1U^\e+k?d„ |k~M6sԩS9唓+--f1l0FN) wF](TcL[lӋ7nX6m/~ >u ]w͘1f) .TF ȑ#G?BCC#Bs)&MfٲeL4oǽab\>f˩k5 ]0l"&_Q" yӦMeÆ Qt?M444GJvU~RtzDζpYTt \t>Q,λ8cf2 Ʊz'JL(893ߋ0(>ly(+@,Ųw00g $y y䑜}Yzm9C9 p{# ǿQ#G?۾5Gё}pU\Nf{I]0wӰAH45 #W6>sqol !Bp5+?.$Wᖬ~^fTgRQ6K5 t*9]v?K$SKϸqhkkc>N=( PJ]RX'jjj87s5ׂ1|C~'hʃ>G?:h^>9c˟٣+^jXWlh{/i'HfK!2&Hj0Zk<ɧ湅:t(o{ .ä Fk(}f͜ K2g~r41B&cBk(U4ѩ(ߓq2PCX)F3dH#w558r2N WEa-鰻Q ƌM2YbX,SN>9Mr(adn$qXS0:xTgjkAmm b455NfjjjM[H|zA]ȱ[qOřgQ!ߏ7O|%i4}Ϲ\pyNa2m4nH2-Q2(F>)N$&DL:u*]r q;QGY6BTₕݭukMg_6kPaN(N8 .3M+]tlRZcJiK} ƀ| d tڻPktHe-C>;ڛhi^&"n9{h:]>VBT6Bu~m*mQV%W#Yv+K>6Nd#&-^eȑd"碣43::yu:FG.߳;t0.y=@=4G>>o SJ4lagxG=XbX,ݴ -Z+QI8bf9ErAܮF뺴l+!RX#zU aP[[GKK XR 4 AێY(xKlU5cMd !%R &Ou89jؾ}{7^)>S)%ׯcilX ƌ=Jf[[bX,;( ҋZ<Է5W'r *4eb6M60|D3}+Vt= '֮[WG4G!jwl7cipTɠsZ+ŤӉ SUEUU5\&N& <Я~nN>RlbX,oÒd&Sk/Sj!#0]uD&IENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/start.png0000664000175000017500000000235713203343735022072 0ustar jomajomaPNG  IHDRĴl;bKGD pHYs ?@"tIME $*[S|IDATxڅoEc--",b@݊?QS&1~Ż (rM/#PԊ *n}5Ŗ5Nr2̙'sr+bTZ'AVsrWފ A"![FGIsy}8'&w8a}ԑJfddow==5V_ *W 6.Yeqǂ'&w J4kZ媁Z\BSK fL?{Z;nGo>eOn?RГ1ٷâvQMYJ <>sY֐mIPw^b /PxFkM%rP`^;$ݙpBJE3hAxq 4@ܷ"!&3mm#|N^LM3hq{`}3P؆00E f22qrf͇_.Q-GLeqIjtHEe !d'-h+)< u[a > ;'$2JZ]Vx泔Bt;ni1_]I!4 Ub\Im?2CIt-ԣx+~@#6ZGWXi:LUH$1uۭ=fjf\XNtG7Ʋm0sՆ9.ŦmI.߬cbY,T̕܉ќ,\ljBE0j_[TĔ)@ť:YVT*эhq?ȈRS{8Gր/0FT*4oţ +9* Q()tIU;2PՌeAnZEIENDB`qsstv_9.2.6/qsstv/documentation/manual/manual/stop.png0000664000175000017500000000214213203343735021712 0ustar jomajomaPNG  IHDRĴl;bKGD pHYs mtIME  yAIDATxڝۏSE?3ҞnO^,٘B$ QLi ONB|AL4&BE,ݬ-K9gƇ˂o.7CT80m^ *)ЀЪl)rAkCہ="#TBEG )Lo>7=ʮȵIF8V̥Z+ܜ5@E)Kd>r agvn}m.ЬZ?U ͈c?]%TgcpL?Mg2}xEs %R01ټb=wU(Jz ۶ ֮mIz㞢*Fk! 7e?oÝ3uX,H~婡#v*`%z90|kSѝyo3_7 '-ޓHf lbh4ЏThwb,[wWџM`55Y%%y}c?H$-q_&C+z绲 q ayH!)+RH)V4{!@&pNc1\Gktx94An{ЊKH5ĝQD2pVcdtAZei)Lӭ)˼R%ی2\7@qN˭tG*!!RQi:ɓ_}ԙhf}n S'}S4iPwcO@(J;!(oxl aͻۤ}'\j19;3 VѨrMlKb_ oܠ.42]# ^8ۚvo~ிV8_`.6ˋW;wJ'ZEY#;涛_Cǽ[_8l[*3w䫯zO4qMJQ݈߭\ý۫?yk{ wz+?ٱ/++dY>*I4›!J@*AB3El3$NxI0}Ɨsg+OdlAo8?!7|MC10W)mV;k+@$U9s|e 0Q!O̗iT*fad"CfrI( wg{4{ŧhmprv瞪3StH tJdl&s4M8>gK_:,egOUU5j%Bc b1 qaAsyD2rS]>)ӅFpY-ؚF[I^o/L}O#CQpl/MY|=@F#-(r;b0IHWrtC^6O ,9T2?1"uEbH@ A!sB2ddɾw3U3;k;vK O[6?Q]OT3zBvĤd)f,jnq9wb7>_ẞʵKPq>~ &p]>}޺_ᔔ. հryzm/#&a{U _•O1)8w*,1z·x_dҳu/,,?,͔b4:Jq;x͌t!bfۈ{+;e2}Ƚ1bH4˖:p|&ByՄi& ٺ*mY7[?۹!y=*iVn\i֓|؏Z{2?Mq'1! QSSTV: Transmit SSTV Window

L: dZuU"D'PZpC"Qbh"6b^C:D하|'{,ȀlK)pT"uGJTc;jƖSh%2)t(dQ2Yd&Yb+.l)O uEmHa]+ ؀H#9DET8*c_Xꁴb@pEKXHRA b:·%(%:^Ckۡt#PF4$|'9Ԧ5dsA)sYR};OPni5G|uׅC羍!Yޫqpn ||"( ,Ά 'Ó=Ѱ2)@`X]߀;9 PuLgM~K~[@@4V Y- xz}e]o?:Yy#~'Oxo;EL~UKwC ߝUXàihmeG?WwΡ?H5KOp{ /uG9NRfؗY8wmՐr4K]ч!2THIۄ!VElndFVʒehn 1&fp͛uohl,TD:FiA%2CBh[ *#L'ulamqf5!0%@Rc4^'i@7_.&=L[R^ٳQTdzH #!ΏGh rk 'C(]d.כy =WO7Z! oS {l V,M@3JOFҏd\_nx˫T S0&>&5W²PzK`pRk{\VoU@?y'kO3Y~ͿsݥqLBӱo^?o\Ao5LW,0qkfmM8.{vqLkSh~tP |g׸0;dޟ攛giL;eiwY難jy%%Jkz+~| uHJ oͫNeɓ3Mj*WM*G{g7L4^;w }y>qrJ`bMxn?L$Hk>4B| n7f0n -PScR!]]M67WnC5t@>x*2 68Hg P u-HӍ%6Da1('qR:2ŀD*P*X.Q72Խchyp4fZ߻g 6%TVDJ4OGX2w#Mf)uwu (?Cdw:'sbaFp- fX1?zhw H~vu% x,Vׅ Vv[atxdf~Z xdZBJsM~įVh3,% [sP>eS G} ";wk'9-Nyw/-lʗ?:nØ(䙥NTb=sui{W/LgjqϬ9ޫU圃.KJ>#Ki\{->|5x=\[tx?1>z=u I#w/Kv(1ыP{\M_ќ\DZ Rbt@*( >^ cǽG]ZpITfpB=f7"o1jOK=ZbC[#aEYr]o$H+J9AiPƄHP&^_4C^)J K>K*q%"uF+xzA0N\1BKJaTTB(yη6GxyGhP9۩bb{~7FT~cR`RfLgw"_GJ%Tgr&8yCpp ⢎-/G*[16rCܒi{JccvnpOWSi8Vn0;a 7pcg^Y`_A~8y|m|Zéݽcc^q#iZɤ,po~a"gcov?0Hf+Ȗ氶BVs!U[3RW5iGtp}opΤ?aS}_^-H}!G.G/J? }2Mjv[?W`nr+E/}__˅?>G͙3ǫ Z aO+fMOeAWw"5 fDCVRPmlQFI/O*):g+:ϲ`dZ>SG"B !pS-"<}2 B9°XVaE ƺd:Q;qX4RD8kQZ`L; S P8v2J}|_z1K;#;3ad73$|zpko<_ d1}\3/Rh Fzc YJV-}̟C_2Ax*y+<ږ*͹֊ݜ I J3TJQPgY (z6( ,7,Q=RH I6dw朳Xkܛ @f^=֜>ۀ-s`b|~/9O(/كBIˎ3yǯz+ݭ|x󿙋lv_\ً@xw̍|7Kh>Qmܓxç|?/OZ~?'q=>_.IUWGx֞ X^UTVH&`] T;c8|ŗoxW] l>fLp腩Ua!̓>詏O8.3m)+}iԌgvi= , >7=S2?˸@dX6$Df`;6H7{ Bw 8Fp}2cܗD vR v 荑 [?de xEXQx;Wפ;c0ݤ|jb?s~?y|JO# %fEM0D`υ? 'y|˴|`?3Zfp8O_ 7AǹS޵j4oR6w9ȵox؏;1^W@wrӿ_oAs/4`1x[/"ק={m _⿬]rvdO3 ~5' /IzS/u~xi@Ͻ͗^Ze;03*HI1["Jȣ..\{7w}h@􁤮ͨRݜv£wq /d8^©Y]ط6e!- jeW\?8Kef7TNU IZ8﹜)c[qpm<CW^=B 5A3uh %\8R༃7ppGO\}ǽbZlHo߻ٿdZ*u bSdvS̔hv$ @p3W{'C_\cا֭y|R_kG`A>m*c7q  {Q]~E$CߗO~mKBb3@'OVZn; ffx;x3q'9W]u;w .A)̍7ȩSxcsO tW^ɛfҡ2nv8 t)Bi[uQ@]'.䩽l̖@]eKٿ(`O>c$1t+yfmaCճfX;[]lLG}:`x++2O Lm91Xlϧ`*v%LAwc$`sHE0a@>v |"|A9a}Zdt]iH|)D}iT0++jBLJLb-mSn6W:0/ŝPl;1 "CkT+Gp2yp%0{l)/kZxމ #U_v?q9x<я~9ؾ< WoOF"ubfPs4ME6E 2}Qbأn%&ӌpXҠQHc::&g,{m%[W#R; JE؝-VT '̘a` cq K' oзT)NŀCP$@S" ê&n|֒nN.}HY-.~]r.b&RVf(99 WUܦE 2Y Qhx,vo&E)% K`ɶdΪb|}]'쁟<;qooGʝnl|N36Kw[썾K%80NPC1@N=Ϊ Tɹ/1L7]ChWl^I `Tp.ж-6@.SiRy*1{B$:#-4S7yy!Ý~zVb37K @(B?> xN 1m܃۸M *"4XSiR0k3Hʪ)ҌvLiBO;]i? ]q|DkUL'2U*RQ+vyLZ,F;3BQlL3"D7iQ4!!Q pg:OD-ل~:F"ʼn#q6ciiu,EC"P5ĤHf5QC\SA,X>e)A/9&E=!jBq/[]!x, Qh" *NKFtߢDPRg)U7_;NZDֵ`!kN`6g) 8qyqd >T,j5$^X LNU$CӌJEY.Fːx`Pe.Iz$ RZU 6'uY[tT>1'P 8?хTa٘J}i4gAozyZ,M _j-F\b95 A@FdUek :w 3G=\z*L8A$0bVR6QcN8R2'F#>۔8=uU-33ݘ!XݱZ5 $I2}@"}NL7rQvoqN7/)jxqxz|8N9NfL&d2WTc:9֭ƾamVКdi*Wd&,9& #3(N}r0NPJ#IJ6@G4)7Lʤne]"g)w`.R\Xo حa5CXvab]M1+ p:`_:qsew"}nRë*/rNsRb.\3f' E/-Yh񙟷) ᘪ01Wc#,SU5]J˘ENדc1Q{T.VZMc+<bm|`sPՁܓͱ4ҩ"n/ny/*Sut9b] E-ǘaDqJWJ *˛9' 7hZ IV:O\!eё# N )S /#`v)pqqt&:P_GP·0p=+v99ǎgmmm;BDX^^/f[u{W^y%TQxqN+OĮ' uDII =$+f0{rRl=TaH qZS{|vrً #JtLuLxߠ2ؓ `)S7K4K pzف;7H umǨ0[r_s6cjtvn~_ӛ50}*FPYLbTmYZ]beYHN)-4]dP/+z"D)ϖa|mKlG (\X1ɹ_€,nw¯6ܙ69ѣ\s5\z饬|N1۸s\s5طo߽~|Cr&9:OJhP/W3TMS!q8#u2٬tt(5M25fPaҢ.3o7p~+Wv4Xa6_'H4njocf^%f+F :a\Z{PRFr ;R7%\rFХ݌玍c0 MS2OF8{6P6EAMIp5e2>)N& ,HFvəD;oe@ηKƉnAAEG6q9cp \z\xpybuup5\s{šZ_x+}gTfUqp*IC-6vfFD0ZYbTƓ8Na):Ī}r^W#3|ؘRKFԘ9+oac0ӑ*Ԇ8OP5C20q9 T$!$,IH6%LL3% bw$?f{pG)a lJмoF 3tu=&"ڐFkhXb}QTU,;.j&d YbNQ4#f~+"I.!9a8Q:͈Hҳ秨mk8炽}=m|k.h.rlvJ=U]!)Ū=9W+%H&E/FCrl]QGЙT==`NcV2REA,XDz|ȀRi8B{6'N#ai7ZarbŸ9_y~;F??ާḦ́g99 ɱEs_K30N:'bzށ*].%2>48 8_#D;H,dؾ1)Nk@F1 #EGs"[. 9;2y3Dl^.:\ΤM`tW{񷱍/>q[lM9sԕǻ"̢0 ~4<s,># # ' Y<1״ط+1=A-.`FHO.bۯѮ©#77jBp Z>tC}n.!'Ȅٌ9%b_tI͑A?`)3.8Gc}Hh Ǵ1;_|Õ+Y TnERj[fWȦ ZwNY;CDhۄJp,mzN T5&Kz?wSU  P7|[4刋if*`zW->tPQ[buEt4%Mo%b8~ZuP4f++x՝; \!7\PH^=5mopǹ.E<_5LSąRBQҢ HRjfBPsaTAyB׷&Cglq(h— d#Y`! Bo#iԉ3PlW?eso~K\qRPCjPc`0;p$y .xqрصt5JkĎ]"k$q: a7!*ľCE7ys6z!sl>~V`ciׅx/QH\`̐il'hV۰nkiR,HvzQ0$].*YeA;Ory,5DM+G6ġF/MѧHΆPN^ +Ŭ*U$0턮=bD2UtQ 9rB0 Ue% %RE9}sw)>.ٷ񷼃{|G%|eeLyZh@ 1io7 F{37N8WPuvf]ynwb(% h6@qKp4e T͈ )9@|^3b1F#jVV CLԛu ^ 8P&>hg:Mi'3gG8y8å=ڷz0C!v9Mp8!ONd>nL F/ |h Oú5c}Gy*^z05c2 K!kk@܀bhzC|i0gp\n /nh$ H6}F&`T\XZň7Y,z(bXIBLK'WH .HKٟލMws8W)&>O8X=_Oo~2b\oK\Çe<=?ȗ?f}#5~nff>LF(:N׀=lLN24eiy 5eVΧNzvtH2OdXnݔ9g~kG8v?d2aX/{jpy`P/)4i@3M"D=1k9}IRH8hCugLDIU#!kx7 VB+`Ҕps.ʬ{B5iusI;c}FmQcb+,"4mm+!V|AZJNts=99b7݅0ky%z%?W _w\_\qeo7~wOW0yޯwwe8'B{'#458 Lp.UrB?R1m!mܓ x_a A^f?#N1\D,u θ@8c1Jwp7)x|z'8##tnB>3ZLBŰf4\a8Ei}l9=D zTVXPuW8+:[)[8 z*MRW#U8LˆiN8qXmś]w&9a؜B/~.-Ġ_ߚp;ΓI<|G9ƻ6} >}r5%^sox/k}0^M7bU5W;em0*ڍEs)~"gDUEp_ڃ"^Bd_`ޮ:G֏_EfE5-& G+A賰1VHh<Z W#ҠR~#$T F+>Ԅ*:tbFWŭb;*I>T39'`],bʸ#jzVu$BNE8H6s_8 nDRbC`C @dlc z_-o?lyѥ7%[>%ow^.qYOL9J8>E#kqaiiDBTZXZ1/ G#|h00CTLJY Q4c6_(I1ugĔ h/d`Zgd ø|dGiOinLv:!-&!|]A㌔Y$QLZ<9w0 u=5uݠ}I{T[ Mr \C|oP /(H"YYKN^3)Nj%[`dwf*館gYzbee]jw=z#]O`xw "m Kg|s)t[W~wyԋ^~zջQNq~q+Qa0Ȯu(;pտ\"Ęp>0 }" J4"2/̱.q!'f9aZy[*5Rkv1`U+P1ݘ Q;)SO$~1ppю[|r}H8qj?t}7y9B(.F% Q(RM,^&Ď3mTx2 *+LzTJt} Kƫk Wz?K3ڃ-˛Wy;7we$n8W(`0@*0&5g [lsl#*"+8 W/9}$Sbʊ#kmLyͯ} UgQDJ b V|aE7/irj?ojb.?q-R7Wʺ9dm6Õ羓^@(?ԘH@RDlRxN#)eА%24 1u'$);Y<_jB/-)|٦m~G^|//?}/E?NTSxO=G3x=w;x^{S|虻 x/g~!/ʃ5|uk絏R߯現r lnHͮ;R>e8WafTGVFKXQ⃐gc'rjBz]rR|PX [_՝aiJp3%4iN'#R=k3lp1_ ? y~{xX 1e^x(x~k>ew{۸O RBi]mG%oV\ V$f־q5ku<W8}jQ0/ƨe_r$C2ŒYFXNe4fq CpK]]R6f0oq:Jl]ߵy/4⩑RD 0fHn8(l, A-",,G<`O2CPT|1A$/&#S9fY|iKz۸qyrG#_oӋ;=j9=/=?8~_ \+88{Om30="EW!(BAz+^;3E0 7njIQƫ1NvVg ". _vwbRH XT5sR#?{.ge)?wY/@g1U!I})eR*u5RȱC"iqhB̰Emu;1ubs}EyNJւ$BOi,T»߆+gkƹmmu=FbbaZb}z͊mvzJ;BG!@K PiwDc}} X*`ly wE5C/)Mxh IDATaڗɈhihCSW !_tfVc3]_#lqals9-}&g]"#h ̓h;5t}ʹx5R(=)et+(c c3$sF}́"{RJt osenq`;o~+k?QULQVIܓR,?gBt &6W)pJcHq_o=" /]QK%o:}: YzX;1K[ZU\͈Vb%Ho[S8o/6j=}ߒŞ3&+#2h |BJSRҵ3S#2*2isReDE!J^t}YiAe/ @Po^2g6ł;?',|qf1 uŌa9.Rvn@nJ7%To@ uJ2;Vg<1GxꗟĒQבv:nFSXGydɑ'J|>Y8Xaq ud3>q6|&|;nQFìd8|dlM"Cq8뢇@PWQ QWm ni;}Ml;"4Nc$L  B@|QJc\A:,u~4Ht* ^J}N=*=A_(ax'T:sZg+dKd;H A}Qt)P6om?p{ayyӧOz_g_?~{.ꩪ pm)❃|fٜx׾x58o$z'2{Pq8Lgk 6 N9ƫj'A~e5STNO?L I8y>~ =P/??8'+$UJ Eo^fn_pgSoѰfA8|ޡntov/iFJG280)ҜOр 5eumr{Ҽ%i4۶psJ;)IЅ ,d5[d""tI(] 6G8炽/kpȮ]m|!G>_~?P,V=qΰn]$󢤧~!^f!P̦zjps+cz4"i D" 'N̬k)|S41tu r=:x%4;7\X|1;}}")r脫ɮM̓н30>DBu@@\qڧCtCQq^8W>ha΃(m097<;7p5iB%˒5X2,X+OsipxmA4ڔ(],"v3myoh9!b[p;) 2E:ԓC }ZY&:9)Gt*znS r%-g\_b'7|3/:/*y}w,{B q\Zm+ M|vn9f׿ZοbDQV:ƇHvG(5$RBی@l t:tNb[=ߠ|nU += -'7:V|..&Qe4ڮ 2ƹZhUP,>QX*OQu}w-W_y?Z_Sr$dt Je,t &L(^[hbM/1p<E^OewĬ6J2%J|AR'׻Zd/G)!מ/?8SpFi8qw}rf4 /ݺ1B`8* Gf|;${u$}Qs_9f_Tlshg#Zbvc" ,R!S8)4е3$4m3_I1¾O9?o79}t Ȇ k,(i<Y 8VRQ,@TI9X$@ )|v: ʄ:w kK)8l95@"B fޜ1)v8g rlPHm"w*y!L,A4yMH( Zz]--|Oʻ]|HuE$S:'O8θb9rK/%i9rkH̞j0(Vu|WO睳}ܮ}SݮɎ`._LTqM{{@+n[R h}&kpN!}&uLr|X2:u=ȑ/cv`襓ocsoⲀYY@cLֶDESV+TJQcĔ%)!؞XnB_yi]5{(E)z%HI%9On:t0(brcSK觔Hy9GX. PBLFb"&1)IUjIiyya#}pWB3g\!p=p饗r?Շkkk 9,P#Rtjs]oK[h9*t7 VE|rׂI+;?}~U[G%0jt^35@E+dV mɳ9+>vǕ!B~^?ڑb/˪hpd5 %*z5]T8X[8M-/Ucqõ kJCnNI9Mh0$| m_3b,*%Z%|I-D$5,X!J2= ozCOsTV4ɪ!+Òę3auu>% lll󤿮v#\jlٿo/>mPHVt7j(ap)"ONvf#uD`;ɧ/Ϲ|ʅtzEOQESZ!HJ :MrloOP0VmÇoI1ľ۳ 7؇= I,`Ѧ"~be<`mnZ2k%74e(1]7s&ܦgϸ)1rL,Hj!zbA e @L9GJ#^҉c/y'ĐA4nQbXO _JiSd{f~S/={e^i3 e뮻9z2t,6FwrWp/lH(B|u5W\ S~go;|w'dGh_`%p|^u/i: Հ4Z4tMCWo *|ltNlé𥣗Q5d女ZFèrͳnA%&*LʤD$0x 7b!DD(J9Ȋ*qvzdtdXyI qc$4`k(h)mCS|p&A6' EhiVkRn0m@bGjB"9 oR=BABKO ڌpnL@K@ts?'u@D)$zDW~ߧcK,$i卿OXۓS|Ti(>EL>XМ?xًX=#u[t 1AŵWWͿߟKe=q[/@( ܇VCL;;z>NsȑtPS ٜO~z&󂈌Rch437@acd%VVVؿΠ(pJPVB> F2J ZgLJ !EM ]\6>B׷4Pc:B2c |-z]cM[.GshSWّUvb&m+C6Hhɩ6Jq$DF w-r߱3b3ZVWGcS%IZk敯pŬ\~:BCMl!]4I'5j:ADؼsтѰ fIjh[Øk |:ʅI@McyqY4ɑ! X[)Mdumg +.HʡKYɪҐb_6=.AÇ?zcq> X9W\J >5ݜbh&Pi؂޿k 9B C!C^ں+EȎJ-ZXӑn˰$O5YKqxqmSh53ymAI#8XʡbRr`c}%Ȣ(k*CDS+J-E&<|D̋2R-.袅"/~aq?դ4GXCMN:b\I̩$РҌ|;b<%RB)J gbls#p?ڍA;D=r]^E%2=9ƽmNWP 8>/L?\oϯseq׽__᥷$?O7/ Yg-gO?Voo\퇯e}0?񿼟.g.pO.#L̉-b $tрG`FbHʑf>IaBPVk1ҵ'q5aFs(gBF[At_d Y=%hsb[nhv_|>b}kc-1ȉEU5BPVcB$eQ"bŰע[M1 aL#]t^vU[x / [ۛ8X8 t-`ъ}AboQ!v ]C]t] ((|"}߸ (WmINVvcFXW. Y׷;RZ/~b/tm/O<_=>45缎~uG/0U|||SW}wF+xɫ^I@;I~:yLx/ؾKXg6nARTr@VZU8tg!nڬP ;rfSh(˒BE3"֧hGigHa3CEUN|%DY|rq bs3z|{Fn2 M[ͱ0wz-ZFǰq%G#&ACp<`~QVdT}*ЮB%gAg$h1uߐR ˑ̆?X 0G)ER 4)6fS}CE m(Y)ztVD'ԑ}7-)>Zn19rtELcG([EansoHZpP0/T_#,߲/_bdZY<$%0{huWqEUޱ~3_?^( x~cQ^Ϫ=&>LÜ;^k.*!((#D4mn֮1(70 a2CPQ)"9Lwz;mFaZm1J`3 9Ԩ`y~}/~Xo3brjvfh8xnL!E)EY#(]P#)(*ˡ!(2 )M̠mwsei!SdG>6fGKrQ/%fOjtJ :V %X% Kʠ$))v隖І^^!(eΡF[6(娆#D(:CFguKK[FYkG9xg 7g3j>YGp9 V0ԏ~Rq.ל~;7SjpE93ϽW~f}+˛QC`?ƕ:!jYg?ozGX4 ~Ie ;agT@J{?BN\ j]Y|Gbs&G{&wSd:iH!1ߞD rXr]  IDAT|3a }ϙp O>`C砊9iv(8$YUHT.BS|$1󑏭#l3V;9ws޹s$5$C3ߤ$wf{* P BbȠ쌦9Nhjlܡ- >y..ia+);F:8jzϽF?n#ɠbbhGaH2ߕз%KA>/$2Y*^uyf~w%ܵ=-XVϹ.. OFK^O$[(u,unK<3AԶBv8)Jf{P|>|)M)$oMd6)='.Y+_n @!gQT+$q`)XC€)13:fJGZy;2k z79aH'r󧽿~jqFS‡)9OX!45)sJ@8A66ٴoݧLH)1$eTh7D e $T:9DH9to^cX;K,tkxO5|G.  dt?8{aƻyA⽿A^<8ѣK `Q?$_~[9둏ws_w .g{~}7sI h7@L)VhcWg<|f!s-/lc??ҳ\xXk )r߃~l})~0c^P敞̶2ۺ +爛l٤oow Fܗn`↘ۍFmUϺߩq0ڔ$bicB)E3o(%~>_`hۖ 'V}i͊F8v VGj_Ӵa3\R]CV%Ȧ0qœ6.͂PDdawA % Sz3 uj.GOoqgPJ䑘nȋ([ +r^E.ƽE_}#-=x缃-~nK~)|]eq8b7#}!~vnG9p*Y1~֕N>=9u;8/|G>Xr~ ?Xe'Ksr3pOg%#{4wOV|.F/(!)E,J~ Q$Qtg @pk?4<(JY 9xy[" hrXeiCC6QD Eeq#gOivJG>6b"#Hy ]XusڮFhSv36ƖdtkR7E-e RYUbBJY[Pm!ʡ쀼f"H@ȉ4~ *"AcGΑ‚!x ,Xğ\y˻x[?x6G7O/|̯CƯ=Fl> x;_~j~bq3 ]wh0 xa}ŦH]Dׂ8zK|S=~Y6+ Ȩ:?reZCf (}0pAJ|ǷgmI=;INagtA L"2Lj^Gd{C}Vʵ9W]E\QQVCZmPe(do5\qEc݈'r`>f9]7ǮgS,Ei6( t% ܲx%c)Vc 䆦!wsIl:V'7QbI.#4\x]}$5&(C1cBj*JccAl1US H")#YjT Խ |̈~| i Hd :GeZ%CooO{~% tQF99x? -̯%h"^OgQ>ݭ0;\ _{Քb^?6#]E;HBKn,6k.Ͼ$0ǔCP%3Eɴּ9g 4=iN]?N)@ܝ SR "> k&PoLN?.Aeu+ #EfiA aݰ+vmÙU x0`ccQJz_)-FJur $$ eAЧIwCxl—X YEdr?i^d"Rѥ(鐔9O+~G\:vPG U? AB:wi4a_-|Moh̠"-|҄A@J3 )[;S5Sg*՞S?I}{GEp5 HRz6WH,q!f!H4),b*:E&P7La??N)ʒf6%bDVlMF1ia0X N@@Y)`4,J4BJ ]$() #£f1p!bNܓN;rg\#IY[[{g'<鯫t _ϨU).>?3?>q?|ۿM` Qibw,|JXë$cvw0U) Stu>&vh:!)!$c$~D;&))}0O?rOX\väF¡8`P2&M:L {)+)mѶwT?_\/|۷d߆'-_u;'O☡6zϟWyS(cpQ@ uGaZOg>qHTD$v q# fH!Β"LH c ]0胁bHGh]3#2Z>NE&t 䄐 ^#Ry_i3c 9rir-\yOE֖h1 ĸqv8w{q!NؙЅ1YFՠY+\pQUWE9ԗ:u !)9fO~BB|CH-DSOfx(dx eϿJBeGUC] pΑ$SU% SP6ZM10MV=:bX[b7~_M]nwmm; wy;퉐`ƦD1BhCCDAbh27]dQkddqжF&J: bM9OOTJ-LIV"|}u%6qFÇcȑ#,%1OSviJ:7e< p5DhUwh&tB%kn'UU1Z;b*"au]'D޾, 04&ztm#)u.AUYa:_D P13 vedDQitX__ǕcxDI)|FGVLԚQ e:L'RX.d^ݑ'45te*Ҝz4$Ȣ)G ƗB$DbtĘ{]Vd\@T> h.zD+S$MP*s$%U?.٣\tܢ$=?}MQ]G־- KO"o3:%YPè1()&)kQhRD`0`*\ ت+A rX[amu?U5 hvѮGdQ*1΢&t]0Yb#{fN4:BHdUPTE`rh { 1d|ۮmkb 6٬"EH(hJ0Ck9b@bCH9.q V2) >j7ΣqͰ,K<8K9FI e\Ƹ\GUHvy>{ %©(dIN丹b<>z/v&9 h1ؿuC^N׊ˮoPV4*̠:Qւ<9+rRąMnaPX &B-ZR$a(-Z+٬ET&ST-I0^;JgҔ 5T+@RA+>VDbȩ[`|=ۍˆ#[Rm Q iW(!r 1rB9A(Hﮠf Î [ӟ.gK A#d{Ԇ9*&DQdat1Kt޴@*x\Qף<1A$!d"GpEA5*P$p؟eC]Z4.Ap2P(feIJ5h&!Q\$:]~Fsh)cKk-#uvaA jNr!aDMr."V<) h Ip3_Ȝ2IBcv"wQ|{ 9~ {۹+E4;vlMnF i?ۉph)t|)]S EKk%RW.qv|ay/277_RogmbYLg+RIS(SyF54M ADJT1bkR !RyEkTegM6}HwBLVQk ZDJ\.LY,NQ+; I9>@R"v$*K'P)7QEbEbrr F4#(N/I#c1HAIyF@-"\yxp]7Fb ܮ>'>3_5㍟Rb6HʃfiQ!! J"b%dlFmt06H s4e:bv ɝ@JcܙKEO7k)!2QT%Ep I*TTBm|y\b05JV(.R]c<ޠ<>&R+Su=(Jbt="zO_2 |4/uw!E40-PR%T(Q֥(0@3Ż%aAme[c*̋~# B|7!;FA m;K%p^Lr)51>O\/>u&#rÁ s_hXd^XޢMkOw=R)u"DP'TKb9@ء6 { :%@@ ޲{,%bgw(uՠLM!*'i1h Ԉ B( d. Z%bʏ+QѐkR|(,lUUQilֶ,g:9rRmנBhX2SS *0Ո!ha sZ qVPvC.Q>YRtH] )Z C <;򄀷E2.Ъ&"n<"VDŽ$xgoi?ָpAk|> @7~z,gSjBe6h&W9R"2$zl{ kE@HZy%|~oQ6[b;WeP%mg"Ddl(5'RܢFHe( 4S!"CG9HQE ]7XW}0O(Ls' =mC84H`fQvZgQz ULP 6&l8Mr'P^Kh@jϋUQU<-&bHiR[̱l^ V($!dR wY>*އuj~G/Yv'ifDiMj#Qy: %0lwT3`s+Z  .vɸ0x<ڼNIe2 ^КlP.IlTlP4c()]n0F#d*$O()Kg{R  SjN@%<199uL꒽;10Rq)zr10ئi=SÔUfG0@LiH NB@!,(Ρ^bw") (5uSg; sQФcd[z ʣwDܽq B@"|ʻ,nX'ʗŗ՜@n]~/j?~|\bU!4w=n2l><>5잾{"]ӒbHs(G=@Rtg?L{ iŶŔ) )UQs A(j. ٤(&kDCLPZK=xSuk-04(%ˎru]cKQ !w IDAT09SdjI~f=Nr-}9ƌ.'L&#JHX#5B-!d"i3Rq !RC(ExB$눾GAaTURZb p_^PYkQ:G^@H]3'؞ʇ3h'}]8gOͱ73׾&XOy??_c»_2U_?~%\R||1ge?㗸}wv_|%_"->5x{{9CYJ#Gij꭫kkxn@v#k.r. =K1*ͭwk:?{w 鎭hr:PmƣMb6eE%"-I"⽨x'VIMuľ b@!90GH Z(I#LCETeQmUt3QDZF}ˢ<)9fyv>&Ę"i|J9ee$bG#A;;6JTu\l0r=[Vuj(~0fLo5>=:zH7*ёȈwS@K|, F,ޡ,HdAuy'à ŵk%5i =.^[|\Z<|<|[0{rk^#|mW?_VLyR1Yo+m>Y\ITÌc#ҝ|Swczj̦ LcoNhgS! RY$^(:F#jPTU1DhSuxJ鎭LMB7=MEgY흢e\&dtX׃Ԕ V7F2x4IVKmjʲ@ٵ/ . J)LYҽ1PF"bޕ*.b͉q~2hRh!)QSÐdSޥF)m~/I{3lԎN">50wt.OQcJK7Ի$P%C((TO-ɟ6R#3RXkIB2F%<F6ق.kR! T Ş{FF19HY_MBqVwQ" 䃰_T?xk|>d/o:oGl>E[>77?-)\u?ox7#e o?~>'[ $sJ2xEPaD1&JŨ6h;I ek=~$g;-41Fam1ĪOh%R6`pQ,lf#*@aS4ؾ`Un st@ sJ)19(0Sf:]m݌ݥ_Q3=y=Jy]*@bFhggzsꥡmSWB#;LQ ~Np #1 Ʌj(RT4m%L0Z)RJ87ANߧ$/rEVD*k>m#o].'q8NDaH/zӳs2hv=ι< >y@(5 A]$BhEyTS.E~@I11 6 p P%.XBR@xG KiRJ ÒvĘI*"% EB#x01:CL@Dn3BpXJ\7.WHږn1cZRJh' 9@JؓB;ba`Tm{aN$#m!E('EK^L)ALZ {zƣTM0g:/'o{m{꯸M{ĩC妹o3\WR}7[O5v':O;ƣ7x#}+NDBPp䪯ټHR1rz 9GA$ո Àu$Y4$HRu!j5IVAHLP F4%Ќ)늢y[DZJÀ&;Yw=I]eE@I $%18~3l{؟D3'pxQb̘F|r$(e=CK#@v&rDQ4ce(BX" )m)2( Roemj$TD2Ƙs#x)8<b!d{ܐ7~!0o7<7?_Ϋ??20}w|F;AJĔw󟨸"wk<d?y?{AyÏQ^['+n>爾ꧺΛweS7)H\8XbL(U 1xKmxj ۂ(4-tQR66P JIB yҠ,Zylo&c %1y>{,Km[.92ZﲩVP &ɀ !DA*tvy`Z/tsSl7Pt~I K % !»% w](p>h(bd z(X,,B$RN1AYT}×R y/V!X,7PaMkX =Z%ɒTD#HADAQ4KHI2de},3b$HqWbZq5¸F(b&t#x ALgfw_I9c o{~ƅrjʍ@ ġG1EĽܫb;Al3[tH{ I ƆD E)jtѠoPo $"6zxMSS7L]aɓx].1>чh (*,;=~8 `2pfgѨ(7:r _ .pVbB@Q O$"RU#0,GP="v8wF"U[x9!E"^I hr ywk]kC -bw켷H)pV 5w![䊔k"΍!ן{B$1(bz Oևָp )[[[<(={G4 {?_fTKtw~N.9G9(,-2" !U| D(A;IG_ P]Οe^eå!\ ٯ i 1%Ҋ vfm%R>dT$?]rxw`:\!9Ov1C~͑F`ˆڌ  Ķ-US܀H]2{<F"/6Vq)*%RՈH&ʂ1i HOQhBHg;pܰKX1(F¬ߑWN0!i G3k<8 ,A* ~a ,Y k_QoB1]?-_bĆ+UnEHw; VIZ (ʄa#@"|5]^\Aa61k{.J"o-B>WauSwxvraqa`+lp9Iܰv-B#&]{t߳`R%&ɚkU i[D:he͠ Bvdٝ{LulnLG 4HD[0@81f?$xp!KJV~ o_Ip->ɏ ~XJ3}.7ajZP7_>2>{o5.xġ źgw?hUP z,?sGIZjWTwX&yD{ 75,)_d)яX?:ʓWJY9B)L1JBD@R*-,<++C]a]TReJH)Ketdoo]9\A9/+ >(*ddTQ;sJQh 1_vmn퐨mБ@@!8/QxF&Rp8cݐ=Zl#bN1!ϫ*6jLJ q%.܏N)Qrgы!sE fUmm0"(Sz? y5<5.T {ݏůLA憿R^k?ȍ A_{;/>ׇ)kn-ރ:4f%bU)B:{y|3>G>Ntns<|sUiU3 I F/s*M^h IDATo=Ne ) hUX |&9i6p;9u&DQ=汑 %Y,g)*ܰK{o~g-}uHPz0Dze{\{ٙ0~] @J3 ,I ՒhK`}hv+2Rqk=RDOL }UM<+W\-Ĺ)I !Hx̥2wqfÄ1䐼UWNj5xrnN{Ep,EʄA&{)̀;;V?h'h{C\_&PK#-p o$ pp WsrN}%r(H9B(B},Gr0087@SW+M^ F|L0gcr"\%w!9Y?@O| Bτf#EcZh9O']w1O}w8G_䍿B=K^#l|w5/z\ ?ͷޕz'~ySVn};%x.lpǼ>Q0zǾA}cx\6qѺ :KSV믾7/_m|BOs U'Vj_6mpFv"^ ꪄηI わ}O>XrIq?oC{ZV%"!`WGe,$vpx7',13r:w>~o='HP5TѶ9k^!L} `"3hWl]D2I{6<"&gx?(X=2 |;%OJ<޻\yُOO A8t67ሁ+7d}I׬>wooӿc/NwU眧65$N "EQ"UWYT^vϵ"ZY˲"AXCzOf2ܙL*Att>W^iw9b:yᙼ_}#s^qm߿eyיx- }ko] FW3ϾPz2_]3^4S T0M-niAD%YKzܐ 爹[o|Z#~5$P@ ED2_/ByK,C\[/9K &~WBxN;7] :*d˘ԠOv#` 6.{t)m`Wȳ1҆%IBG3SPRmlߨ1iH`xyD n) ]Wˈ^{>o{# T(ca2;Ju6'NP+e$(I0U25*oc&X0>Ckf/ۉ |k AcE r܄k5&NY@qbe:\2;y Vf}cٰh^=>`{4X2^؄sGv#LEU 1|knky0{/á aEG6a^>,?!\†7[h=>8(xr{`d Ca_pc] ;`boGǶP۶s5m>OB^xg*w;_eл]"[x*)s,z_cS~wvc|%~ fʳzLp2̣\3o- _On6nfՆf"xr>^*'.yR'Iae-9^]BN-E.~&昜Ɨd{AUԂux%:d Or':“ )Cs b~i&ԙlLF1Vc,|;, >sAi Ayo0dCTC)jxhal' d&őd# vMu^x6Nn ,mp+*P8mI @p i탺UbPL'ݵ By[['ViZD1d.a_ĹO^G.Fp\Ҁy z'Ww|%|xܹpl(\7Yg0)xd՞g\Po {Y ,Џ48"U x">xvZ>8\pr+ ~8>7m\؄ϏiDXiœ}G9`[moNjtp˙38|c`%Id1mar&>/7wNRut@~)Ex¥9Ԫz78  pAXXnCj#'v.`y AL抣S,5p!{GG5r'y`6 J^vG&V:c-_N{Rȃi/<.B3a7Hmݳ1"*h` (8v I@ǽ@$Ml9TR@Jp,#K0y kD)&(щ#G $91L@g1QT Cr`l<Aُp>'<~^*9vw>2A||>?𦀽'aev{Uqg{ߏ=~2Ga¡6vC 63v}}ug}_ } h]k4@a&e}!%kh$7  aRDAN"2~hB,KHGS) 2zEj_lmJ [{ɏ%  Ԏ9(l :QȠR?ڤ"~3o\["\@sTYN1U$i< \LooH~!,~ H1y )Kq$•P ING0Y@9(1yFG} K5Z Hb v*-J u"d~ dHnb&8I0XAYp\ωO ps ?4s_ &'NK`}]=pI0n¸lr͔(C-}mٱH_^u%}%}LR[i3B)HLr = yjȳt2u/Ra@I,CD:m&-R6DɈ$`x>k[ XuXlm ^ K{w'#L֌݂w΋@̆UpO7|wL[xa6΃ƍ-cX n&5ۀ'Hg#!7"\2i@'dup1;VwOILuc|}#{_ڭ1| appʸC~߀c[ϋ'e@Xdx^y o؋8-M,=rp]jC;W.W{#Dӏ5aݜw7qۇx;ʇ>p*ϼ8NN۹]Gq/ -AWK[ I*DJ0BʐR"*1aEMiu6|+yhe̯-z [+S@^'f7+.J)&cMltssX%8 jڰc~ӣy אNtQt#TKo_Ĩb7ݽc;s_|;0_!Cᚠ6Ƈ8뤇,;Q=U!kXS#H ^֤n $ip ydhY<À$i`! V8^u*iQ)CҖɀvkw!ٺDW9N|&uk+xdGB0x.|rlkj 3eu>ǯ1Y [E~54_W'!pxaOMo`땰֎Ņl*a;Kv  T7  j@04{kk揀/ & a"H9.Z㾫r^/}(`u_WEvBy<D+]7\+mo%lrϝ6(z  @U* BH@bBP耸D!."1Qm$Eᴢ]Qv*(91G|imnS[1rSx FYZ\T̟9+N^~䘀 zfhAE\<32l\@$trɖu-bÚ؋M%qr3v`4ޥ8<|X4RS%m% :\J(4˰BIi@$:QajRֺ`2?{ilHYĆ-OZ\JgX# LKW]L!`.xw. =ѯ|O_g$mx?7ªG"<7yj ˻`R0`JȮWM*h aKO4/s n(곟(>OS>GL2v>c/ VF9MhqϚGd??KXf\nO\_  b 6BBO2Ąx7uլ&dTH(o6X+Ò:41.$%d:~v>om|2DC1+IG{ ᄡF-͌6fq*>_sH064tδкLgWʦܱfY8Ct fDqN$.%hc[ɾF8+[^A5GXsX: bxrr^K)q tt)S ,XO`pw_{˜]P?& nd>=6&˄qxȗCl ̳qTʾ|G*oo>ُ`,k1QvP߀?nG\[Nupv}Om"q~/TT34OmfV.dA>Xtua %c9DmduEkh$ԂVs6 Ss%t@s8Gɰ:%*1#Y#8qeNcu;_X> (HjLHbAPi0!i&;⸄ŨH\2M ]3  Qt2 D;m$Ggq_nڜ,.2@ s :aq֡>.YCB@?:m#_\&(8-%{q7GL'l}]Á/ ;gJ2{Ջ]doyC/O sM觱(d?!eq4hÉۉ9ɚCXC#*r Es0bU (((I(@y7*$qp^kX0?RrrޫBu)59&ϼUkbLL"LI,AVݨ$ӻ 8A܅I49 (= C<1^l(0)*(tu T}N. Bװp P@3Oi4dAts%G!؀4KRB\Pf0"iܵV` bF+T@X\VMis/W X&%=Zr)CÏJ}*v\𔞜ߣ|gߎGN°y!v;LIp/Fmazڔe"`.~ VSX۠voE7Yl0;~ʍGsAŷER'R;R,wT)&ME6ů# &V.E,=t|R]1-&{|GsDno IDAT]cDҨ60Ba&΍1>2N)1f`6n" 5oWM P^Ugxt)dcbeY}=8m'߉kQeu`6JAJ=0Ag@fsEW<%mCЬӬ7pڠ@`q8y1̈́(iř CuI[(rVU>>: %K83bFG+=u1[=`OPO%N_dC1pbDp?)5O|B gxє^iQ>s}dϺP^T0=EƟF[֯sYMK.y{pUhs C:gpbHN f@HuNAE/[; qn. Mn5'?r]l7h)OuNsI +#hSs;Rvut*^T]ܽr'5[+{$ fF{P1>^C73f`8U=JtwR$iu۬Ѩ`cV#(aB.T "=h yal"\Pur=BZ>>DZ#K-K &U8=j68j8Y)NkT[ .!)GM2!9X7ŤYђuul,XJx2SVn')^7h}жx bHsf@]w}Sg+p;':|KA׆FDZk[8CyOքi+^q :_d'#]Yh(,#?iڢGT%df՝axtv?:Af̀ӧ @ &=pwqؼɸ҅}oi 0xO3e PbFg+ڕ ׵η/u.0g?;À}?qOccߒOLMiP<{Ky+"jaڹqu{3|YNؤlTU1ŷwۙՂK}u dxRAG72lI:5@(r!H' eȥd&8WGDj%%1*)aEcSHFF6SꘅJD@=vo?.!M _mcp d."08ql _.͑VcKQ2F"Cp&'[o-SC -V)ha&aN\{=u y pґ728r"04lD\e nq"=6zBS7jqD@ o&iB8Pc~0=&óP3Ar Kr_ a[6UFr+PK G r/B`s O9q!B( 'S-3Q )n\`7Kl]"KRmZk*UxKD c[l/٩ܺ  ~8ЅMۻ`3`g_Ѐߕ$~@Hr׽f;gZva0B4*c@ZM%I cĊtbGK @LdY 4'.ktV}>JAX)gHV ǡĘz1(rcqBbBW# 5yXg N jcd/B oBR ѓl}gC;<1x{_fM*roIƒPJ7kX{بGu"B> 0 8*7>s-F}on{-m1 qiO瘏ᅧӊkOϹ;ޱ|6uO(U"#D qK.2nձtM1W';݋p.w&aJ7>~A=>G_=לe\n><~97\1MxBۆ ;0Q {Yd^u13jCls;f5D-&cak^=e(P40!8G)1>=|X7y+Mnh{xi>$kKk &)3Cw<2wnHq*Ú@;*<0 (Qȸ LL}38ȔRP|5.M,w ~2-#`XR]Hr'6P(`B.D qa{0z.7J!PhgX%$Ip"0_q?ac5N9 tыd2]ɷvoFwv#>oOg\f  CcB;/mP}w = #χ;3G0@*{0&5<=!SWlUv|0Yϋz۴]y]UYB`oCtv,ɡzü5m[6m) v/_.Y6AD嫰n =>[Lyr*\s(| Z 8#W|6.w8peӘc!+ *(d^أ8io7~mn# \xU13M&J9,uKvb4*TL׌ń ){xӕ1c<F9F$H4JfcSt(E҆ iڤH|-&j8RlaϋI DkQ/qh9% &#P]oN5՗os1-%<7ٟ?Mp/ gGoplFIsј5혛J(h iQCm  l|*a6_[φ3Ʋ/s}1wW(G6w ݓ:(h+ar8 Y%yOS\ŊP;V6wwx0nZOiUnýk3x;ZmjJx й}OJȄZ/|>?y n{cӘⲋxx9wyoA)"iDže7k8GSqF]X`x4V sYv]]s)%N@n4S 'ԴlT[^ΐU @HgnTfJ>n {~cUS a*8smi5T` Cőa]F9tn)AE;aifuI͛ 07$^^$YN}^8!qbLz^7 7JyJYJZZr e$z$gƁDp/Q= Ǝ%Ɠ(~r ^0ѐJ୏F<'`?q8ߛ߃2O~ڿxcM1kl*^wx>ڦO0UFm(>!B%XD(AE F0" 2t^ú )C5^\& CnA<[!$ƻj~;Y@[{'I* EaH͢m1@kNP lhcLabʩ-+F0a~6J!4!"U錮db46rbp-se t9S}ڊ=FGz$|y0a ѱqCBt9'Ke.EŎtpaM"MSQRb=*u\M"}C 518|tUvJSہ7Bdھ!Af۟%pK~31:5oʳ?,.!6JWա,FrSg[]0R(^+1S;ŮmSb<,ڨ-u;)՚&}|JI1o޵؈x؛0{.I30c1&TeZ)K)1y,j55BAj!*ZK&aJ5o}elAx}J!MI>!9q/El gu<_pNe0q`'YcaS3^wq* iU+Ll'C AP@/Eޅ4V;K IDAT XR* $)KY?8֚N c<,(&Ec}B*}l~ni‘}>ȟ$Ov\m$RT41~۝h?:Ps4X̭(:須<4eY)|" s΍[m%RJÁc&FPT76TG#MyWn2v]Nb:2!^M c%*QI &QF&6Q]D9cVC.my0g(*tzz':u&4 5sآK䯩uP)@q~HT4MCa1/;%q#&<ЉdB,- bRD4б%Zu huddvm&D&TMaRMΥB-寎q}E[FryZZW蕉m;t}p;/22qaSv04#8[;fԒ(vt=ê 3@a 1hwf@jfqvhB˜RȃeTcI(qnXC Jc MC3>x ۓ:C1ϩA#w1|>5DwC[~B>mK/\\֦ #AC>?7Gww(o "}ړĴEAYtPon$TTrwV7h0u"1iny\` 푰aNy!pނmFQ:kzHJr ՐI3T#:)J^mLn #(R TA*ز mJ|t(_<`0 y:?=mgYf{G+syzaDOJ6s7 oZ?Wh_hZDm5!EvW{׿OӁ6_9洂Rǹy, -IvYn\y啔f$ iIzt1a b>(,1i CH%JSb+KHұ=(~ *hdcUC2ti0;B"cIzk_D9PGp!Tc!G~H]!W<MUcL'yO4_;:(jmR3VwRMR14'|مC(1-4vHID< <11pnst:~5j}ll{Z~Yy~ࢋW`ɚ! >g,wxɫ,KRԘk K1ClrR4k&4H%u0`zՐkx.ghPP*s/]uȟfE)֯>Bwt6ÿjH՟_`AXIԚ+X*['MHa=|?nmIB@ AyRC UPѵ"),GYTU\'DTamI];R4!\ fH]ym!-Dž;~z)uJT& ع^~ BuN;?'R=|x/v=ZEyɫG|TYv0`,X)D|Q7vmmP4>BT1]?/V+[߽jBEQP DIu]+E7r8ECԌ4UYzG0`'v5+WRN3r|B$A@hGĠQ(U4j !!9`syGiڌ[jM<*x%MST.Ut1*-uS)tʻ\esB8oHI-;ޥG t[}!崏T`Jټ \F>Ъ;MQ*4Mۧ=ek# qn : N|'F\5Ork@$s`w *jgПgrd&A K4c(eK:Lu/BQJ)3%#]P2ɽ#հO S\^ enav!4U4!H 2j>Q*wq w!|mo B4/ӫuHJwc,{&qOZ8M*ka$GYep)RیŨ3Zk]4EDҊ!B$*稫ycPUhSӄZ[3Tc,vWQtֲjN\2,)fOCs!%B~M}w܉s)ƿ;s8p;w}vVXeΝE]?;09:[s651.yL]10?D՟0 9jPJ펲f  +.-p㚊蘦 CKQNRtG:a'DM$f)'45Q)rQY[)5 9HQaZJ҄:gDùԄ}J6AB@XEu=>ܛmb佢Sx@fCѹ/Ivivss~(i >ӏOhpj5 \wZ{Ϟ={ؾ};[l9SkΩeΝ' !: rl]Z2<rwcѵ:z-{>U=GUYF'%Ga5MP$E1Mj@tnq^UUb-JҡT l;;zƦ.MAb 018)Aut55|=t4XoŝޙCP`\MSaL!N4(o|s Ջw@[vqN)W'b)®qZ>DcŊgj=Bիz'}\BO+S&t.J8 %޷{@ci>4=tţ01N0Fsd,Rb16aetX1+kPNI>EtcF:괚|*1x\3O{ZH8.I1 CIz{9hs+];O1w}b~f6s}(E+MEI\]`48ړx6Y p.W9@0ظH}$B/N>$G^{!d,PrVP@a.CCU 0c'Tc lѥ1vI4_7R-Ljd0>(mI#,vtrt ݉-t7ZHh*Pb;90e;CvCbsz!qM )iP &4F&|W޴B{J; ,1isF:!{=m~RN}G\kq/CJIJbIX+”1FJmc$~%a>\E]pUԟC>PXl> 8~.gDŽ-5{1::AЖUq B*fu0Yq(;tWv 9fPiSGnI >&c5b$HDbnDbоMaBO`@k$؋e+ĻY`4y]m|.*b̥gIB"e4=Q$џ:" S~`HnQ(*b(AiU7G1:\]bˑCН `|Lw-\R =ݮ;Ї4U34[iFϓ҄P^j!h0M=O5s9>ƈI&\ULc )vC] !$T[p#~@\6|#wx>] kA9-y@HW&9`s$:=_ *i<z5hN skq.F.!)Xz{0 &7mQIArT)>njʢ`X9B n|&|Coϰ[ZtԸ!iPx!Ã4a~S;bmĹ8b>p Bc>c"aIlw"74Gr !UBKCOS9Ohr/k g/O)X"?|_;Q㢢n).̠?;v_ΗRcq`/OHIQZv̭ZKk-ƪE"M Gi| r>(b(s~:{Tӟ.ߥ)N_UT5nA`0Ա!>  LjA?7I%Y#Q1#v PxIa4q@5\}!:3EuD6 !t_Ӗԡj\s5)66>W*aV^o@"> 41%ک99 /sm>qpI\/|վi/5$Ͽ蟹c{9'r)V(iHG FHM[okwݶF1==R>OK r}߿ pіMYh˽Jܺg/ Y5\y^k1 Tp{sw"CuĤHd~cnDn% GOvܬQ [o1ѱ.X%$}{ >*8<džI1"oۻ-y' }#HҞТJظaCGs' %8$ƅY} CH\pF#':<^c>DLϗOCӃyU?~kf.Ǘz Bq8fnc~|tOCf㣧ۢ$!Bk fxnw|~"?\ ! 8q/'cO~u`eB!8#zeuB!Ĺ}n/~0|? B!Ĺ옝<iM*Bm }腼߮/w\J*B-/?}!6mbznbӦMlXA x[ď}%Go= k6dUYz=</ÔV(5#߶ Gb~_+VblO |<PjM-8Y38Re}0W o6qkϹByOnE.sU~'}f"?õot٘n^xΧpogl/{܋#wf|5wK/}.#W®O:׾YY^f{wy8/=}_ODmK!g lz8U-火̉;JƷ\.Fqz~?zUlY'ᆞŽ;S^0Bq׺?BIys_ǁ?{Ob O߽_u课/M'>me~2zj!>}?"'vJv8LWN7+;XqI#c!8?I'pˇ~pOy5`j6]cwqk63v[R_ok/Z:ʙ]8ŋΚ^|n>Ǘy&f-?o/^8_KMIDAT{!8/>|Wgx1O\Wo/$/}g=ͭϋ_a7HuL/s_ x}[|!)?`3fo>kCByn /SK7?ޗΛ"5HOo!}6h;O~gn45?2V\Bzu '|=~9\u. ^7hON39+^x_Ȇ6!XTJ)}S⪫Z굜_Ҁ}7݊Zx^K<#/|.iw`0[YU !\y~ U;YeӚ)ݗ?..b֬YBs ޽{ٲe E!Ycbih)VZ=fƍK4!8g7:tyf aa˖-ݻw1 !8c}}qPJq(7w^ZrLd _?x.iý0!N,K9| !)8f[477g>~+ry|{b]BܥqzR/C! {!R0`1o=r+mG\w(?w=lp3xD}xzi}.*NovB/ >]vJꝼGGxn yŧ97p|a ~o>Hn^ekYş{A!N1C"}D`J~͟K5|*忼̂@JE5b1!I!85 q>T߿+}&S6]|c#~cyZ z>oql{!85\$wO II:3 :T#"߹y#SvڶK-r|wIٝB`S#Gݾ7J]&?o/?⍼ŏ?k` V~.B88nuGMs|Kxrk]|;F~4E?>7[$ !ĩ9acsSxڅ77;w}wC>]q1?W>+73=&;k77m`D-A(6?y?Ex^_}>zW#__cX+ܯ E?~^Cal) Bqj eYbLbrUJsh~)unnj~?-%Gk׮Vheg/IO~T{x!Y/u]x֪؊UQ~?.h 9s2E[s311KBغu+7x#2MLb|K/t#g- vZv)DqSJ111^;`8.Ѫ죒Dv!bY[5!$;{!bLLL3ïS[VUy0~X-\"L|?ȰD$R|]#L 2%"MEDk$RhJX>JH@ Bh+!Gԛ ߢEXF""MedX&"ȬE -_Q|V s8Ə+2H$ᔗWJOY233ڶVI;O>bDY%IqcEFFz[C"iTVVa<"nNj躎L*Vp &ՕDAAYyYQO$-PWWˌ#i9Z]*8\[!9َb;e"--E4 Emm`'a0M-7 S<]r{uIf˭ޥLRi"۬YCjC:BQTTE5QT#%ٚQrtQZV 8+TYYlf Pr=\E^n<Ӆ/gĈB23)+wOoai'CWg]xT8bͷ&nnq4-2ɜN'Jnb. EII)9$ٚō!T9jz}(XfTEl&-ՎTVVtTO9q=h*L&2S2\9!Y-$[Zܺ?nЧoo^dʍ7 @Nv:Pr^rsBSʕ&Ų11הr5|AMdуk?dCUII\>o.#W{x@AeE%섙gUn&zIVf&^vSYF·{솗z8u,_zl6sпyvTVcRUj\<Ɲ1ܜl5 )Yxp]F^Q 4 Ovs V/TthL}Jf4 ˞e\ lI<^/b6UFS4Ժzw.FNv+xɂ^7Bho* =Ɔ߿l`I8VO>;.97^ 7^ EGu}ٍuN^2O +d2+Mm.`lzOY\Eyn:w CmnM=G}-'28ݷW ](dh c̢76m/[ںZ+.太*2Asoy"L&!V /lxiC ۩DQl6 ol6N;,N'G᳒IU8x{rrʤo祍cO?BY]ʕdR'C@'d{27;1<% H)a;o{1M2~Xa6EnOfռX77&ՄbE\Ylf}x5N.Pb2md͝Vއ}sϿk+L*)oF3T,`=C SngG8]/I(*f.=Tz`EŤ-*Ҽq/@&I;t1Loi*$HAdINW$ [5!{nB~!HH$ F"0IHH@*DRa$8 #āT$H$q~jzj_XPQ0͘xO$~:ԹUGC_U0Z-6,)ɩx$atx=Wr3tpƞUj#wHWUS\RDJR2f%iƫy).-b؀iGEw2"9)nWbO JtM.UՕe%=اؓj^iE:HSU |ͽj^.D6JCnGL[atyMT9xMq:;T;"m.]!G6ASUڼMFUL4Q`۶wF*Lt N)aNV,[ Ko~ =_,nݺ6P0*++?~|n0dۨ1|%9l4 ֯PοA ?J#l=(|*F^4”KRR ~z,Yˆ#4iW\q֭`Æ L2ٳg3x`.]CUW!t| Ӻ->}|$?d3zh}} \|glxq=m~SKٳo7/l|zUѻ,[xo&ު78;ƁXb۶m c#Gw{WZZʱc_X]q6[qt qJ&7J ( &ݷe)L>W0`v{R[˛1r 륱Xl6BЏL6ÆsǮxޠ2uTn&***X`\r B.T#mzz:%%%?~^`7 rc`T Ӻ4ј3Ɲm7^!7/Vp_ǝ^ﺺ:'UU٣E͡2LG6V%Kзo_o΄ lTWWi%^`7UUq6S(69q5Mx7ޤWtIdeeq3?d ۓ2?*cR1LWTYO6uٳ'9990x`viPPPP/.''.]]n@0Ѭ_~݋<(6#|楗p_#ڹ'eAa7-EO>lۺ.]8^R°aͩbTL:L&^~ejjj7n-bL4r6n[o… 1b7ofذaZE42M2h P}$MVO+=qθx$%9z$&s[nbpҕ)&==1]z7+WȰ¡V uֱsNL&lݺ޽{ps&Ljg :{[orfΜɲePWs4<%ͣӼYKѱkY EikUkkj[ z^<$$a٩9EPmjٺ}K= tGcT !''1yy|WtэG>b8$c% \ -vƒqFPH抪 (--2Ϙ~om:tc fAK=ng⤳9t{&N:>LkiL2UQԺj#9nC9"fιazRg$C&3v[25eTVuug5vk x5md4+d&Ş=)#OqG2Gbzpy&_ъtQUQl極RQ]C !t< *iY;:F"IRa$8 #āT$H$qЩN@N0?ta$(#If/HAQxaJi0I0v/DFrdpit;{ ^0_UUF~TN;Oc-79}SSMM #Gs5¤I69V BX4& 8rYYYFX2.Bɓ 0*\|Ŭ\5k4IW  _ IّΎHIc[U8s'Loebb_+'NeI8cx늫j7_+0_;:56>󔔔dɒpFU+ŷ(*owPvŷq ׏e KӐos&MdϾٷQcF5XSqq1K.套^`F&ex`ez,ob|crr9'N1>[=__|Lcճ^Y|5)fkR2Wn/^L߾}[&9/#W|K|bL]'i=0oO5[ Q:q$#^u O-?iS\ns}@~}]~zqiii?Ġ M>@޽鎏IHo0̌ 9rC}XmF}ɄKalBqq1)))aFbΝ |>oNO X,rߪt D>8ų.7/9?>G۷/_sCaf$;Þzǘ4i-bڵ޽?7r 7>07of c|0֥UE Xujf_<!tz-;13.pKYNuu5"5-5F;y>sgnObLz^?$@q8EMM >GYZNCa#?L]o{)9Vbx#[RVG:Aa'm0cOˇՑ̕Pki|?& zt)7tFI0' F:t$HAYaI"4 #HAQa$-a$D F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8 #āT$H$q F"0IHH@*DRa$8HZg-UܮDd)Ymf`:)TYG SSWc1z#0E..r]0pkїU0WYO!DD/s#ѦzIEU9.أwu,Z0Ueޏtt4Sב"6H߯c t.MJP t_@o;Dy- ="8peam :A@zj:}pɏ1;Q:-VZg-i)hd@BQT`U_N02>ae.!t+׃3'Jglx t. P9F!frHYYǢ OHBY%r9%)J`/B 5ċ3P(c^˿=ϢzbR:|Z/ &QDČ"pØ퐲nsYǢ #tMx}oׁ#̖MX1#ЙN (.`I$tF "”z'uk:VM@ 'ЯoOcFPA($PӠ(!3G :zXQ|3aCC1vc& E0H!G{}6vH=oN#!Kp@| Doё>qEBL2M#B PF!?E;\~A颕"0K;"_~G ̒yIOHxQdR)X$n A,aavi>B76"Y=sI~g` !ƌ(3b`WDH3Pl5eÚEBL2Mך>t'2<cszi.AY0\W_}>^M1:-dd2OXjpiTm}_x}{cK1t#r0{<%7!*} ھH7ZWg(a.9V“=Ň|DeE%}ferłyW,rF(-+cvXZfMFm"X$$>Eojd3³n'q {Xv؅=9<j9"Bх.7>[ze4j`b(-9ΜsÏ>D|v'k~{UO<2l0Yv|5]?'^ֱHIԂ\o{uq̞;xR4Õs$ٓ8l]~VE,PG,]q/ǎW?G UU,n7{b[mt]Ood2,tO\G7ZGSb1X-zAXt\|E ?!tTV׿/^.t2N#X I]ǟ:3f<@grrm -E.o?ofMm[{EIDATb[ڬ;Z ؓo׳ÏYJ>9c4}gk I l.5դ ȱ#ѳ;}7AAEE^uf+@[vu,t2z'L*-=NNn6&QI'V̬tƝu#Ģ6Cؒlڱ? ]4x~{pE\ryLM4 XC#x(++#/?/S^V9f"nKdݸ}t(+-`2;߁FUTΛv.i h JrJ2x6+99x5Tװ _3 <e7~udY9UGRxjo'gM<1f5=Z•W_qb+ NYℚdQ:oeϘV/g_H+B 7u TEA5rp0I6RRY>Κ8>BCJ,T(A&Ykrm̿r/8cgyO^wdڅS7݅lb'q: ӟxƬ3yxo8yIx5 p:]ؒlDEuNt=] O^_ziT`?Ο1uO>KJZ ={ndd‘G(++'#3Uܴ;mU-}kok擛˿g|LSt =U_=r/iwʉۮGi <B_sx`ك̽h^ fͽ]׌:fBgͣx᧸`q}dэ`2,cՎjr|ͯHZYy'YVioGXa22xu)uhLֱh5/O瓚:-յ=ʈ!cN Mu,Z0ݺtFq臃4NKnv#3:R։)EB^ۭKwu鞈$ eݶȗK$q F"0IHH@*DRa$8 #āT$H$q F"3~z)HWHzIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/entertext.png0000664000175000017500000001620713203343610022736 0ustar jomajomaPNG  IHDR'GnOlsBITOtEXtSoftwaremate-screenshotȖJIDATxy|U8szIw5!Ye%,F}<|,* #2( sͺ$^aZƪ-S{4k^a`(?tx/WzZq:N$\UedtaZVM[IbB]QK $7 OܖHe1TÁR#%6,M줨)(2api2KQ%d0jZ[>[V3r|Bm(XƩ)'?ۨQ'A6r[b jMV jCPY!I_ nY,aL7oEt:FflyQ|\6+D(+I\bDNUjۦpěJGl4YQQw+*V9@Qc#ʾ7R^Qe6[#"taZl)0j'DX{d*fJe0_4(N~0VkYYydD.,ltnei"JUj|(g=פIjTd"<њ\:GȜEW|j4?>ϴZ41[h4.]7QLtJnjN<׃+Vݷ_ƴI{{ٻ<w{IdY&'b`U[FkFas*B-Fh%cyrDow~0M&3G6۶Nڍ3fǟX^o;n̜bun]3齕y.h49l|yl}_g5.ͨmȦWmVL|f[E~8]gX Q2nu4uNi?c0qpFfaVU=uJf:=Ô$VUju̎ee(dҩ&ZlRu?NŹ3;uloJri(|lpMY]mY3w׹Vo#jj-?3ז =gpIjxerc^=" ݉\j{) 0~(`jr(0b#\$x p;Ƅ <..`s6ȏY:>rsQzX`!Yn~߱1dvŶb{U¸~0j$I6Sm2f3ha~*l T`f\%15&ĝ٢jZhVTT@֭?X!Q"ue宧XވbkӺU!b.hy%E>x`Z#G 8]:g'[nmJhbS;.>tzJ-5k?ׇ~:~FAjuXXMFuΟCemኂpK撅>zWj`ԉ6x݊Y3gTT]r[ύ؟LW,ZN\\\J?cr璕K3S??}HG{spJ~ 03A5_':.99j[,Zşm٢Qk ))YT;0͚u_|E[E:Fw7oIz ԸRAI&7Z֮ߔ7a 08r&LŽEV@@ m6Nl-7ϵ4S쟷l(ZmøO@c:e &dX- ՚˗c}JDG垏%VsA`z`&j8GƘ( zRn|lhZ%NVd4ZjQx]j2Ԅ"As9!2$+ԚfaZu뻟ίz>))9###>> kΝƍUUN +pIG¤(*uSϾY!j[Vk}Y!$I-/ \B9c 1߬,Ewlz>CW X[ʾ:cK5R\8gSoԢ( }҇/T*!G*DAPƂT+!bDm&l  ٳd2]rس?Og {=_y-4:BFYG(Qe!J#Diu(Q4:BB!w lAjôB1+4$Diu(Q4:Bh]xܹs`6ۧ i8ͺ)Sl޼=C)jB.##c_>3 AGEȽQZ0'''&&e˖6lMӵZm>}N<i Bu8bAN\~\PPO@aa!hB.ѣ.\ /(]p!ȨiȂͺ efAzjlll-4o_~KtygrO y]fff.]&NXPPp 肂-IѣG`ʔ)~͛Yf!CB! DH1cAzٺu3fF>}7lжm'|~5k̛7]v|MDDD("jʲ_m6}9O>q=zDB]4:BFYG(Qe!J#Di:BF:B5kVLLLddd7pBVVVBBNٳ:ĥAHdEB:D\`ƍoݺܖƖ!w`udM4 {vx&4:BFYG(QZ:ڹZׯ_W>BBAd{̜9sCHHus޽{mώ5jر7.; xuܹ@~ L>Gq>?v5u]v5LWdl?|׮]3gt 9rk֭[WoVVt:]BBBIIk.]zGu:]ZZڷ~PuZ`ݱ}/رc1bD~~>ݻ_~.\سg7 at:ݑ#Gnumrrre8x`ff^߲eKF-Z3 6?OLLLJJj׮k?ӑ#G>veeeeeei4PA]߿fmrsssrr8p.\вeKgyZjUw]|9,,,)))iʺA]6--cǎ>A@ϝ;yٺy&ŋDEHTֵi&==}Μ9&LKƏtR#^zϯ_~yyy8׮}{7nܱc )ػX,zt:݀T*7~m6m/^ejc}-Z8p`zz;ud44~uٲe˖-nNo8uMj~]||냌A#:BFYG(Qe!J#Diu(Q4:BFYG(Qe!J#Diu(Q4:BFYG(QhwB!~dSF.B~?hI(Qe!J#Diu(Ϳ;U bQ4 Vч>KBGUnHoZ D?`DfMG9_B1@: <׎. mq:CYɯW~K ׹3qGʊ[EEDq2`x 9_-Α1*2`\,bկ1"G gc+0Dιc2y#p{0chdo]j˞:$G2UEGK\b}D!' i;]cyMO!0D cs cmyBg#2quG^ C]M!`TDKgC#?s9D&0:y #ȣiD@< _  }< 3`"9v@NXC>ri}! gܱS2D:!>#s m nc˹DdsV'&9CMX}~ܫ4C^WF9Yz9'J΍r&sGmQsCι @dIV=a\^I8Tϣ90~^,w~:d3g r;uYyqs~ZБ[$8 rv!o)q]wL'2fZ E&)) 0o''ggAn F.Oe=g1o;uHB|yYN_Oix^qZbh?ŷOπ65:o)q:.sd(#S$Jv>BH:de]:'Lumywu^:f :rBDŵ@kYvS?kô;v_h۶ `"{kq9Dds qO{8]>ü=R<쐛7n.PڼE>f\ fͷ_Gc{޿u{n}:l8Zzy&yyZ?뭒7t3`Qx{nR^}ѵZgC$mݼ5QII/}-1)z}S_Y pDDJRyY:iVIo[, Q;ì뙖7W,_¼Y#F%@O0]X`F.R_ϾPXxq//`(1,Ywa|޸IS'Z,9gEQĭ>l\=^ 3׊wWU7~QiS&auDXj(Ͻ+׮6oԈ'Y_bpX6=3Tc]ָIw C)͚7뒅Pauw¢[DGSZ@Llԃ}8DI6NEq~s0mwHLJ$盶i`Ȱ{C7c|0WqqqBRV$%'#Jx4hUqd&/:߻^."%2*bZ^^Vb0``I⒄ I}`X5ZMFdr܅!uKI#":f~<W\\쵫ݶ뙝3%#b~}zho>=a@C/fuc]׬Z{DEE` "r$(78%Z̖k׮9uazmDd˯ا_hQB=ݮ4ü-zkǮFT+#W.>;8pgyJ%;"$q!G7%(ɍSrF=7 Cvl_Zme$``2aZ@@sEޮCEӢ#++3r&M$$EGGï^Z\\du7%O}3{z?`Gc|4G8ҽ+o,7ɽU :S7Mݾ֨3Ҧ=;%_2jXj$璼:%{s /^;;mtf8s(Ą_خO^_;/yѼ cǺUW~E/Z^V8eGW(?~ӓmv5 iTu? jpuW_9u)c7@;wj#u_;vܱNc]PȺزE0UVV{2?Eӌ'~HLJG.]:t|:ƏKIL:˗/.&>.KϧCH`))! nDB@.B(Qe!J#Diu(Q4:BFYG(QZ;vACoڞ:4$Diu(QIENDB`qsstv_9.2.6/qsstv/documentation/manual/images/eraser.png0000664000175000017500000000231213203343610022165 0ustar jomajomaPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<\IDAT8[lUƿs^fBUjQBE5\#Ś(ES⍘hP#&ByՄi& ٺ*mY7[?۹!y=*iVn\i֓|؏Z{2?Mq'1! IDATxwxUlM'$!@WDPVxADQQD4Qi/(|PĆ 靐HOv3$$D%39;gN3 hۦYv!B\Yr36 *D'w(n:oz/O[#(W=-,<[ds-J1>pO2ź79̳S'yl=)2 h/ùI Wxn4 uN=sXt');oC1"6 .YQ` I_[|9D m۴2˔ +B!b {XX孕B!t^!Rڶie\z!"HO@ZB!D)c0/dZB!hyrWC!1M<^^g`YTV 6d/O!B3^m5*[1a rbZ&뎤lQX ._iۦt nA  eph&dx53%02NTY,rtlB!J\Z޺옆i( j$d2dV{Mv{ʺT-w 311f9Q0SB~ hha}!*l71W5i1% !x^T&M,4m9i74ߪ-z.&ԙ |%ɴuX͑Sb\_Zzn_ fNx5_0Or) B!i2<&rs]ϐf^4MC)"Է'el'XNUJ`CS3*V=0mr#Ok{#䙞PN|v-%` B\.^2sp,qeOۙCUBݕItP]}[1[~vǩPnud3Q-}]wG#BSY 0" !x>EyHr뼻~x;\1gW&OΠ}I9X-k_[NI3ow8{o7Y&``sl_>+KHt^B+Tr(9y0*ڎUX?ng:1tM;1w 4-)6E7e"Ť-B!4ML/OmFZ2umćky40ReΨ(8 o^uC?qj]xξMԣT0قdn| {_/-n*B\eE!ӕ]70&toݘeQN(Bm*Y.7\I-wÎSSΓ 7'O1`GTanbЃ[yaNL!t@30txLwflX=Қs<*Vd-ou'L^͡㙬l2/3q4߅B\=,O'4 @Nu975tӵ؏3j6Var-Y219%VikHZp``ޔh6=>8Mdmw!W UXqsEy!'v6#LJj!,]-vVڶielS^0o=ȁC-ě"GWq9%;ˋh8o!+LJ3.]!UGu" &% JbeHb0Y;6?%Y^!Χ4 ɠ= "7MP*tƆ\;33BVmXv/q+OB!Y4 0.-Xk6.jX]NyZ,XO;u !Ej#341M%j*V,FK]! 4EES DV,-w!D !rʄBRFZB!D)#-w!ݹEB!UCYhyc[.w=Bq|kB!J B!D)#]!(e$ !w!.B2܅BRFBQHpB!J B!D)c)iF׃]̺!Df)Of+QwO-#Gvc%:B!ΤXX+$7CU .ゃ%g˯/K ғ(څX!2uC9-lvAMuʸc?}مBq ܢ3 ?|FHv/xBix&R *Bba S+]BK"..rWA+˅wb-I6!B?(Yp1\F!BBx(w\VNē++Aec?wqR3BEX1\%k_dxǂ5o*)Gͽ1Ax~MmBs"nOQz9X&]y[q4"ox79w3k#q2bF~qw{9)X7e{y59Eԟrb^"0$r2'9JVUȊf7QֽSr_#4 ݃nV HĢXziF}?wRo?L,1=4y^;>1_1uE[fhϮiz[XI~ti63=2n} x0 !. r:@utTb4// ^zv"I|w^y| ;$W,_,4aUbDzlpl<ޞ=|ʛdGRPܻb¤َ}G'4aޫ7>$e}3E0+֛pTs TL݇O1 P-$m 0H߾DjЧ~H^q X bk٨| _EYK5%;JXwݥbKPUC?)XuwAt:x9l~L3{ed:JD}:<&PuP7M>hbbq &BٚA\u| SK)ʣYĿ?%}hC__Q6ߵJ$~b2kqoln揘EVω`4~;Gndݩ&1BExg{k((\yi1X 7 C5l؉v=/ծ9/l(K*b%#|Y0?ӏ_K0fMb8HPoϬc %MOĺ*q&)[`꜑ ^Uox+/[C_g!淟v!KwJd1AusN_r F̅ /K>fcHOf zva5mU!;囷5@sgGvW"Uj^Guu eb<°߬5i5Wdr=ojCMvm`.;>X^~A 49=?˓ S\~[2ߢtl p&q:bZ*/$f(j㝾C }4y[OT(uU^AX5]֗ɄnO(W#mkC.t+ y&c'BFyHNBh4!>(B+B1<&zF"rc# G3{,|͓sn#!:dy /ɀ͟νO>B^>PxELRT67'Re$4v4qQb{A4{7qĆ)в;j#U!ȼVbʇ8MvW6OtC BLwRY_}7婱AAբhcdk2$/og K YMªDc e@ëg3| - 鄽dnK"e@CAt]y֑ >륥CYՇ)Cx/K-AcĊ93{@ 8({ohȠiP1P$Խn7 ԫ1c?l[D̺`ɻ_k&7?pƌ O`CAM-w͟ u 6zkAt)oq?н]KCQ~liöwҳtW<_2;ojGĒ5 k%ÄŽH'uYq{B+۔k+?{*_dj嫆')Fp1tڇʏζdK.i6Gg(kwP~s[tcǘ03b !(h4 {2x"[5+#c*X0Ow+ iSoV3h 5p6#W"F>7IqR& Vl %VC׵ީ|7;o7~2ttT,5pe9B`?NDBR":Z|ɀ*rIb+S3R>rusxƃtLo"∪Fjkڔrz0p)9Tg>KX ȚNƒ0nZSd 2sjp+͟k}?fӘԻ^_4{Tn ǃY~ Y-~.4MCUCAǣϐN_9 ,ߐBێr|J:s&iDzRyۢn9!*\=j 4l;JsmϘ],#|+|8ᅰ?mA4KY= A;hH %{v/t nv˜k3h\q-ԪĈ9hxv؇fB4'[W9>*EKߓPkh!ދ;!L.# ±`ܼxN [&Ly+uNR8FATE݋ny ݧ={;p;{YeXpSt my=ˣTn}7: |F 7鮳>Ͷjt t @͌]Ȅ3k@dZz6vVx~K=+a/_`FCG[O\7Sg,z'³cc)X q>'D ]?-4ސZ={ 6'zFAh E/uXh9_Qs-ʨ8hG;r"Fxs}ʪ7S~ׇM#cɎj`Ejav,fܛo0;=S>IиN3i {Q-Žn~\0X^jZqL#ޟV>vURRj4" ѽPOysB^$;^nD ̗0j^>¹6wW55ީ #U>GZv UBYj(H*ńcW\0Q"!jG6~ɬ(wgAGS%(!r݄Z1Tr{.lkDաJFƎ-$b~pzY'"QZ4k.=ljc[v!6JM=[*\9C3=h<ªYڅʝ;'lذ.9ZMSßK= S`rM",u(O`$lޗoEES;'Zjч(MLd+n<%_*cmӦGtS-LWw5~&w R!q>5fgupr4%!-*ͻ3dX_n*^KȓH?p{F"2 &o}٘F牆V 3x?sQxyP^ς1Lz\ b~2 o vZʂY)xGd=ӽ\Md/ 4{8Cر-bq/`Lv5m9 85Dl-zsV׻m8NFK hLjAϙX*rk4f c@ zl"4[Y}X>xnXd|.;ەC־UBO?]jq,gԝ[u ]!jaJvv !W(O`.H~X9,% ݉73DB!D2S }~<[^h ߢ\VOexr1 yc'*ą3}>[y39)ث%;킃b%؝>Oc.jY +j7/b(=⊦9dRv1(JGGԸ ؒ=NQjԆ&q&+CI`B+a% uOB!ĥ#}B!D)#]!(e$ !w!.B2<[~sKQ!ĿD-.w(Jt+\;\z!~^rWAB!J B!D)#]!(e$ !w!.B2܅BRď|=}R޿% 0=3`l58&w=|Mf`Y%V#ag G0i[K^ރV@ ZPK`:t3JxeBva! !hԴ)ʙͬ|4f"_l3c U5SޝÊ-xmQ4(B$V3Ykwq8-(VoocWT\k/?ԌP$;]y~55#ϼͼQs^'f=KSܵ%#1_zJ*ٜxqV ?ِ^i:+0 uJc^PhF,בU)ږӈr Ut['bV}; G6F`!|Ӑ*gsxTYj,D6G?= 1'km37SN:crVV=oM'irϛ6~#/Oe˩q'Fc/@!( 0npSc=BYٔ{T+Z%A[0JXPpkB2T\O19~% Oif:{[1tT#JPx\_}2=GC-Dx!wq{P u?g̽Ƞ[,6 ntP,-`faYT'oߓUʜzq|v2nf٪r{ Opmt^,zkT?@*ӱa"??7c]/%4|Ӭ 7.~b[ou-iKQ6F{c<:C?YAPi񖊷 94o*wt̝;χoKB8r&#o([Z/pl!7 B5|kk^(&k_j4-#d}LW|k,vXFm>pmA]gVyoz$+ƺ| >L*1M>pO Bq5P,obg6wUBV?YE-.w5(վ[4 BFBQHpB!J B!D)sw/ 0i_d!_* ,?"WBQܳ}-5=qqWzkF*?IǸ8~wæ򀻈lB+EZF'#:|7q1C|˪+4IR~HOHS7c6'|)HOH{4?ajn͟ɟzOw?#}O`]*^s}C=/A6ۗǻ}): A|&f;L[;sTBkCҳA0KfRL$uT=:7&u\[m&"VB!@[^'+9 o3?c_Fjf|IS6CjZ^w? gHzfDk{~H|Xw̪Mv%f#_s O#@,jgۼ|;7|͆ ]PVp95R/O:Ys ܞC؊==Wat˿![it !:]n䐒 N7 2;4znj )9xI޺,[]p*F+۔k+?#Ps} _ѷnl.  S^jIŕzo0>_zN B\GE ك=LoN! MM&aNsao iޥnrsƀ#Ls@yרs.T"us_-Ƴ׶&XuB!'n\`xǼm UE@L;A6pc%~-=YEֻ~"rJ+/kדܫ  x,|*صOMU)h܅2}9dz@[y!l߾rWA+5H<& ? \t$W XpjPC3=h<ªYڅʡYs7=77$BK%>a6c6HOɯgEz$輻BK'ՊKZa 'UuI7V"Ms9rpԾ!'RX.V׻m8NFKP)a f(&UhѺvPiTe0tZ(;]uk߿EqFPa'=ZI]!UIYhyc[as\VIQZf(pۥ.J>₺[LB!J B!D)#]!(e$ !w!.B2iT~هQ86-(;qO߇PAnh|gZOZ+M/.iϙ|SxW f.G~ٟ4tk8uz0\F|1c:y^!!r#sOS7c6'|wՂ]Y&AWZ*B!J4jqM.nc>bcj ?H=y=g+o;]xvl|$oMM0R~`##v|8l%8 Z5jrqMD_,5gY;kl\5];S'C!<.Mg%\ #9--`E +7wr{to$0sؿT@FA*h';MRkj3JeˬE( B!J5.hnӇ @VUxve*Ö/~{ Wy߬=P8Ÿ{}Dk@jx|Sns9M[g#˖xN 8htn/\qk?Y&*yS0 y(((rj#yE*&'rPk̼Sάf8]ɄYH|e=c++ }Nwu_*WyzKc` ~PMWuGAf_^ԒË+ aK}9 6͉K~뢋5\3C~͊'h mUp5xFMずQi_>a >d\B ڪc02i*8 M(4141 T8MSUY@n5>|f.(*6XAUjSP l>|dXiT40/ Vӂb|oBUP LᏅOjh&.n8>KPS=Ӭ( {C9|'EQPīd+i` ybڳAu( xAA.6(TQ?N]5D,[gmM`64 Z̦?)mxIv[gn˲/wrG8;fߒ<=)FMc`H#∪Fjkڔrz0p컵/Ŀr SbT5 \\*9pR*!01 U)b(Yng1-`MLӁbX@Q0ѭ誎Ca`bⱪpb7 RLţbCUUMCS3UsqM&::Abo{M_(E A35ˊaT(Di(xTk'[V5X ^ {ڰ`5U0P1UL\nՍfqPN6l; 6 tno5hw?/gɟ 8Z̙3Ϗm[Q$kMGWg2~.UQ@Ս$( k+yAXSģ]$)8"HPNhz;n4U-fĎ (XL Ba;tm.7zdzOz׋ kьbSRhKy"eqvlut jxrH1K`g7\A1I @6UJdXeעRez4O0M!Ly(Qk|?Gа6*,*HP0-n [!L sn0(:).ħ+ @]f7ga`^I;HE aXF.e1<2v^WFי3Tۊ(}Gv)ޑ߮)[ ZKfRL$LjԩHő_2,ݙjWUʪb`QU]L&\8t|)'H0M0Lf0 ;;R"êL f0 Ew`djuKrqr=s݀%TQخFY\5עnp]S*I87N@~RsRph6 **jQN\Xsj]&I1_1=O9n&i(౺0>l׆[0LʧG&U+<p(64݂ @!ǖaV3a+YB͂'#Ӧ4t+ +92fڥ]2)k߿EqFPa'=Zx5~]*R˶6AǶ6MK9!gL>wDr<[o vZʂY)xGd=ӽ_u)Bxd*<٤G]s -w=Fy385cypwVr5[~R)IȖ\z1XRl(.6 I]'IIacΟ85'<ɔ9J9K88Lkv9d%/e[S;Eu[m`?NB2kY~<,u (bh.LDW|*x\S'x:izXL4 oI3o5iG5el(\஘$xr2c&Z*db˶ f5hͮL!N0Z86-%W@'L}pdpၔ5xuM`Odg5+7DKGYhyc[as\_Bq׬q۾};V\BfS[򚎺E'TRcGx hTN,'vrdaYidd$(X,V"\(f;ˡ̣Bt(מZUفhFNVY[LMxs8G%D&9tk ($ƑXIN", KmÉB".i9HvJQT7$eg:v'xO UEYv#R~=lDFGХF0\|g9.$AnB Gu{4சrj2ij%""{Po0tGv&-3,Å[3P*x+8y :s}ٛУزI[˼]zJ+{,IdvDE-6 %JXp+I1\gQ+QQ%<i 3#[-p3nIsKOiY{"k$"`6/ݤey6Y140Q7dΣT!Y4u:4]փ;xtr=j9HQ!{CnQ|f9IIHDڂaǝ7ҜKv@ /A[nZc *KY^ƌ rl ǂ/aϫ&a"z 6UGX}>ܞ,5R Fj.6~Oajbwj* ׃aq<몊q9g1~""#(D&jwg6,To6P=;gj]CiGI/S5 GW?@A&7}Yh7F݆j}*-15 W" B`IZ=Rh:ۑt0s#XN_ ΀`ԍbHBAQ>sIHrvv iҸ6l#<" ZlL}8NIX~ u7^ ԨIzM Ҝ(n,^ծXb"IIIos[V5vAmIM秄XN@X}b:ܓGK B&p8|bqam`0Ȁ0B2B(MΡ+ǓG #>zp:k־?#{r,tEw#!vpT \bye.b+'x#f9|X1C"D)wٙ@Y'Ͷ;0|&{caiM8JMaFLߚ^WO1~'odGd]Ni'^Z. c/"UUm@.LLu+M hl^f)s`ѴZ-m]:͇LJ'\5Klbs' %DL fJ*kF{ַCylnB*py`7FX#:t."6O[,n7ŀ1C;F($ aXP̕tكز$i#G{6t1!-}Gtp >O:]z/8qKg9Hj +4}E3]$IRݣgX<4CU9G|.yba6aaee 9fOo,-?G0<:s 9VO[7I7}^Y&=p[v]Ʃ WfQ<YuIt IDATLhHgAlFJ8,L!;,uAp~&I wSiRrJlX7B?ıeΜg #s-SɕHWrԆzYiQ̯&28'KXk#J`Md#?%|9.{o9㼔:tp>!<V915Ũ嶛o\+Oit#_N3>=Ax0L.zvt0S=Se|gzu l\Dw~wCGyރ˘_(Zm֌"2h0͚MV!ؖ^5Y3fј"7cjd2 h ,Ɂaδf ;2Y)תez{{Y}/"dgSc?a͟aunV@tF(MOѰiymGYW^)ȆD4`i:G2+t-֖\.\aN#8) ӔnL'RfCkŹ~M"306]U&43 4 kts. ZLrl 0ո,x)Y5Eۡ|_ܽ:1#gWx_>}- Ξu65&cС/H¸=ANQ)[ 7 sKsȴdu.p2ylI^FF.n9ȾHIY LR=\&|yG0)hAPŭ;:LWJBTrԅ²]$3Xq-SsI|3aP6S/}ZIH2jTʥ}&F @cqxvjPɇ c]˫vFy8O*^[R3#W}9;uOF{A':o:txxGS#4&k^[TTAowl7Vj~Q9];[If*6CCi 3 .w3t ˜oq"Aw܉'Dv"uQԉ,Uu@aVWX*34D F *FY_Њ4h&y49Ck1E KecH)H)q]UJU% /X=3U3 |a?!3Ҩ%#4%|m^|1dY j*nS;+ obx۶vPp]MFzQìK&'B`k~2Ιڣ{z{sӌfw jѥzFxg}'iNӸe(ΗP} tSQh. "9BjPp查ݥ?]guq..A|}:tT.A/8}4eX*IQWp񍩜I`60OQ rLBqv hNhj*-E:+<2lڽg(-Pͯ%LJ+Dv&_~J2O",,[tuIf43=Nhi^EDF\=|w9l#5o~ |?oo{m|xmK_9jWѧn7}nƋ!FsݻkFy#o?_aۋƻvۤL x¡,:CX1W@iRHR4MZZ@_)mDu}8J G˳h`lYlXS,ȭ0 .YX-9Y$J] 8vi&Wca֮ |`_HÌHY?֍IM1pe2 uċ9sQlJ0&nzOؔ'fM]a7dG&2Ң2Tu8J'pISԩKK4yJ<E*)V) H(JUQI-QZI sdim[83 %HSʓ*vvi_O(`E*Ho233KVgwzZh h?/%?9wrj_n4JݡK]?}8??׼-ſ}uxߵh]Ahys, )o9?f{?6]ikoNwp`y'UU>o#|7<7:t8 x OƩI'R vIS *j CmfpIz#djUo 7+Y-P TR9%͑;r?F3!HShNYTJE˜,,L%7J-[w'{%"wQsW\~k#q'"gK93]̩icn(,X.t4sŒID4Κ!v^x1;y\=n_e$Z~%ddXIAA0© {QTI5gp4T%T@Fة 2S;@q4q09BA0`UԖ-Fuhj'` Zd"jXډ 4{Oᕃdη+C@˻k\ERH!vQ!qGuP#\TN;Ō5N!TkqVߓxxT$*5Bȳ&Z gfF%Z+M,i9<+UVJyrV1u|͛|~Ŷlp/5Wp>ƺb7o?5⃫ezʒHgSgZ`j~*s9?#]eyˏ2HL b,B(RA AsM {~OV?񌼑c\M}>̛[\zO޺WcT]:ޡyݫL-c.)*pp[kak-TUBvpi.⧁K3!yJ $<ʾ>k"se^{,Gv3IV0<2:*q_H8LO_,&j Fa˵%aF:,HE %2lʎ^2i,X`fe޾T\LM&ߗG@p)fs4J<Pi3* Y_<>F>"nz'Sru`ӫasPЕD U=Ow:tlg80~l"\U*1SQTT bEi:6p C-0\EQt]ZZQl j&8}`ͣT4H4Mwel=͖k~2*@yO??A\-\•8{a?|7&]s=С/ ZO%Yv%J2S\%L MhWbR8R%ڟ"`a)>tb&ғJLZ-,hqXYY,B2! l^%ٜzڊz501@loaq8xaN9IAG%-:RƔ`d6h |ƲKfS2GP%f[ L)ɈQ>fNΰv]~AsBDKA7HRQUk˶^ჇX_P*՝ܙ9E$ ӗE5HNvdv")4o<箤Sqݏ$>sKΏ];kr^ȍO{t}xW|;wǶo㾧4xɟۧ?k_w+H[ރ{>ĽO}&~ G| 8(I#YO1LH)&n&j4B08P`֛;9MI__XHAVZ(EEQQD#-j(;֢mp7OVf説G /tk,ڳTrr-y8fpAR55\3۪E|_!x*ݒ4KcZ7C,Sa* 97GG&BSPʫ,a+Z.CH hi.0"AxHWAAB4WAquDH!iv1 @AE#k y[Ҝ<=4 qdHQWT6tI'p Ԣz?jpjю%O/~/Sw|}JJe?%f3q}p:t9"U7)6Ǹ-&d ѺgfCtD!W)<dqOYcaز_ZFd8E8堘UVuF)Ȳ/G5r}OM"F4 D\n2l%ֈpjFۅSѤСtJZ^ADLbgNsI 3"UP9hd, ׳/!*Jq- $h6,Z~I=B6m⚂/@il!ϊU.RqH)TlBAAxmKRE83@ϐ(N.6w\oޭifN™YkvX4+4U}HU`[ϐ s+.?/:T* w$WsA0xKyϟY/:tJAn] pֽ& I4e92&hMDmPMf/͸qi=^I,^n_|JV c;w5Hk$ȣDWN&)Nֳ<8ȼ6?¸8YYa׆1BDi]N}erj cdqvJP%dC>G%S~5 Hi~ď|Tko i|JMh?h+WH 讠_"X'$iNf  X> ~CR5[DX%e• (O(lGܟ?/@:t? <`OtsiVE^>%HfRlKL>͌2@ BDAF O<~PP$V@GI2bA}gf$O$aczNbyiH5#s8(Q'†u$$sǑ-sb6}7K&'1q_SG&H^"_'8qb*Wxb An&D,Tz*7&cEEhqW=tGq]<0Yxˈ *XJN 4)Hi6F]D/M~}/yD]  ,f?+%.H$A1Pd[er,=/^-h4Ph,?Dzm*2>j3BKxh| bϡg*āC/oX P5]erH/ LΞfzjSO6fx$ɖM[HG2̌ҬJrFF>oк"KeټS噟BkhA55TBrЖ 8~p}?y.!8 j@tECx(8˧X} x8xUETB(v]FaNpzDINY)1.E5Ѐ$KmqM:(h R1Eyԅ}m㡻P!&fIdb)B XTA\8G^sl* /L*;֑FqOO ݭ!6my:Ǚ ^Ǵ,.X#&Օ &u JSi0C-bGa;!!g ЋXKW$I]P 6dj㇏3j ,,\2Ծ%GrhR45 P9h `U\s9CHA HL~n{?o:ޡC&Uz?D#R[PllS,e,zԧZx/hjQ$Πơy\]Ŋ1C(#r7il&Iq6Ĕ3RTm\סih.2衤U1>Bgc{X+Q OA*NJ Qؔ̑1ʁ"+Yal-'OD75Ht:[P6>[O!S1YDwfj4LV}p Z>*uƋGWxxH<.vM5qJo:Ǟx 7nLN}ϻ9OOʄNP<}-S]󫸔·oUڧKr4Y?[O͟gD6?̖Ow'ѡH!QBB G'"Xձr$p;O`2=Pvq6c@lP\ lpR|NCKlZdY.瓔K)x=*%6giZEz(DU bWҧlEWI_Gp0$6b#:]"oGT Or"z]\F lEm{8N DE-< G ~i>ikx P- KSϚܤ~IQ]ѤV&nbOu 4'wOBA.@HD#Ay.Ta_a2pxKNP)Dz_>8ϖ>^:7}꣼vwv\~?&=~:7Bi"1(.0Me5_g1Y4;HWCC(!<$HА5N#o"sIn;Lf$ fKi>6;NPKe5|cHаJPue'u| Bi*RH تj wunTiXQTh l)PFR} EBEH(ZH=P@@a7+zNDu\jjRŔ'u%!'vSO7i:LO`s0ƌ4Ѥ+Z<4q`ZQT?ܴ<{ ;BW)/{Rb ·/Wu&5xoVRm34E:|Vd㫿w-g%v/c?ffo@vjWT Xx 4(~|(UC#%<UJ\KH@  $A@ Er@"s mSvxA0J/Y5ζ=+XB WHiÏ)(H%^Bf6ظ-Tlĉ*!J> [:§!=T@{n[ k*ԞVM^&Ϯ WD۟] Ux)LGAw;nMDShEz*<E yvYE6O@@utQDxxp:4T+4D<+nb L^/ Rԉe'1iqꖯ29p]kU7t}=* -J&j]~I/1q8zwd|Cw~-ʵ1]box.%~>&xӇxIW-١CPxV-a4)̑ P)llEYŶW/"=Jzxm%'(Y_1 E,, C MT8~\Aj A{Q!] WYE(T-Nn?)⸞alU #ٴ>WS{낢9sӑ UpIL Dyb~kDNn?f֯|w~;̯o1.bj֫Xi]QF{kHA)<}V]rsw>7_Ɛ'ĭ,xC7?wd6_|k}٩6)6 (>p-ϼĆt:y%8!Bc k#'rQU{.s$0P]$F,݇ ᩻~os(wcA],t \H!c LxQFQU44[% djd:Z 1D-8%;2ѼxEe1B &SHIxI o]I* ;t;HǞYɺDO8]볺HZ.6;/o$Q҅ R'ǣ5!B6.;l8GȮwGawɓ]k ;7_&`ms2 AsTh o9$ZԜ{#7&~- r7]%K}bئ z DV`F`3,|k La9xDʂtE&sVV/^MAtL9PDdV@$sq.SnfNVEHf==Kn >f{͵YR&c*Xp$XM$N4n[i^gT70i+1}t t ǟkajGn!c`U-0p3W$$=(, J1fZo 8t)c fΉ̋H.[$8 F1?wf IEmm7S'+֬R)=zb!G]]XZُv#57~ dGF8>|_}.&ghsg{)Www2`_S772}هOLF]"d D AY 4#|Zt`*n"Du.uk8||]AMsh\Q::S^^W7/"a*\E>m=XG17X:IRC(C Ɩ1"0HDWETUӸg- YG&\Z/*Fc 31%j$j5!glu S׃V `tс *m J@w}\q@ ѭ+4,\,_}v-C$U(8!Rh7\pٹl^ó͇rϯk,Fb ꒓(* @OKi+f;~-C1 .dq7'PI4IҌϵܙ)M듴ċN5O?.SF)l9GM@8vX1s RԷpjᡇ1ztC˘'[53/fvX[%&Z+yqil$|kG~FoG93\vd,Iаr:QHa6aUٰnxAF<Ȝ g8}<[QL!tNq"C YIR(e-(L68& `*[_pRq@s] RT,D/:K›Xr-$UOJ2KYM8o6rpJhi{a&5;16w=RB0+سd1EAڢ<7wQ7 ` iG1g^JlofKC'̳po{@{m6c5{$|&D >Eq w':znmp*cIBhb,au# Cjn"{KSܘKCs#Pv2MRtΖ%B8m->dAH,uYdIBϼh3֚!E :wI'Pc !䁎]𺑌+a.@ i+떶vD%pQ4&K[HA9c[ jr8-%Jb]L2trA`GqF:ҋZq rfxm.rM X\CH' A"34a&PJ RqϖȄѝ @8f$EB@Zhme)A ZcBɱRD7a36&J]D?~ Xv=NMzec%3fl|P^QIPӓ%iv2z>Y|ҋ؂ d y9/F@HKAGGoEqN.XƅW8(w'g27cF p 8(f;-5IRĻHÕ 0[pq et(($Nl21\-cWȫ@3/mc[s}r?ߊ݀S{Y,FH]q]bl[m L7g=)6Otr9c7$ݶ+b 6SLT3/ҦOK~p#P Bqv`[;iʇM!%ư"`hB-S& -FJBAL$$'I9 &OJRs.eԠ /XĖbC\xx-G!lMu8KM8v \,z q>b$pp B ]EPP-OXJ; r(HsIT ^rS 21b||_ea´r syu2bTE9b^D%ěa3GOchNo3I"ֶ3[͠2:{Xw)KqGjcgs2`\ވ/>{)k}ߜDS<)DG\:g1߿k{_F]?6:/~(L  ң9\q) #GS.\}[ fάE' IDAT0v=[z5SzZR?>N1MWh!0xq1EBk hk2Y>4 Ci &&@2Mh %@# hE}j]"i)$qHm]pkHρ"W\m$&z?Ei *8xuB"Q)VXBh) L[/ ];Gje葂`Qh ‡K!kڋdPHW9./EkȟS+wh[7 0p:F<{M\piOnZf0F+i4 hq`HP}~gu3v|0Us__gqdz=/5*}?7v=ʅ>['lzv~x1Y8/\_6w]3Ͼ[OI3K?Qd;UUm.w`IѱAnã9 "DpՇ/m[@!^uS <^ɳï/9 "XLg`BaeCCi03ϙLl֋㽭t0?LNٿWﲡ+(  &{'g^gVȵ{7+?crUSI2U,Ó+- 0jbV+IBU#SaoqœDkQ'4HLRmh!‡4R؀Bh/D o\bHTh)2IOv~a(wnei'f( WM/ rRg|=jBk0 %MHhؿ J&g PK贋4M@`;0\ 40=-J\JHiRWGgLjZhB3q#"yHғT,~j_q3t2ﯿ+~O2-G9FqX~+>bwo%K27m~ͷ~>c:)BÌ۹7WyL΍14Ѥweg]uD, }v+_";mOߵbM/ò%7ĶH˿ǃ|WR^c7^c<w3[ܾe ^~=Sϻ_> ̈́KꅬINߜF#\ˆ}+ϩBn}[nVO䁯 o2e&&_Jź]Ix\:[`\Ƙ;JccWdbQ}]pDp~\°9t6tAhU?қ/8/3&tRϐR(h)Q()lay+I%wCNW r lSg1ob RTQgL[ ^w&q0nȕk.+-Q2)GRf@] d{mξ=W3)Ac{t'M=W7IkcdTt<S+M`$W\:3~"u[UaN|sJDOb<޵k9IT02W.~'ʑ#|po/毤㫃(OfhnOJ Sfx|s@|` {낣w菐񇤉|_?Τ.b?gS¬kH'l{'h©`QE|^MәEȨ5}~:_JLz5iCkWոgկ=Y{ =^'wL+!1j?+ܗ^˩_Qu8HZ͎Cugpu^f7Q, _7EY 2wtuy<879̳9ԩT.JRiwr˶C#(#<3s™g",Ӵ^O~QܾEw%i^.k$G YWI4ugE%AX%oP{vz9==3U\cwOcPֈ.˿9̓_dҞ%HvĮ3[Rg*ۓ}A.H AM=. x No{uլ{Nc? \oz?^; X d?ۯޯ@Ϯ~l M?:Pl]M-B~͟hx|H2#R} Đݽ4ZCsÙXP$COO?ʃ_O#{s{m 3wo#/Iߞ6_Pa_n(ff!L WsM Zy/B L J}TR.wr{nƞr(w?<䀛ugx᭤=Ӹ>wٻw3P4ߛح-Cu~}\3HSv}>+&I{jc64&A)ߵrߴ?PC nWg\FR=`U2jj;R27}J:rem==݇rV@z먡Y`'\t=vYM"DgݕLoK^9K?Gur㼴IS4ʪx5\ˢ`hvr 7'>jEe/+hCX_lj}|gM{f+QeBW B!3 #! b)eWkSgfko#Wov2 6Ybg֋C)?޶>{(Wd:}7@| $ w'WN)'6avMQD ArH9jw?~F+ul\pWw]ϝ7P6l2#U?NnGՌ(Of{/ʙrH G~ VfXL;f?M;]<ɯ 2iZ9ֳ?­(.WMø?LU2)6#4o6nQȐA=Eӿc2\_?rW> ACҶ1>>nֽWzn]N 1 L@ŶJg0fɒS&BOSEs*_̒ʁ.ˁIo _[?!!VZEiM|<m53"n\,YoZFJ8OBJVH[Xc4*gWr7٨,K,Y>Ek"J ,sbog2݌ \|\nG,*]aD_v>wj_BK1.cZPmm/,pu@濿Ku{t&x{Ϗ-^'L3e4| 6(Snt {c.ܳdɒ?N{ɅҸ>e`/7ҵ'S ^PgHuE)lP~OZ RM TT0hP-).8mkg Dt} w/ֺ[&^',)4NG<9ZXF'CoV8\PʓFV&PQ6I}!p%^yWc}(Djnf_hD pϒ%˧F&8N¡$r$~[![mK >[):RH#LGhb_َJ{IXDPqX L:cw#e- ^w:&Z[Ih7ћemmhۗVJ͐_ (O> o5 298GrX2UM679U&5,BA2@m`>ʫ92sXqX2 ^phd{,Y>=7ҽp9N{3)"NBkS,'} ywHKI2-<ǏrH*%hiHM B|~~b (ek^v;D4]^T[_ K]4*@M"BYt6v3WXr[P3)SK`v3z4tGtvwvpPV`Q\-1MA*Xn; XGg//G(%BB -vݯdYdPRd=;zĆX _BK-^(-]-h2L2̍`\FFF,O < twӯ3/ؼ9v*WlkKߧBmPZ[:\\ \G#M4tul0L˺'KqMץE vz,dd:dRYW` 1iJ1TZƎ-[qje(q߽mP.,]G| Eȑ\/p\\Lr*֯_nj9 U)bx{n}pǝt /B)ZОמ]{Zg{,Y>5$,]U5HI5f"Lwh%PJ:ǁ"r0 򩨩`@܀婡%D/ {oOiYmIWwM2d~6O*@.],^}1#sDyWxYwSW7CθG<'C:<~߼JpO[&%%%^~ss/Klۺ(-77^vul./_ʕ+I$1ÇS^^aMѸ?u33ge [l^CE(Ŕ1# F2Y4H¼MuH CX!̀$G̯\`0 B3k,&L7Y; ,Y|j9B(F0>!BQ%& "SF+77^%hokcPmN:ߏaN;454a+>PP;ާyQ]9t=5e[9$pHiд=,z1[) m 2A]q g5d2Ŗ-l4zp[vMHeYP It*J(R`y0fC xk*f,)S*.t1F9>h`9u`Xt~6Qߊen%cR2QWnTRrx5Fv݊Hvi=2O"E@*?[[ 6,gÂ-Yu/q nM9lf]Qe) 18IcB0X15 LkK;I۰\~<BDYdԐhlaB4'u %M 'hЮm B 2$ X~qOX:;I뙉b[ 1$I?Xl mK |>RZb6ۋ}w9SP{l[%ȱ<ݔUGmu-nj n|%UQhuU#|`ɊFc厣 " |et󖮦# ɱ>Nn|Ar#9|RcбavtGMt+t6Ƙx؅#UsLѐo,IaŠS3XHc:JH!ukrod|㳧qХ‡g䔓0y%R62I MͨO(w f AÏƑHȔ-\LWo!ҒV82]ŲU 0Z{^Ǎpϒ%˧C+t1i(.nJ+˗/cܹLu49".aPdžKy9dV T.ե|ϱm{.{Q0G}]‘;` rRvйNp8M>& "u!:M[p.dt;x ,Y|j=F 6Ҙ@H- !Lw غ&TBgV d=O=4&J٘J7-|Щ>t@Wg8R@1JhOlbboSTd7=1t}PG򷱢;{H9;} Ӛpy7ܳNa@p\kc-[O| 6̖NEnHRemiD*S A5ww!Aʅۉjgӊ4X[S6)GICЉIZ5S׊?'h!Y iiONt6cwb{e)>NTmh'~ۢo/q&i 7N#"p$S,/L週v6e\Mـ d+LIrxJ^F`ap?~d{,Y>5FZ`~X>rF\\HТ?ۋʦ͛  nEsiH)`y 5b, 1N'1B%脢ihh݌aIjOuB413a|;6.ak:yXߞ FBFA\Nk6"mm 0aR BH I ޽fV 6z KWa)J7b&R)†F8ZP*5fGQ^C4h_8[dARJ)rA"Q$v4"]De[q?XNLɑP "CX*!I*"іШtt\ec] 4, bjIV$zt99Ի6ӊū_Ü~ F!Y%K,c4xtF-v!)mFKPn\a(V.^{UƏm8>Aqxq#9楼/? rJ1utk18~2EEz%*WR;t(7p&6݂%S]1Sj(8\C&q"pȋ&Ie`ͱNbM:c~rr Ap )n +lѴk Ll_!f!)'ht-XnФGz[Ӷ}.`ď#$?tM5VjE$ %EHvakkiP=$ HĢbL!V."h&S).As[('QZ{(ɮsË:鞌f4(F1XhQJmёwWZ+yeɇHH R 0H`09uOt_5)K.sN;w~C鐬Y$5gW2T<0ȸM)6i% 9 aoKs4#ܤQ`B"Z0^J& Ae;VWv eZ=ɠ\ UJ!3I12A9. ;vNk0y jl^T 6#}P!k.=:x).(SCFaaםQqEC{C- %TxytŽK. gq$ց\5T"dXi?Y$Mx?~/7z"4X#\z$}_~l/SmE,]­o ݬ&]W*>I6XY|G>žK)7Ƚq}la$\ǽVcX5`|R h/VX_PC$Dr[&ARus7ҎXLfQ'`EH}FNf8W%<$2տopf$mup+2Kʹ|"OY[e͖gÄۉ)qaF'-HD\xί00o@l]aPJukwО*PiM57M2z>\2./ u5+]t% 'rcm V+jAL[D^D8ɚ2K)Gξ? Ս7  +!Z_w̽K?/sjcaY#|BрjC\64yO1c`zvkf_"&90^U&#TXWEЎ "cM SNr쩣  zGKNV7+gYc@ AH$醣D/0XL MzU;?-I/kys<_ BHZbA(Yp$B02PrB@<VnN;i0؛sTE9Pa"hQ/Γ$851yL^s99>g.M͆ST*}Da!x.]\3ث9՘pD Ta(љ{iHsfO?3lR1/.v068" 5{eԪ[=u|cQ}(W:Ip@ 2gY:sF; vP( )k7B`QCֿY+#[:&׽AZk+8:Oo΃hI b2dY oO<|tuï;Y˱aխ6 R0ƁqnTcب*&ri )d"pґ<hNAYuJ@R:ldXZ[a·8NXrʼn0vvg#Ҁ;6m=? {O7IX;T/6aʃ@p=fi)"{uXp6gi~PKah ;pTwuҥ!p.9hKn MIEp2]'*ֺ*39C9y$ ]i֢ݪqܱ? J ,U+C .]:ev{.& `IBI7ʻ[8cGjl56OMocijIg`=-Kr#+Ad+$*R`%fD 5%b!P8_k,"C彼2۶9k;u| :EأQW2K]`^,xT`On y XQ)<ط?Kx'#L leMyvlpzs[nvCiBPx$5ۇPة\5yFWܻtr _. G!)~)5#79qWIjS$2EBE,W|3_w?;vF),o} fkF"sv1}+|G[\C!Y4NIws-7o}R?_" xu!sj䐧XvOvyjrt4 5y@JEX@80rW/;uo_ĈWd)-2g/Kǿ ~IN^H .XbXa1b-.mعBXƸ}Z1X2(Ҷ=d',MH em.*aHMgf k\jgsT89.]\Stf0tPy pڐsrJT+gh2VXJdXO05m{֛Qhl"p'߉#t:`Ge1cG9~K8a|QY?xXh$XIȅG0̱_!%q4!D )5BKgj$.W @JB* ,MqK}@)rs""J>hsrs8mҬ7PN11R\Bљ"Q߬Ѽ8'P)]ԸXB?c¨Ih"4R5<<ًS9;f.>zFH@u2-wŽK.FHj@tEL"-5pqvXB!m-l5hy@#b5Y:N'y-T&eZNc/<XElJnڿc߿qG3xz<%i5<rsdİ+~($iNOɒ}!fpjriIfC/,IP>}HNr/q"8 KI R-1^\% оDJ1( M8hZcR$q Bx. yq"m$h!)=N^EK\=F%8.Q˪9dnym2\~?.GZE&zb6Gn&m&a)cwщEHt,ht|Wܻtr &!o=D%}$ASbg|)I[==+MzѢKWGmƆw0X~%.ZBZl.#`y]#֛(j y!`moxN.z\4iCZe󏰱 Lo!7(鮐9^%G  6a#G l\8# +l\y)mVȼtIY - R.v|Mc+$E2#>{ 2c&yD \k8$409AQh3(T lPF!F8Mɳ:yVҮ@E| iY3Kk7"}#7rxB#K.d>Z@Oa}{):a[CT=1;(z}tJฺV.]tb]\&if6e#x:ZGx)BXKL:;S^Mf8Eʈ֥˴ڋdlٕ[)RY \a`D/ Lo}#)Ce]h7`~nA+R'x Gh2bmPC DMIish ZNoQB#D&[ c&0=!.08Z ) "NP(!yGlt O:V䈬3-@9/rȶ(M"9j 3dujڇL3 4NzgNrF3`zI\c] X\$qr4Ih瘟TVm34܃b¸%C-B&1.Jl6fCfmjR-sX lY&0My3~Z y(]qR9NiïY `'@X\Fpv 85)(ѐu_q͜7-A{1UeLWܻtrpGoqeF.D 11c,ƶ ch'D  %.n8tqa =%IC 4e.XR !&8~v޺xn1"Ok`r!7dZ"B)}hً:[~#fH-VGujOr`J8A>u\-8RZ͌`FGZ/WޥKkx[k[4[ d8!h,QU.ϒ# Qͮ=-;VR'mA\>I O!6k:?{ C B-+<.\8p ]cZd/+ \|S#1/7yՆt>FOe[\P(d(aP>;O79~\ IRK|2 ZEtd!S!H(l!y+%f.#Rub{H!394)͖#,C;C 3݄zBhc"dS1 Ȕϋ;"z`%G+zI!O'ϱ0Zk$m[i,Omgw#\P B|')UNcWJtŽK. [piL4Iu,!o{dbUږasާ;]Ln?é?~7-R=(2n{#[|rx/&'yD@1Y©jTL l?͞CJF)ҿ́;\M\,gi'-Z6rHSR)ȴD')(FL_`p092: 'ZVd&dv"ZDD~DJ*c(c:/g{.]W \pMf ^xӘh㯧v}cT# Ӎ?ިyS)3'mp>ʼn#rmIk뇞G.+zQ>YFhX\lq 6Ϟay= 'uXjβ4C4M(gQX6| NamD11v{^s/F8cGYY}ҴV75)zzna\OZZBl/voᨇMX(H~?,ƛ$E6/ hC{`h+>sLAIQΒ[Z d!J)&Bʠ e q~VV9qf/^%IH)ɲ2-묵-RHUL[bhraRtl;:/GޥKk guס8XO/!չ|sc$ 3˼1jqoOS n%<㳾;z _WOep(Ӏ%t8ζ;Hg5?|yj6WxIe`C{3?`n |a>X 3uRI$k!V2|i% i.iB6/XJν{(I?E&fR BՉaE`s׳6RPdYXR(bu7v^޸-, |/T9tȯS7+Elȕ 0EJc2V C@ 2DHKamg.{a& wXLfji;nx6ŋ.h.BhL@ږosbHP\,GWܻtr pa8&iqb|,MYq{rkl!>Mr}'?86Rn?,pya,orBV'e~qQVsFF{`_~Vھ‰KLk $m/ʇӏ}%=#G, g?̙|H/'^ɷ)2˩7㋟_[ĉAx]÷mT{7RO<2K/|?ӼD?i~헿Ƣd|h'|x,|)# q:O9Ǖ+ =8|ӫ8{nOrÃ۸taģgh-ϭÏ^'?ʟ~lv <OywЃ_%g$kX<;_.9.<9}}=ٳg=On.K\rZožCw;O.ZF@M`Rё&}9l5hhe63VI~_7;~䵬n,OɟW -{oa&F={/#~/ڽ{~'w|OK.e4#ccbs}O?ϟ~9s︉}٧yo!uy?|ǛnseµhZ*; 3sq"ɽ?g.vU7O< Vf0$3ެrzsg l !~1kk)+!|lm7@HEn$E .?ˉOQm{,\du.Μfha&v18ރspϕ*3sX۠ؼʥ9BʁS$i™H}r7S;[dia4 Ã%{H|/]9qlM7DQqv^G}kgȶH[47 j5<2gd0FٽB78gπtӧQv^V7g9u)Gl4.|=F 0Llgb|/0=;OO۷bu%|80} !°ǟ`rre57E_W&!>c=+}tro~Co[;}4yLZ, `,bN_dң'ݔ )Ү-T&5ʸ,e)0RM#JCu :"9I}ռY]!6>2nEܑպGsA 6%,,00=p3lJNdpl ) Ұ12AJ9 2^JڪH˫0 ~1S3'_uF'~ᇾȃm~wmkӄVJ,dpGiKPZ#\ln!M=o uV;nyCdYF%lmm19uܿUW~[ҥ˵ Qe䢆LImF'w=}rc2v9^\P* F^$ 2}SfnP %OwKs|OO x#[xr !Rpz {KD(evMH!hӪ[v ԁÐF#!+`J`=Ha(5Ÿfdf8-Qq :{)lv ,v Q2V`?b'F$00,* aOp$VR!k=zFIMʝwEt)؜BNq2 78G-R 311N_o?HRX"S"7%YEQDž%ߤ+]tfR="aBhs )e1 -i~ q"=C/jv: C4 RA Ct8x`/Z5^3ZcAkTpdHh454M `NJ,q^9 ,R@9LYrqCp;E *!]t-$!f`(R0PG:E:kH$D\ʑq$FP>B:D^yz=y1֢%k`:dZ*8ĺ OE%fP2?APD)Y;w^.p.G PJ a;mh.(=@WLȳ6iH!@H"X m Z]˕wAXp︊ (H+ѓBbE# ~G&%kۥ^^Ut1)_{oiZm|'c! C:$U!N;^ o^#xI_ڤ(P2$w'3P9P :>8= %Vi8e ya]=A wuygeAmmNn9RzY ' 8(2VKT+W}߿tŽK.P+ ;FXgHк[_|mP(A^'c6J)<ϻZZ-|g``8'"#( A*K -SCNY:U $B P& t9J8(+ Nb«N8/S \ cΨ=Hp&a.G K($_@yA;7;l6q6C{Z*9!:U)EǓ{5ﻨHWܻtr bxu.@IE\wݘD" TO"_- i~ Z'9$ߏ+\ٗ_y^xyI~ժ,?jA G3G w#cj69):oؐAڝ|DF5g{ɮ6\XjҮ {{@ݦ7j| ? h>zޖl&cy^4R\'_=s k)/@UM:G?C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C2;)C25'+~2wϚ}`(H!H!H~ϖ4صc{@ @ @ @ @ @ @ @ @vleB!H!H!H~_ TsN߮];w[ι{1F5556lF癒>Go*pGq-Uhr47Ș\|gbk::?7x]--\U@%:ʯ5mZ5県1reC%~lT8 ;C}}&O64jԁ]'`$ι괿׮-e~I na/)A[&P[&h}ZZDUk_kHs߭¡4 Zk%GƏ1Fuu}nZ*QkwT2ڸ5 kǸ14-hbkdFA6u*pGɅCR 9ъbYu|nXS .-~ Ժ?<l]3N֍Ը9M`$U'n(Nyɠ]nT׬ޡc?/,nӁx Zt=l{Z2my%wWt'k_ՉKSmؾ*pGqE=p8K8rIE׮gR )g#ͺ135Ay&M=yZyֵ߽Q[?/]zֻ&}2]8ںf}ՍNL$wNY$WRo ɌK KNS.8Uܦˎ٢ۗmu2@%:ֆŗ=\\T6?0ϰ7R=iSٿc?ؠ?>]C-t6e4K3lKGSiw%Hz:ٹSfkfL8WTYΞږ8&s%ƽx=zIe@Dڲ"rݱ'R-Sfb]p:]׏׿'.UNVݠZ)OJ"QuuF3YT*1t֪XڤWBqmԪu[u&ikjꤋԭIʌh!s&3Zx.IrZװ'뢣?)G+λ[+}H?^GNj7:w<2mu;Ԇ#j}?hv8pAceUZ uEu,xwV޳Y?5=ȹawgЋom\<~ Zj Tg/ ?V?k}rm=mܳob3q1/>7'#}f}OZuS|YkR~ȃQ}aO(<+ZfλZQ ͚^lE֗S3}̮;S'x؅۶I^Ժ`݃XkwTpvqa.v$K -9lAxvUa=u5T Kzjs5PI;NMM٫!C91& !I.wiTxJWx)sy^^{{6oTr5Nsڹ}y,Ժr*pG7n6{q*FHæX qz_©?) IDATxwxUnz!!!H*M A+( D$6@Pi3,dl p;;Ιs$@APx!9iGf0?^ #2N>˵;Mv5JHBp-gS8aVZF6W Tv `k<*q$̊.ILݟ|/t#x{닛Z֮X+lvr$YEAe%Nm*Z[XM6fmǜ>۬rϮ8>OY=6s;mf<cnX_;$H1-"ŎAo^ǨUhpvv~H_EQ2e~_v!EK~SB s'BE ''UZm#k@ (,kllHCV[dP-B۪U+ӧ+WL6m0LV1e!nyaPA.eJ=xoT?<`=5һ'o'|ier-рgyoqNo1f}u97 eE{slԦ7b5'' ٹLqmbceA$}QU  FY!9ɄOg@-͚d[ f)DyOmZMm`%B$ֶٙ<̆4TNd+ǎի*~:+͛7V٨ϱl-[6:,NW F=2LӆH@\Lӣ2&=r*֥pQUmU:|fN5P wy:.5vcu((&=f$I٨X]ťD%A'ϊ>.fOذguW JEȯgcxK~'43:L'">>WWLBT!cY\Y:7,'N`DEELʕfҥ;ի]6gZ޲e ?s65jD&Ma9I+jrt w'3ʨo! xB@MѺN4f6%pK^+cKWoW`K]wTG6dWPLd1yP F:POTx54-KՐ qjƘŅ#]6&F>)Fu\lZ.:@Px>3Ie:ғmϵkרZ*/"[ѣ\7ow^/*c6eh4HRRR6C1ip:,"4Hը#Wz f3oՙR]EhHMgѹy/`_o0-͵A?$cy[{)#2F6 ӹ"vϴ/pUmF ԟ`w SR̭q|*.ggg%/}]$dvMn^8NJ2u vn!LH[  O5kLdΜ9@ip3z* +|NFSKhj5.nfCa2<_/rhg-;R$5 ͆4+e5eiu"R#1d0j5\Ӓp2gCr7.%^NYf@@ ?eʖ6P$֊Pb'%QQEQ=TPby2 S~{2җb6fdNY5c &ڿ >TRR,$wn'i 6癑Mz TVkIWzÎ/Y3l:ftB!cj%,bSBJ-3jK2Vv".IѠ+mNZk"%M'(l2b0(t:Z9Z,F@Ph|}}yeKwXZÔ{d J!%"}J"׎&5J&Oz.۷IJCJJ Tx,ěKI2ox'''[G@ wx{yeJvkAs3v]Py"bfҤIf.3J @dd=3J LA2s@ rM Q&+,P9.b-%DDD3g,i3˗/.gΗ`  Cls?Ʋgai.]p^&BhAA.b-%%vLbz(u;wMQ90 mJ|bxO)G %99^Rؽ{7]v-i3s)v]?b$w^/һu %m`ѩݘ*[VuϑC;ާ j%}#{AL/nڴ)Gtlٲe5jT>jO#ky!'>6*Ͷ5ӽ+J̚);?9YQg},cDzTk6%m+NBNJz6ì؊=A/X32Cikl[Q0뽢Tͬɱ?Nz-3PVFt.ᠢ\Ixǫм\HUz'-![Sx q߼\ Ou_^*/[އq6GCZ]0sT[*j2 ^Sz3In=5^^b b!oJsfۊ^;wUwjrM.ތd4s"8} O9& Yȷ1 zps(Nُ0j ~}9I:Nd{ Ttf7s2O&UE)˼XЩ\4${ ~.":.ySۨ4VA~@9-JA>"LOcwK~/3O/<ҩ֨cX@$ #7Xś?_DשnV=Z$юON_aV3zӄeC0oJsmY;y.z R>Olݤˢ4TbrMij&5iX׋@Ug,܋i<֮ u+h1u ĎwY+/wTUV9z 4ldП;P4n%ϸlzYZ64E_P,68CW9ɶS7urrhC KaJΒelxZ;ԉl.6r)s-bF8oVl\ݛ*%ÿP:Zpv.}\~blZ5_k\|NS}b\O%xE+yUUK)[zI%R}De  O AAׯ9Sqe\>6=l AclE{ٌ02jLeN"^[_.Ử/8+xg^VHNg*Ƞ^S;^wfFƯ;#Tq m| :P&?<Z2xZy`ƿq!6 3%N'jBt}`&v[ ^:yIN9si^ΐRG3l'Jif5og6|L oc]m,Sns){QWʪ/9v6~Uj7t"5CAJTߖsP?җO>C_jIA6]iӦ`}`|B˭ۻcô`޻GtGV3}$,{xw]%~^簽Z^ z7_? W9a○&`ޭ; d;8@Xk$@=jZ |>LRBݤuÛ2s*ak$=u4o k_~~!v;Qax= \,uT^+X.s 1j4|gaDھ_-ЦpO6tbLPKAərUkFS%U3g fS!x$4.9?Dd qtp3L5BhkPTB셖/3iJ#'\w4>Mcq[0qqoC^"\R :F. oeڿM[6|lSn|<_n?LܾM\~t6v}Þu(?r5\WK;m:Q%:#s6iѤ:oDꁝJΟQrx$}:LFN9ŚYlش9ݓkm|&HTm2O7k\EP85K ?atL_.j'ۢ,- ߐ@<(S#^==TD,DT )|e9p:ֺ4$3՝wtDx/.PשYobWޘ_hmmHOѮkSI<7eƽ>2a,3YՍS"hmgl:Q%5g4Z(}m5]_fwԍbiE1Ҏ0'Oڂw?i>5z4;o<s0/ *0w e4m,eUBc8rPJ#Ne}| /.O[#KO^?Oc*o='ŝoGuyO.4IЙiwfZ>|`b]/fF{yd ځJtVe9br-ǧpZ+˻M;g=ڷ3t]ҩ 8<2O3QK~1/c:89MPUxr w4tuS'$W㋋<71ν.=`juɓFf(G#̫ 9׭yzҺ]sT5ܴx uJXUUź5ٟ5Kn!R0濓o.v+j  *. q,kb=CTJUiGM;1Q\1TvMiv q/D¹MH_%q[2WO[υ1əMO IDATΩUb蹰+or@Vfzo;;-< M?9 dˡRrE]u~IFmsBrly;_FI; ' *kseضd;TlӋz{XC z.B dPVG?N+ 2gNc=͓Ip&'wBUb 5rϿY%v}{.jW] -! kXsr?*×ro<ɡ,9v6ƦtO`O"F[r{~"V,;ZTVuƇp"Wv|ʱgSnGB$6J|k~[2gxspuŧLUZxV9^Glal^$ĬI_Sm{֬} 4U!9pܛV ds?_+T5Zm*;1#;6zt~2[?Sץ [/9{-|g ]eT5ߖuGF2A}ʾP8I[Heѧ3o,a͋_A~Ws߷/qbMx0 t۵]1@ 9Q/M.ɧXg]ς> eYзwڟ&3d#3æTN6d sۄO4,zLf߬#M?u%zH,U[3x4T mB~ޔj>52}n&qnosx􏌡YEs $`fvJ0]y7{v ˀzc+Q_PgA1ƬXhwdxҺ-`ӁG`+ϋՋS|h9a>c˚@SJsq*TX~W7/`䢹<}o֍\Y+eh:ӃSsA^!D>]2#ʔW8~!8e"## -ui x 3k1(*Y3[[]_C6y_=kPm7s0=6{-%ܫ[tҥدSٳ.s%>s̙gBw_ɞ;4.WKJ Wя=D?؇Qf+2]2]Vvyce|x-!1qt\& "f]2#~%M^k삇I!J-@ F:BCC_`aA KSfۊ^YT (iuhh(TT^Sj:t(%m@ 9@ r G6q@ <8,˖-+vcQF7!O#OJCp>dM'~ ?4feNG8p@I (e\|HaٲevŹ&A#燣[8СCK A)cԫWzϞ='""BDQV3ӳM2&L h޼9[ne̙gBAވȁX运mSm*C-KPtgC.] <*bѩݘPKH. "*g4Tlޑ>eϋ+"f@ )u@@9@¥ll;N:bHd~t2KGG~WzV1: n4MT;G3JTm>Ɓ>O/g O]'1 iÈr̟k2l_7V[;=[9B!bE8 rm۶%vkzk~цt3 n4h}g\vn[!M2^@/ӵ ʊ]X:f4ug{ROl=d>Wrkʤ 9 77ΎE+#s߳ȍ"Pھdr\0~:,h9"ZaUW.1.5k3)W/7QU덿6Ӕ-x%3rL‰gqDxM=㶬Y|$3GuPvJ/ձu<].lC<֙ECYɕJq7*3{rɣ KTJO蜑l=o5Gm>Dls37f“TTAYykw(39FHGp^- .>X_g=>%|khtx~wֳ$^ըUӀ&%}:jΙLrEoG+K=PGPNY&7M}֦㰹,5@JߜVnK&hD8ՎMyjt#[P)|U2oZ֬x 0D"*ޔ醛g&WQVvJXxM`)}ˊ*Q~]@huRZ.E#u0_n7crunI 9Q& ]&9B$r`T{=.ǓR8܇Q֪|:q~+ޑQ8d IDpP0(և;O_`sզ2_;):A&:쬚8((UCP }y;7F9T}8ƢF ߼d&_y|ʷgXg,C8Y0%\'ŽUxvN9i;ʙG#5ępO v3RI}ؑը*nM:P:p؈$<6=l Acle7楬 M|bgUz'-![Sx_<Ꜩm.˻ 2HbOg:ԪV+'UcjGaA8rRELgE̳au={Y|h9a>cDzi߸4.NF)\6srFOU+yA&ƚIf%Ḳ),?oqt(rt>S/mxKasU97ߏd8q=駪1v#RL$ۢ,];Ws&-9l9 6=OQNُ0s/gӖM,۔Od70}}koe;[/arq=®@'*k(Wݾ[UuVJc3vN}{+')#(ڝoGd*:/c^][gwɽݦs`ҍn f@o̽eEiՅ|SO:!W*3`T+;4 ԏ&sR:OqMor]Vs`X^ٙMecrA u4:}"]ƌCՎ -A_""=Ǝ?Kè[!ex*Hw&ѧqJx'^bI6D9 L/P%af8Zu?>Yt~[g,8tZ2Ka-_DX<6ksvj=糯O`P+>;-O~ٲr==bds/3]gpz|VdDmCUPSpPV%anVWG?Jm9d"-۔r{1\a됖tʒ3[Ϊ:ftzvab3>/ӂwܷضm۲zj&LPҦJfͲ8p ^粖|B'-Kǹ]+̡+r':|nUBpNbےD#Q9~}`H^h29O)1\< 7|߉&-T 8x]ENe/}·9Dvɗ9O,$Or/ekP'* lA-8fQ?տ&*묺8*ίǀXM\-NSɐe۵6fj:(8p|qV" ,(i3˗/J3B M h.3zOu$2+˚@SJ-3x8]ֺS*-{L_g[A췖u֐XVfNg2h<ڄ|PM۶x^gf0*hbr|ɺD$wNm߂54 =q}{/ÉҥK|̙3GB ;.g*7ma8pؒjҌ]!<؈_r)%""3g:|ٳRӁ ۄ%.%m@ (&XB2D`p<\d.]Ƃ ە&2_|D~l@"ĺ$%%}R1J`R"x0[APP粢N_mFL_BuaiU!{xAK2nاgjՊ:)/{7L&1z^k_NN1 jGà *ȋjx :̟݁rK0?3|Aw,w??(e^8unesHq$oahYKI>xpڹ,AՂp=5ChXs˕iyΌW X3 Ȟ{wE{eϵ~=oE R&_8߷/_Yܳ@Ob&a&j)rח3+؝{XDfGKEԬ-vgޝ㜦G2:u~)=߮f[DΞCy?p @ ,]ģy-.cܻ(ڑsśŨ-j :.l@P<8b]/f9{h!ҤeLPUJasjGE!B^J[@ 33X'($?uիC/Ѣ<:#rsg'nV 7{BmQԑ/[\ ~8)6l 2-*<=-&od'Q%=WN~:tժb_NU%d%v뷥~l{/|}W߫Ul "L W:5}wem zO3(k_Çm"AɑIvvLF«q_ oNk|ȕ,9SIg]`w'\b!sA@Au<` J#n~qm0f+wD}o}i6e}ҽ]od|n<06]6:v=ꗴlg<g}ښo7wBXU}c5ߕP;ȁQ:$OJ'yj1R.SiwDf;¯2w=Mktfǝf{p~f=Qdɫ~'Iv;P)_lN4?xjV&-@wJ~"Cw4fo|ƍ}(/8x Կqj3i!oa7?w ƨ' #6bN {Op# F>̝֎VS(H亂D+~9!MH}9d7&[Oܚ29*ˎ 2v1oXƦY!{捜k.X3$g%ߗfNd @#Q;3w5\n=Y =KipFzmYų~pI=PG-cMR1#өK嚺lMPgo6?_ΣMasY6)*紃TDAu)d̞=.]8\fϞ=ּ˅)[ڦ+v͏|nUڕ#|?Ɠ_O%\18}x5z4A:oFgX? 1@lۗP p86cw# J?BK1”- J]fFIF-ݓl30ژ!D,`^|;֒5 h2 2TujX/7@Xp?Ag-rEW6t9Ȼ Ή wIWJL♓X]wfmrwڋDEL^kϜykuX =ӡ|qM, mUw1:Ft # z3j?W#FNG?.DDD0sLϟ={U\ S4&3 _R@"y|F.ˌ;fx)>ɱ-'gwY3vhӰ`^iu.NSStHTs3yP $/.e:x߼hωH3V0XnENs`3ͅ#q2F;aEDŤZ*mϰx@UadN*x=B){X9aw>Ƈ6g xb]  ]t Z600T&3iGs旎{[uڞ؛r+^nmz9V 0S39Σ?{$'FP<]E$H.ll[9Tg2Zs>zηv EJ^u \}aBNfP"åo|%ilExLf)$wk9x3*xhϳ.Dq#q1c02:9ՑffQI2y>~[=TsZ;#I홰b{u?[^XvyQ̱ ݝ}GLU&]E½ug $\:ȆL˦_F)%8+2X׹ͩ@8[^ܐea;*Pھdr\0~:,h5ĄcdUV'(L~xq{\}-T eh ( kYҭ{non9E iyF)<=wq5f?7mR cܔmdc &fceٲ%5c>R햖[~v{{yp=p[Fm6 "cb;ڌ;ED颬%Ⰷ w0۵Bڪ / EBNq8i܎֣O:TYϡ.ȹEuDǜ ppHZelP􄽳wś mـ0;qeI-"""RJ=$b_T,pY,w֏fd\&aӈ3 СOZG _` ;S7O'a ێp|EjC9G~j4E$^}l=ϱ ߠyb> Iζ<ϝڱ8x+}Tٛ ɨץ9l1\H ѣjA:[cB8vKFNM1IkiH[[>a"*3>>>%]E2SY-ֲY]҇eї| yAx ?C@A:mx# CzXp$L<:gzh?)rgzK\FŖ=c[||"Q~F6I]ttBF️ԍUI fޠ,zSCkա;;"1A<9{{jCU6RىB-"")SniXӹ- mD5d5xg:|7?Lcה4Lݨ$u2ק+]:eGXƎ7mG9~6yRZinɣhS\xW[IR0u3'''3j+% vk0t? uvB-""Ss9[,72}s4m^Nİ;sgWy y*%ؚ5y!a籑oTA _DDD$/>MlWdHAٺ53DDDD߿bw.gN+U|KaBZ.?ǒ.GP5QRT^DZDDź2p@pssS8_˅ョg~[oAXR/_V8MooBX(7_W\UEDytDDr$,,L)(Z).L\UrE;""% RQEDD4+颈䈧'K.ё={0sTZ)̐ma0eVOEDy- u|||⻹+QU__|Yt^^^R8L.%U/""iQa<@s5z1yRCnijkK9o*vqQSۍ|D+|[ÔtyzzPbl\gNT*U|3ҋ͗"H;z!6HҌތ^v HNw[l8︱aM4k<>L9 ?ar-W~qka#A7I'%KֶZ hak;J7+M9[.[3!=|';Mw3TOMFqx >u];h}) dIC"&/k~ KوuÅ]Қ>/|V֠*Sd'42xJX %[ eޢK\1!n{bƖgǔ(xy+؛IɄ4]tM6=\u6U0L%G|.y{9o:B9|3]Ts0,dvrI4ץԞ̭Q}+a΄K/ZF9j<٢K)i9h1HMۯIO@vϫ•( |vuRMϷ]S 1?ˆ-clZj 6s^qsJCy QAo@ {rmycQZ[lO6vhۀ2}MR;f]WfIt.tӵ󟂧ƢY K+kѸ(~lOE|YcNyw;)R3nbxwm޻܋:2vR)Ri6>x^SXw.޹x v5u>y)&7?92}Rk}- +Μb}K_Rrݧ֟Mcnncs7.Zwfo|LDǜ ppHZ+GyC=1pް_Iixo51\yW% > թo{DͲ0GNovn H0әǞe΀߻ZM͒~ ]A@lv-pmHE: Ɋeh:x>Y5~ OU\Rt)wY?78E!Jˑ~ W\Aᘿ#$kٝ%YFQ hBYx|>gq9XɸLXÎ;X3/6gdqǷsa ێp|E{L t muHL ))++GQmo`5i=r_^Jݝfj5 :dǮγ7&cdHik "4N0hٟ׳C,['cRAn,!ҌvnOK ѣjA::^0kBfנ?q ٓ4L.ȋ z˛ m -IF_r~vyļ\}-6s:[re $>p޴ &N&C& 'P%U 'd gv,Hj԰mBi5 $ ~!DjTLr䏟s.oʘYLqAԤd^1 ^O`ֱǏ lݜ|eJ~V)i@bނ]*q Fѩ;2eZiԩ[Gk: 8ϛ R-Axe{wҚo ooqVYo`רlEE~: <<=C3>K-99:λƵ%zƖFrQ-!"HV R,~"w |gvDU)O*CMLq&S`JǟX05 cO ׭`׉qu4 ]/Hڅο,T9TQnLT5fɯò%ݙ?[{ }|J>Ƴ ЕxtǓrj:&褛I>ݴeߚf"O~,شߔ?7mY4cٹr^ݾ3h5Z̟w|weLa'd2 :{~6-@֨=8=~mbd81B|)QOJ`dc14skX]L;a8} c8V{Gs>$oL ";`nbE˭ #5ɤw/xdDkG;L5L-kZU 5 FAԍnug:D_ \r_Sr2P}6Sʨ),+}X8uut+bj|xV<Ax@[Z2"I03J$",[`XP$8q@'}g # ^eb|#9GIkU?v-Sjؚ84mnmf@A]m`?/*t[pvt A!י"a9II Yb+մ  kkׯs=z@yc?QgHSs^M"dNjPwItvmj׮M5WU}9d".郎<>sp[ʗA#pRxƨ\|֎ $2`aP?0?V7T#p:@$ӣ# I|CfPW%HPW2Qےj,_}N9cle4hD9 JU3YfĪ'9o<+[ǜ5wz+I 0ObѾ˄>{sf7vǻ <=4~xU0r_k= <{rSacKԞ.oC.,7QoꃆPP3}z/tO`Ȳ;^~*æJR$Ln(_gI;;.:XzUk[ Ar$>ׁMMa'}AA]%yl3{]^VЙj{ה` ɢ9y8Q#Ž#Zz)d:4wqctϾKacqILgLow}#~lB/Z TfHc\xWᑼh*(>kwN>ƤbrUô6^Tnia n=K"Ts}xlXp'8z?X\I G@)iHG2{P}; gHn=+B5d5xg:|7?Lcה4vUq2^M ֞}Yv5>gS.\ʀjyMehQP\b\t<>6MO} &n>«@ ϼw_ tb}ѰaԫVKyt1p_}k&|ڗygED`֍IfNH;OO҃gN1NK/e4p}^D+++{lEc7g5Hic&=65~ҒGO2^^+th4e}զ"7d^HBUq͜5== I߉ˣWN 7-e`Ԙ-0mL=89/)agbU,qOsz#Γ6ohJ'6y7SFJ aW7P@ÜVjp$غOb^>t8l>>xzztQDDrd֬Y8;;)]crB!JR/a&*vOIՋrpvvfҥ%]  S9;DVQk7U4MEDyOZ)X&w%U/""""%gHiEU &n@@q~IՋHI!̙3..j.%U/"CՌAy”3 MT?-k,h\KKK<<s > ]۱N%~Sna b{8peʅw#tb7$t$Nkg{,tAٮNMob% j\y#Q IO.eS:ZVXYעqQN<ǜKvRRgNej~E0҅xɯ8B~]0 vxi{;##h'"btKpLNnG'xC#9PX8)6۷Yu -%}yJ]'=a]sfgj6-̱}/N!S0LQFYEI!J<>pM<) 17+'S' ۣ%#T`́kܻ{NXUMPѐ)bD.04!1hOGe0 Od}eI>z̟cA|~:jtX ~Ԏ=[ҽٛ ɨץƂb9P['cRA'e &cdVnN`BY v!kU\7G}f&*jHe{&<· v>3rc875,6CI*Eں'cמRYx2)M'YO>kgO/}z&U bK@0$EDAkYo`רlEExifp~:,ؿ;X%fVo(C]-)+h[=asԒrtҡ2"ā(ժI3~0U2M9 s^ [ɭZ,1DX D^UHa p?mع'zcnEsi8+G%[;VY,AȈ:=;T@|b񨡭QI4ӄo΋*""t^.+?IZJte0W^]}6 %2>J1G$ZVl–AP19 F4\\r~8Bq.jexyJ^qGWo@TJ```Qldy6>G(i`aV*}p\ͩGC[Kd&umXn]Rf  oS_.! 7F< OJk TV{ISz Q!mb!£ݬ]y(;ҩՑ憑<6ťMvD+q-{!ܧ 6LaսP% vk0t?&HYz^8="E^ɷ4vB(chEe眿F Cm^˙&?DpD$Z~7#`Ԙ-\JY \.x9#/ld.A]O:AA|.hH>N;fymƲ)բ!)RBo 0GsN /)OG:f }aсi;0-kzv?Ƀ%.~{|PE O>[xmOS>'ģ~4sJ'fFm д ]':ֽgÿs+Pݥ^". 8[ʈ;bָ+n5=IoBue䵘|鲛h*t?! Iz|Z4鱔?y|t!4g&]|{ҍ1|7vѲtfXdnaDD2S<%a PmȦPG|D毻g(Ԡm򡄲2u#]ʇEZM`+~n]DvB nm]ATܐQ{\DDDDD3@URX/"""ŅX0(eX/"""ŅX  777r^>>>xzz槸EάYpvNYWR"""yQ~Xee X,7_ٙK*8Hj(z)<*i #Ȋ2QUĕGUE1(""OXXX: e5X+n "X0-L܀Y;Bkח3g*+]\ 7 I쒪Dk$MT54%E'K.%,,DElFk۷y* <%Y/""""%(YE0+̖d|zNNN;w.ϹU$NiAkJjO %b]c\ߏm`.wV[dYAmq14FM8; vZVwY?7476am\xO٪hܫK3b=#-n8I g-}q+5¨t[J~a_USRQbE?xb"g6/gr,°8զV *? ?wi0;m$}{,LZHWK&wP^AneTHnP\t6^ 77m: 8hQz=Z}3ќNEVcHˤzm[RF=-MXk S5TrC#ru"- (]i "cRo&8,Gl`˷Zڽg'2a5G3-ٹY-TKz,cW=6#i)oSZw崿5wMNFg8v-opd= gR􄽳we;~)?Um"5DvFs>뗱U Z9|h-s1_}J]jwŔ-0'ru*Գոm>l3}<Ȧ9͙Wf*%+TMQ#dCR$WwwxNElێ`f \dHiWʟeqso3%g}%\HRZ}Տ'hԮ`@=dD^:-n퐟,2D$HKH*G|dلI1aa5 $0p're(~:* ܾ1 ^}'[D}Ŏ4rq?|&7w*:[??(B9-+O_b ME#p\VDVsLGffJ Bpd EuG$ Tm!%oSۄI"1 1@ҳPE]߂GI ~`N]և0 Q 4*, & jVT"`ۚP}$F틄)kȷ*1|VkѴs+|bDچ P1|aKwgy L܁i5}')?Kǟia?0y h1@ 'J` zylƢ#JP+:F;/6c膌E7eSA g^Ck~?U쳑6h(mMFz[˱u&Dnj:ͿgPw,!'yИUL-)t-p˫5rc{CĘ]fEXA"ܾ|-%21axu1WY(ݣ~f3FeRcKe8F&!ѩm8)OCLRFё<*yBJR3]vvvOOOϚ5+_[0j7-^іOǑ' \t4i5x*,[ق֣VzTqM+:ZOlzlleV)hۺ@ bC%h)f#qw`zjuHҥK[ܨzDJb[*JXkX(F 0qUZ/1zDJb[R>G?CJ(5b(lץX  7771p@B|Sq!?UR""""Rb 8__|WF7Cj%U/""""%(*LaĢ0qU}EDDDPDDDDDDD%ߞwQCD">"""EMz֭EQRL5 ȑ#|rQEDT!>"""ŅBb-󉈈#G(ž8'"R߿, ל8'"R:$,"Rd}ꖈ###n7* SJEDDDJ#XI@@ [DDDDɈb-+iBPxOOO.]*'1\ڕgR7¦Gǩ:C%]V;>oۚu;q 2rzf$'xnjax[ț޲\ad<:iBQ?vWv>=a)mf紺O>X:^*Y4lMGS(*bя%^D=:Ƕ%LaĎ03|x Df声N^'42xJX % E9$` Z@:3M3xjT@C8N{UR~>13RGrח3gt1J//b49v6YJػcDO5 ҮkQ.a<%m~E*:bhZ~eCn^h a?]Ma{ye=}zazw*rXXZaTBQ<]Y|7a^-HB6b^5t2NO?gC6vhQvqh/Br8KpFh41Hj԰mBic2|Jwdu|||ށ?q-1.rƳ>_W; IDATijզydߍCxX,\ rt Qߍؼ<|"mj@|L^O CSDVA֍!6z,H"I^i(S*Gp|ϾlEe-!7lP,"9t%*`q5tIpetT[$g޾}[E)Rj/qL@@@-YY[ݿ}\ׂܼ onaIYo]SiN)=z?]˛pc0xOeٯ|ATۖovVdە+eE_c&Oal=7M`5żJzLe7ų`Swd9=굩S.iUp OFWP^ʴ 0E2(1\/rl!S+NZ)Ef^dG @Me_C%fl̙-ӿk2iWq5!1$YQZN{ޑMdWƇx{.vn&X<۱"{uKcOҐݡ-z}|W$PtaF6]g CD1udÑlZ6>-Q{p#zĤVI?X*GLAбvsC>(?*-KMWY1,n $(NRMϷ] J:wψ9F R I$Ѯ8;l̾9\5^Sբ-zh_C.q>x5cۊ4rHLH'K|לsV ~ISka҅ͭ~~󻇃C%+]sE[x55RE VvH9.KV #AK`M篁UKnQ3Ft37g8(.<<=KE<6PK[QO<{Q;[cecCZ8fVx[FX7p7Ùb+k{ \8HM S Ba~>2|$~Sna b{8peʅw%YqǂrJuXNA-\XUSZ|(lė'v$+ΗYxlgt5?WqIaI9pD~fmq;t.t-2gׇXc&_|7g͢n(`~IQ}]4>ت!Mr"unMkkٝ铜1) F4\YAF 9 oؙzz=J2bd|%"Jqŵh^D@Z嫪hN]sJ.t%9_ qFvA0Ar oe_`զAz/6:IP6bܪeIzٻx6l@Y[c_&BO\]seu 6j!Eq1έRś8OǕjͿS3t<<ܜ2UlLC w~!bnwl$*F;-=G,أLB+ !tJصgO.H~aώكZ]T ӕVթݠ=~b}0fIw]]J2ٻo ?G$=ĀRu߾. ΍s T.OIDn6>(a|Ya L1F[; xqJ$N8|,N+GhUV'luЈȤ.s5wP#Bۆ2,Q Ξ]$hDш+' <1!%ւF9uиN4 Gҋ)mM=qG^qV' Ni=50̛VFSҧ0:ticހq2~ cǜ۶԰2ڀ,KDZ|M.NJoe!?#dL"v_Ķih~@RWZrDlMwyk,rgh& ke;~Z0:,uH'ٲuNX K"" 6"b`ϵш&QQ"1!**{O4$X5F?{7)Va]v3s}y;zjҹ]w3f^,rd8rRL9 p#Nu:CUE#Zyq?s҇_ˌK\NA>muf<݌l~7}7,8L0K}2 V)YO;9{8Խb5$_6YZ :$5maߢmi< 5sp"YMulGKaLYS]kֳkD6>]*M2:eT,_Rb LĘZ]R}Ol)[#Ɏ䖳dx62gߎ|$z/0Aptx4Ct SQ\!|s)`V$1ùE\&H9}ѻw(~'Ie?_w6PbXZS)r79R*[$iJI]uԌ ]f􈓧У;I)r k,4k+G^!ScjU-ՠqN ,[0OL86Ȝ;ңZm9Gbs_f_4썽QkXCq0ɝfKrN{=TrTIظui!^L7 >r.;x(1Vtp`%P]UFytz?JSmkк`_]Zzfq4/в :rQz|ju2#3cA k[bz*RsGMܹ@&ֹH&w=l|iw˱\HUN'MwឯRs g|]#;k!oblkiSXVI&GF犨#=-޾\7{9U4AH $Jו``hPzAlܽnT6j ZOth7@^p5Ru^@.ϿefVg) ҩ 0㔏K,:bLOpr={z,NI͹2?<@SK@J-2G(kcVHn8JY۾VVӃFוiMY>FʻNC$':%Z]dц4;ٿvygeD¨ )!OW)Y{]U\Q]xɾfxm 40W/L9C5}\~N\|\8ANխl(yлTc\d8zݴh5h` &*6#[YNqI1άy=/uBA51 gn~4/1|Yۜ(|sČAl;8N61_CBFt(\UiX6=>/XNH>k~4Oj3oq4羊ƻ6)D t,'ؤ4Ħ%_0Ɩi\'@"|~]xǽ;Id!cc<=ޮ9l݊:3|c<>1J~­?r*3!}kxi5(a+ELZYrmw4?YbL$]:5if&4FTbF$zTCK?tLL\hedX,Hc(;~ x%hV;NOnJ% bܭƀQXE#~])ѹD=Sw\INE_cF߻jE}4 dRm`aS lxu:b=7.5áVZRXf2 nF~js-h7(Gqw*Uݮ/aJP0O&VeH9&_nK̍ol`[&! "Vd?s܈M% -"ʟq(lߍfq aEݶ Њms6FN {cN~ewam4} ٕJ tTZ!ʮTu{"TFۀy5[b;p~5QXk:.pD;k"XPԌD2@⚓+.rj6 &n=j+'K^f&>2H>9\ēy35³zN`L<kMW^=Nȉ3oG#dAܟE h~+ hp 7IØ*dp:jN0PnMPu$]?Mbp 4k̈qjT>P߳1^ާgaѥ+Ѝ*\jE@yDmȉc'JMKDuJ-Ń@ (JL#U 9rD`B 23'/6Lk7|Y=N͜8 S+{ű6W uTIˊ{ }ifd 0V;[se.WS("ǬOwt/t/aL;Sы>Q y@3wDo|-c9"F^ilQzR=j(G \,= ֈ%Wg4)< %zd ]3Gf錛)5,w~-sNpK̩Е̿m0ptQ֗/֯n{5֧-rΌ'M5]nZf(PbT~ \(ݟ OɎSX~)#;.S[ mRQ@ LzFDD>>? Z f^xp;ho-!<*#öλB&%˽P$2:ږRשP܎eS>aLjihiu>mRQ@ m;zȼVm+K?sXe*7bjW?L?2&JL{JV4qRȟq}ڤ۱Bږc&7{wHYl̿{Ϗ x _[ξȓDA/:1wVxC:0p=bP?z-kW$_c!t{u>~USZ"E !Ԡs h\E]V9sez ;U8v6cґ?L;W%20W,cHҚՌN(_g0fu¿c2y*Wn 5H1l ]oӛfQ3Hٱc@o[bu#W Fe0_]iDNF%2!10tPwN ZP("H k%ԀnyڕbTsBh2-)} @ M'Os;$@א1\<llؗDq_3Me<<1?nL&v""W$u5ω??}&Ar̸[Gc YzFץ:x!^NzJHL12xmSiӞ[(w:'+n&\|& [pY9 vr %pTKyָ^;ȁ=Q );ƠkM{`R;]d{tn_:ӽ[і&RkH+R RUOpol6=P&RT,!TM%:ڼԇ>6|=6jpMR h TU:R'+W~]yX#'K^fbϧspL< ^8/ρFx2Ri'Aɮ`.ΜM(ȟsLI eӂU^E/ȼ)܎@vͼ|Rej+HMLU !#[YsS#wf)1sarKu2rt$үFǜzؔUgD[OeʨL#*[0rllGO>[ @2g:pg-rA7D;j*Tn zԻq7USXT5sRy.!Df/_ZaRI-Rӕb /o֦?O)R^ h3ယgf|{-'#=SLSxm{w睅yMrngqNN/[`[AZ׾Dp)s'nȃ7#󴿌ޝۤJ!+ v/a%]UZhZ堗Ұ "&h S;n9E$6-אl!4Lhv>/w`\ 6X}t.o{.RV{;*`ދQr5N筱n|1C%?֟G9ޙsGi=2;Ķ%}|j\Z ÷ b6@BrX+wr>u ʵ+c'Ƿ hªT&/ZX>[WH^7xG3\OT'cTsc;kS3P$1ùE\&RPIA̙A J"+KWrա-THh8]Բ 9Oi3if]:mѵ7JXbߌXL`Htαt~ocoxY&| T堗QɌ;o{u*nח ΰ xL&8XK,iB+ErV7f2#5`!ӣ|h BZ1tQ,q"C@fAh:IbE&4mĚas 7`̞ƁCwV%ֵ)Gj |}}9rf~#Sdf[*6|iPb(ِ2{R;⹲{!rB_٪s|q×~K:EȗD~0ELM#y@3wDo|-c9"F^i6zHyUɓ'xeط՟Uvms+]zY>v=;ڕ$jAJ>[&^?y3F/h+^lt[vnH0uboAyβA ,5Aųyo/[jzd \ρW61C11@u®MTqNiSvEI ֈ~`Fe]hb;Ԫ5|^:FvWF{:6ɟsr8~m>ɝ ǃlj3##MWMא`$f)#'J%xb^#"".+(};fֽD2S d=k,qs4EF0=ׯȮ.vj[bNnޘdlۅQ"ē;3?u54R-u|Z5mm^u 5l6}ВŠF5 ׀sֲ7AՋh]YJpޒ [&nhdDZ}j0w%>uG]G7|3w )qNJʙ4o]|ui2uTkEÁzRDqa:h(btV6d܎Ìl@QbbIII*[!ԅG.Z>-QC6>E nJԲ+غ &+L2J| k $?Ԁa@ (;J lyQlC*@ JB߈D@ 2 .Y )/۞ @ PNuTTTIC "]*:uj xVb=j(Ξ=[u%xֲ(z@ Pk@ 9j:%%Eݿ@ "*`mm͋7kCCCR@!e] @ Ct@ 9"IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/hybrid_checkbox.png0000664000175000017500000000255113203343610024040 0ustar jomajomaPNG  IHDR<=sBITOtEXtSoftwaregnome-screenshot>IDATHՖkLTGϹ(BWPHXh`_FiM1mmUV#mR#hZh"fA`ty#Kػޙ/;sf;3gPu:i}pΙ0EA%I?N c;{?wUFAGWlCB5ƈ'Fu:]Ngo̘8 Eѫ1X^FRCXCO$;Jc/*8 a8?80e/~Y;(=|:onk/xN浥-M @݌#΀s⌈1b 8G@ڑzkYUQt *pw9_}(ӟfYDמ+ oG0)Pr!$kiac޾pUԇNM0 JAAz?gC@>vĸ2[MmYhgV3`YpioG4޽3톈?к}"1sbь\2wVxXX'n'IA|UJ4E @s?_32[]GM2՝8Yʺ{JλXl?ϝu ︭qqIG.Ɓ3,^$͎ۭd#0Ti"E3P{m[Bt:ZEQ@P@D0pP}KJ^Q=IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/hybrid_dis_checkbox.png0000664000175000017500000000223513203343610024676 0ustar jomajomaPNG  IHDR?”sBITOtEXtSoftwaregnome-screenshot>0IDATXSVϹ+%@`Y`mgltN;uʴ8P\)EZ>I6$*:ܻ9s&hb' JzOr8w+xv1;Bsx;pl y0B"Fcr_ܴh$9̱Lc,EDasn(Iu܅ݯvz9= !Ôڹ\_:NvpR uSsbƥN%;;> A$H p dM<]rof ΡS/r]VfFv=_Н~n!D@^0d–iuu{TW$=;=qvA}P$\4e/#ї[[Wdg'ljg\Izn:;IdOc 5Y|<]/z@F^vKM `KE49==OVa%{OKXO!qRԘ:Hk=îIzCd;dK^%#{훑(p(2JRUD,Je"cjZ9{Oq smv@Jf܅`h0=u{ '.*AD"@$DLMðm۲j evr.B!K<9]%Fr b&qP%~yLAƋ"UB'%B0`/;F24]UZȇrjKKq/\Y.Dxy @TtRm"huꜷ8bjAht$ԒPKB- *ߟ9=C%䂣Z(z쫐Ϫћs J%w\/оG(.) =zt̙G=u> X|ȑ̼>T!'WlJTCPI=tz^dj?=NT6ՋjJ gGuHOUz:i/nAm|1m(999QQQ/))r vqqio$a50CM9cmz(--]j矵ΒkQi87Fm |v??3Ϡ`ѢE355VuXrEEEEEET>%%&o m-b t"1;zC,Y;WX>t1v%Zj1ٗ 5 ;z-B`&,~86SIگJ ܊9gmLEXW@-L|C}t.\HLL`ShaIEm3q އq})~{%_B2 c8()sAEq鏵tq6N[XX8::feexo``Q0._Ȯ$|R544eVk0qEhnn޵k_|э 댿1()(*49P'nGқ7ox @(R}Y:..o3k :=w܂@U,vzl>p5*8\}B>CBBO>k֬1( |T޸<ƕ+W` +~*Op1;;;MMM3gP,< OU]uKឲ6xcx'Ejj*mPѺtb 3s Tk{Az;IfB1 &NNNf͊p^5(K\+wΘ1amOZ hW|\l_}gIMuDUUu $utBv6rHL~d;Qy^XqIrLm EB;Z&I1sdyJeff%nd>H\=hr*FEEEII kL4:4BWVyhh7"""֯_@$mڴz5龊 fjaa֡GvÙ0aޟFghatiӦyyyYXX8;;}lMCCCj"*y,GGEQ"z8#Sf- , b=44ƍNNNԷN 1Hbްa߂ :DeyKn3"NL4{4zrMz[KXF `ŋSSS+++ٳ/ñzRG'O?pB@ [0ϛ7_~(*?#Uw9u"úrÆ {:Гq'OP'?. 99kie#fdd 6JgMV{ jd،yܒ#">|x3yTJp}1|ڬdYcgOV1__ǏW񱨈sg׮]TXvA2 r0wP:_-1Q:2^eddT⻻mfT!QV͍m\$-SIIcc/d|~^i2 \_C-"zm:1TjqƑЩ1z"9{ RL9,@CZl/lhh ^&c3` #Goԓm̰b ꚯҥKce4J&:b%.k#q?ƌ8NOǎۥ$*閟܄%3U5@$i2o-Ƽ!PS1 |"qEc$DS1 m1b308k0&b-FrT~*6681ִ H T7BчW^yT}dm* *Rs+ ŋ\.WYek#kc"/--j۶m 1H+DbPr8_|!{ѫjtj^u>W-*}B[PKB[xq؀vPow֘1c宲777+`_n]>7eYYY{2k/ K6$4l}*IN#襱0ŋs`ACm4i3F1b D__;w 4?fz2)M0F0F͸Ws0*Vh 0Am3^? @}_~y2jtBW -7BMŖhnEYY/_L' 2B+Œ/Wt0X?lEaCoM08z <hh U0с$@ o`L:^9o< ]{OGMo4P N0i0Ŏ{.]Tyúe>;e 8*s-±6wP{nYɱ*K|`oCfn } / QX[cb˱8TTTDFF.[L={tx>׍lL"tڈ @`7nʕ+̙cbbbmmA'& TT ###]]Ps} ͯ)Jx( OgebbuVRɓ'O*dpp0 b=@gffkhh陘9::z{{>^j{JUi&6w{8W P 5ы z/zR.B*Ժe_^uj^(rpxP(trrR~ 噙*7sbbb233333ZZZp?[{4Yp3 #[#'9sp.RD &ܹsG/ݝʃ,(`:M#l8q=HJJ@^^^{bpՇv/<ѣG48%%EׯS^\fff3f%ji wwwoo 9EEE&T<mw %%e…R'nٲ믿ŋ9"5ɅHg҉ѣGB200 % eeerѣ/"BgƌB_|tnI yKI|2ISlhOn%ȟܹ@< :"//TQGh*?O!Xx.\駟YYY8άmFj%hjjRD2IHH(...--ѱ}ǏOTA]]]FFƃrsskkk>}dhhhee8l0//U***bbbrssKKK|A9~@Rh;m xnܻwoҤITXL$7N&bܹsPQ%3Л4eGGGS__)|FFF+V ,D"QRR҅ o޼)*##k~w (˗nX8䏖 (D2S"p]IRRT@,ƒd g8]'**J߽{!Cv)3h __xb*ܱc͛*?)S]Xl]+k7'00˼r%C%A‸"8<>fI'(..3gq16 G|+GdV@}}MRSSGnݺu`\t:Uc i(++6mkk c1z(#grk;#_Gݵ1cPx4Hnt%!A<P57sBn2OOQ_D/ gc"b_lCR9߿fϧlpL耻ȩX*B Sb뼰5?ecdKDC'ɻ_,!4;xvvvMM ƫWRG+񲀍x~i(sF^JIv~ʜm $:C'f;҉'O&%%Qi" @KK ,-Nz 1IDAT :gffNQ58e6˵kkk aÆ͘1#<a--o:DzNgV)əfBDrR佼&1 rsGKɔ51dfff~E%}n̘1rk)@kJYFHAAAu `A[ 1ydBȔنf(~O2I1Ym 0E3RәZJ"^&Cٳ`ҿ-e9R'd\Ţ-"5Rht5?72.^fvwX.(w;`g)P'(4hlڽhYΥVŜ5uT*A4}ˁb~f#77!8,^ (DC$w1eqX{xyyQ_cKչ\{ 7F1}hСӶ++~(#iSzeIVՍ0fr7,wy\r $ 1 gz,rss|h&:yfN:MM͠ *r-~7nH$$$ɽ-i3HUQe>]t.))!ĉMn ən:* Aut5NkԌB4'lTRƲ76Jq'Ob k)Cd(;TRpuu쐍6h Ds>}oA]6 DžypeM8l'$-dͥlٲE^: Dwh+ZaSTT￿z1c598<a>$K֝J}NOOotz3mC%¬wLfw>Rll޼.UM9-٥q2Vr Źx*̖a `NAF_3leԗ%6<777{{{Buc48Xぜ5H}8=7"v3gܹ\ڨ*5TR ;'1p(V455QNCT=qXISxZX59tP``@ x_17BzĚjkk?~<449Ùxi(c &-QXU"v7eCɮGZW.ݞ_ٳ;FY.**Rz]o+80`?(Vr!ِ"*Cn͛e_~}ʔKjP,9%lRHNN>}Tʕ+DTWWGDDP[mذ2sEEEݾ}@յ VLy=L___j?\ɓ[nWUUxKn߾]j --ŋ.]JMM"VVVGv؀ێJ]Akkkeen~^ >b``>)95 P[P 5e_^-_Lkd9=#}y*ԣe_Zr}jU%W\_Zr}jU? wj\IENDB`qsstv_9.2.6/qsstv/documentation/manual/images/receivedrm.png0000664000175000017500000105134713203343610023046 0ustar jomajomaPNG  IHDRvinsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|VϽٙ@) CRdZmkumZVk[GVZ-"8!" LIγxy }]3{s4cucB!9}fl/cGqQԥ6Gӌ'Ԣ&ٹt<ع4vpђvpJW-˝KvN4Now1fi-eצ7ho4[ϵemRM&s鶬(-|'wD ~ Ab:|J=:?2_J:~ʲi6Nw&\Kln nVH&ٹ4w=5bvG$R%wm;^:-LiqixRg6ld66/?VkB!"*0 kR !B!iUU3l!B!/a꼼ܶ.B!%5aBir5 Ѐa# nUlRNI֮]$z"HH$$8C,C~vdgSWWGUU5VtrX4I1k{z);kjWVn z1͝khsrwK4#``ߏcV&PDϋ /jcSW#f( &^l?^gyWR6] ++PZ[%?`fTl ^g6E9E\4C(;DĬn n4ohpq{'$mTXsnj-0o#,X9ox>u?sz:K]odS>R4b$NKm@tc'r`xV5K/H>a|l1X۾!:pq+O`H.`z9_!B*5Qb1&Mkq]7cSJ7DZ1MN:rjELx8XI΅tLL Ÿs\OrzjkrsxȎǓHgq{mۦ,g}#`xJSUUMwq t8.G{,7P7L/7TCG9Z(|d Mɲ01(ЎE+s/xM|_29sĔ@sY9c=⨮7޽Uryzo#v[o(&8yL_g7z ;\yr'W,ރ9 uTofB!he]]RÞRTٟdжaضC0keKY>\ۥsdge%Ӂ3g8NyO6۶锖by,Y0vU8lZ^&kQǍ9;cdx@7.&r1pw<'6H]]ºg(:vu31NWt/ܳxf9]G3<^{\q0CA]kgި`lobL]?g䄞5=[gټ^{iGP'w^2Pد[MuCd:t(ð!FF~`|/>uv)Ckm<[>E (=Q`x7}/ < :p>|W G%wXlzt4"`[sdy]㔓9zPY9?7h>^ HAS/.is|\o6raUlVx l&l&l;h咝E<uNmjأvYP"D:YYYqI>[C$!f|y9qBt r@@hF;6 sf. .}H\߲å,l 0Rk<k[;I+%#DTrnt>*RCgjLb+dܤLr']7|H|I6x,}*ͩc9 9! R85[ f]LsvyM\}&%+`WӴx< WHlNVNGLK@Ol=s_{/=ǐ S'?ɥ. ݃xjAdyˋ9Wtt_^d2AG3_Z7uON3\}Ttb @ rB;6w>5[Pפ -RB!{\};ubaL<1ψD"(轈H0 院Rm+Ubt婍 Ue7Ҳj>d|ub(4KZj3. x,>E_ e e%<cY&>`пKy`X+Y^qXĤۡ#~rmFE멩w+lLe=h1< ZD!{\|cMF0-#ZEYm i]KVk;XF] WLhǖrӣ35v4FN5]Yl&l&l{j3M*\W9a"HH$B8\qp]EUU5ehTTWפqİ[A8n2?EuuM2LbEmB6ʵY^ᮥU\6u4'teU, Z.,OKå شi#>_|:hG|>tԙX,JMMN>ko ^ԟi_Ț5a:żGBݪՔl C]0+K?-p5ylMfnOvVË@-7hTǞiu[A Ukw=μ'{$éz̨ÏNA ݃8j[p3yދLyRp)!B=0P^^FVVu1 i*,L2o]oRstkgm4oDZQJx2{K=:N Cꈃ/.B|9j5h'H1 R5C #>o[%nDZL Kqp)zw}-LO4ɲxgXѥYЙ12vRys:̮Z~!E/ Oaz9>`݈#8zEu|:|m"&Y^LH +4Ej#`;5 GA`o,Đ1lH6VFB!QQQI>/J) rd##l*iP( x2q\ͰaC,39t*1Rތp$iԇl)B0B5t3L(BxC:í*OǼ:ͬ:/m7W4c¹ ԩ3}<͛Xj%VxX3hNdj6~OJ5AulwkгaZx}^TksQXOPkpm)Ro'Vd<~<7xD^0-M]:ՓTr, 0X,ƴ*ٲ-[Fa$ֆ0 #x]QQ4Q VDcQ*شisbČχ|O OXl:/oh ߄Ze\m/!<Ob?(=t81΢S]o6&2H!B|Wz,<^cN"#9t2-,ǛuH\4q)acy1 3DlƶmrQJcf2\qؙM42,k_kdhq!B!bϩIJ=[3Z"?6HLk\Kt-kٮ\٥Yh])l3L B!wU9i&z3IυB!cB!BåB!)鯽B!BN9B!uI#C!BѪ!B!hUB!BVmd<*>So^scYtY[TTT_\B!Ȉb5QCƤ;o &p/`ÆY5,۶e¸I 0SN<9u6mګw^{O>ٳfgkM^ GX`.Z֚?/}ԓNv/B!ږgw.hl~ƾU]uu7SR\S.E]xWÛd{=]ڻoLJf;ͪib !BUKʫ7z{`ʄ#8|㭙-J6ګ{{x^>hλ\y1Ɍ6w2sfMu]M>Wn:;ƍ8<ޙO>iQ1f8ēTWUs9?f¸I~T***Z;qtkq'xUe'}1麛 íZ|>/YYXEy>~ F Ͻ7Ù|<s;~rŬ[>}lO< !Bݳ[)Me?mֻ,Yx9g-[ݺҩsƎbXz ".p-WJ6o @n]9=fy˲2ҸWr9WPVVʀsx)/+7ޢCto۷oz\3l޴N?]jkjK͸6RZZ'>ަ| wV-1M0#O?E$w/^yO} '/ft2Q>;1cGK =$B!vn52ޟ͝GsУG&hG,r'}Laow']bϛ=5krgpRm K3ѣ;=k1b͝=wKeEq>Oo)OR=<;-]FIɆ& ҟ1Z|P>1's[5CN>d :`@ ]vqi?dY ,.E[͛6g~B!Dv+&\_bl(M3z3 ' !rUh!ӏg/).i}hma0q;t?>B^}UR۝{l&(yB!g`CKlذ-[j^EE]8S_om7gx˯,} ZbJ}1QGҡ=TWUFq]7}~Žуg~{Ev*l,K 7w~ֵ9ƌbїOD|>"p:>Î۔:.O? Z9}횵[UUTVV /S^x#(&M_j'OLURyŗ)X@ΝϓB!={'c!cyyrYr5vH_OUrqiPS]C~};9hAsy]^zeBY!nMt.8Og{wqõ7qϝһOofqwaoUٜ.]:s=w[@YY9<3t,`̸1t\~m [9j$[˖.;tfB,I[eM>=}m!B:RB!BMOB!bϓ !B!DFB!UI#C!BѪ!B!hUۭԳdb6`(.z}uރ ں8B!;4gۺBS l(,eן1`:\ h,55,[ɨc(hB!Tخ ۸$gOcO{Bs38v5Z]]Aյ7oyHB!{YdbLA~>հȔ(wA~!̒Ջ5h,x%R]m\eY:ҳko>["B!=FƆNs]@um%K|M9`v[UG(- ~ރn[vm]$!B ҍ ێE)ՖiZkrBvk0s*E4fنa$tK.Owۺ||)=B!٥ 'H["ޥ< i1 rַa]:wڒk`[K!BF޷G.8ngM5ptXļ%uAB!.hdhhhUVqg0_#0U/m8J*w_` ZB![m_S={}`P(1 7ހoN hW)o=r :xuN_O퀮L:9bAB!DKujp[[@YvǞr=~M#龌.Ʌx TWӋ~7*wE0l윳;|r7ruWѾ}]ֻoo:tl\>SbXkI}]3<ғL9rJhQZozmғ!Bڮ' FswpЀx??Ob\~m^|E^5:vH,cƌ,Z9&\fS9'{0ȣү?>LBYYyoߞ /_x3>%J*w:w/-Q]]C=yqŗnz~?\cϾϿ a\_>֮Yg4 .Ř>rvRrޘUU՜~?2rxmt~zEd#yNkuQ}a֯[ϰC=/]Ͻ4a?{ɞn믖p57[Y :LN;T\g37'Sm En],% !B}6K5ڷozsfihww7ƍ͸"_frʫ8wƍ2?l< ֭_}woÐCxa۔TLۢL0bQ]a'VuB=YvG?N;fӻoolFkQC㹨CN:;:qaX_^txM7sןx}1v6(NܶD1[{o졣/>CF7[=!B!,Ӳeh _AkĉxG)Eyy9Zk&L>OiiZk0&Ng5eee >[./zBcƎfႅ̙=58ly!XhɦU>V׿ J7ݛ>w|~X3qY䫥hyŶ(x<ضHe1L3ݘ֒BA:u.dтE}PWWR;ēӟ+/iPT"z-ON'?{ߗQ}9t!L|0iQ}B!ľŲLLcw4DSQh1M?]7aǞ@kq 'qGЃqqrÓNC+kdh9srᗜ ZӥK>n&89N42tGc8`;/}mM-,Y;/,JJdv!}v^q #PJq]˯q]qcq@:T^5۽5fOYɘ-!~Ω<\cFH#C!b?dz,pO.r.*sjmi4t˯ջJf5iL;jZl'5T2@yGRC m;|GF(k"V۝zs4M:u槗]!d I78₋߉8\qeL2zGp$J+~ӟ1`A(8³nǞsȄq(tD|?6x~pZ+N:D.:Ӄѫ;i4[NB!, 㨣?yX[U~{aƏۺ8{ŚU9;[p8U?x=]^k2q䔽T:!mLY~qzU[[Xdm]ݲ뱿ܧ=osʴ39sX K@-׶W[4?򋯦.:.];ﰌJ B!vJ j a_pv _|W{#w_|ņB!12 b2RG]bP!B#Ӳ.:٥/uB!>]Ji~ґ1[wqОwB!Xb?ie$`ɼ-^VVQEhUy B KQa7L(bk1 #cj_cTVWzJ:+$ ռ HȋT5P޶IMC!ObJAeI$ w&(,eן1`:܌EkMm} ./f2j dL2 ?m]!G^of& V:)NK^uVӽsO6 j^A/c^Щzm펆<A {(RpBߎOn<3~C#gןq)O==6`NV.W޼1U&1Bi6;'/;SMN~oU:EyM4xJ{ :zic:_" v9v^KiSO\t`ʥZa^srx<4l4zh!%2 0lI ak%Ŭ.up!n]}h<ڒl.u*N,yٵ7_%3` < 9`^(."˲4TrQ䳷dWDxoa-ˋcl؉tMa;]>4!0L P]o]yo極J>D7€uֱ|7TWWFZa&Z'/7>}һw/L#1,cؔNa09\ 5rM;sRg=l.h,Fer:Ͽü,ⱝ6u|Iuյ,]5 ӿ٭U̝Rd,\zbCY NBpas]WB%PZ.Fpe`@IVCGz пeUE6kK,.ce ^ΏlǠ^!LDٺKkPEE_R>Yv$''Cmm-ugpN=0MRn[լv Lj"6X8K<8.`.~]q9N({ F70(L#@%]~4 dP6p?D<^A}]6Yيh<5Kop"W:0Du}_`qrB{C59=d.mXj'Ckx 4\r-|˰;:[Xf; ]YzS!ȍ2J\)Ϙk#q^OV^f*fH,Jaǎكdggc[20լ[>c‘'XK=7VЧ_7{Q{nk"?hz/˕{7 00yN Ţ,zqzA'`*o3 s `z `׃# |`"եN#|11 fTr^In~xts*xJ0gvu>-+K ռV!S)l+*0{ҫwOBDps4Ep)4xv!(/D ǩbJç–2Fq(c{/\wE !y~+p|pvyj>[C8nǠ6xBn{G#=oi*I-=xy;M8[ʓ=K{=)R|2?{wB!Dkk6[+.hXfb WD*urqKu2n`>/-gzF ay,twayZrJbY[-[PP@a8Nbf&4i_χw((//ȯ]vt)5Yb}?lX/0mⶓtISTG@TR]U({KFQ^ZƬ=? .a+ݴo~=kK EV^Va#)Un7 5*XB8Z\@|XloIW)]H0n'`~x1MV\gܸqqA ͵{eٲe¶!CJ)۵իҵ[WrsrJ擠6qEkʚ0'1,聲t(סub*ZJ7WDq\ݺx϶0aX,68)xWϦ7 ,ZA0[SJgC{7kMgc2$zI mC7Nzӧ;uM^Q&cRFFUe7&VXaտiGGLᄣ1\7lKQ~[ockϧӽ܋٥31Tj2KyqO.'?TVT۷/_v9\~唕zj@GL[2bn&&C)EUbFB5͏QN54~8W|)Hͫ(gN ym9~fR D (x͛6c&jkjxz;9Ыy !v^7P5~V~7?׆i0t\K^J M۰??W:%8X<{Ahjjjv41fҖVB,\R.ѸKT+jŠX\}FyiQR f%ynsox[VԦ!QF`B\2o|FdnwHn֯#8H$O33uT-[ԩSͧ%b]SJ}ڕKPZcL,Vd\cV&GEkfryʊ祷~pD"3GqQJѹKg&{[d[ϋ%~/>HH$F,fcNrH;ޣ,q4KKӍk֠& afzJz=j*'{t퐇wCW.Ég/r% 3bmܥox+.ˮÏmMsHnv.|첋̳;Z;uoG-4qƛ<&M4%'/,\f90]!c1['Cx,e>HH?k jfyFLjbѡ>3+XPX,O]]^X,uZ2@FQlTikMH7b+Ŷ1ĈDضH##ljmr2n렵fU ]TJF<mg?{E>|5ɦ@Bz&(zBH$4&MT  X+Eוd3s?KgBp`|&$4F#K B U֯IVqᄄ;ZnۚWƅsG,XY lȔS~D^ݷ?BY,FMn_ߊCaRV6Ob Jʵ`VxFBiwy @n~A: e8>VUUX$CPX(d2HINLJ@͕+W )s[9 IDATXIQ)輽+]Q|A춭̀v kƄ'j5z̺$[[G9F],Z^w$z~ 4HEͥ.eKU0z_XLIIH#E :Ě%W3 6DgWPzdʎU5jcY}!O/wT*\Lf4 "E`0:Bd2W捠 2&B[Ma!VKՠRILTJ ~(a.Wfk(!YIKd2|9iD/# J4B $?tNA> !h5ڢ+T8 3KX,!{,jg7@!a65W3f ʙ T!f(S9>$I 0 Ls鼑 ZKo`~ȻiyCgÇEc ֭ZG*u^H F<\d252a6AGaQߋs( s2iӸkw4d4hP(Ujya@:O`ڊ  y~owHr}_]l P9-u@ DjУZMQoU2~n &N^ȥw6B.=2DztTXRK)PУGw,R&++S$++DNv6|۷[nL<+HL&~r_f]fKqd,,Xh,2Z-nĕ+'5]h=mѶ]\CCǮ)0ET{Q3  ke[[M8Z}P{A BC0aL(M*%][Kmn 3G"3BQIBՁNBFѡVlcYו?4 ;'8$+\IJ)σFAFRo$Jp::QkrJUmM%$aw>M#nj[\@ܒn8W 4dv@񵽁<=xBH~V=s tj xi=mR~~TЀVyՐSװ%sү1}=]f5"5MfU.]bA }zg޺Մ>/dzucJGi@& s3i/7hPt nџ+2Ba7 p:$.Ճ6 cyyxԯ!jSISfxy͒5 *Mv]];~owW^i*5]Ap A@hpa.+0^CAhLݍ2 ,{d ?'\YAzaP(2S] ^ϫL1wWEp )Lm2+>Vkk֍FqUAjgbii ODVѷgް`ywf۪Qg]<9oިj{snyV^#fH U*G<{x^g5-999,|f{܇'Gy񇟠-~͂IA>A PRSSy>` {'x?'h4RPPȁtoKD']y/4iΕ+|gyyxtCl\ wNY.GYNٸuQٹw{.^"(8ʨc9f$>>;\{豣Pχ%I?!#s1V!BA ɹ4:wfgeRN~^>j,?@l\Lq߷JMܐX6m <}IJ:τ0sꜢ[ 7^&%%;ݺZy\5DPMzZ:MJҷhقZp%~B-HoFnN.Ӫu+uW#* JEX0ZlKԹSM.IkVe^y߿_@$ϣsc"B! A[htn0^  nWe{rPJ\11[$ ŋ[}B}9vX 2JVW/ `mlj1LvspA]$IWF)YQGٱ}'iie Hٺe@9M7or_ٵkCt|RJdBT9n&d^v=":.54S'OcX˷['$qe&3yyyzI§[Tagy?[,RR>$/\ӴiӺN(BL   Ԛ_j<}7tcHH~7<6SfK@&uE,i6 dÖj:5uٵaT*ΘBzZyaht ԪÖ:uy/4ob!qt"ov7e(o|ȨHX=8ƍRCvm+))?Sم04a qS.33{fKZZ~~~<2aZlQgD!B.zϷ&L<'Tg܄q0#3|𺩨 Fo]:5?g]ڒW(ӂ    Jd2Aܮ qA *nXu[WW 40"AphO#`7ևj{=x 2AiLݍ2q- ) ù]y-4)A ĉN}e_?$'ss_zԗ֡{5 +Wj\NmumWd'bN`VںG̐j|Xѧ|m ˗t]z=z <\J.4Uf:!H _|0M&?d2`3e4z܃A(v{t:s5.6ԧ<Ap@ҠVR4N'##Ą `PZ #aDrss#&2:6;1hqqY, 5>u &&"Ѽt˗g_(זKSkV->Uvxk g@x#III늗΋^=sY: п@̱-gDqS|lQSbNIN!_Qk. Td |8K/1ֱ$N{lܻܺx3ǟ5xyyrϝ}DOxGv0, q'x?'cH|5xwS'OwYP0aDz??_(=-%VˆDyN222ؿo?F$읿ݻ9,~y1c(((@RRlÝSgY5Yj-ggc.gNY{xx][HMIe13"BA B=Ӣe Zjҵm;HRy&!? /@tvT+YK YY٤sch48~VK~~>7vg~>8q14 j@x|xB6/;4A';x]wܽPXXȍ=ndpLժ{֞ Srf̑U**ahق˗.өs'"BA B=j1L(J$fa񼰸f#+| Z%LmR G cӆ͠1Fj}aF~9kҼB֠:o<[X)s=[[ץZKeȻ]A@A缼<$˗.c6#"r 6n^9& VN@Rsq||w6TGٱ}'iie hwoɮBףM;s/~ q= I&|rri, yN|]g]cFx] A~AhFK$ mdˎM7j>>$_NvI]ڣP(&44?|#"E5JlX]| !WZ)ܜ =`i A//\@Vnݦ5Iؽc7ѱDEGkD&Z&:wܙs8=nի 'ϋ/'Qke;3u;_Zh,^Ct`6|G:!?WU^=w˜r#fW۹m'qQCxw=Cl|Z/a{v'fl@ \?J?Pk5F#GW[WOFV'Ν;֨qWk_B7*unw8 S&L-hLs?{#.j(w*{ֱ;:v[ˬ>_gpť A/j(@y0c<1tw C5kFƕ _'7' #IL/~AףVyt#WF)_Q7 9sv6oWB^=ؿ]ZoD^'''/]NL?WxױX,.k}a0HM'IJ:'iߡ-8tIy5~:P7v5o#5o'ئlL_ntn^$ A7ڴfi1a*͚5e`tnQM7ġa04R5FX`5CF=}lӷ2­:wLHh( i9.ҟ{gǓsCCHLɑLAhPDoٱ d?T2|&Cmz֩Ap@ԎTsߑfmmZ-_6 {L,z%nUGcF#vz[rǏ #*t&crDzO C|}}+ߨ8~owWApzۺ J*q̓呕y]4xL۳[GJ AioC=X/Pɾл_r>К𽬅PmI)皔+\hzn"A\1=t74{>4ɝ}awN&Cke29 OG>s-H Oz+\*Ga B=c⢆5 J Žm;M7ۜkCh7M}pg>!9>\uk"vdڤnd2q='1vVF|{|{\ N5` I, 00նQ7\1k*S>O;ov&#ŧ c+K ?'`wk$c&ҷNAA999t f͚],Oϛn£S1JG_IeߠT*5| Æ'вUK7ֶ5fd)((`ÕuYx߯~ӷ7|yJsT_0v1k潌hw{Q0o+s :A ,i< r`\&O!m>0OM"!>ձu6nMN@@m4~Α0,v8yyyDǹ.xD2x@ &(>Ɔ6;1h1G:ˆOj䜤T*t2˳&?ۻoG'GDH^_?XYX<MLD,Qygi,,(l2Pfq[W_~͐ `D|")))K"E1fX&L|0Μ>t}whB ';P3RU3zPYdx@S~^&kFli)8If[۬K/hb*[ߔ3n$2 .B7ܪu+KٸuQٹw{}l-7,{{ۛ\ݙgOY<{>"E-ߝOJJyHwhM7;fBĠemYj-@Nv? ?l=7t!N<Ͳe_ByKO‚gKbHn0N׿?3θQs}wsch4vPZEhh#瑒ƒzLY|-k1">ӧK+]ni'#OAyu_wf2L`sOܬVyy)Eg t *[g =d4˃$M m05%2 !FCL\ oƫ}IJ:τ9l4Igq79Fܜ{q_gp+>L°x^X I_u?ˌf׎݌tY))),y->_ [S|Kx$RN~oK_gʄǟV\ )rkW^tډOTF'#_ Mo3r*}{/q /9M7opJɐ^^HK1ooo._LAAPog&ZZ\ٱ}'iie L&ZN\ج)gϞl6g3?'ٽwn'v&+3 ^^_fm+g3xl<`0 @RyN?I.J>,_@AFCro G~L~8kl7*x*mxa`6?UAFQ&Z?,?g2;uHd2A@3eS5klܥ33gd ILs{tw^YYY}2d%fH :e_X"=-lZ>QQkG`\zѼ5 GILl&6.ȁNM?p_OX3ZlQgQ=7tcHH~>vRg;$ (PR)W7_!2*qX0i.^ƌwp=obԘ 2O2ey)%''lRSӘ}ddd]U2ޅjP5jѥ^'yy̌vAz9h08h.U^L5Κ(y, .Urdrddz@Lb]%Aܮ 8yHsZk{X;~: 2E =”I)g'rWN/~90\(=m%߲XK ,B 痶֌ɣT&?}09Bkb@&*v.T˙ Muy2AA'>7ksly&2+9O &R`}'#W (ʮ;~kr&#K]q}m\O  n ' C~#}nKFknvlSظjcگ4#6i:5PXXȃ=T0LD$z` pպ_14:w˗.s״}S_b\r~/srrxl<@6|W2ʐG'e5>R,822 6H3,u|0hk)] g2ZV%(Z<&{sds ~}vWE Bmsc@zg '`9!]~9tZMZj&ڞ‘|/oO:RYL&?8j5̣]v_̚y/#G']nXx_8}4&u;ar\C^ZR`^~%>73ɈrY>pm\=NdY]1͕ѐ3 BmLe_ey A?IQ\ {6wIG`_+|gh@䖔:-"!@nIҧRٝ:wLJ}t=G=BQY.‚&3^rmZ˯28O$%%_|Id(ƌˤqƙg 1a$#0V_G14\b"㈉;ˉeMQ RMhhJIwLཏuo#7'܉JyHs5k'}Fr>X!Ck #8}jTiatx;*;b2-qz___BCCڭ ǼL<}))<ʔGY㛯e r>.][ǒ8:=qGsF}MnnǍSgxݥ.??))y+W]Ǐۍu=!{: R]Buػ{=FJ]v=rt:j*XȰOF'\W6y4+ӚVc7Ar&#_](P\qLX$0)pݰhp.7p66VQwBty35'Ns)i mΞs}WF!A." A`Џ?p˗ϸ1e,[Z&AoK_GppA,f3juHhZ^P(6X:6oeʄTW^tډOTi]} 5Sרq/TGz|b䳏$7_Wɰ55Z3(|΃,]KQ<22P1Q3ͥ]sxT\W{,hy,{],Oya`WU$qd ˯cXu0}t67lڵ**'?4^ONN.^:7ғ];w^G/3&611<$˗.c6l6s+LFU.@jJ*II9y$;zէoMf~2\!\S-|f͝Wvaﳖ$O/^%(8~O{0ΩVXdؚT jdx&ZD_\7x<Eyf)7Ƶٹ}2J-h%[nԧғYY=*wPsb? X]HAp:/iO. e[tCH=ԡX0i.^ƌwpF!# Z&!0nx*%/ؕ>Bƕ << CGǁAjj゚ x' %)ys5D^pZG~O=ϲ/-z(|INhwosrrή|aw "{ 99/}s}v3 M17g L~G}]+'#[%ҙ *bk7tLFQUȇkEM7me2.:4XY6e(?]鑯vc`'lUW4A  % O ax|v-zZiӚu߭\$f;9?Drr L 4,9`H|CغkK5_Qfgݳ*lom7^rE6YVa{o.ڒWtLw Ue 3G}`gՠ8ɀl+cGyye2ҙ sI&ó\2d ־ ꒉKvP+l 2p4H1JR#F%W^2A40P&Y.AĽ8'dEQyVC]i_5(8*0F/ ?} A piҜ{tnPBs ZP>aL2|hQq]X2L ?C]`dm4dX'5oi־ m:ܘGw77WuF K? Ycm]]2ɔmL-Az8fg> ClC]T 3MzWKg2lfQ}A*t#Lo= IDATUTt-fx 3F &'lo& sM*=E\ /LFVnIvdS=_3{ =|M]%ɿd\{' Cw Ml,>zcb%99H2qf?Xoj۸x"Có "Yhߡ= y.]8,d21g?h4YYqXXA.93AT/7+{7L͠$elO %z7_9FQoه]m֓e˷(I`3E.CRy7sN@ dX{}2@*4WNNf! TE%8pR[Ү5ME"Ap@/_fd5k&w͚eSPPPanP\+ྻgMxyٟmVV3<ڵoǟŬ2rtVoΞۧ B}LS[ w6 ʮ%xf W/&f]ձf%DZK[U" w/ߞ-,5uk~Q2A!';B/>C¿ٶe+fIwL9 3+WQk&L_P(H_~î;>bwg&44_o3GY_ &u#P͵pv%.vHvN6v;湗ת3:(UjStNGRA B=qC<# uBgKbHn0HAA!Ku,dwh/ʳ _AvctNԥgNWm4>u]Z yXAjqAwT*A+ILۧMzZz}ZlAV-tfyߌWɤUB6bP(HRkVʜ[ {TWAj2AӧN+-:߀DŇwVdaVLJAAe %}Iڶk[{E箝8~?#w+_gkonAZ! AGꨏ\UL&Z-:Y3{̙gӷ72Wp"yyydge[һO0 YcsJw#Gp;@jJ*II9y$;9sv6oWB^=ؿj΂ B}2A]:;$󎓬*yzfz" 9Add*.iuEe1k]ÚUDHQQ 09t\7<֭~>MUݺsmz}X3w3:2J2`kXqal߶rZW՜|ɍ ݚӥϿ۶!7fnhoosE}iy9Zػx… شi5FsEFo_Z>^N~띷4_58No_cu63]͝޳K.gݼۛ9Su Fyå4Fh4>E{24fzjT;s3h`V/ƁdS2W9)$0gދ`l)ۧV`r;?Nα4X]3ϡA;{a ; !uTב8ܧ,lEρwC0(J>22ցH >8r`q(=8*`wa_׾M3AM~x`aB2'V'u>PVMB d(A _3Zdh46Qضmi3Hʬ=cpKH 2T63!{*Aqse#!^2+J; 4 ~If-Nvaȶ c*!F c`g[!* ̫cimu ~}dBȮZ$rP c%O2 H$8.b2 "7_FpO>kghh4s>h%wo 宕p`k1''~C[5 ( a.PO'aw@i7K)N6m3 PBMh|f̈n怤<;NC ;ĨN0! 2T`;] $.@Ov09g>G:?{!8]"SKrO*c^`62#K^6@uP9z6YaCP7L0Zdh4FsgMXZdTHM*+Fuj%TGJCA%pJiܝ@ (q0b(O]rGpa%P~0M:@~ pPޖaw!viC 9p ,!S[ +!NBf8,J,xuHZ 1R^^Rm P"p >D zm?}!Z!c2+sGO_I``Ptk BPym0WsT EFh4͡ƶ¶,dd|H&_ |yZs2cPy_0H@S%nSw·d:DFs 9\a2x)\Pny)i$40P4#KOeCmԳPe>Ay>Է Ty8mB/m9`r9'sQڣ|7E yZdh4Fr@QS.Af m;}#!-0(iy[TʐLIGºǡɀTǖVV/:[`ϓ0O|Y0gH/wIh)k13vL?3 }AuaL.vZ2A8Y+yhIGO691%YFZ?X`䔈L(G9lohx߰$@G^^НOF 旷g+Ow.Ŏ<5lܰq?Vȍ?zD8,waJ|߇89!?! ##\~4򵍱^ױr GOj py/N#翐/ǗW"D'd@(> NHNPG0 $l(" ͲdK$Ke{ 4Rblc`w֪<$z&OAuBrvUa@_)ʶ63P (C^^^D_2=`P"7HBHGQ=*E#I@*oy8vk w[|undN#a^a]W#-/++suh4mykN8{>wy}ߝ>9\׾uy{y?3hvnTU·azRmm8rtDb366q K oXVlj56nHK&ҪPUO$H~A80eyNefÑR'#!ǁ*skY').[q|X ǁ*#6sրy-[YxC;?ge0-\Rn6oب\.ǝ u`||1nQ+G'{ re< pÍOr_M8|Łt CJRC Nw>A=*JV })!;aU;+H\(m@Q($\X[(^;aW^ GCRks]vJF6x՘@\wjJ !0Bay|'UZSEJ禎ڄ$؇xi$~6T}r1e#b\ KQ}k>*uzWCړh4xb,ۢ~?=9'uҴ~C.xEu\rыdtt]|)gz6<5$wq7Z.XKCz0 y%/>%^=B M|Ι~_p9 o1w#<_psZ_0"0`/& y<`8`A R+x:'¶$JI0L{|^;~WCoT( խ@\fzz2i< mYo:oKBy]tdOLIig@i̳z{dJDs>Q`Z%½ 0G2w8-߅`DuPۂB`F2ڵOp̱3z}F._/r/n_O; wvN9)_}|p+T+Uj:=p/;|ig[6m}y رm;۶ncB@ >yYsׯ}s`bbE^ءd~ u`R:p"T!(3Th>H%% *(9Tj06*^Bۘa, 3R4 )?vIad%dWô%²є vKρ%$RL{O>Mk UFs ȷm^te&dxhx}gq֜oON:s_{] `ӛd ,`m}:e5 j_*/eۧl>7ab<|nYTA 4͗})#1 ƶ@aat'u=L'a|rpi t`)SQ2|ݑ{Ӕ01"ya^ Ȉek͎˗oM=Z:orÍ?+x#4L?=w}o~I&3> ^S?_4ܴqӌHm$Dfv -p86C@0s= Ø̓O<D/6{sP[X,X G/WC~L<~Wâá0)c(pV2 Yɥp0VZr^ ȣꑎ'7vF)4D  m@ɕx&{/YGF3ؼy:ުWQT}O22N8S2j~|3'x<ϋ_q9 B"u?{b< L睳V"I5E,j!bO6k*ti/8RX|UI9wY})'qǽl|Ðͼ/gضͭw~oy}Yn=TN<+D~ⓟ p!\B>R&ziA Tj5~ͫɏodr_]ۮ$/bp 7mᨣWr嫮@^g7 +!C74AI} 13,l9C݅a*2~r9~ 0UWQX(}0 "T*໒LQ-Ҩp-h4g1C;x_CZU^yvbYW\}.Χ>/3~(Nٶl2ns{>p 53wߺw7:lנVv ##8 #P m=-@};܃pX /JG.U5ѷZNJ1 ,StXwu'@:{c@ WY4u(M=AKh4bkCNP*hOB!q䪲ړbxU⣰ÿZ8%9 qQIHsb սPF~Xa&enIЇ   v8zP1$ uTTo+n2ftFh4FzZGbUTxP 'N*-@C[aVym-';a:KؠL@GFC˜;%#at{7SP P|Xy",_&#m"Df/L$ԪVkvh4r5͔&lsb2%IDTlP}Gab0R۴:. a .} G\9v1W.ma h_(B:]?OJK_F8&C)o ޻C VdȚʓR*^ V~IQguhEFm?4=4tfED4kh.ԇP(]'՟hw<TnDdb;vv7m2{1TDԟ4t-y l -}<uе\+Ε(?6H$`(I/%01.ey6(= ^ Է =5 "t}v?f?f{-24'4ͳ&Umm8l@G@5ww6bx 2mIoSmPm"V䔔 RCUH59"yaj`fEH.C(L%{w̅v;(0{EFh4~3WȖ?zN@,Ii\/X^ix7%P)Wl['FG"kN@at.j;`J·!lӴ67y-O,x?`"Ch4f?pΙ IDATqu <=IH730GXw$>*qI?@@/o,~cE\7a>KqhEFAe| {hۍh4%L(jjL|\>ϖlOkS:nEF́H$$L;<ܭ"hhh4sl#u19`s7.e9w2m_s}(PP~{(qg{~s7g 3T0K%/[uRH+i4́eEb&;M}{4F4x.#Xk}qOix>ƚ;sb4?5S5{2՗o%r|{NnChNBG*0%IfwxHr/96! +.Mò3d3 HfeK.H`p,>lz?6+ vܶ#@XdۤBW Bu1ze(xB(nv-MRPe<]7 /|'Ch4PB1*+K%o"o:E@tŮ`b(WX0LyPh(o*HAMCoTUfe^ Ô)?~FrvBCW#y5 +#E|6M'e,;D7;{a,90 Pj0ٶHnXt"$ԽS+b4p"`L )SH@R]vVa`Z0"VS}[&W F ݌O<160StdsBBPƸi4n6Ò#O- Œ21Ca[W˔} 1H*w!H0 %LS߾+ 'ռԊ2NhرL'z1-R".׫ zM0Twpi 5 w?jegs6,͔khr/lGKt (hT41lGƍDFmB@DH B0TsDnu,X-24Fh9֪bR 0( T ӨФ(t^yC&%P !?m@e(#;Jv´ )6Uɀt"D|>!'v>9gf$:DPU*t ECWam9C%76)㻥>DIy[xʋ2!~@u W+(T%v}U rzA^kz/ޛ"2cu"Uߕ(dEFl>QJ7^{~1s/h:8؇ձ9Xx%^A#$:*WIaT"OŃ-܊B$2"*j16U 'q\WOK"8Vs<7UbE$0j8ZQ!G*´T[p!4I@r(Trw*'aanY6߅„oe`vC;I^e'% h +Ԛ(T+U7*x2U)x[sŸԯ[*k*R׫8|A%<\AUtdh0 Ck+݌Ohhm/y;lov041?P43z ~=+ <ٯO[;(Z"-:1Qqv@=u?P&} 1' )WUair r&5>=PCMlAÂ_ (śb0-?;0ԷCr1T{ ΍09?6<KNkzWiV|!h"2 O8Jx[p[5F_c]J;yGp#,~>lV]bq+sL<vxq*Cmn<pb~Z4f71M޳?FTPh;QoaX) Gb|-HeaB%2>iz$0Hb<'#r()\%J@TA0-Óh'Wk2}m[s*<"ͽrOam@<)7lF  ǡg XG)d^9yV!)^0ZUF]XDR1-eJ`߆)@G'alLPQ]3lIoVb$~(QI$h49Hzrk;DX7%slcIBUuNeak$w{*^ʰ_<^]3,B-Ynjk*ja^d^%- Qc=+Q Ch< Kul!i1m%Piťa3mFEua,PV$P }K9^(<~EIEPMf:իrtoo-vDEm*=G֞>YM`;aĉ<& 3$h4gaFDO4,\w6Taْlt *<[-Uilgu%qXDJE0pDWJ2C:+lUq)EPP],r_* >%kquDE~<ɻ.LCUO C,TnwEPBޭrOooT kDҽcJC`-bOEaT iHk+8}HVZuFT1Oy#i^fIMBuߢEFd{ Fv^ j1U Â'h_CPQjb'ޅ^$;UMTU*cP_ rL.N.Be-PyT9$=D;T*Hu'Qܨ;wԠo֊JT߾'cR9w -"jUzdT;z_@ivJ`1Zx5${+{̤*c.iw# $ʛ~. j4fC<-`Kl{[u;!Dؽ"(8`Š?,&$$Y<풯Pw rb4nOx1qoPbF--mdxmڡ 4}NuԵ۲iXT Wyn̸Lg/UQYա*5E$ⲶfY`tIb5wU[4ѡBvGcJLp)˒-Ry Yɴ:GJ}SRJJ]ړh4 4FX-FoئD% Ǧ Iի"խv ڏgU-`6^AB PY ވTϔFu0pRu [%N&Tb̿ ;t?Pc`_!PRvR H !Cњ*Mv:rU+DzFD]UnHU%5zNHi;T*wMX] >.ҹb&ءY7FSu(SD`Toq3@BJ\_#Zdh4A@ FPaAfJ;%^=a*@fG Hf)aʓw mjc ˉp2pL@9U< H9}.JO߾` 0F¼߶z '!]ըgB$ o<&TE׮8_bL؆pTJ2_M,< =^\/%r'SOυJj\O}TGe\JOU1Sċ@R%'1` xĕ~)|76oX[P&MSήs!$@;UA-:"W$w$)+ݲx5xMh4pƞh4Oʛr*;Pˎ-;$WY)+ C `RB`zOÈC"lK^fJ"!S{%" :V9ҧ"QY)]k+K VGEJ"XsHF7b|OzxnkZCn(uLw Ǖ@%q·WC2;(բLSuS] K]TI[=N-24f;fӶ{tL@iFFL!h aR Uߕ|P"dBiHeenv_()2aar jUX`4)׫䝱hn yCX. f4tڦtJg38$-E aPAAIG" S^g@t-y[h49Xx+Wܣ=#\~7|{?N`/Zƪ|'6ul߶:Wy\߿ ?!g~_77ө|_^:e[~vAY05xŗ<1w]oU'u~`M{uVV.?!V.? 7'x/焣Nb{?rⲗRTwqg"Q_)z/ y5IlbtzuUִ&ƵGaJJTesL"z<ϷM{7,KrA:N^+KD3JжL)j$UDFgٶTyb -0 &4PW.F aH#Pr %wzI)%ɉ(= J2 ;*~N#,ǶEl[ʋR M1lu7uߠ=F3'Lbwq́cG{߹}_aYesɥ/7׿uLLHw#Wn.|gsm;j|_^t7f{߹7 I-;y7x3r@=)|k_{ 3kŋ_5ò,}lf1o|r9FFF' Cn猍hW|>qN;c;m'N$8 uP 68u>! #D@ Tn $H*}8f>,(< ?!ODebCռ7l'o$9Xm*f)q`J8)dJ@{4,lZ'E@XmRן2~َ8Fj vL:ܦ(y3%G8 Uv6*Id'hpiU3qYaT^hI[^ ړh40idp" 2 d˶d2dC:\.>ܿ;9QO=I8,JIVvp_]o~["2.{\zM0䖟¤Pdw桷٘O!]lڸ&ⰢF&b"1ʇf?t(!L, eʓxwRi e8$(/jؘ6 H8б d,<q,SzZ6,y!wTDxhδP^sUˈ%%eT㮀M] ΄vU6|ǁ_[uDҁ|FLXzTeX*Uu̸_$-KDeBhW0իd*ZQ AdLKi4_ ?Ǭ:tFGGܧ?Ϛϧ\.a#})kOYu\y+ԟ6==|{?qI'0hN9{ B# ^﵍k}]w%Yt 8Eu?\y+ykį`OiQ.gT*n헼UuV\r yWO=r? rkyC߃<3%) +(/TOۤ@rp:1 ]+׫qqR^ߋUW}=Pw pU\~Mmh4^W׽eW]i]7h<>TiK.?A^_1O> ?ck򎫯W_|ݷ6< :mo-o{s׿(Jή*sCɷh4bͨD|Tޑ0s}^iaf!Iz(/Ehn]OCJtͦ|{5hTe -tᔯ֯/]دe\}wS;S~g]BSdԺ^i{ܦ^t"gy 3<6~2VceS~N20~\Mݗi;v ln}Ѿm4c\65;22ݽy3~A@6mShq EH.ρfTuɉsE-aJV$T['$*j;;-mz䵣W8ީwpr%,¤ ݡ4rV*F aW%)'NBr:)11UaXAP%o-'ޜlqaJhUUBDi a`J)V")Zx0 jy)/wX<$D(FLV(ʘa(bŴh1d{bMl D ?'#hݦ}wDL9 A]3uG50 Jhy\"Z?ua̴Wq=_iEF0fݷ?zI93qVyy/=[e̸s>9|#g߬,\y _FVOɍJd؉XX28Ra*=)]mRz6¥!AGp五HB6'04*a98 9& $Ag!$}jS[ kc9|͓p'e:2Y(( [5- TlۉŘa)qbTM%m7fxa֥ԯeA}ܝLŠ׋'DBw( E83rJjm9OÛ18\p?=\j ]/A ُy9ϰu̖Șiְ2f8m}0+W'9:f*Nf#ߋ~v;3wӯ1jqW{|`Ol^y Si|q!Oun~b7Cw&bxS{j5B5 5")zԫ"TR ])a( ?1c%% !UBʒ'坱$::յ0s#(Ӓ6{[Ua/8\Ć{S8< JH#P*Wyy0gsae{t_*|ټv87 ,_U|nWy0Š>2RTQ:U3;d+=W8Q|#BDBJ!SzٶJxVku1_-~ydi}yR뭻ea,Q KfddJW;RqH ȱHV:+q7, 3JOOw[Ys:uܥob׺]UyγSu緅-Zdݢjt%!|PCZ֢֗"w9 Jrl}&2YUB 3h+m2wpT]^F&#߼7%,ڟNR*IF>Y G#*q5 ey_҅9nQT$dIت&:!i3`U|+4ڌ5;*_lϼ2:pp[9&C$O fzǩK ֬82^x_z[e#r˭u|߻?p˯޵?1R YC f;0)8%3I"cǟw%^Cն!T. S&ѐŒx! w9qʶ]wг/IS[o@-2ǐ[&QiK!)3*ut,04KY )i[ \1Ι i[L1MJh5PV!ڐ|-x{g.]!̇րV(?`;!,0tT tv_fzz.`Gc9ǽg)MFuZ:S(e?RNR-'}U8᜹e.syY$6!P!}XXr=]/hPdt)8;Ktɡ8B@ 7$e4Kah@i6"mqm< !hA0 ԕO:06&Dʂȴ>GMG il)!N L|-XΏC &4?5c! P>;5Y-Q_ s }Y2,!, MBBjguVEl|,0Zdѱ&H"Kߺ>9dZCpzw%}bphS#`uCQ M(GgLpƩՒ^gHU U=Y&䥌e.s$EId<%S@@i ޶ jOb_;g.o=ޖLډ`9SQkduMe~,ᜥf/$Ńb"LߗHLX4Q1m2ދ2h3F ԩ {\T:tɯ<y U<~RRA8zVq>e|ZTU UrlR<\ub\e.s%ژLv8%;@#3I#G#~Ni-;HLl["\l)3ȴ1MXpvj:`3i|47D#p串]t$~)fl=.`( : IBbF%YU 2G4$ s:`gf)9XhX&g ,]_9+˘N2'?bېDӥ,򄜠̥[(RSeUš4]3"#y7^ѵHGڋ?is$!N+Κ,+qVZrOpIkg^fWs\gE1}jAҞhdn@t Μ }o$o_gYz0ޟ$ uDž#!|BxnzgLʒԑ|NH\gTqnD,%N 8Y F"˫ v 3l#Tlp@D#_ߧch? .l VGhE)6'dN_j}[bƇە6?dZ܈6|ɡ[w~ #k>u>.|ڟؤ٢7Z\rE{Qk![X@ykÜ]$Pe)eHsҾ{j\kJ}3$]>rJ4 '>(3m̯7vGF 86,WZB,!Mbe˷g/k#O˱՗#ʈXXK $)! QbdI9Ig$1Ȉ̽a#~85#NZddi\cuT*G#eEf|Һ̌"Wx$8Fq\${֓#dT 36h6&s#Oa&6cGȏE玗Х Wy =dqc'>gOUj2&M#h4Ӕ oagQV83μ|!l*sA pLΑ؄HLDBBд1"cr4M, uiu8՚rcI;+% E.4V'J4.%zO^iBSn贌y͎a oJ{jpD]= xwya %_ߘ^hd{rh=RnKe.!q{mEZjHeCl&%kR%@1CBPmE̲/g6R )(?/:I0g_OVMᡦʽ±Dڃ34G1ʗUgW٬kE;H{*E1Qv@);鵤[!')X 9~E!)W ؿ*> ὠwvpcY=}t> O:z(6 bտ&?E‹_Ʒ&8{< \K/&Z Ӡ†l#1Z[튙\sEV!Gy9"ht(m])wdO4fם?f{r@hP"6UFZ$;&g%St,Q:Rv0҉i܎;QPU:nYZkSVA I+G`<'}''#^1/}q>/΋ 4IôĿBeڋ(oJۂpS N6xzz< Aw B4-1~VOٹq%<ʄ50G 4,QEh0$tgَwdDh`x9ڧ%bU$~ħC){,=?9ġ[G)!.ym!]4L_hdBa-k4Cؐ p>6nrm$/ƀDŎ)PUzvYU*#‰ !SfE#+jBWhǴPĺ'R&9XX\'% gr ֘efdiX:=_2 S;!Ɍ2 ]H_,^΄ JM^Ǣs-F;;eDMZ%ǟxߏe.~d LVCEJevyeFKY[+:PK1I0pe 6k4dkl15ѢL e 159UH%,1 Ӂtɕ˰ ex7Aoy2v!4${ʌ)ZS9np-aΤ-'ڐMIZIY8n&A+A/d L 6fr" |gZ1 *BYxF[8dQxX[wRTP &H 0Q[J -~bzF>[A^(N9tS5.Uծ+:Ͽ3 + 5b  Hf*Q7۷,o܆}[>`:Nal+$SiӱDp.>e"8Yh pw70䧰@uBxjLW5ѻ!Ӻ$k\C^3d66l Z_KQa {s6h& i6!l ,?{EcY8͈6_l,/'h.UY I-!E /I6'6+)@XCEAP_ڱ/-b2[,H6 IDAT+1uL-G'%P9c6dYhSW~'ͥ:Wtΰuv> j.skI>~5ldrvDlG\kC#J~/0UyQx!;{:u2od;H'GbГCjCmϊqDlog&>a.ZR{hkɩJ}8}QȒ$Z Z i֠%}m$qwJ1$ק*#'?$KYzK|YlӇfg2Z!\4)R#1dT?gk T&M51ר n8T dQzB\~RqrG&k$!x%R=]Z^e7GV镲?l|cdurwi|ǾNz'f.s\^]8~7 luT}q]fOiEthlFCT uެM9+Huv/fA5s"7|)&TJ=d K᮴έGvpݗGkq@ īLp;JS5x@re.s+.qco]kDYL$q Єyx&CXV!I|%"ZI!r֬|tYnZnY &rhDQ '֡dȉ&# 5ztemej3Qw<^dSL],QW02|UVyHٖqV<6qĄ#1a"2aGkyR`nޖe+GF]ph2R{H{/t; 0$ EYd`/‹Оj2:Y΋Wd5CAe,Eg h li2tO:2e)5,zL埔*soXvd+3RQzB%7w2UҦFdٟ./_N]PıN'Pjg :ɬӿNKXEqQyU~Li'ז\[Կxf(پUfM*TJ068I4r,;߄o<tǘ.?֗8S24kXWJ>7\ps9QE13KEã#!Q('D& %\;_M46Y_ FR4;!9T1<`fe|Wʑ%h# ۖ8ebc XV'UC^fYZV:،wSߜ)UEf,V: 2;DM%dk)T[Ei;o1M{7gj?OIߚw Gdz,w8q|Ip}~Nh4~n3mۼ~?Sc?chg|8xռfos7oA_#2kps9$ "йhD%4 -:ɹ0ޓ^1_VAƛtN~lG;ϛPZ^Z-7.ZTLRȼ7-h6a4# UGt=! A!meht`?]oZ! qP[Oe>ކ:1/5(a. v'C& <b H{B!x} p潖ɚZƬ-ҷ<)N4ENNCɿJS 2qJQS48i"LO`Z &޲;6γH4q}lAnCȰp2uv?&b,R?k,#BG8q'ߑY>W5[,ooN=Ǿ𖷼z׿<|_ά O$m7 r<;;;Q<!?C|+|o?y{lll7^z /| <\xk_ZSO=ǫ}ǩS'p?C?0s2I@{12î?'U\&%ɦmSժw^4ӷm̢ٙ7:RGilv͎:0LRgl!:l? 4㮃nB~j-h$yM!%;IxV~l,ZA~ES&Ӄ#au߄BL"){2G$D닉?ž!!mђ:{!7GFB4p(A~V!lLVȄfvYaw?y=ڏd$&&E*ahR1cvB1: */afdTECk[l<9?3PNUX`Lubq:ty-)9ǻ5A27V=9 Ir,! {&ZO\YlW}V\0QfqStCǖH^TO|8֚}c;wOMf?J;_<c_5{;ɕ+Wb}}~ O='}.\F>O=Kjxsq YXXU/"??n?'7ntߟ:sˑD{9-`^X$s8\T}Kډ^2i`HrN4,:h8aJ6 `3T*!nK2n'97g ݮԪޒ0oN:8 z2!,#| N"XXg 0gr 9/83xNj&EQ27(񩶧̷߃茄&8&#yE&e锲侈Lި8CULE-TVR\U=ۨjS!`Ƕ" kI?bxDvꙶ.mC`'3"u(Ycs&!*@)Ǒ6(ѩuFhRjƢht \^e2ko] =*6sc6vOF;iOi[$"GC0ÓgV?`eW3Q<dcx{eCZ(xGW:Uc1 җtf_U/ށmZ/}[37n裏[[ C~aO?~۶>xǽg?Y~ .5裏0ytW\Cs?HdV|w.sK$dmku`2ڑhU cri! d,|H"5Yƹ8 ZHN0$mzWEӰeAֳ}к y*%ڐu/oCk ;{suK3P벼h^LYr*Jl02DNG%y?x, :߃?/|Sn-ADɊcCBa0:XmrXV|>D_:@Aդ R86q]g׹p4:V\~%^8B6P$~grrGf~q_H 5 XLvDq,P F F)fa-E5am;ĆW04R(˚ HPM C0ʾ%#QP8CeJRo>?|AF[[[|x/_N:^sͬ/$J)_+oF֬mgyy5㰸vz)~a>Ϳ7_ 2@E<ʯBkͷ-nE_|_ooh4sCpAtV\8.;njDo|WRUCY%jSU v`xךL8  bd7>:hD4ku^EtmXXu13[akVWrڌD:2½nLBj{T{ `T7,9up^GڪԌ 2qXIiՖ5Pu>!΂sH3M7*&Q ]x4Z%,/-eams*7g7XYjG8Ru7o8#C%'vU+hP c̓,بؠh^.Q~ R_Lk$ ULTeDž)Upgbwѥ" pa&AJyT &hLA$GW%ђyIJ NMpG$4jN {o~6ҵW$Lp:i-_dV#U"(X;|_W'?ɧ>)FGy'm}k|_λΞ={x8ڵk?^xow}3U˗/?ӻ.{/gxG_e~~uT}{?s?G?Q}Qn޼ӧyӛ[m?7>F۝U(xgAwCi2ÉqW n$TOhh?`0FYsR8& |V#ZI6,њlGr~TI)1ydo-Bc gV>4xX2arP}~SvA{b>лE!2߁3g|JL8z֠^ZG|cн2)X4Z2ZSr{#2t q#vđќ,xb~f9rm]j–|b|vőΪ6]Lwdh$c j^~^u%=y?'alx˛➻ObqY16wmthv," *2Ha e[DqCX?Ιgt: F#,e-cƞOYmRjb$JevСO Yz@]83 տr =?#?˿ȏHi;<v/.]bssj${^08ozӛ\STj#??t]aFÇ>!n޼I硇⥗^s˱E- u Pd&؃ĞmC&X@ۄ'>`,ҵB}1ޖn <[@pq%7dNඉzߖ:^[<ʹ~f'Jc2cŰoHqXJئSЁwK{a/[ @ujB>m%}&]~/ev>%\>]Çu:BRMr?egCfmS A9z˒Nw7H$cz8y mک*=Y9HA"N@ԋ8c| .xnCmh7&5w0-"W"Nvɑ PDڱMIlFPXζpTLn[&.\7㱏c5A^ߡ?L8mJ2=;"$'[-jipax`(라7Z::r~#MDGqU=NrH&!yUR'ڋ8XcYvXbG8gШҹNHQ,]zE)#9IGqc2d܁ݝگZec=ƗO<O SO=OO 'r pZ4T88&6'VdiDͽW%mwvPE CI*x@:G0}߆\^~>ǧ?iO}*=~5w2XZZⳟ,뾂#\^.1;PǖХԀK~h q NpQ&%fG=6-ǽa`lB&;$ci3IqN$3~B\@̎܆95r4=qh/@ {fE hM]=UdBƁ12{WdLNMi9B8±U&)ݮ L)o@o wzh,%NI/!~~O6C$ۺhh̴Bm :݇dI%Ɉy> Q*՜5Y0W9$*Y!21?w'5w{#uao8$8VDr!rOC!Aqױq "G0bVX66gOsB۷g4}φ9e6aus^ПΪhOϼշʴ&#QD)ާi҄T#H5F*G\T Qʱ۶q]˶R gB̵OIZ'-maZ!#"i,VzJI `ߵ qxua e[j6}PʹU}͔9xM?q>O?w?+0啔5䏈MnЄL%$jR0RwtT F7lmf#I>gS@+v]"C9 ӄLdg}4DX/%WC}t[{OH{ 3t C#co_8.fWEؼݯ ,%0 h{Apԙ2S!iF@Th o NF:$@tR ~ $ oO̩6'}uomtD׉A_T{朔h"|I *JYXV5[8FE>MT܁+WpVVOٰbcXXvV(&" ׭!z VMѠBz8K=,z3X_nrq:.7\# 8tKHM,X ^:w@Eh] iAczz5z|:Udoڕ˲Phb**[Qb(bac }j45(#х-,&5XFe8Q8QcVpDULH56 Mb)Ԃ#ԝ}&'7n'Q6.*~.s\^kb][`%y리%q %Og4~b5&GF|C+%{E2C@Oh3:#ڀs^{ׅ3wA);A _C)p B$flLcqGFoT-HXg@H5cu")[ÚSޙDz'!''.hYso:vJ&F3m`w7GY, b0⇊1;i֩xmmok7 "%Z6ᘭ:8[X__& C0VstiO-G. X[ZaK^W9,.4nmb=BMpkLD)a\*Q.%Z pX\_UI2jp' 3}>$* і0YZc!mQQ,q5qbcϝfgKqi@b #Z-t<(ȏXX:b>vMṟ153(Y{5Y8̬OAYM\CQ{jt3HFiwF3e.w@OB/|#!3ٲbv2ͻhɱ;4`hK)e]F0>X6ԋC!+d9 $*C&y1"dGBfeP:ȴ;"jp@&oH$E9hdbeUe`zIАf7BY_Z N R)"c;ı^]Crkx>cB,bbpXXc1(Zsx5ׯR4MЦlV} aiغ}nKwR.^Gk[x͚CͲik:&B?+^d$r"*^ Uir21Pu\OȆIX B3$ e&(8K@ KlӨ;άa4l kt{CNel)\b< Ðe1Q^Kw[ A2bt15[4>Ǡ;^\$2vc[k5::jmh4e6p },E5H!2B0s-.ʰdOӫ"?HMB<MR9:Kn٭&&QQD1zu(D!(Vk㰴!=Fn±-_SOjrKcl5糴;ۄA6V|^VilPir$ 8 k4쬢<u)똊%mhc.UEbb2ϗ8d&Rf9"E>$٧T{oRo|/8WaaY*u@h8|F?vn i/U}n|F_ +fS-PbBj t:-`VC 0pͯJQY@]` ^k>AS|͵dva1"F6c,Y\^آ*vpuv(EQDz\^rC-,D FQzcG*Ѩh6\l"Vǰ?deyo~I|/^kpuj:kBbc[hVPBMQ-<]:Lr 횀kS;0ǐ$*0_*|/d<FШՈFfFY' v:y>+<XXhǬ}?5Xu,Ki7Z]w =t1z7n̳/|ǵp]k"-]_kie/jt?;(i0e&kW㨸_OY$#CNs\rgW NѷThRq (;fk;`$; # Ms؈6OWz[k~VȆ7\ D[1t=3rZ@g 5ԗđ=A_:.Uq~ٲ*d WfM2}[!ޕu ޷ RI2,+ok_$EhYRFGqVf$#0&u~~dHTQ}}2n-BF]6Μba >^m3}8BY.nR6= F{/5:aCcm[v#ḏ׃(Ss4Yl׹޿Nnh5C{I00J8z+3wE5-Z95+*QV2#.^U.Sv145&"F![zZʲtEW:Dހka(ի^X/\{k\t׆pSgΰ3Wyѷ1k+w=c%zj}"~leu}ǂI|OtAT k\$!ԕ>1ݤ.}1C$Ze-36ڭFڑN\2c%V`,Vt`I2Đp 2`Aܟ]|gHIm63 !>j͟@ H] "~M! K+[iC&Z-!+B z޺- #wJiiHsYYDRM`ODWe* -c3>et C0IYS7 u l|gDkRmc6e1jov- 3\}ZڎE'u3SY%`$y//3;}߃+_3dO4jG|4@Bz]pKHW Gʁ`p 1KLb2*M1QT4 w40 !jўVdL;VbVe3;'+w<(u֊ވ^dԭ?p-bm1i%)"z ||?dA?A+iikKDQi{,#?C#wv:Y^Z(ĺþksI8u$UB3I~jO2wsA™Tq<ʫmKY50`94[ >`[x[\cB=jkØzK׮y>f7o2=Muv=PV=X Tx!\qA>CeѶEDZ?rLHv>%鐄X sǦDΛ1 l; z%rBe.s@r.<wCeqNI8<([vә9u:GQ{zA"%s&B0w{u %$#2sQMuV]}R4ʆHן|7 fbIn o/Ap Mrዒj@hlVa Fy em%g#H/d~ 1m4Z2Z!}6LY\߲ 2)۝CdMU4*,BU1HtNWH!˶|d iu q Mb4lvm+Ei7a01 CЃHiz:SެX1FwvvYZ^c0eȅ /l阑VQ{}bN')kS@jU1arl;gBUM2,qiR8Ҧ3NFc/1 ml|_Ź5!Sc4硔`X?{odIvsΉʪB @$Au-붖Z4ڤB{kɴ6-.mlM6VPY1Ǜ^-""+ $@'-2=|99lAQVC8k%yQ1M*iWֆtNgġ~C K>+N\$3:{, ]pczm dl65F&q]*ִp8jI]ߑcٝ DK>@{W.q5 kM|G a)K0gHt~&d3g')O·=_S{"> dM^}_d`6GA OնڦuӦ,Hq=Ů'xk望qjnMO 4cbd{זU,+zF@7 {0Nʻڪ;1sX<$Q-F@]!Aؖi5Nk@k&|Q4J+d:MiBĔYN]הyvt65pWN CIHeΖQ ڢ=&9qg8 &آbQJc:}fyYX, ,(_.lm56S׿OVs6;2qgܵ_ie.ڶ(u]3Θ fU Ca="stt1 }O~wQBn# 9G? 5ռbNQĞ/ ,g6ͧ #4>3EG{ŜьGԵ ]a}EښmyL8ws:i}~3r۹m'7K;m3b,cٝ%xΕҐJBe6,Ȅ !X9W`{,U)yT/MľKhb6o/@5N'b$lU߅x&/es QߒEe`YJɢ{U|B%qnub͙ZDZSo9cfM]`g4 $I޹OƯ֧p8ױ p8R SlWt; 4NuEeuU(b8R5Qܡ,+L(+KD:xA+PW5UEIY9f( P㏿}Ƚ|PԖjtekGQQzs<5窍׫smM6 Ւ6uWFZ5@wqpsjΡ=Ҋ}NO>R6>d:<}C'MR@cKppy9?_';eh,#S9_<&c|SRQs~9rL<Q֚(,tpAc boCm^ 0n\Z=ڄ/[ff c܁;;Z8ޚSZ!lF&[9f1hײXXoIlX:׬ &B=D` `{"8AwOP$Lt!/*$b w߇G?x!n_6cҺǍC}w:s24ۥ|כz"\Lk4qc:RlMDo`׀$Mp=ujbPٕ\;nR)&P>Tӏk:rlNS xa@^:jkcx5" vvy{|s( /M]r=yHQ,E&;;rS;,N!)K=QY%@TrK0SѝIB1lF?Xewg[Z$uqn 6uÏ$7ByRaA}a~O?<t g? '/.:=_'f?>9br-wmq,Z<]ũX9z.-e.JGȓ^Db 7[̆ꬱM޾ɸޖ[|sqݷ[FmGחuXkWՋhF{EI'WSIMX `>S:iBdyQ9iGD\'KZڪ(30$|Nt{=jcqDYF!ZX㈣l^?c>`ꌫɜ(qatϹޚѾ.F}!QL ,"-l=lb5鳡ؤI~JCU? TɛOE ;NgG(by8XLTEt4壜\]I$ql,kʪCg|tx~SNyXhה$^˴]|߷s-Xx+Se_d_nq]:ȸ;AkG,\uvKR<6"%Q3!y!@H؏; a'ʲ{`;a!.Z]B6'_ ~_ZXSx#s _'>y/!݅,t)O[,ts9:fK`\ zͲVYThnߢD_e{߈xSqom7@:VKt-v}:V_CSщ<>zL9frul1bKt:؈<u o~x^%}$`or'N{x <_dYc"b3]I ڧv>~.dy6c^w+ZK>$BoF~F[sx̿[ϓs4ɿJ-- z-;՜3jvMoQ@'Ϟ-2<%*1H8ܡI9;;' <>لŴSpG-% # &c|PSlӥ,K=&9U`4[1͙t4mRCfn5M\MVߤbz(WmRZʮ.c 8uM677&#Mº:o׏&=@V朕FER5#u}y?ud B! y<| U)L`E!c4 mw>:cUP0>6gY[ EV̺f #a3z  ~ k_dȸ=vZ.';+kÕR(O76QKWO+@KBń|˜hl:E9b6CkI2OQ_pZLϿ?фɔ^7hv)VYˋSvze9V\MK~F9WWFqbÏS2 Qa1<%1nTXj<UBztֽ5l .VvAZ)'c0" }gGhJgơ1N1[hߓ~1 Nf /$id9SxA@?Al`3( *PK_*}1nB`kl]ܿb6[ 8j_Cgٵ ` \YB&anڧz ٝٝ7ei. 2{ɪƕTR RD{~nvF$rK$;څτHR8~%@ EZeO Bڳc qe5#>ŅܻJyMZ#/5U@< +.f +>{9j2e(Krc׍p1U\~TpY_ڔmDžUޛdx*$E]oemH֤mnKY?j[Ӳy5(r)T5$1Nb8cb}͢ȩ k-.c,<9Ub4|F=8I$r$iD<}k*c9>=# }ہ| ÛcmNaڔ{Ry `r B($&b$W$Crm-w(a:o7#궛+FGXz~oGWֹ΢O9B|Ô9lʫsO)qy(ݡ* ϣ;@c?Qp!%uU`lE|4e4sv5&- XT0+f4YP[vxcLm]KHA2L1AeUw([HQT%ш*ue5EIxZ<ia2m%[2-ڏJB+Zj!]izlܭuE6-oTjn[o |}?'gϯo h;;;ו$ 3xc"@]@OIFH闒_Cx,._C]69)As ;k흘 56k.rw2?V^r]ʅۈT Umҡ\  |:"Ty6I;Xk}QN-2޲dm^,#~p8֎G!E(.gT(9d:ѐC KwggjZ86Xg0Xӂ8~(K'_5 Fo弭?{bCR^kX>[ė_Zr;,tU߻J{mV@;;o`۽'@wHk:G`kPX, ?>yg!/mEܜkq bu}}*Ynu0ҽukkTMs7_9< ΉAH՘l) N1QhNOOwtJ|x4" 5{{;S㑣=Pv^_ FGEq,8UBo\~>2_8H| gSN`dHcOQ౷c2`onOmNDŽ"s: Sy8E|ז X,IYscjII Za۹X~Tu\6y.AP p!=$ .V\5z={6m6 F-ou46 X,vϬC$o=m[ȸ;_ui^dg{8ȧx c&u>~ W,@rR|p=} >T(^`i9 Lʙ>< c``OCB>޷v s@o.~^#Hp60Ë >HI"yu /? UI. mb.epQƯ8|/?k;_XEv}R9C)}ݧu9lJj)F*[Z*]]izRWy"󪿔Gr΂ $g}9o@ qqi-nIlxahV#ތVZhт6BFGt>2)||E=gY,`2G 6YFۥ,3l&%C.QqN]fY>yw SJf.??/ln bL*"%1<`>SG̦S}^uX%QIק7Ȇs8cEٔKVSj* n*{o5L|Jr}7?^ &bk(9|%ix>Z);MpuyE%|4" ꪔ1%<0UNax tiʪf/ֱHg%cpJQ9Gm,4fc=~J]e^k.F3 ˆ=|ȷ^L.cg Gc]1J\)^ki8N*bP]C 'RU|̹FHCٜ J%Ș~}ȾV.rЦػ޶fH4aMﯡ.k*@{ZCZ$Ҥ& 5 .J35nJRZkn>>EV3ω4TC[ j<^>e!^c21[G Ar1x}:fVh^pZ$TUMSsTeqK}2cI^c}n'% }F+9Myhk|k9+{ãCg0.p886FZkʲdIۖPC/LR+6 )6[kֶ[;*rN=X(;oKnr}M{gwvgw[lvE POX&up>>`=ŇpzwOLa4 }aG&/zFTzU'Z{!/՚sDω7Hl&@ Pebo)̮}38z_Ga=~/MxG {0WD1x^BU.eg@C8 ˠdLB=s=T ~ ]N=zP1T,K.ex !ҩ6t% c=DňU)ݿ3Y.Eͭe*hL7tp©] 0mQ8&wNs󺤗D 0u(k"Ʉ~t2È0>lE>ω?Q^)~%KH ] W#N@Vk'l̫ 8#{=jS32 >.ՔY Pd2AyA! #|ktHjjnK-Aߚm{U[yH8|zKZBݜkgI5¥u%C@I PyhS|`pě1GAhZa#O1uMtZcA ʊ"g$"0Gh!8<dejg1>GNBi*LSBy(t#Mk@-4n͝IK'CoJ oD48Yr[ |S[ߤ !2=˛G\%^Jɐe͞6(+Xap%/λ@~,,߇8C~f|gjw9N%T\tnY00WuTOJqo0dS*`t|_P\E%2(I%/pen[WmEY //=b6GQ1eQ`*E>]N+B?HCi疫łŋo>X1F)0阋G}.U]RE%b i&k*'qLFxZ&)x>ڏ lEi 5(I/quJG$qpAg%_5WD" plzV%{>sG,D+<)z]Ӡ|qk tm3'g[IDb/r(gFͻhÒ?i*_)kWٕRb Fk<Zh޲ukcRs[!%o7wٝS5'G"9 xvKN}aD/2cPPx88\| # !y W_ƒ˱ރə&৐ -@T?~)=MIّ0u|v!3mJD*tu*(#R2<0O!rKI1yHh+_u10>f~* gw|_P}Y"@^z}jeODr$#Mt+ynjP.~?u)=} ٲ *DNTYw͖)u}ҁu-qsxf/%9$N@I˔HZ+N14na?"@ l>l*_e:{8c ^^[Jg9$e@4~3TϽGss~/aL^v֡hBՄ/f47^- }SP3a4 C=&)Y1M2B<-c5=rK]1߫nÚ|a# 5uUo^ZSm^-PgRη^X@cDq@,ᐣAWQg7)+E^t1غd2ip e@[kT<u]S3zu0g_{<ǏD1cO`Wp  #/<7ݕd+?qt{r =U>/t/ˏ!܅xI´ٗ(/,?%Fc3aw:g<$AB x>LOȄ(YUjeLLpKIV$r/J:Wc>\ T|Hy/`i*_-dN/lS]t7 } dd=wҍ7/X5r[_Mbm?ε8iBM1;]]ɦSc>}]$bex"}./ ˫!ԔUNmj2G;rfb~(=~դD1OH<{3͹ŋW3OJ_;4 =(0yBv98SU5Dڢض\g+:4WԵWtTU&aW.slBIֹ%Y6S5ZB8Bf&'#C8D7ҟ82pUE5tzFWf^G>Nء_Lf9֊~7A) sJ{MIIVq5䥣v0)g  c~g` 8FK^TkM%2.9Ўvګ(nSbdmX vo nNa|+ο1F@GS鬽ƤI֡=myuio 9'c>0[,O%G`\ ;R y.D4,^|i1o>Dٵj="ƧPd} @I#fa\~.%{L`zho1ٹ$z{T~ּHϖr0Byq鼑R+` =$OAC=٘m:W 0= y*S9͠!̞ ]0 6_)KYY|{[@=* Y1t`r {@# L'"J/9QouD/զ< 6zst}o%:~ش*Q*b@ׄ$ԆShU9|CmITd@& Cߧ(rJbhm񴢗DhkĞC+v}ϗS94Ta(`pzvN'DO%ho"2$@M2HE8G8gVc,T i$DcJ&,k^;C>-2:9Ck8~@'ƙzd}`f2nZYl0lB|OOL]Qe{yhkcրs hHiݰr)m@ȵZ_O(jKUrhe"9'C1wvgwdJ$7I:MBg} 8Vy:XI885,ރoA~!N~$?H%Br0 PN`cK}HzߑtpS~W\O| a7C̀y8?gb܁O!=f=Y\;2?v!$Wk@sg]);8璿Sa.˗s1Z0*|V1,8OuH҄ z."40UjHԵ󂦨bգm\ 6b;T{.NPڽ:Tpn-t^𕡘 qu^/ӈbģ. *KOX k UU{a¢x*ۧk'Bo,eY㔏i* yŢp~Y\Mi0a8$(+A yK |m̒\K`7Ve-MY2ܚ]oL+ђ͒肥 Kfl HZB/Nu1a60:Mxh;;oj1x{ N).G8)$}%`ʅO`6<{ IU N$^[qeL/dD a0Oѿ#x-*?[Ca3)/(=^y\D:@F/9!_ CbHz=o24T{}UWZ"7˧Œ8+9(T+[ ?]u{%_%[14 i@ uQ%'e1R@VeIE(d4%n0йcTuCt,}ɲ( hͭ- $IخnZmx0k˾b!{MGfòŰ|rDM б X,s^GΦ$Ku6 Xrxz?p65X_xuoUk tu+S 4AO\?}!0?8]SKy蜗C1L%M:E?&=.(&Pw FBE;I(Һc(kqΞDa1FMζ6%7y+{)D:~55NB90y 3"EN{[_D9؅vW(@q Xy<܂܂N2x57\ tcB22~@m10)ެ}ͳp~6ޣwOIenC揄WCj;P}lWRŮ7,-)O{5|f_aEooX|];|/ jiV`/Z_|8^Z|bZj^,%7Wϧ,gZ}91{CA]96:4tMkdi*eƍ$bzzJUuNa I M$$f c3v61KGbBH#KܺOR&jޒe Œ(i=6dZ5plPԧ<::w5G''81o`5JktF $j[g=(Kj&ڟy@5:/漞XMG,V՛4fk9jFa 0zb6!DFQWu:k4|4ld1XQVYQ6 M򼠬ZhX,K6đa43Cd&֞l[0pG?QNK|eE=UQcX9N1c{{CʪvD!VF,#ОG__^z'p8(Zs׊G|e~Uܛ 6;'Gk^}VYBCs켃7JLPXYR`X.OS[/;8|jEބ\2Z 5x ;N2AD 4OJ<;/KaO{cH^`^D$A!l6Paٟ|"+}R_O#bpx|IswE=j ^[1qҥ#ٖ6PW2) =FRޥ;N Fy `˹]̥='{[B{ gk{2z.^RŗȹKw{@?ͻ9 Τj 9+<&Tn;k[%~/&0ZkIY-]#rGh֭ TP=\b%GxY'+=yDܧ$6CMAHS.lGLNILT,b14y1a`ăOH҄mi6 (q 4{׶˚y im`*y}@ۀ- HDԮsGӴTyNc[Mؠh 0eUtrmM^TI./޾$싳KҦ.ycriʃ_QX/' u=u-qhڀ0 0жZy=1/ȗhM367|`2Ȯѵ#NO͍M,EGdJ]לN&N8G<><:Ee8םe6=#SV%qqFq|| e19\./ԹB1)?*xQ`.uX*rjk23Ý#н>aN+jꯐs~/mg1QLgAQ"Y08~WⳚ@.>=o^U\U\ w f7ɿ7kPރ.0&N ۂSܦGm8Z# VKP1eV>"xp$/\1`,@!RpRC#>{uPܯw;߄H*-, as[)dCAMᘼǥ $A't p4o´͏\/EmഀEvw#oBjUkԎ 2=s^`S =m@yu"Ӿ#}ϻwau[IFhLd}$u-IR@<'T|_h#twnJ\fk Z96e#" l=u]SKXTaqmwD^ԴmM۶t]r2$M"u]g ABjQPS%hH8HJp4RwZzǏD)>m=a$)6dV&Җ,rQ{;{x4IE6`LWD;.scWE)W9{Sub*)u+)8Mozݖ͒(t$[)1q㬧kmq K[J{OփcBP)}(˩%)@-oA!mq Z<;Iw;;+:!_6^WCo@Iݕe,+&P߇Y(ɼ0!1ınߐ-N {}c`c1KҮg%og{Jw#]mD68T aWBrO?6>wXFHt,H:A^VKᨌo&@ToB2 ~P\:V'@ A'ף' IGh^[}=HbY5;DQb`Yr*i]5J1HC6 ۣݍh%mY]cd)^QZ0"#4#SV,%ј|I۵T͛Ϻʋ4 ƘlDK֝gQ-IymY. x@E+r.G ̦sFYBtUG]\K/(0M8-h' ,"N0Zɕv3ڪ8?=ޗG!ZY-B5*w"⼥iN]Β!@9( n}E6lomJ XrFtΒ {;LiI#a8`-d`m}Qj5 a@M$TUIQhƣ=WlnnP5m'|9ĘCI-^wL ZkALQ '); E gZM44 ''6Cל0fXq6~S ~*.~YUrq6g~<}![#VH]4qknɐWԺ >ܳ k-WqWqtK~(~ 8H_]"7%a6¡$7a0އxM  ĉ:|jV維CQ! =h0=%M5Ho;M {p M)߅O <(;+2| #$ )<Bf_RT=l XJ~u ~>"ЪތW^ SqvAܯLN^PtVBx.e{;#H_oΫ=Y;J)" ޭ+n+yX: {\; 0Y]14#h6NS2lYb*٩t7 .ģQwQ=yw롔&xGqXv-]u+!Vo}qu|8bI)· R @9o-MURmq]њa6@iEY( cg{e^8p]t:ek<eX"GQD%mHLSN&Ks:+y罯иR,sF[.lg}G4,;2'Tbℓٌ0K:j}0J9L[i?j528>> uTU~ZU%ʇX~E;+'|ӯ=>6B/+xZ4g[9/*1g WqWqG'/ '~Wħay4oBv9YvF=1A7[z4gQYIʙt  GNxp`{߅kS>d{BSqPCPZ8Y0!H3lސutfIw? brӯKgX++cPtH)'b`xE> U!?` ю(v-Tkl 'I.B7V bYbɵo"@iD*c =wɸ6Ӈ:w^fj@Ӷ z8-NCČFCʪkj(u&trD+EeCnz_1i( HCmN@1D|N/) kevkhꚍ Zㄺ I  UY脭ֈȇ!* &l,G_y_}.qJc4ښ,uIs:smo}c0j;$qF9\穊0 QFGI`{O(%;NN/ SKq5}" _*jU(4{G۶`;눣PAR,g$IJƽoOdccHE $Nc8 ,sypu ceMzl\SG)* qKz` Xg?FU8Bmsڼ$CwM|>coW ,Q߭_:Ÿ_nƺuê˰. X\gUqZCϮso\9Kvaj<WEUďE!x?{c3;~[evvw '?˾_ ?`i(.& =I&7nJ$\RTJ^7pҡ<݆Pf±͡uXs.m,a.Ow^Á$A2խ")Dw5daBBXB&Ra]O^La#߀ac[' wctY x)Mo@5p ^PK'ߑH2]ӕ8/ ,܅2vA&P=)0T(N um<ۯA}6nH^tS/A)ݐB_v2V8ٮO EF`DuvvwyMӒ9EYD2 2ܵAN|;;{oJ[i6761'MC','GkARV5[V4-w8멢,x9IඳXI!AtXt+6 Z6x =ae*ـ82ܺu$6ƻ8Ztr=h GTuG &LxDQDDQBEs^;aJ^֡-Is8sXzWԎr^#LSںr `e:sp0uQ6bֳ!ΝKA0Km;T]V/{ժRunCߦib"âj}&RWWO-vv/,;:<Tܽ>=w3e1U}Hd`* E) T'@2N瀃(rx`8p[<$fUqVʇ2n|H:&ՕoHw`vØ ~WxNH^ͤ\!zB^ št o6_w_tǰr*MxtT"r  @"9J/~U##&םI 4z\wcͤcS:H!>-I7}3F5ݑ.V:{v!Y^R_a~ p㝸 >P"Is F+0ijk>@(etm4F)ΐOkE].M+8] meuQl0@iC$yц(n0ALݴTĄ%R|(( H׮r EՁtγ+y`8"#t`뚦툣;BbL~5ýMpCZ2lo_9^J_*^a/fz5[%eu1ZS9u bCIC ((ˊl6cZ „ J||9AmkIswnhq(i:T0A6bo / O4rIA5N:˜|)fmtI-T咢*,X4^)ڦ% iV]pmg]@QXr$2p@&Bx ;#I?$_.Y㝺P@YօWӯ %YlW{r 8Kۼn/?OO_O[?×%%?oIw*~ƹ+/] R'I7#a{RR~٦tIgC g|G#U3[R ;lx-m Y-<'3@}Gxhc)FZhMhdr]' _J&6`[)0E/kITbs0U0?tOQ/{RЅ/ )pWt*dK(߂u)F}'h=XȾ*pkH:7.Rp؅Fq~'@! J@ H_3b_s!MFJuv?{_=2Z<3ͨZ2E~5I0pbg a4r(%r1SY" hmH8I P0k[1q,\+L>8E+A!i2qS8PTk5=Z{6g{+?>QRN&OX.gp44+ Ei4,a1M` {(˒({O]?'#|, Z~ƥ_~.^^+EGsW:?z/_GG~2ƛ||*+ fBԠjIT?~&GpXQ͸35@n>jT_"`'d:#f;CqRH,kOϤ6Ay^a? /CH\.-oDl*^G(:5͏6Fi]+ZV.߄tN«ɹĈGG[ U45ŸM9:e. BoY0sQjQܓ k8w圚XԳ>pp~Г{(\:\ꬨP|?5J~M]`bװX,~st]GFgpUc asdZ=,<'/JeI$d`Dјl8d8F+pш(,9M''G\g0Pme e9_r1MYLOE+I>o|,/}W;3xCf7Ơ#]%Wl,m!Rm c!9O`Ui{T~90 skCVԔ0f+*W].,OXÍikضHOIaOU&6X>`$\b.ШnP{?+DL/`[a$~L(4tG@uJ_M߉0hJx4mm @*6mתz Zw). f&jsYFEeI۶chۖO:(1ưt:k_{Y+Pb׶);)[M2B LsD!F,#s& F#L)$X,sl`K*b/|x|/Y~ᗿdV`ц( B16ZhfE)YVtY*=Yq1;yRx9gkglK+n B|JS׼'XĨdȝev yQ3R^k__|jcW˂"ǹdN6,%]0 Gx] c6a@YhH)˂xRW9z d) 8>'y#x{OMbk{ MVy Ջ)\+؜wvRtx*loxQ8ZkwYq@|̹cys%ESҜ+ U| %0m_u^xy?~_*~Ng@?O~ d/ J\ރh7 $ _ulB?#Ȍ὾a̞}s:|O佛aJC0/ '"e? T˰}ax(NS9- |DL~7BwR[pt867A!JS[/>c"q%a0*ğ2xHYPh>)_I/?tG!v88y6oB_N9㰜CJΟ-~H=>wx[Kw$z)IIY^(-5<o jS"cX/*S2UF JiLpyEQ0hێ ,%M3e.;xA]7k džbҥYвtmHn-*(ˆ9:lKS7|Gu]xmuTutJń&`$ yp4m8=>esstJ/ ߵ>~LĨ1Q2 ʎ@kΑb4PK67ȋ۵xh$&B/0B1.1@ﴎ­%+_AU\ '+_տV | TYָR_{P΂x˒f6(kH7vkxՏR/P,Kt{mw޽K$ GL(ep҈mHYh۷R6L&x4,#!M"$ɣ#ms:ٌiCRs IDAT,}Yq{F)$т-d1E3JYGSոn՝STuw^h9ӹi$ e]:Gu0.;ԏj^D֟fhq:P;g[qtVgų v"VO>NuS˚czrA+~*6F\?_<3?W#~;eWO}W2i*[I$|ZފSIg_dG9(=$7X!'p`DmHmG*i`X\m)"nBv/FuD}!ÓuT&sҫWpDT$3Il{?Y9^}=Dz4Ey$Y7%^2mIwobOm)Y*v]4 _Io,8%gP]}$HRSA a Y 6B:xWo䷚<Uw=͏/xPBnOelC9Ϗr|pq J!A .`քq:ڮ#c!L4 dA7(s2!csخC7os^ǣP\,3n<012 #5{6no# nш|)ZFstt&c ׯd:]4JOk; *$&*990 ONnK]pj0(:lS7uݐh4.slא8Ɠ8kqy[u@[kS(vdYF]xְ).kE1g[+){evthppm|p ;6F0"ވ >Ö/?ys'LڄzTSO>s痹Xoܾqq4%?&kO*//gݟ]?/ _y~Kh4?Y[Bd0 >%3JIaT wC%\zߊzAp/ȏWyO$zBH{򭍜/FsCr_ C9c,q7@'") }_!l 1@h!zQdWd褸0($ VFyXB] o'N*9h{lÃb\3ⷦj Qv/#c2VIʨm/I34կ~,Һ%ZnI:KYv,(* ]YbzseQvH 8`6R'8'eYQ%A/EMuxJDh(d4HOPylZqx`k&LmQl='Y[;"Z"_64uцq#CAH4hB.tuM(9 h4anZ)voleTҪ8+8.S+0X;SmUq!K0Kaӡ(ǨCm?3|H\7o\C)1 4KIb!h2?|nEEѢpN9?'K_U._zj7ƅǟg Ǯ]?"=iX̨3XA&a-$ϣPOK0}(v'2_=[R|v1HѾ#3^HT/400)l(~KR<9Q"*J;+v2Ui{ "|$~ 9'^4JGhWSh"n.N꾑n}tߒG3.HNGpv>G\Q)'dG,3[U2׏A L}D@>FP@Ť/N{xo^A3cE ^'Ja4MɋBjL*,ETرC s:kɋwtY,"kDIH >XkEQatROGjS( >vs]gvtD7$arA >eh( m:шuLS)M㨫wyh@i#MZ *IqCqTgV4NqB^4|(6Fkq aPR% % а%JC(f6\g{o |h[IfbA=X*Vub%qlY/] 4`}s80xڂ jFᵢ,JT/s-~z>ʯ_csyl)uW_#z PM)S9sMK] .I3ƃ ۶ŒXΎ`<ސ.eYR5Ŝ&O1a U(S;LR]sgJ<8e5`{2f=zL5q Me]%TڜsS%2MPuЏKn)BNŚV`m/'? ?skWEU\U|"$u]/U%!Z 9sNNw2;u NȬzz]ֳ!8EI&nD|]k],IDY$fGgɌ6Osهa5e"`Wx*%e3Dy/Х4u9l or.vn 9k/ ^cwS#ކCp ] 3LYT[Bb/e]1>pKϛ%4o{N:9fWb#;.=A'`r~Ő/yO uTZ2{O d5T+!MEh𑏾[oŻp8ar6g8"cv6oi; @Yc׆<$2d\)fեDOYk.eM!_.>vk19dQ/ >\h1TEA]Wl5iҖ, 66]KU(R^v:M˓ Y2f}׵4=_\䋜dJSUN|?-&1& c6N|OѴhI␽锗glp)dʋsMp^1gTUͲ,i;fĖJ;q5᠀@+ca_G5Ut4"Ll LhoCs( ޛS [|[ޒ8˔21 Tzq~E-a*D&O%!u9,6Lw(l_@@q!ӃpՑuЬE2(=[XíA6BSzώ<߷uX^C̐r..OO=baX'"˄%DX p DQ}ۼ/@@-4ysC 8%LH3LOOw=,kyڝA7)o;$m3 DkE]$IB\^vxLsʢ0OaE+j'2U:Y% Q7ȈC?d9`=qr|A!/[ qJU9囲j [x +1xeo4do[.{jv}H9tz4vxwhl㮂 viW*%mHӟ6OTw߭[;pn op?n! }+m/xlήEUe21'm>kXIa2Xlt8 8/CzKC)EzEqw p}?7EbBOl;ACEG0](?u}X 8sB %} | )F%<)QH{2غ|}yϫ^+lk9fuO%b h%̰+@2ɟ|&L2G2Grl 5ËNΏ7f2P*ק ^m^`-;Me(-j9?k;fSU5u]:hmi5MSoUNja%g''yNHFM#z0`o%Ut4`ʲse2bCUK/8o98l6%IҬ7բ' a8ڏ+$fޠ%5D؀(pud2Z75j)V NuG _x˴lZ [{[*уϸWDz qǃViަEKP{cÐ0KAru`0d2$=ZEUQ +u%ށk-egzw1Om2eO)DtZ&❄UE笚Z)Pڃ#n,k|j1gdy96Iˊ`ӧO[L$C|]R75ӽ}MO8f0{+;גQP,8Lе5f|FՊ. (šJ);L;ծ yT_ou xߊ?YϷ8Ki@X0l+&J3^3W6a~'ܟzt?p>(לuno|ٰϥ\j*sOԱ I ,ޕ Ç0ރťÑh#%T̤s?tד֕t _\)j1@a򦈺D&]Tue){S`$ bv;^_9 z: mx z Sf.LJ7!eks LUOD,>a _cd2ڗtq*S619_,̦=U* xuI),ޢEhO`uW$=}G^4Tn M Ӣ#E*1%lO"N_[0x'R>\l(KgUC{2hw0Y.$i. mlxmO(61^ve=?e#Iϟa('sa m,U݈)$ͨ4h "icʲ"V^$ILXʺZl@Et2庥kp3,W5*^椙AhXS.L Kj[PwnD_oHϽ;l36T]vrzkUA逢Ixg<4d<ݶYzշJmi0N۴wt5 A`fޝCIB` ,y'nSL uV"V_W£iUHfh }GTmt-.^;h֛l8s01M(MQW5eж'Mrcqdh?yL$iB4DAl  x~|xO۹p&oQM5AWV>;)pAqkp4y)Sʀڧy}&5{|3׀ח¡%ј~W~~W~ ~7>^(ѯnͺY1g0HR<14F@[ :IŶ*de;:ЬD4F@2`c)fm_^^;YE^U@(bᨿO$S !~d_X~,j/:{4C;_? T?ǰ=ށ-/ko}*}+ipt~gz=߶x`ސ$(IX,DQDe, qS%oߦ( <'/ NOϨfGRZ]R+Ն T!:ut]h0%y\\O!RUyYaL c./4 \KAjPf)sLYWN٧l I6|ۢ! fMYPtd'Ծ!2ހ:FIh 㔽)Ahw_.rQIoMWZ]u6[]jJ[m}m@Wb 9OGե.Z|1_/8==^y&{S8sK*L:K[:֋u;[e6J-/ONi;ߧ{l`Ȳe,u@ J 0]}uYtMGZk뒊ie,y|κy^Q*dQ%EuA5p:i:i_j]5y{Ih\'֛oaZQ `:ω8NPƀD!4V=IVJ(uu:fZ\kC+Vck6c{m UJ1]p6,E;v 4\zi;|Xᯁ4s4?"W>d(/g/~m7/޺5 ɟpϛi?GwS^^$ |!64a݋m8#Xokx>DJ w.墚E˱H&6 Od`D/BМA3p1}E~)r!7 8X:|&׊$-e{ IDAT: k@G4d?IFBʟ_# ۶.*)TS6JtR?_JW0#9  @A| }\/VD< GCqrK߄0 ֧^s!gJӴj Yk[wmS)P:9X8󹀎'?%Q)ISΡE9 '{۵܊6uhm1&;O^\fd\aZҔU 61tohڎI: b/xM^cm5I2Lxavsܻjk ,tu-)՜@;s˳s 5IL`RW$R7}m{y|ZwqAӺ+ JRbZ,m bks^]q16;ТAR%ƀՠ|G^c:hۖl讣k[zAvENU7[mN^qrvN8҄IH:jC%Jl3DJGwA5&5MY,uK2=8`vqNUp ; QPT5xek#Q-V4_o'߻UJQ5&1'Ϟ:0˂{8*J0&Nř,CXWZbɅ|θ"+ \<jֆPƵ(J&X@M@Ik5u Y=d}_ǏS;/X;ͷnxT7fݬh)D0݃1 ^r` S';\ܧf⢴Wa>Ճ9ݯHm8?,/8FSz{ ~@M^Gyݖ0x FD]wz8h#t@E+H$<@T"r{0*FWg߾wHR6I| ;B)WקNT[l$q9AsvZWiÐ0 i`qqqAYUhm2MUU5o`y[j/vU0_,i( w r5q<x"/K1fM'$Y&ݵZFիi]ukOQ.0dYj 5c>[X('\^ּqݒ$O=FEQQ5 e0HbF&/_>'b|!زZR+HÐA y*C @k(QG[ m5J ='0VPx%'WxM|iHHzB)]V<YڽR$WAvIn6WgV7fݬg]7!nD׽A־n_ h"3(Bc86OE*tt čj;Kht߇_/ظ.YɠXD`r^~$9Ž|O.6R~اDzG?/IK[8PCHD'e=lOATW ٭V,gAeZbzVSd[)})`5y{}I7^Bω~fhV")%k$/?拮'h l6s uPLu8N? #m;1_,7rv|yJtH$Nc;ٜ9'4hzKj4Z4r5%']''s qj_)`Q~Σ%"p^1;yY-W|| $}^S%o{o|Gt'$NƴNqrrƓ'O8?K*4 ޕw9hHӈZʲ\y^{{Mbd\oI6!u07N/Q[a} Sy_3Һ";,