pythonprop-0.30.1/0000775000175000017500000000000013736105755011034 500000000000000pythonprop-0.30.1/NEWS0000664000175000017500000000024713662771311011451 00000000000000pythonProp-0.13 will be the last to use the PyGTK bindings, work has started on porting PythonProp to use the PyGObject bindings will be used in all future releases. pythonprop-0.30.1/docs/0000775000175000017500000000000013736105755011764 500000000000000pythonprop-0.30.1/docs/user/0000775000175000017500000000000013736105755012742 500000000000000pythonprop-0.30.1/docs/user/help/0000775000175000017500000000000013736105755013672 500000000000000pythonprop-0.30.1/docs/user/help/voacapgui.pdf0000664000175000017500000177536513736105351016303 00000000000000%PDF-1.5 % 5 0 obj << /Length 205 /Filter /FlateDecode >> stream xڝ?kA+26!X"I a!6̛~=3Zd32e GUlj[ˡ}Q?_c.41R?9v~ĽrOPJް9՚9p/O0aR?:boHrz![h<'nnLO1!U1 endstream endobj 16 0 obj << /Length 2487 /Filter /FlateDecode >> stream xڝ]sH='*x}D$c kfO `Ϳ?6xn*Uj}MKe7àg{k /pzֽ֡76*_Smfo?L}yϑMϰ]ˣe<7avHg q{hLcss-ӰM/ڮez\u~ʗךbAi ix}Sc ~9=zEqؖc 7#/|Wk+VV\Q.|FߟCu x[˯?X̫Vmiwڭba5+}$`z(5ayXbw,Q>)p2IvI,K+ XE4|[6. "P $" A[14KlGE9m"GKt-Q}pbki*”d-yd8{wy©ۡYHijp1y L#ι(僂%MQ5F,e21yLsIPq_ !ـDQlCf]sn HH#Ď˄Kl ,̛1 $'CZ1sm sAl%2%k_I(!1O4BA me_K{n{iLCSV)oDလ*M?K9JQHE,`JheKq;qJ?8J%NAK\NA/ܳ8C_,FC}kLulIH.(I!eWˆtLdMﺧ! K3-3lvb!w)T*!1<+ s/h;R_5h2J)J+q=5CR9.@4q[_{KY>8cVj.TƄ;{>'ל bB5tv$+%) )X%"4ӂ켏}5?5 MqU*}iaEr\V\9);I<7ZCbtJJRM}x5-A,4FJaOt'^g@2H\ .H  kf=<'flHZ(FAG%%H!0 )ր:NH#T5$O` GE,-'! ,(j$Hl$+| <<2 뷎;54)!Q0jW}!hǕ/<~IGڟIFMŝ .l ~q1S('B.~Ǘ ;?X/ s<^^i/NWDoU~> ow]S B`]O41 endstream endobj 23 0 obj << /Length 1017 /Filter /FlateDecode >> stream xřKs6835X{*\?i&AuTIo%Rre'r$? {=y꣈2:tEX']Gz%ʷj@/*|yqyS)O< =t<ztZAi9sW A[q};z-w*@j䭰 $jG7b1z1S OWfAICf1Q›(4ZhmԃpWR&cr>)"r JBt#Ѩ/hd !3Q6Z:+AVT'HJ9+Ϧ=F/͂'hD3cv9 FdE*x^#h Vpͨ5}iUȕ>>Z(7usʡe0ڒ@UV\ R*+.8O҆Y6FZ m\,mp ~Rhˋs*_3~19v `Vӊfcߧ~R(jE=}~b1r>g@W6Bx+ȹd0r>R-yڿ#ia0rZ6Ӫ v%5Z}5n_(W>P݇ڇWx-pr CrL?'inaGۙ}0>Q;p97 F)C`-mjJHdKM a7Etj Z,(rra^ӟf[U٢yPX ^N'(+r:€4$TE:Рcè$ G0|ݼ> stream xMs0 ဢO@Gi2I4v:iV\WF;n 'ɰhW~VV pPE@0xAA(tb03#Q<ُGѣ׏&Ws`}pA`D9Ms@\זS1AaG`|9n&3%3U(,𩀈1c=#L|\Tgu&bLѓpLvMpon$ѐG4c J7XIړ $]0+j25|̂`wVh0G: %H6B -QVTRI61|B mťv:^']RB[)r)3򫇱Y-Z!ȗ,Jħ2 5&V>{ <޼9ɓL*뎽VqRZ?hХ_ ]ɼPfẅ22 ~|n|=78Ҁkz/)gi|nRN!*'Q>`͗Ap KO@1ܐ"{hM.06Sc[WMVMRɩ-!} Y{BWQ:{ne_/$ļ*Go7AeWYn˭jz!cDu( %Z+COWN+H;}!0V6=}*I[Mlt%D}ؽ9F6E^/ҋ5LWmuRm endstream endobj 79 0 obj << /Length 628 /Filter /FlateDecode >> stream xO09&m#2 @Ghj)7%]Y`:+å5Kk3@@/x5ZXu"0Hsk'c 0huB& |oYMP7ınk?lЭ` Lܳ@ > stream xڭWMs6ϯ 7h$@|lN;٪8l= P4 i! }(xM ,w*o%! }ɪ0(L_Y9`Kfx &!QJ SMD*k. M22YZ#d;KpɤnnQKu;Rvuo/^@sջ86k^wLS`*\R(E9r ٸRFƣ.sax^im s3+=wG#i<Ffb/[Ïv~#~nQN3[JݫXUfA{8DCv,}MP%k@r-wh*1 :ڪA~[iВ?h4ĜW_y(=ˢ'd6DAd3v9|k_K`RەE6"܆߫JuECP0ћD~"KevU-*Mx)cXieUZI%d =\I>fnAVەI,:j5G}-2cR40&+ӮQKszpOgu6!QMTaAuR+TE`Kx>Aa'%DҞ>MGvu |tcc9DY %FVroaY0ȹrq`p+^w3'DIbV7?>h G֐G'5Hʠ$I>k  9E.DU R4`Kڭ^2<^ЋF6̔poX +5y)eר bOx[+g%U c~I긧8JppB?kh# 6ĘXfjyRTξZE?E^y>=~B0?Ɉ endstream endobj 104 0 obj << /Length 904 /Filter /FlateDecode >> stream xVM8 WhF{;-)nm$Bmc/mNt$R"H&h{nHY;8-"f-`׼;AUe.'(4<9hz7v`= Wǀ Q-EEƛ5J(,Ja_#.kE(abE9B毚7s\'E CqG;[aɥ/09Wn?4vėjO#QHR2Iؘ LQ.2\Jf骲פ[D-^A6IN8 ₸ ox8c-?W3t?7Ñd߉vEfoJHBmݦ,E$ *W._""tytl*LP0o聍p^('d9GQF[ʁor;Fh׫r {;1P׺3V5q 'Y9+H^L8ZLjMons0ۯPp;w AL3Q\$Vf.T0'8Zw9ڻ:OUP,4 s-1X3!L =^}˛,\@;v҈J1!xRr3jZ݈H{IBLUWKc 2\D/`pRw3,Yp,L ,hl> γtA;!f8x0(BqIK;#~2,m_|4S;smgbAe3:$44$+u]O$1]3ɇ~,/^Ѯiz3WexWcxy|_gxfQsvos!j/8gϘoH_;׿ endstream endobj 90 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 108 0 R /Length 37006 /Filter /FlateDecode >> stream xwXiVt׺뮰JUH) vQ[)[PD7jIH u1Lyf9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiNjrsx\NeEEUe%@WUcYeUQFS|ûwy9] RW!𖂼Ç+oRZB*@+-&fذa$f 0yKΕ|DḆÇC23Сd%++P/J"fݗ"e*%?7B|$ Y@wGI,' 3ȀgIT473Żjꮺ@Fk1#t_6hs?w1twϟi?]k&j^=~tS[},ǿlfLԜbx՗uK̲@]g @{%;/bt61YjzI6m? @Fh꙳gj?'NŌ( 'hhK̇5顙jƻ|n1U֝j:Zm@7[Za gL?M̛wodKlZkgh`܉IG,zu'iӜCl+eU8]mKzzQJbtubv7M4Сto80N]'O"ݮ!fNn%[}qZK{ʞǤ󳵵u,4& M-安ٍ楾XG/S/y#R<,5VLI&&%X?YSkrO$&;&]uzo !4 zYɮɖyP̨%+qM4$5Z i(iruL_}/^|ڌAY$uS4Z~Se*%&&K\9QKm^2)u mdޠ!b3jh\遵bZiHP:bI+:?:wBݟ+knp_f~)J]]{>ZJ&H9a'-uԭyӒU5,{g7XYՓ?%vO1SQ^ބX'%ۻ 1pQ̲Iܸ+K&i۶\OP %쐉ž')w6hjM\3=;3uu)^?YK`Dy1K;15SRS6N$&Kfp5%D <8XiU{TKu4զm(YEbY'fM7'?tVZB@ kv@ȊX5YUS[Mppd 9"}Uu퉖+6lZf:Y[uҜcA)Kd=F8m=vdbE 9=WEz{7,[q20MRedͦfڪZ3$JW*Y$U6ڛL֖>/U;r$/Zr٬IZ f(tA+ įߥeo2R<k:Nwq 4M-l#J3ɚ3n={a_גF۩O2bO\3ITpISf:z/R=9qNc?rMkh8LvR[)ntytMBRj&3t%MCr3"S): :s.m13rzVjN铂F|/b _:1#55#e9ٳq$4mE2૒qW*fH_Mw'O2x4@ fLNV@wGIČQ1K@ f33 9$bFJ@ fr1A f3 b1@̺1WUOYF.ixV= Ȇt,Hֳ-Nű[S6"fǞapy'gC1bT A1SLOg`3HgڬGx%f-ɆeSMPa fVWetC3}3MK,]ט}5Z/Az1cw~05ԢFp3%y_H[ [In3/_(fM>t ]{]Q+ mܠV&7洉eNјr KŬ[rWԊ aN=~ @̾1%]]y#.lC䮨51cE0n )m;Y䮨/Ywhk{<@̔WnП 48ʥWI!fVpc$9QdsXj{ U3337?Ь)Ryr5y\3 ]#r;E䭨p$iJcYk?̠a f_|,1A1A b b1(Qs;b+f3 b1A f3 b11@+f1 Y1+@ fA f3@ f3 f3 3 b b},;3ipTJ>=@̾yY7|$)%j:\Kș]iv,OlK0wz޼<9Y*NmfGbvGܝ]\6=K!S)YTx-\}r>/.^((L. U5g,wpXpef6hs8$9xoi}<<ˉǍ>wBfs;߽&9E^y",_ySÉpuuvvqF!5)ў.^w?|pM~qrX_.C)]_.^db1SꓽZK_ d42օ+F~dfAF鲛w]kOg[^z30懲Uns 'W]Xf$ 1MVcKLukiL_bv1kVf^aM[viZ fbFIyȓ8 MmxJ$|Eg!7]$I8}7gGπbv+$T;qkľo䪣WPWo)Yϼ=z]@t7L}W]%f ʔxWj_r]=JɣKt糤q-k,.S* 1)LnJKL=iʹČt}zZ4?bV_L!;uWP=%mOa ]-{nxH3kO+[+`ĔGw\qq|iW#2*jJͻٔw\>y%}O&-.JmIƭ+1X5һo4[N$ oWɧަ1@ f#!sMMZ{4V9&&tz󑏏o@PxLJm&qwz;4)KY:n56C\{_ВE?vqvvyYK:%7'?%g~)Y׏ݾշpbtw3]}b^?pǔdIO~r_~b&=63?bkY Zb'鬛N7%W fĬUb^<ϩ;PbYOU@P\6eíowiXdJae72 ǼKᒛןP[3ɫW>zx)??ӕYNzZJflyIO qF%6PN½':SCuI,mryU,?sۅ^!IV̨I꾸A$z:. f9ny;I[miiHu/,WOݽv"r)DeKywU7+nn>[5H.nhyr[D?v3 b"O| 37]?Bk b$'eGh AHoS3 b b1 b1 b1bL.gb1bb&/fl<&b AA[b1CAb1CAAAAAA f3AA f3AA AA AAb1CAb1CAAAAAA f3AA f3AAw#f"NAjrWAA frR{f3t,2i17N;KcM]c9k_h~kT14 >_^KCAĬ޻mmv-1|.*j@Ux.7TОh|͖+.ď;;obZB 1VoMWӜq" )Z띫AAb1"1Ci-G2=,O戛\KCCKcuJEӥfz:ZjeuJUETIW|xrܙtft1{2 @ fͯʂkmXe֬\qK3f?Yk꿝>bT73Q^&jN?|ք9NUؗAb1k~+STMOShęgyby|tv\{MLCx[4M@>5YviW|oԴ\čNAAZzLƩjZ\L !rht]qړw0Z3mM> iu&;3 @ f-yt&!f\L(,~E+-M Zʈ5t6'(­LAAZ31;긩 NGŬԀ^AFHΦU֍HskRE#1giu6v;'j #  b֊ZvȂЪOYN\|\%}0Lsל_qPOS[tækjӜ^3fzG<ˉ0#TҶvmK"  b2ؑ,4/}^e=)5 ?= t'Ljhـ,8٧OG:\ЬzbDً~GAb  1! 1! @ f @ f_&F!$EяDo#@vC̺f3h5U"G73SU|7XTŠY JtRj"Q!fB̘taeU҅@OfUEѳ ^7#"LX/4AQ(x bybF!1ʊe cwTjsA*s%˿<|=,ԏ\;Ӌ.n4a>?~O*#4൱pQ%#۶׻ 8oEb1[b.._}I|RϳX;7Y\dUfG˜N3;wYܽ"*8 373.0_98+8<>O $/qt2FU ey׭MŬ:nϟVU}lpCo mSl0f/B Ab1uEql|c6"u{tS#f3^x$^enX_Q1l}Mne63IzG+%=٦ua[%f?^ua_EWoUmjmdbybmHA f #}{qBcU e󭣭Ed͞>+Y+f?cVSU&StF9jIbd-+V1Q2'Oք b-|8{OcHESU? *  b/ŌR:<1ɬ3Kub&dG+*+eTW J_AČUGz]SmQN֊w4X׵zLP^wY A+TNXwX.rMwlxZ !fGBiiJϞ'Ĭ*d^W׋Pb&w2b&.e2|m~rA劊'|×R1[S1Cb1u(;'/ OPXoʠsng9dwy;Ff2eIlY{Ĭ&Fo>&}6-ʔ;\1\TeEqœ zBYIIUbq1RrTwLxZc]pYuB 1Cb1bb*e䗷/\|w{\09:1Nƥ?j=2c{uxkYK6|P!Ϙѓ=4EϘɛL?^ǮƟQ/mJQ5U[Y?oA-=򮺵4}ϸS1Cb1u@ =0VQYpXҗ؂ nJ\:M9+ *_+xl AA̾YL@AY73&(+3Ab13Ab1nb1@Y! &ft@A @AĬIMa˘L:P>2 DB! F(*xF}[1޿c2h@ z_Evr:IGBQְtC̺Jғi%SIϖ*pX Rj AD /EbB̺PF=/ȣQ%++!z3Sjv® #-A& (Pb +XT؁u]ZblːgC#ћmמa1r 1qQA̾ɮ .i>Ҥ׈~$z%A Ĭ AAb1CAb1CAAAAAA f32uJxgرT/3٩Y:if7Yяl[% {#([ f3:&0%2UcY>%zT-3ҩ!bZbb1C:; 1X(nEP P :@ fH&9. `oA)΅AbTc/b1CPQQT A)F5F"(3Rjj@ fJ11A5@)A̐SBFQU9IggM}%C%Qo|Qw.U".Wov>5g>|+۹jt޾?ޫ_n޳0ōg,i~wX%U@ fխFHbyU_nl3%3TVwa e!2}*}~ϐDOY[dz J bZ)rbAyuzÊ[se_N"Y+KhsH3TEO~[o\UR1V>sͪ>7khjjj5T|R5~,qjOZ=N3|)+Ulg1Ug,XM+sXL1_OZ},ig_З[[_"/#_.f5ů\,1h4sy=v[M]Zvϫe.qOYvy%0ǻՀ< DSϺEG)AP%w%"}C4ZQA ];la .^[gM^t>8!mi)4AK7~M7ݠ7I(f?d8!j^{/kpߛS>㗻3P f3CXd!b&Llawx}{& St31C\FU2=nfKP/*s,j +]ĬSvacCSyNCk,ac1Ts55i-¨ >^VxfXQ f3j1;rŌU.4^y%f5)v b!Jwݒ/yk+H.;Wߐ{$?-Tl E2`AFb6=G^4o"ǻ =O 6 b1kudDwW5Ĭsֆ[CMJ0yѸU|/]-|h9roPqŬ%(pTc &غC*/?31o^K0Aǻ2g?w*v:xMhJ b'hl6K/ ֝{8):okX+SLݠm}"QSYQ)/;G䲋3\c$}W Ls%,FKaU8jL_Q dĒݤn2n#*/ZFNdcr$[81{\kaR#7"=;OČ8t%f{7eR ̾m;ascg_P fV뫪kG{w;m,9ZHw{PXݸt7|8- mV8b^CƆnv{v=PCw](ݣWK;pS4)0zu䫿[Y G5F`ُO1c^֠Jcڛh>_h9\x]ub1C@p.|_Au. b2S/}%b1C f3yD>Jx,/D5@)A)Omd}Y+v^P P f3A)F5F-(3Rj 1CP P f3A)F5F-(3ҥ# JYB!ѿVK btjrl&՘ŠnEP P :@ fH')5QXSPjL)ѳ_!(I)A̐Ǣ,MPjL#2Q?bFP P :@ fK9;D?keJAg AA. AA AAb1CAb1CAAA}bƤ(x|2Z)>C&AknPyDge0 fH̊ r3SҚ*C#ћ) D*}$&ADiBt6Sn!fL:ʊ߿x2==J k>+w*Hoi 7'G2Mf\@F 994 P(@&) HlEY6d21Ene1^@d"RFvC"WD*x݌c2A Qމ"߁ f'fR F+c2>tw~LLL,+-!z_Evr:[ !N?1b#^|dС4Up7LAeh&*xF}[1K"N♙>(!Dn R1T1)))OLb @̺d\ 1b&;eB&3AbֽČ&'?2!Y 1nb Q2 f Ĭ''7ٕGmbjq$T2:&8$!bvAL/C]ho mŴV*z)/(OSH"7ZQ1qљ%36촃!**C4\rUɚ*?Dy7=H珽Tӟg^7-~}=Wt$q- 5ȿXo"|q8wg=%b֥Lz++k噅v=Xhi3SW c~buLH}{Ձ'Em4ʃV cwL=#Dv<\4|PRa~!*FHb}{GL_zثϫݨ=|C71UUF~RvӑZ)wuVA=z"f5#LZi}{3|o}}0=dMhLڻg>˝Ӣ?s[U^:~69#:Ms}ӂ}Ƒvg Ҏne4ȿY/ b1Bb岃B]/OΛ{8W̏3;|Y$g3ROm|9**/%tCv:Ok#pk?[X`Kk[{*De}%Sv܀5֙CLs68 Hb{j7C?6 m'.쓐r~r&՞F;_5bȪgdᔚVFvb]iBb6fǛϗeQ.8 녘A f]Krr)]1J#NβwMbmu"L6MiAO[ZΚW\̺qTs/aS2\ڳ|\|SJYg?a,um1vYo-Kp碤ո{ޟTz:uT^}6cM8w8sU.xvl1;ݑ_buV_şO|կ6tMXUÛ}U57`fw=N;\P>F?ie I(f/u7մFJi8l[_ Oktѿ3nUq/0xy M}j؝ErZc2WaN,kr0oa**N0[­CT~e8"8Ku;6szrvVΥ5?BYvZkYeПk.`Pk;o!FFn=ҍ7k#دAws_N[b=LČNJN&~vU>;-l2xV֭ {ep\cld)'<̏TWUnRvraR6C~Q"v)/(E%ɁtpKetFc?;H~h~B!dvօL5|\o5ujVDRF1b&zBEu#2SX=o@fN|5G{78ZЧͳ(qjߖ5Ǵn$Ꟙ|į\ilmڽtLL}rmQRǒSOMd}]Dn#{j\1-4zkd'q 뾃W]I(2Xre1Tul,n5tCX%+I;9l3Agݒ/XO=۪{tL+GP>g15lmy;^b&b8c5R)EP^%RH:h$y+fmZ\/q4_J8힃3h睸g'QYmmt9 /{L~3~J.#,R(vXbJkoZ?rޔ鏟'm{$ }_)o櫖>_|5*87F+(85| >0ׂG-Q"fomPy\jKˡz8 cfzB._rMr=ɐ?\RnUL$~vL1M߿$6> .FRI584S̚}j*fWKen,:fs߼''msYR Y;f[2yӯ[(sbOjkcЧ2I?Oic21K=\0TpQ]+w ¡䈙Mhua齆88SLUX> 2|sìow2ϛMnUǫ3T8NRsUrvFb *T>\˷ 9Ϙ) m-HQe>u_ޜ~jhk;?4όk"CW S{%=[5QUҽtGl]͵ki돜ŊwWW`)okĬ+fޛ7@5B̔Hrr`0?s"} Vzu͙z1/#shMČjy2fOsCrbܼ|̷է+L;`쎑^)wn*[K):qD'p4&f2N#5iG5x*s${j¯*_ve؁>h,)*[>z לdzX+?T}toS>J$ [;\\U;k3᧪~]K/3wq'fb}<*^$iؚPAc1#SM6ZYhM)Y=#1֬l5Pn7;usρ!UrvWFo}٭Kxz_q]k]6j69ЫBW3ZlzP |Uq}{h2Prs.#$^ -9b/]VjZzVmuvʛk䵏bbV_~kY#LiČJJJ"~vEXe4İFg#i2lJzĠi\vIdzݗ}EUe*-v99EmM`f-hRRӈ f! f=Øb4W&)ڙ 9ҧ[ݠ%|`~܉ ge@R.ų_5֋'փuhYʭ}t%1Ui =~=P͎̈;aĂE LrY\-/r粅uf^$Y?[&__ijm;^Ϙ]PķE9bƹ7k؝Q՝}"]60ۖi"f V cw z?6Ш~3(ͣմ[G-{imWiڳfGbcvgvNy36_uٺŬJ!f"f6YP .emw&[]U%2{RNAc&K/mŗqشB̎dKϞ'df3"xaqX9[%b&D ~vU8?~gsTPp8-#|}=+{In٨ _rAMLʟcڪ|MihJTb2mղ&4eb]L槱im;Gt*__1]?B*f }*ZݮZ[o{Ŭü/aJ<-ίɎ?/ DŋͿO>}nʧw6[=KkVm-V\ewԆ~Sik; Ou?T?Aۦ.!fJ$fJV Fn󅎱#Y;fιI+fw~͖}^XVVVВL]ʤQ_'/f̴kf.?L!71Y3dĬ&Fo>&}6_x+SL}'"O}s>fMN|wឞJޓ{/+owW_ck;^#5b#~K. |uz}6Xx27SP (ETNGYu%k#\<_TeE?=GHhn"fۧwRjw??vT7lVM/=TVݣcZUoB' xB!(y[N;xr?)\4=t_Y4Nޅue傊sz+f?X'QJߣ?MsˆQ[Qh@uޟ|Bޮf+gi'[tXo^o7E~zhdvʝy>bva* XwoooVК,iqS!f"f,fRb">e%h<+{ޔl pU6h$wS:?,HԯկV}rnH^CGZCZ[ގ'W>Yˇ|ToĬwKt?a`>g\* :SZ; Um6,m@uw>ȮT# Q5\t<竷U1oؚ]EVti-ؑŊ9 jC ט~bɵOflր5~p~CT>xL+ QQ5!fJ&f+].XJ>x.c^!6x-1ERd ..&"ǽ%(Y QRge(ABQe55D簘/f555Q (r@#ћDRkvEoY 4AFɄBNXǢ\,ĬČHeecc^DE<,PDlCNOMI%(x bLvL p\N&F#ћ5/ tN f-f  3  3   b   b  1bƤ(x|OR|8:>Mݠ2(n <g jR1bVTϠTWLI zVݠ f?dED?o,f JN#\pެ zVfSDƿdRj, ѧDҮke(oOe2|P&>%zVbNu:|?:?#JTٷԄy< pSYP(Tp7@T7(I ѿ (Zѿ\Y `oA)A b@P f3-(+f<.(+3Tc/b13Tc1C)A̾H8]zK&ML-v\ H/렅3c/-wOdwvh7 fbvکc8YvOP ߫9N]KUxؒo "Z/n7%_` Qz\QHZ)GjtXݱ J bbvz8&˦z}}cpvnȕ/QYC}Oy^cֆ48)0Knl.fOEx< [6Ni_;6Uhz%fc1qʎp^$4 :  'g(R>b&nܵǯF bֽČ.3[x1<5&=p\nUE]ҫzo{cH\1ҖOH&zwAkW_LZITxnˤoQZxhuӆmls%KIe=UV{Ku7ޖ_lkc1\7> J b1{ˬl|WZƓK{/1koJ)K2a,eol\zI?;WXZ|5M2f6"MzzXrՇ% tܻbl9N;Xы̄u͊Y]՟Q*#cu!Vt2jG> Wt?KwW{٘L49g B"}^W͌.ȺM ld@xn):Ƴel֑Zi(/Lrʔؘ0q^!xoCGO<:թj"o-4毘uդey`Y3Bo:ub&qzł}$/N.=^fH{/J,KJQqIar੅3RYY6̘fi\%=]6z{N{ep\cld)K-9?K| B̺|uw1?;r˫ϵGL3Pr)Tc]bVy`Nbyz/PhEwYiX≸ugvTeIcCs3׷*bUz~tO]/It7<-4tŀ̜WHL;R&ggNʕLMCbfn> 4?[l{K bV2_ϟ oj_Ѭg2i'- |MInH1 ϗq|.z8ĢX[81q`Ϭ\79$ J's,QQDA@EAXػFc/hĘj{7DAAJ [xgwA)u)0Phӵ1MWL-+9!M_(pr1'Gx&7t`%n\rX /B̪S:qх!6QN_(ڟ>'QYw)b5niZ[ƭu\hOx?I3]Ge b~x!r '9h}䂎ݿS3i*#ӻnH2Zr=B_;]j{C*PJ2|=[[R-N7Zb9/f!cuƂ^17UdWׅ Hhn}Wi3<#,;c'I^5̑bxϥCEe1^|RZJ!A+KRݵŜ1dJRݸ䰎n\_U9>̫w;쇿:>̙o:ȷXlnC~ͱXҶ _th]ݽe~|eb1!}hd¢glqwfi]GF/R1πQ٫sx`ĬVB^cWdEuF\n?uwh08R`jreC'm=~-T۔@ ʊ%+YX!4`Ub(QŜ#fOejRWqD[JnI1Zr~~qE/CþDM~dzqD=7K^k+BqޟnUYQzVہ;S/,1tDH#ƴלgN =&ĬR!wC6\\'hEUgRJRkMlWKN)3Wb?b%Rd\n*Eb&*Sslݿ,z1FѢrdd1'G2ŒKWvnX? [z}ƛl?: NF-gf1rvUX2~=m×!6Oed!+>1mkXqU-ܺO fٓ\KG׆1FTc-vL"J:w-M*ٍC-;xޝkF1S*O. $"*%;=䷓zDLk:{4Ł{z4rF8L6HUU6n U S_hg|αaޡ`epP>ˢ gBn~=s|P}]g^Z,ˉ2Kbf~HQ{eg6u:pM+mզ|E'H`pe13':s+IYg;C[iY-3'>ݻdDžL6Wȼc>~A}]*ܵ] 6r-OL.-VRf.fWEJ\-߽bJXG\tI\+ڼUEW[/jY-4u@ftgэ/ \ۿ/۷s}v!\›B>伡xG=ֳMrmٿGG϶;;T>8Ч*_Kܧ-kɬ>i[%.-uwm+Fjjo}1td1C̞D4ZChjU⹶> h0tzDޠStzڱB7,+7\ΠOPh:ǀwI3a9yk.JUYIgϯb-ĬB.#UJޙ}lԂ?1S_"?ŧ$X2Q?eZ[hY3<2'vIN8ըcwݒ׆?1S_W;h=[1{O1 3̵1>0{*1#fr .fr<: N7uZBQKlČnL}V61W bF7B+@3э3@hbVU/I%"LB\/Hld76NtZb,9Fv]TL\/Be:$+dKvcT"ԗ h3(/U8q5UV\[&ŘM&ZucBe\b )f&)=& ϸjF 5Mmrd'^Kg,ktcdde Un@+@̞  1/=vaR#Qf,U}})yR#Q&౏ h3q3VR@mLՄ: 4q& ٓ3 1 1@3@3 1 1@3@3 1 1@3@3 1 1C1C3 3 1C1C3 3 1C1C3 3 1C1C3 3 1C1C3 3 1C1C3@3@3 3 1C1C3 3ĬXq* ;(b96M?ųUvzbߪ^]Zm5g ][>n{>UXƬר5:#!fOȔgNW64Va|7c3Vm49|xhs 5WV6dU훵. !fY1jZhQ^;{ ߕ}1 1C̪"f>ß6yW)K殡-?Z~ݱ-=}/clvnռ+v+s0ȫSrV͈e?iɿ5G bf3Atmͼ|ZDG'wmռ9&}ҼeВ*FmHM?jo oI ʊm}̫ېnqŶ/;7osزo7]gd_@̸8޽ηժS^mWFaʉ׮蘘gۮc(2M7j?5GK|&':gAs̛5W[Yrv]}@feֶeӏZ~LfLTxB!^+bM2 -?oeqѕVe"AZ]u5-l>L flzoIid9 !f5u4*Zg2%ݽZug>l[q~q$ԇ 9Iņ)[z}wSӡWE,Y?jӲyYG$Vv` 1+#f-8»gf Z/[7k3hS~aWV6<Noe\KU~f^g-|+ޝ_UVmZg ԡw -8KYa.y!:o=|ㄦ1!~=[mg[\b]bb!f!fL"NNu)yR#Q\*nKS !ĕ^.wĬYVף|SB5o^*n{U.X|s tL#4yĬVL"h :jRi:yLx3%X M\ M!fON̒oHE˜ZR n/J]>]hYKZ5ѨB} 8 f'_+fW_Un@pm#fOT4jq f!f1 1CbY3JE\5 fA1CK̔.s//_@xB-C(˨"̕JRbf7uӢguo=z4{գ}7ݸڻ!fώ.}W%^>[rZqئϤlɮo 1wqR$_al?Y\Y2h~q\ 1C̜,Jpέ BQ+B4jVRju:Vi_L-ǢRW+OuYi ?n[r*+u1@gO"W[,EαSe)U[?ӽoߞ/Ȅ?6o^ϗ#f)jv3]B]⮙íͺ7ƿne72spxՀU1{Lp֏6`]gLq\JB$~cYmѨ%IJ{~?x< 3Qq 7>*|w3rsS/sQ#f/io?1'ԕٳ,frWR+Nm/R]KS fY9yMGׇ!y5lOLkJۗTI*^gX2׈(Ol^~݃ L)-3b*qoG+`گIRZyaǂ}U6'q [h*.k_n.lM"fbVTjZqޠhr,VoЫK*:2:Ph CNV(3@$f j3@jɤUb 31$I1Ĭj3@3bUKRH&׋D"n`1Zlv1{bx#;L*&B} R2 UK%BGjIDy׮JhE|gv\c6].xdR.CjLWϟN,H> J&%4iJO*͜p%3R`e9Y8,bL`0dgވ|B5se ҞKS/^9O!"tW2o3q3VR@mLՄ: 4q^ ٓ3 1 1@3@3 1O2]K|F>y);6 h 3 47~ß:*dJ{݀VP1CI;0_J؁PS7z[b%%)^xwvpn\hbq5~s1 h 1'M\%`j76B})+ h 3 (Wγ\S_`oT{q3 htc - 1Z1ݘn tZ1C̀VL7@7 fЊtc hbb11Cpݿ -FF_ik+:ٔ`.?I4{=R[Icb{Xf>ȗC;7mT+HC[]4nX~t=G9 N|+sn}~YğUnP$opkpKIY9|皦޴a9D#ZۆTFի%ߤa_ٍC21sA1вq+!fuXs9])B7Y%hb=>w^iΌ-Wu$'U=_ע~ߊ2EiOxpsBSH7'ft'pʦ-じU%Jm^ ]V!f٫ LۺmNGs[kK0OͼZ}_FX2w|~>,S2?߅wut#cѯ'ҺsАٓ>.nźԃ&ܺkKXk \_D?eВ{):zU1v+˝~Рk$g]LnۧM':xW-w iC;u0k5ysҐvd`)Io)L7eEd^ޣ̇vk-l8ᱻ1C\W["Nbk!or*lŚ˃څ}uv^eZb^gIh5y׶mх.fUq} {?Fn?*?3e?ft+rojjoٳ-fkk{Z},Y$ΊiFjݶMseһVͪÞtmloۡ3{^Wy-o=S]V!f&mUoV呉W(KꢓVў#~){t_Vv<{}sT{rv? 1S/=Y̦T~yYUdЁqaV,1{OvN_((~9ۧ#*kg=4;xm٪8eNZ{MYU=,}T[p*5쎧m)1%B1[aOgg1?Q_6?j#{ʹ1C\W\X﫢-,-f3O*L7Vv|\[[%{/+5w4z+f]ݛ͸{pĬ[cNy]9n~wXs/.3o e.Lw\Y]abf0ݠۭj9b3 l72{t fknKϋ #J6>mP(|LxVK#&X*ҳ|[p1GMcYXN}}=>O.M;1ܻsXB #m5է'F>swG͗&;]y6~yY]jٳd7X䧾Ѳς= rc+üC7 +3)|bÞtc͇$ef%: ݛoߢ 1s^ݾG^Mհ3?Lݵ}NBg}nZߋ@Ӵo/t.9KӒ+&ݡcQs}V_ڱ뿛<s[fѳm玁CgN%X{h27w#k۴XV Y-4u+} tlG]zaecOjXD̞'Ūұ};wЬm)Qvh=tʹٞn)3 *DVPvt^_W:ۛ{h* 1/ܵS_ÒP1YZT\ 1Z1ݘ$KV!fэ3(%=rϟ:E}>1L7 fn Oݍ n׾Cۯ-tZbЊ- 1Z111ChtcZbA&.lf;d76B})+ h 3 ()I X.@7Tc+@3xmAc6.֍ # V!fJO*Y B7B+`z[bN9%)>.RGPM݀V$Zb@ 1C1C3 3 1C1{L&''ވ.KB5RqUwȳB "o!Eje߹y=J*7-P(Thŷ5y.2 fZ!f2X2Ao0샫IFQ*q3͔`e| K"wWq3ɉYr (WSQWPSB} RReާ%B/ihkFV ur7 &+43|E@̞^9oWWZ] V=Q1ӨUUb 3 1# fW*q f!f1 1{,1SHίo|'VIEYt_̔vJQgZfz4鍊Ui9ew=ŠVjK` *l<7iQqW܇ 0Tɴ mub_b{_g6(~_8 dȊef=[x@gLgW :}z?ra-#}!fOG,[z4h8FWEʂ*t}J.;2μTPhN9rY*銙:rzsGl=}33/?+9/':6 6㻣Wo&^;vLXRY 2~Wx$/? 2qqgG#fnrdp`bIej@wx4jm8EĘ7s=u,N5oxYQE9cOVJ9yu:EC΄3E-it^l-ph: vXPËth5Dmaaq:wx&O*X;_Ո7h^E*MQr^>$V fF)Lxݥ+,ԝ]7fZ3SfΌYn-znϳ"fbwRQslqpuWJE9_٧o8/h Ywά;pedB$~cYmѨ$IJ{~?xWxz'r2b~9?8it"fS"Ү8Ϋ v1Jh$t[tJun}TYΑ"%f^18sbC[].0+}l͒ϣI2'b4fx>Ic۔q^כ=xZ­{W-Gq;/ͻwcԏ_j3RW>2S3[ԭ䍇%}e}za Ï3Qq 7>*:3fYŧ2'Th5]^bVb&Q'ta~ɳ,Oq\BRjGf xMRJⶆXtBX=mIe4#HJյ!_EJ+^a" jBJqlʚu1~נW eNeZs輮5S[+]O ƾeNz4ݔV@UrW#WMʋY)pL(4FmɆ sSC?nѴmWffq );]9uYh7yoxS?bIkW֋c 凵Q'$Bb=3b&92߯ybQ8?ng~WYEv$siu2b&.7 ``X?GBtOiūW8\uoϝ1~? bfyӗbVpaZ7j\/y%̔#Cztnݸ~[L7yV|Y% z}xg !-ǚ"f%t.i8<j*U-K:Xs9iyv%GO>6 3m$}=sL!f+f y͍oԩBK6?u%{>z6X1C̪LJFF`˪Cڮ~#Ep,,ڊ)나-<.vL?O=)2WzӥgRJRkM5x9R 2sw)M1+TwuܥsE27v/fg#$Bh1+AXO9*Rں*O o4쀺ƩpEIܛTFlpSiUG/NeWʣ],Y?F_zo7=|S?7Eƣ*]5SwjkԤe6\xvIwSZQ煺/78xƎhis]U~`uۭL4=zŌ; fٳ*frFg0he:A+z^-/:gVgLRQ o녇FѠӫE<|btjN_bU}_`T)bUcrqոbl3@'/f2)qո7D1C3!fٳ"frj3@jI1 1# fYU$d2 qH$"Nઘf'_+fɉ73ʤbz*+י %)^!и\T"zĬ拙DDƸX*+wf7Pʥq1f߭L&+2Ĭ拙dJO}ɂ3d.RB\ BK{5+C1s7j*JY TMPM%ɀ=i1@3@3 1 1@j$qQ'%>uI\*nPt vW 쟑 Y;7GIj?Bj޼-Tݠ4oT~PGqWt^D1-b&+3>hjzN7SʥL$f  fK̥\aLFM\)BM:%r)_bbVhbq5~s1bD,.VƸf4jP_'w`f'w쩋YqqŨ:g\Ų/ fK4jq f 1#bb!f1C̨/ fW*q f 1#bb=)k|$ͧc @]^i![b`;T9 fVŵuO7M}bN fsbvbQ`oT*$ֹ'撤ZW9i3i*Ĭ&bI>W/:|n6ZŜvY!}B f S#,d}\YTkI;GZWju:VYCSx~{vn]֥Y_3 1]=5wiJCqkg 7xU{m% i_@АK~9U$?~=}x`РUĶ)cR:N6ﻭs+Ϩ;اyp;d sGߑ$C̞4kZ^|!r?H.bVSLЛb1?Z>|YBW(]afgOD'gerqR[?I􍇮$$ɖ8N۟,4u뉄;g֍22_-_}7f񤜼GSjiv{gҟ4*b~Ŝ1@jk|D'//J++ʴݓ'OJm *R*hl*F3PLڛ檕)e)| WVTjGf xM>0+h؆ }VrtV fҚj ¸qo2B99RЁŬ䰂 /B1C̪[C6 F2;&bnp.ɮ ϑ>&fryFԁYv1[EVPQgDLeqSwg#FF!Wf\<0tRIiM X^rJHEeQB+^!fҚj\nZ/rsr21CwlBV3)l"?O=)ҫH.[Trز݉9fd_3"K"RN~;WOG_HμkG)gdqk[,TUXe3Ĭ扙\V]LXBJiVd^ر`Ā@.\ڮyCp b&LKN)3Wl"\^1%_@#g]:$ItpKٕamު۫-zޗj(?7EƣȬ.V, 1C̪P`4#`0Zx\-6FѠӫ&ZՎZgY)e*uήJB9eD;M$|%bL!*%>C6EKj!fZ&f2)ydd7O>pQ% 6bQ_@3K~s t 1C1C̪[2)yt*NojوbF}1mb&! 1!f1C3@}I*dzHDB} ,f3%l6; fO]̒odgޕI"TV3AJRB&ոɥZ!fQ^q>bjj(9C&ŘM&PSb1L驷?~7Y4|L'T3JimӮ{U.s!fBR`e9YbV[L`0dgވ|B5se 'HS/^9Oj{: X fNʹZJRF2U(TyI@j f fbb f fbb f fbb f fbb!f!fbb!f!fbb!f!fY!B bF!RB! f!BbF!!fB!!BbB! fB!bF!B! f!BbF !!fB!bF! 1#BA3B! f!BbB!1C!B3ČB!bF!!fBA3B! 1#BA!B3ČB!1#BA3B!ČB!1C!B3B! 1#BA!B3ČB!1C!!fB!bF! 1#BA3B! f!BbB!1C!B3ČB!bF!!fB!!BbB! fB!bF!B! f endstream endobj 108 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 4036 /Filter /FlateDecode >> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdbx7lAz ^j4Ш/l'ybme;4GyfИY_择Rˎ&h[ͣl`j4ڝgH4-&0Q/q-5C^j;Q6񬉣D3+T'LKKssKKKk CBMY+&0arBiooOE:19((0lvT׳Yj әLIt'tYfm93b`B.l6]8ΨT{[j3$'LLg6.R NlgMbˆ &],GQዮ@_TʅIMukY+#w{}#cD~<>^ {l#hlm5#bRш)=kKׯ߸V6EWƍ\x 'J|6ZmdkYit{NFxupOw.3;VW]PLw9MwwLp̬dv!֑ ŔǯQ@O>VM;V^3e!Jg/1$h,,ҏLXI<{@3f6H&~T?!ֲS$A扣+}]ј~4{cfm/^2]ȥ?8E_?w̆ٺ=Lpe!(?tٙJ_.ZfVK&R0dF't$Ν:wn6:eٮRpe gHkɬnfu%eށщΐD¹rd^646gH|q{ G&c&lf&L,efu$/ݸ|`֍_)?215{(_<cd:2{$C’3N&S\`& I_pÅj2O?+d2Byw=gH|Bd>U KՐh12o۶A2W=3$Qc+l;RAɐdn-l*TgW)|ΐd%qHJ3\_2MkLK%sZ2MMfN2$-OfWskG̞8C޾v!Nc?2[KM2Hf$G2=!Lxx1%dvGC2fH%sՐX%S9,̻ l2LP}lj0&,zW&v$?Z}?=Lx̄lpt3$Q~~ʹ&ٶM$13v{|_o7h,}|/_Ϯ^zJO&I6by`d/]Xxև~#!?_ŧk9ydznݽ0x3 c786}t ח}t>O>nÇ||޿wͷ_;񙉁^VW2f֞z';ˋ7Yu;w޽!;wnߺ;o߸xWN=3w7۾mLx2=~ً.^[ZZzGK._p226?3\Wwpl̑gNWϝ?ŋ/Aøx…=K/psLVKTKCf%꘩5uc6Rophdtl2>F]262<_-LG[]zLT: ROo%rT,tsL: Y3lWxϴh:C5]݅BX zqDWX,B/!PLm8dɬ6}h鈪r| M׹\6# 9SO2f&DUӑNg2Nh> stream xڝVKs6WHΔ0|'׍:Mӱ)89@$$sL2$Pm x}~ #{/6e&fGdH'Qc&#_`Q:dlU~ټYƌĠ~G4f>>b<4o7#Ӆƾ$a F$&_"9A.za 6u& p. "k C<s>ٻ0u,.xEpд6* # 3Sc j5ƎG]Lu@ؙ0׼㞪7tJ@{? !/=2Y"e5\tq]X~փ٤U{b=lw(충Y(wu[i>3Y3l]0dȦ8`]Z?T.`w[7`񪛍&7|!cƠ q4>LVb#N ݴ:oPj yyq4R(ɧpۮۦ1 u@Qc9rS_(&#shL+,Wڇ.l;tl@<#b0hyq^w`"[ I ś_lNT4{MZ)X,`A5}c*D.( 02vAm-e3c.!cՏFIoස:opg|O87@&5-Rּ\:~UoFWmpwfxmnٔzWС\ڪLޔ{_uTԥG5Gwdɮ2 yW>J<5QG/k%=z`,˼}0F,w ".~n!ԙն1@ˎNgUmָT8E0/-XwX &#kl3[۴>`@ )hc݂e(򱽇j䜁ޫ8{g0?8_+ endstream endobj 111 0 obj << /Type /XObject /Subtype /Image /Width 754 /Height 451 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 120 0 R /Length 118573 /Filter /FlateDecode >> stream xTݰo`wzߝmz3Lw.R&( "%k56Xc)$ؐ.`{cbO|36$g^O3g93gW1:p N/ܷsXͲ/{jw>~Idf]{O/ܽsj@  sfZm_Hxx_Yi= 'AܗM]}]ÍywwJn98iIɐ.Ncwݙ=X׌5wb;n[3w8VO8ڽW{w/+f">{ϕ:~w0Mdz˶-@|!/v\V̻욻z-򥽧f?84`e/|ǎLxWM:qsnm(i7;-oYo CBw,:WK^kAhf8pXx+ҡg759y.[9oUOnFr+ه~W]φ7\q#$/[ގ@#vtϥ +8iO_s:o5\S51Ο.%O;`6w灳X1htKW[lЪݎ"i7NqMҁ{8mvԭ<ڡ1:V챲G!sUdKyh5ڋ@ #_wDɉy{HY^Xa睧f77O:]cfGV?VyC8Ɂ?^:}Vfs2~{\✱y6qo^d5_GW'1&rQԫ;Hvxc߶swOt焭;vVC)}4Z .߼y7/yb7DvI &wӻN`v5kREvpNn ͺ=]F+wα9%_gV=^Ɲ}o|5f#g;=g~.qn0۝_> Oۑ s;0;)'Nmw=W?srݿm]=.xoHmwq,3}M-5ݖ|"y&N6cJo1Yrᄈ[}^3Xܔ9ձoƗ>qi>3}7J Xt >>LCV@[ٽwnxVO1@cs{>|v|<ҿ]Ēݿ qwιW?'o07.,HN?۵VCsOc~̗M\^Lj|VϗؿG @ a5ࢇ@ Y @ d5AV@ F q@ 87@ ۍ@ iR6H a)t'S4 @B'62o3_%> Y dH =@H@{y#ȣ-@V@VYm#ꛘ.#gɀ3%'tF:6RBRN`!YCg/|/%^S#b^ LB?UCt*,Y Y d5 TF19dY@^ʥ%d ]O˭n`LLuDLRu4,aMj baTEl 01. c%R;E!A A AVl-6K6 \d5jλv56YVP%p*6G pyZ@_-4YZPScx<3RnG`> *d1X 7X iAXuϷ=^}*Ufx&zn{ vb]vkniBQ}Z| l v,Y Y d5d+HTWCJ#jw]0q3.^e6nm˶6oʭ]K.n-]:yڊIۗJ˲مTQ! mβXmk ÚFc{tΜ,[]Cŵ7w;~[~tлo|g{ͽWwן|w?;yz݆f^۷"",Y Y d54+X&DGFyH*H(t-*L%01c,=bt,1J dPtN(>gѭ\e<ԓI`.Zqnͷ>ګ/w;{#O;^y^x^۹s޽{{=Hk+,{y>9}y]y?;5`ҭK_z՟>]wn釷nb/g}⋯zxxxddĉ_~|gϞ_~{_x]o[n1orߝw?^lPWlnţi<Bm4B!N}#`zYæ8)Î#FIba$lp6 PQi N7N଱XzM}gi -y.of,\{\5Sj:L#@F&[bS`D\Z"7E(8dIxLJ~og?WݲvsW-YfՖ 붍; Jrؑ| gb''N>z/|=rlx'GO«#*>@l|JJr|?}'|jk^;_y7'sO~}²|]qY?{BIH+'\iY_`rL}^Δ3}T)?|ѧ?}Ϟ5n߲JE|U;aAN )6m.6Uh[tz~GNJXl^_cPJ ybtʔM}}k .IgGcS}8ޯVuT2^3LW1nvW[멪r_jG?|vf2%Oꙝ{͋g:B 4ZIbc0]tv BӘzB&Kh˲ge3:тO`49MlNupX^/@pDY Y YͿ[duX0Yj#dVZ84; lB6NO;L*tT6WlT)hŊ 66z\́PK3,]}-dz_jV\3y7vYzK߰麛c5o{W5WLWmgBmap`p,4g]jKjD "F}(>;߃\ UV)r r빐 ՜{(xDCf1J=nfU**nvsW;P-\],MN1k꜁ɳ:'Lh]|yf^jT=Z)wMD3xd+wђ ڴ|ًd֮[|ɇywx٫gp0v^[]릻w?}g8~e" g;96zLN;vob᱗ƪ`񑯏+pǾ8Ӈ~7,]&O[! [lor0 \dW -"sлⵙR>wݿGZdsG'͘;8c˛Iq._諪z˴Xp9ЅJa LB^]m/mZ\$UYiAwT1)"2dKsH#4bCb_.WZ\<=**%TG`n;u붆#S4TCJ+#, l\z^*\fZS8X5 UZp@Ж#A A W@J|0xlnɁ)'㦔UKggΞuьKLrWzƴY7zۦK_vI֫687^厗|ΔlnJ mjhtZġ[G?~߼_bGN/E(##'z/؉/1zkR`U,9zo pF5GOҼwyfL;y̙wZh"%&e!MDkar(*GylZq{j,,gaql"i$0́URdk((V#YSJpzA(FӖgԐ=iteynPTK--A Ldy˘Mk` ){da*LUyE=Ѭ{aB8nnֺae */&Ɂ¤B{aJ,cԆ*)$ p(*\e&ToÑc}5*&ƤYp`go?]pR9ތ_RVSa#;}Pi҆f7k5x䅥ޞ铇]euDWDc̥7xkn0L6F;t'''HY?===3/_82VtO>(͙rr͉Ռ*>vOwv>7+/:0w`.edMfni#<.4F3~T?p, xsA7ֺ^2UEt^Jb1d5d5d58V3,FԻRUY,,7uu&n6ha82S W,X49¼ˌM9]ӷxMnӆPo;|dos?ygZyݺd%/]o_zowǞpTa% f5g-*LN`f1\6|d/51w/9ѓ_o*3z|W_}E?qֺ'>Do##_؉'>Ͼ8ǻ\k._Z`VZh!&"wó= *hCAx@{\aas0,NxK:=89=ܨb~rdJ"bcΘ!NeK״;{S{ϞM[{RY=W |~l~j0jGM~ NSyF:UK4rY.Am+S<-9: ҁnzhr9KVNAzN{d04t;pvㄢ;iO+2qq" 5[ XCK]ɢ(7z\]U=RKVc.9zMrXy A' Z !ä钶lRgE-4 ]UUx>c3>Q&ait3BZ ȑꤳYͩ&mFO5>ѧ__2tԥT.S"arJYq>nRyc' 䲭R=A&V(mZmRB[^ns\JePtn^jYj!Tyt3b3S0#Z1Z*CWA1TTZ4+qx:&WIeXI5p.P):Ik\)P> Y \@ Ľ3&`m8<~/GUK_3ʃfb_bF!pĎ"AQf 7ҘzSKcl%k%/WS%=a0MT+0Gc=iSsfN1v?2d^2?:kJ|ΎP>63Φ7xivXg+;9I/,|^wBJ[2}%t$W|e{v>ۧz38)K^yoZjy_.3yт?[oR[XrQUUtqKĝ`,TZЌ{~?}5|ɿR3::z٬rWqǿ:/z}޾+Ο8s@_!26:s^NBV3V3|wlF-r6**r1Y>p_Fݴ9|1FG}X_Q!'kclb.SOd94z,#Zaa+ MDKOCv5[tT&bgoRFЊۍ#o{%]G^ٞu]]NcGT |^*dZ*XBDbm>3 >3g05r`gu9y$f|ء,vJ;d~vT/T `R&J)Q56(d.QY,VXd8ao/jMřtK8{uFE$qY zUnhX|:uxteپ3ՌϊLruY'tfunt浓K^e˶kef^K^XqBz#<*gsm`hfOkZ&e ӧH]9r(ْ,1V[뒵fO0j JNg!kPJ;.bS-MfT,)Jʾ>[OT$Tr3xR\꒥rMNQӹKYmd7Õ)d6*4ngŢ6SRx\O:!5;M9ēh DKIzC@-અ]PkmZd:J+*5Y2W D5R3MV^ f! uڞ¢93SSMS&.U2IOfZ;zrN_$d2YqwخQltU5[֣9k!EOǥ΄Օ P>wXǶp9sg]kvac,\ET@N|L3&!0U#6:`uj^#Q~߯-YVC72|jO<~dG?b_y~{چuTȐq? :e5Dz6Gy|]תR[țsP%otD`߂{,:V1&7AcmUE T T5(éЃo056q}ER`h˫k *H&U4B-ST:Hޠ"]Re;4m6 y"9ŲRX`ښ"\b6TE-XK_]ȋCf_UY||{Ηl&DXށ=.a(И3)Y6-tRMrIq>%)Oӱd9mKD$fӲT(',k "hRMV_Oد#"tWiMF5阩vt -d'T#XnFJ`ʞ.}.̧tDM8^ֆ#@hr^o] 5:uVcNG?7_]0KWmpAe&m-ØcjW=I XgtFVqnw2%C8nFT/cyDVby"KbmBu O7t C3E(h %K2*JD($$HK:Ԕ 4C2`rwX ʜ˜)OO('h,TmHm{)?#^[#.wʘK%|7o)LcTe ;i`(pYTk]Vkj9No9Ցv5'N#>rZnRqjjbIYUUT~Z_#d1\<{&eq$nLY ( _T6[Hڢy[ [L* yf'_u63yc 8d_mp64ZZ@EfU&Ԉr}YM%,Ōҭx+IU 0Dc7V2OTኴyb2wD⼆VZ5[ $BDX*Ye$ɊVZ[1a A2 i4#©V_vj!S"-%bPRiu$ Nx`TIjQ+j W,k@[k5a:mM& A,Q4&ͱds$ զm]GQ6DC LApP=xjH)i@$^O$3TF֑fÚb\j =y9؁}9|ZoxѴҒ K` #AV8;5=I!3iDhlh83Bq"jL"טp崇Q7 Uؓj|LeChK3yfO`j7#?{QK\ATӔ#C ^w 9j6/Kl/&&Pë$%#ol^J14эBVYl %kl؃P!I6W٨VOG3zF1`#:G^-1V,㤦"Uj`kpUw֘up'Z5 TIԪ-u c*xk:G sYB{֕jc5Sgq DS0FuRcxBBWFU`=lR P?IjQ![xZ/h5 oƗ'P$h&P,kbi M7Tc(op5X; ;c8Cu!Hs*-Mgd1DFxu@}$ &nn7SDH4h74eԞP7I1E8FdKPIW!M"RȷJl9wwt}ݒ|[GAߣ bST Y uqS:48׫ndKrNw-J w3$7bYlIY0 BZG03lpxh;:]cV[}Bxf Ån=| H[(&I|zhs$d2HFR znP7 A]8Nĵ16dTT(|Bqe!*ՅQu4շgLYSWW=fG}! hAeݘkw+[LZaLo D:`?wkogFL4#6gά+'oؼ`M36Τ;^ +XFj]yn>1h<6[h Mf1c3KL1=gsbzMzL6 jfY`!1s"A~;w|2Lv%G""jQlNx\ʵ"bAU\MU#VK \1T bmH]/66؄u*\%D2yL&k)%jV(4B}UdIjlkVYBq-R\z_9`%0ؘq!OkFŠ4@#8_ Bc V6vCH`K 3 xpۢQ,+9jiBizRiȭyc GsjA! +he@2#%[㩶TVK"h5rbNM!IT=T ;M6RRt],Q`#T:Ԥ\ޘIYY6-ɤۊIWCQKv}ܞu&0d5sLCni2vKWgho`m4744ȉAV CצD(ӣIt(9i0# e3@7 6HUetBsLjp⎊l1]:x=/H4D2-Ps,ȕ6V$DBI~* k0eFE&diqg+Ajx$>$XH)sI#k ;,9 <,%3gDUZX1䳾|ޞrمN)>eҘ*׉Ϩ<`u`kH.aLNO،榚jLdC.WXm%Ze3:r#\_k:I]w*˜ &G8:^ٹM:}(t 95fw#6<]nl1)5NLJ xDyى"SK4*CV8TbhϑLAH$,&.pFIψz,TUX*"W4a#*mH0iVXib-_f_QXS4*aM-8(&?ejt >w8KcgiP#@|+fRGIdbH6T J"0436a`@T!/RNijDNˈ6Hd^ h &gST\ D-KR6WP%D`n[܉jƗ[7 ;b'X!m*Z[BA9Sd(Bk6/%MGXv}o5Ң+0d5s 11d9)j_Kٽ+W^{ʕ>B::IJO#KX Ijr4מw[߃/w?䧿4HR0TK]c(a%G&ð2ݏ\%7̵mGK_Υ`i{ikQ[ooȾLte)Njbeҗ3DAD!(4#X 6eO( >cTN8([LWܱyK-ɒIr`*b%$%0ZHQG%Sk-[#ujђl w;W;SmЕ:ޒ)VJJWk Y~YRmE!D8: ^aR ɢ2Rr:q}1|F8 "V^YR hF~3V#-7v}A9 Pkŗ;l6[;ټ Vэfqwu0GԻoFf؍O9Dl{tNYO%hFvBVjk]3AAx/=yP ՜}52mz0픓w)7˂.#a#99wƐ՚W)ACh%К>VkƤp}~Nzwn[fPZ̈1XB%(Fp2*(Ziro,*Z>gGTnvjj!Mla(-JԐnZQOI01D [Zn&fT-;ضc +nV0˦eU"g(1:JlirSDc!˹=hHLEtgr07wlYxR(zC\CZZ<;y苂XZT_?Oݐ/W?z7@F`Z{ݹ!n1sQ RPX-.ߩ`4_U8p^ZZF``=%@a+A!kٌ+fX6B5#+ގG(]mwOz-RH^F@V\ f\U5'*4+R|+kAv~a8`dHӨfTClӀpmӪVJ%L*I\%+hFyaq+)f5]pe)Q%_ ܨe 7@q$"KNP yGpM"T@&qy@(CRQ@of)1Kˌ#8߃Zg}{9+{r;dS(u1C'ц9΀%ո$%{AT~9IMMU$Mj4g=4|r'>Ɏ\zxijW^|پq^_o}n?~ܚ+nlf@0){q٭(`-@z;B% )iAubz:r5cRbMsR̈́E%PU2H͊ZfУ5+daqbzV Xl4b^̤8‚q p/xrY.g6 LRF39Hl;Ud<!P4-c&Njw&w $Q$͡nٜsO~oҟ?߽wXX$%~4{zeXޑvI?6wa X rJH`%'/M4 ޵'Y,l+eh0;ھwER#P F itBpq.;CTq?S/.J@] o*Kc`T RB2-c[:7}9OkHJųԉ\ xN6c")ݝ6<`g5ЂvL(XH5Mo@M2 Dg*T*8+J*j$e`#hP\z,hI5Y|SG H"@b8dS,$vi}gi1<$q#A9vZfofF4`,Za@lsl3h+1\/if!MߚDVn:/ijlYhQ= דV?R@e|BjND(d99N1T0쪫 $c֐C`;Zp>IOpn_:{s'9.-vG˗{_w~__|+RkU$/*UȲUTqN]PN79 em0bbX9PVUPeE\/Q,3Dz=lPh8Sj0K?8mCR"WXb5@obWܢ=jGR0YzN.>!p hUǾJ^"WNbD4aFҷ &Qt7|L x}@YVqM5hM 9lJyG9NjNDJ@PqZB 6ey< G"jlEe3ES2n-nlv0.%h#Ӭ)X!d|듯힝v1C0-5Bf?mO %NK.@5\i+y}TC4P q(PHiR){qẄ́jD#\P9S1XYF@pY@cTt(Zm nX8{ iȊ4 ҍL _`:^FMv:Kﱻsvk%?Qњǥ;WaYEimW^R+Q_Tp 4`Hed6ZOFj˟+H-@w,c:›$| (gJ $FRJj4'J `'Kdg*AR 0PC|@RP<. Le'i}*\;`毌iaH*_OWzЧ]ǷLU"4 Pö0 pZ*60.B #g€t{hs5gLnE;>``F-rI5)Õԝ(`_@膒oEekxԚ2rs]f1'@Ҡz Tic\ZUUa,ǍI@3 Ε:4y# xOqUA%nL|3_j[x(fr2E.t.SOxB5'TsB5'@5 kϼWոV4mPɍЧH.tc-̘Y>YG1fg CeB%ZКé" 3tLhHrAHU'ɦ.ƘTɊX`8/pbIZI ̌eLZС2S{xuDkm=LkLB8MZXEpelS1Uk~n@D$O|T@҄R/#\S8sUATZ c@&EB𛭓& $vR?ķ\.XJs,A]i q-Hbb˫RvϿ78ҙD 3#&EmJzk|KɃS/ /Qn' ReAYSqT^rD)o:CuTlVsB5'Ts=TCQ*\'r4kGyus:"EWjT敲fŲ9e (=Kzyl.3,u^.ɱʃ3Nc 3T8KQ3Jz\ÕJ%Y?<*VUh}#B^l*0h $(LK?yϚ$2x#`.զDˆb@F1\$}J5GKb%e͠d3mʪvjmJKשFu6je=eX: 6@`uՕT#iK)5I ɚmZ=]218ÐX]փgh] h<#5=@K6F'V"gDžQh̀=07"Z㨂k`)ki}R]+M%=ePу3){j )ϙ' ՜P͉fZ\&Xyܞuj i<`td3FΟ,%Nd57TvU9l4|c˫i l-0墅L$[G|vm34V{AekSZǴqT]S2…*1iB=ֺ_ʐ2Œ5lm볈$JtwRxw'ފY/lPyDṾ`7v_ý}MӃ05:JݰSfT}U'ts/ecL)pul3$`;7Npq RLXa y%荅eiȞAvICHh{*]:`s)I ba{r?Ib/* ~),)$s'qXemp%VG9ΊSixxJNU'Im0'TsB5'Tsx Bp Lz4VƬ@PG5c6n0,â.C,hF7 he&eV' U<*MXgǩ:F9fX5kRiojY\:2*Z3h*FSfd$5Q.\TM,S|wn3g$-8@D5tY(զaC9Ify5iNY B2]`oX]ixb(+`(wZ+-)tCNp. 1QjC}TN(&i+p>+41SK~8Q%YZ; cx,yl1>*FLysH!؂.Q1mTcF.-M<[. 1(kr%H׶ÃH ɚQi5_mgz>l7bD;1 00s-4$jPw+߉v^z}~f}73m}\m͍<8! %p VމXaud;xv3osJ? cN_^ xFh{ȃ[eɅɠKS<> hrmyfv=Gp=GAGy.AJy/ERdl(*D-~ŽiW[ I< 7'JTc&h*w1F"^iVVe ?QYjNjNAjCaUWMRAC!, [@̖^#CLbv}Pݽjl_{֕bw/b(B#I#+M Y` ޒD:9yegYvK@d0KPUu%R@iAE+:tש*~E0F(WXʚ51 UK32R0;J2?:+zKw!ٍ`r %eWNrLm=?7p Zp 5;ۼP4 (y#ҘCOk/T6"5' 7 x^ {\w4֢C?8m;^{3dμmAoxuJ`u?bg7ލmnZ;~j͢y줇^dGfThgQ~~:3{GA~g/7763[;q9܅K򅳕 /Jg.Ivte:1cU߉#*+6^[KU;49՝^ jhR7`cʐ̌?eZYh2p2}”* vM~BJHee;tM-ŷ|J}R=ZE#O;J_f{U )TҘJVRtwe7:$9U5'TsB5'Ts`nYm0/D X9YE܆'ES+QQ'-4HVLmdss0;$gg3ް>~~=\}82?WCۘ87Ę﹅\:WlT2Sud%Qi''gMdP*p* z蓕+':Q\QtW`Lw"WpyKr<^ i5\T-0N`pi}iѵ@}AK<<:Tg;݉7 QBڄh) xC}Om؍wD;gmF0Pk3ފ52M茺y:?*+ SivT{&;n9UE,chl!uT:~,hᇌkWyٷc,P]Vֽչ_&^4YəS<`(WsU/(h{:]4WEa+)tQXX-TDhK*^ F&rOBS|:%Xgʈ+%큌 Dӱ4x΃"Z^  ^s!?s:go8܊6Aay7c0_hO@nBRϣ@>B6#hko :Ɓ_}e:as;v vv#4;&G+ 9•MՃ 33⹋ g7?:|V@>Լv8s^?7/*/6{wjKu8ْ:+D)Z76n+5v:76JI @lD~1M'I Vf@5ɶ6 (ZmbzP{=~p 8ɵR͍D}{fɏ#I@AT Ujc d3RThj:BǺa*X+05! HC"NXX6Uj :yP ՜|(-OL,A:\\m5i-cl<#;%- KA5NX'j~}Sko>={ko쩻7nۇŝsQ~tgGi aF` &K'+sH&-qdHGwAsIWW tx=3QU\P@TY,З1dhΟP˗x^DAAeO*VjE[7ZK?OO_|vk9n0?9NFl098L0g.A(DFvNS9/nmЬ-gڮ[J gt/x#yTc,+)B`C9/C@ȩ1F X&>([SCqYr%bHz%_P ,Ӻ,;?OS;W. 6gn9Qz^ s2FVtHFڐ\6. l/2<4wbH vro{ =}֭_?` ;zËyvxetN?p|~eօ/~叝+[?}quy~p^8z<ɝ=opZ;[la]]T}c7xw>7;w̭F 딺2#^PVii&DfZei7aYFS X%I*8Ԁ>+P npL"eaxLɳt>9_OL>8.=`+VX@üioGX-Q:zq1ɨTWj|g?ڙc{O衇sWKΙ Mv4Y֞DžUal`,YuzgpAeh:Juϲ p,g $kz`C[Tfu_Fg`R;Th)BYZuxDb)1FwIß DT8I„aqx-ߚkFh~!9عR_.U%8̀NM#iG~@xa vM46B5}cL} b{'>8SKuv3h( ^t?;:*L#f~ݹ _w+W܋ۯ>9~姷6^b`KL~es틿ه_/~W?hNya {v{?)^x×Z{'>޽qqvEܥ ?H1w,/lۗ>w?W~+g3scHxAPi3 凮=;o3{{j;^U혽$~3BnF{\k!Ҕ^&$ԧs. (Z $ΔBӜ.Í. OE[G01j8ZHдr"# |B5'TsٯGOkVu8ɠqڧW窂e xш+u[0o=`hTV%FE೏r|c7HƋ]a;ˮÙ5wR ܉c.]H&f )`, ˁ\Wsm#lYhZ *J#٫fF6mxv܂Ilݝxg'28HvQn`(`3<ߧKs Wڏ?՗v_~_;Ϝ~s?o_y߾^W~~W߸oޗ҇~^W>;/'?r=/mϮ|sOj޺f}۟~keGZu+O>?c_z'?޿uI=tT~/m#lvwo3o<<{7m~ϼ|5v՜Hg+~\P}<=Whe. ykn FkS] $UgV,AònO<F7" rUHV \Aِ{avhSٍ`D^ֿYOl5'TsB5'kռ̋|2? Kd&n0g=C'F'GDRYL*#/O\n?hﰝ-&F>w]: 7>z@tE1Ʌ_1Z޵to/68_k?YDiJEņ+hn@:)/M/9r|o}'7_{{__}ou oW?{/s#nկ_^h#W%0)%opm'b@w@ߨLfS֊⍰T4&J &[Ш$Q85XGҋ.M8.- v)pepWsB5'Ts-yfజm-UkI5xZONF0qFMs{3՞kYH#mr5XM򱛝瞘]B>܌]WTf t8u7J7,2EEk[ @5cv~?(]~ؾx;O| 1_̨4~kpʿ;w?@<{G囿;W~o?7?ԟ /o|_|?{?>{㣟[_7~|3w43{:w~W^Ǿǿ_Gǿ'W/}7^oޗמ{_+|k~sOqgF>?s/lwF.UУ)"L 6K1M`$9EpHNO8\ a:>[,VݢSD1O nA, |WI /m'O9T#C^։I\%XSyƙQx8:vZIYE@O&OFG{̃״7s%~2im%7f>ߚB\&H $siT+L_luT9K-ﻅ.#g;tN &b S @(۩y\߶Ly-:xޅ\Zu!O:.qکp)[[`;> ql;_h__$̖-Œ-2 2c3Ɖ98Nba τ&Ʉcʜujk[}gVUOuTmn{< g[)ę鑙"]Y :nFr7:,e.1X:,[aDpԙx6KP X)J2\J!ڢ S(fluF:/g;Cd p,>'-}v~å&=3ss.z4:yk.MfݜC-}qc-a{֧X=TWTm'J(v(ʳ,p)t,ϲyzڣYSFZcBZj$aћ:svطdɪ n.Luv>Q}w{wzpSo>0+14AIɰ(_tyXIpe#/B _3,3ch˪0tDD(Qh8c]k C(2@9MSjj3Y=ԐD4LYF8!MuZm@Ąmb"9NڮNZYqeM%BL0*@5ӄPSI8}GK̥/Qjh!p}qwUЈwhֆf<3 ʀb INP"_]EGp:UT&iPh_#c, 2E@Hsi cdnL33S L5t4\5{g[_(&pLE.!QEM hkYXؑc*d뒙6vަBO%b鉲3q]ee4#PlRS8(R0`&#a\@Fx<W.>z2A .`HaN8{-}wuѩ[kwxhý׆Dޞ]{zb6wz7Օ:*\皝kaI%RSl,3,6k/jh_=RY1֜pKW pi{6xswDX]lyB}FcQs}oQONG|*-XOrRVZbHbmL7EXlZtJЍ@p kC4d#VhCde9rKN5rɩ_R' )KkG Kq_-.HuZS+Y61.mfWS2P^_❛i tlSiVvqLpo$G[We&T@ 6B/u) md 8>F\'<ݚO16d*QlabrRJ,wYmmjps8䧭l) Xv6gâmH! ( 2`i;E2â̼t bW1ζEQ `}ES[KB@p6CG+ j2 +9csPA6B]3C!@ '` aPMTVE+HE0\2AM( $Q4>rY6Xg/j[ISZi]]t{绾~<.p흻GmyxZjxzLC{;f:[KK׹e:VG3"38"2">-׮Hq)]-kcu7VX3hPپњÕKvt,:@os%f'?loGZp㉞_6_]?17$c[RZ\횞ojAJTY;4^A_FupT hf8mC B $$D!&4$&^ h4(,82L$9%T (AQ[Rv0" 2݁quG3q"`RVMjKܝ63Uiej!ʴʱMER"),d HTH$KGOSU122P0$ep0=&`=6N0S5 FfNFMX@yF-`Pl6DW`h9JtBQĆj|˸(TNm{SdU:aؠDJa\f'bM5)\ 7`5 +i:^:Fz6:BWMk=`UID['Q'@5M4VRW`U3P0)ERƉ0./DGFP1dZxޚzۋ3;8^K̑_gJ_m~y *fMvDVf['CWQI!vY9v%kk{FUch}sKG뾼ĖWwvئ`{iTۻnN7Zuo{Ù~?X۹kdIݗ-vk{foYDI$$A 6P :8FH 1dMh Q(͂x-<040SP@p( a,9%T/YidkNF8xC}\[ASlo=6!i.QUVΑxQ3m3mR-3EqIJp$UHl|R{(8nf8.*OU+o=;_:Eb8ArVjק#qH,(["[-3t4sQY ) tibbfʈg&rW9EVk]%v&%!D#+Q+XpGMs2#Q` "@"j@[‹I1ZUU$B-,rs pmLL !;%v&XD6njfeSw %SBbhAfL;]"⒅#hL N"%P"bia!F *T~?>Ҧū]o/սYǁ'^긽Ƽ=]% 4 i!ԈH~5Iv9me#M#ͱ'oց;;yH-?sç5_yqwɩ݃E'_?{v{U7RygKţ]uj}_;#vuoim-4O\ڦ4=+'im+Q绀m}B/CM#{ \2+!մ@0*V\A 0 Cѡ(-eY H6M#`@ChEN5rɩF.9Kj LA-ՙ,v6m%(,u/rf}5kl5.Mk|ZbG=7|Z0+CfjZǎa\NF:"omkoM+Scsoe;f!zn(Iq^FuD]4-} |c($ %ʅB2+*B-0ݨƒ!2|4_IS2,Xq(vNkm e]3+d̄J 5Aي+gXX ' c ʑlh73u$FB nEl&^F6.ZP֩عĵ4.-Ə%%qtBQhJrH嬯KÍOn{g:h˽o9XRgu{5Hf8%'Z D) V鞝#gδ]R _xە/W>]xuls~qсkw|#=wTwgmTٳ-vK[l)Ni ,90ľz.A~AxHIӈAYzQku&dyX)U*f 3/f .=X$ه#0lcnHFdn{2g<( Do7irKN5rɩhf%!#1<0f1"ḄbkhFK\VX6rswZ~U;3CB9"?-9Im dˌtxNH{=O_F5^j|wE+V1>ZE Wa#iN`3cCI2 fd hjh6YJF͡ ",*Pg1,S670\e8hk9 pRz$ܷЭ0(NY ;XEx<]c Y `tASqX2L%(+"af}޹Ϋ[Zh|z񞺻/N9T}jg.l/.^dL "gU6wD19~@?^mLs#O5:ǹ7^{ws+|tfαdzCN^4{pֈbIQ}CǮԛ Еm&No3c~_}Dy{J o#=@Up-`}>ak !h)WB;'hs"pA8(%l% "ʮ2/ A@TtD I Q+oտc\Sjj+iX.R!j{:d҂M#$fE~u{j# }<s,Gc6ezD1D!\<!4k{ $V<7,?ZxCyMW/cyH/$=ƒin0 s>W503xIUeX E21*Ă(,2!7~mcV<027WnU)ʉua:(W.'\ \uUfp(]mnsyB!o`D4)cM 6bkbӉTJFŚߌa~s{6ugxԔx SV3rs,sb1,uT*.._a3yrcX}N =>\t}枲S9{K/>ڎ]m)Ek 8۲ ޒ- )A?Zvso9ț#OvqC[9|~iKn Ό 'ěsliө#} 'Oo*_ ";k:œ,6:&fA`4@L#6ѦZ0L ~R,Q63Sl:%(¡h9 񓷡ܟrKN5rɩ_:cY,\ xhaF{T gc[H}ƆRẐB=ir+r%>$O_rX 2.cMcFenuF'%I &xxݔtG EQcsWKj,/%sO gႤ;!Js0Q4WVL0LLmt -÷XD$r؉1~_{S=* !4EQdlRS20#P<h'Cm,]+JXِ33Ph4D4pU6ߐ*( %@`j:Cqe9ljm*YׯIiq,s-wi)qɷεIfƯ6K6w76svhvKתCbNl ?:shwGNڠ<ɚ4qaGt"'3H ja`J܈…-~Q`AQL-<vPe٫Pf3HGbdŪL!h& o}?T#/`4!d&:.tk_dsX]ڐbl#R&C. GRb~k32,red%sQf^\ D>'K*t0TW NDaLWY `sg Mc|AhNI (6M(`)bM5`J *ьYIܪLIm]I[㦇7;iu2壑, , XI[ `3 3qF(2Qdm  l`lHWR%(XzD"FÅNcMg7e<_Tmo>]uurTCHisgή}3& ݁$ :%ԖsS gɽ΢;d6'.l?uYVAP aTsmQRw}No}XWPk+{ 7hg_ iۻRc8:g0}@ӛ6u&U8G&rR- ;j7%tfGѝԃBI\c ;UQD=#hKCf`d)̑8 ²W`aH F*1ʦHECYy=k"J{=aO}go-yv+_\)IB$ "TU>.(@;`(_"H8#="1e+`$UV 똘YZtTh'K۳>zw }Koxwmig˶9;:Sv%^Q|fGεצo[dKvoTYu}얂cc97d]%j69߫(6-Rwuv6d{5Kh^wxݡ։2Zg=!9pOoTsPߦB͍[;j}]k3\"éQD;o-U\ǼlרpN\,?8H %$%!8qsC8W*VD(kLAСHF65g]X&L_zDm3>Y"T:R&lchL3dq rKN5(X R> ̄* S$ oɦ|}jnaOթY0vj((M\QRR^\ƫ*ۭ$C&z]lK©v oM=亣>~Jl8DuZv=TmK*J]:PtCWP S "e),9>3;wwXɋU/)tv|כC}3nwU#H%FC)X` LfPHr(k&bt"y8 ( ñDUm#Nsjo:ϧ>>xwÅ[Ow\;\sXʼn"rG}doꞁ]=Sgiyjⷓ\pykٽݕv6?8ynKY{3Gm lKPR_[]kl!D؋rݟ^t,<5|ǭScY< Gp( %J$Ck.lm ;ؐefXA+BM-?5Zo'ڤ.~6΢F;2>;}3LMgG*L5]^s@˝=/nj;־'og﬽2]qz,މޙV]8ڼg{~{[кb۸$FBhmPgX[TgLg}{S76o ї4R[蜖̍e$D2#$7?S[)tU+rl) r{sB]p\7cC% mgo`i'PU7GBd 1t"EЄae@- EP+0f GPDT#jT#s> ޜz9g*;`h`SكgHTAZYPB{EPOuDGPc8ᦈR" ͑kS J?χN;8ilb7]P M:)um$ZL1$b (TM`k, Vвհ FYC#P.lp傕 NH`(Ð0`0l@1XbTgT#jQN5(:JC, @̔ lEW;gF`)\vH8%;b*xoGҎ該бm qCUa%iiHVD3$sDDGd%Z+FlA JlX(AVP2éFBBC+Ad( '6jz1Upᦹ- Ƥ7JnX7$}Yswo>_Jz'oɖɩĔ[7I퓾ݞOGH\pO.)v)s76|uW{~{۝ ߧw,<۶jTт:S;kkkBl9ƺc%{f'o[}@ oo~yv<;v@ٮG6ۚ76_hp rU}n9ލ5Q"+J|Z*\*r&[Y.ٹin¬B} ]t| |B.<ko (ܕ]dg[QpP,%h2C.8\Sg |)iDRAIX%E@Y+X U ɒS\r_G9-8<L#iB|&: uվ"GzFsJlf*Vp^!08eef K"K[L f4YU\KFYLX ,\a@8'Ŀɗh AQXI@(@T, Vh,g%e'e^*:Yxc}-E_O,o~`z)郍O4y}铱_nAx;ū]ҳMKM ?ǎO.-\~:-zJ*(=(=t~~c뻩voٞ'ot}dջ_v}߽vh sw?k+-E-YR%sӇxw+A&S{;,`d[`]MG7^jyxk.O8ٱŏϮ]ñ6%o.N7M0rZsW{2âEE>uIm".?*3*5*!"2-Lp e{sbg] gu=넳J>Jފ,w$Lu=тG) 4)bP`7+P,gA'jT#j`,[iR` i!^|D\òвq\̎ +o/l)H4f,SR0.Sh tu`U 2 l dl#t,aL2 0u jX=kO߱/lM&Ņ AGe)lbb(iʹ2xv|j55/<lj.|sŎ#O>?r[zuͶ|mp酶7oJ~vzqܟ{>Z~znI)‰s?|{ƹO/gHk/Yh5f/tx6nKba"=&}{G^@` e|FuH8>4ܶ#C;G4)9|@mfw=P|G5uwdBSvꞫɹlغЊu^U>e9Nlo!2͵<&*݇biwP;Tr@ UHpTCw1x764Db9L}`+Pm+qJ+I ޽z1:ۭ:]j;O9Xk҇|{Pzwx=sGjnt'㋯g\<2}t)‡KoI_vۗRqtnߏ;_{gV;t s߷~gn~LpN՗6/^j[6=GϫwdhσѣL̓W\Wuph:`ǧwUzr{׽3׏w^<||{ΡM{}|[o/o44WzU{WŬ14sOֵUP„1֖dIWE$|\x;9=#XwcUY& 4B%jn3ndz 0ʓѝ6bQ몮nl AP(VRH 9%9ȩ柨  P@vNpp|NKKx9?mkkmUu%!EE9$:4aP 0͑(A9(p8UELu xPu xTDȲw^W,'@@\,[!|_d60}LwjζK Jo0+}s{?n{Xk&:t6:>LUl<Ձla#P +xCu^Ű=TG4E2A2]H 8 +$ ȩF.9ȩFN5(fT48]M-b18F%+x&ڷlH;9^z/sI%p;[ Da` @@,( 3aI(4Y`5\s 5"3hl m儦ـ1t4Vf8Vd`: !2 E~ɡO=+C/I_9xs[4K~́?Qrm<7Zn+;!Ě7kO|9Vd֯F?|ssǛǤ{1{?>OI얾ߺjۇϳxr4}e{%^gOXM)XfJN-qnl)c>Mnܩڌ(XZH|C&ȨƖ;Nw~/xj=gw_;i'=:"n Rpl%DH:H&\>3(%lװ7YcMP66caz!,MO#~U8YA0'vqBԏ;>'MхvvWV-XMgoN4lK߮44{c/qá>\z/J1ܡJ.ZxAؿf,|86ϸNOU3ey`^t{]̀gT,`K"g,'T#9DH"0G/9&RXDb)v\;7FuZ\>0P_6^UjE͢,48! >z;n\zTzҁǷk߳]zMzSЏ?|8%].}s&~9AnVtDe ‹˃_n}87zv`1sa»-!bop_z[;궵ƷŚ” cdQ9Ec#c}cFkz˂y藾44Cqc_yq퉪;.l޷IhiB0%b߽Cwf:0ȏ{^ysk4H*n Up󗻛>=?/oj+IT+b25^eUA-k]+8qH\-NƦՔx]딒n͉ͥ8־$`=Q`$"9emjnEJd̄>Ɩ9Z>PjCp#3IjD/+b,0ZʲD?R)XN5r뿗j_s؀0ْq0x)AQ >X)ӈ4KН| ^Zpՠ `r_{=_|5MK^z󣡅3wnv޽F鵮/^uP5ǾɷH'|?z/7?u_߳m_w[?_s7ݍ?oמ{{^G~r̝sJ&k/^5Z 8^}㿸Ɓ㛇=Npcc<|Wz6^ß:T͗1tR0Lca}+rΨ5w]kSlmڹ' ۶fllݙܹ#[H UĈwF@5T7زJi-!@G7E$5RRF쐂 {p[nZ1c##l0@.cd }$f'QH#ڨݗԫ6p2LŁwI#Oء;մ,!xTYĘs#u럾{\_]yG;ݍkr/4|q>ݫ?\ғUo/sk_ů|/cGxk6~ѯݯtۿ}o_/}G?茷vqyOoco=^o>{___{/:5ӲȍRm-g87Dz"hƹÝo7~zuǞi_잍lA9N -NK ʎb\*;pw]k#{o%$O8/z N%fvWIbNwϸcd.nӄ5N'A82LuKDa|nP4ᕑ2f6zmv1\6gA?gtLFU(I,:Z|yo1%#d"86dӅ#?\Սrk߹ǎ|/P9o=xޣ/zƏ~󇗽Í9ǻO7.?~c'_oz76h<8?xG~q?94误mo#r;37_Mo??yo|#ן&%^u[j׆ɇ_xW96ʁ7o~G}=m^~?=1;PWѩU$,M$I&-Jȝ#insSwTwnmZ[Q,HIlHY x @ }띳] +եy[JGu}{>gm:U#en!zQ")r8d-'(*J!TFK+w4ܒAQj T#P@5{kBڀjEšP{+`Uqq?xm#)ZW'R/Sp| FÄthc,2$%A'18,|A9 KHp%P8)sj&@}tV@5^7ߢ%uLB()u:}׿z+go=qى]oc?g/=x_^Ư=K^oU]o<}}~}_Ɠwo5?_nӍ7˟]K{#~kW5{Iij74]'xg㗷s_Wu+O]-߼sr0Xc^~ }U/7{ߛ=x+/>ЏWdV`8Z1[766QOxVAT#P? ًޝexs"Q 䑼.^ sb$&Uy>M,t9}jbxΛc5$4سjI,# S" !h%NP8S!-3$GQM0 % "@}MH"Obw{)2 $)!-XKd b[;|ܽwGq ߾^.}^}׿zgmgw ge/?q?ӗ4^TGkzۍ~~;oͣg?/[׿ N<{ȯ_ٵǞn=kzc_>p>{78[?|i7Zkݞi ksUcpcvK?W߾F&fV'9*`qƃP&Elo-yEW6uۡ;?37o+8c.)EÛ䫔%ZOէUJ}p$>izg,+mKz֜^ѷtKsKe:D'Ht Aa$0Y6쏕}.j?ɧ*NkOAT#P>>f!{V dNZ_lnDqCpH(H)$gZ(<%!r2ަOS2LK6k(Y;@[%)w`jI ,Lp-/Q 膈T#e8y:͙ T~p2iJ!ϐ )"ˈb:D>s}uޱW_q5qXn۟|'}<~vݻ+s~?/oˋ?J7_o|O6>x~} ?٧ gCo׿KOoO/k<{[?__}`nY7~bew^>wɂhA2?wٞgơWuٿ{8]e%֠LĐ)"ÞtAA1"ASHrvY㷝wE{f*wc4 8b?e%/D5./ WUv{'s 5M[S:~?(}T'̢30NPN3! Äj{ufG#ucp&$P@5[YNQ^¤Lvo(tJ-է 7d4_ 8iYhBqNxiC17gAN -8`*'P8#aqYF%D ~%NQaa7!ns\”w1ŠɐhK//;~??v /Zz=qϊ_ص'vlt1wqEg ]ώd~7P|֎;"ei[ #,v-BPVpN1$)Zh CR|ܶݥ.ym̥ZAQ>{|̷Dؗ/Uw. 4wM'V{ڧu5͉ਤ#.xI|B5ecb$DJl(_UF@5W_a(:$Ҧ M6Ѻ8̏+3h@Lh/,$ |@ ?CZpG%xPe|wnhߙp8-5Pat #d`t}.=MREg79GW'װ|?+g_5s'FxKFrxo_Oo{S'>ngՃ?y??;[_8C|f7n7gn^u'F~>wmݿ|z7lxͩ,Sb64qEsg+%rϬH}eWFD}1ɒXR,8YujDqO(%H_ 0^փoSa* :']^AHP!0x|rc <3x*1i n7hXs Sj T#P@5jEm@:}O=o1yL,aQyz?cpϚx!GPN`F"IdI,U&}ъ[mDK\6h5'2wN[r`֊KBHP^Ŷ_3LJ GթFt HA',j T#P@5?:/8 ؊֖4JFL_ &:b2,Fm8md+lȠRT |RY([ .5[35$>Ϻc8?7'7HjD! 2(?T%y*7(.u/w tS)u}ܷһ]_ˮX]ƷiSpǎؾ2]پ7M=r[\=?pE/MsW9מز~ffis=3\@[+[_fi͕ n[Z9pyS~RQQ0zI'j%gJ8 i`̭׆&'w+ B|I&Xf$7曞l^߸*z%E]L5g|bTcfas!%,^1wΪjxUg8,(0[wŚYpPTROeH>i[rt:y@5F ߦ$y[(dF8jHu1:!*0wlG$ޙ X};fզI6jph vRc'H/Ԓ'tᛶ`=71&E"DƸ6_ikU*iJW<=:g\9n[t̶=M;;N9+ir+rw}*?#srfmj=O9=awpFz:[r]ui[rm }];Oܓ=pcovlsomlc^crCLLjbxT145U<|̣׬mpkg~ӻ>7[sj`ȿ4 H^${@_G㓮7TN?l[SҀb? mھ$Dj.ѳIǜc06QVw\ぅbw,ؚ4g&Ã(tōb6x(GE5 T#HC|A ofT8P8:2 M$I)C= ȸ\Dhs 1jbxٙt,קd }ߜ>(1WyCD0i u=?w'# #QR-Sg]mZ[Q' #98gY107޳l ;6ƺao|˙U;«wFlݗ~FRSmtnߛ8ʭU;Kw#\Ύ򬺸TQVm]UyepcN_n23uҕgd1*?Ȕ#qvp\cwy_ Wލ~qܻ__/|G $_Qx91nplR )n!ԫ'glX7RI7Z94L!\#dXJYV|͟wXHX*I=a0@ 1d!dbZ[Lwc g iF@5ToM5#לoi6Dp B Iy a:5ݣu&4Z4v'a7YZg)O>8TEJC\); /k3 j =ܹ.c0eR90li Cp EJ8DDf}kM+YK~\`ji}Gr}zpiigmdWl`]?%0-k'=m'7 Molw-3u;@9}~RōHTAg{C-hN!<#N+&2&ɍ)͝#Gu'?r=e <}qū0%|{(̉E|$8sBY;i'5D;%d=0C sK1  N|ׅ6Qk@-!(a+_LNm+. 8AA2̷)<-ߣ V/0 ~Bc8EQTs>F@5TCŲa(H3D><: +< kVLgniיt4b*VAIĕB\y],>8Ov•YL/ra__rFD)8AN`xZ 31Fۈ! o!1'Jpoc!,_㊦[[c"EpO+l6;p6 =Ici\fr#4X[F9q,K:QO0 w uO w3~yfIH#Ek{pgWVwHn_h5鳏m{yCwVC $BI"/ju#@')$[W$mw&d,-iɽ؞Zhlɓ Ip&0GAVqS& ~%"s'u2 wXăv~ (@1މ~= lM@5FAegH xVE Sϴ:&a}[KEtP~Qߴ;5H~]ks8A @pFb8"v5g:hkk +AY)+q*)QFIKy\UTT?j--6% HK 'AUԛǀ\yԑmYș=U&ЩH1!i)W\}UG/pmIˋ}+xВ")$0,/bΒ$o `Ǣ<ɯ(M51(J0"LH]Z/ ɡwB5WZB)4! lRicQ\`t.A?>.?* I$2G.L"Fj)v 1+s՞\}Y4:]kKvCe_ Y,\ysgv(6 v{ H]RU't\'_W(lvr+ԑ!5, yz[!$ z8 =wq:G="qpx$| NlAMaPSdʝi6NlQ$ǽy•A Hi&dP1MnP?f=cWeg~bw{wΑ;ϙlVcEĖaI- pts4_2I1ܝ6U #,(4)H95EY84Ls@U1oFIKe$X}Y;Ey-,(NXJ"'b0h!>t!""-9Ix} DU΀ ޛ@ @n$i~'p8SW `&?,j0[uPO`L#(SXr88 jb}1sT>Ua@S[˟|gNݰo]`z=2V7ChqqA;ɨwF(2֓` qbN"iEk]Qʴ+fˊ6;a`'5)fb̈ cB"&fQ%y$2->4C9@JK"g)chY`Z j T#P@5JNCƸtԪJ׸&-ѱ* &\ļI?!jIa4i0n$`۳΢ȝ"&IS$LȚ[F [6X@D;(#a$F!X zwO-d'P(Bq 4#10?m)Ұ&;{3`6{Qf}9ʓY '4n#b֤ԙUx$Z&e2ۯtح+n-ܲo}W8;tG $DqVzR f1t=jxo841HTNU\.2vC cH-βԜ4qJ*wQmdAeֻfHt́ 4ֻd ?oEYOP-,Hj7L ,9i+[;FL ؛'<9,I F[bQCq̔mR-MÐ%Y=;;(a*n=xP8j6!hB s ¡Ƅ!4aA{[챢УJd"QaEi OyR+qsQ$aeRJ/kצMrMΐ6@;zV/@GGё ,P@5 `Cӑcr}nw}9Ĕ[)lnvw"_d'#uIw Vx*ޭgKZPBna8ⱦcK%O#0_E eJ43\>Td1(8\-X8Ԓ[}qKaˊz,_P DOu{ږWφXQ?g+;=DΏBKN*wrޫWi'˭9"! h9QqOva_6wZi3V)(UEI&^&p )Sb3 6GIS*JyŨ^`(\ࢂ0$F"?$Q8 9&o T#HA|9t\on6LUK3,i\9I5-mO@fdpGZ4bDT&xdLSoKTw&zWe |K5N(FI QgO3R5ExdLE2:g›<)Op8 :Gpp8x#Τ$ZuPqfYe[f"]gW;a'NG[(Ez0)HIuZk C=2_Aak.>VǘCJZ8;"*^(V -KXNΣ ^LgF%6b UJe6<'GJpYi'q j!$`bEbW֜Ɉ@5$PǦkY)p?dD2𦊊D^N)ژFI!{0,,A,jK4a<ʣ@@8.wN"%@t_Q֧: lZ#  /q%T'(Q nYU*#)Hzإʵ+3m̟&MHK0K'kxYŦ(OтOWɧF{6e^۵2z,2?8b56POB]bM2J"¢dhդk(a8GZa?jK`Rl}NkungQlVH}b4,)I5,1h]*Sd*,=iڟ@AJZ{P"R^MpHJ]h% <&u5$PͿ:ɼ#Eݩ rDm6ePaSZj}am mpgC C 6&`@A$lI!4l 1o2@T/R$Wp5ISWUCIؼEmD-1F8B?)vH"Y)˽XՖɲUi[S1j`&P\M+hFƘR]RƆؕKLVDfdɉ=}0EE1qDBB$R d99 RZaq'\]"'DSA$u!$ x}\ IH: m:b3Ȫ^\jaF(%A8)?.?0/ l$Z;A|,}Q)&XΨd4 2=6*'K7+kD-ӻ%e69RoC~,xWF@5XP @-; z=]2'đ-E iNl MQ@@1pCIԔFԚe#Ť4^mRAHËEh𿀢^㤅8*RF@5>^TN^jZVҤ3&{'šVe5a}DB4i0ߚ"91q}DlMN5]RVcQ؃@F-IBi'l7Z} bN40#xHaip(ER~qc*M6,]5N%5;$ UMHw[rfǰMfP4 >>4(WDh ?͘f|Ԯ5&lZ}Xkhf*{8&S[ID:q%z8^ 7-TŗL Sk-ڣT!3mDeUьEL"P84dE^@V TPiFj T1 KN8!Zb2V׺r- YҒ!IԚ|*,$Ɲg|%XUŞED.-3bOVhCQV{tCqO5L{e?:?_9.r8`(SxxC$Bi~j5> 1+h"+U@,[j\ m,W+j:"kκTvCvyi-ץy\M(B!~^g(!p4hñ&Ws[gB|„ ㄗwHy4P}Z tA$I ,b(<]$ތ_QwPeV%i3i4f!>b&H/NT#P jŅ.Y ,Dʹ`,[g`Uٓ`{rdpN& mLH\eQհ s`HY,-u=ƁATpVn&FqkА(:T7@$%(#s4AxD>=GҫuhiRM[f(Utji6'h*u`|Io먛;5@@Q,ڋR{1茥lZm3P1$I껚 `hbCoDE)7 F, ,Ar7`Z!Eˆ$+>H[D(c$#y0hXpeX[-jUF00Qϴi#Q?g+';>+O`j$PͿ~p4HQ{p:ZVMFr#lmҸ)9R@Tࡪ< ,_Ix 1&rflȹ Mwep>3rWʊndl565mt&f_AbMs%0ѿïv|8 Y]s-T*Em*+MdjM FY̫+%uWbtkbQS*zG,C|l),";xCʠ Je&Dc\XHl4CAHw`CR|o51/h&v|ZٿA-(44D7XףxK"Q;Pq𴭰/&ܞߒm Dgg&xNdpiFpZT#P j>A K}7F͚Pךd_#U#X0A±ؙ""UY]/P@`њ<ˢ4V';4C(w&@NV1|%mO>LۭC١PC=lffFR4h4w>|T=PPAc$d m\kvuU]u墶Zw[E&/,m6+nrd{趮;W" މ: @ XޫXT%Y-[bKeYݶ\ǎ'N'dw[oY5wgBZ߅upp9{~ߟ)ݠrU{ꒂ 9j~qGb%͉P `X=:Ζ/$$<0Q0›2jث~y14<]6+ś1O s#6>HKH[N*Poj6uF}a+ gMMԢ\ JKKJTqVI1؟Ɗyam{ܱ?ǀ=0H5PjfbFГ4'f>wXppU^ 䡰V4Z;HRJ匱ZZOfVf2+j}|چ"_m.@pC4Z M(/[ *;lncm]6>Xf9@Q7$yk"EUڐ,L 7* 0699CMYV\[\!QR؀S&j33 ʇ մ|5jC`V307HL6‰I&5Czwj4OX{c#垰3PE1DdNe SuQ&RLc3s/N0Ul!Ju2Fp?R H5Pi[˟ح F$WfFhECkWyeF='!-*g~qvvB[;,1G[4Z.7KjI !@T3KFi?]s/bӸ65<2iwv=YZ'(57mSMBͲ横MmUuk;;tZ@~m]^S{VUcfLC>?&Iǩ8%Z:ݾ$gkU-+fF=+Ý. n{ltBլo [\ͺ` (,uds9%UVb8fo0#z4eKtq,Db{Щ l/AŸ<1,-[98Qe"cܷyjx^뺱# :vIG墁ʩn`nW^19i.9f(HsE[34 ja0%jG%,T7.%]NJ6R (H5mk J I {W7욦Gع|=%N.QlJ3UI\$J}iHQCPM[Cmܟnc* Vx :Jr md,%IJr` ֝=0sвgNԵffº ËGzJGEU@K&<}f2kcQWw*IצX}#$ I+EŔFLs2`hqag)RŘe%{Щa bQ)rXyn_nMՀw/>Y?Z?;MnX9Pq&rjٔsӔ{ʭk[.쯘t.Kie8aAPkqDP:-It?IHbKNjБ̥b('_bYWmЦi!@zj4pz?澇*JW"6>m{nZId尯[ gyCylCݗRQYӐjk: mZ 61c"0vru-<哞f;,^ uQwm[vh\<lѭWsUt뒦ՓNGGbxAdo٧\+TW}JGrJ9R Z 9ցqV*U]aM>fҖEt/QiELb(%\Ȇ"FKO/k{rYbޙkN Ww~C˚O.t<ܷoMS3'Lw9͖m׊SJܒlE)##ųbtL4|8M i`ǪYc6|8wDdz,n R B5jЃX sH-mǷ.8aީ} \^?YS[YIuel]SZ]R\]SȪG;jn#`1\mVF|md3 _?W fϨoLjgu}s_IōGZyruU /k|z+߽,vi;ڢ:4 ?cC1_lep>ߥĚQ]&vq-öR8E8fMa R  ߃(F%<1"11ʎ,U@S.Sk*) ؼɎԪpN]Э ;3++BYul͓5kZen<%]5& YW*pʞ 2923"#5Gfԯoo>"cadߒ+nl>]6,߲yEUα4uZlΩ4HQ1:MzS')feWvihvdTsȒ9Nj>;#:, _kaGoH钖]ǦG6_yj^p_WD>69W|ig٪~S_ʎO>Њȣ[7NG\F8K産 v&фZ2P]T RlPas͘LH2Eٽ/_  tGm2]eYS4-⺎ Oze_ap)*SIfpax1IV%̺xjDG I035W59۫+NnݿcLӑUOo9ڶݫԭ ,kX:]Ϊp<КQeLI"s8JlTCv0PJLt#A\M!Xj.ѳ"~=gf'ή92igosWjN?Ow!U|kl*_]fnx1ϩ]ʾ, mZ=oq6F]hΪf&loͧT R@5eMɱ[qlKϳnl:Ӹl;tUT3hUPTc.Ud)RI֌b\@F4*77ԇgFkK3ef.E)$ b}ЯlTdMm^SGmݮ=}#};vTT`c8s K-5cozy͝OmytQݦߪF{Odi5Cud9h)bb0 (H5PjLX5B8ت'6Y}bIJ'_[PQJscMv?U=vOÛT d%;5;E2OB<[ل Y4˨R'|$h2~xtGN}[~}[whY3vo{+uBꖰe硄BpRMBk"S4EFQ%1zU![ʉ)%61FFjik97vlv^yzĂ}={<ۺKv7;t/WbK{[{~c6>=V~d_ۺo~`]_~h3W[G]Q^z7d~ΨIUp|mϱ=׎<`ecmq X Uuoj<{e:M-ѻRtdIrӌZ,69$!GM:!j;"44_;> MW֍9}cUm'kΫݼ0hr|Dh^./$AQuQ+cl3wC |7ff73W#F- i)B0}sY?TiSʲqh!00RzBIg _qm\3|nS=++լ^7Tj,hMN^bprBZRo Ҍ(4Cj}p I)ɷ "zN&bw,X6׶hst,>Tj[o!֎-Q{݇*N-lk'ˋ+N.9G/m_rppHhfv1lo676]2*rT/ R jHDGmQsmwKG펮6ܬs:Y*`(ШhlͱVTi2^xXq+ ‚`P N0M,+F,o:r푎[{/zj[%m'j׎z׏׮MuYW^/TԀ-JXƠÔ Tal`.')B7 ͛T11_I.QhG\ +tTO4 j5+"0ݽreԱlgUOLԲ}pwN+Ww=<řeO_rqs-]jvtTt,jjkօ~Δ]KK0€i'(H5PjaT1EDs&sz~ڞ 6-w[fQK:vǟ e]Ǝp?[Ȫ GA ?3CfQ4x'+WY68󱵑]+l{v,mp\S3PY4T[}nFG5LhMR9&-[dZ ۫&#fV򙎚=3U*twsN_ypqdubL6w3.Mx3s4a=0H5Pjfkx%7#ٹwe#- %]B- cwE+tU)y4~io&!@T3kySpzk i|rzpg#yh;ܦG]BU#1L+fS_5!bﬞO6#pD]$XH# kEltgH*m.u`L3r  ;TVdٹ9RFX' (YX#o.ji j @A+ %y/>|`SScgOZTnllRgsdr{4iiA"1w#!" M?q5"@z0Ӥ^Lb"ZQҀ S e"4ed(U4eTO7fSL4IYI,9:"SLer:M+R (H5ڏR[EAgoÊC֥e6]$ަ–:Q\*)i8^f`KBMT1N(WjVKJѥfhs4yEIN4#v}dY3o|M(iḞv ETm>"3*bGT R6Irnyc\6Mvgzk"agPU3*X!"X2AÖ8 L*gp CMȂZ)"pFR# ,'M* Eqj SR-gȒU)r\` U{`H5j f%4l6iZ QP/dijkFs]l.wQb UKX7˜ô%&T8 B݋lGKuYTbL !s8k,}ό JbB$YJ~6)6sUE% (Qu @T3842ku, 5Z#m*E(K4d=Mq| lIp*Z1Ca(gS3 % YnHr-V_^GJЌ2(D/̴$b1WR }/,'e+&&J V,+]Nµ6Ɛ#袕 gm{X!#oJOB9$eP1W.QbrURG"=ίCuFZϹ ;x2HF3,41j @AT#-$y U -]UCmeVGJ4(ƥ&E"gQ 'IEaKBmj1Ӌkb6AZ yGbf8fEUcAbPl]b9Ky@"E`fPT RͬBu>31Z5e첯k\:i<;󧮽|͏,6lX3k84ȻgXyRG0m4-w_JL!Oߊ_-j0Č!6`*/=0H5PjfD Za^>Ո\Awpk{Ƿؾ(ntxXoYz&G3Qf(V"0ԄĹ'~>6i[,t BTjCQ 8eeLDZ E)G=B R (H5jba0<)j̻t=wIx?6 JİZRѴ!3#+ZlS J8\]C" j[հV$O|n8{`H5j ̖H]@vz~fyUC]HXnKт} 7.t0dSbIlmYB5 >-[b.:@,˗f!R H5Pjfser?ZPML-Z\TOGxU\?<^!6T_Ut%4EbĻla#3c4|zZ,[X-);fcV{` R ,iAn/aMC:aXM,[ϊuS#=nN~ ͂[=Ģ8C *L&̒^xd7 @=0H5Pjfj*zO._o G{k uYv.Lj.'-C[ib]F[jpVfؓB6T#0i @TT:UV6٬kFjk:cU~UT6pǚCP"9^@21Rl%0Tsa@TQ `a[b6%]ShMɰ&,+d9n H3 b t~FXr]x j @AyxDHNJZI"l=գb1e?֘+JP MJuxg6(H5Pj޹ޗ Ȋj&{5!\WFfhcO¤0( 16dbxSAMPj @Ay(j0 _34v 'L$],yH#&ˏXy33rT#ۀ_N5ߍT R2Ҽ Z%E ܌t1>|BO9W: Y£J%v@5B7R (H5c|,vpE\(A-D " E?O( MKQb֎!Vw`0bƂ~@;K<)3sԠBFu$3WF6 E (('8QFL(\4EjTvpǘM6>gM"\5oJT%zReZ'a92"XޏH+`[G`VG$3f рcD*1cqYĬ3nl1_؁Z#Cۅc#xI%n4e,տ Ð` R ٬^1B'/D'x8!=kp\l@)pKVP / lC1)AI$Bj$B87wsQ`T(|m1mI=ɥbs V|A /X/D T . $+Td!*QH HS np aH L`!Z)G/PD0  a,.B lj @AyV& @/@8 mń%z 1O:YJ!i+ )6bX=2W2$J]001 h JYkp4 3n>H\]J%x0LГ"irWQX*p6XE! &Bm2@8HV2R6pB$Ē{:1,O_$0-Xx~ۉ)H5Pj {wŒjа1#-/f9e '7D'T07}_(J:ɄxIR7fӤ4HPD8 %a G7G xB_sψ|!0 Sήd z Dx>Kf "{l҆U_G(`-4 )N[(JiDIG"T$.0/BQZH&s|OFD+f[AT! ՁN !d-Y۷رs[C  rs86[yD -IMdeq))z"U$.%>&D88i);E]Ɯh: n_b*'4pZ]l+Ujb?"1=peH~.a5It #ա"#12c)^Bq]H>gn4$Sy^!k"" $n4:!bRw\HRǫtV<(H5Pjꖱ_!F]}ԑ&8]]W>u…Kǎ=5555>tZe\[ CQVR|i` $rYț͍[ 7mغs.'w߼Ǐl~l=M Ғ'pjO5B0o"ֹӁ=ȳO<{ة Ͽp敫?ܑ9s O?wГO>zWyow{_UNm||7dŏM66mźǷ9qKWn}և_Ͽo}w^_~G<~=t<|#O>ePhEcf8 R_$I$V5C ![\Njț0)HK@44kCq=+V 5$@ZTVH!))2(Q;N8uiE p`q$E!X $ f6piJlhA8)܂8"*q'"*#*s">3U(+̭o9y뷮҉=zӧٹ.;eM´?PB (?q,p |jLG sJ(L)L:ӒY(`L$k$-5+́-HIDsqMD('D>SG8(N'f,%1`B i)M,Z6V\J(8$?퀒zFjPcBJ#f$3K+(w%J@)eV;VtO:q_<]g=ۯ}֫7/?~zN/>~|gϝ;sz-SFWMM/s7J1%N)ey>{եJ5W߾.w廯_~_ꍋݼ>+n_{έy~W~k:^~{>zΣm;ܮg=ys/=uᕓ_p+w>~kvK7\qw?Ϳ_ׯ\pW^l 6 ՂFO $H"nN1P|v}4a-xvf7y3 `Ƨ;!<+j*[Ғ4*Y Ξ8^xS<̳˖IOw ghŝG$>^pKY {("(Ɗb\`=͸ Hb=|Ks@|+"A@,mdhh%!T&@/"P*IO($)%A*P(8WEuH9?j ze+if)s)Zx/_}_~/~/~O?淿z;W/}qW?7~|7_~;W߾sOyW_sݻxѧyk^k`C'7L%TQqyW_:7/?~Ky7.{7nƍ@|Wnߺ7|;w߾o[~[|Υw^~ջ_{o~+w}+s;=~ґSx.]t㭛oև_7>w__|'wG__~?w\ySϞ<̅Oҩ7^7~_o_+.]}Ϝk/ܷ^]%|[+~/cև]Bóo>.Q]M0;IŊ](iiT\P(;=xo-H3HCq}̪5e6 +(}.Gh6k{8]awY5뎬Xwm7/ohkkRI: rkHfr޲ڹ}f#Oq'عwMSF[#;OҼ᧯˟_7>ݏy'wo>y_ws/?}w^?ӯ8篽r6mYs;w?u󲕋ؽe5+>O]̫מyq7+_wW~r{_xwope7xׯܼu훷_[w_}y㍷oz~~xNxعǞpKtS}K^yΝw{٧_7o|?W?7_9S\p=~^tk_?~?~׷o駟W_}|7]7n_ݽmOm޴Op꒒8&cU6v1o3H5jkS o7:GQͽoM-."N$Y P x ~ꇐ T@V>&H)XDm (G.FR`6r!%ŏ@c XNICTltsE,3Ǯ޸ʵg=vSG/ |.]XW7^կ߻paU^w\jsnү/w+6+*jKJ%NI8tkG;onW=޶mٶmc[_U}[. f;޳K"<>v7дZa>UqUqLe"Q9߰?zg¹~<|u ?8‹ 2/. ;y8{̗v ߰o}t0?w=ON>4&x2hTs| uǂ42uJR?5|a0僕(,|;  B05_qC;*0x{n[no/5O|?G FNi2*Rpy.+b)>sF-o4Wz(8TL: ㄇ9&T&8jplެS+禥SEI"HcL}>&䙚vp}gLzh:(:t(sf3W*w _^_f7[Zl-g 6Y8X(ͱ4 dZ\ _VwT%3h4Dz t9) fԹo߻=o\i"jJ]"JEX/ )flK4^kL.r.LVʍbfi>^f+\%gs+z\42KbΊ8$&p[Pf|[o}PVݶmٶm}fk)kٚ D|9 S-{qC7\_{{ܳ?鍻uã([-[#'A۟s_StS)vXo~iihj5&ɢz|ta陱}ģM;i#{no{W^ 17|鯿|O=9֨RL ZXQ@MZݢ z)ap\86Xob8hv=;v:|jb|xܩ7Q791TTzovbR5ԫqWW6z+Zu[<־އmV3J"t.&D(b 6J,P6Jz1p><6i..8*zB" b̓l(@ Jt2](&tTWr-r|V J&VvXdYj倕Zbf+wߩAfR 鱙cGN>x/2 ӨÁ+k\ڻk_jYstWV^-٩īh%)™D(e(?B\0StP**R ,'|<KX)J5eW\;ᗗ~߿O_/7~oujj/lDie=0 `B ʟȮ]>ۿ|=_ܧ+z=i[Ks\,7*R3Vfw_?m+j\5N5 j*B)Q(xHZ!\s*h]\WzqyFFJc,#D3z92L  @\Ȱ`,l4+j *SmNR+*jFШflkUBVl ΏpaK$ӧO>zd߁᏾ͧ7[+N_|~/򁇰a34J%Kk~RZҕNuV-[-%˅x9!( `e<`dq wzGz l )ZHK+w..j7.׿_u鿼wl`5{woRVK۩j_ o4`FFN؇Ĺt,OŠKR6f"L6,2R* grB)/@fjnRjbW Xz.pczaaN{sǏMӟv Aamٶm?>rrCߺG?O?ÓgFc\^! 5Vke\Whv|2R-+ESJ$`#6`a䪡aw_;v{oGޘթ.䯞udS?D|{,BfN ŋ)pKHBa]੨ҁN9)K)"'Xe7(Piv~?j>/S_k[oytyXف*SkI*M'QǤXS*f}Q׊~V+pK&uh+OzA0ИfoWZnY^nfYЉv=ݪAl6V[frn\{ci]]os痲 .؎^l݌sL%i)ޝJhPȔ\\oUfԪzS)7 DE0Yp$C].mE#ZMyFSLN-NOht'PifX@܄Ǻ^{4NCjrz~_K`Sr\N\>2Q*7>ICaC./2 rZ9ը${[w7?z?wo?ûo\~j=ه* .)'GkdHSӤ%L;c\ Z+4+z)ת:ZR)bT rJ _|%BS^ʔ3^%-H_;|_=[p>0mٶm ;nG}=_eKd w۽w?޳oxkkWw^św߳;Վv M s7=~ɇ_sG̚%sFfԈG(a>bVG#1*Un4_͕fPC#=Ri>tXLs|OX(C` QyfP5R7*Łj6\H0@=VSk".wKfn4z#Z`m=OWst9ӡd,SEx2QzKnWksЈT>O'"ɘ0:x4>ElzjQ2?0;@ilzètY4UKx0BpA ?+JTV9ݭ{T> %G$Ň@$8 sx\ViP+haTßv4~ bۥZ;saxi|uo~WW~{ zGxUͯ_R'cvHDx0dAKP.-tB+ҹ88d"&3>Ecp",c/j8Z|.$|;zsQ˫|]xP`AA|}_Xxjfq_qͻw/ܲ[|7~hϮovu͏tW-{v?>Om~Cw|GN[Lm6zKK+Vkcc7ZQnmtv*J.5*Ьy>N$a q!hbGy %8JQ^k&lgV+C:b%J8T1qM{aITJ;uф qATJGX6/\:Q!D=f|KP(Jn+zIfR*b#(AaϽ>XaMv鳳O=S[oy@xHwݽ;ÞK3w}uw\pn>(s#`5#y_=}ϝ]h%rBGQ'}~ #Cl< xd`tRLeSv=ӭᜀπ䓁BX0RR F1^ɂ #l!]I-5Fճ*lR% ,ע+u~V(n> Bcn$S>LD:*nQob` pp ~(b\#iN?ngH'\ Ѐs[ Fɬڌp\u;P~:= Jx77Mp&ͨFe쀃\\x1sV1 t83^Rx[oWjFEy*ƙ$OɀƤ1HXM!sQ/ OH# ڬ8&ؐ6dszpQg(gC 2Lj?th="/r3ϻsݱ{v+a" 0;ھo[Ͷl?؃7^;zWw_֦4؝u%N_/nO|k :{Ab=>sCgJ4p_Z^Ի//+n'_|,!+B];jP*VjX<0&݁0^q;q]N+!PmC>B35.H?3Q;pLdhe"*($jzNj۠Zz\Yxd!ҎX`xG\Nl`OU:\1(__ktjjGlZlf^#SH'F&O={ïS/z}C_WyO'=;y}'?۟G?'ͽ{3{ĢB5M ,%2J Vg2mlZ*Ձn AbX)R/du XJ6Ym6*rLd[ʰRUNwn-׮djx5sD ~mSZ&{R=JwbbRUdkY$h0\//]L0-0KFfi \ZHA 8'oZʛOBJ$> uٜqQ;q  CS.~24{#fףVˢqƈ>pmxҠ4~gB~9ʑo߁fjh1h a~F93)OOH O<6K/t/O<7G7yw=zn\(7NˢDH*dyq*t,W \,cL.H^Rѕ:q8: T+A/x%k|Œ6SY@9-^mҐvcsHGiUxbݢ[0%&ݢtaR2?(Z%٢Jm^QJuEDBks*2D9#ȵS AzG:ufSl(k_ƋN#sӺYٙ^?ޣ952wS'e}{/OWlf^8)S[2`wi&8 )Bk0X6;@>/MQ.( FBl)Cc?@iEek9nnVSK"P)X KH+BRLAIP*ΦRV+F5ת^mSYj?ifn~Xė+^kejWa(phlײEf]9xR7*~,w+fUB~y!QTJG|8 Cb.+ 9N3 p@e3x\V/.(34bHQG]C{@'o"|~=ӫlR!t( c=BwQq; {Ve#`b؏:nWЃEdID~{r8_p?8We<0P(TZӹq~rSI 16!-uKrV*t<|fo߁fjh)F.ԛ9ht(l>L$U$zKAx6Xbul.܎z8f395`5&l0tk,vH  q?k|g}pz._ȌR*3jqq_Dp,{|>/'>7 MP\:Kr$ {ۏAC`5@q$`-vԈ6Јv7CiA-fr\.U*RbQ.;3:6tndfA*SijâL=!U/h#ׇFš׎C:O=|L= -+jRstsivS\ieE~ebAڪ皵l'3b!-p4 sl-PB,<%)q]ar.Tiqa!^P}"ji %8)kkzƭQnpDXg:4i{xC>'"(f/j"Nu4jP^bMr0.;>  1fˢƃ  qET df|Xf)3Pc!6q<txHQ Nm1ZTgzjHjրJ/UdZ>']T-HB f^.U,2I3kΤ\>4 D\dЁSN"CP`Bn*H< 9V40aiA 8Aego QV!`fX@MU0@ SSK17bYNaךrD1̌ܜىWy>й}O89|(/;׏=7~ԑ{O}WNWN8݁: u۾o[ͶlѢG\:SkG 58Q )d<"^EgB Kǰr]QŠrYi&^7T,j jՔT"26=~v义3#'FO95:~vfnzzvffnvjzvA)Li!mN!uvΎQCNv !v@0%7sᘇ$xjUjL :f7fp b 7i܆V8`X|:}u\vaw8G6*`uigG>st㧎 =7=wph\1ȉѹM;5sc OΨf#)zJ&t:ݾ5Jf&3 S2ÉO'F4/yGHNKcQvxVqv^92jU`J]=14|)ZEߏFx@TI0"eb~ { &"-Q< CSC8s6dk F:BdR|&* ׎|Y@0Dь Qi1jfN ;?>=5(QhRV1[PHR^2Ym.1X\?r<>ׄxVm5|jPлBFBb JDAUFBg !ټVwd:Dwh҄,Mr3ӋeNf&ML=;~fljrrvȑCcΌ :;|jܔ _dEDC-<%:Ҍjlց&C">:)4 x7٬6'EhB3I'ԲvV?-k2G6>S$uԭvDJ+* Dy)l*Oatj^6NM#RԌɅi ٱccaTcA1 24#;1)[X=|i}Gf(zhVh4ٹSEڢ0\j6( feEp\N' 鵒^sF%c)o&i^#ȶJ|"…'tFA704v aY; `2 z@o4l"k:VҨ5Z=UR!Se R QgX5S:zC: R :M6i*A`:\ j>$`&*4 3"FI5k irHp$ CM Y[ՀǦ!ukE) A >3x%*3l K!% P' BB{qpgˎ;mba֛J`Yr0 !.,G,FyOXH4#XD I"2׏>Nj˅.Y]2YiN(዆b7&'X,*G wSii\'EX.un3wmٶm>ZҠz|TnE5(kĕIP5ktOhjdTiY4r:5MΎN,-̏͞ MטGQqRg6'fMȬڥR^_ PB@Mb86 R M)_/h'I!R G۠KZ.7H0bJ `P(,@ n/q`hP/.LLONOB ύ&2͜\+*TcS49e|Q34pc''OMi^=:qhhӣ)QcmNhg1Kz:SYzZs+Siyr%hHl5,f" 1xL&Ng 9]nHmvhݻ>h‡DEXJ0 $.WZe Tnb``כf^9T߳1Ϋ5FItzѤ4[T 'ljܮ3lUbv -uATm, urA R&٤=np9qmABWߋ|Gx?~xH˃腞@asح`v!9Yu"Fނ&]<gz6Af^0@c,cPd>`hr1G1Mjqqqrrzٹ18:IԄ؈b)݄>vKl Z\iJL,݀YСn߁fjhZ$)̬E:.ϨlZFCЇcvO:ǜ=B4.0h&gظ1"2!0QT,F嶓3cI~ZnU4E`^m[=s:dBaTZTYCfuh&Wf1"ę' 0Av'Nb^OA. 5.aa>/ nPHnyh -  F-Q'ffG&&GFO9{bh8vѓ8{7N=3141?-Ӫ-.+F0BaujLN?9q¡Y8'ƕO??pzdF)8v/9g@v[< *uF=蜒ȇ:s᳧&MN,Hj5#H$Ȥp&`X,&,zhlhZgCQN7#L/..(JL68af%st^"URJ&WdZ.(ZLzBĤWfW-Zp-!ԋO`# S'!NeW Nuncn Dq!:na(sD>)? ڈ BwDN>b2Lp%tΠ4ЙF!H[8e 5[Öj b P1eH. |[&d2bM(An#N2JFPY̜vnbĢ??_}G'_y}C# gggTS2gy}Zn޾o[ͶlѢz/zS?b3G{4TЧGfPuJ+q (w1+\yftnIsxxbZBY+#ƣJY-1gU،=@'e )2.q-ڕf]j+@,# jrFڄH(Vɢ40". YjM h3 Ss\)*$@JGSX6qpDÄh2y٩yɴT1H4zѢUvA@*3sZۤr8@32J4_;6⁡'0dz՛QJ^8|4 #L4E1cT'`whX R>‰W @ #vb68|ƒⴁ3rA,N ?viZ5ylvQ"Q(jTM@iQo,RY8MrԢt[Uw\E L2,XUfL IB+==_Q2ɜ( 4i xl~sŁNaRnQju2^7 FCkYAp=ExI{%".0B _(v9  -zY' l9rL!WUVo1Mlٗ[ŗ)(G 0h0Ň16!3 D43G@ HDl Ɠ jǏwbdO=7oFGsifb^ ԢztF66+?;}޶m棅fe;|b sr29QgJyrFzļZe@Q2lC-Փ:tf̼fxNīGOLʆfUGGU:2ԡ ceD0R +ZBX @d#vhNQ m;JR@(pQ0 01MtHV.R'-PC 7|ɳ!?ܢHgc: eSF1>BF# uw` EMNW68. BM8sjs Y0.5S ܂=N !6L%℣C`10/}8dHc >E0^3\L(_@-Jb:LiGcn|4 Đ&a8 1`$,<,'-L$ !.fhqڴCO-㰨-6ծ 6#.ۮPBc=N#sk0^AB|eQV54 6Ê-͌Z.iAx9n9vtZ].NG4E"(IOnC`wBA8 pAhHDXqo! ?o}r`VPVAp/ J> 75p6R\>  8P&I.Ig$q^qb\/ʴ:Ck+Ԡev!8d7wmٶm>Z"\ @XeX<͕ B>U*fhZgxDIbEh;_XϫB28tQc?56;2+ό*U陹ɩᣉT֨a*`!JyȐ !aEC8uAp8V7c8- :n"0"p'O'"RY+.@S]7WRެUrT,i7@B0>pLa8%CQh 'tk0ť2;ezۼ8#)  Tw1Ar dQjuzVlmFq(bX<,.D8\(/,DU*ft.*\QMʦI.eNk+0 vhDRpBklf3Z>|Q:CO,pLFAY1?2P.tJp=`1q!L-",|`7=[RB$R.RrB]<Ųl8B@ 3|>8xsо ;l[6-bS7Kf^HZ(K0uJU+FЪJVPAd20p7S~5ӫH%CyZDX9I120Se@-",%v"@3 hDÁׅ5ӵR]uj!gVLVrrZ>Y|U…lɁ /i5Z9S-[BYj~܃]^]iWRswkv*&P6zTMKl!ɇ)ha0hL$BhB"~>#Lx/v$1)>7bǣ@$J#. :E0P`!-w"+(WK޿.H#c&B4R*gx nXʃI=DHFD$±Р]`8 On;Cfȇ_E/B8mNf &Ts1+YBEkaYG!^[X7Jj>T/esBԋ e)I n wmٶm>ZVV!\mv+KZxanvz9`&V̮v⺄+rXPnS\뽊@,jEWV~F7*jbY䁕VWKv*Fdnbzqo6NJ52kRzL:KOWv),īˍ<| >33LVC]IQrnڥ4(˙0Ԙ<H,(Xܓp~ܩ-E[5nҪĖ; 8Q`Sr좜NbVVۭ+f5گ \MЌ\4J]NJ,rp"jW2R߀ն\Xo]\>.n!zionV^i ]_i^W\tϟX\ֻڽ\jrT:n;#.WiVڍr^j֊x2>P-%J1!r J-`sBN7ar!^.RZ*F-jdlQ q# N + yPMl(n5%sDwN)!1jo~|뗷?Z=ЭEϋL@ .'ZLp,ͥ (ʙ8q-/tUa^4 |[jWko(|1ZBVM/ՄKJ#KvMKXD7Uܾo[Ͷlr_\}{RK].tkF+u+R@ˍ}7 V W׫* oׯ,/~D//ί/נ[-U}k#rufu׼m\W W7W[kV?zy2XJ xkhؕ;Apjր^i%j!>~[(܅~rJm PvnWI[赊faW]ڕ띋ˍn| @\\n]sqw6\n_Zmz,bm!:ƥ&(؄)&xB:+5߾؂b83Vžكs 8^Z>B7/ί56W7ZW.t/lo6ukj?wΝ?fΙ9g93sܹrggӤޤ"**m `WvV܂z/HJ]k.$$>śzߕ~%d2$}ivmYN]9[EEqJyQrYaRiA"-`m^*C}AZC[uo)j-d1&?:/y0|vz^[lFS rczFA$7RL 3o/c)Mc902+ sʲJ^d&0U<;HeNrEvCyV"_%Ca3eyiCϊg(N(yUf>S$3{Đ@y*`VPͼ݊na$ C;\|)bLQ7#%I̛8u ;UUC9]YN:D-ٯKr*33XEiLU1G~ܜ򜜲<͕ȼ=4i-(9~֘Q2HdFg`X X `5jmU9U|!V#o+|w iMTV&,{m( R Uq!`WsVn&%pnV3V#-l=+8tw!8XNil f3Y&Np08pnV3V#K?lklbZrsD gX 0##˥pRvۚv>V<|kYV;%u;ۛٸz^%qY&@_W3+ǹ7G {*l\[9V,RZhnVэ \17qL84-[V,w?Llmt VjCWdiշ&&n!;NN(FZ Y2fː 161ZsC3-237:['p1fAL)ܢ~ :×chhGW̞G 5{*f5'cy4KCCы-F.Q٤JT?c2=2KF_l512u zjzsf:K9hiyG-f=%X׾g Eì&~kgxvF a3C*s>?a&"xG nOq[33✓Ռ8hiVfL!v[9_b mVPN d ##Sˠb~gbȅK'߸xǃzH1va-*DS7VXwkܭLgYWGHYILԜDݶf$l=O qQ--jՌa52Z /ş6?*УN {Yf+.K_ w520s qXC/jD7g*ZNӭzښڸ*TSڅKl,la໳rzvW+6:~o5j-[_X `5jDInw;űjL*-yӍ}oT3 ӧ~+$7_h/L2n /^M>m.+d Sh++mAy( j* 4A^W|AF{]ٱZ 9wwvvuvzp3tuv2gu*CI^F|]4kd*Rپ ^.!gӔ#J QJ2`5)_  Li7ݼ<]ާE :P죚]n SǼuydSgU͓(%ryX Og ]$,nӂ_rGg}/Zm”ڧ,u/qcE}x.0 zi5)OT3CI\FXYvķ3j;IlIt DO :mQc[Mk.a{o}2kaZLEʖx3 zj5Rd`Ay(p˃h0W}|̶qpg.D -cZRuwe l5XB`5QV3V3bi0[,(= [bf^^PT~aNoZiiɲr)<3@gӅt.²}l||PLPk5m{KEtwP6R0K_:[e "nNϣu=wF\([wT|Y.ydMEr}s6,, t}*,LȤcAvΒD?֢1/rurZ\d{lHy{P^cRJTs?7E[oI˛X->8|tlD#s-}q*м5t3<-G{+/|x~EU B[cXKGvܸA`5_Ր$!SO& x%p_uV+l}'Kͣ]dՒ"Ko-ɬc&, ;#})Ͻ`o Wّ՗joO{NwT^ j# :^&v{{l\Vc.|N+v02V#ŀ6Gi'llBg5sR*GPk57l5'o;{ $FZvVsewe_KJcJ 3jdRXT {ˏ2nNnEEees|yeU%.-f_(&h%qWU.ITxךUfV#ޒĕC7<Ӥi t Y#їA$ا9z-c Vըu72UZ U|oU|~CkY\sqZ!Er Y}wϓG|hޒ'TyzѸfq력aĜ挙4U}5lbb xDwC"?wƓ-Za5AZ^U]ɜUQ9EtI),O%餄Mq8nS%ƒ$fR_oͽ7ESE e?j&{w vh/i+k)8^-K|a5ZNjkkݼ{>q̩jkei+I|Jq ;FoNW/#: 'Z߁߁BqZx,ڔڐ%{K52i+EJ3L/o8[뜖`fJۻzgEz*%K!NwjETuSFrdJIN1jd\VLc#<W +}{g'H/2J֔f<>i{立dž^b*K8;3 +R.sH1&QZ 1?ʒNcҙJ QJ2`5Cuy1qs>35%VhM%9Y$/V?f/lc +F|42u5%Xa_Of^qរ͢GlA aב0eV3bXS__{ W'Xo2<#V茿x[ mWlrAmcu_淎>9ӯFK 4>s8 ܼ|=L1mk_F}5>X˿HIFӭ겢wRi!u1&`5 0dҒ'_ c=;E[~ZlV3]V3"{]]v˓u0l5fv˵lPΨ.+F_F\$*l{{EBdյ`#cYƦ_;No鯷r7lhsӟty@FVtvkڈ_DU_sns­3[m5ck_ 7̽pwFӭ&u˜J3(6j365s>dՒC.%1x^W'`_ms&ЛfFZ U|?.\`łŲiV3l&kۯ|bsuQ-aZ 52X\I#&O#r" =󢠮[`:`*1VðVELգ=6#vÜ?ޒ*Èդ&<ӽ}fcu_w ϓqjG;POOjf Uq1jC[^Lwzk/m.V3ݞ 6Lp }!MV#ohŖ |z3|D ?^cw@6qV˰vfnPsK͐Wۉҋl!F|H2nm f 'AaVCqr_>xYEf>"~edi?('%]fT :=IS&pڬj i*⏟Y{.FLҔ^9҉UuKM☷tJE#|;inh-n-kWpP*~u2o%h<\ ²}l||PLPZVEOI*G}7+hOsVvUYcŝK|]y-q^ew׾GWϳ'j;S./ie ,-23c\|6]HufrFK6w&BXsc~XMG9ՂΗW9__(k^Z)]"\,Þ YI]UyKͬ(42 #>mVrSxLNaopP*,Si*X<閄=[s!jg)@;WE傴#^ϋ8-45b5\EGqK^$ )W,:QZAiEP˥MU ܄x/E_$h*J-hG5>Qיvs/[10 =*)"ejɱ, ]1jL6=MfH5.8qFK :4nV# tߟ6X >}Ռ=[j~gsV! ]iyϛl]+f[K͝v'j.HZX-^Gw7ґ OE@i\r&ls ^2.k&X F[jUlt V#ԇ_ v]=]C6'ux] q~{E[@QkL&sx Ckܚ~ԑ*cLE'=c[a5# gシ4.Xh uo{\k K)'DhSdم6q'llB:NĪUԷ.Viɕqau\uwՌقa]TE4Xqu_j`5`5q}ptɰyJń8gIMܚԘPki=.7r\}.VHܴ.eфb^n=[xzVS\FS%׺kl"^V%D]~JZAQ:iݖq/ 4f?yV&#=.6Rޠ>j4V3X s#VC7Y͚# Ys=htbB| z#>EqsN9e-wIy{Vx8X,ZìFN68cgZw/i;+ #ke'i.+՚{rtiaW:X-t*VM oP}y_]jz]``ħdRt&ICj`5q8CeIa!;CǿnYYZV爋EŠ₌ ϴPQRl VK%bB&hx#X͌^qB=p`X1X Ө./$"Êj`5P+/7/ 3"Êj`5 |lqk_t; #j>}MyIQnfAv:bng:2>cX mX `5jVVtŊ/k߆lxsqwշsX,w_{Ji3~'-"d5/van-M}'Ii`53j;շ'Oi܆s'í*L{|+\FOȊm|<|>_,la/$ 2z˧`5`53j4aFl"n KfgHޛx$&}5f&W]ld[Z֑j~VX8b҃ JFYcŝK|]y-^Zu-d&B7\(U_^ѳ=)Wn v2q]B_Rs7-doQ{ ŌB:w:ڨ*vd#8v L4Enں !2",V13- {<DCΎSi8lkёuƒIBJk5Ϳq^(I{5q I v _LU%^ u0u]uI\Vr~|Wk# [k[Ɇ|YQi [,]ܗ|^)DV,֪[ՔV#¢{W{ؚ9nImsF`5;PjVX X `5l-҂"vFAv ̞[91V`X[]Vm==}_z}me5 -]00xwggWgKlgv)3!]r2 U ]0)bg$>BvBmWjD rf^# v9;BmWjP)0m5 X X VV#3LY V`[ E Vj`5z`5Bڜ\nR%6DRu#ycyI-}>uKgOU"ī.^'%ʍKsKS. V˰ >qkβ4\ if6u@Ru]i5kgLn2"WdRUY.QDAj2q5$-tY(BmmO Jmcp~!2p祘!.sv]lIVx]tj'QasmyX`=38)Ɋ_{VZM _BJS_*mɽP28O\.aNg))UXgkNS$%Hq^{T^ oF?j~j*F[ԡ.a1_m/dRc5KWx-82h X CI%.O 9O߻}SeNk4 ZG!>xw,ւ(󄗵<nnG^XQtC赊Q%H3H@e5^'2cٹoU&jLȄi<VHF=%:e^MPp{z!RUV#:+7܋wpOw;-V.jQ0'dK(nAcŰX ݭF**D޹V FV~V$nZrds;?0ۋʕV(Qwjڤ c_۳|ߪOfR>.Cw+*~PX*b\E^Щdщ:.; )j~ l,.c"b (PCNI1Iw)nlX.U#rZ@LəR6AKT?(;HdFYr7iy=grǍeT'{ dL̄V#&j]j`5j$ba2j3jDajX V`Z)bg604P3ʒNcX(04*)DW X $?G(> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdb:sv4<#z#k ?6h82'ԷCy4'L~}k? io>Z+jQr%GdWc}g.h$?f{{{c EVӏ7}&_ ܣ֛[ZZZcm=0Cq=_wk=l]QQH48ǐe~T}XM;MɯhV{oi L& $$NC!.:_ >-bfs|> #eQ)~]ႏ{{g6.R j1$Y粝Q񞏯:_i -ֶTG3^(zz{徾~h!rT,;3h[vԵG|Xa纺r_H0 ߻ᡡroݕ {>8Ynp҄ #w{}#cDwQ@_؝f:56kwMů|s,,^[~ƍ{xo.][ƅ}B>N&_W՛igCޱ?^7ӝ˴[~g]S׊߹+/N;$ ~wp1ǧK~V|K[G&_{$~ѽ|&5;v\5Jg/$g/,ҏ,V|in$=z`bؙj/ CMX"7O_늖|qQ]]ȥ?"񇇯;\lK~ófQڞ+`$O.~vҗKqԊTg>щ7͐$¹SmYSG񵣦#Ua$ovYSWQSi$/ύu_} Gw̐$LC>5V|R}3!I{7.>65hupLL6C~gvwtݠ5g9œ?ysc>NVj!I<`P-=O/>+*{g3C䫏ό2-.TS7sD$WCL*~ܶmⷯ7<>5{=3$Ic+oRAœo-lTgW)zU+Ij񩺋߹Zc! +~qu#*>/ Og$WZuo!9'g>wvbuaY|wopl/<|'| !ݽ|ξp|fb+rU|tִ;󅞾N|woݺ}ݻwAC1޹s֭wy+/rꙹ#f!D>^7{//,\]&4ҵū o.?{c*Lg%ߑu{y/}.\x4/\83 NzUM3\6rXe|" "q< {K|.ֺ{WPSoђ%ߖJg|wX-(ޞRНe3T[kK|7(~eW]okw軺 b@È, {g载94jG-QQ\.wA Yr(Ѻ>z&_](t:tB aQqтq$]Sh q!P{{{S||Z+G7#m@U e4d3qu.x͇CC5z.z_I|-P} N-ΧWr_{=?||}{hTJzTע߶>4DϽ%#CYt][6GmGnټ <1SuǑ endstream endobj 124 0 obj << /Length 984 /Filter /FlateDecode >> stream xڝVK6W(5-IESt @K$:r(Yp}aѤ,ȋlI1 y|0Ŀ]WSZX64ϊp ʲ3wWڷ^v昧4/s)eq`ݫ㹗09Mgd <{zu0FyI#-)K4xX\2 Ĥe3x^:FVF֞::eP)x†lYjľ6 *@n=*U}nDIt5`yMj&(2(e!<Ȇ"Y$- A*JJheM/͹_)BՈti}T@D<$N \pι 7$ tҺU'i~b [+B΂W{ f;ׯ<:`+z|PYխ|޹&XKgcd؋{6(>H큏e]]Uֹp8.f"˒ɭO)z OnusBWAl޺ͬ##$+MGeo3Onel[$%ǟvs endstream endobj 112 0 obj << /Type /XObject /Subtype /Image /Width 664 /Height 336 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 127 0 R /Length 27457 /Filter /FlateDecode >> stream xXXᆱ])҆60t^J EPPT*յv c (f 3Exv$9srr@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ڨvl}Jzm-NhB E -7WPk?~(+ 5m(Pjg'>缅hQEF{xnNvIQA^[v(k7OpY! :N[rexZ-R߼j/ɂPN8ѡp^.V^&.;zL$y~aǒmll-]}D*\G:ZFļJ="]B- h7ahߋY;-pLj)ˏ|'uG{ؘ;\<]w):Zmu ۆ7ol96Df†@Ӂϥeѹ,tͭ4}։9o 5t ZvcіocL{уZX{,ը.,q2t0{DBَrg;3Ǭ1&Olceb5sɫ|_6jK;^KkS.|-:u -eu׭B]I! Zdkem?+&avV^ӾuΩ{,P/{Mt~:^Yaim?3:sM-&)I=clG03zUDt93֮lonmoM%`> ߋ%:1zĿ/&nxx&vA/ X*]$RЙ6s<%Rmgnm6qʔSz9X[Vā ϧm͎m:㩂l^^K.HDR)-2tkJuvY'dB?,DM;>* \v-?e}6sVe<מnH肽W^g=^6lTڨM-pmEf|pc[{,ًK$p<8{Ff>p75 \v*#Hx:o 8 OK"/FW%Gtv4E⪜wuNM9fX,b v銕eK@6is8D[QY|aa>hgTOy]МQAa''fe9d O1cq<=".׬;RYI'͛غ;iҔ ~񜌄m!&ֶ&LC&vk%H\*Ϡ WZ6}WEyY粏47[x'x iH⭪lL {ftut:?ѫy:[Y V::UϮ8yp썫'q\o]73xנӖ[q^F pt6vMܪ;fhn8xԌ3/D[ 'p89p<p8s.3F;xF*Dq8p81F 8qPKr˼EYK=f|T̗K[NaNJ(pǁfqO*<ԈHUR'OhxVߟ2\3Y)A@ 8pqYyMlwxt=t=nb4'w;Ti 8Ы+,-qA{K`Z)F""GO oK@q8eaבgP;[MV&.zS#F,G8q-q.R($C:Y>71 B3U^2ש3pU@ p8m۶QF7^XPPcǎ:ũs|ttQuZv%x֚tSu AoO5<ǛcL{t';M>J~s̽ft!eN1'g'!/{Ū.KN?T7ڤ՘8Rv~,Icޤʂ{QjTH\rbp w23(g~i(|n 8 C=vXV9r^Vr_ˑ!rEX"G>~Kn]gi)Og\l`%-=}g8whcmnz˞dVQ{9ۛtq(y9L3MVT/z^e\lbAŭi;,~!/E @9 mđ H*nKN$fWdo 'Wq9z"㴣WqY.>^ݿ|'}aA 8W/(("b\ '͸'ow$u9Wٳ~ țqh$zj ˿~a8R~wqօB64D¯S^X wvNFr~Ֆho]}&R)_ȁv4܉A0pY&n#+yY9a%-4rښXoѹ[_-mmM Kę[WWˌe&Y q).=G&ZpvVt[}3ͮ)xzGN9.Hك)E VM1=|։r`&hnb H6WH"[8i/ӋqWa\ Uq=SrzuArzEgCdi%bqJ-LI+iNqJ}*3 ӅjSo17g8oe!_n5RIlg[ {m1_kg A{M縸bObеSʦ"/#r"XS&dlWxA Vx=q}GE\2xa !9;ڌ$0EʯN6u5WZEe6^`J/+f !, ^#u-C-!sܘKa~*g\^Ϟk}3"=M%[`mwoHc~(k+ sObU)3!K<1dОw8rrtNhZ٦q7n&h :{t-1nu\~Zr݌_T@q88)8n424ŗo93p{W5|ykGG+Ks hWOVx.&9[zt'i(,Ҩ=;utxڳ#{ ;Ɵюywc8Rb'8ǁ n՗zWMC%x!^^8p_9|ZDMW]rjqJ1̸+ ^>+ ȳXYIxażtߏs)kGgA 8p4s"t>Fi٫)0}|4[l sܵ$=hM] x&-?N5S T'L#S&_.aǫʍsos6K d+ q} vq p8j"Qd', ;D˯#'{Moan"D_883`dة~&n0\3}AI܉wk^3^E3q ?AgY~as.ݵFޢ8[#|m(HjZcvF9C=qx8n ],A 81.70D<08liH| ǁqAqAqA-qӍ^ƪ }<\*RY?7'w7]Hɑ@ eTdGw%_oXP'A 8pC8.Ʃ8.i:Q,,LFNxuos6_D 岫qx=7z.sW8J^fm.x_rcK놸SpquZrmیk6gu<.qNqڭp]]yuXu.o^Ly@ p859)84Lco.X{ec0nlWwp{)9kǛ]tG7R v+1)R̤E&v|G;\wrjbdu&uoVZ/~Ĕ1o<6Tb}Ħ 3L7>)v4UCo6mW'u2q<ݸ<8@^F/y.xQ=Lzlap "\vFٲW+a>G }jN=De8!9zų/՟>V4D\( 90@q:}]f4/883"8R~t_ Sڵ vixGR JjD_~8sTŌ VQ3?o:qЋnY m6Ƿm6jԨ BCCwbצ6f]zi \cL{t';M>2nLR~uJuj_+2]uļ;w:ڳ.ſ]8;kMa8.ƩpPw^lHaKx GU}ϻ!.܊bleft!Zi>ī’OO1H${J* E+Rm]^j^qqv2LRGI=ch &_9 n p' {ر-?oyYZQׯ|;̇'3- 9>)gX|ρ pͼGhw[0s֓y#681׿g><^*=;qVQ{9ۛt8@qxc-ր86[jQ-8(Ζ%q8ے5[5$8ǁ| xk!%eէ׈p[yfdn 8j9;dצ1D!=G&{9 μ̖-nՍy*JJ}3NfI whh4 #o!-FYI b;Q281󫳳 u`%L{H;8EP'Nm!R}<}j^mgcy*/C]o9M^pAqxk"iǸz ],Z33fv,]A:hO2q_#9ٞ$˖ix8޵Jn./ߥSicq N7U~n-V?rwZ8_7Bi K*/(]]jzS|RgQtƞ.@ *MI$qӶ|ɱd݈{$H48M8A{ɶP5Ox(-x; ^GCl+O9LRzK`1\ #.͢?I6X078:'0`cLjǑ=f|sr>wKx핰VQ·`-Nc##|ݜg^1Nӡx}-.­y#H]?CK2|ެuJ}CE8iOɥ㸽`w|G'd8g s~ع|lf_`e؈N79BREݶg3ғA0^Dd2*oYQ',p89^}˸seqf0ܭzy^qڢhar9H2qg}qEagoqTA[sՉs dp[qthׁJўmO q FW?MWU[Ew.n>"Gq;\pIImO8gL5L0'sg&^,CF\'')/eAcczQQ{-˸=P"#!\mZA6iO#}Tb%8UTqt.#Men֗ygcczVr\^Î̻ӵr77I8NU0dx#{ И |D"!\Mg d uʊѷV"%:pL$q"aӈt.TmT*8mU68;e A49Hd]TޝIrXѢ('>'o) l7c׵+5xz;1R( tA%,({ c>K_]y :8,M8M#0P!Gq|xg wzjkG`b[BYW>=T&\gH8'gq3Wvw?Kx,~F\kR 9p8տǷ9gU7]&et󫣘IFL뒦^q1U=,יQ^bY. 8SCz8=ʖTl$#1dik$d-c8i^r|yބ^q7Sʧqnϓ3/57WGxGp Xgtq/]xLdqֳEʁ1ht=){:FsV#UԟjqV6u}4l'Ws T$-k :ݘb&Q )zAQ[\fn_cc' ټqnQׯާsOuU#)5هf90W]q`-֓EPq9I|LXkN1053-ػ g`H^ƯIa=vÞv?#- ,GIp 2joO39 ǺTOdmAKo>e@{kji"׷kN0:^ǁQGI=ȧ6kǁ ~j9QO~SԼ=q88@q88@q8p6̢B &:8i4DJOJ]\ZڸO {F$wrpDi OJԨf-sԦʲ=*9<`ybÈd}']`hZLSE#DWm;Jlֵѐ%߻9.ыqlKҗG*Ÿef93[!>cyvc:^~u|ILkLs!ϩDb"R[cUzhiM<gϪ*=аK_֠Ks•2) PA{Mq=bPU\swrfՕ18>1gܢ"7QU}6'd^_(c1{V* wKӈ4ŗ/iźef9-O 5WƓI䡇cK8JQqoqJ$("EBu)*j1BWs b!T R<SVY׫{Mq=bvLĆ' p?xQ!+8ԼUݯ.BQL~u4TKկ.ޥ 4a'gly`\xՉI8Sx֥c#ƜϩDb~o#xE=$p 5t4ű*U\<y&rHyl N%jT94~(( -nB o"Ykû`z#O?8xǡ=.=^lٟǟuR2#B[n ?Q$|8;dLWv;a3uؚiުV8'{Mgʢ 6 {ȒmNΘIuEۉ#$t48$Ugz-x*qS ՜%bs*ɦ })9ǹXv&㹏rsAZ,VkW7opSz{]+OwP2kA ;_ߚf^X)x|R؅f;kk[?ٲOI%"NfN" @q8HO[+ .%W7csTmּqYzxkA%q{I7PWA 8o8P pEAgOV(toteM_CB: YuןpuE__mAK:xCCCѻ_T`}I-L"_8O47*Omhy,q8osJ]Qq1Rǹ V]Re⹯r\F5g[}$fjЎTg'pqk*}oM] KひYs2KMZl"_]Lٟycqm@:op<ᶐEp\q35ԵŽ;C9.o7|}?meܮ-OOȀbhzg-)883`dة~uq$8(W;Lt ; /㕙qhs5E8:OJMr蕟QB)>4T?VkLΌ~u8Q>)?fZCL;8ǁq%}d}+ @ 8pr8Rz*:p?*)%8RO %xlϫ2zn"N!yRћ~o#.gZa KK]*2ԴHjڶa_ TOVwYPVڹ *qR> ,fYOGevOu4+8r\`Tpu8_7Bi KNYkI/,>UgFXL{4vU}0Ԡ_<58BDr'<2n;"~4{lt0\p< ?a݁E|3/iM2Ls^0>;#a,6 xC/y5G+`װk=YbChӕw9ϮX G*nNu2q4jF _7NǑ/q}hSvf`>t0s:i"18tӄku-n|Yoז3 y_bUJs\Ɲ+c&nk؏ڜh{pyʼnxǻw"%8"r!ugUΝB ']72 /ϥqsl 3"RQ8RvƏ&rKgZ ;{rn=nEUszbj.a߬O}ԼM #!\mZǡ=ތ0/Sܹ霪/nV/H=slpTڜ_㴧<8՞V˓*Ndݹ8^s6~+6rWRC_;[G>_L!NY=JK؜E{#09xQpޏk5e[D>@Ѽ8>xŃ"v-o<7mN0s}zx{CkOP߼27^ /GJ7(ڒiwUTVE;,\[ytؒ6^:{Kts-TjΕ:UШ$'/qN6w5Yw?zV(ʥl$g5Ǡ:jH8#a\/M#rn8C㢾$ܭ[sO8I_K r㷂3/+qZѿ&Xx$qq'3;"G!=Nhq-֏E^5tqe7H~ 8뫫Ev\#^=v Ր|ŚTxC1_Jj,1ly1 E8^G./P}dht&cI~5 Ƿǹ[z.gH4Hs]8egs`:/Ia0~+qWAf%_oőgjZ㘜1n/89 IYQ֊Îadzkv1?."Knsi!q?TP xZ + 1v V{P47n!;cIM8rHGOW}ѵbH遡\d;wx_f^CM]c8T"$&00%rW3ia``dg9jO2X0E^p8s8>,\ %DѠT'3x6FD߀7Ri>G11>tJ_%% WS_88r.r7;*^1;4Z2o ~]~O cw~|a3/N'8ǥrHu1Dٸ s" s WDžWO 퉚|jI׼=#8ގ2sԅMYϮ#^}v 8@qxo _[6SS\=Oƒ'FnP"}A#OULÄK® 錽 $@ p8ǭJg~b Zv^AMN1 %s!Ko >) feO>)?'yORe0@m&ОzΟձOF3xߒtyZ?ñ ؒ}KC>) N >)?'K}AQ=dؤR&>Qf.Lh7e0v,!+th/p8$~uT&K>)ǣʜࠪSn! P\Hc(B0urw!~}*F:mp q|RZ'*bzFWa8sME.d2fkR[o0Rl=#9xq0:ao_)yt~>s|Ќ-q0%h]j)ʧqnϓƹIϗWܛ^* xpx֯qNខ>DF5OIr45\^qzºqJ"i45KMo8h.guA- T@q8s|R@^* 8pԶ9@̢B &: @qxJj A p8ޖ9.0*m8. */C],8qYBPR|RܚW{F[yE,Ϲ)'q-Lu- -#iMz|I89:?O=-xŸ78 j];* Yr1)uUmd]tl|!kE&f& j} MCdI8.i:RzK`1T\ #.]w]$Wi[XnĽgWt^8E_+s-+ BW(>2rSR1^&q9fTK~~{(N=H_L2 &X`P ,!L#il]z2=]_Ɵ7m7&*ʏU k̥ZOI_-sԲX|b_8T$q?e ѳ#8Ǐߛa;4xّ  mGǥ:h{Qwg oˁiN8\Y8og<,S"}&H$q v8ɘ|FN_g.5#aW6 g!vЯΪ~u4TKZ_qmkt@wflJqx> xN%0G 9`W'8pwUqɳҥ/帬bvf6<|˚`KX՘"_N=x=q.^܇=/{3"e8_\MCdI qlr`62=]O}J|m-;v Yg~ugѺ@MZlRׯ9= >jX\zz.Яk{jԅws8ZodNYOo m^r6{η?YqRC_SKq.M6) i,iY=XCSm4htJ2pv$ %R_ 01o?|+z~*q84 ƹ@_=.3Ir~p8v!gs߶] UP.q@QzOo'YBk)>4T? `gFB:oqNVZ3J]#+d{8[,a!>Q/~YfL~6/hA Gx89y={tq6Kme^ҕ)BgmMM\`(W|fG{YzQdjNwkֲZߌ e@q瑼3e?:wWҵ gdޛ߃vȽxl'Wm)*]#|=~[zq@ 8p|K[/~O !:d=}u9Iiz¿A1C|޸HOoE@L>XI x΋?gK]cS nU?i n q8=r.ꥂ^,1Қx ͏~`n&R\Qp9l8iSlGJS7 @o_ؚ 1Q6f!))R{fD: 3[iyL8qE Vr:{v_+ 3qW;ݞr.^KnT잝sl/m7re0Nӡ^p+Fk NqDDˌ"/.+x;Ե mC)HwEќp AbT\QǑr>/nS)k,>n^z9<湢H8+i_9|&ZDx ?1?^pu2̘\y^*r\oV[9.r({׵^gWGJ{LW7l뫫Ev\%&-%狍-֤r8pA8t8874*:XSY㓂ۯN);8H-عށgnb ฬ󼬟,0Ƨc>{rY\әQnޱOx#ߓx뮂,]!q}ZK͢VN|:?";:Fiԟj!Ǚ/nSZ_0}JJ֡kS܄FXwE| [9ϻZl<Fg,hlg?pi8v=Cyy}{o=O֍ƺ`)3 v_̴ݾN>#OBmy k(~:Zh#u~wzᜱiԟ N}q8ڔO/Җ-c@>ŌX 8pn)_m|_u[2pghǁ?U0[{8a~u_8@_?qw8lrHgs>lֵѐ%V!_qOV&ۭ딽I?Ewp(NO ! >)\nMPm5y;PF]|H0ƽ)OD߷.$T}cB7U7Yk())%;8l5:7pôNjJ+?VR'f'[W@|e]gsBFnu^2Ƌ$\0u]̝9EEYM׵tI߫{x4$WggFِǝ+=QsEsdR~f{Hϭ"ƯI!DR 6^*-pyYA p8Ks 8#-@ p88.AtcB_= ؼy*̓Mxm-'DO vL/5--m؁7ɍgghf n&Hœû⋾0ZX>ZZFJ^qsu6 nr:47Y-#R7u Qȡ8'ࠁ|zw5+|}8Ta ]NXEs%'g`;IQl}U|E7b ԝfp9]ӎ -hcɺQA-LI+ۂa9`zH$gLkx3iZGnx;r: ǛB=yg!8^h,q)*z-/vc1g^Z=$΃iuӜp AbTx5;AMpENZd8xZQT F*Hkq\EV^)/"A%"ΗD q1Qs[2LӬ7G[qЯ1{KGDD9ɮI^vz/}8GAԷaR I? 2rF\ n͕drz}yᏈ3/҈`9t7;e& ܡ8\Qm|7WKMȒxC㴌^ ׊%r\ ³JWWxp'"wV9rwx , sD}[ZOŽ0Mp z(Dߟ:g٩^ |}u}!μzHНG9۹C p9.Ɨ)0}683F! -(kaG?`9.̈́#U h߿);8H-*_GsO. ufԷ~ubGhٱc:np{ODx[SI{xɾ.1G!zv!R1uP=$3YE$g{-xhJF'#҉ w8#rAɦ3ePw^lH'oGQIQ9|^z`4(.Ж ϗqn&DŽվS33т;-C\y*8v=CyPqn8ާsOuU#)5<*]8\Kw-+Gǁh~"{gdmg02pT?c8Qmi= ;HP=$P12,"9c}vע@~x9K8םGn`j5qPVI5Ka@R[̳9۲`>vjڰ#LWyִ#x[̯^8@[p8@gܛMaIpKǻ-պvU0bЪ:!gu8@/*ZIE]gg3nQ\K7QU}6'd^_(c1Mz>EGW6q"531YJ~l쓂.}R]w6@;XOt$V#ihI=Z<>)DBbCwM8 ~Xm;f{?^ynb'zu=ΟSªEeۭ2AMMqOJ/yt%dwaQ brrFghhèt)T,( ,1nlO$/TND )P67 ;wyg fT{%q]=),5YVOJUOCֽCU~}f+9KU{+KL3OÍ>Ff|O *R7 X=e={R{a-|HTk,o;kNFyUI`vԿ4K|=_3+\ug鍆j/7Q]Ծ[fc>NEfv^yOAmuj2PÁzoo۳*u,R}yrR_OHT nr;#,0zgݧ0J4wN nXrds͓>nIսG5lqO/j.@oV=TgJ8ZfIU(χ|>jҦ宝 :"<'W`a_-: +}Xz <8xEO>'~Ak&mۑ;+W oҷE^}zU.񎽮EB5AH#vp e WhSvX\OJE/\f)ZNʻY{rG_^zmn.:ɯvj^jy{zںeձfI! >lI (+A'>:Yq3IfYc>ڍGx5~*w Tj# 9 1[Y1hrr8u[-'oK XJ/ɝtD=סJc󩮎BuKo31q{̶u>WN|u2E iSTo3ϧ |QE0uuRi7APcpj'b?M/pثU}zn"DAx)o˖8N5e֙Vn[-IRo)2pPn]5hzu֡Jo*(BU6xq"2Y)?ޱ/ddkя2'53uCt]{ NyIVǢwoH&w{Ma]ց崙㘏񪲸SGto(qՃ:ZR;V]5K?6|rptIEx#XǍj@OJS.崙8zR8x겈ٚ^4mQw>}-7<'~O _]R+I׽;C+ <w՜<}4un=)Mx7}rg[_~xl {Rwth;S ZQqxD/s[}w&xɟ=)o<=F+ȍ'=)&mhDxzRt uCf`w<4<ZQqxwV9͹VNl`AOk=)tĖR*k?R=bЊƁs{7 Io;I:Ii[Z x<8:W^iq&TŌ{vJR"E.]?[h?%e{AA,>8 8 I(.z(=)Q]qę2J 1zG1<0+*,Ls$IZr~ Ae&NK+2xDlJ3%Η8k(G1d=~a3/%|9i ʡA%I -J[ xA\(񮴜I.ji!Z} Aeq < 8< =.l8G13E–18 <8 [ " h?sM2cw|ztq13X?}X3~/;[/瞋$P -Đ)nEEWzsr2cX*FON[sh9ƹ=|/FϞa:y\Ճ̌ ;Mv650\*g{)nx/o<) >` ψqA oXYg;zţXˊyza{}㄂zf"&$`O2bVw](.+yQo6"!'FNG =rM((,̹}JH"oӺ_ M9gxM\mܶƚUe?Spnwz{iǃܖ|̂qA ;}'-DmYZR.?T"3ܼ@YUqn?=^f4 /$%gdJBB)wbh(ϴP fqblh8)ی_u.ӄ݉BXHL_\8af5vfx/Oϵ~uqYjА=.0n¾k3uW|1޹d[>eK,CO >_<:oғ,b(qAqvxҞ1K D*S%> stream xiS[qٴ6!cc 3NڙN4IݬʹnNɻ=^ILjݫ\uoIDdP/M~l4QMD?(#l~/f:^<f5}/}VϲLZ+Jt8ɲR%)>MHW%8*PzY*RTHP$ҕF*m*SSf:+Rdgd2+Yt|PSYaTfҤhZm2;4*mzXaVJY"ҝpY5,*-¤ r=#ҙ`.f(2+0b)nʬ*]n`H&Ҝ#~vITnarX-6%Pp$b8h4 A,f92Yƥ| bXYH4O$RHcK*ՕLcH(y#SҢe`Vmqt{p4Hݙl6ˋz4&rl;J&bpu;)W&&e ?qեյ7E74&]_]YL! nSKuU#Ͽ!}xqZ5˶v.X"׿4ɸ=KŃ^\1k&)XFskpddܛ&^m7̚k\6$2-艹:V'CǁYۥb{9F2OAͤ0kTc\KñW){`6S}肹 FKrdtK\V10k.5n:ĸK"߻N+fcY"/kbsyŸ_ _0;ޗ 8,rkpYZV}!OLEɥ\H;?}taz4u[͚]qƻ279C2۫NS,.J.k\\gHSIRrT˥p< >ssG~{çKqzS%5彍sLJBDs\>{ޡΐ{Ks'R/ڥve㻜!g7構Sfe9/N5;)_57pRq)Ów8C2Z>?=)l2KFpIq|qz8eD#Sw9CjˇH6䲙;lwY%5ʾV.GqI qHN]qS=r3$ʂ^}\˥w%5eݸF .Q.WqI$%K\.pI$%K\.pI$%K\.pI$%K%. D$\pK%K"\.pI%pK%. D$\pI%K"\.qI$\pIK%. $\.qI$%K\. $\pIK%. D$\pIK%. D$\p. $\pIK%. K\.pI$%K%. D$\pK%K"\.pI%pK%. D$\pI%K"\.qI$\pIK%. $\pIK%. $\pIK%. $\pIK%. K\.pI$%K%. D$\pK%K"\.pI%pK%. D$\pI%K"\.qI$\pIK%. $\.qI$%K\.pI$%K\.pI$%3$\.qI$%K\. tO(+ 3ː.gH2ϥYu/NEեYK[..m]U\L !.+.4<,]:X*70<}pk\)]C F|uMH\F}q\RC\Z:?]duzdwh6gHͥbwi5iqԬtxdwOat3$䭛WK겹եNgHݍ7N -.[M>S%5;>-7:z/=˟O>z]:sl8v5ťz0E Fcgzwy_~C#{>;{޺rynf:eM"%3鳋Kk<|hooH{lon|y#|g+qM.":\@8M͜]~sskk흝]" 2ooomڼyc}musGGkL/<9yz~ҵD:lVW-k.ϝNsKz?]~g`ڝ_0'Μ:3ŋ pܹ3^=y|j؛6qYvLSGOL}fggfNN?vHЛKEn{e\tYbKny#c "=FC\&.m\jp)*Lh,ٕdHWRMNͤSx4 x=N.Z]ʁYi9n‘h4ʼnHЉF#P0zNb6),qYey`]1-V!%h@0t&'PJ)X*[T]V`ǏIʴKnJx]4u'O5K-.U2%Mt:]Du&8vRQ)eem`*#CҔ6VN; $LJRerRuYY)ivLBB;Վ@)QUV*Sl8NY'Qz#UnpEfU0)d*4O:RHIPK,0K2K4MV:+zJ`JfI'K\Refby(Q}U 5U̲ fDu!=t&"CC{;Ύ~l&qI?VDDDDDDDDDDDDDDDD԰ 4 endstream endobj 131 0 obj << /Length 1192 /Filter /FlateDecode >> stream xڝVKs6WjA|q8ubDBaGł4%k:mOXpEm<[IPBXaF^?5#Z"r7}wYFeޕ&Ձ{CYo8hՐ 3u%O1Ns7ľ;9 %Fc]9`FsQ߮o}  R0 2ȳEPBv7j Q+&fANa+=/#VO+ݹ!xnF}E3OU3fQƑlc23(&pTR_YD`#ekwECw] .&mWd@R$<= ގ!, D`}s671툒.:Tqʼ/;Z&WJa~[JєeX/AC\/DhJo繴Nx_ `ŒoLQm^$3}vkjjd-NdE8t v>mOUUo׹&Cx \)b) E۲⻑cAɮ uaL9W}$qwcVu f{4 ٗVաYhy0؍s֝%0tWj>r+"yٸ qc [vgl nn5q[x Fd[DtMc endstream endobj 121 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 134 0 R /Length 37819 /Filter /FlateDecode >> stream xgTS{~Oܹ]f3뮻Yf=HSł9{Cb;H zO0$ EA{!${g읽!gM >_"C!ꚤRHby&4EBB!P$BZ 閖0*Of_/NB!ݤaݐ¬BA!ꗤa Se/=jBJJ?FTWbB!P,30kk!BF Ɩz!BP¬NknB!_IȟdbmB!P50B!w $ PVe&dұ( " TdŵX"&[B2Ŏ74 JB!3tk/EW~f3aM̀G7Y.]i :h+ׯ63[lbΫo?Wwrz 2z2n}Ai(w965LUo{%& 57hԆk^ ԔSN.36Y|ԷcLדR"V]jFb-smJtg80FR+א*,7619JaMF|jÌgn3ㅫΆ*'Qyz8jF¬kBn!i0u.06]hlORڴ. .޵KM,qXNdEj;\pkQn6'>UjXR-25uu L_(QM:EQ!/aVW!sjHQ} .]:bd *JUCZ obox%k7<"K B3!B PW !BHVC!껆fUB!. B!a0B!40VA!fJ!B}a!B0A2!B]3H!B" Bf3!BB! a!B0B!D! BfB!3 3vx7ë"FP`Hh&rkI8tT#@!a+aNzw_/,X@y|iRa!B@BA!a] -Ĭxpq*ݷB* I'4a8]y^{K˕kw]P܃`Bf})nfRbLؙtuÚ% FsǑ5o1~4Myki37v'ZeՉ>޴B!@>ols+)D,?Ѻ5?s0&сjaqBS?uC} !"L~5&7X]h ).eja&brl޷B!l柿\08Œv}wB!3?#f'4q,w\W:/?ށC!3 &[!a6ì(fN%QWB!D0hXO [B0a B!D0 B!D0ӑSUM u B|aB!D!ZhUEeU\ĥL!a6gaV_%1}"?ִfyRNkҩ'~[dL\`lfbÖ T߭A ~rneKnuMJ%;̩Tnnܽ#:t'+a9} w2hs1['HTi -d#3%6v:%L͌ @̸़_o/O/߰9aMۈmGf!]<ʛ 3Tx*"˫'&79܇ybSRsj*>xGI~'~=0|ś_f7;=2Ӆ+Ei;1#Gm?`sܽc .sՙoyMsB"b"?xP<۠w#sK?ҋ}T/,iKcB!ۃL,w!!$ dmD 3|jv[wW/BAf3-N'zwpbq-mLMr$gd]c]Q[W3}q;?G֚.0uz1Wevì2]2墫 ts}[8&)SYSn{HZeUEͰU_r)xNt%iYOO.0w~\(ƌ^ՄqsP2YiZ>o|_=6̾}UW3ݽ"*x(c/26T%;*:0fE1sfjMΘ0kR,_׾ʳ|3! a6 U5_?TO.}+'Ysb-թo\߆ƥoOk%Še¬R+LR?Ɨ' 3M˙4 3M:UbBܽbTKMZ@2>)e-ڿt'4jmg\6Օ%~tU~@ a!D!̾^9޹  S^q7;,ۃYwn$BRcB(f: Wc=vqgo5Pu̪_W7F?sE/MR~cR90Ӵc\H zz.ej|63-@ o6k.Kyͫ~/Liz  aJˏf3a0SkϷ Y^VfE{{y X;?GWtL2Gm !a6ÌXYVZRTPy#5HKM)/UH\QVLn|D"7+˕7R++J$&TWI5q*卄 ښJr#.6V[%[B0CA!a0Uq%B!3 B!Drf!a6!̆~3f3 3 a a0 a0Ca0@!0C f@!ffr^KEY _ݟC}_)f>o]ȘxjǝWeuIId(b!e@(vHӮ9y5ȵ f:f[N]<}/GkL͟.,xeBwZ#-FǦui1̛/ @v-;, % ,fi Y0e 8XdMu_dzs>ȹtڇf7ž_kef|ܫ!)>>iR u0;?tUOnq#&|$ׄ?y*3 N'^$̈Ss5V;>0;/+[.?4ӷ6(^ߔm,^ldimq@0ycvvcB#SKYd_xIEfv:noeC򦴷,Y`l瞧LJIM6՝b'\`ldjN%#+wI%&: )%oJ9Μ;zo& 3;,v {wN2oGOzﶘWnQq6W\ʢF5]`Ã&n73ML;ccQ&l)&)"~T24/eN5]ݙU?Ⴅ{\+?p6XrLTu M^d&&l*P8h3f6f&;,Oƍ>f472]~ҿS?097{?TH랗eH{ K' +h%OM,`OoTz03t'}n_6?ј!o|T6(J:oddjB=>c6I$.Z?VVakzG[,WH,u.<j3m);,\})9n`YjQ*81'& kZ$jE>*dK.Zٻ4 t!̆-/Xdjtc,MM#lM>{L-~[%|&3tugf#71u<׻gv]"#k|k#ӥ[O_|tliA^Ȓ<{|IIm(ZWFub/ڛ/0^w=[} NnqYaj-ҘvsrKjo8]ݙiV[gFly%NuK(SîcF[9L)B&9f3 3 a8ڪlwGVY]l&FLŘBI=h0C1]-eS.Ϳ"eȊ㲙Ԋ*^S^bJ_4b23}Bv2as'/ӰOGlϕ* ח6 HV/d,H%lbg?$a ~rН__v;3\P[a1q iBd'CV6CҨ̾H$ d6̐YB!NmzA!撊yxPL&z  Z9 /֡kvf {>| 3W(L$B-a ~rн_w;3 a6aF~])f30gakvfyfFw:L[﯒UDgXDt LxDҜDOo*UޙJ,֛g֧&&>7s{P a0C!f*: %KN~vJt?%OF$?JL[8 fI 7K63fyyQ6++*/IfH2̤PD%eDg+Rp[+3H4&TTTqNS.0#fW&D%Q(#g!߀䂊@RX5,푗@Rbcc ;R.x?-3ê6+ڬZg~CW^7sWw|t`>=393ټ:c&*ϤY|_rVPB'鲩,ΩM 5b.NmH O"|^!=Py2AdXnj%("; 2sTS?:lܮ2}C:"NR|}KʏL|2UC ϛ˾f̓y&)(Q. ,[%}%F~:QЭNޢ0PnTa63yW~09 !Fџ #iSj)QaiT2SI (/ b=F+Q-\cqi0OG6MgLna6>c&*oo7].k~g.ѝ䤓 ՛ދST?=̗Y9Q?|zMaíؤG,_^^ g)jɫ\yI:[˗ eo>26?.NLJ6ACFox~Lb !JZclS[$b& yot¬ dNÌL?/B SU/$2X嚗6Ì3N!ew1j^]9vϢ*{$pO[~:[v[_r4= a6(ɗ^ e#~n텈jHSZ9=+2`Eݰ5V/KX{ElAMCsXΘu]Dwm.>:N"f ?c!&3xZ<+G}{rxSmWO[UmmOr4ilEqT^g4:.W}f@֖5f?3LPB/1aFДO*cʇƅYI!%VF?Kt;a֖C*9ӦaP jѸffZmS;fKEۑ`[U=\ngΏ3{UEwm EG6IR@`3f)vym-4Yw13-},w˟۬7vZKfCY8z=b2EI=&_}Lb-9L~93fcTq>E)3̀?JxN4e\dwqTfC 5%ǟ%;-2PƔ }'ܚ$7AIyetƠ.5Sb2 J?'f7 6LgLM{2TaVg㭎OXgτ |.PWy>Lfw=axwG6McBfg&_0y\4˞5\fkFF+o}QʖY'wYca~(5̎Dq0̺N yﱌ?&&KE״^rv53fcVfӝЌ+ݖ:z}ުG7:=dR]}7$Lsfs F.v G/K*$]QA䡄ܚϡ~_Ly,Iy)a6aF~~DƤJcOMfd&DT:f]ϒk^3뎻n;:vǖu[g3aƇfEvy٘=p7&f]]=!0ܒHn *{/Fٓ;(g[V¥3sn8?ಋp;14?as:e_a]1rv/)޳|xD߯v@*ƅaƇf!ay+#l 2ۧ_pP6\.e<Cf@Q8gF>2_Xo8SmI>_:9o;}sd <`,MwZ_fyjł0?a&=TaVQzg K|$;a,N*ڕkTO fِg~H.TS$d7V'>u^Ǘ2 =;-T\I*H?ڼZ< ` <@9f?gna|֘; >f:R?Vua:4ݯa6ؑF jbA!̦f^fwvz]vzƧ)PU iV_SqvyM!Vlmїm>hc1C!>̔VF+FS>w\mibe풧빍43"5Uu8]\WHMn#Cc!&3㔆]ttySgci9 Y쮭6l몗C|Oi]U S)Xf(̴$go]GG֯h'_Z8">G=ז!M6vN'5ف͛/6r4gV:`x>qa0A2u6fujgJE wbiPm+KDD,⩆ta01~tD.sBrWzT,ޙBb>_0)LzHL6 f3\S" 0ӱ_w;3 a0CA0C!!yr afddjLYLs0'L6 fsICmDƄ8,&Y IVv5uD23dfAln˄E( "}Bd%U儘}=ե,F.la" 0ө_/v;3R]Va1daYqd?CUQ[E9M _o%3PNffPfdG엜7k(++Ȇz'YqdM:*K 2Sddz:hӁ#`@7ćeND4zs*C9WXҤ4껣&uʄ V}p20ӑ_v;3smQ$ DiI{KB! 2w\0JWDz]{'ZY1&̼xO 'c?6ʏٯ?A!f<\ʵsBăWl#c\\T˲T߮3+Gz2UίcQ~, a007x yt WU,p@dJ{-GΪ1˙KG1M ݹ:2r>#R eabXtώC! aaFݞ!e7שNr xk_nxA/zʼnZC.sx#UOuisԄKMQcB*8^εRO]v f3|3gTw$:6-?&d{^w*rbU$|TcS \t1p"͗zC1.ۛB 0N箜j֪ϼFƅ鋾kiZIq@TmZޔkz:V¬gB&/X\y~RGWnـ2M鏂0C! (ee.000yJ:Kʏ 3X M=O[YDzP^׵:h\4hʻYfX:zZWZ@0;Ll(+ȞWr6!_fR~#9<^B$@f3D!pG!F{\;ݸ I HD!f3PuLiWh 0C! a0pf3 +a3f3 +a! a0uHS/[m7H1@u7[U. %#O*oHG1_Wn# ,?uŒ7:b=`oc2~Gwfc?-lކuW3IMdLVra6EͿl *˞}[ 0`vŒϛaٴ[{?K+onkN(/t f|3!lٲ֋9s#oqY`a6/7B!Н0#4rhAgxDb@}PBKW83"kYmzbȝ;oBn LK.k[mp:4I2\\6_;rʼwoəQN*:x<.9㙐V<\?"_:%7ΰF=%ĩSU;K|$;~Vc]}5nM{v`&ˡז!M6vN'BleA`޷'aFgת¬;s;, +S4 !@0#rBD"J~H,aT竆EÈB.od,@$H"4a0C!f3f. a0Ca"aaA" a0Ca"@!fa0CCrX0C!fX3t!,HD!f3P3 h8O.ۗo`a& šԻ}6a,&cw3LP[e3f1!IV(= ̦Flk&y.YdQ fW&,jElpp| 3ɪW0@Of_Oui!7|}3R]Va1daYqd?CfS388J/hmj`λ$%/(;,;)0Cyڪ⼲lwGV+C0S[GwWGeiA^fJvz⼒d{:Bم0CCǶAH$c(c_#y a=lf3p`@!8 f` C: al3|@.kr2307# F8 fɭʒ~xyz*la0%r3[e_ی %p[@t \_Vgҟ0w3%1#)zu f3la0CC:f3,6Z,57YaB5䤓 ՛ދ*&>%-+V8rjU_n|"堂˫nHǔ8Q =`3h{#-s+6RXSpoڭQ {J]k};G0I]ʔ6e2}_d6rUm5Xl2[5j׭4Zy˘'U]~%01>>v.k,3U&LbѭV6`F:2lafhaVtg튋cOfu6=Pבט~F+gbѨnh0`uDLͺf{JY C n?`9fCŒkwmƝ]w"^.Czffп-<(0cŝ}Y58~@i;g=[CVVG"5yh a6s{bʻ)Kפ9m!=`3?zsÞiUm}mXs6K1>Lܖrs_rWg#룞]"\SOe4;:M7ëz8,+LV|?\^ouSa6$Ja3lm ap[@޿d~{~Fŋ-|=e+OYhɊξ>6VF+FpzM! ynv|Ϙ)eW[Xmzn0fܰ0^v "̆s*r>Eer%_|[0á@!~"̖Y?VUKlNDF_rRZ{Y,VGmv % ?(&) 3IYKKsss_0ál3ٯ Od@sQ'#3~ H*q)aC:f3 ;6K1ۯ33_fxzDH *[9->{,&pf"$& :f%AYt fa00Ɲ\xPޞRLf0ˢnؚos),GRuuX}R.0Q{/e; Rr]<= a6a&ͺVvZ 0AUU#:Uy #j_/n }lP4UdDPjX3HS8a6iI;!30C 5!:kOP8SU`+jeC f)3ڝ/0F&I4 *-t/54M ٸgVt'0afY»֗3 n5SZqˑ0f\[m 7ZvQZ7շa)yC30CX L:4s{bcaF5)ljezfnT) ,) fa00~X"><<+)dV.:r0]]|x]a&5gGFd52E#oDU/}y5͝Lh~ L803τM/Y߬oP|;4vãa6$̸aax]a&i QbVKyVrLXp`hd|F)_e fyg2LK&zfYV߽K0e3=`3ltY˻]V"2 ul飳_A3=`30C0C!f3zց0C uL(f1!XDV(= aШnaLMV(= ap̚bH0 HV%¡@!ζfod]40#+Mfa03f4jeEq^YA6;Ɋ#ϕ C: al3u C:f3=`3u f+l&CuE "epX z@LioהR!dőWS^LV%= aHI%~ O֠DBϛac[ afШ̾H$ ^KV"Y' aTTa( š@!lP E!Y803P(# @!faC:f3L3fa000af3D a6a9yeOwrqܱJ|Ms8!_?Se3fa00#Si8~VXix.rBL'ݛx 3][&Z0af333$tW)K$ ԗ_k/kKW秮 3:-i0af3ٌ.v۷FJۇ5n7akJƤaƨ{ufۭO>媆;yև7qw-߂ᙵڹvwSi8&ՅCw?f p[@!f2x<ݑt\HdrbJh==qvmH{{.vǙlt:.˳/i{rxSmWO[UmmOrݚ$Ri&Oa fzf|Wwyx-3٣wxw}vN׭vX_SHL΅EJJ#k|{1>Ҹ<߮UgTڦ"O?Nwb!f`6uV4U76CܬKo/sM̞vW)"fZwۏ1 ]ZzwtS<>v~]id|/&/קA̾2 1sMYōۿ֪toj.f)M=~ϟ%מJNg3 1Cf+fƦ؋}_31!w7y,ϢkU(6?wYmͷ{/^ۖDqbfnzO-^ɷQun{ͷͷw?:WіFVPWdP.-kڞ޶G'x)GlFʪɏ;{{JcF+[=]P^we5)*{IMuESf:bBk:Mσ֮HQw}cTtgo9fbM*fҨvuլʊgs9%ODt\|2㪫  89rs=11b6閸.fZzh 7Np#WË%am:V(=`Lzuʪ4'uOV64:κ"Eݫ~HVUɍ_7)::IWI5C<.H{ᰲ娶 >zm [~W>V>wyq5)Zhw5k+**jjo_[[[+,raԮ+iz #5ugSwp;s`v f٤b_ry[d1{`-C8+%KfI?-"7GnvF'٤[\j>l7wV$S\[{lXBX1sTGp-ާeY5a_{3$Wvs6Y1򤓾*SM&fN*wڻ󋨶IwO_vlVLrs:d>Y_ŭ}wp6; fb61{R}] g\qbvځ=L5d .MLa. c6/{WN*f*+;S~ظ7v)T-ᇽbf*o&~2tݬzlVLW|0*)sq 1CوS}ʑKwGO֐O_t=ਇ?>RQ'cd-qѨukQ7S~G*jmJa-wPGmWc[$Uku:ѨkqvQˎS9bVRYխ~HN*+2.xo^j)*f_?' ;YU7 Lkt\)R;p1Okwu,͎#fbJ̞JYƲ}uyʁ;w}?w/q!C3tWs[͏ԚKkELl N%QEfU447%V^k̪S)EYV-ѨþXP+4oޟ;e 2*zܷ^NmIeRwfVt)u 7Pޝz>`s:Orދ+++|RuWwS_v{{L|xvÊgmoZ5=1tYk׫6' CWdwp; fb6;1{'Ɨ+K<-.e cLq؃>,YiD׀$GZzݱ?~cא=}j}vE L%3ALa{H[~>_7QzN[{C𓻼<*6@U7]_-jOȄrNQs/mu߱Nn쎏 5}%!oZy< fWF^8g=_:P`|ʮ}!fS5woŪ-s3q 1C~zE Z d-fzV5TfmѨW)No-4jX5Gk M4C- kIʭ_a}d~Va:doƺ."ɠ3rnd6Do:';8G3 1C\32wrN= 1bRyirN= 1Cb fg1{5Άj̛.fst˙ 1bTyir&;1C3!f fً(W) 2˄3b6.joQ)dDJa@⸻LvfbcL( \7}Z[d`v f<0;A!Co椒I+JR943r&;1C7f8?7=)+%̹' _ow0skgd'8 g4 17 Nӎ0GJ8+N?-@3 1 1@3@3 1 1{mhNMLMqDP@[&jBܦjz 1C^9SZو 1lـ/,]7ذJ>U>}45`1Mh55!U@W_z.ZMݲΦ{ ?޳5'5]U1@&ٵp"Z#b!f_qԓh@ߛ佄 ,Yq&l ͹f_w?pJbGgN=2_W]etSxz~ݏ>F3._D=qbY{U -}w[*Xy_CރZà b+fb6)Oz`d&٢g i>P:V3 1)G+WFfW<M0-g~v·03e^+ɠ|3{Af«Wg[ X&;,g+5a1C^&‹vn'1"ԕqox]ra3 f;b2)+} /eW13 €qw}˙a 1{gsa@踻LvYΎ?b!fb fb!fٜAuyH4&cKK#-{*|<%#D,4G:DX0 }%THoweCVRZf#b!fb!f3qݔdUK煘 (Jc$eQ *J#P#AueDjȈ!fb!f,lwFJ\Gv?3]b,SscZz.!fb!fbl+;\Q~/*48R%, EKyԢy2Ԇ2;NdhpdlJqqJnSc}DXcN(4v1nҦl+ȩ/L G뉶4#6:L$ I*UXEٯ Dz B_~80տ!1 tfu5B]9h{4ί$j~4H_!fbꈙW?чfl1kzjg'`'S&ԶQ^@8}I$aԦQKUŒ਄޵E Ԟ֠wTG_P[*3ZneKLϴ'U?hsbq84޽ښa”`Qнb> CR"WO!fT$ILNM GfuZ엤s}(<@S$kN]q`T~ /Қ-48%7NN~hqG%cL~79=%}8I1ٯY=*R)ݖ-赾imP[-4"l{ fSМ&xۚ {]ѩ2Oq^ʼnh7n1 btЛplZVQq/88*&B:e !b134g&ֶ)ΚbIBl_jR< ҫwTE"3[uS.{b,hѿ-f֬f-fc.cJCb_,٣(84&O"wewŢ2u3GM,0"vА,# WU{$u7qPSgk_7(GEDS+CrƈYzF@)-,0[eSb6/-4g:„~(Wr 1Z$9-:VըjakdيIeFbJ9zJ&vk 9aIQV2oc[f$Vko3/2AzXr"+9#<)34$YJ[Q=ß4ƹNt%]O2Sƭt0B, ߖ1"iͬ2Ar;$z&;f- W>[s߭7[?:v2oUf:i;}_l\p,V asn~6ةIå'?K5z{U=3̢HڨfC1S_p0:X:p 6iRC3#w#C$i3q$ ziE9qb権 bV4"fZ zZϠn8<]א5 D$l{2^̄E¢@80:蒗bfU%F6-fWLS()46#r:Lϖjkw N!f3wmszHDnpl>Ȑ^F]#Q"fj^#2Zc+ʊ֛}6k4>in|(<$2~(9jʉ.czǾ𳽳Kx,4+ՃSSsFxH|DnO:=1{"+^$eBq{zV[ ̢O6mɌH Ҥx1sPg3GoP:hTrC |҈O>"ֵK3RвZ>C]3}G^tpB2ZIaIِ"29[4K_InV2!]s3]CjhXvu,qHfn[_1d{R **TCbS3C?H/JIM ~+Sr,fOMǦf&jw3% qdv8iT d(fO n`0-1{(,-J/~TR"E58|.8Af"fЬ*18B94͝yYb81sX 1VMTo-Zc{>xビq3G_o?XǢ qۧx|ǵ'O1~~/Y,ʤzG,]3mkNT44?Z9Y4K_jimv(fcZtW|Lא֨M4}ϣ{0Q!%sT* +J3_Xy~V.GлyYA#b&LvUcvBTphDtRnum^x2&mʉYSZcf$.7F(4XKVm?7@4}lSh-0/'fƎ;YMo0em!NQe7:JSE p1W'I"ƾĤ,Ed[mMUy?:T~aaqF̰9*G̜\79"f#/ I*mQ8^D$ M5 Ɉ >}gȕ )wB$ j93Fnex^|g7O2͇~+1C^91h G3 1C3xYMKwFɦu1C3 1Cp LT3lΉ+B^ fb6@9'fM4b!fb!fb!f!1CyFYQh@NJLF0sq]rČYk~؟a1C^& ib6?V$ԕqox]ra3B^j? fDW zlHDa(J+Q)^qoFDy bJM9qALW{sEq]ܞb& O8ṱq#fR^bWg9asZٸ 5 6`Z/Z3Bf/fC 1Č*f!f!f f f!f!f f f!f!f f f0ueڿ.CMbBf=f ڿ`1C1#_I&I&u3 1@!3 y?bnu# fbVVG3@3@Ŭ$?G 1Č 1C1#1C3 3B3 1Č 1C3@A3 3B-ffmOm~J|TXHy/1`ʼnh3 3B$f&y]jdNJQuT,b!K3~Nhb!K3SWAtpJd5N }Iw#%Q 95}v35'FJ$cGf'ED3 3B3(K*TLےZգTIY-zkyKu}TȻkҢ$1zMÏ K(mJ5!fM%f=QZy 1T%U(ܙnW_Z;\؄*23@A\3Y=bW̝AȈ{CD61h2RF/ib!=fƖ0rũYz %xj2"jA^ F3@AfCwA(,Nitv+SߐZ9̭{fe%bbFb6車CD 5mRFuն-hŋJj;vl2{4Yzb$Y2N[­L 3B o-H ġa)u&Iݘ* }P2)"$"IphTlZUMش]e1bqhDlZQQJDbbFboe"f f fb!b!f!f f ftbbFb!f!fb!嚍d4]!f/YCMBCwz@3@LRT rA/tFD3@L8_mzi ,3 1#@j*ʊrK^,sV!f!dbb!bbFbb!bbFbb!bbFbb!b!f!1C3@A1C3Bb!fbbFb!fbbFb!fbbFb!f0'~G!f!f fbb f f(ܒ,B^@ *I{ 1C`R:ZJ ~eF\*-b b2&W`2 U &t{ 1Cri`0{! av0^D!f8(נq"&d\:0;D/3 Qe!fEbsB21}5C3Bb!f0LK5C3pvNi !3 1QMGeק3 3B^)1LÌړ 1C3Wꞌ_炕g ?~bԛ Y<׊cj ΓGb:hr3U?(T׋lvYk6{ U*?jL͡B߄>ѷFYc|?+-sݺ՟6mMhmkb6]Yvݜb6W )b6eya=!f/E̖\ul"p!Nz&fƦ؋}_31zAZ[ֻ+|l__=s¥?vxX{?;KW<.Kk•ָ}-y\lll|@)~\l|xVzU!>YBjfy{ k 꺠Ow|Ʒ7{zx>0*?O6ްr:C5M7Oݶn~9.WՉ}?娬vəf!ӐU||G N^7;7qz7[WOCF 5z|noSc{4{cF.!`ەN_ܺ+6=3G=h&특)f_UU5.d1S)*L2Ԭ=Llnie-/[WFmo뾌i:y[29s`dž~[|}-QS]ٸBbΥ*&L'm"f\377-:xWjsOV{tvDU)'V/?U)7{o[Tn+f-v~URќ|1gr V+ˉRY#Q7deO>YWeo/ B**#ۭ|Aqcժ::n!Mj\|l?]pJhjyYJ8{R%K+_&6g_!֎Nדk{zܲbrPUg Ũ2icڵ}3VgOT]Ţc^Hﳮ7V}tW]i`jT :tByyW?7A7haߎ+>:Ӧ Pc b91+T61ҺTyENHUewzou"WZ9mGTEK)[غ@QDiiߦVN7ijvT*L.+o^s@RNouZOcY_{_]WY%gM.e۟$uɟ&׌2ۜm!f~ee~~,\ Jv.=LWV,?x[ V?&}Ji3`v@pG?MVم(o^|n^  5ݞG›U#4͑<ܮQ /&٠ۈ Wnf)G6._"~ohRf][B*޶I'}U&wPTF֢8Gre+7n^kφ5nk.O\]}l| O C\U?˝ƉW!Eil!1sdžwQWQ1Y]]:oukeӰ(fEJlN= IifE%e{v]/5Z,cҏ ,֏a&a8z}:Q6q1C撘=c-?31{R}]މ䒘ha +5 /V̆tZ53=A5jy~kN=Y*Kkj[(0ZrQ ee)~u2o}99(BCb*sǑNlŨWw*ob[bAq4.ns]J>3 `Nӧ梋^Ͷ#Khf612TѻTqx?z.*(33F5þ#V;<Х/MCrvZ#zmQTj{'(|\/T1G<7_z,u?Ik4rY|ZL&=ݤyB_nvV": c(9N{Y b)U]۶lՁ:[}E fd]pcus-Z^cZt]̦h~~BJsK_3O|v EQ%:ȟ3=TZ =?]jtL _~c*fSSa=!f/W̞v-fOM}cپ? ʼj!o{PMAb&͊|S)/,\{Ex2ۛ>'"+zU;LaoV^y&U|}#C#[eKgX;UQU{tTamvƮoǭ vErJ5j=`t-?U)0&3(Ұhu32" N{7oQI+yu*m˝/]T;yڷcM.˭y7~9|l”Q:|>̲3 f#f`0&'QHәLE&Yh6vL#URc&Ѡ~No1u[b{Q`4ڶMl25R8OmnѨWof&hU荶> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdbx7lAz ^j4Ш/l'ybme;4GyfИY_择Rˎ&h[ͣl`j4ڝgH4-&0Q/q-5C^j;Q6񬉣D3+T'LKKssKKKk CBMY+&0arBiooOE:19((0lvT׳Yj әLIt'tYfm93b`B.l6]8ΨT{[j3$'LLg6.R NlgMbˆ &],GQዮ@_TʅIMukY+#w{}#cD~<>^ {l#hlm5#bRш)=kKׯ߸V6EWƍ\x 'J|6ZmdkYit{NFxupOw.3;VW]PLw9MwwLp̬dv!֑ ŔǯQ@O>VM;V^3e!Jg/1$h,,ҏLXI<{@3f6H&~T?!ֲS$A扣+}]ј~4{cfm/^2]ȥ?8E_?w̆ٺ=Lpe!(?tٙJ_.ZfVK&R0dF't$Ν:wn6:eٮRpe gHkɬnfu%eށщΐD¹rd^646gH|q{ G&c&lf&L,efu$/ݸ|`֍_)?215{(_<cd:2{$C’3N&S\`& I_pÅj2O?+d2Byw=gH|Bd>U KՐh12o۶A2W=3$Qc+l;RAɐdn-l*TgW)|ΐd%qHJ3\_2MkLK%sZ2MMfN2$-OfWskG̞8C޾v!Nc?2[KM2Hf$G2=!Lxx1%dvGC2fH%sՐX%S9,̻ l2LP}lj0&,zW&v$?Z}?=Lx̄lpt3$Q~~ʹ&ٶM$13v{|_o7h,}|/_Ϯ^zJO&I6by`d/]Xxև~#!?_ŧk9ydznݽ0x3 c786}t ח}t>O>nÇ||޿wͷ_;񙉁^VW2f֞z';ˋ7Yu;w޽!;wnߺ;o߸xWN=3w7۾mLx2=~ً.^[ZZzGK._p226?3\Wwpl̑gNWϝ?ŋ/Aøx…=K/psLVKTKCf%꘩5uc6Rophdtl2>F]262<_-LG[]zLT: ROo%rT,tsL: Y3lWxϴh:C5]݅BX zqDWX,B/!PLm8dɬ6}h鈪r| M׹\6# 9SO2f&DUӑNg2Nh>>> /Length 566 /Filter /FlateDecode >> stream x]TIT1 Y09b$@{Xp}[(ٕ<}Q>~O6t >Թj4'W53/%HK*J,.Hܯӏ&>=o&)d$+]K7ԣ]:(mmԤ '<(_OU'K 2ԻX~op/˽ˮ_H ]&2Ԑ%dw^%bTXE!xҲ8j$43x7"89 2mF6, a;,w8]50&})0Hc3p ha< $u3ثTnaE> stream xڝUMs6Wr&jOM\eNn0 I 쪿 IFN{}$_mir',AJs)E=O!#hgYL[QlA'Y3A!54 6Pn3V?W(D_d8bTTo "z"+SYn!vcs&/kGp`=d1˹n+qnM׻ϝl;>+8鍳Բ{Ot~D;GS5Z-wB H0ZWP%8L@7iO%XFԁ1NÚB5ZX}]T}Pκ3,1ci-Ϊwʔo ]蕩}hrh"qV_*9b@I><7@'[ќ4断ü_ih5>4e| ئ5Fkc=;a ͂㌠!8(^"*A7f X#d8^-[u> stream xyPS{|ιխ[^zy;W $0 8M; (vڭЈL9Nv ~+  o}*kN                               ԉcUtvttuv>dAG ꖿu5=G-u UndБG`}m7+˿S*ZP#L"jeofMnkn&2kkF/'Q)ZѭLȐܷ{uF&-A0ՐZaQ}M%`JPWm%L)0d>VW] Ri%o$7Xa*S+1LU` ÀaIj-a-VPRD1P#-+-T(I;j,5(|ñ[ykd|F`|Z\j_ÌYv_{E,*-4VB3lf VRי6v3_!rZ#v}X| bri1$-5wbg8j?W!o~QZa,"9p\>zx:F^>- sL-3=e=~ge}㱼͵3mx+#WsͰp=F.{[|d []U)1b[Y+*}$~0Y<;+쾲u[?Lgf:mK*3B׿8'M[?hsbŒ=y3xGyv_˔-{~9c9B^r-t@6劫Q6vvkVӑ4WF)YUwn e*p2a{5clRDĚ6m&OajerxN{I}(I'%z2ٕH2]6.<η^9yZ|wK\yk?T H 2*yv2r{|} aQo~3?Q ͯ/X7uΊT^LV+鴥00@wpܜ[B"cwm_/iNز sfغ-sԅ2RM  6.Wko*U64%f^b)7U00h7:|#Ou /Y%g?0j0 }֎V+N 3)[VpwΒa,az ?3qzY| 9Vaҷ gљ[ 3?=6fCw' [7jbLIxɓq+|}wÖ]\lc,y"f5BM`|vO?o_^*4eOxb7ޠ]&=%J#%`a0  ` 00_mME9/u@zi[K# L.Օ\Z)?DM 00$^^::;8+=~T]]%I3>_HBYPY9ByE)TTT@P^^>jQ_Rhܪl,r@|,s 3R =~AR&Nҿ0!iJ 2YAaհΠ Aҏ7HR*EEi! >)uk2//01<қOͿ/ sa I ^R2^a0'0z{1ӑ&H%\H2Gܳ0 3aR)yGeeya`I4 DZX枅a`5LEeUR*0_af:|g[.aر|-M3)LS= |)8A~yxCx N5?.[yQ?WIEm:]s(o]d9gio*BOj:N'2Z yIqsc7ҖyWַ] }ӡW?q}e:r򗕞S[F<\.xz=KKK%/Y5枅a0ð”ɜa u y2s(*4>*II0GgEpmd&KAN/~_ޛla/c7 2hUZN{Iak+ūԳzӕ wg_EtEfpa Nϑ䂫57묹jZŶӯΠ6BUR:e:ZN#+5)j؜JxvS򳪮ruq,**Jݼ}^***Ȫ%3|Q%ΰ7]x}/{{GߊQw0n~' 8ל;mohJ$^j^ }fۈ>0ሆ!s7l{{;thbڴJ*Ee׍H麜?޾)j.Uk߯ÒYvWle1A'siFېNn+e(ByE1nh|Q%jgs<SA :Sѫ3$J=cPЏȴ.8rqwzYA-JN JKʌ>{'mZ;(e@iMHn`~WVޢeUR:=>}B; =V~Cl1p{#djLW/d2= |a5)iw3u*:瀿[>4z%ӷOV+׷#+5ޏӔVAyZGiʤ2Ja5>?тsZTTID+3^7L=%OaY%b2̐:ͩܓ \Ѥb}{gUۼ]M<{-OKeu*9pnG 7L2Fϵ[ҷyHʫkk.M=*w*xÖkYGk1[Nrۺۭ~:󰸡YRȇzs,-jc5uo4a̯1L*߬auީ|OZJYhmկ]B/Sf EgL-mn9*0ÂɹMuE;zbdt(Ǡ*Ri\(3w,X)Eg=!!{}6+P,~w=.|נ-Y}U_"p WVɍ0pfÀR]+"ҾȘ^"GM׊?0&-= TQ00dFȠT RքZFza`6LeE c}eR) L7QjJٖ%y$3j`|t.V`IVْZ-*.*xhk%Sk|T~)yJ* LM u%o%y)2i{d J-Ȅmkia`ɥRZQ+{zzD%75RZZ08{!z0-ဵ'}Iw3|_>Pj)>HR*EE)ހah70 X4 D9X70 Rða`I4 DZa`00̸`so[4Y(qrs Z>fatp}EB%ɍ;ۜ+x[cV ޶aJZ;Xahյ 񦬮Z<;ź)0azoΚHi򟖺DlbALjtB%9C-M3փXatʼn iU1>>wa%!wa|qc k2ՖAStf &C3ƃXaȨ̴ Kn#y1.djw Z2-?ry}]b2iS sb~miP(\s)OaԆQe9O+ҷwd>0 %Lqb(*Z_+b/j,-0m.wI曺lə_ϲO+1AjCàL]K=.JQF2--9-\aX5u由\wm+6͸.hD3U0m˿3}"zp}5ek߹zG& WI锩5:Dxo!\n,ñLuugQQLVKRQQAV0?:(fzҔZTbD|DinPw7Nrc4A0V"dѶ,ܦR\w?R0. nu+ {_AmŪEKOу jW-=KFQ MO%1yE1c0>sO*]IlL&Lɘ C?s8Î0:z[%fK3˛\!oDr\~*m;%EΞN˙W }}eKJ[V[$!gh0өL{;U֙}J_ңU'3j2 y[KbJ-G]bCS g}wnvMhmz8\,bKOw^}060:ꓣ$t^YLבPØ)i4w|\7Ѥ>![03tͳ_w|__ scPEI{"<]Aa[4=;@( Xx`GlUR]+"R?Ð>ڪ߉g˥/?3UoXuR3_SkaX_id 8zYf3Uc߶w9#/R[)9IC7~ZK4Zpdvݐ嬾ˠ'M5l:Tաӵwtj0h{9a`)n Lan`0 cRa`4F a X7QjV V`IVْZ- ߊ|, 3945ԕ信T D,:}R`ttu̺ Jن!i=nQ>}4/e}Pꚪ_<]`$}Z# ;W ?Q*m--!K}Gt00a0 aa` a```0a0 a0  0V\\Wn[Rx|Js g8 mmxx|:Bx|gf ..,vm^;k{WǸ8KRo0`ylRZ?*ޠ̻wM] qawsm)O(qCBi5n1W~p滅9;Z~r\o{'C[ +K 'T6.6~wTֻ?U?z?b{`+_.~:e=?D>74i}ٜ^{:4ӄǠL]K[EQ) }#06>nSu_!)sËn#0A;"z!|`1LwߗdaCvB!yۈFߐs]J1(:Mݍ"ܐ}Ǹǿ 0Հmss9g:o&hGf|`1zav s\q}}ӽoqIH`c 50AgJ,faW]zr/jqWI03L:}͵=ssZߝԽKnv Kҧ-?*>QWIb#Ka`)gX[gj>+hd,\1{m^v;ښKS ʣ 3\0=#om45\kca`)hЏl%qt/t5pVϲ}chc#*Jw ےUϴF00yW?a`0a`a`0 00 00 0a`|=F6fRUU0VYfTm@,Viҳ56}hn--%pdM!I8_!0 LLzA `$}: h` 00004(7oZϻչ٤OZafrj|׊BzSC)o0 3ήX zҧݝ9aGC&ҔZA =0 l C07`@eڧ1T0$Fqa`00 La8 0Np-7tv=DVT"7Z 0io'CW1'{^&0(h_$FhJvg40B#ih>y%Ro̰ܖԲ5uL 6 ˌ*ӏ똑i Nwܖ5فa&0l/+!GUܘ'<hG77rr}ُ^.>lhf:3 1[fr Mi^LSCξAkoQf:L^ϸg.︯KL&mvܭsD"=O5 x/TB]!?Ƿ0Z靄=Be1IET|qP8R 9Fk~*uٮs^짥<{ol<{ X3a9|qֳҲj9LaNQɍirIk}䏮fj97b|,f_ySCqjB{ٱэ]Rț,)wD't͹=w=T0:}{{G===m1#%bOiiGEVfR u6%A98!{]0 0:#Fja$b%uۼd[mNB_Z70΅9J6nJw4i 2(ei`RJ=7]=|eQUhJJFm | TWW{dn޾D/dXZa&gSv~Ci0빷|Di%ݍ"܀lHt0zHd&0W >.b?/3n<ݏa TTV-G=njqsfrOba?]$x 6PA 000z}CjE[D{W0>OT4)eN C?s8Î0:z&$70:;(e`f2tjG'3j2 y[fK FkCS g>w~@ 0oEkSgv&;kEag3櫤FJe[zj[͆iGA+3^Gʊh7׈Jzh5u1Q[ Ur2XmLaY64ȋ_Mʒ-ۼw$յ5 ;gD2Fϵ[WdxȪQ(jw _U~oaӁ;W(u)!WI3=<,nhg%~'0:W' -z[k!91hofJT ЇnLgz5 qK=v.~6QJaN%tmI̪g+P,~wTGozv9BP"&27܇+r~d<{ޖ7 J ذkE_?YaZ3 pb:)4>;=/÷\טTo[;őe͂ K>|f]ՠ]B ];0]]zNɱ0 Ø C1 ǻgx&00dFK5Qh5aa_e1Ta|ah-5":CQUSLha`00U~#Vj5j`Pj o-)hR*`(0CSC]IJHJHϒmna0'FGWWH_=ͬmeO3I^a0' OMҧ5 ҿ|0`3R<|)wO9{a a```9RZIFVFd? He`⍢: R07RZ ÀC&'_22~b0 3\Kc6BOf)#ԦE g̲j k-~ۘUs!1`"fjn^ɬpSL!tmߓ6RXgA7X VBr$[ō5̀f嗗ۉw<0چarH֦?B6}.z/Lƒ7'ް_ p|lO6v3ly_9{XuqzlX/񏻕r0bHƲa\~ךf `b}ե0K5þߪ~0Wv(I}iϞ'*vt^ýfYz|({OG0"o<"zVPZ@0k v?9 a&0\ _Ǩm\"뜃r龧[EQ) iAq;)h3d [|$^m0|Ī SB$sN߇G05);?!l9 (:MۿQwra{F7070d;V ty#;${a 3Ya'ns$x 6PlЙ1k{I*,[Y# `I{/I{4xպWIMI+;A:瀿[}dlNGޜy/ZP 3a,q0rOgyFJ~^Z /~q7)K׷o ܑW\z0T0T*xgz$ϣf,mWdxȪQ(jwaj//1z `^Օ\Z󧵇RJ Wq0 gaZY;zrݝɯi~0 0ѐ93VAMR*EEi4?}hȅ\)͞MA 4 {|s:> |9nzb6t>}a` NO 3}O>a8 3O`ap0i̽y|ò9_p͎r,3fGcُK#gfaU. p> Vyo-ul)pdav a>a >myrt˂ɛZOO+iK&v|fB9x򳢚VyfoJԚ*P1b״EAzv a>at*Q\m{sc }Gc03D*=9_伔%?"1trVIkt }ѕk}\sfa`JF0}SBϽJ]r oG$xy^9~\%Ԧgg{ؖ d۾$=(l_:NUr!]=,{@Aa<;c~rVpma4M;GMa3}LťΫ~YKW |ð qy'E뒛íe &\:U^\f=CeڻJ}wco)V1Hc0-7LUWYeˢz|쑛1_#N #dst_2$lS஬ =Oa.oZ|p~üqg7j"@q=|\~^f|xQ1DlsBe6ϑEVIWwg{G3ӷtuu;:Zs2`dۈ7e^ѩ aS0S3΢t;u*zr]}g 0_atbzb6t>}Rӓ^LӇa`a`/0 3O>a4Ia00 00lZըZaF|0 0*[RT_T r%a`ij+Cj|%gX7O&FGWWH_=ͬm?mL_?$gM}> |42?}p׺!HδF^A`RhkmimiY3{> j0a0 aa` a```0a0 a0                                         4*3 endstream endobj 144 0 obj << /Type /XObject /Subtype /Image /Width 374 /Height 442 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3075 /Filter /FlateDecode >> stream xYS[qlwh.vaHm0vLt3i֍}_Z%# `tIp#X/ ƒSSt`?MůNJ]v+፣KZhOE}A.zVUUdU*wKr\vJSzv*0Lf5 U/UfEW\\yV&SE*R^|!mgtWKdp:.A^wWFz ][wўv$jQz+Ţw.]nE BTNzz.޻:K"/]b;]<Cp$FcT DPP xn幫^]./]sϯÑh,L&S4dgg"FA{箲779}"t{J('t&TLjrl&J&HH{NXw92CnEzN\ruaqiyeeuM *&5VWWV//-^{cn/ n̮K]ۗVVW™Ͼ/IB~*1NMz0u[4\2x]^ZuPbw Hn;(ݽll&uk=`ĩ} E;_7Fl']{4#WS"ԥQ4;&GAU{͉jKf@4޻N+dYXl.8t:`hw"ȉѡ^ FU GS!gybtˁ |h}p.⶚uk/10WǺbbTo,\Od{ބn)7RW?bCTwpC}v'i u1ub ^3:szpԞ0ct lah/̜H4z:V;=Hg0񾸿0;YHԛT&SCׄzZqԧcSS 沺xx_>x~r0SRo֭.!SX895.~$|8MŰB}j(tI[vPS}siWŨ0u?2aGґ{;Ks?bv-X!_T=_zQSz՗QGuQGuQ'Q'QGuQGu u uQGuQGuQGPGPGuQGuQ'Q'QGuQGuQGuBuBuQGuQGPGPGuQGuQGu u uQGuQGuBuBuQGuQGuQ'Q'QGuQGu u uQGuQGu QGPGuQGuQGu u uQGuQGuBuBuQGuQGuQ'Q'QGuQGu u uQGuQGuQGPGPGuQGuQ'Q'QGuQGuQGuBuBuQGuQGPGPGuQGuQGu u uQGuQGuBuBuQGuQGuQ'Q'QGuQGu u uQGuQGu QGPGuQGuQGu u uQGuQGuBuBuQGuQGuQ'Q'QGuQGu u uQGuQGuQGPGPGuQGuQ'Q'QGuQGuQGuBuBuQGuQGPGPGuQGuQGu u uQG窞:܇zKsSRԃ] 3n}ףhs颦n6n+b6eޡ;֥XVoե~H;h2;8xx`NqJCۥ"{PG5#(uZ8?Y0n:=H"50rC}~}av8&=M'>{ԛk7kn(.1ӻko̜H5f=-m&ǩPG΍OS[ e%?u +gulEյsk㭕NO&埦>bǒٮ˗NM<0Ub$ S#b@413Kkw??Og}z믟>_>\t`6G]v;3[oΓ'/-U߼_୻[KgR^ĈcL>z㷩"\_{sG V]rb7&Sg,\ؼ}{kkk* oonlZycueysGSa405ŰbW]lL(>}Us=ގGz46Rq}=XS7o b=%) e:_~5ߑZvuLG7'EET.%1'S A 9>khd|6#LoӵV`XPσxr^Of IcuX 8r!h9aDͧ)tV.FT;_FvΦQ5{|X^|R_^%,Nf/m9IUI=oB$yڈ$6#9`+8gj"ttNz\|g_}E}P6%GF6eK5 h7qp84M3np-h h h aW)53N; ~:h$e ЂKdIb;Aq][;{9^ed|sUAslۼՇ:TonY}|Tf:[g玟qWnB;ɂrI?}+ءGwQD9;̡\XUzFnPBİ,H+ǕU.7@-elh>POs-^՗>֗*nzlGuT9Wkmd&M*bhdžνoyqp|_O&WS3w{v{&a&iYɻڼ}&!& '?ޛ޷p A5'tb=B[h Kkd'dl+౽y,_IWx^{]=cǖc7YJjvU35 endstream endobj 149 0 obj << /Length 1423 /Filter /FlateDecode >> stream xڝWݓ6_dg%nuR$-br) ]iW %VVJD(X<.ܬ먎2+mʸh]wF6zʒ ?OrudW'ޭ>n_{}R-oYԸ:u4Oiv2FQ(<=-?$I։x* kV$UUEOأWi$Ws*7^p\E+#I d%ٮ*0(zpE_q%N4kXloIRx6b'ECq?Q)xu'!ϑ+9E,ٝփ 0)1 L+y Q_j*c˯-}9a<` ;~+l h[Hmd Y0`z=@gx\F/uÍ/Fv_l)S\я:n9V( H/"d7~esyIG6 FOn{} /9J}K *i ވac{tw+7>: UYcUcS_!Kjk6n{D6="ǚ^ 쥶0`35U5{U| +e>U8%$C#P\r2LPQ3alzodd'Щ=e7Ν3ofxZ`5xpaǪSXuBRQ!1wpp*~\v|(R>Ē-c$;qknLgJ^Ʒnx4hfʵ- ZdTU@8*ǮD @uopi= :%lNDHCȸsx@`=ۇTo Kh[{id.d=WA#~HXξ1S5^1l}l ޝ>.0PgU@ZPn9\rJ /GL%% VDy]7O%y0WO%8HeUe\Wk +xX^ 9ޡAw'Jh?z]s8ݞVCrb:4Q JTj LڨuQ7U{7rM=6 {EaR>rt/WSU°;U> stream xڝWKs6WHT0|'73i&iv:I0 KP$ q_ŋ)%v~ޮ"(P4>4EiYk*x~^dn 8|ɚ_r Z>3س̈́MCcӤhF,S {#nwH9Vʶg ֡ Q"wr48-f;@er<_)T#o{4Ƥ:Gt)^:M!VS3J]͎Z`Gr5YNI4Uu<}Ӿ5U~kcn'zտ<=̄ۉ ^12 2n/R$hGlt1 ]>M^W Vt ֬cmM,9 ԽzC۸~m|P4gxq`(I ASeX2XHyj8iFHQ5y퇚iM n{/pd ɝrI;sq릥4 _ s}xjAcDbН>< k &k<_(('q4iR7h_ZvQvPG=@wݪ\^wzͰk=Ef=SFG@ ()z)cZ@rLõUYZ(seO:DipgVז%*N|0oRCO {^j>=S^ cizh@Om{CJOuJk̐ӵՠ?/rr> stream xwTS ֽsq7wfޝ$ 4wXzT)6 {Gz/B-!)4 A@:o}@wvv{'l?q9==^!&Q)D5׿V lkXawVayZ9̽Hh0aB8tbuҽ?x@pq0u^XiZ=#j*9bpяtŝRb,$>܊!VgީIqb䧖#OHyZ{1P60- yٮWY[G"#tO݈0p%2iS1FGW9ftpZjK{>쒌;L.AY}-.*a&Yjhkqv M I5 r(Ibpٟ>GZR"^ *~8AYs=H80$@&8t m@V(Sa6Ez믊xEA%ٯh$8V3F;N10PYEoedz#Vs&Y}`lf#:dE_wѯBU <<̊?^NV3VFL|ҁGnOw0b*w#w]aVA.d2_ZN=zfePz2ZIJp!1@iI=YKqEieSqVLGWW\**. jN)1X癕$2Лr=!8믇't@]fuܭIR[}G6€ aV:fXmR޸FH@:f`yKH5%[^]NZ{VP,Q@UQ'm:hihQ7kh{-R9<S&Xlz?W>hhP<~biWxr]XN"/FA8dtv2;??.0+.lK "մNl9O45#uY`zbtWVn>U?ZK>JVt/]`U.ʭ{v_gmdR_Ww~޺Tbz7\1uZ)ϾxyΐDY ¹ sTUGUUBᴪH)y:o5-%б _a!feVp@o ,4B R!VKÌ%v ,xu 2yΗ0+i]f"h_[ri֊Fv{]%!3!B$RY^!B8ם'aVV!B8ם/aV !B8EA!"fB!/eB!syf"!¹. B!a6$DA!uGu B!s]B! a!B0B!D! BfB!3B! B!a6k¬+ub%5Άi-^fax;uz7 &sʦaWFVdGqJ Bf%܉oh$ͣ?40B!llx MG ! B0[)ϰb?8T_s[ޅ '4Ž溺v]~ӆ`BfsRݤF'S!3~sukz6vv֦Yz\Dlt N| 3UĴ5ʤ7<ءW-B0'o'Je 3A⇛xDl؇S3T;F]|lB!l\?\K5]g@ZDlK*'4J bZu'B!D-0=_}/~%TNh0c][2@!a6oqfʃ^5)3tw ^X<ׄC!f5u8rn#5G^%U1x\fmvR^*LՄIj=nSXDO;gz3B!D0pkCoXs9qg7ihm}ֽ;%ajBJO#{oظFS]NlB! +sėB!3 B!3 B!D!fB!D! BfB!3B< *!¹.ΘA! B!a!B0CA!" Bf3!BB! a!B0B!D! BfXB!D! Bf d!™a6,k*!B_ B!3B! a!B B!a0B! a!B0CA!a0B!D! B0CA!"Nѫiu B00Ku}hk;gπҺO{ۗ)aj+˪ճi.ڽiggUZ!^GH|~FV+~ZAZLZuҧdGZq[\xffZAh)ޯ_y$ؙCf3y@D޻yx{89 ,g9;v ˭DFKQYfvN>>>޼&r}PV4[!wBy(L3J~Us>92T'Jg4Vy`۽.CAfq v+t˳8^{&)i%I KJRk3Xno;p@T=t>ڔO>P>g^cZ[kKcll_DT! 3XN}]\9,{lVˏ~MENR{G;wޡi3f5XڡEˎ"XGmd|94|m.ϙ3o~.eʺHK7AM5d]~ÛLhjj w]}L'?R]+[oCsA ykc6$VkWNoB2Ƴ-ɷ@ؤPo>xE&z89:8FgOSNz~73w6ԸU0"f_$Av{QPR;+k/ݿwyuE.'LmviP 'bkR_}ʓZLl9AQv{DEEEk[o ݜ9uv{G1Xe^#_;1 ;Ec3! a6O_g{t㵓WDN])FT!c76v#reUWT$#.хObm"KrKK[l7|} ̦;$(fR;eauԻSVbRN˗h p 1 ><0ua&yk)i\vj$ۙW>^3\Nv:giRkR'6[u2fn\k9y͖C*G 3jblcl4VC֮\cuOa&5} k;@CKWReRu GNK-]C] NR6uO'͍5 N8fu`oMԋLkii~[LRCK^PʍAY0GfKHjd5[-H܏QLw}rd9yBa}qF㗯߹v\OMCyp0;m_|kdS4zAvɋG 3iWu`ZG^9w~BaMܛs[/!`>F2|QtN;gy itS48v bd%XI-d'~c4ff[)Y[AV3{-T {l  &*zaJ^M5V#[>/#RF!-moa&2ig(K4ca#xdI;tL]!g> ̾9$ow,UX?y3GR Kܰ3$mxOD=ޙLVS44Hj/_҈KH{ߗ3A/"Ei)LAzb.5(sEc DnZE 9EV[kh>1$WHfd>ڢ#B|cwi\f3I^K1}^$)z.S4Ț'jַ7[nԴvD#fVg.z+(Z@}*'OuUf3GxJȓ?ZL\ b_9!Z+I\0XIlɧX=!ir۩Iq/DvoN-ښ 2kZ.EOo]a=fJu*b32i|Rc0jD"h4{`-!mx\ r#o|#ENn@"k_fRx2uNU &fwkhnW[4L7ɓ)<|]WZ$Y֐Hj]ux2U2f/zk ʊ/^:fCJ:K)˷' dosޣAsSHqQ$uԃ+Q-O^r|.eQLLbWNϏk/!_KƋ@M$$UVZ)*~NM]¾Be2<5ڞ23РhkݴOx(f u),vp~up鷄әpn柟02o.]L{YlT74:lxvJX7XPY˔ì{v5+5V[V…La  a0 a0CM#0;=?3Δ'.Ƶ7B8!fƺ,!lXv̓ ˟Škd{9ʈWBxq-қ%m0tZcebYNl6+#L,7"Fx a4Ud3;E}BebK r0CN*ˊYLˮ4!9b ̐3,I.F'QeޞnoJ̸Xx a0D sfbX/3 aÌN+btV-X'(fYH~fJ5F{nj`9R=CccbRPw7亞iHaF S<7)<ؓ ]Sc|9 f3lvY)==D~riā8s6R=>PZ>I_S7:OL4:S3ڦ:)2sv /bg|0k9.nItS8doUIm-7]Sc|9L$̸a0C!̦+X/7gڞ☛\?X4BFEf\pW@p|n-Gk=eY ~Tjsx|j,J r,0puwT xhOgo!2`wO_:X|>WdyvKӕ/z`ĥexxL2eԲ@_/wpL~3UT3:~n΁&f}^Tg:3[1e60b[͠%#i/+_yyqM"Nd=;+Ar!>o!ޮٍŲs}KUҚO,Vkj/Dž< a00]) wuuLMpF.He1n~1(88,BR>Fz9nVw>Pݜ^>!Mfii64M?+ 7S ghBbb&W7؄h?.FuCd"2 d$ +8Q8L_TB\dՕ!{uid.f`&fl [u\Z-oꗞRfHBJRԜ:mUjHy^wقJz(ۛU[{PlbJRdh1$mJ%#7H*_oEA!f3,tw#MG3Q~7g\3O!5̒"<*Do瀬fV٧#SF<&WƻTv F qTW7v(2}Cv&•8]2ճ90sI cwO"ŁYS)#/,0ק58%qqSf3 a6 D|Z2Ү *T ۏ"kar!ޤRTsە.8F^&[bUkjl/OW<fo}kZ3M^=5X cgj`tMƓ3H!N SJ;faF=oD*FE★ڟ~бӬ:;w_b|ΫBmcͽ0޵ʺo*˨T~R*Jau및waD"h+H 󡺻) f5"mynOJxDd3voau;9 ]2 +Nx5f1dxf)݃:["TOr|3ZyHA팙lP]GZ)i 7MRjɈj\yp~%T.dۛb+RNq^)̡3fc7\uϯD{IZzߎF)PXqt(W:_p{Ү`wkH:&zxKY!nTgruWyGDV_mM&KFO8߭QB}S)>\=ez@Ր< Œ$g7hI<*Qb9+ Tdf)^)TSS5qTT ;b^enFh/O}W[xn#RÊ<.aE鹔90Sd$g"l`V._LE\Ȫ7΁9mC~ߌ1++E4ښaF,t#ziZYwuz'F骠vZf}dz(lJd7(׾۳zk]^wu蓓fk64p :/ƚz^'ixVHc[Vp/w`KS7{.ңK;w~&ߛ23la6y*5(!8/#1<جĭY>A'c~AZtl~%#=8>9%.Gx>C0K"CGDz^Quhu:T=w =nT/߈h/TJQU=͙$&$G(4~1T.)0܃~6kj/ِ#o~b7iu3nΣ^0%&.a~ٻCw}¾n&cf81.]h`"y0nj o^9խʹVlFǞdVֶwO!no̗I֋r:sH;߯~|Ѥ5^ڼm(Nb)?,QeД#uɡ78<) !Ǔ4?eِ{Dįi1~T`/uU|t.bJKXʋUa@Oe/7$GyzxE4r_}nY#ݩQ)UL[=*3u÷UKFR(ϠOaFl#װD3_1CI[R"}<\<}B Z{ϙE8/zM00rXl<2ؙpdfi^\>ry0Y\V<9G0F!1LclD!FC@=F6:WλHj)H>,ttk8aK>#ί5n*U>۾}1{iQ0S~XEwB_2q^naE).[)!ORso yٴ nJ$HkMꚚavbC~g++cs;*fQ0R50S= a63ΓMg+(YWlZƫ4VJQ|ZQ׫ܷZC~Oav$5ca&eD_oOKY_HS:;!5p)aϋ]HkNɣdRZқ0597kjaf}a|cg[&vw;#U'ÌR9 {0䏩zIa0ae_։iq)ANjfz.:H=;;¬fgtV:ޗvߛmDY,ֱf3,BYW;'t)grdGÌov ̘o,:o>ܴ{Xa&]0lF!f;lD!f_ /̞ ǜV! {ÊiC?HϏ:o*EƎo a0lc0kIR';cg ̶>Omiohke8\غ"wEF^45xLݒo a0l"Ej{ms73:t{JKa)?ulŮ7| cda~޻K0b7`~γroa0ҚxaJ m{5d.:؜pxfLw럆,'@IOv.Enĉ5lb ̐KoY_'P#x7t؊۹\n.W0[-SWC!'_3s1Xz *ج.F!f F "f3TƝ&!D!f3 B8ŒbB a0C! !̺a0C!fB af3!Œ0'с*c2:E0C!f3 VPbv.p@, lB fjBbx! 3FG[I^}!W1B`t#fʲbva6&b22aT Y2ȸ5w?߻ƅ,拤w^EͿJZ9Vߥ[-{6;mI`H#[_~H$NM3;\u3O,bQ f2i\mo=]&kd03Wp۴ԉ$&MGNa81Ҧx|才2zIPҐ[.J$Rٜw.:1-,Hsa6.z{{[r3S",3H,Io#fKKc]I~x^ӜaF,ATYKccW*s%ASWsQX9XJhnyת2Jqx^=\ ٞS5v#-z|#;Mܭ30S7\.3c L̸hE fSqެ0'=?3Δ'¸oc;M$(#~y}"=nvԃIehI*39k>'|كaJFw1S2 vjƊG'dr30C0E{)m} -o#䗬>!gh}§6<aFOjNvUvOmX/;>ݶãF dCfqGGsf[FQjRj*|XwUaFӼc_G sDNC&{CŒj/'E(o%)F/ԤO0QѵGfö0C!@ ݦ^R4nIVڞ&_p72Z5_t%}y [ȔŒg2n]i0k0[9[\-': /0C!@f# 4,ŬRGZ?WI|3-Aw+cfO3s1J@ a{ Evɗ:T\ZZ['NuoxwcMGS5qn08q+D~mOZwJ{Nb1k s"To?a0C-p.#_1_ 挄roأK/lg77C-vvۻ (c Ũݕ|iwL9̚t},4 1H@ apY_0;"?Ku3s)s+R f_I-?ƉY&fD!f2/fτuA17C)k+VubQ@٨4Ud3;E}BebK r0CN*ˊYL5!⯹'sݻm6͒V\DŽϕU&Č {0fI0'}^a&0uLa×Xa6tZ8t +1B  a6 LdلƸ^fqG[U_ a0CA(̈} L.3 a0N,<$D!f3l f3 a0̦0BB a0Cf cgS1oaPL{Iw/õfgiz/{ I" >n#,| 3ʦN2GzK+뾾>`V3vUe~K\~UskkCeAjob%Mw=nq.;S f 9̖$qTuP40Ҽ/a&mq4^db_ I3`{R{Y!K-y>+BfMI0[aPG)I# 3وsWޢ^%a6 veڳZL˻YgIȋK7l{I@a;Kv#$յûos_a.'< { ]OR:f 3MO]43x k;f>5⎍kYxZ3P\6_pr8\GGŷyD}I\iKH< 6wLTx}3`ÌÞDtczՎt/KfAM\gvcV7<-eГbr荭mv;PlyRzU=Oaұ.ݓf&Cs[uv>wt6Ro0ʓOiyMkb=A1&񌙶ξa֗v7O~~%^ڼm(Nb)?,Qe 0Ea&QVuFU.Fũ=m~ګ粹\7ﵵճ&1*ζtc qO4 ˣI} f ;*E]g y޾a&FkI)7ڕ'#ҡ(:_ģ_TlI)mgsϷ/SIx8a0f9f2Cf?+ef]YͷܪpZGILygܹvڰӸqS#l䕕xVgIc-~0ۘ]w/+<'`s4̆қuE7ڏK.e|Yig-돹qk0,Vu|z >iSt^e3U}BfCNfkv_NmJa&*xns>B0$̈fr>VlJ a0#RgRe90r-9b?ܴ{0G;l9\aU{{ظS# aߛGok)pxź݃#<27?z]]gr-nѾ a@Px'- ~yRTUP[VXbU{1?\duq8|CF[~yLobvTgݾuDҚsC_X0CMcKYUy |E?)qGU%,fU:싅38^2S#γ0?w>,, hNn/! 4̈L\l6~kSuFw2Ut& ޕ]]3,@ͪ b f"";5h[pIFxvj<E0Cʤa sœ}"̾tHD1N?`{ޖƢԸ%1Č67 ar> a64֕gJ5fg1D4O0S>o&\.g(yǰ$fqd@!̦YeYqaNz~f*)Oq6~a#f`W a0ba0b3737@!@!̦eed+.]1a0C-X`!脈R|lv a0ϕU4{&D b6~3|?1]b1;O3lR>w`0z0C!`.Y}``o0C!f3 f3v f3 a@ a0î a0C!30C!ff3 a0 aFpm>~(h/,5KP- (aۜݷI_w׽K@:ߟZ_9'TU★ڟ~б,afku__ 0C!II$>Oq'[ Wt1յ1-MՅ)!I ;z_[Efc7\uϯDv fYfn}C>!|Ka9<8caWxy~CϘI%J"=6833 f=D,VdK'4ř0>{3 f=$Mn;WH&6YfҖw~fhzi8aDwB3 a0a&.]}2`'f}-ȾF2z(Nb)?";!a0C3f5.l< 3)#Z"^vp)0fw .$* iQYVb⟘Ϯ ' a)IW0kbb`W @!f y0,ƾ^7@!f3af3 b3 a0 a0CaW a0C!f@!f33 a0Cfa6kL{Iw:ic{fż8Y_cF.M'%yMd>);w_b|ΫByQkafku__ 0C!&fzX{us`u<;z]T..?ٟzP<۔8/2􈤊$uFKj);Œ~.v f .̌4)2moL鿨|qWE[#,_ Zzp[mS+.v f3Y{-nD>>e 6C43\i⦆rYa]䯧\e3{Y!ʽof|+c-.yz_Sܷù=::/v'gK=,mo7:_32'?œbŎ%A)G 3U#Ѵ.fMܓ{i7[ KwmJkeWfĤ :2'iXsrL]ma&:Ҩuq!3._ioC}tZv_^ڼm(Nb)?,Qe 0C!lIEL<ז+l_MK9'WZ>+ ?3Zzv\g _xqͦ!Ϛ~cy>IBef<7sftQʤԶ9ˆۗ|슧5n*g;oXI 3Ux'0 fOgFIfD3[V*UREE/V^1NWL bkk,4 #N{pm_:fl˾R\x?~q#+f]Qr1u^[4boLS(w}c/}; @ 3Y ivo~HTXG)fGU!V|_ OrJ;ac3^?h+ |YYuʮq~osf]^hkԻf7@!F ~~/Gpxźۙ_Y󕧣L 3I_E}Jϙ kMV "?D%zs-n+{#\]ر+w!̰+`o0Cf=6V2ZIw[IKҮƤM7XDC:Z0rkMk[KW|*S~IqOck֒ʁO [9lx&k]60ӝ=6VTzR}+|aVqs2Z/ހvœXV] )ij(%g_ a]1{l0# 5V++ƒJoZFOhۉ'׶jÌx F-z:z+7xэqTq3ͅt5V/I2xIDػla&iO}Zsѿ.HƇ~MhXb=)߇CdO6Saѿ~Է@V~';עK7\]s-& 0C!̦O2I{+A2Laf)zO3e3af貺wf3 fSe5t~l߄f3 Pnf3 f3 0C! a@ a0Cf3PEaND,Fͪ bb`W @!f ʲbva6&b2]1a0C-48,&0W,!fɄuA1N?{lXWbv5fg1D4cW @!f YYV\ gJbka\퇍 av av f3+`of3+`o0C]1{0C]1{ lbtiEtb-f3ق .JA,b-kb a0[ʈ*44%$%VWWE(PU%wQ۷?PW\Y]+"U! Ћ"M U)JW:)BI0{zgR&|dL` rsy޹9ܙLY}';1wV=&;iiNbRbZ$%7w'%%EINI띔dA;&Xt;b)ɥFxFn_~l@fiIqJyqNNB.WUFJq###S1faш5W]U3a©3Œ0hDHLL x^8aFf0 z}LLEg\f@fY AaFf8t1Cg0 0Pf@fY 3ȀqΠ 0#fAaFf8̴] 3pА2{cg]r'3 %0#f:mttm*1z¢E>>쌑[>{`.w2aaFu0\@|/4=FvvSԎ.w2SR-aaFu0KHka&khJ՗u_R&Q>fh[m["0Œ0#:hi5- \5w-VStakmˋC62c䢒_Nwu}rf|\!0#f:t> @:ڢ~o(qۈWK |98QFe%dN>DqKaFf6S>E YXP(dR+Iߌ쒪vdY[[3E2aaFu0HQQQ֩NwKz]Էt_PR;`I*{˝|qq0Œ0#:fi5ҹ֙oM]yYMsn~k䚼 Y\R36-w&%%j 3 3¬YZZJΉ%GmP88g谍 MFLXQxi<ܩgjd 3Œ0a&"#ŭ3Ç,2u W?f`ߩK[=yIwY3faaN+l4Zӛbl*5M&zNlRbaaFu0Hq5faqL!nfaasOaFf6$I,n,f@fY 32""\ܢ3-n 3 3¬Æs("'1)1ARf@fY$6"T$QD`Iqa@R.N@fYG#-)0/+7'+4gyIR`[) ?7%9Q<#yT aFu4򒄨[ YqtTdRbbLtٳg#Vwz')1!*2; QQ5w"#ŝFwĎEٹaNBdDNDuh臘$ߺu;ĝwRoݪvSIOMiN Y*L<#JS1faѨL p٪ _< !W3"N@fYl6E^ |JqųP\/N@fYGnf4u:!4:gkeaFp*@faFp*@faFp*@faFp*@f|6@D)0#0#3 3Œ0Œ0 3 ZHK  ADv8iSRT/,&.OfL~NFbLJ!(/@;Aũ;1&B?eG)efܡSVɋ0#̜Z2sj2)Ne&qwVR*+5:ZWL_VnFfHZRR^,ѠGDv8Ӹ8;rOOWʊ;rTʊġ 3'$6"Ԩ̆؎5d9E3#Ffi\8;xΧl:x3""k 3Œ0#0#3¬LZŒ0#0uخ%3Œ0CDDŒ0#_mko43-,y{ǽ;T2~J߭?f7QS>X?Hcw6uL tl:LT-бytOZ6W,:4D| :[{c OG+J]Nu03 z+cޜ|0KW'tcaVo%W_wQy' KdIa"I?sOnﻮ~p+D=i{?w(;}"AC!'؉sG^4fY+Swߜ/ϯ#:KiW ^`k BdYEZmUq ^yIVlͫ{~lPvvSz\af̺~dxAfБWav_̔yf\T& [c{n{""8l{ ^v$^@Q3nZ1{^}xѶ'&ƛx7~r{{r0hGnxБ Cl;"%]MDLj"cw̉#ݼOhte9;е aoHuL8өFyx`nbŦw,eIKwodءCܽ_/4!s&1r'{~ί6gg3cՇ u.9':Ə5zgͅY9\ʤ[><{ܬs#՟uParR0Qk׭kwaf̺v͢R]Cgd < 0{ 3^UIW uxh(=egK)%jEڙ>1`sjUNѽaQ-P.vy'daf:YPG\c&Ĕ^>K/fkJ 蟓ǯi5wQmЁ~ 7+e&Қ1O4¨}*˥x8UkfVsǴA r`4$2x5cyYIIiO]H/.ɍ9!SǪa۱!^ v_N*\b{.gn;#gl1lUy0i_-)NuG'K=nm{}ƶK)E%ǖszTP{␍z1$/]]g}_DϦ{9|DbBmIrbp_aŗق3.c?̺Gemy79DҪRn:`f0E5S˚ƯEZ ytޖPyK剛}z?\lR%{w-of2qwg*2uZnjs.4lH_Q 7Jly :NE}1X%餔x63Fvq[5FQq; ^yQx4bS.mLu(V\r?v7o3y5ܨ r/"_ſt#=|%''z*KIM_rd NfGZ#glu.aS_af?*7n/mzwm=ήWv2]_ֿ W*|'N4z`S~Tfv,c9ӭgh,f d6)3oؼp)_Gշ5f͑>}0썑X~A셙$冟ٷeէ̙>tf̑Ur~{~0aþYp]rlOh. {-5f nro8}Dl6KMK>c۵2ǫ̩Lt#W3tߣ E??m*3_45~/aLU&ms1P.74 Uv¬qׁ9 )w 3{bmƍ_ާG?[3^_O;}-ac,/(l b64dgXܗ/iJiKF}30*P%ei- +Ju-[$lQacFq}߭%Ξom,'^_o V7 m^ɨn3<%%Eu&t~w,8d6pr00#̚{ʢ>}Zf|2[>3N^~ce/ "-Ňof/ߓze1~OhR |]^xрx.3FylM7 7"Ppk:JGYKC̊옰Lj:n)m<ˬ5{|Mc{bg5y'.ƏXe}WZS7޾ ΠNIOKKMMwZ.%\Cݒ2eGCĀ?aOel}}7$fҲ0]J9gAڪۖCSݓU^UUݻǰr5ZY ^ʬR UΞTI1gφ啦e,<؏e:fCo:(<>-++9®aGzMpTAp^]rhOW%x_/z`K+3s%ZIc4U?Pͺlԋzlb1[W1jk3uSf1.9'\1Mu[k? mӃFcos5֛>"fLŒ0s0Hjl*e_5CDŒ0#0SaUa+q(HfaF!"fả3E~`C%C٤Ws(Hffj%""k 3Œ0#0#3¬U+ۯ*\Bq|qoi_+ғc#BB:bbx0#u3Ѩ 1-N2OffaFaFff}"N4u3 8Xlhз_Y8 m%V?V@9OFv]e6 zSL}Ѭs>f+̢B* 7dN=af 3 3Œ0Œ0#Z)taY{3^pHf@ffaJa5*C6 4dEmJaf)>2yв`Ý_)<Ŕ!t{Gyϸ Ar/kɃ3{/;[^*_y'^r]zIVU|rluޟo|lIݪ]9n=_4{WoGEUct#rJ{}ǢS+85oVuS} }o_ZIeg>S~[ha 3W |(MZ['7ǝz>:ϊc3sR'پ'l7_KINo, 3 'cs̽*S-z5O:0J097;Ԋ<ˤ`io,j0, f{W~3ߩ;>|K%jSV 3)/t[Vd'X՚Ը]FP]wjN<aTGQYGWmmB"h[o_ u_f/ͼrQ}–tfK]D52u}'GQV9~禽-R۬L~_eZn-2뼚Y=xa%[w׺ZhaY{ 35^GkdWx-פ=~Og7/9v}ºPpzI~ޮ&^"V&Y*lt긑n^?Xcpfӯ|Ѭ[Gtof<;1kIJmzǟgוu=C#{ 3υ!<]eǽmJvrO_6O^}砬Vryм>;bY~(ytqx˥;] -s}40VsV):밵W˥aiJj֌]~2^FX;|UudS#Krc|>z{ޟVO_yjYݷbҿ;S+otzku/2e]{뒭R++v=gfì̤)J >>;&&X S㝺4߇f#E YXP(d⺲&<_X[[}yx3H>_\$冟ٷeէ̙>t6 *!]mɹۏ,'nFcҿ;]1K\ӽSTW)~g=;K&UV=uȮfwokzwywcZBe^ ؜bL#,9_xv2Ylcמ5aq?6qrkN/ *of:4ҽ(ī>>H!av*_[;X1vB2fyѠV`g`TzJ>6f?ָb=]ۺ##{Ð =q?e';O<̴@#"6䵿:ےݶdm۩{9lTv /L}w]QC!{j/UXug>p5|[{l=֥41GV?@a`L=iߺ2#ɵa/k MÍ}1z[VjRy0h[%g'ur3S6D7/!Ǻt i/<9渦ʱJ]2L\;ڈlaT|ѣ%&_fhӔ-y<κY/X@+ ̀0ka9d-7UJ 1Xqgi; _+(MV3Ã3qȤ 3#|5sh-]7y?N~7׾v:=JZA]^z5f+>ӓڥs.Jnn5 S)I+KqtɀpݞK n0kg81WFU4@aV99;bQ)߶]޳DPb^IA՝Ӻ?uɪKnN.*L=a'nOf@9CICQ_GI KG溌F-4ػ}?O7/ϱǨr,=\LYgDzq ETQnO= 6{S3K^{#]>rU=ζJL{>3뿸f<xW^O>׭}1{A9{azp,܁~/Sm?#ty!켥MYȷyG;uy_=<|+f@0$l6h-Mef^Kͥz*zl{YTilMw~Xަ?Wve N ,?[ן- 168wʎ ̀0s0HLÞysyT~#O?5`kkv:ef@9G[闘߮86R?RYDB:ef@fNf@aVa&IC 0¬݇ZpHf@ffa뉍U+Ar1l10k_aW%]1 1GQ+g~TJq28f_)% QT Y2bJ̑)k%URlde}^.qPf_UTTf\JSK_KĞ\pso+yM%YeR*+hfe fsQA~\dXۗbŞYhZIBqnfwٮFNmhbŞW$aaFaFffaF95eO~]_HŒ0~1>רm_KŒ0D_p \gfaIOT?Lav>bŒ0FZ|¬R=)rGU?ŵ\ͽCSmf)ztM~>W>TMfi_4W Yʴc7XnyKìJyb;CVc\K0V ;Xa+v^ʬ¬Ȍ0Œ1]~pk.SםK+V)/~Q͆*uG^c|ʾYslX\_^i \63֟ŬWt}'m^i~hJn&6{)SOód+_|WiyU&]۳a)yvN~ˋNȪZ3 O/+y#ѣhxqYSoJxhٔQshOe_ZXzv~#l *hbk{nme7WX<µ=ZS@~ >7m'm+iŨ>ݞO ~y\yviS] [z"Dat6]@aFfaaFfaFfaaFfaFaFaFfa@f$J̩R|oN{:LTaa&z'y3R|Ͻ-%s 4Z=5eK{aF8Ij$cEEEŊiiԽҕ;xS3ܦQY+v̈E'3tKӛLv6a2fMvU3't?-zuQ#׆(m4Qߌ^}EN=0gA}6l mfӆVӌZu}H4=c?IMw?&6AffzkYlĦ%rFZ~ɠ>g$VvkdOzM5c|i4Q_{Ufݎ9x 3On>f꼓sJB.kn0#8$u3c?t u{OגV:uoZ$]։h$^c<]ܼ<^nGE[>gOs֟IUZd\ϯȭS[PwGRTiWŒ0p0ViccD$XQm~\^2N'6e0a]ԤVj*kj6M7nam`(5 5Y^XvIffIz$n$3'3 3 0#3$P"3g3a@fb#BJ9URš 36$-)0/KR): CAfmR^uKu*A)f@RQQr57+M%/pI&/"8aж梂Ȱk!w(Ŕċ AhCJf溙htچ:MPLYLf8aa@f@faa@f@faa@f@f 3DDDĶ0CDDDlGfaH!"""f""""aHf""""aF!"""faH<""""aF!"""f"""f""""aF!"""aF!"""f"""f""""aF!"""aF!"""f"""f""""aF!"""faH!"""f""""aHf""""aF!"""faHfHfaaHfHfaaHfHfaH!"""f""""aHf""""a endstream endobj 160 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 4036 /Filter /FlateDecode >> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdbx7lAz ^j4Ш/l'ybme;4GyfИY_择Rˎ&h[ͣl`j4ڝgH4-&0Q/q-5C^j;Q6񬉣D3+T'LKKssKKKk CBMY+&0arBiooOE:19((0lvT׳Yj әLIt'tYfm93b`B.l6]8ΨT{[j3$'LLg6.R NlgMbˆ &],GQዮ@_TʅIMukY+#w{}#cD~<>^ {l#hlm5#bRш)=kKׯ߸V6EWƍ\x 'J|6ZmdkYit{NFxupOw.3;VW]PLw9MwwLp̬dv!֑ ŔǯQ@O>VM;V^3e!Jg/1$h,,ҏLXI<{@3f6H&~T?!ֲS$A扣+}]ј~4{cfm/^2]ȥ?8E_?w̆ٺ=Lpe!(?tٙJ_.ZfVK&R0dF't$Ν:wn6:eٮRpe gHkɬnfu%eށщΐD¹rd^646gH|q{ G&c&lf&L,efu$/ݸ|`֍_)?215{(_<cd:2{$C’3N&S\`& I_pÅj2O?+d2Byw=gH|Bd>U KՐh12o۶A2W=3$Qc+l;RAɐdn-l*TgW)|ΐd%qHJ3\_2MkLK%sZ2MMfN2$-OfWskG̞8C޾v!Nc?2[KM2Hf$G2=!Lxx1%dvGC2fH%sՐX%S9,̻ l2LP}lj0&,zW&v$?Z}?=Lx̄lpt3$Q~~ʹ&ٶM$13v{|_o7h,}|/_Ϯ^zJO&I6by`d/]Xxև~#!?_ŧk9ydznݽ0x3 c786}t ח}t>O>nÇ||޿wͷ_;񙉁^VW2f֞z';ˋ7Yu;w޽!;wnߺ;o߸xWN=3w7۾mLx2=~ً.^[ZZzGK._p226?3\Wwpl̑gNWϝ?ŋ/Aøx…=K/psLVKTKCf%꘩5uc6Rophdtl2>F]262<_-LG[]zLT: ROo%rT,tsL: Y3lWxϴh:C5]݅BX zqDWX,B/!PLm8dɬ6}h鈪r| M׹\6# 9SO2f&DUӑNg2Nh> stream xڝUMs0WhE%ۂPҡ3@ip([I=(VG;׳6N;fV+'"rn=[,S MzxTFh]>$02]WsIIVbA|x8#1dClO`ᆈوه,-EORO XB3~`'`k}_9-&lKU#,Cİ1DyD .栥XV;Sx[+tm\#Sㄻs},PuMjkݤ(6;gAUpƘji̇ZeޖÆ\:VYjLV )>O5ZȰ@Va͛CEce3^0 v"ѹЅ?)`?ONx.qJ)NXc4uZn +}㈼{/ B|O$9 P~e% :gK):LYp& ڻXrwi39?+m,u÷Pyso}о!V=?cgoȈ% \]^W;Fd=6d`-}L.9_HRX0>qsi BYMҫ?UlwvnkοXUWSW;̹Fh{lh)l>L Q}P#&q͍W^5GLtQRA8tu}-?s\K ?t,Xbȉhcr2Wf0E=v{_#!:xDRҴVy;Ls=4^ u?ڤʂ˹o.&iA-݈pv-N%UStapzPhi'ōl(*El\ears jQRl#aݯ^>*[;T__M\|HC.g'fn5U jY|+~yuO:\zlƴKhR:m% uGղGO GOģGXhL݃WEٰ)vi1Kʊ3v%ґ3owZpl(i#gA|Eehp8p Aq }XՃwUQMM^]e76s^4,eo|J oMNS޻z{Vm,yԣ!5[6 `{(@  ?_Ov;Ls_q%/N-O`0-Qi5~㍚4R&rsJj>=lWeo;(/E~|ś[["Ms<#ii({~y"^`m¥uVc6 y-X=¯~1l *A484XW _d`| ch ɢJ:A4 =J:&k*$HV#:&;:A4 Ah Bh@  4A4 Ah Bh@  4A4 Ah Bh@  4A4 Ah Bh@ߓٚ;0Ӟ0͎ksfn+3FEQj4k{渭۶^r~ ި?V,?v@5&YƚT~ivW ӠɄ|{sW, s8aT{h^JV.Rik5wAC'x3yK`Tl  _{Dz@t;oRΨyv~S4{g\Ja05{*ے#93术dGX 7 jRc\8veM"|+Ak5wA"{ú[~>ԑc+9YxcMkIڕMuY3grOd6mKSY^X^ }&숏aT~s~{DS [k~^lg[{Eaj;9Y7t_3]_>A4Wn[E|xh Bh@  4A4 Ah BhDem%e9%yo'#L BFK@V~2n! – 4 <8w X,~ECCCeUEzFFcOl)TVv5/v555TT[+BssBKKSYYiw\hn*-+!iKbSARZj"m-vHMj vͅBvY۠BG\h+(,\(0 * yyyPt .;rrIA^xk*}wHR)>/3T2''gP۷:jzc*)MΛe[Tj7^&Z&6Y+fd!sBh!dPSS]ZZJk5zFg4-Rׄ՛>XRUBPVC(Q_QQhJUUU[k+)@P3:Ѡ`\J Ȑ3NϤhGS:1ȢTfXiި= \qIgmɢx{*eZ2}ghbEt-a{V74x9aiYieeq`m]5 4 Aճm%]'PNv ҠQ&i-4XRR2|3Fh뜟i.MNP8+ۂpMy.tB%qgup50ʴ8SZN,v7-8,5 G u*FAep]r29Z^"ahȤit/5ӵYڞ"Ւ]ڢ3A7ۺ>~`O; <ӓufE~Z W MT|oc+ .>c`:UN?R? 5 69af4Gi(QRLnE\,N䳑,;5_r`<3WH+n7Jd&בQ56dgTCnӶzx%:DSmYTna@RCdFWmI NXGm"ا3.=L;l7gtL Ia/ Fϴf_FZs0p:ʬf"*uk8/-n5k./P|GǞӬμXkmQe+_ V![mm i@(1\ & ۧɘk;u}[t HoҬYA@w5+"_{ּ],?|2tv}NIv}20Zk\՛՗y!7)<`YX-%Iw^Ƽ۷BS#)\xc0A٤Yzm*H_ *ze* .(U֠+sl4mim-df$YtB2EOEiKuPAޖ"Z!=TPt,W,òEޞ>\)-ݻ?7mQUHKK#@F)? d8={RH5.2$o 3 9Yk34nz*Ny O#,U:rdAQSo2zq 02%ud}㠅x JZjh0NF7A@  4 $ `d[AhhiWhO>A-daVUZ A~N`4aFr8'X~BeR0V)* Р }`mA6db40ȐǮB6A`Ah@ cKd`AhЦ4&h4 NEewo\*\DXРn_q\=QnU_Z,Xu[TzM083<2bfchJJ3T ]uc`_k҆)WzX {B׬x&H!۪TJs譚?繹U[?MNO5H} N= /-PEGyӅ/wz{Ŧvtok.T&eP=6|s(ZAKsޑEhpi~k[aŗ&t(*5`+i#Әqf O?dMyc>?r`N is aqW~޾4w^wHak *Rw,*n Ӕ_Am'!}Y;F>&ޯPMqiW5!eys.imt?^:^o2}?ldQ=2-8(\[F3U#Gs`aL}CVVVzՑ]irAN'˙R))Yȵ[$FVx5Y1JQjШ͈ww3 j&W*Jy鹅._FAb .5p+,3HqiTQ d{"@ 2k!K_M+kH bw 2 {y3:k%ybh0\Ũ5HLyӏR4=ږ-*o>{_(j./1X49uLO޿7]kr >=JxeZZ]|ƬLgZ}\<6ܮ#_?_F2'v ÌXhpRT^Xh}mɑ<]=/yE՝L~bj( \Y+/3Nd.6WЫA^2ʥ2I~{^(αѠzYGުo_Yܟ__)wjt˃5ew;'im*B?khr;NҚU*R޽҆6JQ8}V \K NEB7f'gg(0lý45Oe{\[g<ؖ}j]w ;pW|8h78*j$m5n KE::4 ^ (Thpײ{ׄ;y-vћ0߶u Q*S_ṋǜyդiF~`@?cP"3 Z;u ]>Y)Ǐ],3[5 ]槏?t^t.r?7=i.">tv4| B5H&h- jL0 4 hl 485`Ah 4׵)VC0a)j+JZjru c#I+*`b 9Yk34nz*NA QJ9fɐ#lj~da(#C-4cNT*2 20y 4 @h@  4A4 Ah Bh@  4A4 Ah Bh@  4A4 Ah Bh;נ^-C484^X8͙oochpiP{)܁wvt=YZ )A}ͥ3gH>gkm.8Sȑ{&,u'Qv Fe}kBݹI4k7 vttxEzPmʁwM!^ŗ*[]:K9-I=3Wh\veʕ+{͢YUfǁ> :` ޸9қ^8.V|mpoľ}8 9Q@AcwXȟnM45͞;fؚ?tZn;2diA6nY2'Dڕ` X\&s{Q`ϊL.mN&cgXvZ Es7h{y] 98s=lQNl[֙u.n / aAfmon9ϼ0Z ~Q2 Q@  4yh@  4A4 NvJ]I 20S 4hk4V?LFkeE2i4 <8>A5Ĝ 62qN 1,R<'DdI+AF(+|048'"C ^^N|o{3ѨL M*-{mяƁ2*v =V 7k?U?{凄~3&nzZQ zq:q KO Nb vqYtHL.׀#yA{؋o7;=4HHjyͅ-<L{1JAҽL 7טf< FĦ40 t"Dd 5H-dKN8G^kѾ6_{ͬg:͋ys48\ߠocϋO~ʋV¢bh5I+nV '1c[r$W6ս;(}A+ņgv4`7xѠQm ]Lɩ޷Ԡn4oꆭhJJ3rkuР i“FŽbO4{-:RۏВ{ϼlb)>5)f`AѠ^k$/hq5,q]} 5{Uz e [G]rvTȭ@CAHGC;i8e~'W&Az Y睐M[aN iK?:f/l ܗHe ?n?n j& :AԽrA|⸫E jX2TOtor\g4՗#8\\._iHؕ yXYYsh;Ҡ޲RIy TIrnۛI&4h0\4+zlPrB軭 r- SrZ%yw*gz̝vMZQv~#!#eHnyN\kw\GFcyq/:?}ԥM=#ݼ|&TVTy =ɮѴ ڈѷCʔ Фf6OG c? Z3KoHC/+)EsNcyII,k.,pYy,AsT]ѱ hPuM7WW^oֳ Y#E'|gR,R#X=SG愥e>~āuudhZme6XsqC̚~ϴ[ԏc\Ncpb FDp[awod V1K{#oA6#}[f4Iu gz[q< bw 2AznΌ\|>k%yb(h&  һ<m6kw&Lc~OI)2+_&GAM%f ҴLͶ>NY#& ,C愍dN@РͼR-8:SsaؖߕM3`(pa]קP_N&'1GEj5d%0Eq5_rg<3W8: hhl!Ӷzx%F >UDD"!BRAzߠlLw_W6ڥ7$C{vNf2|ޜ3E&5][XNku 8oY ES}/ҠQ-4Ȗ vNh.~Q8+\FT&:o 9Q9x>VQ+$yMf%jZD;KkVJJ&RB6H4K KCo-TEQABGȂZ[ vs寽Zc0eZ]"\E~ yypl={bS@EqЦݑ!"opԁU7H 6*iM=Ӛ}!v[PĖjvF]ۖ|0ZF3r`  7uNDkK-4k`zV]]NgzO}|H 4hmT/wQ\ BAzXq_xL&' *^Ywi@$Fe`uxhPL0 4 hlՔR0Ԕ_ %m-MZ RhڤjM01FlFG7U{\_V (@ Wdȑ ?FM5֋s_xc 20kԑ!1'T*v`d}<hA4 Ah Bh@ Ueo3Ӳ CNfF*O١; @U1[VaC*䈫ʧɪA2{'ɪAǨC*^|ƈ` ώ3ouW06;>OiL4#tKZ195 48ɽ-.;.<ɫnJ ^ܻ.6|0eùɫALJl}w@t"4kP/5~4G~L~ zok9n;3 s 2G?4f2?ȓ+YFrŁ9:z?F6Z#!Oj*7Dj٠A4]픜ƶVIޝ8?9ʙY Ѱ5Ҡ=-~[mBhKj`1484w-bElTl&=7ӷyF?RNW]B04h4_zCj컶\V]kܢXO>Jw;[<w{6GBFHWzHx{Pg% N`NV1d >{K85T);hզ{AwѕWVqZzWx/nWm.t'9VgFٯ=fyZvsKx9Pc~/hp=7HgƋx H>_Iy1<rbz5hr:3gᆻ쟬A+*5=ெQw:)\]bMWr29Z~H^{X[p,t(g*c[r$WvϗyE՝kp3zÙ@)Ԩ4؃p`/L._b=lV58Tj@vatɽAuQᆴlK%o'gI >ErYeʡ9g>Uٶ۫hhp"-ΛdVBTxo|`h ;>̮*=%IlzڠΡ;)ŏ].l~1Fup;Q54f 鲆?bI\Gg7`ٖ?*ɤΨ.K-z,z>b*ҧA2{))]Z9h0eZ]"\? -psx2AgQV5HĞKL G0kֳ'6X}nZM`7WڛlMG/mj,t \f~`zK5X[QZZ3O ,C w'uMyIΈVSQB*O١; @cWuR)U H)>pGh> A4 Ah Bh@  4A4 Ah ~w4zqU?8%3T#ɪA-+|7ʏWO١; @iӇ*gM١; @.9qiϳsBnLW毴)w ?oh}wm fS\߽o𛂇Ck\])Az½4K ůS\gK I Қ ߳{oOW >8CGVt/0wHmNРB eqas{ԠH]vM 5{XЫA'M-%  su Jcڨz'z/{"kgXwAKm6>|.)Gn9v@O6w˅w=qѠ >rz~~} ߓFеևq pV=Lu %{GCߙƌsx93xtj/V&[9:z?F&kY^oQT Q^]/)z=puGFֺ9 V~R!NM7ڸh0\i.w[BC>1ZrjZ>'hP} y~涆»:p? +yq;%Uw'yΩK4$GC(4*iUnV+khw^ssi ,/! uHW;ЩJx(ϤrwQ`Kj6 }{Fќ%4ْO4h ݓhA葂R>7hYw3\V]kA) 48lP|eS/RՔJIdD0~<-xٹ%4Jl(d kdew 6<4-F/|޸ i`O [F{GFij>Z-l1?g_"pV1K{R;R7~`Ď+, BVL?ݞCj-9yyE4u*FUG0ےt*E[ڝiZӠ. A}^7/15~OI)24h%L>{mYn=L BC? ݢoѣ`'#=̮*=%IaAgNcNPGnu9N\Q`ii|ynlW;gk7}8=YO}}n7hp;j>_V0WUEpzϋ>qa[ yypl={bS4HZI6gɌ= N^ Vj+K#\j. mYQ@cV)/j*JHq%klm6sG =:ZK*p 8^[{a 2Yjew$Pc)-x9hA4_erY[meIYANIޛM%y{+CP_/- ZӧL>V4H}ty|NtHOIIɬݟ݇!w,W)IةZ,ErABYAΔz ݟ݇!@ %yobhO5H-OS ثAX4iэ%7BCwyW'S*eU9o=,cAưME%+.keN\|N3%H0w"IC*)}ǍZ9BuUo{݇!^ z Ѽ3Cg0?=Z1=Xa5*85y*}gAO]e&zrw_Ssu%mgAo0ML40zIR B̽ר]I1}\nn+Me)ۼ2GS~C+'Fp [7Xu _ڒdlgw]VZUriPgɎ+mr?$]4o녷-mv_w$3時k5g.qv6~\C!_ܢMMZpAcn>hS)%G:Ra^]zvZHMyNR⣩5hn%IԬui8hA2Fo2e}Vԁs[h.JbrLXhљ,7[9} Ztspf=ːz} ?=jX-<pM;x:`p%crː;Ȕ D\ku~kT׹9^k N w]w/Z'{=x cz2N2}?l Lud/9p4 M&d]4o$Fp\U,My.tB&2oVNX_aƪAUN/N=N&Z<TPNez4hݧ^q]||W^hr >ݫx}2Nsxl]1 B5HJ#ڦW O(2v !3k+L-u9"'M[i[=Ahp43>ɜzy5t~l2tv}xo7|K߿)5Z@l_f:͗MzgEk:>|3F;lgi%N-wWɚ:°Fhbdt`ή}xhA2٘X<0qgT]2Sۇ!> jSnLՕf 6ifm B 4 Bk ?g544 BA 55?U B < BujJPS 5|_9?e Bj+JZjTݟ݇!@ m|J1ײft*w-0:ݫ:R>J9itk.S ؋FM5֋s_x #iGANT* #頙? 4 @ 4 @ 4 @ 4 @ 4 DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf endstream endobj 166 0 obj << /Type /XObject /Subtype /Image /Width 429 /Height 463 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3215 /Filter /FlateDecode >> stream xiS[qlwjZ.vaHm2`1xNS'L'oΤifZ7n]Ҟs$D&|=I79犆"""""""^Rw^ g?HϣzRշ5{vJT=V.Tv*j*RhP}*γ$F2$zVգ455lWVRI)IvG055 UVJ*UJ2utL&6J1S&TvڵRJTDV&S')&*$Xa[,SI9NEJLlBLxvBX%+IePv{<^GIq]Rf\e-=XVRJR(h1i~vI.uԛKV{%lٝ.!Pp8F1GbH8 *rm\.uŒ@a%JlWH4Otv&)Q/9d3E#yvRV!(@q[ٝn_ ED2Օdٜ /9l6Iwx4R^.n.y:JV6VPعK K++oC\]]Yxx4.,liUXpoKϳoy7 =NZ[jmVva w_i>9MChV*XKvdWcݝL:"<-6W,VW*34 fzE:L*34W/<4 9.,y \34 FլK{ S3=pǛ wĥ%XE,`7'۫NN%vKWV( m2CֵH/*X}pŕu,]=:w/bi/w1(t34f &O{Wb9=Hg'? 닻녹|*ԇդb8Xb["M}75Uj.c`-fhX_޻xvj(]j֍%^a XT,' ǻr}kа>Zyd_[XAyiŒkа|doS1K\ZLtVa}vh.ԀU:jn=|W'ONɓ~/>?|p©#CSzK,A95_xs㭷yѣޗ:}w~wu{k}xJqWVU,F ?x÷i9> stream xڥUN0+#Y8uEQAN 3c<u df4`>ν!@{_s,P(@> stream xڭVK6W(MR$Em$z@KMT"zv-Ey}#vyhlPƓ $V184à2~zumi}[,iAQA @M n!5Y}خVtp@_Äe } 0Jy(b6qu"#}S“j$/XA>6"Eht#!#E0D@g1RdlL?VZ z7jwV6kAM`C5VX٩ > stream xg\Tyhݝٝۂ6U*rFEE0Т`b@EJQQA H ED@XB _s~p>_ 0U>" ̴B a,'|窒W}]MwWgKӛW/_U?BAi!,pXo昕/iizyM%  lIׄKbVWSJAAajk挕<~M# &s`߾!f%E" 2SRT07E}M}M  9"fu  7 sEk*+AAfo#d⯉  \rAAٞ9"fU 9[wRk* A䋧6'^Ln@f;D[C)\S3kA1+CA큘!2TE_,N=E2ڳZ2:%ΞRʅɍdiPVV!k}QoYoGWRVW7Z7&Zڋ.o =徜EW7s WZ)NM~;C:UqteÃw-W&/ZQACE˥"Ԩe"쎚QߣtOUSk3"&/$|oo{Pc7+jk;/TJnMeYMYCc.[.7 ^ [ui-TU6\?DZ@Lq݆ USY[:w!f@IBC⽩~Tg$bJy]pn:lb:IL>:'hՐ7B Ф4پkh[oB1d#IJ59%~!zF5!E= eķ9q'w8/3dj$gb9}~D[9lcFRE8P;إg) xtʣ\H1K"!w'xj;nEh1;qB4ǎM3AfJrNۓuQS4{.XD'p8y-gW=1U(HʊXAUq-tbV|Yhv1k'oH3tL{>T!Bv$B|qQ*|ͩ:RJZPYG&+xAiEW:|qEi^/JT#”GmT(z&+o%b+ДTRڿF/+IP+nhyk*Lڌ$#KЃg_V>dKzӉAA fsV̺;,鴍5]=5A $5-*gS"ff$1v ͷx9Z2^-i  3/|, @ f3AA f3 @ f3AA f3AA   b  2GŬAAdgAAp b  1CAAAA f  3   AAb1CA! @ f  3AAAA f  _*b AAd1! 1! @ f @ f  3  3   b   b  1! 1! @fUV! 161OKv!24uu&٥e/ I+f&m5XaXaQK+,|pų!/J)-ӚҤ@2gW?`eMR MݏȩjˊJKgUF\BcT};-)֥GJ4sA f3zBDX\}>,̍Yυ>;xYEf\){3NXa^z3 Ϯ B@s/]"O<,-[9e3A f3S{3t9llX3c3XN_~\&:A$7 ZZ_],:SW$!J˴t*ŊH{ +L|Nլ;d]U;5LZHXA !f@ f2j\ _+=eee%uB+S"/FAmӕ ѻ!;טhQ^QO\yMTF Yе"wҦiʛ Ոnf!1# [W) Al7%!bEDM,,)f\x?)TpN٣˄T?wJxpPۅ_X̊',Ba늴k37'd|TbsӯXa$׹LKpعsgo=+b##/޸{)2X;ujJJ׃+ɹ5'l&ezRqIT>vTW_:\Ecsxt:,iA4)zvڻBYd~XCN˵U) 4r5$Y#=-g8Ԉnfq'gX1i+M!1p<刡sbî$UJ2nX!qry3i)iY5UEVs3a=( 2ec;Z&Xu可Dʫ ٓXe/ px:(Ͻz`IUF^E] k*e6RYPqn*$Z̢:2k#S7_.VH6~P!3Em[D[)pv;=iԈYVueyZL0K@e ALv)+zt/>:,ؿU+fi1C79Fb6l aDpĩ̊`FTŗ< 9YK!n:=W$ߺv12>>1Cb1 UECWjo;sE#,6XX}IR頀3fS#I+;w+^Lus Ǖ_J"Vۅ5c\r`!?\UYӇ)9U3mD&/4;Bb5ˉFm.XZW^HIhJ!f dýb[{zr2EQBpc9b&F*01\OO<$xHb  b6~+/_\a^L)& De_qB4Fx@!1 ݻs1QyL w)6.VČ/,fg NG?*p+--fs]0VP@Hy9CRclh_LeͥW^mR*UPVGKjȋzFd*m.w )\(2Sgx/Q~Hx3bkeǹSlq~K eJޠ<Fѯp0ReK-9W#1 dij'>X%xYlߞut@HƲcYm7e>qfG 8b?%<+[LH)fQ 3"Kys3C]"h~;0b2R`.˧.^ b63 Yh~!z<|JS?!ajMიШ wG)Jo.*zNm}\(〤 `-fd=]x ~':ƭ8XBZzn{[ib&+ F|RQ fƲ36)֧ދTQWMցk||.W|&%aռto*$ "#eO osQRR8].G;hLWJeԥQ f(/uڴ~CpN1gU/YKo4WS }C=Dհv]"Bt;r&2<9@oQړv6EL_)u0ҖSZj f_uץ?aocEWEUGV}V L?Mak{7,ghT4,w^,l=StFtiERvcmUMEjŮy5#x.c\s{d{xsY>u[ I7L{ f_V>0P$x؍ /)fi{T4@̾u=)-q f_3 3 b b1 bJvQavF~f"XZ9jb1@F^+nkmr3e2]233"gۻƆzlfeڇA h\yZ4Ca7(s> bTh4)XUblleڇAœxic5gb @!f3'?3 ]eڟE+b1h32GC f@М!f3 1(s> b:633> bбќg(s> b&_v~Yvb#lѡy}`_P\WZ~tJ|GC̾13*^H^9;} Cmcf491Z|6C !'AAw1:V,`yaHg*ymUb jm4v1,Oshza6񧈴pOlOA/8lfv6mWʆČS?>IVf,lJ1U_iϬa!5$""N75ٛߘE=O{+/mOE4Gڕyu|>ln_OPK~rtc/߶@Yevol"ra![54tyK+Ϛ`wOlYbmak`SI8jm̰r8_=ߥՍi/>9xaq^?S2/xV-UjJ3 u5_x!'uýLRxيW..$񒳎WjkLѸ|狊ʦc63P2UAe<_X/[Ħ7 :[v☪dz-,fܒ۝PuX8wvT 3DQ$vuwMMCO{eˈ"ycq{ȸ,n%j37?)E-y1{F'oG~4Ǜ~o|ڇ}-bfZ^zI,WnOxKtA_5ϭyPpX6HtCi;}]km1;!)g>kF]G,Vm~Uﳌ,le/S%-]o73wTky1l=K5VWܐ݌d|I'_9ѭ=Խ ,OZ3w7 ۔D5Qzc@to~W] _˹z%㶻 "iy4U]='8GM 'f*l.5g${xOͷ\!41Ebxs@@ԒzzxQV.+mxsRCy7\N-oLr_?kZ?j4XW̒o룏7yO>1zĬ;6Ml9}'?a^>~+VvX|͕.f8#~{EݲS|Ds0x)%_D.%{8"M~K6{9odf1N؜%'Ktf"Ѭ_i<dաi=Fu*f5W([j d- GCYd9v8j`F2ǺL70)yB?=GC̾"1 hJikjr+~%nKI{^c$*b6П!&ϙ殤+Sp\BbCN"fe+\^>6Unq)ݦi*J.Z__F?~/ք濻!AHc׹n  aeTMpNUnǝWGk'2kEnĞfqH>bFtpZ_=*&ZȳڪK4/Z}/n:RzoNw52g˥^u iJFju|Mz.YfpX z8,n J1)ɗR 5~"jbQP,w _OO7 g1[Mgle])۴ōGÛ3먑gRfK31)5g|3_nf\Y v'n74Y8ElI9u?X(x¦oKfjļ⍸vfGwIKG1ݵ`T=̚=bFd0V lRJF\St\sI8sRR7_Ya@=dE[75.o̢^fߕ/g2_!f_\B /q+BKzmIgwzֺG,' Q+P`Cbn lzޔd3ѽ&Tu ےRŖmkka\< oΪje5Afk8kOw{7%.v5'^z♸q˂-teshHdJ Z |2qw<6v|9b;McRbeoʺY;%A?e4lWa .dU#@>(뒛>vZ2d24K~Q3K_5~QI*2"˩|:1^f< Ot< >N{~7ה>+%nwfɠQLm=B9MzFh/'Sr]M:-tRCMkLwTe+hḭ^q&Oe6$n^i$jغ6g19h;;M$B5=!?N?,ɾƫXhڳ6̡3'lkHE*j$QT7sfa|a*ƇK~;/9쨷?|?Kv_{τM dFr`uUm=wXx-YA5蚖{|d 2>ܱ+MhjTC F/_ƧL̄{0~5'xo%F;bkzQ3Lp+ìu&NGk[]?|t32+e{ 2'_I725>9Wjb1nz֧r Ϟx1ދUQ/x4М!f_}F7251A"5.Uߌ'9/.K4 4gW!f_L!f3 b2GC fc9119 b19jb1@9\.wj5g.CglleڇAJvQ[k \.P} Sia.AsCfXӵD̖2GC fIcC}q~6qd7s.v̍LObX1 {bdg! >seeڇA0A1@ fA f3@ f޿kdf9z>2A 2GC f̫u٩@!ZeڇA hLSآ9b @!f3&Dߍќs2GC fBaN 1ǚ3 Q3㓟ծg2GϢ1tl4g@!f3 fh@P3@Fs9jb1jb1h39jb1"$LŨ',seC9O ж:]2竹 #C ދUu7D{V3*j*6N.e7I|"F]-{t5w!Sv&w~h&D}?ƪ:d)~ǵ޴4{'6Zw7CK#8y+csty7z6i^_Oׇ }Z//[ )@VS1XO)P3\[`aS<آy wO>|3I-vwu h/ ]AqX!70Uͳ贽'%u ]O2 jƫJ߽vĴ>IE_KxaHg*yiP3h-+C CMs1MϘI4Ջwl7Y?[s2se5ڽݣ'=׆}>3q^?S2/b6fquwMMCO{T)#|*kUO{ɓS(GUI4l~}3[uhyyJ&Q7^]k=-і*5u_kM>fG5:4IQ͓אw?ussC Oc5 .C3ꯋd;Ivm)^cKZogO/F5:IJ+81&ΤL=߼~Tƾ=C8P[UI2b6aJ<2MDKYxph;MT~W?*?|?v,Ͽ>8~SsМgRO,fVq^67U;RU{K[cRjO)ό|+߫ljnȋnF2>/S% ^HҪ=w1`_I}떷Uʻ)bmJۿhsbMƧpCC frkUwݙlb+8Yo8b~EcI6/7WKL<.Q:/4u>O*C5nt; v1F4#]`/{㠪7g@٤i}hNs.Ho;my=Uk J}i-~w?Qo0Y(ъ,ۓFfDYrDg&21 fgKOZk_z͓V^ʔgF~}7'MݥYs? [=G +¾[ _q+wmLƧnCC frlѼ@])mw\ 6^&zG&1O˰83Y1㶔$=g5vzjN['n`P+8OэMD1!xUȼȥjGT-,Ϙݮ^kմg|SƚmC&\-{&"u~ys3mٹ4_4jqAfwٓKPp\o`)QcxV]Ol~}L-z`7BUᵼ)tc\P{޵Li +eֺ8Y}Ԍd}>.[\2>| T 3{->85ٟ3M }+>LD`. ޱq7ʨ8_;?~'fVskn=H"f]rimOZ3ɈQ8DdB_QsG=2U(1S*U7yh1NJ?.dj|Z6?> b&=o!~`hbƩ8j:8K1VX-ޗ}ےD?>YrscHfc7$NZ!2|i^N+y:A6+5kGd3~sov߰}^Mpv{ۀluM[k#HD;l"jp֞'XƚH_Xr͝tpҺ y ~K۟ os/jb1=$Ŭ/Z[{ ͳ6Kejyt5p7.ct O ݱPiZ8gxm%׎mYlERVW7^z"=o`lKW7ҍN<q,}a h ~g}Φ {w .~pJG+ބ BNJ3YtKL0ɔb50bb,Ǟ?-DS4xo2wYӿ~oBc/ !u&Uyo%F;bkz3!f[_%+h]yo#06nvV }CBrgkƣ=IMJ gߊ?\zJ},jxgvh4 LrLKO.TcZ4ITl~} pxo8hliYr+ìu&7}FF~}4lϜ3+s j|+s> b&(1?Y 6g}_N཈^7Mb1ŸlC f3to:{ץYBݧ+gԸW}r9/.wwl4gٜ 51AWBOEf4ŚmYͼY9 b6灘A fc9]bP}   b:63 Q3r0'δQͱr Q3S.jkmAsRZ10aw*-r83mTsfFĺ%pt-Q3cP_M͜s9XDg&0632GC fޣŅ9iBOb\@!f3% f3@ f3 f3 33Z+Ex^ggk=>.Q32E>`v*||,@!f3d?&5%hX8oP} wf4)Q3P1/m̱Lab=cc(s> bg9QhC fbP} 33> bбќ!feڇA@FsbڇA:63eڇÀKISP"/P"+ 8x^nދUu7VK2^J&9{WbқwC_XZ4 3+Қ$o qy~Wn4g0fLŨg̕pQP͖4ԥX2ylʠ)ƶr)d/jNSv O^b1}}x-Xw}]'oG~Ǜ~o| Fԯ_Ot?9`ns:怱XƮ;=?㩷szxBՐw?ussC Oc5 э/רٟzPeakޤw|l]FGD->iܕ*<{u~5mu[;HݧiqYwɞԶ7NFLp zgOso"4Ӫ[t,6o 7|3)f֡+i7ExWnOx3$fjCz@Oͷy1Ip+dZIօ$y\zg/ߵ֧O";XdrjypL}tQC fe\tDs0ة9' }Ji] ^ӓ}И̟ tl׵xMnMso;mypO|p|QeY@뚘%/7kiI7u-Z~KN[4w/ݏKC2_ut5_s7$_-!}|EOɽ`t{=bȱ9KND&;#bVywߝi\/8YoIM1\SǏwb֗KNWHE=|jW+F δ3]*HT_f};5nI$#rO׍y }rȱ9KNVԜ';#b/ ޕ|`e 8llY>P]}G3^Yz1\#:I_5Vޢ՟_D5W3VR=Y;J7颖}1R1췼.*wsAfjѣOclu!ʑ&E{2>I\~>`Gw\$جs"t-[n8b6w<}2?\Y;E;\c UldInZ5֐'+f;+E=t#LjEwkLMq)b1d0V  ߕMKk]ܨn+EӍrE⽎^;B .t$.eTj<#Jo5t5 I_.mc}v@V6(G8%Vz{3EV. _V,h8_}_ΟeS@z1*kI$^UJ9 rx_xwŏ3ɂ>z8c?MWi>/q.oE 1A fWa ,Ca 1$ySު{D[bx_oKl4%/eRl|nߴ$;h}5)q.TC}Ÿt'6Yt=x gq#~{sUg՗cH-3-GM RD%nO+޾}Qr?^ߨ^]{=qwv7?ô7U뷿?i戼a{-Of~6[Ӌ  qص_}QcYH_^sҶ<~<(T lOm {WJesǶ6iQf],x >%X/0~^> bf*H-c} >2ZgkB>ϲ;u_Aߗh_gAPԟZrt̹Q37~g}L3ދUQ/x_i9C̀܋Z.1Aև| s_ƥ9/.w 3@Q˱!f32uڳ6/}1@ f`5 b1`1ÞQ3h`CC f@ fe1Adpܙ69֜\9jb1`|*Em-hSJ[ks@!f3&N\y9b O0[10& đ̹173>Jtfb c3(s> b=]wqQy#}coo=4L^J 4cWc4TX "0#O3L~À *~~ |ʒS$}a=U20>ŌbF P(f3Q(f3@1P(fbF1QŌb@1 bF13Ōb(f3 P(f3Q(fbF13 P(f3Q(f3@1 ꂴԂȼ9(f# k;!,o*ݝ}a]Ê},;+_/=5J֑9 [_23,f-uwwMsO=FbyR*. ?XOobQFg15}R[OmʠZ$u ]jl7;?f?N%Bp5x|D4y֏:kotJ$u2ra\[̭7[Zj-G}&H9iZfȎ[f̠g Zr};H3fJjkXGHMcD.]yN"[|";WngUY7eb6ˍeB_z6|X"Z3=)RH3&F{9ˤu/U4rXbtk؈S[ѦK7$Ե>ZkkJgHkYS}d\Ԇq!ps1 Ugx',_oWR_ ,ѢeNŬ2@1ŬnyT2T_l'g,F6yX2q-,\P}w4+XфKɪ6<$>O6gi/­\ <”.zgFIj+7pw_ɯ |a?-Of[wHxs=\]].e4Ǯو.fub Uke*Ӹmʞ'ҵOɮ~{p2GiOR-fwuR6 M),QizhJƪ#uۑzrxф'o󓎟󘺜cS$i*'IoYVNޔw22.f:?x\W ꟢]Kҵ :]kooac7C}۫߆o],2X*ffI=L`)iSy$u,> Jyz;[xOU]jccqI5Ʊ7ŬkmٺD, ?xr[0>v<b6/r>$'СM K5V$85|.oKM' ~pF}z_Wɾظ(Uhg }WOLu*f_),sv +Ybn/ qppqFV,fMѵ"C\ER{ISf;M_-ֽ3 {7+S?,'fq pwykهn=q^p=BmZK(r;Y}zoe< mP(f3@1Ōb(f bF13Ōb(f3Q̀V*reS$}a=UU``̙} E)TJn.+3zCzU%f`̙} ̓hailEk sfbF1z.*+nawܑPרMzlo/89?~BF~C3^,Uz:46碢B@1@N:+\H)*ɿvnKWcS(fGi1o5emk7~-Yssk(i۳zˇ؜Dr zs>~t~=} 0{Xb%؊Ž {4pTX$;e{. &-aϲZc)f3mŠ#yJ03;ooh~xvsnE'Դi:;ǵ2 SO-_n#bsDwQt7O}l r136.l9o[j23rSxz?C'8f[co~w{N$~pW~3v{!6g0OOtLm+4cs>-S(f@ ƜFO1͙bƜ٧Q3@1c)f3c9S33 P̘} lƜ٧Qvl6gӏ٧QYRNj9tZa933`YnVJQܯTʼ N60>Ōb;eڡ17$u2>Ōbt #n126ga=Uvfa933=*/+Cr&)*ϕ1g)f30P(fbF1QŌb@1 "JEnV?Gߧ?2/QXU5.9O1(_0dRY/cS(f@D 5$S?nZŌbvl6gsfbF1رٜO1͙334m=K]BVzݏku5(ZpP`ߖ񦡭w|誦ۯ1,p߽ʿS: cw8z9>ŌbI_rzjMRYom'uUM={✾,fMcf_~ 7x_ Viۜ `m}^§_/'w~`4Ɂ3F鴘`Ǎz{Gi_7(ZɥM8e1kN?-f+^{DI۞[ϯ8[>D1ޛ'mz9f)f36[Nj%Vb8(xyiKGOsY£ƞmC_R1&~';^niJX1~U,>Y%﹩2=O1a?nHya˹_Fݪ5ݚvMA.fuNܱ͟c*{y}C!Q: B&fU䎞٧Q0mC͕6C͍uck Ͼ7X-I;PqguO[d!}9>ʄbpWO2Nv\|sB_/'wpf|Mξ"2!ϻP(f1.〟l{|9PnHYs*xk+o=4.+lK~җL[13C1 z4-}?ABpͷS1{MbF1ÈٷoNv'yC5^%O^]}x%̗Kf~x-\]#~,=K3}PuvDw{lgڟaDžmQh־[Ezˇ(f`k;<;j?DO^N} |n17H|pF^R<+a c-2ŬY_Pמ(.L=xܫ~~ubFU6lvYuw?_;*gbF1h߷}>mK]m=BfF]nU\OO8c|kLկs)~dON7_]s׎wX:D1wv7Y4mʃ7J}u7r)f3`oeucŧQL1cS(fŌ13رٜ)f`̙} `fs(f>Ōbvl6gfcS(f;63S(f,)Qӱ9+N+3'sfbF1,JW)؜JQƜ٧Q̀wL}V;T#憄Vz0\Ɯ٧Q̀.d ;F,,0sfbF1zGeeȒS$}a=U20>ŌbF P(f3Q(f3@1P(fbF1QŌb@1 bF13Ōb(f3 P(f3Q(fbF13 P(f3Q(f3@1Pٍ2nXlGh׉E!-|Q]־P(fD4Tyz4ʆb(f\c4vVZ{R?^0#tfPyz.!cLW@1uWoh-~Q\Sjygڶ32>Z$u ]jl7;?f鋿yxhzĪs='Hڴ3}ѩER9ۏ|;g䍐i3by!w쥶KϖGۙԬb/|d|r:g'%?TZt9G%ӏd*,iLW,uܐPgĭ֒L B1M@(NSv>bky'ŬHOfjR$R-qE"OL{j.FloT8`gbŌbf5f+K]QfŬPSښT}\ɸ:CuR6 M),QR&3YOŬŠ6࠼Y8bVt~?E%Q--C!S?iP.j/ffI=b:`좘@1u]ZZe򄄻y7}l!Q;J>lKc&Z\vm?2 G|x䁭֟+1V8{Q̞-f3Đ}qQ?dѦϒO~SޑUa...SF?c)QdHjo7iuڎ^"5P(f3Q(f3@1P(fbF1 P(f3@1P(fU9i{)wnª*``̙} 襢 Yrr,]x%\ζpA(\xS_~A׷|A/H ܻ\VOXC?45hy3 1osc)f39iUeR*jue"Z,am*r390cld|)f3DS~Z^ڇSXUS֙ ;dP҇O1a4Hs6//Z!}aUm֙ ;ogbF1(ٱjk^V o#}ɠbF1^`ǖR@1Q(f@vjqPdgg )f>`e#k#u 䝲F_ikԽh?;=l`IbF1ݐj:(Ok(f길8ᣥ(|5#l+yť%7~ZvCq'M{Ge;+jUU*u;cZ[N;U4$3eb&KW=8vuMޜK,3ԯH>Hhb֛sl`IbF1Ðܐ]9~c'om -~L[p8*,xȲ= nߊi~nA׽05zawxǔwˮ3p13nMձe5sbdW%mˆֺa>~i柔3|7nlK1c\̌+~*CKӯcVwr I.|H,KI&xHj6C\fDOy1bȽQo;{Ou6IU(rTwI3>]Xm +f89osL[÷VS(f,hT}"/'o(f )1o:{98߶[¾[wàa{r+m!m-f"ȫR/|ŊZ'|.-WsQ.*J, -Rbܟ[?#Ș7_8d81uCqey{f;mIxzi코HÎT I7bF1P-fyZ啕f5 I75 &jDLݗlƺI5p{ڶ2 g85Ml__UYYrcwQ&}U[_m=Lo7aҬk!jun^?YZxkr3gg?YnZZb>Qt 6O;yg:{4^4T_\0ucc-??U]g|JhI+~(s=-i}\][q=1IꢳyΈi ŬzLzξ)3l1ӷ4Si;.〟ko8i[x([No6uo$SDnnh13<:pzszMs:e_[)=xw3J/Ō}2Vs"OޫhoU*OmX>gn$WXZo;M1b?xRt\eg+.FyM農-Pm|h7ܭP{1{٧Q0YoG% _x왟xbR^>vʄs>T=!U{1{Z  nt襶Z0?mg/ZTf]76?t%yRzq l[ :_3xM?"S*ڋף}Ml___ZUkjMQ0YKKA>̊‰4_I3s T1keg3J!|>e9Tvuz`# K7:S]>TzyYLH1cx=fO4逾lM|S_ޜCj%nSTNpTl-fϛYݧllQyzMz̾)3v1k1M)2y1oL\xxyWCe:og?Z`gFفP#wJ2,&e8xl0~6 Yc?yo>*x7JK-fj2E~_*v'zK1c讘rLBuu*,(2BW6:nnnѣs;f}$E쮘UŗBS(-#S(fŬb&9o[j237j3Om\0'M}ehKo~Mgs;jMnJKR׫:eggW) v tecK7<*SXR+f-W{8J\&O:r`U¶bRPGj_\d:BWTe~cٴ^N~g?v5W3u[ٝrRYS%S<'\scM*#}-bF1iΔgb1;YӬi47Ԩ,mhզ15:Ոߖe2 Ca{0f4֫QU kZU7jjƹA\p_w_*Ōb~V#*|Jnn(f3wlEŋ?bZ[}&c?.Jm/F@1/c32hPYj* l;!n9j%ŌbF1kV*RSS?a|`R446iM jը(f3wظʊ2T k+\aǜ J(f3v2)fLbŌbF1zCXYY^^^z+Q$}a=󋰼e:sapǜS(f r2ӊ )*dTL5,+}/ª )pnf:'}ogbF1hPQV|LCibc33'xA.︐z! &# ..$~M<…dBzFZo.^HtAE…4*\R |.wwA_B*py)'˜K>ŌbѠQރ_?̩乲HUey۶\^* |T} DccYR؄+I_EXOaU +iƜ٧Q̀?UժxϮ> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdbx7lAz ^j4Ш/l'ybme;4GyfИY_择Rˎ&h[ͣl`j4ڝgH4-&0Q/q-5C^j;Q6񬉣D3+T'LKKssKKKk CBMY+&0arBiooOE:19((0lvT׳Yj әLIt'tYfm93b`B.l6]8ΨT{[j3$'LLg6.R NlgMbˆ &],GQዮ@_TʅIMukY+#w{}#cD~<>^ {l#hlm5#bRш)=kKׯ߸V6EWƍ\x 'J|6ZmdkYit{NFxupOw.3;VW]PLw9MwwLp̬dv!֑ ŔǯQ@O>VM;V^3e!Jg/1$h,,ҏLXI<{@3f6H&~T?!ֲS$A扣+}]ј~4{cfm/^2]ȥ?8E_?w̆ٺ=Lpe!(?tٙJ_.ZfVK&R0dF't$Ν:wn6:eٮRpe gHkɬnfu%eށщΐD¹rd^646gH|q{ G&c&lf&L,efu$/ݸ|`֍_)?215{(_<cd:2{$C’3N&S\`& I_pÅj2O?+d2Byw=gH|Bd>U KՐh12o۶A2W=3$Qc+l;RAɐdn-l*TgW)|ΐd%qHJ3\_2MkLK%sZ2MMfN2$-OfWskG̞8C޾v!Nc?2[KM2Hf$G2=!Lxx1%dvGC2fH%sՐX%S9,̻ l2LP}lj0&,zW&v$?Z}?=Lx̄lpt3$Q~~ʹ&ٶM$13v{|_o7h,}|/_Ϯ^zJO&I6by`d/]Xxև~#!?_ŧk9ydznݽ0x3 c786}t ח}t>O>nÇ||޿wͷ_;񙉁^VW2f֞z';ˋ7Yu;w޽!;wnߺ;o߸xWN=3w7۾mLx2=~ً.^[ZZzGK._p226?3\Wwpl̑gNWϝ?ŋ/Aøx…=K/psLVKTKCf%꘩5uc6Rophdtl2>F]262<_-LG[]zLT: ROo%rT,tsL: Y3lWxϴh:C5]݅BX zqDWX,B/!PLm8dɬ6}h鈪r| M׹\6# 9SO2f&DUӑNg2Nh> stream xڝWKs6W!gJNL㶖&$,4|(ʯ)QR:'K9r~_\WɃ6OW2d?H KVL|W#]-]`8|a'ףּ(ϜırgǾx8v V|`5ju %$>7XӦr c!w%OjbK_{qi~ՠ<ip|B(ӨAoAH7"0K8G)ag{myݾRum#KI?%DIX1QNzt9Ih3,w> iQK,ZM;:nXOʅ&,]KQ}"^!C5VԒo 7gB x5w5'҆Ϣâ %miZ*k>*9l$g1^SjUIDiئk͵ ]fZƵAv!4i;ǎ"鶔JO6"PV*ErUբh7Lu}X=;.Up+"EiP"?n 7V' W$ r-@#;AQ|I"^ '9,!H֕WjDA,RU\E2g'4@ 8m( =D'W0%s@q? T EL P0wc\Xid`x$u6mYϵҞ hdko>޽-moGǦ,9 U8'jQ3 9J^&Eà3EXDԊǮʡ#ƳT%t$j6PA'K '0oY~!o1p繉 eа-sgͨ B ILP.z pNA˗oݿ,u'|]ˀb7jf{Fy;[*5cSC68Uݎ3/m-(`xeiA&Zrb Ȍc@Ԩֲ VwSCm rygZ $6̤ky0o,HMbљ 6?6G5JFMTN0x zPtKQ7s;? endstream endobj 191 0 obj << /Length 1051 /Filter /FlateDecode >> stream xڝVKo6rD7}KѸH INJ])K_;}țp7YcoaՏUt[P"ǹyYrxoAuA}*& 216~ݖ+?OZƨ$%D]Iҏ̇evzX=rIU+j0Ji=7;/#Irݭ>E_IPa8GaV`ׇ<˝2z$/B6vx%1 ]A,M U~aB5>agۙ%R/$@('N3`}Iɡc*FMMgd>q7H5SHmloAoޘhLXsji<:kZmZY?='M"ľe>Fwߣg8S>D!!f([68*SutF(>6ֆۛN uhãREs:W $KU5O=:(l[{sgARjNy /8FÄqeNW(xymm-ӄ^-|fU`rmrwf^4?{i nYgzBghetm^ Y<ST%`ak} cV6C4А T(r=˚4)QK5RrYG[@D t/@c/`H&+E@ (6tƩFs0arLc|wzRXմ/"@z〖קF2~W[VX-wh(w\أ0Vwn:+x:4.<6W;Z[t D|f=+\CKjwm~O::zYT Qly:lfW۝m`z{,b^LMP^xjunkSǺ:f7=j w8 ;sѣ0:StjEc/A}Ǧ_1RX 8?\ ~ endstream endobj 182 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 196 0 R /Length 51717 /Filter /FlateDecode >> stream xw\ ŁjU~[A VZW]jku"N P^pH?Х AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtԔ‚2afRV!ߋ;+M813#˼gٙY)0 0 B -ƍdT6a„/_{ 0 0QE.0cƌL` 0 0ܱL0LzZJ+.{faa 9,.6 0 pvltT̴̴$a묌NfI0 0 O; e%g&0 0 w\_;m"55uo~8r/zkUv.=MMSsѺcaN`tgik.^=.YH{/:wֿ[*y:5b.TV,Z5UР0ܱ1k?N^>s̈/'DKTuĄ6_YEUcO;?SA^Gi iQw/\|Yh_IĺIf{.qǯ;׬XNb$b˶t$mcߤm;&v=i00HD^ fU[Y<;;6igΞ%~f0a;5j5Ɣ՗IgCuAߪ2&/?G,vs1mADRunƘ/nŕ ĈQ݅(5(5錩:N,vSpk`mh~w;Ғa: J cCJ_xINչˤFܨP)5&ʟ.ԝEWSUV+/51>x]EuazpZJUL,}w:CY}B|TTuN"s \S0`o0'!=nmvhPʍ]ߪ퟽p` Qpcw6Mu[!eEӢn)g1-g`zw F_ᯢ}:-boP^p96ă  KKJ:s@CG"Lp"%0_vj Uvsw{߶9%X%_Vњ>e+ Mpf~qڳI 8},--ͥ)*NT=4ft 34% wl0GMsYjR p &qIoS䛌0ܔf0 !%p/5`&nG P[s<4idzgjYaaY'yă8lMwӄSςy#K L$LtqŌ FiE[ane<<7hnV}cL­L;fo=̙sA>af0+TcQFo6fbw$ yiEafWfQIMҪNb^p6$DҜ-Zjʙ1wOvl n.!c3Yr\WP?6wOܝ]7r~`aLPz<%Z_mǟ" aOMI ӿZ7W220]\m3s1g@]V`K1RȜ}Hi\nwwtj*ۦ[~ܼcjaK!VlF1i>ÞSޏ$~.3sUD- 3 ݚy]%$32#ߴ n_ӿ7RVZRc_I0܌%<*Tt7?ZO]Mkw#RMf9}C{Lk w%u. 5'V>{$WeRң4Z{LSf0 f!'!6޴j^:0Y"Z\!%|sD[Yng-N˟O" `irc6+7kSW/hźwP5+ Qjy""0)9mD#|UopQjzsj~62Bm CwZR?ufNe,|)5`F5چon0 05!{za$0Kӷy'tLrԿmlecckqmHrg_5`zD&\rS[^3qyNg>ӕz`&Z҈P $P;@_LN3#6$_KT7":}7}|\̲cN,I`0 `ĤC|ȄmfoN|g;- 6`ٹy?OąݹG/1Yfl`V S:`&.n]Eֺ)ZfzVp2\2-=<ݸ*t-0Kdՠ2ta߲\s?N O Tϡ`$j}LݼyLKƷՒ#옷 zV݄J}fer:3m| e[5]x=2m,-ä;ZkU_"LLb߻eoxifuL\$ޛGĪ`Sؙ߾u77 %'_kfL>sw;OyJV#0#6mG0a`0Vr|i 0 `mo0ND6`f3nKֿz*8 ـa`--x/ 0 0 `0 0 00 0 00 0 f0 0 f3af3aa aa ;UNs```0a}0n`6a`>@Af3 f3      `0  `0      f3 f3      `0  `0    Wh5Kujj:߬Wܖ5t)-*,*)o>7zITg~ë;_4&m7㶴*VU^v5AA3"J*6m-kt ,iHw^%pĀ]Th f*ͦ3TsjأeD#m6fJtUe:cjr!AAYɥ>署ުN)n*#/~}Я\*j.^6_ ܤMW^rdغh,ێ$܂, յtmgfY MOXiF`q"<L2{[fB稩?Qdv~pVkuf͚Goy5`tf^o䚀yqg~n\YKVz٭*^*3r37Oᖥ_ٵftuu-݅?s f:hިɘ4XO⛊Lu4U[ĺG x$)\WEuƪ=lO@S-QVQZ3K }{}t%7 s̿|SU&Klʚ#Q槟ۢ6Em-{woZBW+/<&`Y\u~\_icgn]سp:cOʅ(Ք:+_yAqUj q[ f3Ѫ|mpVJECgWM #c6*:DTئpEB3i7i- fUcLY}Cp;kg:NmMʜ_97a #>od8~$ӭS9%eT [|>\ 3vXq?TF_YDW:/x,eq!inD5TTga?+⢣BA3YΟ;fP,Xe]:C |[^b= χW~(><^.u#+I,6m%!ٖ?꣨xpugªQ?RB_] .pާR}Uh7DU6زXBY5Ϩ*5W|&>w2! .à\\4ْ,X0kSO_g\Qս)y+v#mk1`FUӾ?u|z`QT fA'uEY~M/QyVUa1Ǫrwշ2낙`F-ﱧ,RD_pĿhAf"Tj\8ˬ;{߿f (>DJ`F*ʪ)*4`Q4fՅ38}>eP9XYYl:M[ Af"|"Dmksz $MfnƝ5TTg޳g $`&v5/,=TUR]~&L7Li+<{z*I7ڨBDr)fx!Dc2d0ݞ?/AA+}ک}?3Nśnp4 =(A fFg_:qYSϙ~yĪ;m6.>Cw֓LE `&~Uٸk3fw- fVdFojJoԝ6741#sLc[Ƿ.'YZ*;zlU yp2R[۵nLo=z72! ͅk   `AA `0   `AAӁ)a u00nn(QBLځڼ&.YV)W2Ƌͬ{i`d3&N5v fɥ53)~6,#3|Jg?f3^q920Y1: |R:)'"#_P/|SَaiN*BAOb;I<po{ksS+''%Mŋ3:IYzZ{"$3)$W6=G|1&De?4f<|Ωs6uxnc)Lruf %aچ fCQH.j/I . r_fs[[`&ą? 27#rinj-OzUf3 w}xL t3y@F Ar l,ls;G9%&yNAGڃ7$hk{^c0dE:ؘl]e EkgMf`oìL:G "m*"ͻuo]&Lr< ˜e$*dž"_%Shg9qeq*~1rpt`&XLX޾6fL#\Y:V" 2ps4%(~H>i8/"l枏#\XհA*|DlΦUsfĕ{X}vj/KԢ\U=r:^GسCsvCyO0PTB&yYh+&,1Ie *)M)1YBK/Wܼ0"rn!OdI{2. b)KҪxj[iS.5{h0PKY@f6Y+C[V a<\yqX3"^W%)D!9EG5e֕tn4:cgYw>ꓔ`ZWǟL*Xg85L$6Ws-{b ڤ4͛x'ל7B(f%QRrˏsf1M yC !sf (v fJLHOΞI^Li(OaATK/W@ 2?gSYG\;Dl[DqxEl-^i ׂ*J1e`ύ߸ս*,CE3nn7\y':e1Rs/Oe6xai'y !~v֖,S SS`K&3R b29Y[b3 S&sV`#i0Kt`օ i#Oœifi ‡F%2c- u!0WUS|SxELCR\FQ]$Y6\:UEWY`+Q@zd)Θ=߀L.9D_gBV3~o0P%JA<5-E DZl'z$gGBD:`Vf[<$ѾRt2f1>{ȿs>2I|_2hGS&ar ~u00dK.cxԚ`&. ,?qF..af6[${EQ71Uff5rş3s3aZf?v^MMEޒ(3E%&t?̬F%xa>Y&ɑ!S#CuB>)YeV3cٰ qw`w!5h)ᕬ"g!\IDc$`_74-}L bY,IM(K"1;P6fF 5QTbB⾊e14XYoer޼-W=>~/qdYl4u񯄯TM'ؖkgGyoef J0#yhbISx+󵠥ei1 >PeƲxfFRT[h&xBh/&:U?9dED>H-}{[P&V&'3ˍcie0<3gU?JlcȫO+:g†tkD`&&u㽍rd k_de[ ʱnD0HGWD3~8z;&`֜f8uEؐE>w 6Ud V&BmyM "_+5~gkdDf_sycn]FEv:KW=_uGRf.Qk.Ma ^ r|ͣk50ApQ`5ϼkS̄;X0YffV.Ioc_;K6%(.ҤC1YZyGf $w,fb2Ϗ)$:ݎmfaZ5F}nJ5t`wODn^%9j^l_dN4#`\ 9_=-CqP.5UClmf͊X:+يd;6kL E%6'~qyV_(΂Md/ڂen0."c'ﲶ,K;g"Nd2;:hHR e_ۆ<4g̃s*QZ3doK\ k`վYL|ژi]H!xS)>Foe`3 `΂fRಜ,#v@F9J#TkÎi4ukf3 !Z sfQZ!$^a#OG336a2^0f, Bl Bf3 ,f Վ `0CHbCH`0k0 0ܡ 03f!zd'.%~a/EfO5/.#>S 7V.5ͨyC]Do-Sӕ0=229[|,"RK>/zkBar5X]bmnѲq3e{ȱ{+(\?}{uy5Kr޺l3pg'0^Nן<N̉=~=sIXeS\j?ZNiײuZ뚶 TbҍY {Z>peKRRYWMdlQqW|4Y%KyMAzT<$2мvEsGyYG3Kdnu|q4ܷե{?G T3eBMrI_֔/+Xp~U]q;~klIaH[h]^GH ˵ /(/~RA3/D/\ν\Iu#6+0靭)z~9F؈2ՔW9ȩrrI747㪶ԓqKB_$j)yd`E]4\\4JL|IH@s:QQP$k50`+;ITBağڭ kkLj4FNL ~-ۥ{wo-JيN7G]He.ddUF*++kKQ8wx/,X+8;c59\yIlUd}۽jy/n>qȐͮ .I.&7PJ}ȖN6R}Au%>U4t9$& *ɒ@J\26*JTxFoTk`A(`W;|oueԱѺZoOM!mUSxIk7 Z/];cF\x 7*v"X+DYu`~Gܬ98+i^qbMb EшLg+3C>cvzVBC~p(LB/ytPOl$nlwAQ RNw-r&AZE. H0k$3Pw̶"$-yYG3Nழ.4 sV҆?-~hYMnEhjђƘtsԍF6zCb\C;ϙG?I2M}d@< brzM6X=ʉƍ(v1b@ r{gfȧ=ȔĶ,u%6K䊪}W#rYk 0G/EJl"dQfIfGEMjD Tk`jAD;)R-M9Tixx˺MCf~=zpz1IgEHܼ ggr'⽠K" ~|BϞ}}Fȫ,eћ:k(3kJWtҜ-WN`eU7)6UI{ǩ,;l_+gZO^qGt#Y6P9#ŠIl˶F]mA2EU|a7j_T0l}񞻑5" H6`&2diTyIZ3|AAD3AA3     `AA `AA `0  `0  `0AA0AA0    fAfAfmfEIv'7c|>ooJs釼U2z\Nj7C n]T]MseYr-ed_ğ<~RO]R)vC>|s̞ C9)8z?l4F] CW_}ʐJm/:Zwמ$5W6}(^C^|!q=fAga}rvR$]wwSˆN{hjjy;6QR ľ[) Lf۪?HWd{|?Jqp=T6=S(u'Y3NYz7Z_ՙY_ZoerC/zhϛ4".n:PƏ{#0L2Svf*K ]•}:"9lt$4Hr{ r3 !}>X;f~qYϲc5t%GM|R3}ns{ϸTTE/:5{#XLf+ϪEXM:ܧv6}podA+Xblqy'u^`F vE!U>:ee՛ =0Qaui3 Ś}|{/kJ~˘%+Wfֺ%)nΝ>^ĕ5Q}\;L*"[nN(UV;qIdx/v/q7$PLBHv: 5f3N)ݺtS9^PEQK"zλ,AN7V`0G W*rE!qiOŷ@xbF?itGnf_vl֡p(V+*(5J|vk@U-X[kJwx TT Q}d;[/*fuyٶvrRyI$Dz`EcNNf7edlr)PwWkݻtl_pE!q-k_QGn`Vu BᦜW.7`Pߞ\Y)iU5Ŕ(9R`V/$ne:zaǾQ 8VuݥWnTMQ>zW3`ږnF{yaH.\,4=nNi3E=)/y, ^+N W6]CZTݎV"f틊xly] mZƥ U0Ɂd$cNNf!zd'&{vG2a=E7bH/ IxX:>^azdd7os N'7XxF8˽wHĉ91دg}{#뽌~K$,>B`0$^O6;\t{G{=,rm~l A/ʋ3.o Q\'f)r&So4w?ؕN 2McA*K= rFv؊M%Quv@2"[nf(F#CV;qD;cFz9SI'~=: Nia)?5[ Vq׎]iCcȮd-x!Qι-vX5B[7\6 V &UVV^Po4~÷{>noE&]qvk,rfIpǤ{aP% :&X/<%l~56/=8o2dnrI)V v:I7#^싊xDo]omqLRN}$]7D0D`VuIg MNuh2h]Gk|An <YQh۷Stus/nT{_r/xL[3f"B=33fWaO򃃈I{+F :QDm*vӹY{RD$5W6{ibm.?ʲwH^E}{`_jT-iG%\r]D mZMK ]0#=Tإ15f2twuOz]6iI ҼGhr-bExT{C[5P~oeYvϺ˵:t *OUD]\8eQJLTH={OXSAkQUfYlono)QR׮q{u>('8Nea tv)4hnjSTj{t}{+~:iΖ+%Q?Qbk$n<Т=|8rU|a7j_T0l}񞻑xԵ`IZUٳϰuwyUmDv_IT[%0mj;.kD*L\HdvJ;a&` AAP `AA `0  `0  `0AA0AA0    fAfAf3 f3 f3AA3AA3YۃYQM[qm!ox9fO`42$.*Ih\57 R͕JSOmU0DAaxg}_p?ZKݶ i0TIGK)I9lh}S_{3=DEaKڦ?{: aj#Iu$I=:>qһzB}к++q=_?U7Ai49CAED!gy]0u,}j0>ݽɋj~vtN)b{e=N~z*ޯ#}ʘ2LQ[25& /\\OF?est搾0޸m_1QNB檹Ir${cv&>Q>7N9`gWKO \uU俯ѻ+~uD\(0{lJ3Q$ _ɍu:6kP+ܶjM>5?㴩{&+ ZQׂd: Nڂ3&97\03fTUWbIWfu}-pуufDU$ |^IkcekLx]z& s1[\5j|K uŬR,3bZq3u5K17lu/7rn5N:ïH'Us$H=WcqfbWKUU5L$WqIDCcThG̴U+CLTXe]QQXټݕ?}BveT HJonIvÏN'n]IpS/u"(!98DseqNfrʸYWׂYev$sYb&Wȱ9}k0?ŭ|twAB+Els3х;GJb"U \Csvo%xU]‚ Kc yR3in5m ွrt%l+5vTQb;`ijd7 0d`{^_Ff&?gYkݻtl_pET*څCNG5֜t,og\ͼ[G/7ǪPyr]nx缞;\eѯD6]-n٪b?{)WLT$ʹjFU.fo5GQ>fTPE[G U  f!4 庣^/f|k(oxwb\/0|V(|76:jݰ`8R/= ɣ M Y.*.[ݼLeXZZ/jW`Ɖ91دg}{#뽌~K==JCi*s=`!'MfA׬m.awyr\I8ѺgX:%6o<8jݰ`ֹe4ٱ[]9K}k^sxg";YvlA\>#5{~ٹB,hދj 7cR /ȟ}JY_ W7ZuEƶ+[h]ʽ+;QLB+dZ'WQI^Oly&xd& SOJ G4\?BЋL'4BTiFEEKfw)yd`E]4N+L$I?6ІGM6: Nia)Qݺ~gX^;Ft$eLK뉳" U{-ޚu@܀RQZ4~ob2Meh2*Ct5NQLB$VDcqGᶤfꪙ"ι-#=J ̚(QMÉ?=M^Tu[|?Tak^FEEKf펛vql$I[t&%vf/0`VuIg MNu!2h]G?e}j|An qx^NJqj/`V' Qb|/a܍;(vio5n(a1W&AAJ3AA3     `AA `AA `0  `0  `0AA0AA0    fAfAfmfEIv'7c|>ooJs釼U2z\Nj7C nͧv'|B^}g,;`[m/޻Ǭc?L0|_n?r-e엇#*]Ӑu{H%E!U2)8z?4F] CW_}ڐ˼cVDIeSG+3xڳ96?kzza *"G^㻻)_^aUsg$i}I9$r=M]l`<%E%y$&ui`|dJD{4LNf8gh=>Wgg}eh]dϿF{A>o׃hrʇuqԁ4~kj Q!@R#ΘqRgVUҕY}h]k_&Z9FZױ^UZ3@&7[?%{%SQZ+g3n Veמ'_kW֠%WqؚoiV s1[\IN![6k{`P%+_N?QD*2(*CLTXe]J'|{/<않1_󨋊Wfֺ%,+nΝ>bbWd[\I%$ {PUHtyJy/v/q7$POc0#7JHwj^"1 yug8q'tMLzA{ٯF 1!2n(s2{SͺսxoIv>=ݻ]cPKuTs̽k=' aS%^5Dz5Vd|ܬk~-+OqZ~^ujAjEEn?ŭv Nal) (IDj7.kUJyMVQT" yut0a/#3dKɇg<ȺL"* (kA]˺UAXPۮ]WD VTQEE Ez 5$ LS 3d8OHPv^#r}xŌ|EnlܧvϑȢ,:s1GϽ/m/Ɗ$J\ I6S=ICUk,x֚% CcnX U̼I -2 $ʐ̓<8+ LӖkkH%A2P-B^ǣne1>}x䴾ڞ7\(ћ'(]sVA$G$A+9q^J$f;.jB{eziMԁH j;!sjzc'k(|N:< ڭ*Sccd'\^c=GchI:ɈIJd82Ĩ1eUq'7dF{Ql OTrkpwhĸE탕N<,(};|Jwsʈ=I,17t1o$Mo]厸մ0Nk[B¸-<*٩va]^E%t-Y+o-*l{-<9ow+fhf5ѕSu`T<#O+C)6LgǶkg7Y;v^H!21C5#bE7 o[X]gT "7孇lDrYUoB=D(bw5 x@4NꎗP wש\][&ڸŲS'giVX{Um!aݖB-HF]خݺ]^E%bŬU7ƃqhQ'Gd}[@̾S1;`K$,y 3nvn9/$d=ٟ˩qŌM:$e.[zkb/WM2z>֝B!٧j% 圬 yGW9I{+d5tH$^#K7vozG Iȡ'٤vAs&4`81vX*mNn;GE^Kl 2R LH%\W܌dJ'z!k5Lޖר=A€N2>"H6 |9RflSN̚ (kehߪˎDdRN۪ՍU-g} $x_?j[:ŷB2!19]{ }էnr/a]ɞRD X'גHTe=qUjb^u>XԎ|iub+*IXH¢4 a(<1Frpn'׻eu:kk:])BqLx"ĸk>\{YH~cE9f Jc>\MC2[( 3ڳ{TF@ز ڸ0"Vv(޸Wi*NR.HK>FT햾Ν [,L}gϿ"J/k9Ѱ,w`dLCvXCϲʫloط3T%A{8^$#蘹!4ړHZffzcM%Qp8(W'^\-,H!0ŌqP I.*x{D!EߌYejl엜𓋇inCn]!>N=?q9eB>X#cQBZBG3fxgȑr< *D}CXw VЂ jfh]5J>n^N3Vv}d2c I#g{=awt!] t,94ޯG)aޮ4;Z~Z5ߦv'$|P@[%*e3f_<~Y0{GZ[GD2nbtیueCuJ=3WBm 0.X>-D.DaNDBQu%$ʈ=I,>#~۶k(bVmցHP3]Y?{X;9~_Auز.OČ[e#i{{YcH)Z:.7 T3ͳ7gtRwT$z@z"z$$(5F,H%0<1򛡩xb;Uw )ԛT-h@TGH TN&(Ř(,IDH= p37$&To5HĪyVevj=՝/՛s`"=etffŇX8 ug28Xm{_f͹5 ȨO5LHa+z)Zmk^aNBCW 5E2.zB., [FҲ%0Ōsj)9Y֎8`}U 9yO??G]DG{,iוOTB#LTBsHMr%l(I7Kl6%jR{CR_KcηA~N1M'>653)'Wml+3߷cq*ǞgѯZv+ND6|w0Xps^C7[I{~A$VlW_CYEы''$&U[EYsCcHc50OHB(%0ŌS[ɾklHڽF8mFJ`7E]0W'uޯym5ZWB>12"娸0>xhv>iT T0v kNKH8V}XdeWFtQ1fX)UמD$V#)ZDجĽF =p*@9^r7 g bVyYoC4m(ʵ3K I?djq8ޑs~Y1ӵ}Ւ c%{kܱ̠ǢRTܑ+'უn3 O:+]UVH=*v,Nw,utR$#VK]#R0v )}-$<+>A~&.;I;mbcvrFId!)l; G$(=Opy6 8l(f3 NoqivN*erŒ[EἽj !G,UQQ/:w6t$1l7rɓC](6rNVsOvgCen=q3́ylCuҕrGE{UysH̃Z KTw kuI>$<+ 11cžDAT6=p2V,yRQN׵/c&۞@P2r_c{(/S&8¸mIXCϲʫloط3T冬7hO"#jmz!Z9dkK0$ǝCz7$,5F}s/9% '$ 5|z{~|ex#hqNj CTDj*%⌘׺U+v պëdښ7]Ђ jIA ިw+|ܦBi"fwZFreAS_etΌMzg}u^7rE4ޯG)aޮ4;Z폓ܥVmI;l>lD/pO~YpKZ[jL;yXg&J}֥'0ۮ:c~f@THA3{X|0M1v u1*;jMv_bSZzǤԌvDJ=B늦:lYy^`~1C˺ūlYпp>洍S'46j.3:;^ЭOdJDo[XxgT6n9Ή4ԛעiA t8g  \.\al/0*=W-mo!P-|(I]o]a.l;^{8`% y1Ŭ*.@u~=-+2 y^wDOVu#ٞjcXLM75bUώnH4%ScFnV|؉C; Y7Sն' [KQjӍW_ sB=jg9ި.-.#Srq(ŽyO??G]DG{1Y$ w13ޚVdT?pJ;*6aIY/N1b[އ'DR Lh/K5WxVCaO,f47>5gY)'WmlmOIuڨߺj)S} R}R('Y뤮y݊х  ܭ=N٤vAO9c55wm?I-2($/*:~>sokb%0ڽMvvƞ_H= TTNBI0F%tj`B{Yw$ f f fbbb f f fbbb f f fbbb f f任5ꧯm0xhߘ١{\Ft )k0q.a581M!/Ǘ Be:D-}wua}:khq;B^Kl[ eJ/$Og )'ͮNy{݈>zzMfzD#RᄎBŰ@-.Sw]}\'Ҡ/=$`IuY=\|)9WeTC·e3* \˲fw?([I\Z5>&$lfy(EҶ9 ]F$q{1c^|V]{|Z hy$a'\Pj $Μ)wp f'u\܍IbU|/?}:̺K'{kHAd"$v\ԭP]:ŷBW?Kݲ |5 0EE ]fcQP)K"Q8VlF%0oeG"2ym$.f-nӵ6U~-ݨ<~bĚ:3֧]k7bO" Io(0`[\݉|U<="Ai|ڧϳiHa z1CO۶k7 /N {}!sf(WWh7rCe!$4k?=*×w뉯qDuҕrGE{'~3<-S] K//`H]6jP\Ĭ!G,UQQwDulŖnT;#XSbZ܁H[Dei *nO"G,mP->1cWpV#;NYXs}4W%&_)3E?>r?HIUw՟{\BBק6Φ/9QRr^QqK4܇y5r*BҽTm}}u#gxQJ;QҨvź1c%놨i _tA߬v,CDwG$q;3J }׽;wӒz+9q^J$fhD9KW_Ԟ B1S~`N;K N9MBB2}z{~&e ,XRqHF+V"gЫ.;0 wO紽TXW-GsRρS$}HS{)"QRvY C]ɊܐFIvD-M3psQIZ1"/u f߳An} =ը@zh۴S>)H̸c Le0~ @PqFm[E_.mmwC6vR}.ܦEJ=3WBXBsrHmW1G?3ef*#$܃70JT^W"Bx+0aOD$jͨ0Օ?W0oAu<$ԁ}bVmցHP3]Y?ź{X;9~_Umuز.OMŬnq^n{ogz"z$ ~`'2D ZC$'DyӹEyacr3svoE8_OoCNܱU M}9r44DZ!Ie3*u%bVsG93:;^*BOl#xSbYU[]"4`y@nc3lGϽ/ɺ.#񘭮.#Srq(aT6jU`R3`*VRԵt׼œPOfXҍJ'BG${3tS[sCu扃U+k2Qbĥ ܭ=AO}K CvB[0DE7[I3@i6O?t BS!'ɾklHڽF8mF~HVlFպ(fTlW_CYEы=`G%]1:"I,u f[ f fbb f fb#و]РA A 4h@@@̠A 4h f fРA 4333hРA 4hРA 4hРAbÊ޼uZVƈ~[:߫W˃Y V8vw[Wf{,̪bo Yp*@rr/5Bo)#71r5#(/bZ\L/M)108i["g%f! `~[:KQWm)ڰ$`=u߾o*|wK{W|Jb*Ky#Ě;#fSL6ZRHJϤQ6"ԱfRb  mZEtj֓B#W1//fta)+.d\yK61iBmcΕ\OgUAb1r16;QҙH&dKVYP.Ĕo?P۹hIbX)GE^|yV`l^ci夵b㈙ѱrG՞;/{CgY4#vFQyϗ[Kyn*'f>"E HERfa㊬Ґ"/pG cF $[|7y<#BeF5eFEޞk&Z[MxZ(Gb5lK<\z~1%5@+K"b|4hq|h]zKg,m)?Br~1a1۝w<e#'8UfT̪StF_PaYh{ T"7ҏZFtk>4f#cl^0)I%K`sz+Rĵ+M/WeV.vnT{RV --llIh5UUu4g4EH'GOŰ%x)ShвInT= ΏA~`13*f#Uq,+g* ȊqΕ˯|;)AL=߆0I\bsṴE..,CNl` *|\M}hz zQbݸLnsmXF-թ(bTjg'kH^VLuոu},9 f?Y/ft,ODج7-a!l4^=!mXEGQ  x0WQlr¾Q5l)e0c1rIG2bߐR?#> 5¿wB]VT7Ѱ6-I%nID^<%΀[/s eA$^W [ǜ fi]N;+fgʢ(q˗f( *%9ЫUd%4 kqOfs99+W/~~/UQS`WfSQs=%Й>RudnF-y^E?vIJ6c&qy,marA~e(*M-մc{K5pqWEeV5n]1:Vp3tD 11[7Q7nOPE5|'+;- nt!|ob-x.QbzcM%Q$ ΡJ=ZO\T#M>dDY^d:Y碮bYV"Gj.yN!T$.11W7An} =|ٍvU@ MQ(M{9>룙BV ɽj3g/eE_.mmw+KBRLaPb0.g̾x+0aFO1*,Öv},˴I;h2bOH|O@@Mhf5ѕuG)NÖu'|j$f:.7>=fl(G2K"Ђ DzQ^AA47Afh껅5LagTėxaYb1XcLQ7)c}Pji7~58_Oo&uΕhʯ8wg^Gƭn2$ ' A̾S1;`K$,m%`OT3ЕULzvd루ZzE[(G%xoCDP6 u74)+ə4F|K/W f f&t[sOQu扃U+k2iqY3ڽMog fO`n1ʦ~ ܿjo]U;1tX}>V j!bU$C"i^]YBO}K TF1{' SQR:egc@@d111 333@@111 33 4hРA343333@@@@1111 3333@@@@11cnA ,5ɈA|GHbb f f fb f fb f fb f fb f f fbbN b f fbb;5 f fbb f fSbN bf^&Z 7tpY7a-ج|zt7.9xᆃ Ml&XjLx:r2lfk0;OplE֪4w. a3b='L=_̬c-]rB o bbbb&[ϩ֓w܎N-,KO|p3+S5"4bhbfi񢴲1u7S*O4nV-`CO+PޗѲGU̐`"jɹtr:vV L8Wc}F?~/\Hz#F4ߕV b3K3;;3yIq7yCŌ{);3 f f f fX,fˮ _RrL;Kmٴ׻ƛ-+Di_r76d2}/-ah4pPQokTO络fQ̘OOnr2OLwml3y'1˼0bRԅd<O+TԭNPQoK=}r ĬpX72ub 7Wq:*1cW7dE [Xw_ScuwϘ ]/IIZ_Pq o45{>fa=;+89oϬMĬٌ#fhm/TŞ[9Q5S2.9hL̘ )Owg[+Pz^8 zeKiֈ=rQ|ss,߫ 2k"f_%!\&pޘwp$4F!kPY"rX+򇫭Pʆ{0ZbyE滃y`(<33[pV<9 rMbw֫͘9đ9VQ|Ń֯^uELbM a3δ0hJ_,1ŌՖƏE ^ot<0U3f܁qF6#F|lNۂarjwL] 0cnS*Za’!q酕Ԭ+-Ś)vަ-.v^+3;o{ )|bYVz0bJ86Z^Sb {[3333젅7;g }_h}=A̘7WYL=G~+oH%b1vIbČ}1'5WEwM_>'Oחr^Em^v }[3333?\u%0:>\v1N'3n*f7;43)9f{_UPTJEa.>;J>5taefZ5\D Y̤UәB(fXR^f}3G86h)<]]N~䄋l7Ǽ'ǗFaTtAy 5w {[fծ OA~61/&=ueq몪܆W1;3jz s-MGNr^~5^ fU) ^k;HwYRdVC*ЊKZYOtt?p埙+nf/&H3)ɷWN1ulT>~ӵK'Z^}i Z#fܧp<;qx6VN 6}fx[z؝Oq f?qI!+ݭLJ/[6́c &uZ1 f f fphVT:k띏7pQb *h f fL=Q_7Ql Xz)&\bb-9&f;cvY"mW7q^)ir>bbbf_\G=6D-S^yڛ8n6|Whqz 1113/!T.S{ՒӎG4_8\zbb(^~nwH=>{S?˅YL}{0g&i f f |d![|h㴁=Y~h}33c`:G،NV$w͙jeaehŷuϙe=vٶumM@gVOf~iv,ua6fڃ9MksK]Z[Zx|9*u 2vmFӏ$0|LH:Hd.ͫ{_c[|_g|*Kʭ`!(J)rVY b&kb6~ >@mb(1eۧ9&93'vGѫ- /11143Y|=]R}\Mo 1P·>g(Zι-WђPunͥ튪h͓;XoLhy/|Wl3| q̨u#ՆU@@@]m}k1~[fzLbf=T7ʟry.ߚd3s:e^5 #Nx?ͭGt.mӾzdolji=evd/+C6U3|]`}<~Wd󋓴7'ze ]Scg9sAa+&pp^! %ũ]GNpAi#YwBbfXMi['{U HΕŶyBb4.ehmgb2p̔y/ED;|cfXXO\ꇺ-1.9hLU VQuHcxٺm|͎*ų"ws<ߎ^iJ;ڰ nYcc@1?&Yx8IAdF̾0KBٹM2Nh'"dN(Њ-cV?@bfn 偫̧J`E"j޳1=qA '@QFWk~(5;))k\m gL,x>:cYVc (+HYC1bѡ^o)چWK=HǩܮXǻӽ6bbbSIc}^e wM}GIַ伊A;?xya% zLF a3δ0hJl'#V[ x_،g(xp 57]z=¶M:bE^+x )zvLI&y{b,7LV㼧;LEEVŖ6⽗M-G WdE$Y@A^Vtnحabm(M[5ow:Y ٗ\@0."Z֗3 7+"7[+;lw=* f f f fmBg:|ћ5ޔBi~~(ny=Jϯp{MsޤCɂq1'5w.a7;nfin'TvkL3gU7^[(f3dƯ{˘Yw;Z,I  ̝Y -[e9u0y;[Y-:yH޵oh9Q!KhɃ5C7|SxK۰ Y[)0zQMUBPh2E>ɂ ǯ1_x]`9 f2 fl4UlfUݑR#ZmKSyHgR̄?+Tie?ie(fܧ=\f6Ɏ}cʨ#sXFg||ңؔ삂A l͗0{+f]oe'=f5lK]|[է۽}Ccr rRr^雉{w]aDRuݞW=PN6_*-N%۸ Yf'QS nn\6g~[rpYo}6zܲ!˯弃gDyKߠlgjV711(=`(%)6ƶs6ʯj }")F]6:$F1cWEknhg@S/?x3G. q=Μ4i*[GCN543~#Os|z؝OP6-3Wgs33S]>p';$uuEbeV3$UĊ_9}ͬ 뾭ІU@@@@Zųυnc&{^(0N|< Ylw$ Byա&}J=7:y'(4qoT}{ ~|ζ|צlj f0 8J0zͽ < f f f?áo<:cnrΞMQ,)kt߷l%Kb1!DhAQ4Ɗ^AKt^{g.L"\`ys88ޙgq;XTAKˋݍkc?f(gu\y'/: H:\}nSR`pXxn}wՇYk.#3Œ08[,UoFLRWѫ u>ٸMAֶ>f8l 3kT y)zLkֹ:8nj=ff< ^/+X'''R7͙zM-VfjØf_J7faa65ϺSJo1rHSRfi/CԈd\W^+}!ԃQ*C#aFf@fClHO`"7󔄙HYEY]HffaF0c"?VJC{%3 3Œ0#{_OᱭgW29~Z\Œ0#̀0#3¬&ozfeٕz¬;K.%faaFf4#EoLasGjj 3Œ0Œ00klnXhmm{=LoJ9aJӚko3Œ0Œ00T:jI E{ɓ0 gUx50I.</n\"3Œ0Œ001ܹXw ZaW"n]7$:7󍯴.9Q[DffP3A\mܖfك_oJo7Ya9Ov63Œ0Œ0a&vV>b# 0mu-*n·N%z>zA}Ǘfaafa־ "f0g|  -qSy]Fu]tI|CfaFY@ vdn I*Th u-YL@gĭG?U ُY/0Rߋ1fa֯a m 4¬wlmmϙ[1 LgmOtHZi/}Ysϸ%3L0KN|wW-A/>0jow"zqWGzf_B F;\b¬o-f` δJB|˵ ^\j_hf*+\#;׻/"z>fB6kY OaZcs/Bf"e;_&u-a.&JTpd %a7Y8rzݗ&fa6xL24~x`l Ұ2144ӱEV8zTN < @fmoBL0 Af]}k[Tp+6 qCއf=y%IXBzAZF=bK-.}ە -Vf5 c7& G0S+o$E'D(nqkTՄafa&4uʤs#uQ}G/o2njsza/`<ˤϖVp.@?_fje*ŝX_'V>oFf*$ e x&x&okaҷ;4ZZ^˕^'2ሼxy0{kwNmmGxLJ;{!f҃,)&2z b5 3+3AbpfŦTLa!W&mXqYw[y.y_ =¬Yzs>3CM ZaF7f*N\{gLlJPxl !d]!V:^WbgC(s?%HpO3$3¬3bKw)TiYRfHɑ^YS=o|E_:>~NSPSxJ3r3=ZaFjpE'ʴ3 [Rgi>|zںzLtly4GځܾOa7$[zWgDvUO`HYM\Œ0#z<홴zPzewʼiih>_2xSkۧ7joƀl ][Ś#tk_ f 3BS 1 3Œ00(m\{{DJWˤd4k\tKACyWB3:U5a%i7 -~)fO7iCM{Ǘe*RKb%y/|0kkk.8[Ziv \t~e)&g1Dta.3 Q"ϿK?`NS)SuڼDe R}wgh3e5a*|L^ꙩ<4%o#Fpss0+9 iOn!/m f^[~:I4[Tn}}ˀV*tveI;FyأLX|Ӂ+ʶ\MkvG$֚֜Yq2#eg9HlPimlKU)a8YߨM=ޝϬO7&l z0BTXD]+ctqKN%>/1편If0A2XTv.v2ӽJqm3HӖ}rjV[xq0Fهv{5D*SE*; )2ⶋv_UTYK[ +v}}AƫMٽpĥMvĕʢ[|PJ\֐qI[kŶN0#zύ7ywWYŦJ 6|aRDt۽Gw|Ƴ(k OG))& VܪS1Eg2xHlVwҊ~}>#'o gu|C0ux^oh0봃GU)Z}E뮔iʀJ4gWm u+3E5V/H:8*^cz)ӻPkձU3fwٝקz̟LgRKjNg09ߦe^E-1J9b|)Se⮳T7;aFs͛7OsńYGoniͬ_H(|5sϸYGnNpo,9~8"jrY\J}a2a \C_ߤk*]Ϯ12_dtn k=G@X%٠ 3"`ԅSTӜ.N]rӾX$NQs~3$g~G0\Qbǽ1_엋·M;ZxpUE*};L)J>w˗/rl«kuafavadɒ`G W ;:?hHh ꜽ?JgЌ'mv D{}s{->N,~mֈS4Ɔɦ:8گ7gHP_asHu5&*t2}Xe7Wv\D j]Iٳs801\)8cfuf'3^d 1q鴚:7xZH+.GզS!:]qquOW&y|Ʒ엳i 8tsOT_~ٹZ]-di3*~8FiìtYe-{vHfyқ36,>OYPi4)G?4`WӾQK:WP#MEd,+켜[Zo{~u=?8?'} ]gB2X1eηR3ߟv>^\mzW'Lz?&vYY^/:L]|yĹ;Cw-aFYF |||Feccy?L'xb1,>/srf:Vu:Qqbď?y~J$ؖo;u'6O6_qrջ.?_s 0OWׯܴmme?{B<_NiNJy3&Ϛ,e+L2qC'\?_y[)NotS?bÛ>q2ieM &M_y:S}ۜ0#,}a0jخ:-j+[pŒ0#6,>?XLvURil 3Y|'3Œ0#0S50#30S+%3 o#FpssNٳg8gurrIII/Ҹq&Lߣϝ;G_"SR[#G?j̣X⩧z4 7pwwO]u ȼkO?Xݻw˼u]Տ0CŒ0;hii˓so644* 'otq5̛fR+Wy􀀀fJ2wL@^;O< av2{]' W^^.FQF_կ~}VViJZU*fِ7C988 ?O>-yԩ3f0yb%m2nQ L2֭[O> av2{]' g600Pկcx픲JVXj@fCsu.ŋ7n/⫯+n߾?cӟ e4?C~ '8qB2|ҥK/f2{]' gWɿu}@V>| WVU%ƪTbPV)p#39{l.ZdH}mmm111Æ <1?Ϝ9oZa-u"Z@^ ȿ jjj . yY1(/+.2(?GU T(ɪN +r|x~~[N)++']'OK[`\^M+ヨ烁G{g {=f2{]' 'p˖-3"uY1\$$D \~]lE=?|Ro9RTT2>b$L,X@ fw.wd^p瞓qAկ~<`0#p 3 3 x Œ0 0#p 3 3 x Œ0n[DD @YRffaFaFffaFaFffaFaF!""""""0CDDD$3DDDD 0# 3DDDDŒ0CDDD$ 3 0CDDD$3DDDDŒ 3 0#0# 3  3 0#0# 3  3 0#0# 3 0CDDD$3DDDD 0# 3DDDDŒ0CDDD$ 3 0CDDD$3DDDDŒ0CDDDŒ0CDDD$3DDD$3DDDDŒ0CDDDŒ0CDDD$3DDD$3DDDDŒ0CDDDŒ0CDDD$3DDDD 0# 3DDDDŒ0CDDD$ 36S5 endstream endobj 196 0 obj << /Type /XObject /Subtype /Image /Width 819 /Height 656 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 4036 /Filter /FlateDecode >> stream xsya :vJ $ `# 69N]'L'_ΤnʹNOkoIdbx7lAz ^j4Ш/l'ybme;4GyfИY_择Rˎ&h[ͣl`j4ڝgH4-&0Q/q-5C^j;Q6񬉣D3+T'LKKssKKKk CBMY+&0arBiooOE:19((0lvT׳Yj әLIt'tYfm93b`B.l6]8ΨT{[j3$'LLg6.R NlgMbˆ &],GQዮ@_TʅIMukY+#w{}#cD~<>^ {l#hlm5#bRш)=kKׯ߸V6EWƍ\x 'J|6ZmdkYit{NFxupOw.3;VW]PLw9MwwLp̬dv!֑ ŔǯQ@O>VM;V^3e!Jg/1$h,,ҏLXI<{@3f6H&~T?!ֲS$A扣+}]ј~4{cfm/^2]ȥ?8E_?w̆ٺ=Lpe!(?tٙJ_.ZfVK&R0dF't$Ν:wn6:eٮRpe gHkɬnfu%eށщΐD¹rd^646gH|q{ G&c&lf&L,efu$/ݸ|`֍_)?215{(_<cd:2{$C’3N&S\`& I_pÅj2O?+d2Byw=gH|Bd>U KՐh12o۶A2W=3$Qc+l;RAɐdn-l*TgW)|ΐd%qHJ3\_2MkLK%sZ2MMfN2$-OfWskG̞8C޾v!Nc?2[KM2Hf$G2=!Lxx1%dvGC2fH%sՐX%S9,̻ l2LP}lj0&,zW&v$?Z}?=Lx̄lpt3$Q~~ʹ&ٶM$13v{|_o7h,}|/_Ϯ^zJO&I6by`d/]Xxև~#!?_ŧk9ydznݽ0x3 c786}t ח}t>O>nÇ||޿wͷ_;񙉁^VW2f֞z';ˋ7Yu;w޽!;wnߺ;o߸xWN=3w7۾mLx2=~ً.^[ZZzGK._p226?3\Wwpl̑gNWϝ?ŋ/Aøx…=K/psLVKTKCf%꘩5uc6Rophdtl2>F]262<_-LG[]zLT: ROo%rT,tsL: Y3lWxϴh:C5]݅BX zqDWX,B/!PLm8dɬ6}h鈪r| M׹\6# 9SO2f&DUӑNg2Nh> stream xڝXYs6~%LLKNnZ;iL"!1I<8؅xX' ,ǷZ˵=::9S+uȏFNV7zg,|V"M_,еE݋r4q$^kVo >L跫Vkg,ĺ;++\"џG.kᎵIڄ.I>D#,X朙IIhu h;"5Qڮ)MKۢyרlBJ4DYʆy/s#gjIf8>]xϢڕ1RR{m@RFZ:]'{`0$Y;O8$ t&$/:(LIZff;}usݍ17=»}pfޚ_: @YR{ݽ\:~w_륬#JRP`J洰#2ahF|QJ]c Vz>2G`HJv[R1´JA#9W3oVE]T}EQfh{`\l%3ѷk iB D'cMX_ LLoF86A?R,d鄾?E ڢYxD1XO_B" G)>C Je.+^ncQDRJ y45.׉kt1!#0!p1TI!9젔ɠMvQ{X#eԪ +oxN.gy00D^l^o3ac> cJ ]J&]g̣2$e)EG 2,\eF}i.gh !P.0ɋLpڷ[/(a@,KM!Q GI{N 账AZ8FXhA.=t*$Y*yoD_Y44W0i6hgoyn"; @Yp^Jݱr^ q[S/ DUQ2Rk8 0>]%u0'b&N0#`";5E@f3l;Z~]]Q#u5W䰏 l+E._4 .n9vfd Y-V%{n uCQ("@"7`Z}J<15 oo~Mh j:t)~,7-_K`c$dtNP, SMG˓:N?]t?w]\ }~;{KjT6 'Pm&hGz?;=8* 2EI~DQg'y0S9Ȫ}Q-jlRo 6w8 V m XDeغ:jsбQAj AsC\ DmȖTtY@X4EMf30-~ 2Uw"cIu{"ky`#7>4E'N$GuS L=(Xקb_:a&@6[Oݯ=xYF4yݯ45OpC5S~R; Ƭ7/]!kIxxӫ3%U`O%?=e;3Unmo V8Fc_p#Y\J6<9KD[uVCr&PɆC_\<7;bF5l)A3}j bsjtur endstream endobj 145 0 obj << /Type /ObjStm /N 100 /First 872 /Length 2275 /Filter /FlateDecode >> stream xYmSF_1w? :ۺPkrP)atK_O%!K.UWW0{z^$T` 홐 ÙYTN`Jt;Lo4ha,3V1O4Y#G(feJ%ĭfAOA.èB`XK*hQRH8Ez0D_s0A *=ip(ݒCL =&&,ZrIТg0ZjR{%L@  m }"h8$DL)-G>ŔV&#H,@q x= "ib+-zd-jC! #9g(A4X8E tYK HuB$ܫ,`]䁸z _jO%=)DhO(H#% I'FRqf8xR Gi @BK(5%G Z K q?ڀ FI"<C92Z`tq-1:h."DH" n4#M B8!%"G#YˣT6sJ(}_5g{ĥò(1QwgJUhQNyNXz=K󛚸Bcs0qŽ+8(Wr1ɫc74{[ްL""f uٛQޱJ%q ?6Q`'-6fcUxH\=z8N;horu@h'|X9 bPmPH%gn@BZJ$2 ^)-."VKUPEQ~3>Jy6iUβyVg 9-Χ(E5/byu/tT:?Ol2"/WrvI%Mz˦cKa@ J>ABK('>󮴷wS‹o ^𺧭1yLƋ^% YBrBs< m~_i4tVL4WU6Y]ߊ&\>J4e%&m'196vyu\o,):C|NeY<Ŋoj|a4׎p4i{qo.k^@I9@/== U&Qn῱32cQ/el{YUf lտ˫_rOgvcӇQͪ%2e6Ƣ]\F{T++GЭmr/hڬ枦Vt0M+_U;h&nZg-A-j9wɪ{8Xn;aqKh۪ίxhPxPxY1չjDdiWb'}ihn3tz+hwSMDv:zH}=q"}!^tE#!Lȵuihm'?E_vҔ{_9l*"t(؇QF8GSwD7qq JM`%ӓCƯQ"D ZjZhU4G+iR/v=/ƕ΅aB2*At@v?9MS-0ڢ01m>HpUk+&W媈TOΕ3;[ovx nA6tZvA}]l 2z V)9mohaޭ}L7WQ-zh9bF\54_ID UݟV7x"VW endstream endobj 272 0 obj << /Length1 1385 /Length2 5981 /Length3 0 /Length 6931 /Filter /FlateDecode >> stream xڍxTTk6 ]H HKt00 )%]! J H   qk}ߚ羯&N(G ez&V HM/;)9 G!e c650 C!8$) b@_@,@ wnP4)*dd~ݡp c\؊0`xȊ"(Og~!0P'ϑ`wDH.po {BX"/0x@B?ODp`0r#Hg  4tE0!FQx7;bZ4`CC<94mVG:ݡH gjpO(~ ANc8yy!wj0X6g( wP_~__f A( ;4bH`o( o?W  p$ٱf({p_ K?;[,ÜPH_G,lb&g8UTPa1$$RR1_H ]>ղ?QXB|P^@g gH `w8\/ Vz(Z@KWrWƪAe0o;:1߬m77 5D?0( _> nاK_.(VC~MLBbt"3@T`C0'σbP> #G~'Vl-P_(tap}y^#~pe;&j ZQ.Q]чSs,}< ]*9~ ewB1;OH=YlF`oÛj1wq_W|fe7zZf(=`+w>ZŌXݡJ26}O8Scn5GE:}5Lt9GSsoqxT$NU+ғ8J#y v${59뫆^5٫%1'߻|jcE5%E! wHZqDA>;{ Jw9^$C|v2H6]!=!cfxq+@Mk5zCHxTvΑިG6$ˮmW꒘zר{ę`||ÎnM9k%IDsqBSצ[8$VCf(h>V=Y|H>U>]:xoiчDF_=Dňt ]yocn&.UC TӖ߻SySrC5"&g:xK.gxӷ|:hqF %Uǘ u;OZ={_šOlnnzm7VyWE @C;_F|F/G&,Vo,*\6! XXcl\i[A ^Si0<}5o[cf,z^fy)ݨ,j(7 pg {r^z/~5 Q4&EBfMc|y;j]9w{ކrio"˪pV}iNϾ6eOm>_kBD1d/?0KFCl)kV6d,dӖ:ikA}%~013nW},$6Oɳr% =2nd~ MZ)~rjïLI9aз%>c%Ɔ\-m?^w%ߘ.q{"LB Ge}7Z "] g' nulVɫv7' ^Xu\!{w @1'd=ɝ<S:)ǧ odl_cֶJPCƎ[Rъ>석<7W{DN8"=5CM&5~yi> K*.`OSo$z7Z攍a3B `ڸqSS2G|&Pgqi[u|m泇+0g7MʛzRƾOLou#bԮ The6z<UMbiUy#y]?uYhc+bo# H,v-F1k}¸lC=441[҃=% N?\LC݇62-{:”|iY{Ѫ{e(62q Qf:"$Bc炎d}95OFxg͆HIQIB9E\ThčNQŨ[Jx$Q83ՠt|{ h)Db{tcqqNNr},uHꨰbg fxv:>BDN Oc{ZdZSz)(rz6 Vmݘ=p mEm?`c167n K*\`i)ZL= e`){Ka3[V`lY ;O'Nqd FO.*8Z.7/XTf['A~<0kڙFݗ;Bq{юҦ@}+MX/!ݲY_$#`Sfw C.ecJne6ާ :{( =tV8lyfQ,{TqGC+c9ɓNGe6o{;#l'LGKDHPa՗i-LtkeA곓k8].0U)B(Cc,Χ ۟ڥԧϣ0cKqisUL҃ܣ5zE]'!_lO>aѺ \C^C^˻!WG[,qnGĊbLյs|܋,TeF칢@o lKJz'O6Egx\_1 {$᧲dΠ؝e bc)ɗSuzI0Ts,РfꉆGa5yTd{~ϵM]_?5骞^;iSCAoڑ3Օ8ͺSCdtgDݹaAἚB5>rvGF VuN[uChU|p'lF9g7"4|VIq'?9om*Ok6>yjJmZ h 2f"}ĥQ*CKmȜYoa2|GXРJiμK=FV|USiɭ+7꠹ۼoI)ÈP鋹(RyTGޫ=':Kz3⊯+lZ0Q{_OOI`&Gr=$̒6QpU[Nô8 rvIxe)bC t0 zWbK-275"'_ZFrcˑ["#H6,Q̓9l3TD:hkl*bM !b6% B,UtZ?VʐKI{ˬk%i]58UY Ì) eT!qStQ{[hC %NLp# 2N_AyОdqdIi('] )e֎j8s;ō,~L8S3J4H#rU! فղ=HހLg+aA2F%!χw뚮S}p-u1(O[Yg3[t{R1^v9iޛ0qDϪǒ|9s!.H h])זs'SNGTfoS'Eɭ >$Kk.POU ls }~}f2Gh) ˩Ќ5~0/;+degOԉ3sHyD;^IuI˧T=j:DLϣ`9|J>R^{{q /;v$Ck9ӵbWH7m]: \xKx4MD,>T6+X}$y? ɵ[~J?VzЧ%7 8(UMl? Pz)XةkcN&gfǑ@z%ok}f1f $}2.m}G|=hGy2y#?u%"_>Sok磻1nzd-JJPg3}#1~n}mQgbM^s:t/31]}[w[FOOL4$&f"o&吵{":w c#.w֡bzPt¡!CeĦZAѯ_rRY? 7<|S[Vesf~~6îMcV]!e FlhجUr[0ZQ_`i{`J&X)4;m{GGNo}1|.Bjy9tޤc~; (|''<8/ܨO~>9L:%zKg_M!hg~%;7!`8@fnΈWwLXuS2H \\_1V) c #A4$ƦD!͘XѦB:ǁeYWӄ V  >LČ{mCĚϞ/zؑ>[Mۊ[9~CgeH{k@eTDIBmY/AY?om endstream endobj 275 0 obj << /Length1 1612 /Length2 9568 /Length3 0 /Length 10389 /Filter /FlateDecode >> stream xڭveTݒ5'xw  w'xtC8-w[pw \ y߹sgo?3G]j9iߨCL0C3urTXՀNg#-hA&0@h޽CH@ݠ K+ASM埖?!Sx3A`3boÞ!׉@ fXl e]Y%&@BMl*N 3 v2, PlӚ#3#h4=]̀\,{  9,&` `lfd!{(9 q9AA0sUIy¬L`j;s9OKa02A&nϵ졠h89d-M@Ggg?gֽ_ِ`Czi{m YY>g 1g&hƮ=0Tfo"ENJ&v x~a 7؁l M# 3yY6 Gi+\3X>O/&ϊ5L+'ǿ4@f6?+gή,o_Q*4쟉g+:sA~NOC`8yV4AA98j?<})ϮL_?n3'(Yտns8@+ mqb&` "D/txl+3~V7&m`'-}G3'jƮ\UV>?v"#u$=^#jO/ZB_2P;cy%DaV u\ wm2gE y%ICj~!?8|T.Gd;Jh4<@m~M: +Q&*C9']8]q1 0:FCah\7Efxhwe'Jصx5{ \/9ƻOA+ڳsBLة%6˻s KS4. &{@BΛuώ ;fk e'9H 'a؇ 7*hѻ҈B?_k0HuX;s8R&Q5+4Ed%.tQ%Vy]|ƻsBe"R s=Z@1cqųa(G݅ےɜ'? =;oeX+Rlkpܘ])"NMe{F2OIHس#^EIHwkqx)dEt2{6TeH+U>xU-O \ nV0[l*ygD}-PrX.ONu i@ PCʘZNKy[dhzBMCߐwěˊqs|UVH{M%xqCԢFZ+4y5K4TO؃}7f >2}Nﴒr࿈3q ʬ'#o}h㚮kߛMGRds죕Q@"xt}[F_ZYF'G |i. mM3R~՚mK.T_G%&#>J=EAv\(RǤ^.х/>!f9i%f"^{ S\5ėv]a@7jEHqR@JÇ36=o ;@fJ0W8zy6%l0s*D<lOZ["|>>fj#P.޽L4W/gsKa sï^~u.+e\&Lm_JpoyY㷵;17Ӎ yֳc}^<ǮwQnZ_+Kqn_Soq/ڡ#\[|Z2 y3g]Rz}78!ҵ_7!CUU7frZb")qŹ*%{HPBS$)O4\СU|doPu *$[4՚B*dc#?{+q%׾w!!,mM~-N*L[w]DQTՎTiEB`]-flISn7.ޠYpʦTKAH^u|KMq_pP9#'wAxkS/y&oQsnJKv f 2$.@kոX? =r˕I6Q{W񸛰kl9;D`LO; 0( !Ie$%5ai[ʕ>8eO?>XmfD`̕Բed#j+O@&`bԺDn);H)P 'h\M>fۛm!ﺼ Bg 29*9jYE}`R7lbf1f%vET}>~2!ŋK 諸~1 HA&c݇jIнi\:x_`;HSHWUrY4Yߝ^+ a`Aj1PCbgnG-$*0=o\H"=R?=jT7bu v0DdCWp( E/oG/t)xaark xV+Mez(yƂW6G2p+ݽՄbrG#.(5J6#4 ^:;]ܐE˴LgFcdc Iï ;~Gq!^$5-:%lPқ` y<97R<Z8 0M(e ]R)/UC9W'}RMZl<J4T2ְ'/o8vcvngD!7!ݸ: M?u+w>++w=f"(M6LdS(h~x0u3H$r3RДuTsj~-L)y[E &o/82sBWD?c XHLQ(y3YQ-Od8|.K@#fFh+Ґ[ͣ  h2t}X9 ˟5ڵuOut{O +2̢NY䮹/-J2| fNU6*2aiHMʱ")\7[/C'ť=~-f$ٓ0͑Wv+W}7PNJI1*(%:LP<8Ȯw}oa֟κ|ΉJMxgOH--CvUZ~ _6-8r 9Q/A_[eYͧͼ# +?kf ;r;PB nӷ0~Z}gI 2r'X<Y0/Z6Qد >ûrEOeڹTBh\f@?ZbOҤX05es\6$Ēyp8:I_zI[BKrӬswjL#ŕo#WUƝ*tW8@07#]u^o~W EG?o&%w/Dyܣ%^Q 3 0@b&~ !ԥ&)d2iZ3jT.aK 3Kv]AJyJpGH=VSMV#dqHߏ#vzHB~I/ByHnr ܗ҆lh&j!b<ܮߝT`u'D-q'ZWq+ՋjhN/s]˔*fv&P~ZXR#?0axU83agE25# 8)?m_'ͪbZOh 6;YYOxJ>L=ڧ1|5%2Wk t,$[ gEY`{nOhTʻ D 1ԑ7T /1{=ynnQNx+۹ZptQܩ>؏d Afb7/9#A24ֳށ%zTQnF!.%E_tD&vG[C5œ }_vlF_Fd|΢@&s>+Bjuho ny[?VD !aMwd4e)Ȫ?Gui aSN+HqMB$\2]7k#;+"ᡈ+j>ė vB=w[BOG"O ԹERph+BcH4h_+h_fބMRFh+ [d$vkf+Zz* $xW·*uWO"*΂j竭jhA)u7Ƭm=6W)gGmlo7ɉ0N:} Vs5Α' J[E}*Ki `9wN# :uXy"}Wr+bJ._Ņ/qcɖIU֫NՈȽ\dq91utYMxGG`]_2՗ڕ^C[=Դ_Ċ1]їm_2! ^L *^>@'ke{;Y{ Z ԩpw{ !0IPF,⺰7ݕ5ws@vC7Qe5XS"+9نT'UJ3&'ۑbDڑ=eG1 pߦ7%&LN Qudr!ڬ2+7 vjeP?[殖r L_ i}ox]?Q n?Meُaȣǩ1Pl~\3{8A?ƟXYcB[Mdy">**h9u [_NdXI* 1sÔ%Vw< Ǔ~2))oy Y ۖcѪҀMޖFЅ6i=j z Bw| odS~e*:(ˑxKYmQa8:X+O_^0j*N0ڪ㑵? ج }FYO|8 7|&l^b:F=|&xQX]zSc|Mj[cG[m&̛&7WJ?Psz:IժoR"HOLfFx j#0Qgݝa$9b+#ſ]TߐSYᕯN_3v+{)OJ?&ʆY]cZ~=^:Jz/đXϼ32Ny􎓋Q݇H}tZrRJT;~6. .`RuCcfyWa}1`<oΐ2 3 e`de;~em1hX|9zxx?Er`lGjI4=j:iioFic WߗO~Cb.r7NE9zݡ)zL4 R{Xߠgֺ^-gEOy!>%%HR&ƽ{w#+ՇCDKB4f)lMU1H}%o_2JA:`6CN}G-kap?Dz)W(GUmUeAQĆ{PtH*fDy!19lXmi2eqXz~RN H79[ɲ%Q/בccʛk԰I%{BCTd2" % 3Z. t׻X&bcα?(m4(= 4N#ҘF\0TSd]%U±vi,Õ?VmN63ْ_7HD|czS7JT?ZmY Icύ1VsA˥% p/V]{(vLiZJkت aꝉ]Zyg2řT BQ9ق$s&qSf"Φ 3QQ<{7p.b|\8EMVG?WHn}u+Zm1'~|S]r"N nԿ Ω:ɍ9o2¶w=~_<ڽwX|nyך(?i t 8!C4%s"c#l "бOROrzuka(m_/Ć aA׺A\З-IBtfR4kf颠̞Ns]nބ^E(7ryI tz6ZzAo[}5@.!;tzw2DF3c=dNYqKVԙFRZY 8Lá_9־'T]hSҙe-hskfS4BJ!S#SAu?1 r[=-s6lAV5+$gl n:toɶDFS\4\gC}k,BGb*`!ɒev㟉zb:j7CD$j dHCMEϩ'Co+ЭtNx ھ;~P^:@iMީT[}~@SYϼ^I(x)? .=>7|m;\D)δIh*\J9RC#>p?\@!;Ih!ꩭǯlt!q=.vYӥ#DB3syהae+8^,-c-daF%eXק[UmT>%ACыbeղ9ll[R,tH-swkyIZ{ݻci|B#!3&nkQi gD R_}̠% JQ^6PX Y#TKvϯ,*]MOoflJOnYȅҦ?TZࣻA/ SG r /פ-Ftv?xNPqߟ])_~Z' 6B)ߣ0u Pg/Bc;[VkEQJwL_-$e,Apc)~7\I /3{rwHlñ'ϓW;nGz#$r)S8G s츾vERMNm 1m<,.D IWvT;&bֳ }2m_8/ Mź#(A)ȏjn8s}v<[;Er:opiw[uIXݰͼ1|,P.d9_;^u 2mJo'qs4朱nlO; Θyn~ԋH W,zoDq=Nnio`Rz`9H־eAtWEEGڑg~Sf)Z,νZl}Ӳ]g߂ G,a9MݾJH.O[*[KZz))O٭T{8W2D06Mf/n;DGJ_u!ӣZ ,=dL7F2Hs07'CEe3p#7G}5qHjNgUn4>l0j$b|I-h,cUx}Z\4E:@/{ՋcJvV$EГ$NV\X b "~l3?"3(t^7,_>|kem 37xxa iGts]0>>qyxHM5\.G}A&`юK/setc?M߸=ɮ~}[V֤.TLS˼"S!R:]ܡiW|ru{tth7wvPg`AXsW˿~`>;3aB20YuhU\g{#1\bX d$:BU4.ɩ8PvXEspD2<C&38LqDyka8lcЩ$-S,mZ-bq|?dW[XI,/h&]fO֟Kᕦhp W߰;Ҡ` H`@k- .rA7+m ۉjw\ؚ# כ]m0FFCW9Go }߰y̹rP:|m^ZŠW l<U{T3 endstream endobj 277 0 obj << /Length1 1608 /Length2 10387 /Length3 0 /Length 11213 /Filter /FlateDecode >> stream xڭteTݒ5NpC@h\!$ ]?̝u5s kfH[9BV k6Gʬ> [_5oZ^m`ok`{!_uA`?ȻAb&;+?`WJ fi 6vm iw,<<Ӳ[Aj:ob7ӿnӿTwvz#u(;Z/ G/G^. ;ccsY0|+_`!V͉9mMѿ_[y{A /%򂣥`ȇ/ncR=]NEuZ*;#̞BY'^O:SAH}cӶ2g~x1 gdS0)|B hrAc 26  :6oxp {)'FМ/"w'K@vR8e}5j5ܾ8q0feߜ!Y{ncH0s0`רSSl"؂-".Y!AO(N"$ͧnd}\TGO6zDO-]qxQιq4֝Ee653{uA[XY}FUZӶg56DwD6^ǭVL B`L0h̋լ#K p!ٖ:c,w |tkM*yenA9&WA$^q1ThCtޜ)'yE''o9b]9_0al#a{ L#Wц^j?RE4umB/Qf Uà5rv;%wpT5"+!r#FRK%p(k4wPǨAn_~r8ܢT= \A-j_&`!șk#Y}H/"ׯg5P2-l$d*7se)YЕЮku,P*=lF2SQL#A܉CtT~|Ϣ,"c'1=zMlz_V ؔD_D2Dݭϑp܌$OJ&N9b"3Yn*zvӏXz#F})"'ZWs >ElE~B諪/ - bZɩU? ]].tA R).틩3r5-&Qhe\%`T-d-?pnaơH=`Ȇҭ.?Sb) u 8~? ?}MJUr9*RjB# \1r՛̂.T\f~V@umP.l]A.D!x.XyرUa2,|e~P 7kj5 /*IeG16Yx`+iU<ᬫbwE?8X+oHŮKu$]:0:ʊ,ҙ)g([0 uyɎ]vu$8t#A?>s,X&RE3$-wKժ?PlR*.Z/?"A񛤢sH}d)=ίqTxq=qwKCgcr֯&q}$k `hệB} Q9d%Md C+u"F_ bnog~np-nQ21mlz#؛ML5‡Ac8d¾ ] 21* odtZ'=ĥK=Gq0f8Brވfg{IF$&Uz}(ۼSL6NCm7zi܍S)zp MۻgSoIT ]Z/Jc)pњ46~$>LU_i칻jvV;4?0Ù1IvM_#!8B -ѠNS"ӰzbTBtDk)R͙a!8/V-}y<{ɱ|kL9LqZVLsbZéǏ}ǟF J&j}Bָ 0nYgzq.q 9E{m#9ʃk J.Dxdy e'"r `iBu!릋{2r /,~|?yZ(PኼtAӥw s:پUf1`B1bFO x[@Ӊ(BG nl ٬rHpGAˌ>5}YmX<eWpUKK:M<9dqv-תɷNpdGTϺ'gvk^ymdNj1шF1BʵAʖRse13)ʀz q76wiXPvs>J1yKXf6ur!B`{w$BW'<_|-M*✘$x{X-1@t;aE]9bbSgDmvRtg+R໇'Of,Z{ y{v6ܧpd$=,t/%ع`/]ۻ<^m-fxf Hz9=U.Sok `}ua⏾pt+2ݱ,ZX⿰];8 0:Dp%vL$rt^(+eNEJ?lB)GS:jʴ693BV  kKo58>GKeZW #nCU_r1*͇9X2'5ZMET;Yu!pU~i*y߷ṿCH<<8C|_daRu.Uh,xD ]0@;ͱ%{cPU" zyVB0h;ߑ2.k6UEk`%os}ËM(/Oθ}qΨ2>untֶ$ ϲ6* 굢'bgM‡ðzgp _n|usGX^65*lW_~6>}|$@30{N4+AZ&+LtH52HQ^U_ `.+ԀlI$Z2h(_}Hk Q5zU a4Xb ~9wR6մ>4}w$ysBaMEk*ؗlLR"AO(EzSkE~߰R"7gDs&ڬ&ӡa;[Ljtߛ*x{N5ՋmK7CA&7sf,V^h*VD.P햹$cS֑Hb8i6Sٺtz38̾ZJpf)Dh!@羔nwu ڋ /V&힃yhZn) C16'NNmne5wJ*J[ӯ%+iT$CJEuIS*?C_K5#[Un0(Dr@D3;^xg#Ӊͳ]$'^8$ElL/F ޺ \LH,=yl [_eׅςOl.0ipNO&D|gh)1]N*bkQ<[Ҡ%KG_0ld$*2hK";d)d }J9Z( &'Rv Vq2fKIv4LaNA ]ͱ*m1T.xV>q-A,I j?Q|.nTST bA0}4F6`v KFx}ano$8 #Axjjiލ&F}eC#$WSrH/]9=TglqC! b|ͥt}5ˈʉS2dM)x&kVg] @Wͭ x8ScP\jXX?G4PlN>ўf (yq jԚ3?<&44x 4ki|ʪNp?87:'#.s>jS7* ec- GԉPh(7c?/*#aBs0N1El+-wf:?\k!h=Rެ:&bR[D=Dѱ@&+;+l,6=ߌz,[i>"z_WQ"ŎH\CKPvjT4jMh;k~Cke65Z@S&DJ=v6ڼ_rh%6X#c8] TI#v.t yY`"fZQ¯}~x}g##0dӛ=jhr^{ ~21@-6,S'geT; XY4k5fwD5'uڜQ>wC̱Q#qtI[fgn~%f ԞތbSvN0pGq$ ,mXl 3)KX=Kܛԥ\wq͙s #;m|n":Ok>T).?Eu݆99O+Ib:Q|3LMXӍ`pW=:Ox֢8^:W2D?ru^.Ӓ$Ct߁B%d 4}>aK6K\ %-^"Wo- 9G*+Qفn{O3.%{@SM'rq#'G㋏B0bsDԡZ𗔸+.bj]옞䀲XY}v*;d -6)ʤ>'~a;6!}CCcK}<[wҴJql}F(ˡ[ȢyOob}盭q;Vv e|R9v~GQS}V/36DH"@5 &GPYVJ8CGkڮHma'6! u;}k5$54%B5/ i*?XXُZ>O$e*GG`bZԭǞ+;1(*ձRqz 532ݹuV͵z)6} 9#{ak!oޭva /-/i3\BXcL.|BOA c?SGSqѴ[>UֻrHϐ0z?V#F`@V/ki[&u!iÀasSkťzJƶzuFtO,%gǖvϱb玛Vm?s5 aH6'٢/TCfpςh&g O[XF*Y|M)PrbΜ>@S.׌B5pۣT<#9@<7!oUaLjڨ "wx р/wyr20R-6Bqhژ'lyD*ԝeHP!bKt+|H+K&N\|jrYE=1ouvFTňeurC•FGШ2PC#feK!k#}L[%e*u6P6r& !& >A/_dFf+j=!bnZM?Wwy)HҬf\j>C(LLCRt2G?Lm""ۃa"uN\ӜxXq%q}tB4kj^-78V\=Mޘqnz@B|ũtD+N|פmmR OYw},וZ:!2wEF_Ndi ^'`eo0ň@h%xSD U"<+h~V UD"ُL^I= ݿ8X\hӯaJ-῱:xsMBo!G L*fwʡEl:HrS5O"R={,JXGt4ģwTg&Cܹ'): E䶔ʃ*"xi[u鑛[$L;G 豔l_7zI]lklc< nars+Vk+?cdDꇓ53/ѼЅOއwڛĹa ~\kJV[2;Un㵙?!yVnܖ>@"Hlpu_ȉ%|٠feL 5v(K(p~lͥRvn1~pQW얉Wzse@R2IDx!Ƀ6602T]ֽMLVצgy~df<9_puɍsh+ra1:9o2aUA\di Q8r[ճ.+F%^Bls|j) @BaEQnG7fR6#ƢBT?iBC,T_R5'5wT/;]@T &stR)bߠgFl~fp񏠏uiޔbힷD{q>]ڒmx`KI͟i4ŧPzcA%Аl E/O+o8ץI#*L$1Gg^+9 A[K֦>F Tc&:A=rGT 1 " is锺`hw8,H&/^6YHrѨ!"$ۑWP g.6Н.ZOGtЁcX̡0?١E~YBqYm˨%YfΤxJjQaԜkִ%/P'IE\x|ə"$ f߂C8&NJهg"xVx] *&3R'T]~*U1B[ ڤnCTr7O h.p?E/v+0PU3Q?H0 /f諪jW{HUg!Dwkn(۪xl!k (ޣODV.䂆7moA੮e{d\ֹ52O5]0uI> stream xuseX\M-4 hq 5[sg~3}ΏS֮VP(ۛ$!0 +;?@lgfgQY:^@.tu0_ !  n P08@v~v^~.˚P~2lgP@P[0䅒7sA`j`*jrXTYP @o0u'9-!ڗ L/R R_&[`ll&ɂ1 b.no_3CAf/Ml -[2wv`ӀA27B7f 99 G̊I_ `ab[^~N&. C`3dr VA+`7;+;;˅ClhbɉH1gd|pr8E?M"XQY B߆eO%E{ Iٹ_j!lkwhҹ@W& 7ۺ/3P td`&`3Qv̕03Rwf,@.pV`3}S 17C,j@E9C/^so~)r/ڛ YTrpk\=;@b}խH`SB!obp|p HW>6Vw8߽#:bTN-ϗFw21YY^үYw'JҶ>*!_1d;&ndu1q*aqNKjLuJxG:8>w2|ɦۻ`xZ`D&%]|M@0%o'`J:6A?;" 1>4rQME,"t4146ooqai6Use`hE]nckF N׾*>EȾKFͨ+/[*5hi1ط2&# toL!-rUC7|~*}γԜ"d\)BNlk: S=m܍#v)=9և ܪњ3QΌ =V}jKFe--?~sWhfK_OaRۗ۶L+&:#ЏX1,HM*w՜ƲŦBÊt5qkuv!+jEW](Vܶ"WCFo&Wƒ>6Y 2w(w]CQ"GjLB=q԰0=QN1~1KYUƔ&^L8Wv UwzW8kSFp̐o_~=).Ws#OYKC)3YEV̑ %> ~%;^\\cNl3_3VRG79Nlnnd`RE-i{V,(}!KNQpPn]#/T;u|wls>ʤk)8LyDTtvex,SaV? 5NF,]*v[7e]xF ]Y/|U‰ R":H"e}߃={*lp`sίEͯ" XU\::x-̿:FX Om AK%:N}pxp'vzw0~**zvO% MLRkHPGxuqMƝd4o#-^4˄&o[@dWAȫ 0{} E"-I9sR Ua~Ů88%.;˺)FlT3KK^k͌}55<:Ј2"j]snqiTCeYлv0`un%Rq_)JL|8p{yRE4K>+[r|EvI|6֜R4P{Ƙ/L@rqTCoʠ=8Lv7RŤAoC[\F GMD]iKww̱\?B2 ;p DSZJ{bůL:*/zT9ݺ8E_Kmś+ST[A55=[i(eۣ]~5Ř9A:D"e]UAh5ieb OP6d:[5\-IlNWb G=mI-e?U 6u|EQ3vJs_nRjpafks0 ݓ" S45>iVQi݁6w.̄[-n5If s%ww8pj?{uc=tJ_:J I\ӑ%Bk{E%nž1>b[$3/x)㽴"l&h4Y,w>ي8H*wZbtRKs^oR3?8Q-e,طOqm-_A"ƒq2kа[t8resӸZxYGƒ!~sȝx>/M}8@Qew #m]'9tJŭ0gEu8OyҌboÎZo(9L">$%D2E27 ^}K %|<^,K֦h<{iisXM8P|4#Nm/ysҲ.YWܵܦ}@305Owr{r}5l9iwʺPW Q{o@P:X.(I^]V| *\eU[bqW@״NgO > 2P; ,HU!^>rҸxo5 lmgE9ϿvDtmr<̎[f&!z]ln.2Q_8dkk%D5ʙ(Z}Ms*aѿ@-#I?UmjZ6- וMߌl֓D? z[f0p}a\D.iR@Ř걄L(zgFM ߓWvQx";g+mS{IL(u,jcaP"wds=5i@>1n6#N4(2 SĮ=" oϸQlE[fNj9ɨuKM .aOW~PQEWGlS|$th`~hAԕCгx%OxYʜP0U0]㌺5.W0XjG5ޢ!a>&X84R@Ⱟ< ,2p։Fڝ{I]c";tD 6uj,:2W <_Q+ĔT'lzsPg\/qj~|5c<2n6QLJ%S7Yy@*+[{h@|9ܘ)\ԂY"K+"J.A5,"]W(]Zէ"H?v[s!LRt] 2FXL-ڒ3 ՠи&B@;//TIG!!I $ptf?̔Y}X%6>N~o=}9%c1+|3KIΔ`VؚD4|-zpsS1ĿʺHbkh'GlkfP&a;2NoAw͟ݟ=?E,"Q PODMi%#%<>I <:E=Vn,֎㙕&C}#iE0<7DU"*Î\@IHSeEk.b| rϼg9SUyf}io&$,0sz{w[muOUB[o&44עC%-нSf=>RInPO 唗eMŎl'R"̹x*w3I諨1']?^yX)?g 7 *dÇ%VC3Jɠ u),~x;{έqFف}a*8Ƹ3gvziz땎6 -KPL{)f56]`lHcVq>tϦG EdOr7s][>D %,Ci57{'P~It~++(DOh8ѫItcVw™FzK%ٴ![  &F}5|x|ʟd&²<Y/baOys9ZDx aV`7ձŒY2y4^tF$o{l: bA/鍊Z1k\‚.zҨw1P>zKwq&4\QeҧXWMUno-!:dy uݼ9Q ̥s Y\{T&>tیmQ\)Q#  ; qLJx87 $ueSPG wB̴}3Vj3g۝#ce)??4_v$#Qo[uE(>a\]}#Pibfc=}̂r@Ι/x7H%L}EO  Sjdf-='UX"c_}jGeJCt:bY~CG"O3ڈEf=eL0;wV7-v_8w\Vnǻ4q -2[~kb?0NB0inW.,az/t&!\thpTa`a&1idzf=dsn2 ME@lł@"m=xѨu; "F6EH38CANi:HsMoS-=_icG-jq|,K9_$u1Oڸ.Lwq)kIP|vu\v&Q"dvp**VGWlkr|Dj8ם޴h.H4Nw"Na-b`D 'u!z;.XiemڍXEu. (|<JZ_J.  o#/&d,$G!"G%[' pݨp^J}{&yb5?%Ζ|1j÷_i > stream xmSyRO_ \#wH"X2H  $@D&eFA"ՙ'B EevSRP:G\ܔUU~!(4 f :Bc`)h4f K6c8sDݔ (QAA8!("HPf6kN$7 Px7gA`wwoz[[V٢^voo';kiItI+KH8A cqu>,ң9d4ܒaw13;rN$=&;pJJWqxD}5& Qsh\R.̺i`E4UU.~혡DK^j{m~6nU*N~mQʄ*.m([`u@OoDݘxxʧ.D6exeq8͖՛5|N'rœ04A2d:!k^f6X ӈбs @s9?R6a;_A`=4$N J5:)?Y@ڵ#heנғ+j29Ihw*%1}y[/H0=4zuKK׃qYMr^9CcpdSjDtexd?K_1/k~K:| .B=F]FY|Ur|^0:-/'$iXߣ=q*}q#߳7vDw^ܥn {e,\GGYNkR75, /J _~]ȧpq褔Е chbɽY̤Gufu?7=bй(RtCz jP"Ăudsl,|.Xxky1wpg~Ge۞ S pƻ)΃ ٽFqEIBK4YL]FP̯)o+t*1glexb-9gP 9!4 p}.+ ~G٠RYC;.}e}W|HOc.mt39GM5m ɒ].ۏn}wel}'eSbYMw@ ^äa} ƻ2ܸa]]FXʱU ]u\,yy++juxȉ1Ji*@!6Qs%x a;(W9gftB‚TRR!Ӭ~\ļ㛳6I.f[㻶)c fs߯YЖ3Pўp2iձT<9/lTn,nDaZvL*\8Ƒuw-HZq M> stream xڭc%ܶ%YiڙYi[m۶mTڶm۶m;+;oy?v^c9\+b&!S750qaȘ[8;*ZrHHYIHmm9F!cC## hk`nj WVP/?!hnj /u1`bne S(DmrV)sCcGc ?9w ;X;:0w:8-&"d`7/oU9!t2w_7o?-IdO-cEPMg:'^_ٶ_̝Lh4t[]10nl?}.?;C񗄾;NoIʴ}"7H"OK>'3)?+E+?UV?}NGocWzZE݌̝ &V/_]5R = -m.cWW?< NJvVm[7' +;KP_@ uwr0wh훞_F蟵Qtҷ1i!ڲ!WEjFS-Ff/p]IRa_moj.GGM0m4Wҹh/YOu71E_>iQN \څj͢+ޤN8t Kg;xÔh@ȵ /dc#C=w`}8TٿH1|  \쀔ǜ4$i㌚ӥM(}3hjTkNDA[b ޔc{_@CǎgYj$*k[M{Qπh@K%ݘc<Yf |Xd>x ҏ"΀9B8@=VoG ׋AD 7v8cNfsJr{n"=rSTpb=|lpTϞ[@CcL/m'=Vl}s|bN.IQ]| W0>ѿ sMPrn4!t%[g90гI FRRsRRiD)ޥe͗rO63pd#pJge 2#.-i;ZX}H+Q!{2Õhq榅<ŘttbSf[kb-Ei+Tu핓ߞ7h!b;L`mz&ymNw4b㚼2ckvLDa&v+ x3"(uLzFR*ǭӋi_Imߙ p ]\9Ts1fWc)J\-py)k^ֱ(ӝ9fەv> r2=)BBlek2}jՃ,'|~cy=LVIN1s.9)Xu#<0O |bk$:ԋcao`pdiLI!m .VN=\>KkE~Z%x,D l +B"T$Z5g "4&ƲU' ׫׺<Ş;-xwM85fUqT]I>I~uBۘ\ǎ1yg< wUR@d/xRȻOoM <33!xTw)&kfryfɐqesugN6.;? b^t<.'*T|04*:Ieƹ w"v OY̟NٗvN撵Nr6?6Y!qF}*؟MHlلmv6'Z혐  d-g]9,QlYҧ\$; q+ذ*iWOJp4ؤPRD̈́PRVvh Dzy1uwÙ&mJO1~2˘j;GKv^OwMT9p7FU4$'GrYc0_NrDx!wf9ᖳ%v1EڴiW/[ȟ=MR3B tgK-@˰@Dgv6܁ VkS~[8ZYAm_#aw.BɤmTK2 85֍~|`yPj#_D!X//ϛHv1]p %_'H߇&IݟQJރ ,w-mڿɥ0BR_ h VQhlRлoZW͊Iiwo 5ShtCY (L xlȚ^I Jρ {ѪZO )c_bpU#[|R_ȻtL؅e |&Y[X;c@p%"i[%WL֑ ԟrTkU|JIcNF_5!=v!akcLj$8gu-ki:}{x}Ƴ_Wt뢲QM/3yIP . Uܲ}ougu`ƅ;Rz[R6_d+gnM|șZͬU &`8aƫ75"`.-%.m^tmweFkdf8~ 6ħexVyc I Л)V8I=ѝDO>Yb QyG Pv1XU3>0!7bWe"NTcgezN<%\E=d q<6Jj`%O!ER!O26e">yg҉ $TqxRLgXb-) %""qad5""mW쾔]2nfݶ9q7Z`ݼMuL-(M6eu1YJLY3 b6}m{䣃-Რwȧ.9^݆n8ֈkp n"S(:w8L#{U!V[[:p'x`Y.ʒi4!ֽ23+zLRHfn~[IEī+S )ldx&+fbsجN˄Ѩk2V\0r:ǯdZ2fjH-P6c0hb6vIf+i!rfl훹x;"j덨\n]nrcD>-fC C=s͞ 65Xi-_d AȚ?IR^wndb`>]"+u5 C .0jg54 CIᚙ\6A!W??|6~vMHՆ:3H-KdNTϑ\Cw xM%=\Kɳ˿\Z{ORZ"Ӵ8O桾Ť=iiU?jt0 V-! Of']w''`pey+4m 5W{Amhźsw JӇ+vlm ʼ<4 ٶ!dCЛܥ6|S&F o[Ғ.. 6Xi:0"B f마iLlB85b9ўX{xtE~.D^#lky϶|Ƭe䚻Fj4L7)s@|/ 7:#)ZR" 3}Op׆ DhфA)哂R01^Q>۠t5 їƘ61^9fJ;WNW9k{E6oiaJ*PUZyXL؟+4P~_n%?ztU 2hJ" ťwO AǙIp6n%KKPz]JYcRit/,~ai]սV ,=}DYo;z#lI6Z*|MHUGِrX#M5m*'6kVzYqLXjAbc2; I4q;t9qԲ(8$?乤^Zp?QD /}=(YeA9xEL*Y@&趣@ųm[bXa -5MZ`Ў&pV=Lh6ꎓq!F"'࣭#]bpqԹ0p-98SU\}vGpț-L2#{|$8sNN >ch$0 H /T4jЂք.kyt%Xv*(.aj}$Ii?xad\'M[\B_xTZ"s3s٠wG^~̫HN=E{ntc=%F;:j^>Uo:swk VWic+WsIݑzz3L"дdžF ~'ZBhTʥ xF(,[,,cVyCkzho0d/66KL6OIܫ>O v?{}z}[%4k" :bl y%Krр6fbXwկ]*ƟJ8_Հ#0yfu?>)Mu:u|Dҹ2ǀ$,,31ȱ_oN/>ϔYfưo+d{UޚP#4~OnQP|X 6XyOr`n&0"VKﯹ\u>!nu_wŒgLPO@S 2vmQ Ki-VwANU]Xr/h|1x L.fsoN' IXV""Fa1M~6T>2Tylc,~ts#VYn/jΓr3lp &OK>S?v(_)-O5 `0hpgV6&m q=}ˊBNµ<08XAA!I/A, 48`O_VO8z$~rᾣStbvz6h੣f\EՀe ׊>Rdw)gf`uv%&]\ap!Q"V]]i+̌C~7mQJ ofri Spi^[_kWQsbüX8?MދLPe.$򔍐 3,GlmA, B [c0ٺ&B$Dp nL@$Y@شD)S$` D9+Э_EeQ)FygO2iC'[!PC{|aG Uw}db C}U+-Fm},eoE 83>x$qGj8Spg5@-0 'i2\պ Om5l, cVGnzCwPO.flP\G"qYni/įQ Լ!5Am^_~DS2U~r9p{pXc@i&,,{`OV-pq(q>t^zsXC\W贡ME|NZ'A$iM?mV04꟡wQ| SP(< tf(-X4|uP*U뿇/:ˈgAcFg >8 Y97O8G)`oG_Og!b\۩)7~LCceK#Cw!J[ oRY"4 ^|loJҡ)Q.e^yeB4J-د,6gyT:=nDdzի?&jPoaaH$hhŝjNTkrEuWIP1<.n%#Wǻ"m.l?uo e1nH8.jeRl`m?0)ㄑ,7t qSʘWJȡ͉hlr")$R<"ʝ$Ihw98n@9?35XZfwidPj|IvEIjdp +w5%uh?WX{Z sWCa32(;vNzjTfɱ9vŊhxѾ|]mc_mu^'KR&'--}?~!G'c^v+'6DSoMkŨ\+ ;8El*XChn Lϗ[#TTWSؐG>#aw9aY4/åQqh9%(XYD\,?=ؿJ%)RŽvL_q8_w^bf0*VsqG*eDScCO$ a(Ӿ <^~H;]GX\Vsvo83lm!D+9L v %݇D :ʹޭujݬW0IC^#W*=K"#ExLm.# 3o5(4h!Tҩ:8h 'mp[:^?(h,1E(n_ RNa?sƾ=HCUju(@=N{ZQ}l| f]Z?%'M &s?.@7tk4 ,iza+:M&ِ5,~j{k {%tIԐ0 h%BS3}k^WK`kΜ{a ú 9CNd%K\"Ձ`5'>/Oy%ؠS Is=wJ t!L9o( s @586tcwb  TWau_$0Jp9yɑyc(]CVu4KFwD~,'PTۀE(3=C%pnE!PhLOB㷷ydW3ŖESA65$oth3*BkG:īRXP=+z^SĿ1)>0>B& Fжn^՚A<{Y 7#7?lYu^c:,Jt5\,PY{:ߢG8Y=[;N9ú}=B5 ʔA(;W"!,uÉ01r ^y,Qԯ4^<8mwNZ(gٻm-.V/YjʼnF Ϛ##avmaV?ʰبy ;$ K8ڀ$0Bي+e}W-сs_Ms%*uyZVH5A:E+-aoWj1̺kmau:2Oxg}-PRggPǎi![i<%C1,.9Ul|C<LҭxrZ"\QEd3vQ):T.]x~:bgEY]7^!dRiRO T>m JTz59V|i5v-Bְ#l$‚WUuʦ[@̼.%C~u-؟m?s|۳W3ȯڬPXC)Fu^ܔuIBy6{W6y'xM3%%#ѩτC5Nl6Wy˒ʶ>խ7Y 6Z@ Ժ_cl1uN>>Swb47v&ԏnu[N5N_q3/H߱ пd/WV!k/I?!|wgK9s,hTGԪ^1<:1WvL! y7ŝSc!nwV^FN&y9&E%SԆAqI܂5i΋$8[ qY\1,Z'kc+"s }6X&\H˓;(杀>Nd> n@ A(Ck,UhX!?Sޣ4}oN '0 0ӱ ~X@#6,T^bfLρʆ^tSTM=ToRYk!d>ޕ^K ԀOxЬ= lRx` t x;+ WNi߱IݙP ìt'XYlp-tY"J\B p?Ԫ2vӇUU_{" 8p*_L!M+s,xU}<2&~AV)u'wT+NHB"P0έ\s`gG8/ΐW-' SGAG\5bZZ'+)ZB w^tE^̲ߎ"va4`\!m?p}/^c~1v H#{::"Y|}6bǰ_L󍜯jd+&jIeμboN')$A.h AuBz+z"ȹ 1.lp%V*JL@:ye9#CʽgB`wW2߷ Lx,/$ S8R;{=S@ p$SܰenH`R$a]Du`b?Q#&JNǒΐteNrP=~*yÒCʨ=sliXT)3?yM5"mm2am:qҰLK``}^!U^/CiV#bb|ƹ{~"3.PY|R +OW0nE?#紊ZhYxOV-VL7O]R_%*'.~qǒ$L{mgDٙXk$C-bkJh UMfIo%\DnL#\ÿqCLt3)NwpcO`l!rich`%g4|vdeqЉR+&MAhq 2 Gfu_MAD&rY`mY endstream endobj 285 0 obj << /Length1 1630 /Length2 18568 /Length3 0 /Length 19413 /Filter /FlateDecode >> stream xڬsto&;بضmѱmVǶmtԱmΙ3|3̜?j޸6}T9 1P֙ oiclg#o-K 4wÑ:-lŌ< )@ h`a0sssÑD--TjԴt)`N?v6@[׎*@ 0D%TjI-blmi4:fv&vK `pXuQ쁎6NNNsG#[=pXښX_ݿwkaWL7Ŀt0r'_5쯥?%K ts'1`jdom7_0{GdikF@'0 _7vݿgN@k38f1M6cgVmL'_ gf&adjgk019 c῏[or_p7;1Kwd,k#ZkLo[mRoT`fdgٚ-mW[LLEjaiښ eĵĄi7 _Yon9;yFD Igb{& / <9;Zt?OzFQq65;mS/Zt.ٙYe;bO2ۗ6UmsW34N|>Ns0ڋiMٓ&+@٠=`/EL?ӈZ݂`R?ؙTR/y"`uz#YNhcZщZ[xzFxH9862`hd}ZۡcV!nk+>- T麞fIAng︼* ҽ.A.MɠXZsź 3?Y5&HESRjWMl҄P\#WƋJҔRsWX6[? حI[=:C"0"^Y۝Es d%2APήiDkc}^Ջ%-%&Nms>+ZXs"#dž|q[*H<1y`;ܕE6jQ4\ v'd뚾 +'Wb2ES G OڦcÈ52?tcHJ}41AD7K%Jh)U<{8`{LS*cLbQc-^oz}u*F93ƛj_8E<*xqpmEMlLIӌ y*q@}'9R`ܤ_M#6Z;F,[Br.O\#t4b=Y([s4x8%zJrx$4i)F=,r wg[e "Un8s &dvZ?(鳄4*~U'S@!aݨ=f.OϤOl˱@ѵ101 !q;I:r+( nqȡ/E!F uz!9qmI,6 ]`{#W ̎хSko렝N0(m!~Gvuh6?1\fo-DrkP2 Ԡ0M%U71Vj?mO&H]vVkИH= f ߩ9uUj#KK7À2o1^Ƙ/{X>-$g-ifgxp'f*Hz_1\$^֌q%x=o^?tM3MNG_xQukC'Y?F~lVTHXݼ(fǠ[( [ ]7fX}K%Vj:rŘE?4goئmqFܔ`fW㿊>wNGOE%F,x.A@D RѱmWo?SfuURC( p :Ҧ`t8GhxI 5sQ?PIͱכ(th}R.dl0bk+ٶ祉1v:1mvvW'[!,ح?.U@Ai5ZQ~.,t5a(=U8R+ǹo%j y* 4NyҽQt[P8%ܡ$jL>`-q}^d3qi_BjQs]^sA*98[48iqC'PHI(];W2/` &0~A}QgҜ2ZH$);D5ػ"@8kn0d` b`!`M΍^@0!ŰV.Q}e4=jRr0 Md.N>:0aBIfʂWb(3};Ռ#>o>09ԐlՔ ܔ ,.Y?Y@sk pX .O& ՞v݉-v;ڎ=%.PfviR=].*3t\&qls $}o&f[V8!:!O.#[ֱ0?n3ϖ(3}4s@Ԫ}K:q("9ï6D]d;>EL6j<l҂9 ԓ&5^gJ LP+xչ -Ś5Ƿ3Ֆ&r9&ES-ϣW#2HQ_)O{'fqc_:|yI 6S;sS9sΉ88%N`S|Y+@ߨ X~+[L+TOm"g0lNw]J2%3SY"q ./!7):,eAbvW*|V} q-g'?Te)=AQ%7͍EvQReޢ{[, y[^4XM v8#z~9}!{Vb*(5GE!1c$:5{]O*u ۍA޿æ QG{/˹i֋wmŹ;w c@Z<`oy4`j =m\gՊ3/g,*fPמA*/*깮b;#??2v$Vڞdzl)NM>q^3ڐ*vpX%L-ܢ"dggV5yHK+DP{_h˭5so^#E: twikH TE@LӐR C0mh!~Ƹ0xb&EODnKuODi$7+-F+#Ro h7jD<~(=ir 9 [4Wv^)Y/Yi5.b)UN o.˗GUz7o0م8^-sT3JiPwP voj nnɹnmhc}dVzBqQP| r3 -焲GO+ ˇJ7_ IA|}E<(.+ ]$х\uX"Z{l[\L  x;2W|X+6m@dR %3 EU޽^A/+:gX vf7o4!B=Mr %H_97I<0\OɶvnnXFoR ST7wZzB𶡗KI$fN q8c9S?!5AxE}ᱷi=\ V Z |k͑r_钚$P{7Ӗf=gS/.kw#\)}l2*;U[ip2 U$ ?!_%DZT kwUw|jRKaXUBtZX+SzZaepsRǔU q~<BlD.)z"11%!}S(pqMOCn^Ö;/V;+l>[3_kbrq/֐/ m٘;睬,fP0ª*3 'QaslY`ѕtO2k]Q#&QXGf:/%_ajyQ=>pdi|_Uȹ/}2)4<2"y{Q?Mea7L֢gmw c?{&j2jӢfɭN"̦:]~cGҊN|Նhn49i|`eY5S8_yѾsm|VCKm7scr7ٰw!1ja{1D~ymc@SJBm4sC(AVoFm84%iiμ|(VBRC@]f]aߚ태k=랛ᐃj>tVG'N37pϪ:\<M^t.pDj72@IJr{/1v q)Lad9792S E~z{w644U`NΈ0)_6L|E>Af\N<)m#R/-}hX m>Z!`y: -P>1H\Z/?%U6]xVtߏ L99} Dr2%~tvmDbj7 !ӻhbLN_I;v]xAx ,N[˅e ec j`4ד!'F~īo #s [(viu̕h|!wUך?Tm~B1(+%h̓Wiȩ/IcYc6m.` uBܬ3A"f atpwKHNuM[HNE0QٓIRi%8U.Q,Zo*uI:DӤ<v?pDis <2d%3oX2]iS ~c.ɲ k "U rqTjzWxXp PQ#W􁺓Iƒ׃7hW7ܞwD%k6Ià7!5f/Z$%И(Uv&4`6sKHZS~M4MJP \ps2W>>ۏ~Nv@e[.\8ǏCCmDKlPodqrJ=̳jy1P߼L5>g{\tRLfjf;b-V`joa%Wy13p̋y^V8!>'bcׅxkKEA-s' a("@ƴ?DKRu8qC .Ocz8"\r0SyVk'|XhblJJvhW+'0IKx9#xJ b: D1pEر)^^xVgDG ly^i=]?51 }{0+Ӥ^(2VcW6 ϼ04f 3̣l`~9BN[V2Z,'C()Cs݃h7HLq#df)2fKD#(-vQrm_(VԐ(ܪE&̗PX-$W(KZ\T s'|KU\,X{<*^kZh_ca7kas zo7fѿ_]N[7\@M<5hU:=<KXY`-ۇ*nmz (["Ib104㥪2Aqiz& S($2C8CI^V*?Jsm$inm,EnPZ,Axc؝M0׬˯w(!ボ0@X./\8lp;^ =*Ư|Hi\?HG88)X',3-PćuA>dbJdh$Ӥjg0vF:)O[z?Faa+[*J4OܑxN\Ej #WEnYDe$K )Q +`dQAvʧixPEV?s 29ES[T9{UꚺPGOĞ/o*^ p.RāŬ>sA=/%DCLsn 8z?<5:,oL~xnd#!."0ѸVsNP[0=~A-`vcHw0,ջfwd|7o;E?3>c\׾G7 HH(HX-5(C;wX550߶֢\&|s!>&+b׸ Ft4637#dI؟0X3`_suؙoOY=K>`<b g(6t1H>,N,d#O쯀PX-pu^8Z3 D|~P냙0?QͮTQ/I~F[B㲃MR+s)tj> ȬѺJ`^TG<+Y V$~ HZcfˑm?Z2roWg Mj23 z_\AbªE\/ '<ͅVfwIi:zGv7TA}T \MwbE31\lmgx@ l_Y蠝@c*_bZAU"nUQʎVɼK P9kJRdZF\u@j9w4F|Ey=Jg.̨iqm6R5ׁUHqae_>>q{ 9ʖn cx9yM&3MM6-cƠ^% KRR0e~ג('#2@T;Ht& =&h+.Vx_׽QF$(9xV|G  VB@]9Təd`3IG:{7|&Zpc~[=}Po >n @'pS-JT"a/<6,Z}/іaWqy4?m ůX6z/;7G7mp1n) .JV0kҌ3!}7gW/.mWaI0ʄΤn(! bmiJxJra:H3mBqPMp fH!Rؑ.Т&{ucHj,"<]^:)-[0z͈}7"'&3\~6>ď}a)[kUoLJG;Sބ[U98|m$ P k!sW9䴔<kr+s{6!}wǫࠋKﮱRʫn͇~<"]}9ǥ K O! H!&/M7JI$RWH^z9pqcVr{ ~1O7hU'<6:SIMq.٠Cs[\XS9Nm]d?js_Bgݟ7`Uk4D}s]،`!y,9d>{O/-wԵ8Oc8 2<|%\O렜V4 W9 x$Q 77nJɽSxuԗHnMA|ExT&ݦ31ݒI3 hAf?TnH.!Ou g5sCx;45Ѹ_X߄n=-KճNtk2K1 )aHM3R7EZ?tV]s`b,u84iUEIևDYR!OsZ:TVZMoW.Om=Hl7gMS10Lo9f>~hî~T+x@dWA:v$`^#o&v():d9JRe> W/GÍ( w[Gw! YCdu' z67-cps2(ekK G{TVi#OwWBL+**UI'!T+㧧=7k{֕£EL^ƹXrM#rS6ӏENi3|PAwBdszۏ’lxiJaWP^X$(zLzn4;:B&`R;U):]$̀DdcgN'U-TumHOmlB9@dv3jG,BdvSj׷JtqW%v0__? 3UJGn?7B靲 -Wf攌Q:H\\ׅy,/,RkuX^Hze#KP t@e\qWD _blXǾ1hq[㑵~H΄aѓq$*|-k&9-d=BBZ{=yM/k宵[yBɲXWHH^׶E^@#H1jEDHt6&$6ܝ8PҨjrq=Aڠ [J૲(4}uȬ qJ95ׄFH0 Xe@?ɱ .r"J[ww1͕Oz[)gv=6I EN^ h7  jBIY\Uq|P 9U-C7*π0.~ -f0@y~3 AӾ:2OQU|+t+P ΂w ǧY<ڋJۯ^Sv$ Nj-@ c)I1,OWM@9bMKASmx^e20S{փv7RòK &*C*Lnqw uuou; \pkƵpI=q{:#h ܯi:\2,^@Hh&}HQ~G͸R 4&+r%M< slzĎIx` (q¾_̓9Rn*cSBv]6!?_$(yg2;OlKX8J[< 2a-y;6zlDH tALO}q$, R\zkZfHNRSOx G=4@J<uچ<j|j7lg\H 'x< wj?+l19iål x"TD U)HSt7Ǝ`4[E*.ޑ;^ RR/BRI͗1& {>R}Q bP0v_2lewQ)EfaG9\e֔4hmzJ춙2O"ΐ#5 x/v+1bM$cG IW H`yu膓t}Њ޾3otC# ȴ<1c p~wau#"5y)Mt,_ʇii+ROTˢTKժcVՔ&%oc: 쇅JrVW&M}x0yucgj2rQq0H>%`q'>")"1J请hN`#[b`M<]ބ]e@پxcUzW]40;>Fr3۲lj y)&iW w bQ .A&(00g 鬱ٲ ƶ?9K?NN5B}U|FPy:mDzj_+u-]JO{{Ls ӣ WQ wɇe 43U] ۞}s/[%GplI}ЙEjlVܨYC(n+A_lL}F~ |?j ƕK])5M* f";\$IV|dniquUu&AkbKG^aB1pQyVҨ}cցyYcY3#zq =v6 ;fe>6D\ƵÈ'Ab1#t;-vgHz( ~]55}Ef1%GEǻۙ3͞fc.5U835SɉYcͅA B;!}kv$ZQ iKȸKnbj$Laӏ/){A+Q}.tӉd̗^R[5tI|NWFS߬.ojC" _r<zfȦ%H1 |xe[zšM%֍DMa-\:XVdrk+WXDZ8MM u&gN~Vb`qHܠ\-t0< Wy|}WFc^!'e=g9/-/ftl Fꞈ~MS+8#S4Ww:y)1MV<衁wP\OBU@tݹ 7O5eObGAPathTAΤ*p)v(3M3Rh&PMgW^o!k' V=]l ~ WycmCAA68Y3>Ȏ{ZG>ifk|a5o6 ߈nRv}^@)HV b@`~y^_wXQIԦڸW LƃUM6ڗx@]ݮ?3.ԧ&jNA+2a۶~ THmfAv,ʦ JVWSdbj'k 5$Z*OV%U;ifZ퇲,.σwNA΄$\TeU֢à9r٩V1T(pmT~ݎ^^l y} Hh;Ǿn}S.SYr{ej#{\]c%0QNuw.3[קr߻&?KuI]Li[Ϋ72Ht7>_n=Dhf!ohQQR ~Avxo#¾(8lf6(JUd G?}#Y\' $݄n 5|XOeF-7IǏѡ6䔞 LU ]Nyu~輞q iI,h$ ޘȬ#?0Cº5֤wDTT[|50I$Y=|1 ؅\6{zӁ!mTHW=1YU݆pVy殒(1_1`[i'y¬\Y4sQjʤ~}۸4NnVAr!a5$I߈#.z5;>wc=pծs-zՕnC 7MIQ/"(+~Ol\hQ{TwLBu(䬏!B3A3"X6B607M] R2A@̻THX{:xI[ts͗1֐@'Ml7~QL!y8kvaFHF(BFFf 4jZC\r|a :A8^J8CsH V s0-YLւH6GSmEzA6V@ɑ".klbyvAv)>6XriS+[xxXl>̴TQ8N#z @̀&0 HVõXJh6ck Msٍ V򞫬gjjͪ\Ov,& (x4yb&S4jS.!)BQ7`mC6CFV='˭ Fv|⩖8 F?EpRKQFEG?Y{rQ7Ji?AU6J.D*f7& nX0Bgk:5+[v@ˎF|D7؛ƴq> {ўI~{rKҮ#D~aІ擞Hb|nie=R?:t?s4Ku 2."As6sDv2Ik>4R#N_{.R`|1!d*+ SyӔH;nA*a٠cܕTIUkri~%>hAg|!(6l9,׍Y -@U c#8K_ܯ@ܭɦÅO&ePw`IdƆ=80C) cJp )BdEXڼ2=o)^h26L<>9.&LUn7PG IzV| YR~BBiNOT3U.̛9q6)vF ",L֍(MU 6SZ#B"$!ºc75G[li, H4kW&SbzRsE>c1:0 ]:M`mc(@qm0jӞиaՒRDoSRt۩Ҝz pɊH*suffƠG8Vr+# O|gz.zYl1S}hW0/ H#>C޻7pZ 3}T)H-Mrl z#| l];pk6f5K}CEs&H+s{CZt)iI&6+Xhˡ ?_~ ѝZ_k,,uF~W/PXZm]̯=%*tagBоDY4/~"$$U.;hG(G$C1`hzcԤ[N=Wǯ>un{ B/(*_SIyUs) -4 R[pxoP )e9lw`e}gs$+_䩾dou!$mZ[{F .:g5s61ףuƯSSUXs3?vE c@>;fZ0~-;j@5(<3C2il)!,`Tn.&R|R#EW8 L=݁g3SwC 9JWC3\?Jˣ2~ K dH4~AN2Z 4゚=Iq" ch@/toY\_ZR{y8 ]\T@O1gGVc{L8gTԟJDnjG}ђxEb>Tc O 26A޶gB38Vi bC1IQ*^1ʤ23pŇ VNxh[2Z94402| ;iGIi}n2,QL0>ouM0}%/l_ŘihݑGEoK@ܾ63@$䁯%Pr:n0bTL%B!&!Eá+27{ul{fuHWh7GrwQ>N  ܇AjwB˜Ԥen$z~U?KYߕ!쁠Eb20H R>Gy<7eYhgh^}۽<[|R("cfCL3+jQytg4O,SiuZ,=Df>"{j Vp[q_oE@sPd̈ $>}foA\IǫkuXkU,nJka9$uYFwlZop=5Ԅl8;jM83]Q(ܬNL +%6qt=7Mb6:#vIR?ϤD}p񵸎SCJ å״:w̑Kv-Tm[fuЧ=U 9bZMfjaWi;b6]v-s~a)qφC.tIjh@ T$Qo1nlEvA^2kbi͞tQ_ 'NHqpX0ڌLc^VWƟ$[+ sl`Yw:KW2D!2IViB4W( =n*qYE0nO8 ~3u>"'h+y!*:6Alȳ22Њ?W1 pUfCL/>UKt~&BU endstream endobj 308 0 obj << /Producer (pdfTeX-1.40.20) /Author(James Watson)/Title(voacapgui Manual)/Subject()/Creator(DBLaTeX-0.3.11py3)/Keywords() /CreationDate (D:20200527100331+03'00') /ModDate (D:20200527100331+03'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 274 0 obj << /Type /ObjStm /N 59 /First 517 /Length 2558 /Filter /FlateDecode >> stream xڭZ[s۶~ׯc<r&;OMҴJeJBRv_ E\`wv9b#VQI  QVD%# PtӅq&0P(EJ8'0K".58шk;!2F4 pÈBٛgBW f' s$LB GB1 7nn!H p Db a0c\"I4 BC,D1Pp2R0FRj]&0 0@[NRR;!C8 9RRP HEس5HsiN5rpD(' ma8F@(;&g;yg&_fHY|maWggB luD54qRJ_g$_"ڽ2 [7vl4ïh/Oƀׅ~˜ߝFٵ)3eYzّ y *Eoro2M.z?q ҦN1GG't7:Fؘc;ů(_qoV/k|onMc[dqq[\='+43?TPuzͩ:NUPs[^8 Ec>YcCdQ-ə >/x{̽_x'FkKSwߤK_ ib,Qf):;{q2p }lii(ܣvi]8|GEI2ݤ nQC_$48Ty&.~o|W|X$9dn]VT9ΉH'>&藯^9nb~iVa:$Wݝ>17EnG^P~|"\\rvKDPeAaK:ɑSMB;Dn~d}'?Cö-PGɪj,Zevw_o65eQ )6槚dZlhWF2]49Axpn!xdz(б⬐[X%)zDbg`jwà)Z)a3U yz|P{[Mk?TDyG.h;+2DUؖڄŰ_9rcGgR Z<®xo{^xg~ۇ0`P{DmpT5a:hd}d )ۻhmrӽdg-~(+he@\YNy<{3)q橨=sR]E} ~އtUVUW|C>6˰▨oS:/?C)gƆV}j$ $# j >!v^;"V QHIn o!P2Ϲts$&*4 е"KW:p(NNz?ꀸNN'PfA޻HՀOVXK=%DF|lVU}lz8*a߷&m%h2'# N"G͜q@Műe#Ik'MY6ձfy!`]lwE]MD-> u;EM<ҠS~(%ې@bDnˁ\!`0z Gۊȁr5NZT@+C  æy] A0]˻4ZFbRt"vDF`K֦(v=ɬ MhjB';eƧf@ ľaZ!Ltk ],ō&=VM.]Es:㮔Yv?jpd}xR6*@]'6yfrdt=>9_'qN\+?榞\ /ϟ65Ύeysv|;5҄T endstream endobj 309 0 obj << /Type /XRef /Index [0 310] /Size 310 /W [1 3 1] /Root 307 0 R /Info 308 0 R /ID [<220CB01944E8C7FD2285C9801045D969> <220CB01944E8C7FD2285C9801045D969>] /Length 765 /Filter /FlateDecode >> stream x%;LQ{fgvPQXT~?- / +;5;B HaB"J 1$vvkCޙuι=9ωqq.jKNeC*1>1@X$c 1:*.nIc&2  ِpQȃcpP'$AT\)Fhhvs0 j'RJ!-:hPP%* jX\TC/)Xk|=/VyʓkZq9vy&h^mnqyg[2Ľ_ ۸{m&`@a1u'ٮ 0-Xn.vf%T8e,Jh9ھ5% mhVďŝ+Ub>Z$6K͔)ӄ+Rڤ4LVJe@yT{fF}m%ڗm' :R]D[x7mTJ{vRh5D0^gPGq4qD:Dcf 0GCLthEth|uN犄~g$a;,ݵ' $2j#_"lHO!P eP JjZzh&Mn66%? endstream endobj startxref 521976 %%EOF pythonprop-0.30.1/docs/user/help/C/0000775000175000017500000000000013736105755014054 500000000000000pythonprop-0.30.1/docs/user/help/C/legal.xml0000664000175000017500000000747613662771311015613 00000000000000 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. pythonprop-0.30.1/docs/user/help/C/index.docbook0000664000175000017500000011651313736105351016444 00000000000000 voacapgui"> ]>
&app; Manual &app; provides a Graphical User Interface to the VOACAP HF propagation prediction application. 2014-2020 J.Watson J.Watson &legal; James Watson v&manrevision; 2016-02-01 J.Watson jwatson@neomailbox.ch This manual describes version &appversion; of &app;. Feedback To report a bug or make a suggestion regarding &app; application or this manual, please contact the author. voacapgui Introduction &app; is a front end to the VOACAP engine and may be used to; Produce HF propagation predictions between two fixed locations (Point-to-Point / P2P mode). Produce HF propagation plots over a user defined area from a fixed transmit site (Area Mode). voacapgui requires a working copy of the VOACAP engine installed on the host machine. Installation of VOACAP is beyond the scope of this manual. Installation Desktop File Run the update-desktop-database application to rebuild the desktop file database. Icon The Gnome desktop looks for icons in the selected theme directory of /usr/share/icons/. Copy the the icon into /usr/share/icons/hicolor/48x48/apps/. Run gtk-update-icon-cache to update the icon database. Getting Started Starting &app; You can start &app; in the following ways: Applications menu Choose Submenu Name &app; . Command line To start &app; from a command line, type the following command, then press Return: &app; When You Start &app; When you start &app;, the following window is displayed.
&app; Start Up Window Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
The &app; window contains the following elements: Menubar The menu contains submenus alowing users to quit the application and access the help documentation. Tabbed Notebook The tabs are divided into functional sections and most users will enter the required input data working left to right along the tabs. Applications Tab Used to define the geographic location of sites and associated properties (transmitter power, antennas etc.). Applications Tab Used to define the geographic location of sites and associated properties (transmitter power, antennas etc.). P2P Tab Used to define parameters unique to Point-to-Point predictions. Area Tab Used to define parameters unique to Area predictions. System Tab Used to define the common system parameters. SSN Tab Used to define the Sun Spot Numbers (SSN) used by the VOACAP prediction engine.
Usage You can use the &app; application to perform the following tasks: Produce Point-to-Point Predictions Produce Area Plots VOACAP Point-to-Point Predictions To perform a P2P prediction, select the Site tab in the notebook and click the Site button in the Tx. Site panel to open the Site Chooser dialog window.
&app; Site Chooser Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Sites may be defined by either; Clicking on the map. Using the Locator combo boxes. Entering latitude and longitude directly into the Lat: and Lon: text entry fields. Selecting from a list of predefined sites acessed by clicking the Select From File expander. Once the required site information has been entered, click the OK to close the Site Chooser dialog and return to the main window. Antenna Selection is made by clicking the Antenna button to open the Antenna Chooser dialog window.
&app; Antenna Chooser Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Specific antenna models may be selected by browsing through the available models by clicking on the expander buttons in the left panel. Click the OK button to accept the selected antenna and return to the main window. The bearing of the antenna is defined in the bearing text entry and may be either entered directly or directed to the Rx. Site by clicking the Bearing button. The transmitter power (in Watts) is then entered using the Power (W) entry field. Site data for the receive site may then be entered in the Rx. Site panel. After entering the receive site coordinate, it may be necessary to click the Bearing button in the Tx. Site panel to redirect the transmit antenna to the newly defined receive site. Click the P2P tab to move to the Point-to-Point panel to define the predictions to be performed.
&app; P2P Notebook Tab Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Define the time for the prediction by specifying a year and month in the Year and Month entry fields respectively. If required, a day may also be specified by selecting the Use Day checkbox and entering a day value in the Day entry field. Enabling the Days value will force the VOACAP engine to use the URSI88 coefficients instead of the preferred CCIR values. Cicuit Calculations The default behavior of voacapgui is to produce graphical output showing the performance of frequencies in the range 2-30MHz over a 24 hour period. While this may be useful for most applications, text based 'cicuit' predictions may be used when an analysis of performance at spot frequencies is required To enable circuit predictions, click the Circuit checkbox and use the Frequency entry panel and associated Add button to populate the frequency table Select the method from the Method combo box at the bottom of the entry panel Most users will want to select method 30, 'Complete System Performance'
Displaying the results Results of circuit mode calculations are displayed directly in a text dialog. In the case of graphical reults, the Plot Control opens and offers the following selections;
&app; P2P Plot Configuration Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Plot Type Specify the data to be displayed behind the MUF / FOT curves. Available data sets are Reliability, MUFday, DBW, SNR and none. Group Specify the SSN groups to plot Timezone Specify a timezone to shift the plotted data to. colour Map Specify the colour map to use for plotting the background data set.
Click the OK button to open the image file.
VOACAP Area Predictions To perform an area prediction, select the Site tab in the notebook and click the Site in the Tx. Site panel to open the Site Chooser dialog window. Sites may be defined by either; Clicking on the map. Using the Locator combo boxes. Entering latitude and longitude directly into the Lat: and Lon: text entry fields. Selecting from a list of predefined sites acessed by clicking the Select From File expander. Once the required site information has been entered, click the OK to close the Site Chooser dialog and return to the main window. Antenna Selection is made by clicking the Antenna button to open the Antenna Chooser dialog window. Specific antenna models may be selected by browsing through the available models by clicking on the expander buttons in the left panel. Click the OK button to accept the selected antenna and return to the main window. The bearing of the antenna is defined in the bearing text entry and may be either entered directly or directed to the Rx. Site by clicking the Bearing button. The transmitter power (in Watts) is then entered using the Power (W) entry field. Details of the receive antenna then be entered in the Rx. Site panel. When performing area calculations only the receive site antenna definition is used. All other information in the Rx Site is ignored. Click the Area tab to move to the Area panel to define the predictions to be performed.
&app; Area Tab Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Define the time for the prediction by specifying a year and month in the Year and Month entry fields respectively. Define the frequency of operation for the prediction in the Freq text entry then click the Add button to add the selected values to the main panel. Additional plots may be defined by selecting required Year, Month UTC and Freq values and adding them to the main panel with the Add. Click the Area button to open the Area Chooser dialog panel which supports defining the receive area in two ways; Dragging the cursor across the map. Entering values for the North East corner and South West corners directly into the entry fields. Click the OK to accept the displayed values and return to the main window. Select the required grid size from the Gridsize entry and start the prediction by clicking the Execute button. The VOACAP GRID parameter specifies a grid overlayed onto the specifed coverage area. Predictions are performed at each intersection within the grid. Large GRID values are used to produce print quality plots but at teh expennse of computing time. Users amy find it better to specify a small grid size for initial runs to check that the inputs are correct prior to setting higher values for final printing.
Displaying the Area Results The Plot Control dialog is opened as soon as the prediction calculations are complete and offers the following selections;
&app; Area Plot Configuration Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Plot Type Specify the data to be displayed behind the MUF / FOT curves. Available data sets are Reliability, MUFday, DBW, SNR and none. Group Specify the SSN groups to plot Timezone Specify a timezone to shift the plotted data to. Colour Map Specify the colour map to use for plotting the background data set. Contours Produces a filled contour plot. Greyline Controls the plotting of a greyline on the area map. Parallels Controls the plotting of paralells on the area map. Meridians Controls the plotting of meridians on the area map.
Prediction data may be stored in a '.vgz' file; a zip file containing the source .voa file along with the output .vg_ files. These files may be saved and retreived using the File Open VGA File menu item. Click the OK button to open the area plot image.
System Settings System SSN System Settings The System Notebook Tab is used to define a number of system side VOACAP parameters.
&app; System Tab Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
Man-Made Noise This is an important parameter, used to characterise the level of man-made noise at the receive location. Valid values are in the range 100-200 -dBw/Hz dBW/HzEnvironment -164.1Remote -152.7Quiet -150.0Rural -144.7Residential -140.4Industrial -138.7Noisy Min. Take-Off Angle This value is normally very small unless antenna performance is anticipated to be so poor at low angles that these angles should not be used in the estimation of upper useful frequencies, or if the horizon is so obstructed that low take off angles and reception angles appear unlikely. Valid values are in the rangle 0.1 - 90.0 degrees Reliability An estimate of the percent of days within a month that the signal quality will meet the level defined by the Required SNR parameter. Required SNR (dB/Hz) An important parameter used to specify the required Signal-to-Noise ratio of the hourly median power relative to the hourly median noise in a 1Hz bandwidth. Typical values of Required SNR are; dB/HzTraffic 45.0Voice / 600bps Data 47.0Voice / 1200bps Data 49.0Voice / 2400bps Data 52.04800 bps MIL-STD-110B Data 63.09600 bps MIL-STD-110B Data Multipath Tolerance Specifies the maximum difference in power between the sky-wave modes to permit satisfactory system peformance in the presence of multiple signals. Modes weaker than the specified level are not considered multipath problems. The valid range is 0-40dB (Default = 3.dB) Max Delay (mS) Specifies the maximum tolerable delay in between sky-wave modes to permit satisfactory system performance in the presence of multiple signals. Modes within the specified linit are not considered multipath problems. The valid range is 0-99.99 mSec (Default = 10.00 mSec) Ionospheric Variables foE, foF1, foF2, foEs Multipliers that adjust the predicted critical frequency for the associated layer. Default values for foE, foF1 & foF2 are 1.0, foEs = 0.0 Model Define the coefficients used for the calculations Default is CCIR Path Specifies if a long or short path calaculation should be performed. Default: Short
Sun Spot Numbers (SSN) This tab is used to display the Sun Spot Numers (SSN) read by voacapgui and passed to VOACAP.
&app; SSN Tab Shows &app; main window. Contains titlebar, menubar, tabbed area, Settings, and Help menus.
The information is derived from data published by NOAA and made available at ftp://ftp.ngdc.noaa.gov/STP/space-weather/solar-data/solar-indices/sunspot-numbers/predicted/table_international-sunspot-numbers_monthly-predicted.txt . The Web Update may be used to updated the table (requires an Internet connection). Alternatively, a copy of the table_international-sunspot-numbers_monthly-predicted.txt file can be placed in the user's ~/.voacapgui directory.
Templates Voacapgui supports the use of templates to facilte the prepation of repeated input data. Each file must implement only one class named "templates" which can implement one or more templates. The "templates" class has to define the following methods: __init__(self, parent) parent is the parent window in case a dialog has to be used. get_names(self) return a list of the names of the templates get_params(self) Return a list of strings with properties the caller should set on the object. For example, for getting the parent property "prop" set in the templates object scope, this function must return ['prop']. load(self) This is the last step performed by the caller prior to read the names of the templates implemented. This method should do the minimum amount of work because is always called in program start, not upon template usage. set_ini(self, model) The argument this method gets is the TreeModel object of the area plot tab as is at the moment the method is invoked. This method is called once before calling run(), so the model is actualized. run(self) This method is called upon the object to let it build the template values. It should put the result in the self.ret_templates dict, where the caller will retrieve the values. If a non zero value is returned to the caller, the procedure will be canceled, i.e. the template values will not be added to the model. Known Bugs and Limitations Apart from when starting the application for the very first time, &app; does not check for updated SSN values. The user is responsible for periodically checking / updating the SSN values using the Web Update button on the SSN tab. About &app; &app; was written by J.Watson(M0DNS / HZ1JW) and Fernado Maresca (LU2DFM) (jwatson@neomailbox.ch). To find more information about &app;, please visit the pythonprop homepage. To report a bug or make a suggestion regarding this application or this manual, please contact the author at the email address provided above. This program is distributed 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. A copy of this license is included with this documentation; another can be found in the file COPYING included with the source code of this program.
pythonprop-0.30.1/docs/user/help/C/figures/0000775000175000017500000000000013736105755015520 500000000000000pythonprop-0.30.1/docs/user/help/C/figures/area_plot_configure.png0000664000175000017500000006667713736105351022173 00000000000000PNG  IHDRjfsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|S9Ie){o!2 E@TWPׁ׫(E"uޣEis~Цmh~<|=ߔB!B!B!B!B!B!B!5Rp$5Q(C!%`UTB=<"dpg[pBQDUbie% ҄ w.j֕B+)\ߝP"U;ݽM!Dٸ wn+kU+.J Ҵ+B@2ܼ4,;* ͝m !DMnT/KxUJpUޝ*.,&s'P B +2}IARTH ҆;B4ҝ\n?ʤ;zw*麫uڮB\RA%RI׋t/eR_ugTUպEmC!DVK]j{Vjhą`Q]VpܖB BKws[JzW;FYp*xe\~H !Dɇ7*T;V \\ׯRp`*겤WmJX !DaHu_uNUȫ,U\@ "Es7JBTwEJ9K)p y*;*bU4rUJ B$ -e~PE{GYS*@>*)Ly@(wZ/)B$eii  %GޥV2󨬸>TVqH7r*XFzX,>(BT60sHLH~xte@EnpE<&ViSQ#,ʯm۶/?~^֬Llhè'SɌ$&[]{'NR;wiҨ+u!=+}_˱ϖ NV%M6}7 ]S23 BT`E{7ԩSۀtrʖw^!ΗRQU(2O8͖] a٬-#[OX9@S`p;*shJ|IN`.kѳGlkVY/h Khp5kPGT]]VҌqI[ ,3_!<t8I(Tq5MjĕLV֣ 5k"BQՂ0K+G}@+{ZEHBa(zE!e?rYUUKbYB4]*]%dVZ"EruZeS=,!lyirCBnH\qq* vS7Ih !0XeR F"Ku>ûdBxѕlT$~w",ԤV<=PTuii 6^u-âi ozc &nX|}trhj_Cd)oB<#av?*E<_ar] -w\AV/Ͽt`E/EJQ5׭- doe˹߮-==hl|?/l9SU:GyV|Պzn?}?VRTTtaeLspF4*hF15sC-#0=*?n@画/ezX'ҩ.=x -9v {>ӟY.ۊCp'UhJ:ՓځMh]B l+zdЈV=5;M畍6 ռMũ9~{s`𱸳-`o$ɨMᓘvsb䮻Tf6_w4MSƘqvjYVy«\_Ͽ,) \4jq EˋUp P #e l~>^BP.xC{vݢh}43+p&CХ^S\rҢr n]~%m+%ou~+:h1~/3_;[xj7CMh-t l7\7lhy 4Ytu]'9NZ=nnLuQ9w"fS2Jy_heIs3?ǺmgR43[~dÙ : ' `+rζUC0kAAѮ䟚҂qO=mP=nc3Ft;^3'gBjJy.j]~yr]*H)re=QJ >|7ݦ!tp776U040E ZS۩- u tZ&gbz)~+I 깘vk[ |0%[W'+-5zu\ހ6[ԗp}UYӃ NMSChգ= ,nB>2~̘dʽti ײV6& ©ֶ\%Qj鋯c1z>K96nh]}܂( ScO}k9= GPWMܞA}s@@4ۡ+ر.wJp/-{6c[_x8zֽtno>|)?E|.UV#}*n=G=ɤ}\C~A)"B4Q\j`$o77b #ɇ~c3qls|AR,M? h4(c|AujW Ϥ{!m~:3/Li௓Kb=,grG) j 7[2XQIM>1sä%'VDN:/_ooH)MWj3n0i%c2rL e9|Z91%o=ͽwv+~_޳Zߙ}K:փ} u%܍mz _uc.vRBjI&'q!52(߻r.οN-_=9A!DejնQ é\+y%~8s-=$BQe*5*:cBdWw$]c#dP!IX!ePYBut"i !UZZB!JA~J!אB5tzP&BF!%}2=(kTHL̩ܼB/SwаܼB/#ӃB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!;P>y>q(&|jѰeV&LRZksJZO!De**hrIх S`۾y'>OfȰ}\zB!*StRځ ƅlPC.m$bرXocJpoS%WC!DU9eeע/]+dş8K|j&vd5TBWdl؅vfЎoÙ,[C)zB!ʯF#qo34qWSK1H;F2[3`*0RR!ۖ{ !szqU^eE#; &.;.w?͌F4"LNʅbtCXLV/ogNBQYHKOb?ְP*akKXxWGf|ɼ)h ~[''aʀZNc+f[zB!*(Eu*&b,y>yu˞Y BT@ yـTtb(J=M%!^CBK!אB5$Bx -!^CBK!אB5$Bx -!^z{PxRSY^㩪?j%VN#2hؤ!1)DIҒ9͚MUݥJ%{RRHOM.͖ɓg=Kfͱfgq\<-ZWo٢Yͫ[K e YUd 222O(A|B"[…B6#IMM#!1)FBBmZEJbyڶnErjzJ2IɴmӚdӶM+S.ϟO&|2ڶ&)zbbSh߮ ;oK\\<)xSЮ-IIIcv+Tԡ=Ϟ%55NqlgΑF9}lzN9Mڅ ѱ\HOKDEwȩh3ڹ'\O"##n]:q̤{=~eddfҭ[=NfVV#ȲZ޽+G-\֕#GeGn:zkVv^,+=u#d[ٽ.Tգ–m+Arl9ٝXԩChӡ3G߯Z䄹#DTUeێ]Uݍ+BFZƒVf&v$0 8},͚6uU#ezPx$(vWu jloPe؃|iGS%ֽ40j҃<ؙ׆~e˜R10ԏe`{nlO[ɲ9Hrh^wNtbô襑Sń޳pY9=*c_Ӈ:bֲ9\ȼͼ4)*Jk]OoWŝ~ u@{%nOGydV[!rի&dVu/:>&0HA "#[`]J1L &?g֌l)ch\%#6`C3LӋTgZTBi]ݫQ<쭶r2ze oӉY6+iΘʋ˿_ˆc,?qigjEO1e_[ͱj32KaE, ~] M 0_҇F1kUjc{/Iq7;WVzJ$n'ț'3Epš~ݞNsYY #nb-mvlNۋ]7>'$ռp9SXO« ݞáUdd=ɇɃW' NwjهØV,w_uk1Ys6+v{*Mx4'`s[;f`^軶q 'o--cHB.kKݮ1no\|UcZ5X`kkƆ#l̐>!ygHV(-X1 \Vl: `vRv93}rBTʬ9Op"*<< ]70}sϴj Œ'ѹ5i[7s )KKsk;љYI}@I.> ~f{H=jip&ϼeY$;q:9 u<K\J*qM64;nP[ѣ 1s52yo)؊8y(ݴb^^cPTb`5hXB)ӃZ5Zɿ?LpnMr [ es 7]Z0t†LzM|:jִ9ƺ1ddeIVf8\Q6+Al8.qe00Q8edj \@םvDzb7cHFiFzux{뼳 5 GӵR;=XSKB Őqd% ʝ'HL9˖:nЛ 7g8tk!I-Ww2p`>ґ&jl0'oO䳝Xuģ_%Gٗ˝ n"C,[fk>̆7fpͷ1%t, ;׏1Ӎ39SsG8u.on o:(}P%_m?Owb+\` zEd9`X>q{fPH\\ի7wf;թ]՝/{fef,(CGƽrU+Z?}2 uRVe'$Р{Gb1Ȳ9~3L9:bbF CCgcykAlX192ȶ⇏]aA2Wcu 5;+i{䞩IF5'Hų0}anxCe%\ذy 䑃ܽB 8 d@z^w[ hNEw*S6_SVĨtlDlQ\Z0r=;{Fdg;ݠȱ)`d9.}:꼮nqFlNukf/?[`hdgrywuNo鎣XK N?ßk8aU}z' >>ͫ#F?ˆ8;!5'Dۇ$V şQm_XO#elbmLk qs9FEdUéࣟpqG#&/^+ܟ}fPM_‘XZsIIi޴ &{9l ~%30O/Jϳ(=Vݸ"d%͹"[6'9%i*''Ӷu+'kӚ$SR'$JmOȭiC\B<)ioۖ8sqqѡ][Ξ'5-plЮgϞ+Tؾ=O!-Bzli.dөC{bb\۷'i.ӹCbbH(T?CFf]:vdTzN9~*B̤K8y̬,v'/֏?AJ.9zdeYޥ jΫjҽKg=Fvv6=v=uelb&'F{996zvգ;f)T߻o?9v;z`}yweݏaw.k>>={sދ}{d; ~{mN4Co$&Az(뤜Ov}$CxNbҰQSCBQe%DtM#BqgbAFX, ݆C, au,$'s:^3~H0&єZTx`y -11i5]!KQT ?_jX %q]?"ŤTBO>V9{vU"&s ,3,>?ΛOeIg->G<>|'cۙ2-~;ߟcMMig/>'SyqoS1r,~29kz6dGuٶa/ri;uB-"#MNb主%mtbôϢnq͟a̘֩ݮ1Jv5'奌, KV:?oP ΈW;N2mʓL'Z6?YZg#0,.uueœ 2|t;ѝ"S7ad\.VM,Uצ߷Y۷5*ԭX'뷨^`h$_âPt^Fʊ_`8 kak&݊Mt;d4O:hіxwhλo-D5̚'=cOu~s Knu'iy)%(#DBMJ;`gۛK-W18nDr]+S= >:WҒ.}) *AuP2l;{ t[ߞ1-Շ,oI+Ϝ$NƣӼ:g=^5A2O3Bc:ט11f?1EU/V㈆C.Hhy)5=>dת*`Ri.^fsYVPU;Ue/u.S3_vz~#{m=mvj[QR*< _?L9rr/84;6;^Inlv= ڵ|#|y:q %j]iE yxL4X x$dz{;0ft |c%/_Qs[9>j 3 bZQξNsS3JOOƟ{ueiO_mN-Aуb-̬,sE6lBS([/-a?>j܂FDn1u+;'֜J_ 7h0M/󡺓Z&"'X0k.o V[G -5~~s!+%r]O~72ѭ?[W|Ɩ .◟tk'HL9˖:no ezvbX;;5/C\`/0 (tuۆQKЫ;HwHRX#z*u8rlv.N$BR-heߩJu'"L @OK&6-_ԥqH"KFw*\=%}g q/o:ˆ>O@z^}gn\ۑ?0gE:~wK[hؾ??@|h$i~O:uxuz3ʠCacLw<7oۜ)j돦<0o;hm8Ͽ֪zm'v7g__!)S!iWnt|fuݻ(Eu*&b,y>yu˞Y Dϰtl?:o-vpsi>zY/tNvf6?_ fÚ;DŽ/u\p}ńل9ȱVLX|Tmdt>M* `96rZTGҮs m3 0(dyBmi@69ݩucߩHKx vk:E}ٳȿӑM#ҝ;g-\а۲ۊZA#';e;(jq!D$1!D @ !^CFZlFL^U!D"%Z+JBKxZr^R595dK@` !;dzPxBX(& I:&bD&D@P0#Rv,K+y1 -11ir%Rd׷Hh cXj OQ6B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kHh !ZB!B!%kT҉Y6A ߐ[x~cvUwH!Dac8|3.y$UOş 0Hݺ=B2Wu*N_qL-WL [X?=}ro[ rcjxHMѭT\02{#'57HNJO#$\@ ۙyuӬj6l+wr\ZzgUӘ/"AO=V$,k?]Gũ[3o3_(o!Tof{1C0=wHf_ɹlAc_Ҧ[+y wϰsQm7Ǻk=)ssDcDtauo^剏_֗ B`}"Z$ǝ ~yhӒZ(eo훑ʺf aսiRRCUkN Gg6gsiYh^xw R~;^XdžUIz XΡrw!Þߏ ]lytz֝NC.nH^Ŭ رc'z'"m]y:7sk=5:p. ~x[_ɶm'wE= t< P̞ эn`ӏӷ "0㟗~=Efi:c~ !ViXsJÿ6-MEƍ՜VL$! 2voclM3{XZؘfMpB} '*GѠ֌>JȔuGPGI޾}YW|K!jSsRеO7jjlboF-HY {;NlFڐ[ ibICGp@&W.ݖdSѝQ+_g%ړB5$BxBgZB!DHh !ZB!B!%kTs +#I X33uTՄ` u' 0S$8Ojy7kAph&;K--5Z@E4/r6&аԮ[JqHh Njyw,OK!e2VPۅqgZ#OJqXBlq$'&VuW*֬LCêBx02JBKx]3,!d2k& -!^CBK!אB5$Bx -!^CSIy-Dq5;aېWqsn2Rٱ {m;Ω4j2,z;TuτWV%0د0m0>zi$@1aIf]G d?x5|&.#/)ט[nŖêobTuwk몀==[rsKrɓsas-u|gؚU+Qbje-dCvu>BBT2(*֡(纻n51l0:U;/RLhk@k(+{_\׉muƼ"-@]&̙Α;_Mwh~1mcSmCJdg` B!08YdYQpMn-WrO 0r7r7`jH([Υ|BBr!v3'<-dzҟ?.WM+18nDr]K*A= >:NP|Fۮ ~~IedDL (NGg6&5'5Lx5?:}J`ݦ(ۆrVB_rC䭢q1o(W~GY˛0"%vﶵ*W|cXO|9T&Ou:S1KeϬ̌:8on/LhU kzu^m}2L =\Ȼ- 4;@Wc~eFE!אB5$Bx -!^CBK!אB5$GPM&4MN.DyhT]BKx@*lBiUu7*ullQ]+igcS^UwRIh LhXmEjrL &MHMNȁ=?0T܃cԮ[?}%RM&hT $  &e#ӃB!B!%kHh !ZB!=(.Uaž}Essn%(vHR`i9β,Sr_GR,,| e4.,A^oj: HP:(nq|9(+,5ns_fUb_{UUPU%EA{+~`Kvi4->Ҝϱn﬚KU Fݮ1Jv5'U ƅ4Ҍ,#c3WyE֥NL3a?vSfTiwL)O2톞kٔzE-gōyk9frͷ$ZU#?zݛ7Ng9xy$yTFwNH=4qaX6VY_l仍 8"@ nDŽc޶CvVl: RTNhλo-D5̚'=cOu~s Knu'iLb!K9q#ZY.ԃsryw-W2yR|g* -y|uW&gZPJ\Q@EeEW@Yoݟ7x"* ""Emr6BҦmRy1dft~D=wK~`>Ρ}]~ѱoF~"R^w&Z!]}*Bi$%cK/r=('E>HhUҠ%bzF7MyPUUu\3Ṳ^5Vc0m=$`y2~:#i^ΗaU6( &2TeJ VskF"#K;B0)fIP]jI`5hJ`"݃a̰+m>{a#g;,:uc'[vYh"*~fSy٧M ïNy\i+YI_nݟQH"Sd'M[ ^{) [Ҳ' )((yMzG~Bj*%괗5e6HBJ//IhU<膛xnz#搝uCurE*KLr|c53V\M.g͑|򎦱dUiO2G燎P, y'2I[_~d/]dfbͼ,>я}+Ҫn\3ޛG)43qGNiB ;61Dž<E4$'՗.rH`EE/FXh M;f')-4$s0y6м˥<1um-uxx>6a)ʙ?xFn+\֎TkվBNnl>nó/ڤ^]z\&R&i;fA 0u֪ldU}zTk/\1 :.:G 2uHԐޯ&٤ie/'zt1x]1s饥e‚iUҙ7a,,`ષRV`I>m~ bb6:O6F4;E!"ҺC.3:&v. S^m@1zLoc;<%j ={ ҏ ).G.8 g!D'%jŁ?ڃx!UNzEqlaƆL~R,9EZZrx6m΄g{ًqI)!)ZωP>Vst!5((!*KT ?$%j-bbc E?cHa#62#l$M>Ilm,ZFMtL ۷n&78*i#D 4U%78;n&:&ZqZ=(jL1:P؄(Q1[>/\˜10GSUt !e0PFlVkHhl6xBʑsZB!†B!%"lHh !ZB!†B!%"l}4/`ls?|*kR|]k?aar 5ֳqBrIhƁOg:vlR%P/)궝s4111bbsYt΋y<Խմ7,&.~L̛ JԲy,Ms0౷ë{߲~1Hb"&&>,tH=ҹoʭ*V-}.}@eɛs˟&uL?Ѿ 늰 D$BHYM}l!yn<:YsLyA&+ P~ƽ^b~ ?=wE^捂q^݃,3ɗo,ᆱwҝHh`EO-Sw]wۑL0>P:2ȉN")& +q-Ԍo3-J W=/?kk{_I`=]\qA@rգjt,Zc㸴y]v'ps9Z@ *x5SSN.}5]Olf2cM1ohݬ1@?vz=ZN&MLM'Zı3$BW $stiZd:Őغ=ߣfg%[uv`ڜELbGne5kBTBE~:.mv͹ũ/>4v0wa4L[m[Sx>=Tkyv )mLk'%6ߜ_mA&gxLFK/-=/OC}vP\\H+!h4k-}jp~XL 4-Р onf?$stiZd:Őغ=Svw9ףedlK@gACGɑL ⍀Bf5*dɹuLwzh?>FNvZw)eӍ z7wuhIjߟqĠD-:VN^ØR"n4?\;#^iiV37.rr^Unv9O=@>Я@BZ!$mX cZ4A (sG.Պ܊g58׍[;[ؾj.yk#_w83zZYYvQn uyU UuQF>*New0fH׵cXu/Ku?_db49OaJqΑp(2lH {?*ާflJ NV{|v1dc Wk kgJti߭0'X506llgCZQ@V:?%c5Tt*H91OݙKG 2|ܙi [5@nv.ͮ@֬tI(W7o\|5Wl3^IGBzr-wF=w Kj{3'P/9Bl=bR\TXOb(.*b3BҌk~/pl躜߸94stD%p3LƜgnBLtv2]Rk∢{<_Ҭ|1Ywd_x1ħнSYsד1'Mtb$9uϾvQCZ7uZ.i-f7 $4hJ!|~]lqߘI"/UWf쇞aCq<i^3$"Eu<4y1gҵi 97l{<0i >0aCIk:Ē2`{nAhאXGle3( J=W#Vӫ?йWB!I\."#mf!W1hP5i׽+}O.nt+`qj:%$˙^zψʑa͕ ;j#r}?}Mc_V1fz#Ѡj͵bZ4g=ꪩVOEF_C~@j'գ-ZZ>^ &D׆ﻋ xGIe,*JNkg{P4OpBo3?94ƶHclGs8OZ9[:0kwsGVlXˁCtҋwx -IDATΤY^VqW:Wf!\t;I'0SU.Նpq>X:(ÁNW]!¥F!M~~郖ݴF%OQbx WYC>;4!N5ʑЊty5\b\Ix%:u;KF;F'XFDKzc=7%k~^ . 5^}\ T5S["j!˵u8'ij+njj:`2PʫYo!\R%Y7NݽUG]qNNN%uMJ#F ʿbSw:䉩Rq*ado܉@8j5uI 0^ZJ{^v+,ȟV o4Km[=+SLfLF#:Tulb1NT(jNJt(i 1ŊlBt]EucwVkm,&tMCS8NN~vCL4Nəʪ9*+c?ЋqglUPUoM4*u4MEuq4 &6j؁n0bX1(hh bbb2*]/y;N1=_wu1s@>P(Joc<kV"\pk.v2,~l|rjSm5U"9f0ϫвj(:uooTS.G*Uq^ {3c]5i$"|Cդ]y5i**]T+^B6%D8SroٙOSZ+"IhE:v USgAgjTMEM&݃B!†"(k4R2YjRs4IhE0-bbcBlR ,#_ch|xLUhFLbkז4C crfPy^Rikq .!5yY4|^e -'aYBݲr=CWUfF@B>-_A=!ZBr.KϩZG@[YRcbQ Nⱍ K!&V 8KGm|2خ*Q۽2) h rS!f.]q+$Ą┊nTx^wRXZ.y} IḛrOǥg[Q( -,ϠBS 9gp9(9F}pȖ/egpAI w9K%/UN50nmUK T>-*u7VA1r ݡe9- +!aeTK9-ɩ>Q) -Ϡw vy}up%݃BQ9Okmyʱsꔎ;kiu{zwcFJBˈVBy-_= nu(VH :zqy;<݌t)IrJ3˻P!VF*ry\5"1 IDATxw|S9IRꠥ d PT܈ .*Á8AEJbM9?B(iIr|B!B!B!B!B!B!BTxq.I!<n@YΕ=W!u΅?U\hΉp=u?!MX%;0+RJ !\றΐ)oY w!Du)/Kߗ஑ph({ۄ:y b_n?*QaYV}ezya_z B񾊬Te(:-K ߗu !Dy| +UzY!^eYӾ_!Ke{Ya_VX^ؖ¼AK;4 uomY_Q)gzi!^uo˖^ v!DE#.zYRKCK^x[u!٪L,%u[/ Er[eJ[r]BQYzi{dz.t^P,^V({ y? o퐐Bꡗ =o+Y^.jWUU[zVZxvY^/:%Ѕko3Ui N<={xV={Y!G-U/e_^Jﭗ7ᮔ3޳-=uWE!oau!({,{do^{U<-m 7]@pz򼤔BQRezR+qY̳w_V{Y;5{ ? qMF, E2Zqn0 ̣GmK3f~$6 ý({qod'ېL+}{ytd6mb 6 q:hè'`2  !4J#A]13))i;( Kzť#hOoYmIi^\[~5tMUA!DM @QTžf8p` p0w]z|pv8e `/^Zvt:*/C;-ZMPcdkt*8yK.ֽ[WV !h5QӪU{( b=.\Ez} B 4coYCC!wu:uGqPs/mH[ϽX¿GŔ"GԉZu]JUBq~PN%J7Qs[hW1Uy{i;z;BcJG!Zqa@Gh]%ŪIŪ\1Euu!yOu( `N KѥS_dWKR*o_/6#ǩ !AQQ cx~֪|%$؅LaS!_{P=ʡzgQr]8G#{N}iyΟ~_9a qI_j"8:eC̟W|^9o^z`%C*b-K!_ARΟZ.W6D+Y^9<_^^n{%)z9SX?yoٔӠe{:!,[SU8}lO%?R,y@/ʇfc(ƗE@S<>+*yy2}_o}=_c__ooWR?}w?An;/YhfQR˗TΒג^2W,A8 ϮwbpOħ!xxa/Wf`ŭy: /hHE~61a;r_3ix&_Ӟ((n6Y.4ΜLJD+g¯n^FW ΦP+,//]*qT eӋtT%;5 Տ9<6tp];)z)]Ch}Җ.=йaUNۼ쵃Kg:YQ޺(EeCx\c狈h:{ޞ3X6ODD7M [5㒾YSn7᧟sg:찖6Q%K.W#N0En:>nkd>ˑ|! %a=5c+1YVwOECk֥~\wZqN` )˺U#0l L~Ovޭm)>~Z>W܍|xi19g[uiW^6zwϦk8c7r3\YXt֡؛DpDРcGZ ]t!m lW\5|MIe_3nY{ɬ+#[gUEWq[mp"#@Ȑ ivӽmmi˜a D&qX'w5G`z++^᛿V̍4mՔPidoú|QJ{JṘ|^e=jw_.EA''oMS&7+*us*CKt뤜ߥRMʱiöo6CNg%Ϧ_3jޛfu-E)_v3kJȡ|Z~;Qى3Mpx'V\*ú=jǯޒKx-kO9sc'dxα8G:9]t+I')>1Ne}?CBk٦Û^ ϣ/*'s·_T*9퓪WYYGŔB&wB]Q+̚Z !j!S%jz((u!DkgV؅"7%م9х"H !DP !DSv!j2#Ư=\B${~z!H2#F]!B v!0B`$؅"H !D`B#.F]!B v!0B`$؅"H !D`B#.F]!B v!0B`$؅"H !D`B#.F]!B v!0B`n@SyxmE1Vь։xĚÆCW$+>/+–VwysӣK9Pk%lBT37g䴇C/Ӧ; hB=(X )RWq?;n?]'1P'Z o~7 [N!;BD XAK;P8c>R0:3te;)L1EKב7rۄ$[N!/0bԥU8^ J`ɻv<~eizGZcj$]FL֦[BjOku &s2t%MHN>;*BԌZӿt ; CgښA3f—MK| Sʭ !DM+8B4WA$4w5ú$D[QߖB ̡>1۳4ѽW1kE~IhYd)Y]vlρ*e(FثIsx,6K/pmo oy,\ʍ}23Ci K9۠M|뵫J50kN/6אP3TU)ztۏvQ|y\i$?Md}N=EJNNqN$ثj jbZ2^?bMc5VB',`­ViW &~ޗy Il # ޳37=*@znj4`V[qϯR+m}FaDiKmxϱ\Rܙ12K٨GX>acHq:MV>Wpռ|^w>?=y5Þ݄m:N|O{&xމ z5͒]y6{2+?F2{rr˟ɓaݍZÉ- uG*߽MÐ3oKo2LןI2Z//эozxn~eo/\d}eS]'c[Wɘqu\3wiQO*՜j8$q_Jj*Oy/\R;5Qrb ֻyrSb/z=U6+4EޘДbO߲tzW|[ٿ;_6&(6KZ?p.w>rwTޘ52u0rY#~7e?@`s埌F=Cwwh= 蹬ogEg{acY|u>y 4.\Jq xkbS>U?>-YP͇:'uNSMǣ**|ROޞʴYviLw%'ֆ{G^FN7/FF,y jр/`) rz;-SKֳ6..Stv7NWObx87h2*j;Wg4`aQgni M+ e|v?B+G2얧4^+aYb}4c'_AK+eM1o.Wq kr]~t Z63i{NLc`՚ӧ3̲벋)u .l<.Bg66ua`emeCjG.V)bcY8EL&i$RqCb:bc}/..O2>S'%==xQcт[+L@5ڝ=l,tjE$uuJhiNvA|P*i$N|\}ΪI.#|J;E> k6- Wtv8C};F>*^DoְuOGrr8t ڒnM?FTwF[pG߶zU C':/}{`CPo[j)<*&IW£b:bT#C47./ۧ\b^ڝHʤGx(bF &Қq2Q}3Iy~p8AiYG2u,mᕹ>F76''NѴq|#O{c;ӼQ_|l6c2ϼxn/&i~:]߹,ưp=u:[+ Xtb&'Պbd(Vn'^ᱻ`?;h2ѮWC%\tl =mгI Suks- JhCK~m>c|>|>aԻt,m)1P[*h?M%ߖݖݖ]{7I-7mL}%7Mquy]|A?.{+ {ҿxiF X0o.4q1hVzb1~a!8H!7;aDھ+^ze2> M\ԏo+dq: *i`@h;[+9ůȻ>Ħĥv!cG4bt]lٓsV@ņbNgX:0fT+}Ɔ<B3fDC~}%v˶}9E\^N'6~YBLvoJ͎/fr<;y93˯Ք>Pߨ>ƾmlqt0#t?ªuZ? SF7qlt' HڀK)|K2H. ӻc?oI$OιA ʝGsu(=.ơ_ꒋ<-4k__ ә{"SMӭ0*+k!CfWrߕAt0 ߊrE'僯St67aU{znxpF7 P{@\u}a()ZfMjʟIxqS$=/SG'Ko;w5xS> pw7_Ǹ'V[ڿwunԢkUzӷ%?W)s? [,r;[ȼa>ohӞC|>o)$ ÆыVq耊)(Ōa.΢9` hN7P+;TKAf tͅU/_(&]ĭStg}孏o`1SqsLaث\rjM$OvZuK?';Ok Hk?#T(pk>on :ƑwwAgw`sOsYevڷ]`/z[`h89:7`V,e6j*^[\BaS FQ1 ~n9F?ڵi?+`ShfT;c%YܚKzEUp/|>Ա7&zD)\1Oz쵄xor&`[ v׊$7η'ZN]<#V5/ IDATzUvs`:cwOe(FE JfAڱ_GzFDEEg~Zh,^nZhkE\5*8${~>pHII#!!Ȱr:%(U+ vQ#>vа0u:Am>zMa埜md9BĦ82'6siA4kyj$a%&pxv::|M(pTj:In*n9x `褥ԴAt7FQ(sI|cԴa@Zo @QI;xiE5~ĄZhNߙk%<5ry8۸ u"Q.a; ƉNOaL ccToT7OEeXjbuʟL_Ta4kBz<5ƅb67"N$ax9%DE=&! .bԊ7!D-$.F]!By*"7;Lv{R_Jph(u5 n=7Iw4#'Rn=9WvnYd;h2%jTnv6y'riݾ3a*p*pgE!<ub 螻Q9ٙ7v{"v( 1pHF@<5ijP~aaVvR$EutE2#jKo]Om(=v!0c~=&!I]8u! !DBa犏pz~M:BJTx:ě|:Ҥr}v//38?’Gb-CO磩S6]2jq1<ҁb a\0hwF#|hr, `?$߬ 0~&q_ST2םz+u^mү UU urUUy޽=M'x0 oiGp9˟I#iwh"KCPeUHf߇ϲ0g_@06vٶʪD;rK8kz5;l8K% +&f9/¿mroŖxTUAQUz7*>Gyz:L`ΊyI 68 sa[OpQ >",̽n sNVzFfmAQL%Խ2jF=%j4ֲ)Bz]t݁l*4 g6 ^:/Qg:&n{t!ߧ8OfrV>ŕCF2f\9}u$F+F̝m~̙;Ǝ@r2zDZvn`?wD"ڔ3g+ ̟M;;^'75'ٳ^eci!VO?˝ϲ.7fJ~{Ϩhg˚-_ԓj/s~S~'[}^+8zk4ኗyc҈OOíyؔdޚؔOzՏ|9yaj{O\ʧ +Q_{Mǣ**|ROޞʴYviLw}p8ffXXus;}W?!omć|ew6oBP06d`Po|cgNa'ؐ6I G-tTFEmgL*FmjgVwA[{Uqf,xg# GyM|`5>p5|9eé -{=GiH˖!"5Zԭģ1,"&ʴYtӸG1tW^179N C#Ù:D71bKɹ ̖_R=u\Qg7zw73*Xӹ]ߤe]ͽkت^.[b_lgY:3>@Q݂#gfCD?-hhAI;N3155V0;Xyqe=TNtt#^LEQՓ8V~ sӎQo~Ank A!X\Z>"44͍˶o6W<UU1[> xf*2q6Ή|9R^(ފK~.cs{gGC5* g/uN1nl>5-f5^:Ma?/'V½B M'>6_ZaŢk&v3gf$i/8x]ٙD˖q0c1=.TFjs-̿|dsjG(#~Ǧל,>L[yuɏڥ WL*j`ذl8]nRWhbenW-[Ơ/{֠*0r&x^Fۿa!O55lysyy4A+\: s67m/} IG:o+?eovBK9+QƊ^fٮLr|21).Bl:#;mw/$2i|>;q)3޼_օ-דaßDpf6 8K?+s%߾_9dVoCF0[0RQ}}؞t?l'h6[6i{Rɱ4$:<9ub86Z_!C1烠}-xg5 I \4wLeH. _]ĒK(Ztēs> w=/@iК>uMi־>.-Ķ͔9w;!iS,֯ITW* {Ik^l#ޙWys7CK\F.G%C*pz7ʇWQ2'\O+Սn@Ԁ۸kf|jyqJ=LXBdxt "*tMw 3ӞE(&b,EAEӞmy!jxl!}}iѦs+Cñ63Њ%P@7l͉Q%{F)$ {'.bŬ`kn\N'ZqŊ Kp;q8u,AL-=sAҞ?i۩kf  r\hE(YកE}+5pOPڞe#NGK^G(rp9K[@OMNGykzH'CBT+y*Fzljc& UXׅ^PJb"H](UUtU>]׊Ν$E  Ş5+3"o9?@^D ]wSĪ8`fo=n'cdΧ-{H=zGz4-^ǣxjזmP T'-.oLGvqToDЍݨ_o[m@Fz+hP{zAVNB׃>#޻ Ff J.- ;;37|Y%8`uMi uhcƬwIi|%3}I̿i~*ah?rrUB7@tJFuyBjU4B{?ķ~b²tZ3_B"0v6{oxt(QqRe5%R˝JFEǬ)GGl$$v(1 /ߪz V'65g?`S"=5@f;jd.ht-ۋnaU[DQ=ɣKePѴew[~޼U@|GQYy@>p/-pG=Q cBZF]!BcB* cB!B v!0B`$؅"Ԃsňs-;=?]_@&BV7lD5ͩvyOlFDd&dY-qxRGҎ".j-9YӮSWLfD0LԍODD$~NHhh@e]Ԩ%> L|b323ݔj%.jݖODd!j(l<7ZIk 2LZ`ﰗ`B#.F]!B v!0r0Yzx7=Vܱp2'x-[!ǃErO%C% <6inh qΓ`?K,\ʍ}23Ci KPkz%u}J$}#e7WNl?~ u!C䙬F^;3,sΒ`?KaadS0V+֓g1o-<g~3(7Uy!L({uYc݋{dVwCκw='Ufp+;q0͝yPֽw~rk߇SnĐ(.ml+w/,Q꺫[#cN}ʱëj6tڅ(t|A?̶L\6cK{[`z&~OEG?76`GxXoym ^^o1sfQ5U?}Ϻg1G81rYyrSb/z=U6Fv :%. oV3i/uӼgzѾS[HN]BBc VHqM#| 51*p1w'UI5|cFz*ЙnȲ'j9+,:p>ғ: yY\gw0hؙSs3|z,n()_r(-mi/}гۉ͗K%g0 _׎O$jH"΂SթCVP*i$N|\}V{zB.)Sh-OhR»ѻ#ΙG(!Dq2]=BBC ? 7'N T+E9wm)s" smԍJp0֌?1J=3YVXih~"fs_*؜#;AA#@*7([mZnI%R|T>b cSBZZn13` ^ޜ]Nǫjj@<{ԍٙD˖qW_ Y_Zgv~E'!J|v!cG4bt]lٓy[ymZnJT?⥗Y+p>߄`E!gjcwNK`v>~;ixx|lBC>ԞBt3 ~EƻU ct$%,?dC_t-sSHH. _]ĒK(Ztēs> ԭkO5Ya^v(-Oͯ``jZ=JiϢzG1ˠiygdڳQkȏY{}ZvZuYy@>p/-pG=Qq`V!B v!0B`$؅"H !D`5J549=Ms$E r"*D9NfT+ vQ7lġd4Mvs(- )J]Ԩ0kQvrɰu= 27ZɹbDנ!d }&aa5P v'ajL!0B`$؅"H !D`B#G&';ݎdJUUCC[9+NI]Ը%6>:ua6f(xni8IJQFfgw";c'%BxxZ]=w vQr3o0*BTFQb7ؑvy*jn'4*.0 Bì67ZI:(!j1EQ0| ňg[S>-J]!؅~I`5Nb]%C1B`$ˢy6dax]YM_?C3!#Wt$w~ k*|u&vҳhNV0i؛c޺].eé -{듿s/6&_dR6A `?(ʋ!6&:cB %"3ˀ:]O~Z.;›Up~_-djݾLo亻SCF/hGjY~JN##;C):MܥV`iNvA|Ftrݩ7Q񍺍,wJ6Љns_3У(z2x!ۊlty .C47./۔l:Ϟ6׎m2bT(8ٓ_ewqѢe֭*f2Tdx\di etWFAM͉Vb~q34NGskI{#C1uah3Abj@<{ԍٙD˖q7c1=^uG 2qq_c{`2{:яI7sB}&3Z8Ai3/*pZoE}6|[>v[>v[6a?Mhy|Tי-3I `XeWA蕫.U[umZ\*R"m]PgU[U[-AAdBH&sd0$g&gq&ow99ӵ OO{gOe6{{NT&2t x3/fTl7bwycLޟ,+b Μ{߂AeNb>$oͻٵ-b[~~LnG)JEzvUS,c?ۿL#s8cus=zdaљ3팖ЗN77/1S@~6maEk0lpDvo1f~A `7P T5,jӱX%դ̴}5bVo;R=xE,&I&jR,\bb{>cI#Ҏ(,[~MqM#vi˟ܤqw`:&A`纤%RSxK/pEDrFҪ<ehL!mò̆.`pu5mi5M SXԙzK ˲^NaWE/(`ŲTV[ĥUXIeV.[J~A:v#ӹKw ۶~jLK.x/@^t:b viuPL;GhFJHz |]ڈo`"mA5v`1 v`1 vY1Ҫ,bwRu3HytփtҪ6|-p #G%rwp ˿^†pXYnOiU۶nf]:@0ϠٶuS[&;4b*)[0~’6 Zڗc~r7s$-|%l)z3^W"rׇal >J3ţ ̞p |igf7[/H]Z qYi챍̟2 +&#{RhU,:j;MV:7{D̺vLn~B^[k}wy[|ǘn Sg{t-6m[fx+(`o5\;,7~Ծ=Z1gxc>}e&/ow(|g g37hI7?ן7^.y\އ-[Gw&_;y)7_3fPwȶAd{X""vJ*|SǺ3η8k9K;&pr#jc᧜ωөsoN>T-e3nM1I\HEPw7l_!>c3.ikcBﰡcp֭dݟSpPxa&,a#!k醍oӼ3 O{3K&=tjv잞sDl>[}J|MӌM>_ecϊ$? ldO.٧ug癿).8,WxU|:%;Shz>0)b uw_DӾCMd|.f_-;ض?⏟o<Ƙ?)XVNe>9gq]<+ϊuhj 7_cRƂ-i'/`PYmc4^΃ ǟs܇K8[Y[YG(ۘ{8̭8^`W1(>g߿ҟrYo7M1M⒢Ov}@^ѽ,N$7(إUAJzkRlO ӈ`V"Y""9F."c""9F."c""9F."c""9F."c""9F."c""9F."c""9F."c""9F."c""9F."cx5(.ƲnA .u:dԧX"dM]UIC{ӱ!|Us+r_G]n=KiK\ ɸʊ vWUraضM4RG4R:v#bERBA iߧmT.pP@Bm/ i84)%,PmYߨO3 ާL.Ya[ Lpէ^hHш]$GEO}*(%+A>T1Kda|iUR1罿tM9F%}q8n8{ F]60 ,>c^Dcv;[xJ|\vY(}" 2;>{YŘSхY'QKvd:byr;np)V[,cY#l<[c`Fvֹ.c֤x;ti*)`_YLkn{?9?<{f<&NgU vɒLZIYC}31- (K ¼dM(es}=z1L zt9!xuq&Owp4<m v9V;ku Gll[fߗݶ0}/~\r9ϵUJ'G5O,% csbOԮ^-o|ZƆH'8nToO+.cp.}3#Mn?}UO>' Vvkk_odnzh&#Oj><&[g0wγq&^}d€ai<^O'J>q//]q[_Ngp{ml^7U6_} _˪56ۑU̝YmI4G)%+ ~YwQi'2!%(,S.>X kϽ| <\-$2jKŰËx:~|uԷ% )[w.4 .w E )Ʒ>Mgb" T%\m+w˂ ;B39WS)FxF(|{;;l萪aZƟ?+-;wyɡ /m+i aTl+YVCS 67o`cJf|%s<] ;b^ F|*ؕg`fW8~ SN~[y~9[훂]#"O95s3*I2N\{E$:β1n'[ bDj2 nÒ+~SEyWSsܵFxu*j'$ژJ1}ʙy/`s4}+2G>~+rd/mnnlUdm{=+uTT&\Zb)Av?N,b:bmOsD؟p\'3GLymFYu v9xx\UnowR}#wm.)wT*g_djMǟ9}x%>~7, Ʌgue+ym–Em P ʊJb9{@/îzplQΚ?浇M'0Q8ӛK'O/soS]tQ)F#grc39wޅ,{IQ15ExΌ9$ޞq<; zdc40n>_}y_wHo<5GD0}g@ Xnq>̯E=p[2.;c:oX.;#kwOk.ȁfW_,lك71 ƶLh$/2Em?T'{<&b^SpՊ%fş;߇۶E/H0f_2,i /@χ, ӌDq@!\x#Chv^25"/(|XeWu@-`:˱465-KVdgli$Ռ:籑pU#bU~kDjIyX$X-5~QMuau-V[E,JpuPKvl O%<1KVhlySqK.١AO%bDDrFqӲx4nh)21< PfHOs]2./"\]MAaa[7!VfHOsYnے6QXԙXV{9avXEr ;uRfOs]2cQ' Xl);LlLʊ\:t>md}TtgǶ-_Rx/@^t:UD`*묄=.2Yq`M{\*㒝-k9H.jƬė!E\x[hn7հdIQ7#r3#F+E$$-d439ݱKלDDZA:,tLU~\̹xuS٘Ǟj,EDrEkj[9ꀀ%f툈#x9:Y+E$]锖QCa{qd5}6Fz|1k˔Z;,F};\."J u3#X<':gC;DZxG=U9F."J= cwZǾ#Q{a/9G0eoǃG]D2)Ff:^cw.Q{b=9RY vg.YA}u)cz;bW)FD)Y)&gQ\s<ܛgtcJ1F퍽 )Tsw`| LKUgOP%=F5dZ:+pCNxH/Gu*/| tO򌈈[F=x`[o9.'2"O5s9&扡 d!Pj,Ξ$:s[DF: NyطÜ!-'^Ʉf46rO Cv3.`OVvIVI6c&΀wrgθ9`{t5UIS,usE{b@: ugh۸k."!ը=v:Xl{p#T5t}%c!ԹZ:B^D2%U!񲛀nY2ק >󉈴D@m*Bm7vk- ty9 WHkI'ܝ :<݆v;E."6t݆/g" FcAب IDATxwxlQ[^,Ye[`lB!$s'CI!KHHZ6{,꽷ݝIZdI2;3;mwfDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFa53 0P@A>W8 6"""""g0_{{8PlZf X{4bDDDDDmg@x6\.'9wsa` "8AeEy]rcvu@']aӭ4=]w>[^ֳ|_׮>9233o|wceiinV%DDDDDdtaK4`ڻ=CM@׭={? 3dl@N noonDDDDDd:uۀty@m̰Ìu,xdlݏ}qZ[[~e.#n[ۇ .=<[`z^82cv_ALݿo3г*ѵBf}V ACYxXv9'aaa!@g™w8+]Ff5s_w61zN"""""2,]!@]w0sIW!X#fzf `w2"""""~vCW tKL`~q5=[fF%XbX`YGFDDDDtft:r}>k#yYޅU;(̈]A'Դs: 2i}ʙQ঩ErV HzδisU53y`\f6X43&""2b̺?uLDdxgkL0Mn8+#23m{ 6KJ\-I$Qyƕcߗo̼)@w#""#,x&ɯ,Q; tz٨fm~}UƳ""2\͟_3rn|AnQ[PX""9%WǗ$y+;&\!d/~l9i`sPT"8f2~>9 4s74kZ򎓴8RYt-|vufc/_j#Y+rh_68n-߾Oz-.|FV~=s/仏|Yq?/~/ ^zg_xg3ڞc| g<FO4Gkh3tT7Ͻ(b~huo;`テ3Ixg7@9%BO2;Ф~ӯxT/]Cxu_+F|{3Cc2DDFʵ7}OcZpXq]4՞;,x~n:oI-3~.QFeGbK%K30OE 67tAd?%ŔM".j׶7ʆ:&҆Ilj br{/>>k :||mVVBi8YDi2Eugbr滽FDƗ+subbu5g;?gFLާ~ODDF%%K}˞|\qYa4>aXm jf%)N\o y߲N&:l>=LLps+ȸe}_rĘ~u#1zkgz7&F2uLg׷53z[^#IELLees5A&{r !SI1LdAy&'KGVkSܳC9LwaO[kn2! p'N&ŀDb,;)߻#md0,tv:O]3#"@I _g\ywEV Ͼ2YoWƈ9ϊ0X1Ivm{$pݒtSVrY:pMn8@=\1 l DXqk3K&65nk .J_ǓT27 k~+~2G#-gu[<?v)S;9 vv{5W@DDLo Tpr_r$Fieџ|q{d N:uԝugp L7$/dK"y79?趣lUJe|ޯѩv$ jnf[[)]uûw&X'qWeSp͵8Po@G+Ό:l?J{lnk|ffPwS;؂Tk`tlFOs~W=O:#wE>SI2ΜgLW:uͮSjh:㤑b({>1uw.1Xpξ ""{q ?72ݫLj[?ԛ~ןXFǁ<ɣk68wtWF;a\$4cn7Sر#%)Q 2""gToyKDDV0]Xg0;#=lЧoc^v?Vµ/< \ _NDDDDD|/Œ裰\q$"""""a_bzO}δ~OI{$Y+?ݷ] ,bzǷ(Xy w_fFBs㗿̍9js8fN[k+=][;n/4Y]2?xw_eI[iuٔU7˘?/*-3Eya㆟x8z=Ϭ?^ANMZ ,RN3-1[ug2iͭw+N%WܐITDDDDdEI#<߹, Bڏw-ԛt.?d4ױo^-}*sOQ).fDDDDaf@|џxZ3X,6]3#"""" 55 QZ]Vwe1hk;38Iz$<+MDDDD2Œ: ! xv> O_FMkAp3hYzNv=s%l<Ӹs6s 3XοB:" f}M@35tW.љϽ2ZfDDDDD䜡0#"""""~IaFDDDDD҄fI_-.8K 3"""""|zYYY/'/"""""~̧a&11ї?DDDDD/)̈_R0#"""""~IaFDDDDDŒ%K 3"""""fDDDDD/)̈_Rdu.Ȅ3{0l~fb|] E8+:LDDDDDŒ%K 3"""""fDDDDD/)̈_R0#"""""~IaFDDDDDŒ%t6Q܉뢈6_`\lqNELU{ yni`Z.0mf$NB͔6"&Jq;&MǷp=n#+ou@yl]'0f >ۏof#Goc qCTjM+5`;!V7770j"H"h([Ӥp/Ju De!6>I8|V5ZTu`G<8 y9i$;'`eFnyj_+#""2]{cuN1\0Spc#ܕR"#95ۼcMg8qsØp7CTUQ֞”Ǒ0)wu\Ni]vJ]qLƙAs[p O^BBO:qva y`=  ^LwoyPDDd$(tsivté:+Yε;)Lb٪,:ck h78lMdEI;Ɖz;m8"㙞AOQLN ZZ0'őr%$PN'88f@ dJbVRZ&甞]7!,9x +O!9#h>E 4u`CJBnf2`kp=7[8=42uJfEI W 2=}e4 MdL84{>Wfixy=@bRM puA13>B&pm@6Hݯr٢"Ϋd*ODDkǬD]{ #҆Sg2KBJFiSH$w`OQT8pc1jٸd k>xꑳ0BĤKf % KBhfeuX%r[!aa8dmT6#DmTg~֥5znl=v%V{NP eiLOK$:4ZK_"$<c;Y!ʝAD8t6sxQɹr OsWCOz^?aGobed'kf⌈wf!̟3`+Zd{xsQ*{Z&nLFxB 0NrI@R6gf3Ɂ6!馣'0Pb{5u#9ؾo6B@Lc3iwⰆ|.^ gblYp ?orglIqڮ_}l D&M5`6WS A Db$YiDg=IbK,d(,@Ф9\d,dF^M8ن,;b^ʃ} ~;ZWy|sm_N_'Y7ƪrJ(,*zwLi.%=~k_gwk#L ;3WfFĬiga/[&MԛPȎŀf ̶J곈:]^AlIkuG ʨoÉ 8U'[H8BMc U4⪫i Hiw"etrR#35ÊU`lFAW6q8lu+q >]Iўml.on:DRWw|<)Z5hDDD0ӛa#,.2&fji4b͊XK-8%@" ؃ˆMJ"):돳mw1Md֋qLiY#&&Ք6zlQyn8Ζ¬3w4J@bB8먬i$`&wrR*+(;q.g^?wN`|`ƸZN8HBC26PɽƓ埾 %.t(͈xCaf a/T92ly6]RwGn)F[8~<2BuY'>FH.7b 3xvsY=:`~ ~顡&$ eW>^^ )ЬX5ኈLPU̞?a: IDATBy@ 4vw mˣs{tfǐ#"ҋj: #"""ŒUCqE5N=9[t83HD Y\z,_CDDDdPj0#"""""~IaFDDDDDŒ%K 3"""""tkf9d0*uS ""22#"""""~ZfK}]PBJ9]d "%.hIuDDؼE8+:LDDDDDŒ%K 3"""""fDDDDD/)̈_R0#"""""~IaFDDDDDŒ%K 3"""""fDDDDD/)̈_RtN0/\rS;,#|כ(<~|-\f kn:^{؛>%Ws 珜QWzN>z,[s 70tմT "7^G}UXE.?(+&| ̙Gn56p  mdgrHCgS?d$r>pV5>?{[&vd=LlL] .fǰDqgV3v6#%~KbLJy]2){NJ4"ۋxp'dCkY4}_}7ll9=vJ㘻` ҝ/)?y1rRB)畧QmZ\2F$_L`iZVqח޴_jـa?[oyK&Wxx˱Q4_|%GEDDDdBal$y%}z|;)G[ DMLaG놗ӳb_U̵'Оw#NEK z smYOѰ f!;¼ ք{8Hk|i8,Xz+Tmz1̪5̳CgQEnh-*?lb,<[mvqzFh6riwϹP#|KXu×sNs„)p.ۖ^'y[n}{wqęt{ڕũLNoE`5 4:ݒc 0l6=ʚƍ˟=/\G2,†eY-]Z cW] :5"_=Exz.Hsρ.""""0[fL5|cAlSeJ>MjIo}krphLpդ kx1OZ"sXɖ{iM^Ks2C|yķeg\W9 S>?|Oߞ}-]Lc.Kw~8:|dc浟cMD!%qg|}y`Fӫұ=8Om(4;h NJgx怑w}F瞝ţzt6qAKsCC)=;dP:7?,}KDDDD|d ̞?aBy@ 4vw mˣs{tfǐ-3"""""2Q)̈_R4f6T;6oi\p йm;F}j""""zQ04kmi&8ba|uu4:/.2ҟ43K 3"""""fDDDDD/)̈_Ryl&ol.u7r.ӫye'AYs">-8vA 9~z ;gMW2:6>6ry|vԡ&UW,+jۉ BIKa4}P̡1i:/m2kY>Ovkry_COnk#'mSG-pau-N`¢ /&a*>awTk7y%54vK#wíV8^RCCK;n{qgpԮ[ E)YV̮#e49fKfQ,t8}Kf%<.-*e HqeD1 zV?Nnbfı~a^Z[)^5gfxE^;Δ n`EJlE}|]@/jJlőZZq05ב#d]UsF2vʩ5y7Xh?IމHc `7s1sJ_fkyGN:5\Ş2Cv _N<^[:>ڬmdՓwN}F @Qu-nH1ñ eW2ɸj&o8AU~ٳsٝς9I4!2B0?' K[{ogO~ ָvf#֯ez3əAgA}g.JUIœ6%8{ e7J<[2nOQr~4'FGYGލ(wlw^Ќ9r`"4WpdZ6dM`ZWATt&*8Ta9poacpe6PXXDJl ̳LjnfO(-Ϝ>0HKbP^V `RR )ōQv6Gy㕴œkaJ:&kL<6pU?/{(iT{W]䮫${&M‚:ܴS-WD5$"m&"fi#鳘FX$ϙGz};8ܵ.FQ-WD%PuEw-[;#mr V^I'>HJ! :]xth?k߰=i֑ PL?u:NӗrIq7o=IQ\b&ɧGz7BYY fQ=[]yqyx7?)r)lrd-o)Mf;5' 9Ad ܻ+b8H_ϋNrh-3+Y̌O1SX<9=>j6QXgcKH!VH"'qn828E$ٺ.BN-9==[Dﮢf3 GC)M<-ev熲m;.E&jҒ綖~aXƦ(iؾ ێ#i&˖"iS1t`dIgw1h\63f^xAOo4S?7%YĤg7D3FT.k.CդۼÅK 45]T4;T񵟲l7Å ځ׷؀&'2{f"ǷBLrOFgc-+ưrIKy{RV@s{.tMR2Xغf 4Jq:}p%Wt=r!r 4M,aӘ9Fʊ]"V-__Mu6 :h0 ̖by){dPJ*Bh29f|͍0&19z7U5ewdXVJĴx1Bv׆mU_GiHL" `8 XpkgP_Zĉ-t뷅so{F3?2vltމA@@jj!Gh}m;=m5QU[MLTzHLitC#]WQ֞Mri)ul?ib؂ ~|n GVJjadA `e=ԇMc$ղ(Ji>?v˽OAEcNJN&Q9 qp3|Ƃ@AanLkK)Lkѵa|-#ԴhvVWQZьYR;(1}|3Vm]¸qPG#iIƌi;x千4TV8y8ݱ-DY$%FYi nlEˍ 8Ny9uG`o@g7k^[zI*J˛0JkpNgrjuVRkr<1~&(f!Z@eu ,҃V]I ,5 W8:j\`d^>1`Iޮvڝ:Kt5"pÍ fN:ĻO!5#x8]_B &-ë E̋%g; 6:Kt-*|q32 ,5];)/:Hg4k;bM4 fr9mc:Xq'i,=I3x8;c[%W35 "Obo􄐀@¼T좬2X;#[y#t:)vl5&ͥT:} IW]-OXUkq0O޽ޔQ'e%T}JAȤ4Q^g4Sq}qqJ`=xѬaFfN> TNRMs+M#(4 #[d&b̧ـih70e)Slj#'ud:!16'tԔSa3X<c"͏{ 1g@IQNG"KW(wFYBb4)~0.YOQa=nKɽ܈ )!lT0wPZ\34Yw ="ۍ1:`;Lj {B2b1js036ޜM}hfJ} eZHl-BҤ=4"&3+;@5V6aDLbƒX~w|l#\"lmԔSH\pEK-䮺y1pH>:E,GQC$Ο|F8_itVQXҀ5f*]x!sb<4!">*NNV5Yq? d4y{v{c@s-M `Cdvl0w-88:/V9eW#v/po晷 ~iʰZfS}KuYGr_ɥ3†ƘeX d۾i9F9fa3l5MכAX/n{| ,fҭo~U`>rAI |ǧ;ujZôFfOhHn;vGJ恷~cׂH3d64; 6SyPTo6U3梬$3?}sa,u4wioݖjNk15.iZw7(RE:H&""APEP.WED(EPQPD* %)^B %BȦ d;d|g9~Ϫ IDAT=gޙ3)=%ܵԺM$ #aOk뇗%opE7vbOfli7xz$b߯@R}6O !vj닗k9Syb-GpaDI]*`SlyjVcjB OL :Etúh_x*K_fj.=va=u&^[ڙаcd&ow]&_ZPrg٧'`8a ;~3l*Zhq?t3J(9ΠAy%{sCbcƆ*̘c 7=_5z}#7sK¨FБ,7LJȨG@:ylQ34G&GлHsp?=MҶs=+&,@f2Zdj(8xPbIJgv+ux;> }Ha)Zھ+5v!<1oCii{ƻHfHfhdo]*u~D <1BҲ׷Y0ZIf=9 5[vPUxCHws>=:!JC6wLJMFSUT]xe7Dƛ\?$O.H?1t=*PD:8Ŀ Ƙ>5n [ġ }$+Uşȴ{ EO>r}%g5cef9L:q!ACbC<ղT`k> }av-:X;űS 6HK ;ǻHf#@"-3gpN=n f."]a[OnMa~]-ӓp1%/-ÈQV9QeiM Exu?gkc@pZ9t[0 t5*^9 QZ#[MSSJ7x*u+A2XB!s1_5W B2UQh[Sص2 >E|l"QQ 5>Ǯu?N8i7 B+s!c9+Y?Pe',`m\rZ;S6H^9?G?џ_n]^9|p>oHL:54*MlIʛ-f^xQ'3FizVˮ;YҀ\UT [S׬Ɣ \~˟|*/YÉme /I{ n8pI)Wx&fG5 aiYp_IՔgxsʻb8fU-c8>܍;ƭ322n,J[^L`wm]z_ ٪BN=46Vf{xeY==b19eǚ]nZ#ΰߕ6F99y7r2!~z{V %q '3ڮEwNJyC fiŻx2c?LԪ@a'CfҦ۸ =ގ#fjGfȆ5*ݕl-$Bgp ?}ևj5gWiyQy˟o_zxroY/R/5^psʻb8&d֥͜9 TW7ыLk.6\[s^r R.t2nES bք"1ÄٻA%zyxJڣef5X9X3Z WW)|wGMfYU+aݯFfv~r?[A^\-/O-yI&3ڮfwN]y6"=NMb';ny7Y.ccyM[slN;x@ 5q]z!mT9Z//\@~ޖ= &d+#{!X'@ @ D$3@ )Ɍ@ @ pJD2#@ @ D$3@ )Ɍ@ @ pJD2#@ @ D$3@ )Ɍ@ @ pJD2#@ HAw[ꢪ.;49Hk1`X0ziP iAF9SA f=7O6()Li`Wt%TP\c =bHc4z D͉[fLލϷGd/<ּ/mI^ΎǶ_S- !bH5ѐ3yX0||+Vs sJ:He?7B=?%#L;@uPU˸B1nO ª =ФF 9wd'qZsL8~>u87QT`c2"yU4r lQֵL65x @0ZhL]l=H)^>hAW+mîڲ*c% $idX]EWuy VpJM? YI1?5* ܞCqrc/U1?d+.YQr3y/-i]_ԙ~ f\l48ed0#oeLw_-^;e4\[aaUnW9:k G`>1$.8Qd~^UŚ9Y+Si'GoReqn`}r_d?3opE7$3R4:?±c Bk6V5D2cL.=1[ x"4ur2.uaB PpWUC}o5nL/7$qq{" @VrI3ܓP[ff-GpaQ|{wnOm_ L?ßdzH2{UcM-33Az6xdNpXN'~-#fX6IpԖsRf`7sbN+o O9?/`=OjL @\XpAGƞw]njg^lQ2}K+;Z a>8~n - -f]'s5:f$ r,*"_ G,3"!Ic,븩cT*j:c-LwhX{1g&1ʮ ud]-i?BVŧV֞aP%35汵GU~lA>_/+kg )U#]?H ί|?SZ#C]b F5d 4rNiP!ay=9 ;l6)>p'X1;[qRSrldo洞 XWK8|>|>nvҮeLŰV\{mzK7]'syuP2cgi./DU5I%!!{lʧ%g_G=6s5o𷂘b̸PG/{Kft=]>7: *@)j.˒s|Y_%lx!j`sQRPb)6cUJҐCpls9#oNv hK  fyoҖA]NMBߧW}֖sJ:32*0C7*#Y(,!jX*~rbin` NMAտkXo)вRRrd9Ĺ9V٪ɒHf#ޙ L8Sۂ- DDHWm7Aƫtu;_@ Cx7c16{4 Tpt1~NSY?PNgvgB^Tw Frss6vW 37;CKKԠmN-cצC(0 GŒ^W|l\1U%i0 nps5i=U"VdYk9ER =v~ 6톡Sh&6W@*b9}kC[I׿k\oвRb2懲8Ǖ<*mK6\Q/a.TAE]>|87~HFnUئwo J/;3E-33ơX}]ijL/׮5&A]<|$jʎ3ZffAI3޵9tA^~6Lf 8H:r~DmI ?C\-Yp?XxN/l)acKu-2ZmϷ&<":9rmyqLK4d]̙ڰN?zzz.ćs@Z9L:T74ٻ=JhɌΏ^u1˓kE剻-[><Ϸgd/=<|Xaw_vLuV6w`q9_03-t8:?XZ,Z=/HhjOSX5_542nHպ90rHֶ?LmXѓm￀ZABjйZbk%(슮TLZlK58l1Â[ ܘkpd7VT)I:&־3ݛAoW.> ](Y;U6;kЎ؆ (iMѸeEg{+Nnj޾ѵ"\^~%aHMѕNcU܍>)dlj:/ariA1Ę".y])їH&.{# ɽx%\9n:Rh3bH.Q2@J})0[gy,)w=)i;2fe3}^T/`yyW^?h u'VaUl{D][`.9h\QW@F=hjwM)e*Jk!+`*̒r*;ve̲8' Ʃԁ Ѹ gW^#)xFB\\:u^Ҷ*CF&x<+vaxoG8N"S\Z8"wMP(nYdC.GlOwxU'ҁ IDAT{?TK%Ӆ=p5!78r&5tSmy쏇ж|)d5m ^(^Xi?i}F_%4Y@b~>a3Aj :E/]1eпq{"bCJFJ}6Dd]Ǚc"Z+[ʵXUDIh˘UqN`+"M&~??5=tdUã]At:arcm#YGbfA⊔ӑoKxq`^gYQ`c8u_&#Aݹ<^kֱܱnЎYs%#ޙ"鿽vj|Zrֱ{c3WP+,ƌ J>_~ddΎ R}r26p1ț+ӻjk~3Kz/ dϱԒ/SRSl.jUjj4^"LuҶ?ж?1/`W嶫U- i?KqbB)j.˒~q^v)̔/,le7Znr>JptK/e!jX˱;Uv8fˆd:bDt[gzzl]%'zEl 0^݀Zŧ=u.VRmktjy6BFMWX8*@{U NlZ(«_lkc@_s[0 t5*^9 qۅtҶ?mhW%|\WMPUfZa{YGdwGBiq]R)E_Xcj R7W3UA[ waZJptK1MpsUTbq;Vrl?QUs)sq b@ױ'І1"* QQ I0jc»Q]u o'Ac9U_-GNk}S`=?SF@%Sύ1kWxD-w3tzߢSl76bH~ q~)ftW00&cʕ$߸{cLH9깘QX!m?P#z!'&ŪQ:t:2gq-vi%5NWa`4zv#2U)bkSf} Sp>f<?2i)#xabl o|!) H\P,"|^X[~h|s4]lųl$Sğ4PJ.&Fo5D6b.sv_Kkkh.e(Vwh7- ,S@<9E6'R@ .=q6j*.p?oKlhȖgs_ @ #Ɍ@ @ pJD2#@ @ D$3@ )Ɍ@ @ pJD2#@ @ D$3@ )Ɍ@ @ pJD2#@ @ D$3@ )ɌtQѪ. 8m2CC5 j~0dĝk0[0X̸OT{ԭO?nolAÜ wF{: egx]ѕRAUts'fJ|=/;GS{*;\q &%#2kӶ$lec/u燐m1t*R5o?^뉚#RYql;?^E 5g\ Rh(2`s z\t{[[?b`c t;a&:1OYUdHduv`S]E|һ='=/+*w)YeĆ* V{18A["s -ذf1^qgr Sb2S sζeEv;Hf#I%'Ft»S:˜[N0L^*#:c~VCq#Vys;/cdJhZ&2F= b#zhMI2tK 4<~rA]/(Z-0ai1=1^EԲh˶+rE#OKH4tUX)s@A]*=w8.CB#P;Pu>;̲ klS[q@qnM1LbÚ x Nj%_VJ{am?"6b+Ʃԁ Ѹ gW^#)D<ѨY]hK㡮 CVrϟ¹jTߦD:Q-'~a +:#nFѺ<ޕ"hTG2t98fCxëbm<܇{]5%i0ŹpD;7[#jQܖ_nf* m_}#aRC7X0l8hW D%ضk5 7n_u]Tk>%cEĥWAx3WN@MecD.qtA;@\MHV ~b[)s ft<̹kc"6$) sR Ʃr(aCɌl291M #Ө j@ BY.tq0n-Tko߾#D3~|aϩ8PYصz'P[rDwoIEB0p1:s/uyn5~:2z{ nv^s]ˌ]s|'6<F\ff ,+d|8.qkbpSWۚOI9>2T,rPod!3KՂ_`~?8>u[/|L(ɜ/ǔ}5bOj0<kc1cCJ2W*ذa*ذLi}G`;302uXqSQS3;z3(T>=u&^[ڙаcރ1$qq{B*5~G\7&3y;WO|syd ;зٻwYC7S^16Iicl,5u8k[#eV4J}g Ʃbi{}#ޙ"鿽vj|Zrֱ{c3WP+3..*-|} tf+na޷4 זKi VIJ@Y)j.˒,`?LJz YS 8Ŀ `͕n,  fyhP4LJMFSUT]xb0?>{7~H}^[ġ 6}$+UşKRE0nv񻁁l9mc/Je41)+ d :Y1AAZSj2S4d-TYƆ9$D_QD2cL"-3gpN=n f."]a[OnMa~]-KDu?C*\\arϱzwD+TSٴPWwK&ѩ}tspT,IP%|\WMPјAрܼM]c"b>lLMA*jGȺ{]\ܧ$hOkx/8i7 B+7Lf2^ـ51K-M~bkL)&{BElqnm,:֗fK2NUlR&#?ɌvBT݅Çs|Dhd֑QQ}mzfPOTl1$v2<^Mq4l_kWyNl̠.KxQ[kR43޵9tA^~6Lf 8HYMo2%/ ]s) afIQ c8>܍;ƭbWQ-' 񥇇+7ˎ!ŗ>S 7ASo[bUk9 ): (zAm,Εejqc"E^8D2cɿQEdOv4ooL]9ƞj'ٜ8vH:@ k8ıCۨs^_ -={L6V4IGUO @ 8%"@ NHf@ S"@ @dF @ 8%"@ NHf@ S"@ @dF @ 8%"@ NHf@ S"@ @dF @ 8%""7 =ZEU]whrb>a"fDۏӂsr t ֣&PTf674  \o B%Wa)Mjۯ}7%m￀ZABjйj5 +g @`VB17%v k렊7Gq῅ɑ:`Wt%AqǗg-%`, y7>!FX󾘶%dRٺ`ϋ!DS{*fD͉[bAt3:mk(AXRZ [^>`D/0euii)B\޾sv_g" xf>Κ;C1|8rb 4 1k9$]܇E]R0p,7o3bH<8|6{OE1ᆢk%pCŗp7- i]_~0H9r/Z,#\xHlz;GhZ%*eB3^F2Sq3R⣨w Xs)O(Y-+ t6ȋ%G{zWY=4f*IJ S쯫cѨL65x @0ZhL]l=H1Wv~+Yy.b'ց$HymNKMږJ#[*mg.MLAT\͇?BIC">ݞXѻ2K(@cҹihczh`^χךԞ{rƬJ,FY;`dGXQ},_2Ǘ{iSX_=j0l5Z)jY c{\ׇmlK#o4я1C|Pbm2rۖҲX'%OxUdHѿ7m˰/LepԵkr %# 5:>м| /?M^>.gPL1 IDATo.:dcvl90{F+OFGc ej|kVtڊWK-G?'s= ` f]8$zGvȣ*}0ի4ZwP{j` V]h p|0-#$UrLK:{bVŶǴ5%={|( ?w]/ex/K-:@e]^EhKctۄL?ضeC< 7II:Sy퇜cy/mE83 =W}au!k x4N%l]=X Nշ'5 sq|E({W~>ѯFu[/|LX-k.wTxr2>5S1H|e臩QMk 8n TEÞSqxkr񨔷bf _w$6k~:2z{ nv^;bvFKԙ H~sstŇW)c|b֯Sldm`ycuG`G,*ox# YŃ]6!Y~ CH,x<h"5+"=->>pWNSϏyJ(/6Mk14w%ׯ棱d7_xͨ5# RFcŽ仸o؎ge[8r} ?~/.wJTQ>GxGRmA_`jǣwC ҜeTy#IԪ߀E,aŮGKzZÐ%^u/-`V:&ݎ@Fۖ[ 28},~Pyx:ddn@޻{W;zi H98l.GޓMHΜقq%OBrC$=599< xayG<5qwbͤ{1ԁ%'0o8f)V(; l"Ttzg|Y\<T >"g'bsrw$6 +nֻVdM ҝxT6F;q2r9ؑxi WW/t_q ;@ꍧVސtVnG`cۖ+ 灿c,~PWq\f$'O8jU,~ }!_mdF"-3gpN=n f."]a[OnMa~]%]}x׋CP3+P8l,z?櫦`AZmeLMA*jê D֭;ȐE|l"a:i0^;i.%w Frss6vW 37;C$-_#׶FyoKhz 6j1uf؜ UA'dY9Wqvr;)#cB׸nNoO=11/V:AA }pm}*̡oaoqv ,['YwxS-doAdʐ) ".TWEdQQT@@@(@[FٳAәy@ I:s]$<39wΈRΈo/u '`3C}ַ~WHX~-vk~Ws4wԡg=w}_?ǔό ?Xe?1gpxL2>Ȇy#ϸ] ϺžN<yQʬGDu:]a ;.YP):1P$oEJtȕexOٺe+^1l,fOl`!LSѴqc\ ?7_xEhcxmK"bb)O00]+sc]f9Պ8?hM_^>' zn`Wlb0OE{t.'c@F]x=rêPzv6F08;]{1qfoOUۊNj3XVϘ;bQLI.p yigş0IE(];w ā>Gۆ"f_,6cp}5ũOٲ;6D]+vvx3Ifd!!{a{è.B:^ +"it+jjA?t~q'& VkLC8)Y ߌ76rDJX6s&QY9A^<֚Ydo[;9nS>+̍9#o?Ǽރy6ɋvo!.>SjGpo(gW1p6]~ ʆe;”Ɲ!!))W7U>?.BGbQ\^;g߻Y>2{gaҳ.ޡ:&Ы;$_ž{a3tg--LuǷ EXm(lvSeWlb'֡s”enzZI`_B4P Mɦ$Ǯ_Ta3G6O7ŨEj 6ꝓ̇&JWQ#_TVTz{cNi~/”NUwU1(S b,WWxe)Ck9W5BͅvK h>arj]=W'PZ=A)/S L(5Yoe{B`R[URGmTqV;qǶPJ)>Z;`]ZեF:-fPUخ s0E|jpgJah$5JC֩k/YcՊ~**>Z#n;>r;m(R춡c}5ũOٲ36Ezb5꣎wOxձSx`(y_(fwf`'t6yHڅ+i[DIa=u= JCy{ m̥|0?ΥGj1qWSii+PF_KaTFvO~qbJPJK*>c(](eػ%Q=kaNVػpǶq~mՅLŐOR FX4|kq4|:kO״p:riÙmCr(' -?;2>eشy{OhCfEA'cAV*1GCYûN}j^?K1 :΃ hQVמj`M`OЭ+Dɻ/=@@хVPr$*t395 za~Kv{ߴ^"x|E_m=Kfn=wU3zC"6cȂ]vǶ4l=B}/YVֳ\On=WL煛2Œ;wvnIs`֋N,KJ7שG^peZwԶ8&O!_;էlAJ%Y|Q +$[5Cdc8Exf)bɣlӜ/wc9omhn_N=+Ytmr <n L/pñd4Gj-q(l 䔢n g;pnPh|m;;W+If K,x)>oMx9.˥RD:s贿׽'sc3-lb&ﴰG䶰165uP(.$/+0lҪݒ1doJxQgZ@XȊC4tEBŇ4?: <w~#غ:6Z﹇je -Gc`LF-]|$d^%+Lj327ơ⋉A%đ/l>Ù86$0oԧlAWYU⯯:6Q3w_૪e]b)*r\yTboܤk9nuR6 S:>m׍̒~S6* Ռ2 X"UmtN ^)MW9NK?"T+iHF W؂ UR#ETF}Ƈ}݉mC+qkx*-ũOgXܟ7vauƝ,]xe ^kb hCaNZ\<&/:%(CttpǜVe1֋縨2f-ZKaL 4ORv|ҳPy>fmrMkt FǿrUJfS8wlX@|yVڛ΋/aZȜLlSʏo#9#Fvs%S>}|Q?ʹV=8|>3V|ύJbۚX<@S,s}Ƈ}݉mC+qx*4=ũO}->;McE_ĭ!C2dϮ>p^LE_ n}ݺѼ^i/3L?(mޏ3<=ӿN1oz-pil1=yLc_ڐ/ذlㅁY1.ĞP| z]eVb3a.$je?u(p;Gϝf13#CǶ<-e?1gpxL2>ȆM9$Fwa,Y51a20%bvarpZ <(e?#s":î0quY{>CGni ; &<;r}=SAۉfb> ;.YP):1P$oEJtȕexOٺe+^1l,fOl YhbO:&_HƧl]O~/ f1eHc;r<^Z9ǯc&^ǒȹbJœva^s2@ɪaO際)m [1b ę?UQn+|/6:' :g·lMu旇S]dX6Ng$t΍1Vs3me[g4a"v']\yS6۪< &<;}GSMlmo{hM,ӵ{j WYmlJZHaK-Ya{wo/B!"/Eq\wvjo2~h 0W2Tefto!B!ȕ$3B!B$ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$30Eͫ#ܴ6B|7]Ȟ*LfDΠf #Js+rϙڱ2~>-y;> DAYV7f S \]ڏnk4zMCuy~Ɛ ?1/U& ˚k9#(_kR:85Z0p6.:V.ڭZP!|+_܉ H=SPm9NMy!c ᎶtkS]䃽{~(]Űq _WLڞxprrEO)Co#Voz7"c]2g]?Cqy ^SfهQKϺ?^=!gY<;3wmohpXϮbDl?CXJ/ E+Cی8?剶uh0`Mɑ2}zWFTr"GjyQWdN֭[[9_p6ѲL:@# @ D @e&p'hH6%)G?v [va>A})Fd?--6PSxQ(e>f7V*ңStJk?~Qtu?ծAuZcmzL]*TZ3TTRGZiԺT;f6G9͂}(K~`U괘CU}bJ/)8eDf` B%M{{$5JC֩k/YcՊ~**֚2E$u.8Lj˸J*Εmf㼸ġcX/{qN&Wu T{2ez-Yt (:Nխ8_(6*c_GɁP7!8.P>33Ol gzfU0c%|2U=m@H2)741S 4X}(w/?T/&ǹQ\^5=K?Ⱦurd̡3.aITkFVמԅLŐOR 7VơP IDATl2Œki~+tמkit/ٕV:vh;YCRad[8/.qch%:ޟІ >o#eҕLI+v̗T| kqW-ca4wNԭ[/sfxccAV*1GCYûN}j^× kcP9t]Т޷M78/$.s_Dgb8^deI'%,04sغK⻍g)8,_Mz2)w-)vԖ+jͶq(lNhBr4cu^#PWI2g2i0綾5u7o;kK~۠I~o=ERi4_ :~33Q\I݇p<@珷H D:shD?Kpq*61D_qz s2G~a޽{ߢ7䲌Yq(#z~%ϼ&Q'LR5w-z~-Ư̹ *||DRmHPձCŇ4?: <w~#غ:x{bpq~UqqTy֎nɘx2K7b <ܨ3Juu)ɩB1im*WUP\|UЈ2zFz9k~g7nZPo~Ū^S;UZƯGC[ͼ+X_xҭn.RJ`>utze0NSrϳ]maC*BURvPǑ UR#<9Z:>#iRV=E h@岩,|v㼸ġ&*2g>d2UP}PIV!I) EFï3 7vau${]xe ^kb hCa%D&{Ӡ_/j6x5^l'F?TM;mN1xy%,V McQm$g$.xlNh#|H/iS~s 8|>3V|ύIbۚX<@S,g6c׌MivnQ\ |8Acx /c©U$ɍlx@ƉBh⡘n i[.*ʗ&n4!xv `*jbpc֍ưN{e+KuV7b؂Y̞ؐ\hMQv [fգSsxAUR>u1ѹD%#u DS* hWLoGvA-'bpKƑq:&Qkwn،9w0N_npڝxt:kM0>p.oc/&M2u[1xKPbŦ혻+žËdU ,P}䴍à Bqibnm{͵IevO; MI )}{iд#8lB!B(KN Z?`1 $&J攘Z XL,qZ9 &B!H!B!<$3B!B$ɌB!#I2#B!H!B!+u.r?E~I2cS^ l9f!0`UeW jOEV_#Va,BAtX׉ҸYĞ4;_4edYQ`gHdD3iocFGzc_4WN9LE#@Nx޻43{/[(>X 9_3г#51w•d`o'5?)JJ јux*|`_V3+JHa7F1׎~R=%?Y崝a_9cw)O5. I@F\*]ViACVdV^C:9^4{]=΃iX^vދ?Ks7j(1\g14.uͅ3q!eKVдLqņYŗ.JgЧZIcq5BjoS郅AbLYN XT2eYߗ'}- lmȻձ;?S IfaM1s8F* =6{ȹ ,h0ҙ bFo6{  f#U|,x3oI6L-˖JR/B7 gvMOz{MEH4}T.>cbG_nw_Oɥ{浘31'֡>X8T$oMMè!/1tDٿY kc]NOQ`$qF&SMnɩ֛+)W5~U@F~XILy=J2݈})\f;ytk: gz=}w3E?Ξ\䴛.ux$"[G춄fE:y4+GMͿ[ۛ(My<>g8 |y/'CN0X(]׏ |:"^;K.Y/F<~u8ggp*Ɋ)&^_sx|_-9sQqn탅ƚ/Iǫcʰ~dm0JFlхt+7<AwNֱo'(Xn+aIu wJGsl h6,F 7R&iq$Vù:XM; `CAܥ5Y%K^NeGl 5KP$^ҷ-=c2/+ux4s:u}J4Fw"[fYjyw<-I: ƛwC p&3е{8Hb҆.V)L{\EQ-sq^;󎹨8TN s3?]عMg}MΥx|~.sd{0?{M.3.ܟ7?^X7=ByG(֣f+={dC|<46!`Dl`^jM =2ve>Qgd`,l/?-lٝ^6|j\_ao=H eep&7I@xuXt4ݿ&vɏQyW H =#6%YȌ|@0R6PO~<3jgE14\ֶ-ꃮir?m0R:@OJhwH}ko2~h 0W2TeftY\f&B!H!B!<$3B!B$ɌB!#I2#B!H!B!-y,DGYh\тq1kx*u/ѻV8;MvY6c(դlH!~܇vSY˘jRe2Xu֚Z rqvM?I} cz|Ksp=lfܝz=BQ,s77 A@(*@ x"ٔ*l}T@MFsҢ[i*jʪJ~Ou )ͯz%uV S:WѺjWŠO-zEjQ֛^HTk>+TZ=OdyQ@u횦jRR J~w#U3ՂQwOlW9Ԥ*ڨ9T%9JiľptrsHPkTSfƪUH/TlB!PTǾOち@oCq~]|f>g ޙ!333vWЎWne"ɤ?ĄN%c<޽ZvK,֑FKraK ŬY4M\QZ 'O’94ªʞUua-SE1d"dzKdwzz mOHQ~og,d]’֌XŮ @n ' Z8wDfveWB!5 c,qWE=2kxשOWRam *#b{:<Ȁ.X\z;PICX\YI???gk:y,͌^eWvY LJ/dJ=/He;T\pU1d.b\E_m=KsS^pbYV93Sʩ1p0nB!p$3Ky6^G!WIj>Pt(L&}(6CmyY^ҘrJ>);4leWv+;:[kH<_Qiᗻ1l)Ek}0#A'>LWHB9Ţ@ ܌!BgH2ťd}X*gM~xkqY(Q Rٯva=IRm\u?/2ya||x̒]-10~e0:g=||!O.5.ŝ_c0$VN,_DdšljϹBGϯ/&oDG ֳFB!p$3vS\m}}Dwc_6aW jQ͠HO\kGaּYZ79㶐9Dz,W=gSWiΐt|(d[46,o~FF:}tg Eo9Q+S> w4֋j@e 9v0gGeϩ3G/(U `Ml`UuW4f3#FjLٞPq8;)1@Vq(s_oҷ HøxIջ`=w?gJN5g<@ahy8§b6>GKx5*ċr,7_²8lW1>w}d{+_36¬5Ij׎ Q\l Rv|ҳPypt4}f&=wIl[K7ilG b͕A.E8C q8l׸ wM5˿ӻ4\T/M܊i 2!CX w1TN׭͛aE?2hyA&IV=X1jbd2aJNŜ۷1kCھ3Wm3b|˟DO?JOȜHNǰ1L\]ǟvieB!793c_qɂLё,G: IDAT&}+RD,Ó/}-[*߈a f1{bC|4;Q\3˴00]+s c3j9DnI\L 1P`(_鋘\OƒTZz U+뛜.{.qAP7XgTEwؼaO,ֳX1o=&\/ v/r= ;u<;8\B!?{Jlk>tG5 WYmlJZHaK-Ya{wo/B!"/Eq\wvjo2~h 0W2TeftwדB!BbN!B!GdF!B$B!Bx$IfB!I!B!Gߙ]]!B!D$!1#B!ḡB!I!B!GdF!B$B!Bx$IfB!I!B!GdF!B$B!Bx$IfB!I!B!GdF!B .ٻ{ B;4hEB$3ِBG!efB!B%ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$3B!B$ɌB!#I2#B!H!B!<$3B!m/ᓙ٩ b/=^~:[SfV HS.wM&ݤMsX%ߚ)dWhbsXEơnލY;R*z8BƟӞ~GOeDztlMcSlyw/Zu3m!B佼99vϾ?'g2aZg2λL˗'LnQxk:gRNί2G;,D2Fr0^{[rSU?} 1#:[KPUkjEd~sf?wyTx[ͫ'[D'ۄ$3B!-d/{kaX+r*={OF<&!ȅG@@ 1&=0o>%P ?~1 B/\`F}<&@¥3W@ /xL[Yp)n+rB!nʊ%# q9\tmxb|5~~s @F*|`/Qi [Oc6d|,,9Frs4mzfNFd[zJuO볫,'k:&=3㑾iѮMφ,˦`ӛO2{ÈY[8y2)>ކģ`k=4Ҥis? G23qL9Ɔyy{{wYeR}f߼5,I!Bww{X0q^j;Q; :J=8cK~_Despw-Ǐb"b{&]̷k?gސ29%>:*ë5vaui;¥̼zn#Kw`Po;?ߛ ;K0xRl=|Ҥ/I&9Wc/v lA#͞%e.{vץ#MSxR+f,-K`Igj>(A?v_(<$3B!=5`E<ޏa]<ҕWǝ!HPii(]yZ@*(݆ѳ{O08 zĽV2*HgWa CoS]Z5u |NBnj-ޑ5q;+65mj$l]ODc5b⫟J2pR__'T^iɰw䱆;_ !!B6tA5t,cnfK=/.y_+[xlw{% J:B-9xq ͹'K, mðnK=g[J2;i>(Uu:׸hhY>9atq<b9s,ۛ/h⿌VɂL$B!GDf}y=72]7}J5d ]Mgfri;ڇ;WFB7~0Jͤleq\*#zZƛD5+et>'ZY,X,f2ɍ =bb1Gocm,zKz>Sx.L!/C0!: FC_O=FOiſ/G67s݅~M}1Ϙbt}U]e+ё'/l%YCYt;^TQ?z͟yGmjxE}ץlwF_)<$3B!-_{p%Ο:ů*tXKާ~FO>t?h5BJbO͆q*_^(ID6|ċؼg=#t*j^627ݗ_)CB- XX?wk\$Q6=x/ZXk2ݜ7X/W>~sf U?x#j%zRiɏ0ýQ 23q]DD*Uru1na2w[<9erS S<uߚ5@VǏ9KP9* |5o%'.\&' 3 a$Ds˴Z?6;g#OW_5Vih:#ww|uזtR)RCivQO=w,wzz*C=ałt{/@e~$%Bnvvg?3ɼ[Cy_|QKҍ<6nyhR`É7"bu<~`eګUrZ8a:Oŋp㹗o/@COxFkץ?#Q5:e^嵧o,3 " tot#}b7xz2]bqYOɭo}yr_I֮[5yI\Sу?eb 0eT[[[冀:K͟\i&"iEԭF j.9%KvcY@pY.Qf)U+HsQV>am"""uADDjY~gGнICnȅ" ssu"""ŒH-9rVb"ʟ{2sO& kט}lKz 3""9[Y;?ӓfA|2X7dΦCkO.hrEDD̈ԂY9s=o,؁+B rKߦ|p[/=ˆWk[ ~~3^mSmW9kZ2.>F>.=d{q}h/&=̓>#0coCl $sӏL}u* QH׵]Hx|IH߹}!^ö̦ Cq,Ngr0«Xqr?{?5;]h#ّAIm ط|IIy2|}}kaο* 3""U8VxmT7>m2OZsΘߏ7N]3G f.D^΄w6U~{M$]9֖nc,6M=h4$m?/\LXml(i*o6 O`pۨZcMiPmWD*c&z\x >YUxOX~o=-^y3r$~UZ>>zyg*bGyoU˷g;Շ=2Ƞko@.sʠrbKN|8 LL2-#~DEQO^>ۂrb; <6}ˬeB /u<Ȝh 0˞YDvgaPB+8K=i}Ue7=]SOVz{h2rXV-g!Rtxw}c?X/r0~߃\" a诖` ǘx%'?ﭸiD NϪK#܇̚/$lqN<:3yG`Y^-/MsK7ߛcX5|4^ؓtw!/OZٯ+!VMY6X5ew>^mO|C@_~OfeCu/K=/H_N}ut޿;A_dۻ˸fdVލ]B]%^%6s!_zjl+?|SB<50 )(mHY 3"r $s#:rgf8 ?cy SncÁlm=,f/^יnNㆷq8WDꚹnOy7͉↑+{Hc+㏙{пuYS@ l8li玻8%AA/:ƒ%q`wy48I7"ͥE׺5!DҼ<>N+I|7=m kNˁwLNL;?f,-hgn/;yb-?dYeX\5yrn6F 9Œxcvn{?mNbB~+G/m˸ cw5Ó[ә2o;&t]g|)7 `;LFu~"Cۑ7fŇl7cN=-2;rYrVZĿoyqcg}H EKef٢-tY>xd"+;?S$Ph#b3An6*v%#,MWͯ)'Ūֻj?;vV:U W-sx>ٶ$b;xxkwR.!(yEvn`+vgobƸ>$EL& SȄaUuGU8 o`K {1.GR}W\fmC=ϗkG߄Dc?`Vn%U\a6߾aȸ;ХI 'wmMfv WA3{ xM71ADUqL(beGzuc՜.dgߞTb\R+V è(TYz5C*?l[ҟuOQ>+-ѽ/|jqR!Yy6~]G4itwĤ 2g!>[Vk+3?ʷ1M7Un2QׇDgc;i$rn/攧Mn_zo6yt|p57=>@U9"`/Yile:m+Rԋ=S3kֶ <u4%| p`?U;؟޵?1wa$Wfd3Ep˰O}: ^ʕ#z`GoP4x3~]Iݵ([eW~`x8.]x SCAydv`2HnjcR)]gFDܮMx껍njq}ٳ~EϏowݼ"tZ]GIȧKB7nBPSk~sh7t\+:gey ||/N_ɔQݸcYC\a kA>&ЫQh'0{V:Bj-I7ظ[fEK# '=+ރz_ϖ{]%o8fW|~b#|*75$<)لv7ﺜ|>|M O0SD):y{U3ÿՒ0.%1`ƿ8&?cןiЬ#'m|kmR6ﺘ]b|Jn}Kv;rMݴv%KjlEuG.g.JR'xF{8]K:woҐI#;ӤQPuU|bBxgLbÊ%;9Vĺ,}'b6>6~-"350 &[ v{22cjleX&޾ۜ5n<߾*,]7Yrz8^ǹF߱|+|ѶS&0V 8,%eeq,FTeFDκ7t6&z&0O,l yܛl z(2GqgĆT~p)YM{#|~Xl(߇d_%99IY<].^1 3"rV}bO~\؂DѤQ !5?I {㑯C[`& M`z7k_Q42o;O o-}6#x؝m}*=?)[F4̦dXt =jdb∎ }e! ߶3~p3_way? R_(̈Y=Gbx 7nRk5Lj~Z.!<%"Q!pM'V}-yAsw%"l qw"n끦MұcGtB=8z(C !))!C*\g\woVq1RlhƼpmgq^'& 3ļyXzi&NȠAضm bĉnPu+ff_& }{Jv1ş[][)# IDATSfb̘&1c0sL7W${g"grsۍ ]M1߬JqwI"""n0SL&Jݙ:u*"&"{111D9~mV3uEXG^ǖ9nHDD=4@=dbccIKKcȐ!iӦگ:u|[YYWYR'Zos&̞+SV,08/ʒvL]V=IǴUUg)W{x1.z 66(j&55RSS*ƍcܸq#]oAv,ːN WVy~} ^[נ1}U-TD;v:tW^ɴi6mÇwgrr0)Y[CcwSZxctw g&=e5jrꫯn3j(.bzȑ#ywILL/psrz?wGk[ ^ N_ɷk0g!:ąлY#ƞߌ _w(""Rgf\Yf)7jԈ~ tZUfReR3E3 yےΊ؝y6ܧ.P*""IfDά}Yąгi˩mH)d,_[ع{@ w(""R4fFD7%2ûb6W=Ӗ`?ñx l>?{3Spwi"""N-3"R' l|W`3=Ll2kyDDDDjZfDN|g yE4'):圳㗵/ְ5Evx_sLߦ-Fsƞ `6f$Z0#7q.{30 %,~ϐv.G/k˥o1%h[K9c 3Rktͪx})??P9w"V~xĤ]hLZN!7ʳ4Ӧ 5kÂr͉ cf>g~ؤ@s +vg-qcûĹ,a#[<2'KŒl♫:$3vqwY3}^|-f&ؕ@_)vjq]zH|j?~; @DY<1kO]ٞ;ź"M J[p;}&pgoZ>6x}#nwaH>4<rؘs2oK:׾;wuDqa|B;CE3Ow$uC[g59[yKbVkY>GRT]刈ẍ Gpn۔YO R2]3Wudm}d2oPFvbE+ZzmOyvDG|-"R~3GJlGz{9i.ws?mK护ϴzou|>ZC-u4x7JgSMa/"RXALB=-%oy9]HPr,2G& 9r\ϰWTN].|g ɻ/nrDD<̈G 9\RӓF@ us:;oIE;x;qI˿ fvOVb,"Z];[3?v'aNg6[ "2:wfތy/mi 4@ R2iMpy},9@bx!u5wLד9GL&.Eml^^GxkNZ\3K:>6D_4gDVI\Y3ֶ=;̠q\"!-0[t*$鰓Ɂ}{"&>b~<~xǎ[7U{3yt %yQJ7 Lk"+k.%[9U<^iL&M˧{9e#m6QXRZǾ)LMpZ*ѱ8 C39L&ѱJUŒx ?+bC']Kw=hNL?-paHŨox5dۈ g5 )?.rzL&B?)lO孅;h'CF-ĺ,]S,p:_k%L&SYŒ{z'6&~;#׽0{ -p͸k>LLN?oų jKuafOø Zpgڗgf~~x_6WpZG9}0_S]SQFVŒ&6;SYerO&s=-G^K?oaL9j lr-߭9lpGa2ؐn ǰV|d7-C$:Juas.{Nq: &|Gh8 2""50#`?N~\ۋv~6l5xtIssugGL^\YyR 硋pL_wbl O~ذZG7 i{`90 a#߯M%”Q]ω/ROv' 3rN%+;#<>k=r%\1{}l9i||/O<2)7v;iB%߇.l5ep';ӏocSj6m_.lm5w'Kvc1i 2"Œ]`o[yn~XR.JbP(낕[hg S`+o Nw'} r0?dlϴ,ږλcz[?~l/ ^+"]WRqkKrk`'_LamJw|ݛ4]LVB"ѣiC.lq`mL)s|(w%`U|,&CFsn,qkX}RȌkz#uqsElYmn均|{5>z~O8 6yC*"y=!W>ٛ}5oήs]xK>ٴ#7g (pW?ӧ0#R=.iç{ym'?d&.qzɻrgٟ@& % `,QZL&dƸ>2<З0fĆШ/ h _}RcngҜ<|qFNtsU 2t >t-pұ?L#?(;dAMhڕN0a2/UÄfbw&-N1 jMFǻi,MYy6^y3ӓb)>\ՁNw"97j{cWkY0- e[M/v'Gr }lH`2|X+qA&xjxFirVkRޙfB;tؘbk6ЀN48[nN%ʷa5{` 6(霚V그>ۋצf_&Gq8#ŷGS`'ήNyYXDL?a5 *دx '~dg'2Nvv2 qAL CEb@X%y& _OF+׷ְ+|.m Ӱ8)Sf%o-,4;8l:bѢWfwQAf>1}c$Ͻupyˠm`||+ h)(Jag;w$&tV)r6^40ok)L=p8{3gٓ+vڹzeT0O^ٞAi#Tw%=UL&z(rf'>84l@+A},d8UҲofr(BΓ}n<%mLJg~0y8t Mɻ8 #ukn`k8d;tjmővnjgȧE#xIp/P^+n =(;ϿGw'xe8'3arb#9 ngׯ 0(ěۻGcQupKpBnr'!N1Io7-ÍM,] @B*ϷZ6V 3Trr2-[yp ̚5KaYL eb0 ùE&wp|0p |0I kAD,"[6OF["^l6KX/-N "463ٟ|s I) -ۜB`pn!+vFnJ捤Bk+83V|8ijJg3VC;>f]"^:SQ9qJKo`` !}oǎb^[hśp }KPzs4.hyD8į6ԟ%=EygOcEdq+KE Ў(*#r؞ˎcl>]׾ׇܶ[ӯ)#{$:N 2r;Ӯh&8h]?zrhvoGm4=2tC|2=qna40a4S+ +)'$6-}^Ҍq00p]'1ʒKY=LRڝJS7z0NUS^wS2uTRRR?~]VcYWYgRg8пpʹUa8{rY'lZNZM`p8|؝ma[Blo&ia!ʎgҬ}c4ɯ-][-Gpp3]Ӱdw'y<Дc2* 0km⊈&tƉ;ZK Sa_|+p8l@ 0Ws䂛=D *ll? *9fxw甔bcOg>n8ƍ@=0`*ϟu-u-u-uZeaŭ/rLitG]vWX:pqDsLsMi`2JP5(,* 9li'1Xb0?M}xddpt`TSR8^u):zɶmصkEEE̘1+ei3Ѿ ܢtu=ekx.\F~$w!ll*_Mru66 v!'3e3>`?<9B9oX _.g[jGng1mkkKC߼W+r$g~OriBz0ϜG~X'2烳(W0cP|I'N{Ev'`d`2v[QI09⃏Z2;cN}ҥ =z 99UرcC;z(C !))!C W>H6mԩW_}5%WRwj-K/a28|*;YEuz穼Z=o>H۶mi߾=*yϔRp8{駟ظq#~)7nd޼y̚5kײaxwZa=O<W橧[oٳgĉ4h۶mcРA'Gw)!C~z֮]KVxTʫO ̙Cbb:Uyuz ʯ?OVlڴe˖kqFLUT~ł<-8N̖!)̈HNNe˖4o___nf͚o  **͕V\d";;,bcc\)\pجY3f cƌa̙($9tPް}!%%Z~^xLG[鉟'(VO<Э[q`ڶm=3UQ:[;T-Z# 0Œxpx֭[Yh{ /dŊnXE+<$$$x췞"&&(>IKKssEU{K]F[ܹK'~*韧ݻwj*zџ):]yg.GDq8{/(It#]Sa3(d2a`ٲe⋌9Mo/o>^~env7TW<3XVn&wR>#F`2իfÇqN8@뮻;]%V*::TbbbHMMF6m=t*kǎڵxLJJ ݺu#99ƍy"ӦMϓfkᦛnbĈg~ʫ3UWV+qM ػ xBPp(͒h(xPx={m6vE\\3f`4lؐs2`nJQQY~Ȃ 0`s%))ɭuV+dڴiL0iӦ1|pwTٳgϳ`]N:vxRMiy*OapӶm[>S-GdtcBp8NihEeôdb SM:J1V+SLaذa8ƎKIJJbرt___Mo+fv:u[?>&>>L0#G_|2˭瞣!C|M7WZ~Tyu;>Oꉟ%KGѱcGt>q摟jDQ_0Se,Vַmc/פMkWj5u:WKEjeh۩[^]`+ rJDz8]󷕪 NM """""^IaFDDDDDŒx%J 3"""""fDDDDD+ir\%HfМ"""""ADDDDD+)̈WR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WRduw5r"w """""LN]xu30#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈W:[a(s+"""""ϭjTaV1fc 2"""""ޫuz_-3U #""""Rymtr@0S^a'lP"""""=*:wժfV5EY<֜ ^n?ǯ67w]Km"""""fVv]utLU75ĨuFDDDD;UEP+YL[fSdE2 3"""""ާv7 PS3W֥DDDDD䜿fj:tE]˜e.N 0U9Sי@#"""""ޥ&(3v:a>YJC툈g+m)=w /ә$Z:3[DDDDD ܺ.gubk-n2A`P~%OReVDDDDDjlW0Ϯem@_r[T_gfe*x cD1+)1@a4r"lr[^Q)_Mmpo8,aIrUɭ.NqU5(̈l({[ޤ]s Sz[DŁ#[fSYs 4PRĉ6JCFu5S)_Ea@S 2Sut13-0KʔŬlp‘\_f?fF!FDDDDʛ.G13a옙QQ&a5TXy <ϝkK+oDˌ򺙕_QPBN ) 4U͵ͬ֙.Y60cVSѸBMIJةzLt7;L.CN)?Ԕmv*g8Y9ben S뙈VBLJC]75sEW+bRc`Th\g.+ 0ek)/(ȈT._卛Yـ:u[9@YEN Pb@SSfN>`S7n}f7l9ni)KYy]ʛ4njeg<Π~U@S٘Wg3 92S6T4Ckq *kQHuKEf13奢11 2"""""u-Μn0(u3 1 6"""""5SQOj~uf)xESmuOD;A(J]KL4m$ ܷ۟8 3 lDFb4j4j̶A64ݩLlhd%Sٴ̈hF'Ke&pMQD/CfA5>3UWl2}wXa=21򳱖-gBe^Zkd'm 5F"eU N- "Co[/^w? 5xXIENDB`pythonprop-0.30.1/docs/user/help/C/figures/antenna_chooser.png0000664000175000017500000014331713736105351021315 00000000000000PNG  IHDRPbsBIT|dtEXtSoftwaregnome-screenshot> IDATxy|LWL6Y! KZ[NvJhJVZTRKת"U E j3s~$!b֘|߯}̽g=Ν;9s@!B!B!B!B!B!B!B!B!B!B!B!1]# cB!  `Na K9B!5.|B!U(Ϻ$B!ē~ƇptfK֦`S!;kC[ldfMަXzB!x\Y M-&| AfAj[;O!qf, f^~Twf.?sӖ|B!5>Kr-/ άm6X 6֬[!6cܵ`7`\-fp*|}:vlioo7''g4B!RdffpҥUV6jX 3gҐdN歔3TnZL[#8S\*sRJ .]55ii:*B! G\͝˗S[?̘ӧOdُܩ̙LqkUm/}7v-dަlSep?*^r+9_!BqD7 }̙M܁f X7F>LsKG SK8wB!H..EHMOO XU8Yey Z|6`Z\:f?CԭS;-5%B!xb:=zz9nݾ8Yd59=ڝ-5:St#:rw"B!O[nU= !25הFVMrc59.rS-w{yz:Y !BkxzzWZL9#gƂGMn~0MuSdr4?ܺB!MkEȺs\OVe&Y^sؽܖ֝ ėB!Io0@Vp )ё;, Sk9IƆn4L.\ !BܿʙӉ2gʹXlCE½53<B!vHVphs'̉ m&rKyK!Bi%ΩtMjv`Zzi"E !Y~?FOxfӣpf]qc篒q?5t3:~[fnkoB]k7&5,y4lJ8C""b;hĶ3oGRv*|@ȞUl?av%Xa>/dk~8| Tp9\ !SyLsMR-eB< $U P=ywCĉLjWwJ;ė~?uzEpEF>lUk3p>ܕ"IJ"߷V `á3\Hqlp}NSg+f`k~ Iݼ iԉA/6! oUl+/.pv m #UMIjðrd^bϯKYysW-WN=b vD'\'ѝ v_‹j{2q1Kub: gg! \oХ}[__ˊkY6礤,Rf 4b'S$L_dO9TԫN:Qy;~Gx"Wǃ)(_4wDZ뮼ح>~Z@f0g[<5[ӥQϰ&o+8ˉPeШi]φL[zP=TpF w}nc?{j<+@: 7t>ZԩVsY =p4sNy<׶PCc{.?M 6$Lv7m̏Kxٯ,Y~ZB/{+L.*2{ '(8 }VѸ!N\֤>}㙡Tbh6a/SEquǼ:(9N~ :4b {PU7^ȾSrKãTW2 T wpoȨ.I#p1 u'"X @[ L".k Or8KiQܼĿEism@.8)]st (t9PzuӔhP9iBo/\̄Y M;>OX4n䚽kW)]e˖ӭDncDGm*;O(2\`wdz U+D?O/#ՕwV28~GKjL 4<1%cl% AR6VzOޖ8vax+-7݊gl`Eh ^~oU׮c}QNB/JVQetꆙufӖQE+u] j̀g{94:S'#{?KT BvpWhX(*lQ'ZrƿtΠ9<:uO7A!BTRmpH5ȞnfOi e y&ڻB5 !B 4f{MwHB!cAvSdDB!AL΅B!<[(D~JB!Dx{r B!`J)By| !BǟB!®j4 !B<~M>b !B[s!$,ןdFӪ/6Hibɇ^AČ4 Ʌ[ŏovv` Ba"O+[*3z6 +*p$=):GdK^XƵ(+Kpv%X'u-Xs~D/Z{-M\nRB!#`vFÄ  2ϟ?τ g-B8P |nOd@vs]SavѓSgScvjxt} guU;^|sݙ t}k-ir e6}о9LSrIr}j&7A+B!GחiӦh?~>'b02e [Jtͫǧ"Kb{w*M ttϛ'ۣأ.,_1czߜͰ6O3-p!sʏZ+Q h[ܣup!xcL0 &jo˗ e]dټ7Q9]Rr$#Cgt1ќJ9ȴy{ .wiy2;ah]]}ө:%$B!D>9jVt?oCwq i_ԚST Ț WQ)l9B̯6)21g8},CX07pXk{INbAm5r.. !Da%<9TjhdžlL ŀ 6Sz7M^aX9&^j$^ul~}KѭnExjuz=KmEm`c{zw&SLn.d6c?.Th؂Z_7ZthK m_M|NTr1rsjUA5hk$>{?@%nXmZ|ɁҶ/``=X1Ek"vu4mһl3Oώ do[ՓJh"_L7!kq@kjBxny4h2f=sҝ&w-vnēw^{cÌ̝!/Fi1OK͗١b>]݃OmBJD? >sMonnM YA #7l˧0Җ'3 ݄ߞm)ZLKM oȻ?veݰ|=q^K>2P x.2{Ү[>o`|r4m{p;F}aØYvgmz=fn+X4| %mY:>}U98ҵySjљp =>7~T| U 44(]6=; TfդaXIJL2yYJơLG-xԧSVw/ͩxp7Ǭ'|!ēML!Ǘ2Lj%p r0Qh*}rS8i)7`QFQ5;Xy2nؾy+Q\Tr9sFs[rE\bOq^߱onk&4Z퓠F ^ͥwp}5/jvm_8b˥BS;q֖XJfٯgiLkW6`ĤU3Oj6GKIna nyWRQ-dbhb~2?_㵱lj:s}ݯtfڍqbR},{"ԎfpnWqeykNL!ťyԤr#nų,C2wI 5)HNgItLi\s&#tﰕ^n#k[ʺV|eܛxc)5-FoA告"t6>[1g;Ow-j5^&jmV'C1]g|ʸS%(#8k_ &;5/7KyIkr59BMs܏uSn%fjnlvu`ϟ oal~ _`Հ R32(h>m/Ez !Cb3b7wy ̞ndϻ\!פL9l\ȅxip-YjuЯ$zT! MB<֜h25CPnj" !xI B!+ 0B!]I)DKfS'EMƒ;ͯڌT7^o(͡_0|ˤ~f7һl3Oώ ؔ5.m{3P,K^6V( IDATm:0ac2'a:խJj!=6&19_Ï/7VԨ^@۔e8!OϾQ~f;h0^]whe2\U/O 00"Br8IYI6ٶ9mi-ƌ|2DZz"^ 6yZ@]߽k!**u}N3u225_[~e>^_ 6w| ]^Sz L:T#Vmz1d(B< $,LnHWL#4F=Mw1TƬX឴w!=)r%y/BIsx90C'0\[e3ks_tIð" Kd4=b#0{`'ڵ㒜HL>F_.]7! hSR,0[Y)=gDҤ+Duw/q{_!rQ#xeOS6 q84-NMbE!qb[O|5 ٟa5٢U^ԺLZFL=R8/S,_Mcln߇ ΓY1EԔFIOÿ}l|] &k G^^) !@j0YzbRE(MQwpa>C{0kMFT\ݼODG'\^Xs1 \Iʸ=˥a[ZwnRɧu0kB 7np˻j!7D:yoTWwhOŚ-WQ$aE?xID_|}ܹs,;< b֬Y_,ݙJUO [̩v͎,A2Uh9lP@򿮸;9Vo GXs>!ܾ!FTeئ;?w)՟NωiA7鉇 ÷x|es\]NޭOŗcM=WL)_~~qƦl[sùk4> fBCM DF7mu79Ms@]UZ'k'`tГ^}qڻBn4%b}<ѿ\ԕk3|v=L_!\p y p\w (@ P4oJVΞ={{sTU߾}U\\\AjJDjB`XM\_M;SpY*uuB{Ws3Ύ$]  JBa'>' SS+Cd7^cnyG߱+۫=#{`S,z=Ge%Ǐ6\7}?a\㎡4kΦ?`c\=7r!'CM\]W/O@9 6R&)iC*}q˞^ i 6wh3:[F6rV_89kgwOtԣ ޲*AA 7]yRtF˙&/M` *͟{tݡSb,ӟA"Nj-/ufن1٭-9;g=*X!美#zs]'}ﵦϗd=u\ $X:2o7 zh0a&)Q?&ӡF0!Uijn7ZƆ\<$|X4tzITכts&ab\oRTl5y{/<;Tjh·)FRVm&vˮ!֠lL ŀ 6`cM?^Jg'Yw1Uk]Xz؄.\Aۃ#ywu  i_Ԋ;|Rd5|cpb4pZpq"#q;!c!,_ gI/1F߭D5l-I8r?~N{l m-e|L][מ&'?2^%,oJ\̻+[8rt/}~dׇѥŔWRmAYN}o*=Z2>}u!CU7EBXbn 676:Fΰkf䯛"{TnR RNWѺ{c>S- #Um۴Po)TӐ*48X:J[zfwt*jJCpJҥP4Uzth76^1(Ձ/{+ꍺ~TT->?̺A\>+&V~lT*]m^jXAo:};_;^uVjV4@_²zNoHܪvBBjZMˋΨ>P[7QUJx[֭۫noi<SA;S=Uz%?_,}M5jP5]S*vNժժF}g7Mo26=_5%6x C|ѻTRjI`s*}VuP:uoȆOW뾯δPD!l$ !%stn},dɸ~,ۂ_B%l<xiA7яt$7gm-n.azU3x}q5?i-ƌ|21c vƷ(g^Tƙ3y꽵lӏ\۠.^5ź>:L]1`2JbA GP2ުsq޸j¬ l޼)m=LEu1lj-Snybd+LC˟ϡXҖń_{0bחcBV -RU7Cݛ>)~06|?\RiCfBUu/v]*uB< 0(`217ocApjƴq\IL/fMP 44(]6=; 9?~4 ǣ @@'Ж}:D9HuդaXIJL"PGju<)!(Mٞx;Ѯ]G/DL֚LM;+{P<5SBKZ<6"ސicx(3op~T\Ď$Wį}͛TΌߐȅKY- WHHt&1g^:o=1DZ|zd݂W%/wAœS@žHUg@zg/ڝOx!?ޡDshRrE\^Cc_|!;ѸTHAk^GekF jm9g`zR8/SHYN!_ף޻L1$L`.N@KLbtkJ}:[3'[?u>dw|m͊)4Ot)Kiֽ3;~/0^bDTpƗ2Lb6\³\9#NZ n& xL! #6pq95B?O\[GY8e|m~t2_D6U;V ',f=@]fÚU[ ox^2́}g\5Na_ eODMKdSu]. ;u#J>ͮ 5k kLwGۦCY9s߬pNㆇ $ 7B,#Gks1^uؘ붣ߘR33ad 7np˻j!7DcqH[U݉9hU 6h(+Oqq#-M?qQ:{vh@WoKu,HFG׳4SVj2x2I)O{]X0oǐ-t[PRK(el)3>,ϏjPZs0*885E۩5͖E[a0 vDR%,2#&$XSдwIp)\R)O Blj` !B'B!®$|Ȏб8#vq0?&ӡF0!Uij{c*}2۞:p.҆o7'ͯڌ^Y~ dz;Mܖzt![V%(A՟a+x,r{Džrfi wazT "B}ucG[^u"~f#cmOceFӛv{5}~dᳵqnb͍mTrBp܁<(뇟~*L|}H>~-=5)ê8[fh˨B Gϫ }b߽C?՛5%+CQQgſ6>M٦ZTz[["7+ SBnX5*PJe^Kɱ F|ٱȕKj=A)zNErZ^sg̖#X:G]Pi.1XzspaVwi@:MϼΝtJ)u눚֬5Iߢ^M-4Ī[;P}VSC_QnXJSǦ7SgO&c l+\<< lulOdj-?E4ޅ [P>MOq~~ 7F]̤YUd㖤m_{?lU1E |N˚s7mchqs ckMG`볏oN_oe6f,џQk7E f'Le*[]6S;IJXW"áeUXq Yؼy-Sz./b)=_ WQ_BJG KR87{gɸ~,ۂ_B%WdAT6`{ [Ϧ/xvO8r?!f-1:tGX0m-:?aciX/3jԛ^/C`}j]]\<`9~~+5s_/ :wc]3xۗ=G#y/v?{RaAO[ !Wz[KjLͤCv@AeC߳מMeǣ @@'Ж}:D9٣& Ê./MRbi"8R3}QN,x(3z3ig%zp*ChpIG+z>u믢Rv|[(=:=:Xa2pSz7 +$$Qr=sǿS3Jfz7̌Tb8s"n:RۿwJ*s/]ҞJ5 kC:*FS5|HJL"O,~ &}I]{e5 MْpW a- 0 ZKn:ѶIO *A7to"$ϼ;3ñ+K\ A\IgrxWlo*HəѶjջ&:fZO}u\Sk(w4 ٟ=Og>l \K;͞qhZ@x2GGGcP0'9}OK϶*S;-z jzXzбt~{ذr!|4Epu -8w(р>X$ 3B*QRZLݗZ)1ع QOlɱ{ Z hhZ4h*=u8fOf?& Z_HfMc͸Sizt2\p+"#%CB"r_1d wx=>MSмZ9L.oK2If{~^ݽhRa 3([<7CJú-жGӔ mqرvL9VkKu,HFG׳4~vk[-5QZGK8{8Y!Ay۸ק|>^KO7dX-?u k^Wm)=9{21sF8})>=fk_|ydV-OFţ5U[kNh?p[9sp 3%íyZ];s GJZL*긃/K+֔ ;1'ܽl|}yzVѷrqfݥ4ѧ8u8PIN:NJM |k[<5bcRێ~cJd3- ^lC3F)N^B@;7}a.ȒKLcF|ڔƑ(UZkas=o}05Q6ޟTåQw^q:рc IDATAk4\1JM*:RL~3_w%@k.}&;Dž{Y.be=f<3?g<|L{^-FoA告"t6L|/0Ý P"kUpp Eթ5[C+Ro4j+ 擡Ѯ3>eѩAk4o n5O_(Gm[SCה8>lpu|[8M ķ>$ǯxOw-j5^&jrk\]ң`O tz#4%b}8@fBܜiFܩ8{aqnb:O< 31]q ߾jXǭds3;EC1j7|ǿ8'ih}oۻ jyv@K>BUoe.E/4RcJ-rG)6]HA^lonqͧ(+HN!u_+<5vK#Ak oNFWk;Z7BlMbW)y j1(3 3]w6 Wp'O6קfrxT;%MyQii"/$r{"JAk`Җ "%GSʝl2Ν!"h I#&S#z8e֡)(\:33sV'\Qk|P_B"}_:?Di6-˷"x پb#wc!B<$,$r1}+tSW?VDKڍ]#7eV;?9]ts  T(D~LfsYͶˌ10֐PK"rK)2T|~DBtNB{?ϣy^o}>~_/ `~j31l{(%_ȲQɖSzQ]V2@ B!u-3(Uxm8uKzߡ^jn.{ٚh+ycVzֳd^4vCutfiJC92BwW':5obCh7<5+g_z3oۙSvvv5}D.c6X}>*&Gƴs픔ID]ro!Iz P'  z-RE#/!b3.r]Rw v'EN^\/t\;4PV' _ͻ5^豋\[۠掦"W4[46G 줮ˮJeꊴȿ4%kפT OYfU{{iTs':8s1MC!ϛ^~xdgma|{ 12'sL,1ˢxlz ?9Gw$+{=j{;d }O[TϤG3\\e2aMK>O.x{O <+_FtEsW\nNdA fqe6ӕΝ332 gt @k)6n*lKȄ^ᅫʐb[}Gy'[c]<R럫_6y ǜSF"4oREWA'dkZ} ߊ{{RȒwMwSKהRiy|73[=䤦YӋ"G2ֱF j;͢ɘ_mg@\^;ߍ驌?E_kWBYtZ0(9o#SgX[PC{CiE=y icͻ]|ZΑf$60!1|خ jtuC`H>hϽ+CJioL#%0:@Pi @'Eу \Dx{KiwߣI^g3'}uT| i׭)mك L=iU)I;28Fr_K'kXOƸVꢹ]7^ U<Ψd P&[3Lr_ N&ν=*њ-+Ym9ϲ.?PRRۛviz oJ@'6@ $S M]ܼNzU'XIHs Z&jkʿU}ѩ]à(|J˦6T˸Aj*$S`]Ȣ)P=kV$$IsPԀ0|KD QoGL./^'$(v+IJ*yRr!` zbA8c lr][W$nE2~\Uk73]% C4GV ;䅀y=ǴulŒeyÃU $m'e[|Ѫ 辇UMaLfIȞ0ɛja,hɯ-˜h@p@U}?⏙_`8 'dX;W>㌋m]z.D?6kh ωbH@SY:ѲaCn7F=rT`ǯBY)Vm}_t5*|6۶'㍧TRwJm5-Y5WDVJWHMʼ|:U:sl ygUqnA-lX@ hvFljf8di@*qKc:-&V$~ߗ>e9Zׂ2XZ'|)fﴎjw_64@ L^ @ ^&S @cw _ d(z@ xj#gNG9,Ԃʄ9M!}'jVξa :kL][[6yUW.c6Xyv7&+d5&Xagg=#M:uͦ*6+uorE ez1Q_$[Hg\;{ZoԈ3|ET$M¿i;b E1ơ3K.\[3`2JRr|V'KbnrQ,M)'e^oܝBIa$?+Żo)F(CIDJz\ cV+[vjaSj:WC'RRrs:ߏMp͚VMeY:w+N;k@KeHNN&9g Ĥ᛬EHĬ^® P0 d`Su"άs$*;aL};KHL{Ш^RJ:k7jDkҍђ?eHr2׼5 &p6~mEtϖ_P_l@G}8f(y k;^z|5{?eȚmxbE22516,TԃQʌb&7u?*a+[s3󭦘Ww8ڸbֳ gc6ݪ hKSܺL&,ˋiӋgH:7k@YGP*} «=p];0űNW:w,@M⌛n&3S[=?;:aZuU jko媒eDZ4wŵ+.DZ~37:ōk7PM/4hd$(u{L:Woԣqmw56)aˏ:ݛ /]$٩-d`X>58}zP~-z2?S- P]*/ }+ BS̿&C~5YWLuS&^TBU~Ϲ7z:~/.Q]I"*7:ʭ/m}G}GcpJ́th9c,}3C#z~$w2b) ȔYd#o6sn80'k`mKhӍ|&}QQ;4 Oj~4q*oBSm}aDY;X65RӚʕo#a>IA*O?tv~䧦YӺ('2ֱMmq'cU41>ɴd hX]ۯ;OӬ[#U:xv/THg@Zjb9)Z!iry"6TJZ,5W(R!e(9u/1JˇeuzvSeÄ tVr.ࣤ`~]H2:η}xk7qz?sccwu\i8>|۲_51K'kXOƸVjjbdYkS„wH$o xUTׯMFZjJ)i:EǗA= ԳcPJ*Ψd P&[3UM}4 O}EfȺ~$ so\M/FDkշHI3Ulx&SzV5INUx  k$\sޘˏ\תhx44r=Dr-ӀoX G$3`hHMꞼGA2voI#4鱷~ fGXgj_R2{"3Ft5)Gt72+jw2cٴ}@Q[kzL]Z275u51aD6'&r<~B|;SpuR$a9B^ ȑ\\.GB.MPnA&@L+̒K̀#٭+ _n.7Cj@\G?hm` g=3Ɩj7HWCMݴt ᜪ9l[뿍\V|YIx{( ؽ+Q3<1Y1'Pqf7 ?|)cZ'*/?Ãu>݊)ٷ&sJv+n$Nɕ~5Xuɛ{cɏ̽U@vfAN\tNo}+r `҉9s kQndd|>L(20ƵT,a4 ;vˋ4#e%rd +_T)&w0M<(&[:fSA62Y E^;O$x6ߢ]4ptĩ % Ǣ節*5!/ |瀡`6yzn_Oj%g-%TY.*}sʡ:FU:42?7NMpvrӤ0#ffEDdai: HdlV4z:CN +sߗeu"_r"ΣYa[+u,3C2lũ_R{4 |vH>+w͆ѱ C$f;sݧ{7h sҍђ3gCwC2Uxkɚ/Ae~ČmYݧ3.h._d'b ^>UjR[ǣ֋HQބ&A_5/C[[{+n=˚^Yz:0fӭ %"%|&==. K."m&3fʫ@`k_B&j/\}?dWD fqe6ӕΝ332 Pqy8:8[IV|NtbcrrUI2-ܕvCp"K?h@zTz4UFdE [폌DYcP'n?P_UG/ɀ*iYGMZ}-_Xh56)4򣅽N a᥋$;ų woaWи_ ׯ6L).M =WjibWpphD/In;SIdʬpa7]97Vp5yw ߶%Fzv\ >|hY5?_8{MVFteC]JULMk7s Nw0T鿤 JM#kˮL e2\Hc|;Sg.¤s\Әb^aE=4k"C'e_ ) "HKMtCkZ>t1M.< b\ x]GIE-dq/6:s՛2hGr rccwu\i8>|yi(c"ٗOְ,ȿq422,kȲ&55,` IDATjצ UsILr_ Xn SӺu.'/z`g<"ʕT\1QɖLN#f:fj0m}xn`6lYpunP'sg>ra+SYʷgo0po7*cofJ(ϲ)ԂOM 벇/? +k[ʋ5)Gt72+jw2Ff{h\h{7͉6"N6Rx(~ zqˋ6 Gr9rr 4y@\^,d2XdXr'gff|E[!P-`r =ouOT2r=A8cO?5@Lix)-gpf;7~CpH;Lb4W6YN1_FdU01'OuQWrPݛ5cbXgyɰC$/*bͻ@4)r"\:GBBMSVDE{p ~;0FF61X-r Z sn\K-2`w*U9+'S4z!WXSMr+?/rbB%]}=U߽KU#UCEvF$m٠qm ˘[^v,ԹΑk07wrծCo)){DF4[Fܚ˸4.@fs33.uB8.r9oQ%M [MWZ=T0s.rN\ị3*s"Z/HBٔgt)|Ydrɞ kÃ/{}%3Zf z~I9|u,Kd*T I5h;y934d-)M~^ʹGfIȞ0ɛja|F̡|LUl~9(re_4 8 ̲ԥkd0V`@=ԯjJ ZoPgp]Ea<%?kؤvۣi/ډInfgĦf+@ ܻܽ !=v<@]ob\ xabiE}Sum.chUX&x(2뷨r^ 'Y/-KiL^ @ ^&+J ]G{Se4o"֦ @ RK4kTG'3@ x5CIDJz\b7cT3KSX%2BwW':5obZ"i7<5+g_z33͝pҊڬ:nX `ٙw F4r _ϐS[H.~i^$7vvEG^KTY+`V} q|IM,qVy&}(CSkcK2yl-4Z5|^JPCV^`ːtF\8.Sh^I^rSVkx=)m=g˨=>sm~aʒ8 hD|Nj-6l38[ܙ۟ʯb4ɪԭw+YmM"99d.9~?@+ sϳs vS@:^⁑CWqH3tk˨[%dBCvexK>O.x{O |Tv ԹyNT-'jf_+#kY@Lcѳ+~<).CWaЀsP1zK̀#٭h2Y \^d2^QTj?{yWM ‚YI(.{;fiCԓƾ+Lm5c^{'1j4VPy1sqsgz͐:K%2 V*/{D7qyTznfHaL~m!\E¨|22+qŶ.FZ~h9sДENc__@B${~[gcx$?f/)K4 @'뙷%o*{j虏q|tϖ_O\^$B* cxB'1FȜзÏ!;uEYMSNT`*Rgӣ..Mq2dЁP7!vwWB5~hYS>bCveHO`^f;]ܹ;3#T'_FtEsW\nNd=vTܝ,p6{nI@׏ىfMzbNfݭCi4p]DŽ8uIS{5K>O.x{O <$)ƈvl(%4 L/5b둔sN9~>P|&}QQ;4\s%𛹅c;}O~_R^&N[yon`ʔ$oLByg9:J6_ 8 u&^ܵ#>^ja˻]}/M7֛3Kӎ'.r"uSuriq+k[}wjGКq8]L  LQZEESg,bwA-hy6n^e d5CI|2g1d_ IPP|424fv1~~e,dn;W<~Am]ehQA./]qu&E? tnEߕj;lLS} ^5~ى~gMgjt*3zkqH`g.KƃiM}ǿq[Jه8ӛev@ @8ZJqO&|Jjr\IM\~ʼ|:U:sl e;k*.c; &=|Ѯʋ9Gb @R#Ҋ'u e s[i~X *} JlU*2ؘrɱֳHruBtEX0_0]G@! gωǂ) aJ-\ /y(CIO @  f%!Ǒ@'Ο35CUjXfW ͦ]Foճ ͩ^ׅcq%C"c'twuS3&5b`OX;}ybnrQ,My:nX `ٙd-5OGGZbBT?VTef3k0ˡN YSc\YF:ǩMF?(f =FPQqYv7L rcH۩ao1~Y{-K,ROhD|Nje/V_J|p KIIq"m-(ݑ6Î=i$u$]OzhO}y6-z=Оi}x\NI!|[3+x{3.4-C8K@" f%ҴĐ@G:W*2˟.,$w@SN]7=+[Fn*/`?7w.M=;)OJLa|{ 12'Y|'4򣅽#+kգA%ަ^6TϤG3\\e2a2ɥ'+ǎNYq,AE? u#([%dBCveH@_ŭ#ͼҭqRYiP͵Ϳp?mŊmJA( vRnKg -Yޮ;TWPH~lN~*npmߝ|пګԗ}ߟ]@x|4_4.θn;3UA~=(\OP0+ ((T?7.Ԩ-Im-VeCuPƌY]];D5VFvڃ4YM Dq #JeJkFn5jaJuj2mPMܪcŽ*Ii&?еeWB&XV%U+LOeS>$)\"b 2/rNdiӬq=ۦЦssCkZ>J vW_s<ۼY:w8}*j˸V ?[/v4yBD~ wmwx!o̕y$Q˖~Q$U>ynm(}LJ96ޒq_tJiچڑDmز0-Vɾxd)@mkñ?KSZÁ-6TfV WΝit c#v.;^nUkAĹg]2Z3ZUz=P"-RLc|Yȉ:3˨&#ڟH5r g/N|6xKcc8ݢ=l@kzpLK{So n l_h9 rdo)kGֹL.>IeNr l#L _g%ၕ22of_1Gne_+TcV3)YXVTBfn9JH-qX e jϒ._AKIDK5IXb^+87ųʣ,1aR2":itT7%8w 6 R!G=% ZyGi7aV2AS>[hzK̀#٭yJJ1R~@^.E^x('\idmJGӲ*&MVΣSRdJXt)B((|:},ZoA8c lr][+γꩾqm ˘[סhdɨVÜR:{qEkDLA3YDŽfl/zRuY̩s $$#`n䲆EF-z*]$xҽZw[,qnfF҅4veKd-Owy厣="/c}R|3<#gasX׫ߣQKo\Gs<P]&:4@k=| 5tI9Xy1yrO!R9p .eĥ/`VR%W-dtV^uq0N"̣-^"Ţ!:<„j>lz_ƾ\ڟQ4v6EqA=6tO{UOU}t{3d$1"mE:jVU:Gіth=Z;U(1b;G I:{#O!?uy@GfoUKHÁ#0 uP)fiʖg" !8z_OBq?Grx@mI[lX:m=ݥq{\ C;L{C0>8鲃;i0ڎ6d 3{o^{i<eXwPkۘ+_*UƲrh:;?GLt1][lU<X-Zbw^HuZ0v[X7F WC !JKC/ n@iP@ ̀)I9%##æ{1?J3ʈͩv+S+1__QL~Wc[|ʵ;;VV=TDaqKgZ)Q(kyxvsPPҕ[\mJjOe4)iioQĦa G):(3NqS݊Tn}YwV ;_c!3@+͊elnY13wez江ݤ01n4;Uqڪt9 ?j=o)V_owۛ yү#?5cq9E.̰1])mԍyOYy/Ξ?aӼ?OD O/N}(Ln?9<.po- o~4~ŵf+[AW?y2[ti1C/+?r$%MǏ6(<\[/WU<ҕ&rO-.W&zЀkeo>EĄdu`匫LWїBNL^G|C/] x~;wb>N8kx/yy0\ǭO{ R5["49l2tf[vgDJr'jtq5*N6{dA#g7jVB!ު>8$Vs@sdo&Mɱe{4`1V 6+BQ>v!>ڴuvU 6OZԮUV`m%A:NJx3WNy_|}}>+#"ؗ| jF;}0^GũT[f_b|VVaT"KאeUZWIrQAF4H? ϵiAX^Dv,I' Wƚr¯F5baOװo-sږCb>Ktv݆~ /gUw^v_v:DפJT 9q /5۟_9dR,C[ amTH)DAI{|V̵XƶZt1?vËh{`4ÿ9< W}˟Mb<<2uL))Dv,B gs|qm98}BgI\Z1qKz. ]3.pO;qr_珮 /5u=嘃|Չvr` Q@ CGzF9ԢǣUٴzm#<1)[:F.ݶaBrƿaKV1Z_|p m \:w F.O:&ݫ7~+vmwr~(bv/XC\ODFxf \xm־/3a+h۶%zN.zfAHTͪ5Vxkth׊葬NtK`t?W} 2^'ڴnNA?po3K_ypaa5͚DЫx^hNݐPBCBi,$?׻GW熄6{YmZ*/L['Z>Nq_u=}\T<)#4 }܅ƪk[˟Fυ\zKZK%{?wUEX4|kj0%z\g"jPqv:L:j>â8h EQSbG*a׍J?jE/n_@ YL~dzwyS7FTjDu\(q@.~_Ez=2"/ϡCXc^McC]˂TE-K?꺳yx?v.eTN`źGQ,f̘YyG63F+3 l vr<֬?M3_[qqPh*y1dgch *D[毃8ppq] XnK~\WPTr[xRٹ uY(?}츿t\ވwK~ i==3k m=c'k%$^C1c~Z3:3=u%/:1o+ezpoM2ou:4DѥuevV>. ԺJmn 򗉿h) Q@t|x_e )WNm\j(SΝK.ϹJ:oz e6nw#3Ҹr2܈kXs֮CFp*Z'X&m"bxx1Ge![HA2ZПdڣX톦RNj-DOqD}viѓ&Mg^̚Ӕ-DBpޟK=# 6 oo@,)3D#"`z3 FGӨikƬLu %49M< x&ըJ[\[v-iI-io߉z!ai1녅|:5[^ѣS/<5S^ֿlj| #]ۑegK:aeqM׶1W8>>TލeU' .4Tn:TҔm<13J63}T:5%+˺,\Ϫ@X7F"y/#+ag% b_ F{3f⹀y?'xF*H]H񥐞s)g0]dcmkhS+WXا;{ΔƲ#lry&>7V# ;ipG,3}G0y]I( j'ϱu %f' oe6-.)r s[`p nj$"&kOL!&%Su[On !B4`оI} MfFzN#R-2qyT5FWwú1rla>w)B?!B@b";SzM-|hе;#*}LG?#78} }lOk; ^(闣µM)kաX_/g?M Bj-'(p{ckRre*zsԝAKx5Y{H}8j Y ^Y۝©Zo bʹVaT\~2U*PF դs9b=3?lT ylO}smZV42)X0؂^;#~m"d}kV? ZQ]^sήo嬶9{/׹(A7kT+6󸿽Ea]ْbjkdҼ3r@@Ph4F$')j甌 +*K~zr3)UeQJǾSl ʕ_W4yG䅪J[w2v7mQF U^ݚ+SUUtC1nѫ2QQL7)u'Ss(JAeR3o׏7URM~uu|)oP\Vu>mϫ+7bZ݊ʓK͎Ry֧03!_G1(I(>G1Z}I4'F OS~^fY2U2f>ܗIeZutg=V9J>>Z.d'9nRΓBnL+FV>uno:o**o%2K-rQm{ɓº0(G&7SO=(b'k` 0xxh{Y1Z-+s]Vg٭WkdZzt4gh\r$(~jюAuMzD1pv&v m \:w F.O:&ݫ7~+vmwr~(bv/^\ODFxf \xm־/3a+h۶%zN.zfAHTͪ5Vxkth׊葬p;_"҉)!ٓ~RȦ:ѦusJ%髟%V 5ne-$/#t߃'it]i{9uCB ӳؓjȰ݌#ӫsCBk ¾@ӿcMZ8Ĺeq4lrۛ!$YFUiޤ[{T1qfF+j6JtplПPo;:ӓU1s$x OM5i9gzǑrC}םՃYj48?&}(kiz1#m'Sz7nǙ/r:ݙVK8 &6&0[37Qc`+,y5d1iw<o>3SZz<IQ_y/oa4:֙CT \H_ HЅq5q*f5;>"Atb#h+ұk}/K*:ߎlZ6^pv |:լʕJCv9uHI@.KL_qmx߈}3{4珶A_G8/(_5"Y@z|/c_2NðR*Z5n@xwE֕ٙK2LWJE){7]ƨLtI׆ q=޶v<+ɳ<yG<\(zۭ\'RQ_Lm]JRPݛ4 =O 򗉿hBuru=# v'- Olk5489YG)\H&)hPIA⎇1}quNR#L]%*^9ҵhixT_?HלΠKP^O 摬</FG;ز-?qz ~l"ChVoC_У`>켋wȑ?emNBᩥ(ָfCk@_â3u\6\KhK1^lkƒM$wӂbxg{FEA#ʃY6Ӭ¡KϜ;Oީh4}jL)99Rc-9@?bo|19س1em,g6^.1m &ȍ7+IضB.}4)ΥsP%H7=H0 .FZ䮸굌;);7"֜5r+PQ=bο&7q3>Gy3z^*.ɯ[Β3{W]G!kQ&2 oUe?ɚG3(VnvpטYUY~xTǍ'khѓ{5fx;ztE&q?3R)7?Q8S샓.W#]ۑeu~j:(nK|*3 ,Wmub:2%;Bӂe'0ݯ[c9ܤ-\>2MQ!ɞ Gli~ ig/c)#+ˎ\WR(;WS$f8Li|}%szgثL\_iFVS[_WB\+)?Z=wZ6RLزϽҕJ@IX4MQ^m"QĒ*=|UV?ԬxA[eHl>&72Q8US/1]V~5sP+)Ib"ϣȵx~2}aQx!]y{AkBJ[yO-.W&zЀkeo>EĄdu`匫-A>?bFv7AD^ߥXZF2h˸mZ\0R˟<ǒ Q*x4?fl!oBxF3{әm5Sc)Iŵ zSFE=|2 BΑس} 5+l!HMQ_N}.pHYۭ42Lfcf,b:'lW!uB! "AQXZcخ] %_ue^GũT[f_j15R2|i=GNexdO GdqTq@5V&@QAF4H? ϵiAX^{(X0Z~ ks_oz, a"[NtAzxyW#a10\X <ήo嬶9V5A7kT+6W`e\,OZ:yRVCXX&ʼnB< VÂx4w8Rm}s`=p'~[.h߮L2upc';F3wpeݷ+Cq,~[Ǥ$c,djUM/s#Zjա@O!o`<{3n0[hi~K`U=<\* {?a7|(GJ毉OMԩ\jϫ']x9 ~u"ӔB<Jb,~)q7lI*P*ϙ2RI0o{06s0atCppmڽʊx#av<1}'痏"m?l* |DAAakgH6n2sҁm;1~]䢗hT:DެYSh>Fikx쥪7Niݜ~<y妔Fse[ q %4$ObO33ZQIWO$]婞n qnwh8 0*׭ CIk5"ҼI9߃kRvNQ3K_ypaa5͚;񷎚uưza'.?ޟAxPˉ~ oDR޻%?}ƴ=Tn}X(Kʸr?buSy{5ɎM:_6v- ^TX^QKGϱlvϾKS7XƮbb{w+34}V͌Qcw[é>57ieqfGkTҹsg$ {7S3-^9O[\j5-'C<>3[*;N̯뎒p1 wX.Z:ET?i;?}Ml,"od,uGu/ŔM.1iw<o>3SOc9$Nؘp] q \3_uwԠxhNJղC;Љ~HǮt/ |;ҳij5reҐ]Ng)|kL_39j/.:DցR_X^g8y# SoryXH]s1el[yf1]B+^߯ 1S.5ڰ!筭n bRTF:mf4BkOu^xLE#TPAO! wGי 碉>mXz</FG;ز-.h6[Ph5;E!r$?OYS|{kp5 /߇a:Ww.A}|9{~SɳaG<6lYYCn4hjjhТULVcJMM)\3HK5ߠ}3/}æ լԈ,=ETO:E=eo=mgBRIpƵL'Fȅ(TZ[?q8z(v24b̙v|1k tڃ6ƒFDWYCʕSl{!?ʔsҹwsnc$훞d}͂Zw[\v!aװ+]ڍb9k}7S~7\=o;RO-xO>[HA2ZПdڣX^g5?3@IP7NHڀAt$'Oc㛑YeųWq`^2ݞ&ww}Zv^MΜN+"_/p4άAIN $/_CLL!:zx#Y|EV˸ym{CXVu"_U ijz3R/fiʖg" !8z_OʥёGRan77Sєsi@BՍL 0=؅CiԴ5cVFHo~T:ܜɦ|H)[2 3*:jTA{m۵ 8o&}[[6Ev^V.MQ7~'&rCQ90zI[͏C9ٵ mڝ,_ԒPnݖTƿg8[jyf3(JƣLm7W1,@B( tgߙX/ndHaIk-r!ӋS?J\1Àwz<&]ă˟<ǒ Q*.Tax4?fl"$,&m= @&<"i}TtAA%!lދg:#z<)/IM MfFzN-3qyT5FWwú1rL`>NAc9W!(ъmL!BaSj0B!D>B!j7npSS1CGBY )iu_)㼱 0B<._( .nqVŕ` !x(L&4$))ィVŕB!Z&>Z)e\0JZ.MB!@I BXɪ*F` !xhVI$MB!@I BX!T9~Vɾ$k)_ɏz1-WMҶ|gWi>S:e0ԳlnSіLpׅC!=?$׷ưNI wVI)Uбk&>:}p7&!0)UǴEՠjl:L=sL}?7nC2fAFO}tY壽c~B^+<0dJ 0B<~Lį[0 u2`4Pptb`4a}JmG-z.yS&@khRLpd8^_YN;*h-L|o%M%g@L! N3D>.A/((F&./KYڦkZ<M5KӪβY(3ؤ/lO"k/bìAˏRMIǐd~xl@;Wݷw3y\8]AK !/6#GxIe?'<0|.ǔ>98{NѢU.g6>3yE_vc߽?__Y  ̻ތq_.ah|[ޜ9߳=23tcR1s4= ]ͺ:畴S,~:^c3p6l*bHL!o}D'+i+ݱSU!ÚD.⡥?xst<^[G|5xfyt9[WE*NqT}ik}jR8KRJ2))ɤ$'A5@!th]=˖wL .ZOJN41\i2xSጾHοDL!@hu9'N`ڿ|.pM}WͿXnܺэKY{ژ{GИY5'r%.Ezv};$j2v8{N̪uo$bxhoHk2Y,yׯp-f^l"q} m53F3=$>,EV@\!C`?Of|g}՝2Ȝ?=0(ŀѣ!$#F}U&1[UMKŪ.B.y 03<恥b !(r...88x^ &EԱFAQj#ew[j.s@>`Zcږd !E?"Ky6h\VP}0sk/B!{Bl 0KIYܔcB!<ʎTMЂ6fq 0B! Zem-/ZQ[ҨB!țx<le M kLKAeM)B!(8z`|{<^fFW79fmNfyԘm>z]!ٌsGIJdY?33 O3S .5 .52KW3;tn=짥RN!B4t=YYgXOfpe}-,0j05XfoFնi[;]`2LKRL!B49?- idfOe?3P2e %"n 2k"3[#5K#;gufr 0BQҨjAfq#w+ҹ3g-i-I<38q@4fgX)B!M,MdӘgvLM3g̜PG`jYpvac~.{p5D.B3KM9bw=Ln 3j1M3Z.G2 BGfrB!Qi)9')<6@}0 <5f?̓͟b9Y=@GfR'\l6B!()j-9`4Ej+1'yJ-A2gpiXZ &%B!DI[s~jM9N~iA>9eg|Ov` '3f~B!F[lZۇ8{LKᖚ-0"M&#mcw!B&fk ZMA= WY59EQHy`[^ !aVMmP4 TaT 2ARB!xdҦB`-sjXJ)B Vm 4屭̓ 0s>,Z :-xB!%Z`[Z0ikpiy'@'4lo@)B! ( -iR!V/~YKZhҞ4B!m{Fk/JMB!}ٴ役'ْV~I 6B%OwLWTA=ٺB!x0\u!B]~B`=ۃ $`B!($4WTB!9i:B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!(a|Wb{fIENDB`pythonprop-0.30.1/docs/user/help/C/figures/system_tab.png0000664000175000017500000012653213736105351020321 00000000000000PNG  IHDR3T$BsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|ufHBBh^PXQг~? .V,AłҥCZ^ww~$%l $$ 133,T3F]lȬTq  0"""""ީN(N|DDDDDj֩Z 752}O߫`#""""R=< !U +-d0d彧qhDDDDDNMe= +%D(jq~OS.|xjQUb* 8UWQ,V<%<=d])/Tx̧:&FeA`q\qNgH< 2N(skd@E2ws.k*rE=1eLǮϕnn+jWUWόP\yzk~BHp3+`Ȉxw_ÌR:'.)Jm^@0#""""e|(2ct[1TԐI/MCt'C,mcNqHzeʞ3af%,O3sMl"""L_ 5?S6xNIuTt[Fv~FCG\ 1ݩޙ8̠̓V1""R;pӯq=H)h*:34TRkfuED}pG(=47/:_ 3LjΒoe[ٝ Q+zǕč-f68hg׏GS):Ȓofłpߠ5-qkx֗1Z燕{ lB'r1̬-|7Ka΍`o>a^ #}.O-╇mq}V&d5&ffxz5lG^dQNv.7Dl_9>C_ ?<'iGf4\,eۗ3nc>k:TkcَЪq'f*ꩩ(֙9DI[ټ~#/kFTCzBZz2ZٜCO~Zt$?66'<-o:-ODonNk;~Ͼ!r 3ȩNNywөxH1LDZ{зlܺYu:v ާHrDtHsA^=i:VG$ m\yv&K݄<1)ܵ$A]hWWLΚT,kwBV6%vLcꃏXL'}r-f7&K(*iy긲q2,XK?0N0dTP:k>ڎϾ_}ˈ />^Xɻ;SӢ:Ìd?uDDh?=Kp!hm#դMymP$k:!y b [[ds07RȆ[]ɦx:+=Zp8ۄ`ٰEפFEV5 L.Ljp&9)*[:gFD{vvj\:b&z3Vgr)}_b:5]M̩WDDNڍs;| ݻ9V\v&SУm+7r֔w&ZֳxlebR'~~n&NIpHK{zXuSm\eӠA <Aݞz_u%~6NƷE_vhaL|G2.4b [!RRM6f̔LG`:~al\L,iڿQٙOP{2{4/m3 voQڝ_<t5CZ<݅-7q1qA g琙~CG"3)N#U9~ߍq|(PV2=mςxZ^"h4#sihqQ2Z֪mi e,J|gm:*s#սN MDDӉtV܉B\pSvKDDV}on&G :jcZmʣ^KM 94Z+=L꿓Hb i?JƍB""^vW93V|/s93/Ҫ]GwdQ|L6sfJ9gtfv\x>6VJffDDDDD$*"""""fDDDDD+af:LDDDDDNV-_@qFDDDDDN3T=3v͏/Va&xb:LDDDDDŒx%J 3"""""fDDDDD+)̈WRTL!?v1}waPP'dD}L"CilߘWc?Փ9yÉoe7.OX"|ӥj~޻3WmYĆzj}Gو|zbkAx_~ܓ9yE9Y~6\sMJёcΙsڤ-ls!ϲBkAa~ߝqe"jۣDDDDD"gXkq$iB@O]ŪirN&|s7L(b'//U .WΕDDDDD"gVD0``>#YN7. dȅⲻ^Mkv7`2~]2"""""ne2[ߒ=rs?Y8Cy:"""""Y@`4` Y%Cfs@>p.Yf(z#gVό5fDDDDD+)̈W:gƫYbl&v;DDDDD(̈WRTNj0]/"""""^LWR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WR0#"""""^ɧPkWvDDDDD(vNW13¡ɵ݄SDDDDD+)̈WR0#"""""^IaFDDDDDŒx%J 3"""""fDDDDD+)̈WRIQN:i9EPe{v#0(F-: +A"6M}4 ,V+,^DbFID3 |l4hDio{IH:NFv>N[iצ mN1ޱy3p4ޟQniab72{&c #i "isIs'5[iӳlRM/7zf8! ,Ørg:/SM"sN#cE;ؾ~#/oJN!h{d!7x\αIA%߱p_0a|W[<n?/G`qmVҮs7s?<-l%tНN91ѻygzVvУMpVZ/PO (ڷC$n:H.7c"""^Fa(#gwd tlQss3MW~ <̚K6i|wAfVȂtjYWNvd8H Yr`'3?DkJDʿ_{ؚ¡ 8N8Jd+x]΂E u&Rwcy-ֳ.|:[G^mh C/cOx`Ǵc+8A|)r:)\0q \^(*rIV_|4jHe+NQ|t%hͅו>JEJIjԆX͍RWfSDDS)!82vjKN?Bk1vr[d:ÏY l!&{G%v]e4jCrJ&&YIr}1t+͕},]X:u@T`e9ӫ5@tU]1zlmD3> ͙}+\GX?bv'ܿbU,\ya5 ]St>vza#8ģ_zrE4~FEN űg66Ҍ'fJ9ȱrDu(ހ2|lnJr[J%#GiJcw'EF:t*$ag qݺ&͆h%Ө ̜2Ȱn\I,IoFyTd!iݔ& 8rjrv;иY%b`F@ ѽzذ 6ڻ'}ӉçO>øivJ<' (ŧy ,a 8aeBI讪#ܪKH3:5Kf}6fDDD<0S~h+W $86 J$ l 8$Kr&{6mNtF*&f*4 Ŗ!G=:R;gcfa-,4 hV0oؒBOd Ӵ >} }" rRIjMx)|~ڝ>$ہ:r_🩋( kDޚD*t֏D_yo<$p@ną92K0-ZFaJf܏׵F MԹ3O_+LesVƺs <{*2zN-,e%rnV- IDATuiMYhZ7"$7#CAQx ,(5'{ct<-Lg׶l?i:)]&݋MذE 9wuQ %Cگ+-qT2O[NI-/GZg|Lx].W ZBVZm)iefJi2OLߑ>vƇ42MOnPfl~9xګx)1m@+2O{<VJLT0<7o2>3}2I%_T@lf5ϰ !mw^{ z6'uva6ư9K?ZC8?>wԐضhxUl{Tr333cira}3$V/jyF ٴ/ԚX$b`:}v^?rc3j ]q}7|WH p۬?:.iWEߧ='>K#|ē|@||XY\,$mlޜ b4ߜw-ouS,_$gZ׎^yIx2^Uڞ`T<̀1o㍾ٱw~Gfq3͙ m&7/gE8z.[6g}FBP{b./||Цݸ`m>*rv./X|),t99ꇟBT&ZXDмI ƚ|9p9O\؛'Jpzz?[[;W|Ŵ~e٦$Rd_dB^..3+>06ƫJ{#x'Za ҖW7cK7ΰn~~9|.]/s1{k pz?WKXt9rb߁adR{48g pl;|MFpзV{9,W< O߳3B\ќ9LA2lĵdjbFP  !WX)tL[C KaqyI\Zl99IFY@~[ڍ4  %E4_>-}㌍(zL7aGri8Vzb.XwŒ39~As6$̒ƶu[H19g%vڽ?$YKt[Al~z07‚q9^| ]8ac/osy{Y{aGgE|t$15>AMoYʎqֵ?1'ׄ51^,-K.NJ39F͇r +$e_,]%?WU^yy G> V|P(6-$qWL{o&x.7_wq<~㯿gip< ^;|4>]i<=_ʶ˸n@x_ɎWJG.NJ39xzJQ`q.`+-z#7'46qJ_QKfHgFDDDDDŒx%J 3"""""fDDDDD+jf"Rk2q0e8n$J@PQ1կ戜T3|U0#"b]Jq8ۄcZkIUVgV6AVf:vELf3ٙP3+zZLfD8FڡT;u2V+a %q*Fș@5zZu:gFDN)h,N+3LJHM_M9f}TO=0#"]nN6 dv3D(g'S(̈it8θ㽥jЉ"I5zJ 3"""""fDDDDD+)̈WR0S Ι8-\(u'Wk%-9?rxwm=nkMׄx"?7?nN/^K⧌^8O7]"Oaoaf0]wč^%n,~.`_c.o ff G8Ww׏a7]50_#ϣ˸9vŸ;|,7<99>֊?^xn/(aOapo襌s*??m3K kG3p@zń xjk82nxEwCaR<5b_zlcë\:(z7\̳wgȐ<^NE8pT'꯳zYkcf2_=nbp`9[3sN`?Ǝdկ9K;g4Q#mL0?MCjɺ<a˜6_ g1뛏xVM}]OtqgJ'~궗z%rWo[rX2Y>ƨt==WS{w>r[h9GsdX]gQ$<̥ x3Ī<==43뗟#~a;B*ѱСsrdp.Yt ڂ޽ٲr9fK$ѵoW»K¥,H|_,Fҭ֬A\.l8?oo!Yd+,b/y ! &pAdqٰts&lsN}o*~cܕ:l ߔ.NO,"k GŹxPCrXK1.YΟr߾=Sx繡G^ٺ^Ș<d͇;o͓z]e<ΊzYimoI&kg|dXuo4GF\r-6ea ++b /~<˓?.h[\g?0b0cƼ(R:4ݸ_Y_ԗUNK,cLd-Sqk\=wfB>d s~kUN!q|vCH1ؾ1|eWV6`$b4+O`ǧ.Ԏ1PD$~'W< Wv{(#v?҆U+9q]K*&Wbݮq=$;8 w˵1ל𤓔>VD0o_&ݷTlg2>/bܼLJ7}IMhn%c2z^x%?pss̉b;3V^ nLbar^?zv<(l7[3Kc\ݷ[v>>dx2qc9LC_ykΤl1[sacI>͝qpZ] Wۀ! zےPKhfmX'/}ѕo1kJ|Gn g>ߍ-b:_|_I.fm>L 3"g|1I7Dzy%t[GjubRkr?¹;3uϼH|.`C] 3o3 sk4hsіu)GpPb 7׎b0sBNٶ|RAy;XքF%GVӦ:Qu6Y:ҖfLv,/>u5_ɝz]A-CW5UgOW0Ymt oViYn ի99IFFf`K˼Ϙ퟼%TEwM+-sN|{Я&uI}5M1K8faR[vmlL¤%{^Tof +o"jQP6JN\9Y0 |_zꖵ)~ZϳVys[rSɳN k<i#][ 3zrʶe̸ՌOj{=Cv⪫jTZΪ׉jce8z5}.s~uu/U {_NysHUkIo} םO|ܕ?X`~ytmA xc{,b_qO+MuڸMDw槵iщ85RgO_ *F7^OJJP,{mf)<55K"(A~tix1(TKDG<Ȇ_>ử5Kbe||iÙ. U'xgi2N'y64 ML龊wg=:Qc9gfAӶKhT5̞m98cDUkOmGeH+wQXXHaa!9ۛ|2+>۳˿`f9k±D8ϞCnZd !tvr`f-{=if ;ٺ![7p$Kٴ;=xx-k4wk('&k?LbȘꄵ9;YEFfԪA;3{O%e~ll۔3}h:zyexoneR.y' pwՕ]fg|:_DTj3VW߷0F˄{Nb[p {メ|bu7^Xzte*S^'Nfp?==+F'FEO/gic8O>-}Z>_?ws0BhnzdJoThu5J$y$ VPbǞz-{+Ch+: IDATCq;E5ܳe:|y}^.]\Lk`rufd\˥/ m (?1 y < h{cg9aʹk*!ՉRӲȭOIn iz2L&7=OؘiY)k,+Osc_ ^2ESl#b֚ӺD~>ݘ:snlD݆tQy.*2?.pZP?3RjϛcT9y wʙ2̙jɋ~TU/KbX :eXpL\&[,N )L3-=p6dswƬa+)~}jek,"r'r6g"LDr8GVā_h$0dp:߁C W X^CDr4g"L͌H.0oF"ף{+GW!"R$wq6菎BD霧$53"""""̈H3LX,EhUKC5(3 &}̈H!:*eH.e+̂Iyj53"J)ٰXfG"9b6s6,e:|EY(OfFDQ=DF\ gXđC(V"N"2Pfn,"Q&0/_ϝ%18,Ʉ/Aef<:53"0~ESXE)r+ 3fFDDDDD\qIjfDDDDD%D]3`6h4C2t%\YfFDlI".oL&Kʲ8BH΄ .&2AC$?i2i֩<u%KTYbՙL&{u@Yp(ON̈Hx A(3&77 ?wѥ+̂Gyj?53"bc pt |vt"2`RG͌9Œ{K2Ʉբ Er2`RG͌$53"""""̈KR3#""""".I͌$53.jݫ!?pGosßҳɃLeNy`SzgbXq&Ԯ0 >?nx0>3+"I-ŝי1g7mFNxj 7<4k[ִX:Oۆiodw^\Z6>C|z3Z<쓙|>v0Yȳ|;_TH#ռJP*<2_O%e<[$?UKW{ڏa񑸼Y.9t~^K9ũ_6k؛%N玓,Mdݫ!ԩߐQa3vXJ8]^fFy*.F͌ 3[Ƃѷn@lQ_lނfՊc5Uɹkؼ~ׯaj;[ڙ >{JYd>3^EyXy rI}6U3`!һ 5vق}u)s=c f"gmXJrPG3{lawd_>?mCB v}È?d1v˲g~tޓLvZ,hY8:{(m@r*3z {9s;R@>Ǧ 7~IǨ&'(OsDASG))_(`᷅n9c={)jSi R?t#^ヷ ]Jg &9j];GZ-fЭx崈O2hq֎Qh?iIfq?\ןM˖xJ9[a5qi|^ɉ|7gq ݑwTVv3ksaʈ~jՃ2nؓp~Gv恶xdt~=cͼzpa/LE(B^fFy*L͌ 36apO_V/\r~b*<ܳ~W,;v[i~R4_)dAm=e+/Gʰg[Mo`zI}M~Sދ-0#9oYɚhz3FMۚ)sj0uNHgr5x ĿoŽx䵴=ݷvİm6<?@uwooRkֳ+֩-mӟgž@sߢv6nua9po{,ۧxt"V>9osvj,SZEf;' V3עw|F?أ]) log~y^iL {?IZɹniVvtypϝ-zVZ1}8*%}o7 I4g[&7=&#nȞ6+h+y(:WXkv%Y9x-ѧ=%xSefYm=Ϫ9kѝ;Bb_vy?طsӞFpofMtr)avL n?uEܯrj nZ-ۮZmWjǮLxZ_{[Rd KWX{Y<5/g`_O,jjknc9š#IU6;ԞS`lu U$e1*W)wˠ,V*n7nX,-8pTf޾"ef :>yr;GY0zMVJX$ůlgzC~;e sh Oxfǹٻ|qV+L6B 1%q*Y˗!>ns#Lظi-|Cx̓Ɍ-h[5'vP9,;xȈ1{;끧'DF\lem]SBOh_+eg^+pcgJQ.9ѹ>kv3w7>Ƙe5γևG\ȡ2/ҢX6m}^jG֍hժ~gfXgK0y?ߏ_eYl) c%hٻ-I_ efa]KSvqܓ|wCm^jc|omH egV+pp'Pef^>gaѽUμ,5*/ErjfD$ϕ,Sa'͎.ErllX(%˔ut)"2QO͌9?+{.bq#P8E䛳E ef<:ݚYDL`^>;KcXqvYF oo_%̂AyujfDa⧰2SVf&""""".I͌$53"""""̈KR3#""""".Iw3gjmF]hLJeNK"H)ON͌8ٰD\ '0(*L&GeQNqd-諑 =A\L4eRH~23#dӬS3#"y.J©^.&7Ő3L׏4;%"2Pf҉-~?c 1X e+<{xˀjsPG3{[ݘxk&:ʱv쬄B v}È?d1Jg~tޓ$G"9|l 6Gߺobȳ5?W[1e0rS6fCn*C[^̝>>'N^݅"mdli?uFʙ_̖ï{~u"alp:p_Yvmaf&XM_8].u-ƺet}~ɥ\WmVb^;Mƌ 3%n <\l[̤T3P$o WrFzr zS7G,.Rc4>̟MǴgMM٘'[OMy4TEKTp.N6&f(:|vM\鉧7>S68>M߮mhҾC'Hm6i9$秏^b`4iֽ֒G؛ f04mٙ^L#qlMo%t shOW-\Kz ?hƳcf|Z^7X|}<0Z,q6+^}x_:v#A[Qϵlrέ? L77Bz̀/Ԅ^]JxMӥ{n|Hv7,s-ql{]+oxy_Gpia[6ё+gwbAt6D$g`V8zcXl cЇxOyaHZ4W vdgp IDATyf3"eA6+K\r5y]ѽ/-_ɔ (鞇ŊfF [gv1w$ހ-0#9oYɚhz3FMۚ2*aY\)Þo1A6.^.Bwbѓ-{FG«m//5 0άش Z5/u'b9poJE)p`.^J@ p?<0>[>᩾ᗙPc*78P_9z'dv c|Dת 'ᔾtYoe5\?a=V)Yp]yAccY߆b!{R:;PbjgXֳk+/S_>yi>:WSWhtao+{Nt-siO%9rցΞ)դ@"8x-Nч}^㳑M(b[z/ɀݸˠ۱ LjB#SF4??8ˆت2Q#쏁y=~V4hMOpLnX/oatm權,aKpwf҄g+Y'N,߆(vj[V~ Ap`,Cұ?srV̄S=Փ_fyKcF\L 6j<€KOˮ~X]JZl7ݳoNϚ͞f2ecv(OHgC3nd-̇A#_#9ɩkGdO]%I r\B9q3'-38tU& jx4{KӀ bd?]ȭV[ݼc+G=kVS̒;wJSVo~5Gr_=70FlLsn=겹$O/P>ov~'"}1aPB#XlDEEaO.)yVZo|Fsƀ<8Q6sט$a-fguŖ1^CRw:#щUvf{8z2ߐHB<(dN$v}t9^_f|&=fdMOMfcv8SV)OG͌{;yd:,9M?OO<ݫ3F9ඨd.t X1j 3|72;c/oi{6sbXlqʕy Y(VCR^^^آcl'bU"q\ʢ5٥FvkBla銰}^V:Ovs`"9XАNBؓgKxk7y.{>\fN\Өp؞zs$_#nnɯ"lW̿O"9 [.6ǹٻ|qV+"#`ݺ6/I+Y)^Я_ñC^2U/qfLfiB{H)^8#a&ZbrS݀6ϱeaSBO;'raVϐ F6nBh4wFH9$pcgJQ. WXBYhێ0O''x̻ Gax}AN1Øi+%|-8v\bDI/z ky|{h'Krq ߓ̽2}*C$1rhʹ'9q&2嚡k|wwwܽ1Y荻>;epWC&S pO#/.6fZV=75SD 뉹 |B׀-Ǿ3Gdfw{~>ݘ:xdc {on#*2?.pZ+CecF,7 3e3Ւm^^3 8 @tt5(`I5YSM4uY>A33"ӛ6rFM3eS }yKW [MS+[Hɻl̰ Hq{RHYX$55&Ãt5kXl pU܀u,DD\^fcF"F͌H>` 'ѭiLǎ7{쿖x=EDJ^fcF"G͌H>` W vt""NE(|$53"""""̈H3LX,i\TŌߣ!Z>jfD$yy2$DGE2Def<s%˔lI,fKd19J2e]H,xS3#"yϿ(Ŋs"#.iX,DF\ȡ}+N'lBYp(ONf(/zVm]dۗ`mxEr2`Pfq?)EDKR3#""""".I͌$53"""""̈KR3#""""".I͌$53"""""̈KR3#""""".I͌$53"""""̈KR3#""""".I͌$53"""""̈KR3#""""".I͌$53"""""̈KR3#""""".I͌$53"""""̈KR3#""""".ILej~Fcut)qƚDDDDYff֠n2\l9i oiL?d9gm ƐA!fߓҔ: Bnz3<߲])=yVfAYу+^ _#xʃObtScЂ6U>;x `aƽěM` {Yi;v]S|rEㆰg)V1<߭0 WFYQ-q&o Mx'ԭ*Mڱ {u$7]Muskv7q|9:y;cwwxOT,O;,~V ^{YHMףXm 1Yx>ڔR5_{+۸7;Eܮż—O'2˝D\ջ Lۮ~ h׵;zS7/Ұ__뿱a\hכ(։z^V} ]c4 ՟^n7 M3+`?OQrB<1xorsrzfI܆fo1Kmlb{!f"mϰ]zIdr{0˱a/睍lXzS*MLW|f""""T ~Zѿ8f6PAcz)ժ5u )ae  6ٹz>fh凹{aܓ_!qsIN!^)QbH ;+?@ ]9O-ՖDb2TAu_nw~!H)jܶIfЂ֕ݰmesh<{7n'X6-S~\ܵcGv4:I6q\K3执)y iM]wH %,eDDDD)33IIl`5nHw|]n{c(Ҁ- lھ_`c/5o7N5 ?%z*`f?אBi?^sb"֔~-[Uæ 븴2J=ؽ熜YU 6G lO.<.5GftџjbֈX۸h,GoWKxx߱^+9J;ߏ[.O熞cĞ8CyԂV?KDUC +OQv/wlaڿ5q6(jg1Y\ҏ{MߛqRt݂`m|5k5tp}yD$\l:Oa;<=BZѪo_)P~og~H%=4Pt~Map+[ƋCLiܓsBqfF:~uȟҰQ ?V| 31wGFQSYu⚣M^dt)惿Rzu)jR=k7pf<"J.&xR?XSɇ̈ ǭ`΀@;Ma-w3c4o)Y1M[9jN >>>tD'=ܖ1 騣kUpb<"h.^K )\^`[yrT)lћXJiW(Wp|i8M:x63ILLXÇm⺙ͯ70q'w{G/ay\TةmKyanzB ^3v.Kor^?Չy .vYyj/㨙)ଡG8jL*7|Y-y,Ve1] 4 *Tbcij#** wu| ̓K9ӅА)r2gSaؗt.Z4 %"l tsGS((%M\Y;~ SGf2XTd~E]\WY)g0g%/>6RV,=gpbjcQ5jli|RgDDDDD%fFDDDDD\qIjfDDDDD%fFDdbq/ܔe1~t2`RG͌9/o"]H}]H,Q3#"ydr ;lvt),f3gB)YKW~jfD$r{ IDAT%XqCd% pqȈK9b)$ߜ-_(3 iֹ9)K?Uge4%0(X^\,YfFDϿ(~ k(3Enaf"""""̈KR3#""""".I͌$53"""""t73q+\<VfU&||(Y$4̈C ;IĥpdrtIY4GbXəDS&0!ug!33NS"(3 isϟ!0(X|F`P0:|EY(OfFD\\l ~.Cr_ю.C$_QfLSyD$IٓSӷ/[V}?o?$מ[{({:_?[0yG>sV-N%*& ^o>?Ĕ?=>J!t_Ɯ*W<%!`<KXXV c0/UNge!';<͎}or5ɷ9):Ux/^4y{Ʋk$ϷL]yIY:_]SioF1q ODFT܌g~`b&-j<"RpVriwݳ{SqrjfDWi, 5c0szwin5U'e@Cm~y|n6'!xGնO+^Xj-xzRԳ*OE rޝd$a$gN7 jڹtntEVw`a:̝'SGŽVT'tetwEڒҞG=EW43:uݖ՘jC7c45:T.y}>;U7Y |d%Uiߡlǯ[S*b=@Z)C= 9m^;b˿w ahjcxݣЃik&&H4PLޡ]NLdk݋#^tvCɰUSU%Ϗ|F F5v4tLNtVT>CIiIﹴy+iw_af"{cكt޹ⓆAvuz^Z5,Msovg g&*^UTs`%=BJ2=q6eC)))Ru=ںu0٧zו.o)!Q+{y]3._'] R jfòBO$J/wEOGx핗:!?X =\\j.zh]}ߚwu-S@Ӟוix KZc5[|{>v [F樻ęQ?ԼWKw^}s8A}@ZᇝO_/<~-e[۫=uz0 FtQ޸_^[6}w7R'i򡩉^KRqח׾VYznUz̼TS'5h#E[+C 8[]CpKZJVߗj%rh.43'1[.=q {eڷ3[I^:&Xt=!C罠9ln5EZ3h$ç׿StuT px7:wA@Ut-gi/h}G} {eu(._lG:ORRӭiy{PMuX:bR7>CtA/Yn춭[6O՗7ՕjXWKg.^FtLZz,I$UImko:IYfu`+fa+fa+fa@x2M3@0͠<ި@=4:.-=C۷nIt7oݢ^ЭP3{&it3:ݠU đ X[f<ft>}ϵeFOiڲiV.R]䝳sPOcKtLYJ k+Txrv-׫^-/A=4v ӧoX@Tf3\03\03\03\03\03\03\03\03\03\03\03\03\04õStǢ;m:rXrbK5+s}bh|;;T:Cuk1u s^H[Jfd~Im{?V6h7d$/4_ɾzs␳dU9 C~}j7Yic.FWW]-_hjU2gۿ??ZҪTwg: Yگ$SORg$I^Գ{45ެpn|}dhtm8V^vf6#FkC@kKKTiYu!c!e54p;z53dd ^o?#9VO˗fYl[2͝K$%)ɐl˒l)ly4Jç诿W̞GHw$]2drde!ZZѿe$G* ﵷx}G_6SS]lU½U$~25g߱( 7<`)3je];T+g<hPW]t2$iI:G7+uİ}S;Ñ'$]z tOoֲUZv4ey_Cvb=;m^x5\U$}4aٻ)?MA5_ɚMK*{{gF(mZګNՙYeь~:ֽ _'g鹅Ųm$yGܟ}nԢg۫EFضyh>IIMmA5U3ceK5zXЂj11K*IU%mojۚ*Nha-$k/z #p% W"p% W"p% W"p% W%z?lԆ VW˲Dwx@t[z; (-Zm[6++@$ٶ-0;{2MS۶lREImUސ T3ѽPOcG6Q۶lVQeVk׮UIi^k5tHTQVC U^^ѮTYY eZmo[rɖdLy2 +imKe-oȐG%Qmf񩸤$mקd+v߯b)++Kzieڼ(q^3 Nt! i}v6y')ߴ=jf,]lF!U,+--CEŪЂy^^mt4eY/*RjJ US]Mk%{@ᬙM ztB5:c3fIZ%JRMm[}[%I2r4;tښj+ VÇ'ȸURRA*]P$mSO432Mɐ*oЈ=/Ơ0Uߠ/ Lfz0Q H۲UT\A-**.QVDwlB0HL-&^/A %%1]8mf$mKe {XSTDw薘qD43 3 ӝddkпMԭW0%&+!mϺy,]19Rʋç  kW4%h= u)J3g>~;j| h.Н˖dxJ#SGK8CX0 X_o|V I7BthGYNZZ~4pm-yZt_\"+zo'jhoϼ5fITÖ+4$ifz;X:tl[UY_R$)>Ð1vx Gͺjo\{an4gVTTu e}f?y~o5k5)M땺'3+{sUG< U|^ul*(ȓ37G\}|O£uիOt)#>Q>œ 224tάZ?iBiSռapO}ֽ=ՌK%ezuњrݵQ=^43<>e-*[cz.ި['*M.y{5/N_o^>nyc5[tv*ޚ+/ֱɒUy^G.x?۷wcռWF+k?jr^Ύw=Ez8^3{9 ZP9\O#k7ꢻ֫ u3Uj-~4G;W=[^Bg?}0Aw<Nm)ɣӗSqŋέ+IdrtM?,~Dk٩X[<^_Y:H{d~c>%#U/2tu34癇t4w-dYworu]GI_hq1n]Ow=E5>By[Ԡe/_5޾Hs_4k5q@  MJֶz&|N(k/Ԙ7 ?]쑦(߇q8,Wvڪwo-[Z-:uܩg댫ևh(5޹#+sonWH%eeWmz?)+spԏ%[]OCh;JHN OdfY+ vg:XGIP0[}g)KU"ԭҬ; vT{6l^'hDOd t|_y+ngn4bۖ2 }_|nv<7';KfwUU:9$Ov=z;.7XX%b*/2U-}/%@ *_5:.גiI)3ie)MdV ٲ=ibʴlkKTb|fpxSD0JF;Y?iMA+V(:;3;m[CSniYOYY~Eťf f6J~ͫu|*ON?"9N^vv7ۛŽMKՠ@@;mS-y}]I5,+@y㶻 ԊxSDifxN:J7@ }U;Viٷ~(̑?@y }um%oHWiG["e ?ifoot`|yTڿc>綥GK% vTaZ gL3+;+Se8L3[5fKPG몟 (#xmH8c8Ovroʺ7k4|`y"<ثo=yY#^4fI+?VFtQ޸_^[6}w7R'i2&=וڲH< & ֧NO.YRmr-Y),mٴYA64 'ߤs[ hVma[Po/]'+}fFI{ZRsHlqDvvOH1 ݏg ؼDo~Pkoˣd\7U_eNA*m۶}g^@q:S \oA6냿>Xl{jXzXP>rm.4!cBFs`;[.=q {e/It{qƃzɚјEMvK~@uQpO@}zOWjh}g);֗F7k{$Y!?s«GLA?Ҹ(hK(q~4dv-߱k?Kt<]GbNHֿyqo/]uuO>y^Z4tcߝ= Sνv;u#O_=5a7^zU\1D;!v6y')ߴ=jf,]lF!ϗ,Ұ½U^QXN~=Jym˶L5doת%IOi)25k )ZE%W}Ff›_il|d%2d2 7ȴ%ɣ4yժ۱XOɲ`J2M{dR`uOnI}3 5r蘎IKϘ%i*IՒ7mMmT't l@ IDAT4ZZ:8 8,e)P`C U5[/!UWw1|>//$ֿ`]U+ f)P_@}k ?2jGMkv_ja j:a@bض+T NKnn\oVz7Gɛ>ל9(?c3 0 a XMzJ},ͺw<j2 r3qY' z t']/+GۇϓcHv5 s$a@ZWYܜ,y=e+ \9ٙ Mu`x x 3if݅m'@bd@x2-Kի5bp|# X{&2a Pxx 'Q@KMKW]u221r"iʲ,)*Vjj=G" 5r蘎IKϘ%i*IՒ7mMmT't4JtIIITmPy2`Kz}G  g̞z; HIIlLӔIBhz/A4>3&))b Qf*2DJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJDw VK/Ltt 3#GNttL3JDJDJDJDJDJDJDJDJDJDJDJDJDJDJDJYa~ =gd+uti-1JO9Ǐw#}wL[&_+DQFg=9 nf"uV Z{t~o}鸸4h:t^oa錥J9~Gf>vH @iYow:BgatphFd q;2M'[!i"fq\)e O nb9hLG4 kyn:7kq޶]a#gHt>m 3-]M еFbB)شgtD 0젯 $֩+XюʄqԦ")%55q 6S,sIM Mau_f;ed 2j 1ifBƯ&V\ \EB!FjhBߔG`Υ#5o^k6BlZGawHS"M1Y(8CsZg\s5@55-]r12JZZdAVt1L63:⚙KKdm IDATxw|[;d'dF(RRJK[:I(eM ;!ˉIx=$Ȗؖ~{+9^dFb$$""""r,2@_FJ0RF\b$B Hpp&G2/%>"""""CH$7C$~Ub#""""28MB [b3?u6iЈ_IGo KB3IAo;LDDDDDßaM`'}W+O"""""]_ɅD f"o1oILoM_ ?N&$fzEDDDD?F_K_L_ 6I[Ɵ8DDDDDuId=3۴1 GzmdFDDDD;_'JV|џXdodO+Lo{o6@ަ6m0*W"ӳX 9Mz{KDDDDDO"[22g]FC~&}xKZz6[JlDDDDD}L`zֳ<W VˌsXo KoZkzSIHmLP,tw{kמ-4x $3}%ZN%(/JlMj|'""""r,Uy1 KwBcx/&54ޒOG FLo-%޺yK`_IMoZDDDDXd;.n/l|;i֙@oJ^]@<v ֺ=/Gzy-""""rHˌ h*dͳ͑&3}Wgc"YzIv{DDDDDd8IGG;+~ǝ{f:bЙtlllP[g- og f.:[b:-[̚άz~Lu;{1^tb}%t#6l譇֐h2WKM_Yٰ.ȱ&y&<[Q~hKy$,ˤjs/fM|\5dy3k?䧷=-y'Y>3/.gRvtpK©|g2-Ԥ?sְuTp?--Yq.bMջ',\_yaߺͿ_|ŧ]w|ښ#z_xGsӑ2c2Aefٶs+Č͛g&q{g qML aP|IExl.,v m-bҾg7{] S3.Vik !:z,&ְıb iFw=kO#"#pojIJL8:55#`{CA;f{ns &K,穼>ϫWbctbvV6Z:+H=t3ĝ㳮]Mp;5Wk\.qn%*"2bCË8+<+,=,pq%F6,3vL燿 7k.+m^=I⹌Ne#c{D&4lN'D!0/Ot,X=M MJ!bz2%{=oф(hں9 BSIllvN`RIkK݅ XwE m榣yh:^뜿nFV /W\|L֨1>3G: 3'?5.?+@"Κ?.e7oƞťL#[r 1-Ŝ%3>m5!n9}2>ESi9PNEriV=u|2ލ[68{L `Byg {J y{$$FX&`i-VmK-nBbশ Mnf+zy??1 ';#.F$sG9,ݵﰤrmsIoŪ%,+w~/SĊW/q1Ίp`E߽d{|ƶ:[KKeӺ]%M|&uŘEw3 ƽ3fft7w.9_bq=ˮ>4p|UTTTR_[Imu׵ՕVaiI{7Ƴ ػJc0{׎"HPpnO<2e4~7NΕsu27qc@>QJCWi\p(^2Hsq|^8-dS"#"|4?}{Hۛ}IͲ?p2ipħ[.gMk!""K3{ȱxm#2t:V}q\e-&Ӣ}HF>gQϗq|ϙپËqx;gsf:3]䜙fvXDDDDDZ@ϙ93"""""(U.EDDDD$()nfd&""""" (Q73 Jm90 dfޢ9{ bf&"""""AIɌ%%3"""""̈HPR2#"""""AIɌ%%3"""""Fx2·?;N^{>c]}W? }t6ys[p~᭏̫Ö/ݰ.""""zL\p?O~cZ1yLHTp"""""AX8/s$"""""L-_ggy3-{xѿ2q~Y@[Nbq_?.Z{|Z@Ęy\osYnZDDDD7ϙvBKwimDŽfGx7=[n߿W"""""Gh){NNc%K~4ߛtfǼq"=~`W~e1Svc};g:W[^pKt:_]s.I LTDDDDdE2vϷ|1X }bcdw^㉉`㈍p qqŲkw!q1$&ijؘh/MLL4عhRّ(RٞH22ۑOT `L(n'""љlADx8r"#=ExFb(Vb]!]=g775>؟`6TQUEdJpt:UhR1W3pD>@U껆ˣ=٣t| ~2$: "JfR : Y-9aHQ2sr߬VkC d(UQYmɁADDDDT@o6n t""""Dͤꦎ_f!B3㩣}wFH(8s&0>l$f2pMՊߋ\*Gg]?v0,VBȞˮ8Z7_u;)%Ҧq]}k?bCe,NMvر2EDDF-3v[Æ4 1)uU4V kQv"nʶ|$~%rIUl_Skrqps%ٴ>O ?u~VпBIi=nAyi5{0|G׳IkNW;DDDFtq짠։5a"ht F}T>4 QǞTaqd8`nf^YrR?*8uzߖ2i6mտ:Do&U[Is9ml), Nxd*gMZ`dwY-P2'2%{)m K`Ln.Fƽ|m/>']Imdlٛl8+ODDdd]]װ>6^6J&##Ĭ&K%f 7gSQ#Lf8pVejW6$2G. Bټ=&Qd'oLqI=&k'19NYi>mUE-(|V+OZF*qV*neͮ^KëNZj4ʪaf=emHPdTXgADȑ?糵EDt$vWe9Èqh(cǦ]~oO ;I'ꦦ ߊG#"Yظm-5PT1̜6~6LCFY!$Ęuf?NB&3or26\ĻVr9% ㉋VΎ;۳/+mdoʪ&H[z*SC Gh>,IO"$leWS'3XkfRlE ̚|o*ON=4}~>pU54qDybJ uVU:.** ,3M#Q$D%+4OBդp-o%ttNlel$%6}n/=1B9nb"+^Ng,"""Q2sAxxNHʦ+"Y<ÿUln4qobqO%eekŸo?w4,LydoRi|w|q O73ƲrL'MM$1a!1|&-UE[Je]-N\ndd{DZNtfTUE=!db1Ȋ,"O>I#f0X-Ec3j1 :%#ÆQ92V">T9'0@5Kwc,4#""%3=62Q;x^kkh0boIĉX/ffaHŔ 9!<Wer֫i^aLL(i|Ҳ:&-ͪh`$;غ|Ž0}I!5%Z*[348+X㙲`!VVR\RE B2+' 7x"Pz`̤lVb=dڔ͈CL7W+uMCv>2lv<|XcRS_C-QCvo̚_4ym}wx/ 棎l*Ė.6֙ɳ< 9sA0t33i(-޴X9#sj?vK׳FԵEDDFt^v`9R?:Xj*k1"7xqxYQY1-#kS)Pd!M99cSrײgn ʛ1M7ø8L IDAT`[֒-||v{!HIY#Er|NJF$I af3e}\y̱D@Rò2B2{n4!$aJM]~ PkĐ9i:Ak={{Ŗ@”Ȉ]gxGǐ瞏Oy֓֟IYE5rΌU+15QM"""Gʲr4ǀ|hJ}װ:pyG1{n\-3G/vbȌ.ʪFRRU7W51%{-:d(5f1YYJY->n #"""2Qj0f6\fϘL3: 2s D`歁ADDDDi \.u)9 AiY9s'ͬ$""""S2s妽#Сt:YPHeUuC gνDE={I#6:={H%..] %!>Ɛ@FĎ]DGG̎DEŽ]DGFNގ|"dfdmG>5q8"dKdb˶턇1a\$'%zH10ѣX<գ{cHsM'ؼMILI$"""""ҋʲr4ǀ|hJ}װ:pyG1{n>[-3GK tC+[P:gFDDDDDRеT:*' }""""қKff_FPt""""G+:#nf"""""̈HPR2#"""""AIɌ%%3"""""̈HPR2#"""""AIɌ%%3"""""̈HPR2#"""""AIɌ%%3"""""̈HPR277{7qo@GrFDDDdd;v!cy̘K.+]Y?|ڟZt&Zh(4җWyspwmynDDDDL7Ks2GM>4"MzLpiHkG@o/֍)[6q\{4_o~+Oųndyq<u{~ GCa/7P\ RNˌ#z5e9烿\ɹ_>:>O`ٿfuGxr٧+k쬐wU߯Yz9c|__׼Ok,\vb^$`6loeywZ+ڍ)ޖ:|Ͼ@ߺ\N\~&""" ,DEGb5|p-2&pN:;?ɻo~hRV2&#y7>I&6rN/cX} tb{m cLG|]޺[]C]d 1"[wu%\}vk;eS;wo~NM,Np>}0eľIx>9nBb>Z.xV7p5sݥ3cL&i1&"""R7nvw^݅>Ҡ2,ʟ&CܔrogZx>Tg??N 7x6޷U+wZ4װ=̺nd#0K;>oG}N?>-Ӣ0?̺&b: ml_edۛ< 7Ĥ8뾵~21W'oeF绽,OӁE~|^~?wqsy0+q """ű̴g]/ Ko[i{o;sO`bŧ1do!E.z=J nh47ZbVPݝH`%17mKθ^]]I͍:RR2d[uYBho7i+*` m|ƇtgBоs]$=)}>볏g~|+ y|\8#"""r %3x&/MVD()8~,΍4ut`rޮac7ٰѹYۻOްò^Zgw23߫>MHXV;;G67tkg{;u13SVcsb j{$5tE N2c˅wK Cu9?ϛg2;¤nglc Ѱ`vՒs=}v]^'^{-W}`M6'RL8|ZWhRlip榦>Q$Zܔϛ/ϠOӅ˞/esɄ[8כ/T2#"""r %3}˗wE]l]ʐ |Df y'38}t_e!YdWx;x'ΚBDֶ}?=ܳ8xx۳z^Nig󊵴)Khq|RΚLSF8_4XӵZ2bB-onieRnΝa,W3In̲Oz|Bb/!?8'=Kjo_7e!{#eɈcoz yxv^Lz7`u-72e唻⢴>.D`uyo/9xwX_efLg֧d&fE{l3r9{} e""""Aߞ*FQػC{>nnj|?mZϬ3bNկi"@#4tau@+|.nb(}ʲZfDDDDD$()dFDDDDDf&Cbq9fY,V""#INM':6ꪩX;$k~AJDF=/9#`l5JfdЕKue9Y9DbaS}m ѱqGrP_ˁ}{hjl mճnkI"zl, Nk).KcC=F z&##hPMk,7NU}m5ՕL26h2,V+1q DFŰ}Qnq`gE6/w<)#D7XY&iٜy\4aux TsU)"FfXDdA^NRV69c2I jVS=2)Z@}7ع}?mCZ|?6jQܾotp oU.;S&DFUG{_̈ȱ%_3b7g'.\3rY퀖Q]r;J (cGu3?9h˦ίM.iƈAm^'u3/ǎe-Ce^&M%[6(Fǜ9Zg17)]_ Ǽԁ^Ċm:H0)ضPB8,q5oFUR&,:v+ɘ4*i2)nx::6 mc8҅duYOYYTE ]%SI߷[;n!y;p3f$l"Tn#*1)3& }|6y,<]4FL%"rRHgOe7;?@o r=8O+0H͎_N?)<~QzgaҬX9 WŰ$zdx 籶Mr×䪇Vk{ݼx5Gt!$[PK Py""L鎕|EVV<ҺHK[ <#ʡ5cV޹sU泽 m|ч;R}>RD%H5ElVh?ڦX{Id\amALqJ̘E|̶R K\D%bGbDd3kR"6_ǦfLuF fQNJ7QsO[*m.#^?v UD;+*^v\v~.V KxG_gc9JKsmdn󃕒ΈoC_kw)%ږc/P;5z~T_y] Qwtqdk߭Gy9wy c̵˯%ڟDML5lj5ðtn`~e8Y`pќxyD[g"jXZJi5*xI]iM&%4BxF&Gtv+ɓ&lm`n+!"ɣ#6ef&ɜN:K5'(GǸFX6O9%Ӱ &k2cb,@2mraɌ͢;=sF2VZFF7 qf0aR[X@&}u:zΝƌOb^v8f~jMlL9.^sB&Ǭ!<7 g~<Ͽן9YrߏyR~c`1 s. _1u=cEGAv] _ۿtⷙ Mk{fMG+G롃f~~ . &^m!\~bۗ.Lkɾ1Nk`jAG׀ [X!y;_϶2ol׾h9M [a67el޾zq`DbtT֔R>j0f&swDem,۝Ƕ] H>{aju8҉8Fu4!`Vl]?EGj3 ;ãF L%6)ɇvΆzMWG<[1aV9=$aZ rfXmجV6鹜~LN;θ}t0{,wSIԏXXWn{3!D>O~{M~S]+~GGg"M¨2jk#ŁVϱL ; FZ/9U ~77gϜEq3'Zv¦>߶q%j*2LXn7M8șIVUA jDƥH 2H0)۟GQ#bQ{8& eea4QՓ*7z_c~pFVr, [YUN= ,a8XnZ0)}% ~˭k:ֲ" orx0)߻rÂ-$ NeB.֔,2l%.cSFmcKG=F$YYl OgtnS,DA#I' ?ggi%D%p& f\֭f57`&hWsO䈍l),%s)P1).Lp9ƆFELIor{ _t>ڑkгl6ǁFh(\"?uu[od3'{&8yvy_9vɉ OqRz3O=14@Xkcld47bԬ%}:&.'^ΈaW0կqHv Ox3B*H$Hُ $μbB=tr{Ȓ΂Kd\|dz1%?lirs},W5ȚMu 2wcO(NBm,S&:82 7{g _{@s4 5+ !,?sG,T31:P[牰ǰX~s+/Z9XI!? ?}}1@t9#y7WvVU®!B]].=>0 7I[{i$Q# }?*4W8lo__g,c͂v 9+ʹ\@*rۙI\fr`_3?m\ /]9"&Zg'0w~6O'3wqO?Ik2N>9i;e:|t ;JrĖAnA"rmX9oǵo| IDATy27&6 /!??S/g0uu䎉F,\Ȼ e~ui>Ƈ؅sne~y>񷣑gxGǐ瞏Oy3kL"lO1wa_tY}wwή!:6nHe ߵ?!gq~o nmh-P[WiÂb´X1[;P~ؽc[{#vٻ*㯹f @QPP6EE*]q_VUk{ֽ]֥VȮ;dケ3#B$!7~G9g>s2g̙ c<#ͤ5qrcj_N[ˮ9~X; .7.'QS9vN7`7<8pݸ|M):\f!*}ʁ v*fɪ3l fQ2)"ruƴ^}{y|cEDd?}XtߵM?>塡cvce$T̈ȑu )S%Ĕ̈*ym9Jm&"RCɌq{FEڷ#)7^{hcJfDȢ""c3#"""""aIwf$N'ip:_X9N,pu˲%"mFS:FɌU'b::iJ6\trb40'twxq:S:[N$"G˥?a1-'#]-rF9DYE\,9y['&jy42E>ʁMsxSͻUR:M:J(ilv\Du kY9 u>vEpƸd޸3Wב?A NWFUH~Q csD/pIBjXه-c\C=P2#""mb#X8bW5- O Ӧ|=;>,ѻ{NFvtúU"Ne8ٔ px\t4)7]ʯ&"zQHR2#""mֆ%,/;1'Ē*-h%y&/+<Gur`X5Y#6R|8"W\8.,1Xz-跨:D•iJ/o/_ "16|ȏ ̑ <81 S鬽F#{p=Sżú9"pF󻳢:j? 0pXl*_H8Sn.];r,/Dz4L$&6N]4RfdoY_ʃ%w)ΈkI]Y+ߗR9N= Wy(2'HDDpՄD)Ɵv*\N1`oࢣdkE|wmB[p13)',(۞]wI|DEJ*X,Ӥm[6QQ^F̐!UVŔ89׼4t3%Xneᙱjf|.f"ׁ+)/ȫ#, w"~MU3]CE\J3uA )qhTJKݺR22{:6O{Uiq!q8u@ r8$$u 6.+#9f /aDsV oI٩PUg!o7%pI;*yJ]$NƞӁ;xr6毶1n^He//e# )-.w TC@}ZO~Y&|ݡi6%v%[O%2j.zkG#]Y͏I>̝u{H3ņ,d1`ZX}fgr" qO\xaKy9edlP;huCu2Йau ov%3UeE9 Cڹ$l\0̘[;~\1B-czu1g1fRQ#Kl. :hV`6Q*S;dF2M=##tbzT/w*4HXI[:̴0 ̈ȑp1fh욶4Ҙ֤m gFDDьMfzS""̈/'5Х -%3""""rhH%ݙ ?w:lȻo@^"%'}*寢r㉪]7Ld5HPw =oo#L]Oc}ADڰ7b|k*cϙ포R@!Snjy{Y1ZiJfB,cޞs \.a۟ь$~M|?i +fSQQk3dJp}d&2W_#~|DDe;㼙ۏ uc%8"qaDg!edݿ.ks[kӧkЅ'A`QY^ qIx};K.Cj?d޻8rF~}v0%/r~)\nQ5]n=kFŜ5 ֗:w7ϖo77珌I ]iMSOu;k;3nO~DDDU`=ӧoeХw7"@wIA^,a{颵쨎װsSm?Y?# 9nIO+;^DO;AҖ\#n\NUK˕bGiX?#W=>Ozg2'L}{^d~̉/3庞Č{ODٹN}2%+ ʧJN)tԛcHdcua7>زucXW<۟|>)˨޿p߄4VOy: oߟE)7siaf(4.^&3Ȯ1.):Ke?4 D߲_3qUse0-m691 ՜yTCe@E'3d$;)ٴO˽\=n:.xM{ZeuՏŶkW_aEDD>LgfyevQn Ff366vBZԁ91&9d3ؕʐ:eaOoMXq؀'b[6}XJLH:k&wW?/oMO׎&Xr5d}8oĞό=^ޘE~uщ$E-#-cg(ɵKt&wցg1?kht0NNfR""ҶDE۴fv6a*JSƦ 9lvKٙceXLK](%3mB.WMk}M P@PKwPF@w|,Z'ywVԏehfoF3&qtgX< 3ҚXn7nW/.|aM[0,^?fbyd Oȕ'w~ izfpt}ӛ~RliHVb-t*b?&ueƮ.W7*Gtod\|Uxk*Xl'Ճ˰ܱiP)i3"r#\ڽ|*jSO25kŅOy.݄u8H锂f ~6s5#|5[wz&Tv~EDDI_ƥWO1eF J()ɦyoN,Í;JJJ0m"s>xkY ֳbc 6`$\oPZ^_FHmQ6HŰc ws<H3xk9 4grzi8 YQtN-G 'tcx9?UoED$هM3L.~/#~,njcF_͠Ty"_~W__KKo1?qAtr:ǜ{v6]7tt C'vv{iٔQ3گ~ZYQls]|1CFnN9̖.ñN uJiqIh[h_kg)"u(lj гQс8]8Nl۶TӍ;…a8\n"\N -̀uac[L\8,/@Ih*fh k~nuf!*}ʁ v*fɪ3hf7̈H1~~|孀_74z^)CWbzXDDDDD’̈!} 5%3""""rhH%ݙr8XéwK1IJ, ˲ HPxb)+-&!CCvOl9Ex,'P%oe91P)Jԅܭ1^@9IPDDh)aYVCiw,ˢ(?䔴P)OL&1W.04CiR\X@ILN!>1)!:,JK7,Ӥ kV@BRrCjLsF&8veu:IP8Nb1D]Mi"##IF|BeaU?3 ÁV"Dj%9d.K'2zfFDDDDD’ KJfDDDDD$,)dFDDDDD’,MV#7ۤ2Quɠ{8ʯEDDDiHPmZ2MdTtUZƦukw@+G("""".KP͡QDFEo`vnmDDDDQ2z3l? #o|c;N76yDDDDD@Ɍ)%3"""""̄Tٯr׵8ьwW>v |\r8Fq17<>5vU7~egԸ_rbm˿Uèc{-<85Jʙ~}t.{;yYlr=XDDDDD%3!dGgL{!~}V .f兼yiLGN};G~5U2iq:=Ӧ<رq7qי6mؙ%czs&xy ygw ԫڲva,,ϧmIfZ09sp?aݠ2""""҆)in.UE;(p|͌qw3_92ȈL|.O; 4۴0s`YsmW;˧w\=Kx1n^ƛ;f9u16MZ3~=,]!Zv1H}Iܝ(85n9:RLez=/ȤE+ȚlpM963Hz7 (ƍR3i۔̴G g\u6w|ʭyښ7/ϳ+Ƌ˅+ڬb熭SH73+&K۩,vf`U~ɍ| <9gO>+wR\S>ei`w8-[()E7zq<wv?1Q3iͬUčWҁ^ od }N8{^krH<6vU8H< -g$@/@dT)i]u#amnG܂e՗.z`MK """""""brG1sJLDDDD)=ݙׄ: &"""""̈HXR2#"""""aIɌ%%3"""""4vȥ2ChN]HHpDDD P2#Au#ytNFl^8PJKOu@hcLRmDEy)]I"""v(*)*0?tiq8%$cݚ,aH;K"aH)LSHs:X9)dFDDDDD’ KJfDDDDD$,)5?w: 0.Rq(~qյ\2~ʢrZleWQ)UD߱;w=K73#!gF?_""""4: {.z\ҝX^:"OU?A{è!vjb̏S{;O1&sRw"6pD&wvlۦKƑ""":m1b18og|\Q [ Ǐž O\v{3&@D.~DDDDHgR/3c~Yؾ |{s5z c/fS @9;Ż)s]_QljC |8\х*(`͘ieΧ$3>@Μxੇ

VaM$vXFg֪ 2k` QǪ5$J➆skg%m(g,U=ĶN nޤt*믫~,]so=i_̴[ՔI螈0 ,y3ld_+vUu9nxNmf|#3g>I`d\=0`xoc2zoѦ7wf5sbd&%k '''ќ$l w ͬF3R-ȳxD4f 74c3Stw94FcvBf:qŬil*.bjzFϦ7, 0| <|L}:YXh%6%s` Gc0l'~֬r/V z]5H( knNŸ؉壉u?yŢ3[Qc4N8N82 F+OHԲa6[>u[FDDDD€amnSG\FDDDD€=؟1'&=3#8z\û3 u"""""M;3"""""̈HXR2#Ap:LEZ4MNgS2#A㡢4aH;WQVJt'aH)Jԅ0P"s6R;: 1%3T IHLNfݚ,J 1L4MJذv5HHJuH"""bYKxbٵ#m[7 Itn=ȈdFZIBR:: iLDDDDD’ KJfDDDDD$,)dFDDDDD’F3VQTOTUT`YYZp13)GDDD%3t97PZ\HnJn&-gu3edd uH"""b:˔**ȧ6:P P%'6^~MqC#""rS2#Ak;i]bZm:igL0 Һds# :ڣDFZmDE{u("""b3#Ae&JfQMɌi}DDDDDDDDD$LΌ]5֧dFOf&"""""aIwf[3Vkg}odՖ* I28f%\z/?ˊq8آk=L5 92) \&?Λp񯹺_'']I( ˲; ӲFbuUJfD g nF^Fۮ?Y?# 9nIԁ0wtZvTkع\6'=ðar":9\jslrz J܄~M'c/"rΧZcOr w뵣a|vNv:Vvc`H-tu47^})/2uﭒ[e,|I+OOyeTڀm`XXIu'gx ɳa8y~.y[x# :;eQD/Hei)OL"OnXݥ궄UukNG 8zs%q-]Lv`Nz|#Ց1 `Ws\qIԉ1(款ix\}ruJ!!"-""""f&RM]DA ̦ 9lvKٙc\v&޿7LUEIx)a0-[3xIvne+=U:ߚ˰V댮&"""JfDptgX< 3<'SxD8~{NŅ=̹){k4 ׏PTƃm٘V 67B$BE"3~L*립ˌ] .\~pzpV]jwtIOF,ʥWv0X~NT6.t׳r͍Q2#'yv^?ŔYl.(p'e;RH.Y· r(-/`/~c+w$`6D)d} Yײgƒ&C9cX )+i߱*P;xDDDD)u3B/>b/1r8:fe gse[x?qOA0dp"kv~L!n^})k,}.?FŔǥsu {dOj{~L{r2蔑y16nP""""@S6}_wrԙu&Q]}ݯC++ʟmN/fȈ)"҅sPNWNƶ-@5զ&ƶpX^dpqG0,?>co-̀"q𛻓 'QnWQmWÁe'K6߆5?sCFXX<"rP:Nϟ̀ACU&: @YTZY :Ug: };3" 1~@s>-m}ۿy_eLUu[|:n< /"""H+@DDDDD’H龌Jf$͈anf"""""tgFtbYCy˲p8CDDDBLɌUtrbŅw4ՁjT:,i'<7k(op?["""핒 ]IeiAZ vnoI}-nJHPUUV E /meylvW3#Ae&w(0}}<iHЅiC{ EDDMDDDDD$,Ό]=LH{dFOҖii7LDDDDD’&%|WemeurۧMlhHv@r#kWw XYf5^?^#ߕb7s Mv*_J-Zwۡj6]}fN͞աϷ5n *[V-jKM̚ӹ޲-{OGG0!/4~zOVӜ-*L^ůn U[Yhla`MXQ&?~v\ĔO 5;pu80 Gp>>d[Jܠb+1"`hK[& W$! jιY`fϯo@ v;̚i4.qu7Vw vhd=|}H{WÒXl Vz~BTu{[`o\A/NA?Q%߳jXsa"\#w73xs\V.nk|ǜw㊁qG6K/̕lȫ$:/'];З,6} W?dķN:Nx9}؁BvTcueΗEkQOar#5UO9?Mzߡwe(h+<$X$@OYZϝ@pC3^in8>>'^)Mvf!*R3kq\&{Nwda6^=SnBfl^xe-Y#Oٶ'[nlf͇Oʅ,:z hf=ah*Hm)""" Q.f兼yiLGN};Ge\~\{_Ⓩ_mC{m<*v1s/pMxC|gt"eΧ^gԷyzbg<0MAėr]Ob=?{' qz[4}r?L~q^j1.c'yx? o?}}SQYvxnQgW^y3N'L鋻}?]0cWkS{Gcu4RX'.i^yvN^̋ G)N7q]Gs՗ i"S7X3,>u'gx kcL_^8>:-[r|Du ׆dټD7ُX[-uGDDd_JfΟ3R!Oq\}be;NFRJκqGGfreg0(=̓)_M2/ұ~7$ȴv_:`ڳ))k6V`qr[4矻/1~=:v4ז`bc-E8ޜwh\KZ]޻紛&rrf,19jt+ov _OfqtG$ܶAlZ/ߤ6VwC|>dDz >9)0+>XYG*CNFNqxb}wM5Z?g|2DÏϷȄ~mؿћcFmGA_>?o&mL2`qfd:\u7]Uɶ?ƣȿQ.ݷ S$p`|y3w=3U{2ݜ9 ^.'q b{H-}ncZ1 ߞg Z̙5e붓_Z@Mέlc괓y`l&-#~{!8èMd$KglT,Rc f݇cVՏ f[ȾId&5pë3h9Á+µߒvl vu;vS|zUnI܇maV1 u8n8{ 6pщnܮ^\Üw ckW}>گ\89s̞;_I=F{(-Ӫ`ombp(iZYl1/?“'r dvݤ߳po۶9}!, DY<}YF*m)"""{Y8 ;J޽K-dgn]dd6cBl GCJk3{:`YTz""pvIOF,ʥWvQZ,Бf7܅DzU$ S$eŷi6# ] d]ʿ5##GݏV\~pzpVozV-Ÿe[0t >Pk4pVRdEqƃ'>-_5F*m)"""{) HƏ/lҲڙłUE-LY_y}Zv0ͧyt,H(.,"`8RRI)Z3PRo峵u8H锂f ~}8T|ٲY+|+cN9sƧ+gE^WKjN 7H())mhdyP ,۷͂mYd[lARJ, Wshe3{ 6>҈d:O 5ɓߺBJ2)̌:s{Mv0)k$\oPZ^_ƽ{?318;Vdv34]:;2, +f8'1z+L!سeSH[V[r_QMzS 6v:gd6H+)Y6sb.: 9%|yьUu˜:KY:m*_9jz_E s\bMEVl5QiJyM,XnyNF rxyqg\~C{22S.yq΀ bu'z< ,L =n۶ԡc+)ظ/}:g/gKv+wwa)Go*]~ Y8G<H2`U FAאpfˊ6cэص_jOY32`o`SyïጮQA?8:X]ήđo.dkۡ};pY#x2$m'2G$n7G统~LMKΡg^prp88 l61 XuMˉaPMOuӍ;…a؍,سߏi8p5,?>_`o$""QSe MupgD. j0;lX&.rÁ+yÉh7U6cج2?1,/("]D5VAlCgYNi6'\f!*}ʁ v*fɪ3(iGвMfMN>|c~|cF ϳMη0}mom(z ӄ@WɁ~vww4VjKVdF/ #OvCHXҝѕkkCG3麷e?EDD%3|:[LHnf"""""tgFtbYCy˲p8}<iHPEx,'PVivp?uEDDګ<)mVrJ*EyX/ ˲(#9%eylvWJf$:,JK̃dR,Ӥ kV@BRr3-""^"-=wݺ3 Ns:xڳ/)\?|X<v# =%3ttL#>! ˲qݩ 'ap8p݇|Bml2bt0BisHp\-:iM?EDD=3#"""""aIɌ%%3"""""̈HXR2#"""""aIHPYŦuّmR(Һdнw""""4Jf$6[MEyCG&2*Ie|*d-cӺ5;#B%vAMNd"7p0;sbd""""( %Ϟ/f'3l9;v0 8.~) MUTx}>YnQ-MDDDD,t9|v<O:0Xg+h1' FkXo&o[oIcpzEDDDD@LHXlpO;nGwyx;c;q I#=eB~^ IDATw,}]aQ;h~ffϞ7E 33򵬮bѤ !yoݘDBzcßO~85mmq} ?tUf&""""AAjÉkb굷s;GӼgonܶcQmUbGN]MEeYM&V? - f#},"wtY Qe{HDDDD$)i,>'-X0Gr)Vj[# ~+/bk^j*P-^X=6;jTƆ+ds$S'oO *8HHI.XʚV>o ><{e=fX,8o%Ha곩sF3Ψ(|vn$rCA¢۟.^cx/1!oHH(BBz/ڧeDDDDdh㴌.89:L piwǿ575>ؗnZ|m@sSc&:Pa QwK(""""/_B}Z&<"q` 4 S}gu@+`veڧσ3#jvn#^-JBr3sqDDDDx`FUhh(9cHm.6 ۍǣKH)~x1HPR0#"""""AI%3"""""̈HPR0#"""""AIfcno5e%45aY@GR҈vTyPQVBsc?'ᑑ$Dy/_ϥh`jSh3JvRSUIj"Gp:HA蘁.0eLzw#ʧ=}{ONb{I Gz#DTU2jlNv/?8#V>{GFj ئvjNH(+!5}59f.Ty`?{ ܦvj{O&"r575CsS@CD6uS; f_Yr9N,7y[DX6uS; fDDDDD$(iPfױ:xs M u6CȾ;Nn?UKooy\r{bfh0)ED fDDRxTp$>`\ ,XKTl{} ۙ6Nq]{߃p/uUMLB9``FDDfyz d?%[SG,'dҵ̪l,T& jF(Ʀm`鞭6` a fDDЬ>yg17h Eyٲz [JkhJia{+`fGŹc1Z+)6 NGaQ+KւK7ìlӘ.fSQMv)1{B a֯f2j[,LBȺɯ c,V[a̩3+OKIi+D$%khfLHC؍lXH'@+ݦy˻<ᐃa 1 {O ;3.KDdP0s޲ղ>!%FȀKRs=/!f9H> a �2wX4oeCA{i!đL2԰ >j!`{[!,~$M$Xޤ,W>܁1d9\b!OR48m\'">Hؼ=VUHC6GgM!Ȗ? ,@H\i^* 6dL=v|Ƨ $aWP<27x)Z.hL7u8 `;qI,n\Nd :&-Xz#p~%F-H;\@֖5Fj`S~>KpɣhaӴcn0j)̉S~%+> ^44Oo -%ضMZj*,K IL[QL?٣ÉAl x&z*SvZ*M~BFᔙqcdĻPT{ l)cMdw4o}VHVî#=*2By{Z$1vT;4vHk)+ib6BXNIsx[h \!!4$K]a>7"/)ibVf8k6v_{Kͬ}$fj"@o23m;M h!.X~J"}b>$Μ4 òRkk?|0/;<צv;8s=oNdd*hQPN`Q;agl è+駧U,-7`cbbZ-gLٸk5+m>١:Uē 'x}7ԇ#w;ps70O-.8kߟvjVȭN pэ;X[E<`iux2fq5SoX*Youo(Ys%zzbSq, /wpđ7[Mj7nӭ!L<9=3|n 'cRJ}M,!W#<,7&O/Ҩo̕¼a$|@zl`lSMcM\r46$v~r:];}:gLMp0qnl 6,З>MO^_eZ؀mws3EFF#);5Ci.ooYd6jMMuFo8+॥ſXh_}ݟC~#'q/732hb?tճԝ\Z=|Mf +-NyǸi|ۣ,o?gҳgO'3.9$r)k}39/GImnœ7#|ikUwqljIDbNcfwidQ^T#%x{(Wie$9!a4?89@uhM8Ma\2Á7lL:zIaRZLAwDe`|&*MBG%$VcnF(򆇀 ѣr8&UWqEԨLI2&ѮK$8I3kGqֶ3s` RR|.|QN'/ &:䋤nٔ;gI\ 4ko&"fWO]@00^oղdC1 }+Qp2KYs2XUh2's>99ma Ge>4xG̜ªvM91?mxsZF(gdSA c ͉$`.ͱ^KKMwѵ,vҲ/,GWNa862@z l IsadMGѮm4?HY,JTMy`8O!bX9|^߬'=֢ c&W7[Hkvыr:0:~WMdk z&%:0"3"~5FJvFF0bUQ탘nP2;OdҰ uf74‰5rĎdXhWLlDn2-{{F6B q3پ+wwH/n]'^+yYݭ[xxvMTO"[Z@=%.4ocn`739}f[OKlt:snq;nu1̶G GU iّ7@ࠀ+ѻ4ǂ}TQPeLe<oYe$1#&;THMXGdvJX;ز gH1&^"LXkl+J 3=]e0n Wew] t&MKޭ7l/kZRmN¢6@UUaid&usX4矗SX%;nGx-6ު jMfJnd%x&[YA$1qnP!pGyhԲ(?;@Fwc_>?e䋣`!!sϏpY7X `vp?ӯziu3F*K xm3ҍ(kS?YcۆOsx&q;u[bO4S#C;# QCl1"0zXHO=ھP]˲if)43y,}ef*ɖm߿ Έa♗1Pix82ĩ,|,1npW%;]:gܩ'3&_C)}7d('%*ʅ݌=Voጙajݼ1{HN#u>ΜrpLČS}3,2MƳetf65?{flVz?9%p%frFPX5)ieD܀ы42yK(p|fh.ͼTDeQ^`D7gŽϗ/FO:A1,i ip_4tl6"j82;,vn5y. +X6JK[spoD2}z_"pd>XUC9u;.뗱~),g7vI#VKn*L|kDxOfh:9i?c{u3^o=%S|Xrviv%| NܓrICⳙ;RtAD{e>Zصc_`<;Ya_Ɇ&Mo{ZmK=7 [N XF.P&<u9Ld?eZn#?_??_;Ә~(7X۹b$c i]=ϑ;~IqgS&5g71Qάf| |p?O^>'׈\^Zh 5vVWoSkxŅA9kbc1ggRwŬ&p7id*."$ّIXmC dLGkؼ V;"I9} a $Y!^Wz:]6X! -mmE|j&"=r)'1ϵu+dE$Ň`a I,?遰̉L*[W_6 F ֿ'Gar6^E[ӚKa7g}Ydpk7&?8׎N2k\y:.ׯ8_'zRN%눊b,V 3ia<|vH;vxhS#i*r'M9a[F hh?Zdu.>}3h$,|Nfntˈ`FXE.&"}2 tlDd 6uSw f䘈FLܰ.Hc㉎=HDDP*IDDDDD$()`FDDDDD J fDDDDD$(if""""rkk(+ң$<24=!̈))IMU%#tte45ֳp' ued t=3""""g5TU2jlNN)$*&(l 2*F=4==3""""ge%P s 8].R3(+ z fDDDDϚb"bhnjb z fDDDD,=2ǐ2@(`FDDDDD J fDDDDD$()Hp}TĦT6MXd,IaۻoQ} =]R(jdYݐ34,G'C r6 Vyp:$!nɀQ0#""""Umu$M!@֮asq5fLE0(\*[M\a1ʴdM}Dc\7$cYLOыB3""""2-UTDЗHGqr{ZVr֌T<' N7,|%11h_q3;dܤ,8!2f&""""K+nN˴eOc'g3,ԍ;,Ҳc`gR$EēZͺog"ytCpčaz^~/BLHRB)}`FDDDD+ܙv?;s8X98nb z fDDDD#"ijb b z fDDDDϒR(+) (3.ʠ`FDDDD,:6xlSCΎie#:6n4""""2BCsN' V K fDDDDE?Ő!JDDDDD$()`FDDDDD J fDDDDD$()`FDDDDD J fDDDDD$()`FDDDDD J fDDDDD$()`FDDDDD J.{WtDDD"""DŽHPR0#"""""AI%3"""""̈HPDDUTUԄe]@SO8Զ.C!`OkkHIAtN, ƆzgfQ>j[WmD{qnou5;@KDXDd49c^ڨ>m96v 5 fDDsU$e`ZmtqDd0M0HNNeyiOնG]=@D8DXXN6D mAKsSUrvj3#"rL p hk'Hm˱ueQ0#"2TCD[-ǒj74LDDDDDzfDD]cAm ,3""C7DX觶OV|N^h6lʉ?qM Jv*cl&5%iK'B|{"~Rx}q¿Qי 4wMkڞUē_#Ķ=h5zkG펽|j7fɫ^6 j&2j\u٩ml6ϼŪݍqe_+zu` T㥿{wPbHy|2!_jlVEXȾX {>̭Fvlcq'w܎~?tOGۥ,rưL_UN$cbw}7uz>Uy1O`KȻ7ܐwnm$}t]3VpƎblQHYy%]pz &\˟n]H!P0#"CN`e闹.'?v%vnf:7-u-9O|† ]qјyǹ돡<*_GOo~}\9Zh<Ě1W򭻾ψ" 67f А8-ewg aclh{N< AYUcpzkٙ_sW-whB%`.IѲ'{^ۡwy9L3=六Ofq::81F7P&c'1vT0|ɓu;9v:u8?`A7m|!43b L{5XX^Pdab؉| ;.:k>}uf^GRL..7L?>||T7qy)QDE8b<'1ξ?'8^ϑsp9"~rh}i7S`eg7 "c-Ve]Y>/o'%묯6ӑu]M[f#7m`ݗ}uv cm@lD=3"28H^FOB~:-fE_ƜןH^oyuƑ{U16¦/7'vff$qoxGɀMէOsKl{Y\s͔ag2>za{s>aW^_!oaxo-7;&L"6 ;ҊMx}Yf$W]ʂ(yN~"_yiVFd^G&?gy'ۇX‚=/7Mßo{-|DӼ\ Kmsͯ ʺ$\ަ^:q8'ueēбƝA:Pb #16p5n%m;~cgޮ]].N{~u9y:L~[C ^6=w]E?5wYϣ>M~|/e6xoLemJ?w^?XX |~V;'o254ۀڿ7rM_}3"j]<u%ua$[(\DЛzm]҇MfH 5ŮXk]wOۥ:걎|ca=?߳ ET/L~^|Vo|uJdD8'ΚJdD8Y$%w[N;q7M΅s&f ea别橉=O>WfUgKS&may6vt߆f=VeQ0#"CW0csXRq,Үz7^@ްp"#|:*gO!.>SYUhb7|̳/[,oht" çr-?`mq#V{}3$߾G1]/W\-nϙJNdh|qvdms 횷g Ws=?/<Muϓs_^8ɞ632" Oe%3ƓsBX$r$Ǵy}E_p"Fsַe^`o7a4?Њ-xr:B掌&44i_>MPڻWJV88FqZϖYo\Ή#gvnKugRc$yy;ظ=c{Aԅ3iˏoEsijKv顎zxĽw݉pp]wkns=?Dz-6RѶm|$'fLt$'cYf7崩|\y5\bcc9Gru'3e_׮Ke?w|zUIxd*g8PKכMқXmDDdHrĝ{+So'qc1VwJgbw"aa}FX,q~-hs :13qg [n1nG$8Ⱥ^<@}V4.G,xJT0f; Ig?+)^1= N6w:!!sϏpYrtfۦi\Nl4yo?^Z,N;m//HrS*M!%ma}I[uyDYv@7u, pf:֡ǃǕE?&(aXZ}, #fx֭2(x7#ϼM(KUk NaD2{"WS\SI;xλ P/c3]C27ӯdvvW쥺l;+ږ)2938kO>;jh+⓿>͇8g .!{:=FL?uZY 8cf|}%|{l:v|444[/aNnٴ-ܱv0s㬔yPG=1OacɶIKM=29]{x%*@XX(Y#3Գ ;v|żX|/%_^SϭѦiyMZ:vL'ol_5M4VocktۆJ03ҌfN9\P&<u9Ld?eZn 7.wBSJ9~˳?vxkLıSykW:3>?>/ڗa#i+FqU2rrϾɉ6mʾh<ʏJD8l0["mygVd*Ƈ۔T %5sw8{8pud]l0_w3SOy2Ky qXX=·ع57ހ1+Iݔ߶_Oozt&{ #qʵO˵ۃ2Ml{:ꖲbq٭x vAnt6鱞y|Zka::|N t( 3i#i[ v,b|N5쌶xww;7W(!N..L{<.ѾmHHK_/_B}Z&<"q` 4 S}gu@+`vӡB矰B6 8d~|Y[כ;$ l_KYN?!ԋ_kg@\kǁs6VPC<7}ݾWr빇uQ={ut:M^wR a6dg0vLv>`=VZ;+v_z͚|fOM:}QS0#"2 P9 y; 0:`FDD$٦O=9^(t^D-2̈ :cAm 0gFDDDDDzfDDs˲0~%", ﯫUrlvj̈#hin$<"j""Pks#a}^Nm˱ueQ(-"rOHboU%ջaY{*OHj[.C\L0bbرeu{:9XI}^v'*&>硶vj4LD8rHNAeY1%E;m98N"bCl|.WO ն.CjHDd !!18,nn29u 2 pxYm9Ve(Q- .KGwj[d  J fDDDDD$()`FDDDDD J fDDDDD$()`FDDDDD J fDDDDD$(}|@ADDDDD fr'M" af"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈HPR0#"""""AI%3"""""̈{w @6vl7 I/@P$#cę88\# 6I6I6^aq ITBS4cL?&v퇎GTf= _qZaAUg%f0S{`5kU9ͬm ׿VY=f~k4`>|?b7ܔ策ϭ6ͬ[y<ĭaڃ!Fu"s-+VfzUf`{jff5fRG ؖ|lx`ΈߙiUhjؖ8jco4IDATn 3>=-C>*1ilZe.~g`v8yVWoU&Ïڟǩ=wY)f{9uNuwkI)jW/.Af1q 3)|syΕ`4r~:/%#)\̬EZZՙ,YrE<1?q'Q5e){c/Az\jUIj!OQIENDB`pythonprop-0.30.1/docs/user/help/C/figures/area_tab.png0000664000175000017500000013436413736105351017707 00000000000000PNG  IHDR3T$BsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxj{/$wW\1CJH$!BBIy I$$^e[Vzzݝd䕴eKk?u͵ݙ3gF93""""""""""""""""""""""""""""""""""""""""""""""""""""""""" x0$""""r6=*aCDDDDD<rf0Cotȩu2ePͩ })qlDDDDD!/aS )qzVFDDDD:{ߛrZͩ} "59y‡77 =S-\p[P|/<)2)tlz <[DDDDDx8z{ޟPsJ@oLOǞ{3iM)fz 8oz ݅Oƛzd<=ziGl6t\zӴWaFDDDDijN-wOԥ_F޴twӴCDDDDDӟui=ͯo uyx4]:/7A0czǽ,S~Zez "BK<)yHg]bu-=իeSpco5]#""""3o[eIqߴ{ n xKMLOSˉb`m~"""""gZez;/=t#j[i<w'peO<OCoz[DDDDl0czx0顼2uo tw>Lo D@@Zw:H72-8]];Tsa{jq0v /~~W\ym\||a(NeBYiiÿλ?_@1V hL_Bw ޶ȸƍ~POsS.:Ws7a`HPpe%~GU@+ma4CwW>[^דӹ+]ub:cl,ekBȩas}$;;{PK[int5]K7?v}'fzj.㳳#0? """""P@@ ͍#GȤ-ȴMnϻo[gf}0Mk~=cM b.PGDX+3i .[`:82ݍ1{;SFٽ󭐠ГY9='M0pVFyjЯ߫urА(J‚( 1.W8Tfy.fv 2N] $[q}0H\ĴҖ-/aoaL_/li*ˈiB[ xKL h5[fNIĴ߽u76GFDDDDwfڙOsӼ*>}^) j9y |m.[<~- O K3T\FDG~׹jp͕,22WN؎c|;{vS`&"2Yعs|63 |kbo5G >kطc<Kz؏r`{!V8捷So+;?xxֱ86 Ϯ>J`BH5`^0~w}d&O%k{&9~c "1R>xԩ̈aQj0ھ:;.w}""gΝϟ'Nð.>}c׆zhr 3=N‰mg7{/ק_%x6Guï{?/Xfnv>Q!sx9ʳV(42t oV ɗ\.8G`=/"OpȊK71ƫ,.4. ]s wHh""L*ni gDz9`p%"">oo,xWLN>H+Ytr:/쁾DDcw8[>&,nZp3DD|imDsfnC2~?_93w2:csfji;g93)9gtw3OsuΌ 3J3"""""Oʥ$ILDDDDD3"""""?f&""""">iP[f s"""""5Yx`^DDDDD|OR0#""""">IaFDDDDD|Œ$I 3"""""Ⓠxia/ge8ܺo^߇ ,^C:8OxkO^z/>N{EDDDD|۠4[ <:seK8\` VDDDDDdPD9 Pd.1.:0-?6_W^EK^q7IaFDDDDD|Œ$I 3"""""}oe]~04U9# vNOR0#""""">IaFDDDDD|Œ$I 3"""""fDDDDD')̈OR05**[*"""""`W`Hi%ar+itaEȱ +eڽEIĴ lv;6c+OV=}ƾf9Iftlଧ(7*0D #cp^1)FN#ŏg vNX)m=~L+}ƾjL?^0y?e[y$SdDٰ2EDDg(eC[6p)CT-[v {0aA!LJv?^ρ3'">(&*a~JZ-v@G"qQ;hySƠ-Um@U h:m. .RL;c2T;6,&v0& j-O!#ISIZ+ٽ~ YuEdfN(1,6`n~ˋ)nNaD@e$ ~ރ,g_Aƺر=-Ә19z+G׳a`@M~^vfS3X ǎ7 {[Uζȷ cq\BPOgiOdESH"V?B"3~4)!>r"-%Ù5444a #5۶bC k\8Y]0B̀&6q؊93VVfLvKw 3 [{(gxY|58f67~F&cUg߷Ê)Wr I ܥ^seoM#g/drXTY|H?g#ٝ]Le]3.D& yh\Ŏe%4 Ǥ3s)j !}x o{,uewn F`Yy"""^:ǗMGz&ȧa #H 5'6u$ 3m[ٙ_#v8RBpVukG=6$Yf[e~'v=rR(AwL걌d\)3&)3'hUyA]?ncHHO%bן!da4y?6mXUWy'=z΍ ñY͔WԵfPR $ygePŘDC ?Ccᪧ$kHD2w5(/ޟƌ%%h4e<Sپ7ƣg%?+tOE\ BI)ɦA̰Qh;\!҉DLѮ5?RJQ"a,B2a$u ".*)n)9ȫ2YuaN'a8i:6ef>GpwŭcC0ׁ7xwo#a _I-Lhyof}M5G^wlrj9߿wܵsAoylBitACh !$ #&-^$f;ECf>_E\0) UUAyEBoM/?10.]_JԨ[00sAPōBX潡,ݪr6hYo{ACeƬ`O |\ɶõ<ɣ";7yY2)ظl|  VYY09!ڛ(7MZVVksj.*v?[Å4촠q\` v G]@d|4vG`II$wL0vPg c8zQƠ3 lC>.Ljrw.r6nKc=0}Ӆ av\9KOHy/3=)㗬= m$ξ**+ (;أ4)eSXTAm0=8a1!"úBz"wfDDD0Du'w@~Ͽ<[f lۊ9ZsZTʭKP&NnΚ\6m΢ aipKCYLg-$,Y[uv3_H֓ɑ9S'L[ g_̅SaJǥn! D8HEI*xb-T+>njo[xӊXsIfvA]Sꟷ4vDDDD,̈O򹖙 )#w\1w`WAsZ`W@DDD`[ׯ*u30#""""">IaFDDDDD|Œ$I 3"""""fDDDDD')̈OR0#""""">IaFDDDDD|Œ$I 3"""""f*&5;ٞ[9e(̘Nf͞9ՍP^}Sϙs0m^r_X]2kY̞M= Xۿʗnw+^w5SWH[jk"""""f|>Y3 @Vlibb\`Ìv*s֞p`%1")4^na. ~!""""r vN3o%gZ^S?~['Xf+]q7E|o.CDDDDd%-3&+WiƳ`\0; *?c]qSǸ,2?yw̿jnzE>m_&^w9.8|{_!/{Ӹ~hV+GJ0Yj;z]ƒo>_,[_k9_?W^ົR>~b˕o0i-=_ ,+/|Ksҧ䭟=u]KonXf?|z%.XErϳ\]DDDDgG1dA̘97)s$ت`]t=SkM eh߾?ama_yaӹ R†_qBq9]c2}y</,;%=y8{QV~gp⹌ 2dԅ_Q [3{XOxQ?}?~~XpN2MW'kj8>{n"%c4Q YS 0·z# wrǍ1-}8I&""""ܕ|r$so4k3Wfͧ|h&FW^)asKKNjGLo)+Ô 饟;6U^ 6n&לʘBe2߇p9F`N6U~ǖzlc׿*-ʗ>Ȓn~G>(H_.0']]/?DwᆟcWW>-2w9/Ȣl\MlX8 BG⫮aFrYEDDD΂0cb9z<`Ցg30Kְrי5qll#4Î4Qb4(s+OK8)c6ϥhM46]H&~d.?->mcڿz4gg$͞AK^: gˤFA2gc?2u&ű0=@Eel pL]U#5/q_:Ko]3p5Έg~1sxyNLn`A7<4mr+?0a9va|ߒ= O=oT'[4$58Z|)GV 8҂ie3SV2Uρ 7:'#|6\zk6Ï63ߤ1oSwQYg|1WI]FdQYw"Vb&3c'01;n''F.q?ػ-6R3G`o[2ŵc?DF}G6bw4Y4Rk3)ް }fLSsh_͑u+0ױBM ^]rr$0z0~.v'b)̈gx1ZC.]ɖ8٩vfŁ{4s %|soȲGٹd%x?UD 'ڶo?ǏwG DVK:\YΈGgqqG3 kYq\y\(? i#Z^篫sjLyOݹts(z8/jWl/>;-Cpv6ǹ.}~%+]ҷ?`k 1o1y?lli?/+߰02/g7qϸx/yx~?O3w.`wGsǙ u/vne܅}DDDDDDujOѧiCB_u@=P>ԴV 4v܎t.C>}f̈KaFDDDDD|Œ3jf2j*)-. rLxd.ut))Qt$RRRG>&j5.EmMy9Ւ4,_圍_  v5|֙oi9VS^ZDc}~:]'t90?j* yd:RAF::B3ъrj2:c-2y!aa7C{ +W M/t) AaQej(/-"!y. A. 0HHFYIL/t53puV##.946 s XE`P( ]!OaFDD2JkZ~jr1ص8snf"⻬z,/Lf\ƒ ǾW,[1\tlZӁgUel d̢+r6杵y8rQ 읭Zv??+,d[+%W"a(\fb18ʪe(0RXp"F9)fEpޕn⣥(•M&Iw YMf#7ҪZpER&'ֱsKQscB82_Za=E7-$M8O؏aȠ~B2V7fDw!Af.&|RZ)؛IA$iAƝ=YLJΠqU}Gh`Lֿ,CGF)5ZESe%ua )DG_(ᄞoHr"l\M^L8+J65#Vk9Rʬf* 8# 8-FI lv:t>Ad(̈OGg0ca>9  ؕӀ9i#B^)ͼ}g9vSK8FʔԄ9W9bffQM$#V^;ֲ\0o ½e`5GSJFጚ}.BH}ӻOP .q$OLJ 2w;f{3)31%؎ [*8}ԶSICS)w%fLGi8gH"8}*?e`1u!m sɉc 54Ҍ}tW-y'8R'LcZZxۯZ2)+ !qLMN$0]V8jv.{~\pR;\5 *h4BH86i^5U>]3$G &?:313+ I$cl$kuQ $İSZ ؗUάAF۵ZH!9 ?ty\rD"[{^VS){`Q !ad2O%\1% \sqaIwy3#οm=o{/Cpgv1UM&hF͜NஏRbv 0)/><c/OM 'IQFP,"/F֔ώ-[ؑ݀=n5(CqV{r6t7D-l>$4:*w}ւ 2u60H3iRp6.t[ |[R"4&@W We8 &:Ÿ֣l_VzX T6Y":ÁbVR d?6HIeYŀÛײj͚a-[r8;?2[UD (@g_`հD7'heﯹM,yUu;[_}e)kG[qQǪfOFyⅧilsvKw_{!xF#)PIvଭpenv\JkE57rNg?Ęda`-%.b#ѯn㹎VPe$&e0IM#~S!5Ԛ 35E8U^~pD8F._^fk_a8r,h gFa2N'8{ގNY.`xeq򇉆ÁÀz,tÁLK*[\ϙ1?}]UX!IǶ>-jwqUVp4NFlm#li;(,e ETYJF{nnpq}X ]~fa#3[+aۊOîc{? m.]({h6CN8ӏ~ F8}.*Zq ?0Rżin> P1~wQ|?;UpWbXWI]\͇:(ȵ/sq1pc0/aY\:3N` .>YQY0䰣l~w-!ADg`}1Z ;efT [͆aıYHq޶NoXԴ_~mzLL[&߻j!v\rj2K/[X&`;s^߶q=tu|=oͶr K +1IBqĻ}8Ui\naa *9n~#+=E^Mr{oÏ ֱ%]΃7;fpV,Km0mTc|瞾Ѝhezv-~;\21r/_ ֛<\́,G|-*h;8+Jv1`2]a1:!Lp7 'İ/̧ĈBMpDЗ[peUoۛ;#8ue=HVs>ju9d0IxM pc6w{;Zhn䃫nkP޾·poUSp_h(AEcQqaS1Z(G~Tn>7XXX`YX"~[GXgy//'_]΅v|Ow̲/o|e %[[׎m Cf>C_U>=4Ʒ=Aayt`q  uk?hc95K)ĴLV㳏VR6"GCa7aET:+,V:7F ?.cѣȈ?ƒLWð(bL ""Te#~) ?X_KHo[^#lWSI#\EypсNJ˨i `؜${O̹dTf_>>wq19LhsVQH|JȽd[~_CJIEAqǒe0?h$!FËzbG16[+2Y~=#i%|La#-f;sh2*5ă5O z' q|##WKO +sA [@s߭_j7?.֥km_:Bb*Bdf B&3R=}蔱L]U]ᄆ2oU#.ںE:ɬӘӗ] "fvFve_C-~)#"x|lo#lVBNA3#GsEalݝEae1GpƴS4,o]}%b* "4"Ը@\X4Rmډ*mL^t>m,)Ќ%-%ڜEd=;ɫʑYߜ<-I·-;8PXvw`ֲrd=|tݜ0 ::Zf:FPgk+ ,5Ẍ Q\uy681֥ƧV`؀ zFGӃJߧ\t/wu;O,K~in[+xsE 36k\]]95/^c pU|ĆVVP6 p IDAT"U, >|k9>w|uזTB .MAQvX,X8^NOѳ+ӳwg(UBB@n !.~>2|Lf;߹0wFxD8TT#ٰ(+-Ŋ 'o:?0 AXvfʼs63*"òV5)4?^ח@=;jBHKZϛ_aX9Ǥ %ٗ|/''lT`{ckg}h6ruVitbs:q62/`Qnׇd6&m=`|ZFGkv"AŅMv{VB&r%rpaνno q9S/W0#cϬ"dDZ>5?8t8ގHf O!i׷Hv!yYT[8RIi:,_-TWyٙ|ߩԫ`)X󼽪*ӤzFVm*KJl!ZbXV=kӏX꣺m$rg9Sr+KVU;{pؠ8 $ʿJ5> `R&]˔+gp0^/`ND\GsÙxL?qoLKՎtdq;=Q)X:wlh=M ~a;M߈\>Nߩs{<^~fQf#">a'䠌h1q|\f4{9 v%OO7Onv N%xGeNw^:fFln<1V;얪xe&kʫp2覯Xrp8xެ[9'K7g߹Q~nyt!u}W,4| A1-7μfj+ōS.fP]kɉ7=Ωvp 25ZnX Aq!_C~YnMkW-g#[e_sv5SP0K[ΏKv~eM*t:ڟ]k2snDj 6UDs R 0A]Zէ*+!(~:f~NR2#" ""ȳ;Q2#""""m~ 6%3""""6Le4ìtHJfDDDD4MGh4LDDDDZ-"EeHW}[UUx4y gFp`FÐv0 }$"I'$R\T3M"JHb;igKKtFӜNo-߮,%75.͵Ǹhzg5}Q ?FlL?M\CD|v͹6bw\_:nxKٴ~ =RqodO9$=%3w=ضu NbR"5=#ء4)z@zN*HsV31tQ 1I]SBfr&8{7Fshc91`ƮG_tڋH璻u Ff&WT i#$~SκVATL}ReAyi y9Y'쐚TV~fBJO~ƸI[ZM1&'q^{Rx˽6Ird34ɭ؈fgBsZƜqkIgFdb1 u д?͆ 44TL (I@厢 ?7.prn]F+,3!ކ ް$7k1Pg|i%@ҽסd6K6!q8_(Qvjzi ;LIb|XEU&c37H+0|4u~鴜N.%htIDA Ksec g{^UՒ '{]}X<'FG -DrnZ^ǐ쾀4,<;*yR+mŝ㘞[Mql8CU|g=+(kq٥/"LD QQխb'FkL*&>GinNO6&qϼ*Z>^QɊB"U?AJ:RKMiP2#"҈u'D׿賨FDHavXTU N>EC̤ wcN5,lDԕIEM>[쥨o W#~(Wf\5] N :U-&Mt14_C̤ =EDOI ? @nwvܣ]n7ۇ9qf+l!CUN9nlxx;o*jn?ɇ_rrq|`7ٴ[L ߮#XNJtU-9EDS-7,Ѡ8 zf&ص3bD$/'Eg >0FR4 )i;0=2<Áihl̈HS&tp[BɌtnK v""%H(6Ri2l@DDDDD:$̈Hw?5Y;Kɐrnsͬ: <:Ju >mNˆ}̼WN{2jTj l^p|D ~&\.\ Kܱ=v}XBS/O=ˋÍEфaf+4@izfSF"X|{l6B8o`Ë13x`"~kz*pN|5oL'a ,B9PW&y}sr矧3(4-Et| 10| bR&U( :q/.7 -JQ$3z+ * W| ?8k,I ψx5[h:fL 359|[|FwTЛ']%";Bޤ3_OXkʬ!_i1}tv&ܿ`EU+X?21F}[98Szksf6/]|ygp[yqE &Yy߭=uEwem* O.2~}9@íۙu߰]f9KS尷^s UococRԴ})]~!@wιZN]u 8nb&^2o w O>jjG`w]r2`,Փx[݇oS\dSfk?s4eW2ӞbAUŽ -;dW7nwwhVR;i;KXqe0[pX CSJf {.8yW/XĹW˟$2ml+gfgՏi:#ss1ٻK\Z ZVsF|/f\=Eg;?3"{hm2ʼhpB2Ɍ(䦯f=m!:r[l55em1|f8^ 5|zu,Vak.鞙v#ASfyWY?NJc᣶ή؃r f ; 隓3>2cN^_XG2C7d6**/5|o9SG/хs~cdߔ̴#pr<39iHݏ_C?ډT ޻g@zeDDDd_; ٻ"|6 [BhEYI)eApN7UT&;6jS)`O t.Ρ̳_ϷniYƈ٣Cܻ<?3'ֿ>ĔrFL1-v>^ʲG1*$Tٛny S04w=yz-?Lק"""ցhtb÷y_aQtODF0L㡛&w2وOe39(#g\~VwH>y~kOi%3-o&(7> n<}y}CBO6&_S&az9/?6;Y$j9SxÛ}b׼՗^ v""ҕY&>b8tv g3Zj}&fԸ˱5TW0-7μ21}5LBw <3Ł anTQiʺKҫ2[ޠ8'R5~ב^vrF>5H\5:"a]YI1ѱqh_Xd""Ԗ߳+}MFlް&T˗,dа& l<(/eUѠ nwj̈HBKCEDDDDCRόe$ؔ̈Hh/ 2 3IɌ2}&izLws4LDDDDZ-"EeHWTC锪*ظ`$""~Fdb1 u д?͆ 44TL (I@厢 ?7 ;Dܤg(鄜N.%htID""""@DDDDD:$%3"""""!)IɌtHJfDDDDDClf0e%;)ϥ455sWe;tILDDDįH@dLb*+)n7U f,aP^V¶[zII8DDDQ2#~WVE r=D˳;uúVrGFDDDB̈璚DFp:IMϠ ?7ءH'dF!:&6aH;G0DDDP2#~gFGFp80 M!"""dFDDDDD:$%3"""""!)IɌtHJfDDDDDCR2#"""""鐔t`wM>6zբ+sԮoS2Û.cMfff ?x.>c&Ũ'rҌ~0"{Z7>iƕO>$])/sS[ gr `K0Ӵ_oGN 9/Gr۹lp*nkXcF{/m_>ݷ<̿ĕԸpGsgޛ ^ X 4Ų,ޙHStqVi %V$H2Yǿce1,Dz+iO1HצdEDi`1HmoW]'ft 7^[q,/IMM ̛KHHHMs2u`j**ߺnQ[0[S0н}U}B.<*;EL6 ʥhU7}`b[:)'' H;*\K9PGH{d;np~x=?eR?3jP]t-KbvۏywqN2Z\=c sPVPY>,@5w`Q?w㱹OpT% 96yj.}rޘǫ )È%%s( MLOeƻU_:9pN% E֖=o(Zɠbɝûܛ՗^ v""""{jcL)G\_u:Ei_ڭpN{uJ<'TH""""jf&"""""鐔̈HdFDDDDD:$%3"""""!)IɌtHJfa; i p; $̈Eܔ; iKKttJf{;iG ,StJfc㉍ƺVPCCκ40(ٹ kV@tl\CNsJIEA~.[7o=4] &5=C xctRf&"""""鐔̈HdFDDDDD:$%3"""""!i63 R`D$&v"""WJf$ rYT@jz&b;++)n7U f,aP^V¶[zII8DDDQ2#~WVE rNp wT ~Z 3#~WKjzك$5=`"""" IDAT `!PTL^ONBɌi]i44鐔̈HdFDDDDD:$%3"""""!)IɌtHJfDDDDDCR2Ӥ>mv8Q7Ju*߮cF20-^CxC/v~&\.\ Kܱ!Z:0Jky|}y۸zvo>7^̾VmB'A- #eMninIdżg-a q뢡\\FwqU>qQ3 YU3Quh6FL>QUQ¶ӷ̦ydKC,ewC՛6A;ʠ!_j@ԉsgޛ ^7oq,UM`EDDD)'_ɸ&0zW]_d̻QԷ7`}Λ'rէ2[$C88j*[țu0+8" =s2*5~ƤAg0iVo X̂w*99qP2rq u cں3w|W[3iL e<?Ԥ^ 4W<!3_f )f|ͧǜM&`Q`6JlDPUIՒ:W֢r {#gfl8y޿v~R=۶jsgƂ__(|3П66-\MED,q>jk-լ]=cGyy\3|%fc9"2>MvL,o= _{O:w>Mc#H3xӍ3y#¡ EYi)V@6[ f_xu~`nƱL`&5552o.!!-EDDDHɌ Č줽;|aisN'⁹_/\У ]laDƉ\;_[cloa>߷b2$f1ɻv {s;iQ . 3#G n`& GZ/ҭ|S>Z!YIIYhؓzl̏k\:hF.fe| &  q`8q69c|<4R2O13%9K0M*fbL?ӎO)ٹ/]c1,ůrJWK)Z~sI9iD)~OSgظk,k'aAbf<!^;ne/+rq}Θ^U#8ᾅxut-<2g瓳K\9gOgם𮣹ᬸg&wm?֍Ir$WsU2߲Rj- '%'`7PAsw퐓W,y$q3x;E+t-bCCK/Wm{hP@H_GVx=[U1lyտ{/efon~ȴ)qmfV.G:bcоbi|iG{Zd!h6.\`@y})lPFeVgiGLr-d nf(lL>I)""""N(_Y_xD|;LDDDDdO \''; ڗ; QόtHJfDDDDDCR2#""""";ÁiC!0;CDDD: %3w.7e%Cڡ"]`!"""fga|E#/'`""""xb㻱,А.0 Jv`ÚU'DDDsf$ RzrGQuMfw8tIMP"#"""~dF&:6`!""""HdFDDDDD:$%3"""""!)IɌtHJfDDDDDC0;(*ȣ4nwr=)`#""" _(+)&95辱:պ*QVZBnvRz vH"""I SxGe%8;X㉌t˦ͤ$'bHI"<5HG㩨t$Hkjؼy =R,voV|BEDHgK2h؈Vmr6 חJ*hPjTvi"@KD[pؕtqa Пr7`$""";0 v8Nle363#aYP[jugtVIX:!DDDď3#_Pq]ADDD:HX̠ qI'q&t"Jf$ ,!IR/)1QIl03iv;dHXuY-?3q%T4W+~+fm}/l ;R2#aVaC[~h^6%5r+%3  t KՏ,Zb'2Ҿ?V?v\BB(0}d;q) 1yzjF$|W\wn ET ̖0DDDQόهUrJBGB- fwTk}%?g֥0ǙuULh  ۱:?ӻW:9"!ӯrWWխ|Ͽ99~tƦEMgŒSRwt[9CX(Q2#ӷOFC KXa°^TGeh f7S- ²L k ͭde;dtό^;<|͏x*E_V-kj101 Zx{Y;04LDDDMɌo/Lb9y\}HدrUxm-zZʏ?W3fh^mؓ3^ 3 3J/'hgPYYk=#2=|zjQ>>"\}Sڰ53037%3ʷK;ɠ|wlqqpр-O3*N8w#8Itaf':'UTךX$ IMe ''\q'901}yg`T3-̐ʮTA""""  蓙)UW`]+-ښ*jVmw2fC?R2#bxHJәI[HsNm """{f$` #f&""" 驩TUxt;$$̈'$ԞQj+'>U˵ӻW:555-^݋*{W/j˫[$?޽k9wo*rfFo***߾^TTT};z+^P@x<mZ'2-^.--~}3))){O&%ee-RT}E˥eӗ eg+gt6Գ5*Ѡ8 zf&ص3bDuy$HТ.4 <2 rsHLIGz&Ng>GYd""߳]% 4lDtKYk@`4(fb5*Z̈9NR{I\rn0`%Ap8pEŐяn[Ȉ싮*$ 螔LL\tJf$ r~tbwTi/LGYi YxKIէMfofgQ!)앉s]ix=edm&=3R+LEw,,jkk&aH(8WSU,*8ATL(6_;*F=4Й'~WTGR4 `#"""M0|6inku2SKJjp8 ?WL34]evβ,#TVx[m׃;*:Q +* 'a{JfL[lu[4 #@M?F(G[:.̈H }#""""dFBHF6u,s7c._f楋fSc[4QYSI+v3};YUT!Dc϶ڬ ϳI y0/qz>0zԱ= _,xo'Obpte[/튒Ff 3M 08^Јpcŋ} _<0qo@iM.S=3k;rXK\,6[] 6}+7vo[繯an%J)"؞GXbw r^ۓA+F"]` u3 ۍ[y+ ѷ~_U&1a`n z{|KVfnWm8vmI5߾f|d兒6vf %3mQ=/#9q 0:.[ݐKg0eqau2xoX[==o뷹6O<XȌsu3a6՛x˟TXADRƝ{7MO$&YyVFC _]8s?b٦"Cw5 t"gٰ|;پ{}ϗe`x5[h:fL 3b5W,f xsJH0S.8̥q2ۉt3]̿#rًcJ,| O2U/pӋ+o=Ճw^w !D5#3RX=/$r҃,Yt(!m|Ƚw~kl?\q@ZΦ=,G`*z_ZIE[\0.{9 NS`ԞDm^P cqH./y18=/?;Feofca i ? Kʎ\xl^|䏌]ۘY3Ó|ww3mUx|E(s+x,ZMwfmgRu)Lq>zGSh9S-W!wd|Oj9pTD\B?Nx Cz1yq K#8fs(Vؽ3fqTcU725;{GXFf&'_3z]>5U|+"jͿ\\ud$kykp" x)-KMFأpԣp\_] k~O99Hw ?^a`5 j=c'2;2G6nb6گjپ8;&"2#Μ̀4<Ƈ0i'br :l&Jay8)v5-+lt|ۇƽ~YL51grngs6?"'ϚشH\Lq CZ}_rRw}mvn>lJN6A,!9{jْo'%5;B/lz3b8"pœ9l .p[/힆m [60wi,E/;j·mѱjZXL j-hr<8aw;V?a,rw`^}ւ}ȹgQGs1q}9 of#,UmB>;̹g=w43ͼq&;7mbSm:, kĢvzr +7nFS>݇ćaZذ"\DjŌvWa>F2j10lX0_(bqEj>9t 1qyZ1j?oc?̲,wqwq}b~MdRSRu^6$rx烐n$Fײ1_RJ#3_]f3S2J0B1ㅧ8;+|S4Naq8i. b Wq78~O$'PЛ "kYvQPwwņeuյ`YQҋ@ I&S9I`f0!~5S~ &gn8_nuGZsϛ4x^yx:7%Ds2ex=2Tn~-:H\:5l6C^Wf`[-Tr IDAT~d=k/zvEӔWI3;-\ǮNڧ'v =ޏ";l`݃a02dZñgȶV/z}eSz{uۄ4 ӡ?G^,ǧiSf4eYfSVN(9U/rMikDfuNԭW=4V_vQjSPqQtu1FWzbΜ/64,>ؒiRP3fmƭ*8X썬oov-[ [,Kn𯚣_l#t37ENɾ-\BeLSܒI+VP'ydF۔%^Ӳۮ6nԱLj⒧Hk:ygs9[%iJk˶g{a&Z)SܧgnRiʽef.-pӜ)iҴ*޾A?M~LoUʔM.%&JeK,srS:SNZhEr:Z6Sjnl>dVnpkKzr>,ʷS=?~J+.նM+5ʮ:ȃHO^; 4ٶR krY(+aYR#Fء/uh܅Z$ٕ.[VB-,Cޖ ܦ?7k Y ΥZW;?so\bggnF %2:Gտ۪ThҕV\VafQKҠ+O{vװnоY{> GsNK(ĵnNCѝ}_~(MܗM9'\kWN_)Opݕ%ZST\eWF`fyjvR۷l**)'1K˹&ôǙ4!apޭMvD TH}hܒkt㮻M/Mw\JGr YWS~]G>L^gouXG?swj?M]"9W܅k^ lgK;[K_P:Ծ0]:< IdXAs[uݍ: b+z#51n~~ORtWx K68r zו(K bKU.YZlJiCG=w~S[YSVNl}v^ڂ.8%%=>|"b.!GFI|0K/Ь1S2y[~o`wtaE4d|ʵɞRQLW^mjd}rp,C~zLLnvO!d~6FPPBr&%wڟ)WSFRR4whն畱tǐsf#%þ>/8= nf3%.L~C!Цp+\D ;"m͚*$-sߗh͙1M}jIKT%iGRQZIFb,F:FA_i5kp%K##JU 3l ~50TQV*33j sNS򕐘-E*Zp"C)i\SYml%a.JMP"m\?`%áTuFa"11QwPFV Ðbf7BAfpr59KVzf=;@,flN^q0 .f% an+QI&d4vCmRRԮ}Gefվ*ʶxs++6JNMUnNDF aU(+UJ)i&𫢼LEתrG:wo~6mX%M=3egfZ 0L׭QUu%Mr\Gt[*JգYy%ڧRԣw?\Xei%QTmb0Xfձ;jԴ hRRA\J3HI&9= !ͦ:kMQEڍ @+p:׵@ś3KL]]6mR Sϲ,%I*m* UXKRuUeK4 a&ihl6[m{D4  N8&Zpw!z3 .3=@kG (~ 33!Y1_<_%g󞘡f-.Aa')ԧ\S:D:`qijӞGQ\ ;C|N5Cߡ<`lҺom -z`:@F*_wN>u=7L/V: א%kKdIO ^ ߶Vep[Ǻ6kRZd = %ɪ\ND;D %?SJ\8[ʹ4'l==C`tT'?{ZKwRUGnNU\lW u*:cEfBq"Yh9Pcaf޶U|MYgKg5P{qOk6}tUKvǞQVݟ&ᓊj%ILÔVϐv95f]Uyڞw}:stꤞGGTY~Hj)JOOmIKNm#tEk[n[K>S.>]vmRxb} | t64׿>뮛I骃;'ݣ>g^UUJl[JrWv-0Ԝ:05obԿin 7oݢޠ lзMWn֝/~Bww{qr:5{kwիw|OӐVكN:un+Fg>V:*}6:×$zGnK뗍Wm {5S1o1jg(Y s)w]en[Cz :pT^]>RUPCXJkSg]?Gḭ JURԔ0x_3hiPbڹQy?͓k`u%>Yj߷f7Wtw C3_~X מVJ^jKå.#5KOkj#>:f4kE7A3fnRC+YuVnIܷUaq`4[֑\-Zݡ_ ەwӛԼ2roҒ/k/auL_Ts'4,{fAܤwn]R*};-ѹjl6ed*}GVe뗊֮ǪRUW3r:RA:avS@}fBbY@95tHl:tOkv#95t}߱2,3ɬ{ H:̣7W,{wtHSjrzuNZkdưf[¢Nb#Ke_>=ZWCIVulՖ安MJ~i^Xo|=ZQЩ=uow.=KaFSnrw.]tխs W6٣mMmxfM|\ _ɶ5$qqJ{цξurzǍ;T}>.U-$'ՌiGtjND) Z3Ӭ,U͟6ߐcHmz.t2y M%a:clݬMzk5~w[eCn|۶Lӿy+7jky7d4LVU*T,CίuVnKLRUʽeUQ +Eɑ_#ƿS޻(m%1C巺}|thG#ڔugOUZTYQ!SnmkyU7_޻Z}vnY.M?uFjmpnyc< U+]ܬ ץ)Ql:hР KkЧڬ[5ddCcX3hyPbXRPUzw{V:[KuHRа.[K.gD c3u{eTgmG_ .8M9^}uߟ437#+Q.y-r}Rӏh<z:xؓ;s յZ;]FR{h;5Gtj;'薦 ^֟թ{sϽ(<\.WEj޶}_bXߕiIGyr޿}>Kڔ͸ի7  FFޝT6^aÇ=odjV>D.v-0B̲LiOq#T:te$R>JQkX4%[F^{>޴f\N[ Q2KLlx|nm_շ7 еIhnPWuy{75Fmhn7w)w͢EZRIvA"og]l,͙E)5!zV_~^V{@(It 9Z֋zgV՘2\gmDm(spYr>z2hX\ ZHj zGTv$WǡUODSs4dh6ڼYխW&Gb9y|{ޔos&)1=)Iv[^pxɞRQ L~~3=KasnԄO._C6fMh4r:]ܝF7T_?*ٕC4>cf?tնma$ڹ}$̙1M}jIKT%iGRQZIFb,> $XzfBGX{U3Cokv{eȔZrϣ!j55UqOӗw=||~^vnK\cd=i7]qp%FPKkmۖlH3hGR\BuX-n/_ *Rukqá u.詬t6HJIMS"[ fvC)Z@A\#̄v;(#+[a 1Uc?Q.THlr8r\M23} LNs/43a@\"KfSQ]śT]Y)djPrjr;tbv;S4Mj{IvSzLUQVjoZLЎ2m\FU;Աs~?\Evm/)V`zPFV[eEsF Ao.R^nt*k7t)`?AAUWU*=#@+ʖ.'390{d8!`2q0 .f% D3(Ղ[.;K( ;$tjI~;\=zt?+|OUꆣ/?ט ɾg:go]w+=~]ԾA:K7ERj%x}m#m}O55o޾&cp;AWcnXy r$oh:Z>9j`r_qţ߽oDWuPV_}Xǭ=Z/N}Z3K4?銳/QOnvI*ZʩoDCm̿?y^6eZLlՉ{Xzr;F6w։7ܥcQJ,O|ꍿWUj~M:[ީ&w [$SUURZrRS ĒwyX#ǟdB0nS/WM'=:7ubr5}={JfmwӚNW*5A$M>Ѭy\m}ԟMG*Ztm~yb|5XL`>:+. shw \׏V8I?^swױC;KϞ3G*UUFkv֠=+JIV2hqEN[sՅW߬ߐPJ3Y/:Bw>znՏM3᳾JIDATk/j_P;ЇGg vVMn5󬝅jRtR;d雇oֳu޺NDޙ0B{,ξ}y~_}85M?J[RUU*?R=WRvh]d`CZ'L YUJ5 u+n·+{I"2L_ps+gg|ϿVMM<^<LW7UuC}kP_޲U'̼WaM\Klf<@_K΃u*|iptWkf/r_ɞ#;[/^ܙSņPbgOϣ!;W\5{27k (ɖ޽semW؏˥ui fbʡO }+ףҊ۵mj MW-WRb7۲G#E[T}{ͫe'ʭnm)\rWr{~Q*jW0H𞞿gmız`u]ﰓo՘\h "$zG└P{8h]` &hfM!Îh2Z\EY3Z I}z̙1M}jIKT%iGRQZIFb,VR/`P0 .f% D3a1gw8dFKV0 .'3T(k2 (/SrJjK\nN*ZVҥ1~mڰVZ 3V.%2rv@3 Ce۷iQzfVKΖ.󕒚EZz%SR׵ b0f.)Kq0 .f% D3a@\"KΖ.t[J7]U%4Zf;&%EwTfvNK3h kWT*G.-iUQ^kU\tIm%(+U>dɒ|ޖ.+G~ZlJiaQ+)ޤ:0 Y7 !ͦ:kMF0殮R6f`Yڤ]]ҥzD4 Ul6[mA 3@)ӜhH3 .3&-0&Uټe~9W%+tо]a-fZf*+5s|IR ,K;puh3h1svTV)%%Y{uӯԪµڲeN=5}qzhg:T/xejF5f$:ZaMqfVؿ6~Pc6]FU\{X.GiC߹Kwl>CqZaMaW0Zr$ivPDz9Jpԅֱw,6lVPˁ0f%MlЌY5A*(7kB_Lԫgt 'KVSwkSɪo}^NO͑ͳA߾>\|>l.ukS7>,ռhmy:Ǟ#.K?#ߕOꁵ7t+Dg|zBgdWn 3h;!/Q^_nw$yUr%4>ڸqG .ɒi{#c+6\J'돳ӤF?wfThui/yDdyG޺Ƈ5m,-VJMllX6l6l]yޯ'-E+[ 4I*vT|T-UeG0ӫ~ c/ާs? |=A#n|IGd9V?>o}{.~HeҙdV}d |}G~F$VIa[;k?g+k_#!]-C ͪpzUW螯ETzXF{H #8)4i\.b oum)W3t['WkLK2n&jy絚ZVP*uΖ S,Y ҈Ǝ i"f6;M)m4O^'ϯٿ,R:EeSfL9̭Jt$[K.gDuϊfkI⼬CL {KdE8lj',^dn+Ղ%%I N8lHD举 &iѫkځaNU6]VMv{eHU;cدSG*vG%ycNj|a*<%''I֬ݠϾ5k7HڴIAy mmƃ7裗>q: tQz$% 'h[/[Ucl[$Fء/uh܅Z$Ggy[TYR3_w+]…ZX 3@X]~e]#ϧ۴QBS' szcT$M{GF^t?Eo WNV3'hBdMy6[aS< }˩,wmxi^jU:Reκtk'[v7zTpU׶%eq.2zvB#C,D:ɵ-ybXSRBݣy')v92|d4̛5]zx}!٤իk9quE2%+;dBK IJtjo9JJ孑ϰsg2eXl9] r,Y!ǫMr\rme0Lٜ6ir&&־oc5vF._CѺM5g48$mSR'IZ.RRuKEkj$440*B4I4WVT Wn|\'Z~o+j/ G/x g&T ^f:6x \+^ c$^.Mݒ$)nI[\5<NP03kx$$wݣ5#h}2ބlAv9 1ɒRTfCKMB -[E;!Td?z>дʞPJwFajWO=`!WWcᆚf…p&x]3;OIM3=0ʄbD ÌS! 5]rC=3Fc=3OL=3WGDfLB\ Z~]o׮{/0*Ѯ[FMc=319V4ɬqTՆB^ wLP< @p^gYlfץړ+t vPmsjW=J{gv$T ~>PS3;^L4+| >*d56+}3ᆛj*'V_d!F=ԟ]7X͡?f7k&84sцPCB 1 5Y}` 5Ԃg IDATxy]9VkndHcc,d'2yA@ȅf& $l. !$&!L5^dY־Kݒzι?R\ER}? /}C!Bl7b"^"-B!83y6sK-%!lfCBB!\H0/|m E϶_bU so;SX? SB!8Vs=cC9~Nkϭ3綋^ мX|pl~\'B!~p>aՂkxi[_,ϵp1*g/BXx_r@]s!B|Y-v`U=L NubUcͽ !BLRO4YPOZ붹E Ag P6~}o}=08X<$ !B8=}/%pEv}ayZ?ߤ|R+s{-[lo| aI&X{gB!C)Bӧț>zg) & Q:f:߾i8YelX3xW#kR]U/I!Bq)Je;C=̐u=7/ MO9zbU]Cu.aؼ B!%9atUhxa_jUs۟+/%Ļ [m٨_ !BqIiBX]=dmnbTϴӹ.]`b1+- !Brjn#Aj|cΥIV?Sb :k͙grX4irB!գ\.^ l>Ypi2{ŜGLO.6X.!B!.e#&%dz/m}!wJ xB!ⲐYG׺v]8jnEy}Mhn`_Zl@YȂ{Xfϗbִ-Ū0/A^!B\V\!s"Ű6B#8*,딧BWvwI 1[_#?7 _{!A\GKi{" [;_ _rG'b+mw^3/#<ح0axAwd]:_gul;_6~M O܃|S? BB1wUA~)yYbT6ezP/y!e%9C?!M\S SN~`@=z 8xI>>@x{=$?0/[;7?#W{~=ܻʟ#خ|م£ay >~~O5_zrG'RWo殷?y*:zm"?'=.n)ۚw(>|Dx#{jR_Jk}8^lV+Xp9_=>ܖ3~gc1̶-Scuo}=l c}0Kئ4zSz^w\75;Z{SW䏁_/}K ^3K? /~x[g?y('qs{A~)!.'F\֬oi7Bw$5J+ &l'U7}p" v/xިʷ_Yml1v\Mc!X9Nnݍ-\ 6F-m8}l lto#8y%I!./~kmoW> 8桯-?evŊݥG~ !īJ8I*֮죬+1 \lc ax~櫹G_ǻ~=Jy|3o>o>Ά607TOc{??[<->Nma3/2z%lc?G?[aCOʾG26y]oB,7eq~Cȇ?KLO^_j+_ȟ9OX1B˅E)ɝG>COߚ[xO*t::o{Ps'>~&XΟ(k]|o^-/ F~&}/r`NFr]Xsw_U"}GG?g[;syVm}MޒIe㪘6OסؿgoAx^ O!ĥU|jb 5=UQ>s?^8/܋쒵..kضO.)!Bؼ?9J2Ӻ4,Xy~.!B!^.i6~%ZkfəU!B!.9"$ !B׌x0iB!U;Er{RB!WX-=B!B\^ /I^!B 6 !B!. B!B\^iB!¼ƒ]% !Bq!F!B+Z?q+B!B\^ =J>B!-iB!2$A^!Bːy!B!.CB! IB!2$A^!B+}.@3P*HZOq)ʮXk1`EtJk|qHӔ$Ipuf\.@ ˑy+:" yPcrXh4IsB 2:O. /$14M1(֒$Iҕ" SRhZFNIi %I|d *kRVXUF!X BK"IvNPS=zγv;DÂ^xp<]:iVpT-Y?{;Vߺ3o10XbZm=mVZ9ԛw ùukQ(렔XHBqQHB\k-vZjBR͆P(Z?{ƚk獿`v*$Ip]s[gZmuj9g0$$&C4ݯzF31f3;%IBg}ŸK&qg"؈4jyki]]DQD.WQ0ushϧDQYt~]'?B3[_=̹׺[ϽVU? ^ ByGP^) TJ) 3SP)uk<eJ³g+[*y.ӕSY1A6kW_wƆ+{pe^3[yQa6eʕOjYo4HMA@\ Ǹ8jɉiN8LO+Sxnb)AN`UBfƥ ̼qZg3Jg%G;͵pMI1z0:GcΝs XXJe5k)J b4O>y<䓌w ځvAM;*{iE\4EN"Dq X(SV|^ vybZy2q3::JRPt}!\sW$"~R(CGV ׷{F#ڟT화`~kV{֥0 ۸a c.s144ٳgO<8 urIc<&q6 l ~N`?CCU&&&"qj喭S+`j5 Q{cD!xOΜ{'"Q,)˔e>N?D3;R%/d6N~nvE_;umz^Ͱ n&IC}GhGSY<7 HgIDkTNY\(֢޲DQfifye<Ǯ@6ڲ_4䅸Lio c-i{ƗV (6H!4 !j Z +9V>&B; wq[ċ/p{q -01/?'Zkchr[8 >qOG5ǡFغu+6 ax$zJ1Ib0& 9V 噩 Yv9GhA+E:DN~6k0),Jp`r9kF3d|b'cqp0gD`^w˭e*Z+ ]?̶n>뮻8uzjmcǎ161}Gذv J9`=@;bZH=Ot aؙd6Vʼnh233ow_!0XrQ*&Ix90*8өqL.}0$ e[@N5N)F'|0=ZUfju\6>/U;oЁDa=G8:2Ab¨fkDQ"<ͪd,M0&1NNny/>P:A(]8$16 ($U%hB $A^T焼851v Euy w\j6nZG؄O9~te#eh J倫o|zfO>|ۛ)kGN?6pCƯLOON՘< Iowj*##Gu:TM6o\G#jrv3LNsMy[apezrí R(0%ŪĤNc7_=@xG Ykq̫/ Q-lTJ¸롔CF≩q/'k1aBEPQ'Ķ{.Ze入0 )qG IDAT''۷P I&ƧG0LFkeִMY 4X0&7q661MOO ڥ2Ӡ7kIFy4 JZb)7EjH{٤iYmemEΪqlQX:O<9?gCLqݵkx;LWw`mʭ7o;"###LNLSi (Oah\q12z zxAZr I:4ހҤV2F+ (G^f{sB{W(}r+VcmJi8I /x\KD<}LqB+Z N\B|ɓ'6eusaѣ'ؽs#&X1P4z \{l޴?#S콖T#f*O>_dj a=$)wYoMlf%Iڵ+p=@`M@0&њzgv=A*0$6=d;4{j,`,LU*jl7>Mx | S5n3u>vu]55 Mbbٶm+7n[mmeDU\"===\bȑ#GZ?@{ :w߲Q[cT6W)Y9lf(.TfB(Ja.3~ffj:yӧFS *^YS 5I5Eqs~R:뺤&^$p4ڿ)=r&=Be&5M$9nz ChRv\&63^3DOarkc?Cl۟уzVn'xkwٴy"=Cuxtwoutu8qb<]{GYnÍ;wLXY▛o8_79x`4qP19ޤ2}S'ٵkwu ?ӕ'x$O!=%zzZ5Ho١TmX⸚8MQ&9g#YxBs+ҍvc IS**cSJL79j5/g/8f7X뢵d`]<>t#c41\SuFOIh5M^UdrpFMdtH. ˪$~r,noq-eӦ\yzCַX`]oO٬1Y?<̓`lI0уgAMyv:tk{5 r yG5pŚuj6oTazz(4hٱ#'`tLVրr}󯞃vp!RVg44Zh'Q }!H2+X 03 O?6L( "q붫YuWQo˗9v{4%*ǹn3< s`IV\ɱcX~>|\̦M\PJ|ߥXG~mw< tz9vd5?/p!w~ãh#)B9YpalƮc`*LV5VHiN;38>vv]@f3f^E[]m]woeUIbCGٹs7Ǐff#Zcδfv&kޮ̷k{zz==E (/q4R*+72vzcN:hgiQs|W\,(!lXeZLN&hǂ5~]`S77EP36ah ~&]Ni*)XE'B%5jָ` P*!ƒcE䳁tQ$m8.taȦyVϩ.QUMڃgݕ‹{hLԭ ٕC3}]kf48Y;jҚ~S-k0Jb2AILJ45z56i4M0( QN9ھ5T ƍϋGnV֯#,d-;54V!35`\ͩ:c<<$8sKXa,kz]mz9 4itLQ,`~g3*Ci'ѤP(`Srclն㐤`ì:oYLMH LAFT*_"+$f `d_k\SI*28vUnpu iYPLh4?)d+Nkp1da[Ij36%I%͓䦈i֒dvMqJ٪NX& > 3!X2п'ghfLLh\zzwִDQBE;`mJh7z/ `L yOa$cNh66q\' yMWsmtZ^qG/86G15\R[֬t2eȓD ..*N|HwġC$ٌI}+43^J1+8qJ{b Zu \NP{]le+Nۨy'W(֩LWh45|p\fm Zd5)QDY`W`I!MtȪLYyՠ Wj&INu=BV \}Gߚc^@'4ǚ >n͆;Pj3C.DR(i 69X2 {V7\y!"%3 LlG~O~lg,&NVO8`uR7H/yq?Of*q5yRǞwfɦYԭŏr#JԝVh48u4M82mBi2NZɃ HBt HHlvLQ*|eŐäFHNx=`4x53_'38I2I|?&cS :4 J"0>aI%F&EKiEV< |llǔ┘bOuo[8T6T:9 &)&up&CcGPPz dZFe+fCtD)Zjk |~bWJW$ϻJ.ǢCu* )Q$Irk)HɹSlkR$u6Ch7*^z0rlzAdt@Z\/%YfƋ{Rot("|ϒG`4m;B++X&d.]0h1&mZgrVǵxN禸w$+HlL5NP h{U^`ԡ1cH›F|GUG=;cbV_E *\' fuGNpjBBCǶ=LOY$iz{׈l6=+I_҆l_` 6DزIDI4ggz^k;kfx#OjĞT\##2\XZz1A8Qh,~T(uGf@*tbS.ŶmqΡ !$?Jhɐdl^r"x'H|a2w# RKTM1 ]HDnY\ W k'3 l{,9[3)wnGw=C*S^0sR#IKLJ0A"MA^zgkPKZ^#DNS. c3Reb )"DBW‚z ""9Ek,XSg%1e ɵi9oJB D?€ {8$^2"EYV* S^bs5:T!n0d1MΝ;^=b6ûs)2tqHm[mֿD6v[RļÏ="))>[ևa=_P52yDvTØLU CL (S$QN>S0^p.T(pHQqd͛?挦i5u]1iKv.rvbc49kp^2,4R =s݂<$]#9ǯ=ٱ9xnb4Hfzj9BfX o/9 4;b<]ï[SUhq^_k*Bj 1N L3s@Ԍsħ_կq|WЏpxx5e Σϳ"8W@L׍k\]hdl/:O>7<|q'(i'WP~c$xaא'Bd<Eq,6q[AN xO@z\$9+R\jrgTx*TQJl2z0۞- 2cc*B9ZvVo:ڍ&)>ãOōg<}?s~{ vrލ$2+hk1j2aPEL*PR'Ao&' ,IvӠ"ĞR1CK̏i Ʊ % iX EeZH;BHH(ʠ  @Leeʍ׃ޗG)l]#r`zRs)Β IDAT fAL=F;.VV G9Ycq2. b:ڶ7~mZ@>go ˳){(uYm xm8 SBK5M33-k>)ǐ㯽UZzo[+8N:] "R@(@w(vBz 10)*fۆ K'Y=w9&u#QLO0\hoCFs 8=`f5X/g:-Vg3~@cEejw2';vǯRAƞ=?ҫ{mo9ΓbY9bĻ e8:zo6?OY\yOM>|W_>0n 00qp 2I,~J:cGa *#KNk !a:`Z0|hk1PIs= !sY ͤ5biY\\Mw괦Z-e~ֳa4{UkTŶۡ@S+\$6gk᜶X}G0`$)gQd~8=ΘTQ[0:V;=mI S*Y:7;-9/Ny/, >❿N7' CeA\DTVZ|1! 5Q>8Lso .!HX4vNfEw#w̛iBXVp 2ȩ_U0ШL !b()rt`$Z/ C1y*ma6I!Fg\/Ykr[Rܗq(yB9wvcpNMfE{&q e,CདeuTHiʲz qcƘB ]'ZHPQApn׳X,HkJMY\S#2O@3!Ʋ'M$ 躎H)c+rʰ:fT‘ ᒜ ,`樥D*Pj@8IEW$)IZb YaHԲ)VY~~O/%yb;.1Пih=99V\l U<=ܟx߿xē|㭏ɟowӟ7~7yWc6%=3Y,ļC_7 Pϟ)Ĭj0,Bd"4$(tԲA~#%Rx6r *<ds,)QhsDOIEfN7 9inM-Jr3UMć '?W1_9furصxЂAʦxLH.AH 5g82akdTczgΓtI|H+bȞKt-RYc@ᘘ9;*~RDgraLƪ#^Dp3nHT6 WSzLJ8*RncFɀ1~h2k];Yy֫nkB,<h-kKL 2{ŏ[J8^s,k&2r9CrgƑVzqqDx:S#DMHOԅLm`8i rIC"#KDVH&"ň8}L݃ܢČv+<{YyDD :y*y[ޜ6s%%@cWV[_Y~?˷q1l/UJDuW8syNϸs)Ʋ)T2* ||뭷cv݆-o}my{5{|AC ā-냚wya67cdFڭ*۠HL#J/}ģ'Ƃ4M)(ABj@ CN 8x35G vb'k]VHʗPLcq}CNe7BYDsq:2A@'/ꡦ^ ( '$O1eB(RAŇIiW WڂS]JЊHJ$$RDZT97z@%7I>{M%%s˾'O}#uȉ" 2HH=5kG,Jɍ \1 ( 4S.@eJ)* "'1*cG*$Aah% "BHf`tz3Bp~CU |:Gm}֧A J+^gf̗(w7Ϟ,h%HA90$R fER1V1Wh]SsE:GSz7"EM .ɵdl;b4 B`!3u0t[WԶ"fD_\Z7^0)I!DbPHa˒{8HL֕YrGfCcxjDkQхCi+ZQU@FrHYst7yg5(-vyגV8ꊺg HNDzEɓ+^q|GVOP*#/MU5D/y"p dHi9GWWlA .'O(h-؈2$iȉn;OWGGTU}ߓRꊣ3#!#ZWS 伷TeYPJ"ef6`ԋ+-#ԉs> ~r)#C_96s]_7) M!k@_,0h?u##H|,E*2bZV31ǒ{)e'ՔS{J%ƌw%ZC΋VYRW 2nzA4:|O),FBK3%V>۽86n>u oS[gOGIr8X3vai-QSɦY킡3;'7 cL$36MC;b6]#pvz;ҁ mwE eCN=͆7IDI:Ԉ<sq^ɲ4) \jl%1|R\NFkl&JXU 0S{Kp;$E "EGhݰ3[u,NF>;W| Oz|֐tgЎ.bVy|skmbͪY_?CLW8ޙK _<| !$"Bʞ>yw ރfie%%H+aQŵ9\<(d HvW/?ڈ@3[Shy7bD 1N U@^mGtey|(QϖmfAҔd eZMڊav+t9<@YR%{8_М#U-ѪFʪP\]\r\AH1}KFt9=?GJ]cFJC `B$bըF"H!c.ǘ!ⴒefL,Vļ/,Ͻg)O o'r E57.37{I!ᓟCi 4/Xe-X҄Kj"Q$R"HE˓!0bmہwhw55Q"4J)9gZr&K;߹֏NԖgB6,,|\⣤:P@-} =5Vy3}YW/|C[CUW,W|~s8kׄhZsqq6|T8)qq mj[ڪj̛c,PUt]GۏJcL"|qr2`k]82(,ĵES# ǚL׏TuYގeklE]7ϼ%A^qY/zH<~)NRWϯh΃C"FC.;G_D9UFh鎪>AsbLW/kΟ_' k (v=o_o%e;M@9FQ8WJd.+" c>|س>qt|+Ib JgF>lKPФ$'bDꀭJwܻfY@UՅ/IzD[aaX dbyȱ&YRH^ Q)/TS{Lӑ󆪉|@%ޑŠ6TZF|&- 9AjJB ?5 QYH۞)d%Ik"#9C,}UD^KS~ ǀ1!>c>וoL>-7_e[ e3QNS@F4u]BBkW ckm[1e i M!ɩ1GȌpߦF?ཿ*!' m4)jJ"-|xޱX xQY;o:ʼy7 D=>giN-Vw|'9=ȵ`]/xK>zO05m8*2ː+^0y *vssrX#e`~xV-%)U4Ha3( )T*P/z!B(Z 9 !4qH1k*^(ZC0,NQ%wL&¯A *22#g:7S7#t-x)׻E!E|H㴜D}]{ZpRxiy_()7;o<^š #CcF%vQQK }I%@1e`J>AՌm%&G߷,ךY}fcxQ1)zT%|LP- A&_E?h?Q,1jm_]PZCXjJ%bHS(r65ZZ !V0^:d׸{ ~]w\[wŜ? db{y'_GkGK6+ IxQ`&H%m[wg(H&M<3a,taC"\knSD1f3)iŜ->)yP$QNJg'=. dړ}B%gRLx:l.UEJ^}>=kyS[Q}Gro,F=& ZErPXI6,vSRf?GG/ٟ)Rhgwxd}gjehf%T{lV_1V)InJkuh]SՖqlA8r*@cJ3%#gI|aw5vd;2qv\%OA+bFFRTD/Iik|hՑE9EejEsG΁4 ?!TS nA{>M E&3b$ "@L)fz]+2=\)<9!bDO~j⹤P~ʉvjTJ 焜t"po{_>eJ_(;1M?v%.^Mq.( ~{d!:U񉽒E;۾+kRa!T{_6LR&}RR,gFi PX=jw@ ~Ni{OoB"x/8*VZSES:Gm}֧E`&OfYaeFKw1ptR=_X&RHX 3Fs+"G>pE)ܹǷos&}#k,s8fY?_1_G/`=].b1R.*G>hCΙP+]cqr)+8ԁ! ibS$9__p9yC@kс'O:6GHq@S|HvF7~D,CjH!ׁqT40KR a -M lW3z#0uM#9BFVg%qV ! W=՞zvk+VBJSG>6}#-)7ߣ6~A@Q5kk1}OA_;ECYQL8c+Qh=YR_FH#1 ŗ$ )C I \^HhwE"JVxWaėA>r8?S&'15ɿ^ Q{X"+LE *#@B(I :2%1"3 "($_E$D+N2 ur2 ul/RCz^Z a+) qs>DN3ɼ_A?_̧=E$^Yog?|޹V >nc)'r+]9ykD!rD)WpxeĘ3^c)q r靲 :qnRr\8I5ZCռYm}/!ۉ]䍋qр~?kw_-m}rݽwܿ 60Vs‹m˃z1-*s@,Bu 'w]YvǚW^û߶8/s3uևQ5x]{A[.NŮ;b }$Eq` ~@hzFp|ծ$}/x֒"s#1"j3Yy'#HMJlQٙ\]DtIWeY\||X] 9g`w4Z~4\|6qx+tl* p44'?&KCM1ϞSêZ hZd41 L-/P6i! ѺFɪŎA#'%g;8%%io16eQj߭yY2~|UV"r2 Cq<+\\-k>$-=c?yד3v7fEljN3r ]ʩrLEr'w95ezT؏>6A;GH%d+U*EV{4*!ꐢBʌ yGvvqLUx{,%cNg7fdߣ-j(Y ̰Ĉ$5~mFppw` \-8pIӓЌџuk5ݢ⃷+=729gĴr:n25/]`vl뮀H˾'NoG HNr IDATtŢNJP Fab Ċ22_D1^}Up̻iۉHϜ|b 0/QDnO=g?a=CSܿŇ>"1c_!=.lvbc$)X18wxq^kjy#0&AN! Q.ZB(x &rvmH+R ALhRCef}왭vIn5D$d^y%_`%PrMs|'(&2O@.X(l0i|~rʟ0m wLE`HYDVfHz&zrRE,Ip!/n$9ռŇqMhfcEї5B)+9̖{ImE"N"="b-Y£I95~tz1L#{AEeeH뗎͗@l=KC IVa-cPqčcq31%RN9d6[2 #gmQ-.yf d6]!e"M֓ӪB"E&U眙ի~%Z'Ο >j!R(㉡P);$ Nujwsz9wfw~4.w;`?n:-P,!12k* yH!嚄fwѲ>,gaww?-5kv Y^\?ǗsbB5_Q6->OKK1Cć5K'X`;YT$XL.4%A4P j*̄=7 x?b6oAfCrh+Y#<"DH%֊gR:xW۸1|w ͽ׶H#OOdʢT#+-$uq^\1 @N.^> ß!ȴ.a=cpvĒEgb#౳vd'23N v[gv8ۢĂ$iM]ϰ&jr`u;2K#RH1gێ<ܤpf u=MދU!CHѦX(́Q(Addp1)AgZN{ɱ[T8Udq-X4M@WL3!MYMPR`&F 7\JyV\4iW4M /USx!WR+$!فSk_i˴*!}?E޿ŴE$pO"zGkNW]J*?t=i/G i#9{ɬOhv TF K1}ppY kF J=n+]'TR! %9^@~~aU|Cv3>`9gOS/ 0_b+IrǝochZTTY(S1fB HE8im,Ov2y҂-PB'ڈjr)cg!!!B&9Ms8!Dk1Los6n|ET+ċSX4M징,@[=UUSk$R*Ic1%Jnyה-G\0.i*+TX]J&jCY0jK~9B\/TyQFsœ焾AH cН1U:*PuW?I I qT=%9ܼt<܂ۺO[ [?U7qy))aigrO;iDcht+aذ.8ַ>K_~ϽoX}O{n6TX8,W3-MRFR ߼bdGGrVcM$H? XND<@JFx&Fs|mw3)S  Cr|c& 1"#MZhP0W3 DHK,V\\qMtH)V6+ԊG ,PS ⇏LhGaf Z:xzZYN:HJIr絖gƐxo\Y^bw6GLY&zE>DMZIe}in33"3T\P(`yf<_c{`(%TUI)2u=n=87"# %I|={[,Kbv KeFg#%9P{$@5hZaDP&g0G JRPC)MAF QRs6G rΌ3 ]-FjPfzjq׫W#sbTaڲ||HWK,Wc2a0JCmpM"!$vpBA)䚎L* 5r,臗 &P>G&S!c{U=WoPpMU-!L"7-$`nt"3q{U([H95GߵC ~y[_-{VfU%Th5ތ@L!/]ẅ́ a1"FT)d)EOFxw~q !ЍT͊PF{Ubus|~59{QI)\;plL#)X7FR I!0"U8;IcA?5Ss1|UG00 a&u$%E58prMn9AJX3hɂ\7#Jz)J1pfZޠ+PfAmcaj| MQ(EH#iL5W_,PlZ|uوuWMPѭ eif~7l8#~8}ԓgڇLR,B& ѓANO~^^[J$x15fLM9T _ NL 2ҵ$U1Pұ9꺦@/0ճJG68dt*R "YKFb(}lcsuRj*.9T% }90FS U.~j0Y)sgLcy1lNA<9lZf尛h:Ri3"O"% D*1$X0&FO!%Jsa1}[}AV2olkPZwo>p9c2RzBxݖ*ЦPGG3Go4(j G#%b@zsQ3l,|l5#>dU.2#wCQt!C&D1V[Ȋ&ZF)Ňڱvܬwt'{ Ґ$œ`BE$ ȱ$I)O_[>ggJGg:{JиږݘIc}p%Kz뉢"Wԋz޴#J ہ¿o{Xkbm`aӭP ?]$NH:.Լz P:w v_wɜʼng=C'HJ|ēϩ&@L9: H%L֚R^'"hAy/ yJJoBłb=&&C/ǰVkxKd9 I@(14HSmhˡtB:qb<;iq3ؤR"kDm3yG=՗䇌ZU˞//αq.K6a8`~θ7;9 bFMHHb@15yTunօ!A+GYuX%RwCmMUEaPŴۙJtYbc+9hb*1S&LN) RerI$RL?ن_v} TnCS#73wsZԁ+(Y~Z2=NDL 3 ^PR hU0 1 Dh\D Q<)Mp&ӎGt e ?T/׃@S-lE1 z"%-ؤcꊮpF9MhE]᜛BjjjCVF )yd$ÐD]i" A_7;;yMF Hll7#Ͳ2~80hL>r`áTh+3ǒGW$*[v3㈢&kH|N5)3X(B"H!2!4Gx(hr䎒%Fk!)-FI叟B2:M@%wH◬z3on[j?$cmX‡/ٿ!*Ĵ:J047/oᔔe{pp!4^dqVЮCk[va@1| iuMJiZ8Z0^/nbdX^^c$lfVQ7#Ù 8YdPoۻ&kN{"gL[JXY9Q䘐bU S;@Hjڥ -uL;N*$I2#D&gW$1d1RPb>s ácV9n0}@+UxYǞq!wd[*gf/ qe4xfUͽ E 6!GdG*Ӊb>XT TX7 ~: _?&nIRg4-y's;NfIQ0)l*@)v^2dlc-ckDP;uaouon[wzwߏvv>~'<84(Ff @7g;j稴=wW +`j8r* ZDNhL adBNĔpm ~*xV҂ }!l)&БFiabñ,$ 6/UgP׎WhSp J}\t!k鏿i}ݎ;̇"ga6 %d՗?G RX2=FQ㎦qH:HѤ 5 u9=bUo©FO6+Y=-J @]`T8=%,W-RJTh% |`p%kj)o )8SaZ4Džȴ;K8C0 ybχ( MhTK=Tl=]GkI*5ўfr>?a5Uꔶzċ/·|ϟ?e#19Qrg9eln774RR(A۶|Ń)FiUKO" w0LL bL! YF)<&$(@jmC5_OQ*!䤐B (GOhf`۫Szk/"Mo41~voٟd'#u |s4)!A>L)_We|Nm$I3P 0H] I?ȶ,5)q#9#*GJ&g J*<"KJIhSMPQSmz3dHWa>ӶseJd`rH9-RSx@ 9q㕢3+8;YNDK@RS! Y f~)rzhkq|<6s$fUEU945a9U@ ȓ5Kk3vĦ4r~2c8YY5 ;?]r hYxZИwݱdǁ8KFjˉ;C4cV֖3N9K[S)CkQ F+Zx"P2Rrh%ߔOYL-uA;7$/\ר!2f$5fj#EL(N%EJ^P"1;zW9OYխo=_?~ϾGOL)4Tnzl3!\FI{k*t}JWd O~8|@Vp\05q4J8(;JD<1c&e5zZ14bq#E䲟OO{bM1ǔH-f &9M[K[Lǣgqz&InG t3ٯt䉔"v4H4Ըyϣwߓ:q {T H!>u'7[s5fcC,K1o)M^몪膁~lBSFb(!Z!D># HP@3(T`4)&֣Vؓde,M"tMݒő$GY-g @[Tjڍo\Rn#%&w[Tk0J␸ *S]@3ц( !Fzw,Ɍ~SY'g OÝ7k~󟒷{^/ityB]S '5531FqXj!8j$E#>NaPBfSXNͷ|86CGԵCcIT.6 IDAT$ݎi*IiT;C 9Kș"I#4%9PԵ!f}x) _2EnۤAVzN1/l3#db!݀5hT {#)OW 67d!i놫9vôZW]alfSUY@!e*)STBq"J6Do PՖ~F|8QzڵQˬt$ybbD>LJ Dtm)$,JiR p3#Gĵ;J7º$9}! օ,_|<%'Ĉ͂A,<.{36(cafرl(>cX Gc,֐TX\G*'ce8c74>#t!b"HS[GHyȤIQ5ԕ'^RPS=#oسVm Xoǃ^ ͓F"D?ǂ,*K?߳o-Z:?u_"s>Y]C%,STdcrF )c`#q-)N6\)hN k MĘ_ !菡diF䒱䷝±ic@)A=zGI8˄ddVh}>uY֚,,aG|i%M%E{]SĎиk4!\i<GʂRuJQUմ wuuک4 k*pVaryѲЦ݆\y3wB(2\X=Q>Pp_pHs! MsdǿӜS[|saDںjP$9ƂռsdݲnC#9&)sXs=:lt̓_#$ >^V݁9Nfw<}%7 XV팺mGKUh,1dR䢸f&iP3Vif^5ԕ%¦r78RZ;م3$B }DK-m~]X3=r&L!"8R4G1E$`8tO_FiZ+%Q~cvXU X4BXEf\ݞV떦6(sc«)Xc+GݞLa9ҡPSU"c ) VU#Hn;b) dON )5l#/Ni%0&\5Y6Cy\fhՎ{;MR2h1n"H3GrIBE\<9*7~by'aV!! W[b9s2X3Oq ClMu'W2ω1S>c}YHNO- Wx1򜘶裯IR c Xs#ȿ5]w#w?zēѳwV6c_ݟOO$8Rif{CS||uA@l5 -}*m*|lv{6-e,d' 3U|FϢ0Hd%Quav ݳs>x׻S2 (s'K0}ߑ$8ci3f%kp\N+v2294ft-ִeJCB6=|V.iP*"Ո2 S%>䱙5bD۩/Xw/q̂dS.AV-ox] eGn=Xvڥ/0@2= 'O59Wl V#|g %j?= /.tE95Ý+R s-'R#5Ϲy.=?~EYvԧwffIKg/MQeaӧlݎ@F /mSG6'͋ )]o둹Apf?|tR;~0xfVSaL411;j%eNd!S(%Rd~1%(#j%I^zf "\:Ն%D!@%JI"30Ƃ\=w6H"fhO| ސ@MA~BТ2LhS^L[T<_yIwo=m [}Kǂ-a(%QU33'j5Û["*خ7$9䑔<iG*SM%Qݭ7+ͩڀсw?t,Nw<΄|)'+(n \T.3l.am9UDoI2t0* Ux)(ɢtc]i a06\D+)3 :,5'lwkN5<~L拏kxf~j6w/ɴс\)a K>ɆN0ӊ./FMDyp8/GJvXDX-,pYӞw~3G5sE#fϿxx{;'wP!SHrm9#86H@vqyu zOn"s0|z$ )%$nOjlnYWx)iD1o8S1t#)tLTLOC\/UYÃ;wY89?#{fQ7^U7>r8 ;w0_Je-l]|8n$av#K6/0 Ԕ%7ȥ%-%W5c/1rTkr\Bon[[*Q9:3[uͪiwwP由?$~GJI{͌>S9Rzdf3(cp֒JH~=LJ)ə,mjG8댱_ji7`P M]H13$c^l/k@&'y,(*7;7yR?%-s|AKzI {q4uM Y~=lENа%2wK#ID=1tǁ;]BT'aV_py Qpö1=wԻa# >^\=g3 G'<]:^Xp'\nXw{n#Gʚ}٦!r=^(ViqG +Ws֯V0R%F'8֍Ěnj`+b?G IUrRo8VM [}Ke IaزDRjV{g}֚H)Y[?z?8٫\o!1b+kU/t"Bk}?y )3FOpBWJ b9w $ M-mR%@<(h[/QDtII6\ ~jw EĢqgQcw?x$9wØ v3 jm_b,Nu'w?q~/|g?O"}Ç|Ү"twꄓUEkm5;ѣWkC;qqa2aˌu^=$ e;'vϰ춙5?W߫|$?~b4 J)rnúOI1rr:}f~, G{&-iۖ˗=޹Q,d5a1ZRMHy>NN93]w@;KF4}৖>x2$gnWݞzq(B4 T% q׼b5)j7"PdVHaJIЭn[AVJfTFY{lFIlFu4M~ʗ_bbÇDǼn>CZى%Nv!\^CuD.! |a-D.-k'*Rవ,YʆDej5#PL䌪!&"U9[7[8D愤`Tb9r9儍Պfή E@ZB-EI $)E8Hݕ&E"ƂquJªRatGL5zJJDQa4hvխ!tNխ*1ED,|%#_=rrDJPJ`f߲^O;%Ei#wBx/11'6x@4(2K)ǶVЁ,"E2Ix k0{R)+q7QCѸưiYu6~Ŗ9MŮxQ#ԣ&肴b8rvëJ 2Gw+f ǏơIsw`d\2Vc+X9s Wn72k+3QhjsaϳC@ٌPkKTBYͣ'1̗׸l r]b(UOx+$qtqO KNH)J (E\0Zꈛ{'rؑ  m<^펨VշT"OeJB$OUÁ/>z݇HB(I#bXPRz/JPRXTuBR5-#qdDJ4̗#VbjtL!Fɘפh3(9ٍvļ㰓 l^#5%)*7K@$ "9JjmXA> 䢐HTQ@]iypƉt0԰Z<@.|Wv K^>95-]7ǁ>"tR@^jlzAWO.ƚOl5Ac&y."K;vy]1;u\^_s؏&58K=.^\Rt*5~CO˿O蟭y%ꥠ#Xanǐ#H3>`?0H,pg ڡ')Þ;\OSg阃鄭x6}֬1UFJ. ƴpg|12$5\2 VK푤J"] S: ĩؚ%I}A־yInE v ޥ+\gdcE7鄃ɂ3 K~ ԰$2&iŬkqB sΝ;Z 1kb:LN4HXq1u.tX/ XFyYuDbgGghC![-&NwHPr 8Μ׊&1U% Kb-rnH}-C!#vzr1e'>_d  ._=>%3 s, rD9Eh΂`97R2&dD<8:eRt4C>34ak+cZ5s>^%^|ዼ>p3_6P3u<}qlE59Ǟa?>ScM IDAThQ3zqBi:)4 \W*)5\9dxNDlRHiE;tIӖT0.Z&%qweoO9{6Bg3ΟŌGe@N##Z]s_>t2s^~>.>2x {쏷ʇO(˒Ӳ[rwJlf\:K%|[^=|l5Õyby+DDF95AJ#CONs,E8NwcjjI&;U' nƚLhE~E:1ARU˶b Z~ Jb]F3x6M8L&$QٔʴeU2W>ÓF{;9Z,*rxh;C08!UqF_ N#DZ8qѵB,S7ڇ W^bX^eK6aÆ 6+qÆw)*^Bby =x_M{tٱ8&Lқ׹#7o\'<}LtX zK۶tAJGB>C ZUuX#LN%9ӘŤy4aF8-^XӶq\'T;=^}vհg\ص'_&{.=E_T1|6Dպ=iJl#2O59*+t69jƢnQDvBt"׮]floBJI(d6~- [j8YHS5t p;Tʲhkdv3~1:V42Pl!Dj5 JkXaE@k,]ӱXwgZCVs]X2\0ԥ$5BZ{%Yh$Tefa ]lwC4 _#l RRH,3WcU 97Ԉߊxcgṯ> os}udEy`3M[$-*"c2:Y#c=A4EJIXkB<(B$nN9M`w,˰^@wmG'ՂQ-/=}3}4tėb([fH)IW(M,", 0ݒ؀<5ilA#/gΒ&%>09ZI1>4{˦"i528(V+b{ 1=fo0Hs,٣%("lcfZe){$f21H)6P-*\g |hy >ĸ::&KS9*(S)(hQtMIh]Ǫ5+&Ւ1֡P;ȳ0 iimGk< ζ" I"Cf|7SIu4h0KA^$|x6ř׹ يVn t`(8 Gl8Tu屶CG" 6Fo.EKKk= "C'5KUPK8s"\m >ĝws|DQĹg3_ι12Qv ʹ,hT EQZCY5(gq۝s.Ck4 c"ĒCNb~ͷڶеYu*sS_'RMb|1n1(J(joH{#!>bY,ЇS|;w[Qu_hhKwmZU ^!l -q7F?v> 3R(h,v3mUo/s2?" U[22EKB!c*(?g.|۷o{G|+1k5@!HbִY֚(%Ƭ[j֚Z1Sw8(I]2GU,Zjlpܺq:xo]wڶA"$*C)b&.8sĉm"XJ&R/J8FQ37?ZXNSBp4Ms(*hjײ!aW!aûEdd"x+,6t6ޱ"#ۚ{7IM?9;ڦы#mEI !aHQ(\۬E1V:uAFԗR|AT1?Ω(ikNگ N#BDm=zoYri(c1oH ZڬxdBIE&Cbs/oέ%[ |ޥĺ-/]{)^x,y'̫%Y>RCv,P%ynĥ{~|7"edÇ@U ''%;Hyl)Qd {WH.nisz.~^mZ8)gGܸdoo!o{_ 4[YZ?'!3:$BED1+{F{g,gN4AXAkI!$ԡG-d~%h#4Eu~IRB'xDT]Wf:l`Mh@hvslLR( Jx_a ,&g׭3dIJxwnmlذ ޥHJ+eiR4D.$/q٭NstX3KRO]}(Ve7 Rp64dU &u}ۮ UVꑨ(] CB!B{;T>JI%R( |XϼΑ$Δy񾧶yg9ZXX_35´t~E)Ig ٜ~oWJ' -$||˕|^g*;|_C ͰGƋꋏ3x%0HlWqRQV\EfP+z /*E`QtSP!%'G WńXzc/V Bk]TچhHvQeY0=X_fph3!&DJ1X*XU!X.W8cUUX;puW5E1`-imz!8ZD]GئcQVH!c 6 -{K|uuKo(Q/XW+C)w8 = 6l RR@0}D}ǽBG-|? hlӶz!f~zJT8#xG^)E$dyNլm:C62DJ:3!p6]=R{} ZWc%v ٛ =tD?.`H\5#v@(0O4Aib#_S:yA-L_>~K|ӧ| ޷K::GJG~P7I< {ot,^AJMmtCQ 80ڒ<s[Q`t |G]9S⸇GHxx;ȠdR`k"z5޺a{߰=u5M\EE+su._ 9~ \r|zDI<r~S^# -Q#-Z!`N+Px`e9e\e9,!Ӳ+FB-%=:$EC_FKW8~x$:F%KŜfZ3!YRd(rU$ Y,R0HA*+D$ʓ%)YEzK'Q(Z&΁<~|5~xs_;Suќe͕~"2 BZqy煗d{o.[$tw_%ce+V6 CJt"٢H9<ӕgClHWWDJ%ѐa>lW1=:@?MmԳDU@7$d45Y2]PDjS Ÿ]'B(BrE0@,y㹇'.^,fX-_㓟xyN7ѻ /^q7Ә+Pի~݂\'d\Ck~2pQV8ӑ1Gp~:br친S+,TZs^Ak[n!V3t:"h7]Kf=8DŽ` !}*ģ?vOhk WD&F̦,'-HB G+s  l Q8)2iJ!NJNs|g9=y1%?q.jĭPᬢY,sq412[{):H١DTpNFuu^%IՐlH=>BzR/xXDZ\ڋ?am8y6"BQMc;&sTU"eG#l_w|NOYV*iNZ74uG 5JtDm3e]r;dV ZbOoGvk0yLd]:U8˧pgucyv-R1OpuMW 74?? w.pN Uٜ?{Ŝ?}qB1t\vrbQdzzDW?~" OWLth!"\'i)>'{ ]Bq8K/}ĪXa5QӖK#DHNXI!"("cfrm)q2֮ ]4k4@ɈfND.8CS 8`m~Æ!a{#0(l(5$j)_eÂ={ܽB bdA eÃS=X"Ysk$,q$!T%qPQG9^OQ,K(3wvHtlw޿]O݌BK%O 2!Rn :Д',NN] d(F/fHS"Gn9],XV aT.Cymo)Gk,tAΉRC)\+42OQ=E&tJdl|Gϒ}VSp+ Zz Y]@ Ÿ+8y 剧boQ&|iÇw/V̎Z8*,e6G؀|@#fk%I0HJBdTJ,W+lS7tNgk41[8EY ڵ{4M}Q]\_QNޡiĊXYMA[\Z:St)%tXu{W I6Gq, D㫊.ʒ'.wd*1C˃c*6 s IDAT^X'$ kZH-SƂW <]Dqw?n҆4tTu ,C^_d%?(+Bm[.ET(x|w=2\} ,vQȚ8ж> D=[tl i/eV$1Ѱ cL]R=zi{䴾t:Ox.'fdQwb|RMC%Ŕ:OW n___>6"ܿcY? imDRw46!Dw_O|H$EF}yq{`(aq~IH.?~3" "K@5w?)D~F!4ؘ2ThAK,B/‹ w4F!pc9p˯ri)z=誜^ꜺYDZcZZRǶ!#ˬ,+0IG[^S4qcH_hJ+E21*u`ki\X!3\3?%fA׵("h[F1$8V  :w)whlذ$!a>kv\X(GWG(LR҆NRChu@Z6F wZvf ك_9 X>n`MܻcٻZa+HeH`p֮!Ҥ)HKpZQ=-@, q΢-Bm*КH]DN%#H4nߜvIS@v0:C AmL"%%=>7y 㭯~~/dpڊ?{P T^@9*}O#Oxs+f3sq6\t`@5 #ޡd<CkV>дiCF %8!3m:&h-/ b7^-)=&Yak0;2"@-:y@{b&^-8F 3Gx4>wÆ l c[(kYq <P{uć9F$4 V"zDYl?PpCX_2ƔSǤq524SAkK%ާ趠93 (W5Ig8]'zIe뛌z(Cxk8O`O[Ͻߏ4ͨ<ϩ%gYO8{Kehk$Bm-%\-i!rDK%.x m 97uh/X/N'}(kT[LEJ_`:HJ6_뙉6"@Hb·(A>{owjy+A:.OsE6b!aY?)Gt]C,5] 0<|p%l3ƶTޠ c ABr8K5*]geRd-5R-lDY06ȨP0Qso*ˬOOٮҞ!uRlrB(oaB߶>\n,jqgK'nVEz.m~{0 7HChC!'#?`[ ݄ D{>~&dg{P+63alzEW$vK>H1 ;ĔQS[WnwN,OA"!H6!pSN `yU ={EpJ"+m )Ji ^{5g/|"Rz:)B  V=O O _]q~瘶#uLQXQ>G[_ruLq7Yu+tQ%M)@HUAUJtR3+\{E#'"Y^ |*~G,UUaLAִ[L-h AsH|m JO+LDiΆj%I (M9An-ǯ"tha422K9TŬrnA)ɔ,9<~Tݟ.ykso-^wG~5cz9_Ӣa{1?cz6철xƹ>#ZҦS;3ޣ/)LFTH 3]S.G|/1*S aG&OY\6s$g=9&dyQ zKV'2a&zi ڮ EQx2 e-<`Y1W[CD H~(IaKgA{)KYb1fvk2P&2rqyN>Zg UU1|\Bg(QHyxq4S,E`:Θp |sЊA3:v:/|&=įH61+jT÷,f' /DJ!Fa7acJ4[RjEqEfA"{Fd tAV,.rdz$8qZ+PG)EY<5[2{GugAÇ{&)@q5 2|7WR]֠ uqB#+FyOՏv;B| IVSLe u!h\QPik-&)|1\Frrsݖ~fnizU7Ѷ=mZQ)9wPu5%Wmrx2g7D/v˸{7p.]tT{w}e&GcuS2'}~d!!h!%2?̯Pݦ [6 .<;`{dfLmzl(1d‡9ԜG\9<@I&eQRKqDI[=*k ? @*&`ʖI齌:im o:={~E=_$_?" ')H!6U=> -D zhхDFTNn Хdh$ (W1E%&$$ZHQ9B=硬 IYDRw&t-?97L|"ѻ%$sk9)AѬAJAԆgYHQF'R}cεHP~Ž;l&vAȰnpQI*)q2¥DIA-Wx Ю7LGlV[qR%ׯh;I"Caj [B >ܘwߖ\{PүQ7ŸƵ=MeB>@={>+={>)%dM. Zc2jaʎ(j .bw@Vxh9(ʒ#EڢTRT(Y& lEg !͆0HA9 B(/!^w|@M*'qjk$ZSI m۠]\J,( (4emېJMJP-˦a𥯼h@ul66MMӝ}֋+nM7^ ڮ])rE%ff,E"f̳c>?gor~1e<#޻^&?W`)&8OSqB5bʐBEB={k[wj7(os4IiŠvtbLzdT*b;) UdqڐbueT[}v/~IUUܺݚ~u D"go{!gϞO"!#z;؋7paMqp:iN tQbLkD{&[ grlAlFl)ca#Đ!%) 61DHBwh\"A]/DO д OeC5yTL"qyRLiRE qM9z6Xbi?˂Z&l˂Fkb\u5ffq6 <.8k|vrVk;?eʜòovGgw7bm1-!U!шivVD? %s0y" \]:\Ě iج4WBF nhz"Z V2)+F޳nhe̘4oiVZarkq~YYP6WV.*UN,а rY@Rc kSś[޸bO (8.ow~Ś;x*?܏qR F;m!=SEX''FȌ ^K[ۜ.X]jR4#OEB'SM LHl llJv{ `/AWޥcLJ*ϐ<3Tg aIZSUS$Rrp+'B3|!1{4e}ޓڎrPYI&Hp!>Ԏ ГzLugޞP<&!^!CkT#l.8LY BiMV UЋH y Ɉ!ˣm N$-6maVt] ii~11)+]y[azOZ%LzŽ|i";_⅗ ~zk_3S3\ }uXӲ^1 `$JY`7tjWRO{)b FqO.˖I>{ݥYyI)=9yS;z@ϸԔl@aqoCL Cv ڭqT`YH"7O) 1E9i ۦzG5*-ѓ9VDJ4hki5rГ II\Qw-V&R4v0xo!}w=嚨%RkR<&ݴ$f>E,zFݚQYG+ړ1^1dZSf= QR7WBh~. &% FBs<$7[ 9og蓞q\}5~~R"$K[G{l%1 57vD"hQ5=R?Y@C UVt[4A:!]`/)Q }H遄L(&8{ Js-a~\nj"g>ⲥ@H˨:!+B"C[VmGQ&*tau.tC7DP!A$4 +B0 -eEά]̮ 2d!#T\L fԃCtg qcd7d2(dnpR\+2e\9F:c770fto%&KO,*G)T(@ EJT-KUwEo~zd9&r%Ix9OOfMH)&פnčga[KR (X\9(+xjج k$Wsm ׄ8,<3?Lfӂ- {y={>"&g-0,K` 1@Ch x͆;3nL؜wc:3MM:̐ KYx,:Y{ e 2XK#@f-\ 2Z1Aqu@:~#gAwZC̈́\ |-yG*N^T@J'vyŹ<"w`ѺHz[nzZ#˒e1:"y\<\2 }΂ (*UB$QBl=g<s[Fhrbz@ F 6 "Ï{6|O|_lj|P "n @R +z;ćFE4b5"T`tذYK{\z2V E-1rRrv_g~_ ={<A;-Mq 1Ct1R!'@Ô]%Y-i xI5&Q6p!xi“C˂G_bvpVjHDbXѦ$ KV  2q;oXa/^eaP ?:ъr% KQ2 .3&ODnZ1zH(/Q3/+CiMQPLR HQ%ÃQ^p0pWk5w,g{r=* !! 1u5@]zߛqp.7^91ALw@J2Z*ti!@1JqõŃ m$v!W,H)cy&Cz|bIڋ={~ ={<rf1D,˰֑kEUMRغH>B$׆,j|f"%AVN*6Ǭ=*ewe 59MHFV. n~ڭmsnjQU/]Gq2$x8:L:.ԛ0ԚLi9Y>ORbR"OqH{i2DTIp&Y̲Q>2|u=A5P3GG"o?[߹d12T #Ā b;bM"Ifrd4)Kãی"2?gvm6+ 1ˈB p I$TV"L/p>1$;_@׍UٰX_JSB(Co{ ={<23"%Zsb:Sb:'gq]" A?*E5ɌnKz)m$Rn8z!sV&K0HQc3>]d=4b)%btͦZ8k,QIC(GL-wREV[=yQyu=2Ȩ*R,zH4B+2h)zGf4G/Q*ҖVĒMDW؊kx{Ͷ`$]pc>DJ EVr,Ӹg8O$cM GFdg5;hU Q6(}DxH3BqšŇzH۳\PQ$: ĸ% R8$|f={|6 ={<9!^U9/IIPSEAa :kٮ8֢u OqHH=dLc(- 3VF(#& gX%\3>\RMkd:'=fǟcy64 94'Eb0ò/k^ٳ繠B y%wAiGlġ!@ hOu t"E¶))zJ8&GL[,'1BX|d B{!gϞObWJ">C<(K!P`m (mL$ EaPa|k\*k[3J@Ah1˜ <פJ{ bt"Ō`{LK 8.~$CffRA1i-Z :*3F(IRPVcRvap<{"xȔǢ܍HX !hWd=e2hu z7*2jxBT )}sb>d}"d2Hӂ.߷d"njO. ~0hx% 넨-[NShw@7f}`y!z~8lnR-&[LUNqR!m;JovJ wY yUhc Hb?'g$yHR\]E#9VxdA{Wyq:ϊ)z*]Is DN m%=*S}rPmul bFjfrM,״՚󇅘:rl6riZnd cH i 1 us A&#@C~wWw88=c)QB")44׌64{jy}q-߀6P/쟞u{Fbat61hlY,g+ڕYoS!d`}v.s_Oz-h[,-%m^ ۖPOl [(E"hۢC e) o'̛+>Jݟ ~_nnl)ƀul)VL4P|S?]E2qJ hUt( Pl6$ z*ţ@F ")D)s7 Jv,)`L!-dtҠ"V1LK#RȔjrudbvĜqGOǂ R"JSԯۖ5ʞROl99+,Wp}l;vzT·-$'BOJU9d씞քQFL. aY{6"Z#EpPבz+v75UwzJ\`lUSO pN[Eq_#?331 w|E_btfj XId2L9ONw!6*(r I(A#$/Dp&aL5+*[#%8>z{n< ~-}F`(}ZVrq5S|Wߢ#)DJ) t@e]QE㌡Z*rΌCdƑJMZ+dI&PJbZP4H!G-\j!|@pԲ:;3+FȹE1۠_{v9|`9\<>ݥ0cۜ„)S.BɆ'gxD' DEޠ! KQdHa#xA?ZqmxY!h!Fez:(F.ḊK}νEⳑ!򄳳!Fn 9Rı%h[ǰ-Jy0ZѴTDTVaT ð;!H߲tAIj2UeX.ZJ#U>ox̱N0n -}"eu[7̼B~;/HeCL.2r)C͡_(Vs,OdPJԲQ(s Ds{Rsc ]a%&"Xg1R Zhc]I:Z²6CƵg4OmM1hSٚP5-Rxx,zMk(9g6(8FiVFơ9J=WtYsjp/_AգEќ5K6;1 .}qu^0 ^_X[)( __F,5t,܏H]EQPLɣHUs% !z[d-X}`QZ䫀55.*G-_9gֱ~H[T1椽~F@r,$%4H;)JQrN<'Uf!?33ZhV%y~?>Zb("I))h1Tf 7^M7~dPg*rId:hL,X!erQ`&Hȁ4 8fb IDAT%I4+%&D.[F7x uK(~S2m/CƓ1reyEK;vہ]apb %@L"%!BHY-!Q@REfJ]9CnSy"/,T^atz`y*( [J)5uG䤸~ڲA*(*svsg2  |/#k=:GŽH2\-PFTfɊdr9̿24=>333 D=Jפc ?zO~Dl$VTTy 4HH1SPnXWLӶH:2IE!Fkj8=d˺^4zx#!./|擳 iFy)C.HB[."!O=!ʊDbG5Q X!^IUơeME ңb 8bXZbTptZQ' G3&& ~R&a=mq8{or]o7 1f*"BM=8a K1#Y bW<{`5ÍGb OTggohk"`OwPG!O;`Ƞ(?Sb~f槙k!H%b|}nt{DQk+=1FRwZob&8Gݶ,ۚY0VfMRAkK+B QRӠczT4UE44҅R%2]ykv {.h0P9׵"AL7_G> uίX|U7Rj, ÞBq2`*H-I,g2M'ed0!+R4@w (ug:UEw>id|fzc[p ~Ԍ}$gŢ )B >7=x9JxѾKJE*͒R(NpO2k9B"^U;UB~ffu(/D8󛟟Lͱ]LARBĉ`%Lv~)%꺞>})ј"'W,0z~Xd)|?Ž$͢gm'?\PQJM!'˛JAԓmtMN;J)SY&"(49%(ML-5)DL. i &,V+*-ԭB@SW]9}& { RSO-b٭K*Q޵9" M49H5 b$֔Ҳ jRĠH~~N E ZFa;M4~D(]dՅaאL]ntWwC5%뗉m晙B~ffдȕ2 Fܰ,%RƑTurQfkƾC-54P`(CKRZ,)(+8fwc]T-8f< |<7˔a= 1 8"okZ {?XNN￯ QG?|-/cU3HӜdNN\t FDF|U L ?&bnLJ>n!T)MTAiS/rT@%77@^ "셜9Mc%-]%s[YeE(R#ez\Oר)Q =do(CWȈ*/t "d_ B)$0OޔYjff~7fff%'Q0uEA?}PYzђ9wm !0 )M}.k/zs%'ֶŹ)I6Т1ylh)DM]ϗO4_#3aЌH!K@]sBB:>iր">ZS6-℮H>dꏷzr*ZH V\ PՖitNs2#>,ϯmlkj_ײam3"l#$NDM4!O⋥aTu{ZgˁSX@ {+8IjGmN }aְ8}$ރ.B4DbI(R^LYV/R'r(B]~v?#?3B~ffbږ0nW?ď9{qix<"rI۶ CB-ibȔ1ھ>v4UK#JR"U0zR h'50 o'hi)aQbl8Q>[(6jY9n2%eQ S~.,+*t aMFCB4?D,e韐K{ ^_+%wC"" MOA$7#e:4R瞇f6EyŃZ׌׷ FP!,rxMA\ E; )]Eۃ߮}fg3,'Wz?ǗQBh!Vw3}Y2lct j,eO#;#Ĩ5.)t08W`L $E)iLvЬZKMxvurK,ւt5_*V' dۡ=y@ GV?5+jDB^QЕD_0CZ6`#Q"jF47ޡ kv_9Chi7nF=.xh)1|p~~Pl'<] f;,g{{SƹU,!T.8#4dңG5~i9>Y vE~xu|W4!$G<H#6дWI|Zi-?|oH)LZ&)`tRCzqPGkVR1fbHÍ{_Q\<96pu>633oy-ܹqW}=/>.-\-3NNR 2"Sۇ5:V ̋Mir12L-ZB8$G+E"BY Uט0%>E@g *%$4uFOC0>䑛C]w űYpp}QTgP`n32 B &5OAʶSd< g9^i>}/&3@pZO}wi;QǑoi~,{6C4r8\?DqvX԰55Mâd6ɺR @ux3bʈB)O31\pekE^>< D8(?rGGW:__rG+{QVئA)BȗsnTX̶#f{ f1Jɤ0NеE"'ko}4rDj}bW3m&T5v)Ӑk8 Ov]>ra,fG(vl4Itëh_0CR!sJI$^g 9Xb@)yY̼O݂Rю!X?x_}A> e +|E<8%.\1ui)g$3B!dLjҙQA"'K2>yWaЧg9Ä:e:6:#تf&x?LzNV_^B (`P)0`_~U蟯ơBЧuK>:V-2dʕHf!?a33&~Qw=$bju"$?lm#E>Z^(tNcp0֚FU$&E*ɯx$%e{੪O<c|vǃ9?znn"|GBBS{NVvq ǰ)Rn>O4M^E*~0\o_T0,<<$0_ 5"e1G3!Q-UC5$hXUs Jxzo5R\/+zo> 7?v,>L~Lx}7{w62o\yL!PJ@VMR?}gf]b333W֋ršX-] ёǎoQ%*>9Zh؏eU>1 1Fq#dMg[Fqc=z{}EMo%:[_`FYZNNNhAehhm\vh~sv!H!;`ac6"4($WUqpH7Toxr+q B2M7?X= iMuNJJ{m)P 4ul=gV]O_9o|pˮ #-'ⶐ&W#d12K.Ļa/)"!ow)gcz)DbГ;nO|k2z)]/)C$^yx~U'<ސG!%BurU}lх㩈A#b 7ۧ owϊ&D SR?PUd[l]abYku6-MPK~GG\0ƊZTL*!dHq ;9QlŸtTe~Ev{N//NjɨnR!}N_ָB0 R|P6 TP,9D-I>y7):EɊ-5myC5 vGLB9U0*Cӯ@Ie:wxycOQs{jd*=\$+vDdJ 9-K$OX0*㐤 uCQ`}??EdvH=}'0g+rth\cg"|醂=¤UEJZ.5r'v7nJ(:c]"R C ɃUMIÀ'@ D#@AXehEBRt rklXa!.J+ xQv_Pq@|730 7t![˺g7Wγ-9 #d# )N'2X.H_ 0W1#)XsbsP91 (c])-"/€DbXU| Sjuý%TŚ&5TBQY` Ni>Pl1!G=mȱfk-1zq}#t-l;4BISBWI=ٵHflH-}SED1w" I26'[2MT9]Q$=ړdųkimEI}aCז1nq]T-lAOR{ffF7#*5o-v #jA)jVi]182ӛ\dTQh4(JFHup'CŒBz=.o=59sgA7z| R~r\ Án˦iV%k-4T~[qK.]> iVbݳ?dZ|\ȥ"ŁK2`G..q%)TRva /BQAJBX#)c2) T+>3}>-g튪@]ESUp(NNNhSPW $, ˕ETBk&_̼C G333 J)Jr,8{']!UEl4Xq6Q,%uݼtHMi6j`hSPRa"=Z1":Rxͫ󫣊73@& {4øg5a"lw{R1lmn ! @e,UU!JԍFj\բ]"ɖȁ6h V+W+9DDVeaH) Q@+L0qؤ (Q) Ɋg{T-"qdQ7\0J㴡k&DFchZ3)evb~7y#Q 8VB"hxv}uar]Yj\a<(9,%:E.#GcL "m$W),8GP.'#sZqϸ nZ3_q$q{ӡ)I1BɆ,JEjK.(NL2Bw}VR?yyQl3Eq\Ҩ5whGH7Vh*Zhb8VJX5-<vIJ 7IuGk{b* } %!-OaysI-dVA=1d\eSvszzω' ĄkV8zԋZKUMY0 IDAT~Oܒe?s m}o<ӂ]-%'_c!ӧ_C>fUJwHc8X]]!W jm@"$nH %a3F4m„FϳqkkUF? N'<^=x>`7#T(sk(aJs(\zјZFzb7[B<6 A$,<}è Ҵd[q};`—H6at!:b{~^%őBT X5yBiGm+BeH1 W\)w$=~1"TU]}>̩#O` ¾oW_XLڢVj%SrHuȈj(Ru ;~@Uՙ~ٌvs}E(ԴLNjTӂ{ vcza 'U=MMh ;Er~1cB UMb~T9Hl\؊Rܺlj:lV* Zܪ#CjP3,Ytd|7?pѲuv8D%c^W-CGdџ)ނRA6!!A 1YTA J;;/]|'(ARy҂=خ3(9"@4Zhs-){ Ud,7ZjknݥmUnqTwh2,9jjVqI=Mx#AY !"RBRN} 䟚QYrv/cs0V1hq@/aUy,a-:kʲazRBZ,hw!=R*rdQ:D()!__A Jb,(Fpp6#[|/1JkʰN?gZk|hq/o]Gi*B*[ch)F r!{۲{ 2]/.h7u]CZIO׌Eg -JR7egHRC#d(9SH1#ɂ9 9g})wtY!|A7mwKUY}GL2J1hE?,u}h}μXcY,hD+ S*IAӴ Y kK\E !zg&b"%n$!MjhK%pb!hax'8dQ08bk۲9| @99(DXd2!^ ]|@ZURB,2ALFL+`gr\E+|쨦ImzQYX!$r-eߘB 4*CmHZ"fżc4(RG y-IsMJ()mh&%GvɃGV!gVDIGts% Yv}>[QZ 0D>Vt՚RHxˢ}0#%Ep*5(b"F;K3 ’;}`%18$0 .lZQl,.zXIY0@AuWJv lvD[xPVҞcCYf q3%f``ׄA Jk:2ntd6 Eb6D+ь)Y{8[1?ʸ6֚@zf! Z8BCx/N<@6P"È 9|B֖.)(D:sh;uh,vϯD A J)`YVcZD\1oi㊜V߰wOzY=9!DxbO~70kM e_P '']Im $?!E“SF}֙WFPJmh|WgorEHO1!xDkç쁀 e\#ɾ1c J)BQxԦ変yc! "i:2a']qiYI-9hetbS&b6ë}`` @)EJ}#]M'?/':*hЮCՒfe(>r=]#c떻zBDz3!BJI)%9bL&v>K\QfB,棟pYC B~``"Dc|w!RVo"1LL(%RH[0[?9ͤQ"&KE^ ;4) Rhb#8 Bsƹ^+I+R2n)pαRZFUIg}A <E:ZS%W_<8e.΄.R,"HNǶ:!ʾYOxI^ zR(8N/0z{S %WP!儲h9SA <#Bk+'QJa7^MEcLٲ 寿_\ttmP),~/!{oor|~jO~(뚔kR2SD0LoA Wh1xEI ׸(iH)Ӱ8f:œ󉐿}1c8E L.@y2tBIo%>°hYՑ#!HR(}֢uIBY;Q@ĘI˘5<000g;M\Wtmo_pxsslۖ^ZÏ" b$(" x|_c|77*N9ƘF'-DCfu6yOC8?g.8);#SsL/1Ɇ9_,5GGdѪB$Hdϓ_d>sxxH4(NJOu1O-ù"3Sl>W^ /mLsXF2)A!gbEXg+NlBIngƟN ( B~``Tbx ]6Jє)hй! g~\Rݽ{ly[DwZ6000E`;CQՄfzh* @ʁ0LIskH)?WJ3iq'A |Q"(HF'T1'e6u\9h'_YOY6Ǖ?;pz4?,( B~``TbEGJ(4vT;B&+@drHD S=B GI!i֍A(>A J H$.8 >1*t>[W>űޟTSJ'`]=c"38H&\!SAdr$Bh Mw2czQUA rI 3 1`FOV_+O&"~> |J =]#~\hےI9 *⩑6M4&$KH& ?u̓8Jɉ΋eFvz! ׌@l*Nu)~@-HFr:sK-H!5%{B HHNZRj RtF+bH!p]њ1ir812 'F[,ܒ#BZ2gG*TjBJH)s 7Ƥc#ϐA J>29 D3SfvNYIc~ϸ{9րgKtx_Sipmg4* !2;ȑJVOïPK)B9wbqQUZk.!1;Dh J!)%(UB"Tg,d2HZh-"#ֻ2bTWB#Jm$ʪxOd"T mѺ 54.^%1[& 9C@Hy.>#HUq>iB|S˱eBo.oK\@HGʎO?sVѵcc*h^|ArvӮ(JԎ,C\FK HZT#HbTXS*ƈk-QT zy636BD)Aq B-bw#F 錣$Rkvvv jtG),JiPd>d4#Ǚs[;w3g6iۖv^X,AdC%4ReH21w9(` $ aL@w/ >```2S@~z>IZSk+||e77 9Vlmlb.XkI9XN3H#e<5?}7ْcLG|>?{#fP~"j9yBd{ł ʳvMJ^"oqwD9( Ɠ]l [?#~O)ʊ 9\,P{sxx;)q/^µWx!nݺ!]בc,ɄѨmwx睯?g4:\.Qʲ.8[zm[& 7nƍqu޼qjd888`q^fq,rI9wh ?] >Ӂ˗/bMɽooƛhWܻt:僟/Id Jao[+ J]Q%wx/; ld7_p !ѴKlm^k8r8u_yeݡo IDATE+G1utMscا0`{{|27nќfq]9cakk1[3]s3ؘ&\xWyW>rѲ"c4}C?J*P, r W3"x4}*}e5!=fJuTUuW~,Rʲ$|c=RJjr@ o;*Ѷ-B|t X??T9 |ę̈́>Qʼn77g!fbD5bw^W^GSŃ|>i:6`?P\g{f{6[ߺ+[|k_&\~GE r{…Sb_oYv%w>kP^@m;*9:9xqFS [W%jLaJ4}oɜ׮4P<*"SWM9X-uMLPOZQBU9s.~W^~7_{+W^`,$Cr\7+ 2;$ .Ӝ=,HiZru:0Egψ#m'O7Z3 $)RMF+Z[XR-cڋRkq:OD>D-FKG tDp4>Ǎ1y*[cBd1ʠDV#DP/׹|"7oGto^Oq1ckQMv3 E"υ5X& Y2~[D!D-AI\()$M, R VeO!&rT$@_qE_llN9kqs{hV+B"I\/u]=˕ tv4Ml<gϱ|x\ҋW>3{Ϩ2\xx1ٛd62Zq_y EQx琝G9^|]uxA\8c9U!׮m‚ѨaG= r, 93}CvoJD54hke2E?KZnA%$Ar,(Hbc*Lx2b1J#~ N~Q-!E޻ xd2,FTU^}XkN7_/躎/b'#}]n~pղ4r]>|r!XC͜ 9ӛjD%L) H9m_q OFWmZkR(jiPR!Խ'ɾt 倱b (߇RZDI DƓ/2 D _DVݧv !@@ $/0j7G*I"om^}yɴKoƹ)Bnܿ[oWyk'A5x>w_@;b?S xg@νxvnQĬF5F:/8b˸, V%}-Z2Xg+~7_7~޿dzQ k5crT,뚶h\T7npeop5<|VK>ܿM"qom0(=o"*7?跸o,{6;796FJWJ$eUh6KCi U( :\|uum˃ǏhZ^ }ed2accݶGX.<~+W3PJ u˵Whu9|d%r? A'G[t303\ ψ'qC^o)VߋDf]#:6yړjq&tLk1-"1s%A') ,)D`d&w-x!軜 6V6ĴR sߡH )$oN:cvoІқ5rjXloWlMޠ,rFJxlmlo{>B\7~k7FY eA"V uQ@zRʳ9\r^_yiHJtPcja(i#FOULc@JH[[boۘV%\@KrհECX;vw!r/x;lnnկ-z|mG'%P#K΂#ASk9u~=~#%Y1: - '=iX ZXz%FeD,?~"ոbRE\f) Ke`,98}u4KW+888(ޯWzhl( s!dI+H&M]xg+Ξky|ԫC6B-G\(JEY}VGU!嚢P "LF+fc5cbwݨu*ITD#!hD _˾B*bpب(~1'eO2FZǗ %($U)JEaJ D%"9|R$G6RBNqUb`~=J1)b^\N}CX[Ѭ<97&P(bBIx^u$iTU;]~GL*g¬s x w,g7t'tx?cZMb]USu0Hy|+*L#ڸbcsl65h89E-6#`-X$!lavf"#,~h,99IRI0hF)h4Ft ֎ȤYԵUOSQ`DfTz^bGe %@N3GK[SI5SfS%bJu+R+dR tmKUUX !HPZjjdp[Jf>4l;XuBN.P7+VG#>]䕗dTg{s/ȹgpgU/`3/0+Ԅ.FB1k >(gԬq]?( mWӺΝoۿ{#=K pL> 1$[[[ԵI<9(u K2G(p&) ÚY}c6PEdY|UEa+V]unܿ6e+mr\/n֢nTV%ѷHhcvzZ)oٽ ""x "rrTEPQAD JN{)SZ53{fg5OY3|{}V7GAIlWyABR9JkcYil*r L?$KS05KFI(ReV }/NeϞ}JY@+Er!zd YMP݇.䥕) blJd6J*QʠHZ=Qv! cb+| B#}qD8uz < 43R Te`0  Qv€,@#[o'EV1!T tzZ!Ja(LH<Y78 ; Y[]ӟY [w-ȷhkD11ssswb)%~ް0 ;?aou=ceY@YwQ1 ō7arM7DO|k_mOrm\s-<Ѭ.9zI8Ü0EX+k,-3|?`;8Yv2cHrY \Z:]8֫ E2g088|9kk֢3Fq4%K\ǫ;#^Bi2\p|S17?a'^W1ZY;Ǐ83R (NKᚯ^>p< 2 .-ZT1"gjqzoТѱ ߵ|Zn| O LBZ,l`bZ!R6s],]gG'(Sk ]'Qy~f<.̛}P%FT^LOQyOXMDQ(1P[QBLQ= tU,m@A%yY Rst:}(4HvR< bM4рВDuY)Ӥ'} lZe\`a@ևӦG]c R{TQ4 4gs܉o,Q5T)~u]W%Y(T %i3ɲ izUOQ΃Nsm~Q#]}~gmĦ%Z ),Os]Yv^_unsLU5-J59 k+^,-;-Z|w \ 0u j]EO-fR~G-oqb׮'[n^DkzsKKWD6=v:FX]}v8;89l۶@ZWn7fǎsssf4`  C6CXŪy^%KcW)˒n׶VMǏԎ#*h={ixkcSEQK$0$"VsPMOZZ[End}}c a!s+ p`0 s48b_-ލH>e +\y8p6"3tQ2iAh%p7DH(˼"ȸ".ij4@R)q2C7ػo'v,O8s>Ax瑎%c XeH Uc$}Cb/p^7QNyn&_5i:%dUXD.&/ Ҽ / B#ݨ|n++ +w؜{j)_o`CUӐ>/QJ4Ls^yFVJ|\)pQMf ql{5 *.+qYXBO6tM֧4y.e\5R*]muS4U}AUwEQL*Ƒ3T;wf9Y!$Im"hTrKhsw7Y>Y ]ьCcޏKz\ZV`+VZ★N@*#g$B; ! E-إze ]'>Q/ì:8:கCUgW绸®]0xRp o3t41$q XbE4+Y]>W()%(#>YfqBKoHhg766HӔ sMCKYF FZ`!C|e}}()[9ԓ\J=SNhu}T^9@VhUuA 1-Go^1}gTk"ohPL 鸸$@KҼf ffE)U&C-#0YMRxU(JSSh8@/Q0h,9J0Xp,/=뮿r}?AKKtc BN#*tP)I !fEQlGp0"xu+Em*VUb5z78r΂z[:0jUKWqBnBaj(@# Hh2 #HR3ݍ|ej_Q,MAY U-))K Za4;a.F؀iu,͛ZRa1K9=,7r}G O[= {ݍCK3xy F9y_\3NCz16ص;bǎtƣu}́,#zxF38U_ϻE^Қ,>OLge9X2*Le~ϡCY^^F"clV4X!D#Q>yUY¼Ԥۉ;.^4Mu3m8vg_˲upJ!E[r㹒n[ dD[,}qV!蹮KkueYEAǭI@-5J?D,˭5+#[&]J,Z[@kM7ggm>Y[[c4k.1Pͧց("]YxJJ(-X%C/9c礇!`ccxMtE ekeZ"EڈpA17:q@='>l**`1+X=x#$ҁ;zwql_X$ѐ,I Bpv&;6;_kH7l~+sbZ7^yin$`IF1UPMѐie 43A4bm/D?-l&%ӟ7 *7jD#}rfM? !( Q$iE\1uMg뿳2z#Z?l^vI)uN6U'y|]SQlBPE0J.W2o&9NoxLanGtk(y>Qճ $a=&Mn|w_t-ZҚ-8poM@HF_6+.)򌵵5!R,!LeuboD(m]̈|p!A#=m-bΜ%ZQCjWa4IV0[i?pZ+GR% |reBQTSMtNE0qlcJrqQ5GdrkgE qhPjN u}JHx>1Y%Mpܬ;7OQTք"rqhIe>|uc({NO`muBm՛'O0f:8280FN[̻1X#9tםa@HFc%yyDULZ6 3Ec=#uO$^0JYg+l*c4!DSQ3s^0hE6CBh߁65LF9(O8S6qJJ55`AmT%{kI 偙ڍ$XAy{0~6{n[Ϟy`Gհ7AMp`2YjeC1A6I:0c!nzA7&%0"Cv;:qRX,/1}\'/t =Qc1U(rw-]2fJ(pb2+ҢC-oqb=I'ٵM6lԋJ"V=ף@8d1eEA47ɚgY*ƕ$Đ9 Aa@@`]1|? 1qԵYF+}5t w vynaSu6-A!s q?D. (KϕZ !G(<1vl~E-Wv9յY@;n?Dl߾Ϸ VUB*z0X@TE=E(ntVZ"14-KtZSx%-YgM.gkɌ#MLu މ[Jb5'K3L!e@؛llx<&njF%Eao"Ȓșt(sĥ@3xnK5+)4f*SNZ)at3) p\r A8z'IBƄ±&!*'ܵ/hƧ+R8"|U67tFЏ{+Y`u-rʎ9,-pWή{' cs>ss]:$+&9 :YB'|l۷ ,HFCN"!I4l Bgm2vt:]z.y xvqB[̝geeƉ&iRJJ#(%5ۢ#)ːE#%z*+ cpp0doNШn2ZqYo[}.gY Q)&uW:xYRtNH9V.OPn<;Ӂ݇p|!WeQbBS R*|ߠҒ<MW.Ƨ7d1DX_`%)i1&1x C ,Y\ B;nSY eFw:v m?χf8Ž{qvhDtQehi0 s ^hI.WTJʺw](dn8jlCkiIE0Qj;3.EPnp[Mˡ, Qp!CY fm&c-@ *yz"]A+LiZ=*c4eM<@:35 UrsԠ}l}բV4Y?rBIYf$CBZHzTR٤dw4UY afHw4cg|@LImqTAf$}4c'x0s'I:DeqL^4.U֤Y7tUy IӴ*W$k՝G&3ni5r*:vMzsHI!}NWؾWq7WU=NE̦!Sto]($Slez+Dz_UیplO=rr2[a]a٤Aec2LYOBGJDK)' d[v`zbz_ԙA@sMc.>i~Qԡ5asm SnVF"V+++M~IE:JDDD1sVAN>n;vî]XXX``}}`IlnI7@g~nE!k9x0~Hh UA뒤 O'Vt'{eӡw )|%u vG&xT$1B+Ч |K`Ϻԅ59y%"4ǩmljk'bV0]8b8 Ș0]0}=А&8R!qyCCYOEJM@ sEۤK:e]R)ÙnMT<4u `u]\G:_; l!/ *|E:RC,<@G>0lH)'3zqD5bnH.ECT99*0 F.m+R,0hE t ف e?@T #t_Ln :l&g6KGsF^@hr쾛ѢCu't0g#3Us>/fjsGhPiA#Øo%yYʹPsJizIQyM$W4N6@׃: Qw6x¡4%B/%s"`ιFXs< $nuItHZ"ŎUVj(bE]5E zA"KP,MrvuP p2`2kgwЭgGۢ}q)(Ոleh1T6;Ø8'b-F[2%ԍFabJu ݵ L2ѮHtVRp| 6dDNbz Edln+J㹂`BH3EԌGA@m]opl'cp]#3$mJ!ZQtmB_*sF b/hU&W LY8hq"5#[K$j㮋K1?o 䦖EmiW_f7z 6;Hg5d9n^d+L!k5kBWY0Yf̹)yPrmsŲ8GAkRrJ0( 1=`-m  T} ʩL&LܷZiMZ"EX+75B \7r$9Йcɦ*kͧC3ؒ~w[gJj'~`(ΤgSmf%^C& ϳJYEF*8 R3d+1TДy CUF/RۖrRNJ)tQusJ{o>o<0)l_ybdNkֱE A@@t|<߾7OHUIQOϚm PTK0(-ZhB]xo~olgoy-Z;屸ʫ}[~}y<⸈/㶢]{cO O)q=wkѢE[E- lFC?_[I?c Tg/<y˟Q'_{]ouoq7}|ܱx'o9-Ze/k+ռĥׯr%.'^Br|[x=\n(w>tgyϜ?n1kE-tYb (5!\Op]<({6ssu_׾[=\\K~O| {ZhU fwq dSeDZӫӧw-09ԇSk-pqղ9<-Z8?]>ŕceS{&5+}zO 5_\Iz~_ۢE%lٔq 'srvMG?臭ܹ.'r"%򑷼肳y<>. ?|g/&.~n(ӢE,/4I?Cї׾6p") /p3xi|!~v7q/}=/޻y7O=s.'i&7z[h!EnZދ/~3:C)"dr;MS:'s_Z~'>i<`3X\^%Uvϻ=j 7Sx gzZ87cښhǰ5q,VZӢE-ZhѢŃmFE-Z| p,1mMcؚ8Ǵ-ZhXcښhǰ5q,AcHZ??rOm`/|dDᵻxQ.]џVn)'/%/N \~GJZE/./^Or'o~Z)to 'j}Ok ԢwZ1mͥ\1=pe ^~o}y¯=c G}?en~+]BoĈ Ou/D${uxճyPckN}bqcb3.hqlXcښhǰ5q,i8rW[0|Rr a< P~ԥC>k.:EMF0+~?d>})* -ZhѢE{19$~_e=&3O|| qK.N|/g)o"KgWz>st,fʻ;>y=#x ?_lk7Χ$?W=!|z?Ͼ{|+/?:]|+7K>ۯ~5g}OsoxOo^{Υ:ޖ zl}kB "OPN?e.'׹5=o<}q4|#l'N)Lr}O_rDz_䂳Bp࢈G{)YܯB~%soc=̏;g5(p8xGx',[s[FhqB [ZPNo<^ϣ,??xۯ\}k\ηUI>N[fpƤ9?Mם͛P}/nD{y+_G_goGm9zW\7Ĝ2WhJN} 9;yK>)ߟ#vKq<zוPpꥼ;͙8z/*}v.9(/N+&TQ;yn8cҧW?_{v)R~FN g;NYodlw;g.tq޶-Zh~!9.8"~UWpmy!; _x7q˅ ?yCrp S9+^LhLKDpNx>{;]s+wp-Ku's̉l TNa@q[sݫ^X)qg3N^ӟcigG\SYGGOJaJTٻytUrdY'XlO}͚n֭{G׮-[Mun r0SSʾUJޒ_yw_K>+s?ժv4/X qͺ#6pU:Q &s6ZCh䕛aSazg=r%L}/‘x{ڶrE[L 1ζ\|ƫEeˤ+qAL!(絝lKb|SoN[zB#٨*N(4Xc9։3$n%C6N6mz-[r뤻p .*,ac,EA~=&ϣC)W:Y+wX2[`n໯i⣌nW}~W$=/?FrDէNU@lӃueq_\^\ueoNlJB{iMڹYSIs}n=l makC)dG\,;e D95.RmXA+<5jԐ=ngs&7ue1iԨa&'0`UM땺U݋fbLq$Wpv$$41JX#}T:"77€Qu5;FB+7}Щ6 5c9.{X->P;dOcGxiNrMݫqmFX{3`_|,EQ'A3-Vu]lˑ<]vNkM4nHIݲlD;mnZ0r251NbzZȲL6Hчaq0;1 <1XVdRUdhcinG;:OàϧI1-@:PBܦeVڷf]V:UTMSjx ؒ9m5[x(w̭W5G1ұ<]"tt1$CЯ@{ K oo\pn\߀[Z,Tyϑ!krrh6qt|Sni|xI}DٍNϢY|{:Ʀ1o3[sߪ,=79dL7bcӉriFxu#7MtJ+κf"ÛvV=7l*uDC}x?x w|3zNT3]u Fs{,% p?F?|욛=U >?mXm٤&U]jg؜,5+Wx_ɳufB2fgݘE +q*s?}_vΌ9XupD'¸Xy8z^<\ ܥgUu0wm>!q.rKVk@>`x,by-%멱ֈH ̂\2 rOt9a,F J:|'E4OK!&y窱_U]WQnY@NnN@APUסo=sNX6}2OS˵P'1YS$P /""'p/EcSSܸ|r^V>坧YЬɌ~rAERTi,(Z׀U/MPƌ~UyC u ED99?] <\Y\ݨ P,L]Xی=sWy'0ػT%]܂!#_[tՈE$rP]ժu2ݸ ݸWrXjd_C`]gi 9䆩$@oK:UOӤU` +IFeQե9˰p&&~NS-1|仪sݫsj.T4Ix}~UED(߮˧QrmFWuQD&<J2S,%YXXjyr.]KKbnFPCuT&)($]EqfX#Vd̢Lzr6;4i9]]cNՓP=:ED.Z@A<}M&"U,iÙbg EDJJ־^iwwl &vRTi>ȾQҀ""Rq +Ѿ=ؿc$).GHOrJ.Pe1 Yl߲W?-Ǭ}.EB/v;a`G i`۱TSMSFdGIW_U-p8HJ;q`^rsxsP˘8rk=r󈋍Wաzu +ɾ9yKQsDEqL߳'Q`T_&%=U49oI)uUjDujz"JCRrt fsˤdYw23`u-idf`Ú߉OH$NT SmSP]%1 C rtsKI qD99o6AV;iޔ亩8NթSmS$P /""~1Mǜ6 Jv$D:Uաz[mS$P /""!t:#C,S:TO5N՝rEDDDD"y@^DDDD$ը@~єh^0zu![qBTꥷ|) { Ws-1Cyh/9|~"P7]>Ϸ<6RŮlw]'w"-sݱz7LfcIر7ҫ'1zf ,.~=v-0K),,7_E=%9gm}{Ly%K]_[mM2E<1{~I7q`Kc>T~i&6ɞ;q6pXtt Ѥ56""A|$H8~{I f<=Eѐ ijodTG^ulJsX IDATuo/'ucp Y~_m/m$//"6.[_ض/l cأ`=}#]Lscy `9LeU\`oK42 cөE4*-aw/LfAR.un/ZgncWr/q9f21>g9RwHz'~ +?zԫS/wNqwIݽ Ϡワ=r*Zp-^71?] WhRR] >w5%{"UvhɍW0F:Al0;͆>Μ-}[\%.ŮW͸70gSԽ7.ϩߠÔ:y6oξ gڭOCNǿ忘5v:o6 sY[IE w'pU'Qf&6.yq%ʛ~ KSXj*N>+.I'7XY<^ #b>8mS D"\HC?_NJuX}_G7΢ӡ3h<χ4nm~˱M\x{ݷWbe)+ܠK. kYxc EVN>C&OߏYvDvE+WyAƗ`\_g~ WO>6: !I˪~YiJ˥ ~ =E?qf.=Jߪ.H<`_k~o6i[{k:hy+cn>J;l7mB:ƹwYJpܲ V+i}xږ؅'M;09zL7.We}Μ 8w hdn_7cy}bQ*_V}<$voV۫Go7^b.%ߢ;CƌaHDleħfUl/H]ݏ6Obgb,$p񘛹SPV|Y};&Ѷ[32 HܻgyioMz k^| f!#1'u }7M{smКa\{2ދ o댳ۘ?6q_Յu L89fǒzsoG-ÌN%Fטq~[婬sW6,~IG/̥ Y)zUts>Xʚ=и˅?%WZ> i`qKhUo%U]fćyqphz>6/7`aFj\»]oLhrn:Vxﲔ믆uv00 7.uQQee Yxwggo!I'"v8o {1eU'#3&O`AϒAyc cFyڣLu/G2?7s3w̽wY,; p(mLHS\ڽt sp79a/?@Eqݯ]ulNƗ=̴[ Iya$X$c'͢[6éfI~xg>ȂQ:3kV2{pΧ\6Fc_䊖䓗Wddj: ~5ť7m$Mr yU 7hZNjC -kSbLQL^ˢ~j{HڍrtxNjVn,` |S!ϧ}8N+"jV(!)uXQ\8v}[7 q{οv]nEVIm҉!ok!>+ooy7v XN}*mlũܢ!o~y<8}^W; ` l.mKNl< Zv{Ԁ+ /hFJj+ι?bgPNHOnS1 9+W(ODʧ}dfe- gf,Ӫk ۖL)NjT@ƙVMv|xG/g>db(rsrXΏ~Ctl)~ҋN{{I;F,$gF7ﯩesy񯳸kh?e0s]Ktn]׳xOv8BNyyyx<]oWj7|F8|u J]_} [ 6np(Yoo֘g*u#Y# \Mװ%#Z\ 6u4=(gp!Bmshql_#dQ38̾{jKk|yNC uI(6NbB\V'zㅨTn/z|)<N6z]0/H>> OB~?2MZE;'v",v2pY+R* .?qO捻F.:aʃ H|.5W%cm/r6e3O+=ꗵŒE?ˤ Xe߿_ ȷ N3OL}x=&g[.}r:&} pkӲ謂G%ʓ:ݒLowxXf׏&V I١򉔦F}֝yG|C'` W>7KS3[ x&8Z3~#_C`[cpZHWj5 }7a335gw&_w֬ i1P/lyˆr}r}K(Չ_υ<2ȫ+ Fa~>z-RG7mGk{|l/.H :(~ZG߮ͤSޟWq?[FwN:δ44gպBt|I+{sb`*3u9xگ{-_5/߃qup۹\/K6vw% >dOcGxiNrMݫqmF@_~ƀn>y c7Տkk'162d,lu{qi>1W!_|lQb_,>x9mɦ w?s- HXΧ&V/,Jh逛B(x~so.#m#˙J:"裏eU|2۰BX>Ԩya|71S96<η>z0EDsҸ}nxp=lũ1'#`3~^βP2R7Y^jJN^7pQ0BN/-c O' eܠt@ʑ$q ̨bH5q03İC}NURDDBG|%Im0>'Zpپu3 |2>$/ED$tW$cdߋa> c^֮KH $/ED$t#_O#6.=;w jA||"қTZ>'e~)""@'$KDs"""5RkDDDDD"y@^DDDD$ET ؛yeo޽Wcrk3 ~ V6'7I7&,}wr{; gMx*(ѻ,pc<>LyۈH"b׶msϓ)}_yjdvsl=[cU.ulSC 6̻ۮ䓻{qMv~8iJq]3z3SR\"""")7\OAW/)6BN-z-nVRabwNM:)Pj˒ ޯ2 m6 o ?L >vgOQ&>}~6 b{A z e~3b_^.͋_†Z߃Knj79L"?:G/cG13߼Y,{/Bκ&]|ʳ7̈&COp 5-J{3腹t!7e~2CobKYwqӵg]婳XrHV x}{m)""""Q9PO&>Wx;; W3kLg 7s{{p3os8e L_;,sBV4{IdY9w מәfu48s =ogw(p}k<{q:Ϣ_ss0OqǞ'y>C'ٷsALi~)X7wo?7dLۿ=nOisx{-t:xOY -EDDD".ؼo~u%)))q;q㬙zf<̛¿ b'U>CFOzq$eWE%r2[qM9]C58{JHGq3wl3āo|lrMӪ>M:1d q-_|jMqF4RR[qӔ>pBz uʈ!]Y-!6ض[2S3sl˖~'S8Ai!}53bY7v8oa'b[c{[ְ%#Z2"y)2gՊsZӷ%v 0wLڋN26_JDשCQ+Δ6""""zo޺niu $Zv-O$|h=W!ٖKi>0S+)a`n\뢢,S ZVۈHETuӂ=E!%NThwz>9ޞ֘FV+iUxuG:~^w 1֭өI+j G\q9 ^P_&-__;,z^Zӂ2Cb#|'I68um#@n˂2_,>x9mɦ w?s-NjT逛r4Oy/zI>b˹`6""""zZs [}04/[0&&2 88b*<쇮,; !.>{3n•xaڅelߐwL!g~`I4:Tn֙c5k>`0HeKSl޸kOҪs<8M%IDDD 4Qs{,% p?F?|욛=U su@6,^_h>X,D ,@ EDDDD"y@^DDDD$)@5Dؿܣ֩C64"/"""ac&fٰ|\Ī6m\])LPڈ84"[ ֈD ȋHE(gdRF EDD$",[!"k'ֈD ȋHabWϗrrH^te>-2rm XqS+F[y[7xظ'Grcڟ|6C%!_γ)ҨŁ04kNLvl EDD$Bcw2{[$ٵy k\u 1eٱm-CUykw|s6Wx?ƑW9;&bԉvd{{_Ir]$ 0"""V L}4ghwq@ta6*k-Q2LL,?.]ǖ}y6hI἖Ev޼}*\5+6glܙ^ǐaKz%eд yg4CVz%a isʿ꾴|*Z;@Ӝ|sg] Y7~Ⱦs6#rnT]bW /+tg-mmL?EEԼ7Oɫf%Y(Ǝ/+m(N;Y0}>?V!^i'3𶙼:Fݕ60X^>p*Zǩ{p?z]*>'d*h#GNCu is[:1nJPWC EDD$3"R7=8ڜu lfcoQ;-M|p5muc̻p#"tNхq`XK<ZŁ=.u;Ե>28sMqDR\Pv!imI0܇KuIZ#"""O-HbRg _ͮLvm58<2u2\f,6,,{<ɱnܦm\-mX"l#x8:ښb'L23 $'^{UL<(-8+5yh:VbH>S ˘1a6{\ÈCiVgF[L07l%O<ĠG4o{ZKZŽ/d1(=娩#]ZDW4vn<HtSK1ֈHX4!nw^].۸2[/vm4x'*Yki44d_Gޤ 7ݒd[.eNwG6?؎\ô?w2mF^CxlYtajbݸ!Lqj24E 4s{,% p?F?|욛=UjۮClneaBKӁ pa؜8\]`ÕC$":> r(4gt QQvle /~ሎX&+Wј-*(lfy&kA9rF8.n. ϛ:b+Ml\4 |Ĺ: /Yůe᱘ /*T<.?k]y?9n s݇ \ |((}l˝O2p.%l_4 )r -G-jMxRW*quH |Y7N6T& u hDDDj }ڸ׆Ą#HM7T#T"""n0Mv]WQi`юjƥ(O 2-s^Ly2}͛)"""5PLly99$$&VuQ"^^N.qG6m_lkz}!?)Eq`LjoL=$=j84JkcŴNBJiEDDDjdYw23`FoCL 3N|B"uFm\1U߆c<{.QDDs:kGvm@9iޔ亩8ΣQWL mWj:aQ@P޹={%bccqo@BR2i`*fRnw]j6LEs7>_۔ 舼 ]=[JyNgAڸ4&orJ" & [h iLEDDDD$xƵ%cYbD)&}(H/-"X_?WXyy ,%g?"""""Y|I\ sAl@5{ѼH""""i\sC9|%A8 +^bYD{汀rDDDDDJbzzǰ.+~,,~ڮR&yH ](AA >H(/ 9̣ؗdx+_I ||(/(^JyǶr؇cD|bxJ|Wq=KQ /"""" i5 8rD{TRj|{jp}I y"""",_SB6"ox={..9Wr & %׶%yF-y"W;GZ#""""+UN/ 4J7*_M*)i'E (w{4^ IDATxw|elI$ޑ"ł <g;=bTDA)@zPHKTlym>̀H+3]:bDDDDDF+А:J=DDDDDķl"`DDDDDS6(g] >"""""mk_M[,*؈愕v 6m il^X󦄕v 4m D|MDDDDDd MyUv@hhy Ns+"""""5. *V?k:Kkb 6 [DDDDD55p4%MMkK} =oEDDDDZSFCᥡ0PikX/ 0 7M9AcS5oS"d .5o}U񭱓 +n)ui־eSza{]uHӴ$-u?55^9Zc!>4dSwu%""""" kJ/̘>^QykA^R=_ G`#"""".POLS{udžl3+TxW_`ﱱޚTiXS{eIqkj~C{SӒ0Pps+|WW3}·i,kc8 yWN絈%=3(rBÊS籖w/NCuh5f:1c€=EzY:9ArH{, 쬬O>i(:@SRpVinZ=2ytG~JLZ^VJeEj󫹉0Nv֮OuӦMKEuytw3uݏ}Rw8X}!b[YiI6BDDDDDFXD$a3?r-[l(:To 3 d-6/$8( """""m(88^^:T^δ8؛9}ca)AQSO\=be-1Mxx3:21Q\jyԾ3Sߍ1;WqV\>3<4$b6@DDDDDGIiiç)*T7WM^ͬԜEEFw=$222 BSl}3_AUj֚̾lf,:DDDDD5٪À`桺'Eu XVYf 3ͽD p,#"""" < A&==1Ukz̴IǼޡƆ##""""8j߃3NKm=OW֚jխ^@0#""""`TPSɞ`S{ZHkhJ/M!g:_FDDڀII&J "">ՎqW93yC 3k,a5ewbi5VOe~.nx8Y,+?G f ˿y<{Q?V_y4ÏpG!ΰ0F0ի|eCvcӲu|?mcb0,y~: ۡH,bߑ2 _sVu?ZD sѣyq>Ə߶nD}#\KLC=5 v8M#Xr5YtS*`@|Y4y8MrN+߸hرĆɴG^U:+V!G׬| :{kox5o`…b {xv+1ν8N篯m'"ZμZ3?`qr-7QT︾<=~ܴ?=3M $XLDUq#ް'0l YxTߓ1H<N #g+X "!of~ +d]TFۂr*ں4AC\ox:vV>_53 "|v-^SȚ,,.{[iDciV Ąݯ(,w̦Οiu}ODDZ-QM&-x1ka8 na9>1;k.cx6^?,raZ1:nl^ iOSLwlmzwǼ?cN=$*gϝ^h0<\B""F#85^9U$;v0;`[F?B,W`z"հ(ڴ.&0~`glUؽM NL"f| k28vϻ/'ĂH(]u.ڝT:%o[ʮKPя{.,WBr޳ tΌt۷ s8^s5v>?a}݋humyVDDZуeٯ?;I5vc9\^]3GddKVy % G$m+[mBTXUl{c.nGe8wf쩜ȼ_xB~$mJDN>q8{ z|ϻ[{3ņk $FXouwt|CbX`DDdo~ &yt_k)n7uX?.uSQQQQbDpCL|8c|wؒ9i\vL?*6xYAFsɭ7s~/'`4t;P:¶q5"ޅoE{sЀr͋-$T&ܛnA!5uL[rȮcY=pqU3O fUbcH1^{WEEE,E9~]CQA~. 9yxwugM z Fn\jor^憟OLo~Nȟ$^>?O餛YfRTSkJ܀YLGu7Ik't&""41w?/`ɒ-mQ #"x4^"";">`hx<;`m9!}ON}o^>[IDay="?N̤IjwHhN>gUjϗq|ϙYR̈>:gsfJB3S[䜙fWxol"""""ͯ H 3J3"""""Bʥ$ H~fAf"""""R~⌈H@km[z `~ 3GՋH03 H 3"""""fDDDDD$ )̈H@R0#"""""IaFDDDDDR3US8qSG*]yfL9(jJ|wi2Ϯڽ"""""ͯ7l3፿ ڻ4hcr"""""fl0}T3 ~W@z;y~Jޙ|xg*+c?]s}ЗӜ;y{6D_`S1a=d 70i`zDDDDϙf+(/TT20UOOK9KcTƫ/e)>g`L](o$˷=Mx[@u+fyaKܧo6<3J`k00 K} X:#mT̅Mגm 92N\47כlN97)0H 0r޳|p}+H'}+7ɼR\c5iU]Ժuqb ڞ9Di)#8`g?ܓɿ֥I# l6C̈Aq޵?}eW=`=t4f,;IubyLL5MuSw\,{iXt31\MDDDD r`[ǜy<?# a蕜tҙ3>[뇞FO<$e/܊\ȵTiQQwyWqΚǠޏ#JK&rv1X@qM)y<^*VRyX=3"""""rP0#"""""逾L@2_23#"""""IaFDDDDD_effs"""""fz `f&"""""IaFDDDDDŒ$ H 3"""""fDDDDD$ )̈H@R0#"""""IaFDDDDDŒ$+k/wDDDDD(wZ, @BR """"r@ٕ* 30#"""""IaFDDDDDŒ$ H 3"""""fDDDDD$ )̈H@R0#"""""IaLJ׳&U@GbneάrZr+ǐm c8.gaL}&Dx*˩4m8qj,JYpk ׆JT|gAR ܥdm%-’ Lgщ]Я+q&.ñ( sbAt1TpmffQT &<"ν7!5=nLfckBIc]lX52%glG0 9vHtģLpoG~gC3 %pbIkbII 6x\v7o=j ;%KQA^F].m+u}n'1Q8]%do[ˢ?vPn5e~۪Ydda-Yyx]`_Y9bIH'6AUa.ALv/f/b}䁮lQn?nHRL tCC.ٻO$6湫m0W<WmȈC Xw6deWLͰH$`m,y-99dV3e$u ~`"" .s3s$rwΘ;T?FXQV~l~6 H[DDDEa pWRjA?x'9L WϕX/惐srUom&,Gp%1s:3Ql^WDYYVDOBAN=eun@Ҭ, gr7\؞MFIZZ9,C͚yd=ru&RrӉnl"J*a&dpDumfE%. ,ӃۄՆUƆ?(^GeHX䮚ۡGѫr +dWR$4"A#ڹJY;ٓ9bPRlUϙ]w*K#+$?cjp?F>ʞ@HceZ czc i%ςz_0T[o~}Ǣ-a8gqG|tbWpz EI[PUt]Tsd0#,p_ ҫѣ=Xi;N0$IR}%2Ei&rpzF,#JH/pt̄wM,? +17M-|Rg[+ )6 "5>-7<ڈsAڠ`881ON"zrwmS`܉x;i !6];WSXT)fY}{W~TPX~ޗ-;Cg0NcDDDڗLeLהx"BmH#pOC[V9t힊-ykpĩЯќ5)֍ChFVToGb?ed;* Gx,I0M$װ,3wQdوOXFh yd%6]x)qVȡlRm Xq p"\s6pi&p"CpREqA8BFh':l`U*p5);`n⧥%lpAdT"]=1md5mf~ F}j'g.akt.M)ۂGrI;E>#ugN>aˉWc{s?^ܒ IDATM08/wpŵ?gg`YK? $ܪʻKؑdu]%XF$>V4"HUǂH|N",`l*òL[l/N bҷeRҍ>I$'ӷ{'b&eyaDt8Gxu`Ͳ (Ը~&:ܤ0s7Ch "(쥙l޾RWjl?6e?g`$BdDDD_FU^8kj{?,+-ޜʮY""-^ɷg@p&IP*gWhe/Ojm6qURi~IDDDDD@'+o:G˔7sűq/՝G+(sy} &p~cNo˱<[x ;nTTx5>r#qǟᛴ6p0c3ᦩbYF&MTνzD?-xp@IpAsBo'-g_50߿O域l&s|r/~{n}Um"""""Na%NU?;zDdغ?9RXg=M׿œsŜF #κ/=6pŻ=V/\{#ur`*޷Ek *9|2FtGե[ 1Am"""""X xȈc/Β޻&w=l}&WٓPJ D-+֓iEr=Κۓo3:z^t*SO⒉s˗s[Y~`vcxIQهB?8`_e|Hz u{lJˆDΠNރ,SEY<[ϱ\| <}~%OHټ,N˸;Kg2>|eKò({~jQwyWqΚǠޏ#JK7k/aĨ͙EDDDDDd<Ѭy#f()E5ǫ^ŪSj5W0#"""""IaFDDDDDfVr2(/-4=l6;$&_**#+3͊ NXD;vm nDfnaz=BtݢdH#/'n;DDDc3= عm+%Ťt*ux:J#?7| W%,Hu+)ivMQAy9Y <CEDDn':6h֮\JxDzh#:r2Hǃe5p"dq{0 ]ޕ0Nj^ 2"""Ajde+4BiWeAyYi-+-!*: j%"""KYi:L 3Ҿ èk&92"""ޢゃŒߝHsh$ HfFt|0㓥U90)s.o'(6W^nS3*zfi;\!-UYLN~̺TuKIݚUAKfQg#ӏ[|rI"aaKr#9wXՌ+[%ymO|n?3G7Zw+EDDdi4b5o<8ep7=ڠ=0%܇ù-UDDDږ~hY`ʭ´,,2=x<3o+$m_0+_YU=4r?(Ӯ 4:R޿ڋ$z5.zVg7y$DE?V44 ᆷ紐G!L]s?t10Dl=6maDl 3'C~6Fe?5)>GMɟ} }0㋿O@18&tZǫf^~/߷gג}\ܻ%x3Ȭ{w]G[Nve{_rܽה]cؖnW8>9jX|!GܡJKK!jc2i"aFw6q \-ڶa $_H{RE#{L8"qO1a<<<$>5OGDDDZŒW},,IDD ӾgC, 湭s/z}͢_v0a\s?~9w9X4E>؍qG`+ڈK+ TVBYK|< Ӥ2w7ꀱ%=},3aX-goY_~әtރNCET!Zfe|X**++(y]87ZO;];c.]UoTDDSό/:z͌H1B*cc(s'w> b\%˞㙩Wao?>nk 4.]!=G83wd1s3pEL8.[yX|1s!gQuo[cg}ǞԿǫ7O߅̫O2&}2 6q8t<1 a5VOo•:c;9[!"""A:Ͻͫؽp<<~YVZ29]| #Fm,Ͷ엟6]G@q8m6 j3r6-#$*wm a3ҍaz1&*m6_Ͱ#4keyDDDk%1pf1X@qM)y<^*ݜ] Qux1=<WEپUיSDDDDDEaƗz⋈Hǡ H@Rόf|R4LDDDDDzf혦aSΓe&6!mnxZ4tL}7LaᔗAаfAqQѱmP+#]Ou%t"?'I~Nq I͞Srgҷq۠f"""@Ǝ4rH֋1tVWTaϺEܶҒbRtK=Dڛٶ6S pEyd1`p캜1Ntl<Ѭ]Hz(<^6Ι pYv/XiWvn=LwUDڜYiojcNaF$jA(2:WCͩP4 3"x4v[ncztΊ?m H 3"""""fDDDDD$ )̈H@R0#݂yͪrJ+ZLWo(WV9p1W2IsE1;}/NJNdǕ[@?m~Q;.|7"%%4f?{ƍj" KevDjcf aW0񁟨}˞Ȑce)ͣw%{x{6ofýoz_|}6s]AK/ 'rX5m{ΣfIz&^%c˄sN ,s;Es//Ӈ$+k}m?7[NnNw=D'~Y- -f+7r\9)qS۬uHR;h?!DF5u3ϙtZm#hn~=SOΗX4lljců3#|ߙ|){<Ͻ{g fk)}'F͉ǵ`7{ ~ ,kg 1>~Y*o N p߱ͻ|3_<9IO`qßgܹ I{7´qgh+Ք6}"3?w2ܓ3 &_lWmͱǎg;yui[ʭ|=f?}"O8+|.z6լd+_{uXcmXƊ(ȁDd L{bz'/NaSz`z6!-7? ^ h4T.{>}EfmWUncO;"7N_CZcD׷{#3HrvrKziDV,}aw/HdorF=O 0-= 875è?o6Uvև涟l9x)B_93;HƪmG 3r@Ͽc4rٹCwwy6˩{vne[zf\}6~\1mZ;[}Y]ĞM3B8}96T,Ӵ8H֭KmGt f:[}9ߞ;%}1Bc qrYxmd386Uvvn?f3 x4y_IQ:O~ꉤ}3>Mm,6=)*=Ʈr͵өOn̼^qS_f2 v_ύr`͋qyXُ?M00ּkzGǃ s865EW"Bl2F0Qrʭ`wr iJR~rry_Ȱ D;9AӢSBƉQNA-ڻt_W@gl+Vz>:{ ߙ޿s)))/#9lrh 4L#".f^mXzooT3t6^jgC3Ozޙ_g r1-oO 3r@0+K((,SJqu"!1_¢,V}.mFBrֺ禲G1#YQLa*l153qr1n>{1>Z',Q\xV ,Π4)ߵk|?I8y<^&) .% ?NΓ-IG*G<],3CO? \+6"sEsضQU5{5E&k.̞S  }9i ̴lM*m&,-r@|)?m<;]8<_ hÈe'x xޙm{=Ψm_E̞>g̩R5b38G޺MLˤ,8C~ GGTϣ6Vg%u{W{y y8dzs*fFۜYDx~aGw5xEDtTIS>I?g㢨fwo9E>SMS3,ͮ_fK4 IDATYeiee},,Q@Dv9vg~".>>ݙϼw{3Uh+ލԮH\mo4mΡi=<, ,,2 Eq6E+R.pǠB!*TÜՈF~U/B$B!DR˺C2O>!|@ZH_#!D9fE!*ט@Kii7^OBBGI2#BrrUa!jf&B!$B!BTIQzT(gV^՟2HkIf=<4WvHóI;+*dF*vp( X-E VSPpΊMXI2#D돯-ETBT Js +BT$ig"mBT!u"%9'JnQatz=EDʗQ׃dFjo_C!-igH73!B!D$ɌB!JdF!BQ%I2#B!$B!BTI4K%5% sv6*_CA`PT1<)ɉdB! N'CyvdaLO#8,DP$&ēAxe'TGvV&!u+;v.cz 9b7m"ww?AHpbCCpuus BBp/aōqqziŕ' յaNCNNş$,,'ᚇC ğt|N0tLH{M!)"ꄣi: p2:(Շ#AC%!êfԩDFD`U-u:JTæ?tTs>5&-ڢ7.-BTU:Zxzpp.<< M)2):)s쬙{ v';2ÎK@2M9xxxqqvy+7/'^8zM[:Tу R![TRSiФEg4mΡi=<, ,,2jST)EPٔ''tȈ Lƍ):LYxV@tB!,^>~*;I)BZAځ8SQ=vࠠA*!Ռ^/qAM#L14M#?߂&yNjF N!!ͬ))A<==+;!B*G4D rA!ʑnf4"vEa!ҭQ!Areg伂B!$)F\_rcw3͘V7cγTg%.>pYAU\ m֡t|};{R?$ eq7&fF0Z^ODtPu{}F-RW1gq ޚzk՛lI 3NM#Vp${ ɏs$ʥXz\,?o56d?.. 4$_0}xŷ~8+DK y׿Ёz= dJ];xxڨ=?gŎc[UC/{Ps0Jn!^5m0vw?$O'+o̔ +on[eV/3;(0K8*,4C(_P:v'l'fw ]!}LЎSVp2;vŏaLe3V|g?eYX9WiKmaƷ7L7X'?_'zM{8B{/N+&ѳx9+5.~ʸG;}!?_]Zc\raK9[ґC7m\-{kyg2m$uz4M@{~ouYl?uYBBr2I'yOw13X'٦}9b=ۋFAnqo;;>!DU!L144SѪۿXbvy}mŲi١()?jtN]ofڝv72cتFӽe_mO~M#j SLOo3hi%L7+62lET&|xRX<.4#1Y^Ӈupwvݿmo?m_vȄ?xYj\ tַ(rte=47zS׎D!Ꭹsn K.K: hStyiI ٛf9:Y߹wpilb?fڳRK\a=[Eg\Wt=sec1ɼZ5;SS&>{2vk|2*a.*gֽ^;ヘ.,|a$=[EDdMb7?O!o1sDnݞeɯv\K j&[zx9|?sRּݘJӎx#/`ΗxyX0/˳|KXH(ax޷]: pvƧ]ovĂ'ه(׾y{tv62ၟ3qYlålO]w vrȷǺ@ؼ97 /읏pgvn)ʩٹ/l5'R@ۻmkVR|3!~' GW0ke+x4f \o@g/Ƽr HX~0w14w@nB&v+ݯ+]+g5*rh=1:tc ]9~H/oƔMb2WSٸrpJ>a1v*85u xv2rmfOsj&+zrڵU1vzlq2tKS5  e6gLJ>J}ꇶf[.LPOq?JS\_ڲьy.gFV ;J2*CfɮES1aLS a.cO LdXgΜҏp˱hٱ6о]$:4<[y7ͱ@wйn4r R%ODn-m ˶0xlo"@U#z`ؽÖ,}]m:D`/<}hc(#R8v,,NNz*>qg>M'葶-ϭEG=z Ʊ}m%'>%כQ뗨'H VMh.R ;ҵ|C;T+Ld?oM䛓hfegvN#}{`Oa< vlet[\8+zⅇPw'q$q/E+3&QջVl1/0؛qiK\gg.U{ү7WOnʿaA%9f=;\չ nc崞x3TzԒe0ƿ탼FwQٮ}ɖJ'/!-G[Xad_%axnsB![/򎳔p lN@pKF<\3t $^x'M1)ftS jFPdLsAXΧߨ mJPT=.exU,QI,?ڃ|m܁8y>ŴSK*z7qOҳ0-u]˥URZ)߾oc'Zxm\񝪥-cBC)q"σ-AB9޳]J &Եkmk1ՂUPx;XU z6,8?_L AuFClg{&%H)+w+g\|u@[>yyrf;kwdJ q-4~+89%#y7<ݎ%w f{9~ٌFuՖNWک S~GSL~-i2)FϮY3R ) B=Gj~΀cֽVR2bo/`!;ӄWw`\L#f-wL|8q;ĔF_XtV;3t#[^d CqO yv>~:!1-D'dK~UKŇofg+8R{6}]ƞOh9qc=wks>0ș; &]\dKGcVgvZ;V^>N'VgFJCJWP-Ӟ`6_~rU \9uytMz:pû٧bDKmӓ8#{r׭y%#~X~"*)7qtڕUE_dW4*mwgO=Տ4*6gg'S_ZF:/\ki13LqhSeo7*BG}gx 猌eoFs_nbzc4S"*>=n7%H L&TPmtx;ViyZP]ίܞ+1.hՊ]eٗ3...8D3~BWN?eF6?]&wnגbC6ʣM)svgA>' łE#`0tv+d+]vcz XJSTX(uUJ]%)}P6ߩ+2%FCC#* WO5"f+N.X>Yt f|_4 (y)9&r ٜfc;خtaԈhvǀM+nऻl\oOw(o7'tqޖޏ`Kش9BV biܽU)zgb%u%oYʓ,dhA{!] QQ.=!x|f-#-y'HZ{ۭ.dOHc|]],ǓKS1LK7iK6D-N<7vb_{E~;6=4ay,ǝ>}.ƫ㣅lQ.2+hhЖ.Y2Vz}IGOro~{$?1 Kھ&2|>d;AUn`n M[651]j=4'\hٺ0d`,?Ѓa7{vlYqd&Di;Y'82*qR3ΆlΧ{;(IfJP}i>hhlξXr}-*X=Ͱښٷ Ş%GU=w7:?]t c9y#.>R #j~isòsY'ɳdsz1;ꯃXbӹePX=w.O™XO Fw״- =z_|( p#u z{T>6nOTߑȴ-2ןNÅeˍhɏ?C0`z2HY d;<.\o~Nj wso~̽k_ta ۿ_DV4/e1ک"ףw??Ά1cuyU%lcU$ۙ)2%Fh?Y_{Qٶ]XW=9̝;8l\6΅a߮r#̚,z˷zeYu<kqȮ#Q"M^thWVr-Z.1:+“rK:X8NHfϯ0K# jj)Xmd=J_ Ɨ.nrl+.N*yf :WWt3yH89CIu\\0P͵srɠ/h845?c@w<\ӴU;ql  _r(BQmJS8|'Wf"+d}9 K|UKfsVTsLZ4 ~ˠ*ff\Kᖨa%ll2a6kQ/:K{ߦn|rEƯjA%˿+ώ=:_Zo篷Fѹ~0Bi=$A% IDATg'T qXp+ZKT 4hYYVǙ]XHnP艼s *;qe|e"*g!*2=J qOZ[ӖП/ó˳.Q5ɕ$Tvq2H?Z!5CNQV;N#i3b) Mt<Ubv3z;@uL!2xtw&puIbideeT[#,42&BQI7I9[! F3#BQvre^DEՓTR"j;~NGZ4B!nLVn$3E{`6eCY''y$yyX,ꄅcݣp$Ә_ P!!3#w'LI:u:z.\NN""VӉIԍՍ //Ĥd#%''3W!) ub5BTzrLWWI &ϤYa3gY)pv3))ԏGVÙ٤=KY gddr65 HO7^}~F#g edzF s>=a1@RB K !Ub!TQaT,#gOFXD2$$I9BXD$^>~eB!JfF:I $UvXRA=tTs>5&-ڢlj 񫅧KjOYqH8#HMI"84|iX-VE!84gNfR /Xq] ""IIN/ZQI;+7ic'(lSq]i'fSӚ񭀨:/?LYNYQb(BZAdF\_lRV-*^/6+DU# GbUQ9dB!pt3B!BTI!B!$fV e&B!čO!B!$IfUӒǦF3hAwqSx}?T-zLJ_7rhq% ַOa!ӵOSzfVOE:htC-TvdWaє~z95yl5|?3.oG0Dn_X)^uXR>o24hĄWPwwݶ'6 TXQI$aEGXB~3>x3֍yVu4MщP C^?AV}X!SX^Rg4ezw u֮bүy};gk/lVtnon#lXY4A\Ntnӌ:9\.G7h,.6{&RrlaIqѥ-JG+U:ammuH;xD 35_ħ3bhLМz ?aO'U홦, QM;.|wiƩ_a ͘rVKMi.ypo?7o؍;fl?DhX:ju'kgb7G_TӏO<< + K+*$35Ra\\yuQ=sec1ɼZ [SS&>{2vk|2 UIғ| {AMdѳxy`j4,_@CӬfO=0#Ͼ_aii+˿+Yڙ!wq+գ n `3MYfڦ !9gI*,ɬ"c@>1C8XrO]ur{ÅϚ/&yU0&3b-t?^ʡ {h'w!hFef!h,nr-s-Uk2jS*6gZC4H@V0D"Zh!IEtvǾ-gxn.vq|ӫ9s9 Y9k#NN%h,47<<.Һs#Jי|P<ԽoG88M:p/ Ɍ#ǿ>n98ݟo)ME$LqI5p{ևyqw t *5zea cO.`R\6JyOUlPVoUՆkD$SsF ۟ %˞iRoyXSqޱɩ)x w{kV+Vb zPҭ!oCfTґg# ٚwm\m)m%S *W?*N8Oͭ4W{6_{ѣ)^S7Z Nk]O哛Nβ_3n3H V&gDKXxxQ (y)9&r ٜ ˱lW0jD4 kcBɇPŏw5]PeF_tNzktߖ'ӡow8MY*x >.L0{ęУ#s7Ά;t^SZseڹ>)~ٲ?o'#iF:F%Ft3Jl|].t tgYdaicEdT |5qb,7Q\[3_ ~س*{< PŪM0fh+_wnhaܯYql[rfћ Zx9S h]xvad;=!P{1_M!1V~w=Ѕuv)]chnn9biإC1=:3jH?$aRUgeˁ4C$ #s͓.vSGĒt|Mn[SN4{#h~K`ޔl+9uo|9LJGH+*t3+N>AtF( z'/Zs@BSyi.f?"|f>"Q'xlYVϟX|n_"I;+ic'̊0 ō3$,ϭe B!DWܳ{X,:?ڶoO''/|oI6s;sø'ꭔXKӶp=1zcE=tb6g4;h?!{7@M&xun´}S|E5B!:9ƀh޸ŕAxgwtLcxS';zQr*:xsL{6'䷹;m,;ec{4Wˊ8_ yGKwdf=ri;KaqjVNpB!BTo5'Ц_W"XzÆڔ|L\76Gy2 t]ֿkrEҖ<^=L+4sIΨ*˧emM!B$3HsWb}jhp+2W{y uȘAoK7&wvuE(xt}7g|k*B!5]J0F}=]fo)B[s%@K'oAx@nk^GOoYN-5&3zu|} !BQ-yRd_ w#V_f|9&%g8kHnMè^"B!Db!Jaۢ)zb :moΚHbw.#!B!Jszj4s@ dck@`)Mъ ~Uͼ2#B!$B!BTI!B!43{K%5% sv6jpD5q 0(_k˘~DLYY !UNӓxWv8U$38 czax7E$*j`H'1! /S=I9BXD }|B!nlJ1'$$netÓ"ΥbLOAhhC~^e%-//4nCHJu 1B!*'rPŸdF\_l}GQ-lmIBz!@ H" .WW Xk\Ă^Ŋ""]BGX Ɇl ϗ|v;sd9gϙ~2 CȈ2B+#C;h% JfF|0㓥cq'>-G0pr7:^ceGcorW{s ^SȈ"""JQS;z2?cMw $Ѵ`^k={{Z{_4L. <9'w4F]KB l9;aOAg7B p鄸sؽn>/}7WѪٝMOíKh>Ԫ 3>X _)4؇vvnZ&8[e6,,,lv6 KGƱEC1Vyv+`m8OquURo_4L˽.L²,,0 f ]faa㌛r07@~co!׏7`SNusS'$HeCݱI h|n~{%E=bm'qA$P糬1Lv|;]gրXb#QBCm}O1Φ:z^\Bzs"u~LzV{[bŪ(eUȱ03򬲆 m͵O?KO>b{'+rAUٸΧBr 1oI"^<&&'2`Y|=aܝwa1jb_-C_糧g'r'\;i= ڋ_gbuKB2nZ%Y nth""""eiKgD.W.O>a ?=H-̌oebpwSlRv<ߟ><֫?mI:p^ʬ??ֳ---ܴt׋bH$1˪2EDDD|QEg؇L WNÍN&޻ffj㱞vE70B-x%,f3p0uJXX!aݹL?/oƀ־/;9zl,''eWyeIaU 0qYDEq8dea߷7jAЯYd}Т C Z.d̥_5W=0c?_Va) %?miI?ynl¹g6ȯ&P/kӟUU/Ǫo2kMrSbcum7wb*žL=1㋿ٟećx~ )_t} IAXV絍QXQzA"""""~QR4%~Oa'NDDDDD$(gƋ4MlvQACbbuT]%~m6 1q ߳#"""fJt:RDDDDDG̈HPR0#"""""AIaFDDDDDp%2Bnv6%0vQQOj丣vVMmfDj];/=&-i]SW5fꬋi`-daRv6Q? }ii M'.fw8KTt,V-'2*ZJvVX Br+Utܤ9i)]S;+UMml)̈ܜlbb㪻r'7'!pjg:- gnKp8.OT0#"""""AIaFDDDDDŒ% J 3"""""f$}9\W5]ׇNMPڝuO|R^F>{|=6~?w/|r=QXZEED8C[x"5۱Dlp.JLjO |6[~jCs~L<7śІ RRIMX~fxqkQ z]9ި <߼u|,rr9w2kgO75)in7jcVē1}x]ڨp= 7f||#),ߛGКSK+׽or㸨M4P {kf]\Ң8SͲύٯJDsq]Uo?þ?\7'1*H,G;, ꙑګ`^a+n9d{72b&r?@gۙ~27uxۡO[կqicEV|zȨgeM|XCXS:tYsxni )e_u4<ddO$%9PYкY̙%W_GoEsT~~F\q=ϻwLEϙۙ~?Mƍ޽a b[z]\|z\p= \_4Ll@7Na <x啧>EnN.!Q^vX(HJt>8 |L`vwmADYwoWor˳/9]<,k'~g>4RK>2xmY<:3}zU12Ǝ5mA <؍ sB?(ޘ!&7j?i8ncL]ԞQ#:)rckcyz {](/;&0?’e&>3O[s+/7fl\|]vR72u'U)ENvٟH 7h`kaʢafR{k@?&ɀ#cqZde-9:OۆW-z>fPg\JvF\Z+9:,=?ގ"ex@$.坁و;= o_݉~.Ͼ+Ck~^@GŲNCUu: |frًqAW?xk?ʬ_nN;>msFGspKJY y./>]XI:9iԻ,'8;{e.[jcf3/5[Iٷ[ qƜ2=Gcn¶ Lr>8`{ hNLn?n?hWxf<~f[pt÷t[ȴ'eD%5V;k>SgsH 26[͹ǻ.%hkRf0gՊ<٢ҫ#9#_Mam#hMRJ#Lek7FvHh}* ?v;eoFpeլ_jcŒZVyv_4oF̽c _0ܔlaae[qoj#4PZna?9D{]0ֿ󳓹ctgַn2~6{5 H3/f^\,3wБp\?m*!!l'Xa)ц92dGi+Yo̟0ǶqTi0vEqWJ֎Nmwwz~ÕGmZ̽'p7>M sb՘e^z:!8=ݢqSN<7iK ,Xg{泥:z.6mFLf{Rc-N;c?ٞ\cL]DQQ[D|r4nJk-Kh\Xw(Z'S#'PzX* o';YYYEe?-C+/ Ф 8d 3R+ddfZr(LOmdfoϏ$&%b%|8ѥc8fLgѮdf翱xc[Bo 3{n2mw粢d:3,}I\$oj~[?ǩƳUcQ06ͩ;sփ?+zP/Ep9.NG>'K77u߿£ӷrJIh ~λ+w?Ag|1qsVy/L[YGovFjc12ycmOer ~Rn;"M̤H}xف;o'A_w'~1=&J6/~CVޙݫl<޷?ʰ&kC ;6,xx7^_ d]|.R\f:4Ia/LɴU)݆myY>6b؜Cc*6"}Ȏw.% qN`pWp=v;+|̽]Š1Hݺ- 2q[@9<{$<2W,'w;M=>EbԙxKj Hm盌o^z]wN3G>s޽H {/8ܖ4o/UwkӰ~&>~ OmNӔO_ˀſr"m^=X@Hmh}Sss'Sٵ+ѥ{/6V,YHn=^V~bjIPMR2z\8 >ԮդT{oům""l 8Pd? S4Ebz,RA߸mu[ׅo""@aFDDD*us~^<2/i"RԬH*·'CkE=΄ t 3"""R;\WWw5D8af"""""fDDDDD$()̈9Áie(R UR6|fD\Dd2r:ADdTuWC$JuP[> 3"A~R#Rop*r1nvJꮊH6fD\L\q uYj914B0 2eÚ%$֘o $RUOS3 7%2*mި0v(4Y96 3"DL\1q ] ZKHͣaf"""""fDDDDD$()̈HPR0#"""""AIbtvijE Axd$4$.!GZj zϊ!ADTirRaORrbZaw0I` Ro%@&Xrvʾ4 Uvk*"""f2عm 9hظiuWY{O6(,,BWuWKj-Ѵ<ׯ"#:}KOMSp8_ZDD$Xb˺UˉVMt%=mIceUwuֳ06Fٳ{a&-5&-dDDDj Ir椥(̔Ax͡NxT)˲ "/7mss @DDDDƓ]ըQ00#UfdeG 7 3>WFw""""03 J 3"""""423#"""""AIa'.+Wrs[0<_C^P )ps]B&I42׸mF&ϥ|fA6Y>ʵy$zO ujD'r58>k^ӀJa#;3qt_NiV4mۍ{=؄ $[+׸UeRusg/)~*) WԣGf8zq?.:%3Xd/~6I`ݺ??u=z1up† 9/@ /p#xBϲ|WjcۿeI =5]V;iY?.3A%b纟vl|%Fץx6kddt͌VUB^UWpy$]gâޭN97ml6{T6oymC(}T,1Tpg*AZY{ gܬm-ĕCqEC| v{u ~,rY];g :w<+n=TgOf7miи=M#r2ަIM;qYe.v{?DbL u{>˚̼; );ow.mO\w^0_ϼ#A |>< ^L-Mv,ZĮ.g- S ;dN@m9kW+I܅aӹIm>>Z[>L>7{J'3v~^eSIЧ#Mxmiơ_1]]iw<20 SٹႮ_yTy+½ӎ?ӝf;*#<:!D*aI]ulDDD<(RݗMdeŢvB [Nik_ _kMOsk|Gg'< gcMpms8;'Mɷ5}&OO_AneyG(Q'g[/$־l6j 0Yp@9w\_1"f'K|1rƧ\k?g8 ϫv̉1YY]x' #+V-bƝMu"ן8h5[~ז'+ /M(mNՃxۑ[;N' IDATk?&٬ܺ?#C:gG/5o2h g>9%˾xoY1b Q#Ջ5{ q5Ú,ၾc㾱u匮1**9?+r "sL~bG7rW8!P fa99\r)cf|3_,\.ͱcվ3VxuzNN} g4&" OurShV!yXcޒD<`>¹beYt=t$EK.o4ޒUi0k<ޘd䤧c2 ư'whg g2|K]8 36!)݇[Xޛ貎OT//bC9e3:%L+RRQh]p d} "2ylR_lǸ?w+fr_|up47Ѱ^=\srYDDj+]3s\s1mAAhB_WNşôaa9" 51L ||jEjffFgzǺ-iZhm ,Z"t /?%/c<`WN8qcYwtk|'q~)t[WߦP~¥_5rWнu1!;s %ԙþ~NzlG"%^g^ Gٗ:s;L|kmQSW2SK9j=eXygrsp)™-Yt=]qzXL7B:A=V|Y+o* [B" ˙hY{ٸKߢ+~+V}'ư<%_sj/Om%0ٱ)۞L=1㋿ٟeć;г{߿:[3ؿwf;Ԓmu؛FeNh;~SH^n>VJ.MRgMJ.w;þІ4JcߟqX/ɾ|̈Dgǰ\&=ݼq97͟c\/EphX`ɫ6Ef~[Rرq)shU:$|i\o,o~v`/~ܷ?e}N:4Omun'qJ% :Eao%7 9| [M =ƣs}Fr:ŹsQ@,{&AK.ɕSg`]L83׮݆ڞKtp>)Y@mNk‡.ᔎ}y`qd}lc#ԭ[ؒ;xs0vkOF̢ƌ={:W|&~mgژK8m'M)p&LY; 5@=]6-""Ay?y\cq!ŷ=oOɞOe׮\Fo+,Eȩm:uAHx(QgXN Ln,lCB q:,trE̲( tcf{_lڰz͊% &8Xy2:z9AFAU%c#׮ӑuݸ*/[MDdT` 2|XLs>>Ԯd wAn%Y|495pylRXGaX?xhY#Lz2HP2f|jW N;"""Rc JA2"7GKꮇqDa'NDDDDD$(gƋ4MlvhHͧ J 3>Ytq\:h0]ɥWeMĴؒ}k~j"X,r+oDbbc:f=m*Rh 3N='d{ 7< c{"mN0(.{b3'|EqKϭv+g` z_!4,zVq%3Qo6ygmְm|||yH"""RgƧzVYtƼGGm-:@фyK4719 Lgg}:r~}/nj p~eYXeZՁN} g4 Dzb8mH:~7U;t:al 9#/Йmew + q؈ܢ@6)r :\Su:rTEDD(wl4^2NÚoמH-̌oev&fnpz~inIZfi; ap:,܆A#wL7iarDjbl5d- >>lׁr YYXQD*6)^]KIIuŒ/CE~nn/?.Ao瓥[WΖ |v<l<F=4'78װ6xδyTVU1[֡GL #(6 {%;%x+,iU?'n?-u^c4b#׶ǻ;z>qh1ן|U*]ELH"""R),ӍB yY/Ǫo2kMrS&`KH$!s9 +{/~[*-+vsHY]IMy.щe]c_f?yͼi +5X+y\4~ʻMyaf-Ҿϐ/ GH4 Zt؇ҁeBp4ql'$ӱu<gKm2sGӤtφ>iә;f4wtIa~+/cW&oDJ|sEjHDDDDGaK5kߧ$pJۆed$}VN""""R. 3Rc榱x, M|ΝqlnEDDDSA ˱m`n~?""""(̔B5 |DDDD8W/v4ٕj{;ÁiVXz߉H5SI^n6]9fvQ 6nj%RDDFUw5DD8/ ٟij,:i?=~o[?)۷boͮ[\UŒDƲij2cFuWIj10%6>2bK˺Uؗadˆ5+KH$&.$""1 3t:IJnJhX8SصmN%`ѱ4nފp:+_aDFE¶%`Q$7i #""NaƇ05hHl|] ١^OBfpZ S"&.8{vDDDDL)N1\H J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% Jꮀ-^PU Lێ] """""RCh% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDŒ% J 3"""""fDDDDD$()̈HPR0#"""""AIaFDDDDDRUVDDDDD_gFDDDDDRziDDDDDO9ǯ0S #""""{n@̔Ua/f[QΈ2ŒY>~Q*Ue3+O5EH+^:*fJYDDDDD$xU9~ f3nJm"""""Rfh)b. 1 N)++TJ8֞T^㫃*5TGRVDDDDDs.mh鵈HpYJBQJ9"""""RĔ{_"KgW^[DDDDDp{z.U:s*oLI1""n‹:@XRzq+""""" fzy}_[WczU2ױJټ26DRfJBM(MHqyv[_AFFDDDD7._HQ)(^JŒc]_$gƑ!d1Zόu[r͌Rȡ0}͌>JGf<Lipkݒ1wۖ&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = docs/user/help ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_doc_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ HELP_ID = voacapgui HELP_FILES = index.docbook \ legal.xml HELP_MEDIA = figures/antenna_chooser.png \ figures/main_window.png \ figures/site_chooser.png \ figures/area_plot_configure.png \ figures/p2p_plot_configure.png \ figures/ssn_tab.png \ figures/area_tab.png \ figures/p2p_tab.png \ figures/system_tab.png HELP_LINGUAS = MANPDF = $(HELP_ID).pdf dist_doc_DATA = $(MANPDF) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/user/help/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/user/help/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_docDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_docDATA .PRECIOUS: Makefile @YELP_HELP_RULES@ @HAVE_DBLATEX_TRUE@$(MANPDF): C/index.docbook @HAVE_DBLATEX_TRUE@ $(DBLATEX) C/index.docbook -o $(MANPDF) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/AUTHORS0000664000175000017500000000013113662771311012012 00000000000000pythonProp was written by; James Watson (HZ1JW / M0DNS) Fernando M. Maresca (LU2DFM) pythonprop-0.30.1/configure0000775000175000017500000036532413736105752012675 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for pythonprop 0.30.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pythonprop' PACKAGE_TARNAME='pythonprop' PACKAGE_VERSION='0.30.1' PACKAGE_STRING='pythonprop 0.30.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS YELP_HELP_RULES XMLLINT ITSTOOL HELP_DIR YELP_LC_DIST YELP_LC_MEDIA_LINKS LN_S HAVE_DBLATEX_FALSE HAVE_DBLATEX_TRUE DBLATEX pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules with_online_help with_help_dir ' ac_precious_vars='build_alias host_alias target_alias PYTHON ITSTOOL XMLLINT' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pythonprop 0.30.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pythonprop] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pythonprop 0.30.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-online-help disable support for online-help --with-help-dir=DIR path where help files are installed Some influential environment variables: PYTHON the Python interpreter ITSTOOL Path to the `itstool` command XMLLINT Path to the `xmllint` command Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pythonprop configure 0.30.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pythonprop $as_me 0.30.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='pythonprop' VERSION='0.30.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3.4" >&5 $as_echo_n "checking whether $PYTHON version is >= 3.4... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '3.4'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "Python interpreter is too old" "$LINENO" 5 fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3.4" >&5 $as_echo_n "checking for a Python interpreter with version >= 3.4... " >&6; } if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else for am_cv_pathless_PYTHON in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '3.4'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 $as_echo "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi # Check for presence of dblatex # Extract the first word of "dblatex", so it can be a program name with args. set dummy dblatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DBLATEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DBLATEX"; then ac_cv_prog_DBLATEX="$DBLATEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DBLATEX="dblatex" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DBLATEX=$ac_cv_prog_DBLATEX if test -n "$DBLATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DBLATEX" >&5 $as_echo "$DBLATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$DBLATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: dblatex not found, skipping build pdf docs." >&5 $as_echo "$as_me: WARNING: dblatex not found, skipping build pdf docs." >&2;} fi if test -n "$DBLATEX"; then HAVE_DBLATEX_TRUE= HAVE_DBLATEX_FALSE='#' else HAVE_DBLATEX_TRUE='#' HAVE_DBLATEX_FALSE= fi # Check whether --with-online-help was given. if test "${with_online_help+set}" = set; then : withval=$with_online_help; else with_online_help=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi YELP_LC_MEDIA_LINKS=true YELP_LC_DIST=true for yelpopt in ; do case $yelpopt in lc-media-links) YELP_LC_MEDIA_LINKS=true ;; no-lc-media-links) YELP_LC_MEDIA_LINKS= ;; lc-dist) YELP_LC_DIST=true ;; no-lc-dist) YELP_LC_DIST= ;; *) as_fn_error $? "Unrecognized YELP_HELP_INIT option $yelpopt\"" "$LINENO" 5 ;; esac done; # Check whether --with-help-dir was given. if test "${with_help_dir+set}" = set; then : withval=$with_help_dir; else with_help_dir='${datadir}/help' fi HELP_DIR="$with_help_dir" # Extract the first word of "itstool", so it can be a program name with args. set dummy itstool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ITSTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ITSTOOL"; then ac_cv_prog_ITSTOOL="$ITSTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ITSTOOL="itstool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ITSTOOL=$ac_cv_prog_ITSTOOL if test -n "$ITSTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ITSTOOL" >&5 $as_echo "$ITSTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$ITSTOOL" = x; then as_fn_error $? "itstool not found" "$LINENO" 5 fi # Extract the first word of "xmllint", so it can be a program name with args. set dummy xmllint; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XMLLINT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XMLLINT"; then ac_cv_prog_XMLLINT="$XMLLINT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XMLLINT="xmllint" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XMLLINT=$ac_cv_prog_XMLLINT if test -n "$XMLLINT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5 $as_echo "$XMLLINT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$XMLLINT" = x; then as_fn_error $? "xmllint not found" "$LINENO" 5 fi YELP_HELP_RULES=' HELP_ID ?= HELP_POT ?= HELP_FILES ?= HELP_EXTRA ?= HELP_MEDIA ?= HELP_LINGUAS ?= _HELP_LINGUAS = $(if $(filter environment,$(origin LINGUAS)),$(filter $(LINGUAS),$(HELP_LINGUAS)),$(HELP_LINGUAS)) _HELP_POTFILE = $(if $(HELP_POT),$(HELP_POT),$(if $(HELP_ID),$(HELP_ID).pot)) _HELP_POFILES = $(if $(HELP_ID),$(foreach lc,$(_HELP_LINGUAS),$(lc)/$(lc).po)) _HELP_MOFILES = $(patsubst %.po,%.mo,$(_HELP_POFILES)) _HELP_C_FILES = $(foreach f,$(HELP_FILES),C/$(f)) _HELP_C_EXTRA = $(foreach f,$(HELP_EXTRA),C/$(f)) _HELP_C_MEDIA = $(foreach f,$(HELP_MEDIA),C/$(f)) _HELP_LC_FILES = $(foreach lc,$(_HELP_LINGUAS),$(foreach f,$(HELP_FILES),$(lc)/$(f))) _HELP_LC_STAMPS = $(foreach lc,$(_HELP_LINGUAS),$(lc)/$(lc).stamp) _HELP_DEFAULT_V = $(if $(AM_DEFAULT_VERBOSITY),$(AM_DEFAULT_VERBOSITY),1) _HELP_V = $(if $(V),$(V),$(_HELP_DEFAULT_V)) _HELP_LC_VERBOSE = $(_HELP_LC_VERBOSE_$(_HELP_V)) _HELP_LC_VERBOSE_ = $(_HELP_LC_VERBOSE_$(_HELP_DEFAULT_V)) _HELP_LC_VERBOSE_0 = @echo " GEN "$(dir $@); all: $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) $(_HELP_LC_FILES) $(_HELP_POFILES) .PHONY: pot pot: $(_HELP_POTFILE) $(_HELP_POTFILE): $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) $(AM_V_GEN)if test -d "C"; then d=; else d="$(srcdir)/"; fi; \ $(ITSTOOL) -o "$@" $(foreach f,$(_HELP_C_FILES),"$${d}$(f)") .PHONY: repo repo: $(_HELP_POTFILE) $(AM_V_at)for po in $(_HELP_POFILES); do \ if test "x$(_HELP_V)" = "x0"; then echo " GEN $${po}"; fi; \ msgmerge -q -o "$${po}" "$${po}" "$(_HELP_POTFILE)"; \ done $(_HELP_POFILES): $(AM_V_at)if ! test -d "$(dir $@)"; then mkdir "$(dir $@)"; fi $(AM_V_at)if test ! -f "$@" -a -f "$(srcdir)/$@"; then cp "$(srcdir)/$@" "$@"; fi $(AM_V_GEN)if ! test -f "$@"; then \ (cd "$(dir $@)" && \ $(ITSTOOL) -o "$(notdir $@).tmp" $(_HELP_C_FILES) && \ mv "$(notdir $@).tmp" "$(notdir $@)"); \ else \ (cd "$(dir $@)" && \ $(ITSTOOL) -o "$(notdir $@).tmp" $(_HELP_C_FILES) && \ msgmerge -o "$(notdir $@)" "$(notdir $@)" "$(notdir $@).tmp" && \ rm "$(notdir $@).tmp"); \ fi $(_HELP_MOFILES): %.mo: %.po $(AM_V_at)if ! test -d "$(dir $@)"; then mkdir "$(dir $@)"; fi $(AM_V_GEN)msgfmt -o "$@" "$<" $(_HELP_LC_FILES): $(_HELP_LINGUAS) $(_HELP_LINGUAS): $(_HELP_LC_STAMPS) $(_HELP_LC_STAMPS): %.stamp: %.mo $(_HELP_LC_STAMPS): $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(AM_V_at)if ! test -d "$(dir $@)"; then mkdir "$(dir $@)"; fi $(_HELP_LC_VERBOSE)if test -d "C"; then d="../"; else d="$(abs_srcdir)/"; fi; \ mo="$(dir $@)$(patsubst %/$(notdir $@),%,$@).mo"; \ if test -f "$${mo}"; then mo="../$${mo}"; else mo="$(abs_srcdir)/$${mo}"; fi; \ (cd "$(dir $@)" && $(ITSTOOL) -m "$${mo}" $(foreach f,$(_HELP_C_FILES),$${d}/$(f))) && \ touch "$@" .PHONY: clean-help mostlyclean-am: $(if $(HELP_ID),clean-help) clean-help: rm -f $(_HELP_LC_FILES) $(_HELP_LC_STAMPS) $(_HELP_MOFILES) EXTRA_DIST ?= EXTRA_DIST += $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) EXTRA_DIST += $(if $(YELP_LC_DIST),$(foreach lc,$(HELP_LINGUAS),$(lc)/$(lc).stamp)) EXTRA_DIST += $(foreach lc,$(HELP_LINGUAS),$(lc)/$(lc).po) EXTRA_DIST += $(foreach f,$(HELP_MEDIA),$(foreach lc,$(HELP_LINGUAS),$(wildcard $(lc)/$(f)))) distdir: distdir-help-files distdir-help-files: $(_HELP_LC_FILES) @for lc in C $(if $(YELP_LC_DIST),$(HELP_LINGUAS)) ; do \ $(MKDIR_P) "$(distdir)/$$lc"; \ for file in $(HELP_FILES); do \ if test -f "$$lc/$$file"; then d=./; else d=$(srcdir)/; fi; \ cp -p "$$d$$lc/$$file" "$(distdir)/$$lc/" || exit 1; \ done; \ done; \ .PHONY: check-help check: check-help check-help: for lc in C $(_HELP_LINGUAS); do \ if test -d "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ for page in $(HELP_FILES); do \ echo "$(XMLLINT) --nonet --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ $(XMLLINT) --nonet --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ done; \ done .PHONY: install-help install-data-am: $(if $(HELP_ID),install-help) install-help: $(_HELP_LC_FILES) @for lc in C $(_HELP_LINGUAS); do \ $(mkinstalldirs) "$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)" || exit 1; \ done @for lc in C $(_HELP_LINGUAS); do for f in $(HELP_FILES); do \ if test -f "$$lc/$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ if ! test -d "$$helpdir"; then $(mkinstalldirs) "$$helpdir"; fi; \ echo "$(INSTALL_DATA) $$d$$lc/$$f $$helpdir`basename $$f`"; \ $(INSTALL_DATA) "$$d$$lc/$$f" "$$helpdir`basename $$f`" || exit 1; \ done; done @for f in $(_HELP_C_EXTRA); do \ lc=`dirname "$$f"`; lc=`basename "$$lc"`; \ if test -f "$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ if ! test -d "$$helpdir"; then $(mkinstalldirs) "$$helpdir"; fi; \ echo "$(INSTALL_DATA) $$d$$f $$helpdir`basename $$f`"; \ $(INSTALL_DATA) "$$d$$f" "$$helpdir`basename $$f`" || exit 1; \ done @for f in $(HELP_MEDIA); do \ for lc in C $(_HELP_LINGUAS); do \ if test -f "$$lc$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ mdir=`dirname "$$f"`; \ if test "x$mdir" = "x."; then mdir=""; fi; \ if ! test -d "$$helpdir$$mdir"; then $(mkinstalldirs) "$$helpdir$$mdir"; fi; \ if test -f "$$d$$lc/$$f"; then \ echo "$(INSTALL_DATA) $$d$$lc/$$f $$helpdir$$f"; \ $(INSTALL_DATA) "$$d$$lc/$$f" "$$helpdir$$f" || exit 1; \ elif test "x$$lc" != "xC"; then \ if test "x$(YELP_LC_MEDIA_LINKS)" != "x"; then \ echo "$(LN_S) -f $(HELP_DIR)/C/$(HELP_ID)/$$f $$helpdir$$f"; \ $(LN_S) -f "$(HELP_DIR)/C/$(HELP_ID)/$$f" "$$helpdir$$f" || exit 1; \ fi; \ fi; \ done; \ done .PHONY: uninstall-help uninstall-am: $(if $(HELP_ID),uninstall-help) uninstall-help: for lc in C $(_HELP_LINGUAS); do for f in $(HELP_FILES); do \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir`basename $$f`"; \ rm -f "$$helpdir`basename $$f`"; \ done; done @for f in $(_HELP_C_EXTRA); do \ lc=`dirname "$$f"`; lc=`basename "$$lc"`; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir`basename $$f`"; \ rm -f "$$helpdir`basename $$f`"; \ done @for f in $(HELP_MEDIA); do \ for lc in C $(_HELP_LINGUAS); do \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir$$f"; \ rm -f "$$helpdir$$f"; \ done; \ done; ' ac_config_files="$ac_config_files Makefile data/Makefile data/voacapgui.desktop docs/user/help/Makefile src/Makefile src/pythonprop/Makefile src/pythonprop/templates/Makefile src/pythonprop/ui/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -z "${HAVE_DBLATEX_TRUE}" && test -z "${HAVE_DBLATEX_FALSE}"; then as_fn_error $? "conditional \"HAVE_DBLATEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pythonprop $as_me 0.30.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pythonprop config.status 0.30.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/voacapgui.desktop") CONFIG_FILES="$CONFIG_FILES data/voacapgui.desktop" ;; "docs/user/help/Makefile") CONFIG_FILES="$CONFIG_FILES docs/user/help/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/pythonprop/Makefile") CONFIG_FILES="$CONFIG_FILES src/pythonprop/Makefile" ;; "src/pythonprop/templates/Makefile") CONFIG_FILES="$CONFIG_FILES src/pythonprop/templates/Makefile" ;; "src/pythonprop/ui/Makefile") CONFIG_FILES="$CONFIG_FILES src/pythonprop/ui/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi pythonprop-0.30.1/man/0000775000175000017500000000000013736105755011607 500000000000000pythonprop-0.30.1/man/voaP2PPlot.10000664000175000017500000000566213662771311013563 00000000000000.\" Process this file with .\" groff -man -Tascii voaP2PPlot.1 .\" .TH voaP2PPlot 1 "MAY 2008" Linux "User Manuals" .SH NAME voaP2PPlot \- Plot VOACAP point-to-point predictions .SH SYNOPSIS .B voaP2PPlot [options] aFile .SH DESCRIPTION .B voaP2PPlot A python script used to graphically display the contents of output files produced by VOACAP. .SH OPTIONS .IP "-b band" Where the integer 'band' specifies a band plan to be overlayed on the plot. Supported bandplans are 1:SWL 2:UK Amateur 3:KSA Amateur .IP -c Display contour lines on the image .IP "-f max_frequency" A float used to specify the maximum frequency (MHz) to display, e.g. '-f 20' limits the y-axis to 20MHz. Values must be in the range 5-30MHz Autoscaling may be switched on with the value '-f a'. .IP "-g group" Where group is an integer specifying the group within a file containing multiple groups to plot. Multiple groups must be separated by commas, e.g. '-g 1,3,4' will print groups 1, 3 & 4 .IP -h Prints a help message and quits. .IP "-k, --background" Specify the colour of the background. Any legal HTML color specification is supported e.g '-k red', '-k #eeefff', (default = white) .IP "-l 'label'" Where 'label' is a string printed as a main title at the top of the plot. .IP "-m colour-map" Specifies the colour-map to use. Supported colour maps are 1:Bone, 2:Cool 3:Copper 4:Gray 5:Hot 6:Hsv 7:Jet 8:Pink 9:Spring 10:Summer 11:Winter (default = 8) .IP "-o file-name" Used to specify an output file to save the plot to. The file-name extension defines the output file format. .png/.pdf files are supported. .IP -q Process quietly, don't produce a graph on the screen. This only makes sense when used in conjunction with the -o option. .IP "-r resolution" Specifies the size in Dots per Inch (DPI) of the output image. Default = 150 .IP "-t type" Specifies the type of image to plot. Supported image types are 0:None 1:MUFday 2:REL 3:SNR 4:S DBW (default = 1) .IP "-z time-Zone" Specifies the timezone to shift the plots to. .SH EXAMPLES .IP "voaP2PPlot voacapx.out" Plots the contents of the file voacapx.out. .IP "voaP2PPlot -c -m 3voacapx.out" Plots using colour map 3, adding contour lines to the plot. .IP "voaP2PPlot -b 1 -o plot.pdf voacapx.out" Overlays the plot with the SWL band-plan, saving the plot to the file plot.pdf .IP "voaP2PPlot -t 2 -z 3 voacapx.out" Produces a reliability plot, shifted to a timezone 3 hours ahead of UTC. .SH ENVIRONMENT voaP2PPlot does not require or make use of any environmental variables. The program requires the python library matlibplot to run. .SH BUGS No known bugs, that's probably a sign of incomplete testing rather than a bug free program :-). The program is not very tolerant of incorrect arguments, this will be addressed in future versions. .SH AUTHOR This program was written by James Watson (M0DNS) .SH "ACKNOWLEDGMENTS" Credit and thanks to Jari Perkiomaki, OH6BG (OH6BG) for program testing and suggestions. pythonprop-0.30.1/man/voaAreaPlot.10000664000175000017500000000774313662771311014034 00000000000000.\" Process this file with .\" groff -man -Tascii voaAreaPlot.1 .\" .TH voaAreaPlot 1 "Nov 2009" Linux "User Manuals" .SH NAME voaAreaPlot \- Plot VOACAP Area Data Files .SH SYNOPSIS .B voaAreaPlot [options] file_name .SH DESCRIPTION .B voaAreaPlot A python script used to graphically display the contents of output files produced by VOACAP 'area' calculations. the 'file_name parameter defines the path to a .voa or .vgz file. If a .voa file is specified, the corresponding output files (e.g. '.vg1') must be located in the same directory. .SH OPTIONS .IP "--version" Display the version number and exit. .IP "-c, --contours" Plot contours on the map. .IP "-d DATATYPE, --datatype=DATATYPE" An integer number representing the data type (MUF, REL or SNR) to plot. Valid values of DATATYPE are 1 (MUF), 2 (REL), 3 (SNR) 4 (SNRxx), 5 (SDBW) and 6 (SDBW - formatted as S-Meter values). Default value is 1 (MUF) .IP "--filled-contour" Creates a filled contour plot. .IP "-h, --help" Print a help message and exit. .IP "-i, --meridian" Plot meridians (lines of constant latitude) on the map.. .IP "-k, --background" Specify the colour of the background. Any legal HTML color specification is supported e.g '-k red', '-k #eeefff', (default = white) .IP "-l, --parallels (lines of constant longitude) on the map." Plot parallels. .IP "-m COLOURMAP, --cmap=COLOURMAP" COLOURMAP specifies the Colour map used by the plot. Valid values are; 'autumn', 'bone', 'cool','copper', 'gray', 'hot', 'hsv', 'jet', 'pink', 'spring', 'summer', 'winter'. Default value is 'jet' .IP "-n POI_FILE, --interest=POI_FILE" POI_FILE is a text file with points of interest to plot on the map. The file is comma (,) delimited with a single point of interest on each line in the form "longitude, latitude, text_name". The file format is the same as Garmin's POI csv files. A sample file would look like; .br 36.599998, 28.366667, Tabuk .br 39.183334, 21.700001, Jeddah .br 42.799999, 18.299999, Khamis Mushait .br 40.549999, 21.483334, Taif .br 50.150002, 26.266666, Dahran .IP "-p PROJECTION, --projection=PROJECTION" PROJECTION specifies the map projection. Valid values are 'cyl' (Equidistant Cylindrical), 'mill' (Miller Cylindrical), gall' (Gall Stereographic), 'robin' (Robinson), 'vandg' (van der Grinten), 'sinu' (Sinusoidal), 'mbtfpq' (McBryde-Thomas Flat Polar Quartic), 'eck4' (Eckert IV), 'kav7' (Kavrayskiy VII), 'moll' (Mollweide), 'hammer' (Hammer). .IP "-r RESOLUTION, --resolution=RESOLUTION" A single character representing resolution of the final plot. RESOLUTION may be one of 'c' (crude), 'l' (low), 'i' (intermediate), 'h' (high), 'f' (full) .IP "-t, --terminator" Displays the night/day regions on the map. .IP "-v VG_FILES, --vg_files=VG_FILES" VG_FILES specifies which .vg files to plot, e.g. '-v 1,3,5,6' or use '-v a' to print all plots associated with the input file. Default is 1. .IP "-z TIMEZONE, --timezone=TIMEZONE" Specify a timezone. This option adjusts the (UTC) time specified in the datafile to the users local time. .SH EXAMPLES .IP "voaAreaPlot aDataFile.voa" Plots the contents of the file aDataFile.voa using default settings. .IP "voaAreaPlot aZipArchive.vgz" Plots the contents of the .voa file found in the .vgz archive using the default settings. .IP "voaAreaPlot -r i -p mill aDataFile.voa" Plots an intermediate resolution miller projection. .IP "voaAreaPlot -m autumn -p ortho aDataFile.voa" Plots an orthographic projection using the colour map 'autumn'. .SH ENVIRONMENT voaAreaPlot does not require or make use of any environmental variables. The program requires the matlibplot library and basemap toolkit to run. .SH BUGS No major bugs are known. Please submit .voa and .vg* files when submitting bug reports. .SH AUTHOR The application and and man page was written by James Watson (M0DNS / HZ1JW) .SH ACKNOLEDGMENTS I'm indebted to the authors of matplotlib and the basemap toolkit which make plotting complex data sets straight forward and fun :-) Also to Lowell and Alex for beta testing and support. pythonprop-0.30.1/COPYING0000664000175000017500000010451313662771311012006 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pythonprop-0.30.1/README0000664000175000017500000000001713662771311011625 00000000000000See README.md pythonprop-0.30.1/py-compile0000755000175000017500000001110013250314767012743 00000000000000#!/bin/sh # py-compile - Compile a Python program scriptversion=2018-03-07.03; # UTC # Copyright (C) 2000-2018 Free Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if [ -z "$PYTHON" ]; then PYTHON=python fi me=py-compile usage_error () { echo "$me: $*" >&2 echo "Try '$me --help' for more information." >&2 exit 1 } basedir= destdir= while test $# -ne 0; do case "$1" in --basedir) if test $# -lt 2; then usage_error "option '--basedir' requires an argument" else basedir=$2 fi shift ;; --destdir) if test $# -lt 2; then usage_error "option '--destdir' requires an argument" else destdir=$2 fi shift ;; -h|--help) cat <<\EOF Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." Byte compile some python scripts FILES. Use --destdir to specify any leading directory path to the FILES that you don't want to include in the byte compiled file. Specify --basedir for any additional path information you do want to be shown in the byte compiled file. Example: py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py Report bugs to . EOF exit $? ;; -v|--version) echo "$me $scriptversion" exit $? ;; --) shift break ;; -*) usage_error "unrecognized option '$1'" ;; *) break ;; esac shift done files=$* if test -z "$files"; then usage_error "no files given" fi # if basedir was given, then it should be prepended to filenames before # byte compilation. if [ -z "$basedir" ]; then pathtrans="path = file" else pathtrans="path = os.path.join('$basedir', file)" fi # if destdir was given, then it needs to be prepended to the filename to # byte compile but not go into the compiled file. if [ -z "$destdir" ]; then filetrans="filepath = path" else filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" fi $PYTHON -c " import sys, os, py_compile, imp files = '''$files''' sys.stdout.write('Byte-compiling python modules...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() if hasattr(imp, 'get_tag'): py_compile.compile(filepath, imp.cache_from_source(filepath), path) else: py_compile.compile(filepath, filepath + 'c', path) sys.stdout.write('\n')" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, py_compile, imp # pypy does not use .pyo optimization if hasattr(sys, 'pypy_translation_info'): sys.exit(0) files = '''$files''' sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() if hasattr(imp, 'get_tag'): py_compile.compile(filepath, imp.cache_from_source(filepath, False), path) else: py_compile.compile(filepath, filepath + 'o', path) sys.stdout.write('\n')" 2>/dev/null || : # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: pythonprop-0.30.1/ChangeLog0000664000175000017500000000403413616551052012517 000000000000000.30 * Removes the online help. Support for the legacy gnome help system is causing a lot of issues for users and it's removal should streamline the installation process. This is an interim solution, help will be reinstated in anotehr form in the next release. 0.29 * Replaces basemap with cartopy for the geo plotting. * Removes some of the lesser used options from the area plotting script. * Replaces optparse (deprecated) with argparse in the plotting utilities. * Uses the mpl imagegrid to improve the layout of multiple area and p2p plots. * Fixes a bug in the docs makefile that was preventing the legal.xml file from loading. 0.28 * Automake rules have been changed so that we only attempt to build the pdf if dblatex is installed. 0.18 Uses the codecs package to open files to read unicode directly. This permits the use of non-ascii characters in site names. Modifies the way in which we look for the FREQ card in output files to a more robust (and simpler) method that doens't require regex.. 0.17 Revised the order of some of the imports to remove the 'AttributeError: When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject". See: https://bugzilla.gnome.org/show_bug.cgi?id=70918' warning message on new versions fo GTK3(3.14). This has the effect of changing the backend to TkAgg. 0.15 Included a .desktop file for voacapgui that allows the application to be called up directly on the Gnome desktop. This should also work on Unity but has not been tested. Extensively modified the directory structure and build files which now follow a more conventional automake methodology, hopefully making future work much easier to manage. One side effect of this is that the applications now installs to different locations. /usr/local/bin for the wrapper scripts used to start the applications from the command line, /usr/local/lib/python2.7/site-packages/ for the python files and /usr/local/share/pythonprop/ for the UI files and support data files. pythonprop-0.30.1/configure.ac0000775000175000017500000000132213736105511013231 00000000000000AC_INIT(pythonprop, 0.30.1) AM_INIT_AUTOMAKE AM_PATH_PYTHON([3.4]) # Check for presence of dblatex AC_CHECK_PROG(DBLATEX, dblatex, dblatex) if test -z "$DBLATEX"; then AC_MSG_WARN([dblatex not found, skipping build pdf docs.]) fi AM_CONDITIONAL([HAVE_DBLATEX], [test -n "$DBLATEX"]) AC_ARG_WITH([online-help], [AS_HELP_STRING([--without-online-help], [disable support for online-help])], [], [with_online_help=yes]) AC_CONFIG_MACRO_DIR([m4]) YELP_HELP_INIT AC_CONFIG_FILES([ Makefile data/Makefile data/voacapgui.desktop docs/user/help/Makefile src/Makefile src/pythonprop/Makefile src/pythonprop/templates/Makefile src/pythonprop/ui/Makefile ]) AC_OUTPUT pythonprop-0.30.1/src/0000775000175000017500000000000013736105755011623 500000000000000pythonprop-0.30.1/src/voaAreaPlotgui.in0000664000175000017500000000047313736105314015010 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voaAreaPlotgui if __name__ == "__main__": if (len(sys.argv) != 2): print ('Usage: voaAreaPlotgui file_to_plot.voa') sys.exit(2) voaAreaPlotgui.VOAAreaPlotGUI(sys.argv[-1], datadir='@pkgdatadir@') pythonprop-0.30.1/src/voaP2PPlot.in0000664000175000017500000000054613662771311014041 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voaP2PPlot if __name__ == "__main__": if len(sys.argv) >= 2: voaP2PPlot.main(sys.argv[-1], datadir='@pkgdatadir@') else: print ('voaP2PPlot error: No data file specified') print ('voaP2PPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/voaP2PPlotServer.in0000664000175000017500000000055313662771311015226 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voaP2PPlotServer if __name__ == "__main__": if len(sys.argv) >= 2: voaP2PPlotServer.main(sys.argv[-1]) else: print ('voaAreaPlot-server error: No data file specified') print ('voaAreaPlot-server [options] filename') sys.exit(1) pythonprop-0.30.1/src/voaAreaPlot.in0000664000175000017500000000055213662771311014305 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voaAreaPlot if __name__ == "__main__": if len(sys.argv) >= 2: voaAreaPlot.main(sys.argv[-1], datadir='@pkgdatadir@') else: print ('voaAreaPlot error: No data file specified') print ('voaAreaPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/voaP2PPlotgui.in0000664000175000017500000000046713736105314014544 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voaP2PPlotgui if __name__ == "__main__": if (len(sys.argv) != 2): print ('Usage: voaP2PPlotgui file_to_plot.out') sys.exit(2) voaP2PPlotgui.VOAP2PPlotGUI(sys.argv[-1], datadir='@pkgdatadir@') pythonprop-0.30.1/src/voacapgui.in0000664000175000017500000000033113662771311014041 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voacapgui if __name__ == "__main__": voacapgui.main(sys.argv, datadir='@pkgdatadir@', pythonprop_version='@VERSION@') pythonprop-0.30.1/src/voa3DPlot.in0000664000175000017500000000051213662771311013677 00000000000000#!/usr/bin/env python3 import sys sys.path.insert(1, '@pythondir@') from pythonprop import voa3DPlot if __name__ == "__main__": if len(sys.argv) >= 2: voa3DPlot.main(sys.argv[-1]) else: print ('voa3DPlot error: No data file specified') print ('voa3DPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/Makefile.am0000664000175000017500000000313113736105314013564 00000000000000## Process this file with automake to produce Makefile.in ## http://www.micahcarrick.com/tutorials/autotools-tutorial-python-gtk/getting-started.html#section_4 SUBDIRS = pythonprop bin_SCRIPTS=\ voa3DPlot \ voaAreaPlot \ voacapgui \ voaAreaPlotgui \ voaP2PPlot \ voaP2PPlotgui \ voaP2PPlotServer CLEANFILES = $(bin_SCRIPTS) EXTRA_DIST=\ voa3DPlot.in \ voaAreaPlot.in \ voacapgui.in \ voaAreaPlotgui.in \ voaP2PPlot.in \ voaP2PPlotgui.in \ voaP2PPlotServer.in # $(nobase_pkgdata_SCRIPTS) \ # $(nobase_pkgdata_DATA) \ # $(man_MANS) \ # $(bin_SCRIPTS) do_substitution = sed -e 's,[@]pythondir[@],$(pythondir),g' \ -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ -e 's,[@]VERSION[@],$(VERSION),g' voa3DPlot: voa3DPlot.in Makefile $(do_substitution) < $(srcdir)/voa3DPlot.in > voa3DPlot chmod +x voa3DPlot voaAreaPlot: voaAreaPlot.in Makefile $(do_substitution) < $(srcdir)/voaAreaPlot.in > voaAreaPlot chmod +x voaAreaPlot voacapgui: voacapgui.in Makefile $(do_substitution) < $(srcdir)/voacapgui.in > voacapgui chmod +x voacapgui voaAreaPlotgui: voaAreaPlotgui.in Makefile $(do_substitution) < $(srcdir)/voaAreaPlotgui.in > voaAreaPlotgui chmod +x voaAreaPlotgui voaP2PPlot: voaP2PPlot.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlot.in > voaP2PPlot chmod +x voaP2PPlot voaP2PPlotgui: voaP2PPlotgui.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlotgui.in > voaP2PPlotgui chmod +x voaP2PPlotgui voaP2PPlotServer: voaP2PPlotServer.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlotServer.in > voaP2PPlotServer chmod +x voaP2PPlotServer pythonprop-0.30.1/src/pythonprop/0000775000175000017500000000000013736105755014045 500000000000000pythonprop-0.30.1/src/pythonprop/voaAntennaChooser.py0000664000175000017500000001154313662771311017753 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voacapAntennaChooser # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # Dialog box that returns a voaLocation import os import re import sys from gi.repository import Pango try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject except: pass try: from gi.repository import Gtk # import Gtk.glade except: sys.exit(1) from .treefilebrowser import * class VOAAntennaChooser: """GUI to select VOACAP antennas.""" def __init__(self, itshfbc_path=(), size=(), parent=None, datadir=""): self.datadir = datadir self.parent = parent #self.uifile = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "voaAntennaChooser.ui") self.ui_file = os.path.join(self.datadir, "ui", "voaAntennaChooser.ui") #self.wTree = Gtk.Builder.new_from_file(self.ui_file) self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("antenna_chooser_dialog", "preview_textview", "file_tv") self.preview_buffer = self.preview_textview.get_buffer() self.preview_textview.modify_font(Pango.FontDescription("Luxi Mono 8")) if size == (): size = (700,400) #print size[0], size[1] self.antenna_chooser_dialog.set_size_request(size[0], size[1]) self.antenna_chooser_dialog.set_transient_for(self.parent) self.antenna_path = itshfbc_path+os.sep+'antennas' # The tfb and tv aren't really OO at the moment and need tidying up. self.tfb = TreeFileBrowser(root = self.antenna_path, view = self.file_tv) self.file_tv.connect("cursor-changed", self.update_preview) def run(self): """This function runs the antenna selection dialog""" return_code = self.antenna_chooser_dialog.run() try: antenna_file = self.tfb.get_selected() print(antenna_file) f = open(antenna_file) antenna_description = f.readline() testLine = f.readline() f.close() if (testLine.find("parameters") == 9): antenna_description = re.sub('\s+', ' ', antenna_description) antenna_file = os.path.relpath(antenna_file, self.antenna_path) if len(antenna_file) > 21: err_msg_body = "The file path ('{:s}')\nis too long and should be less than 21 characters.\n\nPlease rename the antenna file.".format(antenna_file) err_dialog = Gtk.MessageDialog(self.parent, 0, getattr(Gtk.MessageType, "INFO"), Gtk.ButtonsType.CANCEL, "Filename Too Long") err_dialog.format_secondary_text(err_msg_body) err_dialog.run() err_dialog.destroy() raise ValueError else: antenna_file = None antenna_description = None except: antenna_file = None antenna_description = None self.antenna_chooser_dialog.destroy() #print self.antenna_chooser_dialog.get_size() return return_code, antenna_file, antenna_description, self.antenna_chooser_dialog.get_size() def update_preview(self, file_chooser): filename = self.tfb.get_selected() try: f = open(filename) description = f.readline() params = f.readline().split() if (params[2] == 'parameters'): for i in range(int(params[0])): description = description + f.readline() #description = re.sub(r'\s+', ' ', description) self.preview_buffer.set_text(description) else: self.preview_buffer.set_text('') f.close() except: self.preview_buffer.set_text('') return def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) pythonprop-0.30.1/src/pythonprop/voaMultiPlot.py0000664000175000017500000001304613662771311016775 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: VOAMultiPlot # Version: 121208 # # Copyright (c) 2008 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # A small class to handle multiple plots on a single figure # VOAMultiPlot acts as a layout manager for the plotting. # Eventualy this class will be able to determine the correct font # size etc. for the plots #import matplotlib from matplotlib.figure import Figure from matplotlib.font_manager import FontProperties import math class VOAMultiPlot(Figure): ax = [] # a list to hold all the subplot axes def __init__(self, number_of_subplots): Figure.__init__(self) self.number_of_subplots = number_of_subplots #todo # there has to be an existing class that can hold four points together # Determine how multiple plots will be laid out, 2x1, 3x4 etc. if self.number_of_subplots <= 1: self.num_rows = 1 self.title_fontsize = 12 self.legend_fontsize = 12 self.axes_label_fontsize = 12 self.axes_tick_fontsize = 10 self.main_border_left = 0.05 self.main_border_right = 0.05 self.main_border_lower = 0.05 self.main_border_upper = 0.05 self.subplot_border_left = 0.0 self.subplot_border_right = 0.0 self.subplot_border_lower = 0.05 self.subplot_border_upper = 0.2 elif ((self.number_of_subplots >= 2) and (self.number_of_subplots <= 6 )): self.num_rows = 2 self.title_fontsize = 10 self.legend_fontsize = 10 self.axes_label_fontsize = 10 self.axes_tick_fontsize = 8 self.main_border_left = 0.05 self.main_border_right = 0.05 self.main_border_lower = 0.0 self.main_border_upper = 0.05 self.subplot_border_left = 0.0 self.subplot_border_right = 0.0 self.subplot_border_lower = 0.05 self.subplot_border_upper = 0.05 else: self.num_rows = 3 self.title_fontsize = 8 self.legend_fontsize = 6 self.axes_label_fontsize = 8 self.axes_tick_fontsize = 6 self.main_border_left = 0.05 self.main_border_right = 0.05 self.main_border_lower = 0.1 self.main_border_upper = 0.0 self.subplot_border_left = 0.0 self.subplot_border_right = 0.0 self.subplot_border_lower = 0.0 self.subplot_border_upper = 0.1 self.num_cols = int(math.ceil(float(self.number_of_subplots)/float(self.num_rows))) self.main_axes_width = 1.0 - (self.main_border_left + self.main_border_right) self.main_axes_height = 1.0 - (self.main_border_lower + self.main_border_upper) # Set up grid geometry self.col_width = (self.main_axes_width/self.num_cols) self.row_height = (self.main_axes_height/self.num_rows) self.subplot_width = self.col_width - (self.subplot_border_left + self.subplot_border_right) self.subplot_height = self.row_height - (self.subplot_border_lower + self.subplot_border_upper) def add_subplot(self, plot_number): ax_row_num = math.floor(float(plot_number) / float(self.num_cols)) ax_col_num = plot_number - (ax_row_num * self.num_cols) subplot_x = self.main_border_left + (ax_col_num * self.col_width) + self.subplot_border_left subplot_y = self.main_border_lower + ((self.num_rows-1)-ax_row_num)*self.row_height + self.subplot_border_lower sbplt_ax = self.add_axes([subplot_x, subplot_y, self.subplot_width, self.subplot_height]) self.ax.append(sbplt_ax) return sbplt_ax def set_main_title(self, aTitle): t = self.text(0.5, 0.93, aTitle, \ horizontalalignment='center', \ fontproperties=FontProperties(size=16)) def get_title_fontsize(self): return self.title_fontsize def get_axes_label_fontsize(self): return self.axes_label_fontsize def get_legend_fontsize(self): return self.legend_fontsize def get_axes_tick_fontsize(self): return self.axes_tick_fontsize def get_figure(self): return mainFigure def add_colorbar(self, img_sample, cb_format): # make the colorbar vertical for 1-2 plots, horizontal for everything else # rect = l,b,w,h (left, bottom, width, height) if (self.num_cols == 1): cb_ax = self.add_axes([0.8, 0.2, 0.04, 0.5]) self.colorbar(img_sample, cax=cb_ax, orientation='vertical', format = cb_format) else: cb_ax = self.add_axes([0.1, 0.04, 0.8, 0.04]) self.colorbar(img_sample, cax=cb_ax, orientation='horizontal', format = cb_format) pythonprop-0.30.1/src/pythonprop/voaMeth26Out.py0000664000175000017500000001175113662771311016602 00000000000000#! /usr/bin/env python # -*- coding: UTF-8 -*- # # File: voaOutFile.py # Version: 10Jul09 # # Copyright (c) 2009 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson /at/ mac /dot/ com # import re import sys, getopt import os class VOAMeth26Out: m26_pattern = re.compile(r"^\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+([-+]?\d*\.?\d+)\s*$") new_group_pattern = re.compile(r"^\f.+METHOD 26") # Public accessors def __init__(self, filename, quiet=False): self.filename = filename self.quiet = quiet self.num_groups = 0 # Values are stored values in multidimensional lists self.gmt_list = [] self.muf_list = [] self.hpf_list = [] self.fot_list = [] if os.path.isfile(self.filename): self.parse_file() else: print("Unable to find file: ", self.filename) return """ Returns a list of the times in the file, adjusted by the specified timezone 'tz'. """ def get_hours(self, group=0): return self.gmt_list[group] """ Returns a list of tuples (hour, fot) of the FOT. The list is up to 24 elements long with values correlating to the times returned by get_hours(). """ def get_FOT(self, group=0, tz=0): return self.fot_list[group] def get_FOT_as_tuples(self, group=0, tz=0): return list(zip(self.gmt_list[group], self.fot_list[group])) def get_HPF(self, group=0, tz=0): return self.hpf_list[group] def get_HPF_as_tuples(self, group=0, tz=0): return list(zip(self.gmt_list[group], self.hpf_list[group])) def get_MUF(self, group=0, tz=0): return self.muf_list[group] def get_MUF_as_tuples(self, group=0, tz=0): return list(zip(self.gmt_list[group], self.muf_list[group])) def get_number_groups(self): return len(self.gmt_list) # Internal methods # Method 26 files are all on one page. Each page starts with the line; # CCIR Coefficients METHOD 26 VOACAP L 14.0905W PAGE 1 def parse_file(self): try: with open(self.filename) as f: group_number = -1 for line in f: if self.new_group_pattern.match(line): # Start of a new group self.gmt_list.append([]) self.muf_list.append([]) self.hpf_list.append([]) self.fot_list.append([]) group_number = group_number + 1 if (group_number > -1): match = self.m26_pattern.match(line) if match: # Found a line of values # we should call another prociedure here parse_values() #print line gmt = int(float(match.group(1))) fot = float(match.group(3)) hpf = float(match.group(4)) muf = float(match.group(6)) self.gmt_list[group_number].append(gmt) self.fot_list[group_number].append(fot) self.hpf_list[group_number].append(hpf) self.muf_list[group_number].append(muf) except IOError: print(_("Error opening/reading file "), self.filename) sys.exit(1) finally: if not self.quiet: print("Closing: ", self.filename) ## Used for testing only def main(argv): # parse command line options inputfile = "" try: opts, args = getopt.getopt(argv, "hi:", ["ifile="]) except getopt.error as msg: print(msg) print("for help use --help") sys.exit(2) # process options for o, a in opts: if o in ("-i", "--ifile"): inputfile = a of = VOAMeth26Out(inputfile) for group in range(0, of.get_number_groups()): print("***") print(of.get_MUF(group=group)) for group in range(0, of.get_MUF(group=group)): print(of.get_MUF(group)) if __name__ == "__main__": main(sys.argv[1:]) pythonprop-0.30.1/src/pythonprop/treefilebrowser.py0000664000175000017500000003452713662771311017550 00000000000000# -*- coding: utf-8 -*- """ TreeFileBrowser a tree-like gtk file browser Copyright (C) 2006-2007 Adolfo González Blázquez This library 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 library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. If you find any bugs or have any suggestions email: code@infinicode.org """ # Modified by J. Watson to accept the view as an init argument # Replaced the soon to be deprecated 'dircache' with 'os' # Further modified by J.Watson to implement a directory filter. # Only directories with the specified file type somewhere under them # will be displayed. try: from gi.repository import Gtk from gi.repository import GObject from gi.repository import GdkPixbuf except: raise SystemExit import gi """ todo pygobject if Gtk.pygtk_version < (2, 0): print _("PyGtk 2.0 or later required for this widget") raise SystemExit """ try: from os import path as ospath import os from . import scriptutil #import dircache except: raise SystemExit class TreeFileBrowser(): """ A widget that implements a tree-like file browser, like the one used on Nautilus spatial view in list mode """ __gproperties__ = { 'show-hidden': (GObject.TYPE_BOOLEAN, 'show hidden files', 'show hidden files and folders', False, GObject.PARAM_READWRITE), 'show-only-dirs': (GObject.TYPE_BOOLEAN, 'show only directories', 'show only directories, not files', True, GObject.PARAM_READWRITE), 'rules-hint': (GObject.TYPE_BOOLEAN, 'rules hint', 'show rows background in alternate colors', True, GObject.PARAM_READWRITE), 'root': (GObject.TYPE_STRING, 'initial path', 'initial path selected on tree browser', '/', GObject.PARAM_READWRITE) } #__gsignals__ = { 'row-expanded' : (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_STRING,)), # 'cursor-changed' : (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_STRING,)) #} def __init__(self, root=None, view=None, file_types=None): """ Path is where we want the tree initialized """ #GObject.GObject.__init__(self) self.file_types = file_types self.show_hidden = False self.show_only_dirs = False self.show_rules_hint = True self.root = '/' if root != None and ospath.isdir(root): self.root = root #else: print "%s doesn't exist. Setting root to default %s" % (root, self.root) self.view = self.make_view(view = view) self.create_new() self.view.expand_all() ##################################################### # Accessors and Mutators def do_get_property(self, property): """ GObject get_property method """ if property.name == 'show-hidden': return self.show_hidden elif property.name == 'show-only-dirs': return self.show_only_dirs elif property.name == 'rules-hint': return self.show_rules_hint elif property.name == 'path': return self.root else: raise AttributeError(_('unknown property %s') % property.name) def do_set_property(self, property, value): """ GObject set_property method """ if property.name == 'show-hidden': self.show_hidden = value elif property.name == 'show-only-dirs': self.show_only_dirs = value elif property.name == 'rules-hint': self.show_rules_hint = value elif property.name == 'path': self.root = value else: raise AttributeError(_('unknown property %s') % property.name) def get_view(self): return self.view def set_show_hidden(self, hidden): self.show_hidden = hidden self.create_new() def get_show_hidden(self): return self.show_hidden def set_rules_hint(self, rules): self.show_rules_hint = rules self.view.set_rules_hint(rules) def get_rules_hint(self): return self.show_rules_hint def set_show_only_dirs(self, only_dirs): self.show_only_dirs = only_dirs self.create_new() def get_show_only_dirs(self): return self.show_only_dirs def get_selected(self): """ Returns selected item in browser """ model, iter = self.view.get_selection().get_selected() if iter != None: return model.get_value(iter, 2) else: return None ##################################################### # Callbacks def row_expanded(self, treeview, iter, path): """ CALLBACK: a row is expanded """ model = treeview.get_model() model.set_value(iter, 0, self.get_folder_opened_icon()) self.get_file_list(model, iter, model.get_value(iter,2)) self.remove_empty_child(model, iter) # Send signal with path of expanded row #self.emit('row-expanded', model.get_value(iter,2)) def row_collapsed(self, treeview, iter, path): """ CALLBACK: a row is collapsed """ model = treeview.get_model() model.set_value(iter, 0, self.get_folder_closed_icon()) while model.iter_has_child(iter): child = model.iter_children(iter) model.remove(child) self.add_empty_child(model, iter) def row_activated(self, treeview, path, view_column): """ CALLBACK: row activated using return, double-click, shift-right, etc. """ if treeview.row_expanded(path): treeview.collapse_row(path) else: treeview.expand_row(path, False) def cursor_changed(self, treeview): """ CALLBACK: a new row has been selected """ model, iter = treeview.get_selection().get_selected() # Send signal with path of expanded row # self.emit('cursor-changed', model.get_value(iter,2)) ##################################################### # Directories and files, nodes and icons def set_cursor_on_first_row(self): model = self.view.get_model() iter = model.get_iter_root() path = model.get_path(iter) self.view.set_cursor(path) def set_active_dir(self, directory): rootdir = self.root # Expand root model = self.view.get_model() iter = model.get_iter_root() path = model.get_path(iter) self.view.expand_row(path, False) iter = model.iter_children(iter) # Add trailing / to paths if len(directory) > 1 and directory[-1] != '/': directory += '/' if len(rootdir) > 1 and rootdir[-1] != '/': rootdir += '/' if not ospath.isdir(directory) or not (rootdir in directory) or (directory == rootdir): return False else: # Now we check if the desired dir is valid # Convert the given '/home/user/dir/' to ['/', 'home/', 'user/', 'dir/'] if len(directory) > 1: dirtree = directory.split('/') dirtree.pop(-1) else: dirtree = ['/'] if len(dirtree) > 1: dirtree[0] = '/' for i in range(len(dirtree)-1): dirtree[i+1] = dirtree[i+1] + '/' # Convert root to '/home/user/dir/' to ['/', 'home/', 'user/', 'dir/'] if len(rootdir) > 1: roottree = rootdir.split('/') roottree.pop(-1) else: roottree = ['/'] if len(roottree) > 1: roottree[0] = '/' for i in range(len(roottree)-1): roottree[i+1] = roottree[i+1] + '/' # Check if the dir is in the same path as the desired root long = len(roottree) for i in range(int): if roottree[i] != dirtree[i]: return False # End checking # Star expanding # Count how many iterations we need depth = len(dirtree) - len(roottree) # Expand depends on the rootdir. Ugly ugly hack! if rootdir == '/': exp = 1 else: exp = 2 # Expand baby expand! for i in range(depth): newpath = dirtree[i+exp] val = model.get_value(iter, 1).replace('/','') + '/' while val != newpath: iter = model.iter_next(iter) val = model.get_value(iter, 1).replace('/','') + '/' path = model.get_path(iter) self.view.expand_row(path, False) iter = model.iter_children(iter) # Set the cursor self.view.set_cursor(path) return True def add_empty_child(self, model, iter): """ Adds a empty child to a node. Used when we need a folder that have children to show the expander arrow """ model.insert_before(iter, None) def remove_empty_child(self, model, iter): """ Delete empty child from a node. Used to remove the extra child used to show the expander arrow on folders with children """ newiter = model.iter_children(iter) model.remove(newiter) def get_file_list(self, model, iter, dir): """ Get the file list from a given directory """ ls = os.listdir(dir) ls.sort(key=str.lower) for i in ls: path = ospath.join(dir,i) if ospath.isdir(path) or not self.show_only_dirs : if (ospath.isdir(path) and len(scriptutil.ffind(path, shellglobs=self.file_types))>0) or not ospath.isdir(path): if i[0] != '.' or (self.show_hidden and i[0] == '.'): newiter = model.append(iter) if ospath.isdir(path): icon = self.get_folder_closed_icon() else: icon = self.get_file_icon() model.set_value(newiter, 0, icon) model.set_value(newiter, 1, i) model.set_value(newiter, 2, path) if ospath.isdir(path): try: subdir = os.listdir(path) except: subdir = [] if subdir != []: for i in subdir: if ospath.isdir(ospath.join(path,i)) or not self.show_only_dirs: if i[0] != '.' or (self.show_hidden and i[0] == '.'): self.add_empty_child(model, newiter) break def create_root(self): model = self.view.get_model() if self.root != '/': directory = self.root.split('/')[-1] else: directory = self.root iter = model.insert_before(None, None) model.set_value(iter, 0, self.get_folder_opened_icon()) model.set_value(iter, 1, directory) model.set_value(iter, 2, self.root) iter = model.insert_before(iter, None) return iter def create_new(self): """ Create tree from scratch """ model = self.view.get_model() model.clear() iter = self.create_root() self.get_file_list(self.view.get_model(), iter, self.root) def get_folder_closed_icon(self): """ Returns a pixbuf with the current theme closed folder icon """ icon_theme = Gtk.IconTheme.get_default() try: icon = icon_theme.load_icon("gnome-fs-directory", Gtk.IconSize.MENU, 0) return icon except GObject.GError as exc: print(_("Can't load icon"), exc) return None def get_folder_opened_icon(self): """ Returns a pixbuf with the current theme opened folder icon """ icon_theme = Gtk.IconTheme.get_default() try: icon = icon_theme.load_icon("gnome-fs-directory-accept", Gtk.IconSize.MENU, 0) return icon except GObject.GError as exc: print(_("Can't load icon"), exc) return None def get_file_icon(self): """ Returns a pixbuf with the current theme file icon """ icon_theme = Gtk.IconTheme.get_default() try: icon = icon_theme.load_icon("text-x-generic", Gtk.IconSize.MENU, 0) return icon except GObject.GError as exc: print(_("Can't load icon"), exc) return None ##################################################### # Model def make_view(self, view = None): """ Create the view itself. (Icon, dir name, path) """ model = Gtk.TreeStore(GdkPixbuf.Pixbuf, GObject.TYPE_STRING, GObject.TYPE_STRING) view.set_model(model) view.set_headers_visible(False) view.set_enable_search(True) view.set_reorderable(False) view.set_rules_hint(self.show_rules_hint) view.connect('row-expanded', self.row_expanded) view.connect('row-collapsed', self.row_collapsed) view.connect('row-activated', self.row_activated) view.connect('cursor-changed', self.cursor_changed) col = Gtk.TreeViewColumn() # The icon render_pixbuf = Gtk.CellRendererPixbuf() col.pack_start(render_pixbuf,False) col.add_attribute(render_pixbuf, 'pixbuf', 0) # The dir name render_text = Gtk.CellRendererText() col.pack_start(render_text, False) col.add_attribute(render_text, 'text', 1) view.append_column(col) view.show() return view # End TreeFileBrowser pythonprop-0.30.1/src/pythonprop/voaAreaChooser.py0000664000175000017500000002342313662771311017237 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voaAreaChooser # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # Dialog box that returns a VOAAreaRect defining the area # for the prediction. import os import re import sys import math import cairo from copy import deepcopy from .voaAreaRect import * try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject, Gdk, Gtk, GdkPixbuf except: sys.exit(1) class VOAAreaChooser: """GUI to select tx/rx locations fromVOAArea Input Files""" def __init__(self, rect=VOAAreaRect(), map_size=(), parent=None, datadir=""): self.datadir = datadir self.return_rect = deepcopy(rect) self.map_size = map_size self.startx = 0 self.starty = 0 self.start_lat = 0 self.start_lon = 0 self.img_offset_x = 0 self.img_offset_y = 0 #self.uifile = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "voaAreaChooser.ui") self.ui_file = os.path.join(self.datadir, "ui", "voaAreaChooser.ui") #self.wTree = Gtk.Builder.new_from_file(self.ui_file) self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("area_chooser_dialog", "map_eventbox", "select_all_button", "ne_lat_spinbutton", "ne_lon_spinbutton", "sw_lat_spinbutton", "sw_lon_spinbutton") self.area_chooser_dialog.set_transient_for(parent) #map_file = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "map.jpg") map_file = os.path.join(self.datadir, "ui", "map.jpg") # the original clean pixbuf map self.o_pixbuf = GdkPixbuf.Pixbuf.new_from_file(map_file) w, h = self.o_pixbuf.get_width(), self.o_pixbuf.get_height() #if not self.map_size: self.map_size = (w,h) self.map_image = Gtk.Image.new_from_pixbuf(self.o_pixbuf) self.map_image.set_size_request(w,h) # to shrink to original size (doesn't seem to work with G3) self.map_eventbox.add(self.map_image) self.map_eventbox.set_size_request(w,h) #self.map_image.connect('show', self.resize_image) # this was the expose event in the original # Event signals self.map_eventbox.connect("motion_notify_event", self.motion_notify_event) self.map_eventbox.connect("button_press_event", self.button_press_event) self.map_eventbox.connect("button_release_event", self.button_release_event) self.map_eventbox.connect("size_allocate", self.resize_image) self.map_eventbox.set_events(Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_HINT_MASK) # Setup spinbutton & 'Select All' button events event_dic = { "spinbutton_value_changed" : self.do_spinbutton_value_change, "on_select_all_button_clicked" : self.do_select_all } self.wTree.connect_signals(event_dic) def run(self): """This function sets up and displays a dialog used to specify the prediction area.""" self.map_image.show() self.draw_voaarearect(self.return_rect) #Sets up the map self.update_spinbuttons(self.return_rect) while 1: response = self.area_chooser_dialog.run() if response == -1: continue # -1 response for select_all, dialog remains open self.area_chooser_dialog.destroy() return response, self.return_rect, self.map_size def draw_voaarearect(self, rect): """ A thin wrapper around draw_rect function that accepts VOAAreaRect objects.""" self.startx, self.starty = self.location2map_point(rect.get_sw_lat(), rect.get_sw_lon()) lat, lon = self.location2map_point(rect.get_ne_lat(), rect.get_ne_lon()) self.draw_rect(lat,lon) def draw_rect(self, x, y): # get a clean pixbuf and set it's size as indicated by map_size w,h = self.map_size pixbuf = self.o_pixbuf.scale_simple(w, h, GdkPixbuf.InterpType.BILINEAR) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) cc = cairo.Context(surface) Gdk.cairo_set_source_pixbuf(cc, pixbuf, 0, 0) cc.paint() cc.rectangle(min(x, self.startx), min(y, self.starty), abs(x - self.startx), abs(y - self.starty)) cc.set_source_rgb(1, 0, 0) cc.set_line_width (2) cc.stroke() pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, w, h) self.map_image.set_from_pixbuf(pixbuf) def button_press_event(self, widget, event): # Set the first corner of the rectangle x_max, y_max = self.map_size if event.button == 1: self.set_spinbuttons_sensitive(False) x = event.x - ((self.map_eventbox.get_allocation().width - x_max)/2) self.start_lat, self.start_lon = self.map_point2location(x, event.y) self.startx = int(x) self.starty = int(event.y) self.draw_rect(int(x), int(event.y)) return True def button_release_event(self, widget, event): #indictes the rect is complete. re-enable the #spinbuttons and update return_rect x_max, y_max = self.map_size if event.button == 1: self.set_spinbuttons_sensitive(True) # The following line doesn't seem to be required in Gnome 3.8 but was # necessary when testing in Gnome 3.6 (Ubuntu 13.04) # It can probably be removed in future x = event.x - ((self.map_eventbox.get_allocation().width - x_max)/2.0) lat, lon = self.map_point2location(event.x, event.y) self.return_rect = VOAAreaRect(self.start_lat, self.start_lon, lat, lon) self.update_spinbuttons(self.return_rect) return True def motion_notify_event(self,widget, event): x_max, y_max = self.map_size if event.is_hint: ptr_window, x, y, state = event.window.get_pointer() else: x = event.x y = event.y state = event.get_state() x = x - ((self.map_eventbox.get_allocation().width - x_max)/2) if state & Gdk.ModifierType.BUTTON1_MASK:# and pixmap != None: if ((0 <= x <= x_max) and (0 <= y <= y_max)): self.draw_rect(x, y) return False def set_spinbuttons_sensitive(self, sensitive): self.ne_lat_spinbutton.set_sensitive(sensitive) self.ne_lon_spinbutton.set_sensitive(sensitive) self.sw_lat_spinbutton.set_sensitive(sensitive) self.sw_lon_spinbutton.set_sensitive(sensitive) def resize_image(self, widget, rect): new_w = rect.width new_h = rect.height if self.map_size == (new_w, new_h): return False self.map_size = (new_w, new_h) self.draw_voaarearect(self.return_rect) # this sets up self.map_image return False def location2map_point(self, lat, lon): w,h = self.map_size pw = ((lon + 180.0) / 360.0) * w ph = abs( ((lat - 90.0) / 180.0) * h) return (int(pw), int(ph)) def map_point2location(self, x_coord, y_coord): w,h = self.map_size lon = ((x_coord/w) * 360.0) - 180.0 lat = 90.0 - ((y_coord/h) * 180.0) return (lat,lon) def update_spinbuttons(self, area): sw_lat, sw_lon, ne_lat, ne_lon = area.get_rect() self.sw_lat_spinbutton.set_range(-90.0, ne_lat) self.sw_lon_spinbutton.set_range(-180.0, ne_lon) self.ne_lat_spinbutton.set_range(sw_lat, 90.0) self.ne_lon_spinbutton.set_range(sw_lon, 180.0) self.ne_lat_spinbutton.set_value(ne_lat) self.ne_lon_spinbutton.set_value(ne_lon) self.sw_lat_spinbutton.set_value(sw_lat) self.sw_lon_spinbutton.set_value(sw_lon) def do_spinbutton_value_change(self, widget): value = widget.get_value() if widget == self.sw_lat_spinbutton : self.return_rect.set_sw_lat(value) self.ne_lat_spinbutton.set_range(value, 90.0) elif widget == self.sw_lon_spinbutton : self.return_rect.set_sw_lon(value) self.ne_lon_spinbutton.set_range(value, 180.0) elif widget == self.ne_lat_spinbutton : self.return_rect.set_ne_lat(value) self.sw_lat_spinbutton.set_range(-90.0, value) elif widget == self.ne_lon_spinbutton : self.return_rect.set_ne_lon(value) self.sw_lon_spinbutton.set_range(-180.0, value) self.draw_voaarearect(self.return_rect) def do_select_all(self, widget): self.return_rect = VOAAreaRect(-90.0, -180.0, 90.0, 180.0) self.update_spinbuttons(self.return_rect) def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) pythonprop-0.30.1/src/pythonprop/scriptutil.py0000664000175000017500000002453113662771311016541 00000000000000#!/usr/bin/env python # encoding: utf-8 """ Copyright (c) 2007, Muharem Hrnjadovic All rights reserved. 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 Muharem Hrnjadovic nor the names of other 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. --------------------------------------------------------------------------- Module providing functions commonly used in shell scripting: - ffind() : finds files in a directory tree - ffindgrep(): finds files in a directory tree and matches their content to regular expressions - freplace() : in-place search/replace of files in a directory tree with regular expressions - printr() : prints the results of the ffind()/ffindgrep() functions Please see the documentation strings of the particular functions for detailed information. """ # Copyright: (c) 2007 Muharem Hrnjadovic # created: 15/04/2007 09:31:25 __version__ = "$Id:$" # $HeadURL $ import os, sys, types, re, fnmatch, itertools class ScriptError(Exception): pass def ffind(path, shellglobs=None, namefs=None, relative=True): """ Finds files in the directory tree starting at 'path' (filtered by Unix shell-style wildcards ('shellglobs') and/or the functions in the 'namefs' sequence). The parameters are as follows: - path: starting path of the directory tree to be searched - shellglobs: an optional sequence of Unix shell-style wildcards that are to be applied to the file *names* found - namefs: an optional sequence of functions to be applied to the file *paths* found - relative: a boolean flag that determines whether absolute or relative paths should be returned Please not that the shell wildcards work in a cumulative fashion i.e. each of them is applied to the full set of file *names* found. Conversely, all the functions in 'namefs' * only get to see the output of their respective predecessor function in the sequence (with the obvious exception of the first function) * are applied to the full file *path* (whereas the shell-style wildcards are only applied to the file *names*) Returns a sequence of paths for files found. """ if not os.access(path, os.R_OK): raise ScriptError("cannot access path: '%s'" % path) fileList = [] # result list try: for dir, subdirs, files in os.walk(path): if shellglobs: matched = [] for pattern in shellglobs: filterf = lambda s: fnmatch.fnmatchcase(s, pattern) matched.extend(list(filter(filterf, files))) fileList.extend(['%s%s%s' % (dir, os.sep, f) for f in matched]) else: fileList.extend(['%s%s%s' % (dir, os.sep, f) for f in files]) if not relative: fileList = list(map(os.path.abspath, fileList)) if namefs: for ff in namefs: fileList = list(filter(ff, fileList)) except Exception as e: raise ScriptError(str(e)) return(fileList) def ffindgrep(path, regexl, shellglobs=None, namefs=None, relative=True, linenums=False): """ Finds files in the directory tree starting at 'path' (filtered by Unix shell-style wildcards ('shellglobs') and/or the functions in the 'namefs' sequence) and searches inside these. The parameters are as follows: - path: starting path of the directory tree to be searched - shellglobs: an optional sequence of Unix shell-style wildcards that are to be applied to the file *names* found - namefs: an optional sequence of functions to be applied to the file *paths* found - relative: a boolean flag that determines whether absolute or relative paths should be returned - linenums: turns on line numbers for found files (like grep -n) Additionaly, the file content will be filtered by the regular expressions in the 'regexl' sequence. Each entry in the latter is a - either a string (with the regex definition) - or a tuple with arguments accepted by re.compile() (the re.M and re.S flags will have no effect though) For all the files that pass the file name/content tests the function returns a dictionary where the - key is the file name and the - value is a string with lines filtered by 'regexl' """ fileList = ffind(path, shellglobs=shellglobs, namefs=namefs, relative=relative) if not fileList: return dict() result = dict() try: # first compile the regular expressions ffuncs = [] for redata in regexl: if type(redata) == bytes: ffuncs.append(re.compile(redata).search) elif type(redata) == tuple: ffuncs.append(re.compile(*redata).search) # now grep in the files found for file in fileList: # read file content fhandle = open(file, 'r') fcontent = fhandle.read() fhandle.close() # split file content in lines if linenums: lines = list(zip(itertools.count(1), fcontent.splitlines())) else: lines = fcontent.splitlines() for ff in ffuncs: if linenums: lines = [t for t in lines if ff(t[1])] else: lines = list(filter(ff, lines)) # there's no point in applying the remaining regular # expressions if we don't have any matching lines any more if not lines: break else: # the loop terminated normally; add this file to the # result set if there are any lines that matched if lines: if linenums: result[file] = '\n'.join(["%d:%s" % t for t in lines]) else: result[file] = '\n'.join(map(str, lines)) except Exception as e: raise ScriptError(str(e)) return(result) def freplace(path, regexl, shellglobs=None, namefs=None, bext='.bak'): """ Finds files in the directory tree starting at 'path' (filtered by Unix shell-style wildcards ('shellglobs') and/or the functions in the 'namefs' sequence) and performs an in-place search/replace operation on these. The parameters are as follows: - path: starting path of the directory tree to be searched - shellglobs: an optional sequence of Unix shell-style wildcards that are to be applied to the file *names* found - namefs: an optional sequence of functions to be applied to the file *paths* found - relative: a boolean flag that determines whether absolute or relative paths should be returned Additionally, an in-place search/replace operation is performed on the content of all the files (whose names passed the tests) using the regular expressions in 'regexl'. Please note: 'regexl' is a sequence of 3-tuples, each having the following elements: - search string (Python regex syntax) - replace string (Python regex syntax) - regex flags or 'None' (re.compile syntax) Copies of the modified files are saved in backup files using the extension specified in 'bext'. The function returns the total number of files modified. """ fileList = ffind(path, shellglobs=shellglobs, namefs=namefs) # return if no files found if not fileList: return 0 filesChanged = 0 try: cffl = [] for searchs, replaces, reflags in regexl: # prepare the required regex objects, check whether we need # to pass any regex compilation flags if reflags is not None: regex = re.compile(searchs, reflags) else: regex = re.compile(searchs) cffl.append((regex.subn, replaces)) for file in fileList: # read file content fhandle = open(file, 'r') text = fhandle.read() fhandle.close() substitutions = 0 # unpack the subn() function and the replace string for subnfunc, replaces in cffl: text, numOfChanges = subnfunc(replaces, text) substitutions += numOfChanges if substitutions: # first move away the original file bakFileName = '%s%s' % (file, bext) if os.path.exists(bakFileName): os.unlink(bakFileName) os.rename(file, bakFileName) # now write the new file content fhandle = open(file, 'w') fhandle.write(text) fhandle.close() filesChanged += 1 except Exception as e: raise ScriptError(str(e)) # return the number of files that had some of their content changed return(filesChanged) def printr(results): """ prints the results of ffind()/ffindgrep() in a manner similar to the UNIX find utility """ if type(results) == dict: for f in sorted(results.keys()): sys.stdout.write("%s\n%s\n" % (results[f],f)) else: for f in sorted(results): sys.stdout.write("%s\n" % f) if __name__ == '__main__': pass pythonprop-0.30.1/src/pythonprop/hamlocation.py0000664000175000017500000001452113662771311016633 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: hamocation # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # A small class to encapsulate a 'location' (name, lat, lon) # Support Maidenhead loacators and import math class HamLocation: lon = 0.0 lat = 0.0 name = '' locator = '' SHORT_PATH = 0 LONG_PATH = 1 UNIT_KM = 0 UNIT_MILES = 1 #The following two lists are used fro mapping characters #to numbers in locator calculations lcase_letters = list(map(chr, list(range(97, 123)))) ucase_letters = list(map(chr, list(range(65, 91)))) def __init__(self, lat=0.0, lon=0.0, name='', locator=''): self.name = name self.lat = lat self.lon = lon self.locator = locator if ((self.lat == 0.0) & (self.lon == 0.0) & (self.locator !='')) : # Calculate the lat lon here from the bearing self.lat, self.lon = self.get_latlon_from_locator(self.locator) def get_name(self): return self.name def set_name(self, name='') : self.name = name.strip() def get_latitude(self): return self.lat def set_latitude(self, lat=0.0) : #check bounds self.lat = lat def get_longitude(self): return self.lon def set_longitude(self, lon=0.0): # check bounds self.lon=lon def set_latitude_longitude(self, lat, lon): self.set_latitude(lat) self.set_longitude(lon) def get_latitude_longitude(self): return (self.lat, self.lon) def get_formatted_latitude(self): return "%.3f" % self.lat def get_formatted_longitude(self): return "%.3f" % self.lon def get_formatted_latitude_longitude(self): return (self.get_formatted_latitude(), self.get_formatted_longitude()) def get_locator(self) : return self.get_locator_from_latlon(self.lat, self.lon) def set_locator(self, locator=''): #check it's valid self.locator=locator self.lat, self.lon = self.get_latlon_from_locator(locator) # # Internal methods follow. # # This function is a port from Marco Bersani's loccalc.c def get_latlon_from_locator(self, locator): # todo check the length and if its a valid format locator = locator.upper() lon = -180.0 + self.ucase_letters.index(locator[0]) * 20.0 +\ float(locator[2]) * 2.0 +\ (self.ucase_letters.index(locator[4])+0.5) / 12.0; lat = -90.0 + self.ucase_letters.index(locator[1]) * 10 +\ float(locator[3]) +\ (self.ucase_letters.index(locator[5])+0.5) / 24; return (lat, lon); # This function is a port from Marco Bersani's loccalc.c def get_locator_from_latlon(self, lat=0.0, lon=0.0): lo = (lon+180.0)/20.0 la = (lat+90.0)/10.0 alo = math.floor(lo) bla = math.floor(la) lo = (lo-alo)*10.0 la = (la-bla)*10.0 clo = math.floor(lo) dla = math.floor(la) elo = math.floor((lo-clo)*24.0) fla = math.floor((la-dla)*24.0) return self.ucase_letters[int(alo)] +\ self.ucase_letters[int(bla)] +\ "%d" % clo +\ "%d" % dla +\ self.lcase_letters[int(elo)] +\ self.lcase_letters[int(fla)] # Accepts a HamLocation as the single arguement # Returns a tuple (bearing, distance) # Default unit is kilometres def path_to(self, target_location, unit=UNIT_KM ): #/* ------Subroutine-------------------- # Calculate beam heading and distance # Input : lon1 = Longitude 1 in degrees. # : lat1 = Latitude 1 in degrees. # : lon2 = Longitude 2 in degrees. # : lat2 = Latitude 2 in degrees. # Output: cb = Beam heading in degrees. # di = Distance in kilometers. # dmi = Distance in miles. # ------------------------------------ */ lo1=-self.lon * math.pi/180.0 # Convert degrees to radians la1=self.lat * math.pi/180.0 lo2=-target_location.get_longitude() * math.pi/180.0 la2=target_location.get_latitude() * math.pi/180.0 # Get local earth radius radius=self.local_earth_radius(self.lat) # Calculates distance in km and in miles di = math.acos(math.cos(la1)*math.cos(lo1)*math.cos(la2)*math.cos(lo2)+math.cos(la1)*math.sin(lo1)*math.cos(la2)*math.sin(lo2)+math.sin(la1)*math.sin(la2))*radius if (unit == self.UNIT_MILES): di = di/1.609 # Calculates beam heading x=math.atan2(math.sin(lo1-lo2)*math.cos(la2),math.cos(la1)*math.sin(la2)-math.sin(la1)*math.cos(la2)*math.cos(lo1-lo2))/math.pi*180; if(x<0): cb=x+360 else: cb=x return(cb, di) #-------------- Subroutine ----------------------- #Calculate local earth radius from latitude #Input : lat = Latitude in decimal degrees (+ = North; - = South) #Output: earth radius (km) #------------------------------------------------- def local_earth_radius(self, lat): #Hayford axes (1909) a=6378.388 # earth major axis (km) (equatorial axis) b=6356.912 # earth minor axis (km) (polar axis) esq=(a*a-b*b)/(a*a) #calculates eccentricity^2 la=lat*math.pi/180.0 # convert latitude in radians sla=math.sin(la) # calculates sinus of latitude r=a*math.sqrt(1-esq)/(1-esq*sla*sla); #calculates local radius (km) return r pythonprop-0.30.1/src/pythonprop/voaOutFile.py0000664000175000017500000002041613662771311016412 00000000000000#! /usr/bin/env python # -*- coding: UTF-8 -*- # # File: voaOutFile.py # Version: 10Jul09 # # Copyright (c) 2009 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson /at/ mac /dot/ com # # A small class to encapsulate reads of an 'out' file produced by # voacap. # This file is in the early stages of development. There are a number # of routines in voaP2PPlot that need to be migrated over to here. import os.path import sys, re import numpy as np import codecs class VOAOutFile: filename = '' groups = [] # holds (group_description_str, muf_graph_data) tuples image_re_patterns = ['None', 'MUFday', 'REL', 'SNR', 'S DBW'] def __init__(self, fn, time_zone=0, data_type=0, quiet=True): self.filename = fn self.data_type = data_type self.quiet = quiet self.time_zone = time_zone if os.path.isfile(self.filename): self.parse_file() else: print("Unable to find file: ", self.filename) return def parse_file(self): self.groups = [] muf_pattern = re.compile(r"^\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+([-+]?\d*\.?\d+)\s*$") self.group_pattern = re.compile(r'COMMENT\s+GROUP\s+(\d+)[:\s]+(.*)') image_pattern = re.compile(r'%s\s*$' % self.image_re_patterns[self.data_type]) #print self.image_re_patterns[self.data_type] #float_pattern = re.compile(r"\d+") _current_group = -1 try: self.out_file = codecs.open(self.filename, "r", "utf-8") if not self.quiet: print("Opening: ", self.filename) #Initialise the variables here in case the input file #doesn't contain any 'COMMENT GROUP cards #Thanks to Dhivya Raj for spotting this bug _fot = np.zeros(25, float) _muf = np.zeros(25, float) _hpf = np.zeros(25, float) _image_buffer = np.zeros([29, 25], float) _group_name = '' _group_info = '' for line in self.out_file: _group_match = self.group_pattern.search(line) #start a new group if _group_match: if _current_group > 0: #todo this little block is repeated at the end as well #do the timeshifts when reading in the data if self.time_zone >= 0: _image_buffer[0:,0]=_image_buffer[0:,24] else: _image_buffer[0:,24]=_image_buffer[0:,0] #down to here is repeated.... sort this out before release self.groups.append((_group_name, _group_info, _fot, _muf, _hpf, _image_buffer)) _group_name = '' _group_info = '' #_utc = range(0, 25) _fot = np.zeros(25, float) _muf = np.zeros(25, float) _hpf = np.zeros(25, float) _image_buffer = np.zeros([29, 25], float) _current_group = int(_group_match.group(1)) _group_name = (_group_match.group(1)+': '+_group_match.group(2)).strip() # Wind forward two lines and read in the description for i in np.arange(0,2): next(self.out_file) for i in np.arange(0,6): _group_info = _group_info + next(self.out_file) if line.find("FREQ") == 67: lastFreqLine = line _muf_match = muf_pattern.match(line) if _muf_match: _hour = self.get_adjusted_hour(int(float(_muf_match.group(1)))) _fot[_hour] = float(_muf_match.group(3)) _muf[_hour] = float(_muf_match.group(6)) _hpf[_hour] = float(_muf_match.group(4)) if self.time_zone >= 0: _fot[0] = _fot[-1] _muf[0] = _muf[-1] _hpf[0] = _hpf[-1] else: _muf[-1] = _muf[0] _fot[-1] = _fot[0] _hpf[-1] = _hpf[0] if image_pattern.search(line): freqEntries = lastFreqLine.split() for x in range(0, 12): """Values start at char 11 and are 5 chars wide (we ignore the first value which is the MUF. """ try: val = float(line[11+(5*x):16+(5*x)]) except ValueError: break if float(freqEntries[x+2])>=2.0: _hour = self.get_adjusted_hour(int(float(freqEntries[0]))) _image_buffer[int(float(freqEntries[x+2]))-2][_hour] = val #print("N {:d} {:d} = {:.2f}".format(int(float(freqEntries[x+2])), _hour, val)) """ if image_pattern.search(line): #print line imgEntries = line.split() freqEntries = lastFreqLine.split() for x in np.arange(1, len(imgEntries)): if (float_pattern.search(imgEntries[x]) and (float(freqEntries[x+1])>=2.0)): _hour = self.get_adjusted_hour(int(float(freqEntries[0]))) _image_buffer[int(float(freqEntries[x+1]))-2][_hour] = float(imgEntries[x]) print("O {:d} {:d} = {:.2f}".format(int(float(freqEntries[x+1])), _hour, float(imgEntries[x]))) """ if self.time_zone >= 0: _image_buffer[0:,0]=_image_buffer[0:,24] else: _image_buffer[0:,24]=_image_buffer[0:,0] self.groups.append((_group_name, _group_info, _fot, _muf, _hpf, _image_buffer)) # The following lines require Python 2.5 except IOError: print(_("Error opening/reading file "), self.filename) sys.exit(1) finally: if not self.quiet: print("Closing: ", self.filename) if _current_group == -1: print("****************************************************") print("Warning: No COMMENT GROUP cards found in input file.") print("Please refer to the manpage for correct file format.") print("****************************************************") def get_number_of_groups(self): return len(self.groups) # Returns a list of titles (may be used for populating a combobox) def get_group_titles(self): _titles = [] for (_group_name, _group_info, _fot, _muf, _hpf, _image_buffer) in self.groups: _titles.append(_group_name) return _titles def get_group_data(self, group_number): return self.groups[group_number] def get_reliability_list(self, channel): rel_pattern = re.compile(r" REL\s*$") self.out_file.seek(0) rel_list = [] for line in self.out_file: _group_match = rel_pattern.search(line) #start a new group if _group_match: tokens = line.split() rel_list.append(float(tokens[channel+1])) #print rel_list return rel_list ## Internal Methods follow def get_adjusted_hour(self, hour): hour = hour + self.time_zone if hour > 24: hour = hour - 24 elif hour < 0: hour = hour + 24 return hour pythonprop-0.30.1/src/pythonprop/voaAreaPlot.py0000664000175000017500000006213313662771311016554 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: voaAreaPlot.py # # Copyright (c) 2008 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # import argparse import datetime import gettext import io import locale import math import os import re import sys import zipfile import cartopy.crs as ccrs from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER from cartopy.mpl.geoaxes import GeoAxes import matplotlib import matplotlib.pyplot as plt import matplotlib.ticker as mticker from mpl_toolkits.axes_grid1 import AxesGrid from matplotlib.colors import ListedColormap from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas from matplotlib.font_manager import FontProperties import numpy as np import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from .hamlocation import HamLocation from .voaAreaRect import VOAAreaRect from .voaFile import VOAFile from .voaPlotWindow import * from .vgzArchive import get_base_filename GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install() # https://scitools.org.uk/cartopy/docs/latest/gallery/axes_grid_basic.html#sphx-glr-gallery-axes-grid-basic-py class VOAAreaPlot: IMG_TYPE_DICT = { \ 1:{'plot_type':'MUF', 'title':_('Maximum Usable Frequency (MUF)'), 'min':2, 'max':30, 'y_labels':(2, 5, 10, 15, 20, 25, 30), 'formatter':'frequency_format', 'first_char':27, 'last_char':32}, \ 2:{'plot_type':'REL', 'title':_('Circuit Reliability (%)'), 'min':0, 'max':1, 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 'formatter':'percent_format', 'first_char':98, 'last_char':104}, \ 3:{'plot_type':'SNR', 'title':_('SNR at Receiver (dB)'), 'min':20, 'max':70, 'y_labels':(20, 30, 40, 50, 60, 70), 'formatter':'SNR_format', 'first_char':86, 'last_char':92}, \ 4:{'plot_type':'SNRXX', 'title':_('SNRxx'), 'min':0, 'max':100, 'y_labels':(0, 20, 40, 60, 80, 100), 'formatter':'SNR_format', 'first_char':130, 'last_char':134}, \ 5:{'plot_type':'SDBW', 'title':_('Signal Power'), 'min':-160, 'max':-40, 'y_labels':(-160, -140, -120, -100, -80, -60, -40), 'formatter':'SDBW_format', 'first_char':74, 'last_char':80}, \ 6:{'plot_type':'SMETESNRXXR', 'title':_('S-Meter'), 'min':-151.18, 'max':-43.01, 'y_labels':(-151.18, -139.13, -127.09, -115.05, -103.01, -83.01, -63.01, -43.01), 'formatter':'SMETER_format', 'first_char':74, 'last_char':80} } COLOUR_MAPS = [ _('autumn'), _('bone'), _('cool'), _('copper'), _('gray'), \ _('hot'), _('hsv'), _('jet'), _('pink'), _('spring'), \ _('summer'), _('winter') ] default_font = {'family' : 'sans-serif'} show_subplot_frame = True def __init__(self, in_file, vg_files = [1], data_type = 1, time_zone = 0, color_map = 'portland', face_colour = "white", filled_contours = False, plot_contours = False, plot_meridians = True, plot_parallels = True, plot_nightshade = True, resolution = 'c', #points_of_interest = [], save_file = '', run_quietly = False, dpi = 150, parent = None, datadir=None): self.run_quietly = run_quietly self.dpi=float(dpi) self.datadir = datadir try: plot_parameters = VOAFile((in_file)) plot_parameters.parse_file() except zipfile.BadZipFile as e: if parent is None: print("Invalid .vgz file") sys.exit(1) img_grid_size = plot_parameters.get_gridsize() self.image_defs = VOAAreaPlot.IMG_TYPE_DICT[int(data_type)] """ if len(points_of_interest) > 0: self.points_of_interest.extend(points_of_interest) """ imageBuf = np.zeros([img_grid_size, img_grid_size], float) area_rect = plot_parameters.get_area_rect() # The checks ought to be performed in the area_rect. # Do a few basic sanity checks # #if ( (area_rect.get_sw_lon() < -180) or (area_rect.get_ne_lon() > 180.0) or (area_rect.get_sw_lat() < -90) or (area_rect.get_ne_lat() > 90.0) ): # print "Input file latitudes/longitudes are out of range" # print "-180 < Latitude < 180.0, -90 < Longitude < 90" # sys.exit(1) #if ( (area_rect.get_sw_lon() == area_rect.get_ne_lon()) or (area_rect.get_sw_lat() == area_rect.get_ne_lat()) ): # print "Input file latitudes/longitudes are the same" # print "-180 < Latitude < 180.0, -90 < Longitude < 90" # sys.exit(1) portland = ListedColormap(["#0C3383", "#0b599b","#0a7fb4","#57a18f","#bec255","#f2c438","#f2a638","#ef8235","#e4502a","#d91e1e"]) plt.register_cmap(name='portland', cmap=portland) colMap = color_map projection = ccrs.PlateCarree() axes_class = (GeoAxes,dict(map_projection=projection)) number_of_subplots = len(vg_files) matplotlib.rcParams['axes.edgecolor'] = 'gray' matplotlib.rcParams['axes.facecolor'] = 'white' matplotlib.rcParams['figure.facecolor'] = face_colour #matplotlib.rcParams['figure.figsize'] = (6, 10) matplotlib.rcParams['figure.subplot.hspace'] = 0.45 matplotlib.rcParams['figure.subplot.wspace'] = 0.35 #matplotlib.rcParams['figure.subplot.left'] = 0.8 #matplotlib.rcParams['figure.subplot.right'] = 0.85 colorbar_fontsize = 12 if number_of_subplots <= 1: num_rows = 1 self.main_title_fontsize = 24 matplotlib.rcParams['legend.fontsize'] = 12 matplotlib.rcParams['axes.labelsize'] = 12 matplotlib.rcParams['axes.titlesize'] = 10 matplotlib.rcParams['xtick.labelsize'] = 10 matplotlib.rcParams['ytick.labelsize'] = 10 matplotlib.rcParams['figure.subplot.top'] = 0.8 # single figure plots have a larger title so require more space at the top. elif ((number_of_subplots >= 2) and (number_of_subplots <= 6 )): num_rows = 2 self.main_title_fontsize = 18 matplotlib.rcParams['legend.fontsize'] = 10 matplotlib.rcParams['axes.labelsize'] = 10 matplotlib.rcParams['axes.titlesize'] = 11 matplotlib.rcParams['xtick.labelsize'] = 8 matplotlib.rcParams['ytick.labelsize'] = 8 #self.x_axes_ticks = P.arange(0,25,4) else: num_rows = 3 self.main_title_fontsize = 10 matplotlib.rcParams['legend.fontsize'] = 8 matplotlib.rcParams['axes.labelsize'] = 8 matplotlib.rcParams['axes.titlesize'] = 10 matplotlib.rcParams['xtick.labelsize'] = 6 matplotlib.rcParams['ytick.labelsize'] = 6 #self.x_axes_ticks = P.arange(0,25,4) num_cols = int(math.ceil(float(number_of_subplots)/float(num_rows))) fig = plt.figure() axgr = AxesGrid(fig, 111, axes_class=axes_class, nrows_ncols=(num_rows, num_cols), axes_pad=0.6, cbar_location='right', cbar_mode='single', cbar_pad=0.2, cbar_size='3%', label_mode='') self.main_title_label = fig.suptitle(str(self.image_defs['title']), fontsize=self.main_title_fontsize) #for plot_idx, vg_file in enumerate(vg_files): for plot_idx, ax, vg_file in zip(range(number_of_subplots), axgr, vg_files): points = np.zeros([img_grid_size,img_grid_size], float) lons = np.arange(area_rect.get_sw_lon(), area_rect.get_ne_lon()+0.001,(area_rect.get_ne_lon()-area_rect.get_sw_lon())/float(img_grid_size-1)) lons[-1] = min(180.0, lons[-1]) lats = np.arange(area_rect.get_sw_lat(), area_rect.get_ne_lat()+0.001,(area_rect.get_ne_lat()-area_rect.get_sw_lat())/float(img_grid_size-1)) lats[-1] = min(90.0, lats[-1]) #ax.label_outer() if in_file.endswith('.vgz'): base_filename = get_base_filename(in_file) zf = zipfile.ZipFile(in_file) vgFile = io.TextIOWrapper(zf.open("{:s}.vg{:d}".format(base_filename, vg_file)), 'utf-8') else: vgFile = open("{:s}.vg{:d}".format(os.path.splitext(in_file)[0], vg_file)) pattern = re.compile(r"[a-z]+") for line in vgFile: match = pattern.search( line ) if not match: value = float(line[int(self.image_defs['first_char']):int(self.image_defs['last_char'])]) # TODO Does this need to be normalised here if it's also being done in the plot? value = max(self.image_defs['min'], value) value = min(self.image_defs['max'], value) points[int(line[3:6])-1][int(line[0:3])-1] = value vgFile.close() if 'zf' in locals(): zf.close() ax.set_extent([area_rect.get_sw_lon(), area_rect.get_ne_lon(), area_rect.get_sw_lat(), area_rect.get_ne_lat()], projection) ax.coastlines() lons, lats = np.meshgrid(lons, lats) points = np.clip(points, self.image_defs['min'], self.image_defs['max']) if (filled_contours): im = ax.contourf(lons, lats, points, self.image_defs['y_labels'], cmap = colMap, transform=projection) plot_contours = True else: im = ax.pcolormesh(lons, lats, points, vmin = self.image_defs['min'], vmax = self.image_defs['max'], cmap = colMap, transform=projection) if plot_contours: ct = ax.contour(lons, lats, points, self.image_defs['y_labels'][1:], linestyles='solid', linewidths=0.5, colors='k', vmin=self.image_defs['min'], vmax=self.image_defs['max'], transform=projection) if plot_nightshade: self.fill_dark_side(ax, time=plot_parameters.get_daynight_datetime(vg_files[plot_idx]-1), color='black', alpha=0.4) ########################## # Points of interest ########################## """ for location in self.points_of_interest: if area_rect.contains(location.get_latitude(), location.get_longitude()): xpt,ypt = m(location.get_longitude(),location.get_latitude()) ax.plot([xpt],[ypt],'ro') ax.text(xpt+100000,ypt+100000,location.get_name()) """ gl = ax.gridlines(crs=projection, draw_labels=True, linewidth=1, color='black', alpha=0.75) gl.xlabels_top = False gl.xlabels_bottom = False gl.ylabels_left = False gl.ylabels_right = False gl.xlines = False gl.ylines = False if plot_meridians: if (area_rect.get_lon_delta() <= 90.0): meridians = np.arange(-180, 190.0, 10.0) elif (area_rect.get_lon_delta() <= 180.0): meridians = np.arange(-180.0, 210.0, 30.0) else: meridians = np.arange(-180, 240.0, 60.0) gl.xlines = True gl.xlabels_bottom = True gl.xformatter = LONGITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(meridians) if plot_parallels: if (area_rect.get_lat_delta() <= 90.0): parallels = np.arange(-90.0, 120.0, 60.0) else: parallels = np.arange(-90.0, 120.0, 30.0) gl.ylines = True gl.ylabels_right = True gl.yformatter = LATITUDE_FORMATTER gl.ylocator = mticker.FixedLocator(parallels) #add a title title_str = plot_parameters.get_plot_description_string(vg_files[plot_idx]-1, self.image_defs['plot_type'], time_zone=time_zone) if number_of_subplots == 1: title_str = plot_parameters.get_plot_description_string(vg_files[plot_idx]-1, self.image_defs['plot_type'], time_zone=time_zone) #title_str = title_str + "\n" + plot_parameters.get_detailed_plot_description_string(vg_files[plot_idx]-1) else : title_str = plot_parameters.get_minimal_plot_description_string(vg_files[plot_idx]-1, self.image_defs['plot_type'], time_zone=time_zone) self.subplot_title_label = ax.set_title(title_str) # Hide any unused subplots for ax in axgr[number_of_subplots:]: ax.set_visible(False) axgr.cbar_axes[0].colorbar(im, ticks = self.image_defs['y_labels'], format = mticker.FuncFormatter(eval('self.'+self.image_defs['formatter']))) if save_file : plt.savefig(save_file, dpi=self.dpi, facecolor=fig.get_facecolor(), edgecolor='none') #todo this ought to a command line param if not self.run_quietly: gtk_canvas = FigureCanvas(fig) gtk_canvas.show() dia = VOAPlotWindow('pythonProp - ' + self.image_defs['title'], gtk_canvas, parent=parent, datadir=self.datadir) return """ The following routine is taken from; https://scitools.org.uk/cartopy/docs/latest/gallery/aurora_forecast.html """ def sun_pos(self, dt=None): """This function computes a rough estimate of the coordinates for the point on the surface of the Earth where the Sun is directly overhead at the time dt. Precision is down to a few degrees. This means that the equinoxes (when the sign of the latitude changes) will be off by a few days. The function is intended only for visualization. For more precise calculations consider for example the PyEphem package. Parameters ---------- dt: datetime Defaults to datetime.utcnow() Returns ------- lat, lng: tuple of floats Approximate coordinates of the point where the sun is in zenith at the time dt. """ if dt is None: dt = datetime.datetime.utcnow() axial_tilt = 23.4 ref_solstice = datetime.datetime(2016, 6, 21, 22, 22) days_per_year = 365.2425 seconds_per_day = 24*60*60.0 days_since_ref = (dt - ref_solstice).total_seconds()/seconds_per_day lat = axial_tilt*np.cos(2*np.pi*days_since_ref/days_per_year) sec_since_midnight = (dt - datetime.datetime(dt.year, dt.month, dt.day)).seconds lng = -(sec_since_midnight/seconds_per_day - 0.5)*360 return lat, lng """ The following routine is taken from; https://scitools.org.uk/cartopy/docs/latest/gallery/aurora_forecast.html """ def fill_dark_side(self, ax, time=None, *args, **kwargs): """ Plot a fill on the dark side of the planet (without refraction). Parameters ---------- ax : Matplotlib axes The axes to plot on. time : datetime The time to calculate terminator for. Defaults to datetime.utcnow() **kwargs : Passed on to Matplotlib's ax.fill() """ lat, lng = self.sun_pos(time) pole_lng = lng if lat > 0: pole_lat = -90 + lat central_rot_lng = 180 else: pole_lat = 90 + lat central_rot_lng = 0 rotated_pole = ccrs.RotatedPole(pole_latitude=pole_lat, pole_longitude=pole_lng, central_rotated_longitude=central_rot_lng) x = np.empty(360) y = np.empty(360) x[:180] = -90 y[:180] = np.arange(-90, 90.) x[180:] = 90 y[180:] = np.arange(90, -90., -1) ax.fill(x, y, transform=rotated_pole, **kwargs) def percent_format(self, x, pos): return '%(percent)3d%%' % {'percent':x*100} def SNR_format(self, x, pos): return '%3ddB' % x def SDBW_format(self, x, pos): return '%3ddBW' % x """ The values below are derived from material presented at http://www.voacap.com/s-meter.html """ def SMETER_format(self, x, pos): S_DICT = {-151.18:'S1', -145.15:'S2', -139.13:'S3', -133.11:'S4', -127.09:'S5', \ -121.07:'S6', -115.05:'S7', -109.03:'S8', -103.01:'S9', -93.01:'S9+10dB', \ -83.01:'S9+20dB', -73.01:'S9+30dB', -63.01:'S9+40dB', -53.01:'S9+50dB', -43.01:'S9+60dB'} if x in S_DICT: return '%s' % S_DICT[x] #return _('%(value)ddBW (%(s_value)s)') %{'value':x, 's_value':S_DICT[x]} else : return '%3d' % x def frequency_format(self, x, pos): return '%2dMHz' % x def default_format(self, x, pos): return '%d' % x def main(in_file, datadir=None): parser = argparse.ArgumentParser(description="Plot voacap area data") parser.add_argument("in_file", help = _("Path to the .voa file. This should be in the same directory as the associated .vgx files.")) parser.add_argument("-c", "--contours", dest = "plot_contours", action = "store_true", default = False, help = _("Enables contour plotting.") ) parser.add_argument("-d", "--datatype", dest="data_type", default=1, help=_("DATATYPE - an integer number representing the data to plot. Valid values are 1 (MUF), 2 (REL) and 3 3 (SNR) 4 (SNRxx), 5 (SDBW) and 6 (SDBW - formatted as S-Meter values). Default value is 1 (MUF).") ) parser.add_argument("-f", "--filled-contour", dest = "plot_filled_contours", action = "store_true", default = False, help = _("Produces a filled contour plot.") ) parser.add_argument("-i", "--meridian", dest="plot_meridians", action="store_true", default=False, help=_("Plot meridians.")) parser.add_argument("-k", "--background", dest="face_colour", default='white', help=_("Specify the colour of the background. Any legal HTML color specification is supported e.g '-k red', '-k #eeefff' (default = white)")) parser.add_argument("-l", "--parallels", dest="plot_parallels", action="store_true", default=False, help=_("Plot meridians.")) parser.add_argument("-m", "--cmap", dest = "color_map", default = 'jet', choices = [ 'autumn', 'bone', 'cool', 'copper', 'gray', \ 'hot', 'hsv', 'jet', 'pink', 'spring','summer', 'winter', 'portland' ], help=_("COLOURMAP - may be one of 'autumn', 'bone', 'cool', 'copper', 'gray', 'hot', 'hsv', 'jet', 'pink', 'spring', 'summer', 'winter' or 'portland'. Default = 'jet'")) """ parser.add_argument("-n", "--interest", dest = "poi_file", default = '', help = "poi_file is a text file with points to plot on the map.") """ parser.add_argument("-o", "--outfile", dest="save_file", help="Save to FILE.", metavar="FILE") parser.add_argument("-q", "--quiet", dest="run_quietly", action="store_true", default=False, help=_("Process quietly (don't display plot on the screen)")) parser.add_argument("-r", "--resolution", dest="resolution", default = 'c', choices = ['c', 'l', 'i', 'h', 'f'], help=_("RESOLUTION - may be one of 'c' (crude), 'l' (low), 'i' (intermediate), 'h' (high), 'f' (full)")) parser.add_argument("-s", "--size", dest="dpi", default=150, help=_("Dots per inch (dpi) of saved file.")) parser.add_argument("-t", "--terminator", dest="plot_nightshade", action="store_true", default = False, help=_("Plot day/night regions on the map")) parser.add_argument("-v", "--vg_files", dest = "vg_files", default = '1', help=_("VG_FILES number of plots to process, e.g '-v 1,3,5,6' or use '-v a' to print all plots.") ) parser.add_argument("-z", "--timezone", dest="timezone", default=0, help=_("Time zone (integer, default = 0)")) #args = parser.parse_intermixed_args() args = parser.parse_args() #points_of_interest = [] vg_files = [] """ if args.poi_file: try: f = open(args.poi_file, 'r') for line in f: if len(line) > 3: tokens = line.strip().split(',', 2) #lat = float(tokens[1].strip()) #lon = float(tokens[0].strip()) #name = tokens[2].strip() points_of_interest.append(HamLocation(lat = float(tokens[1].strip()), lon = float(tokens[0].strip()), name = tokens[2].strip())) except: print(_("Error reading points of interest file: %s") % args.poi_file) print(sys.exc_info()[0]) points_of_interest = [] else: points_of_interest = [] """ if args.data_type: if int(args.data_type) not in VOAAreaPlot.IMG_TYPE_DICT: print(_("Unrecognised plot type: Defaulting to MUF")) args.dataType = 1 if args.vg_files: args.vg_files.strip() if args.vg_files == 'a': #'all' option see if the file exists and add it to the list for file_num in range (1, 13): if os.path.exists(in_file+'.vg'+str(file_num)): print(_("found: "),(in_file+'.vg'+str(file_num))) vg_files.append(file_num) else: try: if args.vg_files.find(','): vg_files = args.vg_files.split(',') else: vg_files = [args.vg_files] for i in range(0, len(vg_files)): try: vg_files[i] = int(vg_files[i]) except: vg_files.pop(i) if len(vg_files) == 0: print(_("Error reading vg files (1), resetting to '1'")) vg_files = [1] except: print(_("Error reading vg files, resetting to '1'")) vg_files = [1] if args.timezone: time_zone = int(args.timezone) if time_zone > 12: time_zone = 0 if time_zone < -12: time_zone = 0 else : time_zone = 0 VOAAreaPlot(in_file, vg_files = vg_files, data_type = args.data_type, time_zone = time_zone, color_map = args.color_map, face_colour = args.face_colour, filled_contours = args.plot_filled_contours, plot_contours = args.plot_contours, plot_meridians = args.plot_meridians, plot_parallels = args.plot_parallels, plot_nightshade = args.plot_nightshade, resolution = args.resolution, #points_of_interest = points_of_interest, save_file = args.save_file, run_quietly = args.run_quietly, dpi = args.dpi, datadir=datadir) if __name__ == "__main__": if len(sys.argv) >= 2: main(sys.argv[-1]) else: print('voaAreaPlot error: No data file specified') print('voaAreaPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/pythonprop/voaP2PPlot.py0000664000175000017500000004600513736105351016302 00000000000000#!/usr/bin/env python # -*- coding: UTF-8 -*- # # File: voaP2PPlot.py # # Copyright (c) 2007 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson @@ mac.com # # A short script to display the contents of voacapg.out type files # (method 30). # # Examples # './voaP2PPlot -c voacapx.out' plots the contents of the file # named voacapg.out. Adds contours to the image overlay. # # './voaP2PPlot -c -t 2 voacapx.out' prints a REL overlay # # './voaP2PPlot -c -t 2 -m 11 voacapx.out' Uses colourmap 11 (Use -h # to list the available colour maps # # './voaP2PPlot -c -t 2 -o saveFile.png voacapx.out' save plot to # a file named saveFile.png # # './voaP2PPlot -h' - Prints a help message # # './voaP2PPlot.py -c -b 1 voacapx.out' overlay SW bands on the plot # # './voaP2PPlot.py -z 3 voacapx.out' Plots for a timezone of + 3 hours import argparse import math import os import re import sys import matplotlib import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg from matplotlib.figure import Figure from matplotlib.font_manager import FontProperties from matplotlib.ticker import FuncFormatter from mpl_toolkits.axes_grid1 import AxesGrid import numpy as np from .voaOutFile import VOAOutFile from .voaPlotWindow import VOAPlotWindow import gettext import locale GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install() class VOAP2PPlot: """Program to plot .out files produced by voacap""" AUTOSCALE = -1.0 IMG_TYPE_DICT = { 0:{'title':'', 'min':0, 'max':1, 'y_labels':(0), 'formatter':'defaultFormat'}, \ 1:{'title':_('MUF Days (%)'), 'min':0, 'max':1, 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 'formatter':'percent_format'}, \ 2:{'title':_('Circuit Reliability (%)'), 'min':0, 'max':1, 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 'formatter':'percent_format'}, \ 3:{'title':_('SNR at Receiver (dB)'), 'min':20, 'max':70, 'y_labels':(20, 30, 40, 50, 60, 70), 'formatter':'SNR_format'}, \ 4:{'title':_('Signal Strength at Receiver (dBW)'), 'min':-151, 'max':-43, 'y_labels':(-151, -145, -139, -133, -127, -121,-115, -109, -103, -93, -83, -73, -63, -53, -43), 'formatter':'SDBW_format'} } mono_font = {'family' : 'monospace'} #default_font = {'family' : 'sans-serif'} S_LABELS = ['S1', 'S2', 'S3', 'S4', 'S5','S1', 'S2', 'S3', 'S4', 'S5','S1', 'S2', 'S3'] UK_BANDS = [(3.5, 3.8), (7.0, 7.2), (10.1, 10.15), (14.0, 14.35), (18.068, 18.168), \ (21.0, 21.45), (24.8, 24.99), (28.0, 29.7)] SWL_BANDS = [(3.200, 3.400), (3.900, 4.000), (4.750, 5.060), \ (5.950, 6.200), (7.100, 7.300), (9.500, 9.900), (11.650, 12.050), \ (13.600, 13.800), (15.100, 15.600), (17.550, 17.900), \ (18.900, 19.020), (21.450, 21.850), (25.670, 26.100)] KSA_BANDS = [(7.0, 7.2), (14.0, 14.35), (18.068, 18.168), \ (21.0, 21.45), (24.89, 24.99), (28.0, 29.7)] def __init__(self, data_file, plot_groups = [1], data_type = 2, color_map = 'jet', plot_contours = False, face_colour = "white", filled_contours = False, plot_label = "", plot_bands = None, time_zone = 0, plot_max_freq = 30.0, run_quietly = False, save_file = '', dpi=150, parent = None, user_bands=None, datadir=None): """ user_bands - a list of bands to be displayed. """ self.data_type = data_type self.run_quietly = run_quietly self.dpi=dpi self.plot_filled_contours = filled_contours self.df = VOAOutFile(data_file, time_zone=time_zone, data_type=self.data_type, quiet=run_quietly) self.image_defs = self.IMG_TYPE_DICT[self.data_type] self.user_bands = user_bands portland = ListedColormap(["#0C3383", "#0b599b","#0a7fb4","#57a18f","#bec255","#f2c438","#f2a638","#ef8235","#e4502a","#d91e1e"]) matplotlib.cm.register_cmap(name='portland', cmap=portland) if plot_groups[0]=='a': num_grp = self.df.get_number_of_groups() plot_groups = list(range(0,num_grp)) number_of_subplots = len(plot_groups) #matplotlib.rcParams['mpl_toolkits.legacy_colorbar'] = False matplotlib.rcParams['axes.edgecolor'] = 'gray' matplotlib.rcParams['axes.facecolor'] = 'white' matplotlib.rcParams['axes.grid'] = True matplotlib.rcParams['grid.alpha'] = 0.4 matplotlib.rcParams['legend.fancybox'] = True matplotlib.rcParams['legend.shadow'] = True matplotlib.rcParams['figure.subplot.hspace'] = 0.45 matplotlib.rcParams['figure.subplot.wspace'] = 0.35 matplotlib.rcParams['figure.subplot.right'] = 0.85 colorbar_fontsize = 12 if number_of_subplots <= 1: num_rows = 1 self.main_title_fontsize = 24 matplotlib.rcParams['legend.fontsize'] = 12 matplotlib.rcParams['axes.labelsize'] = 12 matplotlib.rcParams['axes.titlesize'] = 8 matplotlib.rcParams['xtick.labelsize'] = 10 matplotlib.rcParams['ytick.labelsize'] = 10 matplotlib.rcParams['figure.subplot.top'] = 0.79 # single figure plots have a larger title so require more space at the top. self.x_axes_ticks = np.arange(0,25,2) elif ((number_of_subplots >= 2) and (number_of_subplots <= 6 )): num_rows = 2 self.main_title_fontsize = 18 matplotlib.rcParams['legend.fontsize'] = 10 matplotlib.rcParams['axes.labelsize'] = 10 matplotlib.rcParams['axes.titlesize'] = 11 matplotlib.rcParams['xtick.labelsize'] = 8 matplotlib.rcParams['ytick.labelsize'] = 8 self.x_axes_ticks = np.arange(0,25,4) else: num_rows = 3 self.main_title_fontsize = 16 matplotlib.rcParams['legend.fontsize'] = 8 matplotlib.rcParams['axes.labelsize'] = 8 matplotlib.rcParams['axes.titlesize'] = 10 matplotlib.rcParams['xtick.labelsize'] = 6 matplotlib.rcParams['ytick.labelsize'] = 6 self.x_axes_ticks = np.arange(0,25,4) num_cols = int(math.ceil(float(number_of_subplots)/float(num_rows))) fig = plt.figure() axgr = AxesGrid(fig, 111, nrows_ncols=(num_rows, num_cols), axes_pad=0.6, cbar_location='right', cbar_mode='single', cbar_pad=0.2, cbar_size='3%', label_mode='') self.main_title_label = fig.suptitle(plot_label+str(self.image_defs['title']), fontsize=self.main_title_fontsize) for ax, chan_grp in zip(axgr, plot_groups): (group_name, group_info, fot, muf, hpf, image_buffer) = self.df.get_group_data(chan_grp) if number_of_subplots > 4: #save a little space by only labelling the outer edges of the plot ax.label_outer() _sign = '+' if (time_zone >= 0) else '' self.x_label = ax.set_xlabel(_('Time (UTC%(sig)s%(tz)s)') % {'sig':_sign, 'tz':time_zone}) self.y_label = ax.set_ylabel(_('Frequency (MHz)')) ## Autoscale y (frequency axis) if (plot_max_freq==self.AUTOSCALE) : y_max = math.ceil(max(muf) / 5.0) * 5.0 y_max = min(plot_max_freq, 30.0) y_max = max(plot_max_freq, 5.0) else : y_max = math.ceil(plot_max_freq / 5.0) * 5.0 image_buffer = image_buffer[0:int(y_max-1),:] y_ticks = [2, 5] for y_tick_value in np.arange(10, y_max+1, 5): y_ticks.append(y_tick_value) ax.plot(list(range(0, 25)), muf,'r-', list(range(0, 25)), fot, 'g-') ax.set_ylim([2, y_max]) ax.set_xticks(self.x_axes_ticks) ax.set_yticks(y_ticks) self.add_legend(ax) title_str = group_info.strip() if number_of_subplots > 1: title_str = self.get_small_title(title_str) self.subplot_title_label = ax.set_title(title_str, multialignment='left', **self.mono_font) if (self.data_type > 0): if (self.plot_filled_contours): im = ax.contourf(image_buffer, self.image_defs['y_labels'], extent=(0, 24, 2, y_max), cmap=color_map) plot_contours =True else: im = ax.imshow(image_buffer, interpolation='bicubic', extent=(0, 24, 2, y_max), origin = 'lower', cmap=color_map, alpha = 0.95, norm = matplotlib.colors.Normalize(clip = False, vmin=self.image_defs['min'], vmax=self.image_defs['max'])) if plot_contours: ax.contour(image_buffer, self.image_defs['y_labels'][1:], extent=(0, 24, 2, y_max), linewidths=1.0, colors='k', alpha=0.6) if plot_bands: for a,b in plot_bands: ax.axhspan(a, b, alpha=0.5, ec='k', fc='k') if self.user_bands: for ch in self.user_bands: ax.axhspan(ch-0.04, ch+0.04, alpha=0.5, ec='0.5', fc='0.5') # Hide any unused subplots for ax in axgr[number_of_subplots:]: ax.set_visible(False) if (self.data_type > 0): axgr.cbar_axes[0].colorbar(im, format = FuncFormatter(eval('self.'+self.image_defs['formatter']))) #for t in self.cb_ax.get_yticklabels(): ### t.set_fontsize(colorbar_fontsize) if save_file : fig.savefig(save_file, dpi=self.dpi, facecolor=fig.get_facecolor(), edgecolor='none') if not self.run_quietly: canvas = FigureCanvasGTK3Agg(fig) canvas.show() dia = VOAPlotWindow('pythonProp - ' + self.image_defs['title'], canvas, parent=parent, dpi=self.dpi, datadir=datadir) return def get_png(self, id): print("creating a png") self.save_plot("test.png") def add_legend(self, ax): leg = ax.legend(('MUF', 'FOT'),ncol=1) leg.get_frame().set_alpha(0.75) return leg #def percentFormat(x, pos): # 'The two args are the value and tick position' # return '%(percent)3d%% (%(days)d days)' % {'percent':x*100, 'days':x*30.0} def percent_format(self, x, pos): return '%(percent)3d%%' % {'percent':x*100} def SNR_format(self, x, pos): return '%3ddB' % x def defaultFormat(self, x, pos): return '%d' % x def SDBW_format(self, x, pos): S_DICT = {-151:'S1', -145:'S2', -139:'S3', -133:'S4', -127:'S5', \ -121:'S6', -115:'S7', -109:'S8', -103:'S9', -93:'S9+10dB', \ -83:'S9+20dB', -73:'S9+30dB', -63:'S9+40dB', -53:'S9+50dB', -43:'S9+60dB'} if x in S_DICT: return _('%(value)ddBW (%(s_value)s)') %{'value':x, 's_value':S_DICT[x]} else : return '%3d' % x def get_small_title(self, title_string): #Mar 2008 SSN = 7. Minimum Angle= 3.000 degrees #RIYADH (AR RIYAD) YORK AZIMUTHS N. MI. KM #24.63 N 46.71 E - 53.96 N 1.08 W 322.62 110.27 2753.7 5099.5 #XMTR 2-30 2-D Table [default/swwhip.voa ] Az=322.6 OFFaz= 0.0 0.005kW #RCVR 2-30 2-D Table [default/swwhip.voa ] Az=110.3 OFFaz=360.0 #3 MHz NOISE = -145.0 dBW REQ. REL = 90% REQ. SNR = 10.0 dB title_lines = title_string.split('\n') #Extract Month / year and SSN tmp_line = title_lines[0].split() tmp_str = tmp_line[0] + ' ' + tmp_line[1] + ' SSN:' + tmp_line[4].rstrip('.') return tmp_str def main(data_file, datadir=None): parser = argparse.ArgumentParser(description="Plot voacap p2p data") parser.add_argument("in_file", help = _("Path to the .out file.")) parser.add_argument("-b", "--band", dest = "plot_bands", choices = ['1', '2', '3'], help = _("Display a band plan indicated by the integer 1, 2 or 3 (e.g. 1:SWL 2:UK AMATEUR BANDS 3:KSA AMATEUR BANDS)")) parser.add_argument("-c", "--contour", dest="plot_contours", default=False, action="store_true", help=_("Print contour lines on the plot")) parser.add_argument("-f", "--freqmax", dest = "y_max", default = '30.0', help=_("Maximum frequency for the Y axis")) parser.add_argument("--filled-contour", dest = "plot_filled_contours", action = "store_true", default = False, help = _("Produces a filled contour plot.") ) parser.add_argument("-g", "--group", dest="plotGroups", default='1', help=_("Group(s) to plot. e.g '-g 1,3,5,6'. (default = 1)")) parser.add_argument("-k", "--background", dest="face_colour", default='white', help=_("Specify the colour of the background. Any legal HTML color specification is supported e.g '-k red', '-k #eeefff', (default = white)")) parser.add_argument("-l", "--label", dest = "plot_label", default = "", help = _("A text label, printed in the main title block")) parser.add_argument("-m", "--cmap", dest="color_map", default='jet', choices = [ 'autumn', 'bone', 'cool', 'copper', 'gray', \ 'hot', 'hsv', 'jet', 'pink', 'spring','summer', 'winter', 'portland' ], help=_("COLOURMAP - may be one of 'autumn', 'bone', 'cool', 'copper', 'gray', 'hot', 'hsv', 'jet', 'pink', 'spring', 'summer', 'winter' or 'portland'. Default = 'jet'")) parser.add_argument("-o", "--outfile", dest="save_file", help="Save to FILE.", metavar="FILE") parser.add_argument("-q", "--quiet", dest="run_quietly", action="store_true", default=False, help=_("Process quietly (don't display plot on the screen)")) parser.add_argument("-r", "--resolution", dest="dpi", default=150, help=_("Dots per inch (dpi) of saved file.")) parser.add_argument("-t", "--datatype", dest="data_type", default=1, help=_("Image type 0:None 1:MUFday 2:REL 3:SNR 4:S DBW (default = 1)")) parser.add_argument("-z", "--timezone", dest="time_zone", default=0, help=_("Time zone (integer, default = 0)")) args = parser.parse_args() if args.data_type: if int(args.data_type) not in VOAP2PPlot.IMG_TYPE_DICT: print(_("Unrecognised plot type: Defaulting to MUF days")) args.data_type = 1 if args.plot_bands: if int(args.plot_bands) == 1: bands = VOAP2PPlot.SWL_BANDS elif int(args.plot_bands) == 2: bands = VOAP2PPlot.UK_BANDS elif int(args.plot_bands) == 3: bands = VOAP2PPlot.KSA_BANDS else: bands = None else: bands = None if args.y_max: if args.y_max == 'a': plot_max_freq = VOAP2PPlot.AUTOSCALE else: try: plot_max_freq = float(args.y_max) except: print(_("-f arguments must be either 'a' or a decimal in the range 5.0 - 30.0")) os._exit(1) plot_max_freq = min(plot_max_freq, 30.0) plot_max_freq = max(plot_max_freq, 5.0) if args.dpi: try: args.dpi=int(args.dpi) except: print("failed to read dpi") args.dpi=150 if args.time_zone: time_zone = int(args.time_zone) if time_zone > 12: time_zone = 0 if time_zone < -12: time_zone = 0 else: time_zone = 0 if args.plotGroups: if args.plotGroups == 'a': plot_groups = ['a'] else: try: if args.plotGroups.find(','): plot_groups = args.plotGroups.split(',') else: plot_groups = [int(args.plotGroups)] #convert to integers for i in range(0, len(plot_groups)): try: plot_groups[i] = int(plot_groups[i])-1 except: plot_groups.pop(i) if len(plot_groups) == 0: print(_("Error reading plot_groups, resetting to '1'")) plot_groups = [0] plot_groups.sort() except: print(_("Error groups, resetting to '1'")) plot_groups = [1] # if len(plot_groups) == 1: # print "%d group has been selected: " % (len(plot_groups)), plot_groups # else: # print "%d groups have been selected: " % (len(plot_groups)), plot_groups plot = VOAP2PPlot(data_file, data_type = int(args.data_type), plot_groups = plot_groups, plot_contours = args.plot_contours, face_colour = args.face_colour, filled_contours = args.plot_filled_contours, plot_label = args.plot_label, color_map= args.color_map, time_zone = time_zone, plot_max_freq = plot_max_freq, plot_bands = bands, run_quietly = args.run_quietly, save_file = args.save_file, dpi = args.dpi, datadir=datadir) if __name__ == "__main__": if len(sys.argv) >= 2: main(sys.argv[-1]) else: print('voaP2PPlot error: No data file specified') print('voaP2PPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/pythonprop/voaP2PPlotServer.py0000664000175000017500000004731213662771311017476 00000000000000#!/usr/bin/env python # -*- coding: UTF-8 -*- # # File: voaP2PPlot.py # # Copyright (c) 2007 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson @@ mac.com # # A short script to display the contents of voacapg.out type files # (method 30). # # Examples # './voaP2PPlot -c voacapx.out' plots the contents of the file # named voacapg.out. Adds contours to the image overlay. # # './voaP2PPlot -c -t 2 voacapx.out' prints a REL overlay # # './voaP2PPlot -c -t 2 -m 11 voacapx.out' Uses colourmap 11 (Use -h # to list the available colour maps # # './voaP2PPlot -c -t 2 -o saveFile.png voacapx.out' save plot to # a file named saveFile.png # # './voaP2PPlot -h' - Prints a help message # # './voaP2PPlot.py -c -b 1 voacapx.out' overlay SW bands on the plot # # './voaP2PPlot.py -z 3 voacapx.out' Plots for a timezone of + 3 hours import sys import re import os import math from optparse import OptionParser import matplotlib matplotlib.use('Agg') from matplotlib.backends.backend_agg import FigureCanvasAgg import matplotlib.backends.backend_agg as agg import matplotlib.transforms as mtransforms from matplotlib.figure import Figure from matplotlib.font_manager import FontProperties from .voaOutFile import * from .voaPlotWindow import * #from voaMultiPlot import * import pylab as P import gettext import locale GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install() class VOAP2PPlot: """Program to plot .out files produced by voacap""" AUTOSCALE = -1.0 IMG_TYPE_DICT = { 0:{'title':'', 'min':0, 'max':1, 'y_labels':(0), 'formatter':'defaultFormat'}, \ 1:{'title':_('MUF Days (%)'), 'min':0, 'max':1, 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 'formatter':'percent_format'}, \ 2:{'title':_('Circuit Reliability (%)'), 'min':0, 'max':1, 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 'formatter':'percent_format'}, \ 3:{'title':_('SNR at Receiver (dB)'), 'min':20, 'max':70, 'y_labels':(20, 30, 40, 50, 60, 70), 'formatter':'SNR_format'}, \ 4:{'title':_('Signal Strength at Receiver (dBW)'), 'min':-151, 'max':-43, 'y_labels':(-151, -145, -139, -133, -127, -121,-115, -109, -103, -93, -83, -73, -63, -53, -43), 'formatter':'SDBW_format'} } mono_font = {'family' : 'monospace'} #default_font = {'family' : 'sans-serif'} S_LABELS = ['S1', 'S2', 'S3', 'S4', 'S5','S1', 'S2', 'S3', 'S4', 'S5','S1', 'S2', 'S3'] UK_BANDS = [(3.5, 3.8), (7.0, 7.2), (10.1, 10.15), (14.0, 14.35), (18.068, 18.168), \ (21.0, 21.45), (24.8, 24.99), (28.0, 29.7)] SWL_BANDS = [(3.200, 3.400), (3.900, 4.000), (4.750, 5.060), \ (5.950, 6.200), (7.100, 7.300), (9.500, 9.900), (11.650, 12.050), \ (13.600, 13.800), (15.100, 15.600), (17.550, 17.900), \ (18.900, 19.020), (21.450, 21.850), (25.670, 26.100)] KSA_BANDS = [(7.0, 7.2), (14.0, 14.35), (18.068, 18.168), \ (21.0, 21.45), (24.89, 24.99), (28.0, 29.7)] def __init__(self, data_file, plot_groups = [1], data_type = 2, color_map = 'jet', plot_contours = False, plot_label = "", plot_bands = None, time_zone = 0, plot_max_freq = 30.0, run_quietly = True, save_file = '', dpi=150, parent = None): self.data_type = data_type self.run_quietly = run_quietly self.dpi=dpi self.df = VOAOutFile(data_file, time_zone=time_zone, data_type=self.data_type, quiet=run_quietly) self.image_defs = self.IMG_TYPE_DICT[self.data_type] color_map = eval('P.cm.' + color_map) if plot_groups[0]=='a': num_grp = self.df.get_number_of_groups() plot_groups = list(range(0,num_grp)) self.subplots = [] number_of_subplots = len(plot_groups) matplotlib.rcParams['axes.edgecolor'] = 'gray' matplotlib.rcParams['axes.facecolor'] = 'white' matplotlib.rcParams['axes.grid'] = True matplotlib.rcParams['figure.facecolor'] = 'white' matplotlib.rcParams['legend.fancybox'] = True matplotlib.rcParams['legend.shadow'] = True matplotlib.rcParams['figure.subplot.hspace'] = 0.45 matplotlib.rcParams['figure.subplot.wspace'] = 0.35 matplotlib.rcParams['figure.subplot.right'] = 0.85 colorbar_fontsize = 12 if number_of_subplots <= 1: self.num_rows = 1 self.main_title_fontsize = 24 matplotlib.rcParams['legend.fontsize'] = 12 matplotlib.rcParams['axes.labelsize'] = 12 matplotlib.rcParams['axes.titlesize'] = 8 matplotlib.rcParams['xtick.labelsize'] = 10 matplotlib.rcParams['ytick.labelsize'] = 10 matplotlib.rcParams['figure.subplot.top'] = 0.79 # single figure plots have a larger title so require more space at the top. self.x_axes_ticks = P.arange(0,25,2) elif ((number_of_subplots >= 2) and (number_of_subplots <= 6 )): self.num_rows = 2 self.main_title_fontsize = 18 matplotlib.rcParams['legend.fontsize'] = 10 matplotlib.rcParams['axes.labelsize'] = 10 matplotlib.rcParams['axes.titlesize'] = 11 matplotlib.rcParams['xtick.labelsize'] = 8 matplotlib.rcParams['ytick.labelsize'] = 8 self.x_axes_ticks = P.arange(0,25,4) else: self.num_rows = 3 self.main_title_fontsize = 16 matplotlib.rcParams['legend.fontsize'] = 8 matplotlib.rcParams['axes.labelsize'] = 8 matplotlib.rcParams['axes.titlesize'] = 10 matplotlib.rcParams['xtick.labelsize'] = 6 matplotlib.rcParams['ytick.labelsize'] = 6 self.x_axes_ticks = P.arange(0,25,4) self.num_cols = int(math.ceil(float(number_of_subplots)/float(self.num_rows))) self.fig=Figure(figsize=(7,6.5)) self.main_title_label = self.fig.suptitle(plot_label+str(self.image_defs['title'],'utf-8'), fontsize=self.main_title_fontsize) for chan_grp in plot_groups: (group_name, group_info, fot, muf, hpf, image_buffer) = self.df.get_group_data(chan_grp) ax = self.fig.add_subplot(self.num_rows, self.num_cols, plot_groups.index(chan_grp)+1) self.subplots.append(ax) if number_of_subplots > 4: #save a little space by only labelling the outer edges of the plot ax.label_outer() _sign = '+' if (time_zone >= 0) else '' self.x_label = ax.set_xlabel(_('Time (UTC%(sig)s%(tz)s)') % {'sig':_sign, 'tz':time_zone}) self.y_label = ax.set_ylabel(_('Frequency (MHz)')) ## Autoscale y (frequency axis) if (plot_max_freq==self.AUTOSCALE) : y_max = math.ceil(max(muf) / 5.0) * 5.0 y_max = min(plot_max_freq, 30.0) y_max = max(plot_max_freq, 5.0) else : y_max = math.ceil(plot_max_freq / 5.0) * 5.0 #resize the image image_buffer = image_buffer[0:y_max-1,:] y_ticks = [2, 5] for y_tick_value in P.arange(10, y_max+1, 5): y_ticks.append(y_tick_value) #The line below has been modified to omit plottinf the fot ax.plot(list(range(0, 25)), muf,'r-') ax.set_ylim([2, y_max]) ax.set_xticks(self.x_axes_ticks) ax.set_yticks(y_ticks) #self.add_legend(ax) title_str = group_info.strip() if number_of_subplots > 1: title_str = self.get_small_title(title_str) self.subplot_title_label = ax.set_title(title_str, multialignment='left', **self.mono_font) if (self.data_type > 0): im = ax.imshow(image_buffer, interpolation='bicubic', extent=(0, 24, 2, y_max), origin = 'lower', cmap=color_map, alpha = 0.95, norm = P.Normalize(clip = False, vmin=self.image_defs['min'], vmax=self.image_defs['max'])) if plot_contours: ax.contour(image_buffer, self.image_defs['y_labels'], extent=(0, 24, 2, y_max), linewidths=1.0, colors='k', alpha=0.6) if plot_bands: for a,b in plot_bands: ax.axhspan(a, b, alpha=0.5, ec='k', fc='k') if (self.data_type > 0): self.cb_ax = self.fig.add_axes(self.get_cb_axes()) self.fig.colorbar(im, cax=self.cb_ax, orientation='vertical', format = P.FuncFormatter(eval('self.'+self.image_defs['formatter']))) for t in self.cb_ax.get_yticklabels(): t.set_fontsize(colorbar_fontsize) canvas = FigureCanvasAgg(self.fig) self.fig.canvas.mpl_connect('draw_event', self.on_draw) #canvas.show() if save_file : self.save_plot(canvas, save_file) #if not self.run_quietly: # todo consider using a scrolled pane here... #dia = VOAPlotWindow('pythonProp - ' + self.image_defs['title'], canvas, parent, dpi=self.dpi) #return def on_draw(self, event): #print 'drawing' top = self.fig.subplotpars.top bottom = self.fig.subplotpars.bottom hspace = self.fig.subplotpars.hspace wspace = self.fig.subplotpars.wspace needs_adjusting = False # Calculate the area required at the top of the plot # (Main title and subplot title) subplot_title_height = 0 main_title_height = 0 for subplot in self.subplots: if subplot.is_first_row(): bbox = subplot.title.get_window_extent() transformed_bbox = bbox.inverse_transformed(self.fig.transFigure) subplot_title_height = max(transformed_bbox.height, subplot_title_height) #print 'title = ', self.fig.get_label() bbox = self.main_title_label.get_window_extent() main_title_height = bbox.inverse_transformed(self.fig.transFigure).height preferred_top_space = 1.25*(subplot_title_height + main_title_height) if ((1 - top) < preferred_top_space) or (((1 - top) - preferred_top_space)>0.11): top = 0.99 - preferred_top_space needs_adjusting = True if needs_adjusting: #print 'adjusting' #todo if the colorbar dosn't exist, ignore this. self.fig.subplots_adjust(top = top, bottom = bottom, hspace = hspace, wspace = wspace) self.cb_ax.set_position(self.get_cb_axes()) self.fig.canvas.draw() return False def add_legend(self, ax): leg = ax.legend(('MUF', 'FOT'),ncol=1) leg.get_frame().set_alpha(0.75) return leg def save_plot(self, canvas, filename=None): #canvas.print_figure(filename, dpi=150, facecolor='white', edgecolor='white') self.fig.savefig(filename, dpi=self.dpi, facecolor='white', edgecolor='white') def get_cb_axes(self): # an equivalent of get_tightbox would be really useful here... #bbox = self.subplots[0].get_window_extent() bbox = self.subplots[0].get_yaxis().get_clip_box() axis_upper_y = bbox.inverse_transformed(self.fig.transFigure).ymax bbox = self.subplots[-1].get_window_extent() axis_lower_y = bbox.inverse_transformed(self.fig.transFigure).ymin return [0.9, axis_lower_y, 0.02, axis_upper_y-axis_lower_y] #def percentFormat(x, pos): # 'The two args are the value and tick position' # return '%(percent)3d%% (%(days)d days)' % {'percent':x*100, 'days':x*30.0} def percent_format(self, x, pos): return '%(percent)3d%%' % {'percent':x*100} def SNR_format(self, x, pos): return '%3ddB' % x def defaultFormat(self, x, pos): return '%d' % x def SDBW_format(self, x, pos): S_DICT = {-151:'S1', -145:'S2', -139:'S3', -133:'S4', -127:'S5', \ -121:'S6', -115:'S7', -109:'S8', -103:'S9', -93:'S9+10dB', \ -83:'S9+20dB', -73:'S9+30dB', -63:'S9+40dB', -53:'S9+50dB', -43:'S9+60dB'} if x in S_DICT: return _('%(value)ddBW (%(s_value)s)') %{'value':x, 's_value':S_DICT[x]} else : return '%3d' % x def get_small_title(self, title_string): #Mar 2008 SSN = 7. Minimum Angle= 3.000 degrees #RIYADH (AR RIYAD) YORK AZIMUTHS N. MI. KM #24.63 N 46.71 E - 53.96 N 1.08 W 322.62 110.27 2753.7 5099.5 #XMTR 2-30 2-D Table [default/swwhip.voa ] Az=322.6 OFFaz= 0.0 0.005kW #RCVR 2-30 2-D Table [default/swwhip.voa ] Az=110.3 OFFaz=360.0 #3 MHz NOISE = -145.0 dBW REQ. REL = 90% REQ. SNR = 10.0 dB title_lines = title_string.split('\n') #Extract Month / year and SSN tmp_line = title_lines[0].split() tmp_str = tmp_line[0] + ' ' + tmp_line[1] + ' SSN:' + tmp_line[4].rstrip('.') return tmp_str def main(data_file): parser = OptionParser(usage=_("%voaP2PPlot [options] file"), version="%voaP2PPlot 0.9") #tested ok parser.add_option("-b", "--band", dest = "plot_bands", choices = ['1', '2', '3'], help = _("Display a band plan indicated by the integer 1, 2 or 3 (e.g. 1:SWL 2:UK AMATEUR BANDS 3:KSA AMATEUR BANDS)")) parser.add_option("-c", "--contour", dest="plot_contours", default=False, action="store_true", help=_("Print contour lines on the plot")) parser.add_option("-f", "--freqmax", dest = "y_max", default = '30.0', help=_("Maximum frequency for the Y axis")) parser.add_option("-g", "--group", dest="plotGroups", default='1', help=_("Group(s) to plot. e.g '-g 1,3,5,6'. (default = 1)")) parser.add_option("-l", "--label", dest = "plot_label", default = "", help = _("A text label, printed in the main title block")) parser.add_option("-m", "--cmap", dest="color_map", default='jet', choices = [ 'autumn', 'bone', 'cool', 'copper', 'gray', \ 'hot', 'hsv', 'jet', 'pink', 'spring','summer', 'winter' ], help=_("COLOURMAP - may be one of 'autumn', 'bone', 'cool', 'copper', 'gray', 'hot', 'hsv', 'jet', 'pink', 'spring', 'summer', 'winter'. Default = 'jet'")) parser.add_option("-o", "--outfile", dest="save_file", help="Save to FILE.", metavar="FILE") parser.add_option("-q", "--quiet", dest="run_quietly", action="store_true", default=False, help=_("Process quietly (don't display plot on the screen)")) parser.add_option("-r", "--resolution", dest="dpi", default=150, help=_("Dots per inch (dpi) of saved file.")) parser.add_option("-t", "--datatype", dest="data_type", default=1, help=_("Image type 0:None 1:MUFday 2:REL 3:SNR 4:S DBW (default = 1)")) parser.add_option("-z", "--timezone", dest="time_zone", default=0, help=_("Time zone (integer, default = 0)")) (options, args) = parser.parse_args() if options.data_type: if int(options.data_type) not in VOAP2PPlot.IMG_TYPE_DICT: print(_("Unrecognised plot type: Defaulting to MUF days")) options.data_type = 1 if options.plot_bands: if int(options.plot_bands) == 1: bands = VOAP2PPlot.SWL_BANDS elif int(options.plot_bands) == 2: bands = VOAP2PPlot.UK_BANDS elif int(options.plot_bands) == 3: bands = VOAP2PPlot.KSA_BANDS else: bands = None else: bands = None if options.y_max: if options.y_max == 'a': plot_max_freq = VOAP2PPlot.AUTOSCALE else: try: plot_max_freq = float(options.y_max) except: print(_("-f arguments must be either 'a' or a decimal in the range 5.0 - 30.0")) os._exit(1) plot_max_freq = min(plot_max_freq, 30.0) plot_max_freq = max(plot_max_freq, 5.0) if options.dpi: try: options.dpi=int(options.dpi) except: print("failed to read dpi") options.dpi=150 if options.time_zone: time_zone = int(options.time_zone) if time_zone > 12: time_zone = 0 if time_zone < -12: time_zone = 0 else: time_zone = 0 if options.plotGroups: if options.plotGroups == 'a': plot_groups = ['a'] else: try: if options.plotGroups.find(','): plot_groups = options.plotGroups.split(',') else: plot_groups = [int(options.plotGroups)] #convert to integers for i in range(0, len(plot_groups)): try: plot_groups[i] = int(plot_groups[i])-1 except: plot_groups.pop(i) if len(plot_groups) == 0: print(_("Error reading plot_groups, resetting to '1'")) plot_groups = [0] plot_groups.sort() except: print(_("Error groups, resetting to '1'")) plot_groups = [1] # if len(plot_groups) == 1: # print "%d group has been selected: " % (len(plot_groups)), plot_groups # else: # print "%d groups have been selected: " % (len(plot_groups)), plot_groups plot = VOAP2PPlot(data_file, data_type = int(options.data_type), plot_groups = plot_groups, plot_contours = options.plot_contours, plot_label = options.plot_label, color_map=options.color_map, time_zone = time_zone, plot_max_freq = plot_max_freq, plot_bands = bands, run_quietly = options.run_quietly, save_file = options.save_file, dpi = options.dpi) if __name__ == "__main__": if len(sys.argv) >= 2: main(sys.argv[-1]) else: print('voaP2PPlot error: No data file specified') print('voaP2PPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/pythonprop/voaPlotFilePrinter.py0000664000175000017500000001143513662771311020126 00000000000000#!/usr/bin/env python # -*- Mode: Python; py-indent-offset: 4 -*- # vim: tabstop=4 shiftwidth=4 expandtab # # Copyright (C) 2010 Red Hat, Inc., John (J5) Palmieri # # The original file has been tailored to printing voacap output files # incorporating hard-coded page breaks. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 # USA # The original version of this file may be found at; # https://github.com/GNOME/pygobject/blob/master/demos/gtk-demo/demos/printing.py """" printing pngs with python http://stackoverflow.com/questions/10983739/how-to-composite-multiple-png-into-a-single-png-using-gtk-cairo """ import gi gi.require_version('PangoCairo', '1.0') from gi.repository import Gtk, Gdk, GLib, Pango, PangoCairo import math import os # TODO which version of cairo...? import cairo from io import BytesIO class VOAPlotFilePrinter: #HEADER_HEIGHT = 10 * 72 / 25.4 #HEADER_GAP = 3 * 72 / 25.4 def __init__(self, canvas): self.operation = Gtk.PrintOperation() print_data = {'canvas': canvas, 'font_size': 10.0, 'lines': None, 'num_pages': 0 } self.operation.connect('begin-print', self.begin_print, print_data) self.operation.connect('draw-page', self.draw_page, print_data) self.operation.connect('end-print', self.end_print, print_data) self.operation.set_use_full_page(False) self.operation.set_unit(Gtk.Unit.POINTS) self.operation.set_embed_page_setup(True) settings = Gtk.PrintSettings() dir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS) if dir is None: dir = GLib.get_home_dir() if settings.get(Gtk.PRINT_SETTINGS_OUTPUT_FILE_FORMAT) == 'ps': ext = '.ps' elif settings.get(Gtk.PRINT_SETTINGS_OUTPUT_FILE_FORMAT) == 'svg': ext = '.svg' else: ext = '.pdf' #base_name = os.path.splitext(os.path.basename(out_file_path))[0] uri = "file://{:s}/plot{:s}".format(dir, ext) settings.set(Gtk.PRINT_SETTINGS_OUTPUT_URI, uri) self.operation.set_print_settings(settings) def run(self, parent=None): result = self.operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, parent) if result == Gtk.PrintOperationResult.ERROR: message = self.operation.get_error() dialog = Gtk.MessageDialog(parent, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, message) dialog.run() dialog.destroy() def begin_print(self, operation, print_ctx, print_data): png_buffer = BytesIO() print_data['canvas'].print_figure(png_buffer, facecolor='white', edgecolor='white') print_data['png_buffer'] = png_buffer operation.set_n_pages(1) def draw_page(self, operation, print_ctx, page_num, print_data): cr = print_ctx.get_cairo_context() width = print_ctx.get_width() height = print_ctx.get_height() layout = print_ctx.create_pango_layout() print_data['png_buffer'].seek(0) plot_surface = cairo.ImageSurface.create_from_png(print_data['png_buffer']) # calculate proportional scaling # Thanks to # http://stackoverflow.com/questions/7145780/pycairo-how-to-resize-and-position-an-image plot_height = plot_surface.get_height() plot_width = plot_surface.get_width() width_ratio = float(width) / float(plot_width) height_ratio = float(height) / float(plot_height) scale_xy = min(height_ratio, width_ratio) cr.scale(scale_xy, scale_xy) cr.set_source_surface(plot_surface) cr.paint() PangoCairo.show_layout(cr, layout) layout = print_ctx.create_pango_layout() def end_print(self, operation, print_ctx, print_data): pass # delete the png here def main(demoapp=None): app = VOAOutFilePrinter('/home/jwatson/itshfbc/run/voacapx.out') GLib.idle_add(app.run, demoapp) Gtk.main() if __name__ == '__main__': main() pythonprop-0.30.1/src/pythonprop/voaDefaults.py0000664000175000017500000000274013662771311016612 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voacapDefaults # Version: 10Jul09 # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # A dictioanary poulated with the defaults for voacap class VOADefaultDictionary(dict): def __init__(self, default=None): dict.__init__(self) self['foe'] = '1.0' self['fof1'] = '1.0' self['fof2'] = '1.0' self['foes'] = '0.0' self['mm_noise'] = '-145' self['min_toa'] = '3.0' self['required_reliability'] = '90' self['required_snr'] = '47' self['mpath'] = '3.0' self['delay'] = '0.1' self['model'] = '0' self['path'] = '0' self['tx_bearing'] = '0.0' self['tx_power'] = '100.0' self['rx_bearing'] = '0.0' pythonprop-0.30.1/src/pythonprop/voaOutFilePrinter.py0000664000175000017500000001325113662771311017755 00000000000000#!/usr/bin/env python # -*- Mode: Python; py-indent-offset: 4 -*- # vim: tabstop=4 shiftwidth=4 expandtab # # Copyright (C) 2010 Red Hat, Inc., John (J5) Palmieri # # The original file has been tailored to printing voacap output files # incorporating hard-coded page breaks. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 # USA # The original version of this file may be found at; # https://github.com/GNOME/pygobject/blob/master/demos/gtk-demo/demos/printing.py import gi gi.require_version('PangoCairo', '1.0') from gi.repository import Gtk, GLib, Pango, PangoCairo import math import os class VOAOutFilePrinter: HEADER_HEIGHT = 10 * 72 / 25.4 HEADER_GAP = 3 * 72 / 25.4 def __init__(self, out_file_path): self.operation = Gtk.PrintOperation() print_data = {'filename': out_file_path, 'font_size': 10.0, 'lines': None, 'num_pages': 0 } self.operation.connect('begin-print', self.begin_print, print_data) self.operation.connect('draw-page', self.draw_page, print_data) self.operation.connect('end-print', self.end_print, print_data) self.operation.set_use_full_page(False) self.operation.set_unit(Gtk.Unit.POINTS) self.operation.set_embed_page_setup(True) settings = Gtk.PrintSettings() dir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS) if dir is None: dir = GLib.get_home_dir() if settings.get(Gtk.PRINT_SETTINGS_OUTPUT_FILE_FORMAT) == 'ps': ext = '.ps' elif settings.get(Gtk.PRINT_SETTINGS_OUTPUT_FILE_FORMAT) == 'svg': ext = '.svg' else: ext = '.pdf' base_name = os.path.splitext(os.path.basename(out_file_path))[0] uri = "file://{:s}/{:s}{:s}".format(dir, base_name, ext) settings.set(Gtk.PRINT_SETTINGS_OUTPUT_URI, uri) self.operation.set_print_settings(settings) def run(self, parent=None): result = self.operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, parent) if result == Gtk.PrintOperationResult.ERROR: message = self.operation.get_error() dialog = Gtk.MessageDialog(parent, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, message) dialog.run() dialog.destroy() #Gtk.main_quit() def begin_print(self, operation, print_ctx, print_data): height = print_ctx.get_height() - self.HEADER_HEIGHT - self.HEADER_GAP file_path = print_data['filename'] if not os.path.isfile(file_path): raise Exception("file not found: {:s}".format(file_path)) # in reality you should most likely not read the entire # file into a buffer source_file = open(file_path, 'r') s = source_file.read() print_data['pages'] = s.split('\f') #print(print_data['pages']) print_data['num_pages'] = len(print_data['pages']) operation.set_n_pages(print_data['num_pages']) def draw_page(self, operation, print_ctx, page_num, print_data): cr = print_ctx.get_cairo_context() width = print_ctx.get_width() cr.move_to(0, self.HEADER_HEIGHT) cr.line_to(width, self.HEADER_HEIGHT) cr.set_line_width(1) cr.stroke() layout = print_ctx.create_pango_layout() desc = Pango.FontDescription('sans 12') layout.set_font_description(desc) layout.set_text(print_data['filename'], -1) (text_width, text_height) = layout.get_pixel_size() if text_width > width: layout.set_width(width) layout.set_ellipsize(Pango.EllipsizeMode.START) (text_width, text_height) = layout.get_pixel_size() cr.move_to(0, (self.HEADER_HEIGHT - text_height) / 2) PangoCairo.show_layout(cr, layout) page_str = "{:d}/{:d}".format(page_num + 1, print_data['num_pages']) layout.set_text(page_str, -1) layout.set_width(-1) (text_width, text_height) = layout.get_pixel_size() cr.move_to(width - text_width - 4, (self.HEADER_HEIGHT - text_height) / 2) PangoCairo.show_layout(cr, layout) layout = print_ctx.create_pango_layout() desc = Pango.FontDescription('monospace') desc.set_size(print_data['font_size'] * Pango.SCALE) layout.set_font_description(desc) cr.move_to(0, self.HEADER_HEIGHT + self.HEADER_GAP) font_size = print_data['font_size'] for line in (print_data['pages'][page_num]).split('\n'): layout.set_text(line, -1) PangoCairo.show_layout(cr, layout) cr.rel_move_to(0, font_size) def end_print(self, operation, print_ctx, print_data): pass def main(demoapp=None): app = VOAOutFilePrinter('/home/jwatson/itshfbc/run/voacapx.out') GLib.idle_add(app.run, demoapp) Gtk.main() if __name__ == '__main__': main() pythonprop-0.30.1/src/pythonprop/voaSiteChooser.py0000664000175000017500000004225313662771311017275 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voacapSiteChooser # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # Dialog box that returns a voaLocation import os import re import sys import itertools import cairo from .hamlocation import * from .treefilebrowser import * try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject, Gtk, Gdk except: sys.exit(1) class VOASiteChooser: """GUI to select tx/rx locations fromVOAArea Input Files""" lcase_letters = list(map(chr, list(range(97, 123)))) ucase_letters = list(map(chr, list(range(65, 91)))) def __init__(self, location=HamLocation(), map_size=(), itshfbc_path = '', parent=None, datadir=""): self.datadir = datadir # Delete any trailing locator from the site name #_name = location.get_name() #_loc = re.compile (r"\[\D\D\d\d\D\D\]\s*$") #if re.search(_loc, _name): # print "found locator" #self.locator_append_checkbutton.set_state(re.search(_loc, _name)) #location.set_name(_loc.split(_name)[0]) self.return_location = location #self.map_size = map_size #todo allow the dialog size to be saved #load the dialog from the glade file #self.uifile = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "voaSiteChooser.ui") self.ui_file = os.path.join(self.datadir, "ui", "voaSiteChooser.ui") #self.wTree = Gtk.Builder.new_from_file(self.ui_file) self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("site_chooser_dialog", "map_eventbox", "map_aspectframe", "lat_spinbutton", "lon_spinbutton", "name_entry", "locator_combo1", "locator_combo2", "locator_combo3", "locator_combo4", "locator_combo5", "locator_combo6", "locator_append_checkbutton", "geo_tv", "file_tv") self.site_chooser_dialog.set_transient_for(parent) # put the image from pixbuf, to make it resizable self.map_image_aspect_ratio = None #map_file = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "map.jpg") map_file = os.path.join(self.datadir, "ui", "map.jpg") # the original clean pixbuf map self.o_pixbuf = GdkPixbuf.Pixbuf.new_from_file(map_file) w, h = self.o_pixbuf.get_width(), self.o_pixbuf.get_height() #if not self.map_size: self.map_size = (w,h) self.map_image = Gtk.Image.new_from_pixbuf(self.o_pixbuf) self.map_image.set_size_request(w,h) # allow to downsize to map_file original size self.map_eventbox.add(self.map_image) self.map_eventbox.set_size_request(w,h) self.map_aspectframe.set_size_request(w,h) points = [] points.append(self.location2map_point(self.return_location)) self.set_map_points(points) # this sets up self.map_image # Delete any trailing locator from the site name _name = location.get_name() _loc = re.compile (r"\[\D\D\d\d\D\D\]\s*$") if re.search(_loc, _name): self.locator_append_checkbutton.set_active(True) self.return_location.set_name(_loc.split(_name)[0]) #run the dialog and store the response self.populate_locator_combos() self.update_spinbuttons(self.return_location) self.set_locator_ui(self.return_location.get_locator()) self.name_entry.set_text(self.return_location.get_name()) #Create event dictionary and connect it event_dic = { "on_lat_spinbutton_value_changed" : self.update_locator_ui, "on_lon_spinbutton_value_changed" : self.update_locator_ui } self.wTree.connect_signals(event_dic) self.map_eventbox.connect("size_allocate", self.resize_image) self.map_eventbox.connect("button_press_event", self.set_location_from_map) # The locator widgets need to be connected individually. The handlerIDs are # used to block signals when setting the locator widget programatically self.locator_combo1_handler_id = self.locator_combo1.connect("changed", self.set_location_from_locator) self.locator_combo2_handler_id = self.locator_combo2.connect("changed", self.set_location_from_locator) self.locator_combo3_handler_id = self.locator_combo3.connect("changed", self.set_location_from_locator) self.locator_combo4_handler_id = self.locator_combo4.connect("changed", self.set_location_from_locator) self.locator_combo5_handler_id = self.locator_combo5.connect("changed", self.set_location_from_locator) self.locator_combo6_handler_id = self.locator_combo6.connect("changed", self.set_location_from_locator) self.locator_combos = ((self.locator_combo1,self.locator_combo1_handler_id), (self.locator_combo2, self.locator_combo2_handler_id), (self.locator_combo3, self.locator_combo3_handler_id), (self.locator_combo4, self.locator_combo4_handler_id), (self.locator_combo5, self.locator_combo5_handler_id), (self.locator_combo6, self.locator_combo6_handler_id)) # Set up the file selection area self.tfb = TreeFileBrowser(root = itshfbc_path, view = self.file_tv, file_types = ('*.geo', '*.GEO')) self.file_tv.connect("cursor-changed", self.update_geo_tv) sm = self.geo_tv.get_selection() sm.set_mode(Gtk.SelectionMode.SINGLE) #sm.set_select_function(self.geo_tv_selected, False) # todo pygobject check this (it's just a guess) sm.connect("changed", self.geo_tv_selected) self.alpha_numeric_re = re.compile('[\W_]+') self.latitude_column = 0 self.longitude_column = 0 def run(self): """This function runs the site selection dialog""" self.map_image.show() self.result = self.site_chooser_dialog.run() _site_name = self.name_entry.get_text() if self.locator_append_checkbutton.get_active(): _site_name = _site_name + ' ['+self.return_location.get_locator()+']' self.return_location.set_name(_site_name) self.site_chooser_dialog.destroy() return self.result, self.return_location, self.map_size def set_map_points(self, points=[]): # points is a list of tuples (x, y) w,h = self.map_size surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) cc = cairo.Context(surface) cc.set_line_width(1.) scaled_pixbuf = self.o_pixbuf.scale_simple(w, h, GdkPixbuf.InterpType.BILINEAR) Gdk.cairo_set_source_pixbuf(cc, scaled_pixbuf, 0, 0) cc.paint() radius = 6 if (w / 200.0) < 3 else int(round(w/200.0)) for point in points: cc.arc(point[0], point[1], radius, 0., 2 * math.pi) cc.move_to(point[0] - 6 - radius, point[1]) cc.line_to(point[0] + 6 + radius, point[1]) cc.move_to(point[0], point[1] - 6 - radius) cc.line_to(point[0], point[1] + 6 + radius) cc.set_source_rgb(1, 0, 0) cc.stroke() pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, w, h) self.map_image.set_from_pixbuf(pixbuf) def resize_image(self, widget, rect): new_w = rect.width new_h = rect.height if self.map_size == (new_w, new_h): return False self.map_size = (new_w, new_h) points = [] points.append(self.location2map_point(self.return_location)) self.set_map_points(points) # this sets up self.map_image return False def populate_locator_combos(self): #todo check that this is actually required, combos are also being #populated in the .ui file self.populate_combo(self.locator_combo1, list(map(chr, list(range(65, 83))))) self.populate_combo(self.locator_combo2, list(map(chr, list(range(65, 83))))) self.populate_combo(self.locator_combo3, list(map(chr, list(range(48, 58))))) self.populate_combo(self.locator_combo4, list(map(chr, list(range(48, 58))))) self.populate_combo(self.locator_combo5, list(map(chr, list(range(97, 121))))) self.populate_combo(self.locator_combo6, list(map(chr, list(range(97, 121))))) def populate_combo(self, cb, list): list_model = Gtk.ListStore(GObject.TYPE_STRING) for af in list: list_model.append([af]) cb.set_model(list_model) cell = Gtk.CellRendererText() cb.pack_start(cell, True) cb.add_attribute(cell, 'text', 0) #cb.set_wrap_width(20) cb.set_active(0) # Function called when the lat/lon is changed in the entry boxes def update_locator_ui(self, widget): if widget == self.lat_spinbutton: self.return_location.set_latitude(self.lat_spinbutton.get_value()) elif widget == self.lon_spinbutton: self.return_location.set_longitude(self.lon_spinbutton.get_value()) self.block_locator_combos(True) self.set_locator_ui(self.return_location.get_locator()) points = [self.location2map_point(self.return_location)] self.set_map_points(points) self.block_locator_combos(False) # Unblock the locator combo signals def block_locator_combos(self, block): if (block): for combo, handler in self.locator_combos: combo.handler_block(handler) else: for combo, handler in self.locator_combos: combo.handler_unblock(handler) # Updates the locator UI elements to the argument passed in 'locator' # todo some error checking would be nice.... def set_locator_ui(self, locator): locator = locator.upper() self.locator_combo1.set_active(self.ucase_letters.index(locator[0])) self.locator_combo2.set_active(self.ucase_letters.index(locator[1])) self.locator_combo3.set_active(int(locator[2])) self.locator_combo4.set_active(int(locator[3])) # todo make this an 'if' in case we get a four digit locator self.locator_combo5.set_active(self.ucase_letters.index(locator[4])) self.locator_combo6.set_active(self.ucase_letters.index(locator[5])) def location2map_point(self, location): w,h = self.map_size lat = location.get_latitude() lon = location.get_longitude() pw = ((lon + 180.0) / 360.0) * w ph = abs( ((lat - 90.0) / 180) * h) return (int(round(pw)), int(round(ph))) def set_location_from_map(self, widget, event): w, h = self.map_size x = event.x - ((self.map_eventbox.get_allocation().width - w)/2) #if not (w > x > 0) or not (h > event.y > 0): return # out of map bounds if ((0 <= x <= w) and (0 <= event.y <= h)): lon = ((x/w) * 360.0) - 180.0 lat = 90.0 - ((event.y/h) * 180) self.return_location.set_latitude_longitude(lat, lon) self.update_spinbuttons(self.return_location) self.set_locator_ui(self.return_location.get_locator()) # redraw-point points = [(int(x), int(event.y))] self.set_map_points(points) def set_location_from_locator(self, widget): loc = '' for cb, handlerID in self.locator_combos: loc = loc + self.get_active_text(cb) self.return_location.set_locator(loc) self.update_spinbuttons(self.return_location) points = [self.location2map_point(self.return_location)] self.set_map_points(points) def update_spinbuttons(self,location): self.lat_spinbutton.set_value(location.get_latitude()) self.lon_spinbutton.set_value(location.get_longitude()) self.name_entry.set_text(location.get_name()) def get_active_text(self, combobox): model = combobox.get_model() active = combobox.get_active() if active < 0: return '' return model[active][0] #################################################### # File Selection methods follow #################################################### def update_geo_tv(self, file_chooser): filename = self.tfb.get_selected() try: if filename.endswith('.geo'): f = open(filename) header_is_defined = False for line in f: if line.startswith('|'): start_index = 0 end_index = 0 headers = [] while end_index >= 0: end_index = line.find('|', start_index) heading = line[start_index:end_index].strip() heading = re.sub(r'=', '', heading) heading = heading.title() if len(heading) > 0: headers.append((heading, int(start_index)-1, int(end_index), len(headers))) start_index = end_index + 1 self.geo_model = Gtk.ListStore(*([str] * len(headers))) self.build_geo_tv(headers) header_is_defined = True elif header_is_defined: try: row = [] for column in headers: row.append((line[column[1]:column[2]]).strip()) self.geo_model.append(row) except: print('Failed to read line: ', line) print('with error ',sys.exc_info()) f.close() self.geo_tv.set_model(self.geo_model) except: pass #print 'Error parsing geo file.' #print sys.exc_info() try: self.geo_model.clear() except AttributeError: pass return def remove_all_tv_columns(self, tv): columns = tv.get_columns() for col in columns: tv.remove_column(col) def build_geo_tv(self, headers): self.remove_all_tv_columns(self.geo_tv) for column in headers: title = column[0] cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , int(column[3])) if title.startswith('Lat'): self.latitude_column = int(column[3]) elif title.startswith('Lon'): self.longitude_column = int(column[3]) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(int(column[3])) self.geo_tv.append_column(tvcol) def geo_tv_selected(self, selection): #http://python-gtk-3-tutorial.readthedocs.org/en/latest/treeview.html#the-selection model, geo_iter = selection.get_selected() if geo_iter != None: title = '' for col in range(0, self.geo_model.get_n_columns()): if col == self.latitude_column: self.return_location.set_latitude(self.get_decimal_coordinate(self.geo_model.get_value(geo_iter, col))) elif col == self.longitude_column: self.return_location.set_longitude(self.get_decimal_coordinate(self.geo_model.get_value(geo_iter, col))) else: title = title + ' ' + self.geo_model.get_value(geo_iter, col) self.return_location.set_name(title) self.update_spinbuttons(self.return_location) def get_decimal_coordinate(self, ll): val = ll.split() dec = float(val[0]) + float(val[1])/60.0 if ((val[2] == 'S') or (val[2] == 'W')): dec = -dec return dec def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) pythonprop-0.30.1/src/pythonprop/voacapgui.py0000664000175000017500000023046113736105351016313 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voacapgui # # Copyright (c) 2009-2018 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import sys import os import datetime import subprocess import time import re import pkgutil from . import templates from dateutil.relativedelta import relativedelta from calendar import monthrange from configparser import * try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject gi.require_version('GdkPixbuf', '2.0') from gi.repository import GdkPixbuf from gi.repository import Gtk except ImportError as exc: print(("Error: failed to import gi module ({})".format(exc))) print ("Check that the python-gi module is installed") sys.exit(1) import gettext import locale GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install() # glade file # see http://bugzilla.gnome.org/show_bug.cgi?id=344926 for why the # next two commands look repeated. # TODO Restore the following 2 lines #Gtk.Builder.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) #Gtk.Builder.textdomain(GETTEXT_DOMAIN) gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) from .voaTextFileViewDialog import VOATextFileViewDialog from .voaDatFile import * from .voaDefaults import * from .voaSiteChooser import * from .voaP2PPlot import * from .voaP2PPlotgui import * from .voaAreaPlotgui import VOAAreaPlotGUI from .ssnFetch import * from .voaSSNThumb import * from .voaFile import * from .voaAreaChooser import * from .voaAntennaChooser import * class VOACAP_GUI(): __gtype_name__ = 'PythonProp' """GUI to create VOAArea Input Files""" # Determine where the itshfbc and prefs files are, based on OS # The windows paths are guesses and need checking.... if os.name == 'nt': itshfbc_path = 'C:\itshfbc' prefs_dir = 'C:\itshfbc\database\\' else: itshfbc_path = os.path.expanduser("~")+os.sep+'itshfbc' prefs_dir = os.path.expanduser("~")+os.sep+'.voacapgui'+os.sep prefs_path = prefs_dir + 'voacapgui.prefs' ssn_path = prefs_dir + 'ssn.json' # Check if the prefs directory exists, create one if if it doesn't # (This is probably not required as the installer will probably end up # creating and populating this directory.) if not os.path.isdir(prefs_dir): os.makedirs(prefs_dir) #ant_list = [] firstCornerX = 0 firstCornerY = 0 area_rect = VOAAreaRect() model_list = ('CCIR', 'URSI88') path_list = (_('Short'), _('Long')) # These need to be lists later on to support multiple antennas tx_antenna_path = '' rx_antenna_path = '' main_window_size = (560, 410) site_chooser_map_size = area_chooser_map_size = (384,192) antenna_chooser_size = (500,400) def __init__(self, datadir="", pythonprop_version="dev"): self.datadir = datadir self.pythonprop_version = pythonprop_version self.area_templates_file = None #Set the GUI file #self.uifile = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "voacapgui.ui") self.ui_file = os.path.join(self.datadir, "ui", "voacapgui.ui") #self.builder = Gtk.Builder.new_from_file(self.ui_file) self.builder = Gtk.Builder() self.builder.add_from_file(self.ui_file) self.get_objects("main_window", "statusbar", "notebook", "tx_site_button", "tx_site_entry", "tx_lat_spinbutton", "tx_lon_spinbutton", "tx_antenna_button", "tx_antenna_entry", "tx_bearing_button", "tx_bearing_spinbutton", "tx_power_spinbutton", "rx_site_button", "rx_site_entry", "rx_lat_spinbutton", "rx_lon_spinbutton", "rx_antenna_button", "rx_antenna_entry", "rx_bearing_button", "rx_bearing_spinbutton", "ssn_tv", "ssn_plot_box", "ssn_file_data_label", "ssn_web_update_button", "foe_spinbutton", "fof1_spinbutton", "fof2_spinbutton", "foes_spinbutton", "model_combo", "path_combo", "mm_noise_spinbutton", "min_toa_spinbutton", "reliability_spinbutton", "snr_spinbutton", "mpath_spinbutton", "delay_spinbutton", "area_tv", "area_delbt", "area_clear_btn", "templatescb", "gridsizespinbutton", "add_templ_btn", "areayearspinbutton", "freqspinbutton", "monthspinbutton", "utcspinbutton", "add_templ_btn", "area_clear_btn", "area_select_btn", "area_label", "area_run_btn", "p2pmy_tv", "p2pfreq_tv", "p2pmydelbt", "p2pmyrstbt", "p2pfreqdelbt", "p2pfreqrstbt", "p2padd_mybt", "p2padd_freqbt", "p2pfreqspinbutton", "p2pdayspinbutton", "p2pmonthspinbutton", "p2pyearspinbutton", "p2pmethodcb", "p2prunbt", "p2pcircuitckb", "p2pcalbt", "p2pusedayck", "p2pmacrocb", "p2pmacroaddbt", ) self.ssn_context_id = self.statusbar.get_context_id("SSN Messages") self.p2p_context_id = self.statusbar.get_context_id("P2P Messages") self.area_context_id = self.statusbar.get_context_id("Area Messages") # TODO clear up "p2psavebt", "p2pcircuitcb", self.p2p_useday = False self.p2pdayspinbutton.set_sensitive(self.p2p_useday) self.p2puseday_handler_id = self.p2pusedayck.connect('toggled', self.p2p_useday_tog) today = datetime.datetime.today() self.p2pyearspinbutton.set_value(today.year) self.p2pmonthspinbutton.set_value(today.month) self.p2pdayspinbutton.set_value(today.day) self.p2pfreqspinbutton.set_value(14.2) col_cm_t = [GObject.TYPE_UINT, GObject.TYPE_STRING] self.circuit_method_model = Gtk.ListStore(*col_cm_t) [ self.circuit_method_model.append([i, label]) for i, label in [ (30, _("30: Smoothed LP/SP Model")), (25, _("25: All Modes SP Model")), (22, _("22: Forced SP Model")), (21, _("21: Forced LP Model")), (20, _("20: Complete System Performance")), (15, _("15: Tx. & Rx. Antenna Pattern")), (14, _("14: Rx. Antenna Pattern")), (13, _("13: Tx. Antenna Pattern")), (9, _("9: HPF-MUF-FOT Text Graph")) ]] col_gm_t = [GObject.TYPE_UINT, GObject.TYPE_STRING] self.graphic_method_model = Gtk.ListStore(*col_gm_t) [ self.graphic_method_model.append([i, label]) for i, label in [ (30, _("30: Smoothed LP/SP Model")), (22, _("22: Forced SP Model")), (21, _("21: Forced LP Model")), (20, _("20: Complete System Performance")) ]] self.main_window.resize(self.main_window_size[0], self.main_window_size[1]) _model = Gtk.ListStore(GObject.TYPE_STRING) for item in self.model_list: _model.append([item]) self.populate_combo(self.model_combo, _model) _model = Gtk.ListStore(GObject.TYPE_STRING) for item in self.path_list: _model.append([item]) self.populate_combo(self.path_combo, _model) self.max_vg_files_warn = False self.max_frequencies_warn = False if os.name == 'posix': self.max_vg_files = 25 #This was originally set to 12 in earlier versions of voacapl. else: self.max_vg_files = 9 # DOS 8.3 filenames self.gridsizespinbutton.set_value(125) self.areayearspinbutton.set_value(today.year) self.monthspinbutton.set_value(today.month) self.freqspinbutton.set_value(14.1) self.p2pcircuitckb.set_active(False) self.set_circuit_panel_state(False) try: self.ssn_repo = SSNFetch(parent = self.main_window, save_location = self.ssn_path, s_bar=self.statusbar, s_bar_context=self.ssn_context_id) except NoSSNData as e: print((e.value)) self.quit_application(None) _min, _max = self.ssn_repo.get_data_range() self.p2pyearspinbutton.set_range(_min.year, _max.year) self.areayearspinbutton.set_range(_min.year, _max.year) #self.write_ssns(self.ssn_repo.get_ssn_list()) self.build_area_tv() self.ssn_build_tv() self.build_p2p_tvs() self.build_graphcb() self.build_macrocb() if os.path.isfile(self.prefs_path): self.read_user_prefs() if not self.area_templates_file: self.build_new_template_file() self.area_label.set_text(self.area_rect.get_formatted_string()) self.build_area_template_ts() #Create event dictionary and connect it event_dic = { "on_main_window_destroy" : self.quit_application, "on_tx_site_button_clicked" : self.choose_site, "on_rx_site_button_clicked" : self.choose_site, "on_tx_antenna_button_clicked" : self.choose_antenna, "on_rx_antenna_button_clicked" : self.choose_antenna, "on_tx_antenna_entry_changed" : self.update_run_button_status, "on_rx_antenna_entry_changed" : self.update_run_button_status, "on_tx_bearing_button_clicked" : self.calculate_antenna_bearing, "on_rx_bearing_button_clicked" : self.calculate_antenna_bearing, #"on_mi_circuit_activate" : self.verify_input_data, #"on_mi_graph_activate" : self.verify_input_data, "on_mi_run_activate": self.run_prediction, "on_mi_show_yelp_activate": self.show_yelp, "on_mi_about_activate" : self.show_about_dialog, "on_mi_open_vgz_activate": self.open_vgz_file, "on_mi_quit_activate" : self.quit_application, "on_main_window_destroy" : self.quit_application, "on_ssn_web_update_button_clicked" : self.update_ssn_table, # notebook area page widgets event dict 'on_notebook_switch_page' : self.nb_switch_page, 'on_areayearspinbutton_value_changed' : self.area_set_months_range, 'on_area_addbt_clicked' : self.area_add_tv_row_from_user, 'on_add_templ_btn_clicked' : self.area_add_template, 'on_templatescb_changed' : self.area_templatescb_change, 'on_area_delbt_clicked' : self.area_del_tv_row, #'on_area_save_btn_clicked' : self.area_save_as_template, 'on_area_clear_btn_clicked' : self.area_clean_tv, 'on_area_select_btn_clicked' : self.show_area_chooser, 'on_area_run_btn_clicked' : self.run_prediction, # notebook p2p page widgets event dict 'on_p2pmonthspinbutton_value_changed' : self.p2p_set_days_range, 'on_p2pyearspinbutton_value_changed' : self.p2p_set_months_range, 'on_p2padd_mybt_clicked' : self.p2pmy_add_tv_row_from_user, 'on_p2padd_freqbt_clicked' : self.p2pfreq_add_tv_row_from_user, 'on_p2pmydelbt_clicked' : self.p2p_del_my_tv_row, 'on_p2pfreqdelbt_clicked' : self.p2p_del_freq_tv_row, 'on_p2psavebt_clicked' : self.p2p_save_as_template, 'on_p2pmyrstbt_clicked' : self.p2p_clean_my_tv, 'on_p2pfreqrstbt_clicked' : self.p2p_clean_freq_tv, 'on_p2prunbt_clicked' : self.run_prediction, 'on_p2pcalbt_clicked' : self.p2p_calendar, # 'on_p2pusedayck_toggled' : self.p2p_useday_tog, 'on_p2pmacroaddbt_clicked' : self.p2p_add_macro, 'on_p2pcircuitckb_toggled' : self.p2p_toggle_circuit, 'on_p2pmethodcb_changed' : self.p2p_method_changed } self.builder.connect_signals(event_dic) # area plot accelgrp self.area_accelgrp = None self.main_window.show_all() # test for ~/itshfbc tree if not os.path.exists(self.itshfbc_path): e = _("ITSHFBC directory not found") if os.name == 'posix': e_os = _("Please install voacap for Linux and run 'makeitshfbc'.\n") e_os += _("A 'itshfbc' directory cannot be found at: %s.\n") % (self.itshfbc_path) e_os += _("Please install voacap before running voacapgui.") dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, e ) dialog.format_secondary_text(e_os) dialog.run() dialog.destroy() return -1 def populate_combo(self, cb, model): cb.set_model(model) cell = Gtk.CellRendererText() cb.pack_start(cell, True) cb.add_attribute(cell, 'text', 0) #cb.set_wrap_width(20) cb.set_active(0) def area_set_months_range(self, widget): """ Called when the year changes and modifies the months range to values that are in the ssn_repo. """ _min, _max = self.ssn_repo.get_data_range() current_month = self.monthspinbutton.get_value_as_int() if (self.areayearspinbutton.get_value_as_int() == _min.year): value = current_month min_month = _min.month max_month = 12 elif (self.areayearspinbutton.get_value_as_int() == _max.year): value = _max.month min_month = 1 max_month = _max.month else: value = current_month min_month = 1 max_month = 12 self.monthspinbutton.get_adjustment().configure(value, min_month, max_month, 1, 0, 0) def p2p_set_months_range(self, widget): """ Called when the year changes and modifies the months range to values that are in the ssn_repo. """ _min, _max = self.ssn_repo.get_data_range() current_month = self.p2pmonthspinbutton.get_value_as_int() if (self.p2pyearspinbutton.get_value_as_int() == _min.year): value = current_month min_month = _min.month max_month = 12 elif (self.p2pyearspinbutton.get_value_as_int() == _max.year): value = _max.month min_month = 1 max_month = _max.month else: value = current_month min_month = 1 max_month = 12 #The following line emits a signal that triggers p2p_set_days_range() self.p2pmonthspinbutton.get_adjustment().configure(value, min_month, max_month, 1, 0, 0) def p2p_set_days_range(self, widget): """ Sets the adjustment of the 'days' spinbutton on the P2P panel, modifying the upper limit according to the values of the month/year. """ current_day = self.p2pdayspinbutton.get_value_as_int() first_day, num_days = monthrange(self.p2pyearspinbutton.get_value_as_int(),\ self.p2pmonthspinbutton.get_value_as_int()) adjustment = Gtk.Adjustment(1, 1, num_days, 1, 10, 0) if current_day > num_days: current_day = num_days self.p2pdayspinbutton.set_adjustment(adjustment) self.p2pdayspinbutton.set_value(current_day) def get_objects(self, *names): for name in names: widget = self.builder.get_object(name) if widget is None: raise ValueError("Widget '%s' not found" % name) setattr(self, name, widget) def choose_antenna(self, widget): dialog = VOAAntennaChooser(self.itshfbc_path, size=self.antenna_chooser_size, parent=self.main_window, datadir=self.datadir) return_code, return_antenna, antenna_description, self.antenna_chooser_size = dialog.run() #print self.antenna_chooser_size if ((return_code == 0) and (return_antenna)): # response_id: 0=OK, 1=Cancel if widget == self.builder.get_object('tx_antenna_button'): self.tx_antenna_entry.set_text(return_antenna + ' : ' + antenna_description) self.tx_antenna_path = return_antenna else: self.rx_antenna_entry.set_text(return_antenna + ' : ' + antenna_description) self.rx_antenna_path = return_antenna def choose_site(self, widget): if widget == self.builder.get_object('tx_site_button'): lat = self.tx_lat_spinbutton.get_value() lon = self.tx_lon_spinbutton.get_value() name = self.tx_site_entry.get_text() elif widget == self.builder.get_object('rx_site_button'): lat = self.rx_lat_spinbutton.get_value() lon = self.rx_lon_spinbutton.get_value() name = self.rx_site_entry.get_text() else: lat = 0 lon = 0 name = '' dialog = VOASiteChooser(HamLocation(lat, lon, name), \ self.site_chooser_map_size, \ itshfbc_path=self.itshfbc_path, \ parent=self.main_window, \ datadir=self.datadir) return_code, location, self.site_chooser_map_size = dialog.run() if (return_code == 0): # response_id: 0=OK, 1=Cancel if widget == self.builder.get_object('tx_site_button'): self.tx_site_entry.set_text(location.get_name()) self.tx_lat_spinbutton.set_value(location.get_latitude()) self.tx_lon_spinbutton.set_value(location.get_longitude()) else: self.rx_site_entry.set_text(location.get_name()) self.rx_lat_spinbutton.set_value(location.get_latitude()) self.rx_lon_spinbutton.set_value(location.get_longitude()) def calculate_antenna_bearing(self, widget): try: tx_loc = HamLocation(self.tx_lat_spinbutton.get_value(), lon = self.tx_lon_spinbutton.get_value()) rx_loc = HamLocation(float(self.rx_lat_spinbutton.get_value()), lon = self.rx_lon_spinbutton.get_value()) except Exception: #todo add a note to the status bar explaining the reason #for the failure to actually do anything return if widget == self.builder.get_object('tx_bearing_button'): bearing, distance = tx_loc.path_to(rx_loc) self.tx_bearing_spinbutton.set_value(bearing) else: bearing, distance = rx_loc.path_to(tx_loc) self.rx_bearing_spinbutton.set_value(bearing) def read_user_prefs(self) : config = ConfigParser(VOADefaultDictionary()) config.read(self.prefs_path) #set some defaults here for the system variables try: self.foe_spinbutton.set_value(float(config.get('DEFAULT','foe'))) self.fof1_spinbutton.set_value(float(config.get('DEFAULT','fof1'))) self.fof2_spinbutton.set_value(float(config.get('DEFAULT','fof2'))) self.foes_spinbutton.set_value(float(config.get('DEFAULT','foes'))) self.model_combo.set_active(int(config.get('DEFAULT', 'model'))) self.path_combo.set_active(int(config.get('DEFAULT', 'path'))) self.mm_noise_spinbutton.set_value(float(config.get('DEFAULT','mm_noise'))) self.min_toa_spinbutton.set_value(float(config.get('DEFAULT','min_toa'))) self.reliability_spinbutton.set_value(float(config.get('DEFAULT','required_reliability'))) self.snr_spinbutton.set_value(float(config.get('DEFAULT','required_snr'))) self.mpath_spinbutton.set_value(float(config.get('DEFAULT','mpath'))) self.delay_spinbutton.set_value(float(config.get('DEFAULT','delay'))) self.tx_bearing_spinbutton.set_value(float(config.get('DEFAULT', 'tx_bearing'))) self.tx_power_spinbutton.set_value(float(config.get('DEFAULT', 'tx_power'))) self.rx_bearing_spinbutton.set_value(float(config.get('DEFAULT', 'rx_bearing'))) self.tx_site_entry.set_text(config.get('tx site','name')) self.tx_lat_spinbutton.set_value(float(config.get('tx site','lat'))) self.tx_lon_spinbutton.set_value(float(config.get('tx site','lon'))) self.tx_antenna_entry.set_text(config.get('tx site', 'antenna' )) self.tx_antenna_path, sep, suffix = (config.get('tx site', 'antenna' )).partition(' :') self.tx_bearing_spinbutton.set_value(float(config.get('tx site', 'bearing'))) self.tx_power_spinbutton.set_value(float(config.get('tx site', 'power'))) self.rx_site_entry.set_text(config.get('rx site','name')) self.rx_lat_spinbutton.set_value(float(config.get('rx site','lat'))) self.rx_lon_spinbutton.set_value(float(config.get('rx site','lon'))) self.rx_antenna_entry.set_text(config.get('rx site', 'antenna' )) self.rx_antenna_path, sep, suffix = (config.get('rx site', 'antenna' )).partition(' :') self.rx_bearing_spinbutton.set_value(float(config.get('rx site', 'bearing'))) self.site_chooser_map_size = (config.getint('site chooser','map_width'), config.getint('site chooser','map_height')) self.area_chooser_map_size = (config.getint('area chooser','map_width'), config.getint('area chooser','map_height')) self.antenna_chooser_size = (config.getint('antenna chooser','width'), config.getint('antenna chooser','height')) self.gridsizespinbutton.set_value(config.getint('area', 'gridsize')) self.areayearspinbutton.set_value(config.getint('area','year')) self.monthspinbutton.set_value(config.getint('area','month')) self.utcspinbutton.set_value(config.getint('area','utc')) self.freqspinbutton.set_value(config.getfloat('area', 'frequency')) self.area_templates_file = config.get('area', 'templates_file') self.area_rect=VOAAreaRect(config.getfloat('area','sw_lat'), config.getfloat('area','sw_lon'), config.getfloat('area','ne_lat'), config.getfloat('area','ne_lon')) self.area_label.set_text(self.area_rect.get_formatted_string()) except Exception as X: print('Error reading the user prefs: %s - %s' % (Exception, X)) def save_user_prefs(self): config = ConfigParser() # voaSiteChooser map size config.add_section('site chooser') config.set('site chooser', 'map_width', str(self.site_chooser_map_size[0])) config.set('site chooser', 'map_height', str(self.site_chooser_map_size[1])) # voaAreaChooser map size config.add_section('area chooser') config.set('area chooser', 'map_width', str(self.area_chooser_map_size[0])) config.set('area chooser', 'map_height', str(self.area_chooser_map_size[1])) # voaAreaChooser map size if self.antenna_chooser_size: config.add_section('antenna chooser') config.set('antenna chooser', 'width', str(self.antenna_chooser_size[0])) config.set('antenna chooser', 'height', str(self.antenna_chooser_size[1])) # Tx Site Parameters config.add_section('tx site') config.set('tx site', 'name', self.tx_site_entry.get_text()) config.set('tx site', 'lat', str(self.tx_lat_spinbutton.get_value())) config.set('tx site', 'lon', str(self.tx_lon_spinbutton.get_value())) config.set('tx site', 'antenna', self.tx_antenna_entry.get_text()) config.set('tx site', 'bearing', str(self.tx_bearing_spinbutton.get_value())) config.set('tx site', 'power', str(self.tx_power_spinbutton.get_value())) # Rx Site Parameters config.add_section('rx site') config.set('rx site', 'name', self.rx_site_entry.get_text()) config.set('rx site', 'lat', str(self.rx_lat_spinbutton.get_value())) config.set('rx site', 'lon', str(self.rx_lon_spinbutton.get_value())) config.set('rx site', 'antenna', self.rx_antenna_entry.get_text()) config.set('rx site', 'bearing', str(self.rx_bearing_spinbutton.get_value())) # Ionospheric Parameters config.set('DEFAULT', 'foe', str(self.foe_spinbutton.get_value())) config.set('DEFAULT', 'fof1', str(self.fof1_spinbutton.get_value())) config.set('DEFAULT', 'fof2', str(self.fof2_spinbutton.get_value())) config.set('DEFAULT', 'foes', str(self.foes_spinbutton.get_value())) config.set('DEFAULT', 'model', str(self.model_combo.get_active())) config.set('DEFAULT', 'path', str(self.path_combo.get_active())) # System parameters config.set('DEFAULT','mm_noise', str(self.mm_noise_spinbutton.get_value())) config.set('DEFAULT','min_toa', str(self.min_toa_spinbutton.get_value())) config.set('DEFAULT','required_reliability', str(self.reliability_spinbutton.get_value())) config.set('DEFAULT','required_snr', str(self.snr_spinbutton.get_value())) config.set('DEFAULT','mpath', str(self.mpath_spinbutton.get_value())) config.set('DEFAULT','delay', str(self.delay_spinbutton.get_value())) # area parameters config.add_section('area') config.set('area','gridsize', str(self.gridsizespinbutton.get_value_as_int())) config.set('area','year', str(self.areayearspinbutton.get_value_as_int())) config.set('area','month', str(self.monthspinbutton.get_value_as_int())) config.set('area','utc', str(self.utcspinbutton.get_value_as_int())) config.set('area','frequency', str(self.freqspinbutton.get_value())) config.set('area','sw_lat', str(self.area_rect.sw_lat)) config.set('area','sw_lon', str(self.area_rect.sw_lon)) config.set('area','ne_lat', str(self.area_rect.ne_lat)) config.set('area','ne_lon', str(self.area_rect.ne_lon)) config.set('area','templates_file', self.area_templates_file if self.area_templates_file else '') with open(self.prefs_path, 'w') as configfile: config.write(configfile) def update_run_button_status(self, widget): """ Called by elements that are common to both types of run """ self.update_p2p_run_button_status() self.update_area_run_button_status() def update_p2p_run_button_status(self): """ This method checks that the prerequistes for a P2P run are in place and enables the P2P run button accordingly. It should be called everytime any of the prerequisites are modified. """ valid = self.is_ssn_valid() and self.is_tx_site_data_valid() and self.is_rx_site_data_valid() if self.p2pcircuitckb.get_active(): table_model = self.p2pfreq_tv.get_model() if (table_model): valid = valid and (len(table_model) > 0) else: valid = False table_model = self.p2pmy_tv.get_model() if (table_model): valid = valid and (len(table_model) > 0) else: valid = False iter = self.p2pmethodcb.get_active_iter() if self.p2pmethodcb.get_model().get_value(iter, 0) == 0: valid = False self.p2prunbt.set_sensitive(valid) def update_area_run_button_status(self): """ This method checks that the prerequistes for an area run are in place and enables the area run button accordingly. It should be called everytime any of the prerequiites are modified. """ #def verify_input_data(self, widget): valid = self.is_ssn_valid() and self.is_tx_site_data_valid() table_model = self.area_tv.get_model() if (table_model): valid = valid and (len(table_model) > 0) else: valid = False self.area_run_btn.set_sensitive(valid) def is_ssn_valid(self): _valid = True _table_model = self.ssn_tv.get_model() if (_table_model): _valid = _valid and (len(_table_model) > 0) else: _valid = False if _valid != True: self.statusbar.push(self.ssn_context_id, _("No SSNs are defined")) return _valid def is_tx_site_data_valid(self): _is_valid = True if self.tx_power_spinbutton.get_value() == 0: _is_valid = False if self.tx_antenna_entry.get_text_length() == 0: _is_valid = False return _is_valid def is_rx_site_data_valid(self): _is_valid = True if self.rx_antenna_entry.get_text_length() == 0: _is_valid = False return _is_valid #gettext here #This function is used to force an update def update_ssn_table(self, widget): self.ssn_repo.update_ssn_file() #Force an update # self.update_ssn_data_label() self.ssn_file_data_label.set_text(self.ssn_repo.get_file_data()) #self.write_ssns(self.ssn_repo.get_ssn_list()) self.scroll_ssn_tv_to_current_year() def scroll_ssn_tv_to_current_year(self): # scroll to the current year iter = self.ssn_repo.get_iter_first() while iter: if self.ssn_repo.get_value(iter, self.ssn_tv_idx_year) == str(datetime.datetime.today().year): path = self.ssn_repo.get_path(iter) self.ssn_tv.set_cursor(path) self.ssn_tv.scroll_to_cell(path, None) break iter = self.ssn_repo.iter_next(iter) def update_ssn_data_label(self): _text = _("SSN Data Last Updated:\n") _text += self.ssn_repo.get_file_mtime_str() self.ssn_file_data_label.set_text(_text) def p2p_toggle_circuit(self, widget): self.set_circuit_panel_state(widget.get_active()) self.update_p2p_run_button_status() def set_circuit_panel_state(self, state): self.p2pfreqspinbutton.set_sensitive(state) self.p2padd_freqbt.set_sensitive(state) self.p2pfreqdelbt.set_sensitive(state) self.p2pfreqrstbt.set_sensitive(state) self.p2pfreq_tv.set_sensitive(state) self.build_graphcb() def p2p_method_changed(self, widget): self.update_p2p_run_button_status() def build_p2p_tvs(self): # grey out delete and save buttons, since there are no entries in the model self.p2pmydelbt.set_sensitive(False) self.p2pmyrstbt.set_sensitive(False) self.p2pfreqdelbt.set_sensitive(False) self.p2pfreqrstbt.set_sensitive(False) self.p2prunbt.set_sensitive(False) # model: day, month name, month_ordinal, year col_t = [ GObject.TYPE_UINT, GObject.TYPE_STRING, GObject.TYPE_UINT, GObject.TYPE_UINT] model_my = Gtk.ListStore(*col_t) col_t = [GObject.TYPE_STRING] model_freq = Gtk.ListStore(*col_t) self.p2pmy_tv.set_model(model_my) self.p2pfreq_tv.set_model(model_freq) self.p2pmy_tv.set_property("rules_hint", True) self.p2pmy_tv.set_property("enable_search", False) self.p2pmy_tv.set_headers_visible(True) self.p2pmy_tv.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.p2pfreq_tv.set_property("rules_hint", True) self.p2pfreq_tv.set_property("enable_search", False) self.p2pfreq_tv.set_headers_visible(True) self.p2pfreq_tv.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # col idx self.p2pmy_tv_idx_day = 0 self.p2pmy_tv_idx_month_n = 1 self.p2pmy_tv_idx_month_i = 2 self.p2pmy_tv_idx_year = 3 self.p2pfreq_tv_idx_freq = 0 def dow_celldatafunction(column, cell, model, iter, user_data=None): t = '' d = model.get_value(iter, self.p2pmy_tv_idx_day) m = model.get_value(iter, self.p2pmy_tv_idx_month_i) y = model.get_value(iter, self.p2pmy_tv_idx_year) if d: t = datetime.datetime(y,m,d).strftime('%d') cell.set_property('text', t) title = _("Day") cell = Gtk.CellRendererText() tvcol = Gtk.TreeViewColumn(title, cell) # tvcol.add_attribute(cell, 'text' , self.p2pmy_tv_idx_month_n) # tvcol.set_sort_column_id(self.p2pmy_tv_idx_month_n) tvcol.set_cell_data_func(cell, dow_celldatafunction) tvcol.set_resizable(True) tvcol.set_reorderable(True) self.p2pmy_tv.append_column(tvcol) title = _("Month") cell = Gtk.CellRendererText() tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.p2pmy_tv_idx_month_n) tvcol.set_sort_column_id(self.p2pmy_tv_idx_month_n) tvcol.set_resizable(True) tvcol.set_reorderable(True) self.p2pmy_tv.append_column(tvcol) title = _("Year") cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.p2pmy_tv_idx_year) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(self.p2pmy_tv_idx_year) self.p2pmy_tv.append_column(tvcol) title = _("Frequency (MHz)") cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.p2pfreq_tv_idx_freq) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(self.p2pfreq_tv_idx_freq) self.p2pfreq_tv.append_column(tvcol) def build_graphcb(self): if self.p2pcircuitckb.get_active(): model = self.circuit_method_model else: model = self.graphic_method_model self.p2pmethodcb.clear() self.p2pmethodcb.set_model(model) cell = Gtk.CellRendererText() self.p2pmethodcb.pack_start(cell, True) self.p2pmethodcb.add_attribute(cell, 'text', 1) self.p2pmethodcb.set_active(0) def build_macrocb(self): col_t = [GObject.TYPE_STRING, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT] model = Gtk.ListStore(*col_t) [ model.append([l,f,a]) for l,f,a in [ (_("Select set to load"), None, None), (_("Next 3 months"), self.p2p_macro_next_months, [3]), (_("Next 6 months"), self.p2p_macro_next_months, [6]), (_("Next 12 months"), self.p2p_macro_next_months, [12]), (_("Next 24 months"), self.p2p_macro_next_months, [24]), (_("Next 30 days"), self.p2p_macro_next_days, [30]), (_("Annual (Quarters)"), self.p2p_macro_annual, [4]), (_("Annual (bi-month)"), self.p2p_macro_annual, [6]), ]] self.p2pmacrocb.set_model(model) cell = Gtk.CellRendererText() self.p2pmacrocb.pack_start(cell, True) self.p2pmacrocb.add_attribute(cell, 'text', 0) self.p2pmacrocb.set_active(0) def p2p_macro_next_months(self, vals): day = 0 # if the tv has any entries, use the last one as our # start in the sequence. tv_model = self.p2pmy_tv.get_model() tv_iter = tv_model.get_iter_first() if tv_iter == None: #empty model #so let's add this month to the model today = date.today() self.p2pmy_add_tv_rows([(day, today.month, today.year)]) else: # the table has entries. find the last entry and use that # as our starting point for the 'next' months last_iter = None while tv_iter: last_iter = tv_iter tv_iter = tv_model.iter_next(tv_iter) month = tv_model.get_value(last_iter, self.p2pmy_tv_idx_month_i) year = tv_model.get_value(last_iter, self.p2pmy_tv_idx_year) today = date(year, month, 1) #get the last entry #build the value for today mr = relativedelta(months=+1) if len(vals) == 1: next = today + mr for n in range(vals[0]): self.p2pmy_add_tv_rows([(day, next.month, next.year)]) next = next + mr elif len(vals) >1: pass def p2p_macro_next_days(self, vals): if not self.p2p_useday: self.p2pusedayck.set_active(True) today = date.today() dr = relativedelta(days=+1) if len(vals) == 1: next = today + dr for n in range(vals[0]): self.p2pmy_add_tv_rows([(next.day, next.month, next.year)]) next = next + dr elif len(vals) >1: pass def p2p_macro_annual(self, vals): day = 0 # start the count from Jan of the current year year = self.p2pyearspinbutton.get_value_as_int() today = date(year, 1, 1) self.p2pmy_add_tv_rows([(day, today.month, today.year)]) mr = relativedelta(months=+int(12/vals[0])) if len(vals) == 1: next = today + mr for n in range(vals[0]-1): self.p2pmy_add_tv_rows([(day, next.month, next.year)]) next = next + mr elif len(vals) >1: pass def p2p_macro_next_days(self, vals): if not self.p2p_useday: self.p2pusedayck.set_active(True) today = date.today() dr = relativedelta(days=+1) if len(vals) == 1: next = today + dr for n in range(vals[0]): self.p2pmy_add_tv_rows([(next.day, next.month, next.year)]) next = next + dr elif len(vals) >1: pass def p2p_add_macro(self, *args): model = self.p2pmacrocb.get_model() f, args = model.get(self.p2pmacrocb.get_active_iter(),1,2) if not f: return f(args) def build_area_tv(self): # grey out delete and save buttons, since there are no entries in the model self.area_delbt.set_sensitive(False) self.area_clear_btn.set_sensitive(False) #self.area_save_btn.set_sensitive(False) self.area_run_btn.set_sensitive(False) # model: year, month name, month_ordinal, utc time hour, freq in Hz col_t = [GObject.TYPE_UINT, GObject.TYPE_STRING, GObject.TYPE_UINT, GObject.TYPE_UINT, GObject.TYPE_STRING] model = Gtk.ListStore(*col_t) self.area_tv.set_model(model) self.area_tv.set_property("rules_hint", True) self.area_tv.set_property("enable_search", False) self.area_tv.set_headers_visible(True) self.area_tv.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # col idx self.area_tv_idx_year = 0 self.area_tv_idx_month_n = 1 self.area_tv_idx_month_i = 2 self.area_tv_idx_utc = 3 self.area_tv_idx_freq = 4 title = _("Year") cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.area_tv_idx_year) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(self.area_tv_idx_year) self.area_tv.append_column(tvcol) title = _("Month") cell = Gtk.CellRendererText() tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.area_tv_idx_month_n) tvcol.set_sort_column_id(self.area_tv_idx_month_n) tvcol.set_resizable(True) tvcol.set_reorderable(True) self.area_tv.append_column(tvcol) title = _("Time (UTC)") cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.area_tv_idx_utc) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(self.area_tv_idx_utc) self.area_tv.append_column(tvcol) title = _("Frequency (MHz)") cell = Gtk.CellRendererText() cell.set_property('xalign', 1.0) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text' , self.area_tv_idx_freq) tvcol.set_resizable(True) tvcol.set_reorderable(True) tvcol.set_sort_column_id(self.area_tv_idx_freq) self.area_tv.append_column(tvcol) def build_area_template_ts(self): # loads templates from a file and populates the combobox model = self.templatescb.get_model() if not model: col_t = [GObject.TYPE_STRING, GObject.TYPE_PYOBJECT] # name, (year,month,utc,freq) model = Gtk.ListStore(*col_t) self.templatescb.set_model(model) cell = Gtk.CellRendererText() self.templatescb.pack_start(cell, True) self.templatescb.add_attribute(cell, 'text', 0) model.clear() # this hack for letting the templates subdir be parth of the path # so the templates/*.py can import between themselves current_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.join(current_dir, 'templates')) # Revised module loading thanks to the following link # http://stackoverflow.com/questions/3365740/how-to-import-all-submodules for loader, module_name, is_pkg in pkgutil.walk_packages(templates.__path__): try: t_o = loader.find_module(module_name).load_module(module_name).templates(self.main_window, self.ssn_repo) except Exception as X: print((" Failed to import module %s %s ") % (module_name, X)) continue # set module parameters ps = t_o.get_params() for p in ps: try: t_o.__dict__[p] = self.__dict__[p] except Exception as X: print(_("Fail to set property %s in template %s: %s") % (p, f, X)) # make the module get ready for use later ret = t_o.load() if ret: print(_("Can't load() template module %s") % f) continue for tname in t_o.get_names(): model.append([tname, t_o]) if not len(model): # put an informative entry in the model model.append([_('There are no templates available'), None]) else: model.prepend([_('Select a template to load'), None]) self.templatescb.set_active(0) self.add_templ_btn.set_sensitive(False) def area_templatescb_change(self, *args): active = self.templatescb.get_active() if not active:# 0 is the indicative default, not a real template self.add_templ_btn.set_sensitive(False) else: self.add_templ_btn.set_sensitive(True) def p2p_useday_tog(self, *args): change_to = None e = ee = '' #we only need to display a warning if the coeffs change. if self.p2pusedayck.get_active(): e = _("URSI88 coefficients") ee = _("Specifying days forces the use of URSI88 coefficients. ") if len(self.p2pmy_tv.get_model()): ee += _("Values of 'day' in existing entries will be set to '1'.") change_to = 1 else: e = _("Not specifing days reverts the forced use of URSI88 coefficients. \ The current setting is %s.") % ('CCIR' if (self.model_combo.get_active()==0) else 'URSI88') if len(self.p2pmy_tv.get_model()): ee = _("All existing day values will be deleted.") change_to = 0 dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK_CANCEL, e) dialog.set_title(_('Warning')) dialog.format_secondary_text(ee) ret = dialog.run() dialog.destroy() if ret != -5: self.p2pusedayck.handler_block(self.p2puseday_handler_id) if self.p2pusedayck.get_active(): self.p2pusedayck.set_active(False) else: self.p2pusedayck.set_active(True) self.p2pusedayck.handler_unblock(self.p2puseday_handler_id) return self.p2p_useday = self.p2pusedayck.get_active() if self.p2p_useday: self.model_combo.set_active(1) self.model_combo.set_sensitive(False) else: self.model_combo.set_sensitive(True) self.p2pdayspinbutton.set_sensitive(self.p2p_useday) model = self.p2pmy_tv.get_model() iter = model.get_iter_first() while iter: model.set_value(iter, self.p2pmy_tv_idx_day, change_to) iter = model.iter_next(iter) def p2p_calendar(self, *args): def calendar_retval(cal, dialog): dialog.response(Gtk.ResponseType.ACCEPT) dialog = Gtk.Dialog(_("Select date"), self.main_window, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.WindowPosition.CENTER_ON_PARENT, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) cal = Gtk.Calendar() cal.connect('day-selected-double-click', calendar_retval, dialog) dialog.vbox.pack_start(cal, True, True, 0) dialog.show_all() # set def date as the last date used, else let it default to today try: cal.select_month(self.p2pcal_last[1], self.p2pcal_last[0]) cal.select_day(self.p2pcal_last[2]) except: pass ret = dialog.run() dialog.destroy() if ret != -3: #ok return self.p2pcal_last = cal.get_date() self.p2pmy_add_tv_rows([(self.p2pcal_last[2], self.p2pcal_last[1]+1, self.p2pcal_last[0])]) def p2pmy_add_tv_row_from_user(self, *args): day = self.p2pdayspinbutton.get_value_as_int() month_i = self.p2pmonthspinbutton.get_value_as_int() year = self.p2pyearspinbutton.get_value_as_int() self.p2pmy_add_tv_rows([(day, month_i, year)]) def p2pfreq_add_tv_row_from_user(self, *args): freq = self.p2pfreqspinbutton.get_value() self.p2pfreq_add_tv_rows([(freq)]) def p2pmy_add_tv_rows(self, rows): # rows: a list of (day, month_i, year) tuples tv_model = self.p2pmy_tv.get_model() had_rows = len(tv_model) for (day, month_i, year) in rows: day = day if self.p2p_useday else 0 month_n = time.strftime('%B', time.strptime(str(month_i), '%m')) row = [] row.insert(self.p2pmy_tv_idx_day, day) row.insert(self.p2pmy_tv_idx_month_n, month_n) row.insert(self.p2pmy_tv_idx_month_i, month_i) row.insert(self.p2pmy_tv_idx_year, year) iter = tv_model.append(row) self.p2pmydelbt.set_sensitive(True) self.p2pmyrstbt.set_sensitive(True) self.update_p2p_run_button_status() # if self.area_templates_file: # self.p2psavebt.set_sensitive(True) # self.verify_input_data(None) # def focus first row if the tv was previously empty if not had_rows: self.p2pmy_tv.set_cursor(0) def p2pfreq_add_tv_rows(self, rows): # rows: a list of (freq) tuples tv_model = self.p2pfreq_tv.get_model() had_rows = len(tv_model) for (freq) in rows: row = [] row.insert(self.p2pfreq_tv_idx_freq, '%.3f' % freq) iter = tv_model.append(row) self.p2pfreqdelbt.set_sensitive(True) self.p2pfreqrstbt.set_sensitive(True) self.update_p2p_run_button_status() if not had_rows: self.p2pfreq_tv.set_cursor(0) if len(tv_model) > 11 and not self.max_frequencies_warn: e = _("VOACAP can only process 11 frequencies") dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.CLOSE, e) dialog.format_secondary_text(_('Only the first 11 entries will \ be processed, all other entries will be ignored. Please delete some entries \ from the frequency table.')) dialog.run() dialog.destroy() self.max_frequencies_warn = True def area_add_tv_row_from_user(self, *args): year = self.areayearspinbutton.get_value_as_int() month_i = self.monthspinbutton.get_value_as_int() utc = self.utcspinbutton.get_value_as_int() freq = self.freqspinbutton.get_value() self.area_add_tv_rows([(year, month_i, utc, freq)]) def area_add_tv_rows(self, rows):#month_i, utc, freq, model=self.area_tv.get_model()): # rows: a list of (month_i, utc, freq) tuples tv_model = self.area_tv.get_model() had_rows = len(tv_model) for (year, month_i, utc, freq) in rows: month_n = time.strftime('%B', time.strptime(str(month_i), '%m')) row = [] row.insert(self.area_tv_idx_year, year) row.insert(self.area_tv_idx_month_n, month_n) row.insert(self.area_tv_idx_month_i, month_i) row.insert(self.area_tv_idx_utc, utc) row.insert(self.area_tv_idx_freq, '%.3f' % freq) iter = tv_model.append(row) self.area_delbt.set_sensitive(True) self.area_clear_btn.set_sensitive(True) self.update_area_run_button_status() # def focus first row if the tv was previously empty if not had_rows: self.area_tv.set_cursor(0) #let the user know we did not run all their data if len(tv_model) > self.max_vg_files and not self.max_vg_files_warn: e = _("VOACAP can only process %d area entries") % self.max_vg_files dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.CLOSE, e) dialog.format_secondary_text(_('Only the first 12 entries will \ be processed, all other entries will be ignored. Please delete some entries.')) dialog.run() dialog.destroy() self.max_vg_files_warn = True def p2p_clean_my_tv(self, *args): self.p2pmy_tv.get_model().clear() self.p2pmydelbt.set_sensitive(False) self.p2pmyrstbt.set_sensitive(False) self.update_p2p_run_button_status() def p2p_clean_freq_tv(self, *args): self.p2pfreq_tv.get_model().clear() self.p2pfreqdelbt.set_sensitive(False) self.p2pfreqrstbt.set_sensitive(False) self.update_p2p_run_button_status() def area_clean_tv(self, *args): self.area_tv.get_model().clear() self.area_delbt.set_sensitive(False) self.area_clear_btn.set_sensitive(False) self.area_run_btn.set_sensitive(False) #self.update_p2p_run_button_status() def p2p_del_my_tv_row(self, *args): selection = self.p2pmy_tv.get_selection() if not selection.count_selected_rows(): return model, paths = selection.get_selected_rows() self.p2pmy_tv.freeze_child_notify() self.p2pmy_tv.set_model(None) iters = [] for path in paths: iters.append(model.get_iter(path)) for iter in iters: model.remove(iter) if not len(model): self.p2pmydelbt.set_sensitive(False) self.p2pmyrstbt.set_sensitive(False) self.update_p2p_run_button_status() self.p2pmy_tv.set_model(model) self.p2pmy_tv.thaw_child_notify() # select next row if it's there, or the previous instead last_path = paths[-1][0]+1 for i in range(len(model) +1): last_path -= 1 try: model.get_iter(last_path) except: pass else: self.p2pmy_tv.set_cursor((last_path,)) return def p2p_del_freq_tv_row(self, *args): selection = self.p2pfreq_tv.get_selection() if not selection.count_selected_rows(): return model, paths = selection.get_selected_rows() self.p2pfreq_tv.freeze_child_notify() self.p2pfreq_tv.set_model(None) iters = [] for path in paths: iters.append(model.get_iter(path)) for iter in iters: model.remove(iter) if not len(model): self.p2pfreqdelbt.set_sensitive(False) self.p2pfreqrstbt.set_sensitive(False) self.update_p2p_run_button_status() self.p2pfreq_tv.set_model(model) self.p2pfreq_tv.thaw_child_notify() # select next row if it's there, or the previous instead last_path = paths[-1][0]+1 for i in range(len(model) +1): last_path -= 1 try: model.get_iter(last_path) except: pass else: self.p2pfreq_tv.set_cursor((last_path,)) return def area_del_tv_row(self, *args): selection = self.area_tv.get_selection() if not selection.count_selected_rows(): return model, paths = selection.get_selected_rows() self.area_tv.freeze_child_notify() self.area_tv.set_model(None) iters = [] for path in paths: iters.append(model.get_iter(path)) for iter in iters: model.remove(iter) if not len(model): self.area_delbt.set_sensitive(False) self.area_clear_btn.set_sensitive(False) self.update_area_run_button_status() self.area_tv.set_model(model) self.area_tv.thaw_child_notify() # select next row if it's there, or the previous instead last_path = paths[-1][0]+1 for i in range(len(model) +1): last_path -= 1 try: model.get_iter(last_path) except: pass else: self.area_tv.set_cursor((last_path,)) return def p2p_save_as_template(self, *args): pass def area_save_as_template(self, *args): ''' saves area_tv model content as a template ''' global ok_bt global nentry def text_change(self, *args): global ok_bt global nentry if len(nentry.get_text()): ok_bt.set_sensitive(True) else: ok_bt.set_sensitive(False) dialog = Gtk.Dialog(_("Creating new area template"), self.main_window, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT)) hb = Gtk.HBox(2) label = Gtk.Label(label=_("Template name")) hb.pack_start(label, True, True, 0) nentry = Gtk.Entry(max=50) nentry.connect("changed", text_change) hb.pack_start(nentry, True, True, 0) hb.show_all() dialog.vbox.pack_start(hb, True, True, 0) ok_bt = Gtk.Button(None, Gtk.STOCK_OK) ok_bt.set_sensitive(False) ok_bt.show() dialog.add_action_widget(ok_bt, Gtk.ResponseType.ACCEPT) response = dialog.run() if response == -3: # accept # save it fd = open(os.path.expandvars(self.area_templates_file), 'a') fd.write(_('\n#template created by voacap GUI')) title = nentry.get_text() fd.write('\n[%s]' % title) fd.write(_('\n#month utchour freq')) model = self.area_tv.get_model() iter = model.get_iter_first() while iter: m,u,f = model.get(iter,1,2,3) fd.write('\n%02d %02d %.3f' % (m,u,float(f))) iter = model.iter_next(iter) fd.write(_('\n#End of %s') % title) fd.close() # reload templates_file to repopulate templatescb, then # select this recently saved as the active one self.build_area_template_ts() model = self.templatescb.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == title: self.templatescb.set_active_iter(iter) break iter = model.iter_next(iter) dialog.destroy() def area_add_template(self, *args): active = self.templatescb.get_active() if not active:# 0 is the indicative default, not a real template return model = self.templatescb.get_model() t_n = model.get_value(model.get_iter(active), 0) t_o = model.get_value(model.get_iter(active), 1) model = self.area_tv.get_model() if t_o.set_ini(model): print("Can't initialize module %s" % t_n) return if t_o.run(): return try: templ_tups = t_o.ret_templates[t_n] except: pass if templ_tups: self.area_add_tv_rows(templ_tups) #####################SSN Tab functions follow def ssn_build_tv(self): self.ssn_tv.set_model(self.ssn_repo) self.ssn_file_data_label.set_text(self.ssn_repo.get_file_data()) self.ssn_tv.set_property("rules_hint", True) self.ssn_tv.set_property("enable_search", False) self.ssn_tv.set_headers_visible(True) # col idx self.ssn_tv_idx_year = 0 title = _("Year") cell = Gtk.CellRendererText() font = Pango.FontDescription('bold') cell.set_property('font-desc', font) tvcol = Gtk.TreeViewColumn(title, cell) tvcol.add_attribute(cell, 'text', self.ssn_tv_idx_year) tvcol.set_sort_column_id(self.area_tv_idx_month_n) tvcol.set_resizable(True) tvcol.set_sizing(Gtk.TreeViewColumnSizing.FIXED) tvcol.set_expand(True) self.ssn_tv.append_column(tvcol) for i in range (1,13): cell = Gtk.CellRendererText() cell.set_property('xalign', 0.5) tvcol = Gtk.TreeViewColumn(calendar.month_abbr[i], cell) tvcol.set_alignment(0.5) tvcol.add_attribute(cell, 'text', i) #tvcol.add_attribute(cell, 'font', i+13) tvcol.set_resizable(True) tvcol.set_sizing(Gtk.TreeViewColumnSizing.FIXED) tvcol.set_expand(True) self.ssn_tv.append_column(tvcol) ssn_thumb = VOASSNThumb(self.ssn_repo) _th = ssn_thumb.get_thumb() _th.show() self.ssn_plot_box.pack_start(_th, True, True, 0) self.scroll_ssn_tv_to_current_year() def nb_switch_page(self, *args): # area is the last page in the nb if self.notebook.get_n_pages() == args[2] +1: if not self.area_accelgrp: self.area_accelgrp = Gtk.AccelGroup() self.area_accelgrp.connect(0xffff, 0, 0, self.area_del_tv_row) self.main_window.add_accel_group(self.area_accelgrp) else: if self.area_accelgrp: self.main_window.remove_accel_group(self.area_accelgrp) self.area_accelgrp = None def show_area_chooser(self, widget): dialog = VOAAreaChooser(self.area_rect, self.area_chooser_map_size, parent=self.main_window, datadir=self.datadir) return_code, return_rect, return_size = dialog.run() if (return_code == 0): # 0=ok, 1=cancel self.area_rect = return_rect self.area_chooser_map_size = return_size self.area_label.set_text(self.area_rect.get_formatted_string()) def run_prediction(self, button): voacapl_args = '' if button == self.area_run_btn: voacapl_args = self.itshfbc_path ################################################################### vf = VOAFile(os.path.join(os.path.expanduser("~"),'itshfbc','areadata','pyArea.voa')) vf.set_gridsize(self.gridsizespinbutton.get_value()) vf.set_location(vf.TX_SITE, self.tx_site_entry.get_text(), self.tx_lon_spinbutton.get_value(), self.tx_lat_spinbutton.get_value()) vf.P_CENTRE = vf.TX_SITE vf.set_xnoise(self.mm_noise_spinbutton.get_value()) vf.set_amind(self.min_toa_spinbutton.get_value()) vf.set_xlufp(self.reliability_spinbutton.get_value()) vf.set_rsn(self.snr_spinbutton.get_value()) vf.set_pmp(self.mpath_spinbutton.get_value()) vf.set_dmpx(self.delay_spinbutton.get_value()) vf.set_psc1(self.foe_spinbutton.get_value()) vf.set_psc2(self.fof1_spinbutton.get_value()) vf.set_psc3(self.fof2_spinbutton.get_value()) vf.set_psc4(self.foes_spinbutton.get_value()) vf.set_area(self.area_rect) # Antennas, gain, tx power, bearing #def set_rx_antenna(self, data_file, gain=0.0, bearing=0.0): #rel_dir, file, description = self.ant_list[self.rx_ant_combobox.get_active()] vf.set_rx_antenna(self.rx_antenna_path.ljust(21), 0.0, self.rx_bearing_spinbutton.get_value()) #def set_tx_antenna(self, data_file, design_freq=0.0, bearing=0.0, power=0.125): #rel_dir, file, description = self.ant_list[self.tx_ant_combobox.get_active()] vf.set_tx_antenna(self.tx_antenna_path.ljust(21), 0.0, self.tx_bearing_spinbutton.get_value(), self.tx_power_spinbutton.get_value()/1000.0) vf.clear_plot_data() # treeview params model = self.area_tv.get_model() iter = model.get_iter_first() # we're limited to 12 entries here i = 0 while iter and i < self.max_vg_files: year = int(model.get_value(iter, self.area_tv_idx_year)) month_i = float(model.get_value(iter, self.area_tv_idx_month_i)) utc = model.get_value(iter, self.area_tv_idx_utc) freq = model.get_value(iter, self.area_tv_idx_freq) # ssn entries are named as months (jan_ssn_entry) so to be sure # we're getting the correct one, we need to map them ssn = self.ssn_repo.get_ssn(str(int(month_i)), year) vf.add_plot((freq, utc, month_i, ssn)) iter = model.iter_next(iter) i = i+1 vf.write_file() #let the user know we did not run all their data if iter: e = _("VOACAP can only process %d area entries") % self.max_vg_files dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.WARNING, Gtk.ButtonsType.CLOSE, e) dialog.format_secondary_text(_('Only the first 12 entries will be processed,\ all other entries will be ignored.')) dialog.run() dialog.destroy() self.statusbar.pop(self.area_context_id) self.statusbar.push(self.area_context_id, "Running prediction...") while Gtk.events_pending(): Gtk.main_iteration() ret = os.spawnlp(os.P_WAIT, 'voacapl', 'voacapl', os.path.join(os.path.expanduser("~"), 'itshfbc'), "area", "calc", "pyArea.voa") if ret: self.statusbar.pop(self.area_context_id) e = "voacapl returned %s. Can't continue." % ret dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, e ) dialog.run() dialog.destroy() return -1 self.statusbar.pop(self.area_context_id) s = os.path.join(os.path.expanduser("~"), 'itshfbc','areadata','pyArea.voa') graph = VOAAreaPlotGUI(s, parent=self.main_window, enable_save=True, datadir=self.datadir) graph.quit_application() #P2P Predictions follow if button == self.p2prunbt: iter = self.p2pmethodcb.get_active_iter() method = self.p2pmethodcb.get_model().get_value(iter, 0) run_type = 'c' if self.p2pcircuitckb.get_active() else 'g' _coeff = 'CCIR' if (self.model_combo.get_active()==0) else 'URSI88' _path = VOADatFile.SHORT_PATH if (self.path_combo.get_active()==0) else VOADatFile.LONG_PATH input_filename = 'voacapg.dat' if run_type == 'g' else 'voacapx.dat' output_filename = 'voacapg.out' if run_type == 'g' else 'voacapx.out' data_file_format = VOADatFile.GRAPHICAL_FORMAT if run_type == 'g' else VOADatFile.CIRCUIT_FORMAT df = VOADatFile(self.itshfbc_path + os.sep + 'run' + os.sep + input_filename) voacapl_args = self.itshfbc_path + ' ' + input_filename + ' ' + output_filename df.set_title([_('File generated by voacap-gui (www.qsl.net/hz1jw)'), _('File created: ')+datetime.datetime.now().strftime('%X %a %d %b %y')]) df.set_linemax(55) #method = method if rt == 'g' else c_method df.set_method(method) df.set_coeffs(_coeff) df.set_sites(HamLocation(self.tx_lat_spinbutton.get_value(), self.tx_lon_spinbutton.get_value(), self.tx_site_entry.get_text()), HamLocation(self.rx_lat_spinbutton.get_value(), self.rx_lon_spinbutton.get_value(), self.rx_site_entry.get_text()), _path) df.set_system(self.tx_power_spinbutton.get_value()/1000.0,\ abs(self.mm_noise_spinbutton.get_value()),\ self.min_toa_spinbutton.get_value(),\ self.reliability_spinbutton.get_value(),\ self.snr_spinbutton.get_value(),\ self.mpath_spinbutton.get_value(),\ self.delay_spinbutton.get_value()) if run_type == 'c': # The frequencies are only applicable when performing text based predictions. # voacap can accept up to 11 entries in the list. # entries may be specified up to 3 decimal places. # longer lists, additional precision will be truncated # by the set_frequency_list method. # (The example freqs below are PSK31 calling freqs...) # df.set_frequency_list((3.580, 7.035, 10.140, 14.070, 18.1, 21.08, 28.12)) freqs = [] model = self.p2pfreq_tv.get_model() iter = model.get_iter_first() while iter: try: freqs.append(float(model.get_value(iter, self.p2pfreq_tv_idx_freq))) except: pass iter = model.iter_next(iter) df.set_frequency_list(tuple(freqs)) df.set_antenna(VOADatFile.TX_ANTENNA, self.tx_antenna_path.ljust(21), self.tx_bearing_spinbutton.get_value(), self.tx_power_spinbutton.get_value()/1000.0) df.set_antenna(VOADatFile.RX_ANTENNA, self.rx_antenna_path.ljust(21), self.rx_bearing_spinbutton.get_value()) df.set_fprob(self.foe_spinbutton.get_value(), self.fof1_spinbutton.get_value(), self.fof2_spinbutton.get_value(), self.foes_spinbutton.get_value()) # ssn_list is a list of tuples (day, month, year, ssn) ssn_list = [] model = self.p2pmy_tv.get_model() iter = model.get_iter_first() day = 0 while iter: if self.p2pusedayck.get_active(): day = model.get_value(iter, self.p2pmy_tv_idx_day) if day: df.set_coeffs('URSI88') month = model.get_value(iter, self.p2pmy_tv_idx_month_i) year = model.get_value(iter, self.p2pmy_tv_idx_year) ssn = self.ssn_repo.get_ssn(month, year) if not ssn: e = _("Can't find SSN number for <%(m)s>-<%(y)s>. Can't continue without all SSNs.") % {'m':month, 'y':year} dialog = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, e ) dialog.run() dialog.destroy() return -1 ssn_list.append((day, month, year, ssn)) iter = model.iter_next(iter) df.set_ssn(ssn_list) df.write_file(data_file_format) try: retcode = subprocess.call("voacapl -s " + voacapl_args, shell=True) """ Return Codes: 0 - Success 127 - error while loading shared libraries """ if retcode == 0: if run_type == 'c': result_dialog = VOATextFileViewDialog(file=self.itshfbc_path+os.sep+'run'+os.sep+output_filename, datadir=self.datadir, parent=self.main_window) return_code = result_dialog.run() if run_type == 'g': graph = VOAP2PPlotGUI(self.itshfbc_path+os.sep+'run'+os.sep+output_filename, parent=self.main_window, datadir=self.datadir) graph.quit_application() else: self.show_msg_dialog("Error", "Voacapl error code: {:d}".format(retcode), msg_type="ERROR") except OSError as e: print("Voacapl execution failed:", e) def show_yelp(self, widget): Gtk.show_uri(None, "help:voacapgui", Gdk.CURRENT_TIME) def show_about_dialog(self, widget): about = Gtk.AboutDialog(parent=self.main_window, program_name = "voacapgui", version = self.pythonprop_version, authors = (("J.Watson (HZ1JW/M0DNS)", "Fernando M. Maresca (LU2DFM)")), comments = (_("A voacap GUI")), website = "http://www.qsl.net/hz1jw", logo = (GdkPixbuf.Pixbuf.new_from_file(os.path.join(self.datadir, "ui", "voacap.png")))) about.run() about.destroy() def build_new_template_file(self): fn = os.path.join(self.prefs_dir,'area_templ.ex') s = _('''# rough format for area plot templates: # lines starting with # are ignored # each line consist in three values separated by spaces # each template is preceded by a name enclosed in square brackets: # [template name] # tags # month utchour freq # 11 22 14.250 # month: number month, 1=January # utchour: UTC time HOUR, 00 to 23 # freq: frequecy in MHz # example: all months at midnight on 14.100 MHz [All months midnight 14.100 Mhz] #year month utchour freq 2010 01 00 14.10 2010 02 00 14.10 2010 03 00 14.10 2010 04 00 14.10 2010 05 00 14.10 2010 06 00 14.10 2010 07 00 14.10 2010 08 00 14.10 2010 09 00 14.10 2010 10 00 14.10 2010 11 00 14.10 2010 12 00 14.10 [All months at 1600z 7.500 MHz] #month utchour freq 2010 01 16 7.5 2010 02 16 7.5 2010 03 16 7.5 2010 04 16 7.5 2010 05 16 7.5 2010 06 16 7.5 2010 07 16 7.5 2010 08 16 7.5 2010 09 16 7.5 2010 10 16 7.5 2010 11 16 7.5 2010 12 16 7.5 \n ''') with open(fn, 'w') as templates_def_fd: templates_def_fd.write(s) self.area_templates_file = fn def get_vgz_filename(self): dialog = Gtk.FileChooserDialog("Please select a vgz file", self.main_window, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, "Select", Gtk.ResponseType.OK)) filter_vgz = Gtk.FileFilter() filter_vgz.set_name(".vgz files") filter_vgz.add_pattern("*.vgz") dialog.add_filter(filter_vgz) dialog.set_default_size(800, 400) response = dialog.run() vgzip_file = "" if response == Gtk.ResponseType.OK: vgzip_file = dialog.get_filename() dialog.destroy() return vgzip_file def open_vgz_file(self,widget): vgzip_file = self.get_vgz_filename() if vgzip_file != "": try: graph = VOAAreaPlotGUI(vgzip_file, parent=self.main_window, enable_save=False, datadir=self.datadir) graph.quit_application() except zipfile.BadZipFile as e: self.show_msg_dialog("VGZ Error", "Error opening {:s}".format(vgzip_file), msg_type="ERROR") """ # This is on hold until I figure out a way to save the year along with # the voa file (maybe a comment?) def restore_from_voa_file(self, widget): vgzip_file = self.get_vgz_filename() voa_file = VOAFile(vgzip_file) voa_file.parse_file() self.tx_site_entry.set_text(voa_file.get_tx_label()) self.tx_lat_spinbutton.set_value(voa_file.get_tx_lat()) self.tx_lon_spinbutton.set_value(voa_file.get_tx_lon()) self.gridsizespinbutton.set_value(voa_file.get_gridsize()) self.tx_antenna_entry.set_text(voa_file.get_txAntenna()) self.tx_antenna_path = voa_file.get_txAntenna() self.tx_bearing_spinbutton.set_value(voa_file.get_txBearing()) self.tx_power_spinbutton.set_value(voa_file.get_txPower() * 1000) self.area_rect=voa_file.get_area_rect() self.area_label.set_text(self.area_rect.get_formatted_string()) #self.area_add_tv_rows([(year, month_i, utc, freq)]) self.area_add_tv_rows([(2018, 5, 2, 15.310)]) self.mm_noise_spinbutton.set_value(voa_file.get_xnoise()) self.min_toa_spinbutton.set_value(voa_file.get_amind()) self.reliability_spinbutton.set_value(voa_file.get_xlufp()) self.snr_spinbutton.set_value(voa_file.get_rsn()) self.mpath_spinbutton.set_value(voa_file.get_pmp()) self.delay_spinbutton.set_value(voa_file.get_dmpx()) self.foe_spinbutton.set_value(voa_file.get_psc1()) self.fof1_spinbutton.set_value(voa_file.get_psc2()) self.fof2_spinbutton.set_value(voa_file.get_psc3()) self.foes_spinbutton.set_value(voa_file.get_psc4()) #self.open_vgz_file(vgzip=vgzip_file) """ # INFO, WARNING & ERROR messages def show_msg_dialog(self, msg_title, msg_body, msg_type='INFO'): dialog = Gtk.MessageDialog(self.main_window, 0, getattr(Gtk.MessageType, msg_type), Gtk.ButtonsType.CANCEL, msg_title) dialog.format_secondary_text(msg_body) dialog.run() dialog.destroy() def quit_application(self, widget): self.save_user_prefs() Gtk.main_quit sys.exit(0) def run(self, argv): print("run") self.connect('activate', self.on_activate) return super(VOACAP_GUI, self).run(argv) def main(argv, datadir="", pythonprop_version="dev"): if not datadir: print("no datadir defined, using current dir") datadir = os.path.dirname(os.path.realpath(sys.argv[0])) app = VOACAP_GUI(datadir=datadir, pythonprop_version=pythonprop_version) try: Gtk.main() except KeyboardInterrupt: sys.exit(1) if __name__ == '__main__': main(sys.argv) pythonprop-0.30.1/src/pythonprop/voaTextFileViewDialog.py0000664000175000017500000001071313662771311020541 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voaTextFileViewDialog # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # Dialog box that displays the contents of a voacap circuit prediction import sys import os from gi.repository import Pango from .voaOutFilePrinter import VOAOutFilePrinter try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject except: pass try: from gi.repository import Gtk # import Gtk.glade except: sys.exit(1) class VOATextFileViewDialog: """GUI to display the result of a voacap circuit prediction""" # todo set the users itshfdata directory. todo mofify to suit windows as well... # todo maybe read it as an argument in case we can't guess it... itshfbc_path = os.path.expanduser("~")+os.sep+'itshfbc' file = '' # http://www.rexx.com/~dkuhlman/python_201/python_201.html#SECTION008210000000000000000 def __init__(self, file=None, datadir="", parent=None): self.file=file self.datadir=datadir self.parent=parent def run(self): """This function will show the site selection dialog""" self.ui_file = os.path.join(self.datadir, "ui", "voaTextFileViewDialog.ui") self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("text_file_view_dialog", "text_view", "text_buffer", "save_button", "print_button", "close_button") self.save_button.connect("clicked", self.on_save_clicked) self.print_button.connect("clicked", self.on_print_clicked) self.text_file_view_dialog.set_transient_for(self.parent) self.text_view.modify_font(Pango.FontDescription("Luxi Mono 10")) self.results_text = open(self.file, "r").read().replace('\f','') try: self.text_buffer.set_text(self.results_text) except: print(_('Failed to read file: '), self.file) self.result = self.text_file_view_dialog.run() self.text_file_view_dialog.destroy() return None def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) def on_print_clicked(self, widget): p = VOAOutFilePrinter(self.file) p.run(parent=self.parent) def on_save_clicked(self, widget): dialog = Gtk.FileChooserDialog("Please choose a file", self.parent, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) #self.add_filters(dialog) response = dialog.run() if response == Gtk.ResponseType.OK: try: file = open(dialog.get_filename(), "w") file.write(self.results_text) file.close() success_dialog = Gtk.MessageDialog(self.parent, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "File Saved") success_dialog.format_secondary_text( "File saved as {:s}.".format(file.name)) success_dialog.run() success_dialog.destroy() except: error_dialog = Gtk.MessageDialog(self.parent, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Error") error_dialog.format_secondary_text( "Error saving data to {:s}".format(file.name)) error_dialog.run() error_dialog.destroy() elif response == Gtk.ResponseType.CANCEL: pass dialog.destroy() pythonprop-0.30.1/src/pythonprop/Makefile.am0000664000175000017500000000142013662771311016011 00000000000000## Process this file with automake to produce Makefile.in ## http://www.micahcarrick.com/tutorials/autotools-tutorial-python-gtk/getting-started.html#section_4 SUBDIRS=ui templates pythonprop_PYTHON= \ vgzArchive.py \ voa3DPlot.py \ voaAreaPlot.py \ voaAreaPlotgui.py \ voaP2PPlot.py \ voaP2PPlotgui.py \ voaP2PPlotServer.py \ voacapgui.py \ hamlocation.py \ scriptutil.py \ ssnFetch.py \ treefilebrowser.py \ voaAntennaChooser.py \ voaAreaChooser.py \ voaAreaRect.py \ voaDatFile.py \ voaDefaults.py \ voaFile.py \ voaMeth26Out.py \ voaMultiPlot.py \ voaOutFile.py \ voaOutFilePrinter.py \ voaPlotFilePrinter.py \ voaPlotWindow.py \ voaSiteChooser.py \ voaSSNThumb.py \ voaTextFileViewDialog.py \ __init__.py pythonpropdir = $(pythondir)/pythonprop pythonprop-0.30.1/src/pythonprop/voaP2PPlotgui.py0000664000175000017500000002062413736105314017005 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voaP2PPlotgui.py # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import sys import os import datetime import gettext import locale from gi.repository import GObject from gi.repository import Gtk GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install()#app, local_path) # glade file # see http://bugzilla.gnome.org/show_bug.cgi?id=344926 for why the # next two commands look repeated. # todo restore the calls below #Gtk.glade.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) #Gtk.glade.textdomain(GETTEXT_DOMAIN) gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) from .voaOutFile import VOAOutFile from .voaP2PPlot import VOAP2PPlot from .voa3DPlot import VOA3DPlot class VOAP2PPlotGUI: """GUI to create VOAArea Input Files""" # set the users itshfdata directory. # todo mofify to suit windows as well... itshfbc_path = os.path.expanduser("~")+os.sep+'itshfbc' plot_type_d = { 0: _('None'), 1: _('MUFday'), 2: _('Reliability'), 3: _('SNR'), 4: _('DBW') } cmap_d = {'bone': _('bone'), 'cool': _('cool'), 'copper': _('copper'), 'gray': _('gray'), 'hot': _('hot'), 'hsv': _('hsv'), 'jet': _('jet'), 'pink': _('pink'), 'spring': _('spring'), 'summer': _('summer'), 'winter': _('winter'), 'portland': _('portland')} def __init__(self, data_source_filename, parent = None, datadir=""): self.datadir = datadir self.in_filename = data_source_filename #todo check the file exists in_file = VOAOutFile(self.in_filename) #self.uifile = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), "voaP2PPlotgui.ui") self.parent = parent """ if self.parent: self.ui_file = os.path.join(self.datadir, "ui", "voaP2PPlotDialog.ui") else: self.ui_file = os.path.join(self.datadir, "ui", "voaP2PPlotWindow.ui") """ #self.wTree = Gtk.Builder.new_from_file(self.ui_file) self.ui_file = os.path.join(self.datadir, "ui", "voaP2PPlotBox.ui") self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("main_box", "type_combobox", "group_combobox", "tz_spinbutton", "contour_checkbutton", "cmap_combobox") if not self.parent: self.win = Gtk.Window() self.win.set_title(_("Plot Control")) self.win.add(self.main_box) else: self.win = Gtk.Dialog("Plot Control", self.parent) self.win.get_content_area().add(self.main_box) if in_file.get_number_of_groups() >= 2: self.plot_type_d[5] = _('3D: MUF') self.populate_combo(self.type_combobox, self.plot_type_d, 'value') model = self.type_combobox.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == '2': # reliability self.type_combobox.set_active_iter(iter) break iter = model.iter_next(iter) self.populate_combo(self.cmap_combobox, self.cmap_d, 'value') model = self.cmap_combobox.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == 'jet': self.cmap_combobox.set_active_iter(iter) break iter = model.iter_next(iter) d = { 0 : _('All Plots'),} l = in_file.get_group_titles() d.update(list(zip(list(range(1, len(l)+1)), l))) self.populate_combo(self.group_combobox, d, 'key') event_dic = { "on_dialog_destroy" : self.quit_application, "on_cancel_button_clicked" : self.quit_application, "on_ok_button_clicked" : self.run_plot} self.wTree.connect_signals(event_dic) self.type_combobox.connect("changed", self.on_type_combo_changed) self.win.connect('delete_event', self.quit_application) if self.parent: self.win.run() else: self.win.show_all() Gtk.main() def run_plot(self, widget): # _color_map = self.cmap_list[self.cmap_combobox.get_active()] # _data_type = self.type_combobox.get_active() _data_type = int(self.type_combobox.get_model().get_value(self.type_combobox.get_active_iter(), 0)) _filled_contours = self.contour_checkbutton.get_active() _color_map = self.cmap_combobox.get_model().get_value(self.cmap_combobox.get_active_iter(), 0) if self.group_combobox.get_active() == 0: _plot_groups = ['a'] else: _plot_groups = [int(self.group_combobox.get_model().get_value(self.group_combobox.get_active_iter(),0))-1] _time_zone = self.tz_spinbutton.get_value_as_int() plot_parent = self.parent if self.parent else self.win if _data_type < 5: plot = VOAP2PPlot(self.in_filename, data_type = _data_type, plot_groups = _plot_groups, time_zone = _time_zone, color_map = _color_map, filled_contours = _filled_contours, parent = plot_parent) else: # do a 3D plot plot = VOA3DPlot(self.in_filename, color_map = _color_map, parent = plot_parent) #self.dialog.run() def populate_combo(self, cb, d, sort_by='value'): _model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING) items = list(d.items()) if sort_by == 'value': items = [(v, k) for (k, v) in items] items.sort() items = [(k, v) for (v, k) in items] if sort_by == 'key': items.sort() for k, v in items: _model.append([str(k), v]) cb.set_model(_model) cell = Gtk.CellRendererText() cb.pack_start(cell, True) cb.add_attribute(cell, 'text', 1) #cb.set_wrap_width(20) cb.set_active(0) def on_type_combo_changed(self, widget): selected_plot_type = int(self.type_combobox.get_model().get_value(self.type_combobox.get_active_iter(), 0)) is_data_plot = False if selected_plot_type in (0, 5) else True self.contour_checkbutton.set_sensitive(is_data_plot) self.cmap_combobox.set_sensitive(is_data_plot) def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) def quit_application(self, *args): self.win.destroy() #only emit main_quit if we're running as a standalone app #todo do we need to do anyother clean-up here if we're _not_ #running as a standalone app if not self.parent: Gtk.main_quit sys.exit(0) if __name__ == "__main__": if (len(sys.argv) != 2): print(_('Usage: voaP2PPlotgui file_to_plot.out')) sys.exit(2) app = VOAP2PPlotGUI(sys.argv[-1]) Gtk.main() pythonprop-0.30.1/src/pythonprop/__init__.py0000664000175000017500000000000013662771311016057 00000000000000pythonprop-0.30.1/src/pythonprop/voaAreaRect.py0000664000175000017500000000635613662771311016540 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: voaAreaRect # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # A small class to encapsulate a geographic area as a rectangle. # class VOAAreaRect: sw_lat = -90.0 sw_lon = -180.0 ne_lat = 90.0 ne_lon = 180.0 def __init__(self, sw_lat=-90.0, sw_lon=-180.0, ne_lat=90.0, ne_lon=180.0): # Check that the rectangle is the right way round self.sw_lat = min(sw_lat, ne_lat) self.sw_lon = min(sw_lon, ne_lon) self.ne_lat = max(sw_lat, ne_lat) self.ne_lon = max(sw_lon, ne_lon) # Check values are in range self.sw_lat = max(self.sw_lat, -90.0) self.sw_lon = max(self.sw_lon, -180.0) self.ne_lat = min(self.ne_lat, 90.0) self.ne_lon = min(self.ne_lon, 180.0) def get_sw_lat(self): return self.sw_lat def get_sw_lon(self): return self.sw_lon def get_ne_lat(self): return self.ne_lat def get_ne_lon(self): return self.ne_lon def get_sw(self): return self.sw_lat, self.sw_lon def set_sw(self, sw_lat=0.0, sw_lon=0.0) : self.sw_lat = sw_lat self.sw_lon = sw_lon def get_ne(self): return self.ne_lat, self.ne_lon def set_ne(self, ne_lat=90.0, ne_lon=180.0) : self.ne_lat = ne_lat self.ne_lon = ne_lon def set_ne_lat(self, ne_lat=90.0): self.ne_lat = ne_lat def set_ne_lon(self, ne_lon=180.0): self.ne_lon = ne_lon def set_sw_lat(self, sw_lat=-90.0): self.sw_lat = sw_lat def set_sw_lon(self, sw_lon=-180.0): self.sw_lon = sw_lon def get_rect(self): return self.sw_lat, self.sw_lon, self.ne_lat, self.ne_lon def get_lon_delta(self): return self.ne_lon - self.sw_lon def get_lat_delta(self): return self.ne_lat - self.sw_lat def get_formatted_string(self): return "(%i\N{DEGREE SIGN}N, %i\N{DEGREE SIGN}E), (%i\N{DEGREE SIGN}N, %i\N{DEGREE SIGN}E)" \ % (int(round(self.sw_lat)), int(round(self.sw_lon)), int(round(self.ne_lat)), int(round(self.ne_lon))) def get_formatted_ne_latitude(self): return "%.2f" % self.ne_lat def get_formatted_ne_longitude(self): return "%.2f" % self.ne_lon def get_formatted_sw_latitude(self): return "%.2f" % self.sw_lat def get_formatted_sw_longitude(self): return "%.2f" % self.sw_lon def contains(self, lat, lon): if ((lat >= self.sw_lat) and (lat <= self.ne_lat) and (lon >= self.sw_lon) and (lon <= self.ne_lon)): return True else: return False pythonprop-0.30.1/src/pythonprop/vgzArchive.py0000664000175000017500000000212513662771311016442 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voaAreaPlotgui.py # # Copyright (c) 2016 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import os import zipfile def get_voa_filename(zname): with zipfile.ZipFile(zname, 'r') as vgzip: file_list = vgzip.namelist() return next(fn for fn in file_list if fn.endswith('.voa')) def get_base_filename(zname): return os.path.splitext(get_voa_filename(zname))[0] pythonprop-0.30.1/src/pythonprop/voaSSNThumb.py0000664000175000017500000000451513662771311016510 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ Show how to make date plots in matplotlib using date tick locators and formatters. See major_minor_demo1.py for more information on controlling major and minor ticks All matplotlib date plotting is done by converting date instances into days since the 0001-01-01 UTC. The conversion, tick locating and formatting is done behind the scenes so this is most transparent to you. The dates module provides several converter functions date2num and num2date """ from datetime import datetime from datetime import date import matplotlib #matplotlib.use('GTK3Agg') from matplotlib.figure import Figure from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas import matplotlib.dates as mdates import matplotlib.mlab as mlab from .ssnFetch import * class VOASSNThumb: def __init__(self, data_source): years = mdates.YearLocator(2) # every year months = mdates.MonthLocator() # every month yearsFmt = mdates.DateFormatter('%y') dt_list, ssn_list = data_source.get_plotting_data() self.figure = Figure(figsize=(12,8), dpi=72) self.figure.patch.set_facecolor('white') self.figure.subplots_adjust(bottom=0.2) self.axis = self.figure.add_subplot(111) self.axis.plot_date(dt_list, ssn_list, '-', lw=2) self.axis.axvline(date.today(), color='r') # format the ticks self.axis.xaxis.set_major_locator(years) self.axis.xaxis.set_major_formatter(yearsFmt) self.axis.grid(True) # rotates and right aligns the x labels, and moves the bottom of the # axes up to make room for them # The following line currently breaks voacapgui if the thumbnail is # inserted into a panel # self.figure.autofmt_xdate(rotation=90) self.canvas = FigureCanvas(self.figure) # a Gtk.DrawingArea def get_thumb(self): return self.canvas #short test routine def main(): s = SSNFetch(save_location="table_international-sunspot-numbers_monthly-predicted.txt") t = VOASSNThumb(s) graph = t.get_thumb() graph.show() first, last = s.get_data_range() dialog = Gtk.Dialog(title='ssn data') dialog.vbox.pack_start(graph, True, True, 0) dialog.set_default_size(350,250) dialog.run() if __name__ == "__main__": main() pythonprop-0.30.1/src/pythonprop/ssnFetch.py0000664000175000017500000002247013662771311016114 00000000000000#! /usr/bin/env python # -*- coding: UTF-8 -*- # # File: ssnFetch.py # # Copyright (c) 2009 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson @@ mac.com # # returns a list of sunspot numbers for the given year # import urllib.request, urllib.parse, urllib.error, re import os.path import shutil import time from datetime import datetime from datetime import date from datetime import timedelta import csv import json import io import urllib.request import gettext, locale, sys try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject except: pass try: from gi.repository import Gtk # import Gtk.glade except: sys.exit(1) GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install()#app, local_path) class NoSSNData(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class SSNFetch(Gtk.ListStore): """ This is a small class to handle retrieving ssn data from a remote location. Data is retreived from the following locations; http://sidc.oma.be/silso/INFO/snmstotcsv.php http://www.sidc.be/silso/FORECASTS/prediML.txt The ssn data is parsed and saved into a single file named ssn.json in the users configuration folder. If this file is found, it is opened and read. If this file does not exist, the file will be retrieved from the Internet. WARNING: In the current version the connection to the internet is automatic and is performed without the users explicit consent. """ # ssn datamodel ssn_dm = {} final_url = 'http://sidc.oma.be/silso/INFO/snmstotcsv.php' pred_url = 'http://www.sidc.be/silso/FORECASTS/prediML.txt' out_fn = 'ssn.json' SSN_START_YEAR = 2005 save_location = "" s_bar = None now = datetime.utcnow() ssn_data = {'retrieved': now.timestamp(), 'sources':[final_url, pred_url], 'ssn':{}} def __init__(self, parent=None, save_location=None, s_bar=None, s_bar_context=None): """ Progress notes will be sent to the status bar defined by s_bar. This may be replaced with a statusbar manager in later versions. """ #The model is structured as follows # 0 - year as text # 1-12: monthly ssn as text columns = [GObject.TYPE_STRING]*13 Gtk.ListStore.__init__( self, *columns ) self.save_location = save_location self.s_bar = s_bar self.s_bar_context = s_bar_context # if no file exists, grab it if not os.path.isfile(self.save_location): e = _("No SSN Data Found") dialog = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL|Gtk.DialogFlags.DESTROY_WITH_PARENT, type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.OK_CANCEL, message_format=e, parent = parent) dialog.format_secondary_text(_('This application needs to connect \ to the internet to retrieve SSN data. Select OK to proceed.')) response = dialog.run() dialog.destroy() if (response == Gtk.ResponseType.OK): self.build_ssn_file() else: raise NoSSNData("User Cancelled SSN Fetch") #age = time.time() - self.get_ssn_mtime() #print "File was saved " + str(age) + "seconds ago." self.open_ssn_file() def progress_reporthook(self, count, block_size, total_size): fraction = float(count * block_size) / float(total_size) fraction = min(fraction, 1.0) * 100.0 msg_str = _("Transferring Data: ")+str(fraction)+"%" print(msg_str) if self.s_bar: self.s_bar.pop(self.s_bar_context) self.s_bar.push(self.s_bar_context, msg_str) while Gtk.events_pending(): Gtk.main_iteration() """ Collect values from the SIDC. As of July 2015, these are around 45% higher than those previously published by NOAA. This function apply a correction (1.45) to bring the values closer to the original NOAA values. """ def build_ssn_file(self): print ("Requesting file from {:s}".format(self.final_url)) final_ssn_data = urllib.request.urlopen(self.final_url) datareader = csv.reader(io.TextIOWrapper(final_ssn_data), delimiter=';') ssn_list = list(datareader) for ssn_record in ssn_list: year = ssn_record[0].strip() if (int(year) >= self.SSN_START_YEAR) and (float(ssn_record[3]) > 0): #print(ssn_record) month = str(int(ssn_record[1])) ssn = float("{:.1f}".format(float(ssn_record[3]) / 1.45)) if ssn_record[0] not in self.ssn_data['ssn']: self.ssn_data['ssn'].update({year:{month:ssn}}) else: self.ssn_data['ssn'][year][month] = ssn print ("Requesting file from {:s}".format(self.pred_url)) response = urllib.request.urlopen(self.pred_url) data = response.read() text = data.decode('utf-8') #print ("Writing data to ssn.json") for line in text.splitlines(): year = line[0:4] month = str(int(line[5:7])) ssn = float(line[20:25]) ssn = float("{:.1f}".format(ssn / 1.45)) if year not in self.ssn_data['ssn']: self.ssn_data['ssn'].update({year:{month:ssn}}) else: self.ssn_data['ssn'][year][month] = ssn with open(self.save_location, 'w') as outfile: json.dump(self.ssn_data, outfile) print ("Saved to {:s}".format(self.save_location)) def open_ssn_file(self): with open(self.save_location) as data_file: self.ssn_data = json.load(data_file) self.populate_liststore() def update_ssn_file(self): self.build_ssn_file() self.clear() self.open_ssn_file() def populate_liststore(self): for year in sorted(self.ssn_data['ssn'].keys()): _ssn_entry = [year] for month in range(1,13): if str(month) in self.ssn_data['ssn'][year]: _ssn_entry.append(str(self.ssn_data['ssn'][year][str(month)])) else: _ssn_entry.append('-') self.append(_ssn_entry) def get_data_range(self): """ Returns a tuple (first, last) of the years covered by the data. """ min_year = int(min(int(y) for y in self.ssn_data['ssn'].keys())) min_month = int(min(int(m) for m in self.ssn_data['ssn'][str(min_year)].keys())) ssn_start_date = date(int(min_year), int(min_month), 15) max_year = int(max(int(y) for y in self.ssn_data['ssn'].keys())) max_month = int(max(int(m) for m in self.ssn_data['ssn'][str(max_year)].keys())) ssn_end_date = date(int(max_year), int(max_month), 15) return(ssn_start_date, ssn_end_date) def get_ssn(self, month, year): if self.ssn_data: try: return self.ssn_data['ssn'][str(year)][str(month)] except: pass return None def get_plotting_data(self): """Returns a pair of lists (date & ssn values) suitable for plotting with matplotlib. """ # Can't this be done with an interpreted list? d_list = [] ssn_list = [] first, last = self.get_data_range() for year in range(first.year, last.year+1): for month in range(1,13): d = date(year, month, 15) if str(month) in self.ssn_data['ssn'][str(year)]: d_list.append(d) ssn_list.append(self.ssn_data['ssn'][str(year)][str(month)]) else: break return d_list, ssn_list def get_ssn_list(self, year=datetime.utcnow().year): if str(year) in self.ssn_data['ssn']: return self.ssn_data['ssn'][str(year)] else: return None def get_ssn_mtime(self): if os.path.isfile(self.save_location): return os.path.getmtime(self.save_location) else: return 0 def get_file_data(self): _mod_time = time.ctime(self.get_ssn_mtime()) return _("SSN Data Modified: \n") + _mod_time pythonprop-0.30.1/src/pythonprop/templates/0000775000175000017500000000000013736105755016043 500000000000000pythonprop-0.30.1/src/pythonprop/templates/area_nextmonths.py0000664000175000017500000000755013662771311021536 00000000000000 from gi.repository import Gtk from datetime import datetime from dateutil.relativedelta import relativedelta def diff_month(d1, d2): return (d1.year - d2.year) * 12 + d1.month - d2.month class templates: name = 'Next N Months' def __init__(self, parent, ssn_repo): self.parent = parent self.ssn_repo = ssn_repo self.ret_templates = {} # { templatename : [(month_i,utc,freq),...]} self.current_month = None self.current_year = None self.current_utc = 12 self.current_freq = 10.0 self.iter = None def get_names(self): return [self.name,] def get_params(self): return [] def load(self): return def set_ini(self, model): if len(model): iter = model.get_iter(len(model)-1) y,m,u,f = model.get(iter,0,2,3,4) self.current_year = y self.current_month = m self.current_utc = u if u else 12 self.current_freq = float(f) if float(f) > 10 else 10.0 def run(self): tups = [] if not self.current_year: cur = datetime.now() else: cur = datetime(self.current_year, self.current_month, 1) if not self.current_month or not self.iter: dialog = Gtk.Dialog(_("Next N Months Area Template Properties"), self.parent, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.WindowPosition.CENTER_ON_PARENT, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) dialog.set_border_width(6) vb = Gtk.VBox() hb = Gtk.HBox(2) l = Gtk.Label(label=_('Number of months to add:')) l.set_alignment(0, 0.5) _min, _max = self.ssn_repo.get_data_range() max_month = diff_month(_max, datetime.now()) print() adj = Gtk.Adjustment(float(self.iter) if self.iter else max_month, 1, max_month, 1, 5, 0) em = Gtk.SpinButton() em.set_adjustment(adj) em.set_wrap(False) em.set_numeric(True) em.set_value(1) hb.pack_start(l, True, True, 0) hb.pack_end(em, True, True, 0) vb.pack_start(hb, True, True, 0) hb = Gtk.HBox(2) l = Gtk.Label(label=_('UTC hour:')) l.set_alignment(0, 0.5) adj = Gtk.Adjustment(self.current_utc, 1.0, 23.0, 1.0, 5.0, 0) eh = Gtk.SpinButton() eh.set_adjustment(adj) eh.set_wrap(True) eh.set_numeric(True) hb.pack_start(l, True, True, 0) hb.pack_end(eh, True, True, 0) vb.pack_start(hb, True, True, 0) hb = Gtk.HBox(2) adj = Gtk.Adjustment(self.current_freq, 3.0, 30.0, 0.1, 1.0, 0) l = Gtk.Label(label=_('Frequency (MHz):')) l.set_alignment(0, 0.5) ef = Gtk.SpinButton() #1.0, 3 ef.set_adjustment(adj) ef.set_digits(3) ef.set_wrap(True) ef.set_numeric(True) ef.set_value(7.1) hb.pack_start(l, True, True, 0) hb.pack_end(ef, True, True, 0) vb.pack_start(hb, True, True, 0) dialog.vbox.pack_start(vb, True, True, 0) dialog.show_all() ret = dialog.run() iter = em.get_value_as_int() utc = eh.get_value_as_int() freq = ef.get_value() dialog.destroy() if ret != -3: return 1 else: utc = self.current_utc freq = self.current_freq iter = self.iter delta = relativedelta(months=+1) for i in range(iter): cur = cur + delta tups.append((cur.year, cur.month, utc, freq)) self.ret_templates[self.name] = tups pythonprop-0.30.1/src/pythonprop/templates/Makefile.am0000664000175000017500000000026413662771311020014 00000000000000templatesdir = $(pythondir)/pythonprop/templates templates_PYTHON = __init__.py \ area_nextmonths.py \ area_userdefined.py \ area_diurnal.py EXTRA_DIST= \ ReadmeTemplates.txt pythonprop-0.30.1/src/pythonprop/templates/ReadmeTemplates.txt0000664000175000017500000000275413662771311021603 00000000000000 Template system --------------- Each file must implement only one class named "templates". This "templates" class can implement one or more templates. The "templates" class has to define this methods: __init__(self, parent) parent is the parent window in case a dialog has to be used get_names(self) return a list of the names of the templates get_params(self) return a list of strings with properties the caller should set on the object. For example, for getting the parent property "prop" set in the templates object scope, this function must return ['prop']. load(self) this is the last step performed by the caller prior to read the names of the templates implemented. This method should do the minimum amount of work because is always called in program start, not upon template usage. set_ini(self, model) the argument this method gets is the TreeModel object of the area plot tab as is at the moment the method is invoked. This method is called once before calling run(), so the model is actualized. run(self) this method is called upon the object to let it build the template values. It should put the result in the self.ret_templates dict, where the caller will retrieve the values. If a non zero value is returned to the caller, the procedure will be canceled, i.e. the template values will not be added to the model. pythonprop-0.30.1/src/pythonprop/templates/__init__.py0000664000175000017500000000000013662771311020055 00000000000000pythonprop-0.30.1/src/pythonprop/templates/area_userdefined.py0000664000175000017500000001627013662771311021623 00000000000000 import sys, os, re class templates: ''' This class returns a set of templates to the caller. This class serves the purpose of letting the no-code user write simple area templates in a text file. #-------------------------------------------------- # # format for area plot user defined templates: # lines starting with # are ignored # each line consist in three values separated by spaces # each template is enclosed between "" tags. # # month utchour freq # 11 22 14.250 # month: number month, 1=January # utchour: UTC time HOUR, 00 to 23 # freq: frequecy in MHz # # # example: all months at midnight on 14.100 MHz # # #-------------------------------------------------- ''' name = 'User Defined Templates' description = 'Set of templates defined by the user' def __init__(self, parent, ssn_repo): self.parent = parent self.ssn_repo = ssn_repo self.ret_templates = {} # { templatename : [(month_i,utc,freq),...]} self.area_templates_file = None def get_names(self): return list(self.ret_templates.keys()) def get_params(self): return ['area_templates_file',] def load(self): if not self.area_templates_file: return -1 re_tag_name = re.compile('\[(.*)\]') fd = None try: fd = open(os.path.expandvars(self.area_templates_file)) except Exception as X: print(_("Can't open template file <%(f)s> -> <%(p)s>.") % {'tf':self.area_templates_file, 'p':os.path.expandvars(self.area_templates_file)}) return -1 if fd: lines = fd.readlines() fd.close() templ_n = None for line in lines: line.strip() if line[0] == '#': continue if line[0] == '\n': continue if not len(line): continue if line.isspace(): continue # this is the template name tag, until next tag or EOF # all significative lines are part of this template m = re_tag_name.match(line) if m: templ_n = m.groups()[0].strip() self.ret_templates[templ_n] = [] continue # append line y,m,u,f = line.split() try: tup = (int(y),int(m),int(u),float(f)) except Exception as X: print(_("Can't convert values: <%s>") % line) # could be better to remove the entire template here... continue if templ_n: self.ret_templates[templ_n].append(tup) return def set_ini(self, model): return def run(self): return def area_save_as_template(self, *args): ''' saves area_tv model content as a template ''' global ok_bt global nentry def text_change(self, *args): global ok_bt global nentry if len(nentry.get_text()): ok_bt.set_sensitive(True) else: ok_bt.set_sensitive(False) dialog = Gtk.Dialog(_("Creating new area template"), self.parent, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT)) hb = Gtk.HBox(2) label = Gtk.Label(label=_("Template name")) hb.pack_start(label, True, True, 0) nentry = Gtk.Entry(max=50) nentry.connect("changed", text_change) hb.pack_start(nentry, True, True, 0) hb.show_all() dialog.vbox.pack_start(hb, True, True, 0) ok_bt = Gtk.Button(None, Gtk.STOCK_OK) ok_bt.set_sensitive(False) ok_bt.show() dialog.add_action_widget(ok_bt, Gtk.ResponseType.ACCEPT) response = dialog.run() if response == -3: # accept # save it fd = open(os.path.expandvars(self.area_templates_file), 'a') fd.write(_('\n#template created by voacap GUI')) title = nentry.get_text() fd.write('\n[%s]' % title) fd.write(_('\n#month utchour freq')) model = self.area_tv.get_model() iter = model.get_iter_first() while iter: m,u,f = model.get(iter,1,2,3) fd.write('\n%02d %02d %.3f' % (m,u,float(f))) iter = model.iter_next(iter) fd.write(_('\n#End of %s') % title) fd.close() # reload templates_file to repopulate templatescb, then # select this recently saved as the active one self.build_area_template_ts() model = self.templatescb.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == title: self.templatescb.set_active_iter(iter) break iter = model.iter_next(iter) dialog.destroy() def build_new_template_file(self): fn = os.path.join(self.prefs_dir,'area_templ.ex') s = _('''# rough format for area plot templates: # lines starting with # are ignored # each line consist in three values separated by spaces # each template is preceded by a name enclosed in square brackets: # [template name] # tags # month utchour freq # 11 22 14.250 # month: number month, 1=January # utchour: UTC time HOUR, 00 to 23 # freq: frequecy in MHz # example: all months at midnight on 14.100 MHz [All months midnight 14.100 Mhz] #year month utchour freq 2010 01 00 14.10 2010 02 00 14.10 2010 03 00 14.10 2010 04 00 14.10 2010 05 00 14.10 2010 06 00 14.10 2010 07 00 14.10 2010 08 00 14.10 2010 09 00 14.10 2010 10 00 14.10 2010 11 00 14.10 2010 12 00 14.10 [All months at 1600z 7.500 MHz] #month utchour freq 2010 01 16 7.5 2010 02 16 7.5 2010 03 16 7.5 2010 04 16 7.5 2010 05 16 7.5 2010 06 16 7.5 2010 07 16 7.5 2010 08 16 7.5 2010 09 16 7.5 2010 10 16 7.5 2010 11 16 7.5 2010 12 16 7.5 \n ''') with open(fn, 'w') as templates_def_fd: templates_def_fd.write(s) self.area_templates_file = fn pythonprop-0.30.1/src/pythonprop/templates/area_diurnal.py0000664000175000017500000001262613662771311020765 00000000000000 from gi.repository import Gtk from datetime import datetime from dateutil.relativedelta import relativedelta import calendar # Template to run an area prediction at predefined hourly interval through a single day class templates: name = 'Diurnal' def __init__(self, parent, ssn_repo): self.parent = parent self.ssn_repo = ssn_repo self.ret_templates = {} # { templatename : [(month_i,utc,freq),...]} self.year_spin_button = Gtk.SpinButton() #1.0, 3 self.month_combo = Gtk.ComboBox() def get_names(self): return [self.name,] def get_params(self): return [] def load(self): return def set_ini(self, model): pass def update_month_spin_range(self,widget): """ Called when the year changes and modifies the months range to values that are in the ssn_repo. """ _min, _max = self.ssn_repo.get_data_range() active_month = self.month_combo.get_active() if (self.year_spin_button.get_value_as_int() == _min.year): min_month = _min.month max_month = 12 active_month = max(active_month - min_month + 1, 0) elif (self.year_spin_button.get_value_as_int() == _max.year): min_month = 1 max_month = _max.month active_month = min(active_month, min_month) else: min_month = 1 max_month = 12 months_store = self.month_combo.get_model() months_store.clear() for month in calendar.month_name[min_month:max_month+1]: months_store.append([month]) self.month_combo.set_model(months_store) self.month_combo.set_active(active_month) def run(self): tups = [] current_time = datetime.now() dialog = Gtk.Dialog(_("Diurnal"), self.parent, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.WindowPosition.CENTER_ON_PARENT, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) dialog.set_border_width(6) vb = Gtk.VBox() hb = Gtk.HBox(2) label = Gtk.Label(label=_('Interval (hours):')) label.set_alignment(0, 0.5) intervals_store = Gtk.ListStore(str) intervals = ["1", "2", "3", "4", "6", "12"] for interval in intervals: intervals_store.append([interval]) interval_combo = Gtk.ComboBox.new_with_model(intervals_store) renderer_text = Gtk.CellRendererText() interval_combo.pack_start(renderer_text, True) interval_combo.add_attribute(renderer_text, "text", 0) interval_combo.set_active(0) hb.pack_start(label, True, True, 0) hb.pack_end(interval_combo, True, True, 0) vb.pack_start(hb, True, True, 0) hb = Gtk.HBox(2) label = Gtk.Label(label=_('Month:')) label.set_alignment(0, 0.5) months_store = Gtk.ListStore(str) months = calendar.month_name[1:] for month in months: months_store.append([month]) renderer_text = Gtk.CellRendererText() self.month_combo.set_model(months_store) self.month_combo.pack_start(renderer_text, True) self.month_combo.add_attribute(renderer_text, "text", 0) self.month_combo.set_active(int(current_time.strftime("%m"))-1) hb.pack_start(label, True, True, 0) hb.pack_end(self.month_combo, True, True, 0) vb.pack_start(hb, True, True, 0) hb = Gtk.HBox(2) current_year = int(current_time.strftime("%Y")) adj = Gtk.Adjustment(current_year, 2000, 2020, 1, 1, 0) label = Gtk.Label(label=_('Year:')) label.set_alignment(0, 0.5) self.year_spin_button.set_adjustment(adj) self.year_spin_button.set_digits(0) self.year_spin_button.set_wrap(False) self.year_spin_button.set_numeric(True) self.year_spin_button.set_value(current_year) _min, _max = self.ssn_repo.get_data_range() self.year_spin_button.set_range(_min.year, _max.year) year_spin_updated_handler_id = self.year_spin_button.connect("value-changed", self.update_month_spin_range) hb.pack_start(label, True, True, 0) hb.pack_end(self.year_spin_button, True, True, 0) vb.pack_start(hb, True, True, 0) hb = Gtk.HBox(2) adj = Gtk.Adjustment(10.00, 3.0, 30.0, 0.1, 1.0, 0) label = Gtk.Label(label=_('Frequency (MHz):')) label.set_alignment(0, 0.5) ef = Gtk.SpinButton() #1.0, 3 ef.set_adjustment(adj) ef.set_digits(3) ef.set_wrap(True) ef.set_numeric(True) ef.set_value(7.1) hb.pack_start(label, True, True, 0) hb.pack_end(ef, True, True, 0) vb.pack_start(hb, True, True, 0) dialog.vbox.pack_start(vb, True, True, 0) dialog.show_all() ret = dialog.run() freq = ef.get_value() month = 1 + self.month_combo.get_active() interval_iter = interval_combo.get_active_iter() if interval_iter != None: model = interval_combo.get_model() interval = int(model[interval_iter][0]) year = self.year_spin_button.get_value() dialog.destroy() if ret != Gtk.ResponseType.ACCEPT: return 1 for hour in range(0, 24, interval ): tups.append((year, month, hour, freq)) self.ret_templates[self.name] = tups pythonprop-0.30.1/src/pythonprop/templates/Makefile.in0000664000175000017500000003466213736105751020037 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/pythonprop/templates ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(templates_PYTHON) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) am__installdirs = "$(DESTDIR)$(templatesdir)" am__pep3147_tweak = \ sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' py_compile = $(top_srcdir)/py-compile am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ templatesdir = $(pythondir)/pythonprop/templates templates_PYTHON = __init__.py \ area_nextmonths.py \ area_userdefined.py \ area_diurnal.py EXTRA_DIST = \ ReadmeTemplates.txt all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pythonprop/templates/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/pythonprop/templates/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-templatesPYTHON: $(templates_PYTHON) @$(NORMAL_INSTALL) @list='$(templates_PYTHON)'; dlist=; list2=; test -n "$(templatesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(templatesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(templatesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(templatesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(templatesdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(templatesdir)" $$dlist; \ else :; fi uninstall-templatesPYTHON: @$(NORMAL_UNINSTALL) @list='$(templates_PYTHON)'; test -n "$(templatesdir)" || list=; \ py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$py_files" || exit 0; \ dir='$(DESTDIR)$(templatesdir)'; \ pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ echo "$$py_files_pep3147";\ pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ st=0; \ for files in \ "$$py_files" \ "$$pyc_files" \ "$$pyo_files" \ "$$pyc_files_pep3147" \ "$$pyo_files_pep3147" \ ; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: for dir in "$(DESTDIR)$(templatesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-templatesPYTHON install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-templatesPYTHON .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip install-templatesPYTHON \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-templatesPYTHON .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/src/pythonprop/voa3DPlot.py0000664000175000017500000002562613662771311016160 00000000000000#!/usr/bin/env python # -*- coding: UTF-8 -*- """A short script to display the contents of voacapg.out type files in a 3D format. """ # File: voa3DPlot.py # # Copyright (c) 2009 J.A.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # Contact jimwatson @@ mac.com # # # import sys import math import matplotlib #matplotlib.use('GTK3Agg') from mpl_toolkits.mplot3d import Axes3D from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg import matplotlib.backends.backend_gtk3agg as gtkagg from matplotlib.figure import Figure try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject except ImportError: pass try: from gi.repository import Gtk except ImportError: sys.exit(1) #import matplotlib.pyplot as plt from optparse import OptionParser import numpy as np #import pylab as P from .voaOutFile import VOAOutFile from .voaPlotWindow import VOAPlotWindow class VOA3DPlot: """Program to plot .out files produced by voacap in 3D""" AUTOSCALE = -1.0 IMG_TYPE_DICT = { 0:{'title':'', \ 'min':0, \ 'max':1, \ 'y_labels':(0), \ 'formatter':'defaultFormat'}, \ 1:{'title':'MUF Days (%)', \ 'min':0, \ 'max':1, \ 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1),\ 'formatter':'percent_format'}, \ 2:{'title':'Circuit Reliability (%)', \ 'min':0, \ 'max':1, \ 'y_labels':(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1),\ 'formatter':'percent_format'}, \ 3:{'title':'SNR at Receiver (dB)', \ 'min':20, \ 'max':70, \ 'y_labels':(20, 30, 40, 50, 60, 70), \ 'formatter':'SNR_format'}, \ 4:{'title':'Signal Strength at Receiver (dBW)', \ 'min':-151, \ 'max':-43, \ 'y_labels':(-151, -145, -139, -133, -127, -121,-115, -109, \ -103, -93, -83, -73, -63, -53, -43), \ 'formatter':'SDBW_format'} } mono_font = {'family' : 'monospace'} #default_font = {'family' : 'sans-serif'} def __init__(self, data_file, data_type = 2, color_map = 'jet', plot_label = "", time_zone = 0, plot_max_freq = 30.0, run_quietly = False, save_file = '', parent = None): self.data_type = data_type self.data_file = VOAOutFile(data_file, \ time_zone=time_zone, \ data_type=self.data_type) self.image_defs = self.IMG_TYPE_DICT[self.data_type] #color_map = eval('P.cm.' + color_map) num_grp = self.data_file.get_number_of_groups() if num_grp < 2: md = Gtk.MessageDialog(parent, \ Gtk.DialogFlags.MODAL,\ Gtk.MessageType.ERROR, \ Gtk.ButtonsType.CANCEL, \ "There must be 2 groups or more") md.run() md.destroy() return plot_groups = list(range(0, num_grp)) self.subplots = [] number_of_subplots = len(plot_groups) matplotlib.rcParams['axes.edgecolor'] = 'gray' matplotlib.rcParams['axes.facecolor'] = 'white' matplotlib.rcParams['axes.grid'] = True matplotlib.rcParams['figure.facecolor'] = 'white' matplotlib.rcParams['legend.fancybox'] = True matplotlib.rcParams['legend.shadow'] = True matplotlib.rcParams['figure.subplot.hspace'] = 0.45 matplotlib.rcParams['figure.subplot.wspace'] = 0.35 matplotlib.rcParams['figure.subplot.right'] = 0.85 colorbar_fontsize = 12 self.main_title_fontsize = 24 matplotlib.rcParams['legend.fontsize'] = 12 matplotlib.rcParams['axes.labelsize'] = 12 matplotlib.rcParams['axes.titlesize'] = 10 matplotlib.rcParams['xtick.labelsize'] = 10 matplotlib.rcParams['ytick.labelsize'] = 10 self.x_axes_ticks = np.arange(0, 25, 2) self.fig = Figure() ax = Axes3D(self.fig) X = np.arange(0, 25) Y = np.arange(0, len(plot_groups)) X, Y = np.meshgrid(X, Y) data_buffer = [] # hold the Z data sets for chan_grp in plot_groups: (group_name, group_info, fot, muf, hpf, image_buffer) = \ self.data_file.get_group_data(chan_grp) # Copy the element at [0] to the tail of the array #to 'wrap-around' the values at 24hrs. np.resize(muf, len(muf)+1) muf[-1] = muf[0] data_buffer.append(muf) Z = np.vstack((tuple(data_buffer))) # set up the titles and labels ax.set_xticks(np.arange(0, 25, 2)) if (plot_max_freq==self.AUTOSCALE) : z_max = math.ceil(max(muf) / 5.0) * 5.0 z_max = min(plot_max_freq, 30.0) z_max = max(plot_max_freq, 5.0) else : z_max = math.ceil(plot_max_freq / 5.0) * 5.0 z_ticks = [2, 5] for z_tick_value in np.arange(10, z_max+1, 5): z_ticks.append(z_tick_value) #ax.set_yticks(z_ticks) #label axes tz_sign = '+' if (time_zone >= 0) else '' self.x_label = ax.set_xlabel('Time (UTC%s%s)' % (tz_sign, time_zone)) self.y_label = ax.set_ylabel('Group') self.z_label = ax.set_zlabel('Frequency (MHz)') #do the plot ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=color_map) canvas = FigureCanvasGTK3Agg(self.fig) canvas.show() Axes3D.mouse_init(ax) VOAPlotWindow('pythonProp - ' + self.image_defs['title'], \ canvas, \ parent) return def main(data_file): """Main entry point to the class when calling in standalone mode.""" parser = OptionParser(usage="%voa3DPlot [options] file", \ version="%voaP2PPlot 0.8") #tested ok help_str = "Display a band plan indicated by the integer 1, 2 or 3 " help_str += "(e.g. 1:SWL 2:UK AMATEUR BANDS 3:KSA AMATEUR BANDS)" parser.add_option("-b", "--band", dest = "plot_bands", choices = ['1', '2', '3'], help = help_str) parser.add_option("-f", "--freqmax", dest = "y_max", default = '30.0', help="Maximum frequency for the Y axis") parser.add_option("-g", "--group", dest="plotGroups", default='1', help="Group(s) to plot. e.g '-g 1,3,5,6'. (default = 1)") parser.add_option("-l", "--label", dest = "plot_label", default = "", help = "A text label, printed in the main title block") help_str = "COLOURMAP - may be one of 'autumn', 'bone', 'cool', 'copper'," help_str += "', 'hot', 'hsv', 'jet', 'pink', 'spring', 'summer', 'winter'." help_str += "Default = 'jet'" parser.add_option("-m", "--cmap", dest="color_map", default='jet', choices = [ 'autumn', 'bone', 'cool', 'copper', 'gray', \ 'hot', 'hsv', 'jet', 'pink', 'spring','summer', 'winter' ], help=help_str) parser.add_option("-o", "--outfile", dest="save_file", help="Save to FILE.", metavar="FILE") parser.add_option("-q", "--quiet", dest="run_quietly", action="store_true", default=False, help="Process quietly (don't display plot on the screen)") parser.add_option("-t", "--datatype", dest="data_type", default=1, help="Image type 0:None 1:MUFday 2:REL 3:SNR 4:S DBW (default = 1)") parser.add_option("-z", "--timezone", dest="time_zone", default=0, help="Time zone (integer, default = 0)") (options, args) = parser.parse_args() if options.data_type: if int(options.data_type) not in VOA3DPlot.IMG_TYPE_DICT: print("Unrecognised plot type: Defaulting to MUF days") options.data_type = 1 if options.y_max: if options.y_max == 'a': plot_max_freq = VOA3DPlot.AUTOSCALE else: try: plot_max_freq = float(options.y_max) except TypeError: print("-f must be either 'a' or a float in the range 5.0 - 30.0") sys.exit(1) plot_max_freq = min(plot_max_freq, 30.0) plot_max_freq = max(plot_max_freq, 5.0) if options.time_zone: time_zone = int(options.time_zone) if time_zone > 12: time_zone = 0 if time_zone < -12: time_zone = 0 else: time_zone = 0 if options.plotGroups: if options.plotGroups == 'a': plot_groups = ['a'] else: try: if options.plotGroups.find(','): plot_groups = options.plotGroups.split(',') else: plot_groups = [int(options.plotGroups)] #convert to integers for i in range(0, len(plot_groups)): try: plot_groups[i] = int(plot_groups[i])-1 except: plot_groups.pop(i) if len(plot_groups) == 0: print("Error reading plot_groups, resetting to '1'") plot_groups = [0] plot_groups.sort() except: print("Error reading groups, resetting to '1'") plot_groups = [1] VOA3DPlot(data_file, data_type = int(options.data_type), plot_label = options.plot_label, color_map=options.color_map, time_zone = time_zone, plot_max_freq = plot_max_freq, run_quietly = options.run_quietly, save_file = options.save_file) if __name__ == "__main__": if len(sys.argv) >= 2: main(sys.argv[-1]) else: print('voa3DPlot error: No data file specified') print('voa3DPlot [options] filename') sys.exit(1) pythonprop-0.30.1/src/pythonprop/ui/0000775000175000017500000000000013736105755014462 500000000000000pythonprop-0.30.1/src/pythonprop/ui/voaAreaChooser.ui0000664000175000017500000004432313662771311017643 00000000000000 -90 90 1 10 False 5 Area Chooser mouse True normal True False vertical 2 True False end gtk-select-all True True True True 0 False False 2 end 0 True False False False 1 gtk-cancel True True True True False False 2 gtk-ok True True True True False False 3 False False end 0 True False True False 0 none 2 False True False True True 0 True False 0 none True False 6 True False 1 12 Lat True True 5 6 1 True ne_lat_adjustment True 1 2 True True 5 6 1 True ne_lon_adjustment True 4 5 True False 1 12 Lon 3 4 True False 0 degrees 2 3 True False 0 degrees 5 6 True False <b>North East Corner</b> True False False 1 True False 0 none True False 6 True False 1 12 Lat True True 5 6 1 True sw_lat_adjustment True 1 2 True True 5 6 1 True sw_lon_adjustment True 4 5 True False 0 degrees 5 6 True False 1 12 Lon 3 4 True False 0 degrees 2 3 True False <b>South West Corner </b> True False False 2 False True 1 select_all_button cancel_button ok_button -180 180 1 10 -90 90 1 10 -180 180 1 10 pythonprop-0.30.1/src/pythonprop/ui/voaP2PPlotBox.ui0000664000175000017500000002275213736105314017357 00000000000000 -12 12 1 1 True False 18 18 18 18 vertical True False 6 12 40 True False 12 Plot Type 2 1 0 1 True False 12 Group 1 0 2 True False 1 1 True False 1 2 True False 12 Timezone 1 0 4 True False 12 Contour Plot start 1 0 6 True False 12 Colour Map 1 0 5 True True 0 tz_adjustment True True 1 4 True False 1 5 True True False Produce a filled contour plot. 0 True 1 6 True False 6 12 <b>Appearance</b> True 0 0 3 2 True False 6 <b>Data</b> True 0 0 0 2 False True 0 True False 18 end gtk-cancel True True True True True True 0 gtk-ok True True True True True True 1 False True 2 pythonprop-0.30.1/src/pythonprop/ui/voaAreaPlotBox.ui0000664000175000017500000002620313736105351017622 00000000000000 -12 12 1 1 True False 18 18 18 18 vertical True False 6 12 True False 12 Type 1 0 1 True False 12 Group 1 0 2 True False 1 2 True False 1 1 True False 12 Timezone 1 0 4 True True 0 alpha tz_adjustment True True True 1 4 True False 12 Colour Map 1 0 5 True False 1 5 Parallels True True False True 1 6 Greyline True True False 12 True 0 7 Contours True True False 12 True 0 6 Meridians True True False True 1 7 True False 18 <b>Appearance</b> True 0 0 3 2 True False 6 <b>Data</b> True 0 0 0 2 False True 0 True False True end gtk-save True True True True True True 0 gtk-open True True True True True True 1 gtk-close True True True True True True 2 False True 2 pythonprop-0.30.1/src/pythonprop/ui/voaSiteChooser.ui0000664000175000017500000005742413662771311017705 00000000000000 0 1 2 3 4 5 6 7 8 9 -90 90 1 10 -180 180 1 10 False 5 Site Chooser mouse True normal True False vertical 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True False True False 0 none 2 False True False True True True True 0 True False True False 0 none True False 12 True False 2 4 True False 0 Name True True 1 4 True False 0 Lat 1 2 True False 1 Lon 2 3 1 2 True True 1 True lat_adjustment 2 True if-valid 1 2 1 2 True True 1 True lon_adjustment 2 True if-valid 3 4 1 2 True False <b>Site</b> True True True 0 True False 0 none True False 12 True False True False True False True True 0 True False True True 1 True False int_liststore True True 2 True False int_liststore True True 3 True False True True 4 True False True True 5 True True 0 Append locator to site name True True False 0.5 True True True 1 True False <b>Locator</b> True True True 1 True True 1 True True 200 True True 150 True True True True True False True True True True True True True True False Select from file True True 2 False True 1 site_chooser_cancel_button button1 pythonprop-0.30.1/src/pythonprop/ui/voacap.png0000664000175000017500000004077013662771311016364 00000000000000PNG  IHDR}H.sRGBbKGD pHYs  tIME  0zrtEXtCommentCreated with GIMPW IDATxwdWur{RH3(gcclm?? ƀeBH#MӹrNǹ=34IZ[9o[V{jo[V{oi{7\H=DŽ~,[Z[jk)-ŸS>gK|,>'ij_)0-Zv,i>Ys~Mίkgw2r?4_G?5{/A+/ \EKHKC ň!!Igjp.vo ];/1/X,#Θ"-G; _*XW,VXbtwK[ToޤF+Jo4}&Z_QVKM:t %S-_iїZg v~QIW.NsW JC]eߖ{jUg)*2՟tNUp)yѥP+Sa:^-!U5X{R?rn ~9fڂ_2nULŮ{tgb. !H VEսe!d '8ݢ-Hՙ2 nt5h[3t!O N$L/K,i,$I'jLgj+308Sc,Z`bxE\u>v!JkJ]FPS],--SDq"})`,$Uf ^_ }1iSi%(T]y^4G+9wgBHg5X@ efYH2 Θ+Zt7ZP8Kg)Η˶_ Xei۝hg E UsE{\Hbl0@qBC4@u <{6:;uDM!/ⲝxgIKVOC_"ɷ1U H+m9cs)dEZ-Y☃]pn}+x9Xh[^0Lї3Tb{3<5Ua8h584#t: ze'hBOP#{ ,\ȋ9AIqy^w%VVwO}&1: @ Xhs '.k3i<2{+Ի/ UXfvl\7?{/oôo%+`X/?m~p`0-B= ,C, }@#ݍm۪sDw.%ژ=n쀿%|c `S#'1x(ܱ"^h -A|aG' r&Rg/=i#g~ OaZ88@Qح˚yu7錱hMɟ6i ~Up5!wV xuXa຺z}e1l&~TdZ"<n\ x{߆߿n$jfca} ^m[ HIa~a3,9›[/"Pe>zDW:N=_7r_R| G^R{QD$$#oqdpׄ߄ 39ِU]+S!z'|=< 3hM!xs;]Z/骭ЎL.+ݏ!A$t*+6n(5Øa Z|vOLʇUcqN•bAl:(:WLdЅj!Oabn.C 7xp7ܾ%Oz}t5H?getr2-T:.ca(5 Α#GWuB3BK@/,ob,MKrH}釻 P> w~ m:?18}~9tt!E]zaxGOXZZ i!\1E2;bx h\U iQFz {mRe%ܓ1ڂۛ!}a0&eۣ/@q.&>y*9[0z_:CҼqRy J9эe /C7ܵ; 8D.LBK&k:(.KP)* > :]!nsIx>1*wY.phG p}/lj7yǧ!Yo>ׂ~|hH9u6x ^t,>/jAZ1ЗȮS5%>br%}ATDϐA=m_G{7lw oipRm) r+ % ]n!9FfȗoK6 m6?=Ի48fa/Ǹ/lq02Q{O CzcxkOH=gVi,TJ&-0 @2kqUS@ lPiogdlPzxbͷb` eEA%Pe}cp7`K#ApNؑ^WC1Qm#8o\fu!р{fG Lc_MlsfpI?Ap}A^ɽ $?@Ы ʣ՝ W#hh#,>8bFM,$  m}8ܵ :Z Yx"R(9-a84K{$3e}oMa^v'm9xsJn":]ׄaI B,fd, ddUnHv0[~)?6Ԩ` 2SфWJAr?xg "-\Y=a';3ٓ[IR N"1/%r)럂&,Mm\]^1U`q#[txmEHbP֭~ʆ fƘM3k`m Z0tTF@C>et!UMSpH%pž_{ C_G(j|)ɡ1[=_N?4b`:S+ BAs=AX"V,*- ZdwFqM#\0yKP3xy-ky bcb :t5'j=@=^@Rbv[MLLU!KLgSGp%-tE$(~ 3}S޼H[ !5D0hDSݧ Su!\)RИijq/FKi#6b"VTZj%pkvf!!9̄ Iݐ40m`2LTK3BWA԰9`ӎ^964I}Rc&Q QUtCa1@RJbcA ꠯ ^~3Ocu" fV޼Ԧ 2N'/\BIe k7!47usx ~~vD4r*F]imb&[aU t:A{$bLь %R%Jg%zg;#_$Thlr04dǟTrjɲ$a1$ +ϑ Tӯ ;2$PbB)ӡ-m$6 q%bZɌX^~Zc0 r"S0j&Oiow^l'od(ksYdCc*H~?U"dZF@*c {1hRm3R* AW5ײ4X4ZڡE Z-dDYj|;3v=vp|0w/sIoN?- -hLejZ੗}wL.Qb^e1 }k`jbج{lnCw\6M4|#EtO|LF\z؄/=P]W嗚AJZwAf}O١E#YYSVu$z7O3 ysfYsP VBCi h DoS ӓ0+58 MB k:k8, EwX3BG%4= {"ĀxZ&d4(h yg NtC, |}V|z*e?AA](Uw“C@"aɶM6;v7_9 <PsgM4b99^`Ƽy?[kG+Vx|?/<6-Cğ`p`E%?kY \25n˻&QW誯P,MK6l)B2NDNdqZɁVduƈLFgMб&`㺓! Qhl2K{06SZ Xqxp g3p)4eav&\_~(7ӛ'4NcEOlcNgZaAxHo9[4 !lޭun谅~Q#QZ5FaAhti_p!+u$-I 3L{My(1j@t#є;K Ӷ$9)fXDu<4͏U4 RYXqj2#Wg͛sߚ7.̘9.ro".i7g ݜC-P^;( TVB `Vv;?y2C?يtw @L_}-[mpldK;%)Yr[>h(SF<87+$m P, ÉI jC$")|>XG$2y@ىwo?4QamU";_= |P{ױmM+ci@y$\|H<%+!g$~Gd aG7k/@Ȥތng"o_;64x+-5ڼ#LÌ[J I*3] AkwCJ|ĕ"XTASTk T<.d7|>ptf7y9?D?Cs?CT_i 3Y> Otq9bL4n9Q.)Ȇ!q|M1E?AGOݕf!51v;T)/5͂ R|1\'&ö$Mvؘדf>-jCqH&A!`x$$)@%xCopS*LOæMuP*J| CŒ'*Py/6eᅟOYcv@Av pu.ݨRCbsV' cn .V|[2A<ػO$9ZוG=6:VRU0R~J)z8qf[ B%TN_ϦJ`­s&~K/ФbSlvwX 9k]q$\.߀rQ oJ;$A:v\jlt^!!$l8 Z]]!"Zt΀ 3mK>QW?EGWJqƏ3XG϶py6wXBPOu:Ey!Ʒ/ݫ.;jv{>V8Ͻdnfh+6J2Bcpt'K nXUdvLGۀ\~>'/q,'Ď(;Q,^Zjenǣw[:wtl P2Y7v*0:--S8Y(۶ghkLH,ӌŚ8Gt;Pe\gHą=<34Y% 8rF?3N )n"KXbWK2s&vlQ2ktCe+P.[j~fc)-tCUkHWQT|i%d:)r7lj*0E8fTnBv2/fO3\ bMM`M](.QphAd6=Esn6l('u`W+ykmE Ȯ=Q íhonMp_PMOeyC(/s^O  5C`xLGab̎P-Q-Ȳ$T~F)Z.3@J*Cih0jI$DRE e FZ_Z05-švFmn8l8^;A,%UfO*{H!YCflv,\\ (|J%b ɔ;Tx2@`Ёm?[ctv_ʻE2%+Uc.3pqR775鴅Dчjg5ՔQ%X4@\ߐ% XDf(>܋^TREâϥG IDATN@"\k!S=i2,peK2#%kۡ`Pu clv'<\qڷwĆ gUxX/*?͟|B!,_u6oٺ%NOqB:Zv! uk+esn/+ם.KmN4.*;kVkmu $3>%/  103 /"i2 Db8=5beEʕ.v58:l^ap'xm:j@MaDhj(I0T; / Ds3]3>޼1o }jG2;Bg)~غ*yCaO7c鼆V%3fj6(Aa$qa{nq)P9f8T TlcPH2%eCNBȲLO=sriHpo_}Dxݛ\ٞd8:h ׾C{Ҍp @w d4jn\}u^TyuAQP,{}c9dr}NX4X5yZ)f u B!+xO6`4MPp fk"J؋P;,*ѲNW±N5qB]WSrSf:+ӵ 3+Tp-Ͻ 09.fo?l6N19 hnu!IV6m#!m]ç> ҩo*W9šХ Y_fCxd 6i|Nɯ/mTF@cvO.A0 $L{VЕ>}v}9a~p3g PZs<4@{|?#zJ3[;eZB[0 [6z840~ z 7wtXx*/أiV\`sacm_P6sfR rq4-J PV^4 n7h%72DQU sTd+I^hVҘDsM2/ {ȯVE '\d 0,B~)!a\.aJD#*_'R6o}T3ϊw=U'Y;+QgAx 9i鎸,9عab3pu:,14)8QN3tx/an!4@<.Q\pFCJ_Gmma5q^l.p` i1|ubEU!ץW_l@1D5@ *7\[ LMԔ-JbCk찠9~S=G#~7 iTm%b,:=8:سP==n{E#ɜw.PP-Ӊ >{m[D4O'{Ћ3wCs~]N`slVYA Be) \\ω~iLАEvɏga"  p:$:l"fuEՔ=/Jt586f0Ep+2Ir9m \R}݃ֆQ~:<*FU# x00nz<ҁ^TvN27L`B jI BzxM$SӇhp QAuǦT''*`[ ˂[/[OC)k2eJ\w9l y).13:ݐ́ߩ/X2w Ԫ߫Rs@H\~m)lmM.2*AGR"t0= P\?Q3a/`]$`Ċ!"(X$*8}w\a]a ]0RWL[SN1ҁrUs`̉ ƷA ဉBĻwA:I;>_,̴:g$Ҙ>D_ft$n2V\;!&+k>3iFqE2L 7>NW(M\9BW(٬B!juz=6ن*Uq,EXm(\5Eo_;\k6Cc=\Xtw fx̀rE'MAp# &Gap$C,:#+Ԧpl>'JE!1ihL]~,x%nRΊZs3 ; A"nPpE~6U :LO(\x\E|$٬]dC!T u0#!&Ǚ%U%ɦ02ݷ_w̌C͜pdUmԜܱͩSM>He`A~U~8iBMQ+,\ 2}:4m-G\o ka⠩@^QS3݌Mv1p|0B߆uM MqNectUy~mpl?쟄zp4FGptA24QLu}]Wwmo/Rq5|NBqdGCD*54 *5+E%4?)qp^/Db3$ad "'o$w=7EC͗){tBu>}p0DY󽔵. E!Rdؐz@]D%]Qέ"<^Dvxvg,w g!>)&) jU-S4fk8DЗ@JU(MHw. {º^ O43&E+={Vy= eU$V5Ip? O 4Ѭ&fB54D'44O%yY˳׆U_5*^p}b0;=`ۉU_vsm_3E}1 .8&ޭBvVp h26fJ.Fؑ/z-V&f<4 ;.EIxu+v$H@At3pzιx84tdL,X_u+*d,?륋8ϵaOIXꐆJ\.;,B*Xؒf |@-y.hnd|;Q3Ce. t: j֕̕RyU;wBC3 EsS Y30u{2(pcXw00:{dKa4 6GGcPפ I%2QgQZ(rj sK8hy#fz&³[4AM:9RX~_Xaj,Oe~2Vr 6ȫپ>OH</s݅9^eam2%8l*inGM%'Ic8KDipK!E'V4/Av&9>Q$6l#ʠIXetK>E4yzP UqKn59 džK &BsNl:[++V9~j,S: UirH>m+TbrqJ*4Q{{G4. M lՇ!P9Pf|~! '-p٬!sAE*<:*" *NAsE{a|@r^8l>!oyeYLy KdsqmvY$= m KYZp(!F:[4!R`OCWBLCsFC:{,(< ';h .$/=gas\=\*J`fJЇd\o8* a ^; 9{o--.%ޥ%Ҥ } bƵ|āE7 ,&P61"uarAV{(@jE/xh{ H(a38:E\#G2 7]8Ӫ7$$!:`xVѦH=r/BA~1ޏ-b,+o!Rћfhw[ x 74v+kgో xrACVҠkX ႎ(׮M03 G}u `D:Tz/krepA w*pV\/<\]2+Ya&[-daw\2E j<G!7:tS~Dw[0g8D_p ߞ$b9y`f`8r|m} I4R&Qu iLLG+-R백>EFEqr x'`  Sk:{Z'5cᙔo86ˁͪըpr1Чxua?Y쵕elXa1,wBFFĭ n'H.:,Q;^: /pt,:$Qiz;Q̜ I1í*}aH)5I?Tjy*,uzܙty9w`N|ΗuT}ofG/8k$p*`Mx. 8iEXe$8S0U0$6gՋ^-n2sz5ퟅp?D:E>@~(A H׎TrDj.\KXWl+Ud$фƏҿn֙{,uP\ xXh\-^ba1: 4\8=Piu( 섑P[ס1-Nx,hu]/]WLhmWzsc@0!`HtcQ0ZLsPJ,/ɤ*f*hu#fYȕGl.WS猹ػKDeM$W %H rw{0D_N ~ ps5yWUf)y3{9#Xۂ|^,E 8=,jcrC΍W8'[I(OpP-pՀxGU4F 8FHA&ֹmT&H@^ZY9,$?  l4< _OX2!f,~9M3wj99L?}M\u .Ddcb^1%#tRY+ղĮ$}*"=Ss oz%I@e-'.8PШjೊXkEjQh J:h|J8_kJ̛wzii }azIsQ,I9!?ͰBeD |_W_۪2]"PU!2g"|Hyh ˻d Sbcn;J?>qhw.1reug=vDcǎ`KK,Dp8rY$rI(HE22~cow3켻8Tn=]]=;cZg?_Q rD~u)˵^L^bÏQ؍M@C7ޙJwd=&#UyOrbAnyZu8`v^*ċw3[J^=YW.nG*qٝՀfSNmPTU| k`; dݨ73Cd3qФAIJ1#ӱشXV[x3 ֗ZmW4/ޔ1wdv좬lrxXe/ߓTIOʒW!nUԠ4'K tε,eOٮ1iٕcp@j~o<:'Pg9X a2Lta^ pqFN.!~CVkPBI: ;NF<;6AA2b8 qែossdWE-O EyhRNLx)H Ae0WP e_ N8u>;5Y6X~g#ß4i=.SC) ow9p]C&t_ufXbV̖ynݮ ^Oj;TBܲ:+5XYJs<l?W"e[ypyҌˮ¶GW9k Sxbmf]QXP]iaynMf gw,@NY$ =E `̻żZ24ͳOeQsv*w !yP4y>ԣҞ<>޽ndžKe-iq[ZIξɀ^Pn…DWG=杂}ݫWXҡ^7[kPvڝ 2٢O,(,Vp|*,7XZtXZج8B&<m-x](tB#Ȯz-MFCKlC>FhH:>~QbAO{ouXaN+Ӓ[UmgiF >65 (Fjv;sEk\M0yRͷ}.wn}A*܎J)x !vc&5, BȇkM1|"u-&Mwg2Weև?^:Ù(F[=Z6Wnq*1: 509Xr߹)PB-^pI\J;[obc I 5rxnhlW(\؊5^#)9x8~N)N{d ؾkn}x8G& > >HvvSܯILr'Y쵻i6:mx6c}BrE]f7c_xH6AбdmnMk1߸|Flj6,OA_r?F=ܤ谄,>C\xοώkp"H6HXD:M:Ul5GA˗8/*nt3vBȟ ~#GY,ْ1 ~"ʖ)~DVA79M)Agq@Qd 0SIĎ c e#i.阎0XLf- IENDB`pythonprop-0.30.1/src/pythonprop/ui/voaPropWindowBox.ui0000664000175000017500000000612313662771311020225 00000000000000 True False 12 12 12 12 vertical 6 True False True 6 gtk-close True True True True True True False True end 0 gtk-save True True True True False True end 2 gtk-print True True True True False True 3 False True end 1 pythonprop-0.30.1/src/pythonprop/ui/voaTextFileViewDialog.ui0000664000175000017500000001157313736105314021144 00000000000000 100 1 10 10 100 1 10 10 False 5 True 500 500 normal True False vertical 2 True False end Print True True True 0.52999997138977051 True True 0 Save True True True True True 1 gtk-close True True True True False False 2 False True end 0 True True horizontal_adjustment vertical_adjustment True True True True False text_buffer False True 1 close_button pythonprop-0.30.1/src/pythonprop/ui/map.jpg0000664000175000017500000004174213662771311015664 00000000000000JFIFHHExifMM*C      C  ""   G!1AQ"aq2B#Rbr$34sC6!1AQaq"2BRb#r ?rP @(P J<7Vɵʫp*ήYҿ2 7n-ļ$  laW*Kq[RI DRہqlX\}J*3.W(Oݏ JF_-k}]EJ0EUP @(P @(P @(P @(3[[*YR($|VR=VM| wtAiHu?x+t린A^=+[o2F% ZWh]YhRF XH8 $Ʋ{s"2b—* [*RҤ:% {b<״?Y K eS.6v H J p卝תuIᘾ&TdcQ Bס!1 VU\՗PtaaJ֬?>YGmLX@nA`ԟ}h:T@%0Kě:N(eK\oQ+ 176W*n홱mҤeYU. swv2T()'+Lb cHBJa'p6bf*J3Wu޹_엚k̲L q202mTVg1 d(UN{U ۨ̑>S=kUPR2yۂm+9eK*@7lk:LB `$If)N%'T5l JР YT/PcP7N[/*дVTVVij06:Z7 N}!K)ny'4޼ijꬽYS&g8-ԘK+5 Obr+4}Oq?^K23Y\9x:=kEQٕ)Gй/p[4'1XCb#Zŧj\}zSn-g>&Z wIOJj 5V=m30H Hō꒧[ܞ͖n{RD'U$'WmX%3/ wӍb.R|{F 0v(4P)Rӻ Y)zLoU+ELW[^k{Wl!k*LwEJ3(9)S^ij%X.ۖ.0먾SYPsd)@JyLE?M[%A 耨I6= Ix:/,ܡM(~ w':vɽz~ ;m*AGtH NS&<#ff8g-KYRT)%$pDPLk?Y.^ţO,hИ'$Ix%Ҕ \DH'M] 5bJ];rN\ꐙ*v`IkU:D6 czk0O[hPzǴp9JN EW^8fL.8Lx 󮴡sd!H3YYQ]t1 L)kn).:]xSIJiqn9թK} |J-+3FpbIZ׃Uyqom5-ii_c~1u\ wI}n[BJN=s3.BUN3^UW aNrIlL^=|y=s)2 t#j}NENN.(guøMÉB$Lz(@0Mg^]y ;o-a7dh:@Ф%Uc`:|]t2$S ɔ>Du6C6RQ 9Gݵ + s&Z6.dHUfKk0Ԝs򞕶5Xzhzwd$s$,GOWGr؃&ӌ:lF:Ӌfo Y<ld|GZ)n*ܻrj^[ o m]| *Ϋ6*ڃ]v#j0U~s(aU(2h P @grBT~.*R^d6M7 .ݔĴu"`󀣤%Ru譙ukX$5wzJTQ^#5/&I<=rP |ې W릫|4M&t.42̉5Ӄ^:-H+eQKT󈗬wJ C@'.Ĉ+ͫuRJAPu1ODxQB`݊v*VI  QHQ$Yrp<|s2YGpE6)Fhc}Ҧdf ,r6OZ^/*㝚Ll< XS.o蹖HJ4XN eƊ In(~^ M7.w.w$jPkXtO4yA&ņkǑnٓmz8хK%|޶ ŮX6*u7*UxTsk."v P @( E$jm&qQ@*Rb7Xo˙<nBN|dLk!Ƨw3t^ccC1XVޠ㮓lRJyEmE_Ь͸PJ@$z|]5ahI}A&a+$xz穵gh=&3U=EZF Os`ӇZKge\ZA'QNXuM*Пŕoxb:EڊN*R ݩN piK? ԩH7Q*Rri^~B۱n Y<+ëmOi܆gɸ0woEO TPHҳ-(jft3SMy u̚8jN ߳a/f䩷ihq L@?ZVo] tЯo}{x عTM A3*N˵3E`/I=t禂9LŲw!j䊰CGƌj&UG sqr[nIOBR2g.Rۚ 1#A u3 5ȅw )9 ^oC#`;3pյ:J7Z ]Q͜m&vjn%pR:~>)TBxO[Ippv(rȃ_j+YiKJekn 5zU(z=W5EFNԥ)R F(P /G~9āIּ~=D=+=6Fm'C3ٕ+})-# %$7*տwOϕAJNe2soPfO-n\}uu<[%VkVDBPr ~$XߟDIbxm-)H;g^mIBuK*$EP&{YW$P @V( P-`Byk~"6ҳZRx+ i!6R*!Pyɞt w־q2v˝<g^pedoQ&9@zA5TҾ/:%^}NrQgT$i?r:m-2JvU%~=,?k_e.6R2&:)bN26+s%ēbIXȂAPnTۢ%<hviI&q~6>{FYgu[?':(_i8σ7Xf1isJb}-֞(BH  ƲEvpOO ^}A}fLfOwfFR'RJ [5,*r!AJH']⢗;ɗs-[؏|ZfH1a7-ۿ*I H HTJ!L_FvBt*Y2z΀a 0EfUyzyBչǑ)A$P @(P gw},Z  gP~WTJp{q7ܖ@͘a;Y$&+W5'u+XЙMbZYrJOxn0j+Yǩ"T AmUκr|\S\Tk=*:YXҜ֬NR?:NbK}on׺\P @( `,6I+?t JLl12sobQƝy@߱[LAۗ@H`ƱUź[iSLR=:8ulNX5͐=H܍&ֹ[å+$}~e NH($`Ie_w㩡5^jNe]4w~G=x.6|bX%`BHfkۯTT mqncG=q6/Ͷ'YꁦJx*6vKݮ '=pGXغFnp%Dn|*tA\|MxJ+BSLoma^}& X]2h@R'6O#'_Flp bl"*pj*{ $oEm]M/1tɭX}mJ&thzU7V,Iieݻ-BT)3.\*1 Dj꼺xXiP  ט0 ֍uПƓ\$zgkgL0,$A#t_>U*je\x<yyU媷3wחn\714FUޥe@$~>zMd~ qJtZJ 6; l…z?\4?ZeDԬ:)iۖ\T (lZ2UfmR{YmB @(P @(!b yI@Ԥ “2$ +,J3qwq{UiG C 'Ruf$i]?uxsfz./ydt]ۉ wiX:?;5~<\QcXӐӕ}UҢ[M˹츰R$gϟ*֪TC:%'/~o2D 19~:iU$M9ce'dֽe(4u<|4;YR@(66jBG2zU*T%v }^peB@%Gu% '+hNА3į1>Sz3j~=6=\5 aBRH#$ͫן#;0:_R c22tzt6_j֠n"3orw>[u[.K}~佊RrM5H$jd*&&& fvY3|̕ O.s<<<{-N{V,, BP;DI1"cQN,k|OFgB̶p:~%x $P"Bk;W&&GTךcOgq8 /`Zs2%EGA1G^UbfEV|٧XӪ{c3oRUYԌťJJ3DJ QU Do~.r +-' Nhx̥$j諁iاq fviRSHԅ)b:^$4f6-%!+xh|v?֖9ɔrݢ\O.FDH&u:ZndtidAI'mˎs&zGKr&L. &lӾȗX3ryjx! /}6> 6Wehl )=G·+NTPH,8W^zAW]X)_ O㭜d^vle{⒤u*=tЃqqpMBv/Joz<_ժ57ӉmI+sZB&ܮSc[TٔƧ%}a 85g¬O-U[WxJ,̨RrΜsYgNL%opk?}k!032OŅT<}[a\8F^SKӾߚk>ԧzC9J@Rq!EJ ^ 5ze1d-L\v6Wrq]ͭV8M~Sڼ7NRJS|= 0,۵6 =+Sw.<]bK-ڒ 衢fzRyi|Urwv͜96+W$''wD;@$k#f å+Yku*t2l뮿`V+/,}IpRa Ii3ֽDʚ_Ln֧UDGMz$dVH:ZQ̠H>"讗T+֭P @(P @(部):\^-'~PGmOOo%$i |.nGFcJ1tڲgBłm?@tQUkCܾmQ sZ* )0"5Aj)> Ǎ_)fn[EL}9cLm(s\e.8.Ɲ|Lg^l inTˎ$$B LrՅZ]$S§5: |ki{d"U_ Ȓsi^ TNY֧w z|Q,.MNcEr<]D}o{J-(8֡Qq/ki):('1/ ]4eSmV$GLOZ+o4۟u!{B*_N"mZU]krGoV(3܏ +n MVu(˿^Jg}QH8]0^ I jbcĪXuEnuuK;9ߑ].VPBJPP @(P @(l̻RQ ׻q ~k/>qwfhN;W>68֫" '8B@9i#¹vWB njq w8]{} @+\N $zR`-1ubm}wM!W+ E޷+.0]`҅gҭHhܬtbGwϡ*RoJnGL\0RɔGѶ*KSӥSw՝)T8DN>|%/լ]%rNN8NQ@U4 %D t;T*9]у\# HP3'1T6g~26<9hBtR =9#+Xb)_ĥ]7K\Ikd ܞ_zx{薮=7)Y S:h&"֕xKۙY9+y #^Tni.aRJLjߘ-$P)@VR@(P @T5 Ti# m%*@RRL)15E|z۔U$+#)-6VT*&M[!ĩ*.|Ջ%&n-j;k"cץGZ*[WDZuK9W w xۿ abE+M/g(5lxb8ET##Ex|~|kw.Of;@q~t`]?r2e$@65fJ3޳颕rm~9W`N}j~IZ̫3謎fBP @()b=տ)kg_M}yأRl8Wmr]h "`5RMm*Kj R.ƽ(_(mR<N O3j){.vQ0|<]8Tw׶ۼ'&Y XAmau٤ܐ+ ,:OƸ1q04=}婟y>:)btl2i`#xWRN|1hAJVP @(A7ǎq ?r+LMԽ7?ĵqk*y& k3 E@4#nUR 2dHȭQSGӆ]th]PjyQx$E>擰!_Mʯ{g1[( [:{!! x OT9˾%):ҊgA_:*+hJ=á>0ujgϘg-Ŗn-3L4shvɨ"&;>cI,sS @(̡E'TV>?iY263Σ[[VV -em뿍VU7n_W/ڦTsbtuOܲ"9Uqiz@=O^Mtfki̚+f,I}ߒ _":zTчMTO ΝTK2RZZTyR5JB* +B P@( $P @U*)24"f8aR JJJY#1$1xnfs -M$8e JgR5#C&fp4-.X{&%(P cKT[&3,GAlN&;7~J4 է.vtҕܟx|$ā'x5~ZnyR`E{2rP 1P W*}BL=?_5=>ܺڱ"P @(h P @(E367WyAZFdWǻ%|ٷ=WUfGO 47 ּX+lF4A*G5 A,$6f7_^px )iɽԃ[p'^ڥ--PnM'miXI V*9N1 ,]'=ʳm wA¾B+?5sڦ*N%-.ԨkDryc Z͛e%wzNa0'{s?srvo"̂OZVQ82⸛xr2~uL,%w"jrӭP @(/['@[}D_1Rs=\Ӧ7V%vTP?/rҪ :*L7^v!Ks-bHPLn+5+ QuǡTVku깢$IJ@(P @(=?mF 7#M7J+ws^ڛS9V )3[:z^?9zk>]MzЩPP @(P @(P @(̂A*;ltK(:ϯ-+aGrȃR r ~!j|&"nKfoTQBuΛj+:0,VOkJ @(P @(s@"jbVZKL$jIHR$ԝ;KJM2u7)l"TtL:^ *W10ڛ9V Utԁ@(P @(P#!'A2#^cןJYRP @(},`&JA:g4|\Z@(P @(+VSnPRT +0z)o"?#b;E<ޕQ׸,( /:&y (Sj[@(P @(+1@RP @(P @(P @(P @^+yaVhOdؾ*q#1S HJJD@5Xu} fۅEkH2LƄ,·A+U;i`RP @(P @o(XenD$w$H"`JT ׳}lȍLH W o- l+ٶ=&6o7r@ D(>tU&$e\GːBL*i 3 yY S  O*s@ze. W]*shmm+Q INۈPHVNA)@(Pu J;h Ҡ-p*#M^]*3.{gBW?$Hώ$OQ29O4 s5ݫ*uA BIH(VlMZP;. @Z{Q%=³t^PNxuRSx%-Bb=dhNӱ.&̜=q^Zvү_jwxGz"RXJ ȯ d)$=+r20/c+zqfYޕQKZmCiG:βN׈f :TTg '}Aӗ\)rzh:ֵgQQ%]uH HٰîqEjy @$:0/b\G-'? XRDZ竈8ㇿfGbסDȟBr۝eWzraN\ܽuKJROC<Uu.d+|TkSE]>2KvSIx{[BH@JYen$iGƫ?~•1'#M?j|gȉ35GP^@I9NH&m­6$}Y}FOLn8:Bmpd'xfu7eGٙCl!׺`}j5% #g]cMw \*WSxxh*]$f2[:Ry~`+6tё (:FmF!j[Kח$o)/.As'3LxDv)_oZ(dYƟ)Z OV9#Kɀ?6LTDff'xاS*cĘ2|-X2TwPi_ĥ+ukKkWQeV$ZfuRU|O']yYh-J"R W S*|Z2eSTˮR bAPj|u1Z~Σg%GYmo&O!̭ 1FQ}yVzԝzfSiYr=@H"Sl8T4FM$b^'n }G[)Y0=0 u#[)wTeZ( g51g$OׅVLj]I3r ̈A8i: >'S0ç?[oS" wltC@?*$dS?b2Z}$ Tn.W̏qDԐlf2I\O#Q2˕(9QZT'ҥRFcU7Sd˂cQ@\ ,GbԶU}sXkWfA ХAZQ oKtث#m}p@t(91(]؉F+b<4挛T|EWA()ҵܨ6N *I$ZV>1>{u)X0=@MRs=zw_ݖcY9/:2nS*NH kfʸ!`/W\xS^f;˦?)>$_S:'#.o3rGƙn%S9#~Vd!`Jd’26$&EY4Ui1gQ*jّYM;梯Er2׸ 5rL'6(|H}j|R<3*8"ݽPiR֟JprjŲ(UFaRG9tD7.>LCO=w5>'7Q\A4eYQy?v}i=IpNQ .FDې$~* Ijv[>iIiᛑ /o_H !3!fC+|&9YOj% 5ZxY#)j8b)Q? ȌD*0ڧ3#pTxI(I0XSGp+.i=Ou+FB5fp\8A3@?ڐtf<+Oo]8cZG<3pythonprop-0.30.1/src/pythonprop/ui/Makefile.am0000664000175000017500000000041213736105314016422 00000000000000uidir = $(pkgdatadir)/ui ui_DATA = voacapgui.ui \ voaAntennaChooser.ui \ voaAreaChooser.ui \ voaAreaPlotBox.ui \ voaP2PPlotBox.ui \ voaPropWindowBox.ui \ voaSiteChooser.ui \ voaTextFileViewDialog.ui \ map.jpg \ voacap.png EXTRA_DIST = $(ui_DATA) pythonprop-0.30.1/src/pythonprop/ui/voaAntennaChooser.ui0000664000175000017500000001153513662771311020356 00000000000000 False 5 Antenna Chooser True mouse True normal True False vertical 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True True 160 True True True True True False True True True True True False True True True True 1 cancel_button ok_button pythonprop-0.30.1/src/pythonprop/ui/voacapgui.ui0000664000175000017500000035664613736105351016733 00000000000000 1900 2100 1 10 10 0.10000000000000001 10 1 0.050000000000000003 1 0.050000000000000003 1 0.050000000000000003 1 0.050000000000000003 2 30 14.1 0.10000000000000001 5 5 350 15 100 True False gtk-open 0.10000000000000001 90 3 0.10000000000000001 10 -200 -100 -145 1 10 1 12 1 10 20 3 1 10 1 31 1 1 10 2 30 0.10000000000000001 5 1 12 1 10 1900 2100 1 10 100 90 1 10 359.99000000000001 1 10 -90 90 1 10 -180 180 1 10 100 47 1 10 359 1 10 -90 90 1 10 -180 180 1 10 1000000 100 10 50 23 1 10 True False voacapgui center True True False vertical True False True False File True False Open VGZ... True False image1 False gtk-quit True False True True True False Help True False gtk-help True False True True gtk-about True False True True False True 0 True True 12 True False vertical True False 12 0 none True False 12 12 True False 6 12 True Site True True True True 0 0 True False Latitude 1 0 1 Antenna True True True 0 2 Bearing True True True 0 3 True True 25 1 0 3 True True 0.00 1 True tx_lat_adjustment 2 True if-valid 1 1 True False Longitude 1 2 1 True True 0.00 1 True tx_lon_adjustment 2 True if-valid 3 1 True True False 1 2 3 True True 0.00 1 True tx_bearing_adjustment 2 True True if-valid 1 3 True False Power (W) 1 2 3 True True 100 1 True tx_pwr_adjustment True if-valid 100 3 3 True False <b>Tx. Site</b> True True True 0 True False 12 0 none True False 12 12 True False 6 12 True Site True True True 0 0 True False Latitude 1 0 1 Antenna True True True 0 2 Bearing True True True 0 3 True True 25 1 0 3 True True 0.00 1 True rx_lat_adjustment 2 True if-valid 1 1 True False Longitude 1 2 1 True True 0.00 1 True rx_lon_adjustment 2 True if-valid 3 1 True True False 1 2 3 True True 0.00 1 True rx_bearing_adjustment 2 True True if-valid 1 3 True False <b>Rx. Site</b> True True True 1 True False Site False True False 12 0 none True False 12 12 True False 6 12 True False Year right start 1 0 0 True True 1900 1 p2p_year_adjustment True 1900 1 0 gtk-add True True True center True 2 0 gtk-delete True True True center True 4 0 gtk-clear True True True center True 4 1 True False Month right end 1 0 1 True True 1 1 p2p_month_adjustment True 1 1 1 True False Use day right end 1 0 2 True True False 0 True 1 2 True False Day right 1 0 3 True True 1 1 p2p_day_adjustment True 1 1 3 Calendar True True True center bottom 1 4 True False Template 1 0 5 True False 1 5 gtk-add True True True center True 2 5 True False Circuit 1 0 6 True True False 0 True 1 6 gtk-add True True True center True 2 7 True True 2.000 1 p2p_freq_adjustment 3 2 1 7 True False Frequency 1 0 7 True True etched-in True True 3 0 6 gtk-clear True True True center True 4 8 gtk-delete True True True center True 4 7 gtk-execute True True True True True 4 12 True False 3 12 True False Method 1 2 12 True True etched-in True True 3 7 5 True False <b>Point-to-Point Predictions</b> True 1 True False P2P 1 False True False 12 0 none True False 12 12 True False 6 12 True False Year 0 1 0 0 True False Month 1 0 1 True False UTC 1 0 2 True False Frequency 1 0 3 True True 4 1900 1 area_year_adjustment True 1900 1 0 True True 2 1 1 month_adjustment True 1 1 1 True True 0 1 utc_adjustment True 1 2 True True 14.100 1 freq_adjustment 3 True 14.1 1 3 gtk-add True True True center True 1 4 True True True True etched-in True True True 2 0 6 gtk-delete True True True center True 3 0 gtk-clear True True True center False True 3 1 True False Templates 1 0 6 gtk-add True True True center True 3 6 True False 1 6 2 Area True True True center 0 7 True True False 1 7 2 True False Gridsize 1 0 8 True True 5 5 1 gridsize_adjustment True 5 1 8 gtk-execute True True True end end 4 2 True True 3 9 True False <b>Area Predictions</b> True 8 2 True False Area 2 False True False 12 24 12 12 6 12 True False 12 True Man-Made Noise (dBW/Hz) end 1 0 1 True True -145 1 mm_noise_adjustment True -145 1 1 True False True 1 Required SNR (dB/Hz) 1 2 1 True True 47.0 1 snr_adjustment 1 True 47 3 1 True False 12 True Min. Take-Off Angle (deg) 1 0 2 True False 12 True 1 Reliability (%) 1 0 3 True True 3.0 1 min_toa_adjustment 1 True 3 1 2 True True 90 1 reliability_adjustment True 90 1 3 True False True 1 Multipath Tolerance (dB) end 1 2 2 True False True Max. Delay (mS) 1 2 3 True True 3.0 1 mpath_adjustment 1 True 3 3 2 True True 0.0 1 delay_adjustment 1 True 3 3 True False 18 <b>Ionospheric Variables</b> True 0 0 4 4 True False <b>System Parameters</b> True 0 0 0 4 True False 12 foE 1 0 5 True True 0.00 1 foe_adjustment 2 True 1 5 True False foF2 1 2 5 True True 0.00 1 fof2_adjustment 2 True 3 5 True False 12 foF1 end 1 0 6 True True 0.00 1 fof1_adjustment 2 True 1 6 True False foEs 1 2 6 True True 0.00 1 foes_adjustment 2 True 3 6 True False 18 <b>Model</b> True 0 0 7 4 True False 12 Model end 1 0 8 True False center 1 8 True False Path end 1 2 8 True False center 3 8 3 True False System 3 False True False 12 12 0 none True False 12 True False vertical 12 True True etched-in True True False False True True 0 True False 130 True False queue etched-in True False 0 none True False 1 True False True False True True True 0 True False 0 none True False 12 True False vertical True False SSN Data 0 0 True True 0 True False 1 1 Web Update True True True True False 1 True False False True 1 False True 1 True False <b>Sun Spot Numbers</b> True 4 True False SSN 4 False True True 1 True False 6 2 True False True 2 pythonprop-0.30.1/src/pythonprop/ui/Makefile.in0000664000175000017500000003245713736105751016456 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/pythonprop/ui ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(uidir)" DATA = $(ui_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ uidir = $(pkgdatadir)/ui ui_DATA = voacapgui.ui \ voaAntennaChooser.ui \ voaAreaChooser.ui \ voaAreaPlotBox.ui \ voaP2PPlotBox.ui \ voaPropWindowBox.ui \ voaSiteChooser.ui \ voaTextFileViewDialog.ui \ map.jpg \ voacap.png EXTRA_DIST = $(ui_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pythonprop/ui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/pythonprop/ui/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-uiDATA: $(ui_DATA) @$(NORMAL_INSTALL) @list='$(ui_DATA)'; test -n "$(uidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(uidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(uidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(uidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(uidir)" || exit $$?; \ done uninstall-uiDATA: @$(NORMAL_UNINSTALL) @list='$(ui_DATA)'; test -n "$(uidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(uidir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(uidir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-uiDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-uiDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip install-uiDATA \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-uiDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/src/pythonprop/voaFile.py0000664000175000017500000005747513662771311015741 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: voafile.py # # Copyright (c) 2007 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import calendar import codecs import datetime import io import sys import string import math import os.path from .hamlocation import * from .voaAreaRect import * import calendar as cal import zipfile from .vgzArchive import get_voa_filename DEBUG = False PROJECTION= {0:'aeqd', 1:'cyl'} class VOAFile: """Encapsulates a VOACAP area calculation input (.voa) file. A typical .voa file is structured as follows; Model :VOACAP Colors :Black :Blue :Ignore :Ignore :Red :Black with shading Cities :Receive.cty Nparms : 4 Parameter:MUF 0 Parameter:DBU 0 Parameter:SNRxx 0 Parameter:REL 0 Transmit : 24.63N 46.72E RIYADH (AR RIYAD) Short Pcenter : 24.63N 46.72E RIYADH (AR RIYAD) Area : -180.0 180.0 -90.0 90.0 Gridsize : 399 1 Method : 30 Coeffs :CCIR Months : 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Ssns : 15 0 0 0 0 0 0 0 0 Hours : 12 0 0 0 0 0 0 0 0 Freqs : 9.850 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 System : 145 0.100 90 73 3.000 0.100 Fprob : 1.00 1.00 1.00 0.00 Rec Ants :[default /swwhip.voa ] gain= 0.0 0.0 Tx Ants :[default /const17.voa ] 0.000 57.0 500.0000 """ def __init__(self, fn): self.TX_SITE = 100 self.P_CENTRE = 101 self.RX_SITE = 102 self.gridsize = 0 self.pcentrelabel = '' self.pcentrelat = 0.0 self.pcentrelon = 0.0 self.txlabel = '' self.txlat = 0.0 self.txlon = 0.0 self.txPower = 0.0 self.txBearing = 0.0 self.txAntenna = '' self.rxAntenna = '' self.txGain = 0.0 self.projection = 0 self.path = 'Short' self.llcrnrlon = 0.0 self.llcrnrlat = 0.0 self.urcrnrlon = 0.0 self.urcrnrlat = 0.0 self.monthDays = [] self.ssns = [] self.utcs = [] self.frequencies = [] self.XNOISE = 145 self.AMIND = 0.100 self.XLUFP = 90 self.RSN = 16 self.PMP = 3.000 self.DMPX = 0.100 self.PSC1 = 1.0 self.PSC2 = 1.0 self.PSC3 = 1.0 self.PSC4 = 1.0 self.filename = fn def parse_file(self): if self.filename.endswith('.vgz'): voa_filename = get_voa_filename(self.filename) zf = zipfile.ZipFile(self.filename) voaFile = io.TextIOWrapper(zf.open(voa_filename), 'utf-8') else: voaFile = open(self.filename) try: #voaFile = open(self.filename) for line in voaFile: if DEBUG: print(line) if line.startswith("Area"): self.llcrnrlon = float(line[11:20]) self.llcrnrlat = float(line[31:40]) self.urcrnrlon = float(line[21:30]) self.urcrnrlat = float(line[41:50]) if DEBUG: print(self.llcrnrlon, self.llcrnrlat, self.urcrnrlon, self.urcrnrlat) elif line.startswith("Gridsize"): self.gridsize = int(line[11:16]) if DEBUG: print("Gridsize = ", self.gridsize) if int(line[19:20]) in PROJECTION: self.projection = PROJECTION[int(line[19:20])] if DEBUG: print("Projection = ", self.projection) elif line.startswith("Pcenter"): self.pcentrelabel = line[27:47].strip() if DEBUG: print("PCentre = ", self.pcentrelabel) self.pcentrelat = self.parse_lat_lon(line[11:20]) if DEBUG: print("PCentre Lat = ", self.pcentrelat) self.pcentrelon = self.parse_lat_lon(line[21:30]) if DEBUG: print("PCentre Lon = ", self.pcentrelon) elif line.startswith("System"): self.XNOISE = int(line[11:15].strip()) self.AMIND = float(line[16:25].strip()) self.XLUFP = int(line[26:30].strip()) self.RSN = int(line[31:35].strip()) self.PMP = float(line[36:45].strip()) self.DMPX = float(line[46:55].strip()) elif line.startswith("Fprob"): self.PSC1 = float(line[11:15].strip()) self.PSC2 = float(line[11:15].strip()) self.PSC3 = float(line[11:15].strip()) self.PSC4 = float(line[11:15].strip()) elif line.startswith("Transmit"): self.txlabel = line[30:50].strip() if DEBUG: print("Tx. = ", self.txlabel) self.txlat = self.parse_lat_lon(line[10:20]) if DEBUG: print(x_anself.txlat) self.txlon = self.parse_lat_lon(line[20:30]) if DEBUG: print(self.txlon) self.path = 'Short' if line[52:56].strip().startswith('S') else 'Long' elif line.startswith("Tx Ants"): self.txPower = float(line[49:60].strip()) self.txBearing = float(line[40:46].strip()) self.txGain = float(line[33:39].strip()) self.txAntenna = self.strcompress(line[11:32].strip()) elif line.startswith("Rec Ants"): self.rxAntenna = self.strcompress(line[11:32].strip()) elif line.startswith("Hours :"): self.utcs = [] file_times = str.split(line[10:len(line)]) for time in file_times: self.utcs.append(int(time)) elif line.startswith("Ssns :"): self.ssns = [] file_ssns = str.split(line[10:len(line)]) for ssn in file_ssns: self.ssns.append(int(ssn)) elif line.startswith("Months :"): self.monthDays = [] file_months = str.split(line[10:len(line)]) for month in file_months: self.monthDays.append(float(month)) elif line.startswith("Freqs :"): self.frequencies = [] file_freqs = str.split(line[10:len(line)]) for freq in file_freqs: self.frequencies.append(float(freq)) except IOError: print("Error opening/reading file ", fn) sys.exit(1) finally: if DEBUG: print("Closing the file") voaFile.close() if 'zf' in locals(): if DEBUG: print("Closing the zip file") zf.close() def get_gridsize(self): return self.gridsize def set_gridsize(self, gridsize): self.gridsize = int(gridsize) def get_centre_label(self): return self.pcentrelabel def get_centre_lat(self): return self.pcentrelat def get_centre_lon(self): return self.pcentrelon def get_tx_label(self): return self.txlabel def get_tx_lat(self): return self.txlat def get_tx_lon(self): return self.txlon def get_location(self, location): """Returns a HamLocation defining a location associated with the plot. Keyword arguments location -- specifies the location to return. Valid values are VOAFile.TX_SITE, VOAFile.RX_SITE or VOAFile.P_CENTRE. """ if location == self.TX_SITE: return HamLocation(self.txlat, self.txlon, self.txlabel) elif location == self.P_CENTRE: return HamLocation(self.pcentrelat, self.pcentrelon, self.pcentrelabel) elif location == self.RX_SITE: return HamLocation(self.rxlat, self.rxlon, self.rxlabel) def set_location(self, location, label, lon, lat): """Sets one of the locations associated with the plot. Keyword arguments location -- specifies the loation to set. Valid value is VOAFile.TX_SITE (This is the only type currently supported) """ if location == self.TX_SITE: self.txlabel = label self.txlon = float(lon) self.txlat = float(lat) def get_projection(self): return self.projection def get_num_plots(self): try: num_plots = self.monthDays.index(0.0) except (ValueError): num_plots = len(self.monthDays) if DEBUG: print("number of plots = ", num_plots) return num_plots def get_monthday(self, field): """Returns the month.day for the specified field, e.g 20th December is represented by the month day (float) value '12.20'. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. """ return self.monthDays[int(field)] def get_month(self, field): """Returns an integer representing the month for the specified field. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. """ return int(math.floor(self.monthDays[int(field)])) def get_day(self, field): """Returns an integer representing the day for the specified field. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. """ x, y = math.modf(self.monthDays[int(field)]) return int(x * 10) def clear_plot_data(self): self.utcs = [] self.ssns = [] self.monthDays = [] self.frequencies = [] def add_plot(self, plot_parameters): """This method replaces the earlier 'set' type methods. Keyword Arguments plot_parameters -- a (freq, utc, month_day, ssn) tuple representing the plot parameters. """ freq, utc, md, ssn = plot_parameters self.utcs.append(int(utc)) self.ssns.append(round(float(ssn))) self.monthDays.append(float(md)) self.frequencies.append(float(freq)) def get_utc(self, field): """Returns the time (UTC) for a specified field. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. """ return self.utcs[int(field)] def set_rx_antenna(self, data_file, gain=0.0, bearing=0.0): self.rx_ant_data_file = data_file self.rx_ant_gain = gain self.rx_ant_bearing = bearing def set_tx_antenna(self, data_file, design_freq=0.0, bearing=0.0, power=0.125): self.txAntenna = data_file self.tx_ant_design_freq = design_freq self.txBearing = bearing self.txPower = power def get_txBearing(self): return self.txBearing def get_txPower(self): return self.txPower def get_txAntenna(self): return self.txAntenna """ XNOISE represents the level of man-made. In the file it s stored as a postive integer. This must be converted to a negative value for use in calculations (e.g. '145' replresents a man-made noise level of 145dBW/Hz) When get/set are used, 'real' (e.g. '-145' values are expected, returned) """ def get_path(self): return self.path def set_path(self, path): self.path = 'Short' if path.startswith('S') else 'Long' def get_xnoise(self): return -self.XNOISE def set_xnoise(self, xnoise): self.XNOISE = abs(int(xnoise)) def get_amind(self): return self.AMIND def set_amind(self, amind): self.AMIND = float(amind) def get_xlufp(self): return self.XLUFP def set_xlufp(self, xlufp): self.XLUFP = int(xlufp) def get_rsn(self): return self.RSN def set_rsn(self, rsn): self.RSN = int(rsn) def get_pmp(self): return self.PMP def set_pmp(self, pmp): self.PMP = float(pmp) def get_dmpx(self): return self.DMPX def set_dmpx(self, dmpx): self.DMPX = float(dmpx) def get_psc1(self): return self.PSC1 def set_psc1(self, psc1): self.PSC1 = float(psc1) def get_psc2(self): return self.PSC2 def set_psc2(self, psc2): self.PSC2 = float(psc2) def get_psc3(self): return self.PSC3 def set_psc3(self, psc3): self.PSC3 = float(psc3) def get_psc4(self): return self.PSC4 def set_psc4(self, psc4): self.PSC4 = float(psc4) def set_area(self, area): _lat, _lon = area.get_sw() self.set_ll_corner_lat(_lat) self.set_ll_corner_lon(_lon) _lat, _lon = area.get_ne() self.set_ur_corner_lat(_lat) self.set_ur_corner_lon(_lon) def get_area_rect(self): return VOAAreaRect(self.llcrnrlat, self.llcrnrlon, self.urcrnrlat, self.urcrnrlon) def get_ll_corner_lon(self): return self.llcrnrlon def set_ll_corner_lon(self, lon): self.llcrnrlon = float(lon) def get_ll_corner_lat(self): return self.llcrnrlat def set_ll_corner_lat(self, lat): self.llcrnrlat = float(lat) def get_ur_corner_lon(self): return self.urcrnrlon def set_ur_corner_lon(self, lon): self.urcrnrlon = float(lon) def get_ur_corner_lat(self): return self.urcrnrlat def set_ur_corner_lat(self, lat): self.urcrnrlat = float(lat) """ This may not be an accurate datetime and is only to be used when plotting day / night regions on the map. """ def get_daynight_datetime(self,field): return datetime.datetime(2016, self.get_month(field), max(self.get_day(field), 1), self.get_utc(field)) def get_minimal_plot_description_string(self,field, plot_type, time_zone=0): """Returns a formatted string that may be used as a title for the plot. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. plot_type -- a string specifying the plot type. Valid values are 'MUF', 'REL' and 'SNR' time_zone -- an integer specifying the time zone. Default = 0 """ _month = cal.month_abbr[int(math.floor(self.monthDays[int(field)]))] hour = int(self.utcs[int(field)] + time_zone) #todo can't we do this with a proper python time class???? if hour > 24: hour = hour - 24 elif hour < 0: hour = hour + 24 if (time_zone == 0): hour_str = "%02d:00" % (hour) else: _sign = '+' if (time_zone >= 0) else '' hour_str = "%02d:00%s%s : " % (hour, _sign, time_zone) theSSN = str(self.ssns[int(field)]) if (plot_type == 'MUF'): return _month + ' ' + hour_str #return hour_str + _month+ ' : SSN ' + theSSN + ' : ' +thePower else: # Add the frequency to the data string theFrequency = "%.3fMHz" % self.frequencies[int(field)] return _month + ' ' + hour_str + ' ' + theFrequency # The following method is failing for Jari def get_plot_description_string(self, field, plot_type, time_zone=0): """Returns a formatted string that may be used as a title for the plot. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. plot_type -- a string specifying the plot type. Valid values are 'MUF', 'REL' and 'SNR' time_zone -- an integer specifying the time zone. Default = 0 """ _month = cal.month_abbr[int(math.floor(self.monthDays[int(field)]))] hour = int(self.utcs[int(field)] + time_zone) #todo can't we do this with a proper python time class???? if hour > 24: hour = hour - 24 elif hour < 0: hour = hour + 24 if (time_zone == 0): hour_str = "%02d00 UTC" % (hour) else: _sign = '+' if (time_zone >= 0) else '' hour_str = "%02d00 UTC%s%s : " % (hour, _sign, time_zone) if (self.txPower >= 1.0): _power = "%.2f kW" % (self.txPower) else: _power = "%.0f W" % ((self.txPower)*1000) ## some output stuff below to put on top of the coverage map --jpe if self.RSN == 24: _traffic = "CW" elif self.RSN == 38: _traffic = "SSB" elif self.RSN == 49: _traffic = "AM" elif self.RSN == 17: _traffic = "ROS" else: _traffic = "" _mode = ("{:d}dB/Hz {:s}".format(self.RSN, _traffic)).strip() # "N/A" if (plot_type == 'MUF'): return """{location} ({lat}, {lon}) {hour} {month} {power} SSN:{ssn} {mode}""".format(location=self.txlabel, lat=self.lat_as_string(self.txlat), lon=self.lon_as_string(self.txlon), hour=hour_str, month=_month, power=_power, ssn=self.ssns[int(field)], mode=_mode) #return siteLocation + _month + ', ' + hour_str + ', ' + thePower + ', SSN ' + theSSN #return hour_str + _month+ ' : SSN ' + theSSN + ' : ' +thePower else: site_description = """{location} ({lat}, {lon}) {hour} {month} {frequency:.3f}MHz {power} SSN:{ssn} {mode}""".format(location=self.txlabel, lat=self.lat_as_string(self.txlat), lon=self.lon_as_string(self.txlon), hour=hour_str, month=_month, frequency=self.frequencies[int(field)], power=_power, ssn=self.ssns[int(field)], mode=_mode) return site_description def get_group_titles(self): titles = [] for ctr in range(0, self.get_num_plots()): titles.append("{:d}: {:.2f}MHz {:02d}:00UTC {:s}".format(ctr+1, self.frequencies[ctr], self.utcs[ctr], calendar.month_name[int(self.monthDays[ctr])])) return titles def get_detailed_plot_description_string(self, field): """Returns a string of comprehensive information about the plot. Keyword arguments field -- an integer specifying the field to return. Valid values are in the range 0-11. """ #siteLocation = self.txlabel + ' : (Lon:' + theLon + '$^\circ$, Lat:' + theLat + '$^\circ$)' # theLat = self.lat_as_string(self.txlat) # "%.2f" % (self.txlat) # theLon = self.lon_as_string(self.txlon) # "%.2f" % (self.txlon) # siteLocation = 'TX: ' + self.txlabel + ' (' + theLat + ', ' + theLon + ')' emmisionData = 'TX Ant: ' + self.txAntenna + ', RX Ants: ' + self.rxAntenna # emmisionData = 'Tx. Ant.: ' + self.txAntenna + \ # " : %.2f$^\circ$" % (self.txBearing) + \ # " : %.2f dBi" % (self.txGain) return emmisionData #- Frequency #- Grid Size def write_file(self): #f = open(self.filename, 'wt') f = codecs.open(self.filename, "w", "utf-8") f.write('Model :VOACAP\n') f.write('Colors :Black :Blue :Ignore :Ignore :Red :Black with shading\n') f.write('Cities :Receive.cty\n') f.write('Nparms : 4\n') f.write('Parameter:MUF 0\n') f.write('Parameter:DBU 0\n') f.write('Parameter:SNRxx 0\n') f.write('Parameter:REL 0\n') tmpStr= "Transmit :%10s%10s%20s %5s\n" % (self.lat_as_string(self.txlat), self.lon_as_string(self.txlon), self.txlabel, self.path) f.write(tmpStr) tmpStr= "Area :%10.1f%10.1f%10.1f%10.1f\n" % \ (self.llcrnrlon, self.urcrnrlon, self.llcrnrlat, self.urcrnrlat) f.write(tmpStr) tmpStr = "Gridsize : %3d 1\n" % (self.gridsize) f.write(tmpStr) f.write('Method : 30\n') f.write('Coeffs :CCIR\n') tmpStr = "Months :" for md in self.monthDays: tmpStr = tmpStr + "%7.2f" % md f.write(tmpStr+"\n") tmpStr = "Ssns :" for ssn in self.ssns: tmpStr = tmpStr + "%7d" % ssn f.write(tmpStr+"\n") tmpStr = "Hours :" for utc in self.utcs: tmpStr = tmpStr + "%7d" % utc f.write(tmpStr+"\n") tmpStr = "Freqs :" for freq in self.frequencies: tmpStr = tmpStr + "%7.3f" % freq f.write(tmpStr+"\n") tmpStr= "System :%5d%10.3f%5d%5d%10.3f%10.3f\n" % \ (self.XNOISE, self.AMIND, self.XLUFP, self.RSN, self.PMP, self.DMPX) f.write(tmpStr) tmpStr ="Fprob :%5.2f%5.2f%5.2f%5.2f\n" % (self.PSC1, self.PSC2, self.PSC3, self.PSC4) f.write(tmpStr) tmpStr = "Rec Ants :[%21s] gain=%6.1f%6.1f\n" % \ (self.rx_ant_data_file, self.rx_ant_gain, self.rx_ant_bearing) f.write(tmpStr) tmpStr = "Tx Ants :[%21s]%7.3f%6.1f%10.4f\n" % \ (self.txAntenna, self.tx_ant_design_freq, self.txBearing, self.txPower) f.write(tmpStr) f.close() def parse_lat_lon(self, l_str): l = 0.0 if DEBUG: print("l_str = ", l_str) l_str = l_str.strip() if ((l_str.endswith('S')) or (l_str.endswith('W'))): l = 0 - float(l_str[:-1]) else: l = float(l_str[:-1]) if DEBUG: print("Lat/Lon = ", l) return l def get_description(self): voa_str = "Filename : %s \n" % (self.filename) voa_str = "%sGrid Size : %d \n" % (voa_str, self.gridsize) voa_str = "%sPlot Centre : %s (%.2f, %.2f) \n" % (voa_str, self.pcentrelabel, \ self.pcentrelon, self.pcentrelat) voa_str = "%sTx. Site : %s (%.2f, %.2f) \n" % (voa_str, self.txlabel, \ self.txlon, self.txlat) voa_str = "%sLower Left Corner : Lat.%.2f, Lon.%.2f \n" % (voa_str, self.llcrnrlat, self.llcrnrlon) voa_str = "%sUpper Right Corner : Lat.%.2f, Lon.%.2f \n" % (voa_str, self.urcrnrlat, self.urcrnrlon) return voa_str def lat_as_string(self, lat): #degree_sign= u'\N{DEGREE SIGN}' if lat > 90.0 : lat = 90.0 if lat < -90.0 : lat = -90.0 lat_sign = 'N' if lat < 0.0: lat_sign = 'S' return "{:.2f}{:s}".format(abs(lat), lat_sign) def lon_as_string(self, lon): #degree_sign= u'\N{DEGREE SIGN}' if lon > 180.0 : lon = 180.0 if lon < -180.0 : lon = -180.0 lon_sign = 'E' if lon < 0.0: lon_sign = 'W' return "{:.2f}{:s}".format(abs(lon), lon_sign) # http://mail.python.org/pipermail/tutor/2007-October/057571.html def strcompress(self, mystring): mystring_compressed = ''.join(mystring.split()) return mystring_compressed pythonprop-0.30.1/src/pythonprop/voaDatFile.py0000664000175000017500000003030113662771311016345 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: voaDatFile.py # Version: 300409 # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # A class to encapsulate the data file used for voacap point-to-point # prediction # A typical file is shown below; # # COMMENT This file is a sample input file # LINEMAX 55 number of lines-per-page # COEFFS CCIR # TIME 1 24 1 1 # MONTH 2009 3.00 # SUNSPOT 6. # LABEL RIYADH (AR RIYAD) WARSAW (WARSZAWA) # CIRCUIT 24.63N 46.71E 52.25N 21.00E S 0 # SYSTEM 1. 145. 1.00 90. 45.0 3.00 0.10 # FPROB 1.00 1.00 1.00 0.00 # ANTENNA 1 1 02 30 0.000[default/swwhip.voa ] 0.0 0.1500 # ANTENNA 2 2 02 30 0.000[default/swwhip.voa ] 0.0 0.0000 # FREQUENCY 2.40 3.30 4.90 6.00 7.20 9.7011.8013.7015.3017.7021.60 # METHOD 30 0 # EXECUTE # QUIT #from __future__ import with_statement import calendar import datetime import os.path import string import sys import textwrap #from voaLocation import * from .hamlocation import * DEBUG = False class VOADatFile: comment = 'COMMENT File generated by pythonProp package.\n' coeffs = 'CCIR' linemax = 'LINEMAX 55\n' month = 'MONTH' sunspot = 'SUNSPOT' frprob = 'FPROB' method = 'METHOD' label = 'LABEL' power = 0.0 antenna = ['ANTENNA', 'ANTENNA'] frequency_list = () ssn_list = () SHORT_PATH = 0 LONG_PATH = 1 TX_ANTENNA = 0 RX_ANTENNA = 1 CIRCUIT_FORMAT = 0 GRAPHICAL_FORMAT = 1 def __init__(self, fn): self.filename = fn # COMMENT # 1-10 COMMENT command # 11-80 User comment def set_title(self, title_list): self.title = title_list def get_comment_card(self, comment_list): comment_str = '' for comment in comment_list: tw_str = textwrap.fill(comment, width=69).split('\n') for line in tw_str: #line = +line comment_str = comment_str + 'COMMENT ' + line + '\n' return comment_str def set_linemax(self, max): self.linemax = 'LINEMAX '+str(max).rjust(5)+'\n' # MONTH # 1-10 MONTH command # 11-15 year # 16-20 month # MONTH 2009 3.00 4.00 5.00 # SUNSPOT # 1-10 SUNSPOT command # 11-15 12 month mean sunspot value # ssn_list is a list of tuples (day, month, year, ssn) def set_ssn(self, ssn_list): self.ssn_list = ssn_list def get_month_ssn_cards(self, ssn_list=None ): month = 'MONTH ' sunspot = 'SUNSPOT ' if ssn_list: if (len(ssn_list) > 12): ssn_list = ssn_list[0:11] for item in ssn_list: _day, _month, _year, _ssn = item if ((_day < 0) or (_day>30)): break if ((_month < 1) or (_month>12)): break the_month = str(_month) + '.' + "%02d" % _day the_ssn = "%.1f" % float(_ssn) month = month + str(_year).rjust(5) + the_month.rjust(5) sunspot = sunspot + the_ssn.rjust(5) month = month + '\n' sunspot = sunspot + '\n' return month + sunspot def set_coeffs(self, coeffs): self.coeffs = coeffs.strip() def get_coeffs(self): return self.coeffs def get_coeffs_card(self): return 'COEFFS '+self.coeffs+'\n' # SYSTEM # 1-10 SYSTEM command # 11-15 Tx. PoSYSTEM 1. 145. 1.00 90. 45.0 3.00 0.10wer (kW) # 16-20 XNOISE # 21-25 AMIND # 26-30 XLUFP # 31-35 RSN # 36-4PMP # 41-45 DMPX # SYSTEM 1. 145. 1.00 90. 45.0 3.00 0.10 # FORMAT(10X,F5.2,F5.0,F5.2,F5.0,3F5.2) # SYSTEM 1. 145. 3.00 90. 45.0 3.00 0.10 def set_system(self, pwr, xnoise, amind, xlufp, rsn, pmp, dmpx): self.system = 'SYSTEM ' self.system = self.system + self.get_formatted_power(pwr,5) self.system = self.system + ("%.0f" % float(xnoise)).rjust(5) self.system = self.system + ("%.2f" % float(amind)).rjust(5) self.system = self.system + ("%.0f" % float(xlufp)).rjust(5) self.system = self.system + ("%.2f" % float(rsn)).rjust(5) self.system = self.system + ("%.2f" % float(pmp)).rjust(5) self.system = self.system + ("%.2f" % float(dmpx)).rjust(5) + '\n' # Accepts a power (in kW) and returns a formatted string # The number of decimal places is dependant upon the input power def get_formatted_power(self, power, width): pow_str = ("%f" % float(power))[0:width] return pow_str.strip().rjust(width) # FPROB # 1-10 FPROB command # 11-15 PSC(1) Multiplier for foE > 0 # 16-20 PSC(2) Multiplier for foF1 # 21-25 PSC(3) Multiplier for foF2 > 0 # 26-30 PSC(4) Multiplier for foEs # FPROB 1.00 1.00 1.00 0.00 # FORMAT(10X,4A10) def set_fprob(self, psc1='1.0', psc2='1.0', psc3='1.0', psc4='0.0'): self.fprob = 'FPROB ' self.fprob = self.fprob + ("%.2f" % float(psc1)).rjust(5) self.fprob = self.fprob + ("%.2f" % float(psc2)).rjust(5) self.fprob = self.fprob + ("%.2f" % float(psc3)).rjust(5) self.fprob = self.fprob + ("%.2f" % float(psc4)).rjust(5) + '\n' # LABEL # 1-10 LABEL command # 11-30 ITran # 31-50 IRcvr # FORMAT(10X,4A10) # # CIRCUIT # 1-10 CIRCUIT command # 11-15 TLATD F5.2 Latitude of Tx # 16 ITLAT A1 N=North, S=South # 20-25 TLONGD F5.2 Longitude of Tx # 26 ITLONG A1 E=East, W=West # 31-25 RLATD F5.2 Latitude of Receiver # 36 IRLAT A1 N=North, S=South # 41-45 RLONGD F5.2 Longitude of Rx # 46 IRLONG A1 E=East, W=West # 51-55 NPSL I5 0=Short, 1=Long # FORMAT(10X,F5.2,A1,3(F9.2,A1),4X,I5) def set_sites(self, tx_site, rx_site, path = SHORT_PATH): self.label = 'LABEL ' + \ self.format_site_label(tx_site.get_name()) + \ self.format_site_label(rx_site.get_name()) + '\n' self.circuit = 'CIRCUIT ' + ("%.2f" % abs(tx_site.get_latitude())).rjust(5) self.circuit = self.circuit + ('N' if tx_site.get_latitude() >= 0 else 'S') self.circuit = self.circuit + ("%.2f" % abs(tx_site.get_longitude())).rjust(9) self.circuit = self.circuit + ('E' if tx_site.get_longitude() >= 0 else 'W') self.circuit = self.circuit + ("%.2f" % abs(rx_site.get_latitude())).rjust(9) self.circuit = self.circuit + ('N' if rx_site.get_latitude() >= 0 else 'S') self.circuit = self.circuit + ("%.2f" % abs(rx_site.get_longitude())).rjust(9) self.circuit = self.circuit + ('E' if rx_site.get_longitude() >= 0 else 'W') self.circuit = self.circuit + (' S ' if path == self.SHORT_PATH else ' L ') self.circuit = self.circuit + str(path).rjust(5) + '\n' # Returns a right justified string, limited to 20 chars in length def format_site_label(self, some_text): if len(some_text) > 20: some_text = some_text[0:19] return some_text.rjust(20) def set_antenna(self, tx_rx, data_file, bearing=0.0, power=0.0): # ANTENNA 2 2 02 30 0.000[default/swwhip.voa ] 0.0 0.0000 data_file = data_file.ljust(21) self.antenna[tx_rx] = 'ANTENNA '+\ str(tx_rx+1).rjust(5)+\ str(tx_rx+1).rjust(5)+\ ' 02 30'+\ ("%.3f" % float(0.0)).rjust(10)+\ '['+data_file+']' +\ ("%.1f" % float(bearing)).rjust(5)+\ self.get_formatted_power(power,10)+'\n' # Frequency list is limited to 11 entries. # Frequency precsion is 3 decimal places. def set_frequency_list(self, frequency_list): frequency_list = frequency_list if len(frequency_list)<=11 else frequency_list[0:11] self.frequency_list = [] for frequency in frequency_list: if ((frequency<2.0) or (frequency > 30.0)):break self.frequency_list.append(frequency) def get_frequency_card(self, frequency_list): # The '$' sign in the frequency card allows us to use # 3 d.p. in the frequency field card = 'FREQUENCY $' for frequency in self.frequency_list: card = card + ("%.3f" % float(frequency)).rjust(6) #card = card + ("%.2f" % float(frequency)).rjust(5) return card + '\n' def set_method(self, method): self.method = method def get_method_card(self, method): return 'METHOD ' + str(method).strip().rjust(5) + '\n' def write_file(self, data_file_format): f = open(self.filename, 'wt') if data_file_format == self.CIRCUIT_FORMAT: f.write(self.get_comment_card(self.title)) f.write(self.linemax) f.write(self.get_coeffs_card()) f.write('TIME 1 24 1 1\n') f.write(self.label) f.write(self.circuit) f.write(self.system) f.write(self.fprob) f.write(self.antenna[0]) f.write(self.antenna[1]) f.write(self.get_frequency_card(self.frequency_list)) #f.write('FREQUENCY 2.40 3.30 4.90 6.00 7.20 9.7011.8013.7015.3017.7021.60\n') f.write(self.get_method_card(self.method)) for group in self.ssn_list: f.write(self.get_month_ssn_cards([group])) group_comment = 'GROUP'+str(self.ssn_list.index(group)+1).rjust(3)+':'+\ self.get_group_description(group) f.write(self.get_comment_card([group_comment])) f.write('EXECUTE\n') f.write('QUIT\n') f.write('\n') elif data_file_format == self.GRAPHICAL_FORMAT: f.write(self.get_comment_card(self.title)) f.write(self.linemax) f.write(self.get_coeffs_card()) f.write('TIME 1 24 1 1\n') f.write(self.get_month_ssn_cards()) f.write(self.label) f.write(self.circuit) f.write(self.system) f.write(self.fprob) f.write(self.antenna[0]) f.write(self.antenna[1]) for group in self.ssn_list: f.write(self.get_month_ssn_cards([group])) group_comment = 'GROUP'+str(self.ssn_list.index(group)+1).rjust(3)+':'+\ self.get_group_description(group) f.write(self.get_comment_card([group_comment])) f.write(self.get_method_card('26')) f.write('EXECUTE\n') f.write('FREQUENCY -1\n') f.write(self.get_method_card(self.method)) f.write('EXECUTE\n') f.write('QUIT\n') f.write('\n') else: print("Invalid data file format specified.") f.close() def get_group_description(self, group): _day_str = '' if group[0] == 0 else str(group[0]).rjust(3) _month_str = calendar.month_abbr[group[1]].rjust(4) _year_str = str(group[2]).rjust(5) _ssn_str = str(group[3]).rjust(4)+'ssn' return _day_str + _month_str + _year_str + _ssn_str pythonprop-0.30.1/src/pythonprop/Makefile.in0000664000175000017500000005213113736105751016030 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/pythonprop ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(pythonprop_PYTHON) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) am__installdirs = "$(DESTDIR)$(pythonpropdir)" am__pep3147_tweak = \ sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|' py_compile = $(top_srcdir)/py-compile RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = ui templates pythonprop_PYTHON = \ vgzArchive.py \ voa3DPlot.py \ voaAreaPlot.py \ voaAreaPlotgui.py \ voaP2PPlot.py \ voaP2PPlotgui.py \ voaP2PPlotServer.py \ voacapgui.py \ hamlocation.py \ scriptutil.py \ ssnFetch.py \ treefilebrowser.py \ voaAntennaChooser.py \ voaAreaChooser.py \ voaAreaRect.py \ voaDatFile.py \ voaDefaults.py \ voaFile.py \ voaMeth26Out.py \ voaMultiPlot.py \ voaOutFile.py \ voaOutFilePrinter.py \ voaPlotFilePrinter.py \ voaPlotWindow.py \ voaSiteChooser.py \ voaSSNThumb.py \ voaTextFileViewDialog.py \ __init__.py pythonpropdir = $(pythondir)/pythonprop all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pythonprop/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/pythonprop/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pythonpropPYTHON: $(pythonprop_PYTHON) @$(NORMAL_INSTALL) @list='$(pythonprop_PYTHON)'; dlist=; list2=; test -n "$(pythonpropdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pythonpropdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pythonpropdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythonpropdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pythonpropdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(pythonpropdir)" $$dlist; \ else :; fi uninstall-pythonpropPYTHON: @$(NORMAL_UNINSTALL) @list='$(pythonprop_PYTHON)'; test -n "$(pythonpropdir)" || list=; \ py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$py_files" || exit 0; \ dir='$(DESTDIR)$(pythonpropdir)'; \ pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \ echo "$$py_files_pep3147";\ pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \ pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \ st=0; \ for files in \ "$$py_files" \ "$$pyc_files" \ "$$pyo_files" \ "$$pyc_files_pep3147" \ "$$pyo_files_pep3147" \ ; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pythonpropdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pythonpropPYTHON install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pythonpropPYTHON .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-pythonpropPYTHON \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-pythonpropPYTHON .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/src/pythonprop/voaAreaPlotgui.py0000664000175000017500000002234513736105314017256 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # File: voaAreaPlotgui.py # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import sys import os import datetime import subprocess try: import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject except: pass try: from gi.repository import Gtk except: sys.exit(1) import gettext, locale, sys GETTEXT_DOMAIN = 'voacapgui' LOCALE_PATH = os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])), 'po') langs = [] lc, enc = locale.getdefaultlocale() if lc: langs = [lc] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(':') gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) lang = gettext.translation(GETTEXT_DOMAIN, LOCALE_PATH, languages=langs, fallback=True) lang.install()#app, local_path) # glade file # see http://bugzilla.gnome.org/show_bug.cgi?id=344926 for why the # next two commands look repeated. # tod0 #Gtk.glade.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) #Gtk.glade.textdomain(GETTEXT_DOMAIN) gettext.bindtextdomain(GETTEXT_DOMAIN, LOCALE_PATH) gettext.textdomain(GETTEXT_DOMAIN) from .voaFile import * from .voaAreaPlot import * class VOAAreaPlotGUI: """Graphical front end to the voaAreaPlot application""" plot_type_d = { 1: _('MUFday'), 2: _('Reliability'), 3: _('SNR'), # 4: _('DBW'), } cmap_d = {'bone': _('bone'), 'cool': _('cool'), 'copper': _('copper'), 'gray': _('gray'), 'hot': _('hot'), 'hsv': _('hsv'), 'jet': _('jet'), 'pink': _('pink'), 'spring': _('spring'), 'summer': _('summer'), 'winter': _('winter'), 'portland': _('portland')} def __init__(self, data_source_filename, parent=None, enable_save = False, datadir=""): self.voa_filename = data_source_filename self.parent = parent self.ui_file = os.path.join(datadir, "ui", "voaAreaPlotBox.ui") self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("main_box", "type_combobox", "group_combobox", "tz_spinbutton", "cmap_combobox", "contour_checkbutton", "greyline_checkbutton", "parallels_checkbutton", "meridians_checkbutton", "save_button") if not self.parent: self.win = Gtk.Window() self.win.set_title(_("Plot Control")) self.win.connect("delete-event", self.quit_application) self.win.add(self.main_box) else: self.win = Gtk.Dialog("Plot Control", self.parent) self.win.get_content_area().add(self.main_box) self.populate_combo(self.type_combobox, self.plot_type_d, 'value') model = self.type_combobox.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == '2': # reliability self.type_combobox.set_active_iter(iter) break iter = model.iter_next(iter) self.populate_combo(self.cmap_combobox, self.cmap_d, 'value') model = self.cmap_combobox.get_model() iter = model.get_iter_first() while iter: if model.get_value(iter, 0) == 'jet': self.cmap_combobox.set_active_iter(iter) break iter = model.iter_next(iter) #todo check the file exists #TODO: this needs to be more robust... # consider capitalisation in_file = VOAFile(self.voa_filename) in_file.parse_file() self.num_plots = in_file.get_num_plots() d = { 0 : _('All Plots'),} l = in_file.get_group_titles() d.update(list(zip(list(range(1, len(l)+1)), l))) self.populate_combo(self.group_combobox, d, 'key') #for i in range(1,self.num_plots+1): d[i] = str(i) #self.populate_combo(self.group_combobox, d, 'key') event_dic = { "on_dialog_destroy" : self.quit_application, "on_cancel_button_clicked" : self.quit_application, "on_ok_button_clicked" : self.run_plot} self.wTree.connect_signals(event_dic) self.save_button.connect("clicked", self.on_save_clicked) if self.parent: if not enable_save: self.save_button.hide() self.win.run() else: self.win.show_all() if not enable_save: self.save_button.hide() Gtk.main() def on_save_clicked(self, widget): dialog = Gtk.FileChooserDialog("Save prediction data", self.win, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, "Select", Gtk.ResponseType.OK)) dialog.set_default_size(800, 400) filter_vgz = Gtk.FileFilter() filter_vgz.set_name("VGZ files") filter_vgz.add_pattern("*.vgz") dialog.add_filter(filter_vgz) response = dialog.run() if response == Gtk.ResponseType.OK: save_fn = dialog.get_filename() dialog.destroy() if response == Gtk.ResponseType.OK: self.save_prediction_files(save_fn) def save_prediction_files(self, vgz_filename): vgz_filename = vgz_filename if vgz_filename.endswith('.vgz') else vgz_filename+'.vgz' print("Voa fn = {:s}".format(self.voa_filename)) base_filename, file_extension = os.path.splitext(self.voa_filename) with zipfile.ZipFile(vgz_filename, 'w') as vgzip: fn = base_filename + '.voa' vgzip.write(fn, os.path.basename(fn), zipfile.ZIP_DEFLATED) for vg_file_num in range(1, self.num_plots+1): fn = "{:s}.vg{:d}".format(base_filename, vg_file_num) vgzip.write(fn, os.path.basename(fn), zipfile.ZIP_DEFLATED) dialog = Gtk.MessageDialog(self.win, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "VGZ File Saved") dialog.format_secondary_text( "Saved as {:s}".format(vgz_filename)) dialog.run() dialog.destroy() def run_plot(self, widget): _color_map = self.cmap_combobox.get_model().get_value(self.cmap_combobox.get_active_iter(), 0) _data_type = self.type_combobox.get_model().get_value(self.type_combobox.get_active_iter(), 0) if self.group_combobox.get_active() == 0: _vg_files = list(range(1,self.num_plots+1)) else: _vg_files = [self.group_combobox.get_active()] plot_parent = self.parent if self.parent else self.win plot = VOAAreaPlot(self.voa_filename, data_type = _data_type, vg_files = _vg_files, color_map = _color_map, filled_contours = self.contour_checkbutton.get_active(), plot_meridians = self.meridians_checkbutton.get_active(), plot_parallels = self.parallels_checkbutton.get_active(), plot_nightshade = self.greyline_checkbutton.get_active(), parent = plot_parent) def populate_combo(self, cb, d, sort_by='value'): _model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING) items = list(d.items()) if sort_by == 'value': items = [(v, k) for (k, v) in items] items.sort() items = [(k, v) for (v, k) in items] if sort_by == 'key': items.sort() for k, v in items: _model.append([str(k), v]) cb.set_model(_model) cell = Gtk.CellRendererText() cb.pack_start(cell, True) cb.add_attribute(cell, 'text', 1) cb.set_active(0) def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) def quit_application(self, *args): self.win.destroy() #only emit main_quit if we're running as a standalone app #todo do we need to do anyother clean-up here if we're _not_ #running as a standalone app if not self.parent: Gtk.main_quit sys.exit(0) if __name__ == "__main__": if (len(sys.argv) != 2): print(_('Usage: voaAreaPlotgui file_to_plot.voa')) sys.exit(2) app = VOAAreaPlotGUI(sys.argv[-1]) Gtk.main() pythonprop-0.30.1/src/pythonprop/voaPlotWindow.py0000664000175000017500000001216313736105314017145 00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # # File: voaPlotWindow.py # # Copyright (c) 2009 J.Watson # # 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # todo consider using a scrolled pane here... # add buttons to move between plots # double clicking an all plot should zoom in to an individual plot """ Some useful printing references; http://askubuntu.com/questions/220350/how-to-add-a-print-dialog-to-an-application https://developer.gnome.org/gtk3/stable/GtkPrintUnixDialog.html http://nullege.com/codes/search/gi.repository.Gtk.PrintOperationAction.PRINT_DIALOG https://github.com/GNOME/pygobject/blob/master/demos/gtk-demo/demos/printing.py printing pngs with python http://stackoverflow.com/questions/10983739/how-to-composite-multiple-png-into-a-single-png-using-gtk-cairo """ import os import sys from gi.repository import GObject from gi.repository import Gtk from .voaPlotFilePrinter import VOAPlotFilePrinter class VOAPlotWindow(): PLOT_RESPONSE_PRINT = 100 PLOT_RESPONSE_SAVE = 101 PLOT_RESPONSE_CLOSE = 102 def __init__(self, title, canvas, parent=None, dpi=150, datadir=None): self.dpi = dpi self.parent = parent self.canvas = canvas if not self.parent: self.win = Gtk.Window() self.ui_file = os.path.join(datadir, "ui", "voaPropWindowBox.ui") self.wTree = Gtk.Builder() self.wTree.add_from_file(self.ui_file) self.get_objects("main_box", "print_button", "save_button", "close_button") self.main_box.pack_end(self.canvas, True, True, 0) self.win.add(self.main_box) self.print_button.connect("clicked", self.print_button_clicked) self.save_button.connect("clicked", self.save_button_clicked) self.close_button.connect("clicked", self.close_button_clicked) self.win.connect("delete-event", Gtk.main_quit) self.win.set_default_size(700, 600) self.win.show_all() Gtk.main() else: self.win = Gtk.Dialog(title, parent=self.parent, flags=Gtk.DialogFlags.DESTROY_WITH_PARENT) self.win.add_buttons( Gtk.STOCK_PRINT, self.PLOT_RESPONSE_PRINT, Gtk.STOCK_SAVE, self.PLOT_RESPONSE_SAVE, Gtk.STOCK_CLOSE, self.PLOT_RESPONSE_CLOSE) self.win.vbox.pack_start(self.canvas, True, True, 0) self.win.set_default_size(700, 600) self.win.show() response = None while response != self.PLOT_RESPONSE_CLOSE and response != Gtk.ResponseType.DELETE_EVENT: response = self.win.run() if response == self.PLOT_RESPONSE_SAVE: self.save_button_clicked(None) elif response == self.PLOT_RESPONSE_PRINT: self.print_button_clicked(None) self.close_button_clicked(None) def print_button_clicked(self, widget): p = VOAPlotFilePrinter(self.canvas) print_parent = self.parent if self.parent else self.win p.run(print_parent) def close_button_clicked(self, widget): self.win.destroy() if not self.parent: Gtk.main_quit sys.exit(0) def save_button_clicked(self, widget): plot_parent = self.parent if self.parent else self.win chooser = Gtk.FileChooserDialog(_("Save Image..."), plot_parent, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) filter = Gtk.FileFilter() filter.set_name("PNG Images") filter.add_mime_type("image/png") filter.add_pattern("*.png") chooser.add_filter(filter) save_response = chooser.run() if save_response == Gtk.ResponseType.OK: save_file = chooser.get_filename() if not save_file.endswith('.png'): save_file = save_file + '.png' self.save_plot(self.canvas, save_file) chooser.destroy() def save_plot(self, canvas, filename=None): canvas.print_figure(filename, dpi=self.dpi, facecolor='white', edgecolor='white') def get_objects(self, *names): for name in names: widget = self.wTree.get_object(name) if widget is None: raise ValueError(_("Widget '%s' not found") % name) setattr(self, name, widget) pythonprop-0.30.1/src/Makefile.in0000664000175000017500000005266113736105751013616 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = pythonprop bin_SCRIPTS = \ voa3DPlot \ voaAreaPlot \ voacapgui \ voaAreaPlotgui \ voaP2PPlot \ voaP2PPlotgui \ voaP2PPlotServer CLEANFILES = $(bin_SCRIPTS) EXTRA_DIST = \ voa3DPlot.in \ voaAreaPlot.in \ voacapgui.in \ voaAreaPlotgui.in \ voaP2PPlot.in \ voaP2PPlotgui.in \ voaP2PPlotServer.in # $(nobase_pkgdata_SCRIPTS) \ # $(nobase_pkgdata_DATA) \ # $(man_MANS) \ # $(bin_SCRIPTS) do_substitution = sed -e 's,[@]pythondir[@],$(pythondir),g' \ -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ -e 's,[@]VERSION[@],$(VERSION),g' all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-binSCRIPTS .PRECIOUS: Makefile voa3DPlot: voa3DPlot.in Makefile $(do_substitution) < $(srcdir)/voa3DPlot.in > voa3DPlot chmod +x voa3DPlot voaAreaPlot: voaAreaPlot.in Makefile $(do_substitution) < $(srcdir)/voaAreaPlot.in > voaAreaPlot chmod +x voaAreaPlot voacapgui: voacapgui.in Makefile $(do_substitution) < $(srcdir)/voacapgui.in > voacapgui chmod +x voacapgui voaAreaPlotgui: voaAreaPlotgui.in Makefile $(do_substitution) < $(srcdir)/voaAreaPlotgui.in > voaAreaPlotgui chmod +x voaAreaPlotgui voaP2PPlot: voaP2PPlot.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlot.in > voaP2PPlot chmod +x voaP2PPlot voaP2PPlotgui: voaP2PPlotgui.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlotgui.in > voaP2PPlotgui chmod +x voaP2PPlotgui voaP2PPlotServer: voaP2PPlotServer.in Makefile $(do_substitution) < $(srcdir)/voaP2PPlotServer.in > voaP2PPlotServer chmod +x voaP2PPlotServer # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/missing0000755000175000017500000001533613250314767012355 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: pythonprop-0.30.1/Makefile.am0000775000175000017500000000043413736105351013004 00000000000000## Process this file with automake to produce Makefile.in ## http://www.micahcarrick.com/tutorials/autotools-tutorial-python-gtk/getting-started.html#section_4 SUBDIRS = data src docs/user/help man_MANS = \ man/voaAreaPlot.1 \ man/voaP2PPlot.1 EXTRA_DIST=\ $(man_MANS) \ m4 pythonprop-0.30.1/data/0000775000175000017500000000000013736105755011745 500000000000000pythonprop-0.30.1/data/pythonprop.png0000664000175000017500000004077013736105351014615 00000000000000PNG  IHDR}H.sRGBbKGD pHYs  tIME  0zrtEXtCommentCreated with GIMPW IDATxwdWur{RH3(gcclm?? ƀeBH#MӹrNǹ=34IZ[9o[V{jo[V{oi{7\H=DŽ~,[Z[jk)-ŸS>gK|,>'ij_)0-Zv,i>Ys~Mίkgw2r?4_G?5{/A+/ \EKHKC ň!!Igjp.vo ];/1/X,#Θ"-G; _*XW,VXbtwK[ToޤF+Jo4}&Z_QVKM:t %S-_iїZg v~QIW.NsW JC]eߖ{jUg)*2՟tNUp)yѥP+Sa:^-!U5X{R?rn ~9fڂ_2nULŮ{tgb. !H VEսe!d '8ݢ-Hՙ2 nt5h[3t!O N$L/K,i,$I'jLgj+308Sc,Z`bxE\u>v!JkJ]FPS],--SDq"})`,$Uf ^_ }1iSi%(T]y^4G+9wgBHg5X@ efYH2 Θ+Zt7ZP8Kg)Η˶_ Xei۝hg E UsE{\Hbl0@qBC4@u <{6:;uDM!/ⲝxgIKVOC_"ɷ1U H+m9cs)dEZ-Y☃]pn}+x9Xh[^0Lї3Tb{3<5Ua8h584#t: ze'hBOP#{ ,\ȋ9AIqy^w%VVwO}&1: @ Xhs '.k3i<2{+Ի/ UXfvl\7?{/oôo%+`X/?m~p`0-B= ,C, }@#ݍm۪sDw.%ژ=n쀿%|c `S#'1x(ܱ"^h -A|aG' r&Rg/=i#g~ OaZ88@Qح˚yu7錱hMɟ6i ~Up5!wV xuXa຺z}e1l&~TdZ"<n\ x{߆߿n$jfca} ^m[ HIa~a3,9›[/"Pe>zDW:N=_7r_R| G^R{QD$$#oqdpׄ߄ 39ِU]+S!z'|=< 3hM!xs;]Z/骭ЎL.+ݏ!A$t*+6n(5Øa Z|vOLʇUcqN•bAl:(:WLdЅj!Oabn.C 7xp7ܾ%Oz}t5H?getr2-T:.ca(5 Α#GWuB3BK@/,ob,MKrH}釻 P> w~ m:?18}~9tt!E]zaxGOXZZ i!\1E2;bx h\U iQFz {mRe%ܓ1ڂۛ!}a0&eۣ/@q.&>y*9[0z_:CҼqRy J9эe /C7ܵ; 8D.LBK&k:(.KP)* > :]!nsIx>1*wY.phG p}/lj7yǧ!Yo>ׂ~|hH9u6x ^t,>/jAZ1ЗȮS5%>br%}ATDϐA=m_G{7lw oipRm) r+ % ]n!9FfȗoK6 m6?=Ի48fa/Ǹ/lq02Q{O CzcxkOH=gVi,TJ&-0 @2kqUS@ lPiogdlPzxbͷb` eEA%Pe}cp7`K#ApNؑ^WC1Qm#8o\fu!р{fG Lc_MlsfpI?Ap}A^ɽ $?@Ы ʣ՝ W#hh#,>8bFM,$  m}8ܵ :Z Yx"R(9-a84K{$3e}oMa^v'm9xsJn":]ׄaI B,fd, ddUnHv0[~)?6Ԩ` 2SфWJAr?xg "-\Y=a';3ٓ[IR N"1/%r)럂&,Mm\]^1U`q#[txmEHbP֭~ʆ fƘM3k`m Z0tTF@C>et!UMSpH%pž_{ C_G(j|)ɡ1[=_N?4b`:S+ BAs=AX"V,*- ZdwFqM#\0yKP3xy-ky bcb :t5'j=@=^@Rbv[MLLU!KLgSGp%-tE$(~ 3}S޼H[ !5D0hDSݧ Su!\)RИijq/FKi#6b"VTZj%pkvf!!9̄ Iݐ40m`2LTK3BWA԰9`ӎ^964I}Rc&Q QUtCa1@RJbcA ꠯ ^~3Ocu" fV޼Ԧ 2N'/\BIe k7!47usx ~~vD4r*F]imb&[aU t:A{$bLь %R%Jg%zg;#_$Thlr04dǟTrjɲ$a1$ +ϑ Tӯ ;2$PbB)ӡ-m$6 q%bZɌX^~Zc0 r"S0j&Oiow^l'od(ksYdCc*H~?U"dZF@*c {1hRm3R* AW5ײ4X4ZڡE Z-dDYj|;3v=vp|0w/sIoN?- -hLejZ੗}wL.Qb^e1 }k`jbج{lnCw\6M4|#EtO|LF\z؄/=P]W嗚AJZwAf}O١E#YYSVu$z7O3 ysfYsP VBCi h DoS ӓ0+58 MB k:k8, EwX3BG%4= {"ĀxZ&d4(h yg NtC, |}V|z*e?AA](Uw“C@"aɶM6;v7_9 <PsgM4b99^`Ƽy?[kG+Vx|?/<6-Cğ`p`E%?kY \25n˻&QW誯P,MK6l)B2NDNdqZɁVduƈLFgMб&`㺓! Qhl2K{06SZ Xqxp g3p)4eav&\_~(7ӛ'4NcEOlcNgZaAxHo9[4 !lޭun谅~Q#QZ5FaAhti_p!+u$-I 3L{My(1j@t#є;K Ӷ$9)fXDu<4͏U4 RYXqj2#Wg͛sߚ7.̘9.ro".i7g ݜC-P^;( TVB `Vv;?y2C?يtw @L_}-[mpldK;%)Yr[>h(SF<87+$m P, ÉI jC$")|>XG$2y@ىwo?4QamU";_= |P{ױmM+ci@y$\|H<%+!g$~Gd aG7k/@Ȥތng"o_;64x+-5ڼ#LÌ[J I*3] AkwCJ|ĕ"XTASTk T<.d7|>ptf7y9?D?Cs?CT_i 3Y> Otq9bL4n9Q.)Ȇ!q|M1E?AGOݕf!51v;T)/5͂ R|1\'&ö$Mvؘדf>-jCqH&A!`x$$)@%xCopS*LOæMuP*J| CŒ'*Py/6eᅟOYcv@Av pu.ݨRCbsV' cn .V|[2A<ػO$9ZוG=6:VRU0R~J)z8qf[ B%TN_ϦJ`­s&~K/ФbSlvwX 9k]q$\.߀rQ oJ;$A:v\jlt^!!$l8 Z]]!"Zt΀ 3mK>QW?EGWJqƏ3XG϶py6wXBPOu:Ey!Ʒ/ݫ.;jv{>V8Ͻdnfh+6J2Bcpt'K nXUdvLGۀ\~>'/q,'Ď(;Q,^Zjenǣw[:wtl P2Y7v*0:--S8Y(۶ghkLH,ӌŚ8Gt;Pe\gHą=<34Y% 8rF?3N )n"KXbWK2s&vlQ2ktCe+P.[j~fc)-tCUkHWQT|i%d:)r7lj*0E8fTnBv2/fO3\ bMM`M](.QphAd6=Esn6l('u`W+ykmE Ȯ=Q íhonMp_PMOeyC(/s^O  5C`xLGab̎P-Q-Ȳ$T~F)Z.3@J*Cih0jI$DRE e FZ_Z05-švFmn8l8^;A,%UfO*{H!YCflv,\\ (|J%b ɔ;Tx2@`Ёm?[ctv_ʻE2%+Uc.3pqR775鴅Dчjg5ՔQ%X4@\ߐ% XDf(>܋^TREâϥG IDATN@"\k!S=i2,peK2#%kۡ`Pu clv'<\qڷwĆ gUxX/*?͟|B!,_u6oٺ%NOqB:Zv! uk+esn/+ם.KmN4.*;kVkmu $3>%/  103 /"i2 Db8=5beEʕ.v58:l^ap'xm:j@MaDhj(I0T; / Ds3]3>޼1o }jG2;Bg)~غ*yCaO7c鼆V%3fj6(Aa$qa{nq)P9f8T TlcPH2%eCNBȲLO=sriHpo_}Dxݛ\ٞd8:h ׾C{Ҍp @w d4jn\}u^TyuAQP,{}c9dr}NX4X5yZ)f u B!+xO6`4MPp fk"J؋P;,*ѲNW±N5qB]WSrSf:+ӵ 3+Tp-Ͻ 09.fo?l6N19 hnu!IV6m#!m]ç> ҩo*W9šХ Y_fCxd 6i|Nɯ/mTF@cvO.A0 $L{VЕ>}v}9a~p3g PZs<4@{|?#zJ3[;eZB[0 [6z840~ z 7wtXx*/أiV\`sacm_P6sfR rq4-J PV^4 n7h%72DQU sTd+I^hVҘDsM2/ {ȯVE '\d 0,B~)!a\.aJD#*_'R6o}T3ϊw=U'Y;+QgAx 9i鎸,9عab3pu:,14)8QN3tx/an!4@<.Q\pFCJ_Gmma5q^l.p` i1|ubEU!ץW_l@1D5@ *7\[ LMԔ-JbCk찠9~S=G#~7 iTm%b,:=8:سP==n{E#ɜw.PP-Ӊ >{m[D4O'{Ћ3wCs~]N`slVYA Be) \\ω~iLАEvɏga"  p:$:l"fuEՔ=/Jt586f0Ep+2Ir9m \R}݃ֆQ~:<*FU# x00nz<ҁ^TvN27L`B jI BzxM$SӇhp QAuǦT''*`[ ˂[/[OC)k2eJ\w9l y).13:ݐ́ߩ/X2w Ԫ߫Rs@H\~m)lmM.2*AGR"t0= P\?Q3a/`]$`Ċ!"(X$*8}w\a]a ]0RWL[SN1ҁrUs`̉ ƷA ဉBĻwA:I;>_,̴:g$Ҙ>D_ft$n2V\;!&+k>3iFqE2L 7>NW(M\9BW(٬B!juz=6ن*Uq,EXm(\5Eo_;\k6Cc=\Xtw fx̀rE'MAp# &Gap$C,:#+Ԧpl>'JE!1ihL]~,x%nRΊZs3 ; A"nPpE~6U :LO(\x\E|$٬]dC!T u0#!&Ǚ%U%ɦ02ݷ_w̌C͜pdUmԜܱͩSM>He`A~U~8iBMQ+,\ 2}:4m-G\o ka⠩@^QS3݌Mv1p|0B߆uM MqNectUy~mpl?쟄zp4FGptA24QLu}]Wwmo/Rq5|NBqdGCD*54 *5+E%4?)qp^/Db3$ad "'o$w=7EC͗){tBu>}p0DY󽔵. E!Rdؐz@]D%]Qέ"<^Dvxvg,w g!>)&) jU-S4fk8DЗ@JU(MHw. {º^ O43&E+={Vy= eU$V5Ip? O 4Ѭ&fB54D'44O%yY˳׆U_5*^p}b0;=`ۉU_vsm_3E}1 .8&ޭBvVp h26fJ.Fؑ/z-V&f<4 ;.EIxu+v$H@At3pzιx84tdL,X_u+*d,?륋8ϵaOIXꐆJ\.;,B*Xؒf |@-y.hnd|;Q3Ce. t: j֕̕RyU;wBC3 EsS Y30u{2(pcXw00:{dKa4 6GGcPפ I%2QgQZ(rj sK8hy#fz&³[4AM:9RX~_Xaj,Oe~2Vr 6ȫپ>OH</s݅9^eam2%8l*inGM%'Ic8KDipK!E'V4/Av&9>Q$6l#ʠIXetK>E4yzP UqKn59 džK &BsNl:[++V9~j,S: UirH>m+TbrqJ*4Q{{G4. M lՇ!P9Pf|~! '-p٬!sAE*<:*" *NAsE{a|@r^8l>!oyeYLy KdsqmvY$= m KYZp(!F:[4!R`OCWBLCsFC:{,(< ';h .$/=gas\=\*J`fJЇd\o8* a ^; 9{o--.%ޥ%Ҥ } bƵ|āE7 ,&P61"uarAV{(@jE/xh{ H(a38:E\#G2 7]8Ӫ7$$!:`xVѦH=r/BA~1ޏ-b,+o!Rћfhw[ x 74v+kgో xrACVҠkX ႎ(׮M03 G}u `D:Tz/krepA w*pV\/<\]2+Ya&[-daw\2E j<G!7:tS~Dw[0g8D_p ߞ$b9y`f`8r|m} I4R&Qu iLLG+-R백>EFEqr x'`  Sk:{Z'5cᙔo86ˁͪըpr1Чxua?Y쵕elXa1,wBFFĭ n'H.:,Q;^: /pt,:$Qiz;Q̜ I1í*}aH)5I?Tjy*,uzܙty9w`N|ΗuT}ofG/8k$p*`Mx. 8iEXe$8S0U0$6gՋ^-n2sz5ퟅp?D:E>@~(A H׎TrDj.\KXWl+Ud$фƏҿn֙{,uP\ xXh\-^ba1: 4\8=Piu( 섑P[ס1-Nx,hu]/]WLhmWzsc@0!`HtcQ0ZLsPJ,/ɤ*f*hu#fYȕGl.WS猹ػKDeM$W %H rw{0D_N ~ ps5yWUf)y3{9#Xۂ|^,E 8=,jcrC΍W8'[I(OpP-pՀxGU4F 8FHA&ֹmT&H@^ZY9,$?  l4< _OX2!f,~9M3wj99L?}M\u .Ddcb^1%#tRY+ղĮ$}*"=Ss oz%I@e-'.8PШjೊXkEjQh J:h|J8_kJ̛wzii }azIsQ,I9!?ͰBeD |_W_۪2]"PU!2g"|Hyh ˻d Sbcn;J?>qhw.1reug=vDcǎ`KK,Dp8rY$rI(HE22~cow3켻8Tn=]]=;cZg?_Q rD~u)˵^L^bÏQ؍M@C7ޙJwd=&#UyOrbAnyZu8`v^*ċw3[J^=YW.nG*qٝՀfSNmPTU| k`; dݨ73Cd3qФAIJ1#ӱشXV[x3 ֗ZmW4/ޔ1wdv좬lrxXe/ߓTIOʒW!nUԠ4'K tε,eOٮ1iٕcp@j~o<:'Pg9X a2Lta^ pqFN.!~CVkPBI: ;NF<;6AA2b8 qែossdWE-O EyhRNLx)H Ae0WP e_ N8u>;5Y6X~g#ß4i=.SC) ow9p]C&t_ufXbV̖ynݮ ^Oj;TBܲ:+5XYJs<l?W"e[ypyҌˮ¶GW9k Sxbmf]QXP]iaynMf gw,@NY$ =E `̻żZ24ͳOeQsv*w !yP4y>ԣҞ<>޽ndžKe-iq[ZIξɀ^Pn…DWG=杂}ݫWXҡ^7[kPvڝ 2٢O,(,Vp|*,7XZtXZج8B&<m-x](tB#Ȯz-MFCKlC>FhH:>~QbAO{ouXaN+Ӓ[UmgiF >65 (Fjv;sEk\M0yRͷ}.wn}A*܎J)x !vc&5, BȇkM1|"u-&Mwg2Weև?^:Ù(F[=Z6Wnq*1: 509Xr߹)PB-^pI\J;[obc I 5rxnhlW(\؊5^#)9x8~N)N{d ؾkn}x8G& > >HvvSܯILr'Y쵻i6:mx6c}BrE]f7c_xH6AбdmnMk1߸|Flj6,OA_r?F=ܤ谄,>C\xοώkp"H6HXD:M:Ul5GA˗8/*nt3vBȟ ~#GY,ْ1 ~"ʖ)~DVA79M)Agq@Qd 0SIĎ c e#i.阎0XLf- IENDB`pythonprop-0.30.1/data/Makefile.am0000664000175000017500000000042713736105624013717 00000000000000 desktopdir = $(datadir)/applications icondir = $(datadir)/icons desktop_DATA = voacapgui.desktop dist_icon_DATA = pythonprop.png UPDATE_DESKTOP = update-desktop-database $(datadir)/applications || : install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) pythonprop-0.30.1/data/voacapgui.desktop.in0000664000175000017500000000015213662771311015634 00000000000000[Desktop Entry] Type=Application Exec=voacapgui Name=voacapgui Categories=Science;HamRadio Icon=@PACKAGE@ pythonprop-0.30.1/data/Makefile.in0000664000175000017500000003524413736105751013736 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_icon_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = voacapgui.desktop CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(icondir)" DATA = $(desktop_DATA) $(dist_icon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/voacapgui.desktop.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ desktopdir = $(datadir)/applications icondir = $(datadir)/icons desktop_DATA = voacapgui.desktop dist_icon_DATA = pythonprop.png UPDATE_DESKTOP = update-desktop-database $(datadir)/applications || : all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): voacapgui.desktop: $(top_builddir)/config.status $(srcdir)/voacapgui.desktop.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) install-dist_iconDATA: $(dist_icon_DATA) @$(NORMAL_INSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-dist_iconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-desktopDATA install-dist_iconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-desktopDATA uninstall-dist_iconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-hook install-desktopDATA \ install-dist_iconDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-desktopDATA uninstall-dist_iconDATA uninstall-hook .PRECIOUS: Makefile install-data-hook: $(UPDATE_DESKTOP) uninstall-hook: $(UPDATE_DESKTOP) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pythonprop-0.30.1/INSTALL0000664000175000017500000003661013662771311012006 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. pythonprop-0.30.1/install-sh0000755000175000017500000003601013251316473012747 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: pythonprop-0.30.1/aclocal.m40000664000175000017500000013136413736105751012620 00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) AC_DEFUN([YELP_HELP_INIT], [ AC_REQUIRE([AC_PROG_LN_S]) m4_pattern_allow([AM_V_at]) m4_pattern_allow([AM_V_GEN]) m4_pattern_allow([AM_DEFAULT_VERBOSITY]) YELP_LC_MEDIA_LINKS=true YELP_LC_DIST=true for yelpopt in [$1]; do case $yelpopt in lc-media-links) YELP_LC_MEDIA_LINKS=true ;; no-lc-media-links) YELP_LC_MEDIA_LINKS= ;; lc-dist) YELP_LC_DIST=true ;; no-lc-dist) YELP_LC_DIST= ;; *) AC_MSG_ERROR([Unrecognized [YELP_HELP_INIT] option $yelpopt"]) ;; esac done; AC_SUBST([YELP_LC_MEDIA_LINKS]) AC_SUBST([YELP_LC_DIST]) AC_ARG_WITH([help-dir], AS_HELP_STRING([--with-help-dir=DIR], [path where help files are installed]),, [with_help_dir='${datadir}/help']) HELP_DIR="$with_help_dir" AC_SUBST(HELP_DIR) AC_ARG_VAR([ITSTOOL], [Path to the `itstool` command]) AC_CHECK_PROG([ITSTOOL], [itstool], [itstool]) if test x"$ITSTOOL" = x; then AC_MSG_ERROR([itstool not found]) fi AC_ARG_VAR([XMLLINT], [Path to the `xmllint` command]) AC_CHECK_PROG([XMLLINT], [xmllint], [xmllint]) if test x"$XMLLINT" = x; then AC_MSG_ERROR([xmllint not found]) fi YELP_HELP_RULES=' HELP_ID ?= HELP_POT ?= HELP_FILES ?= HELP_EXTRA ?= HELP_MEDIA ?= HELP_LINGUAS ?= _HELP_LINGUAS = $(if $(filter environment,$(origin LINGUAS)),$(filter $(LINGUAS),$(HELP_LINGUAS)),$(HELP_LINGUAS)) _HELP_POTFILE = $(if $(HELP_POT),$(HELP_POT),$(if $(HELP_ID),$(HELP_ID).pot)) _HELP_POFILES = $(if $(HELP_ID),$(foreach lc,$(_HELP_LINGUAS),$(lc)/$(lc).po)) _HELP_MOFILES = $(patsubst %.po,%.mo,$(_HELP_POFILES)) _HELP_C_FILES = $(foreach f,$(HELP_FILES),C/$(f)) _HELP_C_EXTRA = $(foreach f,$(HELP_EXTRA),C/$(f)) _HELP_C_MEDIA = $(foreach f,$(HELP_MEDIA),C/$(f)) _HELP_LC_FILES = $(foreach lc,$(_HELP_LINGUAS),$(foreach f,$(HELP_FILES),$(lc)/$(f))) _HELP_LC_STAMPS = $(foreach lc,$(_HELP_LINGUAS),$(lc)/$(lc).stamp) _HELP_DEFAULT_V = $(if $(AM_DEFAULT_VERBOSITY),$(AM_DEFAULT_VERBOSITY),1) _HELP_V = $(if $(V),$(V),$(_HELP_DEFAULT_V)) _HELP_LC_VERBOSE = $(_HELP_LC_VERBOSE_$(_HELP_V)) _HELP_LC_VERBOSE_ = $(_HELP_LC_VERBOSE_$(_HELP_DEFAULT_V)) _HELP_LC_VERBOSE_0 = @echo " GEN "$(dir [$]@); all: $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) $(_HELP_LC_FILES) $(_HELP_POFILES) .PHONY: pot pot: $(_HELP_POTFILE) $(_HELP_POTFILE): $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) $(AM_V_GEN)if test -d "C"; then d=; else d="$(srcdir)/"; fi; \ $(ITSTOOL) -o "[$]@" $(foreach f,$(_HELP_C_FILES),"$${d}$(f)") .PHONY: repo repo: $(_HELP_POTFILE) $(AM_V_at)for po in $(_HELP_POFILES); do \ if test "x[$](_HELP_V)" = "x0"; then echo " GEN $${po}"; fi; \ msgmerge -q -o "$${po}" "$${po}" "$(_HELP_POTFILE)"; \ done $(_HELP_POFILES): $(AM_V_at)if ! test -d "$(dir [$]@)"; then mkdir "$(dir [$]@)"; fi $(AM_V_at)if test ! -f "[$]@" -a -f "$(srcdir)/[$]@"; then cp "$(srcdir)/[$]@" "[$]@"; fi $(AM_V_GEN)if ! test -f "[$]@"; then \ (cd "$(dir [$]@)" && \ $(ITSTOOL) -o "$(notdir [$]@).tmp" $(_HELP_C_FILES) && \ mv "$(notdir [$]@).tmp" "$(notdir [$]@)"); \ else \ (cd "$(dir [$]@)" && \ $(ITSTOOL) -o "$(notdir [$]@).tmp" $(_HELP_C_FILES) && \ msgmerge -o "$(notdir [$]@)" "$(notdir [$]@)" "$(notdir [$]@).tmp" && \ rm "$(notdir [$]@).tmp"); \ fi $(_HELP_MOFILES): %.mo: %.po $(AM_V_at)if ! test -d "$(dir [$]@)"; then mkdir "$(dir [$]@)"; fi $(AM_V_GEN)msgfmt -o "[$]@" "$<" $(_HELP_LC_FILES): $(_HELP_LINGUAS) $(_HELP_LINGUAS): $(_HELP_LC_STAMPS) $(_HELP_LC_STAMPS): %.stamp: %.mo $(_HELP_LC_STAMPS): $(_HELP_C_FILES) $(_HELP_C_EXTRA) $(AM_V_at)if ! test -d "$(dir [$]@)"; then mkdir "$(dir [$]@)"; fi $(_HELP_LC_VERBOSE)if test -d "C"; then d="../"; else d="$(abs_srcdir)/"; fi; \ mo="$(dir [$]@)$(patsubst %/$(notdir [$]@),%,[$]@).mo"; \ if test -f "$${mo}"; then mo="../$${mo}"; else mo="$(abs_srcdir)/$${mo}"; fi; \ (cd "$(dir [$]@)" && $(ITSTOOL) -m "$${mo}" $(foreach f,$(_HELP_C_FILES),$${d}/$(f))) && \ touch "[$]@" .PHONY: clean-help mostlyclean-am: $(if $(HELP_ID),clean-help) clean-help: rm -f $(_HELP_LC_FILES) $(_HELP_LC_STAMPS) $(_HELP_MOFILES) EXTRA_DIST ?= EXTRA_DIST += $(_HELP_C_EXTRA) $(_HELP_C_MEDIA) EXTRA_DIST += $(if $(YELP_LC_DIST),$(foreach lc,$(HELP_LINGUAS),$(lc)/$(lc).stamp)) EXTRA_DIST += $(foreach lc,$(HELP_LINGUAS),$(lc)/$(lc).po) EXTRA_DIST += $(foreach f,$(HELP_MEDIA),$(foreach lc,$(HELP_LINGUAS),$(wildcard $(lc)/$(f)))) distdir: distdir-help-files distdir-help-files: $(_HELP_LC_FILES) @for lc in C $(if $(YELP_LC_DIST),$(HELP_LINGUAS)) ; do \ $(MKDIR_P) "$(distdir)/$$lc"; \ for file in $(HELP_FILES); do \ if test -f "$$lc/$$file"; then d=./; else d=$(srcdir)/; fi; \ cp -p "$$d$$lc/$$file" "$(distdir)/$$lc/" || exit 1; \ done; \ done; \ .PHONY: check-help check: check-help check-help: for lc in C $(_HELP_LINGUAS); do \ if test -d "$$lc"; \ then d=; \ xmlpath="$$lc"; \ else \ d="$(srcdir)/"; \ xmlpath="$$lc:$(srcdir)/$$lc"; \ fi; \ for page in $(HELP_FILES); do \ echo "$(XMLLINT) --nonet --noout --noent --path $$xmlpath --xinclude $$d$$lc/$$page"; \ $(XMLLINT) --nonet --noout --noent --path "$$xmlpath" --xinclude "$$d$$lc/$$page"; \ done; \ done .PHONY: install-help install-data-am: $(if $(HELP_ID),install-help) install-help: $(_HELP_LC_FILES) @for lc in C $(_HELP_LINGUAS); do \ $(mkinstalldirs) "$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)" || exit 1; \ done @for lc in C $(_HELP_LINGUAS); do for f in $(HELP_FILES); do \ if test -f "$$lc/$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ if ! test -d "$$helpdir"; then $(mkinstalldirs) "$$helpdir"; fi; \ echo "$(INSTALL_DATA) $$d$$lc/$$f $$helpdir`basename $$f`"; \ $(INSTALL_DATA) "$$d$$lc/$$f" "$$helpdir`basename $$f`" || exit 1; \ done; done @for f in $(_HELP_C_EXTRA); do \ lc=`dirname "$$f"`; lc=`basename "$$lc"`; \ if test -f "$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ if ! test -d "$$helpdir"; then $(mkinstalldirs) "$$helpdir"; fi; \ echo "$(INSTALL_DATA) $$d$$f $$helpdir`basename $$f`"; \ $(INSTALL_DATA) "$$d$$f" "$$helpdir`basename $$f`" || exit 1; \ done @for f in $(HELP_MEDIA); do \ for lc in C $(_HELP_LINGUAS); do \ if test -f "$$lc$$f"; then d=; else d="$(srcdir)/"; fi; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ mdir=`dirname "$$f"`; \ if test "x$mdir" = "x."; then mdir=""; fi; \ if ! test -d "$$helpdir$$mdir"; then $(mkinstalldirs) "$$helpdir$$mdir"; fi; \ if test -f "$$d$$lc/$$f"; then \ echo "$(INSTALL_DATA) $$d$$lc/$$f $$helpdir$$f"; \ $(INSTALL_DATA) "$$d$$lc/$$f" "$$helpdir$$f" || exit 1; \ elif test "x$$lc" != "xC"; then \ if test "x$(YELP_LC_MEDIA_LINKS)" != "x"; then \ echo "$(LN_S) -f $(HELP_DIR)/C/$(HELP_ID)/$$f $$helpdir$$f"; \ $(LN_S) -f "$(HELP_DIR)/C/$(HELP_ID)/$$f" "$$helpdir$$f" || exit 1; \ fi; \ fi; \ done; \ done .PHONY: uninstall-help uninstall-am: $(if $(HELP_ID),uninstall-help) uninstall-help: for lc in C $(_HELP_LINGUAS); do for f in $(HELP_FILES); do \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir`basename $$f`"; \ rm -f "$$helpdir`basename $$f`"; \ done; done @for f in $(_HELP_C_EXTRA); do \ lc=`dirname "$$f"`; lc=`basename "$$lc"`; \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir`basename $$f`"; \ rm -f "$$helpdir`basename $$f`"; \ done @for f in $(HELP_MEDIA); do \ for lc in C $(_HELP_LINGUAS); do \ helpdir="$(DESTDIR)$(HELP_DIR)/$$lc/$(HELP_ID)/"; \ echo "rm -f $$helpdir$$f"; \ rm -f "$$helpdir$$f"; \ done; \ done; ' AC_SUBST([YELP_HELP_RULES]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([YELP_HELP_RULES])]) ]) # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 dnl python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl python3.2 python3.1 python3.0 dnl python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) # Just factor out some code duplication. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR pythonprop-0.30.1/m4/0000775000175000017500000000000013662771626011360 500000000000000pythonprop-0.30.1/Makefile.in0000664000175000017500000006506713736105751013033 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ INSTALL NEWS README install-sh missing py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DBLATEX = @DBLATEX@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ HELP_DIR = @HELP_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ITSTOOL = @ITSTOOL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMLLINT = @XMLLINT@ YELP_LC_DIST = @YELP_LC_DIST@ YELP_LC_MEDIA_LINKS = @YELP_LC_MEDIA_LINKS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = data src docs/user/help man_MANS = \ man/voaAreaPlot.1 \ man/voaP2PPlot.1 EXTRA_DIST = \ $(man_MANS) \ m4 all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: